Comment lire la table de partition en memory (kernel) de / dev / sda?

J'ai accidentellement écrasé ma table de partition / dev / sda avec GParted ( histoire complète sur AskUbuntu ). Comme je n'ai pas encore redémarré et que mon système de files est toujours parfaitement utilisable, on m'a dit que je pourrais récupérer la table de partition dans la memory du kernel. Est-ce possible? Si oui, comment puis-je le récupérer et le restaurer?

entrer la description de l'image ici

Oui, vous pouvez le faire avec le /sys files /sys .

/sys est un faux système de files généré dynamicment par les pilotes kernel & kernel.
Dans ce cas particulier, vous pouvez aller dans /sys/block/sda et vous verrez un directory pour chaque partition sur le disque. Il y a 2 files spécifiques dans ces dossiers dont vous avez besoin, le start et la size . start contient le décalage depuis le début du lecteur, et la size correspond à la taille de la partition. Il suffit de supprimer les partitions et de les recréer avec les mêmes départs et tailles que ceux trouvés dans /sys .

Par exemple, voici à quoi ressemble mon disque:

  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 

Et c'est ce que j'ai dans /sys/block/sda :

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

J'ai testé ceci pour vérifier que l'information est exacte après avoir modifié la table de partition sur un système en cours d'exécution

J'ai fait un script pour aider à résoudre ce problème, sans GARANTIE . (mais j'ai testé sur ma machine virtuelle)

Exécution du script suivant, avec HD endommagé au premier paramètre: $ ./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 

La sortie est un format sfdisk. Mais attention , ce file doit être modifié pour être utilisé. Dans la partition étendue type = 5, augmentez la taille en utilisant tout l'espace logique plus l'espace entre le début de l'extension et le début de la première partition logique.

 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 

Vous devez changer le type , de XX au nombre de type de partition. Mettez la partition de démarrage sur la première ligne.

 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 

Appliquer ces changements

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

Relire les tables de partition

 partprobe /sbin/blockdev --rereadpt 

Réinstaller grub

 grub-install /dev/sda 

Avez-vous essayé testdisk ? Il peut scanner le disque et récupérer les tables de partition perdues, même après le redémarrage.

Il est disponible pré-packagé pour Debian et probablement aussi pour Ubuntu. Probablement d'autres dissortingbutions.

Si vous démarrez un CD gparted, il vaut probablement la peine de vérifier s'il est préinstallé.