🐧

複数の WSL (Linux インスタンス) をコピーして使う

2021/03/21に公開

windows でウェブ開発するときは wsl を使うと簡単に linux 環境が使えるので便利です。
私は基本的に Ubuntu18.04 の distro をインストールして使っています。

最近知ったのですが、 WSL の distro インスタンスを export/import して、複製できます。
これを使うと、開発で使用する言語に応じて、linux を使い分けることができるので、環境をきっちり分けたいときに便利かもです。今回は PHP 用 Ubuntu と Ruby 用 Ubuntu のインスタンスを作ってみたいと思います。

なお、下記の記事を参考にしました。こちらも参照したほうが良いかもしれません。

https://winaero.com/export-import-wsl-linux-distro-windows-10/

雛形となるプレーンな 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 一覧を表示します。
Powershell
❯  wsl --list --all
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-18.04 (既定)
Ubuntu-20.04
  • Microsoft store からインストールしたばかりの、 Ubuntu-20.04 があります。これを export します。
wsl export の シンタックス
wsl.exe --export <DistributionName> <FileName>
  • <DistributionName>
    • => Ubuntu-20.04 に書き換え(もしくは export したい distro に合わせて適宜変更する)
  • <FileName>
    • => exportしてファイルに保存するので、保存先をフルパスで指定
      • 例: C:\Users\me\WSL_distros\ubuntu2004Ruby.tar
      • (Ruby 環境用 Ubuntu にしたいのでこの名前)
      • ※tar の拡張子でファイル名を指定する

上記シンタックスの通り、コマンドを実行します。

Powershell
❯ 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 import の シンタックス
wsl.exe --import <DistributionName> <InstallLocation> <FileName>
  • <DistributionName>
    • これから import する distro に付ける名前
    • Ruby 用の Ubuntu-20.04 なので tar ファイル名と同じく ubuntu2004Ruby とします。
  • <InstallLocation>
    • import してインストールされる distro のインスタンスの任意の保存先。
    • vhdx の拡張子のファイルが指定された保存先に保存されます。
  • <FileName>
    • 先程 export した tar ファイルをフルパスで指定

上記 import コマンドを実行します

Powershell
❯ 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 からインストールした直後に作成したユーザーの名前を使って、下記のコマンドを実行します

bash ターミナル
# id -u the-username-you-created
1000
  • ↑の 1000 番をレジストリエディターで書き込みます。
  • 書き込みを行うレジストリのパスは、HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{MY-UUID}
  • 下記スクショの DefaultUid という項目があると思うので、それに 1000 を書き込みます。

    ※1000 は10進数で指定する

上記の通り、レジストリエディターで変更を行ったあと、再度複製のdistroを開くと、最初に作成したユーザーでログインできるようになります。

レジストリエディタの設定のやり方については、下記の issue のコメントで見つけました。
https://github.com/microsoft/WSL/issues/4276#issuecomment-509364493

不要になった WSL distro の削除

Powershell
❯ wsl --list --all
  • 現在インストールされている distro の一覧を表示
Powershell
❯ wsl --unregister <DistributionName>
  • 直前のコマンドで表示した distro 一覧の中から、削除したい distro の名前を指定して実行することで、その distro を削除できる。

お し ま い

以上です。
この先は、複製した distro に直接プログラミング言語などをインストールしていくだけです。同じ手順を踏むことで、言語別の環境などの用意ができるかと思います。OSの複製なので、複製をやりすぎると、ディスクの容量を圧迫するかもしれないので注意です(プレーンな Ubuntu 20.04 一個で2GB弱の容量が必要です) 。

WSLの使い方勉強中なので、説明間違っているところ多々あるような気がするのですが、ご指摘いただけたらとおもいます 🙇

(。。。。docker で良いよね?)

Discussion