6.72. systemd-241

systemd 软件包包含用于控制启动、运行和关闭系统的程序。

大致构建用时: 0.4 SBU
所需磁盘空间: 227 MB

6.72.1. 安装 systemd

首先,应用补丁解决 systemd-networked 在 Linux 5.2+ 内核以及 AMD Ryzen CPU 上的问题:

patch -Np1 -i ../systemd-241-networkd_and_rdrand_fixes-1.patch

创建符号链接以解决丢失 xsltproc 的问题:

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

由于我们还未安装 Util-Linux 的最终版本,所以在适当的位置创建指向库的链接:

for file in /tools/lib/lib{blkid,mount,uuid}.so*; do
    ln -sf $file /usr/lib/
done

设置 man 手册:

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

移除不能在 chroot 下构建的测试:

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

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

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

systemd 编译前准备:

mkdir -p build
cd       build

PKG_CONFIG_PATH="/usr/lib/pkgconfig:/tools/lib/pkgconfig" \
LANG=en_US.UTF-8                   \
CFLAGS+="-Wno-format-overflow"     \
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            \
      ..

选项的含义:

-D*-path=*

此类参数提供了 systemd 在运行时所需的二进制的位置,这些二进制文件有些还未安装,有些的 pkgconfig 文件现在还在/tools/lib/pkgconfig 中。

-Ddefault-dnssec=no

此参数关闭了实验性 DNSSEC 的支持。

-Dfirstboot=false

此参数将防止负责首次设置系统的 systemd 服务被安装。这对 LFS 没什么用,因为 LFS 的一切都是手动完成的。

-Dinstall-tests=false

此参数将防止编译测试的安装。

-Dldconfig=false

此参数将防止启动时运行 ldconfig 的 systemd 单元被安装,对于 LFS 这样的 原生发行版而言毫无作用还会拖慢启动时间。如果你也是这么想的就删掉它。

-Droot*

此类参数用于确保核心程序和共享库能够安装到根分区的子目录。

-Dsplit-usr=true

此参数用于确保 systemd 可以在 /bin,/lib 和 /sbin 目录工作,而非符号链接指向的 /usr 副本。

-Dsysusers=false

此参数用于防止负责于设置 /etc/group/etc/passwd 文件的 systemd 服务被安装。这两个文件都早在前章就创建了。

-Drpmmacrosdir=no

由于 LFS 不支持 RPM,所以禁用 RPM 宏的安装。

编译软件包:

LANG=en_US.UTF-8 ninja

安装软件包:

LANG=en_US.UTF-8 ninja install

删除不必要的符号链接:

rm -f /usr/bin/xsltproc

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

systemd-machine-id-setup

删除指向 Util-Linux 库的符号链接:

rm -fv /usr/lib/lib{blkid,uuid,mount}.so*

阻止 systemd 创建 /run/nologin,保证没有特权的用户无需 systemd-logind 也能登入:

rm -f /usr/lib/tmpfiles.d/systemd-nologin.conf

6.72.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-escape, systemd-hwdb, systemd-id128, systemd-inhibit, systemd-machine-id-setup, systemd-mount, systemd-notify, systemd-nspawn, systemd-path, 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-241.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/kernel, /usr/lib/modules-load.d, /usr/lib/sysctl.d, /usr/lib/systemd, /usr/lib/tmpfiles.d, /usr/share/doc/systemd-241, /usr/share/factory, /usr/share/systemd, /var/lib/systemd, 和 /var/log/journal

简要介绍

bootctl

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

busctl

用于自检和监控 D-Bus 总线

coredumpctl

用于检索 systemd 日志生成的核心转储

halt

通常调用带 -h 参数的 shutdown 命令,除非已经是运行等级 0,然后告诉内核暂停系统;它会在 /var/log/wtmp 文件中标记正准备关闭系统。

hostnamectl

用于查询或更改系统名称以及相关的设置

init

内核初始化硬件后接管启动过程而启动的第一个进程,随后会根据其配置文件,启动其中所有的进程。

journalctl

用于查询 systemd 日志的内容

kernel-install

用于向和从 /boot 中添加或移除内核以及 initramfs 镜像

localectl

用于查询和更改系统区域设置和键盘布局设置

loginctl

用于自检和控制 systemd 登录管理器的状态

machinectl

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

networkctl

用于检查 systemd-networkd 所看到的网络链接状态

portablectl

用于从本地系统连接或分离便携式服务

poweroff

告诉内核暂停系统并关闭计算机 (查看 halt

reboot

告诉内核重启系统 (查看 halt

resolvconf

使用 systemd-resolved 注册 DNS 服务器和域名的配置

resolvectl

给网络名称解析管理器发送控制指令、或解析域名 、IPv4 和 IPv6 地址、DNS 记录和服务。

runlevel

报告之前和当期的运行等级、即 /var/run/utmp 文件中的最后一个运行等级记录

shutdown

以安全的方式关闭系统、向所有进程发送信号并通知所有登录的用户

systemctl

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

systemd-analyze

用于确定当前引导中的系统启动性能

systemd-ask-password

通过命令行中的问题消息用于向用户查询系统密码或口令

systemd-cat

用于连接进程日志的 STDOUT 和 STDERR

systemd-cgls

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

systemd-cgtop

按照 CPU、内存和磁盘 I/O 负载的顺序显示本地 Linux 控制组层次结构的顶层控制组

systemd-delta

用于识别和比较 /etc 中覆盖 /usr 对应部分的配置文件

systemd-detect-virt

在虚拟化环境中检测执行情况

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

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

systemd-run

用于创建并运行一个临时 .service 或 .scope 单元并在其中运行指定命令

systemd-socket-activate

用于监听设备套接字并在连接时启动进程的工具。

systemd-tmpfiles

基于配置文件格式和 tmpfiles.d 指定的位置创建、删除以及清理易变的和临时文件和目录

systemd-umount

Unmount 挂载点

systemd-tty-ask-password-agent

用于列出或执行正在等待的 systemd 密码请求

telinit

告诉 init 要更改的运行等级

timedatectl

用于查询和更改系统时间和设置

udevadm

通用 udev 管理工具:控制 udevd 守护进程、从 udev 数据库提供信息、监控 uevent、等待 uevent 完成、检测 udev 配置、为指定设备触发 uevents

libsystemd

systemd 主要的实用工具库

libudev

用于获取 udev 设备信息的库