108.1 Lezione 1
Certificazione: |
LPIC-1 (102) |
---|---|
Versione: |
5.0 |
Argomento: |
108 Servizi Essenziali di Sistema |
Obiettivo: |
108.1 Mantenere l’orario di sistema |
Lezione: |
1 di 2 |
Introduzione
La misurazione accurata del tempo è assolutamente cruciale per l’informatica moderna. L’implementazione del mantenimento del tempo, tuttavia, è materia sorprendentemente complessa. La pratica di tenere il tempo sembra banale per un utente finale, ma il sistema deve essere in grado di gestire in modo intelligente molte idiosincrasie e casi limite. Considerate che i fusi orari non sono statici, ma possono essere cambiati da una decisione amministrativa o politica. Un paese può scegliere di smettere di osservare l’ora legale. Qualsiasi programma deve essere in grado di gestire questi cambiamenti in modo logico. Fortunatamente per gli amministratori di sistema, le soluzioni per la gestione del tempo sul sistema operativo Linux sono mature, robuste e di solito funzionano senza molte interferenze.
Quando un computer Linux si avvia, inizia a tenere il tempo. Ci riferiamo a questo come a un system clock, poiché è aggiornato dal sistema operativo. Inoltre, i computer moderni avranno anche un hardware o real time clock. Questo orologio hardware è spesso una caratteristica della scheda madre e tiene il tempo indipendentemente dal fatto che il computer sia in funzione o meno. Durante l’avvio, l’ora del sistema è impostata dall’orologio hardware, ma per la maggior parte questi due orologi funzionano indipendentemente l’uno dall’altro. In questa lezione discuteremo i metodi per interagire sia con l’orologio di sistema sia con quello hardware.
Sulla maggior parte dei moderni sistemi Linux, l’ora del sistema e l’ora dell’hardware sono sincronizzati con il network time, che è implementato dal Network Time Protocol (NTP). Nella stragrande maggioranza dei casi, l’unica configurazione che un normale utente dovrà fare è impostare il proprio fuso orario e l’NTP si occuperà del resto. Comunque, tratteremo alcuni modi manuali di lavorare con il tempo; le specifiche della configurazione del network time saranno trattate nella prossima lezione.
Tempo Locale e Tempo Universale a Confronto
L’orologio del sistema è impostato sul Coordinated Universal Time (UTC), che è l’ora locale di Greenwich, Regno Unito. Di solito un utente vuole sapere il suo local time. L’ora locale è calcolata prendendo l’ora UTC e applicando un offset basato sul fuso orario e sull’ora legale. In questo modo, si possono evitare parecchie complessità.
L’orologio di sistema può essere impostato sia sull’ora UTC sia sull’ora locale, ma si raccomanda che sia impostato sull’ora UTC.
La Data
date
è un’utilità di base che visualizza semplicemente l’ora locale:
$ date Sun Nov 17 12:55:06 EST 2019
Modificando le opzioni del comando date
si cambia il formato dell’output.
Per esempio, un utente può usare date -u
per vedere l’ora UTC corrente.
$ date -u Sun Nov 17 18:02:51 UTC 2019
Alcune altre opzioni comunemente usate restituiranno l’ora locale in un formato che aderisce a un formato RFC accettato:
-I
-
Data/ora nel formato ISO 8601. L’aggiunta di
date
(-Idate
) limiterà l’output alla sola data. Altri formati sonohours
,minutes
,seconds
ens
per i nanosecondi. -R
-
Restituisce data e ora nel formato RFC 5322.
--rfc-3339
-
Restituisce data e ora nel formato RFC 3339.
Il formato di date
può essere personalizzato dall’utente con sequenze specificate indicate nella sua pagina man
. Per esempio, l’ora corrente può essere formattata come ora Unix in questo modo:
$ date +%s 1574014515
Dalla pagina man di date
possiamo vedere che %s
si riferisce al tempo di Unix.
Lo Unix time è usato internamente sulla maggior parte dei sistemi Unix-like. Memorizza il tempo UTC come numero di secondi dall'Epoch, corrispondente al 1 gennaio 1970.
Note
|
Al momento attuale il numero di bit richiesto per memorizzare il tempo di Unix è di 32 bit. C’è un problema futuro quando 32 bit diventeranno insufficienti per contenere l’ora corrente in formato Unix. Questo causerà seri problemi per qualsiasi sistema Linux a 32 bit. Fortunatamente, questo non accadrà fino al 19 gennaio 2038. |
Usando queste sequenze siamo in grado di formattare data e ora in quasi tutti i formati richiesti da qualsiasi applicazione. Naturalmente, nella maggior parte dei casi è di gran lunga preferibile attenersi a uno standard accettato.
Inoltre, date --date
può essere usato per formattare un’ora che non è quella corrente. In questo scenario, un utente può specificare la data da applicare al sistema usando l’ora di Unix, per esempio:
$ date --date='@1564013011' Wed Jul 24 20:03:31 EDT 2019
L’uso dell’opzione --debug
può essere molto utile per assicurarsi che una data possa essere analizzata con successo. Osserva cosa succede quando si passa una data valida al comando:
$ date --debug --date="Fri, 03 Jan 2020 14:00:17 -0500" date: parsed day part: Fri (day ordinal=0 number=5) date: parsed date part: (Y-M-D) 2020-01-03 date: parsed time part: 14:00:17 UTC-05 date: input timezone: parsed date/time string (-05) date: using specified time as starting value: '14:00:17' date: warning: day (Fri) ignored when explicit dates are given date: starting date/time: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' date: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' = 1578078017 epoch-seconds date: timezone: system default date: final: 1578078017.000000000 (epoch-seconds) date: final: (Y-M-D) 2020-01-03 19:00:17 (UTC) date: final: (Y-M-D) 2020-01-03 14:00:17 (UTC-05)
Questo può essere uno strumento utile nella risoluzione dei problemi di un’applicazione che genera una data.
Hardware Clock
Un utente può eseguire il comando hwclock
per vedere l’ora mantenuta nell’orologio in tempo reale. Questo comando richiede privilegi elevati, quindi useremo sudo
per eseguire il comando:
$ sudo hwclock 2019-11-20 11:31:29.217627-05:00
Usando l’opzione --verbose
si ottengono più output, il che potrebbe essere utile per la risoluzione di problemi:
$ sudo hwclock --verbose hwclock from util-linux 2.34 System Time: 1578079387.976029 Trying to open: /dev/rtc0 Using the rtc interface to the clock. Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2020/01/03 19:23:08 Hw clock time : 2020/01/03 19:23:08 = 1578079388 seconds since 1969 Time since last adjustment is 1578079388 seconds Calculated Hardware Clock drift is 0.000000 seconds 2020-01-03 14:23:07.948436-05:00
Nota il Calculated Hardware Clock drift
. Questo output può dirti se il tempo di sistema e il tempo dell’hardware stanno deviando l’uno dall’altro.
=== timedatectl
timedatectl
è un comando che può essere usato per controllare lo stato generale dell’ora e della data, incluso se l’ora della rete è stata sincronizzata o meno (il Network Time Protocol sarà trattato nella prossima lezione).
Per default timedatectl
restituisce informazioni simili a quelle di date
, ma con l’aggiunta dell’ora RTC (hardware) e dello stato del servizio NTP:
$ timedatectl Local time: Thu 2019-12-05 11:08:05 EST Universal time: Thu 2019-12-05 16:08:05 UTC RTC time: Thu 2019-12-05 16:08:05 Time zone: America/Toronto (EST, -0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Impostare l’Ora con timedatectl
Se NTP non è disponibile, si raccomanda di usare timedatectl
piuttosto che date
o hwclock
per impostare data e ora:
# timedatectl set-time '2011-11-25 14:00:00'
Il processo è simile a quello di date
. L’utente può anche impostare il tempo indipendentemente dalla data usando il formato HH:MM:SS.
Impostare il Fuso Orario con timedatectl
timedatectl
è il modo preferito per impostare il fuso orario locale sui sistemi Linux basati su systemd
quando non esiste una GUI. timedatectl
elencherà i possibili fusi orari e il fuso orario può essere impostato di conseguenza usando uno di essi come argomento.
Per prima cosa elenchiamo i possibili fusi orari:
$ timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Algiers Africa/Bissau Africa/Cairo ...
La lista dei possibili fusi orari è lunga, quindi l’uso del comando grep
è raccomandato in questo caso.
Poi possiamo impostare il fuso orario usando uno degli elementi della lista che è stata restituita:
$ timedatectl set-timezone Africa/Cairo $ timedatectl Local time: Thu 2019-12-05 18:18:10 EET Universal time: Thu 2019-12-05 16:18:10 UTC RTC time: Thu 2019-12-05 16:18:10 Time zone: Africa/Cairo (EET, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no
Tieni presente che il nome del fuso orario deve essere esatto. Africa/Cairo
per esempio cambierà il fuso orario, ma cairo
o africa/cairo
no.
Disabilitare NTP Utilizzando timedatectl
In alcuni casi potrebbe essere necessario disabilitare NTP. Questo potrebbe essere fatto usando systemctl
, ma noi lo dimostreremo usando timedatectl
:
# timedatectl set-ntp no $ timedatectl Local time: Thu 2019-12-05 18:19:04 EET Universal time: Thu 2019-12-05 16:19:04 UTC RTC time: Thu 2019-12-05 16:19:04 Time zone: Africa/Cairo (EET, +0200) NTP enabled: no NTP synchronized: no RTC in local TZ: no DST active: n/a
Configurare il Fuso Oraio senza timedatectl
Impostare le informazioni sul fuso orario è un passo standard quando si installa Linux su una nuova macchina. Se c’è un processo di installazione grafico, questo sarà molto probabilmente gestito senza alcun ulteriore input da parte dell’utente.
La directory /usr/share/zoneinfo
contiene informazioni per i diversi fusi orari possibili. Nella directory zoneinfo
, ci sono sottodirectory che contengono i nomi dei continenti così come altri collegamenti simbolici. Si raccomanda di trovare la zoneinfo
della tua regione partendo dal tuo continente.
I file zoneinfo
contengono le regole necessarie per calcolare l’offset dell’ora locale rispetto all’UTC, e sono anche importanti se la tua regione osserva l’ora legale. Il contenuto di /etc/localtime
sarà letto quando Linux ha bisogno di determinare il fuso orario locale. Per impostare il fuso orario senza l’uso di una GUI, l’utente dovrebbe creare un collegamento simbolico per la propria posizione da /usr/share/zoneinfo
a /etc/localtime
. Per esempio:
$ ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime
Dopo aver impostato il fuso orario corretto, si raccomanda di eseguire:
# hwclock --systohc
Questo imposterà l'hardware clock dal system clock (cioè, l’orologio real-time sarà impostato alla stessa ora di date
). Si noti che questo comando viene eseguito con i privilegi di root, in questo caso facendo il login come root.
/etc/timezone
è simile a /etc/localtime
. È una rappresentazione di dati del fuso orario locale, e come tale può essere letto usando cat
:
$ cat /etc/timezone America/Toronto
Si noti che questo file non è usato da tutte le distribuzioni Linux.
Impostare Data e Ora senza timedatectl
Note
|
La maggior parte dei moderni sistemi Linux usa |
Utilizzare date
date
ha un’opzione per impostare l’ora di sistema. Usa --set
o -s
per impostare la data e l’ora. Puoi anche scegliere di usare --debug
per verificare la corretta analisi del comando:
# date --set="11 Nov 2011 11:11:11"
Si noti che sono necessari i privilegi di root per impostare la data qui. Possiamo anche scegliere di cambiare l’ora o la data in modo indipendente:
# date +%Y%m%d -s "20111125"
Qui dobbiamo specificare le sequenze in modo che la nostra stringa sia elaborata correttamente. Per esempio %Y
si riferisce all’anno, e quindi le prime quattro cifre 2011
saranno interpretate come l’anno 2011. Allo stesso modo, %T
è la sequenza per il tempo, ed è dimostrato qui impostando il tempo:
# date +%T -s "13:11:00"
Dopo aver cambiato l’orario di sistema, si raccomanda di impostare anche l’orologio hardware in modo che entrambi gli orologi, di sistema e hardware, siano sincronizzati:
# hwclock --systohc
systohc
significa “da system clock a hardware clock”.
Utilizzare hwclock
Invece di impostare l’orologio di sistema e aggiornare l’orologio hardware, si può scegliere di invertire il processo. Inizieremo impostando l’orologio hardware:
# hwclock --set --date "4/12/2019 11:15:19" # hwclock Fri 12 Apr 2019 6:15:19 AM EST -0.562862 seconds
Nota che hwclock
si aspetta l’ora UTC, ma restituisce l’ora locale per default.
Dopo aver impostato l’orologio hardware, avremo bisogno di aggiornare l’orologio di sistema da esso. hctosys
può essere inteso come “da orologio hardware a orologio di sistema”.
# hwclock --hctosys
Esercizi Guidati
-
Indica se i seguenti comandi stanno visualizzando o modificando il system time o l'hardware time:
Comando(i) System Hardware Entrambi date -u
hwclock --set --date "12:00:00"
timedatectl
timedatectl | grep RTC
hwclock --hctosys
date +%T -s "08:00:00"
timedatectl set-time 1980-01-10
-
Osserva il seguente output, e poi correggi il formato dell’argomento in modo che il comando abbia successo:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
-
Usa il comando
date
e le sequenze in modo che il mese del sistema sia impostato su febbraio. Lascia il resto della data e dell’ora invariati. -
Supponendo che il comando precedente abbia avuto successo, usa
hwclock
per impostare l’orologio hardware dall’orologio di sistema. -
C’è una località chiamata
eucla
. Di quale continente fa parte? Usa il comandogrep
per scoprirlo. -
Imposta il tuo fuso orario attuale su quello di
eucla
.
Esercizi Esplorativi
-
Quale metodo di impostazione del tempo è ottimale? In quale scenario il metodo preferito potrebbe essere impossibile?
-
Perché è necessario che ci siano così tanti metodi per realizzare la stessa cosa, cioè impostare il tempo del sistema?
-
Dopo il 19 gennaio 2038, il Linux System Time richiederà un numero a 64 bit da memorizzare. Tuttavia, è possibile che si possa semplicemente scegliere di impostare una “Nuova Epoca (Epoch)”. Per esempio, il 1° gennaio 2038 a mezzanotte potrebbe essere impostato su un New Epoch Time di
0
. Perché non è che questa non sia diventata la soluzione preferita?
Sommario
In questa lezione abbiamo imparato:
-
Come visualizzare l’ora in diversi formati dalla riga di comando.
-
La differenza tra l’orologio di sistema e l’orologio hardware in Linux.
-
Come impostare manualmente l’orologio di sistema.
-
Come impostare manualmente l’orologio hardware.
-
Come cambiare il fuso orario del sistema.
Comandi utilizzati in questa lezione:
date
-
Visualizza o cambia l’orologio di sistema. Altre opzioni:
-u
-
Visualizza l’ora UTC.
+%s
-
Utilizza una sequenza per visualizzare l’ora e data Unix.
--date=
-
Specifica un’ora da visualizzare, invece dell’ora corrente.
--debug
-
Visualizza messaggi di debug quando analizza una data inserita dall’utente.
-s
-
Imposta manualmente l’orologio di sistema.
hwclock
-
Visualizza o cambia l’orologio hardware.
--systohc
-
Utilizza l’orologio di sistema per impostare l’orologio hardware.
--hctosys
-
Utilizza l’orologio hardware per impostare l’orologio di sistema.
--set --date
-
Imposta manualmente l’orologio hardware.
timedatectl
-
Visualizza gli orologi di sistema e hardware, così come la configurazione NTP sui sistemi Linux basati su systemd.
set-time
-
Imposta l’ora manualmente.
list-timezones
-
Elenca i possibili fusi orari.
set-timezone
-
Imposta il fuso orario manualmente.
set-ntp
-
Abilita/disabilita NTP.
Risposte agli Esercizi Guidati
-
Indica se i seguenti comandi stanno visualizzando o modificando il system time o l'hardware time:
Comando(i) System Hardware Entrambi date -u
X
hwclock --set --date "12:00:00"
X
timedatectl
X
timedatectl | grep RTC
X
hwclock --hctosys
X
date +%T -s "08:00:00"
X
timedatectl set-time 1980-01-10
X
-
Osserva il seguente output, e poi correggi il formato dell’argomento in modo che il comando abbia successo:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
date --debug --set "12/20/20 0:10 -3"
-
Usate il comando
date
e le sequenze in modo che il mese del sistema sia impostato su febbraio. Lascia il resto della data e dell’ora invariati.date +%m -s "2"
-
Supponendo che il comando precedente abbia avuto successo, usa
hwclock
per impostare l’orologio hardware dall’orologio di sistema.hwclock -systohc
-
C’è una località chiamata
eucla
. Di quale continente fa parte? Usa il comandogrep
per scoprirlo.timedatectl list-timezones \| grep -i eucla
o
grep -ri eucla /usr/share/zoneinfo
-
Imposta il tuo fuso orario attuale su quello di
eucla
.timedatectl set-timezone 'Australia/Eucla'
o
ln -s /usr/share/zoneinfo/Australia/Eucla /etc/localtime
Risposte agli Esercizi Esplorativi
-
Quale metodo di impostazione del tempo è ottimale? In quale scenario il metodo preferito potrebbe essere impossibile?
Nella maggior parte delle distribuzioni Linux, NTP è abilitato di default e dovrebbe essere lasciato per impostare l’ora del sistema senza interferenze. Tuttavia, se c’è un sistema Linux che non è connesso a Internet, NTP sarà inaccessibile. Per esempio, un sistema Linux embedded che gira su apparecchiature industriali potrebbe non avere connettività di rete.
-
Perché è necessario che ci siano così tanti metodi per realizzare la stessa cosa, cioè impostare il tempo del sistema?
Poiché l’impostazione dell’ora è stata un requisito di tutti i sistemi *nix per decenni, ci sono molti metodi legacy per l’impostazione dell’ora che sono ancora mantenuti.
-
Dopo il 19 gennaio 2038, il Linux System Time richiederà un numero a 64 bit da memorizzare. Tuttavia, è possibile che si possa semplicemente scegliere di impostare una “Nuova Epoca (Epoch)”. Per esempio, il 1° gennaio 2038 a mezzanotte potrebbe essere impostato su un New Epoch Time di
0
. Perché pensi che questa non sia diventata la soluzione preferita?Entro il 2038 la stragrande maggioranza dei computer sarà già dotata di CPU a 64 bit, e l’uso di un numero a 64 bit non degraderà le prestazioni in modo significativo. Tuttavia, sarebbe impossibile stimare i rischi di “resettare” l’Epoch time in questo modo. C’è molto software legacy che potrebbe esserne colpito. Le banche e le grandi aziende, per esempio, hanno spesso una grande quantità di vecchi programmi su cui fanno affidamento per uso interno. Quindi questo scenario, come molti altri, è uno studio sui compromessi. Qualsiasi sistema a 32 bit ancora in funzione nel 2038 sarebbe colpito da un overflow di Epoch Time, ma il software legacy sarebbe colpito dal cambiamento del valore di Epoch.