Mesclar blocos não-nulos de arquivos grandes (esparsos) A em arquivos grandes B

6

Eu tenho duas imagens de disco parciais de um disco rígido com falha. O arquivo B contém a maior parte do conteúdo do disco, com intervalos em que as leituras do setor falharam. O arquivo A é o resultado de informar ddrescue para tentar novamente todos os setores com falha, portanto, é quase totalmente lacunas, mas contém alguns lugares onde releia com sucesso. Agora preciso mesclar o conteúdo interessante do Arquivo A no Arquivo B. O algoritmo é simples:

while not eof(A):
   read 512 bytes from A
   if any of them are nonzero:
       seek to corresponding offset in B
       write bytes into B

e eu poderia sentar e escrever isso sozinho, mas eu gostaria de saber se alguém já escreveu e depurou isso.

(Para complicar as coisas, devido ao espaço limitado, o Arquivo B e o Arquivo A estão em dois computadores diferentes - é por isso que eu não disse apenas ddrescue para preencher as lacunas em B em primeiro lugar - mas A pode ser transferido através da rede com relativa facilidade, sendo escasso.

    
por zwol 26.11.2013 / 19:10

1 resposta

6

Seu algoritmo é implementado no GNU dd .

dd bs=512 if=A of=B conv=sparse,notrunc

Por favor, verifique isso com alguns arquivos de teste de sua escolha. Você não quer inadvertidamente danificar seu arquivo B . Um algoritmo melhor seria verificar se B também tem zeros nessa posição, o que é algo que dd não faz.

Quanto a dois computadores diferentes, você tem várias opções. Use um sistema de arquivos de rede que suporte buscas em gravações (nem todas); transferir o arquivo antecipadamente; ou canalizar através do SSH da seguinte forma:

dd if=A | ssh -C B-host dd of=B conv=sparse,notrunc
# or the other way around
ssh -C A-host dd if=A | dd of=B conv=sparse,notrunc

A opção ssh -C permite a compactação; você estaria transferindo gigabytes de zeros pela rede.

    
por 26.11.2013 / 19:37