设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> Linux专题 >> Linux应用技巧 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
Linux下WWW服务器配置全…
Linux中文环境的解决办法
Linux下的中文输入法简介
Linux的中文输出简介
Linux中文延伸安装套件概…
Linux中文输入三剑客
Linux中文化简述
Xwindow国际化环境(Xi18…
Linux中文化的简要历史
Linux中文化现状及其它
  Linux系统运行级管理         ★★★★★
Linux系统运行级管理
 

【导读】运行级的概念来自System V,运行级别将启动过程分成不同的集合,每个集合包含一 组脚本,当init程序“切换运行级”到对应的级别时,相应的脚本就被触发,切换运行 级可以通过执行init [级别号]完成。(比如,在Linux中,run level 6代表reboot,所 以执行init 6就会引起系统重新启动)
运行级的概念来自System V,运行级别将启动过程分成不同的集合,每个集合包含一

组脚本,当init程序“切换运行级”到对应的级别时,相应的脚本就被触发,切换运行

级可以通过执行init [级别号]完成。(比如,在Linux中,run level 6代表reboot,所

以执行init 6就会引起系统重新启动)



运行级别的定义每种System V都不完全一样,只能通过直接读/etc/inittab来确定,

下面是一个标准的Linux的/etc/inittab,注意这里解释的内容来自redhat,但是其他的

版本也大同小异。我们将它分成若干段来解释,如同一般情况那样,用#开始的行是注释

,而非注释行的语法是:



标号:运行级别:操作方式:命令



 标号是这一行的标签,运行级别用于定义这一行应该用于那些级别,如果为空就定义

为所有级别,操作方式可以是一些确定的字符串,代表如何执行后面的命令,而命令则

给处在进入这一级别时执行的程序。



下面是它的内容:



# Default runlevel. The runlevels used by RHS are:



# 0 - halt (Do NOT set initdefault to this)



# 1 - Single user mode



# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)



# 3 - Full multiuser mode



# 4 - unused



# 5 - X11



# 6 - reboot (Do NOT set initdefault to this)



# 



上面的几行解释了缺省的运行级别定义:



停机,系统进入这一级别后关机;



单用户模式,在这个模式中只能从控制台操作计算机,网络和终端不启动,许多文件

系统也没有连结;



多用户模式,但关闭了网络服务支持



完全的多用户模式,就是我们一般使用的模式



无定义



图形界面模式,系统切入这一运行级后自动启动X Window系统



重新启动





这些级别的定义是任意的,然而你最好不要修改它,尤其是level 0,1和6,因为许多

程序都使用init 0之类的方式实现对系统的控制,其他的Linux发行版本可能会更改2-5

的定义,你需要参考/etc/inittab才能判断到底那个级别是什么意思,不过一般来说0,

1和6总是上面的定义。



下面开始才是真正的内容,首先系统必须定义缺省的运行级别:





id:3:initdefault:





initdefault关键字决定了缺省的运行级别,在这里是3,也就是在执行了公共的系统

启动脚本之后,系统将会执行与级别3对应的那些行



# System initialization.



si::sysinit:/etc/rc.d/rc.sysinit



这里的sysinit关键字定义了公共的“系统初始化”脚本,在相应于运行级的地方是空

,表示适用于所有运行级别。注意它将在系统进入任何运行级别以前完成,一会我们再

研究这个脚本的内容。





l0:0:wait:/etc/rc.d/rc 0



l1:1:wait:/etc/rc.d/rc 1



l2:2:wait:/etc/rc.d/rc 2



l3:3:wait:/etc/rc.d/rc 3



l4:4:wait:/etc/rc.d/rc 4



l5:5:wait:/etc/rc.d/rc 5



l6:6:wait:/etc/rc.d/rc 6



这里开出了六个运行级别的定义,运行级0就去执行命令/etc/rc.d/rc 0,运行级1是

/etc/rc.d/rc 1,.....诸如此类。wait关键字表示系统必须等待此命令执行完才能开始

下一步工作。



# Things to run in every runlevel.



ud::once:/sbin/update



这又是一个适用于所有级别的命令。update命令实际是去启动updated守护进程,以便

定期刷新内存中的超级块表。Once关键字说明这个项只被执行一次。



# Trap CTRL-ALT-DELETE



ca::ctrlaltdel:/sbin/shutdown -t3 -r now



ctrlaltdel定义当热启动组合键被触发时系统的行为,这里定义所有的运行级别对它

的响应都是重新启动(shutdown –r)





pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down

"





pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled

"



这两行定义如何响应ups信息,如果系统掉电(powerfail),执行两分钟后关机的指令

;如果关机之前电源恢复,取消关机操作。





# Run gettys in standard runlevels



1:2345:respawn:/sbin/mingetty tty1



2:2345:respawn:/sbin/mingetty tty2



3:2345:respawn:/sbin/mingetty tty3



4:2345:respawn:/sbin/mingetty tty4



5:2345:respawn:/sbin/mingetty tty5



6:2345:respawn:/sbin/mingetty tty6



 2,3,4,5都是多用户级别,为系统开出6个虚拟屏幕(就是用Alt+Fn即获得虚拟屏幕)

,respawn关键字表示这个动作在每次进入相应运行级别时都会执行。



# Run xdm in runlevel 5



# xdm is now a separate service



x:5:respawn:/etc/X11/prefdm -nodaemon



对于级别5,启动图形界面。



归纳一下,系统在读入inittab以后要做什么?设置Ctrl+Alt+Del响应,设置好对UPS

的支持,然后应该执行/etc/rc.d/rc.sysinit,然后是/etc/rc.d/rc 3,最后是update

和启动虚拟屏幕。显然,系统的主要初始化命令应该在/etc/rc.d/rc.sysinit和/etc/r

c.d/rc 3中完成。



rc.d下的基本脚本





下面我们来研究启动脚本,这里的脚本来自redhat 6.1,因为这是个最为广泛使用的

版本,其他的版本的特有问题将在下一节讨论。



首先,系统将执行/etc/rc.d/rc.sysinit,这是个shell脚本,你可以用普通的文本编

辑工具对它进行处理,为了简便,我们只研究其中较为重要的部分或者较为典型的段落

:



#!/bin/sh



#



# /etc/rc.d/rc.sysinit - run once at boot time



#



# Taken in part from Miquel van Smoorenburg's bcheckrc.



#





# Rerun ourselves through initlog



if [ -z "$IN_INITLOG" ]; then



 [ -f /sbin/initlog ] && exec /sbin/initlog $INITLOG_ARGS -r /etc/rc.d/rc.

sysinit



fi



首先,确定系统中是否存在/sbin/initlog文件,如果存在,那么需要记录初始化信息

。



# Set the path



PATH=/bin:/sbin:/usr/bin:/usr/sbin



export PATH



设置缺省路径。



# Read in config data.



if [ -f /etc/sysconfig/network ]; then



. /etc/sysconfig/network



else



NETWORKING=no



HOSTNAME=localhost



fi



这一段是网络的参数设置,/etc/sysconfig/network的内容是这样:



NETWORKING=yes



FORWARD_IPV4="yes"



HOSTNAME="openlab.asnc.edu.cn"



GATEWAY=""



GATEWAYDEV=""



显然,如果这个文件存在,那么设置网络的运行参数,如域名,网关等等,这个文件

中可以包含很多的东西。详细的内容我们在设置网络的部分介绍



# Source functions



. /etc/rc.d/init.d/functions





/etc/rc.d/init.d是所有的服务脚本存放的地方,而functions是各种服务脚本需要的

一些参数的设置。有兴趣的话你可以看一看,不看也不影响什么。



以下有一段是设置一些显示信息,接下来是这样的内容:







# Mount /proc (done here so volume labels can work with fsck)





action "Mounting proc filesystem" mount -n -t proc /proc /proc





连结/proc文件系统,应该记得/proc是用来显示系统状态的虚拟文件系统,注意acti

on命令的语法,它显示一段提示信息,然后去执行相应的命令。



然后的段落有一点意思:





# Turn off sysrq



#if [ "$MAGIC_SYSRQ" = "no" ]; then



# echo "0" > /proc/sys/kernel/sysrq



#fi





$MAGIC_SYSRQ=no意味着你决定不使用内核调试,脚本必须把系统的内核调试功能关闭

,注意接下来的处理方法,在/proc/sys/kernel下建立一个名叫sysrq的文件,并且设置

其内容为"0",就关闭了这项功能,这也是在运行中打开或者关闭内核的某个功能的标准

方法,以后我们会经常看到这样的例子。



接下来要设置时钟和键盘映射表,装入系统字体,又是一段冗长的代码,这里将它省

略,反正你总可以在自己的系统上看到他们。





# Start up swapping.



action "Activating swap partitions" swapon -a





swapon –a 将读/etc/fstab文件,这个文件中包含有系统中存在的应该自动挂接的各

种文件系统的列表,同时也包含了关于交换分区的知识,swapon –a将启动其中标注的

所有交换分区。



# Set the hostname.



action "Setting hostname ${HOSTNAME}" hostname ${HOSTNAME}





# Set the NIS domain name



if [ -n "$NISDOMAIN" ]; then



action "Setting NIS domain name $NISDOMAIN" domainname $NISDOMAIN



else



domainname ""



fi



这两段设置系统名字,我们应该记得$HOSTNAME已经在/etc/sysconfig/network文件中

设置过,所以这里的action被执行,而$NISDOMAIN现在是空字符串,所以执行后hostna

me被设置而NIS域名不存在。



if [ -f /fsckoptions ]; then



 fsckoptions=`cat /fsckoptions`



else



 fsckoptions=



fi





if [ -f /forcefsck ]; then



 fsckoptions="-f $fsckoptions"



fi



这里是与管理员相关的行了。如果系统的/下将存在/forcefsck文件,于是系统自动启

动fsck程序去检查文件系统是否有错误。接下来是一段关于是否存在/fastboot文件的判

断,与其大同小异,然后系统将会决定是否启用PNP,方法和处理MAGIC_SYSRQ是类似的

,这两段我们不讨论了,你可以自己看一下。





# Remount the root filesystem read-write.



action "Remounting root filesystem in read-write mode" mount -n -o remount

,rw /





# Add /proc to /etc/mtab



mount -f -t proc /proc /proc



检测根文件系统完毕后,系统重新将/连结成读写方式,并且将/proc加入到/etc/mta

b中。下面是非常重要的一步,如果系统内核支持可装载模块,需要把$USEMODULES变量

设置成"y"并且设置模块的缺省路径,参数等等,然后,系统开始装入模块:





# load sound modules



if [ -n "$USEMODULES" ]; then



 if grep -s -q "^alias sound " /etc/conf.modules ; then



action "Loading sound module" modprobe sound



 fi



 .........



fi



...........



当这些直接装入的模块结束后,为了和以前的方式兼容,也为了管理员的方便,这个

脚本试图去寻找/etc/rc.d/rc.modules,如果存在就执行它:



# Load modules (for backward compatibility with VARs)



if [ -f /etc/rc.d/rc.modules ]; then



 /etc/rc.d/rc.modules



fi



显然,你可以将自己的模块初始化命令加入/etc/rc.d/rc.modules使它在启动时得到

运行。



完成主要模块的装入后,系统将开始一系列日常工作,如检测有问题的文件系统,连

结所有本地文件系统,启动磁盘限额等等,如果系统还没有被配置,那么将启动配置脚

本,设置网络,超级用户口令等等,否则,对于已经配置好的系统,清理记账文件,准

备进行系统工作。



当一切都完成之后,系统按照inittab的设定,进入运行级3,执行/etc/rc.d/rc 3。



/etc/rc.d/rc是一个很有意思的程序,它是一个shell脚本,其行为是这样:根据提供

给它的参数,它去寻找相应的目录rc${arg1}.d,例如,在/etc/rc.d/rc 3执行时,它去

查询/etc/rc.d/rc3.d下的所有文件,试图执行那些所有用S或K打头的脚本,凡是用S开

头的脚本,它给加上一个start参数,凡是用K打头的脚本,加上一个stop参数。执行次

序是按照S或K后跟的数值顺序。



例如,在现在的例子中,/etc/rc.d/rc 3下存在一个S50inet的脚本,于是 rc 脚本去

执行S50inet start。而S50inet其实是到/etc/rc.d/init.d/inet的一个符号连结,其内

容是(这里只给出了部分内容):



. /etc/rc.d/init.d/functions



. /etc/sysconfig/network



if [ ${NETWORKING} = "no" ]



then



 exit 0



fi





[ -f /usr/sbin/inetd ] || exit 0



RETVAL=0





# See how we were called.



case "$1" in



start)



 echo -n "Starting INET services: "



 daemon inetd



 RETVAL=$?





 echo



 [ $RETVAL -eq 0 ] && touch /var/lock/subsys/inet



 ;;



