При использовании виртуализации KVM и образов виртуальных дисков QCOW2 существует проблема когда диски начинают расходовать излишнее пространство. Особенно это начинает проявляться когда используется функционал снимков (snapshots).
Недостаточно просто освободить место на самой виртуальной машине или удалить снимок виртуальной машины (ВМ). Как только QCOW2 увеличивается в размерах, он никогда не уменьшается сам по себе.
Ниже привожу два независимых способа исправить ситуацию. Данные мероприятия позволяют оптимизировать десятки и сотни гигабайт дискового пространства.
Virt-sparsify
Чтобы сделать это быстро и безопасно, рекомендуются следующие шаги:
-
При необходимости, освободите все место на диске внутри ВМ .
-
Выключите ВМ.
-
Если ВМ особо ценная, то можно создать резервную копию образа диска, который вы хотите уменьшить:
cp --sparse=auto debian12_debian12.img debian12_debian12.img.old
- Смотрим информацию о нашем диске:
[lan-lucky images]# qemu-img info debian12_debian12.img
image: debian12_debian12.img
file format: qcow2
virtual size: 100 GiB (107374182400 bytes)
disk size: 13.1 GiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/debian-VAGRANTSLASH-bookworm64_vagrant_box_image_12.20240503.1_box.img
backing file format: qcow2
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: debian12_debian12.img
protocol type: file
file length: 13.1 GiB (14087487488 bytes)
disk size: 13.1 GiB
- Основное действие. Из каталога, где хранится ваш образ, вызовите команду:
[lan-lucky images]# virt-sparsify --in-place debian12_debian12.img
[ 2.4] Trimming /dev/sda1
[ 5.6] Sparsify in-place operation completed with no errors
- Cнова смотрим информацию о нашем диске. Видно что параметр
disk size
уменьшился:
[lan-lucky images]# qemu-img info debian12_debian12.img
image: debian12_debian12.img
file format: qcow2
virtual size: 100 GiB (107374182400 bytes)
disk size: 7.41 GiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/debian-VAGRANTSLASH-bookworm64_vagrant_box_image_12.20240503.1_box.img
backing file format: qcow2
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: debian12_debian12.img
protocol type: file
file length: 13.1 GiB (14087487488 bytes)
disk size: 7.41 GiB
-
После успешного выполнения команды перезапустите виртуальную машину.
-
Можно проверить, что использование дискового пространства снизилось с помощью команды
df -Th
.
Конвертация
При использовании способа выше видимый размер виртуального диска остаётся прежним. Это видно по полю file length
в выводе выше.
В системе это можно увидеть с помощью команды:
[lan-lucky images]# du -hs --apparent-size debian12_debian12.img
14G debian12_debian12.img
Что бы привести видимый размер и реальный к общему знаменателю диск можно сконвертировать:
qemu-img convert -O qcow2 debian12_debian12.img debian12_debian12.img.new
Смотрим информацию о диске после конвертации:
[lan-lucky images]# qemu-img info debian12_debian12.img.new
image: debian12_debian12.img.new
file format: qcow2
virtual size: 100 GiB (107374182400 bytes)
disk size: 7.74 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: debian12_debian12.img.new
protocol type: file
file length: 7.74 GiB (8315994112 bytes)
disk size: 7.74 GiB
[lan-lucky images]# du -hs --apparent-size debian12_debian12.img.new
7.8G debian12_debian12.img.new
Заменяем старый диск на новый:
mv -f debian12_debian12.img.new debian12_debian12.img
Саммари
Первый способ относительно быстрый, второй более качественный, но может быть медленней первого.