Linux Ext2fs文件系统分析

时间:2022-09-17 03:43:52

Linux Ext2fs文件系统分析

摘要:该文介绍了Linux的文件结构、基本概念,对Linux Ext2fs文件系统的“标准”功能、“高级”功能、物理结构、系统库进行简单的分析,可以使Linux用户在较短的时间内,了解Linux Ext2fs文件系统。

关键词:Linux;Ext2fs文件系统;分析

中图分类号:TP391文献标识码:A文章编号:1009-3044(2010)17-4637-03

Linux Ext2fs File System Analysis

ZHANG Yuan-yuan

(Datong Coal Information Technology Engineering, Datong 037000, China)

Abstract: IThis paper introduces the Linux file structure, basic concepts, the file system on Linux Ext2fs "standard" function, "Advanced" function, physical structure, a simple analysis of system libraries, you can make Linux users in a short time, about Linux Ext2fs file system.

Key words: Linux; Ext2fs file system; analysis

1 Linux文件结构

文件结构是文件存放在磁盘等存储设备上的组织方法。象MS-DOS一样,在Linux系统中,文件由目录结构来组织。然而,与MS-DOS不同的是,Linux的文件系统有更大的灵活性,整个Linux的文件系统是一套大的相互关联的目录。其中有些目录是系统保留的标准目录,每个目录里面都包含文件。用户可以为自己的文件创建自己的目录,也可以把一个目录下的文件移动或复制到另一个目录下,而且能移动整个目录,并且和系统中的其他用户共享目录和文件。

在Linux中,用户可以设置目录和文件的权限,以便允许或拒绝其他人对其进行访问。Linux目录采用多级树形结构,图1表示了这种树形等级结构。用户可以浏览整个系统,也可以进入任何一个已授权进入的目录,访问那里的文件。

文件结构的相互关联性使共享数据变得容易,几个用户可以访问同一个文件。Linux是一个多用户系统,操作系统本身的驻留程序存放在以根目录开始的专用目录中,有时被指定为系统目录。

内核、Shell和文件结构一起形成了Linux基本的操作系统结构。

2 Linux文件系统的基本概念

在Linux文件系统中采用了一套从UNIX操作系统继承下来的基本概念:它的每个文件都是使用i-node来标识的;而目录实际上也是一个简单的文件,只不过它是包含着一组记录项或设备文件名。

2.1 i-node

在Linux文件系统中,每个文件都用一个数据结构来表示,这就是i-node。每个i-node包含了描述一个文件所必需的全部信息:文件类型、访问权限、文件所有者、时间戳、文件大小、指向数据块的指针,分配给一个文件的数据块的内存地址也被存放在i-node 中。当用户请求对一个文件进行操作时,Linux的内核完成必要的转换工作,得到指向该文件数据块地址的指针,然后利用这个指针对该文件的物理块进行读写操作。i-node中的指针又分为直接指针和间接指针。图2描述了一个i-node的结构。

2.2 目录(Directories)

在Linux文件系统中,目录被组织成一个层次结构的树。每个目录可以包含若干文件或子目录。

目录是作为一种特殊类型的文件被实现的,实际上,一个目录是包含了一系列记录项的文件。其中,每条记录项包含有一个i-node号和相应的文件名。当某个进程需要某个路径名或文件名,Linux的内核将在目录中进行检索,找到相应的i-node号(相当于做了从名字到i-node的转换),并把该i-node装载进内存,这样,以后都通过对该i-node的操作来实现对该文件的修改。图3描述了一个目录的结构。

2.3 链接(Links)

1) 硬连接(Hard links)

UNIX文件系统实现了链接(Links)的概念:若干个文件名可以与同一个i-node相关连(即它们实质上代表同一个文件实体)。而且,在i-node中用一个域来记录总共有多少个文件与自己相关连。新创建一个链接文件也非常简单,仅需把它的i-node号指向该i-node,同时该i-node链接计数器的值被加1。另一方面,删除一个链接文件的时候(例如用rm命令),系统不仅将该链接文件删除,而且把该i-node的连接计数器的值减1。如果其值最终等于0的话,该i-node将被释放,(因为这时它已经不再代表任何有意义的文件实体了)。这样的连接类型被称为硬链接(Hard links)。Hard links有一些严格的限制:不能跨不同的文件系统来创建;只能创建常规文件的链接而不能创建对目录的链接。

2) 符号链接(Symbolic links)

