Linux man-pages 6.19的inode条目,将atime、mtime、ctime和btime分别列为最后访问、最后修改、最后状态变化及文件创建时间。这四个名称都带time,触发它们变化的事件却不同。尤其ctime中的c没有在此被定义为creation:手册为创建时间单列了birth timestamp,即btime。[1]
这些时间属于文件元数据。条目开头说,每个文件有一个保存元数据的inode,stat返回stat结构,statx返回statx结构。两个返回结构对时间的覆盖并不完全相同:btime不在stat结构中返回,对应的statx字段则名为stx_btime。于是,一份stat字段清单没有创建时间,与文件元数据中不存在其他时间概念,是两种不同说法。
btime的定义是文件建立时设定,之后不再改变;ctime则会随写入或inode信息的设置而改变。后者包括所有者、组、硬链接数量和mode等信息。创建与状态变化由此具有不同时间参照:一个指向对象建立,另一个指向最近一次符合定义的状态事件,而不是文件年龄的另一种写法。
mtime关注修改,但手册还明确排除了几类变化:所有者、组、硬链接数量或mode改变,不会改变mtime。这些项目同时出现在ctime的说明中,构成一个具体对照。若纸面记录只描述所有者发生变化,便没有充分依据将其写成文件正文也被改写;同样,ctime与mtime不相同,也不必直接解释成记录自相矛盾。
目录的mtime另有明确对象。目录内建立或删除文件,会改变该目录的mtime。这里被更新时间所属的是目录,而不是新建或删除对象的正文。目录成员关系变化可以留下目录时间信息,因而阅读一个时间值时,首先需要保留它对应的inode是目录还是目录里的某个文件。
atime也不是每次接触文件都会更新的无条件记录。文档把它定义为最后访问时间,同时指出mmap等接口可能更新,也可能不更新;某些文件系统的访问方式还会使文件或目录访问不触发这项更新。这里保留的是手册列出的例外,没有把某个未变的atime反向解释成文件必定从未被访问。
时间值还包含表示精度这一层。该条目以1970年1月1日零时UTC为Epoch零点,说明stat与statx的时间结构可带纳秒部分;在不支持亚秒时间戳的文件系统上,这个部分返回零。零出现在纳秒分量中,不是说整项时间没有数值,更不是一份独立的访问或修改事件。
该手册还具名列出纳秒支持的范围:XFS、JFS、Btrfs及ext4支持,ext4的说明带Linux 2.6.23起的版本条件;ext2、ext3和Reiserfs则列为不支持纳秒时间戳。这是6.19条目中的文件系统清单,不是本文对当前电脑的检测。相同结构能够容纳纳秒分量,并不使每一种底层文件系统都取得相同精度,返回结构的能力与来源精度仍需分开。
本篇采用上述定义与连续邻接,未执行文件调用、改动时间或作取证归责;条目日期及HTML生成日期不作为首次发表日。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。