Linux: Prüfen ob Dateisystem mit noatime, relatime oder strictatime gemountet ist

English Deutsch

Wenn Sie eine Software verwenden müssen, die davon abhängt, dass Ihr Dateisystem die letzte Zugriffszeit einer Datei (atime) speichert, können Sie dieses Skript verwenden um zu prüfen, ob Ihr Dateisystem im noatime-, strictatime- oder relatime-Modus gemountet ist.

Dieses Skript funktioniert sowohl unter Linux als auch unter Windows.

Unter Linux können Sie es einfach so ausführen:

check_atime.sh
wget -qO- https://techoverflow.net/scripts/check-atime.py | python3

Python 2 Version (pythonclock.org !)

check_atime_py2.sh
wget -qO- https://techoverflow.net/scripts/check-atime.py | python

Beachten Sie, dass das Skript den atime-Modus in dem Verzeichnis prüft, in dem Sie das Skript ausführen.

Unter Windows laden Sie das Skript herunter und öffnen Sie es direkt mit Python. Falls Sie Python nicht installiert haben, installieren Sie es aus dem Microsoft Store oder laden Sie es hier herunter, bevor Sie das Skript herunterladen.

Falls Sie den atime-Modus eines bestimmten Laufwerks (C:, D:, …) prüfen müssen, laden Sie das Skript herunter, platzieren Sie es in diesem Verzeichnis und führen Sie es von dort aus.

Dieses Skript gibt eine von drei Meldungen aus:

Unter Linux ist der Standard relatime, während unter Windows der Standard strictatime ist.

Quellcode des Skripts:

check-atime.py
#!/usr/bin/env python3
"""
Dieses Hilfsskript prüft, welcher atime-Modus (strictatime, relatime oder noatime)
für das aktuelle Dateisystem verwendet wird
"""
import os
import time
from datetime import datetime

def datetime_to_timestamp(dt):
    return time.mktime(dt.timetuple()) + dt.microsecond/1e6

def set_file_access_time(filename, atime):
    """
    Setzt die Zugriffszeit einer gegebenen Datei auf die angegebene atime.
    atime muss ein datetime-Objekt sein.
    """
    stat = os.stat(filename)
    mtime = stat.st_mtime
    os.utime(filename, (datetime_to_timestamp(atime), mtime))


def last_file_access_time(filename):
    """
    Gibt ein datetime() zurück, das die letzte Zugriffszeit der gegebenen Datei repräsentiert.
    Das zurückgegebene datetime-Objekt ist in lokaler Zeit
    """
    return datetime.fromtimestamp(os.stat(filename).st_atime)

try:
    # Testdatei erstellen
    with open("test.txt", "w") as outfile:
        outfile.write("test!")
    time.sleep(0.1)
    # Lesen & erste atime holen
    with open("test.txt") as infile:
        infile.read()
    atime1 = last_file_access_time("test.txt")
    # Jetzt Datei lesen
    time.sleep(0.1)
    with open("test.txt") as infile:
        infile.read()
    # Andere atime nach Lesezugriff?
    atime2 = last_file_access_time("test.txt")
    # ALTE atime für relatime-Prüfung setzen!
    set_file_access_time("test.txt", datetime(2000, 1, 1, 0, 0, 0))
    # Erneut zugreifen
    with open("test.txt") as infile:
        infile.read()
    # Andere atime jetzt?
    atime3 = last_file_access_time("test.txt")
    # atime prüfen
    changed_after_simple_access = atime2 > atime1
    changed_after_old_atime = atime3 > atime1
    # Modus in Text umwandeln und ausgeben
    if (not changed_after_simple_access) and (not changed_after_old_atime):
        print("Ihr Dateisystem ist im NOATIME-Modus gemountet – Zugriffszeiten werden NIEMALS automatisch aktualisiert")
    elif (not changed_after_simple_access) and changed_after_old_atime:
        print("Ihr Dateisystem ist im RELATIME-Modus gemountet – Zugriffszeiten werden nur aktualisiert, wenn sie zu alt sind")
    elif changed_after_simple_access and (not changed_after_old_atime):
        print("Zugriffszeit-Modus konnte nicht bestimmt werden")
    else: # Both updated
        print("Ihr Dateisystem ist im STRICTATIME-Modus gemountet – Zugriffszeiten werden bei JEDEM Dateizugriff aktualisiert")
finally:
    # Unsere Testdatei löschen
    try:
        os.remove("test.txt")
    except:
        pass

Auch auf GitHub verfügbar.


Check out similar posts by category: Linux, Python, Windows