如何检查你的文件系统是否以 noatime、relatime 或 strictatime 模式挂载
如果你需要使用依赖于文件系统存储文件最后访问时间(atime)的软件,你可以使用此脚本检查你的文件系统是否以 noatime、strictatime 或 relatime 模式挂载。
此脚本在 Linux 和 Windows 上都可以工作。
在 Linux 上,你可以简单地运行此命令
check_atime.sh
wget -qO- https://techoverflow.net/scripts/check-atime.py | python3Python 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 模式,下载脚本,将其放在该目录中并从那里运行。
此脚本将打印三条消息之一:
- 你的文件系统以 NOATIME 模式挂载 - 访问时间永远不会自动更新
- 你的文件系统以 RELATIME 模式挂载 - 访问时间只有在太旧时才会更新
- 你的文件系统以 STRICTATIME 模式挂载 - 访问时间将在每次文件访问时更新
在 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 上获取。
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow