在从前关于Linux文件体系的文章中,我很想去深化地评论更多EXT文件体系的特性的信息。所以,首要让咱们来答复这个问题:什么是文件体系?一个文件体系应该遵从以下特色:
1.数据存储:文件体系首要的功用是结构化存储和取回数据。
2.命名空间:供给一套命名和安排的办法,便是命名和结构化数据的规矩。
3.安全模型:一种拜访控制的战略。
4.API:体系控制文件体系方针的函数,就像操作文件夹和文件相同。
5.完结:一个完结以上功用的软件。
这篇文章会集与上面清单的第一项,还有探求元数据结构—在EXT文件体系中供给数据存储的逻辑结构。
EXT文件体系前史
尽管是为Linux编写的,但EXT文件体系起源于Minix操作体系,而Minix文件体系早在1987年初次发布,比Linux还早五年就现已发布了。假如咱们查看EXT文件体系宗族从其Minix根开端的前史和技能演化,就会更简略了解EXT4文件体系。
Minix
当编写原始Linux内核,Linus Torvalds需求一个文件体系,可是不想开发它。因而他简略的运用了Minix文件体系,这是 Andrew S. Tanenbaum开发的,而且是Tanenbaum 的Minix操作体系的一部分。Minix是类Unix操作体系,为教育运用而开发。它的代码敞开运用,而且合理的授权给Torvalds,答应他将它用于Linux的初代版别。
Minix结构如下,其间大部分坐落文件体系生成的分区中:
引导扇区(boot sector)装置于硬盘的第一个扇区。引导块(boot block)包括一个十分小的引导记载和一个分区表。
每一个分区中的第一个块是超级块(superblock),它包括了界说其他文件体系结构的元数据,并将它们定位在分配给分区的物理磁盘上。
节点位图块(inode bitmap block),它确认了哪个节点在运用以及哪个节点是闲暇的。
节点(inodes),它们在磁盘上有它们自己的空间。每个节点包括了一个文件的信息,包括数据块的方位,即文件所属的区域。
区域位图(zone bitmap)盯梢记载数据区域的运用和开释。
数据区域(data zone),数据实践上存储的方位。
关于位图的两个类型来说,一个bit代表了一个特有的数据区域或许一个特有的节点。假如这个bit是0,这个区域或许节点是闲暇的而且可供运用,可是假如这个bit是1,这个数据区域或许节点是在运用中的。
节点是什么?它是索引节点(index-node)的缩写,一个节点是在磁盘上的一个256字节的块,而且它存储文件相关的数据。这些数据包括文件的巨细;文件的用户和所属组的用户ID;文件办法(即拜访权限);以及三个时刻戳详细说明晰时刻,包括:文件最终拜访时刻,最终修正时刻,以及节点中的数据最终修正时刻。
节点也包括了:指向硬盘上文件数据地点的方位。在Minix和EXT1-3文件体系中,它是一个数据区域和块的列表。Minix文件体系节点支撑9个数据块,7个直接指针和2个直接指针。假如你想了解的更多,这有一个很好的PDF详细描绘了Minix文件体系结构,以及在Wikipedia上对节点指针结构的快速概述。
EXT
开端的EXT文件体系(Extended)由Rémy Card编写,并于1992年与Linux一同发布,以躲避Minix文件体系的一些巨细约束。其间首要的结构改变是依据Unix文件体系(UFS)的文件体系元数据,该结构也被称为伯克利快速文件体系(FFS)。我发现很少有关于此EXT文件体系的可讲究的发布信息,明显是因为它存在重大问题,并很快被EXT2文件体系所替代。
EXT2
EXT2文件体系十分成功。它在Linux发行版中被运用了许多年,而且它是我在1997年左右开端运用Red Hat Linux 5.0时遇到的第一个文件体系。EXT2文件体系与EXT文件体系具有根本相同的元数据结构,但EXT2更具前瞻性,因为在元数据结构之间保存许多磁盘空间以供未来运用。
像Minix相同,EXT2在其装置的硬盘的第一个扇区中有一个引导扇区,其间包括一个十分小的引导记载和一个分区表。在引导扇区后边有一些预留空间,它跨过引导记载和硬盘上一般坐落下一个柱面鸿沟上的第一个分区之间的空间。 GRUB2(或许还有GRUB1)运用这个空间作为其发动代码的一部分。
每个EXT2分区中的空间被划分为多个柱面组,能够愈加精细地办理数据空间。 依据我的经历,组巨细一般约为8MB。下面的图1显现了柱面组的根本结构。柱面中的数据分配单元是块,其巨细一般为4K。
图1:EXT文件体系中柱面组的结构
柱面组中的第一个块是一个超级块,它包括界说其他文件体系结构并将其定位在物理磁盘上的元数据。分区中的一些附加组将具有备份超级块,但不是悉数。损坏的超级块能够运用dd等磁盘实用程序将备份超级块的内容仿制到主超级块。它并不常常发生,可是多年前从前有一个受损的超级块,我能够运用其间一个备份超级块来康复其内容。走运的是,我现已预见到并运用dumpe2fs指令转储我体系上分区的描绘符信息。
每个柱面组都有自己的inode位图,该位图用于确认运用哪些inode,以及该组中哪些是闲暇的。inode在每个组中都有自己的空间。每个inode都包括有关一个文件的信息,包括归于该文件的数据块的方位。块位图盯梢文件体系中运用和开释的数据块。留意,上面显现的输出中有许多关于文件体系的数据。在很大的文件体系中,组数据能够长达数百页。组元数据包括组中一切闲暇数据块的列表。
EXT文件体系完结了确保文件碎片最小化的数据分配战略。削减磁盘碎片化可改进文件体系的功用。这些战略将在下文的EXT4部分中进行介绍。
在某些情况下,我曾遇到的EXT2文件体系的最大问题是在溃散后或许需求几个小时才干康复,因为fsck(file system check)程序需求很长时刻才干找到并纠正文件体系中的任何不一致。它曾在我的一台核算机上花费了28个小时的时刻,以完结在发生溃散到从头发动时彻底康复磁盘 -而且这是在磁盘巨细为数百兆字节下测验的成果。
EXT3
EXT3文件体系的仅有方针是战胜fsck程序需求许多时刻来彻底康复因文件更新操作期间发生的不正确封闭而损坏的磁盘结构的问题。EXT文件体系的仅有添加是journal,它预先记载了将对文件体系履行的改动。磁盘结构的其他部分和EXT2中是相同的。
EXT3中的journal并不是直接将数据写入磁盘的数据区域,而是将文件数据及其元数据写入到磁盘上的指定区域。一旦数据安全地存储在硬盘上,它就能够合并到方针文件或附加到方针文件中,而这简直不会丢掉数据。因为该数据被提交到磁盘的数据区域,因而需更新journal以便在发生体系故障时文件体系保持一致情况,然后该journal中的一切数据都被提交。在下次发动时,将查看文件体系是否存在不一致性,然后将journal中剩下的数据提交到磁盘的数据区域以完结对方针文件的更新。
日志化的确会下降数据写入功用,但journal供给了三种选项可供用户在功用,数据完整性和安全性之间进行挑选。我的个人偏好是安全性,因为我的环境不需求深重的磁盘写入操作。
日志函数最多能够削减在查看硬盘驱动发现不一致性所需的时刻:从几小时(乃至几天)到几分钟不等。多年来,我遇到了许多导致体系溃散的问题。个中细节能够填满另一篇文章,但足以证明大多数是自我原因形成的,就像踢掉电源插头相同。走运的是,EXT日志化文件体系已将发动康复时刻缩短到两三分钟。别的,自从我开端运用带日志功用的EXT3以来,我从来没有遇到丢掉数据的问题了。
EXT3的日志功用能够封闭,然后作为EXT2文件体系运转。日志功用自身依然存在,它是空的而且是未运用的。只需运用mount指令从头挂载分区,运用type参数指定EXT2。您能够在指令行中履行此操作,这取决于您运用的是哪个文件体系,可是您能够更改/etc/fstab文件中的类型说明符,然后从头发动。我强烈主张不要将EXT3文件体系作为EXT2运用,因为或许会丢掉数据并延伸康复时刻。
现有的EXT2文件体系能够经过运用以下指令添加日志来升级到EXT3。
tune2fs -j /dev/sda1
其间/dev/sda1是驱动器和分区标识符。确保在/etc/fstab中更改文件类型说明符,并从头发动分区或从头发动体系以使更改收效。
EXT4
EXT4文件体系首要改进了功用,可靠性和容量。为了进步可靠性,添加了元数据和日志校验和。为了完结各式各样的要害使命的需求,文件体系时刻戳将时刻距离准确到了纳秒。时刻戳字段的两个高位bit将2038年问题接连到了2446年——至少为EXT4文件体系接连了。
在EXT4中,数据分配从固定块变成了扩展块。一个扩展块经过它在硬盘上的开端和完毕方位来描绘。这使得在一个单一节点指针条目中描绘十分长的物理接连文件成为或许,它能够明显削减大文件中的描绘一切数据的方位的所需指针的数量。为了进一步削减碎片化,其他分配战略现已在EXT4中完结。
EXT4经过在磁盘上涣散新创立的文件来削减碎片化,因而他们不会像前期的PC文件体系,集合在磁盘的开端方位。文件分配算法测验尽量将文件均匀的掩盖到柱面组,而且当不得不发生碎片时,尽或许地将接连文件规模接近同一个文件的其他碎片,来尽或许紧缩磁头寻觅和旋转等待时刻。当一个新文件创立的时分或许当一个已有文件扩展的时分,附加战略用于预分配额定磁盘空间。它有助于确保扩展文件不会导致它直接变为碎片。新文件不会直接分配在已存在文件的后边,这也阻挠了已存在文件的碎片化。
除了数据在磁盘的详细方位,EXT4运用一些功用战略,例如推迟分配,答应文件体系在分配空间之前先收集到要写到磁盘的一切数据。这能够进步数据空直接连的概率。
之前的EXT文件体系,例如EXT2和EXT3,能够挂载EXT4,来进步一些非有必要功用。不幸的是,它要求关掉一些EXT4的重要的新特性,因而我不主张这种做法。
从Fedora 14开端,EXT4现已是Fedora的默许文件体系。运用在Fedroa文档描绘的进程,一个EXT3文件体系能够升级到EXT4,可是因为剩下的EXT3元数据结构,它的功用依然会受到影响。从EXT3升级到EXT4最好的办法是备份一切的方针文件体系分区的数据,运用mkfs指令将一个空的EXT4文件体系写到分区,然后从备份康复一切数据。
节点(Inode)
在之前描绘过,节点是一个EXT文件体系的元数据的要害要素。图2展现了节点和存储在硬盘上的数据之间的联系。这个示意图是目录和单一文件的节点,在这种情况下,或许是高度碎片化文件的节点。EXT文件体系为削减碎片化而活跃尽力,因而你不会看到有许多直接数据块或许数据区的文件。事实上,就像你将在下面看到的,碎片化在EXT文件体系中十分罕见,因而大多节点会只用一个或许两个直接数据指针而且不运用直接指针。
图2:节点存储了关于每个文件的信息和EXT文件体系对一切归于它的数据的定位。
节点不包括文件的称号。经过目录项(directory entry)来拜访文件,它自己便是文件的称号而且包括指向此节点的指针。指针的值是节点号。每个文件体系中的节点都有一个仅有的ID号,可是在同一个电脑(乃至同一个硬盘)的其他文件体系中的节点能够有相同的节点号。这会对硬衔接发生一些成果,这方面内容超出了本文的规模。
节点包括了文件的元数据,包括它的类型和权限以及它的巨细。节点也包括了15个指针的空间,来描绘柱面组中数据部分中的数据块或数据区的方位和长度。12个指针供给了数据区的直接拜访,而且对处理大部分文件都是满足的。可是,关于有许多碎片的文件,它或许有必要需求一些额定的空间,以直接节点的办法描绘。从技能上来讲,它们不是真实的节点,因而为了便利我运用短语“直接节点(node)”。
直接节点是文件体系中一个惯例的数据块,只用于描绘数据而且不必存储元数据,因而能够支撑超越15个指针。例如,一个巨细为4K的块能够支撑512个4字节直接节点,答应一个单一文件包括12(直接)+512(直接)=524个区。相同也支撑两层或三重直接节点,可是咱们一般不太或许遇到需求这么多区的文件。
数据碎片
关于许多陈腐的PC文件体系(比如FAT(及其一切变体)和NTFS),碎片化一直是导致磁盘功用下降的首要问题。碎片收拾自身就成为一个职业,包括不同品牌的碎片收拾软件,其效果从十分有用到体现平平。
Linux扩展文件体系运用的数据分配战略,有助于最大极限地削减硬盘驱动器上文件的碎片,并在碎片发生时削减碎片效应。你能够在EXT文件体系上运用fsck指令来查看整个文件体系的碎片。以下示例查看我的主作业站的主目录,该目录仅有1.5%碎片化。请有必要运用-n参数,因为它能够避免fsck对所扫描的文件体系履行任何操作。
fsck -fn /dev/mapper/vg_01-home
我从前进行过一些理论上的核算,以确认磁盘碎片收拾是否会导致功用明显进步。尽管我的确做了一些假定,但我运用的磁盘功用数据来自新的300GB,Western Digital硬盘,具有2.0ms的磁轨间寻址时刻。本例中的文件数量是我在核算当天存在于该文件体系中的实践数量。我的确假定每天都会触发适当多的碎片文件(20%)。
表1: 碎片化对磁盘功用的理论上的影响
我现已做了两次测算,每天总的附加寻址时刻,一次是依据磁轨间寻址时刻,这是因为EXT文件分配战略而导致大多数文件更或许呈现的情况,另一种是均匀寻址时刻,我假定这会触发适当于最坏的景象。
从表1能够看出,关于具有适当功用的硬盘驱动器的现代EXT文件体系来说,碎片化影响最小;对绝大多数应用程序来说能够忽略不计。你能够将实践环境中的数据刺进到你自己的相似电子表格中,以得到你对功用影响的预期。这种核算办法很或许不会代表实践功用,但它能够供给对碎片话及其对体系的理论上的影响的一些洞察力。
我的大部分分区大约1.5%或1.6%碎片化;我的确有一个3.3%碎片化的分区,但这是一个大的,128GB的文件体系,具有少于100个十分大的ISO映像文件;多年来,我不得不屡次扩展此分区,因为它太满了。
这并不是说某些应用程序环境不需求更少的碎片文件的确保。EXT文件体系能够由常识广博的办理员进行调整,他们能够调整参数以补偿特定的作业负载类型。这能够在文件体系被创立时或之后运用tune2fs指令来完结。应对每次调优改动的成果进行测验,详尽地记载并进行剖析,以确保对方针环境到达最佳功用。在最差的情况下,假如功用无法进步到所需的水平,则或许有更适合特定作业负载的其他文件体系类型。请记住,在单个主机体系上混用文件体系类型以匹配每个文件体系上的负载是很常见的。
因为在大多数EXT文件体系中碎片数量很少,因而不需求进行碎片收拾。无论如何,EXT文件体系都没有安全的碎片收拾东西。现在有几个东西能够让你查看单个文件的碎片情况或文件体系中剩下闲暇空间的碎片化情况。有一个东西,e4defrag,它将在可用空间答应的前提下对文件、目录或文件体系进行尽或许地碎片化收拾。望文生义,它只适用于EXT4文件体系中的文件,而且存在一些局限性。
假如有必要对EXT文件体系履行彻底的碎片收拾,则仅有一种办法能够可靠地作业。你有必要移动文件体系中的一切文件以进行碎片收拾,以确保在将文件安全仿制到其他方位后将其删去。假如或许的话,你能够添加文件体系的巨细来辅佐削减将来的碎片发生。然后将文件仿制回方针文件体系。即便这样做并不能确保一切的文件都会被彻底去碎片化。
定论
20多年来,EXT文件体系一直是许多Linux发行版的默许文件体系。它们需求少数的保护就能供给稳定性、高容量、可靠性和功用。我测验过其他文件体系,但总是回到EXT。毫无疑问,EXT4文件体系应该用于大多数Linux体系,除非有令人信服的理由去运用另一个文件体系。