我在 udev 中设置了一条规则,在后台运行一个脚本来自动挂载 USB 驱动器。它成功地运行了脚本,但由于某种原因挂载失败了。
规则:
ACTION=="add", KERNEL=="sd[a-z]*", RUN+="/etc/mntUsbChk.sh &"
在此脚本中:
#!/bin/sh
sleep 2
mkdir /mnt/usb
foundUsb=false
if [ -e /dev/sda1 ]; then
mount /dev/sda1 /mnt/usb
$foundUsb=true
fi
if [ -e /dev/sdb1 ]; then
mount /dev/sdb1 /mnt/usb
$foundUsb=true
fi
if [ -e /dev/sdc1 ]; then
mount /dev/sdc1 /mnt/usb
$foundUsb=true
fi
if [ $foundUsb -eq false ]; then
exit
fi
echo "USB MOUNTED"
[1610.868626]FAT-fs(sdb1):卷未正确卸载。某些数据可能已损坏。请运行 fsck。
编辑:更多详细信息:该脚本肯定正在执行,因为该/mnt/usb
文件夹是在我插入 USB 后创建的。
而且,如果我 mount /dev/sda1 /mnt/usb
在插入 USB 后在启用规则之前手动输入,它就能很好地安装它。我只是不明白为什么它不能安装在规则 udev 中。
答案1
如果该脚本/mnt/usb
已存在,则会失败。不确定这是否是问题的根源,但可以肯定是脚本错误。
mount /mnt/usb
改用:
mount -p /mnt/usb
-p,--父母
如果存在则没有错误,根据需要创建父目录
答案2
您无法保证添加时 USB 驱动器将是 sda1、sdb1、sdc1。我认为那里可能需要一些更好的逻辑,但与问题完全无关。
对于该问题,请参阅下面的现有链接: 为什么Linux仅仅因为安装FAT而将其标记为“脏”?
我的理解是,只是从 Windows 机器上拔出 USB,不弹出并不会清除驱动器上的脏位。当脏位被设置时,Linux 会采取最坏的情况。我假设您可以自动运行 fsck 来清除此错误消息上的脏位(如果存在),然后再次进行安装。尽管我不确定调用 umount 或 fsck 是否会清除脏位。
我希望这朝着正确的方向发展。
答案3
尽管没有很好的文档记录,但您不应该mount
从 Udev 规则运行。
请参见我对类似问题的回答的替代方案。