【问题标题】:Enumerate USB flash drives programatically using libudev in Linux在 Linux 中使用 libudev 以编程方式枚举 USB 闪存驱动器
【发布时间】:2013-12-31 23:19:09
【问题描述】:

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

我在http://www.signal11.us/oss/udev/ 关注libudev 示例。示例代码适用于'hidraw';然后我尝试了'usb'、'scsi_disk'、'scsi_generic'等,但没有奏效-它没有像'/dev/sdb4'那样列出'设备路径',它说'@ 987654330@'.

【问题讨论】:

  • 我不知道答案。我只想说我喜欢“枚举”这个词,仅此而已。
  • @Wang Tuma 我也在做类似的事情。我有同样的问题。我使用了“块”,它列出了所有驱动器..我只想要 USB 闪存驱动器...有没有办法让已经连接的 USB 闪存驱动器?请看stackoverflow.com/questions/25361042/…

标签: c linux usb udev


【解决方案1】:

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

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

【讨论】:

  • 是的,“阻止”有效!但为什么?我实际上认为“scsi_disk”是正确的子节点。你能解释一下吗?谢谢。
  • @WangTuma:当然!我已经添加了一些解释。
  • 是的,这很有帮助!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2011-03-24
相关资源
最近更新 更多