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 略…………