Linux学习第十三篇--如何理解inode节点和文件系统

来源:互联网 发布:oracle 数据库备份 编辑:程序博客网 时间:2024/05/20 18:18

前言

其实在补充A篇已经提及到了inode节点的知识,但是因为那篇文章目的是作为第六篇的补充,
所以没有太过清晰的描述inode节点和文件系统的关系,这篇博客的目的就是详细的阐述一下两者.

硬盘

既然要详细的了解inode节点,我们有必要深入的探索一下文件系统的概念,在前面的博客中已经说过了硬盘的物理构造和硬盘的逻辑构造.
这里再复述一下:

硬盘的物理构成和逻辑构成

在物理层面上,硬盘主要由磁盘片(组),机械手臂,读取头和主轴马达构成.

其中,磁盘片(组)用于存储数据,读取头用于读写数据,主轴马达负责转动磁盘片(组),机械手臂负责移动读取头.

在逻辑层面上,硬盘主要由扇区构成.

在补充篇中我们提及过,扇区是硬盘存储的最小单位,大小为512bytes,将多个扇区组合成一个闭合圆构成一个磁柱,磁柱是硬盘分割的最小单位.
其中,在硬盘中,第一个扇区最为特殊,它分为两个部分,
一部分大小为446bytes,这一部分作为主要开机区(MBR),存放系统开机的核心程序.
另一部分大小只有64bytes,用于存放分区表数据,每条分区数据为8bytes,所以最多只能有4个分区(主+扩展),当然还有逻辑分区,我们可以将一个扩展分区分割成多个逻辑分区.


ok,上面就是我们之前提及到的硬盘的知识,这里再复习一下.

格式化

我们都知道一块硬盘必须要分区才能使用,而在分区后,我们还需要对分区进行格式化,硬盘都必须经过格式化才能使用.
格式化的作用就是将一个空白的分区,分割成一个个小的区域,并对这些区域进行编号,没有这个过程,计算机就不知道从何处读写.
在传统的磁盘和文件系统中,一个分区往往只能被格式化成一个文件系统,但是由于新技术的利用,我们可以将同一分区格式化为多个文件系统(LVM--Logical Volume Manage),也可以将多个分区合成一个文件系统,比如在系统架构中常提到的RAID(磁盘阵列).
我们也知道,每一个操作系统支持的文件系统也并不相同,比如windows支持的NTFS和linuxEXT4就是两种不同的文件系统.
我们接下来提及的文件系统就指EXT2/3/4,

文件系统

那么文件系统具体是如何运作的呢?在inode节点一文中,我们简单提及了关于这部分概念,此处再完善一些.
在之前的学习中,我们了解到linux存储的文件不仅仅只是文件的内容,还要存储文件的权限和文件属性等.
文件系统通常会将文件的权限及属性和实际存储的内容分开存储.
将权限和文件属性存放在inode节点中,而实际的数据则存放在数据块(data bolck)中.
而除此之外,还会有一个superblock用来记录文件系统的整体信息,包含inode节点的数量,block的数量等.

因此,文件系统会在初始化的时候,就规划好inode节点和block.而一旦初始化完毕后,除非再次格式化(还可以使用命令变更文件系统大小),否则inode和block就不会再变动.
但是当我们的文件系统非常庞大的时候,将inode节点和block一块管理,是很麻烦的,所以linux的EXT2系统在格式化的时候,会将整个分区再次分割成多个
block group(区块组),每个block group都拥有自己的inode/block/superblock系统.这样就可以减轻管理负担.

此处有一点需要注意,在文件系统最前面还有一个启动扇区,用于安装开机管理程序.


接下来,我们就针对BlockGroup中的数据进行学习.首先我们需要了解一下数据块的概念.

数据块

从名称上来看,很容易理解,数据块==存储数据的块.在我们使用的ext2(现在使用到一般是ext4)系统中,支持的数据块大小有1k,2k,4k.
需要注意的是,在格式化的时候,数据块的大小就已经固定了,同时每个数据块都有编号,用于inode记录.
而数据块大小的不同差别也会很大,比如1k的数据块支持的最大单一文件大小只有16gb,文件系统的总量最多只能为2t.而2k的数据块分别为256gb和8t,4kb分别为2tb和16tb.
在linux中,原则上数据块的大小和数量在格式化后就不能再改变了,同时每个数据块只能放置一个文件的数据,当文件很大时可以占用多个数据块,但是当文件的大小小于数据块的时候,数据块中剩余的空间不会再被使用.

