6.72. Systemd-240

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

估计编译时间: 2.4 SBU
需要硬盘空间: 226 MB

6.72.1. 安装 systemd

应用一个补丁,修复两项致命的安全缺陷:

patch -Np1 -i ../systemd-240-security_fixes-2.patch

创建一个符号链接,绕过不存在的 xsltproc:

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

由于还没有安装好最终的 Util-Linux, 需要在适当的位置创建一些库的符号链接:

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

设定好 man 页面:

tar -xf ../systemd-man-pages-240.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                   \
meson --prefix=/usr                \
      --sysconfdir=/etc            \
      --localstatedir=/var         \
      -Dblkid=true                 \
      -Dbuildtype=release          \
      -Ddefault-dnssec=no          \
      -Dfirstboot=false            \
      -Dinstall-tests=false        \
      -Dkill-path=/bin/kill        \
      -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                \
      ..

meson 选项的含义:

-D*-path=*

这些开关提供了 systemd 在运行时需要的二进制程序的位置, 这些程序有些尚未安装,有些的 pkgconfig 文件还在 /tools/lib/pkgconfig 目录中。

-Ddefault-dnssec=no

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

-Dfirstboot=false

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

-Dinstall-tests=false

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

-Dldconfig=false

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

-Droot*

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

-Dsplit-usr=true

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

-Dsysusers=false

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

编译该软件包:

LANG=en_US.UTF-8 ninja

安装该软件包:

LANG=en_US.UTF-8 ninja install

删除一个不需要的目录:

rm -rfv /usr/lib/rpm

rm -f /usr/bin/xsltproc

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

systemd-machine-id-setup

创建 /lib/systemd/systemd-user-sessions 脚本,使得非特权用户在没有 systemd-logind 的情况下也能登录:

cat > /lib/systemd/systemd-user-sessions << "EOF"
#!/bin/bash
rm -f /run/nologin
EOF
chmod 755 /lib/systemd/systemd-user-sessions

6.72.2. systemd 的内容

安装的程序: bootctl, busctl, coredumpctl, halt, hostnamectl, init, journalctl, kernel-install, localectl, loginctl, machinectl, networkctl, poweroff, reboot, runlevel, shutdown, systemctl, systemd-analyze, systemd-ask-password, systemd-cat, systemd-cgls, systemd-cgtop, systemd-delta, systemd-detect-virt, systemd-escape, systemd-hwdb, systemd-inhibit, systemd-machine-id-setup, systemd-mount, systemd-notify, systemd-nspawn, systemd-path, systemd-resolve, systemd-run, systemd-socket-activate, systemd-stdio-bridge, systemd-tmpfiles, systemd-tty-ask-password-agent, telinit, timedatectl, 以及 udevadm
安装的库: libnss_myhostname.so.2, libnss_mymachines.so.2, libnss_resolve.so.2, libnss_systemd.so.2, libsystemd.so, libsystemd-shared-240.so, 以及 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-240, /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

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

loginctl

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

machinectl

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

networkctl

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

poweroff

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

reboot

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

runlevel

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

shutdown

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

systemctl

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

systemd-analyze

用于分析当前运行系统的引导性能

systemd-ask-password

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

systemd-cat

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

systemd-cgls

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

systemd-cgtop

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

systemd-delta

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

systemd-detect-virt

检测系统是否在虚拟化环境下运行

systemd-escape

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

systemd-hwdb

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

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

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

systemd-tmpfiles

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

systemd-tty-ask-password-agent

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

telinit

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

timedatectl

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

udevadm

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

libsystemd

主要的 systemd 工具库

libudev

用于访问 udev 设备信息的库