Máxima recuperación de datos de disquetes antiguos con sectores defectuosos acolchados y múltiples pasadas

Máxima recuperación de datos de disquetes antiguos con sectores defectuosos acolchados y múltiples pasadas

Tengo una colección de disquetes antiguos de 3,5" de los que estoy buscando recuperar la mayor cantidad de datos posible.

El problema se debe a la estructura de algunos de los archivos, necesito que se mantenga la longitud de todos los archivos, lo que significa que se deben rellenar los sectores defectuosos (la razón tl;dr es que algunos archivos son archivos Acorn ADFS donde se almacenan los datos y el código). combinado El código hace referencia a los datos como un desplazamiento desde el inicio del archivo. La lectura del formato ADFS no es un problema en Linux, el relleno de los sectores defectuosos sí lo es.

Los discos no se han leído en 25 años, por lo que espero lecturas impredecibles, sectores defectuosos regulares y potencialmente hacer que los discos sean ilegibles, lo cual no me importa siempre que se maximice la recuperación de datos.

Para hacer esto, espero que se necesiten varias pasadas para leer tanto como sea posible.

dd

Miré dd, con este comando prometiendo una primera ejecución:

dd if=/dev/fd0 of=adfs.img conv=noerror,sync

Seguido de llamadas posteriores de

dd if=/dev/fd0 of=adfs.img conv=noerror,notrunc

Dónde:

No hay errorsignifica que los errores se ignoran

sincronizarsignifica que los sectores defectuosos están rellenados con el carácter nulo

no truncadosignifica que el archivo de salida (ya existente) no se trunca cuando se llama a dd.

Sin embargo, mientras leo elpágina de manualy estoexplicación de notrunc, a pesar de que se ha configurado notrunc, dd sobrescribe la salida cada vez, lo que da como resultado una salida que todavía solo representa lo que se leyó en la última pasada. Cualquier sector que anteriormente se leyera correctamente pero que ahora sea incorrecto, por ejemplo debido a la degradación de un disquete antiguo, se sobrescribirá con nulo.

Entonces dd no parece adecuado.

ddrescate

ddrescateParece prometedor porque se puede usar con múltiples pases siempre que se use un archivo de registro para registrar lo que se escribió exitosamente y luego se haga referencia a él cuando se realice el siguiente paso.

El primer paso para leer solo bloques que no sean de error.

ddrescue -d -p --no-scrape /dev/fd0 output.img log/output.logfile

para la primera pasada y las siguientes para completar los errores

ddrescue -d -r3 /dev/fd0 output.img log/output.logfile

Dónde

-dacceso directo al disco. Ignorar el caché del sistema

--sin raspaduraso-nortesaltarse la fase de raspado

-pagpreallocate preasigna espacio en disco antes de la recuperación, es decir, el archivo de salida tendrá el mismo tamaño que el archivo/dispositivo de entrada

-r3reintentar sectores defectuosos 3 veces (usado en el segundo pase en adelante)

pero el problema es que ddrescue parece no rellenar los sectores defectuosos a medida que ocurren. Con -p configurado, parece que el resultado es todo el relleno al final del archivo, sin mantener los desplazamientos de datos desde el inicio del archivo como se requiere.

Este parece ser el caso, ya que ddrescue está escrito para intentar ahorrar espacio en el disco, por lo que los sectores defectuosos se truncan y luego se agregan si los sectores defectuosos se leen exitosamente en pasadas posteriores. La configuración -p simplemente crea un archivo de salida del mismo tamaño que el archivo de entrada para ahorrar espacio, no para rellenar los datos. Por lo tanto, el contenido de la salida con -p configurado o no configurado será idéntico, es decir, no se completará hasta el final del archivo.

Pregunta

Entonces mi pregunta es de tres partes.

  1. ¿Es correcto que ddrescue NO rellena el archivo recuperado incluso con -p configurado?

  2. ¿Hay alguna manera de hacer que se acople? En mi búsqueda en Internet, leí un comentario (lo encontraré nuevamente y lo agregaré) de que un script podría usar el archivo de registro creado por ddrescue para rellenar los lugares relevantes. ¿Alguna idea de cómo?

y

  1. ¿Conoce algún comando/programa/script mejor para hacer lo que estoy tratando de hacer: recuperación máxima de datos mediante múltiples pasadas de lectura de un disco corrupto con relleno de sectores defectuosos?

Estoy usando Ubuntu 18.04, la versión dd es (coreutils) 8.28 y la versión GNU ddrescue es 1.22, ambas de los repositorios de Ubuntu.

Gracias como siempre por cualquier ayuda.

Respuesta1

ddrescate GNUes la herramienta adecuada para la recuperación que está intentando.


1) ¿Es correcto que ddrescue NO rellena el archivo recuperado incluso con -p configurado?

Esta presunción es incorrecta. Puede que te sientas confundido porel manualdiciendo esto:

Ddrescue no escribe ceros en la salida cuando encuentra sectores defectuosos en la entrada y no trunca el archivo de salida si no se le solicita.

Simplemente significa que no se escriben ceros en lugar de sectores defectuosos. Lo que debería haber en esos sectores defectuosos simplemente no se completa. Si está escribiendo en un disco o archivo en blanco,las áreas no escritas en el destino se leerán como ceros(bytes nulos).

Además, la opción -p/ --preallocateno tiene nada que ver con el "relleno". Significa "preasignar". En los sistemas de archivos compatibles, la opción garantiza que tenga suficiente espacio en el disco de destino para almacenar el disco de origen.


2) ¿Hay alguna manera de hacer que se acople?

El archivo generado por GNU ddrescue tiene lógicamente el mismo diseño que el disco de origen. Un bloque leído desde el origen va en la misma posición en el destino. Incluso podrías revertir toda la recuperación ( -R/ --reverse) y los bloques se completarán al revés, aún en los lugares correctos.


3) ¿Conoce algún comando/programa/script mejor para hacer lo que estoy tratando de hacer: recuperación máxima de datos mediante múltiples pasadas de lectura de un disco corrupto con relleno de sectores defectuosos?

GNU ddrescue hace exactamente lo que quieres. Puede realizar múltiples pasadas ( -r/ ), y el "relleno" deseado de sectores defectuosos es el comportamiento predeterminado de GNU ddrescue. De--retry-passes=nel manual:

Si el archivo de salida es un archivo normal creado por ddrescue, las áreas marcadas como sector defectuoso contendrán ceros.

Para ser perfectamente claro y abordar su preocupación de que una lectura exitosa seguida de una mala lectura se "rellene" con nulo,ddrescue no intentará volver a leer una lectura exitosa“No es necesario porque los datos ya han sido recuperados. El archivo de mapas es la forma en que ddrescue sabe lo que ya recuperó y lo que no pudo recuperar.

información relacionada