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具有以下格式:

    iqn.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),使用InitiatorIQN限制客户端访问Target

  • TPG(Target Portal Group),是目标的完整配置,包括PortalLUNACL。 几乎所有目标都使用一个TPG,但是高级配置有时可能会定义多个TPG

  • discovery,查询服务器上有Target列表。

  • login,向Target验证,验证通过后即可以使用Target服务器提供的块设备。

配置 iSCSI Targets

配置 iSCSI Targets需要安装以下软件:

  • targetd,服务端软件。
  • targetcli,targetd服务配置工具。
#安装
[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

#创建卷组
[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
清理
/> /iscsi/ delete iqn.2025-11.cloud.zhang.storage.x8664:webapp01
/> /backstores/block/ delete webapp01
/> exit

非交互方式

命令行模式必须显式运行saveconfig子命令以保存配置。

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 服务访问存储

[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配置。典型情况,同一时刻只能激活一个组,一个组可以包含多个路径。当某个组故障,多路径进程将切换流量到不同组中。

配置多路径

# 配置多路径
# 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]
#  安装多路径软件
[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
[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