systemd 软件包包含用于控制启动、运行和关闭系统的程序。
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 软件包内容
简要介绍
用于查询固件和启动管理设置 |
|
用于自检和监控 D-Bus 总线 |
|
用于检索 systemd 日志生成的核心转储 |
|
通常调用带
|
|
用于查询或更改系统名称以及相关的设置 |
|
内核初始化硬件后接管引导程序而启动的第一个进程,它会启动设置的其它进程。 |
|
用于查询 systemd 日志的内容 |
|
用于向 / 从 /boot 中添加或移除内核以及 initramfs 镜像 |
|
用于查询和更改系统地区和键盘布局设置 |
|
用于自检和控制 systemd 登录管理器的状态 |
|
用于自检和控制 systemd 虚拟机和容器注册管理器的状态 |
|
用于检查 systemd-networkd 所看到的网络链接状态 |
|
告诉内核暂停系统并关闭计算机 (查看 halt) |
|
告诉内核重启系统 (查看 halt) |
|
报告之前和当期的运行等级、即
|
|
以安全的方式关闭系统、向所有进程发送信号并通知所有登录的用户 |
|
用于自检和控制 systemd 系统和服务管理器的状态 |
|
用于确定当前引导中的系统启动性能 |
|
通过命令行中的问题消息用于向用户查询系统密码或口令 |
|
用于连接进程日志的 STDOUT 和 STDERR |
|
以树的形式递归显示指定 Linux 控制组层次结构的内容 |
|
按照 CPU、内存和磁盘 I/O 负载的顺序显示本地 Linux 控制组层次结构的顶层控制组 |
|
用于识别和比较 |
|
在虚拟化环境中检测执行情况 |
|
用于在 systemd 单元名称中包含转义字符串 |
|
用户管理硬件数据库(hwdb) |
|
用于在关机、睡眠或空闲休眠锁时执行程序 |
|
启动时系统安装程序用随机生成的 ID 初始化保存到
|
|
守护进程脚本用于通知 init 系统状态更改 |
|
用于在轻量级容器空间中运行命令或操作系统 |
|
用于查询系统和用户路径 |
|
用于创建并运行一个临时 .service 或 .scope 单元并在其中运行指定命令 |
|
基于配置文件格式和
|
|
用于列出或执行正在等待的 systemd 密码请求 |
|
告诉 init 要更改的运行等级 |
|
用于查询和更改系统时间和设置 |
|
通用 Udev 管理工具:控制 udevd 守护进程、从 Udev 数据库提供信息、 监控 uevent、等待 uevent 完成、检测 Udev 配置、为指定设备触发 uevents |
|
systemd 工具库 |
|
用于获取 Udev 设备信息的库 |