システム構築と開発の過程、特にHomelabやdev/test環境において、多くの皆さんが共通の課題に直面すると思います。それは、限られた物理サーバーしか手元にない状況で、Kubernetesクラスター、多数のESXiホストを持つvCenter、あるいは複数ドメインのActive Directoryサービスのような複雑な環境をどのようにシミュレートするかということです。新しいハードウェアを追加購入することは常に可能ではなく、個人のPCのリソースには限りがあります。
私はProxmox VEで12台のVMとコンテナを管理するHomelabを運用しており、これは本番環境に投入する前にあらゆるものをテストするための「遊び場」です。ハイパーバイザー間のVM移行や、完全なvCenter環境の構築といった、より複雑なシナリオをテストするためには、通常のVMを作成するだけでは不十分で、より柔軟なソリューションが必要でした。
問題は、Proxmox上で動作する仮想マシン内部に、ESXiやKVMのようなハイパーバイザーをインストールしようとしたときに発生しました。一見すると、これは不可能に思えます。なぜなら、ハードウェア仮想化機能(Intel VT-xやAMD-Vなど)は通常、最上位のハイパーバイザー専用に割り当てられているからです。
現実的な問題:なぜESXi/KVMをVM内に「通常の方法」でインストールできないのか?
Proxmox VE上で作成された仮想マシン(Guest OS)にESXiやKVMのようなハイパーバイザーをインストールしようとすると、期待通りに動作しないことにすぐに気づくでしょう。ハードウェア仮想化サポートの欠如に関するエラーメッセージは非常に一般的です。ここでの主な原因は、仮想化のアーキテクチャにあります。
タイプ1ハイパーバイザー(この場合はProxmox VE)が、CPUのハードウェア仮想化機能(Intel VT-xまたはAMD-V)の制御を占有します。
Proxmox上で通常の仮想マシンを作成すると、このハイパーバイザーはGuest OSに仮想化された環境を提供しますが、CPUのハードウェア仮想化機能をそのGuest OSに公開したり、パススルーしたりすることはありません。これは、Guest OSが完全なオペレーティングシステムであっても、物理CPUの仮想化機能を「認識」できないことを意味し、その結果、それ自体が他の子仮想マシンを実行するためのハイパーバイザーになることはできません。
より深い原因分析:Intel VT-x/AMD-Vの重要性
ハイパーバイザーが効率的に動作するためには、CPUの仮想化命令セット(Intelの場合はIntel VT-x、AMDの場合はAMD-V)に直接アクセスする必要があります。これらの命令セットは、ハイパーバイザーがリソースを分離し、メモリを管理し、仮想マシン間のコンテキストを効率的に切り替えるのに役立ち、過度なオーバーヘッドを発生させません。
Proxmox VEが起動すると、これらの命令セットを自動的に使用します。仮想マシンもこれらの命令セットを使用してそれ自体を仮想化できるようにProxmoxに「指示」しない限り、下位の仮想マシンはその機能を得ることはできません。これが問題の核心であり、ネステッド仮想化(Nested Virtualization)が必要とされる理由です。
複雑なラボ構築のための解決策
物理リソースが限られている場合に複雑なラボを構築するためのいくつかのアプローチがあります。
- 追加ハードウェアの購入:これは最も単純ですが、最も費用がかかる方法です。追加のサーバーやワークステーションを購入して、物理ハイパーバイザーを追加でインストールします。コストとスペースの面で柔軟性がありません。
- コンテナ(Docker, LXC)の使用:環境分離が必要なアプリケーションやサービスにとって、コンテナは優れた選択肢です。軽量で起動が速く、リソース効率も高いです。しかし、完全なオペレーティングシステムや別のハイパーバイザーをシミュレートする必要がある場合、コンテナは仮想マシンを完全に置き換えることはできません。DockerコンテナにESXiや完全なWindows Serverをインストールすることはできません。
- ネステッド仮想化:これが私が重点的にガイドするソリューションです。これにより、仮想マシン(例:Proxmox VE上のVM)内にハイパーバイザー(例:ESXi、KVM)を実行し、さらにそのハイパーバイザー内に子仮想マシンを実行できます。ネステッド仮想化の利点は非常に明確です。
- ハードウェアの節約:Proxmoxを実行する物理サーバーが1台あれば、複数の独立したラボ環境を作成でき、投資コストを大幅に削減できます。
- 柔軟性と迅速性:わずかな操作でラボ環境を簡単に作成、削除、コピーでき、学習、新しいシナリオのテスト、メインシステムに影響を与えることなく利用できます。
- 製品環境のシミュレーション:実際のデプロイメントの前に複雑なアーキテクチャをテストでき、リスクを最小限に抑えます。
最善の方法:Proxmox VEでのネステッド仮想化設定ガイド
ネステッド仮想化を最大限に活用するためには、物理Proxmoxホストと、ハイパーバイザーがインストールされるタイプ1仮想マシン(Guest OS)の両方でいくつかの設定を行う必要があります。具体的な手順を段階的に説明します。
ステップ1:Proxmox VEホストでのネステッド仮想化の確認と有効化
まず、Proxmox VEを実行している物理サーバーのCPUが仮想化(Intel VT-xまたはAMD-V)をサポートしており、BIOS/UEFIで有効になっていることを確認する必要があります。ほとんどの最新のCPUにはこの機能があります。
ネステッド仮想化が有効になっているかを確認するには、ProxmoxホストにSSHで接続し、以下のコマンドを実行します。
cat /sys/module/kvm_intel/parameters/nested # Intel CPUの場合
cat /sys/module/kvm_amd/parameters/nested # AMD CPUの場合
結果がYまたは1であれば、ネステッド仮想化は有効になっています。Nまたは0であれば、有効化する必要があります。
一時的な有効化(再起動すると無効になります):
# Intel CPUの場合
modprobe -r kvm_intel
modprobe kvm_intel nested=1
# AMD CPUの場合
modprobe -r kvm_amd
modprobe kvm_amd nested=1
上記のコマンドを実行した後、cat /sys/module/kvm_intel/parameters/nested(またはkvm_amd)コマンドで再度確認してください。結果はYまたは1である必要があります。
永続的な有効化(再起動後も有効):
Proxmoxホストが起動するたびにネステッド仮想化が自動的に有効になるようにするには、モジュールファイルに設定を追加する必要があります。
# Intel CPUの場合
echo "options kvm_intel nested=1" > /etc/modprobe.d/kvm-intel.conf
# AMD CPUの場合
echo "options kvm_amd nested=1" > /etc/modprobe.d/kvm-amd.conf
その後、initramfsを更新し、Proxmoxホストを再起動します。
update-initramfs -u -k all
reboot
ホストの再起動後、ネステッド仮想化が永続的に有効になっていることを確認するために、再度ステータスをチェックしてください。
ステップ2:ハイパーバイザー(ESXi、KVM/Ubuntu Server)をインストールするためのタイプ1仮想マシン(Guest OS)の作成
次に、Proxmox VE上に、タイプ2ハイパーバイザー(例:ESXi、またはKVMを搭載したUbuntu Server仮想マシン)をインストールするための仮想マシンを作成します。ここでの重要なポイントは、仮想マシンのCPU設定です。
VM作成手順:
- Proxmox VEインターフェースで、「Create VM」をクリックします。
- 「General」タブで、VMの名前を設定します。
- 「OS」タブで、インストールしたいハイパーバイザーのOSのISO(例:ESXiインストーラーISO、Ubuntu Server ISO)を選択します。
- 「System」タブで、デフォルトオプションをそのままにするか、必要に応じてカスタマイズします。
- 最も重要: 「CPU」タブでのCPU設定
- Type:
hostを選択します。hostタイプを選択すると、タイプ1仮想マシンはProxmoxホストの物理CPUと同様の仮想化機能を得ることができます。または、hostオプションが期待通りに動作しない場合や、より詳細な制御が必要な場合は、kvm64を選択し、「Flags」フィールドに+vmx(Intel用)または+svm(AMD用)のフラグを追加することもできます。 - Cores: 適切なコア数を設定します。
VM内にESXiをインストールする場合、少なくとも2つのCPUコアを割り当てる必要があります。
- Type:
- 「Memory」タブで、タイプ2ハイパーバイザーとその子仮想マシンに十分なRAMを割り当てます。例えば、ESXiを実行するには最低4GBのRAMが必要で、KVMをUbuntu上で実行する場合は要件によります。
- 「Disk」タブで、Guest OSハイパーバイザー用のディスクを作成します。
- 「Network」タブで、適切なネットワークブリッジを設定します。
- 内容を確認し、「Finish」をクリックしてVMを作成します。
VMが作成されたら、それを起動し、ESXiまたはUbuntu Server(KVM搭載)を通常通りインストールします。インストールが完了すると、Proxmox仮想マシン内でハイパーバイザーが実行されている状態になります。
ステップ3:Guest OSハイパーバイザー内でのネステッド仮想化の確認
タイプ1仮想マシンにESXiまたはKVM/Ubuntu Serverをインストールした後、仮想化機能が正常にパススルーされていることを確認する必要があります。
- ESXiの場合:VM内で実行されているESXiホストにログインします。CPU情報を確認します。「Hardware Virtualization」の項目が有効になっていること(通常「Enabled」または「HV: Yes」)を確認します。ESXi内に子仮想マシンを試しに作成して、動作するかどうかを確認することもできます。
- Ubuntu Server上のKVM(VM内)の場合:Ubuntu Server仮想マシンにSSHで接続し、以下のコマンドを実行します。
grep -E 'vmx|svm' /proc/cpuinfo出力に
vmx(Intel)またはsvm(AMD)フラグが表示されていれば、ネステッド仮想化が動作しており、KVMはハードウェア仮想化機能を使用して子仮想マシンを実行できることを意味します。
ステップ4:タイプ2仮想マシン(Guest of Guest)の作成
ネステッド仮想化が動作していることが確認できたら、物理ハイパーバイザー上で行うのと同じように、タイプ2ハイパーバイザー(ESXiまたはKVM/Ubuntu Server)内に子仮想マシン(Guest of Guest)を自由に作成できます。
例えば、タイプ1仮想マシンにESXiをインストールした場合、vSphere Client(またはHost Client)を使用して、そのESXi内にWindows、Linuxなどの仮想マシンを作成できます。同様に、タイプ1仮想マシンでUbuntu Server上のKVMを使用している場合、virt-install、virsh、またはvirt-managerを使用して子仮想マシンを作成および管理できます。
まとめ
ネステッド仮想化は非常に強力な技術であり、物理ハードウェアに過度な投資をすることなく、複雑なラボ環境を構築するための道を開きます。このソリューションを使用すれば、システムアーキテクチャを自由にテストし、新しい技術を学び、最も効果的な方法で実際のデプロイメントに備えることができます。このガイドが、皆さんのHomelabやdev/test環境でProxmox VE上のネステッド仮想化を簡単に設定し、活用するのに役立つことを願っています!
