PVE 虚拟机 OpenWrt 无损扩容终极教程(LVM-Thin 架构)
PVE 虚拟机 OpenWrt 无损扩容终极教程(LVM-Thin 架构)
PVE 中跑 OpenWrt 一段时间后,装了几个插件、跑了一些日志,突然发现根目录 overlay 吃满了。这时候你会想:去网页端把磁盘拉大,然后进系统跑个 resize2fs 不就完了?
结果一敲命令:
1 | |
PVE 虚拟机 OpenWrt (LVM-Thin 架构) 终极无损扩容教程,建议收藏。以后碰到任何嵌入式 Linux 固件扩容,直接用这套”外部物理碾压法”,100% 成功。
📝 为什么不能在 OpenWrt 内部直接扩容?
内核死锁
OpenWrt 运行时,根目录 /dev/root 被内核死死咬住,无法在线修改。即使用 mount -o remount,ro / 重新挂载为只读也是不行的 —— rootfs 一旦挂载就锁死了。
特性阉割
固件编译时通常关闭了 resize_inode 特性。即使你想尽办法把分区表改了,resize2fs 也会直接报错 Invalid argument:
1 | |
根本原因:固件开发者为了缩小编译产物体积,在 make menuconfig 时把 ext4 的在线扩容特性给关掉了。
环境残缺
即便进入安全模式(Failsafe),也会因为没有挂载原盘而导致找不到 resize2fs 命令 —— 安全模式跑的是 ramdisk,rootfs 根本没挂上。
🛠️ 终极降维打击:PVE 宿主机外部离线扩容法
这是最优雅、最暴力的解法:直接让 OpenWrt 关机,利用 PVE 宿主机的完美工具链,从外部强行把空间灌进去。
前提条件
在 PVE 网页端 → OpenWrt 虚拟机 → 硬件 中,已经手动把硬盘大小在线扩展到了你想要的大小(例如从 1G 拉到 4G)。
操作路径:选中 scsi0 磁盘 → 点击上方的 调整大小 (Resize disk) → 输入目标大小增量(例如 +3G)。
第一步:让 OpenWrt 虚拟机彻底断电
在 OpenWrt 终端输入 poweroff,或者直接在 PVE 网页端对该虚拟机点击 停止 (Stop)。
⚠️ 核心逻辑:必须关机,释放文件系统所有的内核锁。在线扩容在此不适用。
第二步:登录 PVE 宿主机的 Shell 终端
注意:是 PVE 节点自身的 Shell(输入 qm importdisk 的那个大后台),不是虚拟机的控制台。
依次复制并运行以下命令:
1 | |
💡 命令解读:
modprobe nbd:加载内核的 NBD 模块,让宿主机能把虚拟磁盘”映射”成一个本地块设备。qemu-nbd --connect:把/dev/pve/vm-105-disk-1这个 LVM-Thin 卷暴露为/dev/nbd0,之后/dev/nbd0p2就是 OpenWrt 的 rootfs 分区。e2fsck -f -y:强制检查并自动修复文件系统错误。resize2fs要求文件系统是”干净”的,这一步不能省。resize2fs:将 ext4 文件系统扩展到分区边界。PVE 侧已经扩了磁盘,但文件系统还不知道,这一步就是”通知”文件系统。qemu-nbd --disconnect:断开映射,否则虚拟机会因为设备锁而无法启动。
第三步:开机验收
回到 PVE 网页端,点击 启动 你的 OpenWrt 虚拟机。
进入 OpenWrt 终端,输入:
1 | |
完美结果:你会看到 /dev/root 的 Size 已经稳稳当当地变成了 4.0 GiB,同时网络配置、后台插件完好无损,无痛通关!
💡 避坑小结
不要用 fdisk 手动删分区重建
这会改变 GPT 分区的 PARTUUID,导致 OpenWrt 开机直接卡死在:
1 | |
OpenWrt 的 /etc/config/fstab 和内核启动参数都依赖这个 UUID,一旦变了就 GG。
认清 LVM-Thin 存储
如果 PVE 存储使用的是 LVM-Thin,虚拟磁盘不是 .raw 或 .qcow2 文件,它存在于 /dev/pve/vm-XX-disk-XX 的块设备中,qemu-nbd 必须加 -f raw 显式指定格式,否则报错:
1 | |
万一映射后看不到分区怎么办?
偶尔 nbd0 挂上后 /dev/nbd0p2 没自动出现(和内核的 GPT 分区扫描有关),手动触发一下即可:
1 | |
为什么是 p2 而不是 p1?
OpenWrt combined-efi 固件通常有两个分区:
p1:EFI 系统分区(ESP),FAT32 格式,存放引导文件。p2:rootfs,ext4 格式,你的所有数据都在这里,扩容只扩 p2。
📝 总结
这套”外部物理碾压法”的核心思路只有一句话:关机 → 映射 → 修盘 → 扩容 → 断开 → 开机。无论是 OpenWrt 还是其他嵌入式 Linux(Armbian、LibreELEC 等),只要跑在 PVE LVM-Thin 上,这套方法通杀。收藏起来,下次扩容不用再满世界翻教程!