我试图了解 Linux 中默认的“relatime”挂载选项如何处理 inode 访问时间,但记录的行为安装(8)与我所看到的不太相符。它说:
关系时间
更新相对于修改或更改时间的 inode 访问时间。仅当先前访问时间早于当前修改或更改时间时,访问时间才会更新。 (与 noatime 类似,但不会破坏 mutt 或其他需要知道文件自上次修改后是否已被读取的应用程序。)
我可以使用相同的 atime/mtime/ctime 设置测试文件:
$ touch sometestfile
$ stat sometestfile
File: sometestfile
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 259,2 Inode: 38318274 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2023-03-24 16:56:56.758033579 -0400
Modify: 2023-03-24 16:56:56.758033579 -0400
Change: 2023-03-24 16:56:56.758033579 -0400
Birth: 2023-03-24 16:56:56.758033579 -0400
但是,随后的读取会增加 atime,即使 atime 是不是早于当前修改或更改时间:
$ cat sometestfile
$ stat sometestfile
File: sometestfile
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 259,2 Inode: 38318274 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2023-03-24 16:57:02.336950126 -0400
Modify: 2023-03-24 16:56:56.758033579 -0400
Change: 2023-03-24 16:56:56.758033579 -0400
Birth: 2023-03-24 16:56:56.758033579 -0400
如果我查看手册页,它不应该保持不变吗?这只是手册页中的“<”与内核源代码中的“<=”的情况吗? (这基本上是相反的这个问题;对我来说,后续读取一次不会改变是有道理的,但我很困惑为什么它会随着第一次读取而改变。)我意识到这是非常挑剔的,但我试图把我的头围绕所有的边缘情况涉及文件的访问时间,刚刚遇到了这个。我在 Fedora 37 的内核 6.1.9 和 Arch 的内核 6.2.6 上看到了这一点。
答案1
是的,“早”应该是“不晚”。
您看到的行为是正确的。触摸文件就是写入。atime
在后续第一次读取时更新。
看起来像是手册中的错误。