CentOS配置:时间同步【ntp】

12/31/2024 Linux

目录


参考:


# CentOS配置:时间同步【ntp】

# 环境依赖

软件/系统 版本 架构 包名 备注
Linux CentOS7.X x86_64

# 常用命令

# 查看系统时间
date
# 查看硬件时间
hwclock
# 将系统时间同步到硬件
hwclock -w
date
1
2
3
4
5
6
7
  • NTP
# 查看NTP服务状态
ntpstat
# 查看当前节点同步的时间服务器
ntpq -p
# 与NTP服务器同步
ntpdate -d [NTP服务器IP]
# 查看节点与时间服务器的偏差时间
ntpdc -c loopinfo
1
2
3
4
5
6
7
8

# NTP时间同步

# 什么是NTP服务

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。

# NTP的时钟层级

NTP允许客户端从服务器请求和接收时间,而服务器又从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC。

NTP以层级来组织模型结构,层级中的每层被称为Stratum。通常将从权威时钟获得时钟同步的NTP服务器的层数设置为Stratum 1,并将其作为主时间服务器,为网络中其他的设备提供时钟同步。而Stratum 2则从Stratum 1获取时间,Stratum 3从Stratum 2获取时间,以此类推。时钟层数的取值范围为1~16,取值越小,时钟准确度越高。层数为1~15的时钟处于同步状态;层数为16的时钟被认为是未同步的,不能使用的。

wKgaomU7VP2AYVPoAABr1XbvjU8150

# NTP的同步原理

NTP最典型的授时方式是Client/Server方式,如下图所示。

wKgaomU7VP2AUBDjAAAqtm9uRHw936

  • 客户端首先向服务端发送一个NTP请求报文,其中包含了该报文离开客户端的时间戳t1;

  • NTP请求报文到达NTP服务器,此时NTP服务器的时刻为t2;

  • 当服务端接收到该报文时,NTP服务器处理之后,于t3时刻发出NTP应答报文。该应答报文中携带报文离开NTP客户端时的时间戳t1、到达NTP服务器时的时间戳t2、离开ntp服务器时的时间戳t3;

  • 客户端在接收到响应报文时,记录报文返回的时间戳t4。

客户端用上述4个时间戳参数就能够计算出2个关键参数:

  • NTP报文从客户端到服务器的往返延迟delay。

图片

  • 客户端与服务端之间的时间差offset。根据方程组:

图片

​ 可以解得时间差为:

图片

客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。

如果从简单实现时钟同步角度来说,NTP是最简单的,因为NTP一个request/response就能够完成同步了,NTP使用UDP协议,端口为123。NTP主要分数据报文和控制报文两大类,request/response报文都是数据报文,报文如下图:

图片

# 集群NTP时间同步

时间同步的方式:以某一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔10分钟同步1次时间。

0794bb9b4c63b607c930060d597db853

# 时间服务器配置

注意:必须root用户

# 检查NTP安装
# 检查是否安装
rpm -qa|grep ntp
# 或
yum list installed | grep ntp
1
2
3
4

image-20240924162550990

