在过去的几天里,我一直在浏览有关目标(称为运行级别)的所有文档和示例,但我仍然对这个主题感到困惑。
谁能解释一下 init 中的运行级别和 systemd 中的目标之间的区别?就启动过程而言,什么是单元文件?
答案1
运行级别与目标的基础知识
背景
在 sysV (init) 中,运行级别只是一个数字,0-6。系统只能设置为特定的运行级别,通常为 3(网络 + 控制台)或 5(X windows)。 sysV 中的这些运行级别仅仅是主进程init
在任何给定时间可能处于的状态。对于 systemd,目标具有类似的目的,但可以同时应用多个目标。
systemd 使用的目标与运行级别的用途相似,但行为略有不同。每个目标都被命名而不是编号,旨在服务于特定目的,并且可以同时激活多个目标。某些目标是通过继承另一个目标的所有服务并向其添加附加服务来实现的。有一些 systemd 目标模仿常见的 SystemVinit 运行级别,因此您仍然可以使用熟悉的 telinit RUNLEVEL 命令切换目标。
目标
考虑到这种能力,在 systemd 中,一个有网络的典型系统,但 target 中没有运行multi-user.target
X。
$ systemctl get-default
multi-user.target
但目标是许多目标的封装(分组)。这是 systemd 相对于 sysV 的主要优势之一。如果您查看目标文件,您可以看到这一点。
systemd.target 手册页名称以“.target”结尾的单元配置文件编码有关 systemd 目标单元的信息,用于对单元进行分组以及启动期间众所周知的同步点。 ....
....它们的存在只是为了通过依赖关系(可用作启动目标)对单元进行分组,并为单元之间的依赖关系中使用的同步点建立标准化名称。除此之外,目标单元是经典 SysV init 系统中 SysV 运行级别的更灵活的替代品。 (出于兼容性原因,存在特殊目标单元,例如 runlevel3.target,它们由 systemd 中的 SysV 运行级别兼容性代码使用。有关详细信息,请参阅 systemd.special(7))。
例如:
$ grep target /usr/lib/systemd/system/anaconda.target
Requires=basic.target
After=basic.target
笔记:这里anaconda.target
要求basic.target
已经运行,并且它必须在 后运行basic.target
。
从我的 CentOS 7.x 系统中,我们可以看到加载了哪些目标:
$ systemctl list-units --type=target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
cryptsetup.target loaded active active Local Encrypted Volumes
getty-pre.target loaded active active Login Prompts (Pre)
getty.target loaded active active Login Prompts
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network-online.target loaded active active Network is Online
network.target loaded active active Network
nfs-client.target loaded active active NFS client services
paths.target loaded active active Paths
remote-fs-pre.target loaded active active Remote File Systems (Pre)
remote-fs.target loaded active active Remote File Systems
rpc_pipefs.target loaded active active rpc_pipefs.target
slices.target loaded active active Slices
sockets.target loaded active active Sockets
swap.target loaded active active Swap
sysinit.target loaded active active System Initialization
timers.target loaded active active Timers
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.
19 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
systemd 中的单位是什么?
systemd 中的单元文件只是定义 5 件事之一的配置文件。例如,单位可以是:
- 服务(.service)
- 挂载点 (.mount)
- 设备(.device)
- 套接字(.socket)
- 目标(.target)
在 CentOS 7.x 上,您可以在该目录下看到这些单元文件:
$ for i in target socket service device mount;do ls -l /usr/lib/systemd/system | grep $i | head -3;done
-rw-r--r-- 1 root root 415 May 3 16:05 anaconda.target
-rw-r--r-- 1 root root 517 Apr 11 03:36 basic.target
drwxr-xr-x. 2 root root 4096 Jul 28 14:56 basic.target.wants
-rw-r--r-- 1 root root 874 Apr 10 23:42 avahi-daemon.socket
-r--r--r-- 1 root root 131 Apr 11 01:03 cups.socket
-rw-r--r-- 1 root root 102 Apr 11 03:23 dbus.socket
-rw-r--r-- 1 root root 275 Apr 27 10:53 abrt-ccpp.service
-rw-r--r-- 1 root root 380 Apr 27 10:53 abrtd.service
-rw-r--r-- 1 root root 361 Apr 27 10:53 abrt-oops.service
-rw-r--r-- 1 root root 169 Apr 12 15:28 [email protected]
-rw-r--r-- 1 root root 670 Apr 11 03:36 dev-hugepages.mount
-rw-r--r-- 1 root root 590 Apr 11 03:36 dev-mqueue.mount
开机
当使用 systemd 构建的系统启动时,它会处理单元文件以构建挂载、设置套接字和启动服务。这些东西的顺序由单元文件控制。