Att bygga en Stratum-1 NTP-server, del 2

Hmm, jag lovade ju en del 2 av mitt NTP Stratum 1 serverbygge …

Del 1 avslutades med att jag hade full kommunikation mellan Raspberry Pi 5:an och GPS-hatten från Waveshare, med sitt L76K-chip, allt såg bara fint ut. Nu handlar det mer om att kunna använda GPS-klockan, det vi kallar för Stratum 0, och förmedla den i form av en Stratum 1 via NTP, Network Time Protocol. Till det behövde vi först få PPS, Pulse Per Second, att trigga en mjukvara i Pi 5:an. Som mjukvara valde jag dels ppstest för att kunna kontrollera den inkommande pulsen och dels Chrony för att förmedla tiden via NTP. Men allra först gällde det att få PPS-pulsen till ett lämpligt stift på Pi5:ans 40-pins kontakt.

Sagt och gjort, kabel med hylsstift kom med posten, ut i garaget och fram med stora lödkolven 😉
Nja, kanske inte jättestora och kanske en lödpenna med lagom liten lödspets men sedan gick det bra, anslöt kabeln till pin 21, eller GPIO9 som den också heter.

Installerade sedan följande.

sudo apt install gpsd gpsd-clients pps-tools python3-pip chrony

Adderade följande i /booy/firmware/config.txt

dtparam=uart0=on
dtoverlay=pps-gpio,gpiopin=9
dtoverlay=disable-wifi

Editerade sedan /etc/modules och adderade

#/etc/modules: kernel modules to load at boot time.
pps-gpio
i2c-dev

Sedan editerade jag /etc/default/gpsd

# Devices gpsd should collect to at boot time.
DEVICES="/dev/ttyAMA0 /dev/pps0"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-n"

# Automatically hot add/remove USB GPS devices via gpsdctl
USBAUTO="true"

Startade sedan om Pi 5:an, körde efter omstart följande.

sudo ppstest /dev/pps0

sudo ppstest /dev/pps0
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1766061999.000001916, sequence: 19282 - clear  0.000000000, sequence: 0
source 0 - assert 1766061999.999999881, sequence: 19283 - clear  0.000000000, sequence: 0
source 0 - assert 1766062001.000000291, sequence: 19284 - clear  0.000000000, sequence: 0
source 0 - assert 1766062002.000000012, sequence: 19285 - clear  0.000000000, sequence: 0
source 0 - assert 1766062003.000000103, sequence: 19286 - clear  0.000000000, sequence: 0
source 0 - assert 1766062003.999999268, sequence: 19287 - clear  0.000000000, sequence: 0
source 0 - assert 1766062004.999999895, sequence: 19288 - clear  0.000000000, sequence: 0
^C

Att ovan fungerar är en förutsättning för att kunna förmedla tiden med hög noggrannhet, att kunna förmedla PPS-tiden kände jag var en förutsättning för att fullgott projekt 🙂
Nu får jag allt att låta som om jag fick fram allt detta på 5 minuter, att jag satt från 19-tiden fram till midnatt en kväll, det är ju inte det jag framhåller här, löste faktiskt inte problemet med att få PPS-pulsen till rätt stift förrän dagen efter vid 6.30 på morgonen …

När PPS syns via ppstest, ja då var det dags för Chrony.

/etc/chrony/chrony.conf redigerades, det mesta kommenterade jag bort men följande angav jag.

confdir /etc/chrony/conf.d
server time.apple.com iburst
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
maxupdateskew 100.0
rtcsync
makestep 1 3
leapsectz right/UTC

refclock SOCK /run/chrony.ttyAMA0.sock refid GPS precision 1e-3 noselect
refclock SOCK /run/chrony.pps0.sock refid PPS precision 1e-7 lock GPS
allow 0.0.0.0/0
ptpport 319
hwtimestamp *

local stratum 10

På så sätt använder jag enbart PPS (Stratum 1) vilket ger högre noggrannhet än GPS, sedan används time.apple.com i andra hand (Stratum 2) och om den också försvinner använder jag Pi 5:ans inbyggda klocka, men då som Stratum 10.

Eftersom jag var helt inne på att låta ”hela Internet” komma åt NTP-servern tillåter jag 0.0.0.0/0, annars anger du här de IP-adresser eller nät som är relevanta för dig.

För att verifiera funktionen, i verbose-läge.

chronyc sources -v

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
#? GPS                           0   4   377     9   +225ns[ +923ns] +/- 1000us
#* PPS                           0   4   377     9   +225ns[ +923ns] +/-  117ns
^- sesto4-ntp-001.aaplimg.c>     1   9   307   215    -90us[  -93us] +/- 5402us

Sedan var det bara att släppa på trafiken mot servern, eller rättare sagt flytta servern till ett eget DMZ, lägga upp extern DNS ”ntp-1.nordh.tech” mot min ena publika IP, NAT:a in trafiken, tillåta IP port 123 och så vidare, och så vidare …

Nu fungerar NTP-servern precis som den skall, jag har lärt mig jättemycket längs vägen, inte minst att den 40-poliga GPIO-kontakten är ett mysteriom när man inte får den att fungera som man vill … 😉

//Anders

<< Del 1

Nordh Tech
Privacy Overview

GDPR och kakor (cookies)

Den 25 maj 2018 började dataskyddsförordningen (GDPR) att gälla i Sverige och övriga EU.

Det innebär bland annat att inget företag eller organisation får spara personuppgifter som inte behövs för att leverera det du bett om och att du har rätt att ”bli glömd” så snart du ber om det.

För din kontakt med Nordh.Tech innebär det inte så mycket.

Vi sparar en kaka (cookie) vilket innebär en liten textfil med information om vad du gjort när du surfar hos oss, vi gör det för att kunna få statistik rörande vad du gjort när du besöker oss och för att vi skall kunna ge dig nytt innehåll och inte till exempel behöva fråga dig var gång du besöker oss om du godkänner våra GDPR-villkor eller att det sparas en ”kaka” på din dator.

Vi sparar också din epostadress för att kunna skicka dig vårt nyhetsbrev eller hantera din inloggning i vårt forum, om du bett om det vill säga. Då du prenumererar på nyhetsbrevet eller begär inloggning till vårt forum anger du också ditt förnamn eller inloggningsnamn men här kan du ange vilket namn som helst. Vissa anger även efternamn men dessa raderas så att endast förnamnet kommer att användas i hälsningsfrasen i varje nyhetsbrev.

Hoppas detta gör att du kan känna dig trygg med ditt besök hos mig här på Internet.