当前位置:Linux教程 - Linux - 在2.4内核上使用ext3文件系统

在2.4内核上使用ext3文件系统


在2.4内核上使用ext3文件系统




简介


本文简要叙述了如何在2.4版内核上安装并运行ext3日志文件系统。

ext3是由Stephen C. Tweedie博士为2.2版内核编写的。

这一文件系统由Peter BraamAndreas DilgerAndrew MortonStephen Tweedie迁移到2.4版内核上。Ted Ts''o维护着极为重要的e2fsprogs工具,并为ext3功能设计与实现提供了宝贵建议。Alexander Viro贡献了ext3目录搜索部分代码。

对本文的任何评注,请电邮至Andrew Morton

如对本软件有怀疑、问题或者bug报告,请电邮至ext3用户邮件列表
该邮件列表订阅指南参见https://listman.redhat.com/mailman/listinfo/ext3-users/


现状


到七月末,ext3开发有些减缓,因为我们正为发布1.0版而努力。
对2.4.7内核而言,ext3补丁已经相当稳定、性能优越。在x86体系SMP环境下的测试已经完成。其它系统结构的测试报告(不论成功还是失败),请发送到ext3用户列表。

一个比较突出的问题是磁盘限额。在2.4.7内核的磁盘限额代码中,有一些已知的因素会引起死锁,ext3又增加了新的不稳定因素。这与在-ac内核中的磁盘限额代码有很大不同,一旦这部分并入Linus的内核中,我们会继续开发并测试ext3的磁盘限额代码。这并不是说ext3加上磁盘限额一定会引起崩溃--但如果你长时间大负荷使用文件系统,代码将会引起锁死,你必须重启才能恢复受影响的文件系统操作。我们只对-ac内核进行了磁盘限额代码测试--在这种情况下工作完全正常。


安装





  1. http://www.zip.com.au/~akpm/linux/ext3/下载最新的内核补丁



  2. cd /usr/src/linux



  3. gunzip < ~/ext3-2.4-0.x.y.patch.gz | patch -p1


  4. 注:原文如此,但实际需要用cat命令代替gunzip命令。


  5. make menuconfig



  6. 在filesystems菜单中选取ext3。请同时勾选“JBD debugging support”,因为如果出了什么错,这可以给出有用的诊断信息。通常不用选取“Buffer head tracing”--它将耗用大量内存。然而如果你遇到ext3的‘声明失败’错,请在提出bug报告前,设置为允许“缓冲跟踪”,看看能否重复产生这个问题--那会产生大量有用信息。

    ext3文件系统支持可以编译进内核,也可以编译成可挂载模块。编进内核的好处在于,如果出现错误,可以简化诊断信息的收集工作。



  7. 编译并安装内核。




其它软件


你需要从http://www.kernel.org/pub/linux/utils/util-linux/
下载最新的util-linux包。
其中mount命令的改进如后文所述。

你需要从http://e2fsprogs.sourceforge.net/下载e2fsprogs 1.25或更新的版本。


从ext2文件系统转换


ext2文件系统可以通过创建一个日志文件转换成ext3。新建日志文件,只要在目标文件系统(可以是已挂载的)上运行
tune2fs -j /dev/hdXX
命令。文件系统现在就成为ext3了。换句话说,只要简单的卸载/重挂载它(当然要在相应修改/etc/fstab之后),你就可以把这个区作为ext3格式使用了。要用ext3格式挂载根分区,最简单的方法是重启。


建立新的ext3文件系统


只要运行
mke2fs -j /dev/hdXX
命令在该设备上建立新的ext3文件系统。


在ext2和ext3间切换


在正常卸载的情况下,ext3文件系统可以被当作ext2来挂载。未正常关机的ext3文件系统不能作为ext2被挂载,因为日志中仍有ext2无法处置的临时数据。

e2fsprogs提供的e2fsck程序可以进行日志回溯,因此在已经破坏的ext3文件系统上运行

e2fsck -fy /dev/hdXX
就可以修复它,并允许以ext2格式挂载。

ext3软件将拒绝挂载ext2文件系统--目前文件系统上一定要有日志文件才可以。



根文件系统的LILO选项


如果你的根文件系统是ext3,缺省情况下,支持ext3的内核将用ext3格式挂载根分区。你可以通过下述LILO选项取代缺省操作:
LILO: linux rootfstype=ext2

你还可以通过LILO的rootflags向根文件系统提供挂载选项。例如:
LILO: linux rootflags=data=journal



非LILO引导管理器


引导管理器LILO跟文件系统无关--它用预先定义好的块表来定位和加载操作系统映像到内存中。
然而其它(更聪明的?)引导管理器例如SILO(SPARC上用的)和Open Firmware(PowerPC上用的)自带文件系统驱动,它们可以直接打开和装载ext2文件系统上的文件。

