Konvertieren Sie das Image einer Partition in ein Image einer Festplatte mit Partitionstabelle

20

Ich habe ein Image einer vorhandenen Partition mit erzeugt dd if=/dev/sdXN of=image.bin. Jetzt möchte ich dieses Image als Basis für eine virtuelle Maschine verwenden. Ich kann das Bild in ein Format umwandeln, das VirtualBox verwenden kann.

Das Problem ist, dass das "Festplatten" -Image wirklich nur das Image einer Partition ist und daher keinen MBR oder keine Partitionstabelle enthält. Dies macht es sehr schwer, die VM zu starten.

Gibt es eine einfache Möglichkeit, bei einem bestimmten Image einer Partition ein korrektes Festplatten-Image einschließlich einer Partitionstabelle zu erstellen?

Mika Fischer
quelle

Antworten:

13

Sie können dies auf dem Hostcomputer tun. Die meisten Tools wie fdiskkönnen Dateien verarbeiten und ermöglichen kpartxden Zugriff auf Partitionen in einer Datei.

  1. Erstellen Sie ein neues leeres 100-GB-Sparse-Image (etwas größer als das Partitions-Image).

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Partitionieren Sie die Image-Datei mit fdisk

    fdisk myvm.img
    
  3. Stellen Sie die Partitionen in der Image-Datei für einzelne Geräte zur Verfügung

    sudo kpartx -a myvm.img
    
  4. Kopieren Sie das Partitionsimage in die Partition

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Erweitern Sie das Dateisystem, um die gesamte Partition zu füllen

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Schließen Sie die Partitionen

    sudo kpartx -d myvm.img
    
  7. Demontieren Sie das Loopback-Gerät

    sudo losetup -D
    
mgorven
quelle
Würde dies nicht dazu führen, dass die erstellte Partition im Image nicht mit der Länge der abgebildeten Partition übereinstimmt? Und gibt es eine Möglichkeit, das zu lösen? Und kann ein "schlauer" Dateisystemmanager feststellen, dass er nicht die gesamte Partitionsgröße verwendet und sich selbst entsprechend erweitert?
Killermist
@killermist Aktualisierte Antwort.
mgorven
Das ist eine gute Antwort. Wissen Sie, wie Sie vermeiden können, dass das Ganze dabei kopiert wird?
Mika Fischer
@MikaFischer Leider nicht, da die Partitionstabelle vor der Partition vorhanden sein muss und ich keinen Mechanismus zum Voranstellen von Daten in eine Datei kenne.
mgorven
Ich denke, Haruns Antwort ist besser, weil es einfach zu machen ist und man Skripte schreiben kann.
Philcolbourn
9

Ich bin sicher, das ursprüngliche Problem wurde vor langer Zeit gelöst, aber für alle mit einem ähnlichen Problem:

Eine Möglichkeit, das Kopieren des gesamten Abbilds zu vermeiden, besteht darin, ein Abbild im .vmdk-Format zu erstellen, das auf separate Extent-Dateien für die Partitionstabelle und den Partitionsinhalt verweist.

Ich habe dieses Snippet in einer .vmdk-Datei aus einem Test, den ich vor einiger Zeit durchgeführt habe:

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

Dies bedeutet, dass die 63 Sektoren ab Offset 0 aus der Raw-Datei "parttable.bin" gelesen werden, Sektor 63 und höher jedoch aus dem Raw-Partitions-Dump "partition-image.bin". (Ersetzen Sie 63 natürlich durch den tatsächlichen Versatz zur ersten Partition, normalerweise 2048 in diesen Tagen).

Das Endergebnis ist, dass Sie in VBox die Partitionstabelle an die Vorderseite des Partitionsabbilds vorangestellt haben, ohne den langwierigen Kopiervorgang ausführen zu müssen.

Partitionieren Sie das Laufwerk von der VM aus. Wenn Sie die richtigen Offsets erzielen, sollte der Inhalt Ihres Partitionsimages in der neu erstellten Partition angezeigt werden.

Harun
quelle
2
Ich denke, die '63' in der zweiten Zeile muss 0 sein, wenn partition-image.bin ein Partitionsimage ist. Ich habe gerade so etwas gemacht und ich musste diesen Offset in der Partitions-Image-Datei auf Null setzen. philatwarrimoo.blogspot.com.au/2014/01/…
Philcolbourn
Genius. Ich hatte gerade dies zu tun , um eine Windows - Partition für eine VM auf einer Linux - Host zu verwenden, und das ist das einzige , was gearbeitet, die Schritte von @philcolbourn mit: superuser.com/a/804396/93066
bmaupin
Was sollte in der restlichen vmdk-Datei stehen?
gozzilli
1
@gozzilli Der Rest der Datei besteht aus einer Reihe von Details wie Dateiversionsnummern, Datenträgeradaptertyp, UUIDs und Datenträgergeometrie. Ich weiß nicht, wie ich diese Teile schreiben soll. Ich würde nur empfehlen, ein Tool zu verwenden, um ein vmdk zu erstellen, das auf das Festplatten-Image zeigt, und dann nur die Zeilen zu ändern, die beschreiben, woher der zusätzliche Partitions-Header stammt.
Harun
3

