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/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更新如果都被写入到磁盘中,这样做会带来几个问题:

  1. 大量的文件访问,会导致频繁的将atime写入磁盘,浪费时间,降低系统的性能。
  2. 这样做本身也是特别费电。

而且元数据的时间戳当中,我们最关心的实际上只是修改文件的时间 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: -
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Linux内核的ext4文件系统是一种高性能、可靠的文件系统,是ext3文件系统的升级版。它可以支持更大的文件和更大的文件系统,并提供更高的性能和更好的可靠性。下面是对ext4文件系统代码的详细讲解: 1. 文件系统初始化 文件系统初始化是ext4文件系统的第一步。在初始化过程中,文件系统会创建超级块、块组描述符表、inode表、位图和根目录等基本数据结构。其中,超级块是文件系统的核心数据结构,它记录了文件系统的各种属性和参数,如文件系统的大小、块大小、inode数量、挂载时间等。块组描述符表记录了每个块组的信息,如块组的起始位置、块位图的位置、inode位图的位置等。inode表记录了文件和目录的元数据,如文件大小、访问权限、创建时间等。位图记录了块和inode的分配情况。根目录是文件系统的根节点,它包含了所有文件和目录的入口。 2. 块和inode的分配 在ext4文件系统中,块和inode的分配是通过位图实现的。当文件系统需要分配一个块或inode时,它会在位图中查找空闲的块或inode,并将其标记为已分配。如果位图中没有空闲的块或inode,则文件系统会尝试从其他块组中获取。 3. 目录的管理 在ext4文件系统中,目录是一种特殊的文件,它包含了其他文件和目录的入口。在目录中,每个文件和目录都对应一个inode,它记录了文件和目录的元数据。当一个新的文件或目录被创建时,文件系统会为其分配一个inode,并在目录中添加一个新的入口。当一个文件或目录被删除时,文件系统会从目录中删除相应的入口,并释放对应的inode和块。 4. 文件的读写 在ext4文件系统中,文件的读写是通过文件系统缓存和块缓存实现的。当一个文件被打开时,文件系统会将其缓存到内存中,并将文件指针定位到文件的起始位置。当文件被读取时,文件系统会从文件的缓存中读取数据,并将文件指针向后移动。当文件被写入时,文件系统会将数据写入到块缓存中,并将文件指针向后移动。当文件被关闭时,文件系统会将文件的缓存写回到磁盘中。 5. 日志记录 在ext4文件系统中,日志记录是一种重要的机制,它可以保证文件系统的可靠性和一致性。在文件系统的操作中,如文件的读写、块和inode的分配、目录的管理等,都会被记录到日志中。如果在操作过程中出现了错误或系统崩溃,文件系统可以通过日志恢复机制来恢复文件系统的状态。 总结: 以上是对Linux内核的ext4文件系统代码的详细讲解。通过对文件系统初始化、块和inode的分配、目录的管理、文件的读写和日志记录等方面的分析,可以更好地理解文件系统的实现原理和工作机制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值