web-dev-qa-db-fra.com

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

J'ai eu un crash de disque dur de 500 Go de disque dur il y a environ 5 jours. J'ai utilisé ddrescue sur l'importante partition il y a quelques jours, et cela fait presque 2 jours que le programme "Suppression des blocs échoués" existe déjà.

Commande d'origine:

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

Courant de sortie:

Initial status (read from logfile)
rescued:   248992 MB,  errsize:   1007 MB,  errors:   15867
Current status
rescued:   249021 MB,  errsize:    978 MB,  current rate:    17408 B/s
   ipos:    44405 MB,   errors:   15866,    average rate:     2784 B/s
   opos:    44405 MB,     time from last successful read:       0 s
Trimming failed blocks...

La commande d'origine utilisait le paramètre ddrescue -n et j'ai relancé le processus à plusieurs reprises (le cas échéant) (et il semblait que le processus reprenait exactement là où il s'était arrêté à chaque fois).

Est-il possible d'accélérer ce processus?

Edit: Six heures plus tard, il s'agit du statut actuel:

rescued:   249079 MB,  errsize:    920 MB,  current rate:      409 B/s
   ipos:    39908 MB,   errors:   15851,    average rate:     2698 B/s
   opos:    39908 MB,     time from last successful read:       0 s
Trimming failed blocks...

Il semble que tandis que les "erreurs" décomptent très lentement, les ipos/opos décomptent la quantité de données à traiter, et le taux de fonctionnement semble être de 750 Mo/heure. À ce rythme, il durera environ 53 heures. Beurk.

Edit # 2: Deux jours plus tard, toujours en cours d'exécution. Cependant, il y a de l'espoir. Il a déplacé la partie "Suppression des blocs en échec" et la phase suivante "Division des blocs en échec". Au contraire, ce qui devrait être évité en regardant cette question est que cela prend définitivement beaucoup de temps quand une bonne quantité de données/erreurs est impliquée. Mon seul espoir est que je puisse récupérer avec succès des données importantes quand tout est dit et fait.

rescued:   249311 MB,  errsize:    688 MB,  current rate:        0 B/s
ipos:    26727 MB,   errors:   15905,    average rate:     1331 B/s
opos:    26727 MB,     time from last successful read:      20 s
Splitting failed blocks...
26
Matt Beckman

J'ai constaté que l'utilisation de l'option -n (sans division) avec -r 1 (réessayer une fois) et de définir -c (taille du cluster) sur une valeur inférieure peut aider.

Mon impression est que l'étape de division est très lente car ddrescue divise et divise à nouveau les zones endommagées. Cela prend beaucoup de temps car ddrescue essaie de restaurer de très petites parties de données. Donc, je préfère utiliser -n (non divisé) avec -c 64, -c 32, -c 16, a.s.o.

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 ont été fractionnées, plus le clonage a été lent, même si je ne suis pas sûr de cela. Je suppose que plus les zones non traitées sont grandes, plus il est préférable d’exécuter à nouveau ddrescue, car plusieurs secteurs contigus doivent être clonés.

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

J'utilise également le mode -R (Reverse) et, après un premier passage, cela me donne souvent des vitesses de lecture plus élevées que vers l'avant.

Je ne vois pas comment les secteurs déjà retentis (-r N) seront traités lors de la prochaine exécution de la commande ddrescue, en particulier lors de l’alternance des commandes de clonage (par défaut) et inverses (-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 que le travail est à nouveau inutile.

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

14
user208233

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

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

current pos:     2016 GB,  current status: trimming
domain size:     3000 GB,  in    1 area(s)
rescued:     2998 GB,  in 12802 area(s)  ( 99.91%)
non-tried:         0 B,  in    0 area(s)  (  0%)

errsize:     2452 MB,  errors:   12801  (  0.08%)
non-trimmed:   178896 kB,  in 3395 area(s)  (  0.00%)
non-split:     2262 MB,  in 9803 area(s)  (  0.07%)
bad-sector:    10451 kB,  in 19613 area(s)  (  0.00%)

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

8
nza

Un autre moyen de surveiller les progrès de ddrescue (sous Linux, du moins) consiste à utiliser strace.

Tout d’abord, recherchez 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

Puis lancez "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

...etc. La sortie est rapide et moche, alors je la transfère ensuite via "grep" pour filtrer les éléments qui me tiennent à cœur:

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, "1702212676608" équivaut à "la quantité de données qui doit encore être traitée sur le disque de 2 To que vous essayez de récupérer." (Ouais. Aïe.) Ddrescue crache un nombre similaire - bien que "1720 Go" - dans sa sortie à l'écran.

strace vous donne un flux de données BEAUCOUP de granularité supérieure que vous pouvez examiner; C'est une autre façon d'évaluer la vitesse de ddrescue et d'estimer une date d'achèvement.

L'exécuter constamment est probablement un mauvais plan car il concurrencerait ddrescue pour le temps processeur. Je me suis mis à la "tête" pour pouvoir saisir les 10 premières valeurs:

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

J'espère que ça aide quelqu'un.

4
Peter K

Si votre objectif est d’obtenir la majeure partie des données intactes, vous pouvez accélérer leur extraction. Mais si vous voulez vraiment récupérer autant de données que possible, laissez-vous ddrecue grignoter à tout moment.

3
MvG

J'ai constaté que jouer avec le paramètre -K pouvait accélérer les choses. D'après ce que j'ai vu si ddrescue trouve une erreur lorsque l'exécution avec l'option -n tente de sauter un nombre fixe de secteurs. S'il ne peut toujours pas lire, il double la taille. Si vous avez de grandes zones endommagées, vous pouvez indiquer une valeur K élevée (par exemple 100M). Ainsi, le saut d'erreur sera plus important la première fois et il sera plus facile d'éviter les zones problématiques dans le passé.

À propos, il existe une application graphique formidable pour analyser le journal.

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

3
Josep

Quel est le système de fichiers du disque dur sur lequel vous sauvegardez l'image de secours et le fichier journal? Je viens de faire l'expérience que sauver un disque dur interne de 500 Go (connecté via SATA) sur un ordinateur portable sous Linux Mint à partir d'une clé USB, en sauvegardant l'image de secours et le fichier journal sur un disque dur USB au format exFat, commençait plutôt lentement (1-2 Mo)/sec) mais après environ 250 Go, il était seulement rampant à <100 Ko/sec. Plus le fichier d’image de secours était volumineux, plus il semblait ralentir.

Ensuite, j'ai déplacé l'image de secours et le fichier journal vers un autre emplacement temporaire, reformaté le disque dur USB avec le système de fichiers ext4, remis les fichiers dessus et repris le processus de sauvegarde (ddrescue) - et maintenant, il fonctionne à nouveau avec 1-20 Mo/s ( fluctuant mais autour de 7 Mo/sec en moyenne)!

On dirait que exFat ne fonctionne pas très bien avec des fichiers très volumineux (plusieurs centaines de giga-octets).

0
Dirk

dd_rhelp est un script shell qui utilise dd_rescue "sur votre disque entier, MAIS il essaiera de rassembler le maximum de données valides avant d'essayer de âges sur des tas de mauvais secteurs "

c'est assez vieux (2012) mais ça fonctionne toujours. Je n'ai pas encore essayé ddrescue.

0
Costin Gușă

Pour une option plus rapide et rapide pour sauver le disque, vous pouvez utiliser un fichier de script sh et exécuter le fichier avec "sh filename.sh". Il contient cette ligne, il suffit de répéter "Sudo ddrescue" et "dormir 3" quelques fois de plus, le sommeil est utilisé pour que le lecteur se repose quelques secondes.

#! /bin/sh -e  
Sudo ddrescue -d -r0 -e +0 -T 1s -n /dev/drivepartition file.img log.logfile 
sleep 3

Le -r0 est sans réponses. Le -e +0 est pour la sortie sur 1 erreur. Les -T 1 se terminent avec une lecture avec échec d'une seconde. Il existe des options qui peuvent être utilisées en tant que -d pour direct et -n pour aucune suppression, ce qui peut accélérer.

Vous pouvez utiliser -R après avoir terminé avec l'option -A une fois, qui inversera et supprimera toutes les erreurs et recommencera à l'envers. Cela signifie qu'il lira les erreurs différemment.

0
Dealazer