WSL 2 の Ubuntu 20.04 で timesyncd が動いてない
タイトルは timesyncd ですが、systemctl が動かない、というのが本題です。
WSL 2 で Ubuntu 20.04 を操作していたときのこと。git commit
したときにコミット時間に数時間のズレが生じていることに気が付きました。
そこで timesyncd
による時間の同期が動いているのか確認してみたところ、そもそも systemctl
が動作しなかった、というものです。そのとき返されたエラーは以下のようなものでした。
$ systemctl status systemd-timesyncd.service
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
System has not been booted with systemd as init system (PID 1).
を見る限り、systemd が init system (PID 1) で起動していない、といったものでしょうか。
環境
- Windows 10 Build 19041
- WSL 2
- Ubuntu 20.04
> Get-WmiObject Win32_OperatingSystem
BuildNumber : 19041
Version : 10.0.19041
> wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
Ubuntu Running 1
結果だけ教えて
以下のコマンドで動くようになります。
$ curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
$ sudo apt install -y systemd-genie
$ genie -s
$ sudo systemctl start systemd-timesyncd.service
$ systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-09-06 01:07:02 JST; 4s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 3877 (systemd-timesyn)
Status: "Initial synchronization to time server 216.239.35.12:123 (time.google.com)."
Tasks: 2 (limit: 15076)
Memory: 1.8M
CGroup: /system.slice/systemd-timesyncd.service
└─3877 /lib/systemd/systemd-timesyncd
段階的なトラブルシュートの手順は以下のとおり。
トラブルシュート
さて、そもそも systemd と PID 1 には、どのような関係があるのでしょうか。わたしの場合、そもそも そこから理解できていなかったため、少し調べてみたところ、Arch linux のマニュアルに以下のような記述を見つけました。
https://man.kusakata.com/man/systemd.1.html
systemd は Linux オペレーティングシステム用のシステム・サービスマネージャです。起動したときの最初のプロセス (PID 1) として実行することで、ユーザー空間のサービスを立ち上げたり管理する init システムとして機能します。
なるほど、わかりやすいです。systemd が PID 1 で起動していないと、systemtl は動かないということのようです。では PID 1 では何が動いているのでしょうか。
$ ps u -p 1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 892 576 ? Sl 00:26 0:00 /init
init
プロセスが動いているようです。これが systemd
になれば、やりたいことを達成できそうです。
この問題は WSL の GitHub でも既に報告されており、以下の Issue が見つかります。
この Issue を参考にすると、genie
(ジーニー) というツールを使用することで解決できるようです。
こちらの README を参考にしてみると、まず以下のようにインストールをします。
$ curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
$ sudo apt install -y systemd-genie
インストールが完了したら、以下のコマンドを実行します。
$ genie -s
ここで改めて PID 1 を確認してみると以下のようになります。
$ ps u -p 1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 13.1 0.1 175272 13892 ? Ss Sep04 219:57 systemd
systemd に PID 1 があたりました。では timesyncd を起動してみます。
$ sudo systemctl start systemd-timesyncd.service
$ systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-09-06 01:07:02 JST; 4s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 3877 (systemd-timesyn)
Status: "Initial synchronization to time server 216.239.35.12:123 (time.google.com)."
Tasks: 2 (limit: 15076)
Memory: 1.8M
CGroup: /system.slice/systemd-timesyncd.service
└─3877 /lib/systemd/systemd-timesyncd
バッチリ動作したようです。よかった。