SCSI分层
Linux内核中SCSI代码结构分为三层,它们和块设备驱动的关系如下图所示:
iscsi initiator要实现SCSI底层,即负责将scsi命令封装成网络报文发送给target。
Open-iSCSI
Open-iSCSI 是Linux内核支持的标准iSCSI Initiator,它包括:
- 用户态下的iscsid, iscsiadm等工具
- 内核模块iscsi_tcp.ko, libiscsi_tcp.ko, libiscsi.ko, scsi_transport_iscsi.ko
- /etc/iscsi/initiatorname.iscsi和/etc/iscsi/iscsid.conf
iscsid守护进程
iscsid主要负责根据配置在系统启动时发起到target的登录,在 /var/lib/iscsi/send_targets 目录下包含iSCSI portals的配置信息,每个portal对应一个文件,例如192.168.36.212,3260
iscsiadm
用来管理(更新、删除、插入、查询)iSCSI配置数据库文件的命令行工具,能够对iSCSI nodes、sessions、connections和discovery records进行一系列的操作
Open-iSCSI软件架构
Open-iSCSI的整个流程为
- iscsid守护进程读取配置文件,创建本地socket和netlink socket
- 执行Iscsiadm命令,通过本地socket连接iscsid
- iscsid建立和target之间的TCP connection,完成login
- iscsid通过netlink socket通知内核,进入iSCSI内核代码
- iSCSI触发Linux的通用SCSI层以及块设备层,向内核中注册块设备/dev/sdb及其request queue
- 用户访问块设备时,通过request queue的回调函数进入SCSI通用层,最后调用iSCSI注册的回调函数
- iscsi_tcp.ko完成和target之间的TCP通信