一、什么是NTP ?

NTP

Network Time Protocol 网络时间协议
它属于应用层协议,传输层采用UDP,用于同步设备之间的时间。提供时间规范的的设备为服务器,接收时间服务的设备为客户端。NTP的时间来源是国际标准时间UTC(Universial Time Coordinated)

ntpd

NTP守护进程
它是操作系统守护进程,提供完整的NTP应用服务。为了追求最高精度(可以达到约232皮秒),ntpd会完成复杂的计算。ntpd启动时,从配置文件ntp.conf中读取同步数据来源以及相关设置。使用ntpq命令可以查看当前连接的时间服务器状态。

二、为什么要用NTP ?

对于计算机集群,计算机设备要使用统一的标准时间,来记录各种事件的发生时序,若计算机时间不同步,很多依赖时序运行的应用就会逻辑混乱,出现问题。

配置再好,性能再高的计算机,运行久了也会有时钟误差。只有原子钟能够持续提供高精度的时间,但其费用昂贵,只有少数计算机可以连接原子钟,作为公共NTP服务器。

NTP主要应用于要求网络中全部设备时钟保持一致的场景,比如从计算机集群中获取日志,多终端的计费系统计时,重启网络中所有设备等。

三、如何配置NTP服务器 ?

Ubuntu

要把一台主机用作NTP服务器,首先要保证其能通外网。
它先与外部时间服务器同步,然后给内部各主机提供同步服务。
第一步:安装ntp软件包
第二步:修改配置文件
第三步:启动ntpd进程
第四步:监视时间同步情况
第五步:退出ntpd进程

1.安装ntp

~$ sudo apt install ntp

  • 查看相关帮助手册
    ~$ man ntpd
    ~$ man ntp.conf
    ~$ man ntpq

2.编辑配置文件

安装ntpd后,Ubuntu下默认的配置文件绝对路径是 /etc/ntp.conf
~$ sudo vim /etc/ntp.conf
具体编辑如下:

  • 你的计算机集群是封闭的还是开放的?
  • 如果封闭,则不采用任何外部NTP服务器给自己同步:
    注释掉所有pool相关语句
    #pool 0.ubuntu.pool.ntp.org iburst
    #pool 1.ubuntu.pool.ntp.org iburst
    #pool 2.ubuntu.pool.ntp.org iburst
    #pool 3.ubuntu.pool.ntp.org iburst
    #pool ntp.ubuntu.com
    然后在下一步添加本机作为服务器时,将stratum层级设置为0(最顶级)
  • 如果开放,则可以使用外部NTP服务器给自己同步校准:
    找到配置默认服务器地址的语句,在Ubuntu中是 pool 0.ubuntu.pool.ntp.org iburst 此句,通常会有几个备选服务器。在此句下方添加新的高层级NTP服务器,可以参考国内常用NTP服务器地址:
    本人在此选择了上海交通大学网络中心的服务器,于是添加语句:
    server ntp.sjtu.edu.cn iburst prefer
    甚至可以添加多个外部服务器
  • 设置本机为NTP服务器
    继续添加语句
    # set local as server
    server 127.127.1.0
    fudge 127.127.1.0 stratum 10
    设置层级为10,可根据具体情况修改。
    层级低的向层级高的获取时间,对于封闭集群,建议stratum设置为0
  • 添加限制访问权限
    只允许规定网段的主机访问本服务器,于是在
    restrict 127.0.0.1
    restrict ::1
    这两句下面添加语句(请使用ifconfig命令查询你的IP所在网段,mask掩码根据具体情况设置)
    restrict 172.16.166.0 mask 255.255.255.0 nomodify notrap
    nomodify 限制客户端不能使用ntpc和ntpq来修改服务器的时间参数
    notrap 不提供trap这个远程时间登录的功能
    另外还提供的参数有:
    ignore 拒绝所有类型的NTP连接
    noquery 禁止客户端查询服务器时间
    notrust 拒绝没有认证的客户端
    nopeer 不与同一层级的NTP服务器同步
  • 保存退出
    Esc,:wq,Enter,休息一下,泡杯咖啡

3.启动ntpd进程

~$ sudo service ntp start
查看是否开启成功:
~$ sudo service ntp status

4.监视时间同步情况

启动ntpd进程之后,服务器信息是不会打印出来的,需要用监视工具进行查看和监视,一般用到这两个:ntpstat 和 ntpq

  • ntpstat的使用(需单独安装)
    ~$ sudo apt install ntpstat
    ~$ sudo ntpstat
    时间同步情况将会打印到终端
  • ntpq的使用
    ntpq无需单独安装,安装ntp软件包时已被包含在内
    ~$ sudo watch ntpq -p
    同步情况会实时地显示出来,示例如下:

    每一列表示的意义如下:


表示

remote

*上级响应中最精准的NTP服务器 +响应请求的NTP服务器

refid

NTP响应服务器的更高级的时间基准服务器

st

响应的NTP服务器对应的stratum层级(stratum意义:低层级向高层级获取时间)

