ext2文件系统

article/2025/10/14 16:59:42

ext2是Linux早期比较流行的文件系统,很多文件系统(NTFS、FAT32等)的设计都源自于它。只要掌握了ext2文件系统,其他文件系统大同小异。

ext2文件系统的布局如下:

文件系统中存储的最小单位是块(Block),一个块究竟多大实在格式化时确定的,例如mke2fs的-b选项可以设定块大小为1024、2048或4096字节。

启动块(Boot Block)

大小就是1kB,由PC标准规定,用来存储磁盘分区的信息和启动信息,任何文件系统都不能使用该块。(如果这个块损坏,整个文件系统也就启动不起来了)。

超级块(Super Block)

描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。超级块在每个块组的开头都有一份拷贝。

块组描述符表(GDT,Group Desctriptor Table)

由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,包括inode表哪里开始,数据块从哪里开始,空闲的inode和数据块还有多少个等。块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,因此它们都有多份拷贝。

块位图(Block Bitmap)

块位图就是用来描述整个块组中哪些块已用哪些块空闲的,本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用。

inode位图(inode Bitmap)

和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用。

inode表(inode Table)

文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等信息存在inode中,每个文件都有一个inode。

数据块(Data Block)

        常规文件:文件的数据存储在数据块中。

        目录:该目录下的所有文件名和目录名存储在数据块中。(注意:文件名保存在它所在目录的数据块中,其他信息都保存在该文件的inode中)。

        符号链接:如果目标路径名较短则直接保存在inode中以便更快地查找,否则分配一个数据块来保存。

        设备文件、FIFO和socket等特殊文件:没有数据块,设备文件的主设备号和次设备号保存在inode中(用ls -al  /dev查看该目录下的设备文件时,可以发现原来打印文件大小的位置,换成了主次设备号)。通过设备号,系统会去找它的驱动,然后运行起来。

对于一个文件来说,除了它的数据保存在数据块中,其他信息都保存在自己的inode表中。比较邪门的是,inode表和数据块都不保存文件的名字,它的名字保存在目录的数据块中(当然目录也有自己的inode表),这也就是执行vim .命令时,看到的是当前目录下的文件名和目录名的原因。在这些文件名或目录名前面,存储着找到这些文件或目录的inode地址(其中.前面存储的就是这个目录自己的inode地址,..存储它上一级目录的inode地址),而inode表里又存储着文件或目录数据块的起始地址和长度等信息。这样反复横跨inode表和数据块,来寻找最终的文件内容。

对于目录来说,目录的数据块中存储的就是文件名及其这些文件名的inode地址。

其他文件系统会通过虚拟文件系统的方法,凑出和ext2相同的东西,这个其实就可以称为协议了。

假设一个路径是/opt/file,则查找顺序是:

1.读出inode表中第2项,也就是根目录的inode,从中找出根目录数据块的位置

2.从根目录的数据块中找出文件名为opt的记录,从记录中读出它的inode号

3.读出opt目录的inode,从中找出它的数据块的位置

4.从opt目录的数据块中找出文件名为file的记录,从记录中读出它的inode号

5.读出file文件的inode

关于软硬链接:

软链接:

$ ln -s ./text.txt ts        //ts是./test.txt的软连接(ts -> ./test.txt),假设text.txt有6个字节,ttt却有10个字节,说明ts中存储的是./text.txt这10个字节(存储的是路径),也说明软连接出来的文件,和原文件是两个完全不同的文件

硬链接:

$ ln ./text.txt tl        //tl是./test.txt的硬连接。建立完硬连接后,text.txt文件的硬连接数加1,即inode表中还存储了它的硬连接数(有几个文件名,就有几个硬连接数)。text.txt和tl是完全相同的文件,是相同的inode表。

$ mkdir -p a/b        //在当前目录下,建立a目录,a目录下建立b目录。b的硬连接数是2,这是因为a目录下的b,b目录下的.都指向目录b的inode表(创建一个目录,至少是2个硬连接);a的硬连接数是3,因为a目录下的.,b目录下的..,a的父目录下的a。


http://chatgpt.dhexx.cn/article/CbsRKZ6K.shtml

相关文章

文件系统系列专题之 Ext2/3/4

一、Ext概述 EXT是延伸文件系统(Extended file system,缩写为 ext或 ext1),也译为扩展文件系统,第 1 个扩展文件系统(ext1)由 Remy Card 设计,并于 1992 年 4 月引入到 Linux 中。采…

深入理解ext2文件系统

ext2文件系统需要考虑哪些因素: 1.最重要的是保证数据的安全性。 2.效率,方便文件的查找读写。 3.文件在磁盘空间占用空间小。 (1)树形目录结构 EXT文件系统采用一个独立的顶级树形目录架构(即所有一切都从root根目录开始&…

学习篇 | LINUX 内核的文件系统 -- ext2

引言: 本篇博客中主要讲述的是 LINUX 内核所用的文件系统 —— 第二代扩展文件系统 Ext2,Ext2是数个Linux发行版本的默认文件系统。 百度百科 -- ext2 目录 引言: Ext2 文件系统 磁盘的物理组成 ext2 文件系统的格式 ext2 文件系统目录…

ext2文件系统详解

第一部分磁盘的物理组成 磁盘的基本概念: 扇区为最小的物理存储单位,每个扇区为512字节。 将扇区组成一个圆,那就是柱面,柱面是分区的最小单位。 第一个扇区很重要,里面有硬盘主引导记录(Masterbootrecord…

编译原理——证明文法具有二义性

证明一个文法具有二义性我们需要掌握两个知识点。 1.语法分析树 定义很简单,就是把一个句型的推导写成树的形式,这种表示法就叫语法分析树,或者简称为语法树。大概是这个样子的 2.二义性 一个文法存在某个句子对应两棵不同的语法树&…

二义性文法的理解和消除方法

给定文法G,如果存在句子s,它有两棵不同的分析树,那么称G是二义性文法 从编译器角度,二义性文法存在问题: 同一个程序会有不同的含义 因此程序运行的结果不是唯一的 一个句子有多于一棵分析树,仅与文法和句子…

2.5.3 文法二义性的消除

2.5.3 文法二义性的消除 (1 )不改变文法中原有的语法规则,仅加进一些语法的非形式规定。 例如,对于上例文法 G [ E ],不改变已有的 4 条规则,仅加进运算符的优先顺序和结合规则,即 * 优先于 ; , * 服从左结合。这样,对于文法 G [ E ]中的句子 i * i i 只有唯一的一棵语法树…

C#调用方法时的二义性解决方法

如图中出现的错误: 里面有三个名字为SetCurrentSelectableObject的方法,其中两个的参数都是引用对象,一个是SelectableObject类型,一个是string类型,这样导致引用出现了二义性,解决的办法就是对null进行强制…

[编译原理]如何判断某文法的二义性以及找到文法对应的语言

随便说说 这学期开编译原理课了,觉得还挺有意思的,写点博客记录记录。 如何根据文法找到其对应生成的语言 如图所示,假设我们现在有文法如下: ::�(�):�−>…

证明文法的二义性

例题 证明下面的文法是二义性的: S→ S A S | ( S ) | i A→ | * 证明步骤如下图 (是我自己做的所以不是很严谨) 证明文法二义性的过程 可以自己定义一个句型,我定义的是SS*S,偷了个小懒没有用到(S&…

C++ 多继承的二义性问题

多继承中的二义性问题 在一个表达式中,对函数或变量的引用必须是明确的,无二义性的。对于一个独立的类而言,其成员的标识是唯一的,对其访问不会有二义性问题。但是当类之间具有继承关系时,子类成员可能与父类成员重名&…

C++多继承中的二义性问题

在C中,派生类继承基类,对基类成员的访问应该是确定的、唯一的,但是常常会有以下情况导致访问不一致,产生二义性。 1.在继承时,基类之间、或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性——…

二义性文法和无二义性文法

二义性文法是指一种产生式规则可以被解释成两种或更多种不同的语法结构的文法。这种文法会导致语言的歧义和不确定性,使得相同的语句可以有不同的解释。 以下是三个例子: S → aSb | ε 这个文法可以生成字符串"aaabbb",但是它有两…

如何消除文法的二义性

文法举例 显然,对于not p and q有两种推导方式 默认not优先级高于and,即(not p) and q 默认and优先级高于 not,即not(p and q) 先and再not先not再and 两种消除二义性的方法 简单来说,就是人为规定not\and\or的优先级即可 重写的文法相当于默…

C++多继承中二义性的解决方案

出现二义性的原因: 派生类在访问基类成员函数时,由于基类存在同名的成员函数,导致无法确定访问的是哪个基类的成员函数,因此出现了二义性错误。 1. 什么是多重继承的二义性 class A{ public:void f(); }class B{ public:void f(…

编译原理——证明文法的二义性(1)

目录 推导和语法树推导语法树 文法二义性 在证明文法的二义性之前,我们需要熟悉几个基本的概念。 推导和语法树 推导 这里的推导,简单的来说就是指根据给出的句型(句子),对文法进行推理变化最终得到句型&#xff08…

二义性

自然语言的二义性什么意思 面这个问题.很清楚的说明了自然语言的二义性.. 用红墨水写一个“蓝”字,请问,这个字是红字还是蓝字? 可能很少有人意识到,像红字和蓝字这样的词语都存在着二义性。可能是红色的字,也可能是“…

2.5.2 文法的二义性

2.5.2 文法的二义性 设有文法 G [ E ]: E → E E | E * E | ( E ) | i句子 i * i i 有两个不同的最左推导,对应两棵不同的语法树,见图 2.6 和图 2.7 。 最左推导 1 E ⇒ E E ⇒ E * E E ⇒ i * E E⇒ i * i E⇒ i * i i 最左推导 2 E ⇒ E * E ⇒ i * E⇒ i * E E⇒…

编译原理(三)语法分析:3.二义性与二义性的消除

文章目录 一、二义性1.定义2.原因 二、二义性的消除1.改写二义文法为非二义文法(1)步骤(2)例子(3)缺点 2.为文法符号规定优先级和结合性3.修改语言的语法(表现形式被改变) 【编译原理…