如何调整超出 16TB 限制的 ext4 分区?

anx*_*anx 27 ext4

当尝试调整没有 64 位标志创建的旧 ext4 分区的大小时,如果新大小等于或超过 16TiB,则 resize2fs 1.42 将失败。

$ resize2fs -p /dev/mapper/target-device
resize2fs: New size too large to be expressed in 32 bits
Run Code Online (Sandbox Code Playgroud)

我不想将文件复制到外部媒体。我也不想冒数据丢失的风险。如何安全地调整音量?

anx*_*anx 50

使用该选项-O 64bit(在今天创建的文件系统中默认启用),ext 文件系统可以跨越 1024 PiB 而不仅仅是 16 TiB 卷。您可以升级旧文件系统以激活此选项。

在你开始之前

  1. 此大小的卷必须由 RAID 支持。否则,常规磁盘错误造成损害。
  2. 尽管如此,RAID 不是备份。您也必须将贵重物品存放在其他地方。
  3. 首先调整大小并验证所有周围的卷(分区表、加密、lvm)。
  4. 对 RAID 进行更改后,linux 可能不会立即确认新的最大大小。检查$ cat /proc/partitions,必要时重新启动。
  5. 使用最新的、受支持的内核。如果有疑问,请安装所有升级并重新启动。
  6. 获取版本1.43(2016-05-17) 或更高版本的 e2fsprogs
  • ?? Ubuntu 20.04(2020-04-23) 随附e2fsprogs 1.45.x(好!)
  • ?? Ubuntu 18.04(2018-04-26) 随附e2fsprogs 1.44.x(好!)
  • ? Ubuntu 16.04(2016-04-21) 与e2fsprogs 1.42.12(2014-08-25 ) 一起发布- 升级到更新的版本或手动安装更新的版本(请参阅此答案的结尾):

磁盘的步骤在 /dev/mapper/target-device

第 1 步:正确卸载

$ sudo umount /dev/mapper/target-device
Run Code Online (Sandbox Code Playgroud)

第 2 步:在开始之前确保一致性

$ sudo e2fsck -fn /dev/mapper/target-device
Run Code Online (Sandbox Code Playgroud)

-nflag 表示进行更改。根据导致错误的原因,e2fsck尝试修复可能会有所帮助。

第 3 步:在文件系统中启用 64 位支持

$ sudo resize2fs -b /dev/mapper/target-device
Run Code Online (Sandbox Code Playgroud)

请考虑阅读man tune2fsman resize2fs- 您可能还希望更改一些其他文件系统标志。在典型的 HDD RAID 上,这需要 4 分钟的高 IO 和 CPU 负载。

第 4 步:调整大小

如果您没有在命令行上传递大小,则resize2fs假定“增长到所有可用空间”——这通常是您想要的。

$ sudo resize2fs -p /dev/mapper/target-device
Run Code Online (Sandbox Code Playgroud)

在典型的 HDD RAID 上,这需要 4 分钟的高 IO 和 CPU 负载。该-p标志启用进度条 - 但只有一些初始步骤才会显示。

第 5 步:再次检查

$ sudo e2fsck -fn /dev/mapper/target-device
Run Code Online (Sandbox Code Playgroud)

较新版本的 e2fsck 可能会建议修复时间戳或范围树。这并不表示存在任何严重问题,您可以选择现在或稍后修复它。

如果发生错误,也没有恐慌,也没有试图写入卷; 请咨询对文件系统有广泛了解的人,因为进一步的操作可能会破坏数据!

如果没有出现错误,重新挂载设备:

$ sudo mount /dev/mapper/target-device
$ df -h
Run Code Online (Sandbox Code Playgroud)

享受新空间!



如果使用旧版本:启用源包支持的额外步骤,e2fsprogs在旧系统上下载并编译新版本:

$ sudo umount /dev/mapper/target-device
Run Code Online (Sandbox Code Playgroud)

您不需要任何非 Ubuntu 版本的 e2fsprogs 来继续运行升级后的文件系统 - 内核现在支持这些已经有一段时间了。只需启动升级。


作为参考,如果要求 mke2fs 使用不适当的选项创建大型设备,则会打印类似的错误消息:

$ mke2fs -O ^64bit /dev/huge
mke2fs: Size of device (0x123456789 blocks) is too big to be expressed in 32 bits using a blocksize of 4096.
Run Code Online (Sandbox Code Playgroud)

  • btrfs 尚未准备好用于生产,并且可能永远不会用于生产,因为 Oracle 已将其开发搁置一旁。我个人的意见是,如果您需要那种级别的文件系统复杂性,请结合使用 ZFS 来满足您的实际数据存储需求,使用一个很小的 ​​8GB XFS 根。 (2认同)