1. 时间相关概念
1.1 GMT
GMT(Greenwich Mean Time), 格林尼治标准时间。它规定太阳每天经过位于英国伦敦郊区的皇家格林尼治天文台的时间为中午12点。
GMT的历史
格林尼治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测。为了天文观测,选择了穿过英国伦敦格林尼治天文台子午仪中心的一条经线作为零度参考线,这条线,简称格林尼治子午线。
1884年10月在美国华盛顿召开了一个国际子午线会议,该会议将格林尼治子午线设定为本初子午线,并将格林尼治平时 (GMT, Greenwich Mean Time) 作为世界时间标准(UT, Universal Time)。由此也确定了全球24小时自然时区的划分,所有时区都以和 GMT 之间的偏移量做为参考。
1972年之前,格林尼治时间(GMT)一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。
1.2 UTC
UTC(Coordinated Universal Time),协调世界时,又称世界统一时间、世界标准时间、国际协调时间。简称UTC。
UTC 是现在全球通用的时间标准,全球各地都同意将各自的时间进行同步协调。UTC 时间是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以秒为单位的国际原子时所综合精算而成。
UTC的历史
1960年,国际无线电咨询委员会规范统一了 UTC 的概念,并在次年投入实际使用。
“Coordinated Universal Time”这个名字则在1967年才被正式采纳。
1967年以前, UTC被数次调整过,原因是要使用闰秒(leap second)来将 UTC 与地球自转时间进行统一。
1.3 GMT与UTC区别
UTC 比 GMT更精准,以原子时计时,适应现代社会的精确计时,但在不需要精确到秒的情况下,二者可以视为等同。(1972年之前,格林威治时间(GMT)一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。)
格林尼治标准时(GMT)是格林尼治天文台通过天文学观测将每日太阳穿过本初子午线的瞬间定为正午时刻,并以此来制定时间,所以格林尼治标准时是“天文学时间”,随着科技的进步,人们发现该时间不够精确,因为地球自转的速度是不均衡的,而且自转速度也会越来越慢,所以不再使用。
而协调世界时(UTC)是基于原子物理学的特性,将在海平面上实现的“原子时秒”定义为国际标准时的时间单位,而原子时秒是这样定义的:铯-133 原子基态的两个超精细能级间在零磁场下跃迁辐射9192631770周所持续的时间 。所以,协调世界时属于“原子物理时间”,它更加精确,基本不会产生误差。
UTC更加精确,由于现在世界上最精确的原子钟50亿年才会误差1秒,可以说非常精确。
对于bmc而言:北京时间=UTC+8=GMT+8
1.4 时区
随着火车铁路与其他交通和通讯工具的发展,以及全球化贸易的推动,各地使用各自的当地太阳时间带来了时间不统一的问题,在19世纪催生了统一时间标准的需求,时区由此诞生。
时区是如何定义的
从格林尼治本初子午线起,经度每向东或者向西间隔15°,就划分一个时区,在这个区域内,大家使用同样的标准时间。
但实际上,为了照顾到行政上的方便,常将1个国家或1个省份划在一起。所以时区并不严格按南北直线来划分,而是按自然条件来划分。另外:由于目前,国际上并没有一个批准各国更改时区的机构。一些国家会由于特定原因改变自己的时区。
全球共分为24个标准时区,相邻时区的时间相差一个小时。
1.5 夏令时
DST(Daylight Saving Time),夏令时又称夏季时间,或者夏时制。
它是为节约能源而人为规定地方时间的制度。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。
全球约40%的国家在夏季使用夏令时,其他国家则全年只使用标准时间。标准时间在有的国家也因此被相应地称为冬季时间。
在施行夏令时的国家,一年里面有一天只有23小时(夏令时开始那一天),有一天有25小时(夏令时结束那一天),其他时间每天都是24小时。
1.6 UNIX时间戳(timestamp)
计算机中的UNIX时间戳,是以GMT/UTC时间1970-01-01T00:00:00为起点,到当前具体时间经过的秒数(不考虑闰秒)。这样做的目的,主要是通过“整数计算”来简化计算机对时间操作的复杂度。
1.7 系统时间与 RTC 时间设置方法
RTC芯片(Real-Time Clock Chip)是一种用于实时时钟功能的集成电路。它能够提供高精度的时间和日期信息,被广泛应用在各种电子设备中,如计算机、手机、手表、汽车等。RTC芯片的主要功能包括时间计数器、 时钟调节、电源管理等。
嵌入式设备,尤其是带电池的设备,系统时间特别依赖于 RTC 来维持。这一般也没问题,都有成熟的实现方案。但涉及时区时,就有一些坑需要特别注意了。为了内核的运行可靠,RTC 的时区设置保持为 UTC,当系统时区不是 UTC 时需要特别注意设置方法,所以分两种情况进行说明。
| 命令功能 | 系统时区为 UTC | 系统时区不为 UTC |
|---|---|---|
| 查看系统时间 | # date | # date |
| 查看 RTC 时间(在OS内发送) | # hwclock | # hwclock -u |
| 设置系统时间 | # date -s "2020-02-25 16:33:33" | # date -s "2020-02-25 16:33:33" |
| 同步系统时间到RTC(在OS内发送) | # hwclock --systohc | # hwclock --systohc -u |
| 同步RTC时间到系统(在OS内发送) | # hwclock --hctosys | # hwclock --hctosys -u |
1.8 常用cli接口
1)查询系统时间:
请求:ipmcget -d time
响应:<日期> <星期> <时刻(精确到秒)> <时区>
举例:
~ ~ # ipmcget -d time
2023-12-23 Saturday 15:33:38 UTC+08:002)设置时区
请求:ipmcset -d timezone -v <timezone>
响应:Set time zone successfully.
举例1:
~ ~ # ipmcset -d timezone -v UTC+8:00
Set time zone successfully.举例2:
~ ~ # ipmcset -d timezone -v Asia/Shanghai
Set time zone successfully.2. 时间同步机制
天池机型的I2C拓扑硬件链路如上,CPU和BMC-SMC的I2C都挂在RTC下面,由SMC进行仲裁,保证只有一个主设备可以访问RTC。硬件拓扑链路:
机架形态(从本板的RTC时钟芯片获取时间)的时间初始化流程:
- 在BMC每次启动的初始化阶段,通过插件的方式读取一次时间信息;
- 如果没有开启NTP的话,运行过程中周期性从RTC同步时间信息,周期为6s;
3. NTP
3.1 NTP介绍
NTP(Network Time Protocol)是一种用于在分布式网络中的不同设备之间保持精确时间同步的互联网协议。它允许一台机器与其他机器或权威的时间源建立联系,并根据这些联系来调整自己的时间,以确保整个网络中的所有设备共享一致的时间基准。NTP通过精确测量时间偏差、补偿网络延迟以及调整本地时钟频率来维持准确性,并提供了多种安全特性来保护时间同步过程不受干扰。
3.2 NTP协议
3.2.1 NTP数据包
NTP 基于 UDP/IP 协议,客户端与服务端或对等体之间通过发送数据包记录时间戳等数据,其数据包的格式如下:
常用模式字段说明:
| 字段 | 说明 |
|---|---|
| VN | NTP版本号 |
| Mode | NTP工作模式 |
| Stratum | 时钟层数,表示时钟精确度。取值1-15,精确度递减 |
| Poll | 发送探测报文的最小间隔时间 |
| Precision | 时钟精度,由多个计算量经一系列算法计算得到(时差、网络拥塞等) |
| Root Delay | 到主参考时钟的总往返时间 |
| Root Dispersion | 本地时钟相对于主参考时钟的最大误差 |
| Reference Timestamp | 本地时钟最后一次被设定或更新的时间。如果值为0表示本地时钟从未被同步过 |
| Originate Timestamp | NTP报文离开本地NTP客户端的时间戳(T1) |
| Receive Timestamp | NTP报文到达对端时钟源(server)的本地时间(T2) |
| Transmit Timestamp | 应答报文离开对端时钟源(server)的本地时间(T3) |
上述几个报文字段有如下关系:
先假设应答报文到达本地的时间为T4,则,
- 报文往返时延
Delay=(T4-T1)-(T3-T2)- 客户端与时钟源的时间差
Offset=((T2-T1)+(T3-T4))/ 2我们在分析问题时一般不会直接关注NTP的数据报文,除非要定位系统底层问题。当NTP同步状态异常时,分析控制报文往往会事半功倍。
3.2.2 NTP的时间同步过程
NTP的基本工作原理如下图所示。Device A和Device B通过网络相连,Device A和Device B的时间不同,需要通过NTP实现时间的自动同步。为便于理解,作如下假设:
- 在Device A和Device B的时间同步之前,Device A的时间设定为10:00:00 am,Device B的时间设定为11:00:00 am。
- Device B作为NTP时间服务器,即Device A与Device B的时间同步。
- NTP报文从Device A到Device B、从Device B到Device A单向传输所需要的时间均为1秒。
- Device B处理NTP报文所需的时间是1秒。
Device A和Device B时间同步的工作过程如下:
(1) Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00 am(T1)。
(2) 当此NTP报文到达Device B时,Device B在NTP报文上增加该报文到达Device B时的时间戳,该时间戳为11:00:01 am(T2)。
(3) 当此NTP报文离开Device B时,Device B在NTP报文上增加该报文离开Device B时的时间戳,该时间戳为11:00:02 am(T3)。
(4) 当Device A接收到该响应报文时,Device A的本地时间为10:00:03 am(T4)。
至此,Device A可以根据上述时间戳计算两个重要的参数:
- NTP报文的往返时延Delay = (T4-T1) – (T3-T2) = 2秒。
- DeviceA相对Device B的时间差Offset = ((T2-T1) + (T3-T4)) / 2 = 1小时。
这样,Device A就能够根据这些信息来设定自己的时间,使之与Device B的时间同步。
详细内容请参阅相关的协议规范。
4 时间同步状态标识
对于BMC而言,作为NTP的客户端,通过开启NTP服务,然后对配置文件进行配置来管理NTP,然后客户端服务会自动从NTP服务器获取时间并设置到BMC的内核时间。
4.1 资源协作接口
- bmc.kepler.Managers.Time
| 属性名 | 含义 |
|---|---|
| DateTime | 遵循ISO 8601标准的日期时间字符串,举例:"2025-09-14T08:51:24+00:00" |
| TimeZoneConfigurable | 时区是否可配置 |
| DateTimeLocalOffset | 时区偏移量 |
| TimeZoneName | 时区名字,举例:"UTC" |
| SyncStatus | 当前BMC时间是否已同步 |
| DSTEnabled | 夏令时是否已开启 |
| TimeJumpStatus | 系统时间跳变状态,true:跳变,false:非跳变,默认为false |
- bmc.kepler.Managers.Ntp
| 属性名 | 含义 |
|---|---|
| Enabled | NTP使能状态,是否开启NTP客户端 |
| NTPMode | 配置服务器ip模式,Static手动配置ip,IPv4/IPv6表示依赖DHCP服务器获取NTP服务器ip地址 |
| PreferServer | 首选服务器,如果这个配了ip,则优先从这个服务器获取时间 |
| AlternateServer | 备用服务器 |
| ExtraServers | 额外服务器 |
| MinPoll | 最小轮询间隔,代表两个NTP报文的最小间隔时间,配置3代表2秒的3次方 |
| MaxPoll | 最大轮询间隔 |
| NTPServerCount | 支持可配置NTPserver的个数 |
| SyncResult | BMC与NTP服务器同步的结果,0表示成功,1表示未成功(包含同步失败和未开启NTP),默认值为1 |
| CurrentPollingIntervalSeconds | NTP当前轮询时间,单位为秒;在BMC运行时且NTP功能打开时有效,关闭时为0 |
- bmc.kepler.Managers.Ntp.Auth
| 属性名 | 含义 |
|---|---|
| AuthEnabled | 服务器身份认证使能开关。true:使能,false:未使能 |
| GroupKeyStatus | 表征NTP服务端密钥导入状态。0:未导入,1:已导入 |
- bmc.kepler.Managers.Rtc
| 属性名 | 含义 |
|---|---|
| RTCSyncResult | RTC时间同步结果,0:成功,1:失败,255:不支持RTC同步,默认为255 |
| GroupKeyStatus | 表征NTP服务端密钥导入状态。0:未导入,1:已导入 |
4.2 NTP配置文件
文件路径:/data/trust/ntp/ntp.conf
获取文件内容:
~ ~ # cat /data/trust/ntp/ntp.conf
driftfile /var/lib/ntp/drift
restrict -4 default kod nomodify notrap nopeer noquery ignore
restrict -6 default kod nomodify notrap nopeer noquery ignore
restrict -4 x.x.x.x
restrict -6 ::1
server yy.yy.yy.yy prefer minpoll 3 maxpoll 10
restrict -4 xx.xx.xx.xx kod nomodify notrap nopeer noquery
tos maxdist 15driftfile:指定了一个文件记录时间差异,记录了NTP Server 和NTP Client之间的芯片震荡周期频率的误差
restrict:管理权限控制
restrict [address] mask [mask] [parameter]其中parameter的参数主要有:
- ignore: 拒绝所有类型的NTP联机;
- nomodify: 客户端不能使用ntpc与ntpq这两个程序来修改服务器的时间参数,但客户端仍可透过这个主机来进行网络校时;
- noquery: 客户端不能使用ntpq,ntpc等指令来查询时间服务器,等于不提供NTP的网络校时;
- notrap: 不提供trap这个远程事件登录(remote event logging)的功能;
- notrust: 拒绝没有认证的客户端
server:设定上层NTP服务器
server [address] [options...]在server后面填写服务器地址(可以是IP或主机名),这里最常使用的prefer,表示优先使用的服务器。
tos maxdist:将容忍时钟偏差修改至30,单位为S,该值默认为1.5。当偏差大于此限定值时,ntp不会同步时钟。
4.3 查看NTP服务的运行状况
现在我们已经启动了NTP的服务,但是我们的系统时间到底和服务器同步了没有呢? 为此NTP提供了一个很好的查看工具: ntpq (NTP query),在打开NTP服务器后就可以运行ntpq命令来监测服务器的运行。
~ ~ # ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*xx.xx.xx.xx yy.yy.yy.yy 7 u 3 8 77 0.674 -0.355 0.2095- remote: 它指的就是本地机器所连接的远程NTP服务器。
- refid: 它指的是给远程服务器提供时间同步的服务器。
- st: 远程服务器的层级别(stratum). 由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端。所以服务器从高到低级别可以设定为1-16。为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的。
- when: 一个用来告诉我们还有多久本地机器就需要和远程服务器进行一次时间同步的计时器。
- poll: 本地机和远程服务器多少时间进行一次同步(单位为秒)。在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围。之后poll值会逐渐增大,同步的频率也就会相应减小。
- reach: 这是一个八进制值,用来测试能否和服务器连接。每成功连接一次它的值就会增加。
- delay: 从本地机发送同步要求到服务器的round trip time。
- offset: 这是个最关键的值,它告诉了我们本地机和服务器之间的时间差别。offset越接近于0,我们就和服务器的时间越接近。
- jitter: 这是一个用来做统计的值,它统计了在特定个连续的连接数里offset的分布情况。简单地说这个数值的绝对值越小我们和服务器的时间就越精确。
~ ~ # ntpq -c as
ind assid status conf reach auth condition last_event cnt3
==============================================================
1 4640 961a yes yes none sys.peer sys_peer 15condition为sys.peer,表示时间已经同步成功。
检测ntp服务器ip是否有效
查询ipv4地址
-- 有效的ipv4地址
~ ~ # /usr/sbin/ntpdate -q <服务器ip>
server <server_ip>, stratum <>, offset <offset_value>, delay <delay_value>
<date> ntpdate[xxxx]: step time server <server_ip> offset <offset_value> sec
-- 无效的ipv4地址
~ ~ # /usr/sbin/ntpdate -q <服务器ip>
<date> ntpdate[xxxx]: no server suitable for synchronization found查询ipv6地址
~ ~ # /usr/sbin/ntpdate -q6 <服务器ip>4.4 NTP与RTC的优先级
由于ntp的时间更精确,所以开启ntp服务后,就会停止从rtc同步时间,但是ntp需要配有效的ntp服务器地址才可以进行时间同步,为了增加可靠性,假设配置了无效的地址,bmc启动后会进行一次rtc时间同步。