根据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
演示目的(输出缓慢)
答案1
由于您没有访问数据块(仅写入数据块),因此 atime 不会更新。如果您读取 random.dat,则 atime 将更新(只要满足相关时间标准)。
file_accessed()
您可以在内核中查找调用时看到此信息:
https://github.com/torvalds/linux/blob/master/fs/ext4/file.c
file_accessed 将调用例程来更新 inode 中的 atime,并且仅在读取函数(和 mmap)中调用。