So korrigieren Sie die Zeitzone
Letztes Mal habe ich herausgefunden, wie man eine Systemuhr im Vagrant Server anpasst. Wenn ich den Vagrant jedoch anhalte und wieder starte, ist die Systemuhr immer 9 Stunden zu spät. Ich kann die Einstellung mit dem Befehl ntp manuell vornehmen, aber ich würde gerne wissen, wie die Systemuhr automatisch eingestellt wird.
Ich habe das unten ausprobiert, aber es funktioniert immer noch nicht. Gibt es irgendwelche Vorschläge?
Wie synchronisiere ich die Zeit beim Host-Wakeup in VirtualBox?
Die Methode, die ich verwende und sollte nicht anbieterspezifisch sein, besteht darin, die folgende in meiner Vagrantfile hinzuzufügen
config.vm.provision :Shell, :inline => "Sudo rm /etc/localtime && Sudo ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime", run: "always"
sie müssen '/ Europe/Paris' durch die Zeitzone ersetzen, die Sie einstellen möchten
Die akzeptierte Antwort ist nicht robust genug, da sie nicht Personen berücksichtigt, die zwischen Zeitzonen reisen, und dass Endbenutzer Vagrantfile
ändern müssen, anstatt nur vagrant up
zu tun.
Aufbauend auf der Antwort von Scott P. ist hier eine flexiblere Lösung, die die Zeitzone von VM automatisch an Hosts Tz anpasst. Es gibt einen Tippfehler in der Etc/GMT-Zeitzonenauswahl des Snippets, da POSIX GMT + 7 die Uhrzeit 7 Stunden hinter (siehe Wiki-Erklärung ) einstellt. Daher müssen Offsets ausgetauscht werden:
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
Eine etwas verbesserte Version, die die Zeitzone automatisch erkennt:
Der automatische Erkennungsabschnitt stammt von hier .
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
Die Uhrzeit meines Vagrant Guest-Betriebssystems war um 7 Tage nicht synchron. Die oben genannten Methoden haben für mich nicht funktioniert, da Guest-Zusätze und NTP nicht auf meinem Guest-Computer installiert waren.
Ich habe das Problem schließlich gelöst, indem ich den Hack von verwendet habe 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"
Die obige Methode synchronisiert die Gastbetriebssystemzeit nicht mit Ihrem Host-Computer oder einem NTP -Server. Es sendet eine HTTP-Anforderung an google.com und aktualisiert die Systemzeit mit der Uhrzeit im Feld für den HTTP-Antwortheader.
Abhängig von Ihrer Internetverbindungsgeschwindigkeit und Latenz kann die aktualisierte Zeit zwischen einigen Millisekunden und einigen Sekunden (normalerweise <100 ms) liegen. In den meisten Fällen sollte es aber keine Rolle spielen.
Nachfolgend die curl
-Version, wenn Sie wget
aus irgendeinem Grund nicht verwenden möchten
cfg.vm.provision "Shell", inline: "date -s \"$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z\""
Ich habe:
[[email protected] ~]$ 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.
Das funktioniert für mich:
Sudo date -s "$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z"
Sun Apr 1 16:36:59 CEST 2018
Also das "\" Escape-Zeichen entfernt.
Basierend auf der Antwort von @Benny K. ( https://stackoverflow.com/a/46778032/3194807 ), wobei die Sommerzeit berücksichtigt wird:
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"