如果我插入一個USB記憶棒,我在/ sys/bus/usb/devices中看到一個新文件夾...因此是一個新的USB設備。Linux:如何將塊設備映射到USB設備?
另外我在/ sys/block中看到一個新文件夾...因此是一個新的塊設備。
我的問題是:如何在這兩種設備之間獲得防水貼圖?意思是: 如果我在/ sys/bus/usb/devices中得到一個新設備,我該如何通過編程方式(通過檢查/ sys/...來找出哪個塊設備映射/關聯到這個usb設備) -versa?
如果我插入一個USB記憶棒,我在/ sys/bus/usb/devices中看到一個新文件夾...因此是一個新的USB設備。Linux:如何將塊設備映射到USB設備?
另外我在/ sys/block中看到一個新文件夾...因此是一個新的塊設備。
我的問題是:如何在這兩種設備之間獲得防水貼圖?意思是: 如果我在/ sys/bus/usb/devices中得到一個新設備,我該如何通過編程方式(通過檢查/ sys/...來找出哪個塊設備映射/關聯到這個usb設備) -versa?
/sys
中的信息以多種方式組織(通過驅動程序,公交車等),並且從一個層次結構到另一個層次結構有很多符號鏈接。
示例(內核2.6.26上的示例):從塊設備開始,在/sys/block/sdc
中,符號鏈接/sys/block/sdc/device
指向每個設備類型層次結構內部。你可以看到,這是一個USB設備,因爲鏈接的目標是一樣的東西
../../devices/pci0000:00/0000:00:1d.7/usb8/8-2/8-2:1.0/host9/target9:0:0/9:0:0:0
相反,USB設備在/sys/bus/usb/devices
上市,而且我們可以看到,8-2:1.0
是圓盤狀的裝置,因爲/sys/bus/usb/devices/8-2:1.0/driver
鏈接usb-storage
。爲了找出關聯的塊設備是什麼,似乎我們需要到目錄/sys/bus/usb/devices/8-2:1.0/host9/target9:0:0/9:0:0:0
,其中包含一個符號鏈接block:sdc
,其目標是/sys/block/sdc
。
ADDED:警告:/sys
的確切結構從內核版本變爲內核版本。例如,使用內核2.6.32,/sys/block/sdc/device
直接指向/dev/bus/scsi
而不通過USB跳。
另一種方法是調用udevadm info
命令。 udevadm info -p /sys/block/sdc --query=…
根據其條目/sys
提供有關設備的信息,而udevadm info -n sdc --query=…
提供有關設備/dev/sdc
的信息。
的信息包括總線信息,例如udevadm info -p /sys/block/sdc --query=env
顯示
ID_BUS=usb
ID_PATH=pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0
udev的文檔可以有你感興趣的更多的信息。
最後一句要小心:有各種各樣的複雜情況,可能會使任何你不那麼防水。你的程序如何處理一個USB設備,這個USB設備是分配了多個塊設備的磁盤陣列?相反,您的程序將如何處理由多個設備組裝而成的RAID陣列(可能其中一些是USB,其中一些不是)?你關心其他可移動媒體類型,如Firewire和e-SATA嗎?等等。你不能預測所有的角落案例,所以一定要優雅地失敗。
據我發現,有可能通過「libudev」庫訪問udev信息。網絡上還有一個很好的示例:http://www.signal11.us/oss/udev/
我能夠修改它來讀出所有「/ dev/sd *」設備並獲取他們的供應商ID,產品ID以及序列號。我認爲這個解決方案是獨立的kernel/linux分發。但我仍然需要驗證這一點。
感謝您的解釋。我可以在debian機器上關注你的示例。但在Ubuntu f.i上。/sys/block/sdb包含一個「設備」鏈接到「../../../7:0:0:0」。如果我遵循其餘的示例,則不存在「block:sdb」符號鏈接。所有從/ sys/block開始的設備路徑都不會顯示任何提示:這是一個USB設備:-( 因此,對於debian,它可能工作,但Ubuntu似乎有點不同 命令「udevinfo」不是可與Ubuntu但有「udevadm」,這似乎是similiar但解析命令行輸出也許不是關於防水問題的最好? – Alex 2010-08-16 16:21:50
:。 我的使用情況不關心不同類型的設備的襲擊。這只是關於USB閃存盤的問題,我需要的只是vendor-id + product-id + serialnumber +與掛載點的關係,就是這樣。 – Alex 2010-08-16 16:22:15
@Alex:好的,我看了一下,看起來更多最近的內核版本在'/ sys'下有一個不同的符號鏈接結構,據我可以告訴'udevinfo'(它存在的地方)是完全等同於'udevadm info'。它看起來像'udevadm info'是要走的路(它也給你供應商和序列號信息)。 – Gilles 2010-08-16 16:59:25