8.75. Systemd-255

Systemd 软件包包含控制系统引导、运行和关闭的程序。

估计构建时间: 0.7 SBU
需要硬盘空间: 247 MB

8.75.1. 安装 systemd

从默认的 udev 规则中删除不必要的组 rendersgx

sed -i -e 's/GROUP="render"/GROUP="video"/' \
       -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in

现在修复 systemd-resolved 在验证 DNSSEC 时的安全缺陷,以及导致无法使用 systemd-analyze verify 分析实例化的 systemd 单元的程序错误:

patch -Np1 -i ../systemd-255-upstream_fixes-1.patch

准备安装 systemd:

mkdir -p build
cd       build

meson setup \
      --prefix=/usr                 \
      --buildtype=release           \
      -Ddefault-dnssec=no           \
      -Dfirstboot=false             \
      -Dinstall-tests=false         \
      -Dldconfig=false              \
      -Dsysusers=false              \
      -Drpmmacrosdir=no             \
      -Dhomed=disabled              \
      -Duserdb=false                \
      -Dman=disabled                \
      -Dmode=release                \
      -Dpamconfdir=no               \
      -Ddev-kvm-mode=0660           \
      -Dnobody-group=nogroup        \
      -Dsysupdate=disabled          \
      -Dukify=disabled              \
      -Ddocdir=/usr/share/doc/systemd-255 \
      ..

meson 选项的含义:

--buildtype=release

这个开关覆盖默认的构建模式 (debug),因为该模式会生成未优化的二进制代码。

-Ddefault-dnssec=no

这个开关禁用实验性的 DNSSEC 支持。

-Dfirstboot=false

这个开关防止 systemd 安装用于初始化设定系统的服务。在 LFS 中所有工作都会手工完成,因此不需要它们。

-Dinstall-tests=false

这个开关防止 systemd 安装编译好的测试文件。

-Dldconfig=false

这个开关防止一个 systemd 单元的安装,它在引导时运行 ldconfig;这对于 LFS 等源代码发行版来说没有意义,还会增加引导时间。如果需要在引导时运行 ldconfig,可以删除这个开关。

-Dsysusers=false

这个开关防止 systemd 安装负责设定 /etc/group/etc/passwd 文件的服务。我们在上一章已经创建了这两个文件。这个守护进程在 LFS 系统中没有意义,因为我们已经手动创建了用户账户。

-Drpmmacrosdir=no

该选项禁止安装用于 systemd 的 RPM 宏,因为 LFS 并不支持 RPM。

-Dhomed=disabled-Duserdb=false

移除两个守护程序,它们的依赖项超出了 LFS 的范围。

-Dman=disabled

防止手册页的生成,以避免额外的依赖项。我们将会从一个压缩包安装预先生成的手册页。

-Dmode=release

禁用一些上游开发者认为尚处于实验阶段的功能。

-Dpamconfdir=no

防止安装在 LFS 系统无法正常工作的 PAM 配置文件。

-Ddev-kvm-mode=0660

默认的 udev 规则会允许所有用户访问 /dev/kvm。本书编辑团队认为这比较危险。该选项覆盖这一默认值。

-Dnobody-group=nogroup

告诉该软件包组编号 65534 被分配给 nogroup 组。

-Dsysupdate=disabled

不安装 systemd-sysupdate 工具。它被设计为用于更新二进制发行版,因此它对于从源码构建的,基本的 Linux 系统来说没有作用,而且如果它被启用但未正确配置,会在系统启动时产生错误消息:

-Dukify=disabled

不安装 systemd-ukify 脚本。它在运行时需要名为 pefile 的 Python 模块,而 LFS 和 BLFS 都不提供该模块。

编译该软件包:

ninja

安装该软件包:

ninja install

安装手册页:

tar -xf ../../systemd-man-pages-255.tar.xz \
    --no-same-owner --strip-components=1   \
    -C /usr/share/man

创建 /etc/machine-id 文件,systemd-journald 需要它:

systemd-machine-id-setup

设定启动目标单元的基本结构:

systemctl preset-all

8.75.2. systemd 的内容

安装的程序: busctl, coredumpctl, halt (到 systemctl 的符号链接), hostnamectl, init, journalctl, kernel-install, localectl, loginctl, machinectl, mount.ddi (到 systemd-dissect 的符号链接), networkctl, oomctl, portablectl, poweroff (到 systemctl 的符号链接), reboot (到 systemctl 的符号链接), resolvconf (到 resolvectl 的符号链接), resolvectl, runlevel (到 systemctl 的符号链接), shutdown (到 systemctl 的符号链接), systemctl, systemd-ac-power, systemd-analyze, systemd-ask-password, systemd-cat, systemd-cgls, systemd-cgtop, systemd-confext (到 systemd-sysext 的符号链接), systemd-creds, systemd-delta, systemd-detect-virt, systemd-dissect, systemd-escape, systemd-hwdb, systemd-id128, systemd-inhibit, systemd-machine-id-setup, systemd-mount, systemd-notify, systemd-nspawn, systemd-path, systemd-repart, systemd-resolve (到 resolvectl 的符号链接), systemd-run, systemd-socket-activate, systemd-stdio-bridge, systemd-sysext, systemd-tmpfiles, systemd-tty-ask-password-agent, systemd-umount (到 systemd-mount 的符号链接), telinit (到 systemctl 的符号链接), timedatectl, 以及 udevadm
安装的库: libnss_myhostname.so.2, libnss_mymachines.so.2, libnss_resolve.so.2, libnss_systemd.so.2, libsystemd.so, libsystemd-shared-255.so (在 /usr/lib/systemd 中), 以及 libudev.so
安装的目录: /etc/binfmt.d, /etc/init.d, /etc/kernel, /etc/modules-load.d, /etc/sysctl.d, /etc/systemd, /etc/tmpfiles.d, /etc/udev, /etc/xdg/systemd, /usr/lib/systemd, /usr/lib/udev, /usr/include/systemd, /usr/lib/binfmt.d, /usr/lib/environment.d, /usr/lib/kernel, /usr/lib/modules-load.d, /usr/lib/sysctl.d, /usr/lib/systemd, /usr/lib/tmpfiles.d, /usr/share/doc/systemd-255, /usr/share/factory, /usr/share/systemd, /var/lib/systemd, 以及 /var/log/journal

