iSCSI原理和实现

数据往往是应用程序(架构)核心,那么如何存储数据就非常重要。

一、常见的存储技术(存储架构)

1、DAS(Direct Attacted Storage 直接附加存储)

顾名思义,直接附加存储就是将存储直接附加在应用服务器中来实现数据的存储。存储设备是通过接口类型于应用程序服务器连接的。

常见的接口类型有:

IDE (并行):数据可能有干扰 理论:133MB/s。早期是叫做ATA

SATA (串行)II: 3Gbps III: 6Gbps

    IDE速度慢,出现了SCSI(Smal System System Interface)。

SCSI接口:

    UltraSCSI-320:320MB/s

    UltraSCSI-640:640MB/s

SAS: 6Gbps

USB,sSATA,1394

现在直连式存储与服务器主机之间的连接通道通常采用SCSI协议连接

2、NAS(Network Attacted Storage 网络附加存储)

一般说来,NAS是文件服务器。像NFS,Samba等。提供文件级别的共享。

3、SAN(Storage Aere Network 存储区域网络)

简单的来说就是借助于网络来传输SCSI协议报文。 操作系统中的内核中有对应的scsi模块。借助于隧道模式将 SCSI 报文传输出去。还需要底层的硬盘接口虚拟为scsi接口。

二、SCSI之间的通信模型

SCSI之间通信是一种C/S架构。

客户端:

叫做Initator(发起者 C)

服务端:

这里称之为Target:(目标 S),每个Target可包含多个LUN(Logical Unit Number 逻辑单元)。真正提供服务的是LUN。

下图是SCSI协议之间通信的过程:

2

1

三、操作系统如何识别SCSI协议的报文(设别协议的过程)

操作系统接收到SCSI报文后,请求数据(读写)的过程如下:

内核空间:系统调用 --》 虚拟文件系统 --》 文件系统 --》 buffer cache --》 驱动 --》 SCSI接口

用户空间:通过GNU c library 调用内核空间的系统调用

如下图:

3

所谓iSCSI是利用tcp/ip协议来传输SCSI报文的一种机制。

四、DIY(Do It Youself) iSCSI

说明:

172.166.10.16 Target端

在服务端:

1
2
3
4
5
### Target端:(172.16.10.16)
1、准备要共享的设备,这里使用本地磁盘上的新分区代替(只需要分区,不需要格式化即可)
fdisk  /dev/sda
partx -d  /dev/sda
partx -a  /dev/sda

10


准备好共享磁盘后,继续以下的操作:

1
2
3
4
5
2、安装iscsi服务端:
yum -y  install  scsi-target-utils
service tgtd start
chkconfig tgtd on
netstat  -tnlp |  grep  3260

11

服务端的配置,可以使用命令方式,也可使用配置文件的方式。

使用tgtadm命令方式配置SCSI服务:

tgtadm命令的介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
tgtadm 是一个模式化的命令
使用格式:tgtadm --lld [driver] -- op  [operation] --mode [mode] [OPTION]...
常见的模式(mode):target logicalunit account
#####################################################
target模式的管理命令:管理target
     new:创建一个新的 target
     show:显示target
     delete:删除target
     update:更新(修改)target
     bind:基于IP地址控制
     unbind:解除绑定
#####################################################
logicalunit模式的管理命令:关联tid和后端磁盘
     new:创建一个新的LUN
     deltete:删除一个已有的LUN
#####################################################
account模式的管理命令:管理account CHAP(挑战式握手应用) 单向认证 
     new
     deltete
     bind
     unbid
#####################################################
target和Initator之间是通过iqn名称来通信的
iqn格式名称:
     iqn.yyyy-mm.reverse-domaim-name:string[.sunstring]
例如:iscsi-iname -p iqn.2014-09.com.magedu.target
 
也可通过命令的生成的方式:iscsi-iname -p iqn.2014-09.com.magedu
#####################################################
示例:
# (1)、添加一个新的 target 且其ID为 [id], 名字为 [name].
--lld [driver] -- op  new --mode target --tid=[ id ] --targetname [name]
 
# (2)、显示所有或某个特定的target:
--lld [driver] -- op  show --mode target [--tid=[ id ]]
 
# (3)、向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用。
## [path]是某“块设备”的路径,此块设备也可以是raid或lvm设备。lun0已经被系统预留。
--lld [driver] -- op  new --mode=logicalunit --tid=[ id ] --lun=[lun] --backing-store [path]
 
