不久前,当 USB 棒插入时,我得到了一个要运行的 udev 脚本乌班图16.04(服务器)机器。 (我一直在使用它来安装到 virtualbox guest 上。)
现在我想在该脚本中做一些不同的事情(将其安装在主机中)。我有一个 udev 规则:
#/etc/udev/rules.d/10-usbmount.rules
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", RUN+="/bin/su <username> -c /home/<username>/automount"
它调用automount
当前的脚本:
LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
mount $DEVNAME /home/<username>/flashes_folder &>> $LOG_FILE
#mount /dev/sdb1 /home/<username>/flashes_folder &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE
(取自这里) 日志文件包含以下输出:
New usb device detected at /dev/sdb doing stuff
mount: only root can do that
1
显式输入磁盘路径/dev/sdb1
(注释行)确实会导致相同的错误(磁盘确实是/dev/sdb1)。显然,/bin/su <admin_username>
没有足够的特权。我该如何解决这个问题?
答案1
对于普通用户来说,要安装卷(即使他具有对设备文件的完全访问权限),/etc/fstab
必须有一个条目。这显然不适用于动态设备名称。
udev 只能添加符号链接,但不能更改块设备的名称。但fstab条目需要真实姓名。
但您可以使用文件系统 UUID,而不是使用设备名称。 udev 可以使设备对您的用户可读并设置符号链接,以便您的用户脚本可以确定 UUID。
fstab 条目
UUID=8186709a-ab1f-4d18-80bb-b219cb126398 /mnt/tmp ext4 defaults,noauto,user,nofail 0 0
挂载脚本
current_uuid=$(blkid --output export /dev/myusb | grep ^UUID=)
mount "$current_uuid"
设备映射器
另一种方法是将设备映射器设备放置在 USB 设备之上 ( man dmsetup
)。优点是您可以通过这种方式获得静态名称,例如/dev/mapper/myusb
.但我不知道如果拔出 USB 记忆棒,DM 设备会有什么反应。您可能需要 udev 拔出规则来处理该问题。这看起来要复杂得多,并且可能不值得静态名称。
答案2
我已经/etc/fstab
通过使用解决了我的问题而无需触摸挂载程序。该程序似乎在多个 Linux 发行版的软件包存储库中可用。
在 ubuntu 上,会自动在其中创建文件夹/media
并将磁盘安装到这些文件夹中。似乎没有办法在外部安装磁盘,/media
但我个人已经接受了这一点。
程序将分区标识符(例如sdb1
)作为参数。$DEVNAME
udev 脚本中可用提供磁盘标识符(例如sdb
)。对于闪存盘,磁盘只有第一个分区 ( sdb1
) 是合理的。
所以问题中脚本的工作版本是:
LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
pmount "{$DEVNAME}1" &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE
最后注意:脚本以 root 用户身份运行,并且脚本文件必须属于 root。 (在Ubuntu上)