Come leggere la tabella delle partizioni in memoria (kernel) di / dev / sda?


14

Ho accidentalmente sovrascritto la mia tabella delle partizioni / dev / sda con GParted ( storia completa su AskUbuntu ). Dal momento che non ho ancora riavviato e il mio filesystem è ancora perfettamente utilizzabile, mi è stato detto che potrei essere in grado di ripristinare la tabella delle partizioni dalla memoria del kernel. È possibile? In tal caso, come posso recuperarlo e ripristinarlo?

inserisci qui la descrizione dell'immagine

Risposte:


25

Sì, puoi farlo con il /sysfilesystem.

/sysè un file system falso generato dinamicamente dai driver kernel e kernel.
In questo caso specifico puoi andare su /sys/block/sdae vedrai una directory per ogni partizione sul disco. Ci sono 2 file specifici in quelle cartelle che ti servono starte size. startcontiene l'offset dall'inizio dell'unità ed sizeè la dimensione della partizione. Basta eliminare le partizioni e ricrearle con gli stessi identici inizi e dimensioni di quelli trovati in /sys.

Ad esempio, ecco come appare il mio disco:

   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

E questo è quello che ho in /sys/block/sda:

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


Ho provato questo per verificare che le informazioni siano accurate dopo aver modificato la tabella delle partizioni su un sistema in esecuzione


1
A volte, quando ho votato per una domanda, significa "ehi, questo è stato utile". Il tuo voto è più simile a "questo mi ha salvato la pelle". Grazie!
Alex Hirzel,

Non ho un /dev/sdb/start. È stato rinominato in ext_range? Kernel:4.8.15-1-MANJARO
Tom Hale,

@TomHale /sys/block/sdb/startno/dev/sdb/start
Patrick

Spiacente, ho citato la directory sbagliata. Ho un statlì, ma no start.
Tom Hale,

Quando si ricreano le partizioni, si consiglia di usind fdiskin quanto consente di immettere direttamente il numero di settori e si possono verificare i valori prima di scrivere su disco. Ho ripristinato con successo un disco: creando la prima partizione, accettando di essere, quindi inserendo "+ size" (dall'alto) per fine, la seconda partizione inserendo startda / sys ... e "+ size" di nuovo e così via ... Controllare il dimensione delle partizioni prima di scrivere la nuova tabella. In bocca al lupo!
Jörg Gottschlich,

10

Ho realizzato uno script per aiutare a risolvere questo problema, SENZA ALCUNA GARANZIA . (ma ho testato sulla mia macchina virtuale)

Esecuzione del seguente script, con HD danneggiato al primo parametro: $ ./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

L'output è in formato sfdisk. Ma attenzione , questo file deve essere modificato per essere utilizzato. Nel tipo di partizione estesa = 5, aumentare le dimensioni, usando tutto lo spazio logico più lo spazio tra l'inizio della estesa e l'inizio della prima partizione logica.

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

Devi cambiare il tipo , da XX al numero del tipo di partizione. Metti la partizione avviabile in prima linea.

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

Applica queste modifiche

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

Rileggi le tabelle delle partizioni

partprobe 
/sbin/blockdev --rereadpt

Reinstalla grub

grub-install /dev/sda

1
Assicurati di usare l'interruttore "-u B" per sfdisk e fai attenzione, potresti dover regolare i valori in repart.sfdisk (dividerli per due di solito), se sfdisk conta in blocchi di dimensioni (controlla "Unità = blocchi di 1024 byte "nel" sudo sfdisk -u B -l / dev / sda ") diverso da 512 byte (di solito 1024 al giorno d'oggi).
Florian,

1
Inizialmente ho letto male: con Id = 5 intendi il tipo di partizione 5, che è sda4, non sda5. Inoltre, nel mio caso ls -d / sys / block / sda / sda * mi dà solo sda1 e sda5, quindi sembra che manchi il contenitore.
wau,

non dovresti analizzare ls; usa invece trova
cat

3

Hai provato testdisk ? Può eseguire la scansione del disco e recuperare le tabelle delle partizioni perse, anche dopo il riavvio.

È disponibile preconfezionato per Debian e presumibilmente anche per Ubuntu. Probabilmente altre distro.

Se stai avviando un CD con gparted, probabilmente vale la pena controllare se è preinstallato.


Sì ha fatto. Basta controllare il link dell'OP (askUbuntu)
Marco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.