13.3. 引导管理器和各引导阶段

13.3.1. 引导管理器

MBR 或引导管理器中的代码有时也称作引导过程的 阶段0。 这节将讨论两种引导管理器: boot0LILO

boot0 引导管理器:. 由 FreeBSD 的安装程序, 或 boot0cfg(8) 基于 /boot/boot0 所安装的 MBR。 默认基于 /boot/boot0。 由于分区表和 MBR 末尾的 0x55AA 标识信息占用的空间, boot0 的尺寸和功能限制在 446 个字节长能表达的范围内。 如果安装了 boot0 以及多个操作系统, 在开机时就可以看到类似下面的提示信息:

Example 13.1. boot0 的屏幕输出
F1 Win
F2 FreeBSD

Default: F2

如果在装好 FreeBSD 之后安装一些其它的操作系统, 特别是 Windows®, 它们可能会覆盖现有的 MBR。 如果发生了这种情况, 或者希望以 FreeBSD 的 MBR 覆盖现有的 MBR, 可以使用下面的命令:

# fdisk -B -b /boot/boot0 device

其中, device 是引导系统的磁盘, 例如 ad0 通常是第一个 IDE 磁盘, ad2 是第二个 IDE 控制器上的第一个 IDE 磁盘, 或者, da0 通常是第一个 SCSI 磁盘。 如果需要自行配置 MBR, 请参阅 boot0cfg(8)

LILO 引导管理器:. 安装这个引导管理器, 并用它来引导 FreeBSD, 可以启动到 Linux 环境, 并在配置文件 /etc/lilo.conf 中加入以下设置:

other=/dev/hdXY
table=/dev/hdX
loader=/boot/chain.b
label=FreeBSD

在以上的设置中, 需要按 Linux 的表示方法来指明 FreeBSD 所在的磁盘和分区。 将其中的 X 改为 Linux 驱动器字母, 并把 Y 改为 Linux 主分区编号。 如果使用的是 SCSI 磁盘, 还需要把 /dev/hd 改为 /dev/sd。 如果两个操作系统位于同一磁盘上, 则可省略 loader=/boot/chain.b 这行。 现在您可以执行 /sbin/lilo -v 来令修改生效。 请检查屏幕上显示的信息, 以确认修改无误。

13.3.2. 第一阶段,/boot/boot1,和第二阶段, /boot/boot2

概念上, 第一、 第二阶段属于同一个程序, 位于磁盘上的同一区域。 由于空间限制, 它们被人为分成了两部分, 但总是由安装程序或 bsdlabel(8) 从事先组装好的 /boot/boot 中同时安装。

它们位于文件系统之外, 位于引导分区的第一个磁道, 从第一个第一扇区开始。 这个位置是 boot0 (Section 13.3.1, “引导管理器”) 或任何其他引导管理器寻找下一阶段的引导程序, 从而继续引导进程时所查找的地方。 所需使用的扇区数目可以很容易地通过 /boot/boot 的大小来确定。

boot1 非常简单, 因为它最大也不能超过 512 字节。 因此, 它只具备识别保存分区信息的 FreeBSD bsdlabel, 以及寻找并执行 boot2 的能力。

boot2 稍微复杂一些, 它能够从 FreeBSD 文件系统中查找文件, 并提供简单的界面供用户选择希望运行的内核或引导加载器。

boot2 运行的引导加载器 loader(8) 在功能方面就强大多了, 它能提供完整的引导配置能力。

Example 13.2. boot2 的屏幕输出
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:

您可以用 bsdlabel(8) 来替换目前安装的 boot1boot2

# bsdlabel -B diskslice

其中, diskslice 是用于引导的磁盘和分区, 例如 ad0s1 表示第一个 IDE 磁盘上的第一个分区。

独享模式 (Dangerously Dedicated Mode):

