太多人给 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会被立刻重新拉起。
⚠️ 四个坑
- 删记录会自动断会话 。
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 直接中断。-U all会漏掉onboot的节点 。手册说它是「登出所有运行中的会话,除了标记为 onboot 的 」,要断干净得补一条iscsiadm -m node -U onboot;或者不先登出、直接-o delete,它会替你停会话。- CHAP 凭据会跟着一起删 。认证参数保存在节点记录里(
/var/lib/iscsi/nodes/<IQN>/<IP>,<端口>,1/default),清完重新发现后要按 4.5 把node.session.auth.*重设一遍,否则登录报认证失败(返回码 24)。- 清记录不动服务端的数据 。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 配置文件 |
📚 参考资料(官方文档 · 中英双语)
官方手册与规范
- iscsiadm(8):open-iscsi 管理与发现工具
- open-iscsi README:节点库与发现库的操作语义、-o delete 的作用范围
- systemd.mount(5):fstab 里
nofail、_netdev等 systemd 专用挂载选项 - targetcli-fb 项目主页(含 targetcli.8 手册与 LIO 说明)
- RFC 3720:iSCSI 协议规范
中文版
其余手册在服务器上直接查:
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。觉得有用可以收藏,认证或登录失败的问题欢迎在评论区贴出报错一起看。
