VirtualBoxでのNested Virtualizationは無理だったという話

タイトルが全てなんだが、遭遇した事の次第をメモとして書き残す。

同僚からUbuntuで試したVagrantによる環境構築を、CentOSでも検証してくれないかと依頼され、自分のマシンに入っていたVirtualBox上のCentOSで作業していたら躓いた。

環境

ホスト1 -> ゲスト1 = ホスト2 -> ゲスト2という入れ子になる感じ。VagrantとPackerは今回遭遇した問題の切っ掛けでしかなく、本質的に関係は無い。

事象

基本的に以下はVirtualBox上のCentOS 6.4(環境のゲスト1 = ホスト2)で行っている作業である。

まず、ゲストのBoxが必要だったので、同僚の作ったPackerのテンプレートをクローンしてきてpacker buildを走らせたが、以下の様に仮想マシン起動後のSSH接続で動作が止まってしまった。

$ packer build --only=virtualbox-iso machine.json
virtualbox-iso output will be in this color.

==> virtualbox-iso: Downloading or copying Guest additions checksums
    virtualbox-iso: Downloading or copying: http://download.virtualbox.org/virtualbox/4.3.12/SHA256SUMS
==> virtualbox-iso: Downloading or copying Guest additions
    virtualbox-iso: Downloading or copying: http://download.virtualbox.org/virtualbox/4.3.12/VBoxGuestAdditions_4.3.12.iso
==> virtualbox-iso: Downloading or copying ISO
    virtualbox-iso: Downloading or copying: http://ftp.riken.jp/Linux/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso
==> virtualbox-iso: Starting HTTP server on port 8081
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Creating forwarded port mapping for SSH (host port 3213)
==> virtualbox-iso: Executing custom VBoxManage commands...
    virtualbox-iso: Executing: modifyvm packer-virtualbox-iso --memory 512
    virtualbox-iso: Executing: modifyvm packer-virtualbox-iso --cpus 1
==> virtualbox-iso: Starting the virtual machine...
    virtualbox-iso: WARNING: The VM will be started in headless mode, as configured.
    virtualbox-iso: In headless mode, errors during the boot sequence or OS setup
    virtualbox-iso: won't be easily visible. Use at your own discretion.
==> virtualbox-iso: Waiting 10s for boot...
==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Waiting for SSH to become available...

暫く待っていたが、結局SSHのコネクションがタイムアウトしてビルドは失敗。

SSHに原因があるのかとログを確認するが、タイムアウトした以上の事は分からず、ホストのSSH、Firewallの設定、ゲストのSSH、ポートフォワードの設定を確認するが問題は無い。netstatで見るとポートフォワードされたTCPコネクションは張られているものの、SSHが応答していない感じ。

CUIのメッセージとログはそれだけだったので、一旦、ヘッドレスになっていたPackerのビルダー設定をGUI表示に切り替えてみて、再度ビルドを実行してみたところで原因が判明した。

{
  "builders": [
    {
      "headless": false  ←falseでVirtualBoxGUIが表示される
    }
  ]
}

※当該設定の前後は省略

原因

再ビルドしたら、VirtualBoxが起動した所でこの様なエラーメッセージが出力された。

f:id:heroween:20140527223117p:plain

「ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。64ビット ゲストOSは64ビットCPUを検出できず、起動できません。」

なるほど、ゲストが起動していませんでした。

CUIのメッセージでは、ゲスト起動コマンド実行後にSSHの接続待ちとなっていたが、SSH接続はゲストの起動完了を待たずしてなされていたのである。そりゃあ応答しない訳だ。

で、ホストのハードウェア仮想化支援機能だが、/proc/cpuinfoを見ると確かにflagsにvmx(VT-x)が表示されていない。

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 42
model name      : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
stepping        : 7
cpu MHz         : 2673.155
cache size      : 6144 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc up rep_good pni monitor ssse3 lahf_lm
bogomips        : 5346.31
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

CPUはIntel(R) Core(TM) i7-2620M CPU @ 2.70GHzでflagsにもlmがあるので64ビットである事は間違いないし、VT-xにも対応している。ついでにカーネルも見てみる。

$ uname -rm
2.6.32-358.6.1.el6.x86_64 x86_64

大丈夫だ。問題無い。

それでは、VirtualBoxがホストをどう認識しているのかも確認してみる。

$ VBoxManage list hostinfo
Host Information:

Host time: 2014-05-28T02:55:25.926000000Z
Processor online count: 1
Processor count: 1
Processor online core count: 1
Processor core count: 1
Processor#0 speed: 2807 MHz
Processor#0 description: Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
Memory size: 1877 MByte
Memory available: 1387 MByte
Operating system: Linux
Operating system version: 2.6.32-358.6.1.el6.x86_64

うーん、見た感じは大丈夫そう…。

対応

ホストのハードウェア仮想化支援機能が有効になっていないのであれば、有効にすれば良いじゃない。という事で、CPUはハードウェア仮想化支援機能に対応しているので、BIOSでその設定を有効にする事ができるはずなのだが、対象となるホストはVirtualBox上のマシンであるので、まず、VirtualBoxにハードウェア仮想化支援機能の設定があるのかどうか確認してみた。

f:id:heroween:20140528124727p:plain

すると、仮想マシンの設定 -> システム -> アクセラレーションに「VT-x/AMD-Vを有効化」とまさに該当するものがあった…のだが、既に有効化されている…。

今度は仮想マシンを起動してBIOSを確認するが、ハードウェア仮想化支援機能に該当する設定は見当たらず、BIOSからは設定を確認できないようだ。

f:id:heroween:20140528121830p:plain

あるぇ〜?となって調べてみると、結構昔からあるVirtualBoxfeature-requestを見つけたのだが、それによるとVirtualBoxではNested Virtualizationに対応しておらず、仮想マシン上ではハードウェア仮想化支援機能がまともに機能しないようである。そして、その機能を実現する見通しも無いっぽい。

結論

という訳で、今回やろうとしていた事はそもそもできなかったという結論に到った。尚、VMwareなんかではできるようなのだが、そちらの方は詳しく調べてはいない。

以上、VirtualBoxでのNested Virtualizationは無理だったという話でした。