文件系统的完整结构

转载于骏马金龙

基于上篇文章:文件系统的组成部分,将上文描述的bmap、inode table、imap、数据区的blocks和块组的概念组合起来就形成了一个文件系统,当然这还不是完整的文件系统,完整的文件系统如下图:

73301320180727160411876443793371.png

首先,该图中多了Boot Block、Super Block、GDT、Reserver GDT这几个概念。

图中指明了块组中每个部分占用的block数量,除了superblock、bmap、imap能确定占用1个block,其他的部分都不能确定占用几个block。

图中指明了Superblock、GDT和Reserved GDT是同时出现且不一定存在于每一个块组中的,也指明了bmap、imap、inode table和data blocks是每个块组都有的。

引导块

即上图中的Boot Block部分,也称为boot sector。它位于分区上的第一个块,占用1024字节,并非所有分区都有这个boot sector,只有装了操作系统的主分区和装了操作系统的逻辑分区才有。里面存放的也是boot loader,这段boot loader称为VBR(主分区装操作系统时)或EBR(扩展分区装操作系统时),这里的Boot loader和mbr上的boot loader是存在交错关系的。开机启动的时候,首先加载mbr中的bootloader,然后定位到操作系统所在分区的boot serctor上加载此处的boot loader。如果是多系统,加载mbr中的bootloader后会列出操作系统菜单,菜单上的各操作系统指向它们所在分区的boot sector上。它们之间的关系如图:

WechatIMG239.jpeg

但是,这种方式的操作系统菜单早已经弃之不用了,而是使用grub来管理启动菜单。尽管如此,在安装操作系统时,仍然有一步是选择boot loader安装位置的步骤。

超级块(superblock)

既然一个文件系统会分多个块组,那么文件系统怎么知道分了多少个块组呢?每个块组又有多少block多少inode号等等信息呢?还有,文件系统本身的属性信息如各种时间戳、block总数量和空闲数量、inode总数量和空闲数量、当前文件系统是否正常、什么时候需要自检等等,它们又存储在哪里呢?

毫无疑问,这些信息必须要存储在block中。存储这些信息占用1024字节,所以也要一个block,这个block称为超级块(superblock),它的block号可能为0也可能为1。如果block大小为1K,则引导块正好占用一个block,这个block号为0,所以superblock的号为1;如果block大小大于1K,则引导块和超级块同置在一个block中,这个block号为0。总之superblock的起止位置是第二个1024(1024-2047)字节。

使用df命令读取的就是每个文件系统的superblock,所以它的统计速度非常快。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要遍历整个目录的所有文件。因为du的定义就是estimate file space usage, 查询的是每个文件的大小。

root@generalai-cpu-0:~/go/src/k8sMLer-client-go# df -hT                                                                                                                     
Filesystem     Type      Size  Used Avail Use% Mounted on                                                                                                                   
udev           devtmpfs  252G     0  252G   0% /dev                                                                                                                         
tmpfs          tmpfs      51G   19M   51G   1% /run                                                                                                                         
/dev/vda1      ext4      497G   18G  479G   4% /                                                                                                                            
tmpfs          tmpfs     252G     0  252G   0% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     252G     0  252G   0% /sys/fs/cgroup
/dev/vda15     vfat      105M  9.0M   96M   9% /boot/efi

superblock对于文件系统而言是至关重要的,超级块丢失或损坏必将导致文件系统的损坏。所以旧式的文件系统将超级块备份到每一个块组中,但是这又有所空间浪费,所以ext2文件系统只在块组0、1和3、5、7幂次方的块组中保存超级块的信息,如Group9、Group25等。尽管保存了这么多的superblock,但是文件系统只使用第一个块组即Group0中超级块信息来获取文件系统属性,只有当Group0上的superblock损坏或丢失才会找下一个备份超级块复制到Group0中来恢复文件系统。

块组描述符表(GDT)

既然文件系统划分了块组,那么每个块组的信息和属性元数据又保存在哪里呢?

ext文件系统每一个块组信息使用32字节描述,这32个字节称为块组描述符,所有块组的块组描述符组成块组描述符表GDT(group descriptor table)。

虽然每个块组都需要块组描述符来记录块组的信息和属性元数据,但是不是每个块组中都存放了块组描述符。ext文件系统的存储方式是:将它们组成一个GDT,并将该GDT存放于某些块组中,存放GDT的块组和存放superblock和备份superblock的块相同,也就是说它们是同时出现在某一个块组中的。读取时也总是读取Group0中的块组描述符表信息。

假如block大小为4KB的文件系统划分了143个块组,每个块组描述符32字节,那么GDT就需要143*32=4576字节即两个block来存放。这两个GDT block中记录了所有块组的块组信息,且存放GDT的块组中的GDT都是完全相同的。

下图是一个块组描述符的信息(通过dumpe2fs获取)。

Group 4095: (Blocks 134184960-134189306) csum 0x4d45 [INODE_UNINIT, ITABLE_ZEROED]
  Block bitmap at 133693455 (bg #4080 + 15), csum 0x668edd27
  Inode bitmap at 133693471 (bg #4080 + 31), csum 0xeb65bbc4
  Inode table at 133708592-133709599 (bg #4080 + 15152)
  4347 free blocks, 16128 free inodes, 0 directories, 16128 unused inodes
  Free blocks: 134184960-134189306
  Free inodes: 66044161-66060288

保留GDT(Reserved GDT)

保留GDT用于以后扩容文件系统使用,防止扩容后块组太多,使得块组描述符超出当前存储GDT的blocks。保留GDT和GDT总是同时出现,当然也就和superblock同时出现了。

例如前面143个块组使用了2个block来存放GDT,但是此时第二个block还空余很多空间,当扩容到一定程度时2个block已经无法再记录块组描述符了,这时就需要分配一个或多个Reserved GDT的block来存放超出的块组描述符。

由于新增加了GDT block,所以应该让每一个保存GDT的块组都同时增加这一个GDT block,所以将保留GDT和GDT存放在同一个块组中可以直接将保留GDT变换为GDT而无需使用低效的复制手段备份到每个存放GDT的块组。

同理,新增加了GDT需要修改每个块组中superblock中的文件系统属性,所以将superblock和Reserved GDT/GDT放在一起又能提升效率。


标题:文件系统的完整结构
作者:reyren
地址:https://www.reyren.cn/articles/2021/06/21/1624434359385.html

    评论
    0 评论
avatar

取消