Viva,
Desde o meu ultimo post tenho tido vários contactos a apontarem um item importante neste caso.
Alertaram-me que todos os erros que reportei são current_pending_sector que tipicamente indicam sectores pendentes de ré-alocação.
Estes erros, embora possam ser causados por falta de setores para alocação por excesso de bad sectores no disco envolvido, por vezes podem surgir por problemas de firmware.
Com esta duvida, procurei na net e encontrei reports referenciando comportamentos anómalos de firmware entre este disco especifico, e as componentes de smart:
https://www.smartmontools.org/wiki/SamsungF4EGBadBlocks
Reparei ainda através dos logs do sistema que havia uma correlação entre comandos de smartctl efetuados no disco, e a altura que os bad blocks apareciam (agora já eram vários).
A errata indica precisamente aparecerem que aparecem bad blocks quando são invocadas certas funções de smart nestes discos. Seria esta a root cause do problema?
Para fazer a prova do algodão procedi ao upgrade de firmware do disco afetado conforme indicado pela Samsung (aqui).
Após concluído o upgrade testei repetidamente todos os comandos smart que estavam indicados como causadores do problema. Não apareceram mais bad blocks! Hurray!
Contudo, ainda algo me incomodava. Como recuperar os bad blocks falsos que estavam a ocupar espaço em disco?
A resposta surgiu através do hdparm e de sua capacidade de escrita em baixo nível.
Em primeiro lugar, necessitava de saber onde estavam os bad blocks suspeitos.
Corri um dd_rescue em todo o disco de forma que os erros fossem demonstrados em log:
# dd_rescue /dev/sde /dev/null
# dmesg | grep -i sect | awk ‘{ print $2,$3,$4,$5,$6,$7,$8 }’ | uniq
end_request: I/O error, dev sde, sector 123383560
end_request: I/O error, dev sde, sector 191624616
end_request: I/O error, dev sde, sector 465801320
end_request: I/O error, dev sde, sector 465859696
end_request: I/O error, dev sde, sector 1084233832
De forma a validar se os valores de I/O error apresentados estavam corretos, efetuei leituras de baixo nível aos discos nos setores afetados:
npar1:~ # hdparm –read-sector 123383560 /dev/sde
/dev/sde:
reading sector 123383560: FAILED: Input/output error
npar1:~ # hdparm –write-sector 123383560 /dev/sde
Ok. Estava confirmada a dificuldade nesse setor.
Passei então ao procedimento corretivo.
Nota: Muita atenção com os comandos que irão executar pois estão a escrever a baixo nível. Um deslize e poderá ser o ultimo.
npar1:~ # hdparm –yes-i-know-what-i-am-doing –write-sector 123383560 /dev/sde
/dev/sde:
re-writing sector 123383560: succeeded
Testando novamente:
npar1:~ # hdparm –read-sector 123383560 /dev/sde
/dev/sde:
reading sector 123383560: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
Vitoria. O bloco já é lido corretamente sem gerar nenhuma indicação de I/O error.
Validando pelo dmesg, igualmente não temos incremento no numero de alertas.
Normalmente nestes erros, o I/O error não se resume a um setor. Os subsequentes, ainda dentro do mesmo block são tipicamente também afetados.
npar1:~ # hdparm –read-sector 123383561 /dev/sde
/dev/sde:
reading sector 123383561: FAILED: Input/output error
npar1:~ # hdparm –read-sector 123383562 /dev/sde
/dev/sde:
reading sector 123383562: FAILED: Input/output error
npar1:~ # hdparm –read-sector 123383563 /dev/sde
/dev/sde:
reading sector 123383563: FAILED: Input/output error
npar1:~ # hdparm –read-sector 123383564 /dev/sde
/dev/sde:
reading sector 123383564: succeeded
0000 0000 0000 0000 0000 0000 3d4b 0001
0000 0000 0000 0000 3d55 0001 3d5c 0001
0000 0000 3d63 0001 3d6a 0001 3d76 0001
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 3d80 0001 3d5c 0001
0000 0000 3db2 0001 3d6a 0001 3d76 0001
3d87 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
Portanto, todos os setores desde o 123383561 até ao 123383563 apresentam problemas.
Correndo o hdparm utilizando a sintaxe anteriormente apresentada:
npar1:~ # hdparm –yes-i-know-what-i-am-doing –write-sector 123383561 /dev/sde
…
npar1:~ # hdparm –yes-i-know-what-i-am-doing –write-sector 123383562 /dev/sde
…
npar1:~ # hdparm –yes-i-know-what-i-am-doing –write-sector 123383563 /dev/sde
…
E em seguida lidos, de forma a validar que os erros de IO error desapareceram:
npar1:~ # hdparm –read-sector 123383561 /dev/sde
/dev/sde:
reading sector 123383561: succeeded
npar1:~ # hdparm –read-sector 123383562 /dev/sde
/dev/sde:
reading sector 123383562: succeeded
npar1:~ # hdparm –read-sector 123383563 /dev/sde
/dev/sde:
reading sector 123383563: succeeded
Validando novamente o status do smart comparando com os valores iniciais:
Antes:
195 Hardware_ECC_Recovered 0x003a 100 100 000 Old_age Always – 0
196 Reallocated_Event_Count 0x0032 252 252 000 Old_age Always – 0
197 Current_Pending_Sector 0x0032 252 100 000 Old_age Always – 0
198 Offline_Uncorrectable 0x0030 252 252 003 Old_age Offline – 0
Depois:
195 Hardware_ECC_Recovered 0x003a 100 100 000 Old_age Always – 0
196 Reallocated_Event_Count 0x0032 252 252 000 Old_age Always – 0
197 Current_Pending_Sector 0x0032 252 100 000 Old_age Always – 0
198 Offline_Uncorrectable 0x0030 252 252 000 Old_age Offline – 0
Desta forma, os erros desapareceram inclusive da tabela de erros do smart.
Este é um procedimento algo arriscado por escreverem em low level nos discos mas em termos práticos extremamente útil.
Recomendo vivamente que façam um backup a todos os vossos dados nesse disco antes de se aventurarem por este caminho.
Como sempre, estou disponível caso tenham duvidas ou sugestões através do email nuno at nuneshiggs.com.
Um abraço e até a próxima.
Nuno