はじめに
自宅サーバ(Ubuntu)上で、Proxmox のような「全部入りハイパーバイザ」を入れずに、できるだけミニマルな構成で
- Web UI から VM を操作したい
- Windows 11 をデスクトップ用途で使える VM として常用したい
という目的で環境を構築したときの手順メモ。
ポイントは次の 3 つ。
- Ubuntu そのままの上に KVM + libvirt を載せる
- 管理用 Web UI として Cockpit(cockpit-machines) を使う
- Windows 11 の要件を満たすために UEFI + vTPM 2.0 をきちんと用意する
この記事は、試行錯誤でハマった部分は省き、「未来の自分が見てすぐ再現できる」ことを狙って整理している。
前提環境
- ホスト OS:Ubuntu Server 24.04 LTS (noble)
- 仮想化支援:x86_64 CPU(KVM 対応 / VT-x / AMD-V 有効)
- ネットワーク:
systemd-networkd+ netplan(NetworkManager には切り替えない前提) - 目的の VM:
- 作業用 Windows 11(デスクトップ用途)
ここでは、作業用 Windows 11 VM(以降 columbia)を作るところまでを対象とする。
仮想化基盤(KVM / libvirt)と Cockpit の導入
1. 仮想化スタックのインストール
まずは KVM / libvirt / virt-install / OVMF / swtpm を入れる。
sudo apt update
# 仮想化基盤(KVM + libvirt)+ UEFI(OVMF) + vTPM(Windows 11 等向け)
sudo apt install -y \
qemu-kvm libvirt-daemon-system libvirt-clients virtinst \
ovmf swtpm swtpm-tools libtpms0
ポイント:
qemu-kvmを指定しているが、Ubuntu 24.04 では裏でqemu-system-x86が選択される。ovmfは UEFI ファームウェア(OVMF)を提供するパッケージ。swtpm+libtpms0は vTPM 2.0 のエミュレータ。Windows 11 の TPM 要件を満たすために必須。
2. Cockpit と主要アドオンのインストール
Cockpit 本体と、VM 管理に必要なアドオンを backports から入れる。
. /etc/os-release
sudo apt install -y -t ${VERSION_CODENAME}-backports \
cockpit cockpit-machines cockpit-storaged cockpit-networkmanager
cockpit-machines… VM 管理 UI(libvirt のフロントエンド)cockpit-storaged… ストレージ状態の確認・操作cockpit-networkmanager… NetworkManager を使う場合のネットワーク管理 UI
(今回はsystemd-networkd続投なので、編集機能はあまり使わず、主に状態確認に留める)
3. サービスの有効化
libvirtd は常駐、Cockpit はソケット起動にする。
sudo systemctl enable --now libvirtd cockpit.socket
ファイアウォールに UFW を使っている場合は 9090 番を開けておく。
sudo ufw allow 9090/tcp
4. libvirt グループへの追加
非 root で VM を扱えるように、自分のユーザーを libvirt グループへ。
sudo usermod -aG libvirt $USER
いったんログアウト/ログインし直し、groups で libvirt が含まれていることを確認する。
Windows 11 ISO とストレージの整理
1. ISO 用ディレクトリを用意
qemu:///system の VM は libvirt-qemu ユーザーで動くため、通常ユーザーのホームディレクトリにある ISO はそのままでは読めない。
インストールメディアは libvirt 管理下のディレクトリに置くのが安全。
sudo mkdir -p /var/lib/libvirt/iso
ここに Windows 11 の ISO を配置する。例:
# 手元の PC からサーバへコピーする例(IP は適宜変更)
scp Win11_24H2_Japanese_x64.iso \
ctrluser@192.168.100.31:/var/lib/libvirt/iso/
sudo chown root:root /var/lib/libvirt/iso/Win11_24H2_Japanese_x64.iso
sudo chmod 644 /var/lib/libvirt/iso/Win11_24H2_Japanese_x64.iso
OS ディスク(qcow2)は、デフォルトの /var/lib/libvirt/images に作成する方針とする。
Cockpit へのアクセス
ブラウザから以下にアクセス。
https://<サーバIP>:9090/(例:https://192.168.100.31:9090/)
自己署名証明書の警告は許可する。
Ubuntu のユーザー(例:ctrluser)でログインしておく。
左側メニューの「Virtual Machines(仮想マシン)」を開くと、libvirt の System インスタンス(qemu:///system)が見えるようになる。
Windows 11 VM(columbia)の作成
1. 新規作成ウィザード
Cockpit の「Virtual Machines」画面で「Create new virtual machine」をクリックし、以下のように設定する。
- Name:
columbia(小文字で統一) - Connection:System
(qemu:///system:サーバ側で常時管理される VM 群) - Installation source / Type:
→ Local install media (ISO image) のような「ローカルインストールメディア」系を選ぶ
(※「OS をダウンロード」は Windows が出てこないので使わない) - Operating system:
Windows 11が候補に出ればそれを選択- 出ない場合は
Windows 10かGeneric Windowsなど近いものを選んでおけばよい
- Disk:
- Format:
qcow2(デフォルト) - Size:128 GiB(論理サイズ。qcow2 なので実際には使用量に応じて増える)
- Format:
- Memory:16 GiB(作業用の Windows として余裕を持たせる)
- vCPU:詳細設定から 4 vCPU にする
重要:
ウィザードの最後で 「Create and edit」(作成して編集する) を選び、
作成直後に詳細画面へ入れるようにしておく。
VM 設定のカスタマイズ(UEFI / TPM / デバイス)
2.1 ファームウェアを UEFI にする
columbia の概要タブで、「Firmware」が UEFI になっていることを確認する。
もし BIOS になっていれば UEFI に変更する。
OVMF のエントリが複数ある場合は、可能なら Secure Boot 付きのものを選ぶ。
例:
UEFI x86_64: /usr/share/OVMF/OVMF_CODE.secboot.fd ...
が選べるならこれを使う。
2.2 TPM 2.0(vTPM)の設定
ovmf + swtpm を入れておけば、libvirt は vTPM 2.0 を扱える。
Cockpit に TPM 追加 UI がない場合でも、libvirt の XML に直接書けばよい。
定義を編集:
sudo virsh edit columbia
<devices> ... </devices> ブロック内に、以下のような <tpm> ブロックがあることを確認する。無ければ追加する。
<tpm model='tpm-crb'>
<backend type='emulator' version='2.0'/>
</tpm>
model='tpm-crb'は TPM 2.0 向けのインターフェースbackend type='emulator' version='2.0'でswtpmを使う vTPM 2.0 になる
保存に成功すれば、その VM には TPM 2.0 デバイスが追加された状態になる。
2.3 ディスクと NIC の設定方針
初回インストールをスムーズに行うことを優先し、
- システムディスク:バス
sataのまま - NIC:モデル
e1000eのまま
で進める。
どちらも Windows 標準ドライバで認識されるので、追加ドライバなしでインストーラが動く。
(後から virtio ドライバを入れてディスク/NIC を virtio 化することは可能。この記事ではそこまでは扱わない。)
2.4 Windows 11 ISO を CD-ROM として割り当て
Cockpit の columbia 詳細画面で、「Disks」タブから CD-ROM デバイスを確認・設定する。
- 既にインストール元として ISO が設定されていれば、そのままでもよい。
- 設定されていない/パスが古い場合は、一度削除し、改めて追加する:
- 「Add disk」→
CD-ROMを選び、 - Source ファイルとして
/var/lib/libvirt/iso/Win11_24H2_Japanese_x64.iso
を指定する。
- 「Add disk」→
これで、VM 起動時に DVD として Windows 11 インストーラがマウントされる。
Windows 11 のインストール
3.1 起動と「Press any key…」への対応
columbia が Shut off 状態であることを確認し、Cockpit から「Install」または「Start」を押す。
- 直後にコンソールタブ(グラフィカルコンソール)を開き、
コンソール内をクリックしてフォーカスを合わせておく。 - 起動直後、画面下部に
Press any key to boot from CD or DVD......が一瞬表示されるので、すぐに Enter などを押す。
ここでキー入力が間に合わないと DVD ブートがスキップされ、
BdsDxe: No bootable option or device was found.
等と表示されてしまう。
その場合は一度シャットダウンして再度起動し、今度はメッセージが出た瞬間に Enter を押す。
3.2 インストーラの基本的な流れ
あとは物理マシンと同じ流れでインストールする。
- 言語・キーボードを選択 → 「次へ」→「今すぐインストール」
- プロダクトキー入力画面
- ライセンスキーがあればここで入力
- 後で入れる場合は「プロダクトキーがありません」を選択
- エディション選択(Pro / Home などライセンスに合わせたもの)
- ライセンス条項に同意
- インストールの種類
→ 「カスタム: Windows のみをインストール(詳細設定)」 を選ぶ
3.3 パーティションの作成
「Windows をインストールする場所」画面では、ディスク 0 に「未割り当ての領域」として ~128GB が見えているはず。
- ここでは細かいことはせず、**未割り当ての領域を選択して「次へ」**でよい。
Windows が EFI システムパーティション・MSR・C: ドライブなどを自動で作ってくれる。
その後は通常どおり、コピー → 再起動 → 初期設定(地域 / アカウント / プライバシーなど)を進めればよい。
インストール後の確認と仕上げ
4.1 TPM 2.0 が認識されているか
Windows 起動後、Win + R から tpm.msc を実行し、TPM 管理画面を開く。
- TPM のバージョンが 2.0 と表示されていれば OK。
これで Windows 11 の TPM 要件は満たされている。
4.2 ネットワーク
- NIC を
e1000eのままにしているので、特別なドライバを入れなくてもネットワークは動作しているはず。 - ホスト側では libvirt の
defaultネットワーク(NAT)が使われる。
当面はこのままで問題ない。必要に応じて、後から Linux ブリッジを作り、VM を LAN 直結にする設計も検討できる。
4.3 ゲストツール(virtio ドライバ)の導入(任意)
パフォーマンスを詰めたい場合は、別途 virtio-win.iso をダウンロードして
- 2 枚目の CD-ROM として VM にマウント
- ゲスト内で
virtio-win-guest-tools.exeを実行
することで、virtio 系のドライバをまとめて導入できる。
その後、ディスクや NIC を virtio 化していく、という流れが一般的だが、本記事の範囲外とする。
libvirt System と User session の使い分けメモ
Cockpit 上で VM を作る際、「Connection」として
- System(
qemu:///system) - User session(
qemu:///session)
が選べるが、本記事のような サーバ上で常用する VM はすべて System に置くのが基本方針。
理由:
- サーバ再起動後に、System VM は簡単に自動起動・手動起動できる
- CLI から
virsh start columbiaなどで統一的に扱える - ブリッジや物理 NIC、vTPM などのリソース管理が System 側に集中する
User session は「そのユーザーがログインしている間だけ動いていればよい一時 VM」向けと考える。
おまけ:systemd-networkd-wait-online のエラーについて
Cockpit の「Services」で
systemd-networkd-wait-online.service
Failed to start Wait for Network to be Configured.
Timeout occurred while waiting for network connectivity.
といったエラーが出ることがある。
これは
systemd-networkdが管理しているすべての NIC が「オンライン」になるまで待ったが、- ケーブルが抜けている NIC などがいて、いつまで経っても揃わないためタイムアウト
しただけで、実際に使っている NIC(例:enp1s0f0np0)が正常に上がっているなら実害はほぼない。
気になる場合の対処案:
- サービス自体を無効化してしまう
sudo systemctl disable --now systemd-networkd-wait-online.service多くの自宅サーバ用途では、これで問題になることは少ない。 - netplan で「必須ではない」NIC を optional にする netplan の YAML にて、使っていない NIC に
optional: trueを付ける。network: version: 2 renderer: networkd ethernets: enp4s0: dhcp4: true optional: trueその上でsudo netplan generate sudo netplan applyとすれば、その NIC が上がらなくても「オンライン」と判断される。
このエラー自体は Windows 11 VM とは無関係なので、優先度は低い。「気になったら片付ける」程度の認識でよい。
まとめ
- Ubuntu 24.04 上に KVM + libvirt + Cockpit を載せるだけで、Proxmox 的な日常運用(起動・停止・コンソール・スナップショット)がかなり快適にこなせる。
- Windows 11 VM を問題なく動かすためには、
UEFI(OVMF) + vTPM 2.0(swtpm) をきちんと用意してからインストールするのがポイント。 - ISO の置き場所は
/var/lib/libvirt/isoなど libvirt からアクセス可能なパスにまとめる。 - VM 名は
columbiaのように小文字で統一し、System 接続(qemu:///system)側に揃えておくと、CLI や将来の DNS 管理などがやりやすい。
この状態までできていれば、あとは同じ要領で
- バックグラウンド処理用 Windows 11
- ダウンロード専用 Ubuntu VM
なども追加し、用途ごとに VM を分離していくことができる。


コメント