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 流量通常不加密,以尽量提高性能。若要在广域网上保证安全,iSCSI 管理员可以使用 IPsec 对流量加密。

iSCSI 架构

iSCSI 服务采用 C/S 架构。在客户端系统上,访问的 iSCSI 目标显示为本地、未格式化的 SCSI 块设备,其效果类似于通过 SCSI 线缆、FC 直连或 FC 交换光纤连接的设备。

Initiator

iSCSI 客户端,通常以软件方式部署,也可使用 iSCSI Host Bus Adapter(HBA)硬件。Initiator 必须具有唯一名称(见下文 IQN)。

Target

iSCSI 服务器上的 iSCSI 存储资源。Target 必须具有唯一名称(见 IQN)。每个目标可提供一个或多个块设备或逻辑单元(LUN,logical units)。多数情况下一个 Target 只提供一个设备,但一台服务器可以提供多个目标。

IQN

IQN(iSCSI Qualified Name)是用于标识发起者与目标的全球唯一名称,格式如下:

iqn.YYYY-MM.com.reversed.domain:name_string
  • YYYY-MM:年、月。例如 2020 年 6 月为 2020-06,有助于保证 IQN 唯一性。
  • com.reversed.domain:反向域名。例如 server.redhat.fun 写作 fun.redhat.serverwww.testing.cloud 写作 cloud.testing.www
  • name_string:用于标识您管理的具体目标。若服务器只有一个目标,有时会省略该段。

Portal

指定服务器监听的地址和端口,例如 172.25.250.50:3260

LUN

LUN(Logical Unit Number)表示 Target 提供的块设备。每个目标可以提供一个或多个 LUN

ACL

ACL(Access Control List)使用 InitiatorIQN 限制客户端对 Target 的访问。

TPG

TPG(Target Portal Group)是目标的完整配置,包括 PortalLUNACL。几乎所有目标只使用一个 TPG;高级场景下可能定义多个 TPG

discovery / login

  • discovery:查询服务器上的 Target 列表。
  • login:向 Target 完成验证;验证通过后即可使用 Target 提供的块设备。

配置 iSCSI Targets

配置 iSCSI Targets 需要安装:

  • targetd:服务端软件。
  • targetcli:targetd 的配置工具。

启用服务并配置防火墙

# 启用并启动服务
systemctl enable target --now

# 配置防火墙
firewall-cmd --permanent --add-service=iscsi-target
firewall-cmd --reload

安装软件

yum install -y targetd targetcli

targetcli 交互模式

不带参数运行 targetcli 会进入交互模式。下面示例用 ls 查看当前布局:

[root@server ~]# targetcli
targetcli shell version 2.1.fb49
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]
/>

配置 backstore 对象

backstore 类型说明:

  • block:服务器中的块设备,例如整盘、分区或逻辑卷。
  • fileio:本地文件系统中的普通文件;targetcli 将该文件用作磁盘映像。
  • pscsi:物理 SCSI 设备,允许客户端通过网络访问服务器上的物理 SCSI 设备。
  • ramdisk:内存盘;数据不持久保存,重启后丢失。

使用 targetcli 创建后备存储时使用 create 命令,行为取决于当前在配置树中的位置。

示例:

/> cd /backstores/block
/backstores/block> create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

等价于:

/> /backstores/block create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

配置 Target IQN

/iscsi 伪目录中创建 IQN,将您选择的 IQN 作为第一个参数:

/> cd /iscsi
/iscsi> create iqn.2024-12.cloud.testing.server:disk1
Created target iqn.2024-12.cloud.testing.server: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.2024-12.cloud.testing.server: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]

配置 LUN

/> cd /iscsi/iqn.2024-12.cloud.testing.server:disk1/tpg1/luns
/iscsi/iqn.20...sk1/tpg1/luns> create /backstores/block/myblock1
Created LUN 0.

配置 ACL

创建 ACL 以允许指定启动器访问目标。在 Red Hat Enterprise Linux 上,启动器的 IQN 位于 /etc/iscsi/initiatorname.iscsi

