Nehmen wir an, ich habe linux-vm-image.raw
eine Größe von 10 GB. Darin befindet sich eine primäre etx4
Partition (kein LVM verwendet), die sich über das gesamte Volumen erstreckt (klassische MS-DOS-ähnliche Partitionstabelle verwendet, kein GPT). Und die tatsächliche Datenmenge, die dieser Partition zugewiesen ist, beträgt beispielsweise 3 GB.
Dieses Image ist für die Verwendung in einer Virtualisierungsumgebung (in meinem Fall kvm+OpenStack) vorbereitet, und jede aus diesem Image erstellte VM würde sich je nach Benutzerauswahl selbst auf die Größe der Ziel-Virtual-Disk anpassen. Es gibt also keinen Grund, freien Speicherplatz innerhalb dieses Disk-Images zu behalten.
Wie kann ich die Größe dieses Roh-Disk-Images auf ein Minimum reduzieren (von 10 GB auf ca. 3 GB)?
Es gibtmanche Anweisungenfür qcow2
Disk-Images, aber ich muss raw
nur Images verwenden – nicht qcow
, nicht OVF
und nicht andere.
Ich vermute so etwas wie
- Mounten Sie dieses Image irgendwo als Blockgerät
- Führen Sie einige Wartungsarbeiten durch, um alle Dateien innerhalb der ext4-Partition an den „Anfang“ der Partition zu verschieben. Mit anderen Worten: Führen Sie eine Defragmentierung des freien Speicherplatzes durch.
- Bild aushängen
- Minimieren Sie die Größe des Dateisystems im Image (um es an die Größe der darin enthaltenen Daten anzupassen)
- Minimieren Sie die Größe des Bildes (um es an die Größe des darin enthaltenen Dateisystems anzupassen)
- Aktualisieren Sie die Partitionstabelle im Image, damit sie der neuen Partitionsgröße entspricht
Aber versuche ich nicht, ein Fahrrad zu erfinden? Gibt es einen einzeiligen Befehl oder eine spezielle Software, mit der ich das tun kann, was ich will?
Antwort1
Die Größe von Rohbildern lässt sich nicht wirklich ändern. Sie können es jedoch zerofree
auf einem (nicht gemounteten) Dateisystem versuchen und dann die resultierende Bilddatei komprimieren.
Überprüfen Sie außerdem, ob Ihre Zielumgebung das OVF-Containerformat unterstützt, das komprimierte Disk-Images ermöglicht. (Zerofree gilt weiterhin).
Antwort2
Sie sind auf dem richtigen Weg. Wenn Sie es als Blockgerät mounten können (Loop-Mount), können Sie gparted wahrscheinlich dazu bringen, darauf zu arbeiten.
gparted erledigt den Großteil Ihrer Aufgaben:
1. FS-Daten an den Anfang der Partition verschieben (FS verkleinern)
2. Partition verkleinern und Partitionstabelle anpassen
3. Möglicherweise kann es Ihnen sogar die verbleibende „Festplattengröße“ mitteilen, wenn Sie die aktualisierte Partitionstabelle ausdrucken lassen (z. B. letzter Sektor der letzten Partition usw.).
Das ist der schwierige Teil. Danach müssen Sie es aushängen. Möglicherweise müssen Sie die genaue Größe Ihrer „Festplatte“ manuell berechnen, aber danach sollte ein einfaches Abschneiden der Datei ausreichen.
UPDATE: Wenn Ihre Partitionstabelle vom Typ MBR ist, ist alles in Ordnung. Bei GPT befindet sich am Ende der Festplatte eine Spiegelkopie. Seien Sie also vorsichtig, da gparted dafür möglicherweise nicht intelligent genug ist (es sei denn, Sie können ihm das Rohbild direkt geben). Wenn Sie Probleme haben, ziehen Sie gdisk als Schritt nach dem Truncate in Betracht. Truncate mit ein paar zusätzlichen Blöcken und lasse gdisk/equiv die Spiegelkopie neu erstellen (wahrscheinlich muss die Schleife ein zweites Mal gemountet werden).