Openiscsi的发现过程

网友投稿 606 2022-05-28

这次研究的主要涉及这几个组件:

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的数据收发就是这个模块实现的。

Openiscsi的发现过程

这里要注意一个问题,上图实际上少画了一条线,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

Socket编程 TCP/IP

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Flutter 专题】01 图解 Windows 环境下安装配置环境
下一篇:《Word/Excel/PPT 2019完全自学教程 : 视频讲解版 》 —1.3.3 保存文档
相关文章

 发表评论

暂时没有评论,来抢沙发吧~