这在根文件系统是ext3,并且未正常关机的情况下会引起问题。处在这种状态下的ext3与ext2不兼容--需要首先执行恢复操作。这一不兼容性记录在文件系统的超级块中,完全兼容ext2的引导管理器应该给出错误提示,并拒绝打开这个文件系统上的文件。这就是我们不希望见到的,系统不能启动!

看来Open Firmware没做完整的超级块兼容性检查,所以它仍然会从需要修复的ext3文件系统载入文件。只能说万幸。

然而SILO要进行完整的兼容性检查,从需要修复的ext3文件系统引导会令SILO产生“too many symlinks”错误,或别的什么问题。要避免这类严重问题的发生,你需要确保引导区文件系统是ext2类型而不是ext3的(或打上补丁让SILO略过兼容性检查?)。


透明衔接文件系统


在只支持ext2和支持ext3的内核之间来回切换的问题之一是,需要告诉内核,用什么文件系统类型来挂载所有设备。通常这需要修改/etc/fstab

最新版的mount能认识ext3并自动选择ext3文件系统类型。The version of fsck in e2fsprogs-1.23
and later can also do this if the fstype is auto. Here''s
the state of play:



  • 如果mount命令没有指定目标分区的fstype,而它自动检测到了ext3,它将首先尝试用ext3挂载,如果失败,再尝试用ext2。



  • 如果mount命令带auto参数来指定fstype,它将首先检测ext3并尝试挂载,如果失败,再尝试用ext2。



  • 如果fsck命令带auto参数来指定fstype,它将自动检测文件系统类型,然后运行相应检查(对ext2和ext3而言都是fsck.ext2)。


建议使用最新的e2fsprogs稳定版本,并在/etc/fstab中用auto指定fstype。

注意:要使fstypeauto能正常工作,你必须使用e2fsprogs-1.23或更高版本!

注意:如果你使用的是最近的Red Hat发行版,并且从官方安装包自己编译util-linux,你可能会在挂载文件系统时遇到挂载失败问题。这是由于Red Hat在他们发行的版本中,给mount命令加上了“-O”参数。这一选项加在他们的/etc/rc.d/rc.sysinit里,这就使得标准的mount命令返回“unrecognised option -O”错误。

解决方法是,编辑/etc/rc.d/rc.sysinit,去掉任何“-O no_netdev”字符串。

注意:使用“自动”来指定根文件系统类型将使/bin/df不正常,从而使根文件系统的信息不能输出。
解决方法:始终在/etc/fstab中指定根文件系统为ext3。



周期性文件系统检查


e2fsck的功能之一是对文件系统进行常规的强制检查,即使文件系统被标志为正常的。一般情况下,每二十次挂载或者每180天,两个条件之一满足就进行检查。

这一例行检查对ext3同样有效,很可能你不希望这样--我们选择ext3的目的之一就是减少由fsck引起的漫长的停机时间。

因此对于ext3来说,关闭这一功能比较好。用以下命令


tune2fs -i 0 -c 0 /dev/hdxx

来禁止检查。

注意:这意味着周期性的停机并手动检查磁盘是你的责任。多数Linux发行版中,通过建立/forcefsck文件然后重启,很容易做到。


外部日志


在0.9.5版上,ext3支持把日志放到另外的设备上。这个设备可以是磁盘或是一个NVRAM设备。NVRAM设备可以用Andrew Tridgell的trivial RAM disk(trd)驱动来模拟,该驱动在ext3的CVS库中。

你需要一个非常新的e2fsprogs,版本为1.23-WIP-0727或更高。

安装trd

mknod /dev/trd b 240 0

insmod trd.o trd_size=50000(对一个50MB的设备)

建立一个外部日志:
mke2fs -O journal_dev /dev/trd

在/dev/hda5上建立使用外部日志设备的ext3文件系统:
mke2fs -J device=/dev/trd /dev/hda5

mount /dev/hda5 /mnt/some/place -t ext3

注意!你须要指定文件系统类型(-t ext3),因为mount(8)中的自动检测文件系统类型不认识带外部日志的ext3。

当然,你可以使用真正硬盘上的分区作为外部日志设备--只要用/dev/hdXX替换上述/dev/trd

注意:只能在测试中使用虚拟磁盘驱动器来模拟NVRAM设备。这样做会失去日志带来的恢复时间上的好处(你一定要用fsck完整检查文件系统),事实上在系统崩溃后,你将丢失数据并增大文件系统毁坏的几率。



HOWTO


Rajesh Fowkar写了一个ext3安装的HOWTO。在http://www.symonds.net/~rajesh/howto/ext3/index.html可以找到。