WSL2上にインストールしたUbuntuからsystemdにてdockerを起動しようとした際に、起動できず軽くハマってしまったため備忘として残します。
環境
- Windows11
- WSL2
- Ubuntu 22.04.3 LTS
- Docker Engine
エラー概要
WSL上のUbuntuにインストールしたDockerを起動しようとしたら以下のエラーが発生。
ssytemdがPID=1になっていないことが原因らしい。
XXX@XXX:~$ systemctl status docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
プロセスからPIDを確認
確認するとPID=1は、/init
が実行されている。
XXXX@XXX:~$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1824 1192 ? Sl 11:29 0:00 /init
root 11 0.0 0.0 1812 84 ? Ss 11:29 0:00 /init
root 12 0.0 0.0 1812 92 ? S 11:29 0:00 /init
systemdの実体は/sbin/init
のため、本来は/sbin/init
がPID=1で実行されていないといけない。
XXX@XXX:~$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Sep 20 2023 /sbin/init -> /lib/systemd/systemd
試したこと
以下の流れにて、原因を確認してエラーを解決した。
WSL側でSystemdが有効になっているか確認
上記サイトを参考に/etc/wsl.conf
を確認。
systemdを利用するパラメータは設定されている。
[boot]
systemd=true
WSLを再起動すれば、有効化されると判断し、Powershellから以下コマンドを実行。
wsl --shutdown
再度、WSL上のUbuntuからsystemdが実行できるか確認したが、同じエラーが出力され解決せず。。。
WSLのバージョンアップ
WSLのバージョンを確認していなかったため、バージョンを確認。
コマンドラインオプションが無効になっている。。。
wsl --version
コマンド ライン オプションが無効です: --version
ここで、WSLをアップデートしていなかったことに気づき、WSLをアップデート。
wsl --update
WSLをアップデート後、WSLを再起動。
wsl --shutdown
PowershellからWSLのバージョンを確認。
wsl --version
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
Systemd動作確認
その後、プロセスからPIDを確認し、/sbin/init
ファイルが実行されていることを確認。
XXX@XXX:~$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 4.8 0.0 167140 12608 ? Ss 13:57 0:00 /sbin/init
root 2 0.0 0.0 2280 1304 ? Sl 13:57 0:00 /init
systemdからDockerデーモンのステータスも確認。
以下から、問題なく実行できていることが確認できた。
XXX@XXX:~$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-04-17 15:44:42 JST; 3h 13min ago
TriggeredBy: ● docker.socket
無事、systemdを有効化させることができた。
まとめ
普段、WSLを使用しないこともあり、軽くハマってしまいました。
公式ドキュメントへの不十分な理解が原因であったことを認識し、今後はより注意深く取り組むように反省しています。