it-swarm.com.de

So korrigieren Sie die Systemuhr in Vagrant automatisch

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?

15
Sho

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

27

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
6
Benny K

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
3
Scott P.

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\""
2
Joyce Babu

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.

2
Peter de Zwart

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"