我们选择禁用 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.service
System 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 true
,systemd-timedated
将检查其时间同步服务器列表中提到的服务,并尝试启用并启动它发现安装的第一个服务,因此SYSTEMD_TIMEDATED_NTP_SERVICES
应根据您的偏好对列表中的列表进行排序。