Como usar o hdparm para consertar um setor pendente?

5

O SMART está indicando um setor pendente no disco rígido do meu servidor. Eu li muitos artigos recomendando o uso do hdparm para "facilmente" forçar o disco a realocar o setor defeituoso, mas não consigo encontrar a maneira correta de usá-lo.

Algumas informações do meu "smartctl":

Error 95 occurred at disk power-on lifetime: 20184 hours (841 days + 0 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 d7 55 dd 02  Error: UNC at LBA = 0x02dd55d7 = 48059863

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 08 d6 55 dd e2 00  18d+05:13:42.421  READ DMA
  27 00 00 00 00 00 e0 00  18d+05:13:42.392  READ NATIVE MAX ADDRESS EXT
  ec 00 00 00 00 00 a0 02  18d+05:13:42.378  IDENTIFY DEVICE
  ef 03 46 00 00 00 a0 02  18d+05:13:42.355  SET FEATURES [Set transfer mode]
  27 00 00 00 00 00 e0 00  18d+05:13:42.327  READ NATIVE MAX ADDRESS EXT

 SMART Self-test log structure revision number 1
 Num  Test_Description    Status                  Remaining  LifeTime(hours)        LBA_of_first_error
 # 1  Extended offline    Completed: read failure       90%     20194         48059863
 # 2  Short offline       Completed without error       00%     15161         -

Com esse "LBA ruim" ( 48059863 ) em mãos, como eu uso o hdparm? Que tipo de endereço os parâmetros "--read-sector" e "--write-sector" devem ter?

Se eu emitir o comando hdparm --read-sector 48095863 / dev / sda , ele lê e despeja os dados. Se este comando estava certo, eu deveria esperar um erro de E / S, certo?

Em vez disso, despeja dados:

$ ./hdparm --read-sector 48059863 /dev/sda

/dev/sda:
reading sector 48059863: succeeded
4b50 5d1b 7563 a932 618d 1f81 4514 2343
8a16 3342 5e36 2591 3b4e 762a 4dd7 037f
6a32 6996 816f 573f eee1 bc24 eed4 206e
(...)
    
por Nino 27.12.2012 / 17:33

2 respostas

4

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
    
por 31.10.2014 / 14:00
3

Eu acho que pode ter lido sem erro porque esse setor não é ruim, mas outras ferramentas não conseguem ler o setor por causa de algum outro comportamento. (leia adiante que alcança um setor realmente ilegível?)

Eu encontrei alguns setores defeituosos, e se eu reparar o único que é ilegível com "hdparm --read-sector", os outros setores 'ruins' de repente não são mais ilegíveis com coisas como dd. E, curiosamente, quando se olha para a saída "dmesg", apenas os que são inelegíveis com o hdparm são reportados.

por exemplo. Eu tinha setores 36589320 a 36589327 e 36589344 a 36589351 ilegíveis com dd, mas apenas 36589326 e 36589345 eram ilegíveis com hdparm --read-sector. Então eu usei hdparm - setor de gravação nesses 2, e então todos os 16 setores foram legíveis novamente.

Aqui está uma pequena parte da saída do dmesg:

[30152036.527940] end_request: I/O error, dev sda, sector 36589326
[30152077.363710] end_request: I/O error, dev sda, sector 36589345

E as informações do disco:

# smartctl -i /dev/sda
...
=== START OF INFORMATION SECTION ===
Device Model:     TOSHIBA MK2002TSKB
...
Firmware Version: MT2A
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Size:      512 bytes logical/physical
...

E aparentemente o firmware deste disco não grava corretamente os setores realocados, ou eles não foram realmente realocados, mas apenas corrompidos (como um erro ECC irrecuperável, mas a superfície ainda funciona, como se fosse causada por um pouco de podridão eletrônica defeituosa ou mídia ruim):

# smartctl -A /dev/sda | egrep "Reallocated|Pending|Uncorrectable"
  5 Reallocated_Sector_Ct   0x0033   100   100   050    Pre-fail  Always       -       0
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0

# smartctl -l error /dev/sda
...
SMART Error Log Version: 1
No Errors Logged

Por favor, note que eu corri um setor --read e um setor --write. Uma leitura pode ser necessária para realocar adequadamente um setor, não apenas uma gravação. Se você não ler primeiro, pode não saber que o setor é ruim.

    
por 18.06.2013 / 15:41