主机名 | IP |
---|---|
ISCSI服务端 | 192.168.200.10 |
ISCSI客户端 | 192.168.200.20 |
Windows客户端 | 192.168.200.30 |
# 修改主机名 [root@localhost ~]# hostnamectl set-hostname iscsi-server [root@localhost ~]# bash [root@iscsi-server ~]# [root@localhost ~]# hostnamectl set-hostname iscsi-client [root@localhost ~]# bash [root@iscsi-client ~]#
iSCSI(Internet Small Computer System Interface)是一种将SCSI(Small Computer System Interface)存储协议运行在TCP/IP网络上的技术。它通过使用IP网络来传输SCSI命令和数据,并将存储设备的逻辑单元(LUN)暴露给远程主机,使其能够远程访问和使用存储资源。
架构: iSCSI 架构由以下组件组成:
传输: iSCSI 使用 TCP/IP 协议作为底层传输协议,利用 IP 网络传输SCSI命令和数据。它使用 iSCSI Initiator 向 iSCSI Target 发送SCSI 命令,并将响应和数据通过网络传输回 Initiator。
配置和管理: iSCSI 需要配置 iSCSI Initiator 和 iSCSI Target 来建立连接并传输数据。 Initiator 需要指定目标的 IP 地址和端口号,以及要访问的 LUN。 Target 需要配置相应的存储资源,并设置适当的访问控制和身份验证机制。
功能和优势:
iSCSI 技术需要在网络中传输存储数据,因此网络性能和带宽是关键因素。
既然要使用ISCSI存储技术为远程用户提供共享存储资源,首先要保障用于存放资源的服务器的稳定性与可用性,否则一旦在使用过程中出现故障,则维护的难度相较于本地硬盘设备要更加复杂、困难。
首先给虚拟机添加4块硬盘,用于创建RAID5磁盘阵列和备份盘
[root@iscsi-server ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sr0 11:0 1 8.9G 0 rom /run/media/root/RHEL-9-2-0-BaseOS-x86_64 nvme0n1 259:0 0 50G 0 disk ├─nvme0n1p1 259:1 0 600M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot └─nvme0n1p3 259:3 0 48.4G 0 part ├─rhel-root 253:0 0 44.5G 0 lvm / └─rhel-swap 253:1 0 3.9G 0 lvm [SWAP] nvme0n2 259:4 0 20G 0 disk nvme0n3 259:5 0 20G 0 disk nvme0n4 259:6 0 20G 0 disk nvme0n5 259:7 0 20G 0 disk [root@iscsi-server ~]# mdadm -Cv /dev/md0 -l 5 -n 3 -x 1 /dev/nvme0n{2..5} mdadm: layout defaults to left-symmetric mdadm: layout defaults to left-symmetric mdadm: chunk size defaults to 512K mdadm: size set to 20954112K mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. [root@localhost ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Sun Apr 7 18:30:39 2024 Raid Level : raid5 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent Update Time : Sun Apr 7 18:32:24 2024 State : clean Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Consistency Policy : resync Name : localhost.localdomain:0 (local to host localhost.localdomain) UUID : 4fe66abc:dc653251:28374699:803cfb22 Events : 18 Number Major Minor RaidDevice State 0 259 4 0 active sync /dev/nvme0n2 1 259 5 1 active sync /dev/nvme0n3 4 259 6 2 active sync /dev/nvme0n4 3 259 7 - spare /dev/nvme0n5
ISCSI技术在工作形式上分为服务器(target)与客户端(initiator)。
ISCSI服务端用于存放硬盘存储资源的服务器
,它作为前面创建的RAID磁盘整列的存储端,能够为用户提供可用的存储资源
ISCSI客户端则是用户使用的软件,用于访问远程服务端的存储资源
第一步:在RHEL8/centos 8系统中,默认已经安装了ISCSI服务端程序,用户只用安装ISCSI服务端的交换配置工具就可以了
[root@iscsi-server ~]# yum install -y targetcli
第二步:配置ISCSI服务端共享资源
targetcli是用于管理iSCSI服务端存储资源的专用配置命令,它能够提供类似于 fisk 命令的交互式配置功能,将iSCSI 共享资源的配置内容抽象成“目录”的形式,我们只需将各类配置信息填入到相应的“目录”中即可。
主要在于认识每个“参数目录”的作用。当把配置参数正确地填写到“目录”中后,iSCSI服务端也就可以提供共享资源服务了。
在执行 targetcli 命令后就能看到交互式的配置界面了。在该界面中允许使用很多 Linux命令,比如利用ls查看目录参数的结构,使用cd切换到不同的目录中。
常用的targetcli命令和其功能的详解
命令 | 作用 |
---|---|
ls [path] [depth] | 列出指定路径下的目标和/或目录 |
cd [path] | 进入指定的路径(目标或目录) |
pwd | 打印当前路径 |
bookmarks action [bookmark] | 执行与书签相关的操作 |
create name dev [readonly] [wwn] | 创建一个新的配置。name参数指定了配置的名称,dev参数指定了设备 |
delete name | 删除指定的配置。name参数指定了要删除的配置 |
exit | 退出当前会话或程序 |
get [group] [parameter…] | 获取指定组或参数的信息 |
refresh | 刷新当前状态或视图 |
set [group] [parameter=value…] | 设置指定组或参数的值 |
status | 显示当前状态信息 |
[root@iscsi-server ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.53
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]
/
:根目录,包含其他目录和命令的子目录block
:块设备类型的存储对象列表fileio
:文件IO类型的存储对象列表pscsi
:Pseudo SCSI类型的存储对象列表ramdisk
:内存磁盘类型的存储对象列表iscsi
:iSCSI目标的目录loopback
:回环目标的目录将刚刚创建的RAID5磁盘阵列md0文件假如到配置共享设备的资源池中,并将该文件重新命名为disk0,这样用户就不会知道是有服务器中的哪块硬盘来提供共享存储资源,而只会看到一个名为disk0的存储设备
/> cd /backstores/block
/backstores/block> create disk0 /dev/md0
Created block storage object disk0 using /dev/md0.
/backstores/block> cd /
/> ls
o- / … […]
o- backstores … […]
| o- block … [Storage Objects: 1]
| | o- disk0 … [/dev/md0 (40.0GiB) write-thru deactivated]
| | o- alua … [ALUA Groups: 1]
| | o- default_tg_pt_gp … [ALUA state: Active/optimized]
| o- fileio … [Storage Objects: 0]
| o- pscsi … [Storage Objects: 0]
| o- ramdisk … [Storage Objects: 0]
o- iscsi … [Targets: 0]
o- loopback … [Targets: 0]
/>
第三步:创建ISCSI target名称及配置共享资源
iSCSI target名称是由系统自动生成的,这是一串用于描述共享资源的唯一字符串。稍后用户在扫描iSCSI服务端时即可看到这个字符串,因此我们不需要记住它。
iqn.yyyy-mm.:identifier iqn.年年-月.单位网络名的反转写法 : 这个共享的target名称
/> cd iscsi
/iscsi> ls
o- iscsi … [Targets: 0]
/iscsi> create
Created target iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b.
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.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b … [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]
系统在生成这个 target 名称后,还会在/iscsi 参数目录中创建一个与其字符串同名的新“目录”用来存放共享资源。我们需要把前面加人到iSCSI共享资源池中的硬盘设备添加到这个新目录中,这样用户在登录iSCSI服务端后,即可默认使用这硬盘设备提供的共享存储资源了。
/iscsi/iqn.20...5a84619b/tpg1> cd luns /iscsi/iqn.20...19b/tpg1/luns> create /backstores/block/disk0 Created LUN 0.
第四步:设置访问控制列表(ACL)
iSCSI协议是通过客户端名称进行验证的。也就是说,用户在访问存储共享资源时不需要输入密码,只要iSCSI客户端的名称与服务端中设置的访问控制列表中某一名称条目一致即可,因此需要在iSCSI服务端的配置文件中写入一串能够验证用户信息的名称。acls 参数目录用于存放能够访问iSCSI服务端共享存储资源的客户端名称。
[root@iscsi-client ~]# systemctl start iscsid.service && systemctl enable iscsid.service [root@iscsi-client ~]# cat /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.1994-05.com.redhat:cc54be3e2f1 /iscsi/iqn.20...19b/tpg1/acls> create iqn.1994-05.com.redhat:cc54be3e2f1 Created Node ACL for iqn.1994-05.com.redhat:cc54be3e2f1 Created mapped LUN 0.
/iscsi/iqn.20...19b/tpg1/acls> create iqn.1991-05.com.microsoft:desktop-utnil1q Created Node ACL for iqn.1991-05.com.microsoft:desktop-utnil1q Created mapped LUN 0.
第五步:设置ISCSI服务端的监听IP地址和端口号
位于生产环境中的服务器上可能有多块网卡,那么到底是由哪个网卡或正地址对外提供共享存储资源呢?在配置文件中默认是允许所有网卡提供iSCSI服务,如果您认为这有些许不安全,可以手动删除:
/iscsi/iqn.20...19b/tpg1/acls> cd .. /iscsi/iqn.20...5a84619b/tpg1> cd portals/ /iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260 Deleted network portal 0.0.0.0:3260 # 使用192.168.200.10的3260端口向外提供ISCSI共享存储资源服务 /iscsi/iqn.20.../tpg1/portals> create 192.168.200.10 Using default IP port 3260 Created network portal 192.168.200.10:3260.
第六步:再参数文件配置妥当后,浏览刚刚配置的信息,确保上述提到的“目录”都已经填写了正确的内容
确认无误exit退出配置
/> ls
o- / … […]
o- backstores … […]
| o- block … [Storage Objects: 1]
| | o- disk0 … [/dev/md0 (40.0GiB) write-thru activated]
| | o- alua … [ALUA Groups: 1]
| | o- default_tg_pt_gp … [ALUA state: Active/optimized]
| 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.iscsi-server.x8664:sn.3e775a84619b … [TPGs: 1]
| o- tpg1 … [no-gen-acls, no-auth]
| o- acls … [ACLs: 2]
| | o- iqn.1991-05.com.microsoft:desktop-utnil1q … [Mapped LUNs: 1]
| | | o- mapped_lun0 … [lun0 block/disk0 (rw)]
| | o- iqn.1994-05.com.redhat:cc54be3e2f1 … [Mapped LUNs: 1]
| | o- mapped_lun0 … [lun0 block/disk0 (rw)]
| o- luns … [LUNs: 1]
| | o- lun0 … [block/disk0 (/dev/md0) (default_tg_pt_gp)]
| o- portals … [Portals: 1]
| o- 192.168.200.10:3260 … [OK]
o- loopback … [Targets: 0]
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
防火墙放心规则
[root@iscsi-server ~]# firewall-cmd --add-service=iscsi-target --permanent [root@iscsi-server ~]# firewall-cmd --reload
打开windows客户端输入ISCSI服务端的IP地址,点击快速连接
已连接,点击完成
搜索磁盘管理器,点击搜索的第一个
点进去后,就会发现有一个未分配的40G磁盘
点击未分配的磁盘,右键新建卷,设置磁盘大小为30G,设置驱动号为E盘,NTFS文件系统,卷标为ISCSI磁盘,最后点击完成
在ISCSI磁盘中存储一些内容,也可以存储
在RHEL 9 系统中,已经默认安装了ISCSI客户端服务程序initiator,如果没有安装可以用yum安装
[root@iscsi-client ~]# rpm -qa |grep -i iscsi iscsi-initiator-utils-iscsiuio-6.2.1.4-3.git2a8f9d8.el9.x86_64 iscsi-initiator-utils-6.2.1.4-3.git2a8f9d8.el9.x86_64 udisks2-iscsi-2.9.4-7.el9.x86_64
设置iscsid服务开机自启,并启动,在之前设置访问控制列表已经开启过了
iscsiadm
是一个用于管理 iSCSI 会话和目标的命令行工具。它允许您配置和管理 iSCSI 收发器(也称为 iSCSI initiator)与 iSCSI 目标(也称为 iSCSI 服务端)之间的连接。
Discovery(发现):
iscsiadm -m discovery -t st -p
这个命令用于从指定的 iSCSI 目标 IP 地址进行发现。通过执行发现操作,可以列出可以连接的 iSCSI 目标。Login(登录):
iscsiadm -m node -T -p --login
这个命令用于使用指定的 iSCSI 目标名称和 IP 地址登录到 iSCSI 目标。Logout(注销):
iscsiadm -m node -T -p -u
这个命令用于从指定的 iSCSI 目标注销并断开与目标的连接。# 先发现 [root@iscsi-client ~]# iscsiadm -m discovery -t st -p 192.168.200.10 192.168.200.10:3260,1 iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b # 在登录 [root@iscsi-client ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b -p 192.168.200.10 --login Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b, portal: 192.168.200.10,3260] Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b, portal: 192.168.200.10,3260] successful. # 登录成功 # 登录成功之后,会在客户端主机上多出一块磁盘,可以使用lsblk查看 [root@iscsi-client ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 40G 0 disk └─sda1 8:1 0 30G 0 part # 这个是windows分区的磁盘 sr0 11:0 1 8.9G 0 rom /run/media/root/RHEL-9-2-0-BaseOS-x86_64 nvme0n1 259:0 0 50G 0 disk ├─nvme0n1p1 259:1 0 600M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot └─nvme0n1p3 259:3 0 48.4G 0 part ├─rhel-root 253:0 0 44.5G 0 lvm / └─rhel-swap 253:1 0 3.9G 0 lvm [SWAP] # 再来分区sda [root@iscsi-client ~]# lsblk /dev/sda NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 40G 0 disk ├─sda1 8:1 0 30G 0 part └─sda2 8:2 0 10G 0 part # 我们创建的 # 格式化 [root@iscsi-client ~]# mkfs.xfs /dev/sda2 log stripe unit (524288 bytes) is too large (maximum is 256KiB) log stripe unit adjusted to 32KiB meta-data=/dev/sda2 isize=512 agcount=16, agsize=163200 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=2611200, imaxpct=25 = sunit=128 swidth=256 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # 创建挂载点 [root@iscsi-client ~]# mkdir /sharedisk # 挂载 [root@iscsi-client ~]# mount /dev/sda2 /sharedisk/ # 查看 [root@iscsi-client ~]# df -hT /sharedisk/ 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sda2 xfs 10G 104M 9.9G 2% /sharedisk # 写入数据 [root@iscsi-client ~]# dd if=/dev/zero of=/sharedisk/test_1 count=500 bs=1M 记录了500+0 的读入 记录了500+0 的写出 524288000字节(524 MB,500 MiB)已复制,0.432517 s,1.2 GB/s [root@iscsi-client ~]# cd /sharedisk/ [root@iscsi-client sharedisk]# ls test_1 [root@iscsi-client sharedisk]# df -hT /sharedisk/ 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sda2 xfs 10G 604M 9.4G 6% /sharedisk # 添加自动挂载 [root@iscsi-client sharedisk]# vim /etc/fstab /dev/sda2 /sharedisk xfs defaults,_netdev 0 0 # _netdev 参数可以确保系统在启动网络服务之后再进行挂载,避免因为网络尚未准备好而导致挂载失败。 [root@iscsi-client sharedisk]# cd [root@iscsi-client ~]# umount /sharedisk [root@iscsi-client ~]# mount -a [root@iscsi-client ~]# df -hT /sharedisk/ 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sda2 xfs 10G 604M 9.4G 6% /sharedisk
在windows端刷新一下磁盘管理,看看分区情况
分区没问题
如果不再需要使用ISCSI共享设备资源了,可以用iscsiadm命令的-u参数将其他设备卸载
# 先发现 [root@iscsi-client ~]# iscsiadm -m discovery -t st -p 192.168.200.10 192.168.200.10:3260,1 iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b # 再注销 [root@iscsi-client ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b -u Logging out of session [sid: 1, target: iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b, portal: 192.168.200.10,3260] Logout of [sid: 1, target: iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b, portal: 192.168.200.10,3260] successful. # 查看磁盘 [root@iscsi-client ~]# lsblk |grep sda # 记得删除fstab自动挂载内容,否则关机就开不了机了
windows注销可以打开ISCSI发起程序,点击断开连接就可以卸载磁盘了
在 iSCSI 中,CHAP(Challenge Handshake Authentication Protocol)是一种用于进行身份认证的协议,可以在 iSCSI 连接中提供一种基于密码的安全机制。单向 CHAP 认证是一种配置方式,其中只有 Linux客户端验证 iSCSI 服务器的身份
创建 CHAP 用户名和密码: 在 iSCSI 服务器上创建一个 CHAP 用户名和密码组合,用于与 iSCSI 客户端进行认证。这些用户名和密码将用于验证 iSCSI 客户端身份。
修改 iSCSI 客户端的配置文件: 打开 iSCSI 服务器的配置文件,并添加以下配置项:
discovery.sendtargets.auth.authmethod = CHAP discovery.sendtargets.auth.username = discovery.sendtargets.auth.password = # 将 替换为您在第一步中创建的 CHAP 用户名,将 替换为相应的密码。
保存并关闭配置文件
建立 iSCSI 连接: 在配置完成后,通过 iSCSI 客户端建立与 iSCSI 服务器的连接。客户端将使用配置的 CHAP 用户名和密码与服务器进行认证,并建立受信任的连接
# 创建 CHAP 用户名和密码 [root@iscsi-server ~]# targetcli /> cd iscsi/ /iscsi> set discovery_auth enable=1 userid=csq password=Abc@1234 # 设置单向认证 Parameter enable is now 'True'. Parameter userid is now 'csq'. Parameter password is now 'Abc@1234'. /iscsi> get discovery_auth DISCOVERY_AUTH CONFIG GROUP =========================== enable=True ----------- The enable discovery_auth parameter. mutual_password= ---------------- The mutual_password discovery_auth parameter. mutual_userid= -------------- The mutual_userid discovery_auth parameter. password=Abc@1234 # # 单项认证的密码 ----------------- The password discovery_auth parameter. userid=csq # 单项认证的账户 ---------- The userid discovery_auth parameter. # 修改 iSCSI 服务器的配置文件 [root@iscsi-server ~]# vim /etc/iscsi/iscsid.conf 79 discovery.sendtargets.auth.authmethod = CHAP 83 discovery.sendtargets.auth.username = csq 84 discovery.sendtargets.auth.password = 123789456csq # 先发现 [root@iscsi-client ~]# iscsiadm -m discovery -t st -p 192.168.200.10 192.168.200.10:3260,1 iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b # 再登陆 [root@iscsi-client ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b --login Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b, portal: 192.168.200.10,3260] Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.iscsi-server.x8664:sn.3e775a84619b, portal: 192.168.200.10,3260] successful. # 查看磁盘 [root@iscsi-client ~]# lsblk /dev/sdb NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sdb 8:16 0 40G 0 disk ├─sdb1 8:17 0 30G 0 part └─sdb2 8:18 0 10G 0 part
# 创建 CHAP 用户名和密码,执行过不用执行第二遍 [root@iscsi-server ~]# targetcli /> cd iscsi/ /iscsi> set discovery_auth enable=1 userid=csq password=123789456csq # 设置单向认证 Parameter enable is now 'True'. Parameter userid is now 'csq'. Parameter password is now '123789456csq'. /iscsi> get discovery_auth DISCOVERY_AUTH CONFIG GROUP =========================== enable=True ----------- The enable discovery_auth parameter. mutual_password= ---------------- The mutual_password discovery_auth parameter. mutual_userid= -------------- The mutual_userid discovery_auth parameter. password=123789456csq # 单项认证的密码 ----------------- The password discovery_auth parameter. userid=csq # 单项认证的账户 ---------- The userid discovery_auth parameter. /iscsi> exit Global pref auto_save_on_exit=true Last 10 configs saved in /etc/target/backup/. Configuration saved to /etc/target/saveconfig.json
打开ISCSI发起程序,点击发现,发现门户,输入ISCSI服务端IP,点击高级,在启用CHAP登录前面打上对勾,输入名称机密,点击确定
然后点击目标,点击连接,就连接上了