mengubah zona waktu dengan dpkg-mengkonfigurasi ulang tzdata dan debconf-set-selection

18

Saya ingin mengatur skrip yang secara otomatis mengubah zona waktu pada mesin (menjalankan ubuntu 11.10) dan juga menetapkan nilai yang tepat ke debconfdatabase. Saya sudah mencoba yang berikut ini, tetapi tidak berfungsi (pada akhirnya, zona waktu saat ini tetap tidak berubah, dan jika saya menjalankan dpkg-reconfigure tzdataperintah secara manual , nilai yang dipilih memang yang lama):

#!/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

Jadi, sekarang, saya melakukannya mengacaukan file /etc/localtimedan /etc/timezonesecara langsung, tetapi saya lebih suka dpkg-reconfiguredan debconfcara.

Carlos Campderrós
sumber

Jawaban:

26

Cara paling sederhana yang saya tahu adalah:

echo "Europe/Zurich" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata
andrekeller
sumber
Bagaimana parameter untuk mengkonfigurasi ulang dpkg berarti?
serengeti12
5
Ketahuilah bahwa proses yang berjalan mungkin tidak mengambil perubahan tanpa memulai ulang. Misalnya, log cap waktu dari daemon server cenderung salah sampai Anda me-restart daemon.
mc0e
6

Saya baru tahu bahwa dengan Debian Stretch (9) Anda juga perlu mengubah / etc / localtime, jadi sesuatu seperti:

ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime

dibutuhkan. Untuk mengubah jawaban andrekeller, Anda perlu:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
fiksi
sumber
Selamatkan hari saya! Solusi lain tidak berfungsi di Debian 9
Brandon
2
Sebenarnya hanya menautkan etc / localtime diperlukan, karena memanggil dpkg-mengkonfigurasi ulang akan mengatur / etc / timezone dengan benar
Daniel Dinnyes
@DanielDinnyes atau Anda dapat mengganti ln -fs ....baris yang tidak sesuai dengan yang sederhana rm -f /etc/localtime, dan itu akan tetap berfungsi (dan debconf akan dibuat ulang /etc/localtimedengan nilai yang benar); lihat jawaban saya untuk detail.
Matija Nalis
4

Untuk menggunakan debconf, sebelum memanggil dpkg-reconfigure, Anda juga harus menghapus /etc/localtimedan /etc/timezone. Waspadalah terhadap kemungkinan ruang tambahan (seperti dalam pertanyaan Anda!) Yang tidak jinak.

Jadi "cara debconf" yang berfungsi (dalam Debian Stretch) adalah:

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

Alasannya adalah bahwa skrip tzdata config mencoba menjadi pintar, dan jika skrip tersebut dikonfigurasi sebelumnya atau pengguna secara manual ikut campur dengan zona waktu, akan berperilaku berbeda.

TAMBAHAN

Untuk men-debug sendiri masalah yang serupa, pertama-tama Anda harus:

export  DEBCONF_DEBUG=developer

yang akan memberikan info berikut:

# 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

yang akan menunjukkan kepada Anda bahwa ia secara paksa SET nilai-nilai sebelum meminta pengguna untuk mereka (sehingga menimpa nilai-nilai yang Anda tetapkan dengan debconf-set-selections).

Kemudian Anda akan mengubah shebang /var/lib/dpkg/info/tzdata.configdari dari #!/bin/shke #!/bin/sh -x, dan mengikuti alur program, di mana Anda akan melihat bahwa itu berubah :

+ [ -L /etc/localtime ]
+ readlink /etc/localtime
+ TIMEZONE=/usr/share/zoneinfo/Etc/UTC

melihat /var/lib/dpkg/info/tzdata.configAnda akan menemukan ini:

# If /etc/localtime is a link, update /etc/timezone
if [ -L /etc/localtime ] ; then
    TIMEZONE="$(readlink /etc/localtime)"

yang menjelaskan mengapa jawaban fiksi bekerja. Juga mencari di skrip lebih lanjut, Anda akan menemukan bahwa jawaban @andrekeller juga berfungsi di versi Debian yang lebih baru jika Anda menghapus '/ etc / localtime'.

Semoga bantuan debugging ini akan membantu Anda ketika versi Debian berikutnya membuat skrip menjadi lebih pintar dan jawaban yang ada menjadi tidak valid juga. Info lebih lanjut tentang debugging debconf dapat ditemukan di debconf-devel (7)

Matija Nalis
sumber