ページ

2013年7月13日土曜日

Linux LVMでのCurrent_Pending_Sectorの対処方法

一年以上前、smartのCurrent_Pending_Sectorの値が2となり、ディスクに不良セクターが発生していました。
その時は、ネットで対処方法を調べて、その対処方法を試してみたのですが、思うようにいきませんでした。
以下のような手順です。(この手順の詳細は、他サイトを参照してください)

1. 該当パーティションをfdiskで調べる。
# fdisk -lu /dev/sdb

2. 該当ボリュームをdfで調べる。
# df

3. ブロックサイズをtune2fsで調べる。
# tune2fs -l /dev/VolGroup01/LogVol00

4. 問題のLBAがどのブロックに含まれるか計算する。
b = int(( L - S ) * 512 / B )
  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

上記で、B=4096, L=1307847129, S=64となるので、
計算すると
b = int((1307847129 - 64) * 512 / 4096) = 163480883

5. debugfsで上記で求めたブロックのinodeと、そのinodeのファイルを調べる。
# debugfs
debugfs 1.39 (29-May-2006)
debugfs:  open /dev/VolGroup01/LogVol00
debugfs:  icheck 163480883
Block   Inode number
163480883      
debugfs:  quit

6. ファイルが割り当てられていなければ、ZEROを書き込みます。
# dd if=/dev/zero of=/dev/VolGroup01/LogVol00 count=1 bs=4096 seek=163480883
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 2.8e-05 seconds, 146 MB/s
# sync

7. smartctlで確認します。
# smartctl -A /dev/sdb

以上の方法では、不良セクターが回復しませんでした。

理由は、パーティションがLinux LVMだったからです。

この事は、その理由に気付かず、そのまま放置していたのですが、Current_Pending_Sectorの値が15にまで増えてしまったので、再度、キチンと調べて対処することにしました。

以下が、Linux LVMの場合の対処方法です。(参考URL:http://intel69.blogspot.jp/2009/03/lvm-badblock-recovery.html)


1.Current_Pending_Sectorと該当LBAを確認する。

# smartctl -A -l selftest /dev/sdb
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-2.6.18-348.6.1.el5] (local build)
Copyright (C) 2002-11 by Bruce Allen, 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     0x002f   191   191   051    Pre-fail  Always       -       22617
  3 Spin_Up_Time            0x0027   253   238   021    Pre-fail  Always       -       933
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       41
  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   071   071   000    Old_age   Always       -       21697
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       38
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       12
193 Load_Cycle_Count        0x0032   174   174   000    Old_age   Always       -       79911
194 Temperature_Celsius     0x0022   109   101   000    Old_age   Always       -       41
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       15
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   168   000    Old_age   Offline      -       21

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%     21690         1307847129
# 2  Short offline       Completed without error       00%     21666         -
# 3  Short offline       Completed: read failure       90%     21642         1327457088
# 4  Short offline       Completed: read failure       90%     21618         1327457088
# 5  Short offline       Completed: read failure       90%     21594         1327457088
# 6  Extended offline    Completed: read failure       90%     21570         1327457088
# 7  Short offline       Completed: read failure       90%     21546         1327457090
# 8  Short offline       Completed: read failure       90%     21522         1327457088
# 9  Short offline       Completed without error       00%     21499         -
#10  Short offline       Completed: read failure       90%     21474         1327457093
#11  Short offline       Completed without error       00%     21451         -
#12  Short offline       Completed: read failure       90%     21427         547947324
#13  Extended offline    Completed: read failure       90%     21403         2340591009
#14  Short offline       Completed: read failure       90%     21379         2340591008
#15  Short offline       Completed: read failure       90%     21355         2340591008
#16  Short offline       Completed: read failure       90%     21331         2340591008
#17  Short offline       Completed without error       00%     21307         -
#18  Short offline       Completed: read failure       90%     21283         2340591013
#19  Short offline       Completed: read failure       90%     21259         2340591018
#20  Extended offline    Completed: read failure       90%     21235         2340591017
#21  Short offline       Completed: read failure       90%     21211         2340591016