简要描述

busctl

用于探查和监视 D-bus 总线

coredumpctl

用于从 systemd 日志获取核心转储

halt

通常调用 shutdown 并传递 -h 参数,除非已经处于运行级别 0,则它会通知内核停止系统运行;在系统被关闭时,它在 /var/log/wtmp 文件中进行记录

hostnamectl

用于查询和修改系统机器名和相关设置

init

在内核初始化硬件后第一个启动的进程;init 接管引导过程,并根据它的配置文件启动所有进程。在本例中,它启动 systemd

journalctl

用于查询 systemd 日志的内容

kernel-install

用于在 /boot 中添加或删除内核和 initramfs 映像文件;在 LFS 中,这项工作是手工完成的

localectl

用于查询和修改系统 locale 和键盘布局设置

loginctl

用于探查和控制 systemd 登录管理器的状态

machinectl

用于探查和控制 systemd 虚拟机和容器注册管理器的状态

networkctl

用于探查和配置 systemd-networkd 管理的网络连接状态

oomctl

控制 systemd 处理内存不足问题的守护进程

portablectl

用于在本地系统附加或移除可移植服务

poweroff

告诉内核停止系统运行并关闭计算机 (见 halt)

reboot

告诉内核重启系统 (见 halt)

resolvconf

systemd-resolved 注册 DNS 服务器和域设置

resolvectl

向网络名称解析管理器发送控制命令,或解析域名,IPv4 和 IPv6 地址,DNS 记录,以及服务

runlevel

报告当前系统运行级别和上一个运行级别,上一个运行级别被记录在 /run/utmp

shutdown

安全地关闭系统,向所有进程发送信号,并通知所有登录用户

systemctl

用于探查和控制 systemd 系统和服务管理器的状态

systemd-ac-power

报告系统是否连接到外部电源。

systemd-analyze

用于分析系统引导性能,也能找出导致引导性能问题的 systemd 单元

systemd-ask-password

用于以命令行指定的消息向用户询问系统密码

systemd-cat

用于将进程的标准输出和错误输出重定向到系统日志

systemd-cgls

用树的形式递归地显示指定 Linux 控制组层次结构的内容

systemd-cgtop

显示本地 Linux 控制组层次结构中占用资源最多的,可以按 CPU、内存和磁盘 I/O 负载排序

systemd-creds

显示和处理凭证

systemd-delta

用于识别和比较那些覆盖了 /usr 中默认值的 /etc 中的配置文件

systemd-detect-virt

确定系统是否在虚拟化环境中运行,并据此调节 udev

systemd-dissect

用于检查 OS 磁盘映像

systemd-escape

用于转义字符串,以便将其包含在 systemd 单元名中

systemd-hwdb

用于管理硬件数据库 (hwdb)

systemd-id128

生成和打印 id128 (UUID) 串

systemd-inhibit

用于在关机、休眠或待机抑制锁被锁定的情况下运行程序,在进程结束前防止关闭系统等动作

systemd-machine-id-setup

被系统安装工具用于在安装时以随机生成的 ID 初始化 /etc/machine-id 中的机器 ID

systemd-mount

一个用于临时挂载或自动挂载驱动器的工具

systemd-notify

被守护脚本用于将状态变化告知 init 系统

systemd-nspawn

用于在轻量级命名空间容器中运行命令,或完整的操作系统

systemd-path

用于查询系统和用户路径

systemd-repart

在 systemd 和 OS 映像 (例如容器) 共同使用时,可用于在分区表中添加分区或增长分区大小

systemd-resolve

用于解析域名,IPv4 和 IPv6 地址,DNS 资源记录,以及服务

systemd-run

用于创建一个临时的 .service 或 .scope 单元,并在其中运行指定命令;这对于验证 systemd 单元很有用

systemd-socket-activate

用于监听 socket 服务,并在 socket 成功连接时启动进程

systemd-sysext

启用系统扩展镜像

systemd-tmpfiles

根据 tmpfiles.d 目录中的配置文件给定的文件格式和位置,创建、修改,以及清理易失性、临时性文件和目录

systemd-umount

卸载挂载点

systemd-tty-ask-password-agent

列出或处理等待中的 systemd 密码请求

telinit

告诉 init 切换到某个运行级别

timedatectl

用于查询和修改系统时钟及其设置

udevadm

通用 udev 管理工具,它控制 udevd 守护进程,提供 udev 数据库的信息,监视 uevent 事件,等待 uevent 事件结束,测试 udev 配置,或对于给定设备触发 uevent 事件

libsystemd

主要的 systemd 工具库

libudev

用于访问 udev 设备信息的库