Alteração de fuso horário
Contents
Algumas vezes é preciso mudar os arquivos de fuso horário para se adequar as legislações locais. Por exemplo:
- na Austrália, quando um governo estadual decide mudar o início ou o fim do horário de verão (o ajuste de Victoria para os Jogos da Commonwealth e a adoção temporária da Austrália Ocidental no final de 2006), ou
- nos EUA, quando o estado de Indiana decidiu, em 2006, começar a usar o horário de verão pela primeira vez em muitas décadas e, ao mesmo tempo, alguns condados de Indiana mudaram os fusos horários (do Leste para o Centro).
Histórico: o Debian inclui arquivos de fuso horário na árvore de diretório /usr/share/zoneinfo, que é fornecida pelo pacote tzdata para o Etch e posteriores (para o Sarge e anteriores os arquivos são parte do libc6). Esses pacotes podem ser atualizados periodicamente:
- No Etch, novas versões do pacote tzdata eram lançadas periodicamente quando novas versões dos arquivos de dados upstream se tornavam disponíveis (pelo menos até o lançamento da versão no final de 2006).
No Sarge, o pacote libc6 versão 2.3.2.ds1-22sarge3 atualizou os arquivos timezone para a versão upstream do tzdata2006b. Esta versão do pacote libc6 foi incluída na atualização Sarge "r2", lançada em 19 de abril de 2006.
- No Woody, o pacote mais recente do glibc6 2.2.5-11.8 não mudou e, portanto, não incluiu alterações recentes de fuso horário.
Para fazer uma mudança antes da mudança feita pelo projeto Debian, siga este processo:
- verifique se o sistema está configurado para o fuso horário correto,
execute zdump para se certificar de que a mudança é necessária,
- obtenha um arquivo de fonte de fuso horário atualizado, por download ou patch,
execute zic para fazer a mudança,
execute zdump novamente para garantir que a mudança seja efetiva,
- verifique o resultado por outros meios.
Mais detalhes podem ser encontrados abaixo, usando Sydney na Austrália como exemplo. Substitua o nome do fuso horário e o nome do arquivo para aqueles da sua região.
Verificar o fuso horário configurado
Para verificar ou mudar o fuso horário para o qual seu sistema Debian está configurado,
# dpkg-reconfigure tzdata
O que isso faz? Muda o link simbólico /etc/localtime e o arquivo /etc/timezone. Não é suficiente executar, por exemplo, timedatectl set-timezone Australia/Sydney já que isto não atualiza o arquivo específico ao Debian /etc/timezone, usado por alguns pacotes.
Considere o link localtime(5) como a fonte primária e /etc/timezone como legado. Durante o ciclo de lançamento do Bookworm, houve uma tentativa de se livrar de /etc/timezone (822733), mas ele foi restaurado por enquanto já que há vários pacotes que ainda baseiam-se nele (1031395).
Nas distribuições Debian Sarge (3.1) e anteriores, /etc/localtime era um link simbólico. Ele foi alterado para um arquivo regular (uma cópia de um arquivo /usr/share/zoneinfo/) no Etch (4.0), e permaneceu assim até Stretch (9), momento em que foi feito um link simbólico novamente.
Nas versões do Debian Etch and Jessie (incluso), o /etc/localtime é uma cópia do arquivo de dados original, o que torna complicado verificar qual fuso horário foi selecionado. Verifique o conteúdo de /etc/timezone para ver o nome do fuso horário. Se o sistema estiver configurado normalmente, você descobrirá que o arquivo zoneinfo referenciado por este nome é idêntico ao /etc/localtime. Por exemplo, você pode verificar isso executando:
$ diff -s /etc/localtime /usr/share/zoneinfo/`cat /etc/timezone` Os ficheiros /etc/localtime and /usr/share/zoneinfo/America/New_York são idênticos
O comando tzconfig atualiza tanto o arquivo /etc/localtime quanto o arquivo /etc/timezone.
Nas distribuições Stretch e posteriores, o /etc/localtime é um link para um arquivo. Verifique para onde o /etc/localtime aponta:
# ls -l /etc/localtime lrwxrwxrwx 1 root root 48 Mar 31 11:19 /etc/localtime -> /usr/share/zoneinfo/Australia/Sydney
e use o caminho seguindo o prefixo "/usr/share/zoneinfo/".
Verifique se necessário
O programa zdump informa a tabela de fusos horários. Use-o para verificar as datas da mudança do horário de verão. Por exemplo, este sistema tem regras australianas antigas, mostrando uma mudança do horário de verão em 26 de março:
# zdump -c 2007 -v Australia/Sydney|grep 2006 Australia/Sydney Sat Mar 25 15:59:59 2006 UTC = Sun Mar 26 02:59:59 2006 EST isdst=1 gmtoff=39600 Australia/Sydney Sat Mar 25 16:00:00 2006 UTC = Sun Mar 26 02:00:00 2006 EST isdst=0 gmtoff=36000 Australia/Sydney Sat Oct 28 15:59:59 2006 UTC = Sun Oct 29 01:59:59 2006 EST isdst=0 gmtoff=36000 Australia/Sydney Sat Oct 28 16:00:00 2006 UTC = Sun Oct 29 03:00:00 2006 EST isdst=1 gmtoff=39600
Obter o arquivo de fuso horário
Obtenha uma cópia do arquivo de fuso horário "australasia" ou um arquivo específico do país a partir de um pacote tzdata recente ou do site do(a) desenvolvedor(a) original (upstream).
Para obter o arquivo australasia dos arquivos-fonte de tzdata, configure seu sources.list com linhas deb-src para sua versão de distribuição atual, baixe a fonte, descompacte-a e edite o arquivo. Por exemplo, em um sistema Debian Lenny (números de versão podem variar):
# mkdir /tmp/tzdata # cd /tmp/tzdata # apt-get install dpkg-dev # apt-get source tzdata # cd tzdata-2008e # tar xfz tzdata2008e.tar.gz # more australasia
Para contornar o Debian e pegar os arquivos de onde o projeto Debian os tirou:
% mkdir /tmp/tzdata % cd /tmp/tzdata % wget 'ftp://elsie.nci.nih.gov/pub/tzdata*.tar.gz' % tar xfz tzdata*.tar.gz % more australasia
Agora você deve ter todos os arquivos de fuso horário.
Se estiver usando o arquivo do pacote-fonte sem a alteração, altere o arquivo adicionando as novas linhas. Por exemplo, estas linhas estão no arquivo corrigido para a mudança do início de 2006 em australasia:
... Rule AN 2001 max - Oct lastSun 2:00s 1:00 - Rule AN 2006 only - Apr Sun>=1 2:00s 0 - Rule AN 2007 max - Mar lastSun 2:00s 0 - ...
Mudança para teste prévio
Este é um passo adicional. Ele testa o arquivo-fonte sem mudar a configuração do sistema. E pode ser feito por um(a) usuário(a) sem privilégios administrativos.
$ mkdir test-tz $ /usr/sbin/zic -d test-tz australasia $ TZ=`pwd`/test-tz/Australia/Sydney date --date="2006-04-01 16:00:10 UTC" Sun Apr 2 02:00:10 EST 2006
Este teste compila o arquivo-fonte do fuso horário em um diretório, e então pede ao comando date para passar do horário UTC para o horário local próxima da descontinuidade esperada.
Submeta as mudanças
O programa zic altera as tabelas de fuso horário. Dê à ele o nome do arquivo-fonte modificado da australasia ou do arquivo específico do país. Por exemplo:
# /usr/sbin/zic australasia
Então reconfigure o pacote tzdata, o qual atualizará /etc/localtime:
# dpkg-reconfigure tzdata
Teste de verificação 1: mostre as regras do fuso horário
Use o programa zdump novamente para confirmar a mudança. Por exemplo, este sistema teve as mudanças aplicadas apropriadamente, mostrando uma mudança de horário de verão em 2 de abril:
# zdump -c 2007 -v Australia/Sydney|grep 2006 Australia/Sydney Sat Apr 1 15:59:59 2006 UTC = Sun Apr 2 02:59:59 2006 EST isdst=1 gmtoff=39600 Australia/Sydney Sat Apr 1 16:00:00 2006 UTC = Sun Apr 2 02:00:00 2006 EST isdst=0 gmtoff=36000 Australia/Sydney Sat Oct 28 15:59:59 2006 UTC = Sun Oct 29 01:59:59 2006 EST isdst=0 gmtoff=36000 Australia/Sydney Sat Oct 28 16:00:00 2006 UTC = Sun Oct 29 03:00:00 2006 EST isdst=1 gmtoff=39600
Teste de verificação 2: traduza o horário UTC
Você pode usar a opção --date no comando date para ver como o sistema interpretará um horário específico. Este método não muda o relógio do sistema.
$ date --date="2006-04-01 15:59:50 utc" Sun Apr 2 02:59:50 EST 2006 $ date --date="2006-04-01 16:00:10 utc" Sun Apr 2 02:00:10 EST 2006
Teste de verificação 3: observe a mudança
É possível alterar o horário do seu sistema para demonstrar que a correção é boa. Há efeitos colaterais ao alterar o horário, como a distorção de datas de arquivos ou problemas de interoperabilidade com outros sistemas próximos, por isso é uma boa ideia apenas em sistemas de teste.
Para fazer o teste, use o comando date --utc para alterar a hora para um pouco antes da primeira descontinuidade identificada por zdump, depois use o comando date para mostrar a hora local, após a descontinuidade. Por exemplo:
# date --utc 040115592006.50 ; date ; sleep 20 ; date Sun Apr 2 02:59:50 EST 2006 Sun Apr 2 02:00:10 EST 2006
Cenários de falha de testes
Definir a hora no formato UTC usando o sinalizador --utc é útil, porque definir o horário como 02:59:50 seria ambíguo e o comando date significa o segundo 02:59:50 naquela manhã em vez do primeiro, e a mudança não seria percebida.
- Se NTP está ativado, alterar a hora do sistema no teste final não funciona tão bem, desligue-o primeiro.
Se o teste de mudança ou tradução falhar e ainda assim o zdump parecer certo, talvez seu sistema tenha um arquivo /etc/localtime que é uma cópia do arquivo zoneinfo em vez de um link simbólico para ele. O Debian GNU/Linux Sarge e anteriores usa um link simbólico, mas algumas outras distribuições do Linux usam uma cópia do arquivo.
Reiniciar daemons e programas de execução longa
Depois que os arquivos zoneinfo forem atualizados, talvez seja necessário reiniciar os daemons e outros programas de execução longa para que usem as novas informações do fuso horário. Exemplos de tais programas incluem apache, bind, cron, fetchmail-d, inetd, mailman, sendmail e sysklogd. Um sintoma comum desse problema é ver registros de data e hora incorretos misturados com os registros de data e hora corretos em seus arquivos de registro (por exemplo, /var/log/syslog). Mesmo programas interativos como o mutt podem continuar usando as informações antigas de fuso horário até que sejam reiniciados.
Portabilidade binária
O arquivo zoneinfo compilado parece ser independente de plataforma e arquitetura, portanto, se você tiver várias máquinas para atualizar, poderá mover o arquivo como está, sem executar o zic novamente. Da mesma forma, você pode simplesmente extrair arquivos atualizados do zoneinfo de uma máquina rodando uma versão diferente do Debian, ou até mesmo baixar o mais recente pacote tzdata da versão instável (unstable), extrair o arquivo zoneinfo de dentro do arquivo .deb, e instalá-los na árvore de diretórios /usr/share/zoneinfo.
Referências
Bug #345479 abrange as mudanças de fuso horário da Austrália de 2006
Este site oferece mais informações sobre as mudanças de fuso horário em Indiana em 2006
CategoryNetwork CategoryDebugging CategorySystemAdministration