[PR] 本記事にはプロモーションが含まれています。

【KVM】画面のないAlmaLinux 9にWindows 11の仮想マシンを作る|TPM・セキュアブートの設定からリモートデスクトップでつなぐまで

画面のないAlmaLinux 9のKVMにWindows 11の仮想マシンを作る記事のアイキャッチ。机の上の小さなサーバーの上に仮想マシンの画面が浮かび、ノートパソコンと点線でつながっているイラスト 仮想環境
➔ 自宅サーバー構築メモの目次はこちら

【2026年10月26日時点の情報です】

このブログは、自宅のKVMのホスト(AlmaLinux 9)の上の仮想マシンで動いています。データ復元ソフトをUSBメモリーで試すことになり、Windowsが要ったので、同じホストにWindows 11の仮想マシンを1台足しました。

ホストには画面がなく、操作は全部SSHのコマンドです。Windows 11はTPM 2.0とセキュアブートが要るので、これまでのAlmaLinuxのゲストとは作り方が少しちがいました。この記事では、実際に作った手順と、途中で出たエラーをまとめます。

KVMの入れ方は【KVM】AlmaLinux 9にKVMをインストールして仮想環境を作る、ブリッジの作り方は【KVM】ブリッジ接続をnmcliで設定する、virt-installの基本は【KVM】virt-installでゲストOSをインストールで紹介しています。

この記事に登場するホスト名、仮想マシンの名前、ユーザー名、IPアドレスなどは、セキュリティのため実際とは異なる架空のものに置き換えています。

今回の環境と、Windows 11に要るもの

No.項目内容
1ホストkvmhost(AlmaLinux 9、画面なし、Core i5-8500T、メモリー15GB)
2すでに動いている仮想マシンブログのサーバー(myserver、VNCは5900番)
3作る仮想マシンwin11-recovery(2コア、メモリー4GB、ディスク64GB)
4WindowsWindows 11 Pro(日本語のISO、プロダクトキーなし)
5画面を見る道具家のWindowsのパソコンのRealVNC Viewerと、リモートデスクトップ接続

Windows 11を入れるには、次のものがそろっている必要があります。

No.要るもの今回の用意
1CPU 2コア以上2コアを割り当て
2メモリー4GB以上4GBを割り当て(ブログの仮想マシンの分とは別に)
3ディスク64GB以上64GBのqcow2を作る
4TPM 2.0仮想のTPM(swtpm)
5UEFIとセキュアブートOVMF(edk2-ovmf)のセキュアブート用のファームウェア
6Windows 11のISO/var/lib/libvirt/images/ に置いておく

場面1:ホストの空きと、必要なソフトを確かめる

ここからのコマンドは、すべてKVMのホスト(kvmhost)で実行します。まず、何も変えないコマンドで、ホストの様子を見ました。

Bash
cat /etc/os-release | head -3
nproc
free -h
sudo virsh list --all
sudo virsh pool-list --all
df -h /var/lib/libvirt/images
rpm -q swtpm edk2-ovmf virt-manager
  • cat /etc/os-release | head -3:
    ホストのOSの名前と版を出す
  • nproc:
    CPUのコアの数を出す
  • free -h:
    メモリーの全体と、空いている量を出す
  • sudo virsh list –all:
    今ある仮想マシンの一覧を出す(止まっているものも)
  • sudo virsh pool-list –all:
    仮想マシンのディスクを置く場所(ストレージプール)の一覧を出す
  • df -h /var/lib/libvirt/images:
    仮想マシンのディスクを置く場所の、空いている量を出す
  • rpm -q swtpm edk2-ovmf virt-manager:
    仮想のTPM(swtpm)とUEFIのファームウェア(edk2-ovmf)が入っているかを見る

ホストのメモリーは15GBで、ブログの仮想マシンが動いている分を引くと、Windows 11に4GBを渡せる空きがありました。

場面2:前に作りかけた古いファイルを消す

/var/lib/libvirt/images/ を見ると、前に作りかけたWindows 11のディスク(win11-guest01.qcow2、65GB)と、もう使わない古いISOが2つ残っていました。仮想マシンの一覧には出ていないので、ディスクだけが残っていた形です。中の状態が分からないので、消して新しく作ることにしました。

消す前に、仮想マシンの一覧に出ていないこと(sudo virsh list --all)と、ブログの仮想マシンのディスクではないことを確かめてください。消したファイルは元に戻せません。

