
Tengo un disco duro roto con muchos bloques corruptos. Realizo el rescate con ddrescue
bastante éxito (estoy al 99,5 %). Desafortunadamente:
- Por alguna razón, a veces, pero no siempre, cuando
ddrescue
golpea 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).
dmesg
producció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 losetup
lí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>:disable
parámetro del kernel para desactivarlo por completo.