Skip to main content

第17章 使用 iSCSI 服务部署网络存储

章节简述

本章开篇介绍了计算机硬件存储设备的不同接口技术及其各自的优缺点,作为引入 iSCSI 技术主题的切入点。iSCSI 技术实现了物理磁盘设备与 TCP/IP 网络协议的完美结合,使用户能够通过互联网便捷地访问远程机房提供的共享存储资源。随后,本章将带领读者在 Linux 系统上部署 iSCSI 服务端程序,并展示如何分别在 Linux 系统和 Windows 系统中访问这些远程存储资源。通过本章的学习并结合第6 章和第7 章的内容,读者将进一步加深对如何在Linux 系统中管理磁盘设备和存储资源的理解,为今后走向运营岗位打下坚实的基础。

17.1 iSCSI 技术介绍

磁盘是计算机硬件设备中不可或缺的重要组成部分,磁盘存储设备的读写速度对服务器的整体性能有着直接影响。在第 6 章和第 7 章中,我们讨论了磁盘存储结构、RAID 磁盘阵列技术以及 LVM 技术等存储技术,这些技术尽管有软件层面和硬件层面的区别,但都旨在解决磁盘存储设备的读写速度问题,并致力于保障数据的安全性。

为了进一步提升磁盘存储设备的读写速度和性能,人们一直在努力改进物理磁盘设备的接口协议。目前常见的磁盘接口类型主要有以下 3 种。

IDE:一种成熟稳定、价格低廉的并行传输接口,适用于经济型设备。

SATA:一种传输速度更快、数据校验更可靠的串行传输接口,广泛应用于现代计算机中。

SCSI:一种系统级接口标准,常用于计算机与磁盘、光驱等设备之间,具有系统资源占用低、转速高、传输速度快等优点。

无论采用哪种磁盘接口,磁盘数据总是通过计算机主板上的总线与 CPU、内存进行交换。然而,这种物理环境上的限制给磁盘资源的共享带来了诸多不便。为了解决这一问题,IBM 公司研发了一种基于TCP/IP 和 SCSI 的新型存储技术—互联网小型计算机系统接口(iSCSI, Internet Small Computer System Interface)。iSCSI 技术将 SCSI 与以太网技术结合,使用户能够在网络中传输 SCSI 的命令和数据,从而打破了传统 SCSI 设备的物理限制,实现了跨区域的存储资源共享,并且可以在不中断系统运行的情况下扩展存储容量。

为了让各位读者做到知其然,知其所以然,以便在工作中灵活使用这项技术,下面将 讲解一下 iSCSI 技术在生产环境中的优势和劣势。iSCSI 存储技术极为便捷,它改变了传统的存储资源访问方式,摆脱了物理环境的限制,并允许多个服务器共享存储资源,因此 非常适合企业使用。然而,iSCSI 技术也受到网络速度的制约。以往磁盘设备直接通过主板上的总线进行数据传输,现在则需要让互联网作为数据传输的载体和通道,因此传输速率和稳定性是 iSCSI 技术的瓶颈。不过,随着网络技术的持续发展,相信 iSCSI 技术也会随之得以改善。

既然要通过以太网来传输磁盘设备上的数据,那么数据是通过网卡传入计算机中的吗? 这就有必要向大家介绍 iSCSI-HBA(Host Bus Adapter,主机总线适配器)硬件卡了(见图 17-1)。与一般的网卡不同(连接网络总线和内存,供计算机上网使用),iSCSI-HBA 硬件卡连接的则是 SCSI 或 FC(光纤通道)总线和内存,专门用于在主机之间交换存储数据,其使用的协议也与一般网卡有本质的不同。运行 Linux 系统的服务器会基于 iSCSI 协议把磁盘设备命令与数据打包成标准的 TCP/IP 数据包,然后通过以太网传输到目标存储设备,而当目标存储设备接收到这些数据包后,还需要基于 iSCSI 协议把 TCP/IP 数据包解压成磁盘设备命令与数据。

图17-1 iSCSI-HBA 硬件卡实拍图

