はじめに
Amazon EC2で仮想化されたインスタンスでのネスト仮想化(Nested Virtualization)を正式サポートしました。これにより、仮想化されたEC2インスタンスの中でさらに仮想マシンを動かすことが可能になりました。
これにより、EC2インスタンス上でKVMやHyper-Vなどのハイパーバイザーを動作させることが可能になります。せっかくなので、EC2上でKVMを構築し、さらにその上にVMware ESXi 8.0をインストールして実際にゲストOSを複数台稼働させ、VM間通信が確認できるところまで試してみました。
本記事ではその手順をステップバイステップで紹介します。
注意事項: ネストされた仮想化環境でのESXiの稼働は、Broadcom/VMwareにてサポートされていません。本記事の内容はあくまでも技術検証目的であり、本番環境での利用は推奨されません。
構成概要
本検証の構成は以下の4層構造になっています。
| レイヤー | コンポーネント | 説明 |
|---|---|---|
| L0 | AWS Nitro Hypervisor (c8i.4xlarge) | EC2の基盤ハイパーバイザー |
| L1 | Ubuntu 22.04 LTS + KVM | EC2インスタンスのゲストOS兼KVMホスト |
| L2 | VMware ESXi 8.0 (KVM上のVM) | KVM上で動作するESXiハイパーバイザー |
| L3 | ゲストOS (Ubuntu等) x 複数台 | ESXi上で動作する仮想マシン |
AWS Nitro Hypervisor [L0]
└─ Ubuntu 22.04 + KVM [L1] (EC2 c8i.4xlarge)
└─ ESXi 8.0 VM [L2] (KVM上のVM)
├─ guest-vm-1 (Ubuntu) [L3]
└─ guest-vm-2 (Ubuntu) [L3]
ネットワーク構成:
| セグメント | 説明 |
|---|---|
| EC2 VPC | AWS側のネットワーク(enp39s0) |
| virbr0 (192.168.122.0/24) | libvirt NATネットワーク(L1 - L2間) |
| ESXi VM Network | ESXi上のvSwitch0(L2 - L3間) |
使用リソース
今回は c8i.4xlarge を使ってデプロイしてみました。
| 項目 | 内容 |
|---|---|
| インスタンスタイプ | c8i.4xlarge(vCPU: 16, RAM: 32GiB) |
| AMI | Ubuntu 22.04 LTS(最新版) |
| ルートボリューム | gp3 100GB |
| 追加EBSボリューム | gp3 100GB(ESXi用) |
| ESXiバージョン | VMware ESXi 8.0 Update 3 |
| セキュリティグループ | SSH(22), HTTPS(443), VNC(5900-5910) |
Phase 1: EC2インスタンスの起動
Step 1-1: インスタンスの起動
EC2コンソールから以下の設定でインスタンスを起動します。
AWSマネジメントコンソールからEC2を起動します。
- EC2 → 「インスタンスの起動」
- インスタンスタイプ:
c8i.4xlarge - AMI: Ubuntu 22.04 LTS
- 詳細設定 → 「ネスト化された仮想化」→ 有効化(重要)
- ストレージ:
- ルートボリューム(gp3): 100GB
- 追加EBS(gp3): 100GB(
/dev/sdf) ← ESXi用
- セキュリティグループ: SSH(22), HTTPS(443), VNC(5900-5910)を許可
Step 1-2: Nested Virtualizationの確認
SSH接続後、ネスト仮想化が有効になっていることを確認します。
# /dev/kvmの存在確認
ls -la /dev/kvm
# 期待出力: crw-rw---- 1 root kvm 10, 232 ...
# vmxフラグ確認
grep -m1 vmx /proc/cpuinfo
# 期待出力: vmxフラグが表示される
Step 1-3: NICインターフェース名の確認
ip link show
# 期待出力例:
# 1: lo: <LOOPBACK,UP,LOWER_UP> ...
# 2: enp39s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
Phase 2: Ubuntu + KVM セットアップ
Step 2-1: システム更新とKVMインストール
sudo apt update && sudo apt upgrade -y
# universeリポジトリの有効化 (virtinstのインストールに必須)
sudo add-apt-repository universe -y
sudo apt update
# KVM関連パッケージのインストール
sudo apt install -y \
qemu-kvm \
libvirt-daemon-system \
libvirt-clients \
bridge-utils \
virtinst \
cpu-checker \
ovmf \
qemu-utils \
genisoimage
Step 2-2: KVM動作確認とサービス有効化
# KVM動作確認
sudo kvm-ok
# 期待出力: INFO: /dev/kvm exists / KVM acceleration can be used
# libvirtdサービスの有効化
sudo systemctl enable --now libvirtd
# ユーザーをlibvirt/kvmグループに追加
sudo usermod -aG libvirt,kvm $USER
newgrp libvirt
Step 2-3: Nested Virtualization設定の確認
# Nested Virtualizationの確認 (Yが返ればOK)
cat /sys/module/kvm_intel/parameters/nested
# 期待出力: Y
Step 2-4: libvirt NATネットワークの確認
# デフォルトNATネットワークの確認
sudo virsh net-list --all
# 期待出力:
# Name State Autostart Persistent
# --------------------------------------------
# default active yes yes
# inactiveの場合は起動
sudo virsh net-start default
sudo virsh net-autostart default
# virbr0の確認
ip addr show virbr0
# 期待出力: inet 192.168.122.1/24
Phase 3: ストレージ準備 (LVM構成)
Step 3-1: 追加EBSボリュームの確認
lsblk
# 期待出力:
# nvme0n1: OSルート (100GB)
# nvme1n1: 追加EBS (100GB) ← これを使用
Step 3-2: LVM構成
追加EBSボリュームをLVMで管理し、ESXiブートディスクとゲストOS用データストアに分割します。
# LVM作成
sudo pvcreate /dev/nvme1n1
sudo vgcreate vg_esxi /dev/nvme1n1
# ESXiブートディスク (32GB)
sudo lvcreate -L 32G -n lv_esxi_boot vg_esxi
# ゲストOS用データストア (残り全て 約68GB)
sudo lvcreate -l 100%FREE -n lv_esxi_ds vg_esxi
# 確認
sudo lvs
# 期待出力:
# LV VG Attr LSize
# lv_esxi_boot vg_esxi -wi-a----- 32.00g
# lv_esxi_ds vg_esxi -wi-a----- <68.00g
Phase 4: ESXi ISOの準備
Step 4-1: ISOファイルの配置
ESXi のISOファイルを /var/lib/libvirt/images/ に配置します。
Step 4-2: パーミッション設定
sudo chmod 644 /var/lib/libvirt/images/VMware-VMvisor-Installer-8.0U3-24022510.x86_64.iso
sudo chown libvirt-qemu:libvirt-qemu \
/var/lib/libvirt/images/VMware-VMvisor-Installer-8.0U3-24022510.x86_64.iso
Phase 5: ESXi VM の定義と起動
Step 5-1: VM定義XMLの作成
今回以下のようにXMLファイルを作成しました。
sudo tee /tmp/esxi-vm.xml > /dev/null << 'EOF'
<domain type='kvm'>
<name>esxi-vm</name>
<memory unit='GiB'>28</memory>
<currentMemory unit='GiB'>28</currentMemory>
<vcpu placement='static'>8</vcpu>
<cpu mode='host-passthrough' check='none' migratable='off'>
<feature policy='require' name='vmx'/>
<feature policy='disable' name='hypervisor'/>
<feature policy='disable' name='x2apic'/>
<feature policy='disable' name='pdpe1gb'/>
</cpu>
<os>
<type arch='x86_64' machine='pc-i440fx-jammy'>hvm</type>
<boot dev='cdrom'/>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<clock offset='utc'/>
<devices>
<!-- ESXiブートディスク -->
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source dev='/dev/vg_esxi/lv_esxi_boot'/>
<target dev='sda' bus='sata'/>
</disk>
<!-- ゲストOS用データストアディスク -->
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source dev='/dev/vg_esxi/lv_esxi_ds'/>
<target dev='sdb' bus='sata'/>
</disk>
<!-- ESXiインストールISO -->
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/VMware-VMvisor-Installer-8.0U3-24022510.x86_64.iso'/>
<target dev='sdc' bus='sata'/>
<readonly/>
</disk>
<!-- NIC: e1000e(ESXi 8.0対応) → libvirt NATネットワーク -->
<interface type='network'>
<source network='default'/>
<model type='e1000e'/>
</interface>
<!-- VNCコンソール(ローカルのみ) -->
<graphics type='vnc' port='5910' listen='127.0.0.1'>
<listen type='address' address='127.0.0.1'/>
</graphics>
<video>
<model type='vga' vram='16384'/>
</video>
<serial type='pty'/>
</devices>
</domain>
EOF
Step 5-2: VMの登録と起動
# VM定義
sudo virsh define /tmp/esxi-vm.xml
# 起動
sudo virsh start esxi-vm
# 状態確認
sudo virsh list --all
# 期待出力:
# Id Name State
# -------------------------
# 1 esxi-vm running
Phase 6: ESXiインストール(VNC経由)
Step 6-1: VNCトンネル作成(ローカルPCで実行)
ssh -L 5910:127.0.0.1:5910 -i your-key.pem ubuntu@<ec2-public-ip>
Step 6-2: VNC接続
VNCクライアント (TigerVNC / RealVNC Viewer等) で以下に接続します。
-
接続先:
localhost:5910
Step 6-3: ESXiインストール手順
VNC画面でESXiのインストールを進めます。
- 起動待機 (2-3分) -- "Welcome to VMware ESXi installation" が表示されます


