时间管理问题手册
更新时间: 2025/10/15
在Gitcode上查看源码

前言

bmc_time组件本身不"生产"时间,只搬运NTP或RTC时间,因此时间不准确或跳变等问题**99%**不是组件问题。

注意:不要习惯性地直接认为组件有问题。

1. 高频问题

1.1 为什么BMC时间每次重启后都会恢复到1970年

时间戳的起点是1970-01-01T00:00:001表示在这个时间的基础上过去了1秒。

复位后,BMC没有时间戳,因此显示为1970年。获取到时间戳后才会恢复正常。

1.2 为什么有时间跳变

时间跳变分为以下几种情况:

1.2.1 1970的跳变

这是正常现象,原因如上所述。

1.2.2 复位后1970跳变到一个时间,过了一会又会跳变一次

为了保证服务启动后尽早使用"相对有效"的时间戳,而不是1970,系统会将复位前的时间戳持久化下来,复位后先暂时使用。

持久化的触发时机为:

  1. 刚启动时持久化一次
  2. 每天自动持久化一次
  3. 时间跳变时持久化一次
  4. 平滑重启时持久化一次

因此,像强制重启等操作,可能出现持久化时间戳较旧的情况,因为没有机会去持久化当前最新的时间戳。

此场景会有app日志:set bmc_time time_stamp=%s by persistent data

1.2.3 时间源跳变

首先检查NTP是否开启,NTP开启后只从NTP读取时间:

bash
ipmcget -d ntp

如果Statusenabled说明已开启,Synchronize表示是否同步成功。

这又分为两种情况:

  1. NTP同步成功后产生的跳变:说明RTC和NTP时间不一致,需要自行排查RTC和NTP哪个有问题。
  2. NTP一直开启,突然跳变:说明是NTP服务器的问题。

如果NTP未开启,则查看RTC芯片的时间,只要BMC和RTC芯片时间一致,则联系硬件定位。

**方式一:**OS侧执行hwclock查看OS时间,一般情况下和BMC是一致的,不一致则看方式二。

**方式二:**读寄存器,一般是CpuBoard,如果不是则换成对应的读取格式。

命令:

bash
mdbctl call Smc_CpuBrdSMC_010101 bmc.kepler.Chip.BlockIO Read 0 201327872 8

解析说明:例如 133.7.1.8.3.6.16.26100+133+7*256186:16:26

年份固定+100:RTC时钟在SMC中存储时以1800年起始,Linux系统tm结构设置时间从1900年开始算。

1.3 date -s 设置命令后又变回去

首先明确一个基本常识:

正常情况下,BMC会从时间源周期性同步准确时间,时间源为NTP或RTC。

因此,修改本地时间后过一会就会被刷新回去。

date -s是Linux系统自带命令,不是组件提供的。

需要确认系统使用的时间源:

  • ipmcget -d ntp:查看NTP是否开启
  • hwclock:在OS侧查看RTC时间

如果时间不符合预期,联系对应的责任人。

2. 接口设置类

2.1 设置NTP地址获取模式AddressMode失败

查询网络模块是否开启对应的DHCP地址模式。若未开启自动获取模式,则需先开启,再修改NTP地址获取模式,否则将修改失败。

2.2 IPMITool标准命令设置时间失败

格式要求:%m/%d/%Y %H:%M:%S

示例:

bash
ipmitool sel time set "06/13/2025 08:35:00"

NTP开启场景会报错:Command not supported in present state

3. 时间查询类

3.1 NTP不能同步

NTP服务的连通由开源软件处理,bmc_time本身不处理,因此出现异常问题时可以先自行查询相关资料。

  1. 在环境中查看设置的IP是否为有效的NTP服务器IP
bash
/usr/sbin/ntpdate -uD ip

下图所示为无效IP:

  1. 若为有效IP,则查看IP是否写进对应配置文件/data/trust/ntp/ntp.conf

说明:开启NTP后,会写入配置文件,如果没写入才需要排查代码是否有问题。

  1. 查看NTP服务器状态
bash
ntpq -c as

只有显示sys.peer时该NTP服务器可信。

  1. 在V2环境的IP可以,V3就不行

确认IP和端口都是通的,这种情况只能是环境问题,例如大网小网的问题。