Ubuntu上でエミュレータを使ってWindowsを動かす

Ubuntu上でWindowsや他のOSを使うためのエミュレータを利用する方法を。vmwareやVirtualBoxのようなものですね。ここではKVM/QEMUとそれをGUIで管理出来る「Virt-Manager」の組み合わせで。
ちなみに、Web上で管理出来る「Cockpit」や、そもそもOS自体を専用にしてしまう「Proxmox VE」も人気ですが、個人用途でいちばん使いやすいのが先ほどの組み合わせだと思うので。なお、あくまでも自分用のメモなので参考にする場合は注意を。

仮想マシンのインストール

まずはvirt-managerと、仮想マシンをUEFIファームウェアで動かす場合に必要となるovmfをインストールします。

sudo apt install virt-manager ovmf

これでlibvirtグループが作成され、ユーザーもこのグループに参加して仮想マシンを操作する権限が与えられます。一旦、再起動しておきます。

仮想マシン用のデフォルトフォルダを変更

virt-managerはデフォルトで、/var/lib/libvirt/images以下に仮想マシンのディスクイメージを保存したりするので、ISOイメージなどもここにコピーして利用するのですが、この場所はアクセスしずらいので、ホームディレクトリ配下にアクセス出来るようにします。ここではホームディレクトリの中にvmフォルダを作成した場合の例で進めます。

ホームディレクトリ(/home/ユーザー名)の権限が 700(所有者のみ)に設定されていると、libvirt が中にある vmフォルダに到達できないので、アクセス権を付与します。

chmod 711 /home/ユーザー名

これにより、他のユーザーが中身を一覧表示することはできませんが、パスを指定して通り抜けることが可能になります。ちなみに755 でも動作しますが、セキュリティ上 711(自分以外は中身の一覧は見れないが、パスを知っていれば通過できる)が推奨。

続いて作成したvmフォルダに、仮想化プロセス用のユーザー(qemu または libvirt-qemu)がアクセスできるように ACL(アクセス制御リスト)を設定します。

sudo setfacl -m u:libvirt-qemu:rwx ~/vm

フォルダを作成しただけではvirt-manager の選択肢に表示されないので、「ストレージプール」として登録します。 virt-manager のメイン画面で「編集」-「接続の詳細」、「ストレージ」項目を選択。左の項目から「default」を停止して削除。さらに左下の 「+」ボタンをクリックして、名前を「default」、種類を「dir: ファイルシステムディレクトリ 」に設定し、「ターゲットパス」に作成したフォルダのパスを入力して完了。

仮想マシンを作成しWindows11をインストール

まずはWindows11をインストールする例で進めます。

Windows11のISOイメージを入手

マイクロソフトのサイトからISOイメージをダウンロードします。
virt-manager (KVM/QEMU) で Windows 11 を動作させるためには、パフォーマンスと安定性の向上のためにVirtIOドライバが不可欠です(LinuxカーネルはVirtIOドライバを持っているため不要)。

VirtIOドライバを入手

これはFedoraプロジェクトが提供している「virtio-win」の ISOイメージを使用します(現時点の最新版はvirtio-win-0.1.285-1)。

仮想マシンの作成

仮想マシンの作成ではローカルのインストールメディアを指定。
続いて仮想マシンに割り当てるメモリとCPUコア数を指定。
ストレージも任意の値を指定。
最後に任意の名前を付けます。
ここで「インストールの前に設定をカスタマイズする」を選択。

仮想マシンの詳細設定

SATAディスク1

左側ペインで「SATAディスク1」を選択して。「ディスクバス」を「VirtIO」に変更。

ハードウェアを追加

インストール時にストレージを認識できないので、「ストレージ」を追加して、デバイスの種類を「CD-ROMデバイス」にして、ダウンロードしておいたVirtIOドライバのISOイメージを指定。

TPM vNone

「TPM vNone」をクリックする。「種類」を「疑似」とし、「モデル」は「ハイパーバイザーのデフォルト」、「バージョン」は「2.0」にする

これで「インストールの開始」を押す。うまくCDを読み込めない場合は「ブートオプション」を見直してみます。

インストール時にドライバ読み込み

ディスクドライブをVirtIO接続にしていると、Windows11のインストール画面でドライブが見つからないので、先ほど追加した仮想CD-ROMドライブから、VirtIOドライバを読み込みます。「参照」をクリックして追加したCDドライブ内にある「amd64/w11」を指定します。

