FreeBSD启动过程。启动一个计算机和载入作业系统的过程通常被叫做“bootstrap process ”或简单地叫“booting”。FreeBSD启动过程提供了许多弹性来适应实际的变化,允许选择启动在同一台计算机上安装的不同作业系统,或是同一作业系统的不同版本。
基本介绍
- 中文名:FreeBSD启动过程
- 别称:bootstrap process
- 条件:同一作业系统的不同版本
- 特点:提供了许多弹性来适应实际的变化
概要
启动一个计算机和载入作业系统的过程通常被叫做“bootstrap process ”或简单地叫“booting”。FreeBSD启动过程提供了许多弹性来适应实际的变化,允许选择启动在同一台计算机上安装的不同作业系统,或是同一作业系统的不同版本。
这里对可能会涉及到的配置选项和如何定製FreeBSD的启动过程作一个描述。这包括核心启动前会发生的每一件事情,探测设备,启动init。如果不十分有把握的话,在系统启动时,当萤幕的文本颜色由白变灰的时候,就可以看到系统的检测信息了。
本文将介绍到:
FreeBSD的bootstrap系统有哪些组件,它们如何互相影响
在启动FreeBSD时可以给组件哪些选项来控制启动过程
注意: 这里将只描述运行在Intel x86系统上的启动过程。
启动过程中的问题
打开计算机和启动作业系统似乎会引起一个有趣的两难选择。根据定义,计算机在作业系统启动之前是不知道如何做事的。这包括从磁碟运行程式。所以如果计算机没有作业系统就不能运行程式,那作业系统是如何启动的呢?
这个问题与《The Adventures of Baron Munchausen》(这是一本讲述难以置信的冒险故事的书)一书中的问题很相似。一个人沿着检修孔慢慢下去,然后通过抓住他的解靴带(bootstrap)爬上来。在计算机发展的早期,术语bootstrap被套用于载入作业系统的机制,它也可以缩短为“booting”。
在x86系统中,主要由基本输入输出系统(BIOS)来负责载入作业系统。BIOS首先检查磁碟的主引导记录(MBR),它是在磁碟的一个比较特殊的地方。BIOS载入和运行MBR,而MBR能完成载入作业系统以外的任务。
如果计算机只安装一个作业系统,那标準的MBR将起作用。这个MBR会搜寻磁碟上第一个启动slice,然后在这个slice上运行代码来载入引导作业系统余下的部分程式。
如果在磁碟上安装了多个作业系统,可以安装一个不同的MBR,MBR可以显示一个不同作业系统的列表,允许你选择一个启动。FreeBSD使用这样的MBR,其他作业系统也会提供其他的MBR。
FreeBSD的bootstrap系统的其余部分被分成三个阶段:
第一阶段是运行MBR,它只知道把计算机带入一个特殊的状态;
第二阶段执行的程式要多一点;
第三阶段就完成载入作业系统的任务。
这个工作被分成三个阶段是因为PC的标準限制了程式的大小。这一系列串起来的任务允许FreeBSD提供一个比较灵活的载入程式。
核心启动后,就会探测设备并对它们进行初始化,一旦核心启动过程完成,核心就把控制权交给用户处理进程init,它可以确定磁碟是否处于可用状态。Init接着就启动用户级资源配置来载入档案系统,设定网卡来激活网路,接着就启动所有的通常在FreeBSD一运行就启动的进程。

MBR启动步骤1、2和3

