伙计们!
我有一台单板计算机(HardKernel Odroid C2),它没有内置的RTC,在每次系统启动时都需要一个外部的时间源。虽然我有一个本地的NTP服务器,我也需要RTC,以防发生罕见的电源故障,这将迫使NTP服务器重新启动并释放其时间。由于时间对于系统的运行至关重要,所以我使用PCF8563 I2C RTC构建了RTC。问题是,它需要特殊的内核模块才能使系统可用,RTC和我必须在引导过程中加载这些模块。因此,系统从不正确的时间开始,加载所需的模块,然后在/etc/rc.local的帮助下从RTC设置系统时间:
#Set system datetime from RTC
logger "Starting system clock synchronization with RTC"
if [ -e /dev/rtc ]; then
/sbin/hwclock --hctosys
fi
logger "System clock synchronized to RTC"问题在于,systemd似乎将早期引导进程和时钟设置之间的时间看作是“不正确”地编写没有日志的过程。在系统崩溃和系统时钟设置之后,我看不到任何日志:
Jan 5 23:20:39 tank systemd-journald[206]: Journal stopped
Jan 5 23:20:55 tank root[394]: System clock synchronized to RTC <- this is the second logger message
Jan 5 23:20:55 tank systemd[1]: Started /etc/rc.local Compatibility.
...
Jan 5 23:21:07 tank chronyd[384]: Forward time jump detected!通过从/etc/rc.local运行hwhlock --hctosys从RTC同步系统时钟是HardKernel建议的方法。但这似乎是完全错误的,因为在运行rc.local之前,系统显然会在预定义的时间内工作一段时间。那么,是否有任何方法可以从RTC早期设置系统时钟呢?
发布于 2021-01-09 10:52:49
我花了两天时间终于找到了确切的解决方案。问题是rc.local是在系统启动后执行到后期的。这就导致了以下几个问题: 1)部分(包括有价值的内核和早期系统启动)或所有日志从时间跳转到时间跳转,这使得日志在新日期之前丢弃所有日志;如果在系统记录器启动后(在我的示例中是system或syslog-ng ),系统时钟将被更新,那么在最后一次关闭之后,将根本没有日志。虽然系统仍在运行,但这是一个重大的失败,因为无法对运行中的系统进行任何调查。经过一些没有日志的累人的实验之后,我发现这种组合(实际上非常明显)可以在尽可能多的年时间内设置系统时钟:
/lib/systemd/system/hwrtc.service
[Unit]
Description=Synchronise System clock to hardware RTC
DefaultDependencies=no
After=systemd-modules-load.service
Before=systemd-journald.service time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/hwclock --hctosys --utc --noadjfile
RestrictRealtime=yes
[Install]
WantedBy=sysinit.target并启用此服务。这将使系统在加载强制模块之后和日志启动之前立即启动hwclock,因此所有日志都将标记为从RTC恢复的实际时间,保存所有消息,包括第一个内核消息。
https://askubuntu.com/questions/1305345
复制相似问题