Como separar separadamente cada “bloco” de um arquivo grande

1

Eu estou armazenando alguns arquivos multi-GB em dois discos rígidos. Depois de vários anos em armazenamento off-line (infelizmente em condições longe das ideais), muitas vezes obtenho alguns arquivos com put-rot (as duas cópias diferem) e quero recuperar o arquivo. O problema é que os arquivos são tão grandes que, dentro do mesmo arquivo, em alguns dispositivos de armazenamento, um bit fica podre, enquanto que em outro, um bit diferente fica podre, e nenhum dos discos contém um arquivo não corrompido. p>

Portanto, em vez de calcular as somas de verificação MD5 dos arquivos inteiros, gostaria de calcular essas somas de verificação de cada bloco de 1 KB. Com um pedaço tão pequeno, há muito menos chance de que o mesmo bloco de 1 KB seja corrompido em ambos os discos rígidos.

Como isso pode ser feito? Tenho certeza de que não deve ser difícil, mas passei mais de uma hora tentando maneiras diferentes e continuei fracassando.

    
por Alex 29.06.2017 / 22:25

2 respostas

3

Não estou oferecendo uma solução completa aqui, mas espero poder direcioná-lo ao longo do caminho para criar sua própria solução. Pessoalmente, acho que existem ferramentas melhores, como rsync , mas isso não parece se encaixar nos critérios da sua pergunta.

Eu realmente não usaria split porque isso exige que você armazene os dados divididos e o original. Em vez disso, eu iria extrair blocos com dd . Algo como essa abordagem pode ser útil para você.

file=/path/to/file
blocksize=1024    # Bytes per block
numbytes=$(stat -c '%s' "$file")
numblocks=$((numbytes / blocksize))
[[ $((numblocks * blocksize)) -lt $numbytes ]] && : $((numblocks++))

blockno=0
while [[ $blockno -lt $numblocks ]]
do
    md5sum=$(dd bs=$blocksize count=1 skip=$blockno if="$file" 2>/dev/null | md5sum)
    # Do something with the $md5sum for block $blockno
    # Here we write to stdout
    echo "$blockno $md5sum"

    : $((blockno++))
done
    
por 30.06.2017 / 00:56
2

Eu tenho um problema semelhante com o bitrot em mídia ótica (atualmente BD-R, mas usei a mesma abordagem em CD-R e DVD-R).

Existe um programa chamado par2 que gera dados de recuperação (usando códigos Reed-Solomon) de tal forma que um certo número de erros podem ser detectados e corrigidos. Você configura um tamanho de bloco e uma porcentagem de redundância (que também é a quantidade de espaço extra em disco necessária). Por exemplo, se você usar 1.000 blocos e 10% de redundância, consumirá 10% de espaço em disco extra para 100 blocos de redundância, totalizando 1100. Mas, em troca, você pode recuperar totalmente o arquivo contanto que tenha qualquer 1000 blocos não corrompidos. Assim, contanto que 100 ou menos blocos contenham bitrot, você pode recuperar o arquivo.

A desvantagem da par2 é que calcular esses dados de recuperação leva um tempo, e quanto mais você gera, mais tempo demora (gerar 20% leva mais de 10%).

Outra ferramenta semelhante é zfec , embora eu não a tenha usado pessoalmente.

    
por 30.06.2017 / 22:06