その時は、ネットで対処方法を調べて、その対処方法を試してみたのですが、思うようにいきませんでした。
以下のような手順です。(この手順の詳細は、他サイトを参照してください)
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/sdbsmartctl 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
参考にさせていただいたので、PE Sizeを2倍すると計算があう理由を書いておきます。
返信削除pvdisplayで取得したPE SizeはKByte単位です。つまり、PE Sizeは4096 × 1024byteです。
実際に知りたいのはPEごとのセクタ数ですから、
4096 × 1024 ÷ 512(1セクタのByte数) = 4096 × (1024 ÷ 512) = 4096 × 2
となり、2倍するとPEのセクタ数が出るようにみえるということです。