Wie führe ich fake-hwclock aus, bevor /var/log/wtmp aktualisiert wird?

Wie führe ich fake-hwclock aus, bevor /var/log/wtmp aktualisiert wird?

Ich habe einen Raspberry Pi und bei jedem Neustart sehe ich zuletzt diese Ausgabe:

root@RaspberryPi:~# last | grep boot
reboot   system boot  4.4.0-1055-raspi Thu Jan  1 01:00   still running
reboot   system boot  4.4.0-1055-raspi Thu Jan  1 01:00   still running
reboot   system boot  4.4.0-1055-raspi Thu Jan  1 01:00 - 23:01 (17305+22:01)
reboot   system boot  4.4.0-1055-raspi Thu Jan  1 01:00 - 23:01 (17305+22:01)
reboot   system boot  4.4.0-1055-raspi Thu Jan  1 01:00 - 23:01 (17305+22:01)

Und das, obwohl sowohl eine Fake-HWClock als auch eine Hardware-RTC installiert sind.

Derzeit wird der Dienst für fake-hwclock.service vor sysinit.target gestartet, und zwar folgendermaßen:

[Unit]
Before=sysinit.target

[Service]
ExecStart=/sbin/fake-hwclock load

[Install]
WantedBy=sysinit.target

Wie kann ich es ausführen, bevor /var/log/wtmp aktualisiert wird?

Antwort1

Ich glaube, dass dies ein Fehler in systemd-update-utmp ist. Siehe meinen Kommentar hier:https://github.com/systemd/systemd/issues/6057#issuecomment-435247567

Eine Problemumgehung besteht darin, fake-hwclock in initramfs auszuführen, bevor die Kontrolle an die Hauptinstanz von systemd übergeben wird.

Antwort2

wtmp-„Reboot“-Anmeldedatensätze werden vom systemd-service systemd-update-utmp gehandhabt. Er muss vor dem Sysinit-Ziel gestartet werden, was bedeutet, dass dieser Dienst vor Abschluss des Starts gestartet wird, FALLS er nicht bereits gestartet wurde. Das bedeutet nicht, dass systemd-timesyncd unbedingt vor systemd-update-utmp gestartet wird.

Ich habe es auf meinem Arch-Linux-Server getestet und systemd-timesyncd läuft immer deutlich vor systemd-update-utmp. Andererseits sind sie fast immer einen PID voneinander entfernt.

Da es aber nicht explizit nach NTP ausgeführt wird, sollte dies vermutlich dennoch als Fehler betrachtet werden.

Aus dem systemd-Handbuch:

"After= ist dasUmkehrungvon Before=, d. h. während After= dafür sorgt, dass die konfigurierte Einheit gestartet wird, nachdem die aufgelistete Einheit den Startvorgang abgeschlossen hat"

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

Was du machen solltest:

systemctl edit systemd-update-utmp

[Unit]
After=systemd-timesyncd.service
Wants=systemd-timesyncd.service

verwandte Informationen