Studio环境中NTP

在操作系统中,有一个非常不起眼但是非常重要的服务,就是时间同步服务,因为操作系统的时钟准确性影响了很多应用程序,甚至会导致系统出现莫名其妙的异常。在我们的Studio环境中,需要模拟数据中心构建集群,确保笔记本电脑的时钟精确是非常关键的。例如,时钟偏移会导致操作系统无法通过apt更新软件。

注解

传统的Unix/Linux系统中,负责主机时钟同步的软件是 ntpd ,这是一个历史悠久的NTP协议软件,并且在稳定性和协议兼容性上优于其他NTP软件(如 chrony )。不过,很多服务器并不是连接时钟设备作为一级NTP服务器,所以通常采用 chrony 或者 systemd内建的 timesyncd 来实现。

从Ubuntu 16.04开始 timedatectltimesyncd (属于 systemd 的部分)代替了以往常用的 ntpdatentp 工具。 timesyncd 不仅默认提供,并且取代了 ntpdate 以及 chrony (用于取代 ntpd 的服务)的客户端。以前通过启动时使用 ntpdate 命令来矫正时间,现在只需要默认启动的 timesyncd 来完成并保持本地时间同步。

注解

如果安装了 chrony ,则 timedatectl 将让 chrony 来实现时间同步。这样可以确保不会同时运行两个时间同步服务。

ntpdate 今后将在未来的 timedatectl (或者 chrony )中去除,并且默认不再安装。 timesyncd 则用于常规的本地主机时钟同步,而 chrony 则作为局域网中对外提供NTP服务。

配置timedatectl和timesyncd

  • 使用 timedatectl status 可以检查时钟情况:

    $ timedatectl status
          Local time: Tue 2018-05-01 21:54:24 CST
      Universal time: Tue 2018-05-01 13:54:24 UTC
            RTC time: Tue 2018-05-01 13:54:24
           Time zone: Asia/Shanghai (CST, +0800)
     Network time on: yes
    NTP synchronized: yes
     RTC in local TZ: no
    
  • 使用 systemctl status systemd-timesyncd 可以检查时钟同步情况

  • /etc/systemd/timesyncd.conf 设置了 timedatectltimesyncd 获取时钟值的名字服务器,并且详细的配置文件可以在 /etc/systemd/timesyncd.conf.d/ 目录下找到。

  • 配置 timesyncd 使用局域网中NTP服务器进行时钟同步 (下文将介绍在局域网中配置 chronyd 时钟服务方法):

    [Time]
    NTP=192.168.0.1
    

然后重启 systemd-timesyncd 服务:

sudo systemctl restart systemd-timesyncd

再次检查 systemctl status systemd-timesyncd 就可以看到主机和指定的NTP服务器同步时间。

设置网络时钟协议的服务(NTP服务器)

在Ubuntu平台,有多个软件可以实现网络时间服务,如 chronyntpdopen-ntp 。建议使用 chrony

chrnoy(d)

NTP服务 chronyd 计算系统时钟的drift和offset并持续修正。如果长时间不能连接网络NTP服务器,也可以保证时钟不偏移。该服务只消耗很少的处理能力和内存,在现代服务器硬件环境这个消耗往往可以忽略。

  • 安装:

    sudo apt install chrony
    

chrony 软件包包含2个执行程序:

  • chronyd - 通过NTP协议提供时间同步的服务
  • chronyc - 命令行和 chrony 服务交互的接口
  • chronyd配置

编辑 /etc/chrony/chrony.conf 添加服务配置行:

pool 2.debian.pool.ntp.org offline iburst
allow 192.168.1.0/24

注解

一定要配置一行 allow 192.168.`.0/24 ,否则 chronyd 服务启动后不会监听任何端口

  • 启动服务:

    sudo systemctl restart chrony.service
    
  • 检查状态:

    chronyc sources
    

配置ufw

对于启动了 ufw 防火墙配置的Ubuntu服务器,需要添加端口允许:

sudo ufw allow ntp

sudo ufw disable
sudo ufw enable

设置时区

默认安装 Ubuntu Server ,时区设置是 UTC ,对于本地时间查看非常不习惯。

  • 检查默认时区:

    ls -lh /etc/localtime
    

输出显示:

lrwxrwxrwx 1 root root 27 Jun  9 08:41 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
  • 修改成本地时间(Shanghai):

    sudo unlink /etc/localtime
    sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    

然后再使用 date 命令就可以看到正确的本地时间。