WSL2をインストールしてネイティブなSystemdを使う。

# はじめに
先日、自宅PCの（おそらく）マザーボードが故障して起動できなくなってしまったので、以前使っていたノートPCをフォーマットして故障したPCの代わりに`Windows11`をセットアップしました。

その際、`WSL`のインストール・セットアップに色々あって手間取ったのと、そういえば最近の`WSL`は、[以前](https://qiita.com/sakai00kou/items/0b401faf6dd72ad63d87)のように追加パッケージをインストールしなくてもネイティブに`Systemd`を動かせるようになっていたなと思い、セットアップした結果を紹介します。

- 【次】[WSL2のUbuntu 22.04.3 LTSにリモートデスクトップ接続する。（その２’：xrdpインストール）](https://qiita.com/sakai00kou/items/c3f2e4043765aad0651f)

- 以前の記事
    - [WSL2のUbuntuにリモートデスクトップ接続する。（その１：genieインストール）](https://qiita.com/sakai00kou/items/0b401faf6dd72ad63d87)
    - [WSL2のUbuntuにリモートデスクトップ接続する。（その２：xrdpインストール）](https://qiita.com/sakai00kou/items/e2523b6c195693e8f184)

## WSLの準備
`WSL`を実行するために必要となる事前の準備を行います。

手順は公式ドキュメントにまとまっているので、基本的な手順は以下に沿って進めます。

- [以前のバージョンの WSL の手動インストール手順](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual)

以下目次

- [Windowsターミナルの設定](#windowsターミナルの設定)
- [サービスの有効化](#サービスの有効化)
- [Linuxカーネル更新プログラムパッケージのインストール](#linuxカーネル更新プログラムパッケージのインストール)
- [WSLのデフォルトバージョン変更](#wslのデフォルトバージョン変更)
- [Ubuntuのインストール](#ubuntuのインストール)

### Windowsターミナルの設定
`WSL`セットアップ時、何度か`PowerShell`を管理者モードで起動する必要があるため、Windowsターミナルで`PowerShell`の管理者モードを起動できるようにしておきます。

Windowsターミナルを起動し、メニューから「**設定**」を選択。

![Monosnap_20240128_094227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/99560611-47b6-de4d-eacb-fb92765ba941.png)

「**新しいプロファイルを追加します**」から、複製元のプロファイルで「**Windows PowerShell**」を選択して、「**複製**」を選択します。

![Monosnap_20240128_094437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b1b4fccc-61e9-668b-bd13-8df8d697720b.png)

![Monosnap_20240128_094613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/0b92661c-4446-d987-90e5-6cf558bccafd.png)

「**名前**」を任意（今回は「**Windows PowerShell (管理者)**」）で入力して、「**このプロファイルを管理者として実行する**」のトグルスイッチをオンにして「**保存**」すれば、次からは`PowerShell`を管理者モードで簡単に起動することができます。

### サービスの有効化
`WSL`を使えるようにするため、「**Linux用Windowsサブシステム**」と「**仮想マシンプラットフォーム**」の有効化を行います。

Windowsメニューより、「**システム**」→「**システム**」→「**オプション機能**」→「**Windowsのその他の機能**」からGUIでも設定できますが、今回は公式ドキュメント通りコマンドで実行します。

Windowsターミナルを起動して、「**＋**」ボタンから先程設定した管理者モードで起動する`PowerShell`を選択して以下コマンドを実行します。

```powershell:Linux用Windowsサブシステムと仮想マシンプラットフォームの有効化
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

上記設定後、`Windows`の再起動を行う必要があるので一度再起動しておきます。

再起動後、`WSL`のコマンドを実行して、以下のように出力されることを確認して、もし失敗するようであれば「**[エラーが発生した場合の対処](#エラーが発生した場合の対処)**」を実行してみてください。

```powershell:
PS C:\Users\username> wsl
Linux 用 Windows サブシステムには、ディストリビューションがインストールされていません。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore
```

### Linuxカーネル更新プログラムパッケージのインストール
以下のページのリンクにある、「**x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ**」から最新パッケージをダウンロードしてインストールします。

- [手順 4 - Linux カーネル更新プログラム パッケージをダウンロードする](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)

### WSLのデフォルトバージョン変更
`WSL`には`Version1`と`Version2`がありますが、`Version2`をデフォルトにするため、以下コマンドを実行します。

```powershell:WSL2をデフォルトバージョンに指定
wsl --set-default-version 2
```

### Ubuntuのインストール
「**Microsoft Store**」から「**Ubuntu**」を検索してインストールします。

インストール後、作成するユーザ名とパスワードを聞かれるため、それぞれ任意のユーザ名、パスワードを入力します。

```bash:
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: [ユーザ名を入力]
New password: [パスワードを入力]
Retype new password: [パスワードを入力]
passwd: password updated successfully
Installation successful!
```

## Systemdの有効化
以下より`Systemd`を有効化していきます。

`Systemd`も以下公式ドキュメントに沿って進めていきますが、公式ドキュメントによると、すでに`init`システムの既定値が`Systemd`に変更となっているとのことなので、私のように新たに`Windows`をインストールした方は作業不要かもしれません。

- [systemd を使用して WSL で Linux サービスを管理する](https://learn.microsoft.com/ja-jp/windows/wsl/systemd)

今回私が実施した手順に沿って以下進めていきます。

- [WSLのアップデート](#wslのアップデート)
- [Systemdの確認・有効化](#systemdの確認有効化)

### WSLのアップデート
`WSL`のコマンドはそのままではバージョンが古い場合があり、そのままでは`wsl --version`といったいくつかのコマンドが実行できないことがあるようです。

そのため、`PowerShell`より、以下コマンドを実行して`WSL`をアップデートします。

```powershell:WSLのアップデート
wsl --update
```

アップデート後、もし`WSL`コマンドが実行できなくなったり、`Ubuntu`にログインできなくなってしまった場合は「**[エラーが発生した場合の対処](#エラーが発生した場合の対処)**」を参考にしてみてください。

### Systemdの確認・有効化
`Systemd`の有効化は、今まで操作してきた`PowerShell`からではなく、`Linux`（今回の場合は`Ubuntu`）側のコマンドラインを操作して有効化する必要があります。

今回の手順通りに進めている場合、「**Windowsターミナル**」から`Ubuntu`を実行できるようになっているはずなので、`Ubuntu`を起動し、`wsl.conf`ファイルを確認します。

```bash:wsl.confの確認
cat /etc/wsl.conf
```

ファイルを確認し、`systemd`の設定が`true`になっていれば`Systemd`が有効になっています。

```bash:systemd設定の確認
[boot]
systemd=true
```

もし上記の設定になっていないようであれば、`vi`等で編集した後、`wsl --shutdown`コマンドで停止します。

```powershell:Ubuntuの停止
wsl --shutdown Ubuntu
```

停止後、Windowsターミナルから`Ubuntu`のターミナルを起動すると停止した`Ubuntu`が起動してくるので、`Ubuntu`のコマンドラインから、以下のような`Systemctl`コマンドを実行して結果が表示されれば問題ありません。

```bash:Systemd動作の確認
systemctl list-unit-files --type=service
```

# エラーが発生した場合の対処
通常、Windowsサブシステムと仮想マシンプラットフォームを有効化すれば、`WSL`のコマンドが実行できるようになるはずですが、私の環境では「**クラスが登録されていません**」と表示され、実行できませんでした。

```powershell:コマンドが失敗した際の例
PS C:\Users\username> wsl
クラスが登録されていません
Error code: Wsl/CallMsi/REGDB_E_CLASSNOTREG
```

`wsl --update`でアップデート後にも上記の`WSL`エラーが再度出力されるようになったり、また`Ubuntu`ログインしようとした際にも以下のようなエラーが出力されるようになりました。

```bash:Ubuntuログイン時のエラー
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x8007019e
Error: 0x8007019e Linux ? Windows ??????????????????

Press any key to continue...
```

その時の私の環境情報等も載せておきます。

|項目|パラメータ|
|:--|:--|
|エディション|Windows 11 Pro|
|バージョン|23H2|
|OS ビルド|22631.3085|
|エクスペリエンス|Windows Feature Experience Pack 1000.22684.1000.0|
|プロセッサ|AMD Ryzen 7 3700U with Radeon Vega Mobile Gfx 2.30 GHz|
|実装RAM|16.0 GB|

私の環境だけではなく、同じような事象が報告されているようで、以下参考にさせて頂いたページを見ると、バージョンによるバグのようです。

- [Error code: Wsl/CallMsi/REGDB_E_CLASSNOTREG #10882](https://github.com/microsoft/WSL/issues/10882)
- [アップデートしたらWSLが起動しなくなった（2023/11）](https://qiita.com/laineus/items/c91afe2fd44ba497bccc)

中々現状の`WSL`のバージョンを確認する方法が見つかりませんでしたが、`PowerShell`の管理者モードで以下ディレクトリ名を見ることでなんとか確認しました。

```powershell:WSLのバージョン確認
> ls 'C:\Program Files\WindowsApps\microsoftCorporationii*'


    ディレクトリ: C:\Program Files\WindowsApps


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/01/28     13:20                microsoftcorporationii.windowssubsystemforlinux_2.0.14.0_x64__8wekyb3d8bbwe
```

私の場合、作業実施時の安定リリース版最新となる`2.0.14.0`でしたが、サービスを入れ直したりしても変わらなかったため、以下`Microsoft WSL`の`GitHub`ページより、作業時のプレリリース版最新となる`2.1.1`をインストールしたところ、問題が発生しなくなりました。

- [Microsoft WSL リリースページ](https://github.com/microsoft/WSL/releases)

同じように失敗する方がいれば参考にしてもらえればと思います。

# おわりに
今までは`WSL`で`Systemd`サービスを実行するためには、オープンソースのユーザパッケージをインストールしたりしないと使えなかったので、仮想`Linux`として使用するにはちょっと難しい部分がありましたが、ネイティブで`Systemd`が実行できるようになったことで、`WSL`でもかなり使えるようになったと感じました。

ただ、`Systemd`がネイティブで実行できるようになったからなのか、`WSL`自体のインストール・セットアップは以前より不安定になっているなと個人的に感じました。