20/04/2011

Cloner une partition système Windows7 avec des 'Bad Sector'
Ceci s'adresse plus particulièrement aux possesseurs de disque ayant un réel problème de 'bad sectors', c'est à dire dont le disque présente déjà des problèmes de fonctionnement et se dirige doucement mais surement vers un arrêt total.

Il s'agit ici de cloner la partition système windows7 présente sur le disque défaillant vers un disque fonctionnel.
Je ne traite pas ici de la partition de 100M qui contient le boot pour certaines éditions de Windows7 mais les instructions sont adaptables.

Cette méthode n'utilise que des logiciels gratuits et nécessite:
Création de la partition sur le disque dur fonctionnel
Dans un premier temps on va créer la partition pour aceuillir la copie, elle devra être: Vous pouvez marquer la partition comme active à cette étape: avec gparted penser à mettre le flag 'boot' avec Windows7 dans le gestionnaire de disque sélectionner "partition active".

Il est recommandé de créer les partitions pour Windows sous Windows par sécurité sinon utiliser gparted:

sudo apt-get install gparted
sudo gparted

Si vous êtes à l'aise avec fdisk vous pouvez utiliser fdisk plutôt que gparted.
Pour les prochaines étapes le nom de votre disque sous linux peut changer /dev/sda1 /dev/sdb1... utiliser gparted pour identifier le disque sur lequel vous voulez travailler à coup sûr, voire débrancher les autres disques.
si vous utiliser le live-cd vous devrez réinstaller les programmes(gparted...) à chaque démarrage, mais ça reste assez rapide.
Récupération des données du disque dur défaillant
Une option simple pour récupérer les données est d'utiliser le live-cd Clonezilla mais si votre disque est vraiment défaillant il y a des chances que Clonezilla échoue aussi. L'outil qu'il nous faut et qui est le seul à pouvoir torturer un diqsue jusqu'à lui faire rendre ses données est ddrescue.
Attention il s'agit de ddrescue pas de dd_rescue:

sudo apt-get install gddrescue
ddrescue permet (entre autres) de copier les données d'une partition vers une autre partition. L'avantage est qu'il travaille avec un fichier de log qui permet de l'interrompre, de tester différentes méthodes.

Une fois que l'on commence ddrescue on peut l'interromre pour le reprendre plus tard (en relançant la même commande) mais tant que l'on en a pas fini avec la récupération des données (qui est l'étape la plus délicate) il ne faut pas "toucher" au disque. Si vous utilisez le live cd pensez à sauvegarder le fichier de log sur un support externe si vous souhaitez récupérer votre partition en plusieurs fois, si vous avez perdu votre fichier de log vous pouvez le reconstruire (Cf liens).

Ici, /dev/sda2 est la partition Windows7 du disque défaillant et /dev/sdb1 est la partition créée à l'étape précedente (utilisez gparted pour repérér le nom de vos disques)

On va procéder en deux phases:
Dans un premier temps on va tenter de récupérer le plus de données possibles en sautant les secteurs repérés comme défectueux (essayer de ne pas interrompre)

sudo ddrescue --no-split /dev/sda2 /dev/sdb1 logfile-sda2
Puis on va essayer de récupérer les secteurs défectueux:

sudo ddrescue --direct --max-retries=3 /dev/sda2 /dev/sdb1 logfile
sudo ddrescue --direct --retrim --max-retries=3 /dev/sda2 /dev/sdb1 logfile

Vous pouvez essayé sans --direct il est possible que ce soit plus rapide.

Ici je transfère les données directement sur le disque dur mais si vous avez des données auquelles vous tenez vraiment sur le disque le mieux est de copier les données vers un fichier de sauvegarde et pas directement sur le disque dur puis d'utiliser ce fichier pour transférer vers la partition crée avant (en fait c'est mieux dans tous les cas).

Voilà quand vous estimez que vous avez récupéré le maxiumum vous pouvez débrancher votre ancien disque dur.
Si votre disque dur était trop abimé pour être récupéré en quasi intégralité, contentez vous de sauvegarder les fichiers qui vous intéressent à partir de la partition copiée. Si vous avez réussi à récupérer toutes les données (ou presque), vous pouvez continuer.
Marquer la partition comme active
Pour pouvoir démarrer sur une partition il faut qu'elle soit marquée comme active. Vérifier que c'est bien le cas à l'aide de gparted, le flag 'boot' doit apparaitre. Si ce n'est pas le cas activer le flag.

A cette étape vous pouvez essayer de booter, qui sait c'est peut-être votre jour de chance.
Utilisation du "repair install" dvd de windows
Bon le boot se plante lamentablement...
On va utiliser les outils du dvd d'install de windows. Ca n'a pas foncitonner pour moi mais c'est le moment d'essayer.
Lancer le dvd windows7, avec un peu de chance le dvd va trouver votre partition Windows7.
Lancer la réparation du démarrage: il est habituellement conseillé de le faire 3 fois de suite avant de considérer que c'est un échec.

