32 votes

Y a-t-il un moyen d'accélérer ddrescue?

J'ai eu un crash de disque dur de 500 Go il y a environ 5 jours. J'ai utilisé ddrescue sur la partition importante il y a quelques jours, et ça tourne actuellement sur "Trimming failed blocks" depuis près de 2 jours maintenant.

Commande originale :

ddrescue -n /dev/rdisk1s2 /Volumes/OSXBackup/rdisk1s2.img /Volumes/OSXBackup/rdisk1s2.log

Output actuel :

Status initial (lu depuis le fichier de log) rescued:   248992 Mo,  errsize:   1007 Mo,  erreurs:   15867
Status actuel rescued:   249021 Mo,  errsize:    978 Mo,  taux actuel:    17408 B/s
   ipos:    44405 Mo,   erreurs:   15866,    taux moyen:     2784 B/s
   opos:    44405 Mo,     temps depuis la dernière lecture réussie:       0 s
Trimming des blocs en échec...

La commande originale utilisait le paramètre ddrescue -n, et j'ai redémarré le processus plusieurs fois au besoin (et il semblait reprendre là où il s'était arrêté à chaque fois).

Y a-t-il un moyen d'accélérer ce processus ?

Édit : Six heures plus tard, voici le status actuel :

rescued:   249079 Mo,  errsize:    920 Mo,  taux actuel:      409 B/s
   ipos:    39908 Mo,   erreurs:   15851,    taux moyen:     2698 B/s
   opos:    39908 Mo,     temps depuis la dernière lecture réussie:       0 s
Trimming des blocs en échec...

Il semble que alors que "erreurs" diminue extrêmement lentement, ipos/opos compte la quantité de données qu'il doit traiter, et il semble travailler à un taux de 750 Mo/heure. À ce rythme, cela se terminera en ~53 heures. Oups.

Édit #2: Deux jours plus tard, ça tourne toujours. Cependant, il y a de l'espoir. Il est passé de la partie "Trimming failed blocks" à la phase suivante "Splitting failed blocks". Si quelque chose doit être retenu de la lecture de cette question, c'est que cela prend vraiment beaucoup de temps quand une bonne quantité de données/erreurs est impliquée. Mon seul espoir est de pouvoir récupérer avec succès certaines données importantes une fois que tout sera terminé.

rescued:   249311 Mo,  errsize:    688 Mo,  taux actuel:        0 B/s
ipos:    26727 Mo,   erreurs:   15905,    taux moyen:     1331 B/s
opos:    26727 Mo,     temps depuis la dernière lecture réussie:      20 s
Splitting des blocs en échec...

18voto

user208233 Points 196

J'ai observé qu'en utilisant l'option -n (no-split) en combinaison avec -r 1 (réessayer une fois) et en définissant -c (taille du cluster) à une valeur plus petite peut aider.

Mon impression est que l'étape de division est très lente car ddrescue divise et redivise les zones endommagées. Cela prend beaucoup de temps car ddrescue essaie de restaurer de très petites portions de données. Donc, je préfère utiliser -n (no-split) en combinaison avec -c 64, -c 32, -c 16, etc.

Probablement le -n (no-split) devrait toujours être utilisé pour un premier passage dans les directions avant et arrière. Il semble que plus les données sont divisées, plus le clonage est lent, bien que je ne sois pas sûr de cela. Je suppose que plus les zones non traitées sont grandes, mieux c'est lors de l'exécution de ddrescue à nouveau, car plus de secteurs contigus sont à cloner.

Comme j'utilise un fichier journal, je n'hésite pas à annuler la commande avec Ctrl+C lorsque la vitesse de lecture des données devient trop faible.

J'utilise également le mode -R (Reverse) et après un premier passage, il m'offre souvent des vitesses de lecture plus élevées en marche arrière qu'en marche avant.

Il n'est pas clair pour moi comment les secteurs déjà réessayés (-r N) sont traités lors de l'exécution à nouveau de la commande ddrescue, en particulier lors de l'alternance de commandes de clonage avant (par défaut) et arrière (-R). Je ne suis pas sûr si le nombre de fois où ils ont été essayés est stocké dans le fichier journal et probablement le travail est refait inutilement.

Probablement le drapeau -i (position d'entrée) peut aussi aider à accélérer les choses.

9voto

Anonymous Points 11

Il peut être très difficile de voir la progression de ddrescue, mais il existe une autre commande appelée ddrescuelog.

Une simple commande ddrescuelog -t YourLog.txt affichera ces belles informations :

current pos : 2016 Go, état actuel : trimming
taille de domaine : 3000 Go, dans 1 zone(s)
récupéré : 2998 Go, dans 12802 zone(s) (99,91%)
non essayé : 0 Octets, dans 0 zone(s) (0%)

erreurs : 2452 Mo, erreurs : 12801 (0,08%)
non rogné : 178896 Ko, dans 3395 zone(s) (0,00%)
non divisé : 2262 Mo, dans 9803 zone(s) (0,07%)
secteur défectueux : 10451 Ko, dans 19613 zone(s) (0,00%)

Vous pouvez même l'utiliser pendant que ddrescue est en cours d'exécution...

5voto

MvG Points 1419

Si votre objectif est d'obtenir la majeure partie des données intactes, vous pourriez accélérer leur extraction. Mais si vous voulez vraiment sauver autant de données que possible, laisser ddrecue grignoter chaque élément est le chemin à suivre.

5voto

Nicola Beghin Points 129

J'ai constaté que jouer avec le paramètre -K peut accélérer les choses. D'après ce que j'ai vu, si ddrescue trouve une erreur lors de l'exécution avec l'option -n, il essaie de sauter un nombre fixe de secteurs. S'il ne parvient toujours pas à le lire, il saute le double de la taille. Si vous avez de grandes zones endommagées, vous pouvez indiquer une grande valeur de K (par exemple 100M) et donc le saut en cas d'erreur sera plus important la première fois et il sera plus facile d'éviter rapidement les zones problématiques lors du premier passage.

En passant, il y a une merveilleuse application graphique pour analyser le journal.

http://sourceforge.net/projects/ddrescueview/

4voto

Peter K Points 41

Un autre moyen de surveiller la progression de ddrescue (du moins sur Linux) est d'utiliser strace.

Tout d'abord, trouvez le PID du processus ddrescue en utilisant "ps aux | grep ddrescue"

root@mojo:~# ps aux | grep ddrescue
root     12083  0.2  0.0  15764  3248 pts/1    D+   17:15   0:04 ddrescue --direct -d -r0 /dev/sdb1 test.img test.logfile
root     12637  0.0  0.0  13588   940 pts/4    S+   17:46   0:00 grep --color=auto ddrescue

Ensuite, exécutez "strace" contre ce processus. Vous verrez quelque chose comme :

root@mojo:~# strace -p 12083
Process 12083 attached - interrupt to quit
lseek(4, 1702220261888, SEEK_SET)       = 1702220261888
write(4, "\3101\316\335\213\217\323\343o\317\22M\346\325\322\331\3101\316\335\213\217\323\343o\317\22M\346\325\322\331"..., 512) = 512
lseek(3, 1702220261376, SEEK_SET)       = 1702220261376
read(3, "\3101\316\335\213\217\323\343o\317\22M\346\325\322\331\3101\316\335\213\217\323\343o\317\22M\346\325\322\331"..., 512) = 512
lseek(4, 1702220261376, SEEK_SET)       = 1702220261376
write(4, "\3101\316\335\213\217\323\343o\317\22M\346\325\322\331\3101\316\335\213\217\323\343o\317\22M\346\325\322\331"..., 512) = 512
^C

...et ainsi de suite. La sortie est rapide et moche, donc je la filtre ensuite avec "grep" pour ne garder que ce qui m'intéresse :

root@mojo:/media/u02/salvage# nice strace -p 12083 2>&1|grep lseek
lseek(4, 1702212679168, SEEK_SET)       = 1702212679168
lseek(3, 1702212678656, SEEK_SET)       = 1702212678656
lseek(4, 1702212678656, SEEK_SET)       = 1702212678656
lseek(3, 1702212678144, SEEK_SET)       = 1702212678144
lseek(4, 1702212678144, SEEK_SET)       = 1702212678144
lseek(3, 1702212677632, SEEK_SET)       = 1702212677632
lseek(4, 1702212677632, SEEK_SET)       = 1702212677632
lseek(3, 1702212677120, SEEK_SET)       = 1702212677120
lseek(4, 1702212677120, SEEK_SET)       = 1702212677120
lseek(3, 1702212676608, SEEK_SET)       = 1702212676608
^C

Dans cet exemple, le "1702212676608" correspond à "la quantité de données restant à traiter sur ce disque de 2 To que vous essayez de sauver." (Ouais. Aïe.) ddrescue affiche un nombre similaire - bien que comme "1720 Go" - dans sa sortie à l'écran.

strace vous donne un flux de données à beaucoup plus haute granularité à examiner; c'est une autre façon d'évaluer la vitesse de ddrescue et d'estimer une date de fin.

Le faire fonctionner constamment est probablement une mauvaise idée car cela entrerait en concurrence avec ddrescue pour le temps CPU. J'ai pris l'habitude de le rediriger vers "head" pour pouvoir attraper les dix premières valeurs :

root@mojo:~# strace -p 4073 2>&1 | grep lseek | head

J'espère que cela aidera quelqu'un.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X