Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3279454
  • 博文数量: 815
  • 博客积分: 12898
  • 博客等级: 上将
  • 技术积分: 7883
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-25 09:57
文章分类

全部博文(815)

文章存档

2014年(1)

2011年(46)

2010年(192)

2009年(121)

2008年(70)

2007年(385)

分类: BSD

2007-06-25 16:04:38


概述
在 x86 硬件体系中,基本输入/输出系统 (BIOS) 负责加载操作系统, 为了做到这一点,BIOS 在磁盘上寻找主引导记录 (MBR),而 MBR 必须在放置的磁盘的特定位置。BIOS 有足够的能力来读入和运行 MBR, 且假使地认为 MBR 能完成加载操作系统的剩余任务, MBR可能需要BIOS的帮助。

  在MBR中的代码通常被提为引导管理器, 尤其是与用户交互的那类。这一类引导器通常有更多代码位于磁盘第一 轨道或在操作系统的文件系统中。 (引导管理器有时也被称为boot loader, 但是FreeBSD对后面的引导阶段才使用这个术语。) 流行的引导管理器包括boot0(亦称Boot Easy,标准的 FreeBSD 引导管理器)、 GrubGAG,以及 LILO。 (只有boot0能装得进MBR。)

  如果您只安装了一个操作系统,那么一个标准的 MBR 就足够了。 这个 MBR 先在磁盘上搜索可引导的(亦称“活动的”)分区, 然后运行分区上的代码以加载操作系统的其它部分。 MBR由安装,是一个缺省的MBR。相关文件为 /boot/mbr

  如果您在磁盘上安装了多个操作系统那么您可以安装一个不同的 引导管理器,它能显示一张操作系统的列表,您能从中选择启动哪个。 这样的两种引导器将在下一小节中讨论。

  启动系统的剩余部分被分为三个阶段。第一阶段由 MBR 执行,它只是使计算机进入特定的状态然后执行第二阶段。 第二阶段稍微干得多一些。第三阶段完成加载操作系统的任务。 工作被分为三个阶段是因为 PC 标准对第一第二阶段执行的程序的大小有所限制。 把这些任务连在一起使得 FreeBSD 可以提供更大伸缩性的加载器 (loader)。

  然后内核启动,它开始探测设备并初始化它们。 一旦内核引导进程完成任务,内核将控制权交给用户进程 , 它确认磁盘是否处于可用状态。 然后开始用户级资源配置: 加载文件系统启动网卡,及粗略地启动所有 FreeBSD 系统加载时经常运行的进程。


  在MBR或引导管理器中的代码有时被提为引导过程的 阶段0。这一小节半夜前面提到引导器中的两种: boot0LILO

boot0引导管理器:. 由 FreeBSD 的安装程序以及 boot0cfg(8) 所安装的 MBR, 默认基于 /boot/boot0。 (程序boot0非常简单, 由于在

例  boot0 截屏

F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1

Default: F2

  目前已经知道一些其它操作系统,特别是 Windows® , 会以自己的 MBR 覆盖现有 MBR。 如果发生了这种事情, 或者您想用 FreeBSD 的 MBR 覆盖现有的 MBR,您可以使用以下的命令:

# fdisk -B -b /boot/boot0 device

  device 是要写入 MBR 的设备名,比如 ad0 代表第一个 IDE 磁盘,ad2 代表第二个 IDE 控制器上的第一个 IDE 磁盘, da0 代表第一个 SCSI 磁盘,等等。 抑或,如果你需要一个自行配置的MBR,请使用。

The LILO Boot Manager: 要想安装这个引导管理器并也用来引导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, 这里再次使用了 XY 的语法。 如果您安装的两个系统在同一驱动器上,loader=/boot/chain.b 选项可以去掉。现在您可以执行 /sbin/lilo -v 使修改生效;应检查屏幕上的消息确认修改。

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

  概念上,第一,第二阶段同属于一个程序,处于磁盘的相同区域。但由于空间限制, 它们被分为两部分。可是您总是会一起安装它们。它们由安装器或 bsdlabel(见下文)复制自被组合而成的 /boot/boot

  它们位于文件系统外,引导分区的第一轨道,从第一扇区开始。在这里,或者任何其它引导管理器, 期望找到一个程序运行,继续引导进程。 所使用的扇区数可由/boot/boot的大小确定。

  boot1 非常简单,因为它再多也只能有 512 字节, 只能识别储存着分区信息的 bsdlabel, 及寻找执行 boot2

  boot2 稍微有点加强,能够理解 FreeBSD 的文件系统以便于寻找里面的文件, 能提供选择内核和加载器的简单界面。

  因为 有着更强的功能, 提供了一套易于使用的引导配置,boot2 一般都执行 loader, 但以前它的任务是直接运行内核。

boot2 的屏幕输出

>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:

  如果您要更改已安装的 boot1boot2,请使用命令 。

# bsdlabel -B diskslice

  diskslice 是用于引导的磁盘和分区, 比如 ad0s1 代表第一个 IDE 磁盘上的第一个分区。

dangerously dedicated: 如果您在 命令中只使用了磁盘名,比如 ad0,就会破坏磁盘上的所有分区。 这当然不是您所希望的,所以在按下 回车 之前 一定要对命令进行多次确认。

  加载器 (loader) 是三个阶段中的最后阶段, 且是放置在文件系统之中的,一般是文件 /boot/loader

  loader 被作为一种友好的配置方式,使用了一组内建且易用的命令集。 这些命令由一个强大的多的解释器支持构建,其本身带有复杂得多的命令集。

  初始时,loader 会探测控制台和磁盘,识别是从哪块盘引导的。 它会根据这些信息设置变量, 启动解释器以接受通过脚本或交互方式传来的用户命令。

  loader 然后会读取并运行 /boot/loader.rc, 默认地读取 /boot/defaults/loader.conf 以设置可靠的默认变量,读取 /boot/loader.conf 对这些变量作本地修改。loader.rc 依据这些变量进行动作,加载任何被选择的模块和内核。

  最后,默认地,loader 会停留 10 秒等待按键, 若没有发生中断,就开始引导内核。如果被中断,用户会得到一个命令行提示符, 在这里用户得更改变量、卸载所有模块、加载模块、最后引导 或重新引导。

  这些是最常用的 loader 命令.对所有可用命令的解释请参见 。

autobootseconds

在给定的时间内如果没有中断发生就引导内核。它显示一个倒数计时, 默认的时间范围是 10 秒。

boot [-options] [kernelname]

立即按照给定的选项 (如果有的话) 和内核名 (如果是内核的) 引导内核。

boot-conf

基于变量对各种模块进行自动配置 (和引导内核时发生的一样)。 您只须记住要先使用 unload 命令, 然后修改一些变量,比如 kernel

help [topic]

显示从文件 /boot/loader.help 读取的帮助信息。如果给定的主题是 index, 那么列出来的是所有可用的主题。

include filename ...

通过给定的文件名处理文件。文件被读入,然后被一行一行地解释。 任何错误都会立即中止 include 命令。

load [-t type] filename

加载内核、内核模块,或者是给定类型的文件 (通过给定的文件名)。 任何在文件名后面的参数都会被传给文件。

ls [-l] [path]

显示给定路径或者是根目录 (如果路径没有指定) 下面的文件列表。 如果指定了 -l 选项,文件大小也会显示。

lsdev [-v]

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

lsmod [-v]

显示已被加载的模块。如果指明了 -v 选项, 会显示更多的细节。

more filename

显示指定的文件,每隔 LINES 停顿一次。

reboot

立即重启系统。

set variable, set variable=value

设置 loader 的环境变量。

unload

移除所有已被加载的模块。

  这里有一些实际中 loader 用法的示例

  • 只是简单的引导默认内核,不同的是进入单用户模式:

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

    unload
    load kernel.old

    您可以使用被称为通用内核的 kernel.GENERIC, 或者您以前安装的内核 kernel.old (当您升级或配置了您自己的内核等时候)。

    注意: 使用以下命令加载常用的模块和另一个内核:

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

    load -t userconfig_script /boot/kernel.conf
    

  一旦内核被 (一般情况下) 或者 (越过 loader) 加载, 它将检查引导标志,如果有的话,就会进行必要的动作调整。

  这里是一些常用的引导标志:

-a

在内核初始化时,询问作为根加载的设备。

-C

从 CDROM 引导。

-c

运行 UserConfig (引导时的内核配置器)

-s

引导进入单用户模式

-v

在内核引导过程中显示更有的信息

注意: 还有更多的引导标志,阅读 以获取有关它们的信息。


Contributed by Tom Rhodes.

注意: 这是 FreeBSD 5.0 及其以后版本的组件, 不存在于早前的版本中。

  在初始化系统启动时, 会读取 device.hints(5) 文件。这个文件以变量的形式储存着内核引导信息, 有时被称为 “device hints”。 设备驱动程序用“device hints” 对设备进行配置。

  Device hints 也可以在 的命令行提示符中指定。变量可以用 set 命令添加,unset 命令删除, show 命令查看。在文件 /boot/device.hints 设置的变量亦可以在这里被覆盖。键入 boot loader 中的变量不是永久性的,在下次启动时就会被忘记。

  一旦系统引导成功, 命令可以用来清楚所有的变量。

  文件 /boot/device.hints 的语法是一行一个变量, 使用“#”作为注释标记。 每行是按照如下方式组织的:

hint.driver.unit.keyword="value"

  第三阶段 boot loader 的语法是:

set hint.driver.unit.keyword=value

  driver 是设备驱动程序名,unit 是设备驱动程序单位名,keyword 是 hint 关键字。 关键字可以由以下选项组成:

  • at:指明设备所绑定的总线

  • port:指明所使用 I/O 的起始地址。

  • irq:指明所使用的中断请求号。

  • drq:指明 DMA channel 号。

  • maddr:指明设备占用的物理内存地址。

  • flags:给设备设置各种标志位。

  • disabled:如果设成 1, 设备被禁用。

  设备驱动程序能够接受更多的 hints,推荐您参看它们的联机手册。参看 device.hints(5)、、 和 联机手册以获取更多的信息。



  一旦内核完成引导,它就把控制权交给了用户进程 ,它放置在 /sbin/init, 或者 init_path 变量指定的程序路径中。 这个变量是在 loader 里面设置的。

  自动重启过程会确认系统中可用的文件系统处于健康的状态。 如果不是, 而且使用 也无法修复这些问题, 会进入 以便系统管理员直接修正这些问题。

  此模式可以通过 或者通过带有 -s 选项的用户引导或通过在 loader 里设置 boot_single 变量等多种方式来达到。

  也可以在多用户模式下调动无重启 (-r) 选项和停机 (-h) 选项的 命令来进入单用户模式。

  如果系统 控制台 在文件 /etc/ttys 中被设置为 不安全(insecure), 在初始化单用户模式前会出现要求输入 root 密码的命令行提示符。

例  在 /etc/ttys 文件中的不安全控制台

# name  getty                           type    status          comments
#
# If console is marked "insecure", then init will ask for the root password # when going to single-user mode.
console none unknown off insecure

注意: 把控制台设置成 不安全 (insecure) 使只知道 root 密码的人才能进入单用户模式, 因为您认为控制台在物理上是不安全的。因此如果您考虑到安全性, 请选择 不安全 (insecure),而非 安全 (secure)

  如果 发现您的文件系统一切正常,又或者用户在完成了工作, 系统就会进入多用户模式,开始系统的资源配置。

  由命令 的发起的关机过程中, 会试着运行 /etc/rc.shutdown 脚本, 给所有进程发送 TERM 信号, 最后给不按时停止的进程发送 KILL 信号。

  在支持电源管理的平台上关闭 FreeBSD 系统的电源, 只要简单地使用命令 shutdown -p now 即可。 此外, 可以用命令 shutdown -r now 来重启 FreeBSD。 要执行 您必须是 root 用户或 operator 组的成员。 也可以使用 和 命令来关闭系统, 请参看它们的联机手册以获得更多的信息。

注意: 电源管理需要支持, 这要求内核支持 或以模块形式加载它。



术语


Munchausen男爵历险记 (The Adventures of Baron Munchausen) 这本书中有一个和这个过程类似的故事, 一个人掉到了下水管道里, 然后靠着拉自己的靴襻 (bootstrap) 克服重重困难爬了出来。 在早期文献中, 多以术语 bootstrap 来指代操作系统的加载机制, 如今它逐渐被简写为 “booting”。

参考:




阅读(1693) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~