AWS EC2 仮想インスタンスでネステッド仮想化(Nested Virtualization)を有効化して、KVM で VM を作ってみた

AWS EC2 仮想インスタンスでネステッド仮想化(Nested Virtualization)を有効化して、KVM で VM を作ってみた

2026.06.09

はじめに

こんにちは、クラスメソッドのチェです。

2026年2月に、これまで.metalベアメタルインスタンスでしか提供されなかった EC2 のネストされた仮想化(Nested Virtualization)機能が、
第8世代 Intelベース仮想インスタンスでもネステッド仮想化をサポートするようになりました。

今回は m8i.large を使ってネステッド仮想化を有効化し、
その上で KVM をインストールして実際にゲスト VM を起動するところまでやってみたいと思います。

ネステッド仮想化とは?

簡単に言いますと「仮想マシン(VM)の中で、さらに別の VM を動かす」技術です。
AWSのEC2インスタンス自体がVMですが、その中にさらにKVMを使ってVMを起動するには、
CPU の仮想化拡張機能(Intel VT-xなどのVMX)をゲストOS(EC2 インスタンス)で利用する必要があります。

これまでは.metalインスタンスでしか有効にできませんでしたが、
今回のアップデートで、”VMXを仮想インスタンスにも渡せるようになった” というのがポイントです。

ベアメタル vs 仮想インスタンスのコスト比較

実際にどれくらい安くなるのかが気になって、同じインスタンスタイプで東京リージョン(ap-northeast-1)のOndemand料金を比較してみました(2026年5月時点、参考例です!!)。

インスタンスタイプ vCPU メモリ オンデマンドの時間単価(Linux)
m8i.metal-48xl 192 768 GB $13.12416
m8i.large 2 8 GB $0.13671

ご覧の通り、最大で約100倍のコスト差がありますので、用途によっては良い選択肢になりそうです。

事前準備

実践に入る前に、以下が揃っているかをご確認ください。

  • EC2インスタンス起動権限のある IAMユーザーまたはロール
    • ec2:RunInstancesec2:DescribeInstancesなど
  • SSH接続用のキーペア
  • セキュリティグループ(SSH ポート 22 のインバウンド許可)

m8i.large を 1〜2 時間使う前提で $0.30 程度 を見込んでおけば十分です。ネストされた仮想化機能自体には追加料金は発生しません。


やってみた

キーペアの作成

まずはSSH接続に使うキーペアを作成します。

EC2ダッシュボード → 左メニュー 「ネットワーク & セキュリティ」 → 「キーペア」 → 「キーペアを作成」をクリック

key1

私はMacですのでpemを選択しましたが、Windowsユーザでしたらppkを選択して作成してください!

セキュリティグループの作成

SSH(22)だけを「マイIP」から許可するシンプルなセキュリティグループを作ります。

EC2ダッシュボード → 左メニュー 「ネットワーク & セキュリティ」 → 「セキュリティグループ」 → 「セキュリティグループを作成」をクリックして作成してください。

image

sg2

検証ですのでアウトバウンドはデフォルトのままでいいです!

sg3

ネストされた仮想化有効のEC2インスタンスを起動

EC2ダッシュボード → 「インスタンスを起動」をクリックしてください。

ec21

私は今回は検証AMI として「Ubuntu Server 26.04 LTS(x86_64)」を利用しました。

ec22

インスタンスタイプm8i.largeと作成したキーペア選択
(第 8 世代 Intel ベースの仮想インスタンス(c8i/m8i/r8iなど)を選択してください!!)

ec23

作成したセキュリティグループを選択

ec24

ec25

高度な詳細」を展開 → 下にスクロールして 「ネストされた仮想化」を必ず有効化してください。

ec26

SSH接続とネストされた仮想化の確認

EC2コンソールで「パブリックIPv4アドレス」を確認し、SSHで接続します。

ssh -i ./nested-keypair.pem ubuntu@<EC2のパブリックIP>

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

接続したらまずKVMがロードされているかを確認します。これが「ネストされた仮想化が有効化された」ことの最も明確な証拠です。

lsmod | grep kvm

kvm_intelがあるか確認してください!

kvm_intel             552960  0
kvm                  1531904  1 kvm_intel
irqbypass              12288  1 kvm

このように出力されたら問題ないです。

KVM/libvirt/#virt-install をインストール

sudo apt update

でパッケージリストを更新して

sudo apt install -y qemu-system-x86 libvirt-daemon-system libvirt-clients virtinst bridge-utils

でパッケージをインストールします。

各パッケージの役割:

