AWS EC2 仮想インスタンスでネステッド仮想化(Nested Virtualization)を有効化して、KVM で VM を作ってみた
はじめに
こんにちは、クラスメソッドのチェです。
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:RunInstances、ec2:DescribeInstancesなど
- SSH接続用のキーペア
- セキュリティグループ(SSH ポート 22 のインバウンド許可)
m8i.large を 1〜2 時間使う前提で $0.30 程度 を見込んでおけば十分です。ネストされた仮想化機能自体には追加料金は発生しません。
やってみた
キーペアの作成
まずはSSH接続に使うキーペアを作成します。
EC2ダッシュボード → 左メニュー 「ネットワーク & セキュリティ」 → 「キーペア」 → 「キーペアを作成」をクリック

私はMacですのでpemを選択しましたが、Windowsユーザでしたらppkを選択して作成してください!
セキュリティグループの作成
SSH(22)だけを「マイIP」から許可するシンプルなセキュリティグループを作ります。
EC2ダッシュボード → 左メニュー 「ネットワーク & セキュリティ」 → 「セキュリティグループ」 → 「セキュリティグループを作成」をクリックして作成してください。


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

ネストされた仮想化有効のEC2インスタンスを起動
EC2ダッシュボード → 「インスタンスを起動」をクリックしてください。

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

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

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


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

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 世代インスタンスで挑戦してみてください。
最後までお読みいただき、ありがとうございました。






