Как запустить fake-hwclock до обновления /var/log/wtmp?

Как запустить fake-hwclock до обновления /var/log/wtmp?

У меня Raspberry Pi, и при каждой перезагрузке я вижу следующий вывод:

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)

И это несмотря на то, что установлены как поддельные hwclock, так и аппаратные RTC.

В настоящее время служба fake-hwclock.service запускается до sysinit.target, вот так:

[Unit]
Before=sysinit.target

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

[Install]
WantedBy=sysinit.target

Как мне заставить его запуститься до обновления /var/log/wtmp?

решение1

Я считаю, что это ошибка в systemd-update-utmp. Смотрите мой комментарий здесь:https://github.com/systemd/systemd/issues/6057#issuecomment-435247567

Обходной путь — запустить fake-hwclock в initramfs, прежде чем он передаст управление основному экземпляру systemd.

решение2

Записи входа wtmp "reboot" обрабатываются службой systemd systemd-update-utmp. Она должна запускаться до цели sysinit, что означает, что до завершения запуска эта служба запустится, ЕСЛИ она еще не была запущена. Это не означает, что systemd-timesyncd обязательно запустится до systemd-update-utmp.

Я тестировал на моем сервере Arch Linux, и systemd-timesyncd всегда запускается намного раньше systemd-update-utmp. С другой стороны, они почти всегда находятся на расстоянии одного pid друг от друга.

Но поскольку он явно не работает после NTP, я полагаю, это все равно следует считать ошибкой.

Из руководства systemd:

"После = этообратныйBefore=, т.е. в то время как After= гарантирует, что настроенный блок будет запущен после того, как указанный блок завершит запуск"

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

Что ты должен делать:

systemctl edit systemd-update-utmp

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

Связанный контент