1、认识iSCSI

       iSCSI(Internet Small Computer System Interface,Internet 小型计算机系统接口)是一种由IBM公司研究开发的IP SAN技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,基于 TCP/IP的协议连接iSCSI服务端(Target)和客户端(Initiator),使得封装后的SCSI数据包可以在通用互联网传输,最终实现iSCSI服务端映射为一个存储空间(磁盘)提供给已连接认证后的客户端。

1-1、SCSI

ASIC 硬件架构 硬件iscsi_IP

       SCSI(Small Computer System Interface)是一种I/O技术,规范了一种并行的I/O总线和相关的协议,SCSI的数据传输是以块的方式进行的。

       如上图,SCSI总线通过SCSI控制器来和硬盘之类的设备进行通信, SCSI控制器称为Target,访问的客户端应用称为Initiator。窄SCSI总线最多允许8个、宽SCSI总线最多允许16个不同的SCSI设备和它进行连接,每个SCSI设备都必须有自己唯一的SCSI ID(设备的地址)

       LUN(Logical Unit Number,逻辑单元号)是为了使用和描述更多设备及对象而引进的一个方法,每个SCSI ID上最多有32个LUN,一个LUN对应一个逻辑设备。

       广泛应用于小型机上,正在成为PC 服务器的标准接口,实现高速数据传输(可达320MB/s),常见的SCSI设备:硬盘、磁盘阵列、打印机、光盘刻录机等。

1-2、iSCSI实现

ASIC 硬件架构 硬件iscsi_客户端_02

1、iSCSI Initiator

         iSCSI 启动器,从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(iSCSI 目标)。

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_03

        如上图,iSCSI 启动器有三种实现方式:可以完全基于硬件实现,比如 iSCSI HBA 卡;硬件TOE卡与软件结合的方式;完全基于软件实现,而软件 iSCSI 启动器适用于大部分主流操作系统平台,下面就是用软件方式来配置。

2、iSCSI Target

       即 iSCSI 目标,它是 iSCSI 网络的服务器组件,通常是一个存储设备,用于包含所需的数据并回应来自 iSCSI 启动器的请求。

3、工作过程

ASIC 硬件架构 硬件iscsi_IP_04

ASIC 硬件架构 硬件iscsi_文件系统_05

       Initiator发出请求后,会在本地的操作系统会生成了相应的SCSI命令和数据I/O请求,然后这些命令和请求被封装加密成IP信息包,通过以太网(TCP/IP)传输到Targer。

       当Targer接收到信息包时,将进行解密和解析,将SCSI命令和I/O请求分开。SCSI命令被发送到SCSI控制器,再传送到SCSI存储设备。

       设备执行SCSI命令后的响应,经过Target封装成iSCSI响应PDU,再通过已连接的TCP/IP网络传送给Initiator。

        Initiator会从iSCSI响应PDU里解析出SCSI响应并传送给操作系统,操作系统再响应给应用程序。

1-3、iSCSI与FC SAN

ASIC 硬件架构 硬件iscsi_文件系统_06

        FC(FiberChannel,光纤通道)是利用光纤信道结合光纤通道交换机实现高速的数据存储网络。FC性能很好,但价格却贵得惊人,管理起来也非常困难。

        所以iSCSI利用现有的以太网络,用户只需要少量的投入,就可以方便、快捷地对信息和数据进行交互式传输和管理。当然iSCSI与FC相比也存在明显的不足,如速度性能、安全可靠性。

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_07

1-4、SAN与NAS / iSCSI与NFS

ASIC 硬件架构 硬件iscsi_客户端_08

        通过前面文章知道,SAN与NAS是完全不同架构的存储方案,前者支持Block协议,后者则支持File协议;SAN结构中,文件管理系统(FS)还是分别在每一个应用服务器上,会产生I/O操作,而NAS则是每个应用服务器通过网络共享协议(如:NFS、CIFS)使用同一个文件管理系统,所以CPU密集型应用可以选用NAS。SAN是将目光集中在磁盘、磁带以及联接它们的可靠的基础结构,而NAS是将目光集中在应用、用户和文件以及它们共享的数据上,显得更"高级"。将来从桌面系统到数据集中管理到存储设备的全面解决方案将是NAS加SAN。

        以上区别具体到iSCSI和NFS:iSCSI可优化空间更大,性能稍好,但技术难度更高;而NFS在系统层面的支持更多,像一些备份、恢复等操作较简单。

