Unix-Tipp: NTP-Befehle

ITworld.com – Schicken Sie uns noch heute Ihre Unix-Fragen!

Siehe weitere Unix-Tipps und -Tricks

In der Kolumne der letzten Woche wurde NTP, das Network Time Protocol und das Konzept der hochgenauen Zeitmessung vorgestellt. Es gibt zwar zahlreiche Befehle, die Systemadministratoren dabei helfen, die Zeit auf den von ihnen verwalteten Systemen einigermaßen genau zu halten, aber die offensichtlichsten sind sehr begrenzt. Infolgedessen kommt es in den meisten Netzen zu großen Diskrepanzen bei der Systemzeit. Zeitunterschiede wie die unten gezeigten (aus einem realen Netzwerk) sind keine Seltenheit:

host01: Thu Oct 14 10:50:23 EDT 2004

host02: Thu Oct 14 10:43:53 EDT 2004

host03: Thu Oct 14 10:41:52 EDT 2004

host04: Thu Oct 14 10:50:13 EDT 2004

host05: Thu Oct 14 10:33:59 EDT 2004

host06: Thu Oct 14 14:48:17 GMT 2004

host07: Thu Oct 14 10:52:04 EDT 2004 *

host08: Thu Oct 14 10:52:33 EDT 2004

host09: Thu Oct 14 10:49:55 EDT 2004

host10: Thu Oct 14 10:33:20 EDT 2004 *

Host11: Thu Oct 14 10:51:22 EDT 2004

Gerade innerhalb dieser elf nacheinander abgefragten Systeme ist eine erhebliche Variabilität der gemeldeten Zeit zu erkennen. Während die Abfragen im Zeitraum von wenigen Sekunden stattfanden, sind die Zeitunterschiede erheblich größer als ein paar Sekunden. Zwischen der frühesten und der spätesten gemeldeten Zeit liegt ein Unterschied von 18 Minuten und 44 Sekunden. Hätten wir das gesamte Netz abgefragt, wäre der Abstand zwischen der frühesten und der spätesten gemeldeten Zeit noch größer gewesen.

Um Systeme wie diese in eine engere zeitliche Nähe zu bringen, kann der Systemadministrator eine Reihe von Befehlen mit unterschiedlichem Erfolg verwenden.

Der Befehl date

Der Befehl date, mit dem der Systemadministrator Datum und Uhrzeit einstellen kann, ist der naheliegendste Befehl zur Korrektur der Zeit auf einem System, setzt aber voraus, dass der Systemadministrator über eine ziemlich genaue Zeitreferenz verfügt. Auch dieser Befehl wird jeweils für ein System ausgeführt. Wenn ein Systemadministrator den Befehl date verwendet, um zwei Systeme zu synchronisieren, ist es unwahrscheinlich, dass die Systemzeiten näher als ein paar Sekunden aneinander herankommen. Der Befehl date ist eindeutig nicht das Mittel der Wahl, wenn die Synchronisierung wichtig ist. Und in einem Netzwerk mit mehreren hundert Systemen kann dieser Ansatz sowohl mühsam als auch ungenau sein.

Wenn ein Systemadministrator einen Datumsbefehl in einer Schleife wie der unten gezeigten absetzen würde, lägen die Systemzeiten zwar näher beieinander als die oben gezeigten, würden aber weiterhin um so viele Sekunden variieren, wie die Schleife zur Vervollständigung benötigt. Und natürlich wird diese Zeitabweichung immer größer, wenn für jeden ssh-Befehl ein Kennwort eingegeben werden muss.

for host in `cat host_list`do ssh $host "date 10141045"done

Der Datumsbefehl ist für die Synchronisierung von Systemen eindeutig nur von geringem Nutzen. Systemuhren, die dazu neigen, Zeit zu gewinnen oder zu verlieren, und sei es auch nur in der Größenordnung von ein paar Sekunden pro Tag, werden die Zeitlücken schnell wieder vergrößert. Außerdem würden die Uhren von Systemen, die für andere Zeitzonen konfiguriert sind – wie das System, das in der oben gezeigten Liste die Zeit als GMT angibt – um Stunden verschoben, wenn wir den Befehl date wie gezeigt verwenden.

