dpkg-reconfigure tzdata 및 debconf-set-selections를 사용하여 시간대 변경

dpkg-reconfigure tzdata 및 debconf-set-selections를 사용하여 시간대 변경

머신(우분투 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그래서 지금쯤에는 파일을 직접 조작하고 있지만 차라리 and 방식 /etc/timezone을 선호합니다 .dpkg-reconfiguredebconf

답변1

내가 아는 가장 간단한 방법은 다음과 같습니다.

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

답변2

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그런 다음 shebang을 from 에서 #!/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 답변이 작동하는 이유를 설명합니다. 또한 스크립트를 자세히 살펴보면 '/etc/localtime'을 제거하면 @andrekeller 답변이 최신 데비안 버전에서도 작동한다는 것을 알 수 있습니다.

다음 버전의 데비안이 스크립트를 더욱 똑똑하게 만들고 기존 답변도 무효화될 때 이 디버깅 도움말이 도움이 되기를 바랍니다. debconf 디버깅에 대한 자세한 내용은 다음에서 찾을 수 있습니다.debconf-devel(7)

답변3

방금 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

관련 정보