linux的文件系统结构、superblock和inode节点等介绍

这篇文章我写一下自己对于linux文件系统结构和节点inode的简单理解。

文件系统结构概述

我们先简单看一下linux的文件系统结构划分,linux的文件系统大致可以分为三部分,或者,我们可以直接理解为linux的物理磁盘上,存放的数据是分为三部分的。

第一部分是superblock:超级块。这一部分主要存放的是文件系统的信息,例如文件系统格式、文件系统中节点数目,剩余节点情况,文件系统大小和状态等。

第二部分是inode:文件节点。这里可以理解为类似于索引的概念,对于文件来说,inode里存储的是这个文件的元数据信息,例如文件权限、所有者、大小等,还有一个最重要的就是这个文件数据实际存储的block编号。对于目录,存储的就是这个目录的元数据(权限、所有者等信息)以及对于block编号。

第三部分是block:文件块。可以理解为文件实际上存储的区域。对于文件和目录,它上边存储的东西又有所不同。

这个表展示了inode和block,对于文件和目录的区别:

 

文件

目录

inode

文件元数据:权限、所有者、大小、时间等信息;对应block编号

目录元数据:权限、所有者、大小、时间等信息;对应block编号

block

文件内容数据

文件和文件对应inode列表

文件系统结构图说明

下图(图来源于网络,自己加了一些注释)展现了linux文件系统和磁盘目录的关系。注意看虚线位置,虚线就划分出了这个块包括的数据范围。下边是一些说明:

下边这些块都属于分区1.

从左边开始是自举块、超级块。不多说。

之后是节点区域,也就是inode。包括范围是虚线指出的 i节点0  到  i节点2345.

其中我标了一个inode1和inode2,inode1指向一个block是block1,写明了是一个目录的block。inode2指向的block是block2,是一个目录block。

这俩的意思就是说inode1和inode2对应的都是目录,他们对应的block里放的也都是文件列表。

看右下角那个文件列表,就是block2这个目录块里存储的内容。这个目录下存放的文件名和文件对于的inode。其中有一个文件,即inode为1的那个,也是一个目录,对于inode是inode1,对应block是block1.

block3是一个数据块,对应的inode是  i节点2345。文件名是Test.c。(看图中箭头指向)

总的来说就是,假设inode2对应的是目录dir2,inode1对应dir1,dir1就是dir2的子目录。所以dir2对应的block里的内容,会存放着dir1的名字和inode节点。同时,Test.c文件是目录dir2中的一个文件,所以Test.c文件名和inode也在dir2对应block内容里。

linux的文件系统结构、superblock和inode节点等介绍

文件读取实例说明

上边说的这些可能还是不太好理解,咱们就举个例子:我要读取文件Test.c。已知这个文件的路径是 /dir2/Test.c。在文件系统中的读取过程如下:

1、读取根目录  /  :

查找根目录的 inode,判断权限。如果有(后边都假设有权限,inode都会判断),读取根目录inode对应的block,在block里的文件列表中查找是否有 目录名 dir2,如果有,根据dir2对应的inode编号去读取dir2的inode。

2、读取dir2:

到达dir2的inode里,权限判断。接着读取对应的block。在block里的文件列表中查找Test.c,找到了就根据对应的inode编号去读取Test.c的inode。

3、读取Test.c:

达到Test.c的inode,判断权限。读取对应的block,读取到Test.c的文件内容,返回。

4、读取完毕。

关于inode的一些点:

1、inode是有数量限制的,每个分区inode数量有限,同一分区inode编号不能重复。每个文件都有一个inode,一旦inode使用完毕,就不能再建立新文件,即使还有物理磁盘空间。

2、df -i 可以查看节点使用情况。

3、从inode方面看cp命令的实质:cp操作执行时,先在物理磁盘开辟一块空间(block),将文件复制一份放进去,在inode表中创建一个新编号(文件inode生成),在目录中生成新名字(目录对应的inode和block)。