仮想化

Nested virtualisationとは?

定義

Nested virtualisation lets a virtual machine itself run virtual machines, by exposing the processor virtualisation extensions to the guest. It is required for Proxmox VE, VM-based CI jobs and some Docker configurations. Many providers disable it, which is the usual reason those workloads fail elsewhere.

Nested virtualisationが重要な理由

Proxmox VE、VMベースのCIジョブ、および一部のDocker構成に必要です。多くのプロバイダーがこれを無効にしており、それが他の場所でこれらのワークロードが失敗する通常の理由です。

実践でのNested virtualisation

ネストされた仮想化を実行するときは、KVMゲスト内でハイパーバイザーを起動し、ホストCPUの仮想化拡張機能を透過させます。ゲスト内の/proc/cpuinfoでsvmまたはvmxフラグを確認する必要があります。これらがない場合、内部ハイパーバイザーはソフトウェアエミュレーションにフォールバックし、パフォーマンスが桁違いに低下する可能性があります。また、これらのフラグを取得するには、汎用モデルではなく'host' CPUタイプを有効にする必要があるかもしれません。これを誤ると、ProxmoxやCIワークロードが遅くなります。

Nested virtualisationについて人々が誤解していること

ネストされた仮想化は、Windowsなどの完全なOSをVMで実行する場合にのみ重要だと想定する人がいます。修正:これはDockerのデフォルトのオーバーレイネットワーキングや特定のカーネルモジュールも壊します。なぜなら、これらはゲスト内の仮想化機能に依存しているからです。したがって、VMを実行するつもりがなくても、ネストを無効にしたプロバイダーではコンテナワークロードが失敗する可能性があります。

Nested virtualisation — よくある質問

ネストされたVM内でDockerを実行できますか?

はい、これが人々がネストされた仮想化を必要とする最も一般的な理由です。Dockerのデフォルトのブリッジネットワーキングはiptablesとカーネルモジュールを使用しますが、CPU仮想化拡張機能が公開されていないと動作が異なる場合があります。当社のKVMプランにはネストされた仮想化が含まれているため、Dockerコンテナは期待どおりに実行されます。

ネストされた仮想化が有効かどうかを確認するにはどうすればよいですか?

VM内でgrep -E '(svm|vmx)' /proc/cpuinfoを実行します。フラグが表示されれば、ネストが利用可能です。表示されない場合は、ハイパーバイザーがそれらを公開しておらず、通常はプロバイダーが無効にしたことを意味します。

Nested virtualisationが登場する箇所

仮想化の詳細

KVM
KVMはLinuxカーネルに組み込まれたフルハードウェア仮想化であり、各ゲストに独自のカーネルと、他のテナントからのハードウェア強制分離を提供します。
OpenVZ
OpenVZはコンテナベースの仮想化であり、すべてのインスタンスがホストカーネルを共有するため、ゲストはカーネルモジュールをロードしたり、異なるオペレーティングシステムを実行したりできません。
LXC
LXCはLinuxネイティブのコンテナ化であり、ホストカーネルを共有しながら、名前空間とcgroupsでプロセスを分離します。
ハイパーバイザー
ハイパーバイザーとは、仮想マシンを作成・実行し、物理CPU、メモリ、I/Oを割り当てるソフトウェアレイヤーです。
vCPU
vCPUは、ゲストに提示される仮想プロセッサであり、物理コアまたはスレッド上のスケジューリング時間によって支えられています。
cloud-init
cloud-initは、プラットフォームが提供するメタデータを使用して、仮想マシンを初回起動時に構成するための標準的なメカニズムです。