大家可能常听到daemon,而什么是daemon可能不太清楚,我的理解是让服务启动的东东称为daemon。而服务(service)就是为我 们提供服务(如web mail ftp等)的东东。所以说,我们是通过daemon来管理service的。而很多时候我们也把daemon说成service,其实这样也差不多了。

daemon 的分类

根据daemon的启动与管理方式来分,可以将daemon为可独立启动的daemon,和通过super daemon来统一管理的服务这两大类,下面来简单的介绍一下他们两个的区别:
独立启动的服务:这种类型的 daemon 可以独立启动而无需通过其他机制来管理,此类daemon启动并加载到内存后就一直占用内存与系统资源。最大的优点就是:因为是一直存在内存内,所以当有客户请求时,他的响应速度较快。
super daemon:这种服务的启动是由一个普通的daemon来统一管理(在RHEL/CentOS的系统中是xinetd)一些服务。这种管理方式的特点 是:原本各项服务都是未启动的,当有客户来请求时,此时super daemon 才唤醒相对应的服务,当客户端的请求结束后,被唤醒的这个服务也会关闭并释放系统资源。所以说由super daemon管理的服务响应是比较慢的。

服务与端口

这个端口我相应大家都很清楚,可以用个比喻来说明一下IP与端口的作用。我们可以把IP当作互联网上的地址,而端口就是楼层号,不同的楼层就提供不同的服务了,哈哈……
想查看服务对应的端口,可以参考/etc/services。这里只能参考,因为我们可以改变服务的端口号。
daemon启动脚本的相关目录与文件
/etc/init.d/ 此目录是放启动脚本的位置。在RHEL/CentOS上实际上是放在/etc/rc.d/init.d/,为什么呢?其实查看一下目录就知道了。/etc/init.d其实是/etc/rc.d/init.d的链接目录。
[root@yufei ~]# ls -ld /etc/init.d
lrwxrwxrwx. 1 root root 11 May 31 17:43 /etc/init.d -> rc.d/init.d
/etc/sysconfig/ 各服务的初始化环境配置文件。几乎所有的服务都会将初始化的一些选项设定写到这个目录下。
/etc/xinetd.conf, /etc/xinetd.d/ :super daemon 配置文件的目录。super daemon 的主要配置文件为 /etc/xinetd.conf ,super daemon所管理的其他 daemon 的设定则在 /etc/xinetd.d/ 里。
/etc/ :各服务的配置文件的目录,一般是以.conf结尾。
/var/run/ :各服务的程序的 PID 存放的地方。

服务的启动与停止或加载


我们先来看普通的daemon启动方式
用RPM或YUM安装的服务软件,服务的脚本基本上全部放在/etc/init.d/这个目录下,这里面的脚本一般都可以用VI打开来观察。脚本的内容大致有:脚本的描述、环境调用、搜寻配置文件、加载functions、服务的启动停止与加载、最后还会有脚本的参数。
这里面的脚本可以用脚本的相对路径或绝对路径来执行,当然RHEL/CentOS上还提供了一个命令service来直接调用这里面的脚本。
我们以SSHD为例来看一下
[root@yufei ~]# /etc/init.d/sshd --help
Usage: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}
这个提示很清楚,结合脚本文件你就会看明白,参数执行了哪些东西,这就留给大家自己研究吧。
[root@yufei ~]# cd /etc/init.d/
[root@yufei init.d]# ./sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
用相对路径启动也是一样的,当然还可以在任何目录下用service来直接执行某个服务,至于为什么他会调用/etc/init.d/里面的脚本,大家看一下/sbin/service这个文件就知道了。
[root@yufei init.d]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

再来看看Super daemon 的启动方式

其实Super daemon 本身也是普通的daemon,只是要通过他来管理一些不常用的服务而已。所以说,xinetd他的启动方式与普通的daemon是一样的,而由他管理的服 务都在/etc/xinetd.d/目录下,这里面的服务开启与关闭,都是由此目录下的服务文件本身来控制的。大家可以打开来看看,每个文件里面都有 disable = yes或disable = no这样的内容,如果是YES,那就是不启动了,如果是NO,就是启动了。

