Existe alguma maneira de acelerar o ddrescue?


26

Eu tive um acidente no disco rígido de 500 GB há cerca de 5 dias. Eu usei ddrescuea partição importante há alguns dias e está em "Aparar blocos com falha" há quase 2 dias.

Comando original:

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

Saída atual:

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...

O comando original usou o ddrescue -nparâmetro, e eu reiniciei o processo algumas vezes, conforme necessário (e parecia retomar exatamente de onde parou).

Existe alguma maneira de acelerar esse processo?

Editar: Seis horas depois, este é o status atual:

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...

Parece que, enquanto os "erros" estão em contagem regressiva dolorosamente lenta, o ipos / opos está em contagem regressiva da quantidade de dados que precisa processar e parece estar funcionando a uma taxa de 750MB / hora. Nesse ritmo, ele será concluído em ~ 53 horas. Caramba.

Editar # 2: dois dias depois, ainda em execução. No entanto, há esperança. Ele passou da parte "Aparar blocos com falha" e para a próxima fase "Dividir blocos com falha". De qualquer forma, o que deve ser retirado da visualização dessa pergunta é que isso definitivamente leva muito tempo quando uma boa quantidade de dados / erros está envolvida. Minha única esperança é que eu possa recuperar com êxito alguns dados importantes quando tudo estiver dito e feito.

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...

2
É por design, provavelmente. Ele faz vários passes para extrair o máximo de dados como possível
Journeyman Geek

17
Bater um disco rígido menor próxima vez ;-)
Joey

Meu 4TB levou três semanas para chegar à fase de recorte ... (Tenho certeza de que está tudo em backup, mas não faz mal para resgatar;)) ... e graças a @nza, só espero Vou terminar no Natal
Stephen

Bem ... hoje de manhã calculei que demoraria cerca de uma semana com base na velocidade do corte e pronto! Está feito! Então, ~ 3 semanas para aparar e ~ 3 semanas. A raspagem foi muito rápida, apesar de serem 1,93% dos dados - acho que os bons e os maus são rápidos ... apenas o intervalo horrivelmente lento? (Eu estou correndo novamente com -Mapenas no caso de reboots e desta manhã dist-upgrade feito algum tipo de confusão)
Stephen

Respostas:


14

Observei que usar a opção -n(sem divisão) junto com -r 1(tentar novamente) e definir -c(tamanho do cluster) para um valor menor pode ajudar.

Minha impressão é que o passo de divisão é muito lento, pois ddrescuedivide e divide novamente as áreas danificadas. Isso leva muito tempo porque ddrescuetenta restaurar pequenas porções de dados. Então, eu prefiro usar -n(sem-split) em conjunto com -c 64, -c 32, -c 16, aso

Provavelmente, o -n(sem divisão) deve sempre ser usado para uma primeira passagem nas direções para frente e para trás. Parece que quanto mais os dados foram divididos, mais lenta a clonagem, embora eu não tenha certeza disso. Presumo que quanto maiores as áreas não tratadas, o melhor para executar ddrescuenovamente, porque os setores mais contíguos devem clonar.

Como estou usando um arquivo de log, não hesite em cancelar o comando com Ctrl+ Cquando a velocidade de leitura de dados se tornar duas baixa.

Também uso o modo -R(reverso) e, após uma primeira passagem, geralmente me proporciona velocidades mais altas lendo para trás do que para frente.

Não está claro para mim como os setores tentados novamente ( -r N) são tratados ao executar o ddrescuecomando novamente, especialmente ao alternar os -Rcomandos de clonagem forward (padrão) e reverse ( ). Não tenho certeza se o número de vezes que eles foram tentados é armazenado no arquivo de log e provavelmente o trabalho é feito novamente inútil.

Provavelmente, o -isinalizador (posição de entrada) também pode ajudar a acelerar as coisas.


8

Pode ser muito difícil ver o progresso de ddrescue, mas há outro comando incluído chamado ddrescuelog.

Um comando simples ddrescuelog -t YourLog.txtproduzirá essas informações agradáveis:

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%)

Você pode até usá-lo enquanto ddrescueestiver em execução ...


