Linux 机器时钟同步

前言

在Linux系统中,为了避免主机时间因为在长时间运行下所导致的时间偏差。Linux系统下,一般使用ntp服务来同步不同机器的时间。

NTP 是网络时间协议(Network Time Protocol)的简称,就是通过网络协议使计算机之间的时间同步化。

准确的系统时间是稳定服务的基础,本文介绍与时间相关的Linux操作、以及如何为自己的Linux服务器维护准确的时间。

时间基本操作

一台Linux服务器有两个时间源,一个是硬件时间,即服务器硬件CMOS维护的时间,还有一个操作系统维护的时间,前者通过hwclock命令来访问,后者则主要通过date命令来访问。

date是最常用的时间相关的命令,例如:

1
2
3
4
5
6
7
8
9
10
11
# 获取当前时间
$ date
Fri Jan 23 15:22:16 CST 2015

# 以特定格式输出当前时间,格式字符串前以"+"开头,例如获得当前时间的epoch
$ date +%s
1421998051

# 设置当前时间
$ sudo date -s "2016-01-22 00:00:00"
Thu Jan 22 00:00:00 CST 2016

hwclock命令用于访问服务器的硬件CMOS时间,例如:

1
2
3
4
5
6
7
8
9
# 获取系统硬件时间
$ sudo hwclock
Fri 23 Jan 2015 03:33:17 PM CST -0.567492 seconds

# 设置操作系统的软件时间,与系统硬件时间同步
$ sudo hwclock -s

# 设置系统硬件时间,与操作系统的软件时间同步
$ sudo hwclock -w

系统时间和硬件时间的同步

1
2
3
4
5
# 把系统时间设置成硬件时间
hwclock --systohc

# 硬件时间设置成系统时间
hwclock --hctosys

时间相关背景

NTP 通信协议原理

  1. 首先主机启动 NTP

  2. 客户端会向 NTP 服务器发送调整时间的 message

  3. 然后 NTP server 会送出当前的标准时间给 client

  4. client 接受来自 server 的时间后,会根据这个信息来调整自己的时间

NTP 这个 deamon 采用了 UDP 123 端口,如果有防火墙,请允许该端口访问网络

相关的命令和配置文件

  • /etc/ntp.conf: NTP唯一的一个设置文件,linux各版本虽然目录不同,但文件名相同。可以用which ntp.conf 或者locate ntp.conf来查找

  • /usr/share/zoneinfo/: 这个里面规定了这个主要时区的时间设置文件

  • /etc/sysconfig/clock: 这个文件是linux的主要时区设置文件,每次开机后linux会自动读取这个文件来设置系统所默认的显示时间,里面内容示例:

    1
    2
    3
    4
    5
    6
    cat /etc/sysconfig/clock
    # The ZONE parameter is only evaluated by system-config-date.
    # The timezone of the system is defined by the contents of /etc/localtime.
    ZONE="Asia/Shanghai"
    UTC=true
    ARC=false
  • /etc/localtime: 本地端时间配置文件

    1
    2
    3
    4
    # 设置时区
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    # 或
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • /bin/date: 这个是时间的修改命令,可以输出时间,也可以修改时间

  • /sbin/hwclock: 因为linux系统上面BIOS时间与linux系统时间是分开的,所以使用date这个指令调整了时间之后,还需要使用hwclock才能将修改过的时间写入BIOS中

  • /usr/sbin/ntpd: 这是NTP的daemon文件,需要启动它才能提供NTP服务,这个命令会读取/etc/ntp.conf里面的设置

  • /usr/sbin/ntpdate: 这是 client 用来连接 NTP Server 的主要执行文件,如果您不想启用 NTP,只想启用 NTP Client 功能的话,可以只应用此命令

  • /usr/sbin/ntptrace: 可以用来追踪某台时间服务器的时间对应关系

时间同步

ntpd 与 ntpdate 的区别

简单来说,ntpd 是校准时间(渐变),ntpdate 是调整时间(跳跃)

ntpdate 方式同步

1
2
3
4
5
# 先安装 ntpdate
yum install ntpdate

# 从服务器更新时间
ntpdate cn.pool.ntp.org

ntp方式

CentOS下安装配置ntp服务的步骤如下

1
2
3
4
5
6
7
8
9
10
11
# 安装ntp服务的软件包
sudo yum install ntp

# 将ntp服务设置为缺省启动
sudo chkconfig ntpd on

# 修改启动参数,增加-g -x参数,允许ntp服务在系统时间误差较大时也能正常工作
sudo vi /etc/sysconfig/ntpd

# 启动ntp服务
sudo service ntpd restart

Ubuntu/Debian下安装配置ntp服务的步骤如下

1
2
3
4
5
6
7
8
# 安装ntp服务的软件包
sudo apt-get install ntp

# 修改启动参数,增加-g -x参数,允许ntp服务在系统时间误差较大时也能正常工作
sudo vi /etc/default/ntp

# 启动ntp服务
sudo service ntp restart

同步状态查看

ntp 服务运行后,可以通过如下命令查看与上游时间服务器的同步情况

ntpq -p

1
2
3
4
5
6
7
ntpq -p

remote refid st t when poll reach delay offset jitter
==============================================================================
ntp.tums.ac.ir .INIT. 16 u - 64 0 0.000 0.000 0.000
+time6.aliyun.co 10.137.38.86 2 u 18 64 1 27.059 4.211 0.367
*ptr.dns1.js.chi 61.160.246.234 2 u 17 64 1 14.669 3.108 4.363

推荐几个时间同步服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cn.pool.ntp.org
asia.pool.ntp.org
time1-7.aliyun.com (阿里云 7 个服务器)
ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
s1a.time.edu.cn 北京邮电大学
s1b.time.edu.cn 清华大学
s1c.time.edu.cn 北京大学
s1d.time.edu.cn 东南大学
s1e.time.edu.cn 清华大学
s2a.time.edu.cn 清华大学
s2b.time.edu.cn 清华大学
s2c.time.edu.cn 北京邮电大学
s2d.time.edu.cn 西南地区网络中心
s2e.time.edu.cn 西北地区网络中心
s2f.time.edu.cn 东北地区网络中心
s2g.time.edu.cn 华东南地区网络中心
s2m.time.edu.cn 北京大学
time.nist.gov
time.nuri.net