reordenar sectores en un dispositivo de bloque?

4

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

  1. 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
  2. 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.udfson sus datos y pierde los sectores que son diferentes y solo esos, no puede recuperarlos test.1.udfporque test.2.udfes 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%)
Matei David
fuente
1
Otra posible solución sería almacenar los datos de carga útil en un md-array virtual lineal dividido en unos pocos archivos (por ejemplo, 4). Entonces podría escribir esos archivos en diferentes órdenes en los 2 DVD. El problema con esto es que necesito un dispositivo de bucle de retorno para cada fragmento para montar la matriz, y estos son limitados. Además, solo podría montar esto si mi sistema ejecuta md (a diferencia de un archivo fragmentado artificialmente en un UDF, que todo sistema debería entender).
Matei David
No entiendo el comando: "dd if = test.1.udf bs = 2K skip = $ last_block count = $ (($ n_blocks - $ last_block)) >> test.2.udf 2> / dev / null" . ¿Para qué sirve? los dos anteriores crearon test.2.udf como test.1.udf con solo un bloque menos y luego agregaste un bloque de ceros.
FarO
Además, me parece (si entendí correctamente) que debe 1) generar test.1.udf 2) agregar ECC a ese 3) corromperlo 4) recuperarlo con dvddisaster 5) verificar la cantidad de sectores no corregibles. ¿O entendí mal el objetivo de su prueba?
FarO

Respuestas:

3

El problema que está describiendo ya tiene una solución más elegante y eficiente: corrección de errores Reed-Solomon . Esto funciona insertando el código de corrección de errores al final del disco, de modo que puede perder una cierta cantidad de datos de ubicaciones arbitrarias en el disco único y aún recuperar todo el archivo.

Esto es posible porque el decodificador RS no diferencia entre los datos del usuario y los datos de corrección de errores. En la vista del decodificador RS, cada bloque es una secuencia de 100 bytes a partir de la cual se puede recuperar un subconjunto arbitrario de 20 bytes.

Si bien es probable que algunas partes del disco pierdan datos, la pérdida de datos aún puede ocurrir en cualquier ubicación. En el método de dos discos descrito, perderá datos si se superponen dos sectores fallidos . En los niveles más altos de pérdida de datos, esto sería bastante común. En comparación, la corrección de errores Reed-Solomon le permite recuperarse sin perder el 14,3% (modo normal) o el 33,5% (modo alto) del disco.

DVDisaster está diseñado para hacer esto y es perfectamente capaz de satisfacer sus necesidades aquí. Si se siente particularmente paranoico, puede configurar la redundancia en Alta (o personalizada) y aún así usar menos espacio y tener una mayor confiabilidad que con dos discos.

Happy Back Ups!

ingrese la descripción de la imagen aquí

David
fuente
Mencione también par2;)
0xC0000022L
Lo pensé, pero no estaba seguro de cómo funcionaría si tienes archivos que se encuentran en varios CD. Además, quería mantener la longitud baja.
David
Gracias por la respuesta, pero con mi esquema no quise reemplazar DVDisaster, solo para complementarlo.
Matei David
1
2. Estoy 90% seguro de que la garantía de redundancia que menciona (p. Ej., 15%) significa: "en las mejores circunstancias, si se producen errores del 14,99%, puede recuperarlos todos; también, si se producen errores del 15,01%, ciertamente puede no recuperarlos a todos ". Eso es diferente de lo que parece sugerir: "por cada posible error del 14,99%, puede recuperarlos todos". Tal vez par2hace eso, pero apuesto (como dije, es una suposición informada) que para ser eficiente, DVDisaster divide la entrada en grupos y protege los grupos independientemente uno del otro. Para perder datos, solo necesita perder 15.01% de 1 clúster y su paridad.
Matei David
1
Si cree que la falta de redundancia causará la pérdida de datos, la solución es aumentar la configuración de redundancia, no inventar un método completamente nuevo para almacenar datos.
David