15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen
12.12.2023

So finden Sie das Erstellungsdatum einer Datei in Linux: Vollständiger technischer Leitfaden

Linux stellt die Geburtszeitangabe von Dateien nicht nativ über die meisten Standard-Userspace-Tools bereit, aber die zugrunde liegenden Daten existieren oft — die Herausforderung besteht darin, genau zu wissen, wo man suchen muss und welches Dateisystem und welche Kernel-Version verwendet wird. Auf ext4-, btrfs-, xfs– und tmpfs-Dateisystemen mit Linux-Kernel 4.11+ werden echte Geburtszeitstempel (crtime) im Inode gespeichert und können über spezifische Low-Level-Dienstprogramme abgerufen werden. Bei älteren Dateisystemen oder Kerneln müssen Sie eine Kombination aus Inode-Metadaten, Systemprotokollen und dateisystemspezifischen Debuggern verwenden, um die Erstellungszeit zu approximieren.

Dieser Leitfaden behandelt alle zuverlässigen Methoden, die 2024 verfügbar sind, einschließlich ihrer technischen Voraussetzungen, der genauen Befehlssyntax, bekannter Fehlermodi und wann jeder Ansatz für die Systemadministration in Produktionsumgebungen geeignet ist.

Warum die Erstellungszeit von Linux-Dateien nicht einfach zu ermitteln ist

Jede Datei in Linux wird durch einen Inode beschrieben — eine Datenstruktur, die Metadaten wie Berechtigungen, Eigentümerschaft, Größe und Zeitstempel speichert. Der POSIX-Standard definierte historisch drei Zeitstempel:

  • atime — Zeit des letzten Zugriffs
  • mtime — Zeit der letzten Änderung (Inhalt geändert)
  • ctime — Zeit der Inode-Änderung (Metadaten oder Inhalt geändert)

Entscheidend ist: ctime ist nicht die Erstellungszeit. Dies ist eines der häufigsten Missverständnisse bei Administratoren, die aus Windows-Umgebungen migrieren. ctime wird aktualisiert, wenn sich Berechtigungen ändern, die Eigentümerschaft wechselt oder die Datei umbenannt wird — es hat nichts damit zu tun, wann die Datei ursprünglich erstellt wurde.

Die echte Erstellungszeit, bekannt als Geburtszeit oder crtime, wurde zur ext4-Inode-Struktur hinzugefügt und wird über den statx()-Systemaufruf bereitgestellt, der in Linux-Kernel 4.11 eingeführt wurde. Viele Distributionen lieferten jedoch Tools, die diese Daten erst relativ kürzlich zugänglich machten, weshalb die Verwirrung anhält.

Dateisystem- und Kernel-Voraussetzungen

Bevor Sie eine Methode ausprobieren, überprüfen Sie Ihre Umgebung:

# Check kernel version
uname -r

# Check filesystem type for a specific path
df -T /path/to/your/file

# Check filesystem mount options
findmnt -o TARGET,FSTYPE,OPTIONS /path/to/your/file
DateisystemGeburtszeit gespeichertAbrufmethodeHinweise
ext4Jastat, debugfsErfordert Kernel 4.11+ für stat
btrfsJastatVollständige Unterstützung, keine zusätzlichen Tools erforderlich
xfsJa (Kernel 5.10+)statErfordert xfs_db auf älteren Kerneln
tmpfsNeinN/AIm Arbeitsspeicher, kein persistenter Inode
ext2 / ext3NeinN/AKein Geburtszeit-Feld im Inode
NFSAbhängig vom ServerstatVom Server-Dateisystem geerbt
FAT32 / exFATJastatNativ im Verzeichniseintrag gespeichert

Wenn Sie eine VPS Hosting-Umgebung betreiben, ist das zugrunde liegende Dateisystem fast immer ext4 oder btrfs, was bedeutet, dass Geburtszeitdaten verfügbar sind — Sie benötigen nur die richtigen Tools, um sie zugänglich zu machen.

Methode 1: Verwendung des stat-Befehls (Empfohlener Ausgangspunkt)

Der stat-Befehl ist das richtige erste Tool. Auf modernen Systemen mit Kernel 4.11+ und einem unterstützenden Dateisystem wird das Birth-Feld direkt angezeigt.

