Partitionstabelle sichern und wiederherstellen
Inhaltsverzeichnis
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