Linux: 文件系统
目录
前言
一 磁盘
1. 物理结构
2.存储结构
3. 逻辑结构
二 文件系统
1. 基本概念
2. 组的概念
❶ Super Block
❷ Group Descriptor Table
❸ inode
❹ Data blocks
❺Block Bitmap
❻inode Bitmap
❼ inode Table
三 文件的创建和删除
1.目录操作
2.创建文件
3.文件删除
四 软硬链接
1.普通文件硬链接
2.目录的硬链接
3. 软链接
4.软链接应用场景
前言
操作系统对打开的文件会加载到内存中进行管理,但是整个计算机中还存在着许许多多的没有被打开的文件,这些文件又是存在在哪里呢?操作系统对这些文件又是怎么管理的呢?
一 磁盘
没有被打开的文件会存放放在我们的磁盘中,如下是磁盘示意图,接下来我们将从三个方面即:
磁盘的物理结构,存储结构,逻辑结构,了解没有被打开的文件是如何存放磁盘中的。
1. 物理结构
2.存储结构
下图是盘片,其可以看作是无数个同心圆,每一个同心圆被称为一个磁道,每个磁道又会被分为好多个扇区。
我们的数据就是以二进制的形式在这里存储着。且对于每一条磁道都有着自己的编号,最外层磁道的编号为0;每一条磁道上的每一块扇区也都有着自己的编号,每一块扇区的大小一般为512字节
✍:
每条磁道的扇区数是相同的, 每块扇区的大小也是相同的,(这里所指扇区大小相同是指存储的文件大小是相同的)
外层的扇区最大, 最内磁道的扇区最小,但是二者可存储数据的大小是相同的因为
每条磁道存储数据的密度不相同。
为了精准定位到扇区,我们再引入磁柱的概念,我们看到磁盘的结构是由很多个盘片外加一些其他的组件组合而成,这些盘片从俯视的角度看都是重合的,但是它们之间都留有一定的空隙,如下
我们把这种的处于同一半径且由多个盘面组成的圆柱体称为磁柱。磁柱也有着自己的编号。所以当我们知道了磁柱(Cylinder)、磁头(Head)、扇区(sector)这三个的编号的时候,我们就可以定位到整个磁盘中的任意一个扇区,即磁头确定哪一个盘面,磁柱确定在哪一个磁道,接下来扇区就能告诉我们具体的位置。这样的方法被称为CHS方法,可以找到磁盘中每个单元的确切位置。
3. 逻辑结构
上面了解到了磁盘的物理结构及其存储的结构,接下来我们抽象出磁盘的存储结构看看磁盘逻辑上的存储结构。虽然它的物理上的存储结构是同心圆里面的扇区一样的存储结构,但是我们也可以想象将每一个同心圆,从某一处剪断之后拉长,这样就从一个同心圆变成了一个直线性的带子,就像老式录音机里的磁带一样。所以磁盘上的所有盘片的所有磁道都可以抽象成一个线性的数组然后整合起来。示意图如下:
磁盘的逻辑结构:将磁盘的存储空间抽象成一个大的数组,数组中的每个单元都代表着一个扇区
所有的扇区被整合成一个数组, 每个下标对应着一个扇区, 即可以根据数组的下标来定位到磁盘中的某个扇区, 这里的下标被成为LBA逻辑块地址。
通过LBA 计算 CHS:
LBA/总扇区个数= ---------------------确定在那个柱面
LBA/一个面扇区=----------------------确定在那个磁道
LBA%一个磁道扇区-------------------确定在那个扇区
二 文件系统
1. 基本概念
- 一般来说操作系统与磁盘进行I/O操作的基本单位是4KB,但是数组中一个单位才占512字(一个扇区大小)所以为了方便进行操作,操作系统又会将数组的每八个小单元合成一个大的单元以方便I/O操作。(8*512B=4KB)
- 操作系统的每次I/O操作的基本单位不设为512B是因为它太小了,一个扇区一个扇区进行I/O操作过于繁琐,浪费资源,且4KB作为基本单位能提高数据读取的命中率。
上述我们将磁盘的存储抽象成为了数组,但是整个数组也是很大的,管理整个的数组所消耗的资源当然也是非常大的。所以操作系统会针对整个磁盘进行分区(例如我们买的笔记本的硬盘SSD,会进行C盘和D盘的分区,但实际上电脑上只有一块硬盘),分区之后针对每一个区再进行分组,之后再对这些组进行管理就容易多了。(分而治之思想)
2. 组的概念
我们之前提到过文件=文件内容+文件属性,那么文件的内容和属性是放在一起的吗,一起由操作系统进行管理的吗?
😄:并不是,文件的内容和属性是分开存储的,分开进行管理和操作的。Linux中的文件系统, 会将分区在细分为组, 不同的组内存储一些相同结构的属性, 这些属性描述着组的内容。
❶ Super Block
保存的是整个文件系统的信息(备份),每个组都有一块super block ,是为了降低数据丢失的容错率。当文件信息出现问题时候,其他块的super block 会覆盖出问题的super block ,使得信息恢复。
❷ Group Descriptor Table
块组描述表:对应分组的宏观的属性信息。
❸ inode
每一个文件都有一个inode,inode就相当于id,用来区分文件彼此。用来表示某一个文件在操作系统中得唯一编号。可以使用 命令查看,红色方框内即为每个文件的inode值.
❹ Data blocks
保存的是分组内部所有文件数据
❺Block Bitmap
数据块对应的位图结构,位图中的比特位位置和当前data block 对应的数据块位置是一一对应的。
❻inode Bitmap
inode对应的位图结构,位图中比特位位置和当前data block 对应的数据块位置是一一对应关系。
❼ inode Table
保存的是分组内部所有的可用(已经使用+没有使用)inode
三 文件的创建和删除
1.目录操作
- 需要进入一个目录的时候,我们需要的是X权限,即执行权限
- 在目录下创建文件时,我们需要的是W权限,即写入权限(在创建文件的时候,实际上我们是写入一个inode,这也是为什么创建文件,我们需要的是W权限)
- 而查看目录下的文件时,我们需要的是读取的权限(查看文件实际上查看inode对应的数据块)
2.创建文件
- 创建文件的inode结构体, 并将inode和内容分别存储至组的inode Table 和 Data Blocks中, 并修改inode Bitmap 和 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。 其实在linux中可以让多个文件名对应于同一个 inode。一个文件只能有一个inode.
1.普通文件硬链接
目录中的文件名 和 inode编号, 以一种映射关系存储在指定的数据块中,操作系统底层只认识inode编号, 不认识文件名,所以, 无论是访问文件还是读写文件, 最终其实都是通过inode编号来实现的。也就是说, 只要文件名可以映射到一个inode编号, 那么就可以通过此文件名访问到指定的文件. 即使存在多个文件名映射到同一个inode编号也是可以的。而硬链接,就可以将不同的文件名,映射到同一个inode编号上.
创建硬链接的命令: ln 原文件名 新创建文件名
可以看到不同的文件名映射的inode是相同的,也就是说这两个不同的文件名实际上是一个文件,操作系统并没有在磁盘中再创建一个內容相同的文件,并不会多占用一份磁盘空间。其实就是在母的Data Block数据块中,添加了一个映射关系,并没有其他数据。
我们还看到了一个变化:表示权限一栏的数字由1变成2
这个数字表示的就是inode结构体记录的此文件的硬链接数,只要磁盘中存在一个硬链接的到此的inode的文件,这个计数就会加一。
硬连接数, 其实就是一个计数的作用, 只要硬连接数不为0, 就表示此inode所指向的文件 就还在某个地方被映射着甚至使用着呢。相应的, 只要此文件的硬连接数为0了, 那么就表示此文件在操作系统中已经可以不再存在了, 就已经删除了。也就是说, 只有一个文件的硬连接数为0时, 磁盘中的文件才会被删除. 不为0, 顶多算是解除了某个文件名对其的映射。
2.目录的硬链接
我们在新建一个普通文件的时候,默认的硬链接数是1,那么新创建的目录的硬连接数是多少呢?
可以看到新建的目录的硬连接数默认是2,这是为什么呢?普通文件创建出来就只有一个文件名映射到文件实际对应的inode,而进入到该目录下,我们看到这两个文件,‘.’ '..',前者表示目录文件本身的硬链接,文件名是‘ . ',这也就是我们为什么执行当前目录下的可执行程序的时候需要使用’./'作为前缀;后者表示的上级目录
而父目录的硬链接数很多的原因是:
每个子目录都会在其内部创建一个 .. 链接到它的上级目录。因此,如果一个目录包含多个子目录,那么这个父目录的硬链接数就会相应增加。这也是为什么我们 cd .. cd . 能进入上级目录和当前目录的原因。
3. 软链接
命令: ln(link) -s(soft) 原文件名 新创建的文件名
4.软链接应用场景
例如,我们在lesson19/exe/目录下写了一个test程序
运行的时候需要./lesson19/exe/test 明显很麻烦
为了方便我们可以在106 中创建一个软链接,链接 ./lesson19/exe/test程序
运行结果
与硬连接不同的是, 软连接是生成了一个新的文件, 因为映射的inode不同与原文件.
软连接生成的新文件的內容,其实是所连接的原文件的所在路径。(就像windows下桌面上软件的快捷方式,当我们点击桌面上软件快捷方式时候,会跳到软件所在目录并执行)