2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESXi on KVM on Amazon EC2 — EC2の中にKVMを立て、さらにESXiをネストしてゲストOSを動かしてみた

2
Last updated at Posted at 2026-03-08

はじめに

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を起動します。

  1. EC2 → 「インスタンスの起動」
  2. インスタンスタイプ: c8i.4xlarge
  3. AMI: Ubuntu 22.04 LTS
  4. 詳細設定 → 「ネスト化された仮想化」→ 有効化(重要)
  5. ストレージ:
    • ルートボリューム(gp3): 100GB
    • 追加EBS(gp3): 100GB(/dev/sdf) ← ESXi用
  6. セキュリティグループ: SSH(22), HTTPS(443), VNC(5900-5910)を許可

image.png

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のインストールを進めます。

  1. 起動待機 (2-3分) -- "Welcome to VMware ESXi installation" が表示されます
    image.png
    image.png
    ここまでこれると結構な達成感・・
  2. Enter -- インストール開始
  3. F11 -- EULA承認
  4. インストール先: mpx.vmhba0:C0:T0:L0 (32GB) を選択 → Enter
  5. キーボード: US Default → Enter
  6. rootパスワードを設定 → Enter
  7. 確認画面: F11 → インストール開始 (5-10分待機)
  8. 完了: 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: データストアの作成

以下の手順でデータストアを作成します。

  1. StorageNew Datastore
  2. Type: VMFS
  3. Disk: mpx.vmhba0:C0:T1:L0 (約68GB) -- sdbに対応
  4. Name: guest-ds
  5. VMFS 6
  6. Use all available partitionsFinish

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 MachinesCreate/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

image.png

動作確認チェックリスト

全ての項目が確認できれば、ネスト仮想化環境の構築は完了です。

  • 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によってサポートされていないため、本番環境での利用は避け、あくまでも検証・学習目的での利用にとどめてください。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?