modifica del fuso orario con dpkg-reconfigure tzdata e debconf-set-selections


18

Voglio impostare uno script che modifica automaticamente il fuso orario su una macchina (con Ubuntu 11.10) e imposta anche i giusti valori per il debconfdatabase. Ho provato quanto segue, ma non funziona (alla fine, il fuso orario corrente rimane invariato, e se eseguo manualmente il dpkg-reconfigure tzdatacomando, i valori selezionati sono effettivamente quelli precedenti):

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

Quindi, per ora, sto facendo scherzi con i file /etc/localtimee /etc/timezonedirettamente, ma preferirei preferire il dpkg-reconfiguree debconfmodo.

Risposte:


26

Il modo più semplice che conosco è:

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

Cosa significano i parametri per dpkg-reconfigure?
serengeti12,

5
Tenere presente che i processi in esecuzione potrebbero non rilevare la modifica senza un riavvio. Ad esempio, i timestamp dei demoni del server potrebbero essere errati fino al riavvio dei daemon.
MC0e

6

Ho appena scoperto che con Debian Stretch (9) devi anche cambiare / etc / localtime, quindi qualcosa del tipo:

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

è necessario. Per modificare la risposta di andrekeller devi:

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

Mi hai salvato la giornata! Altre soluzioni non funzionano in Debian 9
Brandon il

2
In realtà è necessario solo il collegamento di etc / localtime, poiché la chiamata di dpkg-reconfigure imposterà correttamente / etc / timezone
Daniel Dinnyes,

@DanielDinnyes o in alternativa puoi sostituire quella ln -fs ....linea sgraziata con semplice rm -f /etc/localtimee funzionerà ancora (e debconf si ricrea /etc/localtimecon valori corretti); vedi la mia risposta per i dettagli.
Matija Nalis,

4

Per usare debconf, prima di chiamare dpkg-reconfigure, è necessario anche rimuovere /etc/localtimee /etc/timezone. Fai attenzione anche ai possibili spazi extra (come nella tua domanda!) Che non sono benigni.

Quindi "modo debconf" che funziona (in Debian Stretch) sarebbe:

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

Il motivo è che lo script di configurazione di tzdata cerca di essere intelligente, e se è mai stato configurato in precedenza o l'utente si è immischiato manualmente con fusi orari, si comporterà in modo diverso.

EXTRA

Per eseguire il debug di un problema simile, devi prima fare:

export  DEBCONF_DEBUG=developer

che fornirebbe le seguenti informazioni:

# 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

che ti mostrerebbe che IMPOSTA forzatamente i valori prima di chiederli all'utente (sovrascrivendo così i valori impostati con debconf-set-selections).

Quindi cambieresti shebang /var/lib/dpkg/info/tzdata.configda #!/bin/sha #!/bin/sh -x, e seguirai il flusso del programma, dove vedresti che lo fa:

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

guardandoti /var/lib/dpkg/info/tzdata.configtroverai questo:

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

che spiega perché la risposta di @fiction funziona. Inoltre, guardando più nello script, scopriresti che @andrekeller answer funziona anche nelle versioni Debian più recenti se rimuovi '/ etc / localtime'.

Speriamo che questo aiuto per il debug ti aiuti quando la prossima versione di Debian rende lo script ancora più intelligente e anche le risposte esistenti non sono più valide. Maggiori informazioni sul debug di debconf sono disponibili in debconf-devel (7)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.