Linux rdate:检查时间服务器并设置系统时钟

rdate 是一个从远程时间服务器获取时间以进行检查或一次性调整系统时钟的命令。然而,相同名称的每种实现选项的含义不同,因此应首先查看已安装程序的手册。对于连续时间同步,更好使用像 chrony 这样的时间同步服务。

rdate 与时间同步的区别

rdate 是一个工具,在执行时会向远程服务器发送请求。即使它设置了一次时钟,命令本身也不会持续运行以纠正偏差。如果您操作对时间敏感的服务,例如日志、计划任务或证书验证,则需要检查连续同步的状态。

下面的示例使用了 OpenRdate,如 Ubuntu 24.04 rdate 手册中所述 。相同的选项在其他实现中可能有不同的意义,因此不要直接按这些示例操作。

安装和实现检查

在 Ubuntu 上,如果您可以访问软件包仓库,可以按如下方式安装。如果提示找不到软件包,请检查您使用的发行版版本和仓库。

sudo apt update
sudo apt install rdate

安装后,打开手册以查看实际程序的选项。手册中的退出键是 q。

command -v rdate
man rdate

在 OpenRdate 中,-p 表示它在不更改时钟的情况下输出服务器时间,而 -s 表示它不输出时间。在其他 rdate 实现中,-s 可能表示它会设置时钟。因此,不要仅凭选项名称就猜测其行为。特别是在 OpenRdate 中,未使用 -p 运行可能会尝试设置时钟。

仅检查服务器时间

OpenRdate 的默认通信方法是 RFC 868 时间协议的 TCP 37 端口。你不能假设典型的 NTP(网络时间协议)服务器也提供 RFC 868。以下示例使用 OpenRdate 的 -n 选项和简单网络时间协议(SNTP)查询德国物理技术联邦研究院(PTB)的 NTP 服务器。请检查服务器使用政策和网络可访问性,如有必要,请替换为贵组织指定的 NTP 服务器。

rdate -n -p ptbtime1.ptb.de

当接收到正常响应时,会显示远程时间,本地系统时钟不会被更改。SNTP 使用 UDP 端口 123。 根据 OpenRdate 手册,使用 NTP 服务器时有时需要闰秒校正。如果准确时间很重要,请查看手册中的 -c 选项及时间源的条件。如果没有响应,请检查服务器地址、DNS、防火墙以及服务器服务是否正在运行。您必须首先验证服务器实际支持的协议,因为被命名为时间服务器并不意味着它支持所有协议。

在调整时钟之前先检查一次

如果系统时间突然向前或向后移动,可能会影响日志的顺序、计划任务、身份验证和正在运行的服务。对于正在运行的系统,应检查时间源的可靠性及更改的影响,并确保在适当的时间进行修改。同时,验证当前的操作策略,以避免重复更改已由 chrony 或其他同步服务管理的时钟。

在 OpenRdate 中,以下命令尝试将系统时钟设置为 SNTP 服务器的时间而不使用 -p。需要管理员权限,在执行之前,请使用上述查询命令检查服务器响应和当前时间。此示例适用于 OpenRdate。

date
timedatectl
sudo rdate -n ptbtime1.ptb.de
date
timedatectl

如果命令执行失败,请检查错误,不要假设它成功了。date 和 timedatectl 有助于验证本地时间和时区。屏幕上显示的时区不同,并不意味着时钟的参考时间一定不正确。时间更改不能像查询一样轻易恢复,因此,与其盲目重置为先前的值,不如按照操作规程与可靠的时间源进行同步。

验证连续同步

仅运行一次 rdate 并不会配置连续同步。在 systemd 环境中,你可以使用以下命令检查同步服务和时钟状态。

timedatectl status

显示为活动的 NTP service 和显示为已同步的 System clock synchronized 是不同状态。即使服务正在运行,如果无法连接到服务器,也可能无法同步。显示的项目可能因系统和版本而异。

在使用 chrony 的系统上,可以通过 chronyc tracking 和 chronyc sources -v 检查状态和时间源。如果无法使用这些命令,请检查安装情况、服务状态及发行版的设置。 在 Red Hat 的 chrony 时间同步文档中 ,可以看到如何验证源和同步状态。