第二十章、启动流程、模块管理与 Loader
最近升级日期:2009/09/14

大标题的图示重点回顾
  • Linux 不可随意关机,否则容易造成文件系统错乱或者是其他无法启动的问题;
  • 启动流程主要是:BIOS、MBR、Loader、kernel+initrd、/sbin/init 等流程
  • Loader 具有提供菜单、加载核心文件、转交控制权给其他 loader 等功能。
  • boot loader 可以安装在 MBR 或者是每个分割槽的 boot sector 区域中
  • initrd 可以提供核心在启动过程中所需要的最重要的模块,通常与磁碟及文件系统有关的模块;
  • init 的配置档为 /etc/inittab ,此文件内容可以配置默认 runlevel、系统初始化脚本、不同运行等级的服务启动等;
  • 额外的装置与模块对应,可写入 /etc/modprobe.conf 中;
  • 核心模块的管理可使用 lsmod, modinfo, rmmod, insmod, modprobe 等命令;
  • modprobe 主要参考 /lib/modules/$(uanem -r)/modules.dep 的配置来加载与卸载核心模块;
  • grub 的配置档与相关文件系统定义档大多放置於 /boot/grub 目录中,配置档名为 menu.lst
  • grub 对磁碟的代号配置与 Linux 不同,主要透过侦测的顺序来给予配置。如 (hd0) 及 (hd0,0) 等。
  • menu.lst 内每个菜单与 titile 有关,而直接指定核心启动时,至少需要 kernel 及 initrd 两个项目
  • menu.lst 内配置 loader 控制权移交时,最重要者为 chainloader +1 这个项目。
  • 若想要重建 initrd ,可使用 mkinitrd 处理
  • 重新安装 grub 到 MBR 或 boot sector 时,可以利用 grub shell 来处理。
  • 若想要进入救援模式,可於启动菜单过程中,在 kernel 的项目后面加入『 single 』或『 init=/bin/bash 』等方式来进入救援模式。
  • 我们可以对 grub 的个别菜单给予不同的口令。

