查找哪个驱动器对应于Linux中的哪个USB大容量存储设备

我有几个USB大容量存储闪存驱动器连接到Ubuntu Linux计算机(Ubuntu 10.04.1,内核2.6.32-25-386),我需要以编程方式分开(如果可能的话,从bash中分离出来,但我不害怕编译) – 我需要find哪个块设备对应哪个物理设备(例如/dev/sdb1 – >设备在USB端口1;在我的情况下,一个设备〜一个卷)。

换句话说,我知道我有三个硬件设备插入USB端口, 它们中的每一个都作为USB大容量存储设备(如lsusb所示)显示在系统中,作为块设备( /dev/sdb1 )创build,并由UUID( /media/1234-5678 )自动挂接。

 USB device block device mountpoint USB device in port 2.2 <-> /dev/sdb1 <-> /media/1234-5678 

没有试图find块设备和挂载点之间的关系; 我试图find块设备和USB设备之间的关系,有没有办法?

为什么? 在磁盘上会有一些写操作,并有不可预知的完成时间。 我需要给操作员一些指示,例如“现在可以移除端口2(这是从左边的第二个)的磁盘”。 我发现哪个物理端口对应于该特定机器上的哪个端口号,并且从挂载点查找块设备是简单的; 现在我卡住逻辑USB端口映射到块设备。

我可以看到与lsusb的磁盘:

 Bus 001 Device 058: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device Bus 001 Device 060: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device Bus 001 Device 061: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device 

我可以看到他们(通过他们的UUID):

 /dev/sdb1 on /media/BC88-15C4 type vfat /dev/sdc1 on /media/AE54-65AA type vfat /dev/sdd1 on /media/58D2-FED1 type vfat 

现在所有的驱动器都是同一个制造商的同一个型号,所以我不能用它来区分它们,我不能保证它们会按照特定的顺序插入。

我find了/sys/bus/usb/devices (USB设备列表),但它似乎与我从lsusb获得的数据相同 – 我没有看到磁盘映射到那里。

还有/sys/block/sdb/sys/block/sdb/sdb1 (块设备及其第一个分区;对于sdcsdd ),但是我看不到映射到设备。

Solutions Collecting From Web of "查找哪个驱动器对应于Linux中的哪个USB大容量存储设备"

我不确定在哪个内核版本中实现,但/sys/block/*条目是符号链接到设备。

换句话说, /sys/block/sdb符号链接到不同的目录,其名称包含USB设备ID。

 $ file /sys/block/sdb /sys/block/sdb: symbolic link to `../devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1.1/1-1.1:1.0/host31/target31:0:0/31:0:0:0/block/sdb' USB version and port here---^^^^^ 

1-1.1是有趣的部分,表示usb1-port 1.device 1 。 当插入集线器时,将添加另一个级别: 1-2.3.1 ,表示usb1-port 2.port 3.device 1

伪代码:

 get partition name # eg /dev/sdb1 get disk name # that would be /dev/sdb get your basename # sdb see where /sys/block/$your_basename points to # eg ../devices/blah/blah/1-2.1/blah get the longest substring matching "\d-\d+(.\d+)*" # eg 1-2.1 that is the device id you want /sys/bus/usb/devices/$device_id/ has all kinds of information about it the ID corresponds to hardware USB ports 

工作示例脚本在bash中 。

我使用的路径:

 /sys/bus/usb/drivers/usb-storage/4-1:1.0/host4/target4:0:0/4:0:0:0/block/sda 

所以你可以看到USB总线4,端口1连接着一个USB存储/ dev / sda

你不能使用磁盘标签吗? http://ubuntuforums.org/showthread.php?t=322973

这是我怎么做的。

lsusb -v显示所有设备磁盘获得一个iserial数字记下他们

  ls -l /dev/disk | grep [iserial] 

/dev/disk都是符号链接,因此请按照符号链接查看设备。