%--------------------------------------------------------------------
\chapter{Tenere il tempo} \label{chap:time}
%--------------------------------------------------------------------

        \begin{chapterquote}
	Time is an illusion.  Lunchtime double so. \\
	(Douglas Adams.) \\
        \end{chapterquote}

	\noindent
	Questo capitolo spiega come un sistema Linux gestisce le ore, e descrive i passi necessari per evitare problemi. Di solito non c'è bisogno di fare niente a questo proposito, ma è bene capire come funziona.


\section{I fusi orari}

	La misura del tempo è basata principalmente su fenomeni naturali, come l'alternanza di periodi di luce e buio causata dalla rotazione del pianeta. Il tempo totale impiegato da due periodi successivi è costante, ma la durata della luce e del buio varia. Una costante semplice è il mezzogiorno.

	Il mezzogiorno è l'ora in cui il Sole è al suo punto più alto. Dato che la Terra è tonda,\footnote{Secondo moderne ricerche.} il mezzogiorno accade in momenti diversi a seconda del luogo. Questo porta al concetto di \textbf{ora locale}. Gli umani misurano il tempo in diverse unità, la maggior parte delle quali sono legate a fenomeni naturali come il mezzogiorno. Finché rimanete nello stesso posto non vi importa che le ore locali siano diverse.

