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

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

Ich möchte ein Skript einrichten, das die Zeitzone auf einem Computer (mit Ubuntu 11.10) automatisch ändert und auch die richtigen Werte in der debconfDatenbank einstellt. Ich habe Folgendes versucht, aber es funktioniert nicht (am Ende bleibt die aktuelle Zeitzone unverändert, und wenn ich den Befehl manuell ausführe dpkg-reconfigure tzdata, sind die ausgewählten Werte tatsächlich 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

Bisher habe ich es also so gemacht, dass ich direkt mit den Dateien /etc/localtimeund herumspiele /etc/timezone, aber ich bevorzuge die dpkg-reconfigureund- debconfMethode.

Antwort1

Der einfachste Weg, den ich kenne, ist:

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

Antwort2

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 Speicherplatz (wie in Ihrer Frage!), der nicht harmlos ist.

Der „Debconf-Weg“, der (in Debian Stretch) funktioniert, wäre also:

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 bereits konfiguriert wurde oder der Benutzer manuell in die Zeitzonen eingegriffen hat.

EXTRA

Um ein ähnliches Problem selbst zu beheben, würden Sie zunächst Folgendes tun:

export  DEBCONF_DEBUG=developer

Dies würde folgende Informationen liefern:

# 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

was Ihnen zeigen würde, dass es mit NachdruckSETsdie Werte, bevor sie den Benutzer danach fragen (und so die von Ihnen mit festgelegten Werte überschrieben werden debconf-set-selections).

Anschließend ändern Sie „shebang“ /var/lib/dpkg/info/tzdata.configvon #!/bin/shin #!/bin/sh -xund folgen dem Programmablauf. Sie sehen dort Folgendes:

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

Wenn Sie sich das ansehen, /var/lib/dpkg/info/tzdata.configwerden Sie Folgendes feststellen:

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

was erklärt, warum die @fiction-Antwort funktioniert. Wenn Sie sich das Skript genauer ansehen, werden Sie feststellen, dass die @andrekeller-Antwort auch in neueren Debian-Versionen funktioniert, wenn Sie „/etc/localtime“ entfernen.

Hoffentlich hilft Ihnen diese Debugging-Hilfe, 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 indebconf-devel(7)

Antwort3

Ich habe gerade herausgefunden, dass man bei Debian Stretch (9) auch /etc/localtime ändern muss, also so etwas wie:

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

ist erforderlich. Zur ÄnderungAndrekellers Antwortdu brauchst:

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

verwandte Informationen