Traccia: time

DESCRIZIONE

Il proprio sistema Linux è multinazionale. Esso può non solo parlare in differenti linguaggi, ma fa anche attenzione alle timezone. Questo hint dice come si può impostare tutto questo.

PREREQUISITI

Lo script fornito è basato sugli lfs-bootscripts-1.11, ma dovrebbe essere facile modificarlo anche se agli script di avvio venissero apportati grossi cambiamenti.

HINT

La terra è divisa in in 24 zone temporali. Il tempo locale in una zona dipende da quante zone è lontano da Greenwich, Gran Bretagna. La differenza nell'ora è relativa alla zona 0 su Greenwich. Ad esempio in Indiana, USA (dove io vivo) siamo nella zona -5. Ciò significa che qui siamo 5 ore prima che in Gran Bretagna. Questo compensa la rotazione terrstre.

Locale vs. UTC

La prima e più importante domanda che ci si dovrà porre è se si vuole memorizzare l'ora nella propria macchina nel formato UTC o locale. UTC (Universal Time Coordinated) è lo stesso che GMT (Greenwich Mean Time). L'ora locale è l'ora mostrata su un orologio appesa alla parete vicino a voi. Ciascun formato ha i propri vantaggi e svantaggi, ma entrambi sono discussi in questo hint.
Tradizionalmente tutte le macchine POSIX (es. Solaris, BSD, UNIX) hanno la propria ora di sistema in formato UTC. I sistemi operativi più stupidi (principalmente quelli di Microsoft) vogliono che i loro utenti configurino le proprie macchine per l'ora locale. Fortunatamente Linux può gestire sia le normali macchine UTC che le macchine che soffrono di malattie Microsoft, che hanno i propri sistemi in formato locale.
A questo punto bisognerà decidere cosa fare; ora locale o UTC. Alcune linee guida: se si eseguono Windows e Linux assieme in 1 macchina raccomando di usare l'ora locale. Se si ha Windows, ma difficilmente lo si usa, o se non si ha del tutto Windows, è una buona idea memorizzare la propria ora nel formato UTC. Quando si è deciso, editare /etc/sysconfig/clock. Usare UTC=0 per l'ora locale e UTC=1 per l'ora UTC (GMT).

Determinazione della propria Timezone

Sapere in quale timezone si vive è importante per il resto di questo hint. Ma non è sufficiente sapere quante zone si è lontani da Greenwich, poiché anche l'ora legale influenza questa scelta. LFS ha un semplice programma per determinare la propria timezone in poche domande (di solito 2 o 3). Eseguirlo ora:

tzselect 

Quando questo programma termina l'ultima linea che scrive è la propria timezone. Qui esso stampa “America/Indianapolis” (senza le virgolette). Ricordare questo valore. Scriverlo o metterlo da qualche parte in un file di testo. A questa variabile si farà riferimento come $TIMEZONE nel resto di questo hint per semplificare le spiegazioni.

Uso delle impostazioni della $TIMEZONE

Ora che si sa in quale timezone si vive si può mettere in pratica questa conoscenza. Si inizia creando il file /etc/localtime. Questo file deve esistere sia che si scelga l'ora UTC o locale. Esso può essere un link simbolico o una copia del vero file rinominato in localtime. Al momento in cui scrivo LFS utilizzava un file vero, quindi io userò questo metodo, sebbene un link simbolico funzionerebbe bene.

cp --remove-destination /usr/share/zoneinfo/$TIMEZONE /etc/localtime

Quindi bisogna modificare lo script di avvio setclock, ma prima una breve spiegazione di ora di sistema e ora hardware.
L'orologio hardware è l'orologio che batte nel proprio BIOS e mantiene l'ora anche se il sistema è spento. Tuttavia l'orologio hardware non è poi così preciso. L'orologio di sistema è l'ora che il kernel mantiene mentre è in funzione, ed è notevolmente più preciso. Ma come fa l'orologio di sistema a sapere che ora è? Durante l'accensione, gli script di avvio standard di LFS impostano l'ora di sistema dall'orologio hardware. Dopo questo l'orologio hardware è ignorato. Il problema con questo scenario è che dopo diversi giorni di attività (in funzione dell' accuratezza del proprio BIOS), ci può essere una discrepanza piuttosto larga tra l'orologio di sistema e l'orologio hardware. Quando si riavvia, l'orologio hardware, ancora inaccurato, verrà usato per impostare l'orologio di sistema. Pertanto sarebbe doveroso permettere al kernel di aggiornare l'orologio di sistema BIOS allo spegnimento in modo che il BIOS abbia più facilmente un orario corretto quando il sistema si avvierà la prossima volta. La lettura da e scrittura sull'orologio hardware è fatta da un programma che si chiama hwclock(8). Questo programma è parte di un normale sistema LFS quindi non c'è bisogno di scaricarlo. Modificheremo alcuni degli script di avvio per far sì che il programma parta all'avviamento e allo spegnimento.
NOTA: Keith Harwood mi ha informato che l'orologio del suo il suo hardware DS10 Alpha è più accurato del suo orologio di sistema. L' orologio di sistema perdeva alcuni mimnuti al giorno. Questo è molto probabilmente un qualche problema del kernel, ma bisognorebbe probabilmente controllare la propria ora di sistema con un'ora che si sa essere corretta, e contfrontarla dopo che il sistema ha funzionato almeno un giorno. Personalmente dubito che qualunque utente x86 troverà l'orologio hardware più accurato dell'orologio di sistema.
Nel libro, uno script chiamato setclock è creato in /etc/rc.d/init.d. Questo script esegue solo metà del lavoro, poichè si limita a impostare l'ora di sistema dall'orologio hardware. Noi modificheremo questo script e creeremo qualche link simbolico aggiuntivo per far sì che questo script salvi l'ora di sistema sull'orologio hardware allo spegnimento/riavvio.

cat >/etc/rc.d/init.d/setclock <<"EOF"
#!/bin/bash
# Begin $rc_base/init.d/setclock - Setting Linux Clock
# Based on setclock script from LFS-3.1 and earlier.
# Rewritten by Gerard Beekmans  - gerard@linuxfromscratch.org
# Rewritten by Marc Heerdink to include writing to the hardware clock
# Rewritten by Archaic <archaic@remove-this.indy.rr.com> to conform to
# lfs-bootscripts-1.11
source /etc/sysconfig/rc
source $rc_functions
source /etc/sysconfig/clock
case "$1" in
   start)
        case "$UTC" in
             yes|true|1)
                  echo "Impostazione orologio di sistema..."
                  hwclock --hctosys --utc
                  evaluate_retval
                  ;;
              no|false|0)
                  echo "Impostazione orologio di sistema..."
                  hwclock --hctosys --localtime
                  evaluate_retval
                  ;;
              *)
                  echo "Valore non valido per UTC in /etc/sysconfig/clock: $UTC"
                  echo "Valori validi per UTC sono 1 e 0."
                  exit 1
                  ;;
        esac
        ;;
      stop)
        case "$UTC" in
             yes|true|1)
                  echo "Aggiornamento orologio di sistema..."
                  hwclock --systohc --utc
                  evaluate_retval
                  ;;
             no|false|0)
                  echo "Aggiornamento orologio di sistema..."
                  hwclock --systohc --localtime
                  evaluate_retval
                  ;;
              *)
                  echo "Valore non valido per UTC in /etc/sysconfig/clock: $UTC"
                  echo "Valori validi per UTC sono 1 e 0."
                  exit 1
                  ;;
        esac
        ;;
       *)
        echo "Uso: $0 {start|stop}"
        exit 1
        ;;
esac
# End $rc_base/init.d/setclock
EOF
chmod 755 /etc/rc.d/init.d/setclock

Sucessivamente ci sono i link simbolici. Il link simbolico per eseguire lo script setclock è già presente in /etc/rc.d/rc.sysinit.d, quindi i soli link simbolici che dobbiamo creare sono quelli per eseguire setclock allo spegnimento del sistema:

ln -s ../init.d/setclock /etc/rc.d/rc0.d/K45setclock &&
ln -s ../init.d/setclock /etc/rc.d/rc6.d/K45setclock

a questo punto i boot script sono correttamente impostati e la sola cosa rimasta da configurare è la variabile d'ambiente TZ.

Variabile d'ambiente TZ

Questa variabile è usata da hwclock, quando è eseguita da una shell, e da alcuni programmi che dipendono pesantemente dalla timezone. Questa variabile è usata in tutto il sistema, quindi è una buona idea averla nell'ambiente globale che è impostato in /etc/profile. Aggiungere queste linee al proprio /etc/profile:

export TZ=value_of_$TIMEZONE

RICONOSCIMENTI:
questo hint è stato originariamente scritto da Marc Heerdink.Esso è ancora l'80% del suo testo.

CHANGELOG:

  1. Versione finale di Marc Heerdink
  1. Editate informazioni irrilevanti o ridondanti
  2. Corretti alcuni errori ortografici o grammaticali
  3. Aggiornato script e locazioni dei file alla LFS corrente
  4. Aggiornato il nuovo formato hint
 
time.txt · Ultima modifica: 2015/08/08 14:22 (modifica esterna)