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
- é 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
- 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%)