você está aqui: Home  → Arquivo de Mensagens

How-To - Data e Hora no Linux

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.

1. Como funciona a data/hora no Linux?

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 Relógio do Hardware: que roda independente de qualquer sistema e continua funcionando mesmo quando o pc está desligado. Esse relógio é comumente chamado de Relógio de Hardware, Relógio de Tempo Real, RTC (sigla em inglês para Real Time Clock), Relógio da BIOS e Relógio CMOS.
  • O Relógio do Sistema: esse guarda a hora utilizando um relógio dentro do kernel do Linux e é comandado por uma interrupção especial chamada timer. Aqui o Relógio da BIOS é utilizado apenas pra marcar a data/hora quando o sistema não está ligado. No processo de boot essa data/hora armazenada na BIOS é lida e nunca mais requisitada até o próximo boot.

2. Manipulando Data/Hora de Sistema e de Hardware.

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.

3. Hora crítica: Fazendo do Linux um relógio Suiç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.

4. Referências:

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



 

 

Veja a relação completa dos artigos de George Anderson de Lima Guimarães

Opinião dos Leitores

Laiser Mello
21 Out 2010, 17:16
boa tarde!

Tenho um servidor slackware jah usei o comando date -s "horario" clock -w para ajustar para o horario de verao...mas no outro dia ele volta para o normal o q eu posso fazer pra resolver???
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script