Ajustando o horário de verão no GNU/Linux

Muita gente acha que o horário de verão deve ser ajustado usando-se o console, como root logo no primeiro horário de trabalho depois do fatídico final de semana escolhido pelo governo para o ajuste do horário. Para estações de trabalho, isso pode até funcionar. Por outro lado, imagine um servidor onde trafegam dados sensíveis ao horário, como fazer? Devemos acessar o servidor no sábado às 23:59 e ficar aguardando o domingo começar para ajustar a hora do servidor? Claro que não!

No GNU/Linux, é possível programar a mudança do horário de verão. Assim, quando é publicado o decreto instituindo o horário de verão, eu costumo criar um arquivo com os ajustes necessários e distribuo para os servidores sob minha responsabilidade.

O procedimento é bastante simples: basta algum conhecimento de um editor de textos qualquer (o vi por exemplo) e uma conta de acesso com direitos administrativos num computador com GNU/Linux.

O relógio em sistemas GNU/Linux

Quando instalamos o Linux é recomendável (e considero imprescindível para servidores) que a hora do BIOS seja o horário UTC (Universal Time Coordinate), que é o horário padrão para o mundo inteiro. A partir da hora UTC são realizados os offsets para as várias regiões do mundo (que são os conhecidos fusos horários). Quando instalamos o Linux em máquinas domésticas ou que precisem de dual boot com o Windows, esta regra muitas vezes é quebrada, pois o Windows XP parece assumir que o relógio do BIOS tem a hora local - não sei bem se isso ainda é verdade, pois não tenho configurado muitas máquinas com MS-Windows.

Quando ajustarmos o horário de verão não faremos nenhuma alteração no relógio do sistema, apenas informaremos o sistema operacional qual é o novo offset em relação ao horário do sistema. Simples e inteligente, não?

Sincronizando a hora com o NTP

É importante salientar o seguinte: o servidor de hora serve para sincronizar o relógio do computador. A referência de timezone (fuso horário) é função da aplicação. Isso quer dizer que podemos alterar o fuso horário do computador SEM alterar o relógio do mesmo.

Algumas considerações técnicas importantes sobre o NTP:

De acordo com o protocolo de sincronização de hora NTP, se a diferença entre a hora local (do computador) a hora do servidor de hora ultrapassar algo em torno de 1000 segundos (aprox. 16 minutos), o serviço NTP do computador irá falhar e será encerrado, exigindo um intervenção manual para a sincronização. Portanto, se a hora do servidor de horas fosse alterada em uma hora para refletir o horário de verão, todos os serviços NTPd que utilizassem este servidor iriam falhar.

O ajuste de horário de verão no Brasil não possui data fixa para começar e nem para terminar. Em 2008, o governo brasileiro até tentou fixar a data, mas ficou um pouco complicado, conforme veremos mais adiante. De acordo com o Decreto nº 6.558 de 8 de setembro de 2008, o Horário de Verão 2008/2009 teve início à zero hora (00:00) de 19 de Outubro de 2008, com término determinado para a zero hora (00:00) de 15 de Fevereiro de 2009.

Este decreto trouxe duas mudanças importantes em relação aos decretos de anos anteriores:

  • Fixou o início do horário de verão para a zero hora do terceiro domingo de outubro de cada ano.
  • Fixou o encerramento do horário de verão sempre à zero hora do terceiro domingo de fereveiro do ano seguinte, exceto se neste domingo for comemorado o Carnaval, quando então o encerramento do horário de verão fica automaticamente transferido para o domingo seguinte.

Confesso que não entendi qual o problema em alterar o horário durante uma festa pagã. Mas enfim, o decreto não explica, só decreta…

Tendo estas considerações em mente, vamos ver o que deve ser feito.

Programando o horário de verão no Linux

Verifique a existência do arquivo /etc/localtime e se este arquivo é um link ou não: a saída do comando ls -l vai te dizer se o arquivo é um arquivo mesmo (‘-‘ no primeiro caractere) ou se é um link (‘l’).

Dica: Nao é recomendado que o arquivo /etc/localtime seja um link para o arquivo de informação de zona, pois sistemas em que o diretório /usr não estiver acessível (não tiver sido montado, por exemplo) no momento de inicialização da máquina, as informações contidas no localtime não serão carregadas.

Como root, acesse o diretório /usr/share/zoneinfo/Brazil e crie o arquivo brasil-verao.zic com o seguinte conteúdo:

Rule Brazil 2008 only - Oct 19 00:00 1 S
Rule Brazil 2009 only - Feb 15 00:00 0 -

Zone Brazil/East-verao -3:00 Brazil BR%sT

Compile o arquivo:

# zic brasil-verao.zic

Este comando irá produzir o arquivo East-verao no diretório /usr/share/zoneinfo/Brazil.

Para verificar se as configurações estão corretas, execute o comando zdump da seguinte forma:

# zdump -v Brazil/East-verao | grep 200[89]

Observe que os caracteres entre colchetes indicam os finais dos anos que me interessam (2008 ou 2009).

A saída deverá ser a seguinte (só as últimas 4 linhas são mostradas a seguir):

Brazil/East-verao  Sun Oct 19 02:59:59 2008 UTC = Sat Oct 18 \
     23:59:59 2008 BRT isdst=0 gmtoff=-10800
Brazil/East-verao  Sun Oct 19 03:00:00 2008 UTC = Sun Oct 19 \
     01:00:00 2008 BRST isdst=1 gmtoff=-7200
Brazil/East-verao  Sun Feb 15 01:59:59 2009 UTC = Sat Feb 14 \
     23:59:59 2009 BRST isdst=1 gmtoff=-7200
Brazil/East-verao  Sun Feb 15 02:00:00 2009 UTC = Sat Feb 14 \
     23:00:00 2009 BRT isdst=0 gmtoff=-10800

Ajustando o sistema

Verifique se o arquivo /etc/localtime é um link (conforme descrito no início deste tutorial). Exemplo:

# ls -l /etc/localtime
lrwxrwxrwx 1 root root 24 2008-06-03 16:30 /etc/localtime -> \
        /usr/share/zoneinfo/Brazil/East

Se /etc/localtime for um link, remova-o.

Nos sistemas Debian normalmente o arquivo localtime não é um link.

Copie o arquivo /usr/share/zoneinfo/Brazil/East-verao para /etc/localtime:

# cp /usr/share/zoneinfo/Brazil/East-verao /etc/localtime

Agora verifique a hora do sistema:

# date
Thu Feb 12 11:44:34 BRST 2009

O campo BRST indica que estamos no horário de verão. Se estivéssemos fora do horário de verão, não aparecerá nada. Já vi em alguns lugares o termo DST (Daylight Saving Time) ser utilizado no lugar de BRST, porém, eu prefiro utilizar o termo BRST por ser mais amigável quando digitamos o comando date. Assim, durante durante o horário de verão, o comando date retornará a string BRST (Brazil Saving Time) e, fora do período de horário de verão, teremos BRT (Brazil Time). Ainda não encontrei nenhuma documentação sobre a correta configuração deste campo.

Um detalhe importante: no dia 15 de fevereiro de 2009 não será necessário nenhum procedimento: o arquivo /etc/localtime já contém as informações de término do horário de verão.

Se você descartar a explicação técnica (sempre gosto de explicar o por quê), o procedimento é bastante simples, não é?

Espero ter ajudado.

Marião