Current_Pending_Sector が 15 に増え、LBA(Logical Block Addressing)の 1307847129 がエラーと
なっている。
LBAは単純にハードディスクの最初のセクターから何番目かを示す数字のようなので、実際のファイルシス
テム上での位置を求める必要がある。

2.ディスクパーティションと開始位置を調べる。

# fdisk -lu /dev/sdb

Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders, total 3907029168 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1              64  3907024064  1953512000+  8e  Linux LVM ←( これがLinuxなら通常の方法)

3.LVMパーティションなので、さらに論理ボリュームを求める。

3-1.まず、開始位置を差し引く。

(1307847129 - 64) = 1307847065

3-2.物理ボリュームのPEサイズを取得する。

# pvdisplay -c /dev/sdb1 | awk -F: '{print $8}'
4096
※この4096はファイルシステムのブロックサイズではありません。

3-3.ここが不明なのだが、LBAブロックサイズを求める為に2を掛ける?ようである。

4096 * 2 = 8192
※いろいろ調べましたが2倍する理由は不明です。でも、結果は正しいようです。

3-4.ブロックナンバーをPEサイズで割る。これが、PE番号となる。

1307847065 / 8192 = 159649.2999267578

3-5.該当するPE番号を論理ボリュームから探す。
今回は、/dev/sdb1には1つしか論理ボリュームを割り当てていないので、必然的に/dev/VolGroup01/LogVol00となる。しかし、複数ある場合には必要となります。
例えば、/dev/sdc1の場合なら/dev/VolGroup02/LogVol00が該当する論理ボリュームとなる。

# lvdisplay --maps | egrep 'Physical|LV Nam'
  LV Name                /dev/VolGroup03/LogVol00
    Physical volume     /dev/sdd1
    Physical extents    0 to 476930
  LV Name                /dev/VolGroup03/LogVol01
    Physical volume     /dev/sdd1
    Physical extents    476931 to 715396
  LV Name                /dev/VolGroup02/LogVol00
    Physical volume     /dev/sdc1
    Physical extents    0 to 427519
  LV Name                /dev/VolGroup02/LogVol01
    Physical volume     /dev/sdc1
    Physical extents    427520 to 476930
  LV Name                /dev/VolGroup01/LogVol00
    Physical volume     /dev/sdb1
    Physical extents    0 to 476930 ← (159649がこの範囲内)
  LV Name                /dev/VolGroup00/LogVol00
    Physical volume     /dev/sda2
    Physical extents    0 to 4709
  LV Name                /dev/VolGroup00/LogVol01
    Physical volume     /dev/sda2
    Physical extents    4710 to 4764

4.物理ボリュームの開始位置からのオフセット値を求める。通常は384となる。

# grep pe_start $(grep -l /dev/sdb1 /etc/lvm/backup/*)
                        pe_start = 384

以下のコマンドでも求めることが可能と記載されているが、実際に表示された値は良く判りません。
# pvs -o+pe_start /dev/sdb1
  PV         VG         Fmt  Attr PSize PFree 1st PE
  /dev/sdb1  VolGroup01 lvm2 a--  1.82T    0  192.00K

5.以下の計算式で不良ブロック番号を求める。

( PEのパーティション開始位置 × PEサイズ ) + オフセット = ( 0 * 8192 ) + 384 = 384

上記の結果を、下記のパーティション開始位置に当てはめる。

( 物理パーティション開始位置 - パーティション開始位置 ) / ( ファイルシステムブロックサイズ / 512 ) =( 1307847065 - 384 ) / ( 4096 / 512 ) = 163480835

6.不良ブロックにファイルが割り当てられていないかをチェック

