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

Kiedy „zmieniony” nie oznacza „zmodyfikowany”? Kiedy mówimy o sygnaturach czasowych plików Linuksa. W tym przewodniku wyjaśnimy, jak system je aktualizuje i jak samodzielnie je zmieniać.

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

Każdy plik Linuksa ma trzy pliki sygnatury czasowe: sygnatura czasowa dostępu (atime), zmodyfikowana sygnatura czasowa (mtime) i zmieniona sygnatura czasowa (ctime).

Sygnatura czasowa dostępu to czas ostatniego odczytu pliku. Oznacza to, że ktoś użył programu do wyświetlenia zawartości pliku lub odczytania z niego niektórych wartości. Nic nie zostało edytowane ani dodane do pliku. Odwołanie do danych było niezmienione.

Zmodyfikowana sygnatura czasowa oznacza ostatnią modyfikację zawartości pliku. Program lub proces edytował plik lub manipulował nim. „Zmodyfikowano” oznacza, że ​​coś w pliku zostało zmienione lub usunięte albo dodano nowe dane.

Zmienione sygnatury czasowe nie odnoszą się do zmian wprowadzonych w zawartości pliku. Jest to raczej czas, w którym metadane związane z plikiem zostały zmienione. Na przykład zmiany uprawnień do plików zaktualizują zmieniony znacznik czasu.

Standardowy system plików ext4 Linux również przydziela miejsce na znacznik czasu utworzenia pliku w swoich wewnętrznych strukturach systemu plików, ale nie zostało to jeszcze zaimplementowane. Czasami ten znacznik czasu jest zapełniany, ale nie można polegać na zawartych w nim wartościach.

Anatomia znacznika czasu

Znaczniki czasu Linuksa zawierają liczbę, a nie datę i godzinę. Ta liczba to liczba sekund, które upłynęły od czasu Epoka uniksowa, czyli o północy (00:00:00) 1 stycznia 1970 roku Skoordynowany czas uniwersalny (UTC). Sekundy przestępne są ignorowane w sygnaturach czasowych Linuksa, więc nie są analogiczne do czasu rzeczywistego.

Kiedy Linux musi wyświetlić znacznik czasu, tłumaczy liczbę sekund na datę i godzinę. Ułatwia to ludziom zrozumienie. Lokalizacja i strefa czasowa komputera wyświetlającego plik prowadzi do konwersji liczby sekund na datę i godzinę. Zapewnia również, że miesiąc jest podany we właściwym języku.

Zatem ile sekund można przechowywać w sygnaturze czasowej? Dużo – dokładnie 2 147 483 647. To duża liczba, ale czy to wystarczy? Jeśli dodasz to do uniksowej epoki, a następnie przetłumaczysz na datę i godzinę, otrzymasz wtorek, 19 stycznia 2038 r., O 03:14:07. Będziemy jednak potrzebować innego schematu dla sygnatur czasowych wcześniej.

Przeglądanie sygnatur czasowych

Gdy używasz opcji -l (długa lista) z ls, jak pokazano poniżej, możesz zobaczyć zmodyfikowany znacznik czasu:

ls -l dp.c

Jeśli chcesz zobaczyć sygnaturę czasową dostępu, użyj opcji -lu (czas dostępu) w następujący sposób:

ls -lu dp.c

I wreszcie, aby zobaczyć znacznik czasu zmiany, możesz użyć opcji -lc (czas zmiany); wpisz:

ls -lc dp.c

Plik

Powyższe sygnatury czasowe pokazują, że zawartość pliku została ostatnio zmodyfikowana 21 kwietnia 2019 r. Dostęp i zmienione sygnatury czasowe są identyczne, ponieważ plik został skopiowany z innego komputera na ten 20 stycznia 2020 r., A oba znaczniki czasu zostały wówczas zaktualizowane.

Do zobaczyć wszystkie sygnatury czasowe jednocześnieużyj polecenia stat w następujący sposób:

stat dp.c

Plik

Strefy czasowe są wymienione u dołu wyświetlacza. Jak widać, mają bardzo dokładny składnik ułamków sekund. Na końcu każdego znacznika czasu widać również -0500 lub -0400.

To są przesunięcia stref czasowych. System plików rejestruje znaczniki czasu w UTC i konwertuje je na lokalną strefę czasową, gdy są wyświetlane przez statystyki. Komputer, którego użyliśmy do badania tego artykułu, jest skonfigurowany tak, jakby znajdował się w strefie czasu wschodniego (EST) w USA

Ta strefa czasowa jest pięć godzin za UTC, gdy obowiązuje EST. Jednak są cztery godziny za czasem UTC, kiedy obowiązuje wschodni czas letni (EDT). W kwietniu 2019 roku, kiedy zmieniono zmodyfikowany znacznik czasu, obowiązywał EDT. Dlatego dwa znaczniki czasu mają przesunięcie pięciogodzinne, ale zmodyfikowany – czterogodzinne.

Przesunięcia i strefy czasowe nie są nigdzie przechowywane. Nie ma ani i-węzła, ani przestrzeni systemu plików przeznaczonej na przechowywanie tych wartości. Musisz obliczyć je w locie, używając znacznika czasu (który jest zawsze w czasie UTC), lokalnej strefy czasowej komputera wyświetlającego plik i tego, czy obowiązuje czas letni.

Widoczny jest również znacznik czasu „Urodzenia”, który jest zarezerwowany dla daty utworzenia pliku. Nie jest to zaimplementowane i zamiast sygnatury czasowej widzisz łącznik „-”.

Zmiana sygnatur czasowych

Jeśli chcesz, możesz zmienić sygnatury czasowe w pliku. Możesz użyć polecenia dotykowego, aby zmienić dostęp lub zmodyfikować znaczniki czasu, lub obydwa:

touch -a dp.c

Aby ustawić nowy znacznik czasu dostępu, należy użyć opcji -a (czas dostępu). To polecenie ustawia sygnaturę czasową dostępu na aktualny czas komputera:

stat dp.c

Plik

Zgodnie z oczekiwaniami zmienił się sygnatura czasowa dostępu. Jednak zmieniony znacznik czasu również został zaktualizowany; to normalne.

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

touch -m dp.c
stat dp.c

Plik

Tym razem zmodyfikowane i zmienione sygnatury czasowe zostały zaktualizowane.

Możesz użyć opcji -d (data), jeśli chcesz jednocześnie zmienić zarówno dostęp, jak i zmodyfikowane znaczniki czasu. Możesz także określić czas i datę – nie jesteś ograniczony do zmiany sygnatur czasowych do chwili obecnej.

Użyjemy następującego polecenia, aby ustawić dostęp i zmodyfikowane sygnatury czasowe na 10:30:45 15 stycznia 2020 r .:

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

Plik

Ustawiliśmy teraz dostęp i zmodyfikowane sygnatury czasowe na datę z przeszłości. Zmieniony znacznik czasu został również zaktualizowany do aktualnego czasu komputera.

Możesz także użyć opcji -r (odniesienie), jak pokazano poniżej, jeśli chcesz ustawić znaczniki czasu jednego pliku na wartości znaczników czasu innego:

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

Plik

A potem wróciliśmy do punktu wyjścia, z mieszanką sygnatur czasowych -0400 i -0500.

Zróbmy coś, co wpłynie tylko na zmienioną sygnaturę czasową. Użyjemy polecenia chmod, aby uzyskać plik wykonywalny wykonywanie uprawnień dla wszystkich użytkowników:

chmod +x dp
stat dp

Plik

Zmieniony znacznik czasu był jedynym, który został zaktualizowany. Dzieje się tak, ponieważ sam plik nie został zmieniony – nie był dostępny ani modyfikowany. Jednak metadane dotyczące pliku zostały zmienione.

Jak system plików aktualizuje sygnatury czasowe

Gdy system plików jest zamontowany, istnieją opcje, których można użyć do określenia sposobu działania lub traktowania tego systemu plików. Są one przechowywane w pliku / etc / fstab, który jest odczytywany i przetwarzany podczas uruchamiania. Możesz także ustawić opcje, aby dyktować schemat, którego mają używać do aktualizacji sygnatury czasowej dostępu.

