日志文件的设计思想是跟踪文件系统的变化而不是文件系统的内容。为了更好地解释这个问题,下面我用ext2文件系统和日志文件系统举一个例子:
当我们改变文件“test.file”的内容的时候会出现什么情况?先假定“test.file”的inode有四个数据块。用来保存“test.file”文件的数据块的块号分别为3110、3111、3506和3507(因为在3111和3506之间的块已经分配给其它文件了,所以这些块不连续)。当硬盘要先找到3100,读两块,在跳到3500,再读两块,才能读取整个文件。假定你改变了第三块,文件系统会读取第三块,改变它,然后重新写入第三块,这一块还在3506这个位置。如果你往文件中添加了一些内容,就要从别的地方另外分配一些空余的块。
如果在日志文件系统中,情况就有所不同。日志文件系统不会改变第3506块的内容,它会把“test.file”的inode的一个拷贝和新的第三块保存到磁盘上。在内存中的inode列表需要更新,让“test.file”使用新的inode。所有的变化、添加和改变需要被记录到一个文件系统中被称为“日志”的那部分中去。每隔一段时间,文件系统在“检查点”(check point)回更新在磁盘上的inode,并且释放文件中用不到的那些旧块(例如:“test.file”文件最初的第三块)。
在系统崩溃之后,日志文件系统很快就能恢复。它需要恢复的只是日志中记录下来的很少的几块。当断电之后,“fsck”只要用几秒钟的扫描时间。
这就是我所说的解决了一些问题!
但是,文件系统为得到额外的安全也是要付出代价的,这就是系统开销。每一次更新和大多数的“日志”操作都需要写同步,这样就需要更多的磁盘I/O操作。系统管理员就面临这样一个问题:为了有一个更安全的文件系统值不值得牺牲一部分性能?
大多数系统管理员会根据实际情况作出决定。没有必要把“/usr”目录放在日志文件系统上因为“/usr”目录大部分是只读的操作。但是,可以考虑把“/var”或包含e-mail spool文件的目录放在日志文件系统上。幸运的是在Linux系统中可以根据需要混合使用这些文件系统。
日志文件系统还有一个问题就是更容易产生碎片。因为它的文件分配方式与众不同,很容易在文件系统中到处产生碎片。ext2文件系统也会产生碎片但是可能不会有这么严重。每个月定期把文件系统备份到磁带中然后重新恢复,不仅可以解决这问题,而且可以检查备份/恢复的过程是否正确。
想得到一些好处,总是要付出一些代价的,不是吗?
可供选择的Linux日志文件系统
当我写这篇文章的时候,有两个日志文件系统还在开发,有三个日志文件系统可供使用。
SGI的xfs(http://oss.sgi.com/projects/xfs/)日志文件系统和Veritas(www.veritas.com)的文件系统和卷管理(volume manager)。这两个文件系统在五个月前就发布了,但是现在还不能得到源代码。SGI的xfs是基于Irix(SGI的Unix)上已经实现的xfs。SGI已经宣布xfs为Open Source的软件。
两个马上就可以得到的日志文件系统是reiserfs和IBM的jfs。这两文件系统都是开放源代码的而且很多有天赋的人在开发这两个文件系统。jfs(Journaled File System Technology for Linux)的开发者包括AIX(IBM的Unix)的jfs的主要开发者。
在AIX上,jfs已经经受住了考验。它是可靠、快速和容易使用的。Reiserfs应用了一些新的技术,例如,统一名字空间(unified name space),是非常有前途的(Namesys)可以参考。
有一些Linux的发行版已经包括了reiserfs文件系统,作为安装时的可选项。SuSE 6.4 就很容易使用reiserfs文件系统。reiserfs的最新版是3.5.12,经过测试reiserfs的基准测试的结果是很激动人心的。这个测试使用“postmark”基准测试,50,000个事务处理20,000个文件。结果是:
Sun E450 1 GB, Solaris 2.6, and vxfs (Veritas) file system: 22 transactions/second
Sun E450 1 GB, Solaris 2.6, and UFS file system: 23 transactions/second
Dual P-III, 1 GB Linux 2.2.13, standard ext2: 93 transactions/second
Dual P-III, 1 GB Linux 2.2.13, reiserfs 3.5.5 journaling beta: 196 transactions/second
Dual P-III, 1 GB Linux 2.2.13, reiserfs 3.5.5 journaling beta, mount options notail,
genericread: 847 transactions/second
(Sun的计算机用的是barracuda硬盘,x86的计算机用的是cheeta硬盘)
还有一个日志文件系统是jfs。jfs还没有被任何Linux发行版采用,因为它现在的版本是0.7。但是,jfs进展得很快。本文的作者已经加入jfs项目现在是jfs FAQ的维护者。
reiserfs和jfs都非常容易安装。下载完jfs的软件包之后,还有下面几个步骤要完成:
1) 解压jfsXXX.tar.gz。
2) 软件带有内核(2.2.14、2.2.15和2.3.99)的补丁。把补丁拷贝到内核源代码的目录,通常在“/usr/src”。把补丁打到内核上,用这个命令:
root@ maguro /usr/src # patch -p0
3) 重新编译内核
root@ maguro /usr/src # make menuconfig; make dep; make clean; make bzImage; make modules
安装reiserfs的步骤和上面类似:
1) 下载软件包。
2) 把补丁拷贝塔内核源代码所在的目录,通常在“/usr/src”,给内核打补丁:
root@ maguro /usr/src # zcat linux-2.2.11-reiserfs-3.5-patch.gz | patch -p0
3) 编译内核。
4) 用下面命令生成reiserfs文件系统:
root@ maguro /usr/src # /linux/fs/reiserfs/utils/mkreiserfs /dev/hda2
另一个选择
日志文件系统的另一个选择是ext2的后继者ext3fs文件系统。ext3fs文件系统正在Linux内核黑客Stephen Tweedie的领导下开发。
ext3fs还处于beta测试阶段,就像reiserfs和jfs,但是它工作得很好。Stephen预计2000年夏天可以正式发布ext3fs。ext3fs最大的优点是向下兼容ext2。而且ext3fs还支持异步的日志,这意味着它的性能可能还比ext2好。



评论加载中…
