时间系统看起来简单,但在嵌入式设备里经常引发连锁问题:日志时间不准、TLS 证书校验失败、MQTT 连接失败、定时任务错乱、跨时区展示错误。要把时间做好,需要同时理解系统时间、RTC、NTP 和时区。
一、几个概念
系统时间:
1 | Linux 内核运行时维护的当前时间 |
RTC:
1 | 掉电后仍能保存时间的硬件时钟 |
NTP:
1 | 通过网络校准系统时间 |
时区:
1 | 把 UTC 时间展示成本地时间的规则 |
建议内部统一使用 UTC,界面和日志展示再按时区转换。
二、查看和设置时间
查看系统时间:
1 | date |
查看 RTC:
1 | hwclock -r |
把 RTC 写入系统:
1 | hwclock -s |
把系统时间写入 RTC:
1 | hwclock -w |
精简 rootfs 不一定带完整 hwclock,需要确认 BusyBox 是否启用。
三、开机时间流程
推荐流程:
- 开机从 RTC 读时间。
- 网络起来后通过 NTP 校准。
- 校准成功后写回 RTC。
- 业务日志记录校准状态。
如果设备没有 RTC,开机时间可能回到默认值。这会影响 TLS 和证书校验。
四、NTP 校时
常见工具:
- ntpd。
- chrony。
- busybox ntpd。
BusyBox 示例:
1 | ntpd -n -q -p pool.ntp.org |
常驻模式:
1 | ntpd -p pool.ntp.org |
实际产品里,NTP 服务器最好可配置,并支持内网服务器。
五、时区处理
如果 rootfs 有 zoneinfo:
1 | mount --bind /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
如果 /etc/localtime 只读,可以把用户选择保存到:
1 | /data/config/timezone |
启动时读取并恢复。运行时通过 MQTT 修改时区时,也要同步通知业务进程重新加载。
六、常见问题
TLS 连接失败:
- 先查
date。 - 再查证书有效期。
- 再查 CA 文件。
日志时间跳变:
- 查 NTP 是否刚校时。
- 查 RTC 是否存了本地时间。
- 查时区是否改变。
定时任务错乱:
- 使用 UTC timestamp 做调度。
- 本地时区只用于展示。
时间问题要尽量在系统层设计清楚,不要在每个业务模块里各自处理。
- 本文链接: https://blog.hansong.icu/2026/06/26/Embedded_Linux_Series_15_Time_RTC_NTP/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。