设置很简单。我有一个安装在机架上的服务器,前面有24 5英寸的驱动器。服务器运行PLEX。每个HDD是分区的,根中包含可选文件夹。服务器正在运行Debian8 (3.16.51-3)。
要求:我需要能够即插即用的HDD,自动挂载NTFS分区,扫描是否存在预定义的文件夹,和符号链接到面向PLEX的目录。挂载和符号链接应该默认为使用UUID
可选文件夹/ Plex目录:
/plex
/movies
/tvseries
/music
/audiobooksUDEV Hook: /etc/udev/udev.d/sata-rackmount.Regulations
ACTION=="add", KERNEL=="sd?", RUN+="/plex/new_drive.sh"*注:udevadm control --reload-rules在更改后重新加载*注意:udevadm monitor --udev可用于查看安装的更改
BASH: /plex/new_drive.sh
#!/bin/sh
echo "New Drive Detected" >> /plex/log.txt
echo "\tLABEL: ${ID_SERIAL_SHORT}" >> /plex/log.txt
echo "\tNAME: ${DEVNAME}" >> /plex/log.txt
echo "\tMOUNT required" >> /plex/log.txt
for block in $( blkid -t TYPE=ntfs | grep "${DEVNAME}" )
do
echo "\t > Block Found"
BLK=$(echo '$block' | sed -rn 's/^(\/dev\/sd[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\1/p')
UUID=$(echo '$block' | sed -rn 's/^(\/dev\/sd[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\2/p')
echo "\tMounting Point: $BLK > $UUID" >> /plex/log.txt
done*注意:这个脚本需要是CHOWN root:root new_drive.sh和CHMOD +x new_drive.sh才能访问UDEV
当前log.txt:
New Drive Detected
LABEL: WD-WCANKC405910
NAME: /dev/sdf
MOUNT requiredblkid输出(外汇)
/dev/sdf1: UUID="A2F66547F6651CB3" TYPE="ntfs" PARTUUID="1549f232-01"sed的输出(基于上述输出)
\1 = /dev/sdf1
\2 = A2F66547F6651CB3current问题似乎与我的for-in循环有关,代码跳过了这个循环。我所有的研究表明,这应该是可行的,但不知道为什么不行。
为了测试目的,UDEV钩子必须针对您自己的系统进行修改,以防您决定使用其他媒体源,如“sd?”将只匹配基于SATA的驱动器,只匹配根驱动器(IE not /dev/sdf1 1),并且假设在脚本运行之前不知道其他任何关于驱动器的信息。
发布于 2018-08-06 04:46:49
有几个问题我必须解决。首先,for block in $(...)产生了4行数据,而不是单个数据。对于我是如何添加变量的,这一行也非常吝啬,如果它不是完美的,它会跳过。在获得BLK和UUID时,重要的是要注意撇号的'不读取变量。
#!/bin/sh
echo "New Drive Detected" >> /plex/log.txt
echo "\tLABEL: ${ID_SERIAL_SHORT}" >> /plex/log.txt
echo "\tNAME: ${DEVNAME}" >> /plex/log.txt
#fixed to collect output line, instead of arguments
for block in "$( blkid -t TYPE=ntfs | grep ${DEVNAME} )";
do
echo "\tPartition Found: $block" >> /plex/log.txt
BLK=$(echo "$block" | sed -rn 's/^(\/dev\/sd[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\1/p')
UUID=$(echo "$block" | sed -rn 's/^(\/dev\/sd[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\2/p')
echo "\tMounting Point: $BLK > /media/$UUID" >> /plex/log.txt
mkdir -p "/media/$UUID"
#repair in case of exclusivity
#ntfsfix "$BLK"
mount -t ntfs-3g -U "$UUID" "/media/$UUID"
if [ -d "/media/$UUID/movies" ]; then
echo "\tMovie Directory Found" >> /plex/log.txt
mkdir -p "/plex/movies"
ln -s "/media/$UUID/movies" "/plex/movies/$UUID"
fi
if [ -d "/media/$UUID/tvseries" ]; then
echo "\tTV Directory Found" >> /plex/log.txt
mkdir -p "/plex/tvseries"
ln -s "/media/$UUID/tvseries" "/plex/tvseries/$UUID"
fi
if [ -d "/media/$UUID/anime" ]; then
echo "\tAnime Directory Found" >> /plex/log.txt
mkdir -p "/plex/anime"
ln -s "/media/$UUID/anime" "/plex/anime/$UUID"
fi
if [ -d "/media/$UUID/music" ]; then
echo "\tMusic Directory Found" >> /plex/log.txt
mkdir -p "/plex/music"
ln -s "/media/$UUID/music" "/plex/music/$UUID"
fi
if [ -d "/media/$UUID/audiobooks" ]; then
echo "\tAudio Book Directory Found" >> /plex/log.txt
mkdir -p "/plex/audiobooks"
ln -s "/media/$UUID/audiobooks" "/plex/audiobooks/$UUID"
fi
done只要驱动器没有NTFSFIX "$BLK"修复的"windows受保护“标志,这个脚本就能工作,但是无论我多么努力,我都无法让它与脚本活动同步修复(我将不得不研究新的问题)。我已经确认它确实执行了,但是后续的挂载似乎是在它完成之前执行的。我假设这是因为我必须先卸载驱动器,然后运行NTFSFIX,然后再挂载驱动器。我还发现了一个小的问题,驱动器不自动卸载,并将重新安装一个新的驱动器字母,每次。另一个带有UDEV参数的脚本解决了这个问题:
UDEV: /etc/udev/rules.d.d/sata-rackmount.rules.规则
ACTION=="add", KERNEL=="sd?", RUN+="/plex/new_drive.sh"
ACTION=="remove", KERNEL=="sd??", RUN+="/plex/rem_drive.sh"/plex/rem_drive.sh
#!/bin/sh
echo "Drive Lost" >> /plex/log.txt
echo "\tLABEL: ${ID_SERIAL_SHORT}" >> /plex/log.txt
echo "\tNAME: ${DEVNAME}" >> /plex/log.txt
echo "\tDismounting..." >> /plex/log.txt
umount "${DEVNAME}"
echo "\tDone!" >> /plex/log.txthttps://unix.stackexchange.com/questions/460709
复制相似问题