web-dev-qa-db-ja.com

dpkg-reconfiguretzdataと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の方法。

18

私が知っている最も簡単な方法は次のとおりです。

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
26
andrekeller

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
6
fiction

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) を参照してください。

4
Matija Nalis