thay đổi múi giờ với các lựa chọn dpkg-cấu hình lại tzdata và các lựa chọn gỡ lỗi


18

Tôi muốn thiết lập một tập lệnh tự động thay đổi múi giờ trên máy (chạy Ubuntu 11.10) và cũng đặt các giá trị phù hợp cho debconfcơ sở dữ liệu. Tôi đã thử các cách sau, nhưng nó không hoạt động (cuối cùng, múi giờ hiện tại vẫn không thay đổi và nếu tôi chạy thủ công dpkg-reconfigure tzdatalệnh, các giá trị được chọn thực sự là các giá trị cũ):

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

Vì vậy, đến bây giờ, tôi đang làm nó rối tung với các tập tin /etc/localtime/etc/timezonetrực tiếp, nhưng tôi thích cách dpkg-reconfiguredebconfcách hơn.

Câu trả lời:


26

Cách đơn giản nhất mà tôi biết là:

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

wbat làm các tham số để dpkg-cấu hình lại có nghĩa là gì?
serengeti12

5
Xin lưu ý rằng các quy trình đang chạy có thể không nhận thay đổi mà không khởi động lại. Ví dụ: dấu thời gian đăng nhập từ trình nền của máy chủ có thể bị sai cho đến khi bạn khởi động lại trình nền.
mc0e

6

Tôi vừa phát hiện ra rằng với Debian Stretch (9), bạn cũng cần thay đổi / etc / localtime, do đó, đại loại như:

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

là cần thiết. Để sửa đổi câu trả lời của andrekeller, bạn cần:

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

Cứu ngày của tôi! Các giải pháp khác không hoạt động trong Debian 9
Brandon

2
Trên thực tế chỉ cần liên kết vv / giờ địa phương là cần thiết, vì việc gọi dpkg-
recfigure

@DanielDinnyes hoặc cách khác, bạn có thể thay thế ln -fs ....dòng vô duyên đó bằng đơn giản rm -f /etc/localtime, và nó vẫn hoạt động (và debconf sẽ tạo lại /etc/localtimevới các giá trị chính xác); xem câu trả lời của tôi để biết chi tiết.
Matija Nalis

4

Để sử dụng debconf, trước khi gọi dpkg-cấu hình lại, bạn cũng cần xóa /etc/localtime/etc/timezone. Ngoài ra, hãy cẩn thận với không gian thừa có thể (như trong câu hỏi của bạn!) Không lành tính.

Vì vậy, "cách gỡ lỗi" hoạt động (trong Debian Stretch) sẽ là:

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

Lý do là tập lệnh cấu hình tzdata cố gắng trở nên thông minh và nếu nó đã được cấu hình trước đó hoặc người dùng đã tự điều chỉnh bằng các múi giờ, sẽ hành xử khác đi.

THÊM

Để tự gỡ lỗi vấn đề tương tự, trước tiên bạn sẽ làm:

export  DEBCONF_DEBUG=developer

cung cấp thông tin sau:

# 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

trong đó sẽ cho bạn thấy rằng nó mạnh mẽ bộ các giá trị trước khi yêu cầu người dùng cho họ (do đó ghi đè lên giá trị mà bạn thiết lập với debconf-set-selections).

Sau đó, bạn sẽ thay đổi shebang /var/lib/dpkg/info/tzdata.configtừ #!/bin/shsang #!/bin/sh -xvà theo dòng chương trình, nơi bạn sẽ thấy rằng nó thực hiện:

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

nhìn vào /var/lib/dpkg/info/tzdata.configbạn sẽ thấy điều này:

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

trong đó giải thích tại sao câu trả lời @fiction hoạt động. Cũng tìm kiếm trong tập lệnh nhiều hơn, bạn sẽ thấy rằng câu trả lời @andrekeller cũng hoạt động trong các phiên bản Debian mới hơn nếu bạn xóa '/ etc / localtime'.

Hy vọng rằng trợ giúp gỡ lỗi này sẽ giúp bạn khi phiên bản Debian tiếp theo làm cho tập lệnh thậm chí thông minh hơn và các câu trả lời hiện tại cũng trở nên không hợp lệ. Thông tin thêm về gỡ lỗi gỡ lỗi có thể được tìm thấy trong debconf-devel (7)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.