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


「倘若有所帮助,不妨酌情赞赏!」

Holmesian

感谢您的支持!

使用微信扫描二维码完成支付


相关文章

发表新评论
已有 2 条评论
  1. 王女士

    你好,关于FreeBSD在安装操作系统时,进入"Escape to loader prompt."模式后,加载一个ko文件"load **.ko",总是提示找不到文件,关于这个ko,能提示一下哪里的问题吗,谢谢

    王女士 回复
    1. Holmesian

      @王女士

      你是不是升级了kernel然后把系统升挂了? 这是进入了救援模式,ko一般是驱动程序。建议回滚

      Holmesian 回复