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:
- Mengompresi perangkat blok qcow2 (disk VM)
- Membuat disk yang lebih kecil
- Memasang gambar gparted, disk lama dan baru
- Bersiap untuk mem-boot OS
- 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:
Mulai VM dan lihat layar boot GParted:
Pilih item pertama dan ikuti petunjuk di layar. Saya biasanya menekan enter sepenuhnya.
Melihat GParted itu sendiri, mari kita beraksi. Kami dengan cepat memeriksa apakah / dev / vda memiliki tabel partisi - msdos atau gpt . Ini penting:
Beralih ke disk kedua / dev / vdb dan buat tabel partisi:
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 :
Hasil akhirnya adalah:
Tekan Terapkan dan tunggu hasilnya selesai:
Hasilnya:
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 :
Mari blkid untuk memastikan bahwa UUID dari partisi telah berubah
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.
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.
- VM Windows, virt-sparsify . , , ( blkid), Windows , . ( ) fixmbr + rebuildbcd. β man
- β 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.