Menyusut gambar qcow2 di Libvirt KVM

Pernahkah Anda mengurangi ukuran image disk qcow2 yang digunakan di mesin virtual KVM-QEMU? Seperti yang Anda ketahui, proses peningkatan ukuran gambar cukup sederhana dan cepat, namun bagaimana dengan reduksi?



Pada artikel ini saya akan memberi tahu Anda tentang situasi ketika Anda perlu mengurangi gambar qcow2 dari mesin virtual KVM secepat mungkin.



Format blokir perangkat - qcow2



Namun, bagaimanapun, skema ini dapat dilakukan dengan gambar mentah, itu cukup untuk mengubahnya menjadi qcow2. Secara umum, instruksi akan relevan untuk semua yang dikonversi ke qcow2.



Cara mudah untuk mengecilkan disk di KVM adalah sebagai berikut:



  1. Mengompresi perangkat blok qcow2 (disk VM)
  2. Membuat disk yang lebih kecil
  3. Memasang gambar gparted, disk lama dan baru
  4. Bersiap untuk mem-boot OS
  5. Spesifikasi VM dan mesin host:


Host: CentOS 7 + QEMU 2.12 + LIBVIRT 4.5.0 + Kernel UEK5 v. 4.14

VM: CentOS 7 + HDD 80 GB + Kernel std v. 3.10

Donor akan menjadi mesin virtual CentOS 7 dengan gambar hard disk 80GB, sebenarnya ditempati oleh 20GB dan secara fisik 80GB. Kami akan menguranginya menjadi 40GB.



Apa perbedaan antara ukuran gambar, ukuran aktual dan fisik?

Katakanlah gambar qcow2 dibuat dengan ukuran 80GB dan kita mengetahuinya. Selama operasi, gambar tersumbat dengan data, beberapa data dihapus. Jika, secara umum, karena kekhasan proses penulisan dan penghapusan data, untuk OS data yang dihapus tersebut sepertinya tidak ada, tetapi tetap terekam dalam gambar hingga ditimpa oleh data lain. Oleh karena itu, bahkan di OS Anda akan melihat 20GB dari data yang sebenarnya terisi, host KVM akan menampilkan gambar yang sangat bagus (kami menggunakan utilitas qemu-img untuk mendapatkan informasi):



qemu-img info qcow2_image.img
image: qcow2_image.img
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 80G
cluster_size: 65536
Format specific information:
compat: 0.10
refcount bits: 16


Anda dapat melihat bahwa ukuran virtual = ukuran disk, serta du -sh gambar akan menunjukkan bahwa ia menempati 80G nyata:



du -sh qcow2_image.img
80G    qcow2_image.img


Dan karena kita perlu mengurangi ukuran gambar menjadi 40GB, mari kita mulai prosesnya.



Tahap 1 - Mengompresi perangkat blok (gambar)



Sebelum memulai prosedur pengurangan disk, Anda perlu memastikan bahwa ruang yang ditempati di dalam OS kurang dari volume yang akan dikurangi disk dengan satu atau lain cara.



df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        80G   18G   63G  22% /


Seperti yang bisa kita lihat, 18GB sudah terisi, kurang dari 40GB. Matikan VM dengan perintah



shutdown -h now


Dan pergi ke mesin host, periksa:



  • berapa banyak gambar yang diambil secara fisik
  • berapa sebenarnya


# qemu-img info qcow_shrink
image: qcow_shrink
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 80G
cluster_size: 65536
Format specific information:
    compat: 0.10
    refcount bits: 16
# virt-df -h qcow_shrink
du -sh Filesystem                                Size       Used  Available  Use%
qcow_shrink:/dev/sda1                     488M       101M       351M   21%
qcow_shrink:/dev/sda2                      79G        17G        62G   22%
# du -sh qcow_shrink
80G     qcow_shrink


Untuk mengompres gambar, kita membutuhkan utilitas sederhana bernama virt-sparsify . Pastikan VM tidak berfungsi dan jalankan perintah di direktori bersama dengan image disk (Catatan penting: sebelum memulai virt-sparsify , pastikan bahwa ada cukup ruang kosong di / tmp dan di penyimpanan image untuk melakukan operasi)



