Как автоматически корректировать системные часы в vagrant

Как исправить часовой пояс

в прошлый раз я понял, как настроить системные часы на сервере vagrant. Однако, когда я останавливаю бродягу и запускаю его снова, системные часы всегда опаздывают на 9 часов. Я могу настроить с помощью команды NTP вручную, но я хотел бы знать, как настроить системные часы автоматически.

Я пробовал ниже, но он все еще не работает. Есть ли какие предложения?

Как синхронизировать время на хосте пробуждение в VirtualBox?

6 ответов


метод, который я использую, и он не должен быть специфичным для поставщика, должен добавить следующее в мой Vagrantfile

  config.vm.provision :shell, :inline => "sudo rm /etc/localtime && sudo ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime", run: "always"

вам нужно будет заменить '/ Europe / Paris' на часовой пояс, который вы хотите установить


принятый ответ недостаточно надежен, так как он не учитывает людей, которые путешествуют между часовыми поясами, и требует от конечных пользователей изменения Vagrantfile вместо того, чтобы просто vagrant up.

построение ответа Скотта П., вот лучшее более гибкое решение, которое автоматически соответствует часовому поясу VM для TZ хоста. В выборе часового пояса Etc/GMT его фрагмента есть опечатка/ошибка, согласно POSIX GMT+7 устанавливает часы 7 часов за (см. объяснение Wiki), следовательно, нам нужно поменять смещения:

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.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 было не синхронизировано на 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"

вышеуказанный метод не синхронизирует время гостевой ОС с вашей хост-машиной или любым сервером NTP. Он отправляет HTTP-запрос google.com и обновляет системное время со временем в Поле заголовка ответа HTTP.

следовательно, в зависимости от скорости подключения к интернету и задержки, обновленное время может быть отключено на несколько миллисекунд до нескольких секунд (обычно

ниже curl версия, если вы не хотите использовать wget по какой причине

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

Я:

[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

таким образом, удален символ " \ " escape.


на основе ответа @Benny K. (https://stackoverflow.com/a/46778032/3194807), с учетом летнего времени:

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"