SUReLinux项目构建手册(内部文件,不要外传,参数说明见LFS官方文档) 第一章 准备系统 1.1准备工作 本文假定中途不会关机,推荐使用虚拟机挂起功能。 作者在VMWare Workstation 15.5下测试。(请不要使用virtualbox,virtualbox的CPU利用率较低,在支持超线程的CPU上面甚至低于hyper-v。qemu存在桥接网卡的问题,方案自行检索。hyper-v, xen未测试) 内存推荐4G,最少2G, swap最少4G。硬盘80G(完整版内核需要15G以上空间编译,所以必须要这么大硬盘,使用虚拟机的话,直接创建80G以及以上硬盘即可),处理器能好点用好点的,只要是64位处理器就行。 LFS系统宿主机要求(按照LFS要求筛选之后):OpenSUSE(leap, tumbleweeded均可,推荐) mageia(推荐) ubuntu/debian/kali(debian与kali请用su - root代替su,并请运行sudo dpkg-reconfigure bash,将默认shell从dash切为bash) archlinux/manjaro(archlinux vmware剪贴板异常,manjaro安装gtkmm gtkmm3后没问题) gentoo/funtoo(vmware剪贴板异常),debian/kali(普通用户的su请改为su - root) 已知存在问题的不符合要求的:fedora/centos/rhel(yacc这边不一致,fedora可用opensuse的bison安装包代替),alpine(使用的是musl,不是glibc),solus(多项不符合要求),WSL(没有lsblk,无法chroot)。 另外请自行准备ocserv服务器/代理服务器,aria2c或者wget 使用如下代码检测是否安装全必要的软件 cat > version-check.sh << "EOF" #!/bin/bash # Simple script to list version numbers of critical development tools export LC_ALL=C bash --version | head -n1 | cut -d" " -f2-4 MYSH=$(readlink -f /bin/sh) echo "/bin/sh -> $MYSH" echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash" unset MYSH echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3- bison --version | head -n1 if [ -h /usr/bin/yacc ]; then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`"; elif [ -x /usr/bin/yacc ]; then echo yacc is `/usr/bin/yacc --version | head -n1` else echo "yacc not found" fi bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6- echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2 diff --version | head -n1 find --version | head -n1 gawk --version | head -n1 echo -n "pkg-config "; pkg-config --version if [ -h /usr/bin/awk ]; then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`"; elif [ -x /usr/bin/awk ]; then echo awk is `/usr/bin/awk --version | head -n1` else echo "awk not found" fi gcc --version | head -n1 g++ --version | head -n1 ldd --version | head -n1 | cut -d" " -f2- # glibc version grep --version | head -n1 gzip --version | head -n1 cat /proc/version m4 --version | head -n1 make --version | head -n1 patch --version | head -n1 echo Perl `perl -V:version` python3 --version sed --version | head -n1 tar --version | head -n1 makeinfo --version | head -n1 # texinfo version xz --version | head -n1 echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c if [ -x dummy ] then echo "g++ compilation OK"; else echo "g++ compilation failed"; fi rm -f dummy.c dummy EOF bash version-check.sh 额外,装qemu方便测试,lzip用于ed源代码解包。 1.2创建变量 export LFS=/mnt/lfs 使用如下命令确认变量(一定要在root账户下再确认一遍) echo $LFS 1.3准备硬盘 这里选用和LFS略有区别的方案,采用的是loop法,这里不做详细介绍。主要是为了方便测试。 dd bs=1G count=60 if=/dev/zero of=60.img #划分60G的img空盘作为虚拟硬盘 sudo cfdisk ~/60.img #dos分区,一个就行 sudo kpartx -av ~/60.img #让img变成系统分区 mkfs.ext4 /dev/mapper/loop0p1 #格式化,linux内核默认兼容ext4,这里请切换为su,后续将维持在su下,ubuntu可能为loop3,自行用lsblk确认下 1.4挂载分区 mkdir -pv $LFS mount -v -t ext4 /dev/mapper/loop0p1 $LFS 请使用lsblk确认挂载成功 1.5下包 几点说明:①GNU,CPAN镜像用的是上海交通大学镜像,kernel.org为中科大镜像,openssh为清华大学镜像 ②内核为opensuse提供的定制的4.19LTS内核 ③从LFS中被删除的包:iana-etc, gdbm, gperf, expat, XML::Parser, intltool, libffi, python3(glibc编译需要py3, 但chroot后不安装), ninja, meson, check, kbd, libpipeline, vim, sysklogd, pkg-config, sysvinit, 加入的包:ed, nano, dhcpcd, openssh, wget, pkgconf, openrc ④OpenRC已加入,脚本还需重写 ⑤源代码ed是用lzip压缩的,请自行安装lzip,在chroot之前把ed解包,lzip暂不编译 ⑥file如果不好下载可以改为https://github.com/file/file/archive/FILE5_37.tar.gz, dhcpcd不好下可以改为https://github.com/rsmarples/dhcpcd/archive/dhcpcd-8.0.6.tar.gz mkdir -pv $LFS/sources chmod -v a+wt $LFS/sources #可选,方便非root用户复制源代码包到文件夹 cat > wgetlist << "EOF" https://mirrors.sjtug.sjtu.edu.cn/gnu/binutils/binutils-2.32.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/gmp/gmp-6.1.2.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/mpfr/mpfr-4.0.2.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/mpc/mpc-1.1.0.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/m4/m4-1.4.18.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/glibc/glibc-2.30.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/dejagnu/dejagnu-1.6.2.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/ncurses/ncurses-6.1.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/bash/bash-5.0.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/bison/bison-3.4.1.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/coreutils/coreutils-8.31.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/diffutils/diffutils-3.7.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/findutils/findutils-4.7.0.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/gawk/gawk-5.0.1.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/gettext/gettext-0.20.1.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/grep/grep-3.3.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/gzip/gzip-1.10.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/make/make-4.2.1.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/patch/patch-2.7.6.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/sed/sed-4.7.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/tar/tar-1.32.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/bc/bc-1.07.1.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/texinfo/texinfo-6.6.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/readline/readline-8.0.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/libtool/libtool-2.4.6.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/inetutils/inetutils-1.9.4.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/autoconf/autoconf-2.69.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/automake/automake-1.16.1.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/groff/groff-1.22.4.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/grub/grub-2.04.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/nano/nano-4.4.tar.xz https://mirrors.sjtug.sjtu.edu.cn/gnu/wget/wget-1.20.3.tar.gz https://mirrors.sjtug.sjtu.edu.cn/gnu/ed/ed-1.15.tar.lz https://mirrors.sjtug.sjtu.edu.cn/cpan/src/5.0/perl-5.30.0.tar.gz https://mirrors.tuna.tsinghua.edu.cn/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz https://mirrors.ustc.edu.cn/kernel.org/linux/utils/util-linux/v2.34/util-linux-2.34.tar.xz https://mirrors.ustc.edu.cn/kernel.org/linux/libs/security/linux-privs/libcap2/libcap-2.27.tar.xz https://mirrors.ustc.edu.cn/kernel.org/linux/utils/net/iproute2/iproute2-5.2.0.tar.xz https://download.savannah.nongnu.org/releases/acl/acl-2.2.53.tar.gz https://download.savannah.nongnu.org/releases/attr/attr-2.4.48.tar.gz https://prdownloads.sourceforge.net/psmisc/psmisc/psmisc-23.2.tar.xz https://prdownloads.sourceforge.net/tcl/Tcl/8.6.9/tcl8.6.9-src.tar.gz https://prdownloads.sourceforge.net/expect/Expect/5.45.4/expect5.45.4.tar.gz https://prdownloads.sourceforge.net/libpng/zlib-1.2.11.tar.xz https://prdownloads.sourceforge.net/procps-ng/Production/procps-ng-3.3.15.tar.xz https://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs/v1.45.3/e2fsprogs-1.45.3.tar.gz https://sourceware.org/elfutils/ftp/elfutils-latest.tar.bz2 https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz https://github.com/openSUSE/kernel/archive/v4.19.75.tar.gz https://github.com/shadow-maint/shadow/releases/download/4.7/shadow-4.7.tar.xz https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz https://github.com/OpenRC/openrc/archive/0.42.1.tar.gz https://distfiles.dereferenced.org/pkgconf/pkgconf-1.1.0.tar.xz https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz https://data.iana.org/time-zones/releases/tzdata2019c.tar.gz https://tukaani.org/xz/xz-5.2.4.tar.xz http://www.greenwoodsoftware.com/less/less-551.tar.gz https://roy.marples.name/downloads/dhcpcd/dhcpcd-8.0.6.tar.xz https://www.openssl.org/source/openssl-1.1.1c.tar.gz https://dev.gentoo.org/~blueness/eudev/eudev-3.2.8.tar.gz ftp://ftp.astron.com/pub/file/file-5.37.tar.gz EOF wget --input-file=wgetlist --continue --directory-prefix=$LFS/sources mv $LFS/sources/v4.19.75.tar.gz $LFS/sources/kernel-4.19.75.tar.gz #wget下载的文件名和浏览器不统一,修正下 mv $LFS/sources/0.42.1.tar.gz $LFS/sources/openrc-0.42.1.tar.gz 或者 aria2c -c -i wgetlist -d $LFS/sources #可以添加-j16和-x16提高速度 1.6创建目录 $LFS/tools mkdir -v $LFS/tools ln -sv $LFS/tools / #创建 /tools 的符号链接。将其指向 SURE 分区中新建的目录。 1.7添加 LFS 用户 groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs passwd lfs chown -v lfs $LFS/tools chown -v lfs $LFS/sources su - lfs 1.8设置环境 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=/tools/bin:/bin:/usr/bin export LFS LC_ALL LFS_TGT PATH EOF source ~/.bash_profile 1.9解包说明与编译说明 在sources里面tar xvf(v可以省略)文件夹,cd进去。编译完成,删除解包的文件夹 自行在make后面-jx x为电脑线程数,可以额外+1,gcc,内核等SBU非常大的可以考虑x-1 第二章 构建临时系统(参数请查阅LFS手册) 2.1 Binutils pass1(链接器与汇编器等) mkdir -v build cd build ../configure --prefix=/tools \ --with-sysroot=$LFS \ --with-lib-path=/tools/lib \ --target=$LFS_TGT \ --disable-nls \ --disable-werror make -j$(nproc --all) case $(uname -m) in x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;; esac make install cd ../.. 2.2 gcc pass1 tar xf ../mpfr-*.tar.xz mv -v mpfr-* mpfr tar xf ../gmp-*.tar.xz mv -v gmp-* gmp tar xf ../mpc-*.tar.gz mv -v mpc-* mpc for file in gcc/config/{linux,i386/linux{,64}}.h do cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.orig done 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 \ --target=$LFS_TGT \ --prefix=/tools \ --with-glibc-version=2.11 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --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 -j$(nproc --all) make install cd ../.. 2.3 kernel header make mrproper make INSTALL_HDR_PATH=dest headers_install cp -r dest/include/* /tools/include cd .. 2.4 glibc(C函数库) mkdir -v build cd build ../configure \ --prefix=/tools \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=3.2 \ --with-headers=/tools/include make -j$(nproc --all) make install 请注意在此处进行一次测试 echo 'int main(){}' > dummy.c $LFS_TGT-gcc dummy.c readelf -l a.out | grep ': /tools' 如果输出[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]则成功,成功后执行 rm -v dummy.c a.out cd ../.. 2.5 libstdc++(标准C++库,包含在gcc里面,解包gcc) mkdir -v build cd build GCCVER=9.2.0 ../libstdc++-v3/configure \ --host=$LFS_TGT \ --prefix=/tools \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-threads \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/${GCCVER} make -j$(nproc --all) make install 2.6 Binutils pass2 mkdir -v build cd build CC=$LFS_TGT-gcc \ AR=$LFS_TGT-ar \ RANLIB=$LFS_TGT-ranlib \ ../configure \ --prefix=/tools \ --disable-nls \ --disable-werror \ --with-lib-path=/tools/lib \ --with-sysroot make -j$(nproc --all) make install make -C ld clean make -C ld LIB_PATH=/usr/lib:/lib cp -v ld/ld-new /tools/bin 2.7 gcc pass2 cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h for file in gcc/config/{linux,i386/linux{,64}}.h do cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.orig done case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac tar xvf ../mpfr-*.tar.xz mv -v mpfr-* mpfr tar xvf ../gmp-*.tar.xz mv -v gmp-* gmp tar xvf ../mpc-*.tar.gz mv -v mpc-* mpc mkdir -v build cd build CC=$LFS_TGT-gcc \ CXX=$LFS_TGT-g++ \ AR=$LFS_TGT-ar \ RANLIB=$LFS_TGT-ranlib \ ../configure \ --prefix=/tools \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --enable-languages=c,c++ \ --disable-libstdcxx-pch \ --disable-multilib \ --disable-bootstrap \ --disable-libgomp make -j$(nproc --all) make install ln -sv gcc /tools/bin/cc 请注意在此处进行一次测试 echo 'int main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools' 如果输出[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]则成功,成功后执行 rm -v dummy.c a.out cd ../.. 2.8 tcl(测试套件1) cd unix ./configure --prefix=/tools make -j$(nproc --all) make install chmod u+w /tools/lib64/libtcl8.6.so make install-private-headers ln -sv tclsh8.6 /tools/bin/tclsh cd ../.. 2.9 expect(测试套件2) cp -v configure{,.orig} sed 's:/usr/local/bin:/bin:' configure.orig > configure ./configure --prefix=/tools \ --with-tcl=/tools/lib \ --with-tclinclude=/tools/include make -j$(nproc --all) make SCRIPTS="" install cd .. 2.10 dejagnu(测试套件3) ./configure --prefix=/tools make install cd .. 2.11 m4 sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h ./configure --prefix=/tools make -j$(nproc --all) make install cd .. 2.12 ncurses sed -i s/mawk// configure ./configure --prefix=/tools \ --with-shared \ --without-debug \ --without-ada \ --enable-widec \ --enable-overwrite make -j$(nproc --all) make install ln -s libncursesw.so /tools/lib/libncurses.so cd .. 2.13 bash ./configure --prefix=/tools --without-bash-malloc make -j$(nproc --all) make install ln -sv bash /tools/bin/sh cd .. 2.14 bison ./configure --prefix=/tools make -j$(nproc --all) make install cd .. 2.15 coreutils (系统基本工具) ./configure --prefix=/tools --enable-install-program=hostname make -j$(nproc --all) make install cd .. 2.16-2.19 diffutils file findutils gawk for package in diffutils-3.7 file-5.37 findutils-4.7.0 gawk-5.0.1; do tar xf "${package}".tar.* cd "${package}" || continue ./configure --prefix=/tools make -j$(nproc --all) make install cd $LFS/sources/ || break rm -rvf "${package}" done 2.20 gettext ./configure --prefix=/tools --disable-shared make -j$(nproc --all) cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /tools/bin cd .. 2.21-2.22 grep gzip for package in grep-3.3 gzip-1.10; do tar xvf "${package}".tar.* cd "${package}" || continue ./configure --prefix=/tools make -j$(nproc --all) make install cd $LFS/sources/ || break rm -rvf "${package}" done 2.23 make sed -i '211,217 d; 219,229 d; 232 d' glob/glob.c ./configure --prefix=/tools --without-guile make -j$(nproc --all) make install cd .. 2.24 patch ./configure --prefix=/tools make -j$(nproc --all) make install cd .. 2.25 perl PERLVER=5.30.0 sh Configure -des -Dprefix=/tools -Dlibs=-lm -Uloclibpth -Ulocincpth make -j$(nproc --all) cp -v perl cpan/podlators/scripts/pod2man /tools/bin mkdir -pv /tools/lib/perl5/${PERLVER} cp -Rv lib/* /tools/lib/perl5/${PERLVER} cd .. 2.26-2.29 sed xz tar texinfo for package in sed-4.7 tar-1.32 texinfo-6.6 xz-5.2.4; do tar xvf "${package}".tar.* cd "${package}" || continue ./configure --prefix=/tools make -j$(nproc --all) make install cd $LFS/sources/ || break rm -rvf "${package}" done 2.19 python3 sed -i '/def add_multiarch_paths/a \ return' setup.py ./configure --prefix=/tools --without-ensurepip make -j$(nproc --all) make install 2.19 Stripping(清理无用内容) strip --strip-debug /tools/lib/* /usr/bin/strip --strip-unneeded /tools/{,s}bin/* rm -rvf /tools/{,share}/{info,man,doc} find /tools/{lib,libexec} -name \*.la -delete 2.20 改变属主 exit #请确认是切换到root chown -R root:root $LFS/tools 第三章 构建编译内核依赖以及ssh, dhcp和nano 3.1 准备虚拟内核文件系统 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 -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 3.2 chroot chroot "$LFS" /tools/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(sure chroot) \u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ /tools/bin/bash --login +h 3.3 创建目录(几个lib文件夹请确认下,是否要改lib64或者添加lib64) mkdir -p /{bin,boot,etc/{opt,sysconfig},home,lib64/firmware,mnt,opt} mkdir -p /{media/{floppy,cdrom},sbin,srv,var} install -d -m 0750 /root install -d -m 1777 /tmp /var/tmp mkdir -p /usr/{,local/}{bin,include,lib64,sbin,src} mkdir -p /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -p /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -p /usr/libexec mkdir -p /usr/{,local/}share/man/man{1..8} case $(uname -m) in x86_64) mkdir -p /lib64 ;; i?86) mkdir -p /lib32 ;; esac mkdir -p /var/{log,mail,spool} ln -sf /run /var/run ln -sf /run/lock /var/lock mkdir -p /var/{opt,cache,lib64/{color,misc,locate},local} 3.4 创建必要的文件和符号链接(几个lib文件夹请确认下,是否要改lib64或者添加lib64) 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/lib64 ln -sv /tools/lib/libstdc++.{a,so{,.6}} /usr/lib64 ln -sv bash /bin/sh ln -sv /proc/self/mounts /etc/mtab 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 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 3.5 kernel header make mrproper make INSTALL_HDR_PATH=dest headers_install #lfs开发版有误,headers_install可用 find dest/include \( -name .install -o -name ..install.cmd \) -delete cp -rv dest/include/* /usr/include 3.6 glibc(二次编译需加入libidn2) GCCVER=9.2.0 #patch -Np1 -i ../glibc-2.28-fhs-1.patch #请确认是否需要打这个补丁,是否需要打其他补丁 case $(uname -m) in i?86) GCC_INCDIR=/usr/lib32/gcc/$(uname -m)-pc-linux-gnu/${GCCVER}/include ln -sf ld-linux.so.2 /lib32/ld-lsb.so.3 ;; x86_64) GCC_INCDIR=/usr/lib64/gcc/x86_64-pc-linux-gnu/${GCCVER}/include ln -sf ../lib64/ld-linux-x86-64.so.2 /lib64 ln -sf ../lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3 ;; esac mkdir -v build cd build ##CC="gcc -ffile-prefix-map=/tools=/usr" \ #../configure --prefix=/usr \ # --disable-werror \ # --enable-kernel=3.2 \ # --enable-stack-protector=strong \ # --with-headers=/usr/include \ # libc_cv_slibdir=/lib ###原本为LFS提供 CC="gcc" CXX="g++" CFLAGS="-O2 -mtune=generic -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unused-function -Wno-maybe-uninitialized" ../configure \ --host=x86_64-sure-linux-gnu --build=x86_64-sure-linux-gnu \ --prefix=/usr \ --libexecdir=/usr/libexec \ --infodir=/usr/share/info \ --enable-add-ons=libidn --without-cvs \ --without-selinux \ --enable-kernel=3.2 \ --with-headers=/usr/include \ --enable-obsolete-rpc \ --enable-obsolete-nsl \ --disable-crypts ##由mageia提供 make -j1 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 /lib64 ;; esac make check -j$(nproc --all) #mageia的configure fail3,多出来了cond-mutex10 #这里任何的fail都应该报告,xpass/xfail/unsupport不需要 以下未测试,请不要急着用 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 make localedata/install-locales -j$(nproc --all) 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 -xvf ../../tzdata*.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 -y "sh yearistype.sh" ${tz} zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz} zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 请检查下lib64 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 3.7 调整工具链 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 -dumpspecs | sed -e 's@/tools@@g' -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib64/ @}' -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 ': /lib64' 如果没有任何错误,应该输出[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] grep -o '/usr/lib64.*/crt[1in].*succeeded' dummy.log #查下是不是lib64 应该输出/usr/lib64/../lib64/crt1.o succeeded /usr/lib64/../lib64/crti.o succeeded /usr/lib64/../lib64/crtn.o succeeded grep -B1 '^ /usr/include' dummy.log 应该输出#include <...> search starts here: /usr/include grep 'SEARCH.*/usr/lib64' dummy.log |sed 's|; |\n|g' #查下是不是lib64 应该输出SEARCH_DIR("/usr/lib64") SEARCH_DIR("/lib64") grep "/lib.*/libc.so.6 " dummy.log 应该输出attempt to open /lib64/libc.so.6 succeeded grep found dummy.log 应该输出found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2 rm -v dummy.c a.out dummy.log 3.8 zlib ./configure --prefix=/usr --libdir=/usr/lib64 --sharedlibdir=/usr/lib64 make -j$(nproc --all) make check -j$(nproc --all) make install mv /usr/lib64/libz.so.* /lib64 ln -sf ../../lib64/$(readlink /usr/lib64/libz.so) /usr/lib64/libz.so 3.9 file ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 make -j$(nproc --all) make check -j$(nproc --all) make install 3.10 readline READLINEVER=8.0 sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --disable-static --docdir=/usr/share/doc/readline-${READLINEVER} make SHLIB_LIBS="-L/tools/lib64 -lncursesw" -j$(nproc --all) make SHLIB_LIBS="-L/tools/lib64 -lncursesw" install mv /usr/lib64/lib{readline,history}.so.* /lib64 chmod u+w /lib64/lib{readline,history}.so.* ln -sf ../../lib64/$(readlink /usr/lib64/libreadline.so) /usr/lib64/libreadline.so ln -sf ../../lib64/$(readlink /usr/lib64/libhistory.so ) /usr/lib64/libhistory.so #install -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-${READLINEVER} #可以不安装文档 3.11 m4 sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib64/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib64/stdio-impl.h ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 make -j$(nproc --all) make check -j$(nproc --all) make install 3.12 bc (LFS开发版使用的是https://github.com/gavinhoward/bc,这里还是使用GNU bc) 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 -s /tools/lib64/libncursesw.so.6 /usr/lib64/libncursesw.so.6 ln -sf libncursesw.so.6 /usr/lib64/libncurses.so sed -i -e '/flex/s/as_fn_error/: ;; # &/' configure ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --with-readline --mandir=/usr/share/man --infodir=/usr/share/info make -j$(nproc --all) echo "quit" | ./bc/bc -l Test/checklib.b make install 3.13 binutils expect -c "spawn ls" 如果输出spawn ls即可继续 sed -i '/@\tincremental_copy/d' gold/testsuite/Makefile.in mkdir -v build cd build ../configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-gold --enable-ld=default --enable-plugins --enable-shared --disable-werror --enable-64-bit-bfd --with-system-zlib make tooldir=/usr -j$(nproc --all) make -k check -j$(nproc --all) #任何fail请报告 make tooldir=/usr install 3.14 gmp cp -v configfsf.guess config.guess cp -v configfsf.sub config.sub GMPVER=6.1.2 ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-cxx --disable-static --docdir=/usr/share/doc/gmp-${GMPVER} make -j$(nproc --all) #make html make check 2>&1 -j$(nproc --all) | tee gmp-check-log awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log #不等于190请报告 make install #make install-html 3.15 mpfr MPFRVER=6.1.2 ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-cxx --disable-static --docdir=/usr/share/doc/gmp-${MPFRVER} make -j$(nproc --all) #make html make check -j$(nproc --all) #任何fail请报告 make install #make install-html 3.16 mpc MPCVER=1.1.0 ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --disable-static --docdir=/usr/share/doc/mpc-${MPCVER} make -j$(nproc --all) #make html make check -j$(nproc --all) #任何fail请报告 make install #make install-html 3.17 shadow 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 -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \ -e 's@/var/spool/mail@/var/mail@' etc/login.defs sed -i 's/1000/999/' etc/useradd ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --sysconfdir=/etc --with-group-name-max-length=32 make -j$(nproc --all) make install mv -v /usr/bin/passwd /bin pwconv grpconv passwd root #已设置为lfslinux 3.18 gcc GCCVER=9.2.0 mkdir -v build cd build export LIBRARY_PATH=/usr/lib64:/lib64:/usr/lib:/lib SED=sed ../configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --with-slibdir=/lib64 --enable-languages=c,c++ --disable-multilib --disable-bootstrap --disable-libmpx --with-system-zlib make -j$(nproc --all) ulimit -s 32768 chown -Rv nobody . su nobody -s /bin/bash -c "PATH=$PATH make -k check -j$(nproc --all)" ../contrib/test_summary grep -A7 Summ #fail请报告 make install rm -rf /usr/lib64/gcc/$(gcc -dumpmachine)/${GCCVER}/include-fixed/bits/ chown -v -R root:root /usr/lib64/gcc/*linux-gnu/${GCCVER}/include{,-fixed} ln -sv ../usr/bin/cpp /lib64 ln -sv gcc /usr/bin/cc install -v -dm755 /usr/lib64/bfd-plugins ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/${GCCVER}/liblto_plugin.so /usr/lib64/bfd-plugins/ echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib64' 如果输出[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]即可继续 grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log 应该输出 /usr/lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib64/crt1.o succeeded /usr/lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib64/crti.o succeeded /usr/lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib64/crtn.o succeeded grep -B4 '^ /usr/include' dummy.log 应该输出 #include <...> search starts here: /usr/lib64/gcc/x86_64-pc-linux-gnu/9.2.0/include /usr/local/include /usr/lib64/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed /usr/include grep 'SEARCH.*/usr/lib64' dummy.log |sed 's|; |\n|g' 应该输出 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 "/lib64.*/libc.so.6 " dummy.log 应该输出attempt to open /lib64/libc.so.6 succeeded grep found dummy.log 应该输出found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2 rm -v dummy.c a.out dummy.log mkdir -pv /usr/share/gdb/auto-load/usr/lib64 mv -v /usr/lib64/*gdb.py /usr/share/gdb/auto-load/usr/lib64 3.19 pkg-config PKGCONFIGVER=0.29.2 ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --with-internal-glib --disable-host-tool --docdir=/usr/share/doc/pkg-config-${PKGCONFIGVER} make -j$(nproc --all) make check -j$(nproc --all) make install 3.20 ncurses sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in ./configure --prefix=/usr --libdir=/usr/lib64 --libexecdir=/usr/lib64 --mandir=/usr/share/man --with-shared --without-debug --without-normal --enable-pc-files --enable-widec make -j$(nproc --all) make install mv -v /usr/lib64/libncursesw.so.6* /lib64 ln -sfv ../../lib64/$(readlink /usr/lib64/libncursesw.so) /usr/lib64/libncursesw.so for lib in ncurses form panel menu ; do rm -vf /usr/lib64/lib${lib}.so echo "INPUT(-l${lib}w)" > /usr/lib64/lib${lib}.so ln -sfv ${lib}w.pc /usr/lib64/pkgconfig/${lib}.pc done rm -vf /usr/lib64/libcursesw.so echo "INPUT(-lncursesw)" > /usr/lib64/libcursesw.so ln -sfv libncurses.so /usr/lib64/libcurses.so #mkdir -v /usr/share/doc/ncurses-6.1 #cp -v -R doc/* /usr/share/doc/ncurses-6.1 3.21 attr ATTRVER=2.4.48 ./configure --prefix=/usr --bindir=/bin --libdir=/usr/lib64 --libexecdir=/usr/lib64 --disable-static --sysconfdir=/etc --docdir=/usr/share/doc/attr-${ATTRVER} make -j$(nproc --all) make check -j$(nproc --all) make install mv -v /usr/lib64/libattr.so.* /lib64 ln -sfv ../../lib64/$(readlink /usr/lib64/libattr.so) /usr/lib64/libattr.so 第四章 基本系统配置(这章需要根据实际文件大幅修改) 第五章 构建内核 第六章 重新准备img,向rpm进发