Linux中时间设置
在Linux系统中存在两个时钟时间,分别是
- 硬件时钟RTC(Real Time Clock)
- 系统时钟(System Clock)
硬件时钟是指的在主板上的时钟设备,也就是通常可以在BIOS画面设置的时钟,即使关机状态也可以计算时间。
而系统时钟则是指Kernel中的时钟,其值是由1970年1月1日00:00:00 UTC时间至当前时间所经历的秒数总和。当Linux启动的时候,系统时钟会读取硬件时钟的设定,之后系统时钟独立运作。长时间运行两者可能将会产生误差。另外所有的Linux相关指令都是读取系统时钟指定的,如date。
我们这里讨论的是系统时间。
NTP
NTP,网络时间协议,使用 123/udp 端口进行网络时钟同步;NTP 是仍在使用中的最古老的网络传输协议之一(1985 年前开始)。
以前Linux时间同步基本是使用 ntpdate 和 ntpd 这两个工具实现的,但是这两个工具已经很古老了。
【注】ntpdate和ntpd是互斥的,两者不能同时使用。ntpd是步进式平滑的逐渐调整时间,而ntpdate是断点式更新时间。
RHEL/CentOS 7.x 已经将 chrony 作为默认时间同步工具了。
其他Linux (如 ubuntu) 使用 systemd-timesyncd 服务。
chrony 简介
chrony 是 RedHat 开发的,它是网络时间协议(NTP)的另一种实现;
RHEL/CentOS 7.x 的默认时间同步工具;
chrony 可以同时做为 ntp 服务的客户端和服务端;安装完后有两个程序 chronyd、chronyc:
chronyd 是一个 daemon 守护进程,chronyc 是用来监控 chronyd 性能和配置参数的命令行工具。
实验环境
系统版本:CentOS 7.5
chrony_server(relay):10.0.0.4
chrony_client:10.0.0.5
chrony_server
配置 chrony
Edit file /etc/chrony.conf
## 上游公共 ntp 服务器
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
## 允许 10.0.0.0/24 主机同步时间,此时它作为server
# Allow NTP client access from local network.
allow 10.0.0.0/24
运行 chrony
默认已经启动,不需要调整
# systemctl enable chronyd
# systemctl start chronyd
chronyc 用法
## 查看 ntp_servers 状态
chronyc sources -v
## 查看 ntp_sync 状态
chronyc sourcestats -v
## 查看 ntp_servers 是否在线
chronyc activity -v
## 查看 ntp 详细信息
chronyc tracking -v
example:
[royzeng@roy-time1 ~]$ chronyc sources -v
210 Number of sources = 4
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- 203.95.213.129 2 6 17 7 +6589us[+6589us] +/- 128ms
^- ntp.hkg10.hk.leaseweb.net 2 6 17 9 -3166us[-4471us] +/- 230ms
^* ntp.xtom.com.hk 2 6 17 9 +446us[ -859us] +/- 44ms
^+ stratum2-01.hkg01.public> 2 6 17 9 +1465us[+1465us] +/- 49ms
[royzeng@roy-time1 ~]$ chronyc sourcestats -v
210 Number of sources = 4
.- Number of sample points in measurement set.
/ .- Number of residual runs with same sign.
| / .- Length of measurement set (time).
| | / .- Est. clock freq error (ppm).
| | | / .- Est. error in freq.
| | | | / .- Est. offset.
| | | | | | On the -.
| | | | | | samples. \
| | | | | | |
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
203.95.213.129 5 3 71 -2.215 56.211 +6464us 197us
ntp.hkg10.hk.leaseweb.net 5 5 71 -0.455 43.785 -3413us 249us
ntp.xtom.com.hk 5 3 71 -4.793 32.118 -192us 138us
stratum2-01.hkg01.public> 5 3 71 +7.164 102.122 +2232us 529us
[royzeng@roy-time1 ~]$ chronyc activity -v
200 OK
4 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
[royzeng@roy-time1 ~]$ chronyc tracking -v
Reference ID : 2D7D0114 (ntp.xtom.com.hk)
Stratum : 3
Ref time (UTC) : Fri Dec 14 07:04:03 2018
System time : 0.000712532 seconds fast of NTP time
Last offset : -0.000283856 seconds
RMS offset : 0.001270661 seconds
Frequency : 1.802 ppm slow
Residual freq : -0.221 ppm
Skew : 4.037 ppm
Root delay : 0.004713390 seconds
Root dispersion : 0.042513479 seconds
Update interval : 65.2 seconds
Leap status : Normal
chrony_client
配置 chrony
edit file: /etc/chrony.conf
## 内网 ntp_server IP
server 10.0.0.4 iburst
再次用chronyc 命令检查,比较它与chronyd server的差异
[royzeng@roy-time2 ~]$ chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 10.0.0.4 3 6 17 15 +28us[ +88us] +/- 22ms
[royzeng@roy-time2 ~]$ chronyc sourcestats -v
210 Number of sources = 1
.- Number of sample points in measurement set.
/ .- Number of residual runs with same sign.
| / .- Length of measurement set (time).
| | / .- Est. clock freq error (ppm).
| | | / .- Est. error in freq.
| | | | / .- Est. offset.
| | | | | | On the -.
| | | | | | samples. \
| | | | | | |
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
10.0.0.4 4 3 6 +3.254 829.521 +121us 101us
[royzeng@roy-time2 ~]$ chronyc activity -v
200 OK
1 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
[royzeng@roy-time2 ~]$ chronyc tracking -v
Reference ID : 0A000004 (10.0.0.4)
Stratum : 4
Ref time (UTC) : Fri Dec 14 07:10:35 2018
System time : 0.000086407 seconds slow of NTP time
Last offset : -0.000094787 seconds
RMS offset : 0.000094787 seconds
Frequency : 50.500 ppm slow
Residual freq : -1.147 ppm
Skew : 0.190 ppm
Root delay : 0.005246780 seconds
Root dispersion : 0.019316599 seconds
Update interval : 65.3 seconds
Leap status : Normal
systemd-timesyncd 简介
systemd-timesyncd 是一个用于跨网络同步系统时钟的守护服务。它实现了一个 SNTP 客户端,但更轻量级,更集成systemd。
配置
systemd-timesyncd 启动时会读取 /etc/systemd/timesyncd.conf 配置文件,内容如下:
[Time]
#NTP=
#FallbackNTP=ntp.ubuntu.com
NTP=time1.myserver.com
FallbackNTP=time2.myserver.com
你可以输入你希望使用的其它时间服务器,比如你自己的本地 NTP 服务器,在 NTP= 行上输入一个以空格分隔的服务器列表。
如果服务器可以直接连接internet,不用修改默认配置;如果在内网,需要单独指定。
例子
在最新的 Ubuntu 版本中,timedatectl 替代了老旧的 ntpdate。默认情况下,timedatectl 在系统启动的时候会立刻同步时间,并在稍后网络连接激活后通过 socket 再次检查一次。
timesyncd 替代了 ntpd 的客户端的部分。默认情况下 timesyncd 会定期检测并同步时间。它还会在本地存储更新的时间,以便在系统重启时做时间单步调整。
通过 timedatectl 和 timesyncd 设置的当前时间状态和时间配置,可以使用 timedatectl status 命令来进行确认。
由于 timedatectl 的存在,各发行版已经弃用了 ntpdate,默认不再进行安装。
timedatectl
timedatectl status
,查看时间同步状态;
timedatectl set-ntp true
,开启网络时间同步;
$ timedatectl status
Local time: Fri 2018-12-14 02:35:15 UTC
Universal time: Fri 2018-12-14 02:35:15 UTC
RTC time: Fri 2018-12-14 02:35:15
Time zone: Etc/UTC (UTC, +0000)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
timedatectl set-timezone ZONE
,设置时区。
$ timedatectl list-timezones | grep -i shanghai
Asia/Shanghai
$ sudo timedatectl set-timezone Asia/Shanghai
$ date
Wed Feb 20 14:13:06 CST 2019
$ timedatectl status | grep Time
Time zone: Asia/Shanghai (CST, +0800)
NTP synchronized: yes
表示时间是同步状态。
查看服务状态以及从哪个ntp server同步时间。
$ sudo systemctl status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
└─disable-with-time-daemon.conf
Active: active (running) since Tue 2018-12-04 02:48:13 UTC; 1 weeks 3 days ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 1167 (systemd-timesyn)
Status: "Synchronized to time server 91.189.89.199:123 (ntp.ubuntu.com)."
Tasks: 2
Memory: 1.3M
CPU: 736ms
CGroup: /system.slice/systemd-timesyncd.service
└─1167 /lib/systemd/systemd-timesyncd
Dec 04 02:48:13 roy-time-vm systemd[1]: Starting Network Time Synchronization...
Dec 04 02:48:13 roy-time-vm systemd[1]: Started Network Time Synchronization.
Dec 04 02:48:43 roy-time-vm systemd-timesyncd[1167]: Synchronized to time server 91.189.89.199:
lines 1-17/17 (END)
扩展:同步时间协议
NTP:软件层面实现,成本低。同步精度10ms左右。
PTP:需要网络接口具备在物理层提供时间戳的功能,同步精度优于100ns,局域网的节点需要使用支持PTP功能的交换机。局域网网络接点不支持PTP的话,只能同不到us,而且受网络背景流量影响。