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协议之间通信的过程:
三、操作系统如何识别SCSI协议的报文(设别协议的过程)
操作系统接收到SCSI报文后,请求数据(读写)的过程如下:
内核空间:系统调用 --》 虚拟文件系统 --》 文件系统 --》 buffer cache --》 驱动 --》 SCSI接口
用户空间:通过GNU c library 调用内核空间的系统调用
如下图:
所谓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
|
准备好共享磁盘后,继续以下的操作:
1
2
3
4
5
|
2、安装iscsi服务端: yum -y install scsi-target-utils
service tgtd start chkconfig tgtd on netstat -tnlp | grep 3260
|
服务端的配置,可以使用命令方式,也可使用配置文件的方式。
使用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 |
创建完成后,可以使用如上图的命令查看,查看正确后,服务端配置完成。
在客户端:
这里使用的地址是: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 |
登陆成功后,在客户端会发现多了一块磁盘,可以向本地磁盘一样,分区、格式化、挂载使用。
完成挂载使用。
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主机地址可能需要按照您的实际情况修改。 |
配置完成。