Linux 控制台 - 通过编程检测 USB 存储设备被分配到哪个设备

Linux 控制台 - 通过编程检测 USB 存储设备被分配到哪个设备

每天早上 9 点,我们都会将外置硬盘插入办公室服务器(始终插入同一个 USB 端口)。
每天的硬盘都是新的,但都是由同一家制造商 (Freecom) 生产的。

每天凌晨 12 点,都会运行一个脚本,将所有内容备份到 HD。
第一步是按照以下方式安装 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

还有更好的建议吗?对我的方法有什么顾虑吗?

我很惊讶 lsusb 为什么不能给我那么大的帮助。

答案1

by-id条目是一个链接,在大多数情况下,您可以简单地使用它来代替/dev/sdc1。如果不是,您可以使用readlink

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

答案2

您可以使用 udev 规则轻松修复此问题。udev 规则在启动时和各种热插拔事件中运行,以运行特殊处理程序/服务或设置设备命名。这听起来就像您希望 udev 规则始终将您的驱动器命名为 /dev/backup 之类的名称,以便 mtab 条目可以始终将 /dev/backup 安装到 /mnt/backup(如果您愿意,甚至可以自动安装该设备)。

这是一篇较旧但仍然具有很大相关性的指南编写 udev 规则。在最近的 Linux 发行版中,udevinfo功能已被纳入udevadm命令中。使用这样的命令应该可以帮助您确定要匹配哪些特定字段:

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

一旦您知道哪些字段足以进行映射,您将需要创建一个 udev 规则文件/etc/udev/rules.d/(请注意,规则文件按自然排序顺序进行评估,并且您的发行版可能有自己的规则存储在某个地方,例如/lib/udev/rules.d/相应的名称)。您将需要创建一个类似于这样的规则,它将创建一个/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 来完善产品以供客户使用,因此它通常是我首先想到的。udev 已经通过创建设备唯一/dev/disk/by-id条目来执行您想要的操作。只需将您的更改/etc/mtab为 mount /dev/disk/by-id/Freecom_ToughDrive_1A90102657FF-part1at即可/mnt/backup。脚本中的 Amount /mnt/backup就足以完成挂载。

答案3

如果你

tail /var/log/messages

插入 USB 后您将立即看到它被识别的设备。

答案4

我在一次实施中遇到了同样的问题,所以在找到解决方案后,我写了一篇文章。它可能会帮助其他人在 UDEV 的情况下在 Linux 中查找 USB 设备,UDEV 会自动创建或管理设备。

如何在 Linux 中查找 USB 设备

相关内容