/> cd /iscsi/iqn.2024-12.cloud.testing.server:disk1/tpg1/acls
/iscsi/iqn.20...sk1/tpg1/acls> create iqn.2024-12.cloud.testing.client
Created Node ACL for iqn.2024-12.cloud.testing.client
Created mapped LUN 0.

配置 Portal

/> cd /iscsi/iqn.2024-12.cloud.testing.server:disk1/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20.../tpg1/portals> create 10.1.8.10 3260
Using default IP port 3260
Created network portal 10.1.8.10:3260.

保存配置

退出 targetcli shell 时,配置会保存到 /etc/target/saveconfig.json(若开启自动保存):

/> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json

非交互式管理 Targets

targetcli saveconfig
# Configuration saved to /etc/target/saveconfig.json

targetcli /iscsi/iqn.2024-12.cloud.testing.server:disk1/tpg1/portals \
  create 10.1.8.10 3260
# 输出示例(以实际环境为准):
# Using default IP port 3260
# Created network portal 172.25.250.10:3260.

targetcli /iscsi/iqn.2024-12.cloud.testing.server:disk1/tpg1/portals \
  delete 0.0.0.0 3260
# Deleted network portal 0.0.0.0:3260

targetcli /iscsi/iqn.2024-12.cloud.testing.server:disk1/tpg1/acls \
  create iqn.2024-12.cloud.testing.client
# Created Node ACL for iqn.2024-12.cloud.testing.client
# Created mapped LUN 0.

targetcli /iscsi/iqn.2024-12.cloud.testing.server:disk1/tpg1/luns \
  create /backstores/block/myblock1
# Created LUN 0.

targetcli /iscsi create iqn.2024-12.cloud.testing.server:disk1
# Created target ...
# Created TPG 1.
# ...

targetcli /backstores/block create myblock1 /dev/sdb
# Created block storage object myblock1 using /dev/sdb.

提示:与交互式使用 targetcli 不同,命令行模式必须显式执行 saveconfig 子命令才会保存配置。

访问 iSCSI 存储

iSCSI 启动器通常以软件实现;需要已有以太网具备足够带宽承载存储流量。也可使用硬件启动器(HBA),减轻 CPU 等资源占用。

准备系统

配置客户端需安装 iscsi-initiator-utils,其中包含 iscsiiscsid 服务以及 /etc/iscsi/iscsid.conf/etc/iscsi/initiatorname.iscsi 等配置文件。

yum install -y iscsi-initiator-utils

作为 iSCSI 启动器,客户端需要唯一的 IQN。安装 iscsi-initiator-utils 时会生成 IQN 并写入 /etc/iscsi/initiatorname.iscsi;管理员通常需要按规范修改。

vim /etc/iscsi/initiatorname.iscsi
# InitiatorName=iqn.2024-12.cloud.testing.client

/etc/iscsi/iscsid.conf 包含连接目标的默认设置(超时、重试、认证用户名与密码等)。

软件包安装后一般会配置 iscsid 在开机时自动重连已发现的目标。 修改启动器配置文件后,应重启 iscsid 服务。

连接 iSCSI 目标

使用远程设备前需先 发现 目标。发现过程会结合 /etc/iscsi/iscsid.conf 中的设置,把目标信息写入 /var/lib/iscsi/nodes/ 等目录。

发现命令:

iscsiadm -m discovery -t st -p portal_ip[:port]
  • portal_ip:目标 Portal 的 IP。
  • port:未指定时默认为 3260

示例:

iscsiadm -m discovery -t st -p server
# 10.1.8.10:3260,1 iqn.2024-12.cloud.testing.server:disk1

登录到列出的某一目标:

iscsiadm -m node -T Target -p portal_ip[:port] -l

示例:

iscsiadm -m node -T iqn.2024-12.cloud.testing.server:disk1 -l
# Logging in to [iface: default, target: iqn.2024-12.cloud.testing.server:disk1, portal: 10.1.8.10,3260]
# Login to [...] successful.

