6.63. Systemd-219

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

大概编译时间: 2.1 SBU
需要磁盘空间 815 MB

6.63.1.安装 systemd

首先创建文件使得当使用第五章中编译的 Util-Linux 以及停用默认的 LTO(链接时优化) 时能顺利编译 systemd:

cat > config.cache << "EOF"
KILL=/bin/kill
HAVE_BLKID=1
BLKID_LIBS="-lblkid"
BLKID_CFLAGS="-I/tools/include/blkid"
HAVE_LIBMOUNT=1
MOUNT_LIBS="-lmount"
MOUNT_CFLAGS="-I/tools/include/libmount"
cc_cv_CFLAGS__flto=no
EOF

默认要停用 LTO 是因为它会使 systemd 以及其它辅助程序链接到 libgcc_s.so、导致编译速度下降以及编译后代码量更大。

另外,修复一个使用第五章中编译的 Util-Linux 时的编译错误:

sed -i "s:blkid/::" $(grep -rl "blkid/blkid.h")

应用下面的补丁使得安装 compat pkg-config 文件但不安装在 LFS 中没有用的 compat 库:

patch -Np1 -i ../systemd-219-compat-1.patch

停用一个总是失败的测试例程:

sed -i "s:test/udev-test.pl ::g" Makefile.in

准备编译 systemd:

./configure --prefix=/usr                                           \
            --sysconfdir=/etc                                       \
            --localstatedir=/var                                    \
            --config-cache                                          \
            --with-rootprefix=                                      \
            --with-rootlibdir=/lib                                  \
            --enable-split-usr                                      \
            --disable-gudev                                         \
            --disable-firstboot                                     \
            --disable-ldconfig                                      \
            --disable-sysusers                                      \
            --without-python                                        \
            --docdir=/usr/share/doc/systemd-219                     \
            --with-dbuspolicydir=/etc/dbus-1/system.d               \
            --with-dbussessionservicedir=/usr/share/dbus-1/services \
            --with-dbussystemservicedir=/usr/share/dbus-1/system-services

配置选项的含义:

--config-cache

该选项告诉编译系统使用之前创建的 config.cache 文件。

--with-root*

这些选项确保核心程序以及共享库安装到根目录的子目录中。

--enable-split-usr

该选项确保系统中 /bin、/lib 和 /sbin 目录没有到 /usr 对应位置的符号链接时 systemd 仍能正常工作。

--disable-gudev --without-python

这些选项停用 LFS 没有提供所需依赖的可用功能。

--disable-firstboot

该选项防止安装系统初次启动时会进行设置的 systemd 服务。由于 LFS 中所有都要手动设置,它们并无用处。

--disable-ldconfig

该选项防止安装启动时会运行 ldconfig 而导致启动时间过长的 systemd 单元。尽管对于类似 LFS 之类的源发行版并无用处,如果需要该功能的话可以移除这个选项。

--disable-sysusers

该选项防止安装设置 /etc/group/etc/passwd 文件的 systemd 服务。本章前面章节中已经创建了这两个文件。

--with-dbus*

这些选项确保 D-Bus 配置文件安装到了正确的位置。

编译软件包:

make LIBRARY_PATH=/tools/lib

该软件包有个测试套件,但只能在安装后运行。

安装软件包:

make LD_LIBRARY_PATH=/tools/lib install

移动 NSS 库到 /lib

mv -v /usr/lib/libnss_{myhostname,mymachines,resolve}.so.2 /lib

移除一个不必要的目录:

rm -rfv /usr/lib/rpm

创建和 Sysvinit 兼容的符号链接,使得 systemd 作为默认的启动系统:

for tool in runlevel reboot shutdown poweroff halt telinit; do
     ln -sfv ../bin/systemctl /sbin/${tool}
done
ln -sfv ../lib/systemd/systemd /sbin/init

移除一个到不存在组的引用并修复一个配置文件使得启动时不会导致 systemd-tmpfiles 失败:

sed -i "s:0775 root lock:0755 root root:g" /usr/lib/tmpfiles.d/legacy.conf
sed -i "/pam.d/d" /usr/lib/tmpfiles.d/etc.conf

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

systemd-machine-id-setup

由于测试套件高度依赖于宿主系统的内核配置,一些测试很可能失败。另外还需要做些更改使得不会查找本章后面 Util-Linux 软件包安装的一个程序。用以下命令测试结果:

sed -i "s:minix:ext4:g" src/test/test-path-util.c
make LD_LIBRARY_PATH=/tools/lib -k check

6.63.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-notify, systemd-nspawn, systemd-path, systemd-run, 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, libsystemd.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-219, /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 所看到的网络链接状态

poweroff

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

reboot

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

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

用于在关机、睡眠或空闲休眠锁时执行程序

systemd-machine-id-setup

启动时系统安装程序用随机生成的 ID 初始化保存到 /etc/machine-id 的机器 ID

systemd-notify

守护进程脚本用于通知 init 系统状态更改

systemd-nspawn

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

systemd-path

用于查询系统和用户路径

systemd-run

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

systemd-tmpfiles

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

systemd-tty-ask-password-agent

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

telinit

告诉 init 要更改的运行等级

timedatectl

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

udevadm

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

libsystemd

systemd 工具库

libudev

用于获取 Udev 设备信息的库