7FreeBSD的启动过程

7.1概要

启动一个计算机和加载操作系统的过程通常被叫做“bootstrap process”或简单地叫“booting”FreeBSD的启动过程提供了许多弹性来适应实际的变化,允许你选择启动在同一台计算机上安装的不同操作系统,或是同一操作系统的不同版本。

这章将比较细致地对你可能会涉及到的配置选项和如何定制FreeBSD的启动过程作一个描述。这包括内核启动前会发生的每一件事情,探测设备,启动init。如果你不十分有把握的话,在系统启动时,当你的屏幕的文本颜色由白变灰的时候,就可以看到系统的检测信息了。

阅读完这章,你将了解到:

             FreeBSDbootstrap系统有哪些组件,它们如何互相影响。

             在启动FreeBSD时你可以给组件哪些选项来控制启动过程。

注意: 这章将只描述运行在Intel x86系统上的启动过程。

7.2启动过程中的问题

打开计算机和启动操作系统似乎会引起一个有趣的两难选择。根据定义,计算机在操作系统启动之前是不知道如何做事的。这包括从磁盘运行程序。所以如果计算机没有操作系统就不能运行程序,那操作系统是如何启动的呢?

这个问题与《The Adventures of Baron Munchausen》(这是一本讲述难以置信的冒险故事的书)一书中的问题很相似。一个人沿着检修孔慢慢下去,然后通过抓住他的解靴带(bootstrap)爬上来。在计算机发展的早期,术语bootstrap被应用于加载操作系统的机制,它也可以缩短为“booting”

x86系统中,主要由基本输入输出系统(BIOS)来负责加载操作系统。BIOS首先检查磁盘的主引导记录(MBR),它是在磁盘的一个比较特殊的地方。BIOS加载和运行MBR,而MBR能完成加载操作系统以外的任务。

如果你的计算机只有安装一个操作系统,那标准的MBR将起作用。这个MBR会搜索磁盘上第一个启动slice,然后在这个slice上运行代码来加载引导操作系统余下的部分程序。

如果你在磁盘上安装了多个操作系统,你可以安装一个不同的MBRMBR可以显示一个不同操作系统的列表,允许你选择一个启动。FreeBSD使用这样的MBR,其他操作系统也会提供其他的MBR

FreeBSDbootstrap系统的其余部分被分成三个阶段。第一个阶段是运行MBR,它只知道把计算机带入一个特殊的状态,然后运行第二阶段。第二阶段执行的程序要多一点。第三阶段就完成加载操作系统的任务。这个工作被分成三个阶段是因为PC的标准限制了程序的大小。这一系列串起来的任务允许FreeBSD提供一个比较灵活的加载程序。

内核启动后,就会探测设备并对它们进行初始化,一旦内核启动过程完成,内核就把控制权交给用户处理进程init,它可以确定磁盘是否处于可用状态。Init接着就启动用户级资源配置来加载文件系统,设置网卡来激活网络,接着就启动所有的通常在FreeBSD一运行就启动的进程。

7.3 MBR,启动步骤123

7.3.1 MBR, /boot/boot0

FreeBSD MBR是驻留在/boot/boot0上的。这是MBR的一个拷贝,因为真正的MBR必须被放置在磁盘的一个特殊部分,在FreeBSD区域的外面。

boot0非常简单,在主引导区的程序可能只有512个字节。如果你已经安装了FreeBSDMBR,而且还安装了多个操作系统,将会在启动时看到一个比较熟悉的画面。

7-1. boot0画面

    F1  DOS

    F2  FreeBSD

    F3  Linux

    F4  ??

    F5  Drive 1

   

    Default: F2

其他操作系统,如Windows 95,会用自己的MBR来改写已存在的MBR。如果碰到这样的事,或你想替换成FreeBSDMBR,你可以使用下面的命令:

    # fdisk -B -b /boot/boot0 device

这儿的device是你用来启动的设备,如第一个IDE磁盘ad0,在第二个IDE控制器上的第一个磁盘ad2,在第一个SCSI磁盘da0等等。

7.3.2步骤1, /boot/boot1, 步骤2, /boot/boot2

1和第2个步骤是在磁盘同一个区域的同一个程序的两个部分。由于磁盘空间的限制,它们被分成了两部分,但你必须要将它们安装在一起。

它们可以在启动slice的启动扇区找到。在/boot目录中的文件只是真实文件的副本,而真实文件是存储在FreeBSD文件系统外面的。

Boot1是非常简单的,它也可能只有512字节,只有FreeBSD的存储有磁盘分区信息的磁盘标签(Disklabel)比较清楚,找到它之后,就可以执行boot2

Boot2稍微有点复杂,它记录着FreeBSD的文件系统以便于在它上面找到文件,另外它也提供了一个选择可运行的内核或引导程序的简单接口。Loader还要复杂一点,它提供了一个易于使用的启动配置信息,通常boot2之后就是运行它了,但以前它可以直接运行内核。

7-2. boot2画面

    >> FreeBSD/i386 BOOT

    Default: 0:ad(0,a)/kernel

    boot:

如果你需要替换已安装的boot1boot2,可以使用disklabel

    # disklabel -B diskslice

diskslice是启动系统的磁盘和slice的地方,如ad0s1,在第一个IDE磁盘的第一个slice上。

危险的模式:如果你只使用磁盘名称,如ad0,在disklabel命令中,你将创建一个危险的磁盘,没有slice。这可能不是你想要做的,所以确定在键入RETURN之前,你已反复检查了命令disklabel

7.3.3步骤3/boot/loader

引导程序loader是三步中的最后一步,它在文件系统的/boot/loader中。Loader使用一个易于使用的内建命令集来进行友好的配置,使用一个复杂的命令集,通过一个强大的接口来进行备份。

 

Loader的执行过程

初始化过程中,引导程序loader探测到一个控制台和一些磁盘,并且指出从哪个磁盘启动。因此,它可以设置成可变化的,然后解释程序就开始启动,命令就会被解释执行。

最后,默认情况下启动程序停顿10秒钟(当然你可以按任意键继续),然后启动内核。如果进程被打断了,用户可以使用命令来调整参数,卸载或装载模块,最后进入系统或重新启动。一个更深入的技术讨论,你可以阅读loader的联机手册。

Loader内建命令

这些命令集包括:

autoboot seconds

在规定的时间内不被打断的话,继续启动内核。如果显示一个倒计时,默认的时间是10秒钟。

boot [-options] [kernelname]

直接配合所给的参数启动内核。

boot-conf

在启动时,使用自动的变量配置模块,这只在你先用unload时才有意义,并改变一些变量,通常是kernel

help [topic]

显示来自/boot/loader.help的求助信息,如果所给的主题(topic)是索引(index),那就显示所有的主题列表。

include filename ...

执行所给的文件,这文件将被读入并一行一行地执行,一旦有错误发生就直接停止这个inlucde命令。

load [-t type] filename

加载kernelkernel模块或原先指定的文件类型,再接着文件名。任何跟在文件之后的参数都将会传给这个文件来执行。

 

ls [-l] [path]

列出在给定路径中的文件。如果没有指定路径,将显示root目录的文件列表。如果有附加-l参数,那么将一起显示文件大小。

lsdev [-v]

列出所有可以加载模块的设备,如果指定-v参数,那么会列出更详细的信息。

lsmod [-v]

显示已被加载的模块,如果有指定-v参数,那么更详细的信息会一起列出。

more filename

在显示的每一行用一个终止符,显示所指定的文件内容。

reboot

直接重新启动系统。

set variable, set variable=value

设置loader的环境变量。

unload

卸载所有已加载的模块。

Loader举例

这里就是一些loader使用的实际例子。

     在单用户模式下启动你的普通内核:

boot -s

     卸载你的普通内核和模块,然后仅仅引导你的旧(或另一个)内核:

unload

load kernel.old

你可以使用kernel.GENERIC,这是安装光盘上的通用kernel,或是kernel.old,这是你上一个安装的kernel (如果你有升级或重新配置你自己的kernel的话)

注意: 照着下列的步骤可以配合原先的模块来加载其他的kernel

unload

set kernel=“kernel.old”

boot-conf

     加载内核配置的脚本文件 (这是一个自动的脚本文件,用来执行你在kernel启动阶段所要执行的命令)

load -t userconfig_script

/boot/kernel.conf

7.4启动过程中内核的调节

一旦内核通过loader (一般来说) boot2 (略过执行loader),内核将会检查它的启动标记,如果有,就开始按照标记做一些必要的调节。

7.4.1内核启动标记

这儿是一些启动标记:

a

在内核初始化期间,询问要使用哪一个设备作为root文件系统。

C

CDROM启动。

c

运行UserConfig,启动时的内核配置。

s

从单用户模式启动。

v

在内核启动期间更详细的信息。

7.5 Init:过程控制初始化

内核一旦启动完成,它就把控制权转交给用户层命令init,它就在/sbin/init中,在loader中,程序路径可以通过init_path指定。

7.5.1自动重新启动

这个程序会确定系统将要使用的文件系统是存在的。如果不存在,那么fsck就不能正常地被执行去修复磁盘驱动器,接着init将把系统切换成单用户模式,系统管理者就可以在这时候直接处理这个错误。

 

7.5.2单用户模式

这个模式能够通过自动重新启动顺序来完成,或在用户启动时通过加上-s选项,或在loader中设置boot_single。它也可以不重新启动通过呼叫shutdown来达到,或在多用户模式下加上-h选项。如果系统控制台被设置成insecure,那在开始单用户模式之前,系统就要求键入root密码。

例如7-3. /etc/ttys中设置一个控制台为insecure

# name  getty                           type    status          comments

#

# This entry needed for asking password when init goes to single-user mode

# If you want to be asked for password, change “secure” to “insecure” here

console none                            unknown off insecure

注意: 一个insecure的控制台代表你的控制台的安全等级是insecure的,并且确定如果有人要进入单用户模式,就要输入root密码。请注意,insecure不代表你的控制台是inscurely的。而是,如果你要多一点的安全防护,请选择insecure,而不是secure

7.5.3多用户模式

如果init正确地找到了你的文件系统,或结束了单用户模式,系统就会进入多用户模式,并开始系统的资源配置。

资源配置

资源配置系统将先读取默认的配置文件/etc/defaults/rc.conf,和指定系统的详细配置/etc/rc.conf,接着按照/etc/fstab来加载文件系统,再激活网络服务,和其他的系统守护程序(daemon),最后,执行部分程序的起始脚本(script)文件。rc联机手册是资源设置系统很好的参考。同样,直接查阅那些脚本也是个好方法。

7.6关机顺序

使用shutdown可以控制系统进行关机,init将会执行/etc/rc.shutdown这个脚本文件,然后发送TERM信号和KILL信号给所有没有及时终止的所有进程。