
Tenho um disco rígido quebrado com muitos blocos corrompidos. Realizo resgate com ddrescue
bastante sucesso (estou em 99,5%). Infelizmente:
- Por alguma razão, às vezes, mas nem sempre, quando
ddrescue
atinge uma parte muito danificada, o disco "enlouquece" e retorna apenas erros de leitura para o resto do disco ou relata erro de leitura desalinhado e termina; o computador precisa ser reiniciado e essas partes podem ser lidas novamente. - O primeiro bloco que contém a tabela de partições é quebrado e a inicialização do sistema leva cerca de uma hora quando o kernel tenta ler a tabela de partições repetidas vezes.
O engraçado: não preciso ler a tabela de partições, estou realizando um resgate de "disco inteiro".
Então, existe uma maneira de dizer ao kernel
- não ler a tabela de partições ou
- limitar o número de novas tentativas?
A aceleração da inicialização do sistema aumentará drasticamente a velocidade de recuperação porque nesta fase o sistema inicia por uma hora, depois continua em recuperação por vários minutos e depois reinicia devido a um dos erros mencionados acima (eu automatizei isso pelo script de inicialização).
dmesg
saída:https://cloud.oprendek.sk/index.php/s/Mk8figkaspD8xRE
Responder1
Sinto que já respondi isso antes, mas não consigo encontrar no momento ...
Se o seu problema persistir não apenas durante a inicialização inicial, mas também ao conectar a unidade problemática a um sistema já em execução, você estará mais ou menos sem sorte.
Em uma instalação completa do Linux, você praticamente não pode impedir que uma unidade seja verificada em busca de partições, UUIDs e outros metadados, toda vez que você a conecta. O kernel detecta tabelas de partição, o udev cria links de disco/por-uuid e assim por diante.
No entanto, o suporte à tabela de partição é opcional no kernel ( CONFIG_*_PARTITION
, *
sendo um de MSDOS
, EFI
, MAC
, ...). Portanto, você pode compilar um kernel personalizado que não suporte nenhum / desative todos eles e, em seguida (para também evitar a verificação de UUID e similares) usá-lo com um ambiente initramfs mínimo que contenha apenas ddrescue.
Isso também impede que você acesse partições em qualquer uma de suas outras unidades, a menos que você as emule com losetup
offset/sizelimits ou, alternativamente, com o mapeador de dispositivos ( dmsetup
). Então você terá que contornar a falta de partições como um todo.
- limitar o número de novas tentativas?
Não tenho certeza se ele faz alguma nova tentativa, o que você pode fazer é definir tempos limite (in /sys/block/*/device/timeouts
) que só seriam úteis se a unidade não estivesse respondendo, eu acho.
Para dispositivos integrados não removíveis, você também pode usar o libata.force=<port.device>:disable
parâmetro do kernel para desativá-lo totalmente.