VMware ESXi上の仮想マシンでさらにVirtualBox(Vagrantが使いたかった)を動かしたかったのだけど、すんなり動かなくてハマったのでメモ。
現象
vSphere側でハードウェアの仮想化とかVT-xとかの設定は全て有効にした状態でVirtualBoxでゲストOS(64bit)を起動すると、
IO-APIC(apic pin)1-9,1-11,2-0,2-1,.....2-15
..MP-BIOS bug: 8254 timer not connected IO-APIC
..trying to set up timer as ExtINT..failed.
..tyring to set up timer as BP..IRQ..failed.
kernel panic: IO-APIC + timer dose'nt work!
のようなエラーがでて起動しない。
VirtualBoxのマニュアルによると、Linux kernel 2.6.18にレースコンディションがあってうんたらと書いてあって一見それっぽいんだけど、カーネルのバージョンは2.6.32だったので問題はなさそうだった。
解決方法
VirtualBoxのゲストOSのIO-APICの無効にすると動いた。
VBoxManage modifyvm 仮想マシン名 --ioapic off
VBoxManageコマンドだとこんな感じ。
config.vm.provider :virtualbox do |vb|
# Don't boot with headless mode
vb.gui = true
vb.customize ["modifyvm", :id, "--ioapic", "off"]
end
Vagrantfileだとこんな感じ。
あと試してないけどLinux kernelオプションでnoapicを指定するのでも良さそうな気がする。
ただIO-APICはマルチコアCPUでは必須の機能らしいので、コア数を複数割り当てたい場合は諦めるしかないかもしれない。
とりあえずは動かせるようになったけど、なんだかしっくりこないのと新しい仮想マシンを作るたびにいじらなきゃいけないのでテンポ悪いのがなんとも……。
余談
仮想マシンをネストさせることをnested virtualizationとかnested vmとか言うらしい。ググる時の参考に。
nested virtualizationは色々難儀なのでできるなら避けたほうが良いと書いている人もいた。
親側の仮想マシンに対して仮想化関係の設定を有効にしてあげないと、そもそも入れ子で動かせなかったり、なんか32bitになったりする。
/proc/cpuinfo見てflagsにvmxがあるかどうかがひとつの判断材料になるとかなんとか。
vSphereでいうとCPUの設定のところの「ハードウェアアシストによる仮想化をゲストOSに公開」とか「CPU/MMX仮想化」のところの「Intel VT-x/AMD-Vを命令セット仮想化に使用し、Intel EPT・AMD RVIをMMU仮想化に使用」あたり。
さくらのVPSとかConoHaとかでVirtualBoxを使ってる記事はわりとよく見るので、親がKVMだとわりとうまくいくのかもしれない。