【Linux】深入理解文件系统(超详细)
目录
一.磁盘
1-1 磁盘、服务器、机柜、机房
📌补充:
📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明:
📌如果有一块磁盘要进行销毁该怎么办?
1-2 磁盘存储结构
编辑
📌在磁盘角度,如何定位一个扇区?
📌指令:fdisk是 Linux 系统中用于磁盘分区的一个非常重要的命令行工具
📌磁盘各个结构介绍:
📌 CHS寻址
1-3.磁盘的逻辑结构
📌磁道:
📌柱⾯:
📌整盘:
📌整个磁盘不就是多张⼆维的扇区数组表(三维数组?)
📌有了抽象成数组这个概念,这样定位一个扇区还用什么CHS呢!我们瞬间就得到一个数组,这样每一个扇区就有了一个线性地址 (其实就是数组下标),这种地址叫做LBA。一个磁盘不是有很多面吗?
1-4.CHS && LBA地址
二.引入文件系统
2-1.引入\"块\"概念
📌磁盘是以块为单位的一维数组:
📌补充知识:
2-2 引⼊\"分区\"概念
📌问题:一个磁盘如果有500G大小,OS将如何进行管理呢?知道总大小500G,就知道有多少个块,那么整个磁盘该怎么管理呢?
📌有了这种分区概念,我们就可以以分区的形式进行管理,只要把一个分区管理好了,就可以把一个分区的管理方式拷贝给其他分区,就可以把其他分区也管理好,也可以给分区设置不同的文件系统,因为分区之间就相互独立了,这样一个分区挂掉了,不会影响其他分区,保证整个磁盘的可用性,所以就分区了!!!
📌分区分好,此时还要把这个分区分成一个个组,从此往后,我们只需要管理好一个组,假设一个组10G,从今天开始,我们只需要把一个组管理好,对于这一个分区来说,我们就把这一个组的管理方式拷贝给其他组,就可以把每个组管理好,每个组管理好,分区不就管理好了,分区管理好了,不就把整个磁盘管理好了!!!
三.理解文件系统
3-1.Boot Block(启动块)
3-2.inode
3-2-1.Inode Table(inode表)
📌查看文件信息:
📌如果有10000个文件,这个inode Table需要占用多少个块呢?
3-3.Data Blocks(数据块)
📌如何找文件呢?
📌后面会讲文件块不够怎么办,要存大文件怎么办,根据inode怎么在这个inode表里找!!!
📌补充:
3-4.Bitmap(位图)
3-4-1.Inode Bitmap
📌在这个块组里面一共有多少个inode,我怎么知道这个inode Table 里面有多少个inode被分配了,有多少个inode 没有被分配,如果要新建一个inode,重新在这个inode Table 里申请一块inode空间,该怎么申请,你怎么知道inode Table 里面有哪些被占用哪些没被占用?
📌但是磁盘最小访问单位是扇区,磁盘与OS交互是以4kb大小进行访问,怎么做到给inode BItmap置1呢?
3-4-2.BlockBitmap
📌有了上面的认识,所以今天我们要新建一个文件,并像这个文件写 \"Hello Word\" 字符串,目前应该怎么做?
📌那么删除一个文件怎么办呢?
📌所以删除一个文件可以恢复吗?
📌文件误删最好怎么办?
📌如果文件被删除了,inode编号怎么知道呢?
3-5.Group Descriptor Table(块组描述符)
📌一个分组一共是多大呀?这个分区里面一共有多少个inode,一共有多少个blocks,数据块的使用率是多少,一万个inode有多少被用了,block有多少个被用了?这个block只剩一个G,我要放两个G内容怎么办,要放在其他块组里面,怎么评判放不放的下呢?
3-6.Super Block(超级块)
📌超级块表示整个分区的整体情况,他是表示分区的情况,为什么会在分区的其中一个组里面呢?那是不是所有分区都会包含这一个超级块呢?
📌但是理论上,这个分区超级块是一个文件系统,在分区的最开始就应该是超级块,然后剩下的区域再进行分组,这样不是更优雅吗更清楚吗,但Linux并没有这样干,而是放在若干个组里面为什么要这样干呢?
四.准确理解文件系统
4-1.关于Data Blocks,Inode Table
4-2-1.关于inode
4-2-2.关于block
4-2-3.我们有这些知识铺垫重新看待Block Bitmap 、Inode Bitmap 、Inode Table 、Data Blocks:
📌1.我们是如何分配一个inode的?
📌1.我们是如何分配一个block的呢?
📌3.有了上面正向的认识,我们再来反向进行理解下,如果inode:10004、block:100006,怎么找到在哪个组?怎么找到inode属性?怎么找到文件内容?
📌题外话:
4-2-4.知道inode号,有一下四个问题:
📌1.如何查找一个文件?
📌2.如何删除一个文件
📌3.如何修改一个文件?
📌4.如何新增一个文件?
📌子问题1:inode和block究竟是怎么进行映射的?
📌子问题2:凭什么拿到inode?我们访问的好像都是文件名啊?我们操作的都是文件名呀?
衍生一个问题:📌如何理解目录文件?
📌所以有上面知识现在能不能理解,我们每一个进程他都要有cwd?
4-2-5.dentry 缓存:
📌如果此时在当前路径下有touch test2.txt,刚才访问完test.txt文件,现在又要访问test2.txt,该怎么办?
📌现在问一个问题,Linux用不用保存路径,用不用把路径整体信息保存起来?
📌所以我的问题是:Linux要对对应的路径进行缓存,应该以什么样的数据结构来缓存我们刚刚说的路径呢?-------多叉树!!!!
4-2-6.做一个小实验
1.#制作⼀个⼤的磁盘块,就当做⼀个分区
2.# 格式化写⼊⽂件系统
3.# 建⽴空⽬录
编辑4.# 将分区挂载到指定的⽬录
5.#使用分区
6.# 卸载分区
📌总结:
📌所以路径从哪来?
📌所以回答最开始问题,你怎么确认你在哪个分区里面?访问任何一个文件,都要有路径,路径的前缀不就可以指名在哪一个分区下面。我的前缀是 /目录 就找到是/dev/vda2分区下。编辑
📌那最开始不是要路径解析吗,他不是要根据从根目录下解析吗?
📌前面内容都是围绕被打开的文件进行讲解,接下来将围绕没有被打开的文件进行讲解!!!
没有被打开的文件是放在磁盘这个硬件设备上的,打开一个文件前提是找到这个文件,找到文件要有路径,不仅仅一个文件要有路径,要保证Linux下所有文件都要有路径,为了更好的进行磁盘级文件管理,必须要有一个磁盘文件系统的东西,之前讲的内核级文件系统,二者其实是一回事,就是一个硬币有两面,站在内存和磁盘看其实就是一套东西,文件系统要做的就是各种相关的文件管理。
一.磁盘
任何人根据将Linux文件系统的人,如果不给你讲磁盘,文件系统讲的再好也只是空中楼阁,因为你的大脑思考中,无法建立在无法想象的结构之中。
先看看磁盘的结构:
1-1 磁盘、服务器、机柜、机房
- 机械磁盘是计算机中唯⼀的⼀个机械设备
- 磁盘--- 外设
- 慢
- 容量⼤,价格便宜
📌补充:
关于磁盘 --- 磁铁
磁盘也只认二进制,磁盘上的二进制怎么理解呢?
因为磁盘光滑的面,我们可以把磁盘想象成上百亿的小磁铁构成,规定南北极,比如北极为1,南极为0,所有我们磁盘立马可以进行0 1保存。
📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明:
网络数据传输
- 在网络通信中,尤其是在有线网络中,数据通常以电信号的形式进行传输。常见的以太网标准中,就是利用电压的高低电平来表示二进制的 0 和 1。例如,在双绞线中,规定高电平代表一种逻辑状态(如 1),低电平代表另一种逻辑状态(如 0)。通过在传输线路上快速地切换高低电平,就可以实现数据的编码和传输。
磁盘数据存储
- 磁盘存储数据的原理是基于磁性材料的磁化特性。当磁头对盘片上的磁性材料进行写入操作时,通过控制磁头线圈中的电流方向,产生不同方向的磁场,使盘片上的磁性材料按照特定的方向被磁化。通常规定一种磁化方向代表 1,另一种磁化方向代表 0。读取数据时,磁头检测盘片上磁性材料的磁化方向,将其转换为相应的电信号,从而还原出存储的数据。
📌计算机只认二进制,这是一种宏观的说法,在不同的设备上,是由不同物理特性表现的,不同硬件,对二进制表达是不一样的!!!
📌如果有一块磁盘要进行销毁该怎么办?
不能直接进行破坏,因为可以恢复,让磁盘退磁,就可以,高温消磁!!!
1-2 磁盘存储结构
📌磁盘作为计算机中唯一的机械部件,通常由一个或多个旋转的盘片组成,每个盘片有两个面,每个面上有一层磁性材料。通过主轴连接,磁盘上附有磁头。数据存储的基本单位是扇区(Sector),传统上每个扇区大小为512字节,但近年来逐渐过渡到4096字节的大扇区,接下来讲解我们以512大小来说明。磁盘中转数可以达到每秒钟两万转。
物理结构:
- 磁头是一面一个,左右摆动,两个整体移动的,有磁头停靠点
- 磁头和盘面不接触,所以物理上不适用于笔记本,开机状态移来移去,磁头刮花了磁盘,属于硬件问题
- 机械磁盘要在无尘环境下,灰尘落上去就像一座大山,可能会把数据都磨没了
磁头摆动的目的本质:定位磁道(柱面)
磁盘盘面旋转的本质:定位扇区
📌要想访问到数据,只要找到其中整个磁盘特定的盘面,然后找到特定的磁道通过盘片旋转定位到特定的扇区就可以访问数据!!!如果想往磁盘上特定的位置写入,本质就是把数据写到一个或多个扇区里面,哪怕只修改一个扇区中一个bit位,也要把对应的整个扇区读到内存里,把对应bit位重新设置好,再把512字节大小写回特定的扇区中,这时,我称之为在读写时是以512字节大小为单位。
📌在磁盘角度,如何定位一个扇区?
- 可以先定位磁头(header)(定位磁道和柱面的过程)
- 确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
- 盘片转动:定位扇区的过程(sector)
- 三个参数:Cylinder(柱面)Header(磁头)Sector(扇区)==》CHS 寻址方式
文件=内容+属性,都是数据,在磁盘上无非就是占据哪几个扇区的问题,可以定位一个扇区,能不能定位多个扇区?
传动臂上的磁头是共进退的,不能同时定位多个扇区。
云服务器上,磁盘信息在: /dev/vea 上:
📌指令:fdisk是 Linux 系统中用于磁盘分区的一个非常重要的命令行工具
常用选项
- -l:列出所有磁盘的分区信息。例如,在终端中输入
fdisk -l
,会显示系统中所有磁盘的分区情况,包括磁盘设备名称、分区编号、分区大小等。- -u:以扇区为单位显示分区大小等信息,与
-l
选项一起使用时,能更直观地了解分区在磁盘上的物理分布。- 设备名:指定要操作的磁盘设备,如
fdisk /dev/sda
表示对/dev/sda
磁盘进行分区操作。
📌磁盘各个结构介绍:
• 扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。
• 磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头
• 磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁 头,不存储数据
• 柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数 • 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
• 圆盘(platter)数:就是盘⽚的数量
• 磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数
• 细节:传动臂上的磁头是共进退的(这点⽐较重要,后⾯会说明)
柱⾯(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)⽅ 式之⼀,CHS寻址⽅式。
📌 CHS寻址
对早期的磁盘⾮常有效,知道⽤哪个磁头,读取哪个柱⾯上的第⼏扇区就可以读到数据了。 但是CHS模式⽀持的硬盘容量有限,因为系统⽤8bit来存储磁头地址,⽤10bit来存储柱⾯地 址,⽤6bit来存储扇区地址,⽽⼀个扇区共有512Byte,这样使⽤CHS寻址⼀块硬盘最⼤容量 为256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B来算就是 8.4GB) 。
1-3.磁盘的逻辑结构
📌我们可以把磁盘抽象成线性结构,就像磁带一样,磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性结构。
那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻 辑存储结构我们也可以类似于:
这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA!!!
柱⾯是⼀个逻辑上的概念,其实就是每⼀⾯上,相同半径的磁道逻辑上构成柱⾯。 所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。
所以,磁盘的真实情况是:
📌磁道:
某⼀盘⾯的某⼀个磁道展开:
即:⼀维数组
📌柱⾯:
整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:
• 柱⾯上的每个磁道,扇区个数是⼀样的
• 这不就是⼆维数组吗
📌整盘:
📌整个磁盘不就是多张⼆维的扇区数组表(三维数组?)
所以,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置, Head),在确定扇区(Sector),所以就有了CHS。
📌我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组:
📌有了抽象成数组这个概念,这样定位一个扇区还用什么CHS呢!我们瞬间就得到一个数组,这样每一个扇区就有了一个线性地址 (其实就是数组下标),这种地址叫做LBA。一个磁盘不是有很多面吗?
一块磁盘中,磁盘盘面都一样,数组元素个数都一样!!
如果有6个面,无非就是6个数组 X 6,这样就有了非常大的数组。
细节:扇区下标是从1开始,因为扇区有规定,第一个扇区必须从1号开始!!!磁头和柱面可以从0开始!!!
有了这种逻辑抽象,所以从OS角度看待我们磁盘的时候,根本就不使用CHS,而直接使用LBA这样的概念,但是真正访问一个扇区的时候,必须得CHS,逻辑上简化可以看待为LBA,但是磁盘内部必须使用CHS!!!
📌来谈一谈,磁盘进行抽取LBA的一个真实过程:
柱面再多在我眼里也就是一张二维数组,对OS来讲,只需要LBA,这意味着,OS只要访问磁盘,只需要知道磁盘的总容量和磁盘的单个扇区的大小,OS就能计算出一共有多少个扇区,一瞬间扇区所有地址OS都能知道了,所有对于OS来讲,只需要在启动读取时,读取总容量和扇区大小,多少个扇区就知道了,一旦知道有多少个扇区,那么就知道所有扇区的LBA地址了!!!所以OS里可以实现搞一张位图,如果有一亿个扇区,这个位图就有一亿个bit位,为0表示该对应扇区没有被使用,为1表示该对应扇区被使用,这样不就可以对磁盘进行管理了吗!!!
1-4.CHS && LBA地址
OS只需要使⽤LBA就可以了!!LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊??磁盘 ⾃⼰来做!固件(硬件电路,伺服系统)
CHS转成LBA:
- 磁头数*每磁道扇区数 = 单个柱⾯的扇区总数
- LBA = 柱⾯号C*单个柱⾯的扇区总数 + 磁头号H*每磁道扇区数 + 扇区号S - 1
- 即:LBA = 柱⾯号C*(磁头数*每磁道扇区数) + 磁头号H*每磁道扇区数 + 扇区号S - 1
- 扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的
- 柱⾯和磁道都是从0开始编号的
- 总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参 数。
LBA转成CHS:
- 柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】
- 磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数
- 扇区号S = (LBA % 每磁道扇区数) + 1
- \"//\": 表⽰除取整
📌所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰ 转换。所以: 从现在开始,磁盘就是⼀个 元素为扇区 的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤ 磁盘,就可以⽤⼀个数字访问磁盘扇区了。
二.引入文件系统
2-1.引入\"块\"概念
📌OS和磁盘进行交互的时候,是以扇区为基本单位,512字节,如果只以单个扇区来进行IO交互,数据量有些少,如果要扯到文件系统的话,OS规定,我们对应的OS,在文件系统层面上和我们的整个磁盘做IO交互时,一般是以 1kb 2kb3kb 4kb 8kb等这些数据块为单位进行IO,在Linux中大多是以4kb大小的数据块进行访问,一个数据块是8个扇区大小构成的!!!所以在OS内部,文件系统层面上,不管什么扇区,在OS看来都是4kb大小,在我们看来IO基本单位都是8个扇区大小,在文件系统层面上,把8个扇区称之为一个一个的数据块!!!
📌磁盘是以块为单位的一维数组:
所以此时我们对应的块就有了块号的概念,知道其中一个块,能不能算出来这个块有多少个扇区呀?块号转换为8个LBA地址?
知道块号,根据,块号*8+[1,8],就可以算出具体的数组下标(线性地址)(LBA地址)。
就比如我想用块号1,直接翻译成8个扇区,8个扇区经过转化把8个LBA地址交给磁盘内部,转换成8个CHA地址,此时我们不就可以把8个扇区都访问了吗!!!
我们就把磁盘抽象成以块为单位的一维数组,所以磁盘就有了块的概念,磁盘有多少块呢?
我们自己只要知道磁盘大小,我们就知道有多少块了,一个块知道了,根据块号*8+[1,8]
最终每一个块的LBA地址都知道了,每一个扇区的LBA地址都知道了!!!
📌补充知识:
其实内存也是被划分成4kb大小,文件本身也被划分成4kb大小,4kb构成的块,所以Linux下所有的文件,文本,二进制的图片,都是4kb大小,所有的数据跟集装箱一样,以标准的方式载入内存,内存以4kb为单位,所以我们内存管理时候,也会以4kb的方式进行管理,包括我们之前说的写实拷贝,也是以4kb大小进行写实拷贝!!!
2-2 引⼊\"分区\"概念
📌问题:一个磁盘如果有500G大小,OS将如何进行管理呢?知道总大小500G,就知道有多少个块,那么整个磁盘该怎么管理呢?
如果是统一进行管理,今天是500G,那要是5000G,16TB呢,这么大的空间,你想管,那成本就太大了,对文件系统来讲,管理的难度就越大,就比如:一个国家不可能一个人进行管理,所以分成省和市,省长管理下面的市长,通过把省长管理起来,下面的市长也会自动被管理起来。
所以我们磁盘那么大,首先我们要做的,并不是直接对磁盘做管理,而是把磁盘拆分成一个个区域,线性地址划分区域。
以500G为例子,划分五个区域,每一个区域100G,先把磁盘拆分成若干个区域,这个动作我们叫做分区,以Windows观点来看,你可能会有⼀块磁盘并且将 它分区成C,D,E盘。那个C,D,E就是分区。
📌有了这种分区概念,我们就可以以分区的形式进行管理,只要把一个分区管理好了,就可以把一个分区的管理方式拷贝给其他分区,就可以把其他分区也管理好,也可以给分区设置不同的文件系统,因为分区之间就相互独立了,这样一个分区挂掉了,不会影响其他分区,保证整个磁盘的可用性,所以就分区了!!!
📌分区分好,此时还要把这个分区分成一个个组,从此往后,我们只需要管理好一个组,假设一个组10G,从今天开始,我们只需要把一个组管理好,对于这一个分区来说,我们就把这一个组的管理方式拷贝给其他组,就可以把每个组管理好,每个组管理好,分区不就管理好了,分区管理好了,不就把整个磁盘管理好了!!!
这种思想叫什么思想?-------这种思想我们称之为分治!!!
所以我们学习文件系统,我们核心思想就切换成如何把一个组管理好!!!
三.理解文件系统
3-1.Boot Block(启动块)
我们分组当中有一个区域叫做Boot Block,是一个单独的组,跟启动有关,一般就是磁盘当中的0号柱面,0号磁头的一号扇区,他里面会写我们开机当中需要使用的信息。
📌Boot Block(启动块)是计算机存储设备(如硬盘、固态硬盘)中用于启动操作系统的关键部分,以下是其详细介绍:
基本概念
- Boot Block 是存储设备开头的一个特殊区域,通常包含了引导加载程序(Boot Loader)等关键信息,是计算机启动过程中的重要环节。不同的操作系统和存储设备可能会有不同的 Boot Block 结构和大小,但一般都在几百字节到几千字节之间。
主要作用
- 引导系统启动:其核心作用是启动计算机的操作系统。当计算机通电后,硬件会首先读取 Boot Block 中的引导加载程序,引导加载程序负责初始化硬件、检测系统环境,并将操作系统的核心程序从存储设备加载到内存中,然后将控制权交给操作系统,从而启动整个系统。
- 硬件初始化:在引导过程中,Boot Block 中的代码会对一些基本的硬件设备进行初始化,如设置 CPU 的工作模式、初始化内存控制器、检测硬盘等存储设备,确保硬件处于可正常工作的状态,为后续操作系统的加载和运行做好准备。
- 系统引导管理:Boot Block 还可以提供系统引导管理功能,例如在多操作系统环境下,引导加载程序可以显示操作系统选择菜单,让用户选择要启动的操作系统。它还能记录系统的引导参数和配置信息,根据这些信息来正确地引导操作系统。
与其他组件的关系
- 与 BIOS/UEFI 的关系:BIOS(基本输入输出系统)或 UEFI(统一可扩展固件接口)是计算机硬件与软件之间的桥梁,它们在计算机启动时首先运行,负责初始化硬件和查找可启动设备。找到可启动设备后,BIOS 或 UEFI 会将控制权交给该设备的 Boot Block,由 Boot Block 进一步完成操作系统的引导过程。
- 与操作系统内核的关系:Boot Block 的最终目的是将操作系统内核加载到内存并启动它。引导加载程序在 Boot Block 中执行一系列初始化操作后,会根据预设的规则和配置信息,找到操作系统内核在存储设备中的位置,将其加载到内存中,并将控制权传递给内核,使内核能够开始运行并初始化整个操作系统。
- 与文件系统的关系:虽然 Boot Block 本身不直接属于文件系统,但它与文件系统密切相关。引导加载程序需要从文件系统中读取操作系统内核和相关的启动配置文件等。在一些情况下,Boot Block 可能还会包含文件系统的驱动程序或相关信息,以便能够正确地访问存储设备上的文件系统,获取启动所需的文件。
存储与保护
- 存储位置:Boot Block 通常位于存储设备的第一个扇区,也称为 MBR(Master Boot Record)扇区。对于使用 GPT(GUID Partition Table)分区方案的存储设备,除了 MBR 扇区外,还有一个 GPT 头和 GPT 分区表,其中 GPT 头中也包含了一些引导相关的信息。
- 保护机制:由于 Boot Block 的重要性,计算机系统通常会采取多种保护措施来防止其被破坏。例如,硬件层面可能会提供写保护功能,防止恶意软件或误操作对 Boot Block 进行修改。操作系统也会提供一些工具和机制,如磁盘保护软件、系统修复工具等,用于检测和修复 Boot Block 可能出现的问题。
📌总结
Boot Block是磁盘上非常重要的一个区域,它包含了启动系统所需的关键信息。无论是传统的MBR还是现代的GPT,Boot Block都扮演着启动过程中的关键角色。
3-2.inode
📌补充知识:
- 文件 = 内容 + 属性
- 属性也是数据,在Linux中会以一个结构体的方式构建出来----inode
- 一个文件一个inode,inode->文件属性数据的集合
一个inode大小一般是128字节,有的是256字节,跟系统有关,今天我们以128字节来讲!!!一个数据块4kb,一个数据块里面可以存4kb/128字节 = 32个inode
📌在我们这个一个组中,可能存在100个文件或者1000个文件,就会存在100个inode或者1000个inode,文件系统就会把当前要新建的文件属性节点在内存中定义出来,把属性值一填,然后把inode节点写到磁盘中指定的inode Table中,刚才说过磁盘与OS进行IO交互时基本单位是4kb大小的,一个块有多少个inode呢?32个!!!在我们对应的分组中,每一个文件他的属性要保存到inode Table中,可是这个分区里有非常多的inode,所以有一个inode都要有自己的编号,
指令:ls -l -i 。选项可以看到一个文件的inode值,所以每一个文件都要有一个inode编号,彼此之间互不重复,inode编号就是inode节点编号,就像进程PCB保存自己的pid。
补充:Linux中,文件名不在inode中保存!!!
3-2-1.Inode Table(inode表)
inode Table就是保存这个组里所有的inode属性集。
📌Inode Table(inode 表)是 Linux 文件系统中的核心数据结构之一,用于存储文件和目录的元数据信息,以下是关于它的详细介绍:
基本概念
- Inode 表由一系列的 inode 组成,每个 inode 都是一个数据结构,包含了文件或目录的各种属性和信息,如文件的权限、所有者、大小、创建时间、修改时间、指向文件数据块的指针等。
- 操作系统为文件系统中的每个文件和目录都分配了一个唯一的 inode 编号,通过这个编号可以在 inode 表中快速定位到对应的 inode,从而获取文件或目录的相关信息。
主要作用
- 文件定位与管理:文件系统通过 inode 表来管理文件的存储和访问。当用户或程序请求访问一个文件时,文件系统首先根据文件名在目录项中找到对应的 inode 编号,然后通过该编号在 inode 表中查找相应的 inode,进而获取文件的属性和数据块指针,以确定文件数据的存储位置,实现对文件的准确读写操作。
- 权限控制:inode 中包含了文件的权限信息,如文件所有者的读、写、执行权限,所属组的权限以及其他用户的权限等。操作系统在用户访问文件时,会根据 inode 中的权限信息进行权限检查,以决定是否允许用户对文件进行相应的操作,从而保证文件系统的安全性和数据的完整性。
- 文件属性记录:记录文件的各种属性,如文件的大小、创建时间、修改时间、访问时间等。这些信息对于用户了解文件的状态和历史以及系统进行文件管理和优化都非常重要。
与其他组件的关系
- 与文件数据块:inode 表中的 inode 包含指向文件数据块的指针,通过这些指针,文件系统可以找到存储文件实际数据的数据块,从而实现文件数据的读写。
- 与目录结构:目录在文件系统中也是一种特殊的文件,其 inode 包含了目录的属性信息以及指向目录下文件和子目录的 inode 编号等信息。目录项中存储了文件名和对应的 inode 编号,通过这种方式将文件名与 inode 表中的 inode 关联起来,形成了文件系统的目录结构。
性能影响
- 查找效率:inode 表的组织和查找算法直接影响文件系统的查找效率。一般来说,采用高效的数据结构和查找算法(如哈希表、B 树等)可以快速定位到目标 inode,提高文件访问的速度。
- 空间占用:inode 表需要占用一定的磁盘空间来存储 inode 信息。如果 inode 表过大,会浪费磁盘空间;如果过小,可能无法满足文件系统中大量文件和目录的管理需求,导致 inode 不足,影响文件的创建和管理。
📌查看文件信息:
stat指令是在类 Unix 系统(如 Linux、Mac OS 等)中用于查看文件或文件系统状态信息的命令,以下是其详细介绍:
指令:stat [选项] 文件或目录
常用选项
-c
:指定输出格式,可自定义显示的信息字段。-f
:显示文件系统的信息,而不是文件的信息。-t
:以简洁的表格形式显示信息。