Software Berater Logo Software Berater #neuland seit 1993

Uhrzeit-Sync für WSL

WSL 2 hat auf Windows 11 einen ärgerlichen Bug: Wenn der Rechner in den Ruhezustand geht und danach wieder aufwacht, stimmt die Uhrzeit der WSL-Instanz nicht mehr. So sehr, dass viele Probleme mit Software entstehen. Zum Glück gibt es seit einiger Zeit systemd-Support für WSL2. Damit kann man sich helfen.

Auch wenn WSL issue 5324 als “gelöst” markiert wurde, tritt der Effekt weiterhin reproduzierbar auf: Die Uhrzeit der Linux-VM ist gegenüber der tatsächlichen Uhrzeit manchmal um Stunden hinterher - je nachdem, wie lange der PC zwischendurch im Ruhezustand war. Wenn man mit Software arbeitet, die zB zeitbasierte Zugangstoken ausstellt, dann wird das zum Problem: Anmeldung ist dann nicht mehr möglich. Auch Verschlüsselung und SSL-Token sind sensibel gegenüber falscher Uhrzeit und falschem Datum.

Eine einfache Lösung besteht darin, eine automatische Uhrzeit-Synchronisierung in der VM laufen zu lassen. Zum Glück gibt es seit September 2022 systemd Support in WSL - das gibt uns die Möglichkeit, den in Ubuntu eingebauten Dienst systemd-timesyncd zu verwenden.

Einrichtung von systemd-timesyncd

In der Datei /etc/systemd/timesyncd.conf konfigurieren wir unsere Uhrzeitquellen. Warum mehrere? Wer zB häufig im Büro ist, aber manchmal unterwegs, mag den heimischen NTP-Server als Quelle angeben. Ist diese nicht verfügbar, geht der Dienst automatisch zur nächsten konfigurierten Quelle. Bei mir schaut das so aus:

[Time]
NTP=fw.private 0.de.pool.ntp.org 1.de.pool.ntp.org 2.de.pool.ntp.org
FallbackNTP=ntp.ubuntu.com

Also, zuerst mein privater NTP-Dienst, dann die deutschen Server von ntp.org, und als Fallback, wenn nichts geht, der Ubuntu NTP-Server.

Nach Bearbeiten der Datei und Neustarten des systemd-Dienstes gibt das Kommando timedatectl status folgendes aus:

               Local time: Thu 2022-11-24 09:11:34 CET
           Universal time: Thu 2022-11-24 08:11:34 UTC
                 RTC time: Thu 2022-11-24 08:11:34
                Time zone: Europe/Berlin (CET, +0100)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no

NTP inactive? Was ist da los? systemctl status systemd-timesyncd verrät uns:

● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/etc/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
  Condition: start condition failed at Thu 2022-11-24 09:13:00 CET; 8min ago
       Docs: man:systemd-timesyncd.service(8)

Die “start condition failed”, so so. Wer einen Blick in die Servicedefinition1 wirft, entdeckt diese Zeile:

ConditionVirtualization=!container

Kurz gesagt, in virtualisierten Umgebungen (und dazu zählt WSL2) geht man davon aus, dass dieser Dienst nicht nötig ist, weil ja der Host (hier: Windows) die Uhrzeit der VM setzen sollte. Was WSL2 leider nicht tut, daher die Mühe. Aber wir müssen diese Bedingung hier abschalten.

Lokale Konfiguration für systemd-timesyncd

Anstatt jetzt die originale Datei aus der Ubuntu-Distribution zu bearbeiten, kennt systemd einen besseren Weg: Das lokale Bearbeiten von unit-Dateien (man Page).

systemctl edit --full systemd-timesyncd

Jetzt kommentiert man zB die Condition-Anweisung einfach aus, und fertig ist die Änderung. Das gute am edit-Kommando ist, dass man sich keine Gedanken um richtige Dateinamen und Berechtigungen machen muss, dass erledigt systemd - incl abschließendem Neuladen der Definitionen.

Nur noch einen Neustart des Dienstes systemctl restart systemd-timesyncd und ein abschließendes systemctl status systemd-timesyncd sollte diese Ausgabe zeigen:

● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/etc/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-11-24 09:21:20 CET; 1s ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 1778 (systemd-timesyn)
     Status: "Connecting to time server 192.168.1.1:123 (fw.private)."
      Tasks: 2 (limit: 19185)
     Memory: 1.5M
     CGroup: /system.slice/systemd-timesyncd.service
             └─1778 /lib/systemd/systemd-timesyncd

Na also, der Dienst synchronisiert fortan die Uhrzeit. Herzlichen Glückwunsch!

  1. /lib/systemd/system/systemd-timesyncd.service