跳至内容

基本概述

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

init-compare

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。

Lennart Poettering

Kay Sievers

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-systemd

信息

Tizen - 基于 Linux 内核的移动操作系统,由 Linux 基金会支持,主要由三星开发和使用。

信息

systemd 的一些“目标”并不属于 systemd 组件,例如 telephonybootmodedlogtizen 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.target5runlevel5.targetGUI 环境。
4runlevel4.target保留和未使用。在 SysV 初始化程序中,运行级别 4 与运行级别 3 相同。在 systemd 初始化程序中,用户可以创建和自定义此“目标”以启动本地服务,而无需更改默认的“multi-user.target”。
multi-user.target3runlevel3.target完全的多用户命令行模式。
2在 SystemV 中,它指的是不包含 NFS 服务的多用户命令行模式。
rescue.target1runlevel1.target在 SystemV 中,它被称为 单用户模式,它启动最少的服务,并且不启动其他额外的程序或驱动程序。它主要用于修复操作系统。它类似于 Windows 操作系统的安全模式。
emergency.target基本上等效于“rescue.target”。
reboot.target6runlevel6.target重启。
poweroff.target0runlevel0.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=。同时配置 TimeoutStartSecTimeoutStopSec 的简写。
    • RuntimeMaxSec=。服务运行的最大时间(以秒为单位)。传递 infinity(默认值)以配置无运行时限制。
    • Restart=on-failure。配置服务进程退出、被杀死或达到超时时是否重新启动服务
      • no - 服务不会重新启动。这是默认值。
      • on-success - 仅当服务进程干净退出(退出代码 0)时重新启动。
      • on-failure - 仅当服务进程没有干净退出(非零退出代码)时重新启动。
      • on-abnormal - 如果进程因信号终止或超时发生,则重新启动。
      • on-abort - 如果进程因未捕获的信号退出(未指定为干净退出状态),则重新启动。
      • on-watchdog - 如果设置为 on-watchdog,则仅当看门狗超时过期时,服务才会重新启动。
      • always - 始终重新启动。

    退出原因以及 Restart= 设置对它们的影响

    effect

    • 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.execman 5 systemd.kill 以访问其他信息。

  • timedatactl - 查询或更改系统时间和日期设置。
  • hostnamectl - 查询或更改系统主机名。
  • localectl - 查询或更改系统语言环境和键盘设置。
  • systemd-analyze - 分析 systemd,显示单元依赖关系,检查单元文件。
  • journalctl - 查看系统或服务日志。journalctl 命令非常重要,后面将专门有一节介绍它的使用方法以及需要注意的事项。
  • loginctl - 登录用户的会话管理。

作者:tianci li

贡献者:Steven Spencer