一目了然系列之 Centos7 编译构建 LFS 8.4(4)

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//Config_heavy.pl 文件中。
/bin/pwd 某些 configure 脚本,特别是 Glibc 的,写死了这个路径。
/bin/rm 到 rm 的路径将写死在 /usr/lib/perl5/5.28.1//Config_heavy.pl 文件中。
/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
上一篇
下一篇