Linux iSCSI 存储部署与 CHAP 认证完全指南

太多人给 iSCSI 存储裸奔不设认证,或照着网上的 set parameter AuthMethod= 一顿配,结果登录被拒还查不出原因。本文从 IQN、Portal、LUN、ACL 讲起,完整走一遍 targetcli 建目标、客户端发现登录挂载,再把最易翻车的 CHAP 单独成章:厘清发现认证与会话认证两层、单向与双向凭据怎么配、服务端与客户端参数怎么一一对应。末尾附 iscsiadm 报错码与排错速查表。文中命令名与选项均标注英文原意,完整清单见文末《附:命令英文全称速查表》。

本文概要:

项目 内容
文章主题 iSCSI 块存储:IQN 与 TPG 概念 → targetcli 服务端配置 → iscsiadm 客户端发现登录挂载 → CHAP 认证与排错
所属类别 Linux 系统管理 → 网络存储 → iSCSI
知识关键字 targetcli · iscsiadm · IQN · TPG · LUN · ACL · Portal · backstore · iscsi-initiator-utils · iscsid.conf · discovery_auth · CHAP · initiator reported error · _netdev · nofail · node DB · send_targets

概念图给出「命令层层封装、穿过 IP 网络、再层层解封装」这条主链路。概要表里的关键字按主线落在:术语与命名在第一章,服务端配置在第二章,客户端发现在第三章,认证与排错在第四、五章。

本文的机器与地址约定 :服务端 zhb-s2(10.1.8.102),客户端 zhb-m2(10.1.8.12),服务端一块空闲盘 /dev/sdb,门户端口 3260。

一、iSCSI 服务介绍

1.1 从 SCSI 到 iSCSI

SCSI (S mall C omputer S ystem Interface,小型计算机系统接口)是主机与硬盘、光驱、打印机、扫描仪等设备之间的连接标准,走的是短距离的并行或专用总线。

iSCSI (I nternet S mall C omputer S ystem Interface,Internet 小型计算机系统接口)由 IBM 研发,又称 IP-SAN:把现有 SCSI 接口与以太网技术结合,基于 TCP/IP 连接服务端(Target)与客户端(Initiator),封装后的 SCSI 数据包可以在 IP 网络上传输,最终由服务端把存储提供给客户端。

两条工程上的前提:

  • iSCSI 通常跑在专用的 10 Gb 以太网或更好的网络上,以减少与业务流量抢带宽;
  • 从物理服务器到存储的链路通常封闭在数据中心内,不直接连到 LAN,因此 SAN 流量一般不加密以换取性能;需要跨广域网时用 IPsec 加密。

1.2 客户端看到的形态

访问的 iSCSI 目标在客户端表现为一块本地且未格式化的 SCSI 块设备。这种设备和 SCSI 布线、FC 直连或 FC 交换光纤连出来的设备没有区别。后续建分区、做 LVM 或直接格式化,用法与本地盘完全一致。

1.3 术语速查表

术语 含义
Initiator iSCSI 客户端。通常以软件方式部署,也可以使用 iSCSI HBA 硬件卡;必须有全球唯一的名称
Target iSCSI 服务端上的存储资源,必须有唯一名称。一个目标提供一个或多个块设备(LUN),一台服务器可以提供多个目标
IQN iSCSI Qualified Name,全球唯一名称,用于标识发起者与目标
Portal 服务端监听的地址与端口,例如 10.1.8.102:3260
LUN Logical Unit Number,代表 Target 提供的一块块设备,一个目标可以提供一个或多个 LUN
ACL Access Control List,用 Initiator 的 IQN 限制哪些客户端能访问该 Target
TPG Target Portal Group,一个目标的完整配置,包含 Portal、LUN 与 ACL。绝大多数目标只用一个 TPG
backstore 服务端真正落地数据的后端,可以是块设备、文件、物理 SCSI 设备或内存盘
discovery 查询服务端上有哪些 Target(发现阶段)
login 向 Target 验证身份,通过后即可使用该 Target 提供的块设备(会话阶段)

1.4 IQN 命名格式

bash 复制代码
iqn.YYYY-MM.com.reversed.domain:name_string
字段 含义
YYYY-MM 注册的年和月,如 2026 年 9 月为 2026-09,用日期保证名称唯一
com.reversed.domain 反向域名,如 cloud.zhb.storage
name_string 区分同一服务端上不同目标的标识;只有一个目标时也常省略

本文用到的两个名字:

ini 复制代码
Initiator(客户端):iqn.2026-09.cloud.zhb.client
Target   (服务端):iqn.2026-09.cloud.zhb.storage:disk1

二、配置 iSCSI 服务端

2.1 装包与启动

