❤️前言
今天的这篇博客主要是总结前几天学习的关于Linux系统下的文件系统以及软硬链接的内容。希望能对大家有所帮助。
正文
我们今天要学习关于Linux下的文件系统——EXT2的知识,需要注意的是这里的文件和我们以前遇到的那些文件并不相同,以前我们主要是在研究一些被打开的文件,而我们现在要研究文件系统,则主要是将目光放在那些没有被打开的被存储于磁盘上的文件。
除此之外,每个文件由文件属性和文件内容组成,其中文件内容存储在一个个数据块中,而文件属性则存储在一个叫做inode的东西之中。Linux在硬件中存储文件的方式是将文件的属性和内容分开存储的。
那么Linux下的文件系统具体是怎么去存储一个文件的呢?先别着急,我们先从对相关的硬件也就是磁盘开始谈起。
认识硬件——磁盘
磁盘图片:
磁盘是一个永久性存储介质,是计算机中唯一一个机械设备,也是一个外设。其中,磁盘被访问的最基本单元是扇区,扇区对应的大小是4KB也就是512字节。我们可以将一个磁盘看成非常多的扇区集合而成的一个存储介质,如果我们要讲一个数据存储到磁盘中,第一个需要解决的问题就是要寻找到一个扇区,其中磁盘有多个不同的扇面、扇面中有多个磁道,磁道中又有很多扇区。通过将这些信息编号,就可以基于编号一种磁盘独有的寻址方式,也就是使用Cylinder、Header、Sector三者信息所达成的CHS寻址方式。
除此以外,如果大家对于磁盘有更深的兴趣,可以自行查找相关资料进行学习哦。
线性化理解磁盘的存储空间
虽然我们看到磁盘真正的存储单元都是将圆形的扇面分成了许多的带状小段,但是我们其实可以将硬盘的存储空间在逻辑上线性化,也就是像一段非常非常长的数组。我们上面说过,磁盘的存储空间是以扇面、磁道和扇区进行编址过的,那么就可以将它抽象成数组,毕竟数组的下标也是编号,那么这里的编址就可以和编号相对应。
具体点来说,我们只要知道一个磁盘中含有多少个扇面,一个扇面有多少个磁道,一个磁道有多少个扇区,不就可以进行编址吗,编址的行为就像这样:以扇区为最小单位空间,我们可以知道磁盘中总共有多少个这样的单位空间,那么这个数量可以平均分配给每个扇面,每个扇面分到相同多的最小单位空间以后,又可以平均分配到不同的磁道,这样就可以通过扇面在所有扇面中的编号(LBA地址)知道一个扇面属于哪一个扇面中的哪一个磁道中(CHS)。
文件系统
在Linux下我们如果想要存储文件数据,就需要先进行磁盘分区,类似于我们上面讲的那样,磁盘分区就是将磁盘分成多个分区,不仅有利与对磁盘空间的管理,而且不同的分区还可以建立不同的文件系统。(这里不仔细讲了,有兴趣的话大家可以自行搜索答案,咱们这里并不太关心这个话题)
当我们完成了磁盘的分区之后,接着就把磁盘中的某个分区格式化为某种格式的文件系统,这样磁盘才能存储文件。格式化文件系统的目的就是组织和管理磁盘中的文件。我们这里将会对Linux操作系统中最为常见的EXT2文件系统进行研究。(格式化:提前将部分文件系统的属性信息设置进对应的分区中,方便我们之后使用这个分区)
EXT2 文件系统在格式化磁盘分区的时候一般会包含多个区块群组(block group)。EXT2 格式化后有点像下面这样:
我们现在着眼于每个block group,如上图所示,每个 Block Group 都由下面几个组成部分:
- Superblock(超级块)
- Group Description(组描述)
- Block bitmap(块位图)
- Inode bitmap(inode 位图)
- Inode table(inode 表)
- Data Blocks(数据块)
我们从右向左进行逐一介绍。
Data blocks
我们上面说过,Linux操作系统中文件的文件属性和文件内容是分开存储的。这里的Date blocks就是用于存放文件内容的区域,其中Data blocks被分为很多很多的块(block),一个块的大小一般是4KB。另外,一般来说每个块都只包含一个文件的内容,如果一个文件比较大,会用多个块进行存储,如果一个文件比较小,小于一个块大小,则剩下的空间会被直接浪费。
inode Table
inode Table 中存放着一个个 inode,每个inode都有自己的编号(以磁盘分区为界限),一个inode一般是128字节大小,inode 的内容记录单个文件的所有属性,inode 记录的主要的文件属性如下:
- inode number 代表inode的编号
- 该文件的读写权限(rwx)
- 该文件的拥有者和所属组(owner/group)
- 该文件的容量
- 该文件的 ctime(创建时间)
- 该文件的 atime(最近一次的读取时间)
- 该文件的 mtime(最近修改的时间)
- int blocks[15];这个数组记录着这个inode对应的文件的文件内容在当前区块群组的Data blocks中所占有的所有block的编号。其中当一个文件较小时block会一一索引数组下标,而文件比较大时就会采取特殊的索引方式。
我们知道当系统需要管理某个资源,就需要对这个东西进行先描述,再组织。那么inode就是这个资源,首先描述它就是将它的所有属性封装成一个结构,再组织的过程就是将它“放进”inode Table和inode Bitmap并在这些数据结构中做操作。
inode Bitmap
这个部分是一个位图,其中的比特位的位置与inode的编号映射起来,用于表示这个inode是否是有效的。
Block Bitmap
这个位图中保存的是Data Block的使用情况,也就是将比特位的位置和块号对应映射起来,比特位的状态可以表现对应块是否被使用。
那么我们现在来思考,如果我们删除一个文件,那么我们是否需要将其占用的所有块的内容(文件内容)全部清空呢?
当然是不需要,我们只需要将这些数据块对应在位图中的状态设置为未使用的状态即可。(事实上,清空也没什么意义,毕竟一段数据是否为空白状态也是人为规定的)未使用状态下的数据块就可以被其他的文件拿来存储文件内容,可以说,数据块被删除后的状态就相当于允许被覆盖。
所以平时当我们创建或者拷贝文件到我们的磁盘中时常常会花费较多的时间,但是删除文件却只需要较少的时间即可。(将数据写进块中是需要真的去一份份拷贝的,但是删除文件时就只需要在对应文件属性和文件内容的两个位图中将相应的位设置成删除的状态即可)
Group Description
对当前块组进行描述,包含了有多少inode,起始的inode编号,有多少个inode被使用,有多少block被使用,还剩多少等待信息。
Super block
文件系统的顶层数据结构,记录着整个磁盘分区的信息,记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。
文件名和目录
上面我们聊了许多关于文件系统的事,知道了文件的inode存储着一个文件的所有文件属性,但我们作为用户在操作一个文件时,却从不关心inode,而使用文件名进行对应文件的指定。而且我们可以观察inode中的所有文件属性,其中并没有文件名。那么我们是怎么通过一个文件名对整个文件的文件属性和文件内容做操作的呢?
那我们就需要了解到关于目录文件的一些知识:
目录也是文件,它的inode编号与目录名的映射则需要在上级目录中得到,而上级目录又需要通过对应的上上级目录来得到inode和文件名的映射关系,从此往复找到根目录为止,但是这样的查找往往费劲,于是这里就产生了一个缓存机制,系统中保存着常用的文件路径,这样我们就可以很快地查找到常用目录下的文件。
软硬链接
首先,我们可以通过chatgpt简单了解一下一些关于软硬链接的基础知识:
在Linux系统中,软链接(Symbolic Link)和硬链接(Hard Link)是两种文件链接的方式,它们允许一个文件有多个路径指向它,从而提供了一些方便的功能。下面是对软链接和硬链接的解释:
软链接(Symbolic Link)
-
定义: 软链接是一个指向另一个文件的特殊文件,类似于Windows中的快捷方式。软链接包含指向目标文件的路径信息。
-
特点:
- 可以跨越文件系统,甚至可以链接到不存在的文件。
- 删除原始文件不会影响软链接,但如果软链接指向的文件被删除,软链接将失效。
- 可以链接目录。
-
创建: 使用
ln -s
命令创建软链接,例如:ln -s /path/to/target /path/to/link
-
实例:
ln -s /home/user/file /home/user/link
硬链接(Hard Link)
-
定义: 硬链接是文件系统中目标文件的另一种目录项,与原始文件的inode相同,实际上是相同的数据块。
-
特点:
- 必须在同一文件系统内创建。
- 删除原始文件并不影响硬链接,因为它们共享相同的inode。
- 不可以链接目录。
-
创建: 使用
ln
命令创建硬链接,例如:ln /path/to/target /path/to/link
-
示例:
ln /home/user/file /home/user/link
区别总结
- 软链接允许链接到不存在的文件,而硬链接不允许。
- 软链接可以跨越文件系统,而硬链接必须在同一文件系统内。
- 删除软链接的目标文件不会影响软链接本身,但删除硬链接的目标文件并不会影响硬链接,因为它们共享inode。
在选择使用软链接或硬链接时,需要根据具体的需求来决定。软链接通常用于跨文件系统链接或链接到目录,而硬链接通常用于在同一文件系统内创建文件的多个别名。
不允许建立目录的硬链接
我们知道目录也是一种文件,那么当我们对目录进行硬链接的创建时会发生什么呢?
我们会发现系统不让我们创建目录的硬链接,但是当我们查看当前目录的文件的详细信息时会发现我们经常使用的 . 和 .. 就是对当前目录和其父目录的硬链接。那么产生这种情况的原因是什么呢?
🍀结语
今天的文章就分享到这啦!谢谢大家!