25.2 ZFS 磁盘扩容

本节系统阐述 ZFS 文件系统磁盘扩容的技术原理、操作流程与风险控制。作为企业级存储管理的核心功能之一,ZFS 提供了安全、灵活的存储池扩容机制,支持在线扩展而无需中断服务。ZFS 扩容分为两个步骤:首先调整底层分区大小以利用新增空间,然后通过 ZFS 命令让存储池重新识别设备的新容量,从而完成池的扩展。

磁盘扩容

警告

ZFS 文件系统只能扩展,不能缩小。因此无法撤销更改。

注意

此方法仅适用于向后扩展,如果 freebsd-zfs 分区前方有空闲空间,则无法使用此方法进行扩展。

显示当前磁盘分区表和分区信息:

# gpart show
=>       40  167772087  nda0  GPT  (80G)
         40     532480     1  efi  (260M)
     532520       1024     2  freebsd-boot  (512K)
     533544        984        - free -  (492K)
     534528    4194304     3  freebsd-swap  (2.0G)
    4728832  142071775     4  freebsd-zfs  (68G)
  146800607   20971520        - free -  (10G)

可以看到,free 空闲空间是 10 GB。

根据分区表信息,选择位于空闲空间前方的 freebsd-zfs 分区(本例中为第 4 个分区)进行扩容,操作前请确认分区序号正确:

# gpart resize -i 4 nda0	# 调整 nda0 磁盘上第 4 个分区的大小
nda0p4 resized

显示当前磁盘分区表和分区信息:

列出系统中所有 ZFS 池及其状态信息:

显示 ZFS 池的详细状态信息,包括健康状况和错误信息:

扩展 ZFS 池:

查看扩容后的所有 ZFS 池及其容量、使用情况和健康状态:

已经扩展完成。

参考文献

附录

本附录介绍一些 gpart 命令的额外用法。可以通过 gpart show 命令获取分区编号,也可以使用参数 -p 以完整路径显示所有磁盘及分区信息。

  • 打印分区类型 GUID(适用于 GPT)或原始分区类型(适用于 MBR)

以可重现和完整的路径形式显示磁盘及分区信息:

  • 显示磁盘 mmcsd0 的详细分区信息:

参考文献

故障排除

本节介绍 ZFS 磁盘扩容过程中可能遇到的常见问题及解决方案。

gpart: table 'ada0' is corrupt: Operation not permitted

提示分区表错误,需要重置 GPT 分区表。此问题多发生在直接导入的裸磁盘映像上。gpart recover 命令会从备份的 GPT 表头恢复主分区表信息。

此问题多发生在直接导入的裸磁盘映像上。

ZFS 无法向前扩展

错误示例方法

警告

此方法不正确,请勿在生产环境中使用。

如果使用 ZFS 作为 / 根文件系统:

重启后,启动加载器会报错 ZFS: i/o error - all block copies unavailable。这是因为 FreeBSD 引导加载器设计上仅能从单一的 ZFS vdev 引导,添加新 vdev 后引导加载器无法正确定位根文件系统。

对于根文件系统的向前扩展,需要采用备份数据、重新分区、恢复数据的方案。

参考文献

课后习题

  1. 在 QEMU 中创建一个 FreeBSD 虚拟机,为其根文件系统磁盘添加 20 GB 空闲空间,完成扩容后测试系统启动与数据完整性。

  2. 选取 ZFS 磁盘扩容的向后扩展机制,编写一个最小脚本在虚拟机中复现向前扩展的启动错误,并分析其根源尝试解决。

最后更新于