Phương thức không tương tác cho dpkg-cấu hình lại tzdata [đã đóng]


79

Khi lần đầu tiên tôi thiết lập một máy chủ Ubuntu, tôi chắc chắn rằng tôi aptitude install tzdata, sau đó dpkg-reconfigure tzdatađể tôi thiết lập múi giờ của tôi đúng.

Tôi đang cố gắng tự động hóa thiết lập máy chủ của mình bằng một tập lệnh và nhận thấy phần này tự động ném cờ lê vào nó, vì nó yêu cầu một phiên tương tác với sự can thiệp của người dùng.

Có cách nào để sử dụng dpkg-recfigure mà nó không tương tác không?

Câu trả lời:


66

Câu trả lời của swill không phải là cách nó được thực hiện đúng cách. Nếu bạn muốn cấu hình gói dpkg không được giám sát / tập lệnh, thì bạn muốn sử dụng cơ chế chèn sẵn debconf.

Trong trường hợp của bạn, điều này có nghĩa là bạn phải làm như sau:

  • đặt các biến môi trường sau để tránh debconf cố gắng hỏi người dùng bất kỳ câu hỏi nào:

    export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
    
  • sau đó chèn sẵn debconf với tệp preseed.txt sau (hoặc bất kỳ cài đặt nào khác mà bạn muốn):

    tzdata tzdata/Areas select Europe
    tzdata tzdata/Zones/Europe select Berlin
    
  • bạn đặt tệp chèn sẵn ở trên bằng cách chạy:

    debconf-set-selections /your/preseed.txt
    
  • bây giờ bạn có thể cài đặt tzdata (nếu nó chưa được cài đặt) thông qua apthoặc chạy dpkg-reconfigure. Cuối cùng, tzdata sẽ được thiết lập theo những gì bạn đã chỉ định trong tệp đính kèm debconf của mình.

Hãy nhớ rằng bạn có thể tự động hóa nhiều hơn bằng cách sử dụng chèn sẵn debconf. Ví dụ: trong preseeds của tôi, tôi luôn đặt:

locales locales/locales_to_be_generated multiselect     en_US.UTF-8 UTF-8
locales locales/default_environment_locale      select  en_US.UTF-8

Bạn luôn có thể kiểm tra cài đặt debconf của hệ thống hiện tại của mình bằng cách chạy debconf-get-selections. Đầu ra sẽ cung cấp cho bạn một số ý tưởng về mức độ cấu hình hệ thống mà bạn có thể tự động hóa bằng cách sử dụng chèn sẵn debconf.


4
Cuối cùng tôi vẫn phải gọi dpkg-reconfigurebằng -f noninteractive… (Ubuntu 12.04 LTS tại đây). Nếu không, hướng dẫn của bạn hoạt động tuyệt vời!
kgadek,

4
Hoạt động cài đặt trước tuyệt vời, nhưng tôi không nghĩ rằng điều này thực sự hoạt động đối với trường hợp pkg đã được cài đặt. AFAIK bạn phải loại bỏ pkg trước.
semisecure

3
@ S.Pinkus bạn nói đúng; cần phải gỡ bỏ /etc/{localtime,timezone}khi tzdata đã được cài đặt. Xem stackoverflow.com/a/39275359/161114 .
jah

Thực hiện điều này từ xa thông qua ssh:$ ssh node 'export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true;echo -e "tzdata tzdata/Areas select Europe\ntzdata tzdata/Zones/Europe select Amsterdam" > /tmp/tz ; sudo debconf-set-selections /tmp/tz; sudo rm /etc/localtime /etc/timezone; sudo dpkg-reconfigure -f non-interactive tzdata'
hbogert

3
@hbogert việc sử dụng của bạn /tmp/tzlà một vấn đề bảo mật. Vào thời điểm bạn đọc từ /tmp/tznhững người khác có thể đã ghi một giá trị khác vào nó hoặc tệp đã tồn tại (mà bạn không kiểm tra) và bạn đang ghi đè nó. Sử dụng mktempđể tránh tất cả những vấn đề này. Ngoài ra, bạn đang quên xóa tệp tạm thời của mình ở cuối. Cuối cùng, việc sử dụng -eđối số as của bạn echokhông phải là di động và bạn nên sử dụng printfthay thế cho các dòng mới.
josch

33

Có một lỗi ( https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806 , chưa được sửa tại thời điểm viết câu trả lời này) trong 16.04 khiến nội dung của /etc/timezonebị ghi đè lên cũ giá trị khi chạy dpkg-reconfigure -f noninteractive tzdata. Cách khắc phục như sau (từ báo cáo lỗi ở trên):

$ sudo ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
Current default time zone: 'America/New_York'
Local time is now:      Mon Feb 20 07:30:33 EST 2017.
Universal Time is now:  Mon Feb 20 12:30:33 UTC 2017.
$ cat /etc/timezone
America/New_York

Không cần phải thay đổi thủ công nội dung của /etc/timezone. Điều này đã làm việc cho tôi trên Ubuntu 16.04.2 LTS.


