华硕Tinkerboard外接DS3231 RTC板后系统时间未从RTC同步
故障根因分析
- 系统默认RTC软链接
/dev/rtc指向/dev/rtc0(华硕TinkerBoard板载无后备电池的原生RTC),外接DS3231对应的/dev/rtc1未被系统自动同步逻辑识别为默认RTC - 开机阶段的RTC时间同步仅读取默认RTC(rtc0),而rtc0因无后备电池,关机后仅能保留关机时系统写入的时间(你测试时的18:00+正确日期),因此出现「系统日期正确、时间停留在关机时刻」的现象
- 外接DS3231(rtc1)走时正常,但未参与开机自动同步流程,因此存储的18:15正确时间未被写入系统时钟
排查步骤
基础配置核验
- 查看默认RTC指向:执行
ls -l /dev/rtc,确认是否指向/dev/rtc0 - 确认RTC节点对应芯片:执行
cat /sys/class/rtc/rtc1/name,验证返回值是否包含ds3231 - 查看hwclock服务默认配置:执行
cat /etc/default/hwclock(或/etc/sysconfig/hwclock,依发行版实际路径调整),确认是否硬编码指定了rtc0为默认读取节点 - 检查内核启动参数:执行
cat /proc/cmdline,排查是否存在rtc.dev=rtc0之类的强制指定参数
驱动优先级核验
- 查看RTC驱动加载顺序:执行
dmesg | grep rtc,确认rtc0和rtc1的加载先后顺序,是否rtc0被优先绑定为默认RTC - 验证设备树配置:检查DS3231对应的设备树节点是否设置
status = "okay",compatible参数是否为maxim,ds3231
解决方案
方案1:永久将rtc1设为默认RTC(推荐)
修改hwclock服务默认参数
编辑/etc/default/hwclock,新增/修改如下配置:HWCLOCK_ARGS="--rtc /dev/rtc1"
该配置会让所有系统默认的hwclock同步/写入逻辑都指向DS3231对应的rtc1。
调整udev规则永久修改/dev/rtc软链接
新建/etc/udev/rules.d/99-default-rtc.rules,添加以下内容:SUBSYSTEM=="rtc", KERNEL=="rtc1", SYMLINK+="rtc", OPTIONS+="link_priority=100"
规则生效后,开机自动将/dev/rtc软链接指向rtc1,优先级高于原有指向rtc0的默认规则。
(可选)禁用板载rtc0加载
如果不需要使用板载RTC,可新建/etc/modprobe.d/blacklist-tinkerboard-rtc.conf,添加对应板载RTC驱动的黑名单:blacklist <板载RTC驱动名称>
驱动名称可通过ls /sys/class/rtc/rtc0/device/driver/ | head -1获取。
方案2:添加开机强制同步rtc1脚本(备用)
如果上述配置修改未生效,可直接在开机自启脚本中添加强制同步命令:
- 编辑
/etc/rc.local(需确保该文件有可执行权限),在exit 0前添加:/sbin/hwclock --rtc /dev/rtc1 --hctosys - 若使用systemd管理自启,可新建
/etc/systemd/system/rtc1-sync.service,配置服务在multi-user.target阶段启动,执行上述hwclock命令,且启动优先级高于NTP服务。
验证方法
- 配置完成后执行
sudo reboot,断电静置15分钟以上再上电 - 查看系统时间是否与rtc1的走时一致
- 执行
hwclock --get(不带-f参数),确认默认读取的RTC时间为rtc1的存储值
内容的提问来源于stack exchange,提问作者SteMMo
相关产品推荐
相关产品推荐

