一天一点学习Linux之系统服务管理

来源:岁月联盟 编辑:exp 时间:2011-10-25

 

daemon介绍

大家可能常听到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

摘自 羽飞博客