Récupération de partitions avec nbd
Benoît Papillault, 28/09/2004
Avertissements
Cet article décrit un cas réel de récupération d'un disque dur
endommagé. Malgré le soin apporté à cet article, vous êtes seul
responsable de l'utilisation que vous en ferez.
Description du problème
Suite au replacement du processeur d'une machine, il s'est avéré que
le secteur 0 du disque dur IDE était défectueux. Or, ce secteur
contient la table des partitions. Ainsi, sans cette table des
partitions, impossibles d'accéder au contenu du disque dur. Plusieurs
solutions ont été envisagées:
- Copie du disque sur un disque de plus grande taille :
Cette solution n'était pas possible car je ne dispose pas de
disque d'une capacité supérieure ou même équivalente.
- Utilisation d'un outil de récupération de partitions :
J'ai utilisé l'outil testdisk
développé par Christophe GRENIER. Cet outil a très rapidement
retrouvé la table des partitions, mais il a été impossible de
ré-écrire le secteur 0.
- Insertion du disque défectueux dans une autre machine :
Le problème reste identique car il n'existe aucun moyen (à ma
connaissance) d'utiliser des partitions sous GNU/Linux si le
secteur 0 est défectueux. Le problème est identique si l'on
utilise un autre système d'exploitation.
- Utilisation d'un montage en loopback :
Il est possible d'utiliser mount -o loop en précisant
un offset. Cette solution ne fonctionne pas pour des offsets
supérieur à 2Go, et n'affiche aucun message d'erreur.
- Copie d'une partition sur un autre disque :
Grâce à la commande dd , nous aurions pu copier le
contenu d'une partition sur un autre disque et ensuite, monter ce
fichier en loopback. Cette solution n'a pas été possible car nous
ne disposions pas d'un espace disque suffisant.
Pour ceux intéressés, voici les informations concernant ce disque :
Nom Commercial: Maxtor® Diamond Max 9
Capacité : 200Go
Model : 6Y200P0
FwRev : YAR41BW0
SerialNo : Y62JFRVE
Date de fabrication : 29/01/2004 (inscrite sur le disque)
Date d'achat : 04/05/2004 (inscrite sur la facture GrosBill)
Fin de garantie : 25/05/2007 (information obtenue sur le site Maxtor)
Solution utilisée
La solution finale a été de calculer à la main le début et la taille
de chaque partition en nombre d'octets et d'exporter cette partie du
disque sous forme d'une block device au travers du réseau
local. Ceci a permet de sauvegarde les données sur une autre machine,
puis de les restaurer après un formatage bas niveau du disque dur.
Récupération de la table des partitions avec testdisk
La machine a d'abord été démarrée avec un CD d'installation de la
distribution Debian, offrant ainsi un shell (Alt-F2). Ce shell a
permis de monter un autre disque contenant un système GNU/Linux
opérationnel et de chrooter dedans. La machine disposait
d'une carte réseau correctement configuré et permettant ainsi l'accès
à Internet. Cet accès a été utilisé pour télécharger une version
statique du programme testdisk .
wget http://www.cgsecurity.org/testdisk-5.3.linuxstatic.tar.gz
tar zxvf testdisk-5.3.linuxstatic.tar.gz testdisk-5.3/linux
cd testdisk-5.3/linux
./testdisk_static /log /debug
Les informations affichées après avoir sélectionné
Analyze sont:
Partition Start End Size
1 Linux 0 1 1 32 254 63 530082
2 Linux 33 0 1 65 254 63 530145
3 Linux 66 0 1 588 254 63 8401995
5 Linux 589 1 1 6963 254 63 102414312
6 Linux 6964 1 1 13338 254 63 102414312
7 Linux 13339 1 1 16708 254 63 54138987
La géométrie du disque est : 16709/255/63.
Calcul des offsets de début de partitions
Afin de pouvoir utiliser nbd, il nous faut les offsets de début de
chaque partition, ainsi que la taille de chaque partition en
octets. On doit alors convertir les informations CHS disponible plus
haut. Nous avons utilisé gdb pour cela, en n'oubliant pas
de convertir vers unsigned long long pour que les calculs
soient effectués en 64 bits!
Nous prenons ici comme exemple la partition 5 qui correspondait à
/home de 50Go.
$ gdb
(gdb) p ((unsigned long long)589*255*63 + 1*63) * 512
$1 = 4844722176
(gdb) p (unsigned long long) 102414312 * 512
$2 = 52436127744
On a donc:
- Début de la partition : 4844722176 octets
- Taile de la partition : 52436127744 octets
Modification de nbd
nbd est formé de trois composants :
- le module noyau nbd
- le client nbd : nbd-client
- le server nbd : nbd-server
Disposant d'une distribution Debian, le module noyau est livré en
standard et les deux autres programmes s'installent avec:
apt-get install nbd-client nbd-server
Malheureusement, cet outil de permet pas d'exporter une partie de
disque dur. Quelques modifications ont donc été faites à la partie
nbd-server . Le code source a été téléchargé par:
apt-get source nbd-server
Et le patch suivant, écrit par mes soins, a été appliqué à la version
2.7.1: nbd.diff. Ce patch ajoute une option
-o permettant de préciser l'offset de début du fichier à
exporter. Un soin tout particulier à été pris pour que les entiers sur
64 bits soient correctement gérés (attention à ne pas oublier le
--enable-lfs pour le Large File Support).
Le code source une fois patché a été téléchargé sur la machine
comportant le disque dur défectueux et compilé :
./configure --enable-lfs --enable-syslog
make
Utilisation de nbd pour sauvegarder les données
- Sur la machine défectueuse (adresse IP : 192.168.1.2):
nbd-server 2222 /dev/hda 52436127744 -o 4844722176
- Sur la machine de sauvegarde :
mknod /dev/nd0 b 43 0
nbd-client 192.168.1.2 2222 /dev/nd0
mkdir /mnt/falcon/hda5
mount /dev/nd0 /mnt/falcon/hda5
mkdir /home/falcon/hda5
cd /mnt/falcon/hda5
cp -Rpd . /home/falcon/hda5
umount /dev/nd0
nbd-client -d /dev/nd0
Formatage du disque bas niveau
S'agissant d'un disque Maxtor®, l'outil fournit par ce fabriquant de
disque dur a été utilisé. Il s'agit de l'outil PowerMax version
4.09 et disponible sur le site de Maxtor.
Le formatage de bas niveau rapide a été utilisé avec succés. Les
vérifications réalisées avec cet outil ont données le code d'erreur
deaca461 .
Utilisation de nbd pour restaurer les données
Les opérations sont inversées par rapport à la sauvegarde (après avoir
crée des partitions d'une taille suffisante pour contenir les données
originales) :
Remise en place de grub
La partition /boot étant la partition /dev/hda2, on lancera grub avec
les commandes suivantes:
$ grub
grub> root (hd0,1)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+16 p (hd0,1)/grub/stage2 /grub/menu
.lst"... succeeded
Done.
grub> quit
Mentions légales
-
Maxtor® est une marque déposée de Maxtor Corporation.
|