如何检查你的文件系统是否以 noatime、relatime 或 strictatime 模式挂载

如果你需要使用依赖于文件系统存储文件最后访问时间(atime)的软件,你可以使用此脚本检查你的文件系统是否以 noatimestrictatimerelatime 模式挂载。

此脚本在 LinuxWindows 上都可以工作。

Linux 上,你可以简单地运行此命令

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

Python 2 版本(pythonclock.org!)

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

注意脚本将在你运行脚本的目录中检查 atime 模式。

Windows 上,下载脚本并使用 Python 直接打开它。如果你没有安装 Python,在下载脚本之前从 Microsoft store 安装或在此下载

如果你需要检查特定驱动器(C:D:、…)的 atime 模式,下载脚本,将其放在该目录中并从那里运行。

此脚本将打印三条消息之一:

Linux 上,默认relatime,而在 Windows默认strictatime

脚本源代码:

check-atime.py
#!/usr/bin/env python3
"""
此实用脚本检查当前文件系统使用哪种 atime 模式
(strictatime、relatime 或 noatime)
"""
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):
    """
    将给定文件名的访问时间设置为给定的 atime。
    atime 必须是 datetime 对象。
    """
    stat = os.stat(filename)
    mtime = stat.st_mtime
    os.utime(filename, (datetime_to_timestamp(atime), mtime))


def last_file_access_time(filename):
    """
    获取表示给定文件最后访问时间的 datetime()。
    返回的 datetime 对象是本地时间
    """
    return datetime.fromtimestamp(os.stat(filename).st_atime)

try:
    # 创建测试文件
    with open("test.txt", "w") as outfile:
        outfile.write("test!")
    time.sleep(0.1)
    # 读取并获取第一个 atime
    with open("test.txt") as infile:
        infile.read()
    atime1 = last_file_access_time("test.txt")
    # 现在读取文件
    time.sleep(0.1)
    with open("test.txt") as infile:
        infile.read()
    # 读取后 atime 不同?
    atime2 = last_file_access_time("test.txt")
    # 设置旧 atime 用于 relatime 检查!
    set_file_access_time("test.txt", datetime(2000, 1, 1, 0, 0, 0))
    # 再次访问
    with open("test.txt") as infile:
        infile.read()
    # 现在 atime 不同
    atime3 = last_file_access_time("test.txt")
    # 检查 atime
    changed_after_simple_access = atime2 > atime1
    changed_after_old_atime = atime3 > atime1
    # 将模式转换为文本并打印
    if (not changed_after_simple_access) and (not changed_after_old_atime):
        print("你的文件系统以 NOATIME 模式挂载 - 访问时间永远不会自动更新")
    elif (not changed_after_simple_access) and changed_after_old_atime:
        print("你的文件系统以 RELATIME 模式挂载 - 访问时间只有在太旧时才会更新")
    elif changed_after_simple_access and (not changed_after_old_atime):
        print("无法确定你的访问时间模式")
    else: # Both updated
        print("你的文件系统以 STRICTATIME 模式挂载 - 访问时间将在每次文件访问时更新")
finally:
    # 删除我们的测试文件
    try:
        os.remove("test.txt")
    except:
        pass

也可在 GitHub 上获取


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