Wyjaśnienie sygnatur czasowych plików Linuksa: atime, mtime i ctime

Kiedy termin „zmieniony” nie jest równoznaczny z „zmodyfikowanym”? Odpowiedź na to pytanie znajdziemy w kontekście sygnatur czasowych plików w systemie Linux. W niniejszym przewodniku omówimy, jak system operacyjny aktualizuje te sygnatury oraz jak możemy je modyfikować samodzielnie.

Różnice między atime, mtime i ctime

Każdy plik w systemie Linux posiada trzy różne sygnatury czasowe: sygnatura czasowa dostępu (atime), sygnatura zmodyfikowana (mtime) oraz sygnatura zmieniona (ctime).

Sygnatura dostępu (atime) wskazuje czas ostatniego odczytu pliku. Oznacza to, że plik został otwarty przez program do przeglądania lub do odczytania jego zawartości, ale nie został w żaden sposób zmieniony. Odwołanie do danych pozostało niezmienne.

Sygnatura zmodyfikowana (mtime) oznacza, że zawartość pliku została ostatnio zmieniona. Oznacza to, że plik został edytowany lub w inny sposób zmodyfikowany, co oznacza, że coś w nim zostało dodane, usunięte lub zmienione.

Natomiast sygnatura zmieniona (ctime) odnosi się do aktualizacji metadanych pliku, a nie samej jego zawartości. Na przykład, zmiany dotyczące uprawnień pliku spowodują aktualizację sygnatury zmienionej.

W systemie plików ext4 w Linuxie istnieje również możliwość przechowywania znacznika czasu utworzenia pliku, ale obecnie nie jest on w pełni wdrożony. Czasami ten znacznik może być wypełniany, jednak nie można polegać na jego dokładności.

Anatomia znaczników czasowych

Znaczniki czasowe w Linuxie są reprezentowane jako liczby, a nie jako daty i godziny. Ta liczba oznacza ilość sekund, które minęły od epoki uniksowej, która zaczyna się o północy 1 stycznia 1970 roku w Czasie Skoordynowanym (UTC). Sekundy przestępne nie są uwzględniane w sygnaturach czasowych, dlatego nie są one bezpośrednio porównywalne z czasem rzeczywistym.

Gdy Linux wyświetla znacznik czasu, przekształca liczbę sekund na datę i godzinę, co ułatwia odczyt. Proces ten uwzględnia lokalizację oraz strefę czasową komputera, co pomaga w odpowiednim formatowaniu daty i godziny w danym języku.

Ile sekund można przechowywać w znaczniku czasowym? Odpowiedź to 2 147 483 647 sekund, co jest znaczną ilością. Po dodaniu tej liczby do epoki uniksowej otrzymujemy datę 19 stycznia 2038 roku o 03:14:07. W związku z tym, z czasem, konieczne będzie wprowadzenie nowego schematu dla znaczników czasowych.

Jak przeglądać sygnatury czasowe

Aby zobaczyć zmodyfikowany znacznik czasowy pliku, użyj polecenia ls -l, jak pokazano poniżej:

ls -l dp.c

Jeżeli chcesz sprawdzić sygnaturę dostępu, użyj polecenia z opcją -lu:

ls -lu dp.c

Aby zobaczyć znacznik czasu zmiany, skorzystaj z opcji -lc:

ls -lc dp.c

Przykładowe sygnatury czasowe wskazują, że plik był ostatnio modyfikowany 21 kwietnia 2019 roku. Sygnatury dostępu i zmienione są identyczne, ponieważ plik został skopiowany z innego komputera 20 stycznia 2020 roku, co spowodowało, że oba znaczniki czasowe zostały zaktualizowane w tym samym czasie.

Aby zobaczyć wszystkie sygnatury czasowe jednocześnie, możesz użyć polecenia stat:

stat dp.c

