Microsoft Virtual Server 2005 R2 の Linux 用アドインソフトに関する試行錯誤
SOFTWARE REPORT
Microsoft Virtual Server 2005
Microsoft Virtual Server 2005 R2 は、一台のサーバで複数の仮想 PC 環境を実現するソフトウェアです。
以前にも Virtual Server 2005 Standard Edition を使ってみる や Slackware 10.2 を Virtual Server 2005 へインストールしてみる で触れましたけど、これを利用することによって、サーバとして利用するには余りがちな CPU 性能やハードディスク容量を良い感じに利用することが出来るようになります。また仮想 PC それぞれが独立してますので、何か不具合があったときにも影響をそこまでに抑えられるところも嬉しいです。
そして今回は Slackware 10.2 のシステムパーティションを RAID 1 にしてみる にてシステムパーティションをミラーリングしていたときのお話です。
Linux を SCSI 構成のハードディスク環境へインストールして RAID 1 を構築したのですけど、初めて構築する時には 1 時間程度で複製が終わったものの、いざいろいろ試しつつ RAID デバイスを再同期してみたところ、それが終わるまでに 40 時間近くもかかってしまったのでした。その間、何か作業をするにも非常に時間がかかってしまって、再起動しようものなら再び同期が始まって。
そういえば Windows 環境でも SCSI 環境下でそういうことがありました。その時のお話は Virtual Server 2005 のディスクパフォーマンス低下を改善する にて触れましたけど、SCSI インターフェイス自体は Adaptec AIC-7870 を真似て動くらしいのですけど、どうやら専用の SCSI ドライバを使わないと、その性能が著しく低いような感じです。
そんな感じで、Linux 用のデバイスドライバは公開されていないものかと調べてみると、Microsoft Virtual Server 2005 のサイトにて Linux サポートのための仮想マシンアドインソフトウェアの提供と、Linux サポートについて という記載を見つけました。
これは 2006/04/17 の記事のようで、これによると Microsoft Virtual Server 2005 R2 上で Linux をゲスト OS として利用するためのアドインソフトウェアを提供開始したとのことでした。これには SCSI ドライバの他、時刻の同期や、マウス・ディスプレイのデバイスドライバも含まれるそうです。
サポートしているディストリビューションは Red Hat Linux 系および SuSE Linux 系だそうで、さすがに Slackware Linux は候補にあげられていませんでしたけど、以前の Windows での経験からしても試してみる価値は大いにありそうだったので、インストールを行ってみることにしました。
Virtual Server 2005 R2 仮想マシンアドインを準備する
Linux 用の仮想マシンアドインソフトウェアは Microsoft Connect より無償でダウンロードできるようです。
この Microsoft Connect というのは、製品開発のコミュニティみたいな位置づけのようです。Microsoft Passport アカウントでサインインしたら、"Virtual Machine Additions for Linux" の 「申し込み」 リンクを辿ります。そして利用規定に同意したうえで、名前やメールアドレス等を入力して利用申請をして承認が降り次第、利用可能 (アクティブ) となりました。
そうしたら "Microsoft File Transfer Manager 5.0" を使って "Virtual Machine Additions for Linux" をダウンロードして、インストールを行います。インストーラーパッケージは Windows 用のものとなりますので、Microsoft Virtual Server 2005 R2 が稼動している PC 上で実行する感じです。
あとは手順に従ってインストールを行えば、Linux 用の仮想マシンアドインが含まれたイメージファイルが Virtual Server 2005 R2 の所定の場所へ組み込まれます。仮想 PC 上の Linux へのインストールは、改めてそのイメージファイルを仮想 PC の CD-ROM へマウントさせてインストールする感じになります。
Slackware 10.2 へ仮想マシンアドインを組み込んでみる
今回入手した "Microsoft Virtual Machine Additions for Linux 1.0" は Red Hat 系および SuSE 系のみを想定しているようですけど、今回は Slackware 10.2 ( Linux 2.4.31 ) へインストールしてみようと思います。
Microsoft Virtual Server 2005 R2 の管理サイトへ接続したら、該当する仮想 PC の 「構成を編集」 を選択して、"CD/DVD" ドライブのプロパティから "VMAdditionsForLinux.iso" をキャプチャさせます。そうしたら、次のような手順でインストールを行っていきます。
まずは、とりあえず CD-ROM を "/mnt" 辺りにでもマウントしてみましょう。
mount /dev/cdrom
cd /mnt/VMadditionsForLinux/
そして "/mnt/VMadditionsForLinux/" ディレクトリ内の VMAdditionsForLinux-README.txt を参照してみると、"Microsoft Virtual Machine Additions for Linux 1.0" には、次のパッケージで構成されているとのことでした。
vmadd-kernel-module-0.0.1-1.i386.rpm | 【Kernel Module】 各種パッケージが必要とするコンポーネントだそうです。ただし、説明によると SCSI パッケージについてはなくても良さそうな感じでした。 |
---|---|
vmadd-x11-0.0.1-1.i386.rpm | 【X11 Drivers】 X Window に関連する、ディスプレイアダプタドライバやマウスドライバだそうです。これをインストールすることで、"s3_drv.o" および "mouse_drv.o" を置き換える感じになるそうです。 |
vmadd-timesync-0.0.1-1.i386.rpm | 【Tymesync】 ホストコンピュータとの時刻同期を行えるようにするためのコンポーネントだそうです。 |
vmadd-shutdown-0.0.1-1.i386.rpm | 【Shutdown】 Virtual Server 2005 R2 の管理サイトや COM API などを利用してシャットダウンを行えるようにするためのコンポーネントだそうです。 |
vmadd-heartbeat-0.0.1-1.i386.rpm | 【Heartbeat】 "keep alive" メッセージを Virtual Server 2005 R2 へ送ることで、管理サイトにてそれを確認することができるようになるとかどうとか…。 |
vmadd-scsi-0.0.1-1.i386.rpm | 【SCSI-Module】 仮想 SCSI ディスクのパフォーマンスを高めるためのドライバだそうです。ドライバ名は "vmadd-scsi" となるようです。 |
vmadd-full-0.0.1-1.i386.rpm | おそらく "Microsoft Virtual Machine Additions for Linux 1.0" の全てのコンポーネントを含むパッケージなのではないかと思います。 |
vmadd-install.run | RPM パッケージを用いずにインストールする際に使用するスクリプトです。 |
SCSI ドライバを利用する場合は、標準ドライバが読み込まれた後でいったんそれをアンロードして Virtual Server 用のドライバを読み直すか、または起動時に標準ドライバを読み込まずに最適なものを読み込む方法の 2 つがあるそうですが、システム自体が SCSI パーティションに含まれる場合は、後者の方だけとなるようです。
インストールを行った場合、標準では "/etc/init.d" に起動スクリプトが備わるようですけど、Slackware 10.2 は "init.d" ディレクトリというのもは使用しないシステムですので、そこが少し気になるところです。
とりあえず説明通りにやってみる
ともあれとりあえず、次のようにして "/etc/init.d" ディレクトリを作成しつつ、標準的な方法で全てのパッケージをインストールしてみることにします。
mkdir /etc/init.d
sh vmadd-install.run all
こうしてみたところ、次のようなエラーとなってしまいました。
./delrunlevel.sh: Unknown system
Could not find add/remove init scripts to a runlevel utility
This operation can not continue without it
make: *** [kernel-module] Error 1
どうやら予期していないシステムだったらしく、kernel-module をシステムに組み込む段階でエラーとなってしまったようです。とりあえず kernel-module のプログラムのインストールと起動スクリプトを確保することは出来たと思うので、その辺りを調べてみることにしました。
とりあえず、起動スクリプトを実行してみます。
/etc/init.d/vmadd start
すると次のエラーが表示されて、実行は失敗に終わってしまいました。
/etc/init.d/vmadd: Unknown system
Starting VM additions modprobe: Can't locate module vmadd
(modeprobe vmadd failed)/etc/init.d/vmadd: line 85: fail_msg: command not found
"/etc/init.d/vmadd" スクリプトを眺めてみると、どうやらシステムを特定できなかったために "fail()" 関数内で呼び出される "fail_msg" に適切な値がセットされなかったのが原因のようです。
そしてここは、どうやらシステム毎の読み込み成功メッセージおよび、読み込み失敗メッセージの定型を読み込んで表示するという感じのようです。Slackware の場合はあまり定型というものがないと思うのでテキトウでも良さそうですけど、とにかく "fail" 関数が呼ばれている時点で、読み込みには失敗していそうです。
ともあれその辺りを調整するために 25 行目辺りのブロックに Slackware 関連の判定を加えてみます。
system=unknown
if [ -f /etc/redhat-release ]; then
system=redhat
elif [ -f /etc/SuSe-release ]; then
system=suse
elif [ -f /etc/debian_version ]; then
system=debian
elif [ -f /etc/slackware-version ]; then
system=slackware
else
echo "$0: Unknown system" 1>&2
fi
そのうえで、さらにその下に続くスクリプトにて Slackware だった場合の "fail_msg()" および "succ_msg()" の定義をしておきます。内容はとりあえず debian のと同じで良さそう…というか、不明だった場合は最初からこれを設定しておけば良さそうな感じもしますけど…。
if [ $system = slackware ]; then
fail_msg() {
echo " ... fail!"
}
succ_msg() {
echo " ... done."
}
fi
そうして再び "vmadd" スクリプトを実行してみると、エラー表示が少しきれいになっただけですね…。
/etc/init.d/vmadd: Unknown system
Starting VM additions modprobe: Can't locate module vmadd
(modeprobe vmadd failed) ... fail!
とりあえず vmadd モジュールの自動読み込みの段階でエラーとなってしまっているようです。これはどうやら単純に "modprobe" で見つけられないだけのようなので、次のようにすることで、見つけられるようにすることができました。
depmod -a
そして "/etc/init.d/vmadd start" スクリプトを実行してみると、vmadd モジュールが読み込まれました。
インストールスクリプトを調整してみる
"Kernel Module" のインストールが完了したものの、なんとなく不安なところもあります。
とりあえず "Kernel Module" がインストールされたとして、今度は "Timesync" コンポーネントなどを個別にインストールしてみようかと思ったのですけど、説明書に依れば RPM を用いて一つ一つ出来るとのことだったのですけど、次のようにやってみても、Slackware 10.2 ではエラーとなってインストールする事が出来ませんでした。
rpm -ivh vmadd-timesync-0.0.1-1.i386.rpm
具体的なエラーメッセージは、次のような依存関係の問題です。
error: Failed dependencies:
/bin/bash is needed by vmadd-timesync-0.0.1-1
/bin/sh is needed by vmadd-timesync-0.0.1-1
/sbin/chkconfig is needed by vmadd-timesync-0.0.1-1
/sbin/ldconfig is needed by vmadd-timesync-0.0.1-1
fileutils is needed by vmadd-timesync-0.0.1-1
vmadd-kernel-module = 0.0.1-1 is needed by vmadd-timesync-0.0.1-1
Slackware 10.2 は rpm が使えることは使えるようになっているんですけど、それに依存したシステムにはなっていないようなんですよね…。
その影響なのか "bash" やら "sh" やらといった既に備わっている基礎的なプログラムも挙げられていて、このまま RPM で強制的にでもインストールを進めるにもなんとなく不安な感じがします。それと "/sbin/chkconfig" は Slackware 10.2 にはないようなので、それこそ強制インストール前に何とかしないといけないところですね…。
ちなみにこの chkconfig コマンドは、Linux のランレベルを調整する際に使用するそうなので、最初のインストール時に発生したエラーも納得ですし、一般的な Linux とランレベル周りの管理の違う Slackware では確かに問題となり得るところのようです。
そんなところから rpm に依るインストールは少し控えて、とりあえず "vmadd-install.run" スクリプトからの視点でもう少し吟味してみようと思います。
"vmadd-install.run" スクリプトは RPM を用いずにファイルに含まれるアーカイブを使ってインストールを行うような感じがなんとなくするので、それをなんとかすれば、少なくともエラーとなる部分を削ったりとかもできるかもしれません。
とりあえず "sh vmadd-install.run --help" としてその機能を確認してみると、"--keep" オプションを付けることでアーカイブを保つことが出来るそうなので、次のようにすることで、とりあえずアーカイブを展開することが出来そうです。
sh vmadd-install.run --noexec --keep --target /tmp/vmadd-install
こうすることで "/tmp/vmadd-install/" ディレクトリに、仮想マシンアドインに関するプログラムが展開されました。
エラーの原因となっていた "delrunlevel.sh" もしっかり存在していました。その中身をみてみると、ここでは "chkconfig" コマンドを利用して、"/etc/init.d/" に配置されるスクリプトを、念のため既にランレベルに登録されているものを除外してから、登録し直すといった感じになっているように思います。
これから、そもそも Slackware 10.2 の場合は、いきなり起動できる状態にまでになる期待は持てないこともあって、この "delrunlevel.sh" および "addrunlevel.sh" を何もせずに正常終了するように書き換えてあげれば良さそうです。
そのために、それぞれのファイルの 33 行目から始まるブロックにある、"exit 1" の行を "exit 0" に書き換えておけば良いでしょう。こうすることで、起動スクリプトの調整は行えませんけど、エラーで停止することはなくなります。
if [ -z $util ];then
echo Could not find add/remove init scripts to a runlevel utility 1>&2
echo This operation can not continue without it 1>&2
exit 0
fi
そしてあとは次のように実行すれば、とりあえず最後までインストール手続きは完了します。
make all
depmod -a
ただし、インストールされた起動スクリプトは Slackware を知らないシステムとして認識してしまうので、以前にもお話しした次の二箇所を調整しておく必要があります。
"vmadd", "vmadd-scsi"
"/etc/init.d/vmadd" および "/etc/init.d/vmadd-scsi" スクリプトについては、system の値の判定の所に "slackware-version" ファイルがあったら…という記載を追加します。
system=unknown
if [ -f /etc/redhat-release ]; then
system=redhat
elif [ -f /etc/SuSe-release ]; then
system=suse
elif [ -f /etc/debian_version ]; then
system=debian
elif [ -f /etc/slackware-version ]; then
system=slackware
else
echo "$0: Unknown system" 1>&2
fi
さらにそのスクリプトのすぐ下あたりに、Slackware だった場合の "fail_msg()" および "succ_msg()" の定義をしておきます。内容はとりあえず debian のと同じで良さそうです。
if [ $system = slackware ]; then
fail_msg()
{
echo " ... fail!"
}
succ_msg()
{
echo " ... done."
}
fi
"vmadd-heartbeat", "vmadd-shutdown", "vmadd-timesync"
"/etc/init.d/vmadd-heartbeat", "/etc/init.d/vmadd-shutdown", "/etc/init.d/vmadd-timesync" スクリプトの場合は、それとあわせて PIDFILE を指定する必要があるようですので、次のような感じとします。下記の例は "vmadd-heartbeat" の例ですので、それ以外はそれぞれ PIDFILE 名として "shutdown" と "timesync" 辺りを指定しておきます。
system=unknown
if [ -f /etc/redhat-release ]; then
system=redhat
PIDFILE="/var/lock/subsys/heartbeat"
elif [ -f /etc/SuSe-release ]; then
system=suse
PIDFILE="/var/lock/subsys/heartbeat"
elif [ -f /etc/debian_version ]; then
system=debian
PIDFILE="/var/run/heartbeat"
elif [ -f /etc/slackware-version ]; then
system=slackware
PIDFILE="/var/run/heartbeat"
else
echo "$0: Unknown system" 1>&2
fi
このスクリプトのすぐ下の辺りの Slackware 限定部分は、次のような感じにすれば良さそうです。
if [ $system = slackware ]; then
daemon()
{
$binary
}
killproc()
{
$binary
}
fail_msg()
{
echo " ... fail!"
}
succ_msg()
{
echo " ... done."
}
fi
"daemon()" は実行時に呼び出される関数で、"killproc()" は停止時に呼び出されるです。"fail_msg()" と "succ_msg()" はそれ以外のスクリプトと同様に、処理が成功したか失敗したかを通知するための関数です。
システムへモジュールを組み込む
なんだかんだで "vmadd", "vmadd-heartbeat", "vmadd-scsi", "vmadd-shutdown", "vmadd-timesync" の 5 つの起動スクリプトが揃いましたので、このうちの SCSI を除く 4 つを Linux 起動時に読み込めるように調整してみようと思います。
そのためにまずは、"/etc/rc.d/" ディレクトリへ、次の内容で "rc.vmadd" というスクリプトでも用意してみます。
#!/bin/sh
VMADD_PATH="/etc/init.d"
vmadd_start()
{
${VMADD_PATH}/vmadd start
${VMADD_PATH}/vmadd-heartbeat start
${VMADD_PATH}/vmadd-shutdown start
${VMADD_PATH}/vmadd-timesync start
}
vmadd_stop()
{
${VMADD_PATH}/vmadd-heartbeat stop
${VMADD_PATH}/vmadd-shutdown stop
${VMADD_PATH}/vmadd-timesync stop
${VMADD_PATH}/vmadd stop
}
vmadd_restart()
{
vmadd_stop
sleep 1
vmadd_start
}
case "$1" in
'start')
vmadd_start
;;
'stop')
vmadd_stop
;;
'restart')
vmadd_restart
;;
*)
echo "usage $0 start|stop|restart"
esac
こうしたら、次のようにして実行可能にしておきます。
chmod +x /etc/rc.d/rc.vmadd
マルチユーザー環境の起動スクリプトは "/etc/rc.M" となりますので、そこに次のような記載を追加しておきます。
if [ -x /etc/rc.d/rc.vmadd ]; then
. /etc/rc.d/rc.vmadd start
fi
また、システム停止時のために "/etc/rc.0" にも、次のような記載を加えておきましょう。
if [ -x /etc/rc.d/rc.vmadd ]; then
. /etc/rc.d/rc.vmadd stop
fi
Linux 起動時に SCSI ドライバを組み込むには…
起動時に SCSI デバイスドライバを読み込むためには initrd イメージを書き換えないといけないそうです。
とりあえず Microsoft Virtual Server 2005 R2 の SCSI ドライバが Adaptec 互換であることと、そのデバイスドライバが既にカーネルに組み込まれていることから、それを読み込ませずに vmadd-scsi をどう読み込ませるかが難しいところでした。
何とかカーネルはそのままに組み込めないかとも思ったのですけど、どうしても先に Adaptec の SCSI ドライバを組み込んでしまって、さらに別の vmadd-scsi として認識してしまう感じになってしまったので、今回は Slackware カーネルを非 SCSI 版にした上で、vmadd-scsi を組み込む感じでやってみようと思います。
Slackware カーネルを bareacpi.i に変更する
出来ればシステムを大幅に変更せずに Microsoft Virtual Server 2005 R2 用の SCSI ドライバを読み込ませたかったのですけど、Linux Slackware 10.2 の "adaptec.s" イメージでは Linux カーネルに Adaptec AIC-7870 SCSI アダプタドライバが組み込まれてしまっています。
そのため何よりも先に Adaptec AIC-7870 SCSI が認識されてしまうため、たとえ initrd を作り直しても Microsoft Virtual Server 2005 R2 の SCSI ドライバよりも先に Adaptec AIC-7870 が読み込まれてしまうのでした。しかもそのあとで "vmadd-scsi" モジュールが読み込まれると、同じインターフェイスなのに別々のものとして Linux が認識してしまうために厄介なことになってしまいます。
そこで Adaptec AIC-7870 SCSI ドライバを Linux カーネルから除外することにしました。
Linux Slackware 10.2 のソースファイルは /usr/src/linux ディレクトリにインストールされていますので、これを再構築して AIC-7870 のドライバを削除すれば良いのでしょうけど、せっかくなので標準で用意されている "bareacpi.i" イメージに合わせておこうと思います。
"bareacpi.i" イメージの設定ファイルは、インストール CD-ROM の中の "kernels/bareacpi.i/config" に保存されていますので、これを次のようにして現在の設定ファイル "/usr/src/linux/.config" と差し替えます。
/mnt/kernels/bareacpi.i/config /usr/src/linux/.config
この "bareacpi.i" の構成にも RAID ドライバはちゃんと組み込まれていますし、基本的な SCSI ドライバも モジュールとしては組み込まれていますけど、それはきっと大丈夫そうな感じがします。
あとは次のようにして、カーネルを再構築します。カーネルの再構築は失敗すると Linux が起動しなくなることがありますので気をつけましょう。
make dep
make clean
make bzImage
make modules
modules_install
make install
これらの手続きを終えると、"bareacpi.i" の起動イメージ vmlinuz と System.map がルートディレクトリに組み込まれます。
ただし、Slackware 10.2 では /boot ディレクトリ内にそれらが配置されることを想定しているので、その辺りを調整してあげる必要があります。この辺りの調整が面倒な場合は、"make install" を行う前に "/usr/src/linux/Makefile" を編集して、コメントアウトされている "#export INSTALL_PATH=/boot" の行の先頭の "#" を消しておきましょう。
起動時に vmadd-scsi モジュールを読み込む
SCSI デバイスを起動パーティションとして Linux を起動するためには、その最初から SCSI ドライバが読み込まれる必要があります。具体的には起動時に LILO によって呼び出される RAM ディスクイメージの中に vmadd-scsi モジュールを含めておくことで、ルートパーティションを認識するよりも前に SCSI ドライバを組み込むことが出来るという感じになるようです。
とりあえず、余計なドライバを組み込ませないために "/etc/rc.d/rc.modules" の中の "/sbin/modprobe ide-scsi" の行をコメントアウトしておきました。
また、SCSI アダプタを特定するために、"/etc/modules" ファイルに次の行を用意してみることにします。
alias scsi_hostadapter vmadd-scsi
もしも SCSI アダプタを複数搭載している場合には、"scsi_hostadapter" のところを "scsi_hostadapter1" や "scsi_hostadapter2" といったように通し番号で表記してあげれば良いようです。
ともあれこのようにしたら、次のように "/boot" ディレクトリへ移動して "mkinitrd" コマンドを実行します。
mkinitrd -c -f reiserfs -k 2.4.31 -m vmadd-scsi -o initrd-vmadd−2.4.31.gz -r /dev/md0 -s initrd-vmadd-2.4.31-tree
この "mkinitrd" というのは、Linux が起動時に使用する RAM ディスクを作成するためのプログラムうで、ここに非標準のデバイスドライバなどを組み込んでおくことにより、起動直後からその機能を活用することができるとのことでした。
このプログラムはシステムによって引数が違うのか良く判りませんけど、とりあえず Slackware 10.2 では次のような意味合いです。
-c | 既に存在している場合は initrd イメージを上書きします。 |
---|---|
-f | ルート ( / ) パーティションのファイルシステムを指定します。 |
-k | /lib/modules/ ディレクトリの次に現れてくるカーネルのバージョンです。 |
-m | 起動時に必要なモジュールです。複数ある場合はコロン ( : ) で区切って繋げます。また、起動パーティションが ext3 だった場合には、jbd モジュールもあわせて必要とのことですので、"-m jbd:ext3" という感じになります。 |
-o | 出力ファイル名です。initrd イメージを区別したり、分かりやすくするのに便利です。 |
-r | ルートパーティションとして使用するデバイス名です。 |
-s | initrd ツリーの出力ディレクトリ名です。 |
今回はルートパーティションを "raiserfs" ファイルシステムにて設定してあって、それをコントロールするドライバはカーネルに組み込んでいるのですけど、もしも組み込まずにモジュールとして用意している場合には、それ ( raiserfs ) も -m オプションの中で指定しておく必要があるとのことでした。
それが終わったら "initrd-vmadd-2.4.31.gz" という名前の RAM ディスクイメージが出来上がりますので、起動時にそれを利用できるように、"/etc/lilo.conf" へ initrd 設定を書き加えておきます。今回は RAID 構成の都合で "/etc/lilo.sda.conf" と "/etc/lilo.sdf.conf" の二つになりますけど…。
image = /boot/vmlinuz
initrd = /boot/initrd-vmadd-2.4.31.gz
root = /dev/md0
あとは次のようにして、LILO を更新すれば完了です。
lilo -C /etc/lilo.sda.conf
lilo -C /etc/lilo.sdf.conf
RAID 構成でなければ "lilo" だけで大丈夫でしょう。
vmadd-scsi がなんだか上手く動かない
mkinitrd を用いて起動 RAM ディスクに vmadd-scsi を加えることで、起動時に vmadd-scsi モジュールが組み込まれて Microsoft Virtual Server 2005 R1 の SCSI アダプタとして認識されたのですけど、なんだか次のようなメッセージが表示されてしまって起動に失敗、上手く RAID パーティションを認識してくれませんでした。
sh-2006: reiserfs read_super_block: bread failed (dev 09:00, block 8, size 1024)
sh-2006: reiserfs read_super_block: bread failed (dev 09:00, block 64, size 1024)
sh-2006: reiserfs_read_super: can not find reiserfs on md(9,0)
mount: Mounting /dev/md0 on /mnt failed: Invalid argument
ERROR: mount returned error code 1. Trouble ahead.
mount: Mounting /dev/md0 on /mnt failed: Invalid argument
mount: Mounting /dev/md0 on /mnt failed: Invalid argument
/boot/initrd.gz: exiting
pivot_root: pivot_root: Device or resource busy
Freeing unused kernel memory: 140k freed
#
とりあえず Slackware 10.2 のインストール CD-ROM で起動して、ブートオプションで次のように入力して復帰を試みます。
adaptec.s root=/dev/md0 noinitrd ro
このようにすると、起動イメージを "adaptec.s" の、ルートパーティションを "/dev/md0" として、システムの起動を行うことが出来ます。"adaptec.s" イメージによって起動すれば RAID デバイスを起動時に認識できるので、その状態でとりあえず、起動パーティションは /dev/sda1 にしてみました。
そうしてシステムを起動しなおしてみたところ、とりあえず vmadd-scsi を読み込んだ状態でシステムの起動が行えました。ただ、起動時に次のようなエラーが発生してしまって、ルート以外の RAID デバイスについて、マウントすることは出来ませんでした。
Checking non -root filesystems:
fsck 1.38 (30-Jun-2005)
bread: Cannot read the block (2): (Invalid argument).
reiserfs_open: bread failed reading block 2
bread: Cannot read the block (16): (Invalid argument).
reiserfs_open: bread failed reading block 16
reiserfs_open: the reiserfs superblock cannot be found on /dev/md1.
Failed to open the filesystem.
If the partition table has not been changed, and the partition is
valid and it really contains a reiserfs partition, then the
superblock is corrupted and you need to run this utility with
--rebuild-sb.
なんだか reiserfs デバイスが破損しているようなメッセージだったので、何度か "reiserfsck --rebuild-sb" を実行して復旧を行ったりもしたのですけど、どうやらこれは破損ではなく、起動時に正常に読み込めないというのが原因のようでした。
いろいろ試していってみると、システムが起動してログインした後に "raidstart --all" を実行すれば、正常に RAID デバイスを認識させることができるようです。そうすると、もしかすると起動時に準備が整わないまま RAID デバイスを使用しようとしているのかもしれないですね…。
とりあえず RAID の機能が足りないのかと調べてみても、"bareacpi.i" はちゃんと RAID 関連のドライバのほとんどをカーネルに組み込んでいるようです。試しに "ideraid.i" や "scsi.s" にしてもみましたけど、それで起動時に RAID デバイスを認識してくれることはありませんでした。なのでカーネルはとりあえず "bareacpi.i" に戻しておくことにしました。
他にもいろいろと試してはみたのですけど、どうにも上手く行かなかったので、とりあえずはここまでとしておきます。
ここまででも RAID を用いなければ vmadd-scsi ドライバを用いて SCSI パーティションにアクセスできる環境にはなったので、アクセス速度が目に見えて速くなりました。手間にはなりますけど、このあとで "raidstart --all" とすれば RAID デバイスも認識させることが出来るようなので、RAID もかろうじて使えるといった感じです。
ただ、これで RAID さえ利用しなければ大丈夫かと思ったのですけど、どうもディスクアクセスが集中したときなど、ちょっとした何かが引き金になって、システムがハングアップしてしまうことがあるようです。
しかもハングアップしてしまうと Microsoft Virtual Server 2005 R2 の管理ページでリセットをかけても駄目で、そうなってしまった場合は Microsoft Virtual Server 2005 R2 がインストールされている PC そのものを再起動しないといけないようでした…。
Microsoft Virtual Server 2005 R2 Service Pack 1 で試してみる
よくよく調べてみると、Linux 用の仮想マシンアドインソフトウェアは基本的には Virtual Server 2005 R2 環境であれば良いらしいのですが、SCSI ドライバに限っては Virtual Server 2005 R2 の Service Pack 1 環境である必要があるとのことでした。
なのでさっそく Microsoft Virtual Server 2005 R2 Service Pack 1 を入手してインストールしてみることにします。
Microsoft Virtual Server 2005 R2 Service Pack 1 は、Beta 1 版ではありますけど、アドインソフトと同じく Microsoft Connect から申し込みを行うことで入手できました。そしてインストールも特に難しいことはなく、インストーラを起動して既存の Microsoft Virtual Server 2005 R2 を更新する感じになります。
ただし、使い勝手は変わりませんけど、Microsoft Virtual Server 2005 R2 Service Pack 1 Beta 1 は英語版なので、管理ページが全て英語表示にはなりましたけど…。
ともあれこれで正式に SCSI ドライバ対応環境になったかと思ったのですけど、相変わらずときどき致命的なハングアップを起こしてしまうようでした。その時に Slackware のコンソールに表示されるエラーは次のようなメッセージが延々と繰り返される感じです。
scsi : aborting command due to timeout : pid 3261, scsi1, channel 0, id 2, lun 0 0x28 00 00 74 00 3f 00 00 08 00
vmadd-scsi: aborted SRB not found in active or done queue!
他の仮想 PC はその時は巻き込まないところは幸いですけど、それでもホスト PC を再起動しないと復帰できないため、実用レベルで利用するにはとても不安の残るところです。
vmadd-scsi を利用しない場合は、アクセス速度が圧倒的に遅くなってしまうので、通常利用ならまだしも RAID となると複製にとんでもない時間がかかってしまうのもありますし、少なくとも Slackware 10.2 で仮想 SCSI ディスクを利用するのは、なかなか注意が必要そうです。