[RHEL]-25-使用iSCSI部署网络储存

引言

这篇文章将介绍如何使用iSCSI技术,将一台服务器上的硬盘部署到网络上,在网络上的其他服务器可以挂载共享这块硬盘的数据。

文章目录

0×1.iSCSI简介

在传统环境中使用的SCSI(Small Computer System Interface)技术,通常需要SCSI总线链接不同的储存设备,因此受到了物理环境和SCSI总线长度的限制,为了解决这一局限性,IBM公司研究并开发了用于实现在IP网络上运行SCSI协议的新存储技术,即iSCSI(Internet Small Computer System Interface)。

iSCSI能让SCSI接口与以太网技术结合,使iSCSI协议在以太网上传送SCSI命令与数据,从而克服了SCSI的局限性,但与此同时又产生了一个新的问题,硬盘的数据处理速度要远大于网络传输速率,在不同客户服务器之间存取数据时,往往受到网络传输速率的限制,所以通常的做法是,在客户服务器与iSCSI服务器之间使用SAN存储区域网络技术(Storage Area Network),SAN是基于iSCSI存储协议,并采用高速光钎传输数据的服务程序,SAN能使得网络传输延迟尽可能的小,但延迟仍然不可避免,这也是如今影响iSCSI性能最大的问题。

0×2.使用iSCSI部署网络储存实例

实验环境:

RHEL7,IP 192.168.1.233/24,iSCSI服务端,新增了四块大小都为20G的硬盘/dev/sd[b-e];
Centos7,IP 192.168.1.123/24,iSCSI客户端;
我们可以想象成这两台服务器之间使用SAN网络相连,并且能够互相访问;

a.iSCSI服务端配置

1)确保服务端硬盘储存的安全,在iSCSI服务端启用磁盘阵列技术raid10,将/dev/sd[b-e]四块硬盘加入阵列中(可选步骤,也可以直接将硬盘号加入iSCSI环境中):

					#安装mdadm
					[root@qingsword.com ~]# yum -y install mdadm

					#将四块硬盘配置成raid10
					[root@qingsword.com ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd[b-e]

					#查看进度文件,等文件中的进度到达100%,再继续下一步
					[root@qingsword.com ~]# cat /proc/mdstat

					#生成配置文件(实际上RHEL7系统中这个配置文件不生成也没关系),会将/dev/md0的UUID写入到这个文件中
					[root@qingsword.com ~]# mdadm -D --scan > /etc/mdadm.conf

					#修改配置文件,UUID保持不变,DEVICE后面写mdadm所包含的硬件名称,ARRAY后面是mdadm设备名称,然后是UUID(请注意,你的UUID是上面这一步生成的,不要照抄我的)
					[root@qingsword.com ~]# vim /etc/mdadm.conf
					DEVICE /dev/sdb /dev/sdc /dev/sdd /dev/sde
					ARRAY /dev/md0 UUID=b304f0ec:981dfc1f:63160956:6a3b2faf
					

2)安装并启动iSCSI服务端程序

					#targetd是iSCSI服务程序,targetcli是服务端配置程序
					[root@qingsword.com ~]# yum install -y targetd targetcli

					#启动targetd,并设置为开机自启动
					[root@qingsword.com ~]# systemctl start targetd
					[root@qingsword.com ~]# systemctl enable targetd
					