問題なく進めば、無事インストールが完了します。

専用ツールやドライバをインストール

Windows のセットアップ完了後、使い勝手を良くしたり、パフォーマンスを最適化するために、専用ツールやドライバをインストールしましょう。

ゲストツールのインストール

ISO内にある「virtio-win-guest-tools.exe」を実行します。これにより、以下の機能が一括インストールされます: 

  • QEMU Guest Agent: ホスト側からのシャットダウンや時刻同期を最適化。
  • SPICE Driver: 画面解像度の自動調整やクリップボード共有を可能にします。 

ディスプレイドライバの変更

ディスプレイドライバをVirtIOに変更すれば、virt-manager のウィンドウサイズに合わせて Windows の解像度が自動で変更されるようになります。また3Dアクセラレーション機能も利用出来るようになります。ただ、Windows 向けのVirtIO-GPUドライバ(VirGL)はLinux ゲストほど完全な 3Dパフォーマンスを発揮できない場合があるため、高度なゲームやグラフィック作業が必要な場合は、GPUパススルーが推奨されています。

変更する場合は、仮想マシンを終了したあと、「ビデオ」項目を選択し、「モデル」を「Virtio」に変更します。

さらに、3Dアクセラレーションを有効にする場合は、同じ画面で 「3Dアクセラレーション」 にチェックを入れます。続いて左の項目一覧から「ディスプレイ Spice」項目を開き、「リッスンタイプ」 を「なし」に設定し、「OpenGL」 にチェックを入れてローカルのGPUを指定します。また「メモリー」項目で「共有メモリを有効にする」にチェックを入れておくと良いでしょう。
なお、3Dアクセラレーション機能を有効にした場合、現時点では稼働時のスナップショット作成機能が利用出来なくなる(終了時のスナップショット作成は行えます)ので、使用環境に応じて有効にしましょう。

 先ほどのゲストツールをインストールしていればドライバは自動で認識されるはずですが、手動でインストールする場合はISO内の「viodod\w11\amd64」フォルダを指定してインストールします。 

ネットワークドライバの変更

ネットワークドライバをVirtIOに変更すると性能が向上します。仮想マシンを終了したあと、詳細設定画面で「NIC」を選択し、デバイスのモデルを「virtio」に変更します。

CPUの設定

CPUの設定も必要に応じて見直しましょう。「ホストCPUの設定をコピーする」はチェックしたまま。これにより、ホストCPUの命令セット(AVX, AES-NIなど)がすべてパススルーされ、ネイティブに近い速度が出ます。さらに、パォーマンスを最大化するにはトポロジーを「手動で設定」。Windows11 Home は1ソケット、Proは2ソケットまでしか認識しません。複数のソケットに分散させると、OS側に認識されないコアが出てくる可能性があります。「1ソケット」にしておけば、すべてのエディションで全コアを確実に利用できます。コアは使用したい物理コア数。8コア割り当てたい場合は「8」。スレッド数は、ホストCPUがハイパースレッディング(SMT)に対応しているなら「2」にします。

なお、Intel Core i9/i7 などのハイブリッドアーキテクチャを使用している場合、単にトポロジーを設定するだけでは、Windows側で「高性能なPコア」と「高効率なEコア」を正しく使い分けられません。安定性を重視する場合、「Pコアのみ」をトポロジーに割り当て、後述の「CPU Pinning」で固定するのが一般的です。すべて割り当てる場合は、Windows 11 が正しくスケジューリングできるよう、設定の XML 編集でhyperv関連の機能を有効にする必要があります。

仮想ディスクのサイズを拡大する

使用している最中に仮想ディスクのサイズを拡大したくなったら、仮想マシンを終了したあと、コマンドで指定します。たとえば10GB拡張する場合は次のように指定します。

sudo qemu-img resize -f qcow2 ./win11.qcow2 +10G

あとはゲストOS上で拡張なりしましょう。

アイコン右上に付くバツ印を消したい

Virt-Managerを使ってISOイメージなどを指定したりすると、そのISOイメージアイコンの右上にバツ印が付けられたりします。これは所有者がlibvirt-qemuになってしまうためで、気になるようでしたら、使わなくなったISOは所有者を変更しておくと良いでしょう。これはchownコマンドを使用します。
たとえばダウンロードフォルダにISOイメージがあるとして、それらの所有者をuserアカウントに変更する場合は次のように入力します。

sudo chown user *.*