WSL2+Ubuntuの環境を構築してみる

WSL+Ubuntuの環境を設定する機会があったためメモを残します。

## タスク
 - WSL2のインストール&ディストリビューション導入
 - WSL2の設定追加
 - ディストリビューションの設定

# 作業環境
- Windows11 pro 23H2 (OSビルド :　22631.3880)

## WSL2のインストール&ディストリビューション導入
### 1. WSL2をインストール
powershellを管理者で開き、下記コマンドを実行。
`-d`オプションをつけてディストリビューションを明示することで、任意のディストリビューションをインストールすることも可。デフォルトはUbuntu

~~~powershell:powershell
wsl --install
~~~

~~~powershell:powershell : ディストリビューション指定ver
wsl --install -d <distro>
~~~

下記のようなメッセージが出力されればOK。
~~~:結果
インストール中：仮想マシンプラットフォーム
仮想マシンプラットフォームはインストールされました。
インストール中：Linux 用 Windows サブシステム
Linux 用 Windows サブシステムはインストールされました
インストール中：Ubuntu
Ubuntu はインストールされました
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
~~~

### 2. 再起動
メッセージに従ってPC再起動。

### 3. ユーザー名とパスワードの設定
ユーザー名とパスワードはディストリビューション固有のもの（windowsのアカウントではない）。それぞれお好みのユーザー名とパスワードを設定する。今回は、testUserで設定。

~~~:結果
Ubuntu は既にインストールされています。
Ubuntuを起動しています..
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: testUser
New password:
Retype new password: passwd: password updated successfully
~~~

ちなみにrootはダメ。rootユーザーは既に存在しているので当然ではある。
~~~
Enter new UNIX username: root adduser: The user root' already exists.
~~~

### 4. その他確認
Windows Terminalからexitして画面を閉じる。
powershellから下記コマンドを実行して、wslとディストリビューションが正しくインストールされているか確認。

~~~powershell:powershell : バージョンの確認
wsl -v
~~~

~~~powershell:powershell : ディストリビューションの確認
wsl -l -v
~~~

- 参考
[WSLを使用してWindowsにLinuxをインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install)

## WSL2の設定追加
wslのConfigファイルは2種類存在する。
- .wslconfig（グローバル設定）
- wsl.conf（ローカル設定）

### 1. .wslconfigの設定
`C:\Users\%UserProfile%`に`.wslconfig`という名前でファイルを作成。
`.wslconfig`内に下記の設定を追加。

~~~conf:.wslconfig
# wslが利用できるメモリ量の設定
# メモリ量は環境に合わせて調整
[wsl2]
memory=4GB
swap=0
~~~

### 2. wsl.confの設定
Windows Terminalからubuntuのコンソールを開く。
`wsl.conf`ファイルは/etc配下にあるのでそこまで移動。
~~~
cd /etc
~~~

次に、下記コマンドでwsl.confに設定を追加。
ホスト名は各自自由に設定する。（今回は例でTEST01と命名）
~~~
sudo vim ./wsl.conf
~~~

~~~conf:wsl.conf
# windowsファイルに対してLinuxのファイルメタデータをサポート
[automount]
options="metadata"

# windowsパスの引継ぎ無効化
[interop]
appendWindowsPath=false

# systemdの有効化
[boot]
systemd=true

# hosts, resolv.confの初期化を無効化
[network]
hostname="TEST01"
generateHosts=false
generateResolvConf=false

# ディストリビューションにログインする時のデフォルトユーザー
[user]
default="testUser"
~~~

デフォルトユーザーは`wsl.conf`ではなく下記のように設定することも可。
powershellから下記コマンドを実行して変更できる。
※`ubuntu`の部分は各々がインストールしたディストリビューション名

~~~powershell:powershell
ubuntu config --default-user <username>
~~~

~~~powershell:例 : powershell
ubuntu config --default-user testUser
~~~

### 3. 再起動
設定を追加したら一度情報を反映させるために再起動する。
powershellで下記コマンドを実行。

:::note info
構成変更の8秒ルール
ディストリビューションを実行中のサブシステムが完全に停止して設定が反映されるまで再起動を待つ必要がある。ディストリビューションシェルの全てのインスタンスを閉じてから約8秒程度。
`wsl -l --running`を実行すると、実行中のディストリビューションが存在するか確認できる。
:::

~~~powershell:powershell
# t:tarminate, l:list, d:distribution
wsl -l -v
wsl -t ubuntu
wsl -l --running
wsl -d ubuntu
~~~