Der rdate-Befehl

Der rdate-Befehl, eine weitaus bessere Wahl für die Synchronisierung von Uhren in einem Netzwerk, erfordert, dass ein Systemadministrator ein System auswählt, das für sein Netzwerk zugänglich ist, vermutlich eines, das eine ziemlich genaue Zeit hält, um es als Zeitreferenz für den Rest zu verwenden.

Die folgende Schleife würde viel bessere Ergebnisse liefern als die oben gezeigte. Die Zeit, die für den Abschluss dieser Schleife benötigt wird, hat keine nachteiligen Auswirkungen, da jeder rdate-Befehl mit der Zeit auf dem Referenzserver synchronisiert wird, wenn dieser Befehl ausgeführt wird.

for host in `cat host_list`do ssh $host "rdate timekeeper"done

Zudem setzt der rdate-Befehl die Zeitzone auf dem Zielsystem nicht außer Kraft. Anstatt die Zeit buchstäblich auf einen Wert zu setzen, der in der Befehlszeile angegeben wird, fordert rdate Zeitdaten an, die von der Zeitzone unabhängig sind. Mit anderen Worten: Wenn Sie „rdate“ auf einem System mit GMT ausführen, wird die Zeit auf dem GMT-System korrekt eingestellt.

Der Befehl rdate wird im Allgemeinen beim Systemstart oder über cron einmal am Tag oder einmal pro Stunde ausgeführt, um die Uhren der Systeme in einem LAN abzugleichen. Im Vergleich zu den zuvor gezeigten undisziplinierten Systemuhren ist dies eine große Verbesserung. Aus der Sicht eines jeden Systems, dessen Uhr mit rdate zurückgesetzt wird, können jedoch einige sehr ungewöhnliche Dinge passieren. Die Uhren können jedes Mal, wenn der rdate-Befehl ausgeführt wird, in der Zeit vor- oder zurückspringen. Dieses Verhalten kann zu sehr merkwürdigen Interpretationen von zeitkritischen Ereignissen führen.

NTP-Befehle

NTP hat gegenüber den Befehlen date und rdate eindeutig erhebliche Vorteile. Zum einen bietet NTP eine Möglichkeit, die Systemuhren mit ungewöhnlicher Präzision zu synchronisieren und die erforderlichen Anpassungen reibungslos vorzunehmen, wodurch die Zeitsprünge vermieden werden, die Befehle wie rdate oft verursachen. Schauen wir uns das einmal genauer an.

NTP bietet zwei Befehle zur Zeiteinstellung: den Befehl ntpdate, der die Systemzeit ähnlich wie der Befehl rdate setzt (d.h., indem er auf ein entferntes System verweist, um die aktuelle Zeit zu erhalten) und der NTP-Daemon – ntpd oder xntpd – der einen viel ausgeklügelteren Mechanismus zum Erreichen und Synchronisieren der richtigen Zeit bereitstellt.

Der ntpdate-Befehl

Der ntpdate-Befehl – der im Allgemeinen wie der rdate-Befehl beim Systemstart, bei Bedarf oder regelmäßig über cron verwendet wird – synchronisiert die Zeit auf einer „Ad-hoc“-Basis auf ähnliche Weise wie rdate. Der Befehl ntpdate hat jedoch zwei sehr wichtige Vorteile gegenüber rdate.

Zum einen verweist ntpdate auf einen NTP-Server, nicht nur auf einen zuverlässigen Zeitnehmer, der in Ihrem Netzwerk zugänglich ist. Da NTP-Server in der Regel in die NTP-Hierarchie (und letztlich in eine hochgenaue Atomuhr) eingebunden sind, sind sie fast garantiert präziser als jeder Server, der einfach nur einen guten Uhrenchip hat.

