みなさま、はじめまして。 @keiichiroy こと 山本慶一郎と申します。
Qiita初投稿です。日頃からお世話になっているので、ハマったことや調べたことを誰かの役に立てるよう、書いていきたいと思います。
最近自宅や会社でVagrantやPackerを使ってVirtualboxに触れることが多いのですが、違う環境で実行すると、思わぬエラーにぶつかるなんてこと、ありますよね? はい、自分も例外に漏れず、です。
表題の症状は、原因から書くと「ハードウェア仮想化(VT-x)のサポートがないCPU環境でVT-xを使おうとしていたため」です。文字にすると当たり前なのですが、PackerやらVeeweeなど、間接的にVirtualBoxを扱っていたため、気付くのが遅れました...orz
仮想マシンの構成ファイルが納められているフォルダのログ出力が下記のような状態であれば、この症状に該当すると思われます...(が、必ずしもです。ハードウェアがサポートしているのにBIOSで無効化されているだけの場合もあるので、まずはそちらに設定項目がないか確認することをおススメします!)
症状
VirtualBox VMが起動しない。かつ、ログにVT-x is not available
やVERR_VMX_NO_VMX
等の出力がある。
(ログはWindows 7でVirtualBoxをデフォルトインストールした場合、下記のようなパスになります。ログローテーションで末尾に.1とか.2とかついているかもしれません)
C:\Users\(ユーザ名)\VirualBox VMs\(仮想マシン名)\Logs\VBox.log
自分の場合だと、ログファイルの末尾が下記のようなエラーで異常終了していました。
00:00:01.274363 VMSetError: D:\tinderbox\win-4.3\src\VBox\VMM\VMMR3\HM.cpp(531) int __cdecl HMR3Init(struct VM *); rc=VERR_VMX_NO_VMX
00:00:01.274401 VMSetError: VT-x is not available.
00:00:01.274969 ERROR [COM]: aRC=E_FAIL (0x80004005) aIID={8ab7c520-2442-4b66-8d74-4ff1e195d2b6} aComponent={Console} aText={VT-x is not available. (VERR_VMX_NO_VMX)}, preserve=false
00:00:01.284319 Power up failed (vrc=VERR_VMX_NO_VMX, rc=E_FAIL (0X80004005))
対策
VirturlBoxの管理コマンドを使って書くと、以下の操作を行ってハードウェア仮想化をオフにします。仮想マシンを管理するVBoxManageコマンドを直接使うなら、下記の2項目をオフに変更します。
VBoxManage modifyvm (VM名) --hwvirtex off
VBoxManage modifyvm (VM名) --vtxvpid off
Packerのテンプレートだと、builderセクションに下記のようなVMオプションを指定することになります。
"builders": [
{
"type": "virtualbox",
...(中略)...
"vboxmanage": [
[
"modifyvm",
"{{.Name}}",
"--hwvirtex",
"off"
],
[
"modifyvm",
"{{.Name}}",
"--vtxvpid",
"off"
],
...(中略)...
}
],
...(次のセクション)...
それと、今回の症状に該当する方は、32bit用のOSしかインストールできません!64bit環境のVMを作成する際に仮想化支援の機能が必要になるためです。この点も注意が必要ですね。
また、上述したように「本当は物理ハードウェア側で仮想化サポートしているのに、単にBIOSで有効になっていないだけ」というケースがあります。この場合は、BIOSの設定をオンするだけで解決するかもしれません!(自分の場合はいくら確認してもVT-xやAMD-V項目が見当たらない安価ノートPCだったので、上記の方法を実践しました...)
参考URL
- Disabling VT-X in VirtualBox (on Linux) - 英語。Linuxとありますが、Windowsでも適用可能でした。
- 仮想化支援機能(VT-x/AMD-V)を有効化できません
所感
まだまだ日本語の情報が少なくて使うのが大変なDevOps分野かと思いますが、自分もいろんな人のブログを参考にひたすらビルドを実践している最中です。特に、Veeweeで生成したテンプレートをveewee-to-packerで変換してPackerビルドをいじるのは良い勉強になります。
ビルドしてもsshログインできない..なんてテンプレートにハマったり..と大変なこともありますが、その辺も踏み固められるように、上手いビルドテンプレートが作れたら随時公開してみたいと思います!