FreeBSD启动过程
启动一个计算机和加载操作系统的过程通常被叫做“bootstrap process ”或简单地叫“booting”。FreeBSD启动过程提供了许多弹性来适应实际的变化,允许选择启动在同一台计算机上安装的不同操作系统,或是同一操作系统的不同版本。这里对可能会涉及到的配置选项和如何定制FreeBSD的启动过程作一个描述。这包括内核启动前会发生的每一件事情,探测设备,启动init。如果不十分有把握的话,在系统启动时,当屏幕的文本颜色由白变灰的时候,就可以看到系统的检测信息了。
本文将介绍到:
FreeBSD的bootstrap系统有哪些组件,它们如何互相影响,在启动FreeBSD时可以给组件哪些选项来控制启动过程
注意: 这里将只描述运行在Intel x86系统上的启动过程。FreeBSD启动过程-启动过程中的问题
打开计算机和启动操作系统似乎会引起一个有趣的两难选择。根据定义,计算机在操作系统启动之前是不知道如何做事的。这包括从磁盘运行程序。所以如果计算机没有操作系统就不能运行程序,那操作系统是如何启动的呢?
这个问题与《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一运行就启动的进程。
FreeBSD启动过程
FreeBSD启动过程图中的4x16个字节是保留的4个分区信息,4x16个字节是保留的4个分区信息
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的联机手册。
FreeBSD启动过程
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
「倘若有所帮助,不妨酌情赞赏!」
感谢您的支持!
使用微信扫描二维码完成支付
你好,关于FreeBSD在安装操作系统时,进入"Escape to loader prompt."模式后,加载一个ko文件"load **.ko",总是提示找不到文件,关于这个ko,能提示一下哪里的问题吗,谢谢
@王女士
你是不是升级了kernel然后把系统升挂了? 这是进入了救援模式,ko一般是驱动程序。建议回滚