外观
iSCSI 与 FC SAN
企业环境里经常已经有一台 SAN(存储区域网络)设备,通过 iSCSI 或光纤通道 (Fibre Channel, FC) 对外提供块存储。这篇讲怎么把这类共享块设备接入 PVE 集群,并在上面建可供多节点使用的存储。
共享存储配置错误会导致数据损坏,不只是某个节点的问题
本文涉及两类高风险场景:
- 多节点同时写同一个 LVM 卷组,但没有正确标记为「共享」,会导致集群内的 LVM 元数据不一致,可能损坏卷组上所有虚拟机的磁盘,不是「某一台受影响」,是整个卷组遭殃。
- PVE 9 起提供的共享 LVM 快照(卷链快照)目前是技术预览,尚未经过大规模生产验证,不建议直接用在承载重要数据的卷上。
开始前:在测试用的 LUN 或者用软件模拟的 iSCSI target(比如临时用一台机器跑 targetcli 对外提供一个测试 LUN)上完整走一遍配置和快照流程,确认理解每一步在做什么,再接入生产 SAN。
开始之前
- 已有一台 SAN 设备(iSCSI target 或 FC 存储阵列),知道它导出的连接信息(iSCSI 是 portal 地址 + target IQN;FC 是走光纤通道交换机分区 (zoning) 和 LUN masking,由存储管理员配置)。
- 理解 iSCSI/FC 本身只是一根管子,传输的是裸块设备 (LUN),没有文件系统、没有空间管理接口。要让多台虚拟机共用同一个 LUN,需要在它上面再叠一层 LVM。
- 打算做多节点共享访问时,提前确认网络或光纤链路本身有冗余,参考官方的 Multipath 指南。
架构:LUN 之上叠 LVM
text
SAN 存储阵列
└── 导出一个大 LUN(iSCSI target 或 FC LUN)
└── PVE 在这个 LUN 上创建一个 LVM 卷组(标记为共享)
└── 卷组里给每台虚拟机切出逻辑卷这样做的原因:iSCSI/FC 协议本身不提供「在这个 LUN 里再切一块给虚拟机 A、再切一块给虚拟机 B」的能力,必须靠 LVM 这一层做空间管理和多主机协调。
操作步骤
第一步:接入 iSCSI target
sh
# 宿主机 shell 执行,先确认已安装
apt install open-iscsiWeb UI:数据中心 → 存储 → Add → iSCSI。
| 字段 | 填什么 |
|---|---|
| ID | 存储名 |
| Portal | SAN 的 IP 或主机名,可带端口 |
| Target | 目标 IQN,可以先用「Discover」列出该 portal 上可用的 target |
| Use LUNs directly | 不要勾,除非你清楚要直接把整块 LUN 当块存储用(那样不能多主机共享切分) |
通常把 Content 设为 none
iSCSI 存储本身只建议叠 LVM,不直接拿来放虚拟机磁盘。把 Content 留空(none),后面 LVM 那层再选内容类型。
FC SAN 没有单独的 PVE 存储插件——存储阵列把 LUN 呈现给宿主机之后,宿主机看到的就是普通的本地块设备(/dev/sdX),后续步骤和「在一块本地盘上建 LVM」是一样的,区别只在于这块「盘」实际上是通过光纤链路连过来的共享 LUN。
第二步:在 LUN 上建共享 LVM
Web UI:数据中心 → 存储 → Add → LVM。
| 字段 | 填什么 |
|---|---|
| ID | 存储名 |
| Base storage | 选上一步建的 iSCSI 存储(或者已经识别到的 FC LUN 对应的磁盘) |
| Base volume | 具体的 LUN |
| Volume group | 新建一个卷组名 |
| Shared | 必须勾上,这是让集群里所有节点都能安全访问同一份 LVM 元数据的关键开关 |
| Content | 按需勾选 Disk image、Container |
Shared 不勾,多节点同时用会损坏数据
Shared 标记决定 PVE 是否对这个存储做集群级锁。如果底层卷组确实被多个节点共享访问,但没有勾选 Shared,多个节点各自以为自己独占,并发写入 LVM 元数据会导致损坏,殃及卷组上的全部虚拟机磁盘。反过来,单节点本地的 LVM 也不要错勾 Shared。
第三步(可选):给多路径链路做 multipath
如果 SAN 到宿主机之间有多条物理路径(多张网卡/多个交换机做 iSCSI,或多条光纤链路),应该配置 multipath-tools,让系统把多条路径合并成一个 /dev/mapper/... 设备使用,而不是把每条路径当成独立的盘。用哪个设备做 LVM 物理卷,要用合并后的 multipath 设备,不要直接用某一条路径的原始设备。具体的 multipath.conf 配置和 iSCSI 多网卡接口设置和存储厂商相关,参照存储厂商文档和官方的 Multipath 指南。
用 Web UI 管理 iSCSI 的话,注意启动顺序问题
社区反馈过一种情况:PVE 启动时连接 iSCSI 的时机比 multipath 生效的时机晚,导致 multipath 没能接管所有路径。如果你的环境对多路径要求严格,可以考虑用 iscsiadm 手动管理 iSCSI 会话而不是完全交给 PVE 的存储层,具体取舍需要结合你的 SAN 厂商建议。
PVE 9 起:共享 LVM 上的快照(卷链快照)
传统的共享 LVM(iSCSI/FC 之上)不支持虚拟机快照——这是它相对 ZFS/Ceph 最大的短板。PVE 9 引入了 snapshot-as-volume-chain,作为技术预览功能部分弥补这个短板。
原理:打快照时,把当前卷内容原样保留、改名成快照卷,同时新建一个基于该快照做卷链 (backing chain) 的新卷接手后续写入(用 qcow2 格式做分层,但不是用 qcow2 自身的快照机制)。这样任何支持块存储的系统,包括 iSCSI 和 FC SAN,都能获得快照能力。
在 LVM 存储的 Web UI 编辑面板中开启:
| 字段 | 说明 |
|---|---|
| Snapshot as Volume Chain | 开启后,新建的虚拟机磁盘获得快照能力;只影响新建的磁盘,已有磁盘不会自动获得该能力 |
技术预览意味着还有已知限制
- 快照卷是厚置备 (thick-provisioned) 的逻辑卷,即便实际数据很小,PVE 侧也会显示为占用了整卷大小的空间——容量规划要按这个算,不能按薄置备预期。
- 要发挥效率,底层存储需要支持精简置备和 discard。
- 这是技术预览功能,不建议在没有做过充分测试、且没有独立备份的生产卷上使用。先在测试 LUN 上验证创建快照、回滚快照、删除快照的完整流程,确认符合预期再考虑用于重要数据。
检查结果
sh
# iSCSI 会话是否已连接
iscsiadm -m session
# 存储状态
pvesm status
# 卷组信息,确认 Attr 列显示为共享可用
vgs
lvs -a
# 如果配置了 multipath,确认路径数量符合预期
multipath -ll集群环境下,额外确认:在节点 A 上建的测试虚拟机能不能在线迁移到节点 B(说明共享访问链路和锁机制都工作正常)。
常见问题
vgs 看不到卷组,但 iSCSI session 已经建立。 先确认 LUN 本身在宿主机上可见(lsblk、fdisk -l),再检查有没有做过 pvcreate/vgcreate;用 Web UI 的 LVM 向导创建会自动完成这两步。
换一台 SAN 或换 LUN 之后 iSCSI target 名字要不要改。 IQN 变了必须同步改 PVE 存储配置里的 Target 字段,否则挂载会失败或挂到错误的 LUN 上——这也是为什么迁移 SAN 前必须先核对好新旧 LUN 的对应关系,而不是假设编号不变。
多路径配置好了,但只用了一半带宽。 常见原因是 iSCSI 只用了一个网络接口(默认接口叫 default),没有为每条物理路径配置独立的 iSCSI 接口。需要按存储厂商文档给每条路径单独配置 iSCSI interface。