今天在封装 Windows Server 2025 qcow2 镜像的时候突然注意到一个问题,将系统配置好之后导出时发现镜像的大小竟然是 60G ???(给虚拟机磁盘的大小就是60G),研究了一番得出了如下结论:QCOW2格式允许磁盘动态增加,虚拟机磁盘文件不会立即占用预配的磁盘空间,而是根据需要进行使用,而且磁盘空间的增加也不是说完全是被用掉了,例如我打包的这个镜像,实际大小是 7G 左右,我创建实例设置的磁盘大小是 60G 的,这个盘的映像文件也会占用 60G ,因为 qcow2 文件的结构在写入操作时会在原有基础上进行扩展,不会自动减少。

这种现象通常出现在以下两种情况:

  • 实例中的删除操作没有实际释放空间。。
  • 实例中在进行了一些大规模的 I/O 操作之后镜像文件没有自动压缩。

解决方法, 压缩 qcow2 镜像

使用 qemu-img 命令 来压缩镜像文件大小,qemu-imgconvert 命令可以将一个镜像文件转换成另一个文件,同时进行压缩。通过使用 -O qcow2-c 选项,可以将 qcow2镜像压缩

1
2
qemu-img convert -O qcow2 -c old.qcow2 new.qcow2
qemu-info xxx.qcow2 # 查看镜像参数

**old.qcow2**:原始镜像文件

**new.qcow2**:压缩后的镜像文件

**-O qcow2**:指定输出格式为 qcow2

**-c**:启用压缩功能

然后在打包 Windows 镜像的时候可以使用 sdelete 工具来清理一下空间,减少没必要的占用,Linux操作系统的话可以使用 fstrim

1
2
sdelete -z C: # Win
sudo fstrim / # Linux