2010-08-16 133 views
4

如果我插入一个USB记忆棒,我在/ sys/bus/usb/devices中看到一个新文件夹...因此是一个新的USB设备。Linux:如何将块设备映射到USB设备?

另外我在/ sys/block中看到一个新文件夹...因此是一个新的块设备。

我的问题是:如何在这两种设备之间获得防水贴图?意思是: 如果我在/ sys/bus/usb/devices中得到一个新设备,我该如何通过编程方式(通过检查/ sys/...来找出哪个块设备映射/关联到这个usb设备) -versa?

回答

5

/sys中的信息以多种方式组织(通过驱动程序,公交车等),并且从一个层次结构到另一个层次结构有很多符号链接。

示例(内核2.6.26上的示例):从块设备开始,在/sys/block/sdc中,符号链接/sys/block/sdc/device指向每个设备类型层次结构内部。你可以看到,这是一个USB设备,因为链接的目标是一样的东西

../../devices/pci0000:00/0000:00:1d.7/usb8/8-2/8-2:1.0/host9/target9:0:0/9:0:0:0 

相反,USB设备在/sys/bus/usb/devices上市,而且我们可以看到,8-2:1.0是圆盘状的装置,因为/sys/bus/usb/devices/8-2:1.0/driver链接usb-storage 。为了找出关联的块设备是什么,似乎我们需要到目录/sys/bus/usb/devices/8-2:1.0/host9/target9:0:0/9:0:0:0,其中包含一个符号链接block:sdc,其目标是/sys/block/sdc

ADDED:警告:/sys的确切结构从内核版本变为内核版本。例如,使用内核2.6.32,/sys/block/sdc/device直接指向/dev/bus/scsi而不通过USB跳。


另一种方法是调用udevadm info命令。 udevadm info -p /sys/block/sdc --query=…根据其条目/sys提供有关设备的信息,而udevadm info -n sdc --query=…提供有关设备/dev/sdc的信息。

的信息包括总线信息,例如udevadm info -p /sys/block/sdc --query=env显示

ID_BUS=usb 
ID_PATH=pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0 

udev的文档可以有你感兴趣的更多的信息。


最后一句要小心:有各种各样的复杂情况,可能会使任何你不那么防水。你的程序如何处理一个USB设备,这个USB设备是分配了多个块设备的磁盘阵列?相反,您的程序将如何处理由多个设备组装而成的RAID阵列(可能其中一些是USB,其中一些不是)?你关心其他可移动媒体类型,如Firewire和e-SATA吗?等等。你不能预测所有的角落案例,所以一定要优雅地失败。

+0

感谢您的解释。我可以在debian机器上关注你的示例。但在Ubuntu f.i上。/sys/block/sdb包含一个“设备”链接到“../../../7:0:0:0”。如果我遵循其余的示例,则不存在“block:sdb”符号链接。所有从/ sys/block开始的设备路径都不会显示任何提示:这是一个USB设备:-( 因此,对于debian,它可能工作,但Ubuntu似乎有点不同 命令“udevinfo”不是可与Ubuntu但有“udevadm”,这似乎是similiar但解析命令行输出也许不是关于防水问题的最好? – Alex 2010-08-16 16:21:50

+0

:。 我的使用情况不关心不同类型的设备的袭击。这只是关于USB闪存盘的问题,我需要的只是vendor-id + product-id + serialnumber +与挂载点的关系,就是这样。 – Alex 2010-08-16 16:22:15

+0

@Alex:好的,我看了一下,看起来更多最近的内核版本在'/ sys'下有一个不同的符号链接结构,据我可以告诉'udevinfo'(它存在的地方)是完全等同于'udevadm info'。它看起来像'udevadm info'是要走的路(它也给你供应商和序列号信息)。 – Gilles 2010-08-16 16:59:25

0

据我发现,有可能通过“libudev”库访问udev信息。网络上还有一个很好的示例:http://www.signal11.us/oss/udev/

我能够修改它来读出所有“/ dev/sd *”设备并获取他们的供应商ID,产品ID以及序列号。我认为这个解决方案是独立的kernel/linux分发。但我仍然需要验证这一点。