概述

今天主要介绍一下Linux系统的文件系统,一起来看看吧~


文件系统组成

网上看到的一张完整的文件系统图,如下:

首先,该图中有Boot Block、Super Block、GDT、Reserver GDT这几个概念,下面会分别介绍它们。

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

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


1 、引导块

即上图中的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上。

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


2 、超级块(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命令查看一个较大目录的已用空间就非常慢,因为不可避免地要遍历整个目录的所有文件。

superblock对于文件系统而言是至关重要的,超级块丢失或损坏必将导致文件系统的损坏。


3、 块组描述符表(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获取)。


4 、保留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放在一起又能提升效率。


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

32 块大小_详解Linux文件系统的完整结构--引导块、超级块、GDT等相关推荐

  1. linux 查看网络流量来源_详解Linux查看实时网卡流量的几种方式

    在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...

  2. linux 删除分区_详解linux系统架构--文件系统体系

    概述 之前已经对Linux系统架构的内核部分单独做了深入介绍,今天就拿Linux系统架构中的文件系统做一下介绍吧~先介绍下概念: 文件系统是文件存放在磁盘等存储设备上的组织方法.Linux系统能支持多 ...

  3. 详解Linux文件系统

    文章目录 思维导图下载: 磁盘组成与分区 磁盘的组成: 为啥要进行格式化 FHS文件系统层级标准 ext文件系统结构 ext文件系统与目录的关系 术语 ext系列文件系统的区别 ext文件系统 ext ...

  4. linux 文件系统cache,终于找到一篇详解Linux文件系统Cache的文章

    级别: 初级 2006 年 5 月 11 日 文件 Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分.本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够 ...

  5. dpkg安装软件流程_详解linux安装软件的几种方法

    一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所在 ...

  6. nginx文件系统大小_详解Nginx系列

    1.Nginx特点 Nginx是一个事件驱动架构,而非传统过程驱动架构.具有内存占用低,当并发连接大时,能够预测内存使用率.Nginx改变了传统的web服务器体系架构,提高了响应速度,起初Nginx开 ...

  7. cwntos新建目录挂载磁盘_详解Linux磁盘挂载、分区、扩容操作的实现方法

    概述 今天主要分享下关于Linux磁盘挂载.分区.扩容操作的实现方法,先介绍下基本概念 1.磁盘 在Linux系统中所有的设备都会以文件的形式存储.设备一般保存在/dev目录下面,以sda.sda1. ...

  8. ubuntu 网卡流量_详解Linux查看实时网卡流量的几种方式

    在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...

  9. linux更换网卡不识别_详解Linux双网卡绑定脚本的方法示例

    概述 linux运维及配置工作中,常常会用到双网卡绑定,少数几台服务器的配置还好,如果是需要配置几十甚至上百台,难免会枯燥乏味,易于出错,我编写了这个双网卡绑定的辅助脚本,可傻瓜式地完成linux双网 ...

最新文章

  1. ROS中Remap标签详解
  2. 【部分原创】python实现视频内的face swap(换脸)
  3. 【GAN优化】小批量判别器如何解决模式崩溃问题
  4. spring-boot-starter-actuator(健康监控)配置和使用
  5. java 素数 五行_【数论】素数的判定与筛法
  6. 中业科技机器人价格_2019年年中盘点:智能扫地机器人十大畅销品牌排名
  7. eclipse打包jar发布到linux下运行出错(java.lang.ClassNotFoundException: cmd.WordCount$MyMapper )
  8. 使用FreeRTOS进行性能和运行时分析
  9. java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...
  10. classic example2
  11. 1195 巧妙推算走楼梯(宁波大学oj)
  12. 在WSL下安装MYSQL的实验报告_Linux(wsl)安装docker和mysql主从搭建
  13. struts2学习 - action - 1
  14. R语言文本分析|利用jiebaR进行分词与词频统计
  15. (超详细)nessus下载与安装
  16. java接入支付宝api实现支付宝手机扫码登录
  17. 软件评测师考试学习计划
  18. ns-3 教程 —— 资源
  19. 2020美亚杯个人赛
  20. hide,hidden,display:none,visibility的区别

热门文章

  1. php取不到post数据库,安卓post 数据到php 在写入数据库老是不成功, 数据post不到php...
  2. matplotlib设置多个图例横向水平放置
  3. MySQL windows安装
  4. Xception,Inception-ResNet,SENet(Squeeze-and-Excitation)
  5. Spring Data JPA 从入门到精通~事务的处理及其讲解
  6. python停止运行tensorflow_Tensorflow 开启训练后卡死
  7. 改进初学者的PID-测量的比例介绍
  8. OpenJTAG调试S3C2440裸板程序
  9. software engineering homework, product analysis
  10. vb net 模拟 ctrl+c_8款优秀的.NET开发工具,收藏了