登录后系统会看到新的 SCSI 块设备,类似本地硬盘。可用会话信息查看设备:

iscsiadm -m session -P 3
# ... 输出省略 ...
# Attached scsi disk sdc State: running

也可结合 dmesgtail /var/log/messagesls -l /dev/disk/by-path/*iscsi* 等确认。默认情况下登录在重启后仍会保持,块设备开机后应自动可用。

格式化 iSCSI 设备

若远程块设备上已有分区、文件系统或 LVM,可用常规命令(如 mount)访问;可用 lsblk --fsblkid 检查。

blkid
# NAME  FSTYPE  LABEL  UUID  MOUNTPOINT
# ...

注意:多个启动器同时挂载同一目标上的同一本地文件系统(如 ext4、XFS)会导致损坏或数据不一致。若需多机同时访问基于 iSCSI 的块设备,应使用集群文件系统(如 GFS2)。

若磁盘为空,可分区、格式化或作为 LVM 物理卷使用:

# 假设客户端上发现的设备为 /dev/sdb(以实际为准)
mkfs.xfs /dev/sdb

持久化挂载

/etc/fstab 中持久挂载 iSCSI 上的文件系统时建议:

  1. 使用 lsblk --fs 取得文件系统 UUID,在 fstab 中用 UUID= 挂载,不要依赖 /dev/sd*,以免启动顺序变化导致错挂。
  2. 使用 _netdev 挂载选项:iSCSI 依赖网络,该选项可避免在网络与启动器就绪前尝试挂载。

示例:

UUID="3d49d1dd-8209-43a1-a106-4de328762e00" /data xfs defaults,_netdev 0 0

确保 iscsi 服务已设置开机启动(多数安装下默认已启用):

systemctl enable iscsi

断开目标连接

停止使用 iSCSI 目标时:

  1. 确认未再使用该目标提供的设备(如已卸载文件系统),并删除 /etc/fstab 等处的持久引用。
  2. 从目标注销:
iscsiadm -m node -T iqn.2024-12.cloud.testing.server:disk1 \
  -p 10.1.8.10:3260 -u
  1. 删除本地节点记录,避免引导时自动登录:
iscsiadm -m node -T iqn.2024-12.cloud.testing.server:disk1 \
  -p 10.1.8.10:3260 -o delete

故障处理

若发现成功但登录失败,多与访问控制或认证有关;客户端 IQN 与服务器 ACL 中允许的 IQN 不一致会导致登录失败。

若因客户端启动器 IQN 错误引起,请在 /etc/iscsi/initiatorname.iscsi 中修正 IQN,并重启 iscsid 使配置生效。

  • 原因:iscsid 会缓存此前扫描时使用的 IQN。
  • 处理:修正 IQN 后执行 systemctl restart iscsid,再重新登录:
iscsiadm -m node -T iqn.2024-12.cloud.testing.server:disk1 -l
systemctl restart iscsid

多路径访问

服务端准备

准备两条网络链路,并在 targetcli 中为同一目标配置两个 Portal。示例:

[root@server ~]# targetcli /iscsi/iqn.2024-08.fun.linux.server:webapp/tpg1/portals ls
o- portals ....................................................... [Portals: 2]
  o- 10.1.1.10:3260 ....................................................... [OK]
  o- 10.1.8.10:3260 ....................................................... [OK]

网卡地址示例:

[root@server ~]# ip -br a
# ens224  UP    10.1.1.10/24 ...
# ens160  UP    10.1.8.10/24 ...
# lo      UNKNOWN 127.0.0.1/8 ...

什么是多路径

多路径指服务器与存储之间存在多条物理路径,通过虚拟设备统一呈现,可在单路径故障时保持连接,并在部分场景下聚合带宽。

多路径由 dm-multipath 子系统提供:基于内核 device mapper 生成虚拟设备,由 multipathdmultipath 命令管理。

device-mapper-multipath 软件包提供守护进程、命令行工具与内核模块。安装并启动后,多路径设备通常出现在:

  • /dev/mapper:便于管理;若启用 user-friendly 名称,可能为 mpathN(或 mpathN 的分区 pM),也可按 WWID 或 alias 命名。
  • /dev/dm-N:与 /dev/mapper 中节点对应,主要供系统内部使用,不建议作为日常管理入口。

重要:多路径解决的是路径故障;若存储本身不可用,业务仍会不可用。

创建多路径设备时,不同路径如何归组由 /etc/multipath.conf 决定。典型 failover 配置下同一时刻往往只有一个 path group 处于 active;故障时 multipathd 会将 I/O 切换到其他组。

配置多路径

安装软件包
yum install -y device-mapper-multipath
启用多路径

创建 /etc/multipath.conf 最简单的方式是使用 mpathconf

  • 若文件不存在,可执行:
mpathconf --enable
  • 也可从 /usr/share/doc/device-mapper-multipath-*/multipath.conf 拷贝模板。