Bash
sudo rm /var/lib/libvirt/images/AlmaLinux-9-latest-x86_64-minimal.iso /var/lib/libvirt/images/Win11_25H2_Japanese_x64_v2.iso
sudo rm /var/lib/libvirt/images/win11-guest01.qcow2
ls -lh /var/lib/libvirt/images/
  • sudo rm …iso:
    使わない古いISOを2つ消す
  • sudo rm …/win11-guest01.qcow2:
    前に作りかけたWindows 11のディスクを消す
  • ls -lh /var/lib/libvirt/images/:
    残っているファイルを、大きさつきで出す

結果の例:

Plaintext
合計 47G
-rw-r--r--  1 devuser  devuser  8.4G 10月 21 16:16 Windows11_Client_x64_ja-jp_26300_9457.iso
-rw-------. 1 qemu     qemu      51G 10月 21 16:24 myserver.qcow2
-rw-r--r--  1 qemu     qemu     837M  8月 28 08:50 virtio-win.iso

myserver.qcow2がブログの仮想マシンのディスクです。今回使うWindows 11のISOと合わせて、3つが残れば大丈夫です。

場面3:Windows 11の設定と、セキュアブートのファイルがあるか確かめる

Bash
osinfo-query os | grep -i win11
ls /usr/share/edk2/ovmf/ | grep -i secboot
  • osinfo-query os | grep -i win11:
    virt-installがWindows 11を知っているかを見る。win11が出れば、Windows 11に合った設定を自動で選んでくれる
  • ls /usr/share/edk2/ovmf/ | grep -i secboot:
    セキュアブートの付いたUEFIのファイルがあるかを見る

結果の例:

Plaintext
** (osinfo-query:497661): WARNING **: 16:24:59.064: Entity http://pcisig.com/pci/1af4/1012 referenced but not defined
 win11                | Microsoft Windows 11                               | 11.0     | http://microsoft.com/win/11
OVMF.inteltdx.secboot.fd
OVMF_CODE.secboot.fd
OVMF_VARS.secboot.fd

win11と、OVMF_CODE.secboot.fd・OVMF_VARS.secboot.fdが出れば、そろっています。1行目のWARNINGは、気にしなくてよい注意の文です。

場面4:virt-installで仮想マシンを作る(1回目は5900番のエラー)

はじめは、画面を出すVNCの番号を5900にして実行しました。すると、次のエラーで止まりました。

Plaintext
ディスク 'win11-recovery.qcow2' を削除中
ERROR    内部エラー: ポート 5900 の予約に失敗しました

失敗すると、virt-installは作りかけのディスクを自分で消してくれます。5900番を何が使っているかを確かめました。

Bash
sudo ss -ltnp | grep ':59'
sudo virsh vncdisplay myserver
  • sudo ss -ltnp | grep ‘:59’:
    ホストで、5900番台の口で待ち受けているプログラムを出す
  • sudo virsh vncdisplay myserver:
    ブログの仮想マシンが、VNCのどの番号を使っているかを出す(:0なら5900番)

結果の例:

Plaintext
LISTEN 0      1            0.0.0.0:5900      0.0.0.0:*    users:(("qemu-kvm",pid=351232,fd=33))
:0

ブログの仮想マシンの画面が、もう5900番を使っていました。VNCの番号は仮想マシンごとに分ける必要があるので、Windows 11は5901番にします。

場面5:5901番で作り直す

Bash
sudo virt-install \
  --name win11-recovery \
  --memory 4096 \
  --vcpus 2 \
  --cpu host-passthrough \
  --machine q35 \
  --os-variant win11 \
  --boot loader=/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd,loader.readonly=yes,loader.type=pflash,loader.secure=yes,nvram.template=/usr/share/edk2/ovmf/OVMF_VARS.secboot.fd \
  --features smm.state=on \
  --tpm backend.type=emulator,backend.version=2.0,model=tpm-crb \
  --cdrom /var/lib/libvirt/images/Windows11_Client_x64_ja-jp_26300_9457.iso \
  --disk path=/var/lib/libvirt/images/win11-recovery.qcow2,size=64,format=qcow2,bus=sata \
  --network bridge=br0,model=e1000e \
  --graphics vnc,listen=127.0.0.1,port=5901 \
  --noautoconsole
  • –name win11-recovery:
    仮想マシンの名前
  • –memory 4096 / –vcpus 2:
    メモリー4GB、CPU 2コア。Windows 11のいちばん少ない条件
  • –cpu host-passthrough:
    ホストのCPUの機能を、そのまま仮想マシンに見せる。Windows 11のCPUの条件を通りやすくする
  • –machine q35 / –os-variant win11:
    新しい形の仮想のパソコン(q35)にして、Windows 11に合った設定を選ぶ
  • –boot loader=…secboot.fd,…:
    セキュアブートの付いたUEFIで起動する。nvram.templateは、仮想マシンごとのUEFIの設定のひな形
  • –features smm.state=on:
    セキュアブートに必要な機能(SMM)を有効にする
  • –tpm backend.type=emulator,backend.version=2.0,model=tpm-crb:
    swtpmで仮想のTPM 2.0を付ける
  • –cdrom …iso:
    Windows 11のISOから起動する
  • –disk …size=64,format=qcow2,bus=sata:
    64GBのディスクを作る。sataにすると、Windowsが最初からディスクを見つけられる(virtioだと、インストールの途中でドライバーを入れる手間が増える)
  • –network bridge=br0,model=e1000e:
    ブログの仮想マシンと同じbr0につなぐ。e1000eも、Windowsが最初から使える形
  • –graphics vnc,listen=127.0.0.1,port=5901:
    画面をVNCの5901番で出す。ホストの中(127.0.0.1)だけで待ち受ける
  • –noautoconsole:
    作ったあと、画面を自動で開かない(ホストに画面がないため)

