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

Posted

技术标签:

【中文标题】如何在 VirtualBox 中同步主机唤醒时间?【英文标题】:How to sync time on host wake-up within VirtualBox? 【发布时间】:2013-10-29 17:12:13 【问题描述】:

我正在使用 VirtualBox 在 Vagrant 中运行一个基于 Ubuntu 12.04 的盒子。到目前为止,一切都很好——除了一件事:

假设虚拟机正在运行。然后,主机进入待机模式。再次唤醒后,VM 仍在运行,但其内部时钟在主机宕机时停止的地方继续运行。所以这基本上意味着:让主机休眠15分钟,再次唤醒它,然后VM的内部时钟延迟15分钟。

我该如何解决这个问题(由于显而易见的原因,手动设置时间不是一种选择;-))?有没有办法在主机系统更改其状态时在 Vagrant VM 内运行脚本?

我在documentation 中读到,默认情况下,VirtualBox Guest Additions 每 10 秒与主机同步一次时间。显然这没有发生,但我找不到任何禁用它的地方。那么有什么想法吗?

PS:Guest Additions 已安装并与所使用的 VirtualBox 版本相匹配。

【问题讨论】:

您可能会发现answers here 很有用。 【参考方案1】:

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

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

您可以使用以下命令减少阈值(即 10 秒):

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

【讨论】:

是否可以在Vagrantfile 中以某种方式指定这个? 好的,我想通了:vb.customize [ "guestproperty", "set", :id, "--timesync-threshold", 10000 ] @GoloRoden 感谢vb.customize,但参数错误。正确的命令是vb.customize [ "guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 10000 ] 可能值得一提的是 vb.customize 应该在一个块内,例如:config.vm.provider "virtualbox" do |vb| 我不知道为什么,但对我来说时间并没有重新同步。过了几个小时,客人是MS-Windows7,主机是debian。 Virtualbox 来宾添加服务正在来宾中运行。【参考方案2】:

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

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

这将在每次 desync 大于 1s (1000ms) 时同步时钟

【讨论】:

在 Linux 的情况下,我还建议禁用 ntp service 以防止经常需要同步。 RHEL sudo chkconfig ntpd offsudo service ntpd stop Ubuntu:sudo update-rc.d -f ntp removesudo /etc/init.d/ntp stop【参考方案3】:

我提供了另一种解决方案,无需安装 Virtualbox 来宾添加即可在来宾和主机之间同步时间:

    在您的访客上安装 ntp,并在 /etc/ntp.conf 中取消注释这些行:

    disable auth
    broadcastclient
    

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

    在您的主机上进行主动广播:

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

    广播 192.168.123.255

    对于 Windows 用户,请激活“Windows Time”服务。然后您可以read this page 将其配置为广播时间

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

【讨论】:

【参考方案4】:

为了让时间同步正常工作,我必须这样做:

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

它打开时间同步。出于某种原因,它关闭了。

【讨论】:

要在编写代码设置它之前检查这个值,你可以使用vboxmanage getextradata &lt;machine_name&gt; "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" - VM 名称可以在 VirtualBox GUI 或vboxmanage list vms 中看到。我发现 VirtualBox 5.1.14 和 Vagrant 2.2.3 没有默认设置这个值【参考方案5】:

我找到了解决办法:

    安装ntpdate 为ntpdate添加“s”权限,这允许非root用户以root身份运行ntpdate:sudo chmod u+s /usr/sbin/ntpdate~/.bashrc中添加一行:ntpdate -u ntp.ubuntu.com

之后,每次登录linux系统,时间都会同步一次。

【讨论】:

它应该在服务中运行 @ctrl-alt-delor 通常是的,但在这种情况下相信它会弄乱 VirtualBox 的时间同步【参考方案6】:

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

【讨论】:

以上是关于如何在 VirtualBox 中同步主机唤醒时间?的主要内容,如果未能解决你的问题,请参考以下文章

求助,怎样同步控制两个虚拟机

VirtualBox 虚拟机与主机时间同步问题

VirtualBox:如何从主机访问 VM 上的虚拟主机?

如何从 vagrant virtualbox 机器连接主机 PostgreSQL

如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]

如何在 VirtualBox 上 ping ubuntu 来宾 [关闭]