Repo Document

ImmortalWrt 存储扩容与分区指南

这篇文档用于回答 3 个最容易混淆的问题:

docs/Storage_Expansion_Guide.md更新于 2026年4月12日

ImmortalWrt 存储扩容与分区指南

这篇文档用于回答 3 个最容易混淆的问题:

  1. 你当前刷的是 ext4 固件,还是 squashfs 固件。
  2. 你应该扩根分区、单独建数据分区,还是使用 extroot
  3. 哪些命令可以直接执行,哪些情况必须先停下来检查。

如果你的情况是下面这些之一,建议先看完本文再动手:

  • git clone 空间不够
  • 想安装 iStore、OpenClash、quickstart 等插件
  • 备份包、规则文件、仓库越来越大
  • 不确定该不该碰 /overlay

先看结论

树莓派上常见的安全路线其实分两种:

  • 如果系统已经是 ext4 根分区,且你准备安装较多插件,优先扩 rootfs 所在分区。
  • 如果系统是 squashfs + overlay,而你的主要需求只是放仓库、备份包和大文件,优先新建数据分区。

extroot 不是默认答案。它只适用于特定场景,而且前提是你已经确认自己仍在 squashfs 路线。

第 1 步:先判断你现在是哪种系统

先执行:

mount
df -h
block info
  1. 如果你看到 ext4 根分区

如果输出类似:

/dev/root on / type ext4

这表示你当前是:

  • ext4 固件
  • 根分区直接挂载到 /
  • 软件、配置、插件都直接写在根分区

这种情况下,插件空间不够时,优先考虑:

扩容根分区,不要去折腾 /overlay 或 extroot。

  1. 如果你看到 squashfs + overlay

如果输出类似:

overlayfs:/overlay on / type overlay

这表示你当前是:

  • squashfs 固件
  • 系统只读层在下方
  • 可写层在 /overlay

这种情况下:

  • 只缺存储空间时,优先考虑数据分区
  • 只有在 /overlay 长期不够装软件时,才考虑 extroot

术语速查

如果你后面读到 rootfsoverlayextroot 这些词会卡住,可以先看这一节;如果你已经熟悉这些概念,也可以直接往下看“第 2 步”。

  1. 分区

一张 TF 卡可以看成一整块存储介质,分区就是把它划成几块逻辑区域,例如 p1 放启动文件、p2 放系统、p3 放你自己的数据。

  1. 文件系统

分区只是空间划分,还需要格式化成文件系统后才能存文件。ImmortalWrt 常见的是 ext4vfat

  1. 挂载

挂载就是把一个分区接到系统目录树中的某个位置。比如把 /dev/mmcblk0p3 挂到 /srv/storage,之后访问 /srv/storage,实际就是在访问这个分区。

  1. rootfs

rootfs 就是系统根目录 / 对应的文件系统。

  1. /overlay

/overlaysquashfs 固件常见的可写层。安装软件、修改配置时,很多变化都落在这里。

  1. extroot

extroot 的本质不是“多一个分区”,而是把 squashfs 系统原本的可写层迁移到一个更大的 ext4 分区。它比单独建数据分区更敏感,也更依赖迁移步骤是否正确。

第 2 步:按目标选路线,不要先执行 mkfs

你的目标当前系统推荐方案是否建议新手直接做
安装很多插件,让 / 直接变大ext4 根分区扩容根分区 p2
给仓库、备份包、规则文件腾空间squashfsext4新建数据分区并挂载到 /srv/storage
扩大 squashfs 的可写层squashfs + overlayextroot否,先确认自己理解风险

路线 A:ext4 根分区扩容

这条路线适用于:

  • 你刷的是 ext4 固件
  • mount 里能看到 /dev/root on / type ext4
  • 你准备安装 iStore、OpenClash、quickstart、Git 等较多插件

先说结论:如果你已经是 ext4 根分区,这通常就是最直接、最稳的路线。

优点是:

  • 结构简单
  • 系统启动逻辑更直观
  • 不需要再引入 extroot
  • 对插件较多的树莓派更合适

按下面这个顺序做,不要跳步骤。

  1. 先备份,并清理残留的错误挂载配置。

先执行:

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
  1. 再安装扩容工具。

先判断系统版本:

  • OpenWrt 24.10 及更早稳定版:使用 opkg
  • OpenWrt 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
  1. 接着确认当前分区布局。
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,就说明后面还有未分配空间,适合继续。

  1. 确认可以扩以后,再决定离线还是在线操作。

如果方便关机并把 TF 卡插到电脑上,优先使用分区工具离线扩容 p2

推荐流程:

  1. 关机并拔下 TF 卡
  2. 用电脑打开 GPartedDiskGenius 或同类分区工具
  3. 选中 mmcblk0p2
  4. 把分区向后扩展到接近卡末尾
  5. 写入并安全卸载
  6. 插回树莓派启动
  7. 进入系统后执行:
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 文件系统,必要时还会再重启一次

