这一节介绍一些可以用来传递启动时期参数给核心本身的软件范例。 也给你有关这些参数系如何被处理,启动参数有什么样的限制, 以及它们如何被转送到各个适当设备的观念。
有一点很重要得注意的是在启动参数中不应该使用空白, 只有在各别的参数之间可以。 单一参数其值的列表(A list of values)是在各值之间以逗号格开的,再一次, 没有任何空白。参见下面的范例。
ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1 *RIGHT* ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1 *WRONG*
最常用的是 Werner Almesberger 所写的 LILO(LInux LOader) 程序。 它有能力启动不同的核心,而且配置信息存放在一个纯文字档里。 大部份的发行套件都附有 LILO 作为预设的启动载入程序(boot-loader)。 LILO 可以一视同仁地启动 DOS, OS/2, Linux, FreeBSD 等等,而且相当有弹性。
在你开机之后,典型的配置会让 LILO 停住并印出 LILO:
。
然后等个几秒看看使用者有没有输入任何选项,没有的话就启动预设的系统。
在 LILO 配置档里典型的系统标签是 linux
以及 backup
和
msdos
。
如果你想要输入启动参数,可以打在这,在输入你要 LILO 启动的系统之标签后面,
像下面这个范例所显示的。
LILO: linux root=/dev/hda1
LILO 随附有绝佳的文件,而且为了这里所讨论的启动参数之使用,
当你想要把启动时期参数加到 LILO 配置档里永久使用时 LILO 的
append=
指令就非常重要。
只要简单地在 /etc/lilo.conf
档中加入像
append = "foo=bar"
这样的东东即可。
可以加在该档的最前面,使它对每一节区(section)都生效,
或是加在某 image=
节区里使它对该节区生效。
请参阅 LILO 文件里更完整的说明。
另一个常用的 Linux 载入程序 `LoadLin' 则是一支有能力从 DOS 提示符号(prompt)下启动 Linux 核心(可以给予启动参数)的 DOS 程序, 假如某些系统资源可用的话就行。 这对使用 DOS 并想从 DOS 下启动进入 Linux 的人而言很好用。
如果你拥有一些需要使用其所提供的 DOS 驱动程序来初使化以进入可用状态
(known state)的硬件那么它也很有用。
一个常见的例子是需要使用 DOS 驱动程序设定(twiddle)
几个神秘的暂存器使它进入声霸卡兼容模式的”声霸卡兼容”声卡。
启动 DOS 与所附的驱动程序,
然后从 DOS 提示符号下使用 LOADLIN.EXE
载入 Linux
以避免重新启动(reboot)会重置(reset)该卡。
如此该卡维持在声霸卡兼容模式也就能在 Linux 下使用。
还有一些其它程序可以用来启动 Linux。
完整的列表请找找在你当地 Linux 文档传输映设节点里的程序,
在 system/Linux-boot/
下。
核心本身里面的数个位元组存有少数几个核心启动参数的预设值。
在大部份的系统里安装有一支称为 rdev
的公用程序知道这些值在那里,
以及如何改变它们。
它也能改变另外一些没有相对之核心启动参数的东西,
像是预设的显示模式(video mode)。
此 rdev 公用程序通常也另称(aliased to) swapdev, ramsize, vidmode 以及 rootflags。它能够改变五种东西,分别是根目录设备(root device), 置换设备(swap device),内存磁盘(RAM disk)之参数,预设的显示模式, 及根目录设备的存取设定(readonly/readwrite)。
更多有关 rdev
的信息可以藉由输入 rdev -h
或是参阅其线上说明页
(man rdev
)获得。
大部份的启动参数格式为:
name[=value_1][,value_2]...[,value_11]
其中 `name' 是一个用来唯一识别(unique)相关的值(如果有的话) 是要给核心的那个部份的关键字。 多个启动参数只是上述格式以空白分隔的列表。 注意那个 11 是真实的限制, 因为现行的程序码对每个关键字只处理 11 个以逗号分隔的参数。 (然而,在非比寻常复杂的情况下你可以重覆使用相同的关键字加入 11 个以上的参数, 假如设定函式支持这样搞的话。) 同时也要注意,核心把列表分成(splits)最多 10 个的整数参数, 后面并跟著一个字串,所以你不能真的给它 11 个整数, 除非你自行在驱动程序中将第 11 个参数由字串转换成整数。
大部份排序的动作是在 linux/init/main.c
里面。
首先,核心查看参数是否为 `root=', `Ro', `Rw', or `Debug' 这些特别的参数。
这些特别参数的意义本文中会进一步说明。
然后它走过(walks)一系列的设定函式(放在 bootsetups
阵列里)
看看所指定的参数字串(像是
`foo')是不是与其中的一个设定函式(foo_setup()
)相关,
以设定特定设备或核心的一部份。
如果你传给核心 foo=3,4,5,6,bar
这样一行那么核心会搜寻
bootsetups
阵列看看 `foo' 是否有注册。
如果有,那么它会呼叫与 `foo' 相关联的设定函式(foo_setup()
)
并交给它在核心指令列所给的整数参数 3, 4, 5, and 6,并交给它字串参数
bar
。
任何不被接受当作上述设定函式的 `foo=bar' 型式之叙述会被解译为要设定的环境变数。 一个(没用的?)范例是以 `TERM=vt100' 作为启动参数。
任何剩下的,
核心不管而且不被解译成环境变数之参数接下来会传给第一个程序(process),
通常是 init
程序。
最常传给 init 程序的参数是 single 这个字,
指示 init
把电脑启动在单人模式(single user mode)
并且不启动所有一般的驻留程序(daemons) 。
查阅你系统里安装的 init
版本之线上手册看看它接受哪些参数。