本文记录在 ImmortalWrt 中扩容 ext4 根分区的过程。环境为 x86 虚拟机,磁盘为 /dev/sda,根分区 /dev/sda2 为 ext4,挂载在 /。虚拟磁盘扩大后,分区和文件系统不会自动变大,需要手动调整分区并扩展 ext4 文件系统。下面按步骤列出所用命令,操作前请备份重要数据。

确认磁盘与分区

查看块设备和挂载情况:

block info
df -h
mount | grep -E 'overlay|ext4'

确认要扩容的是 /dev/sda2(ext4,挂载在 /)。

查看分区表:

parted /dev/sda print

如果提示:

Warning: Not all of the space available to /dev/sda appears to be used...
Fix/Ignore?

输入 Fix,让 GPT 识别磁盘末尾的未分配空间。

安装必要工具

ImmortalWrt 新版使用 apk:

apk update
apk add parted e2fsprogs losetup

如果 resize2fs 仍找不到,尝试:

apk add resize2fs

旧版 OpenWrt 使用 opkg:

opkg update
opkg install parted e2fsprogs resize2fs losetup

扩大分区

将 /dev/sda2 扩展到磁盘末尾:

parted /dev/sda resizepart 2 100%

如果再次提示 Fix/Ignore,继续选 Fix。

确认结果:

parted /dev/sda print

此时应看到 sda2 的 End 已接近磁盘总容量。

重读分区表

让内核重新读取分区表:

partx -u /dev/sda

如果 partx 不存在:

blockdev --rereadpt /dev/sda

扩展 ext4 文件系统

先直接尝试在线扩容:

resize2fs /dev/sda2

如果输出正常,跳到“重启并验证”。

如果报错:

resize2fs: Invalid argument While checking for on-line resizing support

说明根分区在线扩容受限,改用 losetup 方式:

LOOP=$(losetup -f)
echo "使用的 loop 设备是: $LOOP"
losetup $LOOP /dev/sda2
resize2fs -f $LOOP
losetup -d $LOOP

成功时会看到类似:

The filesystem on /dev/loop0 is now 1650619 (4k) blocks long.

重启并验证

重启系统:

reboot

重启后检查容量:

df -h

正常情况下,根分区 / 的 Size 会变为磁盘总容量,Used 恢复为实际使用量,Available 大幅增加。

注意事项

  • 操作前建议备份 /etc/config 等重要数据
  • 只能向分区后方扩容,不能向前扩容
  • parted 提示 You may need to update /etc/fstab 通常可忽略,只要分区 UUID 未变即可