Qcow2-Bild in Libvirt KVM verkleinern

Haben Sie jemals die Größe des in virtuellen KVM-QEMU-Maschinen verwendeten qcow2-Disk-Images reduziert? Wie Sie wissen, ist das Vergrößern eines Bildes recht einfach und schnell, aber was ist mit der Verkleinerung?



In diesem Artikel werde ich Ihnen die Situation erläutern, in der Sie das qcow2-Image der virtuellen KVM-Maschine so schnell wie möglich reduzieren müssen.



Geräteformat blockieren - qcow2



Dieses Schema kann jedoch mit Rohbildern ausgefĂĽhrt werden. Es reicht aus, es in qcow2 zu konvertieren. Im Allgemeinen sind die Anweisungen fĂĽr alles relevant, was in qcow2 konvertiert wird.



Eine einfache Möglichkeit, die Festplatte in KVM zu verkleinern, ist folgende:



  1. Komprimieren eines qcow2-Blockgeräts (VM-Datenträger)
  2. Eine kleinere Festplatte erstellen
  3. Montage von gparted Image, alter und neuer Festplatte
  4. Vorbereiten des Startvorgangs des Betriebssystems
  5. VM- und Hostcomputerspezifikationen:


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

VM: CentOS 7 + 80 GB Festplatte + Kernel Standard v. 3.10

Der Spender ist eine virtuelle CentOS 7-Maschine mit einem 80-GB-Festplatten-Image, das tatsächlich von 20 GB und physisch 80 GB belegt ist. Wir werden es auf 40 GB reduzieren.



Was ist der Unterschied zwischen Bildgröße, tatsächlicher und physischer Größe?

Nehmen wir an, das qcow2-Image ist 80 GB groß und wir wissen davon. Während des Betriebs wurde das Bild mit Daten verstopft, einige Daten wurden gelöscht. Im Allgemeinen scheinen die gelöschten Daten aufgrund der Besonderheiten des Prozesses des Schreibens und Löschens von Daten für das Betriebssystem nicht zu existieren, sondern bleiben im Bild aufgezeichnet, bis sie von anderen Daten überschrieben werden. Dementsprechend zeigt der KVM-Host selbst im Betriebssystem 20 GB tatsächlich belegte Daten an (wir verwenden das Dienstprogramm qemu-img, um Informationen abzurufen):



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


Sie können sehen, dass die virtuelle Größe = Festplattengröße sowie du -sh des Images zeigen, dass es echte 80G belegt:



du -sh qcow2_image.img
80G    qcow2_image.img


Und da wir die Bildgröße auf 40 GB reduzieren müssen, starten wir den Prozess.



Stufe 1 - Komprimieren des Blockgeräts (Bild)



Bevor Sie mit dem Reduzieren der Festplatte beginnen, mĂĽssen Sie sicherstellen, dass der belegte Speicherplatz im Betriebssystem geringer ist als das Volumen, auf das die Festplatte auf die eine oder andere Weise reduziert wird.



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


Wie wir sehen können, sind 18 GB belegt, was weniger als 40 GB entspricht. Schalten Sie die VM mit dem Befehl aus



shutdown -h now


Und wir gehen zum Host-Computer und ĂĽberprĂĽfen:



  • Wie viel kostet das Bild physisch?
  • wie viel eigentlich


# 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


Um das Bild zu komprimieren, benötigen wir ein einfaches Dienstprogramm namens virt-sparsify . Stellen Sie sicher, dass die VM nicht funktioniert, und führen Sie den Befehl im Verzeichnis zusammen mit dem Disk-Image aus (Wichtiger Hinweis: Stellen Sie vor dem Starten von virt-sparsify sicher, dass in / tmp und im Image-Speicher genügend freier Speicherplatz vorhanden ist, um den Vorgang auszuführen.)



virt-sparsify qcow_shrink qcow_shrink-new


Ein erfolgreicher Abschluss des Vorgangs fĂĽhrt zu folgender Ausgabe:



