Cisco CMLで動作するWindows11イメージを作成する
Cisco CMLは検証に便利なプラットフォームです。標準でもCisco製品イメージだけでなく、Linuxなどの「非Ciscoイメージ」が同梱されています。
- Ciscoイメージ
- ASAv
- CAT 8000V
- CAT 9000v (beta VM image)
- CSR 1000v
- FMCv
- FTDv
- IOL
- IOL-L2
- IOL (Serial)
- IOSv
- IOSvL2
- IOS XRv 9000
- NX OS 9000
- Catalyst SD-WAN (including Manager, Controller, Validator, vEdge, and Cisco Edge)
- Catalyst 9800-CL
- 非Ciscoイメージ
- Server(Tiny Core Linux)
- Alpine (Alpine Linux)
- Desktop (Alpine Linux)
- Ubuntu (Ubuntu Linux)
- Trex (Alpine Linux)
ただ、検証を実施していると「どうしてもWindowsを利用したい」という場合があると思います。Alexander Viftrup AndersenさんがHow To Create a Windows 11 Node for Cisco CMLという記事で「CML上で動作するWindows11イメージを作成する方法」を公開されていますので、今回はこの記事を参考にCML上で動作するWindows11イメージを作成してみます。
Alexanderさんの元記事では「作業を簡易化するスクリプト」も公開されており、そちらも参考にさせて頂きました。素晴らしい記事を公開してくださり、また「日本語の記事を作成する」ことも快諾してくださったAlexanderさんに感謝します。Thank you, Alexander!
検証環境¶
| 対象 | バージョン |
|---|---|
| Cisco CML | 2.9.1 |
Windows 11の必要スペック¶
Windows 11で必要なスペックはWindows 11 の仕様、機能、コンピューターの要件を確認するに記載されています。主要な項目を以下に抜粋します。
| 項目 | 値 |
|---|---|
| プロセッサ | 1 ギガヘルツ (GHz) 以上で 2 コア以上の64 ビット互換プロセッサまたは System on a Chip (SoC)。 |
| メモリ | 4 ギガバイト (GB) |
| ストレージ | 64 GB 以上の記憶装置。詳しくは「Windows 11 を最新状態に保つための空き領域の詳細」をご覧ください。 |
| システム ファームウェア | UEFI、セキュア ブート対応。お使いの PC がこの要件を満たすようにする方法については、こちらをご覧ください。 |
| TPM | トラステッド プラットフォーム モジュール (TPM) バージョン 2.0。お使いの PC がこの要件を満たすようにする方法については、こちらをご覧ください。 |
作業用Ubuntu仮想マシンを作成する¶
ESXi上に作業用Ubuntu24.04仮想マシンを作成します。今回は以下のスペックとしました。
| 項目 | 値 |
|---|---|
| CPU | 16コア |
| メモリ | 64GB |
| ディスク | 200GB |
仮想マシンの設定でHardware virtualizationを有効にしておきます。

必要ソフトウェアのインストール¶
作業用Ubuntu仮想マシンに必要となるソフトウェアをインストールしていきます。まずインストール可能なソフトウェアの一覧を更新します。
apt update
必要なソフトウェアをインストールします。guestfs-toolsは最後に作成したディスクイメージのサイズを縮小する際に利用します。
apt install -y guestfs-tools ovmf qemu-system-x86 swtpm
KVMが利用可能であることを確認する¶
作業用Ubuntu仮想マシンでkvm-okを実行し、KVMが利用可能であることを確認します。
kvm-ok
以下のように表示されれば問題ありません。もし「KVMは利用できない」旨が表示された場合は仮想マシンのHardware virtualization設定などを見直します。
# kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
必要ソフトウェアのダウンロード¶
Ubuntu上にWindows11の評価版ISOファイルとVirtio Driver ISOファイルをダウンロードし、作業用Ubuntu仮想マシン上に保存します。
| 項目 | ファイル名 |
|---|---|
| Windows11評価版(英語) | 26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso |
| Windows11評価版(日本語) | 26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_ja-jp.iso |
| Virtio Driver | virtio-win-0.1.285.iso |
Windows11仮想マシン作成用スクリプト¶
Alexanderさんが作成した「Windows11仮想マシン作成用のスクリプト」は以下です。
事前にダウンロードしたWindows 11評価版ISOファイルとVirtio Driver ISOファイルの名前にあわせて若干修正したものが以下です。このスクリプトも作業用仮想マシン上に保存します。
| win11.sh | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | |
Windows11日本語版用のスクリプト
日本語版のWindows11評価版を利用する場合は以下のように5行目で指定しているISOファイルの名前を変更します。
#!/bin/bash
set -e
# === Configurable variables ===
ISO="26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_ja-jp.iso"
VIRTIO_ISO="virtio-win-0.1.285.iso"
MEMORY="8G"
CPUS=4
# === no change needed ===
DISK="win11.qcow2"
DISK_SIZE="64G"
TPM_DIR="tpm-win11"
TPM_LOCK_FILE="$TPM_DIR/swtpm.lock"
OVMF_CODE="/usr/share/OVMF/OVMF_CODE_4M.ms.fd"
OVMF_VARS="OVMF_VARS_WIN11.fd"
CPU_FLAGS="Westmere,-waitpkg,-hle,-rtm,-mpx"
# === Create disk if it doesn't exist ===
if [ ! -f "$DISK" ]; then
echo "Creating disk image..."
qemu-img create -f qcow2 "$DISK" "$DISK_SIZE"
fi
# === Create writable OVMF_VARS copy ===
if [ ! -f "$OVMF_VARS" ]; then
echo "Copying OVMF_VARS template..."
cp /usr/share/OVMF/OVMF_VARS_4M.ms.fd "$OVMF_VARS"
fi
# === Setup TPM emulator ===
mkdir -p "$TPM_DIR"
if [ ! -f "$TPM_LOCK_FILE" ]; then
swtpm socket --tpm2 --ctrl type=unixio,path=$TPM_DIR/swtpm-sock \
--tpmstate dir=$TPM_DIR --daemon --log level=2
fi
# === configure the network interface ===
# (
# sleep 5
# echo -e "press return to allow network (may need to auth): "
# read
# echo "network config"
# sudo ip link set dev tap0 master virbr0
# sudo ip link set dev tap0 up
# ) &
# === Launch VM ===
sudo /usr/bin/qemu-system-x86_64 \
-name windows11 \
-machine type=q35,accel=kvm \
-cpu $CPU_FLAGS \
-smp $CPUS \
-m $MEMORY \
-drive if=pflash,format=raw,readonly=on,file="$OVMF_CODE" \
-drive if=pflash,format=raw,file="$OVMF_VARS" \
-drive file="$DISK",format=qcow2,if=none,id=disk0 \
-device virtio-blk-pci,drive=disk0,bootindex=2 \
-drive file="$ISO",media=cdrom,if=none,id=cdrom0 \
-device ide-cd,drive=cdrom0,bootindex=1 \
-drive file="$VIRTIO_ISO",media=cdrom,if=none,id=cdrom1 \
-device ide-cd,drive=cdrom1,bus=ide.1 \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=net0 \
-chardev socket,id=chrtpm,path=$TPM_DIR/swtpm-sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0 \
-serial file:win11-serial.log \
-device qemu-xhci \
-device usb-tablet \
-device qxl-vga,ram_size=134217728,vram_size=67108864,vgamem_mb=64 \
-vnc :1
ここまでの手順を実行した結果、作業用Ubuntu仮想マシン上の同じディレクトリに以下3つのファイルが保存されているはずです。
26200.6584.250915-1905.25h2_ge_release_svc_refresh_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.isovirtio-win-0.1.285.isowin11.sh
シェル上から以下を実行し、Windows11仮想マシン作成用スクリプトを開始します。これでWindows11仮想マシンイメージが作成・起動されます。
sh win11.sh
Windows11仮想マシンへVNC接続する¶
インストール作業を進める為にWindows11仮想マシンへVNC接続します。今回はTigerVNCを使用しました。作業用Ubuntu仮想マシンのアドレスのTCP/5901に対してVNC接続します。

