Systemd 分支部分
1 安装 systemd
- 大致构建用时: 2.0 SBU
- 所需磁盘空间: 262 MB 解压并进入软件包:
tar -xf systemd-246.tar.gz
cd systemd-246
创建符号链接以解决丢失 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-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 \
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-journal 文件:
systemd-machine-id-setup
启动 preset-all:
systemctl preset-all
为了保证由 systemd-networkd 提供网络配置的系统不会出现问题,禁用 systemd-time-wait-sync.service:
systemctl disable systemd-time-wait-sync.service
防止 systemd 重设最大 PID 值:
systemd-time-wait-sync.service
退出并清理软件包:
cd ../..
rm -rf systemd-246
安装 D-Bus
- 大致构建用时:0.2 SBU
- 所需磁盘空间:18 MB
解压并进入软件包:
tar -xf dbus-1.12.20.tar.gz
cd dbus-1.12.16
准备编译 D-Bus:
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--disable-static \
--disable-doxygen-docs \
--disable-xml-docs \
--docdir=/usr/share/doc/dbus-1.12.20 \
--with-console-auth-dir=/run/console
”--with-console-auth-dir=/run/console” 用于指定 ConsoleKit 验证目录的位置。 编译软件包:
make
该软件包没有测试套件,但要求 LFS 中没有的几个软件包。运行测试套件的命令可以在 BLFS 指南 http://www.linuxfromscratch.org/blfs/view/8.4/general/dbus.html 中找到。 安装软件包:
make install
需要移动共享库到 /lib,因此需要重建 /usr/lib 中的 .so 文件:
mv -v /usr/lib/libdbus-1.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libdbus-1.so) /usr/lib/libdbus-1.so
创建符号链接,使得 D-Bus 和 systemd 可以使用相同的 machine-id 文件:
ln -sfv /etc/machine-id /var/lib/dbus
退出并清理软件包:
cd ..
rm -rf dbus-1.12.20
3 安装 Procps-ng
- 大致构建用时:0.2 SBU
- 所需磁盘空间:17 MB 解压并进入软件包:
tar -xf procps-ng-3.3.16.tar.xz
cd procps-ng-3.3.16
准备编译 Procps-ng:
./configure --prefix=/usr \
--exec-prefix= \
--libdir=/usr/lib \
--docdir=/usr/share/doc/procps-ng-3.3.16 \
--disable-static \
--disable-kill \
--with-systemd
“--disable-kill” 选项告知软件包无需构建已由 Util-linux 软件包安装了的 kill 命令。 编译软件包:
make
用下面的命令运行测试套件:
make check
安装软件包:
make install
最后,如果 /usr 没有挂载的话,移动重要文件到一个可以找到的位置。
mv -v /usr/lib/libprocps.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so
退出并清理软件包:
cd ..
rm -rf procps-ng-3.3.16
4 安装 Util-linux
- 大致构建用时: 1.5 SBU
- 所需磁盘空间: 214 MB 解压并进入软件包:
tar -xf util-linux-2.36.tar.xz
cd util-linux-2.36
FHS 推荐使用 /var/lib/hwclock 目录而不是通常的 /etc 目录作为 adjtime 文件的位置。首先新建目录用于存储 hwclock 程序:
mkdir -pv /var/lib/hwclock
删除早前创建的符号链接:
rm -vf /usr/include/{blkid,libmount,uuid}
准备编译 Util-linux:
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \
--docdir=/usr/share/doc/util-linux-2.36 \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--without-python
--disable 和 --without 选项用于防止出现关于 LFS 中缺少构建组件需要的软件包或和其他软件包安装的程序不一致的警告。 编译软件包:
make
如果需要的话,以非 root 用户运行测试套件:
注意:以 root 用户运行测试套件会对系统有害。为了运行测试套件,必须保证当前运行的系统中用于内核的 CONFIG_SCSI_DEBUG 选项可用,且是以一个模块的方式编译。把它构建到内核中将阻止启动。为了全面覆盖,还必须安装其他的 BLFS 软件包。如果需要的话,可以在重启进入完整的 LFS 系统后用以下命令运行该测试:
bash tests/run.sh --srcdir=$PWD --builddir=$PWD
chown -Rv tester .
su tester -c "make -k check"
安装软件包:
make install
退出并清理软件包:
cd ..
rm -rf util-linux-2.36
5 安装 e2fsprogs
- 大致构建用时: 4.4 SBU
- 所需磁盘空间: 106 MB 解压并进入软件包:
tar -xf e2fsprogs-1.45.6.tar.gz
cd e2fsprogs-1.45.6
E2fsprogs 的文档建议在源码目录下新建目录进行编译:
mkdir -v build
cd build
准备编译 E2fsprogs:
../configure --prefix=/usr \
--bindir=/bin \
--with-root-prefix="" \
--enable-elf-shlibs \
--disable-libblkid \
--disable-libuuid \
--disable-uuidd \
--disable-fsck
环境变量和配置选项的含义:
| 环境变量和配置选项 | 含义 |
|---|---|
| --with-root-prefix="" --bindir=/bin | 有些程序(例如 e2fsck)属于重要程序。比如,当 /usr 没有挂载的时候,仍然要求这些程序可用。它们放在类似 /lib 和 /sbin 的目录中。如果没有传递这个参数到 E2fsprogs 的配置参数中,程序就会被安装在 /usr 目录 |
| --enable-elf-shlibs | 创建该软件包中一些程序会使用的共享库 |
| --disable-* | 这会阻止 E2fsprogs 编译和安装 libuuid 和 libblkid 库、uuidd 守护进程、以及 fsck 封装包。因为 Util-Linux 安装了更新的版本 |
编译软件包:
make
输入命令运行测试:
make check
E2fsprogs 的其中一个测试程序会试图分配 256M 的内存。如果你没有比这更多的 RAM,确保为测试启用了足够的交换空间。阅读 2.1.2.1 构建宿主系统查看创建和启用交换空间的详细信息。
安装二进制文件、文档以及共享库:
make install
安装静态库和头文件:
make install-libs
使安装的静态库可写,以便后面可以移除调试符号:
chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
该软件包安装了一个 gzip 压缩的 .info 文件但并没有更新系统级的 dir 文件。解压该文件并用下面的命令更新系统的 dir 文件:
gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
如果需要的话,用下面的命令创建和安装一些额外的文档:
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
退出并清理软件包:
cd ../..
rm -rf e2fsprogs-1.45.6