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 debconf
banco 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 tzdata
comando, 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 mexendo nos arquivos /etc/localtime
e /etc/timezone
diretamente, mas prefiro o jeito dpkg-reconfigure
e debconf
.
Responder1
A maneira mais simples que conheço é:
echo "Europe/Zurich" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata
Responder2
Para usar o debconf, antes de chamar o dpkg-reconfigure, você também precisa remover /etc/localtime
e /etc/timezone
. Cuidado também com possíveis espaços extras (como na sua pergunta!) Que não são benignos.
Então o "modo debconf" 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
A razão é que o script de configuração tzdata tenta ser inteligente e, se 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 você mesmo, 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
o que lhe mostraria que é vigorosamenteCONJUNTOSos valores antes de solicitá-los ao usuário (substituindo assim os valores definidos com debconf-set-selections
).
Então você mudaria shebang de /var/lib/dpkg/info/tzdata.config
para #!/bin/sh
e #!/bin/sh -x
seguiria o fluxo do programa, onde veria que isso acontece:
+ [ -L /etc/localtime ]
+ readlink /etc/localtime
+ TIMEZONE=/usr/share/zoneinfo/Etc/UTC
olhando /var/lib/dpkg/info/tzdata.config
você vai encontrar isso:
# 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. Olhando também mais no script, você descobrirá que a resposta do @andrekeller também funciona em versões mais recentes do Debian se você remover '/etc/localtime'.
Esperamos 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 também se tornarem inválidas. Mais informações sobre depuração do debconf podem ser encontradas emdebconf-devel(7)
Responder3
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
é preciso. Complementarresposta de Andrekellervocê precisa:
echo "Europe/Zurich" > /etc/timezone
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata