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 :

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,

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

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.

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

VerlorenePartitionFinden (zuletzt geändert am 2008-11-15 18:47:02 durch FranzBien)