基本概述¶
systemd
,也称为 system daemon,是 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 响应触发缓冲区溢出漏洞并执行恶意代码。
信息
缓冲区溢出:这是一种程序设计缺陷,它向程序的输入缓冲区写入数据,使其溢出(通常是超过缓冲区所能存储的最大数据量),从而破坏程序操作,利用中断时机,获取程序甚至系统的控制权。
架构设计¶
在这里,作者以三星 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 初始化程序中,运行级别 4 与运行级别 3 相同。在 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 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 控制组节点(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/ - 与安装的 RPM 包一起分发的 Systemd 单元文件。类似于 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
- Service
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=
。该值是布尔类型,默认值为是。在没有服务主进程的明确位置的情况下,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 目录。基于某些安全性,建议将值设置为是。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 5 systemd.exec
或man 5 systemd.kill
以访问其他信息。
与其他组件相关的命令¶
timedatactl
- 查询或更改系统时间和日期设置。hostnamectl
- 查询或更改系统主机名。localectl
- 查询或更改系统语言环境和键盘设置。systemd-analyze
- 分析systemd
,显示单元依赖关系,检查单元文件。journalctl
- 查看系统或服务日志。journalctl
命令非常重要,后面将专门有一节介绍它的使用方法以及需要注意的事项。loginctl
- 登录用户的会话管理。
作者:tianci li
贡献者:Steven Spencer