2、相关准备配置

2-1、具体使用资源

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_09

1、各主机系统:RHEL 5.8 64bit

2、Target:

Soft:scsi-target-utils

IP:192.168.18.240

LUN1:/dev/sda5 50G(以分区代替)

LUN2:/dev/sda6 20G

2、三台节点主机node1,node2,node3:

Soft:iscsi-initiator-utils

Node1: IP:192.168.18.241 host name:node1.tjiyu,com;

Node2: IP:192.168.18.242 host name:node2.tjiyu.com;

Node3: IP:192.168.18.243 host name:node3.tjiyu.com;

2-2、配置前所需要的准备

       各节点Initiator和Target端需要做以下准备:

1、配置IP、关闭防火墙/SELINUX;

2、配置各节点名称;

3、时间同步;

       当然我们这里可以用Target端主机作为跳板机,因为很多相同的命令都要在各节点上执行,可以另外加一台跳板机,可以SSH连接各节点,这样就可以在跳板机上给各节点分发命令了。

       首先在Target上配置各节点的hostname,方便操作:

ASIC 硬件架构 硬件iscsi_IP_10

       然后生成Target端的SSH KEY,再发给到各主机,如下:




1. [root@localhost ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''  
2.   
3. [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node3.tjiyu.com  
4.   
5. [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node3.tjiyu.com  
6.   
7. [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node3.tjiyu.com


       接着为命令前面常规部分设置为别名,方便操作,最后尝试给各节点同步时间,如下:





1. [root@localhost ~]# alias ssh_node='for I in {1..3}; do ssh node$I'  
2.   
3. [root@localhost ~]# ssh_node 'ntpdate cn.ntp.org.cn'; done


ASIC 硬件架构 硬件iscsi_文件系统_11

ASIC 硬件架构 硬件iscsi_IP_12

3、下载安装

       配置好yum源,直接在target端安装scsi-target-utils,这个只是iSCSI软件的管理工具(类似ipvsadm),具体的数据处理模块已整合在内核中,如下:





1. [root@localhost ~]# yum install scsi-target-utils


ASIC 硬件架构 硬件iscsi_客户端_13

       各节点上分别执行安装iscsi-initiator-utils,当然也可以在Target上通过SSH执行,但那是串行的,不如分别在各节点上分别执行快,如下:





1. [root@node1 ~]# yum install iscsi-initiator-utils


ASIC 硬件架构 硬件iscsi_文件系统_14

4、认识配置工具

4-1、target端配置工具(tatadm)

ASIC 硬件架构 硬件iscsi_文件系统_15

       Target端安装scsi-target-util后,提供了相应的管理配置工具tgtadm,可以用target、LUN、用户都进管理,不过因为iSCSI模块工作在内核,tgtadm的配置只在内存中,下次开机重启不会生效,所以可以用过配置文件/etc/tgt/targets.conf来配置,启动时另一个工具tgt-adm会读取该文件。

       tatadm使用语法如下:



1. tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...  
2.   
3. (1)、添加一个新的 target 且其ID为 [id], 名字为 [name].  
4.   
5.     --lld [driver] --op new --mode target --tid=[id] --targetname [name]  
6.   
7. (2)、显示所有或某个特定的target:  
8.   
9.     --lld [driver] --op show --mode target [--tid=[id]]  
10.   
11. (3)、向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用。[path]是某"块设备"的路径,此块设备也可以是raid或lvm设备。lun0已经被系统预留。  
12.   
13.     --lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path]  
14.   
15. (4)、删除ID为[id]的target:  
16.   
17.     --lld [driver] --op delete --mode target --tid=[id]  
18.   
19. (5)、删除target [id]中的LUN [lun]:  
20.   
21.     -lld [driver] --op delete --mode=logicalunit --tid=[id] --lun=[lun]  
22.   
23. (6)、定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的initiator客户端的列表:  
24.   
25.     --lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address]  
26.   
27. (7)、解除target [id]的访问控制列表中[address]的访问控制权限:  
28.   
29.     --lld [driver] --op unbind --mode=target --tid=[id] --initiator-address=[address]


4-2、Initiator端配置工具(iscsiadm)

ASIC 硬件架构 硬件iscsi_文件系统_16

iscsiadm使用语法如下:



1. iscsiadm  
2.   
3. -m, 同 --mode, 其选项有 discovery, node, fw(启动值), host, iface(iSCSI 接口)和 session。  
4.   
5. -I,同 --interface, 表示接口。  
6.   
7. -o, 同 --op, 可实现对数据库的操作,其选项有 new, delete, update 和 show。  
8.   
9. -n, 同 --name, 指定其数据记录里的名字。  
10.   
11. -t, 同 --type, 其选项有 sendtargets(st), fw 和 isns, 仅在 -m 模式为 discovery 时有效。  
12.   
13. -p, 同 --portal, 指定其目标主机的 IP 地址和端口,默认端口为 3260。  
14.   
15. -L, 同 --loginall,其选项有 all,manual 和 automatic,指定其登录会话时的类型。  
16.   
17. -T, 同 --targetname,表示其目标名字。  
18.   
19. -v, 同 --value,通常在 --op=update 时指定其值。


5、配置target端

5-1、创建分区当作LUN

       按上面的资源分配,在target端创建两个分区/dev/sda5和/dev/sda6,分别当作LUN,注意这时并不需要格式化文件系统,因为文件系统不在target端,过程如下:



1. [root@localhost ~]# fdisk /dev/sda  
2.   
3. [root@localhost ~]# partprobe /dev/sda  
4.   
5. [root@localhost ~]# fdisk -l


ASIC 硬件架构 硬件iscsi_文件系统_17

ASIC 硬件架构 硬件iscsi_IP_18

5-2、启动tgtd服务

       启动target端的tgtd服务,并配置开机启动,查看网络连接情况,可以看到tgtd监听了tcp的3260端口,如下:


1. [root@localhost ~]# chkconfig tgtd on  
2.   
3. [root@localhost ~]# chkconfig tgtd --list  
4.   
5. [root@localhost ~]# service tgtd start  
6.   
7. [root@localhost ~]# netstat -tunlp |grep tgtd


ASIC 硬件架构 硬件iscsi_客户端_19

5-3、创建target及LUN,并绑定网络

       先创建一个target,ID为1,名称为iqn.2016-10.com.tjiyu:mystore.disk1(全局唯一标识名);然后给该target绑定网络192.168.18.0/24,也就是对这个网络内的主机可以发现该target;接着给该target创建两个LUN,使用上面创建的两个分区,注意LUN的ID从1开始分配,因为0已经被target控制器占用了,如下:

1.  [root@localhost ~]# tgtadm --lld iscsi -o new -m target -t 1 -T iqn.2016-10.com.tjiyu:mystore.disk1  
2.   
3. [root@localhost ~]# tgtadm -L iscsi -o bind -m target -t 1 -I 192.168.18.0/24  
4.   
5. [root@localhost ~]# tgtadm -L iscsi -o new -m logicalunit -t 1 -l 1 -b /dev/sda5  
6.   
7. [root@localhost ~]# tgtadm -L iscsi -o new -m logicalunit -t 1 -l 2 -b /dev/sda6

ASIC 硬件架构 硬件iscsi_文件系统_20

       查看下配置的信息,LUN的0已经被target控制器占用了,如下:


1. [root@localhost ~]# tgtadm -L iscsi -o show -m target


ASIC 硬件架构 硬件iscsi_客户端_21

5-4、配置访问用户

       iSCSI可以配置基于IP或基于用户(CHAP)的认证方式,基于IP像上面绑定开放网络就可以了;基于用户除了绑定网络,还需要配置访问用户(如果使用基于用户的认证,必须首先开放基于IP的认证),CHAP是双向的认证机制,我们这里只配置单向的用户认证。

       先创建帐号tjiyu,并为其授予访问上面ID为1的target的权限(绑定),如下:



1. [root@localhost ~]# tgtadm --lld iscsi --op new --mode account --user tjiyu --password 123456  
2.   
3. [root@localhost ~]# tgtadm --lld iscsi --op bind --mode account --tid 1 --user tjiyu  
4.   
5. [root@localhost ~]# tgtadm --lld iscsi --op show --mode account


ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_22

6、配置各initiator节点

6-1、配置initiator名称

       分别在各节点配置initiator名称,名称也是iqn格式的(可以用iscsi-name生成),直接配置在文件/etc/iscsi/initiatorname.iscsi中就好,如下:



1. [root@node1 ~]# vim /etc/iscsi/initiatorname.iscsi  
2.   
3. [root@node1 ~]# cat /etc/iscsi/initiatorname.iscsi  
4.   
5. InitiatorName=iqn.2016-10.com.tjiyu:node1_4rs3r3  
6.   
7. InitiatorAlias=node1


ASIC 硬件架构 硬件iscsi_客户端_23

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_24

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_25

6-2、配置target访问用户

       因为上面在target端创建并绑定了用户tjiyu,所以各Initiator节点需要先开放CHAP认证,并配置该用户信息,initiator配置文件为/etc/iscsi/iscsid.conf,在文件中修改这三项即可,注意,看清楚是哪三项,因为有几个配置相似,过程如下:


1. [root@node1 ~]# vim /etc/iscsi/iscsid.conf


ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_26

6-3、启动各节点iscsi服务

       各节点执行的命令一样,可以在跳板机上执行,先配置开机启动,然后启动iscsi服务,注意,上面查看安装信息看到还有一个iscsid服务,它会随着iscsi服务一起启动的,如下:



1. [root@localhost ~]# ssh_node 'chkconfig iscsi on'; done  
2.   
3. [root@localhost ~]# ssh_node 'service iscsi start'; done


ASIC 硬件架构 硬件iscsi_文件系统_27

6-4、各节点发现target,并登录

       各节点要使用target的LUN必须先发现,再登录后才能用,发现操作指定target的IP地址,登录需要指定发现的target名称和IP/端口;注意,如果登录不成功,可能是因为上面的配置用户不对,修改正确后需要重启iscsi服务,重新发现target,不然还是登录不了,过程如下,



1. [root@localhost ~]# ssh_node 'iscsiadm -m discovery -t st -p 192.168.18.240'; done  
2.   
3. [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -l'; done


ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_28

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_29

       发现登录成功后,相关信息保存在/var/lib/iscsi/send_targets/目录下,下次启动会自动登录的;

ASIC 硬件架构 硬件iscsi_IP_30

       查看会话相关信息:


1. Initiator:[root@node1 ~]# iscsiadm -m session -s  
2.   
3. Target:[root@localhost ~]# tgtadm --lld iscsi --op show --mode target


7、测试

    Target的两个LUN在initiator端识别为两个磁盘设备,可以在上面进行分区、格式化文件系统等操作,就是本地的磁盘设备一样。不过它们在各节点上的设备名称可能不一样,这里因为开始都是一个硬盘,所有都一样。

7-1、创建分区,并格式化

       上面登录成功后,查看各节点的存储空间,发现各节点都多了两个磁盘设备,这两个磁盘设备就是我们上面创建target分区模拟的LUN,一个50G,另一个20G,如下:



1. [root@localhost ~]# ssh_node 'fdisk -l'; done


ASIC 硬件架构 硬件iscsi_IP_31

       然后在node1上操作,在50G的/dev/sdb上创建一个10G的分区,并格式化为ext3文件系统,如下:



1. [root@node1 ~]# fdisk /dev/sdb  
2.   
3. [root@node1 ~]# partprobe /dev/sdb  
4.   
5. [root@node1 ~]# fdisk –l  
6.   
7. [root@node1 ~]# mkfs.ext3 /dev/sdb1


ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_32

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_33

7-2、各节点挂载测试

       上面在node1上分区/dev/sdb1后,在另外两个节点上可以查看到分区及创建的文件系统,不过却挂载不上去,需要partprobe /dev/sdb内核识别后才能挂载,在node3上挂载如下:



1. [root@node3 ~]# partprobe /dev/sdb  
2.   
3. [root@node3 ~]# mount /dev/sdb1 /mnt  
4.   
5. [root@node3 ~]# ls /mnt



ASIC 硬件架构 硬件iscsi_客户端_34

       然后,在node1上复制/etc/fstab进去,然后在node2上也挂载,可以发现复制进去的文件,但在已经挂载的node3上却长时间看不到复制进去的文件,重新挂载后才能看到,如下:

ASIC 硬件架构 硬件iscsi_客户端_35

       这说明多个节点同时挂载后,一个节点的操作和另外节点不是实时同步的,是在内存中有缓存的,所以这样用同时操作一个文件很可能会发生成崩溃,待后面解决

8、删除操作及target端文件配置

8-1、删除各节点登录信息

       先使各节点登出,然后再删除发现的的信息,最后把残留的目录也删除,过程如下:

1. [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -u'; done  
2.   
3. [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -o delete'; done  
4.   
5. [root@localhost ~]# ssh_node 'rm -rf /var/lib/iscsi/send_targets/192.168.18.240*'; done

ASIC 硬件架构 硬件iscsi_文件系统_36

8-2、删除target端配置

       先解除绑定,再删除LUN,最后删除target,过程如下:

1. [root@localhost ~]# tgtadm -L iscsi -o unbind -m target -t 1 -I 192.168.18.0/24  
2.   
3. [root@localhost ~]# tgtadm -L iscsi -o delete -m logicalunit -t 1 -l 2  
4.   
5. [root@localhost ~]# tgtadm -L iscsi -o delete -m logicalunit -t 1 -l 1  
6.   
7. [root@localhost ~]# tgtadm -L iscsi -o delete -m target -t 1  
8.   
9. [root@localhost ~]# tgtadm -L iscsi -o show -m target

ASIC 硬件架构 硬件iscsi_IP_37

8-3、文件配置target信息

       上面我们说过tgtadm配置的信息,重启后会失效,需要通过/etc/tgt//targets.conf配置文件来配置才不会;该配置文件里有很多样例,如配置不使用缓存等,配置信息如下:


1. <target iqn.2016-10.com.tjiyu:mystore.disk1> #配置target名称  
2.   
3.     <backing-store /dev/sda5> #配置共享磁盘  
4.   
5.         vendor_id test #配置发行商(任意)  
6.   
7.         lun 6 #配置LUN号  
8.   
9.     </backing-store>  
10.   
11.     <backing-store /dev/sda6> #配置共享磁盘  
12.   
13.         vendor_id test #配置发行商(任意)  
14.   
15.         lun 8 #配置LUN号  
16.   
17.     </backing-store>  
18.   
19.     incominguser tjiyu 123456 #配置认证的用户名和密码  
20.   
21.     initiator-address 192.168.18.0/24 #配置允许的网段  
22.   
23. </target>


ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_38

       过程如下:



1. [root@localhost ~]# vim /etc/tgt//targets.conf  
2.   
3. [root@localhost ~]# service tgtd restart  
4.   
5. [root@localhost ~]# tgtadm -L iscsi -o show -m target


ASIC 硬件架构 硬件iscsi_文件系统_39

ASIC 硬件架构 硬件iscsi_ASIC 硬件架构_40

8-4、各节点重新发现并登录

       和上面6-4一样,各节点重新发现target,并登录,如下:



1. [root@localhost ~]# ssh_node 'iscsiadm -m discovery -t st -p 192.168.18.240'; done  
2.   
3. [root@localhost ~]# ssh_node 'iscsiadm -m node -T iqn.2016-10.com.tjiyu:mystore.disk1 -p 192.168.18.240:3260 -l'; done


ASIC 硬件架构 硬件iscsi_文件系统_41

       然后在node1上查看,可以看到前面测试格式化的分区还在,不过从/dev/sdb1变为了/dev/sdc1,重新挂载,发现复制进去的文件也还在,如下:

ASIC 硬件架构 硬件iscsi_IP_42

 

所有痛苦都是来自对自己无能的愤怒