WSL同一ディストリビューション複数環境【2024/9/22追記】

この記事は、WSLにおいて一つのディストリビューションは一つしかインストールできない(一つの実行環境しか持てない)制約に対し、インストール以外の手段で複数の実行環境を設定する方法について記したものです。

注意:この記事では非公式の方法を記載しており、お使いの環境が破損する可能性もありますので御注意ください。この記事を参考として実施した結果については保証いたしません。

1. この記事の概要

  • WSLにおける「ディストリビューション」の考え方
  • 複数環境化にあたっての仮想マシン環境とのアナロジー
  • WSL特有の留意事項
  • 複数環境化手順

2. WSLの「ディストリビューション」

WSLではLinux環境についてUbuntu・Debian等のいわゆる「ディストリビューション」が複数利用できるようになっています。現在ではWSLのディストリビューションはMicrosoft Storeの配布アプリ管理になっています。

Microsoft Storeの画面例

WSLで実行するLinux環境について、ひとつのディストリビューションを複数併存することができません。Ubuntuのようにストアに複数のバージョンが存在する場合には複数のバージョンのUbuntuを併存することができますが、複数バージョンが複数ストアアプリの扱いになっていることによるものです。そのため単一のストアアプリで提供されているディストリビューションについては、ひとつのマシンでひとつのディストリビューション実行環境しか存在できません。

1ディストリビューションは1実行環境しかインストールできない

もちろんLinuxはマルチユーザ環境ですので、ひとつの実行環境で複数のユーザを作成して利用することは可能です。しかし例えばパッケージのインストールやOS全体の設定など、分離・独立できない要素もあります。このため例えば実行環境全体に関わるアプリケーションの検証等でクリーンな状態の実行環境を必要とする場合など、ディストリビューション(ストアアプリ)を再インストールしなければならない等の制約があります。

この記事では、非公式ではありますが、同一のディストリビューションに対して複数の実行環境を実現する方法について記しています。

記載しているLinuxのコマンドについてはUbuntu環境での確認となっており、他のディストリビューションでは相当する他のコマンド(形式)となる可能性があります。

3. この記事での用語について

前述のとおりWSLは公式的にはひとつのディストリビューションでひとつの実行環境しか存在し得ないため、実行環境のことも「ディストリビューション」と呼称されています(wslコマンドのヘルプなど)。この記事では複数実行環境について述べるため、それらの実行環境も「ディストリビューション」と呼称すると、理解の妨げになります。このためこの記事では実行環境のことを「インスタンス」と呼称します。一般的な仮想マシン環境に対比すると、「ディストリビューション」が仮想マシンでいうマシンイメージ、「インスタンス」はそのまま仮想マシンのインスタンスに相当するものと考えれば理解の助けになるかと思います。

4. WSLディストリビューションの「インストール」と「実行」と一覧表示

後述の手順ではwslコマンドを利用して作業を行いますが、その手順に影響するポイントについて触れます。

WSLディストリビューションをストアからダウンロードしたり、wsl --install --no-launchでインストールしても、そのディストリビューションを実行(起動)するまではwsl --list--allをつけても)コマンドでディストリビューション(この記事ではインスタンス)が表示されません。ホストWindowsを再起動しても表示されませんでした。古いWSLバージョンではディストリビューション管理方式が異なるケース(ビルトイン版)もあり、検証環境でも当初wslコマンドの--versionが存在しない(=ある程度古いバージョン)こともあってwsl --updateでWSLを更新するなど試みましたが解消せず、結局ディストリビューションを実行したら表示されるようになったので、そのようなものであるようです。
【2024/9/22追記】新規環境のMicrosoft Store版WSL2(WSLの種類についてはこちらの記事を御参照ください)にてwsl --install --no-launchでインストールした場合、ディストリビューションの実行(起動)方法を見つけることができませんでした。再度インストールしようとすると既に存在する表示がされるため(そのまま継続して起動もされます)、インストール自体はされているようです。こちらのissueの内容から推測すると、--no-launch指定時は初期処理が行われないため、実行(起動)するためのセットアップも行われないことが考えられます。当初ディストリビューションを実行(起動)できていた経緯は不明ですが、非Microsoft Store版WSL2を利用していたことだったり、クリーンな環境では無かったので既に一度ディストリビューションを--no-launch指定せずインストールしていたことなどが考えられます。

手順の中でいわゆるマシンイメージを作るためにインスタンスを指定するため、一度ディストリビューションを起動する一見無駄な操作があるのは、そのような背景が理由ということであえて触れさせていただきました。またマシンイメージはインスタンスから作成するため、できるだけクリーンな(新規インストール直後)のディストリビューションを用意することが望ましいことも示しています。