stop)



 echo -n "Stopping INET services: "



 killproc inetd



 RETVAL=$?





 echo



 [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/inet



 ;;



*)



 echo "Usage: inet {start|stop|status|restart|reload}"



 exit 1



esac





exit $REVAL







daemon和killproc是在/etc/rc.d/init.d/functions里面定义的函数,daemon将命令

当成守护进程执行,killproc则杀掉对应进程。显然,S50inet start的结果是inetd程

序被启动为一个守护进程。



这里的方法是启动服务进程的标准模式,例如你要设置某个服务在runlevel 3被启动

,那么你可以自己写一个脚本,比如说mydaemon,让mydaemon start启动服务,mydaem

on stop停止服务,然后将这个脚本复制到/etc/rc.d/init.d中,接着在/etc/rc.d/rc?

.d中建立连接,在rc3.d中连结为S65mydaemon,而在其他目录中为K65mydaemon,这样你

的脚本就会在进入和退出运行级3时自动处理了。



除此与run level相关的启动指令之外,Linux还从BSD中引入了另外一些配置文件,其

中最重要的是/etc/rc.d/rc.local,通常它在执行了全部运行级脚本以后运行,你可以

在这里定制自己的设置,如欢迎信息等等。 





版本之间的区别



如同我们看到的那样,Redhat的启动脚本看上去井井有条,要寻找某个功能很容易,

但是要寻找某个命令在何处启动就显得比较困难,经常需要从/etc/inittab开始。



Turbo Linux和Red-Flag的脚本和Redhat颇为相似,尤其是红旗几乎就是RedHat的中文

版,它们的配置也相当近似。



Slackware的启动脚本使用另外一种风格,实际上,看上去很象BSD系列。启动脚本也

在/etc/rc.d下面,但是它把一些在大部分运行级别必须使用的脚本做在了一起,冠以r

c.modules,rc.inet1,rc.inet2等等的名字,这样对于手工配置系统确实简单的多,不

过这些文件都相当大,看起来需要耐心。对于这个系统,你只要看一遍/etc/inittab就

能掌握它的配置文件位置了。



Debian/Corel使用一种有趣的方式,看上去颇像Sun的Solaris。实际上,它和RedHat

的方式几乎是一样的,但是启动脚本不是在/etc/rc.d,而是直接位于/etc下,例如/et

c/rc1.d,/etc/rc2.d等等,知道了这一点之后,配置debian就不会感到困难了。



关于Corel Linux我们应该特别地说一句,它的配置文件组织看起来要比RedHat简单一

些,但是它没有类似于rc.modules的设定,等价于rc.sysinit的文件是/etc/init.d/rc

S。它的运行级别定义也比较怪异,好像Run Level 2是正常的图形模式,要配置Corel,

最好是从/etc/inittab直接开始。无论如何,我们不会建议一个新手使用corel Linux。

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2006-10-10
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:admin    责任编辑:admin 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持