PVE 虚拟机 OpenWrt 无损扩容终极教程(LVM-Thin 架构)

PVE 虚拟机 OpenWrt 无损扩容终极教程(LVM-Thin 架构)

PVE 中跑 OpenWrt 一段时间后,装了几个插件、跑了一些日志,突然发现根目录 overlay 吃满了。这时候你会想:去网页端把磁盘拉大,然后进系统跑个 resize2fs 不就完了?

结果一敲命令:

1
resize2fs: Invalid argument while trying to resize /dev/root

PVE 虚拟机 OpenWrt (LVM-Thin 架构) 终极无损扩容教程,建议收藏。以后碰到任何嵌入式 Linux 固件扩容,直接用这套”外部物理碾压法”,100% 成功。

📝 为什么不能在 OpenWrt 内部直接扩容?

内核死锁

OpenWrt 运行时,根目录 /dev/root 被内核死死咬住,无法在线修改。即使用 mount -o remount,ro / 重新挂载为只读也是不行的 —— rootfs 一旦挂载就锁死了。

特性阉割

固件编译时通常关闭了 resize_inode 特性。即使你想尽办法把分区表改了,resize2fs 也会直接报错 Invalid argument

1
2
resize2fs 1.47.0 (5-Feb-2023)
resize2fs: Invalid argument while trying to resize /dev/root

根本原因:固件开发者为了缩小编译产物体积,在 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 临时加载 NBD (Network Block Device) 内核模块
modprobe nbd

# 2. 建立 LVM-Thin 虚拟磁盘与宿主机的物理映射
# 【注意】将 105 替换为你实际的虚拟机 ID;如果你的盘不是 scsi0 而是 scsi1,对应修改末尾的 disk-X
qemu-nbd -f raw --connect=/dev/nbd0 /dev/pve/vm-105-disk-1

# 3. 强行修复并清理虚拟磁盘 2 号分区(即 OpenWrt 的根目录 rootfs)的位图错误
e2fsck -f -y /dev/nbd0p2

# 4. 把 ext4 文件系统彻底拉满到你刚才在 PVE 分配的物理边界
resize2fs /dev/nbd0p2

# 5. 安全断开映射,释放设备锁
qemu-nbd --disconnect /dev/nbd0

💡 命令解读

  • 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
df -h

完美结果:你会看到 /dev/rootSize 已经稳稳当当地变成了 4.0 GiB,同时网络配置、后台插件完好无损,无痛通关!

💡 避坑小结

不要用 fdisk 手动删分区重建

这会改变 GPT 分区的 PARTUUID,导致 OpenWrt 开机直接卡死在:

1
Waiting for root device PARTUUID=xxx...

OpenWrt 的 /etc/config/fstab 和内核启动参数都依赖这个 UUID,一旦变了就 GG。

认清 LVM-Thin 存储

如果 PVE 存储使用的是 LVM-Thin,虚拟磁盘不是 .raw.qcow2 文件,它存在于 /dev/pve/vm-XX-disk-XX 的块设备中,qemu-nbd 必须加 -f raw 显式指定格式,否则报错:

1
qemu-nbd: Could not open '/dev/pve/vm-105-disk-1': ...

万一映射后看不到分区怎么办?

偶尔 nbd0 挂上后 /dev/nbd0p2 没自动出现(和内核的 GPT 分区扫描有关),手动触发一下即可:

1
2
partprobe /dev/nbd0
lsblk /dev/nbd0 # 确认 p1、p2 分区出现后再跑 e2fsck

为什么是 p2 而不是 p1?

OpenWrt combined-efi 固件通常有两个分区:

  • p1:EFI 系统分区(ESP),FAT32 格式,存放引导文件。
  • p2:rootfs,ext4 格式,你的所有数据都在这里,扩容只扩 p2

📝 总结

这套”外部物理碾压法”的核心思路只有一句话:关机 → 映射 → 修盘 → 扩容 → 断开 → 开机。无论是 OpenWrt 还是其他嵌入式 Linux(Armbian、LibreELEC 等),只要跑在 PVE LVM-Thin 上,这套方法通杀。收藏起来,下次扩容不用再满世界翻教程!


PVE 虚拟机 OpenWrt 无损扩容终极教程(LVM-Thin 架构)
https://blog.952405.xyz/2026/04/pve-openwrt-lvm-thin-resize/
作者
iDing
发布于
2026年4月9日
许可协议
转发请注明出处