根据mount
手册页,
仅当先前的访问时间早于当前的修改或更改时间时,才更新访问时间。
但是,如果我这样做(带有relatime
选项(*)的 ext4):
> date +%T.%N ; dd if=/dev/random of=random.dat bs=1 count=4096 ; date +%T.%N ; stat random.dat
18:52:00.616084761
4096+0 records in
4096+0 records out
4096 bytes (4.1 kB, 4.0 KiB) copied, 0.0319383 s, 128 kB/s
18:52:00.651183318
File: random.dat
Size: 4096 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 28313073 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ me) Gid: ( 1000/ me)
Access: 2022-09-26 18:52:00.616297607 +0200
Modify: 2022-09-26 18:52:00.648297639 +0200
Change: 2022-09-26 18:52:00.648297639 +0200
Birth: -
访问时间似乎停留在创建时间上,如果我重新运行它(所以现在random.dat
存在,并且它与更新的 inode 相同)我得到:
> date +%T.%N ; dd if=/dev/random of=random.dat bs=1 count=4096 ; date +%T.%N ; stat random.dat
18:52:43.014712313
4096+0 records in
4096+0 records out
4096 bytes (4.1 kB, 4.0 KiB) copied, 0.0633748 s, 64.6 kB/s
18:52:43.081174320
File: random.dat
Size: 4096 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 28313073 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ me) Gid: ( 1000/ me)
Access: 2022-09-26 18:52:00.616297607 +0200
Modify: 2022-09-26 18:52:43.076338407 +0200
Change: 2022-09-26 18:52:43.076338407 +0200
Birth: -
...尽管完全重写了文件内容,但访问时间根本没有改变。
我错过了什么/误解了什么?访问时间不应该与修改和更改一起更新吗?
(*)/dev/mapper/vgkubuntu-root on / type ext4 (rw,relatime,errors=remount-ro)
(**)dd if=/dev/random
用于演示目的(缓慢输出)
由于您没有访问数据块(仅写入它们),因此 atime 不会更新。如果您阅读 random.dat 则 atime 将得到更新(只要满足 relatime 标准)。
file_accessed()
你可以看到这个在内核中寻找调用:https://github.com/torvalds/linux/blob/master/fs/ext4/file.c
file_accessed 将调用例程来更新 inode 中的 atime,并且仅在读取函数(和 mmap)中调用。