- 参考
[WSL開発環境を設定する](https://learn.microsoft.com/ja-jp/windows/wsl/setup/environment)
[WSLでの詳細設定の構成](https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config)
[WSLの基本的なコマンド](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands)

## ディストリビューションの設定
### 1. resolv.confの作成と設定
`wsl.conf`で`generateResolvConf=false`の設定を入れているので、resolv.confを作成して名前解決を行えるようにする。下記コマンドで`resolv.conf`を作成して、作成したファイルに以下の設定を追記する。
~~~sh:resolv.conf作成コマンド
cd /etc/
ls | grep resolv.conf
sudo touch resolv.conf
sudo vim ./resolv.conf
~~~

~~~conf:resolv.conf
# 優先DNS
nameserver <自ネットワークのDNSのIP>

# 代替DNS
nameserver <自ネットワークのDNSのIP>

# ドメインは書かなくてもOK
domain <自ネットワークのドメイン名>
~~~

~~~conf:例 : resolv.conf
# 優先DNS
nameserver 8.8.8.8

# 代替DNS
nameserver 8.8.4.4
~~~

### 2. hostsの設定
この設定はホスト名を変更している場合のみ実施。hostsの中に下記の設定を追記する。
~~~sh
sudo vim /etc/hosts
~~~

~~~conf:hosts
127.0.1.1 <ホスト名>
~~~

~~~conf:例 : hosts
127.0.1.1 TEST01
~~~

### 3. proxyの設定
Proxy環境で環境構築する場合は実施。`.bashrc`の最終行にProxy URLの環境変数を追記。
ユーザー名とパスワードが必要な場合はURLにそれぞれ追加する。
ユーザー名とパスワードはProxyのもの。

~~~sh
cd ~
vim ./.bashrc
~~~

~~~conf:.bashrc
export HTTP_PROXY=http(s)://<proxy-host>:<proxy-port>
export HTTPS_PROXY=$(HTTP_PROXY)
#もしくは
export HTTP_PROXY=http://‹username>:<password>@<proxy-host>:<proxy-port>
export HTTPS_PROXY=$(HTTP_PROXY)
~~~

### 4. apt.confの設定
認証Proxy環境で`sudo apt update`を実行するとプロキシの影響でエラーになるため、`/etc/apt/apt.conf`に下記設定を追加する。

:::note warn
ユーザー名やパスワードに特殊文字が入っている場合はパーセントエンコードする。特に`@`マークなどはエラーの原因になるため、`%40`などでエンコード。
:::

~~~conf
Acquire::http::Proxy "http://<username>:<password>@<proxyhost>:<port>/":
Acquire::https::Proxy "https://<username>:<password>@<proxyhost>:<port>/";
Acquire::ftp::Proxy "ftp://<username>:<password>@<proxyhost>:<port>/";
~~~

### 5. /HOME/~にWindowsデスクトップのシンボリックリンクを作成
ユーザーディレクトリからWindows上のDesktopへ簡単にアクセスできるよう設定。
この設定が不要な方はスキップ。

~~~sh
cd ~
ln -s /mnt/c/Users/<Windowsのユーザー名>/Desktop
~~~

### 6. aliasの設定
下記コマンドを実行し、`.bashrc`の最終行に設定を追加する。
これでディストリビューション上からWindowsのソフトを実行できる。
今回は`エクスプローラ`と`vscode`のエイリアスを設定。

~~~sh
cd ~
vim ./.bashrc
~~~

~~~conf:.bashrc
# エクスプローラ
alias explorer="/mnt/c/WINDOWS/explorer.exe"

# vscode
alias code="/mnt/c/Users/<ユーザー名>/AppData/Local/Programs/Microsoft\ VS\ Code/bin/code"
~~~

全ての設定が終わったら再起動して設定を反映させる。

~~~powershell
# t:tarminate, l:list, d:distribution
wsl -t ubuntu
wsl -l --running
wsl -d ubuntu
~~~

- 参考
[「/etc/resol.conf」ファイルの設定](https://inuc.org/study/knowledge/507/)
[apt-407 プロキシ認証が必要です・Ubuntuに質問](https://askubuntu.com/questions/88976/407-proxy-autentication-required)

### 7. 最後に
パッケージを細心に更新

~~~sh
sudo apt update
~~~

## おまけ
設定を終えたらエクスポートしておくと、あとで設定がグチャった時にすぐリストアできる。

~~~powershell:powershell
wsl --export <ディストリビューション名> <書き出したいファイル名>
~~~

~~~powershell:例 : powershell
wsl --export ubuntu C:\wsl\ubuntu\backup-ubuntu.tar
~~~