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:
-
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" emsmartctl -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.) -
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.