服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d
- 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/ 高喔!
- systemd 的 unit 类型分类说明
/usr/lib/systemd/system/ 以下的数据如何区分上述所谓的不同的类型 (type) 呢?很简单!看扩展名!
扩展名 | 主要服务功能 |
.service | 一般服务类型 (service unit):主要是系统服务,包括服务器本身所需要的本地服务以及网络服务都是!比较经常被使用到的服务大多是这种类型! 所以,这也是最常见的类型了! |
.socket | 内部程序数据交换的插槽服务 (socket unit):主要是 IPC (Inter-process communication) 的传输讯息插槽文件 (socket file) 功能。 这种类型的服务通常在监控讯息传递的插槽文件,当有透过此插槽文件传递讯息来说要链接服务时,就依据当时的状态将该用户的要求传送到对应的 daemon, 若 daemon 尚未启动,则启动该 daemon 后再传送用户的要求。
使用 socket 类型的服务一般是比较不会被用到的服务,因此在开机时通常会稍微延迟启动的时间 (因为比较没有这么常用嘛!)。一般用于本地服务比较多,例如我们的图形界面很多的软件都是透过 socket 来进行本机程序数据交换的行为。 (这与早期的 xinetd 这个 super daemon 有部份的相似喔!) |
.target | 执行环境类型 (target unit):其实是一群 unit 的集合,例如上面表格中谈到的 multi-user.target 其实就是一堆服务的集合~也就是说, 选择执行 multi-user.target 就是执行一堆其他 .service 或/ 及 .socket 之类的服务就是了! |
.mount .automount | 文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络的自动挂载、NFS 文件系统挂载等与文件系统相关性较高的程序管理。 |
.path | 侦测特定文件或目录类型 (path unit):某些服务需要侦测某些特定的目录来提供队列服务,例如最常见的打印服务,就是透过侦测打印队列目录来启动打印功能! 这时就得要 .path 的服务类型支持了! |
.timer | 循环执行的服务 (timer unit):这个东西有点类似 anacrontab 喔!不过是由 systemd 主动提供的, 比 anacrontab 更加有弹性! |
systemctl 管理服务
systemctl [command] [unit]
command 主要有:
start :立刻启动后面接的 unit stop :立刻关闭后面接的 unit
restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思reload :不关闭后面接的 unit 的情况下,重载配置文件,让设定生效enable :设定下次开机时,后面接的 unit 会被启动
disable :设定下次开机时,后面接的 unit 不会被启动
status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机预设执行否、登录等信息等!
is-active :目前有没有正在运作中
is-enable :开机时有没有预设要启用这个 unit
基本上有几个常见的状态:
active (running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执行中的 vsftpd 就是这种模式。
active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这种模式! quotaon 不须一直执行~只须执行一次之后,就交给文件系统去自行处理啰!通常用 bash shell 写的小型服务,大多是属于这种类型 (无须常驻内存)。
active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来说,打印的队列相关服务就是这种状态! 虽然正在启动中,不过,也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机服务来进行下一步打印的功能。
inactive:这个服务目前没有运作的意思。
daemon 的预设状态有没有可能除了 enable/disable之外,还有其他的情况呢?当然有!
enabled:这个 daemon 将在开机时被执行
disabled:这个 daemon 在开机时不会被执行
static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled 的服务来唤醒 (相依属性的服务)
mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可透过 systemctl unmask 方式改回原本状态
要关闭 cups.service 时,比较正规的作法是,连同其他两个会唤醒 service 的 cups.socket 与cups.path 通通关闭,那就没事了! 比较不正规的作法是,那就强迫 cups.service 注销吧!透过 mask的方式来将这个服务注销看看!
systemctl stop cups.service
systemctl mask cups.service
透过这个 mask 功能,你就可以不必管其他相依服务可能会启动到这个想要关闭的服务了!虽然是非正规,不过很有效!
透过 systemctl 观察系统上所有的服务
系统上面有多少的服务存在呢?这个时候就得要透过 list-units 及 list-unit-files 来观察了
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 等
范例一:列出系统上面有启动的 unit
[root@study ~]# systemctl
范例二:列出所有已经安装的 unit 有哪些?
[root@study ~]# systemctl list-unit-files
想要知道 service 这种类别的 daemon 而已,而且不论是否已经启动,通通要列出来! 那该如何是好?
systemctl list-units --type=service --all
透过 systemctl 管理不同的操作环境 (target unit)
systemctl list-units --type=target --all
target 主要有底下几个:
graphical.target:就是文字加上图形界面,这个项目已经包含了底下的 multi-user.target 项目!
multi-user.target:纯文本模式!
rescue.target:在无法使用 root 登入的情况下,systemd 在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。但是这是额外系统,因此可能需要动到 chroot 的方式来取得你原有的系统喔!再后续的章节我们再来谈!
emergency.target:紧急处理系统的错误,还是需要使用 root 登入的情况,在无法使用 rescue.target 时,可以尝试使用这种模式!
getty.target:可以设定你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个东西的配置文件!
systemctl [command] [unit.target]
选项与参数:
command:
get-default :取得目前的 target
set-default :设定后面接的 target 成为默认的操作模式
isolate :切换到后面接的模式
systemd 也提供了数个简单的指令给我们切换操作模式之用喔! 大致上如下所示:
systemctl 分析各服务之间的相依
systemctl list-dependencies [unit] [--reverse]
选项与参数:
--reverse :反向追踪谁使用这个 unit 的意思!
范例一:列出目前的 target 环境下,用到什么特别的 unit
systemctl list-dependencies default.target
与 systemd 的 daemon 运作过程相关的目录
/usr/lib/systemd/system/:
使用 CentOS 官方提供的软件安装后,默认的启动脚本配置文件都放在这里,这里的数据尽量不要修改~ 要修改时,请到 /etc/systemd/system 底下修改较佳!
/run/systemd/system/:
系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高!
/etc/systemd/system/:
管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前 /etc/rc.d/rc5.d/Sxx 之类的功能! 执行优先序又比 /run/systemd/system/ 高喔!
/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 等等。
通过systemctl管理socket 服务
sytemctl list-sockets
网络服务与端口口对应
系统上面有没有什么设定可以让服务与埠号对应在一起呢?那就是 /etc/services
关闭网络服务
先查看网络服务
netstat -tlnup
接下来,用systemctl 查看对应的服务进程
systemctl list-units --all |grep ....
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 之前,需要事先启动哪些服务的意思。
systemctl 配置文件的设定项目
以sshd为例:
[root@study ~]# cat /usr/lib/systemd/system/sshd.service [Unit] # 这个项目与此 unit 的解释、执行服务相依性有关 Description=OpenSSH server daemon After=network.target sshd-keygen.service Wants=sshd-keygen.service
[Service] # 这个项目与实际执行的指令参数有关 EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s
[Install] # 这个项目说明此 unit 要挂载哪个 target 底下 WantedBy=multi-user.target |
[Unit] 部份 | |
设定参数 | 参数意义说明 |
Description | 就是当我们使用 systemctl list-units 时,会输出给管理员看的简易说明!当然,使用 systemctl status 输出的此服务的说明,也是这个项目! |
Documentation | 这个项目在提供管理员能够进行进一步的文件查询的功能!提供的文件可以是如下的资料:
|
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] 部份 | |
设定参数 | 参数意义说明 |
Type | 说明这个 daemon 启动的方式,会影响到 ExecStart 喔!一般来说,有底下几种类型
比较重要的项目大概是 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] 部份 | |
设定参数 | 参数意义说明 |
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 啰! |