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!
/lib/systemd/system/systemd-timesyncd.service