最简单的方案是把需要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 的存储列表:

  1. 登录 Web 界面,点击 Datacenter (数据中心) -> Storage (存储)。
  2. 点击 Add (添加) -> ZFS。
  3. ID: 给它起个名字,比如 zfs_no_crypt。
  4. ZFS Pool: 填写 myzfs/ha_data。
  5. Nodes: 确保选中了所有相关节点(sailor16, bitsDE 等)。
  6. Content: 选中 Container image 和 Disk image。
  7. 点击 Add。

第三步:将 CT 104 迁移到不加密存储

现在你需要把 CT 104 目前那个加密的磁盘“搬”到这个不加密的区域:

  1. 在左侧树状菜单选中 CT 104。
  2. 点击 Resources (资源)。
  3. 选中 Root Disk (根磁盘)。
  4. 点击上方的 Volume Action (卷操作) -> Move Storage (移动存储)。
  5. Target Storage (目标存储): 选择你刚才创建的 zfs_no_crypt。
  6. 点击 Move Volume。

    • PVE 会在底层执行 zfs send/recv,因为目标数据集 ha_data 是非加密的,新生成的磁盘也会是非加密的。

第四步:在目标节点 (bitsDE) 重复创建数据集

非常重要: 因为你使用的是本地 ZFS 存储,你必须在另一个节点上也创建同样路径的数据集,否则 PVE 复制会找不到目标。

在 bitsDE (212.60.153.1) 上执行:

# 确保 bitsDE 也有同样的接收位置
zfs create -o encryption=off myzfs/ha_data

第五步:重新开启 HA 复制

  1. 回到 CT 104 -> Replication (复制)。
  2. 删掉之前那个报错的任务。
  3. 新建一个复制任务。
  4. 点击 Run now。

为什么这样能解决问题?
由于现在的磁盘位于 myzfs/ha_data 下,它是非加密的,Proxmox 的复制脚本就不再需要 -w (raw flag) 参数,普通的 zfs send/recv 就能完美运行,不会再报之前的属性错误。


💡 进阶建议

既然你已经决定分出不加密区域用于 HA,那么建议:

  • 以后所有需要高可用(HA)的容器/虚拟机,都创建在 zfs_no_crypt 这个存储里。
  • 对安全性要求极高、不需要 HA 的数据,放在原本加密的存储里。

这样你就完美避开了 PVE 自动复制与 ZFS 原生加密之间的兼容性深坑。操作完这几步后,试一下手动触发同步,这次应该会直接通过!