感谢原文作者:http://www.ixdba.net/article/4a/1791.html
关于init的详情,可见于维基百科:http://en.wikipedia.org/wiki/Init
init 的进程号是 1 ,
从这一点就能看出, init 进程是系统所有进程的起点, Linux 在完成核内引导以后,就开始运行 init 程序,。
init 程序需要读取配置文件 /etc/inittab 。 inittab 是一个不可执行的文本文件,它有若干行指令所组成。在 Redhat 系统中, inittab 的内容如下所示 ( 以 “###" 开始的中注释为笔者增加的 ) :
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg,
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
/*
理解 Runlevel
runlevel 用来表示在 init 进程结束之后的系统状态,在系统的硬件中没有固定的信息来表示 runlevel ,它纯粹是一种软件结构。 init 和 inittab 是 runlevel 影响系统状态的唯一原因。在上述例子中 inittab 文件起始阶段的注释主要用来描述 runlevel :
Runlevel 0 是让 init 关闭所有进程并终止系统。
Runlevel 1 是用来将系统转到单用户模式,单用户模式只能有系统管理员进入,在该模式下处理那些在有登录用户的情况下不能进行更改的文件,改 runlevel 的编号 1 也可以用 S 代替。
Runlevel 2 是允许系统进入多用户的模式,但并不支持文件共享,这种模式很少应用。
Runlevel 3 是最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式。
Runlevel 4 一般不被系统使用,用户可以设计自己的系统状态并将其应用到 runlevel 4 阶段,尽管很少使用,但使用该系统可以实现一些特定的登录请求。
Runlevel 5 是将系统初始化为专用的 X Window 终端。对功能强大的 Linux 系统来说,这并不是好的选择,但用户如果需要这样,也可以通过在 runlevel 启动来实现该方案。
Runlevel 6 是关闭所有运行的进程并重新启动系统。 */
### 表示当前缺省运行级别为 5(initdefault) ;
id:5:initdefault: /* 启动后进入图形界面 , 设为 3 则进入字符终端界面 */
### 启动时自动执行 /etc/rc.d/rc.sysinit 脚本 (sysinit)
/*
在 inittab 文件中以 # 开头的所有行都是注释行。注释行有助于用户理解 inittab 文件, inittab 文件中的值都是如下格式:
label:runlevel:action:process
label 是 1~4 个字符的标签,用来标示输入的值。一些系统只支持 2 个字符的标签。鉴于此原因,多数人都将标签字符的个数限制在 2 个以内。该标签可以是任意字符构成的字符串,但实际上,某些特定的标签是常用的,在 Red Hat Linux 中使用的标签是:
代码 :
id 用来定义缺省的 init 运行的级别
si 是系统初始化的进程
ln 其中的 n 从 1~6, 指明该进程可以使用的 runlevel 的级别
ud 是升级进程
ca 指明当按下 Ctrl+Alt+Del 时运行的进程
pf 指当 UPS 表明断电时运行的进程
pr 是在系统真正关闭之前, UPS 发出电源恢复的信号时需要运行的进程
x 是将系统转入 X 终端时需要运行的进程
runlevel 字段指定 runlevel 的级别。可以指定多个 runlevel 级别,也可以不为 runlevel 字段指定特定的值。
action 字段定义了该进程应该运行在何种状态下:
代码 :
boot 在系统启动时运行,忽略 runlevel
bootwait 在系统启动时运行, init 等待进程完成。忽略 runlevel
ctrlaltdel 当 Ctrl+Alt+Del 三个键同时按下时运行,把 SIGINT 信号发送给 init 。忽略 runlevel
initdefault 不要执行这个进程,它用于设置默认 runlevel
kbrequest 当 init 从键盘中收到信号时运行。这里要求键盘组合符合 KeyBoardSigral( 参见 /usr/share/doc/kbd-* 关于键盘组合的文档 )
off 禁止进入,因此该进程不运行
once 每一个 runlevel 级别运行一次
ondemand 当系统指定特定的运行级别 A 、 B 、 C 时运行
powerfail 当 init 收到 SIGPWR 信号时运行
powerokwait 当收到 SIGPWD 信号且 /etc/ 文件中的电源状态包含 OK 时运行
powerwait 当收到 SIGPWD 信号,并且 init 等待进程结束时运行
respawn 不管何时终止都重新启动进程
sysinit 在运行 boot 或 bootwait 进程之前运行
wait 运行进程等待输入运行模式
process 字段包含 init 执行的进程,该进程采用的格式与在命令行下运行该进程的格式一样,因此 process 字段都以该进程的名字开头,紧跟着是运行时,紧跟着是运行时要传递给该进程的参数。比如 /sbin/shutdown -t3 -r now ,该进程在按下 Ctrl+Alt+Del 时执行,在命令行下也可以直接输入来重新启动系统。
特殊目的的记录
仔细学习例子文件,学习应用其中关于 inittab 的语法格式。该文件的大多数内容都可以忽略,因为超过一半的内容都是注释,剩余的一些文件内容主要是用来实现某些特殊的功能:
id 的值表明缺省的 runlevel 是 3 。
ud 的值可以唤醒 /sbin/update 进程,该进程为保持磁盘的完整性,将在对磁盘进行 I/O 操作之前清空整个 I/O 缓冲区。
pf 、 pr 和 ca 的值只被特定的中断所调用。
如果系统是专用的 X 终端,则只需 x 的输入值。
getty 进程来提供虚拟终端设备的服务,例如:
3:2345:respawn:/sbin/mingetty tty3
标签字段的值是 3,3 是设备 tty3 的数字后缀 ,tty3 与相应的进程相关联,该 getty 进程可以启动的 runlevel 是 2 、 3 、 4 和 5, 当该进程终止时, init 马上就重新启动它。启动进程的路径名是 /sbin/mingetty ,该进程是实现虚拟终端支持的最小版本的 getty ,为 tty3 提供启动虚拟设备的进程。
si::sysinit:/etc/rc.d/rc.sysinit
该值告诉 init 程序运行 /etc/rc.d/rc.sysinit 脚本文件来初始化系统,该脚本文件与所有启动的脚本类似,它只是一个包含 Linux 的 shell 命令的可执行文件,注意输入的字符串必须包括该脚本的完整路径。不同版本的 Linux 存放该脚本的位置也不相同,但不用刻意去记忆这些位置,只需查看 /etc/inittab 文件即可,该文件中包含启动脚本文件的确切位置。 */
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
IXDBA.NET技术社区
l4:4:wait:/etc/rc.d/rc 4
### 当运行级别为 5 时,以 5 为参数运行 /etc/rc.d/rc 脚本, init 将等待其返回 (wait)
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
### 在启动过程中允许按 CTRL-ALT-DELETE 重启系统
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
### 在 2 、 3 、 4 、 5 级别上以 ttyX 为参数执行 /sbin/mingetty 程序,打开 ttyX 终端用于用户登录,
### 如果进程退出则再次运行 mingetty 程序 (respawn)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
### 在 5 级别上运行 xdm 程序,提供 xdm 图形方式登录界面,并在退出时重新执行 (respawn)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
以上面的 inittab 文件为例,来说明一下 inittab 的格式。其中以 # 开始的行是注释行,除了注释行之外,每一行都有以下格式:
id:runlevel:action:process
对上面各项的详细解释如下:
1. id
id 是指入口标识符,它是一个字符串,对于 getty 或 mingetty 等其他 login 程序项,要求 id 与 tty 的编号相同,否则 getty 程序将不能正常工作。
2. runlevel
runlevel 是 init 所处于的运行级别的标识,一般使用 0 - 6 以及 S 或 s 。 0 、 1 、 6 运行级别被系统保留:其中 0 作为 shutdown 动作, 1 作为重启至单用户模式, 6 为重启; S 和 s 意义相同,表示单用户模式,且无需 inittab 文件,因此也不在 inittab 中出现,实际上,进入单用户模式时, init 直接在控制台( /dev/console )上运行 /sbin/sulogin 。在一般的系统实现中,都使用了 2 、 3 、 4 、 5 几个级别,在 Redhat 系统中, 2 表示无 NFS 支持的多用户模式, 3 表示完全多用户模式(也是最常用的级别), 4 保留给用户自定义, 5 表示 XDM 图形登录方式。 7 - 9 级别也是可以使用的,传统的 Unix 系统没有定义这几个级别。 runlevel 可以是并列的多个值,以匹配多个运行级别,对大多数 action 来说,仅当 runlevel 与当前运行级别匹配成功才会执行。
3. action
action 是描述其后的 process 的运行方式的。 action 可取的值包括: initdefault 、 sysinit 、 boot 、 bootwait 等:
initdefault 是一个特殊的 action 值,用于标识缺省的启动级别;当 init 由核心激活以后,它将读取 inittab 中的 initdefault 项,取得其中的 runlevel ,并作为当前的运行级别。如果没有 inittab 文件,或者其中没有 initdefault 项, init 将在控制台上请求输入 runlevel 。
sysinit 、 boot 、 bootwait 等 action 将在系统启动时无条件运行,而忽略其中的 runlevel 。
其余的 action (不含 initdefault )都与某个 runlevel 相关。各个 action 的定义在 inittab 的 man 手册中有详细的描述。
4. process
process 为具体的执行程序。程序后面可以带参数。