ISCSI存储
一、iscsi简介
1. 基本概念
iSCSI(Internet Small Computer System Interface)即互联网小型计算机系统接口,它是一种基于 TCP/IP 协议的存储网络协议,将传统的 SCSI(Small Computer System Interface)命令封装在 IP 数据包中,从而使服务器可以通过网络像访问本地存储设备一样访问远程的 iSCSI 存储设备。
2. 工作流程
- 发现阶段:iSCSI 发起端首先需要发现可用的 iSCSI 目标端设备。发起端会向指定的 iSCSI 发现端口(通常是 TCP 端口 3260)发送发现请求,目标端设备接收到请求后,会返回其自身的信息,包括 iSCSI 名称、IP 地址等。发起端根据这些信息建立与目标端的连接。
- 登录阶段:发起端与目标端建立连接后,会进行登录操作。在登录过程中,发起端和目标端会交换一些必要的参数,如连接的安全设置、数据传输的最大块大小等,以确保双方能够正常通信。
- 数据传输阶段:登录成功后,发起端可以向目标端发送 SCSI 命令,如读取或写入数据。这些 SCSI 命令会被封装成 iSCSI 数据包,通过 TCP/IP 网络传输到目标端。目标端接收到数据包后,解析其中的 SCSI 命令,并执行相应的操作。操作完成后,目标端会将结果封装成 iSCSI 响应数据包返回给发起端。
- 注销阶段:当发起端不再需要访问目标端设备时,会发起注销操作,断开与目标端的连接。在注销过程中,双方会清理相关的资源,确保连接的正常关闭。
二、配置iscsi存储服务器–(提供iscsi目标)
使用
fdisk -l
指令查看磁盘信息新建分区–/dev/sda5–5G
fdisk /dev/sda 或者 partprobe /dev/sda安装targetcli软件包—在RHEL7上提供配置iscsi目标的使用程序是targetcli
yum -y install targetcli使用targetcli交互模式,创建后备存储
block----块设备、磁盘驱动器、磁盘分区、逻辑卷等等
fileio----使用dd命令创建的文件。
pscsi----物理scsi,通常不使用
ramdisk----类似于U盘[root@server ~]# targetcli Warning: Could not load preferences file /root/.targetcli/prefs.bin. 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] /> cd backstores/block /backstores/block> ls o- block .................................................. [Storage Objects: 0] /backstores/block> create block1 /dev/sda5 #此时的block1为用户自定义的名字,sda5根据每台主机分区的情况输入 Created block storage object block1 using /dev/sda5. /backstores/block> ls o- block .................................................. [Storage Objects: 1] o- block1 ........................ [/dev/sda5 (0 bytes) write-thru deactivated] /backstores/block> cd .. /backstores> cd .. /> ls o- / ..................................................................... [...] o- backstores .......................................................... [...] | o- block .............................................. [Storage Objects: 1] | | o- block1 .................... [/dev/sda5 (0 bytes) write-thru deactivated] | o- fileio ............................................. [Storage Objects: 0] | o- pscsi .............................................. [Storage Objects: 0] | o- ramdisk ............................................ [Storage Objects: 0] o- iscsi ........................................................ [Targets: 0] o- loopback ..................................................... [Targets: 0]
为目标创建iqn
/> cd iscsi /iscsi> create iqn.2025-05.com.example:disk1 #此时的disk1为用户自定义的名字 Created target iqn.2025-05.com.example:disk1. Created TPG 1. Global pref auto_add_default_portal=true Created default portal listening on all IPs (0.0.0.0), port 3260. /iscsi> ls o- iscsi .......................................................... [Targets: 1] o- iqn.2025-05.com.example:disk1 ................................... [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]
创建acl–在TPG中,创建ACL以控制客户端节点的访问
/iscsi> cd iqn.2025-05.com.example:disk1/tpg1/acls /iscsi/iqn.20...sk1/tpg1/acls> create iqn.2025-05.com.example:desktop #创建访问控制列表,其中desktop为用户自定义名字 Created Node ACL for iqn.2025-05.com.example:desktop /iscsi/iqn.20...sk1/tpg1/acls> ls o- acls .............................................................. [ACLs: 1] o- iqn.2020-03.com.example:desktop .......................... [Mapped LUNs: 0]
创建LUN–此步骤还将激活每个后备存储。此处为block1后备存储创建LUN
/iscsi/iqn.20...sk1/tpg1/acls> cd .. /iscsi/iqn.20...le:disk1/tpg1> cd luns /iscsi/iqn.20...sk1/tpg1/luns> ls o- luns .............................................................. [LUNs: 0] /iscsi/iqn.20...sk1/tpg1/luns> create /backstores/block/block1 Created LUN 0. Created LUN 0->0 mapping in node ACL iqn.2020-03.com.example:desktop /iscsi/iqn.20...sk1/tpg1/luns> ls o- luns .............................................................. [LUNs: 1] o- lun0 ........................................... [block/block1 (/dev/sda5)]
创建门户–在TPG中,创建一个门户配置侦听IP地址和端口,先把默认的门户配置删除,然后创建
/iscsi/iqn.20...sk1/tpg1/luns> cd .. /iscsi/iqn.20...le:disk1/tpg1> cd portals/ /iscsi/iqn.20.../tpg1/portals> ls o- portals ........................................................ [Portals: 1] o- 0.0.0.0:3260 ......................................................... [OK] /iscsi/iqn.20.../tpg1/portals> delete ip_address=0.0.0.0 ip_port=3260 #删除默认门户配置 Deleted network portal 0.0.0.0:3260 /iscsi/iqn.20.../tpg1/portals> create ip_address=192.168.100.100 ip_port=3260 Using default IP port 3260 Created network portal 192.168.100.100:3260. /iscsi/iqn.20.../tpg1/portals> ls o- portals ........................................................ [Portals: 1] o- 192.168.100.100:3260 .................................................... [OK]
整体预览targetcli配置
/iscsi/iqn.20.../tpg1/portals> cd / /> ls o- / ..................................................................... [...] o- backstores .......................................................... [...] | o- block .............................................. [Storage Objects: 1] | | o- block1 ...................... [/dev/sda5 (0 bytes) write-thru activated] | o- fileio ............................................. [Storage Objects: 0] | o- pscsi .............................................. [Storage Objects: 0] | o- ramdisk ............................................ [Storage Objects: 0] o- iscsi ........................................................ [Targets: 1] | o- iqn.2025-05.com.example:disk1 ................................. [TPGs: 1] | o- tpg1 ........................................... [no-gen-acls, no-auth] | o- acls ...................................................... [ACLs: 1] | | o- iqn.2025-05.com.example:desktop .................. [Mapped LUNs: 1] | | o- mapped_lun0 ............................ [lun0 block/block1 (rw)] | o- luns ...................................................... [LUNs: 1] | | o- lun0 ................................... [block/block1 (/dev/sda5)] | o- portals ................................................ [Portals: 1] | o- 192.168.100.100:3260 ............................................ [OK] o- loopback ..................................................... [Targets: 0] /> exit
Global pref auto_save_on_exit=true #退出后,会自动保存配置信息 Configuration saved to /etc/target/saveconfig.json
重启服务,并设置下次启动生效
systemctl restart target systemctl enable target
或者使用
systemctl restart iscsi systemctl restart iscsid systemctl enable iscsi systemctl enable iscsid
设置防火墙—由于防火墙对应的service name中没有target和iscsi,所以只需要添加端口3260即可
firewall-cmd --add-port=3260/tcp --permanent firewall-cmd --reload
三、iscsi客户端配置
安装iscsi-initiator-utils
yum -y install iscsi-initiator-utils
修改/etc/iscsi/initiatorname.iscsi配置文件—作为iscsi节点,客户端需要唯一的iqn,我们需要将该配置文件中的iqn改成我们之前在acl中新建的那个iqn
vim /etc/iscsi/initiatorname.iscsi #在initiatorname.iscsi文件内 InitiatorName=iqn.2025-05.com.example:desktop #此时的desktop是在配置acl时自定义的名字
重启iscsi、iscsid服务,并设置下次启动生效
systemctl restart iscsi systemctl enable iscsi systemctl restart iscsid systemctl enable iscsid
发现目标
在iscsi客户端上连接目标之前,必须先发现目标,发现过程将目标节点信息和设置存储在/var/lib/iscsi/nodes目录中,并使用/etc/iscsi/iscsi.conf配置文件中的默认值。
在发现模式中,sendtargets请求仅返回带有为此启动器配置的访问权限的目标iscsiadm -m discovery -t sendtargets -p 192.168.100.100:3260
登陆目标
iscsiadm -m node -T iqn.2025-05.com.example:disk1 -p 192.168.100.100:3260 -l
登录成功后使用fdisk -l命令查看磁盘情况,会发现客户端多了一个块设备
fdisk -l使用iscsi块存储
对/dev/sdb设备进行分区,并格式化,规划划分分区大小为1G,格式化为xfsparted /dev/sdb #分区 udevadm settle #阻塞当前进程,直到所有 udev 事件处理完成 mkfs.xfs /dev/sdb1 #把分区格式化为xfs格式 blkid #查看分区
挂载
mkdir /test#临时挂载 mount /dev/sdb1 /test #永久挂载 blkid /dev/sdb5----把查询到的UUID复制 vim /etc/fstab #在/etc/fstab文件内 UUID=...粘贴 /iscsistorage xfs defaults,_netdev 0 0
mount -a //挂载
注意:_netdev一定要加上,因为我们一旦重启了服务器,系统启动过程中是先读取/etc/fstab文件,然后再读取网卡的,由于我们iscsi存储时属于网络共享,所以如果我们没有写入_netdev这个参数的话,系统就识别不聊iscsi存储共享的设备,导致系统启动失败。
四、注销目标
取消挂载
临时注销
iscsiadm -m node -T iqn.2020-03.com.example:disk1 -p 172.16.30.20:3260 -u永久注销—永久注销iscsi目标前,一定先要临时注销iscsi目标。
iscsiadm -m node -T iqn.2020-03.com.example:disk1 -p 172.16.30.20:3260 -u iscsiadm -m node -T iqn.2020-03.com.example:disk1 -p 172.16.30.20:3260 -o delete