启用 hyperv-daemons 是否表明系统时钟已通过 timedatectl 同步?

启用 hyperv-daemons 是否表明系统时钟已通过 timedatectl 同步?

我们选择禁用 chronyd,转而使用 hyperv 守护进程来保持服务器时钟同步,以便来宾操作系统时间由运行虚拟机的计算机管理。

禁用 chronyd 并启用 hyperv-daemons 后,服务器时钟不再漂移。

但是,运行时timedatectl我们可以看到输出表明系统时钟未同步:

[user@server ~]$ timedatectl
               Local time: Tue 2021-09-07 10:54:08 BST
           Universal time: Tue 2021-09-07 09:54:08 UTC
                 RTC time: Tue 2021-09-07 09:54:08
                Time zone: Europe/London (BST, +0100)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

timedatectl 是否仅通过检查 chronyd 服务是否正在运行来设置“系统时钟同步”的值?

答案1

timedatectl从 获取同步信息systemd-timedated.service

根据 的版本systemd-timedated.service,它可能会意识到:

  • 仅有的systemd-timesyncd.service
  • 内置的同步服务列表,
  • 进程SYSTEMD_TIMEDATED_NTP_SERVICES环境中环境变量中以冒号分隔的服务列表systemd-timedated.service
  • 和/或文件中的服务列表(/usr/lib)|(/usr/local/lib)|(/etc)/systemd/ntp-units.d/*.list,每行一个。

显示NTP service基本上由“列出为 NTP 同步服务的任何服务是否正在运行?”来确定。

System clock synchronized信息来自内核:如果内核知道时间同步服务正在为其提供更新,则内核会清除time_status内核内变量中的第 7 位。您可以使用以下命令查看此变量的值adjtimex --print:如果在中设置了第 7 位(值 64)status,则系统时钟为不是正在同步。 /使用该位作为其显示timedatectl的源。systemd-timedated.serviceSystem clock synchronized: yes/no

如果您的版本systemd-timedated.service支持SYSTEMD_TIMEDATED_NTP_SERVICES环境变量(检查服务的手册页),那么您可以创建一个覆盖文件,如下所示/etc/systemd/system/systemd-timedated.service.d/override.conf

[Service]
Environment=SYSTEMD_TIMEDATED_NTP_SERVICES=<name of HyperV daemon .service here>:chronyd.service:ntp.service:systemd-timesyncd.service

显然替换为相应 HyperV 守护程序的文件<name of HyperV daemon .service here>的实际名称。.service

创建此覆盖文件并重新启动后systemd-timedated.service,该timedatectl命令现在应该显示NTP service: active环境变量中列出的任何一项服务是否正在运行(根据systemd)。

如果 HyperV 守护程序本身不更新系统时钟同步状态位,那么您显然可以自己执行adjtimex --status 0此操作以指示时钟已同步,或adjtimex --status 64指示时钟未同步。 (注意:我并不声称完全理解内核计时系统,所以如果你选择这样做,它将是风险由您自行承担。HyperV 守护程序不更新此状态位可能有充分的理由。)


当您使用 时timedatectl set-ntp truesystemd-timedated将检查其时间同步服务器列表中提到的服务,并尝试启用并启动它发现安装的第一个服务,因此SYSTEMD_TIMEDATED_NTP_SERVICES应根据您的偏好对列表中的列表进行排序。

相关内容