如何自动更正流浪者中的系统时钟
How to correct system clock in vagrant automatically
上次,我想出了如何在vagrant server中调整系统时钟。但是,当我停止 vagrant 并重新启动它时,系统时钟总是晚 9 小时。我可以通过ntp命令手动调整,但我想知道如何自动调整系统时钟。
下面的方法我都试过了,还是不行。有什么建议吗?
How to sync time on host wake-up within VirtualBox?
我使用的方法(不应该特定于提供商)是在我的 Vagrantfile 中添加以下内容
config.vm.provision :shell, :inline => "sudo rm /etc/localtime && sudo ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime", run: "always"
您需要将“/Europe/Paris”替换为您要设置的时区
自动检测时区的略微改进版本:
自动检测部分来自here。
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
我的 Vagrant Guest OS 时间不同步 7 天。上面的方法对我不起作用,因为我的来宾机器上没有安装来宾添加和 ntp。
我终于通过使用来自
https://askubuntu.com/a/683136/119371
cfg.vm.provision "shell", inline: "date -s \"$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z\"", run: "always", privileged: true, upload_path: "/home/vagrant/tmp/vagrant-shell"
上述方法不会将 Guest OS 时间与您的主机或任何 NTP 服务器同步。它向 google.com 发送 HTTP 请求,并使用 HTTP 响应 header 字段中的时间更新系统时间。
因此,根据您的互联网连接速度和延迟,更新时间可能会相差几毫秒到几秒(通常 < 100 毫秒)。但在大多数情况下应该无关紧要。
以下是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 小时 behind(参见 Wiki explanation), 因此我们需要交换偏移量:
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
我得到了:
[vagrant@ansiblecontrol ~]$ date -s \"$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z\"
date: extra operand ‘2018’
Try 'date --help' for more information.
这对我有用:
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"
自动设置时区的最简单方法是使用 vagrant-timezone 插件。
安装一次:
vagrant plugin install vagrant-timezone
之后,将以下内容添加到您的 Vagrantfile
:
if Vagrant.has_plugin?("vagrant-timezone")
config.timezone.value = "UTC"
end
您可以将“UTC”替换为列出的任何 tz 值 here。
例如:“Asia/Kolkata”.
或者您可以在您的 Vagrantfile
:
中将您主机的时区用于此条目
if Vagrant.has_plugin?("vagrant-timezone")
config.timezone.value = :host
end
and 's solution giving me the negative value of a timezone, like in 的案例。值得注意的是,我的主机 OS 是 Windows。如果 timedatectl
出现在您的客人(如 Debian 9+)上,这就是我用来更改时区设置的内容:
config.vm.provision "shell",
inline: "timedatectl set-timezone Europe/Budapest",
run: "always"
这个returns预期的时区,不是负值:
# before timedatectl
vagrant@master:~$ timedatectl
Local time: Fri 2020-07-03 11:52:31 -02
Universal time: Fri 2020-07-03 13:52:31 UTC
RTC time: Fri 2020-07-03 13:52:31
Time zone: Etc/GMT+2 (-02, -0200)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
# after timedatectl
vagrant@master:~$ timedatectl
Local time: Fri 2020-07-03 15:53:24 CEST
Universal time: Fri 2020-07-03 13:53:24 UTC
RTC time: Fri 2020-07-03 13:53:24
Time zone: Europe/Budapest (CEST, +0200)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
方法是像主机使用一样自动设置时区
vagrant-timezone 插件。
使用
安装 vagrant-timezone 插件
vagrant plugin install vagrant-timezone
之后,将以下内容添加到您的 Vagrantfile
config.timezone.value = :host
请注意,此功能仅在 OS X 主机和 Linux 来宾上进行了测试。
上次,我想出了如何在vagrant server中调整系统时钟。但是,当我停止 vagrant 并重新启动它时,系统时钟总是晚 9 小时。我可以通过ntp命令手动调整,但我想知道如何自动调整系统时钟。
下面的方法我都试过了,还是不行。有什么建议吗?
How to sync time on host wake-up within VirtualBox?
我使用的方法(不应该特定于提供商)是在我的 Vagrantfile 中添加以下内容
config.vm.provision :shell, :inline => "sudo rm /etc/localtime && sudo ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime", run: "always"
您需要将“/Europe/Paris”替换为您要设置的时区
自动检测时区的略微改进版本:
自动检测部分来自here。
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
我的 Vagrant Guest OS 时间不同步 7 天。上面的方法对我不起作用,因为我的来宾机器上没有安装来宾添加和 ntp。
我终于通过使用来自 https://askubuntu.com/a/683136/119371
cfg.vm.provision "shell", inline: "date -s \"$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z\"", run: "always", privileged: true, upload_path: "/home/vagrant/tmp/vagrant-shell"
上述方法不会将 Guest OS 时间与您的主机或任何 NTP 服务器同步。它向 google.com 发送 HTTP 请求,并使用 HTTP 响应 header 字段中的时间更新系统时间。
因此,根据您的互联网连接速度和延迟,更新时间可能会相差几毫秒到几秒(通常 < 100 毫秒)。但在大多数情况下应该无关紧要。
以下是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 小时 behind(参见 Wiki explanation), 因此我们需要交换偏移量:
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
我得到了:
[vagrant@ansiblecontrol ~]$ date -s \"$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z\"
date: extra operand ‘2018’
Try 'date --help' for more information.
这对我有用:
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"
自动设置时区的最简单方法是使用 vagrant-timezone 插件。
安装一次:
vagrant plugin install vagrant-timezone
之后,将以下内容添加到您的 Vagrantfile
:
if Vagrant.has_plugin?("vagrant-timezone")
config.timezone.value = "UTC"
end
您可以将“UTC”替换为列出的任何 tz 值 here。 例如:“Asia/Kolkata”.
或者您可以在您的 Vagrantfile
:
if Vagrant.has_plugin?("vagrant-timezone")
config.timezone.value = :host
end
timedatectl
出现在您的客人(如 Debian 9+)上,这就是我用来更改时区设置的内容:
config.vm.provision "shell",
inline: "timedatectl set-timezone Europe/Budapest",
run: "always"
这个returns预期的时区,不是负值:
# before timedatectl
vagrant@master:~$ timedatectl
Local time: Fri 2020-07-03 11:52:31 -02
Universal time: Fri 2020-07-03 13:52:31 UTC
RTC time: Fri 2020-07-03 13:52:31
Time zone: Etc/GMT+2 (-02, -0200)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
# after timedatectl
vagrant@master:~$ timedatectl
Local time: Fri 2020-07-03 15:53:24 CEST
Universal time: Fri 2020-07-03 13:53:24 UTC
RTC time: Fri 2020-07-03 13:53:24
Time zone: Europe/Budapest (CEST, +0200)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
方法是像主机使用一样自动设置时区 vagrant-timezone 插件。
使用
安装 vagrant-timezone 插件vagrant plugin install vagrant-timezone
之后,将以下内容添加到您的 Vagrantfile
config.timezone.value = :host
请注意,此功能仅在 OS X 主机和 Linux 来宾上进行了测试。