大标题的图示本章习题
( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
  • 情境模拟题一:利用救援光盘来处理系统的错误导致无法启动的问题。

    • 目标:了解救援光盘的功能;
    • 前提:了解 grub 的原理,并且知道如何使用 chroot 功能;
    • 需求:打字可以再加快一点啊! ^_^

    这个部分鸟哥就不捉图了,请大家自行处理罗~假设你的系统出问题而无法顺利启动,此时拿出原版光盘,然后重新以光盘来启动你的系统。 然后你应该要这样作的:

    1. 利用光盘启动时,到了看到 boot: 的阶段,按下 [F5] 之后会看到可以输入的选项,此时请输入:
      boot: linux rescue
      
      就能够进入救援模式的侦测了!

    2. 然后请选择语系与键盘对应,这个与安装过程是一模一样啦!所以选择『 English 』与『 us 』即可!

    3. 接下来会问你是否需要启动网络,因为我们的系统是出问题要处理,所以不需要启动网络啦!选择『 No』即可;

    4. 然后就进入救援光盘模式的文件系统搜寻了!这个救援光盘会去找出目前你的主机里面与 CentOS 5.x 相关的操作系统, 并将该操作系统汇整成为一个 chroot 的环境等待你的处置!但是他会有三个模式可以选择,分别是『continue』继续成为可读写挂载; 『Read-Only』将侦测到的操作系统变成唯读挂载;『Skip』略过这次的救援动作。在这里我们选择『 Continue 』吧!

    5. 然后系统会将侦测到的资讯通知你!一般来说,可能会在萤幕上显示类似这样的信息:『 chroot /mnt/sysimage』此时请按下 OK 吧!

    6. 按下 OK 后,系统会丢给你一个 shell 使用,先用 df 看一下挂载情况是否正确? 若不正确请手动挂载其他未被挂载的 partition 。等到一切搞定后,利用 chroot /mnt/sysimage 来转成你原本的操作系统环境吧!等到你将一切出问题的地方都搞定,请 reboot 系统,且取出光盘,用硬盘启动吧!

简答题部分:
  • 如何察看与修改 runlevel 呢?
    察看很简单,只要输入『 runlevel 』就可以得知。而如果要修改目前的 runlevel , 可以直接输入 init [level] 例如要去到 runlevel 3 可以:『 init 3 』即可。 如果想要每次启动都配置固定的 runlevel ,那么可以修改 /etc/inittab 这个文件! 将里面这一行改成:『id:3:initdefault:』即可。
  • 我有个朋友跟我说,他想要让一个程序在 Linux 系统下一启动就启动,但是在关机前会自动的先结束该程序,我该怎么建议他?
    由於 /etc/rc.d/rc[0-6].d 里面有的 Sxxname 与 Kxxname 可以配置启动启动与关机结束的事项!所以我就可以轻易的写一个 script 放在 /etc/rc.d/init.d 里面,并连结到我的 run-level 里头,就可以让他自由自在的启动与结束了!
  • 万一不幸,我的一些模块没有办法让 Linux 的核心捉到,但是偏偏这个核心明明就有支持该模块, 我要让该模块在启动的时候就被加载,那么应该写入那个文件?
    应该写入 /etc/modprobe.conf (kernel 2.6.x) 或者是 /etc/modules.conf (kernel 2.4.x) 这个文件,他是模块加载相关的地方呢!当然,也可以写入 /etc/sysconfig/modules/* 里面。
  • 如何在 grub 启动过程当中,指定以『 run level 1 』来启动?
    在启动进入 boot loader 之后,利用 grub shell 的功能,亦即输入『 e 』进入编辑模式, 然后在 kernel 后面添加:
    kernel (hd0,0)/boot/vmlinuz ro root=/dev/hda1 .... single
    那个 single 也可以改成 1 ,就能够进入。同样的,若使用 lilo 时,按下 tab 按键后, 输入
    label_name -s
    就能够进入 run level 1 罗!
  • 由於一些无心之过,导致系统启动时,只要运行 init 就会产生错误而无法继续启动, 我们知道可以在启动的时候,不要以 init 加载系统,可以转换第一支运行程序, 假设我第一支运行程序想要改为 /bin/bash ,好让我自行维护系统(不同於 run level 1 喔!), 该如何进行此一工作?
    在启动的过程当中,进入 lilo 或 grub 的画面后,在 kernel 的参数环境下,加入 init=/bin/bash 来取代 /sbin/init ,则可略过 init 与 /etc/inittab 的配置项目,不过,您必须相当熟悉 grub 与 lilo 的配置才行喔! ^_^
  • 在 CentOS 当中,我们如何自动可加载的模块?
    可以经由配置 /etc/modprobe.conf 或者是将自行做好的配置档写入到 /etc/sysconfig/modules/ 目录中, 并且将档名取为 filename.modules ,注意喔,文件结果务必是 .modules 才行。 相关资讯可以参考 /etc/rc.d/rc.sysinit 喔!
  • 如果你不小心先安装 Linux 再安装 Windows 导致 boot loader 无法找到 Linux 的启动菜单,该如何挽救?
    方法有很多,例如:
    (1)藉助第三方软件,安装类似 spfdisk 的软件在 MBR 里面,因为他同时认识 Linux 与 Windows ,所以就可以用他来进入 Linux 啦!
    (2)或者使用类似 KNOPPIX 的 Live CD 以光盘启动进入 Linux 之后,再以 chroot 软件切换根目录 (/),然后重新安装 grub 等 boot loader ,同样也可以重新让两个操作系统存在啦!
    总之,只要你知道 MBR / Super block / boot loader 之间的相关性,怎么切换都可能啊! ^_^

大标题的图示参考数据与延伸阅读

 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室