GNU/Linux >> Linux Esercitazione >  >> Linux

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

Sì, puoi farlo con il /sys filesystem.

/sys è un falso filesystem generato dinamicamente dal kernel e dai driver del kernel.
In questo caso specifico puoi andare a /sys/block/sda e vedrai una directory per ogni partizione sull'unità. Ci sono 2 file specifici in quelle cartelle di cui hai bisogno, start e size . start contiene l'offset dall'inizio del drive e size è la dimensione della partizione. Basta eliminare le partizioni e ricrearle con gli stessi identici inizi e le stesse dimensioni che si trovano in /sys .

Ad esempio, questo è l'aspetto del 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


Ho creato uno script per aiutare a risolvere questo problema, senza NESSUNA GARANZIA .(ma ho provato sulla mia macchina virtuale)

Eseguendo il seguente script, con HD danneggiato al primo parametro, come in:

[email protected]:~$ ./repart.sh sda

Contenuto di repart.sh :

#!/bin/bash

echo "unit: sectors" 
for i in /sys/block/$1/$1?/; do
    printf '/dev/%s : start=%d, size=%d, type=XX\n' "$(basename $i)" "$(<$i/start)" "$(<$i/size)"
done

L'output è un formato sfdisk. Ma attenzione , questo file deve essere modificato per essere utilizzato. Al tipo di partizione estesa=5, aumenta la dimensione, utilizzando tutto lo spazio logico più lo spazio tra l'inizio dell'estensione 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 il ​​file avviabile partizione alla prima riga.

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

Rileggere le tabelle delle partizioni

partprobe 
/sbin/blockdev --rereadpt

Reinstalla grub

grub-install /dev/sda

Hai provato il disco di prova? 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 distribuzioni.

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


Linux
  1. Come generare una password casuale in Linux usando /dev/random

  2. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  3. Linux:differenza tra /dev/console , /dev/tty e /dev/tty0?

  4. Quanto sono portatili /dev/stdin, /dev/stdout e /dev/stderr?

  5. Come mappare il dispositivo /dev/sdX e /dev/mapper/mpathY dal dispositivo /dev/dm-Z

Come codificare in base64 /dev/random o /dev/urandom?

Come si scambia /dev/sda con /dev/sdb?

DD da /dev/zero a /dev/null... cosa succede realmente

Come Linux usa /dev/tty e /dev/tty0

echo o print /dev/stdin /dev/stdout /dev/stderr

Perché sono necessari < o > per usare /dev/tcp