🐧

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

5 min read

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弱の容量が必要です) 。

Docker を使ったほうが良さそうな気がするのですが、Docker 使ったこと無いので、とりあえずこれが自分にとってはいい環境の作り方かなと思ってます。

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

Discussion

ログインするとコメントできます