banner
NEWS LETTER

嵌入式 Linux 系列 15:系统时间、RTC、NTP 和时区

Scroll down

时间系统看起来简单,但在嵌入式设备里经常引发连锁问题:日志时间不准、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 是否启用。

三、开机时间流程

推荐流程:

  1. 开机从 RTC 读时间。
  2. 网络起来后通过 NTP 校准。
  3. 校准成功后写回 RTC。
  4. 业务日志记录校准状态。

如果设备没有 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 做调度。
  • 本地时区只用于展示。

时间问题要尽量在系统层设计清楚,不要在每个业务模块里各自处理。

其他文章
目录导航 置顶
  1. 1. 一、几个概念
  2. 2. 二、查看和设置时间
  3. 3. 三、开机时间流程
  4. 4. 四、NTP 校时
  5. 5. 五、时区处理
  6. 6. 六、常见问题
请输入关键词进行搜索