Como determinar qual partição possui badblocks?

1

Eu tenho o seguinte dispositivo:

Model Family:     Western Digital Caviar Green (AF)
Device Model:     WDC WD15EARS-00MVWB0
Serial Number:    WD-WCAZA3607921
LU WWN Device Id: 5 0014ee 2b01eac3e
Firmware Version: 51.0AB51
User Capacity:    1,500,301,910,016 bytes [1.50 TB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS (minor revision not indicated)
SATA Version is:  SATA 2.6, 3.0 Gb/s
Local Time is:    Thu Nov 21 00:08:20 2013 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

e recentemente recebi um erro ao ler a superfície desse disco. Este é o erro:

Complete error log:
SMART Error Log Version: 1
ATA Error Count: 25 (device log contains only the most recent five errors)
    CR = Command Register [HEX]
    FR = Features Register [HEX]
    SC = Sector Count Register [HEX]
    SN = Sector Number Register [HEX]
    CL = Cylinder Low Register [HEX]
    CH = Cylinder High Register [HEX]
    DH = Device/Head Register [HEX]
    DC = Device Command Register [HEX]
    ER = Error register [HEX]
    ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 25 occurred at disk power-on lifetime: 18798 hours (783 days + 6 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 08 00 40 37 e6  Error: UNC 8 sectors at LBA = 0x06374000 = 104284160

  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 00 40 37 e6 08      08:54:35.771  READ DMA
  ec 00 00 00 00 00 a0 08      08:54:35.763  IDENTIFY DEVICE
  ef 03 46 00 00 00 a0 08      08:54:35.763  SET FEATURES [Set transfer mode]

Este é o 25º erro, mas os erros anteriores são exatamente os mesmos.

Aqui está um relatório inteligente:

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       1
  3 Spin_Up_Time            0x0027   253   189   021    Pre-fail  Always       -       2066
  4 Start_Stop_Count        0x0032   099   099   000    Old_age   Always       -       1118
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   075   075   000    Old_age   Always       -       18833
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1101
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       277
193 Load_Cycle_Count        0x0032   085   085   000    Old_age   Always       -       346753
194 Temperature_Celsius     0x0022   122   109   000    Old_age   Always       -       28
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       2
199 UDMA_CRC_Error_Count    0x0032   200   196   000    Old_age   Always       -       11
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       1

Então, não é um setor ruim ainda, mas acho que será.

Eu tenho 7 partições nessa unidade, e o problema é que eu não sei onde o (s) setor (es) está, qual partição ou / e qual MiB, KiB, etc. começando do começo do disco. Existe uma maneira de descobrir isso?

    
por Mikhail Morfikov 21.11.2013 / 00:54

1 resposta

1

Eu encontrei como fazer isso. A seguinte linha no relatório inteligente determina o LBA:

40 51 08 00 40 37 e6  Error: UNC 8 sectors at LBA = 0x06374000 = 104284160

Então, é 104284160. Se sabemos disso, também sabemos qual partição está envolvida:

root:~# fdisk -lu /dev/sda
Device Boot      Start         End      Blocks   Id  System
...
/dev/sda3        99610624  1466798079   683593728   83  Linux

Para determinar exatamente onde está a 3ª partição:

104284160 - 99610624 = 4673536

Também precisamos saber o tamanho do bloco:

# tune2fs -l /dev/mapper/crypt_data  | grep Block
Block count:              170897920
Block size:               4096
Blocks per group:         32768

E agora podemos determinar qual Bloqueio de sistema de arquivos contém esse LBA usando a seguinte fórmula:

   b = (int)((L-S)*512/B)
where:
b = File System block number
B = File system block size in bytes
L = LBA of bad sector
S = Starting sector of partition as shown by fdisk -lu
and (int) denotes the integer part.

No meu caso, isso seria:

b = (int)((104284160-99610624)*512/4096
b=584192

Agora temos que verificar se há um arquivo lá:

# debugfs
debugfs 1.42.8 (20-Jun-2013)
debugfs:  open /dev/mapper/crypt_data 
debugfs:  testb 584192
Block 584192 marked in use
debugfs:  icheck 584192
Block   Inode number
584192  37486656
debugfs:  ncheck 37486656
Inode   Pathname
37486656    /some/file

E é basicamente isso. Agora tenho que realocar manualmente o setor. Mais informações sobre como fazer isso, você pode encontrar aqui .

    
por 21.11.2013 / 04:00