# virtualbox_lfs **Repository Path**: gumpyang/virtualbox_lfs ## Basic Information - **Project Name**: virtualbox_lfs - **Description**: 一直建议他人尝试,但自己都记不清lfs6.2是否编译成功。所以建议一个分支来自己来尝试 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-13 - **Last Updated**: 2021-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # virtualbox_lfs #### 介绍 一直建议他人尝试,但自己都记不清lfs6.2是否编译成功。所以建议一个分支来自己来尝试,先期使用10.0,最新的下次再试 #### 下载 [国内单一包](http://mirrors.ustc.edu.cn/lfs/lfs-packages/lfs-packages-10.0.tar) [Debian live iso](http://cdimage.debian.org/cdimage/archive/9.0.0-live/amd64/iso-hybrid/debian-live-9.0.0-amd64-xfce.iso) #### 参考网址 [LFS 10.0 零基础中文安装教程](https://blog.51cto.com/u_9828355/2601749) [Linux From Scratch 10.0中文](https://bf.mengyan1223.wang/lfs/zh_CN/10.0/LFS-BOOK.html) #### 临时开关机 临时需要关机时不想重来,就一定要选择 ![](png/virtualbox_exit.png) 因为我的虚拟机名是"lfs" 这样通过在过程中,无显示命令行开机是 ``` VBoxManage startvm lfs --type headless ``` 在过程中命令行休眠是 ``` VBoxManage controlvm lfs savestate ``` ## 步骤 ### 建立虚拟机的ssh登录 #### 配置root密码 ``` sudu su root passwd ``` #### 安装ssh ``` apt-get install net-tools openssh-server vi /etc/ssh/sshd_config ``` 打开sshd_config文件,修改里的PermitRootLogin prohibit-password这条语句,将前面的#号去掉,并且把后面的prohibit-password去掉,换成yes。将PasswordAuthentication yes前面的#号去掉. #### 启动ssh服务 ``` /etc/init.d/ssh start ``` 我使用的是端口影射,所以直接在主机上登录。下面命令是本地主机上的 ``` ssh -p 2222 root@localhost ``` ### 安装live-cd缺少软件 可以使用version-check.sh先进行检查 ``` ln -sf bash /bin/sh //修改bash指向/bin/sh apt-get install bison g++ texinfo gawk ``` ### 虚拟机硬盘分区 将硬盘格式化成MBR的启动模式就行,将/dev/sda1做为交换分区,/dev/sda2做为启动分区并打开启动项 ### 环境变量 ``` export LFS=/mnt/lfs ``` ### 格式化硬盘 ``` mkfs -v -t ext4 /dev/sda2 mkswap /dev/sda1 ``` ### 加载硬盘分区 ``` mkdir -pv $LFS mount -v -t ext4 /dev/sda2 $LFS /sbin/swapon -v /dev/sda1 ``` ### 创建源代码目录和下载 ``` mkdir -v $LFS/sources chmod -v a+wt $LFS/sources cd $LFS/sources/ ``` ### 下载lfs包 我在使用ustc镜像下载的(https://mirrors.ustc.edu.cn/lfs/lfs-packages/lfs-packages-10.0.tar) ### 创建所需的目录 ``` mkdir -pv $LFS/{bin,etc,lib,sbin,usr,var} case $(uname -m) in x86_64) mkdir -pv $LFS/lib64 ;; esac mkdir -pv $LFS/tools ``` ### 创建用户 ``` groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs passwd lfs chown -v lfs $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -v lfs $LFS/lib64 ;; esac chown -v lfs $LFS/sources ``` ### 切换到lfs用户 ``` su - lfs ``` ### 设置环境 ``` cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF cat > ~/.bashrc << "EOF" set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX LFS_TGT=$(uname -m)-lfs-linux-gnu PATH=/usr/bin if [ ! -L /bin ]; then PATH=/bin:$PATH; fi PATH=$LFS/tools/bin:$PATH export LFS LC_ALL LFS_TGT PATH EOF source ~/.bash_profile ``` ## 编译 5. 编译交叉工具链 1. Binutils-2.35 ``` cd $LFS/sources/ tar xf binutils-2.35.tar.xz cd binutils-2.35 mkdir -v build ; cd $_ ../configure --prefix=$LFS/tools \ --with-sysroot=$LFS \ --target=$LFS_TGT \ --disable-nls \ --disable-werror make -j4 make install cd ../.. rm -rf binutils-2.35 ``` 2. GCC-10.2.0 ``` tar xf gcc-10.2.0.tar.xz cd gcc-10.2.0 tar -xf ../mpfr-4.1.0.tar.xz mv -v mpfr-4.1.0 mpfr tar -xf ../gmp-6.2.0.tar.xz mv -v gmp-6.2.0 gmp tar -xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac mkdir -v build ; cd $_ ../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.11 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-initfini-array \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-decimal-float \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++ make -j4 make install cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h cd .. rm -rf gcc-10.2.0 ``` 3. Linux-5.8.3 API头文件 ``` tar xf linux-5.8.3.tar.xz cd linux-5.8.3 make mrproper make headers find usr/include -name '.*' -delete rm usr/include/Makefile cp -rv usr/include $LFS/usr cd .. rm -rf linux-5.8.3 ``` 4. Glibc-2.32 ``` tar xf glibc-2.32.tar.xz cd glibc-2.32 case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac patch -Np1 -i ../glibc-2.32-fhs-1.patch mkdir -v build cd build ../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=3.2 \ --with-headers=$LFS/usr/include \ libc_cv_slibdir=/lib make -j4 make DESTDIR=$LFS install ``` ``` echo 'int main(){}' > dummy.c $LFS_TGT-gcc dummy.c readelf -l a.out | grep '/ld-linux' ``` ``` $LFS/tools/libexec/gcc/$LFS_TGT/10.2.0/install-tools/mkheaders cd ../.. rm -rf glibc-2.32 ``` 5. GCC-10.2.0中的Libstdc ++ ``` tar xf gcc-10.2.0.tar.xz cd gcc-10.2.0 mkdir -v build ; cd $_ ../libstdc++-v3/configure \ --host=$LFS_TGT \ --build=$(../config.guess) \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/10.2.0 make -j4 make DESTDIR=$LFS install cd ../.. rm -rf gcc-10.2.0 ``` 6. 交叉编译临时工具 1. M4-1.4.18 ``` tar xf m4-1.4.18.tar.xz cd m4-1.4.18 sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) make -j4 make DESTDIR=$LFS install cd .. rm -rf m4-1.4.18 ``` 2. Ncurses-6.2 ``` tar xf ncurses-6.2.tar.gz cd ncurses-6.2 sed -i s/mawk// configure mkdir build pushd build ../configure make -C include make -C progs tic popd ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./config.guess) \ --mandir=/usr/share/man \ --with-manpage-format=normal \ --with-shared \ --without-debug \ --without-ada \ --without-normal \ --enable-widec make -j4 make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so mv -v $LFS/usr/lib/libncursesw.so.6* $LFS/lib ln -sfv ../../lib/$(readlink $LFS/usr/lib/libncursesw.so) $LFS/usr/lib/libncursesw.so cd .. rm -rf ncurses-6.2 ``` 3. Bash-5.0 ``` tar xf bash-5.0.tar.gz cd bash-5.0 ./configure --prefix=/usr \ --build=$(support/config.guess) \ --host=$LFS_TGT \ --without-bash-malloc make -j4 make DESTDIR=$LFS install mv $LFS/usr/bin/bash $LFS/bin/bash ln -sv bash $LFS/bin/sh cd .. rm -rf bash-5.0 ``` 4. Coreutils-8.32 ``` tar xf coreutils-8.32.tar.xz cd coreutils-8.32 ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --enable-install-program=hostname \ --enable-no-install-program=kill,uptime make -j4 make DESTDIR=$LFS install mv -v $LFS/usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} $LFS/bin mv -v $LFS/usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} $LFS/bin mv -v $LFS/usr/bin/{rmdir,stty,sync,true,uname} $LFS/bin mv -v $LFS/usr/bin/{head,nice,sleep,touch} $LFS/bin mv -v $LFS/usr/bin/chroot $LFS/usr/sbin mkdir -pv $LFS/usr/share/man/man8 mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' $LFS/usr/share/man/man8/chroot.8 cd .. rm -rf coreutils-8.32 ``` 5. Diffutils-3.7 ``` tar xf diffutils-3.7.tar.xz cd diffutils-3.7 ./configure --prefix=/usr --host=$LFS_TGT make -j4 make DESTDIR=$LFS install cd .. rm -rf diffutils-3.7 ``` 6. File-5.39 ``` tar xf file-5.39.tar.gz cd file-5.39 ./configure --prefix=/usr --host=$LFS_TGT make -j4 make DESTDIR=$LFS install cd .. rm -rf file-5.39 ``` 7. Findutils-4.7.0 ``` tar xf findutils-4.7.0.tar.xz cd findutils-4.7.0 ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) make -j4 make DESTDIR=$LFS install mv -v $LFS/usr/bin/find $LFS/bin sed -i 's|find:=${BINDIR}|find:=/bin|' $LFS/usr/bin/updatedb cd .. rm -rf findutils-4.7.0 ```` 8. Gawk-5.1.0 ``` tar xf gawk-5.1.0.tar.xz cd gawk-5.1.0 sed -i 's/extras//' Makefile.in ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./config.guess) make -j4 make DESTDIR=$LFS install cd .. rm -rf gawk-5.1.0 ``` 9. Grep-3.4 ``` tar xf grep-3.4.tar.xz cd grep-3.4 ./configure --prefix=/usr \ --host=$LFS_TGT \ --bindir=/bin make -j4 make DESTDIR=$LFS install cd .. rm -rf grep-3.4 ``` 10. Gzip 1.10 ``` tar xf gzip-1.10.tar.xz cd gzip-1.10 ./configure --prefix=/usr --host=$LFS_TGT make -j4 make DESTDIR=$LFS install mv -v $LFS/usr/bin/gzip $LFS/bin cd .. rm -rf gzip-1.10 ``` 11. Make-4.3 ``` tar xf make-4.3.tar.gz cd make-4.3 ./configure --prefix=/usr \ --without-guile \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) make -j4 make DESTDIR=$LFS install cd .. rm -rf make-4.3 ``` 12. Patch-2.7.6 ``` tar xf patch-2.7.6.tar.xz cd patch-2.7.6 ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) make -j4 make DESTDIR=$LFS install cd .. rm -rf patch-2.7.6 ``` 13. Sed-4.8 ``` tar xf sed-4.8.tar.xz cd sed-4.8 ./configure --prefix=/usr \ --host=$LFS_TGT \ --bindir=/bin make -j4 make DESTDIR=$LFS install cd .. rm -rf sed-4.8 ``` 14. Tar-1.32 ``` tar xf tar-1.32.tar.xz cd tar-1.32 ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --bindir=/bin make -j4 make DESTDIR=$LFS install cd .. rm -rf tar-1.32 ``` 15. Xz-5.2.5 ``` tar xf xz-5.2.5.tar.xz cd xz-5.2.5 ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --disable-static \ --docdir=/usr/share/doc/xz-5.2.5 make -j4 make DESTDIR=$LFS install mv -v $LFS/usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} $LFS/bin mv -v $LFS/usr/lib/liblzma.so.* $LFS/lib ln -svf ../../lib/$(readlink $LFS/usr/lib/liblzma.so) $LFS/usr/lib/liblzma.so cd .. rm -rf xz-5.2.5 ``` 16. Binutils-2.35 - Pass 2 ``` tar xf binutils-2.35.tar.xz cd binutils-2.35 mkdir -v build cd build ../configure \ --prefix=/usr \ --build=$(../config.guess) \ --host=$LFS_TGT \ --disable-nls \ --enable-shared \ --disable-werror \ --enable-64-bit-bfd make -j4 make DESTDIR=$LFS install cd ../.. rm -rf binutils-2.35 ``` 17. GCC-10.2.0 - Pass 2 ``` tar xf gcc-10.2.0.tar.xz cd gcc-10.2.0 tar -xf ../mpfr-4.1.0.tar.xz mv -v mpfr-4.1.0 mpfr tar -xf ../gmp-6.2.0.tar.xz mv -v gmp-6.2.0 gmp tar -xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64 ;; esac mkdir -v build cd build mkdir -pv $LFS_TGT/libgcc ln -s ../../../libgcc/gthr-posix.h $LFS_TGT/libgcc/gthr-default.h ../configure \ --build=$(../config.guess) \ --host=$LFS_TGT \ --prefix=/usr \ CC_FOR_TARGET=$LFS_TGT-gcc \ --with-build-sysroot=$LFS \ --enable-initfini-array \ --disable-nls \ --disable-multilib \ --disable-decimal-float \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++ make -j4 make DESTDIR=$LFS install ln -sv gcc $LFS/usr/bin/cc cd ../.. rm -rf gcc-10.2.0 ``` ### 进入 Chroot 并构建其他临时工具 6. 1. 改变用户 ``` exit echo $LFS ``` ``` chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -R root:root $LFS/lib64 ;; esac ``` 准备虚拟内核文件系统 ``` mkdir -pv $LFS/{dev,proc,sys,run} mknod -m 600 $LFS/dev/console c 5 1 mknod -m 666 $LFS/dev/null c 1 3 mount -v --bind /dev $LFS/dev mount -v --bind /dev/pts $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi ``` 进入chroot环境 ``` 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 +h ``` 创建符合FHS层次结构标准的目录 ``` mkdir -pv /{boot,home,mnt,opt,srv} mkdir -pv /etc/{opt,sysconfig} mkdir -pv /lib/firmware mkdir -pv /media/{floppy,cdrom} mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} mkdir -pv /var/{cache,local,log,mail,opt,spool} mkdir -pv /var/lib/{color,misc,locate} ln -sfv /run /var/run ln -sfv /run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp ``` 创建必要的文件和符号链接 ``` ln -sv /proc/self/mounts /etc/mtab echo "127.0.0.1 localhost $(hostname)" > /etc/hosts ``` ``` 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 nobody:x:99:99:Unprivileged User:/dev/null:/bin/false EOF 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: input:x:24: mail:x:34: kvm:x:61: wheel:x:97: nogroup:x:99: users:x:999: EOF ``` ``` echo "tester:x:$(ls -n $(tty) | cut -d" " -f3):101::/home/tester:/bin/bash" >> /etc/passwd echo "tester:x:101:" >> /etc/group install -o tester -d /home/tester ``` ``` exec /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 cd /sources ``` 1. GCC-10.2.0 的 Libstdc++ Pass 2 ``` tar xf gcc-10.2.0.tar.xz cd gcc-10.2.0 ln -s gthr-posix.h libgcc/gthr-default.h mkdir -v build cd build ../libstdc++-v3/configure \ CXXFLAGS="-g -O2 -D_GNU_SOURCE" \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --host=$(uname -m)-lfs-linux-gnu \ --disable-libstdcxx-pch make -j4 make install cd ../.. rm -rf gcc-10.2.0 ``` 2. Gettext-0.21 ``` tar xf gettext-0.21.tar.xz cd gettext-0.21 ./configure --disable-shared make -j4 cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin cd .. rm -rf gettext-0.21 ``` 3. Bison-3.7.1 ``` tar xf bison-3.7.1.tar.xz cd bison-3.7.1 ./configure --prefix=/usr \ --docdir=/usr/share/doc/bison-3.7.1 make -j4 make install cd .. rm -rf bison-3.7.1 ``` 4. Perl-5.32.0 ``` tar xf perl-5.32.0.tar.xz cd perl-5.32.0 sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dprivlib=/usr/lib/perl5/5.32/core_perl \ -Darchlib=/usr/lib/perl5/5.32/core_perl \ -Dsitelib=/usr/lib/perl5/5.32/site_perl \ -Dsitearch=/usr/lib/perl5/5.32/site_perl \ -Dvendorlib=/usr/lib/perl5/5.32/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.32/vendor_perl make -j4 make install cd .. rm -rf perl-5.32.0 ``` 5. Python-3.8.5 ``` tar xf Python-3.8.5.tar.xz cd Python-3.8.5 ./configure --prefix=/usr \ --enable-shared \ --without-ensurepip make -j4 make install cd .. rm -rf Python-3.8.5 ``` 6. Texinfo-6.7 ``` tar xf texinfo-6.7.tar.xz cd texinfo-6.7 ./configure --prefix=/usr make -j4 make install cd .. rm -rf texinfo-6.7 ``` 7. Util-linux-2.36 ``` tar xf util-linux-2.36.tar.xz cd util-linux-2.36 mkdir -pv /var/lib/hwclock ./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 make -j4 make install cd .. rm -rf util-linux-2.36 ``` 8. 清理和备份临时系统 ``` find /usr/{lib,libexec} -name \*.la -delete rm -rf /usr/share/{info,man,doc}/* exit umount $LFS/dev{/pts,} umount $LFS/{sys,proc,run} strip --strip-debug $LFS/usr/lib/* strip --strip-unneeded $LFS/usr/{,s}bin/* strip --strip-unneeded $LFS/tools/bin/* ``` ``` cd $LFS && tar -cJpf $HOME/lfs-temp-tools-10.0.tar.xz . ``` 如果要使用还原时,其它时间不用 ``` cd $LFS && rm -rf ./* && tar -xpf $HOME/lfs-temp-tools-10.0.tar.xz ``` 8. 第8章 1. man-pages ``` tar xf man-pages-5.08.tar.xz cd man-pages-5.08 make install cd .. rm -r man-pages-5.08 ``` ------------ 2. Tcl-8.6.10 ``` tar xf tcl8.6.10-src.tar.gz cd tcl8.6.10 tar -xf ../tcl8.6.10-html.tar.gz --strip-components=1 SRCDIR=$(pwd) cd unix ./configure --prefix=/usr \ --mandir=/usr/share/man \ $([ "$(uname -m)" = x86_64 ] && echo --enable-64bit) make -j4 sed -e "s|$SRCDIR/unix|/usr/lib|" \ -e "s|$SRCDIR|/usr/include|" \ -i tclConfig.sh sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.1|/usr/lib/tdbc1.1.1|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.1/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.1/library|/usr/lib/tcl8.6|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.1|/usr/include|" \ -i pkgs/tdbc1.1.1/tdbcConfig.sh sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.0|/usr/lib/itcl4.2.0|" \ -e "s|$SRCDIR/pkgs/itcl4.2.0/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/itcl4.2.0|/usr/include|" \ -i pkgs/itcl4.2.0/itclConfig.sh unset SRCDIR make test chmod -v u+w /usr/lib/libtcl8.6.so make install-private-headers ln -sfv tclsh8.6 /usr/bin/tclsh cd ../.. rm -rf tcl8.6.10 ``` ------------ 3. Expect-5.45.4 ``` tar xf expect5.45.4.tar.gz cd expect5.45.4 ./configure --prefix=/usr \ --with-tcl=/usr/lib \ --enable-shared \ --mandir=/usr/share/man \ --with-tclinclude=/usr/include make -j4 make test make install ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib rm -r expect5.45.4 ``` ------------ 4. DejaGNU-1.6.2 ``` tar xf dejagnu-1.6.2.tar.gz cd dejagnu-1.6.2 ./configure --prefix=/usr makeinfo --html --no-split -o doc/dejagnu.html doc/dejagnu.texi makeinfo --plaintext -o doc/dejagnu.txt doc/dejagnu.texi make install install -v -dm755 /usr/share/doc/dejagnu-1.6.2 install -v -m644 doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.2 cd .. rm -rf dejagnu-1.6.2 ``` ------------ 5. Iana-Etc-20200821 ``` tar xf iana-etc-20200821.tar.gz cd iana-etc-20200821 cp services protocols /etc cd .. rm -rf iana-etc-20200821 ``` ------------ 6. Glibc-2.32 ``` tar xf glibc-2.32.tar.xz cd glibc-2.32 patch -Np1 -i ../glibc-2.32-fhs-1.patch mkdir -v build ; cd $_ ../configure --prefix=/usr \ --disable-werror \ --enable-kernel=3.2 \ --enable-stack-protector=strong \ --with-headers=/usr/include \ libc_cv_slibdir=/lib make -j4 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 touch /etc/ld.so.conf sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile make install cp -v ../nscd/nscd.conf /etc/nscd.conf mkdir -pv /var/cache/nscd mkdir -pv /usr/lib/locale localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true localedef -i en_US -f UTF-8 en_US.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030 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 ../../tzdata2020a.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 cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib EOF cat >> /etc/ld.so.conf << "EOF" # Add an include directory include /etc/ld.so.conf.d/*.conf EOF mkdir -pv /etc/ld.so.conf.d cd ../.. rm -rf glibc-2.32 ``` ------------ 7. Zlib-1.2.11 ``` tar xf zlib-1.2.11.tar.xz cd zlib-1.2.11 ./configure --prefix=/usr make -j4 make check make install mv -v /usr/lib/libz.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so cd .. rm -rf zlib-1.2.11 ``` ------------ 8. Bzip2-1.0.8 ``` tar xf bzip2-1.0.8.tar.gz cd bzip2-1.0.8 patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile make -f Makefile-libbz2_so make clean make -j4 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 .. rm -rf bzip2-1.0.8 ``` ------------ 9. Xz-5.2.5 ``` tar xf xz-5.2.5.tar.xz cd xz-5.2.5 ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/xz-5.2.5 make -j4 make check 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 .. rm -rf xz-5.2.5 ``` ------------ 10. Zstd-1.4.5 ``` tar xf zstd-1.4.5.tar.gz cd zstd-1.4.5 make -j4 make prefix=/usr install rm -v /usr/lib/libzstd.a mv -v /usr/lib/libzstd.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libzstd.so) /usr/lib/libzstd.so cd .. rm -rf zstd-1.4.5 ``` ------------ 11. File-5.39 ``` tar xf ffile-5.39.tar.gz cd file-5.39 ./configure --prefix=/usr make -j4 make check make install cd .. rm -rf file-5.39 ``` ------------ 12. 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 \ --with-curses \ --docdir=/usr/share/doc/readline-8.0 make SHLIB_LIBS="-lncursesw" -j4 make SHLIB_LIBS="-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 install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.0 cd .. rm -rf readline-8.0 ``` ------------ 13. M4-1.4.18 ``` tar xvf m4-1.4.18.tar.xz cd m4-1.4.18 sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h ./configure --prefix=/usr make -j4 make install cd .. rm -rf m4-1.4.18 ``` ------------ 14. BC-3.1.5 ``` tar xf bc-3.1.5.tar.xz cd bc-3.1.5 PREFIX=/usr CC=gcc CFLAGS="-std=c99" ./configure.sh -G -O3 make -j4 make install cd .. rm -rf bc-3.1.5 ``` ------------ 15. Flex-2.6.4 ``` tar xf flex-2.6.4.tar.gz cd flex-2.6.4 ./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.4 make -j4 make install ln -sv flex /usr/bin/lex cd .. rm -rf flex-2.6.4 ``` ------------ 16. Binutils-2.35 ``` tar xf binutils-2.35.tar.xz cd binutils-2.35 expect -c "spawn ls" sed -i '/@\tincremental_copy/d' gold/testsuite/Makefile.in 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 make tooldir=/usr -j4 make -k check make tooldir=/usr install cd ../.. rm -rf binutils-2.35 ``` ------------ 17. GMP-6.2.0 ``` tar xf gmp-6.2.0.tar.xz cd gmp-6.2.0 ./configure --prefix=/usr \ --enable-cxx \ --disable-static \ --docdir=/usr/share/doc/gmp-6.2.0 make -j4 make html make check 2>&1 | tee gmp-check-log awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log make install make install-html cd .. rm -rf gmp-6.2.0 ``` ------------ 18. MPFR-4.1.0 ``` tar xf mpfr-4.1.0.tar.xz cd mpfr-4.1.0 ./configure --prefix=/usr \ --disable-static \ --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-4.1.0 make -j4 make html make check make install make install-html cd .. rm -rf mpfr-4.1.0 ``` ------------ 19. MPC-1.1.0 ``` 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 -j4 make html make install make install-html cd .. rm -rf mpc-1.1.0 ``` ------------ 20. Attr-2.4.48 ``` tar xf attr-2.4.48.tar.gz cd attr-2.4.48 ./configure --prefix=/usr \ --bindir=/bin \ --disable-static \ --sysconfdir=/etc \ --docdir=/usr/share/doc/attr-2.4.48 make -j4 make install mv -v /usr/lib/libattr.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so cd .. rm -rf attr-2.4.48 ``` ------------ 21. ACL-2.2.53 ``` tar xf acl-2.2.53.tar.gz cd acl-2.2.53 ./configure --prefix=/usr \ --bindir=/bin \ --disable-static \ --libexecdir=/usr/lib \ --docdir=/usr/share/doc/acl-2.2.53 make -j4 make install mv -v /usr/lib/libacl.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so cd .. rm -rf acl-2.2.53 ``` ------------ 22. Libcap-2.42 ``` tar xf libcap-2.42.tar.xz cd libcap-2.42 sed -i '/install -m.*STACAPLIBNAME/d' libcap/Makefile make lib=lib make lib=lib PKGCONFIGDIR=/usr/lib/pkgconfig install chmod -v 755 /lib/libcap.so.2.42 mv -v /lib/libpsx.a /usr/lib rm -v /lib/libcap.so ln -sfv ../../lib/libcap.so.2 /usr/lib/libcap.so cd .. rm -rf libcap-2.42 ``` ------------ 23. Shadow-4.8.1 ``` tar xf shadow-4.8.1.tar.xz cd shadow-4.8.1 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 / /' {} \; sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD SHA512:' \ -e 's:/var/spool/mail:/var/mail:' \ -i etc/login.defs sed -i 's/1000/999/' etc/useradd touch /usr/bin/passwd ./configure --sysconfdir=/etc \ --with-group-name-max-length=32 make -j4 make install pwconv grpconv passwd root cd .. rm -rf shadow-4.8.1 ``` ------------ 24. GCC-10.2.0 这一步在测试时,时间超长。 ``` tar xf gcc-10.2.0.tar.xz cd gcc-10.2.0 case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac mkdir -v build cd build ../configure --prefix=/usr \ LD=ld \ --enable-languages=c,c++ \ --disable-multilib \ --disable-bootstrap \ --with-system-zlib make -j4 ulimit -s 32768 chown -Rv tester . su tester -c "PATH=$PATH make -k check" ../contrib/test_summary make install rm -rf /usr/lib/gcc/$(gcc -dumpmachine)/10.2.0/include-fixed/bits/ chown -v -R root:root \ /usr/lib/gcc/*linux-gnu/10.2.0/include{,-fixed} ln -sv ../usr/bin/cpp /lib install -v -dm755 /usr/lib/bfd-plugins ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/10.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' grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log grep -B4 '^ /usr/include' dummy.log grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g' grep "/lib.*/libc.so.6 " dummy.log grep found 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 ../.. rm -rf gcc-10.2.0 ``` 25. 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 make -j4 make install cd .. rm -rf pkg-config-0.29.2 ``` 26. Ncurses-6.2 ``` tar xf ncurses-6.2.tar.gz cd ncurses-6.2 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 -j4 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 mkdir -v /usr/share/doc/ncurses-6.2 cp -v -R doc/* /usr/share/doc/ncurses-6.2 cd .. rm -rf ncurses-6.2 ``` 27. Sed-4.8 ``` tar xf sed-4.8.tar.xz cd sed-4.8 ./configure --prefix=/usr --bindir=/bin make -j4 make html make install install -d -m755 /usr/share/doc/sed-4.8 install -m644 doc/sed.html /usr/share/doc/sed-4.8 cd .. rm -rf sed-4.8 ``` 28. Psmisc-23.3 ``` tar xf psmisc-23.3.tar.xz cd psmisc-23.3 ./configure --prefix=/usr make -j4 make install mv -v /usr/bin/fuser /bin mv -v /usr/bin/killall /bin cd .. rm -rf psmisc-23.3 ``` 29. Gettext-0.21 ``` tar xf gettext-0.21.tar.xz cd gettext-0.21 ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/gettext-0.21 make -j4 make install chmod -v 0755 /usr/lib/preloadable_libintl.so cd .. rm -rf gettext-0.21 ``` 30. Bison-3.7.1 ``` tar xf bison-3.7.1.tar.xz cd bison-3.7.1 ./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.7.1 make -j4 make install cd .. rm -rf bison-3.7.1 ``` 31. Grep-3.4 ``` tar xf grep-3.4.tar.xz cd grep-3.4 ./configure --prefix=/usr --bindir=/bin make -j4 make install cd .. rm -rf grep-3.4 ``` 32. Bash-5.0 ``` tar xf bash-5.0.tar.gz cd bash-5.0 patch -Np1 -i ../bash-5.0-upstream_fixes-1.patch ./configure --prefix=/usr \ --docdir=/usr/share/doc/bash-5.0 \ --without-bash-malloc \ --with-installed-readline make -j4 make install mv -vf /usr/bin/bash /bin exec /bin/bash --login +h cd .. rm -rf bash-5.0 ``` 33. Libtool 2.4.6 ``` tar xf libtool-2.4.6.tar.xz cd libtool-2.4.6 ./configure --prefix=/usr make -j4 make install cd .. rm -rf libtool-2.4.6 ``` 34. GDBM-1.18.1 ``` tar xf gdbm-1.18.1.tar.gz cd gdbm-1.18.1 sed -r -i '/^char.*parseopt_program_(doc|args)/d' src/parseopt.c ./configure --prefix=/usr \ --disable-static \ --enable-libgdbm-compat make -j4 make install cd .. rm -rf gdbm-1.18.1 ``` 35. 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 -j4 make install cd .. rm -rf gperf-3.1 ``` 36. Expat-2.2.9 ``` tar xf expat-2.2.9.tar.xz cd expat-2.2.9 ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/expat-2.2.9 make -j4 make install install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.2.9 cd .. rm -rf expat-2.2.9 ``` 37. 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 -j4 make install mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin mv -v /usr/bin/ifconfig /sbin cd .. rm -rf inetutils-1.9.4 ``` 38. Perl-5.32.0 ``` tar xf perl-5.32.0.tar.xz cd perl-5.32.0 export BUILD_ZLIB=False export BUILD_BZIP2=0 sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dprivlib=/usr/lib/perl5/5.32/core_perl \ -Darchlib=/usr/lib/perl5/5.32/core_perl \ -Dsitelib=/usr/lib/perl5/5.32/site_perl \ -Dsitearch=/usr/lib/perl5/5.32/site_perl \ -Dvendorlib=/usr/lib/perl5/5.32/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.32/vendor_perl \ -Dman1dir=/usr/share/man/man1 \ -Dman3dir=/usr/share/man/man3 \ -Dpager="/usr/bin/less -isR" \ -Duseshrplib \ -Dusethreads make -j4 make install unset BUILD_ZLIB BUILD_BZIP2 cd .. rm -rf perl-5.32.0 ``` 39. XML::Parser-2.46 ``` tar xf XML-Parser-2.46.tar.gz cd XML-Parser-2.46 perl Makefile.PL make -j4 make install cd .. rm -rf XML-Parser-2.46 ``` 40. Intltool-0.51.0 ``` tar xf intltool-0.51.0.tar.gz cd intltool-0.51.0 sed -i 's:\\\${:\\\$\\{:' intltool-update.in ./configure --prefix=/usr make -j4 make install install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO cd .. rm -rf intltool-0.51.0 ``` 41. Autoconf-2.69 ``` tar xf autoconf-2.69.tar.xz cd autoconf-2.69 sed -i '361 s/{/\\{/' bin/autoscan.in ./configure --prefix=/usr make -j4 make install cd .. rm -rf autoconf-2.69 ``` 42. Automake-1.16.2 ``` tar xf automake-1.16.2.tar.xz cd automake-1.16.2 sed -i "s/''/etags/" t/tags-lisp-space.sh ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.2 make -j4 make install cd .. rm -rf automake-1.16.2 ``` 43. Kmod-27 ``` tar xf kmod-27.tar.xz cd kmod-27 ./configure --prefix=/usr \ --bindir=/bin \ --sysconfdir=/etc \ --with-rootlibdir=/lib \ --with-xz \ --with-zlib make -j4 make install for target in depmod insmod lsmod modinfo modprobe rmmod; do ln -sfv ../bin/kmod /sbin/$target done ln -sfv kmod /bin/lsmod 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 .. rm -rf kmod-27 ``` 44. Libelf from Elfutils-0.180 ``` tar xf elfutils-0.180.tar.bz2 cd elfutils-0.180 ./configure --prefix=/usr --disable-debuginfod --libdir=/lib make -j4 make -C libelf install install -vm644 config/libelf.pc /usr/lib/pkgconfig rm /lib/libelf.a cd .. rm -rf elfutils-0.180 ``` 45. Libffi-3.3 ``` tar xf libffi-3.3.tar.gz cd libffi-3.3 ./configure --prefix=/usr --disable-static --with-gcc-arch=native make -j4 make install cd .. rm -rf libffi-3.3 ``` 46. OpenSSL-1.1.1g ``` tar xf openssl-1.1.1g.tar.gz cd openssl-1.1.1g ./config --prefix=/usr \ --openssldir=/etc/ssl \ --libdir=lib \ shared \ zlib-dynamic make -j4 sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile make MANSUFFIX=ssl install mv -v /usr/share/doc/openssl /usr/share/doc/openssl-1.1.1g cp -vfr doc/* /usr/share/doc/openssl-1.1.1g cd .. rm -rf openssl-1.1.1g ``` 47. Python-3.8.5 ``` tar xf Python-3.8.5.tar.xz cd Python-3.8.5 ./configure --prefix=/usr \ --enable-shared \ --with-system-expat \ --with-system-ffi \ --with-ensurepip=yes make -j4 make install chmod -v 755 /usr/lib/libpython3.8.so chmod -v 755 /usr/lib/libpython3.so ln -sfv pip3.8 /usr/bin/pip3 install -v -dm755 /usr/share/doc/python-3.8.5/html cd .. rm -rf Python-3.8.5 ``` 48. Ninja-1.10.0 ``` tar xf ninja-1.10.0.tar.gz cd ninja-1.10.0 python3 configure.py --bootstrap 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 .. rm -rf ninja-1.10.0 ``` 49. Meson-0.55.0 ``` tar xf meson-0.55.0.tar.gz cd meson-0.55.0 python3 setup.py build python3 setup.py install --root=dest cp -rv dest/* / cd .. rm -rf meson-0.55.0 ``` 50. Coreutils-8.32 ``` tar xf coreutils-8.32.tar.xz cd coreutils-8.32 patch -Np1 -i ../coreutils-8.32-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 make -j4 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"/' /usr/share/man/man8/chroot.8 mv -v /usr/bin/{head,nice,sleep,touch} /bin cd .. rm -rf coreutils-8.32 ``` 51. Check-0.15.2 ``` tar xf check-0.15.2.tar.gz cd check-0.15.2 ./configure --prefix=/usr --disable-static make -j4 make docdir=/usr/share/doc/check-0.15.2 install cd .. rm -rf check-0.15.2 ``` 52. Diffutils-3.7 ``` tar xf diffutils-3.7.tar.xz cd diffutils-3.7 ./configure --prefix=/usr make -j4 make install cd .. rm -rf diffutils-3.7 ``` 53. Gawk-5.1.0 ``` tar xf gawk-5.1.0.tar.xz cd gawk-5.1.0 sed -i 's/extras//' Makefile.in ./configure --prefix=/usr make -j4 make install mkdir -v /usr/share/doc/gawk-5.1.0 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.1.0 cd .. rm -rf gawk-5.1.0 ``` 54. Findutils-4.7.0 ``` tar xf findutils-4.7.0.tar.xz cd findutils-4.7.0 ./configure --prefix=/usr --localstatedir=/var/lib/locate make -j4 make install mv -v /usr/bin/find /bin sed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedb cd .. rm -rf findutils-4.7.0 ``` 55. 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 .. rm -rf groff-1.22.4 ``` 56. GRUB-2.04 ``` tar xf grub-2.04.tar.xz cd grub-2.04 ./configure --prefix=/usr \ --sbindir=/sbin \ --sysconfdir=/etc \ --disable-efiemu \ --disable-werror make -j4 make install mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions cd .. rm -rf grub-2.04 ``` 57. Less-551 ``` tar xf less-551.tar.gz cd less-551 ./configure --prefix=/usr --sysconfdir=/etc make -j4 make install cd .. rm -rf less-551 ``` 58. Gzip-1.10 ``` tar xf gzip-1.10.tar.xz cd gzip-1.10 ./configure --prefix=/usr make -j4 make install mv -v /usr/bin/gzip /bin cd .. rm -rf gzip-1.10 ``` 59. IPRoute2-5.8.0 ``` tar xf iproute2-5.8.0.tar.xz cd iproute2-5.8.0 sed -i /ARPD/d Makefile rm -fv man/man8/arpd.8 sed -i 's/.m_ipt.o//' tc/Makefile make -j4 make DOCDIR=/usr/share/doc/iproute2-5.8.0 install cd .. rm -rf iproute2-5.8.0 ``` 60. Kbd-2.3.0 ``` tar xf kbd-2.3.0.tar.xz cd kbd-2.3.0 patch -Np1 -i ../kbd-2.3.0-backspace-1.patch sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in ./configure --prefix=/usr --disable-vlock make -j4 make install rm -v /usr/lib/libtswrap.{a,la,so*} mkdir -v /usr/share/doc/kbd-2.3.0 cp -R -v docs/doc/* /usr/share/doc/kbd-2.3.0 cd .. rm -rf kbd-2.3.0 ``` 61. Libpipeline-1.5.3 ``` tar xf libpipeline-1.5.3.tar.gz cd libpipeline-1.5.3 ./configure --prefix=/usr make -j4 make install cd .. rm -rf libpipeline-1.5.3 ``` 62. Make-4.3 ``` tar xf make-4.3.tar.gz cd make-4.3 ./configure --prefix=/usr make -j4 make install cd .. rm -rf make-4.3 ``` 63. Patch-2.7.6 ``` tar xf patch-2.7.6.tar.xz cd patch-2.7.6 ./configure --prefix=/usr make -j4 make install cd .. rm -rf patch-2.7.6 ``` 64. Man-DB-2.9.3 ``` tar xf man-db-2.9.3.tar.xz cd man-db-2.9.3 ./configure --prefix=/usr \ --docdir=/usr/share/doc/man-db-2.9.3 \ --sysconfdir=/etc \ --disable-setuid \ --enable-cache-owner=bin \ --with-browser=/usr/bin/lynx \ --with-vgrind=/usr/bin/vgrind \ --with-grap=/usr/bin/grap \ --with-systemdtmpfilesdir= \ --with-systemdsystemunitdir= make -j4 make install cd .. rm -rf man-db-2.9.3 ``` 65. Tar-1.32 ``` tar xf tar-1.32.tar.xz cd tar-1.32 FORCE_UNSAFE_CONFIGURE=1 \ ./configure --prefix=/usr \ --bindir=/bin make -j4 make install make -C doc install-html docdir=/usr/share/doc/tar-1.32 cd .. rm -rf tar-1.32 ``` 66. Texinfo-6.7 ``` tar xf texinfo-6.7.tar.xz cd texinfo-6.7 ./configure --prefix=/usr --disable-static make -j4 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 .. rm -rf texinfo-6.7 ``` 67. Vim-8.2.1361 ``` tar xf vim-8.2.1361.tar.gz cd vim-8.2.1361 echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h ./configure --prefix=/usr make -j4 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/vim82/doc /usr/share/doc/vim-8.2.1361 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 .. rm -rf vim-8.2.1361 ``` 70. Eudev-3.2.9 ``` tar xf eudev-3.2.9.tar.gz cd eudev-3.2.9 ./configure --prefix=/usr \ --bindir=/sbin \ --sbindir=/sbin \ --libdir=/usr/lib \ --sysconfdir=/etc \ --libexecdir=/lib \ --with-rootprefix= \ --with-rootlibdir=/lib \ --enable-manpages \ --disable-static make -j4 mkdir -pv /lib/udev/rules.d mkdir -pv /etc/udev/rules.d make check make install tar -xvf ../udev-lfs-20171102.tar.xz make -f udev-lfs-20171102/Makefile.lfs install udevadm hwdb --update cd .. rm -rf eudev-3.2.9 ``` 71. Procps-ng-3.3.16 ``` tar xf procps-ng-3.3.16.tar.xz cd procps-ng-3.3.16 ./configure --prefix=/usr \ --exec-prefix= \ --libdir=/usr/lib \ --docdir=/usr/share/doc/procps-ng-3.3.16 \ --disable-static \ --disable-kill make -j4 make install 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 ``` 72. Util-linux-2.36 ``` tar xf util-linux-2.36.tar.xz cd util-linux-2.36 mkdir -pv /var/lib/hwclock ./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 \ --without-systemd \ --without-systemdsystemunitdir make -j4 make install cd .. rm -rf util-linux-2.36 ``` 73. E2fsprogs-1.45.6 ``` tar xf e2fsprogs-1.45.6.tar.gz cd e2fsprogs-1.45.6 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 -j4 make install 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 ../.. rm -rf e2fsprogs-1.45.6 ``` 74. Sysklogd-1.5.1 ``` tar xf sysklogd-1.5.1.tar.gz cd sysklogd-1.5.1 sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.c sed -i 's/union wait/int/' syslogd.c make -j4 make BINDIR=/sbin install 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 cd .. rm -rf sysklogd-1.5.1 ``` 75. Sysvinit-2.97 ``` tar xf sysvinit-2.97.tar.xz cd sysvinit-2.97 patch -Np1 -i ../sysvinit-2.97-consolidated-1.patch make -j4 make install cd .. rm -rf sysvinit-2.97 ``` 清理 ``` find /usr/lib -type f -name \*.a \ -exec strip --strip-debug {} ';' find /lib /usr/lib -type f -name \*.so* ! -name \*dbg \ -exec strip --strip-unneeded {} ';' find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \ -exec strip --strip-all {} ';' rm -rf /tmp/* 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 rm -f /usr/lib/lib{bfd,opcodes}.a rm -f /usr/lib/libctf{,-nobfd}.a rm -f /usr/lib/libbz2.a rm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.a rm -f /usr/lib/libltdl.a rm -f /usr/lib/libfl.a rm -f /usr/lib/libz.a find /usr/lib /usr/libexec -name \*.la -delete find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf rm -rf /tools userdel -r tester ``` 9. 第9章 1. LFS-引导脚本 ``` cd /sources tar xvf lfs-bootscripts-20200818.tar.xz cd lfs-bootscripts-20200818 make install cd .. rm -rf lfs-bootscripts-20200818 ``` 2. 创建自定义 udev 规则 ``` bash /lib/udev/init-net-rules.sh cat /etc/udev/rules.d/70-persistent-net.rules ``` 3. 创建网络配置文件: ``` cd /etc/sysconfig/ cat > ifconfig.enp0s3 << "EOF" ONBOOT=yes IFACE=enp0s3 SERVICE=ipv4-static IP=10.0.2.15 GATEWAY=10.0.2.1 PREFIX=24 BROADCAST=10.0.2.255 EOF ``` 4. 创建/etc/resolv.conf文件 ``` cat > /etc/resolv.conf << "EOF" # Begin /etc/resolv.conf domain mylfs10.0 nameserver 10.0.2.1 # End /etc/resolv.conf EOF ``` 5. 配置系统主机名称 ``` echo "lfs10.0" > /etc/hostname ``` 6. 创建 /etc/hosts 文件 ``` cat > /etc/hosts << "EOF" # Begin /etc/hosts 127.0.0.1 localhost 10.0.2.15 lfs10.0 # End /etc/hosts EOF ``` 7. 创建 /etc/inittab 文件 ``` cat > /etc/inittab << "EOF" # Begin /etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/init.d/rc S l0:0:wait:/etc/rc.d/init.d/rc 0 l1:S1:wait:/etc/rc.d/init.d/rc 1 l2:2:wait:/etc/rc.d/init.d/rc 2 l3:3:wait:/etc/rc.d/init.d/rc 3 l4:4:wait:/etc/rc.d/init.d/rc 4 l5:5:wait:/etc/rc.d/init.d/rc 5 l6:6:wait:/etc/rc.d/init.d/rc 6 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now su:S016:once:/sbin/sulogin 1:2345:respawn:/sbin/agetty --noclear tty1 9600 2:2345:respawn:/sbin/agetty tty2 9600 3:2345:respawn:/sbin/agetty tty3 9600 4:2345:respawn:/sbin/agetty tty4 9600 5:2345:respawn:/sbin/agetty tty5 9600 6:2345:respawn:/sbin/agetty tty6 9600 # End /etc/inittab EOF ``` 8. 配置系统时钟 ``` cat > /etc/sysconfig/clock << "EOF" # Begin /etc/sysconfig/clock UTC=1 # Set this to any options you might need to give to hwclock, # such as machine hardware clock type for Alphas. CLOCKPARAMS= # End /etc/sysconfig/clock EOF ``` 9. 配置控制台语言环境、创建 /etc/profile 文件: ``` cat > /etc/locale.conf << "EOF" LANG=en_US.UTF-8 EOF cat > /etc/profile << "EOF" # Begin /etc/profile export LANG=en_US.UTF-8 # End /etc/profile EOF ``` 10. 创建/ etc / inputrc文件 ``` cat > /etc/inputrc << "EOF" # Begin /etc/inputrc # Modified by Chris Lynn # Allow the command prompt to wrap to the next line set horizontal-scroll-mode Off # Enable 8bit input set meta-flag On set input-meta On # Turns off 8th bit stripping set convert-meta Off # Keep the 8th bit for display set output-meta On # none, visible or audible set bell-style none # All of the following map the escape sequence of the value # contained in the 1st argument to the readline specific functions "\eOd": backward-word "\eOc": forward-word # for linux console "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[3~": delete-char "\e[2~": quoted-insert # for xterm "\eOH": beginning-of-line "\eOF": end-of-line # for Konsole "\e[H": beginning-of-line "\e[F": end-of-line # End /etc/inputrc EOF ``` 11. 创建/etc/shells文件 ``` cat > /etc/shells << "EOF" # Begin /etc/shells /bin/sh /bin/bash # End /etc/shells EOF ``` 12. 创建 /etc/fstab 文件: ``` cat > /etc/fstab << "EOF" # Begin /etc/fstab # file system mount-point type options dump fsck # order /dev/sda2 / ext4 defaults 1 1 /dev/sda1 swap swap pri=1 0 0 proc /proc proc nosuid,noexec,nodev 0 0 sysfs /sys sysfs nosuid,noexec,nodev 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /run tmpfs defaults 0 0 devtmpfs /dev devtmpfs mode=0755,nosuid 0 0 # End /etc/fstab EOF ``` 13. 配置、编译和安装linux5.8.3内核 ``` cd /sources tar xvf linux-5.8.3.tar.xz cd linux-5.8.3 make mrproper make defconfig make menuconfig ``` 确保以下几项选择: ``` Device Drivers ---> Generic Driver Options ---> [ ] Support for uevent helper [CONFIG_UEVENT_HELPER] [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS] ``` ``` Processor type and features ---> [*] EFI stub support [CONFIG_EFI_STUB] ``` ``` General setup --> [*] Control Group support [CONFIG_CGROUPS] ``` ``` make -j4 make modules_install cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.8.3-lfs-10.0 cp -iv System.map /boot/System.map-5.8.3 install -d /usr/share/doc/linux-5.8.3 cp -r Documentation/* /usr/share/doc/linux-5.8.3 ``` 创建 /etc/modprobe.d/usb.conf 文件 ``` install -v -m755 -d /etc/modprobe.d cat > /etc/modprobe.d/usb.conf << "EOF" # Begin /etc/modprobe.d/usb.conf install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true # End /etc/modprobe.d/usb.conf EOF ``` 14. 设置GRUB启动过程 ``` grub-install /dev/sda cat > /boot/grub/grub.cfg << "EOF" # Begin /boot/grub/grub.cfg set default=0 set timeout=5 insmod ext2 set root=(hd0,2) menuentry "GNU/Linux, Linux 5.8.3-lfs-10.0" { linux /boot/vmlinuz-5.8.3-lfs-10.0 root=/dev/sda2 ro } EOF ``` 15. 创建 /etc/lfs-release 文件 ``` echo 10.0 > /etc/lfs-release ``` 16. 创建 /etc/lsb-release 文件: ``` cat > /etc/lsb-release << "EOF" DISTRIB_ID="Linux From Scratch" DISTRIB_RELEASE="10.0" DISTRIB_CODENAME="Gump Yang" DISTRIB_DESCRIPTION="Linux From Scratch" EOF ``` 17. 创建 /etc/os-release 文件: ``` cat > /etc/os-release << "EOF" NAME="Linux From Scratch" VERSION="10.0" ID=lfs PRETTY_NAME="Linux From Scratch 10.0" VERSION_CODENAME="Gump Yang" EOF ``` 18. 最后一步,关机。因为现在是无头模式,在虚拟机上需要手动重启 ``` logout echo $LFS umount -v $LFS/dev/pts umount -v $LFS/dev umount -v $LFS/run umount -v $LFS/proc umount -v $LFS/sys umount -v $LFS shutdown ``` ![](png/lfs_start.png)