若文件已存在,可用:

mpathconf --enable --with_multipathd y --with_chkconfig y

编辑配置后:

systemctl enable multipathd
systemctl start multipathd
发现设备

(过程与具体环境相关,此处从略。)

判断多条路径是否指向同一设备

WWN(World Wide Name) 是由 IEEE 标准化的全局唯一标识,用于标识存储设备(磁盘、阵列、交换机等)。在 FC、iSCSI 等环境中用于识别设备。

判断多路径是否聚合同一存储的核心依据是:属于同一多路径集合的各物理路径(如 sdbsdc)对应的后端 WWN 应一致

scsi_id
/usr/lib/udev/scsi_id -g -u /dev/sdc
# 360014057202ac29e3cd4d24850ed82f3

/usr/lib/udev/scsi_id -g -u /dev/sdb
# 360014057202ac29e3cd4d24850ed82f3
udevadm
udevadm info --query=property --name=/dev/sdb | grep ID_WWN_W
# ID_WWN_WITH_EXTENSION=0x600140559c2883e039048cbbce4320b4

udevadm info --query=property --name=/dev/sdc | grep ID_WWN_W
# ID_WWN_WITH_EXTENSION=0x600140559c2883e039048cbbce4320b4
结合 blkid(文件系统 UUID)
blkid /dev/sdb
# /dev/sdb: UUID="..." TYPE="xfs"

blkid /dev/sdc
# /dev/sdc: UUID="..." TYPE="xfs"
监控多路径

multipath -l:简要拓扑。

multipath -ll:检测路径是否 active;正常时路径多为 active / ready。输出大致包含:多路径设备、path group、组成员路径。

示例:

[root@client ~]# multipath -ll
mpatha (360014057202ac29e3cd4d24850ed82f3) dm-3 LIO-ORG ,db01
size=100G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 32:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 33:0:0:0 sdc 8:32 active ready running

解读要点:

  • 首行:别名、WWID、dm 设备名、厂商与产品信息。
  • 第二行:容量、特性、硬件 handler、读写权限等。
  • WWID(World Wide Identifier):Linux 多路径用于标识聚合逻辑设备的标识,与多路径配置中的 wwid 字段对应。
  • path group:调度策略、优先级、组状态及其成员路径;路径可执行 I/O 时常显示 ready,故障时常为 faulty。failover(active-passive)下通常同一时间只有一条路径为 active,另一条可能为 enabled
配置文件说明

/etc/multipath.conf 主要包含若干段落(优先级:multipaths > devices > defaults):

  • defaults:全局默认,可被后两者覆盖。
  • blacklist:不参与多路径的设备。
  • blacklist_exceptions:即使匹配 blacklist 仍要包含的设备。
  • devices:按 vendorproductrevision(来自 sysfs 的正则)识别特定类型设备。
  • multipaths:按 WWID(由 getuid_callout 等得到)为指定多路径单独设定,可覆盖 defaults/devices。
Defaults 段要点

完整默认项可参考 /usr/share/doc/device-mapper-multipath-*/multipath.conf.defaults

