在线将 zpool 转换为 GELI 加密卷的尝试

• 本文约 677 字,阅读大致需要 2 分钟 | Data Management

今天尝试了一下将 zpool 在线转换为 geli 加密卷,失败。这里记一笔。

想法是:将 zpool (RAIDZ)中的一块盘 offline,建立 GELI 卷,然后用新建的 GELI 卷来替换拿下来的盘。

失败原因主要是两点:首先,GELI 设备比其下的盘小 4kB (8个扇区)。这部分空间用来保存 GELI 的元数据。这样,替换后的设备要比原先的略小(之前曾经遇到过 SATA 硬盘不同批次尺寸不一样的情况)。另外,这个 zpool 在创建的时候使用的是 512 字节的扇区,而 GELI 的块尺寸是 4kB,因此会有问题。

如此看来,为了支持未来的扩展,需要做两件事:

第一个是毫不犹豫地"浪费"少量空间:预留适当的保留空间(如 1MB,甚至若干 GB 的交换区)可以避免在未来需要换盘时因为供货的问题导致出现困难。当然,如果是针对企业市场的硬盘,通常是可以避免这种情况发生的。不过需要注意的是,如果交换分区放在不同的硬盘上而不做任何冗余的话,也有可能会出现掉盘导致系统不稳定的问题。

第二个是应该尽量将卷做成按 4kB 对齐的,即使磁盘本身并不是 4kB 的。我个人的测试显示这样并不会导致性能下降,相反在许多情况下可以改善吞吐量。


更新:后来测试成功,下面是大致过程。

做转换的 pool 要符合几个条件:

  • 所有设备必须都做过 4k 扇区处理,或原本用的就是 4k 扇区;
  • 所有设备均有冗余,也就是说可以 offline。如果使用的 zpool 是 raidz, raidz2, raidz3 或 mirror 就没有问题;非冗余的 log 和 cache 设备也是可以的;
  • 磁盘上必须有与数据存储区邻接的未分配空间,或可以腾出这样的空间,且不小于 4k。

大致过程如下:

  • 用 zpool offline 将设备 offline;
  • 用 gpart resize 调整分区尺寸;
  • 创建 geli 设备;
  • 用 zpool replace 替换之前 offline 的设备;
  • 待 resilver 完成之后,对下一个设备重复此操作。