技术文章2026 年 1 月 30 日约 2.8 分钟

iSCSI 存储架构:Target、Initiator 与 LUN

理解 iSCSI 的 Target、Initiator 和 LUN,梳理网络存储规划、认证与容量边界。

iSCSI 的本质是「用 TCP 传 SCSI 命令」。它把一块块存储设备通过网络暴露出去,让远端服务器像用本地盘一样用它。理解 iSCSI,关键是分清三个角色的职责,以及它们各自该由谁负责。

#三个角色的分工

  • Target(目标端):存储侧。它把本地的块设备(LUN)「发布」到网络上。你可以把它理解成饭店的后厨——菜(数据)在这里做,但怎么端到客人桌上它不管。
  • Initiator(发起端):使用侧。服务器上的客户端,它发起连接、把远端 LUN 当成一块本地磁盘来用。
  • LUN(Logical Unit Number):一块逻辑单元,本质是 Target 对外发布的一个块设备编号。一个 Target 可以发布多个 LUN,像是一个门店多个窗口。

Linux 上两者的常见实现:

  • Target 端:targetcli / LIO(Linux-IO Target),RHEL/Rocky 自带内核模块。
  • Initiator 端:open-iscsi,装完有 iscsiadm 命令和 iscsid 服务。

#规划时先想清楚三件事

1. 网络隔离。 iSCSI 走 TCP,默认 3260 端口,明文传输。生产环境至少要给存储单独划 VLAN,最好单独用一张网卡甚至独立交换机;数据量大时优先走专用的存储网络,别和业务流量抢带宽。认证方面,CHAP 是明文+挑战应答,能防「蹭盘」,但防不了抓包重放;要求更高的场景直接上 IPsec 或 NVMe-oF/TLS。

2. 容量和冗余边界。 LUN 建多大、底层用 RAID 还是裸盘、快照在哪里做——这些在 Target 侧决定。Initiator 看到的只是「一块盘」,不知道底层是 RAID5 还是单盘。所以容灾的兜底责任在存储侧,客户端别指望它自己知道数据是否冗余。

3. 会话与路径。 一台服务器可以同时从一个 Target 的多块网卡、甚至多个 Target 发起多条路径,这就是 multipath 的场景。路径多不代表数据多个副本,它只是「多条路到同一个目的地」——冗余的是链路,不是数据。

#一个常见的误解:LUN 和文件系统

Initiator 端拿到 LUN 之后,fdisk/分区/mkfs 都是客户端自己的事。LUN 对客户端就是一块裸盘,你可以:

  • 直接 mkfs 挂载(不分区的裸文件系统,迁移时整块带走,最灵活);
  • 分区后使用(分区表在客户端,换机器要重新认盘);
  • 拿去做 LVM 的 PV(这样以后扩 LUN 后 pvresize 在线扩容,非常顺)。

我个人的习惯是裸 LUN + LVM:存储侧扩容 LUN → 客户端 pvresize → lvextend → grow 文件系统,全程在线,这是块存储最舒服的用法。

#排查思路:先分层

iSCSI 出问题,按这个顺序定位:

bash
# 1. 链路层
ping <target-ip> && ss -tn state established '( dport = :3260 )'

# 2. 发现层
iscsiadm -m discovery -t sendtargets -p <target-ip>

# 3. 会话层
iscsiadm -m session
lsblk -S        # 看有没有新的 SCSI 盘

# 4. 数据层(连接正常但 IO 失败)
dmesg | grep -i scsi
iostat -x 1

链路通但发现不到 Target,多半是防火墙或 target 的 portal 配置问题;发现得到但登录失败,看 CHAP 和 ACL;登录成功但 IO 卡,查多路径和链路质量。逐层排查,不要一上来就重启 iscsid。

最后记住一句话:iSCSI 给你的不是「网络硬盘」,而是「SCSI 语义的远程块设备」。所有在本地盘上要注意的事(备份、一致性、监控),在 iSCSI 上一样都不能少,反而因为多了网络这一层,要更谨慎。

写于 2026 年 1 月 30 日

栏目
技术文章
约
2.8 分钟
字数
1.6K
阅读
144

本文为原创记录,转载请注明出处。如果这篇替你省了时间,欢迎留言说说你踩到的坑。

同题 · related

留言 · remarks

00 条

还没有留言,来说点什么吧。

iSCSI 存储架构:Target、Initiator 与 LUN · LXH·BLOG