不良セクタの解消

BadBlockHowToを参考に、不良セクタの解消を試みる。coreutilsのバージョンが比較的新しいVineSeedで実施したため、smartctlのバージョンは古いが、動作には問題ないと思われる。

まずは現状の確認から。

# smartctl -l selftest /dev/hda
smartctl version 5.33 [i686-pc-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
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       20%       712         202706820
# 2  Short offline       Completed without error       00%       712         -
# 3  Short offline       Completed without error       00%         0         -

このL=202706820が不良ブロックのLBA番号。続いて197 Current_Pending_Sectorのチェック。

# smartctl -A /dev/hda
smartctl version 5.33 [i686-pc-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
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     0x000b   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0007   097   094   021    Pre-fail  Always       -       5925
  4 Start_Stop_Count        0x0032   099   099   040    Old_age   Always       -       1724
  5 Reallocated_Sector_Ct   0x0033   198   198   140    Pre-fail  Always       -       32
  7 Seek_Error_Rate         0x000b   200   200   051    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   098   098   000    Old_age   Always       -       1809
 10 Spin_Retry_Count        0x0013   100   100   051    Pre-fail  Always       -       0
 11 Calibration_Retry_Count 0x0013   100   100   051    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1724
196 Reallocated_Event_Count 0x0032   181   181   000    Old_age   Always       -       19
197 Current_Pending_Sector  0x0012   200   200   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0012   200   200   000    Old_age   Always       -       1
199 UDMA_CRC_Error_Count    0x000a   200   253   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0009   200   200   051    Pre-fail  Offline      -       0

ふむ。1セクタが怪しいというのは先日から変化なし。
まず、L=202706820がどのパーティションにあるのか調査。

# fdisk -lu /dev/hda

Disk /dev/hda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

 デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *          63    20482874    10241406    7  HPFS/NTFS
/dev/hda2        20482875   234372284   106944705    f  W95 Ext'd (LBA)
/dev/hda5        20482938    40965749    10241406    b  W95 FAT32
/dev/hda6        40965813    71682029    15358108+  83  Linux
/dev/hda7        71682093    92164904    10241406   83  Linux
/dev/hda8        92164968    92695049      265041   82  Linux swap / Solaris
/dev/hda9        92695113   123411329    15358108+  83  Linux

…えー、ディスクの未使用領域(パーティションさえ切っていない部分)にあるようです(わら
仕方ないので一時的に(?)パーティション作成。

# fdisk /dev/hda

残り全部を新しい/dev/hda10としてパーティション作成。Idは83(Linux)とする。ioctlのエラーでカーネルが新しいパーティションテーブルを読めないようなので、いったんリブート。

# reboot

リブート後、ext3パーティションを作成。Read-onlyのチェックつきで。

# mke2fs -j -c /dev/hda10

不良ブロック周辺でHDDから異音がした(汁
しばらく待っていたら、いちおうフォーマットが終了した模様。再度パーティションを確認。

# fdisk -lu /dev/hda

Disk /dev/hda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

 デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *          63    20482874    10241406    7  HPFS/NTFS
/dev/hda2        20482875   234372284   106944705    f  W95 Ext'd (LBA)
/dev/hda5        20482938    40965749    10241406    b  W95 FAT32
/dev/hda6        40965813    71682029    15358108+  83  Linux
/dev/hda7        71682093    92164904    10241406   83  Linux
/dev/hda8        92164968    92695049      265041   82  Linux swap / Solaris
/dev/hda9        92695113   123411329    15358108+  83  Linux
/dev/hda10      123411393   234372284    55480446   83  Linux

/dev/hda10の開始LBA位置はS=123411393。ブロックサイズはmke2fsの際に出ていたが、いちおう再確認。

# tune2fs -l /dev/hda10|grep Block
Block count:              13870111
Block size:               4096
Blocks per group:         32768

B=1ブロック=4096バイト。というわけで、上書きすべきブロックは次のように求められる。

(L - S) * 512 / B
= (202706820 - 123411393) * 512 / 4096 = 9911928.375

フォーマットしたばかりなのでinode番号などあるわけもないが、いちおう確認。

# debugfs
debugfs 1.38 (30-Jun-2005)
debugfs:  open /dev/hda10
debugfs:  icheck 9911928
Block   Inode number
9911928 <block not found>
debugfs: quit

ないね。もしinode番号があったら、ncheck [inode番号]でファイル名を確認できる。要らなければ消しちゃっていいし、要るならあきらめる。どっちみちあきらめるしかない。じゃあこのブロックを上書きしよう。

# dd if=/dev/zero of=/dev/hda10 bs=4096 count=1 seek=9911928
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000237 seconds, 17.3 MB/s

S.M.A.R.T情報を見てみる。

# smartctl -A /dev/hda
smartctl version 5.33 [i686-pc-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
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     0x000b   193   192   051    Pre-fail  Always       -       73
  3 Spin_Up_Time            0x0007   097   094   021    Pre-fail  Always       -       5925
  4 Start_Stop_Count        0x0032   099   099   040    Old_age   Always       -       1724
  5 Reallocated_Sector_Ct   0x0033   197   197   140    Pre-fail  Always       -       33
  7 Seek_Error_Rate         0x000b   200   200   051    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   098   098   000    Old_age   Always       -       1811
 10 Spin_Retry_Count        0x0013   100   100   051    Pre-fail  Always       -       0
 11 Calibration_Retry_Count 0x0013   100   100   051    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1724
196 Reallocated_Event_Count 0x0032   181   181   000    Old_age   Always       -       19
197 Current_Pending_Sector  0x0012   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0012   200   200   000    Old_age   Always       -       1
199 UDMA_CRC_Error_Count    0x000a   200   253   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0009   200   200   051    Pre-fail  Offline      -       0

をを、197 Current_Pending_Sectorが消えたよ!
198 Offline_Uncorrectableも消すには、long testをやればいいとのこと。

# smartctl -t long /dev/hda
# smartctl -A -l selftest /dev/hda
smartctl version 5.33 [i686-pc-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
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     0x000b   198   192   051    Pre-fail  Always       -       73
  3 Spin_Up_Time            0x0007   097   094   021    Pre-fail  Always       -       5925
  4 Start_Stop_Count        0x0032   099   099   040    Old_age   Always       -       1724
  5 Reallocated_Sector_Ct   0x0033   197   197   140    Pre-fail  Always       -       34
  7 Seek_Error_Rate         0x000b   200   200   051    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   098   098   000    Old_age   Always       -       1815
 10 Spin_Retry_Count        0x0013   100   100   051    Pre-fail  Always       -       0
 11 Calibration_Retry_Count 0x0013   100   100   051    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1724
196 Reallocated_Event_Count 0x0032   181   181   000    Old_age   Always       -       19
197 Current_Pending_Sector  0x0012   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0012   200   200   000    Old_age   Always       -       1
199 UDMA_CRC_Error_Count    0x000a   200   253   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0009   200   200   051    Pre-fail  Offline      -       0

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%       721         -
# 2  Extended offline    Completed: read failure       20%       712         202706820
# 3  Short offline       Completed without error       00%       712         -
# 4  Short offline       Completed without error       00%         0         -

ありゃ?消えないよ。なんでかな。要調査だな。でもlong testでread failureが出なくなったから、状況は昨日よりも改善したとみていいでしょう。
とりあえず今日はここまで。