最简单的方案是把需要HA的虚拟机放到不加密的zfs dataset上。更复杂的以后再折腾 😑
在 ZFS 中,你不需要像传统分区(LVM/EXT4)那样通过调整磁盘物理分区(Partition)来分出空间。ZFS 的空间是逻辑共享的。
同一个 myzfs 池(Pool)里,可以同时存在加密和不加密的数据集(Dataset)。
要解决 Proxmox HA 复制报错的问题,最直接的方法是:在当前池下创建一个不加密的数据集,然后将容器的磁盘迁移过去。
第一步:创建一个不加密的 ZFS 数据集
在 sailor16 的命令行执行:
# 创建一个明确关闭加密的数据集,命名为 ha_data
zfs create -o encryption=off myzfs/ha_data确认状态:
zfs get encryption myzfs/ha_data
# 应该输出:myzfs/ha_data encryption off default第二步:在 Proxmox GUI 中添加这个“新存储”
为了让 PVE 能够识别并管理这个不加密的区域,你需要把它添加进 PVE 的存储列表:
- 登录 Web 界面,点击 Datacenter (数据中心) -> Storage (存储)。
- 点击 Add (添加) -> ZFS。
- ID: 给它起个名字,比如
zfs_no_crypt。 - ZFS Pool: 填写
myzfs/ha_data。 - Nodes: 确保选中了所有相关节点(sailor16, bitsDE 等)。
- Content: 选中 Container image 和 Disk image。
- 点击 Add。
第三步:将 CT 104 迁移到不加密存储
现在你需要把 CT 104 目前那个加密的磁盘“搬”到这个不加密的区域:
- 在左侧树状菜单选中 CT 104。
- 点击 Resources (资源)。
- 选中 Root Disk (根磁盘)。
- 点击上方的 Volume Action (卷操作) -> Move Storage (移动存储)。
- Target Storage (目标存储): 选择你刚才创建的
zfs_no_crypt。 点击 Move Volume。
- PVE 会在底层执行 zfs send/recv,因为目标数据集
ha_data是非加密的,新生成的磁盘也会是非加密的。
- PVE 会在底层执行 zfs send/recv,因为目标数据集
第四步:在目标节点 (bitsDE) 重复创建数据集
非常重要: 因为你使用的是本地 ZFS 存储,你必须在另一个节点上也创建同样路径的数据集,否则 PVE 复制会找不到目标。
在 bitsDE (212.60.153.1) 上执行:
# 确保 bitsDE 也有同样的接收位置
zfs create -o encryption=off myzfs/ha_data第五步:重新开启 HA 复制
- 回到 CT 104 -> Replication (复制)。
- 删掉之前那个报错的任务。
- 新建一个复制任务。
- 点击 Run now。
为什么这样能解决问题?
由于现在的磁盘位于 myzfs/ha_data 下,它是非加密的,Proxmox 的复制脚本就不再需要 -w (raw flag) 参数,普通的 zfs send/recv 就能完美运行,不会再报之前的属性错误。
💡 进阶建议
既然你已经决定分出不加密区域用于 HA,那么建议:
- 以后所有需要高可用(HA)的容器/虚拟机,都创建在
zfs_no_crypt这个存储里。 - 对安全性要求极高、不需要 HA 的数据,放在原本加密的存储里。
这样你就完美避开了 PVE 自动复制与 ZFS 原生加密之间的兼容性深坑。操作完这几步后,试一下手动触发同步,这次应该会直接通过!