这里提供两种方法解决问题:

方法一:

  1. 通过命令 systemctl enable ntpd 设置NTP服务开机自启动。

  2. 重启虚拟机后查看 服务运行状态 systemctl status ntpd ,发现服务并没有成功启动。

  3. 查看chrony是否被设置为开机自启动。通过指令 systemctl is-enabled chronyd 查看,发现这个服务已经被设置为开机自启动所以导致NTP服务的自启动失败。

  4. 所以要把 chrony 的自启动去掉。执行指令 systemctl disable chrony 。

  5. 重启虚拟机, 执行 systemctl status ntpd ,问题解决。

方法二:

需要开机自启动某服务,第一个想到的当然是开机启动自定义脚本。

在Centos之前版本只要在 /etc/rc.d/rc.local 文件中加入 启动服务的命令,当虚拟机重启时就会执行该文件中的命令,服务也就启动了。但是但Centos7版本,这个文件的权限被降低了,所以当你打开这个文件时,注释中很友好的提示让你给这个文件赋权,以确保它有可执行权限。chmod +x /etc/rc.d/rc.local 。

所以只要把指令写到这个文件中,就可以在开机时启动服务或者让虚拟机做其它事情。

使用 Chrony 作为 NTP 服务器

要将 Chrony 作为一个 NTP 服务器,方法很简单。

首先,你需要修改 /etc/chrony.conf 文件,并添加以下配置即可。

# 对于安全要求比较高的,这里可以限制谁能访问本机提供的 NTP 服务。
allow 192.168.1.0/24
# 设置 chronyd 监听在哪个网络接口
bindcmdaddress 0.0.0.0
# 这个地方很重要,如果服务器本身也不能同步时间,那么就用本地时间替代,层级为 10
local stratum 10

其次,重启 Chronyd 服务,以加载新的配置。

systemctl restart chronyd

Chronyd 服务启动成功后,会监听以下两个端口。

  • 端口 123/udp 为标准的 NTP 监听端口,如果要对外提供 NTP Server 功能,必须开启防火墙和监听地址为外部可访问地址。如需修改,你可以通过配置 port 参数来修改。

  • 端口 323/udp 为默认的管理端口。如需修改,你可以通过配置 cmdport 参数来修改。

最后,修改防火墙设置,以放行对 123/udp 的请求,这里以 CentOS 7 的 Firewalld 为例。

$ firewall-cmd --zone=public --add-port=123/udp --permanent$ firewall-cmd --reload

延伸阅读

一些时间相关的概念介绍

  1. GMT、UTC、CST、DST 时间
    UTC 整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时 (UTC, Universal Time Coordinated)。
    GMT 格林威治标准时间 (Greenwich Mean Time) 指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。( UTC 与 GMT 时间基本相同)
    CST 中国标准时间 (China Standard Time)
    GMT + 8 = UTC + 8 = CST
    DST 夏令时 (Daylight Saving Time) 指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用。(中国不使用)

  2. 硬件时间和系统时间
    硬件时间:RTC (Real-Time Clock) 或 CMOS 时间,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。
    系统时间:一般在服务器启动时复制 RTC 时间,之后独立运行,保存了时间、时区和夏令时设置。

一些设置时区和时间的命令

  1. 查看当前系统时区
    # 直接使用 timedatectl 命令也等同于以下命令
    $ timedatectl status
    Local time: Fri 2018-2-29 13:31:04 CST
    Universal time: Fri 2018-2-29 05:31:04 UTC
    RTC time: Fri 2018-2-29 08:17:20
    Time zone: Asia/Shanghai (CST, +0800)
    NTP enabled: yes
    NTP synchronized: yes RTC in local 
    TZ: no
    DST active: n/a
  2. 设置当前系统时区
    # 查看所有可用的时区
    $ timedatectl list-timezones
    # 查看上海可用时区
    $ timedatectl list-timezones |  grep  -E "Asia/S.*"Asia/SakhalinAsia/SamarkandAsia/SeoulAsia/ShanghaiAsia/SingaporeAsia/Srednekolymsk
    # 设置当前系统为 Asia/Shanghai 上海时区
    $ timedatectl set-timezone Asia/Shanghai
    # 设置完时区后,在强制同步下系统时钟
    $ chronyc -a makestep200 OK
  3. 显示系统的当前时间和日期
    $ timedatectl set-time "YYYY-MM-DD HH:MM:SS"
    $ timedatectl set-time "YYYY-MM-DD"
    $ timedatectl set-time "HH:MM:SS"
  4. 修改当前日期时间
    # 可以只修改其中一个
    $ timedatectl set-time "2019-10-31 15:50:00"
  5. 设置硬件时间
    # 硬件时间默认为 UTC,下面两条命令效果等同
    $ timedatectl set-local-rtc 1$ hwclock --systohc --localtime
  6. 启用或者禁止 NTP 时间同步
    # yes 或 no,1 或 0 也可以
    $ timedatectl set-ntp yes/no
    $ timedatectl set-ntp true/flase