a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 88|回复: 0

[LPI认证] Linuxupstart和ubuntu启动过程原理

[复制链接]
发表于 2012-8-4 12:13:19 | 显示全部楼层 |阅读模式
ubuntu从6.10开始逐步用upstart代替原来的sysinit,进行服务进程的管理。也正是从6.10开始,ubuntu的启动过程开始变得有点“变幻莫测”。也没办法,这是正在开发中的upstart不可避免的。为了对原有的init实现向后兼容,upstart可以说是在表象上保留了大部分原来init的特性,因而目前linux初始化进程名仍然叫init,而改变的核心,乃是Event机制。理解并讲清楚这个改变的重要意义和内在机理可不是件容易的事,所以我只打算研究一下目前upstart(0.3.9, ubuntu 8.04)在系统启动中的表象行为。[注:据Scott James Remnant在其博客上所说,upstart 0.5.0版本将在未来几周发布。]5 Q" [+ u1 D/ q/ H. v
  关于系统启动,熟悉Linux的人大多应该知道,init进程(PID=1)乃是所有进程的父进程,所有进程由它控制。init进程的运行时间是内核完成文件系统的加载后。那么init进程是如何开启系统中的其它进程的呢?在阐述这个问题之前,大致地说明一下目前ubuntu中与init相关的几个目录和应用程序,可以方便后面的论述。这些目录和程序包括:9 i, O0 o5 u) k" j. P
  init
7 G0 Y& T) N7 w+ M  telinit, J$ D, _/ [6 H- x1 t
  runlevel
3 w% H, G/ h  ]- J  /etc/event.d/# h5 f6 h3 I1 z: O5 \2 |3 p1 B8 T
  /etc/init.d/: w8 P( S1 F9 p3 b5 T0 r
  /etc/rcX.d/
+ l) d  E9 L$ u  前三个是应用程序(注意哦,它们都不是shell脚本),可以理解为是由内核调用的。关于它们的功能,从manpage查看就可以了。我们的重点是后面给出的三个目录。
1 h; J+ l, N" A( J  首先是/etc/event.d/目录,这是upstart的核心,upstart不同于原有的init的地方就在于它引入了event机制。Event机制通俗的讲就是将所有进程的触发、停止等等都看作event(事件)。/etc/event.d/中就存放了目前upstart需要识别的event。这其中主要有三种rc-default, rcX(x=0,1,...6,S)以及ttyX。这rc-default就类似于那大名鼎鼎的inittab文件,它就是设置默认运行级别的[注:upstart中实际并没有运行级别的概念,这么称呼是为了init向后的兼容性]。现在你应该知道了ubuntu里没有了inittab文件后该到哪里设置默认运行级别的了吧!cat rc-default一下吧!rcX文件是发生相应运行级别事件(可以注意到event这个词在upstart里真是无处不见啊)时,需要运行程序的脚本,而ttyX则是设置伪终端数目的,也就是你Ctrl+Alt+F(1~6)调出的那个Console。我们以rc2为例,cat rc2:
0 ~3 A* a. F; ]7 T5 t6 g  start on runlevel 2" s6 u7 x! h) T* y
  stop on runlevel [!2]9 b2 g7 h8 l8 m1 X4 t) Z
  console output9 F. l$ i8 ^+ H( b& |0 C: [! |
  script0 S( B4 t! h# B# g3 k6 {. J0 M
  set $(runlevel --set 2 || true)+ ]  x2 H4 ]- l3 z  J
  if [ "$1" != "unknown" ]; then
1 z; l/ Q! r9 @# Z2 U+ {  C  PREVLEVEL=$1
. {" C, V" U( u  RUNLEVEL=$2
: b: X  w1 t7 N2 O3 Z% `: ^  export PREVLEVEL RUNLEVEL
9 d$ \. @8 S' U, c) H9 a  fi
# r3 x/ z. {. y  u9 b" P( ~  exec /etc/init.d/rc 2) C* D6 }2 \" n" b0 s/ S  X
  end script/ k& Q& w; Z5 \% L( F4 x2 p5 l
  ..
) P0 W4 w% F6 }/ @1 ]3 ]9 M  不去考虑细节,只要注意到前两行和倒数第二行就可以了。可以看到,rc2文件是定义在发生运行级别2的时候所要执行的东西,核心就是这句:exec /etc/init.d/rc 2。这样,我们就可以自然地过渡到下一个重要的目录,/etc/init.d/了。
7 J1 l' Q+ q0 z1 t* o  你可以ls /etc/init.d/看一下里面的内容,对它有个大致的了解。/etc/init.d/中存放的是服务(services)或者任务(tasks)的执行脚本。可以这么说,只要你安装了一个程序(特别是服务程序daemon),它可以在系统启动的时候运行,那么它必定会在/etc/init.d/中有一个脚本文件。我们还回到上面的rc2文件,它执行了一个exec /etc/init.d/rc 2的命令。也就是说,给/etc/init.d/rc脚本传递了一个参数"2",让它执行。我们仔细查看一下rc脚本(很长,耐心点),能看到这样的一段:5 x) f" V- r8 q, z5 ~
  # Now run the START scripts for this runlevel.0 u# R& l5 H3 K- F0 U/ d& v
  # Run all scripts with the same level in parallel+ p: X2 r2 F% r8 V! i$ d
  .......1 c7 @: {7 Z& q- C, r3 z
  for s in /etc/rc$runlevel.d/S*/ r+ A$ K. |7 t$ p
  .......) b' P! D) @% r. F. c6 Q3 \0 H
  这说明,当给rc脚本传递一个数字参数"X"的时候,它在经过一系列的设置后,将会开始执行/etc/rcX.d/下S开头的脚本。这就过渡到下一个目录/etc/rcX.d/了。
& x8 V, U. T. w! R% C5 m2 g  进入/etc/rcX.d/,ls -l /etc/rcX.d/看看有些什么内容?哈哈,没错,都是一些到/etc/init.d/中脚本的符号链接。不同的是它们的开头加上了S和一个数字。熟悉原本init的人应该知道,S表示在启动时运行,数字则表示执行的先后顺序。
, e  ^' [& s# |5 x  这样一来,upstart管理的ubuntu启动过程应该就清楚了。梳理一下:* ?, U8 W1 ]2 m0 E7 |4 j
  1,内核启动init, M+ w5 z6 t: O* x
  2,init找到/etc/event.d/rc-default文件,确定默认的运行级别(X): I; @3 q4 V" }# R0 e& p) d- ^! d
  3,触发相应的runlevel事件,开始运行/etc/event.d/rcX
4 e$ l1 n' G+ z" e4 v0 w+ x  4,rcX运行/etc/init.d/rc,传入参数X8 o$ Y8 y7 P& g3 ~; ?
  5,/etc/init.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本6 ~9 n9 b0 N5 }& T# N* J
  6,/etc/rcX.d/中的脚本按事先设定的优先级依次启动,直至最后给出登录画面(启动X服务器和GDM)
, L& V3 x$ ^. i; @& d  理解了这些,手动配置开机服务的启动与否就很简单了。Ubutnu默认的启动级别是2,不想启动的程序,只要把相应的符号链接从/etc/rc2.d/中删去即可!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 04:45 , Processed in 0.316753 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表