English version: Click!
Ich mag keine Warnungen in Logdateien.
Auch wenn es keine realen Auswirkungen hat – ich glaub, es ist eine Art Zwangsstörung.
OCD auf English. Ich nenne es dann einfach IT-OCD.
Wenn ich etwas gelb oder rot sehe, will ich es in Ordnung bringen. Ich muss. Ich kann nicht anders.
Wisst ihr, was mir seit Ewigkeiten auf die Nerven geht? Fehlermeldungen auf Grund der Zeit, hauptsächlich auf DCs. Event-ID 129 und seine Freunde.
Es gibt viele Wege, das Problem relativ einfach zu beseitigen, aber meist nur temporär auf Grund des Timedrift.
Eine permanente Lösung wäre ein Netzwerk-Zeitserver, also eine Stratum 0 oder 1 Quelle.
Ich habe mich nach diesen schlüsselfertigen NTP Boxen umgeschaut und denke mir nur “Ihr wollt WIEVIEL dafür haben?”
Beim besten Willen, das ist keine Option für ein Homelab.
Also, was jetzt?
Da liegt ein Raspberry und sammelt Staub an.
Ich habe ein wenig nachgeforscht und fühlte mich vollkommen ermächtigt, mir selbst einen NTP Server zu basteln.
Aber ich war nicht auf den Alptraum vorbereitet.
Das wurde schnell zu einem ernsthaften Projekt, und es hat mich Wochen gekostet, daher hier das längere Posting.
Dabei sind die Basics so einfach: Du brauchst einen Raspberry Pi, eine GPS-Antenne, und ein bisschen Software. Schön. Auf geht’s!

Mein erster Versuch war pure Faulheit; ich habe eine all-in-one USB GPS-Antenne gekauft für 15 Euro, angestöpselt, und bin einem der Millionen Anleitungen im Internet gefolgt. Hat nicht funktioniert, andere Anleitung. Und noch einmal.
Okay, aufgegeben, es braucht mehr Nachforschung.
Und da fangen die Herausforderungen an. E gibt verschiedene Versionen vom Pi und von den Antennen, und manche Anleitungen sind hemmungslos veraltet, oder für ein komplett anderes Setup. Bei mir ist es ein Pi4, übrigens.
Irgendwo habe ich dann gelesen, dass PIs nicht mit RTCs kommen (real time clock, ihr kennt die Batterien auf Motherboards), weil die sonst zu teuer werden würden.
Also brauche ich einen GPS-Receiver mit RTC, der von einer Batterie gespeichert werden kann.
Das USB-Ding hat einfach nie funktioniert, mein Fehler. Mal wieder das Billigste gekauft.
Also, meine nächste Investition nennt sich “Ultimate GPS Hat” und es kommt tatsächlich mit einer RTC und Batteriespeicher, und einem Anschluss für eine externe Antenne.
Nun gut, also brauche ich auch noch eine externe Antenne.
Das nächste Thema war, dass ich in die verschiedensten Verbindungen von Antennen eintauchen musste, Dinge wie SMA, RP-SMA, U.FL und ähnliches, hauptsächlich, weil ich ständig die falschen Adapter gekauft habe.
Wenn jemand Ersatzteile braucht, lasst es mich wissen.
Irgendwann hatte ich dann die Hardware zusammen, aber es hat immer noch nicht funktioniert. Wie bitte?
Ich brauche einen “fix”
Nein, nicht was ihr denkt.
In diesem Kontext ist es der Link zum Satelliten, um die Zeit abzugreifen.
In einer der Anleitungen wurde vorgeschlagen, die Antenne möglichst nahe an einem Fenster anzubringen.
Zu dem Zeitpunkt war ich bereits so entnervt, ich habe das Ding einfach bei geöffnetem Fenster von außen betrieben.
Und guck mal, ich bekam meinen Fix.
Aber das ist natürlich keine permanente Lösung. Ich bin einmal von draußen um mein Apartment herumgelaufen und habe einen kleinen Ventilations-Schacht im Wohnzimmer entdeckt, den ich von innen noch nie bemerkt habe, weil der quasi im Fensterrahmen steckt.
Gut genug für mich, also schnell eine Antennen-Verlängerung bestellt. Natürlich wieder die falsche, aber der zweite Versuch hat dann wieder gepasst.
Ich habe das Ding dann einfach an die Außenwand geklebt. Sieht nicht schön aus, aber was soll’s!

Um das zu Ende zu bringen; ich habe einen perfekt funktionierenden Zeitserver bei mir, und hier sind die Schritte.
Zuerst den Raspberry vorbereiten.
Ich habe das “minimal-image” genutzt und für ein Deployment ohne Bildschirm die leere SSH Datei auf die SD-Karte kopiert.
Sobald der Pi läuft, kann im DHCP Server einfach die neueste IP suchen und dann via SSH verbinden.
Das erst Kommando sollte sein:
sudo raspi-config
Ich habe den Hostnamen verändert (Option S4), sowie die Zeitzone (L2), den GPU Speicher minimiert (P2) und das Dateisystem ausgeweitet (A1) wie üblich, aber hier brauchen wir noch einen zusätzlichen Schritt: Der serielle Port (P6) muss geändert werden, einfach ein “no” gefolgt von einem “yes” um sicher zu stellen, dass der GPS Hut exklusiven Zugriff bekommt.

Nun den Pi neustarten. Das kommt noch ein paar Mal…
Dann einige Lokalisierung-Einstellungen bearbeiten, um Stress mit manchen Paketen später zu vermeiden. Das habe ich auch auf dem felsigen Weg gelernt.
sudo nano /etc/default/locale
# File generated by update-locale
LANG=en_GB.UTF-8
LANGUAGE=en_GB:en
LC_ALL=en_GB.UTF-8
Jetzt ist ein guter Zeitpunkt, eine statische IP zu vergeben:
sudo nano /etc/dhcpcd.conf
interface eth0
static ip_address=10.0.20.9/24
static routers=10.0.20.1
static domain_name_servers=10.0.20.10 10.0.20.20
Aus Erfahrung weiß man, dass es nicht schadet auch die Such-Domäne anzupassen:
sudo nano /etc/systemd/resolved.conf
Domains=home.giese.cloud
Und schliesslich soll das Ding auf sich selbst als Zeitquelle zugreifen:
sudo nano /etc/systemd/timesyncd.conf
NTP=10.0.20.9
Zeit für einen weiteren Neustart. Nicht vergessen von nun an mit der neuen IP zu Verbinden.
Wenn ihr den Schritten bis hierher gefolgt seid, habt ihr gemerkt, dass Wi-Fi noch deaktiviert ist, und das ist gut, da wir es nicht brauchen.
Machen wir das gleiche doch auch mit BT:
sudo rfkill block bluetooth
Und Updates. Updates sind immer gut.
sudo apt-get update && sudo apt-get upgrade -y
sudo rpi-update
Neustart Nummer drei.
Wo wir gerade dabei sind, das Ding will man natürlich auch ins Überwachungssystem einhängen. Also schnell SNMP konfigurieren:
sudo apt install -y snmpd snmp
sudo rm /etc/snmp/snmpd.conf && sudo nano /etc/snmp/snmpd.conf
agentAddress udp:161,udp6:[::1]:161
view all included .1
rocommunity public default -V all
rocommunity6 publicdefault -V all
sysLocation Berlin
sysContact not@yourbusiness
Bisher wird alles mit dem Standardbenutzer erledigt, daher auch “sudo”. Wenn ihr root bevorzugt, braucht es noch diese Schritte:
sudo passwd root
Gebt euch ein Passwort und verändert das hier:
sudo nano /etc/ssh/sshd_confi g
#PermitRootLogin without-password —> PermitRootLogin yes
Erinnert ihr euch an die Zwangsstörung? Schnell noch aufräumen:
sudo apt autoremove -y
Raspberry Pi NTP Server
Kein einfacher Neustart dieses Mal – das Ding muss heruntergefahren werden.
Wir haben einen perfekt vorbereiteten Pi, nun muss der Hut angebracht werden – nicht vergessen zuerst die Batterie einzustecken – und die Antenne ranfummeln, dann wieder Starten.
GPS Client installieren:
sudo apt install gpsd gpsd-clients -y
Nun sollte irgendwas hier sehen zu sein:
cat /dev/serial0
Aber der Inhalt ergibt nicht viel Sinn, wir müssen erst den seriellen Datenverkehr umleiten:
sudo systemctl stop gpsd.socket && sudo systemctl disable gpsd.socket
sudo gpsd /dev/serial0 -F /var/run/gpsd.sock
Nun die precision-time Pakete installieren:
sudo apt install python-gps pps-tools -y
Eine Datei verändern:
sudo nano /boot/config.txt
#GPS time changes
enable_uart=1
#Disable Bluetooth for serial
dtoverlay=pi3-disable-bt
#Get 1PPS from HAT pin - your pin could be a different one
dtoverlay=pps-gpio,gpiopin=4
Dann guckt mal hier nach einem Eintrag der wie “console=serialXXXX” aussieht und einfach löschen:
sudo nano /boot/cmdline.txt
Sicherstellen, dass ein Eintrag wie DEVICES=”/dev/serial0″ hier liegt:
sudo nano /etc/default/gpsd
Schliesslich noch GPS beim Booten aktivieren:
sudo systemctl enable gpsd
Und Neustart Nummer…ach, keine Ahnung mehr.
Jetzt: Der Moment der Wahrheit.
Einmal den hier starten:
sudo gpsmon
Zuerst wird man viel ,,,,,, sehen zwischen den Zeilen, aber das wird weniger und weniger abhängig davon, wie schnell der Fix hergestellt ist. Mit der Antenne an der Aussenwand sind das nur wenige Minuten.
Ein anderer Weg zur Überprüfung ist der hier:
sudo cgps -s

