If you need to use a software that depends on your filesystem storing the last access time of a file (atime
), you can use this script to check if your filesystem is mounted in noatime
, strictatime
or relatime
mode.
This script works on both Linux and Windows.
On Linux, you can simply run this
wget -qO- https://techoverflow.net/scripts/check-atime.py | python3
Python 2 version (pythonclock.org !)
wget -qO- https://techoverflow.net/scripts/check-atime.py | python
Note that the script will check for the atime mode in whichever directory you run the script in.
On Windows, download the script and directly open it using Python. In case you don’t have Python installed, install it from the Microsoft store or download it here before downloading the script.
In case you need to check the atime mode of a specific drive (C:
, D:
, …), download, the script, place it in that directory and run it from there.
This script will print one of three messages:
-
Your filesystem is mounted in NOATIME mode – access times will NEVER be updated automatically
-
Your filesystem is mounted in RELATIME mode – access times will only be updated if they are too old
-
Your filesystem is mounted in STRICTATIME mode – access times will be updated on EVERY file access
On Linux, the default is relatime whereas on Windows the default is strictatime.
Sourcecode of the script:
#!/usr/bin/env python3 """ This utility script checks which atime mode (strictatime, relatime or noatime) is in use for the current filesystem """ 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): """ Set the access time of a given filename to the given atime. atime must be a datetime object. """ stat = os.stat(filename) mtime = stat.st_mtime os.utime(filename, (datetime_to_timestamp(atime), mtime)) def last_file_access_time(filename): """ Get a datetime() representing the last access time of the given file. The returned datetime object is in local time """ return datetime.fromtimestamp(os.stat(filename).st_atime) try: # Create test file with open("test.txt", "w") as outfile: outfile.write("test!") time.sleep(0.1) # Read & get first atime with open("test.txt") as infile: infile.read() atime1 = last_file_access_time("test.txt") # Now read file time.sleep(0.1) with open("test.txt") as infile: infile.read() # Different atime after read? atime2 = last_file_access_time("test.txt") # Set OLD atime for relatime check! set_file_access_time("test.txt", datetime(2000, 1, 1, 0, 0, 0)) # Access again with open("test.txt") as infile: infile.read() # Different atime now atime3 = last_file_access_time("test.txt") # Check atime changed_after_simple_access = atime2 > atime1 changed_after_old_atime = atime3 > atime1 # Convert mode to text and print if (not changed_after_simple_access) and (not changed_after_old_atime): print("Your filesystem is mounted in NOATIME mode - access times will NEVER be updated automatically") elif (not changed_after_simple_access) and changed_after_old_atime: print("Your filesystem is mounted in RELATIME mode - access times will only be updated if they are too old") elif changed_after_simple_access and (not changed_after_old_atime): print("Unable to determine your access time mode") else: # Both updated print("Your filesystem is mounted in STRICTATIME mode - access times will be updated on EVERY file access") finally: # Delete our test file try: os.remove("test.txt") except: pass
Also available on GitHub.