Ignorar/encurtar a leitura da tabela de partição no disco quebrado

Ignorar/encurtar a leitura da tabela de partição no disco quebrado

Tenho um disco rígido quebrado com muitos blocos corrompidos. Realizo resgate com ddrescuebastante sucesso (estou em 99,5%). Infelizmente:

  • Por alguma razão, às vezes, mas nem sempre, quando ddrescueatinge 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).

dmesgsaí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 losetupoffset/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>:disableparâmetro do kernel para desativá-lo totalmente.

informação relacionada