总结来说,iSCSI 技术具有硬件成本低、操作简单、维护方便以及可扩展性强等优势, 为我们提供了数据集中化存储的服务,而且其以区块为单位的数据存储空间,在简化了存储空间管理步骤的前提下,还增添了存储空间的弹性。对于用户而言,仿佛计算机上多了一块新的“本地磁盘”,可以使用本地的计算机操作系统进行管理,就像是使用本地磁盘那样来使用远程存储空间。这种高扩展性和低组建成本、低维护成本的整合存储方式,尤其适合预算有限的中小企业和办公室使用。

17.2 创建 RAID 磁盘阵列

既然要使用 iSCSI 存储技术为远程用户提供共享存储资源,首先要保障用于存放资源的服务器的稳定性与可用性,否则一旦在使用过程中出现故障,则维护的难度相较于本地磁盘设备要更加复杂、困难。因此推荐各位读者按照本书第 7 章讲解的知识来部署 RAID 磁盘阵列组,确保数据的安全性。下面以配置 RAID 5 磁盘阵列组为例进行讲解。考虑到第 7 章已经事无巨细地讲解了 RAID 磁盘阵列技术和配置方法,因此本节不会重复介绍相关参数的意义以及用途,忘记了的读者可以返回去看一下。

首先在虚拟机中添加 4 块新磁盘,用于创建 RAID 5 磁盘阵列和备份盘,如图 17-2 所示。

图17-2 添加4块用于创建RAID 5级别磁盘阵列的新硬盘

启动虚拟机系统,使用 mdadm 命令创建RAID 磁盘阵列。其中,-Cv 参数为创建阵列并显示过程,/dev/md0 为生成的阵列组名称,-n 3 参数为创建 RAID 5 磁盘阵列所需的磁盘个数,-l 5 参数为 RAID 磁盘阵列的级别,-x 1 参数为磁盘阵列的备份盘个数。在命令后面要逐一写上使用的磁盘名称。另外,还允许使用第 3 章讲解的通配符来指定磁盘设备的名称,感兴趣的读者可以试一下。

root@linuxprobe:~# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
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.

在上述命令成功执行之后,得到一块名称为/dev/md0 的新设备,这是一块 RAID 5 级别的磁盘阵列,并且还有一块备份盘为磁盘数据保驾护航。大家可使用 mdadm -D 命令查看设备的详细信息。另外,由于在使用远程设备时极有可能出现设备识别顺序发生变化的情况, 因此,如果直接在 fstab 挂载配置文件中写入/dev/sdb、/dev/sdc 等设备名称的话,极有可能在下一次挂载了错误的存储设备。而 UUID 值是设备的唯一标识符,可用于精确地区分本地或远程设备。我们先把这个值记录下来,一会儿填写到挂载配置文件中。

root@linuxprobe:~# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Apr 4 02:17:44 2025
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 : Fri Apr 4 02:19:29 2025
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Consistency Policy : resync

Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : af6bd598:f912ea12:d45fb1b8:8aeb9c2d
Events : 18

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd

3 8 64 - spare /dev/sde

17.3 配置iSCSI服务端

iSCSI 技术在工作形式上分为服务端(target)与客户端(initiator)。iSCSI 服务端即用于存放磁盘存储资源的服务器,它作为前面创建的 RAID 磁盘阵列的存储端,能够为用户提供可用的存储资源。iSCSI 客户端则是用户使用的软件,用于访问远程服务端的存储资源。

下面按照表 17-1 来配置 iSCSI 服务端和客户端所用的 IP 地址。

表 17-1 iSCSI 服务端和客户端的操作系统以及 IP 地址

主机名称操作系统IP 地址
iSCSI 服务端RHEL 10192.168.10.10
iSCSI 客户端RHEL 10192.168.10.20

第 1 步:在 RHEL/CentOS Stream10 系统中,默认已经安装了 iSCSI 服务端程序,用户需要做的是配置好软件仓库后安装 iSCSI 服务端的交互式配置工具。相较于直接修改配置文件, 通过交互式的配置过程来完成对参数的设定既方便又安全。在 dnf 命令的后面添加-y 参数后,在安装过程中就不需要再进行手动确认了。

root@linuxprobe:~# dnf install -y targetcli
Updating Subscription Management repositories.
Last metadata expiration check: 0:00:28 ago on Fri 04 Apr 2025 02:21:55 AM CST.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
targetcli noarch 2.1.58-2.el10 AppStream 95 k
Installing dependencies:
python3-configshell noarch 1:1.1.30-7.el10 BaseOS 92 k
python3-kmod x86_64 0.9.2-5.el10 BaseOS 114 k
python3-pyparsing noarch 3.1.1-5.el10 BaseOS 273 k
python3-rtslib noarch 2.1.76-8.el10 AppStream 128 k
python3-typing-extensions noarch 4.9.0-5.el10 BaseOS 81 k
python3-urwid x86_64 2.5.3-3.el10 BaseOS 1.1 M
python3-wcwidth noarch 0.2.6-4.el10 BaseOS 50 k
target-restore noarch 2.1.76-8.el10 AppStream 17 k
………………省略部分输出信息………………
Installed:
python3-configshell-1:1.1.30-7.el10.noarch
python3-kmod-0.9.2-5.el10.x86_64
python3-pyparsing-3.1.1-5.el10.noarch
python3-rtslib-2.1.76-8.el10.noarch
python3-typing-extensions-4.9.0-5.el10.noarch
python3-urwid-2.5.3-3.el10.x86_64
python3-wcwidth-0.2.6-4.el10.noarch
target-restore-2.1.76-8.el10.noarch
targetcli-2.1.58-2.el10.noarch

Complete!

iSCSI 是跨平台的协议,因此用户也可以在 Windows 系统下搭建 iSCSI 服务端,之后再共享给 Linux 系统主机。不过根据刘遄老师以往的经验,类似于 DataCore 软件公司推出的SANmelody 或是 FalconStor 软件公司推出的 iSCSI Server for Windows 等软件,在 Windows 系统上使用都是要收费的。

第 2 步:配置 iSCSI 服务端共享资源。targetcli 是用于管理 iSCSI 服务端存储资源的专用配置命令,它能够提供类似于fdisk 命令的交互式配置功能,将 iSCSI 共享资源的配置内容抽象成“目录”的形式,我们只需将各类配置信息填入相应的“目录”中即可。这里的难点主要在于认识每个“参数目录”的作用。当把配置参数正确地填写到“目录”中后,iSCSI 服务端也就能提供共享资源服务了。

在执行 targetcli 命令后就能看到交互式的配置界面了。在该界面中允许使用很多

Linux 命令,比如利用 ls 查看目录参数的结构,使用cd 切换到不同的目录中。

root@linuxprobe:~# targetcli
targetcli shell version 2.1.58
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]
o- vhost ........................................................ [Targets: 0]

/backstores/block 是 iSCSI 服务端配置共享设备的位置。我们需要把刚刚创建的RAID 5 磁盘阵列 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]
o- vhost ........................................................ [Targets: 0]

第 3 步:创建iSCSI target 名称及配置共享资源。iSCSI target 名称是由系统自动生成的, 这是一串用于描述共享资源的唯一字符串。稍后用户在扫描 iSCSI 服务端时即可看到这个字符串,因此不需要记住它。

/> cd iscsi
/iscsi> create
Created target iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95.
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.linuxprobe.x8664:sn.bdf25f04da95 .... [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]

Tips :
请注意,在 iSCSI 自动生成的名称中,最后一个.为句号,不是名称中的一部分。

系统在生成这个 target 名称后,还会在/iscsi 参数目录中创建一个与其字符串同名的新“目录”以存放共享资源。我们需要把前面加入 iSCSI 共享资源池中的磁盘设备添加到这个新目录中,这样用户在登录 iSCSI 服务端后,即可默认使用该磁盘设备提供的共享存储资源了。

/iscsi> cd iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95/
/iscsi/iqn.20....bdf25f04da95> cd tpg1/luns
/iscsi/iqn.20...a95/tpg1/luns> create /backstores/block/disk0
Created LUN 0.

第 4 步:设置访问控制列表(ACL)。iSCSI 协议是通过客户端名称进行验证的。也就是说,用户在访问存储共享资源时不需要输入密码,只要 iSCSI 客户端的名称与服务端中设置的访问控制列表中某一名称条目一致即可,因此需要在 iSCSI 服务端的配置文件中写入一串能够验证用户信息的名称。acls 参数目录用于存放允许访问iSCSI 服务端共享存储资源的客户端名称。推荐在系统刚刚生成的 iSCSI target 后面追加上类似于:client 的参数,这样既能保证客户端的名称具有唯一性,又非常便于管理和阅读。

