การเปลี่ยนเขตเวลาด้วย dpkg-reconfigure tzdata และ debconf-set-selections


18

ฉันต้องการตั้งค่าสคริปต์ที่จะเปลี่ยนเขตเวลาโดยอัตโนมัติในเครื่อง (รันอูบุนตู 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วิธี

คำตอบ:


26

วิธีที่ง่ายที่สุดที่ฉันรู้คือ:

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

wbat ทำพารามิเตอร์เพื่อ dpkg-reconfigure หมายความว่าอย่างไร
serengeti12

5
โปรดทราบว่ากระบวนการที่ทำงานอยู่อาจไม่สามารถรับการเปลี่ยนแปลงได้โดยไม่ต้องรีสตาร์ท ตัวอย่างเช่นบันทึกเวลาจากเซิร์ฟเวอร์ daemons มีแนวโน้มที่จะผิดจนกว่าคุณจะเริ่มต้น daemons ใหม่
mc0e

6

ฉันเพิ่งค้นพบว่าด้วย Debian Stretch (9) คุณต้องเปลี่ยน / etc / localtime ด้วยเช่นกัน:

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

มันจำเป็น. หากต้องการแก้ไขคำตอบของผู้ทดสอบคุณจำเป็นต้อง:

echo "Europe/Zurich" > /etc/timezone 
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata

บันทึกวันของฉัน! โซลูชันอื่น ๆ ไม่สามารถใช้งานได้ใน Debian 9
Brandon

2
จริงๆแล้วการเชื่อมโยง etc / localtime เป็นสิ่งที่จำเป็นเท่านั้นเนื่องจากการเรียก dpkg-reconfigure จะตั้งค่า / etc / timezone ให้ถูกต้อง
Daniel Dinnyes

@DanielDinnyes หรืออีกวิธีหนึ่งคุณสามารถแทนที่ที่ไม่ln -fs ....ตรงกับบรรทัดอย่างเรียบง่ายrm -f /etc/localtimeและมันจะยังคงใช้งานได้ (และ debconf จะสร้างใหม่/etc/localtimeด้วยค่าที่ถูกต้อง); ดูคำตอบของฉันสำหรับรายละเอียด
Matija Nalis

4

สำหรับการใช้ debconf, ก่อนที่จะเรียก dpkg-กำหนดค่าคุณจะต้องยังเอาและ/etc/localtime /etc/timezoneนอกจากนี้ระวังพื้นที่พิเศษที่อาจเกิดขึ้น (เช่นในคำถามของคุณ!) ซึ่งไม่เป็นพิษเป็นภัย

ดังนั้น "วิธี debconf" ที่ใช้งานได้ (ใน Debian Stretch) จะเป็น:

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

ซึ่งจะแสดงให้คุณเห็นว่ามันอย่างแข็งขันชุดค่าก่อนที่จะขอให้ผู้ใช้สำหรับพวกเขา (ค่าจึงเขียนทับคุณตั้งค่าด้วย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 จึงใช้ได้ หากมองในสคริปต์มากกว่านี้คุณจะพบว่า @andrekeller answer ยังทำงานในเวอร์ชัน Debian ที่ใหม่กว่าหากคุณลบ '/ etc / localtime'

หวังว่าการแก้จุดบกพร่องนี้จะช่วยคุณเมื่อ Debian เวอร์ชันต่อไปทำให้สคริปต์ทำงานได้อย่างชาญฉลาดยิ่งขึ้นและคำตอบที่มีอยู่ก็ไม่ถูกต้องเช่นกัน ข้อมูลเพิ่มเติมเกี่ยวกับการดีบัก debconf สามารถพบได้ในdebconf-devel (7)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.