在线将 zpool 转换为 GELI 加密卷的尝试
今天尝试了一下将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完成之后,对下一个设备重复此操作。