为什么 mount 的 atime 选项不总是按预期更新文件的 atime?

pab*_*ouk 5 fstab mount atime

我需要检测对某些文件的读访问,所以我需要文件系统以atime通常的方式更新文件的属性。

默认挂载选项

在默认状态下,atime虽然我没有使用该noatime选项,但文件系统没有按预期更新:

$ cat /etc/fstab | grep '/home '
# /home was on /dev/sda7 during installation
UUID=d7e67903-f24d-45a7-be90-6a134c9c1ae9 /home         ext4    defaults      0     2

$ mount | grep '/home '
/dev/sda7 on /home type ext4 (rw)

$ cat /etc/mtab | grep '/home '
/dev/sda7 /home ext4 rw 0 0
Run Code Online (Sandbox Code Playgroud)

atime上一个文件只是偶尔更新。后来我意识到文件系统是用新relatime选项挂载的。

$ cat /proc/mounts | grep '/home '
/dev/sda7 /home ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)

显而易见的解决方案不起作用

因此,该relatime选项似乎是 Ubuntu 12.04 上的默认选项。解决方案似乎很简单 - 明确说明非默认atime选项:

$ sudo mount -o remount,atime /home
Run Code Online (Sandbox Code Playgroud)

我很惊讶实际mount选项看起来与没有atime选项时完全一样

$ mount | grep '/home '
/dev/sda7 on /home type ext4 (rw)

$ cat /etc/mtab | grep '/home '
/dev/sda7 /home ext4 rw 0 0

$ cat /proc/mounts | grep '/home '
/dev/sda7 /home ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)

事实上,系统的行为与没有atime选项时完全相同

问题

到底是怎么回事?为什么我不能简单地使用该atime选项?我该怎么做才能获得正常的atime功能?

pab*_*ouk 8

事实上,Linux 中有四个与五个atime相关的选项mount

  • noatime-atime属性(文件和目录的)仅在写访问期间更新。
  • nodiratime- atimeof 目录仅在写访问期间更新,可以与 relatime 结合使用。
  • relatime/ atime-atime现在似乎是relatime. atime仅当上一个atime早于mtimectime,或者上一个atime超过 24 小时时,此选项才会使属性更新。
  • strictatime- 它以前被称为atime,因此是默认选项。它会导致atime属性随着每次文件访问而更新。(访问文件数据,而不仅仅是元数据/属性)
  • lazytime- Linux 4.10 添加了一个新选项:仅在文件 inode 的内存版本上更新时间(atime、mtime、ctime)。磁盘上的数据会延迟更新(man 8 mount有关详细信息,请参阅 参考资料)。

从 Linux 内核 2.6.30 开始,默认选项是relatime. 如果您想拥有原始atime功能,则必须使用该strictatime选项。在目前的情况下,它将是:

sudo mount -o remount,strictatime /home
Run Code Online (Sandbox Code Playgroud)

来源