Red Hat ソリューションアーキテクトの小島です。
今回はタイトル通り、仮想化の入れ子機能であるNested KVMの使い方を紹介します。以下は忙しい人向けのまとめです。
- Nested KVMはRHEL7.3+, RHEL8.0+で利用可能 (ただし、全てのケースでTech Preview扱い)
- Linux Kernel 3.12でリリースされたIntel CPU対応のNested KVM機能が、RHEL7にもバックポート
- Red Hat OpenStackでもHeat Templateを利用して、コンピュートノードのRHELにNested KVMを設定可能
2020年6月追記
RHEL8.2からNested KVMの利用を一部サポートするようになりました。サポート条件は下記のとおりです。
- Intel x86_64 CPUの利用 (Xeon v3+)
- L0のOS(ホストOS)とL1のOS(仮想マシン上のOS)は、RHEL8.2+
- L2(仮想マシン上の仮想マシン)のOSでサポート対象となるものは、RHEL6+, Windows 10+, Windows Server 2016+
AMD CPUでのNested KVMは、現時点ではサポート対象外となります。サポート条件の詳細は下記をご参照ください。
RHEL8.4以降で、再びTech Preview扱いになりました。 access.redhat.com
最近だと開発や製品検証にコンテナを利用することも増えてきていると思いますが、仮想化機能を使っているケースもまだまだ多いと思います。ISVの製品も仮想化用のアプライアンスとして提供していることがありますので、そのような場合に仮想化の入れ子機能が使えると、仮想化環境上でもさくっと検証できるようになります。OpenStackのような複数のマシン台数が必要になるIaaS製品の検証でも便利です。
CentOSやFedoraでのNested KVMの設定方法を紹介しているブログは多いですが、実はRHELでも使えます。Linux kernel 3.12のリリースに伴い、Intel CPUに対応したNested KVM機能を本格的に使えるようになりましたが、この機能はLinux Kernel 3.10系をベースとしたRHEL7のカーネルにもバックポートされています。Nested KVMは全てのケースでTech Preview機能となり、Red Hatのサポート対象外の機能となります。また、RHEL7.3+、RHEL8.0+でないと使えませんので注意してください。Nested KVMはデフォルトで無効化されていますので、下記のようなコマンドを実行して設定を行ってください。
# cat << EOF > /etc/modprobe.d/kvm.conf options kvm_intel nested=1 <- AMD系のCPUの場合は、「optionns kvm_amd nested=1」を指定 EOF # modprobe -rv kvm_intel <- AMD系のCPUの場合は、「kvm_amd」 を指定 # modprobe -v kvm_intel <- AMD系のCPUの場合は、「kvm_amd」 を指定
RHEL8の場合は、仮想化機能に関するパッケージをインストールすると、Nested KVMを利用するための設定がコメントアウトされた「/etc/modprobe.d/kvm.conf」が予め用意されているので、コメントアウトを解除してkvm_intelまたはkvm_amdモジュールをリロードします。これでNested KVMが有効になりますので、virshやvirt-installなどでNested KVMを設定・利用できるようになります。この場合は、仮想化ホストのCPU機能をゲストが利用するような設定を行います。
新規に仮想マシンを作成 # virt-install ... --cpu host ... <- ホストのCPUを利用するオプションを指定 既存の仮想マシンを編集 # virsh edit <vm_domain_name> ... <cpu mode='host-model' check='partial'> <- cpu_mode='host-model'を指定 <model fallback='allow'/> </cpu> ...
GUIで設定する場合、執筆時点ではRHEL7とRHEL8のWebコンソールであるCockpitでは仮想マシンのCPU設定を行えないので、virt-manager(RHEL8では非推奨扱い)などで設定する必要があります。virt-managerを利用する場合、[CPU数] の [ホストCPUの設定をコピーする] にチェックを入れて、変更を保存します。
また、RHELをベースとしたRed Hat OpenStack(バージョン15からRHEL8対応予定)でもNested KVMを利用するように設定できます。この場合は、Nested KVMの設定をデプロイするためのHeat TemplateファイルをYAMLで作成して、openstack overcloud deploy
コマンドでovercloudをデプロイする手順を実行します。手順の例は下記のナレッジベースを参考にしてください。
なお、Nested KVMを利用した場合、どのくらいパフォーマンスが落ちるのかを弊社エンジニアがテストしています。これによると、製品の機能検証をする場合は、L2ゲスト(仮想マシン上の仮想マシン)くらいまでに留めておいた方が良さそうです。