Oto niektóre z najczęstszych opcji:

strictatime (strictatime): Ta opcja aktualizuje sygnaturę czasową dostępu do plików przy każdym dostępie do nich. Z tym podejściem wiąże się narzut, ale niektóre serwery mogą skorzystać z tego schematu. Ma niewielkie zalety na komputerze stacjonarnym lub laptopie.
noatime (no atime): Ta opcja całkowicie wyłącza aktualizację sygnatur czasowych dostępu do plików i katalogów. Zmodyfikowane sygnatury czasowe będą jednak nadal aktualizowane.
nodiratime (no dir atime): Ta opcja umożliwia dostęp do sygnatur czasowych plików do aktualizacji, ale wyłącza je dla katalogów.
relatime (względny czas): Ta opcja aktualizuje sygnaturę czasową dostępu tylko wtedy, gdy ma więcej niż 24 godziny lub poprzedni był starszy niż bieżące zmodyfikowane lub zmienione sygnatury czasowe. Zapewnia to dobrą równowagę między zbyt częstym aktualizowaniem znaczników czasu dostępu lub brakiem aktualizacji.

Spójrzmy na plik / etc / fstab dla tego komputera i zobaczmy, które opcje są ustawione:

less /etc/fstab

Plik

Plik / etc / fstab jest wyświetlany dla nas, jak pokazano poniżej.

Plik

Oto zawartość pliku bez zawijania:

# /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).
#
# 
# / was on /dev/sda1 during installation
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

Są tylko dwa wpisy, a jeden z nich to plik wymiany, który możemy zignorować. Drugi jest montowany w katalogu głównym systemu plików (/) i znajdował się na urządzeniu / dev / sda1 w czasie instalacji. To pierwsza partycja na pierwszym dysku twardym i zdarza się, że zawiera system plików ext4.

Jedyną przekazywaną opcją jest errors = remount-ro, która mówi systemowi operacyjnemu, aby ponownie zamontował ten system plików jako tylko do odczytu, jeśli wystąpią błędy podczas próby zamontowania go jako systemu plików do odczytu i zapisu.

Nie ma więc żadnej wzmianki o tym, jak będzie obsługiwany znacznik czasu dostępu. Poszukajmy głębiej i sprawdźmy, co może nam powiedzieć / proc / mounts. Dane wyjściowe z / proc / mounts prześlemy potokiem przez grep. Nasz ciąg wyszukiwania to „sda”, identyfikator dysku twardego.

Wpisujemy:

cat /proc/mounts | grep "sda"

Plik

Teraz widzimy następujące opcje:

rw: system plików zostanie zamontowany jako system plików do odczytu i zapisu.
relatime: system plików użyje schematu „względnego czasu” do aktualizacji sygnatur czasowych dostępu.

Skąd to pochodzi? Cóż, schemat relatime jest używany w następujących sytuacjach:

Gdy używana jest domyślna opcja / etc / fstab.
Gdy używana jest opcja relatime / etc / fstab.
Gdy w / etc / fstab nie są używane żadne opcje datownika dostępu, a używasz jądra Linuksa 2.6.30 lub nowszego.

Nasz wpis / etc / fstab dla systemu plików ext4 nie określał żadnych opcji aktualizacji sygnatur czasowych dostępu, więc Linux dokonał rozsądnego wyboru i użył relatime.

Znaczniki czasu są ważne

Znaczniki czasu umożliwiają nam łatwe sprawdzenie, kiedy plik został uzyskany, zmodyfikowany lub zmieniony. Ale co ważniejsze, zapewniają sposób tworzenia kopii zapasowych i synchronizowania oprogramowania w celu określenia, które pliki wymagają kopii zapasowej.

Możliwość manipulowania znacznikami czasu okaże się przydatna, gdy trzeba na siłę przekonać program do dołączenia lub zignorowania pliku lub zbioru plików.