Wie kann ich die mit dd erstellte img-Datei vergrößern?

39589
A_Porcupine

Ich habe ein DD-Image von einer 4-GB-SD-Karte mit zwei Partitionen. Diese beiden Partitionen belegen nur etwa 800 MB. Daher möchte ich die Größe des Img-Fensters verringern.

Kennt jemand eine Möglichkeit, den "freien Speicherplatz" aus der img-Datei zu entfernen?

16
Sie können hinzufügen, was das gewünschte Ergebnis ist. dh: Bild zurück auf die Karte, um es auf CD zu speichern. Wayne vor 10 Jahren 0

3 Antworten auf die Frage

17
Serge Wagner

Die Verwendung resize2fsist viel einfacher

resize2fs -M xxx.img 

Sie werden zuerst nach e2fsck gefragt - also:

e2fsck -f -y xxx.img 

(Bild darf NICHT montiert werden!)

Hinweis: Dies funktioniert nur, wenn das Image aus einer einzelnen Partition besteht, wenn es sich um ein gesamtes Blockgerät mit mehreren Partitionen handelt. Siehe Antwort oben ...

Nur eine Anmerkung: Verwenden Sie für mehrere Partitionen `losetup --find --partscan xxx.img`, um die Image-Datei als Loop-Gerät einzurichten. Führen Sie dann 'lsblk' aus, um die Partitionen des Loop-Geräts zu finden. Yihui Xiong vor 5 Jahren 0
5
grawity

Stellen Sie zunächst sicher, dass der freie Speicherplatz tatsächlich leer ist und keine Reste gelöschter Dateien enthält. Dies erreichen Sie am einfachsten, indem Sie auf dem Datenträger eine große Datei erstellen, die nur null Byte enthält, und diese dann löschen.

# losetup --find --partscan foo.img # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 4096M 0 loop  ├─loop0p1 259:0 0 2048M 0 loop  └─loop0p2 259:1 0 2048M 0 loop  # for part in /dev/loop0p*; do mount $part /mnt dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M rm /mnt/filler umount /mnt done dd: error writing ‘/mnt/filler’: No space left on device dd: error writing ‘/mnt/filler’: No space left on device # losetup --detach /dev/loop0 

Dann komprimieren Sie es mit einem Werkzeug wie gzipoder xz. Selbst bei niedrigsten Komprimierungsgraden wird eine lange Reihe von Nullen gut komprimiert:

# ls -s 4096M foo.img # gzip foo.img # ls -s 11M foo.img.gz 

Beachten Sie, dass Sie das Image dekomprimieren müssen, wenn Sie es auf die Festplatte zurückschreiben. Dies wird es "live" dekomprimieren:

# cat foo.img.gz | gunzip | dd of=/dev/sda 

Beachten Sie, dass das Ausgabegerät (sda) muss ausreichend groß sein, die passen Originalbild, andernfalls Daten verloren gehen oder beschädigt werden.


Wenn Sie das Abbild weiterhin verwenden möchten, z. B. bei einer virtuellen Maschine, können Sie das Rohabbild in eines der von der Virtualisierungssoftware verwendeten Abbildformate konvertieren. B. qcow2 für Qemu, VDI für VirtualBox oder VMDK für VMware.

Beachten Sie, dass Sie das Bild immer noch vorbereiten müssen, indem Sie den freien Speicherplatz mit der oben beschriebenen Methode reinigen.

# qemu-img convert -f raw -O qcow2 foo.img foo.qcow  # qemu-img convert -f raw -O vmdk foo.img foo.vmdk 

Wenn es jedoch wieder auf eine echte Festplatte geschrieben wird, müssen Sie es wieder in ein Roh-Image konvertieren.

Wie können Sie sicher sein, dass alle Dateien, die derzeit auf den Partitionen gespeichert sind, nicht physisch auf dem Datenträger verstreut sind? Valerio Santinelli vor 9 Jahren 1
Ich nehme an, dass Dateien nicht sequentiell auf die Festplatte geschrieben werden. Wenn sich eine Datei am Ende des Speichers befindet und ich die Größe verkleinere, verliere ich den Inhalt dieser Datei. Valerio Santinelli vor 9 Jahren 0
Weil das OP fragt, wie man ein Festplatten-Image verkleinern kann, ohne Daten zu verlieren. Wenn Sie ein Bild auf eine bestimmte Größe abschneiden, können Sie nicht sicher sein, dass die Daten erhalten bleiben. Valerio Santinelli vor 9 Jahren 0
@ValerioSantinelli: Wo genau schlage ich vor, das Bild abzuschneiden? grawity vor 9 Jahren 0
Mein schlechtes, ich dachte, dass der Teil, wo Sie die Katze foo.img.gz | gunzip | dd of = / dev / sda sollte auf ein kleineres Speichergerät zurückschreiben. Ich habe es wahrscheinlich falsch verstanden. Mein Punkt bleibt jedoch: Wenn ich die Größe eines Bildes auf ein kleineres Speichergerät reduzieren möchte, wie kann ich das tun und sicher sein, dass die Dateien nicht abgeschnitten werden? Valerio Santinelli vor 9 Jahren 0
@ValerioSantinelli: Wenn Sie das entsprechende Dateisystem-Größenänderungs-Tool für Ihr Dateisystem verwenden, z. B. `resize2fs` oder` ntfsresize` (Linux hat kein Tool für FAT), können Sie _or_ vor dem Schreiben auf das kleinere Gerät erstellen, indem Sie ein neues Dateisystem erstellen und einfach kopieren die Dateien. grawity vor 9 Jahren 1
0
Phil Roggenbuck

Ich habe es auch mit qemu-img ausprobiert, und es funktionierte wie ein Zauber:

qemu-img resize test.img 2G 

Wir ändern die Größe test.imgin 2G (2GB).

Arbeitete einwandfrei für mich.