зміна часового поясу з dpkg-переналаштуванням tzdata та debconf-set-select


18

Я хочу встановити скрипт, який автоматично змінює часовий пояс на машині (під керуванням ubuntu 11.10), а також встановлює потрібні значення для debconfбази даних. Я спробував наступне, але це не працює (наприкінці поточний часовий пояс залишається незмінним, і якщо я запускаю dpkg-reconfigure tzdataкоманду вручну , вибрані значення дійсно старі):

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

Отже, на даний момент я роблю це возитися з файлами /etc/localtimeта /etc/timezoneбезпосередньо, але я вважаю за краще dpkg-reconfigureі debconfспосіб.

Відповіді:


26

Найпростіший спосіб, про який я знаю, це:

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

wbat означають параметри для перенастроювання dpkg?
serengeti12

5
Майте на увазі, що запущені процеси можуть не отримати зміни без перезавантаження. Наприклад, часові позначки журналу від демонів сервера, ймовірно, будуть помилковими, поки ви не перезапустите демон.
mc0e

6

Щойно я з'ясував, що з Debian Stretch (9) вам також потрібно змінити / etc / localtime, таким чином, щось на зразок:

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

потрібен. Щоб змінити відповідь andrekeller, вам потрібно:

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

Врятував мій день! Інші рішення не працюють у Debian 9
Брендон

2
Насправді потрібне лише з'єднання etc / localtime, оскільки виклик перенастроювання dpkg встановить / etc / timezone правильно
Daniel Dinnyes

@DanielDinnyes або альтернативно, ви можете замінити цю незрозумілу ln -fs ....лінію простою rm -f /etc/localtime, і вона все одно спрацює (і debconf відтворить /etc/localtimeз правильними значеннями); див. мою відповідь для деталей.
Matija Nalis

4

Для використання debconf перед тим, як зателефонувати в dpkg-переконфігурування, потрібно також видалити /etc/localtimeта /etc/timezone. Також остерігайтеся можливого додаткового місця (як у вашому питанні!), Яке не є доброякісним.

Отже, "deconcon way", який працює (в Debian Stretch), був би:

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

Причина полягає в тому, що скрипт tzdata config намагається бути розумним, і якщо він коли-небудь конфігурувався раніше або користувач вручну втручався в часові пояси, він буде вести себе по-різному.

ДОПОМОГА

Щоб налагодити подібну проблему самостійно, спершу зробіть:

export  DEBCONF_DEBUG=developer

яка б надала таку інформацію:

# 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

яка покаже вам , що він силою встановлює значення , перш ніж питати користувача для них (таким чином , перезапис значення, задані з debconf-set-selections).

Тоді ви змінили б хатину в /var/lib/dpkg/info/tzdata.configс #!/bin/shк #!/bin/sh -xі стежити за ходом програми, де ви бачите , що він робить:

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

дивлячись на /var/lib/dpkg/info/tzdata.configвас, ви побачите це:

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

що пояснює, чому працює відповідь @fiction. Також, дивлячись більше на сценарій, ви побачите, що відповідь @andrekeller також працює в новіших версіях Debian, якщо ви видалите '/ etc / localtime'.

Сподіваємось, ця допомога з налагодження допоможе вам, коли наступна версія Debian зробить сценарій ще розумнішим, а наявні відповіді також стануть недійсними. Більше інформації про налагодження debconf можна знайти в debconf-devel (7)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.