# debugfs
debugfs 1.39 (29-May-2006)
debugfs:  open /dev/VolGroup01/LogVol00
debugfs:  icheck 163480835
Block   Inode number
163480835       <block not found>
debugfs:  quit

割り当てられていた場合は、以下のようにinode番号が表示されるので
ncheckで、該当ファイルを調べて移動してから作業すること

debugfs:  icheck 68493359
Block   Inode number
68493359        19005713
debugfs:  ncheck 19005713
Inode   Pathname
19005713        /mnt/data/ファイル名など
debugfs:  quit

7.不良セクターにゼロ値を書き込む。(書き込みを行うことで再配置されるようです)

# dd if=/dev/zero of=/dev/VolGroup01/LogVol00 count=1 bs=4096 seek=163480835
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 2.8e-05 seconds, 146 MB/s
# sync

8.Current_Pending_Sector が減っているかを確認する。

# smartctl -A -l selftest /dev/sdb
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-2.6.18-348.6.1.el5] (local build)
Copyright (C) 2002-11 by Bruce Allen, 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     0x002f   191   191   051    Pre-fail  Always       -       22618
  3 Spin_Up_Time            0x0027   253   238   021    Pre-fail  Always       -       933
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       41
  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   071   071   000    Old_age   Always       -       21697
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       38
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       12
193 Load_Cycle_Count        0x0032   174   174   000    Old_age   Always       -       79913
194 Temperature_Celsius     0x0022   109   101   000    Old_age   Always       -       41
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       14
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   168   000    Old_age   Offline      -       21

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%     21690         1307847129
# 2  Short offline       Completed without error       00%     21666         -
# 3  Short offline       Completed: read failure       90%     21642         1327457088
# 4  Short offline       Completed: read failure       90%     21618         1327457088
# 5  Short offline       Completed: read failure       90%     21594         1327457088
# 6  Extended offline    Completed: read failure       90%     21570         1327457088
# 7  Short offline       Completed: read failure       90%     21546         1327457090
# 8  Short offline       Completed: read failure       90%     21522         1327457088
# 9  Short offline       Completed without error       00%     21499         -
#10  Short offline       Completed: read failure       90%     21474         1327457093
#11  Short offline       Completed without error       00%     21451         -
#12  Short offline       Completed: read failure       90%     21427         547947324
#13  Extended offline    Completed: read failure       90%     21403         2340591009
#14  Short offline       Completed: read failure       90%     21379         2340591008
#15  Short offline       Completed: read failure       90%     21355         2340591008
#16  Short offline       Completed: read failure       90%     21331         2340591008
#17  Short offline       Completed without error       00%     21307         -
#18  Short offline       Completed: read failure       90%     21283         2340591013
#19  Short offline       Completed: read failure       90%     21259         2340591018
#20  Extended offline    Completed: read failure       90%     21235         2340591017
#21  Short offline       Completed: read failure       90%     21211         2340591016

9.他に不良セクターが無いかを調べる。エラーがあれば対処する。

9-1.簡易セルフテストを実施

# smartctl -t short /dev/sdb

9-2.終了したかどうかは以下のコマンドで確認

# smartctl -c /dev/sdb

9-3.終了すれば、LBAのエラーが無いかを確認

# smartctl -A -l selftest /dev/sdb

9-4.LBAのエラーが無ければ、拡張セルフテストを実施

# smartctl -t long /dev/sdb

1 件のコメント:

  1. 参考にさせていただいたので、PE Sizeを2倍すると計算があう理由を書いておきます。
    pvdisplayで取得したPE SizeはKByte単位です。つまり、PE Sizeは4096 × 1024byteです。
    実際に知りたいのはPEごとのセクタ数ですから、
    4096 × 1024 ÷ 512(1セクタのByte数) = 4096 × (1024 ÷ 512) = 4096 × 2
    となり、2倍するとPEのセクタ数が出るようにみえるということです。

    返信削除