Como posso fazer varredura de superfície de disco e consertar / realocar setores defeituosos no Linux a partir da linha de comando?

4

Eu comprei um disco com alguns setores defeituosos, planejando consertá-los e usá-lo como parte do cluster RAID 6. Eu posso fazer mau setor de fixação no Windows, existem muito boas ferramentas de bloqueio de mau bloqueio, mas no Windows, o processo é muito lento, uma correção do setor leva 15 minutos.

Na minha experiência, o Linux é melhor em lidar com dispositivos que não respondem a tempo e isso resulta em um processo muito mais rápido no Linux. No entanto, verifiquei o manual fsck , mas não encontrei nenhuma opção útil para surface & varredura de bloco ruim ou realocação de bloco ruim.

Como posso escanear a superfície do meu disco rígido e corrigir / realocar setores defeituosos no Linux a partir da linha de comando?

    
por klor 11.05.2017 / 18:52

2 respostas

7

Esta resposta é sobre discos magnéticos. SSDs são diferentes. Além disso, este é um disco sem dados (ou nenhum dado que você queira preservar) nele; veja minha resposta para "Posso corrigir os blocos ruins no meu disco rígido com um único comando" para saber o que fazer se você tem dados importantes no disco.

Discos feitos desde pelo menos o final dos anos 90 gerenciam os próprios blocos ruins. Em resumo, um disco manipulará um bloco defeituoso, substituindo-o de maneira transparente por um setor reserva. Ele fará isso se (a) durante a leitura, descobrir que o bloco está "fraco", mas o ECC é suficiente para recuperar os dados; (b) enquanto escreve, descobre que o cabeçalho do setor é ruim; (c) ao escrever, se uma leitura detectou anteriormente o setor como ruim, mas os dados não eram recuperáveis.

O firmware do disco normalmente permite monitorar esse processo (pelo menos as contagens) por meio de atributos SMART. Normalmente, haverá pelo menos uma contagem de setores realocados e duas contagens pendentes (descobertas com má leitura, falha de ECC, ainda não gravadas).

Existem duas maneiras de fazer o disco perceber setores defeituosos:

  1. Use smartctl -t offline /dev/sdX para informar ao firmware do disco para fazer uma varredura de superfície offline. Você, então, apenas deixa o disco sozinho (completamente inativo será o mais rápido) até que esteja pronto (verifique o "Status da coleta de dados offline" em smartctl -c /dev/sdX ). Isso normalmente atualizará a contagem "incorrigível off-line" no SMART. (Nota: as unidades podem ser configuradas para executar automaticamente uma verificação offline rotineiramente.)

  2. O Linux leu todo o disco, por exemplo, badblocks -b 4096 -c 1024 -s /dev/sdX . Isso normalmente atualizará a contagem do "setor pendente atual" no SMART.

Qualquer um dos itens acima também pode aumentar a contagem realocada do setor - neste caso (b), o ECC recuperou os dados.

Agora, para recuperar os setores, você só precisa escrever para eles. Normalmente, isso seria um simples pv -pterba /dev/zero > /dev/sdX (ou simplesmente cat , ou dd ) mas você planeja fazer parte de uma matriz RAID. O init RAID irá gravar em todo o disco de qualquer maneira, então isso é inútil. A única exceção é o começo e o fim do disco - é possível que algumas dezenas de megabytes sejam perdidas (devido a alinhamento, cabeçalhos, etc.). Então:

disk=/dev/sdX
end=$(echo "$(/sbin/blockdev --getsize64 "$disk")/4096-32768" | bc)
dd if=/dev/zero bs=4096             count=32768 of="$disk"   # first 128 MiB
dd if=/dev/zero bs=4096 seek="$end" count=32768 of="$disk"   # last 128 MiB

Eu acho que consegui evitar o erro de fencepost all-to-easy 1 acima, de modo que deve ficar em branco o primeiro e último 128MiB do disco. Então deixe mdadm raid init escrever o resto. É inofensivo (exceto para o desgaste trivial, e desperdiçando horas de tempo) para zerar o disco inteiro, se você quiser, no entanto.

Outra coisa a fazer, se os seus discos o suportarem: smartctl -l scterc,40,100 (ou qualquer número) para dizer ao disco que você deseja que ele desista de corrigir erros de leitura mais rapidamente - 40 seria 4 segundos. Os dois números são erros de leitura e erros de gravação; O mdraid corrige facilmente erros de leitura via paridade (e grava o setor com falha de volta no disco para permitir a realocação). No entanto, erros de gravação falharão no disco da matriz.

PS: certifique-se de manter um olho na contagem de setores realocados. Esse atributo que falhou é uma má notícia. E se o seu aumento contínuo, isso é uma má notícia também.

PPS: Certifique-se de que suas matrizes RAID sejam limpas (todos os setores são lidos e toda a paridade é verificada) rotineiramente. Muitas distros já enviam um script que faz isso mensalmente. Isso detectará & conserte qualquer novo bloco defeituoso, pois, do contrário, blocos ruins podem permanecer lentos e, por fim, causar falhas de reconstrução.

1 Erro de fencepost - um tipo de erro off-by que falha ao contar uma das extremidades. Nomeado de se você tiver um posto de vedação a cada 3 pés, quantos postes de vedação em uma cerca autônoma de 9 pés? A resposta correta é 4; o erro fencepost é 3 e é de não contar o post no início ou no final.

    
por 11.05.2017 / 22:18
0

Se você identificou blocos ruins visíveis, o disco provavelmente ficará ruim muito rápido. A menos que você tenha um disco EXTREMAMENTE antigo, a substituição incorreta de blocos é feita internamente e você não os verá. Se você está vendo estes, o cache de bloco de substituição aparentemente foi esgotado.

Eu NÃO usaria um disco em tal estado e provavelmente o limparia e depois o lançaria.

    
por 11.05.2017 / 23:40