自动清理虚拟机中磁盘上未使用的空间

我运行基于KVM的虚拟化服务器(即Proxmox),其中一些基于Debian的机器在KVM虚拟机中运行。 Proxmox可以创buildVM的备份,也可以压缩VM磁盘映像

据我们了解,随着时间的推移,备份大小不断增加,因为存储在每个VM磁盘上的更多数据以及更多“干净”的VM磁盘块变得“脏”(即包含剩余的旧文件)。 所以,即使我通过rm -rf删除这样的虚拟磁盘上的所有文件,实际上备份将是相同的大小,因为这不会清除VM磁盘的所有块。

我可以通过做一些像dd if=/dev/zero of=/BIG.txt然后rm -f /BIG.txt来“清除”VM磁盘 – 这样我就可以创build大文件,这些文件将会使用所有的零磁盘空间,并删除后,其前块将包含零。 缺点是一会儿磁盘变满,影响到每一个想写任何东西的程序。

但也许还有其他的方法来清零未使用的磁盘块零,所以备份将压缩这样的磁盘更好的速度? 一些基于Windows的程序提供了“清除未使用的磁盘空间”(例如CCleaner)的选项,但我需要Linux。

最近的libvirt / kvm版本支持discard vdisc选项(仅适用于SCSI虚拟磁盘types)。 启用此选项后,您可以在guest虚拟机文件系统上发出fstrim / ,并且主机虚拟机映像会立即丢弃未使用的块,通过打孔压缩/减less它。

看到这里 (驱动程序部分,search“放弃”), 在这里获取更多信息。

如果你不能使用trim / discard方法,你可以继续使用当前的调零方法(从/dev/zero ),发出两个 dd通道,每个通道的可用磁盘空间只有一半多一点,由fsync; rm BIG.txt隔开fsync; rm BIG.txt fsync; rm BIG.txt命令。 这应该足以恢复几乎所有的空闲空间,而不是一次加满。