自编译 OpenWrt 系列 - SD 卡分区扩容指南

本篇文章将介绍扩容 OpenWrt root 分区的内容,本文所述内容适用于以 SD 卡存储介质的 ARM 设备 (树莓派、NanoPi R2S 等)。

将本项目 OpenWrt 固件刷入 SD 卡后,SD 卡内 boot 分区所占空间为 64M,root 分区所占空间为 960M,所以:

SD 卡总容量 - (64+960)M ≈ 空闲分区容量

虽然刷入固件的初始状态下空闲分区无法被利用,但在默认情况下,960M 的 root 分区完全能胜任日常使用。

若确有扩容 root 分区的需求,请按下文内容操作。

注意:

⚠️数据无价,在扩容操作前,请务必备份好 SD 卡内的重要数据

⚠️如确有扩容需求,请尽量在刷入固件后即进行分区扩容操作,这样不仅可以避免文件丢失 (因为刚刷完固件什么重要文件都没有),在一定程度上还可加快分区扩容速度。

ext4 固件

由于未知原因,ext4 固件暂时无法在 Windows 下使用 Diskgenius、PartitionGuru 等磁盘管理工具扩容,所以我们需要在 Linux 环境下对 SD 卡进行扩容操作。

①如果你有现成的 Linux 环境,则可以将 SD 卡插入电脑,使用 GParted 工具对 SD 卡的 Root 分区进行扩容;

②如果你有空闲的 U 盘,则可以将 Linux 发行版的 Live CD 写入 U 盘,重启至 U 盘中的 Live 环境使用 GParted 工具对 SD 卡进行扩容;

③如果以上条件都不满足,则可使用虚拟机软件虚拟 Gparted 的 Live CD,在虚拟机中完成 SD 卡的扩容。

以下内容介绍 (相对最麻烦的) 方法 ③,方法 ① 和 ② 与方法 ③ 大同小异,在此不再赘述。

在接下来的内容中,我们使用开源免费的 VirtualBox 来进行 SD 卡的扩容操作,VMWare 下的操作步骤与 VirtualBox 相似,在此也不再赘述。

下载所需文件

前往 VirtualBox 官网的下载页面:

https://www.virtualbox.org/wiki/Downloads

下载适用于 Windows 的 VirtualBox 安装包和扩展包:

📌点击展开图片 » image.png
文件下载到本地后,注意比对文件名中的版本号是否一致。以上图为例,安装包和扩展包的文件名分别为:

VirtualBox-6.1.16-140961-Win.exe

Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack

两文件名中版本号 (6.1.16) 相同,则证明文件下载正确。

接着,我们前往 Gparted 官网的下载页面:

https://gparted.org/download.php

下载适用于 x86_64 设备的 Live CD 映像:

📌点击展开图片 » image.png
至此,扩容所需文件下载完成。

建立虚拟 GParted Live 环境

在 VirtualBox 安装过程中,除安装目录外,不建议对其他选项进行修改操作。

完成 VirtualBox 的安装后,双击刚刚下载好的扩展包,完成对 VirtualBox 扩展包的安装。

💡接下来的步骤在 VirtualBox 中进行 (点击各步骤前的 ▶ 即可展开该步骤对应的图片):

1. 虚拟机类型选择为“Linux”,版本选择为“Other Linux (64-bit)” » image.png
2. 内存分配默认的 512M 即可 » image.png
3. 因为我们将在虚拟机中运行 Live 映像,所以不必配置虚拟磁盘 » image.png
4. 选中刚刚创建好的虚拟机,点击“设置”按钮进入详细的虚拟机配置界面 » image.png
5. 在“系统 - 启动项”中,将“光驱”设为唯一启动项并将其移动到第一位 » image.png
6. 注册并应用我们刚刚下载好的 GParted Live CD 文件 » image.png image.png image.png image.png
7. 将 SD 卡装入读卡器插入电脑,在“USB 设备”中,勾选 USB 2.0 选项,点击右侧按钮将 USB 读卡器设备分配给虚拟机 » image.png
8. 回到主界面,启动虚拟机 » image.png
9. 在启动菜单中选择 (默认的) 第一个选项,按下回车键进入 » image.png
10. 默认情况下不需要选择按键布局,故我们直接按下回车键选择默认选项进入 » image.png
11. 输入 “26” 将界面语言选择为“简体中文” » image.png
12. 输入“0”并回车直接进入 X 界面 » image.png
13. 进入图形界面后,将自动启动 Gparted » image.png
14. 右击卷标为“rootfs”的 960M 分区,选择“更改大小/移动” » image.png
15. 拖动手柄调整 rootfs 大小进行扩容,如果你要进行全盘扩容操作,建议在 rootfs 分区前后留出大于 4M 的空间 » image.png
16. 回到 Gparted 主界面,点击“绿色箭头”执行扩容操作 » image.png
17. 扩容中...可能需要 1 分钟或几分钟 » image.png
18. 扩容完成 » image.png
19. 回到主界面查看分区信息,确认分区扩容完毕 » image.png
20. 回到桌面,依次点击“Exit - Shutdown”关机 » image.png

