如何:重建根 zpool

💡 原文中文,约3600字,阅读约需9分钟。
📝

内容提要

本文讲述了作者在重做FreeBSD GPT引导分区时遇到的问题,忘记设置ashift导致ZFS创建了错误的扇区大小的根存储池。为解决问题,作者决定重建根存储池并整体重写数据。文章详细介绍了操作步骤和注意事项。

🔎

延伸解读

ashift 设置不当的后果与修复动机

文章指出,作者在创建根存储池时忘记设置 ashift,而当时 SSD 报告扇区尺寸为 512 字节,导致 ZFS 创建了 ashift=9 的池。尽管根存储池读写不频繁,但 zpool status 会提示非原生块大小并预期性能下降。作者出于强迫症和潜在性能考虑,决定重建存储池。这提醒读者,在创建 ZFS 池时显式设置 ashift 可避免后续迁移的麻烦。

利用 swap 分区作为临时空间的技巧

作者将加密 swap 分区缩小,腾出空间新建一个 ZFS 分区,并将其作为镜像附加到原根存储池,再拆下旧设备。这样无需额外硬件即可完成存储池迁移。操作前需关闭 swap,调整分区大小,并确保新分区类型正确。此方法适合内存远大于根池、swap 分区有富余的场景,但需谨慎操作分区表。

数据迁移与压缩属性处理

作者通过 ZFS 快照和 send/receive 将数据从旧池复制到新池,并在接收时使用 -x compression 排除压缩属性,使新池采用本地设置的 zstd 压缩。这样数据在重写时重新压缩,可能节省空间。同时,作者更新了 /etc/fstab 和 /boot/zfs/zpool.cache,并设置 bootfs 以确保从新池引导。这些步骤保证了迁移后系统可正常启动。

操作风险与备份的重要性

文章多次强调备份的重要性,并提醒在操作前确认备份完整。重建根存储池涉及分区调整、存储池操作和引导配置,任何失误都可能导致系统无法启动。作者还建议在迁移后抹去临时分区数据,防止数据泄漏。对于生产环境或重要数据,应谨慎评估风险,并确保有可回退的方案。

❓

Q&A

如何重建FreeBSD的根zpool?

重建根zpool的步骤包括关闭加密的swap分区、调整swap分区大小、将新设备作为mirror插入根存储池、修改vfs.zfs.vdev.min_auto_ashift、创建新的zpool和文件系统、复制快照到新存储池、更新配置文件,最后重启系统确认。

为什么需要重建根存储池?

因为在创建根存储池时忘记设置ashift,导致ZFS创建了错误的512字节扇区大小,影响性能,因此需要重建以提高性能。

在重建根zpool时需要注意哪些事项?

需要注意关闭加密的swap分区、调整swap分区大小、确保备份完整、修改ashift设置以防止错误创建存储池,以及更新/etc/fstab和/boot/zfs/zpool.cache。

如何确保新创建的zpool性能最佳?

通过设置合适的ashift值(如12)和使用支持的块大小的设备来确保新创建的zpool性能最佳。

如何处理旧根存储池的数据?

可以通过创建快照并将其复制到新存储池来处理旧根存储池的数据,确保在接收时排除压缩属性。

重建根zpool后如何恢复加密swap分区?

重建根zpool后,可以通过删除临时分区、调整swap分区大小并重新挂载swap分区来恢复加密swap分区。

🏷️

标签

➡️

继续阅读