The Clock Mini-HOWTO
 Ron Bean, [email protected]
 v, Dicembre 1996

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

 1.  Introduzione

 I 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:

 1. Non � menzionato nella maggior parte dei documenti su come
    impostare Linux, e sarebbe difficile (sebbene non impossibile in
    teoria, se hai un modem) regolare automaticamente tali impostazioni
    all'installazione.

 2. Se consulti ``man clock'' otterrai clock(3), che non � ci� che ti
    serve (prova ``man 8 clock'').


 3. La maggior parte della gente non sembra essere interessata a che
    ora sia.


 4. Quei pochi cui interessa spesso usano il pacchetto 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).


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

 2.  Usare il programma `` clock ''

 Tutto ci� che ti serve sapere � nella pagina del manuale clock(8), ma
 questo mini-HOWTO ti guider� lungo la procedura.


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

 2.1.  Verificare la correttezza dell'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 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).

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

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

 2.3.  Un esempio



 2.3.1.  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 ``ntp�
 date'' 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.

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

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


 3.  Alcune parole su xntpd

 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, [email protected]