Interessantes Problem. Folgendes würde ich tun:

  1. Erstellen Sie die VM mit einer entsprechend großen Festplatte und starten Sie sie von einer Wiederherstellungs-CD.
  2. Erhalten Sie irgendwie Zugriff auf Ihr vorhandenes Disk-Image (nfs, cifs usw.).
  3. Erstellen Sie die benötigten Partitionen auf der lokalen Festplatte der VM.
  4. Verwenden Sie dd, um das Partitionsimage in die Partition auf der VM-Festplatte zu schreiben.

Danach müssen Sie Ihren Bootloader aktualisieren. Angenommen, Sie verwenden GRUB, hängen Sie die neu geschriebene Partition ein, chrooten Sie sie und führen update-grubSie sie aus.

Viel Glück!

Bahamat
quelle
2

Sie können die Größe des Dateisystems mit GParted ändern.

Erstellen Sie das Testbild:

dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs

Ich verwende resize2fs nicht, weil es die Größe der Datei ändert, anstatt freien Speicherplatz zu lassen.

sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0

Kostenlose 1 MB am Anfang.

sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0

Erstellen Sie abschließend die Partitionstabelle.

fdisk extfs

Stellen Sie den ersten Sektor auf 2048 ein (2048 Sektoren * 512 B / Sektor = 1 MB), den letzten Sektor als Standard (dh Bildende).

ignis
quelle
1

Ich persönlich bevorzuge das Anhängen mit dd.

Ich gehe hier von 512-Byte-Sektoren aus. Es kann ein Fall für 2048-Byte-Sektoren geben, also tauschen Sie einfach die Zahlen ein und rechnen Sie nach.

In jedem Fall verwende ich eine 512-MB-Testdatei, zum Beispiel:

dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img

MBR

Bild erstellen

Ich persönlich bevorzuge es, die ersten MB (2048 Sektoren) an den Anfang anzuhängen:

dd if=testfs.img skip=2048 bs=512 of=full.img

Führen Sie schließlich fdisk aus, um die Partitionstabelle zu erstellen (oder kopieren Sie sie in Ihre eigene). Ich habe 1 Partition mit Standardwerten erstellt.

Überprüfung

Erstellen Sie zur Überprüfung Schleifenpartitionen und führen Sie eine automatische Erkennung durch:

sudo losetup -fP full.img

Führen Sie fileauf dem resultierenden partitionierten Loopback-Gerät Folgendes aus:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

Bild erstellen

Ich persönlich bevorzuge es, das erste MB (2048 Sektoren, da die Gdisk standardmäßig auf diese Zahl eingestellt ist, da es 1 MB ausgerichtet ist) an den Anfang für den Anfangs-MBR und 34 Sektoren an das Ende (oder 2048 für ein volles MB) für das Ende anzuhängen GPT (Endsektor kann unterschiedlich sein). Wenn Sie das Ende von GPT auslassen, gehen möglicherweise Daten verloren:

dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

Führen Sie schließlich gdisk aus, um die Partitionstabelle zu erstellen (oder kopieren Sie sie in Ihre eigene). Ich habe 1 Partition mit Standardwerten erstellt.

Überprüfung

Erstellen Sie zur Überprüfung Schleifenpartitionen und führen Sie eine automatische Erkennung durch:

sudo losetup -fP full.img

Führen Sie fileauf dem resultierenden partitionierten Loopback-Gerät Folgendes aus:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files) Diese Methode verhindert das Erraten, Ändern der Größe oder manuelle Ausrichten.

Dan Dart
quelle
Wie finden Sie den Endsektor des Bildes in gpt
Anwar
Wenn ich das laufen lasse, habe sudo file -s /dev/loop11p1ich /dev/loop11p1: data. Welches war zuvor ein ext4-Dateisystem. Und das resultierende full.img ist kleiner. Ich denke, Sie haben die Lösung umgekehrt.
Anwar,
Ich denke du meinst seek=2048in diesem Befehl dd if = testfs.img skip = 2048 bs = 512 of = full.img
Anwar