INIT(8)

NAME
init, telinit - 进程处理初始化

总览
/sbin/init [ -a ] [ -s ] [ -b ] [ -z xxx ] [ 0123456Ss ]
/sbin/telinit [ -t 秒 ] [ 0123456sSQqabcUu ]

描述

  Init
Init 是所有进程的父进程。它的首要任务是从一个存储在文件 /etc/inittab （参阅 inittab(5)） 里面的脚本里创建进程。 这个文件通常有一些令 init 在每条用户可登录的线上派生 getty 的记录． 它同时也控制着各独特系统所要求的独立进程。

运行级别
所谓 运行级别 是一种系统软件环境配置， 在此特定的环境中只允许某一组选定的进程存在。 init 给不同的运行级别派生的进程在 /etc/inittab 文件中定义。 Init 可以启动到8个不同的运行级别上： 0–6 和 S 或 s。运行级别可以由超级用户通过 telinit 命令来转换，此命令可以将转换信号传递给 init， 告诉它切换到哪个运行级别。

运行级别 0，1，和 6 为系统保留的专用运行级别。 运行级别 0 用来关机，运行级别 6 用来重启计算机， 运行级别 1 用来使计算机进入单用户模式。 运行级别 S 不是给我们直接使用的， 更多是为进入运行级别 1 时运行某些可执行脚本时被调用。 如果想得到更多相关的信息，请参阅手册页 shutdown(8) 和 inittab(5)。

运行级别 7-9 虽然在文档中说明，但也可以使用。 不使用它们的原因只是因为"传统" Unix 变种不使用这些运行级别。 另外，运行级别 S 和运行级别 s 实际上是相同的， 它们只是系统内同一运行级别的两个不同的别名而己。

系统引导

当系统内核引导到最后一步时， init 进程被启动， 它会自动查找 /etc/inittab 文件，看看是否有类型为 initdefault （参阅 inittab(5)）的记录． initdefault 记录决定系统初始运行级别。 如果没有这条记录（或者根本就没有 /etc/inittab ）， 那么，你必须在系统控制台输入想要进入的运行级别。

运行级别 S 或 s 把系统带入单用户模式， 此模式不需要 /etc/initttab 文件。单用户模式中， /sbin/sulogin 会在 /dev/console 这个设备上打开。

当进入单用户模式后， init 会从文件 /etc/ioctl.save 中读取控制台的 ioctl(2) 状态。如果该文件不存在， init 则把线路设定为 9600 baud 并且带有 CLOCAL。 当 init 退出单用户模式时， 它会自当前的控制台的 ioctl 设置存储到这个文件供下次使用。

当第一次进入多用户模式时，init 会执行boot 和 bootwait 记录以便在用户可以登录之前挂载文件系统。 然后再执行相应运指定的各进程。

当启动一个新的进程时， init 会检查是否存在 /etc/initscript 文件。 如果存在该文件，则使用该脚本来启动该进程。

如果系统中存在文件 /var/run/utmp 和 /var/log/wtmp， 那么当每个子进程终止时，init 会将终止信息和原因记录进这两个文件中。

改变运行级别

当 init 启动了所有指定的子进程后， 它会不断地侦测系统进程情况，如：它的某个子进程被终止、电源失效、或由 telinit 发出的改变运行级别的信号。当它接受到以上的这些信号之一时， 它会自动重新扫描 /etc/inittab 文件，并执行相应操作。 所以，新的记录可以随时加入到此文件中。 并且， init 仍然等待系统发出了上述信号。 在更新了各种系统文件后，如果你希望得到即时的更新， 你可以使用telinit Q 或 q 命令来唤醒 init 让它即刻重新检测/etc/inittab 文件。

如果 init 不是在单用户模式并且接收到了一个电源失效信号（SIGPWR）， 它会读取文件 /etc/powerstatus，并执行该文件中指定的各种操作：

F(AIL)
    电源失效，由 UPS 提供电力。执行 powerwait 和 powerfail 记录。

O(K)
    电源恢复，执行 powerokwait 记录。

L(OW)
    电源失效并且 UPS 电压也太低。执行 powerfailnow 记录。

如果文件 /etc/powrestatus 不存在或其中的内容并不包含有以上所示的字母 F，O 或 L ，则 init 会当做读到了字母 F。

我们不赞成使用 SIGPWR 和 /etc/powerstatus 。 有些用户希望与 init 进行交互，那么可以使用 /dev/initctl 控制通道。关于此点的描述请参阅 sysvinit 包的源代码。

当 init 得到更新运行级别的请求， init会向所有没有在新运行级别中定义的进程发送一个警告信号 SIGTERM 。 在等待 5 秒钟之后，它会发出强制中断所有进程的运行的信号 SIGKILL 。 注意， init 假设所有的这些进程（包括它们的后代）都仍然在 init 最初创建它们的同一进程组里。 如果有任何进程改变了它们的进程组，那么它就收不到这些信号。 这样的进程，你需要分别进行手工的终止。

TELINIT
/sbin/telinit 是一个到 /sbin/init 的软链接。 它用一个单字符参数来通知 init 执行相应的操作。 下面是相关的参数：

