8.69. Systemd-247

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

估计构建时间: 1.8 SBU
需要硬盘空间: 264 MB

8.69.1. 安装 systemd

首先,应用一个补丁,修复一些退化问题:

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

创建一个符号链接,绕过本书不会安装的 xsltproc:

ln -sf /bin/true /usr/bin/xsltproc

设定好 man 页面:

tar -xf ../systemd-man-pages-247.tar.xz

删除在 chroot 环境中无法构建的测试:

sed '181,$ d' -i src/resolve/meson.build

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

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

准备安装 systemd:

mkdir -p build
cd       build

LANG=en_US.UTF-8                    \
meson --prefix=/usr                 \
      --sysconfdir=/etc             \
      --localstatedir=/var          \
      -Dblkid=true                  \
      -Dbuildtype=release           \
      -Ddefault-dnssec=no           \
      -Dfirstboot=false             \
      -Dinstall-tests=false         \
      -Dkmod-path=/bin/kmod         \
      -Dldconfig=false              \
      -Dmount-path=/bin/mount       \
      -Drootprefix=                 \
      -Drootlibdir=/lib             \
      -Dsplit-usr=true              \
      -Dsulogin-path=/sbin/sulogin  \
      -Dsysusers=false              \
      -Dumount-path=/bin/umount     \
      -Db_lto=false                 \
      -Drpmmacrosdir=no             \
      -Dhomed=false                 \
      -Duserdb=false                \
      -Dman=true                    \
      -Dmode=release                \
      -Ddocdir=/usr/share/doc/systemd-247 \
      ..

meson 选项的含义:

-D*-path=*

这些开关提供了 systemd 在运行时需要,但尚未安装的二进制程序的位置。

-Ddefault-dnssec=no

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

-Dfirstboot=false

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

-Dinstall-tests=false

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

-Dldconfig=false

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

-Droot*

这个开关保证核心程序和共享库被安装到根分区下的子目录中。

-Dsplit-usr=true

这个开关确保 systemd 能够在 /bin、/lib 和 /sbin 目录不是指向 /usr 中对应目录的符号链接的情况下工作。

-Dsysusers=false

这个开关防止 systemd 安装负责设定 /etc/group/etc/passwd 文件的服务。我们在上一章已经创建了这两个文件。

-Drpmmacrosdir=no

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

-D{userdb,homed}=false

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

-Dmode=release

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

编译该软件包:

LANG=en_US.UTF-8 ninja

安装该软件包:

LANG=en_US.UTF-8 ninja install

删除一个不再必要的符号链接:

rm -f /usr/bin/xsltproc

删除不必要的目录:

rm -rf /usr/lib/pam.d

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

systemd-machine-id-setup

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

systemctl preset-all

已知一个服务单元会导致并非由 systemd-networkd 提供网络配置的系统出现问题,禁用它:

systemctl disable systemd-time-wait-sync.service

8.69.2. systemd 的内容

安装的程序: bootctl, busctl, coredumpctl, halt (到 systemctl 的符号链接), hostnamectl, init, journalctl, kernel-install, localectl, loginctl, machinectl, networkctl, portablectl, poweroff (到 systemctl 的符号链接), reboot (到 systemctl 的符号链接), resolvconf (到 resolvectl 的符号链接), resolvectl, runlevel (到 systemctl 的符号链接), shutdown (到 systemctl 的符号链接), systemctl, systemd-analyze, systemd-ask-password, systemd-cat, systemd-cgls, systemd-cgtop, 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-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-247.so (在 /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, /lib/systemd, /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-247, /usr/share/factory, /usr/share/systemd, /var/lib/systemd, 以及 /var/log/journal

简要描述

bootctl

用于查询固件和启动管理器设置

busctl

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

coredumpctl

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

halt

一般调用 shutdown 命令并传递 -h 选项,除非在运行级别已经为 0 时,则通知内核停止系统;在系统停止运行时它在 /var/log/wtmp 中进行记录

hostnamectl

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

init

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

journalctl

用于查询 systemd 日志的内容

kernel-install

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

localectl

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

loginctl

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

machinectl

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

networkctl

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

portablectl

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

poweroff

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

reboot

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

resolvconf

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

resolvectl

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

runlevel

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

shutdown

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

systemctl

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

systemd-analyze

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

systemd-ask-password

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

systemd-cat

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

systemd-cgls

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

systemd-cgtop

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

systemd-delta

用于确定并比较那些覆盖了 /usr 中默认值的 /etc 中的配置文件

systemd-detect-virt

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

systemd-dissect

用于检查 OS 磁盘映像

systemd-escape

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

systemd-hwdb

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

systemd-id128

生成和打印 id128 串

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-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 设备信息的库