Skip to the content.

1. 运行级别RunLevel

大部分Unix、Linux都有类似的概念,但是有时候也略有不同,在Centos5.8中,运行级别 可以在/etc/inittab文件中有明确的说明。

[root@centos501 ~]# cat /etc/inittab
#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
...
# 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)
#
id:3:initdefault:              # 默认级别是级别3

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit      # 系统初始化 运行rc.sysinit

# 下面是进入下面7个级别分别需要运行的脚本
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
...
# 后面还有gettys相关内容

详细的内容可以参考网络上很多的说明,但是最准确的可以使用man inittab查看系统 帮助文档。

系统初始化脚本/etc/rc.d/rc.sysinit暂且不说,在运行级别中/etc/rc.d/rc这个脚本 十分关键,他的最重要的工作可以总结为:

那么,为了方便管理,可以把服务的启动和关闭都写成一个脚本,通过运行脚本来实现服务 的启动和关闭,那么这些脚本放在那里呢?找个地方,/etc/rc.d/init.d这个位置挺好的, 就放这里吧。

# 写一个简单的服务启动和停止脚本
[root@centos501 sysroot]# vim etc/rc.d/init.d/testserver
[root@centos501 sysroot]# cat etc/rc.d/init.d/testserver
#!/bin/bash

start() {
        echo -e "TestServer is Starting...\t\tOK"
}

stop() {
        echo -e "TestServer is Shuting...\t\tOK"
}


case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        *)
                echo -e $"Usage: $0 {start|stop|restart}"
esac
[root@centos501 sysroot]#
[root@centos501 init.d]# ./testserver
Usage: ./testserver {start|stop|restart}
[root@centos501 init.d]# ./testserver start
TestServer is Starting...               OK
[root@centos501 init.d]# ./testserver stop
TestServer is Shuting...                OK
[root@centos501 init.d]# ./testserver restart
TestServer is Shuting...                OK
TestServer is Starting...               OK

其实只需要针对每一个运行级别编写一个脚本,然后将需要的服务和不需要的服务都写到 这个脚本里面,直接都能实现了不同运行级别了。

但是,这样太low了,而且不方zhuang便bi。因此,我们看到centos里用了一个脚本解决了 所有的问题。

首先将每个级别创建一个文件夹如:

[root@centos501 sysroot]# tree /etc/rc.d/ -L 1
/etc/rc.d/
|-- init.d
|-- rc
|-- rc.local
|-- rc.sysinit
|-- rc0.d
|-- rc1.d
|-- rc2.d
|-- rc3.d
|-- rc4.d
|-- rc5.d
 -- rc6.d
# 在新系统中也创建这些目录

[root@centos501 sysroot]# mkdir etc/rc.d/rc{0,1,2,3,4,5,6}.d
[root@centos501 sysroot]# tree etc/rc.d/ -L 1
etc/rc.d/
|-- init.d
|-- rc
|-- rc.sysinit
|-- rc0.d
|-- rc1.d
|-- rc2.d
|-- rc3.d
|-- rc4.d
|-- rc5.d
 -- rc6.d

8 directories, 2 files

现在只需要将需要启动或者关闭的脚本拷贝到相应运行级别的目录中就行了,但是直接拷贝 的话,又太low了,可以使用软连接。

# 比如级别3需要testserver这个服务关闭
[root@centos501 rc3.d]# ln -s ../init.d/testserver testserver
[root@centos501 rc3.d]# ls -l
total 4
lrwxrwxrwx 1 root root 20 Jul  5 04:46 testserver -> ../init.d/testserver
# 但是这样不容易识别这个服务是需要关闭的还是需要开启的
# 不如在脚本名字前面加个字符,K就不错,表示kill的意思吧
[root@centos501 rc3.d]# mv testserver Ktestserver
[root@centos501 rc3.d]# ls -l
total 4
lrwxrwxrwx 1 root root 20 Jul  5 04:46 Ktestserver -> ../init.d/testserver
# 嗯,在需要关闭的服务脚本名字前面加一个S,表示stop的意思
# 好计谋
# 对了,有的服务之间相互依赖的,开启和关闭时有顺序的,咋整?
# 对,在K或者S后面再跟一个数字,就能表示顺序了。
# 太聪明了,
[root@centos501 rc3.d]# mv Ktestserver K00testserver
[root@centos501 rc3.d]# ls -l
total 4
lrwxrwxrwx 1 root root 20 Jul  5 04:46 K00testserver -> ../init.d/testserver

对了,前面说的rc脚本还没写呢,简单粗暴:

[root@centos501 rc.d]# pwd
/mylinux/sysroot/etc/rc.d
[root@centos501 rc.d]# vim rc
[root@centos501 rc.d]# cat rc
#!/bin/bash
runLevel=$1

# kill all services
for s in /etc/rc.d/rc$runLevel.d/K*;
do
        $s stop;
done

# start all services

for s in /etc/rc.d/rc$runLevel.d/S*;
do
        $s start;
done
[root@centos501 rc.d]#

还有之间的开关机,不如也做成脚本,通过rc来切换。 $0表示脚本的名字,通过判断脚本的名字来判断是需要重启还是需要关机。

[root@centos501 sysroot]# vim etc/rc.d/init.d/halt
[root@centos501 sysroot]# cat etc/rc.d/init.d/halt
#!/bin/bash

case "$0" in
        *halt)
                cmd="/sbin/halt -p"
                ;; 
        *reboot)
                cmd="/sbin/reboot"
                ;;
        *)
                cmd=""
                echo -e "halt or reboot is allowed."
                ;;
esac

case "$1" in
        start)
                exec $cmd
                ;;
        *)
                echo -e " $0 start"
                ;;
esac

将这两个脚本放置到0和6运行级别对应的目录中。

[root@centos501 sysroot]# cd etc/rc.d/rc0.d/
[root@centos501 rc0.d]# ln -s ../init.d/halt S00halt
[root@centos501 rc0.d]# cd ..
[root@centos501 rc.d]# cd rc6.d/
[root@centos501 rc6.d]# ln -s ../init.d/halt S00reboot
[root@centos501 rc6.d]# cd ..
[root@centos501 rc.d]# ll rc0.d/ rc6.d/
rc0.d/:
total 4
lrwxrwxrwx 1 root root 14 Jul  5 05:36 S00halt -> ../init.d/halt

rc6.d/:
total 4
lrwxrwxrwx 1 root root 14 Jul  5 05:36 S00reboot -> ../init.d/halt

在这之前应该先关闭其他服务,因此在0和6级别中应该添加停止其他服务的脚本。

[root@centos501 rc.d]# ll rc0.d/ rc6.d/
rc0.d/:
total 8
lrwxrwxrwx 1 root root 20 Jul  5 05:39 K01testserver -> ../init.d/testserver
lrwxrwxrwx 1 root root 14 Jul  5 05:36 S00halt -> ../init.d/halt

rc6.d/:
total 8
lrwxrwxrwx 1 root root 20 Jul  5 05:39 K01testserver -> ../init.d/testserver
lrwxrwxrwx 1 root root 14 Jul  5 05:36 S00reboot -> ../init.d/halt

2 测试一下