# 安装NTP服务
# 安装
yum install -y ntp
1
2
# 修改NTP配置
  • 修改/etc/ntp.conf

    # 备份
    ll -a /etc/ntp.conf
    cp /etc/ntp.conf /etc/ntp.conf.bak20240924
    ll -a /etc/ntp.conf*
    # 修改
    vi /etc/ntp.conf
    
    1
    2
    3
    4
    5
    6

    修改内容如下:

    • 修改授权网段(192.168.1.0-192.168.1.255)上的所有机器可以从这台机器上查询和同步时间:

      restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
      
      1
    • 修改同步时间服务器,并指定为时间服务主机:若仅在局域网中,可以不使用其他互联网上的时间,若支持互联网访问,可使用互联网时间服务器。

      # 注释默认的时间服务器
      #server 0.centos.pool.ntp.org iburst
      #server 1.centos.pool.ntp.org iburst
      #server 2.centos.pool.ntp.org iburst
      #server 3.centos.pool.ntp.org iburst
      # 配置外部时间服务器
      server ntp.ntsc.ac.cn prefer ##中国国家授时中心,首选
      server ntp.aliyun.com     ##阿里云授时,当上面服务器同步不了,则寻找第2个
      # 外部时间服务器不可用时,以本地时间作为时间服务
      server 127.127.1.0           ## local clock ,127.127.1.0回环地址IP
      # 设置时间服务器的层级 stratum 0~15 ,0:表示顶级,10:通常用于给局域网主机提供时间服务
      fudge 127.127.1.0 stratum 10 ## 填入回环地址,此处设为第10层,通常局域网设为10。其他客户端同步后,就变成了11层
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12

      参数:

      • preferiburst都是作为server指令的参数。

      • prefer关注于设置NTP服务器的优先级,在有多个NTP服务器且需要指定首选服务器时,prefer则更为合适。

      • iburst则关注于优化同步速度和过程,在需要快速同步或网络条件较差的情况下,iburst更为适用。

      • 测试时间服务器是否能够访问:

        ping ntp.ntsc.ac.cn -c 5
        ping ntp.aliyun.com -c 5
        
        1
        2
  • 修改/etc/sysconfig/ntpd

    # 备份
    ll -a /etc/sysconfig/ntpd
    cp /etc/sysconfig/ntpd /etc/sysconfig/ntpd.bak20240924
    ll -a /etc/sysconfig/ntpd*
    # 编辑
    vi /etc/sysconfig/ntpd
    
    1
    2
    3
    4
    5
    6

    增加内容如下:

    # 让硬件时间与系统时间同步
    SYNC_HWCLOCK=yes
    
    1
    2
# 启动NTP服务
# 启动ntp服务
systemctl start ntpd
# 或 service ntpd start
# 设置ntp服务开机自启动
systemctl enable ntpd
# 或 chkconfig ntpd on
# 查看ntp服务状态
systemctl status ntpd
# 重启ntp服务
systemctl restart ntpd
# 停止ntp服务
systemctl stop ntpd
1
2
3
4
5
6
7
8
9
10
11
12

# 其他机器配置

注意:必须root用户、必须安装ntp

实现客户端的时间同步的两种方法:1)基于ntpd;2)基于ntpdate。

# 基于ntpd

方案:ntpdate+ntpd 优点:可以实现顺滑同步,避免时间不连续带来的问题 缺点:时间同步往往不能立刻完成

  • 修改/etc/ntp.conf

    # 备份
    ll -a /etc/ntp.conf
    cp /etc/ntp.conf /etc/ntp.conf.bak20240924
    ll -a /etc/ntp.conf*
    # 修改
    vi /etc/ntp.conf
    
    1
    2
    3
    4
    5
    6
    # 配置时间服务器,将默认的全部注释掉
    #server 0.centos.pool.ntp.org iburst
    #server 1.centos.pool.ntp.org iburst
    #server 2.centos.pool.ntp.org iburst
    #server 3.centos.pool.ntp.org iburst
    # 局域网内的NTP服务器IP
    server 192.168.102.229 prefer ##首选
    # 外部时间服务器不可用时,以本地时间作为时间服务
    server 127.127.1.0           ## local clock ,127.127.1.0回环地址IP
    # 设置时间服务器的层级 stratum 0~15 ,0:表示顶级
    fudge 127.127.1.0 stratum 11 ## 填入回环地址,此处设为第11层
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 修改/etc/sysconfig/ntpd

    # 备份
    ll -a /etc/sysconfig/ntpd
    cp /etc/sysconfig/ntpd /etc/sysconfig/ntpd.bak20240924
    ll -a /etc/sysconfig/ntpd*
    # 编辑
    vi /etc/sysconfig/ntpd
    
    1
    2
    3
    4
    5
    6

    添加内容如下:

    # 让硬件时间与系统时间同步
    SYNC_HWCLOCK=yes
    
    1
    2
  • 重启httpd

    # 重启ntp服务
    systemctl restart ntpd
    # 查看ntp服务状态
    systemctl status ntpd
    
    1
    2
    3
    4
  • 查看并同步硬件时间

    # 查看系统时间
    date
    # 查看硬件时间
    hwclock
    # 将系统时间同步到硬件
    hwclock -w
    date
    
    1
    2
    3
    4
    5
    6
    7
# 一键配置脚本
# 编辑
sudo vi ntp_client_install.sh
1
2
#!/bin/bash
# 客户端NTP服务配置脚本(需root权限)
# 用法:./ntp_client_install.sh <服务端IP>
# 示例:./ntp_client_install.sh 192.168.102.229

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 恢复默认颜色

