WSL2環境をコピー（複製）する方法

WSLが登場してから大変便利に利用しています。
以前はVMwareやVirtualBoxといった仮想マシンをローカルPCへ入れたりしていましたが、私の場合、たいていはWSLで足りる感じになっています。

https://learn.microsoft.com/ja-jp/windows/wsl/install

私の場合、環境を使っているうちに、クラッシュしたり、パッケージをいじくりまわして設定おかしくなって困ったなど、しばしば環境を戻したいことがあります。
仮想マシンを利用していた時はそのイメージのスナップショットを取得することで丸ごとバックアップしていました。
WSL2でもバックアップすることが可能です。手順をメモしておきます。


# 環境

2023年1月時点の内容になります。WSLは結構進化している印象ですので、記事が古くなった際は注意です。
（導入手順など初期に比べるとかなり楽になりました）

OSはWindows11 Proです。PowerShellから操作します。

```
PS > wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.1105
```

# 登録済みWSL環境を複製する手順

## 元となる仮想ディスクの場所を確認

UbuntuをMicrosoftストアなどから導入した場合、下記にインストールされているはずです。

`$env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\`

エクスプローラーでも確認可能です。下記へアクセスします。

`%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\`

`ext4.vhdx` というファイルが仮想ディスクファイルの実体になります。

## WSLを停止

まずはディストリビューションを確認します。
```
PS > wsl --list --verbose
  NAME         STATE           VERSION
*  Ubuntu       Stopped         2
```

停止します
```
PS > wsl --terminate Ubuntu
この操作を正しく終了しました。
```

## ディストリビューションをコピー

下記コマンドを実行します。

```
PS > wsl --import NewUbuntu .\NewUbuntu $env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx --version 2 --vhd
インポート中です。この処理には数分かかることがあります。
この操作を正しく終了しました。
```

パラメータ　`--import`で既存のものから新しいディストリビューションを作成することを指示しています。
先頭の `NewUbuntu` は新しいディストリビューション名（識別名）です。
2つ目の `.\NewUbuntu` はインストール先のパスです。
3つ目はインポート元のファイルです。上記の `ext4.vhdx` ファイルをフルパスで指定しています。
`--version 2` は作成されるWSLバージョンが2であることを指示しています。
最後の `--vhd` はインポート元ファイルが `.vhdx` であることを指示しています。

## 確認

指定したインストール先パスへ .vhdxファイルが作成されています。

```
PS > ls .\NewUbuntu\
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2023/01/16    12:01     1155530752 ext4.vhdx
```

WSL上の管理対象ディストリビューションとして登録されています。

```
PS > wsl --list --verbose
  NAME         STATE           VERSION
  NewUbuntu    Stopped         2
* Ubuntu       Stopped         2
```

作成したディストリビューションを実行します。

```
PS > wsl --distribution NewUbuntu
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.79.1-microsoft-standard-WSL2 x86_64)
...
root@pc:/mnt/c/Users/....#
```


# .vhdxファイルから復元する手順

登録済みディストリビューションとしてではなく、.vhdxファイルがあれば新たな環境を作成することも可能です。
バックアップ用途であればこちらの手順となります。
上記で作成した `NewUbuntu` ディストリビューションを複製します。

## .vhdxファイルをローカルディスクへコピー

本手順では `NewUbuntu`ディストリビューションの.vhdxファイルをコピーします。
（バックアップからのリストアの場合は別ストレージから.vhdxファイルをコピーすることになります）

```
PS > mkdir NewUbuntuCopy
PS > cp .\NewUbuntu\ext4.vhdx .\NewUbuntuCopy\
```

## 新規ディストリビューションとして登録

`--import-in-place` パラメータによって、既に存在する.vhdxファイルからディストリビューションを登録します。
指示する内容はディストリビューション名 `NewUbuntuCopy` と、上記でコピーした. vhdxファイルパスです。

```
PS > wsl --import-in-place NewUbuntuCopy .\NewUbuntuCopy\ext4.vhdx
この操作を正しく終了しました。
```

## 確認

WSL上の管理対象ディストリビューションとして `NewUbuntuCopy` が登録されています。

```
PS > wsl --list --verbose
  NAME             STATE           VERSION
  NewUbuntu        Stopped         2
* Ubuntu           Stopped         2
  NewUbuntuCopy    Stopped         2
```

作成したディストリビューションを実行します。

```
PS > wsl --distribution NewUbuntuCopy
root@pc:/mnt/c/Users/....#
```

# 不要なディストリビューションを削除

不要になったディストリビューションを登録解除します
.vhdxファイルも削除されるので注意です。

```
PS > wsl --unregister NewUbuntu
登録解除。
この操作を正しく終了しました。
```


# 最後に

以前は `--export` によって出力された .tarファイルを `--import`する手順だったと記憶しています。
現在は .vhdxファイルを直接指定して `--import` または `--import-in-place` によるディストリビューション登録が可能になっています。
.vhdxファイルだけバックアップしておけば復元できるのでとても簡単になりました。