stat /path/to/your/file

Beispielausgabe auf einem modernen ext4-System:

  File: /home/deploy/app/config.yml
  Size: 4096            Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 2883591     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  deploy)   Gid: ( 1000/  deploy)
Access: 2024-03-15 09:22:14.812345678 +0000
Modify: 2024-03-10 14:05:33.123456789 +0000
Change: 2024-03-10 14:05:33.123456789 +0000
 Birth: 2024-03-08 11:47:02.987654321 +0000

Wenn das Birth-Feld - (einen Bindestrich) anstelle eines Zeitstempels anzeigt, trifft eine der folgenden Aussagen zu:

  • Das Dateisystem speichert keine Geburtszeit (ext2/ext3)
  • Der Kernel ist älter als 4.11
  • Die stat-Binärdatei ist veraltet und ruft statx() nicht auf
  • Die Datei wurde erstellt, bevor das Dateisystem von ext3 auf ext4 aktualisiert wurde

Nur den Geburtszeitstempel programmatisch extrahieren:

stat --format="%w" /path/to/your/file
# Returns '-' if unavailable, or ISO 8601 timestamp if available

stat --format="%W" /path/to/your/file
# Returns Unix epoch integer (0 if unavailable)

Das %W-Format, das 0 zurückgibt, ist eine zuverlässige programmatische Prüfung, ob die Geburtszeit tatsächlich nicht verfügbar ist.

Methode 2: Verwendung von debugfs für ext4-Dateisysteme

debugfs ist das maßgebliche Low-Level-Tool zur ext4-Inode-Inspektion. Es liest die rohe Inode-Struktur und kann crtime auch dann bereitstellen, wenn stat aufgrund einer älteren Userspace-Binärdatei fehlschlägt.

Schritt 1: Inode-Nummer der Datei ermitteln

ls -i /path/to/your/file
# Output example: 2883591 /path/to/your/file

Schritt 2: Das Block-Gerät identifizieren, das das Dateisystem hostet

df /path/to/your/file
# Output shows the device, e.g., /dev/sda1 or /dev/vda1

Schritt 3: debugfs mit der Inode-Nummer abfragen

sudo debugfs -R 'stat <2883591>' /dev/vda1

Ersetzen Sie 2883591 durch Ihre tatsächliche Inode-Nummer und /dev/vda1 durch Ihr tatsächliches Gerät. Die Ausgabe enthält ein crtime-Feld:

Inode: 2883591   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 3421897654    Version: 0x00000000:00000001
User:  1000   Group:  1000   Project:     0   Size: 4096
File ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x65ee1f4d:1d4c5800 -- Sun Mar 10 14:05:33 2024
 atime: 0x65f4a1ae:c6b5c000 -- Fri Mar 15 09:22:14 2024
 mtime: 0x65ee1f4d:1d4c5800 -- Sun Mar 10 14:05:33 2024
crtime: 0x65e4b2c6:eb851400 -- Thu Mar 08 11:47:02 2024
Size of extra inode fields: 28

Wichtiger Betriebshinweis: debugfs öffnet das Dateisystem standardmäßig im Nur-Lese-Modus bei Verwendung von -R, aber Sie sollten es dennoch vermeiden, es auf einem stark aktiven Dateisystem auszuführen, ohne es zuerst auszuhängen oder einen Snapshot zu verwenden. Auf produktiven Dedicated Servers sollten Sie debugfs immer gegen einen Dateisystem-Snapshot oder ein stillgelegtes Volume ausführen, um das Lesen eines inkonsistenten Inode-Zustands zu vermeiden.

Alternative Syntax mit direkter Verwendung des Dateinamens:

sudo debugfs -R "stat /path/to/your/file" /dev/vda1

Beachten Sie, dass der Pfad hier relativ zum Dateisystem-Stamm sein muss, nicht zum System-Stamm. Wenn /dev/vda1 unter / eingehängt ist, funktioniert /path/to/your/file unverändert.

Methode 3: Verwendung von xfs_db für XFS-Dateisysteme

Auf XFS-Dateisystemen (üblich auf RHEL/CentOS/Rocky Linux-Systemen) ist das Äquivalent zu debugfs das Tool xfs_db.

# Get inode number first
ls -i /path/to/your/file

