Ändern der Zeitzone mit dpkg-reconfigure tzdata und debconf-set-selections

18

Ich möchte ein Skript einrichten, mit dem die Zeitzone auf einem Computer automatisch geändert wird (unter Ubuntu 11.10) und die richtigen Werte für die debconfDatenbank festgelegt werden. Ich habe Folgendes versucht, aber es funktioniert nicht (am Ende bleibt die aktuelle Zeitzone unverändert, und wenn ich den dpkg-reconfigure tzdataBefehl manuell ausführe , sind die ausgewählten Werte in der Tat die alten):

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

Also, jetzt mache ich es mit den Dateien /etc/localtimeund /etc/timezonedirekt, aber ich bevorzuge lieber die dpkg-reconfigureund debconfWeise.

Carlos Campderrós
quelle

Antworten:

26

Der einfachste Weg, den ich kenne, ist:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
andrekeller
quelle
Was bedeuten die Parameter für dpkg-reconfigure?
Serengeti12
5
Beachten Sie, dass laufende Prozesse die Änderung möglicherweise nicht ohne Neustart übernehmen. Beispielsweise sind Protokollzeitstempel von Server-Daemons wahrscheinlich falsch, bis Sie die Daemons neu starten.
mc0e
6

Ich habe gerade herausgefunden, dass Sie mit Debian Stretch (9) auch / etc / localtime ändern müssen, also so etwas wie:

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

wird gebraucht. Um die Antwort von andrekeller zu ändern, benötigen Sie:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
Fiktion
quelle
Rettete meinen Tag! Andere Lösungen funktionieren in Debian 9
Brandon
2
Eigentlich wird nur die Verknüpfung von etc / localtime benötigt, da der Aufruf von dpkg-
reconfigure
@DanielDinnyes oder alternativ können Sie diese unsaubere ln -fs ....Zeile durch simple ersetzen rm -f /etc/localtime, und es wird immer noch funktionieren (und debconf würde /etc/localtimemit korrekten Werten neu erstellen ); Siehe meine Antwort für Details.
Matija Nalis
4

Um debconf zu verwenden, müssen Sie vor dem Aufruf von dpkg-reconfigure auch /etc/localtimeund entfernen /etc/timezone. Achten Sie auch auf möglichen zusätzlichen Platz (wie in Ihrer Frage!), Der nicht harmlos ist.

Also "debconf way", das funktioniert (in Debian Stretch), wäre:

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

Der Grund dafür ist, dass das tzdata-Konfigurationsskript versucht, intelligent zu sein, und sich anders verhält, wenn es zuvor konfiguriert wurde oder der Benutzer sich manuell in Zeitzonen eingemischt hat.

EXTRA

Um ein ähnliches Problem selbst zu beheben, führen Sie zunächst Folgendes aus:

export  DEBCONF_DEBUG=developer

die folgende Informationen bereitstellen würde:

# 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

Dies würde Ihnen zeigen, dass die Werte gewaltsam gesetzt werden, bevor der Benutzer danach gefragt wird (wodurch die von Ihnen eingestellten Werte überschrieben werden debconf-set-selections).

Dann würden Sie shebang in ändern /var/lib/dpkg/info/tzdata.configaus #!/bin/shzu #!/bin/sh -x, und der Programmablauf folgen, wo Sie würden sehen , dass es funktioniert:

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

Wenn /var/lib/dpkg/info/tzdata.configSie sich das ansehen, werden Sie folgendes finden:

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

Das erklärt, warum @fiction answer funktioniert. Wenn Sie sich das Skript genauer ansehen, werden Sie feststellen, dass @andrekeller answer auch in neueren Debian-Versionen funktioniert, wenn Sie '/ etc / localtime' entfernen.

Hoffentlich hilft Ihnen diese Hilfe beim Debuggen, wenn die nächste Version von Debian das Skript noch intelligenter macht und vorhandene Antworten ebenfalls ungültig werden. Weitere Informationen zum Debuggen von debconf finden Sie in debconf-devel (7).

Matija Nalis
quelle