当我们的系统需要大量的磁盘容量,但是身边却没有足够的存储设备,此时,我们可以使用通过网络的scsi磁盘,即Internet scsi(iscsi)。iscsi主要是通过TCP/IP的技术,将存储设备端通过iscsi target功能,做成可以提供磁盘的服务器端,再通过iscsi initiator(iscsi初始化用户)功能,做成能够挂载使用iscsi target的客户端,这样就能够通过iscsi协议来进行磁盘的应用了。
iscsi架构主要将存储设备与使用的主机分为两个部分,分别是:
- iscsi target:就是存储设备端,存放磁盘设备。目的在于提供其他主机使用的磁盘。
- iscsi initiator:就是能够使用target的客户端,通常是服务器。也就是说,想要连接到iscsi target的服务器,也必须要安装iscsi initiator的相关功能后才能使用iscsi target提供的磁盘。
iscsi服务端需要使用的软件为:targetcli
iscsi客户端需要的软件为:iscsi-initiator-utils
实验:
服务端:
1、首先准备好iscsi共享的磁盘,iscsi可以通过(1)大型文件(2)单一分区(3)单一设备来进行共享。
(1)建立一个500M大小的文件
dd if=/dev/zero of=/iscsi bs=1M count=500
(2)创建一个新分区:这里是一个sda5分区
(3)准备一个空磁盘:这里添加了一个sdb磁盘
2、安装软件
[root@localhost ~]# yum install targetcli -y
3、配置iscsi服务端共享资源
targetcli是用于管理iscsi服务端存储资源的专用配置命令,它能够提供类似于fdisk命令的交互式配置功能,将iscsi共享资源的配置内容抽象成“目录”的形式,我们只需要将各类配置信息填入到相应的“目录”中即可。
[root@localhost ~]# targetcli
/> ls /
o- / ..................................................... [...]
o- backstores .......................................... [...]可用于iscsi的服务存储类型有四种
| o- block .............................. [Storage Objects: 0]块设备,磁盘驱动器,磁盘分区,逻辑卷,以及服务器上定义的任何b类型的设备文件
| o- fileio ............................. [Storage Objects: 0]在服务器上生成的一个指定大小的文件
| o- pscsi .............................. [Storage Objects: 0]物理scsi,通常不用
| o- ramdisk ............................ [Storage Objects: 0]内存盘,其中存储的数据在服务器重启后将全部丢失
o- iscsi ........................................ [Targets: 0]
o- loopback ..................................... [Targets: 0]
3.1给三个可共享存储定义逻辑单元编号,如同一般外接式存储设备可以具有多个磁盘一样,target也能够拥有数个磁盘设备。每个在target上的磁盘我们将它定义为逻辑单元编号。
/> cd /backstores/block
/backstores/block> create dev=/dev/sda5 name=lun0
Created block storage object lun0 using /dev/sda5.
/backstores/block> create dev=/dev/sdb name=lun1
Created block storage object lun1 using /dev/sdb.
/backstores/block> cd /backstores/fileio/
/backstores/fileio> create file_or_dev=/iscsi lun2
/backstores> ls /backstores/
o- backstores ............................................................... [...]
o- block ................................................... [Storage Objects: 2]
| o- lun0 ........................... [/dev/sda5 (1.0GiB) write-thru deactivated]
| o- lun1 ............................ [/dev/sdb (5.0GiB) write-thru deactivated]
o- fileio .................................................. [Storage Objects: 1]
| o- lun2 ............................ [/iscsi (500.0MiB) write-back deactivated]
o- pscsi ................................................... [Storage Objects: 0]
o- ramdisk ................................................. [Storage Objects: 0]
3.2设置共享的iscsi target名称及配置共享资源
iscsi target名称可由系统自动生成,这是一串用于描述共享资源的唯一字符串。
iscsi有一套自己共享target名称的定义,基本上iscsi共享出来的target文件名都是以iqn开头,意思是“ISCSI Qualified Name(iscsi合格名称)”。iscsi的target名字示例如下:iqn.yyyy-mm.网络名的反转写法:这个共享的target名称。
/> cd /iscsi
/iscsi> create
/iscsi> ls /iscsi/
o- iscsi .......................................... [Targets: 1]
o- iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.412f7ddb650b [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]
/iscsi> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.574bf27f644b/tpg1/luns
/iscsi/iqn.20...50b/tpg1/luns> create /backstores/block/lun0
/iscsi/iqn.20...50b/tpg1/luns> create /backstores/block/lun1
/iscsi/iqn.20...50b/tpg1/luns> create /backstores/fileio/lun2
/iscsi/iqn.20...50b/tpg1/luns> ls
o- luns .............................................. [LUNs: 3]
o- lun0 ............................. [block/lun0 (/dev/sda5)]
o- lun1 .............................. [block/lun1 (/dev/sdb)]
o- lun2 ............................... [fileio/lun2 (/iscsi)]
3.3设置iscsi服务端的监听ip地址和端口号,位于生产环境中的服务器可能有多块网卡,那么就可以在这儿指定由哪个网卡或IP地址对外提供共享存储资源。
/iscsi/iqn.20...44b/tpg1/luns> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.574bf27f644b/tpg1/portals
/iscsi/iqn.20.../tpg1/portals> ls
o- portals ........................................ [Portals: 1]
o- 0.0.0.0:3260 ......................................... [OK]
在7.2版本中自动创建了portal,如果需要自定义IP和端口,需要在创建target之前(也就是"/iscsi> create"命令之前)关闭自动创建portal功能(/> set group=global auto_add_default_portal=false)。如果已经创建target,也可以将已经有的portal删除再添加新的。
至此,iscsi服务端的基本配置已完成,如果要让客户端成功访问,需要对防火墙进行一些配置:
(1)关闭防火墙。
(2)如果不关闭防火墙则需要添加监听的端口:
[root@localhost ~]#firewall-cmd --permanent --add-port=3260/tcp
[root@localhost ~]#firewall-cmd --reload
iscsi客户端访问iscsi服务端
情况一:
如果权限设置如下:
/> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.412f7ddb650b/tpg1/
/iscsi/iqn.20...7ddb650b/tpg1> set attribute authentication=0 //关闭账号密码验证访问控制
/iscsi/iqn.20...7ddb650b/tpg1> set attribute generate_node_acls=1 //自动生成acl节点
/iscsi/iqn.20...7ddb650b/tpg1>exit
[root@localhost ~]# systemctl restart target
客户端:
[root@localhost ~]# yum install iscsi-initiator-utils
[root@localhost ~]#systemctl restart iscsi iscsid
iscsiadm是客户端的发现远端设备命令,用法如下:
iscsiadm -m discovery //扫描并发现可用的存储资源
-I //指定使用哪个网络接口,如果只有一块网卡则不用指定
-t sendtargets(缩写为st) //设置执行扫描操作的类型
-p //指定iscsi设备的ip:port,不写端口则为默认的3260
iscsiadm -m node //自己作为节点与server端建立连接
-u //登出
-l //登录
-T //指定target的名字登录或者登出( -l/-u)
iscsiadm -m session //查看会话
[root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 服务端IP地址 //查看共享文件
[root@localhost ~]# iscsiadm -m node -l登录 //登录同步文件
[root@localhost ~]# lsblk或者lsscsi查看会发现多了几块磁盘 //客户端多出了3个磁盘
情况二:
客户端需要成功给共享磁盘分区需要使用使用自定义acl实现访问控制
/iscsi/iqn.20...7ddb650b/tpg1> set attribute generate_node_acls=0 //开启acl
使用自定义的acl实现访问控制,则需要设置访问权限控制列表acl,acl参数目录用于存放能够访问iscsi服务端共享存储资源的客户端名称。在客户端访问时,只要iscsi客户端的名称与服务端设置的访问控制列表中的名称一致即可。
/> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.412f7ddb650b/tpg1/acls/
/iscsi/iqn.20...50b/tpg1/acls> create iqn.2019-12.com.redhat:client
/iscsi/iqn.20...50b/tpg1/acls>exit
[root@localhost ~]# systemctl restart target
客户端:
[root@localhost ~]# yum install iscsi-initiator-utils -y
[root@localhost ~]#vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:client
[root@localhost ~]#systemctl restart iscsi iscsid
[root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 服务端IP地址
[root@localhost ~]# iscsiadm -m node -l登录
[root@localhost ~]# lsblk或者lsscsi //查看会发现多了几块磁盘
将共享过来的磁盘分区格式化之后挂载到本地:
编辑/etc/fstab文件时,注意使用UUID(因为磁盘的文件名不一定是固定的)。由于共享过来的是网络存储设备,而iSCSI协议是基于TCP/IP网络传输数据的,因此必须在/etc/fstab配置文件中添加上_netdev参数,表示当系统联网后再进行挂载操作,以免系统开机时间过长或开机失败。