ext4-howto中文

注:这个手册只是为了方便自己看而翻译,并不是官方的。其中省略了后面getting ext4 code的部分,官方手册请点https://ext4.wiki.kernel.org/index.php/Ext4_Howto

ext4-howto中文版


通用信息
ext4在Linux2.6.28作为了一个稳定版本的功能发布了,同时所有现代的发行版本都包含了它(有些还作为默认文件系统),所以你使用一个新的发行版本的话,也许你已经使用上了ext4,那就不需要改成ext4。

在生产环境中它是可以安全使用的,但是作为任何软件,它都是有bug的(在第一个稳定版本中都有可能被隐藏)。任何周知的严重的bug都会被迅速修复。如果你发现一个严重的bug,你可以联系ext4的开发者在ext4 mailing list(http://vger.kernel.org/vger-lists.html#linux-ext4)。他们通常也会上IRC(https://ext4.wiki.kernel.org/index.php/IRC)。

ext4的特点

兼容性
任何现有的ext3文件系统都可以用ext4重新mount,而不需要任何格式化改变。无论如何,我们都可以在只读模式下通过一串命令来升级ext3文件系统来利用ext4的一些特性。这就意味这你可以增加性能,存储限制和特性而无需重新format或者重新安装系统和软件环境,如果你在生产环境需要ext4的优势,你就可以升级你的文件系统。这个过程是安全的,并且对你的数据是没有风险的(当然,备份你的重要的数据是应该的,就算你没有升级文件系统也是应该的。但是这个升级在RHEL6中是没有售后服务的)。ext4只会对新的数据使用新的数据结构,而老的数据结构会继续保留,当需要时候也会进行对写它们。这就意味着,如果你升级到了ext4,那就就不能再退回到ext3了。

更大的文件系统和文件大小
现在,ext3支持最大16TB的文件系统大小和最大2TB的单个文件大小。ext4增加了48bit的block地址,所以它支持最大1EB的文件系统和最大16TB的单个文件大小。为什么是48bit而不是64bit呢?因为在让ext4支持64bit之前我们还有一些限制需要被修复,所以没有在ext4中被使用。ext4数据结构的设计已经在思想上确认了,所以未来ext4可能在一些点上会实现完整的64bit。1EB在那之前应该是足够的。
注意:
创建大于16TB的文件系统的代码已经在写这篇文章的时候有了。它将在未来会被发布。

1EB=1024PB
1PB=1024TB
1TB=1024GB

子目录扩展
在ext3中现在单个目录中最大的子目录数是32000个。ext4打破了这个限制,允许拥有无限制的子目录。

extents
传统的类Unix文件系统象ext3这样的都使用间接的block映射方式来保持每个block相对应的文件的数据的block的track。对于大文件这是低效的,特别是对大文件进行删除或者清空操作的时候,因为对每一个单一的block的入口都进行了映射,而大文件拥有很多block—>大量的映射,于是就有了缓慢的操作。现代文件系统使用了不同的方法叫作”extents“。一个extent本质上就是一串相邻的物理block。在本质上说“数据在后面n个block中”。比如,一个100MB的文件会被分配到单个那样大小的extent,来替代创建间接的25600个block映射(4KB每个block)。非常巨大的文件也会被分在多个extent中。extent提升了性能,也减少了磁盘碎片,所以extent促进了在磁盘上的保持连续layout。

多block分配
当ext3需要写数据到磁盘上,它的block分配器就会确定哪些空余的block可以被用作写入数据。但是ext3的block分配器在同一时间只能分配一个block。这就意味着如果系统需要写入100MB的数据,在写入的前一个点,它需要调用25600(100MB/4K)次block分配器。这样不仅是没有效率的,它不允许block分配器优化分配策略,因为它不知道有多少数据已经被分配掉的,它只知道单独的block是否被分配掉。ext4使用“multiblock allocator”(mballoc)在一次调用的时候就分配许多block,用来替代一次调用分配单独一个block,避免了一部分的负载压力。这种方法提升了性能,尤其在延迟分配和extent下会更有用。这个特性不影响磁盘的格式。而且ext4的block/inode分配器还有一些其他的提升,会在后面进行描述。

延迟分配
延迟分配(http://en.wikipedia.org/wiki/Allocate-on-flush)是一个性能特性(它不更改磁盘格式)在一些现代的文件系统中诸如XFS,ZFS,btrfs或者Reiserfs4等,它会尽可能延迟block的分配,相反的一些传统的文件系统(如ext3,ext2,Reiserfs3)都是尽可能快的进行分配block。比如当一个进程write(),文件系统的代码就会立刻根据数据将要分配的地方分配block,甚至数据当时还没有被在写到磁盘时它有时就会保存在cache内的数据。这种方法已经落后了。比如当一个进程连续的往一个文件里写入数据,连续不断的write()为数据分配block,但是它不知道文件是否持续增长。而延迟分配就在另一方面,当进行write()时它不会立刻分配block,事实上,它会一直延迟保存在cache中的文件的block的分配,直到它真的是要写入到磁盘上。这给了block分配器以机会来优化那些在老旧系统中所有没有的分配。延迟分配能跟先前两个提到的特性multiblock分配和extent下很好的运行,因为当文件最后写入到磁盘它需要分配到extents中,而这些extent已经通过multiblock分配器分配完成对应的block,这当中会有很大的工作负载。在一些工作负载中这样性能会更好,同时磁盘碎片也会大大改善。

快速fsck
fsck是非常缓慢的操作,特别是第一步:检查文件系统中所有的inode。在ext4中,每一组inode表最后都会保存未使用的inode列表(为了安全还含有校验和),所以fsck就不需要检查那些inode。结果是完整的fsck的时间将会提升2到20倍,根据已使用的inode(http://kerneltrap.org/Linux/Improving_fsck_Speeds_in_Ext4)。当在fsck时候必须通告未使用inode的列表在不是ext4的时候。这就意味着当你必须运行fsck来获得未使用inode的列表时,只有下一次fsck运行的时候会更快(任何时候把ext3转成ext4必须先通过fsck)。还有个特性就是fsck加速“灵活的block组”–这个同样能加快文件系统操作。

日志校验
日志是磁盘使用率最高的部分,动了这个部分的block很有可能导致硬件故障。从有问题的日志中进行恢复只会导致更大的问题。ext4会校验这些日志数据来知道是否日志block是否已经失效还是有问题。日志校验还带来一个意外的好处:它把ext3中的2段提交变成了直接提交,在一些情况下对于文件系统操作加快了20%-故可靠性和性能同时都会提升。(注:日志校验提升性能的部分-异步日志记录现在已经被默认关闭,等将来它更可靠之后才会被默认开启)

无日志记录模式
日志记录通过不间断记录磁盘更改的日志来保证文件系统的完整性。当然,它会产生一些额外开销。一些人会有一些特殊的需求和工作需要关闭日志模式并牺牲完整性。在ext4中日志记录功能可以被关闭,能小小的提升性能。

在线磁盘整理
(这个功能已经开发完成,在未来的版本中会包含发布)。由于有延迟分配,extent,以及multiblock分配这些帮助了系统减少碎片,但是只要使用文件系统就会产生碎片。比如:你在一个目录下写3个文件接着写入到磁盘上。有一天你需要更新当中那个文件,使那个文件增加了1bit,然后没有足够的空间给它了。你不得不把多出的部分移动到通过查找的磁盘的其它地方,或者分配文件连续的其它地方,远离了原先的另外2个文件,当一个应用程序需要读取在这个目录下的所有文件就会通过查找来进行(一个文件管理器会对整个目录做一个缩略图)。另外,文件系统只关心确定的文件碎片类型,它不知道比如它必须保留所有相邻的启动相关的文件,因为它不知道哪些文件是启动相关的。为了解决这个问题,ext4将支持在线的磁盘碎片整理,同时e4defrag工具能够整理单个文件和整个文件系统。

inode相关的特性


更大的inode,纳秒级的时间戳,快速的扩展属性,inode预订。。。

更大的inode:ext3支持配置inode的大小(通过mkfs -I参数),但是默认的inode大小是128byte。ext4中将默认的变为256byte。这是为了迎合一些扩展的字段(象纳秒级的时间线或者inode版本),然后inode剩余的空间用作存储扩展属性。这导致访问这些属性更快,提升了那些用到这些扩展属性的应用程序的性能通过3-7次的一个因素。
inode预订存在于当一个目录被创建时都会预订一些inode,并期望在未来会被使用。这提升了性能,因为当一个文件在一个目录下被创建时它们会使用这些被预约的inode。因此文件被创建会删除会更有效率。
纳秒级的时间戳意味着inode信息象“modified time”将可以使用纳秒级别来代替ext3中的秒级别。

连续的预分配
这个特性,在最新的kernel版本中的ext4是可用的,它通过文件系统的glibc仿真实现,但是没有支持,它允许应用程序预分配磁盘空间:应用程序告诉文件系统预分配空间,然后文件系统会预分配必要的block和数据结构,但是这些都是没有数据在里面的直到将来应用需要写数据到里面。这就跟p2p应用程序会预分配自己接下来几个小时或几天的空间来用作下载,但是通过文件的一个通用API来实现会更有效率。这有许多种用途:首先避免应用程序(比如p2p应用程序)通过0来填充满一个文件是非常不经济的。第二会改善磁盘碎片情况由于block会在同时被连续的分配。第三确认应用程序将要需要的磁盘空间,这对于实时的应用程序是非常重要的,因为没有预分配文件系统就需要得到完整的重要操作。这个特性是可用的通过libc posix_fallocate()接口。

默认的隔离
这是一个提升文件系统完整性的一个选择,但是会牺牲一些性能(你可以通过”mount -o barrier=0″来关闭它,推荐你在进行压力测试的时候关闭它)。通过这篇LWN的文章(http://lwn.net/Articles/283161/):“文件系统代码必须在写提交日志记录之前先确认所有的事务信息已经产生在日志中了。仅仅根据正确的顺序写还是不够的;现在的驱动为了更好的性能都会包含大量的内部cache用来记录操作。所以文件系统必须在提交记录之前清楚地通知磁盘获得所有在存储上日志数据。如果提交的数据写别写入,那日志有可能是不完整的。内核的block I/O子系统通过使用隔离是能力解决这个问题的;在本质上,一个隔离就会禁止任何block的写入,直到所有隔离提交前的block都写入到存储上。通过使用隔离,文件系统可以确定在磁盘上数据结构在所有时候都仍旧一致的。”

getting ext4 code
略…………

###########################################

Best regards
Timo Seven
blog:http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin  & MySQL DBA

初探ext4文件系统(续)

要创建ext4文件系统之需要运行

mkfs.ext4 /dev/device

默认的选项对于大部分使用情况都是最优化的。
具体的参数可以 man mkfs.ext4 获得

对于条带化块设备(如RAID5),条带的属性可以在文件系统创建的时候进行指定。在ext4中使用合适的条带化设置可以大幅的提升性能。

当在lvm或者磁盘卷上创建文件系统,mkfs.ext4选择一个最优的参数。这种参数可能对于一些可以导出参数信息到操作系统的硬件的RAID也是适用的。

对于特定的条带化参数,可以用mkfs.ext4的-E参数来指定
stride=stride-size
指定RAID的chunk大小

stripe-width=stripe-width
stride-size * N (N为做RAID的磁盘对数,比如RAID5只有一对磁盘做的,那N就为1)

resize=max-online-resize
保证足够的空间让block组描述符的增加以满足文件系统

lazy_itable_init[= ]

test_fs

注:
我们可以使用tune2fs来在ext3文件系统上实现ext4的特性,也可以使用ext4来挂载ext3文件系统。当然这些行为在RHEL6中没有售后 支持,因为它们没有进行过完整的测试过。由于如此,所以RHEL6中不能保证ext3文件系统转换和用这个方法挂载的性能和可预料的结果。

挂载一个ext4文件系统

我们可以不带任何参数的进行挂载ext4文件系统

mount /dev/device /mount/point

ext4文件系统也支持一些额外的mount参数。比如:acl参数就能支持访问控制列表,user_xattr参数能够支持额外的用户属性,如果要同时支持2个属性,可以使用-o参数进行连接

mount -o acl,user_xattr /dev/device /mount/point

tune2fs应用程序允许管理员在文件系统的superblock设置默认mount参数。更多的信息可以参考man tune2fs

写隔离
默认情况下ext4使用写隔离来保证文件系统的完整性,甚至在掉电的情况下也能使用写cache来实现。如果你的设备有后备电池的cache情况下就可以取消隔离。

mount -o nobarrier /dev/device /mount/point

重置etx4文件系统的大小
在增加ext4文件系统大小之前,要先确定底层的存储设备有足够的可扩展的空间。接着就是直接使用resize2fs就可以进行调整了。

resize2fs /mount/point size
resize2fs /dev/device size

size的单位可以s(512kb sectors),K(KB),M(MB),G(GB)

其他的ext4文件系统工具

e2fsck
这个是用来修复ext4文件系统,这个工具检查和修复ext4文件系统比ext3更有效率。

e2label

修改ext4文件系统的label,当然它也支持ext2和ext3

quota
控制和报告ext4文件系统中用户和组现有的磁盘空间(blocks)和文件(inode)使用情况。

debugfs
用来对ext2,ext3,ext4文件系统进行debug

e2image
保存有问题的元数据到文件。

###########################################

Best regards
Timo Seven
blog:http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

初探ext4文件系统

在RHEL6中ext4就会成为了默认的文件系统,

我想还是有必要了解个大概。

ext4文件系统是对于ext3文件系统的扩展。ext4已经是RHEL6的默认文件系统了。它能够支持最大16TB的单个文件和1EB的文件系统。它支持无限数量的子目录(而ext3是最多32000个子目录)

主要的特点:
ext4使用extents(不像ext3和ext2那种block映射的模式),这提高了当使用大文件时候的性能和减少了大文件的元数据过载。另外,ext4标记那些未被分配的block group和相应的inode表,这样就可以当文件系统check的时候可以跳过它们不检查。这样就可以更快的检查文件系统,这个在越来越大的文件系统上是非常有用的。

分配的特点
ext4文件系统的分配模式:
持续的预分配
延迟分配
多个块同时分配
stripe-aware分配:对于底层的条带化存储来说配额和I/O是一样的一种分配行为。这是依赖于在mkfs的时候有效的条带化信息。做一致的分配I/O能够有效的避免无效的读-修改-写的周期在底层存储上。

由于延迟分配和其它的性能加速,导致ext4写文件到磁盘的行为跟ext3有所不同。程序写数据到文件系统并不保证写到磁盘上,除非程序在后面执行fsync()方法。

而默认的,ext3都会自动的几乎是立刻的强制创建文件到磁盘上,甚至不需要执行fsync()方法。这种行为隐藏了问题当程序没有使用fsync()来确认写数据到磁盘上。ext4文件系统在另外一方面,经常会等待几秒去把更改的数据写到磁盘上,允许合并和更改写比ext3拥有更好的磁盘性能。

注意事项:
不像ext3,ext4文件不用强制数据写入到磁盘就跟事务提交一样。本身,它花费更长缓存写然后刷新到磁盘上。在任何文件系统,使用数据完整的回调类似fsync()来确定数据写入到永久的存储中。

其他特性
ext4同样支持以下特性:
增强的属性(xattr),允许系统给每个文件赋予其他的name/value值。
磁盘配额日志,这样就避免在系统崩溃时候漫长的磁盘配额检查。
亚秒级别的时间线。

ext4主要的特性就是上面这些。下面一些对上面的解释。

在ext4中引入了extent的概念,

下面一些内容是摘自:http://www.ibm.com/developerworks/cn/linux/l-cn-filesrc5/
所谓extent就是描述保存文件数据使用的连续物理块的一段范围。每个extent都是一个ext4_extent类型的结构,大小为 12 字节。
图 ext4中extent 树的布局结构

下面这个是ext3 与 ext4 磁盘布局对比。从这个图中我们可以很清楚的看到ext4中多了个group的概念