So kopieren Sie das Partitionslayout einer gesamten Festplatte mit Standardtools

81

Ich möchte eine Sicherung der gesamten Partition nehmen Layout einer Festplatte, einschließlich logische Laufwerke, so dass ich das Layout auf einen anderen Datenträger wiederherstellen. Ich möchte nicht den Inhalt der Partitionen kopieren, sondern nur das Layout. Für die primäre und erweiterte Partition ist es einfach:

dd if=/dev/sda of=partitiontable.bin bs=1 skip=446 count=64 # backup
dd if=partitiontable.bin of=/dev/sda bs=1 seek=446 count=64 # restore

Aber wenn es um das Layout der logischen Partitionen geht, frage ich mich, ob es unter den Standardwerkzeugen eine ähnliche Möglichkeit zum Speichern des Layouts gibt. Ich denke, das Hauptproblem besteht darin, die Offsets zu den Standorten der EBRs zu finden, denn damit ddwird der Rest erledigt . Denken Sie daran, ich muss in der Lage sein, alles auf eine (möglicherweise) leere Festplatte zurückzusetzen und dadurch das gleiche Layout wiederherzustellen. Das Verwenden von Partitionierungswerkzeugen wie fdiskoder partedist in Ordnung, aber ich muss in der Lage sein, deren Verwendung (Skripten) zu automatisieren, und sie sollten nicht von X-bezogenen Paketen abhängig sein - nur von der Befehlszeile.

Mein Backup-Plan sieht dies manuell in einem kleinen Python-Skript unter Verwendung des struct-Moduls vor, aber ich hatte eher gehofft, dass es einen einfacheren Weg gibt.

Lauritz V. Thaulow
quelle

Antworten:

89

Sie können sfdisk für diese Aufgabe verwenden.

Sparen:

sfdisk -d /dev/sda > part_table

Wiederherstellen:

sfdisk /dev/sda < part_table

Für GPT-Partitionstabellen ist dies sfdiskab util-linux 2.26 oder höher erforderlich . Es wurde von Grund auf neu auf libfdisk geschrieben .

Dadurch werden die UUIDs nicht generiert, sondern unverändert kopiert. Die neue Festplatte ist also ein Klon der ursprünglichen, nicht nur eine andere Festplatte mit demselben Layout. Beachten Sie, dass Linux die /dev/disk/by-uuid/Dateisystem-UUIDs betrachtet, nicht jedoch die UUIDs in der Partitionstabelle. sfdiskgeneriert neue UUIDs, wenn Sie die UUIDs aus dem Speicherauszug herausschneiden (pro Partition und die UUID für die Partitionstabelle selbst am Anfang der Datei).

Petr Uzel
quelle
1
Ich weiß es nicht genau, aber die einzige Grenze, die mir einfällt, ist die 2-TB-Größenbeschränkung für Partitionen, die durch das Partitionstabellenschema von msdos auferlegt wird. Um dieses Limit zu überschreiten, kann stattdessen GPT verwendet werden, aber AFAIK sfdisk kann nicht mit GPT arbeiten. Ich weiß nicht, ob es ein anderes Limit gibt oder ob sfdisk meldet, wenn es nicht klappt.
Petr Uzel
2
sfdiskFunktioniert nicht mit großen Volumes oder unterstützt GPT.
dhchdhd
1
@Barry und wenn Sie "groß" sagen, beziehen Sie sich auf die 2-TB-Grenze, von der @Petr spricht?
Lauritz V. Thaulow
5
Der richtige Weg ist: sudo parted / dev / sda -lm> sda.parted
dhchdhd
1
Manchmal ist es nützlich, nur DOS-Probleme zu ignorieren und die Option -L oder --linux hinzuzufügen :sfdisk -L /dev/sda < part_table
Diego
50

Es hängt davon ab , ob Ihr Quelldatenträger ein verwendet MBR (auch bekannt als „dos“ oder „MS - DOS“) oder eine GPT (auch bekannt als „GUID“) Partitionstabelle.

Festplatten mit mehr als 2 TB können MBR nicht verwenden, daher handelt es sich um GPT.

Datenträger mit weniger als 2 TB können beide Datenträger verwenden. Sie müssen also zuerst herausfinden, um welche es sich handelt.

