Wie erzwinge ich eine Uhrenaktualisierung mit ntp?

Ich verwende Ubuntu auf einem ARM-basierten eingebetteten System, dem eine batteriegestützte Echtzeituhr fehlt. Die Aufwachzeit ist irgendwo im Jahr 1970. Daher verwende ich den NTP-Dienst, um die Uhrzeit auf die aktuelle Uhrzeit zu aktualisieren.

Ich habe die folgende Zeile hinzugefügt /etc/rc.local Datei:

sudo ntpdate -s time.nist.gov

Nach dem Start dauert es jedoch noch einige Minuten, bis die Uhrzeit aktualisiert ist, in diesem Zeitraum kann ich nicht effektiv arbeiten tar und make.

Wie kann ich eine Uhrenaktualisierung zu einem bestimmten Zeitpunkt erzwingen?


AKTUALISIERUNG 1: Das Folgende (danke an Eric und Stephan) funktioniert einwandfrei über die Befehlszeile, aktualisiert die Uhr jedoch nicht, wenn sie eingegeben wird /etc/rc.local:

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; dateThu Jan  1 00:00:58 UTC 1970 * Stopping NTP server ntpd     [ OK ]  * Starting NTP server          [ OK ] Thu Feb 14 18:52:21 UTC 2013

Was mache ich falsch?


AKTUALISIERUNG 2: Ich habe versucht, den wenigen Vorschlägen zu folgen, die als Antwort auf das 1. Update kamen, aber nichts scheint die Aufgabe tatsächlich wie erforderlich zu erfüllen. Folgendes habe ich versucht:

  1. Ersetzen Sie den Server durch us.pool.ntp.org
  2. Explizite Pfade zu den Programmen verwenden
  3. Entfernen Sie die ntp service insgesamt und lassen Sie einfach sudo ntpdate ... in rc.local
  4. Entfernen Sie die sudo aus dem obigen Befehl in rc.local

Mit dem oben genannten startet die Maschine immer noch bei 1970. Wenn Sie dies jedoch von der Befehlszeile aus tun, sobald Sie angemeldet sind (über ssh), wird die Uhr aktualisiert, sobald ich aufrufe ntpdate.

Das letzte, was ich getan habe, war, das zu entfernen rc.local und rufen Sie an ntpdate in meinem .bashrc Datei. Dadurch wird die Uhr wie erwartet aktualisiert und ich erhalte die tatsächliche aktuelle Uhrzeit, sobald die Eingabeaufforderung verfügbar ist.

Jedoch, dies bedeutet, dass, wenn die Maschine eingeschaltet ist und kein Benutzer angemeldet ist, die Zeit nie aktualisiert wird. Ich kann natürlich das neu installieren ntp service so wird zumindest die Uhr innerhalb weniger Minuten nach dem Start aktualisiert, aber dann sind wir wieder auf Platz 1.

Also, gibt es einen Grund, warum die Platzierung der ntpdate befehl ein rc.local führt die erforderliche Aufgabe nicht aus, während dies in .bashrc funktioniert gut?

Anstelle von ntpdate (das ist veraltet), verwenden ntpd:

sudo service ntp stopsudo ntpd -gqsudo service ntp start

Der -gq weist den NTP-Dämon an, die Zeit unabhängig vom Offset zu korrigieren (g) und sofort beenden (q) nach dem Einstellen der Uhrzeit.

Wahrscheinlich die ntp der Dienst läuft, deshalb ntpdate der Socket (Port 123 UDP) kann nicht geöffnet und eine Verbindung zum NTP-Server hergestellt werden.

Versuchen Sie es von der Befehlszeile aus:

sudo service ntp stopsudo ntpdate -s time.nist.govsudo service ntp start

Wenn du das reinstecken willst /etc/rc.local verwenden Sie Folgendes:

( /etc/init.d/ntp stopuntil ping -nq -c3 8.8.8.8; do   echo "Waiting for network..."donentpdate -s time.nist.gov/etc/init.d/ntp start )&

Verwenden Sie sntp, um die Uhrzeit sofort einzustellen. Einige Beispiele aus seiner Manpage:

USAGE     sntp ntpserver.somewhere             is the simplest use of this program and can be run as an unprivileged command to check the current time and error in the local clock.     sntp -Ss -M 128 ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -Ss -M 128 ntpserver.somewhere will request the time from the server, and if that server reports that it is             synchronized then if the offset adjustment is less than 128 milliseconds the correction will be slewed, and if the correction is more than 128 milliseconds the correction  will             be stepped.     sntp -S ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -S ntpserver.somewhere will set (step) the local clock from a synchronized specified server, like the (dep‐             recated) ntpdate(8), or rdate(8) commands.

Es funktioniert mit jedem NTP-Zeitserver. Eine praktische Liste der Server finden Sie unter ntppool.org .

Sie brauchen sudo privilegien, zum Beispiel:

sudo sntp -Ss -M 128 0.de.pool.ntp.org

Verwenden timedatectl (systemd Service Unit), um die Uhrzeit einzustellen. ntp ist veraltet.

sudo systemctl restart systemd-timesyncd.service

Sie können überprüfen, ob die Uhrzeit aktualisiert wurde, indem Sie die Protokolle lesen mit journalctl -xe | tail.

Status mit timedatectl status und konfigurieren in /etc/systemd/timesyncd.conf.

Referenz

Wie andere bereits betont haben, besteht die beste Lösung darin, ntpd anzuweisen, die Panikschwelle zu ignorieren, die standardmäßig 1000 Sekunden beträgt. Sie können die Panikschwelle auf zwei Arten konfigurieren:

  • bearbeiten /etc/default/ntp und stellen Sie sicher, dass die Option -g vorhanden ist.
  • bearbeiten Sie /etc/ntp.konf und Ort tinker panic 0 oben