# (4)、删除ID为[id]的target:
--lld [driver] -- op  delete --mode target --tid=[ id ]
 
# (5)、删除target [id]中的LUN [lun]:
-lld [driver] -- op  delete --mode=logicalunit --tid=[ id ] --lun=[lun]
 
# (6)、定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的
#  initiator客户端的列表:
--lld [driver] -- op  bind --mode=target --tid=[ id ] --initiator-address=[address]
 
# (7)、解除target [id]的访问控制列表中[address]的访问控制权限:
--lld [driver] -- op  unbind --mode=target --tid=[ id ] --initiator-address=[address]

通过tgtadm命令提供SCSI服务:

1
2
3
4
5
6
7
8
9
步骤如下:
# 创建一个target:
tgtadm --lld iscsi -- op  new --mode target --tid 1 -T iqn.2014-09.com.magedu:test2
# 创建LUN,号码为1:
tgtadm --lld iscsi -- op  new --mode logicalunit --tid 1 --lun 1 -b  /dev/sda5
 
# 开放给172.16.0.0/16网络中的主机访问:
tgtadm --lld iscsi -- op  bind --mode target --tid 1 -I 172.16.0.0 /16
其中的-I相当于--initiator-address


13

创建完成后,可以使用如上图的命令查看,查看正确后,服务端配置完成。

在客户端:

这里使用的地址是:172.16.10.22

1
2
3
4
5
6
7
8
9
10
客户端配置(Initiator):
yum  install  iscsi-initiator-utils  # 客户端管理工具
 
# 以下配置是非必需的,默认情况下,会有一个默认的iqn名称
echo  "InitiatorName=`iscsi-iname -p iqn.2014-09.com.magedu`"  >  \
   /etc/iscsi/initiatorname .iscsi
echo  "InitiatorAlias=initiator1"  >>  /etc/iscsi/initiatorname .iscsi
 
service iscsi start
chkconfig iscsi on

客户端Initator使用iscsiadm命令来发现,登陆设备。

iscsiadm命令的介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
iscsiadm是个模式化的工具,其模式可通过-m或--mode选项指定,常见的模式有discovery、
     node、fw、session、host、iface几个。
如果没有额外指定其它选项,则discovery和node会显示其相关的所有记录;
session用于显示所有的活动会话和连接
fw显示所有的启动固件值
host显示所有的iSCSI主机
iface显示 /var/lib/iscsi/ifaces 目录中的所有ifaces设定。
 
# 用法如下:
iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] \
       [ -I iface -t  type  -p ip:port [ -l ] ] 
