Ajustando o horário de verão no GNU/Linux — Blog do Marião
« O ataque de Mitnick
Enfim, o início »
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:
Zone Brazil/East-verao -3:00 Brazil BR%sT
# 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
Verifique se o arquivo /etc/localtime é um link (conforme descrito no início deste tutorial). Exemplo:
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:
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 é?