网络时间协议守护程序
网络时间协议是同步 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(使用 ntpq 或 ntpdc),noquery
对于防止从 ntpd 转储状态数据(也使用 ntpq 或 ntpdc)非常重要。
您还可以添加其他选项
restrict default kod limited nomodify notrap nopeer noquery
noserve
以停止提供时间。它还会阻止时间同步,因为它会阻止除 ntpq 和 ntpdc 查询之外的所有数据包。如果您想更改其中任何一个,请参阅 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
用法
该软件包具有默认的客户端模式配置,以及自己的用户和组,以便在启动后删除 root 权限。如果您从控制台启动它,您应该始终使用 -u
选项执行此操作
# ntpd -u ntp:ntp
包含的两个 systemd 服务都使用了 -u
选项。这些服务还使用了 -g
选项,该选项禁用了阈值(所谓的恐慌门)。因此,即使 ntp 服务器的时间超过了系统时钟的阈值偏差,它们也会同步时间。
这两个服务都与系统的解析器绑定,并且将在检测到活动网络连接时开始同步。
开机时启动 ntpd
启用带有 ntpd.service
的守护程序。另请参阅#在 chroot 中运行。
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
。
/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 中运行
如果目录 /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