时间同步 Linux

Linux 系统时间同步方法小结

Posted on 2020-11-11,15 min read

在 Windwos 中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在 BIOS 时钟里面,启动计算机的时候,系统会自动在 BIOS 里面取硬件时间,以保证时间的不间断。但在 Linux 下,默认情况下,系统时间和硬件时间并不会自动同步。在 Linux 运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。硬件时间的运行,是靠 BIOS 电池来维持,而系统时间,是用 CPU Tick 来维持的。在系统开机的时候,会自动从 BIOS 中取得硬件时间,设置为系统时间。

1. Linux 系统时间的设置

在 Linux 中设置系统时间,可以用 date 命令:

//查看时间
[root@node1 ~]# date
Tue Feb 25 20:15:18 CST 2014
//修改时间
[root@node1 ~]# date -s "20140225 20:16:00"  #yyyymmdd hh:mm:ss
Tue Feb 25 20:16:00 CST 2014
//date 有多种时间格式可接受,查看date --help

2. Linux 硬件时间的设置

硬件时间的设置,可以用 hwclock 或者 clock 命令。两者基本相同,只用一个就行,只不过 clock 命令除了支持 x86 硬件体系外,还支持 Alpha 硬件体系。

//查看硬件时间可以是用hwclock ,hwclock --show 或者 hwclock -r
[root@node1 ~]# hwclock --show
Tue 25 Feb 2014 08:21:14 PM CST -0.327068 seconds
//设置硬件时间
[root@node1 ~]# hwclock --set --date "20140225 20:23:00"
[root@node1 ~]# hwclock
Tue 25 Feb 2014 08:23:04 PM CST -0.750440 seconds

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

同步系统时间和硬件时间,可以使用 hwclock 命令。

//以系统时间为基准,修改硬件时间
[root@node1 ~]# hwclock --systohc <== sys(系统时间)to(写到)hc(Hard Clock)
//或者
[root@node1 ~]# hwclock -w
//以硬件时间为基准,修改系统时间
[root@node1 ~]# hwclock --hctosys
//或者
[root@node1 ~]# hwclock -s

4. 不同机器之间的时间同步

为了避免主机时间因为长期运行下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。Linux 系统下,一般使用 ntp 服务器来同步不同机器的时间。一台机器,可以同时是 ntp 服务端和 ntp 客户端。在生产系统中,推荐使用像 DNS 服务器一样分层的时间服务器来同步时间。

不同机器间同步时间,可以使用 ntpdate 命令,也可以使用 ntpd 服务。

4.1 ntpdate 命令

使用 ntpdate 比较简单。格式如下:

1 [root@node1 ~]# ntpdate [NTP IP/hostname]
2 [root@node1 ~]# ntpdate 192.168.0.1
3 [root@node1 ~]# ntpdate cn.pool.ntp.org

ntpdate命令

ntpdate -u cn.pool.ntp.org :网络时间同步命令

注意:若不加上-u参数, 会出现以下提示:no server suitable for synchronization found

-u:从man ntpdate中可以看出-u参数可以越过防火墙与主机同步;

美国:time.nist.gov
复旦:ntp.fudan.edu.cn
微软公司授时主机(美国) :time.windows.com
台警大授时中心(台湾):asia.pool.ntp.org

但这样的同步,只是强制性的将系统时间设置为 ntp 服务器时间。如果 CPU Tick 有问题,只是治标不治本。所以,一般配合 cron 命令,来进行定期同步设置。比如,在 crontab 中添加:

0 12 * * * /usr/sbin/ntpdate 192.168.0.1

这样,会在每天的 12 点整,同步一次时间。ntp 服务器为 192.168.0.1。

或者将下列脚本添加到 / etc/cron.hourly/,这样就每小时会执行一次同步:

#!/bin/bash
#
# $Id: sync-clock,v 1.6 2009/12/23 15:41:29 jmates Exp $
#
# Use ntpdate to get rough clock sync with department of Genome Sciences
# time server.

NTPDATE=/usr/sbin/ntpdate
SERVER="192.168.0.1 "

# if running from cron (no tty available), sleep a bit to space
# out update requests to avoid slamming a server at a particular time
if ! test -t 0; then
  MYRAND=$RANDOM
  MYRAND=${MYRAND:=$$}

  if [ $MYRAND -gt 9 ]; then
    sleep `echo $MYRAND | sed 's/.*\(..\)$/\1/' | sed 's/^0//'`
  fi
fi

$NTPDATE -su $SERVER
# update hardware clock on Linux (RedHat?) systems
if [ -f /sbin/hwclock ]; then
  /sbin/hwclock --systohc
fi

4.2 ntpd 服务

使用 ntpd 服务,要好于 ntpdate 加 cron 的组合。因为,ntpdate 同步时间会造成时间的突变和跳跃,对一些依赖时间的程序和服务会造成影响。比如 sleep,timer 等。而且 ntpd 服务可以在修正时间的同时,修正 CPU Tick。因此理想的做法为,在开机的时候,使用 ntpdate 强制同步时间,在其他时候使用 ntpd 服务来同步时间。

