Kdy výraz „změněno“ neznamená totéž co „upraveno“? Odpověď je jednoduchá – v kontextu časových údajů souborů v operačním systému Linux. Tento průvodce vám objasní, jak systém tato časová razítka aktualizuje a jak je můžete sami modifikovat.
Rozdíl mezi atime, mtime a ctime
Každý soubor v systému Linux má tři specifické časové značky: atime (čas posledního přístupu), mtime (čas poslední modifikace obsahu) a ctime (čas poslední změny metadat).
Časová značka přístupu (atime) zaznamenává okamžik, kdy byl soubor naposledy otevřen pro čtení. To znamená, že program nebo uživatel zobrazil obsah souboru nebo z něj načetl data. Nebyly prováděny žádné změny obsahu – data byla pouze nahlédnuta, nikoli modifikována.
Upravená časová značka (mtime) udává, kdy byl obsah souboru naposledy změněn. Aplikace nebo proces provedly úpravy nebo manipulaci se souborem. „Upraveno“ tedy znamená, že došlo ke změně, odstranění nebo přidání dat uvnitř souboru.
Změněná časová značka (ctime) se nevztahuje ke změnám v obsahu souboru. Označuje čas, kdy byly provedeny změny v metadatech souboru, jako jsou například změny oprávnění. Například, změna přístupových práv souboru aktualizuje právě tuto značku.
Standardní souborový systém ext4, používaný v Linuxu, sice rezervuje prostor pro čas vytvoření souboru, ale tato funkce zatím nebyla plně implementována. Ačkoli se někdy toto datum vyplní, neměli byste se na jeho hodnotu spoléhat.
Anatomie časové značky
Časové značky v Linuxu neukládají datum a čas v tradičním slova smyslu, ale jako číselnou hodnotu. Toto číslo představuje počet sekund, které uplynuly od počátku Unixové epochy, tedy od půlnoci (00:00:00) 1. ledna 1970 v koordinovaném světovém čase (UTC). Přestupné sekundy se v těchto časových značkách neberou v potaz, tudíž nejsou přímo synchronní se skutečným časem.
Když Linux potřebuje zobrazit časovou značku, transformuje počet sekund na lidsky čitelné datum a čas. Výsledné datum a čas se odvíjejí od nastavení umístění a časového pásma počítače, který soubor zobrazuje. To také zaručuje, že měsíc bude uveden ve správném jazyce.
Jaké je tedy maximální číslo, které může být uloženo v časové značce? Je to 2 147 483 647 sekund. Ačkoli je toto číslo obrovské, může být nedostatečné v budoucnu. Pokud toto číslo přičteme k Unixové epoše a přepočítáme na datum, získáme úterý 19. ledna 2038 v 03:14:07. Proto bude nutné do té doby vymyslet nový systém časových značek.
Zobrazování časových značek
Při použití příkazu ls s přepínačem -l (dlouhý výpis), jak vidíte níže, uvidíte upravenou časovou značku (mtime):
ls -l dp.c
Pokud si přejete zobrazit časovou značku přístupu (atime), použijte přepínač -lu (čas přístupu):
ls -lu dp.c
A pro zobrazení časové značky změny (ctime), použijte přepínač -lc (čas změny):
ls -lc dp.c
Výše uvedené časové značky ukazují, že soubor byl naposledy upraven 21. dubna 2019. Přístupová a změněná časová značka jsou identické, jelikož soubor byl zkopírován z jiného počítače 20. ledna 2020 a obě tyto značky byly tehdy aktualizovány.
Chcete-li zobrazit všechny časové značky současně, použijte příkaz stat:
stat dp.c
Časová pásma jsou uvedena ve spodní části výpisu. Jak můžete vidět, časová značka má i velmi přesnou komponentu ve zlomcích sekund. Na konci každé časové značky můžete vidět -0500 nebo -0400.
Toto jsou posuny časových pásem. Systém souborů eviduje časové značky v UTC a konvertuje je na místní časové pásmo, když jsou zobrazeny pomocí příkazu stat. Počítač použitý k tvorbě tohoto článku má nastavené časové pásmo východního standardního času (EST) v USA.
Toto časové pásmo je pět hodin za UTC v době platnosti EST. Nicméně v době platnosti východního letního času (EDT) je o čtyři hodiny za UTC. V dubnu 2019, kdy byla naposledy upravena časová značka, platil EDT. Proto dvě časové značky mají pětihodinový posun, ale upravená značka má čtyřhodinový posun.
Posuny a časová pásma nejsou nikde uloženy. Neexistuje žádný inode ani vyhrazený prostor v souborovém systému pro uložení těchto hodnot. Tyto hodnoty jsou vypočítávány za běhu pomocí časové značky (která je vždy v UTC), místního časového pásma počítače, na kterém se soubor zobrazuje, a informace, zda platí letní čas.
Můžete také vidět časovou značku „Narození“, která je vyhrazena pro datum vytvoření souboru. Tato funkce však není implementována a místo časové značky je zobrazena pomlčka „-“.
Modifikace časových značek
Pokud potřebujete, můžete časové značky souboru změnit. Pomocí příkazu touch můžete upravit časové značky přístupu nebo úprav, nebo obě současně:
touch -a dp.c
Pro nastavení nové časové značky přístupu (atime) použijte přepínač -a (čas přístupu). Tento příkaz nastaví čas přístupu na aktuální čas systému:
stat dp.c
Časová značka přístupu byla, jak se očekávalo, upravena. Změněná časová značka (ctime) byla ovšem také aktualizována, což je standardní chování.
Pro změnu upravené časové značky (mtime) použijte přepínač -m (upravený čas):
touch -m dp.c
stat dp.c
Tentokrát byly aktualizovány upravené (mtime) a změněné (ctime) časové značky.
Pokud chcete změnit časové značky přístupu i úprav současně, můžete použít přepínač -d (datum). Můžete také specifikovat přesný čas a datum. Nemusíte nutně nastavovat časové značky na aktuální čas.
Pro nastavení časových značek přístupu a úprav na 15. ledna 2020, 10:30:45 použijeme následující příkaz:
touch -d "2020-01-15 10:30:45" dp.c
stat dp.c
Nyní jsou časové značky přístupu a úprav nastaveny na datum v minulosti. Změněná časová značka (ctime) byla také aktualizována na aktuální čas systému.
Můžete také použít přepínač -r (odkaz), pokud si přejete nastavit časové značky jednoho souboru na hodnoty jiného souboru:
touch dp.c -r dice_words.sl3
stat dp.c
A tak jsme téměř tam, kde jsme začali, se směsí časových značek -0400 a -0500.
Nyní udělejme akci, která ovlivní pouze změněnou časovou značku. Použijeme příkaz chmod pro přidání práva spouštění pro všechny uživatele:
chmod +x dp
stat dp
Změněná časová značka (ctime) byla jediná, která se aktualizovala. Důvodem je, že samotný soubor nebyl změněn, nebyl ani otevírán, ani upravován. Nicméně metadata souboru byla změněna.
Jak systém souborů aktualizuje časové značky
Když je systém souborů připojen, můžete použít různé možnosti, které určují, jak se má systém souborů chovat. Tyto možnosti jsou uloženy v souboru /etc/fstab, který je načítán a zpracováván při startu systému. Můžete také nastavit možnosti pro určování způsobu aktualizace časové značky přístupu (atime).
Níže naleznete některé z nejběžnějších možností:
strictatime (strict atime): Tato volba aktualizuje časovou značku přístupu (atime) souborů pokaždé, když jsou otevřeny. Tento přístup má určitou režii, ale pro některé servery může být výhodný. Pro běžné desktopové a přenosné počítače má malou hodnotu.
noatime (no atime): Tato volba zcela zakazuje aktualizaci časových značek přístupu (atime) pro soubory i adresáře. Upravené časové značky (mtime) se ovšem stále aktualizují.
nodiratime (no dir atime): Tato volba umožňuje aktualizaci časových značek přístupu (atime) pro soubory, ale zakazuje ji pro adresáře.
relatime (relativní čas): Tato volba aktualizuje časovou značku přístupu (atime) pouze v případě, že je starší než 24 hodin, nebo pokud je starší než časová značka upravená (mtime) nebo změněná (ctime). Tato volba nabízí dobrou rovnováhu mezi příliš častou a žádnou aktualizací časových značek.
Podívejme se na soubor /etc/fstab tohoto počítače, abychom zjistili, jaké možnosti jsou nastaveny:
less /etc/fstab
Zobrazí se nám soubor /etc/fstab, jak je uvedeno níže.
Zde je obsah souboru bez obalu:
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/sda1 during installation UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1 /swapfile none swap sw 0 0
Soubor obsahuje pouze dva záznamy, jeden z nich je swap soubor, který můžeme ignorovat. Druhý je připojen do kořenového adresáře souborového systému ( / ) a při instalaci se nacházel na zařízení /dev/sda1. To je první oddíl na prvním pevném disku a náhodou se jedná o souborový systém ext4.
Jediná volba, která mu byla přidělena, je errors=remount-ro, která říká operačnímu systému, aby připojil tento souborový systém znovu jako pouze pro čtení v případě chyb při připojování jako čtení i zápis.
V souboru není tedy žádná zmínka o tom, jak se bude zacházet s časovou značkou přístupu. Podívejme se hlouběji a zkusme zjistit více z /proc/mounts. Výstup z /proc/mounts přesměrujeme přes grep. Náš vyhledávací řetězec bude „sda“, což je identifikátor pevného disku.
Zadáme následující:
cat /proc/mounts | grep "sda"
Nyní vidíme následující možnosti:
rw: Systém souborů bude připojen jako systém pro čtení i zápis.
relatime: Systém souborů použije schéma „relativního času“ pro aktualizaci časových značek přístupu.
Odkud to pochází? Schéma relativního času se používá v následujících situacích:
Při použití výchozí volby /etc/fstab.
Pokud je v /etc/fstab uvedena volba relatime.
Pokud v /etc/fstab nejsou uvedeny žádné možnosti pro časové značky přístupu a používáte linuxové jádro 2.6.30 nebo novější.
Náš záznam v /etc/fstab pro souborový systém ext4 nespecifikoval žádné možnosti pro aktualizaci časových značek přístupu, takže Linux zvolil logické výchozí nastavení a použil relatime.
Časové značky jsou důležité
Časové značky nám poskytují jednoduchý způsob, jak zjistit, kdy byl soubor zpřístupněn, upraven nebo změněn. Důležitější je ale to, že poskytují způsob, jak softwaru pro zálohování a synchronizaci určit, které soubory je nutné zálohovat.
Schopnost manipulovat s časovými značkami se hodí, kdykoli potřebujete program donutit, aby soubor nebo skupinu souborů zahrnul, nebo naopak ignoroval.