udev:启动时连接的设备

Posted

技术标签:

【中文标题】udev:启动时连接的设备【英文标题】:udev: device connected at boot time 【发布时间】:2011-11-02 02:21:16 【问题描述】:

我正在使用 udev 检测我的 Ubuntu 10.04 LTS x64 服务器上的 USB 驱动器连接和断开连接。当机器运行时连接 USB 设备时一切正常,但如果在启动时已经存在,我的脚本没有完成,显然是因为 mkdir /tmp/blah 不起作用。

如果我随后在终端输入sudo udevadm trigger,一切正常。

我假设在 udev 第一次根据其规则评估连接的设备时,根文件系统尚未安装。

因此我的问题是:

    我是否正确识别了问题? 是否有解决它的标准方法 - 即是否有替代 /tmp/ 的替代方法,我可以同时使用这两种方法 安装 / 之前和之后?

【问题讨论】:

unix.stackexchange.com 的好问题 你可能是对的......那或服务器故障。不过,我正在编写一个 bash 脚本:我的头脑处于编程模式,所以我来到这里,也许没有彻底考虑清楚! 【参考方案1】:

根文件系统已挂载,但当时是只读的。 /dev/shm(内存中的文件系统)应该可用;较新的 linux 发行版也可能有一个/run ramdisk。你也可以在某个地方选择一个永久目录,在你的脚本中挂载一个 tmpfs,然后在那里做你的工作。

【讨论】:

将处理从 '/tmp/' 移动到 '/dev/shm/' 解决了这个问题 - 非常感谢您的帮助。大概这个文件系统在机器启动时是持久的? 是的,但它是一个内存文件系统,所以不要在那里使用太多空间。【参考方案2】:

此问题的一个解决方案是编写一个由您的 udev 规则调用的脚本,该脚本立即分离,并等待某些事件发生,以确保系统“启动足够”以创建挂载点等以挂载您的设备.回答以下帖子的人 (http://superuser.com/questions/53978/ubuntu-automatically-mount-external-drives-to-media-label-on-boot-without-au) 编写了一个脚本来检查是否“httpd”在继续之前正在运行。我敢肯定还有其他“更好”的方法可以做到这一点。

【讨论】:

【参考方案3】:

1-我不知道,即使在initramfs中,在挂载根文件系统之前,还有一个可写的/tmp目录。

没错,当真正的根被挂载时,这个 /tmp 将被丢弃,最终的 /tmp 将为空。您确定 mkdir /tmp/blah 命令失败了吗?还是您认为是因为当您查找它时它不存在?

2- 在 Ubuntu(我不知道其他发行版)中,您在 /dev/.initramfs 中有一个隐藏目录来满足这些需求。由于/dev 是一个保存在最终根文件系统中的 tmpfs(或 devtmpfs)挂载点,因此您仍然可以在其中拥有它。

【讨论】:

根文件系统中的udev规则将与根文件系统的/tmp一起运行;这可能是在以读写方式重新挂载根文件系统之前。 你是对的 - 我没有看到 mkdir 命令失败(目前没有记录它的输出),但是下一个命令(mount)失败,报告目录 @ 987654327@应该创建不存在 @bdonlan 可能是它,只读的。在这种情况下,将 /tmp 配置为 tmpfs 应该可以解决问题。 /dev/.initramfs 技巧也应该是有效的。

以上是关于udev:启动时连接的设备的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 udev 规则识别断开连接的 USB 设备?

Ubuntu 无法连接设备 no permissions (verify udev rules)

Ubuntu 无法连接设备 no permissions (verify udev rules)

Ubuntu 无法连接设备 no permissions (verify udev rules)

我的 perl 脚本如何使用 UDev 而不是 HAL 对任意设备做出反应?

设备文件管理方法