# Unmount or use read-only mode
sudo xfs_db -r /dev/sda1 -c "inode <inode_number>" -c "print"

Suchen Sie in der Ausgabe nach dem v3.crtime-Feld. XFS v5 (Standard seit RHEL 7) speichert die Geburtszeit nativ. XFS v4 nicht.

Methode 4: Verwendung der btrfs-Subvolume- und Dateiinspektion

Auf btrfs ist stat mit einem modernen Kernel ausreichend und vollständig zuverlässig. Für eine tiefere Inspektion:

sudo btrfs inspect-internal dump-tree /dev/sdb | grep -A 20 "inode ref"

Für praktische Zwecke auf btrfs ist das Birth-Feld der stat-Ausgabe maßgeblich.

Methode 5: Direktes Abfragen von statx() über Python

Wenn Shell-Tools inkonsistente Ergebnisse liefern, liefert der direkte Aufruf des statx()-Syscalls aus Python eine definitive Antwort:

import os
import stat

result = os.stat("/path/to/your/file")
# st_birthtime is available on systems where statx() returns it
if hasattr(result, 'st_birthtime'):
    import datetime
    birth = datetime.datetime.fromtimestamp(result.st_birthtime)
    print(f"Birth time: {birth}")
else:
    print("Birth time not available on this platform/filesystem")

Für eine präzisere Nanosekunden-Auflösung verwenden Sie das ctypes-Modul, um statx() direkt aufzurufen — dies ist nützlich in forensischen Skripten, bei denen die Zeitstempelgenauigkeit wichtig ist.

Methode 6: Durchsuchen von Systemprotokollen

Wenn die Geburtszeit auf Dateisystemebene nicht verfügbar ist — zum Beispiel auf ext3-Dateisystemen oder bei Dateien, die vor einer Dateisystemkonvertierung existierten — werden Systemprotokolle zum Fallback.

systemd-Journal durchsuchen:

journalctl --since="2024-01-01" | grep "your_filename"

Traditionelles syslog durchsuchen:

grep "your_filename" /var/log/syslog
grep "your_filename" /var/log/messages

Audit-Protokoll durchsuchen (wenn auditd konfiguriert ist):

sudo ausearch -f /path/to/your/file

Das Audit-Subsystem ist die zuverlässigste protokollbasierte Methode, da es openat()-, creat()– und rename()-Syscalls mit präzisen Zeitstempeln aufzeichnet. Es muss jedoch im Voraus konfiguriert werden — Sie können Dateierstellungsereignisse, die vor der Aktivierung von auditd aufgetreten sind, nicht rückwirkend auditieren.

Dateierstellungs-Auditing für ein Verzeichnis aktivieren:

sudo auditctl -w /var/www/html -p w -k web_file_creation

Dies überwacht /var/www/html auf Schreibereignisse und markiert sie mit dem Schlüssel web_file_creation für einfachen Abruf.

Methode 7: Verwendung von ls — Einschränkungen verstehen

Der ls-Befehl wird in Anleitungen häufig als Möglichkeit zur Überprüfung der Erstellungszeit genannt, erfordert jedoch eine erhebliche Qualifizierung.

ls -l --time=birth /path/to/your/file
ls -l --time=creation /path/to/your/file  # synonym on some systems

Wichtiger Vorbehalt: ls --time=birth funktioniert nur mit GNU coreutils 8.25+ und nur wenn das zugrunde liegende Dateisystem und der Kernel die Geburtszeit unterstützen. Wenn die Geburtszeit nicht verfügbar ist, fällt ls stillschweigend auf mtime zurück, ohne jegliche Warnung. Dieser stille Fallback ist eine erhebliche betriebliche Gefahr — Sie könnten glauben, die Erstellungszeit zu lesen, während Sie tatsächlich die Änderungszeit lesen.

Überprüfen Sie immer zuerst mit stat. Verwenden Sie ls nur zur Anzeige, nicht für skriptbasierte Logik.

# Safer: check stat output explicitly before relying on ls
BIRTH=$(stat --format="%W" /path/to/your/file)
if [ "$BIRTH" -eq 0 ]; then
    echo "Birth time unavailable, falling back to mtime"
    stat --format="%y" /path/to/your/file
