changement de fuseau horaire avec dpkg-reconfigure tzdata et debconf-set-selections

18

Je veux configurer un script qui modifie automatiquement le fuseau horaire sur une machine (exécutant ubuntu 11.10) et définit également les bonnes valeurs dans la debconfbase de données. J'ai essayé ce qui suit, mais cela ne fonctionne pas (à la fin, le fuseau horaire actuel reste inchangé, et si j'exécute manuellement la dpkg-reconfigure tzdatacommande, 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, maintenant, je le fais en jouant avec les fichiers /etc/localtimeet /etc/timezonedirectement, mais je préfère la méthode dpkg-reconfigureet la debconfmanière.

Carlos Campderrós
la source

Réponses:

26

Le moyen le plus simple que je connaisse est:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
andrekeller
la source
wbat signifie les paramètres de dpkg-reconfigure?
serengeti12
5
N'oubliez pas que les processus en cours d'exécution peuvent ne pas reprendre la modification sans redémarrage. Par exemple, les horodatages des journaux des démons de serveur sont susceptibles d'être erronés jusqu'à ce que vous redémarriez les démons.
mc0e
6

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 la réponse d'Andrekeller, vous devez:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
fiction
la source
J'ai sauvé ma journée! D'autres solutions ne fonctionnent pas dans Debian 9
Brandon
2
En fait, seule la liaison de etc / localtime est nécessaire, car l'appel à dpkg-reconfigure définira / etc / timezone correctement
Daniel Dinnyes
@DanielDinnyes ou bien vous pouvez remplacer cette ln -fs ....ligne disgracieuse par simple rm -f /etc/localtime, et cela fonctionnera toujours (et debconf recréerait /etc/localtimeavec des valeurs correctes); voir ma réponse pour plus de détails.
Matija Nalis
4

Pour utiliser debconf, avant d'appeler dpkg-reconfigure, vous devez également supprimer /etc/localtimeet /etc/timezone. Attention également aux éventuels espaces supplémentaires (comme dans votre question!) Qui ne sont pas bénins.

Donc, "façon debconf" qui fonctionne (dans 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 en est que le script de configuration tzdata essaie d'être intelligent, et s'il a déjà été configuré auparavant ou si l'utilisateur a manipulé manuellement les fuseaux horaires, il se comportera différemment.

SUPPLÉMENTAIRE

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

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

ce qui vous montrerait qu'il définit avec force les valeurs avant de les demander à l'utilisateur (écrasant ainsi les valeurs que vous définissez avec debconf-set-selections).

Ensuite, vous changeriez le shebang /var/lib/dpkg/info/tzdata.configde #!/bin/shen #!/bin/sh -x, et suivriez le déroulement du programme, où vous verriez qu'il le fait:

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

en regardant, /var/lib/dpkg/info/tzdata.configvous trouverez ceci:

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

ce qui explique pourquoi la réponse @fiction fonctionne. En regardant plus dans le script, vous constaterez que la réponse @andrekeller fonctionne également dans les versions Debian plus récentes si vous supprimez '/ etc / localtime'.

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

Matija Nalis
la source