在linux下每个文件(目录)都会记录很多时间参数,主要有三个关于文件变动的时间——mtime、atime、ctime,它们储存与inode
“数据结构”中,使用stat filename
命令可以查看它们。
1.ctime
change time:当文件(目录)的“状态”被改变时,这个时间会被更新,如文件的权限、拥有者、所属组属性、大小等。
如下:
2. mtime
modification time:当文件(目录)的“内容数据”被修改时,这个时间会更新,权限的修改不会影响该时间。
注意:对于目录来讲,它的内容是该目录路径下的文件(目录)名列表,这也就意味着,当你在某个目录下创建新的文件(目录)时,该目录的mtime
会改变。
如下:
细心的小伙伴可能会发现,我们只改变了文件的内容,但是文件的ctime
也改变了,这是因为当改变了文件内容后,文件的大小属性也改变了,于是ctime
也会随之改变。
3. atime
access time:获取时间,即当文件的“内容被访问读取”时,这个时间会被更新,比如cat
某文件时,该文件的atime
会改变。
不过这是一个有争议的时间参数,在某些Linux版本,当你使用cat、more读取文件内容后,atime
并不会更新,比如我刚才在自己的Linux上测试时,cat
文件后,它的atime
并没有随之改变,为什么呢?
1. atime
未更新原因
想想你平常在使用Linux时使用比较频繁的命令是什么,我想ls
和cat
使用的应该很频繁了吧。那么当你每ls
一次,文件的atime
都会更新一次,除此之外,系统本身还有大量的文件访问,这些访问造成的atime
更新如果都被写入到磁盘中,这样做会带来几个问题:
1. 大量的文件访问,会导致频繁的将atime
写入磁盘,浪费时间,降低系统的性能。
2. 这样做本身也是特别费电。
说道这儿有人可能会问,为什么ctime
、mtime
为什么会即时更新呢?
原因是,在Linux系统中,我们往往最关心的是文件的修改时间,比如有人告诉你上周五完成的一个程序有个小bug,于是你就通过mtime
或者是ctime
定位找到上周五修改过的文件,你当然不会通过atime
去找了,因为你可能昨天还ls
过它。
所以,每次读取文件后更新它的atime
好像并没有这个必要,一是我们平常并不会经常使用这个时间参数,二是频繁的更新它会导致系统的性能的损耗。于是Linux内核的开发人员为了提高性能,在2.6.30
版本之后,修改了atime
的更新机制。我查看了自己的版本,果然:
2. atime
会更新的情况
那么在2.6.30
之后的版本,只有在下列几种情况下,才会更atime
:
1. atime
小于ctime
或mtime
时。举个例子:某文件的atime
是11:02
,而mtime
是同一天的12:03
,那么,当你cat
改文件后,它的atime
会更新。
atime
大于ctime
的情况:
atime
小于ctime
的情况:
- 当前读取时间与上次间隔大于24小时。
- 如果将分区mount的挂载的时候指定采用非relatime方式(默认采用relatime方式),如strictatime.
补充:在OS启动的时候,将各个分区挂载到不同的目录,在挂载(mount)的参数中采用strictatime,表明及时更新atime。在2.6.30之后mount添加了”relatime”和”strictatime”两个选项,详细的可以通过”man mount”查看。
3. 如何让你的atime
即时更新
那么如果你想让你的Linux文件的atime
及时更新,要怎么做呢?
OS启动的时候会读取/etc/fstab文件,在你的Linux中修改etc/fstab
文件,添加strictatime
选项:
然后重启你的OS,再去试试,是不是只要读取文件内容,它的atime
就会改变呢!
参考资料
- http://stackoverflow.com/questions/15547649/is-it-necessary-to-enable-atime-in-etc-fstab-to-get-the-correct-last-accessed
- http://www.h-online.com/open/news/item/Kernel-Log-What-s-coming-in-2-6-30-File-systems-New-and-revamped-file-systems-741319.html
【作者:果冻 http://blog.csdn.net/jelly_9】