引导系统上的目标和单元文件

引导系统上的目标和单元文件

在过去的几天里,我一直在浏览有关目标(称为运行级别)的所有文档和示例,但我仍然对这个主题感到困惑。

谁能解释一下 init 中的运行级别和 systemd 中的目标之间的区别?就启动过程而言,什么是单元文件?

答案1

运行级别与目标的基础知识

背景

在 sysV (init) 中,运行级别只是一个数字,0-6。系统只能设置为特定的运行级别,通常为 3(网络 + 控制台)或 5(X windows)。 sysV 中的这些运行级别仅仅是主进程init在任何给定时间可能处于的状态。对于 systemd,目标具有类似的目的,但可以同时应用多个目标。

https://wiki.archlinux.org/index.php/systemd#Targets

systemd 使用的目标与运行级别的用途相似,但行为略有不同。每个目标都被命名而不是编号,旨在服务于特定目的,并且可以同时激活多个目标。某些目标是通过继承另一个目标的所有服务并向其添加附加服务来实现的。有一些 systemd 目标模仿常见的 SystemVinit 运行级别,因此您仍然可以使用熟悉的 telinit RUNLEVEL 命令切换目标。

SS1

目标

考虑到这种能力,在 systemd 中,一个有网络的典型系统,但 target 中没有运行multi-user.targetX。

$ 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 构建的系统启动时,它会处理单元文件以构建挂载、设置套接字和启动服务。这些东西的顺序由单元文件控制。

参考

相关内容