OpenWrt/ImmortalWrt 虚拟机无损扩容:从硬盘克隆到解决引导故障
0. 为什么需要扩容?
在使用 OpenWrt 虚拟机(如 VMware、PVE、ESXi)时,默认的固件包通常只分配了 500MB 左右的空间。一旦安装大型插件(如 Docker、Nikki、Node.js 等),就会触发空间不足的错误:
verify_pkg_installable: Only have 20152kb available on filesystem /overlay...
本文将介绍一种不重装系统、不丢失数据的无损扩容方案,并重点讲解如何通过“预防性配置”绕过最头疼的引导失效问题。
准备工作
- 环境:已安装好的 OpenWrt 虚拟机。
- 新硬盘:在虚拟机设置中添加一块新的硬盘(例如 2GB 或更大)。
- 救砖工具:下载一个轻量级的 Linux Live ISO(如 GParted Live 或 Ubuntu 镜像),用于最后的离线扩容。
第一阶段:数据搬家 (磁盘克隆)
我们不直接操作原盘,而是将数据克隆到新盘,这样即使操作失败,原盘数据依然完好。
- 进入终端,确认磁盘识别情况:
假设原盘为lsblk/dev/sda,新盘为/dev/sdb。 - 全盘克隆 (
dd):
将旧盘的所有引导信息和分区按位复制到新盘。dd if=/dev/sda of=/dev/sdb bs=4M - 物理替换:
- 关机。
- 在虚拟机设置中移除旧硬盘。
- 将新硬盘挂载到原来的位置(如 SATA 0:0),确保它是第一启动项。
- 重新开机。
第二阶段:预防性修复 (解决引导变动)
这是本文的精华所在! 调整分区表会导致 PARTUUID 改变,从而让 GRUB 找不到系统盘。我们在调整分区前,先改用物理路径引导。
- 挂载引导分区:
mkdir -p /tmp/boot mount /dev/sda1 /tmp/boot - 修改 GRUB 配置:
查找grub.cfg的位置并编辑它。find /tmp/boot -name grub.cfg vi /tmp/boot/boot/grub/grub.cfg # 路径可能略有不同 - 执行替换:
找到类似root=PARTUUID=xxxx-xxxx的内容,将其修改为:
root=/dev/sda2
提示:将其改为物理路径后,系统启动时只认“第二个分区”,不再依赖 UUID,彻底免疫后续分区调整带来的影响。 - 保存并卸载:
umount /tmp/boot
第三阶段:调整分区表 (扩充边界)
现在我们要告诉系统,原本只有 500MB 的分区 2,现在可以使用整块 2GB 的硬盘了。
- 使用 fdisk 工具:
fdisk /dev/sda - 操作流程:
- 输入
p:查看分区表。务必记下分区 2 的Start(起始扇区)数值(例如 262656)。 - 输入
d,然后输入2:删除第二个分区。 - 输入
n,然后输入p,再输入2:新建分区。 - First Sector:手动输入刚才记下的 Start 扇区数值。
- Last Sector:直接回车(默认使用所有剩余空间)。
- ⚠️ 关键一步:如果提示
Do you want to remove the signature?,一定要输入N!否则数据就真没了。 - 输入
w:保存并退出。
- 输入
第四阶段:离线文件系统扩容 (Resize2fs)
虽然分区表变大了,但文件系统还没回过神来。由于 OpenWrt 内核通常不支持根分区的“在线扩容”,我们需要使用 Live ISO 进行离线操作。
- 启动 Live ISO:
将虚拟机的 CD 驱动器挂载 Live ISO 镜像,并设置 BIOS 从光盘启动。 - 进入终端(救援模式),对 OpenWrt 分区进行“体检”:
(如果提示有错,一路按 y 修复,这是 dd 克隆后的正常校准)e2fsck -f /dev/sda2 - 拉伸文件系统:
看到resize2fs /dev/sda2The filesystem ... is now XXX blocks long字样,恭喜你,大功告成!
第五阶段:结果验证
-
移除 ISO 镜像,重启虚拟机,回到 OpenWrt。
-
输入命令查看空间:
df -h你会发现
/dev/root或/overlay的容量已经变成了你新硬盘的大小。 -
安装测试:
opkg update opkg install nikki安装过程丝滑无比,不再提示空间不足!
💡 核心总结与避坑指南
- 克隆而非直接改原盘:给自己留一剂后悔药。
- 起始扇区对齐:在
fdisk里重建分区时,起始扇区必须和旧的一模一样,否则数据会偏移导致损坏。 - 拒绝删除 Signature:那是文件系统的“身份证”,删了就变空盘。
- 提前改引导:在修改分区前把
PARTUUID改为/dev/sda2,可以避免重启后卡在Waiting for root device。 - Live ISO 是神器:不要纠结为什么在 OpenWrt 内部执行
resize2fs报错,那是内核限制。进 Live CD 修,效率最高。
本文首发于我的技术博客,如果您在扩容过程中遇到任何问题,欢迎在下方留言交流。