Как автоматически корректировать системные часы в 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"