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 debconf
Datenbank 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/localtime
und herumspiele /etc/timezone
, aber ich bevorzuge die dpkg-reconfigure
und- debconf
Methode.
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/localtime
und 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.config
von #!/bin/sh
in #!/bin/sh -x
und 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.config
werden 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