分类: BSD
2007-06-25 16:04:38
在MBR中的代码通常被提为引导管理器, 尤其是与用户交互的那类。这一类引导器通常有更多代码位于磁盘第一 轨道或在操作系统的文件系统中。 (引导管理器有时也被称为boot loader, 但是FreeBSD对后面的引导阶段才使用这个术语。) 流行的引导管理器包括boot0(亦称Boot Easy,标准的 FreeBSD 引导管理器)、 Grub、GAG,以及 LILO。 (只有boot0能装得进MBR。)
如果您只安装了一个操作系统,那么一个标准的 MBR 就足够了。 这个 MBR 先在磁盘上搜索可引导的(亦称“活动的”)分区, 然后运行分区上的代码以加载操作系统的其它部分。 MBR由安装,是一个缺省的MBR。相关文件为 /boot/mbr。
如果您在磁盘上安装了多个操作系统那么您可以安装一个不同的 引导管理器,它能显示一张操作系统的列表,您能从中选择启动哪个。 这样的两种引导器将在下一小节中讨论。
启动系统的剩余部分被分为三个阶段。第一阶段由 MBR 执行,它只是使计算机进入特定的状态然后执行第二阶段。 第二阶段稍微干得多一些。第三阶段完成加载操作系统的任务。 工作被分为三个阶段是因为 PC 标准对第一第二阶段执行的程序的大小有所限制。 把这些任务连在一起使得 FreeBSD 可以提供更大伸缩性的加载器 (loader)。
然后内核启动,它开始探测设备并初始化它们。 一旦内核引导进程完成任务,内核将控制权交给用户进程 , 它确认磁盘是否处于可用状态。 然后开始用户级资源配置: 加载文件系统启动网卡,及粗略地启动所有 FreeBSD 系统加载时经常运行的进程。
在MBR或引导管理器中的代码有时被提为引导过程的 阶段0。这一小节半夜前面提到引导器中的两种: boot0和LILO。
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 使修改生效;应检查屏幕上的消息确认修改。
概念上,第一,第二阶段同属于一个程序,处于磁盘的相同区域。但由于空间限制, 它们被分为两部分。可是您总是会一起安装它们。它们由安装器或 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:
如果您要更改已安装的 boot1 和 boot2,请使用命令 。
# 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 命令.对所有可用命令的解释请参见 。
在给定的时间内如果没有中断发生就引导内核。它显示一个倒数计时, 默认的时间范围是 10 秒。
立即按照给定的选项 (如果有的话) 和内核名 (如果是内核的) 引导内核。
基于变量对各种模块进行自动配置 (和引导内核时发生的一样)。 您只须记住要先使用 unload 命令, 然后修改一些变量,比如 kernel。
显示从文件 /boot/loader.help 读取的帮助信息。如果给定的主题是 index, 那么列出来的是所有可用的主题。
通过给定的文件名处理文件。文件被读入,然后被一行一行地解释。 任何错误都会立即中止 include 命令。
-t
type] filename加载内核、内核模块,或者是给定类型的文件 (通过给定的文件名)。 任何在文件名后面的参数都会被传给文件。
-l
] [path]显示给定路径或者是根目录 (如果路径没有指定) 下面的文件列表。 如果指定了 -l
选项,文件大小也会显示。
-v
]列出所有可以加载模块的设备。 如果指定了-v
选项,会显示出更多的细节。
-v
]显示已被加载的模块。如果指明了 -v
选项,
会显示更多的细节。
显示指定的文件,每隔 LINES
停顿一次。
立即重启系统。
设置 loader 的环境变量。
移除所有已被加载的模块。
这里有一些实际中 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=valuedriver 是设备驱动程序名,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 组的成员。 也可以使用 和 命令来关闭系统, 请参看它们的联机手册以获得更多的信息。
注意: 电源管理需要支持, 这要求内核支持 或以模块形式加载它。
术语