如果在指定设备名时只用到了磁盘的名字, 例如 ad0, 而没有指定磁盘分区, 则 bsdlabel(8) 会将磁盘视为 FreeBSD 独享的 (dangerously dedicated)。 基于一些技术原因, 您可能并不希望如此。 因此, 请在按下 Return 之前仔细确认 bsdlabel(8)diskslice 参数。

13.3.3. 第三阶段,/boot/loader

引导加载器 (loader) 是三个阶段中的最后阶段, 它是直接放在文件系统之中的, 通常是 /boot/loader 文件。

引导加载器的设计初衷是希望提供使用命令与系统交互的配置方式, 这是通过配合强大解释器的内建命令集来实现的。

13.3.3.1. 引导加载器的程序流程

在初始化过程中, 引导加载器会探测控制台和磁盘, 并找到用于引导系统的磁盘。 接着, 它据此设置一系列环境变量, 并启动解释器, 用于执行脚本或来自用户的交互式命令。

接下来, 引导加载器会载入 /boot/loader.rc, 后者默认会读取 /boot/defaults/loader.conf 来将一系列变量设为适当的默认值, 接着读取 /boot/loader.conf 来应用适用于本机的变量值。 接着, loader.rc 根据这些变量进行操作, 加载选定的的模块和内核。

最后, 引导加载器会进行 10 秒倒计时等待用户按键, 如果没有被按键打断, 则会启动内核。 如果用户通过按键打断这个过程, 则会得到一个命令提示符, 供用户使用引导加载器的命令集来修改变量、 卸载全部模块、 加载模块, 最终启动或重启系统。

13.3.3.2. 引导加载器的内建命令

这些是最常用的引导加载器命令。 对所有可用命令的解释请参见 loader(8)

autoboot seconds

倒数 seconds 秒, 如果在这段时间之内没有按键, 就继续启动内核。 它会显示一个倒数计时器, 缺省情况下是倒计时 10 秒。

boot [-options] [kernelname]

立即用指定的 options 作为选项启动名字是 kernelname 的内核。 在命令行中指定内核的名字只有在先前执行过 unload 命令时才有效; 否则, 系统会继续使用之前已经载入的内核。

boot-conf

基于变量对各种模块进行自动配置 (和引导内核时发生的一样), 主要是 kernel。 在修改这些变量之前应首先 unload

help [topic]

显示来自 /boot/loader.help 的帮助信息。 如果指定的主题参数 topic 是 index, 则系统会列出所有可用的主题。

include filename

读取并处理给定的名为 filename 的文件。 这个文件会读入内存并逐行解释, 这个过程中如果发生错误, 则会终止 include 命令。

load [-t type] filename

加载名为 filename 的内核、 内核模块, 或指定类型 type 的文件。 在 filename 后面的内容则被视为参数传给文件。

ls [-l] [path]

列出位于指定 path 路径的文件, 如果没有指定则列出根目录的内容。 在指定 -l 时, 则会同时列出文件尺寸。

lsdev [-v]

列出所有可以用于加载模块的设备。 如果指定了 -v 选项, 则会显示更多的细节信息。

lsmod [-v]

显示已经加载的模块。 如果指定了 -v 选项, 则会显示更多的细节信息。

more filename

显示名为 filename 的文件, 并在每次输出了 LINES 行时暂停。

reboot

立即重启系统。

set variable, set variable=value

设置引导加载器的环境变量。

unload

卸载所有先前载入的模块。

13.3.3.3. 引导加载器的使用示例

以下是一些常见的引导加载器用法:

  • 启动平时使用的内核并进入单用户模式

    boot -s
  • 卸载默认的内核及模块, 然后加载旧的或其它的内核:

    unload
    load kernel.old

    您可以用 kernel.GENERIC 来指定安装时使用的通用内核, 或者, 如果升级过系统或安装过定制的内核, 则可以用 kernel.old 来表示之前安装的内核。

    Note:

    如果使用内核模块的话, 还需要用下面的命令来加载这些与另外的内核配套的模块:

    unload
    set kernel="kernel.old"
    boot-conf
  • 加载自动化内核配置脚本:

    load -t userconfig_script /boot/kernel.conf

13.3.3.4. 启动时的引导画面 (splash screen)

Contributed by Joseph J. Barbish.

引导画面可以用来代替常规的引导信息。 这样, 引导时的探测设备以及启动服务等信息就隐藏在其后, 直到需要命令行或图形界面登录时为止。

FreeBSD 系统提供了两种基本的环境。 第一种是默认的传统虚拟控制台命令行环境。 在系统完成引导之后, 在控制台上会给出登录提示符。 第二种环境是在 Chapter 6, X Window 系统 中描述的图形界面环境。 请参阅这章内容了解图形显示管理器以及图形登录管理器。

13.3.3.4.1. 引导画面功能

引导画面功能支持 256 色的位图 (.bmp)、 ZSoft PCX (.pcx), 以及 TheDraw (.bin) 文件格式。 这些图片的分辨率必须是 320 x 200 像素或更少, 才能在标准 VGA 适配器上使用。

要使用更大, 但尺寸不超过 1024 x 768 像素分辨率的图像, 则需要在系统引导时加载 VESA 模块。 如果使用定制内核, 可以根据 Chapter 9, 配置FreeBSD的内核 的介绍将内核配置选项 VESA 加入。 加载 VESA 支持, 将会为系统提供可以填满整个显示屏的引导画面的能力。

在启动的时, 引导画面就会显示在屏幕上, 在启动过程中的任何时候, 都可以通过按任意键来关闭它。

引导画面同时也作为屏保来使用。 当一段时间无人操作计算机之后, 系统就会显示出引导画面, 并周期性地从明亮至暗淡变换。 以引导画面作为屏保可以通过在 /etc/rc.conf 中的 saver= 选项来控制。 系统内建的屏保列表可以在联机手册 splash(4) 中找到。 saver= 选项仅适用于虚拟控制台。 对图形显示管理器无效。

需要说明的是, 即使启用了引导画面, 一部分引导加载器的提示信息, 包括启动系统时的倒计时提示, 也仍然会在开机时显示出来。

引导画面的一些示例可以在 http://artwork.freebsdgr.org 下载。 如果安装了 sysutils/bsd-splash-changer port, 系统会在每次启动时从一组引导画面中随机挑选一个来显示。

13.3.3.4.2. 启用引导画面功能

引导画面图像 (.bmp)、 (.pcx) 或 .bin 文件必须放置在系统启动所用的根文件系统上, 例如 例如 /boot 目录中。

如果希望以默认的显示分辨率 (256 色, 320x200 像素或更少), 编辑 /boot/loader.conf 并在其中增加下列设置:

splash_bmp_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bmp"

如果需要使用更高、 最大至 1024x768 像素的分辨率, 编辑 /boot/loader.conf 并在其中增加下列设置:

vesa_load="YES"
splash_bmp_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bmp"

以上这些设置假设 /boot/splash.bmp 是希望使用的启动画面文件。 当需要使用 PCX 文件的时候, 添加下列设置, 根据分辨率的高低适当增加 vesa_load="YES"

splash_pcx_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.pcx"

从 FreeBSD 8.3 开始, 新增了对采用 TheDraw 格式的 ASCII 艺术引导画面的支持。

splash_txt="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bin"

文件名并不必拘泥于前面例子中的 splash。 它可以是任何名称, 只要是系统支持的类型即可, 例如 splash_640x400.bmpblue_wave.pcx

其它一些您可能会感兴趣的 loader.conf 选项包括:

beastie_disable="YES"

这将关闭显示启动选项菜单, 但是倒数记时仍然会出现。 即是在启动菜单选项被禁用的时候, 在倒数记时段键入相应的启动选项仍然有效。

loader_logo="beastie"

这将替换启动选项菜单右侧默认显示的 FreeBSD 为彩色的小魔鬼标志, 就像以往的发行版那样。

请参阅联机手册 splash(4)loader.conf(5) 以及 vga(4) 以获取更多详细信息。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.