基本概述¶
systemd
,也称为 系统守护进程,是一种在 GNU/Linux 操作系统下的 init 软件。
开发目的
- 为服务之间的依赖关系提供更好的表示框架
- 实现系统初始化时服务的并行启动
- 减少 shell 开销并取代 SysV 风格的 init
systemd
为 GNU/Linux 操作系统提供了一系列系统组件,用于统一 GNU/Linux 发行版之间的服务配置和行为,消除其使用上的差异。
自 2015 年以来,大多数 GNU/Linux 发行版都采用了 systemd
来取代传统的 init 程序,如 SysV。值得注意的是,systemd
的许多概念和设计灵感都来源于 Apple Mac OS 的 **launchd**。
systemd
的出现引起了开源社区的巨大争议。
赞扬的声音
- 开发者和用户称赞
systemd
消除了 GNU/Linux 之间的使用差异,并提供了一个更稳定、更快速的开箱即用解决方案。
批评的声音
systemd
接管了操作系统上过多的组件,违反了 UNIX 的 KISS (Keep It Simple, Stupid) 原则。- 从代码的角度来看,
systemd
过于复杂和臃肿,代码量超过一百万行,从而降低了可维护性并增加了攻击面。
官方网站 - https://systemd.io/ GitHub 仓库 - https://github.com/systemd/systemd
开发历史¶
2010 年,Red Hat 的两位软件工程师 Lennart Poettering 和 Kay Sievers 开发了 systemd
的第一个版本,用以取代传统的 SysV。
2011 年 5 月,Fedora 15 成为第一个默认启用 systemd
的 GNU/Linux 发行版,当时给出的原因是
systemd 提供了强大的并行化功能,使用套接字和 D-Bus 激活来启动服务,提供守护进程的按需启动,使用 Linux cgroups 来跟踪进程,支持系统状态的快照和恢复,维护挂载点和自动挂载点,并实现了强大的基于事务的依赖关系的服务控制逻辑。它可以作为 sysvinit 的即插即用替代品。
2012 年 10 月,Arch Linux 默认启动时使用了 systemd
。
2013 年 10 月至 2014 年 2 月,Debian 技术委员会在 Debian 邮件列表中进行了冗长的辩论,重点讨论“Debian 8 Jessie 应该使用哪个 init 作为系统默认值”,最终决定使用 systemd
。
2014 年 2 月,Ubuntu 采用了 systemd
作为其 init,并放弃了自己的 Upstart。
2015 年 8 月,systemd
开始通过 machinectl
提供可调用的登录 shell。
2016 年,systemd
发现了一个安全漏洞,允许任何非特权用户对 systemd
执行“拒绝服务攻击”。
2017 年,systemd
发现了一个新的安全漏洞 - **CVE-2017-9445**。远程攻击者可以通过恶意的 DNS 响应触发缓冲区溢出漏洞并执行恶意代码。
信息
缓冲区溢出:这是一种程序设计缺陷,将数据写入程序的输入缓冲区,导致缓冲区溢出(通常比缓冲区能存储的最大数据量还要多),从而破坏程序运行,并借此机会获得程序甚至系统的控制权。
架构设计¶
在此,作者以 Samsung 的 Tizen 使用的 systemd
为例来说明其架构。
信息
Tizen - 一个基于 Linux 内核的移动操作系统,由 Linux 基金会支持,主要由三星开发和使用。
信息
systemd
的一些“目标”不属于 systemd
组件,例如 telephony
、bootmode
、dlog
、tizen service
,它们属于 Tizen。
systemd
采用模块化设计。在编译时存在许多配置开关,用于确定哪些内容将被构建或不被构建,类似于 Linux 内核的模块化设计。编译时,systemd
可以拥有多达 69 个二进制可执行文件,执行以下任务,包括
systemd
以 PID 1 运行,并提供尽可能多的并行服务启动。它还管理关机顺序。systemctl
程序提供了服务管理的图形用户界面。- 还提供了对 SysV 和 LSB 脚本的支持,以确保兼容性。
- 与 SysV 相比,
systemd
的服务管理和报告可以输出更详细的信息。 - 通过分层挂载和卸载文件系统,
systemd
可以更安全地级联挂载文件系统。 systemd
提供了对基本组件配置的管理,包括主机名、时间和日期、区域设置、日志等。- 提供了对套接字的管理。
systemd
的定时器提供了类似于 cron 计划任务的功能。- 支持临时文件的创建和管理,包括删除。
- D-Bus 接口允许在设备插入或移除时运行脚本。这样,所有设备,无论是否可插拔,都可以视为即插即用设备,从而大大简化了设备处理。
- 启动顺序分析工具可用于定位耗时最长的服务。
- 日志和服务的日志管理。
systemd
不仅仅是一个初始化程序,它是一个接管了许多系统组件的大型软件套件。
systemd 作为 PID 1¶
systemd
的挂载是通过使用 **`/etc/fstab`** 文件中的内容来确定的,包括交换分区。
默认的“目标”配置是通过使用 **`/etc/systemd/system/default.target`** 来确定的。
以前,使用 SysV 初始化时,有一个 **运行级别** 的概念。在 systemd
中,也有一个相关的兼容性对比表,如下所示(按依赖项数量降序排列)
systemd 目标 | SystemV 运行级别 | 目标别名(软链接) | 描述 |
---|---|---|---|
default.target | 这个“目标”始终是“multi-user.target”或“graphical.target”的软链接。systemd 始终使用“default.target”来启动系统。请注意!它不能是“halt.target”、“poweroff.target”或“reboot.target”的软链接。 |
||
graphical.target | 5 | runlevel5.target | GUI 环境。 |
4 | runlevel4.target | 保留且未使用。在 SysV 初始化程序中,runlevel4 与 runlevel3 相同。在 systemd 初始化程序中,用户可以创建和自定义此“目标”以启动本地服务,而无需更改默认的“multi-user.target”。 |
|
multi-user.target | 3 | runlevel3.target | 完整的多用户命令行模式。 |
2 | 在 SystemV 中,它指的是不包含 NFS 服务的所有用户命令行模式。 | ||
rescue.target | 1 | runlevel1.target | 在 SystemV 中,它被称为**单用户模式**,它启动最少的服务,不启动其他附加程序或驱动程序。它主要用于修复操作系统。它类似于 Windows 操作系统的安全模式。 |
emergency.target | 基本上等同于“rescue.target”。 | ||
reboot.target | 6 | runlevel6.target | 重启。 |
poweroff.target | 0 | runlevel0.target | 关闭操作系统并断电。 |
Shell > find / -iname runlevel?\.target -a -type l -exec ls -l {} \;
lrwxrwxrwx 1 root root 17 8月 23 03:05 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx 1 root root 17 8月 23 03:05 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root 13 8月 23 03:05 /usr/lib/systemd/system/runlevel6.target -> reboot.target
lrwxrwxrwx 1 root root 13 8月 23 03:05 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx 1 root root 16 8月 23 03:05 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx 1 root root 15 8月 23 03:05 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx 1 root root 17 8月 23 03:05 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
Shell > ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 41 12月 23 2022 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target
每个“目标”在其配置文件中都有一个依赖关系集,这些是运行 GNU/Linux 主机在特定运行级别所需的服务。功能越多,“目标”所需的依赖项也越多。例如,GUI 环境比命令行模式需要更多的服务。
从 man 页 (man 7 bootup
) 中,我们可以查阅 systemd
的启动图
local-fs-pre.target
|
v
(various mounts and (various swap (various cryptsetup
fsck services...) devices...) devices...) (various low-level (various low-level
| | | services: udevd, API VFS mounts:
v v v tmpfiles, random mqueue, configfs,
local-fs.target swap.target cryptsetup.target seed, sysctl, ...) debugfs, ...)
| | | | |
\__________________|_________________ | ___________________|____________________/
\|/
v
sysinit.target
|
____________________________________/|\________________________________________
/ | | | \
| | | | |
v v | v v
(various (various | (various rescue.service
timers...) paths...) | sockets...) |
| | | | v
v v | v rescue.target
timers.target paths.target | sockets.target
| | | |
v \_________________ | ___________________/
\|/
v
basic.target
|
____________________________________/| emergency.service
/ | | |
| | | v
v v v emergency.target
display- (various system (various system
manager.service services services)
| required for |
| graphical UIs) v
| | multi-user.target
| | |
\_________________ | _________________/
\|/
v
graphical.target
- “sysinit.target”和“basic.target”是启动过程中的检查点。尽管
systemd
的设计目标之一是并行启动系统服务,但在启动其他服务和“目标”之前,有必要启动某些服务和功能的“目标”。 - 在“sysinit.target”所依赖的“单元”完成之后,启动将进入“sysinit.target”阶段。这些“单元”可以并行启动,包括
- 挂载文件系统
- 设置交换文件
- 启动 udev
- 设置随机生成器种子
- 启动低级服务
- 设置加密服务
- “sysinit.target”将启动操作系统基本功能所需的所有低级服务和“单元”,这些是进入“basic.target”阶段之前所必需的。
- 完成“sysinit.target”阶段后,
systemd
启动完成下一个“目标”(即“basic.target”)所需的所有“单元”。该目标提供了附加功能,包括- 设置各种可执行文件的目录路径。
- 通信套接字
- 定时器
- 最后,对用户级别“目标”(“multi-user.target”或“graphical.target”)进行初始化。
systemd
必须先到达“multi-user.target”,然后才能进入“graphical.target”。
您可以运行以下命令查看完整启动所需的依赖项
Shell > systemctl list-dependencies multi-user.target
multi-user.target
● ├─auditd.service
● ├─chronyd.service
● ├─crond.service
● ├─dbus.service
● ├─irqbalance.service
● ├─kdump.service
● ├─NetworkManager.service
● ├─sshd.service
● ├─sssd.service
● ├─systemd-ask-password-wall.path
● ├─systemd-logind.service
● ├─systemd-update-utmp-runlevel.service
● ├─systemd-user-sessions.service
● ├─tuned.service
● ├─basic.target
● │ ├─-.mount
● │ ├─microcode.service
● │ ├─paths.target
● │ ├─slices.target
● │ │ ├─-.slice
● │ │ └─system.slice
● │ ├─sockets.target
● │ │ ├─dbus.socket
● │ │ ├─sssd-kcm.socket
● │ │ ├─systemd-coredump.socket
● │ │ ├─systemd-initctl.socket
● │ │ ├─systemd-journald-dev-log.socket
● │ │ ├─systemd-journald.socket
● │ │ ├─systemd-udevd-control.socket
● │ │ └─systemd-udevd-kernel.socket
● │ ├─sysinit.target
● │ │ ├─dev-hugepages.mount
● │ │ ├─dev-mqueue.mount
● │ │ ├─dracut-shutdown.service
● │ │ ├─import-state.service
● │ │ ├─kmod-static-nodes.service
● │ │ ├─ldconfig.service
● │ │ ├─loadmodules.service
● │ │ ├─nis-domainname.service
● │ │ ├─proc-sys-fs-binfmt_misc.automount
● │ │ ├─selinux-autorelabel-mark.service
● │ │ ├─sys-fs-fuse-connections.mount
● │ │ ├─sys-kernel-config.mount
● │ │ ├─sys-kernel-debug.mount
● │ │ ├─systemd-ask-password-console.path
● │ │ ├─systemd-binfmt.service
● │ │ ├─systemd-firstboot.service
● │ │ ├─systemd-hwdb-update.service
● │ │ ├─systemd-journal-catalog-update.service
● │ │ ├─systemd-journal-flush.service
● │ │ ├─systemd-journald.service
● │ │ ├─systemd-machine-id-commit.service
● │ │ ├─systemd-modules-load.service
● │ │ ├─systemd-random-seed.service
● │ │ ├─systemd-sysctl.service
● │ │ ├─systemd-sysusers.service
● │ │ ├─systemd-tmpfiles-setup-dev.service
● │ │ ├─systemd-tmpfiles-setup.service
● │ │ ├─systemd-udev-trigger.service
● │ │ ├─systemd-udevd.service
● │ │ ├─systemd-update-done.service
● │ │ ├─systemd-update-utmp.service
● │ │ ├─cryptsetup.target
● │ │ ├─local-fs.target
● │ │ │ ├─-.mount
● │ │ │ ├─boot.mount
● │ │ │ ├─systemd-fsck-root.service
● │ │ │ └─systemd-remount-fs.service
● │ │ └─swap.target
● │ │ └─dev-disk-by\x2duuid-76e2324e\x2dccdc\x2d4b75\x2dbc71\x2d64cd0edb2ebc.swap
● │ └─timers.target
● │ ├─dnf-makecache.timer
● │ ├─mlocate-updatedb.timer
● │ ├─systemd-tmpfiles-clean.timer
● │ └─unbound-anchor.timer
● ├─getty.target
● │ └─getty@tty1.service
● └─remote-fs.target
您还可以使用 --all
选项来展开所有“单元”。
使用 systemd¶
单元类型¶
systemctl
命令是管理 systemd
的主要工具,它是以前的 service
命令和 chkconfig
命令的结合。
systemd
管理所谓的“单元”,它们是系统资源和服务的一种表示。以下列表显示了 systemd
可以管理的“单元”类型
- service - 系统上的一个服务,包括启动、重启和停止服务的说明。请参阅
man 5 systemd.service
。 - socket - 与服务关联的网络套接字。请参阅
man 5 systemd.socket
。 - device - 由
systemd
特别管理的设备。请参阅man 5 systemd.device
。 - mount - 由
systemd
管理的挂载点。请参阅man 5 systemd.mount
。 - automount - 在启动时自动挂载的挂载点。请参阅
man 5 systemd.automount
。 - swap - 系统上的交换空间。请参阅
man 5 systemd.swap
。 - target - 其他单元的同步点。通常用于在启动时启动启用的服务。请参阅
man 5 systemd.target
。 - path - 用于基于路径的激活的路径。例如,您可以基于特定路径的状态(如是否存在)来启动服务。请参阅
man 5 systemd.path
。 - timer - 用于调度激活另一个单元的定时器。请参阅
man 5 systemd.timer
。 - snapshot - 当前
systemd
状态的快照。通常用于在对systemd
进行临时更改后回滚。 - slice - 通过 Linux Control Group 节点 (cgroups) 限制资源。请参阅
man 5 systemd.slice
。 - scope - 来自
systemd
总线接口的信息。通常用于管理外部系统进程。请参阅man 5 systemd.scope
。
操作“单元”¶
systemictl
命令的用法是 - systemctl [OPTIONS...] COMMAND [UNIT...]
。
COMMAND 可以分为
- 单元命令
- 单元文件命令
- 机器命令
- 作业命令
- 环境命令
- 管理器生命周期命令
- 系统命令
您可以使用 systemctl --help
来了解详细信息。
以下是一些常见的操作演示命令
# Start the service
Shell > systemctl start sshd.service
# Stop the service
Shell > systemctl stop sshd.service
# Reload the service
Shell > systemctl reload sshd.service
# Restart the service
Shell > systemctl restart sshd.service
# View the status of the service
Shell > systemctl status sshd.service
# The service starts automatically after the system starts
Shell > systemctl enable sshd.service
# The service stops automatically after the system starts
Shell > systemctl disable sshd.service
# Check if the service automatically starts after startup
Shell > systemctl is-enabled sshd.service
# Mask one unit
Shell > systemctl mask sshd.service
# Unmask one unit
Shell > systemctl unmask sshd.service
# View the file contents of unit
Shell > systemctl cat sshd.service
# Edit the contents of the unit file and save it in the /etc/systemd/system/ directory after editing
Shell > systemctl edit sshd.service
# View the complete properties of unit
Shell > systemctl show sshd.service
信息
您可以在单行命令中对一个或多个单元执行上述操作。上述操作不限于 “.service”。
关于“单元”
# List all currently running units.
Shell > systemctl
## or
Shell > systemctl list-units
## You can also add "--type=TYPE" for type filtering
Shell > systemctl --type=target
# List all unit files. You can also filter using "--type=TYPE"
Shell > systemctl list-unit-files
关于“目标”
# Query current "target" ("runlevel") information
Shell > systemctl get-default
multi-user.target
# Switch "target"("runlevel"). For example, you need to switch to the GUI environment
Shell > systemctl isolate graphical.target
# Define the default "target" ("runlevel")
Shell > systemctl set-default graphical.target
重要目录¶
存在三个主要重要目录,按优先级升序排列
- /usr/lib/systemd/system/ - systemd 单元文件,随安装的 RPM 包分发。类似于 Centos 6 的 /etc/init.d/ 目录。
- /run/systemd/system/ - 运行时创建的 systemd 单元文件。
- /etc/systemd/system/ - 由
systemctl enable
创建的 systemd 单元文件以及用于扩展服务的单元文件。
systemd 配置文件¶
man 5 systemd-system.conf
:
当作为系统实例运行时,systemd 会解释配置文件“system.conf”以及“system.conf.d”目录中的文件;当作为用户实例运行时,它会解释配置文件 user.conf(在用户的主目录中,或者如果找不到,则在“/etc/systemd/”下)以及“user.conf.d”目录中的文件。这些配置文件包含一些控制基本管理器操作的设置。
在 Rocky Linux 8.x 操作系统中,相关的配置文件是
- /etc/systemd/system.conf - 编辑该文件以更改设置。删除该文件将恢复默认设置。请参阅
man 5 systemd-system.conf
- /etc/systemd/user.conf - 您可以通过在“/etc/systemd/user.conf.d/*.conf”中创建文件来覆盖此文件中的指令。请参阅
man 5 systemd-user.conf
systemd 单元文件内容说明¶
以 sshd.service 文件为例
Shell > systemctl cat sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
可以看到,单元文件的内容与 RL 9 网卡配置文件风格相同。它使用[和]包含标题,标题下方是相关的键值对。
# RL 9
Shell > cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
uuid=5903ac99-e03f-46a8-8806-0a7a8424497e
type=ethernet
interface-name=ens160
timestamp=1670056998
[ethernet]
mac-address=00:0C:29:47:68:D0
[ipv4]
address1=192.168.100.4/24,192.168.100.1
dns=8.8.8.8;114.114.114.114;
method=manual
[ipv6]
addr-gen-mode=default
method=disabled
[proxy]
通常,“.service”类型的单元存在三个标题
- Unit
- 服务
-
Install
-
单元标题
以下键值对是可用的
Description=OpenSSH server daemon
。该字符串用于描述“单元”。Documentation=man:sshd(8) man:sshd_config(5)
。一个由空格分隔的 URI 列表,指向此“单元”或其配置的文档。只接受“http://”、“https://”、“file:”、“info:”、“man:”类型的 URI。After=network.target sshd-keygen.target
。定义与其他“单元”的启动顺序关系。在此示例中,“network.target”和“sshd-keygen.target”先启动,“sshd.service”最后启动。Before=
。定义与其他“单元”的启动顺序关系。Requires=
。配置与其他“单元”的依赖关系。值可以是多个以空格分隔的单元。如果当前“单元”被激活,此处列出的值也将被激活。如果列出的“单元”中至少有一个激活失败,systemd
将不会启动当前“单元”。Wants=sshd-keygen.target
。与Requires
键类似。区别在于,如果依赖的单元启动失败,也不会影响当前单元的正常运行。BindsTo=
。与Requires
键类似。区别在于,如果任何依赖的“单元”启动失败,当前单元将停止,并且还会停止依赖单元。PartOf=
。与Requires
键类似。区别在于,如果任何依赖的“单元”启动失败,当前“单元”将被停止和重启,并且还会停止和重启依赖单元。Conflicts=
。其值是由空格分隔的“单元”列表。如果值中列出的“单元”正在运行,则当前“单元”将无法运行。OnFailure=
。当当前“单元”失败时,值中的“单元”或“单元”(用空格分隔)将被激活。
有关更多信息,请参阅
man 5 systemd.unit
。 -
服务标题
以下键值对是可用的
Type=notify
。配置此“.service”单元的类型,可以是以下之一simple
- 服务作为主进程启动。这是默认值。forking
- 服务调用了派生进程,并作为主守护进程的一部分运行。exec
- 类似于simple
。服务管理器将在执行主服务二进制文件后立即启动此单元。其他后续单元必须在此之后保持阻塞状态,然后才能继续启动。oneshot
- 类似于simple
,但进程必须退出,systemd
才能启动后续服务。dbus
- 类似于simple
,但守护进程会获取 D-Bus 总线上的一个名称。notify
- 类似于simple
,但守护进程在启动后会通过sd_notify
或等效调用发送通知消息。idle
- 类似于simple
,但服务的执行会被延迟,直到所有活动作业都分派完毕。
RemainAfterExit=
。当服务的全部进程退出后,是否应认为当前服务处于活动状态。默认为否。GuessMainPID=
。该值为布尔类型,默认为 yes。如果找不到服务主进程的明确位置,systemd
是否应猜测主进程的 PID(可能不正确)。如果您设置了Type=forking
并且未设置PIDFile
,则此键值对将生效。否则,将忽略该键值对。PIDFile=
。指定服务 PID 的文件路径(绝对路径)。对于Type=forking
服务,建议使用此键值对。systemd
在服务启动后读取守护进程的主进程 PID。BusName=
。到达此服务的 D-Bus 总线名称。对于使用Type=dbus
的服务,此选项是强制的。ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
。服务启动时执行的命令和参数。ExecStartPre=
。在ExecStart
中的命令之前运行的其他命令。ExecStartPost=
。在ExecStart
中的命令之后运行的其他命令。ExecReload=/bin/kill -HUP $MAINPID
。服务重新加载时运行的命令和参数。ExecStop=
。服务停止时运行的命令和参数。ExecStopPost=
。服务停止后运行的附加命令。RestartSec=42s
。重启服务之前休眠的秒数。TimeoutStartSec=
。等待服务启动的秒数。TimeoutStopSec=
。等待服务停止的秒数。TimeoutSec=
。同时配置TimeoutStartSec
和TimeoutStopSec
的简写。RuntimeMaxSec=
。服务运行的最大秒数。传递infinity
(默认值)可配置无运行时限制。Restart=on-failure
。配置服务进程退出、被终止或达到超时时是否重启服务no
- 服务不会重启。这是默认值。on-success
- 仅当服务进程干净退出(退出码 0)时重启。on-failure
- 仅当服务进程未干净退出(非零退出码)时重启。on-abnormal
- 当进程因信号终止或发生超时时重启。on-abort
- 当进程由于未捕获的信号而退出,且该信号未被指定为干净退出状态时重启。on-watchdog
- 如果设置为on-watchdog
,则仅当看门狗超时时,服务才会重启。always
- 总是重启。
退出原因以及
Restart=
设置对它们的影响KillMode=process
。指定如何杀死此单元的进程。其值可以是以下之一control-group
- 默认值。如果设置为control-group
,在单元停止时,将杀死此单元控制组中所有剩余的进程。process
- 只杀死主进程。mixed
- 将 SIGTERM 信号发送到主进程,然后将 SIGKILL 信号发送到单元控制组中所有剩余的进程。none
- 不杀死任何进程。
PrivateTmp=
。是否使用私有 tmp 目录。基于某些安全考虑,建议将值设置为 yes。ProtectHome=
。是否保护主目录。其值可以是以下之一yes
- 三个目录(/root/、/home/、/run/user/)对单元不可见。no
- 三个目录对单元可见。read-only
- 三个目录对单元是只读的。tmpfs
- 临时文件系统将在这些目录上以只读模式挂载。
ProtectSystem=
。用于保护系统免受服务修改的目录。值可以是yes
- 表示由单元调用的进程将以只读方式挂载到 /usr/ 和 /boot/ 目录。no
- 默认值full
- 表示 /usr/、/boot/、/etc/ 目录以只读方式挂载。strict
- 所有文件系统都以只读方式挂载(不包括 /dev/、/proc/ 和 /sys/ 等虚拟文件系统目录)。
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
。从文本文件中读取环境变量。 “-” 表示如果文件不存在,将不读取该文件,也不会记录任何错误或警告。
有关更多信息,请参阅
man 5 systemd.service
。 -
安装标题
Alias=
。一系列附加名称,用空格分隔。请注意!您的附加名称应与当前单元具有相同的类型(后缀)。RequiredBy=
或WantedBy=multi-user.target
。将当前操作的单元定义为值中单元的依赖项。定义完成后,您可以在 /etc/systemd/systemd/ 目录中找到相关文件。例如
Shell > systemctl is-enabled chronyd.service enabled Shell > systemctl cat chronyd.service ... [Install] WantedBy=multi-user.target Shell > ls -l /etc/systemd/system/multi-user.target.wants/ total 0 lrwxrwxrwx. 1 root root 38 Sep 25 14:03 auditd.service -> /usr/lib/systemd/system/auditd.service lrwxrwxrwx. 1 root root 39 Sep 25 14:03 chronyd.service -> /usr/lib/systemd/system/chronyd.service ←← lrwxrwxrwx. 1 root root 37 Sep 25 14:03 crond.service -> /usr/lib/systemd/system/crond.service lrwxrwxrwx. 1 root root 42 Sep 25 14:03 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service lrwxrwxrwx. 1 root root 37 Sep 25 14:03 kdump.service -> /usr/lib/systemd/system/kdump.service lrwxrwxrwx. 1 root root 46 Sep 25 14:03 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service lrwxrwxrwx. 1 root root 40 Sep 25 14:03 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sshd.service -> /usr/lib/systemd/system/sshd.service lrwxrwxrwx. 1 root root 36 Sep 25 14:03 sssd.service -> /usr/lib/systemd/system/sssd.service lrwxrwxrwx. 1 root root 37 Sep 25 14:03 tuned.service -> /usr/lib/systemd/system/tuned.service
Also=
。安装或卸载此单元时要安装或卸载的其他单元。
除了上述 man 页之外,您还可以输入
man 5 systemd.exec
或man 5 systemd.kill
来访问其他信息。
与其他组件相关的命令¶
timedatactl
- 查询或更改系统时间和日期设置。hostnamectl
- 查询或更改系统主机名。localectl
- 查询或更改系统区域设置和键盘设置。systemd-analyze
- 分析systemd
,显示单元依赖关系,检查单元文件。journalctl
- 查看系统或服务的日志。journalctl
命令非常重要,后续将有专门的章节介绍其使用方法和注意事项。loginctl
- 登录用户的会话管理。
作者:李天赐
贡献者:Steven Spencer