走进Linux_daemon为服务(service)保驾护航

引:我们进程会听到daemon,但是却不知道其义,其实就是一个守护进程,作用是支持其他服务(service)的运行。我们下面可以好好看看linux中的daemon与service!

什么是daemon与服务

系统为了某些功能必须要提供一些服务,这个服务就称为service。但是service的提供总是需要进程的运行,所以实现这个service的程序我们就称它为daemon

daemon的分类

分类方式一:按照“是否可以独立启动”分类

  1. stand alone类型的daemon:这种类型的daemon可以自行启动,启动之后可以常驻内存,直到手动关闭该daemon才释放资源。如www。
  2. 由super daemon管理的daemon:这种类型的daemon由super daemon统一管理,当请求到来时,由super daemon启动请求的服务,请求完成后便释放内存资源。如telnet。

分类方式二:按照“请求到来时是否能够立即运行”分类

  1. signal-control类型的daemon
    这种类型的daemon当有请求到来时便能立即执行。如打印机服务。

  2. interval-control类型的daemon
    这种类型的daemon会周期性地执行某项工作,因此它没有请求一说,它会周期性地读取配置文件,并执行配置文件中要求的功能。如crond、atd都属于interval-control类型的daemon。

通常在服务的名称的之后都会加一个d。

网络服务与端口的对应

当系统提供了网络服务,就会涉及到端口的问题,这些服务与端口的定义文件在/etc/services。大家可以自己查看一下。如下:

1
2
tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer

第一列为daemon的名称,第二列为该daemon所使用的端口号与网络数据包协议。

daemon的启动脚本与启动方式

stand-alone类型的daemon和super daemon类型的daemon有各自的启动方式

stand alone型Daemon的启动方式

  1. 通过/etc/init.d/xxx启动。启动一个服务是一个繁琐的过程,你需要进行一系列启动前的操作,为了避免这些麻烦,服务提供商把这些繁琐的过程封装在一个shell srcipt中,我们只需执行一个shell script即可启动一个daemon。几乎所有的stand alone型daemon的启动脚本都放在/etc/init.d/下,所以我们只需执行 /etc/init.d/xxx start 即可启动xxx服务。

  2. 通过service命令启动。若每次启动一个命令都要写/etc/init.d/略微有些麻烦,service命令将其进行了封装,我们只要执行 “service xxx start/status/restart/stop” 即可开启/查看/重启/关闭xxx服务。

super daemon型Daemon的启动方式

  1. 设置daemon的配置文件,每一个被super daemon管理的daemon都有一个配置文件,在/etc/xinetd.d/目录下。每个daemon的开启或关闭均在该daemon对应的配置文件中设置。

  2. 启动super daemon,super daemon是一个stand alone型daemon,因此在daemon的配置文件设置好后可通过service xinetd start启动所有由super daemon管理的daemon。

解析super daemon的配置文件

默认值配置文件:xinetd.conf

高版本的contos可能没有该文件,是因为没有安装,所以要先用“yum install xinetd”安装之后,就可以看见了。

super daemon的默认配置文件为:/etc/xinetd.conf,它为它所管理的所有daemon做了一些默认的配置。
从最后一行的includedir /etc/xinetd.d可以看出,它加载了它所管理的所有daemon的配置。

下面来看一下具体的某个daemon的配置:

1
2
3
4
5
6
7
8
9
10
service rsync #service后为daemon的名字
{
disable = yes # yes表示关闭此daemon,no表示开启此daemon
socket_type = stream #stream表示使用TCP、dgram表示使用UDP、raw表示直接与IP交互
wait = no
user = root #以什么用户的身份启动这个daemon
server = /usr/bin/rsync #这个daemon的启动程序
server_args = --daemon #启动时所需的参数
log_on_failure += USERID # 登录失败时需要记录用户
}

  • =:表示将某个参数设为等号右侧的值,若先前设置中已设置过该参数,则直接覆盖
  • +=:表示保留先前设置的这个参数,再给这个参数增加个值。
  • -和-=的含义同上。

super deamon的防火墙管理