Dễ nhất, sạch nhất, tốt nhất. (Làm việc trong Ubuntu 16.04.4)
David Tabernero M.

Đây không phải là một lỗi. Thay vào đó, hành vi dự định ( ln -fs...) được mô tả trong nhận xét # 9 trên phiếu đó . Ngoài ra, câu hỏi này hiện đang lạc đề đối với SO. Vui lòng không khuyến khích các câu hỏi OT bằng cách trả lời chúng :)
Dan Dascalescu

23

Làm điều này trong một Dockerfile:

FROM ubuntu:xenial

## for apt to be noninteractive
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true

## preesed tzdata, update package index, upgrade packages and install needed software
RUN truncate -s0 /tmp/preseed.cfg; \
    echo "tzdata tzdata/Areas select Europe" >> /tmp/preseed.cfg; \
    echo "tzdata tzdata/Zones/Europe select Berlin" >> /tmp/preseed.cfg; \
    debconf-set-selections /tmp/preseed.cfg && \
    rm -f /etc/timezone /etc/localtime && \
    apt-get update && \
    apt-get install -y tzdata

## cleanup of files from setup
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Trong các thử nghiệm của mình, tôi đã xác định việc xóa các tệp trong thời gian /etccần thiết.


Lưu ý: Điều này rất nguy hiểm ENV DEBIAN_FRONTEND...vì việc sử dụng ENVsẽ khiến biến tồn tại trong môi trường khi vùng chứa cũng bắt đầu chạy (xem docs.docker.com/engine/reference/builder/#env để biết cảnh báo về điều này). Nhìn xung quanh, bạn có thể thấy điều đó ARGnên được ưu tiên trong tình huống này (ví dụ ARG DEBIAN_FRONTEND...) vì giá trị của biến chỉ có hiệu lực trong khi vùng chứa đang được xây dựng.
Anon

Trong khi tôi ở bên bạn để tìm mật khẩu , khóa api và những thứ tương tự, nó vẫn phụ thuộc vào tình huống cụ thể này, nếu bạn muốn nhúng các giá trị cấu hình này vào hình ảnh vùng chứa hay không. Nhầm lẫn cho người dùng có thể là một vấn đề ...
Nils Ballmann

Giải pháp này cũng hoạt động trên tiêu cự 20.04. Tôi đã từng sử dụng các cài đặt của DEBIAN_FRONTEND=...TZ=...cho bionic 18.04 và trusty 16.04, nhưng nó sẽ bị lỗi về tiêu cự. Đã theo dõi một chủ đề khác trên serverfault .
minghua

12

Đây là Dockerfilebản phân phối Ubuntu 18.04 LTS mới nhất của tôi , được điều chỉnh từ câu trả lời của @NilsBallmann. Tôi cũng đã loại bỏ tính năng tạo tệp tạm thời và nén cài đặt gói thành một lớp duy nhất:

FROM ubuntu:bionic

RUN export DEBIAN_FRONTEND=noninteractive; \
    export DEBCONF_NONINTERACTIVE_SEEN=true; \
    echo 'tzdata tzdata/Areas select Etc' | debconf-set-selections; \
    echo 'tzdata tzdata/Zones/Etc select UTC' | debconf-set-selections; \
    apt-get update -qqy \
 && apt-get install -qqy --no-install-recommends \
        tzdata \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

11

Tiến lên câu trả lời của josch ; đặt các giá trị db debconf và xóa/etc/{localtime,timezone} trước khi chạy dpkg-reconfigure: -

$ echo "tzdata tzdata/Areas select Europe" > some/file.txt
$ echo "tzdata tzdata/Zones/Europe select Berlin" >> some/file.txt
$ sudo debconf-set-selections some/file.txt
$ sudo rm /etc/timezone
$ sudo rm /etc/localtime
$ sudo dpkg-reconfigure -f noninteractive tzdata
Current default time zone: 'Europe/Berlin'
Local time is now:      Thu Sep  1 17:13:16 CEST 2016.
Universal Time is now:  Thu Sep  1 15:13:16 UTC 2016.

Phương pháp này được biết là hoạt động trên: -

  • Ubunty Trusty (14,04,5 LTS)

1
Bạn không cần tệp tạm thời. Justprintf 'tzdata tzdata/Areas select Europe\ntzdata tzdata/Zones/Europe select Berlin\n' | sudo dpkg-set-selections
tripleee

Và tôi không nghĩ rằng bạn cần phải loại bỏ một cách rõ ràng các tập tin trong /etcđó dpkg-reconfiguresẽ được viết lại anyway.
tripleee

Cảm ơn người đàn ông, bạn đã cứu tôi! Nó cũng hoạt động trên Docker Container: debian: Stretch hoặc ubuntu.
Vagner do Carmo

3

Trong Ubuntu 18.04 với systemd, tôi đang sử dụng:

  $ sudo timedatectl set-timezone 'Europe/Madrid'
  $ sudo dpkg-reconfigure --frontend noninteractive tzdata

Điều này sẽ đi đến đâu?
Mark Priddy

Có vẻ như không cần lệnh thứ hai.
Andriy
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.