Skip to content

Blog Net-Expression

Four-tout informatique !

Archive

Archive for September, 2012

En fin de vie, les disques durs ont tendance à faire de plus en plus d’erreurs de lecture / écriture.
Parfois, ils ne donnent aucun signe de fatigue, et lache d’un seul coup.

Utiliser ddrescue

Un disque dur pourrait en simplifiant beaucoup être une énorme liste d’octets. En fin de vie, une partie de cette liste devient difficilement accessible. Le système se bloque, devient lent…

Dans l’univers Unix, la commande dd permet de copier les octets d’un device vers un autre. Mais elle ne gère pas les eventuelles erreurs qui se produisent lorsqu’un disque dur est en fin de vie. Au contraire la commande ddrescue est concue pour travailler dans ce contexte particulier, et fournie un ensemble d’outils permettant d’insister la ou ca fait mal !. Par exemple, en re-essayant de lire plusieurs fois les secteurs illisibles, de facon aléatoire, en essayant de lire des blocs de données de plus en plus petits…

Faire l’état des lieux

Pour commencer, il faut identifier les disques durs via la commande suivante :

# fdisk -l

Disk /dev/sdb: 3000.6 GB, 3000591900160 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x2681f139

Device Boot Start End Blocks Id System
/dev/sdb1 1 243201 1953512001 7 HPFS/NTFS

Disk /dev/sdc: 2000.4 GB, 2000397852160 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2681f139

Device Boot Start End Blocks Id System
/dev/sdc1 1 243201 1953512001 7 HPFS/NTFS

Disk /dev/sda: 203.9 GB, 203927027200 bytes
255 heads, 63 sectors/track, 24792 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004fc5d

Device Boot Start End Blocks Id System
/dev/sda1 1 973 7811072 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 973 1459 3906560 82 Linux swap / Solaris
/dev/sda3 1459 24793 187427840 83 Linux

La première passe

Le but de la première passe est de récupérer un maximum de données en un minimum de temps tout en se faisant une idée des dégats (difficulté de récupérer les données, zones endommagées plus ou moins grandes, situées à des endroits plus ou moins critiques).

Ici, on lit le disque sdc et on copie son contenu sur sdb en commencant au début du disque. Il va de soit que le disque cible “sdc” doit être sain pour s’assurer le maximum de chance ! A chaque passe ou tentative, le résultat de la lecture est inscrit dans le fichier “ddrescue.media.log”; si bien que les blocs illisibles ne seront pas relus (si les zones endommagées sont nombreuses, le fichier peut vite enfler, mieux vaut s’assurer qu’il y aura suffisament de place dès le début !).

# ddrescue -n -i 0 /dev/sdc /dev/sdb ddrescue.media.log

Souvent c’est le début du disque qui pose problème, afin de gagner du temps si vous remarquez que seul le début du disque est vraiment très endommagé, vous pouvez sauter certaines zones.

# ddrescue -n -i 200G /dev/sdc /dev/sdb ddrescue.media.log

Par exemple, ici nous commencons une passe à partir des 200Go (soit au 1/10 des 2To). En pratiquant de la sorte et par itérations, il sera possible de récupérer un maximum de données, en convergeant très rapidement vers les blocs de données qui posent vraiment problèmes.

Grace au fichier “ddrescue.media.log”, il est possible d’arreter et de reprendre et de travailler par étape.

A la fin de la premiere passe voici ce qu’on peut obtenir…

# ddrescue -n -i 0 /dev/sdc /dev/sdb ddrescue.media.log
Press Ctrl-C to interrupt
Initial status (read from logfile)
rescued: 2 TB, errsize: 65536 B, errors: 6
Current status
rescued: 2 TB, errsize: 65536 B, current rate: 0 B/s
ipos: 0 B, errors: 6, average rate: 0 B/s
opos: 0 B, time from last successful read: 0 s
Finished

  • rescued 2 TB : nous indique que nous avons récupéré environ 2To de données ! (Youhou)
  • errors 6 : sur la totalité du disque 6 blocs de données non pas pu être lu dès la première tentative…
  • errsize 65536 B : au total il manque pour le moment 65536B soit 65Ko sur les 2To ! Une paille !

Récupérer le reste !

Dans le but de récupérer les données “oubliées” lors de la première passe, nous allons demander à ddrescue de lire des blocs plus petits, et de réessayer plusieurs fois. Ici il re-essaye 2 fois, et tente de récupérer 16 secteurs à la fois…

# ddrescue -i 0 -c 16 -r 2 /dev/sdc /dev/sdb ddrescue.media.log

Dans notre cas précis, le disque dur ayant très peu de données illisibles, nous allons aller directement droit au but :

# ddrescue -i 0 -c 1 -r 5 /dev/sdc /dev/sdb ddrescue.media.log

Dans mon cas cela n’aura servi à presque rien, en insistant un peu, j’ai réussi à récupérer encore 15Ko !…

Automatiser la récupération

Il existe un script particulierement efficace dd_rhelp, il permet d’automatiser ces différentes passes avec ddrescue, en commencant la ou il peut lire, puis en insistant sur les blocs difficiles. Tant qu’il y a des données à récupérer il continuera inlassablement à parcourir le disque dans l’espoir de récupérer encore des données (certains n’hesite pas à le laisser tourner plusieurs semaines !)…

Que faire ensuite ?

Reprendre une vie normale

J’ai eu de la chance cette fois, à l’aire du tout numérique, perdre des données c’est parfois terrible… La vidéo de la naissance du petit dernier, la photo de votre première conquète amoureuse, ou vos fiches de paye que vous aviez soigneusement scannées une à une… Meme si mettre en place une redondance est souvent cher, long à mettre en place, fastidieux… Je vous engage vivement à le faire… Certaines données n’ont simplement pas de prix…

Introduction

Je viens d’acheter un disque dur de 3To (ou 3TB – Tera Bytes) et je viens de me rendre compte que la partition que je viens de créer en ext3 via cfdisk fait environ 850Go ! Or ce n’est pas ca que j’avais demandé au départ !… lol !

Créer une table GPT sur un disque dur

Au lieu d’utiliser cfdisk, nous allons utiliser gparted qui va nous permettre de créer une table GPT.

faites attention aux disques sur lesquels vous faites les manipulations suivantes)

Ici je crée une nouvelle table GPT sur le disque /dev/sdc en favorisant un maximum les performances.


# parted -s -a optimal /dev/sdc mklabel gpt

Créer une partition ext4 de plus de 2To

On crée ensuite une partition de type ext4 recouvrant l’intégralité du disque dur.


# parted -s -a optimal /dev/sdc mkpart primary ext4 0% 100%

Pour vérifier le résultat de notre action :


# parted /dev/sdc
GNU Parted 2.3
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: ATA ST3000DM001-9YN1 (scsi)
Disk /dev/sdc: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number Start End Size File system Name Flags
1 1049kB 3001GB 3001GB primary

(parted) q

Formater la partition en ext4

Pour formater le disk en ext4 et sans blocs réservés (inutiles dans le cadre d’une partition de sauvegarde):


# mkfs.ext4 -m 0 /dev/sdc1

Monter la partition ext4


# mkdir /mnt/sdb1
# mount -t ext4 /dev/sdb1 /mnt/sb1