Saltar/acortar la lectura de la tabla de particiones en un disco roto

Saltar/acortar la lectura de la tabla de particiones en un disco roto

Tengo un disco duro roto con muchos bloques corruptos. Realizo el rescate con ddrescuebastante éxito (estoy al 99,5 %). Desafortunadamente:

  • Por alguna razón, a veces, pero no siempre, cuando ddrescuegolpea una parte muy dañada, el disco "se vuelve loco" y devuelve solo errores de lectura para el resto del disco o informa un error de lectura no alineado y finaliza; es necesario reiniciar la computadora y esas partes se pueden leer nuevamente.
  • El primer bloque que contiene la tabla de particiones está roto y el inicio del sistema demora aproximadamente una hora cuando el kernel vuelve a intentar leer la tabla de particiones una y otra vez.

Lo curioso: no necesito leer la tabla de particiones en absoluto, estoy realizando un rescate de "todo el disco".

Entonces, ¿hay alguna manera de decirle al kernel

  • no leer la tabla de particiones o
  • ¿Limitar el número de reintentos?

La aceleración del inicio del sistema aumentará drásticamente la velocidad de recuperación porque en esta fase el sistema se inicia durante una hora, luego continúa en recuperación durante varios minutos y luego se reinicia debido a uno de los errores mencionados anteriormente (lo he automatizado mediante un script de inicio).

dmesgproducción:https://cloud.oprendek.sk/index.php/s/Mk8figkaspD8xRE

Respuesta1

Siento que ya respondí esto antes pero no puedo encontrarlo en este momento...

Si su problema persiste no sólo durante el arranque inicial sino también cuando conecta en caliente la unidad infractora a un sistema que ya se está ejecutando, entonces no tiene suerte.

En una instalación completa de Linux, prácticamente no se puede evitar que una unidad sea escaneada en busca de particiones, UUID y otros metadatos cada vez que la conecta. El kernel detecta tablas de particiones, udev crea enlaces de disco/por uuid, etc.

Sin embargo, el soporte de la tabla de particiones es opcional en el kernel ( CONFIG_*_PARTITION, *siendo uno de MSDOS, EFI, MAC, ...). Por lo tanto, podría compilar un kernel personalizado que no admita ninguno/deshabilite todos ellos, y luego (para evitar también el escaneo de UUID y similares) usarlo con un entorno initramfs mínimo que contenga solo ddrescue.

Esto también le impide acceder a particiones en cualquiera de sus otras unidades a menos que las emule con losetuplímites de desplazamiento/tamaño o, alternativamente, el asignador de dispositivos ( dmsetup). Por lo tanto, tendrás que solucionar la falta de particiones en su conjunto.

  • ¿Limitar el número de reintentos?

No estoy seguro de si hace algún reintento, lo que puede hacer es establecer tiempos de espera (en /sys/block/*/device/timeouts), lo que solo sería útil si la unidad no responde en absoluto, supongo.

Para dispositivos integrados no extraíbles, también puede utilizar el libata.force=<port.device>:disableparámetro del kernel para desactivarlo por completo.

información relacionada