/iscsi/iqn.20...a95/tpg1/luns> cd ..
/iscsi/iqn.20...5f04da95/tpg1> cd acls
/iscsi/iqn.20...a95/tpg1/acls> create iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95:client
Created Node ACL for iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95:client
Created mapped LUN 0.

第 5 步:设置 iSCSI 服务端的监听 IP 地址和端口号。位于生产环境中的服务器上可能有多块网卡,那么到底是由哪块网卡或 IP 地址对外提供共享存储资源呢?在配置文件中默认是允许所有网卡提供 iSCSI 服务,如果你认为这有些许不安全,可以手动删除。

/iscsi/iqn.20...a95/tpg1/acls> 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 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260

继续进行设置,使系统使用服务器IP 地址192.168.10.10 的3260 端口向外提供iSCSI共享存储资源服务。

/iscsi/iqn.20.../tpg1/portals> create 192.168.10.10
Using default IP port 3260
Created network portal 192.168.10.10:3260.

第 6 步:在参数文件配置妥当后,浏览刚刚配置的信息,确保上述提到的“目录”都已经填写了正确的内容。在确认信息无误后输入 exit 命令退出配置。注意,千万不要习惯性地按Ctrl+C 组合键来结束进程,这样不会保存配置文件,我们的工作也就白费了。

/iscsi/iqn.20.../tpg1/portals> cd /
/> 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.linuxprobe.x8664:sn.bdf25f04da95 .. [TPGs: 1]
| o- tpg1 ........................................... [no-gen-acls, no-auth]
| o- acls ...................................................... [ACLs: 1]
| | o- iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95:client [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.10.10:3260 ........................................... [OK]
o- loopback ..................................................... [Targets: 0]
o- vhost ........................................................ [Targets: 0]
/> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json

设置firewalld 防火墙,使其放行iSCSI 服务或 3260/TCP 端口号:

root@linuxprobe:~# firewall-cmd --permanent --add-port=3260/tcp 
success
root@linuxprobe:~# firewall-cmd --reload
success

17.4 配置Linux客户端

我们在前面的章节中已经配置了很多 Linux 服务,基本上可以说,无论是什么服务,客户端的配置步骤都要比服务端的配置步骤简单一些。在 RHEL 10 系统中,已经默认安装了iSCSI 客户端服务程序 initiator。如果你的系统没有安装,可以使用软件仓库手动安装。

root@linuxprobe:~# dnf install iscsi-initiator-utils
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Package iscsi-initiator-utils-6.2.1.9-21.gita65a472.el10.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

前面讲到,iSCSI 协议是通过客户端的名称来进行验证的,而该名称也是 iSCSI 客户端的唯一标识,而且必须与服务端配置文件中访问控制列表中的信息一致,否则客户端在尝试访问存储共享设备时,系统会弹出验证失败的报错信息。

下面编辑 iSCSI 客户端中的 initiator 名称文件,把服务端的访问控制列表名称填写进来,然后重启客户端 iscsid 服务程序并将其加入到开机启动项中:

root@linuxprobe:~# vim /etc/iscsi/initiatorname.iscsi 
InitiatorName=iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95:client
root@linuxprobe:~# systemctl restart iscsid
root@linuxprobe:~# systemctl enable iscsid
Created symlink '/etc/systemd/system/multi-user.target.wants/iscsid.service' → '/usr/lib/systemd/system/iscsid.service'.

iSCSI 客户端访问并使用共享存储资源的步骤很简单,只需要记住刘遄老师的一个小口诀—先发现,再登录,最后挂载并使用。iscsiadm 是用于管理、查询、插入、更新或删除 iSCSI 数据库配置文件的命令行工具,用户需要先使用这个工具扫描发现远程 iSCSI 服务端,然后查看找到的服务端上有哪些可用的共享存储资源。其中,-m discovery 参数的目的是扫描并发现可用的存储资源,-t st 参数为执行扫描操作的类型,-p 192.168.10.10 参数为 iSCSI 服务端的IP 地址。

root@linuxprobe:~# iscsiadm -m discovery -t st -p 192.168.10.10
192.168.10.10:3260,1 iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95

在使用 iscsiadm 命令发现了远程服务器上可用的存储资源后,接下来准备登录 iSCSI 服务端。其中,-m node 参数为将客户端所在主机作为一台节点服务器,-T 参数为要使用的存储资源(大家可以直接复制前面命令中扫描发现的结果,以免录入错误), -p 192.168.10.10 参数依然为对方 iSCSI 服务端的 IP 地址。最后使用--login 或-l 参数进行登录验证。

root@linuxprobe:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95 -p 192.168.10.10 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95, portal: 192.168.10.10,3260]
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95, portal: 192.168.10.10,3260] successful.

