释放小七猫的分享欲

ProxmoxVE 压缩 qcow2 磁盘空间(转载)

categories: 技术 tags: NAS
@ 26/12/2025

ProxmoxVE 压缩 qcow2 磁盘空间(转载)

之前在 Windows 虚拟机上,用 115 网盘传文件到 SMB 共享文件夹,但实际上,115 网盘会先将文件下载到本地缓存文件夹,再复制到目标位置,这导致对于一份容量为 X 的文件,你至少需要本地磁盘拥有 2X 才可以下载下来,这对于现在高昂的硬盘价格来说是不可接受的。

仅仅是下载这个 40G 的文件,就几乎撑爆了我的虚拟硬盘(一共就 96G)

虚拟磁盘文件占用的空间会越来越大,就算从客户机里面删除了很多文件,但这些空间并未释放出来,qcow2 文件仍然占用大量的主机存储空间。

虽然 qcow2 有一个特点,客户机需要时才分配存储空间,这工作的一直很好。但是当从客户机删除了很多文件,释放了很多空间时,从 KVM 主机端完全看不到 qcow2 虚拟磁盘文件有变小的迹象。这是因为现在的文件系统都有一个特点,删除文件时并没有真正的清除文件的内容,只是简单的做了标记,这样删除文件会很迅速,只有当用到这些空间时才重新写入新的数据。这也是反删除甚至反格式化软件存在的基础。所以要想缩小 qcow2 虚拟磁盘文件的大小,就要真正释放这些未使用的空间才可以。

不同的客户机类型有不同解决方式,基本思路就是用 0 填充未使用的客户机磁盘空间,然后用 qemu-img 转换磁盘镜像文件,转换后的磁盘镜像文件将只包含所有已使用的磁盘空间。

linux 客户机

使用 dd 命令将客户机未使用的磁盘空间用 0 填满

dd if=/dev/zero of=~/junk
dd: writing to `/home/***/junk’: No space left on device

意思是对磁盘持续写一个 junk 文件,该文件内容全部为 00,直到写满整个存储空间为止,然后删除这个 junk 文件。

rm junk

写完 0 后,关闭客户机

windows 客户机

删除不需要的文件,清理系统垃圾,然后整理磁盘碎片

下载 SDelete,借助 sdelete 用 0 来填充未使用硬盘空间

查看 sdelete 帮助 C:>sdelete SDelete - Secure Delete v1.6 Copyright (C) 1999-2010 Mark Russinovich Sysinternals - www.sysinternals.com

usage: sdelete.exe [-p passes] [-s] [-q] … sdelete.exe [-p passes] [-z-c] [drive letter] … -a Remove Read-Only attribute -c Clean free space -p passes Specifies number of overwrite passes (default is 1) -q Don’t print errors (Quiet) -s or -r Recurse subdirectories -z Zero free space (good for virtual disk optimization)

用 0 填充 C 分区空闲区域 C:>sdelete -z c

建议使用 diskgenius 完成以上操作,更简单,右键分区选择释放空闲空间即可。

关闭客户机

磁盘镜像转换

  1. 转换磁盘镜像文件
qemu-img convert -O qcow2 debian.qcow2 debian_new.qcow2

转换完成后可以看到 debian_new.qcow2 占用的 KVM 主机存储空间与客户机使用的磁盘空间基本是一致的。然后用新的磁盘镜像文件 debian_new.qcow2 启动客户机即可。

建议采用以下命令:

# 先将原磁盘改为别的名字
mv debian.qcow2 debian-old.qcow2
# 将改名后的磁盘转换为原来的名字
qemu-img convert -p -O qcow2 debian-old.qcow2 debian.qcow2
# 删除原磁盘
rm debian-old.qcow2

转换完成后可以看到 debian.qcow2 占用的 KVM 主机存储空间与客户机使用的磁盘空间基本是一致的。然后用新的磁盘镜像文件 debian.qcow2 启动客户机即可。