Windows11のインストール¶
ここからWindows11のインストールを進めていきます。尚、最終的には以下3つのドライバーをインストールします。No.1と2はインストーラ実行中にインストールします。ただ、No.3をインストールすると画面がブラックアウトしてしまい、操作できなくなってしまいました… Windows11のインストール完了後であれば問題なかった為、No.3のインストールはOSインストールが完了した後で実行します。
| NO. | ドライバー名 | ファイルパス | インストーラからインストールするか? |
|---|---|---|---|
| 1 | Red Hat VirtIO SCSI Controller | D:\viostor\w11\amd64 |
はい |
| 2 | Red Hat VirtIO Ethernet Adapter | D:\NetKVM\w11\amd64 |
はい |
| 3 | Red Hat QXL controller | D:\qxldod\win10\amd64 |
いいえ |
Step.1¶
VNCの画面にPress any key to continueと表示されたら任意のキーを押します。

Step.2¶
Nextをクリックします。

Step.3¶
Nextをクリックします。

Step.4¶
I agree everything will be deleted including files, apps, and settingsにチェックを入れ、Nextをクリックします。

Step.5¶
Acceptをクリックします。

Step.6¶
Load Driverをクリックします。

Step.7¶
Browseをクリックします。

Step.8¶
Virtio Driver ISOイメージはDドライブとしてマウントされています。D:\viostor\w11\amd64ディレクトリを選択し、OKをクリックします。

Step.9¶
Red Hat VirtIO SCSI Controllerを選択してInstallをクリックします。

Step.10¶
次はRed Hat VirtIO Ethernet Adapterをインストールします。再度、Load Driverをクリックし、インストールパスとしてD:\NetKVM\w11\amd64を選択します。

Step.11¶
Installをクリックします。

Step.12¶
Installをクリックします。

Step.13¶
Installをクリックします。これでWindowsのインストールが開始されます。

Step.14¶
インストールが完了するまでしばらく待機します。今回の作業環境では20分ほどで自動的に再起動されました。

Step.15¶
再起動後はしばらく以下のような画面が表示されました。引き続き待機します。5分ほどで再度、再起動されました。

Step.16¶
再起動後にスプラッシュスクリーンが表示された後、以下の画面が表示されました。YESをクリックします。

Step.17¶
Yesをクリックします。

Step.18¶
Yesをクリックします。

Step.19¶
ネットワークを設定してインターネットから最新のアップデートを取得するか、確認されます。ここは一旦、I don't have internetをクリックして進めます。

Step.20¶
Windowsへログインするユーザ名を指定します。今回はadminにしました。入力が完了したらNextをクリックします。

Step.21¶
パスワードを指定します。入力が完了したらNextをクリックします。

Step.22¶
確認用に同じパスワードを入力します。入力が完了したらNextをクリックします。

Step.23¶
パスワードを忘れてしまった際、リカバリーに利用する秘密の質問と回答を設定します。Security questionをクリックします。

Step.24¶
任意の質問をクリックします。

Step.25¶
任意の回答を入力し、Nextをクリックします。これを3回繰り返します。

Step.26¶
プライバシー設定を行います。検証用のイメージを作成する為、全ての項目からチェックを外します。Acceptをクリックします。


Step.27¶
いよいよ大詰めです。インストールが完了するまで、もう少し待機します。

Step.28¶
Windows11のデスクトップが表示されました。これでインストールは完了です。

背景を単一色に変更する¶
Step.1¶
Settings > PersonalizationからBackgroundをクリックします。

Step.2¶
Personalize your backgroundをクリックします。

Step.3¶
表示されたメニューからSolid colorをクリックします。

Step.4¶
任意の色をクリックします。

