Cet article fait suite à la mésaventure arrivée à un client. Lors d’une manipulation dangereuse (sfdisk…), il a totalement écrasé la table des partitions de son disque système. Fort heureusement il a laissé son système en marche, il ne l’a surtout pas redémarré.
Attention, cet article s’adresse à des utilisateurs confirmés. Si vous n’avez pas l’habitude de fdisk, ou que vous avez déjà redémarré votre machine, cet article n’est pas pour vous. Si vous perdez vos données, vous en êtes responsable. Ce n’est pas parce que ça a marché dans mon cas, que ça marchera dans le votre. Les commandes données ne sont pas complètes, il ne s’agit pas d’un tutoriel. L’explication sera parlante aux personnes capables de réaliser les commandes. Bref, tout ceci pour vous dire que je ne suis pas responsable en cas de soucis sur vos données.
Pourquoi c’est une bonne idée de ne pas l’avoir redémarré après l’erreur ?
Lors de son démarrage, le noyau a mémorisé la table des partitions de son disque de démarrage. C’est d’ailleurs pour ça qu’on doit redémarrer la machine, ou lancer l’outil partprobe après avoir modifié la table des partitions du disque de démarrage. Sinon, la table des partitions du disque est différente de la table des partitions mémorisée par le noyau…
Heureusement qu’il n’a pas lancé partprobe /dev/sda !
En fait, il a lancé la commande. Et c’est ce qui lui a mis la puce à l’oreille. Partprobe lui a répondu par pleins d’erreurs, qui pourraient être traduites par je ne peux pas changer la table des partitions dans le noyau, car les partitions utilisées ont été modifiées. En effet, sa partition / est forcément montée, et dans la nouvelle table des partitions, elle n’existe plus. Le noyau continue donc d’utiliser l’ancienne table, puisqu’il s’appuie sur cette ancienne table pour fonctionner.
La méthode.
L’idée repose sur le fait que justement, le noyau a gardé en mémoire l’ancienne table des partitions. On va donc regarder ce qu’il a en mémoire, et remettre la même chose sur le disque. La machine ne doit en aucun cas être arrêtée ou redémarrée tant que l’opération n’est pas complète. On pourra voir ce qu’il a en mémoire à l’aide des informations accessibles dans /sys.
[root@localhost ~]# cat /sys/block/hda/hda1/start
63
[root@localhost ~]# cat /sys/block/hda/hda1/size
208782
L’opération est à refaire pour chaque partition.
[root@localhost ~]# cat /sys/block/hda/hda2/start
208845
[root@localhost ~]# cat /sys/block/hda/hda2/size
16563015
Dans mon exemple, j’ai deux partitions:
- hda1 commençant au secteur 63 de taille 208782 secteurs.
- hda2 commençant au secteur 208845 de taille 16563015 secteurs.
C’est donc le moment de lancer fdisk, et de détruire toutes les mauvaises partitions qu’on a créé. Je ne détaillerai pas ces opérations. Une fois que notre table des partitions est vide, on peut mettre les valeurs qu’on a trouver:
Commande (m pour l'aide): p
Disque /dev/hda: 8589 Mo, 8589934592 octets
255 heads, 63 sectors/track, 1044 cylinders
Unités = cylindres de 16065 * 512 = 8225280 octets
Périphérique Amorce Début Fin Blocs Id Système
Commande (m pour l'aide):
Les partitions sont affichées en cylindres, ce qui ne nous arrange pas. Passons les en secteurs avec la commande u
Commande (m pour l'aide): u
Modification des unités d'affichage/saisie à secteurs
Commande (m pour l'aide): p
Disque /dev/hda: 8589 Mo, 8589934592 octets
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Périphérique Amorce Début Fin Blocs Id Système
Commande (m pour l'aide):
Faisons notre partition 1, début 63 et taille de 208782. Attention, quand on précise la taille, on enlève 1 à la valeur trouvée dans /sys. Je dois avouer que je ne sais pas pourquoi, mais sinon, on ne tombe pas sur un nombre de cylindres entier… Si quelqu’un a une explication plus propre, je suis preneur ;). Donc on fera +208781.
Commande (m pour l'aide): n
Action de commande
e étendue
p partition primaire (1-4)
p
Numéro de partition (1-4): 1
Premier secteur (63-16777215, par défaut 63):
Utilisation de la valeur par défaut 63
Dernier secteur ou +taille or +tailleM ou +tailleK (63-16777215,
par défaut 16777215): +208781
Commande (m pour l'aide): p
Disque /dev/hda: 8589 Mo, 8589934592 octets
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Périphérique Amorce Début Fin Blocs Id Système
/dev/hda1 63 208844 104391 83 Linux
Commande (m pour l'aide):
Ça a l’air d’être ce qu’on veut. Seconde partition maintenant, début 208845 de taille 16563015, donc +16563014 pour fdisk:
Commande (m pour l'aide): n
Action de commande
e étendue
p partition primaire (1-4)
p
Numéro de partition (1-4): 2
Premier secteur (208845-16777215, par défaut 208845): 208845
Dernier secteur ou +taille or +tailleM ou +tailleK (208845-16777215,
par défaut 16777215): +16563014
Commande (m pour l'aide): p
Disque /dev/hda: 8589 Mo, 8589934592 octets
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Périphérique Amorce Début Fin Blocs Id Système
/dev/hda1 63 208844 104391 83 Linux
/dev/hda2 208845 16771859 8281507+ 83 Linux
Et là, oh miracle, on a retrouvé notre table originale. Un reboot permet de vérifier ça (mais attention, si vous redémarrez et que vous n’avez pas passé les bonnes tailles, il faudra alors utiliser un outil de récupération de partitions, avec les risques d’erreurs que ça engendre…).