WSL2上でsystemctlコマンドを実行できない事を解決

序章

いつインストールしたのか?忘れたほど昔に入れたWSL2を動かしました。

OSとして動かしてのはUbuntu。windows11 -> WSL2 -> Ubuntuという構成。です。

 

この環境下でphpを学習する環境構築を開始しようと色々模索していたのですが、

その過程で

「sudo systemctl status apache2」を実行すると

 

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

 

というエラーメッセージが出てしまいました。それを解決するまで調べた事を記事に

纏めておきます。

 

エラーが出てしまう原因

systemctlを実行するには、Linux上で最初に起動するプロセス PID 1 (Process ID 1)がsystemdである事が必要であるが、PID1がsystemdではない為。エラーになっています。

 

プロセスの確認方法

ps -aux

コマンドを入力する事で、プロセスの状態を把握します。

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2324 1504 ? Sl 15:02 0:00 /init

 

PID 1をみると、systemdではなく、init になっている事が分かります。

 

解決方法(概要)

PID1を initではなく、systemdに変更しましょう。

 

WSL2のバージョン確認

コマンドプロンプト上で wsl --version と入力し、WSL2のバージョンが表示されるか?確認してください。

 

WSL バージョン: 1.1.6.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.50
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.1413

 

上記のようにバージョンがずらずらと表示されれば、インストールされているWSL2は

Microsoft Store版」です。

しかし、上記のような表示がされず、wslのコマンドヘルプが出るのであれば、入っているWSL2は「Windows コンポーネント版」です。

 

Windows コンポーネント版に対する対応策もあるようですが、本記事ではそちらには触れません。素直に、Windows コンポーネント版をMicrosoft Store版に変更して下さい。

 

変更するにはコマンドプロンプトにて「wsl --update」と入力します。

updateが開始され、自動的にMicrosoft Store版に変更されるはずです。

 

解決方法(本題)

Ubuntu上に/etc/wsl.confを作成し、wsl.confに以下を記述します。

[boot]
systemd=true

 

ファイル保存した後、コマンドプロンプトで「wsl --shutdown」を入力し、wslを再起動させます。その後、Ubuntuを立ち上げるとsystemctlを使う事が出来るようになっています。

 

ps -auxで変化を見てみてください。

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 165888 11064 ? Ss 16:22 0:00 /sbin/init

今度はPID1が /sbin/initに変更されています。

 

/sbin/initはシンボリックリンクになっており、実際には

lrwxrwxrwx 1 root root 20 Sep 10 2022 init -> /lib/systemd/systemd*

systemdが使われている事になります。

 

参考記事

【WSL2】systemctlが動かない問題をきちんと解決する | しきゆらの備忘録

 

devblogs.microsoft.com

 

atmarkit.itmedia.co.jp

 

ascii.jp