我目前想知道 Raspbian 在 RaspbianPI 上启动期间从哪里获取“当前”日期和时间。
系统有一个通过 I2C 连接的 RTC 设备。来自 RTC 的日期/时间在引导期间由 systemd 服务单元读取,从而产生正确的日期/时间。
此外,还配置了 NTP 客户端。
该fake-hwclock
软件包已安装但在 systemd 中停用。
当 Raspbian 启动时,它会生成/var/log/syslog
带有日期/时间的日志消息Nov 3 ...
。我期望它 - 正如 roaima 所写 -Jan 1 1970
但事实并非如此......
示例消息位于/var/log/syslog
Nov 3 18:16:51 raspberrypi kernel: [ 0.000000] Booting Linux on physical CPU 0xf00
当 systemd 到达运行 RTC 脚本的位置(RTC 设备通过 I2C 连接)时,它会正确设置日期和时间:
Oct 19 13:45:50 raspberrypi systemd[1]: Time has been changed
所以,问题是:那个奇怪的Nov 3
日期存储在哪里?!它是否存储在文件中的某个位置?它是硬编码到内核中的吗?
答案1
Raspberry Pi 机器没有电池支持的 RTC,因此当它们通电时,时钟从零开始(UTC 时间 1970 年 1 月 1 日午夜)。
为了在启动时获得近似的真实时间,在访问任何外部时间源之前,该fake-hwclock
软件包提供了一种将时钟设置为关机时保存的值的方法。在连接到 Internet 的计算机上,NTP 可以在设备启动后更快、更准确地设置时钟。
答案2
我也有过同样的经历,升级到 Stretch 后,带有 RTC 和运行 NTP 的 RPi 有时不使用正确的日期/时间。
不幸的是,我无法告诉你 Stretch 中的 3 Nov 2016 17:16:45 来自哪里,但我现在我想我知道在什么情况下会发生这种情况。
如果我比较好的和“重新启动后的错误日期/时间”情况,那么当 WLAN 连接可用时,2016 年 11 月 3 日 17:16:45 似乎没有纠正为正确的时间(来自 RTC 或 NTP), RPi 已连接,但由于某种原因无法访问互联网。
由于我对 Linux 东西很陌生,我不知道如何证明这一点。我知道我没有回答这个问题,但我觉得这可能有用。
答案3
我在 Raspberry Pi 4 设备上运行 Ubuntu 22.04,但我遇到了类似的行为(尽管预定义的日期与我的情况不同)。以下是我的发现:
如前所述,
fake-hwclock
这是 RTC 数据的第一个明显来源。有名为 initramfs 的钩子
fixrtc
和相应的内核命令行参数。如果设置了该参数,则早期用户空间挂钩会检查根文件系统的最后安装和创建时间(通过获取dumpe2fs
)。更大的时间用于设置时钟。如果没有
fixrtc
脚本和/或未fixrtc
设置参数。 Systemd 开始发挥作用,并使用它的构建时间戳来设置时钟。现代 Debian/Ubuntu 打包脚本从最新debian/changelog
条目中提取此构建时间戳。我无法找到使用构建的 systemd 二进制文件来显示此构建时间戳的方法。但是,可以使用自定义时间戳来覆盖嵌入的时间戳。做到这一点的方法是创建/触摸名为
/usr/lib/clock-epoch
.以防万一,文件的修改时间将作为 RTC 数据的来源。