0,1,2,3,4,5 或 6
    通知 init 将运行级别切换到指定的运行级别

a,b,c
    告诉 init 只运行那些 /etc/inittab 文件中 运行级别是 a，b 或 c 的记录

Q 或 q
    通知 init 重新检测 /etc/inittab 文件

S 或 s
    通知 init 将运行级别切换到单用户模式下

U 或 u
    通知 init 自动重启（保留状态）， 此操作不会对文件/etc/inittab 进行重新检测。 执行此操作时，运行级别必须处在 Ss12345 之一，否则，该请求将被忽略

telinit 还可以告诉 init 两次发送 SIGTERM 和 SIGKILL 信号的时间间隔。 默认值是 5 秒，你可以通过使用 -t sec 的选项来修改。

telinit 只能由具有恰当权限的用户执行。

init 通过检查自己的 进程号 来判断自己是 init 还是 telinit ；真的 init 的进程号永远都是 1。 从这一点来看，我们在调用 telinit 时也可以只使用 init 来少敲几个键．

环境变量

Init 为所有的子进程设定下列环境变量

PATH
    /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin

INIT_VERSION
    如名字表示的那样．在决定一个脚本是否直接来自 init 时很有用

RUNLEVEL
    当前系统的运行级别

PREVLEVEL
    前次运行的运行级别（仅当改变运行级别时有用）

CONSOLE
    系统控制台。此变量是由内核继承而来，如果没有此环境变量的定义， init 会使用 /dev/console 做为默认的控制台

启动标志
在启动系统时可以通过引导管理器（比如，LILO）传递一些启动标志给 init ， Init 接受下面几个：

-s， S， single
    以单用户模式启动系统。按这种模式启动时， /etc/inittab 需要被检查， 并在单用户模式 shell 启动之前会执行引导 rc 脚本。

1-5 定义需要启动的运行级别

-b, emergency
    不运行任何启动脚本而直接进入单用户模式 shell

-a, auto
    如果用缺省命令行从内核引导（没有用户干预）， LILO 引导管理器向命令行增加了单词 如果是这样的话， init 把环境变量 请注意你不能将这个东西用于任何安全评测 - 用户当然可以在命令行上 手工输入

-z xxx
    -z 参数被忽略．你可以用这个选项略微扩展命令行， 这样它可以在堆栈里获得更多空间．然后 Init 就可以操作命令行， 好让 ps(1) 显示当前运行级别．

接口
init监听 /dev 里的一个 fifo ，/dev/initctl，从中获取信息。 Telinit 也使用这些和 init 进行通信。 该界面没有完整的文档。 如果对 init 有兴趣，则可以学习 src/ 目录中 init 源文件包中的 initreq.h 文件。

信号
init 对以下信号产生响应

SIGHUP
    当接收到该信号后，init会对 /etc/initrunlvl 和 /var/log/inirunlvl 文件进行检查。如果这两个文件之一存在而且文件中有 ASCII 字符的运行级别， init 会转换到相应的新的运行级别。 此特性只用于向后兼容! ． 通常的情况是该文件并不存在，所以 init 执行类似于 telinit q 这样的操作。

SIGUSR1
    当接收到这个信号量，init 会关闭并重新打开它的控制 fifo，/dev/initctl。 此操作对 /dev 被重新挂载后的启动脚本有用。

SIGINT
    通常，当用户按了 CTRL-ALT-DEL 键后，内核会向 init 传递此信号。 它所执行的操作与 ctrlaltdel 相同。

SIGWINCH
    当键盘有 KeyboardSignal 按键按下时，内核向 init 传递此信号， 它激活 kbrequest 动作．

遵循
Init 与 System V 的 init 相兼容。 它与/etc/init.d 和 /etc/rc{runlevel}.d 目录下的脚本紧密地工作在一起。 如果你的系统使用这种惯例，在 /etc/init.d 目录下应该有一个 README 文件，它可以很好地解释了这些脚本是如何工作的。

相关文件
/etc/inittab
/etc/initscript
/dev/console
/etc/ioctl.save
/var/run/utmp
/var/log/wtmp
/dev/initctl

警告
Init 假设进程和进程的后代同属于最初创建它们的进程组． 如果进程改变了它们的进程组， init 就无法中止它们，因此，你可能会有两个进程读取一条终端线．

诊断
如果 init 发现它的重启次数在最近 2 分钟里超过了 10 次， 它就会认为程序命令串出错了。在系统控制台输出出错信息，并拒绝重新启动， 只有等到 5 分钟以后或用户给 init 一个特定的信号， 它才会重新响应。 这可以防止由于用户在编辑 /etc/inittab 文件时可能出现的输入错误 或由于相关程序被无意删除后导致的大量占用系统资源。

作者
Miquel van Smoorenburg (miquels@cistron.nl) 原始帮助手册页作者：Michael Haardt (u31b3hs@pool.informatik.rwthaachen.de).

另见
getty(1), login(1), sh(1), who(1), shutdown(8), kill(1), inittab(5), initscript(5), utmp(5)

[中文版维护人]
所罗门 <solomen@email.com.cn>

[中文版最新更新]
2000/11/26

[中国 Linux 论坛 man 手册页翻译计划]
http://cmpp.linuxforum.net