System V 分支部分

安装 Eudev

  • 大致构建用时: 0.2 SBU
  • 所需磁盘空间: 82 MB 解压并进入软件包:
tar -xf eudev-3.2.9.tar.gz
cd eudev-3.2.9

准备编译 Eudev:

./configure --prefix=/usr           \
            --bindir=/sbin          \
            --sbindir=/sbin         \
            --libdir=/usr/lib       \
            --sysconfdir=/etc       \
            --libexecdir=/lib       \
            --with-rootprefix=      \
            --with-rootlibdir=/lib  \
            --enable-manpages       \
            --disable-static

编译软件包:

make

现在创建一些目录,不仅仅是为了测试需求,一部分的安装操作也将用到:

mkdir -pv /lib/udev/rules.d
mkdir -pv /etc/udev/rules.d

测试编译结果,通过:

make check

安装软件包:

make install

安装一些对 LFS 的环境中有益的自定义规则和支持文件:

tar -xvf ../udev-lfs-20171102.tar.xz
make -f udev-lfs-20171102/Makefile.lfs install

配置 Eudev

有关硬件的设备存放在 /etc/udev/hwdb.d 和 /lib/udev/hwdb.d 目录中。Eudev 需要将这些信息编译到一个二进制数据库文件 /etc/udev/hwdb.bin 中去。创建初始数据库:

udevadm hwdb --update

该命令需在每次更新硬件信息时运行。 退出并清理软件包:

cd ..
rm -rf eudev-3.2.9

2 安装 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

3 安装 Util-linux

  • 大致构建用时: 1.2 SBU
  • 所需磁盘空间: 260 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

准备编译 Util-linux:

./configure ADJTIME_PATH=/var/lib/hwclock/adjtime   \
            --docdir=/usr/share/doc/util-linux-2.34 \
            --disable-chfn-chsh  \
            --disable-login      \
            --disable-nologin    \
            --disable-su         \
            --disable-setpriv    \
            --disable-runuser    \
            --disable-pylibmount \
            --disable-static     \
            --without-python     \
            --without-systemd    \
            --without-systemdsystemunitdir

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

4 安装 e2fsprogs

  • 大致构建用时: 1.6 SBU
  • 所需磁盘空间: 96 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.5 节「在分区上创建文件系统」以及 第 2.7 节「挂载新分区」查看创建和启用交换空间的详细信息。 安装二进制文件、文档以及共享库:

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

5 安装 Sysklogd

  • 大致构建用时:少于 0.1 SBU
  • 所需磁盘空间: 0.6 MB 解压并进入软件包:
tar -xf sysklogd-1.5.1.tar.gz
cd sysklogd-1.5.1

首先,修复 klogd 在某些条件下会导致「segmentation fault」的问题,并修复一个过时的程序结构:

sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.c
sed -i 's/union wait/int/' syslogd.c

编译软件包:

make

该软件包没有测试套件。 安装软件包:

make BINDIR=/sbin install

退出并清理软件包:

cd ..
rm -rf sysklogd-1.5.1

创建/etc/syslog.conf 文件:

cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf

auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *

# End /etc/syslog.conf
EOF

6 安装 Sysvinit

  • 大致构建用时:少于 0.1 SBU
  • 所需磁盘空间: 1.4 MB 解压并进入软件包:
tar -xf sysvinit-2.97.tar.xz
cd sysvinit-2.97

打一个补丁移除一些其他软件包安装的程序,改正一个消息,并修复一个编译器的警告:

patch -Np1 -i ../sysvinit-2.97-consolidated-1.patch

编译软件包:

make

该软件包没有测试套件。 安装软件包:

make install

退出并清理软件包:

cd ..
rm -rf sysvinit-2.97