изменение часового пояса с Dpkg-переконфигурировать tzdata и Debconf-SET-выборов

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
andrekeller
источник
wbat сделать параметры для Dpkg-переконфигурировать среднее?
serengeti12
5
Имейте в виду , что запущенные процессы не могут забрать изменения без перезагрузки. Журнал меток времени , например , от сервера демонами, вероятно, будет неправильно , пока вы не перезапустите демон.
mc0e
6

Я только что узнал, что с Debian Stretch (9), необходимо также изменить / и т.д. / 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
Brandon
2
На самом деле только ссылки и т.д. / LocalTime требуется, как вызов Dpkg-перенастроить будет установлен / и т.д. / часовой пояс правильно
Daniel Dinnyes
@DanielDinnyes или в качестве альтернативы вы можете заменить эту неуклюжую ln -fs ....линию с простым rm -f /etc/localtime, и он все равно будет работать (и Debconf бы воссоздать /etc/localtimeправильные значения); см мой ответ для деталей.
Матия Nalis
4

Для использования Debconf, перед вызовом DPKG-переконфигурируйте, вам необходимо также удалить /etc/localtimeи /etc/timezone. Также остерегайтесь возможного дополнительного пространства (как в вашем вопросе!) , Которые не являются доброкачественными.

Так «Debconf путь», который работает (в 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 конфигурационного скрипт пытается быть умным, и если он когда-либо настроен перед или пользователем вручную вмешивался часовыми поясами, будет вести себя по-разному.

EXTRA

Для отладки подобной проблемы самостоятельно, вы бы сначала сделать:

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, если вы удалите / и т.д. / МестноеВремя '.

Надеюсь , эта помощь отладки поможет вам при следующей версии Debian делает сценарий еще умнее и существующие ответы стали недействительными тоже. Более подробную информацию по отладке Debconf можно найти в Debconf-разви (7)

Матия Nalis
источник