結果の例:

Plaintext
インストールの開始中...
'win11-recovery.qcow2' を割り当てています                                                                  |  64 GB  00:00:01
ドメインを作成中...                                                                                       |         00:00:00

ドメインは動作中です。インストールが続いているものと思われます。
インストール処理を完了するため、コンソールに接続することができます。

「ドメインは動作中です」と出れば、仮想マシンができて、ISOから起動し始めています。

調べている途中で、ブログの仮想マシンの画面が0.0.0.0:5900、つまり家のLANのどのパソコンからもパスワードなしでつなげる状態だったことにも気づきました。あとで、ホストの中(127.0.0.1)だけで待ち受けるように直しています。

場面6:SSHのトンネルを通して、VNCで画面を見る

VNCはホストの中(127.0.0.1)だけで待ち受けているので、家のパソコンからは、SSHのトンネルを通して見ます。家のWindowsのパソコンのPowerShellで実行します。この画面は、インストールが終わるまで開いたままにしておきます。

PowerShell
ssh -L 5901:127.0.0.1:5901 devuser@192.168.0.10
  • ssh … devuser@192.168.0.10:
    ホスト(kvmhost)にSSHでつなぐ。ユーザー名とIPアドレスは、自分のものに替える
  • -L 5901:127.0.0.1:5901:
    家のパソコンの5901番の口を、SSHを通して、ホストの中の5901番(仮想マシンの画面)につなぐ

つながったら、RealVNC Viewerで「localhost:5901」を開きます。

RealVNC Viewerでlocalhost:5901に接続する画面

場面7:Press any keyに間に合わず、UEFIの画面に入った

WindowsのISOから起動すると、最初に「Press any key to boot from CD or DVD…」と出て、数秒で消えます。VNCを開くまでに時間がかかり、間に合いませんでした。そのままUEFIの設定画面に入ってしまいました。

Press any keyに間に合わず開いた仮想マシンのUEFIの設定画面

この画面では、「Boot Manager」を選び、DVD-ROMを選んで起動すると、ISOから起動し直せます。今度は「Press any key」が出たら、すぐに何かキーを押します。

ほかのやり方として、ホストで次を実行して仮想マシンを再起動し、すぐにキーを押す方法もあります。

Bash
sudo virsh reset win11-recovery
  • sudo virsh reset win11-recovery:
    仮想マシンを、すぐに再起動する(電源ボタンでの再起動と同じ)。インストール前なので、何も壊れない

キーが間に合うと、Windows 11のセットアップが始まります。あとは、ふつうのパソコンに入れるときと同じ流れです。プロダクトキーの画面は「プロダクト キーがありません」で進め、エディションはWindows 11 Proを選びました。

Windows 11セットアップの言語設定を選択する画面

場面8:インストールの途中の再起動で、仮想マシンが止まった

ファイルのコピーが終わって1回目の再起動のところで、VNCの接続が切れ、つなぎ直そうとすると「Connection refused」になりました。

インストール中の再起動でVNCの接続が切れたときのエラー

ホストで仮想マシンの一覧を見ると、win11-recoveryが止まっていました。–noautoconsoleで作ったときは、インストールの途中の再起動で仮想マシンが止まることがあります。起動し直せば、続きから進みます。

Bash
sudo virsh start win11-recovery
sudo virsh list --all
  • sudo virsh start win11-recovery:
    止まった仮想マシンを起動する
  • sudo virsh list –all:
    仮想マシンの一覧を出す。win11-recoveryが「実行中」になっていれば大丈夫

起動し直したら、もう一度RealVNC Viewerで「localhost:5901」につなぎます。

場面9:初期設定をローカルアカウントで進める

