[root@localhost ~]# lsscsi
[0:0:0:0] disk SEAGATE ST300MM0048 N001 /dev/sda
[0:0:2:0] disk ATA INTEL SSDSC2BB80 0112 /dev/sdc
[0:0:3:0] disk ATA HGST HUS726060AL T7JM /dev/sdd
[0:0:4:0] disk ATA HGST HUS726060AL T7JM /dev/sde
[0:0:5:0] disk ATA HGST HUS726060AL TAF0 /dev/sdf
[0:0:6:0] disk ATA HGST HUS726060AL TAF0 /dev/sdg
[0:0:7:0] disk ATA HGST HUS726060AL TAF0 /dev/sdh
[0:0:8:0] disk ATA HGST HUS726060AL TAF0 /dev/sdi
[0:0:9:0] disk ATA HGST HUS726060AL TAF0 /dev/sdj
[0:0:10:0] disk ATA HGST HUS726060AL TAF0 /dev/sdk
[0:0:11:0] disk ATA HGST HUS726060AL TAF0 /dev/sdl
[0:0:12:0] disk ATA HGST HUS726060AL TAF0 /dev/sdm
[0:0:13:0] enclosu CHENBRO 80H10323607 0611 -
[0:0:14:0] disk ATA INTEL SSDSC2BB80 0112 /dev/sdn
[11:65535:1:0]disk Huawei VBS fileIO 1.0 /dev/sdb
[11:65535:2:0]disk Huawei VBS fileIO 1.0 /dev/sdo
[root@localhost ~]# cat /proc/scsi/scsi
Host: scsi0 Channel: 00 Id: 12 Lun: 00
Vendor: ATA Model: HGST HUS726060AL Rev: TAF0
Type: Direct-Access ANSI SCSI revision: 06
Host: scsi0 Channel: 00 Id: 13 Lun: 00
Vendor: CHENBRO Model: 80H10323607 Rev: 0611
Type: Enclosure ANSI SCSI revision: 05
Host: scsi0 Channel: 00 Id: 14 Lun: 00
Vendor: ATA Model: INTEL SSDSC2BB80 Rev: 0112
Type: Direct-Access ANSI SCSI revision: 06
Host: scsi11 Channel: 65535 Id: 01 Lun: 00
Vendor: Huawei Model: VBS fileIO Rev: 1.0
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi11 Channel: 65535 Id: 02 Lun: 00
Vendor: Huawei Model: VBS fileIO Rev: 1.0
Type: Direct-Access ANSI SCSI revision: 05
前面第一列數字是什么?
lsscsi顯示的第一列是scsi設備在內核中展示的各級編號,根據編號可以唯一確定一個設備,
如果使用 cat /proc/scsi/scsi 來查看會顯得好理解一些:
從編號可以看出,第一級是host,第二級是channel,第三級是target編號,第四級是LUN號
h == hostadapter id (first one being 0) c == SCSI channel on hostadapter (first one being 0) t == ID l == LUN (first one being 0)
各個數字之間的關系是什么?
一個主板可能接多個host,比如上面的服務器,在有多個sas芯片的情況下,肯定就有多個host。一個sas芯片又可以分割為多個通道,也就是channel,也叫bus。一個通道下多個target,一個target下多個lun。
如果一個硬盤支持雙通道,那么在scsi層,就是展示為兩個scsi標號。
內核中對scsi層的抽象是怎么做的?
對於device,有個scsi_device的抽象,host成員指向它歸屬的scsi_host,siblings成員嵌入到host的__device成員中。同時,
它的 sdev_gendev 成員的parent指向 對應的scsi_target的dev地址,這個只要熟悉linux的驅動模型就能理解了。
SCSI 子系統處理塊訪問請求
當 SCSI 子系統的請求隊列處理函數被通用塊層調用后,SCSI 中間層會根據塊訪問請求的內容,生成、初始並提交 SCSI 命令 (struct scsi_cmd
) 到 SCSI TARGET 端。
scsi這些是按層級去描述對應通信的設備的,分別為host級,bus級,target級,device級。前面提到的scsi_device就是device層的抽象,對應的是lun,可能是磁盤,也可能是光盤之類的,
如果是磁盤,則還會生成一個scsi_disk的對象,光盤的話,則會產生一個 scsi_cd 的對象來和scsi_device 對應。
在scsi總線掃描的時候,每當探測到一個設備,就會調用scsi_alloc_sdev()函數,然后里面會繼續調用scsi_alloc_queue(),
也就是當內核識別到一個scsi設備之后,需要為該設備設置一個request_queue,這個動作在下面完成,具體怎么識別到scsi_device ,有一堆探測的流程,在此不展開。