一、背景
整个思路基于gpt5.4,且已经验证过可行,所以如果还有不清楚的直接问AI。
我在飞牛 OS(FNOS)里创建了一台 Ubuntu 22 虚拟机,当初给虚拟磁盘分配了 800G:
但后来发现:
- 虚拟机里实际只用了几十 G
- FNOS 的虚拟机磁盘只能增大,不能直接缩小
- qcow2 本地实际占用虽然不大,但虚拟机配置里仍然显示 800G
我的目标是:
在不重装系统的前提下,把这块 Ubuntu 虚拟机磁盘安全缩小。
最终结果:
- 虚拟机内部系统正常
- 根分区保持可用
- 外层 qcow2 从 800G 缩到 120G
- 宿主机实际占用仍然只有四十多 G
二、我的虚拟机环境
系统环境如下:
- FNOS
- 虚拟机系统:Ubuntu 22
- 磁盘格式:qcow2
- 磁盘控制器:SATA(不关键 可以随便换)
在 Ubuntu 里查看磁盘结构:lsblk
输出大致如下:
sda 8:0 0 800G 0 disk
**─sda1 8:1 0 1M 0 part
**─sda2 8:2 0 2G 0 part /boot
**─sda3 8:3 0 798G 0 part
**─ubuntu--vg-ubuntu--lv 253:0 0 100G 0 lvm /
这说明:
- 虚拟磁盘 sda 是 800G
- /boot 是 sda2,大小 2G
- sda3 是一个很大的 LVM 物理卷
- 真正挂载到根目录 / 的逻辑卷只有 100G
也就是说:
虽然外层磁盘是 800G,但系统真正使用的根卷只有 100G。
三、排雷
0.文件移动
移动qcow2文件时一定要使用”--sparse“参数,不然松散结构会被写实,占用异常膨胀。
例如 实际占用44G的文件,如果直接拖动会变成120G,后续只能重新使用”qemu-img convert -O qcow2 new-120g.qcow2 new-120g-compact.qcow2“来重新压缩
cp --sparse=always /vol2/1000/OpenClaw/new-120g.qcow2 /vol2/vm/pool/
1.强制修改
FNOS 当前的虚拟机管理界面支持:
但不支持直接缩小现有虚拟磁盘。
如果直接对 qcow2 执行:
qemu-img resize --shrink 1052c906-7b9a-4f5c-adec-812820c943d9-5w9m.qcow2 120G
虽然命令会成功,但很可能导致:
命令执行后显示:
Image resized.
但结果是:
虚拟机启动失败。
所以这个方法不推荐。
四、操作思路
我的成功方案分成两部分:
第一步:在 Ubuntu 虚拟机内部缩小分区
我使用 GParted,把系统实际占用的分区缩小到了大约 117G。
第二步:在宿主机/另一台 Linux 主机上,把旧 qcow2 转换为新的小 qcow2
使用:
最终生成一个新的 120G qcow2。
五、详细操作步骤
0.准备

操作前一定做好备份工作,导出虚拟机作为备份。
1.使用GParted调整分区大小
我的做法是在 Ubuntu 虚拟机中使用 GParted,把系统分区调整到了大约 117G。
注意
如果你的根分区正在使用中,GParted 可能无法直接缩根分区。常见做法是:
- 挂载 ISO 启动进入 Live 环境
- 或者在可离线调整的状态下操作
核心原则
缩容时一定要保证:
- 文件系统完整
- 分区缩小后仍大于实际使用量
- 不要把分区压得太死,保留一些余量
我最终把它控制在一百多 G,而不是直接压到 101G,这样更安全。


系统镜像改为GParted,启动位置改为CD-ROM 开机即可进入GParted引导界面,中文界面操作没什么好说的。
调整完毕之后 打开虚拟机检查虚拟机是否正常启动,正常则继续,无法启动检查GParted 操作是否有误。
2.调整ecow2

使用下面命令检查是否有相关环境
which qemu-img
which virt-resize
若无则手动安装(飞牛有qemu-img但无virt-resize,因为是一次性的,所以我用另一台安装的环境,没在飞牛中使用)
sudo apt update
sudo apt install -y libguestfs-tools qemu-utils
3.创建新的 120G qcow2
qemu-img create -f qcow2 -o preallocation=metadata new-120g.qcow2 120G
查看qcow2信息
qemu-img info new-120g.qcow2
一开始会看到:
- virtual size: 120 GiB
- disk size: 很小(十几 MiB)
这是正常的,因为它还是空盘。
4.使用 virt-resize 复制到新磁盘
virt-resize -v -x \
1052c906-7b9a-4f5c-adec-812820c943d9-5w9m.qcow2 \
new-120g.qcow2
1052c906-7b9a-4f5c-adec-812820c943d9-5w9m.qcow2为原虚拟机镜像
执行速度与镜像大小有关,HC550 47G的qcow2执行了半个多小时。
5.确认新镜像已经成功写入数据
执行命令
qemu-img info new-120g.qcow2
我最终看到的是:
image: new-120g.qcow2
file format: qcow2
virtual size: 120 GiB
disk size: 42.8 GiB
6.替换原虚拟机磁盘文件
mv /vol2/vm/pool/new-120g.qcow2 \
/vol2/vm/pool/1052c906-7b9a-4f5c-adec-812820c943d9-5w9m.qcow2
7.启动虚拟机并验证
lsblk
sudo pvs -o pv_name,pv_size,pv_used,pv_free
vgs
lvs
df -h /
成功状态应该类似:
- sda 约 120G
- sda3 约 111.7G
- PV 约 111.71G
- LV 仍然 100G
- / 正常挂载