UbuntuにCockpitをインストールしてVM環境構築

スポンサーリンク
スポンサーリンク

はじめに

自宅サーバ(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

いったんログアウト/ログインし直し、groupslibvirt が含まれていることを確認する。


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 10Generic Windows など近いものを選んでおけばよい
  • Disk:
    • Format:qcow2(デフォルト)
    • Size:128 GiB(論理サイズ。qcow2 なので実際には使用量に応じて増える)
  • 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 デバイスを確認・設定する。

  1. 既にインストール元として ISO が設定されていれば、そのままでもよい。
  2. 設定されていない/パスが古い場合は、一度削除し、改めて追加する:
    • 「Add disk」→ CD-ROM を選び、
    • Source ファイルとして
      /var/lib/libvirt/iso/Win11_24H2_Japanese_x64.iso
      を指定する。

これで、VM 起動時に DVD として Windows 11 インストーラがマウントされる。


Windows 11 のインストール

3.1 起動と「Press any key…」への対応

columbiaShut 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 インストーラの基本的な流れ

あとは物理マシンと同じ流れでインストールする。

  1. 言語・キーボードを選択 → 「次へ」→「今すぐインストール」
  2. プロダクトキー入力画面
    • ライセンスキーがあればここで入力
    • 後で入れる場合は「プロダクトキーがありません」を選択
  3. エディション選択(Pro / Home などライセンスに合わせたもの)
  4. ライセンス条項に同意
  5. インストールの種類
    「カスタム: 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)が正常に上がっているなら実害はほぼない。

気になる場合の対処案:

  1. サービス自体を無効化してしまう sudo systemctl disable --now systemd-networkd-wait-online.service 多くの自宅サーバ用途では、これで問題になることは少ない。
  2. 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 を分離していくことができる。

コメント

タイトルとURLをコピーしました