由udev调用时不执行mount


17

我试图创建一些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"

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"

unplug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

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

  • 插入后,将检测到我的闪存驱动器;在/ dev中创建一个文件
  • 通过udev调用plug_flash_drive.sh
  • 脚本的mkdir部分起作用
  • 但是,脚本的“挂载”部分似乎未执行,因此未挂载我的驱动器
  • 当我在命令行上调用脚本时,它们可以正常工作

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

编辑28/08/14:我在脚本的末尾添加了“ grep -q / proc / mounts &&回声成功||回声失败”,以在调试日志中检查调试脚本是否在脚本结束之前实际挂载了设备。即使在udev调用脚本的情况下,设备似乎安装在该位置。因此,真正的问题是“通过udev调用安装脚本后,我的块设备似乎已卸载”:s


这可能是跑题了,但你为什么mkdir "$mount_dir"不过rmdir "/media/$device_name"?在哪里$mount_dir设置?
G-Man说'恢复莫妮卡'

抱歉,这是一个错字,我在原始代码中使用了一些非常无用的变量别名,为了清楚起见,在此处删除了它们
magva 2014年

您是否尝试过老式调试?例如,通过将set -xvexec >> "$HOME"/mount.log 2>&1.sh文件?
G-Man说'Resstate Monica'

1
我已经做到了,但是根据我得到的日志,udev调用脚本时将执行安装。从udev和从命令行进行的调用之间的日志没有区别……这实际上令人
感到

1
在这种情况下,从命令行运行时脚本也会失败
magva 2014年

Answers:


22

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

请参阅man 5 systemd.exec以获取更多信息,MountFlags选项。


“不传播到主机”是什么意思?
sebelk

2
@sebelk我相信user83388意味着它们不会传播到“根”命名空间
马克

2

在撰写本文时,其他答案不正确(或已过期)。

您不应mount从Systemd服务运行。即使注释了其中的MountFlagsPrivateMountssystemd-udevd.service,您的规则也不适用于FUSE文件系统(例如NTFS或exFAT),因为FUSE进程将被Systemd有用地杀死。

请参阅此ArchWiki页面,其中列出了一些更好的选项。我的首选是GitHub上的一个名为udev-media-automount的小项目,该项目只是从Udev规则重新启动Systemd服务。这是解决Udev对名称空间和子进程的各种繁琐限制的便捷方法。

另请参阅此anwser,它显示了如何使用SYSTEMD_WANTSUdev变量启动Systemd单元。


-1

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

:=运营商设置列表值并禁止进一步的修改。


谢谢,但坐骑仍然无法工作:(
magva 2014年

1
可能不是您的情况,但是在我的系统中,安装位于/ bin / mount。尝试“命令-v mount”。
xae

1
在我的系统中,“-v mount”命令返回的路径是/ usr / bin / mount。我注意到我也有一个/ bin / mount可执行文件,但是当被udev调用时它也不起作用
magva 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.