Website-Suche

So ändern Sie die Größe eines qcow2-Disk-Images unter Linux


Qcow2 ist das standardmäßige Speicherformat für virtuelle Festplatten, das von Qemu verwendet wird (qcow steht für qemu copy-on-write). Dieses Imageformat verwendet Thin Provisioning, d. h., nachdem wir die maximale virtuelle Größe eines Datenträgers festgelegt haben, wird der Speicherplatz nur bei Verwendung zugewiesen, aber nicht wieder für den Host zur Verfügung gestellt, wenn er freigegeben wird. In diesem Artikel sehen wir, wie man ein qcow2-Disk-Image "sparsifiziert", um verfügbaren Speicherplatz freizugeben, wie man es erweitert oder verkleinert und wie man das Layout der Partitionen vom Host-System aus verwaltet, indem man es mit dem NBD-Protokoll verbindet.

In diesem Tutorial lernen Sie:

  • Was ist Thin-Provisioning?
  • So gewinnen Sie ungenutzten Speicherplatz von einem qcow2-Image zurück, das Thin-Provisioning verwendet
  • Was ist das NBD-Protokoll?
  • So verbinden Sie ein qcow2-Disk-Image mit dem Host-System über das NBD-Protokoll
  • So erweitern Sie ein qcow2-Image
  • So verkleinern Sie ein qcow2-Image

Freigeben von ungenutztem Speicherplatz aus einem qcow2-Image

Wie wir bereits sagten, sind qcow2-Images standardmäßig dünn provisioniert. Das bedeutet, dass wir bei der Erstellung eine maximale virtuelle Größe angeben, aber nur der tatsächlich auf dem Disk-Image verwendete Speicherplatz vom verfügbaren Speicherplatz auf dem Host abgezogen wird. Lassen Sie uns das überprüfen. Auf meinem System habe ich mit virt-install eine virtuelle Maschine erstellt und eine virtuelle Festplattengröße von 20 GiB angegeben. Der Datenträger hat den Namen disk.qcow2. Wir können seine Größe mit dem Befehl ls überprüfen:

ls -lh disk.qcow2
-rw-------. 1 egdoc egdoc 21G Mar 2 10:10 disk.qcow2

Im obigen Beispiel haben wir ls mit der Option -l aufgerufen, um eine ausführliche Ausgabe zu erhalten, und mit -h, um eine für Menschen lesbare Größe zu erhalten (die Größe wird gerundet). Der Befehl ls versteht Thin-Provisioning nicht, daher wird die maximale Größe des Images angegeben. Wenn wir den tatsächlich vom Disk-Image belegten Speicherplatz mit einem Tool überprüfen, das Thin-Provisioning-fähig ist, wie du, erhalten wir ein anderes Ergebnis:

du -h disk.qcow2 
1.4G disk.qcow2

Wie Sie sehen können, meldet die Ausgabe einen tatsächlich genutzten Speicherplatz von 1,4 GB. Informationen über ein qcow2-Disk-Image können auch bequem mit dem Dienstprogramm qemu-img abgerufen werden, indem der Befehl info ausgeführt wird (nur wenn die Disk nicht verwendet wird):

qemu-img info disk.qcow2
image: disk.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 1.32 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: true
refcount bits: 16
corrupt: false
extended l2: false

In der Ausgabe des Befehls können wir deutlich den Unterschied zwischen der virtuellen Größe der Festplatte (20 GiB) und der tatsächlichen Festplattengröße (1,32 GiB) sehen.

Wie bereits erwähnt, hat Thin-Provisioning den Vorteil, dass der Host-Speicherplatz nur dann verwendet wird, wenn er tatsächlich verwendet wird. Um dies zu überprüfen, erstellen wir eine Dummy-Datei auf dem Disk-Image vom Gastsystem:

[egdoc@virtualmachine]$ dd if=/dev/urandom of=dummyfile bs=1M count=2048

Oben haben wir dd mit /dev/urandom als Quelle und Dummyfile als Ziel ausgeführt und 2048 Blöcke von 1MiB geschrieben, um eine 2GiB-Datei zu erstellen. Wenn wir das Disk-Image erneut überprüfen, können wir sehen, dass seine tatsächliche Größe jetzt größer ist:

qemu-img info disk.qcow2 
image: disk.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 3.32 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: true
refcount bits: 16
corrupt: false
extended l2: false

Der Platz wird nur beansprucht, wenn er vom Gast genutzt wird. Dies funktioniert jedoch nur auf eine Weise: Wenn Speicherplatz auf dem Disk-Image freigegeben wird, wird er nicht für den Host-Rechner "freigegeben". Wir können dies leicht überprüfen, indem wir die Dummydatei entfernen:

[egdoc@virtualmachine]$ rm dummyfile

Wenn wir das Disk-Image erneut überprüfen, können wir feststellen, dass sich nichts geändert hat, der Speicherplatz wird immer noch beansprucht:

