4.iSCSI 服务器
iSCSI 服务介绍
SCSI(Small Computer System Interface,小型计算机系统接口),一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)连接标准。
iSCSI (Internet Small Computer System Interface,Internet 小型计算机系统接口),又称为IP-SAN,是IBM公司研究开发的IP SAN技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,基于TCP/IP的协议连接iSCSI服务端(Target)和客户端(Initiator),使得封装后的SCSI数据包可以在互联网传输,最终实现iSCSI服务端提供存储给客户端。
通常,iSCSI使用专用的10 Gb以太网或更好的网络,以最大程度地提高性能。
从物理服务器到存储的电缆通常封闭在数据中心内,并且理想情况下不直接连接到LAN网络,所以SAN流量通常不加密,以最大程度地提高性能。 为了实现WAN安全,iSCSI管理员可以使用IPsec加密流量。
iSCSI 架构
iSCSI服务是C/S架构。访问的iSCSI目标在客户端系统上显示为本地且未格式化的SCSI快设备,等同于通过SCSI布线、FC直连或FC交换光线连接的设备。

-
Initiator ,iSCSI客户端,通常以软件方式部署,也可以使用iSCSI Host Bus Adapters (HBAs) (HBA)硬件。 Initiator必须具有唯一的名称(请参见IQN)。
-
Target,iSCSI服务器上的iSCSI存储资源。 Target必须具有唯一的名称(请参见IQN)。 每个目标都提供一个或多个块设备或逻辑单元(LUN-logical units)。 在大多数情况下,Target只提供一个设备,但一台服务器可以提供多个目标。
-
IQN(iSCSI Qualified Name)全球唯一的名称,用于标识发起者和目标。 IQN具有以下格式:
bashiqn.YYYY-MM.com.reversed.domain:name_string- YYYY-MM ,年和月。示例,2020年6月为2020-06。该日期有助于确保IQN唯一性。
- com.reversed.domain ,反向域名。 例如,
server.redhat.fun的反向域名为cloud.zhang.www。 - name_string,用于标识您管理的特定目标。 如果服务器只具有一个目标,则有时会省略此名称。
-
Portal,指定服务器监听的地址和端口,例如,172.25.250.50:3260。
-
LUN (Logical Unit Number),代表Target 提供的块设备。 每个目标可以提供一个或多个LUN。
-
ACL (Access Control List),使用Initiator 的IQN 限制客户端访问Target。
-
TPG (Target Portal Group),是目标的完整配置,包括Portal ,LUN 和ACL 。 几乎所有目标都使用一个TPG ,但是高级配置有时可能会定义多个TPG。
-
discovery ,查询服务器上有Target列表。
-
login ,向Target 验证,验证通过后即可以使用Target服务器提供的块设备。
配置 iSCSI Targets
配置 iSCSI Targets需要安装以下软件:
- targetd,服务端软件。
- targetcli,targetd服务配置工具。
bash
#安装
[root@storage ~ 13:41:29]# yum install -y targetcli targetd
#启动服务
[root@storage ~ 13:44:07]# systemctl enable target --now
Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
[root@storage ~ 13:44:18]# systemctl status target
● target.service - Restore LIO kernel target configuration
Loaded: loaded (/usr/lib/systemd/system/target.service; enabled; vendor preset: disabled)
Active: active (exited) since Fri 2025-11-21 13:43:45 CST; 34s ago
Main PID: 1449 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/target.service
配置 backstore 对象
backstore类型:
**block:**服务器中的块设备,例如磁盘驱动器,磁盘分区或逻辑卷。
**fileio:**本地文件系统中的常规文件。targetcli将该文件用作磁盘映像。
pscsi:物理SCSI设备。 这种类型的存储允许客户端通过网络访问服务器上的物理SCSI设备。
ramdisk:内存中的磁盘设备。 这种类型的存储不会持久存储数据。 服务器重新启动后,数据将丢失。
要使用targetcli 创建后备存储,请使用其create命令。 该命令的行为取决于您在配置树中的当前位置。
交互式使用targetcli
bash
#创建卷组
[root@storage ~ 13:47:05]# vgcreate webapp /dev/sdb
#创建逻辑卷
[root@storage ~ 13:47:35]# lvcreate -n webapp01 -L 50G webapp
#创建后备存储
[root@storage ~ 13:44:20]# 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]
#物理scsi
| o- pscsi ................ [Storage Objects: 0]
#内存空间
| o- ramdisk .............. [Storage Objects: 0]
o- iscsi .......................... [Targets: 0]
o- loopback ....................... [Targets: 0]
/> cd /backstores/block
/backstores/block> create webapp01 /dev/webapp/webapp01
Created block storage object webapp01 using /dev/webapp/webapp01.
/backstores/block> ls
.....
o- webapp01 [/dev/webapp/webapp01 (50.0GiB) write-thru deactivated]
......
#创建一个模板
/> cd /iscsi
/iscsi> create
/iscsi> ls
o- iscsi ............................ [Targets: 1]
o- iqn.2003-01.org.linux-iscsi.storage.x8664:sn.247ab4f6f63f [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> delete iqn.2003-01.org.linux-iscsi.storage.x8664:sn.994569e7db00
# 创建自己的IQN
/iscsi> create iqn.2025-11.cloud.zhang.storage.x8664:webapp01
#配置sisc
/iscsi/iqn.20...8664:webapp01> cd /iscsi/iqn.2025- 11.cloud.zhang.storage.x8664:webapp01/tpg1
# 设置具备特定iqn的客户端可以访问
/iscsi/iqn.20...webapp01/tpg1> acls/ create iqn.2025-11.cloud.zhang.storage.x8664:nginx
# 设置可以访问的设备
/iscsi/iqn.20...webapp01/tpg1> luns/ create /backstores/block/webapp01
#删除默认的portals
/iscsi/iqn.20...webapp01/tpg1> portals/ delete 0.0.0.0 3260
# 设置只允许通过10.1.8.10:3260
/iscsi/iqn.20...webapp01/tpg1> portals/ create 10.1.8.10 3260
#
/iscsi/iqn.20...webapp01/tpg1> ls
o- tpg1 ................... [no-gen-acls, no-auth]
o- acls .............................. [ACLs: 1]
| o- iqn.2025-11.cloud.zhang.storage.x8664:nginx [Mapped LUNs: 1]
| o- mapped_lun0 .. [lun0 block/webapp01 (rw)]
o- luns .............................. [LUNs: 1]
| o- lun0 [block/webapp01 (/dev/webapp/webapp01) (default_tg_pt_gp)]
o- portals ........................ [Portals: 1]
o- 10.1.8.10:3260 ....................... [OK]
# exit退出,自动保存
# 也可以手动saveconfig
Configuration saved to /etc/target/saveconfig.json
清理
bash
/> /iscsi/ delete iqn.2025-11.cloud.zhang.storage.x8664:webapp01
/> /backstores/block/ delete webapp01
/> exit
非交互方式
命令行模式必须显式运行saveconfig子命令以保存配置。
bash
targetcli /backstores/block create webapp01 /dev/webapp/webapp01
targetcli /iscsi create iqn.2025-11.cloud.zhang.storage.x8664:webapp
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/acls/ \
create iqn.2025-11.cloud.zhang.storage.x8664:nginx
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/luns/ \
create /backstores/block/webapp01
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/portals/ \
delete 0.0.0.0 3260
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/portals/ \
create 10.1.8.10 3260
targetcli saveconfig
配置客户端
配置客户端 nginx 服务访问存储
bash
[root@nginx ~ 15:00:30]# echo InitiatorName=iqn.2025-11.cloud.zhang.storage.x8664:nginx > /etc/iscsi/initiatorname.iscsi
[root@nginx ~ 15:01:11]# iscsiadm -m discovery -t st -p 10.1.8.10
10.1.8.10:3260,1 iqn.2025-11.cloud.zhang.storage.x8664:webapp01
[root@nginx ~ 15:01:18]# iscsiadm -m node -T iqn.2025-11.cloud.zhang.storage.x8664:webapp01 -l
Logging in to [iface: default, target: iqn.2025-11.cloud.zhang.storage.x8664:webapp01, portal: 10.1.8.10,3260] (multiple)
Login to [iface: default, target: iqn.2025-11.cloud.zhang.storage.x8664:webapp01, portal: 10.1.8.10,3260] successful.
#不成功重启
[root@nginx ~ 15:05:37]# systemctl restart iscsid
[root@nginx ~ 15:14:31]# mkfs.xfs /dev/sdb
[root@nginx ~ 15:15:12]# mount /dev/sdb /usr/share/nginx/html/
[root@nginx ~ 15:15:13]# echo Hello World From iSCSI > /usr/share/nginx/html/index.html
[root@storage ~ 15:09:14]# curl http://10.1.8.11
Hello World From iSCSI

多路径访问
什么是多路径
多路径是指服务器和存储阵列存在多个物理连接方式使用虚拟设备,这种方式可以提供更加弹性的存储连接(一个路径down掉不会影响连接性),也可以聚合存储带宽提供性能。
示例:

多路径由dm-multipath子系统提供,使用内核device mapper系统获得虚拟设备,有multipathd进程和multipath命令行工具管理。
软件包device-mapper-multipath提供必要的binaries daemon和kernel modules。安装、配置、启动后,多路径设备节点会创建在两个位置。
出于管理目的,multipath设备创建在/dev/mapper,如果选择了user-friendly名称,这些设备也可以命名为mpathN [pM],或者配置在World Wide ID(WWID)之后。管理员也可以自定义多路径设备名,这些自定义名称在multipaths配置文件的multipaths部分使用alias选项定义。
多路径设备也会创建在/dev目录,格式/dev/dm-N与/dev/mapper下的文件匹配。这些设备提供给系统内部使用,禁止管理目的直接使用。
重要:多路径提供存储访问路径down情况的保护。如果存储本身不可用,访问访问存储也会不可用。
创建多路径设备,不同的路径将会合并到组中,取决于/etc/multipath.conf配置。典型情况,同一时刻只能激活一个组,一个组可以包含多个路径。当某个组故障,多路径进程将切换流量到不同组中。
配置多路径
bash
# 配置多路径
# storage和nginx各添加一块vmnet1网卡
# 在 server 端添加 portals
[root@storage ~ 16:28:58]# targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp01/tpg1/portals/ create 10.1.1.10 3260
Using default IP port 3260
Created network portal 10.1.1.10:3260.
#保存
[root@storage ~ 16:31:03]# targetcli saveconfig
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
#查看
[root@storage ~ 16:31:16]# targetcli ls /iscsi
o- iscsi ............................ [Targets: 1]
o- iqn.2025-11.cloud.zhang.storage.x8664:webapp01 [TPGs: 1]
o- tpg1 ............... [no-gen-acls, no-auth]
o- acls .......................... [ACLs: 1]
| o- iqn.2025-11.cloud.zhang.storage.x8664:nginx [Mapped LUNs: 1]
| o- mapped_lun0 [lun0 block/webapp01 (rw)]
o- luns .......................... [LUNs: 1]
| o- lun0 [block/webapp01 (/dev/webapp/webapp01) (default_tg_pt_gp)]
o- portals .................... [Portals: 2]
o- 10.1.1.10:3260 ................... [OK]
o- 10.1.8.10:3260 ................... [OK]
bash
# 安装多路径软件
[root@nginx ~ 16:34:45]# yum install -y device-mapper-multipath
# 生成配置文件
[root@nginx ~ 17:10:59]# mpathconf --enable
[root@nginx ~ 17:11:06]# ls /etc/multipath.conf
/etc/multipath.conf
[root@nginx ~ 17:11:13]# systemctl enable multipathd.service
[root@nginx ~ 17:11:21]# systemctl restart multipathd
bash
[root@nginx ~ 16:44:06]# lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 50G 0 disk /usr/share/nginx/html
sdc 8:32 0 50G 0 disk
[root@nginx ~ 17:25:21]# lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 50G 0 disk
└─mpatha 253:3 0 50G 0 mpath
sdc 8:32 0 50G 0 disk
└─mpatha 253:3 0 50G 0 mpath
# 查看多路径设备
[root@nginx ~ 17:25:33]# multipath -ll
mpatha (360014056537adbca9984c91acfb68aa1) dm-3 LIO-ORG ,webapp01
size=50G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 3:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 4:0:0:0 sdc 8:32 active ready running
# 通过设备编号wwn确保sdb和sdc是同一设备
[root@nginx ~ 17:08:00]# /usr/lib/udev/scsi_id -g -u /dev/sdb
360014056537adbca9984c91acfb68aa1
[root@nginx ~ 17:09:50]# /usr/lib/udev/scsi_id -g -u /dev/sdc
360014056537adbca9984c91acfb68aa1
[root@nginx ~ 08:52:48]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─centos_centos7-root 253:0 0 50G 0 lvm /
├─centos_centos7-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos_centos7-home 253:2 0 145.1G 0 lvm /home
sdb 8:16 0 50G 0 disk
└─mpatha 253:3 0 50G 0 mpath
sdc 8:32 0 50G 0 disk
└─mpatha 253:3 0 50G 0 mpath
sr0 11:0 1 4.4G 0 rom
[root@nginx ~ 08:53:57]# lsblk /dev/mapper/mpatha
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mpatha 253:3 0 50G 0 mpath
# 多路径设备识别有问题,需要重启系统再挂载
[root@nginx ~ 08:54:11]# mount /dev/mapper/mpatha /usr/share/nginx/html/
[root@nginx ~ 08:54:27]# df /usr/share/nginx/html
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos_centos7-root 52403200 1677284 50725916 4% /
[root@nginx ~ 08:54:38]# reboot
[root@nginx ~ 08:56:55]# mount /dev/mapper/mpatha /usr/share/nginx/html/
[root@nginx ~ 08:57:04]# df /usr/share/nginx/html
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/mpatha 52403200 32996 52370204 1% /usr/share/nginx/html
[root@nginx ~ 08:57:06]# cat /usr/share/nginx/html/index.html
Hello World From iSCSI
# 修改设备名称
[root@nginx ~ 08:57:20]# umount /usr/share/nginx/html/
[root@nginx ~ 08:59:08]# vim /etc/multipath.conf
# 文件末尾添加
multipaths {
multipath {
wwid 360014056537adbca9984c91acfb68aa1
alias webapp
path_grouping_policy failover
}
}
[root@nginx ~ 09:00:19]# systemctl restart mult
[root@nginx ~ 09:01:20]# mount -a
#查看多路径名称变更为 webapp
[root@nginx ~ 09:01:32]# multipath -ll
webapp (360014056537adbca9984c91acfb68aa1) dm-3
size=50G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=acti
| `- 3:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=0 status=enab
`- 4:0:0:0 sdc 8:32 failed faulty running
# 记得修正/etc/fstab中设备名称
# 高可用测试
web服务器监控设备状态
[root@nginx ~ 09:12:35]# watch multipath -ll
# 存储端断第二个网络
[root@nginx ~ 09:13:03]# nmcli device disconnect ens33
Device 'ens33' successfully disconnected.
# 稍等片刻发现设备状态为 failed faulty
webapp (360014056537adbca9984c91acfb68aa1) dm-
size=50G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=act
| `- 3:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=0 status=ena
`- 4:0:0:0 sdc 8:32 failed faulty running
#不影响服务访问
[root@storage ~ 08:49:47]# curl http://10.1.8.11/hello word from iscsi