引:我们进程会听到daemon,但是却不知道其义,其实就是一个守护进程,作用是支持其他服务(service)的运行。我们下面可以好好看看linux中的daemon与service!
什么是daemon与服务
系统为了某些功能必须要提供一些服务,这个服务就称为service。但是service的提供总是需要进程的运行,所以实现这个service的程序我们就称它为daemon。
daemon的分类
分类方式一:按照“是否可以独立启动”分类
- stand alone类型的daemon:这种类型的daemon可以自行启动,启动之后可以常驻内存,直到手动关闭该daemon才释放资源。如www。
- 由super daemon管理的daemon:这种类型的daemon由super daemon统一管理,当请求到来时,由super daemon启动请求的服务,请求完成后便释放内存资源。如telnet。
分类方式二:按照“请求到来时是否能够立即运行”分类
signal-control类型的daemon
这种类型的daemon当有请求到来时便能立即执行。如打印机服务。interval-control类型的daemon
这种类型的daemon会周期性地执行某项工作,因此它没有请求一说,它会周期性地读取配置文件,并执行配置文件中要求的功能。如crond、atd都属于interval-control类型的daemon。
通常在服务的名称的之后都会加一个d。
网络服务与端口的对应
当系统提供了网络服务,就会涉及到端口的问题,这些服务与端口的定义文件在/etc/services。大家可以自己查看一下。如下:1
2tcpmux 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的启动方式
通过/etc/init.d/xxx启动。启动一个服务是一个繁琐的过程,你需要进行一系列启动前的操作,为了避免这些麻烦,服务提供商把这些繁琐的过程封装在一个shell srcipt中,我们只需执行一个shell script即可启动一个daemon。几乎所有的stand alone型daemon的启动脚本都放在/etc/init.d/下,所以我们只需执行 /etc/init.d/xxx start 即可启动xxx服务。
通过service命令启动。若每次启动一个命令都要写/etc/init.d/略微有些麻烦,service命令将其进行了封装,我们只要执行 “service xxx start/status/restart/stop” 即可开启/查看/重启/关闭xxx服务。
super daemon型Daemon的启动方式
设置daemon的配置文件,每一个被super daemon管理的daemon都有一个配置文件,在/etc/xinetd.d/目录下。每个daemon的开启或关闭均在该daemon对应的配置文件中设置。
启动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
10service 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,具体见下:
使用受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:只允许该时间段内访问。
使用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主机是怎么开机的?
- 打开计算机电源,开始读取BIOS并进行主机的自我测试
- 通过BIOS取得第一个可开机设备,读取主要开机区(MBR)取得启动装载程序
- 通过启动装载程序的设置,取得kernel并加载内存且检测系统硬件
- 内核主动调用init进程
- init进程开始执行系统初始化(/etc/rc.d/rec.sysinit)
- 依据init的设置进行daemonstart(/etc/rc.d/rc[0-6].d/*)
- 加载本机设置
在启动Linux系统时,可以进入不同的模式,这模式我们称为执行等级(run level),不同执行等级有不同的功能与服务。图型界面为run level5,纯文本界面为run level3。当我们想要知道哪些服务默认可以启动,这就需要下面的命令来查询:
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; //设置为开机启动- chkconfig:设置自己的系统服务
1
chkconfig [--add|--del] [服务名称] // 该服务必须在/etc/init.d/内
- chkconfig:设置自己的系统服务
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里面对应服务配置文件的软链接;
禁用服务就是删除此软链接,添加服务就是添加软连接。
参考
- 《鸟哥的Linux私房菜》
- RHEL7的sytemctl(代替service和chkconfig)