MBR, /boot/boot0
FreeBSD MBR是驻留在/boot/boot0上的。这是MBR的一个拷贝,因为真正的MBR必须被放置在磁碟的一个特殊部分,在FreeBSD区域的外面。
boot0非常简单,在主引导区的程式可能只有512个位元组。如果已经安装了FreeBSD的MBR,而且还安装了多个作业系统,将会在启动时看到一个比较熟悉的画面。
boot0画面类似下面
F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1
Default: F2
其他作业系统如Windows,会用自己的MBR来改写已存在的MBR。如果碰到这样的事,或想替换成FreeBSD的MBR,可以使用下面的命令:
# fdisk -B -b /boot/boot0 device
device是用来启动的设备,如第一个IDE磁碟ad0,在第二个IDE控制器上的第一个磁碟ad2,在第一个SCSI磁碟da0等等。
步骤1:/boot/boot1 步骤2:/boot/boot2
第1和第2个步骤是在磁碟同一个区域的同一个程式的两个部分。由于磁碟空间限制,它们被分成了两部分,但必须要将它们安装在一起。
它们可以在启动slice的启动扇区找到。在/boot目录中的档案只是真实档案的副本,而真实档案是存储在FreeBSD档案系统外面的。
Boot1是非常简单的,它也可能只有512位元组,只有FreeBSD的存储有磁碟分区信息的磁碟标籤(Disklabel)比较清楚,找到它之后,就可以执行boot2。
Boot2稍微有点複杂,它记录着FreeBSD的档案系统以便于在它上面找到档案,另外它也提供了一个选择可运行的核心或引导程式的简单接口。Loader还要複杂一点,它提供了一个易于使用的启动配置信息,通常boot2之后就是运行它了,但以前它可以直接运行核心。
boot2画面类似下面
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/kernel
boot:
如果需要替换已安装的boot1和boot2,可以使用disklabel。
# disklabel -B diskslice
diskslice是启动系统的磁碟和slice的地方,如ad0s1,在第一个IDE磁碟的第一个slice上。
危险的模式:如果只使用磁碟名称,如ad0,在disklabel命令中,将创建一个危险的磁碟,没有slice。这可能不是想要做的,所以确定在键入RETURN之前,已反覆检查了命令disklabel。
步骤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
载入kernel,kernel模组或原先指定的档案类型,再接着档案名称。任何跟在档案之后的参数都将会传给这个档案来执行。
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:
unload
set kernel=“kernel.old”
boot-conf
载入核心配置的脚本档案 (这是一个自动的脚本档案,用来执行在kernel启动阶段所要执行的命令):
load -t userconfig_script
/boot/kernel.conf
启动过程中核心的调节
一旦核心通过loader (一般来说) 或boot2 (略过执行loader),核心将会检查它的启动标记,如果有,就开始按照标记做一些必要的调节。
核心启动标记
这是一些启动标记:
a
在核心初始化期间,询问要使用哪一个设备作为root档案系统。
C
从CDROM启动。
c
运行UserConfig,启动时的核心配置。
s
从单用户模式启动。
v
在核心启动期间更详细的信息。
Init:过程控制初始化
核心一旦启动完成,它就把控制权转交给用户层命令init,它就在/sbin/init中,在loader中,程式路径可以通过init_path指定。
自动重新启动
这个程式会确定系统将要使用的档案系统是存在的。如果不存在,那幺fsck就不能正常地被执行去修复磁碟驱动器,接着init将把系统切换成单用户模式,系统管理者就可以在这时候直接处理这个错误。
单用户模式
这个模式能够通过自动重新启动顺序来完成,或在用户启动时通过加上-s选项,或在loader中设定boot_single。它也可以不重新启动通过呼叫shutdown来达到,或在多用户模式下加上-h选项。如果系统控制台被设定成insecure,那在开始单用户模式之前,系统就要求键入root密码。
在/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。
多用户模式
如果init正确地找到了档案系统,或结束了单用户模式,系统就会进入多用户模式,并开始系统的资源配置。
资源配置
资源配置系统将先读取默认的配置档案/etc/defaults/rc.conf,和指定系统的详细配置/etc/rc.conf,接着按照/etc/fstab来载入档案系统,再激活网路服务,和其他的系统守护程式(daemon),最后,执行部分程式的起始脚本(script)档案。rc在线上手册是资源设定系统很好的参考。同样,直接查阅那些脚本也是个好方法。
关机顺序
使用shutdown可以控制系统进行关机,init将会执行/etc/rc.shutdown这个脚本档案,然后传送TERM信号和KILL信号给所有没有及时终止的所有进程。