系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运作,所以达成这个 service 的程序称呼为 daemon。
daemon 是一只程序执行后的程序,daemon 程序的命名方式是:服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如:例行性命令的建立的 at, 与 cron 这两个服务, 他的程序文件名会被取为 atd 与 crond,这个 d 代表的就是 daemon 的意思。

systemd 使用的 unit 分类


CentOS 7.0 以后使用 systemd 这个启动服务管理机制启动脚本。

systemd 的配置文件放置目录


systemd 将过去的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位 依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、数据监听与交换的 插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境 (target)。配置文件在以下目录:

  • /usr/lib/systemd/system/(Ubuntu 中在/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/ 仅是连结到正确的执行脚本配置文件。

systemd 的 unit 类型分类说明


用扩展名区分 /usr/lib/systemd/system/ 中的数据类型 (type)。如下:

拓展名

主要服务功能

.service

一般服务类型 (service unit):主要是系统服务,包括服务器本身所需要的本地服务以及网络服务,是经常使用到的服务。

.socket

内部程序数据交换的插槽服务 (socket unit):主要是 IPC (Inter-process communication) 的传输讯息插槽文件 (socket file) 功能

.target

执行环境类型 (target unit):是一群 unit 的集合,例如 multi-user.target 是一堆服务的集合,也就是说,选择执行 multi-user.target 就是执行一堆其他 .service 或/及 .socket 之类的服务

.mount .automount

文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络的自动挂载、NFS 文件系统 挂载等与文件系统相关性较高的程序管理

.path

侦测特定文件或目录类型 (path unit):某些服务需要侦测某些特定的目录来提供队列服务,例如最 常见的打印服务,就是透过侦测打印队列目录来启动打印功能

.timer

循环执行的服务 (timer unit):类似 anacrontab,不过是由 systemd 主动提供的, 比 anacrontab 更加有弹性

透过 systemctl 管理服务


通过 systemctl 命令可以管理服务的启动、关闭、重启、查看状态等。

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


systemclt 命令格式:

[root@study ~]# 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 
 
# 查询 atd 这个服务的状态 
[root@study ~]# systemctl status atd.service 
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2018-10-07 15:54:35 CST; 56min ago
 Main PID: 1189 (atd)
    Tasks: 1
   CGroup: /system.slice/atd.service
           └─1189 /usr/sbin/atd -f

10月 07 15:54:35 centos764 systemd[1]: Started Job spooling tools.
# 重点在第二、三行 
# Loaded 行说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动 
# Active 行说明这个 unit 的状态是正在执行 (running) 或没有执行 (dead) 
# 后面几行则是说明这个 unit 程序的 PID 状态以及最后一行显示这个服务的登录文件信息 
# 登录文件信息格式为:时间 讯息发送主机 哪一个服务的讯息 实际讯息内容 
# 所以上面的显示讯息是:这个 atd 预设开机就启动,而且现在正在运作的意思

服务的常见目前状态:

状态

含义

active(running)

有一只或多只程序正在系统中执行

active(exited)

仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者 是挂载时才会进行一次的 quotaon 功能

active(waiting)

正在执行当中,不过要等待其他的事件才能继续处理。例如:打印的队列相关服务 就是这种状态,虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机 服务来进行下一步打印的功能

inactive

这个服务没有运行

服务的常见预设状态:

状态

含义

enabled

这个 daemon 在开机时被执行

disabled

这个 daemon 在开机时不被执行

static

这个 daemon 不可以自己启动 (不能 enable),可能会被其他的 enabled 的服务来唤醒 (相依属 性的服务)

mask

这个 daemon 无论如何都无法被启动,已经被强制注销 (非删除)。可透过 systemctl unmask 方 式改回原本状态

# 设置 chronyd 开机不自启
[root@study ~]# systemctl disable chronyd.service 
rm '/etc/systemd/system/multi-user.target.wants/chronyd.service'

可以看出仅是从 /etc/systemd/system 底下删除一条连结文件。

# 注销 cups 
[root@study ~]# systemctl mask cups.service 
ln -s '/dev/null' '/etc/systemd/system/cups.service'

可以看出mask 注销的动作,只是让启动的脚本变成空的装置。

通过 systemctl 观察系统上所有的服务


使用list-units 及 list-unit-files 参数观察系统上面所有服务。命令格式如下:

[root@study ~]# 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                      LOAD   ACTIVE SUB       DESCRIPTION 
proc-sys-fs-binfmt_mis... loaded active waiting   Arbitrary Executable File Formats File System 
.....(中间省略)..... 
LOAD   = Reflects whether the unit definition was properly loaded. 
ACTIVE = The high-level unit activation state, i.e. generalization of SUB. 
SUB    = The low-level unit activation state, values depend on unit type. 
 
141 loaded units listed. Pass --all to see loaded but inactive units, too. 
To show all installed unit files use 'systemctl list-unit-files'. 
# 列出的项目中,主要的意义是: 
# UNIT   :项目的名称,包括各个 unit 的类别 (看扩展名) 
# LOAD   :开机时是否会被加载,默认 systemctl 显示的是有加载的项目而已 
# ACTIVE :目前的状态,须与后续的 SUB 搭配!就是我们用 systemctl status 观察时,active 的项目!
# DESCRIPTION :详细描述 
# systemctl 都不加参数,其实预设就是 list-units 的意思! 
 
# 列出所有已经安装的 unit 
[root@study ~]# systemctl list-unit-files 
UNIT FILE                                   STATE 
proc-sys-fs-binfmt_misc.automount           static 
.....(中间省略)..... 
systemd-tmpfiles-clean.timer                static 
 
336 unit files listed.

仅列出 service 这种类别的 daemon,使用命令 systemctl list-units --type=service --all

透过 systemctl 管理不同的操作环境 (target unit)


列出系统上所有的 target unit 命令: systemctl list-units --type=target --all 。重要的有:

  • graphical.target:就是文字加上图形界面,这个项目已经包含了底下的 multi-user.target 项目
  • multi-user.target:纯文本模式
  • rescue.target:在无法使用 root 登入的情况下,systemd 在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。 但是这是额外系统,因此可能需要动到 chroot 的 方式来取得你原有的系统
  • emergency.target:紧急处理系统的错误,还是需要使用 root 登入的情况,在无法使用 rescue.target 时,可 以尝试使用这种模式
  • shutdown.target:就是关机的流程
  • getty.target:可以设定你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个东西的配置文件

正常的模式是 multi-user.target 以及 graphical.target,救援方面的模式主要是 rescue.target 以及 更严重的 emergency.target。 最常使用的是 multi-user 以及 graphical 。 查看、修改命令如下:

[root@study ~]# systemctl [command] [unit.target] 
选项与参数: 
command:     
get-default :取得目前的 target      
set-default :设定后面接的 target 成为默认的操作模式     
isolate     :切换到后面接的模式 
 
# 观察当前模式,并将默认模式转为文字界面 
[root@study ~]# systemctl get-default  
graphical.target  # 是图形界面 
 
[root@study ~]# systemctl set-default multi-user.target 
[root@study ~]# systemctl get-default  
multi-user.target 
 
# 在不重新启动的情况下,将目前的操作环境改为纯文本模式,关掉图形界面 
[root@study ~]# systemctl isolate multi-user.target 
 
# 若需要重新取得图形界面 
[root@study ~]# systemctl isolate graphical.target

在 service 部分用start/stop/restart ,在 target 项目则使用 isolate (隔离不同的操作模式)。方便起见systemd 也提供了数个简单的指令给我们切换操作模式用:

[root@study ~]# systemctl poweroff  # 系统关机 
[root@study ~]# systemctl reboot    # 重新启动 
[root@study ~]# systemctl suspend   # 进入暂停模式 
[root@study ~]# systemctl hibernate # 进入休眠模式 
[root@study ~]# systemctl rescue    # 强制进入救援模式 
[root@study ~]# systemctl emergency # 强制进入紧急救援模式
  • suspend:暂停模式会将系统的状态数据保存到内存中,然后关闭掉大部分的系统硬件,当然,并没有实际 关机, 当用户按下唤醒机器的按钮,系统数据会重内存中回复,然后重新驱动被大部分关闭的硬件,就 开始正常运作!唤醒的速度较快。 如果在虚拟机中执行此命令,该虚拟机会挂起(暂停)。
  • hibernate:休眠模式则是将系统状态保存到硬盘当中,保存完毕后,将计算机关机。当用户尝试唤醒系统时, 系统会开始正常运作, 然后将保存在硬盘中的系统状态恢复回来。因为数据是由硬盘读出,因此唤醒的效 能与你的硬盘速度有关。 在虚拟机中执行此命令,会进入开机选择页面。

透过 systemctl 分析各服务之间的相依性


systemd 有时候会有相依性,例如 graphical.target 会用到 multi-user.target,查看命令如下:

[root@study ~]# systemctl list-dependencies [unit] [--reverse] 
选项与参数: --reverse :反向追踪谁使用这个 unit 的意思 

# 列出目前的 target 环境下,用到什么特别的 unit 
[root@study ~]# systemctl get-default 
multi-user.target 
 
[root@study ~]# systemctl list-dependencies 
default.target
● ├─abrt-ccpp.service
● ├─abrt-oops.service
● ├─abrt-vmcore.service
● ├─abrt-xorg.service
● ├─abrtd.service
● ├─atd.service
.....(中间省略)..... 
● ├─getty.target
● │ └─getty@tty1.service
● ├─nfs-client.target
● │ ├─auth-rpcgss-module.service
● │ ├─rpc-statd-notify.service
● │ └─remote-fs-pre.target
● └─remote-fs.target
●   └─nfs-client.target
●     ├─auth-rpcgss-module.service
●     ├─rpc-statd-notify.service
●     └─remote-fs-pre.target

# 查看有哪些服务使用 multi-user.target 
[root@study ~]# systemctl list-dependencies multi-user.target --reverse
multi-user.target
● └─graphical.target

另外,网络服务与端口口对应记录在 /etc/service 中,如果想修改网络服务与端口口对应可以修改该文件,不过有可能会造成一些协议的错误。

systemctl 针对 service 类型的配置文件


systemctl 配置文件相关目录简介


服务的管理是通过 systemd,systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设定,建议不要修改,而要修改的位置应该放置于 /etc/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.service 的配置文件为例:

[root@centos764 ~]# cat /usr/lib/systemd/system/sshd.service 
[Unit]        # 此 unit 的解释、执行服务相依性 
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]     # 实际执行的指令参数
Type=notify
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]: unit 本身的说明,以及与其他相依 daemon 的设定,包括在什么服务之后才启动此 unit 之类的设定值
  • [Service], [Socket], [Timer], [Mount], [Path]…:不同的 unit type 就得要使用相对应的设定项目。 这个项目内主要在规范服务启动的脚本、环境配置文件档名、重新启动的方式
  • [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(类似) 或 Documentation=file:/etc/…

After

说明此 unit 是在哪个 daemon 启动之后才启动的意思,基本上仅是说明服务启动的顺序而已, 并没有强制要求里头的服务一定要启动后此 unit 才能启动

Before

与 After 的意义相反,是在什么服务启动前最好启动这个服务。不过这仅是规范服务启动 的顺序,并非强制要求

Requires

明确的定义此 unit 需要在哪个 daemon 启动后才能够启动!就是设定相依服务!如果在此项 设定的前导服务没有启动,那么此 unit 就不会被启动!

Wants

规范的是这个 unit 之后最好还要启动什么服务比较好的意思,不过,并 没有明确的规范,主要的目的是希望建立让使用者比较好操作的环境。 因此,这个 Wants 后面接的服务如果没有启动,其实不会影响到这个 unit 本身

Conflicts

代表冲突的服务!即这个项目后面接的服务如果有启动,那么我们这个 unit 本身就不能启动! 我们 unit 有启动,则此项目后的服务就不能启动

[Service] 部分详细设定参数:

设定参数

参数意义说明

Type

说明这个 daemon 启动的方式,会影响到 ExecStart,比较重要的选项是 simple, forking 与 oneshot

ExecStart

就是实际执行此 daemon 的指令或脚本程序

Restart

设定重新启动的条件

[Install] 部分详细设定参数:

设定参数

参数意义说明

WantedBy

这个设定后面接的大部分是 *.target unit,说明此 unit 附挂在哪一个 target unit 底下 ,一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 下

Also

当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也 enable 的意思,也就是具有相依性的 服务可以写在这里

如果修改了此文件,执行 systemctl deamon-reload 命令重新加载此服务。

自动启动 Gunicorn 服务的范例:

# /lib/systemd/system/gunicorn-zzzsdust.com.conf.service

[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的用户
User=zzz
# 你的目录
WorkingDirectory=/home/zzz/sites/zzzsdust.com/blogproject
# gunicorn启动命令
ExecStart=/home/zzz/env/dj_env/bin/gunicorn --bind unix:/tmp/zzzsdust.com.socket blogproject.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target

CentOS 7.x 预设启动的服务简易说明


  • atd: (系统)单一的例行性工作排程,抵挡机制的配置文件在 /etc/at.{allow,deny} 中
  • auditd: 可以让系统需 SELinux 稽核的信息写入 /var/log/audit/audit.log
  • cpupower: (系统)提供 CPU 的运作规范,可以参考 /etc/sysconfig/cpupower 得到更多的信息
  • crond:(系统)系统配置文件为 /etc/crontab
  • firewalld:(系统/网络)就是防火墙,以前有 iptables 与 ip6tables 等防火墙机制,新的 firewalld 搭配 firewall-cmd 指令,可以快速的建置好你的防火墙系统
  • rsyslog: (系统)这个服务可以记录系统所产生的各项讯息, 包括 /var/log/messages 内的几个重要的登录档