当尝试调整没有 64 位标志的旧 ext4 分区的大小时,如果新大小达到或超过 16TiB,resize2fs 1.42 将失败。
$ resize2fs -p /dev/mapper/target-device
resize2fs: New size too large to be expressed in 32 bits
我不想将文件复制到外部介质。我也不想冒数据丢失的风险。如何安全地调整卷大小?
答案1
使用该选项-O 64bit
(在当今创建的文件系统中默认启用),ext 文件系统可以跨越 1024 PiB,而不仅仅是 16 TiB 卷。您可以升级旧文件系统以激活此选项。
在你开始之前
- 这种体积必须有 RAID 支持。常规磁盘错误将要否则会造成伤害。
- 仍然,RAID 不是备份。 你必须将您的贵重物品存放在其他地方。
- 首先调整大小并验证所有周围卷(分区表、加密、lvm)。
- 对 RAID 进行更改后,Linux 可能不会立即确认新的最大大小。检查
$ cat /proc/partitions
,如有必要,请重新启动。 - 使用最新的、受支持的内核。如果有疑问,请安装所有升级并重新启动。
- 获取版本
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)与(2014-08-25)一起发布e2fsprogs 1.42.12
- 升级到较新的版本或手动安装较新的版本(请参阅本答案的末尾):
磁盘步骤/dev/mapper/target-device
步骤 1:正确卸载
$ sudo umount /dev/mapper/target-device
第 2 步:开始前确保一致性
$ sudo e2fsck -fn /dev/mapper/target-device
-n
旗帜意味着不是进行更改。根据导致错误的原因,尝试e2fsck
修复可能会有所帮助。
步骤 3:在文件系统中启用 64 位支持
$ sudo resize2fs -b /dev/mapper/target-device
请考虑阅读man tune2fs
-man resize2fs
您可能还希望更改其他一些文件系统标志。在典型的 HDD RAID 上,这需要 4 分钟的高 IO 和 CPU 负载。
步骤 4:调整大小
如果你没有在命令行中传递大小,调整2fs大小假设“增长到所有可用空间” - 这通常是您想要的。
$ sudo resize2fs -p /dev/mapper/target-device
在典型的 HDD RAID 上,这需要 4 分钟的高 IO 和 CPU 负载。该-p
标志启用进度条 - 但这些仅显示后一些初步措施。
步骤 5:再次检查
$ sudo e2fsck -fn /dev/mapper/target-device
较新版本的 e2fsck 可能会建议修复时间戳或范围树。这并不表示存在任何严重问题,您可以选择立即或稍后修复。
如果发生错误,请执行不是惊慌失措不是尝试写入卷;请咨询对文件系统有广泛了解的人,因为进一步的操作可能会破坏数据!
如果没有发生错误,重新挂载设备:
$ sudo mount /dev/mapper/target-device
$ df -h
享受新的空间!
如果使用旧版本:启用源包支持e2fsprogs
在旧系统上,下载并编译较新版本:
$ resize2fs
# if this prints version 1.43 or above, continue to step 1
$ sudo apt update
$ sudo apt install git
$ sudo apt build-dep e2fsprogs
$ cd $(mktemp -d)
$ git clone -b v1.44.2 https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git e2fsprogs && cd e2fsprogs
$ ./configure
$ make
$ cd resize
$ ./resize2fs
# confirm that this prints 1.43 or higher
# use `./resize2fs` instead of `resize2fs` for the rest of the steps
您不需要任何非 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.
答案2
我最近遇到了这种情况,Ubuntu 18.04 在最初安装 16.04 Ubuntu 后进行了更新...存储阵列(/dev/sdb)最初被分成两个 14 TB 的分区,而当想要将第一个分区扩大到 28 TB 时,问题就出现了。
我不需要下载新版本的 resize2fs,因为它是最新的。
# resize2fs
resize2fs 1.44.1 (24-Mar-2018)
唯一的问题是转换已格式化为 32 位的 64 位分区 1... 我不会邀请读者查阅 tune2fs 的文档(如 Anx 所建议的),而是提出一个真实的例子!
# tune2fs -O 64bit /dev/sdb1
tune2fs 1.44.1 (24-Mar-2018)
Please run "resize2fs -b /dev/sdb1" to enable 64-bit mode.
# resize2fs -b /dev/sdb1
resize2fs 1.44.1 (24-Mar-2018)
Convert the file system to 64 bits.
The file system on /dev/sdb1 now has a size of 3662109119 blocks (4k).
最后,我们扩大磁盘分区!
# resize2fs /dev/sdb1
resize2fs 1.44.1 (24-Mar-2018)
Resizing the file system on /dev/sdb1 to 7324303099 (4k) blocks.
The file system on / dev / sdb1 now has a size of 7324303099 blocks (4k).
答案3
如果由于“文件系统繁忙”而无法卸载,请从 LiveCD(Ubuntu 桌面)启动。请使用 v18.04+,因为它已经具有 resize2fs v1.44。