Estoy considerando hacer una copia de seguridad de algunos datos en DVD / BD. (Sé sobre DVDisaster.) Leí en alguna parte que los sectores externos de un DVD tienen más probabilidades de desgastarse que los internos. Esto sugiere que con el tiempo, es más probable que los bloques en la segunda mitad de una imagen se corrompan que los de la primera mitad. Entonces mi pregunta es, ¿hay alguna manera de escribir los mismos datos en 2 imágenes de DVD, de modo que
- uno puede montar cualquiera de los DVD, posiblemente en 2 pasos (por ejemplo, montar un archivo iso almacenado en el DVD), pero sin copiar primero todo a HD y manipularlo
- los datos principales deben escribirse en los 2 DVD en un orden significativamente diferente
Si no estoy siendo claro, esto es lo que podría ser una posible solución.
Supongamos por un segundo que existe un controlador de Linux que podría montar una imagen iso al revés. Entonces, le doy un archivo iso, y cuando quiere el primer sector, lee los últimos 2048 bytes del archivo hacia atrás, en lugar de los primeros 2048 bytes en orden normal. No sé si existe tal controlador, pero si existiera, sería una solución a mi problema porque podría hacer esto: poner mis datos en una imagen iso; calcular una segunda imagen como la primera al revés; encapsula cada imagen en un sistema de archivos UDF simple con un solo archivo; escribe los dos sistemas de archivos UDF en diferentes DVD. Ahora, cuando conecto cualquiera de los DVD, podría montar el único archivo iso para recuperar mis datos. Además, los datos se escribirían en los 2 DVD de diferentes maneras, por lo que si ambos DVD pierden el último 1/3 de sus sectores, aún podría recuperarlo todo (a mano,
Otras posibles soluciones serían un controlador general para permutar / rotar / reordenar bloques de tamaño arbitrario en un dispositivo de bloque arbitrario. O tal vez, ¿hay alguna manera de almacenar un archivo en un sistema de archivos UDF utilizando un orden específico de sectores? Dado que UDF es un sistema de archivos completo, eso es definitivamente posible, pero ¿hay alguna herramienta para hacerlo?
¡¡Gracias!!
Editar : como expliqué en la primera respuesta, no pretendo reemplazar DVDisaster, sino complementarlo. Considere 2 estrategias para respaldar 4G de datos. Estrategia A: use 2 DVD idénticos, cada uno con un 15% de ecc de DVDisaster. Estrategia B: use 2 DVD, cada uno con un 15% de ecc, pero con el elemento de permutación adicional que menciono anteriormente (en 1 de los 2 DVD). Afirmo que debido a los patrones de desgaste de los DVD (específicamente, la correlación de errores), después de un cierto tiempo, la probabilidad de recuperación total de B es significativamente mayor que la de A (todas las demás cosas son iguales).
Edit2 : para corroborar mi afirmación de que DVDisaster no es una cura para todo, aquí hay un script que demuestra cómo DVDisaster con 33% de datos ECC sufre pérdida de datos con solo 1.3% de corrupción. La aparente contradicción es que el 33% solo se aplica a la corrupción del "mejor caso", no a "ninguna" corrupción. Para su información, estoy creando un archivo que abarca todo el sistema de archivos test.1.udf
, cambiando solo el último sector del archivo a cero test.2.udf
, calculando datos ecc para ambos y comparando los sectores, incluidos los datos ecc. El punto es que si test.1.udf
son sus datos y pierde los sectores que son diferentes y solo esos, no puede recuperarlos test.1.udf
porque test.2.udf
es otra posibilidad.
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)%)"
Salida:
number of blocks different: 145 / 10895 (1.330800%)