WSLで systemd がサポートされたらしいので確認しました
昨日、仕事でCircleCIで動かすjobの単体テストをしたいな~って思って、Dockerを使おうとしたら、systemd=PID1じゃないよエラーが発生して systemctl が使えませんでした。
WSL2の systemd サポートを確認する
見覚えがあるエラー
systemctl
> System has not been booted with systemd as init system (PID 1). Can't operate.
> Failed to connect to bus: Host is down
「あ、これ見たことあるやつ!」と思ったので、Dockerのハンズオンの投稿を見直して「これは、Genie要るやつだ」って思い出しました。
さて、この systemctl のエラー、「正確には、どんなメッセージだったっけ?」って検索していたら「WSLでsystemdのPID=1に対応したらしいので試してみた」という記事が見つかりました!これはGenieをインストールしないくても良いってことですね。すてき!
プライベートの環境はWindows 11なので対象です。これは、試さなくては!WSL2を最新にして、Genieを起動せずにsystemdが使えればOKですね。
Genieを使用しない設定に変更
ターミナルの起動時に、Genieのコマンドライン実行が追加されているので、これを削除します。
Genieの起動時実行を削除します。
WSL2の最新をインストール
WSL2はインストール済なので、WSLのGitHubから最新をダウンロードしてきます。参考にした記事では、0.67.6でしたが、2022/11/6現在の最新は 0.70.4みたいです。ダウンロードができたら、インストールします。
よーし、インストールしてみよう!
あれ?
ターミナルの起動オプションからGenieを削除したのに、起動しています。これは .bashrc にGenieの起動がある?
削除してもいいけど、コメントアウトします。
今度はOKです!
systemctlお試し
systemctlを実行してみます。
うわぁ、話が違うでは!いきなり動きましたよ。というわけで、上記ブログで紹介されていた /etc/wsl.conf の編集は不要なのかな?
でも、PID=1はinitのままです。
改めて、Microsoft公式ドキュメント「WSL での詳細設定の構成」 にしたがって、/etc/wsl.conf に以下を追記して再起動してみました。
[boot]
systemd=true
PID=1のプロセスを確認します。
systemdのPIDは1ではないものの、systemctlは実行できます。
ps で表示したリストの中に、systemd+というのがあって、気になります。しかし、今日はここで時間切れです。
仕事用のPCはWindows 10なので、WSLのアップデートでsystemdが実行できるかどうかバージョンを確認しないと。こちらは、明日やります。
今週はここまで。続きは、また次の機会にやります。