Насколько велик заголовок qcow2?

Мои необработанные образы виртуальных машин в настоящее время хранятся в зашифрованном файле 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 байт, а 512 бит - один из 2 МБ". (6.2 Как сделать резервную копию заголовка LUKS?), но не смог найти достоверной информации о размере заголовка qcow2. Это фиксировано или зависит от размера виртуального диска? Насколько велик заголовок qcow2?


person David Sardari    schedule 16.09.2015    source источник
comment
Согласно Faracco, заголовок имеет фиксированную длину, но в образах qcow2 хранится дополнительный материал (например, таблица L1, таблица refcount). Я думаю о том, чтобы просто сделать 1 ГиБ больше, чем нужно для сохранения. Это редко. Таким образом, дополнительный размер не имеет большого значения.   -  person David Sardari    schedule 17.09.2015
comment
Я загрузил свои виртуальные машины с помощью clonezilla и использовал partclone для копирования только используемых блоков в несжатый зашифрованный файл образа. После сжатия этого файла с помощью qemu-img, как описано выше, я иногда получал файл большего размера. Поэтому я решил остаться с несжатыми файлами изображений. Было бы неплохо повторно реализовать собственное шифрование qcow2 безопасным способом. К сожалению, текущая реализация устарела.   -  person David Sardari    schedule 17.09.2015


Ответы (1)


Заголовок qcow2 имеет размер 1 кластер, а размер кластера по умолчанию — 64 КБ, но помимо этого вам необходимо добавить таблицы L1 и L2 переменного размера, а также таблицы refcount кластера, размер которых зависит от размера виртуального образа. При выполнении предварительного распределения даже код qcow2 не вычисляет точный требуемый размер — он делает близкое приближение, поскольку истинный расчет довольно сложен. В результате нет действительно хорошего способа получить точную цифру. Лучше всего просто определить накладные расходы, выполнив тест prealloc с наибольшим ожидаемым размером изображения. например, вы ожидаете, что самый большой образ будет иметь размер 20 ГБ,

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

Форматирование 'demo.img', fmt=qcow2 size=21474836480 шифрование=off cluster_size=65536 preallocation=falloc lazy_refcounts=off refcount_bits=16

$ ls -al demo.img -rw-r--r--. 1 берранж берранж 21478375424 дек 21 23:11 demo.img

21478375424-21474836480 == 3538944

Таким образом, образ размером 20 ГБ имеет около 3,5 МБ накладных расходов в qcow2.

person DanielB    schedule 21.12.2016