www.Newbie-Net.de

Zeitserver

Systemzeit im Netzwerk zur Verfügung stellen

Autor: Karsten Kruse

Inhalt

Vorwort

Ab und an stimmt die Systemzeit nicht mit der tatsächlichen überein. Dann frage ich einen Zeitserver im Internet nach der aktuellen Zeit und das möchte ich im folgenden beschreiben. Und wenn wir schon dabei sind, installieren wir gleich noch einen Zeitserver um alle Clientrechner im LAN mit der richtigen Zeit zu versorgen. Damit wird zukünftigen Problemen mit z.b. NFS oder make aus dem Wege gegangen.

Serverzeit einstellen

Das Werkzeug das ich benutze um die Systemzeit einzustellen, heisst ntpdate. Ein typischer Aufruf sieht so aus:

 root@nethunter:/ > ntpdate time.fu-berlin.de
 21 Mar 17:28:11 ntpdate[18025]: adjust time server 130.133.1.10 offset -0.416688 sec

Die Systemzeit ist jetzt eingestellt. Unter Linux sollte man diese Zeit jetzt noch mit der BIOS-Zeit, auch Hardwarezeit genannt, abgleichen. Dazu benutzen wir hwclock:

 hwclock --systohc

Hardware- und Systemzeit sind jetzt auf dem richtigen Stand. Um das beizubehalten, könnte z.b. ein Cronjob alle paar Stunden den Abgleich ausführen. Dazu habe ich ein kleines Skript (http://www.newbie-net.de/download/getnettime.sh) geschrieben. Ein Cronjob könnte in die crontab so eingetragen werden:

 45 4 * * * getnettime.sh

Das würde jeden Tag um 4:45 das Script starten und die Zeit abgleichen.

Zeitserver einrichten

Es gibt drei Wege einen eigenen Zeitserver einzurichten: Via inetd, via xinetd oder via ntpd. Die letztgenannte Lösung ist ziemlich umfangreich und vermutlich ein wenig übertrieben für das Netzwerk zu Hause. Ich erkläre deswegen die ersten beiden Möglichkeiten.

Zeitserver via inetd

Die Zeitserverfunktion ist schon im inet eingebaut, wir müssen sie nur in der Konfigurationsdatei /etc/inetd.conf aktivieren. Nachdem der inetd von der Distributions-CD installiert wurde, suchen wir in der Datei /etc/inetd.conf eine Zeile die mit "#time" beginnt. In dieser Zeile entfernen wir das Kommentarzeichen. Bei mir sieht die Zeile dann so aus:

 time   dgram   udp     wait    nobody  internal

Die Zeile kann bei deinem inetd etwas anders aussehen, je nach System. Jetzt muss der inetd noch gestartet werden. Das erledigt folgendes Kommando:

 /etc/init.d/inetd start

Zeitserver via xinetd

Die Zeitserverfunktion ist schon im xinet eingebaut, wir müssen sie nur in der Konfigurationsdatei /etc/xinetd.d/time-udp aktivieren. Nachdem der xinetd von der Distributions-CD installiert wurde, suchen wir in der Datei /etc/xinetd.d/time-udp eine Zeile die "disable = yes" enthält. In dieser Zeile ändern wir "yes" zu "no" um den Dienst zu aktivieren:

 disable = no

Jetzt muss der xinetd noch gestartet werden. Das erledigt folgendes Kommando:

 /etc/init.d/xinetd start

Linux als Client

Jetzt müssen nur noch die Clientrechner mit dem Zeitserver abgeglichen werden. Der Zeitabgleich bei einem Linuxclient erfolgt ähnlich wie bei unserem Server. Der einzige Unterschied liegt darin, dass wir das Skript (http://www.newbie-net.de/download/getnettime.sh) auf einen anderen Server, genauer auf unseren Server ansetzen. Um das sicherzustellen, öffnen wir das Skript mit einem Editor und ersetzen ZEITSERVER="time.fu-berlin.de" durch ZEITSERVER="192.168.1.99" oder welche IP dein lokaler Zeitserver hat. Dann können wir auch dieses Skript mit Cron automatisch starten lassen.

Windows als Client

Für Windowsclients müssen wir eine Software installieren. Es gibt einige kleine Programme dafür, ich stelle hier mal eines zum Download (download/nettime.zip) bereit. Alle Programme haben gemeinsam, dass wir unseren Server als Zeitserver eintragen müssen. Die meisten Programme erlauben auch einen automatischen Abgleich und tragen sich im Systemtray oder in der Autostartgruppe ein. Das Programm das ich hier zum Download biete, kann unter NT auch als Dienst installiert werden.

Sollte unser Server auch Sambadienste bieten, könnte man von den Windowsclients auch mit folgendem Befehl die aktuelle Zeit holen:

 net time \\SMB-SERVER /Workgroup:name /set /yes

Wobei SMB-SERVER der lokale Servername ist und Workgroup die Arbeitsgruppe auf dem Server angibt. Name ist der Benutzername. Ein typischer Aufruf könnte so aussehen:

 net time \\server1 /WG-Team:karsten /set /yes

Das könnte man in eine Batchdatei schreiben die über die Autostartgruppe ausgeführt wird. Dazu wird dann serverseitig natürlich kein inetd- oder xinetd-Zeitserver gebraucht.

Probleme

Manchmal kommt es vor, dass Dateien im System sind, die erst in der Zukunft erstellt wurden. Z.b. entpacke ich meine Kernelquellen um 12:00 Uhr. Jetzt führe ich eine Abfrage des Zeitservers durch, die neue Zeit ist 10:00 Uhr. Die gerade entpackten Kernelsourcen haben eine Zeitmarke die in der Zukunft liegt. Ein Kompilieren wird jetzt nicht gelingen, weil make keine Dateien bearbeitet die in der Zukunft erstellt werden.

Lösung: Entweder den Rechner für 2 Stunden ausmachen (wer will das schon) oder den Dateien eine neue Zeitmarke geben. Z.b. so:

 cd /usr/src/linux
 find . -type d -exec touch {} \;

Nachwort

Hier noch ein paar Quellen zum Nachlesen und Vertiefen des Themas.

Manpages:
man ntpdate
man hwclock
man date
man clock
man adjtime

Websites:
Nettime-Homepagehttp://nettime.sourceforge.net/

Kommentare, Wünsche und Anträge an tecneeq(at)tecneeq(dot)de.