はじめに
WSL2のUbuntuを触っていたとき、ふとVirtualBoxなどのように同じOSの仮想マシンを複数作成するにはどうするのだろうと思い、調べてやってみたことを残します。
WSLでの仮想マシンの作成
WSLで使えるディストリビューションを入手するにはMicrosoft Storeにアクセスし、インストールしたいディストリビューションを探し、「入手」ボタンを選択すればインストールされますが、一度入手してしまうと、再度同じディストリビューションを入手しようとしても以下のように「起動」ボタンしかなく、インストール済みであると表示されるため、同じディストリビューションで複数の仮想マシンを使うことができなくなっています。
しかし、wsl.exeのヘルプを見てみると、以下のようなimport、exportの引数があることから、できないわけではないようなのでやってみます。
Linux 用 Windows サブシステムを管理するための引数:
--export <ディストリビューション> <ファイル名>
ディストリビューションを tar ファイルにエクスポートします。
標準出力の場合は、ファイル名を - とすることができます。
--import <ディストリビューション> <インストール場所> <ファイル名> [オプション]
指定した tar ファイルを新しいディストリビューションとしてインポートします。
標準入力の場合は、ファイル名を - とすることができます。
オプション:
--version <バージョン>
新しいディストリビューションに使用するバージョンを指定します。
WSLでの仮想マシンのファイル構成
WSLで仮想マシンをインストールする場合、「入手」ボタン一発でインストールされ、カスタマイズする余地が無いため、WSLで仮想マシンを作成する際のファイル構成などはユーザから意識させないつくりとなっていますが、実際の構成は以下のようになっているようです。
| Ubuntu-20.04の構成 | 場所 |
|---|---|
| 仮想マシンディレクトリ | C:\Users\[ユーザ名]\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_xxxxxxxxxxxxx |
| 仮想ディスク | C:\Users\[ユーザ名]\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_xxxxxxxxxxxxx\LocalState\ext4.vhdx |
Microsoft Storeから他のディストリビューションをインストールした場合もCanonicalGroupLimited.Ubuntu20.04onWindows_xxxxxxxxxxxxxの部分が変わるだけで同じようにインストールされるようです。
また、仮想マシンディレクトリ内の構成は以下となります。
tree /F C:\Users\[ユーザ名]\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_xxxxxxxxxxxxx\
フォルダー パスの一覧: ボリューム Windows
ボリューム シリアル番号は xxxxxxxx xxxx:xxxx です
C:\USERS\[ユーザ名]\APPDATA\LOCAL\PACKAGES\CANONICALGROUPLIMITED.UBUNTU20.04ONWINDOWS_XXXXXXXXXXXXX
├─AC
│ └─Temp
├─AppData
├─LocalCache
│ ├─Local
│ │ └─Microsoft
│ └─Roaming
│ └─Microsoft
│ └─Windows
│ └─Start Menu
│ └─Programs
├─LocalState
│ ext4.vhdx
│
├─RoamingState
├─Settings
│ roaming.lock
│ settings.dat
│
├─SystemAppData
│ └─Helium
│ User.dat
│ UserClasses.dat
│
└─TempState
仮想マシンディレクトリとは異なりますが、\\wsl$と入力して開くと、各仮想マシンのファイルにアクセスできるため、ファイルをWindowsホストから仮想マシンに送りたい場合等に役に立つかと思います。
WSLでの仮想マシンエクスポート
インストール済みのUbuntu-20.04と同じ仮想マシンをもう一台作るためには仮想マシンをエクスポート→インポートすることで作成できるとのことなので、まずは仮想マシンをエクスポートしていきます。
仮想マシンをエクスポートするために、WSLで動作している仮想マシンを停止します。
停止するにはWindowsホスト側から以下コマンドで仮想マシン名と動作状況を確認して、起動中であればシャットダウンコマンドを実行することで停止します。
wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
wsl -t Ubuntu-20.04
停止後、以下エクスポートコマンドで仮想マシンをエクスポートします。
書式は上記ヘルプの通り、--export <ディストリビューション> <ファイル名>となるため、任意の場所にエクスポートします。
wsl --export Ubuntu-20.04 'C:\Users\[ユーザ名]\Ubuntu-20.04_export.tar'
WSLでの仮想マシンインポート
エクスポートした仮想マシンのtarファイルをインポートして、新たな仮想マシンを作成していきます。
書式は上記ヘルプの通り、--import <ディストリビューション> <インストール場所> <ファイル名> [オプション]となります。
エクスポート時とは若干異なり、<ディストリビューション名>は新しい仮想マシンに付ける名前、インストール場所は任意の場所を指定できるので、Microsoft Storeから入手した場合にインストールされる場所にする必要は無いようです。
今回はUbuntu-importという名前の仮想マシン名でインポートしてみます。
wsl --import Ubuntu-import 'C:\Users\[ユーザ名]\Ubuntu-import' 'C:\Users\[ユーザ名]\Ubuntu-20.04_export.tar'
インポート完了後、再度wsl -lコマンドで確認するとUbuntu-importという名前で新たに仮想マシンが作られていることが確認できます。
wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2
Ubuntu-import Stopped 2
尚、インポート後はインポートするのに使用したtarファイルは不要なので削除してください。
インポートした仮想マシンの構成
仮想マシンをインポートすると、<インストール場所>で指定した名前のフォルダの中にext4.vhdxという仮想ディスクファイルが展開されます。
Microsoft Storeでインストールした場合のように他のフォルダは生成されず、仮想ディスクのみの構成となるようです。
また、仮想マシンの状態は、仮想マシンをエクスポートした時点の構成となり、リセットして初期状態に戻すようなこともできないようなので、もしMicrosoft Storeで入手したままの状態で作りたい場合、事前にその状態の仮想マシンをエクスポートしておく必要があります。
インポートした仮想マシンの起動
WSLのヘルプより以下コマンドを実行することで起動できます。
--distribution, -d <ディストリビューション>
指定したディストリビューションを実行します。
wsl -d Ubuntu-import
インポートした仮想マシンの削除
Microsoft Storeからインストールしたディストリビューションは「アプリと機能」画面上からアンインストールすることで削除できますが、インポートした仮想マシンは「アプリと機能」に表示されないためコマンドから削除していきます。
削除はWSLの管理から以下コマンドで登録解除した後、インポートした際に指定したフォルダごと削除します。
--unregister <ディストリビューション>
ディストリビューションの登録を解除します。
wsl --unregister Ubuntu-import
del <インストール場所>
おわりに
Windows Storeで入手した仮想マシンとは若干使い勝手が異なりますが、同じディストリビューションの仮想マシンを複数立ち上げられるのは、テストする場合などに有用だと感じました。

