数学建模社区-数学中国

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

作者: huashi3483    时间: 2004-9-27 15:00
标题: Linux init详解
一、什么是INIT:  
3 J/ N. a, g) d3 N4 ^) I
- x$ q2 p" J2 s6 Y$ |! O4 }  p  init是Linux系统操作中不可缺少的程序之一。  ; F9 _- k. n9 c) n# k2 h5 i6 q2 Q

5 S" l5 H; Q5 b$ B  所谓的init进程,它是一个由内核启动的用户级进程。  
$ ~8 z* @* c2 J2 k# p7 L( u$ R" C# {4 R" k5 B
  内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。  
6 J- r% r- z& B% T$ n0 c: \; g; _  C7 ?. s8 x5 p
  内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。  
, h" O1 s( @6 Q/ L# X# n
" b  n3 Q- W& {0 e3 g: r- t  二、运行级别  ( o0 U4 c9 i: J7 u

! R' O, e% m9 D8 b- B( t: Z1 i7 E  那么,到底什么是运行级呢?    @1 G8 _4 F7 _% R1 t$ b, H
$ t& R: |! B% b& G( x, Z* `
  简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。  
; ?' w1 |; A( r! [+ K( e" C- r; f, G( ^- v2 w( e; ^9 a
  不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)  ) c/ n( b4 @$ `! _5 {# N6 E
' M7 x+ C3 ?+ r7 P$ ]5 }, s: J
  # 0 - 停机(千万不能把initdefault 设置为0 )  
8 d9 {% z, D- D# d( y
, ~9 W6 H( I, v+ M0 ^  # 1 - 单用户模式  " _+ w* B* }( y' B2 I% L

! F8 n: P8 L, r9 s8 `" W- m' I  # 2 - 多用户,没有 NFS  
9 z8 _1 @8 F- b1 D5 t1 Q* w$ s0 _& w* y1 y# e) |5 W* _
  # 3 - 完全多用户模式(标准的运行级)  
& C6 a$ m' d5 Q7 O; t* J9 s# P" B+ d4 }: g: ~# b
  # 4 - 没有用到  
/ D* @9 Y& Y& v& ]% d" z
3 Y  K/ I1 f1 d/ q" b( ^1 X5 b7 Y1 a  # 5 - X11 (xwindow)  & k, K3 D: r6 v" X
7 r% T" |& \4 m" E2 o1 T8 k
  # 6 - 重新启动 (千万不要把initdefault 设置为6 )  
- g3 S1 N2 L: _6 c: K" a" M" j$ m3 m% C/ B3 M3 m
  这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)  4 @' [# R8 }+ `' Z, C( j. x

+ a* a& V; j3 s& l9 O6 Z7 w9 f! ]三、运行级别的配置  0 ^! N5 t7 p8 Z% j. M

! Z( M# r# o0 ?( N  运行级别的配置是在/etc/inittab行内进行的,如下所示:  8 L8 M4 o3 V' u5 W5 ?
8 l. y, H+ w! k5 Y+ t0 Z# }4 d
  12 : 2 : wait : / etc / init.d / rc 2  
$ h- d5 ]: e3 ?' l) K3 ~  X$ m* j; O! o: t, W( j- f1 e1 R
  第一个字段是一个任意指定的标签; 9 x1 D* P, M' i' F8 b& \4 f
' o$ _+ J! {& g) a0 e6 T  C
  第二个字段表示这一行适用于运行那个级别(这里是2); , \3 U! m3 s" C' ~0 O! t8 y& I
- j  ^0 \  J' P  x
  第三个字 段表示进入运行级别时,init应该运行第四个字段内的命令一次,而且init应该等待该命令结束。/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2时所需的任何命令。  
% v  z" J( ~' T1 M) V
0 H/ K$ K" D0 x: j% l  R  第四个字段中的命令执行设置运行级别时的一切“杂活”。它启动已经没有运行的服务,终止不应该再在新运行级别内运行的服务。根据Linux版本的不同,采用的具体命令也不同,而且运行级别的配置也是有差别的。  1 B9 n; h+ q5 p, A; O) v* |! ?
8 V3 F3 @$ r5 z! a) u
  init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别:  & r: b9 ~& k+ g4 e9 [( P0 a: t
4 N6 G$ {. d& t3 T, S! a
  id : 2 : initdefault :  
' ?0 j1 _0 i, h& E: n0 I, \" \' m3 ], A# |
  你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“single”或“emergency” 命令行参数来实现的。比如说,内核命令行参数的指定可通过LILO来执行。这样一来,你就可以选择单用户模式了(即运行级别1)。  
; x% `0 q/ R$ [! ^% O
0 `6 v2 j: ^6 Z/ {0 O+ b  系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。  
0 K* `) _  R1 c9 m- }2 v% ]; x8 `- {  e# P! y% G4 w
  四、/etc/inittab中的特殊配置  
8 w. l8 L, w6 N/ e4 i! N, o" N8 O  b1 z/ m9 {, u8 A
  /etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。这些特殊特性都是用第三个字段中的特殊关键字标记出来的。比如:  * ?/ x) X8 i; {& x5 C$ ^

; D0 v7 c. S9 L  C0 U* h3 z  1. powerwait  # x# m! L7 J2 w/ n# L) q2 K
8 u- w) y) H( p
  允许init在电源被切断时,关闭系统。其前提是具有U P S和监视U P S并通知init电源已被切断的软件。  - l! V3 y/ m$ R9 m: i0 ^$ e  O

- b( ~/ D5 \+ O$ K% K1 i  2. ctrlaltdel  4 B3 U, C, G: G% Q
, Q7 m  O4 Q# i- \' h( f
  允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。  5 k2 ]1 o4 Y) N+ r8 l
) o2 u) ~% G, M9 X
3. sysinit  5 \! m) F- v, `; Z7 z+ A& B
; K: u$ e% {! N6 A$ W' l
  系统启动时准备运行的命令。比如说,这个命令将清除/tmp。  1 F- ?4 O9 a) \3 _) S( u+ I
/ @+ e+ y8 I/ B# S% |& A0 D* Y
  上面列出的特殊关键字尚不完整。其他的关键字及其使用详情,可参考你的inittab手册页。  4 c5 J4 R/ r# {& ]6 n* ]- M2 Q

$ O- F2 J! q$ |, s* t+ }  五、在单用户模式下引导 1 s2 K( B5 Z. c: G6 B

% y, {5 m" [$ A; ?  一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。  0 Q+ ~. f9 E. Y. [
9 a; C# k* {# C5 H- o( ~( j
  一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。  ! K5 E) c' |) ^5 f) ]! x! _
. _% L6 r5 X' {$ n4 G7 C! G
  有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。  $ A+ I$ h3 D. G; F5 n

3 p# O2 `2 O5 o  如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。  / y# b1 S4 h% ^$ [
; c" f+ a; d9 |( E$ u
  由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。  2 f( L6 c% R& U) w; C1 }
) s8 b9 T: n8 ?8 x$ H. _
  不同的运行级有不同的用处,也应该根据自己的不同情形来设置。  
  y2 ^( m( Z& T0 I3 c7 z9 {6 A
4 O+ i7 K  f* i+ N/ c  例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。在启动后的 lilo 提示符下输入:
+ K0 I) I$ I8 u- B9 L$ w% E$ w9 B; L( q2 ]
  init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级。
作者: 宇仲    时间: 2015-1-15 11:07
楼主辛苦了,继续加油!" j! p, d: k& R8 U





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