検証用の仮想マシンなので、Microsoftアカウントではなく、ローカルアカウントで使うことにしました。初期設定の最初の「国または地域を選択してください」の画面で、Shift+F10を押すと、コマンドプロンプトが開きます。

Windows 11の初期設定の国または地域を選択する画面

コマンドプロンプトで、次を入力してEnterを押します。

Plaintext
start ms-cxh:localonly
  • start ms-cxh:localonly:
    ローカルアカウントを作る画面を開く。ここでユーザー名とパスワードを決める

ここで1つつまずきました。初期設定の画面では、キーボードが英語の並びになっていて、「:」がいつもの場所で打てませんでした。英語の並びでは、「:」はShift+「;」(日本語キーボードの「れ」のキー)で打てます。

Windowsが起動したあとに設定を見ると、キーボードは最初から「日本語キーボード(106/109キー)」になっていました。英語の並びになるのは、初期設定の画面のあいだだけのようです。

日本語キーボード(106/109キー)になっているWindows 11のキーボードの設定
Windows 11のキーボードレイアウトの変更画面

場面10:リモートデスクトップでつなぐ

VNCは、毎回SSHのトンネルを作る手間があります。Windows 11はProなので、リモートデスクトップでつなぐことにしました。仮想マシンはブリッジ(br0)につないだので、家のLANの1台としてIPアドレスをもらっています。

  1. 仮想マシンのWindowsで、「設定」→「システム」→「リモート デスクトップ」をオンにする
  2. 仮想マシンのWindowsで、ターミナルを開いてipconfigを実行し、IPv4アドレス(例:192.168.0.20)を見る
  3. 家のパソコンで「リモート デスクトップ接続」(スタートでmstscと入力すると出る)を開き、「コンピューター」にそのIPアドレスを入れて「接続」
  4. ユーザー名は.\作ったローカルアカウントの名前、パスワードはそのアカウントのものを入れる
  • .\(ユーザー名の頭):
    「このパソコンの中のアカウント」という意味。付けないと、家のパソコンや Microsoft アカウントのほうと取りちがえることがある

私の場合は、前に同じIPアドレスにつないだときのMicrosoftアカウントの資格情報が家のパソコンに残っていて、そのままではちがうユーザー名でつなごうとしました。接続の画面で保存されている資格情報を「削除」してから、ローカルアカウントで入り直すと、つながりました。

IPアドレスはルーターが自動で割り当てる形(DHCP)なので、変わることがあります。つながらなくなったときは、VNCでつないでipconfigで調べ直します。

つながったら、Windows Updateを済ませて、準備はおしまいです。

場面11:ふだんの使い方(使うときだけ起動する)

ホストのメモリーは15GBで、ブログの仮想マシンも動いています。Windows 11を動かすと、qemu-kvmのCPUが200%前後になり、スワップも増えました。そこで、自動起動はせず、使うときだけ起動しています。

Bash
sudo virsh start win11-recovery
sudo virsh list --all
  • sudo virsh start win11-recovery:
    Windows 11の仮想マシンを起動する
  • sudo virsh list –all:
    win11-recoveryが「実行中」になったかを見る

使い終わったら、止めます。

Bash
sudo virsh shutdown win11-recovery
sudo virsh list --all
  • sudo virsh shutdown win11-recovery:
    仮想マシンのWindowsに「シャットダウンして」と伝える(スタートメニューからシャットダウンするのと同じ)
  • sudo virsh list –all:
    win11-recoveryが「シャットオフ」になれば止まっている。すぐには止まらないので、1分ほど待ってからもう一度見る

同じホストでブログの仮想マシン(myserver)も動いているので、startやshutdownのときは、仮想マシンの名前をまちがえないようにします。

まとめ

画面のないAlmaLinux 9のKVMでも、virt-installに仮想のTPM 2.0とセキュアブートのUEFIを指定すれば、Windows 11の仮想マシンを作れました。つまずいたのは、次の4つです。

No.つまずいたことどうしたか
1VNCの5900番が、ほかの仮想マシンで使われていた5901番にして作り直した
2Press any keyに間に合わず、UEFIの画面に入ったBoot ManagerでDVD-ROMを選んで起動し直した
3インストールの途中の再起動で、仮想マシンが止まったsudo virsh startで起動し直した
4初期設定の画面で「:」が打てなかった英語の並びのShift+「;」で打った

この仮想マシンにUSBメモリーをつないで、WonderFox Soft社のデータ復元ソフト「RecoveryFox AI」の検証に使いました。結果は【PR】データ復元ソフト RecoveryFox AI を USB メモリーで試した|消したファイル・フォーマットのあとはどこまで戻る?無料の PhotoRec とも比較にまとめています。

コメント