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

バッチリ動作したようです。よかった。

参考

Written by yo1000 | YO!CHI KIKUCHI Loves Spring, Kotlin, Pelikan Fountain pen and FINAL FANTASY VIII!! 🍃🐦🖋️🗡️ GitHub Twitter