t

辅助信息

when

多久前做过时间同步更新(秒)

poll

下次更新在多久之后(秒)

reach

已向上层服务器要求更新次数

delay

网络传输中的延迟时间

offset

本地与服务器时间的差距,数值越接近0,时间差越小

jitter

系统时间与硬件时间的差异

5.退出ntpd进程

~$ sudo service ntp stop 即可

  • 如果出现异常,可以用kill强制杀掉进程
    ~$ ps auxc | grep ntpd
    找到对应进程pid,然后执行
    ~$ sudo kill pid

Windows

windows上配置NTP服务器的方法较简单,分为以下几步
第一步:关闭默认的时间提供程序
第二步:修改相应注册表项
第三步:剩下的交给命令行

1.关闭默认的时间提供程序

  • 打开本地组策略编辑器
    Win + R打开运行窗口,输入gpedit.msc,打开本地组策略编辑器
  • 关闭默认的时间提供程序
    找到路径:计算机配置 \ 管理模板 \ 系统 \ Windows时间服务 \ 时间提供程序

    配置 Windows NTP 客户端
    启用 Windows NTP 客户端
    启动 Windows NTP 服务端
    都改为 未配置 状态:

2.修改相应注册表项

  • 打开注册表编辑器
    Win + R打开运行窗口,输入regedit,点击确定打开注册表编辑器 (截图略)
  • 修改相应参数
    配置:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ W32Time \ Config
    AnnounceFlags:标记此计算机是否是可靠的
    FrequencyCorrectRate:控制校正时钟的速率(过小会引起过度校正,过大会过很长一段时间才能校正)
    MaxPollInterv 以及 MinPollInterval:系统轮询服务器的时间间隔最大值以及最小值,限制时间同步的频率
    参数:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ W32Time \ Parameters
    NtpServer:列出NTP服务器事件源的DNS名称或IP,多个地址用空格隔开
    Type:指定同步的对等方采用哪种方式同步,一般选择NTP
    客户端:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ W32Time \ TimeProviders \ NTPClient
    Enabled:是否作为客户端向上层获取时间同步,设为1表示开启(连接到外部时钟源)
    服务器:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ W32Time \ TimeProviders \ NTPServer
    Enabled:是否作为服务器向下层提供时间同步,设为1表示开启,现在配置服务器,所以一定是1
    (这里没有列出所有参数,具体设置数值请参考官方文档

3.命令行运行

  • 开启时间服务
    >net start w32time
  • 更新配置
    >w32tm /configure /update
  • 查询时间服务状态
    >w32tm /query /status
    若查询到的状态不是更新后的状态,可尝试再修改一下注册表,然后更新配置,再查询
  • 运行效果显示如下

    此时Windows已经可以作为服务器向其它客户端提供时间同步服务

四、客户端如何使用NTP服务?

Ubuntu

客户端和服务端只是在配置文件上有所不同
第一步:安装ntp软件包,以及ntpstat工具
第二步:修改配置文件
第三步:启动ntpd进程
第四步:监视时间同步情况
第五步:退出ntpd进程
第六步:添加定时自动同步功能

1.安装ntp和ntpstat

~$ sudo apt install ntp
~$ sudo apt install ntpstat

2.修改配置文件

~$ sudo vim /etc/ntp.conf
具体修改如下:

  • 将默认NTP服务器注释掉

    pool 0.ubuntu.pool.ntp.org
    改为
    #pool 0.ubuntu.pool.ntp.org
    对其余pool服务器语句做相同处理
  • 添加刚刚自己搭建的NTP服务器IP
    在注释掉的服务器后面添加自己搭建的服务器
    假设我的服务器IP是 172.16.166.139,则添加语句:
    server 172.16.166.139 iburst
    保存退出
    Esc,:wq,Enter

3.启动ntpd进程

请先确保您的NTP服务器已经开启ntp服务进程

~$ sudo service ntp start
查看是否开启成功:
~$ sudo service ntp status

4.监视时间同步情况

~$ sudo ntpstat
或者
~$ sudo watch ntpq -p(持续监视)

5.退出ntpd进程

~$ sudo service ntp stop

6.添加定时自动同步功能

  • 什么是crontab
    在Linux中,周期执行的任务一般由cron这个守护进程来处理,可以使用命令 ~$ ps auxc | grep cron 来查看它。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
    cron的配置文件一般在三个位置:一是 /etc/cron.d/ 目录下,二是 /var/spool/cron/ 目录下,
    三是系统配置文件 /etc/crontab。crontab是“cron table”的简写。
  • 修改crontab配置文件,实现定时自动同步
    ~$ sudo vim /etc/crontab
    打开crontab配置文件后,添加定时信息以及要执行的命令即可
    1)注意crontab特定的定时信息格式:
    m(minute) h(hour) dom(day-of-month) mon(month) dow(day-of-week)
    2)特殊字符的用法:
    * 表示范围内所有数字
    / 表示每,在h 下写 */5 表示每5小时,12-23/2 表示12点到23点中间每2小时
    - 表示取值范围内所有时间,在 mon 下写 1-4 表示每年1月到4月

