web-dev-qa-db-fra.com

Modification du fuseau horaire avec DPKG-Reconfigure TzData et Debconf-Set-Set-Set-Set

Je souhaite configurer un script qui modifie automatiquement le fuseau horaire sur une machine (exécutant Ubuntu 11.10) et définit également les bonnes valeurs à la base de données debconf. J'ai essayé ce qui suit, mais cela ne fonctionne pas (à la fin, le fuseau horaire actuel reste inchangé et si je cours manuellement le dpkg-reconfigure tzdata commande, les valeurs sélectionnées sont en effet les anciennes):

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

Donc, à présent, je le fais en train de jouer avec les fichiers /etc/localtime et /etc/timezone directement, mais je préfère préférer le dpkg-reconfigure et debconf way.

18

La façon la plus simple que je connaisse est:

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

Je viens de découvrir qu'avec Debian Stretch (9), vous devez également changer/etc/localtime, donc quelque chose comme:

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

est nécessaire. Pour modifier Andrekeller's Reshant Vous avez besoin:

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

Pour utiliser DEBCONF, avant d'appeler DPKG-RECONFIGURE, vous devez également supprimer /etc/localtime et /etc/timezone. Aussi méfiez-vous d'un espace supplémentaire possible (comme dans votre question!) Qui ne sont pas bénignes.

Donc, "debconf Way" qui fonctionne (à Debian Stretch) serait:

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 raison est que le script de configuration TZData essaie d'être intelligent et s'il a déjà été configuré auparavant ou que l'utilisateur a été interdelé manuellement avec des fuseaux horaires, se comportera différemment.

[~ # ~] extra [~ # ~]

Pour déboguer vous-même un problème similaire, vous feriez d'abord faire:

export  DEBCONF_DEBUG=developer

qui fournirait les informations suivantes:

# 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

qui vous montrerait que cela définit les valeurs avant de les demander à l'utilisateur (donc écraser les valeurs que vous avez définies avec debconf-set-selections).

Ensuite, vous changeriez Shebang en /var/lib/dpkg/info/tzdata.config de #!/bin/shà #!/bin/sh -x et suivez le flux de programme, où vous verriez que cela fait:

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

regarder /var/lib/dpkg/info/tzdata.config Vous trouverez ceci:

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

ce qui explique pourquoi @FICTION Répondre fonctionne. Vous trouverez également dans le script plus, vous constatez que @andrekeller répondre fonctionne également dans les versions de Debian plus récentes si vous supprimez '/ etc/localtime'.

Espérons que cette aide de débogage vous aidera lorsque la prochaine version de Debian rend le script encore plus intelligent et les réponses existantes sont également invalides. Plus d'informations sur le débogage debconf peuvent être trouvées dans Debconf-devel (7)

4
Matija Nalis