電源設定¶
検証用の仮想マシンなのでスクリーンセーバーや無操作時にスタンバイへ移行しないように電源設定を行います。
Step.1¶
Settings > System > Powerをクリックします。

Step.2¶
今回は以下を設定します。
Energy recommencationsScreen, sleep, & hibernate timeouts
まず「1. Energy recommencations」から設定します。

Step.3¶
Turn off my screen saverが選択されていることを確認します。私の環境ではデフォルトでこの設定になっていました。もし異なる場合は変更します。

Step.4¶
「2. Screen, sleep, & hibernate timeouts」でTurn my screen off afterをNeverに設定します。

ディスプレイアダプタドライバーのインストール¶
デフォルトの状態だとディスプレイアダプタドライバーとしてMicrosoftの標準ドライバーがインストールされています。これをVirtIOのドライバーに置き換えます。
Step.1¶
デバイスマネージャを起動します。スタートメニューを右クリックし、表示されたメニューからDevice Managerをクリックするのが簡単です。

Step.2¶
Display adaptersの項目を展開し、Microsoft Basic Display Adapterを右クリックします。

Step.3¶
表示されたメニューからUpdate driverをクリックします。

Step.4¶
Browse my computer for driversをクリックします。

Step.5¶
Browseをクリックします。

Step.6¶
D:\qxldod\win10\amd64を選択し、OKをクリックします。今回、利用しているVirtIO Driver ISOファイルには「win11」というフォルダが含まれていないため、「win10」のフォルダを指定する点に注意します。

Step.7¶
Nextをクリックします。

Step.8¶
Closeをクリックします。

Step.9¶
これでディスプレイアダプタードライバーがインストールされました。

自動アップデートの無効化¶
自動アップデートを無効化しておきます。設定はローカルグループポリシーエディタから行います。
Step.1¶
検索窓に「gpedit」と入力し、表示されたEdit group policyをクリックします。

Step.2¶
ローカルグループポリシーエディタが起動してきます。Computer Configuration > Administrative Templates > Windows Components > Windows Update > Manage end user experienceの順で選択し、Configure Automatic Updatesをダブルクリックします。

Step.3¶
デフォルトは未構成
デフォルトではEnabledになっている為、これをDisabledへ変更し、OKをクリックします。

Step.4¶
これで自動アップデートは無効化されました。

「ノードの起動完了」をCMLへ通知するタスクの作成¶
Windows11をCML上で起動した際に「Windows11が起動完了したこと」をCMLへ通知する為にCOMポートへ指定文字列を出力するタスクを作成します。Start > All > Windows Tools > Task Schedulerの順にクリックし、タスクスケジューラを起動します。
Step.1¶
Create Taskをクリックします。

Step.2¶
以下のように設定します。Nameは任意で構いませんが、今回は「READY」としました。設定が完了したらOKをクリックします。
| 項目 | 値 |
|---|---|
| Name | READY |
| Run whether user is logged on or not | チェックする |
| Do not store password. The task will only have access to local computer resource. | チェックする |

Step.3¶
Triggersタブを選択し、Newをクリックします。

Step.4¶
以下のように設定します。設定が完了したらOKをクリックします。
| 項目 | 値 |
|---|---|
| Begin the task | At startup |
| Delay task for: | 30 seconds |

Step.5¶
Actionsタブを選択し、Newをクリックします。

Step.6¶
以下のように設定します。設定が完了したらOKをクリックします。
| 項目 | 値 |
|---|---|
| Action | Start a program |
| Program/script: | C:¥Windows¥System32¥cmd.exe |
| Add arguments (optional): | /c "echo READY > COM1" |

Step.7¶
OKをクリックします。

Step.8¶
これで設定完了です。作成したタスクはTask Scheduler Library配下に作成されています。

BitLockerの無効化¶
後の手順でqcow2イメージの圧縮を行い、ファイルサイズを縮小します。BitLockerが有効になっているとエラーとなってしまい、圧縮ができません。その為、予めBitLockerを無効化しておきます。BitLockerの無効化にはWindows標準コマンドであるmanage-bdeを利用します。
Step.1¶
「command」というキーワードで検索するとコマンドプロンプトが表示されます。manage-bdeの実行には管理者権限が必要になる為、Run as administratorをクリックします。

