mudando o fuso horário com dpkg-reconfigure tzdata e debconf-set-selections

16

Eu quero configurar um script que altera automaticamente o fuso horário em uma máquina (executando o Ubuntu 11.10) e também define os valores corretos para o banco de dados debconf . Eu tentei o seguinte, mas não funciona (no final, o fuso horário atual permanece inalterado, e se eu executar manualmente o comando dpkg-reconfigure tzdata , os valores selecionados são de fato os antigos):

#!/bin/sh -e
echo "tzdata    tzdata/Areas    select  Europe" | debconf-set-selections
echo "tzdata    tzdata/Zones/Europe select  Madrid" | debconf-set-selections
echo "tzdata    tzdata/Zones/America    select  " | debconf-set-selections
dpkg-reconfigure -f noninteractive tzdata

Então, agora, estou fazendo isso mexendo nos arquivos /etc/localtime e /etc/timezone diretamente, mas prefiro preferir o dpkg-reconfigure e debconf way.

    
por Carlos Campderrós 02.11.2012 / 11:45

3 respostas

26

A maneira mais simples que conheço é:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
    
por 18.11.2012 / 17:43
5

Acabei de descobrir que com o Debian Stretch (9) você também precisa alterar o / etc / localtime, algo como:

ln -fs /usr/share/zoneinfo/'cat /etc/timezone' /etc/localtime

é necessário. Para corrigir a resposta do andrekeller , é necessário:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/'cat /etc/timezone' /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
    
por 24.07.2017 / 14:41
1

Para usar o debconf, antes de chamar o dpkg-reconfigure, você também deve remover /etc/localtime e /etc/timezone . Tenha também cuidado com possíveis espaços extras (como na sua pergunta!) Que não são benignos.

Então "debconf way" que funciona (no Debian Stretch) seria:

echo "tzdata tzdata/Areas select Europe" | debconf-set-selections
echo "tzdata tzdata/Zones/Europe select Madrid" | debconf-set-selections
rm -f /etc/localtime /etc/timezone
dpkg-reconfigure -f noninteractive tzdata

O motivo é que o script de configuração do tzdata tenta ser inteligente e, se já foi configurado antes ou o usuário se intrometeu manualmente com fusos horários, se comportará de maneira diferente.

EXTRA

Para depurar problemas semelhantes, primeiro você faria:

export  DEBCONF_DEBUG=developer

que forneceria as seguintes informações:

# dpkg-reconfigure -f noninteractive tzdata
debconf (developer): starting /var/lib/dpkg/info/tzdata.config reconfigure 2018e-0+deb9u1
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0
debconf (developer): <-- CAPB backup
debconf (developer): --> 0 multiselect escape
debconf (developer): <-- SET tzdata/Areas Etc
debconf (developer): --> 0 value set
debconf (developer): <-- SET tzdata/Zones/Etc UTC
debconf (developer): --> 0 value set
debconf (developer): <-- INPUT high tzdata/Areas
debconf (developer): --> 30 question skipped
debconf (developer): <-- GO
debconf (developer): --> 0 ok
debconf (developer): <-- GET tzdata/Areas
debconf (developer): --> 0 Etc
debconf (developer): <-- INPUT high tzdata/Zones/Etc
debconf (developer): --> 30 question skipped
debconf (developer): <-- GO
debconf (developer): --> 0 ok
debconf (developer): starting /var/lib/dpkg/info/tzdata.postinst configure 2018e-0+deb9u1
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0
debconf (developer): <-- GET tzdata/Areas
debconf (developer): --> 0 Etc
debconf (developer): <-- GET tzdata/Zones/Etc
debconf (developer): --> 0 UTC
debconf (developer): <-- STOP

que mostra que ele força SET os valores antes de pedir ao usuário por eles (sobrescrevendo os valores que você definiu com debconf-set-selections ).

Em seguida, você mudaria o texto em /var/lib/dpkg/info/tzdata.config de #!/bin/sh para #!/bin/sh -x e seguiria o fluxo do programa, onde você veria:

+ [ -L /etc/localtime ]
+ readlink /etc/localtime
+ TIMEZONE=/usr/share/zoneinfo/Etc/UTC

olhando para /var/lib/dpkg/info/tzdata.config você encontrará isto:

# If /etc/localtime is a link, update /etc/timezone
if [ -L /etc/localtime ] ; then
    TIMEZONE="$(readlink /etc/localtime)"

que explica porque funciona a resposta @fiction. Também procurando mais no script, você encontrará que a resposta @andrekeller também funciona em versões mais novas do Debian se você remover '/ etc / localtime'.

Espero que esta ajuda de depuração ajude você quando a próxima versão do Debian tornar o script ainda mais inteligente e as respostas existentes se tornarem inválidas também. Mais informações sobre depuração debconf podem ser encontradas em debconf-devel (7)

    
por 27.09.2018 / 14:21