%--------------------------------------------------------------------
%%\chapter{Keeping Time} \label{chap:time}
\chapter{Manutenção de Data/Hora} \label{chap:time}
%--------------------------------------------------------------------

        \begin{chapterquote}
%%	Time is an illusion.  Lunchtime double so. \\
%%	(Douglas Adams.) \\
	Terra,    \\
	Vagabundeando, matas o tempo,  \\
	Bailarina láctea, ébria,  \\
	Giras com teus minúsculos hóspedes,  \\
	Debruçados em tuas costas\dots  \\
	A Nova Poesia Brasileira - Sandro N. Henrique - 1983  \\
        \end{chapterquote}

	\noindent
	Este capítulo explana como o \linux\ mantém a data e a hora, e o que
	é necessário para evitar problemas. Usualmente, não é necessário executar
	qualquer atividade, mas é importante entender o seu funcionamento.


%%\section{Time zones}
\section{Fusos horários}

	A medição do tempo é baseada no fenômeno regular de alternância de
	períodos de luz e escuridão causada pela rotação do planeta. O tempo total
	decorrido entre os períodos é constante, porém os períodos de luz e
	escuridão podem variar. Uma constante simples é o meio-dia.  

	O meio-dia é a hora do dia em que o Sol está em sua posição culminante,
	Uma vez que a terra é redonda\footnote{Segundo pesquisas recentes.}, 
	o meio-dia acontece em diferentes horários em diferentes lugares. 
	Isso leva ao conceito de \textbf{horário local}. O homem
	mede o tempo em diversas unidades, muitas das quais estão baseadas em
	fenômenos naturais como o meio-dia. Caso você permaneça  em um mesmo 
	local menor importância tem as diferenças entre os horários locais.

	Assim que você precise comunicar-se com outros locais distantes,
	notará a necessidade de um horário comum. Nos tempos modernos, muitos
	locais no mundo passaram a comunicar-se entre si, sendo necessário um
	padrão mundial de medida de tempo. Este padrão é conhecido como 
	\textbf{horário universal} (UT ou UTC, anteriormente conhecido como o 
	tempo medido em Greenwich ou GMT (Greenwich Mean Time), pois é  baseado no 
	horário local de Greenwich, uma localidade da Inglaterra). Quando alguém 
	com um diferente horário local necessita comunicar-se, ele pode expressar 
	o tempo através do horário universal, pois desta maneira não há confusão
	de quando determinadas encontro deve acontecer.
	
	Cada horário local é chamado de fuso horário. Enquanto que
	geograficamente seja possível que vários locais tenham o meio-dia ao mesmo
	tempo e portanto tenham a mesma zona de tempo, politicamente nem sempre
	isso é possível. Por diversas razões países adotam \textbf{horários de 
	verão} para atender a demandas econômicas. Alguns países não adotam estes 
	procedimentos. Os países que utilizam o horário de verão não tem um padrão
	de quando os relógios devem ser adiantados ou atrasados, mudando as regras
	de ano para ano. Isso faz com que algumas conversões de fusos horários 
	definitivamente não sejam triviais.
	
	Os fusos horários são melhor denominados através da localização ou da
	diferença entre o horário local e o universal. Nos Estados Unidos e em
	alguns outros países, os fusos horários locais tem um nome e três letras 
	na sua abreviação. As abreviações não são únicas, porém não deveriam ser
	utilizadas desacompanhadas do nome do país. É melhor referir-se ao
	horário, digamos em Helsinki, do que no horário do Leste Europeu, uma vez
	que nem todos os países daquela região adotam as mesmas regras.
	
	O \linux\ reconhece todas os fusos horários existentes, e estes podem ser 
	mudados facilmente à medida que as regras mudem. 
	Tudo o que o  administrador de sistemas necessita fazer é selecionar 
	o fuso horário apropriada. Cada usuário também pode configurar seu fuso  
	horário próprio, o que pode ser importante uma vez que muitas pessoas 
	trabalham com computadores através da Internet. Quando as regras do
	horário de verão mudam, é importante ajustar estas regras, no seu sistema
	local. Não há muito o que se preocupar com a contagem de tempo em seu 
	sistema, além de ajustar o fuso horário e atualizar eventualmente 
	as bases de dados.
	