3 semanas para obter o meu 4TB para chegar ao aparar: errsize: 289420 MB, errors: 34926 ( 7.23%) non-trimmed: 288130 MB, in 105407 area(s) ( 7.20%) non-split: 1243 MB, in 185 area(s) ( 0.03%) bad-sector: 47490 kB, in 92728 area(s) ( 0.00%); (... Mas, graças pilhas para o comando!
Stephen

4

Mais uma maneira de monitorar o progresso do ddrescue (no Linux, pelo menos) é através do uso de strace.

Primeiro, encontre o PID para o processo ddrescue usando "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

Em seguida, execute "strace" nesse processo. Você verá algo como:

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

...e assim por diante. A saída é rápida e feia, então eu a canalizo através do "grep" para filtrar as coisas que me interessam:

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

Nesse exemplo, o "1702212676608" equivale a "a quantidade de dados que ainda precisa ser processada no disco de 2 TB que você está tentando recuperar". (Sim. Ai.) O ddrescue está cuspindo um número semelhante - embora "1720 GB" - na saída da tela.

strace oferece um fluxo de dados de granularidade MUITO maior para você examinar; é mais uma maneira de avaliar a velocidade do ddrescue e estimar uma data de conclusão.

Executá-lo constantemente é provavelmente um plano ruim, pois competiria com o ddrescue pelo tempo de CPU. Comecei a canalizá-lo para "head" para que eu possa pegar os 10 primeiros valores:

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

Espero que isso ajude alguém.


Existe strace -e lseek …para isso - embora pv -d <pid>possa ser mais bonito.
grawity

3

Se seu objetivo é obter a maior parte dos dados intactos, você pode acelerar sua extração. Mas se você realmente deseja resgatar o máximo de dados possível, deixe o ddrecue morder cada um e o caminho a seguir.


2
Como exatamente fazer isso?
William Entriken

3

Eu descobri que, jogando com o parâmetro -K, você pode acelerar as coisas. Pelo que vi, se o ddrescue encontrar um erro ao executar com a opção -n, tenta pular uma quantidade fixa de setores. Se ainda não consegue ler, pula o dobro do tamanho. Se você tiver grandes áreas danificadas, poderá indicar um grande valor de K (por exemplo, 100M) e, portanto, o salto em um erro será maior na primeira vez e será mais fácil evitar áreas problemáticas rapidamente no primeiro passado.

A propósito, existe uma maravilhosa aplicação gráfica para analisar o log.

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


0

Qual é o sistema de arquivos do disco rígido em que você salva a imagem de recuperação e o arquivo de log? Acabei de fazer a experiência de que o resgate de um disco rígido interno de 500 GB (conectado via SATA) em um laptop executando Linux Mint a partir de um pendrive, salvando a imagem de resgate e o arquivo de log em um exFatdisco rígido USB formatado, estava sendo iniciado lentamente (1-2 MB / s), mas após cerca de 250 GB, ele estava apenas rastejando a <100 KB / s. Parecia ficar mais lento quanto maior o tamanho do arquivo de imagem de resgate.

Em seguida, mudei a imagem de resgate e o arquivo de log para outro local temporário, reformatei o disco rígido USB com o ext4sistema de arquivos, movi os arquivos novamente e retomei o processo ddrescue - e agora ele roda com 1-20MB / s novamente (flutuando mas cerca de 7 MB / s em média)!

Parece exFatque não funciona muito bem com arquivos muito grandes (várias centenas de gigabytes).


0

Para uma opção mais rápida e rápida para resgatar o disco, você pode usar um arquivo de script sh e executá-lo com "sh filename.sh". Ele contém esta linha mostrada, basta repetir "sudo ddrescue" e "sleep 3" mais algumas vezes, o sono é usado para fazer a unidade descansar alguns segundos; pode ser bom por alguns motivos:

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

O -r0 está sem respostas. O -e +0 é para sair com 1 erro. O -T 1s sai com 1 segundo de falha na leitura. Existem opções que podem ser usadas como -d para direct e -n para nenhum raspar, o que pode acelerar.

Você pode usar -R depois de concluir com a opção -A uma vez, que reverterá e removerá todo o tamanho do erro e começará novamente para trás. Significa que ele lerá os erros de maneira diferente.


-1

dd_rhelp é um script de shell que usa o dd_rescue "[...] em todo o disco, mas ele tenta coletar o máximo de dados válidos antes de tentar por anos em grupos de badsectors"

é bastante antigo (2012), mas ainda funciona. ainda não tentei o ddrescue.


A questão é sobre o GNU ddrescue (NÃO o dd_rescue), que é precisamente uma substituição aprimorada desse script.
kinokijuf
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.