Systemzeit im Netzwerk zur Verfügung stellen
Autor: Karsten Kruse
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.
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.
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.
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
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
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.
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.
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 {} \;
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.