KVMのGuestOS上でCPUの仮想化支援技術を利用する

通常、CPUの仮想化支援機能を利用(認識)できるのは、ハイパーバイザまでですが、
KVMのNestedを使うことでGuestOS上でも仮想化支援機能を利用できるようになります。
要は、『KVM on KVM』などというトリッキーな遊びができるわけです。

実際どれほど有用な機能なのか語ることは難しいのですが、個人的には複数の
物理マシンを保有できないため、ライブマイグレーションの実験やらプライベート
クラウドの実験環境やらで活躍しています。

ハードウェアの制約

今回、この記事を書くために改めて調べてみましたが、未だIntel系のCPUでの対応は
不完全のようです。(Kernel Patchは存在するようですが...)
このため、気軽に試すのであればAMD(AMD-V)のCPUである必要があります。

設定手順

ここでは、手軽なLinuxディストリビューションであるUbuntu Server 11.04で構築する
手順を記します。
KVM環境のインストールについてはSettingup LinuxKVM - La vie des marmotteをご覧ください。

■Kernel module "kvm_amd"のnestedオプションを有効にする

$ sudo /etc/init.d/libvirt-bin stop
$ sudo modprobe -r kvm_amd
$ sudo modprobe kvm_amd nested=1
OSの再起動毎に再設定する必要が生じるため、設定ファイルを修正します。
$ sudo vi /etc/modprobe.d/kvm.conf
--
options kvm_amd nested=1
--

仮想マシンの起動
KVM仮想マシンを起動する場合、"kvm"コマンドにて起動させますがこのまま起動しても
GuestOS上で仮想化支援機能を利用することができません。
実際には、"kvm"コマンドは"qemu-system-x86_64"コマンドのシンボリックリンクで、
オプションを確認すると次のようなオプションが存在します。
$ qemu-system-x86_64 --help | grep nest
-enable-nesting enable support for running a VM inside the VM (AMD only)

virt-managerを利用してGuestOSを管理したいときなど、"kvm"コマンドを裏で実行している
ため、専用のシェルスクリプトを作成しておくと便利です。
$ sudo vi kvm-nested
--
#!/bin/bash
exec /usr/bin/qemu-system-x86_64 -enable-nesting "$@"
--
$ sudo chmod +x kvm-nested

また、Ubuntu11.04ではAppArmorによってセキュリティ管理されているため設定を追加します。
$ sudo vi /etc/apparmor.d/abstractions/libvirt-qemu
--
/usr/bin/kvm-nested rmix,
--

最後に、必要に応じてkvmコマンドのシンボリックリンクを書き換えます
$ cd /usr/bin
$ sudo mv kvm kvm.org
$ sudo ln -s /usr/bin/kvm-nested /usr/bin/kvm

以上

参考資料:HugeDomains.com - Shop for over 300,000 Premium Domains