0. 为什么需要扩容?

在使用 OpenWrt 虚拟机(如 VMware、PVE、ESXi)时,默认的固件包通常只分配了 500MB 左右的空间。一旦安装大型插件(如 Docker、Nikki、Node.js 等),就会触发空间不足的错误:
verify_pkg_installable: Only have 20152kb available on filesystem /overlay...

本文将介绍一种不重装系统、不丢失数据的无损扩容方案,并重点讲解如何通过“预防性配置”绕过最头疼的引导失效问题。


准备工作

  1. 环境:已安装好的 OpenWrt 虚拟机。
  2. 新硬盘:在虚拟机设置中添加一块新的硬盘(例如 2GB 或更大)。
  3. 救砖工具:下载一个轻量级的 Linux Live ISO(如 GParted Live 或 Ubuntu 镜像),用于最后的离线扩容。

第一阶段:数据搬家 (磁盘克隆)

我们不直接操作原盘,而是将数据克隆到新盘,这样即使操作失败,原盘数据依然完好。

  1. 进入终端,确认磁盘识别情况:
    lsblk
    
    假设原盘为 /dev/sda,新盘为 /dev/sdb
  2. 全盘克隆 (dd)
    将旧盘的所有引导信息和分区按位复制到新盘。
    dd if=/dev/sda of=/dev/sdb bs=4M
    
  3. 物理替换
    • 关机。
    • 在虚拟机设置中移除旧硬盘
    • 将新硬盘挂载到原来的位置(如 SATA 0:0),确保它是第一启动项。
    • 重新开机。

第二阶段:预防性修复 (解决引导变动)

这是本文的精华所在! 调整分区表会导致 PARTUUID 改变,从而让 GRUB 找不到系统盘。我们在调整分区前,先改用物理路径引导。

  1. 挂载引导分区
    mkdir -p /tmp/boot
    mount /dev/sda1 /tmp/boot
    
  2. 修改 GRUB 配置
    查找 grub.cfg 的位置并编辑它。
    find /tmp/boot -name grub.cfg
    vi /tmp/boot/boot/grub/grub.cfg  # 路径可能略有不同
    
  3. 执行替换
    找到类似 root=PARTUUID=xxxx-xxxx 的内容,将其修改为:
    root=/dev/sda2
    提示:将其改为物理路径后,系统启动时只认“第二个分区”,不再依赖 UUID,彻底免疫后续分区调整带来的影响。
  4. 保存并卸载
    umount /tmp/boot
    

第三阶段:调整分区表 (扩充边界)

现在我们要告诉系统,原本只有 500MB 的分区 2,现在可以使用整块 2GB 的硬盘了。

  1. 使用 fdisk 工具
    fdisk /dev/sda
    
  2. 操作流程
    • 输入 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 进行离线操作。

  1. 启动 Live ISO
    将虚拟机的 CD 驱动器挂载 Live ISO 镜像,并设置 BIOS 从光盘启动。
  2. 进入终端(救援模式),对 OpenWrt 分区进行“体检”:
    e2fsck -f /dev/sda2
    
    (如果提示有错,一路按 y 修复,这是 dd 克隆后的正常校准)
  3. 拉伸文件系统
    resize2fs /dev/sda2
    
    看到 The filesystem ... is now XXX blocks long 字样,恭喜你,大功告成!

第五阶段:结果验证

  1. 移除 ISO 镜像,重启虚拟机,回到 OpenWrt。

  2. 输入命令查看空间:

    df -h
    

    你会发现 /dev/root/overlay 的容量已经变成了你新硬盘的大小。

  3. 安装测试

    opkg update
    opkg install nikki
    

    安装过程丝滑无比,不再提示空间不足!


💡 核心总结与避坑指南

  • 克隆而非直接改原盘:给自己留一剂后悔药。
  • 起始扇区对齐:在 fdisk 里重建分区时,起始扇区必须和旧的一模一样,否则数据会偏移导致损坏。
  • 拒绝删除 Signature:那是文件系统的“身份证”,删了就变空盘。
  • 提前改引导:在修改分区前把 PARTUUID 改为 /dev/sda2,可以避免重启后卡在 Waiting for root device
  • Live ISO 是神器:不要纠结为什么在 OpenWrt 内部执行 resize2fs 报错,那是内核限制。进 Live CD 修,效率最高。

本文首发于我的技术博客,如果您在扩容过程中遇到任何问题,欢迎在下方留言交流。