HWCLOCK(8) | Administrare sistem | HWCLOCK(8) |
NUME¶
hwclock - instrument pentru administrarea ceasurilor
REZUMAT¶
hwclock [funcția] [opțiune...]
DESCRIERE¶
hwclock este un instrument de administrare pentru toate ceasurile sistemului. Acesta poate: afișa ora ceasului hardware (al componentelor fizice, practic al plăcii bază) ; stabili ceasul hardware la o oră specificată; stabili ceasul hardware de la ceasul de sistem (ceasul software); stabili ceasul de sistem de la ceasul hardware; compensa abaterea ceasului hardware; corecta scara de timp a ceasului de sistem; stabili fusul orar al nucleului, scara de timp NTP și epoca (numai pentru Alpha); și prezice viitoarele valori ale ceasului hardware pe baza ratei de abatere a acestuia.
Începând cu versiunea v2.26, au fost aduse modificări importante funcției --hctosys și opțiunii --directisa și a fost adăugată o nouă opțiune --update-drift. A se vedea respectivele descrieri ale acestora mai jos.
FUNCȚII¶
Următoarele funcții se exclud reciproc, se poate da doar una la un moment dat. Dacă nu este dată niciuna, valoarea implicită este --show.
-a, --adjust
--getepoch; --setepoch
Acestea sunt utilizate pentru a citi și stabili valoarea epocii ceasului hardware al nucleului. Epoch este numărul de ani în AD la care se referă o valoare de an zero în ceasul hardware. De exemplu, dacă BIOS-ul mașinii stabilește contorul de ani din ceasul hardware pentru a conține numărul de ani întregi din 1952, atunci valoarea epocii ceasului hardware al nucleului trebuie să fie 1952.
Funcția --setepoch necesită utilizarea opțiunii --epoch pentru a specifica anul. De exemplu:
hwclock --setepoch --epoch=1952
Controlorul RTC încearcă să ghicească valoarea corectă a epocii, astfel încât este posibil să nu fie necesară definirea acesteia.
Această valoare de epocă este utilizată ori de câte ori hwclock citește sau stabilește ceasul hardware pe o mașină Alpha. Pentru mașinile ISA, nucleul utilizează epoca fixă a ceasului hardware de 1900.
--param-get=parametru; --param-set=parametru=valoare
parametru este fie o valoare numerică a parametrului RTC (a se vedea Kernel’s include/uapi/linux/rtc.h), fie un alias. Consultați --help pentru o listă de alias valide. parametru și valoare, dacă sunt prefixate cu 0x, sunt interpretate ca valori hexazecimale, în caz contrar valori zecimale.
--predict
Nu utilizați această funcție în cazul în care ceasul hardware este modificat de altceva decât de comanda hwclock a sistemului de operare curent, cum ar fi „11 minute mode” sau de un alt sistem de operare dual-boot.
-r, --show; --get
Afișarea orei ceasului hardware este implicită atunci când nu este specificată nicio funcție.
Funcția --get aplică, de asemenea, o corecție de abatere la timpul citit, pe baza informațiilor din /etc/adjtime. Nu folosiți această funcție dacă ceasul hardware este modificat de altceva decât de comanda hwclock a sistemului de operare curent, cum ar fi „11 minute mode” sau de la un alt sistem de operare dual-boot.
-s, --hctosys
Ceasul sistemului trebuie să fie menținut în scara de timp UTC pentru ca aplicațiile de dată-oră să funcționeze corect în combinație cu fusul orar configurat pentru sistem. În cazul în care ceasul hardware este menținut în ora locală, atunci ora citită de la acesta trebuie schimbată în scara de timp UTC înainte de a o utiliza pentru a stabili ceasul sistemului. Funcția --hctosys face acest lucru pe baza informațiilor din fișierul /etc/adjtime sau a argumentelor din linia de comandă --localtime și --utc. Notă: nu se face nicio ajustare a orei de vară. A se vedea discuția de mai jos, la LOCAL vs UTC.
Nucleul păstrează, de asemenea, o valoare a fusului orar, iar funcția --hctosys o stabilește la fusul orar configurat pentru sistem. Fusul orar al sistemului este configurat de variabila de mediu TZ sau de fișierul /etc/localtime, așa cum le-ar interpreta tzset(3). Câmpul învechit tz_dsttime al valorii fusului orar din kernel este fixat la zero. (Pentru detalii despre ce însemna acest câmp, consultați settimeofday(2).)
Atunci când este utilizată într-un script de pornire, făcând funcția --hctosys primul apelant al settimeofday(2) de la pornire, aceasta va stabili scara de timp NTP „11 minute mode” prin intermediul variabilei nucleului persistent_clock_is_local. În cazul în care se modifică configurația scării temporale a ceasului hardware, este necesară o repornire pentru a informa nucleul. A se vedea discuția de mai jos, la Sincronizarea automată a ceasului hardware de către nucleu.
Aceasta este o funcție bună de utilizat într-unul dintre scripturile de pornire a sistemului înainte ca sistemele de fișiere să fie montate în regim de citire/scriere.
Această funcție nu trebuie utilizată niciodată pe un sistem în funcțiune. Salturile în ora sistemului vor cauza probleme, cum ar fi marcaje de timp ale sistemului de fișiere corupte. De asemenea, dacă ceva a modificat ceasul hardware, cum ar fi „modul 11 minute” al NTP, atunci --hctosys va stabili timpul în mod incorect prin includerea compensării abaterii.
Compensarea abaterii poate fi inhibată prin definirea factorului de abatere în /etc/adjtime la zero. Această valoare va fi persistentă atâta timp cât opțiunea --update-drift nu este utilizată cu --systohc la închiderea sistemului (sau oriunde altundeva). O altă modalitate de a inhiba acest lucru este utilizarea opțiunii --noadjfile la apelarea funcției --hctosys. O a treia metodă constă în ștergerea fișierului /etc/adjtime. hwclock va utiliza în mod implicit scara de timp UTC pentru ceasul hardware. În cazul în care ceasul hardware are ora locală, aceasta va trebui definită în fișier. Acest lucru se poate face prin apelarea hwclock --localtime --adjust; în cazul în care fișierul nu este prezent, această comandă nu va ajusta efectiv ceasul, dar va crea fișierul cu ora locală configurată și cu un factor de deviație de zero.
O condiție în care se poate dori inhibarea corecției de abatere a hwclock poate fi dorită atunci când se face o dublă pornire a mai multor sisteme de operare. Dacă în timp ce această instanță de Linux este oprită, un alt sistem de operare modifică valoarea ceasului hardware, atunci când această instanță este repornită, corecția de abatere aplicată va fi incorectă.
Pentru ca corecția de abatere a hwclock să funcționeze corect, este imperativ ca nimic să nu modifice ceasul hardware în timp ce instanța sa Linux nu rulează.
--set
--systz
Aceasta face următoarele lucruri care sunt detaliate mai sus în funcția --hctosys:
Primele două sunt disponibile numai la primul apel al settimeofday(2) după pornire. În consecință, această opțiune are sens doar atunci când este utilizată într-un script de pornire. În cazul în care se modifică configurația intervalului de timp al ceasurilor hardware, ar fi necesară o repornire pentru a informa nucleul.
-w, --systohc
--vl-read, --vl-clear
Consultați fișierul nucleului include/uapi/linux/rtc.h pentru detalii privind informațiile care pot fi returnate. Rețineți că nu toate dispozitivele RTC au această capacitate de monitorizare și nici toți controlorii nu acceptă neapărat citirea informațiilor.
-h, --help
-V, --version
OPȚIUNI¶
--adjfile=nume-fișier
--date=șir_dată
hwclock --set --date='16:45'
hwclock --predict --date='2525-08-14 07:11:05'
Argumentul trebuie să fie în ora locală, chiar dacă aveți ceasul hardware în UTC. Consultați opțiunea --localtime. Prin urmare, argumentul nu trebuie să includă informații despre fusul orar. De asemenea, nu ar trebui să fie o oră relativă, cum ar fi „+5 minutes”, deoarece precizia hwclock depinde de corelația dintre valoarea argumentului și momentul în care este apăsată tasta enter. Secundele fracționare sunt eliminate în mod silențios. Această opțiune este capabilă să înțeleagă multe formate de oră și dată, dar trebuie respectați parametrii anteriori.
--delay=secunde
Valoarea implicită de 500 ms se bazează pe ceasul hardware compatibil MC146818A (x86) utilizat în mod obișnuit. Acest ceas hardware poate fi stabilit numai la orice timp întreg plus o jumătate de secundă. Timpul întreg este necesar deoarece nu există o interfață pentru a defini sau a obține o fracțiune de secundă. Întârzierea suplimentară de o jumătate de secundă se datorează faptului că ceasul hardware se actualizează la următoarea secundă exact la 500 ms după ce stabilește noua oră. Din păcate, acest comportament este specific hardware-ului și, în unele cazuri, este necesară o altă întârziere.
-D, --debug
--directisa
--epoch=anul
-f, --rtc=nume-fișier
-l, --localtime; -u, --utc
Ceasul hardware poate fi configurat pentru a utiliza fie UTC, fie scara de timp locală, însă ceasul nu indică ce alternativă este utilizată. Opțiunile --localtime sau --utc oferă aceste informații comenzii hwclock. Dacă o specificați pe cea greșită (sau nu specificați niciuna dintre ele și luați o valoare implicită greșită), atât configurarea cât și citirea ceasului hardware vor fi incorecte.
Dacă nu specificați nici --utc, nici --localtime, atunci se va utiliza ultima dată cu o funcție de stabilire (--set, --systohc, sau --adjust), așa cum este înregistrată în /etc/adjtime. În cazul în care fișierul „adjtime” nu există, valoarea implicită este UTC.
Notă: modificările orei de vară pot fi incoerente atunci când ceasul hardware este menținut la ora locală. Consultați discuția de mai jos, la LOCAL vs UTC.
--noadjfile
--test
--update-drift
Este necesară o perioadă minimă de patru ore între ajustări. Acest lucru este pentru a evita calculele nevalide. Cu cât perioada este mai lungă, cu atât mai precis va fi factorul de abatere rezultat.
Această opțiune a fost adăugată în v2.26, deoarece este obișnuit ca sistemele să apeleze hwclock --systohc la închidere; cu vechiul comportament, acest lucru ar fi (re)calculat automat factorul de abatere, ceea ce cauzează mai multe probleme:
Calcularea factorului de abatere de către hwclock este un bun punct de plecare, dar pentru rezultate optime va trebui probabil să fie ajustat prin editarea directă a fișierului /etc/adjtime. Pentru majoritatea configurațiilor, odată ce factorul de abatere optim al mașinii este creat, nu ar trebui să fie nevoie să fie modificat. Prin urmare, vechiul comportament de (re)calculare automată a abaterii a fost modificat și acum necesită utilizarea acestei opțiuni. A se vedea discuția de mai jos, la Funcția de ajustare.
Această opțiune necesită citirea ceasului hardware înainte de a-l ajusta. Dacă acesta nu poate fi citit, atunci această opțiune va face ca funcțiile de stabilire să eșueze. Acest lucru se poate întâmpla, de exemplu, dacă ceasul hardware este corupt de o pană de curent. În acest caz, ceasul trebuie mai întâi stabilit fără această opțiune. În ciuda faptului că nu funcționează, factorul de corecție a abaterii rezultat ar fi oricum nevalid.
-v, --verbose
NOTE¶
Ceasuri într-un sistem Linux¶
Există două tipuri de ceasuri cu dată și oră:
Pe un sistem compatibil ISA, acest ceas este specificat ca parte a standardului ISA. Un program de control poate citi sau stabili acest ceas doar la o secundă întreagă, dar poate detecta și marginile ticurilor de ceas de 1 secundă, astfel încât ceasul are de fapt o precizie practic infinită.
Acest ceas este numit în mod obișnuit ceas hardware, ceas de timp real, RTC, ceas BIOS și ceas CMOS. Ceasul hardware (Hardware Clock), în forma sa cu majusculă, a fost inventat pentru a fi folosit de hwclock. De asemenea, nucleul Linux se referă la acesta ca fiind ceasul persistent.
Unele sisteme non-ISA au câteva ceasuri în timp real, doar unul dintre ele având propriul domeniu de alimentare. Un cip de ceas extern I2C sau SPI de foarte mică putere poate fi utilizat cu o baterie de rezervă ca ceas fizic (hardware) pentru a inițializa un ceas în timp real integrat mai funcțional, care este utilizat în majoritatea celorlalte scopuri.
Timpul sistemului este timpul care contează. Scopul de bază al ceasului hardware este de a păstra timpul atunci când Linux nu rulează, astfel încât ceasul de sistem să poată fi inițializat de la acesta la pornire. Rețineți că în DOS, pentru care a fost proiectat ISA, ceasul fizic (Hardware Clock) este singurul ceas de timp real.
Este important ca ora sistemului să nu prezinte discontinuități, așa cum s-ar întâmpla dacă ați folosi programul date(1) pentru a o stabili în timp ce sistemul este în funcțiune. Cu toate acestea, puteți face orice doriți cu ceasul hardware în timp ce sistemul este în funcțiune, iar data următoare când Linux va porni, o va face cu ora ajustată de la ceasul hardware. Notă: în prezent, acest lucru nu este posibil pe majoritatea sistemelor, deoarece hwclock --systohc este apelat la închidere.
Fusul orar al nucleului Linux este stabilit de hwclock. Dar nu vă lăsați înșelați - aproape nimănui nu-i pasă în ce fus orar crede nucleul că se află. În schimb, programele cărora le pasă de fusul orar (poate pentru că vor să vă afișeze ora locală) folosesc aproape întotdeauna o metodă mai tradițională de determinare a fusului orar: Ele utilizează variabila de mediu TZ sau fișierul /etc/localtime, așa cum se explică în pagina de manual pentru tzset(3). Cu toate acestea, unele programe și părți marginale ale nucleului Linux, cum ar fi sistemele de fișiere, utilizează valoarea fusului orar al nucleului. Un exemplu este sistemul de fișiere vfat. Dacă valoarea fusului orar din nucleu este greșită, sistemul de fișiere vfat va raporta și va defini marcaje de timp greșite pe fișiere. Un alt exemplu este "modul 11 minute" NTP al nucleului. Dacă valoarea fusului orar din nucleu și/sau variabila persistent_clock_is_local sunt greșite, atunci ceasul hardware va fi stabilit incorect de către '11 minute mode'. A se vedea discuția de mai jos, la Sincronizarea automată a ceasului hardware de către nucleu.
hwclock stabilește fusul orar al nucleului la valoarea indicată de TZ sau /etc/localtime cu ajutorul funcțiilor --hctosys sau --systz.
Valoarea fusului orar al nucleului este de fapt formată din două părți: 1) un câmp tz_minuteswest, care indică cu câte minute este decalată ora locală (neajustată pentru DST) față de UTC, și 2) un câmp tz_dsttime, care indică tipul de convenție privind ora de vară (DST) care este în vigoare în localitate la ora actuală. Acest al doilea câmp nu este utilizat în Linux și este întotdeauna zero. A se vedea, de asemenea, settimeofday(2).
Metode de accesare a ceasului hardware¶
hwclock utilizează mai multe moduri diferite de a obține și stabili valorile ceasului hardware. Cea mai normală modalitate este de a face In/Ieș către fișierul special al dispozitivului rtc, care se presupune că este condus de controlorul dispozitivului rtc. De asemenea, sistemele Linux care utilizează cadrul rtc cu udev, sunt capabile să suporte mai multe ceasuri hardware. Acest lucru poate determina necesitatea de a suprascrie dispozitivul rtc implicit prin specificarea unuia, cu opțiunea --rtc.
Cu toate acestea, această metodă nu este întotdeauna disponibilă, deoarece sistemele mai vechi nu dispun de un controlor rtc. Pe aceste sisteme, metoda de accesare a ceasului hardware depinde de componentele fizice ale sistemului.
Pe un sistem compatibil ISA, hwclock poate accesa direct registrele de „memorie CMOS” care constituie ceasul, făcând In/Ieș la porturile 0x70 și 0x71. Face acest lucru cu instrucțiuni In/Ieș reale și, în consecință, poate face acest lucru numai dacă rulează cu userid efectiv de superutilizator. Această metodă poate fi utilizată prin specificarea opțiunii --directisa.
Aceasta este o metodă foarte proastă de accesare a ceasului, din toate motivele pentru care programele din spațiul utilizatorului nu ar trebui, în general, să facă In/Ieș direct și să dezactiveze întreruperile. hwclock o oferă pentru testare, depanare și pentru că poate fi singura metodă disponibilă pe sistemele ISA care nu au un controlor de dispozitiv rtc funcțional.
Funcția de reglare¶
Ceasul hardware nu este, de obicei, foarte precis. Cu toate acestea, o mare parte din inexactitatea sa este complet previzibilă - acesta câștigă sau pierde aceeași cantitate de timp în fiecare zi. Acest lucru se numește abatere sistematică. Funcția --adjust a hwclock vă permite să aplicați corecții de abatere sistematică la ceasul hardware.
Aceasta funcționează în felul următor: hwclock deține un fișier, /etc/adjtime, care păstrează unele informații istorice. Acesta se numește fișierul adjtime.
Să presupunem că începeți fără niciun fișier adjtime. Emiteți o comandă hwclock --set pentru a fixa ceasul hardware la ora curentă reală. hwclock creează fișierul adjtime și înregistrează în el ora curentă ca ultima dată când ceasul a fost calibrat. Cinci zile mai târziu, ceasul a câștigat 10 secunde, așa că emiteți o comandă hwclock --set --update-drift pentru a-l da înapoi cu 10 secunde. hwclock actualizează fișierul adjtime pentru a afișa ora curentă ca ultima dată când ceasul a fost calibrat și înregistrează 2 secunde pe zi ca rată de abatere sistematică. Trec 24 de ore, iar apoi emiteți o comandă hwclock --adjust. hwclock consultă fișierul adjtime și constată că ceasul câștigă 2 secunde pe zi atunci când este lăsat în pace și că a fost lăsat în pace exact o zi. Deci, scade 2 secunde din ceasul hardware. Apoi înregistrează ora curentă ca fiind ultima dată când ceasul a fost ajustat. Mai trec 24 de ore și se emite un alt hwclock --adjust. hwclock face același lucru: scade 2 secunde și actualizează fișierul adjtime cu ora curentă ca fiind ultima dată când ceasul a fost ajustat.
Atunci când utilizați opțiunea --update-drift cu --set sau --systohc, rata de abatere sistematică este (re)calculată prin compararea orei curente a ceasului hardware complet corectate pentru abatere cu noua oră stabilită, de la care se obține rata de abatere pe 24 de ore pe baza ultimei date de timp calibrate din fișierul „adjtime”. Acest factor de abatere actualizat este apoi salvat în /etc/adjtime.
O mică cantitate de eroare se strecoară atunci când este stabilit ceasul hardware (Hardware Clock), așa că --adjust se abține de la orice ajustare mai mică de 1 secundă. Mai târziu, când solicitați din nou o ajustare, abaterea acumulată va fi mai mare de 1 secundă, iar --adjust va efectua ajustarea, inclusiv orice cantitate fracționară.
hwclock --hctosys utilizează, de asemenea, datele din fișierul adjtime pentru a compensa valoarea citită de la ceasul hardware înainte de a o utiliza pentru a stabili ceasul sistemului. Nu împărtășește limitarea de 1 secundă a --adjust și va corecta imediat valorile de abatere sub o secundă. Nu modifică ora ceasului hardware și nici fișierul „adjtime”. Acest lucru poate elimina necesitatea de a utiliza --adjust, cu excepția cazului în care altceva în sistem necesită compensarea ceasului hardware.
Fișierul adjtime¶
În timp ce este numit pentru scopul său istoric de a controla doar ajustările, el conține de fapt alte informații utilizate de hwclock de la o invocare la alta.
Formatul fișierului „adjtime” este, în ASCII:
Linia 1: Trei numere, separate prin spații libere: 1) rata de abatere sistematică în secunde pe zi, număr zecimal cu virgulă mobilă; 2) numărul rezultat de secunde din 1969 UTC de la cea mai recentă ajustare sau calibrare, număr întreg zecimal; 3) zero (pentru compatibilitate cu clock(8)) ca număr zecimal cu virgulă mobilă.
Linia 2: Un număr: numărul de secunde rezultat din 1969 UTC de la cea mai recentă calibrare. Zero în cazul în care nu a avut loc încă nicio calibrare sau se știe că orice calibrare anterioară este inutilă (de exemplu, deoarece s-a constatat că ceasul hardware nu mai conține o oră valabilă de la acea calibrare). Acesta este un număr întreg zecimal.
Linia 3: "UTC" sau "LOCAL". Indică dacă ceasul hardware este stabilit la timpul universal coordonat sau la ora locală. Puteți oricând să înlocuiți această valoare cu opțiunile din linia de comandă hwclock.
Puteți utiliza un fișier „adjtime” care a fost utilizat anterior cu programul clock(8) cu hwclock.
Sincronizarea automată a ceasului hardware de către nucleu¶
Ar trebui să știți că există un alt mod în care ceasul hardware (Hardware Clock) este menținut sincronizat în unele sisteme. Nucleul Linux are un mod în care copiază ora sistemului în ceasul hardware la fiecare 11 minute. Acest mod este o opțiune de compilare, astfel încât nu toate nucleele vor avea această capacitate. Acesta este un mod bun de utilizat atunci când folosiți ceva sofisticat, cum ar fi NTP, pentru a menține ceasul de sistem sincronizat. (NTP este o modalitate de a menține sincronizată ora de sistem fie cu un server de timp undeva în rețea, fie cu un ceas radio conectat la sistemul dumneavoastră. Consultați RFC 1305.)
Dacă nucleul este compilat cu opțiunea „11 minute mode”, aceasta va fi activă atunci când disciplina de ceas a nucleului se află într-o stare de sincronizare. Când se află în această stare, bitul 6 (bitul care este setat în masca 0x0040) din variabila time_status a nucleului este dezactivat. Această valoare este afișată ca linie „status” (de stare) a comenzilor adjtimex --print sau ntptime.
Este nevoie de o influență externă, cum ar fi demonul NTP, pentru a pune disciplina ceasului din nucleu într-o stare de sincronizare și, prin urmare, pentru a activa „modul 11 minute”. Acesta poate fi dezactivat prin rularea oricărui lucru care ajustează ceasul de sistem în mod tradițional, inclusiv hwclock --hctosys. Cu toate acestea, dacă demonul NTP este încă în funcțiune, acesta va activa din nou „modul 11 minute” la următoarea sincronizare a ceasului de sistem.
Dacă sistemul dvs. funcționează cu „modul 11 minute” activat, este posibil să fie necesar să folosiți --hctosys sau --systz într-un script de pornire, în special dacă ceasul hardware este configurat să folosească scara de timp locală. Dacă nucleul nu este informat despre ce scară de timp folosește ceasul hardware, este posibil să o folosească pe cea greșită. În mod implicit, nucleul utilizează UTC.
Prima comandă din spațiul utilizatorului de stabilire a ceasului de sistem informează nucleul cu privire la scara de timp pe care o folosește ceasul hardware. Acest lucru se întâmplă prin intermediul variabilei nucleului persistent_clock_is_local. Dacă --hctosys sau --systz este prima, aceasta va defini această variabilă în funcție de fișierul adjtime sau de argumentul corespunzător din linia de comandă. Rețineți că, atunci când se utilizează această capacitate și se modifică configurarea scării temporale a ceasului hardware, este necesară o repornire pentru a notifica nucleul.
hwclock --adjust nu ar trebui să fie utilizată cu „modul 11 minute” NTP.
Valoarea secolului pentru ceasul hardware ISA¶
Există un fel de standard care definește octetul 50 al memoriei CMOS pe o mașină ISA ca indicator al secolului în care ne aflăm. hwclock nu utilizează sau configurează acel octet deoarece există unele mașini care nu definesc octetul în acest mod și, oricum, nu este necesar, deoarece anul secolului face o treabă bună în ceea ce privește indicarea secolului în care ne aflăm.
Dacă aveți o utilizare de bună credință pentru un octet de secol CMOS, contactați responsabilul hwclock; o opțiune poate fi potrivită.
Rețineți că această secțiune este relevantă numai atunci când utilizați metoda „direct ISA” de accesare a ceasului hardware. ACPI oferă o modalitate standard de accesare a valorilor de secol, atunci când acestea sunt acceptate de hardware.
CONFIGURAREA DATEI ȘI A OREI¶
Gestionarea timpului (dată+oră) fără sincronizare externă¶
Această discuție se bazează pe următoarele condiții:
Indiferent dacă mențineți sau nu ora exactă cu ajutorul daemonului NTP, este logic să configurați sistemul pentru a menține o dată și o oră relativ bune pe cont propriu.
Primul pas pentru a face acest lucru este să înțelegem clar care este situația în ansamblu. Există două dispozitive hardware complet separate care funcționează la propria viteză și care se îndepărtează de timpul „corect” în ritmuri proprii. Metodele și software-ul de corecție a abaterii sunt diferite pentru fiecare dintre ele. Cu toate acestea, majoritatea sistemelor sunt configurate pentru a face schimb de valori între aceste două ceasuri la pornire și la oprire. Acum, erorile de păstrare a timpului ale fiecărui dispozitiv în parte sunt transferate între ele. Încercați să configurați corecția abaterii doar pentru unul dintre ele, iar abaterea celuilalt se va suprapune peste aceasta.
Această problemă poate fi evitată atunci când se configurează corecția de abatere pentru ceasul de sistem, prin simpla ne-oprire a mașinii. Acest lucru, plus faptul că toată precizia hwclock (inclusiv calcularea factorilor de abatere) depinde de corectitudinea ritmului ceasului de sistem, înseamnă că ar trebui să se facă mai întâi configurarea ceasului de sistem.
Abaterea ceasului de sistem este corectată cu ajutorul opțiunilor --tick și --frequency a comenzii adjtimex(8). Aceste două opțiuni funcționează împreună: „--tick” este ajustarea grosieră, iar „--frequency” este ajustarea fină (pentru sistemele care nu au un pachet adjtimex, se poate folosi în schimb ntptime -f ppm).
Unele distribuții Linux încearcă să calculeze automat abaterea ceasului de sistem cu ajutorul operației de comparare a adjtimex. Încercarea de a corecta un ceas cu abatere folosind ca referință un alt ceas cu abatere, se aseamănă cu un câine care încearcă să-și prindă propria coadă. Succesul poate avea loc în cele din urmă, dar probabil că va fi precedat de un efort mare și de frustrări. Această automatizare poate aduce o îmbunătățire față de absența oricărei configurații, dar așteptarea unor rezultate optime ar fi o eroare. O alegere mai bună pentru configurarea manuală ar fi opțiunile --log de la adjtimex.
Ar putea fi mai eficient să urmăriți pur și simplu abaterea ceasului de sistem cu sntp, sau date -Ins și un ceas de precizie, apoi să calculați manual corecția.
După ce ați stabilit valorile pentru „--tick” și cele pentru „-frequency”, continuați să testați și să rafinați ajustările până când ceasul de sistem se menține potrivit. Consultați adjtimex(2) pentru mai multe informații și exemplul care demonstrează calculele de abatere manuală.
Odată ce ceasul de sistem (System Clock) funcționează fără probleme, treceți la ceasul hardware (Hardware Clock).
De regulă, abaterea la rece va funcționa cel mai bine pentru majoritatea cazurilor de utilizare. Acest lucru ar trebui să fie valabil chiar și în cazul mașinilor care funcționează 24/7 și a căror perioadă normală de oprire constă într-o repornire. În acest caz, valoarea factorului de abatere are o importanță redusă. Dar, în rarele ocazii în care mașina este oprită pentru o perioadă lungă de timp, atunci abaterea la rece ar trebui să dea rezultate mai bune.
1
2
3
4
5
6
Notă: dacă la pasul 6 se utilizează --systohc, atunci ceasul sistemului trebuie stabilit corect (pasul 6a) chiar înainte de a face acest lucru.
Calcularea factorului de abatere de către hwclock este un bun punct de plecare, dar pentru rezultate optime va trebui probabil să fie ajustat prin editarea directă a fișierului /etc/adjtime. Continuați să testați și să rafinați factorul de abatere până când ceasul hardware este corectat corect la pornire. Pentru a verifica acest lucru, asigurați-vă mai întâi că ora sistemului este corectă înainte de oprire și apoi utilizați sntp, sau date -Ins și un ceas de precizie, imediat după pornire.
LOCAL vs UTC¶
Ținerea ceasului hardware într-o scară de timp locală determină rezultate incoerente în ceea ce privește ora de vară:
Ceasul hardware de pe un sistem compatibil cu ISA păstrează doar data și ora, nu are noțiunea de fus orar și nici de ora de vară. Prin urmare, atunci când hwclock este informat că se află în ora locală, acesta presupune că se află în ora locală „corectă” și nu face nicio ajustare a orei citite de la el.
Linux gestionează schimbările de oră de vară în mod transparent numai atunci când ceasul hardware este menținut în scara de timp UTC. Acest lucru este facilitat pentru administratorii de sistem, deoarece hwclock utilizează ora locală pentru ieșire și ca argument pentru opțiunea --date.
Sistemele POSIX, precum Linux, sunt proiectate pentru ca ceasul de sistem să funcționeze pe scara de timp UTC. Scopul ceasului hardware este de a inițializa ceasul de sistem, astfel încât este logic să fie păstrat și în UTC.
Cu toate acestea, Linux încearcă să se adapteze la faptul că ceasul hardware se află în scara de timp locală. Acest lucru este valabil în primul rând pentru pornirea duală cu versiunile mai vechi ale MS Windows. Începând cu Windows 7, cheia de registru RealTimeIsUniversal ar trebui să funcționeze corect, astfel încât ceasul hardware să poată fi păstrat în UTC.
POSIX vs „CORECT”¶
O discuție despre configurarea datei și a orei ar fi incompletă dacă nu ar fi abordată și problema fuselor orare; acest aspect este în mare parte bine acoperit de tzset(3). Un domeniu care pare să nu aibă documentație este directorul „corect” al bazei de date a fusurilor orare, numit uneori „tz” sau „zoneinfo”.
Există două baze de date separate în sistemul zoneinfo, posix și „right” (corect). „Right” (numită acum „zoneinfo-leaps”) include secundele bisecte, iar posix nu. Pentru a utiliza baza de date „right”, ceasul de sistem trebuie să fie setat la (UTC + secundele bisecte), ceea ce este echivalent cu (TAI - 10). Acest lucru permite calcularea numărului exact de secunde dintre două date care traversează o epocă de secunde bisecte. Ceasul sistemului este apoi convertit la ora civilă corectă, inclusiv UTC, prin utilizarea fișierelor de fus orar „right/corecte” care scad secundele bisecte. Notă: această configurație este considerată experimentală și se știe că are probleme.
Pentru a configura un sistem pentru a utiliza o anumită bază de date, toate fișierele aflate în directorul acesteia trebuie copiate în rădăcina fișierului /usr/share/zoneinfo. Fișierele nu se utilizează niciodată direct din subdirectoarele posix sau „right”, de exemplu, TZ='right/Europe/Dublin'. Acest obicei devenise atât de frecvent încât proiectul „zoneinfo” din amonte a restructurat arborele de fișiere al sistemului prin mutarea subdirectoarelor posix și „right” din directorul zoneinfo în directoare fraterne:
/usr/share/zoneinfo, /usr/share/zoneinfo-posix, /usr/share/zoneinfo-leaps
Din nefericire, unele distribuții Linux au revenit la vechea structură arborescentă în pachetele lor. Astfel, problema administratorilor de sistem care ajung în subdirectorul „right/corect” persistă. Acest lucru face ca fusul orar al sistemului să fie configurat pentru a include secundele bisecte, în timp ce baza de date zoneinfo este încă configurată pentru a le exclude. Apoi, atunci când o aplicație, cum ar fi un ceas mondial, are nevoie de fișierul cu fusul orar South_Pole; sau un MTA de poștă electronică, sau hwclock are nevoie de fișierul cu fusul orar UTC; acestea îl preiau de la rădăcina /usr/share/zoneinfo , deoarece așa trebuie să facă. Aceste fișiere exclud secundele bisecte, dar ceasul de sistem le include acum, ceea ce provoacă o conversie incorectă a timpului.
Încercarea de a amesteca și de a potrivi fișiere din aceste baze de date separate nu va funcționa, deoarece fiecare dintre ele necesită ca ceasul de sistem să utilizeze o scară de timp diferită. Baza de date zoneinfo trebuie configurată pentru a utiliza fie posix, fie „right”, așa cum este descris mai sus, sau prin atribuirea unei rute la baza de date în variabila de mediu TZDIR.
STARE DE IEȘIRE¶
Una dintre următoarele valori de ieșire va fi returnată:
EXIT_SUCCESS („0” în sistemele POSIX)
EXIT_FAILURE („1” în sistemele POSIX)
MEDIU¶
TZ
TZDIR
FIȘIERE¶
/etc/adjtime
/etc/localtime
/usr/share/zoneinfo/
Fișierele de dispozitiv hwclock pot încerca să acceseze ceasul hardware: Dev/rtc0_ Dev/rtc0 /dev/rtc /dev/misc/rtc /dev/efirtc /dev/misc/efirtc
CONSULTAȚI ȘI¶
date(1), adjtime_config(5), adjtimex(8), gettimeofday(2), settimeofday(2), crontab(1p), tzset(3)
AUTORI¶
Scris de Bryan Henderson <bryanh@giraffe-data.com>, septembrie 1996, pe baza lucrărilor efectuate pe programul clock(8) de Charles Hedrick, Rob Hooft și Harald Koenig. Consultați codul sursă pentru un istoric complet și o listă de credite (mulțumiri adresate diferiților contribuitori).
RAPORTAREA ERORILOR¶
Pentru rapoarte de eroare, folosiți sistemul de urmărire al erorilor la <https://github.com/util-linux/util-linux/issues>.
DISPONIBILITATE¶
Comanda hwclock face parte din pachetul util-linux care poate fi descărcat de la Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.
2025-01-09 | util-linux 2.40.3 |