udev 调用时不执行 mount

mag*_*gva 17 udev mount usb-drive

我尝试创建一些 udev 规则来挂载和卸载我的 USB 闪存驱动器;目前的规则非常简单:

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"
Run Code Online (Sandbox Code Playgroud)

plug_flash_drive.sh 也很简单:

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"
Run Code Online (Sandbox Code Playgroud)

unplug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"
Run Code Online (Sandbox Code Playgroud)

我做了一些测试,所以我可以确定:

  • 插入时,检测到我的闪存驱动器;在 /dev 中创建了一个文件
  • plug_flash_drive.sh 被 udev 调用
  • 脚本的 mkdir 部分有效
  • 但是,脚本的“mount”部分似乎没有执行,所以我的驱动器没有安装
  • 当我在命令行上调用我的脚本时,它们完美地工作

有人知道为什么在 udev 调用时不执行 mount 吗?

28/08/14 编辑:我在脚本末尾添加了“grep -q /proc/mounts && echo success || echo failure”,以检查我的调试日志是否在脚本结束之前实际安装了设备。即使 udev 调用了该脚本,该设备似乎也安装在该点上。所以现在真正的问题是“当通过 udev 调用时,我的块设备似乎在挂载脚本结束后卸载了”:s

小智 22

systemd-udevd 在它自己的文件系统命名空间中运行,默认情况下,在 udev .rules 中完成的挂载不会传播到主机。为了使您的旧脚本工作,您可以MountFlags=shared/usr/lib/systemd/system/systemd-udevd.service以下位置设置或(更好地)创建和编辑其副本/etc/systemd/system/

有关man 5 systemd.exec更多信息,请参阅MountFlags选项。

  • @sebelk 我相信 user83388 意味着它们不会传播到“root”命名空间 (2认同)

xae*_*xae -1

您可以尝试在规则 RUN 分配中使用:=而不是使用。+=

操作:=员设置列表值并不允许进一步更改。