cambiando la zona horaria con dpkg-reconfigure tzdata y debconf-set-selections

cambiando la zona horaria con dpkg-reconfigure tzdata y debconf-set-selections

Quiero configurar un script que cambie automáticamente la zona horaria en una máquina (que ejecuta ubuntu 11.10) y también establezca los valores correctos para la debconfbase de datos. Intenté 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 de hecho 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

Entonces, por ahora, lo estoy haciendo jugando con los archivos /etc/localtimey /etc/timezonedirectamente, pero prefiero la forma dpkg-reconfigurey debconf.

Respuesta1

La forma más sencilla que conozco es:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata

Respuesta2

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 es benigno.

Entonces, la "forma debconf" 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 el usuario se entrometió manualmente con las zonas horarias, se comportará de manera diferente.

EXTRA

Para depurar un problema similar usted mismo, 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 te mostraría que con fuerzaCONJUNTOSlos valores antes de pedírselos al usuario (sobrescribiendo así los valores establecidos con debconf-set-selections).

Luego cambiaría shebang de /var/lib/dpkg/info/tzdata.configa #!/bin/shy #!/bin/sh -xseguiría el flujo del programa, donde vería que lo hace:

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

mirando /var/lib/dpkg/info/tzdata.configencontraras 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 la respuesta de @fiction. Además, si busca más en el script, encontrará que la respuesta de @andrekeller también funciona en versiones más nuevas de Debian si elimina '/etc/localtime'.

Con suerte, esta ayuda de depuración le ayudará cuando la próxima versión de Debian haga que el script sea aún más inteligente y las respuestas existentes también dejen de ser válidas. Puede encontrar más información sobre la depuración de debconf endebconf-desarrollo(7)

Respuesta3

Acabo de descubrir que con Debian Stretch (9) también necesitas cambiar /etc/localtime, por lo tanto, algo como:

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

es necesario. Modificarla respuesta de andrekellernecesitas:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata

información relacionada