Aby użyć debconf, przed wywołaniem dpkg-reconfigure, musisz również usunąć /etc/localtime
i /etc/timezone
. Uważaj również na możliwą dodatkową przestrzeń (jak w twoim pytaniu!), Która nie jest łagodna.
Tak więc „sposobem debconf”, który działa (w Debian Stretch), byłoby:
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
Powodem jest to, że skrypt konfiguracyjny tzdata próbuje być inteligentny i jeśli kiedykolwiek był wcześniej skonfigurowany lub użytkownik ręcznie wtrącał się do stref czasowych, będzie zachowywać się inaczej.
DODATKOWY
Aby samodzielnie debugować podobny problem, najpierw wykonaj następujące czynności:
export DEBCONF_DEBUG=developer
które zapewniłyby następujące informacje:
# 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
co pokazałoby, że wymusza ustawianie wartości, zanim poprosi o nie użytkownika (w ten sposób nadpisując wartości, które ustawiłeś debconf-set-selections
).
Następnie zmieniłbyś shebang /var/lib/dpkg/info/tzdata.config
z #!/bin/sh
na #!/bin/sh -x
i śledził przebieg programu, gdzie zobaczysz, że to robi:
+ [ -L /etc/localtime ]
+ readlink /etc/localtime
+ TIMEZONE=/usr/share/zoneinfo/Etc/UTC
patrząc na /var/lib/dpkg/info/tzdata.config
to znajdziesz:
# If /etc/localtime is a link, update /etc/timezone
if [ -L /etc/localtime ] ; then
TIMEZONE="$(readlink /etc/localtime)"
co wyjaśnia, dlaczego działa odpowiedź @ fiction. Przyglądając się bardziej w skrypcie, okazałoby się, że odpowiedź @andrekeller działa również w nowszych wersjach Debiana, jeśli usuniesz „/ etc / localtime”.
Mam nadzieję, że ta pomoc w debugowaniu pomoże ci, gdy następna wersja Debiana sprawi, że skrypt będzie jeszcze mądrzejszy, a istniejące odpowiedzi również staną się nieprawidłowe. Więcej informacji na temat debugowania debconf można znaleźć w debconf-devel (7)