Openiscsi的发现过程

举报
皮皮 发表于 2018/07/16 16:23:00 2018/07/16
【摘要】 这次研究的主要涉及这几个组件:iscsiadminiscsiadmin是提供给用户使用的命令行程序,主要功能就是设置iSCSI的一些相关功能属性,比如发现iqn;设置认证模式、用户名、密码;连接SCSI设备等等。但是iscsiadm又不做具体的工作,它只是把这些信息通过IPC调用传递给iscsid这个服务程序,由iscsid来执行真正的操作。而这里的IPC实际上就是一个本地的socket,i...

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

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相对应:

截图.PNG


这个发现的流程的代码写的挺复杂,但是总结出的流程还是比较简单的。主要就是iscsiadm这个程序和tgtd这个程序通过socket交互,取得所有的target。从tgtd侧返回的target格式如下:

“TargetName=iqn.2013-07.sds.ginkgo:ws\0TargetAddress=192.168.8.1:3260,1\0

注意看加红的地方,每个属性都是以字符休止符隔开的

函数调用过程

经过下图的函数调用流程,initiator端就取得到了target端所有的iqn12

FireShot Capture 2 - Linux SCSI子系统分析(二)发_ - https___blog.csdn.net_perfecter_article_details_44067447.png


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。