[TOC]

0x00 快速入门

描述:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进 程和其它进程,systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体,所以说它也能在 /etc/init.d/启动脚本 进行扫描查看相程序;

优先级从低到高各自是:

  • /usr/lib/systemd/system/: 软件包安装的单元 #(Centos)
  • /etc/systemd/system/: 系统管理员安装的单元 #(Ubuntu)
  • /etc/init.d/ :软件安装服务单元
  • 当systemd执行在用户模式下时,使用的载入路径是全然不同的;systemd 单元名仅能包括 ASCII 字符, 下划线和点号. 其它字符须要用 C-style “\x2d” 替换. 參阅 man systemd.unit 和 man systemd-escape.}}

Systemctl 新特性:

  • 系统引导时实现服务并行启动
  • 按需启动守护进程
  • 自动化的服务依赖关系管理
  • 同时采用socket式与D-Bus总线式激活服务
  • 系统状态快照

0x01 语法和参数

描述:systemd核心概念unit(单元)类型:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息;

systemctl help <单元> ## 显示单元的手冊页(必须由单元文件提供):

#unit类型或者单元:
service :文件扩展名为.service, 用于定义系统服务
target :文件扩展名为.target,用于模拟实现运行级别
device :用于定义内核识别的设备
mount:定义文件系统挂载点
socket:用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
snapshot :管理系统快照
swap:用于标识swap设备
automount :文件系统的自动挂载点
path:用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务


service unit文件格式说明(类似于windows下的ini):

man systemd.service  #参考

[unit]
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
Wants:依赖到的其它units,弱依赖
Conflicts:定义units间的冲突关系

[Service] #与特定类型相关的专用选项;此处为Service类型
Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname=才行
notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
EnvironmentFile=/etc/sysconfig/sshd #环境file
ExecStart=/usr/sbin/sshd -D $OPTIONS #启动
ExecReload=/bin/kill -HUP $MAINPID #重启
KillMode=process #关闭
Restart=on-failure # Restart: fail 时重启
RestartSec=42s

[Target]
#.target定义了一些基础的组件,供.service文件调用

[Mount]
#.mount文件定义了一个挂载点,[Mount]节点里配置了What,Where,Type三个数据项
#等同于以下命令:mount -t hugetlbfs /dev/hugepages hugetlbfs
What=hugetlbfs
Where-/dev/hugepages
Type=hugetlbfs


[Install]:#定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖 多用户模式下需要的
Also:安装本服务的时候还要安装别的相关服务


0x02 实际案例

实际案例:

#示例1.自启与启动等等常用命令
systemctl enable nginx.service
systemctl disable xinetd.service #关闭自启动服务

systemctl start nginx.service
systemctl stop xinetd.service #停止服务
systemctl restart xinetd.service #重启服务
systemctl status firewalld #查看状态
systemctl status cobbler.service
# ● cobbler.service - SYSV: cobbler
# Loaded: loaded (/etc/rc.d/init.d/cobbler; bad; vendor preset: disabled)
# Active: inactive (dead)
# Docs: man:systemd-sysv-generator(8)

#重载修改过的所有配置文件必须执行
systemctl daemon-reload


#示例2.查看服务是否开机启动,服务是否激活
$systemctl is-enabled firewalld.service
# disabled
systemctl is-enabled sshd.service
# enabled
systemctl is-active sshd
# active


#示例3.列出 systemd目录下面的服务并查看器状态
systemctl list-unit-files
systemctl list-unit-files | grep mysqld #查看mysqld服务是不是启动
systemctl list-unit-files | grep enabled #查看已启动的服务列表
# auditd.service enabled
# [email protected] enabled
# chronyd.service enabled
# crond.service enabled


#示例4.启动失败的服务列表
systemctl list-unit-files --failed
# UNIT FILE STATE
# 0 unit files listed.
$systemctl list-units --type=target #获取当前目标