Zum anderen kann ntpdate eine Reihe von Zeitproben von einer Reihe von Zeitquellen (d.h. mehreren NTP-Servern) sammeln und dann die Zeit auswählen, die am genauesten erscheint. Der Befehl ntpdate bezieht sich also nicht nur auf eine Zeitquelle, die mit größerer Wahrscheinlichkeit genau ist als die mit rdate ausgewählten, sondern er bezieht sich auf eine Reihe solcher Systeme und wendet einen ausgeklügelten Auswahlprozess an.

Ein ntpdate-Befehl könnte so aussehen:

# ntpdate 129.6.15.28

14 Oct 10:52:41 ntpdate: adjust time server 129.6.15.28 offset -0.003350 sec

Wenn der Befehl ntpdate auf Ihrem System installiert ist (/usr/sbin/ntpdate auf den meisten Solaris-Systemen), können Sie genau diesen ntpdate-Befehl jetzt ausprobieren. Der Referenzserver in diesem Beispiel ist ein NTP-Server beim NIST in Gaithersburg, Maryland.

Alternativ könnten Sie einen ntpdate-Befehl wie diesen ausprobieren:

# ntpdate 129.6.15.28 216.200.93.8 208.184.49.9

14 Oct 14:57:41 ntpdate: adjust time server 216.200.93.8 offset 0.015733 sec

In diesem Fall werden mehrere NTP-Server abgefragt.

Der NTP-Daemon

Während der ntpdate-Befehl eine Zeitkontrolle bietet, die um eine Größenordnung besser ist als rdate, geht der NTP-Daemon mit seinen ausgefeilten Algorithmen zur Maximierung von Genauigkeit und Zuverlässigkeit einen Riesenschritt über ntpdate hinaus. Richtig eingesetzt, verbraucht der NTP-Daemon auch nur ein Minimum an Netzwerkressourcen – wir werden diesen Punkt nächste Woche untersuchen.

Der NTP-Daemon bietet ausgeklügelte Algorithmen, die die Systemuhren durch einen Prozess der sukzessiven Annäherung reibungslos synchronisieren. Je länger der Daemon läuft, desto genauer stimmt die Systemzeit mit derjenigen der Quelle überein. Er nimmt schnell große und im Laufe der Zeit kleinere Anpassungen vor, um ein Überschreiten der richtigen Zeit zu vermeiden.

Es kann Minuten oder Stunden dauern, bis NTP ein feines Maß an Genauigkeit erreicht hat, aber sobald dies der Fall ist, kann die Zeitzuverlässigkeit des Systems verblüffend genau sein. Die Zeitgenauigkeit von NTP hängt jedoch letztlich von der Genauigkeit der Zeitquellen ab, auf die es sich bezieht. Jeder NTP-Server versucht, sich mit der UTC (Universal Coordinated Time) zu synchronisieren, indem er die beste verfügbare Zeitquelle und den besten Übertragungsweg verwendet. Wenn die Server, auf die verwiesen wird, Zeiten übertragen, die nicht in unmittelbarer Nähe zueinander liegen, betrachtet NTP einen oder mehrere dieser Zeitserver als fehlerhaft und berücksichtigt sie nicht. Um also mit NTP eine genaue Zeit zu erhalten, muss die Auswahl der Zeitserver genau sein.

Neulinge bei NTP sollten beachten, dass die Ausführung des NTP-Daemon-Prozesses ein System NICHT unbedingt zu einem NTP-Server macht. Ob ein NTP-fähiges System die Rolle eines Clients oder eines Servers spielt, wird durch die Konfigurationsdateien des Daemons auf diesem System bestimmt – etwas, das wir in der Kolumne der nächsten Woche untersuchen werden.

Dieser Artikel, „Unix Tipp: NTP Commands“ wurde ursprünglich von ITworld veröffentlicht.