Thursday, May 24, 2007

Linux系统服务学习心得——不断补完中

一直以来都对这个概念半知半解,现在越来越觉得不能再拖下去了,一定要深入了解其运行机制,以提高自己的工作效率以及让自己用系统用得更爽快~

进入/etc目录,有一个叫做rc.d的文件夹,而且,还有rc[0-6].d的文件夹。但是,rc[0-6].d是到/etc/rc.d/rc[0-6].d的符号链接。

在/etc/rc.d目录里,有这么些文件:

init.d
rc
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.local
rc.sysinit

以下分别解释一下各个文件/目录的作用:

init.d
包含一组script. 基本上, 在启动时或进入另一个运行级别时, 每个服务(service)需要一个script来进行自启动. Services包括SSHD,sendmail, HTTPD等等.


rc[0-6].d
我们首先要知道"启动级别"的概念.
可以查看到里面有类似以下的内容:


# vi /etc/inittab

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:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.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-6这几个级别,但是如果启动后直接进入停机/重启级别就没意思了吧?因此应该进入1,2,3,5这几种级别之一,功能分别如注释里面所说.我们一般选择3--多用户全功能模式,或5--在3的基础上进入X.

进入不同的启动级别会启动对应级别的服务.这就是rc[0-6].d的作用.我们执行以下命令:


# cd /etc/rc.d/rc5.d
# ls -l
lrwxrwxrwx 1 root root 15 04-30 16:26 K01smolt -> ../init.d/smolt
lrwxrwxrwx 1 root root 24 02-05 01:22 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd
lrwxrwxrwx 1 root root 16 02-05 01:22 K02dhcdbd -> ../init.d/dhcdbd
lrwxrwxrwx 1 root root 24 02-14 20:06 K02NetworkManager -> ../init.d/NetworkManager
lrwxrwxrwx 1 root root 34 02-05 01:23 K02NetworkManagerDispatcher -> ../init.d/NetworkManagerDispatcher
lrwxrwxrwx 1 root root 19 02-05 01:22 K05saslauthd -> ../init.d/saslauthd
lrwxrwxrwx 1 root root 23 03-17 23:47 K08vmware -> /etc/rc.d/init.d/vmware
lrwxrwxrwx 1 root root 13 02-05 10:09 K09vdr -> ../init.d/vdr
lrwxrwxrwx 1 root root 19 02-05 01:29 K10dc_server -> ../init.d/dc_server



可以看到,在rc5.d里面,没有真实存在的文件!只有符号链接!

所以我们可以看出

系统所有具有自启动功能的服务,都必须拥有一个用于配置启动的脚本,这些脚本放在/etc/rc.d/init.d/里;而在rc[0-6].d里,则分别指明了对应的启动级别会启动的服务,因此,可以针对不同的启动级别设定要启动的服务!


这些连接的命名规则如下:
一个字母+一个数字+启动脚本
'S'是指启动这个特定的script, 'K'是指结束它,即kill。 数字是顺序,Init将根据顺序启动所有的services. 因此我们可以用一个两位数字和一个大写的'S'或'K'来启动或结束所需要service。

Init如何启动和结束service? 很简单. 每个script都写了一个接收参数用来'start' 和'stop'. 我们可以用命令行来执行这些script, 如:


/etc/rc.d/init.d/httpd stop #结束httpd服务器.

Init只需读文件名, 如果有'K', 它就用'stop'参数调用script. 如果有'S',则用'start'参数.

rc.sysinit
这是一个脚本,在系统启动时运行一次.这关系到系统启动流程:init读取inittab获得运行级别后将执行这个脚本进行系统初始化.关于这个步骤所进行的工作有很多,推荐鸟哥文章:
開機關機流程與 Loader

rc.local
在启动时或者修改运行级别时, 当所有的其他初始化完成后, 将执行文件/etc/rc.d/rc.local. 可以在这增加新的初始程序,我们自己所编写的程序建议加在该文件中。我们可以看到在rc*.d目录下启动顺序为99的链接文件名为S99local,是一个指向rc.local的链接.这说明在改运行级别所有服务都启动后,就执行rc.local脚本.比方说,我要开机后自动执行我自己编写的一个程序,就可以在该脚本里加入启动该程序的命令.更一般的做法是,编写自己相应的模块化的脚本,每个脚本只完成一项工作,然后把运行该脚本的命令放入rc.local里,就可以更好地管理了!

rc
这是一个脚本,作用是切换运行级别时start/stop相应运行级别的服务.

关于service命令
这个命令其实实际工作是,进入/etc/rc.d/init.d目录里搜寻作为参数传递进来的服务名,然后执行之.以下代码执行效果完全一样:

# 使用service 命令启动httpd
# service httpd start
# 直接执行启动脚本启动httpd
# /etc/rc.d/init.d/httpd start

事实上,service只是一个脚本文件,可以在/sbin下找到它并查看内容.

关于chkconfig命令
我们一般不手动更改rc*.d目录下的文件及结构,而是通过系统提供的实用程序来完成:


[root@localhost rc5.d]# whatis chkconfig
chkconfig (8) - updates and queries runlevel information for system services
chkconfig (rpm) - 用来维护 /etc/rc*.d 文件层次的系统工具。



No comments: