Vine Linux 3.2用 3ware 9xxx driver

(更新日 2005年11月22日)

Up

Vine Linux 3.2用 3ware 9xxx ドライバインストールディスク

3wareのRAIDカードは、 Windowsだけでなく、 LinuxやFreeBSDにも幅広く対応しているので、 UNIXでRAIDを組みたい人にはありがたいRAIDカードです。 Linux用デバイスドライバとしてはRedHatやSUSE用のドライバが、 3wareのページからダウンロードできます。 デバイスドライバのソースプログラムもダウンロードできます。 私が使いたいVine Linux 3.2用は用意されていませんが、 デバイスドライバのソース"3w-9xxx-linux-src-2.4-9.3.0.1.tgz"から ドライバインストールディスクを作ってみました。 これを使うと、 Vine Linux3.2を9550SXのRAIDドライブにインストールすることができます(かもしれません)。 ここに置いておきますので、良かったら使ってみてください。 なお、このドライバインストールディスクは、 かなり変なことをして無理やり作ったものですので、 まともに動く保証はありません。 これを使って生じた損害については、自己責任でお願いします。

ドライバインストールディスクの使い方

  1. 9550SX_Vine32_driver_installdisk_v9_3_0_1.tar.gz を展開して、出てくる5つのファイル (modinfo, modules.cgz, modules.dep, pcitable, rhdd-6.1) をDOSフォーマットしたフロッピーにコピーしてください。 これがLinuxインストール時に使用するドライバインストールディスクになります。
  2. Vine Linux 3.2をインストールしたい計算機にVineのインストールCD-ROMを入れて起動します。
  3. 起動時のプロンプトに「linux dd」を指定します。 こうすると、ドライバインストールディスクを挿入するように促されますので、 指示に従ってフロッピーを読ませます。
  4. パーティションを分ける画面まで進んだとき、 RAIDドライブが認識されていれば成功です。 あとは通常どおりVine Linuxをインストールしてください。

ドライバインストールディスク作成までの道のり

http://www.3ware.com/KB/article.aspx?id=14546http://www.3ware.com/KB/article.aspx?id=11843 などのオフィシャル情報に目を通した感じでは、 簡単にドライバインストールディスクを作れそうでした。 が、世の中そんなに甘くなかったのでした。

前提として、計算機Aと計算機Bの2台の計算機があるものとします。 計算機Aでは、Vine Linux 3.2がすでに稼働していて、 ドライバをコンパイルするために使用するものとします。 計算機Bに、RAIDを組んで、Vine Linux 3.2を新規インストールする場合の話をします。 計算機Bでは、ハードディスクの接続やRAIDのBIOSの設定等は済んでいるものとします。 以下では、2つの計算機の話がまぜこぜになっています。 すみません。 どちらの計算機の話なのかは、コンパイルなのかインストールなのかで判別してください。

失敗その1

3wareのsupportのページからドライバのソースと、 http://www.3ware.com/KB/article.aspx?id=14546からPerlスクリプトBuild-3w-driver.plを取ってきて、
# ./Build-3w-driver.pl -s 3w-9xxx.tgz
を実行したところ、わんさかエラーが出ました。 原因は、カーネルのソースツリーを準備するのを忘れていたためです。 デバイスドライバのコンパイルには、カーネルのソースツリーが必要です。 ちゃんと準備しておきましょう。

失敗その2

カーネル(kernel-2.4.31-0vl1.8)のソースツリーを準備して、再度コンパイルを実行。

# ./Build-3w-driver.pl -s 3w-9xxx.tgz
やっぱりエラーが出ます。 Build-3w-driver.pl中の ディレクトリの名前やアーキテクチャの名前がVineの環境と合っていないようです。 Build-3w-driver.plはPerlスクリプトなので、 中を書き換えては実行し直すこと数回、 なんとかドライバインストールディスクに必要な5つのファイルが生成されました。 これらのファイルをフロッピーにコピーして、 ドライバインストールディスクを作りました。 計算機BでVineのインストールを開始して、 作成したドライバインストールディスクを読み込ませると、 Failとかなんとか出て、RAIDカードが認識されません。そんなぁ。

ALT+F3やALT+F4をして、裏画面を見てみると、

* extracting pattern 2.4.31-0vl1.8*/3w-9xxx.o
* going to insmod 3w-9xxx.o (path is /tmp/modules/3w-9xxx)
/tmp/3w-9xxx.o: kernel-module version mismatch
        /tmp/3w-9xxx.o was compiled for kernel version 2.4.31-0vl1.8
        while this kernel is version 2.4.31-0vl1.8BOOT
てなエラーが出ています。 どうやら、3w-9xxx.oに含まれているカーネルバージョン情報が 「2.4.31-0vl1.8」なのに対して、 CD-ROMで起動したVine Linuxのカーネルが「2.4.31-0vl1.8BOOT」 であるため、合わないと文句を言っているようです。 これを合わせさえすれば、なんとかなるのかな?

失敗その3

Build-3w-driver.plにより生成された3w-9xxx.o, 3w-9xxx.smp, 3w-9xxx.bot をstringsコマンドで調べてみました。

$ strings 3w-9xxx.o | grep kernel_version
kernel_version=2.4.31-0vl1.8
$ strings 3w-9xxx.smp | grep kernel_version
kernel_version=2.4.31-0vl1.8
$ strings 3w-9xxx.bot | grep kernel_version
kernel_version=2.4.31-0vl1.8
うーん、3w-9xxx.o(ユニプロセッサ用)は良いとして、 3w-9xxx.smp(マルチプロセッサ用)と3w-9xxx.bot(ブート用)は、 本来それぞれ「kernel_version=2.4.31-0vl1.8smp」、 「kernel_version=2.4.31-0vl1.8BOOT」と なってほしいところです。 とりあえず、このバージョン情報をなんとかして合わせましょう。 ソースプログラム3w-9xxx.cや3w-9xxx.hを見てみても、 それらしい指定は見当たりません。 ソースプログラムに付いてきた Makefile.rhあたりにカーネルバージョン情報を指定する変数でもあるかと思いきや、 見つかりません。 コンパイルオプションに-D__module__BOOTとか、 -D__module__smpとか書かれているので、 たぶんRedHatならこのおかげで自動的にカーネルバージョン情報が取得されるのでしょう。 Vineではこのコンパイルオプションは役に立っていないようです。 Build-3w-driver.plを用いてドライバインストールディスクを作ることはあきらめました。

失敗その4

いずれにしても、カーネルバージョン情報はヘッダファイル何々.hのどこかから 取得しているようなので、ヘッダファイルが読み込まれる流れを追って みました。 その結果、 良い方法とは思えませんが、安直に済ませるために、 /boot/kernel.hをいじることにしました。 以下は私がやったことですが、良い子はマネをしてはいけません。

まずはユニプロセッサ用3w-9xxx.oの生成。 Build-3w-driver.plは使わないことに決めたので、 tarで3w-9xxx.tgzを展開して、 直接makeコマンドをたたきます。 ユニプロセッサカーネルのVine Linuxを起動して、

$ make -f Makefile.rh
とすれば、ユニプロセッサ用3w-9xxx.oが生成されます。 これは簡単ですね。

続いてマルチプロセッサ用3w-9xxx.smpの生成。 /boot/kernel.h(のバックアップを取ってから)の末尾に、 以下の3行を書き加えます。

#undef __BOOT_KERNEL_BOOT
#undef __BOOT_KERNEL_UP
#define __BOOT_KERNEL_SMP 1
__BOOT_KERNEL_SMPのみ値を1にして有効にしています。 この後、
$ make smp -f Makefile.rh
とすれば、マルチプロセッサ用3w-9xxx.smpが生成されます。 カーネルバージョン情報を確認してみましょう。
$ strings 3w-9xxx.smp | grep kernel_version
kernel_version=2.4.31-0vl1.8smp
意図したカーネルバージョン情報になっています。 が、本当はこれでいいのかどうか分かりません。 あと、忘れずに/boot/kernel.hを元に戻しておきます。