Squashfs 固件

对于 squashfs 固件,我们可以在暂未使用的空闲空间上新建一个分区,之后将 overlay 分区中的内容拷贝到这个分区,然后将系统在 overlay 分区的挂载点修改为刚刚新建的分区来进行扩容。

⚠️由于 Squashfs 固件涉及到文件迁移,所以 请尽量在刷入固件后即进行分区扩容操作

💡点击各步骤前的 ▶ 即可展开该步骤对应的图片:

1. 在“系统 - 软件包”中查看 rootfs 剩余空间为 600M » 0.png
2. 在“系统 - 磁盘管理”中找到 SD 卡设备 (/dev/mmcblk0),点击“修改” » 1.png 2.png
3. 在分区信息中可以看出 SD 卡中有 14.83G 的空闲空间,点击右侧“新建”按钮新建分区 » 3.png
4. 分区新建完成,点击“格式化” » 4.png
5. 选择 ext4 分区作为新分区的文件系统 » 5.png
6. 分区已成功格式化为 ext4 格式 » 6.png
  1. 进入 OpenWrt 的 TTYD 或 SSH,进行迁移文件操作 »
# 将刚刚新建的 /dev/mmcblk0p3 分区挂载至 /mnt
root@OpenWrt:/# mount /dev/mmcblk0p3 /mnt

# 查看分区挂载情况
root@OpenWrt:/# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 760.8M 0 loop /overlay
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
├─mmcblk0p2 179:2 0 960M 0 part /rom
└─mmcblk0p3 179:3 0 13.8G 0 part /mnt

# 将 /overlay 分区下的所有文件拷贝至刚刚建立好的分区内
root@OpenWrt:/# cp -f -a /overlay/. /mnt

# 查看是否拷贝成功
root@OpenWrt:/# ls -a /mnt
. .. .fs_state lost+found upper work
root@OpenWrt:/# ls -a /overlay
. .. .fs_state upper work

# 同步文件
root@OpenWrt:/# sync

# 卸载 /dev/mmcblk0p3 分区
root@OpenWrt:/# umount /mnt
8. 前往“系统 - 挂载点”,点击“生成配置” » 7.png
9. 在“挂载点”中我们可以看到刚刚创建好的 ext4 分区 /dev/mmcblk0p3,点击右方“修改” » 8.png
10. 在接下来的界面中,“启用此挂载点”并选择“作为外部 overlay 使用”,点击“保存&应用” » 9.png
11. 在“系统 - 挂载点”页面下,确认挂载点已启用 (打钩),并确认挂载点为 /overlay,点击下方“保存&应用”,之后重启 OpenWrt » 10.png
12. 验证分区扩容成功 » 11.png
root@OpenWrt:/# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 760.8M 0 loop /mnt/loop0
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
├─mmcblk0p2 179:2 0 960M 0 part /rom
└─mmcblk0p3 179:3 0 13.8G 0 part /overlay

root@OpenWrt:/# mount | grep overlay
/dev/mmcblk0p3 on /overlay type ext4 (rw,relatime)
overlayfs:/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
overlayfs:/overlay on /opt/docker type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)

root@OpenWrt:/# df -h | grep overlay
/dev/mmcblk0p3 13.5G 42.2M 12.8G 0% /overlay
overlayfs:/overlay 13.5G 42.2M 12.8G 0% /
overlayfs:/overlay 13.5G 42.2M 12.8G 0% /opt/docker