Voilà vous restes à utiliser les outils suivants:
  1. bootsect, p.ex:
  2. bootsect /nt60 C:/
  3. Bootrec, p.ex:
  4. Bootrec.exe /FixMbr
    Bootrec.exe /FixBoot
  5. Bcdedit
Je ne détaille pas vous trouverez de nombreux tutoriels sur ces commandes et les différentes options.
Il est possible que c'est options ne suffissent pas dans ce cas on va vérifier que le mbr a été correctement réinstallé et le réinstaller si besoin.
Reconstruction du mbr
Que ce soit avec Clonezilla ou ddrescue il est possible ( voire probable) que Windows7 n'arrive pas à reconstruire efficacement le mbr pour la partition clonée.
On va vérifier le démarrage de Windows à l'aide d'un script de vérification de démarrage: boot script

Télécharger bootinfoscript:
Rendre le script exécutable: sudo chmod +x boot_info_script055.sh Lancer le script: sudo ./boot_info_script055.sh
Si vous voyer un paragraphe de ce type dans le RESULT.txt:

sda1: _________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows Vista/7
    Boot sector info:  According to the info in the boot sector, sda1 starts
                       at sector 819202545. But according to the info from
                       fdisk, sda1 starts at sector 63.
    Operating System:  Windows 7
    Boot files/dirs:   /boot.ini /bootmgr /Boot/BCD
                       /Windows/System32/winload.exe /ntldr

C'est que vous avez un problème que le dvd de windows ne sait pas réparer mais que testdisk gère trés bien.
sudo apt-get install testdisk
sudo testdisk

Sélectionner le disque dur qui contient Windows7 et "proceed"
Puis choisisser "intel"
Puis choisisser "Advanced"
Sélectionner la partition de Windows7 et choisissez "boot"
Puis choisisser reconstruire le mbr
Confirmer et écrire le mbr
Quitter testdisk

A cette étape relancer boot_info_script, RESULT.TXT devrait lister:

sda1: _________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows Vista/7
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  Windows 7
    Boot files/dirs:   /boot.ini /bootmgr /Boot/BCD
                       /Windows/System32/winload.exe /ntldr

Si vous êtes arrivé jusque là il y a de bonne chance que vous puissiez booter votre Windows7.
Dans ce cas profiter de votre premier boot pour programmer une vérification au prochain redemarrage et rédémarrer pour l'effectuer.
Si vous avez la possibilité de lancer une défragmentation faites le juste aprés avoir redémarrer.
Remise à zéro du compteur de 'bad sector' du windows cloné.
Le windows cloné a gardé en mémoire les 'bad sector' de l'ancien disque, nous allons remettre ce compteur en accord avec notre nouveau disque soit à zéro.
Pour cela on va utiliser 'ntfstruncate', c'est un script qui fait parti des extras de ntfsprogs: il va falloir le construire.
sudo apt-get source ntfsprogs
sudo cd linux-ntfs-2.0.0
sudo ./configure && make extra
cd ntfsprogs
On va d'abord récupéré la taille des datas sur le disque: ntfsinfo -i 8 /dev/sda1
et on chercher la ligne "Allocated size" de la section "Dumping attribute $DATA (0x80)" (il y en a deux mais une seule contient l'Allocated size": par exemple:
Dumping attribute $DATA (0x80) from mft record 8 (0x8)
    Resident:          No
    Attribute name:         '$Bad'
    Attribute flags:     0x0000
    Attribute instance:     5 (0x5)
    Compression unit:     0 (0x0)
    Data size:         80673542144 (0x12c8849000)
    Allocated size:         80673542144 (0x12c8849000)
    Initialized size:     0 (0x0)
End of inode reached
On va alors lancer ntfstruncate deux fois de suite en mettant l'allocated size à 0 puis en la remettant à sa vraie taille: ceci permet de remettre à zero le compteur de 'bad sector' de ntfs.
dans la commande suivante remplacer 80673542144 par votre allocated size:
./ntfstruncate /dev/sda1 8 0x80 '$Bad' 0
./ntfstruncate /dev/sda1 8 0x80 '$Bad' 80673542144

Changement de la lettre du disque Système si besoin
Si en bootant windows vous vous retrouvez dans une session temporaire et non pas dans votre vraie session il est possible que la lettre de la partition système est changée.
On ne peut pas changer la lettre par le gestionnaire de disque windows car c'est la partition système, on va donc modifier la clef du registre.
Sans cela votre partition clonée ne sera jamais vraiment fonctionnelle.
Par exemple si votre ancienne partition système Windows7 était J: et qu'elle est maintenant C:
Lancer cmd.exe comme administrateur puis lancer regedit, aller à :
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
Sélectionner la ligne qui contient le lecteur J: et changer J: par une autre lettre Z: par exemple
Puis changer la ligne qui contient C: par J:
Vous pouvez maintenant réattribuer Z: vers J: ou laisser Z: si vous voulez.
Puis juste aprés redémarrer, vous devriez entrer dans votre vraie session.
Quelques liens utiles