繁体   English   中英

qcow2标头有多少?

[英]How large is the qcow2 header?

我的原始VM映像当前存储在LUKS加密文件(例如/var/lib/libvirt/images/win7.img)中,并使用libvirt通过以下方式访问:

<disk type='block' device='disk'>
  <driver name='qemu' type='raw'/>
  <source dev='/dev/mapper/win7.img'/>
  <target dev='vda' bus='virtio'/>
</disk>

我借助btrfs的快照功能对其进行备份

# sample backup procedure
IMG_PATH="/var/lib/libvirt/images"
virsh shutdown win7
cryptsetup luksClose /dev/mapper/win7.img
DATE=$(date --utc +%Y-%m-%d-%H%M%S)
btrfs subvolume snapshot -r ${IMG_PATH}/ ${IMG_PATH}/${DATE}
cryptsetup luksOpen --key-file /root/libvirt.key ${IMG_PATH}/win7.img
virsh start win7
btrfs send ${IMG_PATH}/${DATE} | btrfs receive /mnt/backup/images/

# subsequent backup
virsh shutdown win7
cryptsetup luksClose /dev/mapper/win7.img
NEW_DATE=$(date --utc +%Y-%m-%d-%H%M%S)
btrfs subvolume snapshot -r ${IMG_PATH}/ ${IMG_PATH}/${NEW_DATE}
cryptsetup luksOpen --key-file /root/libvirt.key ${IMG_PATH}/win7.img
virsh start win7
btrfs send -p ${IMG_PATH}/${DATE} ${IMG_PATH}/${NEW_DATE} | btrfs receive /mnt/backup/images/
btrfs subvolume delete ${IMG_PATH}/${DATE}

现在,我打算通过将原始图像转换为压缩的qcow2来节省一些空间:

# create a sparse and LUKS encrypted image
# the LUKS header is 2 MiB large
# therefore "seek=51202" instead of "seek=51200" for a 50 GiB virtual disk
IMG_PATH="/var/lib/libvirt/images"
dd bs=1048576 count=0 seek=51202 if=/dev/zero of=${IMG_PATH}/win7_new.img
cryptsetup luksFormat -c aes-xts-plain -h sha512 -s 512 ${IMG_PATH}/win7_new.img
cryptsetup luksAddKey ${IMG_PATH}/win7_new.img /root/libvirt.key
cryptsetup luksOpen --key-file /root/libvirt.key ${IMG_PATH}/win7_new.img win7_new.img

# copy the content from the old image to the new compressed image and delete the old one
qemu-img convert -f raw -O qcow2 -c /dev/mapper/win7.img /dev/mapper/win7_new.img
cryptsetup luksClose /dev/mapper/win7.img
cryptsetup luksClose /dev/mapper/win7_new.img
rm -f ${IMG_PATH}/win7.img
mv ${IMG_PATH}/win7_new.img ${IMG_PATH}/win7.img

新的libvirt xml代码如下:

<disk type='block' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source dev='/dev/mapper/win7.img'/>
  <target dev='vda' bus='virtio'/>
</disk>

我的问题:我知道LUKS标头大小“ 256位等于1'052'672字节的总标头大小和2MiB之一的512位。” 6.2如何备份LUKS标头? ),但找不到有关qcow2标头大小的任何可靠信息。 它是固定的还是取决于虚拟磁盘的大小? qcow2标头有多少?

qcow2标头的大小为1个群集,默认群集大小为64kb,但最重要的是,您需要添加可变大小的L1和L2表以及群集引用计数表,这些表的大小取决于虚拟映像的大小。 在进行预分配时,即使qcow2代码也无法计算所需的确切大小-它进行了近似计算,因为真正的计算非常困难。 结果是,没有真正好的方法来获得准确的数字。 最好的选择是通过使用最大的预期映像大小进行预分配测试来确定开销。 例如,假设您希望最大的图像大小为20 GB,

$ qemu-img创建-f qcow2 -o preallocation = falloc demo.img 20G

格式化'demo.img',fmt = qcow2大小= 21474836480加密=关闭cluster_size = 65536预分配= falloc lazy_refcounts =关闭refcount_bits = 16

$ ls -al demo.img -rw-r--r--。 1 berrange berrange 21478375424 Dec 21 23:11 demo.img

21478375424-21474836480 == 3538944

因此,一个20 GB的映像在qcow2中大约有3.5 MB的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM