Luca Morettoni

clockspeed

Che cos'è

clockspeed è un software sviluppato da Dan Bernstein come sostituto dei vari demoni ntp. La sua funzione è quella di mantenere costantemente aggiornato l'orologio di sistema del vostro computer, in modo da evitare i normali disallineamenti causati dalla poca precisione. Al contrario dei classici server ntp che contattano frequentemente i vari server di sincronizzazione presenti su Internet, clockspeed utilizza un algoritmo interno di compensazione, aggiustando ogni tre secondi il clock interno. Ovviamente anche clockspeed deve periodicamente contattare un server ntp esterno per verificare l'allineamento, tuttavia è sufficiente effettuare tale controllo anche solo una volta al mese.

Installazione

Scaricate i sorgenti, disponibili all'indirizzo http://cr.yp.to/clockspeed/clockspeed-0.62.tar.gz successivamente, come utente root:
# tar xvfz clockspeed-0.62.tar.gz
# cd clockspeed-0.62
# make
# make setup check
a questo punto clockspeed è stato installato in /usr/local/clockspeed, se preferite avere gli eseguibili installati in /usr/local/bin modificate il file conf-home inserendo /usr/local.
Se usate i sistemi *BSD basta installare il relativo port (per FreeBSD trovate il tutto in /usr/ports/sysutils/clockspeed) e seguire le eventuali istruzioni.
Fate attenzione, clockspeed lavora tenendo conto dei "leap seconds", quindi fate riferimento alla configurazione del vostro sistema operativo per attivare tale accorgimento, altrimenti vi troverete il clock di sistema disallineato di 22 secondi!!

Configurazione

Ora siamo pronti a configurare clockspeed, creeremo due servizi daemontools: il primo per eseguire clockspeed stesso, il secondo per allineare periodicamente il clock. Per il primo, il file run conterrà:
#!/bin/sh

NTP=IP_SERVER_NTP
BIN=/usr/local/clockspeed/bin

${BIN}/sntpclock ${NTP} | ${BIN}/clockadd
#${BIN}/taiclock ${NTP} | ${BIN}/clockadd

exec ${BIN}/clockspeed
Innanzi tutto occorre scegliere un server ntp da utilizzarsi, la lista è disponibile all'indirizzo http://www.eecis.udel.edu/~mills/ntp/clock2a.html, a questo punto inseriremo il suo indirizzo IP nello script (parametro NTP). Fate attenzione anche ai path, impostati con le variabili ROOT e BIN (rispettivamente dove si trova installato clockspeed e i suoi binari).
Se intendete utilizzare taiclockd (si veda più avanti) occorre commentare la riga sntpclock ... clockadd e togliere il commento dalla successiva (taiclock ... clockadd).

Non è necessario configurare il logger in quanto clockspeed non visualizza nessun messaggio.

Il secondo servizio, quello per inviare a clockspeed le informazioni di sincronizzazione è leggermente più complesso, infatti la frequenza con cui verrà contattato il server ntp esterno verrà raddoppiata ad ogni interrogazione, fino ad arrivare ad un valore massimo prefissato.

#!/bin/sh

MAX=7884000
SLEEP=300
NTP=IP_SERVER_NTP
ROOT=/usr/local/clockspeed
BIN=/usr/local/clockspeed/bin
TMP=/tmp

exec 2>&1

echo "starting..."

while true
do
  NEXT=`date +%s`
  NEXT=`expr ${NEXT} + ${SLEEP}`
  echo "next clock adjust in ${SLEEP} seconds (`date -r ${NEXT}`)"
  sleep ${SLEEP}

  ${BIN}/sntpclock ${NTP} > ${TMP}/clockadj-${SLEEP}

  if [ $? != 0 ]; then
    rm -f ${TMP}/clockadj-${SLEEP}
    SLEEP=300
    echo "can't read clock from ${NTP}, retry in ${SLEEP} seconds..."
    continue
  fi

  cat ${TMP}/clockadj-${SLEEP} | tee ${ROOT}/adjust | ${BIN}/clockview
  rm -f ${TMP}/clockadj-${SLEEP}

  SLEEP=`expr ${SLEEP} + ${SLEEP}`
  [ ${SLEEP} -gt ${MAX} ] && SLEEP=${MAX}
done

echo "exiting"
Lo script produrrà come output le informazioni sull'allineamento, ecco un breve esempio:
@4000000043fc719b259832ec starting...
@4000000043fc719b26fcd7b4 next clock adjust in 300 seconds (Wed Feb 22 15:18:15 CET 2006)
@4000000043fc72b812de585c before: 2006-02-22 15:18:00.316150000000000000
@4000000043fc72b81312a6fc after:  2006-02-22 15:18:00.322069622050389647
@4000000043fc72b815577a64 next clock adjust in 600 seconds (Wed Feb 22 15:28:00 CET 2006)
per archiviare questi log useremo un sottoservizio di logging con il seguente file di run:
#!/bin/sh

exec multilog t ./main
Potete ottenere i sorgenti dei servizi scaricando il pacchetto clockspeed-svc-0.4.tar.gz.

All'indirizzo http://morettoni.net/rrd-clockspeed/ troverete un grafico che mostra la precisione di clockspeed, se volete generare i grafici potere usare lo script clockspeed.sh che trovate nel pacchetto.

Sincronizzazione di reti

E' possibile sincronizzare tutti i computer all'interno della propria rete ricorrendo ad un unico server centrale di riferimento, grazie al demone taiclockd e al suo client taiclock. Il primo, taiclockd, verrà eseguito su di un server di riferimento, con uno script molto semplice (che trovate sempre nel pacchetto dei servizi visto prima):
#!/bin/sh

BIN=/usr/local/clockspeed/bin

exec ${BIN}/taiclockd
ovviamente su questa macchina server eseguite anche clockspeed e il servizio di aggiornamento per fare in modo che il clock sia aggiornato.

Sui client, oltre che l'immancabile clockspeed verrà utilizzato il seguente script di aggiornamento (noterete alcuni cambiamenti rispetto allo script precedente):

#!/bin/sh

MAX=7884000
SLEEP=300
NTP=IP_SERVER_TAICLOCKD
ROOT=/usr/local/clockspeed
BIN=/usr/local/clockspeed/bin

while true
do
  sleep ${SLEEP}
  ${BIN}/taiclock ${NTP} | tee ${ROOT}/adjust | ${BIN}/clockview

  SLEEP=`expr ${SLEEP} + ${SLEEP}`
  [ ${SLEEP} -gt ${MAX} ] && SLEEP=${MAX}
done
come noterete in questo script viene usato il client taiclock (al posto di sntpclock) e occorrerà impostare l'indirizzo IP del nostro server in cui abbiamo attivato taiclockd.
Anche qui è possibile memorizzare l'output dello script per poter controllare gli aggiustamenti del clock, lo script sarà simile al precedente (così come il suo output):
#!/bin/sh

exec multilog t ./main