qemu-img info disk.qcow2
image: disk.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 3.32 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false

Wie können wir den Platz auf dem Host wieder verfügbar machen? Um eine solche Aufgabe zu erfüllen, können wir das Dienstprogramm virt-sparsify verwenden, das Teil der libguests-tools ist:

virt-sparsify --in-place disk.qcow2

Wir haben den Befehl mit der Option --inplace aufgerufen: Dadurch findet der Vorgang statt, ohne dass eine Kopie des Disk-Images erstellt werden muss. Hier ist die Befehlsausgabe:

◓ 25% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒═════════════════════════════════════════════════⟧ --:--
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[  18.4] Trimming /dev/sda1
[  18.5] Trimming /dev/sda2
[  19.4] Sparsify in-place operation completed with no errors

Eine sehr wichtige Sache, die Sie beachten sollten, ist, dass wir vor dem Ausführen des obigen Befehls das Gastsystem, das die Festplatte verwendet, herunterfahren müssen, um mögliche Beschädigungen zu vermeiden. Nachdem die Operation "sparsifizieren" stattgefunden hat, können wir den vom Disk-Image belegten Speicherplatz erneut überprüfen und feststellen, dass er reduziert wurde:

qemu-img info disk.qcow2 
image: disk.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 1.32 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false

Das Dienstprogramm virt-sparsify ist, wie wir gerade gesehen haben, das, was wir verwenden möchten, wenn wir es mit einem qcow2-Image zu tun haben, das standardmäßig Thin-Provisioning verwendet, und wir den Speicherplatz, der zuvor auf dem Disk-Image zugewiesen und jetzt nicht mehr verwendet wird, wieder auf dem Host verfügbar machen möchten. Wenn wir die virtuelle Größe des Disk-Images ändern möchten (die wir bei der Erstellung der virtuellen Maschine deklariert haben), müssen wir stattdessen eine andere Strategie verwenden. Mal sehen, wie es weitergeht.

Erweitern der virtuellen Größe eines Datenträgers mit qemu-img

Oben haben wir gesehen, wie man ungenutzten Speicherplatz von einem qcow2-Disk-Image mit dem Befehl virt-sparsify zurückgewinnen kann. In bestimmten Situationen kann es sinnvoll sein, stattdessen die virtuelle Größe des Disk-Images zu ändern, also entweder zu erweitern oder zu verkleinern. Beide Operationen sind recht einfach; Beginnen wir mit ersterem.

Die einfachste Methode, die wir verwenden können, um die virtuelle Größe eines qcow2-Disk-Images zu erweitern, ist die Verwendung von qemu-img und dem Befehl resize. Alles, was wir tun müssen, ist, den Pfad der Festplatte und die neue absolute Größe (oder das Größeninkrement) als Argumente anzugeben. Die aktuelle virtuelle Festplattengröße beträgt, wie wir gesehen haben, 20 GiB. Angenommen, wir möchten es auf 30 GiB erweitern, würden wir wie folgt vorgehen. Als erstes würden wir ein Backup der aktuellen Festplatte erstellen, nur für den Fall, dass etwas schief geht:

cp disk.qcow2 disk.bk.qcow2

Um das Bild zu vergrößern, führen wir dann den folgenden Befehl aus:

qemu-img resize disk.qcow2 30G

Alternativ können wir anstelle der endgültigen, absoluten Größe das Größeninkrement angeben:

qemu-img resize disk.qcow2 +10G

Sobald der zusätzliche Speicherplatz zum Disk-Image hinzugefügt wurde, müssen wir die Partitionen und Dateisysteme so vergrößern, dass sie ihn nutzen. Wie wir dabei vorgehen, hängt davon ab, welche Partition/welches Dateisystem wir vergrößern möchten. Um beispielsweise die letzte vorhandene Partition auf der Festplatte zu vergrößern, können wir einfach ein Partitionierungstool vom Gastsystem verwenden, während es läuft. Für andere, komplexere Operationen müssen wir eine andere Strategie anwenden: Herunterfahren des Gastsystems und Ändern der Festplatte mit einem "externen" Tool.

Ändern von Partitionen eines Disk-Images mit NBD

Einige Änderungen am Disk-Image-Layout können nicht von einem laufenden System aus vorgenommen werden: Wir können beispielsweise keine Partitionen verkleinern oder verschieben, wenn sie gemountet sind. In solchen Fällen müssen wir das Disk-Image vom Host-System ändern. Wir können dies erreichen, indem wir das NBD-Protokoll verwenden, um das Disk-Image mit dem Host-System zu verbinden.

Nbd steht für Network Block Device: Es ist ein Protokoll, das es einer Maschine ermöglicht, auf ein Blockgerät zuzugreifen, das an eine andere Maschine angeschlossen ist. Unter Linux wird diese Funktionalität durch das nbd-Modul implementiert, das geladen werden muss:

