探索UBUNTU10.04的启动流程(转)

2011-06-30  孙锋 


探索UBUNTU10.04的启动流程

周三, 二 9, 2011

Ubuntu

OS:Ubuntu 10.04 LTS
之前其实折腾了一下Ubuntu的启动过程,但是那是放到9.04版本之前的,然后从9.04以后Ubuntu中init进程开始和upstart相结合使用,所以也有些难懂。于是做一个小小的探索,记录一下自己的心得。
文中忽视了从BIOS到kernel的过程,因为这一部分没啥变化,将注意力主要集中在init进程上。
———————————–
首先来看看标准的Linux启动中init进程的处理:
init进程会根据/etc/inittab配置文件来初始化系统,inittab文件内容大致如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 # The default runlevel id:2:initdefault # Boot-time system configuration/initialization script si::sysinit:/etc/rc.d/rc.sysinit # Runlevels l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 z6:6:respawn:/sbin/sulogin

可以看到,首先决定启动等级,然后执行rc.sysinit初始化(检查磁盘,激活交换分区),然后根据启动等级执行/etc/init.d/rc,启动等级作为参数传入,然后就会跳到/etc/rcN.d/下面(N为启动等级),然后执行里面的文件,而里面的文件都是指向/etc/init.d/下面的符号链接。如下:

1 2 lrwxrwxrwx 1 root root 20 2011-01-29 13:53 S20fancontrol -> ../init.d/fancontrol lrwxrwxrwx 1 root root 20 2011-01-29 13:53 S20kerneloops -> ../init.d/kerneloops

可以看到,实际上接着init启动的服务都是通过init.d目录中的脚本控制的。至于S20fancontrol,中S和20则表示传入S(Start)参数以及启动优先级(越小越高)。所以现在,你应该能明白为什么有些操作说重启某个服务用到了如下的形式:

1 /etc/init.d/xxx start/restart/stop

这种init的过程是System V Init机制,有个缺点就是根据inittab文件来执行,整个过程实际上是一个串行启动的方式,即,服务是一个接一个的启动,所以造成了Linux的启动速度不快。所有后来有人提出了SysVinit的替代程序,从而大大加速了Linux的启动,其中最著名的,也就是现在Ubuntu中使用的upstart了。
———————————–
再来看看Ubuntu中init进程的处理:
前文说到,Ubuntu使用了upstart来进行初始化处理,那么为什么还要说是init进程了?这是因为现在的Ubuntu10.04中还没有完全独立使用upstart启动机制,而是采用SysVinit+Upstart结合的方式(主要是为了和第三方软件兼容)。所有在Ubuntu10.04及以后,你会发现三个特点:
1 没有标准init进程中的/etc/inittab以及rc.sysinit文件。
2 没有标准Upstart中初始化用的rc-default文件以及事件触发目录/etc/event.d。
3 Ubuntu已经不再严格区分各个启动等级(Runlevel)了。

在Ubuntu中,和init有关的就是/etc/init /etc/init.d /etc/rcN.d了(N为启动等级Runlevel,S代表单用户模式)。注意。这里的init,指的是基于Upstart的初始化进程。Ubuntu中的启动流程如下:
1 init读取/etc/init/rc-sysinit.conf文件来确定启动等级,关键内容如下:

1 2 3 # Default runlevel, this may be overriden on the kernel command-line # or by faking an old /etc/inittab entry env DEFAULT_RUNLEVEL=3

2 传递参数给/etc/init.d/rc
3 随后rc根据参数执行/etc/rcN.d里面的脚本
4 rcN.d里面的脚本指向init.d下的脚本,从而让某服务启动
因为Ubuntu中对Runlevel的划分不再明显,所有通过更改Runlevel来裁剪服务的话有时无效,这时候可以通过更改/etc/rcN.d中的脚本来实现。具体可以参见:

1 2 man rc-update man initctl

如果Ubuntu完全采用Upstart的话,应该就没有启动等级这个概念了,然后所有的事件触发都在/etc/event.d中定义了,rcN.d中的内容也会被移动到event.d中了。
———————————-
参考资料:

http://apps.hi.baidu.com/share/detail/21129066

http://dpinglee.blog.163.com/blog/static/14409775320104244155181/

http://www.linuxdiyf.com/viewarticle.php?id=88835

http://upstart.ubuntu.com/getting-started.html

http://blog.sina.com.cn/s/blog_402a2fb60100ksmd.html

403°/4034 人阅读/0 条评论 发表评论

登录 后发表评论