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: