访问时间奇怪

访问时间奇怪

根据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)中调用。

相关内容