linux修改文件元信息,Linux 文件元数据详细讲解

已知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/64768dInode: 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/64769dInode: 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/64769dInode: 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/64768dInode: 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/64768dInode: 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: -

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值