Car*_*rós 20 debian dpkg time-zone ubuntu
我想设置一个脚本来自动更改机器上的时区(运行 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
Run Code Online (Sandbox Code Playgroud)
所以,现在,我做它与文件搞乱/etc/localtime和/etc/timezone直接,但我宁愿喜欢dpkg-reconfigure和debconf方式。
and*_*ler 26
我所知道的最简单的方法是:
echo "Europe/Zurich" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata
Run Code Online (Sandbox Code Playgroud)
要使用 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
Run Code Online (Sandbox Code Playgroud)
原因是 tzdata 配置脚本试图变得聪明,如果之前配置过或者用户手动干预时区,则行为会有所不同。
额外的
要自己调试类似的问题,您首先要执行以下操作:
export DEBCONF_DEBUG=developer
Run Code Online (Sandbox Code Playgroud)
这将提供以下信息:
# 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
Run Code Online (Sandbox Code Playgroud)
它会告诉你,这有力地就设置询问它们的用户(从而覆盖您设置的值前值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
Run Code Online (Sandbox Code Playgroud)
看看 /var/lib/dpkg/info/tzdata.config你会发现:
# If /etc/localtime is a link, update /etc/timezone
if [ -L /etc/localtime ] ; then
TIMEZONE="$(readlink /etc/localtime)"
Run Code Online (Sandbox Code Playgroud)
这解释了为什么@fiction 答案有效。另外查看脚本,您会发现如果删除“/etc/localtime”,@andrekeller 的答案也适用于较新的 Debian 版本。
希望这个调试帮助能在下一个版本的 Debian 使脚本更加智能并且现有答案也变得无效时对您有所帮助。有关调试 debconf 的更多信息可以在debconf-devel(7) 中找到
小智 7
我刚刚发现使用 Debian Stretch (9) 您还需要更改 /etc/localtime,因此类似于:
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
Run Code Online (Sandbox Code Playgroud)
需要。要修改andrekeller 的答案,您需要:
echo "Europe/Zurich" > /etc/timezone
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10819 次 |
| 最近记录: |