3)配置iSCSI

					#进入targetcli命令行
					[root@qingsword.com ~]# targetcli
					targetcli shell version 2.1.fb41
					Copyright 2011-2013 by Datera, Inc and others.
					For help on commands, type 'help'.
					
					#查看下目录结构
					/> ls
					o- / .......... [...]
					  o- backstores .......... [...]
					  | o- block .......... [Storage Objects: 0]
					  | o- fileio .......... [Storage Objects: 0]
					  | o- pscsi .......... [Storage Objects: 0]
					  | o- ramdisk .......... [Storage Objects: 0]
					  o- iscsi .......... [Targets: 0]
					  o- loopback .......... [Targets: 0]

					#进入backstores/block目录中
					/> cd backstores/block

					#将/dev/md0这块储存设备加入iSCSI设备块(如果没有创建磁盘阵列,也可以直接单独添加某块硬盘设备),disk_001是自定义的iSCSI设备号,仅用于识别
					/backstores/block> create disk_001 /dev/md0
					Created block storage object disk_001 using /dev/md0.
					
					#创建成功后,可以查看到block下多了一块disk_001设备,原始设备名称是/dev/md0,大小是40G
					/backstores/block> ls
					o- block .......... [Storage Objects: 1]
					  o- disk_001 .......... [/dev/md0 (40.0GiB) write-thru deactivated]

					#进入iSCSI环境根目录的iscsi目录中
					/backstores/block> cd /iscsi

					#直接使用create命令,创建iqn目录,这会在这个目录下生成一个iqn开头的文件夹,而" iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad"这一串标识符很重要,客户端检测时会显示这串标识符,在iscsi目录中每次使用create命令都会自动生成一个iqn目录,我们可以将/backstores/block中的不同设备加入这些目录中,提供给客户端连接与使用
					/iscsi> create
					Created target iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad.

					#在iqn目录中,会自动生成一个目录结构
					/iscsi> ls
					o- iscsi .......... [Targets: 1]
					  o- iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad .......... [TPGs: 1]
					    o- tpg1 .......... [no-gen-acls, no-auth]
					      o- acls ..................... [ACLs: 0]
					      o- luns ..................... [LUNs: 0]
					      o- portals ............... [Portals: 1]
					        o- 0.0.0.0:3260 ................ [OK]

					#首先进入luns目录
					/iscsi> cd iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad/tpg1/luns 

					#创建LUN设备,将/backstores/block/disk_001这块设备加入到当前的iqn目标中(这意味着,客户端连接上这个LUN设备,对应的磁盘大小就是下面加入的这块desk_001的大小)
					/iscsi/iqn.20...dad/tpg1/luns> create /backstores/block/disk_001

					#进入acls目录,创建访问控制列表
					/iscsi/iqn.20...dad/tpg1/luns> cd ../acls 
					
					#这个访问控制列表名称是自定义的,推荐使用格式为"iqn的全名:自定义的字符串"
					/iscsi/iqn.20...dad/tpg1/acls> create iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad:qingsword.com

					#进入portals目录,首先删除默认的访问IP(这个IP允许从服务端所有网卡接口访问到这个LUN设备)
					/iscsi/iqn.20...dad/tpg1/acls> cd ../portals/
					/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260

					#创建一个新的规则,仅允许从192.168.1.233这块网卡的3260接口访问
					/iscsi/iqn.20.../tpg1/portals> create 192.168.1.233

					#全部配置完毕后,完整的结构如下
					/iscsi/iqn.20.../tpg1/portals> cd /
					/> ls
					o- / ..................... [...]
					  o- backstores .......... [...]
					  | o- block ........... [Storage Objects: 1]
					  | | o- disk_001 .......... [/dev/md0 (40.0GiB) write-thru activated]
					  | o- fileio .......... [Storage Objects: 0]
					  | o- pscsi ........... [Storage Objects: 0]
					  | o- ramdisk ........... [Storage Objects: 0]
					  o- iscsi ..................... [Targets: 1]
					  | o- iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad .......... [TPGs: 1]
					  |   o- tpg1 .......... [no-gen-acls, no-auth]
					  |     o- acls ................... [ACLs: 1]
					  |     | o- iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad:qingsword.com ........... [Mapped LUNs: 1]
					  |     |   o- mapped_lun0 .......... [lun0 block/disk_001 (rw)]
					  |     o- luns ................... [LUNs: 1]
					  |     | o- lun0 .................. [block/disk_001 (/dev/md0)]
					  |     o- portals ............. [Portals: 1]
					  |       o- 192.168.1.233:3260 .......... [OK]
					  o- loopback .................. [Targets: 0]

					#最后一定不要忘记使用exit退出,这样才能自动将上面的修改保存到配置文件中
					/> exit
					