ここまでこれると結構な達成感・・ - Enter -- インストール開始
- F11 -- EULA承認
- インストール先:
mpx.vmhba0:C0:T0:L0(32GB) を選択 → Enter - キーボード: US Default → Enter
- rootパスワードを設定 → Enter
- 確認画面: F11 → インストール開始 (5-10分待機)
- 完了: Enter → 再起動
Step 6-4: インストール完了後にブート順を変更
インストール完了メッセージが表示されたタイミングで、VMを一度停止してブート順を hd 優先に変更します。再起動前にこの手順を実施してください。
# VMを停止
sudo virsh destroy esxi-vm
# ブート順を変更
sudo virsh edit esxi-vm
<os> セクションを以下のように修正します(hd を先頭に変更)。
<os>
<type arch='x86_64' machine='pc-i440fx-jammy'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
保存後、VMを再起動します。
sudo virsh start esxi-vm
これによりインストール済みのESXiがディスクから正常に起動します。
Phase 7: ESXi初期設定
Step 7-1: DCUI画面の確認
VNC画面に黄色/グレーのDCUI (Direct Console User Interface) が表示されれば、ESXiの起動は成功です。
Step 7-2: 管理IPの確認(VNC DCUI画面)
DHCPで自動取得された場合は画面に表示されるIPを確認します。静的IPに固定する場合は以下の手順で設定します。
F2 → rootパスワード入力
Configure Management Network
→ IPv4 Configuration
→ スペースキーで「Set static IPv4 address」を選択
→ IP Address: 192.168.122.238
→ Subnet Mask: 255.255.255.0
→ Default Gateway: 192.168.122.1
→ DNS Configuration
→ Primary DNS Server: 192.168.122.1
→ ESC → Y(設定適用)
Step 7-3: 疎通確認
Ubuntu上からESXiへの疎通を確認します。
ping -c 3 192.168.122.238
Step 7-4: ESXi SSH有効化(VNC DCUI画面)
F2 → rootパスワード入力
Troubleshooting Options
→ Enable SSH → Enter
ESC → ESC
Step 7-5: SSH接続確認
# Ubuntu上からESXiにSSH接続
ssh root@192.168.122.238
Phase 8: vSphere Client接続とデータストア作成
Step 8-1: SSHトンネル作成(ローカルPC)
ssh -L 8443:192.168.122.238:443 -i your-key.pem ubuntu@<ec2-public-ip>
Step 8-2: ESXi にログイン
ブラウザで https://localhost:8443 にアクセスし、以下の認証情報でログインします。
- ユーザー名:
root - パスワード: 設定したパスワード
Step 8-3: データストアの作成
以下の手順でデータストアを作成します。
- Storage → New Datastore
- Type: VMFS
- Disk:
mpx.vmhba0:C0:T1:L0(約68GB) -- sdbに対応 - Name:
guest-ds - VMFS 6
- Use all available partitions → Finish
Phase 9: ゲストOS作成と通信確認
Step 9-1: ネットワーク設定の確認
ESXiにSSH接続し、ネットワーク設定を確認します。
ssh root@192.168.122.238
# vSwitch0の確認
esxcli network vswitch standard list
# VM Networkポートグループの確認
esxcli network vswitch standard portgroup list
Step 9-2: ゲストVMの作成
ESXi Host Clientで Virtual Machines → Create/Register VM からゲストVMを2つ作成しました。
Step 9-3: ゲストOS間の通信確認
# ゲストVM #1 (例: 192.168.122.66) から
ping 192.168.122.163
# ゲストVM #2 (例: 192.168.122.163) から
ping 192.168.122.66
# ゲストVM #1 (例: 192.168.122.66) から
ssh 192.168.122.163
# Ubuntu (L1) からゲストOS (L3) への通信確認
ping 192.168.122.163
動作確認チェックリスト
全ての項目が確認できれば、ネスト仮想化環境の構築は完了です。
- ESXi DCUI画面が表示される
- vSphere Clientにログインできる
- データストアが作成できる
- ゲストOSが2台起動する
- ゲストOS間でpingが成功する
- Ubuntu (L1) からゲストOS (L3) へpingが成功する
まとめ
Amazon EC2のネスト化された仮想化機能を利用して、EC2 → KVM → ESXi → ゲストOSという4層のネスト仮想化環境を構築しました。構築にあたっては、machine typeやNICモデルの互換性、ネットワーク構成など、いくつかのハマりポイントがありましたが、適切に設定することで安定して動作する環境を実現できました。
改めてになりますが、ネストされた仮想化環境でのESXiの稼働はBroadcom/VMwareによってサポートされていないため、本番環境での利用は避け、あくまでも検証・学習目的での利用にとどめてください。

