文件系统的理解
- 当我们创建文件时,如果创建一个空文件,那么还是有相应的文件信息给它。这说明文件包括内容+属性。我们文件的属性信息是放在inode结构体中,每一个文件对应一个inode。文件的内容放在block中,每一个文件可以对应多个block,如果这个文件比较大的话。
- 而系统中的文件一定相当多,那么就需要管理。怎么管理呢?先描述再组织。而inode就是描述信息。我们的文件系统就是对磁盘的整体认知,其中包括了磁盘的使用情况和如何对磁盘的数据进行操作等等。
struct inode{
}
struct block{
}
struct filesystem{
}
- 当我们使用ls -al的时候我们可以看到文件的各种信息,而这实际上就是将文件的inode加载到内存中,然后打在显示器上。
磁盘
-
此时我们需要了解一下磁盘的结构。 -
一个磁盘分为好多个盘片,上图显示了3个盘面。而每个盘面有两个盘面,每个盘面都可以写数据。所以上图有6个盘面。而每个盘面上面又分为数个同心圆,每个同心圆上面又划分各个扇区。这样我们寻找一块磁盘区域需要三个步骤:1,找到盘片。2,找到同心圆。3,找到扇区。 -
但是这样有些复杂。所以我们使用了常用的方法!!在磁盘外面敷上一层虚拟的数据结构来模拟磁盘!这种手法在系统中可太常见了。 -
可以认为,我们使用数组来模拟磁盘。磁盘的大小是固定的,那么这个数组大小也是固定的。我们将磁盘中的每个盘片映射到不同的区域。然后将同心圆再次划分,然后再次划分到扇区。这样我们查找磁盘中的内容就转换成了查找数组。 - -
然后我们基于这个数组再分区,比如1个扇片(不同的系统分区不同)为一个区。这样每个分区就有一个文件系统来帮助操作系统管理文件。文件系统中包含着这个分区的使用情况,比如使用多少,未使用多少,当然还包含文件的inode和block。
- 但是分区还是太大,文件系统又会划分出groups,而每个groups又分为不同的部分。我们现在来研究一下一个group。因为我们知道一个group的原理后,我们就可以知道整个分区,最终整个磁盘的原理,因为每个group的原理相同。
group的各个部分分析
- 在每个分区最前面都有1个boot block group,这个可以认为是启动时操作系统的信息。
- 每个group都有一个Super Block,这个可以说是这个分区的信息,包括分区使用情况,未使用情况,inode使用情况等等。为什么每个group都包含这玩意呢?因为防止一个group的这部分损坏,这样还有备份,给文件系统加保险。
- 而Group Descriptor Table就是每个group的信息,包括使用情况,使用多少inode等等。
- group中还包含inode table,这就是文件的属性信息,其中就有该文件占据的block信息,比如该文件内容占用第200,300个block,那么inode就有到200,300的链接。inode的数量是固定的,也就是说如果你的文件每个都很小,那就可能会出现一种情况:内存还剩很多,但是无法创建文件了。因为inode使用完了。
- Data Blocks就是存储文件内容的区域,这个区域又被划分多个blocks。而如果文件较大可能占用多个block。
好了,现在我们知道如果想访问一个文件,那么只需要拿到它的inode就可以。那么问题来了,inode怎么拿到?
- 文件系统为每个inode分配inode id号,这个id号每个分区唯一!我们只需拿到inode id就能拿到这个文件。那么如何保证inode id唯一?inode id也需占用空间,那么inode id存放在磁盘中哪个位置?
- 我们可以在ls中加入i选项查看文件的inode。
- 在每个group中使用inode Bitmap位图来存放inode id! 没错,假设每个group最多可以存放10万个文件,那么就给位图分10万个bit位,每个位初始化为0.等到分配的时候,哪个位为0,就占用哪个inode id,然后将位图中对应的位置变成1即可。
- 类似的,block也有很多,每个block需要进行标识,是否被使用,那么也使用Block bitmap位图来标识,如果一个block被使用,就将其对应的位图位置变成1,反之变成0即可。
文件的存储过程
- 怎么存储一个文件?
- 去inode位图中找到未使用的inode id,然后给这个文件分配inode。找到未使用的block,将数据存入这些block,然后建立文件名和inode id和block的关系,最后将inode位图和block位图对应位置变成1即可。
- 怎么查找一个文件?
- 拿到文件的inode id,找到对应的inode,然后找到存储的block,拷贝数据到内存中即可。
- 怎么删除数据呢?
- 难道还要真正的删除数据吗?有没有发现一个现象,当你下载什么很慢。但是删除就几秒钟的事。其实,文件的删除只需按照inode id找到inode,断开inode与该文件的block关系。然后断开该文件与inode的关系。最后将inode位图和block位图对应的位置变成0即可。
- 同时目录也是文件,那么目录也需要分配inode id和inode。那么目录的block中存储什么呢? 目录的内容存储着该目录下文件名和它们inode的映射关系,所有文件的属性信息都保存在文件的inode中,而非目录的inode和block中。这样的好处是减少存储消耗,只需要在目录中找到和文件的inode映射关系,就找到了文件的属性。
软硬链接
linux下有链接的概念,还分为软硬链接,链接就是为我们定位文件。在linux下使用ln创建软硬链接:
- 观察h_link和s_link的内容,我们发现都和链接的文件的内容相同。观察这张图,我们会发现软硬链接的本质。
硬链接: - 硬链接的inode id跟它链接的文件相同,这说明硬链接不是一个文件。它只是一个链接关系。这两个文件可以通过任意一个访问同一个inode。删除其中一个文件,硬链接就变成了原文件,只是名字变量而已。
- 我们还看到属性信息中还有一列是链接数。这实际上是硬连接数,即有多少个文件对应同一个inode。因为file.c和h_link对应一个inode,所以这两个文件的链接数都是2.实际上,我们删除一个文件,系统会将该文件的硬链接数-1,如果为0,那么释放该文件。
- 新建的目录默认是2个链接数,因为当前目录的上级目录有一个硬链接。该目录里面还有一个链接。
- test_dir的链接数是2.因为可以通过名字访问该目录的inode。也可以进入该目录通过 “一个点” 访问该目录。如果在该目录下再创建目录,那链接数就会变成3,因为可以通过“两个点”访问该目录。
软链接:
- 通过观察inode,发现软链接的inode跟链接文件不同。所以软链接本质是一个独立的文件。但是软链接里面的数据跟链接文件一样。你可以认为软链接的block中存放着链接文件的路径。当我们干掉软链接的链接文件时,软链接的内容也被清空。软链接也就失去了意义。
- 软链接类型windows中的桌面快捷方式。
软链接的作用:当你的可执行文件不在当前路径,或者路径比较深的时候,你可以建立一个软链接去执行这个软链接即可。 为什么不用硬链接呢?因为硬链接就不是快捷方式了,删除原文件还会残留下来。 - 还有一张网图,我觉得形容软硬链接很厉害。
|