== Korrigieren der Partitionstabelle einer Festplatte an einem Beispiel == /!\ ''' Vorab sei empfohlen immer über aktuelle Datensicherungen zu verfügen. ''' /!\ Zur Vorbereitung einer Ubuntu-Installation sollte der freie Bereich einer Platte partitioniert werden. Die Platte wurde vorher schon mal mit gparted und qtparted partitioniert. Da gerade WindowsXP auf dem Rechner lief, sollte die XP Datenträgerverwaltung verwendet werden. Dabei trat ein Problem auf. Es sollte der freie Bereich nach der letzten logischen Partition partitioniert werden. Nach Eingabe der angefragten Werte in den Assistenten und starten, bricht die Partitionierung ab. Als Folge ist die letzte logische Partition "verschwunden". Sie ist weder in XP als Laufwerk, noch in Linux als Partition verfügbar. Wie sich zeigt, hat die WindowsXP Datenträgerverwaltung einen Zeiger in der Partitionstabelle gelöscht. X-( Da die letzte Sicherung der Partition schon einige Zeit zurückliegt, soll versucht werden die Partitionstabelle zu reparieren. ''' Hilfsmittel : ''' * Kapitel "Grundsätzliches zu Partitionen von Festplatten" in http://www-ivs.cs.uni-magdeburg.de/bs/lehre/wise0001/bs2/partfs * "little endian" in http://de.wikipedia.org/wiki/Byte-Reihenfolge * Knoppix 5.0.1 DVD . (Bei boot- oder Konsolen-Problemen s.u. Knoppix 5.0.1 DVD) ''' Vorgehensweise : ''' '' 1. Zugriffe prüfen '' '' 2. Erster Blick auf die Partitionstabelle '' '' 3. Partitionstabelle unmittelbar auf der Platte '' '' 4. Wo und was soll, kann geändert werden '' '' 5. Änderung durchführen '' ---- ''' 1. Zugriffe prüfen ''' Während der Aktion soll kein anderer Zugriff auf die Platte erfolgen. Heißt die Platte z.B. sdb , kann man mit : {{{ # mount | grep sdb }}} sehen ob eine Partition der Platte eingehängt ist. Falls ja, mit umount aushängen. ''' 2. Erster Blick auf die Partitionstabelle ''' Es handelt sich um eine Platte mit einer primären, einer erweiterten und zwei logischen Partitionen, wobei die Verkettung zur zweiten logischen Partition gelöscht wurde. {{{ # fdisk -l /dev/sdb Platte /dev/sdb: 163.9 GByte, 163928604672 Byte 255 Köpfe, 63 Sektoren/Spuren, 19929 Zylinder Einheiten = Zylinder von 16065 × 512 = 8225280 Bytes Gerät boot. Anfang Ende Blöcke Id System /dev/sdb1 * 1 1305 10482381 83 Linux /dev/sdb2 8258 19930 93756132+ f W95 Erw. (LBA) /dev/sdb5 8258 8334 605617+ 82 Linux Swap / Solaris }}} Hier fehlt der Eintrag für /dev/sdb6 . ''' 3. Partitionstabelle unmittelbar auf der Platte ''' Zuerst die Tabelle aus dem MBR, die die Einträge für die primäre und die erweiterte Partition enthält : {{{ # dd if=/dev/sdb bs=512 count=1 | xxd | tail -n5 }}} Daraus nur die Tabelle plus Erläuterung. Die Umrechnung von hex in dec erfolgt einfach,bei Beachtung von little endian, durch Umschalten des Zahlensystems in einem Taschenrechner. {{{ ty start.... size..... type start size pe 0000 0000 0000 0000 2b33 4b01 0000 8001 0100 83fe ffff 3f00 0000 9ae5 3f01 00fe ext3 63 20964762 ffff 0ffe ffff 233e e807 c935 2d0b 0000 erw 132660771 187512265 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 55aa }}} Die logischen Partitionen sind, wie aus Kapitel "Grundsätzliches zu Partitionen von Festplatten" s.o. bekannt, in der erweiterten Partition seriell verkettet. Der Beginn der erweiterten Partition zeigt eine erste logische Partition vom Typ 82 : {{{ # dd if=/dev/sdb bs=512 count=1 skip=132660771 | xxd | tail -n5 0000 0000 0000 0000 0000 0000 0000 00fe ffff 82fe ffff 0100 0000 637b 1200 0000 swap 1 1211235 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 55aa }}} In der Zeile nach der swap-Partition müßte eine Zeile mit einem Zeiger auf eine weitere logische Partition stehen, die jedoch von XP Datenträgerverwaltung gelöscht wurde. Dieser Block wird für die spätere Bearbeitung in eine Datei kopiert. {{{ # dd if=/dev/sdb bs=512 count=1 skip=132660771 > skip132660771.sdb }}} ''' 4. Wo und was soll, kann geändert werden ''' Da der freie Platz HINTER der "verschwundenen" Partition partitioniert werden sollte und der Abbruch sehr schnell erfolgte, wurde an dieser Partition selbst (hoffentlich), nichts geändert. Suche nach Block 0 dieser Partition mit dem script find55aa.sh (s.u.). find55aa.sh benötigt drei Parameter, * device auf dem gesucht werden soll * block in dem die Suche beginnen soll * block in dem sie enden soll Beginn der extended partition ist 132660771, die Größe der ersten logischen Partition ist 1211235, also Start der Suche ist 133872006, Ende wird probiert. {{{ # ./find55aa.sh /dev/sdb 133872006 133900000 }}} (Kann eine Weile dauern). Das Suchergebnis in 55aa.found zeigt ein paar Einträge, von denen aber nur 133885710 , eine Partitionstabelle enthält. Dort wird auch der Dateisystemtyp 0c (fat32) der gesuchten Partition angezeigt : {{{ # dd if=/dev/sdb bs=512 count=1 skip=133885710 | xxd | tail -n5 0000 0000 0000 0000 0000 0000 0000 00fe ffff 0cfe ffff 3f00 0000 da6e 7007 0000 fat32 63 124808922 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 55aa }}} In den Block in der Datei skip132660771.sdb soll nun nach der Zeile für die swap-Partition ein Zeiger eingefügt werden, der auf den eben gefundenen Block zeigt. Dazu werden type, start und size benötigt. {{{ type : aus fdisk "list known partition types" wird 05 gewählt start : ermittelter start 133885710 start erw. Part. -132660771 --------- 1224939 hex 12b0eb little endian ebb01200 size : im Zeigersatz muß die Summe aus start und size aus dem Satz auf den gezeigt wird stehen 3f +07706eda -------- 07706f19 little endian 196f7007 }}} ''' 5. Änderung durchführen ''' Die Partitions-Tabelle im Block skip132660771.sdb muß nun so aussehen : {{{ 0000 0000 0000 0000 0000 0000 0000 00fe ffff 82fe ffff 0100 0000 637b 1200 00fe swap 1 1211235 ffff 05fe ffff ebb0 1200 196f 7007 0000 erw 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 55aa }}} Dazu wird ein Hex-Editor aufgerufen (Z.B. KHexEdit) und die Datei skip132660771.sdb geöffnet, die erforderlichen Werte eingetragen, die Datei gespeichert und der Editor verlassen. Zur Kontrolle nochmal : {{{ # xxd skip132660771.sdb }}} zeigt die geänderte Datei skip132660771.sdb . Nun folgt das Zurückschreiben dieses Blockes auf die Platte. /!\ ''' Bei Schreibaktionen mit dd auf eine Platte wird immer besondere Sorgfalt angemahnt ''' /!\ {{{ # dd if=skip132660771.sdb bs=512 count=1 of=/dev/sdb seek=132660771 }}} Zum guten Schluß zeigt fdisk {{{ # fdisk -l /dev/sdb Platte /dev/sdb: 163.9 GByte, 163928604672 Byte 255 Köpfe, 63 Sektoren/Spuren, 19929 Zylinder Einheiten = Zylinder von 16065 × 512 = 8225280 Bytes Gerät boot. Anfang Ende Blöcke Id System /dev/sdb1 * 1 1305 10482381 83 Linux /dev/sdb2 8258 19930 93756132+ f W95 Erw. (LBA) /dev/sdb5 8258 8334 605617+ 82 Linux Swap / Solaris /dev/sdb6 8335 16103 62404461 c W95 FAT32 (LBA) }}} Auf die Daten in sdb6 kann in Linux und Windows wieder zugegriffen werden. B-) ---- ---- ---- ''' Knoppix 5.0.1 DVD ''' Boot hängt am grünen Fortschrittsbalken. Abhilfe : {{{ boot: knoppix noudev nodhcp }}} Wegen fehlender Berechtigungen kann keine Konsole geöffnet werden, Abhilfe : {{{ Strg + Alt + F1 Eingabe # chmod 666 /dev/pty* Strg + Alt + F5 Falls F5 oder keine andere F-Taste zur Rückkehr nach XWindow funktioniert: # kill -9 `cat /tmp/.X0-lock` }}} ''' find55aa.sh ''' Geht sicher eleganter, hier einfach ohne Schnörkel. {{{ #!/bin/sh if [ -z $1 ] | [ -z $2 ] | [ -z $3 ] then echo " Eingabe: # ./find55aa.sh disk start end " exit fi i=$2 while [ $i -le $3 ] do vtmp=`dd if=$1 bs=512 count=1 skip=$i | xxd | tail -n1` v55aa=`echo $vtmp | awk '{print $9}'` if [ $v55aa = "55aa" ]; then echo $i >> 55aa.found fi i=`expr $i + 1` done exit 0 }}}