|
|
发表于 2004-12-5 19:55:03
|
显示全部楼层
id:5:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc
inittab的格式是:
id:runlevel:action:process 参数
当action是boot,bootwait,sysinit 的时候,runlevel可以省略;
当action是initdefault时process省略;
因此根据你上面的inittab,你的系统启动时候的缺省执行级( runlevle)是5,表示X图形登陆方式;
接着执行/etc/rc.d/init.d/rc (sysinit是rc的参数)的脚本,然后根据前面指定的执行级5,再次执行/etc/rc.d/init.d/rc脚本,把5当作命令行参数,执行/etc/rc.d/rc5.d下面的脚本,rc返回后,init启动mingtty显示登陆界面以及提示,将用户输入当作login的参数,加载login程序(此处在tty处会有定义的process)。
附linux-2.4.18中main.c 内的init()内核线程最后几句:
......................
if (execute_command)
execve(execute_command,argv_init,envp_init);
execve("/sbin/init",argv_init,envp_init);
execve("/etc/init",argv_init,envp_init);
execve("/bin/init",argv_init,envp_init);
execve("/bin/sh",argv_init,envp_init);
panic("No init found. Try passing init= option to kernel.");
.......
系统启动到运行用户态初始化进程/sbin/init时,init程序就会读取/etc/inittab文件。
脚本/etc/rc.d/init.d/rc就是主run level控制脚本,也就是最先运行的脚本,传递sysinit给它的时候,它会start 脚本/etc/rc.d/rcsysinit.d中的 service,做一些激活交换分区,检查fs等工作,然后进入指定的run level的脚本执行。
lfs的启动脚本入口都是/etc/rc.d/init.d/rc,然后根据传递的参数再选择对应的/etc/rc.d/下面的脚本执行。
呵呵,说的有点乱,凑合看吧
 |
|