você está aqui: Home → Arquivo de Mensagens
Colaboração: George Anderson de Lima Guimarães
Data de Publicação: 08 de Novembro de 2005
Esse breve tutorial irá abordar os conceitos básicos por trás do controle de data e hora no Linux, como setar corretamente a data do seu sistema e como mantê-la precisa ao longo do tempo.
Algumas ferramentas que representam a interface entre usuário e SO para operações com data serão abordados, como: date, hwclock e adjtimex, disponíveis em todas as distribuições.
Nesse tutorial vou além de jogar comandos para o leitor e tentar explicar um pouco do complexo processo que existe por trás do reloginho do pingüim.
Existem dois principais sistemas de hora no Linux:
O comando date, bastante conhecido, informa a data e hora do sistema em diversos formatos especificados pelo usuário. Por exemplo, para imprimir a data e a hora com o mês por extenso o comando seria:
date +"%d de %B de %Y"
Note que concateno com "de" para produzir algo como: 31 de Outubro de 2005
. Mais Exemplos:
$ date -s 10:00 (seta a hora para as 10:00) $ date -s Qua (vira o dia para quarta-feira as 00:00) $ date -s "11/01/2005 13:55" (ajusta data e hora de uma vez)
A data trazida pelo comando date é a data que o sistema tem controle, ou seja, o relógio de Sistema. Pode-se ajustar sua data e hora conforme necessário, porém a mesma não será mantida até o próximo boot, quando o sistema fará uma nova requisição ao relógio do Hardware para ajustar-se.
Ajustar a data/hora do sistema agora passa então a ser uma operação de duas etapas: na primeira atualizamos a data/hora do Sistema; na segunda sincronizamos essa hora definida no Sistema com aquela definida na BIOS.
Vejamos um exemplo onde queremos modificar a data do Sistema para 31 de Outubro de 2005 e atualizar na BIOS:
$ date -s 10/31/2005
Ok, agora precisamos fazer o hardware receber a hora setada no sistema:
$ clock -w.
clock é um link para hwclock e a opção -w
faz exatamente o que queremos: usar a data/hora do sistema para atualizar a data/hora da BIOS. O contrário também é possível, podemos utilizar a data/hora da BIOS para setar nosso sistema, trocando a opção -w
por -s
. Isso é feito pelo sistema na inicialização.
Que o Relógio da BIOS não é muito preciso não é novidade para ninguém. É sabido por todos que ele sempre atrasa ou adianta um pouco ao longo do tempo. O interessante é que essa diferença é previsível, ou seja, ele ganha ou perde a mesma quantidade de tempo todos os dias. Isso é chamado de desvio sistemático. Para sistemas onde a precisão nos horários é crítica, como por exemplo, numa companhia aérea, essa perda pode significar prejuízos e constrangimento para os passageiros. Por sorte, a função de ajuste em hwclock permite correções também sistemáticas desses desvios.
Funciona da seguinte forma: hwclock mantém um arquivo (/etc/adjtime
), com algumas informações históricas do tempo. Suponha que você não tem em seu sistema esse arquivo, ao emitir o comando hwclock --set
, Hwclock cria o arquivo e armazena a hora corrente como a última vez em que a hora foi "calibrada".
Imagine que após cinco dias, o relógio ganhou 10 segundos, então você emite novamente o hwclock --set
para diminuir os 10 segundos e Hwclock atualiza o arquivo de ajuste (adjtime) como a última vez que a hora foi calibrada e agora vem o interessante: além da última hora calibrada ele também armazena 2 segundos (10s/5 dias) como sua taxa de desvio sistemático. 24 horas depois um simples hwclock --adjust
é suficiente para manter a hora do sistema exatamente como foi ajustada. Toda vez que você re-calibrar a hora, será feito o cálculo do desvio.
Após isso uma boa dica seria colocar o comando de ajuste hwclock --adjust
para rodar logo após o hwclock --hctosys
na inicialização do sistema e também periodicamente utilizando a cron se o sistema não for reinicializado com frequência.
Uma outra opção um pouco mais complexa seria utilizar o adjtimex para fazer uma rápida calibragem do sistema. O primeiro passo seria descobrir o Desvio diário, ou seja, quanto o sistema atrasa ou adianta em 24hs e aplicar essa informação. Por exemplo, vamos supor que seu sistema ganha 8 segundos por dia. Então descobrimos que precisamos de 9999 microsegundos a mais a cada tick do kernel - tick são batidas, como o tic-tac de um relógio de verdade (1 unidade de tick equivale a 8.64 segundos). Segundo a equivalência teremos agora um atraso de apenas 0.64 por dia. Para corrigir o restante do erro precisamos alterar também o valor do offset da frequência (a diferença com o clock do processador) com o seguinte: (2^16)*0.64/0.864 = 485452. Colocando a seguinte linha no rc.local corrigimos o desvio - Eu falei que esse era um pouco mais complicado:
adjtimex --tick 9999 --freq 485452
Existem outros modos de manter o relógio do sistema sincronizado, por exemplo, utilizando o horário de servidores na internet como referência - geralmente utilizando o NTP[1] (Network Time Protocol). Porém, algumas vezes, fazer essa sincronização pela internet pode ser um tanto quanto perigoso ou custoso ou até mesmo impossível se o servidor estiver isolado da web por medida de segurança.
[1] - http://www.ntp.org/
[2] - Página de Manual do date.
[3] - Página de Manual do hwclock.
[4] - Página de Manual do adjtimex.