[   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.


Dann tauschen wir die Festplatte aus (verschieben Sie qcow_shrink irgendwo zur Seite, zum Beispiel qcow_shrink-old und qcow_shrink-new an seiner Stelle - qcow_shrink ).



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


Wir starten die VM. Wenn alles angefangen hat, löschen wir die VM und arbeiten weiter.



Stufe 2 - Erstellen Sie eine kleinere Festplatte



Eine einfache Prozedur mit nur einem Befehl:



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


qcow_shrinked - neues Bild Name

40G - neue Größe



Stufe 3 - Verbindung trennen



Da Administratoren manchmal einfachere Methoden zur Lösung des Problems bevorzugen, wird das Tamburin beiseite gelegt (kpartx) und ISO und VNC treten an seine Stelle. Glücklicherweise ist es nicht sehr schwierig, es in KVM anzuschließen.



Was machen wir:



  • ISO-Image GParted bereitstellen
  • Verbinden Sie qcow2_shrinked mit VM
  • Starten Sie die VM und starten Sie von ISO


Ich werde in diesem Artikel weglassen, wie dies zu tun ist, da davon ausgegangen wird, dass die Person, die dies alles tut, bereits weiĂź, wie es passiert, aber das Ergebnis wird das folgende sein:



Bild



Starten Sie die VM und sehen Sie den GParted-Startbildschirm:



Bild



Wählen Sie das erste Element aus und folgen Sie den Anweisungen auf dem Bildschirm. Normalerweise drücke ich die Eingabetaste.



Bild



Wenn wir GParted selbst sehen, können wir loslegen. Überprüfen Sie schnell, welche Partitionstabelle / dev / vda hat - msdos oder gpt . Dies ist wichtig: Wechseln Sie



Bild



zur zweiten Festplatte / dev / vdb und erstellen Sie die Partitionstabelle: Wählen Sie



Bild



Bild



beim Erstellen der Tabelle den Typ msdos aus, wie wir zuvor erfahren haben. Wechseln Sie



dann zurĂĽck zu / dev / vdaund nacheinander beginnen wir von den ersten Festplatten an, Partitionen zu kopieren und wechseln zwischen vda und vdb :



Bild



Das Endergebnis lautet : DrĂĽcken Sie Ăśbernehmen



Bild



und warten Sie, bis das Ergebnis vollständig ist:



Bild



Als Ergebnis:



Bild



Das sieht bereits nach der Wahrheit aus. Da wir jedoch einige Manipulationen vorgenommen haben, die dazu führen, dass die UUIDs der Festplatten geändert werden, wird das Betriebssystem möglicherweise nicht gestartet. Warum? CentOS 7 verwendet Festplatten-UUIDs in fstab, Grub2 verwendet Festplatten-UUIDs. Springen Sie also in die Konsole und führen Sie schwarze Magie aus.



Gparted arbeitet zunächst als Benutzer, daher springen wir mit dem Befehl sudo su - root unter root :



Bild



Lassen Sie uns blkid , um sicherzustellen, dass sich die UUID der Partitionen geändert hat



Bild



Es ist ersichtlich, dass die UUID vda1 = vdb1 ist, aber für vdb2 hat sie sich geändert. Es ist okay - du kannst damit leben.



Mounten Sie vdb zusammen mit der / boot-Partition vollständig und mounten Sie einige Partitionen für unsere Bequemlichkeit.



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 .


Beginnen wir mit fstab - da es nicht sehr praktisch ist, die UUID in VNC einzugeben, werden wir sie durch den bekannten Gerätenamen ersetzen.



Bild



Wir ersetzen die Zeile mit UUID = ... mit, Aufmerksamkeit : wir



geben / dev / vdb2 , wenn die alte Platte nicht als getrennt geplant, wir

geben / dev / VDA2 , wenn die alte Platte getrennt werden



Da wir das trennen alte Festplatte vor dem Laden des OS, dann schreiben Sie / dev / VDA2



Weiter Ă„ndern Sie den Bootloader und ordnen Sie ihn. Nehmen wir an, dass sich alles in / boot / grub2 befindet, grub.cfg sich an derselben Stelle befindet, efi jedoch nicht (msdos-Tabelle, die efi ist :)):



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


In diesem Fall können Sie sich freuen und durch Deaktivieren von gparted das Betriebssystem starten.



Stufe 4 - Starten Sie das Betriebssystem



Vor dem Laden des Betriebssystems empfehle ich weiterhin, die alte Festplatte vom Server zu trennen. Daher musste vda2 in der vorherigen Phase in fstab registriert sein. Wenn Sie jedoch ein aufmerksamer PC-Benutzer sind und die Verbindung nicht getrennt haben, sollte es keine Probleme geben. Bei einer alten Festplatte ist es sehr wahrscheinlich, dass Sie von dieser starten.



Während des Startvorgangs gab es keine Probleme. Der Server wurde wie erwartet gestartet. Lassen Sie uns dies überprüfen:



[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"


Wir sehen, dass / boot und / erforderlich sind, 40 GB groß, das Betriebssystem läuft. Glück, sonst nicht!



Bonus



Etwas, dem Sie sich in manchen Situationen stellen mĂĽssen.



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


Als alles in gparted oder einer anderen Umgebung ausgeführt wurde, war die Version des Kernels dieser Umgebung höchstwahrscheinlich zu neu, wobei xfs geringfügig geändert wurde, dh die Metadaten und ihre Version unterscheiden sich. Infolgedessen verwandelt sich xfs, das im neuen Kernel erstellt wurde, in einen Kürbis auf dem alten. Wir starten Rescue Gparted, erhöhen das Netzwerk in dieser Rettungsumgebung und installieren den neuesten Kernel im Betriebssystem. Ich habe 5.x unter CentOS 7 installiert, vielleicht reicht 4.x, ich habe es nicht getestet, aber am Ende hat alles funktioniert. Darüber hinaus ohne Probleme.



Das ist alles!



Wie Sie sehen, ist daran nichts Kompliziertes. Natürlich können Sie LVM, resize2fs und andere Dinge verwenden, aber qcow2 wird immer noch woanders verwendet und sogar von jemandem benötigt.



Wenn Sie eine noch einfachere Methode kennen, schreiben Sie darĂĽber in den Kommentaren.



All Articles