高级文件系统实现者指南,第 5 部分
设置 devfs
![]() |
![]() |
![]() |
级别: 初级
Daniel Robbins ( [email protected]), 总裁兼 CEO, Gentoo Technologies, Inc.
2001 年 10 月 01 日
Linux 2.4 发行版能支持很多新的文件系统,包括 Reiserfs、XFS、GFS和其它文件系统。这些文件系统听起来不错,但它们到底能做什么,擅长做什么,又如何在 Linux 生产环境中,安全地着手使用这些文件系统呢?Daniel Robbins 通过演示如何在 Linux 2.4 系统下,安装这些新的高级文件系统来回答这些问题。在这部分中,Daniel 将带您经历为系统准备 devfs 的整个过程。阅读完本文,将可以在系统上启用 devfs;在下一篇文章里 Daniel Robbins 将介绍 devfs 最终安装的细节。
在 上一部分(第 4 部分)中,我们具体讨论了什么是 devfs,以及它是如何解决几乎所有的设备管理问题的。现在是在您的系统上启动和运行 devfs 的时候了。
在本文中,我们将使您的系统为启用 devfs 作好准备,在下篇文章中,我们将真正开始向 devfs 的转换。即使在 devfs 的下一篇(也是最后一篇)出版以前,您也完全可以遵循本文中的步骤,因为当我们完成了所有这些步骤之后,您的系统将仍旧继续正常运行 �D 它仅仅为即将来临的 devfs 转换作好了准备。因此,没有必要因为后继文章还未出现而不遵循这些步骤。
请注意: 因为我们将对 Linux 系统的几个部分作出相当大的更改,所以确实可能搞糟您的系统。因此,如果您在对 Linux 系统内部更改方面没有经验的话,毫无疑问您应该在一个无关紧要的 Linux 机器上这样做,至少第一次应该这样。
需求
要启动和运行 devfs,需要使用 Linux 2.4 的一些版本(2.4.6 或 2.4.8 就不错)以及 glibc 2.1.3 或更高版本。还建议您使用 Xfree86 4.0 或更高版本,如果您的系统版本较低,建议您首先升级到 Xfree86 4.1。
紧急 bash 救援
在下篇文章中,我们将更改 Linux 系统中对启动至关重要的部分。既然完全可能因某个错误而使您偶尔搞糟引导过程,我将在本文首先讲述:如何用紧急
bash shell 命令启动和运行系统。如果您确实碰巧发现系统因为 init 脚本或
/sbin/init 本身的问题而不能引导,就可以使用这个紧急引导过程。
进行紧急引导最简单的方法是:在引导时刻使用 GRUB 或 LILO 把
init=/bin/bash 选项传递给内核。 如果使用 GRUB,您应该能够通过点击
e 来实时地编辑当前菜单项,从而在需要时交互地传递该选项。如果使用 LILO,则确保在继续下一步之前,您已知道如何向内核传递启动选项,必要时,还要创建一个新的“紧急”LILO 启动选项。
过程
这样,基本的“救援”过程如下。首先,将
init=/bin/bash 作为一个内核引导选项传递给内核。当内核引导时,它将以
/bin/bash 而不是通常的
/sbin/init 作为第一个进程启动。 您不会被提示进行登录就看到一个 root 用户 bash 提示符:
然而,尽管您看到一个 root
bash 提示符,实际上只安装了根文件系统,而且仅以只读的形式安装。下面介绍在这之后如何启动和运行您的系统。如果文件系统没有卸装干净的话,应该首先对它们进行
fsck 。首先对根文件系统执行
fsck -a ,然后
fsck -R -A -a 就会负责处理所有其它的文件系统:
既然文件系统已经一致(或者,如果文件系统在系统重引导时已经卸装干净,并且您跳过了上一步骤),我们可以简单地以可读写方式重新安装根文件系统并且安装 /proc,如下所示:
然后,安装可能位于其它分区中的所有重要的文件系统树。例如,如果在另一个分区上有 /usr,则还要输入:
如果您想做的不仅仅只是打开一个编辑器的话,则最好是激活交换分区。如果您使用
emacs,您可能会需要它:)
现在,您应该能够使用您喜爱的编辑器来编辑任何需要编辑的文件,以便修复现有的引导问题。一旦完成,只需按安装时的顺序,以只读方式重新安装分区即可。例如,如果有一个单独的 /usr 分区,为使所有的文件系统处于一致的状态(准备重新引导),可以输入:
现在,您可以安全地重新引导了。但愿现在已经解决了引导问题,并且可以使用正常的 LILO 或 GRUB 选项启动和运行系统。
为 devfs 作好准备
devfs 配置
既然您知道了在紧急情况下该怎么做,我们就可以使系统为 devfs 做好准备了。在下一篇文章里,我们将对 Linux 系统作相对复杂的更改。为什么需要这样呢?因为我们不仅仅在内核中启用 devfs 功能,这的确非常容易。我们还将以一种特别方式设置
devfsd (设备管理守护进程),用它来备份和恢复任何对设备许可权和所有权的更改。我们需要用到很多小窍门来使这个新的系统极佳地工作。但是一旦实现,我想您将对这个结果
非常满意。
devfs 内核支持
在系统上启用 devfs 的第一步比较简单:就是要使内核支持 devfs。为此目的,您需要一个 2.4 系列的内核。使用
make menuconfig 或者
make xconfig ,转至
Code maturity level选项部分并确保启用了
Prompt for development and/or incomplete code/drivers选项。然后转至
File systems内核配置部分,查找
/dev file system support (EXPERIMENTAL) 选项。选中它。您将会看到在您刚启用的选项下方,出现了两个附加选项。第一个选项控制 devfs 在内核引导时是否自动安装到 /dev。
不要启用它,我们将用一个特殊脚本手动安装 /dev。 第二个选项,
Debug devfs,也应该被禁用。
禁用 /dev/pts
当您在屏幕上看到
File systems kernel configuration 部分时,如果您碰巧启用了
/dev/pts file system for Unix98 PTYs 的支持,则禁用该支持。devfs 提供了相似的功能,所以您就不再需要 devpts 文件系统了。继续进行然后保存内核配置;我们很快就要编译并安装一个新的内核!最后,在进行下一步以前,检查一下在 /etc/fstab 中是否有
/dev/pts 项;如果有,把它注释掉,使它在启动时不再被安装。
各种配置风格
下一步,将 /etc/securetty 文件装入编辑器。该文件由
login 使用,它允许您指定允许 root 用户使用以进行登录的
tty s。通常,它包含从
tty1 到
tty12 的设备,每行一个。为了使这个文件适用于 devfs,您应当为这些 ttys 加入适当的 devfs 类型名字,并保留原有的
tty? 名字,以备日后您决定禁用 devfs 引导之需。把以下几行添加到 /etc/securetty 的最下面。
安装 devfsd
接下来就是在系统上安装
devfsd ,即 devfs 助手守护进程。Devfsd 将会负责创建“旧类型”兼容性设备节点;在注册/注销设备时执行自动化操作;负责备份对根文件系统上某个目录的设备许可权和所有权的更改,以及其它更多功能。现在,我们将只安装 devfsd;在下一篇文章中,我们将使它和 devfs 一起启动和运行。为了安装 devfsd,首先需要下载最新版本的 devfsd 压缩文件。(请参阅本文后面的 参考资料),当前版本为 1.3.16。然后执行下列步骤:
现在,devfsd 应该编译好并可以安装了。如果您的帮助手册页存储在 /usr/man 中,输入
make install ;如果您正在使用 FHS 兼容系统,并且您的帮助手册页存储在 /usr/share/man 中,输入
make mandir=/usr/share/man install 。现在将安装 Devfsd,但还未运行,这正是我们现在要做的。
启动新内核
现在,继续前进,编译并安装刚刚配置好的内核。这个内核应该是您现在内核的临时替代品;它应能正常引导;并且尽管它内置了 devfs 支持,您应该觉察不出它与您现在正在运行的内核有什么差别。
一旦新内核安装完毕,重新引导系统以确保到目前为止一切工作正常。
Devfs 配置方法
您的系统现在已经作好了向 devfs 转换的准备,我将在下一篇文章中详细介绍。现在,是熟悉一下我们正在使用的方法的时候了。您将看到,用 devfs 启用系统可能会很棘手,尤其当您使用到 devfs 的所有优点(如持久的许可权和所有权)的时候。
内核自动安装带来的问题
确实有很多方法来使系统 devfs 启用。其中之一就是让内核在引导时自动将 devfs 安装到 /dev;我们将不使用此选项,尽管这样
确实是可以的。乍看起来,这种方法似乎很有意义,因为它可以保证所有 devfs 类型的设备对于所有进程都是可用的,甚至对第一个进程
/sbin/init 也是如此。然而,这种方法有一个问题。尽管 devfs 提供所有“新类型”的设备,但旧类型的设备节点却是由
devfsd 守护进程创建。
devfsd 不是由内核启动的,所以即使让内核在引导时安装 devfs ,当
/sbin/init 启动时我们仍然只会得到部分而非所有的设备节点。这就意味着为了使
devfsd 能在恰当的时间启动和运行,您必须修改系统初始化脚本。这不但棘手(因为这需要对系统启动脚本有专家级的理解),而且这种方法还存在其它问题。
内核安装方法的主要的问题是,
devfsd 只有在能够访问原来旧类型磁盘上的 /dev 目录下的内容时,才能最好地工作。我们允许访问原来的旧类型设备的典型办法是,在 devfs 自身被安装到 /dev 之前,绑定安装 /dev 到另一个位置(通常是 /dev-state)。
这样就确保了即使在安装了 devfs 以后,也可以在 /dev-state 中访问旧的 /dev,这就允许
devfsd 将该目录用于持久设备存储。理解这点很重要,即如果没有绑定安装的话,/dev 里的旧内容将不可访问,因为在 /dev 安装 devfs 时实际上会覆盖它们。这就是用内核安装 devfs 存在的问题。如果
kernel 在任何其它进程能够启动之前就在 /dev 安装 devfs 文件系统的话,那么我们就没有机会执行绑定安装,/dev 的最初内容也就被完全隐藏。这很不友善,是吗?(想知道更多绑定安装的内容,请参阅本系列的 第 3 部分。
最佳解决方案
理想的情况是:我们能在
/sbin/init 一启动时就能拥有完整的设备节点(新类型
和兼容性设备),
并且有机会在安装 devfs 以前将 /dev 绑定安装到另一位置。但如何才能做到这点?
初始封装器
一个方法是添加一个内核补丁来执行从 /dev 到 /dev-state 的绑定安装。然而,尽管这完全可行,而且也确实很容易执行,手工为您安装的每个 Linux 内核打补丁仍是相当麻烦的。因此,解决 devfs 的“先有鸡还是先有蛋”问题的最好办法,可能就是使用
初始封装器。对于我们这个特别的应用而言,初始封装器就是一个 bash 脚本,它代替
/sbin/init �D 而
真正的 init 则已被重命名为
/sbin/init.system 。简而言之,初始封装器将做以下事情:
正如您所见,初始封装器所做的第一件事就是确保 /dev-state 存在。然后将 /dev 树绑定安装到 /dev-state,以便可以通过 /dev-state 目录使用 /dev 的内容。然后,在 /dev 之上安装我们的 devfs 文件,然后启动
devfsd ,以便自动在 devfs 中注册我们的兼容性设备。 最后,我们
exec
最初的
/sbin/init ,现在它已被重命名为
/sbin/init.system 。
exec 命令使
init.system 取代正在运行的 bash 进程。这意味着我们的 bash 脚本被终止,而
init.system 继承了标识符为 1 的进程,也就是
init 进程以前被占用的进程标识。当
/sbin/init.system 启动后,系统将正常引导,devfs 现在也已经
完全可操作了;通过使用初始封装器,我们不必给内核打补丁,不必修改启动脚本,也不必为只有一半可操作的 devfs 系统而伤脑筋了。
在我的下一篇文章中,我将指导您经历启动和运行完整版本的初始封装器的整个过程,并为您演示如何利用
devfsd 的众多强大特性。请继续阅读!
参考资料
关于作者
|