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

如何在Linux下使用libudev以编程方式枚举所有USB闪存驱动器? 我想得到' /dev/sdb4 '这样的string,然后我可以使用' mount() '来挂载它们。

我是在http://www.signal11.us/oss/udev/下面的libudev例子。 示例代码适用于' hidraw '; 然后我尝试了' usb ',' scsi_disk ',' scsi_generic '等,但是没有工作 – 它没有列出像' /dev/sdb4 '那样的'设备path',它表示' Device Node Path: (null) “。

而不是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设备,因为它根本不是块设备!