在压缩 qcow2 图像之前,我需要将其填充为零吗?

在压缩 qcow2 图像之前,我需要将其填充为零吗?

我想重新创建一个动态分配的 qcow2 映像以缩小它。删除所有不必要的文件就足够了吗,还是我还需要用零填充这些文件以前占用的空间?换句话说,qemu-img 是否支持文件系统?

答案1

是的,如果您想恢复已删除文件占用的空间,则需要对文件系统进行零填充。而且,qemu-img 不支持文件系统感知。

我忘记对我今天创建的一个 VM 映像(工作时为 openstack 云创建的最小 Debian Sid 映像)执行此操作,结果它的大小接近 900MB,即使使用“-c”进行 qcow2 压缩也是如此。

我在运行“dd if=/dev/zero of=/root/zero ; rm -f /root/zero ; shutdown -h now”后重新创建了它,图像大小缩小到大约 335MB。每当我启动新实例时,需要复制的数据(无用)就少了很多。

有很多文件被删除,因为虚拟机最初是 debian squeeze,后来通过 apt-get 升级到了 sid。

答案2

另请参阅:virt-sparsify,一个可以对磁盘映像内的文件系统进行零填充的实用程序(支持各种格式):

http://libguestfs.org/virt-sparsify.1.html

答案3

我正在使用 zerofree( apt-get install zerofree) 来完成这个任务:

Zerofree 在 ext2、ext3 或 ext4 文件系统中查找具有非零值内容的未分配块,并用零填充它们

之后你可以缩小你的图像:
kvm-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2

答案4

只是为了扩大 phoeagon 的出色建议,我同意,它比删除. 原因是e2图像ntfs克隆部分克隆都具有文件系统知识(partclone 是 clonezilla 最终所基于的实用程序)。不会扫描整个磁盘,只会将实际使用的文件保存到新映像中。

Windows 下的 sdelete 会将稀疏映像扩展至其完整大小,并且速度非常慢。Linux 下的 ext4 分区上的 Zerofree 不会扩展磁盘映像(但速度仍然很慢)。

这是一个将 VirtualBox 磁盘映像克隆并缩小为Linux 主机上的vdiqemu映像的示例会话。qcow2

这些命令以 root 身份执行;如果操作不当,他们可能会抹去你的镜像文件或主机!一定要小心。

对于mbr基于 Windows 10 的vdi图像到 qcow2(显示两种流行的虚拟化格式)。

#Check file system size
vboximg-mount -i "$(/bin/pwd)/win10.vdi" --list

#Create a (big) sparse qcow2 to accommodate the partitions found in
# the command above
qemu-img create -f qcow2 new.qcow2 300G

#Mount the vdi disk in ./mount with the
# VirtualBox mount utility.
#We don't mount the individual partitions in ./mount
vboximg-mount -i "$(/bin/pwd)/win10.vdi" --rw  mount

#Mount the disk new qcow2 image.
# connecting, in this instance, to /dev/nbd0
modprobe nbd max_part=16
qemu-nbd --connect /dev/nbd0 ./new.qcow2

#Change to the vdi mounted directory
cd mount

#Copy the mbr with the partition table
#./vhdd is the raw device.
#For EFI based boot systems, you'd be better to use
# sgdisk:
#   sgdisk --backup=../part_table.bin ./vhdd
#   sgdisk --load-backup=../part_table.bin /dev/nbd0
#   sgdisk -G /dev/nbd0
#But for mbr:
dd if=./vhdd of=/dev/nbd0 bs=512B count=1

#Check the image has our partition table and make sure it's
# device nodes have been setup by a kernel re-read.
fdisk /dev/nbd0
ls -la /dev/nbd0*
#vbox partitions are zero based (vol0,vol1,vol2); nbd based
# partitions start at 1 (nbd0p1,nbd0p2,nbd0p3).

#Copy the first partition properly with dd
#It's only 100MB.
dd if=./vol0 of=/dev/nbd0p1 bs=4M status=progress

#Copy the third partition properly with dd
dd if=./vol2 of=/dev/nbd0p3 bs=4M status=progress

#Use ntfsclone or partclone.ntfs to copy the main partition
partclone.ntfs -d -b -s ./vol1 -o /dev/nbd0p2

#Get out of the ./mount dir
cd ..

#Umount vdi
umount mount

#Disconnect the nbd device
qemu-nbd --disconnect /dev/nbd0
#Remove the module
sleep 2
rmmod nbd

mv new.qcow2 win10.qcow2
#Change the image to not be root
chown user_name: win10.qcow2

如果您对此不熟悉,您会发现图像会膨胀到给定的大小(尽管通常小于它们最初缩小时的大小),因为操作系统(尤其是 Windows)确实会创建和删除大量临时文件。

再次感谢 phoeagon 为我指明这个方向(我还没有获得对他的答案的赞同)。

相关内容