Wie lese ich die speicherinterne (Kernel-) Partitionstabelle von / dev / sda?

14

Ich habe versehentlich meine / dev / sda-Partitionstabelle mit GParted überschrieben ( vollständige Geschichte auf AskUbuntu ). Da ich noch keinen Neustart durchgeführt habe und mein Dateisystem immer noch einwandfrei verwendbar ist, wurde mir mitgeteilt, dass ich die Partitionstabelle möglicherweise aus dem Kernelspeicher wiederherstellen kann. Ist das möglich? Wenn ja, wie kann ich es wiederherstellen und wiederherstellen?

Bildbeschreibung hier eingeben

Olivier Lalonde
quelle

Antworten:

25

Ja, Sie können dies mit dem /sysDateisystem tun .

/sysist ein gefälschtes Dateisystem, das dynamisch von den Kernel- und Kerneltreibern generiert wird.
In diesem speziellen Fall können Sie zu gehen /sys/block/sdaund Sie werden ein Verzeichnis für jede Partition auf dem Laufwerk sehen. Es gibt zwei bestimmte Dateien in diesen Ordner , die Sie brauchen, startund size. startEnthält den Versatz vom Anfang des Laufwerks und entspricht sizeder Größe der Partition. Löschen Sie einfach die Partitionen und erstellen Sie sie mit genau den gleichen Startwerten und Größen wie in /sys.

Zum Beispiel sieht mein Laufwerk so aus:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536   83  Linux
/dev/sda2   *      133120   134340607    67103744    7  HPFS/NTFS/exFAT
/dev/sda3       134340608   974675967   420167680   8e  Linux LVM
/dev/sda4       974675968   976773167     1048600   82  Linux swap / Solaris

Und das habe ich in /sys/block/sda:

sda1/
 start: 2048
 size: 131072
sda2/
 start: 133120
 size: 134207488
sda3/
 start: 134340608
 size: 840335360
sda4/
 start: 974675968
 size: 2097200


Ich habe dies getestet, um sicherzustellen, dass die Informationen korrekt sind, nachdem die Partitionstabelle auf einem laufenden System geändert wurde

Patrick
quelle
1
Wenn ich eine Frage stelle, bedeutet das manchmal "Hey, das war praktisch". Ihre Meinung ist eher "das hat meine Haut gerettet". Vielen Dank!
Alex Hirzel
Ich habe keine /dev/sdb/start. Wurde es in umbenannt ext_range? Kernel:4.8.15-1-MANJARO
Tom Hale
@ TomHale ist es /sys/block/sdb/startnicht/dev/sdb/start
Patrick
Entschuldigung, ich habe das falsche Verzeichnis angegeben. Ich habe eine statda, aber nein start.
Tom Hale
Bei der Neuerstellung der Partitionen empfehle ich usind, fdiskda hier die Anzahl der Sektoren direkt eingegeben werden kann und Sie die Werte überprüfen können, bevor Sie auf die Festplatte schreiben. Ich habe eine Festplatte erfolgreich wiederhergestellt, indem ich die erste Partition erstellt, das Sein akzeptiert und dann "+ size" (von oben) für das Ende starteingegeben habe , die zweite Partition von / sys ... und "+ size" erneut eingab und so weiter ... Größe der Partitionen vor dem Schreiben der neuen Tabelle. Viel Glück!
Jörg Gottschlich
10

Ich habe ein Skript erstellt, um dieses Problem zu lösen, OHNE GARANTIE . (aber ich habe auf meiner virtuellen Maschine getestet)

Führen Sie das folgende Skript mit beschädigter Festplatte als erstem Parameter aus: $ ./repart.sh sda

#!/bin/bash

HARDDISK=$1

PARTITIONS=$(ls -d /sys/block/${HARDDISK}/${HARDDISK}?/)

echo "unit: sectors" 
for i in $PARTITIONS; do
    DEVICE=$(basename $i)
    START=$(cat $i/start)
    SIZE=$(cat $i/size)
    echo "/dev/$DEVICE : start=$START, size=$SIZE, type=XX" 
done

Die Ausgabe ist ein sfdisk-Format. Aber Vorsicht , diese Datei muss modifiziert werden, um verwendet zu werden. Erhöhen Sie bei erweitertem Partitionstyp = 5 die Größe unter Verwendung des gesamten logischen Speicherplatzes plus des Speicherplatzes zwischen dem Start der erweiterten und dem Start der ersten logischen Partition.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=XX
/dev/sda2 : start=2040255, size=20482875, type=XX
/dev/sda3 : start=22523130, size=19197675, type=XX
/dev/sda4 : start=41720805, size=2, type=XX
/dev/sda5 : start=41720868, size=208782, type=XX

Sie müssen den Typ von XX in die Nummer des Partitionstyps ändern . Stellen Sie die bootfähige Partition in die erste Zeile.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=83, bootable
/dev/sda2 : start=2040255, size=20482875, type=83
/dev/sda3 : start=22523130, size=19197675, type=fd
/dev/sda4 : start=41720805, size=208845, type=5
/dev/sda5 : start=41720868, size=208782, type=82

Übernehmen Sie diese Änderungen

cat repart.sfdisk | sfdisk -f /dev/sda

Partitionstabellen erneut lesen

partprobe 
/sbin/blockdev --rereadpt

Maden wieder einbauen

grub-install /dev/sda
Fabceolin
quelle
1
Stellen Sie sicher, dass Sie den Schalter "-u B" für "sfdisk" verwenden, und achten Sie darauf, dass Sie möglicherweise die Werte in "repart.sfdisk" anpassen müssen (in der Regel durch zwei teilen), wenn "sfdisk" in Blockgrößen zählt (prüfen Sie, ob "Units = blocks of") 1024 Bytes "im" sudo sfdisk -u B -l / dev / sda ") außer 512 Bytes (heutzutage normalerweise 1024 Bytes).
Florian
1
Zuerst habe ich falsch verstanden: Mit Id = 5 meinen Sie Partitionstyp 5, also sda4, nicht sda5. Außerdem gibt mir in meinem Fall ls -d / sys / block / sda / sda * nur sda1 und sda5, so dass es den Anschein hat, dass der Container fehlt.
Wau
Sie sollten ls nicht analysieren; Verwenden Sie stattdessen find
cat
3

Hast du testdisk ausprobiert ? Es kann die Festplatte scannen und verlorene Partitionstabellen wiederherstellen, auch nachdem Sie neu gestartet haben.

Es ist vorinstalliert für Debian und vermutlich auch für Ubuntu. Wahrscheinlich andere Distributionen.

Wenn Sie eine gparted-CD booten, ist es wahrscheinlich sinnvoll, zu überprüfen, ob sie darauf vorinstalliert ist.

cas
quelle
Ja er hat. Überprüfen Sie einfach den Link des OP (askUbuntu)
Marco