マシン (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
/etc/localtime
debconf を使用する場合は、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