Bisher ist dies im Wesentlichen das, was andere empfohlen haben, aber es gibt noch einen weiteren Schritt, den Sie Meiner Meinung nach unternehmen sollten. Installieren Sie das Fake-hwclock-Programm:

# apt-get install fake-hwclockfake-hwclock: Save/restore system clock on machines without working RTC hardware Some machines don't have a working realtime clock (RTC) unit, or no driver for the hardware that does exist. fake-hwclock is a simple set of scripts to save the kernel's current clock periodically (including at shutdown) and restore it at boot so that the system clock keeps at least close to realtime. This will stop some of the problems that may be caused by a system believing it has travelled in time back to 1970, such as needing to perform filesystem checks at every boot. On top of this, use of NTP is still recommended to deal with the fake clock "drifting" while the hardware is halted or rebooting.

Wenn fake-hwclock installiert ist, startet Ihr Computer nicht mehr und denkt, es sei noch einmal 1970. Wenn Ihr Computer hochfährt, stellt er seine Uhr auf den Zeitstempel, den fake-hwclock beim letzten Neustart / Herunterfahren geschrieben hat. Dies bedeutet, dass Sie eine etwas korrekte Uhr haben können, falls beim Booten Netzwerkprobleme auftreten.

ntpdate ist ein anderes Programm als das Net dameon. NTPDate ist wahrscheinlich beim Booten fehlerhaft, weil ntpd auf diesem Socket ausgeführt wird.

Führen Sie in der Befehlszeile Folgendes aus

# sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start

Sie können ntpd auch alle zusammen deinstallieren (apt-get remove ntp ) und ein Cron-Skript hinzufügen, um ntpdate etwa jede Stunde zu verwenden.

UPDATE

der NTP-Dienst wird auf diesem System wahrscheinlich keinen sinnvollen Wert für Sie haben, also entfernen Sie diesen zuerst.

# sudo apt-get remove ntp

Fügen Sie nun den Befehl hinzu:

ntpdate -sb time.nist.gov

zu /etc/rclocal

Neustart. Sollte an diesem Punkt gut sein.

rdate -s tick.greyware.com

wenn Sie die Uhr nur einmal einstellen möchten, einfach

Beachten Sie, dass einige aktuelle Ubuntu-basierte Systeme den NTP-Dienst jetzt nicht einmal standardmäßig verwenden. Auf meinem Linux Mint 19-Computer (Ubuntu 18.04) wird die Zeit von gehalten systemd-timesyncd.

Um eine aktuelle Uhrzeit zu erhalten, nachdem die Synchronisierung verloren gegangen ist, renne ich einfach

sudo systemctl restart systemd-timesyncd

Seit 15.04 verwendet Ubuntu standardmäßig systemd. Daher werden kritische Systeme wie die Zeit über systemd verwaltet. Um herauszufinden, welchen Dienst Ihr System verwendet, führen Sie Folgendes aus

systemctl list-unit-files | grep -E 'ntp|timesyncd'

Für TechJS am 16.04 war der Service ntp. Für mich selbst auf Ubuntu 18.04 (Mint 19) ist der Service systemd-timesyncd. Interessanterweise habe ich mich bei einem 16.04-Server angemeldet, den ich habe und der verwendet systemd-timesyncd sowie.

Der richtige Weg, dies auf einem Debian / Mint / Ubuntu-System (oder einem anderen Debian-Derivat) zu tun, besteht darin, die Zeile zu haben

NTPD_OPTS="-g"

in der Datei

/etc/default/ntp

Dies stellt sicher, dass, wenn ntpd aus der /etc / init gestartet wird.d / NTP-Skript, es wird mit der Option "-g" ausgeführt, nämlich

 start-stop-daemon --start --quiet --oknodo --pidfile /var/run/ntpd.pid --startas /usr/sbin/ntpd -- -p /var/run/ntpd.pid -g -u 124:128

damit ntpd die Systemzeit korrigieren kann, wenn sie mehr als 1000 s entfernt ist, z. B. wenn die Systemzeit beim Start der 1. Januar 1970 ist, weil keine Hardware-RTC vorhanden ist.

tlsdate stellt die lokale Uhr ein, indem eine sichere Verbindung mit TLS zu Remote-Servern hergestellt und die Remote-Zeit aus dem sicheren Handshake extrahiert wird. Im Gegensatz zuntpdate, tlsdate verwendet TCP, um beispielsweise eine Verbindung zu einem HTTPS- oder TLS-fähigen Remote-Dienst herzustellen, und bietet einen gewissen Schutz vor Gegnern, die versuchen, Ihnen böswillige Zeitinformationen zuzuführen.

$ tlsdate -V -n -H encrypted.google.com

von hier:
'ntpdate -s ntp.ubuntu.com `

beachten Sie das Flag ‘-b’ bei ntpdate. Auf der Manpage von ntpdate: “Erzwingen Sie, dass die Zeit mit dem Systemaufruf settimeofday() erhöht wird, anstatt mit dem Systemaufruf adjtime() (Standard) zu adjtime() . Diese Option sollte verwendet werden, wenn sie beim Booten aus einer Startdatei aufgerufen wird.” Viele der folgenden Antworten enthalten es nicht, und das ist vielleicht ein Teil des Problems, Dinge zum Laufen zu bringen. Bedenken Sie, dass das Flag ‘-B’ erwähnt, dass die Synchronisierung von Offsets über 128 ms mit dem Standard-Slew-Mechanismus Stunden dauern kann

'timedatectl`, aber How to update system time behind a proxy? - Ask Ubuntu

Es ist nicht erforderlich, sudo in / etc / rc zu verwenden.gebietsschema-Dateien … sie werden bereits als Root ausgeführt.