在 udev 规则内以 root 身份运行 mount

在 udev 规则内以 root 身份运行 mount

不久前,当 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)作为参数。$DEVNAMEudev 脚本中可用提供磁盘标识符(例如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上)

相关内容