How to check if your filesystem is mounted in noatime, relatime or strictatime mode
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.