Vine Linux 4.2 起動時にハードディスクのDMAモードを変更する

ふと思い立って、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になるのか? ケーブルが無いので試せないのだが。

*1:そういえばIDEケーブルがNGだった、という可能性もあるな