Linux 时间同步

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,而且受网络背景流量影响。

你可能感兴趣的:(Linux 时间同步)