SCSI分層
Linux內(nèi)核中SCSI代碼結構分為三層,它們和塊設備驅(qū)動的關系如下圖所示:

SCSI分層
iscsi initiator要實現(xiàn)SCSI底層,即負責將scsi命令封裝成網(wǎng)絡報文發(fā)送給target。
Open-iSCSI
Open-iSCSI 是Linux內(nèi)核支持的標準iSCSI Initiator,它包括:
- 用戶態(tài)下的iscsid, iscsiadm等工具
- 內(nèi)核模塊iscsi_tcp.ko, libiscsi_tcp.ko, libiscsi.ko, scsi_transport_iscsi.ko
- /etc/iscsi/initiatorname.iscsi和/etc/iscsi/iscsid.conf
iscsid守護進程
iscsid主要負責根據(jù)配置在系統(tǒng)啟動時發(fā)起到target的登錄,在 /var/lib/iscsi/send_targets 目錄下包含iSCSI portals的配置信息,每個portal對應一個文件,例如192.168.36.212,3260
iscsiadm
用來管理(更新、刪除、插入、查詢)iSCSI配置數(shù)據(jù)庫文件的命令行工具,能夠?qū)SCSI nodes、sessions、connections和discovery records進行一系列的操作
Open-iSCSI軟件架構

軟件架構
Open-iSCSI的整個流程為
- iscsid守護進程讀取配置文件,創(chuàng)建本地socket和netlink socket
- 執(zhí)行Iscsiadm命令,通過本地socket連接iscsid
- iscsid建立和target之間的TCP connection,完成login
- iscsid通過netlink socket通知內(nèi)核,進入iSCSI內(nèi)核代碼
- iSCSI觸發(fā)Linux的通用SCSI層以及塊設備層,向內(nèi)核中注冊塊設備/dev/sdb及其request queue
- 用戶訪問塊設備時,通過request queue的回調(diào)函數(shù)進入SCSI通用層,最后調(diào)用iSCSI注冊的回調(diào)函數(shù)
- iscsi_tcp.ko完成和target之間的TCP通信