Partitionstabelle sichern und wiederherstellen

Aus Linupedia
Version vom 9. September 2008, 22:25 Uhr von Robi (Diskussion | Beiträge) (intern verlinkt)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Partitionstabelle sichern und wiederherstellen

Oftmals stellt sich einem die Frage wie man eine Sicherung von den Partitionstabellen all seiner Platte herstellen kann. Eine solche Sicherung würde zB. in vielen Fällen helfen einzelne Festplatten oder sein gesamtes System wieder aus einem Backup 100% genau so herzustellen. Auch bei einer Reparatur eines mal aus unerklärlichen Gründen oder durch falsche Handhabung zerstörten Partitionstabelle, kann man mit einer solchen Sicherung schnell und sicher seine Platte wieder orginal herstellen. Mann kann damit aber auch die Partitionen einer Platte auf eine Andere übertragen, was sehr hilfreich ist beim aufsetzen von zB. Software Raid Spiegelungen von Festplatten.

Im Internet wird an einigen Stellen eine Sicherung des MBR (Master Boot Record) der Festplatte mittels dd empfohlen. Im MBR befindet sich allerdings nur die Tabelle für die Partitionen 1 bis 4 aber statt dessen auf bootbaren Platten der Bootloader. Ein zurückspielen einer solchen Sicherung kann also durchaus mehr kaput machen, als einem lieb ist, und ein Übertragen einer solchen Sicherung auf eine andere Platte mehr Probleme bereiten als man erwarten würde. Deshalb soll hier eine Methode vorgestellt werden, die einerseits ein normal lesbares und auch ausdruckbares Backup der kompletten Partitionstabelle herstellt, das man mit wenig Aufwand auch wieder auf die Platte bekommt.


das Tool sfdisk

Geeignet dafür ist das Tool sfdisk das im Paket util-linux wohl gleich bei der Installation mit installiert worden ist.


Partitionstabelle sichern

sfdisk mit der Option -d und der Festplattennamen sollte eine lesbare Tabelle aus der Partitionstabelle ausgeben.

LINUX:/tmp # sfdisk -d /dev/sdb
# partition table of /dev/sdb
unit: sectors

/dev/sdb1 : start=       32, size=   133088, Id=fd, bootable
/dev/sdb2 : start=   133120, size= 10487808, Id=fd
/dev/sdb3 : start= 10620928, size= 41945088, Id=fd
/dev/sdb4 : start= 52566016, size= 19120128, Id= f
/dev/sdb5 : start= 52566048, size=  4196320, Id=fd
/dev/sdb6 : start= 56762400, size= 14923744, Id=fd

diese Tabelle wird mittels Umleitung als Datei abgelegt und bekommt gleich noch einen Namen der auf den richtigen Inhalt hindeutet.

sfdisk -d /dev/sdb > sdb-partition.txt

Auf diese Weise kann man von allen Festplatten seines Systems jeweils eine solche Datei anlegen und an sicherer Stelle und im Backup ablegen. Nicht vergessen, nach Änderungen an den Partitionstabellen einzelner Platten diese Datei dann auch neu zu erstellen.


Partitionstabelle wiederherstellen

Das Wiederherstellen ist ebenso einfach. Sollte allerdings die Partitionstabelle defekt sein und die Daten auf der Platte sehr wertvoll und wichtig, und man sich selbst nicht wirklich 100% sicher, dass man auch wirklich die aktuelle Partitionssicherung von dieser Platte vor sich hat, empfiehlt es sich dennoch lieber Reparieren einer defekten Partitionstabelle zu versuchen. Hierbei wird die Platte untersucht und versucht die gefundenen Partitionstabellenfragmente und/oder Filesystemmarkiereungen wieder zu einer Partitionstabelle zusammenzusetzen.


Ansonsten zum Wiederherstellen unserer oben gesicherten Partitionstabelle:

Am besten und einfachsten geht es, wenn im Moment LINUX nicht auf diese Platte zugreift, also auf dieser Platte nichts gemountet ist, und auch kein Swap auf dieser Platte aktiv läuft.

LINUX:/tmp # sfdisk /dev/sdb < sdb-partition.txt

Es kommt eine Ausgabe über die aktuelle Partitionstabelle und die neu aufgeschriebene Partitionstabelle und fast am Ende

Successfully wrote the new partition table

Re-reading the partition table ...

Damit ist die Partitionstabelle wieder hergestellt und auch schon im Kernel bekannt.


