[Linux]文件系统

文件系统

在理解文件系统之前,我们先来看一下关于磁盘方面的内容。

磁盘的存储结构

  1. 盘面:

    一个磁盘由多个盘片组成,每个盘片都由两面,它的每一个面都可以存储数据,这就是盘面。

  2. 磁道:

    在一个盘面上会被划分为一个一个的“圈”,这个“圈”就对应这一个个的磁道。

  3. 扇区:

    从盘面中心开始,延伸出两条线,在这两条线之间磁道被划分为一个个的扇形,这就是扇区。一般来说每个扇区存储数据的容量是相同的,因此最内侧的数据密度大,最外侧的数据密度小。

  4. 磁头:

    有多少个盘面就有多少个磁头,每个磁头连在同一个磁臂上。

  5. 柱面:

    其实就是磁道,只不过是由相对位置相同的磁道组成。

那么如何在磁盘中定位一个扇区呢?

首先先确定在哪一个柱面,然后再选择磁头(也就是定位盘面),最后就可以定位扇区。这种方法称为CHS定位法。

为什么要先选择柱面而不是盘面呢?

磁头在不同柱面之间移动需要磁盘的机械臂进行大幅度的物理位移,这个过程相对较慢。当读取连续的数据时,若是采取先盘面的方式,它需要频繁的移动磁头来切换磁道,而若是采取先柱面的方式,那么只要确定了磁道,那么只需要切换磁头就可以了,没有物理位移。

磁盘的逻辑结构

磁盘在物理上是圆形的,但是在逻辑上我们通常将它抽象为线性结构,这样更易于管理。如下图

这样我们就可以将磁盘看成是一个数组,每个扇区对应一个数组下标。这种地址为LBA地址。LBA地址通过一些简单的计算既可以得到CHS地址。

文件系统

一般来说访问磁盘的基本单位是512字节,但是依旧很小,IO次数频繁。操作系统的文件系统会定制的进行多个扇区的读取,比如说1KB,2KB,4KB为单位(可以设置)。你哪怕只想读取或修改1bit,依旧需要将4KB的数据读取到内存。

但是这样是不是浪费了内存空间呢?此时就诞生了一项新的技术,局部性原理。当访问某个数据时,它周围的数据也有可能被访问。

综上,内存被划分为了一个个4KB大小的空间,叫做页框。磁盘中的文件(尤其是可执行文件),也是按照4KB划分好的块,叫做页帧。将数据从磁盘加载到内存,就是将页帧填到页框中。

假设一个磁盘有400GB,为了便于管理。可以按照分治的思想,将400GB的空间划分为一个个比较小的区域。这就是常说的分区和分组。

  • Boot Block(启动块):是计算机磁盘(如硬盘、软盘等)上的一个特殊区域,它包含了启动计算机系统所需的初始指令。大小是确定的。

  • Block Group:文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相 同的结构组成。

  • Super Block(超级块)::存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的 block 和 inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的 时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了。

  • Group Descriptor Table(组描述符表):这个描述符包含块组的起始块号(即该块组从磁盘的哪个物理块位置开始)、块组内的块位图(Block Bitmap)的位置,块位图用于标记块组内每个块的使用状态(是已使用还是空闲)。

  • Block Bitmap(块位图):记录着Data Block中哪个数据块已经被占用,哪个数据块没 有被占用。

  • inode Bitmap(inode位图):每个位(bit)对应一个 inode。如果位的值为 1,表示对应的 inode 已被使用;如果位的值为 0,则表示对应的 inode 是空闲的。

  • inode Table:保存了分组内部所有可用(已使用+未使用)的inode。inode table 中的每个 inode 通常包含多个字段。其中有文件模式(File Mode)字段,用于表示文件是普通文件、目录、符号链接还是其他特殊文件类型;还有用户标识符(UID)和组标识符(GID)字段,用于标识文件的所有者和所属组;文件大小(File Size)字段记录文件内容的字节数;时间戳(Timestamp)字段,包括文件的创建时间、最后修改时间和最后访问时间。

  • Data Blocks:保存的是分组内部所有文件的数据块。

Inode

操作系统查找一个文件的时候,统一使用的都是inode编号。但是我们平时在使用的都是文件名啊,这又是为什么呢?这是因为不仅仅文件有inode编号,目录也有,因为目录也是一个文件。inode结构体中有一个指向数据块的指针,目录的数据块中放的是当前目录下文件名和inode的映射关系。

软硬链接

软链接

软链接就相当于Windows系统下的快捷方式,使用ln -s [目标文件或目录路径] [软链接文件名]创建软链接。

当然也可以在其他目录下为这个程序创建一个软链接,如下

硬链接

推荐使用unlink [链接名称]去除链接(使用rm命令同样可以)

使用ln [目标文件或目录路径] [软链接文件名]创建硬链接。

两者的区别

软链接和硬链接的核心区别就是看是否有独立的inode

如上,软链接它有自己独立的inode编号,可以被当作独立的文件看待,它保存了所指向文件的文件路径。而硬链接没有独立的inode,说明它一定没有自己的属性集合和内容集合,一定用的是其他文件的inode和内容。也就是说,创建硬链接本质就是在指定的路径下,新增文件名和inode编号的映射关系。

当删除mytest这个文件时,ln_mytest也就是软链接受到了影响,而mytest_ln并没有受到影响,只是硬链接数目变了。说明了一个文件文件是否被删除与他的硬链接数有关,当一个文件的硬链接数变为0时,才表示他被真正的删除。

目录下的“.”和“..”

为什么当我们创建一个文件的时候它的硬链接数是1,而创建一个目录的时候它的硬连接数是2呢?

普通文件容易理解,就是inode和文件名本身就有一个映射关系,所以是1。既然目录也是文件,那么目录除了inode和文件名的映射关系外应该还有一个映射关系。这个映射关系就是目录下的"."。如下图

那“..”又是什么意思呢?请看下图,我们在empty目录下创建一个目录。会发现它的硬链接数变成了3,进入到新创建的目录中,发现这个目录下的".."就是empty目录的inode。这就说明“..”也是empty目录的硬链接。这也很好的解释了为什么我们执行cd ..命令的时候能返回到上级目录。

posted @   羡鱼OvO  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示