下面我们以telnet为例来给大家演示
[root@yufei ~]# cd /etc/xinetd.d/
[root@yufei xinetd.d]# yum install telnet-server
[root@yufei xinetd.d]# ls -l |grep telnet
-rw-r--r--. 1 root root  305 Sep  9  2004 telnet
[root@yufei xinetd.d]# grep disable telnet
	disable		= yes
我们来启动看看   
[root@yufei xinetd.d]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
[root@yufei xinetd.d]# telnet localhost
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused	
发现telnet连不上
   
我们把disable        = yes换成no
[root@yufei xinetd.d]# vim telnet
[root@yufei xinetd.d]# grep disable telnet
	disable		= no 
重新启动xinetd
[root@yufei xinetd.d]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
[root@yufei xinetd.d]# telnet localhost
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Red Hat Enterprise Linux Server release 6.1 (Santiago)
Kernel 2.6.32-131.0.15.el6.x86_64 on an x86_64
login: 
发现这时候的反应有点慢,过一会,就出现了login:的登陆信息了。在RHEL6.1上就算是用户名和密码正确,好像也无法正常登陆,应该是系统为了安全方面考虑,可能是禁止了什么,这个有兴趣的,自己研究吧。
这只是演示了一下关于由xinetd管理的服务启动的方法,我想大家应该很清楚了。当然,telnet是明文的,也是不安全的,所以我们把他卸载掉。
[root@yufei xinetd.d]# yum remove telnet-server -y
[root@yufei xinetd.d]# rm -fr telnet.rpmsave 
下面来分析一下/etc/xinetd.conf这个文件
这个文件中包含日志的记录方式与记录的内容设置、连接设置、网络设置和环境参数设置以及其他服务设置

我们主要来看连接限制设置
cps             = 50 10
instances       = 50
per_source      = 10
第一行表示:同一秒内的最大联机数为 50 个,若超过则暂停 10 秒
第二行表示:同一服务的最大同时联机数
第三行表示:同一客户端的最大联机数
这个文件中的参数是一个全局的设置,你也可以对其管理的服务来进行其他更多我设置。他管理的服务就是/etc/xinetd.d/这个目录里面的,你可以打开某个服务看一下里面的参数设置,这里也不一一说明,主要讲一下,关于网络方面的设置。

only_from:只有这里设置的IP或者是主机名才可以使用某个服务。这个设置后面可以是某个网段如192.168.1.0/24,也可以是某个域如. opsers.org。如果说有多个不同的设置,就可以用+=来设置其他的内容。
no_access:和上面的一样,只是用来限制某些主机不能使用某个服务。
access_times:设置服务开放的时间。他的设置方式是[00:00-12:00],就是从某个时段到某个时段。如果有多个时间段,中间用空格空开就可以,如:01:00-9:00 20:00-23:59

tcp_wrappers

其实,任何以 xinetd 管理的服务,都可以通过 /etc/hosts.allow, /etc/hosts.deny 来限定访问权限,可以叫做防火墙(tcp_wrappers)。这种管理机制更方便用来集中管理。那么这两个文件是不是对系统中所有的服务都起作用呢?其 实不是这样的,只有加载了libwrap.so函数的服务才能被 /etc/hosts.allow, /etc/hosts.deny 所能控制。下面我们就来看看
[root@yufei ~]# ldd $(which sshd) |grep libwrap.so
	libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f61d35bf000)
[root@yufei ~]# ldd $(which httpd) |grep libwrap.so
[root@yufei ~]# 
我们发现, SSH是支持 libwrap.so的,所以他可以通过/etc/hosts.allow, /etc/hosts.deny 这两个文件来控制权限了。
关于文件的格式使用可以通过man 5 hosts_options 和 man 5 hosts_access来查看。
基本格式如下

服务:IP 或领域 或主机名:动作
第一及第二个字段一些特殊参数:

ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务
KNOWN:代表为可解析的 IP, domain 等等信息
特别要注意:

服务是启动该服务的程序,一般情况下,服务名在脚本中能看到。
一般情况下,我们把

1、允许进入的写在 /etc/hosts.allow 当中
2、阻止进入的则写在 /etc/hosts.deny 当中
而这两个文件判断的依据是ALLOW优先

下面我们来介绍一下服务的观察

一个命令是ps,这个命令一般是用来查询系统中所有的进程