iscsiadm -m node [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] \
  [ -U all,manual,automatic ] [ [ -T  tar -getname -p ip:port -I iface ] \
  [ -l | -u | -R | -s] ] [ [ -o operation ] 
 
# 参数说明:
-d, --debug=debug_level   显示debug信息,级别为0-8;
-l, --login
-t, -- type = type   这里可以使用的类型为sendtargets(可简写为st)、slp、fw和 isns,
     此选项仅用于discovery模式,且目前仅支持st、fw和isns;其中st表示允许每个iSCSI target
     发送一个可用target列表给initiator;
-p, --portal=ip[:port]  指定target服务的IP和端口;
-m, --mode  op   可用的mode有discovery, node, fw, host iface 和 session
-T, --targetname=targetname  用于指定target的名字
-u, -- logout 
-o, -- op =OPEARTION:指定针对discoverydb数据库的操作,其仅能为new、delete、update、show
    和nonpersistent其中之一;
-I, --interface=[iface]:指定执行操作的iSCSI接口,这些接口定义在 /var/lib/iscsi/ifaces 中;

通过iscsiadm命令发现target命令:

1
2
iscsiadm -m discovery -t sendtargets -p 172.16.10.16
iscsiadm -m node -T iqn.2014-09.com.magedu:test2 -p 172.16.10.16 -l

14

登陆成功后,在客户端会发现多了一块磁盘,可以向本地磁盘一样,分区、格式化、挂载使用。

15

16 

完成挂载使用。

Target端使用配置文件配置:

一般情况下,在服务端是使用配置文件。使用命令式为了更好的了解Target端的工作模式。

1
2
3
4
5
6
# 配置文件/etc/tgt/targets.conf 
 
<target iqn.2014-09.com.magedu:test2>
    backing-store  /dev/sda5
   initiator-address 172.16.0.0 /16
< /target >

如果客户端不想使用的话,可以登出

1
2
3
4
iscsiadm -m node -T iqn.2014-09.com.magedu:test2 -p 172.16.10.16  -u
iscsiadm -m node -T iqn.2014-09.com.magedu:test2 -p 172.16.10.16  -o delete
# 必要的时候,使用
rm  -rf -rf  /var/lib/iscsi/send_targets/ *

补充: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
创建服务端谁所需要的帐号,并实现单方向的认证:
 
1、在target端创建帐号christina,并为其授予访问某tid的权限:
# tgtadm --lld iscsi --op new --mode account --user mageedu --password 123456
 
接下来还要将用户与某target进行绑定:
# tgtadm --lld iscsi --op bind --mode account --tid 1 --user mageedu
# tgtadm --lld iscsi --op show --mode account
 
2、编辑initiator端主配置文件,配置客户端登录target时使用此帐号和密码:
# vim /etc/iscsi/iscsid.conf
 
取消如下项的注释:
# node.session.auth.authmethod = CHAP
# node.session.auth.username = username
# node.session.auth.password = password
 
而后,将后两项的用户名密码设置为target端设置的用户名和密码:
node.session.auth.username = mageedu
node.session.auth.password = 123456
 
哪果此前尚未登录过此target,接下来直接发现并登入即可。否则,则需要按照下面的第三步实
   现认证的启用。
 
3、如果initiator端已经登录过此target,此时还需要先注销登录后重启iscsid服务,并在删除此
    前生成的database后重新发现target,并重新登入,过程如下:
 
# iscsiadm -m session -r sid -u
 
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 172.16.10.16:3260 -u
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 172.16.10.16:3260 -o delete
# rm -rf -rf /var/lib/iscsi/send_targets/172.16.10.16:3260
# service iscsid restart
 
# iscsiadm -m discovery -t sendtargets -p 192.168.0.11
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -l
 
说明:其中的target名字和target主机地址可能需要按照您的实际情况修改。

 

配置完成。










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1556487,如需转载请自行联系原作者
iSCSI协议及实现 iSCSI协议简介 涉及到的SCSI的概念 启动设备目标设备 启动设备(initiator):发起I/O请求的设备 目标设备(target):响应请求执行实际I/O操作的设备 在启动设备目标设备建立连接后,目标设备在操作中作为主设备控制整个工作过程 一般情况下主机适配器HBA作为启动设备,磁盘/磁带作为目标设备 涉及到的SCSI的概念 CDB:命令描述块。SCSI的命令及参数是填充在一定长度的数据块内传输的 典型的SCSI系统 SCSI的缺点 SCSI是点对点的、直接相连的计算机到存储器的设备接口,不适用于主机到存储器的存储网络通讯 SCSI总线的长度被限制在25米以内,对于Ultra SCSI长度限制为12米,不适于构造各种网络拓扑结构 SCSI总线上设备数限制为15,不适用于多服务器对多存储设备的网络结构 iSCSI的概念 iSCSI是关于SCSI的命令 、数据状态到TCP/IP 网络的映射的 协议 对TCP层的改造增加较 低功能层(对TCP层透明) 是为了适应大批量存储数 据传输的需要 iSCSI协议现状 IETF正在制定iSCSI协议标准,最新草案是draft-ietf-ips-iSCSI-06 IETF:http://www.ietf.org/ IPS工作组:http://www.ece.cmu.edu/~ips/ iSCSI产品 Cisco SN 5420 Storage Router IBM TotalStorage IP Storage 200i 用Cisco SN 5420构造的存储系统 iSCSI协议结构 1.概述 2.协议数据单元格式 3.用于iSCSI协议的SCSI模式参数 4.登录相 5.登录相之外的工作参数协商 6.错误处理恢复 iSCSI的命名编址 iSCSI使用类似URL的iSCSI名字来唯一鉴别启动设备目标设备。 地址会随着启动设备目标设备的移动而改变,但名字始终是不变的 iSCSI的命名编址 一个iSCSI名字由三部分组成:类型定义符、名字认证机构、由该认证机构分配的名字 iscsi.com.acme.sn.8675309 iSCSI地址格式 [:]/ iSCSI的发现机制 启动设备可以通过下列方法发现目标设备: 在启动设备上设置目标设备的地址 在启动设备上设置默认目标设备地址,启动设备可通过“SendTargets”命令从默认目标设备上获取iSCSI名字列表 发出服务定位协议(SLP)广播请求,等待目标设备回应 查询存储设备名字服务器获取可访问的目标设备列表 iSCSI会话(session) 启动设备目标设备之间的TCP连接构成一次会话 一个会话包含一个或多个TCP连接 会话由会话号区分,会话号包括启动设备部分目标设备部分 会话中包含的TCP连接可以增加也可以删除,这些连接由连接号(CID)区分 命令编号 从启动设备到目标设备SCSI层的命令由iSCSI编号,该号码由iSCSI协议数据单元中的命令序列号(CmdSN)携带 目标设备的iSCSI层必须按命令序列号的顺序把命令传递给SCSI层 目标设备的SCSI层接收到命令后该命令序列号即失效。命令序列号也能被用来进行命令的流量控制 iSCSI登录协商 iSCSI登录是用来在启动设备目标设备之间建立TCP连接的机制 登录的作用包括鉴别通讯双方、协商会话参数、打开相关安全协议并且给属于该会话的连接作标记 登录过程完成后,iSCSI会话进入全功能相(full feature phase),这时启动设备就能通过iSCSI协议访问目标设备里的各逻辑单元了 响应/状态编号 从目标设备到启动设备的响应由iSCSI编号,在iSCSI协议数据单元中用状态序列号(StatSN)表示 启动设备提供期望状态序列号ExpStatSN来确认状态 如果状态序列号期望状态序列号不同则意味着连接出现了错误 协议数据单元格式 iSCSI启动设备命令基本首部(BHS) iSCSI协议的实现 iSCSI代码来源 iscsi-Apr6.tgz: Intel (http://sourceforge.net) kernel_emulator_10.tgz: IOL(InterOperability Lab) of UNH(University of New Hampshire) (http://www.iol.unh.edu) Iscsi-0.1.tar.gz: iSCSI research team of UML(University of Massachusetts Lowell) (http://www.cs.uml.edu/~mbrown/iscsi) 程序的运行 启动设备端: insmod scsi_target.o insmod iscsi_target.o 客户端: insmod iscsi.o insmod iscsi_client.o fdisk /dev/sda mke2fs /dev/sda1 mount –t ext2 /dev/sda1 /mnt/iscsi raiddev /dev/md0(多个目标设备) 程序的结构(目标设备) 1.STML(SCSI Target mid-level) 处理SCSI命令 2.FETD(front-end Target driver) 将STML发来的命令数据封装成底层通讯协议数据包的格式发送到网络上或者将从网络接受到的数据包解包传递给STML 将STMLFETD分开的原因 增强程序的可重用性 STML是通用的 FETD是底层采用的通讯协议(TCP/IP、Fibre channel)相关的 STML提供给FETD的API register_target_template() deregister_target_template() register_target_front_end() deregister_target_front_end() rx_cmnd() scsi_rx_data() scsi_target_done() scsi_release() rx_task_mgmt_fn() FETD提供给STML的API detect() release() xmit_response() rdy_to_xfer() task_mgmt_fn_done() report_aen() 重要的数据结构 struct Target_Emulator struct Scsi_Target_Template struct Scsi_Target_Device struct Target_Scsi_Cmnd struct scsi_request struct Target_Scsi_Message struct scsi_cmnd struct sg_io_hdr_t STML的初始化 初始化一个struct Target_Emulator类型的全局变量 创建线程scsi_target_process_thread处理大多数的STML的工作 进入等待 FETD的初始化 向STML注册,STML将其加入设备队列 创建线程iscsi_server_thread监听端口4002 进入等待 FETD向STML的注册过程 FETD向STML注销过程 FETD对请求的响应 当在4002端口监听的线程接收请求后 创建线程iscsi_rx_thread接收SCSI命令 创建线程iscsi_tx_thread传送应答状态 FETD创建一个Target_Scsi_Cmnd类型的数据接收SCSI命令,将其加入命令队列,唤醒STML的线程STT处理收到的SCSI命令 STML对FETD的响应 调用handle_cmd处理命令队列 调用hand_to_front_end返回处理结果 处理结果加入FETD的发送队列xmit_queue等待发送 在结果发送完成后调用scsi_target_dones释放资源 iSCSI 的应用 采用iSCSI的设备的特点 采用了iSCSI协议的硬件设备是NASSAN的中间产品,它能简单连接到企业内部网,做到即插即用。而每一个远程用户端对该存储设备的访问效果接近于在本地直接访问SCSI盘。 为无法承担光纤通道SAN环境基础结构高成本的中间市场客户提供利用SAN所带来的好处 iSCSI & NAS 在NAS上部署iSCSI协议很简单,因为不需要任何硬件上的改动,只是驱动软件的安装 iSCSI & SAN The end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值