NTP ist das Network Time Protocol. Dieses Protokoll erlaubt den Abgleich der Systemzeit mit einem zentralen ZeitServer (im Internet oder eigener Server im LAN).
Das Protokoll ist in RFC 1305 definiert (siehe auch http://www.ntp.org).
In unseren Breitengraden verwendet man am besten einen der folgenden Server:
ptbtime1.ptb.de (Atomuhr der Physikalisch-Technischen Bundesanstalt)
- ptbtime2.ptb.de
- bernina.ethz.ch // wird nicht weiter betrieben
Bemerkung: Laut http://www.eecis.udel.edu/~mills/ntp/clock1a.html soll man eine Notiz an den Betreiber schicken, wenn man die ptb-server benutzt.
Weitere öffentliche NTP-Server siehe: http://ntp.isc.org/bin/view/Servers/WebHome
Der Zeitabgleich funktioniert am einfachsten mit dem Kommando ntpdate Servername. Anschließend sollte die somit neu gestellte Betriebssystemzeit noch mit hwclock -uw auf die BIOS-Uhr übertragen werden.
Automatisierung durch Cron-Job
So richtig rund wird die Sache, wenn man z.B. über cron folgendes Script ausführt:
ntpdate -t 60 lieblingstimeserver; hwclock -u --systohc
hwclock stellt die Hardware-Uhr (RTC); -u heißt, dass diese auf UTC läuft. Sollte ntpdate nicht schnell genug eine Antwort bekommen (z.B. bei Wählleitungen), kann man das Timeout (-t) auch höher setzen.
Automatisierung bei Wählverbindung
Wer sich über eine Wählleitung mit dem Internet verbindet, kann die nötigen Befehle in der Datei /etc/ppp/ip-up.local unterbringen:
ntpdate ptbtime1.ptb.de hwclock -uw
Unter SuSE 9.0 wird die Zeit über '/etc/ppp/poll.tcpip' beim Einwählen gesetzt, sofern "ntpdate" installiert ist. Der xntpd-Daemon darf nicht laufen. Dann wird ein "/usr/sbin/rcxntpd ntptimeset" ausgeführt. Es müsste lediglich noch die Zeile "/sbin/hwclock -uw" eingefügt werden. Das sollte dann so aussehen:
while true ; do set -- $(/sbin/runlevel) test -e /etc/init.d/rc${2}.d/S*xntpd && break test -x /usr/sbin/ntpdate || break checkproc /usr/sbin/xntpd &> /dev/null && break /usr/sbin/rcxntpd ntptimeset /sbin/hwclock -uw break done
Eigenen Zeitserver aufsetzen
Mit ntpd lässt sich sehr einfach ein eigener ZeitServer aufsetzen. Dazu trägt man in der bei der Installation von ntpd mitgelieferten Datei "/etc/ntp.conf" bis zu drei übergeordnete NTP-Server ein und startet den ntpd mit "/etc/init.d/ntpd start".
Es ist nicht zu empfehlen, ntpd als Server aufzusetzen, wenn man eine Wählleitung hat. Da er selbständig versucht, Verbindungen zu anderen Zeitservern aufzubauen, kann das zu Ärger führen. Vor allem muss der ntpd, sofern er sich die Zeit übers Internet holt, bei jedem re-connect neu gestartet werden. Die alten Verbindungen werden nicht weiter benutzt, und ntpd verliert vollständig die Synchronisation, obwohl der Prozesss läuft.
Mit "ntpq -p" kann man sich den Status anzeigen lassen.
# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *ntp1.ptb.de .PTB. 1 u 1018 1024 377 27.052 -0.481 0.023 +ntp2.ptb.de .PTB. 1 u 174 1024 377 24.566 -0.619 0.168 -rustime01.rus.u .DCFp. 1 u 80 1024 377 27.175 1.816 0.033
Der ntpd braucht nicht unbedingt als Zeitserver für andere Hosts zu dienen, auch für einzelne Clients kann der ntpd durchaus sinnvoll sein: Wenn man ntpdate benutzt, wird die Zeit "auf einen Schlag" richtig gestellt... auch via cronjob würde das täglich einen Zeitsprung verursachen. Der ntpd passt die Zeit "sanft" an, indem er die Uhr langsamer oder schneller laufen lässt. Das verhindert Probleme mit Programmen, die mit Zeitsprüngen nicht umgehen können. Außerdem gibt es keine Sprünge in den Log-Dateien. Allerdings sollte beim Start des ntpd die Zeit halbwegs stimmen. Deswegen am besten nach dem Systemstart mit ntpdate die Zeit synchronisieren und sofort danach den ntpd starten.
Natürlich kann man, statt sich die Zeit aus dem Internet zu holen, eine Funkuhr einsetzen. Siehe auch EigenbauFunkuhr.
Detaillierte Beschreibung
"root" kann sich mit ntpdate das Zeitsignal z. B. einer Atomuhr aus dem Internet holen und die Systemuhr damit hinreichend genau einstellen:
ntpdate ptbtime2.ptb.de ptbtime1.ptb.de
Wenn man die Uhr allerdings auf Dauer synchron halten will, ist diese Methode nicht sehr gut, da bei einem Aufruf von ntpdate die Uhr abrupt neu gestellt wird. Wenn sie so beispielsweise zurück gestellt wird, können in den Logdateien Uhrzeiten doppelt auftauchen.
Deshalb gibt es alternativ den etwas intelligenteren ntpd. Dieser stellt die Uhr nicht neu, sondern verlangsamt bzw. beschleunigt sie solange, bis die Uhrzeit stimmt.
root# cat << "EOC" > /etc/ntp.conf driftfile /var/run/ntpd.drift server ptbtime1.ptb.de server ptbtime2.ptb.de EOC
Jetzt noch den ntpd starten: {{{ntpd -p /var/run/ntpd.pid }}}
Statt ptbtime[12].ptb.de ist es sinnvoller, die NTP-Server seines Internet-Dienstleisters (sog. "provider") zu verwenden, soweit vorhanden.
NTP-Synchronisierung für den Router, rdate für die Clients
Da es suboptimal ist, wenn sich alle Clients hinter einem Router von einen Internet-NTP-Server die Zeit holen, ersetzt man auf den Clients die server-Zeile durch server routername.
ToDo: Refactoring