Openiscsi的发现过程
这次研究的主要涉及这几个组件:
iscsiadmin
iscsiadmin是提供给用户使用的命令行程序,主要功能就是设置iSCSI的一些相关功能属性,比如发现iqn;设置认证模式、用户名、密码;连接SCSI设备等等。但是iscsiadm又不做具体的工作,它只是把这些信息通过IPC调用传递给iscsid这个服务程序,由iscsid来执行真正的操作。而这里的IPC实际上就是一个本地的socket,iscsid监听这个本地socket,iscsiadm通过这个socket和iscsid交互。
iscsid
iscsid可以看做是用户和内核的一个桥梁,它通过mgmt_ipc(本地socket)这个东西和iscsiadm交互,响应用户的请求;利用control_fd(netlink)和内核交互,把用户的指令发送给内核。
scsi_transport_iscsi
这是iscsi传输层,一个内核模块。Linux在设计的时候,非常好的利用了面向对象的设计思想,这个模块就可以看做是一个对scsi传输层的抽象,它仅实现一些传输层通用的流程,具体的实现由它的子类们完成。
iscsi_tcp
基于tcp协议的iSCSI传输模块,是上面讲到的scsi_transport_iscsi的具体实现。传输层需要的基于tcp的数据收发就是这个模块实现的。
这里要注意一个问题,上图实际上少画了一条线,iscsid到tgtd之间应该有一个socket路径。在创建连接、session和进行认证的时候,实际上是iscsid创建了一个socket,和tgtd进行交互。以上操作都正确完成了之后,iscsid会将这个socket的句柄传递到内核,iscsi_tcp正是使用的这个socket。
后续计划
后面主要会研究一下这三个方面:
iscsi的登陆认证流程,基于chap的认证流程。
iscsi磁盘的扫描流程,一个target的设备如何映射到主机上成为一个sd设备。
iscsi磁盘的IO流程,从读写函数开始,一个IO请求是如何变成scsi命令,然后发送到target端的。
发现过程
发现target的过程比较简单,从复杂的代码中总结出主要的流程如下图。这个流程和命令iscsiadm -m discovery -t st -p 192.168.8.1相对应:
这个发现的流程的代码写的挺复杂,但是总结出的流程还是比较简单的。主要就是iscsiadm这个程序和tgtd这个程序通过socket交互,取得所有的target。从tgtd侧返回的target格式如下:
“TargetName=iqn.2013-07.sds.ginkgo:ws\0TargetAddress=192.168.8.1:3260,1\0”
注意看加红的地方,每个属性都是以字符休止符隔开的
函数调用过程
经过下图的函数调用流程,initiator端就取得到了target端所有的iqn12
- 点赞
- 收藏
- 关注作者
评论(0)