三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

板子时间不对问题(RTC 缺失,不编译内核版)

板子时间不对问题(RTC 缺失,不编译内核版)

这份总结文档整合了我们刚才经历的所有排查步骤、原理解析和最终解决方案。建议保存为《嵌入式 Linux 时间系统故障排查手册》,以后遇见类似问题直接查阅即可。


嵌入式 Linux 时间故障排查与解决方案手册

1. 故障现象与初步诊断

当你发现开发板时间不对时,请按以下逻辑顺序判断问题根源:

1.1 判断是“时区错误”还是“时间错误”

  • 现象:你看手表是21:00,板子显示13:00 UTC
  • 计算13 + 8 = 21 13 + 8 = 2113+8=21
  • 诊断时间是准的,只是时区设成了世界标准时间 (UTC),未设置为北京时间 (CST/UTC+8)。
  • 对策跳转至步骤 3.1 修改时区

1.2 判断是否存在硬件时钟 (RTC)

  • 测试命令sudo hwclock -w(尝试将时间写入硬件)
  • 现象 A:无报错。说明有 RTC 且驱动正常。
  • 现象 B:报错Cannot access the Hardware Clock,且ls /dev/rtc*为空。
  • 诊断板子无 RTC 硬件/电池或驱动未加载。断电重启后,时间必定丢失(重置为 1970 或编译时间)。
  • 对策跳转至步骤 3.3 部署无 RTC 解决方案

2. 核心原理解析

理解 Linux 时间系统的“里子”和“面子”,是解决问题的关键。

2.1 内核时间 (Unix Timestamp) vs 显示时间

  • 里子(内核):系统内部只维护一个数字(Unix 时间戳),即从 1970-01-01 00:00:00 UTC 逝去的总秒数。它不分时区,全球统一。
  • 面子(用户)date命令只是一个翻译官。它读取秒数,结合/etc/localtime(时区配置),算出人类可读的字符串(如 “Wed Feb 04…”)。
  • 结论:修改时区或显示格式 (alias),只是换了“翻译方式”,内核里的秒数并没有变。

2.2 系统时钟 (System Clock) vs 硬件时钟 (RTC)

  • System Clock:跑在 RAM 里,由 CPU 维护。断电即丢
  • RTC (Real Time Clock):跑在主板独立芯片里,由纽扣电池供电。断电不丢

交互机制

  • 开机:Linux 读取 RTC -> 初始化 System Clock (hwclock -s)。
  • 关机:Linux 将 System Clock -> 写入 RTC (hwclock -w)。
  • 无 RTC 时:开机无法读取,系统时间回到 “原点”(1970年),导致文件系统自检报错、日志乱序、编译错误。

3. 完整操作指南

3.1 修改时区 (解决 Access denied)

timedatectl报错权限不足时,直接修改底层文件链接。

# 强制将上海时区文件链接到系统配置sudoln-sf/usr/share/zoneinfo/Asia/Shanghai /etc/localtime# 验证(应显示 CST)date

3.2 优化显示格式 (24小时制)

如果你不喜欢09:00 PM这种格式,想要21:00:00

# 将 alias 写入环境变量echo"alias date='date\"+%F %T\"'">>~/.bashrcsource~/.bashrc

3.3 终极方案:无 RTC 环境的“组合拳”

适用场景:板子没电池,断电时间会丢。
目标:利用“存档”保底,利用“网络”校准。

步骤 1:配置永久网络(确保重启能连网)
(假设网关为 Windows 共享的 192.168.137.1)

# 使用 nmcli 固定 IP 和 网关(替换 "Wired connection 1" 为实际连接名)sudonmcli connection modify"Wired connection 1"ipv4.addresses192.168.137.219/24sudonmcli connection modify"Wired connection 1"ipv4.gateway192.168.137.1sudonmcli connection modify"Wired connection 1"ipv4.dns"223.5.5.5"sudonmcli connection modify"Wired connection 1"ipv4.method manualsudonmcli connection up"Wired connection 1"

步骤 2:安装“保底者” (fake-hwclock)
作用:关机存盘,开机读盘。防止时间倒流回 1970 年。

sudoaptupdatesudoaptinstall-yfake-hwclocksudosystemctlenablefake-hwclock

步骤 3:配置“校准者” (NTP 加速)
作用:开机联网后,迅速拉取阿里云时间,修正偏差。

# 修改配置文件,使用国内源sudosed-i's/#NTP=/NTP=ntp.aliyun.com/g'/etc/systemd/timesyncd.conf# 重启服务并强制开启同步sudosystemctl restart systemd-timesyncdsudotimedatectl set-ntptrue

4. 验证清单 (Checklist)

重启板子后,按以下顺序检查是否成功:

  1. 刚开机时:输入date
  • 成功:显示为上次关机的时间(如 2026年…)。
  • 失败:显示 1970年或2021年(说明 fake-hwclock 没装好)。
  1. 等待 30秒后:再次输入date
  • 成功:时间自动跳变为当前的精确时间(说明网络通了,NTP 校准成功)。
  • 失败:时间依然停留在关机时(说明网络没通,检查网关配置)。

5. 常用命令速查表

目的命令
看纯净时间date +%T(显示 22:00:00)
看内核时间戳date +%s(显示 177xxxxx)
手动改时间sudo date -s "2026-02-04 22:00:00"
查看 NTP 状态systemctl status systemd-timesyncd
写入硬件(有RTC)sudo hwclock -w
← 返回列表