マシン(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
の方法。
私が知っている最も簡単な方法は次のとおりです。
echo "Europe/Zurich" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata
Debian Stretch(9)では、/ etc/localtimeも変更する必要があることがわかりました。つまり、次のようになります。
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
必要です。 andrekeller's answer を修正するには、次のものが必要です。
echo "Europe/Zurich" > /etc/timezone
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
Debconfを使用するには、dpkg-reconfigureを呼び出す前に、/etc/localtime
と/etc/timezone
も削除する必要があります。また、良性ではない可能性のある余分なスペース(あなたの質問のように!)にも注意してください。
したがって、(Debian Stretchで)機能する「debconfway」は次のようになります。
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構成スクリプトがスマートにしようとし、以前に構成された場合、またはユーザーが手動でタイムゾーンをいじったことがある場合は、動作が異なるためです。
[〜#〜] extra [〜#〜]
同様の問題を自分でデバッグするには、まず次のようにします。
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
これは、ユーザーに値を要求する前に、値を強制的にSETすることを示します(したがって、debconf-set-selections
で設定した値を上書きします)。
次に、/var/lib/dpkg/info/tzdata.config
のShebangを#!/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) を参照してください。