常见项含义简述:

  • path_selector:组内下一次 I/O 选路算法;默认多为 service-time 0;另有 round-robin 0queue-length 0 等。
  • path_grouping_policy:路径如何归入优先级组;failover 为每组单路径;multibus 将多路径并入一组(需存储支持 active-active)。
  • path_checker:multipathd 判断路径健康的方式,如 directioreadsector0 等。
  • features:语法 num list,如 queue_if_no_pathno_partitions
  • user_friendly_names:未配置 alias 时是否使用 mpathN 风格命名。

警告:若启用 queue_if_no_path(如 features "1 queue_if_no_path"),路径全断时 I/O 可能长时间挂起直至恢复;在集群中可能导致节点互相影响。可结合 no_path_retry 等设为 fail,使失败尽快向上层报错。

multipaths 段示例

failover 策略下为指定 WWID 设置别名等:

multipaths {
  multipath {
    wwid 360014057202ac29e3cd4d24850ed82f3
    alias ClusterStorage
    path_grouping_policy failover
  }
}

multibus 示例:

multipaths {
  multipath {
    wwid 36001405bbc2fa575d0d46ec8951bc465
    alias ClusterStorage
    path_grouping_policy multibus
  }
}

应用后可用 multipath -ll 验证,例如:

ClusterStorage (360014057202ac29e3cd4d24850ed82f3) dm-0 LIO-ORG ,clusterstor
size=4.0G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
  |- 2:0:0:0 sdb 8:16 active ready running
  `- 3:0:0:0 sda 8:0 active ready running
devices 段

用于为特定厂商/型号设备指定 path_grouping_policypath_checkerpath_selectorfailbackrr_weightno_path_retry 等。具体字段请以官方文档与存储厂商建议为准。

Blacklist

按 WWID、设备节点名等排除设备,支持通配符:

blacklist {
  devnode "^vd[a-z]"
  wwid 1234567890abcde
}

查看 WWID:

/usr/lib/udev/scsi_id -g -u /dev/sda
blacklist_exceptions

在黑名单基础上再包含指定设备,例如:

blacklist_exceptions {
  device {
    vendor "IBM"
    product "S/390.*"
  }
}

使用多路径设备

设备名示例:/dev/mapper/mpatha。识别到设备后可分区、格式化、挂载:

parted /dev/mapper/mpatha mklabel gpt
parted /dev/mapper/mpatha unit MiB mkpart webapp 1 10241 <<< 'Ignore'
mkfs.xfs /dev/mapper/mpatha1
mount /dev/mapper/mpatha1 /usr/share/nginx/html
df -h /usr/share/nginx/html
持久化挂载(多路径)

/etc/fstab 中增加类似:

/dev/mapper/mpatha1  /usr/share/nginx/html  xfs  _netdev  0  0

然后:

systemctl daemon-reload
umount /usr/share/nginx/html   # 若已挂载
mount -a
df -h /usr/share/nginx/html

高可用性测试

测试 1:在 server 端断开第二条网卡链路:

nmcli device disconnect ens192

客户端 multipath -ll 可能显示:原 passive 组路径故障,active 组仍正常。

测试 2:恢复该网卡后,可能观察到 active/passive 角色切换;故障路径恢复后,当前 active 路径未必自动切回原先路径,必要时可手工切换。

示例输出(节选):

# 一条路径 failed faulty offline,另一条仍 active ready running
mpatha (...) dm-0 LIO-ORG ,clusterstor
  |-+- policy='service-time 0' prio=1 status=active
  | `- ... sdb ... active ready running
  `-+- policy='service-time 0' prio=1 status=enabled
    `- ... sda ... failed faulty offline

恢复后:

mpatha (...) dm-0 LIO-ORG ,clusterstor
  |-+- policy='service-time 0' prio=1 status=enabled
  | `- ... sdb ... failed faulty offline
  `-+- policy='service-time 0' prio=1 status=active
    `- ... sda ... active ready running
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