配置 iSCSI Target 需要两个软件:

  • targetd:服务端软件;
  • targetcli:targetd 的配置工具(命令行 shell)。
bash 复制代码
# 安装软件
[root@zhb-s2 ~]# yum install -y targetd targetcli

# 启用并启动服务
[root@zhb-s2 ~]# systemctl enable target --now

# 配置防火墙
[root@zhb-s2 ~]# firewall-cmd --permanent --add-service=iscsi-target
[root@zhb-s2 ~]# firewall-cmd --reload

不带任何选项运行 targetcli 会进入交互模式,ls 可以查看当前配置树:

bash 复制代码
[root@zhb-s2 ~]# 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]
/>

2.2 服务端配置五步总览

步骤 做什么 配置树位置 / 命令
1 建 backstore(后端存储对象) /backstores/block create <名字> <设备>
2 建 Target 与 IQN /iscsi create iqn....
3 把后端挂成 LUN .../tpg1/luns create /backstores/block/<名字>
4 建 ACL 放行客户端 IQN .../tpg1/acls create iqn....
5 调整 Portal 并保存 .../tpg1/portals 增删;saveconfig

💡 一个 Target 能挂多个 LUN 。2.4 / 2.6 只演示了单 LUN(myblock1 → LUN 0),要再加一块盘、多出一块独立设备,流程见 2.7。

2.3 backstore 类型速查表

类型 作用 说明
block 服务器中的块设备 磁盘驱动器、磁盘分区或逻辑卷,性能最好
fileio 本地文件系统中的普通文件 targetcli 把该文件当作磁盘映像使用
pscsi 物理 SCSI 设备 允许客户端通过网络访问服务端上的物理 SCSI 设备
ramdisk 内存中的磁盘设备 不持久存储,服务端重启后数据丢失

创建后备存储用 create 命令,命令行为取决于当前所在位置:

bash 复制代码
/> cd /backstores/block
/backstores/block> create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

与下面这条完全等价(不必先 cd):

bash 复制代码
/> /backstores/block create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

2.4 交互式配置全过程

bash 复制代码
# 1) 创建后端存储对象(backstore)------ LUN 要挂在它上面,必须先有;这里把空闲盘 /dev/sdb 做成块设备后端,命名为 myblock1(写法见 2.3)
/> cd /backstores/block
/backstores/block> create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

# 2) 创建 Target,IQN 之后的 `:disk1` 用于区分同一台服务器上的多个目标
/> cd /iscsi
/iscsi> create iqn.2026-09.cloud.zhb.storage:disk1
Created target iqn.2026-09.cloud.zhb.storage:disk1.
Created TPG 1.
# 自动建好默认门户 0.0.0.0:3260(第 5 步再换成指定地址);用 ls 可查看结构

# 3) 把后端对象挂成 LUN(上一步创建的 myblock1)
/> cd /iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/luns
/iscsi/iqn.20...sk1/tpg1/luns> create /backstores/block/myblock1
Created LUN 0.

# 4) 创建 ACL,放行客户端 IQN(客户端的 IQN 存在 /etc/iscsi/initiatorname.iscsi)
/> cd /iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/acls
/iscsi/iqn.20...sk1/tpg1/acls> create iqn.2026-09.cloud.zhb.client
Created Node ACL for iqn.2026-09.cloud.zhb.client
Created mapped LUN 0.

# 5) 把默认门户 0.0.0.0:3260 换成指定网卡地址,并退出保存
/> cd /iscsi/iqn.2026-09.cloud.zhb.storage: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.102 3260
Using default IP port 3260
Created network portal 10.1.8.102:3260.

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

提示 :新建的 TPG 默认处于 [no-gen-acls, no-auth] 状态------即没建 ACL、也没开认证。第三节的认证配置就是在这里把它改掉。

2.5 targetcli 关键层级与动作速查表

位置 干什么 常用动作
/backstores/block 管理块设备后端 create、delete
/iscsi 管理 Target 与 IQN create、delete
.../tpg1/luns 把后端挂成 LUN create、delete
.../tpg1/acls 放行客户端 IQN create、delete
.../tpg1/portals 增删监听地址与端口 create <IP> 3260、delete <IP> 3260
.../tpg1 开关认证等属性 set attribute authentication=1
/iscsi 发现阶段认证 set discovery_auth ...

2.6 非交互式管理(命令行模式)

把路径与动作写在一条命令里即可,等价于交互式的 cd + 动作:

bash 复制代码
[root@zhb-s2 ~]# targetcli /backstores/block create myblock1 /dev/sdb
Created block storage object myblock1 using /dev/sdb.

[root@zhb-s2 ~]# targetcli /iscsi create iqn.2026-09.cloud.zhb.storage:disk1
Created target iqn.2026-09.cloud.zhb.storage:disk1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

