*************** hdparm関係 UltraDMAを使うには

PCを新しくしたのでちょっと調べるた
最近の一般的なマザーボードに載っているチップセットでは、IDEコントローラーがUltraDMAモードや
DMAモードと呼ばれる高速にデータ転送を行える方法が有る

まず、hdparm のパッケージが必要。

# apt-get install hdparm
としてhdparmをinstall

*書式

hdparm [-d [0または1] ] [-i] [-t] [-y] [-Y] [-C] デバイス名

このうち [-y][Y][C] はスタンバイモード・スリープモード・活動状態表示等なので
ちょっと怖いので触れない方がいいかも。

実際の作業

hdparm -i /dev/hda でディスクの詳細情報を表示

# hdparm -i /dev/hda

/dev/hda:

 Model=ST340016A, FwRev=3.10, SerialNo=3HS38MNJ
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78165360
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes: pio0 pio1 pio2 pio3 pio4
 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5
 AdvancedPM=no WriteCache=enabled
 Drive Supports : Reserved : ATA-1 ATA-2 ATA-3 ATA-4 ATA-5


*が付いているのがコントローラが対応しているmode
UDMA mode5 という事は ATA100 という規格のもの
次にベンチマークを行ってみる

# hdparm -t /dev/hda

/dev/hda:
Timing buffered disk reads: 64 MB in 15.72 seconds = 4.07 MB/sec

hdparmを実行して設定を変えてみる

# hdparm -d 1 /dev/hda

/dev/hda:
setting using_dma to 1 (on)
using_dma = 1 (on)

PIOモードからDMAモードに変更
再度ベンチマークを行ってみる

# hdparm -t /dev/hda

/dev/hda:
 Timing buffered disk reads:  64 MB in  1.59 seconds = 40.25 MB/sec

すごい高速化!!


------man hdparm を参考に更に色々設定

hdpram -i から得た情報の中に
MaxMultSect=16 とある、そこでMul-tiple sector mode (aka IDE Block Mode)に
-m 16  を設定
その他色々なオプションも有るがこのマシンには有効では無かった
   *他のPCはudma2なので-d 1 -m 16 -X 66 で設定してある、がしかし、まだ研究の余地が有る

# /sbin/hdparm -d 1 -m 16 /dev/hda

これでDMA転送が効く
/etc/init.d/hdparm を作りupdate-rc.dにてdeamon起動にする

@sample script

------ /etc/init.d/hdparm ------

#! /bin/sh
# Setting IDE Bus Master
# chmod a+x /etc/init.d/hdparm
DAEMON=/sbin/hdparm
# DAEMON check
test -x $DAEMON || exit 0
# Select Working
case "$1" in
       start)
         $DAEMON -d 1 -m 16  /dev/hda
                ;;
        stop)
                $DAEMON -d 0 /dev/hda
                ;;
        status)
                $DAEMON -i /dev/hda
                $DAEMON -d /dev/hda
                ;;
        bench)
               $DAEMON -t /dev/hda
                ;;
        *)
                echo "Usage: /etc/init.d/hdparm {start|stop|status|bench}"
                exit 1
                ;;
esac
exit 0
--------------end-------------



pre>