我运行基于 KVM 的虚拟化服务器(即 Proxmox),其中一些基于 Debian 的机器在 KVM VM 中运行。Proxmox 可以创建 VM 的备份,它还可以压缩 VM 磁盘映像。
正如我们所了解的,备份大小随着时间的推移而增加,因为每个 VM 磁盘上存储的数据越来越多,并且 VM 磁盘的更多“干净”块变得“脏”(即包含剩余的旧文件)。因此,即使我通过rm -rf
它删除了这样一个虚拟磁盘上的所有文件,实际上备份的大小也会相同,因为这不会清除 VM 磁盘的所有块。
dd if=/dev/zero of=/BIG.txt
我可以通过执行类似然后的操作来“清除”VM磁盘rm -f /BIG.txt
- 这样我创建了一个充满零的大文件,它将使用所有磁盘空间,并且在我删除它之后,它的前块将包含零。不利的一面是磁盘会暂时变满,这会影响每个想要写任何东西的程序。
但是也许还有其他方法可以用零清除未使用的磁盘块,以便备份以更好的速率压缩这样的磁盘?一些基于 Windows 的程序提供了“清除未使用的磁盘空间”的选项(例如 CCleaner),但对于 Linux,我需要它。
最近的 libvirt/kvm 版本支持
discard
vdisc 选项(仅适用于 SCSI vdisk 类型)。启用此选项后,您可以fstrim /
在来宾文件系统上发布,未使用的块将立即被主机 vm 映像丢弃,通过打孔压缩/减少它。请参阅此处(驱动程序部分,搜索“丢弃”)和此处了解更多信息。
如果你不能使用修剪/丢弃方法,你可以继续使用你当前的归零方法(
dd
from/dev/zero
),但有一点不同:发出两次dd
通过,每次只有略多于一半的可用磁盘空间,由fsync; rm BIG.txt
命令隔开。这应该足以恢复几乎所有的可用空间,而不是一次全部填满。