Nested virtualization on Mac (using VMware Fusion and ESXi)

Macでの多段仮想化(VM on VM/Nested Virtualization)について.
Macでの」というのはVMware Fusionを使うということです.Type2 VMMでVT-x/EPTを透過できるので有名なVMware Fusionを使いました.VirtualBoxだとVt-x/EPTを透過できないみたいなことを聞いたことがあるので,そちらではやっていません.

最終的には Gentoo/Linux over ESXi over VMware Fusion over Mac OS X になりました.Gentoo/LinuxKVMを動かせば3段階のNestedになります.

下から順に設定を記載します.

VMware Fusion

ゲストOSへVT-x/EPTを透過させるには設定ファイルの書き換えが必要です.
ESXiの設定ファイル(例:~/Documents/Virtual Machines.localized/VMware ESXi 5.vmwarevm/VMware ESXi 5.vmx)に以下を追記しました.この項目は無いので新規追加です.

vhv.enable = "TRUE"

Fusionの各ゲストOS設定のOther→AdvancedにVT-x/EPTを有効にするかどうかの項目がありますが,これはデフォルトで自動設定になっているので設定不要でした.

ESXi

こちらもゲストOSへVT-x/EPTを透過させるには設定ファイルの変更が書き換えです.まずは設定ファイルを変更できるようにESXiへSSHでログイン出来るように設定を変更しました.ESXi(vSphere経由ではなく直接)のトラブルシュートの項目からESXiからSSHログインとシェルの有効化を行いました.ちなみに,この設定はvSphere経由でも出来るようです.
ログイン出来るようになったら/etc/vmware/configに以下を追記しました.この項目は無いので新規追加です.

vhv.allow = "TRUE"

実は設定はこれだけでは終わらず,ESXiのゲストOS個別設定が少し必要です.

一番上のOS(今回だとGentoo/Linux

ESXi上にインストールするのでWindows+vSphere Clientが必要です.今回はWindowsVMware Fusion上にインストールしました.全部VMware Fusion上にあることになります.
一番上のOSはなんでもよくて,今回はGentoo/LinuxのインストールCDを使いました.
ESXiがVT-x/EPTを透過させるにはゲストOSにも設定が必要です.この設定はvSphere Clientからは行えず,ESXiにSSHログインしてエディタで設定ファイルを直接編集する必要があります.
そのため,一旦ESXi上で動かすLinuxを作ったのちに,SSHログインしてVMの設定ファイルを修正します(例:/vmfs/volumes/datastore1/[仮想マシン名]/[仮想マシン名].vmx).上述のvhv.allow等とは異なり,項目はありますが右辺が違うのでそこを修正します.

guestOS = "vmkernel"
または
guestOS = "vmkernel5"

LinuxだからといってLinux2.6(64bit)等を選択するとVT-x/EPTが透過されません.vmkernel (ESXi4.0) / vmkernel5 (ESXi5.x) に設定する必要があるようです.
(これを入れると,仮想マシンのプロパティ→オプション→ゲストOS→バージョン:→VMware ESXi 4.0/5.xが選べるようになるので,以降はvSphereから設定することも可能です)

あとは grep vmx /proc/cpuinfo とかすれば vmx が有効になっていることがわかります.

きになったコト

今回使ったMacの物理CPUは1socket/4core/8threadで,この内4 processor coreをESXiに割り当てました.するとESXiからは4ソケットのCPUとして見えるようです.ESXi StandardでサポートされるCPU数上限が気になったのですが8 vCPUまでサポートしているようで,この制限に引っかかる事は無さそうです.また,メモリ上限は32GBで,同じくこちらも制限に引っかかることは無さそうです.