linux系统硬件时间同步
① linux 时间同步
在Linux系统中存在两个时钟时间,分别是
硬件时钟是指的在主板上的时钟设备,也就是通常可以在BIOS画面设置的时钟,即使关机状态也可以计算时间。
而系统时钟则是指Kernel中的时钟,其值是由1970年1月1日00:00:00 UTC时间至当前时间所经历的秒数总和。当Linux启动的时候,系统时钟会读取硬件时钟的设定,之后系统时钟独立运作。长时间运行两者可能将会产生误差。另外所有的Linux相关指令都是读取系统时钟指定的,如date。
我们这里讨论的是系统时间。
NTP,网络时间协议,使用 123/udp 端口进行网络时钟同步;NTP 是仍在使用中的最古老的网络传输协议之一(1985 年前开始)。
以前Linux时间同步基本是使用 ntpdate 和 ntpd 这两个工具实现的,但是这两个工具已经很古老了。
【注】ntpdate和ntpd是互斥的,两者不能同时使用。ntpd是步进式平滑的逐渐调整时间,而ntpdate是断点式更新时间。
RHEL/CentOS 7.x 已经将 chrony 作为默认时间同步工具了。
其他Linux (如 ubuntu) 使用 systemd-timesyncd 服务。
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
Edit file /etc/chrony.conf
默认已经启动,不需要调整
example:
配置 chrony
edit file: /etc/chrony.conf
再次用chronyc 命令检查,比较它与chronyd server的差异
systemd-timesyncd 是一个用于跨网络同步系统时钟的守护服务。它实现了一个 SNTP 客户端,但更轻量级,更集成systemd。
systemd-timesyncd 启动时会读取 /etc/systemd/timesyncd.conf 配置文件,内容如下:
你可以输入你希望使用的其它时间服务器,比如你自己的本地 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 set-timezone ZONE ,设置时区。
NTP synchronized: yes 表示时间是同步状态。
查看服务状态以及从哪个ntp server同步时间。
NTP:软件层面实现,成本低。同步精度10ms左右。
PTP:需要网络接口具备在物理层提供时间戳的功能,同步精度优于100ns,局域网的节点需要使用支持PTP功能的交换机。局域网网络接点不支持PTP的话,只能同不到us,而且受网络背景流量影响。
② linux系统时钟同步命令
1. date命令
#date 查看系统时间
#date -set “10/30/20 11:30” 设置月/日/年/ 时:分:秒
2.clock命令
#clock -show 查看硬件时间
3.硬件时间和系统时间同步
重新启动系统,硬件时间会读取系统时间,实现同步。
但是,不重启的情况下,需要用clock命令实现同步。
#clock -systohc
③ Linux系统下的NTP配置
第一步,选择最好的NTP服务地址
具体命令为ntpdate -q IP地址或域名
广东地区NTP优选结果如下:
①time4.cloud.tencent.com
②server time.asia.apple.com
③server cn.ntp.org.cn
④server ntp.aliyun.com
⑤server cn.pool.ntp.org
检查BIOS主板时间的命令
hwclock -r
NTP服务启停命令
sudo systemctl start/stop ntpd
检查查看ntp服务器有无和上层ntp连通
ntpstat
查看ntp服务器与上层ntp的状态
ntpq -pn
===server选项格式===
server host [ key n ] [ version n ] [ prefer ] [ mode n ] [ minpoll n ] [ maxpoll n ] [ iburst ]
其中host是上层NTP服务器的IP地址或域名,随后所跟的参数解释如下所示:
◆ key: 表示所有发往服务器的报文包含有秘钥加密的认证信息,n是32位的整数,表示秘钥号。
◆ version: 表示发往上层服务器的报文使用的版本号,n默认是3,可以是1或者2。
◆ prefer: 如果有多个server选项,具有该参数的服务器优先使用。
◆ mode: 指定数据报文mode字段的值。
◆ minpoll: 指定与查询该服务器的最小时间间隔为2的n次方秒,n默认为6,范围为4-14。
◆ maxpoll: 指定与查询该服务器的最大时间间隔为2的n次方秒,n默认为10,范围为4-14。
◆ iburst: 当初始同步请求时,采用突发方式接连发送8个报文,时间间隔为2秒。
===同步硬件时钟===
ntp服务,默认只会同步系统时间。
如果想要让ntp同时同步硬件时间,可以设置/etc/sysconfig/ntpd文件,
在/etc/sysconfig/ntpd文件中,添加【SYNC_HWCLOCK=yes】这样,就可以让硬件时间与系统时间一起同步。
允许BIOS与系统时间同步,也可以通过hwclock -w 命令。
hwclock命令用来查询和设置硬件时钟。
hwclock -r 读取并打印硬件时钟
hwclock -s 将硬件时钟同步到系统时钟
hwclock -w 将系统时钟同步到硬件时钟
系统时钟与硬件时钟
在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
参考文档:
Linux服务器NTP客户端配置——https://www.cnblogs.com/paul8339/p/10059364.html
NTP服务、客户端配置详解——https://blog.51cto.com/u_11392081/1784080
④ linux的硬件时钟
什么是硬件时钟?
记录在CMOS中的时钟,和系统是没有关系的。是靠纽扣电池来保存和计数的。硬件时钟能记录的信息有且仅有一个时间值(注意,和时区没有一毛钱关系)。所以,当我们设置硬件时钟的时候,仅仅是设置了一个数值。当我们读取硬件时钟的时候,也仅仅是一个数值。
每次操作系统启动的时候,都会读取这个数值,然后同步到系统时钟中。但是光读取这个数值,对操作系统而言毫无意义(它不知道,你这个数值具体是哪个时区下的时间,自然就无法同步到系统时钟)
那么怎么知道硬件时钟记录的时间是哪个时区的呢(local or utc)?只能是人为指定了(系统启动的时候,自己指定。我认为系统自己指定也是人为指定的一种吧),我们下面看下例子(一个读,一个写),看看怎么解释(网上很多解释我觉的不靠谱)
这里哪里能看出人为指定的时区是什么呢?
缺省的就是这个文件/etc/adjtime指定的(很多人说centos 6中是/etc/sysconfig/clock这个文件。不解释了,忘记这个文件吧)
看下/etc/adjtime的内容:
这里是UTC,所以上面的读写含义分别是
读取出来的这个硬件时间是UTC的,直接同步到系统时间(我认为系统时间存的是UTC时间)。如果读取出来的时间是LOCAL的,是不能直接同步系统时间的。先找到系统的时区文件/etc/localtime,根据当前时区计算出UTC时间,再同步到系统时间(还有一点,这里说一下, hwclock读取的时候,最后都是以local时间显示出来的,所以可能还有一层转换)
把"2015-08-14 16:45:05"这个时间直接写入硬件时钟,同时更新/etc/adjtime的内容(方便下一次读的时候,找到正确的时区)
那怎么覆盖/etc/adjtime的内容呢?
在读写的时候可以显示指定,例如hwclock --local,hwclock --utc(如果不显示指定,则使用/etc/adjtime的值)
⑤ linux系统硬件时间和系统时间
在Linux中有硬件时钟与系统时钟两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。所有Linux相关指令与函数都是读取系统时钟的设定。因为存在两种不同的时钟,那么它们之间就会存在差异。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。
用date命令对系统时间进行设置后,并不会去修改硬件时钟,所以系统重启后,系统时间还算会去读取硬件时间,这就是为何date设置失效到原因。
因此,需要在设置系统时间后,将系统时间同步到硬件时钟。
clock/hwclock:
显示与设定硬件时钟(query and set the hardware clock (RTC)),两个命令相同。RTC=Real Time Clock,也就是硬件时钟。
命令参数:
-r, --show 读取并打印硬件时钟(read hardware clock and print result)-s, --hctosys 将硬件时钟同步到系统时钟(set the system time from the hardware clock)-w, --systohc 将系统时钟同步到硬件时钟(set the hardware clock to the current system time)
命令示例:
1. 查看硬件时钟
2014年03月27日 星期四 11时03分50秒 -0.328520 seconds
[root@localhost ~]# hwclock -r
2014年03月27日 星期四 11时03分53秒 -0.797264 seconds
[root@localhost ~]# hwclock --show
2014年03月27日 星期四 11时04分01秒 -0.672267 seconds
2. clock与hwclock相同
同步网络时间到系统时间
[root@localhost ~]# ntpdate 210.72.145.4427 Mar 11:11:24 ntpdate[4766]: adjust time server 210.72.145.44 offset 0.011401 sec
210.72.145.44(中国西安授时中心的官方时间同步服务器IP域名)
同步网络时间到系统时间后,就可以用hwclock -w将系统时间同步到硬件时间。
修改时区
可能部分系统在执行以上两步后,在重启后仍然失效,所以需要进行时区修改。
[root@localhost ~]# tzselect #按照提示进行选择时区
[root@localhost ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改系统时间配置文件
[root@localhost ~]# /etc/sysconfig/clock
#打开clock文件,将相关内容改成以下内容
UTC=false
ARC=false
ZONE="Asia/Shanghai"
重启系统
[root@localhost ~]# reboot
⑥ linux系统如何设置时间同步
linux自带了ntp服务
--
/etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间。
配置文件就是/etc/ntp.conf。
为了测试,设置让node2
--
192.168.1.102和node1
--
192.168.1.101做时间同步。
第一步,
node1做time
server,node1本身不和其他机器时间同步,就是取本地时间。
所以,先把node1机器的时间调准了:
[root@node1
~]date
-s
08/03/2011
[root@node1
~]date
-s 11:12:00
[root@node1
~]clock
-w
[root@node1
~]hwclock
--systohc
后两个命令是把设置的时间写到硬件时间中去(也就是cmos里面的时间)。
第二步,
然后将node1配置成一个time
server,修改/etc/ntp.conf,
[root@node1
~]vi
/etc/ntp.conf
其他的配置不怎么需要改,只需要关注restrict的配置:
1.
注释掉原来的restrict
default
ignore这一行,这一行本身是不响应任何的ntp更新请求,其实也就是禁用了本机的ntp
server的功能,所以需要注释掉。
2.
加入:restrict
192.168.1.0
mask
255.255.255.0
--
让192.168.1.0/24网段上的机器能和本机做时间同步
3.
这样就可以了,记得下面的:
server
127.127.1.0
#
local
clock
fudge
127.127.1.0
stratum
10
这两行需要,这是让本机的ntpd和本地硬件时间同步。
当然,我们也可以添加server
xxx.xxx.xxx.xxx,让他和其他的time
server时间同步。
4.
/etc/init.d/ntpd
restart
5.
chkconfig
ntpd
on
6.
修改iptables配置,将tcp和udp
123端口开放,这是ntp需要的端口,在/etc/services中可以查到这个端口。
第三步,
这样node1就成为一台time
server了,现在我们配置node2这台机器,也是修改/etc/ntp.conf
,
[root@node2
~]vi
/etc/ntp.conf
1.
restrict
default
ignore这行保留为注释状态,因为sales不需要做time
server
2.
注释掉server
127.127.1.0,
fudge
127.127.1.0
stratum
10这两行,因为这台机器不需要和本地硬件时钟同步了。
3.
加入server
192.168.1.101这行,和node1机器同步。
这样就ok了。看看时间,已经和node1同步了。往后默认配置好像是5分钟和time
server同步一次。ntpdate命令是显式的和某台机器做时间同步,以前将ntpdate放到crontab中定期同步也是可以的,但是既然ntpd本身就可以做这个时间
第四步,将ntpdate放到crontab中定期步也是可以的
[root@node2
~]#vi
ntpupdate.sh
/usr/sbin/ntpdate
192.168.1.101
[root@node2
~]#chmod
755
ntpupdate.sh
[root@node2
~]#crontab
-e
*/1
*
*
*
*
/root/ntpupdate.sh
[root@node2
~]#/etc/init.d/crond
restart
⑦ linux系统怎么设置时间同步
命令行界面操作
1、对于linux系统大多数是命令行界面,所以先介绍字符界面同步时间方法。 首选安装ntpdate 时间同步服务, 利用yum install ntpdate
2、接着把linux系统时间同步到windows time公共时间服务器, ntpdate time.windows.com
3、设置时间同步脚本,虽然以上已经同步了时间,但是如果连不上网或者关机就不一样的时间了。可以通过设置计划任务,每天0点同步一下。
添加到crontab任务文件添加:00 0 1 * * root ntpate -s time.windows.com
4、除此之外,我们还可以通过用date命令查看 和手动设置系统时间(必须管理员账号权限。
图形界面设置
1、如果对命令行不熟悉,也可以通过图形界面设置来实现系统时间同步。 找到系统工具----管理员功能选项--- date\时间 和日期
2、启用网络时间,并且与之同步找到date\time 时间菜单之后,勾选“synchronize date and time over the network ”
3、设置正确的当地时区,除此之外,centos系统会根据当期语言来设置默认的时间和时区。对于咗嚛所在的china时间,是北京时间(下面那个UTC时间不要勾)
⑧ 如何使两台linux服务器时间同步
Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个timeserver的角色,让其他机器和他同步时间。
配置文件就是/etc/ntp.conf。
为了测试,设置让node2 -- 192.168.1.102和node1 -- 192.168.1.101做时间同步。
第一步,
node1做time server,node1本身不和其他机器时间同步,就是取本地时间。
所以,先把node1机器的时间调准了:
[root@node1 ~]date -s 08/03/2011
[root@node1 ~]date -s11:12:00
[root@node1 ~]clock -w
[root@node1 ~]hwclock --systohc
后两个命令是把设置的时间写到硬件时间中去(也就是CMOS里面的时间)。
第二步,
然后将node1配置成一个time server,修改/etc/ntp.conf,
[root@node1 ~]vi /etc/ntp.conf
其他的配置不怎么需要改,只需要关注restrict的配置:
1. 注释掉原来的restrict default ignore这一行,这一行本身是不响应任何的ntp更新请求,其实也就是禁用了本机的ntp server的功能,所以需要注释掉。
2. 加入:restrict 192.168.1.0 mask 255.255.255.0 -- 让192.168.1.0/24网段上的机器能和本机做时间同步
3. 这样就可以了,记得下面的:
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
这两行需要,这是让本机的ntpd和本地硬件时间同步。
当然,我们也可以添加server xxx.xxx.xxx.xxx,让他和其他的time server时间同步。
4. /etc/init.d/ntpd restart
5. chkconfig ntpd on
6. 修改iptables配置,将tcp和udp 123端口开放,这是ntp需要的端口,在/etc/services中可以查到这个端口。
第三步,
这样node1就成为一台time server了,现在我们配置node2这台机器,也是修改/etc/ntp.conf ,
[root@node2 ~]vi /etc/ntp.conf
1. restrict default ignore这行保留为注释状态,因为sales不需要做time server
2. 注释掉server 127.127.1.0, fudge 127.127.1.0 stratum 10这两行,因为这台机器不需要和本地硬件时钟同步了。
3. 加入server 192.168.1.101这行,和node1机器同步。
这样就OK了。看看时间,已经和node1同步了。往后默认配置好像是5分钟和time server同步一次。ntpdate命令是显式的和某台机器做时间同步,以前将ntpdate放到crontab中定期同步也是可以的,但是既然ntpd本身就可以做这个时间
第四步,将ntpdate放到crontab中定期步也是可以的
[root@node2 ~]#vi ntpupdate.sh
/usr/sbin/ntpdate 192.168.1.101
[root@node2 ~]#chmod 755 ntpupdate.sh
[root@node2 ~]#crontab -e
*/1 * * * * /root/ntpupdate.sh
[root@node2 ~]#/etc/init.d/crond restart
⑨ linux硬件时间与系统时间同步
方法/步骤
打开Ubuntu虚拟机,在桌面空白处右键 -- 打开终端。
⑩ linux多主机时间同步方法
假设现在有三台linux主机:
172.16.1.104
172.16.1.105
172.16.1.106
在图示位置加入红色框选中内容
会有显示:25 Oct 14:20:21 ntpdate[3407]: adjust time server 172.16.1.104 offset -0.002740 sec
会有显示:25 Oct 14:20:21 ntpdate[3407]: adjust time server 172.16.1.104 offset -0.002740 sec
此时105、106主机的时间就与104主机完全同步了
方法1我试了一下,当一天之后服务器经过多次重启好像时间又有了误差
我们还可以将系统时间同步到BIOS时间,因为每次开机的时候,系统会重新由 BIOS 将时间读出来,所以, BIOS 才是重要的时间依据。
另外两个主机都执行这个操作,这样应该就不变了
当然这是多主机时间同步的方法之一,还可以都同步网络时间(上海时间),但是那样需要网络
另外两个主机重复以上操作
补充说明: ntpdate -u ntp.api.bz 命令中的 ntp.api.bz 指NTP服务器(上海),也可换成:
也可参考这个链接: http://blog.51cto.com/arm2012/1977075
原文链接: https://blog.csdn.net/qq_28903377/article/details/84550050