本节提供了一些软件示例,这些软件可用于将内核启动时参数传递给内核本身。它还让您了解参数是如何处理的,启动参数有哪些限制,以及它们如何向下传递到它们所针对的每个适当设备。
重要 的是要注意,空格 不应 在启动参数中使用,而只能在不同的参数之间使用。对于单个参数的值列表,值之间应使用逗号分隔,并且同样不要有任何空格。请参阅下面的示例。
ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1 *RIGHT* ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1 *WRONG*
一旦 Linux 内核启动并运行,就可以通过在 shell 提示符下简单地键入 cat /proc/cmdline
来查看启动时使用的命令行参数。
LILO 程序(LInux LOader),由 Werner Almesberger 编写,是最常用的。它能够启动各种内核,并将配置信息存储在纯文本文件中。大多数发行版都将 LILO 作为默认的引导加载程序发布。LILO 可以毫无困难地启动 DOS、OS/2、Linux、FreeBSD 等,并且非常灵活。
典型的配置是,在您打开计算机后不久,LILO 会停止并打印 LILO:
。然后它会等待几秒钟,等待用户输入任何可选内容,如果失败,它将启动默认系统。人们在 LILO 配置文件中使用的典型系统标签是 linux
、backup
和 msdos
。如果您想输入启动参数,请在此处输入,在输入您希望 LILO 从中启动的系统标签之后,如下例所示。
LILO: linux root=/dev/hda1
LILO 附带优秀的文档,并且对于此处讨论的启动参数而言,当想要将启动时参数作为永久添加到 LILO 配置文件时,LILO append=
命令非常重要。您只需将类似 append = "foo=bar"
的内容添加到 /etc/lilo.conf
文件中。它可以添加到配置文件的顶部,使其应用于所有部分,也可以通过将其添加到 image=
部分内来添加到单个系统部分。有关更完整的说明,请参阅 LILO 文档。
另一个常用的 Linux 加载器是 `LoadLin`,它是一个 DOS 程序,能够在 DOS 提示符下启动 Linux 内核(带有启动参数),前提是某些资源可用。这对于使用 DOS 并希望从 DOS 启动到 Linux 的用户来说非常有用。
如果您有某些硬件依赖于提供的 DOS 驱动程序将硬件置于已知状态,这也非常有用。一个常见的例子是 “SoundBlaster 兼容” 声卡,它需要 DOS 驱动程序设置一些专有寄存器,以将声卡置于 SB 兼容模式。使用提供的驱动程序启动 DOS,然后使用 LOADLIN.EXE
从 DOS 提示符加载 Linux,避免了如果重新启动会发生的卡复位。因此,该卡保持在 SB 兼容模式,因此可以在 Linux 下使用。
还有其他程序可以用来启动 Linux。要获得完整列表,请查看您本地 Linux ftp 镜像上的程序,位于 system/Linux-boot/
下。
一些内核启动参数的默认值存储在内核镜像本身的各个字节中。大多数系统上都安装了一个名为 rdev
的实用程序,它知道这些值在哪里,以及如何更改它们。它还可以更改没有内核启动参数等效项的内容,例如使用的默认视频模式。
rdev 实用程序通常也别名为 swapdev、ramsize、vidmode 和 rootflags。这些是 rdev 可以更改的五件事,分别是根设备、交换设备、RAM 磁盘参数、默认视频模式以及根设备的只读/读写设置。
有关 rdev
的更多信息,可以通过键入 rdev -h
或阅读提供的手册页(man rdev
)找到。
大多数启动参数采用以下形式:
name[=value_1][,value_2]...[,value_11]
其中 name
是一个唯一的关键字,用于标识要将关联值(如果有)提供给内核的哪个部分。多个启动参数只是上述格式的空格分隔列表。请注意,11 的限制是真实的,因为当前代码每个关键字仅处理 11 个逗号分隔的参数。(但是,在异常复杂的情况下,您可以重用相同的关键字,最多可以添加 11 个参数,前提是 setup 函数支持它。)另请注意,内核将列表拆分为最多十个整数参数和一个后续字符串,因此您实际上无法提供 11 个整数,除非您在驱动程序本身中将第 11 个参数从字符串转换为 int。
大部分排序发生在 linux/init/main.c
中。首先,内核检查参数是否是任何特殊参数 root=
、ro
、rw
或 debug
。这些特殊参数的含义在文档的后面部分进行了描述。
然后,它遍历一个 setup 函数列表(包含在 bootsetups
数组中),以查看指定的参数字符串(例如 foo
)是否已与特定设备或内核部分的 setup 函数(foo_setup()
)关联。如果您将行 foo=3,4,5,6,bar
传递给内核,那么内核将搜索 bootsetups
数组以查看是否注册了 foo
。如果已注册,那么它将调用与 foo
关联的 setup 函数(foo_setup()
),并将内核命令行上给出的整数参数 3、4、5 和 6 传递给它,并将字符串参数 bar
也传递给它。
任何形式为 foo=bar
的内容,如果未被接受为上述描述的 setup 函数,则会被解释为要设置的环境变量。一个例子是使用 TERM=vt100
或 BOOT_IMAGE=vmlinuz.bak
作为启动参数。这些环境变量通常在初始化脚本中进行测试,以启用或禁用各种功能。
init
程序
任何内核未拾取且未解释为环境变量的剩余参数,然后都会传递给进程 1,通常是 init
程序。传递给 init
进程的最常见参数是单词 single,它指示 init
以单用户模式启动计算机,而不是启动所有常用的守护程序。查看系统上安装的 init
版本的帮助手册页,以了解它接受哪些参数。