由于受super daemon管理的daemon的请求都首先需要经过super daemon,因此super daemon可以充当防火墙的角色,拒绝一些不安全的请求。
super daemon提供了两种防火墙机制,第一种方式提供较多详细的安全设置,而第二种方式只能阻挡或允许指定的IP,具体见下:

  1. 使用受super daemon管理的daemon的配置文件实现防火墙机制

    在某个具体的daemon配置文件中添加如下参数,即可为daemon配置防火墙:

    • instance=数字/UNLIMITED:设置该daemon能够承受的最大连接数。`
    • per_source=数字/UNLIMITED:每个IP的最大连接数。
    • Cps=数字1 数字2:该daemon在一秒内的连接数超过数字1,则暂时关闭该da* emon数字2的秒数。
    • log_on_success/failure=PID/HOST/USERID/EXIT/DURATION:当登录成功/* 失败时记录的信息。HOST:连接者的IP、EXIT:离开时间、DURATION:为该用户服务的时间。
    • redirect=IP:将用户的请求转至指定服务器。
    • bind=IP:允许用户用哪个IP访问本服务。
      only_from=[0.0.0.0,192.168.1.0:24]:只允许指定IP的用户访问。0.0.0.0表示允许所有用户,192.168.1.0:24表示只允许192.168.1.1-192.168.1.255之间的用户访问。
      access_time=00:00-12:00:只允许该时间段内访问。
  2. 使用xinetd提供的/etc/hosts.allow和/etc/hosts.deny实现防火墙机制

    • /etc/hosts.allow :我们可以在该文件中设置允许访问的IP

    • /etc/hosts.deny :我们可以在该文件中设置不允许访问的IP

系统开启的服务

查看系统启动的服务

一般情况下,我们会比较关心网络监听的服务,所以都会使用netstat命令(之前也提到过),这里再次说明几个范例:

1
2
3
4
5
6
7
8
// 1. 找出目前系统开启的网络服务
netstat -tulp

// 2. 找出所有有监听网络的服务
netstat -lnp

// 3. 查看所有的服务状态
service --status-all

设置Daemon开启启动

在设置Daemon开机启动之前,最好先了解一下Linux主机是怎么开机的?

  1. 打开计算机电源,开始读取BIOS并进行主机的自我测试
  2. 通过BIOS取得第一个可开机设备,读取主要开机区(MBR)取得启动装载程序
  3. 通过启动装载程序的设置,取得kernel并加载内存且检测系统硬件
  4. 内核主动调用init进程
  5. init进程开始执行系统初始化(/etc/rc.d/rec.sysinit)
  6. 依据init的设置进行daemonstart(/etc/rc.d/rc[0-6].d/*)
  7. 加载本机设置

在启动Linux系统时,可以进入不同的模式,这模式我们称为执行等级(run level),不同执行等级有不同的功能与服务。图型界面为run level5,纯文本界面为run level3。当我们想要知道哪些服务默认可以启动,这就需要下面的命令来查询:

  1. chkconfig:管理系统服务默认开机启动与否,范例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 1. 列出目前系统上面所有被chkconfig管理的服务
    chkconfig --list | more // 分为两个块,分别为两种启动方式的daemon

    // 2. 显示目前在run level 3 启动的服务
    chkconfig --list | grep '2:on'

    // 3. 让atd这个服务在run level 3,4,5时启动
    chkconfig --level 345 atd on

    // 4. 查看httpd,再查看默认有无启动,之后以chkconfig设置为默认启动
    /etc/init.d/httpd status // 查看本身
    chkconfig --list httpd // 查看是否默认启动
    chconfig httpd on; //设置为开机启动
    1. chkconfig:设置自己的系统服务
      1
      chkconfig [--add|--del] [服务名称] // 该服务必须在/etc/init.d/内

RHEL7的sytemctl(代替service和chkconfig)

centos7版本中使用了systemd,systemd同时兼容service,对应的命令就是systemctl 。systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。可以使用它永久性或只在当前会话中启用/禁用服务。

systemd把不同的资源称为Unit
每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit
存放目录:/etc/systemd/system和/usr/lib/systemd/system。

使用范例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 1. 以树形列出正在运行的进程,它可以递归显示控制组内容
systemd-cgls

// 2. 启动一个服务
systemctl start firewalld.service

// 3. 关闭一个服务
systemctl stop firewalld.service

// 4. 重启一个服务
systemctl restart firewalld.service

// 5. 显示一个服务的状态
systemctl status firewalld.service

// 6. 在开机时启动一个服务
systemctl enable firewalld.service

// 7. 在开机时禁用一个服务
systemctl disable firewalld.service

// 8. 查看服务是否开机启动
systemctl is-enabled firewalld.service

// 9. 查看已启动的服务列表
systemctl list-unit-files | grep enabled

// 10. 查看启动失败的服务列表
systemctl --failed

PS:
1. 使用命令 systemctl is-enabled firewalld.service 得到的值可以是enable、disable或static,
这里的 static 它是指对应的 Unit 文件中没有定义[Install]区域,因此无法配置为开机启动服务。
2. 启用服务就是在当前“runlevel”的配置文件目录/etc/systemd/system/multi-user.target.wants/里,建立/usr/lib/systemd/system里面对应服务配置文件的软链接;
禁用服务就是删除此软链接,添加服务就是添加软连接。

参考

  1. 《鸟哥的Linux私房菜》
  2. RHEL7的sytemctl(代替service和chkconfig)