执行前请确认:

  • 供电稳定
  • 不在远程无人值守的环境中冒险操作
  • 已经做好备份

这里有几个非常关键的判断点,必须提前知道:

  1. 如果 sh /etc/uci-defaults/70-rootpt-resize 执行后,SSH 会话很快断开,随后路由器自动重启,这通常是正常现象。
  2. 不要在第一次回到系统后,马上看到 df -h 还是几百 MB,就立刻判断失败。在线扩容是分阶段的,分区扩容和文件系统扩容不一定在同一个瞬间完成。
  3. 最稳妥的做法是:等待系统完成重启后,再重新登录,先看 parted -l -s,再看 df -h。如果 p2 已经扩到卡尾,但 /dev/root 还没变大,再手动执行一次:
sh /etc/uci-defaults/80-rootfs-resize
reboot
  1. 如果执行 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
  1. 扩容完成后先验证,再继续后面的安装。

执行:

mount
df -h
block info

如果你是在线扩容,建议把下面这组顺序也一起看:

  1. parted -l -s:确认 mmcblk0p2 是否已经扩到卡尾附近
  2. df -h:确认 /dev/root 是否已经真正变大
  3. mountblock 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 等插件。

建议顺序:

  1. 先确认 df -h 空间已经变大
  2. 先配置 Git 与备份
  3. 再安装 iStore 和其他插件
  4. 每次大改动前先做一份备份

路线 B:新建数据分区并挂载到 /srv/storage

这条路线适用于:

  • 当前主要缺的是仓库空间、备份空间、大文件空间
  • 你不想改系统根分区结构
  • 你想把 Git 仓库、备份包、OpenClash 大文件放到独立区域

这条路线适合“系统先不动,只把仓库、备份包和大文件挪出去”的场景。

如果你的问题更像下面这些:

  • git clone 放不下
  • 自动备份包越来越多
  • 规则文件、下载内容占空间

那这条路线通常比 extroot 更稳。

这条路线同样按顺序做,不要一上来就 mkfs.ext4

  1. 先确认当前分区状态。

先执行:

mount
df -h
block info
uci show fstab
parted -l -s

如果你发现:

  • 已经存在 mmcblk0p3
  • 或者 mkfs.ext4 提示 contains a ext4 file system labelled 'overlay'

这时不要继续格式化。先停下来确认这个分区原本是不是已经在被系统使用。

  1. 确认没踩雷后,再安装工具。

先判断系统版本:

  • OpenWrt 24.10 及更早稳定版:使用 opkg
  • OpenWrt 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
  1. 然后新建分区。
cfdisk /dev/mmcblk0

操作步骤:

  1. 选中 Free space
  2. 选择 [ New ]
  3. 输入需要的大小
  4. 保持 Linux
  5. 选择 [ Write ]
  6. 输入 yes
  7. 选择 [ Quit ]

假设你得到的新分区是:

/dev/mmcblk0p3
  1. 新建后先格式化,并做一次测试挂载。
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
  1. 确认测试没问题后,再配置开机自动挂载。
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
  1. 重启后再做最终验证。
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

  1. 你确定自己仍在 squashfs + overlay 路线
  2. 当前真正不够的是 /overlay 软件空间
  3. 你已经做过完整备份
  4. 你知道如何在失败时回退

对应文档:

这几种情况先停下来,不要继续点下一步

  1. mkfs.ext4 提示分区里已经有 overlay

例如:

/dev/mmcblk0p3 contains a ext4 file system labelled 'overlay'

这表示这个分区很可能已经被用过。

此时不要继续格式化,先执行:

mount
df -h
block info
uci show fstab
  1. 你已经是 ext4 根分区,却还准备照着 extroot 教程做。

如果 mount 里是:

/dev/root on / type ext4

那就不要走 extroot 文档。

  1. 空间还没验证,就准备一次性装很多插件。

先确认:

df -h

确认 //srv/storage 空间已经准备好,再去安装 iStore、OpenClash、Git、大规则集。

如果改完分区后系统异常,按这个顺序排查

优先按这个顺序检查:

  1. 有没有残留的 /overlay 挂载配置:uci show fstab
  2. 根分区现在是不是正常挂载:mount
  3. 当前磁盘空间是不是合理:df -h
  4. 分区识别是否正确:block info
  5. 系统日志最后几十行:logread | tail -50

如果系统已经无法正常启动,最省时间的方式通常是:

  1. 重新刷入已知可用的固件
  2. 启动后恢复备份
  3. 再回到本文,先确认自己属于哪条路线

读完这篇后,下一步看什么

  1. 先看这篇,确认系统类型与扩容路线
  2. 如果只是做备份和恢复,继续看 OpenWrt_Backup_Resotre.md
  3. 如果要长期维护,继续看 System_Maintenance.md
  4. 只有在确认自己是 squashfs + overlay 时,再看 ExtendOverlaySize.md