分类:
2008-10-15 16:24:15
概述
内核引导参数大体上可以分为两类:一类与设备无关、另一类与设备有关。内核源码树下的 Documentation/kernel-parameters.txt 文件列出了所有可用的引导参数,并指明了处理每个参数的具体文件。注意:对于模块而言,引导参数只能用于直接编译到核心里的模块,格式是使用”模块名.参 数=值”模式指定,比如:usbcore.blinkenlights=1 。动态加载的模块可以在 modprobe 命令行上指定相应的参数值,比如:modprobe usbcore blinkenlights=1 。
可以使用”modinfo -p ${modulename}”命令显示可加载模块的所有可用参数。已经加载到内核中的模块会在 /sys/module/${modulename}/parameters/ 中显示出其参数,并且某些参数的值还可以在运行时通过”echo -n ${value} > /sys/module/${modulename}/parameters/${p}”命令修改。
与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导参数,那么就到 drivers/scsi 目录下寻找到 aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导参数说明。大多数参数是通过”__setup(… , …)”函数设置的,逗号前的部分就是引导参数的名称,后面的部分就是处理这些参数的函数名。[提示]你可以在源码树的根目录下试一试
grep -r '\b__setup *(' *命令。
[注意]多个参数之间用空格分割,而每个参数的值中不能包含空白,参数值是一个逗号分割的列表。
正确:ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1
错误:ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1在内核运行起来之后,可以通过 cat /proc/cmdline 命令查看当初使用的引导参数以及相应的值。
所有引导参数都是大小写敏感的!
内核如何处理引导参数
绝大部分的内核引导参数的格式如下(每个参数的值列表中最多只能有十项):
name[=value_1][,value_2]...[,value_10]如果”name”不能被识别并且满足”name=value”的格式,那么则被解译为一个环境变量(比如”TERM=”或”BOOT_IMAGE=vmlinuz.bak”),否则将被原封不动的传递给 init 程序(比如”single”)。
内核可以接受的参数个数没有限制,但是整个命令行的总长度(参数/值/空格全部包含在内)却是有限制的,一般是 256-4096 之间,定义在 include/asm/setup.h 中的 COMMAND_LINE_SIZE 宏中。
内核引导参数精选
由于引导参数多如牛毛,本文不可能涉及全部,因此下面只列出精选出来的一些(基于 2.6.22 内核),与设备有关的基本上都被忽略了。
标记说明
并不是所有的参数都是永远可用的,只有在特定的模块存在并且相应的硬件也存在的情况下才可用。引导参数上面的方括号说明了其依赖关系,其中使用的标记解释如下:
ACPI 高级配置与电源接口 APIC 高级可编程中断控制器 HW 相应的硬件设备存在 IA-32 IA-32(i386)体系结构 X86-64 X86-64体系结构,更多参数在 Documentation/x86_64/boot-options.txt 中描述 IOSCHED 启用了多个IO调度器 LIBATA 启用了Libata驱动 LOOP 启用了Loopback设备 NET 启用了网络支持 PCI PCI总线支持 PNP 即插即用支持 PS2 PS/2支持 SCSI 许多SCSI设备的参数在 Documentation/scsi/ 中描述 SMP 对称多处理器 USB USB支持 USBHID USB人机界面设备 VT 虚拟终端(Virtual terminal)
此外,下面的标记的含义与在逻辑上与上面的有所不同:
BUGS= 用于在特定的体系结构上解决某些CPU的bug KNL 是一个内核启动参数 BOOT 是一个引导程序参数
标记为”BOOT”的参数实际上由引导程序使用,对内核本身没有直接的意义。没有特别的需求,请不要修改此类参数的语法,更多信息请阅读 Documentation/i386/boot.txt 文档。
[1]