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

/etc/localtimedebconf を使用する場合は、dpkg-reconfigure を呼び出す前に、およびも削除する必要があります/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

それは強制的にSETsユーザーに値を要求する前に を返します (これにより、 で設定した値が上書きされます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

関連情報