2012年1月15日日曜日

ハードディスクエラーとSMARTのPending sector, reallocated sector

SMARTで"Current Pending Sector Count"が検出されたときに、どう対応すればよいかという話。


Pending sector と reallocated sector、remap の概要

"Pending Sector"は、一言で言うと「不安定なセクタ」。次にアクセスしたときに正常に読み込める可能性もあるので"Remap"は行われないが、Remapされずにずっと不安定なままOSから参照されると dmesg等のログに "1 Currently unreadable (pending) sectors" といったエラーが出力され続けることがある。

エラーを解消するには、セクタをPending状態からremapされた状態、つまり"Reallocated sector"に変化させる必要がある。そのためには、セクタに対して一度書き込みを行えばよい。書き込みを行うことにより"Pending"の状態から"Reallocated"の状態に変化し、remapが行われるようになってエラーが解消する。同時に、SMARTの"Current Pending Sectors Count" が減り、"Reallocated Sectors Count"が増える。

ただし、エラーが解消する代わりにRemap処理はディスクアクセスの性能を落とす可能性がある(論理的に連続している情報が物理的には離れたトラックに配置され、磁気ヘッドのシーク時間が増えるため)。


対応方法

参考ページに書いてある。"hdparm --write-sector /dev/x" を使う方法と "dd if=/dev/zero of=/dev/x bs=4096 count=1 seek=y" を使う方法の二通りがあるが、前者のほうがLBAを直接指定すればよいので簡単かな、と。


Mac OS X: fsck reports benign errors when journaling is turned on

support.apple.com に、MacOS X で fsck のエラーが出ても気にしなくてよいよ、と書いてあった(JHFS+などのジャーナリングファイルシステムを使っている場合の話)。


Mac OS X: diskutil -- Modify, verify and repair local disks.

Mac OS にインストールされている、ディスクユーティリティコマンド。ディスク状態の確認、パーティションの作成、マージなどに使える。

diskutil によると、このコマンドはAppleが用意したもので、普通のBSDには入っていないらしい。


自分が使ったものだけメモしておく。

diskutil list
ディスクと、ディスク内のパーティションを一覧表示。
$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *250.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            249.7 GB   disk0s2
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:        CD_partition_scheme Gateway                *442.3 MB   disk1
   1:                      CD_DA                         75.3 KB    disk1s0
   2:                      CD_DA                         83.6 MB    disk1s1
   3:                      CD_DA                         23.5 MB    disk1s2
   4:                      CD_DA                         117.1 MB   disk1s3
   5:                      CD_DA                         51.5 MB    disk1s4
   6:                      CD_DA                         50.7 MB    disk1s5
   7:                      CD_DA                         115.8 MB   disk1s6
SATAのHDD(disk0)と、CD-ROM(disk1)を認識しているのが分かる。
disk0 は"GUID_partition_scheme"というTYPEになっているので、MBRではなくGPTが書かれているのが分かる。
disk1 のほうは"Gateway"という名前になっているが、これは "Amazon.com: Gateway: John Abercrombie, Dave Holland, Jack Dejohnette: Music" という音楽作品である。
diskutil info
ディスクまたはパーティションの詳細情報を表示。次の実行例は、"SMART"情報だけを grep したもの。
$ diskutil info disk0|grep SMART
   SMART Status:             Verified
diskutil mergePartitions
パーティションをマージする。ファイルシステムと名前、マージするパーティション(複数)を引数で与える。最初に指定したパーティション以外のパーティションは消える。"JHFS+" は Journaled HFS+ のこと。
# diskutil mergePartitions JHFS+ new disk0s2 disk0s3