WSLに複数のインスタンス
WSL2に1つのディストロから複数のインスタンスを作成方法
1. はじめに
WSL2 では Linux ディストリビューション(以下 ディストロと表記します)を導入することができますが、通常ですと1種類のディストロを複数個(複数のインスタンス)導入することはできません。しかし、wsl.exe コマンドを使えば実現可能です。本記事では、この手順について説明します。
開発で使用する言語に応じて、linux を使い分けることができるので、環境をきっちり分けたいときに便利です。
2. 手順
- Ubuntu を複数インスタンス導入する手順について説明します。 ※ WSL 2 の導入手順については省略します。
- マイクロソフト・ストア
- Ubuntu22.04LTS
- Ubuntuで利用するユーザー名とパスワードを入力する。
- user:xxxx
- PW:xxxxxxx
"\\wsl.localhost\Ubuntu-22.04"
- 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. このディストロのインスタンスをエクスポートする
- 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
- 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 を実行して表示される説明文です。
- VSCodeでUbuntu22.04-v1を起動した画面
- 参考資料
Windows Subsystem for Linux Command Reference | Microsoft Docs
ubuntu – How to Move a Windows 10 WSL 2 Linux Distribution to Another Location – Stack Overflow