パッケージ 役割
qemu-system-x86 KVM ベースの QEMU x86 エミュレータ
libvirt-daemon-system libvirtd デーモン(仮想化管理 API)
libvirt-clients virsh などの CLI ツール
virtinst virt-install コマンド(VM 作成用)
bridge-utils ネットワークブリッジ管理

ユーザ権限設定

ubuntu ユーザーが sudo なしで virsh を使えるよう、libvirt と kvm の両方のグループに追加します。

sudo usermod -aG libvirt,kvm ubuntu
exit
ssh -i ./nested-keypair.pem ubuntu@<パブリック IP>

グループ変更は新しいシェルから有効になるので、一度ログアウトして再接続します。

Alpine LinuxゲストVMを作成

ゲスト OS には軽量で検証に最適な Alpine Linux 3.21 を選びました。

Alpine ISOと仮想ディスクの準備

bashcd /tmp
wget https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/x86_64/alpine-virt-3.21.0-x86_64.iso
sudo mv alpine-virt-3.21.0-x86_64.iso /var/lib/libvirt/images/
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/alpine-disk.qcow2 4G

KVM VMを作成

sudo virt-install \
  --name alpine-guest \
  --memory 1024 \
  --vcpus 1 \
  --disk /var/lib/libvirt/images/alpine-disk.qcow2,format=qcow2 \
  --cdrom /var/lib/libvirt/images/alpine-virt-3.21.0-x86_64.iso \
  --os-variant alpinelinux3.20 \
  --network network=default \
  --graphics none \
  --console pty,target_type=serial \
  --noautoconsole

コンソールでsetup-alpine実行

コンソール接続コマンド
bashvirsh console alpine-guest

ログイン(root、パスワードなし)後、setupコマンド実行
setup-alpine

セットアップは対話形式で自分は以下のように答えました!(検証なので最小限の設定)

質問 答え
Hostname alpine-test
Interface eth0
IP address dhcp
Root password (任意)
Timezone Japan
HTTP proxy (none)
APK Mirror f(ミラー自動選択)
User no
SSH server openssh
Disk vda
How to use sys
Erase confirmation y

最後に以下が表示されたら完了です。

Installation is complete. Please reboot.
alpine-test:~#

シャットダウンしてホストに戻ります。

poweroff

Ctrl + ] でコンソールから抜けます。

ディスクブートでゲスト VM を起動

※ --cdrom でインストールした場合、ISO は自動でイジェクトされるため、そのまま起動できます。

bashvirsh domblklist alpine-guest

vda に alpine-disk.qcow2、sda は - (空)

sudo virsh start alpine-guest
virsh console alpine-guest

↓ の内容が出力されたら成功です!

Welcome to Alpine Linux 3.21
Kernel 6.12.89-0-virt on an x86_64 (/dev/ttyS0)

alpine-test login: root
Password:

alpine-test:~#

ゲスト VM 内から「VM-in-VM」を証明

OS とカーネル

shcat /etc/os-release
uname -a

OSとカナル情報を確認してみましょう。

PRETTY_NAME="Alpine Linux v3.21"
VERSION_ID=3.21.7

Linux alpine-test 6.12.89-0-virt #1-Alpine SMP PREEMPT_DYNAMIC ... x86_64 Linux

KVM 上で動いていることの決定的証拠

shdmesg | grep -iE 'kvm|virtualization|hypervisor' | head -5
[    0.000000] Hypervisor detected: KVM
[    0.000000] kvm-clock: Using msrs 4b564d01 and 4b564d00
...

Hypervisor detected: KVMが出力されたら「正常にKVM上で動くVM」てことです!

8-3. CPU 情報

shcat /proc/cpuinfo | grep -E 'model name|hypervisor' | head -5

を打つと

model name : Intel(R) Xeon(R) 6975P-C
flags : ... vmx ... hypervisor ...

m8i.largeのプロセッサは IntelのXeon 6975P-Cでしたね。
ゲストの中にもvmxが見えており、理論上は三重仮想化も可能ですね。


さいごに

本記事では「マネジメントコンソール経由 + Ubuntu + 伝統的な KVM / libvirt スタック + Alpine Linux」という構成で、AWS のネストされた仮想化アップデートを試してみました。

検索で上手く動かなかったので、参考になれば嬉しいです。

「ネストされた仮想化 = 高い検証コスト」というイメージが、
m8i.largeで気軽に試せるようになったので、KVM系の検証や勉強会用途に手を出すハードルが大きく下がりました。

「ちょっと KVM を試したい」という方は、ぜひ第 8 世代インスタンスで挑戦してみてください。
最後までお読みいただき、ありがとうございました。

参考資料

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事