virt-sparsify qcow_shrink qcow_shrink-new


Operasi yang berhasil diselesaikan akan menghasilkan keluaran berikut:



[   0.0] Create overlay file in /tmp to protect source disk
[   0.1] Examine source disk
[   1.2] Fill free space in /dev/sda1 with zero
[   1.5] Fill free space in /dev/sda2 with zero
 100% βŸ¦β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’βŸ§ 00:00
[  72.5] Copy to destination and make sparse
[  81.9] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.


Kemudian kami menukar disk (pindahkan qcow_shrink ke suatu tempat ke samping, misalnya qcow_shrink-old , dan qcow_shrink-new di tempatnya - qcow_shrink ).



mv qcow_shrink qcow_shrink-old && mv qcow_shrink-new qcow_shrink


Kami memulai VM. Jika semuanya dimulai, kami mematikan VM dan terus bekerja.



Tahap 2 - Buat disk yang lebih kecil



Prosedur sederhana hanya dengan satu perintah:



qemu-img create -f qcow2 -o preallocation=metadata qcow_shrinked 40G


qcow_shrinked - nama gambar baru

40G - ukuran baru



Tahap 3 - menghubungkan gparted



Karena terkadang admin lebih memilih cara yang lebih mudah untuk menyelesaikan masalah, rebana dikesampingkan (kpartx) dan ISO dan VNC menggantikannya. Untungnya, tidak terlalu sulit untuk menghubungkannya di KVM.



Apa yang kita lakukan:



  • Hubungkan gambar ISO GParted
  • Hubungkan qcow2_shrinked ke VM
  • Luncurkan VM, boot dari ISO


Bagaimana melakukan ini, saya akan menghilangkan dari artikel ini, karena diasumsikan bahwa orang yang melakukan semua ini sudah tahu bagaimana hal itu terjadi, tetapi hasilnya adalah sebagai berikut:



gambar



Mulai VM dan lihat layar boot GParted:



gambar



Pilih item pertama dan ikuti petunjuk di layar. Saya biasanya menekan enter sepenuhnya.



gambar



Melihat GParted itu sendiri, mari kita beraksi. Kami dengan cepat memeriksa apakah / dev / vda memiliki tabel partisi - msdos atau gpt . Ini penting:



gambar



Beralih ke disk kedua / dev / vdb dan buat tabel partisi:



gambar



gambar



Saat membuat tabel, pilih jenis msdos seperti yang kita pelajari sebelumnya.



Kemudian beralih kembali ke / dev / vdadan secara berurutan, dari disk pertama, kami mulai menyalin partisi, beralih antara vda dan vdb :



gambar



Hasil akhirnya adalah:



gambar



Tekan Terapkan dan tunggu hasilnya selesai:



gambar



Hasilnya:



gambar



Itu sudah terlihat seperti aslinya. Tetapi karena kami telah melakukan beberapa manipulasi yang akan menyebabkan perubahan dalam UUID disk, kami berpotensi tidak bisa boot ke OS. Mengapa? CentOS 7 menggunakan UUID disk di fstab, Grub2 menggunakan UUID disk, jadi lompat ke konsol dan lakukan sihir hitam.



Gparted awalnya berfungsi sebagai pengguna, jadi kami melompat ke bawah root dengan perintah sudo su - root :



gambar



Mari blkid untuk memastikan bahwa UUID dari partisi telah berubah



gambar



Terlihat bahwa UUID vda1 = vdb1, tetapi untuk vdb2 telah berubah. Tidak apa-apa - Anda bisa menerimanya.



Pasang vdb sepenuhnya, bersama dengan / boot partisi, dan pasang beberapa partisi untuk kenyamanan kita.



mkdir vdb2
mount /dev/vdb2 vdb2
mount /dev/vdb1 vdb2/boot
cd vdb2
mount --bind /dev dev
mount --bind /sys sys
mount --bind /proc proc
chroot .


