iSCSI是由IBM发明的基于以太网的存储协议,该协议与SUN的NFS协议都是为了解决存储资源共享问题的解决方案。二者意图一致,只不过二者是不一样的实现方式,前者在客户机上呈现的是一个块设备,然后者则是一个目录树。关于二者的区别,能够参考本号以前的文章,本位再也不赘述。node
本文今天主要介绍一下iSCSI的总体架构,以及在Linux平台上启动器端(能够理解为客户端,后续介绍该概念)如何实现对存储设备(系统)的配置和访问。安全
归纳的说,iSCSI是一种存储设备远程映射技术,它能够将一个远程服务器上的存储设备映射到本地,并呈现为一个块设备(大白话就是磁盘)。从普通用户的角度,映射过来的磁盘与本地安装的磁盘毫无差别。bash
这种映射方式基因而基于SCSI协议的,SCSI协议是计算机与外围设备(例如硬盘、光盘等)通讯的协议。而iSCSI则是经过TCP协议对SCSI进行封装的一种协议,也就是经过以太网传输SCSI协议的内容。服务器
从上图能够看出来,iSCSI其实也是一种典型的客户端服务器架构(CS架构),其中访问存储系统的计算机成为客户端,其中负责链接的软件成为启动器。而提供存储服务的计算机成为服务端,其中的软件成为目标器。网络
因为iSCSI是基于TCP协议的,所以启动器和目标器能够是纯软件实现,也能够基于硬件实现。若是是硬件实现,硬件实现主要是对SCSI命令封装和解析等,这样能够释放CPU资源。目前在Linux下面,启动器和目标器都有纯软件的实现,好比启动器的实现Open-iSCSI,目标器的实现LIO、SCST和TGT等。session
本节介绍关于iSCSI的一些基本概念,理解这些概念便于咱们理解iSCSI的原理及后续阅读iSCSI的开源代码。架构
Network Portal: 网络端口。网络实体的一个组成部分,它有一个 TCP/IP 地址。 网络端口在 initiator 用 IP 地址标识, 在 target 用 IP 地址+侦听的 TCP 端口标识。工具
Session: 链接 initiator 和 target 的一组 TCP 链接构成一个 session(能够简单理解为 I_T nexus)。能够向 session 添加 TCP 链接,也能够把 TCP 链接从 session 删除。 也就是说一个session中是能够有多个链接的。经过一个 session 的全部链接,initiator 只看到同一个 target。加密
**Connection **: 一个 TCP 链接。Initiator 和 target 之间使用一或者多个 TCP 链接通讯。spa
CID(Connection ID): 一个 session 里的每一个 connection 用 CID 进行标识,该标识在 session 范围内是惟一。CID 由 initiator 产生,在 login 请求和使用 logout 关闭 链接时传递给 target。
SSID(Session ID):一个 iSCSI Initiator 与 iSCSI Target 之间的会话(Session)由会话ID(SSID)定义,该会话ID是一个由发起方部分(ISID)和目标部分(Target Portal Group Tag)组成的元组。 ISID 在会话创建时由发起者明确指定。 Target Portal Group Tag 由发起者在链接创建时选择的 TCP端口来隐式指定。 当给定 TargetName 时,TargetPortalGroupTag 也必须由目标在链接创建期间做为确认返回。
Portal Groups: 网络端口组。iSCSI session 支持多链接,一些实现能把经过多个端口创建的多个链接捆绑到一个 session。 一个 iSCSI 网络实体的多个网络端口被定义为一个网络端口组,把该组和一个 session 联系起来,该 session 就能够捆绑经过该组内多个端口创建的多个链接,再使它们一块儿协同工做以达到捆绑的目的。每个该组的 session 并不须要包括该组的全部网络端口。一个 iSCSI 节点可能有一或者多个网络端口组,可是每个 iSCSI 使用的网络端口只能属于 iSCSI 节点的一个组。
Target Portal Group Tag: 网络端口组标识。使用 16 比特的数标识一个网络端口组。在 一个 iSCSI 节点里,全部具备一样组标志的端口构成一个网络端口组。
iSCSI Task: 一个 iSCSI 任务是指一个须要响应的 iSCSI 请求。
I_T nexus: I_T nexus 是指一个 SCSI initiator 的端口和一个 SCSI target 端口之间 的关系。 对于 iSCSI, 这个关系对应一个 session, 它指 session 的 initiator 端和 iSCSI target 网络端口组之间的关系。I_T nexus 的标识是一对端口名称(iSCSI initiator 名称+i+ISID,iSCSI target 名称+t+网络端口组标识)。 PDU (Protocol Data Unit): initiator 和 target 之间通讯时把信息分割为消息。这些 消息称为 iSCSI PDU。 SSID (Session ID): iSCSI initiator 和 iSCSI target 之间的 session 用 SSID 进行标识, 该标识由 initiator 部分的 ISID 和 target 部分的 TPGT 构成。
ISID(The initiator part of the Session Identifier):发起方会话标识,由 initiator 在 session 创建的时候明确给出,
TSIH (Target Session Identifying Handle): Target 分配给与特定名称 initiator 创建的 session 的标识。 可是 0 值被保留着用于 initiator 告知 target 这是一个新 session。 在为一个 session 添加一个 connect 时,TSIH 已经隐含指明。
Linux的启动器包含内核态的启动器、用户态的守护进程和命令行工具3部份内容,总体架构仍是比较复杂的。可是若是不想理解其原理,只是通常使用的话,仍是比较简单方便的。下面咱们介绍一下其操做步骤(这里假设已经有一个存储设备),关于更详细的原理咱们后续再进行详细的介绍。
启动iscsi守护进程
在启动器端是有一个守护进程的,首先要保证该守护进程是处于正常运行状态。若是没有运行的状况下须要启动该服务。
#service iscsi start
复制代码
默认状况下,系统启动后此进程会自动运行的。若是没有自动运行能够经过下面命令进行控制和查看。
# chkconfig iscsi on
# chkconfig iscsi --list (查看ISCSI启动状态)
复制代码
发现目标
默认状况下,iscsi发起方和目标方之间经过端口3260链接。假设已知iscsi的目标方IP是192.168.1.1,运行下列命令:
# iscsiadm -m discovery -t sendtargets -p 192.168.1.1:3260
复制代码
若是一切正常,过此时找到并拥有了一个目标(target):
192.168.1.1:3260,1 iqn.1997-05.com.test:itworld123
复制代码
登入节点
以上面被发现的目标为例:
# iscsiadm -m node –T iqn.1997-05.com.test:itworld123 -p 192.168.1.1:3260 -l
复制代码
其中iqn.1997-05.com.test:itworld123是目标名。
查看磁盘信息
正常来讲,若是登陆成功后在客户端操做系统中就能够看到新增的硬盘了。能够经过下面命令查看。
# fdisk –l
复制代码
格式化设备
iSCSI设备的使用与普通硬盘没有任何差别,好比咱们想把该设备格式化为ext4文件系统,运行:
# mkfs.ext4 /dev/sdb
复制代码
具体使用咱们这里就再也不解释,使用方法与本地磁盘彻底一致。
登出节点
有些状况下咱们可能须要登出节点,此时将端口启动器和目标器之间的链接,磁盘也会消失。登出以前须要先中止对磁盘的使用。
# umount /mnt/iscsi_itworld123
复制代码
执行以下命令能够登出:
# iscsiadm -m node –T iqn.1997-05.com.test:raid -p 192.168.1.1:3260 –u
复制代码
登入需验证码的节点
为了保证存储设备的安全,能够对存储设备设置权限认证,这样只有合法用户才能访问存储设备。下面是具备认证的存储的登陆方法。
1)开启认证
iscsiadm -m node -T [装置] -o update --name node.session.auth.authmethod --value=CHAP *.使用-o同--op
复制代码
2)添加用户
iscsiadm -m node -T [装置] --op update --name node.session.auth.username --value=[用户名]
复制代码
3)添加密码
iscsiadm –m node –T [装置] –op update –name node.session.auth.password –value=[密码]
复制代码
好了,今天先到这。咱们今天主要介绍iSCSI的基本架构以及启动器端的使用。这个主要是让你们有个感性的认识,为后面介绍启动器的实现打下基础。后续咱们将介绍启动器用户态管理程序的架构和实现,以及内核态启动器的实现。