Hogyan állítsuk be és tartsuk szinkronban a pontos időt Debian rendszerű számítógépünkön a systemd-timesyncd szolgáltatás segítségével

botond küldte be 2024. 01. 18., cs – 20:15 időpontban

Tartalom

 

Bevezető

A modern informatika világában a pontos idő használata kritikus jelentőségű szempont. A mai Linux operációs rendszerekben számos megoldás kínálkozik arra, hogy rendszerünk órája mindig szinkronban legyen a világidővel. De miért is olyan fontos ez?

  • Sok biztonsági protokoll, mint például a TLS/SSL, amely az internetes kommunikáció alapját képezi, erősen támaszkodik a pontos időzítésre. Az időeltérések biztonsági réseket nyithatnak meg, melyeket a támadók kihasználhatnak.
  • Adatbázis-kezelő rendszerek, fájlrendszerek és más kritikus rendszerek is támaszkodnak a pontos időbélyegekre. Az időeltérések adatvesztéshez vagy inkonzisztenciához vezethetnek.
  • Szerverek és kliens rendszerek közötti kommunikáció során elengedhetetlen a pontos idő. Ez különösen fontos a hálózati műveletek, mint a naplózás és a hibakeresés során.
  • Pénzügyi tranzakciók és más időérzékeny üzleti folyamatok is megbízható időszinkronizációra támaszkodnak.
  • Rendszernaplók készítése esetén is fontos, hogy a különböző forrásokból (például más számítógépekről, eszközökről) érkező adatok időbélyegei összhangban legyenek.

Ebben a rövid leírásban megnézzük, hogyan állíthatjuk be a dátumot, a pontos időt és az időzónánkat kézzel, illetve hogyan aktiválhatjuk az internettel történő időszinkronizációt.

 

 

Dátum és idő lekérdezése

A dátumot és az időt a legegyszerűbben a date parancs segítségével kérdezhetjük le:

date

Dátum és idő lekérdezése a date parancs segítségével

Ha több információt szeretnénk megjeleníteni, akkor pedig a timdatectl parancsot használhatjuk:

timedatectl

Dátum és idő lekérdezése a timedatectl parancs segítségével

Amikor a Linux operációs rendszer elindul, beolvassa az RTC-ből az időt és inicializálja a saját rendszeróráját, amit szoftveresen kezel. A rendszeróra a kernelben van implementálva és nagy pontosságú időmérő hardveres eszközökön (mint például a HPET, High Precision Event Timer) alapul. Ez a rendszeróra számolja az időt a rendszer bekapcsolása óta, és ezt használják az operációs rendszer és az alkalmazások az aktuális idő meghatározására.

A fenti parancsok tehát a rendszeridőt kérdezik le, amit a Linux rendszer az elindulásakor a hardverórától (RTC) kérdez le, és a futása során a kernel szoftveresen mér.

Lehetőség van magát a hardverórát is lekérdeznünk, ezt root-ként tehetjük meg a hwclock parancs segítségével:

sudo hwclock --show

Hardveróra lekérdezése a hwclock parancs segítségével

A legtöbb számítógép alaplapján van egy kis elemmel táplált hardveróra, ami az úgynevezett RTC (Real Time Clock), vagy CMOS óra. Ez az óra folyamatosan fut, még akkor is, ha a számítógép ki van kapcsolva, vagy alacsony energiaszinten van (például hibernálva), és fenntartja az alapvető idő- és dátuminformációkat.

 

 

Dátum és idő beállítása

A dátumot és a pontos időt a legkényelmesebben szintén a date paranccsal állíthatjuk be:

date -s "YYYY-MM-DD HH:MM:SS"

 Ahol a beállítás formátuma az év-hónap-nap óra:perc:másodperc.

Dátum és idő beállítása a date parancs segítségével

A sikeres beállítás után a parancs a kimenetén visszaadja a beállított dátumot és időt.

Az időt a timedatectl paranccsal is beállíthatjuk:

timedatectl set-time "YYYY-MM-DD HH:MM:SS"

Dátum és idő beállítása a timedatectl parancs segítségével

Itt azonban ahogy a képen is szemléltetésre került, ha be van kapcsolva a NTP szinkronizáció (erről később), akkor nem lehet manuálisan beállítani az időt, ilyenkor ezt a hibaüzenetet adja:

Failed to set time: Automatic time synchronization is enabled

Ilyenkor előbb ki kell kapcsolni az NTP szinkronizációt, és utána visszakapcsolni. Persze ennek a gyakorlatban nincs semmi értelme, mivel az NTP szinkronizáció visszakapcsolásakor úgy is beállítja a pontos időt az internetről, bármit is állítottunk be előtte kézzel. Ezzel a példával inkább csak az időkezelési funkciók logikáját érthetjük meg könnyebben.

Itt fontos megjegyezni, hogy ezek az időbeállító parancsok csak a rendszeridőt állítják be, és nem a hardveres órát.

A Linux rendszereknél a rendszeróra és a hardveróra (RTC) szinkronizálása általában leállításkor történik. Ez azt jelenti, hogy ha manuálisan beállítjuk rendszerórát a date vagy timedatectl parancsok segítségével, és ezután leállítjuk a számítógépet, akkor a leállítási folyamat során a rendszer alapértelmezés szerint frissíti az RTC-t a rendszeróra értékeivel. Ezért a következő indításkor az RTC és a rendszeróra azonos időt mutat.