3)配置防火墙

					#首先清空iptables并保存
					[root@qingsword.com ~]# iptables -F
					[root@qingsword.com ~]# service iptables save
					
					#如果遇到连接不上的情况,请将3260端口添加到防火墙允许列表中
					[root@qingsword.com ~]# firewall-cmd --permanent --zone=public --add-port=3260/tcp
					[root@qingsword.com ~]# firewall-cmd --reload
					

客户端配置完成。

b.iSCSI客户端配置

在CentOS7或RHEL7环境中默认已经安装了iSCSI客户端,只需要简单配置就能够使用:

1)修改客户端配置文件,重启客户端iscsi服务

					[root@qingsword.com ~]# vim /etc/iscsi/initiatorname.iscsi

					#将InitiatorName后面的名称改成服务端acls目录中我们使用create命令自定义的访问控制列表的名称
					InitiatorName=iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad:qingsword.com
					
					#重启服务,将服务设置成开机自启动
					[root@qingsword.com ~]# systemctl restart iscsid
					[root@qingsword.com ~]# systemctl enable iscsid
					

2)检测iSCSI服务端有哪些可用的iqn目标设备

					#-m参数指定一个动作,discovery参数会去探测服务器上有哪些可以连接的iqn目标,-p参数指定iSCSI服务端IP
					[root@qingsword.com ~]# iscsiadm -m discovery -t st -p 192.168.1.233

					#检测到一个可以连接的iqn目标
					192.168.1.233:3260,1 iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad
					

