Bad blocks on LVM, XFS and EXT4 – Parte 2 de 2.

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