目录
7 FreeBSD 的启动过程
7.1 概要
7.2 启动中的问题
7.3 MBR,启动步骤1、2 和3
7.4 启动时内核的调节
7.5 Init: 进程控制初始化
7.6 关机程序
=============================================================
第7 章FreeBSD 启动过程
=============================================================
(翻译中出现的任何问题或错误,请广大读者及时反馈给我:freebsdhandbook@163.com)
7.1 概要
启动一个电脑和加载操作系统的过程被叫做“bootstrap process”或简单地叫
“booting”。FreeBSD 的启动过程提供了许多弹性来适应实际的变化,允许你选择启动在
同一台电脑上安装的不同操作系统,或是同一操作系统的不同版本。
这章将比较细致地对你可能会涉及到的配置选项和如何定制FreeBSD 的启动过程作一
个描述。这包括内核启动前会发生的每一件事情,探测设备,启动init。如果你不十分有
把握的话,当你的屏幕的文本颜色由白变灰的时候,你就可以看到系统检测信息了。
阅读完这章,你将了解到:
FreeBSD 的bootstrap 系统有哪些组件,它们如何互相影响。.
在启动FreeBSD 时你可以给组件哪些选项来控制启动过程。.
注意: 这章将只描述运行在Intel x86 系统上的启动过程。
7.2 启动过程中的问题
打开电脑和启动操作系统似乎会引起一个两难的选择。根据定义,电脑在操作系统启动
之前是不知道如何做事的。这包括从磁盘运行程序。所以如果电脑没有操作系统就不能运行
程序,那操作系统是如何启动的呢?
在x86 系统中,主要由基本输入输出系统(BIOS)来负责加载操作系统。BIOS 首先检
查磁盘的主引导区(MBR),它是在磁盘的一个比较特殊的地方。BIOS 加载和运行MBR,而
MBR 能完成加载操作系统以外的任务。
如果你只有一个操作系统安装在电脑上,那标准的MBR 将起作用。这个MBR 会搜索磁盘
上的启动slice,然后在这个slice 上运行代码来加载引导操作系统的余下的部分程序。
第1 页FreeBSD 使用手册
如果你在磁盘上安装了多个操作系统,你可以安装一个不同的MBR,MBR 可以显示一个
不同操作系统的列表,允许你选择一个启动。FreeBSD 使用这样的MBR,其他操作系统也会
提供其它的MBR。
FreeBSD 的bootstrap 系统的其余部分被分成三个阶段。第一个阶段是运行MBR,它只
知道把电脑带入一个特殊的状态,然后运行第二阶段。第二阶段要执行的程序要多一点。第
三阶段就完成加载操作系统的任务。这个工作被分成三个阶段是因为PC 的标准限制了程序
的大小。这一系列串起来的任务允许FreeBSD 提供一个比较灵活的加载程序。
内核启动后,就会探测设备并对它们进行初始化,一旦内核启动过程完成,内核就把控
制权交给用户处理进程init,它可以确定磁盘是否处于可用状态。Init 接着就启动用户级
资源配置来加载文件系统,设置网卡来激活网络,接着就启动所有的通常在FreeBSD 一运行
就启动的进程。
7.3 MBR 启动步骤1、2 和3
7.3.1 MBR, /boot/boot0
FreeBSD MBR 是驻留在/boot/boot0。这是MBR 的一个拷贝,因为真正的MBR 必须被放
置在磁盘的一个特殊部分,在FreeBSD 区域的外面。boot0 非常简单,在主引导区的程序可
能只有512 个字节。如果你已经安装了FreeBSD 的MBR,而且还安装了多个操作系统,你将
会在启动时看到一个比较熟悉的画面。
例7-1. boot0 画面
F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1
Default: F2
第2 页FreeBSD 使用手册
其它操作系统,如windows 95,会用自己的MBR 来改写已存在的MBR。如果碰到这样的
事,或你想替换FreeBSD 的MBR,你可以使用下面的命令:
# fdisk -B -b /boot/boot0 device
这儿的device是你用来启动的设备,如第一个IDE 磁盘ad0,在第二个IDE 控制器上的
第一个磁盘,在第一个SCSI 磁盘da0 等等。
7.3.2 步骤1, /boot/boot1, 步骤2, /boot/boot2
Boot1 可以在引导分区的引导扇区上找到,它无论是在boot0 上,或是在MBR 上的其它
程序都能找到这样的程序继续启动进程。
Boot1 是非常简单的,它也可能只有512 字节,只是表明了FreeBSD 的存储有磁盘分区
信息的磁盘标签(Disklabel),找到它之后,就会执行boot2。
Boot2 稍微有点复杂,它记录着FreeBSD 的文件系统以便于在它上面找到文件,另外它
也提供了一个选择可运行的内核或引导程序的简单接口。Loader 还要复杂一点,它提供了
一个易于使用的启动配置信息,通常boot2 之后就是运行它了,但以前它可以直接运行内核。
例7-2. boot2 画面
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/kernel
boot:
如果你需要替换已安装的boot1 和boot2,可以使用disklabel。
# disklabel -B diskslice
diskslice是启动系统的磁盘和slice 的地方, 如ad0s1,在第一个IDE 磁盘的第一个
slice 上。
危险的模式:如果你使用了刚才的磁盘名称,如ad0,在disklabel 命令中,你将创建
一个危险的磁盘,没有slices。这可能不是你想要做的,所以确定你在键入RETURN 之前,
第3 页FreeBSD 使用手册
你已反复检查了命令disklabel。
7.3.3 步骤3,/boot/loader
引导程序loader 是三步中的最后一步,它可能在/boot/loader。Loader 有一个非常友
好的配置方法,使用一个易于使用的内建命令,通过一个强大的接口来备份。
7.3.3.1 Loader 的执行过程
初始化过程中,引导程序探测到一个控制台和一些磁盘,计算出从哪个磁盘启动。因此,
它可以设置成可变化的,然后解释程序就开始启动,命令就会被解释执行。
最后,默认情况下启动程序停顿10 秒钟(当然你可以按任意键继续),然后启动内核。
如果进程被打断了,用户可以使用命令来调整参数,卸载或装载模块,最后启动或重新启动。
一个更深入的技术讨论,你可以阅读loader 的联机手册。
7.3.3.2 Loader 内建命令
这些命令集包括:
autoboot seconds
在规定的时间内不被打断的话,继续启动内核。如果显示一个倒计时,默认的时间
是10 秒钟。
boot [-options] [kernelname]
直接配合所给的参数加载内核。
boot-conf
在启动时,使用自动的变量配置模块,这只在你先用unload 时才有意义,并改变一
些变量,通常是kernel。
help [topic]
第4 页FreeBSD 使用手册
显示来自/boot/loader.help 的求助信息,如果所给的主题(topic)是index,那就
显示所有的主题列表。
include filename ...
执行所给的文件,这文件将被读入并一行一行地执行,一旦有错误发生就直接停止
这个inlucde 命令。
load [-t type] filename
加载kernel,kernel 模块或原先指定的文件类型,再接着文件名。任何跟在文件之
后的参数都将会传给这个文件来执行。
ls [-l] [path]
列出在给定路径中的文件。如果没有指定路径,将显示root 目录的文件列表。如果
有附加-l 参数,那么将一起显示文件大小。
lsdev [-v]
列出所有可以加载module 的设备,如果指定-v 参数,那么会列出更详细的信息
lsmod [-v]
显示已被加载的module,如果有指定-v 参数,那么更详细的信息会一起列出。
more filename
显示所指定的文件内容,并在每LINES (环境变量) 暂停。
reboot
直接重新启动机器。
set variable, set variable=value
第5 页FreeBSD 使用手册
设置loader 的环境变量。
unload
卸载所有被加载的module。
7.3.3.3 Loader 举例
这里就是一些loader 使用的实际例子。
1,在单用户模式下启动你的普通内核:
boot -s
2,卸载你的普通内核和模块,然后仅仅引导你的旧(或另一个)内核:
unload
load kernel.old
3,你可以使用kernel.GENERIC,这是安装光盘上的通用kernel,或是kernel.old,
这是你上一个安装的kernel (如果你有升级或重新配置你自己的kernel 的话)。
注意: 照着下列的步骤可以配合原先的module 来加载其它的kernel:
unload
set kernel=”kernel.old”
boot-conf
4,加载内核配置的script 文件(这是一个自动的script 文件,用来执行你在kernel
启动阶段所要执行的命令):
load -t userconfig_script
/boot/kernel.conf
7.4 启动时内核的调节
一旦kernel 通过loader (一般来说) 或boot2 (略过执行loader),kernel 将会
检查它的启动标记,如果有,就开始按照标记做一些必要的调节。
7.4.1 内核启动标记
这儿是一些启动标记:
a
在内核初始化期间,询问要使用哪一个设备作为root 文件系统
第6 页FreeBSD 使用手册
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 选项。如果系统控制台console 被设置成insecure,那在开始单用户模式之前,系
统就要求键入root 密码。
例如7-3. 在/etc/ttys 中设置一个console 为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 的console 代表你的console 的安全等级是insecure 的,并且
确定如果有人要进入单用户模式,就要输入root 密码,请注意,insecure 不代表你的
第7 页FreeBSD 使用手册
console 是inscure 的,而是,如果你要多一点的安全防护,请选择insecure,而不是secure。
7.5.3 多用户模式
如果init 正确地找到了你的文件系统,或结束了单用户模式,系统就会进入多用户模
式,并开始系统的资源配置。系统将先执行默认的配置文件/etc/defaults/rc.conf,和系
统的详细配置/etc/rc.conf,接着按照/etc/fstab 来加载文件系统,再激活网络服务,和
其它的系统守护程序(daemon),最后,执行部分程序的起始script 文件。rc 是个参考资源
设置系统的好地方,同样,直接查阅那些scripts 也是个好方法。
7.6 关机程序
使用shutdown 可以控制系统进行关机,init 将会执行/etc/rc.shutdown 这个script
文件,接着输出终止(terminate) 信号给所有的程序,这时如果有无法终止的程序,那么就
使用kill 来杀死信号。