在iSCSI 客户端成功登录之后,会在客户端主机上多出一个名为/dev/sdb 的设备文件。第 6 章曾经讲过,udev 服务在命名磁盘名称时,与磁盘插槽是没有关系的。接下来便能够像使用本地主机上的磁盘那样来操作这个设备文件了。

root@linuxprobe:~# ls -l /dev/sdb
brw-rw----. 1 root disk 8, 16 Apr 3 18:37 /dev/sdb
root@linuxprobe:~# file /dev/sdb
/dev/sdb: block special (8/16)

下面进入标准的磁盘操作流程。考虑到大家已经在第 6 章学习了这部分内容,外加这个设备文件本身只有 40GB 的容量,因此不必进行分区,而是直接格式化并挂载使用。

root@linuxprobe:~# mkfs.xfs /dev/sdb
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/sdb isize=512 agcount=16, agsize=654720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=1
= reflink=1 bigtime=1 inobtcount=1 nrext64=1
data = bsize=4096 blocks=10475520, imaxpct=25
= sunit=128 swidth=256 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
root@linuxprobe:~# mkdir /iscsi
root@linuxprobe:~# mount /dev/sdb /iscsi

不放心的话,可以使用 df 命令查看挂载情况:

root@linuxprobe:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 3.8G 13G 23% /
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.9G 84K 1.9G 1% /dev/shm
efivarfs 256K 56K 196K 23% /sys/firmware/efi/efivars
tmpfs 776M 9.7M 767M 2% /run
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
/dev/sda2 960M 272M 689M 29% /boot
/dev/sr0 6.5G 6.5G 0 100% /media/cdrom
/dev/sda1 599M 8.3M 591M 2% /boot/efi
tmpfs 388M 124K 388M 1% /run/user/0
/dev/sdb 40G 816M 40G 2% /iscsi

从此以后,这个设备文件就如同客户端本机上的磁盘那样工作。需要提醒大家的是,由于 udev 服务是按照系统识别磁盘设备的顺序来命名磁盘设备的,当客户端主机同时使用多个远程存储资源时,如果下一次识别远程设备的顺序发生了变化,则客户端挂载目录中的文件也将随之混乱。为了防止发生这样的问题,应该在/etc/fstab 配置文件中使用设备的UUID 进行挂载。这样,无论远程设备资源的识别顺序怎么变化,系统也能正确找到设备对应的目录。

blkid 命令用于查看设备的名称、文件系统及 UUID。可以使用管道符(详见第 3 章) 进行过滤,只显示与/dev/sdb 设备相关的信息:

root@linuxprobe:~# blkid | grep /dev/sdb
/dev/sdb: UUID="075956f7-ec81-420e-8e11-e165a4e2fb66" BLOCK_SIZE="512" TYPE="xfs"

还要再啰嗦一句,由于/dev/sdb 是一块网络存储设备,而 iSCSI 协议是基于 TCP/IP 网络传输数据的,因此必须在/etc/fstab 配置文件中添加上_netdev 参数,表示当系统联网后再进行挂载操作,以免系统开机时间过长或开机失败:

root@linuxprobe:~# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Mar 12 20:08:04 2025
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=016bb74f-bfa8-4d80-aa6d-d5693c39a844 / xfs defaults 0 0
UUID=c34124dd-c66e-4cbe-ba04-528666d30dc0 /boot xfs defaults 0 0
UUID=9A1A-B195 /boot/efi vfat umask=0077,shortname=winnt 0 2
UUID=299dacfd-f999-48d8-bca4-e5274ac600a8 none swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
UUID="075956f7-ec81-420e-8e11-e165a4e2fb66" /iscsi xfs defaults,_netdev 0 0

如果不再需要使用 iSCSI 共享设备资源,可以用 iscsiadm 命令的-u 参数将其设备卸载:

