reordenar setores em um dispositivo de bloco?

4

Estou pensando em fazer o backup de alguns dados em DVDs / BDs. (Eu sei sobre DVDisaster.) Eu li em algum lugar que os setores externos em um DVD são mais propensos a desgastar do que os internos. Isso sugere que, com o tempo, os blocos na segunda metade de uma imagem são mais propensos a serem corrompidos do que os da primeira metade. Então, a minha pergunta é, existe uma maneira de escrever os mesmos dados para 2 imagens de DVD, de tal forma que

  1. é possível montar um DVD, possivelmente em 2 etapas (por exemplo, montar um arquivo iso armazenado no DVD), mas sem antes copiar tudo para o HD e manipulá-lo
  2. os dados principais devem ser gravados nos 2 DVDs em ordem significativamente diferente

Se eu não estou sendo claro, aqui está uma possível solução.

Suponha por um segundo que existia um driver Linux que pudesse montar uma imagem iso de trás para frente. Então, eu dou um arquivo iso, e quando ele quer o primeiro setor, ele lê os últimos 2048 bytes do arquivo para trás, em vez dos primeiros 2048 bytes em ordem normal. Não sei se esse driver existe, mas se existisse, seria uma solução para o meu problema, porque eu poderia fazer isso: colocar meus dados em uma imagem iso; calcula uma segunda imagem como a primeira para trás; encapsular cada imagem em um sistema de arquivos UDF simples com apenas um arquivo; escreva os dois sistemas de arquivos UDF em diferentes DVDs. Agora, quando eu plugo qualquer DVD, eu poderia montar o arquivo iso único para recuperar meus dados. Além disso, os dados seriam gravados nos dois DVDs de maneiras diferentes, portanto, se ambos os DVDs perdessem o último 1/3 de seus setores, eu ainda conseguiria recuperá-lo (à mão, mas seria possível).

Outras possíveis soluções seriam um driver geral para permutar / girar / reordenar blocos de tamanho arbitrário em um dispositivo de bloco arbitrário. Ou talvez, existe uma maneira de armazenar um arquivo em um sistema de arquivos UDF usando uma ordem específica de setores? Dado que o UDF é um sistema de arquivos completo, isso é definitivamente possível, mas existe uma ferramenta para fazê-lo?

Obrigado !!

Editar : Como expliquei na primeira resposta, não pretendo substituir o DVDisaster, mas complementá-lo. Considere duas estratégias para fazer o backup de 4G de dados. Estratégia A: use 2 DVDs idênticos, cada um com 15% de ecc de DVDisaster. Estratégia B: use 2 DVDs, cada um com 15% ecc, mas com a coisa de permutação adicional mencionada acima (em 1 dos 2 DVDs). Eu afirmo que por causa dos padrões de desgaste de DVDs (especificamente, a correlação de erros), após um certo tempo, a probabilidade de recuperação total de B é significativamente maior que de A (todas as outras coisas sendo iguais).

Edit2 : Para substanciar minha afirmação de que o DVDisaster não é uma cura para tudo, aqui está um script demonstrando como o desastre do DVD com 33% de dados ECC sofre perda de dados com apenas 1,3% de corrupção. A aparente contradição é que 33% se aplicam apenas à corrupção do "melhor caso", e não à "qualquer" corrupção. FYI, estou criando um arquivo que abrange todo o sistema de arquivos em test.1.udf , alterando apenas o último setor no arquivo para zero em test.2.udf , computando dados ecc para ambos e comparando os setores, incluindo os dados ecc. A questão é que, se test.1.udf for seus dados e você perder os setores diferentes e apenas esses, não é possível recuperar test.1.udf porque test.2.udf é outra possibilidade.

n_blocks=8192
tdir=$(mktemp -d)
mkudffs -b 2048 test.1.udf $n_blocks
sudo mount test.1.udf $tdir -o bs=2048
sudo chown $USER.$USER $tdir
n=$(df -B 2K $tdir | tail -n 1 | awk '{print $4}')
let n-=1
dd if=/dev/urandom of=$tdir/file bs=2K count=$n 2>/dev/null
last=$(od <$tdir/file -Ad -t x1 | tail -n 2 | head -n 1 | cut -d ' ' -f 2-)
sudo umount $tdir
start_of_last_block=$(od <test.1.udf -Ad -t x1 | grep -A 1 "$last" | tail -n 1 | awk '{print $1}')
last_block=$(($start_of_last_block / 2048))
dd if=test.1.udf bs=2K count=$(($last_block - 1)) >test.2.udf 2>/dev/null
dd if=/dev/zero bs=2K count=1 >>test.2.udf 2>/dev/null
dd if=test.1.udf bs=2K skip=$last_block count=$(($n_blocks - $last_block)) >>test.2.udf 2>/dev/null
n_blocks_with_ecc=$(echo "$n_blocks * 133 / 100" | bc)
echo "add dvdisaster ecc data, using in total $n_blocks_with_ecc"
#run dvdisaster on the 2 files, then...
n_blocks_different=$(for i in $(seq 0 $(($n_blocks_with_ecc - 1))); do
  if [ $((($i / 100) * 100)) -eq $i ]; then
    echo "$i..." >&2
  fi
  diff -q <(dd if=test.1.udf bs=2K skip=$i count=1 2>/dev/null) \
      <(dd if=test.2.udf bs=2K skip=$i count=1 2>/dev/null) >/dev/null || echo $i
done | wc -l)
echo "number of blocks different: $n_blocks_different / $n_blocks_with_ecc ($(echo "scale=6; $n_blocks_different / $n_blocks_with_ecc * 100" | bc)%)"

Saída:

number of blocks different: 145 / 10895 (1.330800%)
    
por Matei David 22.02.2013 / 17:48

1 resposta

3

O problema que você está descrevendo já tem uma solução mais elegante e eficiente: Correção de erros Reed-Solomon . Isso funciona ao inserir código de correção de erros no final do disco, de forma que você pode perder uma certa quantidade de dados de locais arbitrários no disco único e ainda recuperar o arquivo inteiro.

This is possible because the RS decoder does not differentiate between user data and error correction data. In the view of the RS decoder each block is a sequence of 100 bytes from which an arbitrary subset of 20 bytes can be recovered.

Embora algumas partes do disco possam estar mais propensas a perder dados, a perda de dados ainda pode ocorrer em qualquer local. No método de dois discos descrito, você perderá dados se houver dois setores com falha sobrepostos . Nos níveis mais altos de perda de dados, isso seria bastante comum. Em comparação, a correção Reed-Solomon Error permite recuperar de perder 14.3% (modo normal) ou 33.5% (modo alto) do disco sem problemas.

O

DVDisaster foi projetado para fazer exatamente isso e é perfeitamente capaz de atender às suas necessidades aqui. Se você está se sentindo particularmente paranoico, pode definir a redundância como Alta (ou personalizada) e ainda usar menos espaço e ter maior confiabilidade do que com dois discos.

Happy Back Ups!

    
por 22.02.2013 / 22:08