0x00 回顾与介绍
上一节实际上我们已经构建出来一个非常的小的linux操作系统了,虽然我们还更倾向与叫他工具链,实际上就没内核,文件系统,gurb 这些东西了,但是后面我们要做的 LFS 实际上大量的操作都是和前面重复的。但是我们是用的与宿主无关的工具编译出来的。这节我们用到最多的实际上就是 chroot ,下面马上就会要用到了,千万要注意做这些工具也好,编译软件也好,做这些东西时候你的用户是什么,我每次都会提醒一下,目的是让大家跟着做一次成功。安装软件时候其实是有严格的顺序的,这点非常的用心,大家装一遍就能体会出来,我们刚装完的软件是后续软件的依赖程序,
0x01 准备虚拟内核文件系统
内核会挂载几个文件系统用于自己和用户空间程序交换信息。这些文件系统是虚拟的,并不占用实际磁盘空间,它们的内容会放在内存里。
这时候你的终端里面的用户应该是 root 而不是 lfs 用户,上一篇最后的时候你应该已经 exit 到 root 了。还有就是如果是用的远程的小伙伴记得使用 screen 哈,具体用法第一篇时候就说过了。下面我们开始做
mkdir -pv $LFS/{dev,proc,sys,run}
创建2个最重要的设备节点 null 和 console,内和引导的时候必要的节点
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
挂载激活 /dev
mount -v --bind /dev $LFS/dev
挂载虚拟文件系统
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
处理一下 /dev/shm 相关的问题
if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
0x02 进入 chroot
chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。
我们现在在 root 账户下,用 chroot 切换一下,千万记得如果以后中途有退出或是什么的,要做一下这个 chroot。还记得前面让大家装的 screen 么,这会就该用上了。 screen -S 111 建立一个名字叫 111 的窗口,出问题了 screen -r 111 就能恢复了,前提是主机不能重启
chroot "$LFS" /tools/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
做完以后会是下面这样的返回, /etc/passwd 文件还没有被创建 后面做出来就好了。这不是问题
(lfs chroot) I have no name!:/#
每次切换完了 bash 都用多核心编译的话要么 是make -j8 要不就 都切换完 做一个环境变量进去 先加一条环境变量
export MAKEFLAGS='-j 8' 这样就不用每次后面都是make -j8 了,直接敲 mak 了
0x03 创建目录,文件,符号链接
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}
case $(uname -m) in
x86_64) mkdir -v /lib64 ;;
esac
mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}
mkdir -p 是递归的方式创建文件夹,没有上一级就自动创建上一级。这书比较老这里没更新 /media 里面还创建了软驱用的文件夹,实际上没啥用。说说上面创建的东西按先后顺序说
/bin 一般用户程序
/boot 引导
/etc 配置文件
/etc/opt /opt 下面安装软件的配置文件
/etc/sysconfig 系统配置文件
/home 家目录
/lib 各种库
/lib/firmware 固件
/mnt 常用的挂载目录
/opt 用户安装的大型程序的位置,比如chrome
/media 媒体目录
/media/floppy 软驱
/media/cdrom 光驱
/sbin root 用户程序
/srv 服务启动之后需要访问的数据目录
/var 一般放动态的东西,比如 日志。
/root root 的家目录,只能它自己访问
/tmp 临时目录,重启后内容就没了
/var/tmp 同上
/usr 应用程序存放目录
/usr/bin 同/bin 一样
/usr/include 各种头文件以及linux api的接口文件存放的地方
/usr/lib 同/lib 一样
/usr/sbin 同 /sbin 一样
/usr/src 一般里面没东西,约定俗成放源码用
/usr/local/bin 和/bin 一样
/usr/local/include 同/usr/include 一样
/usr/local/lib 同/lib 一样
/usr/local/sbin 同 /sbin 一样
/usr/local/src 一般里面没东西,约定俗成放源码用
/usr/share 共享文件目录
/usr/share/color 主题配色
/usr/share/dict 字典 word list
/usr/share/doc 系统或软件的说明文档
/usr/share/info 软件信息
/usr/share/locale 本地化
/usr/share/man 程序说明文件存放目录
/usr/share/misc 杂项,堆放不好归类的东西 比如 nfs 的挂载目录
/usr/share/terminfo 时间信息
/usr/share/zoneinfo 时区信息
/usr/share/man/man1-8 man手册用到的
/usr/local/share 这个目录下面的东西和/usr/share 的一样就不一一赘述了
/lib64 64位的库
/var/log 日志
/var/mail 邮件
/var/spool 将要完成的东西,比如说打印的队列,或邮件的队列
/run 系统运行时需要的东西,重启了以后重新生成
/var/lock 文件锁目录,这里面的东西别人动不了
/var/opt 存放程序的变量
/var/cache 存放应用程序的缓存数据
/var/lib 系统或者某个应用程序运行过程中的状态信息
/var/lib/color 同上
/var/lib/misc 同上
/var/lib/locate 同上
/var/local 安装的程序的可变数据
下面 创建必要的文件和符号链接
ln -sv /tools/bin/{bash,cat,chmod,dd,echo,ln,mkdir,pwd,rm,stty,touch} /bin
ln -sv /tools/bin/{env,install,perl,printf} /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.{a,so{,.6}} /usr/lib
install -vdm755 /usr/lib/pkgconfig
ln -sv bash /bin/sh
ln -sv /proc/self/mounts /etc/mtab
这里的黏贴原文 这块比较有用
/bin/bash
许多 bash 脚本指定了 /bin/bash。
/bin/cat
这个路径在 Glibc 的配置脚本里写死了。
/bin/dd
到 dd 的路径将写死在/usr/bin/libtool 实用工具中。
/bin/echo
这个是为了满足 Glibc 测试套件里的一个测试用例,它会检测 /bin/echo。
/usr/bin/env
这个路径名硬编码到许多软件包的构建过程中。
/usr/bin/install
到 install 的路径将写死在 /usr/lib/bash/Makefile.inc 文件中。
/bin/ln
到 ln 的路径将写死在 /usr/lib/perl5/5.28.1/
/bin/pwd
某些 configure 脚本,特别是 Glibc 的,写死了这个路径。
/bin/rm
到 rm 的路径将写死在 /usr/lib/perl5/5.28.1/
/bin/stty
这个路径在 Expect 软件中写死了,所以在 Binutils 和 GCC 测试套件中会需要它。
/usr/bin/perl
许多 Perl 脚本写死了这个路径调用 perl 执行程序。
/usr/lib/libgcc_s.so{,.1}
Glibc 需要这个让 pthreads 库正常工作。
/usr/lib/libstdc++{,.6}
在 Glibc 的一些测试套件和对于 GMP 的 C++ 支持中会需要。
/bin/sh
许多 shell 脚本写死了位置 /bin/sh。
写 passwd 文件
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
systemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false
systemd-network:x:76:76:systemd Network Management:/:/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false
systemd-coredump:x:79:79:systemd Core Dumper:/:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
创建 /etc/group 文件(各种用户组)
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
kvm:x:61:
systemd-bus-proxy:x:72:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
systemd-coredump:x:79:
wheel:x:97:
nogroup:x:99:
users:x:999:
EOF
现在有了 passwd 了重新开一个 bash ,「I have no name!」就没了
exec /tools/bin/bash --login +h
touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664 /var/log/lastlog
chmod -v 600 /var/log/btmp
0x04 开始正式安装软件
4.1 Linux-4.20.12 API 头文件
编译出来一些有用的头文件
cd /sources
tar xf linux-4.20.12.tar.xz
cd linux-4.20.12
make mrproper
# 清空之前没用的配置
make INSTALL_HDR_PATH=dest headers_install
# 编译有用的头文件
find dest/include \( -name .install -o -name ..install.cmd \) -delete
# 删除一些没用的头文件
cp -rv dest/include/* /usr/include
# 把编译出来的头文件放在正确的地方给其他程序用
cd /sources
rm -rf linux-4.20.12
4.2 Man-pages-4.16
man 手册
tar xf man-db-2.8.5.tar.xz
cd man-db-2.8.5
make install
# 编译安装
cd /sources
rm -rf man-db-2.8.5
4.3 Glibc-2.29
glibc 主要的 c 函数
tar xf glibc-2.29.tar.xz
cd glibc-2.29
patch -Np1 -i ../glibc-2.29-fhs-1.patch
# 打补丁
ln -sfv /tools/lib/gcc /usr/lib
# 创建符号链接
改库的位置
case $(uname -m) in
i?86) GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/8.2.0/include
ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
;;
x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include
ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
;;
esac
rm -f /usr/include/limits.h
# 删除没用的
mkdir -v build
cd build
CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=3.2 \
--enable-stack-protector=strong \
libc_cv_slibdir=/lib
unset GCC_INCDIR
设置 gcc 和系统的 include 目录以避免在调试符号中引入无效路径。
make
case $(uname -m) in
i?86) ln -sfnv $PWD/elf/ld-linux.so.2 /lib ;;
x86_64) ln -sfnv $PWD/elf/ld-linux-x86-64.so.2 /lib ;;
esac
# 为测试做准备
这个测试必须做
make check
已知会报错 inet/tst-idna_name_classify 已知会在 LFS 的 chroot 环境中失败。这个正常没关系
touch /etc/ld.so.conf
# 避免找安装 glibc 时候找不到这个文件
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
# 修改 Makefire
make install
# 安装
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
# 为 nscd 安装配置文件并创建运行时目录 NSCD(name service cache daemon)是GLIBC关于网络库的一个组件,服务基于glibc开发的各类网络服务
install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /lib/systemd/system/nscd.service
# 为 nscd 安装系统支持文件
语言环境相关
mkdir -pv /usr/lib/locale
localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SIJS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
make localedata/install-locales
cd /sources/
rm -rf glibc-2.29
添加 nsswitch.conf glibc跟网络相关的配置文件
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
添加时区数据
tar -xf ../../tzdata2018i.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward pacificnew systemv; do
zic -L /dev/null -d $ZONEINFO ${tz}
zic -L /dev/null -d $ZONEINFO/posix ${tz}
zic -L leapseconds -d $ZONEINFO/right ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
更改时区
ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
创建一个新文件 /etc/ld.so.conf 动态库位置的配置文件,这个非常的有用,平常都是写到 /etc/ld.so.conf.d/这个文件夹里面
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
# Add an include directory
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d
4.4 调整工具链
工具链做备份
mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
修改 gcc 的参数,让它自己重新去找动态库的位置
gcc -dumpspecs | sed -e 's@/tools@@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`dirname $(gcc --print-libgcc-file-name)`/specs
检查更改的效果,看有没有生效
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
正常的返回是下面的结果,说明修改的成功了
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
看启动文件是否正确
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
# 返回
/usr/lib/../lib/crt1.o succeeded
/usr/lib/../lib/crti.o succeeded
/usr/lib/../lib/crtn.o succeeded
看头文件的位置是否正确
grep -B1 '^ /usr/include' dummy.log
# 返回
#include <...> search starts here:
/usr/include
看lib库的位置是否正确
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
# 返回 这里我们能看到 5 条 ‘-linux-gnu' 的路径 不用管
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib")
看 libc 是否正确
grep "/lib.*/libc.so.6 " dummy.log
# 返回
attempt to open /lib/libc.so.6 succeeded
看 gcc 用的动态库是否正确
grep found dummy.log
# 返回
found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2
删除刚才的文件
rm -v dummy.c a.out dummy.log
4.5 Zlib-1.2.11
压缩解压用得上的库,这里就一点点体现出来顺序来,前面的程序给后面的铺路
tar xf zlib-1.2.11.tar.xz
cd zlib-1.2.11
./configure --prefix=/usr
make
make install
mv -v /usr/lib/libz.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so
# 移动一些动态库
cd /sources/
rm zlib-1.2.11 -r
4.6 File-5.36
判断文件类型的软件
tar xf file-5.36.tar.gz
cd file-5.36
./configure --prefix=/usr
make
make install
cd /sources/
rm file-5.36 -r
4.7 Readline-8.0
命令行编辑相关的
tar xf readline-8.0.tar.gz
cd readline-8.0
避免链接错误
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/readline-8.0
make SHLIB_LIBS="-L/tools/lib -lncursesw"
# 强制链接到 libncursesw
make SHLIB_LIBS="-L/tools/lib -lncursesw" install
# 安装
修改动态库和权限
mv -v /usr/lib/lib{readline,history}.so.* /lib
chmod -v u+w /lib/lib{readline,history}.so.*
ln -sfv ../../lib/$(readlink /usr/lib/libreadline.so) /usr/lib/libreadline.so
ln -sfv ../../lib/$(readlink /usr/lib/libhistory.so ) /usr/lib/libhistory.so
cd /sources/
rm readline-8.0 -r
4.8 M4-1.4.18
m4 是一个通用的宏处理器
tar xf m4-1.4.18.tar.xz
cd m4-1.4.18
针对 glibc 2.28做改进
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
./configure --prefix=/usr
make
make install
cd /sources/
rm m4-1.4.18 -r
4.9 Bc-1.07.1
一个任意精度处理的软件 提供一种脚本语言
tar xf bc-1.07.1.tar.gz
cd bc-1.07.1
改头文件
cat > bc/fix-libmath_h << "EOF"
#! /bin/bash
sed -e '1 s/^/{"/' \
-e 's/$/",/' \
-e '2,$ s/^/"/' \
-e '$ d' \
-i libmath.h
sed -e '$ s/$/0}/' \
-i libmath.h
EOF
更改动态库
ln -sv /tools/lib/libncursesw.so.6 /usr/lib/libncursesw.so.6
ln -sfv libncursesw.so.6 /usr/lib/libncurses.so
更改 configure 文件
sed -i -e '/flex/s/as_fn_error/: ;; # &/' configure
./configure --prefix=/usr \
--with-readline \
--mandir=/usr/share/man \
--infodir=/usr/share/info
make
make install
cd /sources/
rm bc-1.07.1 -r
4.10 Binutils-2.32
tar xf binutils-2.32.tar.xz
cd binutils-2.32
先确定环境可用
expect -c "spawn ls"
# 返回
spawn ls
mkdir -v build
cd build
../configure --prefix=/usr \
--enable-gold \
--enable-ld=default \
--enable-plugins \
--enable-shared \
--disable-werror \
--enable-64-bit-bfd \
--with-system-zlib
使用zlib 替换自带的库,这就用上了前面的zlib 了
编译一下
make tooldir=/usr
必须进行测试(这里加了环境变量 -j 8 )
make -k check
安装
make tooldir=/usr install
cd /sources/
rm binutils-2.32 -rf
4.11 GMP-6.1.2
一些数学库,gcc 的前提条件
tar xf gmp-6.1.2.tar.xz
cd gmp-6.1.2
./configure --prefix=/usr \
--enable-cxx \
--disable-static \
--docdir=/usr/share/doc/gmp-6.1.2
make
make html
这个必须测试
make check 2>&1 | tee gmp-check-log
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log 有 190 个通过就可以了
安装
make install
make install-html
cd /sources/
rm gmp-6.1.2 -rf
4.12 MPFR-4.0.2
多精度的数学模型,gcc 的依赖
tar xf mpfr-4.0.2.tar.xz
cd mpfr-4.0.2
./configure --prefix=/usr \
--disable-static \
--enable-thread-safe \
--docdir=/usr/share/doc/mpfr-4.0.2
make
make html
必须测试 make check
make install
make install-html
cd /sources/
rm mpfr-4.0.2 -r
4.13 MPC-1.1.0
数学计算相关 gcc 依赖软件
tar xf mpc-1.1.0.tar.gz
cd mpc-1.1.0
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/mpc-1.1.0
make
make html
make install
make install-html
cd /sources/
rm mpc-1.1.0 -r
4.14 Shadow-4.6
密码处理相关的软件
tar xf shadow-4.6.tar.xz
cd shadow-4.6
处理一下 groups 相关的东西
sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
加密方式改成 SHA-512
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \
-e 's@/var/spool/mail@/var/mail@' etc/login.defs
用 useradd 1000 生成第一个组号
UID 0 root用户
UID 1-999 是占坑用户,即一写无法登录的用户(以前是系统是1-499,最近刚改)
UID 1000 以上是正常的可登录用户
sed -i 's/1000/999/' etc/useradd
./configure --sysconfdir=/etc --with-group-name-max-length=32
make
make install
移动一下程序的位置
mv -v /usr/bin/passwd /bin
配置Shadow
启用 shadow 密码:
pwconv
启用 shadow 组密码:
grpconv
设置 root 密码
passwd root
cd /sources/
rm shadow-4.6 -r
4.15 GCC-8.2.0
至关重要的 gcc 是 c 和 c++ 的编译器
tar xf gcc-8.2.0.tar.xz
cd gcc-8.2.0
64位系统上改一下 lib 库的位置
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
删除以前库的软链接,新装出来的库会写在这个位置上
rm -f /usr/lib/gcc
使用 sed 不用 tools 里面的 sed,又用到了zlib 这个库,充分说明先后顺序的重要性
SED=sed \
../configure --prefix=/usr \
--enable-languages=c,c++ \
--disable-multilib \
--disable-bootstrap \
--disable-libmpx \
--with-system-zlib
make
检查,这个软件必须要做
ulimit -s 32768
# 更改栈的大小,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。
# 它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶
# 需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
rm ../gcc/testsuite/g++.dg/pr83239.C
# 删除一个已知的问题
chown -Rv nobody .
su nobody -s /bin/bash -c "PATH=$PATH make -k check"
# 用 nobody 不会因为出错就停下来
结果对比 和 http://www.linuxfromscratch.org/lfs/build-logs/8.4/ 去比较就行了只要你完全按我的做的不会出什么问题
../contrib/test_summary | grep -A7 Summ
# 查看 check 的摘要
# 对比的话下载下来上面的log,cat log| grep -A7 Summ 这样就行了,对比一下。
mak install
ln -sv ../usr/bin/cpp /lib
# 重建软链接,避免有些软件找不到
ln -sv gcc /usr/bin/cc
改名cc 避免有些软件找不到
install -v -dm755 /usr/lib/bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/8.2.0/liblto_plugin.so \
/usr/lib/bfd-plugins/
# 做时间优化的一个链接
继续检测
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
# 跟以前一样说过,做一个最简单的c的源码编译后看返回
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
# 返回
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/../../../../lib/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/../../../../lib/crtn.o succeeded
grep -B4 '^ /usr/include' dummy.log
# 返回
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include-fixed
/usr/include
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
# 返回 有'-linux-gnu' 的路径 的忽略不管
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
grep "/lib.*/libc.so.6 " dummy.log
# 返回
attempt to open /lib/libc.so.6 succeeded
grep found dummy.log
# 返回
found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2
rm -v dummy.c a.out dummy.log
# 删了测试文件
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
# 移动一下文件的位置
cd /sources/
rm gcc-8.2.0 -rf
4.16 Bzip2-1.0.6
解压 bz2 用的工具
tar xf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch
# 打补丁
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
# 改链接
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
# 改 man 手册的编译文件
make -f Makefile-libbz2_so
make clean
# 准备
make
make PREFIX=/usr install
# 安装
cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat
# 清理修改链接
cd /sources/
rm bzip2-1.0.6 -rf
4.17 Pkg-config-0.29.2
源码包信息配置工具
tar xf pkg-config-0.29.2.tar.gz
cd pkg-config-0.29.2
./configure --prefix=/usr \
--with-internal-glib \
--disable-host-tool \
--docdir=/usr/share/doc/pkg-config-0.29.2
# 使用内部的 lib 库
make
make install
cd /sources/
rm pkg-config-0.29.2 -r
4.18 Ncurses-6.1
终端字符相关的软件
tar xf ncurses-6.1.tar.gz
cd ncurses-6.1
sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in
# 改源码,调整静态库
./configure --prefix=/usr \
--mandir=/usr/share/man \
--with-shared \
--without-debug \
--without-normal \
--enable-pc-files \
--enable-widec
make
make install
mv -v /usr/lib/libncursesw.so.6* /lib
# 移动共享库
ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so
# 重建软链接
for lib in ncurses form panel menu ; do
rm -vf /usr/lib/lib${lib}.so
echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so
ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc
done
# 非等宽字体的支持
rm -vf /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
ln -sfv libncurses.so /usr/lib/libcurses.so
# 用到lcurses 程序的支持
cd /sources/
rm ncurses-6.1 -rf
4.19 Attr-2.4.48
文件系统扩展属性管理的软件
tar xf attr-2.4.48.tar.gz
cd attr-2.4.48
./configure --prefix=/usr \
--disable-static \
--sysconfdir=/etc \
--docdir=/usr/share/doc/attr-2.4.48
make
make install
mv -v /usr/lib/libattr.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so
# 重建动态库
cd /sources/
rm attr-2.4.48 -rf
4.20 Acl-2.2.53
访问控制列表
tar xf acl-2.2.53.tar.gz
cd acl-2.2.53
./configure --prefix=/usr \
--disable-static \
--libexecdir=/usr/lib \
--docdir=/usr/share/doc/acl-2.2.53
make
make install
mv -v /usr/lib/libacl.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so
# 移动到 /lib 下面
cd /sources/
rm acl-2.2.53 -rf
4.21 Libcap-2.26
root 权限划分给不同组使用
tar xf libcap-2.26.tar.xz
cd libcap-2.26
```
```
sed -i '/install.*STALIBNAME/d' libcap/Makefile
# 避免使用静态库
make
make RAISE_SETFCAP=no lib=lib prefix=/usr install
chmod -v 755 /usr/lib/libcap.so.2.26
# 安装
mv -v /usr/lib/libcap.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so
# 重建 lib 库
```
```
cd /sources/
rm libcap-2.26 -rf
4.22 Sed-4.7
文本处理软件
tar xf sed-4.7.tar.xz
cd sed-4.7
sed -i 's/usr/tools/' build-aux/help2man
sed -i 's/testsuite.panic-tests.sh//' Makefile.in
# 修复环境问题
./configure --prefix=/usr --bindir=/bin
make
make html
cd /sources/
rm sed-4.7 -rf
4.23 Psmisc-23.2
进程相关的一个软件 pstree 就包含在里面
tar xf psmisc-23.2.tar.xz
cd psmisc-23.2
./configure --prefix=/usr
make
make install
移动程序
mv -v /usr/bin/fuser /bin
mv -v /usr/bin/killall /bin
cd /sources/
rm psmisc-23.2 -rf
4.24 Iana-Etc-2.30
网络服务与协议相关的
tar xf iana-etc-2.30.tar.bz2
cd iana-etc-2.30
make
make install
cd /sources/
rm iana-etc-2.30 -rf
4.25 Bison-3.3.2
Bison是一种通用目的的分析器生成器。它将LALR(1)上下文无关文法的描述转化成分析该文法的C程序。与 yacc 兼容使用
tar xf bison-3.3.2.tar.xz
cd bison-3.3.2
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.3.2
make
make install
cd /sources/
rm bison-3.3.2 -rf
4.26 Flex-2.6.4
一个用于生成能识别文本模式程序的工具
tar xf flex-2.6.4.tar.gz
cd flex-2.6.4
sed -i "/math.h/a #include <malloc.h>" src/flexdef.h
# 修复 glibc 2.26 的问题
HELP2MAN=/tools/bin/true \
./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.4
# man手册
make
make install
ln -sv flex /usr/bin/lex
# 创建软链接
cd /sources/
rm flex-2.6.4 -rf
4.27 Grep-3.3
字符处理
tar xf grep-3.3.tar.xz
cd grep-3.3
./configure --prefix=/usr --bindir=/bin
make
make install
cd /sources/
m -rf grep-3.3
4.28 Bash-5.0
bash
tar xf bash-5.0.tar.gz
cd bash-5.0
./configure --prefix=/usr \
--docdir=/usr/share/doc/bash-5.0 \
--without-bash-malloc \
--with-installed-readline
# 使用前面装好的 readline
make
make install
mv -vf /usr/bin/bash /bin
# 移动到 bin下
使用新编译出来的 bash
exec /bin/bash --login +h
cd /sources/
rm bash-5.0 -rf
4.29 Libtool-2.4.6
提供通用库编译支持服务
tar xf libtool-2.4.6.tar.xz
cd libtool-2.4.6
./configure --prefix=/usr
make
make install
cd /sources/
rm libtool-2.4.6 -rf
4.30 GDBM-1.18.1
GDBM 数据库相关
tar xf gdbm-1.18.1.tar.gz
cd gdbm-1.18.1
./configure --prefix=/usr \
--disable-static \
--enable-libgdbm-compat
# 为旧程序提供支持
make
make install
cd /sources/
rm gdbm-1.18.1 -rf
4.31 Gperf-3.1
为键集合生成完美哈希
tar xf gperf-3.1.tar.gz
cd gperf-3.1
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1
make
make install
cd /sources/
rm gperf-3.1 -rf
4.32 Expat-2.2.6
xml 解析用的
tar xf expat-2.2.6.tar.bz2
cd expat-2.2.6
sed -i 's|usr/bin/env |bin/|' run.sh.in
# 修复问题
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/expat-2.2.6
make
make install
cd /sources/
rm expat-2.2.6 -rf
4.33 Inetutils-1.9.4
网络相关的程序
tar xf inetutils-1.9.4.tar.xz
cd inetutils-1.9.4
./configure --prefix=/usr \
--localstatedir=/var \
--disable-logger \
--disable-whois \
--disable-rcp \
--disable-rexec \
--disable-rlogin \
--disable-rsh \
--disable-servers
make
make install
mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin
mv -v /usr/bin/ifconfig /sbin
# 修改一下能让别的程序使用
cd /sources/
rm -rf inetutils-1.9.4
4.34 Perl-5.28.1
tar xf perl-5.28.1.tar.xz
cd perl-5.28.1
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
# 改下 hosts
export BUILD_ZLIB=False
export BUILD_BZIP2=0
# 使用已安装的库不用自带的
sh Configure -des -Dprefix=/usr \
-Dvendorprefix=/usr \
-Dman1dir=/usr/share/man/man1 \
-Dman3dir=/usr/share/man/man3 \
-Dpager="/usr/bin/less -isR" \
-Duseshrplib \
-Dusethreads
make
make install
unset BUILD_ZLIB BUILD_BZIP2
安装并清理
cd /sources/
rm perl-5.28.1 -rf
4.35 XML::Parser-2.44
XML 解析器的 Perl Expat 接口
tar xf XML-Parser-2.44.tar.gz
cd XML-Parser-2.44
perl Makefile.PL
# 用前面编译好的 perl 来处理
make
make install
cd /sources/
rm XML-Parser-2.44 -rf
4.36 Intltool-0.51.0
国际化相关的字符处理工具
tar xf intltool-0.51.0.tar.gz
cd intltool-0.51.0
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
# 修复 perl-5.22 的问题
./configure --prefix=/usr
make
make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
cd /sources/
rm intltool-0.51.0 -rf
4.37 Autoconf-2.69
自动配置源代码里面的 shell
tar xf autoconf-2.69.tar.xz
cd autoconf-2.69
sed '361 s/{/\\{/' -i bin/autoscan.in
# 修改一个 Perl 5.28 引入的问题
./configure --prefix=/usr
make
make install
cd /sources/
rm autoconf-2.69 -rf
4.38 Automake-1.16.1
跟 autoconf 一起使用
tar xf automake-1.16.1.tar.xz
cd automake-1.16.1
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.1
make
make install
cd /sources/
rm automake-1.16.1 -rf
4.39 Xz-5.2.4
解压相关的
tar xf xz-5.2.4.tar.xz
cd xz-5.2.4
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/xz-5.2.4
make
make install
mv -v /usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} /bin
mv -v /usr/lib/liblzma.so.* /lib
ln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so
cd /sources/
rm xz-5.2.4 -rf
4.40 Kmod-26
加载内核库和模块
tar xf kmod-26.tar.xz
cd kmod-26
./configure --prefix=/usr \
--bindir=/bin \
--sysconfdir=/etc \
--with-rootlibdir=/lib \
--with-xz \
--with-zlib
make
make install
for target in depmod insmod lsmod modinfo modprobe rmmod; do
ln -sfv ../bin/kmod /sbin/$target
done
ln -sfv kmod /bin/lsmod
cd /sources/
rm kmod-26 -rf
4.41 Gettext-0.19.8.1
本地化字符处理
tar xf gettext-0.19.8.1.tar.xz
cd gettext-0.19.8.1
sed -i '/^TESTS =/d' gettext-runtime/tests/Makefile.in &&
sed -i 's/test-lock..EXEEXT.//' gettext-tools/gnulib-tests/Makefile.in
# 处理死循环
sed -e '/AppData/{N;N;p;s/\.appdata\./.metainfo./}' \
-i gettext-tools/its/appdata.loc
# 修正配置文件
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/gettext-0.19.8.1
make
make install
chmod -v 0755 /usr/lib/preloadable_libintl.so
cd /sources/
rm gettext-0.19.8.1 -rf
4.42 Libelf
二进制文件的库
tar xf elfutils-0.176.tar.bz2
cd elfutils-0.176
./configure --prefix=/usr
make
make -C libelf install
install -vm644 config/libelf.pc /usr/lib/pkgconfig
cd /sources/
rm elfutils-0.176 -rf
4.43 Libffi-3.2.1
提供一个可移植的高级编程接口
tar xf libffi-3.2.1.tar.gz
cd libffi-3.2.1
sed -e '/^includesdir/ s/$(libdir).*$/$(includedir)/' \
-i include/Makefile.in
sed -e '/^includedir/ s/=.*$/=@includedir@/' \
-e 's/^Cflags: -I${includedir}/Cflags:/' \
-i libffi.pc.in
# 改一下 Makefile 将头文件安装到标准的 /usr/include 目录
./configure --prefix=/usr --disable-static --with-gcc-arch=native
make
make install
cd /sources/
rm -rf libffi-3.2.1
4.44 OpenSSL-1.1.1a
openssl 加密
tar xf openssl-1.1.1a.tar.gz
cd openssl-1.1.1a
./config --prefix=/usr \
--openssldir=/etc/ssl \
--libdir=lib \
shared \
zlib-dynamic
make
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile
make MANSUFFIX=ssl install
cd /sources/
rm openssl-1.1.1a -rf
4.45 Python-3.7.2
python 3
tar xf Python-3.7.2.tar.xz
cd Python-3.7.2
./configure --prefix=/usr \
--enable-shared \
--with-system-expat \
--with-system-ffi \
--with-ensurepip=yes
make
make install
chmod -v 755 /usr/lib/libpython3.7m.so
chmod -v 755 /usr/lib/libpython3.so
cd /sources/
rm -rf Python-3.7.2
4.46 Ninja-1.9.0
Ninja 构件系统。
tar xf ninja-1.9.0.tar.gz
cd ninja-1.9.0
export NINJAJOBS=8
# 限制进程数
sed -i '/int Guess/a \
int j = 0;\
char* jobs = getenv( "NINJAJOBS" );\
if ( jobs != NULL ) j = atoi( jobs );\
if ( j > 0 ) return j;\
' src/ninja.cc
# 添加使用环境变量 NINJAJOBS 的功能
python3 configure.py --bootstrap
python3 configure.py
./ninja ninja_test
./ninja_test --gtest_filter=-SubprocessTest.SetWithLots
# 构建
install -vm755 ninja /usr/bin/
install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja
install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja
# 安装
cd /sources/
rm ninja-1.9.0 -rf
4.47 Meson-0.49.2
Meson 是用于自动化构建的自由软件,使用Python语言编写,在 Apache 许可证 2.0版本下发布,主要目标是为了让开发者节约用于配置构建系统的时间
tar xf meson-0.49.2.tar.gz
cd meson-0.49.2
python3 setup.py build
python3 setup.py install --root=dest
cp -rv dest/* /
cd /sources/
rm -rf meson-0.49.2
4.48 Coreutils-8.30
显示和设置基本系统特性的工具
tar xf coreutils-8.30.tar.xz
cd coreutils-8.30
patch -Np1 -i ../coreutils-8.30-i18n-1.patch
# 打补丁
sed -i '/test.lock/s/^/#/' gnulib-tests/gnulib.mk
# 处理死循环
autoreconf -fiv
FORCE_UNSAFE_CONFIGURE=1 ./configure \
--prefix=/usr \
--enable-no-install-program=kill,uptime
# 使用到了前面的编译安装出来的 autoconf
FORCE_UNSAFE_CONFIGURE=1 make
# 编译
make install
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
mv -v /usr/bin/chroot /usr/sbin
mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8
mv -v /usr/bin/{head,nice,sleep,touch} /bin
# 移动到正确的位置
cd /sources/
rm coreutils-8.30 -rf
4.49 Check-0.12.0
c 语言 单元测试使用的
tar xf check-0.12.0.tar.gz
cd check-0.12.0
./configure --prefix=/usr
make
make install
sed -i '1 s/tools/usr/' /usr/bin/checkmk
cd /sources/
rm check-0.12.0 -rf
4.50 Diffutils-3.7
显示文件和目录差异的程序
tar xf diffutils-3.7.tar.xz
cd diffutils-3.7
./configure --prefix=/usr
make
make install
cd /sources/
rm -rf diffutils-3.7
4.51 Gawk-4.2.1
awk 文本编辑
tar xf gawk-4.2.1.tar.xz
cd gawk-4.2.1
sed -i 's/extras//' Makefile.in
#去掉一些用不上的扩展
./configure --prefix=/usr
make
make install
cd /sources/
rm -rf gawk-4.2.1
4.52 Findutils-4.6.0
tar xf findutils-4.6.0.tar.gz
cd findutils-4.6.0
sed -i 's/test-lock..EXEEXT.//' tests/Makefile.in
# 修复死循环
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' gl/lib/*.c
sed -i '/unistd/a #include <sys/sysmacros.h>' gl/lib/mountlist.c
echo "#define _IO_IN_BACKUP 0x100" >> gl/lib/stdio-impl.h
# 对 glibc-2.28 或更高版本 glibc 做一些修复
./configure --prefix=/usr --localstatedir=/var/lib/locate
make
make install
mv -v /usr/bin/find /bin
sed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedb
# 更改一下程序的位置
cd /sources/
rm -rf findutils-4.6.0
4.53 Groff-1.22.4
格式化文本的个软件
tar xf groff-1.22.4.tar.gz
cd groff-1.22.4
PAGE=A4 ./configure --prefix=/usr
make -j1
make install
cd /sources/
rm -rf groff-1.22.4
4.54 GRUB-2.02
引导程序
tar xf grub-2.02.tar.xz
cd grub-2.02
./configure --prefix=/usr \
--sbindir=/sbin \
--sysconfdir=/etc \
--disable-efiemu \
--disable-werror
make
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
cd /sources/
rm -rf grub-2.02
4.55 Less-530
文本查看器
tar xf less-530.tar.gz
cd less-530
./configure --prefix=/usr --sysconfdir=/etc
make
make install
cd /sources/
rm -rf less-530
4.56 Gzip-1.10
gz 格式解压
tar xf gzip-1.10.tar.xz
cd gzip-1.10
./configure --prefix=/usr
make
make install
mv -v /usr/bin/gzip /bin
cd /sources/
rm -rf gzip-1.10
4.57 IPRoute2-4.20.0
Ip v4 网络相关
tar xf iproute2-4.20.0.tar.xz
cd iproute2-4.20.0
sed -i /ARPD/d Makefile
rm -fv man/man8/arpd.8
sed -i 's/.m_ipt.o//' tc/Makefile
make
make DOCDIR=/usr/share/doc/iproute2-4.20.0 install
cd /sources/
rm -rf iproute2-4.20.0
4.58 Kbd-2.0.4
键表文件、控制台字体和键盘工具
tar xf kbd-2.0.4.tar.xz
cd kbd-2.0.4
patch -Np1 -i ../kbd-2.0.4-backspace-1.patch
# 打补丁
sed -i 's/\(RESIZECONS_PROGS=\)yes/\1no/g' configure
sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr --disable-vlock
make
make install
cd /sources/
rm -rf kbd-2.0.4
4.59 Libpipeline-1.5.1
管道
tar xf libpipeline-1.5.1.tar.gz
cd libpipeline-1.5.1
./configure --prefix=/usr
make
make install
cd /sources/
rm -rf libpipeline-1.5.1
4.60 Make-4.2.1
编译用的
tar xf make-4.2.1.tar.bz2
cd make-4.2.1
sed -i '211,217 d; 219,229 d; 232 d' glob/glob.c
# 改glibc 的问题
./configure --prefix=/usr
make
make install
cd /sources/
rm -rf make-4.2.1
4.61 Patch-2.7.6
打补丁的工具
tar xf patch-2.7.6.tar.xz
cd patch-2.7.6
./configure --prefix=/usr
make
make install
cd /sources/
rm -rf patch-2.7.6
4.62 Man-DB-2.8.5
man 手册
tar xf man-db-2.8.5.tar.xz
cd man-db-2.8.5
./configure --prefix=/usr \
--docdir=/usr/share/doc/man-db-2.8.5 \
--sysconfdir=/etc \
--disable-setuid \
--enable-cache-owner=bin \
--with-browser=/usr/bin/lynx \
--with-vgrind=/usr/bin/vgrind \
--with-grap=/usr/bin/grap
make
make install
cd /sources/
rm -rf man-db-2.8.5
4.63 Tar-1.31
归档工具
tar xf tar-1.31.tar.xz
cd tar-1.31
sed -i 's/abort.*/FALLTHROUGH;/' src/extract.c
FORCE_UNSAFE_CONFIGURE=1 \
./configure --prefix=/usr \
--bindir=/bin
make
make install
make -C doc install-html docdir=/usr/share/doc/tar-1.31
cd /sources/
rm -rf tar-1.31
4.64 Texinfo-6.5
读、写以及转换信息页的程序
tar xf texinfo-6.5.tar.xz
cd texinfo-6.5
sed -i '5481,5485 s/({/(\\{/' tp/Texinfo/Parser.pm
./configure --prefix=/usr --disable-static
make
make install
make TEXMF=/usr/share/texmf install-tex
pushd /usr/share/info
rm -v dir
for f in *
do install-info $f dir 2>/dev/null
done
popd
cd /sources/
rm -rf texinfo-6.5
4.65 Vim-8.1
文本编辑器
tar xf vim-8.1.tar.bz2
cd vim81/
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
./configure --prefix=/usr
make
make install
ln -sv vim /usr/bin/vi
for L in /usr/share/man/{,*/}man1/vim.1; do
ln -sv vim.1 $(dirname $L)/vi.1
done
ln -sv ../vim/vim81/doc /usr/share/doc/vim-8.1
设置vim
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
" Ensure defaults are set before customizing settings, not after
source $VIMRUNTIME/defaults.vim
let skip_defaults_vim=1
set nocompatible
set backspace=2
set mouse=
syntax on
if (&term == "xterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
cd /sources/
rm -rf vim81/
4.66 systemd-240
tar xf systemd-240.tar.gz
cd systemd-240
patch -Np1 -i ../systemd-240-security_fixes-2.patch
# 打补丁
ln -sf /tools/bin/true /usr/bin/xsltproc
for file in /tools/lib/lib{blkid,mount,uuid}*; do
ln -sf $file /usr/lib/
done
tar -xf ../systemd-man-pages-240.tar.xz
sed '177,$ d' -i src/resolve/meson.build
sed -i 's/GROUP="render", //' rules/50-udev-default.rules.in
mkdir -p build
cd build
PKG_CONFIG_PATH="/usr/lib/pkgconfig:/tools/lib/pkgconfig" \
LANG=en_US.UTF-8 \
meson --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
-Dblkid=true \
-Dbuildtype=release \
-Ddefault-dnssec=no \
-Dfirstboot=false \
-Dinstall-tests=false \
-Dkill-path=/bin/kill \
-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 \
..
LANG=en_US.UTF-8 ninja
LANG=en_US.UTF-8 ninja install
rm -rfv /usr/lib/rpm
rm -f /usr/bin/xsltproc
systemd-machine-id-setup
cat > /lib/systemd/systemd-user-sessions << "EOF"
#!/bin/bash
rm -f /run/nologin
EOF
chmod 755 /lib/systemd/systemd-user-sessions
cd /sources/
rm -rf systemd-240
4.67 D-Bus-1.12.12
消息总线系统
tar xf dbus-1.12.12.tar.gz
cd dbus-1.12.12
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--disable-static \
--disable-doxygen-docs \
--disable-xml-docs \
--docdir=/usr/share/doc/dbus-1.12.12 \
--with-console-auth-dir=/run/console
make
make install
mv -v /usr/lib/libdbus-1.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libdbus-1.so) /usr/lib/libdbus-1.so
ln -sfv /etc/machine-id /var/lib/dbus
cd /sources/
rm -rf dbus-1.12.12
4.68 Procps-ng-3.3.15
进程监控软件
tar xf procps-ng-3.3.15.tar.xz
cd procps-ng-3.3.15
./configure --prefix=/usr \
--exec-prefix= \
--libdir=/usr/lib \
--docdir=/usr/share/doc/procps-ng-3.3.15 \
--disable-static \
--disable-kill \
--with-systemd
make
make install
mv -v /usr/lib/libprocps.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so
cd /sources/
rm -rf procps-ng-3.3.15
4.69 Util-linux-2.33.1
基本的一些实用程序
tar xf util-linux-2.33.1.tar.xz
cd util-linux-2.33.1
mkdir -pv /var/lib/hwclock
rm -vf /usr/include/{blkid,libmount,uuid}
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \
--docdir=/usr/share/doc/util-linux-2.33.1 \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--without-python
make
make install
cd /sources/
rm -rf util-linux-2.33.1
4.70 E2fsprogs-1.44.5
文件系统相关
tar xf e2fsprogs-1.44.5.tar.gz
cd e2fsprogs-1.44.5
mkdir -v build
cd build
../configure --prefix=/usr \
--bindir=/bin \
--with-root-prefix="" \
--enable-elf-shlibs \
--disable-libblkid \
--disable-libuuid \
--disable-uuidd \
--disable-fsck
make
make install
make install-libs
chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
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 /sources/
rm -rf e2fsprogs-1.44.5
4.71 清理无用的东西
rm -rf /tmp/*
重新进入 chroot
logout
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login