2011-08-23 76 views
6

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

如果我随后在终端键入sudo udevadm trigger,一切都没问题。

我假设在udev首次评估连接的设备违反其规则时,根文件系统尚未安装。因此

我的问题是:

  1. 我有没有正确识别的问题?
  2. 有没有一种标准的解决方法 - 即是否有/tmp/的替代品,我可以在登录/之前和之后使用 ?
+0

很好的问题http://unix.stackexchange.com/ –

+0

你可能是正确的......或serverfault。我正在编写一个bash脚本:我的脑袋处于编程模式,所以我来到这里,可能没有彻底思考它! –

回答

5

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

+0

将处理从'/ tmp /'移动到'/ dev/shm /'解决了这个问题 - 非常感谢您的帮助。推测这个文件系统在机器启动时是持久的? –

+0

是的,但它是一个内存中的文件系统,所以不要在那里使用太多的空间。 – bdonlan

1

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

确实,当安装真正的根时,这个/ tmp将被丢弃,最后的/ tmp将是空的。你确定mkdir /tmp/blah命令失败吗?或者你认为这是因为当你寻找它时它不在那里?

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

+0

根文件系统中的udev规则将使用根文件系统的'/ tmp'运行;这可能是在重新装入根文件系统读写之前。 – bdonlan

+0

你是对的 - 我没有看到'mkdir'命令失败(它的输出目前没有记录),但是下一个命令('mount')失败,报告'mkdir'应该创建的目录是不存在 –

+0

@bdonlan可能是,只读。在这种情况下,将/ tmp配置为tmpfs应该可以做到。 /dev/.initramfs技巧也应该是有效的。 – rodrigo

2

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