前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LFS 系列】从零开始 DIY Linux 系统:(六)构建 LFS 系统 - Systemd-219

【LFS 系列】从零开始 DIY Linux 系统:(六)构建 LFS 系统 - Systemd-219

作者头像
Lucifer三思而后行
发布2021-10-08 15:49:48
7920
发布2021-10-08 15:49:48
举报
文章被收录于专栏:公众号:Lucifer三思而后行

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

安装 systemd

首先进入到源码目录,解压软件包:

代码语言:javascript
复制
cd /sources
tar xf systemd-219.tar.xz
cd systemd-219

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

代码语言:javascript
复制
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 时的编译错误:

代码语言:javascript
复制
sed -i "s:blkid/::" $(grep -rl "blkid/blkid.h")

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

代码语言:javascript
复制
patch -Np1 -i ../systemd-219-compat-1.patch

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

代码语言:javascript
复制
sed -i "s:test/udev-test.pl ::g" Makefile.in

准备编译 systemd:

代码语言:javascript
复制
./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

编译软件包:

代码语言:javascript
复制
make LIBRARY_PATH=/tools/lib

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

安装软件包:

代码语言:javascript
复制
make LD_LIBRARY_PATH=/tools/lib install

移动 NSS 库到 /lib:

代码语言:javascript
复制
mv -v /usr/lib/libnss_{myhostname,mymachines,resolve}.so.2 /lib

移除一个不必要的目录:

代码语言:javascript
复制
rm -rfv /usr/lib/rpm

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

代码语言:javascript
复制
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 失败:

代码语言:javascript
复制
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 文件:

代码语言:javascript
复制
systemd-machine-id-setup

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

代码语言:javascript
复制
sed -i "s:minix:ext4:g" src/test/test-path-util.c
make LD_LIBRARY_PATH=/tools/lib -k check

安装完成后清理工作:

代码语言:javascript
复制
cd ..
rm -rf systemd-219

本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装 systemd
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档