Azonban, ha a számítógép hirtelen áramkimaradás miatt áll le vagy ha az operációs rendszer nem szabályosan futtatja a leállítási rutinokat, akkor előfordulhat hogy a rendszeróra változtatásai nem kerülnek átfrissítésre az RTC-re és a következő indításkor a rendszeróra az RTC-ből olvasott értékre áll vissza.

A folyamat lényege hogy amikor a számítógép leáll, a rendszer az aktuális rendszeridőt "visszaírja" az RTC-be, ezzel biztosítva hogy a hardveróra pontos legyen a következő indításkor. Ez azért fontos mert az RTC az, ami fenntartja az időt amikor a számítógép ki van kapcsolva vagy alacsony energiafogyasztású állapotban van.

Ez a megközelítés biztosítja, hogy a rendszeridő és a hardveridő közötti konzisztencia megmaradjon az újraindítások és a rendszer kikapcsolásai között.

A pontos viselkedés függ a rendszer konfigurációjától és a használt disztribúciótól. Egyes rendszerek úgy vannak beállítva, hogy csak manuális beavatkozásra, vagy specifikus szolgáltatások futtatására frissítsék az RTC-t a rendszeróra alapján. A rendszeróra és a hardveróra (RTC) oda-vissza történő kézi szinkronizációját lentebb tekintjük át.

 

Időzóna beállítása

A dátum és idő beállításán kívül még az időzónát is módosíthatjuk, amennyiben nem megfelelő a beállítás. Az elérhető időzónákat az alábbi paranccsal listázhatjuk ki:

timedatectl list-timezones

Időzónák kilistázása

Időzónák kilistázása - Europe/Budapest

Ha megtaláltuk a listán a beállítani kívánt időzónát, akkor az alábbi paranccsal állíthatjuk be:

timedatectl set-timezone Europe/Budapest

Ez is a rendszerórát állítja be, így a hardveres óra (RTC) a leállításkor kerül beállításra, vagy amikor kézzel szinkronizáljuk.

 

 

Hardveres óra (RTC) kézi szinkronizálása

Ha kézzel szeretnénk szinkronizálni a hardveres órát (RTC), akkor ezt mindkét irányban megtehetjük az alábbi parancsok segítségével:

Rendszeróra frissítése a hardveróra alapján:

sudo hwclock --hctosys

Hardveres óra (RTC) kézi szinkronizálása - Rendszeróra frissítése

Itt egy példát láthatunk, ahol először egyetlen parancssorban kérdeztem le a rendszerórát és a hardverórát, hogy minél pontosabb időket kapjak. Itt látszik, hogy a hardveres óra késik egy másodpercet a rendszerórához képest. Ezután futtattam a --hctosys opciót, amivel a hardverórának az idejét állította be a rendszerórában. Ezután újból lekérdeztem a két időt ugyanúgy egyszerre. Ekkor már a másodpercek is egyeztek.

Hardveres óra frissítése a rendszeróra alapján:

sudo hwclock --systohc

A művelet fordítottja pedig értelemszerűen a rendszeróra idejét állítja be a hardveres órába (RTC).

A hwclock manual oldalából idézve:

[...]
DATE-TIME CONFIGURATION
   Keeping Time without External Synchronization
       This discussion is based on the following conditions:

       • Nothing is running that alters the date-time clocks, such as NTP daemon or a cron job."

       • The system timezone is configured for the correct local time.  See below, under POSIX vs 'RIGHT'.

       • Early during startup the following are called, in this order:
         adjtimex --tick value --frequency value
         hwclock --hctosys

       • During shutdown the following is called:
         hwclock --systohc
[...]

A lényeg itt a felsorolás utolsó tételében van, tehát a rendszer leálláskor ezt a műveletet hajtja végre, így a számítógép kikapcsolásakor frissíti a hardveres órát a rendszeróra pontos idejével, ahogy fentebb már volt erről szó.

 

Dátum és idő szinkronizálása az internetről a systemd-timesyncd segítségével

Az internetről többféle szolgáltatás segítségével szinkronizálhatjuk le számítógépünkre a pontos világidőt, melynek segítségével rendszerünk ideje teljesen pontossá válik, így akár más számítógépekkel történő kommunikáció során is pontosan fognak működni a különböző hálózati protokollok, stb.

Ebben a fejezetben megnézzük, hogyan tudjuk aktiválni az internetről történő időszinkronizációt a systemd-timesyncd szolgáltatás használatával.

A systemd-timesyncd egy egyszerű NTP (Network Time Protocol) protokollon alapuló kliens, amely célja, hogy egy alapvető, de hatékony időszinkronizációs megoldást biztosítson a Linux rendszerek számára, anélkül, hogy szükség lenne a teljes értékű NTP daemon (például ntpd vagy chrony) telepítésére és konfigurálására.

A szolgáltatás telepítéséhez futtassuk az alábbi parancsot:

sudo apt-get install systemd-timesyncd

A systemd-timesyncd szolgáltatás telepítése

Ezután ellenőrizhetjük a timedatectl paranccsal hogy működik-e a szinkronizáció:

timedatectl

Dátum és idő szinkronizáció ellenőrzése

És itt már láthatjuk a "yes" és "active" soroknál, hogy működik a szinkronizáció.

 

 

Konklúzió

Ebből a rövid leírásból megtudhattuk, hogyan tekinthetjük meg a rendszeridőt és a hardveres órát (RTC), valamint hogyan állíthatjuk be ezeket, és hogyan szinkronizálhatjuk számítógépünk idejét a systemd-timesyncd szolgáltatás segítségével, hogy rendszerünk órája mindig pontos maradjon.