openwrt使用外置根extroot机制扩展根分区大小

这里我们把整个 OpenWrt 系统迁移到 ext4 磁盘上,通过 extroot 机制实现一个更大的根分区。


extroot 机制简述(OpenWrt)

在 OpenWrt 中,extroot 是一种利用外部存储设备(USB / SATA / SD 卡)来扩展系统可写空间的机制。
它并不是对原有根分区进行在线扩容,而是通过启动后切换根文件系统或 overlay,让系统运行在一个容量更大的外部磁盘之上。

工作原理

  1. 启动阶段

    • OpenWrt 首先从内部 Flash 启动最小系统
    • 根文件系统通常是只读的 squashfs,配合一个很小的可写 overlay
  2. 挂载外部存储

    • 启动过程中,block-mount 根据 /etc/config/fstab
    • 挂载外部磁盘分区(通常是 ext4
  3. 根文件系统切换

    • 如果检测到 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 文件系统。

diskman磁盘管理.webp

分区管理-新建分区.webp

三、回到挂载点将上述分区挂载为根/

如下图

挂载点-存储区.webp

在“保存并应用”之前,执行如下命令(就是页面上显示的那几行),我添加了注释,更方便理解每一行干了啥,作用是什么

# 创建临时挂载点,用于访问当前正在运行的内部根文件系统
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

旧的根分区大小290.4兆.webp

四、重启生效

重启之后查看根分区大小,变成了磁盘余下空间 28.4G,成功实现根分区扩容。

新的根分区大小28.4G.webp

最后修改于:2026年02月01日 19:08

添加新评论