收起左侧

飞牛OS中安全缩小Ubuntu虚拟机qcow2磁盘

1
回复
30
查看
[ 复制链接 ]

7

主题

42

回帖

0

牛值

初出茅庐

飞牛百度网盘玩家fnOS1.0上线纪念勋章

一、背景

整个思路基于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

使用:

  • qemu-img
  • virt-resize

最终生成一个新的 120G qcow2。

五、详细操作步骤

0.准备

image.png

操作前一定做好备份工作,导出虚拟机作为备份。

1.使用GParted调整分区大小

我的做法是在 Ubuntu 虚拟机中使用 GParted,把系统分区调整到了大约 117G。

注意

如果你的根分区正在使用中,GParted 可能无法直接缩根分区。常见做法是:

  • 挂载 ISO 启动进入 Live 环境
  • 或者在可离线调整的状态下操作

核心原则

缩容时一定要保证:

  • 文件系统完整
  • 分区缩小后仍大于实际使用量
  • 不要把分区压得太死,保留一些余量

我最终把它控制在一百多 G,而不是直接压到 101G,这样更安全。

image.png

image.png

系统镜像改为GParted,启动位置改为CD-ROM 开机即可进入GParted引导界面,中文界面操作没什么好说的。

调整完毕之后 打开虚拟机检查虚拟机是否正常启动,正常则继续,无法启动检查GParted 操作是否有误。

2.调整ecow2

image.png

使用下面命令检查是否有相关环境

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
  • / 正常挂载
收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

72

主题

5518

回帖

1215

牛值

共建版主

社区上线纪念勋章社区共建团荣誉勋章飞牛百度网盘玩家fnOS1.0上线纪念勋章EVO2产品纪念

可以用下面的命令收缩虚拟磁盘文件:

qemu-img convert -O qcow2 old.qcow2 new.qcow2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则