ImmortalWrt 存储扩容与分区指南
这篇文档用于回答 3 个最容易混淆的问题:
- 你当前刷的是
ext4固件,还是squashfs固件。 - 你应该扩根分区、单独建数据分区,还是使用
extroot。 - 哪些命令可以直接执行,哪些情况必须先停下来检查。
如果你的情况是下面这些之一,建议先看完本文再动手:
git clone空间不够- 想安装 iStore、OpenClash、quickstart 等插件
- 备份包、规则文件、仓库越来越大
- 不确定该不该碰
/overlay
先看结论
树莓派上常见的安全路线其实分两种:
- 如果系统已经是
ext4根分区,且你准备安装较多插件,优先扩rootfs所在分区。 - 如果系统是
squashfs + overlay,而你的主要需求只是放仓库、备份包和大文件,优先新建数据分区。
extroot 不是默认答案。它只适用于特定场景,而且前提是你已经确认自己仍在 squashfs 路线。
第 1 步:先判断你现在是哪种系统
先执行:
mount
df -h
block info
- 如果你看到
ext4根分区
如果输出类似:
/dev/root on / type ext4
这表示你当前是:
ext4固件- 根分区直接挂载到
/ - 软件、配置、插件都直接写在根分区
这种情况下,插件空间不够时,优先考虑:
扩容根分区,不要去折腾 /overlay 或 extroot。
- 如果你看到
squashfs + overlay
如果输出类似:
overlayfs:/overlay on / type overlay
这表示你当前是:
squashfs固件- 系统只读层在下方
- 可写层在
/overlay
这种情况下:
- 只缺存储空间时,优先考虑数据分区
- 只有在
/overlay长期不够装软件时,才考虑extroot
术语速查
如果你后面读到 rootfs、overlay、extroot 这些词会卡住,可以先看这一节;如果你已经熟悉这些概念,也可以直接往下看“第 2 步”。
- 分区
一张 TF 卡可以看成一整块存储介质,分区就是把它划成几块逻辑区域,例如 p1 放启动文件、p2 放系统、p3 放你自己的数据。
- 文件系统
分区只是空间划分,还需要格式化成文件系统后才能存文件。ImmortalWrt 常见的是 ext4 和 vfat。
- 挂载
挂载就是把一个分区接到系统目录树中的某个位置。比如把 /dev/mmcblk0p3 挂到 /srv/storage,之后访问 /srv/storage,实际就是在访问这个分区。
rootfs
rootfs 就是系统根目录 / 对应的文件系统。
/overlay
/overlay 是 squashfs 固件常见的可写层。安装软件、修改配置时,很多变化都落在这里。
extroot
extroot 的本质不是“多一个分区”,而是把 squashfs 系统原本的可写层迁移到一个更大的 ext4 分区。它比单独建数据分区更敏感,也更依赖迁移步骤是否正确。
第 2 步:按目标选路线,不要先执行 mkfs
| 你的目标 | 当前系统 | 推荐方案 | 是否建议新手直接做 |
|---|---|---|---|
安装很多插件,让 / 直接变大 | ext4 根分区 | 扩容根分区 p2 | 是 |
| 给仓库、备份包、规则文件腾空间 | squashfs 或 ext4 | 新建数据分区并挂载到 /srv/storage | 是 |
扩大 squashfs 的可写层 | squashfs + overlay | extroot | 否,先确认自己理解风险 |
路线 A:ext4 根分区扩容
这条路线适用于:
- 你刷的是
ext4固件 mount里能看到/dev/root on / type ext4- 你准备安装 iStore、OpenClash、quickstart、Git 等较多插件
先说结论:如果你已经是 ext4 根分区,这通常就是最直接、最稳的路线。
优点是:
- 结构简单
- 系统启动逻辑更直观
- 不需要再引入
extroot - 对插件较多的树莓派更合适
按下面这个顺序做,不要跳步骤。
- 先备份,并清理残留的错误挂载配置。
先执行:
sysupgrade -b /boot/pre-expand-$(date +%F).tar.gz
uci delete fstab.overlay 2>/dev/null
uci commit fstab
/etc/init.d/fstab restart
说明:
- 第一条命令先保存当前配置
- 后三条用于删除残留的错误
extroot配置,避免系统下次启动时误挂载/overlay
- 再安装扩容工具。
先判断系统版本:
OpenWrt 24.10 及更早稳定版:使用opkgOpenWrt 25.12 及更新版本 / 新分支:使用apk
24.10 及更早稳定版:
opkg update
opkg install parted losetup resize2fs blkid e2fsprogs
25.12 及更新版本 / 新分支:
apk update
apk add parted losetup resize2fs blkid e2fsprogs
- 接着确认当前分区布局。
parted -l -s
如果看到类似:
Number Start End Size Type File system Flags
1 4194kB 71.3MB 67.1MB primary fat16 boot, lba
2 75.5MB 390MB 315MB primary ext4
且磁盘总容量明显大于 p2,就说明后面还有未分配空间,适合继续。
- 确认可以扩以后,再决定离线还是在线操作。
如果方便关机并把 TF 卡插到电脑上,优先使用分区工具离线扩容 p2。
推荐流程:
- 关机并拔下 TF 卡
- 用电脑打开
GParted、DiskGenius或同类分区工具 - 选中
mmcblk0p2 - 把分区向后扩展到接近卡末尾
- 写入并安全卸载
- 插回树莓派启动
- 进入系统后执行:
e2fsck -f /dev/mmcblk0p2
resize2fs /dev/mmcblk0p2
df -h
如果当前必须在线操作,可以使用 OpenWrt 官方扩容脚本流程:
cd /root
wget -U "" -O expand-root.sh "https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=0"
. ./expand-root.sh
sh /etc/uci-defaults/70-rootpt-resize
这个流程通常会分阶段完成:
70-rootpt-resize:先扩展根分区,并触发自动重启80-rootfs-resize:系统起来后再扩展 ext4 文件系统,必要时还会再重启一次
执行前请确认:
- 供电稳定
- 不在远程无人值守的环境中冒险操作
- 已经做好备份
这里有几个非常关键的判断点,必须提前知道:
- 如果
sh /etc/uci-defaults/70-rootpt-resize执行后,SSH 会话很快断开,随后路由器自动重启,这通常是正常现象。 - 不要在第一次回到系统后,马上看到
df -h还是几百 MB,就立刻判断失败。在线扩容是分阶段的,分区扩容和文件系统扩容不一定在同一个瞬间完成。 - 最稳妥的做法是:等待系统完成重启后,再重新登录,先看
parted -l -s,再看df -h。如果p2已经扩到卡尾,但/dev/root还没变大,再手动执行一次:
sh /etc/uci-defaults/80-rootfs-resize
reboot
- 如果执行
70-rootpt-resize后既没有自动重启,parted -l -s里也看不到p2变大,就不要继续猜测“是不是已经成功”。先排查依赖、标记文件和分区状态:
type parted losetup resize2fs blkid
parted -l -s
ls -l /etc/uci-defaults/70-rootpt-resize /etc/uci-defaults/80-rootfs-resize /etc/rootpt-resize /etc/rootfs-resize 2>/dev/null
- 扩容完成后先验证,再继续后面的安装。
执行:
mount
df -h
block info
如果你是在线扩容,建议把下面这组顺序也一起看:
parted -l -s:确认mmcblk0p2是否已经扩到卡尾附近df -h:确认/dev/root是否已经真正变大mount和block info:确认根分区仍然正常挂载为ext4
成功时通常会看到:
/dev/root on / type ext4/的空间明显增大,例如接近整张 32GB 卡
示例:
Filesystem Size Used Available Use% Mounted on
/dev/root 29.3G 114.5M 29.2G 0% /
验证通过后,这时你就可以继续:
cd /root
git clone https://github.com/Ronchy2000/Immortalwrt-AutoBackup.git
以及安装 iStore、OpenClash、quickstart 等插件。
建议顺序:
- 先确认
df -h空间已经变大 - 先配置 Git 与备份
- 再安装 iStore 和其他插件
- 每次大改动前先做一份备份
路线 B:新建数据分区并挂载到 /srv/storage
这条路线适用于:
- 当前主要缺的是仓库空间、备份空间、大文件空间
- 你不想改系统根分区结构
- 你想把 Git 仓库、备份包、OpenClash 大文件放到独立区域
这条路线适合“系统先不动,只把仓库、备份包和大文件挪出去”的场景。
如果你的问题更像下面这些:
git clone放不下- 自动备份包越来越多
- 规则文件、下载内容占空间
那这条路线通常比 extroot 更稳。
这条路线同样按顺序做,不要一上来就 mkfs.ext4。
- 先确认当前分区状态。
先执行:
mount
df -h
block info
uci show fstab
parted -l -s
如果你发现:
- 已经存在
mmcblk0p3 - 或者
mkfs.ext4提示contains a ext4 file system labelled 'overlay'
这时不要继续格式化。先停下来确认这个分区原本是不是已经在被系统使用。
- 确认没踩雷后,再安装工具。
先判断系统版本:
OpenWrt 24.10 及更早稳定版:使用opkgOpenWrt 25.12 及更新版本 / 新分支:使用apk
24.10 及更早稳定版:
opkg update
opkg install block-mount kmod-fs-ext4 e2fsprogs fdisk cfdisk
25.12 及更新版本 / 新分支:
apk update
apk add block-mount kmod-fs-ext4 e2fsprogs fdisk cfdisk
- 然后新建分区。
cfdisk /dev/mmcblk0
操作步骤:
- 选中
Free space - 选择
[ New ] - 输入需要的大小
- 保持
Linux - 选择
[ Write ] - 输入
yes - 选择
[ Quit ]
假设你得到的新分区是:
/dev/mmcblk0p3
- 新建后先格式化,并做一次测试挂载。
umount /dev/mmcblk0p3 2>/dev/null
mkfs.ext4 -L storage /dev/mmcblk0p3
e2fsck -f /dev/mmcblk0p3
mkdir -p /srv/storage
mount -t ext4 /dev/mmcblk0p3 /srv/storage
df -h | grep mmcblk0p3
- 确认测试没问题后,再配置开机自动挂载。
UUID="$(block info /dev/mmcblk0p3 | sed -n 's/.*UUID=\"\\([^\"]*\\)\".*/\\1/p')"
echo "$UUID"
如果上面能输出 UUID,再执行:
uci add fstab mount
uci set fstab.@mount[-1].target='/srv/storage'
uci set fstab.@mount[-1].uuid="$UUID"
uci set fstab.@mount[-1].fstype='ext4'
uci set fstab.@mount[-1].enabled='1'
uci commit fstab
/etc/init.d/fstab enable
reboot
- 重启后再做最终验证。
mount | grep srv/storage
df -h
验证通过后,再整理目录结构:
mkdir -p /srv/storage/repos
mkdir -p /srv/storage/backups
mkdir -p /srv/storage/openclash
例如:
cd /srv/storage/repos
git clone https://github.com/Ronchy2000/Immortalwrt-AutoBackup.git
如果你仍希望从 /root 访问仓库,可以建立软链接:
ln -s /srv/storage/repos/Immortalwrt-AutoBackup /root/Immortalwrt-AutoBackup
路线 C:只有在这些条件下才考虑 extroot
只有在下面这些条件同时满足时,再考虑 extroot:
- 你确定自己仍在
squashfs + overlay路线 - 当前真正不够的是
/overlay软件空间 - 你已经做过完整备份
- 你知道如何在失败时回退
对应文档:
这几种情况先停下来,不要继续点下一步
mkfs.ext4提示分区里已经有overlay。
例如:
/dev/mmcblk0p3 contains a ext4 file system labelled 'overlay'
这表示这个分区很可能已经被用过。
此时不要继续格式化,先执行:
mount
df -h
block info
uci show fstab
- 你已经是
ext4根分区,却还准备照着extroot教程做。
如果 mount 里是:
/dev/root on / type ext4
那就不要走 extroot 文档。
- 空间还没验证,就准备一次性装很多插件。
先确认:
df -h
确认 / 或 /srv/storage 空间已经准备好,再去安装 iStore、OpenClash、Git、大规则集。
如果改完分区后系统异常,按这个顺序排查
优先按这个顺序检查:
- 有没有残留的
/overlay挂载配置:uci show fstab - 根分区现在是不是正常挂载:
mount - 当前磁盘空间是不是合理:
df -h - 分区识别是否正确:
block info - 系统日志最后几十行:
logread | tail -50
如果系统已经无法正常启动,最省时间的方式通常是:
- 重新刷入已知可用的固件
- 启动后恢复备份
- 再回到本文,先确认自己属于哪条路线
读完这篇后,下一步看什么
- 先看这篇,确认系统类型与扩容路线
- 如果只是做备份和恢复,继续看 OpenWrt_Backup_Resotre.md
- 如果要长期维护,继续看 System_Maintenance.md
- 只有在确认自己是
squashfs + overlay时,再看 ExtendOverlaySize.md