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

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

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

我们知道,备份大小会随着时间的推移而增加,因为每个虚拟机磁盘上存储的数据越来越多,虚拟机磁盘的“干净”块也越来越多地变“脏”(即包含剩余的旧文件)。因此,即使我用rm -rf它删除了此类虚拟磁盘上的所有文件,实际上备份的大小也会相同,因为这不会清除虚拟机磁盘的所有块。

dd if=/dev/zero of=/BIG.txt我可以通过执行类似以下操作来“清除”虚拟机磁盘rm -f /BIG.txt- 这样我就创建了一个充满零的大文件,它将占用所有磁盘空间,在我删除它之后,它的前块将包含零。缺点是磁盘会暂时变满,这会影响每个想要写入任何内容的程序。

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

答案1

最近的 libvirt/kvm 版本支持discardvdisc 选项(仅适用于 SCSI vdisk 类型)。启用此选项后,您可以fstrim /在客户机文件测试系统上发出命令,主机 vm 映像将立即丢弃未使用的块,并通过打洞来压缩/减少它。

这里(驱动程序部分,搜索“discard”)和这里了解更多信息。

如果你不能使用修剪/丢弃方法,你可以继续使用当前的归零方法(dd来自/dev/zero),但有一个变化:问题 dd每次只占用略多于一半的可用磁盘空间,由fsync; rm BIG.txt命令间隔开。这应该足以恢复几乎所有可用空间,而不会一下子填满。

相关内容