openwrt使用外置根extroot机制扩展根分区大小
这里我们把整个 OpenWrt 系统迁移到 ext4 磁盘上,通过 extroot 机制实现一个更大的根分区。
extroot 机制简述(OpenWrt)
在 OpenWrt 中,extroot 是一种利用外部存储设备(USB / SATA / SD 卡)来扩展系统可写空间的机制。
它并不是对原有根分区进行在线扩容,而是通过启动后切换根文件系统或 overlay,让系统运行在一个容量更大的外部磁盘之上。
工作原理
-
启动阶段
- OpenWrt 首先从内部 Flash 启动最小系统
- 根文件系统通常是只读的
squashfs,配合一个很小的可写overlay
-
挂载外部存储
- 启动过程中,
block-mount根据/etc/config/fstab - 挂载外部磁盘分区(通常是
ext4)
- 启动过程中,
-
根文件系统切换
- 如果检测到 extroot 配置
- 外部磁盘中的根文件系统会接管
/overlay(或直接接管/) - 系统随后运行在外部磁盘之上
效果
-
从系统视角看:
/或/overlay位于外部磁盘- 文件系统类型通常为
ext4 - 可用空间显著增加
-
对上层应用和用户来说:
- 与普通根分区无差别
- 所有软件、配置、日志都写入外部存储
为什么需要复制整个根文件系统
extroot 并不是只挂载一个空目录作为 overlay,
而是要求外部存储上存在完整、可启动的 OpenWrt 根文件系统结构。
因此在启用 extroot 前,通常需要将当前系统的 / 完整复制到外部磁盘中,
以确保 init、库文件和配置在切换后仍然可用。
适用场景
- 内置 Flash 空间很小的路由器
- 需要安装大量软件包
- 需要更高的写入寿命或更大的日志空间
一句话总结:
extroot 通过在启动过程中将 OpenWrt 的可写根文件系统迁移到外部存储设备,实现“逻辑上的根分区扩容”。
好的,官话结束,我们来讲怎么做。很简单,建议安装 diskman luci 界面配合命令行操作。
一、安装 diskman
# 更新一下软件源
# opkg update
# 安装 diskman 程序和中文汉化包
# opkg install luci-app-diskman luci-i18n-diskman-zh-cn
二、新建分区并格式化(作为新的根使用,以此扩展根分区大小)
在 luci 界面中切换到“DiskMan 磁盘管理”,编辑当前磁盘,在“分区信息”最后一行直接新建分区,这样可以快捷创建分区,不需要手动计算“起始扇区”和“中止扇区”,新建好之后建议格式化此分区为 ext4 文件系统。
三、回到挂载点将上述分区挂载为根/
如下图
在“保存并应用”之前,执行如下命令(就是页面上显示的那几行),我添加了注释,更方便理解每一行干了啥,作用是什么
# 创建临时挂载点,用于访问当前正在运行的内部根文件系统
mkdir -p /tmp/introot
# 创建临时挂载点,用于挂载即将作为 extroot 的外部磁盘分区
mkdir -p /tmp/extroot
# 将当前根目录 / 绑定挂载到 /tmp/introot,便于完整复制现有系统
mount --bind / /tmp/introot
# 挂载外部磁盘分区(ext4),作为未来的 extroot 根文件系统
mount /dev/sda1 /tmp/extroot
# 使用 tar 管道方式,将整个根文件系统原样复制到外部磁盘分区
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
# 卸载临时挂载的内部根文件系统
umount /tmp/introot
# 卸载外部磁盘分区,确保数据完整写入磁盘
umount /tmp/extroot
逐行执行之后,再“保存并应用”。
现在通过 df -hT 查看根分区大小是 290.4MB
四、重启生效
重启之后查看根分区大小,变成了磁盘余下空间 28.4G,成功实现根分区扩容。




