FreeBSD handbook中文版 7 FreeBSD 的启动过程

目录
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 来杀死信号 。