Server 如何自动校正流浪汉的系统时钟

Server 如何自动校正流浪汉的系统时钟,server,vagrant,virtualbox,centos6,Server,Vagrant,Virtualbox,Centos6,上一次,我弄明白了如何在vagrant服务器中调整系统时钟。然而,当我停止流浪者并再次启动它时,系统时钟总是晚9小时。我可以使用ntp命令手动调整,但我想知道如何自动调整系统时钟 我试过下面的方法,但仍然不起作用。有什么建议吗 我使用的方法(不应该是特定于提供商的)是在我的文件中添加以下内容 config.vm.provision :shell, :inline => "sudo rm /etc/localtime && sudo ln -s /usr/share/zo

上一次,我弄明白了如何在vagrant服务器中调整系统时钟。然而,当我停止流浪者并再次启动它时,系统时钟总是晚9小时。我可以使用ntp命令手动调整,但我想知道如何自动调整系统时钟

我试过下面的方法,但仍然不起作用。有什么建议吗


我使用的方法(不应该是特定于提供商的)是在我的文件中添加以下内容

  config.vm.provision :shell, :inline => "sudo rm /etc/localtime && sudo ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime", run: "always"
if Vagrant.has_plugin?("vagrant-timezone")
    config.timezone.value = "UTC"
end

您需要将“/Europe/Paris”替换为您想要设置的时区

一个稍微改进的自动检测时区的版本:

自动检测部分来自


我的流浪客操作系统时间不同步了7天。上述方法对我不起作用,因为来宾添加和ntp没有安装在我的来宾计算机中

我最终通过使用来自的黑客解决了这个问题

上述方法不会将来宾操作系统时间与主机或任何NTP服务器同步。它向google.com发送一个HTTP请求,并用HTTP响应头字段中的时间更新系统时间

因此,根据您的internet连接速度和延迟,更新时间可能会缩短几毫秒到几秒钟(通常<100ms)。但在大多数情况下,这并不重要

以下是
curl
版本,如果您出于任何原因不想使用
wget

cfg.vm.provision "shell", inline: "date -s \"$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z\""

公认的答案不够可靠,因为它不考虑在时区之间旅行的人,并且要求最终用户修改
Vagrantfile
,而不仅仅是执行
vagrant up

基于Scott p.的答案,这里有一个更好、更灵活的解决方案,可以自动将VM时区与主机的tz相匹配。由于POSIX GMT+7将时钟设置为7小时(请参阅),因此,我们需要交换偏移量:

Vagrant.configure("2") do |config|
require 'time'
offset = ((Time.zone_offset(Time.now.zone) / 60) / 60)
timezone_suffix = offset >= 0 ? "-#{offset.to_s}" : "+#{offset.to_s}"
timezone = 'Etc/GMT' + timezone_suffix
config.vm.provision :shell, :inline => "sudo rm /etc/localtime && sudo ln -s /usr/share/zoneinfo/" + timezone + " /etc/localtime", run: "always"
end
我得到:

这对我很有用:

sudo date -s "$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z"
Sun Apr  1 16:36:59 CEST 2018

因此删除了“\”转义字符。

基于@Benny K.的答案(),并考虑了夏令时:

require "time"
offset = ((Time.zone_offset(Time.now.zone) / 60) / 60) + (Time.now.dst? ? 1 : 0)
timezone_suffix = offset >= 0 ? "-#{offset.to_s}" : "+#{offset.to_s}"
timezone = 'Etc/GMT' + timezone_suffix

tzShellProvision = <<_SHELL_
    ln -fs /usr/share/zoneinfo/#{timezone} /etc/localtime
    dpkg-reconfigure -f noninteractive tzdata
_SHELL_

default.vm.provision :shell, inline: tzShellProvision, run: "always"
需要“时间”
偏移量=((时区\偏移量(Time.now.zone)/60)/60)+(Time.now.dst±1:0)
时区后缀=偏移量>=0?“-#{offset.to_s}”:“+#{offset.to_s}”
时区='Etc/GMT'+时区后缀

tzShellProvision=自动设置时区的最简单方法是使用插件

使用安装vagrant时区插件

vagrant plugin install vagrant-timezone
之后,将以下内容添加到您的文件中

  config.vm.provision :shell, :inline => "sudo rm /etc/localtime && sudo ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime", run: "always"
if Vagrant.has_plugin?("vagrant-timezone")
    config.timezone.value = "UTC"
end
您可以用列出的任何tz值替换“UTC”。 例如:“Asia/Kolkata”。

和的解决方案给了我一个时区的负值,就像在的例子中一样。值得注意的是,我的主机操作系统是Windows。如果您的来宾(如Debian 9+)上存在
timedatectl
,这就是我用来更改时区设置的内容:

config.vm.provision“shell”,
内联:“timedatectl设置欧洲/布达佩斯时区”,
跑步:“永远”
此选项返回预期时区,而不是负值:

#在timedatectl之前
vagrant@master:~$timedatectl
当地时间:星期五2020-07-03 11:52:31-02
世界时间:星期五2020-07-03 13:52:31 UTC
RTC时间:周五2020-07-03 13:52:31
时区:Etc/GMT+2(-02,-0200)
系统时钟已同步:否
NTP服务:非活动
RTC在本地TZ:否
#在timedatectl之后
vagrant@master:~$timedatectl
当地时间:星期五2020-07-03 15:53:24 CEST
世界时间:星期五2020-07-03 13:53:24 UTC
RTC时间:周五2020-07-03 13:53:24
时区:欧洲/布达佩斯(CEST,+0200)
系统时钟已同步:否
NTP服务:非活动
RTC在本地TZ:否

在匹配guest Addition的版本后,它可以完美地工作。(我看不清楚版本不匹配是否真的对这个问题很重要)如果我继续使用vagrant,我想我应该学习ruby。非常感谢@Sho:您也可以将vagrant与shell配置脚本一起使用,或者使用puppet或chef编写脚本。您不会被迫使用ruby。我对shell资源调配非常满意。除此之外,在我安装了
ntp
软件包(它已经安装在我的主机上)以启动并运行ntp之前,我的基于Ubuntu的guest从未正确地同步过时间,你可能会说“是的”,但我认为guest的添加应该完全解决这个问题。当然,。有一个流浪时区插件,请看这篇帖子:@cleary-correct,但在提问时它并不存在,这取决于你是否想拥有一大套插件或控制正在发生的事情。。。对于Vagrant文件中的1行,我不喜欢安装插件。这确实改变了时区,但方向错误。(我住在欧洲/柏林时间)谢谢你的发帖!这似乎是做这件事最像流浪汉的方法,但我很惊讶我是第一个升级投票者-这不是一个新插件,根据github的承诺,它于2016年开始开发()“流浪插件安装流浪时区”这解决了我的问题。谢谢
if Vagrant.has_plugin?("vagrant-timezone")
    config.timezone.value = "UTC"
end