在Linux中,systemd是排名第1的守护进程,它管理着很多服务单元(service unit),运行下面这个命令就能查询得到:
# systemd --type help
显示的结果是12种业务单元:
service,服务单元
一个或多个守护进程共同协作,向系统用户提供的一种功能,其名称后通常是.service,如firewalld.service提供的是防火墙服务,其功能包括规则的添加、修改、查询、删除,及使用netfilter来进行数据包过滤等等。这一类业务通常访问量较大,业务频繁。
而守护进程则是在后台运行的程序,一般跟着系统的关停而关停,且多以d为其名称最后一个字母,如firewalld。
systemctl --type=service
# find /lib/systemd/system/ -name "*.service" | xargs grep Type
会发现,service按照其运行的特性又被分成至少6大类:
1、oneshot
2、dbus
3、forking
4、idle
5、simple
6、notify
socket - 套接字单元
它负责一个进程与另一个进程的通信,即IPC - inter-process communication。进程A创建了一个套接字,等着别的进程来通信;进程B去连接那个套接字时,systemd会启动一个守护进程,将套接字提供给进程B。启动时,会有意将套接字的启动过程加以延时。通常套接字的访问不会太频繁。
target - 目标状态单元
以.target为后缀的配置文件,负责将一组相关的服务单元组合在一起,以提供某个特定的运行环境。如multi-user.target是一个字符界面的窗口,graphical.target则是一个图形界面的窗口。
device
mount - 挂载单元
挂载服务,其配置文件都以xxxx.mount命名,都是由systemd管理的、系统中挂载的文件系统。比如那个鼎鼎有名的/tmp的挂载,其配置文件存放在/lib/systemd/system/tmp.mount
[root@localhost system]# cat tmp.mount
# 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=Temporary Directory
Documentation=man:hier(7)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime# Make 'systemctl enable tmp.mount' work:
[Install]
WantedBy=local-fs.target
我看到一个配置文件名叫/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount,那么肯定有一个挂载到一个名叫/var/lib/nfs/rpc_pipefs的目录。# mount | grep rpc_pipefs
automount
snapshot
timer - 计时单元
设定某项服务的动作时间点,其配置文件以.timer为后缀。而被它设定的服务通常与它同名。如:
# cat chrony-dnssrv@.timer
[Unit]
Description=Periodic DNS SRV lookup of %I for chrony[Timer]
OnActiveSec=0 #活跃时马上就去找chrony玩耍
OnUnitInactiveSec=1h #自个儿呆1小时后再去找chrony玩耍[Install]
WantedBy=timers.target
----------------------------------------------------------# cat chrony-dnssrv@.service
[Unit]
Description=DNS SRV lookup of %I for chrony
After=chronyd.service network-online.target
Wants=network-online.target[Service]
Type=oneshot
ExecStart=/usr/libexec/chrony-helper update-dnssrv-servers %I
swap
path - 路径单元
路径服务(path service)负责监看某一个路径(目录),只有那个路径或目录发生变化时,才启动某项相关的服务,如打印共享的spool路径。
slice - 切片服务单元
slice,切片,是用来将多个相关进程集中管理起来的一种服务单元。在切片服务单元(slice units)里,可以针对其管理的进程组添加诸如CPU、内存等系统资源的限制。systemd管理的切片,形象地讲,都是cgroup下的树状节点。切片的名称都以.slice结尾。Linux中有4种初始的slice,如:
- -.slice,这是切片上最高的节点,又称为“根切片”(root slice)
- system.slice,通常管理的是服务单元(service unit),以及范围单元(scope unit)
- machine.slice,虚拟机和容器都属于本切片
- user.slice,用户的登录session则属于本切片,包括所有跟用户有关的进程
上图:一个服务的切片示意图
scope - 范围单元
范围单元,专门管理由外部访问激发的进程,不能自己派生子进程,且只能由程序调用scope服务。
本单元运行的方式是将一组进程集中起来管理,以达到统筹使用系统资源的目的。