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が動かない問題をきちんと解決する | しきゆらの備忘録