它是仅有文件名的一个链接文件。符号链接并不真正指向一个i-node,因此,可以创建跨不同文件系统的链接。符号链接可以是任何类型的文件,甚至是不存在的文件。当系统对一个符号链接进行操作时,先做名字转化,找到真正的i-node,然后对i-node进行操作。

2.4 设备特殊文件(Device special files)

在UNIX操作系统中,设备一般都是通过特殊的文件被访问。一个设备特殊文件不占用文件系统的任何空间,它只是访问某个设备驱动程序的入口。

有两类特殊文件:面向字符的特殊文件和块(block)特殊文件。前者允许I/O操作以字符的形式进行,后者通过内存缓冲区来使数据的读写操作以数据块的方式实现。当需要对特殊文件进行I/O操作时,该操作被转给相应的(伪)设备驱动程序。一个特殊文件是用主设备号(指出设备类型)和从设备号(指出是该类型中的第几个设备)来表示的。

3 Linux Ext2fs 文件系统

3.1 出现的原因

Ext2fs文件系统是为了解决Extfs文件系统中的一些问题而设计的。目的是提供一个强大的文件系统,既实现UNIX文件系统的风格,又提供一些先进的功能。

当Linus Torvalds最早开始实现Linux操作系统时,使用的是现成的Minix文件系统。但由于Mininx 文件系统的功能实在有限,Linux开发人员很快就开始考虑使用一个全新的文件系统。为了使新的文件系统更容易集成到Linux内核中去,首先在Linux内核中引入了一个中间层:“虚拟文件系统”(VFS, Virtual File System)。在此基础上,一个全新的文件系统产生了,这就是“扩展文件系统”(Extfs, Extended File Syetem),它于1992年4月被加入到Linux 0.96c内核中。新的文件系统改善了原来的Minix文件系统的局限:允许文件系统的最大长度可以达到2G字节,支持文件名最长可以为255个字符。但它仍然存在着缺陷:如不支持对i-node 的修改;使用链表来记录自由块(block)和i-node,导致其性能很差,并随着文件内容被增加、删除、修改,指向文件的链表会变得越来越无序、混乱,造成文件系统产生大量的碎片(fragment)。为了解决这些问题,Linux开发人员在Extfs文件系统的基础上,经过重新组合和多次修改,产生了Ext2fs文件系统。现在,Ext2fs文件系统已经成为事实上的Linux文件系统的标准,它已经变得非常稳定可靠。

3.2 Ext2fs文件系统的“标准”功能

Ext2fs文件系统支持标准UNIX文件类型:常规文件、目录文件、设备文件和符号链接。

Ext2fs文件系统可以管理在特别大的分区上创建的文件系统。从前内核代码限制了文件大小为2G,但目前VFS方面的工作把这个限制提高到4TB,现在可以使用大磁盘而不必划分多个分区。

Ext2fs文件系统提供长文件名支持。而且它使用变长的目录表项。文件名最大长度为255个字符,如果需要,可以增加到1012个字符。

Ext2fs文件系统为超级用户保留一些数据块,一般来说,5%的数据块保留下来,这使得系统管理员在用户进程占满整个文件系统的情形下,仍然可以简单地恢复整个系统。

3.3 Ext2fs文件系统的“高级”功能

除了标准的UNIX功能,Ext2fs文件系统支持那些在一般UNIX文件系统中所没有的功能。

用户可以设置某个文件或文件系统的属性。对目录而言,在目录下创建的新文件继承这些属性。

有一个选项可供系统管理员在文件系统装载时选择文件创建风格。

系统管理员可以使用要求在meta数据(i-node、位图块、间接数据块和目录数据块)更新时同步写入磁盘的选项。这在保持meta数据的严格一致性是十分有用,但会降低性能。

Ext2fs文件系统允许系统管理员在创建文件系统时选择逻辑数据块的大小。数据块的大小一般为1024、2048或4096个字节。使用较大的数据块可以加速输入/输出,因为要访问的一个文件所需的输入/输出请求会减少,使得磁头寻址次数减少。但另一方面较大的数据块会浪费磁盘空间。平均来说,文件的最后一个数据块只利用部分的空间,也就是说数据块越大,每个文件浪费的磁盘空间也越大。

Ext2fs文件系统实现了快速符号链接。一个快速符号链接并不使用文件系统中的任何数据块。链接的对象名不是存储在数据块中,而是由i-node本身存储。这个策略可以节省磁盘空间,同时也会加速链接操作。当然,由于i-node的空间有限,这就限制了不可能每个链接均是快速符号链接。一个快速符号链接的目标指示名称长度不能超过60个字符。

