免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1098 | 回复: 0
打印 上一主题 下一主题

通用线程: 高级文件系统实现者指南,第 5 部分 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-28 14:30 |只看该作者 |倒序浏览
通用线程: 高级文件系统实现者指南,第 5 部分
在4中,我们具体讨论了什么是
devfs,以及它是如何解决几乎所有的设备管理问题的。现在是在您的系统上启动和运行
devfs 的时候了。
        
        在本文中,我们将使您的系统为启用 devfs
作好准备,在下篇文章中,我们将真正开始向 devfs 的转换。
即使在
devfs
的下一篇(也是最后一篇)出版以前,您也完全可以遵循本文中的步骤,因为当我们完成了所有这些步骤之后,您的系统将仍旧继续正常运行
― 它仅仅为即将来临的 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 就会负责处理所有其它的文件系统:
      
      
                       
      # fsck -a /dev/hda1
# fsck -R -A -a
                       
      
既然文件系统已经一致(或者,如果文件系统在系统重引导时已经卸装干净,并且您跳过了上一步骤),我们可以简单地以可读写方式重新安装根文件系统并且安装
/proc,如下所示:
                       
      # mount / -o remount,rw
# mount /proc
                       
      
然后,安装可能位于其它分区中的所有重要的文件系统树。例如,如果在另一个分区上有
/usr,则还要输入:
                       
      # mount /usr
                       
      
如果您想做的不仅仅只是打开一个编辑器的话,则最好是激活交换分区。如果您使用
        
        emacs,您可能会需要它:)
      
      
                       
      # swapon -a
                       
      
现在,您应该能够使用您喜爱的编辑器来编辑任何需要编辑的文件,以便修复现有的引导问题。一旦完成,只需按安装时的顺序,以只读方式重新安装分区即可。
例如,如果有一个单独的 /usr
分区,为使所有的文件系统处于一致的状态(准备重新引导),可以输入:
                       
      # mount /usr -o remount,ro
# mount / -o remount,ro
                       
      
现在,您可以安全地重新引导了。但愿现在已经解决了引导问题,并且可以使用正常的
LILO 或 GRUB 选项启动和运行系统。
                       
      # /sbin/reboot -nfi
                       
      



为 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 的最下面。
      
      
                       
      vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
vc/12
                       
      
安装 devfsd
                       
      
接下来就是在系统上安装
        
        devfsd ,即 devfs
助手守护进程。Devfsd
将会负责创建“旧类型”兼容性设备节点;在注册/注销设备时执行自动化操作;负责备份对根文件系统上某个目录的设备许可权和所有权的更改,以及其它更多功能。现在,我们将只安装
devfsd;在下一篇文章中,我们将使它和 devfs 一起启动和运行。为了安装
devfsd,首先需要下载最新版本的 devfsd
压缩文件。(请参阅本文后面的
        
        
参考资料
),当前版本为 1.3.16。
然后执行下列步骤:
      
      
                       
      # tar xzvf devfsd-1.3.16.tar.gz
# cd devfsd
# make
                       
      
现在,devfsd 应该编译好并可以安装了。如果您的帮助手册页存储在
/usr/man 中,输入
        
        make install ;如果您正在使用 FHS
兼容系统,并且您的帮助手册页存储在 /usr/share/man 中,输入
        
        make mandir=/usr/share/man install 。现在将安装
Devfsd,但还未运行,这正是我们现在要做的。
      
      
                       
      

                               
        安装注释
                               
        
我们即将配置
         
          devfsd ,以便完全支持兼容性设备,所以tty?
应该足够了。然而,小心驶得万年船,尤其在可能会影响到
         
          login
是否允许超级用户进入系统的时候。用我们的方法,即使存在问题而且
         
          devfsd 无法启动,超级用户在
         
          login:
提示符下登录时也不会有问题,哪怕已经启用了 devfs。
        
        
                       
      
                       
      
启动新内核
                       
      
现在,继续前进,编译并安装刚刚配置好的内核。这个内核应该是您现在内核的临时替代品;它应能正常引导;并且尽管它内置了
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 ― 而
        
        真正的 init
则已被重命名为
        
        /sbin/init.system 。简而言之,初始封装器将做以下事情:
      
      
                       
      #!/bin/bash
mkdir -f /dev-state
mount --bind /dev /dev-state
mount -t devfs none /dev
devfsd /dev
exec /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 的众多强大特性。请继续阅读!
      
      
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/9465/showart_161506.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP