ウェブサイト検索

ネストされたKVM仮想化を有効にする方法


KVMは、Linuxカーネルに統合された仮想化技術です。KVMが有効なシステムは、プロセッサがそれをサポートしている場合、タイプ1ハイパーバイザーとして機能することができます。

KVMを使用して仮想マシンを作成する方法はいくつかあります。QEMUはKVMとlibvirtを使用でき、仮想マシンマネージャーのUIはそれを簡単に操作できるインターフェースを提供します。

KVMは、互換性のあるハードウェア上でネストされた仮想マシンを作成するために使用できます。これにより、より複雑な使用例に対応するために、仮想マシンの内部に仮想マシンを作成することができます。ホスト上で実行される仮想化された開発環境を考慮してみてください。その環境内で、素のハードウェアから二段階深くネストされた仮想デバイスエミュレーターを実行する必要があるかもしれません。

この記事では、ネストされたKVM仮想化を設定し、正常に動作していることをテストする方法を示します。続行する前に、機能しているKVMインストールがあることを確認し、新しいKVM仮想マシンを作成することに慣れていることを確認してください。

ネストされた仮想化が有効になっているかの確認

ネスト化された仮想化は、ハードウェア仮想化を提供するほとんどの最新プロセッサファミリーでサポートされています。ハイパーバイザーでネスト化がすでに有効になっているかどうかは、次のように確認できます。

cat

Intel または AMD システムを持っているかに応じて、次のパスのいずれかを読み込むコマンド:

Intel

cat /sys/module/kvm_intel/parameters/nested

AMD

cat /sys/module/kvm_amd/parameters/nested

出力はYまたはNのいずれかです。Yが表示されると、準備が整ったことを意味します - ネストされた仮想化はすでに有効になっています。以下の「ゲスト用ネストされた仮想化の有効化」セクションにスキップできます。ターミナルにNが表示された場合は、KVMのカーネルモジュールでネストを有効にする時です。

ネストされた仮想化を有効にする

ネスティングはKVMカーネルモジュールパラメータによって制御されます。このパラメータは/etc/modprobe.d/qemu-system-x86.confを編集することで変更できます。一部のシステムでは、このファイルは/etc/modprobe.d/kvm.confと呼ばれることがあります。

おそらく、このような単一の行のいずれかを見るでしょう:

options kvm_intel

options kvm_intel nested=0

options kvm_amd

options kvm_amd nested=0

これらのいずれかの変種は、KVMがアクティブであるがネスティングが無効であることを意味します。

ネスティングを有効にするには、nested パラメータを追加または変更して、その値を 1 に設定してください:

Intel systems only

options kvm_intel nested=1

AMD systems only

options kvm_amd nested=1

次に、変更を適用するためにKVMカーネルモジュールを再読み込みする必要があります。これを行う前に、実行中の仮想マシンを停止するべきです。

Unload the module

sudo modprobe -r kvm_intel

Reload the module with new settings

sudo modprobe kvm_intel

AMDプロセッサを使用している場合は、kvm_intelの代わりにkvm_amdを使用してください。

今、ネストが有効かどうかを確認するために以前のコマンドを繰り返してください。出力はYになるはずです。

Intel

cat /sys/module/kvm_intel/parameters/nested

Y

AMD

cat /sys/module/kvm_amd/parameters/nested

Y

この方法はネストされた仮想化を恒久的に有効にします。これは、KVMモジュールのパラメータからnested=1を削除するまで、再起動を跨いで持続します。

ゲストのためのネストされた仮想化を有効にする

ゲスト仮想マシンは、サポートされているCPUモードで構成されている場合にのみ、ネストされた仮想化を使用できます。ゲストには、ホスト上の物理ハードウェアと正確に一致するCPU定義が必要です。

ほとんどのゲストは、CPUモードがhost-modelに設定されているときに動作します。これは通常、デフォルトです。これは、ゲストがホストのCPUに似た定義を受け取ることを意味します。場合によっては、ホストのCPUのすべての特性を正確に通過させるhost-passthroughモードを使用する必要があるかもしれません。

ゲストのCPUタイプをチェックして変更するには、virshを使用してそのマニフェストを取得します。まず、virshコマンドを実行してインタラクティブシェルを起動します。それから、list --allと入力して、すべての仮想マシンを取得します:

virsh # list --all

Id Name State

------------------------------

- ubuntu22.04 shut off

- win10 shut off

次に、edit <vm-name>を実行して、名前付きVMのマニフェストを開きます:

virsh # edit ubuntu22.04

ファイル内で、<cpu mode=で始まる行を見つけてください。それを以下のいずれかに変更します:

<cpu mode='host-model' check='partial' />

<cpu mode='host-passthrough' check='none' />

ファイルを保存して閉じたら、exit と入力して virsh シェルを閉じます。ゲストは自分のネストされたゲストを起動する準備が整ったはずです。問題がある場合は、モードを変更してみてください。

ゲストが巣に入れるか確認する

ほとんどのオペレーティングシステムは、仮想マシンを作成できるかどうかを教えてくれます。Linuxゲストが仮想化にアクセスできるかどうかを確認するには、VM内で次のコマンドを実行してください:

cat /proc/cpuinfo | grep "svm|vmx"

仮想化は、赤色で強調表示された svm または vmx の出力が得られた場合に利用可能です。SVMはAMDマシンに表示され、VMXはIntelに表示されます。

ゲスト内に仮想化技術をインストールしてください。新しいネストされた仮想マシンを起動できることがわかるでしょう。ここに、ネストされたKVMを使用してAlpineゲストを実行しているUbuntu仮想マシンのスクリーンショットがあります:

制限

ネストされたゲストにはいくつかの制限があります。ネストされた仮想マシンを開始したゲストでは、一部のKVM機能が利用できなくなります。ネストされた仮想マシンが停止するまで、これらの仮想マシンを移行したり、保存したり、ロードしたりすることはできません。

これらの操作の実行を試みることの実際の効果は未定義です。一部のシステムは耐えることができるかもしれませんが、他のシステムではカーネルパニックを引き起こす可能性があります。チェーン上の上位の仮想マシンに対して操作を行う前に、必ずネストされたゲストをシャットダウンしてください。

要約

ネストされた仮想化は、より多くのパワーと柔軟性を提供します。デバイスエミュレーターを起動するIDEなど、機能するために独自の仮想化を必要とする技術をサンドボックスできます。

KVMでネスティングを機能させるのは通常簡単です。トラブルシューティングは、KVMカーネルモジュールのパラメータが有効になっていることを確認することから始めるべきです。その後、ゲストに割り当てられたCPUモデルを確認し、VM内で互換性のあるセカンドレベルハイパーバイザーを使用していることを確認してください。

関連記事: