探索UBUNTU10.04的启动流程
OS:Ubuntu 10.04 LTS
之前其实折腾了一下Ubuntu的启动过程,但是那是放到9.04版本之前的,然后从9.04以后Ubuntu中init进程开始和upstart相结合使用,所以也有些难懂。于是做一个小小的探索,记录一下自己的心得。
文中忽视了从BIOS到kernel的过程,因为这一部分没啥变化,将注意力主要集中在init进程上。
———————————–
首先来看看标准的Linux启动中init进程的处理:
init进程会根据/etc/inittab配置文件来初始化系统,inittab文件内容大致如下:
可以看到,首先决定启动等级,然后执行rc.sysinit初始化(检查磁盘,激活交换分区),然后根据启动等级执行/etc/init.d/rc,启动等级作为参数传入,然后就会跳到/etc/rcN.d/下面(N为启动等级),然后执行里面的文件,而里面的文件都是指向/etc/init.d/下面的符号链接。如下:
可以看到,实际上接着init启动的服务都是通过init.d目录中的脚本控制的。至于S20fancontrol,中S和20则表示传入S(Start)参数以及启动优先级(越小越高)。所以现在,你应该能明白为什么有些操作说重启某个服务用到了如下的形式:
这种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文件来确定启动等级,关键内容如下:
2 传递参数给/etc/init.d/rc
3 随后rc根据参数执行/etc/rcN.d里面的脚本
4 rcN.d里面的脚本指向init.d下的脚本,从而让某服务启动
因为Ubuntu中对Runlevel的划分不再明显,所有通过更改Runlevel来裁剪服务的话有时无效,这时候可以通过更改/etc/rcN.d中的脚本来实现。具体可以参见:
如果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
周三, 二 9, 2011
Ubuntu