系统启动过程
普通个人计算机的启动过程相当简单,首先是系统BIOS自检,自检之后将载入启动硬盘上的主引导区,由主引导区上的引导程序再载入具体操作系统。标准的主引导区将按照启动分区的设置,引导该分区上的操作系统,FreeBSD也可以使用这种方式。但更常见的引导FreeBSD的方式,是使用FreeBSD Boot Manager,来管理和负责引导包括FreeBSD在内的多个操作系统。
按照计算机启动硬盘第一个扇区的系统主引导程序的不同,计算机有不同的启动过程。FreeBSD最常使用 FreeBSD Boot Manager,它可以让使用者在系统中共存的不同操作系统进行选择。
如果使用了Boot Manager用于多操作系统的引导,则系统自检后首先进入Boot Manager的引导界面。
F1: FreeBSD
F2: Dos
F5: Disk 2
Default F1
Boot Manager使用计算机的功能键来启动各个分区的操作系统,使用F1将启动第一个分区wd0s1 上的操作系统,F2启动wd0s2,F3对应wd0s3,等等,F5启动另一个硬盘上主引导区的引导程序。这样可以在第二个磁盘上也安装Boot Manager,由它来引导自己硬盘上各分区的操作系统。只有在分区的确存在的情况下, Boot Manager才显示相应的启动热键,并从分区的类型判断它是那种操作系统。在使用者选择了某个选项,或者经过了一定的延迟时间之后,Boot Manager就启动FreeBSD系统。
使用Boot Manager作多操作系统引导需要注意的是:一旦在这台计算机中重新安装Dos/Windo ws系统,则主引导区就被重写,需要重新安装BootManager。
当不想使用Boot Manager引导系统,而打算回到标准引导区的方式(不再需要引导多操作系统)时,可以使用DOS程序fdisk.exe来恢复主引导区的内容。也可以使用FreeBSD的sysinstall程序来重新安装标准主引导区。
A:> fdisk /mbr
但是,Boot Manager仍然使用BIOS调用来获得分区上的数据,由于BIOS只能访问硬盘1024 柱面内的分区,因此FreeBSD的引导分区必须在1024柱面以内才能正常启动系统。新的BIOS中使用LBA等方式对硬盘数据进行了重新映射,来避免这个问题。然而就需注意不能随意更改BIOS中的硬盘映射方式不可随便更改,必须与硬盘进行分区时的设置一致,否则BIOS就不能正确找到以前设置的分区。
无论是标准引导程序,还是FreeBSD Boot Manager,都将载入FreeBSD基本分区的第一个扇区,这里放置着FreeBSD的启动程序Boot Block,它将载入FreeBSD文件系统中的boot l oader程序,不需进行任何操作,boot loader程序将引导系统内核来启动系统。但在这个过程中也可以中断自动启动进程,进入交互模式,从而更改启动内核、进行硬件设置、甚至提供了选择不同的boot loader程序的机会。
FreeBSD 3.1-release中更新了系统的boot loader程序,这个新boot loa der程序与FreeBSD 2.2.x和3.0版本使用的boot loader不同,升级的原因之一是老版本的b oot loader不能启动ELF格式的内核,此外新版本的boot loader功能更强大。因此老版本的boo t loader的行为与下面描述的不同。
通常没有必要改变Boot Loader,如果要更改使用的Boot Loader程序,就要在启动屏幕最先印出一个简单的斜线 “/” 时,在几秒时间内按下空格键,否则启动过程将略过这个步骤,直接进入下一步。如果按下空格,则系统将出现boot提示符。
/
>>FreeBSD/i386 BOOT
Default: 0:wd(0,a)/boot/loader
boot:
此时输入 “?” ,可以列出对应的硬盘分区中根目录下的所有文件。这时可以在boot提示符下输入另一个b oot loader程序,启动该boot loader程序,也可以直接输入某个内核文件名,从而略过boot l oader而直接启动相应的内核。然而,通过boot loader能完成更多的任务,包括进行硬件资源设置。
此时也可以列出、选择不同的硬盘分区上的不同启动文件,正如之前的提示信息,0:wd(0,a)用于一个包含 FreeBSD根文件系统的子分区,其中第一个0为硬盘控制器的序号,而wd(0,a)为硬盘分区wd0a,根据硬盘分区情况,这对应第一个UFS分区上的根文件系统。而后面可以跟随目录和文件名,以及可以使用?来列出目录下的文件,当然选择启动内核的任务可以在boot loader内部中更好的完成,一般情况下不需要进入这个阶段改变boot loader程序。
此后系统将进入Boot Loader程序中,由Boot Loader将内核/kernel和内核模块载入内存,接着Boot Loader就等待10秒间隔,在这个时间内可以让用户按下了除回车之外的其他任意键,进入Bo ot Loader的交互模式。
/
BTX loader 1.00 BTX version is 1.01
Console: internal video/keyboard
BIOS drive A: is disk0
BIOS drive C: is disk1
BIOS drive D: is disk2
FreeBSD/i386 bootstrap loader, Revision 0.5 638/64512kB
(wb@email.online.ha.cn, Web Mar 3 02:54:38 CST 1999)
/kernel text=0x1697f2 data=0x168d0+0x1f17c syms=[0x4+0x1eb70+0x4+0x2014a]
/modules/splash_bmp.ko text=0x1025 data=0xc+0x634 syms=[0x4+0x400+0x4+0x213]
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 8 seconds...
Type ‘?’ for a list of commands, ‘help’ for more detiled help.
disk1s3a:>
新的Boot Loader使用BIOS的硬盘表示顺序,没有区分SCSI硬盘da和IDE硬盘wd,而直接使用disk0、disk1、disk2按BIOS中的顺序表示硬盘。本例中的提示符为disk1s3a,由于本例中使用的硬盘为IDE接口,因此这实际就代表wd1s3a分区。
在boot loader提示符下有很多相当有用的命令,例如使用ls命令可以列出disk1s3a中各级目录下的文件,使用lsdev可以列出当前内核中的设备驱动,使用lsmod可以列出已经载入的内核模块,使用load 可以载入另外的需要载入的内核模块,使用autoboot可以在给定时间之后启动系统,而使用boot命令可以立即启动系统内核,或者使用pnpscan命令扫描当前系统中的PNP卡。一般boot命令比较常用,例如使用 “boot -s” 命令,将启动系统并进入单用户模式,在这个模式下可以执行系统维护任务。通常由于只有可以信任的管理人员才能访问控制台,因此缺省状况下进入单用户模式不需要使用口令认证。
在boot命令之后使用其他内核名字作参数,用来使用缺省内核/kernel之外的其他内核来启动系统。每个 FreeBSD系统都至少具备一个备用的通用内核kernel.GENERIC,在当前系统内核被破坏的情况下可以使用它来启动系统。因此在引导程序被破坏而系统完好的情况下(通常是由于重新安装了Windows的原因),可以使用安装软盘或光盘启动,进入Boot Loader的交互模式,选择硬盘上的内核启动,然后进行修复而不需要重新安装。当在boot loader提示符下使用 “boot -c” 命令,在其后的启动过程中将进入UserConfig中,用于对内核中的硬件资源参数进行配置。与系统初始安装时进入UserConfig的方式不同,这将直接进入User Config的命令行模式,内核将出现UserConfig的提示符:
config>
此时可以使用help命令查询可以使用的UserConfig命令,如果输入visual指令,表示使用vi sual方式配置系统硬件,则会进入UserConfig的全屏幕界面,否则就使用这个命令行方式进行硬件参数配置。命令行模式中可以使用ls命令列出不同的设备驱动程序,使用irq、drq、iomem等命令查看硬件的相应资源设置。
命令行模式比全屏幕界面更强大的地方是能够对ISA PNP设备进行控制,这是通过pnp命令进行的。当IS A PNP卡由BIOS分配资源的时候,内核能以非PNP的驱动去探测它,这也是为何要在BIOS中关闭相关的PNP 选项的原因。但如果在编译内核支持了PNP控制器,也可以在BIOS中设置为由OS(即FreeBSD)来管理硬件资源,这就需要使用pnp命令手工为ISA PNP硬件分配资源,以便非PNP的驱动能检测并正确设置资源。但是手工设置要求对PNP卡硬件相当了解,否则还是让BIOS来完成资源的分配更为适合。
当退出UserConfig之后,或者在boot loader的交互模式下执行了boot命令,或者在bo ot loader提示进入交互模式的时候10秒钟内没有任何输入,则boot loader就会载入内核,并自动将控制权交给已经载入的FreeBSD内核程序,由内核探测计算机中的各个硬件,并将探测结果打印到屏幕上。使用键盘右上角的Pause键可以暂停屏幕输出,并可以使用Page Up,Page Down键上下滚动屏幕上的信息进行查看,最后再使用一次Pause键将打开屏幕输出,继续系统启动过程。内核的启动信息也可以在登录系统之后使用dmesg 命令查看。
FreeBSD 3.0以前的FreeBSD版本使用的Boot Loader为一个较老的版本,因此提示信息与命令输入方式也略有不同,但基本实现同样的功能,旧Boot Loader程序的提示符直接就为 “boot:” ,可以直接输入 “-s” 、 “-c” 等参数进入单用户模式或进入UserConfig。启动时boot loa der都会在屏幕上打印提示信息,解释了基本用法和具体参数对应的含义。
FreeBSD 3.1之后可以设定系统启动标志图象(如同Windows9x的启动标志),那么内核的探测信息就不会显示在屏幕上,而是被这个启动图象遮住。