2014/03/16

Hyper-V on Fusion

知己からの相談。Hyper-V 上の Linux (CentOS 6.5)が正しく動かないと。
CentOS 6.5 は Hyper-V のサポートリストにないと返答し逃れようとしたら、いや、統合サービスがカーネルに統合されているし動くはずだとの主張。そして送られてきたスクリーンショットを見たら、ただの Hyper-V ではなく、Fusion 上の WindowsServer 2012 であった。

Hypervisor on Hypervisor はテクがいるんだよと煙に巻いたのだが、しかしやったことがない、できないでは何とも面白くないのでサンフランシスコ出張中、まだ真っ暗闇の3時頃にむくっと起き上がり手元で構築をやってみた時のメモを再構成したのが以下のものだ。

なお、WindowsSever 2012では面白みがないので、今回は Windows 8.1 Enterprise の Client Hyper-V を使ってみた。

● Fusion 上で Hyper-V を実行させ、その上でLinuxを動かす条件

条件は以下の通りだ。
  1. Windows8 は 64bit 版がインストールされていること
  2. 仮想マシンの設定の「プロセッサとメモリ」にある「この仮想マシンでハイパーバイザーアプリケーションを有効にする」にチェックが入っていること
  3. 以下2行を VMX ファイルに書き足してあること
    • mce.enable = "TRUE"
    • hypervisor.cpuid.v0 = "FALSE"
  4. Hyper-V 上の仮想マシンのMACアドレスを"固定"させること
64bit 版でないと Hyper-V は利用できないのでこれは当然と言える。2. の設定により、vmx ファイルに 
vhv.enable = "TRUE"
が書き込まれる。ESXi など VMware製品ではこの設定だけで動くが、Hyper-V の場合、「Hyper-V をインストールできません。: ハイパーバイザーが既に実行されています」と出る(下図)

これを回避するために、3. のオプションを指定し、MCE(Machine Check Exception)拡張を有効にし、CPUID命令でハイパーバイザを検出されないようにする必要がある訳だ。

ここまでで Hyper-V は動作するが、このままだと知己の言うとおりでHyper-V 上の仮想マシンでの Linux がインストール後の起動時に panic してしまう。

この事象の回避には、「Hyper-V 上の仮想マシンのMACアドレスを静的にする」ことが必要なわけだ。この点は少々厄介なので、以下の手順を見て欲しい。

● インストールの実際

では、実際のインストールを追ってみよう。

まず、Fusion で仮想マシンを作成する。Windows8.1 のメディアかイメージがあるなら話は早い。
Fusion のメニューから「ファイル」-> 「新規...」を選び、「ディスクまたはイメージからインストール」を選んだまま「続く」ボタンを押せばいい。
簡易インストールパネルでアカウント名やプロダクトキーを入力、仮想マシンを作成すればOSのインストールから初期設定、ライセンス投入、VMware Tools のインストールまで一気にやってくれる。

インストールが終わったら一旦仮想マシンを停止して、先の条件2と3のセットをしておこう。(もちろん、仮想マシンの作成の折に「設定のカスタマイズ」を押して、作成後すぐに仮想マシンを起動させず、設定を編集するタイミングを作っても良い。なお、このときフロッピードライブを削除しないように。)

また、メモリサイズもデフォルトの 2GB から Hyper-V上の仮想マシンの実行分増やしておいた方がいいだろう。


Windows8.1 のデスクトップの左下端には復活したスタートボタンがある。ここを右クリックするとコントロールパネルに素早くアクセスできる。

今回は「プログラムと機能」を選択、Hyper-V をインストールする。
インストール後に再起動がかかるので、またログインし直し、デスクトップの右側から「Hyper-V マネージャ」を検索、でてきたら右クリックして「管理者で実行」をする
(普通の実行でも問題ないかもしれない)


Hyper-Vマネージャが起動したら、まず仮想スイッチマネージャから仮想スイッチを一つ作っておく。インターネットに接続する必要がある場合は「外部」で作っておく。また、「外部」の仮想スイッチを作ると以後 Windows8側のNICがプロミスキャスモードで動こうとして、その結果認証のパネルが表示される。都度パスワードを入れて許可しておこう。

さて、次はHyper-Vでの仮想マシンの作成だ。
Hyper-Vマネージャの「編集」メニューから「新規」「仮想マシン...」を選択、ウィザードに従って仮想マシンを作成する。
「仮想マシンの世代」をきかれたら第一世代にしておく。第二世代は Windows 8,WindowsServer 2012 でないと意味がないからだ。

ネットワークの構成では、先に作った仮想スイッチを指定しておく。

メモリサイズとストレージ容量は適当でいいが、今回は 512MBと10GBを指定した。それぞれ動作チェックのため節約をしただけだ。

インストールは CentOSの ISOイメージから行うが、「Fusion 側でWindows8仮想マシンに ISOメディアをマウントして、Hyper-V側仮想マシンはDドライブを参照」と、「Windows8仮想マシンにISOメディアをコピーしておき、Hyper-V側仮想マシンでISOメディアをして」の二つのやり方が考えられるが、どうも前者はあまり安定しないようだ。面倒でも ISOイメージをコピーして、後者のやり方にした方がいい。

さて、ISOイメージを仮想CD-ROMにマウントさせたら、Hyper-V側で仮想マシンを起動する。
そして、CentOSのインストーラが起動したら、"Hyper-Vマネージャで仮想マシンの電源を落とす"。ここが重要なポイントだ。

Hyper-V側で仮想マシンを停止させた後、Hyper-Vマネージャで仮想マシンを右クリック、「設定...」を選択し設定パネルを開き、「ネットワークアダプター」の「+」ボタンを押し項目を展開、「高度な設定」から「MACアドレス」の「動的」のラジオボタンを「静的」に変更する。


動的に変更後、その下の6つの入力項目に00ではない、十六進の数値が入っていることをちゃんと確認した後、OKを押し設定を閉じる。

その後、Hyper-Vマネージャにて仮想マシンを起動、通常の手順で Linuxをインストールすればちゃんとインストールでき、その後もエラーなく利用が可能だ。

● Hyper-VのMACアドレスの仕様

Hyper-Vのデフォルトでは、MACアドレスの設定が「動的」になっており、仮想マシンの起動の際にMACアドレスが自動生成される。
ここまではまあ構わないのだが、困ったことに、このままだとMACアドレスは起動のたびに変わりうる。どうもそこで齟齬が起こり、パニックしているようだ。この件についてはマイクロソフト社のフォーラムにも記載がある。

手っ取り早く直すのに、MACアドレスを「静的」にして一意に固定してしまえばいいのだが、しかし一度も起動していないHyper-Vの仮想マシンは、MACアドレスが00-00-00-00-00-00 になっている。

これはこれで問題の元のため、「動的のまま一度起動することで適当なMACアドレスを割り当てさせ、その後停止、割り当てたアドレスのままで静的に設定を変更し、MACアドレスを固定する」という手順になる。

なお、クロックのところでパニックしているのでLinux側のクロックソースを直す、という解法もあるようだ。
ただ、CentOSを含むRHEL6系のOSでは、インストール時にMACアドレスを記憶してそのMACアドレスを持つNICに指定したIPアドレスを割り当てるようにする。MACアドレスがころころ変わると、その都度IPアドレスの設定をやり直す必要が出てくる。どのみち、MACアドレスは固定する必要がある。

そもそも Fusion 上で CentOSを動かせばこんな面倒はないのだし、やる人はそうそういないと思うが、引っかかると言えば引っかかるところなので、メモとして残しておく。