Linux启动添加内核参数简介

来源:互联网 发布:什么聊天软件 编辑:程序博客网 时间:2024/05/09 08:57
 

Linux内核在启动的时候,能接收某些命令行选项或启动时参数。当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核。

如果不使用启动管理器,比如直接从BIOS或者把内核文件用“cp zImage /dev/fd0”等方法直接从设备启动,就不能给内核传递参数或选项--这也许是我们使用引导管理器比如LILO的好处之一吧。

Linux的内核参数是以空格分开的一个字符串列表,通常具有如下形式:

name[=value_1][,value_2]...[,value_10]

“name”是关键字,内核用它来识别应该把“关键字”后面的值传递给谁,也就是如何处理这个值,是传递给处理例程还是作为环境变量或者抛给“init”。值的个数限制为10,你可以通过再次使用该关键字使用超过10个的参数。

首先,内核检查关键字是不是 `root=',`nfsroot=', `nfsaddrs=', `ro', `rw', `debug'或 `init',然后内核在bootsetups数组里搜索于该关键字相关联的已注册的处理函数,如果找到相关的已注册的处理函数,则调用这些函数并把关键字后面的值作为参数传递给这些函数。比如你在启动时设置参数name=a,b,c,d,内核搜索bootsetups数组,如果发现“name”已注册,则调用“name”的设置函数如name_setup(),并把a,b,c,d传递给name_setup()执行。

所有型如“name=value”参数,如果没有被上面所述的设置函数接收,将被解释为系统启动后的环境变量,比如“TERM=vt100”就会被作为一个启动时参数。

所有没有被内核设置函数接收也没又被设置成环境变量的参数都将留给init进程处理,比如“single”。

常用的设备无关启动时参数。

1、init=...

设置内核执行的初始化进程名,如果该项没有设置,内核会按顺序尝试/etc/init,

/bin/init,/sbin/init, /bin/sh,如果所有的都没找到,内核会抛出 kernel panic:的错误。

2、nfsaddrs=...

设置从网络启动时NFS的启动地址,已字符串的形式给出。

3、nfsroot=...

设置网络启动时的NFS根名字,如果该字符串不是以 "/"、","、"."开始,默认指向“/tftp-boot”。

以上2、3在无盘站中很有用处。

4、no387

该选项仅当定义了CONFIG_BUGi386时才能用,某些i387协处理器芯片使用32位的保护模式时会有BUG,比如一些浮点运算,使用这个参数可以让内核忽略387协处理器。

5、no-hlt

该选项仅当定义了CONFIG_BUGi386时才能用,一些早期的i486DX-100芯片在处理“hlt”指令时会有问题,执行该指令后不能可靠的返回操作系统,使用该选项,可以让linux系统在CPU空闲的时候不要挂起CPU。

6、root=...

该参数告诉内核启动时使用哪个设备作为根文件系统。比如可以指定根文件为hda8:root=/dev/hda8。

7、ro和rw

ro参数告诉内核以只读方式加载根文件系统,以便进行文件系统完整性检查,比如运行fsck;rw参数告诉内核以读写方式加载根文件系统,这是默认值。

8、reserve=...

保留端口号。格式:reserve=iobase,extent[,iobase,extent]...,用来保护一定区域的I/O端口不被设备驱动程序自动探测。在某些机器上,自动探测会失败,或者设备探测错误或者不想让内核初始化设备时会用到该参数;比如: reserve=0x300,32 device=0x300,除device=0x300外所有设备驱动不探测 0x300-0x31f范围的I/O端口。

9、mem=...

限制内核使用的内存数量。早期BIOS设计为只能识别64M以下的内存,如果你的内存数量大于64M,你可以指明,如果你指明的数量超过了实际安装的内存数量,系统崩溃是迟早的事情。如:mem=0x1000000意味着有16M内存,如果是mem=0x6000000,就是96M内存了。

注意:很多机型把部分内存作为BIOS的映射,所以你在指定内存大小的时候一定要预留空间。你也可以在 pentium或者更新的CPU上使用mem=nopentium关闭4M的页表,这要在内核配置时申明。

10、panic=N

默认情况,内核崩溃--kernel panic 后会宕机而不会重启,你可以设置宕机多少秒之后重启机器;也可以在/proc/sys/kernel/panic文件里设置。

11、reboot=[warm|cold][,[bios|hard]]

该选项仅当定义了CONFIG_BUGi386时才能用。2.0.22的内核重启默认为cool reboot,warm reboot 更快,使用"reboot=bios"可以继承bios的设置。

12、nosmp 和 maxcpus=N

仅当定义了 __SMP__,该选项才可用。可以用来禁用多CPU或者指明最多支持的CPU个数。

内核开发和调试的启动时参数

这些参数主要用在内核的开发和调试上,如果你不进行类似的工作,你可以简单的跳过本小节。

1、debug

linux的日志级别比较多(详细信息可以参看linux/kernel.h),一般地,日志的守护进程klogd只把比DEBUG级别高的日志写进磁盘;如果使用该选项,klogd也把内核的DEBUG信息写进日志。

2、profile=N

在做内核开发的时候,如果想清楚的知道内核在什么地方耗用了多少CPU的时钟周期,可以使用核心的分析函数设置变量prof_shift为非0值,有两种方式可以实现:一种是在编译时指定,另一种就是通过“profile=”来指定; 他给出了一个相当于最小单位--即时钟周期;系统在执行内核代码的时候, profile[address >;>; prof_shift]的值就会累加,你也可以从 /proc/profile得到关于它的一些信息。

3、swap=N1,N2,N3,N4,N5,N6,N7,N8

设置内核交换算法的八个参数:max_page_age, page_advance, page_decline,page_initial_age, age_cluster_fract, age_cluster_min, pageout_weight,bufferout_weight。

4、buff=N1,N2,N3,N4,N5,N6

设置内核缓冲内存管理的六个参数:max_buff_age, buff_advance, buff_decline,buff_initial_age, bufferout_weight, buffermem_grace。

使用 RAMDISK的参数

(仅当内核配置并编译了 CONFIG_BLK_DEV_RAM)。一般的来说,使用ramdisk并不是一件好事,系统自己会更加有效的使用可用的内存;但是,在启动或者制作启动盘时,使用ramdisk可以很方便的装载软盘等设备上的映象(尤其是安装程序、启动过程中),因为在正真使用物理磁盘之前,必须要加载一些必要的模块,比如文件系统模块,scsi驱动等(可以参见我的initrd-x.x.x.img文件分析-制作安装程序不支持的根文件系统)。

早期的ramdisk(比如1.3.48的核心)是静态分配的,必须以ramdisk=N来指定ramdisk的大小;现在ramdisk可以动态增加。一共有四个参数,两个布尔型,两个整形。

1、load_ramdisk=N

如果N=1,就加载ramdisk;如果N=0,就不加载ramdisk;默认值为0。

2、prompt_ramdisk=N

N=1,提示插入软盘;N=0,不提示插入软盘;默认为1。

3、ramdisk_size=N或者ramdisk=N

设定ramdisk的最大值为N KB,默认为4096KB。

4、ramdisk_start=N

设置ramdisk的开始块号为N,当ramdisk有内核的映象文件是需要这个参数。

5、noinitrd

(仅当内核配置了选项 CONFIG_BLK_DEV_RAM和CONFIG_BLK_DEV_INITRD)现在的内核都可以支持initrd了,引导进程首先装载内核和一个初始化的ramdisk,然后内核将initrd转换成普通的ramdisk,也就是读写模式的根文件系统设备。然后linuxrc执行,然后装载真正的根文件系统,之后ramdisk被卸载,最后执行启动序列,比如/sbin/init。

选项noinitrd告诉内核不执行上面的步骤,即使内核编译了initrd,而是把initrd的数据写到 /dev/initrd,只是这是一个一次性的设备。(T002)

 

一般情况,内核的配置对于一个安装好的操作系统来说,是一定的,不需要修改的。但如果遇到以下情况
比如:默认情况内核只能认到一个LUN,如果要支持多LUN是需要修改内核的。通过编译重新编译内核这个问题就可以解决。但是
重新编译内核步骤繁琐,也容易出错。因此出现了一个折中的方法——在内核启动的时候,传递一个更新的内核参数,来让启动起来的内核
具有新的功能,而且也不需要重新编译内核。

这种方法同样适用于临时屏蔽掉一些跟系统有冲突的功能能,比如临时禁止使用ACPI(高级电源管理)等

对于grub用户来说,在出现grub提示的时候点"a",可以进入传递内核参数的条目
一般会出现
kernel /vmlinuz-2.4.21-xx ro root=LABLE=/


在这行后面添加一个空格,然后写入相应的内核参数便可以生效

比如
kernel /vmlinuz-2.4.21-xx ro root=LABLE=/ single
表示启动单用户模式
这种方法可以让用户不需要root密码就可以进入系统,并且可以更改root密码
适用于忘记root密码的用户



以下罗列一些常用的传递参数,注意其中有一些参数是在安装系统的时候,用光盘启动,在boot提示符号前用的

apic
该命令绕过在 Intel 440GX 芯片集 BIOS 中可能会普遍遇到的错误,它只应该使用安装程序内核来执行。
apm=allow_ints
该命令改变挂起服务的处理方式(对于某些便携电脑来说可能是必要的)。
apm=off
该命令禁用 APM(高级电源管理)。它很有用处,因为某些 BIOS 的电源管理(APM)问题重重,很容易崩溃。
apm=power_off
该命令会使 Red Hat Linux 默认关闭(断电)系统。它对于不默认关闭的 SMP 系统来说有用。
apm=realmode_power_off
某些 BIOS 在试图关闭(断电)机器时崩溃。该命令把操作方法从 Windows NT 方式改为 Windows 95 方式。
dd
这个参数会导致安装程序提示你使用驱动程序盘。(只适用于系统安装时候)
display=IP:0
该命令允许远程显示转发。其中,IP 应该用你想充当显示系统的 IP 地址替换。
在你想用来显示的系统上,你必须执行 xhost +remotehostname 命令,这里的 remotehostname 是你运行显示命令的主机名称。使用 xhost +remotehostname 命令限制了对远程显示终端的访问,而且不允许来自没有被确切授予远程访问权的人员和系统的访问。
driverdisk
该命令执行的功能和 dd 命令相同,它还会在 Red Hat Linux 安装中提示你使用驱动程序盘。(只适用于系统安装时候)
ide=nodma
该命令禁用所有 IDE 设备上的 DMA,在遇到 IDE 相关的问题时可能有用。
isa
该命令提示你输入 ISA 设备配置。
lowres
该命令强制图形化(GUI)安装程序使用较低的分辨率运行(640x480)。
mem=xxxM
该命令允许你超越内核在机器上检测到的内存数量。在某些较老的仅检测到 16 MB 的系统上,以及某些较新的视频卡与主内存共享视频内存的机器上,你可能需要使用该命令。当执行这项命令时,xxx 应该用以 MB 为单位的内存数量替换。
nmi_watchdog=1
该命令启用内建的内核死锁检测器。它可以用来调试硬性内核锁定。通过执行定期的 NMI(不可屏蔽中断)中断,内核可以监控 CPU 是否被锁,并在需要时打印出调试消息。
noapic
该命令告诉内核不要使用 APIC 芯片。它对于某些带有不良 APIC(如 Abit BP6)或错误重重的 BIOS 的母板有帮助。
noathlon
该命令告诉内核禁用 Athlon 优化。若 Athlon 优化在某些芯片集上被发现无效,它就会起到作用。
noht
该命令禁用超线程(若在 SMP 系统中可用)。
nomce
该命令禁用在 CPU 上执行的自我诊断检查。内核默认启用 CPU 的自我诊断(称为机器检查意外,Machine Check Exception)。在一些较老的 Compaq 机器上,这类检查运行的太频繁,可能需要禁用。
nopass
该命令禁止把键盘和鼠标信息传递给安装程序的第二阶段。当执行网络安装时,它可以用来在安装的第二阶段测试鼠标和键盘配置屏幕。
nopcmcia
该命令忽略系统上的任何 PCMCIA 控制器。
noprobe
该命令禁用硬件检测,相反,它提示用户来提供硬件信息。(只适用于系统安装时候)
noshell
该命令禁止在安装时进入第二虚拟控制台上的 shell。(只适用于系统安装时候)
nousb
该命令禁止在安装中载入 USB 支持。如果安装程序在进程早期容易挂起,该命令就能够起到作用。(只适用于系统安装时候)
nousbstorage
该命令在安装程序的载入程序中禁止载入 usbstorage 模块。它对 SCSI 系统上的设备排序可能有帮助。
resolution=
告诉安装程序要运行哪种视频模式。它接受所有标准的分辨率,如 640x480、 800x600、 1024x768 等等。
serial
该命令启用串行控制台支持。
skipddc
该命令跳过 ddc 显示器探测, 这种探测在某些系统上会导致问题。

 
原创粉丝点击