изменение часового пояса с помощью dpkg-reconfigure tzdata и debconf-set-selections

изменение часового пояса с помощью dpkg-reconfigure tzdata и debconf-set-selections

Я хочу настроить скрипт, который автоматически меняет часовой пояс на машине (работающей под управлением 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.

решение1

Самый простой способ, который я знаю, это:

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

решение2

Для использования debconf, перед вызовом dpkg-reconfigure, вам также необходимо удалить /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 пытается быть умным, и если он когда-либо был настроен ранее или пользователь вручную вмешивался в часовые пояса, то он будет вести себя по-другому.

ДОПОЛНИТЕЛЬНЫЙ

Чтобы самостоятельно устранить подобную проблему, вам сначала следует сделать следующее:

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).

Затем вы измените shebang с /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)

решение3

Я только что узнал, что в 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

Связанный контент