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

尝试resize和没有64位标志创建的旧ext4分区时,如果新大小超过16TiB,resize2fs 1.42将失败。

$ resize2fs -p /dev/mapper/target-device resize2fs: New size too large to be expressed in 32 bits 

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

为什么会这样:

新文件系统通常使用选项-O 64bit创建。这允许它们跨越更大(1024 PiB而不是16 TiB)卷。 在此变为默认值之前创建的旧文件系统以前缺少将地址长度升级到64位的选项。

虽然不是Ubuntu的一部分 – Ubuntu 16.04 (2016-04-21)与e2fsprogs Version 1.42.12 (2014-08-25)一起发布,但最新版本的e2fsprogs Version 1.43 (2016-05-17)已经解决了这个问题。 )。

我现在将概述如何操作,假设您的目标设备被称为/dev/mapper/target-device

先决条件:

  1. 备份你不能丢失的任何东西。 总是。 另请注意,这种大小的文件系统会受到常规磁盘错误的影响,因此请配置RAID以保证完整性。
  2. 操作应该离线完成 – 这意味着你不能在系统根目录上执行(严重的是,如果你的root> 16TiB,请咨询linux专家)
  3. 确保所有周围的卷都完全支持最终的大小(它是否包含在加密容器中?任何分区表?)
  4. resize并重新检查其中包含的内容之后继续升级文件系统 – 升级raid系统后,linux可能会也可能不会立即确认新的最大大小。 检查$ cat /proc/partitions
  5. 确保(检查uname -r )你正在运行一个可以正确处理64位ext4文件系统的内核 – 任何4.4.x内核(默认Ubuntu 16.04)或更高版本都可以 – 旧内核支持64位选项,我只是不知道是否他们没有错误。

先决条件6 – 获取至少版本1.43的e2fsprogs

 $ resize2fs # if this command - without any parameters - prints a version above 1.43, continue to step 1 $ sudo apt update $ sudo apt install git $ sudo apt build-dep e2fsprogs # see https://askubuntu.com/q/158871/158442 to enable source package support $ cd $(mktemp -d) $ git clone -b v1.44.2 https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git e2fsprogs && cd e2fsprogs $ ./configure $ make # note: make test is strange in 1.43, see the master changelog for a fix $ cd resize $ ./resize2fs # if this prints 1.43 or higher, use `./resize2fs` instead of `resize2fs` for the rest of the steps # if this prints any other version, panic 

第1步 – 正确卸载文件系统

 $ sudo umount /dev/mapper/target-device 

第2步 – 检查文件系统是否有错误

 $ sudo e2fsck -fn /dev/mapper/target-device 

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

 $ man tune2fs # read about the filesystem flags - you may wish to change some $ man resize2fs $ sudo resize2fs -b /dev/mapper/target-device # on a typical HDD RAID, this takes 4 minutes of high IO & CPU load 

第4步 – 调整文件系统的大小

 $ sudo resize2fs -p /dev/mapper/target-device # resize2fs assumes "grow to all space available" if no size is passed on command line # the -p flag will enable progress bars - after completing some initial steps # on a typical HDD RAID, this takes 4 minutes of high IO & CPU load 

第5步 – 再次检查文件系统

 $ sudo e2fsck -fn /dev/mapper/target-device 

第6步 – 重新安装

如果发生错误,请不要惊慌; 不要试图写入卷; 在完全填写数据之前,请咨询真正了解这些内容的人。 如果没有发生错误,请重新安装设备。

 $ sudo mount /dev/mapper/target-device 

成功!

您不需要任何非Ubuntu版本的e2fsprogs来继续操作升级的文件系统 – 内核现在已经支持了很长时间。 只需要启动升级。

注意:较新版本的e2fsck可能会建议修复以前版本处理不当的时间戳或范围树。 这不是问题,您可以选择现在或以后修复它。

作为参考,如果要求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.