CentOSでホームサーバを作ろう
HDDの状態確認(S.M.A.R.T)
最終更新:
centos-homeserver
-
view
はじめに
HDDの状態を確認できるツールをインストールし、
適宜エラーの発生状態をメールできるようにする。
適宜エラーの発生状態をメールできるようにする。
ツールの導入
# yum -y install smartmontools
不良セクタの確認と消去
# smartctl -t short /dev/sdb
を実行すると、終了までにかかる目安の時間が表示されるので、
その時間まで待ってから
その時間まで待ってから
# smartctl -l selftest /dev/sdb
を実行すると、エラーがある場合は以下の例のように表示される。
=== 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 90% 93 4291054998
また、エラーが無い場合は
# smartctl -l error /dev/sdb
SMART Error Log Version: 1 No Errors Logged
と表示される。(多分。)
ただ、上の例の不良セクタの位置は後述の
ただ、上の例の不良セクタの位置は後述の
# fdisk -l -u /dev/sdb
を行って表示される最終セクタの外にあるので、
何かの間違いではないかと思われる・・・。(大丈夫かいな?)
しかも、LifeTimeの残り時間も93時間しかないし。(おいおい)焦った方が良いのか?。
何かの間違いではないかと思われる・・・。(大丈夫かいな?)
しかも、LifeTimeの残り時間も93時間しかないし。(おいおい)焦った方が良いのか?。
不良セクタの実際の位置(block number)の確認
不良セクタの位置(block number)を"dd"コマンドで0埋めすることで問題が解消する場合がある。
その方法を以下に示す。
その方法を以下に示す。
対象のデバイスの開始セクタの確認
対象のデバイス(例:/dev/sdb &colro(red){"/dev/sdb1"などではない。})の
開始セクタやパーテション状態を確認するコマンド
開始セクタやパーテション状態を確認するコマンド
# fdisk -l -u /dev/sdb
これを実行すると例として以下のような結果が表示される。
Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 224 heads, 56 sectors/track, 311465 cylinders, total 3907029168 sectors Units = セクタ数 of 1 * 512 = 512 bytes デバイス Boot Start End Blocks Id System /dev/sdb1 56 3907016959 1953508452 fd Linux raid 自動検出
→開始セクタが"56"であることが判る。
+ | ... |
また、
# smartctl -l selftest /dev/sdb
の結果は
=== 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 90% 82 15727544
となっている。
ここから、ddコマンドで指定するアドレスを決定する。
あるHPのやり方に従うと、下の公式を用いて位置を求めるとある。
ここから、ddコマンドで指定するアドレスを決定する。
あるHPのやり方に従うと、下の公式を用いて位置を求めるとある。
b = (L-S)*512/B
各値の意味は、
b = 指定するブロック値(この値をddで指定する。)
B = ブロックサイズ(通常は4KByteでフォーマットされている)
L = 不良セクタの位置
S = "fdisk -lu"で把握できる先頭セクタ位置
※結果値は小数点切り捨て
各値の意味は、
b = 指定するブロック値(この値をddで指定する。)
B = ブロックサイズ(通常は4KByteでフォーマットされている)
L = 不良セクタの位置
S = "fdisk -lu"で把握できる先頭セクタ位置
※結果値は小数点切り捨て
先程の計算式を使ってseekに指定する値を決定。
(15727544 - 56) * 512 / 4096 = -> 1965936 (小数点切り捨て)
(15727544 - 56) * 512 / 4096 = -> 1965936 (小数点切り捨て)
# dd if=/dev/zero of=/dev/sdb bs=1024 count=100 seek=1965936
countは(余裕を見て)100ぐらいを指定。1だとうまく適切な位置にあたらないケースがあったので。
ただ、別のHPのやり方ではseekには先程の結果の値をそのまま指定している。
ただ、別のHPのやり方ではseekには先程の結果の値をそのまま指定している。
# dd if=/dev/zero of=/dev/sdb bs=1024 count=100 seek=15727544
countは(余裕を見て)100ぐらいを指定。1だとうまく適切な位置にあたらないケースがあったので。
いったいどちらが正しいのか、よくわからない・・・。(-_-;)
いったいどちらが正しいのか、よくわからない・・・。(-_-;)
自分の環境だと後者の「そのまま指定」する方法がうまくいった。
自分の環境(HDD)に合わせて使い分けると良い。(のかな?)
自分の環境(HDD)に合わせて使い分けると良い。(のかな?)
ちなみに、HDD全体を消去する方法は
# dd if=/dev/zero of=/dev/sdb
です。
※参考リンク
- S.M.A.R.T
- SMARTで得られるデータ
- smartdでメールを送信する設定
- smartctl
- 不良セクタの復活
- Western Disitalの公式テストツール