ふと思い立って、NASを買わないで自作してみた。バカだな、自分。
ちなみにこんな構成。RAIDじゃないのは仕様です。
- OS
- Vine Linux 4.2 FTP
- MB
- VIA EPIA-N8000E (VIA CN400 North Bridge + VIA VT8237R-Series South Bridge)
- HDD
- HITACHI Deskstar T7K500 320GB (HDT725032-VLAT80) -> ATA-133, 7200RPM
……起動する度にハードディスク周りのエラーがでる。不吉だ。起動後にディスクに書き込んだりすると、最初に1回だけエラーが出る。怪しい。精神衛生上非常によろしくない。
hda: dma_intr: status=0x51 { DriveReady SeekComplete Error } hda: dma_intr: error=0x84 { DriveStatsuError BadCRC } ide: failed opcode was: unknown hda: dma_intr: status=0x51 { DriveReady SeekComplete Error } hda: dma_intr: error=0x84 { DriveStatsuError BadCRC } ide: failed opcode was: unknown hda: dma_intr: status=0x51 { DriveReady SeekComplete Error } hda: dma_intr: error=0x84 { DriveStatsuError BadCRC } ide: failed opcode was: unknown hda: dma_intr: status=0x51 { DriveReady SeekComplete Error } hda: dma_intr: error=0x84 { DriveStatsuError BadCRC } ide: failed opcode was: unknown hdb: DMA disabled ide0: reset: success
NASなのにHDDが最初から不調だなんて洒落にならない。ということで色々と試してみたので記録しておく。なお誠に遺憾ながらログは残っていない。色々と取っておけばネタになったのに、残念。
このエラーはなんだ?
とりあえずググってみて分かった、原因らしきもの。
- IDEケーブルが長すぎるか、もうすぐ寿命
これは確立低めだと判断。ケーブルは新品で、しかも短い。
- DMA回りの相性
- HDDがヤバイ
こっちか?
何となく勘で不良セクタの存在を疑ってみる。
新品のディスクだし、インストール時に一応フォーマットはしてるけど、心配だ。そういえばフォーマットの処理に不良セクタのチェックは含まれているのだろうか?
ということでbadblocksで不良セクタをチェックしてみた(「e2fsck -c /dev/hda1」だと不良ブロックinodeに登録されるけど、まずは確認のみ)。
badblocks -o /tmp/badblock.hda1 -n -v /dev/hda1 badblocks -o /tmp/badblock.hda2 -n -v /dev/hda2 badblocks -o /tmp/badblock.hda4 -n -v /dev/hda4 badblocks -o /tmp/badblock.hda6 -n -v /dev/hda6
不良セクタは特に無いみたい。むぅ。
S.M.A.R.T.で調べてみる。
各種情報を表示させて眺めてみる。
smartctl -a /dev/hda
どこかのサイトを参考にしつつチェックしたが、特に問題は無いように見える。なので今度はテストしてみる。
smartctl -t short /dev/hda smartctl -l selftest /dev/hda
問題なし。
smartctl -t long /dev/hda smartctl -l selftest /dev/hda
これも問題なし。むむっ。
DMA回りを疑ってみる。
VT8237関連でググってみると、ごく稀に「ハードディスク周りのエラーが出るんだけど」という話題にあたる。問題提起だけで、解決に結びつく情報は無いけど。
実はHITACHIのこのHDD、シリアルATA版の方はマザーボードとの相性が悪くて動かないらしい。なので「もしかしたらチップとHDDの相性とかでDMA回りで問題発生しているのかも」と考えて、起動時にDMA転送をOFFにしてみた。
/etc/sysconfig以下のharddisksをharddiskhdaという名前でコピーして、「USE_DMA=0」として、再起動する。
相変わらず起動時のエラーは出るが、その後の書き込み時に1回だけ出ていたエラーはでなくなった。ログを見るに、起動時にエラーがでた後にDMAをOFFにする処理を実行しているようだ。とにかくDMA転送のあたりが問題点ということか。
取り敢えずはこれでOKだけど、さすがにpioは遅いので嫌だ。
DMA回りで悪あがきしてみる。
どこだったか忘れたが、「起動時はUDMA 5だけど、エラーが出てUDMA 4になり、その後は安定動作する」という記事を見かけた。
……まさか。と思いつつ、DMAを有効にするようにして再起動し、DMAのモードを確認してみた。
hdparm -i /dev/hda
現在の転送モードに*がついているはずだが、ついてない。オプションを変えてみる。
hdparm -I /dev/hda
udma5にチェックがついている。ATA-100で動いているということか。試しにファイルを書き込んでエラーを発生させてから、再度確認するとudma4になっている。
ということは、「ATA-100で動かそうとしたけどダメっぽいのでATA-66にしました」ということである可能性が高い。カタログスペック上はATA-133でいけるはずなので、起動時のエラーは「ATA-133で動かそうとしたけどダメっぽいのでATA-100にしました」ということかもしれない。
/etc/sysconfig/harddiskhdaを書き換えて「USE_DMA=1」「EXTRA_PARAMS=-X68」としてみたところ、起動時のエラー以外は発生しなくなった。
ということで、現在ATA-66で自作NASを本格的に稼動中である。これで実は他に原因が――とかだったらどうしよう*1。
ところで、実はケーブルがATA-66対応のものだった、というケースではどんな挙動になるんだろうか。最初からATA-66になるのか? ケーブルが無いので試せないのだが。