WSL2に1つのディストロから複数のインスタンスを作成方法

1. はじめに

WSL2 では Linux ディストリビューション(以下 ディストロと表記します)を導入することができますが、通常ですと1種類のディストロを複数個(複数のインスタンス)導入することはできません。しかし、wsl.exe コマンドを使えば実現可能です。本記事では、この手順について説明します。

開発で使用する言語に応じて、linux を使い分けることができるので、環境をきっちり分けたいときに便利です。

2. 手順

  • Ubuntu を複数インスタンス導入する手順について説明します。 ※ WSL 2 の導入手順については省略します。
  1. マイクロソフト・ストア
代替テキスト
  1. Ubuntu22.04LTS
代替テキスト
  1. Ubuntuで利用するユーザー名とパスワードを入力する。
  • user:xxxx
  • PW:xxxxxxx
代替テキスト 代替テキスト 代替テキスト
"\\wsl.localhost\Ubuntu-22.04"
  1. Ubuntuのインストール直後のrootのpassword設定
  • user:root
  • PW:xxxxxx
root@RYZEN-PC:~# sudo passwd root
New password:
Retype new password:
passwd: password updated successfully
  • Linuxの確認
root@RYZEN-PC:/home# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04 LTS"
root@RYZEN-PC:/home# 
2-1. 通常通りディストロをインストールする(インスタンスを作成する)

Microsoft Store から Ubuntu を導入します。 導入後に、PowerShell で wsl.exe -l -v コマンドを実行した結果が以下です。

(base) PS C:\Users\RYZEN> wsl.exe -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
  Ubuntu-22.04    Stopped         2

ここでは、WSL2を利用していることが分かります。

2-2. このディストロのインスタンスをエクスポートする
  1. wslをシャットダウンする。 PowerShell を開き、以下のコマンドを実行します。ここでは、E:\wsl2_new\ubuntu
(base) PS C:\Users\RYZEN> wsl --shutdown
(base) PS C:\Users\RYZEN> wsl.exe -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
  Ubuntu-22.04    Stopped         2
  1. PowerShell を開き、以下のコマンドを実行して Ubuntu をエクスポートします。
PS> wsl.exe --export <ディストロ名> <エクスポート先のファイルパス>
  • 事前に配置するフォルダーを作成しておきます。
代替テキスト
  • 例えば以下のようなコマンドになります。
PS> wsl.exe --export Ubuntu-22.04 E:\wsl2_new\ubuntu\Ubuntu-22.04.tar
  • 作成されたUbuntu-22.04.tar
代替テキスト
  • このコマンドにより、導入したディストリビューションのファイルシステム(/ 以下のディレクトリとファイル)が tar で1つのファイルにまとめられ、エクスポートされます。
  • Microsoft Store から導入した Ubuntu は、C:\Users{username}\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc フォルダが実体のようですが、ここにあるフォルダやファイルがすべてエクスポートされるわけではありません(ストレージとなるファイルは、この中の LocalState\ext4.vhdx ファイルです)。
代替テキスト
  • これからエクスポートするUbuntu22.04
代替テキスト
  • 既に移動したUbuntu20.04
代替テキスト
2-3. 元のディストロ・インスタンスは消してもよい

これから作成する新規インスタンスの元となるデータをエクスポートできたので、最初に導入したディストロはアンインストールしても構いません。

代替テキスト
(base) PS C:\Users\RYZEN> wsl.exe -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
2-4. エクスポートしたデータを元に、新規インスタンスを作成する(何個でも作成可能)

wsl.exe コマンドの “–import” という引数を使って、Ubuntu のインスタンスを生成します。

PS> wsl.exe --import <ディストロ名> <インストール先のフォルダパス> <インポートするファイルパス>
  • <ディストロ名>: 任意の名前を指定します。
  • <インストール先のフォルダパス>: 任意のフォルダパスを指定します。
  • <インポートするファイルパス>: 先程エクスポートしたファイルパスを指定します。

具体的には、例えば以下のコマンドとなります。

PS> wsl.exe --import Ubuntu22.04-v1  E:\wsl2_new\ubuntu\Ubuntu-22.04-jamstack E:\wsl2_new\ubuntu\Ubuntu-22.04.tar
  • 作成されたフォルダーとストレージファイル (ext4.vhdx)
代替テキスト

この操作により、指定したフォルダ以下にストレージファイル (ext4.vhdx) が生成されます。

この時点で、wsl.exe -l -v コマンドを実行すると以下の結果になります。

(base) PS C:\Users\RYZEN> wsl.exe -l -v
  NAME                    STATE           VERSION
* Ubuntu-20.04            Stopped         2
  Ubuntu22.04             Stopped         2
  Ubuntu22.04-v1    Stopped         2

※ この例では、元の Ubuntu は削除していません。

2-5. 作成したインスタンスを起動する

PowerShell 上から、以下のコマンドでインスタンスを起動することができます。

PS> wsl.exe -d <ディストロ名> -u <username>

-u オプションを指定しないと、root でログインするようです。 コマンドの具体例は以下です。

PS> wsl.exe -d Ubuntu22.04-v1 -u foo

ユーザー名は、foo としています。 Windows Terminal を使う場合は、設定ファイル settings.json 内の commandline プロパティに、このコマンドを指定します。

2-6. インスタンスの登録を解除する

インスタンスが必要なくなったら、まず以下のコマンドで「登録の解除」を行ってから、インポートして生成されたファイルを削除します。

PS> wsl.exe --unregister <ディストロ名>

今回の場合ですと、以下のコマンドになります。

PS> wsl.exe --unregister Ubuntu22.04-v1

3. 関連するWSL.exeオプション

wsl.exe の関連オプションの説明は以下です。

–export <ディストリビューション> <ファイル名> ディストリビューションを tar ファイルにエクスポートします。 標準出力の場合は、ファイル名を - とすることができます。

–import <ディストリビューション> <インストール場所> <ファイル名> [オプション] 指定した tar ファイルを新しいディストリビューションとしてインポートします。 標準入力の場合は、ファイル名を - とすることができます。

オプション:
    --version <バージョン>
        新しいディストリビューションに使用するバージョンを指定します。

※ これは、wsl.exe –help を実行して表示される説明文です。

  • VSCodeUbuntu22.04-v1を起動した画面
代替テキスト
  • 参考資料
  1. Windows Subsystem for Linux Command Reference | Microsoft Docs

  2. ubuntu – How to Move a Windows 10 WSL 2 Linux Distribution to Another Location – Stack Overflow

  3. WSL2 – Kali Linux · GitHub

以上