在Linux中使用libudev以编程方式枚举USB闪存驱动器

时间:2013-12-13 08:39:50

标签: c linux usb udev

如何在Linux下使用libudev以编程方式枚举所有USB闪存驱动器?我想获取诸如“/dev/sdb4”之类的字符串,以便我可以使用“mount()”来安装它们。

我在http://www.signal11.us/oss/udev/关注了libudev示例。示例代码适用于“hidraw”;然后,我尝试了“usb”,“scsi_disk”,“scsi_generic”等,但没有效果 - 它没有列出'设备路径',如'{{1 }}',它说'/dev/sdb4'。

1 个答案:

答案 0 :(得分:3)

而不是scsi_generic搜索block子节点。你应该找到块设备。

scsi_generic是一个不同的界面。

我会添加一些解释,但请注意,我不是这个主题的专家,只是一个观察者......

SCSI设备非常复杂,并且具有不同的接口以访问不同的功能集。

scsi_generic设备是字符设备(通常名为/dev/sg<n>),可以访问SCSI功能。例如,CD / DVD刻录机(通常是?)通常通过此设备进行管理。但是通过标准块设备可以访问数据块,因此每个看起来像磁盘的SCSI设备(记住,还有SCSI打印机......)也会创建一个块子节点。

但USB闪存驱动器不是真正的SCSI设备,它只是使用相同的协议,非常简化。因此,为避免重写USB的相同协议,内核会创建一个虚拟SCSI设备并将其连接到USB设备。

这个虚拟SCSI设备的用途是它们具有将自己呈现为块设备所需的最小值。因此缺少许多SCSI特定功能,尤其是scsi_generic接口。这就是你在那里得到(null)的原因。并不是说它对您有用,因为您无法安装scsi_generic设备,因为它根本不是块设备!