diff --git a/zh_CN.GB2312/books/handbook/boot/chapter.sgml b/zh_CN.GB2312/books/handbook/boot/chapter.sgml index 99b437b85f..ffa1a433d2 100644 --- a/zh_CN.GB2312/books/handbook/boot/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/boot/chapter.sgml @@ -1,694 +1,699 @@ FreeBSD 引导过程 概述 引导 启动电脑以及加载操作系统的过程被称为引导过程, 或者简称为引导。 FreeBSD 的引导过程给用户自定义启动提供了很大的伸缩性, 您可以选择启动不同的操作系统,或者是同一系统的不同版本及内核。 本章将详细介绍您能在 FreeBSD 引导过程中设置的配置选项。 这包括了引导内核、探测设备并启动 &man.init.8; 等等之前所发生的所有事情。 这些事项一般发生在文本由白变灰时。 读完这章您将会知道: FreeBSD 引导系统里的各项组件, 以及它们之间的交互方式. 在 FreeBSD 引导时给各组件配置选项以控制引导过程。 &man.device.hints.5;的基本知识。 只适用于x86 本章只描述了运行于 Intel x86 体系之上的 FreeBSD 的引导过程。 引导问题 启动电脑及启动和引导操作系统构成了一个有趣的两难境地。 按照定义在操作系统被启动之前计算机是无法完成任何任务的,包括运行磁盘上的程序。 如果计算机在没有操作系统的情况下不能运行来自于磁盘上的程序而操作系统又是放在磁盘上的, 那操作系统是如何启动的呢? - 这个问题在 The Adventures of - Baron Munchausen 这本书中有类似的描述。 - 一个字符从管道中掉下来,克服重重困难抓住了引导程序, - 活了下来。在以前,计算机术语bootstrap - 指加载操作系统的机制,简称booting + Munchausen男爵历险记 (The Adventures of + Baron Munchausen) 这本书中有一个和这个过程类似的故事, + 一个人掉到了下水管道里, 然后靠着拉自己的靴襻 (bootstrap) + 克服重重困难爬了出来。 在早期文献中, 多以术语 + bootstrap 来指代操作系统的加载机制, + 如今它逐渐被简写为 booting 在 x86 硬件体系中,基本输入/输出系统 (BIOS) 负责加载操作系统, 为了做到这一点,BIOS 在磁盘上寻找主引导记录 (MBR),而 MBR 必须在放置的磁盘的特定位置。BIOS 有足够的能力来读入和运行 MBR, 且假使地认为 MBR 能完成加载操作系统的剩余任务。 BIOS - 基本输入/输出系统 + + + + 基本输入/输出系统 + BIOS 如果您只安装了一个操作系统,那么一个标准的 MBR 就足够了。 这个 MBR 先在磁盘上搜索可引导的分区, 然后运行分区上的代码以加载操作系统的其它部分。 如果您在磁盘上安装了多个操作系统那么您可以安装一个不同的 MBR,它能显示一张操作系统的列表,您能从中选择启动哪个。 FreeBSD 自带了一个这样的 MBR,其它的操作系统厂商亦提供可选的 MBR。 启动系统的剩余部分被分为三个阶段。第一阶段由 MBR 执行,它只是使计算机进入特定的状态然后执行第二阶段。 第二阶段稍微干得多一些。第三阶段完成加载操作系统的任务。 工作被分为三个阶段是因为 PC 标准对第一第二阶段执行的程序的大小有所限制。 把这些任务连在一起使得 FreeBSD 可以提供更大伸缩性的加载器 (loader)。 内核 init 然后内核启动,它开始探测设备并初始化它们。 一旦内核引导进程完成任务,内核将控制权交给用户进程 &man.init.8;, 它确认磁盘是否处于可用状态。&man.init.8; 然后开始用户级资源配置: 加载文件系统启动网卡,及粗略地启动所有 FreeBSD 系统加载时经常运行的进程。 MBR 和引导阶段一、二、三 MBR,<filename>/boot/boot0</filename> 主引导记录 (MBR) FreeBSD MBR 放置在 /boot/boot0。 这是真实 MBR 的一份 复制品,真正的 MBR 必须放在磁盘上 FreeBSD 分区以外的特定部分。 boot0 是非常简单的,因为在 MBR 里的代码只有 512 字节。 如果您安装了 FreeBSD MBR 且装了多个操作系统, 在引导时您会看到如下的内容: <filename>boot0</filename> 截屏 F1 DOS F2 FreeBSD F3 Linux F4 ?? F5 Drive 1 Default: F2 - 其它操作系统,特别是 &windows; 95,以用自己的 - MBR 覆盖现有 MBR 而著称。如果发生了这种事情,或者您想用 + 目前已经知道一些其它操作系统,特别是 &windows; , 会以自己的 + MBR 覆盖现有 MBR。 如果发生了这种事情, 或者您想用 FreeBSD 的 MBR 覆盖现有的 MBR,您可以使用以下的命令: &prompt.root; fdisk -B -b /boot/boot0 device device 是要写入 MBR 的设备名,比如 ad0 代表第一个 IDE 磁盘,ad2 代表第二个 IDE 控制器上的第一个 IDE 磁盘, da0 代表第一个 SCSI 磁盘,等等。 如果您是 linux 用户,您可能更喜欢使用 LILO 来控制引导过程,您可以编辑 /etc/lilo.conf 文件,或者在安装 FreeBSD 过程中选择 选项。 如果您安装了 FreeBSD 引导管理器,您可以启动 linux 然后更改 LILO 的配置文件 /etc/lilo.conf,加入以下的选项: other=/dev/hdXY table=/dev/hdb loader=/boot/chain.b label=FreeBSD 这样就可以通过 LILO 来引导 FreeBSD 和 linux 了。 在我们的例子中,我们使用 XY 确定驱动器号和分区。 如果您使用的是 SCSI 驱动器,您需要将 /dev/hdXY 改成 /dev/sdXY, 这里再次使用了 XY 的语法。 如果您安装的两个系统在同一驱动器上, 选项可以去掉。现在您可以执行 /sbin/lilo -v 使修改生效。 第一阶段,<filename>/boot/boot1</filename>,和第二阶段, <filename>/boot/boot2</filename> 概念上,第一,第二阶段同属于一个程序,处于磁盘的相同区域。但由于空间限制, 它们被分为两部分。可是您总是会一起安装它们。 它们放置在引导分区的引导扇区里。在引导扇区里能找到 boot0、MBR 以及其它用于引导系统的程序。/boot 目录下的文件是真实文件的拷贝,真实文件放置在 FreeBSD 文件系统之外。 boot1 非常简单,因为它再多也只能有 512 字节, 只能识别储存着分区信息的 disklabel, 及寻找执行 boot2 boot2 稍微有点加强,能够理解 FreeBSD 的文件系统以便于寻找里面的文件, 能提供选择内核和加载器的简单界面。 因为 loader 有着更强的功能, 提供了一套易于使用的引导配置,boot2 一般都执行 loader, 但以前它的任务是直接运行内核。 <filename>boot2</filename> 的屏幕输出 >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/kernel boot: 如果您要更改已安装的 boot1boot2,请使用命令 &man.disklabel.8;。 &prompt.root; disklabel -B diskslice diskslice 是用于引导的磁盘和分区, 比如 ad0s1 代表第一个 IDE 磁盘上的第一个分区。 dangerously dedicated 如果您在 &man.disklabel.8; 命令中只使用了磁盘名,比如 ad0,就会破坏磁盘上的所有分区。 这当然不是您所希望的,所以在按下 回车 之前 一定要对命令进行多次确认。 第三阶段,<filename>/boot/loader</filename> boot-loader 加载器 (loader) 是三个阶段中的最后阶段, 且是放置在文件系统之中的,一般是文件 /boot/loader loader 被作为一种友好的配置方式,使用了一组内建且易用的命令集。 这些命令由一个强大的多的解释器支持构建,其本身带有复杂得多的命令集。 Loader 程序流程 初始时,loader 会探测控制台和磁盘,识别是从哪块盘引导的。 它会根据这些信息设置变量, 启动解释器以接受通过脚本或交互方式传来的用户命令。 loader loader 配置 loader 然后会读取并运行 /boot/loader.rc, 默认地读取 /boot/defaults/loader.conf 以设置可靠的默认变量,读取 /boot/loader.conf 对这些变量作本地修改。loader.rc 依据这些变量进行动作,加载任何被选择的模块和内核。 最后,默认地,loader 会停留 10 秒等待按键, 若没有发生中断,就开始引导内核。如果被中断,用户会得到一个命令行提示符, 在这里用户得更改变量、卸载所有模块、加载模块、最后引导 或重新引导。 Loader 内建的命令 这些是最常用的 loader 命令.对所有可用命令的解释请参见 &man.loader.8;。 autobootseconds 在给定的时间内如果没有中断发生就引导内核。它显示一个倒数计时, 默认的时间范围是 10 秒。 boot -options kernelname 立即按照给定的选项 (如果有的话) 和内核名 (如果是内核的) 引导内核。 boot-conf 基于变量对各种模块进行自动配置 (和引导内核时发生的一样)。 您只须记住要先使用 unload 命令, 然后修改一些变量,比如 kernel help topic 显示从文件 /boot/loader.help 读取的帮助信息。如果给定的主题是 index, 那么列出来的是所有可用的主题。 include filename 通过给定的文件名处理文件。文件被读入,然后被一行一行地解释。 任何错误都会立即中止 include 命令。 load type filename 加载内核、内核模块,或者是给定类型的文件 (通过给定的文件名)。 任何在文件名后面的参数都会被传给文件。 ls path 显示给定路径或者是根目录 (如果路径没有指定) 下面的文件列表。 如果指定了 选项,文件大小也会显示。 lsdev 列出所有可以加载模块的设备。 如果指定了 选项,会显示出更多的细节。 lsmod 显示已被加载的模块。如果指明了 选项, 会显示更多的细节。 more filename 显示指定的文件,每隔 LINES 停顿一次。 reboot 立即重启系统。 set variable set variable=value 设置 loader 的环境变量。 unload 移除所有已被加载的模块。 Loader 示例 这里有一些实际中 loader 用法的示例 single-user mode 只是简单的引导默认内核,不同的是进入单用户模式: boot -s 卸载默认内核和模块,然后加载旧的 (或者其它) 的内核: kernel.old unload load kernel.old 您可以使用被称为通用内核的 kernel.GENERIC, 或者您以前安装的内核 kernel.old (当您升级或配置了您自己的内核等时候)。 使用以下命令加载常用的模块和另一个内核: unload set kernel="kernel.old" boot-conf 加载内核配置脚本: load -t userconfig_script /boot/kernel.conf 内核在引导时的交互 内核 引导交互 一旦内核被 loader (一般情况下) 或者 boot2 (越过 loader) 加载, 它将检查引导标志,如果有的话,就会进行必要的动作调整。 内核 引导标志 内核引导标志 这里是一些常用的引导标志: 在内核初始化时,询问作为根加载的设备。 从 CDROM 引导。 运行 UserConfig (引导时的内核配置器) 引导进入单用户模式 在内核引导过程中显示更有的信息 还有更多的引导标志,阅读 &man.boot.8; 以获取有关它们的信息。 Tom Rhodes Contributed by device.hints Device Hints 这是 FreeBSD 5.0 及其以后版本的组件, 不存在于早前的版本中。 在初始化系统启动时,&man.loader.8; 会读取 &man.device.hints.5; 文件。这个文件以变量的形式储存着内核引导信息, 有时被称为 device hints。 设备驱动程序用device hints 对设备进行配置。 Device hints 也可以在 第三阶段的boot loader 的命令行提示符中指定。变量可以用 set 命令添加,unset 命令删除, show 命令查看。在文件 /boot/device.hints 设置的变量亦可以在这里被覆盖。键入 boot loader 中的变量不是永久性的,在下次启动时就会被忘记。 一旦系统引导成功,&man.kenv.1; 命令可以用来清楚所有的变量。 文件 /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,推荐您参看它们的联机手册。参看 &man.device.hints.5;、&man.kenv.1;、&man.loader.conf.5; 和 &man.loader.8; 联机手册以获取更多的信息。 init Init:进程控制及初始化 一旦内核完成引导,它就把控制权交给了用户进程 &man.init.8;,它放置在 /sbin/init, 或者 init_path 变量指定的程序路径中。 这个变量是在 loader 里面设置的。 自动重启队列 自动重启队列保证了可用的文件系统是稳定的。 如果不是,且 &man.fsck.8; 不能修复这些错误, &man.init.8; 会进入单用户模式 以便系统管理员直接解决问题。 单用户模式 单用户模式 控制台 此模式可以通过 自动重启队列或者通过带有 选项的用户引导或通过在 loader 里设置 boot_single 变量等多种方式来达到。 也可以在多用户模式下调动无 reboot()选项和 halt () 选项的 &man.shutdown.8; 命令来进入单用户模式。 如果系统 控制台 在文件 /etc/ttys 中被设置为 不安全(insecure), 在初始化单用户模式前会出现要求输入 root 密码的命令行提示符。 在 <filename>/etc/ttys</filename> 文件中的不安全控制台 # 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) 多用户模式 多用户模式 如果 &man.init.8; 发现您的文件系统一切正常,又或者用户在单用户模式完成了工作, 系统就会进入多用户模式,开始系统的资源配置。 rc 文件 资源配置 (rc) 资源配置分别从文件 /etc/defaults/rc.conf/etc/rc.conf 中读取默认配置和细节配置, 然后加载在文件 /etc/fstab 中提及的文件系统、 启动网络服务、启动各种系统守护进程,最后启动本地安装包的启动脚本。 &man.rc.8; 联机手册是关于资源配置的很好的参考。 shutdown 队列 shutdown 由命令 &man.shutdown.8; 的控制, &man.init.8; 会试着运行 /etc/rc.shutdown 脚本, 给所有进程发送 TERM 信号,然后给不按时停止的进程发送 KILL信号。 在支持电源管理的体系上关闭 FreeBSD 系统的电源,只要简单的使用命令 shutdown -p now 立即关闭电源。使用命令 shutdown -r now 重启 FreeBSD。要执行 &man.shutdown.8; 您必须是 root 用户或 operator 组的成员。 也可以使用 &man.halt.8; 和 &man.reboot.8; 命令来关闭系统, 请参看它们的联机手册以获得更多的信息。 电源管理需要支持,在 FreeBSD 5.X 中要求内核支持 &man.acpi.4; 或以模块加载,在 FreeBSD 4.X 中需要 &man.apm.4; 的支持。