%%\section{The hardware and software clocks}
\section{Os relógios de hardware e software}

	Um computador pessoal tem uma relógio mantido por uma bateria. Essa
	bateria garante que o relógio funcionará mesmo que o restante do
	computador esteja desligado ou não haja eletricidade disponível. O relógio
	de hardware pode ser ajustado através do painel de configuração da BIOS ou
	através do que esteja rodando como sistema básico em seu computador.
	
	O kernel do \linux\ acompanha o tempo independentemente do relógio de
	hardware. Durante a inicialização, o \linux\ configura seu próprio relógio
	para o mesmo horário que o relógio de hardware. Após isso o relógio do
	sistema anda independentemente. O \linux\ mantém o seu próprio relógio
	porque é complicado e lento verificar o horário no relógio de hardware a
	todo instante.

	O relógio do kernel apresenta sempre o horário universal. Desta forma ele 
	não tem que conhecer absolutamente nada sobre as fusos horários, fazendo 
	com que a simplicidade torne o horário do sistema mais confiável e fácil de
	atualizar. Cada processo lida com as conversões de fusos horários de
	forma independente (utilizando ferramentas padrões que fazem parte do
	pacote de fusos horários).
	
	O relógio de hardware pode estar nos formatos de horário local e horário
	universal. Normalmente, é melhor mantê-lo no formato universal,
	porque não será necessário atualizar o relógio de hardware quando o horário 
	de verão começar ou terminar (UTC não tem horário de verão). Infelizmente 
	alguns sistemas operacionais para PCs, incluindo MS-DOS, Windows, OS/2, 
	assumem que o hardware mostra o horário local. O \linux\ pode trabalhar 
	com qualquer um deles, mas caso o relógio de hardware esteja configurado 
	para o horário local, deve-se alterá-lo quando o horário de verão inicia 
	ou termina.
	
%%\section{Showing and setting time}
\section{Mostrando e acertando o relógio}

	No \cl, o fuso horário é definido por um link simbólico com o arquivo 
	\fn{/etc/localtime}. Este link aponta para um arquivo de dados de fuso 
	horário que descreve o fuso horário local.
	Os arquivos de dados de fuso horário estão armazenados em
	\fn{/usr/share/zoneinfo}. Outras distribuições podem apresentar diferenças.
	
	Um usuário pode alterar o seu fuso horário privado através da variável de
	ambiente TZ. Caso ela não esteja inicializada, o fuso horário do sistema
	é assumido. A sintaxe da variável TZ é descrita na página de manual do
	comando \man{tzset}(3).
	
	O comando \cmd{date} apresenta a data atual e o horário corrente 
	\footnote{Note que o comando \cmd{time} não mostra a hora corrente. Ele
	é útil quando se quer saber quanto tempo um determinado programa gastou 
	na sua execução}.
	Por exemplo:
%
\begin{tscreen}
\verb|$| \textsl{date} \\
\verb|sex out  9 17:39:42 EDT 1998| \\
\verb|$|
\end{tscreen}
%
	Isso significa Sexta, 9 de outubro de 1998, aproximadamente 20 minutos
	para as 6 horas da tarde, e a fuso horário ``EDT'' significa Horário do 
	Leste (Eastern Daylight). O comando \cmd{date} pode apresentar ainda o 
	horário universal:
%
\begin{tscreen}
\verb|$| \textsl{date -u} \\
\verb|sex out  9 20:26:11 UTC 1998| \\
\verb|$|
\end{tscreen}
%
	O \cmd{date} também é usado para configurar o horário do relógio do kernel 
	do sistema:
%
\begin{tscreen}
\verb|#| \textsl{date 10091835} \\
\verb|sex out  9 18:35:00 EDT 1998| \\
\verb|#| \textsl{date} \\
\verb|sex out  9 18:35:00 EDT 1998| \\
\verb|#|
\end{tscreen}
%
	Veja a página de manual do comando \cmd{date} para maiores detalhes - a
	sintaxe pode ser um pouco complexa. Somente o \texttt{root} pode
	ajustar o relógio do sistema. Enquanto cada usuário pode ter o seu próprio
	fuso horário, o relógio é o mesmo para todos.
	
	O \cmd{date} apresenta somente as configurações do relógio do sistema. O 
	comando
	\cmd{clock} sincroniza os relógios de software e hardware. Ele é utilizado
	quando o sistema é inicializado, para ler o relógio do hardware e
	atualizar o relógio do sistema. Caso seja necessário ajustar ambos os
	relógios, primeiro deve-se ajustar o relógio do software através do comando
	\cmd{date} e após o relógio de hardware através do comando 
	\texttt{clock -w}.

	A opção \texttt{-u} diz ao \cmd{clock} que o relógio de hardware está no 
	formato universal. \emph{Deve-se} usar a opção \texttt{-u} com cuidado, 
	caso contrário o computador ficará um tanto confuso sobre o horário 
	correto.

	O relógio deve ser alterado com cuidado. Muitas partes de um sistema 
	\unix\ necessitam do relógio para funcionarem corretamente. Por exemplo, o
	servidor \cmd{cron} executa comandos periodicamente. Caso o relógio
	seja alterado, ele pode ficar um pouco confuso sobre a necessidade ou não
	de executar determinado comando. Em algum \unix\ mais antigo, quando
	alguém mudou o relógio para vinte anos no futuro, o cron tentou
	executar todos os comandos periódicos dos próximos vinte anos de uma única
	vez. Versões atualizadas do cron podem lidar com isso corretamente, mas
	ainda deve-se ter muito cuidado. Grandes saltos ou atrasos no relógio
	podem ser mais perigoso que pequenas diferenças.

%%\section{When the clock is wrong}
\section{Quando o relógio está errado}

	O relógio de software do \linux\ não é sempre preciso. Ele é
	mantido por \textbf{interrupções de tempo} periódicas geradas pelo 
	hardware. Caso o
	sistema tenha muitos processos sendo executados, pode levar um intervalo
	de tempo maior até que a interrupção de tempo seja gerada, e o relógio de
	software pode estar ligeiramente atrasado. O relógio de hardware é
	executado de forma independente do sistema e estará portanto funcionando
	de maneira mais precisa. Caso o sistema seja inicializado freqüentemente
	(e neste caso ele provavelmente não esteja funcionando como um servidor),
	o relógio deve estar praticamente correto.
	
	Caso seja necessário ajustar o relógio de hardware, o mais simples será 
	reinicializar o computador,
	acessar a tela da configuração da BIOS e ajustá-lo. Isso evita qualquer 
	problema que a mudança de horário possa causar ao sistema. Caso executar a 
	mudança via BIOS não seja uma alternativa viável, ajuste o novo horário 
	com os comandos \cmd{date} e \cmd{clock} (nesta ordem), porém prepare-se 
	para reinicializar o sistema, caso coisas estranhas comecem a ocorrer. 
	
	Um computador conectado em rede (mesmo que somente através de um modem) 
	pode checar o relógio
	automaticamente, comparando-o com o horário de outros computadores. Caso o
	outro computador seja conhecido pela acuidade de seu horário, então ambos
	podem manter um horário ajustado. Isso pode ser feito através dos comandos
	\cmd{rdate} e \cmd{netdate}. Ambos verificam o horário de um computador 
	remoto (o \cmd{netdate} pode lidar com diversos computadores remotos), e 
	podem ajustar o horário do computador local. Ao executar um desses 
	comandos regularmente, o computador local terá um horário tão ajustado 
	quanto o computador remoto.

%%	\meta say something intelligent about NTP
