我正在创建 UDEV 规则,用于在无头服务器上自动安装外部驱动器,其方式与 Gnome-VFS 在用户会话期间自动安装的方式非常相似。
我担心规则在启动时的行为。在启动过程中,这些驱动器中的一个很有可能会被连接,我希望所有连接的驱动器都能安装在正确的位置。这些驱动器可能是 USB 或 Firewire,它们是通过 UDEV 在检测到“添加”时触发的 shell 脚本安装的。
以下是我的问题:
当 UDEV 在启动时针对这些设备运行 时
mount
,系统是否已准备好安装它?或者脚本是否会过早触发?如果太早,脚本有什么好方法来判断系统尚未准备好(因此先睡一会儿再检查)?
UDEV 规则匹配
ACTION=="add"
。此事件在系统启动时也会触发吗?
答案1
刚刚在 udev 上完成让 USB 设备自动挂载时不是运行 GUI(不使用 autofs。)
是的,维罗妮卡,udev 确实运行得非常早。
代理脚本可以在睡眠之后愉快地分叉并运行。
除了检查运行级别之外,udevadm set 可能还能帮助您。
action="Add" 在启动时运行,而不仅仅是热插拔。
无论在关机时运行 action="remove",现在都是一条不同颜色的鱼。
答案2
您混淆了两个概念。您应该使用 UDEV 为驱动器分配持久的设备名称,无论它们的连接顺序如何,这些名称都是永久的。然后,您可以使用 autofs 根据需要将它们挂载到您希望它们可用的位置。
答案3
不,UDEV 会在系统准备好挂载之前很久就启动该脚本(如果有的话);UDEV 从 启动
/etc/rcS.d/S03udev
,标准 fstab 从 挂载发生/etc/rcS.d/S35mountall.sh
。比仅仅猜测要好;检查 /bin/runlevel(谢谢布伦特&铑):
# at boot, system runs /etc/rcS.d/S* scripts, # then /etc/rcN.d/S* scripts, N is destination runlevel # runlevel not set at least until we're running /etc/rcN.d scripts RUNLEVEL=`/sbin/runlevel | cut -d " " -f 2` until [ $RUNLEVEL -ge 1 ] && [ $RUNLEVEL -le 6 ]; do sleep 10 RUNLEVEL=`/sbin/runlevel | cut -d " " -f 2` done ## run the action i want here
没有把握。
答案4
我认为 udev 规则不是解决此问题的首选方案。我认为系统启动后,使用 autofs 或 ivman 会更好,udev 处于非常低的级别,并且在其基础上构建了许多工具,例如您文章中的 Gnome-VFS,这些工具更易于使用和管理。最终,您关心的是访问时挂载(即 autofs)以及具有可预测的高级机制来检测或响应故障。如果您在 udev 级别工作,您将不得不再次自己解决所有这些问题。