数学建模社区-数学中国

标题: Linux init详解 [打印本页]

作者: huashi3483    时间: 2004-9-27 15:00
标题: Linux init详解
一、什么是INIT:  ) Z+ _* F# d( t$ I) k$ z( M

# q6 k/ y0 k% b( {6 @, k  init是Linux系统操作中不可缺少的程序之一。  * p: r% H2 Q* u0 R+ w6 r

3 v' \; v" R8 k0 }( d" |4 p  所谓的init进程,它是一个由内核启动的用户级进程。  
. R; C$ L, h- c
$ m( G! @/ Z) q0 x- `  内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。    @" Y7 u, i0 F; I  Z

1 W8 _7 I' x; Z  内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。  
' h+ h( H4 A6 C: V1 h- v3 O
; \/ q# \, t$ l  l, r  二、运行级别  
$ g  o5 `# c% |' w: n( r6 M0 x
  T& R+ Z- W3 t% {* d  那么,到底什么是运行级呢?  0 @: O" F6 l0 @- ]9 D1 f: h
! U. v7 F2 h) j- r0 L( [
  简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。  
1 @- Q: o% Y- Z' g) z1 r: D! q1 i- _& E$ n" l, v7 x
  不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)  ! t. `% a& F& L4 p) Q
* ~" i* W7 J  `3 }! i/ U% Q3 J
  # 0 - 停机(千万不能把initdefault 设置为0 )  
- A, Z4 C1 n; }  g  x0 m9 ~
4 z: T7 R4 a) \! c  # 1 - 单用户模式  ' w- ^& w9 n  o: V$ Y4 r% t
0 C! u; a$ b" \3 Y
  # 2 - 多用户,没有 NFS  ; U! p, s9 K5 T' W6 R& N" i
- {$ }. V! T$ ]
  # 3 - 完全多用户模式(标准的运行级)  
* B1 X# f. m/ ~/ L* `# l
8 Z  W4 [' D3 p  # 4 - 没有用到  * d* F+ Y. h5 a8 ?7 q

: ~7 m4 h- ?! ?5 |" a# a  # 5 - X11 (xwindow)  
8 I" C$ o; i3 C) {4 Z
+ E* @+ u/ H" {* U! c  # 6 - 重新启动 (千万不要把initdefault 设置为6 )  
3 L  O" H$ p2 b2 G$ b  \
2 [3 p+ G1 x8 }/ W6 Z  这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)  9 s& J. }3 h# L

8 ~. L) F- W: N9 x三、运行级别的配置  
( @, w# C) E9 T& g7 E  ]
( g; h4 G5 m) d2 p7 v* @1 B  运行级别的配置是在/etc/inittab行内进行的,如下所示:  % r2 }, E* }1 K# S& M5 @* F

  d2 a% v3 }8 a4 j& t  12 : 2 : wait : / etc / init.d / rc 2  
* H1 S9 V! m0 E
( v4 e, n& ?1 ]  ~& b8 ^  第一个字段是一个任意指定的标签;
( O7 H  R/ I, m+ g0 T1 d8 U5 ~$ D( g* b/ J9 _) C
  第二个字段表示这一行适用于运行那个级别(这里是2);
- F6 A$ O4 B& |
# F5 g' T8 |! [7 B  第三个字 段表示进入运行级别时,init应该运行第四个字段内的命令一次,而且init应该等待该命令结束。/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2时所需的任何命令。  2 _8 z7 S1 c( @( |' O0 @

+ k2 h2 m8 ~9 {! Y  第四个字段中的命令执行设置运行级别时的一切“杂活”。它启动已经没有运行的服务,终止不应该再在新运行级别内运行的服务。根据Linux版本的不同,采用的具体命令也不同,而且运行级别的配置也是有差别的。  
/ `! U% J, p+ f" U8 T0 K" ?' E1 i6 V* g" [7 W/ f6 t  E! K
  init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别:  
" \# [& m8 ^7 }) i6 a, x# u' T% M5 E$ R; n! c; N
  id : 2 : initdefault :  
9 m) ^6 Z6 [3 O* r7 N
3 [( C" F! Y. Z' [# b3 b& h  你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“single”或“emergency” 命令行参数来实现的。比如说,内核命令行参数的指定可通过LILO来执行。这样一来,你就可以选择单用户模式了(即运行级别1)。  
6 n8 C" \9 k' j5 L" l( v7 P2 a5 T6 \
  系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。  , Y8 S* b! b2 \$ s- U

0 |/ R; H8 F6 L2 k8 W  四、/etc/inittab中的特殊配置  
9 J- j& c1 e  E: x, P& K4 q* k) V" H* p/ n9 L3 \( S0 E- V
  /etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。这些特殊特性都是用第三个字段中的特殊关键字标记出来的。比如:  
4 s* t; d! P! f* q
7 ~# l" u* n- E  1. powerwait  7 p' |, N5 [- K" R3 k
! ?2 c4 ~0 q. D1 `
  允许init在电源被切断时,关闭系统。其前提是具有U P S和监视U P S并通知init电源已被切断的软件。  
* Q/ K% z. q- d. R+ g1 \0 n
1 e! F( p" j6 y6 b/ U  2. ctrlaltdel  & P! q* a. [, B' I. f
- J5 m* F$ c$ Z" \: V$ Y5 b
  允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。  4 d8 F  l* g+ U3 @* o, y
3 n8 ^+ v* J5 g( `
3. sysinit  
1 c$ y" ]3 m/ u8 j
0 ]; ^8 b% U8 S+ o3 c  系统启动时准备运行的命令。比如说,这个命令将清除/tmp。  ' \* t( C! C* R! B* m
) g* E/ f3 y' e
  上面列出的特殊关键字尚不完整。其他的关键字及其使用详情,可参考你的inittab手册页。  
& Z# g6 h# |" X- U, Y# e+ B1 }+ u4 H1 ?
  五、在单用户模式下引导 ( a. v( ?# q& C6 i6 L7 G. J

2 t7 X# |2 t, q9 \  一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。  
4 \2 I4 G0 }, ^/ Y7 _0 _$ w( m8 n
( O& G" z  }1 [0 l! L  一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。  
$ E: O  |$ e9 `/ ?7 m
5 \8 f6 L9 q# W  有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。  
' S2 y/ E3 F3 c. ?- a0 ]! M3 ~# ]) C
  如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。  1 d0 m" A" r/ \) R2 k% U- u

+ Z. z7 j# w! f+ \. R  由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。  8 [  J! ~' ?  E6 \" l# D* A

# X% j1 \% d) v! I  ]  不同的运行级有不同的用处,也应该根据自己的不同情形来设置。  
; Y4 i0 _+ e9 J" Z1 |! M
! O/ q) A1 P. @# Z3 }" [! \: }# M# @  例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。在启动后的 lilo 提示符下输入: $ T9 W6 X& a5 x% o! r& }

7 ]* E. I- p/ b* a6 i( I. E  init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级。
作者: 宇仲    时间: 2015-1-15 11:07
楼主辛苦了,继续加油!5 O' f$ p0 ~/ s





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5