已知linux上文件有两种数据:
1、元数据(metadata):用来描述一个文件的特征的系统数据
2、数据:泛指普通文件中的实际数据;
硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个则是inode区(inode table),用于储存文件元信息的区域。
inode与文件是一一对应的关系,每个文件都有自己的inode(inode: 中文译名为"索引节点")。根据 inode的编号,查询inode table,即可知道对应文件的元数据信息。
那元数据究竟是什么呢?
可通过stat命令可以显示文件的元数据
stat – display file or file system status(用于展示文件或文件系统的状态)
[root@ansible-client ~]# stat anaconda-ks.cfg
File: ‘anaconda-ks.cfg’
Size: 1293 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 68407394 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-07-08 17:32:32.260000000 +0800
Modify: 2019-07-08 17:32:32.261000000 +0800
Change: 2019-07-08 17:32:32.261000000 +0800
Birth: -
- 解释说明:
- File:文件名
- Size:文件大小(单位:B)
- Blocks:文件所占扇区个数,为8的倍数(通常的 Linux 的扇区大小为 512 B,连续八个扇区组成一个block)
- IO Block:每个数据块的大小(单位:B)
- regular file:普通文件(此处显示文件的类型)
- Inode:文件的Inode号 ( node讲解 )
- Links:硬链接次数 (软硬链接讲解)
- Access:权限
- Uid:(属主id/属主名)
- Gid:(属组id/属组名)
- Access:最近访问时间
- Modify:数据改动时间
- Change:元数据改动时间
以上的参数均属于文件的元数据,元数据即用来描述数据的数据
时间戳
此处着重说明一下文件的时间戳:
-
Access:Access time(atime),是指取用文件的时间,所谓取用,常见的操作有:使用编辑器查看文件内容,使用cat命令显示文件内容;使用cp命令把该文件(即来源文件)复制成其他文件;或者在这个文件上运用grep、sed、more、less、tail、head等命令,凡是读取文件的操作,均改变文件的Access time
-
Modify:Modify time(mtime),是指修改文件内容的时间,只要文件内容有改动(如使用转向输出或转向附加的方式)或存盘的操作,就会改变文件的Modify time,平常我们使用ls –l查看文件时,显示的时间就是Modify time
-
Change:Change time(ctime),是指文件属性或文件位置改动的时间(跟随元数据的改变而改变),如:使用chmod、chown、mv指令集;使用ln做文件的硬是连接,都会改变文件的Change time
但是当我们使用cat、head等等命令查看文件后,却发现,atime没改变???
[root@xulx ~]# stat aa.txt
File: ‘aa.txt’
Size: 5 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 917518 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-03-01 18:09:46.614194866 +0800
Modify: 2020-03-01 18:09:44.459122164 +0800
Change: 2020-03-01 18:09:44.461122232 +0800
Birth: -
[root@xulx ~]# cat aa.txt
qqqq
[root@xulx ~]# stat aa.txt
File: ‘aa.txt’
Size: 5 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 917518 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-03-01 18:09:46.614194866 +0800
Modify: 2020-03-01 18:09:44.459122164 +0800
Change: 2020-03-01 18:09:44.461122232 +0800
Birth: -
这是为什么呢?
首先,我们来思考一下,平常在使用Linux时使用比较频繁的命令是什么,我想ls和cat使用的应该很频繁了吧。那么当你每ls一次,文件的atime都会更新一次,除此之外,系统本身还有大量的文件访问,这些访问造成的atime更新如果都被写入到磁盘中,这样做会带来几个问题:
- 大量的文件访问,会导致频繁的将atime写入磁盘,浪费时间,降低系统的性能。
- 这样做本身也是特别费电。
而且元数据的时间戳当中,我们最关心的实际上只是修改文件的时间 mtime,而atime平时并不会经常使用这个时间参数。
于是Linux内核的开发人员为了提高性能,在kernel2.6.30版本之后,修改了atime的更新机制:只有在atime小于ctime或mtime时,或者atime比现在早一天,那么atime在文件读取时会被更新.
查看我的内核版本,高于2.6.30,这也就是为什么atime没有改变的原因了
[root@xulx ~]# uname -r
3.10.0-957.21.3.el7.x86_64
那么如果我就想要及时跟更新atime,那该怎么做呢?
只需要修改/etc/fstab中挂载的硬盘的参数即可
[root@xulx ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 11 02:52:01 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1114fe9e-2309-4580-b183-d778e6d97397 / ext4 defaults 1 1
改动如下
UUID=1114fe9e-2309-4580-b183-d778e6d97397 / ext4 defaults 1 1
----
修改为:UUID=1114fe9e-2309-4580-b183-d778e6d97397 / ext4 defaults strictatime 1 1
----
#改好后,重启OS
为什么这么改动呢?因为将分区mount的挂载的时候,默认采用relatime方式,relatime方式也就是kernel2.6.30版本之后默认使用的atime更新机制。所以想要立即更新atime,使用非reltime方式即可,如 strictatime
那么我们能否手动修改元数据的时间戳呢?
可以的,使用touch命令即可
touch命令主要有两方面的作用:1、创建新的空文件 2、修改文件元数据的时间戳
常用参数:
格式:touch [OPTION]… FILE…
-a 仅改变 atime和ctime
-m 仅改变 mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
-c 如果文件不存在,则不予创建
下面举例说明,如何更改atime。mtime同理,只是参数换成 m 即可
eg: 更改atime
[root@ansible-client ~]#stat aa.txt
File: ‘aa.txt’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 67152107 Links: 1
Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-01-20 15:40:30.000000000 +0800
Modify: 2020-01-19 15:32:14.017567572 +0800
Change: 2020-01-19 15:34:39.895567572 +0800
Birth: -
[root@ansible-client ~]#touch -at 202002022222.20 aa.txt
#y因为atime也属于元数据,所以更改后,ctime也会自动跟着改变
[root@ansible-client ~]#stat aa.txt
File: ‘aa.txt’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 67152107 Links: 1
Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-02 22:22:20.000000000 +0800
Modify: 2020-01-19 15:32:14.017567572 +0800
Change: 2020-01-19 15:36:23.478567572 +0800
Birth: -
转载:https://blog.csdn.net/Giyomwd/article/details/104596711