简介
本文简要叙述了如何在2.4版内核上安装并运行ext3日志文件系统。
ext3是由 Stephen C. Tweedie 博士为2.2版内核编写的。
这一文件系统由 Peter Braam 、 Andreas Dilger 、 Andrew Morton 和 Stephen 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内核进行了磁盘限额代码测试--在这种情况下工作完全正常。
安装
从 http://www.zip.com.au/~akpm/linux/ext3/ 下载最新的内核补丁
cd /usr/src/linux
gunzip < ~/ext3-2.4-0.x.y.patch.gz | patch -p1
注:原文如此,但实际需要用cat命令代替gunzip命令。
make menuconfig
在filesystems菜单中选取ext3。请同时勾选“JBD debugging support”,因为如果出了什么错,这可以给出有用的诊断信息。通常不用选取“Buffer head tracing”--它将耗用大量内存。然而如果你遇到ext3的‘声明失败'错,请在提出bug报告前,设置为允许“缓冲跟踪”,看看能否重复产生这个问题--那会产生大量有用信息。
ext3文件系统支持可以编译进内核,也可以编译成可挂载模块。编进内核的好处在于,如果出现错误,可以简化诊断信息的收集工作。
编译并安装内核。
其它软件
你需要从 http://www.kernel.org/pub/linux/utils/util-linux/ 下载最新的 util-linux 包。
其中 mount 命令的改进如后文所述。
你需要从 [url=http://www.pccode.net].net/"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。
注意 :要使fstype auto 能正常工作,你 必须 使用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完整检查文件系统),事实上在系统崩溃后,你将丢失数据并增大文件系统毁坏的几率。