The Clock Mini-HOWTO

Ron Bean, rbean@execpc.com

v2, Luglio 1999


Come regolare e mantenere preciso l'orologio del tuo computer.

1. Introduzione

I chip Real-Time-Clock (RTC, orologio in tempo reale) usati sulle schede madri dei PC (perfino delle workstation più costose) sono notoriamente inaccurati, visto che di solito guadagnano o perdono una quantità consistente di tempo ogni giorno. Linux fornisce un modo semplice per correggere questo problema via software, il che può rendere l'orologio *molto* preciso, anche senza una fonte d'orario esterna. Tuttavia, la maggior parte delle persone non sa come impostarlo, e questo per molte ragioni:

Questo mini-HOWTO descrive l'approccio low-tech (che può essere ugualmente molto accurato), e fornisce indicazioni a molte strade più sofisticate. Nella maggioranza dei casi la documentazione è stilata molto bene, quindi non ripeterò quelle informazioni qui, ma alla fine ho incluso istruzioni dettagliate per il vecchio programma clock(8) per chiunque stia ancora usando un vecchio sistema.

Nota

Devi essere utente "root" per avviare qualsiasi programma che interessi l'RTC o l'orario di sistema. Tienilo a mente quando utilizzi i programmi descritti qui.

Nota

Se usi più di un sistema operativo sul tuo PC, dovresti permettere ad uno solo di essi di regolare l'orologio CMOS, cosicchè non si confondano l'un l'altro. Questo include l'aggiustamento per l'ora legale operato due volte l'anno.

Se usi un sistema dual-boot che avvia Windows per molto tempo, potresti voler dare un'occhiata a qualche software disponibile per quell'OS. Segui i collegamenti dal sito web dell'NTP su http://www.eecis.udel.edu/~ntp/software.html. Molti degli orologi radio nominati qui includono software per Windows.

Nota

Per la traduzione italiana Germano Rizzo, manomano@ciaoweb.it

2. Modalità base per mantenere l'orario preciso sotto Linux

Un sistema Linux ha effettivamente due orologi: uno è il "Real Time Clock", alimentato a batteria (conosciuto anche come "RTC", "CMOS clock", o "Hardware clock") che scandisce il tempo quando il sistema è spento ma non è utilizzato quando è funzionante. L'altro è l'"orologio di sistema" (chiamato anche "orologio del kernel" o "orologio software") che è un contatore software basato sugli interrupt del timer. Non esiste quando il sistema non è in funzione, per cui deve essere inizializzato dall'RTC (o da qualche altra fonte) al boot. I riferimenti all'"orologio" nella documentazione di ntpd riguardano quello di sistema, non l'RTC.

I due orologi deviano dall'ora reale a ritmi differenti, perciò gradualmente i rispettivi orari differiranno sempre più tra loro, ed anche dal tempo "reale". Il modo più semplice per mantenerli precisi è di misurare i tassi di deviazione e applicare dei fattori di correzione nel software. Poichè l'RTC è usato solo quando il sistema non è attivo, il fattore di correzione è applicato quando l'orario è letto all'avvio, usando clock(8) o hwclock(8). L'orologio di sistema è corretto regolando la quantità di tempo di cui l'orologio di sistema è portato avanti ad ogni interrupt del timer, usando adjtimex(8).

Una rude alternativa ad adjtimex(8) è far avviare clock(8) o hwclock(8) a cron periodicamente per sincronizzare l'orario di sistema all'RTC (corretto). Questa strada è raccomandata nella pagina man clock(8) e funziona se lo si fa abbastanza spesso da non causare grossi "salti" nell'orario di sistema, ma adjtimex(8) è comunque una soluzione più elegante. Alcune applicazioni potrebbero lamentarsi se l'orario salta all'indietro.

Il prossimo passo verso l'accuratezza è utilizzare un programma come ntpd per leggere l'orario da un server di orario di rete o da un'orologio radio, ed aggiustare continuamente il passo dell'orologio di sistema cosicché i tempi corrispondano costantemente. Se hai una connessione ad una rete sempre attiva all'avvio del tuo sistema, puoi ignorare completamente l'RTC e usare ntpdate (incluso nel pacchetto ntpd) per inizializzare l'orologio di sistema dal server -- o un server locale su LAN, o un server remoto su Internet. Ma se qualche volta non hai una connessione di rete, o se ti serve che l'ora sia precisa durante la sequenza di avvio e prima della connessione alla rete, allora dovrai mantenere preciso anche l'RTC.

Potrebbe sembrare ovvio che in questo caso si debba sincronizzare l'RTC al (corretto) orologio di sistema. Ma questa risulta essere una cattiva idea se il sistema starà spento per più di pochi minuti, perché questa procedura interferirà coi programmi che applicano il fattore di correzione all'RTC all'avvio.

Se il sistema è attivo 24 ore su 24 e 7 giorni su 7 ed è sempre riavviato immediatamente dopo essere stato eventualmente spento, puoi semplicemente regolare l'RTC dall'orologio di sistema giusto prima di spegnere la macchina. L'RTC non devierà significativamente nel tempo che ci vuole per il riavvio, perciò non ti servirà conoscere il tasso di deviazione.

Naturalmente il sistema potrebbe bloccarsi imprevedibilmente, così alcune versioni del kernel sincronizzano l'RTC all'orologio di sistema ogni 11 minuti se quest'ultimo è stato riaggiustato da un altro programma. L'RTC non devierà abbastanza in 11 minuti da fare alcuna differenza, ma se il sistema è spento abbastanza a lungo da far deviare significativamente l'RTC, allora hai un problema: i programmi che applicano le correzioni dei tassi di deviazione hanno bisogno di sapere *esattamente* quando l'RTC è stato resettato l'ultima volta, ed il kernel non registra questa informazione da nessuna parte.

Alcuni "tradizionalisti" di unix potrebbero chiedersi perché qualcuno potrebbe lasciare attivo un sistema linux per meno di 24 ore al giorno e sette giorni alla settimana, ma alcuni di noi utilizzano un sistema dual-boot, con un altro OS in funzione per un certo tempo, o avviano Linux su portatili che devono essere spenti per preservare le batterie quando non sono utilizzati. Altre persone, semplicemente, non vogliono lasciare i PC attivi senza sorveglianza per lunghi periodi di tempo (anche se abbiamo sentito ogni sorta di argomentazioni in favore di questa linea). Perciò l'"ogni 11 minuti" diventa un bug.

Questa "caratteristica/bug" sembra comportarsi in maniera differente in diverse versioni del kernel (e probabilmente anche in diverse versioni di xntpd e ntpd), così se stai usando sia ntpd che hwclock, potrebbe essere necessario controllare cosa il tuo sistema realmente fa. Se non puoi trattenere il kernel dal resettare l'RTC, potresti dover far funzionare il sistema senza un fattore di correzione.

La parte del kernel che controlla questo può essere reperita in /usr/src/linux-2.0.34/arch/i386/kernel/time.c (dove il numero di versione nel percorso sarà la versione del kernel che si utilizza). Se la variabile time_status è impostata su TIME_OK allora il kernel scriverà l'orario di sistema sull'RTC ogni 11 minuti, altrimenti lo lascerà stare. Chiamate a adjtimex(2) (ad esempio effettuate da ntpd e timed) possono attivarlo. Chiamate a settimeofday(2) imposteranno time_status su TIME_UNSYNC, che dice al kernel di non riaggiustare l'RTC. Non ho trovato alcuna reale documentazione su questo.

Se non ti serve un'accuratezza a meno di un secondo, hwclock(8) e adjtimex(8) potrebbero essere tutto ciò che ti serve. È facile essere presi dagli orologi radio e simili, ma io ho usato il programma clock(8) per anni con eccellenti risultati. D'altro canto, se hai molte macchine su una LAN potrebbe risultare comodo far loro sincronizzare gli orologi automaticamente l'una con l'altra.

3. Software

3.1 Clock(8) e Hwclock(8)

Tutte le distribuzioni linux installano o il vecchio clock(8) o il più recente hwclock(8), ma senza un fattore di correzione. Alcune potrebbero anche installare adjtimex(8), o includerlo nel CD come optional (o puoi comunque scaricarlo dai soliti archivi). Alcune distribuzioni includono anche un programma grafico di regolazione dell'orologio che funziona in X-window, ma questi programmi sono concepiti per un uso interattivo, ed il sistema installerà comunque clock(8) o hwclock(8) per l'uso negli script di avvio.

Clock(8) ti richiede di calcolare il fattore di correzione a mano, mentre hwclock(8) lo calcola automaticamente quandunque lo usi per resettare l'orologio (usare un altro programma per impostare l'orario interferirà con la correzione della deriva, perciò usa sempre lo stesso programma se stai utilizzando il fattore di correzione. Se hai un sistema più datato che usa ancora clock(8) e vuoi aggiornarlo, puoi trovare hwclock(8) nel pacchetto "util-linux", versione 2.7 o successiva. Consulta la pagina man per maggiori informazioni.

Nota

La pagina man di hwclock(8) può esser chiamata "clock" per compatibilità all'indietro, perciò prova entrambi i nomi. Hwclock(8) risponderà ai comandi scritti per clock(8), ma il risultato potrebbe non essere lo stesso -- in particolare, "hwclock -a" non è proprio identico a "clock -a", perciò se stai aggiornando a hwclock ti suggerirei di sostituire tutti i riferimenti a "clock" nei tuoi script di avvio in modo che usino i comandi propri di hwclock.

Gli script di avvio variano da una distribuzione all'altra, perciò potrai dover cercare un po' per trovare dove impostano l'orologio. Locazioni tipiche sono /etc/rc.local, /etc/rc.d/rc.sysinit, /etc/rc.d/boot, o simili. Il fattore di correzione per l'RTC è archiviato in /etc/adjtime.

Quando stai regolando l'orologio per determinare il tasso di deviazione, tieni a mente che il tuo annuncio telefonico dell'orario locale può essere accurato o meno. Se non hai una radio ad onde corte o un ricevitore GPS, puoi ascoltare il segnale audio della WWV chiamando lo (01)(303)499-7111 (è una chiamata a pagamento a Boulder, Colorado). Il servizio ti sconnetterà dopo tre minuti, ma dovrebbe essere abbastanza per regolare l'orologio. Anche l'USNO e il CHU del Canada hanno servizi telefonici, ma io preferisco quello del WWV perché passa più tempo tra l'annuncio ed il "beep".

Se ottieni risultati bizzarri dall'uso dell'RTC potresti avere un problema hardware. Alcuni chip RTC comprendono una batteria al litio che può scaricarsi, e alcune schede madri hanno la possibilità di collegare una batteria esterna (assicurati che i ponticelli siano impostati correttamente). La stessa batteria mantiene la RAM CMOS, ma l'orologio consuma più potenza ed è probabile che ceda prima. Risultati bizzarri dall'orologio di sistema possono significare anche che c'è un problema con gli interrupt.

3.2 Adjtimex(8)

Adjtimex(8) permette all'utente di regolare le variabili dell'orario del kernel, e perciò cambiare la velocità dell'orologio di sistema (devi avere l'accesso come "root" al sistema per farlo). È progettato in modo intelligente affinché compari l'orologio di sistema all'RTC usando lo stesso fattore di correzione utilizzato da clock(8) o hwclock(8), come archiviato in /etc/adjtime. Perciò, una volta che hai stabilito il tasso di deriva dell'RTC, è abbastanza semplice correggere anche l'orologio di sistema. Quando otterrai che funzioni alla giusta velocità, potrai aggiungere una linea agli script d'avvio per regolare le variabili corrette del kernel al momento dell'avvio. Poiché adjtimex(8) è stato progettato per lavorare con clock(8) o hwclock(8), include una soluzione per il bug dell'"ogni 11 minuti".

Dopo che hai installato adjtimex(8) puoi aver maggiori informazioni su come regolarlo digitando "man 8 adjtimex" (c'è anche una pagina man adjtimex(2), ma non è ciò che serve) e leggendo il file README reperibile a /usr/doc/adjtimex-1.3/README (dove il numero di versione nel percorso sarà la versione corrente di adjtimex(8)).

3.3 Xntpd e ntpd: il Network Time Protocol

Xntpd (NTPv3) è stato sostituito da ntpd (NTPv4); la versione più vecchia non viene più aggiornata.

Ntpd è il programma standard per sicronizzare orologi in una rete, ed è corredato di una lista di server di orario pubblici a cui puoi connetterti. Può essere un po' più complicato da configurare degli altri programmi descritti qui, ma se sei interessato a questo tipo di cose, ti raccomando vivamente di dargli un'occhiata comunque. La "casa base" per le informazioni su ntpd è il sito web dell'NTP a http://www.eecis.udel.edu/~ntp/ che include pure collegamenti a tutti gli altri generi di cose riguardanti il tempo (compreso software per altri OS). Alcune distribuzioni Linux includono ntpd nei CD.

Una caratteristica relativamente nuova in ntpd è il "burst mode", progettato per macchine che hanno solo un accesso intermittente ad Internet.

Ntpd include driver per abbastanza pochi orologi radio (e pare che alcuni siano meglio supportati di altri). La maggior parte degli apparecchi di questo tipo sono progettati per l'utilizzo commerciale e costano migliaia di dollari, ma ci sono alcune alternative più economiche (esaminate in successive sezioni). Nel passato erano ricevitori WWV o WWVB, ma ora la maggior parte sembra essere di tipo GPS. NIST mantiene un file PDF sul proprio server che elenca i fabbricanti di orologi radio, a http://www.boulder.nist.gov/timefreq/links.htm (vicino alla fine della pagina). Anche il sito web di NTP include molti collegamenti ai produttori, a http://www.eecis.udel.edu/~ntp/hardware.htm e http://www.eecis.udel.edu/~mills/ntp/refclock.htm. Ogni lista può essere aggiornata, come non esserlo :-). La lista dei driver per ntpd è a http://www.eecis.udel.edu/~ntp/ntp_spool/html/refclock.htm.

Ntpd include anche driver per molti servizi di orario telefonici. Sono tutte chiamate a lunga distanza, perciò assicurati di calcolarne l'effetto sulla tua bolletta prima di usarli!

3.4 Chrony

Xntpd è stato scritto originariamente per sistemi provvisti di una connessione a tempo pieno ad un server d'orario di rete o a un orologio radio. In teoria può essere anche usato con macchine che sono connesse solo a tratti, ma Richard Curnow non è mai riuscito a farlo funzionare come voleva... perciò ha scritto "chrony", perché fosse un'alternativa per quelli di noi che hanno accesso in rete solo quando sono collegati ad un provider (il "burst mode" di ntpd è stato progettato appunto per risolvere questo stesso problema). La versione corrente di chrony comprende la correzione della deriva per l'RTC, per macchine che sono spente per un lungo periodo di tempo.

Puoi avere maggiori informazioni dal sito web di Richard Curnow a http://www.rrbcurnow.freenet.co.uk/chrony/index.html. Il programma è distribuito solo come sorgente, ma la Debian ha incluso una distribuzione binaria nel suo archivio "non stabile". Il file sorgente è disponibile anche negli archivi linux usuali.

4. Orologi radio

4.1 CHU ed il "Gadget Box"

CHU, l'emittente d'orario ad onde corte situato presso Ottawa, è simile al WWV negli USA, ma con un'importante differenza: in aggiunta ad annunciare l'ora sia in inglese che in francese, trasmette pure l'orario corrente una volta al minuto usando i vecchi toni da modem "Bell 103" (300 baud). Questi toni sono molto facili da decodificare, e Bill Rossi si è reso conto che non ti serve neppure un modem: tutto ciò che serve è una radio ad onde corte ed una scheda audio. Se puoi ricevere il segnale dal CHU, questo potrebbe risultare il più economico orologio radio disponibile. La ricezione a onde corte varia nell'arco della giornata, ma Bill afferma che cambiando le frequenze due volte al giorno (mattino e sera) ottiene una copertura per quasi tutte le 24 ore. CHU trasmette su 3.33, 7.335 e 14.670 MHz.

Per maggiori informazioni vedi il sito web di Bill Rossi a http://www.rossi.com/chu/. Il file sorgente è disponibile anche presso gli archivi Linux abituali. Per informazioni sui servizi d'orario della CHU vedi http://www.nrc.ca/inms/time/ctse.html.

Il sito web di NTP ha un progetto di un "gadget box" che decodifica il segnale orario CHU usando un economico chip di un modem da 300 baud e una qualsiasi radio ad onde corte, a http://www.eecis.udel.edu/~ntp/ntp_spool/html/gadget.htm. I piani includono un'immagine Postscript di un circuito stampato, a due faccie, ma devi realizzartela da solo (o trovare qualcuno che lo faccia per te).

Ntpd include un driver (type 7) per i ricevitori CHU, che funziona sia con modem come il "gadget box", sia immettendo il sonoro direttamente nella presa del microfono di una SPARCstation Sun (o qualsiasi altra macchina con "driver audio compatibili").

4.2 WWV e l'"orologio più accurato"

Puoi aver sentito parlare del "Most Accurate Clock" (l'"orologio più accurato", appunto), della Heatkit, che riceveva e decodificava il segnale orario della WWV e aveva una porta seriale opzionale per essere connesso ad un computer. La Heatkit cessò di vendere questi kit molto tempo fa, ma continuarono a vendere la versione costruita in fabbrica fino al 1995, quando anche questa linea fu interrotta. Per i nostalgici dell'Heatkit (ma senza l'orologio), si veda http://www.heathkit-museum.com. La compagnia esiste ancora, e vende materiale educativo. Vedi http://www.heathkit.com.

Secondo Dave Mills, il brevetto della Heatkit sull'"orologio più accurato" dovrebbe scadere presto, perciò forse qualcuno lì fuori potrebbe voler replicarlo su un IC a chip unico.

Il sito web dell'NTP ha un programma DSP (e un file PDF che lo descrive) disponibile a http://www.eecis.udel.edu/~mills/resource.htm che decodifica il segnale orario del WWV utilizzando una radio ad onde corte e il TAPR/AMSAT DSP-93, un kit DSP che non è più disponibile. Era basato sul chip TMS320C25 DSP chip della Texas Instruments. Il sito web del TAPR a http://www.tapr.org contiene molte informazioni sulla programmazione DSP casalinga.

Ntpd include un driver (type 6) per i codici d'orario IRIG-B e IRIG-E, che utilizza il /dev/audio di Sun SPARCstation, ma una nota dice che è "probabilmente portabile su altri sistemi". Il WWV usa il codice IRIG-H.

Il WWV è gestito dal NIST, che ha un sito web a http://www.boulder.nist.gov/timefreq/index.html. Questo sito comprende il testo della "Special Publication 432", che descrive i loro servizi di orario e frequenze, a http://www.boulder.nist.gov/timefreq/pubs/sp432/sp432.htm. Il WWV trasmette sui 2.5, 5, 10, 15, e 20 Mhz.

4.3 GPS e l'"orologio totalmente accurato"

Il segnale GPS include l'orario preciso, e alcuni ricevitori GPS hanno porte seriali. Ntpd comprende driver per molti ricevitori GPS. La caratteristica 1PPS ("One Pulse Per Second", una pulsazione per secondo, richiesta per un'elevata accuratezza) di solito richiede un'interfaccia separata per connetterli al computer.

TAPR ("Tuscon Amateur Packet Radio") fabbrica un kit per un'interfaccia chiamata "TAC-2" (sta per "Totally Accurate Clock", orologio totalmente accurato) che si collega a una porta seriale e funziona con qualsiasi ricevitore GPS che possa fornire un uscita 1PPS-- compresi alcuni modelli "bare board" ("solo scheda"), che possono esser montati direttamente alla scheda dei circuiti. Per maggiori informazioni, vedi il loro sito a http://www.tapr.org. Il prezzo (a Giugno 1999) è attorno ai 140$, escluso il ricevitore GPS. Il kit non comprende alcun dispositivo di montaggio.

Il "gadget box" del CHU (descritto in un'altra sezione) può essere anche usato come interfaccia per il segnale 1PPS. Il sito dell'NTP contiene una discussione di questo argomento a http://www.eecis.udel.edu/~ntp/ntp_spool/html/pps.htm.

4.4 Segnali orari a bassa frequenza: DCF77, MSF(Rugby), WWVB

Queste stazioni a bassa frequenza trasmettono un codice orario semplicemente accendendo o spegnendo la linea portante. Ogni stazione usa il proprio schema di codifica, le cui specifiche sono disponibili sul sito dell'NTP a http://www.eecis.udel.edu/~mills/ntp/index.htm (vicino alla fine della pagina). DCF77 in Germania trasmette sui 77.5kHz. MSF in Inghilterra (chiamata anche "Rugby", che si riferisce apparentemente alla sua locazione) e WWVB in Colorado trasmettono entrambe sui 60 kHz.

Sembra che in Europa siano disponibili ricevitori economici che si possono collegare a una porta seriale. L'Ntpd include driver per un paio di ricevitori MSF.

Parecchie compagnie negli USA vendono orologi relativamente economici (compresi molti orologi analogici da parete) che hanno dei ricevitori WWVB incorporati, ma sono al corrente solamente di due che possano esser collegati ad un computer:

L'Ultralink Model 320, venduto per circa 120$ (a Giugno 1999), ha un'interfaccia seriale e un semplice set di comandi ASCII, perciò non dovrebbe essere troppo difficile da programmare. Trae 1mA dalla porta seriale per l'alimentazione. L'antenna può essere distante fino a 30 metri dal computer, e l'unità contiene un suo orologio per tenere il tempo se perde il segnale. Vendono anche una versione "bare board" version per circa 80$ che è progettata per funzionare coi microcontroller delle serie "BASIC Stamp". Vedi http://www.ulio.com/timepr.html.

L'Arcron Technology vende un orologio da tavolo per circa 130$, comprendente del software per Windows. Vedi http://www.arctime.com

La ricezione del WWVB varia, ma ci sono progetti di incrementare il suo potere trasmittente, in alcune fasi. Puoi seguire lo stato del processo sul sito del NIST, a http://www.boulder.nist.gov/timefreq/wwvstatus.html.

5. Istruzioni dettagliate per clock(8)

Questa sezione è derivata dalla versione precedente di questo mini-HOWTO, ed è riportata per chi usasse ancora il vecchio programma clock(8). Tutto ciò che ti serve sapere è nella pagina man, ma la seguente discussione ti guiderà nei vari passi del processo.

Nota

Devi avere i privilegi di root per lanciare "clock", o qualsiasi altro programma che intervenga sull'orario di sistema o sull'orologio CMOS.

5.1 Verificare l'installazione

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 simile a:

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).

5.2 Misurare la deriva dell'orologio

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

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à.

5.3 Un esempio

Regolare l'orario

Fai il login come root. Componi il 161, e ascolta la comunicazione. Poi scrivi:

date -s hh:mm:ss
ma non premere Invio finchè non scatta il minuto (puoi usare "ntpdate" qui, al posto di "date", e risparmiarti la telefonata). Questo regola il "kernel time" (orario del kernel). Poi scrivi:
clock -w
Questo regola l'orologio CMOS in modo che si sincronizzi all'orario del kernel. Poi scrivi:
date +%j
(o "date +%s" se hai usato "ntpdate" al posto di "date", qui sopra) e annotati il dato fornito, per la prossima volta.

Reimpostare l'orario e controllare la deriva

Ritrova la data che ti eri annotato l'ultima volta. Fai il login come root, e poi scrivi:

clock -a
Questo regola l'orario del kernel per sincronizzarlo a quello CMOS. Componi il 161 e ascolta l'annuncio; poi scrivi:
date
e premi Invio quando scatta il minuto, ma mentre aspetti scriviti l'orario annunciato, e non riappendere ancora. Questo ti dice che ora la macchina pensava fosse, quando avrebbe dovuto scattare precisamente il minuto. Adesso scrivi:
date hh:mm:00
usando il minuto *dopo* quello che è appena stato annunciato, e premi Invio quando senti di nuovo che il minuto scatta (adesso puoi riappendere). Per hh usa l'ora locale. Questo regola il "kernel time". Poi digita:
clock -w
che scrive il nuovo (e corretto) orario nell'orologio CMOS. Adesso immetti:
date +%j
(o "date +%s" se hai usato questo, più sopra)

Adesso hai tre numeri (due date e un orario) che ti permetteranno di calcolare la deriva.

Calcolare il fattore di correzione

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
(nota che 9.6 secondi al giorno sono quasi 5 minuti al mese!)