LinuxでIDEのバスマスタを有効にするには

「PC UNIX登龍門」に,Linuxのカーネルコンフィグレーションを変更してIDEのバスマスタを使うことができると書いてありました。しかし,記事のとおり設定して再起動したのですが,速くなったようには思えません。Linuxは本当にバスマスタに対応しているのでしょうか?


Linuxは一部のチップセット(CMD640,インテル Triton PIIXなど)でIDEのバスマスタをサポートしていますが,記事では説明不足でした。カーネルにバスマスタドライバを組み込んだだけでは有効にはならず,起動後にhdparmユーティリティを使ってIDEドライブのDMA転送機能などを有効にしなければなりません。
 hdparmコマンドの使い方はマニュアル(man hdparmで表示)を参照していただくとして,ここでは現在の一般的なFast ATA対応のドライブ+インテル PIIXでバスマスタを有効にする方法を紹介しておきます。
 IDEドライブはメーカーや種類によってサポートしているDMAモード,PIOモードが異なります。そのため,hdparmでドライブごとにDMA機能やPIO機能を設定するようになっています。
 まず,hdparmを使ってドライブがサポートしている機能を調べましょう(root権限が必要です)。
 画面はMaxtorのIDEドライブ情報を表示させた例です(/dev/hdaに接続されています)。さまざまな情報が表示されていますが,この情報からドライブがDMAモード2(Fast ATA)をサポートしていることが分かります。
 このドライブを使いバスマスタなどの機能を有効に機能させるには,コマンドラインで次のようにします。オプションごとに意味を解説していきます。

# /usr/sbin/hdparm -d1 -X34 -c1 -m16 /dev/hda
-d1
-d1でバスマスタ有効,-d0でバスマスタ無効。
-X34
ドライブのモードをMultiword DMAモード2(Fast ATAで最も高速なDMAモード)に設定する(マニュアル参照)。
-c1
-c0で16ビットモード(デフォルト),-c1で32ビットモード。
-m16
マルチセクタリードの最大指定。この数値は画面で示したMultSect=部分の数値を使います。

 以上で,/dev/hdaに接続されているMaxtorドライブがバスマスタで動作するようになります。2台以上のIDEドライブがある場合は,hdparmコマンドでドライブごとに設定していく必要がある点に注意してください。すべてのドライブで良好な値が決まったら,起動時自動実行スクリプト/etc/rc.d/rc.localに記入しておくといいでしょう。
 ただし,バスマスタが有効になっても,データを読み書きする速度が,目に見えて高速になるわけではありません。バスマスタの効果は,複数のディスクアクセスを行うタスクを走らせたときに表れます。バスマスタを使わない状態ではタスクの実行速度が極端に落ちますが,バスマスタが有効になっていれば快適に(もちろん多少は速度が落ちますが)各タスクが走るようになります。バスマスタを有効にしたことでCPUがデータ転送から解放され,タスク処理に集中できるようになるからです。
(米田 聡)

# /usr/sbin/hdparm -i

/dev/hda:

Model=Maxtor 83240D4, FwRev=TAVX3322, SerialNo=R40CD5QA
Config={ Fixed }
RawCHS=6696/15/63, TrkSize=0, SectSize=0, ECCbytes=20
BuffType=3(DualPortCache), BuffSize=256kB, MaxMultSect=16, MultSect=16
DblWordIO=no, maxPIO=2(fast), DMA=yes, maxDMA=2(fast)
CurCHS=6696/15/63, CurSects=6327720, LBA=yes, LBAsects=6328125
tDMA={min:120,rec:120}, DMA modes: mword0 mword1 *mword2
IORDY=on/off, tPIO={min:120,w/IORDY:120}, PIO modes: mode3 mode4
画面 hdparmでドライブを調べる