Step.2¶
Yesをクリックします。

Step.3¶
以下を実行し、BitLockerの無効化を開始します。
manage-bde -off C:

Step.4¶
BitLockerの無効化が開始されます。完了するまでしばらく時間がかかりますので、しばらく待機します。

Step.5¶
進捗を確認したい場合は以下を実行します。以下の例からは「まだ無効化処理の途中」ということが分かります。
manage-bde -status

Step.6¶
以下のように「Fully Decrypted」と表示されればBitLockerの無効化は完了です。

Windowsのシャットダウン¶
ここまでの作業が終了したらWindowsをシャットダウンします。
qcow2イメージの圧縮¶
作成直後のqcow2イメージはかなりサイズが大きいです。そこで、virt-sparsifyコマンドを実行し、イメージのサイズを縮小します。大凡ですが、今回の作業前後でqcow2イメージのファイルサイズは以下でした。
| 対象 | 圧縮前 | 圧縮後 |
|---|---|---|
| Windows11 英語版 | 17G | 14G |
| Windows11 日本語版 | 18G | 14G |
以下を実行して「win11.qcow2」ファイルを圧縮し、圧縮後のファイルを「win11_en-us_26100-240331-1435.qcow2」というファイル名で保存します。
virt-sparsify --compress win11.qcow2 win11_en-us_26100-240331-1435.qcow2
Windows11日本語版を圧縮する場合
Windows11日本語版の場合は圧縮後のファイル名を「ja-jp」としました。
virt-sparsify --compress win11.qcow2 win11_ja-jp_26100-240331-1435.qcow2
実際の実行例は以下の通りです。今回の作業環境では、圧縮に10分程度かかりました。
# virt-sparsify --compress win11.qcow2 win11_en-us_26100-240331-1435.qcow2
[ 0.0] Create overlay file in /tmp to protect source disk
[ 0.1] Examine source disk
[ 2.6] Fill free space in /dev/sda1 with zero
virt-sparsify: Skipping /dev/sda3, as it is a read-only device.
virt-sparsify: Skipping /dev/sda4, as it is a read-only device.
[ 3.2] Copy to destination and make sparse
[ 519.3] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.
BitLockerが有効化されているとエラーになる
BitLockerが有効化されている圧縮作業中に「Enter key or passphrase ("/dev/sda3"):」と表示されてしまい、作業を進めることができません。その為、Windows11インストール完了後にqcow2イメージを圧縮する場合は事前にBitLockerを無効化しておく必要があります。
# virt-sparsify --compress win11.qcow2 win11-26100-240331-1435.qcow2
[ 0.1] Create overlay file in /tmp to protect source disk
[ 0.1] Examine source disk
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ --:--
Enter key or passphrase ("/dev/sda3"):
virt-sparsify: could not find key to open LUKS encrypted /dev/sda3.
Try using --key on the command line.
Original error: cryptsetup_open: cryptsetup exited with status 1: BITLK devices with type 'encrypt-on-write' cannot be activated. (0)
CML用の定義ファイル¶
CML用のノード・イメージ定義ファイル例は以下の通りです。
ノード定義¶
4〜5行目の定義によってCOM1ポートへ「READY」が表示されたらCMLとしては起動完了とみなします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | |
イメージ定義¶
1 2 3 4 5 6 7 | |
Windows11日本語版用のイメージ定義
id: win11_ja-jp_26100-240331-1435
label: Windows 11 ja-jp (26100.240331-1435)
description: Windows 11 ja-jp (26100.240331-1435)
node_definition_id: win11
disk_image: win11_ja-jp_26100-240331-1435.qcow2
read_only: false
schema_version: 0.0.1
CML上でWindows11を起動する¶
CML上で実際に起動してみるとWindows11が立ち上がってきました!
