HalNiの雑記

備忘録を兼ねて。サーバマシンとかネットワークとか

ホストCPUをパススルーせずにNested KVM を動かす (openSUSE Leap 15.1)

KVMでNestする場合、CPU ModelをHost passthroughにするのが一般的である
<cpu mode='host-passthrough'>
こんな感じでOK、virshやlibvirtでCPUモデルを変えるだけの簡単なお仕事

しかしVMマイグレーションを視野に入れた場合、ホストCPUをパススルーしてしまうと面倒なことになる

ゲスト仮想マシンを別のホスト物理マシンに移行する必要が全くないことが判明している場合、そのホスト物理マシンの CPU モデルは修正なしに単純に渡されます。
一部の仮想化データセンターには、すべてのサーバーが 100% 同一の CPU を保持していることを保証する設定のセットが含まれる場合があります。
そのような場合も、ホスト物理マシンの CPU モデルは修正なしに単純に渡されます。
しかし、さらに一般的なケースとしては、ホスト物理マシン間に CPU のバリエーションが存在することがあります。
このような CPU の混在環境では、妥協できる共通の CPU を決定する必要があります。
    -- Red Hat Product Documentation

これは従来のNest環境では問題になる

CPU ModelをHost passthroughにする理由として、Nested KVMの実行にはvmxというCPUの拡張機能が必要らしい
よって仮想マシンにVMXを拡張機能として持たせてあげれば良い

今回の試験環境:

openSUSE Leap 15.1
libvirt Version 5.1.0
Intel Xeon E5-2630L

前提として /etc/modprobe.d/kvm.conf を作成、kvm.conf内に
options kvm_intel nested=1
とで記述しNested KVMを有効化しておく

/sys/module/kvm_intel/parameters/nested
をcatして確認しておくこと

haruka@suse_host01:~> cat /sys/module/kvm_intel/parameters/nested
Y

でOK

ここでvirshを用いてNested KVMさせたいVMのマシンモデルを編集

sudo virsh edit suse_vm01

<feature policy='require' name='vmx'/>

<cpu></cpu>中に追加することで仮想マシンであるsuse_vm01にvmx機能が付与される

f:id:v_7zrgu0:20190807153050p:plain
こんな感じ

因みにvmxはIntel VT-xの拡張動作モードらしい

vmxを有効化してあげることで、suse_vm01上でkvmが実行できる

f:id:v_7zrgu0:20190807153212p:plain
通化させたCPU上のVM(suse_vm01)でNested VM(suse_nest)が稼働している

参考文献

Red Hat Product Documentation - 20.40. ゲスト仮想マシンの CPU モデルの設定
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-managing_guest_virtual_machines_with_virsh-guest_virtual_machine_cpu_model_configuration