Etwas komplizierter wird es wenn Teile dieser Platte derzeitig noch in Gebrauch sind. Wenn das wirklich absolut notwendig und unabdingbar sein sollte, dann kann man das Schreiben der neuen Partitionstabelle auch erzwingen obwohl noch etwas gemountet ist. ( Aber wirklich nur im Äußersten Notfall. Ein Reboot oder das Aushängen dieser Paritition muss dann aber dennoch erfolgen, damit die neue Tabelle auch dem Kernel aktiv bekannt gemacht werden kann.)

LINUX:/tmp # sfdisk --no-reread -f /dev/sdb < sdb-partition.txt

Nach einer Änderung der Partitionstabelle bei noch gemounteten Filesystem, kann nach einem umount dieser Dateisysteme auch der Kernel explizied noch angewiesen werden, die Partitionstabelle von der Platte neu einzulesen.

LINUX:/tmp # sfdisk -R /dev/sdb

kommt hier als Fehler immer noch "BLKRRPART: Device or resource busy" hilft nur ein Reboot.

Weitere nützliche Optionen

neben den oben genannten Optionen kann man damit natürlich auch seine Partitionstabellen bearbeiten, Listen oder die Größe der einzelnen Partitionen abfragen oder die Konsistenz der Partitionstabelle überprüfen. Dabei können die Befehle auch in Scripten verwendet werden. Siehe dazu die Manpage von sfdisk

Achtung:

Die Manipulation an Partitionstabellen auf Platten auf denen sich noch Daten befinden die noch benötigt werden, stellt immer ein gewisses nicht zu unterschätzendes Risiko dar, dessen sollte man sich immer bewußt sein, mit welchem Tool man auch arbeitet.


Partitionstabelle auf eine andere Platte übertragen

Prinzipiel funktioniert das genau so wie oben beschrieben, nur das dann die Partitionstabelle auf eine andere Platte geschrieben wird. Diese sollte selbtverständlich dann baugleich, zumindestens aber genauso groß oder fals nicht anders verfügbar, eben größer sein. In machen Fällen wird man beim Kopieren einer Partitionstabelle auf eine andere Platte, zum Beispiel beim vorbereiten der Platten für Softwareraid, auf folgendes Problem stoßen.


Unterschiedliche Anzahl an Köpfen, Sektoren und Cylinder

server:~ # fdisk -l /dev/sd?

Disk /dev/sda: 36.7 GB, 36703932928 bytes
255 heads, 63 sectors/track, 4462 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xc1032bc3
.........
Disk /dev/sdb: 36.7 GB, 36703932928 bytes
64 heads, 32 sectors/track, 35003 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Disk identifier: 0xce3ef33a
......

Es handelt sich dabei jedoch um zwei völlig baugleiche Platten und die hier ausgegebene Geometrie hat nichts mit der tatsächlichen physikalischen Geometrie der Platte zu tun. ( Eine Platte mit 255 Köpfen dürfte nach heutiger Bauweise wohl auch ein ganz schön schwerer Brocken werden) Die Anzahl von Köpfen Sektoren und Cylindern die der Kernel kennt und uns anzeigt und mit denen er auch arbeitet, sind heute bei modernen Platten reine virtuelle Größen, die innerhalb der Platte in die physikalisch richtigen Größen umgesetzt werden. Allerdings wird jetzt beim Versuch die Partitionstabelle einer Platte auf die andere Platte zu übertragen folgendes passieren.

server:/ # sfdisk  /dev/sdb < /tmp/sda.txt
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 35003 cylinders, 64 heads, 32 sectors/track
Old situation:
Units = cylinders of 1048576 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sdb1          0+  35002   35003-  35843056   83  Linux
/dev/sdb2          0       -       0          0    0  Empty
/dev/sdb3          0       -       0          0    0  Empty
/dev/sdb4          0       -       0          0    0  Empty
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdb1            63   8401994    8401932  82  Linux swap / Solaris
/dev/sdb2   *   8401995  46154744   37752750  83  Linux
/dev/sdb3      46154745  62942669   16787925  83  Linux
/dev/sdb4      62942670  71682029    8739360   f  W95 Ext'd (LBA)
/dev/sdb5      62942733  71682029    8739297  83  Linux
Warning: partition 1 does not end at a cylinder boundary

sfdisk: I don't like these partitions - nothing changed.
(If you really want this, use the --force option.)