else
    echo "Birth time: $(date -d @$BIRTH)"
fi

Methodenvergleich und Entscheidungsmatrix

MethodeGenauigkeitDateisystemanforderungRoot erforderlichFunktioniert ohne vorherige Einrichtung
stat (Birth-Feld)Exaktext4, btrfs, xfs v5NeinJa
debugfsExaktNur ext4JaJa
xfs_dbExaktNur XFS v5JaJa
statx() über PythonExaktGleich wie statNeinJa
journalctl / syslogNäherungsweiseBeliebigNeinAbhängig von der Protokollaufbewahrung
auditdExaktBeliebigJa (Einrichtung)Nein (erfordert vorherige Konfiguration)
ls --time=birthExakt oder stiller Fallbackext4, btrfs, xfs v5NeinJa (unzuverlässiger Fallback)

Reale Sonderfälle und Fallstricke

Datei kopiert vs. verschoben: Wenn eine Datei kopiert wird (cp), erhält das Ziel einen neuen Inode mit einer neuen Geburtszeit. Wenn eine Datei innerhalb desselben Dateisystems verschoben wird (mv), bleibt der Inode erhalten und die Geburtszeit ändert sich nicht. Dateisystemübergreifendes mv verhält sich wie cp + rm und erstellt einen neuen Inode.

Dateisystemkonvertierung von ext3 zu ext4: Dateien, die vor der Konvertierung existierten, haben einen crtime-Wert von null in ihrem Inode, da ext3 dieses Feld nie befüllt hat. debugfs zeigt crtime: 0x00000000:00000000. In diesem Fall ist mtime zum Zeitpunkt der Konvertierung die beste Annäherung.

Docker- und Container-Umgebungen: Container-Dateisysteme (overlay2, aufs) propagieren die Geburtszeit möglicherweise nicht korrekt. Dateien innerhalb von Containern können die Geburtszeit als Startzeit des Containers anzeigen, anstatt der tatsächlichen Dateierstellungszeit.

NFS-Einhängepunkte: Die Verfügbarkeit der Geburtszeit hängt vollständig vom Dateisystem des NFS-Servers ab. Der Client hat keine unabhängigen Geburtszeitdaten.

Backup-Wiederherstellung: Aus tar-Archiven wiederhergestellte Dateien erhalten typischerweise einen neuen Inode und damit eine neue Geburtszeit, die das Wiederherstellungsdatum widerspiegelt, nicht das ursprüngliche Erstellungsdatum. Verwenden Sie tar --preserve-permissions und überprüfen Sie mtime für die beste Annäherung an die ursprüngliche Erstellungszeit.

Für Administratoren, die Webanwendungen auf VPS mit cPanel verwalten, ist die Integrität von Datei-Zeitstempeln bei Migrationen besonders wichtig — überprüfen Sie immer die Inode-Metadaten nach der Wiederherstellung aus einem Backup.

Geburtszeit-Unterstützung aktivieren: Dateisystem-Optimierung

Wenn Sie einen neuen Server einrichten und garantierte Geburtszeit-Unterstützung wünschen, stellen Sie Folgendes sicher:

Für ext4 — überprüfen Sie, ob die Inode-Größe 256 Bytes beträgt (erforderlich für das crtime-Feld):

sudo tune2fs -l /dev/vda1 | grep "Inode size"
# Should return: Inode size: 256

Wenn die Inode-Größe 128 beträgt, kann die Geburtszeit nicht gespeichert werden. Dies erfordert eine Neuformatierung — es kann nicht auf einem bestehenden Dateisystem geändert werden.

Neues ext4-Dateisystem mit 256-Byte-Inodes erstellen (Standard seit e2fsprogs 1.41):

sudo mkfs.ext4 -I 256 /dev/vdb1

Überprüfen, ob der Kernel statx() unterstützt:

uname -r  # Must be >= 4.11

Bei der Bereitstellung neuer Infrastruktur — ob Shared Web Hosting oder Bare-Metal-Dedicated Servers — bestätigen Sie die Dateisystem-Inode-Größe, bevor Sie Anwendungen bereitstellen, die auf Geburtszeit-Metadaten angewiesen sind.

Praktische Checkliste zur Bestimmung der Dateierstellungszeit

