如何在VirtualBox中实现主机唤醒后同步时间?

57
我正在使用VirtualBox在Vagrant内运行基于Ubuntu 12.04的盒子。到目前为止,一切都很好 - 除了一个问题:
假设VM正在运行。然后,主机进入待机模式。唤醒后,VM仍在运行,但其内部时钟继续从主机关机时停止的地方运行。因此,这基本上意味着:将主机休眠15分钟,再次唤醒,然后VM的内部时钟就会晚15分钟。
我该如何解决这个问题(手动设置时间显然不是选项)?是否有一种方法可以在Vagrant VM中运行脚本,每当主机系统更改其状态时?
我已经在文档中阅读到,默认情况下,VirtualBox Guest Additions每10秒钟与主机同步一次时间。显然,这并没有发生,但我找不到任何禁用它的地方。所以有什么想法吗?
PS:Guest Additions已安装,并与使用的VirtualBox版本匹配。

你可能会发现这里的答案对你有用:https://superuser.com/questions/463106/virtualbox-how-to-sync-host-and-guest-time - Asclepius
6个回答

61

文档在这里缺少一些细节。

VirtualBox每10秒只进行轻微调整(大约0.005秒)。只有当时间差达到一个阈值(默认为20分钟)时才会进行“真正”的重新同步。

您可以使用以下命令将阈值降低(例如到10秒):

VBoxManage guestproperty set <vm-name> "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold" 10000

1
有没有可能在 Vagrantfile 中指定这个呢? - Golo Roden
6
好的,我明白了:vb.customize [ "guestproperty", "set", :id, "--timesync-threshold", 10000 ]。该命令用于自定义虚拟机属性,其中"--timesync-threshold"参数设置时间同步阈值为10000。请注意,这是一条代码,而不是完整的句子。 - Golo Roden
30
感谢@GoloRoden提供了vb.customize,但参数有误。正确的命令是vb.customize ["guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 10000] - jbasko
12
可能值得一提的是,vb.customize 应该放在一个块内,例如:config.vm.provider "virtualbox" do |vb| - Slobodan Kovacevic
我不知道为什么,但对我来说时间没有重新同步。它比实际时间慢了几个小时,客户机是MS-Windows7,主机是debian。Virtualbox客户机附加服务在客户机中正在运行。 - ctrl-alt-delor
显示剩余2条评论

28

总结 @zilupe 和 @Slobodan Kovacevic 的答案,解决方案是在 Vagrantfile 中添加以下内容:

config.vm.provider 'virtualbox' do |vb|
   vb.customize [ "guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 1000 ]
end

每当时间不同步达到超过1秒(1000毫秒)时,这将同步时钟。


在Linux的情况下,我建议禁用ntp服务以防止不断需要同步。RHEL:sudo chkconfig ntpd offsudo service ntpd stop Ubuntu:sudo update-rc.d -f ntp removesudo /etc/init.d/ntp stop - Will B.

6

我提供另一种解决方案,可以在不安装Virtualbox客户端附加组件的情况下同步虚拟机和主机之间的时间:

  1. install ntp on your guest, and de-comment these lines in /etc/ntp.conf:

    disable auth
    broadcastclient
    

然后,使用service ntp restart重新启动ntp

  1. 在主机上激活广播:

    • 对于Linux用户,请编辑您的/etc/ntp.conf文件并配置广播(您必须适应IP):

      broadcast 192.168.123.255

    • 对于Windows用户,请激活“Windows Time”服务。然后,您可以阅读此页面以将其配置为广播时间。

    然后,在主机上重新启动时间服务。


4

为了使时间同步正常工作,我必须执行以下操作:

vboxmanage setextradata «machine-name» "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 0

这会开启时间同步功能。由于某些原因,它之前处于关闭状态。


在编写代码设置之前,您可以使用vboxmanage getextradata <machine_name> "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled"来检查此值。虚拟机名称可以在VirtualBox GUI或使用vboxmanage list vms中看到。我发现在VirtualBox 5.1.14和Vagrant 2.2.3中,默认情况下未设置此值。 - RichVel

3
我找到了一个解决方案:
  1. 安装ntpdate
  2. 为ntpdate添加"s"权限,这样非root用户就可以以root身份运行ntpdate:sudo chmod u+s /usr/sbin/ntpdate
  3. ~/.bashrc文件中添加一行:ntpdate -u ntp.ubuntu.com
这样,每次登录Linux系统时,时间将会同步一次。

它应该在服务中运行。 - ctrl-alt-delor
@ctrl-alt-delor 通常是这样的,但在这种情况下,我认为它会破坏VirtualBox的时间同步。 - Antti

1

您可以在虚拟机中安装VirtualBox Guest Additions,通过VB自动同步时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接