es wurde also schlichtweg abgewiesen und die hier vorgeschlagene Option --force wird hier in aller Regel auch nicht wirklich weiter helfen, zumindestens kein optimales Ergebnis erbringen. Sie passt zwar die einzelnen Partitionen entsprechend der Größe richtig an, allerdings muss man sehr genau hinschauen, da der Anfang und das Ende der einzelnen Partitionen recht unterschiedlich ausfallen, wie man folgend nach dem Einsatz der Option --force erkennen kann.

server:/ # fdisk -l /dev/sd?

Disk /dev/sda: 36.7 GB, 36703932928 bytes
255 heads, 63 sectors/track, 4462 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xc1032bc3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         523     4200966   82  Linux swap / Solaris
/dev/sda2   *         524        2873    18876375   83  Linux
/dev/sda3            2874        3918     8393962+  83  Linux
/dev/sda4            3919        4462     4369680    f  W95 Ext'd (LBA)
/dev/sda5            3919        4462     4369648+  83  Linux

Disk /dev/sdb: 36.7 GB, 36703932928 bytes
64 heads, 32 sectors/track, 35003 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Disk identifier: 0xce3ef33a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        4103     4200966   82  Linux swap / Solaris
/dev/sdb2   *        4103       22537    18876375   83  Linux
/dev/sdb3           22537       30734     8393962+  83  Linux
/dev/sdb4           30734       35001     4369680    f  W95 Ext'd (LBA)
/dev/sdb5           30734       35001     4369648+  83  Linux

Da die Einteilung in Köpfe Sektoren und Cylinder eine reine virtuelle ist, kann man diese natürlich auch ändern. Das geht allerdings nur, wenn wir die Partitionstabelle komplett neu schreiben, also alle eventuellen alten Einträge erst löschen und dann mindestens einen neu schreiben. Da in unserem Fall sowieso die ganze Paritionstabelle neu geschrieben wird, können wir uns das löschen sparen. Wir geben nur beim kopieren der Partitionstabelle auf die andere Platte die gewünschte Geometrie ( die wir aus der orginal Platte ausgelesen haben) als Parameter mit an.

server:/ # sfdisk  -H 255 -S 63 -C 4462  /dev/sdb < /tmp/sda.txt
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 4462 cylinders, 255 heads, 63 sectors/track
Old situation:
Warning: The partition table looks like it was made
  for C/H/S=*/64/32 (instead of 4462/255/63).
For this listing I'll assume that geometry.
Units = cylinders of 1048576 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sdb1          0+   4102-   4103-   4200966   82  Linux swap / Solaris
/dev/sdb2   *   4102+  22536-  18434-  18876375   83  Linux
/dev/sdb3      22536+  30733-   8198-   8393962+  83  Linux
/dev/sdb4      30733+  35000-   4268-   4369680    f  W95 Ext'd (LBA)
/dev/sdb5      30733+  35000-   4268-   4369648+  83  Linux
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdb1            63   8401994    8401932  82  Linux swap / Solaris
/dev/sdb2   *   8401995  46154744   37752750  83  Linux
/dev/sdb3      46154745  62942669   16787925  83  Linux
/dev/sdb4      62942670  71682029    8739360   f  W95 Ext'd (LBA)
/dev/sdb5      62942733  71682029    8739297  83  Linux
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Als Ergebnis erhalten wir jetzt zwei auf den ersten Blick schon identisch eingerichtete Platten und so die optimalen Voraussetztung für ein Raid 1.

server:/ # fdisk -l /dev/sd?

Disk /dev/sda: 36.7 GB, 36703932928 bytes
255 heads, 63 sectors/track, 4462 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xc1032bc3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         523     4200966   82  Linux swap / Solaris
/dev/sda2   *         524        2873    18876375   83  Linux
/dev/sda3            2874        3918     8393962+  83  Linux
/dev/sda4            3919        4462     4369680    f  W95 Ext'd (LBA)
/dev/sda5            3919        4462     4369648+  83  Linux

Disk /dev/sdb: 36.7 GB, 36703932928 bytes
255 heads, 63 sectors/track, 4462 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xce3ef33a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         523     4200966   82  Linux swap / Solaris
/dev/sdb2   *         524        2873    18876375   83  Linux
/dev/sdb3            2874        3918     8393962+  83  Linux
/dev/sdb4            3919        4462     4369680    f  W95 Ext'd (LBA)
/dev/sdb5            3919        4462     4369648+  83  Linux