Se, por qualquer motivo, você preferir tentar limpar esses setores defeituosos e não se importar com o conteúdo existente de uma unidade, o snippet de shell abaixo pode ajudar. Eu testei isso em uma unidade Seagate Barracuda mais antiga que já ultrapassou sua garantia. Pode não funcionar bem com outros modelos de unidades ou fabricantes, mas deve colocá-lo no caminho certo se você precisar escrever algo. Ele irá destruir qualquer conteúdo que você tenha na unidade.
Você pode preferir apenas executar badblocks, um Secure Erase (SE) hdparm ( link ) ou algum outro ferramenta que é realmente projetada para isso. Ou até mesmo o fabricante forneceu ferramentas como o SeaTools (existe uma versão 'enterprise' de 32bit linux, google it).
Certifique-se de que a unidade em questão esteja completamente não utilizada / desmontada antes de fazer isso. Além disso, eu sei, enquanto loop, sem desculpas. É um hack, você pode melhorar ...
baddrive=/dev/sdb
badsect=1
while true; do
echo Testing from LBA $badsect
smartctl -t select,${badsect}-max ${baddrive} 2>&1 >> /dev/null
echo "Waiting for test to stop (each dot is 5 sec)"
while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print substr($4,1,9)}')" != "Completed" ]; do
echo -n .
sleep 5
done
echo
badsect=$(smartctl -l selective ${baddrive} | awk '/# 1 Selective offline Completed: read failure/ {print $10}')
[ $badsect = "-" ] && exit 0
echo Attempting to fix sector $badsect on $baddrive
hdparm --repair-sector ${badsect} --yes-i-know-what-i-am-doing $baddrive
echo Continuning test
done
Uma vantagem de usar o método 'selftest' é que a carga é manipulada pelo firmware da unidade, portanto o PC ao qual ele está conectado não está carregado como seria com o dd ou badblocks.
NOTA: desculpe, cometi um erro, a condição correta enquanto está assim:
while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print $4}')" = "Self_test_in_progess" ]; do
E a condição de saída do script se torna:
[ $badsect = "-" ] || [ "$badsect" = "" ] && exit 0