Mari kita mulai dengan fstab - karena sangat tidak nyaman untuk mengetik UUID di VNC, kami akan menggantinya dengan nama perangkat yang sudah dikenal.



gambar



Kami mengganti baris dengan UUID = ... oleh, perhatian : kami



tentukan / dev / vdb2 , jika disk lama tidak direncanakan untuk diputus, kami

tentukan / dev / vda2 , jika disk lama terputus



Karena kami memutuskan disk lama sebelum memuat OS, maka kami menulis / dev / vda2



Selanjutnya mari kita ubah bootloader, atur. Mari kita asumsikan bahwa semuanya ada di / boot / grub2, grub.cfg ada di tempat yang sama, tetapi efi tidak (tabel msdos, yaitu efi :)):



grub2-install /dev/vdb
cd /boot/grub2
grub2-mkconfig -o grub.cfg


Dalam hal ini, Anda dapat berbahagia untuk diri sendiri dan dengan menonaktifkan gparted, boot ke OS.



Tahap 4 - boot OS



Sebelum memuat OS, saya tetap menyarankan untuk melepaskan disk lama dari server. Oleh karena itu, pada tahap sebelumnya, vda2 harus didaftarkan di fstab, tetapi jika Anda adalah pengguna PC yang penuh perhatian dan tidak memutuskan apa pun, maka seharusnya tidak ada masalah. Dengan disk lama, kemungkinan besar Anda akan boot dari disk tersebut.



Tidak ada masalah selama proses boot, server boot seperti yang diharapkan. Mari kita periksa:



[root@shrink ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M  6.7M  489M   2% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vdb2        40G   18G   23G  44% /
/dev/vdb1       488M  101M  352M  23% /boot
tmpfs           100M     0  100M   0% /run/user/0

[root@shrink ~]# blkid
/dev/vda1: UUID="ea505196-32fb-4df6-8bed-0a0ab2d0b726" TYPE="ext4"
/dev/vda2: UUID="30ec1bc6-658f-4611-8708-5e3b7ebaa467" TYPE="xfs"
/dev/vdb1: UUID="ea505196-32fb-4df6-8bed-0a0ab2d0b726" TYPE="ext4"
/dev/vdb2: UUID="c8548834-272b-4331-a9bf-aa99fb41a434" TYPE="xfs"
/dev/sr0: UUID="2019-03-21-13-42-32-00" LABEL="GParted-live" TYPE="iso9660" PTTYPE="dos"


Kami melihat bahwa / boot dan / diperlukan, berukuran 40GB, OS sedang berjalan. Kebahagiaan, bukan sebaliknya!



Bonus



Sesuatu yang harus Anda hadapi dalam beberapa situasi.



  1. VM Windows, virt-sparsify . , , ( blkid), Windows , . ( ) fixmbr + rebuildbcd. β€” man
  2. β€” xfs Superblock has unknown read-only compatible features (0x4) enabled. read-only, . :


Kemungkinan besar, ketika semuanya dilakukan di gparted atau lingkungan lain, versi kernel dari lingkungan ini terlalu baru, di mana xfs sedikit berubah, yaitu metadata dan versinya berbeda. Akibatnya, xfs yang dibuat di kernel baru berubah menjadi labu di kernel lama. Apa yang kami lakukan adalah melakukan booting kembali ke rescue gparted, meningkatkan jaringan di lingkungan penyelamatan ini dan menginstal kernel terbaru di OS. Saya menginstal 5.x di CentOS 7, mungkin 4.x akan dilakukan, saya belum mengujinya, tetapi pada akhirnya semuanya berfungsi. Apalagi tanpa masalah.



Itu saja!



Seperti yang Anda lihat, tidak ada yang rumit tentang itu. Tentu saja, Anda dapat menggunakan LVM, resize2fs, dan hal-hal lain, tetapi qcow2 masih digunakan di tempat lain dan bahkan dibutuhkan oleh seseorang.



Jika Anda tahu metode yang lebih sederhana - tulis tentang itu di komentar.



All Articles