3)连接目标并挂载到本地使用

					#在连接之前,看看本地的都有哪些磁盘设备
					[root@qingsword.com ~]# ls /dev/sd*
					/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3

					#使用node结点模式登录,-T参数后面指定第2步中探测到的iqn全名,-p后面是iSCSI服务端的IP,-l代表--login
					[root@qingsword.com ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad -p 192.168.1.233 -l

					#连接后,再次查看本地磁盘设备,发现多了一块/dev/sdb
					[root@qingsword.com ~]# ls /dev/sd*
					/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb

					#格式化这块硬盘,挂载到本地使用(注意!注意!注意!如果这块设备已经被其他客户端格式化过了,就不需要这一步的操作,直接挂载使用即可,一定不要再去格式化了,否则会丢失所有数据,那么如何判断是否已经格式化?直接挂载一下,如果成功了说明已经格式化)
					[root@qingsword.com ~]# mkfs.xfs /dev/sdb
					
					#查看设备UUID值,将设备写入fstab中开机自动挂载
					[root@qingsword.com ~]# blkid /dev/sdb
					/dev/sdb: UUID="d663a07a-7963-48da-af8a-25ac03a3cfa6" TYPE="xfs"

					[root@qingsword.com ~]# vim /etc/fstab

					#将设备挂载到/mnt目录下,_netdev参数告诉系统,这是一块网络设备,当网络连通后再挂载
					UUID=d663a07a-7963-48da-af8a-25ac03a3cfa6 /mnt  xfs defaults,_netdev 0 0
					

Ps:多个客户端可以同时将这块设备挂载到本地使用,但多个客户端对硬盘的写入不是同步的,只有重新挂载后才能看到其它客户端写入的信息。

c.iSCSI追加删除设备

接着上面的实验,在iSCSI服务端再添加一块20G的硬盘/dev/sdf,将这块硬盘添加到现有的iSCSI中的iqn文件夹中。

追加设备,iSCSI服务端配置:

					#进入配置工具命令行
					[root@qingsword.com ~]# targetcli

					/> cd /backstores/block

					#比较规范的写法,简写时省略name=与dev=也是可以的,另外还有一个readonly=yes/no(默认不写为no)参数,指定这块硬盘是否只读
					/backstores/block> create name=disk_002 dev=/dev/sdf

					#进入对应iqn文件夹的luns目录
					/backstores/block> cd /
					/> cd iscsi/iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad/tpg1/luns/

					#给这个目录追加一块新的LUN设备/backstores/block/disk_002    
					/iscsi/iqn.20...dad/tpg1/luns> create /backstores/block/disk_002

					#保存并退出
					/iscsi/iqn.20...dad/tpg1/luns> exit
					

客户端需要重新断开再连接,才能够识别出这块新的设备:

					#断开之前,设备列表,/dev/sdb是iSCSI服务端的/dev/md0
					[root@qingsword.com ~]# ls /dev/sd*
					/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb
					
					#重新断开再连接
					[root@qingsword.com ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad -p 192.168.1.233 -u
					[root@qingsword.com ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad -p 192.168.1.233 -l
					
					#发现多了一块/dev/sdc,这块硬盘就是iSCSI服务端上面新增的/dev/sdf
					[root@qingsword.com ~]# ls /dev/sd*
					/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb  /dev/sdc
					

iSCSI服务端删除设备:

					[root@qingsword.com ~]# targetcli

					#首先查看下目录信息
					/> ls
					o- / ................... [...]
					  o- backstores ................... [...]
					  | o- block ................... [Storage Objects: 2]
					  | | o- disk_001 ................... [/dev/md0 (40.0GiB) write-thru activated]
					  | | o- disk_002 ................... [/dev/sdf (20.0GiB) write-thru activated]
					  | o- fileio ................... [Storage Objects: 0]
					  | o- pscsi ................... [Storage Objects: 0]
					  | o- ramdisk ................... [Storage Objects: 0]
					  o- iscsi ................... [Targets: 1]
					  | o- iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad ................... [TPGs: 1]
					  |   o- tpg1 ................... [no-gen-acls, no-auth]
					  |     o- acls ................... [ACLs: 1]
					  |     | o- iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad:qingsword.com ................... [Mapped LUNs: 2]
					  |     |   o- mapped_lun0 ................... [lun0 block/disk_001 (rw)]
					  |     |   o- mapped_lun1 ................... [lun1 block/disk_002 (rw)]
					  |     o- luns ................... [LUNs: 2]
					  |     | o- lun0 ................... [block/disk_001 (/dev/md0)]
					  |     | o- lun1 ................... [block/disk_002 (/dev/sdf)]
					  |     o- portals ................... [Portals: 1]
					  |       o- 192.168.1.233:3260 ................... [OK]
					  o- loopback ................... [Targets: 0]

					#加入我们要删除iqn目录中的LUN1(这块设备就是block中的disk_002,即/dev/sdf)
					/> cd /iscsi/iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad/tpg1/luns/

					#可简写成 delete 1
					/iscsi/iqn.20...dad/tpg1/luns> delete lun=1

					#此时可以将disk_002分配给其他iqn目标使用了,如果完全不需要使用了,将其从设备中移除
					/iscsi/iqn.20...dad/tpg1/luns> cd /backstores/block/

					#可简成delete disk_002     
					/backstores/block> delete name=disk_002

					#保存退出
					/backstores/block> exit
					

客户端只需要卸载对应的设备即可(如果加入了fstab,请将配置移除)。

将设备移出iSCSI前,设备无法被iSCSI服务端本地挂载(因为被iSCSI服务占用)。

d.客户端彻底移除iSCSI

如果客户端不再使用服务端的设备,可以使用下面的方法彻底移除残留的配置:

					#除了删除fstab中的配置外,首先断开与服务端的连接
					[root@qingsword.com ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad -p 192.168.1.233 -u

					#删除残留配置
					[root@qingsword.com ~]# cd /var/lib/iscsi
					[root@qingsword.com iscsi]# ls
					ifaces  isns  nodes  send_targets  slp  static

					[root@qingsword.com iscsi]# ls nodes send_targets/
					nodes:
					iqn.2003-01.org.linux-iscsi.qingsword.x8664:sn.924b22230dad

					send_targets/:
					192.168.1.233,3260

					[root@qingsword.com iscsi]# rm -rf nodes/iqn.2003-01.org.linux-iscsi.qingsword.x8664\:sn.924b22230dad/
					[root@qingsword.com iscsi]# rm -rf send_targets/192.168.1.233,3260/