ImmortalWrt Overlay 与 Extroot 扩容(进阶版)
本文只适用于:
- 你确认自己刷的是
squashfs固件 mount中能看到overlayfs:/overlay on / type overlay- 你真正不够的是
/overlay软件空间
如果你当前看到的是:
/dev/root on / type ext4
请不要继续读这篇。你应该回到:
对于 ext4 根分区系统,正确路线通常是扩容根分区,而不是配置 extroot。
先说结论
extroot 不是“多挂一个分区”。
它的本质是:
把 squashfs 系统原本的可写层完整迁移到新的 ext4 分区。
因此它和单独创建数据分区完全不同。
如果迁移过程漏了任何一步,重启后系统可能表现为:
- 配置丢失
- 插件消失
- 像重新初始化一样启动
哪些情况才值得考虑 extroot
只有在下面这些条件同时成立时,才建议继续:
- 当前系统仍是
squashfs + overlay /overlay经常因为安装软件而空间不足- 你已经完成备份
- 你能接受出问题后自己回滚
如果你只是想:
- 给 Git 仓库腾空间
- 存备份包
- 放 OpenClash 大文件
那优先考虑数据分区方案,而不是 extroot。
动手前先确认
先执行:
mount | grep overlay
df -h
block info
如果这里看不到 overlayfs:/overlay,就说明你不在本文的适用范围内。
操作前准备
按下面顺序做。
- 先备份。
sysupgrade -b /tmp/pre-extroot-$(date +%F).tar.gz
- 再安装工具。
先判断系统版本:
OpenWrt 24.10 及更早稳定版:使用opkgOpenWrt 25.12 及更新版本 / 新分支:使用apk
24.10 及更早稳定版:
opkg update
opkg install block-mount kmod-fs-ext4 e2fsprogs fdisk cfdisk rsync
25.12 及更新版本 / 新分支:
apk update
apk add block-mount kmod-fs-ext4 e2fsprogs fdisk cfdisk rsync
如果仓库里没有 rsync,后面可以改用 cp -a。
- 然后确认确实还有可用空闲空间。
fdisk -l /dev/mmcblk0
只有在确认卡上确实还有未分配空间时,才继续新建分区。
步骤一:新建 ext4 分区
cfdisk /dev/mmcblk0
操作顺序:
- 选中
Free space - 选择
[ New ] - 输入大小,例如
8G - 保持
Linux - 选择
[ Write ] - 输入
yes - 选择
[ Quit ]
下面假设新分区为:
/dev/mmcblk0p3
步骤二:格式化新分区
umount /dev/mmcblk0p3 2>/dev/null
mkfs.ext4 -L extroot /dev/mmcblk0p3
e2fsck -f /dev/mmcblk0p3
如果此时提示新分区中已经包含某个文件系统,先停下来,不要无脑继续格式化。
步骤三:临时挂载
mkdir -p /mnt/extroot
mount -t ext4 /dev/mmcblk0p3 /mnt/extroot
df -h | grep mmcblk0p3
步骤四:迁移当前 overlay 数据
这是最关键的一步。
先准备目录:
mkdir -p /mnt/extroot/upper
mkdir -p /mnt/extroot/work
优先使用 rsync:
rsync -aHAX /overlay/ /mnt/extroot/
sync
如果没有 rsync,改用:
cp -a /overlay/. /mnt/extroot/
sync
迁移后检查:
ls -la /mnt/extroot
你至少应当能看到:
upperwork
步骤五:用 UUID 写入 fstab
UUID="$(block info /dev/mmcblk0p3 | sed -n 's/.*UUID=\"\\([^\"]*\\)\".*/\\1/p')"
echo "$UUID"
然后写入:
uci set fstab.extroot=mount
uci set fstab.extroot.target='/overlay'
uci set fstab.extroot.uuid="$UUID"
uci set fstab.extroot.fstype='ext4'
uci set fstab.extroot.enabled='1'
uci commit fstab
/etc/init.d/fstab enable
步骤六:重启并验证
reboot
重启后执行:
mount | grep -E 'overlay|mmcblk0p3'
df -h
成功时通常会看到:
/dev/mmcblk0p3 on /overlay type ext4
overlayfs:/overlay on / type overlay
如果重启后像“系统被重置”
优先检查:
/dev/mmcblk0p3是否真的挂到了/overlayfstab里是不是写对了UUID/mnt/extroot中原先是否完整复制了/overlay- 新分区里是否存在
upper和work
不建议关闭 ext4 journal
你可能会在其他教程里看到:
tune2fs -O ^has_journal /dev/mmcblk0p3
对长期在线的路由器,我不建议这么做。
原因是:
- 节省的写入量有限
- 但掉电或异常重启后的风险更高
一句话提醒
extroot 的关键不是“挂上去”,而是“把旧的 overlay 完整迁移过去”。
如果你的目标只是多放一些仓库、备份包或大文件,请回到: