Username: Password:

Linux上的init及其运行级别
来源: ChinaUnix博客  作者: 发布时间:2008-04-25 03:58:19

传统的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中添加用户自己定制的内容,因为这个文档会被安装脚本覆盖掉。


喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