Linux文件系统
一、文件系统的概念
操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。
文件系统由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。
从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行
保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存
取,当用户不再使用时撤销文件等。
文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也
指用于存储文件的磁盘或分区,或文件系统种类。
磁盘或分区和它所包括的文件系统的不同是很重要的。少数程序(包括最有理由的产生文件系统的程序)直
接对磁盘或分区的原始扇区进行操作;这可能破坏一个存在的文件系统。大部分程序基于文件系统进行操
作,在不同种文件系统上不能工作。
一个分区或磁盘能作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上,这个过程就叫建立文件系统。
二、Linux中常见的ext、ext2、ext3、ext4文件系统
ext是第一个专门为linux开发的文件系统类型,叫做扩展文件系统。由于其在稳定性、速度和兼容性上存
在许多缺陷,现在已经很少使用。
ext2是为解决ext文件系统的缺陷而设计的可扩展的、高性能的文件系统,它又被称为二级扩展文件系统。
它是Linux文件系统类型中使用最多的格式,并且在速度和CPU利用率上较为突出,是GNU/Linux系统中
标准的文件系统。它存取文件的性能极好,对于中、小型的文件更显示出优势。
ext3是一种日志式文件系统,是对ext2系统的扩展,它兼容ext2。
日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,
以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部shutdown后
才能进行关机。如果在文件系统尚未shutdown前就关机如(停电)时,下次重开机后会造成文件系统
的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,此一重整的工
作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。
为了克服此问题,使用所谓“日志式文件系统 (Journal File System)” 。此类文件系统最大的特色是,
它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。由于资料的写入
动作包含许多的细节,像是改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等,每一个
细节进行到一半若被中断,就会造成文件系统的不一致,因而需要重整。
然而,在日志式文件系统中,由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据
这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,
几乎不需要花时间。
由于ext3文件系统多了日志的记录,对于系统的恢复比较快速,因此建议你务必要选择新的ext3而不要用ext2。
ext3日志文件系统的特点:
1、高可用性
系统使用了ext3文件系统后,即使在非正常关机后,系统也不需要检查文件系统。
宕机发生后,恢复ext3文件系统的时间只要数十秒钟。
2、数据的完整性
ext3文件系统能够极大地提高文件系统的完整性,避免了意外宕机对文件系统的破坏。在保证数据完整性方面,
ext3文件系统有2种模式可供选择。其中之一就是“同时保持文件系统及数据的一致性”模式。采用这种方式,
你永远不再会看到由于非正常关机而存储在磁盘上的垃圾文件。
3、文件系统的速度
尽管使用ext3文件系统时,有时在存储数据时可能要多次写数据,但是,从总体上看来,ext3比ext2的性能
还要好一些。这是因为ext3的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之
ext2文件系统来说,性能并没有降低。
4、数据转换
由ext2文件系统转换成ext3文件系统非常容易,只要简单地键入两条命令即可完成整个转换过程,用户不用花时间
备份、恢复、格式化分区等。用一个ext3文件系统提供的小工具tune2fs,它可以将ext2文件系统轻松转换为ext3
日志文件系统。另外,ext3文件系统可以不经任何更改,而直接加载成为ext2文件系统。
5、多种日志模式
ext3有多种日志模式,一种工作模式是对所有的文件数据及metadata(定义文件系统中数据的数据,即数据的数据)
进行日志记录(data=journal模式);另一种工作模式则是只对metadata记录日志,而不对数据进行日志记录,
也即所谓data=ordered或者data=writeback模式。系统管理人员可以根据系统的实际工作要求,在系统的工作速
度与文件数据的一致性之间作出选择。
反删除
和ext2不同,ext3会在删除文件时把文件的节点(inode)中的块指标清除。这样做可以在unclean载入文件
系统后,重放日志时,可以减少对文件系统的访问。但也同样了文件在反删除上面的困难。用户唯一的补救是
在硬盘中捞取数据,并且要知道文件的起始到结束的块指标。尽管提供了比ext2在删除文件上稍微高一些的安
全性,却也无可避免的带来了不便之处。
ext4是一种针对ext3系统的扩展日志式文件系统,是专门为 Linux 开发的原始的扩展文件系统(ext 或 extfs)的
第四版,修改了 ext3 中部分重要的数据结构,而不仅仅像 ext3 对 ext2 那样,只是增加了一个日志功能而已。
ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能。
相对于ext3,特点如下:
1、与 ext3 兼容。
执行若干条命令,就能从 ext3 在线迁移到 ext4,而无须重新格式化磁盘或重新安装系统。原有 ext3数据结构
照样保留,ext4 作用于新数据,当然,整个文件系统因此也就获得了 ext4 所支持的更大容量。
2、更大的文件系统和更大的文件。
较之 ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,ext4 分别支持1EB(1,048,576TB , 1EB=1024PB 1PB=1024TB)的文件系统,以及 16TB 的文件。
3、无限数量的子目录。
ext3 目前只支持 32,000 个子目录,而 ext4 支持无限数量的子目录。
4、extents。
ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 ext3 中要建立
25,600 个数据块(每个数据块大小为 4KB)的映射表。而 ext4 引入了现代文件系统中流行的 extents 概念,
每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,
提高了不少效率。
5、多块分配。
当写入数据到 ext3 文件系统中时,ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件
就要调用25,600 次数据块分配器,而 ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用
分配多个数据块。
6、延迟分配。
ext3 的数据块分配策略是尽快分配,而 ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来
可以显著提升性能。
7、快速 fsck。
以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,而现在 ext4 给每个组的 inode 表中都添加了
一份未使用 inode 的列表,今后 fsck ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。
8、日志校验。
日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。ext4
的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在
增加安全性的同时提高了性能。
9、“无日志”(No Journaling)模式。
日志总归有一些开销,ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
10、在线碎片整理。
尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。ext4 支持在线碎片
整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。
11、inode 相关特性。
ext4 支持更大的 inode,较之 ext3 默认的 inode 大小 128 字节,ext4 为了在 inode 中容纳更多的扩展属性
(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。
12、持久预分配(Persistent preallocation)。
P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来
的数小时或数天之内磁盘空间不足导致下载失败。 ext4 在文件系统层面实现了持久预分配并提供相应的 API
(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。
13、默认启用 barrier。
磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入
磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。
ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。
(可通过 "mount -o barrier=0" 命令禁用该特性。)
如何使用ext4
转换到Ext4其实是件很容易的事情,如下方法均可:
1、建立ext4文件系统。
这是最简单的方法,你只需要升级你的e2fsprogs到ext4,并且使用mkfs.ext4命令创建文件系统即可。
2、从ext3迁移到ext4。
你需要使用tune2fs命令和fsck命令,并且当前文件系统需要被卸载才可以。运行命令
tune2fs -O extents,uninit_bg,dir_index /dev/yourfilesystem
此后,你务必运行fsck命令,否则ext4将无法挂载你的新文件系统。在fsck过程中,可能会有一些error需要你的确认。你可以考虑使用 -p选项,来告诉fsck你想要的是“automatic repair”,即fsck -pf /dev/yourfilesystem
3、用ext4挂载ext3文件系统。
你可以使用mount -t ext4 /dev/yourpartition /mnt来将一个ext3文件系统用ext4来挂载,但你将享受不到
那些需要改变磁盘格式才可以享受得到的特性,比如extents。你可以享受到的只有 那些不需要改变磁盘格式
即可享受得到的特性,比如多块分配、延迟分配等。