OpenWrt 烧录后如何扩容移动硬盘/TF 卡:支持 SquashFS、ext4 与 macOS 自动脚本

把 OpenWrt 镜像烧录到 64GB、128GB 甚至更大容量的移动硬盘或 TF 卡后,经常会遇到一个现象:系统可以正常启动,但 OpenWrt 只显示出镜像本身的容量,后面的磁盘空间没有被使用。

这通常不是烧录失败,而是镜像为了适配不同容量的存储设备,只预留了一个较小的系统分区。以 NanoPi R4S 的 OpenWrt SquashFS 镜像为例,镜像文件可能只有约 168MiB,而 64GB 存储卡的大部分空间仍处于未分配状态。

本文的核心结论:对于这类 OpenWrt 镜像,通常没有必要重新制作一个 64GB 的完整镜像。先烧录原始小镜像,再把第二分区的结束位置扩展到磁盘末尾,速度更快,也更容易控制。

一、先理解 OpenWrt 镜像的分区结构

本文以 NanoPi R4S 常见的 MBR 镜像为例。典型布局大致如下:

分区起始扇区典型作用
分区 165536内核,约 16MiB
分区 2131072根文件系统,可能是 SquashFS 或 ext4

烧录小镜像后,第二分区通常只占据镜像需要的空间,磁盘末尾还留有大量未分配空间。扩容的本质就是:

  1. 保持第二分区的起始扇区不变;
  2. 把第二分区的结束位置调整到整个磁盘的最后一个扇区;
  3. 如果第二分区是 ext4,再扩展 ext4 文件系统本身。

分区起始位置不能随意改变,否则可能导致启动失败或根文件系统无法找到。

二、方法一:先制作一个与整盘容量相同的镜像

第一种方法是把原始镜像扩展成与目标磁盘一样大的镜像文件,然后再整体烧录。

基本流程是:

  1. 解压 OpenWrt 的 .img.gz 文件;
  2. 把镜像文件的逻辑大小扩展到目标磁盘容量;
  3. 把第二分区的大小改到磁盘末尾;
  4. 将扩展后的镜像完整写入移动硬盘或 TF 卡。

这种方式的优点是得到一个可以重复烧录的“大镜像”。缺点是镜像的逻辑大小可能达到 64GB 或更大,Etcher 等工具在烧录时可能需要处理整个镜像,速度会明显变慢。

如果使用稀疏文件,创建镜像本身可以很快,但烧录软件不一定会跳过稀疏文件中的空洞。因此,这种方法更适合需要反复分发同一个整盘镜像的场景,不适合作为日常扩容的首选方案。

三、方法二:先烧录小镜像,再扩展目标磁盘分区

这是更推荐的方法。

步骤 1:烧录原始小镜像

使用 Etcher、Raspberry Pi Imager 或其他可靠工具,将原始的 .img.gz 或解压后的 .img 烧录到移动硬盘/TF 卡。

烧录完成后不要急着格式化 macOS 弹出的 Linux 分区。macOS 无法正常识别 OpenWrt 的 Linux 分区是正常现象。

步骤 2:确认外置磁盘编号

diskutil list external physical

记下目标磁盘的整盘编号,例如 /dev/disk4。后续分区表操作使用对应的 raw 设备,例如 /dev/rdisk4

注意:/dev/disk4 是整块磁盘,不是 /dev/disk4s2。一旦选错设备,分区表可能被破坏。务必确认它是外置物理磁盘。

步骤 3:查看分区布局

sudo fdisk -p /dev/rdisk4
sudo file -s /dev/rdisk4s2

如果第二分区的起始位置是 131072 扇区,并且 file 显示为 SquashFS 或 ext4,通常就是可以继续处理的 OpenWrt 分区。

步骤 4:扩大第二分区

先卸载整块磁盘:

diskutil unmountDisk force /dev/disk4

然后使用 macOS 自带的 fdisk 编辑第二分区。下面的示例假定目标磁盘总扇区数为 124928000,第二分区从 131072 开始,因此新的分区大小为:

124928000 - 131072 = 124796928

修改命令如下:

printf 'edit 2\n83\nn\n131072\n124796928\nwrite\nexit\n' | \
sudo fdisk -e /dev/rdisk4

实际使用时不要直接照抄上面的总扇区数,需要根据你的目标磁盘重新计算。分区类型 83 表示 Linux 分区。

四、SquashFS 和 ext4 的扩容方式不同

SquashFS 镜像

SquashFS 是只读压缩文件系统,不能使用 resize2fs 扩展。对于本文这类 OpenWrt 镜像,正确做法是扩大包含 SquashFS 的第二分区边界,不要格式化第二分区,也不要尝试把它转换成 ext4。

sudo file -s /dev/rdisk4s2
# 看到 Squashfs filesystem 即可确认

扩展分区后,把存储卡插回 R4S,OpenWrt 会根据其根文件系统布局使用分区中的剩余空间。实际可用空间可以在路由器上用 df -h 和 block info 检查。

ext4 镜像