inode节点

其实在之前我们已经学习过了inode节点,此处再深入一丢丢.

首先,在linux中,inode节点在初始化之后,其数量和大小也是固定的,每个inode节点大小均为128bytes,

同时每一个档案都会且仅会占用一个inode,因此文件系统能够建立文件的数量和inode的数量息息相关.

在linux中,系统读取文件的时候,会先找到inode节点,然后根据inode节点所记录的权限等属性判断用户是否符合要求,然后决定是否读取block中的数据.

inode节点负责记录文件的权限,属性,实际数据对应的block等属性,他记录的数据大致如下:

该文件的存取模式(read/write/execute)

该文件的拥有者和群组(owner/group)

该文件的大小

该文件建立/状态改变时间(ctime)

最近一次读取时间(atime)

最后修改时间(mtime)

定义文件的标志(SETUID等)

文件的真正指向

直接指向block区域

间接指向block区域

双间接指向blokc区域

三间接指向block区域

前面几个属性我们可以通过描述理解其作用,但是最后面四个属性又是干什么的呢?

看到上面inode节点包含的属性,我们可以发现inode节点需要记录的属性非常多,但是inode节点却只有128bytes的大小.而inode节点记录一个数据块需要使用4bytes.

也就是说,假设每个数据块大小为4k.那么一个inode节点最多只能记录4kb*(128/4)=128kb的数据,而且因为inode节点还需要记录其他属性,所以其值远远小于128.

那么,linux就不能存放大于128kb的数据了吗?当然不是.

为了能够记录更大的文件,inode节点将记录block的区域分为了12个直接区域,1个间接区域,一个双间接区域,一个三间接区域.

直接区域,每一个都可以指向一个存放文件内容的区域.

间接区域,该区域指向一个block,这个block不直接存放文件内容,而是指向其他的数据块,这个被间接指向的数据块才是真正存放数据内容的地方.

双间接区域,类似于间接区域,但是双间接区域,将第二次指向的数据块再次指向新的数据块,使用这个新的数据块来存放真正的数据,

三间接区域:顾名思义,该区域的数据经过三次数据块作为中转,才会到达真正的数据存放位置.

因此,如果每个数据块的大小为1k的话,那么一个inode节点理论上最大存储文件大小为:

直接区域:12*1k  间接区域 1*(1024/4) 一条block记录占用4bytes,前文已提过. 双间接区域:1*(1024/4)^2 三间接区域:1*(1024^3)

12+(1024/4)+(1024/4)^2+(1024/4)^3=16gb.这个值也和我们之前所说的我ext2文件系统单个文件最大大小一致.





superblock

superblock也就是超级块,是记录整个文件系统相关信息的地方,他记录的主要信息有.
magic签名
每个数据块的大小
每个inode节点的大小
数据块的总量
inode节点的总量
未使用的数据块数量
未使用的inode数量
文件系统最近挂载时间
文件系统最近写入时间
文件系统最近一次检索磁盘时间
blockGroup的总量
文件系统是否挂载(valid变量),0表示未挂载,1表示已挂载.
SuperBlock存储了文件系统的基本信息,如果SuperBlock死掉,那么文件系统也就挂掉了.
在之前说到BlockGroup的时候,提到过,每一个BlockGroup都会维护自己的inode节点和block以及superBlock区域.
实际上,并不是左右的BlockGroup都拥有superBlock,因为除了第一个BlockGroup的SuperBlock,其余的SuperBlock都是第一个的备份.

文件系统描述(FileSystem Description)

FileSystem Description描述了每个BlockGroup的起始块,以及SuperBlock,bitMap,inodeMap,dataBlock存放在那些数据块中.

区块对照表(BlockMap)

我们通过区块对招标,可以查看每个数据块的使用情况,比如当我们需要新建一个文件的时候,我们就需要根据区块对照表查找出未被使用的数据块.

Inode节点对照表(InodeMap)

类似于区块对照表,Inode节点对照表用于记录Inode节点的使用情况.




原创粉丝点击