Comment lire la table de partition en mémoire (noyau) de / dev / sda?

14

J'ai accidentellement remplacé 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 fichiers est toujours parfaitement utilisable, on m'a dit que je pourrais peut-être récupérer la table de partition à partir de la mémoire du noyau. Est-ce possible? Si oui, comment puis-je le récupérer et le restaurer?

entrez la description de l'image ici

Olivier Lalonde
la source

Réponses:

25

Oui, vous pouvez le faire avec le /syssystème de fichiers.

/sysest un faux système de fichiers généré dynamiquement par le noyau et les pilotes du noyau.
Dans ce cas spécifique, vous pouvez aller à /sys/block/sdaet vous verrez un répertoire pour chaque partition sur le lecteur. Il y a 2 fichiers spécifiques dans les dossiers dont vous avez besoin, startet size. startcontient le décalage depuis le début du lecteur et sizecorrespond à la taille de la partition. Supprimez simplement les partitions et recréez-les avec les mêmes départs et tailles que ceux trouvés dans /sys.

Par exemple, voici à quoi ressemble mon lecteur:

   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 voici 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é cela pour vérifier que les informations sont exactes après avoir modifié la table de partition sur un système en cours d'exécution

Patrick
la source
1
Parfois, lorsque je vote une question, cela signifie "hé, c'était pratique". Votre vote positif ressemble plus à «cela a sauvé ma peau». Merci!
Alex Hirzel
Je n'en ai pas /dev/sdb/start. At-il été renommé ext_range? Noyau:4.8.15-1-MANJARO
Tom Hale
@TomHale c'est /sys/block/sdb/start, pas/dev/sdb/start
Patrick
Désolé, j'ai cité le mauvais répertoire. J'en ai un stat, mais non start.
Tom Hale
Lors de la recréation des partitions, je recommande usind fdiskcar il permet d'entrer directement le nombre de secteurs et vous pouvez vérifier les valeurs avant d'écrire sur le disque. J'ai réussi à restaurer un disque en: créant la première partition, en acceptant l'être, puis en entrant "+ taille" (par le haut) pour la fin, la deuxième partition entrant startdepuis / sys ... et "+ taille" à nouveau et ainsi de suite ... taille des partitions avant d'écrire la nouvelle table. Bonne chance!
Jörg Gottschlich
10

J'ai créé un script pour aider à résoudre ce problème, sans aucune 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 au format sfdisk. Mais attention , ce fichier doit être modifié pour être utilisé. Au type de partition étendue = 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 en nombre de type de partition. Mettez la partition de démarrage en 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 modifications

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

Relire les tables de partition

partprobe 
/sbin/blockdev --rereadpt

Réinstaller grub

grub-install /dev/sda
fabceolin
la source
1
Assurez-vous d'utiliser le commutateur "-u B" pour sfdisk et soyez prudent, vous devrez peut-être ajuster les valeurs dans repart.sfdisk (divisez-les généralement par deux), si sfdisk compte dans la taille des blocs (vérifiez que "Unités = blocs de 1024 octets "dans le" sudo sfdisk -u B -l / dev / sda ") autre que 512 octets (généralement 1024 de nos jours).
Florian
1
J'ai mal lu au début: par Id = 5, vous voulez dire le type de partition 5, qui est sda4, pas sda5. De plus, dans mon cas, ls -d / sys / block / sda / sda * ne me donne que sda1 et sda5, il semble donc que le conteneur soit manquant.
wau
vous ne devriez pas analyser ls; utilisez plutôt find
cat
3

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

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

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

cas
la source
Oui il l'a fait. Il suffit de vérifier le lien de l'OP (askUbuntu)
Marco