root@linuxprobe:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95 -u
Logging out of session [sid: 1, target: iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95, portal: 192.168.10.10,3260]
Logout of [sid: 1, target: iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.bdf25f04da95, portal: 192.168.10.10,3260] successful.

这种获取 iSCSI 远程存储的方法依赖的是 RHEL 10 系统自带的 iSCSI initiator 软件程序。该软件程序将以太网卡虚拟成 iSCSI 卡,进而接收数据,然后基于 TCP/IP 在主机与iSCSI 存储设备之间实现数据传输功能。这种方式仅需主机与网络即可实现,因此成本是最低的。但是,在采用这种方式传输数据时,与 iSCSI 和 TCP/IP 相关的命令数据会消耗客户端自身的CPU 计算性能,因此存在一定的额外开销。一般建议在低 I/O 或者低带宽要求的环境中使用这种方式。

如果在后续的生产环境中需要进行大量的远程数据存储,建议自行配备 iSCSI-HBA 硬件卡设备,并将其安装到 iSCSI 服务器上,从而实现 iSCSI 服务器与交换机之间、iSCSI 服务器与客户端之间的高效数据传输。与 initiator 的软件方式相比,iSCSI-HBA 硬件卡设备不需要消耗 CPU 计算性能,而且它是专用的远程数据存储设备,因此对 iSCSI 的支持也会更好。但是,iSCSI-HBA 硬件卡设备的价格会稍微贵一些,大家需要在性能和成本之间进行权衡。

17.5 配置 Windows 客户端

使用 Windows 系统的客户端也可以正常访问iSCSI 服务器上的共享存储资源,而且操作原理及步骤与 Linux 系统的客户端基本相同。在进行下面的实验之前,请先关闭 Linux 系统客户端,以免这两台客户端主机同时使用 iSCSI 共享存储资源而产生潜在问题。下面按照表17-2 来配置 iSCSI 服务端和Windows 客户端所用的 IP 地址。

表 17-2 iSCSI 服务端和客户端的操作系统以及 IP 地址

主机名称操作系统IP 地址
iSCSI 服务端RHEL 10192.168.10.10
Windows 系统客户端Windows 11192.168.10.30

第 1 步:运行 iSCSI 发起程序。在 Windows 11 操作系统中已经默认安装了 iSCSI 客户端程序,我们只需在控制面板中找到“系统和安全”选项卡,然后单击“Windows 工具”(见图 17-3),进入“Windows 工具”页面后即可看到“iSCSI 发起程序”图标。双击该图标,在第一次运行 iSCSI 发起程序时,系统会提示“Microsoft iSCSI 服务尚未运行”,单击“是”按钮即可自动启动并运行 iSCSI 发起程序,如图 17-4 所示。

图17-3 在控制面板中单击“Windows工具”

图17-4 双击“iSCSI发起程序”图标

第 2 步:扫描发现 iSCSI 服务端上可用的存储资源。无论是 Windows 系统还是 Linux 系统,要想使用 iSCSI 共享存储资源,都必须先进行扫描发现操作。运行 iSCSI 发起程序后在“目标”选项卡的“目标”文本框中写入 iSCSI 服务端的 IP 地址,然后单击“快速连接”按钮,如图 17-5 所示。

在弹出的“快速连接”对话框中可以看到共享的磁盘存储资源,此时显示“无法登录到目标”属于正常情况,单击“完成”按钮即可,如图 17-6 所示。

图17-5 填写iSCSI服务端的IP地址

图17-6 在“快速连接”提示框中看到的共享的硬盘存储资源

回到“目标”选项卡页面,看到共享存储资源的名称已经出现,如图 17-7 所示。

图17-7 在“目标”选项卡中看到了共享存储资源

第 3 步:准备连接 iSCSI 服务端的共享存储资源。由于在 iSCSI 服务端程序上设置了 ACL, 使得只有客户端名称与 ACL 策略中的名称保持一致时才能使用远程存储资源,因此首先需要在“配置”选项卡中单击“更改”按钮(见图 17-8),随后在修改界面写入 iSCSI 服务器配置过的 ACL 策略名称(见图 17-9),最后重新返回到 iSCSI 发起程序的“目标”选项卡界面(见图 17-10)。

图17-8 更改客户端的发起程序名称

