/sys/block/sd[a-z] 裡面有個欄位叫做removable,可以參考這個欄位。
removable為1的就是usb flash device,為0的是usb HD(我手上看的是這樣)。
另我在自己系統上插上這兩種裝置,kernel 吐出來的訊息也有點不同。
首先我拿手上的usb硬碟跟usb大姆哥先看了一下usb列舉出來的資訊
兩者回的是一樣的:
bInterfaceClass: 0x08
bInterfaceSubClass: 0x06
bInterfaceProtocol: 0x50
可以找SPEC來看相關數值代表的意義
http://www.usb.org/developers/devclass_docs/
經過查詢的結果如下:
bInterfaceClass: Mass Storage
bInterfaceSubClass: SCSI transparent command set
bInterfaceProtocol: USB Mass Storage Class Bulk-Only
可見兩者都是用SCSI命令集跟硬體溝通
再來就是要看一下SCSI命令集裡面怎麼寫的了
http://0rz.tw/LJ26F
可以看到該SPEC第72頁有關INQUIRY data的表格裡有一bit:
RMB (Removable Media) bit
0 A removable medium (RMB) bit set to zero indicates that the medium is not removable.
1 A RMB bit set to one indicates that the medium is removable.
這時候回kernel source code翻一下相關的code看看
kernel_source/drivers/scsi/scsi_scan.c
發現有個函式scsi_add_lun() 裡面有對SPEC說的相關bit做處理:
sdev->removable = (inq_result[1] & 0x80) >> 7;
然後再看 kernel_source/drivers/scsi/sd.c
函式sd_probe_async() 裡負責kernel 噴出來的訊息:
sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n",
sdp->removable ? "removable " : "");
所以我插上這兩種不同裝置的時候,kernel會根據
sdp->removable 的值而噴出不一樣的訊息了
其實要看相關資訊可以到/sys下面去找
for USB方面的可以找/sys/class/usb_device
for SCSI的可以看/sys/class/scsi_disk/
kernel_source/drivers/scsi/scsi_sysfs.c
以上一點心得,有錯誤的話還請指正XD
留言列表