Écrasement de la table de partitions
La table de partition, qui indique l'organisation des partitions du disque, se trouve dans les premiers 512 octets du disque, avec le secteur de boot.
Problème: vous avez oublié ce détail et vous avez installé un nouveau secteur de boot... et par conséquent perdu l'organisation des partitions. Bien entendu vous avez oublié de:
dd if=/dev/hda of=bootsector.bin count=1 bs=512
Bref vous avez perdu toutes vos données. Sauf... si vous avez eu le sang-froid de garder l'ordinateur allumé et n'avez encore touché à rien, car le noyau Linux a probablement toujours l'organisation des partitions en mémoire. La première chose à faire est donc de monter les partitions et de faire une sauvegarde d'une manière ou d'une autre, avant qu'une coupure d'électricité ne vienne définitivement régler le problème.
Une fois cela fait, allons voir dans /sys/block/hda/ (ou éventuellement sda pour du SCSI ou ces nouveaux disques SATA).
$ cat hda?/start 63 20482875 41190660 42186690 20482938
$ cat hda?/size 20482812 2 996030 38106180 20707722
Pour info mon disque-dur ressemble à ceci:
# fdisk /dev/hda [...] Command (m for help): u Changing display/entry units to sectors Command (m for help): p Disk /dev/hda: 41.1 GB, 41110142976 bytes 255 heads, 63 sectors/track, 4998 cylinders, total 80293248 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System /dev/hda1 * 63 20482874 10241406 83 Linux /dev/hda2 20482875 41190659 10353892+ 5 Extended /dev/hda3 41190660 42186689 498015 82 Linux swap / Solaris /dev/hda4 42186690 80292869 19053090 83 Linux /dev/hda5 20482938 41190659 10353861 83 Linux
Il s'agit donc du numéro de secteur de début de chaque partition ainsi que sa taille (remarquer que la taille de la partition étendue n'est pas exact). Avec cela et fdisk, vous pouvez recréer votre table de partition. Basculer les unités de cylinders vers sectors. Quand vous créez une nouvelle partition (n), fdisk vous demande le secteur de début (vous l'avez) et de fin - pour la partition n:
start[n+1] - 1 = start[n] + size[n] - 1
(on retranche 1 pour avoir le dernier secteur, le suivant est le début de la partition d'après)
Pour la partition étendue il faudra vous débrouiller et probablement lui faire englober, sous fdisk, l'ensemble des autres partitions - personnellement je n'ai eu à restorer que mes partitions primaires.
On remarque tout de même que la première partition de la partition étendue commence après 63 (encore ce chiffre) secteurs. Comme application, la fin d'une partition étendue qui serait la dernière du disque (cas malheureux, car il est impossible de s'aider de start[n+1]) serait alors
start[n] + 63 + size[e1] + size[e2] + ... + size[ei] - 1
eX étant les partitions étendues (dans mon cas: 20482875 + 63 + 20707722 - 1 = 41190659 = start[3] - 1 - ça concorde).
Il vous manque encore quelques information: le type et le prédicat bootable? de chaque partition. Pour ceux-là, j'espère que vous pouvez vous fier à votre mémoire, ou éventuellement au type de système de fichier détecté par mount
.
Bien entendu la solution de sauvegarder le secteur de boot avant toute intervention reste la plus efficace - mais l'autre manipulation m'a tout de même sauvé la vie une fois :)
Notes
man sfdisk recommande une approche plus complète de la sauvegarde de la table de partition, qui prend également en compte les partitions étendues (qui ne sont pas dans le MBR):
% sfdisk /dev/hdd -O hdd-partition-sectors.save # backup % sfdisk /dev/hdd -I hdd-partition-sectors.save # restore
Liens
- LILO User's Guide v21 (cf. /usr/share/doc/lilo-doc/user.ps.gz - paquet lilo-doc): le chapitre d'introduction présente les tables de partitions de manière claire, avec des schémas.