一个命令是netstat,他是用来显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。我们主要来介绍netstat (network statistics) 的用法
[root@yufei ~]# netstat –help
使用上面的命令会显示netstat的格式及相关参数,下面就介绍一下主要的参数意义。
-r, –route                显示路由表(和route命令一样,都可以加上后面的-n参数)
-i, –interfaces         显示网络接口的连接情况(eth0、lo)
-s, –statistics          显示IP、ICMP、IcmpMsg、TCP、UDP、UdpLite、TcpExt、IpExt的统计信息
-n, –numeric           以数字形式显示地址和端口号
-p, –programs        显示PID/Program name
-l, –listening            显示监听端口
-a, –all, –listening  显示所有连接和监听端口
-t, –tcp                     显示TCP传输协议的连线状况
-u, –udp                   显示UDP传输协议的连线状况
–e本选项用于显示关于以太网的统计数据。它列出的项目包括传送的数据报的总字节数、错误数、删除数、数据报的数量和广播的数量。这些统计数据既有发送的数据报数量,也有接收的数据报数量。这个选项可以用来统计一些基本的网络流量)。
从整体上看,netstat的输出结果可以分为两个部分,一个是Active Internet connections,称为活动的网络连接。列出下面的一些信息

Proto:显示连接使用的协议
Recv-Q:本地未收到的字节数 
Send-Q:远程主机未收到的字节数
Local Address:本地的地址与端口           
Foreign Address:远程的地址与端口          
State:连接的状态情况
另一个是Active UNIX domain sockets,称为活动的Unix域套接口。列出下面的一些信息

Proto:显示连接使用的协议
RefCnt:表示连接到本套接口上的进程号
Types:显示套接口的类型
State:显示套接口当前的状态
Path:表示连接到套接口的其它进程使用的路径名 
netstat与网络有密切关系,所以如果想更清楚的了解上面列出来的信息,最好是有点网络基础。当然,如果你没有也没有关系,下面我列举几个我们常用的命令组合,让大家来使用。
netstat -tl         查看当前tcp监听端口

netstat -ul        查看当前udp监听端口
netstat -tlp      查看当前tcp监听端口, 同时显示监听的程序名
netstat -tlpn    以数字方式显示上面的内容
netstat -tulpna    查看出正在连接的网络信息
以上这些信息基本上够用了,如果想了解更多的netstat相关用法,请用man来帮助。

服务的管理

上面讲了这么多,我相信大家对服务有了一个更深入的了解了,那么下面我们就来看看服务是如何来管理的。

要想管理好服务,就需要掌握chkconfig此命令的使用。先来看看这个命令的使用吧。
chkconfig –list [name]   
列出系统中(/etc/init.d/目录下)的服务(/etc/init.d/)状态。[name]加上则是查看某个服务的状态,不加就是查看系统中全部的服务状态
chkconfig –add <name>
把某个服务增加到/etc/init.d/目录下
chkconfig –del <name>
删除/etc/init.d/目录下的某个服务
chkconfig [--level <levels>] <name> <on|off>
设置某级别的某个服务的状态
上面的命令比较简单,但要注意几点:

1、要想管理某个服务,那么此服务必需要在/etc/init.d/目录下,才能够用chkconfig来管理,否则会出现“error reading information on service network: No such file or directory”这要的错误。
2、这个文件要有执行权限
3、/etc/init.d/目录下的服务文件都有一些共同点,那就是有一行类似# chkconfig: 2345 10 90这样的内容,就和第一行#! /bin/bash一样,是必需的,而不是我们平时所说的注释。三栏表示的意思是:不同的运行级别、启动顺序、关闭顺序。也就是说在/etc/rc.d /rcN.d/(N为2、3、4、5)下会有S10开头的对应文件和/etc/rc.d/rcN.d/(N为0、1、6)下以K90开头的对应文件。这个 我们可以查看前面有关运行级别的相关信息。
最后说明一点,如果你的系统中没有xinetd的话,请安装些软件
[root@yufei ~]# yum install xinetd
[root@yufei ~]# chkconfig --list
省略
xinetd based services:
	chargen-dgram: 	off
	chargen-stream:	off
	daytime-dgram: 	off
	daytime-stream:	off
	discard-dgram: 	off
	discard-stream:	off
	echo-dgram:    	off
	echo-stream:   	off
	tcpmux-server: 	off
	time-dgram:    	off
	time-stream:   	off