使用dpkg-reconfigure tzdata和debconf-set-selections更改时区


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

Answers:


26

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

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

wbat dpkg-reconfigure的参数是什么意思?
serengeti12 2013年

5
请注意,如果不重新启动,正在运行的进程可能无法获取更改。例如,在重新启动守护程序之前,服务器守护程序的日志时间戳可能是错误的。
mc0e 2014年

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中不起作用
Brandon

2
实际上只需要链接etc / localtime,因为调用dpkg-reconfigure将正确设置/ etc / timezone
Daniel Dinnyes '17

@DanielDinnyes或您也可以ln -fs ....用simple 替换该行rm -f /etc/localtime,它仍然可以工作(并且debconf将/etc/localtime使用正确的值重新创建);请参阅我的答案以获取详细信息。
Matija Nalis

4

要使用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答案有效。同样在脚本中查找更多,您会发现,如果删除“ / etc / localtime”,则@andrekeller答案在较新的Debian版本中也适用。

希望当下一个Debian版本使脚本更智能并且现有答案也无效时,此调试帮助将对您有所帮助。可以在debconf-devel(7)中找到有关调试debconf的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.