2013-12-13 62 views
3

如何在Linux下以編程方式枚舉所有使用libudev的USB閃存驅動器?我想獲得'/dev/sdb4'這樣的字符串,以便我可以使用'mount()'來裝載它們。在Linux中使用libudev以編程方式枚舉USB閃存驅動器

我正在關注libudev示例http://www.signal11.us/oss/udev/。示例代碼適用於'hidraw';然後,我嘗試'usb','scsi_disk','scsi_generic'等,但沒有工作 - 它沒有列出'設備路徑''/dev/sdb4',它說'Device Node Path: (null)'。

+0

我不知道答案。我只想說我喜歡「enumulate」這個詞,就是這樣。 –

+0

@Wang Tuma我也在做類似的事情。我有同樣的問題。我用「塊」,並列出所有的驅動器..我只想要USB閃存驅動器...有沒有辦法讓已經連接的USB閃存驅動器?請看看http://stackoverflow.com/questions/25361042/how-to-list-usb-mass-storage-devices-programatically-using-libudev-in-linux – Griffin

回答

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設備,因爲它根本不是塊設備!

+0

是'塊'的作品!但爲什麼?我其實認爲'scsi_disk'是正確的子節點。你能解釋更多嗎?謝謝。 –

+0

@WangTuma:當然!我添加了一些解釋。 – rodrigo

+0

是的,幫助了很多!謝謝。 –

相關問題