我有几个USB大容量存储闪存驱动器连接到Ubuntu Linux计算机(Ubuntu 10.04.1,内核2.6.32-25-386),我需要以编程方式区分它们(如果可能的话,来自bash,但我'我也不怕编译) - 我需要找到哪个块设备对应哪个物理设备(例如/dev/sdb1
- >设备在USB端口1;在我的情况下,一个设备〜一卷)。
换句话说,我知道我有三个硬件设备插入USB端口;它们中的每一个都作为USB大容量存储设备显示在系统中(如lsusb所示),创建为块设备(/dev/sdb1
)并由UUID(/media/1234-5678
)自动挂载。
USB device block device mountpoint
USB device in port 2.2 <-> /dev/sdb1 <-> /media/1234-5678
我不试图找到块设备和mountpoint之间的关系; 我试图找到块设备和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
现在,所有驱动器都是来自同一制造商的相同型号,所以我无法区分它们,我不能保证它们会按特定顺序插入。
我找到/sys/bus/usb/devices
(USB设备列表),但它似乎与我从lsusb获得的数据相同 - 我没有看到那里的磁盘映射。
还有/sys/block/sdb
和/sys/block/sdb/sdb1
(块设备及其第一个分区;类似于sdc
和sdd
),但我再次看不到设备的映射。
答案 0 :(得分:8)
我不确定实现了哪个内核版本,但/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 # e.g. /dev/sdb1
get disk name # that would be /dev/sdb
get your basename # sdb
see where /sys/block/$your_basename points to # e.g. ../devices/blah/blah/1-2.1/blah
get the longest substring matching "\d-\d+(.\d+)*" # e.g. 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
答案 1 :(得分:1)
我使用路径:
/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
答案 2 :(得分:-1)
你不能使用磁盘标签吗? http://ubuntuforums.org/showthread.php?t=322973
答案 3 :(得分:-1)
我是这样做的。
lsusb -v
显示所有设备磁盘获得一个记录它们的英制数
ls -l /dev/disk | grep [iserial]
/dev/disk
中的所有内容都是符号链接,因此请按照符号链接查看设备。