Linux操作系统——Linux的磁盘管理系统、文件inode及软硬链接
目录
7)inode是怎么与其描述的文件的Data Blocks部分联系起来
前言
在上一篇文章中我们了解到了操作系统对打开的文件即加载到内存中的文件的一系列操作,但是整个计算机中还存在着许许多多的没有被打开的文件,这些文件又是存在在哪里呢?操作系统对这些文件都是怎么管理的呢?
一、磁盘
没有被打开的文件此时都静静地存放在我们的磁盘中,所以我们先来了解一下磁盘这个硬件结构。
如下图所示即为一个磁盘
1、物理结构
在磁盘工作的时候,它的盘片是高速转动的,与此同时它的磁头臂也是左右摆动的,以这样的方式进行读取和写入。
2、存储结构
下图是盘片,其可以看作是无数个同心圆,每一个同心圆被称为一个磁道,每个磁道又会被分为好多个扇区。
我们的数据就是以二进制的形式在这里存储着。且对于每一条磁道都有着自己的编号,最外层磁道的编号为0;每一条磁道上的每一块扇区也都有着自己的编号,每一块扇区的大小一般为512字节。
每条磁道的扇区数是相同的, 每块扇区的大小也是相同的, 这也就意味着每条磁道的可存储数据的大小其实也是相同的
,很明显越外层的磁道越长, 长磁道与短磁道可存储数据的大小也是相同的吗?是的
, 每条磁道存储数据的密度不相同。
为了精准定位到扇区,我们再引入磁柱的概念,我们看到磁盘的结构是由很多个盘片外加一些其他的组件组合而成,这些盘片从俯视的角度看都是重合的,但是它们之间都留有一定的空隙,如下
我们把这种的处于同一半径且由多个盘面组成的圆柱体称为磁柱。磁柱也有着自己的编号。
所以当我们知道了磁柱(Cylinder)、磁头(Head)、扇区(sector)这三个的编号的时候,我们就可以定位到整个磁盘中的任意一个扇区,即磁头确定哪一个盘面,磁柱确定在哪一个磁道,接下来扇区就能告诉我们具体的扇区位置。这样的方法被称为CHS方法,可以找到磁盘中每个单元的确切位置。
3、磁盘的逻辑结构
上面了解到了磁盘的物理结构及其存储的结构,接下来我们看看磁盘逻辑上的存储结构。
虽然它的物理上的存储结构是同心圆里面的扇区一样的存储结构,但是我们也可以想象将每一个同心圆,从某一处剪断之后拉长,这样就从一个同心圆变成了一个直线性的带子,就像老式录音机里的磁带一样。所以磁盘上的所有盘片的所有磁道都可以抽象成一个线性的数组然后整合起来。
想象一下,将磁盘的存储空间抽象成一个大的数组,数组中的每个单元都代表着一个扇区。
所有的扇区被整合成一个数组, 每个下标对应着一个扇区, 即可以根据数组的下标来定位到磁盘中的某个扇区, 这里的下标被成为LBA逻辑块地址。
通过LBA是可以计算出CHS的。
- 扇区 = (LBA % 扇区数) + 1
- 磁头 = (LBA / 扇区数) % 磁头数
- 柱面 = LBA / (扇区数 * 磁头数)
在传统的硬盘中,磁头数通常是固定的,它等于磁盘的盘片数量减一(因为最上面的盘片通常没有上侧磁头)
二、文件系统
1、基本概念
我们已经将磁盘的物理存储方式抽象成为了一个逻辑方式的存储,数组中的每一个单元都代表了磁盘中的每一个扇区。在讲文件系统之前我们还需要知道一些概念。
- 一般来说操作系统与磁盘进行I/O操作的基本单位是4KB,但是数组中一个单位才占512字节,所以为了方便进行操作,操作系统又会将数组的每八个小单元合成一个大的单元以方便I/O操作。(8*512B=4KB)
- 操作系统的每次I/O操作的基本单位不设为512B是因为它太小了,一个扇区一个扇区进行I/O操作过于繁琐,浪费资源。
-
不让软件设计和硬件具有强相关性, 在此, 就是不让操作系统和磁盘之间在IO方面具有强相关性。因为, 如果操作系统与磁盘的IO单位是按照当前磁盘设计的话, 那么针对不同型号、扇区大小不同的磁盘时, 操作系统就需要做出相应的修改, 这个过程是复杂且繁琐的. 而如果将操作系统与硬件的IO基本单位设置成一个固定的值, 就不需要根据硬件去作出修改. 这也就是软件设计中常说的, 解耦合。
但是即使我们将磁盘的存储抽象成为了数组,但是整个数组也是很大的,管理整个的数组所消耗的资源当然也是非常大的。所以操作系统会针对整个磁盘进行分区,分区之后针对每一个区再进行分组,之后再对这些组进行管理就容易多了。
如上图所示,操作系统对磁盘进行分区分组。在分区的时候,专门在前边设置了Boot Block这么一个区域。且对于分好的每一个组,里面有关于组的属性和信息模块都是一样的。其中Data blocks表示的是该组内文件的内容信息。
2、组的概念
我们之前提到过文件=文件内容+属性,那么文件的内容和属性是放在一起,一起由操作系统进行管理的吗?
并不是,文件的内容和属性是分开存储的,分开进行管理和操作的。
Linux中的文件系统, 会将分区在细分为组, 不同的组内存储一些相同结构的属性, 这些属性描述着组的内容:
1)Data Blaocks
- Data Blocks其实就是组内存储文件内容的一个区域,这个区域以 块 为单位,每个块的大小为4KB.
- 占一个组的大部分空间
- 说明文件在操作系统(文件系统)存储就是以4KB为单位的,即使文件内容没有到达4KB,此文件还是会占用4KB的块,且此块独属于此文件,其他文件不能使用。即当一个文件被创建并写入到磁盘时,即使它的实际内容不足4KB,它也会被分配一个完整的4KB块。这个块在此期间专属于该文件,即便有剩余空间也不会被其他文件共享使用。这种机制可以减少文件碎片化,并且让文件系统的实现更为简单高效。
- 在文件内容增长的过程中,文件也会以4KB为单位增大。
2)inode Table
在Linux操作系统中,存在着一个inode结构体,此结构体存储的是磁盘文件的各种属性。
我们在平常使用 命令查看目录下多文件的信息或者使用 命令查看一个文件的具体信息时,如下图
可以看到里面好多的文件相关的信息 ,这些属性信息其实都储存在Linux系统中的inode结构体中
在这个结构体中有一个属性我们先得注意一下就是 属性, 是一个整型值,用来表示某一个文件在操作系统中得唯一编号。
可以通过 命令查看如上上张图片,也可以使用 命令查看,红色方框内即为每个文件的inode值
知道了 那么 又是什么呢?Table我们知道是表格的意思,所以说 其实就是用来存储文件的 结构体 的一个表格数组,表格数组中的每一个单元都存储着一个文件的inode结构体。
那么问题了,刚才说到了这个inode属性是用来表示某一个文件在操作系统中的唯一编号,但是我们平常不都是使用文件名吗?况且在同一目录下文件名是不允许重复的,我们都是将文件名作为唯一标识符的?
答:inode结构体储存着操作系统层面文件所有的属性,但是其中是没有存储文件名的,文件名虽然也是文件的属性,但是inode中并没有它,这意味着在操作系统底层,系统是没有文件名这个概念的,是不认识它的,只有inode编号 才是操作系统底层对文件的唯一标识符。
3)inode Bitmap
Bitmap在中文中翻译为位图,inode bitmap也就是inode的位图,是文件系统中用于管理和追踪磁盘上 inode使用情况的一种数据结构。在支持 inode 的文件系统中,每个文件和目录都与一个唯一的 inode 相关联,而这个 inode 包含了关于该文件或目录的元数据信息,比如权限、所有者、时间戳以及指向实际数据块的指针等。
在组里面,inode Table就是用来存储文件的 结构体 的一个表格数组,表格数组中的每一个单元都存储着一个文件的inode结构体。操作系统利用一个位图来描述inode Table的占用情况(例如0表示该为止未被占用,1表示已占用),这可以方便操作系统对此组进行管理。
4)Blocks Bitmap
与inode Bitmap一样,是用来描述Data Blocks的占用情况的。
5)Group Descriptor Table
Group Descriptor Table(GDT,组描述符表)是文件系统中用于管理和组织磁盘空间的重要数据结构。它包含了一系列的组描述符,每个描述符对应文件系统中的一个块组(block group)。每个块组通常由固定数量的连续块组成,并且这些块组包含了文件系统的元数据和用户数据。
每个组描述符记录了其对应的块组内的关键信息,包括但不限于块位图的位置、inode位图的位置、inode表的位置、块组内的空闲块数、快组内的空闲inode数、块组编号等。
其中有部分信息是可以通过组内的属性计算出来的, 但是总要消耗时间成本, 所以还是直接记录统计存储起来
6)Super Block
这部分被称为超级块,虽然是存储在当前组内的,但是其实它并不独属于当前组。
这块超级块记录的内容大致是整个分区的相关属性,如当前分区在磁盘中的实际区域、分区内的分组情况、分区所使用的文件系统格式等。
超级块本不独属于当前组,为什么还要存储在当前组内呢?
主要是为了进行备份的,Super Block是一个描述了分区最重要的属性的数据结构, 并且是需要实时维护的。当操作系统向某个分区的某个组内写入数据时, Super Block也是处于一个维护状态的. 那么如果此时 写入过程和维护过程意外中断了(比如台式机突然断电). 有没有可能此时正在维护的Super Block会发生损坏。如果一个分区只有一个Super Block,此时已经损坏,那么这个分区还能使用吗?如果这个分区又恰好是系统分区,那不是就坏事了。所以Super Block 需要在一个分区内备份许多份, 以防止单独存储出现损坏无法恢复的情况.
就像Windows中, 如果操作系统正在写入数据的时候突然关机断电, 那么在下次开启的时候很有可能会触发一个询问:
上次系统非正常关机, 怎么怎么样, 是否恢复启动?
如果分区中只有一个Super Block这样的结构, 那么是无法恢复的,并不是所有组内都会存储Super Block, 而是一部分。
7)inode是怎么与其描述的文件的Data Blocks部分联系起来
Inode(索引节点)与描述文件的 Data Blocks 部分之间的联系是通过 inode 内部存储的一组指针实现的。这些指针直接指向文件数据所在的物理块(Data Blocks)。每个 inode 包含了关于文件或目录的元数据信息,例如权限、所有者、时间戳等,同时也包含了用于定位文件内容的数据块地址的信息.
-
直接指针 (Direct Pointers):这是最简单的形式,inode 中包含了一定数量的直接指针,每个指针直接指向一个数据块。对于小文件,这可能就足够了。
2.一级间接指针 (Single Indirect Pointer):当文件大小超过了直接指针所能覆盖的范围时,会使用一级间接指针。这个指针指向一个包含多个数据块地址的特殊块(称为间接块),而这些数据块才是真正存储文件内容的地方。
3.二级间接指针 (Double Indirect Pointer):如果文件更大,以至于连一级间接指针也不够用了,则会用到二级间接指针。它指向另一个间接块,该间接块又指向多个一级间接块,最终指向实际的数据块。
4.三级间接指针 (Triple Indirect Pointer):对于非常大的文件,还会存在三级间接指针,它指向一个间接块,该间接块再指向多个二级间接块,依此类推,直到达到实际的数据块。
举个例子:
假设我们有一个文件系统,其中 inode 有 15 个指针:
- 前 12 个是指向直接数据块的直接指针。
- 第 13 个是一级间接指针,可以指向一个包含更多数据块地址的块。
- 第 14 个是二级间接指针,进一步扩展了可寻址的数据块数量。
- 第 15 个是三级间接指针,提供最大的灵活性以支持超大文件。
通过这种方式,inode 能够有效地管理和追踪文件内容所占用的数据块,无论这些块是连续还是分散分布在整个磁盘上。这种设计使得文件系统可以在保证性能的同时,灵活应对不同大小的文件。
三、文件的创建和删除
1、目录操作
- 需要进入一个目录的时候,我们需要的是X权限,即执行权限
- 在目录下创建文件时,我们需要的是W权限,即写入权限
- 而查看目录下的文件时,我们需要的是读取的权限
- 文件的W和R权限是对文件内容的读和写的权限,所以说目录文件的文件内容其实就是目录下的文件,更确切点说,目录文件的文件内容其实是目录文件下的 文件名和 inode 编号之间的映射
- 目录文件在 Data Blocks 中, 存储的内容是 其下文件的文件名与inode编号之间的映射关系
- 所以说在同一目录下,不能存在多个相同文件名的文件,同一目录下的文件名是唯一的,即同一目录下一个文件名只对应一个inode编号。
2、创建文件
学习了上面的文件系统,我们接下来看看一个文件的创建和删除时,操作系统都干了什么事。
- 创建文件的inode结构体, 并将inode和内容分别存储至组的inode Table 和 Data Blocks中, 并修改inode Bitmap 和 Block Bitmap 的相应内容。
- 找到当前用户所处的目录, 再根据当前目录的inode找到目录文件在 Data Blocks中的数据块。
- 将创建的文件的文件名和inode编号, 存储到目录文件在Data Blocks的数据块中, 并修改 相关的 Block Bitmap。
3、文件删除
一般情况下, 我们所认为的对删除文件的第一认知就是将文件的inode和内容 都在inode Table 和 Data Blocks中删除, 然后将 inode Bitmap 和 Block Bitmap 对应位置修改为0, 并将存储在目录文件的内容数据块中的映射关系删除. 做完这些, 就是删除文件。
但是操作系统删除文件, 并不会真的将文件 存储在Data Blocks的内容 和 inode Table的属性删除, 而是只将 inode Bitmap 和 Block Bitmap 这两个位图中有关删除文件的位置设置为0. 再将目录文件的 Block Bitmap 的相关位置设置为0. 就完成了文件的删除。
也就是说,操作系统在删除那些文件的时候,只是将位图置为0,看起来像是删除了文件,因为置为0的那一部分空间将来是可以被其他文件使用的。但是从物理空间上看,这些文件在没有被其他文件使用(覆盖)的时候,原来的文件数据是还存在的。
所以, 当删除了一个文件之后, 只要没有再次占用那些空间, 文件是可以被恢复的. 只要知道 文件的inode, 理论上是可以恢复的.但是, 删除文件之后, 操作系统就可以随意使用那些空间了, 所以实际上也是很有可能无法恢复的。
操作系统删除文件, 并不会真的将数据从磁盘中清除.
那么当一个公司的服务器需要更换磁盘时, 一般会对磁盘中的数据进行擦除. (以往可能会使用物理损毁)
四、软硬连接
我们知道同一个文件是不可能映射到多个inode,那么一个Inode能不能映射到多个文件呢?
1、硬链接
目录中的文件名 和 inode编号, 以一种映射关系存储在指定的数据块中,操作系统底层只认识inode编号, 不认识文件名,所以, 无论是访问文件还是读写文件, 最终其实都是通过inode编号来实现的。也就是说, 只要文件名可以映射到一个inode编号, 那么就可以通过此文件名访问到指定的文件. 即使存在多个文件名映射到同一个inode编号也是可以的。而硬链接,就可以将不同的文件名,映射到同一个inode编号上。
创建硬链接的命令: ln 原文件名 新创建的硬链接文件名
可以看到不同的文件名映射的inode是相同的,也就是说这两个不同的文件名实际上是一个文件,操作系统并没有在磁盘中再创建一个內容相同的文件,并不会多占用一份磁盘空间。其实就是在母的Data Block数据块中,添加了一个映射关系,并没有其他数据。
我们还看到了一个变化:表示权限一栏的数字由1变成2
这个数字表示的就是inode结构体记录的此文件的硬链接数,只要磁盘中存在一个硬链接的到此的inode的文件,这个计数就会加一。
硬连接数, 其实就是一个计数的作用, 只要硬连接数不为0, 就表示此inode所指向的文件 就还在某个地方被映射着甚至使用着呢。相应的, 只要此文件的硬连接数为0了, 那么就表示此文件在操作系统中已经可以不再存在了, 就可以删除了。也就是说, 只有一个文件的硬连接数为0时, 磁盘中的文件才会被删除. 不为0, 顶多算是解除了某个文件名对其的映射。
目录的硬链接
我们在新建一个文件的时候,默认的硬链接数是1,那么新创建的目录的硬连接数是多少呢?
可以看到新建的目录的硬连接数默认是2,这是为什么呢?普通文件创建出来就只有一个文件名映射到文件实际对应的inode,而进入到该目录下,我们看到这两个文件,‘.’ '..',前者表示目录文件本身的硬链接,文件名是‘ . ',这也就是我们为什么执行当前目录下的可执行程序的时候需要使用’./'作为前缀;后者表示的是当前目录的父目录。
而父目录的硬链接数很多的原因是:
- 每个子目录都会在其内部创建一个
..
链接到它的父目录。因此,如果一个目录包含多个子目录,那么这个父目录的硬链接数就会相应增加。例如:如果一个目录有 5 个子目录,那么该目录的硬链接数至少为 7(1 个.
+ 5 个来自各子目录的..
+ 1 个..
来自其自身) - 如果用户或程序在文件系统中创建了指向该目录的额外硬链接,这些也会增加目录的硬链接计数。
2、软连接
命令: ln -s 原文件名 新创建的软连接的文件名
与硬连接不同的是, 软连接是生成了一个新的文件, 因为映射的inode不同与原文件.
软连接生成的新文件的內容,其实是所连接的原文件的所在路径。
可以暂时将软连接类比成Windows下的快捷方式。
Tips:软硬连接都可以用,unlink 命令来取消链接。
3、应用场景
- 硬链接:适用于需要多个入口点访问同一文件的情况,尤其是在同一文件系统内。由于硬链接共享相同的数据块,因此对文件的任何更改都会反映在所有硬链接上。
- 符号链接:更适合需要灵活地指向不同位置或文件系统中的文件或目录的情况。符号链接允许更复杂的链接结构,并且可以更容易地管理和维护。
原文地址:https://blog.csdn.net/newbie5277/article/details/144229354
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!