#示例5.欲查看对特定 target 启用的服务请执行
systemctl list-dependencies
systemctl list-dependencies [target]
systemctl list-dependencies microcode.service
# microcode.service
# ● ├─system.slice
# ● └─basic.target
# │ └─...
#注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务,SysV 配置数据可能被原生 systemd 配置覆盖。


#示例9.切换启动级别/目标
systemctl isolate graphical.target #等价于telinit 3 或 telinit 5。
#示例6.设置并查看当前运行等级
$systemctl get-default
graphical.target
#当前为 graphical.target 修改为命令模式multi-user.target:
$systemctl set-default multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'
#能够在 systemctl 的输出中看到命令执行的效果:链接 /etc/systemd/system/default.target 被创建。指向新的默认启动级别。


#示例7.查看unit中的类型
systemctl -t service
# UNIT LOAD ACTIVE SUB DESCRIPTION
# auditd.service loaded active running Security Auditing Service
systemctl --type target
# UNIT LOAD ACTIVE SUB DESCRIPTION
# basic.target loaded active active Basic System


#示例8.禁用和取消禁用单元
# 禁用一个单元(禁用后,间接启动也是不可能的):
systemctl mask <单元>
# 取消禁用一个单元:
systemctl unmask <单元>


#示例8.电源管理
#安装 polkit 后才干够一般用户身份使用电源管理。
#假设你正登录在一个本地的systemd-logind用户会话。且当前没有其它活动的会话。那么下面命令无需root权限就可以执行。否则(比如当前有还有一个用户登录在某个tty),systemd 将会自己主动请求输入rootpassword。
$ systemctl reboot #重新启动
$ systemctl poweroff #退出系统并停止电源
$ systemctl suspend #待机
$ systemctl hibernate #休眠
$ systemctl hybrid-sleep #混合休眠模式(同一时候休眠到硬盘并待机):


0x02 改动单元文件

为了避免和 pacman 冲突,不应该直接编辑软件包提供的文件. 要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的文件夹(如 /etc/systemd/system/httpd.service.d/)。
然后放入 *.conf 文件,当中能够加入或重置參数,这里设置的參数优先级高于原来的单元文件。

实际案例:

#1.比如假设想加入一个额外的依赖。创建这么一个文件就可以:
/etc/systemd/system/<unit>.d/customdependency.conf
[Unit]
Requires=<新依赖>
After=<新依赖>

/etc/systemd/system/unit.d/customexec.conf
[Service]
#想知道为什么改动 ExecStart 前必须将其置空
ExecStart=
ExecStart=new command

#自己主动重新启动服务
Restart=always
RestartSec=30


#2.然后执行下面命令使更改生效:
systemctl daemon-reload
systemctl restart <单元>

此外,把旧的单元文件从 /usr/lib/systemd/system/ 拷贝到 /etc/systemd/system/,然后进行改动,也能够达到相同效果。

总结:

  • 在 /etc/systemd/system/ 文件夹中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 文件夹中的同名单元文件
  • 用 systemd-delta 命令来查看哪些单元文件被覆盖、哪些被改动,系统维护的时候须要及时了解哪些单元已经有了更新。


0x03 目标(target)

如今,systemd 引入了一个和启动级别(一个旧的概念)功能相似又不同的概念——目标(target)。
不像数字表示的启动级别,每一个目标都有名字和独特的功能,而且能同一时候启用多个,一些目标继承其它目标的服务,并启动新服务。

#目标表
SysV 启动级别 Systemd 目标 凝视
0 runlevel0.target, poweroff.target 中断系统(halt)
1, s, single runlevel1.target, rescue.target 单用户模式
2, 4 runlevel2.target, runlevel4.target, multi-user.target 用户自己定义启动级别。通常识别为级别3。
3 runlevel3.target, multi-user.target 多用户,无图形界面。用户能够通过终端或网络登录。
5 runlevel5.target, graphical.target 多用户。图形界面。继承级别3的服务。并启动图形界面服务。
6 runlevel6.target, reboot.target 重新启动
emergency emergency.target 急救模式(Emergency shell)