04. iSCSI 服务器

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,确保只有该客户端能访问这个存储资源。
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 服务后配置不会丢失。

整体逻辑总结

这套配置的核心是 "最小权限原则":

  1. 只共享需要的块设备(/dev/sdb1);

  2. 只允许指定客户端(web1 节点的 IQN)访问;

  3. 只通过指定内网 IP(10.1.8.10)提供服务;

    最终实现 "web1 节点可以把 storage 节点的

    复制代码
    /dev/sdb1

    当成本地硬盘使用",且全程限定访问范围,保证安全性。

客户端侧的核心逻辑(补充理解)

客户端(web1)需要做两件事才能用这个存储:

  1. 配置自己的 IQN 为 iqn.2026-01.cloud.migaomei.web1.x8664:webapp(和服务端 ACL 一致);
  2. 通过 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

![a8c0794bd1c53f3b8a946125a60f1198](C:\Users\14709\Documents\Tencent Files\1470985644\nt_qq\nt_data\Pic\2026-01\Ori\a8c0794bd1c53f3b8a946125a60f1198.png

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)]

![a8c0794bd1c53f3b8a946125a60f1198](C:\Users\14709\Documents\Tencent Files\1470985644\nt_qq\nt_data\Pic\2026-01\Ori\a8c0794bd1c53f3b8a946125a60f1198.png

[外链图片转存中...(img-19s7fUqL-1768900902824)]

[外链图片转存中...(img-G6mx4sPG-1768900902824)]

```bash
# 1. 停止多路径服务
systemctl stop multipathd

# 2. 清除现有多路径设备映射
multipath -F

# 3. 重新扫描并创建多路径设备
multipath -v2

# 4. 重启多路径服务
systemctl restart multipathd

# 5. 验证最终效果
multipath -ll

外链图片转存中...(img-dFwKB7S4-1768900902824)

相关推荐
403240732 小时前
【2026最新】Jetson全系列安装支持CUDA加速的OpenCV 4.10保姆级教程(适配Jetpack 6/5及Orin/Xavier/Nano等)
linux·opencv·计算机视觉·nvidia·cuda·jetson
天空属于哈夫克32 小时前
基于图像识别与句柄操作的企业微信外部群自动化实践
运维·自动化·企业微信
optimistic_chen2 小时前
【Docker入门】Docker原理和安装
linux·运维·服务器·docker·容器·命令行
wdfk_prog2 小时前
[Linux]学习笔记系列 --[drivers][base]devtmpfs
linux·笔记·学习
天空属于哈夫克32 小时前
基于 UI 自动化实现企业微信外部群主动推送的架构设计
运维·自动化·企业微信
渣渣灰95872 小时前
Windows11安装WSL2(Windows Subsystem for Linux)
linux·运维·windows
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.2 小时前
LVS基于 IPVS 的 NAT 模式负载均衡实战部署与故障排查指南
运维·负载均衡·lvs
南山二毛2 小时前
ubuntu开机自启动脚本
linux·运维·ubuntu