精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>《FreeBSD使用大全》第二版>>4.1.1 boot loader

主题:4.1.1 boot loader
发信人: sungang(笨刚)
整理人: sungang(2003-09-16 12:03:52), 站内信件
4.1.1 boot loader

无论是标准引导程序,还是FreeBSD Boot Manager,都将载入FreeBSD基本分区的第一个扇区,这里放置着FreeBSD的启动程序Boot Block,它执行系统启动的第一步和第二步,这两步将载入FreeBSD文件系统中的boot loader程序。如果管理员没有进行任何操作,boot loader程序将引导系统内核来启动系统。

1) 载入boot loader
系统启动的第一步和第二步实际是按照内部的步骤划分的,这两步实质上只完成一个任务,载入第三步所需的boot loader程序。但在这个载入过程中,系统提供了一个机会,允许管理员中断自动启动进程,进入交互模式,从而载入另一个boot loader,甚至直接载入系统内核。

FreeBSD 3.1-release之后增加了boot loader支持,较老版本的系统通常直接载入系统的内核,而新版本系统则先载入boot loader,利用boot loader的强大功能,能完成更强的设置。

通常没有必要改变这个系统启动步骤,如果不希望使用Boot Loader,就要在启动屏幕最先印出一个简单的斜线 “/” 时,在几秒时间内按下空格键,否则启动过程将略过这个步骤,直接进入下一步。如果按下空格,则系统将出现boot提示符。

/

>>FreeBSD/i386 BOOT

Default: 0:wd(0,a)/boot/loader

boot:

此时输入 “?” ,可以列出对应的硬盘分区中根目录下的所有文件。这时可以在boot提示符下输入另一个boot loader程序,启动该boot loader程序,也可以直接输入某个内核文件名,如kernel,从而略过boot loader而直接启动相应的内核。然而,通过boot loader能完成更多的任务,包括进行硬件资源设置。

此时也提供了一个机会,可以列出、选择不同的硬盘分区上的不同启动文件,正如之前的提示信息,0:wd(0,a)用于一个包含FreeBSD根文件系统的子分区,其中第一个0为硬盘控制器的序号,而wd(0,a)为硬盘分区wd0a,根据硬盘分区情况,这对应第一个UFS分区上的根文件系统。而后面可以跟随目录和文件名,以及可以使用?来列出目录下的文件。

如果在boot:提示之后直接使用内核的名字,则可以跳过boot loader直接启动内核。然而,更常用的用法是使用一些参数启动系统,就是在内核名字之后使用 “-s” 、 “-c” 等参数,可以进入单用户模式或进入UserConfig进行资源设置,如使用”0:wd(0,a)/kernel -s”进入单用户模式,通常情况下,如果内核和启动硬盘是同一个硬盘,可以省略前面的硬盘分区位置,直接使用kernel或loader的名字就可以了,如”kernel -s”。

在FreeBSD 3.0之前,只能使用这种方式来控制启动的不同方式,但是,3.0之前的系统将直接启动内核,因此,可以省略内核的名字,使用”-s”、”-c”就可以了。

如果希望每次都使用更改过的启动参数,那么,就可以将设置值放入根目录的boot.config文件,系统启动时候会自动读取该文件的内容,并自动执行。某些时候,boot.config中没有放置内核的名字,而直接放置了一个参数,如”-P”,或”-Dh”,这样一来,该参数事实上是传递给了缺省的boot loader,这种做法显然是来自于3.0之前的做法,希望将这个参数传递给kernel,但显然不会成功。但是幸运的是,loader能识别这些参数,并设置正确的结果,即:根据条件(键盘是否存在),或无条件的将系统的控制台设置为串口上的终端设备。

注意:大多数情况下,应该采用boot loader来完成选择启动内核、设置启动变量的任务,boot loader能完成的更好。一般情况下不需要进入这个阶段改变boot loader程序。

2) 进入boot  loader
此后系统将进入Boot Loader程序中,由Boot Loader将内核/kernel和内核模块预载入内存,接着Boot Loader就等待10秒间隔,在这个时间内可以让用户按下了除回车之外的其他任意键,进入Boot 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

([email protected], 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硬盘ad,而直接使用disk0、disk1、disk2按BIOS中的顺序表示硬盘。本例中的提示符为disk1s3a,由于本例中使用的硬盘为IDE接口,因此这实际就代表ad1s3a分区。

在boot loader提示符下有很多相当有用的命令,例如使用ls命令可以列出disk1s3a中各级目录下的文件,使用lsdev可以列出当前内核中的设备驱动,使用lsmod可以列出已经载入的内核模块,使用load可以载入另外的需要载入的内核模块,使用autoboot可以在给定时间之后启动系统,而使用boot命令可以立即启动系统内核,或者使用pnpscan命令扫描当前系统中的PNP卡及其资源设置。

disk1s3a:> lsmod

disk1s3a:> unload splash_bmp.ko

disk1s3a:> unload kernel

disk1s3a:> unload kernel.GENERIC

disk1s3a:> autoboot

上面的命令首先列出已经预先载入的模块,然后将已经载入的模块按照反方向卸载,最后重新载入一个新的内核,重新启动。

一般boot命令比较常用,例如使用 “boot -s” 命令,将启动系统并进入单用户模式,在这个模式下可以执行系统维护任务。通常由于只有可以信任的管理人员才能访问控制台,因此缺省状况下进入单用户模式不需要使用口令认证。当然,如果控制台处于非安全状态,那么进入单用户状态就需要口令认证了。

提示:更改/etc/ttys中有关console的设置为insecure来保护单用户状态。

在boot命令之后使用其他内核名字作参数,用来使用缺省内核/kernel之外的其他内核来启动系统。每个FreeBSD系统都至少具备一个备用的通用内核kernel.GENERIC,在当前系统内核被破坏的情况下可以使用它来启动系统。因此在引导程序被破坏而系统完好的情况下(通常是由于重新安装了Windows的原因),可以使用安装软盘或光盘启动,进入Boot Loader的交互模式,选择硬盘上的内核启动,然后进行修复而不需要重新安装。

FreeBSD 3.1之后,最早采用boot loader的原因之一是避开缺省的启动过程与ELF内核的一些问题,现在不需要boot loader,直接启动ELF内核也毫无问题,但是boot loader的强大功能,使得它的存在越来越重要,它本身可以支持forth编程语言,从而能够对启动条件进行控制。例如,使用boot loader,FreeBSD可以在正式启动之前载入各种不同的模块,这是FreeBSD系统支持内核模块化的重要步骤,这一个理由就值得继续使用boot loader。当然,boot loader还能改变系统的一些参数,控制启动步骤等等。

大部分情况下,进入boot loader只是为了进入单用户状态等一次性的操作,但有些情况下设置需要保留。此时就需要将以上执行的指令放入文件/boot/loader.rc中保存,注意,loader.rc文件中已经保存了一些缺省设置的内容,应该避免与原有内容冲突。事实上,loader.rc已经包含了丰富的设置,使用者可以直接通过更改/boot/loader.conf文件的内容,直接利用原有的一些设置。

# -- sysinstall generated deltas -- #

userconfig_script_load="YES"

上面为一台计算机的loader.conf的内容,这个loader.conf显然是由系统安装程序sysinstall产生的,从内容上可以简单的判断,它是告诉boot loader,载入UserConfig的设置脚本来设置资源,该脚本的缺省位置为/boot/kernel.conf。

当然,loader.conf中能设置的内容远远不止这些,包括设置需要载入的内核及内核模块、启动参数、内核变量等等。

提示:参考/boot/defaults/loader.conf,可以学到更多的设置选项。

3) UserConfig
当在boot loader提示符下使用 “boot -c” 命令,在其后的启动过程中将进入UserConfig中,用于对内核中的硬件资源参数进行配置。与系统初始安装时进入UserConfig的方式不同,这将直接进入UserConfig的命令行模式,内核将出现UserConfig的提示符:

config>

此时可以使用help命令查询可以使用的UserConfig命令,如果输入visual指令,表示使用visual方式配置系统硬件,则会进入UserConfig的全屏幕界面,否则就使用这个命令行方式进行硬件参数配置。命令行模式中可以使用ls命令列出不同的设备驱动程序,使用irq、drq、iomem等命令查看硬件的相应资源设置。

FreeBSD系统在内核支持pnp的条件下,UserConfig支持pnp命令,这是命令行模式比全屏幕界面更强大的地方,能够对ISA PNP设备进行控制。当ISA PNP卡由BIOS分配资源的时候,内核能以非PNP的驱动去探测它,这也是为何要在BIOS中关闭相关的PNP选项的原因。但如果在编译内核支持了PNP控制器,也可以在BIOS中设置为由OS(即FreeBSD)来管理硬件资源,这就需要使用pnp命令手工为ISA PNP硬件分配资源,以便非PNP的驱动能检测并正确设置资源。但是手工设置要求对PNP卡硬件相当了解,否则还是让BIOS来完成资源的分配更为适合。

当在某次系统启动的时候执行了UserConfig的设置,如果再次启动计算机,就会发现设置不再生效。这是因为更改的UserConfig的设置没有正确保存的原因,当更改UserConfig并正常启动系统之后,应该将这些配置数据保存起来,这需要以root身份登入系统,执行:

# kget

enable pcic1

port pcic1 0x3e2

irq pcic1 11

iomem pcic1 0xd4000

flags pcic1 0

quit

系统命令kget将UserConfig的设置打印到屏幕上,此时,就可以保存这些信息到/boot/kernel.conf文件中,如果在/boot/loader.conf中的设置许可的条件下(缺省设置,在loader.conf中使用userconfig_script_load指定),那么下次启动,boot loader将自动载入这些设置,而不再需要重新设置了。

# kget > /boot/kernel.conf

从kget的输出,用户可以学习UserConfig的命令行模式的操作方式。
 
 

[关闭][返回]