为什么 atime 等于 mtime 和 ctime 时会更新?

为什么 atime 等于 mtime 和 ctime 时会更新?

我试图了解 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在后续第一次读取时更新。

看起来像是手册中的错误。

相关内容