您现在的位置是:首页> 操作系统> Linux> CentOS 7

CentOS7 systemctl配置文件详解

  • 5415人已阅读
  • 时间:2018-11-15 08:06:51
  • 分类:CentOS 7
  • 作者:祥哥

一、systemd的配置文件放置目录

基本上,systemd将过去所谓的daemon执行脚本通通称为一个服务单位(unit),而每种服务单位依据功能来区分时,就分类为不同的类型(type)。基本的类型有包括系统服务、数据监听与交换的插槽档服务(socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境(targer)等等。哇!这么多类型,那设定时会不会很麻烦呢?其实还好,因为配置文件都放置在底下的目录中:

/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/底下的设定,所以该目录底下就是一大堆加结档。而实际执行的systemd启动脚本配置文件,其实都是放置在/usr/lib/systemd/system底下的喔!因此如果你想要修改某个服务启动的设定,应该要去/usr/lib/systemd/system/底下修改才对!/etc/systemd/system/仅是连结到正确的执行脚本配置文件而已。所以想要看执行脚本设定,应该就要到/usr/lib/systemd/system/底下去查阅才对!

那/usr/lib/systemd/system/以下的数据如何区分上述所谓的不同的类型(type)呢?很简单!看扩展名!举例来说,我们来瞧瞧上一章谈到的vsftpd这个范例的启动脚本设定,还有crond与纯文本模式的multi-user设定。

QQ图片20181113202027.png

所以我们可以知道vsftpd与crond其实算是系统服务(service),而multi-user要算是执行环境相关的类型(target type)。根据这些扩展名的类型,我们大概可以找到几种比较常见的systemd的服务类型如下:

QQ图片20181113202340.png

其中又以.service的系统服务类型最常见了!因为我们一堆网络服务都是透过这种类型来设计的啊!接下来,我们来谈谈如何管理这些服务的启动与关闭。

二、透过systemctl管理服务

基本上,systemd这个启动服务的机制,主要是透过一只名为systemctl的指令来处理的!跟以前systemV需要service/chkconfig/setup/init等指令来协助不同,systemd就是仅有systemctl这个指令来处理而已。所有全部的行为都要使用systemctl的意思啦!

2.1透过systemctl管理单一服务(service unit)的启动、开机启动与观察状态

在开始这个小节之前,鸟哥(这里鸟哥,当然不是祥哥,因为祥哥看的是鸟哥写的转载过来的。)要先来跟大家报告一下,那就是:一般来说,服务的启动有两个阶段,一个是开机的时候设定要不要启动这个服务,以及你现在要不要启动这个服务,这两者之间有很大的差异!举个例子来说,假如我们现在要立刻取消atd这个服务时,正规的方法(不要kill)要怎么处理?

QQ图片20181113203626.pngQQ图片20181113203713.pngQQ图片20181113203818.png

上面的范例中,我们已经关掉了and啰!这样作才是对的!不应该使用kill的方式来关掉一个正常的服务!否则systemctl会无法继续监控该服务的!那就比较麻烦。而使用systemctl status atd的输出结果中,第2,3两行很重要~因为那个是告诉我们该unit下次开会会不会预设启动,以及目前启动的状态!相当重要!再回到systemctl status atd.service 的第三行,不是有个Active的daemon现在状态吗?除了running跟dead之外,有没有其他的状态呢?有的,基本是上是以下几种:

active(running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执行中的vsftpd就是这种模式
active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。举例来说,开机或者是挂载时才会进行一次的quotaon功能,就是这种模式。
active(waiting):正在执行当中,不过还再等待其他的事件才能继续处理。
inactive:这个服务目前没有运行
即然daemon目前的状态就这么多种了,那么daemon的预设状态有没有可能除了enable/disable这外,还有其他的情况吗?当然有
enabled:这个daemon将在开机时被执行
disabled:这个daemon开机不被执行
static:这个daemon不可以自已启动,不过可能会被其他的enabled的服务来唤醒(相依属性的服务)
mask:这个daemon无论如何都无法被启动!因为已经被强制注销。

三、Systemctl针对service的配置文件详解

现在我们知道服务的管理是通过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,建议不要修改!而要修改的位置应该放置于 /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 之前,需要事先启动哪些服务的意思。
基本上,在配置文件里面你都可以自由设置相依服务的检查,并且设置加入到哪些 target 里头去。但是如果是已经存在的配置文件,或者是官方提供的配置文件, Red Hat 是建议你不要修改原设置,而是到上面提到的几个目录去进行额外的客制化设置比较好!当然,这见仁见智~如果你硬要修改原始的 /usr/lib/systemd/system 下面的配置文件,那也是 OK 没问题的!并且也能够减少许多配置文件的增加~鸟哥自己认为,这样也不错!反正,就完全是个人喜好啰~

每个配置文件分为三部分,就是:

[Unit]: unit 本身的说明,以及与其他相依 daemon 的设置,包括在什么服务之后才启动此 unit 之类的设置值;
[Service], [Socket], [Timer], [Mount], [Path]..:不同的 unit type 就得要使用相对应的设置项目。我们拿的是 sshd.service 来当范本,所以这边就使用 [Service] 来设置。 这个项目内主要在规范服务启动的脚本、环境配置文件文件名、重新启动的方式等等。
[Install]:这个项目就是将此 unit 安装到哪个 target 里面去的意思!

至于配置文件内有些设置规则还是得要说明一下:

设置项目通常是可以重复的,例如我可以重复设置两个 After 在配置文件中,不过,后面的设置会取代前面的喔!因此,如果你想要将设置值归零, 可以使用类似“ After= ”的设置,亦即该项目的等号后面什么都没有,就将该设置归零了 (reset)。
如果设置参数需要有“是/否”的项目 (布林值, boolean),你可以使用 1, yes, true, on 代表启动,用 0, no, false, off 代表关闭!随你喜好选择啰!
空白行、开头为 # 或 ; 的那一行,都代表注解!

每个部份里面还有很多的设置细项,我们使用一个简单的表格来说明每个项目好了

【Unit】部分

设置参数
参数意义说明
Description
就是当我们使用systemctl list-units时,会输出给管理员看的简易说明 !当然,使用systemctl status输出的此服务的说明,也是这个项目。
Documentation

这个项目在提供管理员能够进行进一步的文件查询的功能!提供的文件可以是如下的数据:

Documentation=http://www...

Documentation=man:sshd(8)

Documentation=file:/etc/ssh/sshd_config

After
说明此 unit 是在哪个 daemon 启动之后才启动的意思!基本上仅是说明服务启动的顺序而已,并没有强制要求里头的服务一定要启动后此 unit 才能启动。 以 sshd.service 的内容为例,该文件提到 After 后面有 network.target 以及 sshd-keygen.service,但是若这两个 unit 没有启动而强制启动 sshd.service 的话, 那么 sshd.service 应该还是能够启动的!这与 Requires 的设置是有差异的喔!
Before
与 After 的意义相反,是在什么服务启动前最好启动这个服务的意思。不过这仅是规范服务启动的顺序,并非强制要求的意思。
Requires
明确的定义此 unit 需要在哪个 daemon 启动后才能够启动!就是设置相依服务啦!如果在此项设置的前导服务没有启动,那么此 unit 就不会被启动!
Wants
与 Requires 刚好相反,规范的是这个 unit 之后最好还要启动什么服务比较好的意思!不过,并没有明确的规范就是了!主要的目的是希望创建让使用者比较好操作的环境。 因此,这个 Wants 后面接的服务如果没有启动,其实不会影响到这个 unit 本身!
Conflicts
代表冲突的服务!亦即这个项目后面接的服务如果有启动,那么我们这个 unit 本身就不能启动!我们 unit 有启动,则此项目后的服务就不能启动! 反正就是冲突性的检查啦!

接下来了解一下[Service]当中有哪些项目可以使用!

【Service】

设置参数
参数意义说明
Type
说明这个 daemon 启动的方式,会影响到 ExecStart 喔!一般来说,有下面几种类型 simple:默认值,这个 daemon 主要由 ExecStart 接的指令串来启动,启动后常驻于内存中。forking:由 ExecStart 启动的程序通过 spawns 延伸出其他子程序来作为此 daemon 的主要服务。原生的父程序在启动结束后就会终止运行。 传统的 unit 服务大多属于这种项目,例如 httpd 这个 WWW 服务,当 httpd 的程序因为运行过久因此即将终结了,则 systemd 会再重新生出另一个子程序持续运行后, 再将父程序删除。据说这样的性能比较好!!oneshot:与 simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。dbus:与 simple 类似,但这个 daemon 必须要在取得一个 D-Bus 的名称后,才会继续运行!因此设置这个项目时,通常也要设置 BusName= 才行!idle:与 simple 类似,意思是,要执行这个 daemon 必须要所有的工作都顺利执行完毕后才会执行。这类的 daemon 通常是开机到最后才执行即可的服务!比较重要的项目大概是 simple, forking 与 oneshot 了!毕竟很多服务需要子程序 (forking),而有更多的动作只需要在开机的时候执行一次(oneshot),例如文件系统的检查与挂载啊等等的。
EnvironmentFile可以指定启动脚本的环境配置文件!例如 sshd.service 的配置文件写入到 /etc/sysconfig/sshd 当中!你也可以使用 Environment= 后面接多个不同的 Shell 变量来给予设置!
ExecStart就是实际执行此 daemon 的指令或脚本程序。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设置项目来在实际启动服务前,进行额外的指令行为。 但是你得要特别注意的是,指令串仅接受“指令 参数 参数...”的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 bash 语法也不支持喔! 所以,要使用这些特殊的字符时,最好直接写入到指令脚本里面去!不过,上述的语法也不是完全不能用,亦即,若要支持比较完整的 bash 语法,那你得要使用 Type=oneshot 才行喔! 其他的 Type 才不能支持这些字符。
ExecStop与 systemctl stop 的执行有关,关闭此服务时所进行的指令。
ExecReload与 systemctl reload 有关的指令行为
Restart当设置 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务。举例来说,如果你在 tty2 使用文字界面登陆,操作完毕后登出,基本上,这个时候 tty2 就已经结束服务了。 但是你会看到屏幕又立刻产生一个新的 tty2 的登陆画面等待你的登陆!那就是 Restart 的功能!除非使用 systemctl 强制将此服务关闭,否则这个服务会源源不绝的一直重复产生!

RemainAfterExit当设置为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助!

TimeoutSec若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利“正常启动或正常结束”的情况下,则我们要等多久才进入“强制结束”的状态!
KillMode可以是 process, control-group, none 的其中一种,如果是 process 则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭喔!

RestartSec与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要 sleep 多少时间再重新启动的意思。默认是 100ms (毫秒)

最后,再来看看那么install内还有哪个项目可用

【install】

设置参数
参数意义说明
WantedBy这个设置后面接的大部分是 *.target unit !意思是,这个 unit 本身是附挂在哪一个 target unit 下面的!一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 下面!

Also当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的服务可以写在这里呢!
Alias进行一个链接的别名的意思!当 systemctl enable 相关的服务时,则此服务会进行链接文件的创建!以 multi-user.target 为例,这个家伙是用来作为默认操作环境 default.target 的规划, 因此当你设置用成 default.target 时,这个 /etc/systemd/system/default.target 就会链接到 /usr/lib/systemd/system/multi-user.target 啰!

大致的项目就有这些,下节课分享几个实例吧。

Top