了解 Linux 启动过程、子系统初始化和 udev 规则?

了解 Linux 启动过程、子系统初始化和 udev 规则?

我正在创建 UDEV 规则,用于在无头服务器上自动安装外部驱动器,其方式与 Gnome-VFS 在用户会话期间自动安装的方式非常相似。

我担心规则在启动时的行为。在启动过程中,这些驱动器中的一个很有可能会被连接,我希望所有连接的驱动器都能安装在正确的位置。这些驱动器可能是 USB 或 Firewire,它们是通过 UDEV 在检测到“添加”时触发的 shell 脚本安装的。

以下是我的问题:

  1. 当 UDEV 在启动时针对这些设备运行 时mount,系统是否已准备好安装它?或者脚本是否会过早触发?

  2. 如果太早,脚本有什么好方法来判断系统尚未准备好(因此先睡一会儿再检查)?

  3. UDEV 规则匹配ACTION=="add"。此事件在系统启动时也会触发吗?

答案1

刚刚在 udev 上完成让 USB 设备自动挂载时不是运行 GUI(不使用 autofs。)

  1. 是的,维罗妮卡,udev 确实运行得非常早。

    代理脚本可以在睡眠之后愉快地分叉并运行。

  2. 除了检查运行级别之外,udevadm set 可能还能帮助您。

  3. action="Add" 在启动时运行,而不仅仅是热插拔。

无论在关机时运行 action="remove",现在都是一条不同颜色的鱼。

答案2

您混淆了两个概念。您应该使用 UDEV 为驱动器分配持久的设备名称,无论它们的连接顺序如何,这些名称都是永久的。然后,您可以使用 autofs 根据需要将它们挂载到您希望它们可用的位置。

答案3

  1. 不,UDEV 会在系统准备好挂载之前很久就启动该脚本(如果有的话);UDEV 从 启动/etc/rcS.d/S03udev,标准 fstab 从 挂载发生/etc/rcS.d/S35mountall.sh

  2. 比仅仅猜测要好;检查 /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
    
  3. 没有把握。

答案4

我认为 udev 规则不是解决此问题的首选方案。我认为系统启动后,使用 autofs 或 ivman 会更好,udev 处于非常低的级别,并且在其基础上构建了许多工具,例如您文章中的 Gnome-VFS,这些工具更易于使用和管理。最终,您关心的是访问时挂载(即 autofs)以及具有可预测的高级机制来检测或响应故障。如果您在 udev 级别工作,您将不得不再次自己解决所有这些问题。

相关内容