Nel momento in cui doveste comunicare con posti distanti vi accorgereste della necessità di avere un orario comune. Nei tempi moderni, la maggior parte delle parti del mondo comunicano tra di loro, quindi è stato definito uno standard globale per l'orario, che viene chiamato \textbf{ora universale} (UT o UTC, noto anche come Greenwich Mean Time, o GMT, dato che era l'ora locale di Greenwich, Inghilterra). Quando persone con orari diversi hanno bisogno di comunicare, possono esprimere l'orario come ora universale, in modo che non ci sia confusione sull'orario in cui le cose devono accadere.

	Ogni orario locale si chiama fuso orario. Mentre la geografia permetterebbe a tutti i luoghi che hanno il mezzogiorno allo stesso momento di avere lo stesso fuso orario, la politica lo rende difficile. Per varie ragioni, molti stati usano l'\textbf{ora legale}, cioè spostano gli orologi indietro durante l'inverno; altri non lo fanno. Quelli che lo fanno non si trovano d'accordo sul giorno in cui spostare gli orologi, e cambiano le regole di anno in anno, cosa che rende le conversioni decisamente non banali.

	I fusi orari vengono chiamati nel modo migliore con il nome del luogo, o indicando la differenza tra l'ora locale e quella universale. Negli Stati Uniti ed in altre nazioni i fusi orari locali hanno un nome ed un'abbreviazione di tre lettere; le abbreviazioni non sono univoche, comunque, e non dovrebbero essere usate a meno che non venga nominato anche lo stato. \`E meglio parlare di ora locale diciamo di Helsinki, invece che di ora dell'Est Europeo, dato che non tutte le nazioni dell'Europa dell'Est usano le stesse regole.
	
	Linux ha un pacchetto sui fusi orari che sa tutto sui fusi orari esistenti, e che può essere facilmente aggiornato quando le regole cambiano. Gli amministratori di sistema devono solo selezionare il fuso orario giusto. Inoltre ciascun utente può impostare il proprio fuso orario---è importante dato che molti lavorano su computer in nazioni diverse attraverso Internet. Quando cambiano le regole per l'ora legale nel vostro fuso orario, assicuratevi di aggiornare almeno quella parte del vostro sistema Linux. Oltre ad impostare il fuso orario del sistema e di aggiornare i file di dati dell'ora legale non ci si deve preoccupare molto dei fusi orari.

	
\section{Gli orologi hardware e software}

	I personal computer hanno un orologio hardware a batteria. La batteria assicura che l'orologio funzioni anche se il resto del computer resta senza elettricità. L'orologio hardware può essere impostato dalla schermata di impostazione del BIOS o da qualsiasi sistema operativo stia girando.

	Il kernel di Linux tiene traccia del tempo in maniera indipendente dall'orologio hardware. Durante il boot, Linux imposta il suo orologio allo stesso tempo di quello hardware; poi entrambi gli orologi girano indipendentemente. Linux mantiene un suo orologio perché guardare a quello hardware è lento e complicato.

	L'orologio del kernel mostra sempre l'ora universale. In questo modo, il kernel non ha bisogno di sapere niente dei fusi orari---la semplicità permette un'affidabilità più alta e rende più semplice aggiornare le informazioni sul fuso. Ciascun processo gestisce le conversioni sui fusi da solo (usando degli strumenti standard che fanno parte del pacchetto sui fusi orari).

	L'orologio hardware può essere impostato sia sull'ora locale che su quella universale. Di solito è meglio averlo in ora universale, perché in questo modo non dovete modificare l'orologio hardware quando inizia o finisce l'ora legale (l'UTC non ha il DST). Sfortunatamente, qualche sistema operativo per PC---incluso MS-DOS, Windows, OS/2---assumono che l'orologio hardware sia impostato all'ora locale, e quindi va modificato quando inizia e finisce il periodo di ora legale (altrimenti non mostrerebbe l'ora locale).

	
\section{Impostazione e lettura dell'ora}

	Nel sistema Debian, il fuso orario di sistema va determinato dal link simbolico \fn{/etc/localtime}, che è un collegamento al file di fuso orario che descriva il fuso orario locale. I file di fuso orario sono tenuti in \fn{/usr/lib/zoneinfo}. Altre distribuzioni Linux possono fare diversamente.

	Un utente deve modificare il suo fuso orario privato impostando la variabile d'ambiente TZ; se non è impostata viene considerato il fuso orario di sistema. La sintassi della variabile TZ viene descritta nella pagina man di \man{tzset}(3).

	Il comando \cmd{date} mostra la data e l'ora corrente.\footnote{Attenzione al comando \cmd{time}, che \emph{non} mostra l'ora corrente.} Ad esempio:

%
\begin{tscreen}
\verb|$| \textsl{date} \\
\verb|Sun Jul 14 21:53:41 EET DST 1996| \\
\verb|$|
\end{tscreen}
%
	\`E Domenica 14 Luglio 1996, circa le 10 meno 10 di sera, nel fuso orario ``EET DST'' (che può stare per East European Daylight Savings Time). \cmd{date} può anche mostrare l'ora universale:
%
\begin{tscreen}
\verb|$| \textsl{date -u} \\
\verb|Sun Jul 14 18:53:42 UTC 1996| \\
\verb|$|
\end{tscreen}
%
	\cmd{date} si usa anche per impostare l'orologio software del kernel:
%
\begin{tscreen}
\verb|#| \textsl{date 07142157} \\
\verb|Sun Jul 14 21:57:00 EET DST 1996| \\
\verb|#| \textsl{date} \\
\verb|Sun Jul 14 21:57:02 EET DST 1996| \\
\verb|#|
\end{tscreen}
%
	Consultate la pagina man di \cmd{date} per avere altri dettagli---la sintassi è un po' arcana. Solo \texttt{root} può impostare l'ora. Anche se ciascun utente può avere il proprio fuso orario, l'orologio è lo stesso per tutti.

	\cmd{date} mostra o imposta soltanto l'orologio software; il comando \cmd{clock} sincronizza gli orologi hardware e software. Viene usato all'avvio del sistema, per leggere l'orologio hardware ed impostare quello software. Se dovete impostare entrambi gli orologi, prima impostate quello software usando \cmd{date}, e poi quello hardware con \texttt{clock -w}.

	L'opzione \texttt{-u} di \cmd{clock} dice che il clock hardware è in ora universale. \emph{Dovete} usare correttamente l'opzione \texttt{-u}, altrimenti il vostro computer sarà piuttosto confuso.

	L'orologio deve essere modificato con cautela. Molte parti di un sistema UNIX richiedono il funzionamento corretto dell'orologio. Ad esempio, il daemon \cmd{cron} avvia dei comandi periodicamente; se modificate l'ora può confondersi e non sapere se deve avviare i comandi o no. Su un sistema UNIX di prima generazione, qualcuno ha impostato l'ora a venti anni nel futuro, e \cmd{cron} voleva avviare tutti i comandi periodici dei venti anni tutti insieme. Le versioni correnti di \cmd{cron} possono gestire eventualità del genere, ma dovreste comunque stare attenti. Grandi salti in avanti o all'indietro sono più pericolosi di piccoli spostamenti. 


\section{Quando l'orologio si sbaglia}

	L'orologio software di Linux non è sempre accurato; viene tenuto aggiornato da un \textbf{timer interrupt} generato dall'hardware del PC. Se il sistema ha troppi processi che girano contemporaneamente può volerci troppo a generare l'interrupt, e l'orologio software comincia ad andare indetro. L'orologio hardware gira indipendentemente e di solito è più accurato. Se fate spesso il boot del computer (come accade per la maggior parte dei sistemi che non fanno da server), di solito terrà bene il tempo.

	Se dovete rimettere l'orologio hardware, di solito è più facile riavviare, entrare nello schermo di impostazione del BIOS e farlo da lì; in questo modo si evitano tutti i problemi che possono insorgere modificando l'orologio di sistema. Se non potete farlo da BIOS, impostate l'orario nuovo con \cmd{date} e \cmd{clock} (in questo ordine), ma siate pronti a fare un reboot, se qualche parte del sistema comincia a fare strane cose. 

	Un computer in rete (anche se solo via modem) può controllare il suo orologio in automatico, paragonandolo a quello di qualche altro computer. Se l'altro computer tiene il suo orologio all'ora precisa, allora entrambi possono farlo. Si può fare usando i comandi \cmd{rdate} e \cmd{netdate}; entrambi controllano l'ora di un computer remoto (\cmd{netdate} ne può gestire più di uno), ed imposta il computer locale a quell'ora. Avviando regolarmente uno di questi comandi, il vostro computer terrà l'orario in modo accurato quanto quello del computer remoto.


	\meta dire qualcosa di intelligente su NTP







