使用 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。也要注意可能的額外空間(如您的問題!),這不是良性的。

所以(在 ​​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.configfrom更改#!/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-開發(7)

答案3

我剛剛發現使用 Debian Stretch (9) 您還需要更改 /etc/localtime,因此類似於:

ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime

是需要的。修改安德雷凱勒的回答你需要:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata

相關內容