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.