5. 複数環境作成手順

5.1 手順概要

  • ディストリビューションの準備(インストール・起動)
  • 初期インスタンスからマシンイメージを作成
  • マシンイメージから個別インスタンスを作成
  • 個別インスタンスのデフォルトユーザを整備
  • 初期インスタンスの停止・非表示化
インストールした実行環境(インスタンス)をexportしてマシンイメージを作り
別の実行環境(インスタンス)としてimport

5.2 手順詳細

5.2.1 ディストリビューションのインストール

複数実行環境(インスタンス)を作成するためのディストリビューションをインストールします(ストアからのインストール、wsl --installコマンドによるインストール)。

インストール済のディストリビューション(インスタンス)を対象にすることも可能ですが、その時点での状態(パッケージ・パッチ・作成ユーザなど)が今後作成する複数インスタンスの元となります(状態が各インスタンスに反映されます)。

wsl --installコマンドの場合、--no-launch(インストール後にディストリビューションを起動しない)をつけてもつけなくても、次のステップで起動することになるので問題ないかと思います(検証では--no-launchで起動せずに次のステップで起動しました)。
【2024/9/22追記】前の追記の通り、--no-launchを指定しない場合はその後に起動する手段が無い場合があります。またPowerShell上でwsl --installコマンドでインストールする場合、ディストリビューションでの初期設定に関する画面入出力が、そのままPowerShellを実行している画面上で実施されます。

5.2.2 ディストリビューションの起動

対象のディストリビューションを起動します(Windows Terminalの新規タブなど)。前ステップでwsl --installコマンドを--no-launchオプション無しで実行した場合は起動済みになります。

初回起動では今後利用する作成ユーザ名の入力待ちになりますが、何も操作せずに終了(Windows Terminalのタブを閉じるなど)します。これはできるだけクリーンな状態のマシンイメージを作るソースとするためになります。

PowerShellで以下のコマンドを実行して、各インスタンスの状況を確認することができます。出力のNAME列がインスタンス名、STATE列が実行状態(実行中:Running、停止済:Stopped)となります。
【2024/9/22追記】新規環境検証では入力待ちの終了後に停止状態(Stopped)となっておりました。この状態でも次節で説明するマシンイメージの作成(--export)も、その後の作成インスタンスでの作業も可能です。

wsl --list --verbose

実行例:

5.2.3 インスタンスからマシンイメージの作成

PowerShellで以下のコマンドを実行して、エクスポート(インスタンスからマシンイメージを作成)します。マシンイメージファイルを配置するディレクトリをカレントディレクトリにしておくとよいかと思います。

wsl --export <インスタンス名> <マシンイメージをあらわす識別名>.tar

5.2.4 マシンイメージからインスタンスの作成

次にPowerShellで以下のコマンドを実行してインポート(マシンイメージからインスタンスを作成)します。インポート先パスディレクトリ配下には全ディストリビューション/インスタンスで共通の固定名(ext4.vhdx)のファイルが作成されるため、インポート先パス(ディレクトリ)は環境ごとに識別しやすい名前にして分けるとよいかと思います。参考までに\\wsl$パス配下にはインスタンス名のディレクトリがあり、その配下にLinuxディレクトリ階層が存在しますが、そこにマウントしている(されている?)ようです。インスタンス名は複数となる環境の目的に応じた名前にするとよいでしょう。

wsl --import <新規インスタンス名> <インポート先パス> <エクスポートしたマシンイメージ.tar>

5.2.5 作成インスタンスの起動

新規インスタンスを起動します。Windows Terminalのタブ作成プルダウンにも新規インスタンス名が表示されますが、インスタンス作成直後は表示されないようですので、Windows Terminal設定画面で「保存」をクリックすると表示されます。

5.2.6 デフォルトユーザの整備

ディストリビューションを起動した際には作成ユーザ名入力待ちとなっていましたが、作成インスタンスを起動するとそれがスキップされてrootユーザでのログイン状態になります。

通常のディストリビューション起動時と同様の状態にするため、通常起動時のガイダンスに相当する作業を手動で行います。

5.2.6.1 ユーザの作成

インスタンスのLinuxシェルで以下のコマンドを実行して、ユーザを作成します。-sはログインシェルを指定しており、ここではbashを指定していますが任意です。-mは/homeディレクトリにユーザ名のサブディレクトリを作成します。

useradd <ユーザ名> -s /bin/bash -m
5.2.6.2 作成ユーザのパスワード設定

インスタンスのLinuxシェルで以下のコマンドを実行して、作成ユーザに対するパスワードを指定します。今後sudoする時などに必要となります。

