WSL2でsystemctlを使う方法

PCをMacからWindowsに買い替えてWSLにてローカル環境構築している際の備忘録。

LAMP環境を作っている際にこんなエラーが・・・

```
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```

`systemctl`が使えない・・・だと？

ということで、調べていくと以前は使うにはいろいろな手順を踏む必要があったようですが、今は簡単に導入できるみたいなのでやってみます。

# 必要条件確認 & WSLのアップデート
[公式ブログ](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/)の情報によると
> his change is only available in the Microsoft Store version of WSL version 0.67.6 and higher. You can check your version number by running wsl --version.

とのことで、WSLバージョンは0.67.6以上で使えるみたいです。
早速`Windows PowerShell`を起動してバージョンを確認してみます。
バージョンの確認方法は、ブログにあるように`wsl --version`で確認できるようです。
私の環境で出力された結果が以下の通り(2023/1時点)

```powershell
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.1105
```

このWSLバージョンが既定の0.67.6以上なので問題なさそうです。
公式ブログの記事では`wsl --update`で更新確認もできるとあったのでついでに試してみます。

```powershell
> wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。
```

とりあえず最新みたいです。
このまま続けます。

# 設定ファイルを設置
[公式ブログ](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/)によると、
> Add these lines to the /etc/wsl.conf (note you will need to run your editor with sudo privileges, e.g: sudo nano /etc/wsl.conf):
[boot]
systemd=true

とのことなので、従って追加していきます。
今度はWSLのターミナル(WSL環境のUbuntu)を開いて作業をしていきます。
`wsl.conf`というファイルを`/etc/wsl.conf`に設置するみたいです。
この時注意なのが、wsl環境上の`/`パスはコマンドプロンプトやPowerShellの`/`とは場所が違うので注意です。
もしもフォルダなどで開く際には`\\wsl$/ディストリビューション名/etc`に該当しますのでこちらを検索してみてください。

早速ファイルを作成して書き込みます。
```
ubuntu > sudo vim /etc/wsl.conf
```

私の場合は`vim`を使用していますが、ご自身の環境に合わせてこちらを書き換えてください。
これでwsl.confを編集し、下記を追加します。

```
[boot]
systemd=true
```

書き込んだら保存して最後のステップです

# WSLの再起動
`wsl.conf`に書き込んだらWSLを再起動します。
またPowerShellを起動して次のコマンドを実行します。

```powershell
wsl --shutdown
```

これでWSLが再起動されるので、再度WSL環境に入ってみます。
再度WSLのターミナル(WSL環境のUbuntu)を起動してください。

起動後`systemctl`コマンドを実行します。

```
ubuntu > systemctl
  UNIT                                                                                                     
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-1c77dc32\x2dda4b\x2d4dda\x2db0ba\x2d47a2b946ec6e...
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-e249ac6e\x2d2779\x2d4bc0\x2d8373\x2dcb9eb2559fb0...
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0...
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0...
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0...
  sys-devices-platform-serial8250-tty-ttyS0.device                                                         ...
  sys-devices-platform-serial8250-tty-ttyS1.device                                                         ...
  sys-devices-platform-serial8250-tty-ttyS2.device                                                         ...
....
```
実行したら上のような結果が表示されたら完了です。
これで`systemctl`が使用できます！

## あとがき
`PowerShell`で操作したりとMacとは違う部分があり迷いましたが、そこさえ迷わなければ何とかなります。
今後LAMP環境構築についても別記事でメモを残しておこうと思います。

以上！

# 参考にした記事
https://crieit.net/posts/systemd-supported-in-wsl
https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/