14.认识系统服务(daemons)

时间:2022-08-24 16:06:27

一、什么是 daemon 与服务 (service)

系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运行吧!否则如何运行呢?所以达成这个 service 的程序我们就称呼他为 daemon。

1.daemon 的主要分类

(1)stand_alone:此 daemon 可以自行单独启动服务

     stand alone 的 daemon 响应速度较快

(2)super daemon: 一支特殊的 daemon 来统一管理

    优点:

(1) 由于 super daemon 负责唤醒各项服务,因此 super daemon 可以具有安全控管的机制,就是类似网络防火墙的功能啦!

(2)由于服务在客户端的联机结束后就关闭,因此不会一直占用系统资源。

缺点 :

因为有客户端的联机才会唤醒该服务,而该服务加载到内存的时间需要考虑进去,因此服务的反应时间会比较慢一些

 

2.窗口类型的解说

(1)个别窗口负责单一服务的 stand alone:

(2 )统一窗口负责各种业务的  super daemon

multi-threaded (多重线程):

single-threaded (单个线程):

3. daemon 工作形态的类型

(1)signal-control

(2)interval-control

4. daemon 的启动脚本与启动方式

(1)daemon 的启动脚本 (shell script):

   /etc/init.d/*  :启动脚本放置处

/etc/sysconfig/* :各服务的初始化环境配置文件

/etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件

/etc/* :各服务各自的配置文件

/var/lib/* :各服务产生的数据库

/var/run/* :各服务的程序之 PID 记录处

 

(2)Stand alone 的 /etc/init.d/* 启动

[root@www ~]# /etc/init.d/syslog
用法 : /etc/init.d/syslog {start|stop|status|restart|condrestart}

# 什么参数都不加的时候,系统会告诉你可以用的参数有哪些,如上所示。

 

[root@www ~]# service [service name] (start|stop|restart|...)
[root@www ~]# service --status-all
选项与参数:
service name :亦即是需要启动的服务名称,需与  /etc/init.d/  对应;
start|...    :亦即是该服务要进行的工作。

--status-all:将系统所有的 stand alone 的服务状态通通列出来

 

3. Super daemon 的启动方式

[root@www ~]# grep -i 'disable' /etc/xinetd.d/*

 

二、解析 super daemon 的配置文件

1、默认值配置文件:xinetd.conf

(1)为什么 /etc/xinetd.conf 可以称为默认值的配置文件呢?

因为如果你有启动某个 super daemon 管理的服务, 但是该服务的配置值并没有指定上述的那些项目,那么该服务的配置值就以上述的默认值为主


(2)includedir /etc/xinetd.d <== 更多的配置值在  /etc/xinetd.d  那个目录内
service  <service_name>
{
       <attribute>   <assign_op>   <value>   <value> ...
       .............

}

 

attribute (功能)

说明与范例

一般配置项目:服务的识别、启动与程序

disable
(启动与否)

· 配置值:[yes|no],默认 disable = yes

disable 为取消的意思,此值可配置该服务是否要启动。默认所有的 super daemon 管理的服务都不启动的。 若要启动就得要配置为『 disable = no 』

id
(服务识别)

· 配置值:[服务的名称]

虽然服务在配置文件开头『 service 服务名称』已经指定了,不过有时后会有重复的配置值,此时可以用 id 来取代服务名称。 你可以参考一下 /etc/xinetd.d/time-stream 来思考一下原理。

server
(程序文件名)

· 配置值:[program 的完整檔名]

这个就是指出这个服务的启动程序!例如 /usr/bin/rsync 为启动 rsync 服务的命令,所以这个配置值就会成为: 『 server = /usr/bin/rsync 』

server_args
(程序参数)

· 配置值:[程序相关的参数]

这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 rsync 需要加入 --daemon , 所以这里就配置:『 server_args = --daemon 』。与上面 server 搭配,最终启动服务的方式『/usr/bin/rsync --daemon』

user
(服务所属UID)

· 配置值:[使用者账号]

如果 xinetd 是以 root 的身份启动来管理的,那么这个项目可以配置为其他用户。此时这个 daemon 将会以此配置值指定的身份来启动该服务的程序喔!举例来说,你启动 rsync 时会以这个配置值作为该程序的 UID。

group

跟 user 的意思相同!此项目填入组名即可。

一般配置项目:联机方式与联机封包协议

socket_type
(封包类型)

· 配置值:[stream|dgram|raw],与封包有关

stream 为联机机制较为可靠的 TCP 封包,若为 UDP 封包则使用 dgram 机制。raw 代表 server 需要与 IP 直接对谈!举例来说 rsync 使用 TCP ,故配置为『socket_type = stream 』

protocol
(封包类型)

· 配置值:[tcp|udp],通常使用 socket_type 取代此配置

使用的网络协议,需参考 /etc/protocols 内的通讯协议,一般使用 tcp 或 udp。由于与 socket_type 重复, 因此这个项目可以不指定。

wait
(联机机制)

· 配置值:[yes(single)|no(multi)],默认 wait = no

这就是我们刚刚提到的 Multi-threaded 与 single-threaded !一般来说,我们希望大家的要求都可以同时被激活,所以可以配置『 wait = no 』 此外,一般 udp 配置为 yes 而 tcp 配置为 no。

instances
(最大联机数)

· 配置值:[数字或 UNLIMITED]

这个服务可接受的最大联机数量。如果你只想要开放 30 个人联机 rsync 时,可在配置文件内加入:『 instances = 30 』

per_source
(单一用户来源)

· 配置值:[一个数字或 UNLIMITED]

如果想要控制每个来源 IP 仅能有一个最大的同时联机数,就指定这个项目吧!例如同一个 IP 最多只能连 10 条联机『 per_source = 10 』

cps
(新联机限制)

· 配置值:[两个数字]

为了避免短时间内大量的联机要求导致系统出现忙碌的状态而有这个 cps 的配置值。第一个数字为一秒内能够接受的最多新联机要求, 第二个数字则为,若超过第一个数字那暂时关闭该服务的秒数。

一般配置项目:登录文件的记录

log_type
(登录档类型)

· 配置值:[登录项目 等级]

当数据记录时,以什么登录项目记载?且需要记载的等级为何(默认为 info 等级)。这两个配置值得要看过下一章登录档后才会知道哩!这边你先有印象即可。

log_on_success
log_on_failure
(登录状态)

· 配置值:[PID,HOST,USERID,EXIT,DURATION]

在『成功登陆』或『失败登陆』之后,需要记录的项目:PID 为纪录该 server 启动时候的 process ID , HOST 为远程主机的 IP、USERID 为登陆者的账号、EXIT 为离开的时候记录的项目、DURATION 为该用户使用此服务多久?

进阶配置项目:环境、网络端口口与联机机制等

env
(额外变量配置)

· 配置值:[变量名称=变量内容]

这一个项目可以让你配置环境变量,环境变量的配置守则可以参考第十一章

port
(非正规埠号)

· 配置值:[一组数字(小于 65534)]

这里可以配置不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与 /etc/services 内记载的相同才行!不过,若服务名称是你自定义的,那么这个 port 就可以随你指定

redirect
(服务转址)

· 配置值:[IP port]

将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦! 例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address 就代表另一部远程主机的 IP 啰!

includedir
(呼叫外部配置)

· 配置值:[目录名称]

表示将某个目录底下的所有文件都给他塞进来 xinetd.conf 这个配置里头!这东西有用多了, 如此一来我们可以一个一个配置不同的项目!而不需要将所有的服务都写在 xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个配置呦!

安全控管项目:

bind
(服务接口锁定)

· 配置值:[IP]

这个是配置『允许使用此一服务的适配卡』的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰

interface

· 配置值:[IP]

与 bind 相同

only_from
(防火墙机制)

· 配置值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

这东西用在安全机制上面,也就是管制『只有这里面规定的 IP 或者是主机名可以登陆!』如果是 0.0.0.0 表示所有的 PC 皆可登陆,如果是 192.168.1.0/24 则表示为 C class 的网域!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登陆!另外,也可以选择 domain name ,例如 .dic.ksu.edu.tw 就可以允许昆山资传系网域的 IP 登陆你的主机使用该 server !

no_access
(防火墙机制)

· 配置值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

跟 only_from 差不多啦!就是用来管理可否进入你的 Linux 主机激活你的 server 服务的管理项目! no_access 表示『不可登陆』的 PC 啰!

access_times
(时间控管)

· 配置值:[00:00-12:00, HH:MM-HH:MM]

这个项目在配置『该服务 server 启动的时间』,使用的是 24 小时的配置!例如你的 ftp 要在 8 点到 16 点开放的话,就是: 08:00-16:00。

umask

· 配置值:[000, 777, 022]

还记得在第七章提到的 umask 这个东西吗?呵呵!没错! 就是那个鬼玩意儿啰!可以配置用户创建目录或者是文件时候的属性!系统建议值是 022 。


三、服务的防火墙管理 xinetd, TCP Wrappers

1、/etc/hosts.allow, /etc/hosts.deny 管理

(1)任何以 xinetd 管理的服务,都可以透过 /etc/hosts.allow, /etc/hosts.deny 来配置防火墙。

(2)使用 TCP Wrappers 来控管:

来源 IP 或/与 整个网域的 IP 网段;

port (就是服务啦,前面有谈到启动某个端口是 daemon 的责任)

 

2. TCP Wrappers 特殊功能

(1)要确定有没有安装 TCP Wrappers 可以使用『 rpm -q tcp_wrappers 』来查询:

spawn (action)

可以利用后续接的 shell 来进行额外的工作,且具有变量功能,主要的变量内容为: %h (hostname), %a (address), %d (daemon)等等;

twist (action)

立刻以后续的命令进行,且运行完后终止该次联机的要求 (DENY)

 

四、系统开启的服务

1、查看系统启动的服务:

(1)找出目前系统开启的『网络服务』有哪些?

[root@www ~]# netstat -tulp

(2)找出所有的有监听网络的服务 (包含 socket 状态):

[root@www ~]# netstat -lnp

(3)观察所有的服务状态

[root@www ~]# service --status-all

 

2.设置启动后立即启动服务的方法

1) Linux 主机是怎么启动的:

打开计算机电源,开始读取 BIOS 并进行主机的自我测试;

透过 BIOS 取得第一个可启动装置,读取主要启动区 (MBR) 取得启动管理程序;

透过启动管理程序的配置,取得 kernel 并加载内存且侦测系统硬件;

核心主动呼叫 init 程序;

init 程序开始运行系统初始化 (/etc/rc.d/rc.sysinit)

依据 init 的配置进行 daemon start (/etc/rc.d/rc[0-6].d/*)

加载本机配置 (/etc/rc.d/rc.local)

 

(2)chkconfig: 管理系统服务默认启动启动与否

[root@www ~]# chkconfig --list [服务名称]

[root@www ~]# chkconfig [--level [0123456]] [服务名称] [on|off]

选项与参数:

--list :仅将目前的各项服务状态栏出来

--level:配置某个服务在该 level 下启动 (on) 或关闭 (off)

 

(3)ntsysv: 类图形接口管理模式

[root@www ~]# ntsysv [--level <levels>]
选项与参数:
--level  :后面可以接不同的  run level  ,例如  ntsysv --level 35