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

18

Quero configurar um script que altere automaticamente o fuso horário em uma máquina (executando o ubuntu 11.10) e também defina os valores corretos para o debconfbanco de dados. Eu tentei o seguinte, mas não funciona (no final, o fuso horário atual permanece inalterado e, se eu executar manualmente o dpkg-reconfigure tzdatacomando, 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, por agora, eu estou fazendo isso mexer com os arquivos /etc/localtimee /etc/timezonediretamente, mas eu prefiro preferem o dpkg-reconfiguree debconfforma.

Carlos Campderrós
fonte

Respostas:

26

A maneira mais simples que eu sei é:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
andrekeller
fonte
o que significam os parâmetros para dpkg-reconfigure?
precisa
5
Esteja ciente de que os processos em execução podem não receber a alteração sem reiniciar. Por exemplo, os registros de data e hora de log dos daemons do servidor provavelmente estarão errados até você reiniciar os daemons.
Mc0e
6

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

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

é preciso. Para alterar a resposta do andrekeller, você precisa:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
ficção
fonte
Salvou o meu dia! Outras soluções não funcionam no Debian 9
Brandon
2
Na verdade, apenas ligando etc / localtime é necessário, como chamar dpkg-reconfigure irá definir / etc / fuso horário corretamente
Daniel Dinnyés
@DanielDinnyes ou, alternativamente, você pode substituir essa ln -fs ....linha desajeitada por simples rm -f /etc/localtime, e ainda funcionará (e o debconf seria recriado /etc/localtimecom os valores corretos); veja minha resposta para detalhes.
Matija Nalis 27/09/18
4

Para usar o debconf, antes de chamar o dpkg-reconfigure, você também precisa remover /etc/localtimee /etc/timezone. Também tenha cuidado com o possível espaço extra (como na sua pergunta!) Que não é benigno.

Portanto, 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 ele já foi configurado antes ou se o usuário interferiu manualmente nos fusos horários, se comportará de maneira diferente.

EXTRA

Para depurar um problema semelhante, faça primeiro:

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

o que mostraria que ele define com força os valores antes de solicitá-los ao usuário (substituindo, assim, os valores que você define debconf-set-selections).

Então você mudaria shebang /var/lib/dpkg/info/tzdata.configde #!/bin/shpara #!/bin/sh -xe seguiria o fluxo do programa, onde veria que ele funciona:

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

olhando para /var/lib/dpkg/info/tzdata.configvocê encontrará o seguinte:

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

o que explica por que a resposta @fiction funciona. Também olhando mais no script, você descobriria que a resposta @andrekeller também funciona nas versões mais recentes do Debian se você remover '/ etc / localtime'.

Espero que esta ajuda de depuração o ajude 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 a depuração do debconf podem ser encontradas em debconf-devel (7)

Matija Nalis
fonte