systemd-timesyncd.service 在 VMWare 上的 Arch 上处于非活动状态

systemd-timesyncd.service 在 VMWare 上的 Arch 上处于非活动状态

在作为 VMWare Fusion 上的来宾操作系统运行的 Arch Linux 上,我注意到当我使主机操作系统休眠并且永远不会恢复同步时,Arch 的系统时间会落后。看来 systemd-timesyncd 已加载但不活动。

[root@arch1 ~]# systemctl status systemd-timesyncd
* systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled)
   Active: inactive (dead) since Tue 2014-09-30 11:04:42 PDT; 3min 7s ago
           start condition failed at Tue 2014-09-30 11:04:42 PDT; 3min 7s ago
           ConditionVirtualization=no was not met
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 17582 (code=exited, status=0/SUCCESS)
   Status: "Idle."

更新:下面的答案解释了如何让 systemd-timesyncd.service 在虚拟机下运行,但事实证明这并不能解决时间同步问题(这可能就是为什么 systemd-timesyncd 在虚拟机下被禁用的原因)。 Arch 维基页面在 VMWare 中安装 Arch Linux解释如何执行时间同步来宾操作系统和主机操作系统之间。

答案1

只需创建一个取消设置该参数的配置文件即可。

mkdir -p /etc/systemd/system/systemd-timesyncd.service.d
echo -e "[Unit]\nConditionVirtualization=" > /etc/systemd/system/systemd-timesyncd.service.d/allow_virt.conf
systemctl daemon-reload
systemctl start systemd-timesyncd.service

systemd.unit 手册页中描述了此技术:

除了单元文件 foo.service 之外,还可能存在目录 foo.service.d/。该目录中所有后缀为“.conf”的文件将在文件本身解析后进行解析。这对于更改或添加单元的配置设置非常有用,而无需修改其单元文件。确保包含的文件在任何指令之前都有适当的节标题。

答案2

来自 systemd.unit 人:

ConditionVirtualization=可用于检查系统是否在虚拟化环境中执行,并可选地测试它是否是特定的实现。采用布尔值来检查是否在任何虚拟化环境中执行,或者使用 vm 和容器之一来测试通用类型的虚拟化解决方案,或者使用 qemu、kvm、vmware、microsoft、oracle、xen、bochs、chroot、uml 之一、 openvz、lxc、lxc-libvirt、systemd-nspawn 用于测试特定实现。如果多个虚拟化技术嵌套,则只考虑最里面的。可以通过在前面加上感叹号来否定该测试。

ConditionVirtualization=no 告诉 systemd不是如果操作系统在虚拟化环境中运行,则运行该服务。我的猜测是,检查是存在的,因为某些虚拟机提供了提供时间同步的来宾操作系统工具。您可以在 Arch 上安装这些工具,也可以在 /usr/lib/systemd/system/systemd-timesyncd.service 中注释掉 ConditionVirtualization=no ,然后运行以下命令:

systemctl daemon-reload
systemctl restart systemd-timesyncd

现在systemctl status systemd-timesyncd应该显示它处于活动状态:

[root@arch1 ~]# systemctl status systemd-timesyncd
* systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled)
   Active: active (running) since Tue 2014-09-30 11:10:12 PDT; 56s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 17648 (systemd-timesyn)
   Status: "Using Time Server 216.239.32.15:123 (time1.google.com)."
   CGroup: /system.slice/systemd-timesyncd.service
           `-17648 /usr/lib/systemd/systemd-timesyncd

请注意,如果您还没有这样做,您还需要设置/etc/systemd/timesyncd.conf为指向某些 ntp 服务器。例如:

# See timesyncd.conf(5) for details

[Time]
Servers=time1.google.com time2.google.com time3.google.com time4.google.com

相关内容