複数の WSL (Linux インスタンス) をコピーして使う
windows でウェブ開発するときは wsl を使うと簡単に linux 環境が使えるので便利です。
私は基本的に Ubuntu18.04 の distro をインストールして使っています。
最近知ったのですが、 WSL の distro インスタンスを export/import して、複製できます。
これを使うと、開発で使用する言語に応じて、linux を使い分けることができるので、環境をきっちり分けたいときに便利かもです。今回は PHP 用 Ubuntu と Ruby 用 Ubuntu のインスタンスを作ってみたいと思います。
なお、下記の記事を参考にしました。こちらも参照したほうが良いかもしれません。
雛形となるプレーンな WSL distro のインストール
Microsoft store からインストールできます。
例えば、Ubuntu と検索すると、下記の様な感じが出てくるので、好きなバージョンのものをインストールします。
20.04 でも 18.04 でもどちらでも構いません。Ubuntu 以外の distro でもOK
※インストール後に取ったスクショなので、ボタンの表示が「起動」になっている
雛形の WSL distro を Windows Terminal で開いてみる
Ubuntu-20.04 Plain
と選択肢に表示されているのは、Windows Terminal の設定 json でカスタマイズしたため
- Microsoft Store からインストールした Ubuntu 20.04 が Windows Terminal の選択肢に表示されるようになる(はず)
- クリックして開くと、最初のユーザー登録のプロンプトが表示されるので、新規ユーザー名と新規パスワードを入力してユーザー作成を行う。
- これで、Ubuntu20.04 を自由に使えるようになる
雛形の WSL distro を export して複製の準備を行う
- まず、全ての WSL のターミナルを閉じます
- Powershell を開いて
wsl --list --all
を実行して、WSLにインストールされている Linux distro 一覧を表示します。
❯ wsl --list --all
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-18.04 (既定)
Ubuntu-20.04
- Microsoft store からインストールしたばかりの、
Ubuntu-20.04
があります。これを export します。
wsl.exe --export <DistributionName> <FileName>
-
<DistributionName>
- => Ubuntu-20.04 に書き換え(もしくは export したい distro に合わせて適宜変更する)
-
<FileName>
- => exportしてファイルに保存するので、保存先をフルパスで指定
- 例: C:\Users\me\WSL_distros\ubuntu2004Ruby.tar
- (Ruby 環境用 Ubuntu にしたいのでこの名前)
- ※tar の拡張子でファイル名を指定する
- => exportしてファイルに保存するので、保存先をフルパスで指定
上記シンタックスの通り、コマンドを実行します。
❯ wsl.exe --export Ubuntu-20.04 C:\Users\me\WSL_distros\ubuntu2004Ruby.tar
❯
- 結構時間かかります。プロンプトが帰ってくるまで待つ。(5分かかりました。ぐぐると、1hかかった人もいるようです。)
- コマンド実行が終わったら、保存先のファイルをエクスプローラーで見てみます
ubuntu2004Ruby.tar ファイルが保存されています
export した ubuntu2004Ruby.tar を import して、複製する
ubuntu2004Ruby.tar を wsl に import することで、実際に OS として使えるようになります。
下記のコマンドで wsl にインポートします。
wsl.exe --import <DistributionName> <InstallLocation> <FileName>
-
<DistributionName>
- これから import する distro に付ける名前
- Ruby 用の Ubuntu-20.04 なので tar ファイル名と同じく
ubuntu2004Ruby
とします。
-
<InstallLocation>
- import してインストールされる distro のインスタンスの任意の保存先。
-
vhdx
の拡張子のファイルが指定された保存先に保存されます。
-
<FileName>
- 先程 export した tar ファイルをフルパスで指定
上記 import コマンドを実行します
❯ wsl.exe --import ubuntu2004Ruby C:\Users\me\WSL_distros\ubuntu2004Ruby C:\Users\me\WSL_distros\ubuntu2004Ruby.tar
❯
- プロンプトが帰ってくるまで待ちます。特に何も表示されずプロンプトが帰ってきたら、成功しているはずです。
import して複製された distro を開いてみる
下記のコマンドで開けます
wsl --distribution ubuntu2004Ruby
-
--distribution
の引数には、import 時につけた名前を指定します。
Windows Terminal を開き直すと、選択肢にも表示されるようになります。
これで一旦 distro を複製して使える状態にはなりましたが、複製しただけだと、distro にログインするユーザーが root になってしまいます。
これだと、色々不便ありそうなので、自分のユーザーに設定します。
デフォルトのログインユーザーを root から自分のユーザーに変更する
-
まず複製した distro を root ユーザーで開きます
-
Microsoft store からインストールした直後に作成したユーザーの名前を使って、下記のコマンドを実行します
# id -u the-username-you-created
1000
- ↑の 1000 番をレジストリエディターで書き込みます。
- 書き込みを行うレジストリのパスは、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{MY-UUID}
- 下記スクショの DefaultUid という項目があると思うので、それに 1000 を書き込みます。
※1000 は10進数で指定する
上記の通り、レジストリエディターで変更を行ったあと、再度複製のdistroを開くと、最初に作成したユーザーでログインできるようになります。
レジストリエディタの設定のやり方については、下記の issue のコメントで見つけました。
不要になった WSL distro の削除
❯ wsl --list --all
- 現在インストールされている distro の一覧を表示
❯ wsl --unregister <DistributionName>
- 直前のコマンドで表示した distro 一覧の中から、削除したい distro の名前を指定して実行することで、その distro を削除できる。
お し ま い
以上です。
この先は、複製した distro に直接プログラミング言語などをインストールしていくだけです。同じ手順を踏むことで、言語別の環境などの用意ができるかと思います。OSの複製なので、複製をやりすぎると、ディスクの容量を圧迫するかもしれないので注意です(プレーンな Ubuntu 20.04 一個で2GB弱の容量が必要です) 。
WSLの使い方勉強中なので、説明間違っているところ多々あるような気がするのですが、ご指摘いただけたらとおもいます 🙇
(。。。。docker で良いよね?)
Discussion