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 出问题,按这个顺序定位:
# 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 条还没有留言,来说点什么吧。