# OpenWrt x86 在 PVE 虚拟机上扩容根分区
## 环境
– PVE 宿主机 + OpenWrt x86/64 虚拟机
– OpenWrt 使用 `generic-ext4-combined-efi` 镜像安装
– 镜像默认根分区只有约 104MB,需要手动扩容
—
## 正确步骤
### 第一步:在 PVE Shell 上扩大虚拟磁盘
“`bash
qm resize 100 scsi0 6G
“`
> `100` 替换为你的 VM ID,`6G` 为目标总大小
—
### 第二步:在 PVE Shell 上停机并挂载磁盘
“`bash
qm stop 100
losetup -f –show -P /dev/pve/vm-100-disk-0
# 输出类似 /dev/loop0
“`
—
### 第三步:用 sfdisk 扩展分区表(保留 PARTUUID)
先导出当前分区表确认各字段:
“`bash
sfdisk –dump /dev/loop0
“`
然后写入新分区表,**只修改 `last-lba` 和 sda2 的 `size`,所有 uuid 原样保留**:
“`bash
sfdisk /dev/loop0 << ‘EOF’
label: gpt
label-id: 5C2FFFBE-0205-272D-B7F7-1329AD7E6300
device: /dev/loop0
unit: sectors
first-lba: 34
last-lba: 12582878
sector-size: 512
/dev/loop0p1 : start=512, size=32768, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=5C2FFFBE-0205-272D-B7F7-1329AD7E6301, attrs=”LegacyBIOSBootable”
/dev/loop0p2 : start=33280, size=12549598, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=5C2FFFBE-0205-272D-B7F7-1329AD7E6302
/dev/loop0p128 : start=34, size=478, type=21686148-6449-6E6F-744E-656564454649, uuid=5C2FFFBE-0205-272D-B7F7-1329AD7E6380
EOF
“`
> ⚠️ `last-lba` 和 sda2 的 `size` 需根据实际磁盘大小计算:
> – `last-lba` = 总 sectors – 34
> – sda2 `size` = `last-lba` – 33280 + 1
—
### 第四步:修复文件系统并 resize
“`bash
e2fsck -f /dev/loop0p2
resize2fs /dev/loop0p2
losetup -d /dev/loop0
“`
—
### 第五步:启动 VM 并确认
“`bash
qm start 100
“`
SSH 进入 OpenWrt 后确认:
“`bash
df -h
“`
根分区应显示扩容后的大小。
—
## 关键注意事项
– **不要用 gdisk 的 `d` 删除再 `n` 新建分区**,这会生成新的 Partition GUID,导致 grub 找不到根分区,VM 无法启动。
– **sfdisk 直接覆盖写入**可以保留所有 uuid,是唯一安全的在线分区扩展方式。
– `qm resize` 只扩大 LVM 卷,不更新分区表,必须配合 sfdisk + resize2fs 才能生效。
– OpenWrt 25.x 没有预装 `resize2fs`,如需在 OpenWrt 内操作需先 `apk add e2fsprogs`。