• Windows Subsystem for Linuxガイド 第25回 WSLで仮想環境を使う - その1

物理CPUが「Nested Virtualization」(入れ子になった仮想化)をサポートしている場合、WSL2の中で仮想マシン支援機能を利用することができる。

「Nested Virtualization」とは、仮想マシンの中で動作するゲスト・オペレーティングシステムの上で仮想マシン環境を利用するための機能である。簡単にいうと、WSLの中で仮想マシンを動かすことが可能になる。

Windows 11の仮想マシン支援機能

Windowsの仮想マシンというとHyper-Vだといわれているが、Windows 11のHomeエディションでは、Hyper-Vを使うことはできない。ただし、CPUの仮想マシン機能を利用することはできる。Hyper-Vとは、Windowsの仮想マシン支援ソフトウェアを指し、仮想マシンの利用を可能にする「ハイパーバイザー」自体の名称ではないからだ。このために、Windows 11 HomeエディションでもWSL2を利用することができる。

仮想マシン支援機能は、マシンのUEFI(BIOS)で有効無効を設定可能なことがある。最近のマシンでは、標準で仮想化が有効になっているが、過去には、初期状態では、仮想化機能が無効になっていことがあった。少なくとも、WSL2自体が仮想マシンの中で実行されているため、WSL2が実行できていれば、有効化されているはずだ。

仮想化が有効でない場合、よほど古いCPUでもなければ、UEFI/BIOS設定で無効化されている可能性がある。ただ、いわゆるBIOS設定画面は、メーカーや機種により表示名が異なる。このあたりは、ハードウェアのマニュアルを参照するしかない。Windows 11では、「設定 ⇒ システム ⇒ 回復 ⇒ PCの起動をカスタマイズする ⇒ 今すぐ再起動」を使い、メニューを表示させる。メニューから「トラブルシューティング ⇒ 詳細オプション ⇒ UEFIファームウェアの設定」を選択する。UEFIの設定画面はメーカー、機種ごとに異なるが、CPU設定などで「Virtualization」などの単語を探し有効化する。

仮想マシン支援機能が有効になっているかどうかをWindows 11から確認したい場合には、コマンドラインから「systeminfo」コマンドを使う。スタートメニューからTerminalを開き、systeminfoコマンドを実行する。コマンド出力の最後に「ハイパーバイザーが検出されました」というメッセージが表示されれば、仮想マシンは有効になっている(写真01)。

  • 写真01: 仮想マシン支援機能が有効であれば、systeminfoコマンドの出力の最後に「ハイパーバイザーが検出されました」というメッセージが表示される。これは、Hyper-Vが利用できないHomeエディションでも同じ

WSL2上での仮想マシンの利用に必要なNested Virtualizationは、インテルCPUなら第5世代(Broadwell)以降、AMDならRyzen以降に装備されている。このため、ここ数年の間に購入しWindows 10からアップグレードされたマシンや、Windows 11のシステム要求条件を満たしているマシンであれば、問題なく利用できる。なお、現状、Windowsでは、ARM CPUによるNested Virtualizationは利用できない。

WSL2では、標準でNested Virtualizationが有効化されている。ただし、設定でこれを無効にすることもできる。

設定は、Win32側のユーザーフォルダー以下にある「.wslconfig」ファイルで行う。このファイルの“[wsl2]”セクションにある“nestedVirtualization”を、以下のように“false”に設定することでNested Virtualizationを無効化できる。


[wsl2]
nestedVirtualization=false

通常Nested Virtualizationを無効にする必要はないが、後述の仮想マシン支援機能が動作していない場合など、.wslconfigファイルでこの項目の有無を調べる必要がある。

Linuxの仮想マシン支援機能

Linuxで仮想マシンを使う場合、大きく2つの方法がある。1つは、Linuxカーネルに装備されているKVMを使う方法、もう1つは、他の仮想マシン支援ソフトウェアを利用する方法である。ここでは、WSLディストリビューションとしてUbuntu(Ubuntu 22.04.3 LTS)で検証を行った。

一般に仮想マシン支援ソフトウェアを「ハイパーバイザー」と呼ぶ。これは、オペレーティングシステムよりも上位にあって、その制御を行うからである。

このハイパーバイザーには、ハードウェア上で直接動作し、その上でオペレーティングシステムを動作させるType 1ハイパーバイザー(ベアメタルとも)と、オペレーティングシステム上で動作するType 2ハイパーバイザーの2つがある。WindowsのHyper-VはType 1、Oracle VirtualBoxなどはType 2に当たる。

LinuxでもType 1、Type 2のハイパーバイザーが利用できるが、WSLの場合、その構造上Linux用Type 1ハイパーバイザーを組み込むことはできない。

しかし、Linuxカーネルには、KVM(Kernel Virtual Machine)と呼ばれるType 1ハイパーバイザーがある。というよりもLinuxカーネル自体がType 1ハイパーバイザーとして動作する。このため、WSL2でもKVMは動作することができる。

Nested Virtualizationが有効ならば、LinuxでKVM(Kernel Virtual Machine)が有効になっているはずである。これはシステム起動時のメッセージを表示するdmesgコマンドからKVM関連の表示を取り出せばわかる(写真02)。


dmesg | grep kvm

KVMが有効な場合、KVMをアクセス可能にするため、自分自身をkvmグループに所属させる。bashから、


sudo adduser $USER kvm

を実行したあと、一回、WSLからログアウトし、再度ログインする。これでkvmグループへの参加が行われる。以後、/dev/kvmへのアクセスが可能になる。

  • 写真02: LinuxでKVMの有無を調べるには、dmesgコマンドの出力から「kvm」を含む行を探せばよい。具体的には「dmesg grep kvm」というコマンドを使う。Nested Virtualizationが無効の場合には、「kvm: no hardware support」のようなメッセージが見つかる(写真上)。それ以外のメッセージの場合には、KVMが有効になっている(写真下)

これでWSL2上で仮想マシンを使うための準備ができた。次回は、KVMを使うソフトウェアQEMUをインストールして実際にWSL2上で仮想マシンを動かしてみる。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/