! r K) j l& s init是Linux系统操作中不可缺少的程序之一。 : q/ j# s' t- f5 c+ X
: I w. A- j c7 a. Z
所谓的init进程,它是一个由内核启动的用户级进程。 0 i- k" _$ s( e3 K9 E$ v
4 R+ P8 t3 p& Z/ }, u: m+ f. M 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 - B2 P1 m5 S' u& D4 A5 _1 O% G/ ?
# Q: V; e. e1 S6 m- D/ R
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。 5 E; X* o& t9 f8 f
c4 t0 K8 y+ D( x& `
二、运行级别 # ~* `, @$ G1 h3 n: o; E& m ; Y2 |( K/ Q5 h 那么,到底什么是运行级呢? $ Q. m$ w# M) w
! R! i$ [8 o( C) m% K2 m 简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。 . ^: R, U6 d# i0 r6 b3 [0 v: C. } " R: `) c4 G7 M1 z3 h% } 不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab) - F7 p0 h3 t4 [, ~5 }6 v- m" @! W7 f ?+ p7 x
# 0 - 停机(千万不能把initdefault 设置为0 ) , Y7 J. m* l* w& i/ g
* i W( V+ Q! Y # 1 - 单用户模式 ( o6 ^6 n1 H3 I1 X* `7 P ) D& B& l0 G: Q& B # 2 - 多用户,没有 NFS $ @0 i, e. H1 N9 {7 O8 W& E# n3 |) }9 u9 o
# 3 - 完全多用户模式(标准的运行级) 1 E0 l8 f! c+ x
& v9 s3 g- S# }) a4 m% S
# 4 - 没有用到 - Q3 d+ K# h- w* \6 f* U( x) h$ s ( q9 i9 o- _2 M( m* Q; @ # 5 - X11 (xwindow) $ v4 M: m* w, z# d. B- Q # G5 B) v; w& ~1 U4 N5 D D) o # 6 - 重新启动 (千万不要把initdefault 设置为6 ) ) g6 c$ u; Q; P; \4 u, a8 m3 { ! }" q5 J' w, R$ _ 这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6) / }* V$ h6 g2 [: q9 [' i0 n* f* c _0 ]% M) F- q- s" n2 X8 O
三、运行级别的配置 8 ?' H; G' u$ i. C3 }
. v( z- Z: n( E: w3 o6 O. M3 j
运行级别的配置是在/etc/inittab行内进行的,如下所示: J! v6 @2 F( D3 O4 {0 A h7 [/ J. I 5 X* t1 u, P7 P9 g+ }2 b( s 12 : 2 : wait : / etc / init.d / rc 2 ( F" @& p" M h- m- ~
" y& {4 ?* m' R. v+ N
第一个字段是一个任意指定的标签; / u0 M i8 T% ]; A% i7 P0 H+ q% [5 [+ M
第二个字段表示这一行适用于运行那个级别(这里是2); $ x& d# ^$ V/ f" @& L+ }7 @
# E r; A5 t. ]& A 第三个字 段表示进入运行级别时,init应该运行第四个字段内的命令一次,而且init应该等待该命令结束。/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2时所需的任何命令。 : D/ ^: h3 k% K) ~) n5 @, F) \+ d+ S u2 t. [1 U5 G' D
第四个字段中的命令执行设置运行级别时的一切“杂活”。它启动已经没有运行的服务,终止不应该再在新运行级别内运行的服务。根据Linux版本的不同,采用的具体命令也不同,而且运行级别的配置也是有差别的。 + g7 b4 H( @9 q( c0 U: [- F; M' A. ?0 C4 a1 o7 }
init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别: ( {8 e5 L! a% R1 q. h
& Y2 b! d }# a2 B& O) L id : 2 : initdefault : ' `9 l @7 l" C4 X. e
3 |- g3 _4 s( A' I$ h
你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“single”或“emergency” 命令行参数来实现的。比如说,内核命令行参数的指定可通过LILO来执行。这样一来,你就可以选择单用户模式了(即运行级别1)。 ) L4 }& N# }& e- x9 l( g; Y u( N# K% k$ t+ v4 L- F1 [# X( p
系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。 ! l/ D) K. n. q, Q6 U: D
, b+ J) E0 G- o* h- f 四、/etc/inittab中的特殊配置 J2 K: ]& H! A4 d
" {3 N* F/ O9 k$ K" F, O
/etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。这些特殊特性都是用第三个字段中的特殊关键字标记出来的。比如: + R, I; c- B5 a) k' H- E- X+ K* E% n5 V: Q# ^/ Z; N7 `- s
1. powerwait 7 I' x9 E- r3 s0 \" l
( n! a# t/ l/ f+ R) r0 r9 T
允许init在电源被切断时,关闭系统。其前提是具有U P S和监视U P S并通知init电源已被切断的软件。 * I' G& T' \3 Q \& Y9 c9 U) d) t: @( H" x7 z
2. ctrlaltdel 6 } H- d* |( T2 @% M6 n
z: e" Y" c% d- p: W
允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。 3 R2 ? r2 V! U3 F' P' P' Q
! Z- q' n; V& z N( S
3. sysinit 3 J. h/ @- F1 C6 Q ^4 @% I
3 M5 E* k c/ a( D( i& h
系统启动时准备运行的命令。比如说,这个命令将清除/tmp。 s% a0 w; l8 G8 F% [; x8 e5 U ) d# h/ V" c% \: H+ Q 上面列出的特殊关键字尚不完整。其他的关键字及其使用详情,可参考你的inittab手册页。 7 H1 b$ |" x8 b
! W6 }4 J. A5 }% N9 G# u: d
五、在单用户模式下引导 }- e- Q: m6 Q- ^3 O* c. v. g9 W* `0 e5 f, }, g, ^1 S+ q# j: v
一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。 : ?% g) _' k; F5 n$ L7 C5 j3 T: i5 n3 B7 R+ \
一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。 . Z$ F3 J2 [% F8 P* p & b6 K' I( c( E3 {/ Z5 M0 i+ T6 K 有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。 * r) [2 Y/ A2 _# Q( k : L2 ?4 N- D: h' k9 @2 g 如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。 + M; Q2 h5 J4 a2 n- C0 K1 G) a9 H/ P+ L" {+ ]( e
由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。 0 t* F( @" |( n! x1 G3 v& P+ F' f; _: ?
! C+ e; G5 j/ Z' B2 a) O' ^/ s( o
不同的运行级有不同的用处,也应该根据自己的不同情形来设置。 4 ~1 f) V$ q1 D, J9 d( C
4 _8 l' T2 v3 U 例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。在启动后的 lilo 提示符下输入: 8 g6 \$ B# b" n
. s1 u! I6 W6 R" N1 C! a* E4 m8 k
init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级。