Creare un Server NTP Stratum-1 con Raspberry Pi


Le basi

Partiamo dalle basi: Come fa il vostro elaboratore a sapere l'ora in questo preciso istante?
La risposta è NTP - Network Time Protocol. Un protocollo Client-Server che permette la sincronizzazione dell'ora degli elaboratori su una rete.
Il funzionamento in grandi linee è il seguente:

  1. I server NTP sono divisi in due macrocategorie:
    1. Primari, definiti Stratum-1. Sono collegati direttamente ad una precisa sorgente orario (Orologio Atomico, GNSS...)
    2. Secondari, definiti Stratum-[n] (n≥2). Questi si sincronizzano con un server Stratum-[k] (k≥1 , k=(n-1)) mediante TCP-IP.
  2. I client hanno a bordo un Software (definito Client NTP) che interroga il Server NTP definito localmente. Di seguito un esempio di Sistemi Operativi, relativo software e Server NTP predefinito.
    Sistema OperativoSoftwareServer Predefinito
    Microsoft Windowsw32timetime.windows.com
    Apple MacOS, iOS, iPadOS...sntptime.apple.com
    GNU/Linuxntpddipende dalla distro
  3. Quando il client interroga il server, un preciso calcolo matematico azzera (o meglio, tende ad azzerare il più possibile) il disturbo di tempo generato dalla latenza a causa della distanza fisica tra gli elaboratori. Provvede quindi ad aggiornare l'orario localmente.

Hardware

Utilizzeremo tre componenti principali per realizzare il nostro Server NTP:

L'antenna dovrà essere posizionata con una perfetta visione del cielo per garantire una corretta ricezione del segnale GPS, maggiori info nella sezione successiva.


Software

Eseguiremo sul nostro Raspberry Pi una versione di Raspbian basata su Debian 11 Bullseye (in particolare la release 2024.03.12) senza GUI.
Poichè il nostro interesse principale è eseguire il Raspberry senza uso di periferiche esterne (monitor, tastiera, mouse...), lo configureremo in modalità Headless.
Una volta scritta la immagine del Sistema Operativo sulla scheda microSD, monteremo la partizione di boot ed apriremo un terminale sulla directory radice.

Abiliteremo quindi l'accesso mediante ssh eseguendo:
touch ssh
Creeremo successivamente una nostra utenza mediante il comando
echo nostronomeutente:$(echo "nostrapassword" | openssl passwd -6 -stdin) >> userconf.txt
Dopo aver smontato le partizioni ed espulso la scheda microSD, assembleremo il nostro Raspberry Pi e lo collegheremo alla rete.
Dopo fatto accesso mediante ssh iniziamo a configurare il Sistema Operativo:
Dopo un riavvio vedremo il led verde sulla scheda GPS lampeggiare.
Configuriamo ora GPSD, il software che ci permetterà di leggere in modo umano i dati ricevuti dalla Scheda GPS. Dopo un riavvio (oppure restart del demone gpsd), lanciando cgps visualizzeremo i dati ricevuti dalla scheda GPS. Dopo qualche minuto dall'avvio leggeremo (finalmente!) Status: 3D FIX (n secs). Ciò significa che abbiamo correttamente agganciato un minimo di 4 satelliti (Il numero esatto è indicato in alto a destra).
Successivamente configureremo PPS (Pulse per-second) per ricevere un impulso al secondo assieme all'orario in formato Unix Time Stamp. Utilizzeremo PPS al posto dei dati forniti mediante porta seriale UART poichè quest'ultima genera troppa latenza e noi necessitiamo di precisione (!). Non smetterò mai di ripetere quanto sia vitale che l'antenna GPS non abbia ostacoli e abbia una visione PERFETTA del cielo. Se non riesce ad agganciare un minimo di 4 satelliti non riceveremo MAI un segnale PPS valido.
Configuriamo ora il Server vero e proprio, chrony.

Conclusioni

Per vedere se tutto è andato a buon fine sarà sufficiente collegarsi con il proprio elaboratore alla stessa rete del Raspberry Pi e:


Riferimenti

[1] - Datasheet Scheda Uputronics (Link 1) (Link 2)
[2] - Bug Kernel Linux Custom Raspberry Pi (Link)