1. 系统服务
1.1 daemon和service
Linux操作系统为了提供一些服务,这些服务称为Service,而提供服务的程序称为Daemon。举例来说,达成循环型例行性工作排程服务(service)的程序为crond这个daemon。
Unix采用的是system V
版本来进行操作系统的服务管理,启动系统服务的管理方式为init脚本程序的方式;如今,从CentOS7.x以后,红帽的distribution改用systemd
启动服务管理机制,有如下好处:
- 平行处理所有服务,加速开机流程:不相依服务可以同时启动
- 一经要求就响应的on-demand 启动方式:管理系统服务只需systemctl一个指令
- 服务相依性的自我检查:无需管理员进行相依性分析,在启动某个服务前会自动帮管理员启动未启动的依赖服务;
- 依daemon 功能分类:每个服务为一个unit单元,并有不同的type(service, socket, target, path, snapshot, etc.);
- 将多个daemons 集合成为一个群组:类似于systemV中的runlevel,将许多的功能集合为一个target选项,作为操作环境,亦即执行了多个daemon;
- 向下兼容旧有的init 服务脚本:如使用init 3可以切换到图形界面。
但是systemd不能完全取代systemV。其中有runlevel对应不完全,systemctl支持语法有限制,不可自定义参数;管理员手动启动服务无法通过systemd进行管理;编制systemd启动设定,不能存在互动机制等。
@systemd的配置文件:
/usr/lib/systemd/system/
:每个服务最主要的启动脚本设定,有点类似以前/etc/init.d 底下的文件;/run/systemd/system/
:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/ 高;★/etc/systemd/system/
:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx 之类的功能,执行优先序又比/run/systemd/system/ 高;
系统开机后执行哪些服务取决于/etc/systemd/system/目录中的文件,观察发现其中许多连结档,连接/usr/lib/systemd/system/中的脚本文件。
除了以上三个目录与systemd的daemon运作有关外,还有三个目录同样有关:
/etc/sysconfig/*
:几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb 所要更新的man page索引中,需要加入的参数就写入到此目录下的man-db 当中喔!而网络的设定则写在/etc/sysconfig/network-scripts/ 这个目录内。所以,这个目录内的文件也是挺重要的;/var/lib/
:一些会产生数据的服务都会将他的数据写入到/var/lib/ 目录中。举例来说,数据库管理系统Mariadb 的数据库默认就是写入/var/lib/mysql/ 这个目录下啦!/run/
:放置了好多daemon 的暂存档,包括lock file 以及PID file 等等。
@systemd的unit的type分类:
1.2 systemctl指令
systemctl的指令类型如下:
对于服务而言,有预设状态和当前状态:
预设状态:
- enabled:这个daemon 将在开机时被执行;
- disabled:这个daemon 在开机时不会被执行;
- static:这个daemon 不可以自己启动(enable 不可),不过可能会被其他的enabled 的服务来唤醒(相依属性的服务);
- mask:这个daemon 无论如何都无法被启动!因为已经被强制注销(非删除)。可透过systemctl unmask 方式改回原本状态,使用
systemctl mask (unit)
指令强制注销,使用systemctl unmask (unit)
解除注销;
当前状态:
- active (running):正有一个或多个程序正在系统中执行的意思,举例来说,正在执行中的vsftpd 就是这种模式;
- active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。通常用bash shell 写的小型服务,大多是属于这种类型(无须常驻内存);
- active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。打印队列相关服务就是这种状态, 虽然在启动中,需要真的有队列进来(打印作业) 这样他才会继续唤醒打印机服务来进行下一步打印的功能;
- inactive:这个服务目前没有运作;
注意:对于service类型的unit,启动/关闭使用start/stop/restart指令,对于target类型的unit,使用isolate的command;
1.3 Service类型配置文件的设定规则
上面说到systemd的配置文件大部分放置于/usr/lib/systemd/system/目录中,但是官方指出,该目录文件主要是原软件提供的设置,修改service的配置,修改的位置应当为/etc/systemd/system/目录内。以vsftpd.service为例:
/usr/lib/systemd/system/vsftpd.service
:官方释出的预设配置文件;- ★
/etc/systemd/system/vsftpd.service.d/custom.conf
:在/etc/systemd/system 底下建立与配置文件相同文件名的目录,但是要加上.d 的扩展名。然后在该目录下建立配置文件即可。另外,配置文件最好附档名取名为.conf较佳! 在这个目录下的文件会『累加其他设定』进入/usr/lib/systemd/system/vsftpd.service 内喔! /etc/systemd/system/vsftpd.service.wants/
*:此目录内的文件为链接档,设定相依服务的连结。意思是启动了vsftpd.service 之后,最好再加上这目录底下建议的服务。/etc/systemd/system/vsftpd.service.requires/*
:此目录内的文件为链接档,设定相依服务的连结。意思是在启动vsftpd.service 之前,需要事先启动哪些服务的意思。
对于.service文件,不论在/usr/lib/systemd/system/目录还是/etc/systemd/system/目录当中,作为配置文件能够分为三个部分:
- [Unit]: unit 本身的说明,以及与其他相依daemon 的设定,包括在什么服务之后才启动此unit 之类的设定值;
- [Service], [Socket], [Timer], [Mount], [Path]…:不同的unit type 就得要使用相对应的设定项目。这个项目内主要在规范服务启动的脚本、环境配置文件档名、重新启动的方式等等。
- [Install]:该项目就是将此unit 安装到哪个target 里面去的意思;
- 设定项目可以重复;
- 设定参数是【是/否】的项目,使用1,yes, true, on代表启动,用0, no, false, off代表关闭;
- 空白行、开头为 # 或 ; 的行,表示批注行
1.4 Timer类型配置文件的设定规则
除了使用crond服务进行循环例程的设定,也可使用systemd服务中的timers.target操作环境来实现定期处理各种任务。使用systemd.timer的好处有:
- 所有的systemd 的服务产生的信息都会被纪录(log),要比crond 在debug 上面要更清楚方便;
- 各项timer 的工作可以跟systemd 的服务相结合;
- 各项timer 的工作可以跟control group (cgroup,用来取代/etc/secure/limit.conf 的功能) 结合,以限制该工作的资源利用;
@使用systemd的timer功能,须满足以下条件:
- 系统的timer.target 一定要启动;
- 要有个sname.service 的服务存在(sname 是你自己指定的名称);
- 要有个sname.timer 的时间启动服务存在;
@sname.timer的设定值