运行级的概念来自SystemV运行级别将启动过程分成不同的集合每个集合包含一

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

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

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

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

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

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

    而非注释行的语法是

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

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

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

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

    下面是它的内容

    #DefaultrunlevelTherunlevelsusedbyRHSare:

    #halt(DoNOTsetinitdefaulttothis)

    #Singleusermode

    #MultiuserwithoutNFS(Thesameasifyoudonothavenetworking)

    #Fullmultiusermode

    #unused

    #X

    #reboot(DoNOTsetinitdefaulttothis)

    #

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

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

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

    系统也没有连结

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

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

    无定义

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

    重新启动

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

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

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

    和6总是上面的定义

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

    id::initdefault:

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

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

    #Systeminitialization

    si::sysinit:/etc/rcd/rcsysinit

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

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

    研究这个脚本的内容

    l::wait:/etc/rcd/rc

    l::wait:/etc/rcd/rc

    l::wait:/etc/rcd/rc

    l::wait:/etc/rcd/rc

    l::wait:/etc/rcd/rc

    l::wait:/etc/rcd/rc

    l::wait:/etc/rcd/rc

    这里开出了六个运行级别的定义运行级就去执行命令/etc/rcd/rc运行级是

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

    下一步工作

    #Thingstorunineveryrunlevel

    ud::once:/sbin/update

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

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

    #TrapCTRLALTDELETE

    ca::ctrlaltdel:/sbin/shutdowntrnow

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

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

    pf::powerfail:/sbin/shutdownfh+"PowerFailure;SystemShuttingDown

    "

    pr::powerokwait:/sbin/shutdownc"PowerRestored;ShutdownCancelled

    "

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

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

    #Rungettysinstandardrunlevels

    ::respawn:/sbin/mingettytty

    ::respawn:/sbin/mingettytty

    ::respawn:/sbin/mingettytty

    ::respawn:/sbin/mingettytty

    ::respawn:/sbin/mingettytty

    ::respawn:/sbin/mingettytty

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

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

    #Runxdminrunlevel

    #xdmisnowaseparateservice

    x::respawn:/etc/X/prefdmnodaemon

    对于级别启动图形界面

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

    的支持然后应该执行/etc/rcd/rcsysinit然后是/etc/rcd/rc最后是update

    和启动虚拟屏幕显然系统的主要初始化命令应该在/etc/rcd/rcsysinit和/etc/r

    cd/rc中完成

    rcd下的基本脚本

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

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

    首先系统将执行/etc/rcd/rcsysinit这是个shell脚本你可以用普通的文本编

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

    

    #!/bin/sh

    #

    #/etc/rcd/rcsysinitrunonceatboottime

    #

    #TakeninpartfromMiquelvanSmoorenburg&#;sbcheckrc

    #

    #Rerunourselvesthroughinitlog

    if[z"$IN_INITLOG"];then

    [f/sbin/initlog]&&exec/sbin/initlog$INITLOG_ARGSr/etc/rcd/rc

    sysinit

    fi

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

    

    #Setthepath

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

    exportPATH

    设置缺省路径

    #Readinconfigdata

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

    /etc/sysconfig/network

    else

    NETWORKING=no

    HOSTNAME=localhost

    fi

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

    NETWORKING=yes

    FORWARD_IPV="yes"

    HOSTNAME="openlabasnceducn"

    GATEWAY=""

    GATEWAYDEV=""

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

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

    #Sourcefunctions

    /etc/rcd/initd/functions

    /etc/rcd/initd是所有的服务脚本存放的地方而functions是各种服务脚本需要的

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

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

    #Mount/proc(doneheresovolumelabelscanworkwithfsck)

    action"Mountingprocfilesystem"mountntproc/proc/proc

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

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

    然后的段落有一点意思

    #Turnoffsysrq

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

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

    #fi

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

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

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

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

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

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

    #Startupswapping

    action"Activatingswappartitions"swapona

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

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

    所有交换分区

    #Setthehostname

    action"Settinghostname${HOSTNAME}"hostname${HOSTNAME}

    #SettheNISdomainname

    if[n"$NISDOMAIN"];then

    action"SettingNISdomainname$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是类似的

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

    #Remounttherootfilesystemreadwrite

    action"Remountingrootfilesysteminreadwritemode"mountnoremount

    rw/

    #Add/procto/etc/mtab

    mountftproc/proc/proc

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

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

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

    #loadsoundmodules

    if[n"$USEMODULES"];then

    ifgrepsq"^aliassound"/etc/confmodules;then

    action"Loadingsoundmodule"modprobesound

    fi

    

    fi

    

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

    脚本试图去寻找/etc/rcd/rcmodules如果存在就执行它

    #Loadmodules(forbackwardcompatibilitywithVARs)

    if[f/etc/rcd/rcmodules];then

    /etc/rcd/rcmodules

    fi

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

    运行

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

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

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

    备进行系统工作

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

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

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

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

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

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

    例如在现在的例子中/etc/rcd/rc下存在一个Sinet的脚本于是rc脚本去

    执行Sinetstart而Sinet其实是到/etc/rcd/initd/inet的一个符号连结其内

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

    /etc/rcd/initd/functions

    /etc/sysconfig/network

    if[${NETWORKING}="no"]

    then

    exit

    fi

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

    RETVAL=

    #Seehowwewerecalled

    case"$"in

    start)

    echon"StartingINETservices:"

    daemoninetd

    RETVAL=$?

    echo

    [$RETVALeq]&&touch/var/lock/subsys/inet

    ;;

    stop)

    echon"StoppingINETservices:"

    killprocinetd

    RETVAL=$?

    echo

    [$RETVALeq]&&rmf/var/lock/subsys/inet

    ;;

    *)

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

    exit

    esac

    exit$REVAL

    daemon和killproc是在/etc/rcd/initd/functions里面定义的函数daemon将命令

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

    序被启动为一个守护进程

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

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

    onstop停止服务然后将这个脚本复制到/etc/rcd/initd中接着在/etc/rcd/rc?

    d中建立连接在rcd中连结为Smydaemon而在其他目录中为Kmydaemon这样你

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

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

    中最重要的是/etc/rcd/rclocal通常它在执行了全部运行级脚本以后运行你可以

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

    版本之间的区别

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

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

    TurboLinux和RedFlag的脚本和Redhat颇为相似尤其是红旗几乎就是RedHat的中文

    版它们的配置也相当近似

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

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

    cmodulesrcinetrcinet等等的名字这样对于手工配置系统确实简单的多不

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

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

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

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

    c/rcd/etc/rcd等等知道了这一点之后配置debian就不会感到困难了