WSL2環境を自動で作成する

# はじめに
[こちらの記事](https://qiita.com/smzn1222/items/31d074be4a258c51d59c)で紹介したWSL環境の作成がちょっぴり面倒くさいので、バッチファイルおよびシェルスクリプトを用いて自動化しました。<br>個人用のツールなので、もろもろ適当ですが、良かったら参考にしてください。

# 前提
- インポートしたいイメージファイルはダウンロード済みであること（[この辺](https://cloud-images.ubuntu.com/wsl/)から）
- フォルダ構成は下記
```bash
wsl
├── _buildingEnv  # 環境構築用の.batファイル・.shファイルを配置
│   ├── buildEnv.bat
│   ├── deleteEnv.bat
│   └── initializeEnv.sh
├── _imageFile  # インポートしたいイメージファイルはここに配置する
│   └── ubuntu-jammy-wsl-amd64-wsl.rootfs.tar.gz
└── env  # 環境はこのフォルダ以下に作成する
```

# 各ファイルの中身
- `buildEnv.bat`
WSL環境を構築する。エラーチェックをフォルダの存在のみでやっていたりハードコーディングしていたりとまあまあ適当だが、個人用ツールなので良しとする。<br>ポイントは`wsl -d %INPUT_ENV_NAME% ./initializeEnv.sh %USR_WSL%`の部分でbatファイル側からshファイルを実行している点。このような記法で、batファイルからWSL側の任意のコマンドを実行できる。
```shell:buildEnv.bat
@echo off
setlocal

@REM イメージファイルが正しく配置されているのが前提
:PROCEDURE_INIT
echo +-------------------------------------------------------+
echo 新規のWSL2環境を作成します。
echo _imageFileフォルダに所望のイメージが配置されていますか？
echo （Y / N）
set CONF_SELECT=
set /P CONF_SELECT=

if "%CONF_SELECT%"== set CONF_SELECT=Y
if /I NOT "%CONF_SELECT%"=="Y"  goto :PROCEDURE_END

@REM 環境名の入力
:INPUT_START
echo +-------------------------------------------------------+
echo 現在の環境
wsl -l -v
echo +-------------------------------------------------------+
echo 作成する環境の名前を入力してください。
set INPUT_ENV_NAME=
set /P INPUT_ENV_NAME=

@REM 簡単に入力チェック
:VALIDATE_NAME
if "%INPUT_ENV_NAME%"=="" goto :INPUT_START

@REM 作成しようとしている環境が存在するかどうかは簡易的にフォルダの有無でチェック
set WSL_DIR=%~dp0
set WSL_DIR=%WSL_DIR:~0,-2%
for %%A in (%WSL_DIR%) do set WSL_DIR=%%~dpA
set TAR_DIR=%WSL_DIR%env\%INPUT_ENV_NAME%
if exist %TAR_DIR% (
    echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    echo 既に存在する環境です。
    echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    goto :INPUT_START
)
 
:INPUT_CONF
echo +-------------------------------------------------------+
echo 環境名は[%INPUT_ENV_NAME%]でよろしいですか？
echo （Y / N）
set CONF_SELECT=
set /P CONF_SELECT=
 
if "%CONF_SELECT%"== set CONF_SELECT=Y
if /I NOT "%CONF_SELECT%"=="Y"  goto :INPUT_START

:BUILD_ENV
echo +-------------------------------------------------------+
echo [%INPUT_ENV_NAME%]を作成しています。
mkdir %TAR_DIR%
set IMAGE_PATH=%WSL_DIR%_imageFile\ubuntu-jammy-wsl-amd64-wsl.rootfs.tar.gz

wsl --import %INPUT_ENV_NAME% %TAR_DIR% %IMAGE_PATH% --version 2

echo インポートが完了しました。
echo +-------------------------------------------------------+
echo 下記を確認してください。
wsl -l -v
echo +-------------------------------------------------------+
@REM wslコマンドを用いてシェルスクリプトを呼び出し、WSL環境内の初期設定をする。
echo WSL環境の初期設定をします。
set /P USR_WSL=WSLで利用するユーザー名を入力してください：
wsl -d %INPUT_ENV_NAME% ./initializeEnv.sh %USR_WSL%
wsl -t %INPUT_ENV_NAME%
echo WSL環境の初期設定が完了しました。

:CONF_REPEAT
echo +-------------------------------------------------------+
echo 引き続き作成しますか？
echo （Y / N）
set CONF_SELECT=
set /P CONF_SELECT=
if "%CONF_SELECT%"== set CONF_SELECT=Y
if /I "%CONF_SELECT%"=="Y"  goto :INPUT_START
 
:PROCEDURE_END
echo +-------------------------------------------------------+
echo 終了します。
echo +-------------------------------------------------------+

endlocal

pause
exit
```

- `deleteEnv.bat`
不要なWSL環境を削除する。こちらもまあまあ適当。
```shell:deleteEnv.bat
@echo off
setlocal

:PROCEDURE_INIT
echo +-------------------------------------------------------+
echo 既存のWSL2環境を削除します。
echo 現在の環境は下記です。
wsl -l -v

:INPUT_START
echo +-------------------------------------------------------+
echo 削除する環境の名前を入力してください。
set INPUT_ENV_NAME=
set /P INPUT_ENV_NAME=

:VALIDATE_NAME
if "%INPUT_ENV_NAME%"=="" goto :INPUT_START

@REM 個人的にMicrosoft Storeからインストールした環境は消したくないのでハードコーディングでエラーチェック
if "%INPUT_ENV_NAME%"=="Ubuntu" (
    echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    echo その環境はこのbatで削除することはできません。
    echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    goto :PROCEDURE_END
)

@REM 作成しようとしている環境が存在するかどうかは簡易的にフォルダの有無でチェック
set TMP=%~dp0
set TMP=%TMP:~0,-2%
for %%A in (%TMP%) do set TMP=%%~dpA
set TAR_DIR=%TMP%env\%INPUT_ENV_NAME%
if not exist %TAR_DIR% (
    echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    echo 存在しない環境です。
    echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    goto :INPUT_START
)

:DELETE_ENV
echo +-------------------------------------------------------+
echo 環境を停止します。
wsl -t %INPUT_ENV_NAME%
echo [%INPUT_ENV_NAME%]を削除します。本当によろしいですね？
echo （Y / N）
set CONF_SELECT=
set /P CONF_SELECT=
if "%CONF_SELECT%"== set CONF_SELECT=Y
if /I NOT "%CONF_SELECT%"=="Y"  goto :PROCEDURE_END
wsl --unregister %INPUT_ENV_NAME%
rmdir %TAR_DIR%
echo 完了しました。
echo +-------------------------------------------------------+
echo 下記を確認してください。
wsl -l -v

:CONF_REPEAT
echo +-------------------------------------------------------+
echo 引き続き削除しますか？
echo （Y / N）
set CONF_SELECT=
set /P CONF_SELECT=
if "%CONF_SELECT%"== set CONF_SELECT=Y
if /I "%CONF_SELECT%"=="Y"  goto :INPUT_START

:PROCEDURE_END
echo +-------------------------------------------------------+
echo 終了します。
echo +-------------------------------------------------------+

endlocal

pause
exit
```

- `initializeEnv.sh`
WSL環境内の初期設定を行う。`buildEnv.bat`内で呼び出すので直接は使用しない。<br>vscodeのパスは適宜書き換えてご利用ください。
```shell:initializeEnv.sh
#!/bin/bash

# ユーザー設定
useradd -m -s $(which bash) $1
echo 'パスワードを設定してください。'
passwd $1
usermod -G sudo $1

# デフォルトユーザー設定
touch /etc/wsl.conf
echo [user] >> /etc/wsl.conf
echo default=$1 >> /etc/wsl.conf
echo [interop] >> /etc/wsl.conf
echo appendWindowsPath=false >> /etc/wsl.conf

# 初期ディレクトリ
echo 'cd ~' >> /home/$1/.bashrc

# PATH
echo export PATH=\$PATH:/mnt/c/WINDOWS/ >> /home/$1/.bashrc
echo export PATH=\$PATH:\"/mnt/c/Users/[user_name]/AppData/Local/Programs/Microsoft VS Code/bin\" >> /home/$1/.bashrc

# エクスプローラコマンドにエイリアス設定
echo alias ee=\'explorer.exe .\' >> /home/$1/.bashrc


# パッケージ最新化
apt update -q && sudo apt upgrade -yq
```

# 実行例
- `buildEnv.bat`
```text
+-------------------------------------------------------+
新規のWSL2環境を作成します。
_imageFileフォルダに所望のイメージが配置されていますか？
（Y / N）
y
+-------------------------------------------------------+
現在の環境
  NAME      STATE           VERSION
* Ubuntu    Running         2
+-------------------------------------------------------+
作成する環境の名前を入力してください。
test
+-------------------------------------------------------+
環境名は[test]でよろしいですか？
（Y / N）
y
+-------------------------------------------------------+
[test]を作成しています。
インポート中です。この処理には数分かかることがあります。
この操作を正しく終了しました。
インポートが完了しました。
+-------------------------------------------------------+
下記を確認してください。
  NAME      STATE           VERSION
* Ubuntu    Running         2
  test      Stopped         2
+-------------------------------------------------------+
WSL環境の初期設定をします。
WSLで利用するユーザー名を入力してください：test-user
パスワードを設定してください。
New password:
Retype new password:
passwd: password updated successfully

(中略)

この操作を正しく終了しました。
WSL環境の初期設定が完了しました。
+-------------------------------------------------------+
引き続き作成しますか？
（Y / N）
n
+-------------------------------------------------------+
終了します。
+-------------------------------------------------------+
続行するには何かキーを押してください . . .
```

正常に完了すれば、下記で起動可能。
```text:コマンドプロンプト
> wsl -d test
(中略)
test-user@XXXX:~$
```

- `deleteEnv.bat`
```text
+-------------------------------------------------------+
既存のWSL2環境を削除します。
現在の環境は下記です。
  NAME      STATE           VERSION
* Ubuntu    Running         2
  test      Running         2
+-------------------------------------------------------+
削除する環境の名前を入力してください。
test
+-------------------------------------------------------+
環境を停止します。
この操作を正しく終了しました。
[test]を削除します。本当によろしいですね？
（Y / N）
y
登録解除。
この操作を正しく終了しました。
完了しました。
+-------------------------------------------------------+
下記を確認してください。
  NAME      STATE           VERSION
* Ubuntu    Running         2
+-------------------------------------------------------+
引き続き削除しますか？
（Y / N）
n
+-------------------------------------------------------+
終了します。
+-------------------------------------------------------+
続行するには何かキーを押してください . . .
```