dpkg-reconfigure tzdataおよびdebconf-set-selectionsでタイムゾーンを変更する


18

マシンのタイムゾーンを自動的に変更し(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道を。

回答:


26

私が知っている最も簡単な方法は:

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

wbat dpkg-reconfigureのパラメーターはどういう意味ですか?
serengeti12

5
実行中のプロセスは、再起動しないと変更を反映しない可能性があることに注意してください。例えば、サーバーデーモンからのログタイムスタンプは、デーモンを再起動するまで間違っている可能性があります。
mc0e 14年

6

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

私の一日を救った!他のソリューションはDebian 9では機能しません
ブランドン

2
dpkg-reconfigureを呼び出すと/ etc / timezoneが正しく設定されるため、実際にはetc / localtimeのリンクだけが必要です
ダニエル・ディニース

@DanielDinnyesまたは代わりに、その不格好なln -fs ....行をsimpleに置き換えることができrm -f /etc/localtime、それでも動作します(そしてdebconfは/etc/localtime正しい値で再作成します)。詳細については私の答えをご覧ください。
マティヤナリス

4

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)。

次に、シェバンを/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 answerが機能する理由を説明しています。また、スクリプトをさらに調べると、「/ etc / localtime」を削除すると、@ andrekellerの回答が新しいDebianバージョンでも機能することがわかります。

Debianの次のバージョンがスクリプトをさらに賢くし、既存の回答も無効になったときに、このデバッグヘルプが役立つことを願っています。debconfのデバッグに関する詳細は、debconf-devel(7)にあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.