ext4 不仅要扩大分区,还要扩大文件系统本身。macOS 默认没有完整的 ext4 管理工具,可以通过 Homebrew 安装:

brew install e2fsprogs

Apple Silicon Mac 通常使用:

/opt/homebrew/opt/e2fsprogs/sbin/e2fsck
/opt/homebrew/opt/e2fsprogs/sbin/resize2fs

Intel Mac 通常使用:

/usr/local/opt/e2fsprogs/sbin/e2fsck
/usr/local/opt/e2fsprogs/sbin/resize2fs

分区表扩展后,对未挂载的第二分区执行检查和扩容:

sudo /opt/homebrew/opt/e2fsprogs/sbin/e2fsck -f -p /dev/rdisk4s2
sudo /opt/homebrew/opt/e2fsprogs/sbin/resize2fs /dev/rdisk4s2

如果你的工具位于 /usr/local,将路径替换为 Intel Mac 对应路径即可。

重要:只有确认文件系统是 ext4 时才执行 e2fsck 和 resize2fs。对 SquashFS 执行这些命令可能造成破坏。

五、macOS 自动扩容脚本

为了避免每次手工计算扇区和输入 fdisk 命令,本文提供了一个 macOS Bash 脚本:

下载 openwrt-expand-disk-macos.sh

发布文章时,请先把脚本上传到 WordPress 媒体库,再将上面的链接替换为实际附件地址。脚本也可以从本文配套文件中取得。

脚本功能

  • 只列出外置物理磁盘,降低误操作系统盘的风险;
  • 尝试根据 MBR 分区布局和第二分区文件系统识别 OpenWrt;
  • 支持 SquashFS 和 ext4;
  • SquashFS 只扩大分区,不执行 ext4 命令;
  • ext4 自动检查 e2fsck 和 resize2fs
  • 写入分区表前自动备份 MBR;
  • 执行前要求选择磁盘、输入 YES,再输入完整磁盘名进行二次确认;
  • 无法识别的分区布局默认停止,只有再次输入指定确认词才允许继续。

运行脚本

cd /Users/eugene/Documents/Codex/2026-08-10/w/outputs
chmod +x openwrt-expand-disk-macos.sh
./openwrt-expand-disk-macos.sh

脚本会自动请求管理员权限。对于 ext4,如果没有 Homebrew:

  1. 第一次、第二次输入 INSTALL_BREW,确认安装 Homebrew;
  2. Homebrew 安装成功后,第一次、第二次输入 INSTALL_E2FSPROGS,确认安装 ext4 工具;
  3. 工具准备好后,脚本才会继续进行磁盘扩容。

Homebrew 的官方安装方式和默认路径请参考其官方安装文档

六、在 R4S 上验证扩容结果

把磁盘插入 NanoPi R4S 并启动 OpenWrt 后,可以通过 SSH 检查:

ssh root@192.168.1.1

df -h
block info
cat /proc/partitions

重点观察根文件系统或 overlay 的可用空间是否已经明显增加。如果只看 macOS 的 Finder,通常无法正确显示 Linux 分区容量,因此应以 R4S 内部的 df -h 为准。

七、常见问题

1. Etcher 烧录后仍然显示小容量

这是正常现象。烧录工具显示的是镜像原有分区大小,必须完成分区表扩展后,系统才会看到整块磁盘空间。

2. macOS 提示无法读取或初始化磁盘

不要点击“初始化”或“抹掉”。macOS 不认识 Linux 分区并不代表镜像损坏。关闭提示,使用 diskutil list external physical 查看设备即可。

3. 脚本没有识别为 OpenWrt

脚本主要针对 MBR、第二分区从 131072 扇区开始、且第二分区为 ext4 或 SquashFS 的布局。如果目标镜像使用 GPT、不同的分区起点或其他文件系统,脚本会要求额外确认。不了解分区结构时,不建议强制继续。

4. ext4 扩容失败

确认第二分区已卸载,并检查 Homebrew 的工具路径。也可以在 Linux 环境中执行:

sudo e2fsck -f -p /dev/sdX2
sudo resize2fs /dev/sdX2

将 /dev/sdX2 替换成实际设备。不要把整块磁盘 /dev/sdX 误当成第二分区。

5. 扩容后仍然没有全部可用空间

先确认第二分区的结束位置已经到达磁盘末尾,再确认文件系统类型。SquashFS 不使用 resize2fs;ext4 则必须完成文件系统扩展。最终请在 OpenWrt 中使用 df -h 验证。

结语

对于 OpenWrt 烧录到大容量移动硬盘或 TF 卡的场景,最实用的思路是:保留原始小镜像的启动结构,只把第二分区扩展到磁盘末尾。SquashFS 只改分区边界,ext4 则在此基础上再扩展文件系统。

这样既避免了制作和烧录几十 GB 整盘镜像的等待时间,也把高风险的磁盘选择、分区校验、MBR 备份和二次确认集中到了一个脚本中,更适合日常使用。

如果嫌麻烦也可以使用已经做好的一件脚本,在MacOS下可以直接运行: