linux runlevel 运行级别 init inittab telinit 详解(转载)



1、什么是init

init是Linux系统操做中不可缺乏的程序之一。 是一个由内核启动的用户级进程。

内核启动(已经被载入内存,开始运行,并已初始化全部的设备驱动程序和数据结构等)以后,就经过启动一个用户级程序init的方式来启动其余用户级的进程或服务。因此,init始终是第一个进程(其PID始终为1)。

内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来讲)是/sbin/init。若是内核找不到init,它就会试着运行/bin/sh,若是运行失败,系统的启动也会失败。


2、运行级别

运行级就是操做系统当前正在运行的功能级别。这个级别从1到6,具备不一样的功能。其功能级别以下:

# 0 - 停机(千万不能把initdefault 设置为0 )

# 1 - 单用户模式

# 2 - 多用户,没有 NFS

# 3 - 彻底多用户模式(标准的运行级)

# 4 - 没有用到

# 5 - X11 (xwindow)

# 6 - 从新启动 (千万不要把initdefault 设置为6——把被你黑掉的linux的initdefault设置为0或6也算是拒绝服务***噢!)

除此以外还有ABC三个运行级别,但在RHLinux中都没有意义。


这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最早运行的服务是放在/etc/rc.d
目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令链接到
/etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)


3、运行级别的配置

运行级别的配置是在/etc/inittab行内进行的,以下所示:

12 : 2 : wait : / etc / init.d / rc 2

  各字段解释以下:

id:runlevels:action:process

id:是一个任意指定的四个字符之内的序列标号,在本文件内必须惟一;使用老版本的libc5(低于5.2.18)或a.out库编译出来的
sysvinit限制为2字符。注意:像getty之类的登录进程必须使id字段与tty编号一致,如tty1须要id=1,许多老版本的登录进程都遵循
这种规则。

runlevels:表示这一行适用于运行那个/些级别(这里是2,能够有多个,表示在相应的运行级均须要运行);另外sysinit、boot、bootwait这三个进程会忽略这个设置值。

action:表示进入对应的runlevels时,init应该运行process字段的命令的方式,经常使用的字段值及解释在附录内。例子中的wait表示须要运行这个进程一次并等待其结束。

process:具体应该执行的命令。例子中的/etc/init.d/rc命令启动运行级别2中应该运行的进程/命令,并负责在退出运行级时将其终止(固然在进入的runlevel中仍要运行的程序除外。)

当运行级别改变,而且正在运行的程序并无在新的运行级别中指定须要运行,那么init会先发送一个SIGTERM 信号终止,而后是SIGKILL。

  有效的action值以下:

respawn:表示init应该监视这个进程,即便其结束后也应该被从新启动。

wait: init应该运行这个进程一次,并等待其结束后再进行下一步操做。

once: init须要运行这个进程一次。

boot: 随系统启动运行,因此runlevel值对其无效。

bootwait:随系统启动运行,而且init应该等待其结束。

off: 没有任何意义。

initdefault:系统启动后的默认运行级别;因为进入相应的运行级别会激活对应级别的进程,因此对其指定process字段没有任何意义。若是inittab文件内不存在这一条记录,系统启动时在控制台上询问进入的运行级。

sysinit: 系统启动时准备运行的命令。好比说,这个命令将清除/tmp。能够查看/etc/rc.d/rc.sysinit脚本了解其运行了那些操做。

powerwait:容许init在电源被切断时,关闭系统。固然前提是有U P S和监视U P S并通知init电源已被切断的软件。RH linux默认没有列出该选项。

powerfail: 同powerwait,但init不会等待正在运行的进程结束。RH linux默认没有列出该选项。

powerokwait:当电源监视软件报告“电源恢复”时,init要执行的操做。

powerfailnow:检测到ups电源即将耗尽时,init要执行的操做,和powerwait/powerfail不一样的哟。

ctrlaltdel:容许init在用户于控制台键盘上按下C t r l + A l t + D e
l组合键时,从新启动系统。注意,若是该系统放在一个公共场所,系统管理员可将Ctrl + Alt + Del组合键配置为别的行为,好比忽略等。我是设置成打印一句骂人的话了^o^。

kbrequest:监视到特定的键盘组合键被按下时采起的动做,如今还不完善。

ondemand:A process marked with an ondemand runlevel will be
executed whenever the specified ondemand runlevel is called. However,
no runlevel change will occur (ondemand runlevels are ‘a’, ‘b’,and
‘c’),(英语太菜,那个however不知道该怎么翻译才好。惭愧!)


补充:

一、关于进入单用户模式,通常都是采用设置initdefault为1或者在grub/lilo中指定一个“single”或“emergency” 命令行参数来实现。
{
Linux用grub或lilo找回root密码方法:

GRUB:在引导装载程序菜单上,键入 [e] 来进入编辑模式。
你会面对一个引导项目列表。查找其中相似如下输出 的句行:
kernel /vmlinuz-2.4.18-0.4 ro root=/dev/hda2(这里不同)
按箭头键直到这一行被突出显示,而后按 [e]。
你如今可在文本结尾处空一格再添加 single 来告诉 GRUB 引导单用户 Linux 模式。按 [Enter] 键来使编辑结果生效。
你会被带会编辑模式屏幕,从这里,按 [b], GRUB 就会引导单用户 Linux 模式。 结束载入后,你会面对一个与如下类似的 shell 提示:
sh-2.05#
如今,你即可以改变根命令,键入:
bash# passwd root
你会被要求从新键入口令来校验。结束后, 口令就会被改变,你即可以在提示下键入 reboot 来从新引导;而后,象日常同样登陆为根用户。

LILo:当系统启动到出现LILO引导画面时,对于图形引导方式按TAB键进入文本方式,而后在LILO处
输入linux single回车便可进入免密码的控制台,进入之后使用passwd命令修改root的密码
便可


}

其实另外还有一个更干净的方法,编辑:
kernel /vmlinuz-2.6.9-22.EL ro root=/bin/sh,这样init就直接启动一个shell,其余任何进程都没有启动哦,够干净吧!

二、 你能够本身制定启动时所进入的runlevel,若是你的系统使用的是lilo,在启动命令中将相应的部分为:
LILO: linux 5
若是你使用的是GRUB,在启动时你能够按住e键进入设置模式,相应的位置显示为:
kernel /vmlinuz ro root=/dev/hda1 5


三、系统正在运行时,telinit(或init)命令可更改运行级别。
切换运行模式使用telinit命令(root用户):
$ /sbin/telinit
通 常,切换运行模式的目的是重启某些应用进程,好比XFree86,将运行模式从5切换到3将终止XFree86以及与之相关的全部进程,而后再把运行模式 切换到5,XFree86就能够很干净的启动。在作这些工做以前,请确保全部在XFree86下的工做都已经保存,用root用户:
$ /sbin/telinit 3
$ /sbin/telinit 5
在键入命令以后,你的屏幕可能会显示一些服务启动或者中止的信息。


补充2:在单用户模式下引导

    一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,并且尽量少地运行系统服务,其中包含登陆。单用户模 式对少数管理任务(好比在/usr分区上运行fsck)而言,是颇有必要的,由于这须要卸载分区,但这是不可能的,除非全部的服务系统已被杀死。

   一个正在运行的系统能够进入单用户模式,具体作法是利用init,请求运行级别1。内核启动时,在内核命令行指定single或emergency关键 字,就可进入运行级别1了。内核同时也为init指定命令行, init从关键字得知本身不该该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。
  有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区以前,或至少在装入分散的/usr分区以前,能手工运行fsck(在分散的文件系统上,任何活动均可能使其更为分散,因此应该尽量地运行fsck)。
   若是自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样作是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,并且一般会致使硬盘的不连贯或实验性的内核释放,但最好能作到防患于未然。
   因为安全上的考虑,在单用户模式下,启动外壳脚本以前,配置得当的系统会要求用户提供root密码。不然,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登陆(固然,若是/etc/passwd已经因为文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种状况,你最好随时准备一张启动 盘)。

  不一样的运行级有不一样的用处,也应该根据本身的不一样情形来设置。
  例如,若是丢失了root口令,那么可让机器启动进入单用户状态。在启动后的 lilo 提示符下输入:
  init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过全部系统认证,让你可使用passwd 程序来改变root口令,而后启动到一个新的运行级。