Ext2fs文件系统记录文件系统的状态。超级数据块中的某个域是内核代码用来表示文件系统的状态。如果一个文件系统加载的模式是可读/写,它的状态被设置为“not clean”,如果一个文件系统加载时模式是只读,它的状态是“clean”。在系统启动时,文件系统检查机制将使用这个记录决定是否要对文件系统进行检查。内核还记录文件系统的错误,如果有错误,启动时将对系统进行检查而不论此时文件系统的状态是否为“clean”。

Ext2fs文件系统提供两种定期强迫进行文件系统检查的方法。因为总是跳过文件系统检查是危险的,所以Ext2fs文件系统在超级数据块中保留了一个加载计数器,每次文件系统以可读/写方式加载,该计数器的值将增加,在这个数达到一定值时将强迫进行文件系统检查;最近一次系统检查时间和最大检查时间间隔也记录在超级数据块中,在最大时间间隔达到时,检查机制将忽略系统状态,强行进行文件系统的检查。

Ext2fs文件系统提供更改两种文件系统检查方式的工具-tune2fs程序。它可以修改:

1) 出错行为。在内核检查到文件系统中的不一致时,文件系统被标记为“erroneous”,并进行下面三种操作:a) 继续执行正常的程序;b) 把文件系统按只读模式进行重新加载以避免整个文件系统的损坏;c) 重新启动文件系统。2) 最大加载计数器;3) 最大检查间隔;4) 为超级用户保留逻辑数据块的数目。

Ext2fs文件系统允许用户安全删除文件。删除文件时,在用来分配给该文件的数据块中将被写入随机数据,以防止怀有恶意的人访问这些内容

4 Ext2fs文件系统的物理结构

一个Ext2fs文件系统是由若干个块组(block groups)构成的,其物理结构如图4所示。

图4所示的每个块组(Block Group i)都包含着它所属的文件系统的重要控制信息的一份拷贝(超级块和文件系统描述符),以及文件系统的一部分(块位图(bitmap)、i-node位图、一个i-node表和真正的数据块)。可以用表1来表示一个块组的结构。

使用块组增强了Ext2fs文件系统的可靠性:文件系统的控制信息在每个块组中都有一份拷贝,这样,当文件系统由于意外的原因而崩溃的时候,可以很容易地恢复它。

使用块组极大地提高了文件系统的性能:由于在一个块组内部,i-node表与数据块的位置很近,这样,在对文件进行I/O操作时,减少了硬盘磁头移动的距离。

在Ext2fs文件系统中,目录是由一系列变长记录所组成的一个链表。每个记录项包括:i-node号、本记录项的长度、文件名、文件名的长度。由于使用的是变长的记录项,这样一方面可以在目录中使用长文件名,另一方面也不会浪费磁盘空间。一个目录的记录项的具体结构如表2所示。

表3是一个目录的实例,该目录有三个文件:file、long_file_name、f2。

5 Ext2fs的系统库

为了让那些运行在用户模式下的程序能够对Ext2fs文件系统进行操作,Linux提供了libex2fs程序库。该库由一些例程(routines)组成,可以被用于检查和修改Ext2fs文件系统的数据。另外,Ext2fs系统库通过软件抽象技术实现了最大可能的代码重用。

许多Ext2fs中的工具(mke2fs、e2fsck、tune2fs、dumpe2fs、debugfs)都使用了系统库。这样,最大程度地简化了对上述工具的维护工作。如果想为Ext2fs文件系统增加新功能,只需一次性地修改系统库中的某个例程。由于Ext2fs的库例程可以用共享程序来实现,因此,系统的可执行代码要非常精炼。

由于Ext2fs的库的接口非常抽象而且通用,编写一个直接访问Ext2fs文件系统的新程序变得非常简单。

Ext2fs的系统库函数提供了几种操作类型:

1) 面向文件系统的操作:一个程序可以打开和关闭一个文件系统、读写位图(bitmaps)、在磁盘上创建一个新文件系统。

2) 对目录的操作:通过对Ext2fs文件系统的调用,可以创建和扩展目录、增加和删除目录项。此外,库函数提供了文件名和i-node号之间的双向转换,已知文件的路径名得到其对应的i-node号以及已知i-node号返回相应的路径名。

3) 面向i-node的操作:支持对i-node表的查询、读写i-node、扫描某个i-node中所有的数据块。此外,分配和回收例程,用于在用户模式下运行的应用程序分配和释放数据块和i-node。

上一篇:浅析计算机网络安全防护 下一篇:软件设计模式浏览器的UML模型