本文共 35512 字,大约阅读时间需要 118 分钟。
六、构建LFS系统
1.准备虚拟内核文件系统
1)创建将挂载文件系统的目录:
mkdir -pv $LFS/{dev,proc,sys,run}2)创建设备节点:mknod -m 600 $LFS/dev/console c 5 1mknod -m 666 $LFS/dev/null c 1 33)安装和填充/开发:mount -v --bind /dev $LFS/dev4)挂载虚拟内核文件系统:mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620mount -vt proc proc $LFS/procmount -vt sysfs sysfs $LFS/sysmount -vt tmpfs tmpfs $LFS/run5)创建shm目录if [ -h $LFS/dev/shm ]; thenmkdir -pv $LFS/$(readlink $LFS/dev/shm)fi2.进入Chroot环境
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 +h3.创建目录
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}install -dv -m 0750 /rootinstall -dv -m 1777 /tmp /var/tmpmkdir -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/libexecmkdir -pv /usr/{,local/}share/man/man{1..8}case $(uname -m) in
x86_64) mkdir -v /lib64 ;;esacmkdir -v /var/{log,mail,spool}
ln -sv /run /var/runln -sv /run/lock /var/lockmkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}4.创建基本文件和符号链接
ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} /bin
ln -sv /tools/bin/{env,install,perl} /usr/binln -sv /tools/lib/libgcc_s.so{,.1} /usr/libln -sv /tools/lib/libstdc++.{a,so{,.6}} /usr/libfor lib in blkid lzma mount uuiddoln -sv /tools/lib/lib$lib.so* /usr/libdoneln -svf /tools/include/blkid /usr/includeln -svf /tools/include/libmount /usr/includeln -svf /tools/include/uuid /usr/includeinstall -vdm755 /usr/lib/pkgconfigfor pc in blkid mount uuiddosed 's@tools@usr@g' /tools/lib/pkgconfig/${pc}.pc \/usr/lib/pkgconfig/${pc}.pc
doneln -sv bash /bin/shln -sv /proc/self/mounts /etc/mtab
5.创建passwd文件:
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/dev/null:/bin/falsedaemon:x:6:6:Daemon User:/dev/null:/bin/falsemessagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/falsenobody:x:99:99:Unprivileged User:/dev/null:/bin/falseEOFcat > /etc/group << "EOF"root:x:0:bin:x:1:daemonsys: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:nogroup:x:99:users:x:999:EOF6.去掉提示符的I have no name提示及创建日志文件:
exec /tools/bin/bash --login +h
touch /var/log/{btmp,lastlog,faillog,wtmp}chgrp -v utmp /var/log/lastlogchmod -v 664 /var/log/lastlogchmod -v 600 /var/log/btmpcd /sources7.Linux-4.18.5 API内核头文件
tar xvf linux-4.18.5.tar.xz
cd linux-4.18.5make mrpropermake INSTALL_HDR_PATH=dest headers_installfind dest/include ( -name .install -o -name ..install.cmd ) -deletecp -rv dest/include/* /usr/includecd ..rm -rf linux-4.18.58.Man-pages-4.16
tar xvf man-pages-4.16.tar.xz
cd man-pages-4.16make installcd ..rm -rf man-pages-4.169.glibc-2.28
tar xvf glibc-2.28.tar.xz
cd glibc-2.28patch -Np1 -i ../glibc-2.28-fhs-1.patchln -sfv /tools/lib/gcc /usr/lib为x86_64,创建动态加载程序正常运行所需的兼容性符号链接:case $(uname -m) ini?86) GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/8.2.0/includeln -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/includeln -sfv ../lib/ld-linux-x86-64.so.2 /lib64ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3;;esacrm -f /usr/include/limits.hmkdir -v buildcd buildCC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \../configure --prefix=/usr \--disable-werror \--enable-kernel=3.2 \--enable-stack-protector=strong \libc_cv_slibdir=/libunset GCC_INCDIRmake && make checktouch /etc/ld.so.confsed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefilemake installcp -v ../nscd/nscd.conf /etc/nscd.confmkdir -pv /var/cache/nscdmkdir -pv /usr/lib/localemake localedata/install-locales创建nsswitch.conf文件:cat > /etc/nsswitch.conf << "EOF"passwd: filesgroup: filesshadow: fileshosts: files dnsnetworks: filesprotocols: filesservices: filesethers: filesrpc: filesEOF添加时区数据:tar -xf ../../tzdata2018e.tar.gzZONEINFO=/usr/share/zoneinfomkdir -pv $ZONEINFO/{posix,right}for tz in etcetera southamerica northamerica europe africa antarctica \asia australasia backward pacificnew systemv; dozic -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}donecp -v zone.tab zone1970.tab iso3166.tab $ZONEINFOzic -d $ZONEINFO -p America/New_Yorkunset ZONEINFO确定本地时区:tzselect //回答(4、9、1、1)cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime创建ld.so.conf文件:cat > /etc/ld.so.conf << "EOF"/usr/local/lib/opt/libEOFcat >> /etc/ld.so.conf << "EOF"include /etc/ld.so.conf.d/*.confEOFmkdir -pv /etc/ld.so.conf.dcd ../..rm -rf glibc-2.2810.调整工具链
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/ldgcc -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)
/specsecho 'int main(){}' > dummy.ccc dummy.c -v -Wl,--verbose &> dummy.logreadelf -l a.out | grep ': /lib'64位输出:[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]32位输出:[Requesting program interpreter: /lib/ld-linux.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新链接器是否正确的搜索路径运行:grep 'SEARCH./usr/lib' dummy.log |sed 's|; |\n|g'输出:SEARCH_DIR("=/tools/x86_64-pc-linux-gnu/lib64")SEARCH_DIR("/usr/lib")SEARCH_DIR("/lib")SEARCH_DIR("=/tools/x86_64-pc-linux-gnu/lib");使用正确的libc运行:grep "/lib.*/libc.so.6 " dummy.log输出:attempt to open /lib/libc.so.6 succeededGCC使用正确的动态链接器运行:grep found dummy.log输出:found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2rm -v dummy.c a.out dummy.log 11.zlib-1.2.11
tar xvf zlib-1.2.11.tar.xz
cd zlib-1.2.11./configure --prefix=/usrmake && make checkmake installmv -v /usr/lib/libz.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.socd ..rm -rf zlib-1.2.1112.file-5.34
tar xvf file-5.34.tar.gz
cd file-5.34./configure --prefix=/usrmake && make checkmake installcd ..rm -rf file-5.3413.Readline-7.0
tar xvf readline-7.0.tar.gz
cd readline-7.0sed -i '/MV.old/d' Makefile.insed -i '/{OLDSUFF}/c:' support/shlib-install./configure --prefix=/usr \--disable-static \--docdir=/usr/share/doc/readline-7.0make SHLIB_LIBS="-L/tools/lib -lncursesw"make SHLIB_LIBS="-L/tools/lib -lncurses" installmv -v /usr/lib/lib{readline,history}.so. /libchmod -v u+w /lib/lib{readline,history}.so.ln -sfv ../../lib/$(readlink /usr/lib/libreadline.so) /usr/lib/libreadline.soln -sfv ../../lib/$(readlink /usr/lib/libhistory.so ) /usr/lib/libhistory.soinstall -v -m644 doc/.{ps,pdf,html,dvi} /usr/share/doc/readline-7.0cd ..rm -rf readline-7.014.M4-1.4.18
tar xvf m4-1.4.18.tar.xz
cd m4-1.4.18sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.cecho "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h./configure --prefix=/usrmake && make checkmake installcd ..rm -rf m4-1.4.1815.BC-1.07.1
tar xvf bc-1.07.1.tar.gz
cd bc-1.07.1cat > bc/fix-libmath_h << "EOF"#! /bin/bashsed -e '1 s/^/{"/' \-e 's/$/",/' \-e '2,$ s/^/"/' \-e '$ d' \-i libmath.hsed -e '$ s/$/0}/' \-i libmath.hEOFln -sv /tools/lib/libncursesw.so.6 /usr/lib/libncursesw.so.6ln -sfv libncurses.so.6 /usr/lib/libncurses.sosed -i -e '/flex/s/as_fn_error/: ;; # &/' configure./configure --prefix=/usr \--with-readline \--mandir=/usr/share/man \--infodir=/usr/share/infomakeecho "quit" | ./bc/bc -l Test/checklib.bmake installcd ..rm -rf bc-1.07.116.Binutils-2.31.1
tar xvf binutils-2.31.1.tar.xz
cd binutils-2.31.1mkdir -v buildcd build../configure --prefix=/usr \--enable-gold \--enable-ld=default \--enable-plugins \--enable-shared \--disable-werror \--enable-64-bit-bfd \--with-system-zlibmake tooldir=/usrmake -k checkmake tooldir=/usr installcd ../..rm -rf binutils-2.31.117.GMP-6.1.2
make && make html
make check 2>&1 | tee gmp-check-log确保测试套件中的190个测试都通过:awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log以上命令会输出如下结果:18.MPFR-4.0.1
tar xvf mpfr-4.0.1.tar.xz
cd mpfr-4.0.1./configure --prefix=/usr \--disable-static \--enable-thread-safe \--docdir=/usr/share/doc/mpfr-4.0.1makemake html && make checkmake install && make install-htmlcd ..rm -rf mpfr-4.0.119.MPC-1.1.0
tar xvf mpc-1.1.0.tar.gz
cd mpc-1.1.0./configure --prefix=/usr \--disable-static \--docdir=/usr/share/doc/mpc-1.1.0makemake html && make checkmake install && make install-htmlcd ..rm -rf mpc-1.1.020.shadow-4.6
tar xvf shadow-4.6.tar.xz
cd shadow-4.6sed -i 's/groups$(EXEEXT) //' src/Makefile.infind 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.defssed -i 's/1000/999/' etc/useradd./configure --sysconfdir=/etc --with-group-name-max-length=32make && make installmv -v /usr/bin/passwd /bin配置shadow:启用密码:pwconv启用组密码:grpconv设置root密码:passwd rootcd ..rm -rf shadow-4.621.GCC-8.2.0
tar xvf gcc-8.2.0.tar.xz
cd gcc-8.2.0x86_64上构建LFS:case $(uname -m) inx86_64)sed -e '/m64=/s/lib64/lib/' \-i.orig gcc/config/i386/t-linux64;;esacrm -f /usr/lib/gccmkdir -v buildcd buildSED=sed \../configure --prefix=/usr \--enable-languages=c,c++ \--disable-multilib \--disable-bootstrap \--disable-libmpx \--with-system-zlibmakeulimit -s 32768rm ../gcc/testsuite/g++.dg/pr83239.Cchown -Rv nobody . su nobody -s /bin/bash -c "PATH=$PATH make -k check"../contrib/test_summarymake installln -sv ../usr/bin/cpp /libln -sv gcc /usr/bin/ccinstall -v -dm755 /usr/lib/bfd-pluginsln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/8.2.0/liblto_plugin.so \/usr/lib/bfd-plugins/测试最终工具链:echo 'int main(){}' > dummy.ccc dummy.c -v -Wl,--verbose &> dummy.logreadelf -l a.out | grep ': /lib'输出结果:22.bzip2-1.0.6
tar xvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patchsed -i 's@(ln -s -f )$(PREFIX)/bin/@\1@' Makefilesed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefilemake -f Makefile-libbz2_somake cleanmake && make PREFIX=/usr installcp -v bzip2-shared /bin/bzip2cp -av libbz2.so* /libln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.sorm -v /usr/bin/{bunzip2,bzcat,bzip2}ln -sv bzip2 /bin/bunzip2ln -sv bzip2 /bin/bzcatcd ..rm -rf bzip2-1.0.623.pkg-config-0.29.2
tar xvf 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.2make && make checkmake installcd ..rm -rf pkg-config-0.29.224.ncurses-6.1
tar xvf ncurses-6.1.tar.gz
cd ncurses-6.1sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in./configure --prefix=/usr \--mandir=/usr/share/man \--with-shared \--without-debug \--without-normal \--enable-pc-files \--enable-widecmake && make installmv -v /usr/lib/libncursesw.so.6 /libln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.sofor lib in ncurses form panel menu ; dorm -vf /usr/lib/lib${lib}.soecho "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.soln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pcdonerm -vf /usr/lib/libcursesw.soecho "INPUT(-lncursesw)" > /usr/lib/libcursesw.soln -sfv libncurses.so /usr/lib/libcurses.somkdir -v /usr/share/doc/ncurses-6.1cp -v -R doc/ /usr/share/doc/ncurses-6.1make distclean./configure --prefix=/usr \--with-shared \--without-normal \--without-debug \--without-cxx-binding \--with-abi-version=5 make sources libscp -av lib/lib.so.5 /usr/libcd ..rm -rf ncurses-6.1tar xvf 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.48make && make checkmake installmv -v /usr/lib/libattr.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.socd ..rm -rf attr-2.4.48tar xvf 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.53make && make installmv -v /usr/lib/libacl.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.socd ..rm -rf acl-2.2.5327.libcap-2.25
tar xvf libcap-2.25.tar.xz
cd libcap-2.25sed -i '/install.STALIBNAME/d' libcap/Makefilemakemake RAISE_SETFCAP=no lib=lib prefix=/usr installchmod -v 755 /usr/lib/libcap.somv -v /usr/lib/libcap.so. /libln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.socd ..rm -rf libcap-2.25tar xvf sed-4.5.tar.xz
cd sed-4.5sed -i 's/usr/tools/' build-aux/help2mansed -i 's/testsuite.panic-tests.sh//' Makefile.in./configure --prefix=/usr --bindir=/binmake && make html && make checkmake installinstall -d -m755 /usr/share/doc/sed-4.5install -m644 doc/sed.html /usr/share/doc/sed-4.5cd ..rm -rf sed-4.5tar xvf psmisc-23.1.tar.xz
cd psmisc-23.1./configure --prefix=/usrmake && make installmv -v /usr/bin/fuser /binmv -v /usr/bin/killall /bincd ..rm -rf psmisc-23.1tar xvf iana-etc-2.30.tar.bz2
cd iana-etc-2.30make && make installcd ..rm -rf iana-etc-2.30tar xvf bison-3.0.5.tar.xz
cd bison-3.0.5./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.0.5make && make installcd ..rm -rf bison-3.0.5tar xvf flex-2.6.4.tar.gz
cd flex-2.6.4sed -i "/math.h/a #include <malloc.h>" src/flexdef.hHELP2MAN=/tools/bin/true \./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.4make && make checkmake installln -sv flex /usr/bin/lexcd ..rm -rf flex-2.6.4tar xvf grep-3.1.tar.xz
cd grep-3.1./configure --prefix=/usr --bindir=/binmake && make -k checkmake installcd ..rm -rf grep-3.1tar xvf bash-4.4.18.tar.gz
cd bash-4.4.18./configure --prefix=/usr \--docdir=/usr/share/doc/bash-4.4.18 \--without-bash-malloc \--with-installed-readlinemakechown -Rv nobody .su nobody -s /bin/bash -c "PATH=$PATH make tests"make installmv -vf /usr/bin/bash /binexec /bin/bash --login +hcd ..rm -rf bash-4.4.18tar xvf libtool-2.4.6.tar.xz
cd libtool-2.4.6./configure --prefix=/usrmake && make -j8 check //我是4个核心,所以写-j8,根据你的实际情况改一下,测试会有错误。不用管它,继续安装。错误如下:tar xvf gdbm-1.17.tar.gz
cd gdbm-1.17./configure --prefix=/usr \--disable-static \--enable-libgdbm-compatmake && make checkmake installcd ..rm -rf gdbm-1.17tar xvf gperf-3.1.tar.gz
cd gperf-3.1./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1make && make -j1 checkmake installcd ..rm -rf gperf-3.1tar xvf expat-2.2.6.tar.bz2
cd expat-2.2.6sed -i 's|usr/bin/env |bin/|' run.sh.in./configure --prefix=/usr \--disable-static \--docdir=/usr/share/doc/expat-2.2.6make && make checkmake installinstall -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.2.6cd ..rm -rf expat-2.2.6tar xvf 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-serversmake && make checkmake installmv -v /usr/bin/{hostname,ping,ping6,traceroute} /binmv -v /usr/bin/ifconfig /sbincd ..rm -rf inetutils-1.9.440.Perl-5.28.0
tar xvf perl-5.28.0.tar.xz
cd perl-5.28.0echo "127.0.0.1 localhost $(hostname)" > /etc/hostsexport BUILD_ZLIB=Falseexport BUILD_BZIP2=0sh Configure -des -Dprefix=/usr \-Dvendorprefix=/usr \-Dman1dir=/usr/share/man/man1 \-Dman3dir=/usr/share/man/man3 \-Dpager="/usr/bin/less -isR" \-Duseshrplib \-Dusethreadsmake && make -k testmake installunset BUILD_ZLIB BUILD_BZIP2cd ..rm -rf perl-5.28.041.XML::Parser-2.44
tar xvf XML-Parser-2.44.tar.gz
cd XML-Parser-2.44perl Makefile.PL \make && make testmake installcd ..rm -rf XML-Parser-2.4442.Intltool-0.51.0
tar xvf intltool-0.51.0.tar.gz
cd intltool-0.51.0sed -i 's:\\${:\\$\{:' intltool-update.in./configure --prefix=/usrmake && make checkmake installinstall -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTOcd ..rm -rf intltool-0.51.0tar xvf autoconf-2.69.tar.xz
cd autoconf-2.69./configure --prefix=/usrmakemake checkmake installcd ..rm -rf autoconf-2.69tar xvf automake-1.16.1.tar.xz
cd automake-1.16.1./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.1makemake -j4 checkmake installcd ..rm -rf automake-1.16.145.XZ-5.2.4
tar xvf xz-5.2.4.tar.xz
cd xz-5.2.4./configure --prefix=/usr \--disable-static \--docdir=/usr/share/doc/xz-5.2.4make && make checkmake installmv -v /usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} /binmv -v /usr/lib/liblzma.so.* /libln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.socd ..rm -rf xz-5.2.446.KMOD-25
tar xvf kmod-25.tar.xz
cd kmod-25./configure --prefix=/usr \--bindir=/bin \--sysconfdir=/etc \--with-rootlibdir=/lib \--with-xz \--with-zlibmake && make installfor target in depmod insmod lsmod modinfo modprobe rmmod; doln -sfv ../bin/kmod /sbin/$targetdoneln -sfv kmod /bin/lsmodcd ..rm -rf kmod-2547.Gettext-0.19.8.1
tar xvf gettext-0.19.8.1.tar.xz
cd gettext-0.19.8.1sed -i '/^TESTS =/d' gettext-runtime/tests/Makefile.in &&sed -i 's/test-lock..EXEEXT.//' gettext-tools/gnulib-tests/Makefile.insed -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.1make && make checkmake installchmod -v 0755 /usr/lib/preloadable_libintl.socd ..rm -rf gettext-0.19.8.148.Libelf-0.173
tar xvf elfutils-0.173.tar.bz2
cd elfutils-0.173./configure --prefix=/usrmake && make checkmake -C libelf installinstall -vm644 config/libelf.pc /usr/lib/pkgconfigcd ..rm -rf elfutils-0.17349.Libffi-3.2.1
tar xvf libffi-3.2.1.tar.gz
cd libffi-3.2.1sed -e '/^includesdir/ s/$(libdir).$/$(includedir)/' \-i include/Makefile.insed -e '/^includedir/ s/=.$/=@includedir@/' \-e 's/^Cflags: -I${includedir}/Cflags:/' \-i libffi.pc.in./configure --prefix=/usr --disable-static --with-gcc-arch=nativemake && make checkmake installcd ..rm -rf libffi-3.2.150.OpenSSL 1.1.0i
tar xvf openssl-1.1.0i.tar.gz
cd openssl-1.1.0i./config --prefix=/usr \--openssldir=/etc/ssl \--libdir=lib \shared \zlib-dynamicmake && make testsed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefilemake MANSUFFIX=ssl installmv -v /usr/share/doc/openssl /usr/share/doc/openssl-1.1.0icp -vfr doc/* /usr/share/doc/openssl-1.1.0icd ..rm -rf openssl-1.1.0i51.Python-3.7.0
tar xvf Python-3.7.0.tar.xz
cd Python-3.7.0 ./configure --prefix=/usr \--enable-shared \--with-system-expat \--with-system-ffi \--with-ensurepip=yesmake && make installchmod -v 755 /usr/lib/libpython3.7m.sochmod -v 755 /usr/lib/libpython3.soinstall -v -dm755 /usr/share/doc/python-3.7.0/html tar --strip-components=1 \--no-same-owner \--no-same-permissions \-C /usr/share/doc/python-3.7.0/html \-xvf ../python-3.7.0-docs-html.tar.bz2cd ..rm -rf Python-3.7.052.Ninja-1.8.2
tar xvf ninja-1.8.2.tar.gz
cd ninja-1.8.2export NINJAJOBS=4patch -Np1 -i ../ninja-1.8.2-add_NINJAJOBS_var-1.patchpython3 configure.py --bootstrappython3 configure.py./ninja ninja_test./ninja_test --gtest_filter=-SubprocessTest.SetWithLotsinstall -vm755 ninja /usr/bin/install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninjainstall -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninjacd ..rm -rf ninja-1.8.253.Meson-0.47.1
tar xvf meson-0.47.1.tar.gz
cd meson-0.47.1python3 setup.py buildpython3 setup.py install --root=destcp -rv dest/* /cd ..rm -rf meson-0.47.154.procps-NG-3.3.15
tar xvf 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-killmakesed -i -r 's|(pmap_initname)\\$|\1|' testsuite/pmap.test/pmap.expsed -i '/set tty/d' testsuite/pkill.test/pkill.exprm testsuite/pgrep.test/pgrep.expmake checkmake installmv -v /usr/lib/libprocps.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.socd ..rm -rf procps-ng-3.3.1555.e2fsprogs-1.44.3
tar xvf e2fsprogs-1.44.3.tar.gz
cd e2fsprogs-1.44.3mkdir -v buildcd build../configure --prefix=/usr \--bindir=/bin \--with-root-prefix="" \--enable-elf-shlibs \--disable-libblkid \--disable-libuuid \--disable-uuidd \--disable-fsckmakeln -sfv /tools/lib/lib{blk,uu}id.so.1 libmake LD_LIBRARY_PATH=/tools/lib checkmake installmake install-libschmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.agunzip -v /usr/share/info/libext2fs.info.gzinstall-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.infomakeinfo -o doc/com_err.info ../lib/et/com_err.texinfoinstall -v -m644 doc/com_err.info /usr/share/infoinstall-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.infocd ../..rm -rf e2fsprogs-1.44.356.Coreutils-8.30
tar xvf coreutils-8.30.tar.xz
cd coreutils-8.30patch -Np1 -i ../coreutils-8.30-i18n-1.patchsed -i '/test.lock/s/^/#/' gnulib-tests/gnulib.mkautoreconf -fivFORCE_UNSAFE_CONFIGURE=1 ./configure \--prefix=/usr \--enable-no-install-program=kill,uptimeFORCE_UNSAFE_CONFIGURE=1 makemake NON_ROOT_USERNAME=nobody check-rootecho "dummy:x:1000:nobody" >> /etc/groupchown -Rv nobody . su nobody -s /bin/bash \-c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"sed -i '/dummy/d' /etc/groupmake installmv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /binmv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /binmv -v /usr/bin/{rmdir,stty,sync,true,uname} /binmv -v /usr/bin/chroot /usr/sbinmv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8mv -v /usr/bin/{head,sleep,nice} /bincd ..rm -rf coreutils-8.3057.check-0.12.0
tar xvf check-0.12.0.tar.gz
cd check-0.12.0./configure --prefix=/usrmake && make checkmake installsed -i '1 s/tools/usr/' /usr/bin/checkmkcd ..rm -rf check-0.12.058.diffutils-3.6
tar xvf diffutils-3.6.tar.xz
cd diffutils-3.6./configure --prefix=/usrmake && make checkmake installcd ..rm -rf diffutils-3.659.GAWK-4.2.1
tar xvf gawk-4.2.1.tar.xz
cd gawk-4.2.1sed -i 's/extras//' Makefile.in./configure --prefix=/usrmake && make checkmake installmkdir -v /usr/share/doc/gawk-4.2.1cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.2.1cd ..rm -rf gawk-4.2.160.findutils-4.6.0
tar xvf findutils-4.6.0.tar.gz
cd findutils-4.6.0sed -i 's/test-lock..EXEEXT.//' tests/Makefile.insed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' gl/lib/*.csed -i '/unistd/a #include <sys/sysmacros.h>' gl/lib/mountlist.cecho "#define _IO_IN_BACKUP 0x100" >> gl/lib/stdio-impl.h./configure --prefix=/usr --localstatedir=/var/lib/locatemake && make checkmake installmv -v /usr/bin/find /binsed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedbcd ..rm -rf findutils-4.6.061.Groff-1.22.3
tar xvf groff-1.22.3.tar.gz
cd groff-1.22.3PAGE=A4 ./configure --prefix=/usrmake -j1make installcd ..rm -rf groff-1.22.362.GRUB-2.02
tar xvf grub-2.02.tar.xz
cd grub-2.02./configure --prefix=/usr \--sbindir=/sbin \--sysconfdir=/etc \--disable-efiemu \--disable-werrormake && make installcd ..rm -rf grub-2.0263.Less-530
tar xvf less-530.tar.gz
cd less-530./configure --prefix=/usr --sysconfdir=/etcmake && make installcd ..rm -rf less-53064.gzip 1.9
tar xvf gzip-1.9.tar.xz
cd gzip-1.9sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.cecho "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h./configure --prefix=/usrmake && make checkmake installmv -v /usr/bin/gzip /bincd ..rm -rf gzip-1.965.IPRoute2-4.18.0
tar xvf iproute2-4.18.0.tar.xz
cd iproute2-4.18.0sed -i /ARPD/d Makefilerm -fv man/man8/arpd.8sed -i 's/.m_ipt.o//' tc/Makefilemakemake DOCDIR=/usr/share/doc/iproute2-4.18.0 installcd ..rm -rf iproute2-4.18.066.KBD-2.0.4
tar xvf kbd-2.0.4.tar.xz
cd kbd-2.0.4patch -Np1 -i ../kbd-2.0.4-backspace-1.patchsed -i 's/(RESIZECONS_PROGS=)yes/\1no/g' configuresed -i 's/resizecons.8 //' docs/man/man8/Makefile.inPKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr --disable-vlockmake && make checkmake installmkdir -v /usr/share/doc/kbd-2.0.4cp -R -v docs/doc/* /usr/share/doc/kbd-2.0.4cd ..rm -rf kbd-2.0.467.Libpipeline-1.5.0
tar xvf libpipeline-1.5.0.tar.gz
cd libpipeline-1.5.0./configure --prefix=/usrmake && make checkmake installcd ..rm -rf libpipeline-1.5.068.Make-4.2.1
tar xvf make-4.2.1.tar.bz2
cd make-4.2.1sed -i '211,217 d; 219,229 d; 232 d' glob/glob.c./configure --prefix=/usrmakemake PERL5LIB=$PWD/tests/ checkmake installcd ..rm -rf make-4.2.169.Patch-2.7.6
tar xvf patch-2.7.6.tar.xz
cd patch-2.7.6./configure --prefix=/usrmake && make checkmake installcd ..rm -rf cd patch-2.7.670.Sysklogd-1.5.1
tar xvf sysklogd-1.5.1.tar.gz
cd sysklogd-1.5.1 sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.csed -i 's/union wait/int/' syslogd.cmakemake BINDIR=/sbin install创建syslog.conf文件:cat > /etc/syslog.conf << "EOF"auth,authpriv. -/var/log/auth.log.;auth,authpriv.none -/var/log/sys.logdaemon. -/var/log/daemon.logkern. -/var/log/kern.logmail. -/var/log/mail.loguser. -/var/log/user.log.emerg *EOFcd ..rm -rf sysklogd-1.5.171.sysvinit-2.90
tar xvf sysvinit-2.90.tar.xz
cd sysvinit-2.90patch -Np1 -i ../sysvinit-2.90-consolidated-1.patchmake -C srcmake -C src installcd ..rm -rf sysvinit-2.9072.Eudev-3.2.5
tar xvf eudev-3.2.5.tar.gz
cd eudev-3.2.5cat > config.cache << "EOF"HAVE_BLKID=1BLKID_LIBS="-lblkid"BLKID_CFLAGS="-I/tools/include"EOF./configure --prefix=/usr \--bindir=/sbin \--sbindir=/sbin \--libdir=/usr/lib \--sysconfdir=/etc \--libexecdir=/lib \--with-rootprefix= \--with-rootlibdir=/lib \--enable-manpages \--disable-static \--config-cacheLIBRARY_PATH=/tools/lib makemkdir -pv /lib/udev/rules.dmkdir -pv /etc/udev/rules.dmake LD_LIBRARY_PATH=/tools/lib checkmake LD_LIBRARY_PATH=/tools/lib installtar -xvf ../udev-lfs-20171102.tar.bz2make -f udev-lfs-20171102/Makefile.lfs installLD_LIBRARY_PATH=/tools/lib udevadm hwdb --updatecd ..rm -rf eudev-3.2.573.UTIL-Linux的2.32.1
tar xvf util-linux-2.32.1.tar.xz
cd util-linux-2.32.1mkdir -pv /var/lib/hwclockrm -vf /usr/include/{blkid,libmount,uuid}./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \--docdir=/usr/share/doc/util-linux-2.32.1 \--disable-chfn-chsh \--disable-login \--disable-nologin \--disable-su \--disable-setpriv \--disable-runuser \--disable-pylibmount \--disable-static \--without-python \--without-systemd \--without-systemdsystemunitdirmakechown -Rv nobody .su nobody -s /bin/bash -c "PATH=$PATH make -k check"make installcd ..rm -rf util-linux-2.32.174.Man-DB-2.8.4
tar xvf man-db-2.8.4.tar.xz
cd man-db-2.8.4./configure --prefix=/usr \--docdir=/usr/share/doc/man-db-2.8.4 \--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=make && make checkmake installcd ..rm -rf man-db-2.8.476.tar-1.30
tar xvf tar-1.30.tar.xz
cd tar-1.30FORCE_UNSAFE_CONFIGURE=1 \./configure --prefix=/usr \--bindir=/binmake && make checkmake installmake -C doc install-html docdir=/usr/share/doc/tar-1.30cd ..rm -rf tar-1.3077.Texinfo-6.5
tar xvf texinfo-6.5.tar.xz
cd texinfo-6.5sed -i '5481,5485 s/({/(\{/' tp/Texinfo/Parser.pm./configure --prefix=/usr --disable-staticmake && make checkmake installmake TEXMF=/usr/share/texmf install-texpushd /usr/share/inform -v dirfor f in *do install-info $f dir 2>/dev/nulldonepopdcd ..rm -rf texinfo-6.577.VIM-8.1
tar xvf vim-8.1.tar.bz2
cd vim81echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h./configure --prefix=/usrmakeLANG=en_US.UTF-8 make -j1 test &> vim-test.log上面的命令完成后会停止。make installln -sv vim /usr/bin/vifor L in /usr/share/man/{,*/}man1/vim.1; doln -sv vim.1 $(dirname $L)/vi.1doneln -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 aftersource $VIMRUNTIME/defaults.vimlet skip_defaults_vim=1 set nocompatibleset backspace=2set mouse=syntax onif (&term == "xterm") || (&term == "putty")set background=darkendif" End /etc/vimrcEOFcd ..rm -rf vim8179.清理系统rm -rf /tmp/使用更新的chroot命令重新进入chroot环境:logoutchroot "$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}.arm -f /usr/lib/libbz2.arm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.arm -f /usr/lib/libltdl.arm -f /usr/lib/libfl.arm -f /usr/lib/libz.afind /usr/lib /usr/libexec -name \.la -delete
七、系统配置
1.LFS-启动脚本LFS-Bootscripts:
cd $LFS/sources
tar xvf lfs-bootscripts-20180820.tar.bz2cd lfs-bootscripts-20180820make installcd ..rm -rf lfs-bootscripts-201808202.创建网络接口配置文件:
bash /lib/udev/init-net-rules.sh
首先用以下命令找到你网卡的名字:cat /etc/udev/rules.d/70-persistent-net.rules结果显示如下:3.创建/etc/resolv.conf文件
vi /etc/resolv.conf
#domain <Your Domain Name> //设置域名,如果有的话nameserver 118.118.118.1 //设置DNS服务器IP地址。根据实际调整。#nameserver <IP address nameserver> //如果有第二个DNS服务器在这里设置。以上文件根据自己实际调整。
4.配置系统主机名
echo "<lfs>" > /etc/hostname
5.创建hosts文件:
cat > /etc/hosts << "EOF"
127.0.0.1 localhostEOF6.System V Bootscript配置
cat > /etc/inittab << "EOF"
id:3:initdefault:si::sysinit:/etc/rc.d/init.d/rc Sl0:0:wait:/etc/rc.d/init.d/rc 0l1:S1:wait:/etc/rc.d/init.d/rc 1l2:2:wait:/etc/rc.d/init.d/rc 2l3:3:wait:/etc/rc.d/init.d/rc 3l4:4:wait:/etc/rc.d/init.d/rc 4l5:5:wait:/etc/rc.d/init.d/rc 5l6:6:wait:/etc/rc.d/init.d/rc 6ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r nowsu:S016:once:/sbin/sulogin1:2345:respawn:/sbin/agetty --noclear tty1 96002:2345:respawn:/sbin/agetty tty2 96003:2345:respawn:/sbin/agetty tty3 96004:2345:respawn:/sbin/agetty tty4 96005:2345:respawn:/sbin/agetty tty5 96006:2345:respawn:/sbin/agetty tty6 9600EOF7.配置系统时钟clock
cat > /etc/sysconfig/clock << "EOF"
UTC=1CLOCKPARAMS=EOF8.Bash Shell启动文件
运行以下命令获取Glibc支持的所有语言环境的列表:locale -a看有没有zh_CN.gb18030:如果没有就添加:localedef -i zh_CN -f GB18030 zh_CN.GB18030有的话继续向下执行:LC_ALL=zh_CN.gb18030 locale charmap进行测试:运行:LC_ALL=zh_CN.gb18030 locale language结果:Chinese运行:LC_ALL=zh_CN.gb18030 locale charmap结果:GB18030运行:LC_ALL=zh_CN.gb18030 locale int_curr_symbol结果:CNY运行:LC_ALL=zh_CN.gb18030 locale int_prefix结果:86创建/etc/profil文件:
cat > /etc/profile << "EOF"export LANG=zh_CN.gb18030EOF创建/ etc / inputrc文件:
cat > /etc/inputrc << "EOF"
set horizontal-scroll-mode Offset meta-flag Onset input-meta Onset convert-meta Offset output-meta Onset bell-style none"\eOd": backward-word"\eOc": forward-word"\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"\eOH": beginning-of-line"\eOF": end-of-line"\e[H": beginning-of-line
"\e[F": end-of-lineEOF创建/etc/shells文件:
cat > /etc/shells << "EOF"
/bin/sh/bin/bashEOF9.创建/etc/ fsta文件:
cat > /etc/fstab << "EOF"
/dev/sda3 / ext4 defaults 1 1/dev/sda2 swap swap pri=1 0 0proc /proc proc nosuid,noexec,nodev 0 0sysfs /sys sysfs nosuid,noexec,nodev 0 0devpts /dev/pts devpts gid=5,mode=620 0 0tmpfs /run tmpfs defaults 0 0devtmpfs /dev devtmpfs mode=0755,nosuid 0 0EOF10.安装内核:
cd $LFS/sources
tar xvf linux-4.18.5.tar.xzcd linux-4.18.5make mrpropermake defconfigmake menuconfig确保以下选项正确设置:11.设置GRUB引导:
GRUB文件安装到/boot/grub并设置引导跟踪:grub-install /dev/sda创建GRUB配置文件:cat > /boot/grub/grub.cfg << "EOF"set default=0set timeout=5insmod ext4set root=(hd0,3)menuentry "GNU/Linux, Linux 4.18.5-lfs-8.3" { linux /boot/vmlinuz-4.18.5-lfs-8.3 root=/dev/sda3 ro}EOFecho 8.3 > /etc/lfs-releasecat > /etc/lsb-release << "EOF"DISTRIB_ID="Linux From Scratch"DISTRIB_RELEASE="8.3"DISTRIB_CODENAME="<your name here>"DISTRIB_DESCRIPTION="Linux From Scratch"EOF12.重新启动系统:
logoutumount -v $LFS/dev/ptsumount -v $LFS/devumount -v $LFS/runumount -v $LFS/procumount -v $LFS/sysumount -v $LFS取出光盘,重新启动计算机:shutdown -r now13.重新启动后的界面:至此,LFS 8.3系统就完成了。
转载于:https://blog.51cto.com/9828355/2330682