sudo modprobe nbd max_part=10

In diesem Fall haben wir das Modul mit der Option max_part geladen, um die maximale Anzahl von Partitionen für das Gerät anzugeben. Sobald das Modul geladen ist, führen wir den folgenden Befehl aus, um das Disk-Image tatsächlich zu mounten:

sudo qemu-nbd -c /dev/nbd0 disk.qcow2

Der Befehl qemu-nbddient zum Exportieren eines QEMU-Disk-Images unter Verwendung des NBD-Protokolls. Im obigen Beispiel haben wir mit der Option -c den Dateinamen (in diesem Fall /dev/nbd0) mit dem angegebenen Gerät verbunden: disk.qcow2. Sobald die Festplatte angeschlossen ist, können wir unser bevorzugtes Partitionierungstool verwenden, um das Layout zu ändern (denken Sie daran, das Gastsystem herunterzufahren, bevor Sie Änderungen vornehmen!). Für dieses Tutorial werden wir gparted verwenden:

gparted /dev/nbd0

Das Layout der Festplattenpartition wird wie bei jedem anderen Blockgerät angezeigt:

Im Bild oben sehen wir deutlich die noch ungenutzten 10 Gib Speicherplatz, die wir zuvor auf die Festplatte geladen haben.

Verkleinern eines qcow2-Bildes

Um die virtuelle Größe eines qcow2-Disk-Images zu reduzieren, müssen wir zuerst die Größe der Partitionen und des Dateisystems darauf reduzieren. Wir müssen auf diese Weise vorgehen, da alle Daten in dem Bereich, die durch den Verkleinerungsvorgang entfernt werden, verloren gehen.

Angenommen, wir haben es mit unserem Originalbild zu tun, das eine virtuelle Größe von 20 GiB hatte, und wir möchten seine Größe auf 10 GiB reduzieren. Zuerst stellen wir sicher, dass das Gastsystem ausgeschaltet ist, dann, wie in den vorherigen Beispielen, schließen wir die Festplatte an und verwenden unser bevorzugtes Partitionierungstool darauf.

In diesem Fall müssen wir, bevor wir das Image verkleinern, die Größe der /dev/nbd0p2-Partition reduzieren. Wir möchten das Disk-Image um 10 GiB reduzieren, daher werden wir als Sicherheitsmaßnahme, um sicherzustellen, dass die Daten nicht abgeschnitten werden, die Partitionsgröße auf 8 GiB reduzieren (wir können die Partition später problemlos vom Gastsystem aus wieder erweitern). Hier ist das Festplattenlayout, nachdem der Vorgang ausgeführt wurde:

Nachdem wir die Größe der Partition geändert haben, können wir das Partitionierungsprogramm schließen und die Festplatte trennen. Um dies zu tun, verwenden wir wieder qemu-nbd. Dieses Mal rufen wir es mit der Option -d auf, die den Pfad des zu trennenden Geräts als Argument annimmt:

sudo qemu-nbd -d /dev/nbd0

Zum Schluss können wir das Bild verkleinern:

qemu-img resize disk.qcow2 --shrink -10G

Wir haben qemu-img genauso aufgerufen, wie wir es beim Erweitern des Bildes getan haben, aber dieses Mal haben wir die -10G-Notation verwendet, um anzugeben, dass wir diese Menge an Raum subtrahieren möchten. Wir haben auch die Option --shrink verwendet: Dies ist notwendig, um den Vorgang zu bestätigen, da er potenziell gefährlich ist (wie wir bereits sagten, gehen die auf dem entfernten Speicherplatz vorhandenen Daten verloren).

Wenn wir den Befehl qemu-img info verwenden, können wir sehen, dass die virtuelle Größe des Disk-Images jetzt 10G beträgt:

qemu-img info disk.qcow2
image: disk.qcow2
file format: qcow2
virtual size: 10 GiB (10737418240 bytes)
disk size: 1.32 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false

Um sicherzugehen, dass alles in Ordnung ist, können wir nun das Gastsystem booten, es sollten keine Fehler gemeldet werden.

Schlüsse

Qcow2-Disk-Images verwenden standardmäßig Thin-Provisioning, d. h. Speicherplatz wird nur zugewiesen, wenn er tatsächlich von einem Gastsystem verwendet wird, aber nicht wieder "freigegeben", wenn er freigegeben wird. In diesem Artikel haben wir gesehen, wie man ein qcow2-Image "sparsifiziert", um den ungenutzten Speicherplatz auf dem virtuellen Disk-Image auf dem Host-System wieder verfügbar zu machen, und wir haben gelernt, wie man ein qcow2-Image erweitert oder verkleinert. Dabei haben wir gesehen, wie es möglich ist, das Disk-Image mit dem Host-System zu verbinden, indem das NBD-Protokoll unter Linux verwendet wird.

Verwandte Artikel: