Linux 启动参数 (转)

转载 2012年03月25日 00:47:09

一般的系统是先启动/sbin/init,但是也可通过启动参数指定init=来确定,
如:我的系统就是制定的init=/linuxrc,因为文件系统是采用busybox的,而linuxrc
也是一个指向busybox的文件,不过不确认它指向具体哪个指令。不过可能是/sbin/init。
init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始
化的那些进程都由init创建,所以init进程也称为系统初始化进程。
    如我的inittab:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/login
::restart:/sbin/init
tty0::askfirst:-/bin/login
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

inittab的格式如下:
id:rstate:action:process
1.id字段是最多4个字符的字符串,用来唯一标志表项。
2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,
也可以是空,空则代表运行级别0~6。当请求init改变运行级别时,那些rstate字段中不包括新运行级
别的进程将收到SIGTERM警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是真正的运行级别)
3.action字段定义了该进程应该运行在何种状态下:
    代码:
    boot        在系统启动时运行,忽略runlevel
    bootwait    在系统启动时运行,init等待进程完成。忽略runlevel
    ctrlaltdel    当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init。忽略    runlevel
    initdefault    不要执行这个进程,它用于设置默认runlevel
    kbrequest    当init从键盘中收到信号时运行。这里要求键盘组合符合KeyBoardSigral(参见/usr/share/doc/kbd-*关于键盘组合的文档)
    off        禁止进入,因此该进程不运行
    once        每一个runlevel级别运行一次
    ondemand    当系统指定特定的运行级别A、B、C时运行
    powerfail    当init收到SIGPWR信号时运行
    powerokwait    当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行
    powerwait    当收到SIGPWD信号,并且init等待进程结束时运行
    respawn        不管何时终止都重新启动进程
    sysinit        在运行boot或bootwait进程之前运行
    wait        运行进程等待输入运行模式
    process 字段包含init执行的进程,该进程采用的格式与在命令行下运行该进程的格式一样,
    因此process字段都以该进程的名字开头,紧跟着是运行时,紧跟着是运行时要传递给该进程的参数。
    比如/sbin/shutdown -t3 -r now,该进程在按下Ctrl+Alt+Del时执行,在命令行下也可以直接输入
    来重新启动系统。
4.Process字段中进程可以是任意的守候进程、可执行脚本或程序。
另外:在任何时候,可以在文件inittab中添加新的记录项,级别Q/q不改变当前的运行级别,
重新检查inittab文件,可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab. 

他会先执行/etc/init.d/rcS
#! /bin/sh

/bin/mount -a
mdev -s
而mount -a会执行/etc/fstab
proc        /proc    proc    defaults    0    0
none        /tmp    ramfs    defaults    0    0 
mdev        /dev    ramfs    defaults    0    0
sysfs        /sys    sysfs    defaults    0    0 
挂载一些ramfs。

如果开机不想采用输入密码的话,修改inittab如下:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
tty0::askfirst:-/bin/sh
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

-------------------------------------------------------------------------------------------------

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,只是这是一个一次性的设备。

Linux操作系统内核启动参数详细解析 [转]

Linux内核在启动的时候,能接收某些命令行选项或启动时参数。当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核。 如果不使用启...
  • Blaider
  • Blaider
  • 2013年02月18日 13:46
  • 663

Linux启动bootargs参数分析

  • 2014年05月07日 16:05
  • 21KB
  • 下载

linux启动参数

  • 2012年03月19日 22:51
  • 109KB
  • 下载

Linux启动参数及实现 __setup与early_param

http://blog.csdn.net/tommy_wxie/article/details/8041487 Linux启动参数及实现 __setup与early_param...

玩转资源管理器的启动参数.pdf

  • 2011年08月20日 16:39
  • 64KB
  • 下载

linux2.6内核,如何指定内核启动参数

前两天调试加载文件系统时,由于cfe中参数写不进去,直接在内核中写死参数,碰到一个问题: static int __init init_setup(char *str) { unsign...

BootLoader给Linux kernel传递的启动参数详解

根文件系统相关启动参数: root #指出启动的根文件系统 如:root=/dev/sda1 ro #指定根设备在启动过程中为read-only,默认情况下一般都是这样配的 rw #和ro类似,...

Linux内核启动参数传递

Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常见的就是cmdline。以前我在启动内核的时候习惯...

LINUX KERNEL启动参数

原文地址: http://smilejay.com/2011/10/kernel_parameters/ 在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1....

linux启动参数

内核引导参数大体上可以分为两类:一类与设备无关、另一类与设备有关。内核源码树下的 Documentation/kernel-parameters.txt 文件列出了所有可用的引导参数,并指明了处理每个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 启动参数 (转)
举报原因:
原因补充:

(最多只允许输入30个字)