Como posso mesclar duas imagens do ddrescue?

6

Eu tenho duas imagens ddrescue criadas a partir de tentativas de recuperação contíguas da mesma mídia. As duas imagens são do mesmo tamanho, mas possuem dados complementares:

$ od part-one/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 113056 016517 102014 074371 144073 000000 000000 000000
3242365233006 000000 000000 000000 000000 000000 000000 000000 000000
3242365233026
$ od part-two/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 000000 000000 000000 000000 000000 124616 163450 064251
3242365233006 074567 134433 012742 022160 044301 054235 140604 020633
3242365233026

Como posso mesclá-los em uma única imagem completa?

Detalhes

  • A segunda imagem é simplesmente uma continuação da primeira tentativa de recuperação, à la:

    $ ddrescue corrupt-partition part-one/ddrescue_image part-one/ddrescue_log
    $ mkdir part-two; cp part-one/ddrescue_log part-two/ddrescue_log
    $ ddrescue corrupt-partition part-two/ddrescue_image part-two/ddrescue_log
    
  • A segunda imagem é quase inteiramente zeros, mas contém 18 KB de dados recuperados espalhados por 1847 regiões isoladas.

  • Eu tentei usar a técnica mencionada em esta lista de discussão ,

    $ ddrescue --domain-logfile=part-two/ddrescue_log part-two/ddrescue_image part-one/ddrescue_image part-one/ddrescue_log
    
    
    GNU ddrescue 1.16
    Press Ctrl-C to interrupt
    Initial status (read from logfile)
    rescued:   937286 MB,  errsize:   62976 B,  errors:     122
    Current status
    rescued:   937286 MB,  errsize:   62976 B,  current rate:        0 B/s
       ipos:         0 B,   errors:     122,    average rate:        0 B/s
       opos:         0 B,     time since last successful read:       0 s
    Finished
    

    mas parece que não mudou nada.

por ændrük 14.07.2013 / 06:15

2 respostas

4

Se você sabe exatamente qual região dos dados deseja copiar, use dd :

dd conv=notrunc if=input of=output seek=123456 skip=123456 bs=4k count=128

Isso iria copiar 128 blocos de 4k da entrada para a saída, começando em 123456.

Seria prudente fazer backup dos blocos que você está prestes a substituir primeiro:

dd if=output skip=123456 bs=4k count=128 of=output-backup-bs4k-pos123456

Se você não sabe qual região dos dados copiar ou não tem certeza, GNU dd por acaso conhece sparse .

dd conv=notrunc,sparse if=input of=output bs=4k

Isso copia todos os blocos de entrada de 4k diferentes de zero para a saída. Use bs=512 se seus blocos forem menores!

Observe que não há um backup com esse método, então é melhor copiar o arquivo, se for importante.

    
por 14.07.2013 / 10:53
1

Tente algo assim?

dd if=part-one/ddrescue_image bs=1 count=227966006784 >result
dd if=part-two/ddrescue_image bs=1 seek=227966006785 >>result

O tamanho do bloco pequeno irá tornar isso muito lento; se você puder refatorar para usar um tamanho de bloco maior e ainda aterrissar no deslocamento correto, isso deve torná-lo muito mais rápido.

Se você não puder fazer isso, dividir a operação em mais invocações de dd provavelmente é uma idéia idiota - leia com um tamanho de bloco grande como 65536 até o limite de 64K mais próximo, então vá devagar de lá (talvez descendo para um tamanho de bloco de 1K até o limite de 1K mais próximo antes de chegar até os bytes individuais), então vá mais rápido novamente assim que terminar com a manipulação refinada.

    
por 14.07.2013 / 08:53