磁盘是用来储文件的,但是必须先把磁盘格式化为某种格式的文件系统,才能存储文件。文件系统的目的就是组织和管理磁盘中的文件。在 Linux 系统中,最长见的是 ext2 系列的文件系统。其早期版本为 ext2,后来又发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进行了增强,但是其核心设计并没有发生变化,所以我们仍是以较老的 ext2 作为演示对象。

基本结构

Ext2 文件系统在格式化的时候一般会包含多个区块群组(blockgroup)。Ext2 格式化后有点像下面这样:

这是因为文件系统非常大时,如果将所有的 inode 和所有的 block 放在一起管理起来会比较麻烦。所以将文件系统分割为多个 Block Group,每个 Block Group 中都有独立的 inode/block/superblock 系统。

Block
Block 就是我们在《Linux 文件系统相关的基本概念》一文中介绍的逻辑块。对于 ext2 文件系统来说,硬盘分区首先被分割为一个一个的逻辑块(Block),每个 Block 就是实际用来存储数据的单元,大小相同,Block 按照0,1,2,3 的顺序进行编号,第一个 Block 的编号为 0。ext2 文件系统支持的 Block 的大小有 1024 字节、2048 字节和 4096 字节,Block 的大小在创建文件系统的时候可以通过参数指定,如果不指定,则会从 /etc/mke2fs.conf 文件中读取对应的值。原则上,Block 的大小与数量在格式化后就不能够发生改变了,每个 Block 内最多只会存放一个文件的数据(即不会出现两个文件的数据被放入同一个 Block 的情况),如果文件大小超过了一个 Block 的 size,则会占用多个 Block 来存放文件,如果文件小于一个 Block 的 size,则这个 Block 剩余的空间就浪费掉了。
可以使用 dumpe2fs 命令查看 Block 的大小:

$ sudo dumpe2fs /dev/sda1 | grep "Block size:"

在笔者的环境中,输出的结果如下:
Block size:               1024

注意,Ext2 文件系统的 block 主要有下面一些特点:

  • block 的大小与数量在格式化完就不能够再改变了(除非重新格式化)
  • 每个 block 内最多只能够放置一个文件的数据
  • 如果文件大于 block 的大小,则一个文件会占用多个 block 数量
  • 若文件小于 block,则该 block 的剩余容量就不能够再被使用了

Block Group
Block 在逻辑上被划分为多个 Block Group,每个 Block Group 包含的 Block 数量相同,具体是在 SuperBlock 中通过 s_block_per_group 属性定义的(最后一个 Block Group 除外,最后剩下的 Block 数量可能小于 s_block_per_group,这些 Block 会被划分到最后一个 Block Group 中)。dumpe2fs 命令会列出所有的 Block Group 信息,但是在统计信息中却没有说明当前的文件系统中包含有多少个 Block Group。下面是 dumpe2fs 输出的 Block Group 信息的节选:

...
Group : (Blocks -) [ITABLE_ZEROED]
Checksum 0xa22b, unused inodes
Primary superblock at , Group descriptors at -
Reserved GDT blocks at -
Block bitmap at (+), Inode bitmap at (+)
Inode table at - (+)
free blocks, free inodes, directories, unused inodes
Free blocks: -
Free inodes: -
Group : (Blocks -) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0xea71, unused inodes
Backup superblock at , Group descriptors at -
Reserved GDT blocks at -
Block bitmap at (bg # + ), Inode bitmap at (bg # + )
Inode table at - (bg # + )
free blocks, free inodes, directories, unused inodes
Free blocks: -
Free inodes: -
...

Group0 占用从 1 到 8192 号的 block。其中的 Superblock 则在 1 号 block 内。
文件系统描述说明(Group descriptors)占用从 2 到 81 号 block。
Block bitmap 和 Inode bitmap 分别在 338 和 354 号 block 上。
Inode table 占用 370-497 号 block。
Group0 当前可用的 block 号为:2432-8192,可用的 inode 号码为:12-512。
Group 内 inode 数的计算方式:
一个 inode 占用 256 Bytes
Inode 占用的 block 数:497 - 370 + 1 = 128
每个 block 的大小为 1024 Bytes
Inode 数为:128 * 1024 / 256 = 512

Boot Block
每个磁盘分区的开头 1024 字节大小都预留为分区的启动扇区,存放引导程序和数据,所以又叫引导块。引导块在第一个 Block,即 Block 0 中存放,但是未必占满这个 Block,原因是 Block 的大小可能大于 1024 字节。
这里是存放开机管理程序的地方,这是个非常重要的设计。因为这样使得我们能够把不同的开机管理程序安装到每个文件系统的最前端,而不用覆盖整颗磁盘唯一的 MBR,这样就能支持多系统启动了。

Block Group 的组成部分

如上图所示,每个 Block Group 都由下面几个组成部分:

  • Superblock(超级块)
  • Group Description(组描述)
  • Block bitmap(块位图)
  • Inode bitmap(inode 位图)
  • Inode table(inode 表)
  • Data Blocks(数据块)

Superblock(超级区块)
Superblock 是记录整个 filesystem 相关信息的地方,其实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定都包含 superblock,如果包含,也是做为第一个 block group 内 superblock 的备份。superblock 记录的主要信息有:

  • block 与 inode 的总量
  • 未使用与已使用的 inode/block 数量
  • block 与 inode 的大小(block 为 1,2,4K,inode 为 128 Bytes 或 256 Bytes)
  • filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
  • 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0,若未被挂载,则 valid bit 为 1

Superblock 的大小为 1024 Bytes,它非常重要,因为分区上重要的信息都在上面。如果 Superblock 挂掉了,分区上的数据就很难恢复了。可以使用 dumpe2fs 命令查看 分区的 Superblock 信息,如果添加选项 -h,dumpe2fs 命令则只输出 Superblock 中的信息:

$ sudo dumpe2fs -h /dev/sdd1

Group Description(组描述)
Group Description 用来描述每个 group 的开始与结束位置的 block 号码,以及说明每个块(superblock、bitmap、inodemap、datablock) 分别介于哪一个 block 号码之间。

Block bitmap(区块对照表)
在创建文件时需要为文件分配 block,届时就会选择分配空闲的 block 给文件使用。如何查看 block 是否已经被使用了呢?此时就需要借助于 block bitmap 了。通过 block bitmap 可以知道哪些 block 是空的,因此系统就能够很快地找到空闲空间来分配给文件。同样的,在删除某些文件时,文件原本占用的 block 号码就要释放出来,此时在 block bitmap 当中相对应到该 block 号码的标志就需要修改成"空闲"。这就是 block bitmap 的作用。

Inode bitmap(inode 对照表)
inode bitmap 与 block bitmap 的功能类似,只是 block bitmap 记录的是使用与未使用的 block 号,而 inode bitmap 则记录的是使用与未使用的 inode 号。

Inode table    
Inode table 中存放着一个个 inode,inode 的内容记录文件的属性以及该文件实际数据是放置在哪些 block 内,inode 记录的主要的文件属性如下:

  • 该文件的读写权限(rwx)
  • 该文件的拥有者和所属组(owner/group)
  • 该文件的容量
  • 该文件的 ctime(创建时间)
  • 该文件的 atime(最近一次的读取时间)
  • 该文件的 mtime(最近修改的时间)
  • 该文件的特殊标识,比如 SetUID 等
  • 该文件真正内容的指向(pointer)

inode 的数量与大小也是在格式化时就已经固定了的,另外 inode 还有如下特点:

  • 每个 inode 大小均固定为 128 Bytes(新的 ext4 为 256 Bytes)
  • 每个文件都仅会占用一个 inode
  • 文件系统能够创建的文件数量与 inode 的数量相关
  • 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与使用者是否符合,若符合才能够开始读取 block 的内容

Data block
Data block 是用来存放文件内容的地方,Ext2 文件系统 1K、2K 和 4K 大小的 block。在格式化文件系统时 block 的大小就确定了,并且每个 block 都有编号。需要注意的是,由于 block 大小的差异,会导致文件系统能够支持的最大磁盘容量和最大单个文件的大小并不相同。下表描述了 block 大小与文件系统以及单个文件大小的关系:

此外 Ext2 文件系统的 block 还有下面一些限制:

  • block 的大小与数量在格式化后就不能再改变了(除非重新格式化)
  • 每个 block 内最多只能够放置一个文件的数据
  • 如果文件大于 block 的大小,那么一个文件会占用多个 block
  • 若文件小于 block,则该 block 的剩余容量也不能再被使用了(磁盘空间被浪费)

参考:
鸟哥的私房菜
dumpe2fs man page
Linux ext2, ext3, ext4 文件系统解读[1]
Ext2文件系统简单剖析(一)

Linux EXT2 文件系统的更多相关文章

  1. linux ext2 文件系统学习

    Linux  ext2文件系统理解 硬盘组成: 硬盘由多个圆形硬盘片组成.按照硬盘片能够容纳的数据量分为单盘和多盘.硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头.机械手臂不动硬盘旋转一 ...

  2. Linux ext2文件系统

    Linux最传统的磁盘文件系统(filesystem)使用的是ext2 1.ext2文件系统结构ext2文件系统划分为多个块组,每个块组拥有独立的inode/block,一个文件系统只有一个Super ...

  3. Linux ext2文件系统之初步思考

    数据存放在磁盘中,磁盘最小存取单位sector(512Byte);文件系统中存储的最小单位是 块(Block),大小通常(1KB,2KB,4KB...), 一个block对应多个sector,因而可用 ...

  4. Linux 下EXT2文件系统 —— 如何将蚂蚁和大象优雅的装进冰箱里

    这一阵子真是偷懒,无时无刻不和自己身体中的懒癌做斗争.最终我还是被打败了,星期天两天几乎都是荒废过去的,在空闲的时候实际上我内心也是有点焦虑的,不知道去怎么度过这时间.学习吧又不想学习,看电视娱乐吧也 ...

  5. Linux ext2/ext3文件系统详解

    转载: Linux ext2/ext3文件系统使用索引节点来记录文件信息,作用像windows的文件分配表.索引节点是一个结构,它包含了一个文件的长度.创建及修改时间.权限.所属关系.磁盘中的位置等信 ...

  6. 文件系统的特性,linux的EXT2文件系统【转】

    本文转载自:https://blog.csdn.net/tongyijia/article/details/52809281 先来提出三个概念: - superblock - inode - bloc ...

  7. Linux中ext2文件系统的结构

    1.ext2产生的历史 最早的Linux内核是从MINIX系统过渡发展而来的.Linux最早的文件系统就是MINIX文件系统.MINIX文件系统几乎到处都是bug,采用的是16bit偏移量,最大容量为 ...

  8. Linux磁盘管理——Ext2文件系统

    前言 通常而言,对于一块新磁盘我们不是直接使用,而是先分区,分区完毕后格式化,格式化后OS才能使用这个文件系统.分区可能会涉及到MBR和GPT问题.至于格式化和文件系统又有什么关系? 这里的格式化指的 ...

  9. Linux 文件系统及 ext2 文件系统

      linux 支持的文件系统类型 Ext2:     有点像 UNIX 文件系统.有 blocks,inodes,directories 的概念. Ext3:     Ext2 的加强版,添加了日志 ...

随机推荐

  1. 【过时】Maven简单安装与集成Eclipse

    前言:MyEclipse前期产品对maven支持性不是很好,而且对maven版本要求很严格,集成后有很多问题,所以推荐 使用比较新的IDE进行开发. 1.环境搭建(只是用IDE集成的不需要系统安装,请 ...

  2. Axure中怎么制作锚点

    实现目标 点击导航条不同的菜单,页面跳到菜单相应的位置,实现页面自动滚动. 1.  拖入编辑区3个矩形,并相应命名为菜单1,菜单2 ,菜单3: 2.  再新建3个想要制作的文本框准备进行锚点滚动: 3 ...

  3. python多线程爬取图片实例

    今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题.网址还是那个网址https://www.quanjing.com/category/1286521/1. ...

  4. 用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)

    本人最近在尝试着发表“以股票案例入门Python编程语言”系列的文章,在这些文章里,将用Python工具绘制各种股票指标,在讲述各股票指标的含义以及计算方式的同时,验证基于各种指标的交易策略,本文是第 ...

  5. 【POJ - 1426】Find The Multiple(dfs)

    -->Find The Multiple 原文是英语,直接上中文了 Descriptions: 给定一个正整数n,请编写一个程序来寻找n的一个非零的倍数m,这个m应当在十进制表示时每一位上只包含 ...

  6. 寻觅Azure上的Athena和BigQuery (二):神奇的PolyBase

    前情回顾 在“数据湖”概念与理论逐渐深入人心的今天,面向云存储的交互式查询这个需求场景显得愈发重要.这是因为原生的云存储(主要指S3这样的对象存储)既能够容纳大容量的明细数据,又能在性能和成本间取得一 ...

  7. 关于pcl索引的使用

    最近开始动手做实验,之前写了一个小实验利用到了PCL库中的索引: 现在在写利用PCL中的RegionGrowing类来分割生成面片,无论是迭代生成还是进行提取都需要用到pcl库中定义的索引, 虽然搞的 ...

  8. .Net Core 使用Http请求及基于 Polly 的处理故障

    一.介绍 在IServiceCollection调用AddHttpClient注册IHttpClientFactory服务,调用AddHttpMessageHandler以生成出站请求中间件管道. 每 ...

  9. http接口测试和使用,首先要了解什么是http请求

    http接口测试和使用,首先要了解什么是http请求: http请求通俗讲就是把客户端的东西通过http协议发送到服务端,服务端根据http协议的定义解析客户端发过 来的东西! http请求中常用到的 ...

  10. C语言指针专题——指针怎么就很灵活?

    最近在研读 C Primer pkus(第五版)中文版,老外写的还是很经典的,推荐给朋友们,购买地址:C primer plus 5版中文版购买 另外再推荐两本书: 1. 2017年9月全国计算机二级 ...