网络时间协议守护程序

来自 ArchWiki
(重定向自 Ntpd

网络时间协议是同步 GNU/Linux 系统的软件时钟与互联网时间服务器的最常用方法。它旨在减轻可变网络延迟的影响,并且通常可以将时间保持在公共互联网上数十毫秒以内。在局域网上的精度甚至更高,可达一毫秒。

NTP 项目提供了一个协议的参考实现,简称为 NTP。本文进一步描述了如何设置和运行 NTP 守护程序,作为客户端和服务器。

有关其他 NTP 实现,请参阅系统时间#时间同步

安装

安装 ntp 软件包。默认情况下,ntpd 在客户端模式下工作,无需进一步配置。如果您想使用 Arch Linux 的默认配置文件,可以跳到#用法。有关服务器配置,请参阅#NTP 服务器模式

配置

主守护程序是 ntpd,它在 /etc/ntp.conf 中配置。有关详细信息,请参阅 ntp.conf(5)

连接到 NTP 服务器

NTP 服务器在一个分层系统中分类,该系统具有多个级别,称为层级:被认为是独立时间源的设备被分类为层级 0 源;直接连接到层级 0 设备的服务器被分类为层级 1 源;连接到层级 1 源的服务器然后被分类为层级 2 源,依此类推。

必须理解的是,服务器的层级不能被视为其准确性或可靠性的指标。通常,层级 2 服务器用于一般同步目的:如果您还不知道要连接的服务器,则应从 pool.ntp.org 服务器(备用链接)中选择靠近您所在位置的服务器池。

ntp 版本 4.2.7.p465-2 起,Arch Linux 使用由 NTP 池项目提供的自己的默认供应商 NTP 服务器池(参见 FS#41700)。修改这些以满足您的需求,例如,如果您想使用您所在国家/地区的服务器,可以使用以下选项

/etc/ntp.conf
server 0.fr.pool.ntp.org iburst
server 1.fr.pool.ntp.org iburst
server 2.fr.pool.ntp.org iburst
server 3.fr.pool.ntp.org iburst

推荐使用 iburst 选项,并且仅在无法首次尝试建立连接时才发送数据包突发。burst 选项始终执行此操作,即使在首次尝试时也是如此,未经明确许可绝不应使用,并可能导致列入黑名单。

闰秒文件

为了使系统能够向请求它的应用程序提供国际原子时,必须加载闰秒列表。该列表是 tzdata 软件包的一部分,可以通过将以下行添加到 NTP 配置文件中来加载

leapfile /usr/share/zoneinfo/leap-seconds.list

NTP 服务器模式

如果设置 NTP 服务器,请检查您是否启用了孤立模式,以便在失去互联网访问的情况下,它将继续为网络提供时间;使用 tos 配置参数启用孤立模式(您可以设置高达 层级 15),以便除非互联网访问丢失,否则永远不会使用它

tos orphan 15

接下来,使用 restrict 命令定义允许客户端连接到您的服务的规则(localhost 也被视为客户端);您的文件中应该已经有这样一行

restrict default nomodify nopeer noquery

这限制了所有人修改任何内容,并阻止所有人查询您的时间服务器的状态:nomodify 阻止重新配置 ntpd(使用 ntpqntpdc),noquery 对于防止ntpd 转储状态数据(也使用 ntpqntpdc)非常重要。

您还可以添加其他选项

restrict default kod limited nomodify notrap nopeer noquery
注意: 这仍然允许其他人查询您的时间服务器。您需要添加 noserve 以停止提供时间。它还会阻止时间同步,因为它会阻止除 ntpqntpdc 查询之外的所有数据包。

如果您想更改其中任何一个,请参阅 ntp.conf(5) 中的 "restrict" 选项的完整文档、详细的 ntp 说明#用法

在这行之后,您需要告诉 ntpd 允许什么进入您的服务器;如果您没有配置 NTP 服务器,则以下行就足够了

restrict 127.0.0.1

如果您想强制 DNS 解析到 IPv6 命名空间,请在 IP 地址或主机名前写入 -6-4 强制使用 IPv4),例如

restrict -6 default kod limited nomodify notrap nopeer noquery
restrict -6 ::1    # ::1 is the IPv6 equivalent for 127.0.0.1

最后,指定漂移文件(用于跟踪您的时钟时间偏差)以及可选的日志文件位置

driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp.log

一个非常基本的配置文件将如下所示

/etc/ntp.conf
server 0.arch.pool.ntp.org iburst
server 1.arch.pool.ntp.org iburst
server 2.arch.pool.ntp.org iburst
server 3.arch.pool.ntp.org iburst
tos orphan 15

restrict default kod limited nomodify notrap nopeer noquery
restrict -6 default kod limited nomodify notrap nopeer noquery

restrict 127.0.0.1
restrict -6 ::1  

driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp.log
注意: 定义日志文件不是强制性的,但始终最好为 ntpd 操作提供反馈。

用法

该软件包具有默认的客户端模式配置,以及自己的用户和组,以便在启动后删除 root 权限。如果您从控制台启动它,您应该始终使用 -u 选项执行此操作

# ntpd -u ntp:ntp

包含的两个 systemd 服务都使用了 -u 选项。这些服务还使用了 -g 选项,该选项禁用了阈值(所谓的恐慌门)。因此,即使 ntp 服务器的时间超过了系统时钟的阈值偏差,它们也会同步时间。

警告: 引入恐慌门的原因之一是后台作业/服务可能容易受到时间跳跃的影响。如果系统时钟以前从未同步过,请考虑在首次运行 ntpd 之前停止它们。

这两个服务都与系统的解析器绑定,并且将在检测到活动网络连接时开始同步。

开机时启动 ntpd

启用带有 ntpd.service 的守护程序。另请参阅#在 chroot 中运行

注意: systemd 命令 timedatectl 只能用于控制 systemd-timesyncd。以 root 身份执行 timedatectl set-ntp 1 将会无意中停止正在运行的 ntpd.service[1]

使用 ntpq 查看配置的对等方列表和同步状态

$ ntpq -p

延迟、偏移和抖动列应为非零值。ntpd 正在同步的服务器以星号为前缀。ntpd 可能需要几分钟才能选择要同步的服务器;尝试在 17 分钟(1024 秒)后检查。

每次启动同步时间

或者,启用 ntpdate.service 以每次启动同步时间一次(选项 -q)和非分叉(选项 -n),而不是在后台运行守护程序。不建议在服务器上使用此方法,通常也不建议在运行时间超过几天的机器上使用。

如果同步时间也应写入硬件时钟,请在启动它之前,按照 systemd#编辑提供的单元文件 中的描述配置提供的单元文件

/etc/systemd/system/ntpdate.service.d/hwclock.conf
[Service]
ExecStart=/usr/bin/hwclock -w

技巧与窍门

在网络连接时启动 ntpd

ntpd 可以由您的网络管理器启动,以便守护程序仅在计算机在线时运行。

Netctl

将以下行附加到您的 netctl 配置文件

ExecUpPost="systemctl start ntpd.service"
ExecDownPre="systemctl stop ntpd.service"

NetworkManager

ntpd 守护程序可以通过使用 NetworkManager 的调度器脚本与网络连接一起启动/停止。networkmanager-dispatcher-ntpdAUR 软件包安装了一个预配置的脚本,用于通过连接启动和停止 ntpd 服务

KDE

KDE 可以使用 NTP(必须安装 ntp),方法是右键单击时钟并选择调整日期/时间。但是,这需要先禁用 ntp 守护程序,然后才能配置 KDE 使用 NTP。[2]

将 ntpd 与 GPS 结合使用

大多数关于配置 ntpd 以从 GPS 接收时间的在线文章都建议使用 SHM(共享内存)方法。但是,至少从 ntpd 版本 4.2.8 开始,可以使用更好的方法。它直接连接到 gpsd,因此需要安装 gpsd

将以下行添加到您的 /etc/ntp.conf

/etc/ntp.conf
#=========================================================
#  GPSD native ntpd driver
#=========================================================
# This driver exists from at least ntp version 4.2.8
# Details at
#   https://www.eecis.udel.edu/~mills/ntp/html/drivers/driver46.html
server 127.127.46.0 
fudge 127.127.46.0 time1 0.0 time2 0.0 refid GPS

只要您的 gpsd 正常工作,这将起作用。它通过本地套接字连接到 gpsd 并查询返回的 "gpsd_json" 对象。

要测试设置,首先通过运行确保 gpsd 正常工作

$ cgps -s 

然后等待几分钟并运行 ntpq -p。这将显示 ntpd 是否正在与 gpsd 通信

$ ntpq -p
remote           refid            st t when poll reach   delay   offset  jitter
 ==================================================================================
*GPSD_JSON(0)    .GPS.            0 l   55   64  377    0.000    2.556  14.109
提示
  • 如果 reach 列为 0,则表示 ntpd 无法与 gpsd 通信。等待几分钟然后重试。有时 ntpd 需要一段时间。
  • GPS 设备必须具有 PPS 功能。您可以测试您的设备是否能够运行 ppscheck /dev/gps0
注意: ntpd 期望您的 GPS 设备被称为例如 /dev/gps0。如果您的 GPS 设备通过 USB 连接,它可能会显示为 /dev/ttyUSB0,您可能必须创建一个符号链接 ln -s /dev/ttyUSB0 /dev/gps0 并在链接的 /dev/gps0 上运行 gpsd,以便 GPSD_JSON 行按预期显示。gpsd 应该使用 -n 标志在 GPSD_OPTIONS 行上运行,并在 /etc/default/gpsd 配置文件中的 DEVICES 行上使用 /dev/gps0

在 chroot 中运行

注意: 在尝试将其限制在 chroot 中之前,ntpd 应以非 root 身份启动(Arch Linux 软件包中的默认设置),因为 chroot 在保护以 root 身份运行的进程方面相对无用。

如果目录 /etc/systemd/system/ntpd.service.d/ 不存在,则创建一个新目录,并在其中创建一个名为 customexec.conf 的文件,内容如下

[Service]
ExecStart=
ExecStart=/usr/bin/ntpd -g -u ntp:ntp -i /var/lib/ntp

然后,编辑 /etc/ntp.conf 以更改漂移文件路径,使其相对于 chroot 目录,而不是相对于真实系统根目录。更改

driftfile       /var/lib/ntp/ntp.drift

driftfile       /ntp.drift

创建一个合适的 chroot 环境,以便 getaddrinfo() 可以通过创建相关的目录和文件(以 root 身份)来工作

# mkdir /var/lib/ntp/etc /var/lib/ntp/lib /var/lib/ntp/proc
# mkdir /var/lib/ntp/usr /var/lib/ntp/usr/lib
# touch /var/lib/ntp/etc/resolv.conf /var/lib/ntp/etc/services

并通过绑定挂载上述文件

/etc/fstab
...
#ntpd chroot mounts
/etc/resolv.conf  /var/lib/ntp/etc/resolv.conf none bind 0 0
/etc/services	  /var/lib/ntp/etc/services none bind 0 0
/lib		  /var/lib/ntp/lib none bind 0 0
/usr/lib	  /var/lib/ntp/usr/lib none bind 0 0
/proc		  /var/lib/ntp/proc none bind 0 0
# mount -a

最后,再次重启 ntpd 守护程序。重启后,您可以通过检查 /proc/{PID}/root 符号链接到哪里来验证守护程序进程是否已 chroot

# ps -C ntpd | awk '{print $1}' | sed 1d | while read -r PID; do ls -l /proc/$PID/root; done

现在应该链接到 /var/lib/ntp 而不是 /

很难确定您的漂移文件配置是否真的在工作,除非等待一段时间,因为 ntpd 不会经常读取或写入它。如果您弄错了,它将记录错误;如果您做对了,它将更新时间戳。如果您在运行一整天后没有看到任何关于它的错误,并且时间戳已更新,您应该对成功充满信心。

限制监听套接字

您可以使用 interface 选项限制 ntpd 正在监听的套接字

interface [listen | ignore | drop] [all | ipv4 | ipv6 | wildcard | name | address[/prefixlen]]

例如

/etc/ntp.conf
interface listen lo
interface listen enp3s0
interface ignore enp5s0

参见