OpenNTPD

出自 ArchWiki

OpenNTPD (是 OpenBSD 项目的一部分) 是一个守护进程,可用于使用网络时间协议将系统时钟与互联网时间服务器同步,并且如果需要,它也可以充当时间服务器。它实现了简单网络时间协议版本 4,如 RFC:5905 中所述,以及网络时间协议版本 3,如 RFC:1305 中所述。

安装

安装 openntpd 软件包。如果您只想同步本地计算机的时间,则默认配置实际上是可用的。

配置

要配置 OpenNTPD,您需要编辑 /etc/ntpd.conf。 有关所有可用选项,请参阅 ntpd.conf(5)

提示: 配置后,通过执行以下命令检查配置文件的有效性
$ ntpd -n

客户端

此文章或章节需要扩充。

原因: 文档 HTTPS 约束。(在 Talk:OpenNTPD 中讨论)

要同步到单个特定服务器,请编辑 server 指令。

/etc/ntpd.conf
server time.cloudflare.com

servers 指令的工作方式与 server 指令相同。但是,如果 DNS 名称解析为多个 IP 地址,则所有这些地址都将同步到。默认值 2.arch.pool.ntp.org 是可用的,在大多数情况下应该是可以接受的。您可以在 www.pool.ntp.org/zone/@ 找到您所在区域的服务器 URL。

/etc/ntpd.conf
servers 2.arch.pool.ntp.org

可以使用任意数量的 serverservers 指令。

服务器

如果您希望运行 OpenNTPD 的计算机也充当时间服务器,只需取消注释并编辑 “listen” 指令。

例如

/etc/ntpd.conf
listen on *

将监听所有接口,而

/etc/ntpd.conf
listen on 127.0.0.1
listen on ::1

将仅监听环回接口。

您的时间服务器只有在将自身同步到高分辨率后才会开始提供时间。这可能需要数小时或数天,具体取决于您系统的准确性。

用法

在启动时启动 OpenNTPD

启用 openntpd.service

使 openntpd 依赖于网络访问

如果您有间歇性网络访问(您在笔记本电脑上漫游,您使用拨号上网等),则在启动时将 openntpd 作为系统守护进程运行是没有意义的。以下是一些您可以根据网络连接的存在来控制 openntpd 的方法。

使用 NetworkManager dispatcher

可以通过使用 NetworkManager 的 dispatcher 脚本来启动/停止 OpenNTPD 以及网络连接。

安装 networkmanager-dispatcher-openntpdAUR

使用 dhclient 钩子

此文章或章节需要扩充。

原因: 需要钩子示例 (在 Talk:OpenNTPD 中讨论)

另一种可能性是使用 dhclient 钩子来启动和停止 openntpd。当 dhclient 检测到状态更改时,它将运行以下脚本

  • /etc/dhclient-enter-hooks
  • /etc/dhclient-exit-hooks

请参阅 dhclient-script(8)

使用 dhcpcd 钩子

/etc/dhcpcd.exit-hook
if $if_up; then
	systemctl start openntpd.service
elif $if_down; then
	systemctl stop openntpd.service
fi

请参阅 dhcpcd-run-hooks(8)

故障排除

调整时间时出错

如果您发现您的时间设置不正确,并且在日志中看到

openntpd adjtime failed: Invalid argument

尝试

# ntpd -d

这也是您手动同步系统的方式。

constraint: failed to load constraint ca

如果在 /etc/ntpd.conf 中配置了 HTTPS 约束,则在具有 AppArmor 的系统上,OpenNTPD 将无法启动。 日志将显示 constraint: failed to load constraint ca

这是因为 AppArmor 的 usr.sbin.ntpd 配置文件没有对 LibreSSL 的 CA 证书文件 /etc/libressl/cert.pem 的读取权限。[1]

解决方案是使用本地覆盖授予访问权限

/etc/apparmor.d/local/usr.sbin.ntpd
...
/etc/libressl/{,cert.pem} r,

编辑后,重新加载 AppArmor 配置文件

# apparmor_parser -r /etc/apparmor.d/usr.sbin.ntpd

参见