AHCI

安価な Serial ATA HDD でも本格的な Command Queuing を使えるという、いわゆる SATA NCQ に憧れていた(大袈裟)わけですが、これは AHCI で使える機能。自宅のメイン PC は 2004 年発売で AHCI には未対応ですが、SSD にシステム (Windows 7) を入れたらまったく快適になったので、じつはそれほど積極的に AHCI を使おうと思う状況でもありませんでした。でも最近、やっと使えそうな環境を入手したので、早速 AHCI を試してみました。

hp 社の ProLiant ML110 G6 の Core i3 モデルが、例によって NTT-X Store で格安販売されていたので、それを購入。ええ、ちょっと前の記事(3.5インチHDDが6台とかなんとか)は、これのことです(笑)

このPCサーバは Intel 3420 チップセットを採用しており、AHCI コントローラの先に SATA ポートを 6 つ備えています。BIOS を見ると、AHCI モードと IDE 互換モードを切り替えるメニューがありましたので、これを AHCI モードにします。これだけだと、3.5インチ HDD を 6 台繋いだらポートが全部埋ってしまいますので、SSD と DVD ド ライブ用にあと 2 ポート増やすべく、ASRock 社の SATA 拡張カードを購入しました。

なんだかすごく安いです。 こちらは Marvell 社の AHCI/SATA コントローラ 88SE9123 を搭載、6Gbps を 2 ポート持つ PCI-Express x1 カード。同じ 2 ポートで一世代前の SiliconImage 社の 3Gbps カード(SiI3132搭載)より、こちらのほうが安いという謎。これを ML110G6 の PCI-Express x1 ポート(マザーボード側のコネクタ形状は x4 のもの)に挿して、FreeBSD/amd64 8.2-RELEASE をインストールしてみます。

CD-ROM から kernel を起動する際のメニューで 6 を選択して boot を中断し、load ahci としてドライバを追加したら、boot として起動処理を再開。こうすると、その後のインストーラでのストレージ選択の際に、AHCI to CAM 特有の ada というデバイス名が表示されます。増設した Marvell 側を先に見つけるようで、先頭の ada0 は Marvell 側に接続したデバイスになります。せっ かくの 6Gbps なので、システム領域(と、ZIL領域)に使う予定の SSD をそちらに繋ぐことにしました。

インストールは問題なく完了し、SSD から FreeBSD が上がってきました。最初の一回だけは、まだ ahci ドライバを自動的には load しないので、CD-ROM boot の時と同様に boot の途中で load ahci してやる必要がありますが、それで起動してきたらすかさず loader.conf に ahci_load=”YES” と書いておけば、その次からは自動的に ahci ドライバを組み込んで起動するようになります。

ここでひとつ問題が発生。Marvell 側の SATA/AHCI ポートは、上下に2段(下段は eSATA と排他)という形状になっています。下段のポートが先に認識される(若い番号になる)ので、システムを入れる SSD は下段に繋いでいます。こちらは特に問題なく AHCI デバイスとして使えるのですが、上段のポートに繋いだ HDD が認識されないという現象が。ちなみにこの HDD は、例によって(笑)WD20EARS という2011年4月現在では一番人気の 2TB 玉。Intel 側の SATA/AHCI ポートに繋げば問題なく ada なデバイスとして認識されます。

# ML110G6 に内蔵されていた VB0160EAVEQ/HPG0 という 160GB 玉が、なぜか Marvell でも Intel でも ada デバイスとして認識されず、ahci ドライバを無効にして ata ドライバ(IDE互換)だけにすれば ad デバイスとしては使えるという謎の現象というか仕様だったのはまた別の話。なんだこれ。cam ドライバかな。面倒なので深く追求せずに別の PC に持って行って IDE 互換で使用中。

## 面倒だけどなんか悔しいので調べてみると、2011年4月現在の stable/8/sys/cam/ata/ata_xpt.c では認識されそうな雰囲気も。でもまた復帰させるのが面倒(笑)

dmesg を見ると、こんな記述が。

ahci0: <AHCI SATA controller> port …snip… mem …snip… irq 16 at device 0.0 on pci16

atapci0: <Marvell 88SE912x UDMA133 controller> port …snip… mem …snip… irq 17 at device 0.1 on pci16

ahci1: <Intel 5 Series/3400 Series AHCI SATA controller> port …snip… mem …snip… irq 18 at device 31.2 on pci0

pci16 のデバイスが SATA に加えて UDMA133 としても認識されている。ドライバが atapci なので、どうやら ATA(IDE) コントローラとしても見えているようだ。そして ada1 として認識されるはずの HDD が見えない。ついでに AHCI のほうはベンダ名(Marvell)がない。achi1 が Intel 側なので、achi0 は Marvell のはず。もしやと思って、GENERIC をコピーして、

nodevice      ata
nodevice      atadisk         # ATA disk drives
nodevice      ataraid         # ATA RAID drives
nodevice      atapicd         # ATAPI CDROM drives
nodevice      atapifd         # ATAPI floppy drives
nodevice      atapist         # ATAPI tape drives
nooptions    ATA_STATIC_ID   # Static device numbering

device          ahci            # AHCI

と、ahci ドライバを有効に、ata ドライバを無効にして buildkernel/installkernel し、この kernel で再起動してみたら、ata/UMDA133 のほうは消え、HDD も無事に ada1 として認識されました。やはり ata ドライバが邪魔をしていたようです。

ada0 at ahcich0 bus 0 scbus0 target 0 lun 0
ada0: <CSSD-SM60NS1Q 3.1.0> ATA-8 SATA 2.x device
ada0: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada0: Command Queueing enabled
ada0: 57241MB (117231408 512 byte sectors: 16H 63S/T 16383C)
ada1 at ahcich1 bus 0 scbus1 target 0 lun 0
ada1: <WDC WD20EARS-00MVWB0 51.0AB51> ATA-8 SATA 2.x device
ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada1: Command Queueing enabled
ada1: 1907729MB (3907029168 512 byte sectors: 16H 63S/T 16383C)

ちなみに ada0 として見えている SSD は、60GB クラスとしてはお買い得な CSSD-SM60NS1Q (SandForce SF1222 コントローラ) です。2011年4月現在で7,000円台。

Error: Failed to retrieve data for this request.

これでようやく、HDD に有効な、憧れ(笑)の Command Queuing が enable に。でもまだ ahci ドライバがベンダ名を表示しないので、ことのついでに、9-CURRENT からの MFC で、まさにこのための更新(定義追加)があったばかりの ahci.c 最新ソースを 8-STABLE から持ってきて、再度 build/install/reboot など。

ahci0: <Marvell 88SE912x AHCI SATA controller> port …snip… mem …snip… irq 16 at device 0.0 on pci16

ベンダとコントローラチップが表示されるようになりました。まずはめでたし。じつは、pciconf で見えるこのカードのデバイスIDを Google 様にお伺いしたところ、svn.freebsd の ahci.c がひっかかったのでしたw

そうそう、このように kernel に明示的に ahci ドライバを入れた場合は、loader.conf の ahci_load=”YES” は不要なので消しておきます。

とりあえず今日はここまで。次はもうひとつの憧れ(笑)であるところの、TRIM を使ってみようと思います。

1 コメント

[…] います。3年ほど前から ZFS で大容量の RAID-Z ファイルサーバを使っていたというのはこのあたりの記事にあるとおりです。容量にはまだまだ余裕があるので、Time Machine でもそこを使った […]

コメントを残す

あなたのコメント

*