数学建模社区-数学中国

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

作者: huashi3483    时间: 2004-9-27 15:00
标题: Linux init详解
一、什么是INIT:  
! |: H% z7 ^6 b1 c" ^8 k
9 L6 y3 b9 B0 O7 [2 D. h% r  init是Linux系统操作中不可缺少的程序之一。  
5 n$ X4 O& M& ]( W: l! A( n5 @% q; m4 b. m
  所谓的init进程,它是一个由内核启动的用户级进程。  ' d& d6 d* ?9 Q3 u0 {9 C5 t
4 _5 p, ^* A& t( w
  内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。  
4 C) W9 g6 o+ ]% b" c3 G) V  o% X* k# ~% T# U% P6 r& c2 J
  内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。  
0 @. q! `/ |+ g2 h: Y8 b0 V# C8 }8 c& c" S8 b; A0 x
  二、运行级别  
' U0 \& Z; G" P" v% K  w) S$ x2 d. R  z+ n1 ^. k) T' u+ H+ Y
  那么,到底什么是运行级呢?  1 G2 o+ l& }; k2 l5 T  m7 Q: n
/ k& l5 L" k8 @
  简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。  " C  u  t% j* t' s. y4 n( I
9 M8 }+ \% L* d0 i* y* v0 {
  不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)  8 a* H  V+ @" J! b/ A3 L

5 E  G1 r6 z. f# Q5 T9 S4 o  # 0 - 停机(千万不能把initdefault 设置为0 )  
) T1 Z! B5 r* ~5 e5 k) [- q' X/ G8 j/ [5 Z& Y( u
  # 1 - 单用户模式  
$ R  e8 q" F% E1 q' z' ]$ s, l3 a+ u8 {
  # 2 - 多用户,没有 NFS  
  V8 A5 k9 F: B$ Y7 O) R2 e. q! ^' r  l3 }  I+ f$ V$ r1 g
  # 3 - 完全多用户模式(标准的运行级)  
8 W. w! o4 z* B) \. A3 e: D5 Z$ E9 ?! j6 L, i$ k& A& B
  # 4 - 没有用到  
1 N0 p* N# E. `) Y: Z5 S1 c' T4 r' e; b0 l
  # 5 - X11 (xwindow)  1 N# a- h& D: _0 {7 p
2 ]- L( F8 t2 W6 S2 H; w2 Q
  # 6 - 重新启动 (千万不要把initdefault 设置为6 )  
* R" z* j7 p# O6 G$ v" R: i
9 B# A0 b. M" W  这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)  ) Z; N0 D3 C7 I1 ]
* O: d' v1 H' l: P4 B% q! d* a+ G
三、运行级别的配置  
( K9 X  e1 }1 P* V0 E7 E1 x7 V7 b1 g: E8 T
  运行级别的配置是在/etc/inittab行内进行的,如下所示:  
7 U+ ?/ ~3 \" R, L; [# l5 m8 t  f, f: z; r/ _
  12 : 2 : wait : / etc / init.d / rc 2  ( R" \. E4 g; w2 f) R
: d4 {) Z) l; Z8 t3 x. x5 ~
  第一个字段是一个任意指定的标签; - t& [2 A+ Y  F  t& k

! x) H9 S4 ?4 s, f# _3 }  第二个字段表示这一行适用于运行那个级别(这里是2);
. I1 @( w2 u( M0 D/ \
8 Y4 p3 p" ?2 {  第三个字 段表示进入运行级别时,init应该运行第四个字段内的命令一次,而且init应该等待该命令结束。/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2时所需的任何命令。  $ w3 W' X+ K  B

: C% H% r( |& B- O" o9 j" o& b  第四个字段中的命令执行设置运行级别时的一切“杂活”。它启动已经没有运行的服务,终止不应该再在新运行级别内运行的服务。根据Linux版本的不同,采用的具体命令也不同,而且运行级别的配置也是有差别的。  ' D' P, r; \2 ^9 K$ t; ?: i

, \% C. W, _, A6 `  init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别:  
/ c( }- O8 f7 x! a
/ Y! q3 |3 D7 I* Q! I  id : 2 : initdefault :  
" p$ e5 {/ o; H
3 s# t0 g2 u- ~  你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“single”或“emergency” 命令行参数来实现的。比如说,内核命令行参数的指定可通过LILO来执行。这样一来,你就可以选择单用户模式了(即运行级别1)。  ) \5 j  X; l7 g0 j

9 k% l7 q; `/ I1 \7 R( H  系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。  . Q) R1 Q1 h' u- [
& h1 @) f0 J5 B% l" t
  四、/etc/inittab中的特殊配置    r0 l! Q6 s& f: T. V! g! t: p

5 |, t2 ~/ N; H2 H; f3 |# C( ~  /etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。这些特殊特性都是用第三个字段中的特殊关键字标记出来的。比如:  
# j3 v8 |5 m* @  y7 }) J  o( W- o8 p4 d$ R3 f, ?! O' j/ R  ]
  1. powerwait  
( w- J3 H  ?5 h; ~0 N+ s* n( L
3 M* U# _2 x" a  U) ~4 f, M  允许init在电源被切断时,关闭系统。其前提是具有U P S和监视U P S并通知init电源已被切断的软件。  
0 V& |- K  u1 `; O- W) ^- L6 _  {4 p; _- f
  2. ctrlaltdel  / w7 H5 p& H6 p% r) d$ C

2 V. n/ H3 I, p9 i* d% y) Q2 g  允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。  4 {6 q. f* s$ \. W8 V

; C8 [9 U( M* d" D3. sysinit  
: \4 v1 [, t2 I$ g; L$ M3 k% ?* U3 M, P. B2 _. _- v/ o) r
  系统启动时准备运行的命令。比如说,这个命令将清除/tmp。  
1 q& t5 x2 y; R& I' |5 m8 A% }) Y, S' S9 F  \
  上面列出的特殊关键字尚不完整。其他的关键字及其使用详情,可参考你的inittab手册页。  
/ ^6 l4 O2 Q/ \0 |4 {' g# }' P- F! V+ R" g# ]& [
  五、在单用户模式下引导 ! b/ q1 x- s, b0 e9 @
+ x5 @1 K4 E$ [4 J% N2 }
  一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。  
1 w# h) ?4 n7 H. j) `( O, K, y) Z/ E' [7 R
  一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。  
  h( `( h7 l5 a1 q# d' O$ x9 n! @/ B+ ^5 C, S3 M8 Z
  有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。  / l; j5 D+ x$ b
/ V( S# ?3 \" P) B
  如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。  0 f$ k, \# f) x* [7 D

. x8 S7 _3 |; f1 ]6 x  由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。  & s8 p+ k% R+ T5 P
1 o1 y0 m- s- r7 N: X
  不同的运行级有不同的用处,也应该根据自己的不同情形来设置。  5 s& S( V3 E" }5 ]& k
/ u# H4 A# S, A2 Q5 P! m9 A
  例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。在启动后的 lilo 提示符下输入:
2 [& v8 K0 G3 L( F8 e
2 A7 k. g$ q& i2 U. e  init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级。
作者: 宇仲    时间: 2015-1-15 11:07
楼主辛苦了,继续加油!- |# V* o: Y) R" l





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