Angenommen, Sie arbeiten unter Linux, verwenden Sie einen dieser Befehle, um herauszufinden, welche Partitionstabelle Ihre Quellfestplatte verwendet:

disk=/dev/sda

# Always available, but old versions may not recognize gpt
fdisk -l $disk | grep type

# `apt-get install gdisk` or equivalent on non-Debian systems
gdisk -l $disk | grep -A4 'scan'

# `apt-get install parted`
parted $disk print | grep Table

Gegeben

source=/dev/sda
dest=/dev/sdb

Für MBR-Festplatten

benutze sfdiskwie in Petr Uzels Antwort vorgeschlagen, oder diese Variante:

# Save MBR disks
sfdisk -d $source > /partitions-backup-$(basename $source).sfdisk
sfdisk -d $dest   > /partitions-backup-$(basename $dest).sfdisk

# Copy $source layout to $dest
sfdisk -d $source | sfdisk $dest

Für GPT-Festplatten

Die richtige Antwort wurde hier und hier von Kris Harper gegeben .

Du brauchst GPT fdisk . Schau auf die Downloadseite oder starte sudo apt-get install gdisk.

Verwenden Sie dann den Befehl sgdisk :

# Save MBR disks
sgdisk --backup=/partitions-backup-$(basename $source).sgdisk $source
sgdisk --backup=/partitions-backup-$(basename $dest).sgdisk $dest

# Copy $source layout to $dest and regenerate GUIDs
sgdisk --replicate=$dest $source
sgdisk -G $dest

Mit dem letzten Befehl werden die GUID auf der Festplatte und alle Partitionen nach dem Zufallsprinzip sortiert. Dies ist nur erforderlich, wenn die Datenträger auf demselben Computer verwendet werden sollen, andernfalls ist dies nicht erforderlich.

mivk
quelle
10
Ich habe immer Angst, die beiden Parameter zu mischen. Ein guter Trick ist es --backup=File, eine Partitionstabelle vom Quelllaufwerk zu exportieren und --load-backup=Fileauf dem Ziellaufwerk wiederherzustellen.
Zidarsk8
Besteht ein Risiko für die vorhandenen Daten auf den Datenträgern und nachfolgenden Partitionen, wenn Sie die Partitionstabelle verschieben und dann die GUID der Datenträger und Partitionen wie oben beschrieben zufällig anordnen? Vielen Dank!
EngBIRD
@EngBIRD: Solange Sie $ source und $ dest nicht verwechseln, besteht kein Datenrisiko, da sich keine Daten auf dem Ziel befinden. Sie kopieren nur das Partitionslayout und müssen die Daten anschließend noch formatieren und kopieren.
22.
Der Grund, warum ich gefragt habe, ist, dass ich nicht von einer leeren Festplatte aus beginne, sondern zwei Festplatten
vertausche
5

Ältere, aber immer noch interessante Pyparted- und Python-Lvm- Bindungen.

Aktualisieren:

Das Vorherige wurde veröffentlicht, weil das Obige in vielen modernen Situationen nicht funktioniert, wie in der Manpage von sfdisk angegeben.

sfdisk versteht die GUID-Partitionstabelle (GPT) nicht und ist nicht für große Partitionen konzipiert. Verwenden Sie insbesondere fortgeschrittenere GNU-Parted (8).

Dieser Befehl unterstützt jedoch> 2 TB Partitionen und LVM.

# parted -ms /dev/sda print > sda.parted

Beispielausgabe:

BYT;
/dev/sda:12.9GB:scsi:512:512:msdos:VMware Virtual disk;
1:1049kB:12.9GB:12.9GB:::boot, lvm;
dhchdhd
quelle
14
Wie können Sie von der gespeicherten sda.partedDatei auf eine neue Festplatte wiederherstellen ?
Avery Chan
4
Diese Antwort ist nutzlos, da die Frage das Kopieren des Partitionslayouts auf ein neues Laufwerk betraf. Bei der Antwort geht es nur um Dumping. Wie importiere ich? Bitte verbessern.
itsafire
Anscheinend gibt es zu diesem Zeitpunkt keine gute Antwort: serverfault.com/questions/709582/…
Otheus