rbean@execpc.comI chip RTC (NdT: Real-time-clock, orologio in tempo reale) usati sulle piastre madri dei PC (ed anche delle workstation più costose) sono notoriamente imprecisi. Linux fornisce un mezzo semplice per rimediare a questo via software, rendendo l'orologio potenzialmente *molto* preciso anche senza bisogno di sincronizzarlo continuamente a una fonte esterna. Ma la maggior parte delle persone non sembrano saperlo, per molte ragioni:
man clock'' 
otterrai clock(3), che non è ciò che ti serve (prova 
``man 8 clock'').
  xntpd da louie.udel.edu per 
sincronizzarsi ad una fonte esterna, come un network time server o un orologio 
radio.Questo mini-HOWTO descrive l'approccio low-tech. 
Se sei maggiormente interessato a questi argomenti, ti raccomando caldamente 
di spendere un po' di tempo su 
http://www.eecis.udel.edu/~ntp/, che comprende molte cose 
interessanti, incluse informazioni complete su xntpd e collegamenti a 
NIST and USNO (aggiungerò un paio di commenti su xntpd alla 
fine).
Se hai più di un sistema operativo sulla tua macchina, dovresti permettere ad uno solo di modificare l'orario dell'orologio CMOS, così che non si confondano l'un l'altro. Se usi regolarmente sia Linux che Windows sullo stesso computer, potresti provare uno dei programmi shareware di gestione dell'orologio interno che sono disponibili per windows (segui i collegamenti dall'URL qui sopra).
clock''  Tutto ciò che ti serve sapere è nella pagina del manuale 
clock(8), ma questo mini-HOWTO ti guiderà lungo la 
procedura.
Devi avere i privilegi di root per lanciare ``clock'', o qualsiasi altro programma che intervenga sull'orario di sistema o sull'orologio CMOS.
Cerca nei tuoi file di avvio del sistema un comando tipo ``clock -a'' o ``clock -ua''. A seconda di quale distribuzione stai usando, potrebbe essere in /etc/rc.local, o /etc/rc.d/rc.sysinit, o qualche luogo simile.
Se dice ``clock -s'' o ``clock -us'', cambia la ``s'' in una ``a'', e poi verifica se hai il file /etc/adjtime, che contiene una singola linea che sembra qualcosa del genere:
0.000000 842214901 0.000000
Questi numeri sono il fattore di correzione (in secondi al giorno), il momento in cui l'orologio è stato corretto per l'ultima volta (in secondi dal 1° Gennaio 1970) e il secondo parziale che è stato arrotondato quella volta. Se non hai quel file, fai un login come root e crealo, con una singola linea che appaia così (tutti zero):
0.0 0 0.0
Poi lancia ``clock -a'' o ``clock -ua'' manualmente dalla shell per aggiornare il secondo numero (usa ``u'' se il tuo orologio è regolato sul tempo universale invece che sul locale).
Per prima cosa, ti serve sapere che ora è :-).
Il tuo tempo locale 
può essere accurato o no. Il mio metodo preferito è chiamare il servizio 
telefonico allo (303)499-7111
(NdT: per l'Italia è il 161 e costa due 
scatti). Se hai accesso a un network time server, puoi usare il programma 
ntpdate dal pacchetto xntpd (usa l'opzione -b per 
prevenire che il kernel faccia confusione nell'orologio CMOS). Altrimenti usa 
``date -s hh:mm:ss'' per regolare manualmente l'orario del kernel, e 
poi ``clock -w'' per sincronizzare da esso l'orologio CMOS. Dovrai 
ricordarti quando hai regolato l'orologio per l'ultima volta, perciò annotati 
l'informazione da qualche parte. Se hai usato  ntpdate, dai 
``date +%s''
e annotati il numero dei secondi dal 1°
Gennaio 1970
Poi torna dopo un po' di tempo e controlla quanto ha 
deviato l'orologio. Se l'avevi regolato a mano, raccomando di aspettare almeno 
due settimane, e di limitarti a calcolare la deriva alla prima cifra decimale 
di secondo al giorno (alcuni pretendono maggiore accuratezza qui, ma io sono 
abbastanza conservatore). Se hai usato ntpdate non dovrai aspettare 
così tanto, ma in ogni caso potrai regolare con maggiore precisione più tardi.
Puoi fare eseguire a cron il comando ``clock -a'' a 
intervalli  regolari per tenere l'orologio di sistema sincronizzato con quello 
CMOS. Questo comando sarà anche eseguito dal tuo file d'avvio ogni 
volta che fai il boot, quindi se lo fai spesso (come molti di noi), questo 
dovrebbe essere sufficiente.
Nota che alcuni programmi potrebbero lamentarsi se l'orario salta di 
più di un secondo, o se viene spostato all'indietro. Se hai di questi 
problemi, puoi usare xntpd o ntpdate
per correggere 
l'orario con maggiore gradualità.
Fai il login come root. Componi il 161, e ascolta la comunicazione. Poi scrivi:
date -s hh:mm:ss
ntpdate'' qui, al posto di ``date'', e 
risparmiarti la telefonata). Questo regola il ``kernel time'' (orario
del kernel). Poi scrivi: 
clock -w
date +%j
date +%s'' se hai usato ``ntpdate''
al posto di ``date'', qui sopra) e annotati il dato fornito, per 
la prossima volta.
Ritrova la data che ti eri annotato l'ultima volta. Fai il login come root, e poi scrivi:
clock -a
date
date hh:mm:00
hh usa l'ora locale. 
Questo regola il ``kernel time''.
Poi digita:
clock -w
date +%j
date +%s'' se hai usato questo, più sopra)
Adesso hai tre numeri (due date e un orario) che ti permetteranno di calcolare la deriva.
Quando hai avviato ``date'' sul cambio di minuto, la tua macchina era 
in ritardo o in anticipo? 
Se era in anticipo, dovrai sottrarre alcuni secondi, quindi annotateli come un 
numero negativo. 
Se era in ritardo, fai il contrario.
Adesso sottrai le due date. 
Se hai usato ``date +%j'', 
il numero rappresenta il giorno dell'anno (1-365, o 1-366 in quelli bisestili). 
Se hai operato a cavallo del 1° Gennaio, aggiungi 365 (o 366) al secondo numero. 
Se hai usato ``date +%s'' allora il tuo numero è in 
secondi, e dovrai dividerlo per 86400 per avere i giorni.
Se hai già un fattore di correzione in /etc/adjtime, 
dovrai tenere conto dei secondi che saranno già stati corretti. Se hai 
corretto in eccesso, questo numero avrà segno opposto di quello che hai 
appena misurato; se hai corretto in difetto, avrà lo stesso segno. 
Moltiplica  il vecchio fattore di correzione per il numero di giorni, e 
aggiungi il nuovo numero di secondi (addizione con segno: se i due numeri 
hanno lo stesso  segno, otterrai un numero più grande, altrimenti 
più piccolo).
Poi dividi il numero totale di secondi per i 
giorni per ottenere il nuovo fattore di correzione, ed immettilo in 
/etc/adjtime al posto del  vecchio. Annotati la nuova data (in 
secondi o giorni) per la prossima volta.
Questo è come appare il mio /etc/adjtime:
-9.600000 845082716 -0.250655
Il tuo sistema ha effettivamente due orologi: il ``real time clock'' (orologio in tempo reale) alimentato a batteria, che tiene il tempo quando il sistema è spento (conosciuto anche come ``CMOS clock'', ``Hardware clock'', o ``RTC'') ed il ``kernel time'' (orologio del kernel, qualche volta chiamato ``software clock'' o ``system clock''), che è basato sul timer interrupt ed è inizializzato dall'orologio CMOS al momento dell'avvio del sistema. Questi deviano con tassi diversi, quindi divergeranno gradualmente l'uno dall'altro, e anche dal tempo reale.
Tutti i riferimenti all'``orologio'' (the clock) nella documentazione di 
xntpd si riferiscono a quello del kernel. Quando avvii 
xntpd o timed
(o qualsiasi altro programma che usi la 
chiamata di sistema adjtimex), il kernel di Linux assume che il 'suo' 
orologio sia più accurato di quello del CMOS, e reimposta quest'ultimo 
ogni 11 minuti da quel momento in poi (finché non si riavvia la 
macchina).
Questo significa che ``clock'' non sa più quando 
l'orologio CMOS è stato regolato l'ultima volta, quindi non può 
usare il fattore di correzione in /etc/adjtime.
Puoi usare 
ntpdate nel tuo file di avvio per regolare l'orologio da un 
timeserver prima di avviare xntpd.
Se non hai un accesso continuo a 
un'accurata fonte di orario quando avvii la macchina, questo può essere 
un po' problematico: xntpd non è propriamente progettato 
per  essere usato in tali situazioni.
xntpd include i driver per molti orologi radio, e può  
anche essere impostato per chiamare il servizio telefonico di NIST a 
intervalli regolari (assicurati di calcolare l'effetto sulla bolletta 
telefonica quando decidi l'intervallo tra le chiamate) (NdT: 
soprattutto se chiami dall'Italia!).
Può anche applicare un fattore di 
correzione all'orologio del kernel se questo perde contatto con le sue 
sorgenti esterne per un certo periodo di tempo.
La maggior parte degli orologi radio costano $3-4000,
ma puoi 
facilmente ottenere gli schemi di un poco costoso ``gadget box''
(effettivamente un modem a 300 baud) che stia tra il tuo computer e una 
qualunque radio ad onde corte regolata sul segnale orario della stazione del 
CHU in Canada (vedi 
ftp://ftp.udel.edu/pub/ntp/gadget.tar.Z).
L'Heathkit WWV receiver 
(l'``Orologio più accurato'')
è pure ancora disponibile (NdT: si parla 
del 1996), sebbene non sia un kit, e costa attorno ai $4-500.
I segnali 
GPS contengono inoltre informazioni sull'orario, e alcuni ricevitori GPS 
possono essere collegati alla porta seriale. Questa potrebbe diventare la 
soluzione più a basso costo nel futuro.
In teoria, qualcuno 
potrebbe usare il segnale orario telefonico della NIST per calcolare 
automaticamente la deriva dell'orologio CMOS e di quello del kernel. Non 
conosco nessun programma singolo che lo faccia, ma probabilmente la maggior 
parte del codice potrebbe essere presa a prestito da xntpd.
Tradotto da Germano Rizzo, 
germano@geocities.com