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

3
如何在Linux下使用libudev以编程方式枚举所有USB闪存驱动器?我想要获取像'/dev/sdb4'这样的字符串,以便我可以使用'mount()'将它们挂载。
我遵循了http://www.signal11.us/oss/udev/上的libudev示例。该示例代码对于'hidraw'工作得很好;然后我尝试了'usb'、'scsi_disk'、'scsi_generic'等,但没用——它没有列出像'/dev/sdb4'这样的'device path',而是说'Device Node Path: (null)'。

我不知道答案。我只想说我喜欢“枚举”这个词,仅此而已。 - n. m.
@王图马,我也在做类似的事情。我有同样的问题。我使用了“block”,它列出了所有的驱动器...我只想要USB闪存驱动器...有没有办法获取已连接的USB闪存驱动器?请看一下https://dev59.com/NoLba4cB1Zd3GeqPgZTZ - jsaji
1个回答

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

是的,“block”有效了!但为什么?我原本以为“scsi_disk”是正确的子节点。你能否再解释一下?谢谢。 - Wang Tuma
@WangTuma:当然可以!我添加了一些解释。 - rodrigo
是的,那帮了很多!谢谢。 - Wang Tuma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接