WSL2で同じディストリビューションの仮想マシンを複数作成する。

# はじめに
`WSL2`の`Ubuntu`を触っていたとき、ふと`VirtualBox`などのように同じOSの仮想マシンを複数作成するにはどうするのだろうと思い、調べてやってみたことを残します。

# WSLでの仮想マシンの作成
`WSL`で使えるディストリビューションを入手するには`Microsoft Store`にアクセスし、インストールしたいディストリビューションを探し、「**入手**」ボタンを選択すればインストールされますが、一度入手してしまうと、再度同じディストリビューションを入手しようとしても以下のように「**起動**」ボタンしかなく、インストール済みであると表示されるため、同じディストリビューションで複数の仮想マシンを使うことができなくなっています。

![capture_19072021_073904.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/35850277-a5bd-f3c2-28a8-15fc9eb94013.jpeg)

しかし、`wsl.exe`のヘルプを見てみると、以下のような`import`、`export`の引数があることから、できないわけではないようなのでやってみます。

```powershell:wsl.exeのヘルプ抜粋
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`の部分が変わるだけで同じようにインストールされるようです。

また、仮想マシンディレクトリ内の構成は以下となります。

```powershell:仮想マシンディレクトリ内の構成
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`ホストから仮想マシンに送りたい場合等に役に立つかと思います。

![capture_21072021_082354.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/59b341e9-bc03-c948-2d6b-9758bbf526f6.jpeg)

# WSLでの仮想マシンエクスポート
インストール済みの`Ubuntu-20.04`と同じ仮想マシンをもう一台作るためには仮想マシンをエクスポート→インポートすることで作成できるとのことなので、まずは仮想マシンをエクスポートしていきます。

仮想マシンをエクスポートするために、`WSL`で動作している仮想マシンを停止します。

停止するには`Windows`ホスト側から以下コマンドで仮想マシン名と動作状況を確認して、起動中であればシャットダウンコマンドを実行することで停止します。

```powershell:仮想マシン名と動作状況の確認
wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
```

```powershell:Ubuntu-20.04の停止
wsl -t Ubuntu-20.04
```

停止後、以下エクスポートコマンドで仮想マシンをエクスポートします。

書式は上記ヘルプの通り、`--export <ディストリビューション> <ファイル名>`となるため、任意の場所にエクスポートします。

```powershell:仮想マシンのエクスポート（ユーザディレクトリ直下に保存する場合）
wsl --export Ubuntu-20.04 'C:\Users\[ユーザ名]\Ubuntu-20.04_export.tar'
```

# WSLでの仮想マシンインポート
エクスポートした仮想マシンの`tar`ファイルをインポートして、新たな仮想マシンを作成していきます。

書式は上記ヘルプの通り、`--import <ディストリビューション> <インストール場所> <ファイル名> [オプション]`となります。

エクスポート時とは若干異なり、`<ディストリビューション名>`は新しい仮想マシンに付ける名前、`インストール場所`は任意の場所を指定できるので、`Microsoft Store`から入手した場合にインストールされる場所にする必要は無いようです。

今回は`Ubuntu-import`という名前の仮想マシン名でインポートしてみます。

```powershell:仮想マシンのインポート
wsl --import Ubuntu-import 'C:\Users\[ユーザ名]\Ubuntu-import' 'C:\Users\[ユーザ名]\Ubuntu-20.04_export.tar'
```

インポート完了後、再度`wsl -l`コマンドで確認すると`Ubuntu-import`という名前で新たに仮想マシンが作られていることが確認できます。

```powershell:インポート後の仮想マシン名と動作状況の確認
 wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Stopped         2
  Ubuntu-import          Stopped         2
```

尚、インポート後はインポートするのに使用したtarファイルは不要なので削除してください。

## インポートした仮想マシンの構成
仮想マシンをインポートすると、`<インストール場所>`で指定した名前のフォルダの中に`ext4.vhdx`という仮想ディスクファイルが展開されます。

`Microsoft Store`でインストールした場合のように他のフォルダは生成されず、仮想ディスクのみの構成となるようです。

また、仮想マシンの状態は、**仮想マシンをエクスポートした時点の構成**となり、リセットして初期状態に戻すようなこともできないようなので、もし`Microsoft Store`で入手したままの状態で作りたい場合、事前にその状態の仮想マシンをエクスポートしておく必要があります。

# インポートした仮想マシンの起動
`WSL`のヘルプより以下コマンドを実行することで起動できます。

```powershell:wsl.exeのヘルプ抜粋
    --distribution, -d <ディストリビューション>
        指定したディストリビューションを実行します。
```

```powershell:インポートした仮想マシンの起動
wsl -d Ubuntu-import
```

# インポートした仮想マシンの削除
`Microsoft Store`からインストールしたディストリビューションは「**アプリと機能**」画面上からアンインストールすることで削除できますが、インポートした仮想マシンは「**アプリと機能**」に表示されないためコマンドから削除していきます。

削除は`WSL`の管理から以下コマンドで登録解除した後、インポートした際に指定したフォルダごと削除します。

```powershell:wsl.exeのヘルプ抜粋
    --unregister <ディストリビューション>
        ディストリビューションの登録を解除します。
```

```powershell:インポートした仮想マシンの削除
wsl --unregister Ubuntu-import
del <インストール場所>
```

# おわりに
`Windows Store`で入手した仮想マシンとは若干使い勝手が異なりますが、同じディストリビューションの仮想マシンを複数立ち上げられるのは、テストする場合などに有用だと感じました。