现在我设置每隔2小时进行一次时间同步,可以作以下编辑:
0 */2 * * * root service ntp start; sleep 20; service ntp stop;
中间sleep20秒是为了ntpd有足够时间去获取同步,如果使用ntpdate(不推荐)则不需要此操作

  • 编辑crontab后记得保存退出,立即生效

Windows

如果您使用的是windows系统,那么需要
第一步:以管理员身份运行Windows命令行终端
第二步:用Windows自带的w32tm服务完成同步
第三步:其它相关操作

1. 运行Windows命令行终端

Windows菜单搜索“命令行提示符”

右键点击并选择“以管理员身份运行”,弹出终端

Android ntp 同步频率 ntp同步机制_ntp

2. 用w32tm服务完成同步

  • 开启w32time服务
    >net start w32time
  • 注册时间服务
    注册将作为服务运行的时间服务,并将其默认配置信息添加到注册表。
    >w32tm /register
  • 手动添加NTP时间同步服务器
    在此假设我的NTP服务器IP为172.16.166.139
    >w32tm /configure /syncfromflags:manual /manualpeerlist:“172.16.166.139,0x1” /update
    /manualpeerlist的参数列表中可以添加多个时间源,用空格分隔
  • 手动同步,执行后计算机会主动向服务器同步
    >w32tm /resync
  • 查看同步源
    >w32tm /query /source
  • 查看时间同步状态
    >w32tm /query /status
  • 运行效果显示如下
  • 退出w32time服务
    如果想停止时间同步服务,只需执行
    >net stop w32time

3. 其它相关操作

  • 设置系统轮询时间同步的频率(多少秒同步一次)
    Win + R打开运行窗口,输入gpedit.msc打开本地组策略编辑器
    根据路径:计算机配置 \ 管理模板 \ 系统 \ Windows 时间服务 \ 时间提供保护 \ 启用Windows NTP 客户端
    双击进入页面,选择已启用
    根据路径:计算机配置 \ 管理模板 \ 系统 \ Windows 时间服务 \ 时间提供保护 \ 配置Windows NTP 客户端
    双击进入页面,选择已启用
    注意到配置选项中有一项SpecialPollInterval(默认1024),手动设置此值,改变时间同步频率
  • 查看配置
    >w32tm /query /configuration
  • 查看本机与另一台计算机(假设是172.16.166.139)的时间漂移带状图
    >w32tm /stripchart /computer:172.16.166.139
  • 显示当前时区设置
    >w32tm /tz


五、*其它

为什么用ntpd不用ntpdate?

  • ntpdate的实现是立即同步,而ntpd的实现是平滑同步
    对于时间敏感的应用程序,时钟的跃变会造成较大影响,而ntpdate实现时间校准的方式就相当于“跃变”。它获取时间后,直接调用settimeofday设置系统时间,不安全,不精准,不优雅。而ntpd会一点点校准时间,虽然它用时更长,但对时间敏感的应用程序很友好。ntpd和ntpdate会占用同一个UDP端口,因此两者不能同时运行。

系统时间、硬件时间以及它们的同步

  • 系统时间(由Linux Kernel提供,它为运行的应用提供时序,每次关机时会同步到硬件时间,开机时会从硬件时间同步)
    查看系统时间
    ~$ date
  • 硬件时间(由计算机硬件提供,是独立于操作系统运行的一部分,即使关机也不受影响,它的作用就是在关机期间继续保持运行,以便下次开机系统可以获得正确时间)
    显示硬件时间
    ~$ sudo hwclock -r
    手动把系统时间同步到硬件时间
    ~$ sudo hwclock --systohc
    手动把硬件时间同步到系统时间
    ~$ sudo hwclock --hctosys
  • 注意
    [1] 如果不使用sudo权限,可能会报错:hwclock: Cannot access the Hardware Clock via any known method.

    [2] 使用man toolnameman dateman hwclock )查看完整手册

用tzselect工具手动修改时区

  • 直接运行tzselect,根据提示选择相应时区
    ~$ tzselect
    根据提示选择时区,程序最后会输出如下信息:

You can make this change permanent for yourself by appending the line
TZ=‘Asia/Shanghai’; export TZ
to the file ‘.profile’ in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

  • 修改 /home/ 你的用户名 /.profile 文件,使其永久生效
    根据上面的提示,修改用户主目录下的.profile文件
    ~$ sudo vim /home/你的用户名/.profile
    在文件末尾添加:
    TZ=‘Asia/Shanghai’; export TZ
    保存退出 Esc,:wq,Enter
  • 退出用户(Log Out)再登录用户(Log In)即可生效

六、参考资料

国内常用NTP服务器地址

Linux时间同步ntp服务的细节全解析Linux配置ntp时间服务器Linux中怎么搭建NTP服务器

Linux配置自动时间同步

Windows 时间服务技术参考