我需要检测对某些文件的读取权限,因此我需要文件系统来更新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
某个文件上的atime
更新有时才会发生。后来我意识到文件系统是用新的relatime
选项。
$ cat /proc/mounts | grep '/home '
/dev/sda7 /home ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
显而易见的解决方案不起作用
因此,该选项似乎relatime
是 Ubuntu 12.04 上的默认选项。解决方案似乎很简单 - 明确说明非默认atime
选项:
$ sudo mount -o remount,atime /home
令我惊讶的是,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
事实上系统表现完全一样如同没有atime
选项一样。
问题
发生了什么事?为什么我不能简单地使用该atime
选项?我该怎么做才能获得正常atime
功能?
答案1
事实上Linux中有四个与五个atime
相关的选项:mount
noatime
-atime
属性(文件和目录的属性)仅在写访问期间更新。nodiratime
-atime
目录仅在写访问期间更新,可以与 relatime 结合使用。relatime
/atime
-atime
似乎现在是 的别名relatime
。此选项仅当前一个早于或,或前一个超过 24 小时时,才会atime
更新属性。atime
mtime
ctime
atime
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