Systemd简介
从 CentOS 7.x 以后,Red Hat系列放弃了一直使用的init启动脚本的方式管理服务,改用systemd 这个启动服务管理机制。该机制的好处有:
- 平行处理服务,加速开机流程,systemd可以让所有的服务同时启动。
- 服务依赖性自我检查。
- 对服务依据功能进行分类,将多个服务集合成一个群组。
systemd 将过去执行脚本通通称为一个服务单位 (unit)。每种服务单位依据功能来区分时,就分类为不同的类型 (type)。
基本的类型有:
- 系统服务
- 数据监听与交换的插槽档服务 (socket)
- 储存系统状态的快照类型
- 提供不同类似执行等级分类的操作环境 (target)
systemd配置目录有以下三种:
- /usr/lib/systemd/system/:每个服务最主要的启动脚本设置
- /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先级要比/usr/lib/systemd/system/ 高
- /etc/systemd/system/:管理员依据主机系统的需求所创建的执行脚本,执行优先级又比/run/systemd/system/ 高
/etc/systemd/system/ 目录下存放的是需要开机执行的服务,该目录下有大量的链接文件,链接到/usr/lib/systemd/system/目录下,该目录下的文件才是systemd实际启动的服务脚本文件。
Systemd 服务单元(unit)分类
上面说到根据不同的功能,服务单元被分为不同的类型,可以根据服务脚本文件的扩展名来区分为以下几种。
- .service文件——一般服务类型(service unit) 主要是系统服务,包括服务器本身所需要的本级服务以及网络服务。
- .socket文件——内部程序数据交换的插槽服务器(socket unit) 主要是IPC(Inter-Process Communication)的传输讯息插槽档(socket file)功能。这种服务通常在监控讯息传递的插槽档,当有通过此插槽传递讯息来请求服务时,就依据当时的状态将请求传递到对应的daemon,若果daemon未启动,则启动daemon后传递用户的请求。socket服务一般是比较不会被用到的服务,因此开机时通常会延迟启动。一般用于本机服务比较多,如图形界面的软件大多通过socket来进行数据交换。
- .target——执行环境类型(target unit) unit的集合(服务集合),即执行若干.service或者.socket。
- .mount/.automount——文件系统挂载服务(mount/automount unit) 来自网络的自动挂载等与文件系统相关性较高的程序管理。
- .path——侦测特定文件或者目录类型(path unit) 侦测特定目录来提供服务。如打印服务,通过侦测打印存储目录来启动打印功能。
- .timer——定时执行的服务(timer unit) 定时执行,类似crontab,但是由systemd主动提供,比crontab更灵活。 其中.service 的系统服务类型最为常见。
Systemd服务状态说明
使用systemctl status命令可以查看当然服务的状态。状态含义如下:
- Loaded:该行表示此服务是否会开机启动
- enabled 开机启动
- disabled 不启动
- vendor preset 第一次安装时的预设值。
- Active: 正在执行(running)或没有执行(dead) Active除了running跟dead之外,还有其他几个基本的状态:
- active(running): 正有一只或多只程序正在系统中执行的意思
- active(exited): 仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。
- active(waiting): 正在执行当中,不过还再等待其他的事件才能继续处理。
- inactive:目前没有运行。 Loaded的状态还有:
- enabled: 开机时被执行
- disabled: 开机时不会被执行
- static: 不可以自己启动(enable不可),不过可能会被其他的enabled的服务来唤醒
- mask: 无论如何都无法被启动!因为已经被注销(非删除)。
查看系统中的存在的服务
命令如下:
systemctl [command] [--type=TYPE] [--all]
command:
- list-units:依据unit列出目前有启动的unit,即当前启动的服务。若加上 --all 才会列出没启动的。
- list-unit-files:依据/usr/lib/systemd/system/内的文件,将所有文件列表说明,即安装的服务。
- --type=TYPE:就是之前提到的unit type,主要有service,socket,target等 <br> systemctl命令不加参数等同于'systemctl list-units',参数解释如下:
- UNIT:项目的名称,包括各个unit的类别
- LOAD:开机时是否会被载入,默认systemctl显示的是有载入的项目而已
- ACTIVE:目前的状态,须与后续的SUB搭配!就是用'systemctl status'观察时,active 的项目
- DESCRIPTION:详细描述
查看服务之间的依赖性
命令
systemctl list-dependencies [unit] [--reverse]
--reverse :反向追踪谁使用这个服务单元
systemctl针对service类型的配置文件
systemd的配置文件大部分放置在/usr/lib/systemd/system/ 目录内,该目录存放软件默认的配置,不建议修改。修改的配置文件应该放置在 /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之前,需要事先启动哪些服务的意思。
服务文件字段解释
[Unit]部分
- Description 服务描述说明。
- Documentation 详尽的文档。
- After 位于哪个daemon启动之后,但非强制要求必须等前置服务启动后才能启动。
- Before 定义此unit需要在哪个daemon后启动,即设置依赖。
- Wants 规范这个unit之后最好还要启动什么服务,非强制性。
- Conflicts 代表冲突服务。
[Service]部分
- Type 说明这个daemon的启动方式,影响ExecStart。类型如下:
- simple: 默认值,daemon主要由ExecStart后面的指令来启动,启动后常驻内存。
- forking: 由ExecStart启动的程序通过spawns延伸出其他的子程序来作为此daemon的主要服务。原生的父程序在启动结束后就会终止运行。传统unit大多属于这类。如httpd
- oneshot: 与simple类似,不过程序工作完后就结束,不常驻内存。
- dbus: 与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才能继续运行。因此,此类unit通常要设置BusName才行。
- idle: 与simple类似,但必须要所有工作都顺利执行完毕后才会执行。此类通常是开机到最后才执行。
- EnvironmentFile: 启动脚本的环境配置文件,可以使用Environment后接多个不同的Shell变量。
- ExecStart: 实际执行的指令和脚本程序,还可以使用ExecStartPre和ExecStartPost来设置额外的指令行为,需要注意的是指令串接受"指令 参数 参数..."的格式,不能接受'<','>','>>','|','&'等特殊字符。因此,最佳的做法是写入脚本。另外上述语法若要支持比较完整的bash语法,要用Type=oneshot。
- ExecStop: 与systemctl stop执行相关,关闭服务。
- ExecReload: 与systemctl reload执行相关。
- Restart: 当Restart=1时,此daemon终止后,再次重启。
- RemainAfterExit: 当RemainAfterExit=1时,此daemon所属的所有程序都终止后,此服务会再尝试重启。此对于Type=oneshot类的服务很有帮助。
- TimeoutSec: 如果服务在启动或者关闭时,因为某些缘故而无法正常启动或者结束时,该参数表示需要等多久才进入强制结束状态。
- KillMode: 有3个类型process,control-group,none。
- process: daemon终止时,只会终止主要程序,即ExecStart后的指令。
- control-group: daemon终止时,由daemon产生的其它control-group程序也会终止。
- none: 没有程序会被关闭。
- RestartSec: 与Restart有关联,即服务在关闭后需要等待多少时间才重启,默认时100ms。
[Install]部分
- WanteBy: 该unit本身附挂在那个target unit下,因此后面一般取xxx.target,如大多数服务都是附挂在multi-user.target下。
- Also: unit本身enable时,Also后面的unti也会enable,即依赖性的服务也写在此处。
- Alias: 链接别名。当systemctl enable服务时,此服务会进行连接文件的创建。如multi-user.target,当作为默认操作环境时,/etc/systemd/system/default.target会链接到/usr/lib/systemd/system/multi-user.target。