图17-9 修改iSCSI发起程序的名称

图17-10 返回到“目标”界面

在确认 iSCSI 发起程序名称与 iSCSI 服务器 ACL 策略一致后,重新单击“连接”按钮, 如图 17-11 所示,并单击“确认”按钮。大约 1~3 秒后,状态会更新为“已连接”,如图 17-12 所示。

图17-11 尝试连接iSCSI存储目标

图17-12 成功连接到远程共享存储资源

第4 步:访问 iSCSI 远程共享存储资源。右键单击桌面上的“计算机”图标,打开计算机管理程序,如图 17-13 所示。

图17-13 计算机管理程序的界面

开始对磁盘进行初始化操作,如图 17-14 所示。Windows 系统用来初始化磁盘设备的步骤十分简单,各位读者都可以玩得转 Linux 系统,相信 Windows 系统就更不在话下了。Windows 系统的初始化过程步骤如图 17-15 到图 17-21 所示。

图17-14 对磁盘设备进行初始化操作

图17-15 开始使用“新建简单卷向导”

图17-16 对磁盘设备进行分区操作

图17-17 设置系统中显示的盘符

图17-18 设置磁盘设备的格式以及卷标

图17-19 检查磁盘初始化信息是否正确

图17-20 等待磁盘设备初始化过程结束

图17-21 磁盘初始化完毕后弹出设备图标

接下来即可进入正常的使用过程。由于整个传输过程是完全透明的,而且像一块本地 磁盘那样稳定,因此不知情的用户可能都察觉不到这是一块远程存储设备。不过,这只是 理论状态,实际上 iSCSI 在数据传输速率方面,难以与本地磁盘相媲美,会或多或少地受到网络带宽的影响,只不过差别不明显罢了。考虑到 iSCSI 技术还有一个优势,就是安全性高,这对于数据集中存储来讲显得十分重要。因此,在进行数据存储与传输时,iSCSI 值得一试!

复习题

  1. 简述iSCSI 技术在生产环境中的作用。

    答:iSCSI 技术通过把硬件存储设备与 TCP/IP 网络协议相结合,使得用户可以通过互联网方便地访问远程机房提供的共享存储资源。

  2. 在 Linux 系统中,iSCSI 服务端和 iSCSI 客户端所使用的服务程序分别叫什么?

    答:iSCSI 服务端程序为 targetcli,iSCSI 客户端程序为 initiator。

  3. 在使用 targetcli 命令配置 iSCSI 服务端配置文件时,acls 与 portals 参数目录中分别存放什么内容?

    答:acls 参数目录用于存放能够访问 iSCSI 服务端共享存储资源的客户端名称,portals 参数目录用于定义由服务器的哪个 IP 地址对外提供共享存储资源服务。

  4. iSCSI 协议占用了服务器的哪个协议和端口号?

    答:iSCSI 协议占用了服务器TCP 的 3260 端口号。

  5. 用户在填写 fstab 设备挂载配置文件时,一般会把远程存储资源的 UUID(而非设备的名称)填写到配置文件中。这是为什么?

    答:在Linux 系统中,设备名称是由 udev 服务进行管理的,而 udev 服务的设备命名规则是由设备类型及系统识别顺序等信息共同组成的。考虑到网络存储设备具有识别顺序不稳定的特点,所以为了避免识别顺序混乱造成的挂载错误问题,故使用 UUID 进行挂载操作。

  6. 在使用 Windows 系统访问iSCSI 共享存储资源时,它有两个步骤与 Linux 系统一样。请说明是哪两个步骤。

    答:扫描并发现服务端上可用的 iSCSI 共享存储资源;验证登录。

  7. 如果没有购买 iSCSI-HBA 硬件卡的预算,使用主机网卡接口可以吗?

    答:可以的,没问题。

  8. 使用targetcli 命令配置完毕后,如何保存退出?

    答:需执行 exit 命令进行保存退出,切记不要使用 Ctrl+C 组合键,因为这不会保存配置文件。

  9. 如果系统没有默认安装 iSCSI 客户端,应如何操作?

    答:可执行命令 dnf install iscsi-initiator-utils 进行安装。

  10. 当不再需要使用iSCSI 服务时,应如何操作?

    答:需使用 iscsiadm 命令的-u 参数进行卸载操作。