Linux文件系统

文件的存储结构

内容与属性

         文件由内容与属性构成,Linux下这二者是分开存储的,这种设计的核心是通过 inode(索引节点)block(数据块)来实现的。struct file中有结构体指针f_inode,其指向Inode结构体,这个结构体存储了文件的元数据(即文件属性),每个文件(包括普通文件、目录、设备文件等)都有一个唯一的inode,但文件名并不在其中。

        同时Inode中包含了一系列块指针,这些指针通常以数组存储,在ext4文件系统中,i_block指针数组中的指针指向文件数据块,结构如下:

  • 直接块指针:数组的前几个指针直接指向数据块。

  • 间接块指针:当文件较大时,直接块指针不足以存储所有数据块,此时会使用间接块指针。

    • 一级间接块指针:指向一个块,该块中存储了更多的数据块指针。

    • 二级间接块指针:指向一个块,该块中存储了更多的一级间接块指针。

    • 三级间接块指针:指向一个块,该块中存储了更多的二级间接块指针。

这种设计允许文件系统高效地管理大文件,同时保持对小文件的简单直接访问。

分块

       早期的磁盘存储系统中广泛使用的CHS算法通常把大小为512字节的数据块作为访问的基本单位,但随着计算机的发展,现在一般以4kb作为基本单位。就是说,哪怕仅访问1bit大小的数据,也要将4kb载入内存,看起来有点浪费,但根据局部性原理,多加载的部分大概率也会被使用,所有也算是一种预加载,大概率减少了I/O

磁盘结构

主引导记录(MBR)

        主引导记录(MBR)位于整个磁盘的第一个扇区(扇区 0),大小为 512 字节,包含引导加载程序和分区表。加载程序的主要任务是识别活动分区并将控制权转移给该分区的引导扇区,分区表记录了磁盘上各个分区的起始位置、大小和类型。其后为各区块。

分区

        磁盘根据 MBR 中的分区表被划分为多个分区。每个分区可以格式化为不同的文件系统,用于管理该分区内的数据,如 Ext2、NTFS 等,这里主要讲述Linux基本的Ext2文件系统。

        每个分区的起始部分通常包含一个引导块(Boot Block),也称为分区引导记录(Partition Boot Record, PBR)或卷引导记录(Volume Boot Record, VBR)。这个引导块包含用于引导操作系统的代码。其后为各组块。

分组(文件系统内部结构)

        各组块文件系统的结构通常由以下部分组成:

        Super Block、Group Description Table、Block Bitmap、Inode Bitmap、Inode Table、Data Block

        1、 Super Block:其中存放了该区块文件系统的信息,但其并不在区块中独立存放,这是为了多副本,如此一来,不会出现分区内的Super Block损坏而导致整个分区文件系统而无法运行的问题。

        2、Inode Table:上述提到,文件的属性集合被存放在Inode结构体中,每个Inode实例都有一个唯一的ID号,Inode Table用于建立Inode IDInode实例的映射关系。

        3、Inode Bitmap:对应了Inode的位图结构,用于管理 inode 表 中的 inode 的分配状态。其作用为:

                ①分配 inode:文件系统在创建新文件或目录时,会检查 inode 位图,找到空闲的 inode。

                ②回收 inode:文件系统在删除文件或目录时,会将 inode 标记为未分配。

        4、Block Bitmap:记录了块组中哪些块已经被分配,哪些是空闲的。它是一个位图,每个位对应一个块。用于管理数据块,具体为——文件系统在分配新块时,会检查块位图,找到空闲的块。文件系统在删除文件时,会将块标记为未分配。

        5、Group Description Table:存储了每个块组的元数据。如块组号、目录数、已用inode数、inode位图地址等。

        6、Data Blocks:数据块是文件系统中用于存储文件实际数据的区域。每个数据块的大小由超级块中的块大小决定(如 1KB、2KB、4KB)。

         由此就不难理解计算机如何启动了,简单逻辑流程:启动->加电自检->主引导记录加载->控制权被转移给分区的引导扇区->分区引导扇区加载->加载程序启动,根据配置文件加载操作系统内核,并将控制权交给内核->内核初始化->挂载文件系统与读取Super Block->用户空间初始化->加载图形化界面或命令行解释器

目录文件

        任何文件一定是在目录下的,当然,目录也是文件。目录文件的内容存储在文件系统分配的数据块中。这些数据块的位置由目录文件的 inode 中的块指针指定。目录文件下存储了各文件的文件名和Inode ID,又以此建立了文件名与Inode ID的映射。所以这就是为什么在目录下创建文件要有该目录文件的写入权限。

        ls -i命令用于列出文件和目录的inode编号

        inode编号的范围:inode编号是有限的,如果文件系统中的inode用完,即使磁盘空间未满,也无法创建新文件或目录。可以使用df -i命令查看文件系统的inode使用情况。

                

[root@VM-4-8-centos redirection]$ ls -i test
792382 test
[root@VM-4-8-centos redirection]$ df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
devtmpfs        253065    327  252738    1% /dev
tmpfs           255813      7  255806    1% /dev/shm
tmpfs           255813    465  255348    1% /run
tmpfs           255813     16  255797    1% /sys/fs/cgroup
/dev/vda1      3276800 107523 3169277    4% /
tmpfs           255813      1  255812    1% /run/user/0
tmpfs           255813      4  255809    1% /run/user/1001

你可能感兴趣的:(linux,运维,服务器,centos,后端,bash)