免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1143 | 回复: 0
打印 上一主题 下一主题

Linux上的init及其运行级别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-17 23:33 |只看该作者 |倒序浏览
传统的init定义了7个“运行级”,每一个级别都代表系统应该运行的某些特定服务的补充:
l         0级是完全关闭系统的级别
l         1级或S级代表单用户模式
l         2到5级是多用户级别
l         6级是重新引导级别
0级和6级是特殊的,因为系统实际上不能够停留在这两个级别里,进入这两个级别的效果是关闭系统或者重新引导系统。在大多数系统上,正常的多用户运行级别是2或3级。经常将运行级5用于X Windows登录进程,比如xdm。运行级4很少使用,运行级1和S的定义在每种系统上是不同的。
单用户模式是传统的init级别1。它关闭所有的多用户和远程登录进程,并确保系统运行在最小的软件组合的模式下。不过,由于单用户模式提供对系统的超级用户访问权限,因此只要引导系统进入到单用户模式,管理员都要求系统提示用户输入root的口令。创建S运行级是为了满足下面的需要:它生成一个进程提示输入root的口令。在Linux上,这一级别只是用来提示输入root的口令,而它本身并不是最终的目的。
/etc/inittab文件告诉init在它的每个运行级上要做什么事情。它的格式随系统的不同而异,但基本思想是:inittab定义了系统进入到每一级别时要运行(或者要保持运行)的命令。
在机器引导时,init从运行级0开始,一级一级往上运行到在/etc/inittab中所设置的默认运行级别。为了完成在每一对相邻运行级别之间的过渡,init运行在/etc/inittab中为这种过渡而说明的一些操作。当机器关闭时,以相反的顺序执行同样的处理过程。
遗憾的是,inittab文件的语义有点儿不那么完善,为了把inittab文件的内容映射成为某种更为灵活的东西,Linux系统实现了另一层抽象,它通常采用“改变运行级”脚本的形式(通常为/etc/init.d/rc),由inittab来调用。这一脚本接下来执行位于与运行级有关的目录下的其它脚本,从而把系统带入到新的状态。
通常,系统管理员没有必要直接处理/etc/inittab,因为几乎对于任何应用程序来说,基于脚本的接口就足够了。启动脚本的主拷贝位于叫做/etc/init.d的目录中。每个脚本负责一个守护进程或者系统的某个特定方面。这些脚本能够识别参数start和stop,从而知道它们所处理的服务是应该进行初始化还是应该停止。大多数脚本还识别参数restart,通常该参数等同于在stop后面再接start。作为系统管理员,要启动和停止各个服务,只要手工运行与之有关的init.d脚本就可以了。
下面是一个简单的启动脚本,它可以启动、停止或重新启动sshd:

#! /bin/sh
test –f /usr/local/sbin/sshd || exit 0
case “$1” in
       start)
              echo –n “Starting sshd: sshd”
              /usr/local/sbin/sshd
              echo “.”
              ;;
       stop)
              echo –n “Stopping sshd: sshd”
              kill `cat /var/run/sshd.pid`
              echo “.”
              ;;
       restart)
              echo –n “Stopping sshd: sshd”
              kill `cat /var/run/sshd.pid`
              echo “.”
              echo –n “Starting sshd: sshd”
              /usr/local/sbin/sshd
              echo “.”
              ;;
       *)
              echo “Usage: /etc/init.d/sshd start|stop|restart”
              exit 1
              ;;
esac

尽管/etc/init.d中的脚本能够启动和停止各个服务,但是由init运行的主控制脚本需要知道其它一些信息,这些信息说明了要进入任何指定的运行级别而运行哪些脚本(并带有什么参数)。当主脚本把系统引入到一个新的运行级别时,它不是直接在init.d目录中查找,而是查找叫做rclevel.d的目录,这里的level就是要进入的级别编号(例如,rc0.d、rc1.d等)。
在典型的情况下,这些rclevel.d目录包含的符号链接到了init.d目录中的脚本上。这些符号链接的名称都是以S或K开头,后跟一个数字以及该脚本所控制的服务名(例如,S34named)。当init从低的运行级别向高的运行级别过渡时,它按照数字递增地运行所有以S开头的、带有start参数的脚本。当init从高的运行级别向低的运行级别过渡时,它按照数字递减地运行所有以K(表示kill,杀死的意思)开头的、带有stop参数的脚本。根据不同的系统,init可能只查看适合于新运行级的rclevel.d目录,或者可能也查看旧运行级的rclevel.d目录以找到两者的不同之处。
要告诉系统什么时候启动一个守护进程,我们需要在适当的目录下创建符号链接。大多数系统似乎是在运行级2期间启动其大部分的连网守护进程的。例如,要告诉系统在运行级2期间启动sshd并在系统关闭以前友好地停止这个守护进程,那么可以创建下面这一对链接:

#ln –s /etc/init.d/sshd /etc/rc2.d/S99sshd
#ln –s /etc/init.d/sshd /etc/rc0.d/K25sshd

第一行命令告诉系统:当进入运行级2时,把运行/etc/init.d/sshd启动脚本作为最后要做的事情之一,并且带start参数去运行这个脚本。第二行告诉系统:当关闭系统时,要较晚运行/etc/init.d/sshd,并且带stop系数来运行这个脚本。有些系统以不同方式处理系统关闭(shutdown)和重新引导(reboot),所以我们需要在/etc/rc6.d目录中也放一个符号链接,以确保当系统重新引导时,该守护进程能够被正确关闭。
在Red Hat Linux系统的每个运行级上,init都以新的运行级作为参数来调用脚本/etc/rc.d/rc。/etc/rc.d/rc一般运行在“正常”模式下,在这种模式下它只做它自己的事情;但它也可以运行在“确认”模式下,在这种模式下,它在运行每个单独的启动脚本以前询问用户。使用chkconfig命令管理运行级上当中的链接。
Red Hat Linux系统还有一个rc.local脚本,BSD系统上秆到的非常类似。rc.local是作为启动过程一部分而运行的最后一个脚本。最好避免向rc.local中添加用户自己定制的内容,因为这个文件会被安装脚本覆盖掉。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23381/showart_233813.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP