Cambio de zona horaria con dpkg-reconfigure tzdata y debconf-set-selections

18

Quiero configurar un script que cambie automáticamente la zona horaria en una máquina (ejecutando ubuntu 11.10) y también establezca los valores correctos para la debconfbase de datos. He intentado lo siguiente, pero no funciona (al final, la zona horaria actual permanece sin cambios, y si ejecuto manualmente el dpkg-reconfigure tzdatacomando, los valores seleccionados son los antiguos):

#!/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

Así que, por ahora, lo estoy haciendo jugar con los archivos /etc/localtimey /etc/timezonedirectamente, pero prefiero preferir el dpkg-reconfigurey debconfforma.

Carlos Campderrós
fuente

Respuestas:

26

La forma más simple que conozco es:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
andrekeller
fuente
¿Qué significan los parámetros para reconfigurar dpkg?
serengeti12
55
Tenga en cuenta que los procesos en ejecución pueden no recoger el cambio sin reiniciar. Por ejemplo, es probable que las marcas de tiempo de registro de los daemons del servidor sean incorrectas hasta que reinicie los daemons.
mc0e
6

Me acabo de enterar de que con Debian Stretch (9) también necesitas cambiar / etc / localtime, por lo que algo así como:

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

es necesario Para modificar la respuesta de andrekeller necesita:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
ficción
fuente
Me salvó el día! Otras soluciones no funcionan en Debian 9
Brandon
2
En realidad, solo se necesita vincular etc / localtime, ya que llamar a dpkg-reconfigure establecerá / etc / timezone correctamente
Daniel Dinnyes
@DanielDinnyes o, alternativamente, puede reemplazar esa ln -fs ....línea desgarbada con simple rm -f /etc/localtime, y aún funcionará (y debconf volvería a crear /etc/localtimecon los valores correctos); Vea mi respuesta para más detalles.
Matija Nalis
4

Para usar debconf, antes de llamar a dpkg-reconfigure, también debe eliminar /etc/localtimey /etc/timezone. También tenga cuidado con el posible espacio adicional (como en su pregunta) que no son benignos.

Entonces, "debconf way" que funciona (en Debian Stretch) sería:

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

La razón es que el script de configuración tzdata intenta ser inteligente, y si alguna vez se configuró antes o si el usuario se ha entrometido manualmente con zonas horarias, se comportará de manera diferente.

EXTRA

Para depurar un problema similar, primero debe hacer:

export  DEBCONF_DEBUG=developer

que proporcionaría la siguiente información:

# 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

lo que le mostraría que ESTABLECE los valores con fuerza antes de solicitarlos al usuario (sobrescribiendo así los valores que establezca debconf-set-selections).

Luego, cambiaría shebang /var/lib/dpkg/info/tzdata.configde #!/bin/sha #!/bin/sh -x, y seguiría el flujo del programa, donde vería que sí:

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

mirando /var/lib/dpkg/info/tzdata.configesto encontrarás esto:

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

lo que explica por qué funciona @fiction answer. También mirando más en el script, encontrará que la respuesta @andrekeller también funciona en versiones más recientes de Debian si elimina '/ etc / localtime'.

Esperemos que esta ayuda de depuración lo ayude cuando la próxima versión de Debian haga que el script sea aún más inteligente y las respuestas existentes también se vuelvan inválidas. Se puede encontrar más información sobre la depuración de debconf en debconf-devel (7)

Matija Nalis
fuente