É seguro usar múltiplos '--input-position' diferentes com o ddrescue?

0

Eu preciso resgatar dados de um disco rígido grande de 2 TB e estou fazendo isso em alguns Live-Linux em algumas VMs, onde o problemático disco rígido está conectado ao uso de USB 3 e a VM fornece um disco virtual do disco rígido. tamanho necessário localmente para receber os dados. Em seguida, executei a seguinte chamada, simplesmente para ver como estão as coisas:

ddrescue -f /dev/sdc /dev/sdb /mnt/sda1/ddrescue.map

sdc é o dispositivo quebrado em USB, sdb é o disco virtual para receber os dados, sda1 é para armazenamento temporário e formatado usando Ext4.

As coisas começaram a funcionar rapidamente, ddrescue conseguiu ler ~ 45 GB de dados em minutos e, em seguida, as coisas ficaram mais lentas, lendo apenas alguns bytes por segundo durante dias. Então o dispositivo foi obviamente quebrado nessas partes e eu tentei simplesmente pular aqueles usando várias invocações diferentes de --input-position=[...]GB após a outra. Dependendo de onde eu pulei, as coisas começaram a ler rápido novamente, até que eles ficaram lentos novamente e eu pulei novamente usando outra invocação. O importante é notar que a posição de entrada e saída impressa por ddrescue sempre esteve em sincronia! Eu também não alterei manualmente nada no arquivo de mapeamento fornecido ou o excluí ou o que quer que seja, sempre foi um e o mesmo arquivo e somente gerenciado pelo ddrescue em si.

Depois, mudei a abordagem um pouco e decidi não usar o --input-position manualmente, mas o seguinte:

ddrescue -f --min-read-rate=1MB --skip-size=1MB /dev/sdc /dev/sdb /mnt/sda1/ddrescue.map

Portanto, sempre que ddrescue reconhecesse partes lentas, ignorava blocos de dados quebrados e continuava a leitura. Novamente, a posição de entrada e saída estava em sincronia e o contador de dados lidos e resgatados aumentava o tempo todo. Até o ponto foram ddrescue terminados e dizem ter resgatado ~ 650 GB de dados.

O problema é que depois de finalmente olhar para os arquivos de disco virtual, parece que apenas ~ 160 GB de dados são realmente armazenados. Além disso, o último registro de data e hora da gravação foi alguns dias muito antigo. Portanto, por algum motivo, ddrescue achou que estava lendo muitos dados, mas não parecia escrevê-los corretamente nos locais do disco virtual, onde os liava do disco quebrado. No final, pelo que entendi, o disco virtual deveria ter pelo menos o tamanho ddrescue informado sobre a quantidade de dados que ele salvou.

Tenho a sensação de que ddrescue leu corretamente todos os dados que disse, mas simplesmente substituiu os dados já resgatados em invocações subsequentes. Então, enquanto eu acho que reconheci --input-position para ler, parece ter escrito sempre começando na posição 0 novamente no alvo.

Obviamente, não especifiquei a posição inicial para gravar dados, mas de acordo com os docs isso não deve ser necessário e ddrescue sempre imprimiu a posição de entrada e saída para ser a mesma de qualquer maneira.

-o bytes
--output-position=bytes
Starting position of the image of the rescue domain in outfile, in bytes.
Defaults to '--input-position'. The bytes below bytes aren't touched if 
they exist and truncation is not requested. Else they are set to 0.

Claro que eu não pedi truncamento, de acordo com os documentos, ele não está habilitado por padrão e nem teria trabalhado para a unidade de destino que eu havia especificado:

-t
--truncate
Truncate outfile to zero size before writing to it. Only works for regular
files, not for drives or partitions.

Então, alguma ideia sobre o que pode ter dado errado? Minhas múltiplas invocações com valores diferentes para --input-position já estão erradas? Tem a ver com ler e escrever em drives em vez de partições ou arquivos?

Talvez seja um problema gravar em algum disco virtual? Embora eu não veja por que isso faça alguma diferença, preciso gravar em algum disco virtual e não posso fornecer armazenamento bruto do tamanho necessário.

Obrigado!

    
por Thorsten Schöning 10.10.2018 / 12:24

3 respostas

0

Eu li o manual ddrescue , e em nenhum lugar ele menciona a possibilidade de vários parâmetros input-position .

Este parâmetro é sempre mencionado como "a" ou "the", por isso parece que deve ser único.

A fonte do seu problema pode ser esta frase do manual:

Note that you must keep the original offset between '--input-position' and '--output-position' of the original rescue run.

Isto parece concordar com o seguinte parágrafo:

Ddrescue does not write zeros to the output when it finds bad sectors in the input, and does not truncate the output file if not asked to. So, every time you run it on the same output file, it tries to fill in the gaps without wiping out the data already rescued.

