Wann bedeutet „verändert“ nicht „verändert“? Nun, wenn wir über Zeitstempel von Linux-Dateien sprechen. In diesem Leitfaden untersuchen wir, wie das System diese aktualisiert und wie Sie sie bei Bedarf selbst ändern können.
Die Unterscheidung zwischen atime, mtime und ctime
Jede Datei unter Linux verfügt über drei Zeitstempel: den Zugriffszeitstempel (atime), den Änderungszeitstempel (mtime) und den Statusänderungszeitstempel (ctime).
Der Zugriffszeitstempel gibt den Zeitpunkt des letzten Lesezugriffs auf die Datei an. Dies geschieht, wenn ein Programm den Dateiinhalt anzeigt oder Daten daraus liest. Die Datei selbst wurde dabei nicht verändert.
Der Änderungszeitstempel zeigt an, wann der Inhalt einer Datei das letzte Mal verändert wurde. Das heißt, ein Programm oder ein Prozess hat die Datei verändert oder manipuliert. „Verändert“ bedeutet hier, dass etwas in der Datei modifiziert, gelöscht oder hinzugefügt wurde.
Der Statusänderungszeitstempel bezieht sich nicht auf Änderungen am Inhalt der Datei, sondern auf Modifikationen der Dateimetadaten. So aktualisiert beispielsweise eine Änderung der Dateiberechtigungen den Statusänderungszeitstempel.
Das Standarddateisystem ext4 unter Linux reserviert in seinen internen Dateisystemstrukturen zwar auch Platz für einen Zeitstempel der Dateierstellung, dieser ist jedoch derzeit noch nicht implementiert. Es kann vorkommen, dass dieser Zeitstempel belegt ist, Sie sollten sich jedoch nicht auf die darin gespeicherten Werte verlassen.
Die Struktur eines Zeitstempels
Linux-Zeitstempel enthalten keine Datums- und Zeitangabe, sondern eine Zahl. Diese Zahl entspricht der Anzahl der Sekunden seit der Unix-Epoche, also Mitternacht (00:00:00) am 1. Januar 1970 in Koordinierter Weltzeit (UTC). Schaltsekunden werden in Linux-Zeitstempeln ignoriert, daher entsprechen diese nicht der realen Zeit.
Wenn Linux einen Zeitstempel anzeigen muss, konvertiert es die Anzahl der Sekunden in ein Datum und eine Uhrzeit. Dies macht es für den Menschen leichter verständlich. Der Standort und die Zeitzone des Computers, auf dem sich die Datei befindet, bestimmen die Umrechnung der Sekunden in ein Datum und eine Uhrzeit. Außerdem wird so sichergestellt, dass der Monat in der richtigen Sprache angezeigt wird.
Wie viele Sekunden können also in einem Zeitstempel gespeichert werden? Eine ganze Menge – nämlich 2.147.483.647. Diese Zahl ist groß, aber reicht sie aus? Wenn Sie diese Zahl zur Unix-Epoche hinzufügen und das Ergebnis in ein Datum und eine Uhrzeit umrechnen, erhalten Sie Dienstag, den 19. Januar 2038, um 03:14:07 Uhr. Bis dahin wird jedoch ein anderes Schema für Zeitstempel benötigt.
Anzeigen von Zeitstempeln
Mit der Option -l (lange Auflistung) des Befehls ls können Sie den Änderungszeitstempel sehen, wie im folgenden Beispiel gezeigt:
ls -l dp.c
Um den Zugriffszeitstempel anzuzeigen, verwenden Sie die Option -lu (Zugriffszeit):
ls -lu dp.c
Und um den Statusänderungszeitstempel anzuzeigen, verwenden Sie die Option -lc (Zeit ändern):
ls -lc dp.c
Die oben genannten Zeitstempel zeigen an, dass der Dateiinhalt zuletzt am 21. April 2019 geändert wurde. Die Zugriffs- und Statusänderungszeitstempel sind identisch, da die Datei am 20. Januar 2020 von einem anderen Computer auf diesen kopiert wurde, wodurch beide Zeitstempel aktualisiert wurden.
Um alle Zeitstempel gleichzeitig zu sehen, verwenden Sie den Befehl stat:
stat dp.c
Die Zeitzonen werden unten in der Ausgabe aufgelistet. Wie Sie sehen, sind sie auf die Sekunde genau. Am Ende jedes Zeitstempels sehen Sie außerdem -0500 oder -0400.
Dies sind die Zeitzonen-Offsets. Das Dateisystem speichert Zeitstempel in UTC und konvertiert sie in die lokale Zeitzone, wenn sie mit dem Befehl stat angezeigt werden. Der Computer, der für diese Recherche verwendet wurde, ist so konfiguriert, als befände er sich in der Eastern Standard Time (EST)-Zone der USA.
Diese Zeitzone liegt fünf Stunden hinter UTC, wenn EST aktiv ist. Wenn die Eastern Daylight Time (EDT) aktiv ist, liegt sie vier Stunden hinter UTC. Im April 2019, als der Änderungszeitstempel geändert wurde, war EDT in Kraft. Daher haben zwei der Zeitstempel einen Offset von fünf Stunden, während der Änderungszeitstempel einen Offset von vier Stunden hat.
Die Offsets und Zeitzonen werden nirgendwo gespeichert. Es gibt weder einen Inode noch einen Dateisystembereich, der für diese Werte reserviert ist. Sie müssen in Echtzeit berechnet werden, indem der Zeitstempel (der immer in UTC angegeben ist), die lokale Zeitzone des Computers, auf dem die Datei angezeigt wird, und die Gültigkeit der Sommerzeit berücksichtigt werden.
Sie sehen auch einen „Geburts“-Zeitstempel, der für das Erstellungsdatum der Datei vorgesehen ist. Dieser ist nicht implementiert, und stattdessen wird ein Bindestrich „-“ angezeigt.
Ändern von Zeitstempeln
Sie können die Zeitstempel einer Datei ändern, wenn Sie dies wünschen. Mit dem Befehl touch können Sie den Zugriffs- oder Änderungszeitstempel oder beide ändern:
touch -a dp.c
Um einen neuen Zugriffszeitstempel zu setzen, verwenden Sie die Option -a (Zugriffszeit). Dieser Befehl setzt den Zugriffszeitstempel auf die aktuelle Zeit des Computers:
stat dp.c
Der Zugriffszeitstempel wurde erwartungsgemäß geändert. Allerdings wurde auch der Statusänderungszeitstempel aktualisiert, was normal ist.
Um den Änderungszeitstempel zu ändern, können Sie die Option -m (modifizierte Zeit) verwenden:
touch -m dp.c
stat dp.c
Diesmal wurden sowohl der Änderungs- als auch der Statusänderungszeitstempel aktualisiert.
Wenn Sie sowohl den Zugriffs- als auch den Änderungszeitstempel gleichzeitig ändern möchten, können Sie die Option -d (Datum) verwenden. Sie können auch eine Uhrzeit und ein Datum angeben – Sie müssen die Zeitstempel nicht auf die aktuelle Zeit ändern.
Der folgende Befehl setzt den Zugriffs- und Änderungszeitstempel auf den 15. Januar 2020, 10:30:45 Uhr:
touch -d "2020-01-15 10:30:45" dp.c
stat dp.c
Wir haben nun den Zugriffs- und Änderungszeitstempel auf ein Datum in der Vergangenheit gesetzt. Der Statusänderungszeitstempel wurde ebenfalls auf die aktuelle Zeit des Computers aktualisiert.
Sie können auch die Option -r (Referenz) verwenden, um die Zeitstempel einer Datei auf die Zeitstempelwerte einer anderen Datei zu setzen, wie im folgenden Beispiel:
touch dp.c -r dice_words.sl3
stat dp.c
Damit sind wir fast wieder am Anfang angelangt, mit einer Mischung aus -0400- und -0500-Zeitstempeln.
Führen wir etwas aus, das nur den Statusänderungszeitstempel betrifft. Mit dem Befehl chmod machen wir eine Datei ausführbar Ausführungsberechtigungen für alle Benutzer:
chmod +x dp
stat dp
Der Statusänderungszeitstempel war der einzige, der aktualisiert wurde. Dies liegt daran, dass die Datei selbst nicht geändert wurde – sie wurde weder zugegriffen noch verändert. Die Metadaten der Datei wurden jedoch modifiziert.
Wie das Dateisystem Zeitstempel aktualisiert
Beim Einhängen eines Dateisystems können Sie durch Optionen festlegen, wie das Dateisystem arbeitet oder behandelt wird. Diese Optionen werden in der Datei /etc/fstab gespeichert, die beim Booten gelesen und verarbeitet wird. Sie können auch Optionen festlegen, um das Schema zur Aktualisierung des Zugriffszeitstempels festzulegen.
Hier sind einige der gängigsten Optionen:
strictatime: Diese Option aktualisiert den Zugriffszeitstempel bei jedem Dateizugriff. Dieser Ansatz ist mit einem Overhead verbunden, kann aber für einige Server von Vorteil sein. Auf einem Desktop- oder Laptop-Computer ist er von geringem Nutzen.
noatime: Diese Option deaktiviert die Aktualisierung von Zugriffszeitstempeln für Dateien und Verzeichnisse vollständig. Änderungszeitstempel werden jedoch weiterhin aktualisiert.
nodiratime: Mit dieser Option werden Zugriffszeitstempel für Dateien aktualisiert, jedoch nicht für Verzeichnisse.
relatime: Diese Option aktualisiert den Zugriffszeitstempel nur, wenn er älter als 24 Stunden ist oder der vorherige Zeitstempel älter war als der aktuelle Änderungs- oder Statusänderungszeitstempel. Dies bietet ein gutes Gleichgewicht zwischen zu häufig oder gar nicht aktualisierten Zugriffszeitstempeln.
Sehen wir uns die Datei /etc/fstab dieses Computers an, um zu sehen, welche Optionen eingestellt sind:
less /etc/fstab
Die Datei /etc/fstab wird uns wie folgt angezeigt:
Hier ist der Inhalt der Datei ohne Zeilenumbruch:
# /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
Es gibt nur zwei Einträge, von denen einer eine Auslagerungsdatei ist, die wir ignorieren können. Der andere ist im Root-Verzeichnis des Dateisystems ( / ) gemountet und befand sich zum Zeitpunkt der Installation auf dem Gerät /dev/sda1. Dies ist die erste Partition auf der ersten Festplatte, die zufällig ein ext4-Dateisystem enthält.
Die einzige übergebene Option ist errors=remount-ro, die das Betriebssystem anweist, das Dateisystem als schreibgeschützt neu einzuhängen, wenn beim Versuch, es als lese- und schreibbares Dateisystem zu mounten, Fehler auftreten.
Es wird also nicht angegeben, wie der Zugriffszeitstempel behandelt wird. Untersuchen wir das Problem weiter und sehen, was /proc/mounts uns mitteilen kann. Die Ausgabe von /proc/mounts wird per Pipe an grep weitergeleitet. Unser Suchstring ist „sda“, die Festplattenkennung.
Wir geben Folgendes ein:
cat /proc/mounts | grep "sda"
Jetzt werden uns die folgenden Optionen angezeigt:
rw: Das Dateisystem ist als Lese- und Schreibdateisystem gemountet.
relatime: Das Dateisystem verwendet das Schema „relative atime“ zur Aktualisierung der Zugriffszeitstempel.
Woher kommt das? Das Relatime-Schema wird in folgenden Situationen verwendet:
Wenn die Standardoption von /etc/fstab verwendet wird.
Wenn die Option relatime in /etc/fstab verwendet wird.
Wenn keine Zugriffszeitstempeloptionen in /etc/fstab verwendet werden und Sie den Linux-Kernel 2.6.30 oder höher verwenden.
Unser /etc/fstab-Eintrag für das ext4-Dateisystem enthielt keine Aktualisierungsoptionen für Zugriffszeitstempel, daher hat Linux die sinnvolle Wahl getroffen und Relatime verwendet.
Zeitstempel sind wichtig
Zeitstempel ermöglichen uns, auf einfache Weise zu sehen, wann eine Datei zugegriffen, geändert oder modifiziert wurde. Noch wichtiger ist jedoch, dass sie eine Möglichkeit für Sicherungs- und Synchronisierungssoftware bieten, um festzustellen, welche Dateien gesichert werden müssen.
Die Möglichkeit, Zeitstempel zu manipulieren, kann sich als nützlich erweisen, wenn Sie ein Programm zwingen müssen, eine Datei oder eine Dateigruppe einzubeziehen oder zu ignorieren.