我正在开发自定义 Bash 脚本,用于 USB 闪存的大规模复制和大规模测试(使用f3
)。
我想知道是否可以识别随身碟插入哪个 USB 端口。
我有带编号端口的 USB 集线器。如果有一些静态地址,我可以识别并知道是否插入了某些东西,以及那是什么(本质上:哪个 /dev/sd* 文件对应于该 USB 端口),我可以让用户更容易了解发生了什么,并允许他们在此过程的早期删除坏驱动器,而不必等到整批处理完毕,然后尝试从好驱动器中挑选出坏驱动器(这就是我现在的做法)。
我尝试四处搜索,但发现似乎没有任何内容与我想要实现的目标相吻合,因此我决定在这种情况下直接寻求帮助。
现在我通过 /dev/sd* 节点名称来识别驱动器,而用户不知道那是什么。如果我可以将这些映射到集线器中的 USB 端口,我可以根据 USB 端口显示信息,并且用户可以知道端口 5 插入了损坏的驱动器,他们可以将其删除,而不会干扰正在发生的其余过程。
然后,我什至可以停止批量执行此操作,并使所有端口在循环中同时工作,用户可以随时插入和拔出驱动器,通过 HUB 端口号跟踪内容,它可以极大地加快工作流程。
那么基本问题是:如何识别 USB 端口和插入这些端口的 USB 闪存?
答案1
您可以使用udevadm
来获取设备路径某些设备的。这是通过检查 中的符号链接来完成的/sys/
,因此您也可以手动执行此操作(但更容易使用udevadm
)。
例如,插入我系统上的外部 USB 集线器的 USB 记忆棒会产生
$ udevadm info -q path -n /dev/sdh
/devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1.1/3-1.1.3/3-1.1.3.2/3-1.1.3.2:1.0/host7/target7:0:0/7:0:0:0/block/sdh
通过与 USB 树进行比较可以看出,
$ lsusb -t
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
|__ Port 1: Dev 26, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 29, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 31, If 0, Class=Mass Storage, Driver=usb-storage, 480M
|__ Port 4: Dev 30, If 0, Class=Mass Storage, Driver=usb-storage, 480M
...
路径的一部分3-1.1.3.2
表示在总线 3 上,它经过端口 1(在南桥上),再次经过端口 1(在主板上)、端口 3(仍在主板上),然后经过外部 USB 集线器的端口 2。该集线器的端口 4 用于 SD 读卡器。
因此,根据 USB 集线器的连接方式,您需要执行类似的操作,并提取您感兴趣的最后一个端口。
答案2
答案3
看起来/dev/disk/by-path
包含/dev/sd*
节点的符号链接,可以用来准确地找出它。
发出file /dev/disk/by-path/*
命令会列出所有/dev/sd*
节点及其物理地址。我应该能够很轻松地通过 grep 解决这个问题。