Hyper-V の Linux 仮想マシン

さて、前日に引き続いて Hyper-VLinux 仮想マシンのお勉強。一応、おぼえということで、やったことをメモしておきます。

Hyper-VLinux 仮想マシン作成ですが、やることは以下の3つ。

Linux を入れただけでは、外との通信や Hyper-V からきれいに管理できません。それを実現するためには Linux 統合サービスを入れます。さらに、ホストマシンや仮想マシンの間でスムーズなマウス移動(Synthetic Mouse Support) のために、inputVSC を入れます。

最初、非サポートの CentOS を使ったところマウスの動きがおかしいということでディストリビューションSUSE Linux Enterprise Server (以下、単に SUSE) に変え、上手くいくまで SUSE の細かいバージョンを次々と試して行きました。最初は深い調査は不要で、単に Windows仮想マシンと同程度のことをやるためには何をしなければいけないのかがわかればそこで終わり、と考えていたのですが、ディストリビューションやバージョンによって結果がまちまちで、ずるずると行ってしまいました。

Linux 仮想マシンのインストールそのものは、Windows 仮想マシンの作成と同じで特に変わったところはありません。たとえば CentOS であれば、セットアップ完了後に(Linux 統合サービスをインストールしていない状態で) Hyper-V マネージャを起動し、レガシーネットワークアダプタにした場合、そして(レガシーではない通常の)ネットワークアダプタにした場合、それぞれでネットワークの動作を確認。確かに(Linux 統合サービス無しの環境では)レガシーネットワークアダプタでは通信可能、(レガシーではない)ネットワークアダプタでは NIC を認識しておらず通信不能となっています。また、Linux 統合サービスが無い状態では Hyper-V マネージャでの [シャットダウン] が効きません。Linux で shutdown -h now しなければなりません。

Linux 統合サービス自身は Windows Server 2008 には含まれていないので、Microsoft のウエブサイトからダウンロードしてきます。今回使用したのは V2.1。Linux 統合サービスのファイル(自己解凍ファイル) から取りだされた ISO ファイルをホストOS (Windows Server 2008 R2) のファイルとしてコピーしておき、それを Linux からマウントして Linux 環境にコピー。そして Linux 上で make そして make install します。Linux 統合サービスをインストールした後、Linux をリブートして Linux 統合サービスを反映させます(/etc/init.d/vmbus start)。なお、REDHATSUSE では若干作業内容が異なりますので、作業前にreadme (PDFファイル)で確認しておく必要があります。

(レガシーではない)ネットワークアダプタの状態で Linux 統合サービスをインストールすると、eth0 ではなくsth0 というインターフェースが作成され通信が可能となります。ただ、それでもマウスはそのウインドウ枠に固定されています。仮想マシンからマウスを外に出すには [CTRL]+[ALT]+[←] しなければなりません(Windowsでも同様ですが)。Linux 統合サービスの自己解凍ファイルに含まれている readme を読むと、Satoriプロジェクトのウエブサイトから inputVSC をダウンロードしてインストールしなさい、となっています。

inputVSC のインストールは、Linux 統合サービスのインストールと同様に Windows 上の inputVSC ISO ファイルを Linux からマウントして、それを Linux にコピーして # setup.pl inputdriver を実行してリブート、という流れ。

以下、それぞれのディストリビューションでの結果です。細かいところははしょりますし、いろんなバージョンを連続的にやったので、細かいところで不正確なところがあるかもしれません。

  • CentOS 5.4(カーネル2.6.18): inputVSC のインストールまでは OK。しかしマウスの動きがおかしい。ホスト OS の Windows 画面からゲスト OS の Linux 画面にマウスを移動させると、マウスポインタが点になり、それは表示はされてはいるが無効なマウスポインタ。別の位置から有効なマウスポインタ(矢印のポインタ)がひょっこり出てきて、それが使用される。非常に使いにくいし気持ち悪い。
  • SUSE 11 SP1 (カーネル 2.6.32): SUSE をインストールした直後に eth0 が作成されており、ホスト OS との疎通もできている。Linux統合サービスを make をすると、INIT_WORK マクロの引数の数が合わないのでビルド不可。ソースを見るとカーネル 2.6.32 の場合は #ifdef で INIT_WORK の引数は3個(カーネル 2.6.27 の場合だけ引数は2個)。make のエラーメッセージからすると期待している引数の数は2個なのでエラーとなる。ただし、カーネル 2.6.32 から Linux 統合サービスがカーネルに取り込まれているので、Linux 統合サービスをインストールしなくとも同じ機能はすでに動作している。実際、(seth0 ではなく) eth0 が作成されており、ホスト OS との疎通も可能。ただ、inputVSC はそれを認識できないのか # setup.pl inputdriver を実行すると Vmbus driver not installed! Please install it and rerun. とメッセージが表示される。実際、lsmod すると hv_vmbus が表示される。
  • SUSE 11(カーネル 2.6.27): Linux 統合サービスのインストールと動作までは OK。inputVSC のセットアップ(# setup.pl inputdriver) 時にコンパイルエラー。ソースをちょっと見たが、すべてのエラーを取り除くには大変そうだったのでやめた (カーネルのバージョンが変わってエラーが発生?)。
  • SUSE 10 SP3 (カーネル 2.6.16): Linux 統合サービスをインストールしても ifconfig で seth0 は出てこない。YaST を起動し [ネットワークデバイス] > [ネットワークカード] の順番でセットアップすることで seth0 が作成され、無事、ネットワークの疎通を確認。 inputVSC のセットアップはエラー無しで終了。リブート後、ちょっとトロいが、期待したマウスの動き。

ということで、SUSE 10 SP3 で期待した動作を見ることが出来たのでこれで終わりとします。いずれにせよ、Hyper-V での Linux ゲスト OS って大変だなーと思いました。Microsoft さんが今後、Hyper-V をどう持っていくのか注目していきたいと思っています。

Windows だけの環境の場合、統合サービスのありがたみって言葉では理解できても実際はよくわかりませんでした。Windows のゲスト OS を作ったら単なる一つの手順として統合サービスを入れておく、という程度の理解でした。しかし、Linux のゲスト OS 環境を作ることで、統合サービスのありがたみを実感することができました。