bash
##################################################
# iSCSC 服务器 #
##################################################
storage 需要额外赠一块20G sata硬盘
10.1.8.10 storage.migaomei.cloud storage
10.1.8.11 web1.migaomei.cloud web1
10.1.8.12 web2.migaomei.cloud web2
每个节点都配置名称解析
# 配置服务流程:
# 1. 安装软件包
[root@storage ~ 15:44:30]# yum install -y targetd targetcli
# 2. 准备一些材料,硬盘
[root@storage ~ 15:50:28]# parted /dev/sdb mklabel gpt
Information: You may need to update /etc/fstab.
[root@storage ~ 15:50:41]# parted /dev/sdb unit MiB mkpart webapp xfs 1 10241
Information: You may need to update /etc/fstab.
[root@storage ~ 15:51:13]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 10G 0 part
# 3. 启用并启动服务
[root@storage ~ 15:45:12]# systemctl enable targetd --now
# 4. 配置服务器
## 交互式
[root@storage ~ 15:46:12]# 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]
| o- pscsi .................................................................................. [Storage Objects: 0]
| o- ramdisk ................................................................................ [Storage Objects: 0]
o- iscsi ............................................................................................ [Targets: 0]
o- loopback ......................................................................................... [Targets: 0
# 配置共享设备
/> cd /backstores/block
/backstores/block> create webapp /dev/sdb1
Created block storage object webapp using /dev/sdb1.
/backstores/block> ls
o- block ...................................................................................... [Storage Objects: 1]
o- webapp ........................................................... [/dev/sdb1 (10.0GiB) write-thru deactivated]
o- alua ....................................................................................... [ALUA Groups: 1]
o- default_tg_pt_gp ........................................................... [ALUA state: Active/optimized
# 回到顶级目录
/> cd /backstores/block/
/>
# 配置共享
/> cd /iscsi
# 创建一个示例
/iscsi> create
Created target iqn.2003-01.org.linux-iscsi.storage.x8664:sn.21193655441b.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
# 服务端和客户端都使用iqn名称标识自己
# 删除示例,
/iscsi> delete iqn.2003-01.org.linux-iscsi.storage.x8664:sn.21193655441b
# 参照示例创建一个自己的IQN号
/iscsi> create iqn.2026-01.cloud.migaomei.storage.x8664:webapp
Created target iqn.2026-01.cloud.migaomei.storage.x8664:webapp.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
# 配置特定共享
/iscsi> cd iqn.2026-01.cloud.migaomei.storage.x8664:webapp/tpg1/
/iscsi/iqn.20...4:webapp/tpg1> ls
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
# acls 设置允许哪些客户端访问该存储
/iscsi/iqn.20...4:webapp/tpg1> acls/ create iqn.2026-01.cloud.migaomei.web1.x8664:webapp
Created Node ACL for iqn.2026-01.cloud.migaomei.web1.x8664:webapp
# luns 设置客户端可访问的块设备
/iscsi/iqn.20...4:webapp/tpg1> luns/ create /backstores/block/webapp
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2026-01.cloud.migaomei.web1.x8664:webapp
# portals 设置通过哪个物理ip访问该存储
/iscsi/iqn.20...4:webapp/tpg1> portals/ delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20...4:webapp/tpg1> portals/ create 10.1.8.10 3260
Using default IP port 3260
Created network portal 10.1.8.10:3260.
# 最后结果
/iscsi/iqn.20...4:webapp/tpg1> ls
o- tpg1 ..................................................................................... [no-gen-acls, no-auth]
o- acls ................................................................................................ [ACLs: 1]
| o- iqn.2026-01.cloud.migaomei.web1.x8664:webapp .................................................. [Mapped LUNs: 1]
| o- mapped_lun0 ...................................................................... [lun0 block/webapp (rw)]
o- luns ................................................................................................ [LUNs: 1]
| o- lun0 .......................................................... [block/webapp (/dev/sdb1) (default_tg_pt_gp)]
o- portals .......................................................................................... [Portals: 1]
o- 10.1.8.10:3260 ......................................................................................... [OK]
# 退出,自动保存配置
/iscsi/iqn.20...4:webapp/tpg1> cd /
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
## 非交互式
你提供的是一套完整的 Linux iSCSI 存储服务端配置流程 ,核心是把服务器的块设备(/dev/sdb1)通过 iSCSI 协议共享给指定客户端,我会拆解每一步的作用、原理和核心逻辑,让你理解 "为什么这么配""每个配置项解决什么问题"。
先明确核心概念(基础铺垫)
iSCSI 是一种 "把远程块设备映射到本地" 的网络存储协议,核心分为两端:
- 服务端(Target) :提供存储资源的服务器(你的
storage节点),用「IQN 名称」标识自己,管理 "哪些客户端能访问""共享哪个存储设备""通过哪个 IP / 端口访问"。 - 客户端(Initiator) :使用存储资源的服务器(你的
web1节点),也用「IQN 名称」标识自己,通过 IQN 认证后,可把服务端的块设备当成本地硬盘用。 - LUN :服务端共享的 "逻辑存储单元",本质是把物理块设备(
/dev/sdb1)封装成客户端可识别的逻辑设备。 - ACL:访问控制列表,服务端用来限定 "只有指定 IQN 的客户端能连接",避免未授权访问。
- Portal:服务端提供 iSCSI 服务的 IP + 端口,限定客户端只能通过这个网络地址访问存储。
逐行拆解配置步骤(核心是 "建资源→定规则→限访问")
1. 进入 targetcli 交互工具
bash
bash
[root@storage ~]# targetcli
targetcli 是 Linux 下管理 iSCSI Target 的官方工具,所有配置都在这个交互环境里完成,替代了早期复杂的配置文件编辑。
2. 查看初始配置清单
bash
bash
/> 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]
backstores:"存储后端",用来管理要共享的物理存储资源(块设备、文件、内存盘等),初始为空;iscsi:iSCSI 目标(Target)管理目录,初始没有任何共享目标;- 这一步是确认 "初始状态无配置",为后续创建资源做准备。
3. 配置共享设备(创建存储后端)
bash
bash
/> cd /backstores/block
/backstores/block> create webapp /dev/sdb1
Created block storage object webapp using /dev/sdb1.
- 作用:把物理块设备
/dev/sdb1(10GiB)封装成 iSCSI 可识别的 "存储对象",命名为webapp; - 为什么用
block类型?因为/dev/sdb1是块设备(硬盘分区),如果是文件则用fileio,内存盘用ramdisk; - 这一步是 "把物理存储变成 iSCSI 能管理的资源",是共享的基础。
4. 创建 iSCSI Target(定义服务端标识)
bash
bash
/> cd /iscsi
/iscsi> create # 先创建示例(自动生成默认IQN)
Created target iqn.2003-01.org.linux-iscsi.storage.x8664:sn.21193655441b.
/iscsi> delete iqn.2003-01.org.linux-iscsi.storage.x8664:sn.21193655441b # 删除示例
/iscsi> create iqn.2026-01.cloud.migaomei.storage.x8664:webapp # 创建自定义IQN
Created target iqn.2026-01.cloud.migaomei.storage.x8664:webapp.
Created TPG 1.
Created default portal listening on all IPs (0.0.0.0), port 3260.
-
IQN 是什么
:iSCSI 限定的命名规则,格式为
iqn.年份-月份.域名反写.主机标识:自定义名称,用来唯一标识服务端 / 客户端;
你自定义的
iqn.2026-01.cloud.migaomei.storage.x8664:webapp中:
2026-01:创建年份 - 月份;cloud.migaomei:域名反写(原域名是 migaomei.cloud);storage.x8664:服务端主机标识(存储节点);webapp:自定义名称(标识这个 Target 是给 webapp 服务用的)。
-
TPG:Target Portal Group(目标门户组),iSCSI 协议要求的逻辑分组,所有 ACL/LUN/Portal 都在 TPG 下配置,默认创建 TPG 1;
-
默认 Portal :自动监听
0.0.0.0:3260(所有网卡的 3260 端口),后续会改成指定 IP,避免暴露所有网卡。
5. 配置 ACL(限定可访问的客户端)
bash
bash
/iscsi> cd iqn.2026-01.cloud.migaomei.storage.x8664:webapp/tpg1/
/iscsi/iqn.20...4:webapp/tpg1> acls/ create iqn.2026-01.cloud.migaomei.web1.x8664:webapp
Created Node ACL for iqn.2026-01.cloud.migaomei.web1.x8664:webapp
- 作用:白名单控制 ,只允许 IQN 为
iqn.2026-01.cloud.migaomei.web1.x8664:webapp的客户端(即 web1 节点)连接这个 Target; - 原理:客户端连接时会发送自己的 IQN,服务端对比 ACL 列表,只有匹配的才能通过认证,杜绝无关客户端访问。
6. 配置 LUN(映射存储资源给客户端)
bash
bash
/iscsi/iqn.20...4:webapp/tpg1> luns/ create /backstores/block/webapp
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2026-01.cloud.migaomei.web1.x8664:webapp
- 作用:把之前创建的存储后端
webapp(对应/dev/sdb1)映射为 LUN 0,绑定到上面授权的客户端; - 核心逻辑:
- LUN 是客户端看到的 "逻辑硬盘编号",客户端连接后会识别到
/dev/sdX(本地设备名),本质就是服务端的/dev/sdb1; - 这里把 LUN 0 绑定到指定客户端 ACL,确保只有该客户端能访问这个存储资源。
- LUN 是客户端看到的 "逻辑硬盘编号",客户端连接后会识别到
7. 配置 Portal(限定访问的网络地址)
bash
bash
/iscsi/iqn.20...4:webapp/tpg1> portals/ delete 0.0.0.0 3260 # 删除默认全网卡监听
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20...4:webapp/tpg1> portals/ create 10.1.8.10 3260 # 限定仅10.1.8.10网卡提供服务
Created network portal 10.1.8.10:3260.
- 作用:网络层面的访问控制 ,避免 iSCSI 服务暴露在服务器的所有网卡上(比如公网网卡),只通过内网 IP
10.1.8.10的 3260 端口提供服务; - 3260 是 iSCSI 协议的默认端口,必须放行防火墙。
8. 验证配置并退出(自动保存)
bash
bash
/iscsi/iqn.20...4:webapp/tpg1> ls # 查看最终配置
o- tpg1 ..................................................................................... [no-gen-acls, no-auth]
o- acls ................................................................................................ [ACLs: 1]
| o- iqn.2026-01.cloud.migaomei.web1.x8664:webapp .................................................. [Mapped LUNs: 1]
| o- mapped_lun0 ...................................................................... [lun0 block/webapp (rw)]
o- luns ................................................................................................ [LUNs: 1]
| o- lun0 .......................................................... [block/webapp (/dev/sdb1) (default_tg_pt_gp)]
o- portals .......................................................................................... [Portals: 1]
o- 10.1.8.10:3260 ......................................................................................... [OK]
/> exit # 退出并自动保存配置
Configuration saved to /etc/target/saveconfig.json
- 最终配置验证:
- ACL 有 1 个授权客户端,且绑定了 LUN 0;
- LUN 0 对应
/dev/sdb1; - Portal 仅监听
10.1.8.10:3260;
- 配置自动保存到
/etc/target/saveconfig.json,重启target服务后配置不会丢失。
整体逻辑总结
这套配置的核心是 "最小权限原则":
-
只共享需要的块设备(
/dev/sdb1); -
只允许指定客户端(web1 节点的 IQN)访问;
-
只通过指定内网 IP(10.1.8.10)提供服务;
最终实现 "web1 节点可以把 storage 节点的
/dev/sdb1当成本地硬盘使用",且全程限定访问范围,保证安全性。
客户端侧的核心逻辑(补充理解)
客户端(web1)需要做两件事才能用这个存储:
- 配置自己的 IQN 为
iqn.2026-01.cloud.migaomei.web1.x8664:webapp(和服务端 ACL 一致); - 通过
iscsiadm工具连接服务端的10.1.8.10:3260,认证通过后,/dev/sdb1会映射为客户端的本地块设备(比如/dev/sdc),格式化后即可挂载使用。
bash
## 非交互式
# 配置共享设备
[root@storage ~ 16:36:19]# targetcli /backstores/block create webapp /dev/sdb1
Created block storage object webapp using /dev/sdb1.
# 配置共享
[root@storage ~ 16:37:13]# targetcli /iscsi create iqn.2026-01.cloud.migaomei.storage.x8664:webapp
# acls 设置允许哪些客户端访问该存储
[root@storage ~ 16:37:53]# targetcli /iscsi/iqn.2026-01.cloud.migaomei.storage.x8664:webapp/tpg1/acls/ create iqn.2026-01.cloud.migaomei.web1.x8664:webapp
# luns 设置客户端可访问的块设备
[root@storage ~ 16:38:40]# targetcli /iscsi/iqn.2026-01.cloud.migaomei.storage.x8664:webapp/tpg1/luns/ create /backstores/block/webapp
# portals 设置通过哪个物理ip访问该存储
[root@storage ~ 16:39:43]# targetcli /iscsi/iqn.2026-01.cloud.migaomei.storage.x8664:webapp/tpg1/portals/ delete 0.0.0.0 3260
[root@storage ~ 16:40:20]# targetcli /iscsi/iqn.2026-01.cloud.migaomei.storage.x8664:webapp/tpg1/portals/ create 10.1.8.10 3260
# 最后结果
[root@storage ~ 16:40:40]# targetcli / ls
# 5. 设置防火墙
[root@storage ~ 16:42:29]# firewall-cmd --add-service=iscsi-target
[root@storage ~ 16:42:36]# firewall-cmd --permanent --add-service=iscsi-target
bash
# 6. 客户端验证
[root@web1 ~ 16:43:16]# yum install -y iscsi-initiator-utils
[root@web1 ~ 16:44:47]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2026-01.cloud.migaomei.web1.x8664:webapp
# 扫描目标
[root@web1 ~ 16:45:50]# iscsiadm -m discovery -t st -p storage
10.1.8.10:3260,1 iqn.2026-01.cloud.migaomei.storage.x8664:webapp
# 登录目标
[root@web1 ~ 16:46:42]# iscsiadm -m node -T iqn.2026-01.cloud.migaomei.storage.x8664:webapp -p storage -l
Logging in to [iface: default, target: iqn.2026-01.cloud.migaomei.storage.x8664:webapp, portal: 10.1.8.10,3260] (multiple)
Login to [iface: default, target: iqn.2026-01.cloud.migaomei.storage.x8664:webapp, portal: 10.1.8.10,3260] successful.
[root@web1 ~ 16:47:40]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 10G 0 disk
# 格式化,挂载,使用
[root@web1 ~ 16:47:48]# mkfs.xfs /dev/sdb
[root@web1 ~ 16:48:25]# yum install -y nginx
[root@web1 ~ 16:48:50]# mkdir -p /usr/share/nginx/html/webapp
[root@web1 ~ 16:48:59]# mount /dev/sdb /usr/share/nginx/html/webapp
[root@web1 ~ 16:49:03]# echo Hello World From iSCSI > /usr/share/nginx/html/webapp/index.html
[root@web1 ~ 16:49:24]# df -h /usr/share/nginx/html/webapp
Filesystem Size Used Avail Use% Mounted on
/dev/sdb 10G 33M 10G 1% /usr/share/nginx/html/webapp
[root@web1 ~ 16:49:32]# systemctl enable nginx --now
[root@storage ~ 16:50:06]# curl http://web1.migaomei.cloud/webapp/
Hello World From iSCSI
# 测试web2是否可以访问
[root@web2 ~ 16:44:12]# yum install -y iscsi-initiator-utils
[root@web2 ~ 16:50:33]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2026-01.cloud.migaomei.web2.x8664:webapp
[root@web2 ~ 16:50:57]# iscsiadm -m discovery -t st -p storage
10.1.8.10:3260,1 iqn.2026-01.cloud.migaomei.storage.x8664:webapp
# web2登录失败:因为storage未放行
[root@web2 ~ 16:51:15]# iscsiadm -m node -T iqn.2026-01.cloud.migaomei.storage.x8664:webapp -p storage -l
Logging in to [iface: default, target: iqn.2026-01.cloud.migaomei.storage.x8664:webapp, portal: 10.1.8.10,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.2026-01.cloud.migaomei.storage.x8664:webapp, portal: 10.1.8.10,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals
# storage放行web2
[root@storage ~ 16:37:53]# targetcli /iscsi/iqn.2026-01.cloud.migaomei.storage.x8664:webapp/tpg1/acls/ create iqn.2026-01.cloud.migaomei.web2.x8664:webapp
# web2 重新登录
[root@web2 ~ 16:51:21]# iscsiadm -m node -T iqn.2026-01.cloud.migaomei.storage.x8664:webapp -p storage -l
Logging in to [iface: default, target: iqn.2026-01.cloud.migaomei.storage.x8664:webapp, portal: 10.1.8.10,3260] (multiple)
Login to [iface: default, target: iqn.2026-01.cloud.migaomei.storage.x8664:webapp, portal: 10.1.8.10,3260] successful.
[root@web2 ~ 16:52:49]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 10G 0 disk
# 发现设备已经具备文件系统
[root@web2 ~ 16:52:59]# blkid /dev/sdb
/dev/sdb: UUID="023c9b26-5b17-4edc-80c5-903e5311110c" TYPE="xfs"
# 此时不要挂载
访问iSCSI存储
断开目标连接
要停止使用iSCSI目标,请执行以下步骤:
- 确保没有使用目标提供的任何设备。 例如,卸载文件系统。
- 从/etc/fstab等位置删除对目标的所有持久引用。
- 从iSCSI目标注销。
bash
[root@client ~]# iscsiadm -m node -T iqn.2024-
12.cloud.laoma.server:disk1 \
> -p 10.1.8.10:3260 -u
- 删除 iSCSI目标的本地记录,以使启动器在引导过程中不会自动登录到目标。
bash
[root@client ~]# iscsiadm -m node -T iqn.2024-
12.cloud.laoma.server:disk1 \
> -p 10.1.8.10:3260 -o delete
故障处理
如果发现成功,但是启动器登录到发现的目标时遇到问题,则该问题很可能与访问控制或身份验 证有关。客户端上的IQN与服务器上的IQN不匹配会导致目标登录失败。
如果问题是由于客户端上的启动器IQN不正确引起的,请在客户端 的/etc/iscsi/initiatorname.iscsi文件中修复IQN,然后重新启动iscsid服务以使更改生效。
原因:iscsid 服务缓存了之前客户端扫描时使用的IQN。
处理方法:重启 iscsid 服务,释放之前客户端扫描时使用的IQN。
bash
[root@client ~]# systemctl restart iscsid
# 重新登录
[root@client ~]# iscsiadm -m node -T iqn.2024-
12.cloud.laoma.server:disk1 -l



bash
# 1. 停止多路径服务
systemctl stop multipathd
# 2. 清除现有多路径设备映射
multipath -F
# 3. 重新扫描并创建多路径设备
multipath -v2
# 4. 重启多路径服务
systemctl restart multipathd
# 5. 验证最终效果
multipath -ll

12.cloud.laoma.server:disk1 -l
[外链图片转存中...(img-pw3k18Jh-1768900902823)]
]
[外链图片转存中...(img-G6mx4sPG-1768900902824)]
```bash
# 1. 停止多路径服务
systemctl stop multipathd
# 2. 清除现有多路径设备映射
multipath -F
# 3. 重新扫描并创建多路径设备
multipath -v2
# 4. 重启多路径服务
systemctl restart multipathd
# 5. 验证最终效果
multipath -ll
外链图片转存中...(img-dFwKB7S4-1768900902824)