Verwenden Sie diesen Entscheidungsbaum, wenn Sie das Erstellungsdatum einer Datei ermitteln müssen:

  • Zuerst Kernel-Version prüfen: uname -r — muss 4.11+ sein, damit stat Birth anzeigt
  • Dateisystemtyp prüfen: df -T /path/to/file — ext4, btrfs oder xfs v5 erforderlich
  • stat auf die Datei ausführen: Wenn das Birth-Feld einen Zeitstempel anzeigt, haben Sie Ihre Antwort
  • Wenn Birth - anzeigt: debugfs (ext4) oder xfs_db (xfs) mit der Inode-Nummer ausführen
  • Wenn das Dateisystem ext3 oder ext2 ist: Auf mtime als beste Annäherung zurückgreifen
  • Wenn Sie künftig Audit-Genauigkeit benötigen: auditd jetzt konfigurieren
  • Wenn die Datei kürzlich erstellt wurde: journalctl auf bestätigende Protokolleinträge prüfen
  • In Skripten: Immer stat --format="%W" auf 0 prüfen, bevor dem Wert vertraut wird
  • Nach Migrationen oder Wiederherstellungen: Geburtszeit als verdächtig behandeln; mit mtime und Backup-Manifesten gegenprüfen

Für Umgebungen, in denen Dateiintegrität und Zeitstempelgenauigkeit Sicherheitsanforderungen sind — wie Anwendungen, die SSL Certificates und kryptografische Schlüsseldateien verwalten — bietet die Kombination von auditd mit der Geburtszeit auf Dateisystemebene einen zweischichtigen Verifizierungsansatz, der bei Sicherheitsaudits vertretbar ist.

FAQ

Speichert Linux immer die Dateierstellungszeit?

Nein. Nur Dateisysteme mit 256-Byte-Inodes (ext4, btrfs, xfs v5) speichern die Geburtszeit. ext2 und ext3 haben kein Geburtszeit-Feld in ihrer Inode-Struktur. Selbst auf unterstützenden Dateisystemen haben Dateien, die vor einem Dateisystem-Upgrade von ext3 auf ext4 erstellt wurden, eine Geburtszeit von null.

Was ist der Unterschied zwischen ctime und Geburtszeit in Linux?

ctime ist die Inode-Änderungszeit — sie wird aktualisiert, wenn sich Datei-Metadaten (Berechtigungen, Eigentümerschaft, Link-Anzahl) oder der Inhalt ändert. Es ist nicht die Erstellungszeit. Die Geburtszeit (crtime) wird einmalig bei der ersten Erstellung der Datei gesetzt und ändert sich nie. Viele Administratoren verwechseln diese beiden, was zu falschen Audit-Schlussfolgerungen führt.

Kann ich die Dateierstellungszeit wiederherstellen, nachdem sie verloren gegangen ist?

Wenn das crtime-Feld des Inodes null ist oder das Dateisystem es nicht unterstützt, kann die ursprüngliche Erstellungszeit nicht allein aus dem Dateisystem wiederhergestellt werden. Ihre besten Optionen sind: auditd-Protokolle prüfen, wenn diese konfiguriert waren, Anwendungsprotokolle durchsuchen oder Backup-Manifeste konsultieren, die Datei-Metadaten zum Backup-Zeitpunkt aufgezeichnet haben.

Warum zeigt ls --time=creation die falsche Zeit an?

ls fällt stillschweigend auf mtime zurück, wenn die Geburtszeit nicht verfügbar ist, ohne eine Warnung anzuzeigen. Dies ist ein bekanntes Verhaltensproblem in GNU coreutils. Verwenden Sie immer stat --format="%W", um programmatisch zu überprüfen, ob die Geburtszeit tatsächlich verfügbar ist, bevor Sie sich auf die ls-Ausgabe verlassen.

Welcher Befehl liefert die zuverlässigste Dateierstellungszeit auf ext4?

debugfs -R 'stat <inode_number>' /dev/device ist die zuverlässigste Methode auf ext4, da es die rohe Inode-Struktur direkt liest und dabei Einschränkungen von Userspace-Tools umgeht. Für den täglichen Einsatz auf Kernel 4.11+ ist stat filename mit dem Birth-Feld gleichwertig und wesentlich komfortabler.

15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen