Alteração de fuso horário

Algumas vezes é preciso mudar os arquivos de fuso horário para se adequar as legislações locais. Por exemplo:

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:

Para fazer uma mudança antes da mudança feita pelo projeto Debian, siga este processo:

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

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


CategoryNetwork CategoryDebugging CategorySystemAdministration