Для использования debconf перед вызовом dpkg -configure вам также необходимо удалить /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
).
Тогда вы измените shebang в /var/lib/dpkg/info/tzdata.config
из #!/bin/sh
to #!/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).