在作为 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