伙计们!
我有一台没有内置 RTC 的单板计算机(HardKernel Odroid C2),每次系统启动时都需要一个外部时间源。虽然我有一个本地 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 设置系统时钟?
我花了2天,终于找到了确切的解决方案。问题是
rc.local
系统启动后执行的方式很晚。这导致了几个问题:1)部分(包括有价值的内核和早期系统启动)或所有日志都因时间跳跃而下降,这使得日志丢弃新日期之前的所有日志 2)如果由于某种原因系统时钟将在之后更新系统记录器(在我的情况下为 syslogd 或 syslog-ng)已启动,最后一次关闭后将没有日志。虽然系统仍在运行,但这是一个重大故障,因为无法调查正在运行的系统上的任何内容。在没有日志的情况下进行了一些令人筋疲力尽的实验后,我发现组合(实际上非常明显)可以在每年最多的时间设置系统时钟:/lib/systemd/system/hwrtc.service
并启用此服务。这将使系统在强制模块加载后和日志启动之前立即启动 hwclock,因此所有日志都将标记为从 RTC 恢复的实际时间,保存所有消息,包括第一个内核消息。