Mesclando 2 saídas ddrescue do mesmo drive eficientemente

3

Estou tentando resgatar uma partição em um disco rígido com falha de 500 GB em /dev/sdb usando ddrescue para uma segunda unidade de 1 TB. O comando ddrescue que eu uso para a primeira passagem é:

ddrescue -n /dev/sdb2 core.img core.log

seguido pela segunda passagem:

ddrescue -d -r 3 /dev/sdb2 core.img core.log

O problema é que, acidentalmente, digito errado o nome da imagem para o segundo comando. Em vez de core.img , eu escrevo core.ing e não percebi até a manhã seguinte, quando a segunda passagem seguiu seu curso, e core.log foi sobrescrito para informar um sucesso de 100%.

Agora estou preso com 2 arquivos enormes. Re-executar toda a tarefa não é possível, pois ainda estou resgatando sdb3 . Eu já verifiquei com hexedit e o arquivo 2 complementa um ao outro (ou seja, se no deslocamento 0x5000 a 0x7000 core.img é preenchido com zero, então o mesmo deslocamento em core.ing é preenchido com os dados reais, vice-versa). / p>

Estou pensando em dd -ing a core.img to /dev/sdc2 (a unidade de substituição para sdb I preparada) e depois de alguma forma copie somente os bytes não-zero em core.ing to /dev/sdc2 , mas não tenho certeza de como copiar somente os bytes diferentes de zero e usar o que, pois as soluções que considero são muito incômodas e levarão uma eternidade para serem concluídas.

Para referência, estou executando o SystemRescueCD 4.9.6 com base no Gentoo, sdb2 é NTFS.

    
por Dariel 17.04.2017 / 15:09

1 resposta

2

Como posso mesclar dois resgates diferentes?

(Isso assume o% GNUddrescue)

tl; dr :

  1. Gere um arquivo de mapeamento / logfile para a primeira cópia: ddrescue --generate-mode infile outfile mapfile

  2. Crie uma cópia mesclada de 2º → 1º conforme descrito em um postar na lista de e-mail ddrescue : ddrescue -m logfile2 image2 image1 logfile1

1. Gere um arquivo de log para a primeira imagem

Isso é um pouco complicado, já que você efetivamente não tem um arquivo de log para a primeira passagem. No entanto, você pode gerar um:

When ddrescue is invoked with the --generate-mode option it operates in "generate mode", which is different from the default "rescue mode". That is, if you use the '--generate-mode' option, ddrescue does not rescue anything. It only tries to generate a mapfile for later use.

...

Don't despair (yet). Ddrescue can in some cases generate an approximate mapfile, from infile and the (partial) copy in outfile, that is almost as good as an exact mapfile. It makes this by simply assuming that sectors containing all zeros were not rescued.

... you can generate an approximate mapfile with this command:

ddrescue --generate-mode infile outfile mapfile

(ênfase minha)

do GNU ddrescue manual ; seção 12, ' Gerar modo '.

Então você pode fazer isso para a primeira imagem (o que eu sugiro renomear para evitar confusão, por exemplo, core-1.img ):

ddrescue -G /dev/sdb2 core-1.img core-1.log

"Ainda estou lendo de /dev/sdb , gerando um log de intercomunicação com isso?"

Observe que ddrescue reconstrói a partir do outfile (neste caso, core-1.img ) principalmente, com muito poucas leituras de infile . Eu testei isso com inotifywatch :

$ inotifywatch 840-linux.img # infile
$ inotifywatch 840-linux2.img # outfile
$ inotifywatch 840-linux2.log
$ ddrescue -G 840-linux.img 840-linux2.img 840-linux2.log

total  close_nowrite  open  filename
6      3              3     840-linux.img
17467  17465   1              1     840-linux2.img

total  access  modify  close_write  close_nowrite  open  filename
196    1       189     2            1              3     840-linux2.log

Portanto, é seguro executar isso enquanto outro processo está rodando em sdb (no caso do OP, outra tentativa de resgate em uma partição diferente ), pois as leituras são insignificantes.

2. Mesclar as duas cópias parciais

Esse tipo de situação surgiu antes :

So now I have two partial images of the drive that mostly don't overlap... and two matching log files to go with them that define the good areas and slow areas skipped.

Felizmente, eles podem ser mesclados usando --domain-mapfile :

--domain-mapfile=file
   Restrict the rescue domain to the blocks marked as 
   finished in the mapfile file. This is useful for 
   merging partially recovered images of backups, or if 
   the destination drive fails during the rescue. Use 
   '-' as file to read from standard in'

E a solução para o problema semelhante envolvia essa opção :

you can merge the images by typing:

cd dir1
ddrescue -m dir2/logfile dir2/image image logfile

This creates the files dir1/logfile dir1/image with all the data currently rescued. Then you can continue the rescue for example like this:

No seu caso, supondo que você tenha gerado um arquivo de log para core.img e rotulado como 1 , e mantido o core.ing e core.log como 2 (para que não haja mais confusão!):

ddrescue -m core-2.log core-2.img core-1.img core-1.log
    
por 17.04.2017 / 16:14