安装ntpd 服务

yum install ntp -y                          # 安装 NTP 服务
# 获取当前系统的时区,如果时区为 (Shanghai) 则打印,如果不是则利用 || 符号
# 如果执行失败,则执行 || 后面的命令
timedatectl | grep 'Shanghai' || timedatectl set-timezone Asia/Shanghai  # 将当前主机的时区设为 亚洲/上海
systemctl enable ntpd.service               # 开机自启动
systemctl restart ntpd.service              # 启动 NTP 服务守护程序
firewall-cmd --add-service=ntp
firewall-cmd --add-service=ntp --permanent  # 在防火墙上开放 NTP 服务

要注意的是,ntpd 有一个自我保护的机制:如果本机与上源时间相差太大,ntpd 不会运行时间同步操作,所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ntpd 服务。ntpd 服务运行后,先是每 64 秒与上源 NTP 服务器同步一次,根据每次同步时测得的误差值经复杂计算逐步调整自己的时间,随着误差减小,逐步增加同步的间隔。每次跳动,都会重复这个调整的过程。

和内网NTP服务器去同步 此时只需安装utpdate软件

yum -y install ntpdate

但需添加计划任务 让服务器周期性去同内网NTP同步

 vi  /var/spool/cron/root(或crontab -e)

在每天的0点10分、8点10分、16点10分与时间同步服务器进行同步并写入BIOS

10 0,8,16 * * *  /usr/sbin/ntpdate 10.3.5.5; /sbin/hwclock -w

如果同步不正常,可以加输出日志1.txt或看系统日志者看/var/mail/root系统邮件

0 */8  * * *  /usr/sbin/ntpdate 10.3.5.5 >>/tmp/1.txt; /sbin/hwclock -w

也可以编辑cat /etc/sysconfig/ntpdate 中的SYNC_HWCLOCK=yes 自动同步到硬件时间

4.3. ntpd 服务的设置

ntpd 服务的相关设置文件如下:

(1)/etc/ntp.conf:这个是 NTP daemon 的主要设文件,也是 NTP 唯一的设定文件。

(2)/usr /share/zoneinfo/:在这个目录下的文件其实是规定了各主要时区的时间设定文件,例如北京地区的时区设定文件在 /usr/share/zoneinfo/Asia/Shanghai 就是了。这个目录里面的文件与底下要谈的两个文件 (clock 与 localtime) 是有关系的。

(3)/etc/sysconfig/clock:这个文件其实也不包含在 NTP 的 daemon 当中,因为这个是 Linux 的主要时区设定文件。每次开机后,Linux 会自动的读取这个文件来设定自己系统所默认要显示的时间。

(4)/etc /localtime:这个文件就是 "本地端的时间配置文件"。刚刚那个 clock 文件里面规定了使用的时间设置文件 (ZONE) 为 /usr/share/zoneinfo/Asia/Shanghai ,所以说,这就是本地端的时间了,此时, Linux 系统就会将 Shanghai 那个文件另存为一份 /etc/localtime 文件,所以未来我们的时间显示就会以 Beijing 那个时间设定文件为准。

下面重点介绍 /etc/ntp.conf 文件的设置。在 NTP Server 的设定上,建议不要对 Internet 无限制的开放,尽量仅提供局域网内部的 Client 端联机进行网络校时。此外,NTP Server 总也是需要网络上面较为准确的主机来自行更新自己的时间啊,所以在我们的 NTP Server 上面也要找一部最靠近自己的 Time Server 来进行自我校正。事实上, NTP 这个服务也是 Server/Client 的一种模式。

[root@linux ~]# vi /etc/ntp.conf 
# Permit all access over the loopback interface.
# This could be tightened as well, but to do so would effect some of the administrative functions.
restrict 127.0.0.1
restrict ::1
restrict 172.16.18.0 mask 255.255.255.0  default nomodify notrap
restrict 192.168.168.0 mask 255.255.255.0  default nomodify notrap
restrict 192.168.57.0 mask 255.255.255.0  default nomodify notrap # 允许目标子网同步时间请求,具有默认,不能修改,不能陷阱 等权限
 
# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
 
# Use public servers from the pool.ntp.org project.
server 127.127.1.0 prefer           # 设置NTP服务器使用 127.127.1.0 主板BIOS上的时钟为时间源,并且使用 prefer(优先)权限
server 0.centos.pool.ntp.org iburst
server 1.cn.pool.ntp.org iburst     # 使用公网上的 NTP 服务器作为时间源服务器
server 192.168.168.100 iburst       # 使用内网上的 NTP 服务器作为时间源服务器
 
# Enable public key cryptography. crypto
includefile /etc/ntp/crypto/pw
 
# Key file containing the keys and key identifiers used when operating with symmetric key cryptography.
keys /etc/ntp/keys
 
disable monitor
systemctl restart ntpd.service              # 重启 NTP 服务守护程序
timedatectl set-local-rtc false

总结一下,restrict 用来设置访问权限,server 用来设置上层时间服务器,driftfile 用来设置保存漂移时间的文件。

4.4 ntpd 服务的启动与查询

在启动 NTP 服务前,先对提供服务的这台主机手动的校正一次时间(因为启动服务器,端口会被服务端占用,就不能手动同步时间了)。

[root@node1 ~]# ntpdate cn.pool.ntp.org
25 Feb 21:10:52 ntpdate[9549]: adjust time server 202.112.31.197 offset 0.000101 sec

然后,启动 ntpd 服务:

systemctl start ntpd

查看端口(ntpd 服务使用 UDP 的 123 端口):

[root@node1 ~]# netstat -ln |grep :123
udp 0 0 12.12.12.100:123 0.0.0.0:*
udp 0 0 192.168.0.100:123 0.0.0.0:*
udp 0 0 172.18.226.174:123 0.0.0.0:*
udp 0 0 10.10.10.100:123 0.0.0.0:*
udp 0 0 127.0.0.1:123 0.0.0.0:*
udp 0 0 0.0.0.0:123 0.0.0.0:*
udp 0 0 fe80::225:90ff:fe98:61ff:123 :::*
udp 0 0 fe80::225:90ff:fe98:61fe:123 :::*
udp 0 0 fe80::202:c903:1b:afa1:123 :::*
udp 0 0 ::1:123 :::*
udp 0 0 :::123 :::*

如何确认我们的 NTP 服务器已经更新了自己的时间呢?

[root@node1 ~]# ntpstat
synchronised to NTP server (202.120.2.101) at stratum 4
time correct to within 557 ms
polling server every 64 s
# 该指令可列出NTP服务器是否与上层联机。由上述输出结果可知,时间校正约
# 为557*10(-6)秒,且每隔64秒会主动更新时间。

常见的错误:

unsynchronized time server re-starting polling server every 64 s
// 或者
25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found

其实,这不是一个错误。而是由于每次重启 NTP 服务器之后大约要 3-5 分钟客户端才能与 server 建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。

[root@node1 ~] # ntptrace –n
127.0.0.1:stratum 11, offset 0.000000,synch distance 0.950951
222.73.214.125:stratum 2,offset –0.000787,synch distance 0.108575
209.81.9.7:stratum 1,offset 0.000028,synch distance 0.00436,refid 'GPS'
# 这个指令可以列出目前NTP服务器(第一层)与上层NTP服务器(第二层)
# 彼此之间的关系,注意:该命令需要安装ntp-perl包

ntpq 命令:

[root@node1 ~]# ntpq -p

指令 "ntpq -p" 可以列出目前我们的 NTP 与相关的上层 NTP 的状态,以上的几个字段的意义如下:

remote:即 NTP 主机的 IP 或主机名称。注意最左边的符号,如果由 "+“则代表目前正在作用钟的上层 NTP,如果是”*" 则表示也有连上线,不过是作为次要联机的 NTP 主机。

refid:参考的上一层 NTP 主机的地址
st:即 stratum 阶层
when:几秒前曾做过时间同步更新的操作
poll:下次更新在几秒之后
reach:已经向上层 NTP 服务器要求更新的次数
delay:网络传输过程钟延迟的时间
offset:时间补偿的结果
jitter:Linux 系统时间与 BIOS 硬件时间的差异时间

最后提及一点,ntp 服务默认只会同步系统时间。如果想要让 ntp 同时同步硬件时间,可以设置 / etc/sysconfig/ntpd 文件。

在 / etc/sysconfig/ntpd 文件中,添加 SYNC_HWCLOCK=yes 这样,就可以让硬件时间与系统时间一起同步。

5. HPC 集群中时间同步示例
5.1 集群环境简介

管理节点:192.168.0.100,192.168.0.101
计算节点:192.168.0.1~192.168.0.50
I/O 节点:192.168.0.51~192.168.0.54
Internet NTP 服务器:cn.pool.ntp.org

5.2 时间同步方案设计

img

方案详细解释:

(1)管理节点 1 作为主 NTP 服务器,跟互联网 NTP 服务器进行时间同步;管理节点 2 作为备用 NTP 服务器,也跟互联网 NTP 服务器进行时间同步。两个管理节点做 Heartbeat,设置一个漂移 IP 地址 192.168.0.103,并对 ntpd 服务进行双机高可用;
(2)集群计算节点和 IO 节点,跟管理节点的虚拟 IP 地址 192.168.0.103 通过 ntpd 服务做时间同步;
(3)所有节点,在 ntp 时间同步的同时,设置硬件时间跟系统时间一致;
(4)所有计算节点和 IO 节点开机时,通过 ntpdate 跟 192.168.0.103 进行时间同步,然后再开启 ntpd 服务。

下一篇: 在Docker中安装使用MySQL 部署PXC高可用(多主同时写入)→