[root@zhb-s2 ~]# targetcli /iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/luns \
> create /backstores/block/myblock1
Created LUN 0.

[root@zhb-s2 ~]# targetcli /iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/acls \
> create iqn.2026-09.cloud.zhb.client
Created Node ACL for iqn.2026-09.cloud.zhb.client
Created mapped LUN 0.

[root@zhb-s2 ~]# targetcli /iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/portals \
> delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260

[root@zhb-s2 ~]# targetcli /iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/portals \
> create 10.1.8.102 3260
Using default IP port 3260
Created network portal 10.1.8.102:3260.

[root@zhb-s2 ~]# targetcli saveconfig
Configuration saved to /etc/target/saveconfig.json

⚠️ 注意 :与交互式使用 targetcli 不同,命令行模式不会自动保存配置,必须显式执行 saveconfig;否则重启后配置全丢。

2.7 服务端挂载第二个 LUN(多 LUN 场景)

一个 Target 可以同时提供多个 LUN(见 1.3 术语表)。2.4 / 2.6 只挂了一块盘(myblock1 → LUN 0),要再加一块,只需要再建一个 backstore,并挂到同一个 Target 的 tpg1/luns 下,LUN 编号会自动递增:

bash 复制代码
# 假设服务端还有一块空闲盘 /dev/sdc,做成第二个后端,命名为 myblock2(写法见 2.3)
/> /backstores/block create myblock2 /dev/sdc
Created block storage object myblock2 using /dev/sdc.

# 挂到同一个 Target 的 tpg1/luns,编号自动成为 LUN 1
/> /iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/luns \
> create /backstores/block/myblock2
Created LUN 1.

/> saveconfig
Configuration saved to /etc/target/saveconfig.json

💡 LUN 编号由 luns 下对象的加入顺序决定;中间删过 LUN 时,新设备的编号以 ls / iscsiadm -m session -P 3 实际看到为准。backstore 名字(myblock1 / myblock2)与服务端本地设备名(/dev/sdb、/dev/sdc)没有强制对应关系,本例只是恰好一致------换成文件后端(fileio)时,两者更是毫无关联。

三、客户端访问 iSCSI 存储

3.1 准备系统

客户端需要安装 iscsi-initiator-utils ,它提供 iscsi、iscsid 两个服务以及两个配置文件:

bash 复制代码
[root@zhb-m2 ~]# yum install -y iscsi-initiator-utils