Na dole wyświetlacza można zobaczyć strefy czasowe. Zauważ, że zawierają one szczegółowe informacje o ułamkach sekund. Na końcu każdego znacznika czasowego występują oznaczenia -0500 lub -0400, co wskazuje na przesunięcia stref czasowych. System plików zapisuje znaczniki czasowe w UTC i konwertuje je na lokalną strefę czasową podczas ich wyświetlania.

Wartości przesunięć i stref czasowych nie są nigdzie przechowywane. Nie ma ani i-węzła, ani przestrzeni systemu plików przeznaczonej na te dane. Musisz obliczyć je na bieżąco, korzystając ze znaczników czasowych (które są zawsze w UTC), lokalnej strefy czasowej komputera oraz informacji o czasie letnim.

Warto również zwrócić uwagę na znacznik „Urodzenia”, który zarezerwowany jest na datę utworzenia pliku. Obecnie nie jest on w pełni wdrożony, a zamiast niego widoczny jest łącznik „-”.

Modyfikacja sygnatur czasowych

Jeśli chcesz, możesz zmienić sygnatury czasowe pliku. Użyj polecenia touch, aby zmienić znacznik czasu dostępu lub zmodyfikować sygnatury, lub obydwa jednocześnie:

touch -a dp.c

Użycie opcji -a (czas dostępu) ustawia sygnaturę dostępu na bieżący czas:

stat dp.c

Sygnatura dostępu została zaktualizowana zgodnie z oczekiwaniami. Jednak sygnatura zmieniona również uległa zmianie, co jest normalnym zachowaniem.

Aby zmienić zmodyfikowany znacznik czasu, użyj opcji -m (zmodyfikowany czas):

touch -m dp.c
stat dp.c

W tym przypadku zarówno zmodyfikowane, jak i zmienione sygnatury czasowe zostały zaktualizowane.

Możesz użyć opcji -d (data), aby jednocześnie zmienić zarówno sygnaturę dostępu, jak i zmodyfikowaną. Możesz również określić konkretny czas i datę – jesteś wolny w zakresie modyfikacji znaczników czasowych, nie ograniczasz się do aktualnego czasu.

Przykładowe polecenie, które ustawi sygnatury na 10:30:45 15 stycznia 2020 roku, wygląda następująco:

touch -d "2020-01-15 10:30:45" dp.c
stat dp.c

W ten sposób ustawiliśmy sygnatury dostępu i zmodyfikowane na datę z przeszłości. Sygnatura zmieniona również została zaktualizowana do aktualnego czasu komputera.

Możesz również skorzystać z opcji -r (odniesienie), aby ustawić znaczniki czasowe jednego pliku na wartości innego pliku:

touch dp.c -r dice_words.sl3
stat dp.c

W ten sposób wracamy do punktu wyjścia, z różnymi sygnaturami czasowymi -0400 i -0500.

Teraz skupimy się na wpływie na tylko zmienioną sygnaturę czasową. Użyjemy polecenia chmod, aby nadać plikowi uprawnienia wykonywania dla wszystkich użytkowników:

chmod +x dp
stat dp

W tym przypadku tylko zmieniony znacznik czasu został zaktualizowany, ponieważ sam plik nie został edytowany ani zmodyfikowany, ale jego metadane uległy zmianie.

Jak system plików aktualizuje sygnatury czasowe

Podczas montowania systemu plików istnieją różne opcje, które można wykorzystać do określenia jego działania. Informacje te są przechowywane w pliku /etc/fstab, który jest odczytywany i przetwarzany podczas uruchamiania systemu. Możliwe jest również ustawienie opcji, które definiują sposób aktualizacji sygnatury czasowej dostępu.

