Notes

Programmes Projet Speedtouch Projet Snoopy Projet eciadsl La recette du pain Source Mage BeOS Mon CV Mon blog Notes On nous prend pour des cons! Don
Programmes
Projet Speedtouch
Projet Snoopy
Projet eciadsl
La recette du pain
Source Mage
BeOS
Mon CV
Mon blog
Notes
On nous prend pour des cons!
Don
en fr

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) :
  • Sur la machine défectueuse (adresse IP : 192.168.1.2):
    nbd-server 2222 /dev/hda5
    
  • Sur la machine de sauvegarde :
    nbd-client 192.168.1.2 2222 /dev/nd0
    mount /dev/nd0 /mnt/falcon/hda5
    cd /home/falcon/hda5
    cp -Rpd . /mnt/falcon/hda5
    umount /dev/nd0
    nbd-client -d /dev/nd0
    

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.
Valid XHTML 1.0! CSS Valide !
Benoît Papillault