108.1 Lecke 1
Tanúsítvány: |
LPIC-1 (102) |
---|---|
Verzió: |
5.0 |
Témakör: |
108 Alapvető rendszerszolgáltatások |
Fejezet: |
108.1 Rendszeridő karbantartása |
Lecke: |
1/2 |
Bevezetés
A pontos időmérés elengedhetetlenül fontos a modern számítástechnika számára, azonban ennek megvalósítása meglepően összetett. Az időmérés gyakorlata a végfelhasználó számára triviálisnak tűnik, a rendszernek azonban számos sajátosságot és szélsőséges tényezőt kell tudnia intelligensen kezelni. Gondoljunk arra, hogy az időzónák nem statikusak, hanem adminisztratív vagy politikai döntéssel megváltoztathatók. Egy ország dönthet úgy, hogy nem tartja be a nyári időszámítást. Minden programnak képesnek kell lennie arra, hogy ezeket a változásokat logikusan kezelje. A rendszergazdák szerencséjére a Linux operációs rendszer időmérési megoldásai kiforrottak, robusztusak és általában különösebb beavatkozás nélkül működnek.
Amikor egy Linux-számítógép elindul, elkezdi az időmérést. Ezt nevezzük rendszerórának (system clock), mivel az operációs rendszer frissíti. A modern számítógépek emellett rendelkeznek egy hardveres vagy real time clock órával is. Ez a hardveres óra gyakran az alaplap egyik eleme, és attól függetlenül követi az időt, hogy a számítógép fut-e vagy sem. A rendszerindítás során a rendszeridő a hardveres óráról kerül beállításra, de a legtöbb esetben ez a két óra egymástól függetlenül fut. Ebben a leckében a rendszer- és a hardverórával való interakció módszereit fogjuk megvitatni.
A legtöbb modern Linux rendszerben a rendszeridő és a hardveridő a hálózati időhöz (network time) van szinkronizálva, amelyet a Network Time Protocol (NTP) valósít meg. Az esetek túlnyomó többségében a normál felhasználónak csak az időzóna beállítását kell elvégeznie, a többiről pedig az NTP gondoskodik. Azonban az idővel való manuális munka néhány módjáról is lesz szó, a hálózati idő konfigurálásának sajátosságait pedig a következő leckében tárgyaljuk.
Helyi vs univerzális idő
A rendszer órája az egyezményes koordinált világidőre (UTC) van állítva, amely az Egyesült Királyságban, Greenwichben érvényes helyi idő. A felhasználó általában a helyi időt szeretné tudni.A helyi idő kiszámítása úgy történik, hogy az UTC-időből veszünk egy eltolódást (offset) az időzóna és a nyári időszámítás alapján. Így sok bonyolultság elkerülhető.
A rendszer óráját UTC-időre vagy helyi időre is be lehet állítani, de ajánlott, hogy UTC-időre is legyen beállítva.
Dátum
A date
egy alapvető segédprogram, amely egyszerűen kiírja a helyi időt:
$ date Sun Nov 17 12:55:06 EST 2019
A date
parancs kapcsolói megváltoztatják a kimenet formátumát.
A felhasználó például a date -u
paranccsal megtekintheti az aktuális UTC-időt.
$ date -u Sun Nov 17 18:02:51 UTC 2019
Néhány más, gyakran használt kapcsoló a helyi időt olyan formátumban adja vissza, amely megfelel egy elfogadott RFC formátumnak:
-I
-
Dátum/idő ISO 8601 formátumban. A
date
(-Idate
) hozzáadása csak a dátumra korlátozza a kimenetet. Egyéb formátumok:hours
,minutes
,seconds
ésns
, ami a nanoszekundumot jelenti. -R
-
RFC 5322 formátumban adja vissza a dátumot és az időt.
--rfc-3339
-
RFC 3339 formátumban adja vissza a dátumot és az időt.
A date
formátumát a felhasználó testre szabhatja a man oldalon megadott szekvenciákkal. Például az aktuális időt Unix időként így lehet formázni:
$ date +%s 1574014515
A date
man oldaláról láthatjuk, hogy a %s
a Unix időre utal.
A Unix-időt a legtöbb Unix-szerű rendszer belsőleg használja. Az UTC-időt az Epoch óta eltelt másodpercek számaként tárolja, amely 1970. január 1.
Note
|
A Unix-idő tárolásához jelenleg 32 bit szükséges. A jövőben a 32 bit nem lesz elegendő az aktuális idő Unix formátumban történő tárolására, ez pedig komoly problémákat fog okozni minden 32 bites Linux rendszerben. Szerencsére ez nem fog bekövetkezni 2038. január 19-ig. |
Ezekkel a szekvenciákkal a dátumot és az időt szinte bármilyen alkalmazás által igényelt formátumúra tudjuk formázni. Természetesen a legtöbb esetben sokkal jobb, ha ragaszkodunk egy elfogadott szabványhoz.
Ezen kívül a date --date
használható a nem aktuális idővel megegyező időpont formázására is. Az alábbi példában a felhasználó a rendszerre alkalmazandó dátumot Unix idővel adja meg:
$ date --date='@1564013011' Wed Jul 24 20:03:31 EDT 2019
A --debug
kapcsoló használata nagyon hasznos lehet annak biztosítására, hogy a dátumot sikeresen lehessen elemezni. Figyeljük meg, mi történik, ha egy érvényes dátumot adunk át a parancsnak:
$ 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)
Ez hasznos eszköz lehet egy dátumot generáló alkalmazás hibaelhárításakor.
Hardveres óra
A felhasználó futtathatja az hwclock
parancsot a valós idejű óra által fenntartott idő megtekintéséhez. Ehhez a parancshoz emelt szintű jogosultságok szükségesek, ezért ebben az esetben a sudo
parancsot fogjuk használni a parancs meghívására:
$ sudo hwclock 2019-11-20 11:31:29.217627-05:00
A --verbose
kapcsoló használata több kimenetet ad vissza, ami hasznos lehet hibaelhárításkor:
$ 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
Figyeljük meg a Calculated Hardware Clock drift
értéket. Ebből a kimenetből megtudhatjuk, hogy a rendszeridő és a hardveridő eltér-e egymástól.
timedatectl
A timedatectl
egy olyan parancs, amely az idő és a dátum általános állapotának ellenőrzésére használható, beleértve azt is, hogy a hálózati idő szinkronizálva van-e vagy sem (a Network Time Protocol a következő leckében lesz tárgyalva).
Alapértelmezés szerint a timedatectl
a date
-hez hasonló információkat ad vissza, de kiegészítve azt az RTC (hardveres) idővel, valamint az NTP szolgáltatás állapotával:
$ 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
Az idő beállítása a timedatectl segítségével
Ha az NTP nem érhető el, akkor az idő beállításához a date
vagy a hwclock
helyett a timedatectl
használata ajánlott:
# timedatectl set-time '2011-11-25 14:00:00'
A folyamat hasonló a date
-hez. A felhasználó a dátumtól független időt is beállíthat HH:MM:SS formátumban.
Az időzóna beállítása a timedatectl segítségével
systemd
alapú Linux rendszereken a timedatectl
a helyi időzóna beállításának preferált módja, ha nincs elérhető GUI. A timedatectl
felsorolja a lehetséges időzónákat, majd az időzóna beállítható ezek egyikének argumentumként való felhasználásával.
Először kilistázzuk a lehetséges időzónákat:
$ timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Algiers Africa/Bissau Africa/Cairo ...
A lehetséges időzónák listája hosszú, ezért ebben az esetben a grep
parancs használata ajánlott.
Ezután beállíthatjuk az időzónát a visszakapott lista egyik elemével:
$ 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
Ne feledjük, hogy az időzóna nevének pontosnak kell lennie! Az Africa/Cairo
például megváltoztatja az időzónát, de a Cairo
vagy az africa/cairo
nem!
Az NTP kikapcsolása a timedatectl segítségével
Bizonyos esetekben szükség lehet az NTP letiltására. Ezt megtehetjük a systemctl
segítségével, de most mi ezt a timedatectl
segítségével fogjuk bemutatni:
# 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
Az időzóna beállítása a timedatectl nélkül
Az időzóna-információk beállítása a Linux új gépre történő telepítésekor szokásos lépés. Ha van grafikus telepítési folyamat, akkor ez valószínűleg minden további felhasználói beavatkozás nélkül megtörténik.
A /usr/share/zoneinfo
mappa tartalmazza a lehetséges különböző időzónák adatait. A zoneinfo
mappában vannak almappák, amelyek a kontinensek neveit, valamint egyéb szimbolikus linkeket tartalmaznak. Javasoljuk, hogy a saját régiónk zoneinfo
mappáját a saját kontinensünktől kezdve keressük meg!
A zoneinfo
fájlok tartalmazzák a helyi időeltolódás kiszámításához szükséges szabályokat az UTC-hez képest, és akkor is fontosak, ha az aktuális régiónkban van nyári időszámítás. Az /etc/localtime
tartalmát olvassa be a Linux, amikor meg kell határoznia a helyi időzónát. Ahhoz, hogy az időzónát a felhasználói felület használata nélkül állítsa be, a felhasználónak szimbolikus linket kell létrehoznia a /usr/share/zoneinfo
-ból az /etc/localtime
-be. Például:
$ ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime
A megfelelő időzóna beállítása után javasolt az alábbit futtatni:
# hwclock --systohc
Ezzel a hardverórát a rendszerórához igazítja (azaz a valós idejű óra a date
időponttal azonos időre lesz beállítva). Ez a parancs csak root jogosultságokkal futtatható, a fenti esetben root-ként bejelentkezve.
Az /etc/timezone
hasonló az /etc/localtime
-hoz. Ez a helyi időzóna adatreprezentációja, és mint ilyen, a cat
segítségével olvasható:
$ cat /etc/timezone America/Toronto
Vegyük figyelembe, hogy ezt a fájlt nem minden Linux disztribúció használja!
A dátum és idő beállítása a timedatectl nélkül
Note
|
A legtöbb modern Linux rendszer a |
A date használata
A date
rendelkezik egy kapcsolóval a rendszeridő beállításához, ez pedig a --set
vagy -s
. Használhatjuk a --debug
-ot is, hogy ellenőrizzük a parancsot:
# date --set="11 Nov 2011 11:11:11"
Vegyük figyelembe, hogy a dátum beállításához root jogosultságok szükségesek! Az időt vagy a dátumot önállóan is megváltoztathatjuk:
# date +%Y%m%d -s "20111125"
Itt meg kell adnunk a szekvenciákat, hogy a stringünk megfelelően legyen elemezve. Például a %Y
az évre utal, így az első négy számjegyet (2011
) a 2011-es évnek fogja értelmezni. Hasonlóképpen, a %T
az időre vonatkozó szekvencia, ezt az idő beállításával mutatjuk be:
# date +%T -s "13:11:00"
A rendszeridő módosítása után ajánlott a hardverórát is beállítani, hogy a rendszer- és a hardveróra szinkronizálódjon:
# hwclock --systohc
A systohc
a “system clock to hardware clock” rövidítése.
A hwclock használata
A rendszeróra beállítása és a hardveróra frissítése helyett megfordíthatjuk a folyamatot. A hardveróra beállításával kezdjük:
# hwclock --set --date "4/12/2019 11:15:19" # hwclock Fri 12 Apr 2019 6:15:19 AM EST -0.562862 seconds
Vegyük észre, hogy az hwclock
alapértelmezés szerint UTC időt vár, de alapértelmezés szerint a helyi időt adja vissza!
A hardveróra beállítása után frissítenünk kell a rendszerórát. Az hctosys
azt jelenti, hogy “hardware clock to system clock”.
# hwclock --hctosys
Gyakorló feladatok
-
Jelezzük, hogy a következő parancsok a rendszeridőt vagy a hardveridőt jelenítik meg vagy módosítják:
Parancs(ok) Rendszer Hardver Mindkettő 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
-
Figyeljük meg a következő kimenetet, majd javítsuk ki az argumentum formátumát, hogy a parancs sikeres legyen:
$ 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’
-
A
date
parancs és a szekvenciák használatával állítsuk be, hogy a rendszer hónapja február legyen! A dátum és az idő többi része maradjon változatlan! -
Feltételezve, hogy a fenti parancs sikeres volt, használjuk az
hwclock
parancsot a hardveróra beállításához a rendszeróra alapján! -
Van egy
eucla
nevű lokáció. Melyik kontinenshez tartozik? Derítsük ki agrep
használatával! -
Állítsuk be az aktuális időzónát
eucla
-ra!
Gondolkodtató feladatok
-
Melyik időbeállítási módszer az optimális? Milyen forgatókönyv esetén lenne lehetetlen az előnyben részesített módszer használata?
-
Mi lehet az oka annak, hogy ennyi módszer van ugyanannak a dolognak, például a rendszeridő beállításának az elérésére?
-
2038. január 19. után a Linux System Time 64 bites számot igényel a tároláshoz. Lehetséges azonban, hogy egyszerűen csak egy “New Epoch” beállítását választjuk. Például 2038. január 1-jén éjfélkor
0
lenne a New Epoch Time. Vajon miért nem ez a megoldás a legközkedveltebb?
Összefoglalás
Ebben a leckében megtanultuk:
-
Hogyan jeleníthetjük meg az időt különböző formátumokban a parancssorból.
-
A különbséget a rendszeróra és a hardveróra között Linuxban.
-
Hogyan állíthatjuk manuálisan a rendszerórát.
-
Hogyan állíthatjuk be manuálisan a hardverórát.
-
Hogyan lehet megváltoztatni a rendszer időzónáját.
A leckében használt parancsok:
date
-
A rendszeróra megjelenítése vagy módosítása. Egyéb lehetőségek:
-u
-
UTC-idő megjelenítése.
+%s
-
Szekvencia használata az Epoch idő megjelenítéséhez.
--date=
-
Egy adott idő megjelenítése a valós idő helyett.
--debug
-
Debug üzenetek megjelenítése a felhasználó által megadott dátum elemzéséhez.
-s
-
A rendszeridő manuális beállítása.
hwclock
-
A hardveróra megjelenítése vagy módosítása.
--systohc
-
A hardveróra beállítása a rendszeróra segítségével.
--hctosys
-
A rendszeróra beállítása a hardveróra segítségével.
--set --date
-
A hardveróra manuális beállítása.
timedatectl
-
Rendszer- és hardverórák, valamint az NTP konfiguráció megjelenítése systemd-alapú Linux rendszereken.
set-time
-
Az idő manuális beállítása.
list-timezones
-
Lehetséges időzónák listázása.
set-timezone
-
Időzóna manuális beállítása.
set-ntp
-
NTP engedélyezése/tiltása.
Válaszok a gyakorló feladatokra
-
Jelezzük, hogy a következő parancsok a rendszeridőt vagy a hardveridőt jelenítik meg vagy módosítják:
Parancs(ok) Rendszer Hardver Mindkettő 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
-
Figyeljük meg a következő kimenetet, majd javítsuk ki az argumentum formátumát, hogy a parancs sikeres legyen:
$ 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"
-
A
date
parancs és a szekvenciák használatával állítsuk be, hogy a rendszer hónapja február legyen! A dátum és az idő többi része maradjon változatlan!date +%m -s "2"
-
Feltételezve, hogy a fenti parancs sikeres volt, használjuk az
hwclock
parancsot a hardveróra beállításához a rendszeróra alapján!hwclock -systohc
-
Van egy
eucla
nevű lokáció. Melyik kontinenshez tartozik? Derítsük ki agrep
használatával!timedatectl list-timezones \| grep -i eucla
VAGY
grep -ri eucla /usr/share/zoneinfo
-
Állítsuk be az aktuális időzónát
eucla
-ra!.timedatectl set-timezone 'Australia/Eucla'
VAGY
ln -s /usr/share/zoneinfo/Australia/Eucla /etc/localtime
Válaszok a gondolkodtató feladatokra
-
Melyik időbeállítási módszer az optimális? Milyen forgatókönyv esetén lenne lehetetlen az előnyben részesített módszer használata?
A legtöbb Linux-disztribúcióban az NTP alapértelmezés szerint engedélyezve van, és hagyni kell, hogy mindenféle beavatkozás nélkül állítsa be a rendszeridőt. Ha azonban van olyan Linux rendszer, amely nincs csatlakoztatva az internethez, az NTP nem lesz elérhető. Például egy ipari berendezésen futó beágyazott Linux rendszer nem biztos, hogy rendelkezik hálózati kapcsolattal.
-
Mi lehet az oka annak, hogy ennyi módszer van ugyanannak a dolognak, például a rendszeridő beállításának az elérésére?
Mivel az idő beállítása évtizedek óta az összes *nix rendszer követelménye, az idő beállítására számos régi módszer létezik, amelyeket még mindig fenntartanak.
-
2038. január 19. után a Linux System Time 64 bites számot igényel a tároláshoz. Lehetséges azonban, hogy egyszerűen csak egy “New Epoch” beállítását választjuk. Például 2038. január 1-jén éjfélkor
0
lenne a New Epoch Time. Vajon miért nem ez a megoldás a legközkedveltebb?2038-ra a számítógépek túlnyomó többsége már 64 bites CPU-t fog használni, és a 64 bites szám használata nem fogja jelentősen rontani a teljesítményt. Lehetetlen lenne azonban megbecsülni az Epoch time “nullázásának” kockázatát. Rengeteg olyan legacy szoftver van, amelyre ez hatással lehet. A bankok és nagyvállalatok például gyakran nagy mennyiségű régebbi programmal rendelkeznek, amelyek csak belső használatra vannak. Ez a forgatókönyv, sok máshoz hasonlóan, a kompromisszumok tanulmányozása. A 2038-ban még futó 32 bites rendszerekre hatással lenne az Epoch Time túlcsordulása, de az Epoch értékének megváltoztatásával a legacy szoftverekre is hatással lenne.