我们选择禁用time,而倾向于使用hyperv-守护进程来保持服务器时钟的同步,以便客户操作系统时间由运行VM的机器管理。
在禁用the并启用hyperv-守护进程之后,服务器时钟不处于驱动状态。
但是,在运行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: notimedatectl是否仅通过检查the服务是否正在运行来设置“系统时钟同步”的值?
发布于 2021-09-10 10:56:14
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查看这个变量的值:如果在它显示的status值中设置了第7位(值64),那么系统时钟将不同步。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显然,用适当的<name of HyperV daemon .service here>守护进程的.service文件的实际名称替换HyperV。
在创建这个覆盖文件并重新启动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中的列表应该根据您的喜好排序。
https://unix.stackexchange.com/questions/668009
复制相似问题