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