Isso significa que ddrescue lembra os parâmetros da primeira execução, então você sempre deve manter os mesmos parâmetros, ou talvez apenas não especificá-los em execuções subseqüentes (não posso dizer qual é o certo). É bem possível que alguns parâmetros tenham sido lembrados e seus novos foram ignorados nas seguintes execuções.

Se partes das tabelas meta do disco foram danificadas, você pode estar vendo menos dados do que realmente foi recuperado, porque nenhum arquivo parece inclua essas partes.

Os dados que ddrescue não podem salvar precisam ser recuperados por outros produtos de recuperação. Isso pode levar muito tempo e pode até ser impossível para os produtos à sua disposição. Se os dados tiverem que ser recuperados, uma empresa de recuperação profissional ser capaz de fazer isso a partir do disco original, mas esses serviços são caros.

    
por 10.10.2018 / 20:40
0

Is it safe to use multiple different --input-position with ddrescue?

Parece que eu perdi esse exemplo antes, mas isso é realmente o que eu fiz e isso sugere que minha abordagem é suportada:

Example 5: While rescuing a partition in /dev/sda1 to the file hdimage, /dev/sda1 stops responding and begins returning read errors, causing ddrescue to mark the rest of the partition as non-scraped.
     ddrescue -n /dev/sda1 hdimage mapfile        <-- /dev/sda1 fails here
       (restart /dev/sda or reboot computer)
     ddrescue -n -A -i<pos> -O /dev/sda1 hdimage mapfile
       (if /dev/sda1 fails again, restart /dev/sda or reboot computer and
        then repeat the above command as many times as needed until it
        succeeds. <pos> is the position where the drive stopped responding)
     ddrescue -d -r3 /dev/sda1 hdimage mapfile

link

A segunda invocação está claramente documentada para ser repetida com posições diferentes. Em relação a como ddrescue funciona usando seu arquivo de mapeamento, isso também faz sentido, simplesmente porque ele sempre sabe usar esse arquivo cujos blocos já foram lidos.

Portanto, parece que as chances são altas de que o problema no meu caso seja diferente, especialmente o timestamp muito antigo que eu acho que reconheci ser estranho. Talvez eu tenha simplesmente perdido mensagens que ddrescue não está gravando no dispositivo de destino real por algum motivo. A própria VM também estava em outro drive USB, talvez houvesse alguns erros de conexão levando o dispositivo a ser perdido pelo Live-Linux durante o tempo de execução ou algo assim. Eu poderia facilmente ter perdido tais erros em dmesg -T por causa de todos os erros de leitura registrados.

Parece que eu preciso repetir todo o processo ...

    
por 11.10.2018 / 14:56
-1

Como a página man de ddrescue é longa, o uso de ddrescue é muito diferente de acordo com o objetivo e o nível do usuário. Basicamente, se você usa o Live Linux, é melhor executá-lo na máquina phycical em vez da VM, e também conectar o disco ao sATA sem nenhum adaptador sATA / USB.
Entre os outros recursos ddrescue pode ignorar o driver de disco do kernel e os buffers, portanto, ele pode reduzir a leitura repetida inútil de clusters defeituosos. O mapfile (anteriormente chamado de logfile) mantém informações sobre todos os clusters de leitura un / success e é por isso que você pode simplesmente repetir a etapa travada. O ddrescue procura por mapfile antes de iniciar seu trabalho, criá-lo, se ele não existir, lê-lo, se estiver disponível e começar a continuar o trabalho de resgate na última posição registrada. Você não precisa mover a posição inicial com a mão toda vez que o programa falhar!

Você pode usar várias opções para tornar o processo de resgate mais rápido e mais seguro. Você também pode, e é recomendado, pode fazer o processo de recuperação em duas ou mais etapas:

Primeiro passo: leia rapidamente os bons clusters e imediatamente pule o mau.

Segundo passo: lidar com clusters não lidos do passo anterior e usar opções especiais para descobrir quais recursos do disco (NCQ, leia adiante ...) devem ler um setor de uma só vez. Os comandos adequados (eu uso):

ddrescue -n -p -d -r1    /dev/sdd $IMGPATH/disk.img $IMGPATH/disk.log;
ddrescue       -d -r3 -R /dev/sdd $IMGPATH/disk.img $IMGPATH/disk.log;
#         |  |  |  |   |
#         |  |  |  |   revers reading
#         |  |  |  retry read 1x (3x)
#         |  |  direct access to disk (bypass the kernel)
#         |  preallocate diskspace      
#         nonscrap

Se o seu disco aquecer demais ou não gostar de muitos ops / s lidos, você pode retardar a leitura com a opção: --max-read-rate=50M

Portanto, é apenas para o primeiro toque, mas você pode encontrar muitos conselhos em fóruns ou clubes especializados relacionados ao ddrescue .

    
por 10.10.2018 / 14:02