Jetzt wisst ihr, wo ich wohne. Bringt Rotwein mit wenn ihr kommt – ich koch’ Pasta.
Zurück die Zeitquelle zu Testen:
sudo ppstest /dev/pps0
Nun haben wir eine lokale Zeitquelle, aber wir müssen die natürlich für andere bereitstellen.
Netzwerk-NTP, erinnert ihr euch?
sudo apt-get install chrony -y && sudo nano /etc/chrony/chrony.conf
In der Datei schaut an die default NTP pool servers.
Wir wollen die als Fallback so Nahe wie möglich zu uns haben. Hier gibt es eine Liste, klickt einfach auf Kontinent, Land, Stadt etc, um einen passenden Pool zu finden.
Wir setzen auch unsere eigene Uhr als Referenz und erlauben Zugriff vom Netzwerk.
Meine Datei sieht so aus:
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usuable directives.
pool de.pool.ntp.org iburst
refclock SHM 0 poll 3 refid GPS
refclock PPS /dev/pps0 refid PPS lock GPS
allow 10.0.0.0/8
# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys
# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift
# Uncomment the following line to turn logging on.
#log tracking measurements statistics
# Log files location.
logdir /var/log/chrony
# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0
# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync
# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3
Neustart. Ja, ich weiss.
Dann:
chronyc sources

Das Sternchen beweist, dass wir eine präzise Zeitquelle haben. Nanosekunden, yay!
Wir sehen ebenfalls die Variation zu, regulären GPS Signal und Eingien der öffentlichen NTP Server hier in Deutschland.
Die Zeit ist auf meiner Seite!
Eigentlich sind wir jetzt fertig, aber wir wollen die Zeit ja noch verteilen und verifizieren.
Für Netzwerkgeräte ist das üblicherweise irgendwo eine simple Einstellung, und man muss nur die IP Adresse eingeben.
Das gleiche gilt für’s vCenter und die ESXi. Mein vCenter hat sich etwas angestellt, aber dazu gibt es einen Artikel bei VMware.
In Linux, Debians hier als Beispiel, editieren wir eine Zeile hier:
nano /etc/systemd/timesyncd.conf
Uncomment NTP und fügt eure IP Adresse hinzu, dann einfach den Dienst neustarten und überprüfen:
systemctl restart systemd-timesyncd
systemctl status systemd-timesyncd

Okay, aber was nun mit Windows?
Der einfach Weg ist der hier:
w32tm /config /syncfromflags:manual /update /reliable:yes /manualpeerlist:”10.0.20.9”
Aber natürlich macht man das nicht auf jeder individuellen Maschine. Wozu gibt es Gruppenrichtlinien!
Leider erfordert das Setup mit mehreren DCs schon einige Schritte. Aber es gibt eine so gute Erklärung hier, da muss ich das nicht wiederholen.
Kurz gesagt, es benötigt zwei GPO und einen WMI Filter. Keine Raketenforschung, es dauert nur etwas die Schritte zu unternehmen der GPO Zeit zum replizieren zu geben.
Zum verifizieren kann man auf einem beliebigen Domänen-Mitglied das hier probieren:
w32tm /stripchart /computer:10.0.20.10 /dataonly /samples:5
Der Unterschied zwischen der lokalen Maschine und dem DC ist zu vernachlässigen und kommt hauptsächlich durch die Netzwerk-Latenz zustande. Damit kann ich leben!
Du liebe Güte, ich war so glücklich, als es endlich funktioniert hat und ich nun einen Raspberry Pi NTP Server habe.
Ich habe mir ein Glas vom wertvollen Midleton Very Rare eingegossen, den ich mir aus Irland mitgenommen habe.
Das habe ich mir verdient.
More homelab posts:
Google Domains DDclient Dynamic DNS OPNsense
Earlier I wrote about setting up an OPNsense firewall. As I’m using Google Domains, I…
OPNsense IPv6 Telekom Magenta
Ich weiß nicht, wie viele physische und virtuelle Firewalls ich in meinem Homelab in den…
SolarWinds Hybrid Cloud Observability First Steps, part two
Are you ready to continue our first steps in the SolarWinds Hybrid Cloud Observability platform? …
Mullvad Wireguard qBittorrent Docker
Change is a process, or so they say.That applies to a homelab.Two weeks ago, I…
SolarWinds Hybrid Cloud Observability First Steps, part one
I deployed SolarWinds Hybrid Cloud Observability (HCO), and now I have started to adjust it.I…
SolarWinds Hybrid Cloud Observability – Installation
This is a “death by screenshot” style tutorial about a SolarWinds Hybrid Cloud Observability installation.I’m…