linux系统中三个文件时间

写在前面

       linux文件时间是文件的访问时间、修改时间和改变时间。atime在Linux的文件系统中被称为访问时间,当文件的内容被访问时,就会更新这个时间,       mtime指的是当“内容数据”被修改时,Linux系统会去更新这个时间,ctime是Linux系统中的状态时间,当文件的状态即文件的属性被改变是就会更改这个时间。
       windows操作系统应该是每个人都熟悉的,当我们在windows系统中选择一个文件,然后右键点击选择属性,可以看到以下内容,文件有创建时间、修改时间和访问时间。linux系统中同样有三个时间,但是和windows系统中稍微有些不同,linux系统中是访问时间、修改时间和改变时间,linux系统中没有文件的创建时间(有的人认为缺少创建时间是linux系统文件设计中的一个缺陷)
文件属性

linux系统中文件的三个组成部分

  1. dentry(目录项)
    文件名保存在dentry的数据结构中
  2. inode节点
    在linux系统中,每个文件除了内容之外,都有一些相关信息。例如用户所有者、组所有者文件权限、时间信息和链接数等等,所有与某个文件相关的额外信息都保存在inode的结构中(文件名除外,文件名在dentry中)
  3. 数据
    这里的数据就是文件的内容。

文件时间

在Linux下,我们可以用stat+文件名查看文件的相关参数,具体参数解释如下图:
stat查看文件属性
       在Linux中的文件系统下,我们发现除了文件的大小,文件名,文件时间等,还多了Inode号和block的相关信息,这主要和Linux文件系统的构成有关,在Linux下一个文件具有一个Inode号,一个Inode号对应着至少一个block块,bolck是访问文件内容的结构,文件block块的个数和文件的大小有关,并且在Linux系统下,block块的大小是固定的。

atime

       atime是Access Time的简写,它在Linux的文件系统中被称为访问时间,当文件的内容被访问时,就会更新这个时间,例如我们使用cat、more、less等命令查看文件的内容时,文件的访问时间就会被更新,如下图:
仅改变访问时间
       在使用cat、more或者less命令读取文件的时候,发现只有在修改文件之后第一次读取的时候回修改atime,再次访问文件,文件的访问时间并不改变,我搜了搜一些网上的回答。

       根据 Criticism of atime 的说法,读取文件要修改 atime 本身是一件很不合理的事情,因为要修改文件的 atime 就意味着要对磁盘进行写操作。首先,在只读文件系统上你根本不可能修改文件的 atime,更重要的是这增加了磁盘 IO 数量。
       为了提高磁盘性能,我们可以完全禁止 atime 的修改(参看mount的–noatime–nodiratime选项),但这会破坏 POSIX 兼容性,而且某些备份软件需要通过对比 atime 和 mtime/ctime (修改时间/创建时间)的时间来判断是否需要进行备份。针对这个问题,Linux 内核 2.6.20 开始为mount引入了一个–relatime选项,并从 2.6.30 开始这一选项默认是开启的。当开启了–relatime选项后,只有当 atime < mtime 或 atime < ctime 时,才会去更新 atime。通过这种方式,一方面可以大幅度减少 atime 引起的磁盘写操作,另一方面又保证了备份软件不受到影响,可谓非常精妙了。下面这段关于–relatime的说明取自relatime
       相对于 inode 的修改或更改时间来更新它的访问时间。仅当先前的访问时间早于当前修改或更改时间时,才会更新访问时间。 (与 noatime 类似,但它不会破坏 mutt 或其他需要知道文件自上次修改后是否已被读取的应用程序)
       从 Linux 2.6.30 开始,内核默认使用此选项提供的行为(除非指定了 noatime),并且需要 strictatime 选项才能获得传统语义。 此外,自 Linux 2.6.30 起,如果文件的上次访问时间超过 1 天,则该文件的最后访问时间将始终更新。
       另外,Linux 内核 4.0 开始引入了一个新选项–lazytime。它可以让更新 atime 的操作缓存在内存中,然后当该文件有非时间相关的 IO 要写入时以其更新到磁盘中。同时它也能设置超过多长时间后强制更新 atime。通过这种方式,–lazytime能做到在不影响性能的情况下保持 POSIX 兼容性。

mtime

       mtime是Modification Time的简写,它指的是当“内容数据”被修改时,Linux系统会去更新这个时间,例如:我们用echo,vim等指令向文件写数据
mtime时间改变
       从这次修改文件操作中可以看出,对文件内容进行修改会同时更新mtime和ctime,从图中也可以明显看到,inode结构中包含文件的大小Size,而修改文件内容文件的大小一般也会改变,因而mtime修改的同时ctime也会修改。

ctime

       ctime是Linux系统中的status time,即状态时间,当文件的状态即文件的属性被改变是就会更改这个时间,例如文件系统中的links(链接数),size(文件的大小)、文件的权限、blocks(文件的block数);当这些参数被改变时,Linux就会更改该文件所对应的这个时间参数。下面的图片反映了修改文件权限仅修改ctime,不修改mtime和atime。
ctime修改

总结

       三个文件时间记录了Linux文件系统下的文件被访问,修改,以及改变的时间,当Linux下的文件或者程序出现问题,我们可以通过查询这些时间来判断我们什么时候做了什么操作从而对这些文件产生了影响。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值