识别设备插入哪个 USB 端口

识别设备插入哪个 USB 端口

我正在开发自定义 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

这是已接受的解决方案的替代方案,在这种解决方案中,您不知道设备的名称,无法将其提供给命令(以告诉您有关该设备的信息)。

插入U盘,执行:

udevadm monitor

一旦插入 U 盘,它将详细地发出 Kernel & Udev 消息,并在最后一行告诉我们主机如何看到 U 盘:

18.04 udevadm 监控命令反馈

答案3

看起来/dev/disk/by-path包含/dev/sd*节点的符号链接,可以用来准确地找出它。

发出file /dev/disk/by-path/*命令会列出所有/dev/sd*节点及其物理地址。我应该能够很轻松地通过 grep 解决这个问题。

相关内容