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

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

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

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

因此我的问题是:

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

【问题讨论】:

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

标签: linux ubuntu boot udev


【解决方案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 技巧也应该是有效的。
    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多