Oto niektóre z najczęściej używanych opcji:

  • strictatime (strictatime): Umożliwia aktualizację sygnatury czasowej dostępu przy każdym dostępie do pliku. Chociaż wiąże się to z pewnym narzutem, może to być korzystne w przypadku niektórych serwerów. Na komputerach stacjonarnych lub laptopach przynosi to niewielkie korzyści.
  • noatime (no atime): Całkowicie wyłącza aktualizację sygnatur czasowych dostępu do plików i katalogów, natomiast sygnatury zmodyfikowane pozostaną aktualizowane.
  • nodiratime (no dir atime): Umożliwia aktualizację sygnatur dostępu do plików, ale wyłącza to dla katalogów.
  • relatime (względny czas): Sygnatura dostępu jest aktualizowana tylko wtedy, gdy minęło więcej niż 24 godziny lub gdy poprzednia była starsza niż aktualne zmodyfikowane lub zmienione sygnatury czasowe. Ta opcja zapewnia równowagę, eliminując zbyt częste lub rzadkie aktualizacje znaczników dostępu.

Sprawdźmy plik /etc/fstab na tym komputerze, aby zobaczyć, jakie opcje są w nim ustawione:

less /etc/fstab

Plik /etc/fstab został wyświetlony, jak pokazano poniżej.

Poniżej przedstawiamy zawartość pliku bez zawijania tekstu:

# /etc/fstab: statyczne informacje o systemie plików.
#
# Użyj 'blkid', aby wydrukować unikalny identyfikator urządzenia; można go użyć z UUID= jako bardziej niezawodnego sposobu na nazwę urządzeń, który działa nawet w przypadku dodawania lub usuwania dysków. Zobacz fstab(5).
#
# 
# / był na /dev/sda1 podczas instalacji
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

W pliku tym znajdują się tylko dwa wpisy, z których jeden dotyczy pliku wymiany, który możemy pominąć. Drugi wpis dotyczy katalogu głównego systemu plików (/) i odnosi się do urządzenia /dev/sda1 w chwili instalacji. Jest to pierwsza partycja na pierwszym dysku twardym, która zawiera system plików ext4.

Jedyną przekazywaną opcją jest errors=remount-ro, która poleca systemowi operacyjnemu ponowne zamontowanie systemu plików jako tylko do odczytu, w przypadku wystąpienia błędów podczas próby montowania go jako systemu plików do odczytu i zapisu.

Nie ma więc żadnych informacji na temat tego, jak ma być obsługiwany znacznik czasu dostępu. Zajrzyjmy głębiej i sprawdźmy, co na ten temat mówi plik /proc/mounts. Wydobycie danych z /proc/mounts przefiltrujemy przez grep, a naszym ciągiem wyszukiwania będzie „sda”, identyfikator dysku twardego.

Wpisujemy:

cat /proc/mounts | grep "sda"

Teraz widzimy, że zastosowane opcje to:

  • rw: system plików jest zamontowany jako system do odczytu i zapisu.
  • relatime: system plików korzysta z schematu „względnego czasu” do aktualizacji sygnatur czasowych dostępu.

Skąd to się bierze? Schemat relatime jest używany w następujących sytuacjach:

  • Gdy używana jest domyślna opcja w pliku /etc/fstab.
  • Gdy używana jest opcja relatime w pliku /etc/fstab.
  • Gdy w pliku /etc/fstab nie zdefiniowane są żadne opcje dotyczące czasu dostępu, a używane jest jądro Linuksa w wersji 2.6.30 lub nowszej.

W naszym wpisie w /etc/fstab dla systemu plików ext4 nie określono żadnych opcji dotyczących aktualizacji sygnatur czasowych dostępu, więc Linux dokonał sensownego wyboru i zastosował schemat relatime.

Znaczniki czasowe są istotne

Znaczniki czasowe pozwalają nam łatwo ustalić, kiedy plik został otwarty, zmodyfikowany lub zmieniony. Co więcej, są kluczowe dla efektywnego tworzenia kopii zapasowych i synchronizacji oprogramowania, ponieważ pozwalają określić, które pliki wymagają archiwizacji.

Możliwość modyfikacji znaczników czasowych może okazać się przydatna, gdy chcemy wymusić na oprogramowaniu uwzględnienie lub zignorowanie konkretnego pliku lub grupy plików.


newsblog.pl