在 windows 中,系统时间的设置非常直观,通过界面操作即可完成,设置后无论重启还是关机,系统时间都会自动保存到 bios 时钟中,启动计算机时,系统会从 bios 中获取硬件时间,确保时间的连续性。然而,在 linux 中,默认情况下,系统时间和硬件时间并不会自动同步。linux 运行过程中,系统时间和硬件时间以异步方式运行,互不干扰。硬件时间依赖于 bios 电池来维持,而系统时间则由 cpu tick 维持。在系统启动时,linux 会从 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
4. 不同机器之间的时间同步
为了避免主机时间因长时间运行而产生偏差,同步时间是必要的。Linux 系统通常使用 NTP 服务器来同步不同机器的时间。一台机器可以同时作为 NTP 服务端和客户端。在生产环境中,建议使用类似 DNS 服务器的分层时间服务器来同步时间。
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 参数可以越过防火墙与主机同步。
常用 NTP 服务器:
美国: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 服务器同步,只需安装 ntpdate 软件:
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。
(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.confPermit 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-startingpolling 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.95095 222.73.214.125:stratum 2,offset –0.000787,synch distance 0.10857 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 时间同步方案设计

方案详细解释:
(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 高可用之MGC(多主同时写入)→