# 改成本次约定的 IQN:必须与服务端 ACL 里放行的名字完全一致
[root@zhb-m2 ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2026-09.cloud.zhb.client
[root@zhb-m2 ~]# systemctl restart iscsid      # 改完配置文件必须重启 iscsid
  • /etc/iscsi/initiatorname.iscsi:本机 IQN。安装软件包时生成唯一值,通常需要按规划改掉;
  • /etc/iscsi/iscsid.conf:连接目标的默认参数,包括超时、重试以及认证用的用户名与密码;
  • 软件包安装时会自动配好 iscsid 服务,使启动器在系统启动时自动重连已发现的目标。

3.2 iscsiadm 模式与常用写法速查表

写法 作用 说明(英文原意)
iscsiadm -m discovery -t st -p <IP>[:端口] 发现目标 -m = m ode,-t st = t ype s endtargets
iscsiadm -m node -T <IQN> -p <IP> -l 登录目标 -T = T arget,-l = login
iscsiadm -m node -T <IQN> -p <IP> -u 注销会话 unlogin,会话记录仍保留
iscsiadm -m node -T <IQN> -p <IP> -o delete 删除节点记录 -o = operation,开机不再自动登录
iscsiadm -m node -o delete 清空全部节点记录 不指定 -T/-p 即作用于全部,详见 3.7
iscsiadm -m session -P 3 查看会话详情 -P = Print level,3 级会列出挂上的 SCSI 盘
iscsiadm -m session 只看当前会话 ---

3.3 发现与登录

发现过程使用 /etc/iscsi/iscsid.conf 里的参数,把目标信息与设置存到 /var/lib/iscsi/nodes/:

bash 复制代码
# 发现:-p 后面是门户地址(Portal),可写主机名/IP,也可写成 IP:端口
# 省略端口则默认 3260;返回的 "10.1.8.102:3260,1" 即「门户地址:端口,TPG 编号」
[root@zhb-m2 ~]# iscsiadm -m discovery -t st -p zhb-s2
10.1.8.102:3260,1 iqn.2026-09.cloud.zhb.storage:disk1

# 登录目标
[root@zhb-m2 ~]# iscsiadm -m node -T iqn.2026-09.cloud.zhb.storage:disk1 -l
Logging in to [iface: default, target: iqn.2026-09.cloud.zhb.storage:disk1, portal: 10.1.8.102,3260]
Login to [iface: default, target: iqn.2026-09.cloud.zhb.storage:disk1, portal: 10.1.8.102,3260] successful.

登录成功后系统会视为新增一块 SCSI 块设备,用打印级别 3 查看当前会话:

bash 复制代码
[root@zhb-m2 ~]# iscsiadm -m session -P 3
iSCSI Transport Class version 2.0-870
version 6.2.0.877-0
Target: iqn.2026-09.cloud.zhb.storage:disk1 (non-flash)
Current Portal: 10.1.8.102:3260,1
...output omitted...
Attached scsi disk sdc State: running

也可以从 dmesg、tail /var/log/messages 或 ls -l /dev/disk/by-path/*iscsi* 的输出确认。登录过程在重启后依旧保留,开机后块设备会自动可用。

3.4 查看设备与格式化

如果设备上已有分区、文件系统或 LVM 卷,用常规命令挂载即可读数据;先看清设备状态:

bash 复制代码
[root@zhb-m2 ~]# lsblk --fs
# 或
[root@zhb-m2 ~]# blkid
sdc

磁盘为空时可以格式化、建分区或直接用作 LVM 物理卷:

bash 复制代码
# 假设客户端发现的设备名是 /dev/sdb
[root@zhb-m2 ~]# mkfs.xfs /dev/sdb

⚠️ 注意:多个启动器同时从同一目标挂载同一个文件系统,会造成文件系统损坏或读到不一致的数据。本地文件系统(ext4、XFS)都不支持多机并发挂载;确实需要多机同时访问同一块 iSCSI 设备,应改用集群文件系统(如 GFS2)。

3.5 持久化挂载

在 /etc/fstab 里写 iSCSI 挂载要守三条:

  • 用文件系统 UUID,不要用设备名 (/dev/sd*):设备名取决于 iSCSI 设备响应网络的顺序,重启后可能变化,写错挂载点会挂到别的设备上;
  • 加 _netdev 挂载选项 :iSCSI 依赖网络,该选项保证网络与启动器就绪前系统不会尝试挂载。这里它是必需 的------iSCSI 设备的 fstype 显示为 ext4/XFS,systemd 按类型判断时会误以为是本地盘,必须用 _netdev 显式声明;
  • 加 nofail 挂载选项 :该条目只被「想要(Wants=)」而非「必需(Requires=)」,存储端不可达时挂载失败也不阻塞启动、不进 emergency 模式。存储服务器维护窗口期间重启客户端,靠的就是它。
ini 复制代码
UUID="3d49d1dd-8209-43a1-a106-4de328762e00" /data xfs defaults,_netdev,nofail        0 0

⚠️ _netdev 与 nofail 各管一头 :前者管「什么时候挂」(network-online.target 就绪后才挂),后者管「挂不上会怎样」(不挡启动)。iSCSI 属于网络块设备,两个都缺一不可------只写 _netdev 时,存储端没响应依然会卡住启动等待超时(默认约 90 秒)。

💡 可选加强 :想缩短等待可再加 x-systemd.device-timeout=30,写法为 defaults,_netdev,nofail,x-systemd.device-timeout=30。该选项只能写在 /etc/fstab 里。
⚠️ 注意 :nofail 只保证不挡启动,不代表设备挂上了 ------若业务依赖 /data,仍需查 systemctl status data.mount 确认。写 fstab 前先 blkid 取到 UUID,改完用 mount -a 验证一遍。

同时确认 iscsi 服务开机自启(默认已开启):

bash 复制代码
[root@zhb-m2 ~]# systemctl enable iscsi

3.6 断开目标连接

bash 复制代码
# 1) 先确认没有进程在用该设备(卸载文件系统)
# 2) 从 /etc/fstab 等位置删掉持久引用
# 3) 注销会话
[root@zhb-m2 ~]# iscsiadm -m node -T iqn.2026-09.cloud.zhb.storage:disk1 \
> -p 10.1.8.102:3260 -u

# 4) 删除本地节点记录,避免开机自动登录
[root@zhb-m2 ~]# iscsiadm -m node -T iqn.2026-09.cloud.zhb.storage:disk1 \
> -p 10.1.8.102:3260 -o delete

3.7 清空发现记录(推倒重来)

实验反复做、服务端 IQN 或 Portal 改过之后,客户端会攒下一批对不上的旧记录。删之前先分清它们存在两个不同的库里:

库 目录 存什么 查看命令
节点记录 node DB /var/lib/iscsi/nodes/ 发现出来的每个「Target + Portal」,登录靠它;CHAP 会话凭据也存在里面 iscsiadm -m node
发现记录 discovery DB /var/lib/iscsi/send_targets/ 「在哪个 Portal 上做过 SendTargets 发现」 iscsiadm -m discovery

平时讲的「清空发现记录」,指的绝大多数是第一行的节点记录。

① 清空全部节点记录(最常用,一条命令)

bash 复制代码
[root@zhb-m2 ~]# iscsiadm -m node -o delete

⚠️ 不写 -T 和 -p,就是作用于全部记录 :-o delete 的匹配规则是「传了谁就只动谁,一个都不传就动全部」,所以这一行等于把整个节点库清空。

② 连发现记录一起抹掉

发现记录没有「一次删光」的开关,必须逐条指名 Portal 和类型:

bash 复制代码
# 先看还有哪些发现记录
[root@zhb-m2 ~]# iscsiadm -m discovery

# -t st 指类型为 SendTargets;删它会连带删掉通过它发现的那批节点记录
[root@zhb-m2 ~]# iscsiadm -m discovery -t st -p 10.1.8.102:3260 -o delete

③ 最彻底:停服务直接删库(服务端 IP 换过、库里目录名对不上时才用)

bash 复制代码
[root@zhb-m2 ~]# systemctl stop iscsid.socket iscsid.service
[root@zhb-m2 ~]# rm -rf /var/lib/iscsi/nodes/* /var/lib/iscsi/send_targets/*
[root@zhb-m2 ~]# systemctl start iscsid

💡 iscsid 是 socket 激活的,所以要先停 iscsid.socket,否则 iscsid.service 会被立刻重新拉起。
⚠️ 四个坑

  1. 删记录会自动断会话 。iscsiadm(8) 原文:「Delete should not be used on a running session. If it is, iscsiadm will stop the session and then delete the record.」有业务在用先 umount /data,否则 I/O 直接中断。
  2. -U all 会漏掉 onboot 的节点 。手册说它是「登出所有运行中的会话,除了标记为 onboot 的 」,要断干净得补一条 iscsiadm -m node -U onboot;或者不先登出、直接 -o delete,它会替你停会话。
  3. CHAP 凭据会跟着一起删 。认证参数保存在节点记录里(/var/lib/iscsi/nodes/<IQN>/<IP>,<端口>,1/default),清完重新发现后要按 4.5 把 node.session.auth.* 重设一遍,否则登录报认证失败(返回码 24)。
  4. 清记录不动服务端的数据 。LUN 和上面的文件系统都在服务端,客户端只是「忘了怎么连」。同理,注销后 /dev/sdb 会消失,fstab 里那条 _netdev,nofail 条目对应的挂载点会变成空目录。

清完这样确认:

bash 复制代码
[root@zhb-m2 ~]# iscsiadm -m node
[root@zhb-m2 ~]# iscsiadm -m session
[root@zhb-m2 ~]# ls /var/lib/iscsi/nodes/

三条都没有输出,客户端就是干净状态了,之后按 3.3 重新发现、登录即可。

3.8 多 LUN:客户端识别与分别挂载

服务端在一个 Target 下挂了 N 个 LUN,客户端登录后就会多出 N 块相互独立 的 SCSI 块设备------它们彼此无关,各自是一块完整的磁盘(/dev/sdb、/dev/sdc...),需要分别格式化、分别挂载,不能当作「同一块盘的多个分区」来用。

① 辨认每个 LUN 对应哪块设备

光看 /dev/sd* 没法区分哪块是哪个 LUN;/dev/disk/by-path/ 里的符号链接把「门户 IP + IQN + LUN 编号」编码进了文件名,是辨认的依据:

bash 复制代码
[root@zhb-m2 ~]# ls -l /dev/disk/by-path/*iscsi*
lrwxrwxrwx ... ip-10.1.8.102:3260-iscsi-iqn.2026-09.cloud.zhb.storage:disk1-lun-0 -> ../../sdb
lrwxrwxrwx ... ip-10.1.8.102:3260-iscsi-iqn.2026-09.cloud.zhb.storage:disk1-lun-1 -> ../../sdc

lun-0 对应第一块盘(myblock1)、lun-1 对应第二块(myblock2)。iscsiadm -m session -P 3 的 Attached scsi disk 行也会逐块列出。

② 分别格式化、分别按 UUID 写进 fstab

每块盘都是空盘,各自 mkfs 一次;fstab 里一块盘一条记录 ,全部用 UUID + _netdev,nofail(规则见 3.5):

bash 复制代码
[root@zhb-m2 ~]# mkfs.xfs /dev/sdb
[root@zhb-m2 ~]# mkfs.xfs /dev/sdc
[root@zhb-m2 ~]# blkid /dev/sdb /dev/sdc   # 各取各的 UUID
ini 复制代码
# /etc/fstab:两块盘,两条记录,互不干扰
UUID="3d49d1dd-8209-43a1-a106-4de328762e00" /data1 xfs defaults,_netdev,nofail 0 0
UUID="9c1f2a33-5e4b-4c91-9f0a-2b1c7dab12cd" /data2 xfs defaults,_netdev,nofail 0 0

⚠️ 多 LUN ≠ 同一份数据的多副本 。每个 LUN 是服务端上独立 的 backstore(独立的 /dev/sdb、/dev/sdc 或独立的文件),客户端拿到的是 N 块互不相干的盘。需要把多块盘拼成一个大空间,应走 LVM(把 /dev/sdb、/dev/sdc 加入同一个 VG),而不是指望它们自动合并。
⚠️ 多个客户端同时挂载同一个 LUN (同一块 /dev/sdb)依旧踩 3.4 那条警告:本地文件系统(ext4、XFS)不支持多机并发,必须改用 GFS2 之类集群文件系统。多 LUN 是「给单个客户端更多盘」,和多机共享同一盘是两回事。

四、CHAP 认证机制

4.1 两套完全独立的认证体系

targetcli 里有两套互不影响的认证配置,作用在 iSCSI 连接的不同阶段:

维度 发现认证 Discovery Auth 会话认证 Session Auth
配置位置 /iscsi 层级 /iscsi/<target_iqn>/tpg1/acls/<client_iqn> 层级
作用阶段 Discovery 阶段(SendTargets 查询) 正常会话阶段(实际 I/O 读写)
保护对象 「有哪些 Target 可连」这个查询动作 存储数据的实际访问
必要性 可选 推荐必开
客户端参数 discovery.sendtargets.auth.* node.session.auth.*

一句话区分:会话认证是门禁,发现认证是前台保安------前者管数据,后者只决定要不要把 Target 列表说出去。

4.2 发现认证(discovery_auth)

层级在 /iscsi(fabric 模块级,不是 TPG 级),四个参数:

参数 作用 说明
enable 是否启用发现认证 默认 False
userid / password 正向凭据 服务端校验客户端
mutual_userid / mutual_password 反向凭据 客户端校验服务端(双向)
bash 复制代码
# 启用(顺带设置凭据)
/iscsi> set discovery_auth userid=zhbuser password=zhbpass1234 enable=True
# 查看
/iscsi> get discovery_auth

⚠️ 注意 :设置凭据 ≠ 启用认证 。enable=False 时,即使 userid / password 已经填好,发现阶段仍然不要求认证------这是「两端行为不一致」类故障的根源。

4.3 会话认证(Session Auth)

层级在 /iscsi/<target_iqn>/tpg1/acls/<client_iqn>,但开关不在这一层:

bash 复制代码
# 1) 先在 TPG 层打开认证开关(注意是 attribute,不是 parameter)
/iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1> set attribute authentication=1

# 2) 再在 ACL 层填凭据:四个参数齐全即为双向 CHAP
/iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1/acls/iqn.2026-09.cloud.zhb.client> \
set auth userid=zhbuser password=zhbpass1234 mutual_userid=targetuser mutual_password=targetpass1234

⚠️ 注意 :set auth 的输出里不会显示 enable 字段 ,是否真正启用由 TPG 的 authentication 属性决定;写成 set parameter AuthMethod= 是无效语法。

4.4 单向与双向 CHAP

类型 认证方向 防护目标
单向 CHAP 服务端验证客户端 防止未授权主机连上存储
双向 CHAP 服务端验证客户端 + 客户端验证服务端 额外防止中间人攻击、伪造 target

双向认证要求四个参数齐全:userid、password、mutual_userid、mutual_password,缺一则认证失败。

4.5 客户端配置对应关系

/etc/iscsi/iscsid.conf 中的参数与服务端一一对应:

ini 复制代码
# 会话认证
node.session.auth.authmethod = CHAP
node.session.auth.username = <正向用户名>
node.session.auth.password = <正向密码>
node.session.auth.username_in = <反向用户名>
node.session.auth.password_in = <反向密码>

# 发现认证
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = <正向用户名>
discovery.sendtargets.auth.password = <正向密码>
discovery.sendtargets.auth.username_in = <反向用户名>
discovery.sendtargets.auth.password_in = <反向密码>

三条使用注意:

  • 这些行默认全部被注释,改值前必须先取消注释,否则等于没配;
  • 修改后需要重新执行 discovery,或用 iscsiadm --op=update 更新已保存的节点参数;
  • 已 discovery 的节点记录不会自动同步配置文件的变更 ,只改 iscsid.conf 对已有节点不起作用。

4.6 认证配置完整流程

bash 复制代码
# ---------- 服务端 ----------
[root@zhb-s2 ~]# targetcli
# 发现认证(可选):注意 enable=True 才生效
/iscsi> set discovery_auth userid=zhbuser password=zhbpass1234 enable=True
# 打开会话认证开关
/iscsi/iqn.2026-09.cloud.zhb.storage:disk1/tpg1> set attribute authentication=1
# 填凭据(双向 CHAP 需要四个参数)
/iscsi/.../tpg1/acls/iqn.2026-09.cloud.zhb.client> \
set auth userid=zhbuser password=zhbpass1234 mutual_userid=targetuser mutual_password=targetpass1234
/iscsi> saveconfig

# ---------- 客户端 ----------
[root@zhb-m2 ~]# vim /etc/iscsi/iscsid.conf     # 按 4.5 取消注释并填凭据
[root@zhb-m2 ~]# iscsiadm -m discovery -t st -p zhb-s2
[root@zhb-m2 ~]# iscsiadm -m node -T iqn.2026-09.cloud.zhb.storage:disk1 -p zhb-s2 -l
[root@zhb-m2 ~]# iscsiadm -m session -P 3        # 验证会话与块设备

4.7 认证易错点汇总

易错点 正确做法
用 set parameter AuthMethod= 开认证 语法不对,会话认证开关是 set attribute authentication=1
设了发现认证凭据但没开开关 必须补 set discovery_auth enable=True
客户端配了发现认证、服务端没启用 两端行为不一致,会报 initiator failed authorization;要么两边都配好,要么客户端注释掉 discovery.sendtargets.auth.*(推荐,配置更简单)
双向认证只配了正向 漏配 mutual_* 会认证失败,四个参数缺一不可
CHAP 密码太短 LIO 侧要求 12~16 字符,过短直接报错
改了 iscsid.conf 却发现无效 参数默认被注释;且已发现的节点记录不会自动同步,要重新 discovery 或 --op=update

五、故障处理

5.1 登录失败先看 IQN

发现成功、但登录失败时,问题多半在访问控制或身份认证:客户端 IQN 与服务端 ACL 里放行的 IQN 不一致是最常见的一种。

bash 复制代码
# 客户端改 IQN 后重启 iscsid,释放之前扫描时使用的旧 IQN
[root@zhb-m2 ~]# vim /etc/iscsi/initiatorname.iscsi
[root@zhb-m2 ~]# systemctl restart iscsid

# 重新登录
[root@zhb-m2 ~]# iscsiadm -m node -T iqn.2026-09.cloud.zhb.storage:disk1 -l

5.2 排错速查

现象 排查入口
发现报 No portals found / 超时 服务端 Portal 是否在监听(`ss -lntp
发现成功但登录失败 客户端 IQN 与服务端 ACL 是否一致;会话认证凭据是否正确;TPG 的 authentication 是否已开
报 initiator failed authorization 两端发现认证配置不一致:服务端 enable=False 而客户端配了 discovery.sendtargets.auth.*
targetcli 里改了配置但重启就没了 命令行模式忘了 saveconfig
重启后设备名从 /dev/sdb 变成 /dev/sdc 正常现象,fstab 里必须用 UUID 而非设备名
开机挂载失败、依赖它的服务起不来 fstab 是否加了 _netdev(等网络)与 nofail(不挡启动);systemctl status iscsi 是否 enabled
开机卡住等超时、存储端不可达时掉进 emergency fstab 只写了 _netdev 没写 nofail,启动会等它挂完;补 nofail,必要时加 x-systemd.device-timeout=30 缩短等待
客户端还连着改过名 / 换过 IP 的旧目标,记录对不上 旧记录没清:iscsiadm -m node -o delete 清空节点库(发现记录逐条删),详见 3.7

5.3 iscsiadm 报错码速查

iscsiadm 的失败统一报成 initiator reported error (N - 描述) 的形式,N 是返回码。下表列出高频的几档,完整清单见 man 8 iscsiadm 的 EXIT STATUS 段:

返回码 含义(英文原意) 常见成因与处理
4 encountered connection failure,遇到连接失败 连不上 Portal:防火墙没放行 iscsi-target,或服务端 3260 端口没监听
5 encountered iSCSI login failure,遇到 iSCSI 登录失败 登录被服务端拒绝:ACL 未放行该 IQN,或认证参数不匹配
8 connection timed out,连接超时 请求发出无响应:链路不通或被静默丢包
12 iSCSI driver not found,未找到 iSCSI 驱动 传输模块没加载:modprobe iscsi_tcp,并确认 iscsi 服务已启动
13 daemon access denied,守护进程拒绝访问 权限不足:没用 root 执行,或 iscsid 未运行
15 session exists,会话已存在 该目标已登录,重复登录被拒,属正常现象
20 could not connect to iscsid,连不上 iscsid 本机守护进程没起:systemctl enable --now iscsid
21 no objects found,未找到任何对象 匹配不到节点 / 会话 / Portal:多半是没先 discovery,或 -T、-p 写错
24 iSCSI login failed due to authorization failure,因认证失败导致登录失败 CHAP 凭据不匹配,或服务端 TPG 的 authentication 未开
27 operation not supported,不支持该操作 传输模块不具备所请求的能力
28 device or resource in use,设备或资源被占用 先 logout 再执行操作
32 target likely not connected,目标可能未连接 会话没真正建立,命令无法下发

定位顺序:认证类失败集中在 24,目标找不到集中在 21,连接不通集中在 4 / 8。

提示 :如果失败发生在更底层的 TCP 阶段,iscsid 日志里也可能出现与 NFS 相同的 errno 111 (Connection refused) / errno 113 (No route to host),成因一致------对端服务没起,或防火墙拦截。此时先用 rpcinfo 之外的手段直接探端口:ss -lntp | grep 3260。

附:命令英文全称速查表

命令 / 缩写 英文全称 / 原意 作用
SCSI S mall C omputer S ystem Interface 小型计算机系统接口
iSCSI I nternet SCSI 在 IP 网络上承载 SCSI 的协议
SAN S torage A rea Network 存储区域网络
IQN i SCSI Q ualified Name iSCSI 全球唯一名称
TPG T arget P ortal Group 目标的完整配置(Portal + LUN + ACL)
LUN L ogical U nit Number 逻辑单元号,代表一块块设备
ACL A ccess C ontrol List 访问控制列表,按 IQN 放行
HBA H ost B us Adapter 主机总线适配器(硬件启动器)
CHAP C hallenge-H andshake A uthentication Protocol 挑战握手认证协议
NIC N etwork I nterface Card 网卡
targetcli target c ommand line 目标配置命令行工具
iscsiadm iSCSI administration 发起端管理工具
iscsid iSCSI daemon 发起端守护进程
initiatorname.iscsi initiator name 本机 IQN 配置文件

📚 参考资料(官方文档 · 中英双语)

官方手册与规范

中文版

其余手册在服务器上直接查:

bash 复制代码
man 8 targetcli   # 目标配置工具
man 8 iscsiadm    # 发起端管理工具
man 8 iscsid      # 发起端守护进程
man 5 iscsid.conf # 客户端连接与认证参数
man 5 systemd.mount  # fstab 里的 nofail / _netdev / x-systemd.* 选项
man 8 iscsi-initiator-utils  # 软件包自带说明

总结 :iSCSI 的服务端配置就是「后端 → 目标 → LUN → ACL → Portal」这条链,客户端则是「改 IQN → 发现 → 登录 → 格式化 → 带 _netdev,nofail 挂载」,实验要推倒重来就 iscsiadm -m node -o delete 清空节点库。一个 Target 可挂多个 LUN:服务端在同一个 tpg1/luns 下再加 backstore 即成 LUN 1(见 2.7),客户端登录后拿到的是 N 块互不相干的盘,按 /dev/disk/by-path/ 的 lun-N 区分、各自格式化并分别用 UUID 挂载(见 3.8)。认证要分清两层------/iscsi 层的发现认证只藏 Target 列表、可选项,tpg1 里 authentication=1 加 ACL 层的会话认证才真正守住数据,生产环境建议必开;凭据四个参数齐全才是双向 CHAP。改完记得 saveconfig,客户端记得重新 discovery。觉得有用可以收藏,认证或登录失败的问题欢迎在评论区贴出报错一起看。

相关推荐
IT大白鼠1 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 5 篇 · 多模态与虚拟化AI 能「看」图:多模态与虚拟化管理
linux·运维·人工智能
奕鼎竜瑆1 小时前
MCP Connectors by Databox 新手部署与调用指南
服务器·人工智能
IT大白鼠2 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 2 篇 · 安全守规矩的 AI:分级安全管控是灵魂
linux·运维·人工智能
闭包不眠2 小时前
端侧AI能省多少服务器钱:把账换成字节算
运维·服务器·图像处理·人工智能·计算机视觉
风华同学2 小时前
免密SSH登录Ubuntu
linux·运维·ubuntu
꯭自꯭闭꯭2 小时前
达梦守护集群手工切换及故障切换
linux·运维·服务器·数据库
哈__2 小时前
日志散在多台服务器怎么查?用 Promtail + Loki + Grafana 搭一套集中检索平台
运维·服务器·grafana
北京中科新远科技2 小时前
AI集群交换网络容量怎么算:端口、收敛比与Leaf-Spine验收
服务器·网络·人工智能
wdfk_prog2 小时前
Wi-Fi Direct 教程 04:Interface 协议子系统初始化——WPA/EAPOL、WPS、DPP/NAN、GAS 与 P2P callback
android·运维·服务器·ubuntu·p2p·wps·wifi-direct