17.1 什么是 daemon 与服务 (service)
常驻在记体体中的程序,且可以提 供一些系统或网络功能,那就是服务
系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个 服务就称为 service 。达 成这个 service 的程序我们就称呼他为 daemon
这些服务的名称被创建之后,被挂上 Linux 使用 时,通常在服务的名称之后会加上一个 d
17.1.1 早期 System V 的 init 管理行为中 daemon 的主要分类 (Optional)
Unix 的 system V 版本启动系统服务的管理方式被称为 SysV 的 init 脚本程序的处理方式!亦即系统核 心第一支调用的程序是 init , 然后 init 去唤起所有的系统所需要的服务,不论是本机服务还 是网络服务就是了。
基本上 init 的管理机制有几个特色如下:
-
服务的启动、关闭与观察等方式: 所有的服务启动脚本通通放置于 /etc/init.d/ 下面,基 本上都是使用 bash shell script 所写成的脚本程序,需要启动、关闭、重新启动、观察状 态时, 可以通过如下的方式来处理:
-
启动:/etc/init.d/daemon start
-
关闭:/etc/init.d/daemon stop
-
重新启动:/etc/init.d/daemon restart
-
状态观察:/etc/init.d/daemon status
-
-
服务启动的分类: init 服务的分类中,依据服务是独立启动或被一只总管程序管理而分为 两大类:
-
独立启动模式 (stand alone)
-
总管程序 (super daemon):由特殊的 xinetd 或 inetd 这两个总管程序提供 socket 对应或 port 对应的管理。
-
-
服务的相依性问题:init 在管理员自己手动处理这些 服务时,是没有办法协助相依服务的唤醒的!
-
执行等级的分类:init 是开机后核心主动调用的, 然后 init 可以根据使用者自 订的执行等级 (runlevel) 来唤醒不同的服务,以进入不同的操作界面。基本上 Linux 提供 7 个执行等级,分别是 0, 1, 2...6 , 比较重要的是 1)单人维护模式、3)纯文本模 式、5)文字加图形界面。而各个执行等级的启动脚本是通过 /etc/rc.d/rc[0- 6]/SXXdaemon 链接到 /etc/init.d/daemon , 链接文件名 (SXXdaemon) 的功能为: S 为启动该服务,XX是数字,为启动的顺序。由于有 SXX 的设置,因此在开机时可以“依 序执行”所有需要的服务, 同时也能解决相依服务的问题。这点与管理员自己手动处理不 太一样就是了。
-
制定执行等级默认要启动的服务:若要创建如上提到的 SXXdaemon 的话,不需要管理员手动创建链接文件, 通过如下的指令可以来处理默认启动、默认不启动、观察默认启 动否的行为:
-
默认要启动: chkconfig daemon on
-
默认不启动: chkconfig daemon off
-
观察默认为启动否: chkconfig --list daemon
-
-
执行等级的切换行为: 当你要从纯命令行 (runlevel 3) 切换到图形界面 (runlevel 5), 不需要手动启动、关闭该执行等级的相关服务,只要“ init 5 ”即可切换,init 这小子 会主动去分析 /etc/rc.d/rc[35].d/ 这两个目录内的脚本, 然后启动转换 runlevel 中需要的 服务~就完成整体的 runlevel 切换
CentOS 7 已经不使用 init 来管理服 务了,不过因为考虑到某些脚本没有办法直接塞入 systemd 的处理,因此这些脚本还是被保 留下来
17.1.2 systemd 使用的 unit 分类
从 CentOS 7.x 以后,Red Hat 系列的 distribution 放弃沿用多年的 System V 开机启动服务的 流程,就是前一小节提到的 init 启动脚本的方法, 改用 systemd 这个启动服务管理机制~
systemd 有什么好处呢?
-
平行处理所有服务,加速开机流程:旧的 init 启动脚本是“一项一项任务依序启动”的模 式
-
一经要求就回应的 on-demand 启动方式: systemd 全部就是仅有一只 systemd 服务搭 配 systemctl 指令来处理,无须其他额外的指令来支持。不像 systemV 还要 init, chkconfig, service... 等等指令。 此外, systemd 由于常驻内存,因此任何要求 (on- demand) 都可以立即处理后续的 daemon 启动的任务。
-
服务相依性的自我检查: 由于 systemd 可以自订服务相依性的检查,因此如果 B 服务是 架构在 A 服务上面启动的,那当你在没有启动 A 服务的情况下仅手动启动 B 服务时, systemd 会自动帮你启动 A 服务
-
依 daemon 功能分类:systemd 先定义所有的服务为一个服务单位 (unit),并将该 unit 归类到不同的服务类型 (type) 去。 旧的 init 仅分为 stand alone 与 super daemon 实在不够看,systemd 将服务单位 (unit) 区分为 service, socket, target, path, snapshot, timer 等多种不同的类型(type)
-
将多个 daemons 集合成为一个群组:如同 systemV 的 init 里头有个 runlevel 的特色, systemd 亦将许多的功能集合成为一个所谓的 target 项目,这个项目主要在设计操作环 境的创建, 所以是集合了许多的 daemons,亦即是执行某个 target 就是执行好多个 daemon 的意思!
-
向下相容旧有的 init 服务脚本: 基本上, systemd 是可以相容于 init 的启动脚本的,因 此,旧的 init 启动脚本也能够通过 systemd 来管理,只是更进阶的 systemd 功能就没有 办法支持就是了。
systemd 也是有些地方无法完全取代 init 的!包括:
-
在 runlevel 的对应上,大概仅有 runlevel 1, 3, 5 有对应到 systemd 的某些 target 类型而 已,没有全部对应;
-
全部的 systemd 都用 systemctl 这个管理程序管理,而 systemctl 支持的语法有限制,不 像 /etc/init.d/daemon 就是纯脚本可以自订参数,systemctl 不可自订参数
-
如果某个服务启动是管理员自己手动执行启动,而不是使用 systemctl 去启动的 (例如 你自己手动输入 crond 以启动 crond 服务),那么 systemd 将无法侦测到该服务,而无 法进一步管理。
-
systemd 启动过程中,无法与管理员通过 standard input 传入讯息!因此,自行撰写 systemd 的启动设置时,务必要取消互动机制
systemd 的配置文件放置目录
systemd 将过去所谓的 daemon 执行脚本通通称为一个服务单位 (unit),而每种 服务单位依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、 数据监听与交换的插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等 级分类的操作环境 (target) 等等
配置文件都放置在下面的目录中:
-
/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/ 下面的
systemd 的 unit 类型分类说明
[root@VM-72-146-centos ~]# ll /usr/lib/systemd/system/ | grep -E '(vsftpd|multi|cron)'
-rw-r--r-- 1 root root 318 Nov 8 2019 crond.service
-rw-r--r-- 1 root root 492 Dec 9 2020 multi-user.target
drwxr-xr-x 2 root root 4096 Jul 29 2021 multi-user.target.wants
lrwxrwxrwx 1 root root 17 Jul 29 2021 runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Jul 29 2021 runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Jul 29 2021 runlevel4.target -> multi-user.target
系统服务 (service)
multi-user 要算是执行 环境相关的类型 (target type)
几种比较常见 的 systemd 的服务类型如下:
扩展名 | 主要服务功能 |
---|---|
.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 更加有弹性! |
17.2 通过 systemctl 管理服务
跟以前 systemV 需要 service / chkconfig / setup / init 等指令来协助不同, systemd 就是仅有 systemctl 这个指令来处理
17.2.1 通过 systemctl 管理单一服务 (service unit) 的启动/ 开机启动与观察状态
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@VM-72-146-centos ~]# 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 Mon 2022-09-26 08:45:21 CST; 54min ago
Main PID: 1509 (atd)
Tasks: 1
Memory: 532.0K
CGroup: /system.slice/atd.service
└─1509 /usr/sbin/atd -f
Sep 26 08:45:21 VM-72-146-centos systemd[1]: Started Job spooling tools.
# Loaded:这行在说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动
# Active:现在这个 unit 的状态是正在执行 (running) 或没有执行 (dead)
# 后面几行则是说明这个 unit 程序的 PID 状态以及最后一行显示这个服务的登录文件信息!
# 登录文件信息格式为:“时间” “讯息发送主机” “哪一个服务的讯息” “实际讯息内容”
# 所以上面的显示讯息是:这个 atd 默认开机就启动,而且现在正在运行的意思!
范例二:正常关闭这个 atd 服务
[root@study ~]# systemctl stop atd.service
[root@study ~]# systemctl status atd.service
常见的 daemon 状态:
-
active (running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执行 中的 vsftpd 就是这种模式
-
active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这种模式! quotaon 不须一直执行~只须执行一次之后,就交给文件系统去自行处理啰!通常用 bash shell 写的小型服务,大多是属于这种类型 (无须常驻内存)。
-
active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来 说,打印的伫列相关服务就是这种状态! 虽然正在启动中,不过,也需要真的有伫列进 来 (打印工作) 这样他才会继续唤醒打印机服务来进行下一步打印的功能。
-
inactive:这个服务目前没有运行的意思。
daemon 的默认状态:
-
enabled:这个 daemon 将在开机时被执行
-
disabled:这个 daemon 在开机时不会被执行
-
static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled 的服务来唤醒 (相依属性的服务)
-
mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可通过 systemctl unmask 方式改回原本状态
服务启动/关闭与观察的练习
# 1\. 观察一下状态,确认是否为关闭/未启动呢?
systemctl status chronyd.service
# 2\. 由上面知道目前是启动的,因此立刻将他关闭,同时开机不会启动才行!
systemctl stop chronyd.service
systemctl disable chronyd.service
# 启动服务
systemctl start chronyd.service
# 注销
systemctl mask cups.service
# 取消注销
systemctl unmask cups.service
17.2.2 通过 systemctl 观察系统上所有的服务
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
systemctl
# 列出的项目中,主要的意义是:
# UNIT :项目的名称,包括各个 unit 的类别 (看扩展名)
# LOAD :开机时是否会被载入,默认 systemctl 显示的是有载入的项目而已喔!
# ACTIVE :目前的状态,须与后续的 SUB 搭配!就是我们用 systemctl status 观察时,active 的项目!
# DESCRIPTION :详细描述啰
# 另外,systemctl 都不加参数,其实默认就是 list-units 的意思!
# 范例二:列出所有已经安装的 unit 有哪些?
systemctl list-unit-files
# 只想要知道 service 这种类别的 daemon 而已,而 且不论是否已经启动,通通要列出来
systemctl list-units --type=service --all
# 范例一:查询系统上是否有以 cpu 为名的服务?
systemctl list-units --type=service --all | grep cpu
17.2.3 通过 systemctl 管理不同的操作环境 (target unit)
# 列出跟操作界面 比较有关的 target 项目
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 时,可以尝试使用这种模式!
-
shutdown.target:就是关机的流程。
-
getty.target:可以设置你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个 东西的配置文件!
正常的模式是 multi-user.target 以及 graphical.target 两个,救援方面的模式主要是 rescue.target 以及更严重的 emergency.target。 如果要修改可提供登陆的 tty 数量,则修改 getty.target 项目
systemctl [command] [unit.target]
选项与参数:
command:
get-default :取得目前的
target set-default :设置后面接的 target 成为默认的操作模式
isolate :切换到后面接的模式
# 范例一:我们的测试机器默认是图形界面,先观察是否真为图形模式,再将默认模式转为文字界面
systemctl get-default
systemctl set-default multi-user.target
systemctl get-default
# 范例二:在不重新开机的情况下,将目前的操作环境改为纯文本模式,关掉图形界面
systemctl isolate multi-user.target
systemctl isolate graphical.target
在 service 部份 用 start/stop/restart 才对,在 target 项目则请使用 isolate (隔离不同的操作模式) 才对!
systemd 也提供了 数个简单的指令给我们切换操作模式之用
systemctl poweroff 系统关机
systemctl reboot 重新开机
systemctl suspend 进入暂停模式
systemctl hibernate 进入休眠模式
systemctl rescue 强制进入救援模式
systemctl emergency 强制进入紧急救援模式
暂停与休眠模式
-
suspend:暂停模式会将系统的状态数据保存到内存中,然后关闭掉大部分的系统硬件, 当然,并没有实际关机喔! 当使用者按下唤醒机器的按钮,系统数据会重内存中回复, 然后重新驱动被大部分关闭的硬件,就开始正常运行!唤醒的速度较快。
-
hibernate:休眠模式则是将系统状态保存到硬盘当中,保存完毕后,将计算机关机。当 使用者尝试唤醒系统时,系统会开始正常运行, 然后将保存在硬盘中的系统状态恢复回 来。因为数据是由硬盘读出,因此唤醒的性能与你的硬盘速度有关。
17.2.4 通过 systemctl 分析各服务之间的相依性
systemctl list-dependencies [unit] [--reverse]
选项与参数:
--reverse :反向追踪谁使用这个 unit 的意思!
# 范例一:列出目前的 target 环境下,用到什么特别的 unit
systemctl get-default
systemctl list-dependencies
# 谁还会用到我的服务
systemctl list-dependencies --reverse
# graphical.target 又使用了多少的服务
systemctl list-dependencies graphical.target
# multi-user.target 被哪些服务用到
systemctl list-dependencies --reverse multi-user.target
17.2.5 与 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 等等。
# socket file 放置在哪里
systemctl list-sockets
网络服务与端口对应简介
系统所有的功能都是某些程序 所提供的,而程序则是通过触发程序而产生的。同样的,系统提供的网络服务当然也是这样 的! 只是由于网络牵涉到 TCP/IP 的概念,所以显的比较复杂一些就是了。
IP 就是代表你的主机在网 际网络上面的“门牌号码”。主机是如何分辨不同的服 务要求呢?那就是通过埠号 (port number)
-
http://ftp.ksu.edu.tw/
-
ftp://ftp.ksu.edu.tw/
事实上,为了统一整个网际网络的埠号对应服务的功能,好让所有的主机都能够使用相同的 机制来提供服务与要求服务, 所以就有了“通讯协定”这玩意儿。也就是说,有些约定俗成的 服务都放置在同一个埠号上面啦!举例来说, 网址列上面的 http 会让浏览器向 WWW 服务器 的 80 埠号进行连线的要求!而 WWW 服务器也会将 httpd 这个软件启动在 port 80, 这样两 者才能够达成连线的!
让服务与埠号对应在一起的设置 /etc/services
cat /etc/services
# 第一栏为 daemon 的名称、第二栏为该 daemon 所使用的埠号与网络数据封 包协定
17.2.6 关闭网络服务
基本上,会产生一个网络监听端口 (port) 的程序,你就可以称他是个网络 服务了
# 观察网络端口
netstat -tlunp
# 查找 rsync 相关的服务
systemctl list-units --all | grep rsync
# 关闭服务
systemctl stop rsyncd.service
systemctl disable rsyncd.service
17.3 systemctl 针对 service 类型的配置文件
17.3.1 systemctl 配置文件相关目录简介
服务的管理是通过 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 之前,需要事先启动哪些服务的意思。
17.3.2 systemctl 配置文件的设置项目简介
[root@VM-72-146-centos ~]# cat /usr/lib/systemd/system/sshd.service
[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]
WantedBy=multi-user.target
将整个设置分为三个部份,就是:
-
[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] 部份
设置参数 | 参数意义说明 |
---|---|
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] 部份
设置参数 | 参数意义说明 |
---|---|
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 啰! |
17.3.3 两个 vsftpd 运行的实例
假设是这样:
-
默认的 port 21:使用 /etc/vsftpd/vsftpd.conf 配置文件,以及 /usr/lib/systemd/system/vsftpd.service 设置脚本;
-
特殊的 port 555:使用 /etc/vsftpd/vsftpd2.conf 配置文件,以及 /etc/systemd/system/vsftpd2.service 设置脚本。
# 1\. 先创建好所需要的配置文件
[root@study ~]# cd /etc/vsftpd
[root@study vsftpd]# cp vsftpd.conf vsftpd2.conf
[root@study vsftpd]# vim vsftpd.conf
#listen_port=555
# 2\. 开始处理启动脚本设置
[root@study vsftpd]# cd /etc/systemd/system
[root@study system]# cp /usr/lib/systemd/system/vsftpd.service vsftpd2.service
[root@study system]# vim vsftpd2.service
[Unit]
Description=Vsftpd second ftp daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf
[Install]
WantedBy=multi-user.target
# 3\. 重新载入 systemd 的脚本配置文件内容
[root@study system]# systemctl daemon-reload
[root@study system]# systemctl list-unit-files --all | grep vsftpd
[root@study system]# systemctl status vsftpd2.service
[root@study system]# systemctl restart vsftpd.service vsftpd2.service
[root@study system]# systemctl enable vsftpd.service vsftpd2.service
[root@study system]# systemctl status vsftpd.service vsftpd2.service
[root@study system]# netstat -tlnp
17.3.4 多重的重复设置方式:以 getty 为例
CentOS 7 开机完成后,不是说有 6 个终端机可以使用吗?就是那个 tty1~tty6 的啊! 那个东西是由 agetty 这个指令达成的。 OK!那么这个终端机的功能又是从哪个项目所提供 的呢?其实,那个东东涉及很多层面,主要管理的是 getty.target 这个 target unit , 不过,实 际产生 tty1~tty6 的则是由 [email protected] 所提供的!
[root@VM-72-146-centos ~]# cat /usr/lib/systemd/system/[email protected]
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service
# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes
# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by [email protected], not this
# unit.
ConditionPathExists=/dev/tty0
[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
[Install]
WantedBy=getty.target
DefaultInstance=tty1
注意 ExecStart 项目,-/sbin/agetty --noclear %I $TERM
man agetty 时,发现到它的语法应该是“ agetty --noclear tty1 ”之类的字样, 因此,我们如果要启动六个 tty 的时候,基本上应该要有 六个启动配置文件。亦即是可能会用到 getty1.service, getty2.service...getty6.service 才对! 哇!这样控管很麻烦啊~所以,才会出现这个 @ 的项目
先来看看 [email protected] 的上游,亦即是 getty.target
[email protected] [email protected]
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=multi-user.target
[email protected] [email protected]
systemd 就会这么作:
-
先看 /usr/lib/systemd/system/, /etc/systemd/system/ 有没有
[email protected]
的设置, 若有就执行,若没有则执行下一步; -
找 [email protected] 的设置,若有则将 @ 后面的数据带入成 %I 的变量,进入 [email protected] 执行!
这也就是说,其实 [email protected] 实际上是不存在的!他主要是通过 [email protected] 来 执行~也就是说, [email protected] 的目的是为了要简化多个执行的启动设置, 他的命名方式 是这样的:
原始文件:执行服务名称@.service
可执行文件案:执行服务名称@范例名称.service
再回头看看 [email protected] 的启动脚本:
ExecStart=-/sbin/agetty --noclear %I $TERM
%I 指的就是“范例名称”!根据 getty.target 的信息输出来看,[email protected] 的 %I 就是 tty1 啰!因此执行脚本就会变成“ /sbin/agetty --noclear tty1 ”! 所以我们才有办法 以一个配置文件来启动多个 tty1 给用户登陆啰!
将 tty 的数量由 6 个降低到 4 个
6 个 tty 是因为 systemd 的登陆配置文件 /etc/systemd/logind.conf 里面规范的
# 1\. 修改默认的 logind.conf 内容,将原本 6 个虚拟终端机改成 4 个
[root@study ~]# vim /etc/systemd/logind.conf
[Login]
NAutoVTs=4
ReserveVT=0
# 2\. 关闭不小心启动的 tty5, tty6 并重新启动 getty.target 啰!
[root@study ~]# systemctl stop [email protected]
[root@study ~]# systemctl stop [email protected]
[root@study ~]# systemctl restart systemd-logind.service
# 暂时需要启动 tty8
systemctl start [email protected]
暂时新增 vsftpd 到 2121 端口
根据前面 [email protected] 的说明,我们知道在启动的脚本设置当中, %i 或 %I 就是代表 @ 后面接的范例文件名的意思! 那我可以创建 vsftpd3.conf 文件,然后通过该文件来启动新 的服务
# 1\. 根据 [email protected] 的建议,于 /etc/vsftpd/ 下面先创建新的配置文件
[root@study ~]# cd /etc/vsftpd
[root@study vsftpd]# cp vsftpd.conf vsftpd3.conf
[root@study vsftpd]# vim vsftpd3.conf
listen_port=2121
# 2\. 暂时启动这个服务,不要永久启动他!
[root@study vsftpd]# systemctl start [email protected]
[root@study vsftpd]# systemctl status [email protected]
17.3.5 自己的服务自己作
假设我要作一只可以备份自己系统的服务,这只脚本我放在 /backups 下面,内容有点像这样:
[root@study ~]# vim /backups/backup.sh
#!/bin/bash
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log
[root@study ~]# chmod a+x /backups/backup.sh
# 记得要有可执行的权限才可以喔!
设计一只名为 backup.service 的启动脚本设置
[root@study ~]# vim /etc/systemd/system/backup.service
[Unit]
Description=backup my server
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c " echo /backups/backup.sh | at now"
[Install]
WantedBy=multi-user.target
# 因为 ExecStart 里面有用到 at 这个指令,因此, atd.service 就是一定要的服务!
[root@study ~]# systemctl daemon-reload
[root@study ~]# systemctl start backup.service
[root@study ~]# systemctl status backup.service
# 为什么 Active 是 inactive 呢?这是因为我们的服务仅是一个简单的 script 啊!
# 因此执行完毕就完毕了,不会继续存在内存中喔!
17.4 systemctl 针对 timer 的配置文件
在过去,我们大概都是使用 crond 这个服务来定期处理, 不过,既然现在有一直常驻 在内存当中的 systemd 这个好用的东西,加上这 systemd 有个协力服务,名为 timers.target 的家伙,这家伙可以协助定期处理各种任务!
systemd.timer 的优势
优点
-
由于所有的 systemd 的服务产生的信息都会被纪录 (log),因此比 crond 在 debug 上 面要更清楚方便的多;
-
各项 timer 的工作可以跟 systemd 的服务相结合;
-
各项 timer 的工作可以跟 control group (cgroup,用来取代 /etc/secure/limit.conf 的功 能) 结合,来限制该工作的资源利用
-
相对于 crond 最小的单位到分, systemd 是可以到秒甚至是毫 秒的单位
缺点
-
systemd 的 timer 并没有 email 通知的功能
-
没有类似 anacron 的一段时间内的随机取样功能 (random_delay)
其他略
17.5 CentOS 7.x 默认启动的服务简易说明
使用 systemctl list-unit-files --type=service
去查询
下面的建议主要是针对 Linux 单机服务器的 角色来说明的,不是桌上型的环境喔!
CentOS 7.x 默认 启动的服务内容
服务名称 | 功能简介 |
---|---|
abrtd | (系统)abrtd 服务可以提供使用者一些方式,让使用者可以针对不 同的应用软件去设计错误登录的机制, 当软件产生问题时,使用者 就可以根据 abrtd 的登录文件来进行错误克服的行为。还有其他的 abrt-xxx.service 均是使用这个服务来加强应用程序 debug 任务 的。 |
accounts-daemon(可关 闭) | (系统)使用 accountsservice 计划所提供的一系列 D-Bus 界面来 进行使用者帐号信息的查询。 基本上是与 useradd, usermod, userdel 等软件有关。 |
alsa-X(可关闭) | (系统)开头为 alsa 的服务有不少,这些服务大部分都与音效有 关!一般来说, 服务器且不开图形界面的话,这些服务可以关闭! |
atd | (系统)单一的例行性工作调度,详细说明请参考第十五章。 抵挡 机制的配置文件在 /etc/at.{allow,deny} 喔! |
auditd | (系统)还记得前一章的 SELinux 所需服务吧? 这就是其中一项, 可以让系统需 SELinux 稽核的讯息写入 /var/log/audit/audit.log 中。 |
avahi-daemon(可关闭) | (系统)也是一个用户端的服务,可以通过 Zeroconf 自动的分析与 管理网络。 Zeroconf 较常用在笔记本电脑与行动设备上,所以我们 可以先关闭他啦! |
brandbot rhel-* | (系统)这些服务大多用于开机过程中所需要的各种侦测环境的脚 本,同时也提供网络界面的启动与关闭。 基本上,你不要关闭掉这 些服务比较妥当! |
chronyd ntpd ntpdate | (系统)都是网络校正时间的服务!一般来说,你可能需要的仅有 chronyd 而已! |
cpupower | (系统)提供 CPU 的运行规范~可以参考 /etc/sysconfig/cpupower 得到更多的信息! 这家伙与你的 CPU 使 用情况有关喔! |
crond | (系统)系统配置文件为 /etc/crontab,详细数据可参考第十五章的 说明。 |
cups(可关闭) | (系统/网络)用来管理打印机的服务,可以提供网络连线的功能, 有点类似打印服务器的功能哩! 你可以在 Linux 本机上面以浏览器的 http://localhost:631 来管理打印机喔!由于我们目前没有打印 机,所以可以暂时关闭他。 |
dbus | (系统)使用 D-Bus 的方式在不同的应用程序之间传送讯息, 使 用的方向例如应用程序间的讯息传递、每个使用者登陆时提供的讯 息数据等。 |
dm-event multipathd | (系统)监控设备对应表 (device mapper) 的主要服务,当然不 能关掉啊! 否则就无法让 Linux 使用我们的周边设备与储存设备 了! |
dmraid-activation mdmonitor | (系统)用来启动 Software RAID 的重要服务!最好不要关闭啦! 虽然你可能没有 RAID。 |
dracut-shutdown | (系统)用来处理 initramfs 的相关行为,这与开机流程相关性较高 ~ |
ebtables | (系统/网络)通过类似 iptables 这种防火墙规则的设置方式,设计 网卡作为桥接时的封包分析政策。 其实就是防火墙。不过与下面谈 到的防火墙应用不太一样。如果没有使用虚拟化,或者启用了 firewalld ,这个服务可以不启动。 |
emergency rescue | (系统)进入紧急模式或者是救援模式的服务 |
firewalld | (系统/网络)就是防火墙!以前有 iptables 与 ip6tables 等防火墙 机制,新的 firewalld 搭配 firewall-cmd 指令,可以快速的创建好你 的防火墙系统喔!因此,从 CentOS 7.1 以后,iptables 服务的启动 脚本已经被忽略了! 请使用 firewalld 来取代 iptables 服务喔! |
gdm | (系统)GNOME 的登陆管理员,就是图形界面上一个很重要的登 陆管理服务! |
getty@ | (系统)就是要在本机系统产生几个文字界面 (tty) 登陆的服务 啰! |
hyper ksm libvirt* vmtoolsd | (系统)跟创建虚拟机有关的许多服务!如果你不玩虚拟机, 那么 这些服务可以先关闭。此外,如果你的 Linux 本来就在虚拟机的环 境下,那这些服务对你就没有用!因为这些服务是让实体机器来创 建虚拟机的! |
irqbalance | (系统)如果你的系统是多核心的硬件,那么这个服务要启动, 因 为它可以自动的分配系统中断 (IRQ) 之类的硬件资源。 |
iscsi* | (系统)可以挂载来自网络磁盘机的服务!这个服务可以在系统内 仿真好贵的 SAN 网络磁盘。 如果你确定系统上面没有挂载这种网 络磁盘,也可以将他关闭的。 |
kdump(可关闭) | (系统)在安装 CentOS 的章节就谈过这东西,主要是 Linux 核心 如果出错时,用来纪录内存的东西。 鸟哥觉得不需要启动他!除非 你是核心骇客! |
lvm2-* | (系统)跟 LVM 相关性较高的许多服务,当然也不能关!不然系统 上面的 LVM2 就没人管了! |
microcode | (系统)Intel 的 CPU 会提供一个外挂的微指令集提供系统运行, 不过,如果你没有下载 Intel 相关的指令集文件,那么这个服务不需 要启动的,也不会影响系统运行。 |
ModemManager network NetworkManager* | (系统/网络)主要就是调制解调器、网络设置等服务!进入 CentOS 7 之后,系统似乎不太希望我们使用 network 服务了, 比 较建议的是使用 NetworkManager 搭配 nmcli 指令来处理网络设置 ~所以,反而是 NetworkManager 要开,而 network 不用开哩! |
quotaon | (系统)启动 Quota 要用到的服务喔! |
rc-local | (系统)相容于 /etc/rc.d/rc.local 的调用方式!只是,你必须要让 /etc/rc.d/rc.local 具有 x 的权限后, 这个服务才能真的运行!否 则,你写入 /etc/rc.d/rc.local 的脚本还是不会运行的喔! |
rsyslog | (系统)这个服务可以记录系统所产生的各项讯息, 包括 /var/log/messages 内的几个重要的登录文件啊。 |
smartd | (系统)这个服务可以自动的侦测硬盘状态,如果硬盘发生问题的 话, 还能够自动的回报给系统管理员,是个非常有帮助的服务喔! 不可关闭他啊! |
sysstat | (系统)事实上,我们的系统有只名为 sar 的指令会记载某些时间 点下,系统的资源使用情况,包括 CPU/流量/输入输出量等, 当 sysstat 服务启动后,这些纪录的数据才能够写入到纪录档 (log) 里面去! |
systemd-* | (系统)大概都是属于系统运行过程所需要的服务,没必要都不要 更动它的默认状态! |
plymount* upower | (系统)与图形界面的使用相关性较高的一些服务!没启动图形界 面时,这些服务可以暂时不管他! |
其他服 务的简 易说明
服务名称 | 功能简介 |
---|---|
dovecot | (网络)可以设置 POP3/IMAP 等收受信件的服务,如果你的 Linux 主机是 email server 才需要这个服务,否则不需要启动他啦! |
httpd | (网络)这个服务可以让你的 Linux 服务器成为 www server 喔! |
named | (网络)这是领域名称服务器 (Domain Name System) 的服务, 这个服务 非常重要,但是设置非常困难!目前应该不需要这个服务啦! nfs nfs- |
server | (网络)这就是 Network Filesystem,是 Unix-Like 之间互相作为网络磁盘机 的一个功能。 smb |
nmb | (网络)这个服务可以让 Linux 仿真成为 Windows 上面的网络上的芳邻。 如 果你的 Linux 主机想要做为 Windows 用户端的网络磁盘机服务器,这玩意儿 得要好好玩一玩。 |
vsftpd | (网络)作为文件传输服务器 (FTP) 的服务。 |
sshd | (网络)这个是远端连线服务器的软件功能, 这个通讯协定比 telnet 好的地 方在于 sshd 在传送数据时可以进行加密喔!这个服务不要关闭他啦! |
rpcbind | (网络)达成 RPC 协定的重要服务!包括 NFS, NIS 等等都需要这东西的协 助! |
postfix | (网络)寄件的邮件主机~因为系统还是会产生很多 email 讯息!例如 crond / atd 就会传送 email 给本机用户! 所以这个服务千万不能关!即使你不是 mail server 也是要启用这服务才行! |