passwd <ユーザ名>
5.2.6.3 作成ユーザのsudoグループ所属

インスタンスのLinuxシェルで以下のコマンドを実行して、作成ユーザをsudoグループ所属(sudo可能なユーザグループ)にします。これを行わないと、以降のステップによりsudoできない作成ユーザがデフォルトログインとなるため、スーパーユーザとしての設定等ができないなど実質実用的でない環境になってしまい、環境再作成が必要となってしまいます。

gpasswd -a <ユーザ名> sudo
5.2.6.4 デフォルトユーザ設定

通常のWSLディストリビューション(インスタンス)では初回起動時に指定したユーザ名でデフォルトログインされますが、その設定を行います。
【2024/9/22追記】ユーザの設定はディストリビューションのconfigコマンド等で設定できる可能性もありますが未確認です。

インスタンス内の/etc/wsl.confというファイルで、存在しない場合は作成し、存在する場合は既存の行の後に以下の行を追加してください。通常のWSLディストリビューション(インスタンス)では存在せず、どこでデフォルトユーザが定義されているかは不明です。

[user]
default=<ユーザ名>

参考までに検証したUbuntu環境では以下の既存行が存在しました。

[boot]
systemd=true

5.2.7 作成インスタンス再起動

前ステップの/etc/wsl.confによるデフォルトユーザ設定はインスタンスを再起動しないと有効化されません。Windows Terminalのタブを閉じてもインスタンスが停止しない場合があります。wsl --list --verboseコマンドで、対象インスタンスのSTATERunningとなっている場合は、PowerShellで以下のコマンドを実行して、インスタンスを一度停止します。
【2024/9/22追記】再起動は「インスタンス」の再起動が必要です。インスタンス上で実行されている「OS」の再起動では有効化されません。

wsl --terminate <インスタンス名>

その後wsl --list --verboseコマンドで確認し、対象インスタンスのSTATEStoppedになったことを確認します。そして再度インスタンスを起動(Windows Terminalのタブ作成プルダウン等)します。

そうすると起動したインスタンスの画面で、設定したユーザにてデフォルトログインされるようになったことが確認できます。

5.2.8 事後設定

マシンイメージ(.tar)の作成元となったインスタンス=ディストリビューションは、念のためマシンイメージファイル再作成等に備えてクリーンな状態を保つため、誤って起動・操作しにくいように以下のような手当てをするとよいかと思います。

5.2.8.1 インスタンスの停止

PowerShellで以下のコマンドを実行して、マシンイメージのオリジナルに相当するインスタンス=ディストリビューションを停止します。
【2024/9/22追記】「ディストリビューションの起動」節での追記のように停止済の場合もありますので、その場合は不要です。

wsl --terminate <インスタンス=ディストリビューション名>
5.2.8.2 Windows Terminalドロップダウン非表示

Windows Terminalを利用の場合、タブ右端のドロップダウンからインスタンスを起動できますが、そこで誤ってオリジナルインスタンスを起動しにくいように非表示とします。Windows Terminalのタブ右端ドロップダウンにある設定(歯車アイコン)から、インスタンス=ディストリビューション名を選択して以下の項目を設定します。設定した後は「保存」を行うことにより反映されます。

5.2.8.3 デフォルトインスタンスの変更【2024/9/22追記】

ディストリビューションをインストールすると、環境に最初にインストールしたインスタンスがWSLデフォルトのディストリビューション(インスタンス)になります。wslコマンドをパラメタ無しで実行したりすると、デフォルトになっているディストリビューション(インスタンス)が起動されるため、マシンイメージの作成元となったディストリビューション(インスタンス)が誤って起動されないよう、主に利用するインスタンスにデフォルトを変更しておくと安全です。

wsl --set-default <デフォルトにするインスタンス名>

5.2.9 他インスタンスを適宜作成

必要に応じて「5.2.4 マシンイメージからインスタンス作成」以降を実施し、同一ディストリビューションに対して目的に応じた複数のインスタンスを作成できます。

5.2.10 参考:インスタンス削除

インスタンスの作成に不備があったり、不要になった場合は、PowerShellで以下のコマンドを実行して、インスタンスを削除することができます。

wsl --unregister <インスタンス名>

6. この記事のきっかけ

テキストユーザインタフェースBlueskyクライアント「tuisky」をクリーンな環境で導入しようとし(記事)、その過程でこのような副産物となりました。

7. 参考記事

WSL 上で同一ディストリビューションの環境を複数インストール・管理する

WSL(WSL2)でバージョン確認が出来ないとき【`wsl –version`が使えない】

WSL2 Ubuntuの導入でLinux管理ユーザを登録し損ねた

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です