Wer seinen Raspberry Pi ohne Internetanbindung betreibt, steht schnell vor dem Problem: Keine korrekte Uhrzeit – denn dem kleinen Mini-Computer fehlt eine eingebaute Echtzeituhr (RTC). Eine elegante Lösung ist ein GPS-Empfänger mit PPS-Signal. Damit lässt sich der Raspberry Pi auf Mikrosekunden genau synchronisieren – ganz ohne Internet.
In diesem Tutorial zeige ich euch, wie ihr mit einem GPS-Modul und chrony einen präzisen GPS-Zeitserver auf dem Raspberry Pi einrichtet. Chrony unterstützt PPS nativ und ist die moderne Empfehlung gegenüber dem klassischen NTP-Daemon – kein manuelles Kompilieren mehr nötig!
Hardware: GPS-Modul mit PPS-Signal
Für dieses Projekt braucht ihr ein GPS-Modul, das ein PPS-Signal (Pulse Per Second) ausgibt. Der PPS-Pin liefert genau einen Impuls pro Sekunde – präzise auf die GPS-Atomuhr synchronisiert.
Empfehlung: Verwendet ein NEO-M8N GPS-Modul – dieses hat einen dedizierten PPS-Ausgangspin und ist deutlich einfacher zu verkabeln als das ältere NEO-6M. Beim NEO-6M müsste das PPS-Signal nämlich direkt am Chip abgelötet werden (PIN3 des Moduls oder am Vorwiderstand) – das ist möglich, aber unnötig fehleranfällig.
Zusätzlich benötigt ihr:
- Raspberry Pi 4 oder 5
- Jumper-Kabel (Female-Female)
- Freie Sicht zum Himmel (für GPS-Empfang)
Die Einrichtung des GPS-Moduls selbst (gpsd, serielle Schnittstelle) ist in unserem GPS-Modul Tutorial beschrieben. Stellt sicher, dass gpsd läuft und NMEA-Daten geliefert werden, bevor ihr hier weitermacht.
PPS-Signal: Verkabelung
Das PPS-Signal wird an GPIO18 (PIN 12) des Raspberry Pi angeschlossen. Diese Belegung ist wichtig, da wir sie später in der Konfiguration referenzieren.
| GPS-Modul Pin | Raspberry Pi | PIN-Nummer |
|---|---|---|
| PPS | GPIO18 | PIN 12 |
| GND | GND | PIN 6 |
| TX | RXD (GPIO15) | PIN 10 |
| RX | TXD (GPIO14) | PIN 8 |
| VCC | 3.3V oder 5V | PIN 1 oder PIN 2 |
PPS aktivieren in /boot/firmware/config.txt
Auf aktuellen Raspberry Pi OS Versionen (Bookworm) liegt die Boot-Konfiguration unter /boot/firmware/config.txt – nicht mehr unter /boot/config.txt. Öffnet die Datei mit:
|
1 |
sudo nano /boot/firmware/config.txt |
Fügt am Ende der Datei folgende Zeile hinzu:
|
1 |
dtoverlay=pps-gpio,gpiopin=18 |
Speichert mit STRG+X, dann Y und ENTER. Das PPS-Kernel-Modul wird durch das Overlay automatisch geladen – ein manueller Eintrag in /etc/modules ist bei Bookworm nicht mehr nötig.
Dann macht einen Reboot:
|
1 |
sudo reboot |
Software installieren: pps-tools und chrony
Nach dem Neustart installieren wir die notwendigen Pakete:
|
1 2 |
sudo apt update sudo apt install -y pps-tools chrony |
Warum chrony statt ntp? Chrony unterstützt PPS-Quellen nativ und ist in Raspberry Pi OS Bookworm die Standard-Zeitdienst-Software. Mit dem klassischen ntpd müsstet ihr den Dienst manuell mit --enable-ATOM neu kompilieren – das ist aufwendig und unnötig.
PPS testen
Bevor wir chrony konfigurieren, testen wir ob das PPS-Signal korrekt ankommt. Ihr solltet nach dem Reboot – bei GPS-Empfang – jede Sekunde eine Ausgabe sehen:
|
1 |
sudo ppstest /dev/pps0 |
Eine erfolgreiche Ausgabe sieht so aus:
|
1 2 3 4 5 |
trying PPS source "/dev/pps0" found PPS source "/dev/pps0" ok, found 1 source(s), now start fetching data... source 0 - assert 1710000001.000000042, sequence: 1234 - clear 0.000000000, sequence: 0 source 0 - assert 1710000002.000000038, sequence: 1235 - clear 0.000000000, sequence: 0 |
Mit STRG+C beendet ihr den Test. Falls keine Ausgabe kommt, prüft die Verkabelung und den GPS-Empfang (freie Sicht zum Himmel erforderlich).
chrony konfigurieren
Jetzt konfigurieren wir chrony so, dass es sowohl die GPS-Zeitdaten via gpsd (SHM-Interface) als auch das präzise PPS-Signal nutzt. Öffnet die chrony-Konfigurationsdatei:
|
1 |
sudo nano /etc/chrony/chrony.conf |
Fügt folgende Zeilen hinzu (am Anfang der Datei, vor den bestehenden Server-Einträgen):
|
1 2 |
refclock SHM 0 refid GPS precision 1e-1 offset 0.9999 delay 0.2 refclock PPS /dev/pps0 refid PPS lock GPS |
Die erste Zeile bindet die GPS-Zeitdaten via gpsd ein (SHM = Shared Memory). Die zweite Zeile nutzt das präzise PPS-Signal und koppelt es an die GPS-Quelle (lock GPS). Das PPS-Signal allein kennt keine absolute Uhrzeit – es braucht die GPS-Daten als Anker.
Möchtet ihr den Pi als reinen Offline-Zeitserver betreiben, könnt ihr die bestehenden Internet-NTP-Server in der Konfiguration auskommentieren oder entfernen. Für einen Betrieb mit Internet-Fallback könnt ihr sie auch einfach stehen lassen.
Dann startet chrony neu:
|
1 |
sudo systemctl restart chrony |
Synchronisierung prüfen mit chronyc
Nach dem Neustart dauert es einige Minuten, bis chrony die Zeitquellen ausgewertet hat. Den Status prüft ihr mit:
|
1 |
chronyc sources |
Eine gute Ausgabe sieht ungefähr so aus:
|
1 2 3 4 |
MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== #* GPS 0 4 377 15 +120us[ +125us] +/- 200ms #+ PPS 0 4 377 15 +0ns[ +5ns] +/- 500ns |
Das * zeigt die aktuell verwendete Hauptquelle an, + kennzeichnet Quellen die als Backup genutzt werden. Wenn PPS als Quelle erscheint und der Offset im Nanosekundenbereich liegt, ist alles perfekt konfiguriert.
Mit folgendem Befehl seht ihr noch mehr Details:
|
1 |
chronyc tracking |
Zeitzone einstellen
Falls ihr die Zeitzone noch nicht konfiguriert habt, erledigt das mit timedatectl – deutlich komfortabler als das alte dpkg-reconfigure:
|
1 |
sudo timedatectl set-timezone Europe/Berlin |
Prüfen könnt ihr die aktuelle Einstellung mit:
|
1 |
timedatectl status |
Eine Liste aller verfügbaren Zeitzonen gibt es mit:
|
1 |
timedatectl list-timezones | grep Europe |
Fazit
Ihr habt jetzt einen GPS-basierten Zeitserver auf eurem Raspberry Pi – präzise, ohne Internet und ohne manuelles Kompilieren. Chrony macht die PPS-Unterstützung heute kinderleicht. Wer mehrere Pis im Heimnetz hat, kann diesen Pi als lokalen NTP-Server betreiben und alle anderen Geräte darauf zeigen lassen – einfach in der chrony.conf den entsprechenden allow-Eintrag setzen.
