首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态驱动HotSwapping

动态驱动HotSwapping
EN

Unix & Linux用户
提问于 2018-08-05 21:27:45
回答 1查看 152关注 0票数 1

设置很简单。我有一个安装在机架上的服务器,前面有24 5英寸的驱动器。服务器运行PLEX。每个HDD是分区的,根中包含可选文件夹。服务器正在运行Debian8 (3.16.51-3)。

要求:我需要能够即插即用的HDD,自动挂载NTFS分区,扫描是否存在预定义的文件夹,和符号链接到面向PLEX的目录。挂载和符号链接应该默认为使用UUID

可选文件夹/ Plex目录:

代码语言:javascript
复制
/plex
    /movies
    /tvseries
    /music
    /audiobooks

UDEV Hook: /etc/udev/udev.d/sata-rackmount.Regulations

代码语言:javascript
复制
ACTION=="add", KERNEL=="sd?", RUN+="/plex/new_drive.sh"

*注:udevadm control --reload-rules在更改后重新加载*注意:udevadm monitor --udev可用于查看安装的更改

BASH: /plex/new_drive.sh

代码语言:javascript
复制
#!/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.shCHMOD +x new_drive.sh才能访问UDEV

当前log.txt:

代码语言:javascript
复制
New Drive Detected
    LABEL: WD-WCANKC405910
    NAME: /dev/sdf
    MOUNT required

blkid输出(外汇)

代码语言:javascript
复制
/dev/sdf1: UUID="A2F66547F6651CB3" TYPE="ntfs" PARTUUID="1549f232-01"

sed的输出(基于上述输出)

代码语言:javascript
复制
\1 = /dev/sdf1
\2 = A2F66547F6651CB3

current问题似乎与我的for-in循环有关,代码跳过了这个循环。我所有的研究表明,这应该是可行的,但不知道为什么不行。

为了测试目的,UDEV钩子必须针对您自己的系统进行修改,以防您决定使用其他媒体源,如“sd?”将只匹配基于SATA的驱动器,只匹配根驱动器(IE not /dev/sdf1 1),并且假设在脚本运行之前不知道其他任何关于驱动器的信息。

EN

回答 1

Unix & Linux用户

发布于 2018-08-06 04:46:49

有几个问题我必须解决。首先,for block in $(...)产生了4行数据,而不是单个数据。对于我是如何添加变量的,这一行也非常吝啬,如果它不是完美的,它会跳过。在获得BLK和UUID时,重要的是要注意撇号的'不读取变量。

代码语言:javascript
复制
#!/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.规则

代码语言:javascript
复制
ACTION=="add", KERNEL=="sd?", RUN+="/plex/new_drive.sh"
ACTION=="remove", KERNEL=="sd??", RUN+="/plex/rem_drive.sh"

/plex/rem_drive.sh

代码语言:javascript
复制
#!/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.txt
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/460709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档