zmiana strefy czasowej za pomocą dpkg-rekonfiguruj tzdata i debconf-set-selections

18

Chcę skonfigurować skrypt, który automatycznie zmienia strefę czasową na komputerze (z systemem Ubuntu 11.10), a także ustawia odpowiednie wartości dla debconfbazy danych. Próbowałem następujących rzeczy, ale to nie działa (na koniec bieżąca strefa czasowa pozostaje niezmieniona, a jeśli uruchomię dpkg-reconfigure tzdatapolecenie ręcznie , wybrane wartości są rzeczywiście stare):

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

Do tej pory robię to z bałaganem plików /etc/localtimei /etc/timezonebezpośrednio, ale wolałbym sposób dpkg-reconfigurei debconfsposób.

Carlos Campderrós
źródło

Odpowiedzi:

26

Najprostszy znany mi sposób to:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
andrekeller
źródło
wbat czy parametry do dpkg-rekonfigurować oznaczają?
serengeti12
5
Należy pamiętać, że uruchomione procesy mogą nie wykryć zmiany bez ponownego uruchomienia. Np. Rejestruj znaczniki czasu z demonów serwera prawdopodobnie będą niepoprawne, dopóki nie uruchomisz ponownie demonów.
mc0e
6

Właśnie odkryłem, że w Debian Stretch (9) musisz także zmienić / etc / localtime, a więc coś w stylu:

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

jest potrzebne. Aby zmienić odpowiedź andrekellera , potrzebujesz:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
fikcja
źródło
Uratowałem mój dzień! Inne rozwiązania nie działają w Debianie 9
Brandon
2
Właściwie potrzebne jest tylko łączenie etc / localtime, ponieważ wywołanie dpkg-reconfigure ustawi poprawnie / etc / timezone
Daniel Dinnyes
@DanielDinnyes lub alternatywnie możesz zastąpić tę niewygodną ln -fs ....linię prostą rm -f /etc/localtimei nadal będzie działać (i debconf odtworzy /etc/localtimez poprawnymi wartościami); szczegóły znajdziesz w mojej odpowiedzi.
Matija Nalis,
4

Aby użyć debconf, przed wywołaniem dpkg-reconfigure, musisz również usunąć /etc/localtimei /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.configz #!/bin/shna #!/bin/sh -xi ś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.configto 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)

Matija Nalis
źródło