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:启动时连接的设备的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu 无法连接设备 no permissions (verify udev rules)
Ubuntu 无法连接设备 no permissions (verify udev rules)
Ubuntu 无法连接设备 no permissions (verify udev rules)