使用 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-reconfiguredebconf方式。

答案1

我知道的最简单的方法是:

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

答案2

要使用 debconf,在调用 dpkg-reconfigure 之前,您还需要删除/etc/localtime/etc/timezone。还要注意可能的额外空间(如您的问题!),它们不是良性的。

因此,在 Debian Stretch 中,可行的“debconf 方式”将是:

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 答案有效。另外,进一步查看脚本,您会发现如果删除“/etc/localtime”,@andrekeller 答案在较新的 Debian 版本中也有效。

希望当 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

相关内容