# 入参
NTP_SERVER_IP=$1

# 0.参数校验
if [ $# -lt 1 ]; then
  echo -e "${RED}错误:必须提供服务端IP参数!${NC}"
  echo -e "正确用法:$0 <服务端IP>"
  echo -e "示例:$0 192.168.102.229"
  exit 1
fi
# IP正则表达式
regex='^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
if [[ ! $NTP_SERVER_IP =~ $regex ]]; then
  echo -e "${RED}错误:服务端IP格式不正确!${NC}"
  echo -e "示例:192.168.102.229"
  exit 1
fi

# 1. 安装ntp服务(如未安装)
echo -e "安装ntp服务:"
yum install -y ntp

# 2. 备份原始配置文件
echo -e "\n备份原始配置文件:"
cp /etc/ntp.conf /etc/ntp.conf.bak$(date +%Y%m%d)
cp /etc/sysconfig/ntpd /etc/sysconfig/ntpd.bak$(date +%Y%m%d)
ls -a |grep /etc/ntp.conf*
ls -a |grep /etc/sysconfig/ntpd*

# 3. 修改/etc/ntp.conf
echo -e "\n修改/etc/ntp.conf:"
#    注释原 server 0~3 的配置
sed -i '/^server 0.centos.pool.ntp.org iburst/,/^server 3.centos.pool.ntp.org iburst/s/^/#/' /etc/ntp.conf
#    在注释后的 server 3 行下方插入新配置
sed -i "/^#server 3.centos.pool.ntp.org iburst/a server $NTP_SERVER_IP prefer # 时间服务器IP" /etc/ntp.conf
sed -i "/^server $NTP_SERVER_IP prefer # 时间服务器IP/a server 127.127.1.0 # 本地时钟" /etc/ntp.conf
sed -i '/^server 127.127.1.0 # 本地时钟/a fudge 127.127.1.0 stratum 11 # 本地时钟设为第11层' /etc/ntp.conf
cat /etc/ntp.conf

# 4. 配置硬件时间同步
echo -e "\n修改/etc/sysconfig/ntpd:"
echo -e "\n#硬件时间同步\nSYNC_HWCLOCK=yes" >> /etc/sysconfig/ntpd
tail -n 3 /etc/sysconfig/ntpd

# 5. 启动并设置服务
echo -e "\n启动并设置服务:"
systemctl restart ntpd
systemctl enable ntpd

# 6. 验证同步状态(需等待几分钟)
echo -e "\nNTP服务状态:"
systemctl status ntpd
echo -e "\n开始手动同步(共3次):"
for i in {1..3}; do
    echo "===== 第 $i 次同步 ====="
    ntpdate -u $NTP_SERVER_IP
    echo "======================"
    sleep 1  # 可选:每次间隔1秒
done
echo -e "\n当前同步节点:"
ntpq -p
echo -e "\n时间差检测:"
ntpstat

# 7. 同步硬件时间
echo -e "\n同步硬件时间:"
hwclock -w
hwclock --show
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 赋权
sudo chmod +x ntp_client_install.sh
# 执行
sudo bash ntp_client_install.sh <管理端IP>
1
2
3
4

# 基于ntpdate

方案:定时任务(crontab)+ntpdate 优点:实现简单 缺点:会导致客户端时间不连续,对于数据库业务影响是比较大,生产环境尽量不要用

  • 配置同步任务

    在其他机器配置10分钟与时间服务器同步1次

    # 编辑
    crontab -e
    
    1
    2

    添加定时任务内容如下:

    */10 * * * * /usr/sbin/ntpdate 192.168.102.229
    
    1

    参数:192.168.102.229为时间服务器IP

  • 测试时间同步

    修改任意其他机器时间

    # 修改时间
    date -s "2011-11-11 11:11:11"
    
    1
    2

    10分钟后,查看机器是否与时间服务器相同

    # 查看系统时间
    date
    # 查看硬件时间
    hwclock
    # 将系统时间同步到硬件
    hwclock -w
    date
    
    1
    2
    3
    4
    5
    6
    7
上次更新时间: 4/3/2025, 3:11:23 AM