残るはブート用3w-9xxx.botの生成。 マルチプロセッサのときと同様に、 /boot/kernel.h(のバックアップを取ってから)に、 以下の3行を書き加えます。

#define __BOOT_KERNEL_BOOT 1
#undef __BOOT_KERNEL_UP
#undef __BOOT_KERNEL_SMP
__BOOT_KERNEL_BOOTのみ値を1にして有効にしています。 この後、
$ make bot -f Makefile.rh
とすれば、ブート用3w-9xxx.botが生成され、、、ません。 エラーが出てコンパイルに失敗しました。 /boot/autoconf-BOOT.hがないためでした。 /boot/autoconf-up.hや/boot/autoconf-smp.hはあるのに。

とりあえず生成完了

私の計算機Aに/boot/autoconf-BOOT.hがないのは、 kernel-BOOTパッケージを入れていないためでした。 apt-getかsynapticで取ってきて入れようとしたら、 なぜか(この時点では)バージョンが2.4.31-0vl1.8のkernel-BOOTパッケージが見つかりません。

# apt-get install kernel-BOOT
としたら、kernel-BOOT#2.4.27-0vl7.6パッケージが入りました。 ちょっと古いけど、ないものは仕方がありません。 とりあえず、/boot/autoconf-BOOT.hはできました。 こんなんで大丈夫かな。

この後、上記のように/boot/kernel.hを書き換えて、 再度ブート用3w-9xxx.botの生成。

$ make bot -f Makefile.rh
やった。ブート用3w-9xxx.botが生成されました。 カーネルバージョン情報を確認してみましょう。
$ strings 3w-9xxx.bot | grep kernel_version
kernel_version=2.4.31-0vl1.8BOOT
おお、ketnel-BOOTパッケージのバージョンではなく、 ありがたいことに意図したカーネルバージョン情報になっています。 こんな無理やりでいいのかいな。 あと、忘れずに/boot/kernel.hを元に戻しておきます。

ドライバインストールディスクの作成

いよいよ、苦労して生成した3w-9xxx.o, 3w-9xxx.smp, 3w-9xxx.botを まとめてmodules.cgzを作ります。

$ mkdir 2.4.31-0vl1.8
$ cp 3w-9xxx.o 2.4.31-0vl1.8/3w-9xxx.o
$ mkdir 2.4.31-0vl1.8smp
$ cp 3w-9xxx.smp 2.4.31-0vl1.8smp/3w-9xxx.o
$ mkdir 2.4.31-0vl1.8BOOT
$ cp 3w-9xxx.bot 2.4.31-0vl1.8BOOT/3w-9xxx.o
$ find 2.4.31-0vl1.8* -print | cpio -o --format=newc > modules
$ gzip -9 -S .cgz modules
はい、できました。 Build-3w-driver.plを実行して失敗したときに生成されていた残りの4つのファイル (modinfo, modules.dep, pcitable, rhdd-6.1) とこのmodules.cgzをフロッピーにコピーして、 ドライバインストールディスクの出来上がりです。 もはやまともなドライバインストールディスクとは言えません。

インストール成功

かなり不安ながらも、計算機Bへのインストールを試してみました。 「linux dd」して、作成したドライバインストールディスクを読み込ませると、 ありがたいことにRAIDドライブを認識しました。やったー!! 無事、9550SXのRAIDドライブにVine Linux 3.2をインストールすることができました。 ちゃんとRAIDドライブからVineが起動します。 苦労が報われました。

あとがき

苦労してなんとか 9550SX RAIDドライブにVine Linux 3.2をインストールすることができました。 注意として、 私の環境では成功しましたが、他の環境でも同じようにうまくいくとは限りません。 ここに置いたドライバインストールディスクは、 上記の失敗談のように、かなり変なことをして無理やりに作ったものです。 私と同じように試してうまくいく保証はまるでありません。 ここに書いていることを試そうと思う人は、 このへんの事情をご了承の上、自己責任で試してください。