Linux控制台 – 编程检测USB存储分配给哪个设备

每天早晨9点,我们将外部HD插入我们的办公室服务器(总是连接到同一个USB端口)。
HD每天都是新的,但都是由同一个制造商(Freecom)制造的。

每天早上12点,一个脚本运行备份所有的HD。
第一步是以这种方式安装高清:

mount /dev/sdc1 /mnt/backup 

问题是有时设备文件不是/ dev / sdc1,而是其他的东西(比如/ dev / sdd1)。 我仍然不知道为什么,因为我们没有插入任何其他东西,我们总是使用相同的端口。

所以我的问题是如何以一种非常安全的方式以编程方式检测正确的设备文件。 我到目前为止唯一的想法是grep / dev / disk / by-id目录的内容,从这一行查找并提取/ dev / xxx:

 lrwxrwxrwx 1 root root 10 Sep 24 11:03 usb-Freecom_ToughDrive_1A90102657FF-part1 -> ../../sdc1 

有更好的build议吗? 任何关于我的方式的担忧?

我很惊讶lsusb怎么帮不了我。

by-id条目是一个链接,在大多数情况下,您可以简单地使用该条目而不是/dev/sdc1 。 如果没有,你可以用readlink解引用它

 readlink -f /dev/disk/by-id/usb-Freecom_ToughDrive_1A90102657FF-part1 /dev/sdc1 

你可以修复很容易与udev规则。 udev规则在启动时运行,并在各种热插拔事件中运行特殊处理程序/服务或设置设备命名。 这听起来像你想要一个udev规则来一致地命名您的驱动器像/ dev / backup,所以一个mtab条目可以持续挂载/ dev / backup到/ mnt / backup(你甚至可以让设备自动挂载,喜欢。

这是一个较老的,但仍然在很大程度上相关的指导udev规则编写 。 在最近的Linux发行版中, udevinfofunction已被折叠到udevadm命令中。 使用这样的命令应该可以帮助你找出你想匹配的特定字段:

 udevadm info -q all --path=/sys/block/sdc 

一旦你知道哪些字段足够用于映射,你就需要在/etc/udev/rules.d/创build一个udev规则文件(注意规则文件是按照自然sorting顺序进行评估的,并且你的发行版可能会自己存储规则/lib/udev/rules.d/这样的名称)。 你会想创build一个看起来像这样的规则,它会创build一个指向任何设备名称的/dev/backup符号链接:

 ENV{DEVTYPE}=="disk", ID_SERIAL=="Freecom_ToughDrive_1A90102657FF", SYMLINK+="backup" ENV{DEVTYPE}=="partition", ID_SERIAL=="Freecom_ToughDrive_1A90102657FF", SYMLINK+="backup%n" 

:我猜上面的序列号基于上面的/dev/disk/by-id/你的列表。 这可能不匹配正确的字段或正确的值。 还要注意,这是匹配一个特定的序列号,因此一个特定的设备,你需要改变这个,如果你改变设备。

希望有所帮助!

简单的方法 :因为我一直在使用udev来擦亮产品供客户使用,所以通常我首先要达到的目的。 通过创build设备唯一的/dev/disk/by-id条目,udev已经在做你想做的了。 只需将/etc/mtab更改为在/mnt/backup挂载/dev/disk/by-id/Freecom_ToughDrive_1A90102657FF-part1 。 你的脚本中的mount /mnt/backup就足够了。

如果你这样做

 tail /var/log/messages 

插入USB后,您将看到哪个设备被识别。

我在一个实现中遇到了同样的问题,所以在find解决scheme之后,我写了一篇文章。 在UDEV的情况下,它可以帮助其他人在Linux上查找USB设备,从而自动创build或pipe理设备。

如何在linux下findusb设备