LFS7.4编译笔记(2)
上一篇我们已经搭建好了临时系统,这一篇我们就开始正式构建我们的最终LFS系统。
首先切换到root,准备虚拟内核文件系统并挂载:
1 su - 2 export LFS=/mnt/lfs 3 mkdir -pv $LFS/{dev,proc,sys} 4 mknod -m 600 $LFS/dev/console c 5 1 5 mknod -m 666 $LFS/dev/null c 1 3 6 mount -v --bind /dev $LFS/dev 7 mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620 8 mount -vt proc proc $LFS/proc 9 mount -vt sysfs sysfs $LFS/sys 10 11 if [ -h $LFS/dev/shm ]; then 12 link=$(readlink $LFS/dev/shm) 13 mkdir -p $LFS/$link 14 mount -vt tmpfs shm $LFS/$link 15 unset link 16 else 17 mount -vt tmpfs shm $LFS/dev/shm 18 fi
接着进入chroot环境编译最终的LFS系统:
chroot $LFS /tools/bin/env -i HOME=$HOME TERM=$TERM \ PS1="\$? \u:\w\$ " PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ /tools/bin/bash --login +h
此后LFS变量就不需要了。此时如果重启的话,再次进入chroot环境前必须挂载上面提到的虚拟内核文件系统。
创建目录:
1 mkdir -pv /{bin,etc/{opt,sysconfig},home,lib,mnt,opt,run} 2 mkdir -pv /{media/{floppy,cdrom},sbin,srv,var} 3 install -dv -m 0750 /root 4 install -dv -m 1777 /tmp /var/tmp 5 mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src} 6 mkdir -pv /usr/{,local/}share/{doc,info,locale,man} 7 mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo} 8 mkdir -pv /usr/{,local/}share/man/man{1..8} 9 for dir in /usr /usr/local; do 10 ln -sv share/{man,doc,info} $dir 11 done 12 case $(uname -m) in 13 x86_64) ln -sv lib /lib64 && ln -sv lib /usr/lib64 && ln -sv lib /usr/local/lib64 ;; 14 esac 15 mkdir -v /var/{log,mail,spool} 16 ln -sv /run /var/run 17 ln -sv /run/lock /var/lock 18 mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
创建必要的文件和符号链接:
1 ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin 2 ln -sv /tools/bin/perl /usr/bin 3 ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib 4 ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib 5 sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la 6 ln -sv bash /bin/sh
创建mtab文件:
ln -sv /proc/self/mounts /etc/mtab
创建passwd和group文件以便我们可以登录:
1 cat > /etc/passwd <<EOF 2 root:x:0:0:root:/root:/bin/bash 3 bin:x:1:1:bin:/dev/null:/bin/false 4 nobody:x:99:99:Unprivileged User:/dev/null:/bin/false 5 EOF 6 cat > /etc/group <<EOF 7 root:x:0: 8 bin:x:1: 9 sys:x:2: 10 kmem:x:3: 11 tape:x:4: 12 tty:x:5: 13 daemon:x:6: 14 floppy:x:7: 15 disk:x:8: 16 lp:x:9: 17 dialout:x:10: 18 audio:x:11: 19 video:x:12: 20 utmp:x:13: 21 usb:x:14: 22 cdrom:x:15: 23 mail:x:34: 24 nogroup:x:99: 25 EOF
重新加载bash,就可以识别我们的用户名了(如果是用脚本自动执行的话,就不要执行下面的这句代码了):
exec /tools/bin/bash --login +h
创建日志文件并给出权限:
touch /var/log/{btmp,lastlog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp
下面开始编译:
Linux-3.10.10 API Headers
1 tar xvf linux-3.10.10.tar.xz 2 cd linux-3.10.10 3 make mrproper 4 make headers_check 5 make INSTALL_HDR_PATH=dest headers_install 6 find dest/include \( -name .install -o -name ..install.cmd \) -delete 7 cp -rv dest/include/* /usr/include 8 cd .. 9 rm -rf linux-3.10.10
Man-pages-3.53
1 tar xvf man-pages-3.53.tar.xz 2 cd man-pages-3.53 3 make install 4 cd .. 5 rm -rf man-pages-3.53
Glibc-2.18
1 tar xvf glibc-2.18.tar.xz 2 cd glibc-2.18 3 sed -i -e 's/static __m128i/inline &/' sysdeps/x86_64/multiarch/strstr.c 4 mkdir -v ../glibc-build 5 cd ../glibc-build 6 ../glibc-2.18/configure \ 7 --prefix=/usr \ 8 --disable-profile \ 9 --enable-kernel=2.6.32 \ 10 --libexecdir=/usr/lib/glibc 11 make 12 make -k check 2>&1 | tee glibc-check-log 13 grep Error glibc-check-log 14 touch /etc/ld.so.conf 15 make install 16 cp -v ../glibc-2.18/sunrpc/rpc/*.h /usr/include/rpc 17 cp -v ../glibc-2.18/sunrpc/rpcsvc/*.h /usr/include/rpcsvc 18 cp -v ../glibc-2.18/nis/rpcsvc/*.h /usr/include/rpcsvc 19 20 mkdir -pv /usr/lib/locale 21 localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 22 localedef -i de_DE -f ISO-8859-1 de_DE 23 localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro 24 localedef -i de_DE -f UTF-8 de_DE.UTF-8 25 localedef -i en_GB -f UTF-8 en_GB.UTF-8 26 localedef -i en_HK -f ISO-8859-1 en_HK 27 localedef -i en_PH -f ISO-8859-1 en_PH 28 localedef -i en_US -f ISO-8859-1 en_US 29 localedef -i en_US -f UTF-8 en_US.UTF-8 30 localedef -i es_MX -f ISO-8859-1 es_MX 31 localedef -i fa_IR -f UTF-8 fa_IR 32 localedef -i fr_FR -f ISO-8859-1 fr_FR 33 localedef -i fr_FR@euro -f ISO-8859-1 fr_FR@euro 34 localedef -i fr_FR -f UTF-8 fr_FR.UTF-8 35 localedef -i it_IT -f ISO-8859-1 it_IT 36 localedef -i it_IT -f UTF-8 it_IT.UTF-8 37 localedef -i ja_JP -f EUC-JP ja_JP 38 localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R 39 localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 40 localedef -i tr_TR -f UTR-8 tr_TR.UTF-8 41 localedef -i zh_CN -f GB18030 zh_CN.GB18030
配置Glibc
1 cat > /etc/nsswitch.conf <<EOF 2 # Begin /etc/nsswitch.conf 3 4 passwd: files 5 group: files 6 shadow: files 7 8 host: files dns 9 networks: files 10 11 protocols: files 12 services: files 13 ethers: files 14 rpc: files 15 16 # End /etc/nsswitch.conf 17 EOF
安装时区数据:
1 tar -xf ../tzdata2013d.tar.gz 2 ZONEINFO=/usr/share/zoneinfo 3 mkdir -pv $ZONEINFO/{posix,right} 4 5 for tz in etcetera southamerica northamerica europe africa antarctica \ 6 asia australasia backward pacificnew solar87 solar88 solar89 \ 7 systemv; do 8 zic -L /dev/null -d $ZONEINFO -y "sh yearistype.sh" ${tz} 9 zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz} 10 zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz} 11 done 12 cp -v zone.tab iso3166.tab $ZONEINFO 13 zic -d $ZONEINFO -p America/New_York 14 unset ZONEINFO
创建/etc/localtime文件:
cp -v --remove-destination /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
配置动态加载器:
1 cat > /etc/ld.so.conf <<EOF 2 # Begin /etc/ld.so.conf 3 /usr/local/lib 4 /opt/lib 5 EOF 6 cat >> /etc/ld.so.conf <<EOF 7 # Add an include directory 8 include /etc/ld.so.conf.d/*.conf 9 EOF 10 mkdir -pv /etc/ld.so.conf.d
调整工具链:
1 mv -v /tools/bin/{ld,ld-old} 2 mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old} 3 mv -v /tools/bin/{ld-new,ld} 4 ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
修改GCC的specs文件指向新的动态链接器:
gcc -dumpspecs | sed -e 's@/tools@@g' \ -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \ -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \ `dirname $(gcc --print-libgcc-file-name)`/specs
下面进行工具链的第一次系列的检查:
1 echo 'main(){}' > dummy.c 2 cc dummy.c -v -Wl,--verbose &> dummy.log 3 readelf -l a.out | grep interpreter 4 正确输出应该是: 5 [Requesting program interpreter: /lib/ld-linux.so.2] 6 7 确保设置为使用正确的起始文件: 8 grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log 9 如果一切工作正常,就不应改出错,最后一条命令的输出应为: 10 /usr/lib/crt1.o succeeded 11 /usr/lib/crti.o succeeded 12 /usr/lib/crtn.o succeeded 13 14 编译器是否寻找正确的头文件: 15 grep -B1 '^ /usr/include' dummy.log 16 此命令应该成功返回并给出以下输出: 17 #include <...> search starts here: 18 /usr/include 19 20 检查新的链接器使用正确的搜索路径: 21 grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g' 22 如果一切工作正常,就不应改出错,最后一条命令的输出 23 SEARCH_DIR("/usr/lib") 24 SEARCH_DIR("/lib"); 25 26 确认我们使用的是正确的 libc: 27 grep "/lib.*/libc.so.6 " dummy.log 28 如果一切工作正常,就不应改出错,最后一条命令的输出 29 attempt to open /lib/libc.so.6 succeeded 30 31 最后,确保 GCC 使用正确的动态链接器: 32 grep found dummy.log 33 如果一切工作正常,就不应改出错,最后一条命令的输出 34 found ld-linux.so.2 at /lib/ld-linux.so.2 35 36 如果一切都正常,就可以继续往下做了。否则一定要检查到底哪里出错了
37 rm -v dummy.c a.out dummy.log
Zlib-1.2.8
1 tar xvf zlib-1.2.8.tar.xz 2 cd zlib-1.2.8 3 ./configure --prefix=/usr 4 make 5 make check 6 make install 7 mv -v /usr/lib/lib.so.* /lib 8 ln -sfv ../../lib/libz.so.1.2.8 /usr/lib/libz.so 9 cd .. 10 rm -rf zlib-1.2.8
File-5.14
1 tar xvf file-5.14.tar.gz 2 cd file-5.14 3 ./configure --prefix=/usr 4 make 5 make check 6 make install 7 cd .. 8 rm -rf file-5.14
Binutils-2.23.2
1 tar xvf binutils-2.23.2.tar.bz2 2 cd binutils-2.23.2 3 expect -c "spawn ls" #输出spawn ls表示正常,可以继续 4 rm -fv etc/standards.info 5 sed -i.bak '/^INFO/s/standards.info //' etc/Makefile.in 6 7 sed -i -e 's/@colophon/@@colophon/' \ 8 -e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo 9 mkdir -v ../binutils-build 10 cd ../binutils-build 11 ../binutils-2.23.2/configure --prefix=/usr --enable-shared 12 make tooldir=/usr 13 14 make check 15 make tooldir=/usr install 16 cp -v ../binutils-2.23.2/include/libiberty.h /usr/include 17 cd .. 18 rm -rf binutils-2.23.2 binutils-build
GMP-5.1.2
1 tar xvf gmp-5.1.2.tar.xz 2 cd gmp-5.1.2 3 ./configure --prefix=/usr --enable-cxx 4 make 5 make check 2>&1 | tee gmp-check-log 6 awk '/tests passed/{total+=$2} ; END{print total}' gmp-check-log 7 make install 8 mkdir -v /usr/share/doc/gmp-5.1.2 9 cp -v doc/{isa_abi_headache,configuration} doc/*.html \ 10 /usr/share/doc/gmp-5.1.2 11 cd .. 12 rm -rf gmp-5.1.2
MPFR-3.1.2
1 tar xvf mpfr-3.1.2.tar.xz 2 cd mpfr-3.1.2 3 ./configure --prefix=/usr \ 4 --enable-thread-safe \ 5 --docdir=/usr/share/doc/mpfr-3.1.2 6 make 7 make check 8 make install 9 make html 10 make install-html 11 cd .. 12 rm -rf mpfr-3.1.2
MPC-1.0.1
1 tar xvf mpc-1.0.1.tar.gz 2 cd mpc-1.0.1 3 ./configure --prefix=/usr 4 make 5 make check 6 make install 7 cd .. 8 rm -rf mpc-1.0.1
GCC-4.8.1
1 tar xvf gcc-4.8.1.tar.bz2 2 cd gcc-4.8.1 3 case `uname -m` in 4 i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in ;; 5 esac 6 sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in 7 sed -i -e /autogen/d -e /check.sh/d fixincludes/Makefile.in 8 mv -v libmudflap/testsuite/libmudflap.c++/pass41-frag.cxx{,.disable} 9 mkdir -v ../gcc-build 10 cd ../gcc-build 11 ../gcc-4.8.1/configure --prefix=/usr \ 12 --libexecdir=/usr/lib \ 13 --enable-shared \ 14 --enable-threads=posix \ 15 --enable-__cxa_atexit \ 16 --enable-clocale=gnu \ 17 --enable-languages=c,c++ \ 18 --disable-multilib \ 19 --disable-bootstrap \ 20 --disable-install-libiberty \ 21 --with-system-zlib 22 make 23 ulimit -s 32768 24 make -k check 25 make install 26 ln -sv ../usr/bin/cpp /lib 27 ln -sv gcc /usr/bin/cc
28 cd ..
29 rm -rf gcc-build gcc-4.8.1
现在对工具链进行第二次检查,确保器正常工作:
1 echo 'main(){}' > dummy.c 2 cc dummy.c -v -Wl,--verbose &> dummy.log 3 readelf -l a.out | grep interpreter 4 如果一切正常,应该输出: 5 [Requesting program interpreter: /lib/ld-linux.so.2] 6 7 确保设置为使用正确的起始文件: 8 grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log 9 如果正常,输出 10 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../crt1.o succeeded 11 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../crti.o succeeded 12 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../crtn.o succeeded 13 14 检查一下编译器是否寻找正确的头文件: 15 grep -B4 '^ /usr/include' dummy.log 16 如果成功,输出 17 #include <...> search starts here: 18 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/include 19 /usr/local/include 20 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/include-fixed 21 /usr/include 22 23 下一步检查新的链接器使用正确的搜索路径: 24 grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g' 25 如果正常,输出 26 SEARCH_DIR("/usr/i686-pc-linux-gnu/lib") 27 SEARCH_DIR("/usr/local/lib") 28 SEARCH_DIR("/lib") 29 SEARCH_DIR("/usr/lib"); 30 31 下一步确认我们使用的是正确的 libc: 32 grep "/lib.*/libc.so.6 " dummy.log 33 如果正确,输出 34 attempt to open /lib/libc.so.6 succeeded 35 36 最后,确保 GCC 使用正确的动态链接器: 37 grep found dummy.log 38 如果正确,输出 39 found ld-linux.so.2 at /lib/ld-linux.so.2 40 41 如果所有输出都符合要求,则可以继续,否则应该检查。 42 rm -v dummy.c a.out dummy.log 43 44 最后,移动一个位置不正确的文件: 45 mkdir -pv /usr/share/gdb/auto-load/usr/lib 46 mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
接下来就是安装各种软件:
Sed-4.2.2
1 tar xvf sed-4.2.2.tar.bz2 2 cd sed-4.2.2 3 ./configure --prefix=/usr --bindir=/bin \ 4 --htmldir=/usr/share/doc/sed-4.2.2 5 make 6 make html 7 make check 8 make install 9 make -C doc install-html 10 cd .. 11 rm -rf sed-4.2.2
Bzip2-1.0.6
1 tar xvf bzip2-1.0.6.tar.gz 2 cd bzip2-1.0.6 3 patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch 4 sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile 5 sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile 6 make -f Makefile-libbz2_so 7 make clean 8 make 9 make PREFIX=/usr install 10 cp -v bzip2-shared /bin/bzip2 11 cp -av libbz2.so* /lib 12 ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so 13 rm -v /usr/bin/{bunzip2,bzcat,bzip2} 14 ln -sv bzip2 /bin/bunzip2 15 ln -sv bzip2 /bin/bzcat 16 cd .. 17 rm -rf bzip2-1.0.6
Pkg-config-0.28
1 tar xvf pkg-config-0.28.tar.gz 2 cd pkg-config-0.28 3 ./configure --prefix=/usr \ 4 --with-internal-glib \ 5 --disable-host-tool \ 6 --docdir=/usr/share/doc/pkg-config-0.28 7 make 8 make check 9 make install 10 cd .. 11 rm -rf pkg-config-0.28
Ncurses-5.9
1 tar xvf ncurses-5.9.tar.gz 2 cd ncurses-5.9 3 ./configure --prefix=/usr \ 4 --mandir=/usr/share/man \ 5 --with-shared \ 6 --without-debug \ 7 --enable-pc-files \ 8 --enable-widec 9 make 10 make install 11 mv -v /usr/lib/libncursesw.so.5* /lib 12 ln -sfv ../../lib/libncursesw.so.5 /usr/lib/libncursesw.so 13 14 for lib in ncurses form panel menu ; do 15 rm -vf /usr/lib/lib${lib}.so 16 echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so 17 ln -sfv lib${lib}w.a /usr/lib/lib${lib}.a 18 ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc 19 done 20 ln -sfv libncurses++w.a /usr/lib/libncurses++.a 21 22 rm -vf /usr/lib/libcursesw.so 23 echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so 24 ln -sfv libncurses.so /usr/lib/libcurses.so 25 ln -sfv libncursesw.a /usr/lib/libcursesw.a 26 ln -sfv libncurses.a /usr/lib/libcurses.a 27 28 mkdir -v /usr/share/doc/ncurses-5.9 29 cp -v -R doc/* /usr/share/doc/ncurses-5.9 30 31 make distclean 32 ./configure --prefix=/usr \ 33 --with-shared \ 34 --without-normal \ 35 --without-debug \ 36 --without-cxx-binding 37 make sources libs 38 cp -av lib/lib*.so.5* /usr/lib 39 cd .. 40 rm -rf ncurses-5.9
Shadow-4.1.5.1
1 tar xvf shadow-4.1.5.1.tar.bz2 2 cd shadow-4.1.5.1 3 sed -i 's/groups$(EXEEXT) //' src/Makefile.in 4 find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; 5 sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \ 6 -e 's@/var/spool/mail@/var/mail@' etc/login.defs 7 ./configure --sysconfdir=/etc 8 make 9 make install 10 mv -v /usr/bin/passwd /bin 11 passwd root
12 cd ..
13 rm -rf shadow-4.1.5.1
Util-linux-2.23.2
1 tar xvf util-linux-2.23.2.tar.xz 2 cd util-linux-2.23.2 3 sed -i -e 's@etc/adjtime@var/lib/hwclock/adjtime@g' \ 4 $(grep -rl '/etc/adjtime' .) 5 mkdir -pv /var/lib/hwclock 6 ./configure --disable-su --disable-sulogin --disable-login 7 make 8 make install 9 cd .. 10 rm -rf util-linux-2.23.2
Psmisc-22.20
1 tar xvf psmisc-22.20.tar.gz 2 cd psmisc-22.20 3 ./configure --prefix=/usr 4 make 5 make install 6 mv -v /usr/bin/fuser /bin 7 mv -v /usr/bin/killall /bin 8 cd .. 9 rm -rf psmisc-22.20
Procps-ng-3.3.8
1 tar xvf procps-ng-3.3.8.tar.xz 2 cd procps-ng-3.3.8 3 ./configure --prefix=/usr \ 4 --exec-prefix= \ 5 --libdir=/usr/lib \ 6 --docdir=/usr/share/doc/procps-ng-3.3.8 \ 7 --disable-static \ 8 --disable-skill \ 9 --disable-kill 10 make 11 make install 12 mv -v /usr/lib/libprocps.so.* /lib 13 ln -sfv ../../lib/libprocps.so.1.1.2 /usr/lib/libprocps.so 14 cd .. 15 rm -rf procps-ng-3.3.8
E2fsprogs-1.42.8
1 tar xvf e2fsprogs-1.42.8.tar.gz 2 cd e2fsprogs-1.42.8 3 mkdir -v build 4 cd build 5 ../configure --prefix=/usr \ 6 --with-root-prefix="" \ 7 --enable-elf-shlibs \ 8 --disable-libblkid \ 9 --disable-libuuid \ 10 --disable-uuidd \ 11 --disable-fsck 12 make 13 make check 14 make install 15 make install-libs 16 chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a 17 gunzip -v /usr/share/info/libext2fs.info.gz 18 install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info 19 makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo 20 install -v -m644 doc/com_err.info /usr/share/info 21 install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info 22 cd ../.. 23 rm -rf e2fsprogs-1.42.8 build
Coreutils-8.21
1 tar xvf coreutils-8.21.tar.xz 2 cd coreutils-8.21 3 patch -Np1 -i ../coreutils-8.21-i18n-1.patch 4 FORCE_UNSAFE_CONFIGURE=1 ./configure \ 5 --prefix=/usr \ 6 --libexecdir=/usr/lib \ 7 --enable-no-install-program=kill,uptime 8 make 9 make install 10 mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin 11 mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin 12 mv -v /usr/bin/{rmdir,stty,sync,true,uname,test,[} /bin 13 mv -v /usr/bin/chroot /usr/sbin 14 mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 15 sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8 16 mv -v /usr/bin/{head,sleep,nice} /bin 17 cd .. 18 rm -rf coreutils-8.21
Iana-Etc-2.30
1 tar xvf iana-etc-2.30.tar.bz2 2 cd iana-etc-2.30 3 make 4 make install 5 cd .. 6 rm -rf iana-etc-2.30
M4-1.4.16
1 tar xvf m4-1.4.16.tar.bz2 2 cd m4-1.4.16 3 sed -i -e '/gets is a/d' lib/stdio.in.h 4 ./configure --prefix=/usr 5 make 6 make install 7 cd .. 8 rm -rf m4-1.4.16
Flex-2.5.37
1 tar xvf flex-2.5.37.tar.bz2 2 cd flex-2.5.37 3 sed -i -e '/test-bison/d' tests/Makefile.in 4 ./configure --prefix=/usr \ 5 --docdir=/usr/share/doc/flex-2.5.37 6 make 7 make check 8 make install 9 ln -sv libfl.a /usr/lib/libl.a 10 cat > /usr/bin/lex << "EOF" 11 #!/bin/sh 12 # Begin /usr/bin/lex 13 exec /usr/bin/flex -l "$@" 14 # End /usr/bin/lex 15 EOF 16 chmod -v 755 /usr/bin/lex 17 cd .. 18 rm -rf flex-2.5.37
Bison-3.0
1 tar xvf bison-3.0.tar.xz 2 cd bison-3.0 3 ./configure --prefix=/usr 4 make 5 make check 6 make install 7 cd .. 8 rm -rf bison-3.0
Grep-2.14
1 tar xvf grep-2.14.tar.xz 2 cd grep-2.14 3 ./configure --prefix=/usr --bindir=/bin 4 make 5 make check 6 make install 7 cd .. 8 rm -rf grep-2.14
Readline-6.2
1 tar xvf readline-6.2.tar.gz 2 cd readline-6.2 3 sed -i '/MV.*old/d' Makefile.in 4 sed -i '/{OLDSUFF}/c:' support/shlib-install 5 patch -Np1 -i ../readline-6.2-fixes-1.patch 6 ./configure --prefix=/usr --libdir=/lib 7 make SHLIB_LIBS=-lncurses 8 make install 9 mv -v /lib/lib{readline,history}.a /usr/lib 10 rm -v /lib/lib{readline,history}.so 11 ln -sfv ../../lib/libreadline.so.6 /usr/lib/libreadline.so 12 ln -sfv ../../lib/libhistory.so.6 /usr/lib/libhistory.so 13 mkdir -v /usr/share/doc/readline-6.2 14 install -v -m644 doc/*.{ps,pdf,html,dvi} \ 15 /usr/share/doc/readline-6.2 16 cd .. 17 rm -rf readline-6.2
Bash-4.2
1 tar xvf bash-4.2.tar.gz 2 cd bash-4.2 3 patch -Np1 -i ../bash-4.2-fixes-12.patch 4 ./configure --prefix=/usr \ 5 --bindir=/bin \ 6 --htmldir=/usr/share/doc/bash-4.2 \ 7 --without-bash-malloc \ 8 --with-installed-readline 9 make 10 make install 11 exec /bin/bash --login +h 12 cd .. 13 rm -rf bash-4.2
Bc-1.06.95
1 tar xvf bc-1.06.95.tar.bz2 2 cd bc-1.06.95 3 ./configure --prefix=/usr --with-readline 4 make 5 make install 6 cd .. 7 rm -rf bc-1.06.95
Libtool-2.4.2
1 tar xvf libtool-2.4.2.tar.gz 2 cd libtool-2.4.2 3 ./configure --prefix=/usr 4 make 5 make install 6 cd .. 7 rm -rf libtool-2.4.2
GDBM-1.10
1 tar xvf gdbm-1.10.tar.gz 2 cd gdbm-1.10 3 ./configure --prefix=/usr --enable-libgdbm-compat 4 make 5 make check 6 make install 7 cd .. 8 rm -rf gdbm-1.10
Inetutils-1.9.1
1 tar xvf inetutils-1.9.1.tar.gz 2 cd inetutils-1.9.1 3 sed -i -e '/gets is a/d' lib/stdio.in.h 4 ./configure --prefix=/usr \ 5 --libexecdir=/usr/sbin \ 6 --localstatedir=/var \ 7 --disable-ifconfig \ 8 --disable-logger \ 9 --disable-syslogd \ 10 --disable-whois \ 11 --disable-servers 12 make 13 make check 14 make install 15 mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin 16 cd .. 17 rm -rf inetutils-1.9.1
Perl-5.18.1
1 tar xvf perl-5.18.1.tar.bz2 2 cd perl-5.18.1 3 echo "127.0.0.1 localhost $(hostname)" > /etc/hosts 4 sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|" \ 5 -e "s|INCLUDE\s*= ./zlib-src|INCLUDE = /usr/include|" \ 6 -e "s|LIB\s*= ./zlib-src|LIB = /usr/lib|" \ 7 cpan/Compress-Raw-Zlib/config.in 8 sh Configure -des -Dprefix=/usr \ 9 -Dvendorprefix=/usr \ 10 -Dman1dir=/usr/share/man/man1 \ 11 -Dman3dir=/usr/share/man/man3 \ 12 -Dpager="/usr/bin/less -isR" \ 13 -Duseshrplib 14 make 15 make -k test 16 make install 17 cd .. 18 rm -rf perl-5.18.1
Autoconf-2.69
1 tar xvf autoconf-2.69.tar.xz 2 cd autoconf-2.69 3 ./configure --prefix=/usr 4 make 5 make check 6 make install 7 cd .. 8 rm -rf autoconf-2.69
Automake-1.14
1 tar xvf automake-1.14.tar.xz 2 cd automake-1.14 3 patch -Np1 -i ../automake-1.14-test-1.patch 4 ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.14 5 make 6 make check 7 make install 8 cd .. 9 rm -rf automake-1.14
Diffutils-3.3
1 tar xvf diffutils-3.3.tar.xz 2 cd diffutils-3.3 3 ./configure --prefix=/usr 4 make 5 make check 6 make install 7 cd .. 8 rm -rf diffutils-3.3
Gawk-4.1.0
1 tar xvf gawk-4.1.0.tar.xz 2 cd gawk-4.1.0 3 ./configure --prefix=/usr --libexecdir=/usr/lib 4 make 5 make check 6 make install 7 mkdir -v /usr/share/doc/gawk-4.1.0 8 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.0 9 cd .. 10 rm -rf gawk-4.1.0
Findutils-4.4.2
1 tar xvf findutils-4.4.2.tar.gz 2 cd findutils-4.4.2 3 ./configure --prefix=/usr \ 4 --libexecdir=/usr/lib/findutils \ 5 --localstatedir=/var/lib/locate 6 make 7 make check 8 make install 9 mv -v /usr/bin/find /bin 10 sed -i 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb 11 cd .. 12 rm -rf findutils-4.4.2
Gettext-0.18.3
1 tar xvf gettext-0.18.3.tar.gz 2 cd gettext-0.18.3 3 ./configure --prefix=/usr \ 4 --docdir=/usr/share/doc/gettext-0.18.3 5 make 6 make check 7 make install 8 cd .. 9 rm -rf gettext-0.18.3
Groff-1.22.2
1 tar xvf groff-1.22.2.tar.gz 2 cd groff-1.22.2 3 PAGE=A4 ./configure --prefix=/usr 4 make 5 mkdir -p /usr/share/doc/groff-1.22/pdf 6 make install 7 ln -sv eqn /usr/bin/geqn 8 ln -sv tbl /usr/bin/gtbl 9 cd .. 10 rm -rf groff-1.22.2
Xz-5.0.5
1 tar xvf xz-5.0.5.tar.xz 2 cd xz-5.0.5 3 ./configure --prefix=/usr --libdir=/lib --docdir=/usr/share/doc/xz-5.0.5 4 make 5 make check 6 make pkgconfigdir=/usr/lib/pkgconfig install 7 cd .. 8 rm -rf xz-5.0.5
GRUB-2.00
1 tar xvf grub-2.00.tar.xz 2 cd grub-2.00 3 sed -i -e '/gets is a/d' grub-core/gnulib/stdio.in.h 4 ./configure --prefix=/usr \ 5 --sysconfdir=/etc \ 6 --disable-grub-emu-usb \ 7 --disable-efiemu \ 8 --disable-werror 9 make 10 make install 11 cd .. 12 rm -rf grub-2.00
Less-458
1 tar xvf less-458.tar.gz 2 cd less-458 3 ./configure --prefix=/usr --sysconfdir=/etc 4 make 5 make install 6 cd .. 7 rm -rf less-458
Gzip-1.6
1 tar xvf gzip-1.6.tar.xz 2 cd gzip-1.6 3 ./configure --prefix=/usr --bindir=/bin 4 make 5 make check 6 make install 7 mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin 8 mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin 9 cd .. 10 rm -rf gzip-1.6
IPRoute2-3.10.0
1 tar xvf iproute2-3.10.0.tar.xz 2 cd iproute2-3.10.0 3 sed -i '/^TARGETS/s@arpd@@g' misc/Makefile 4 sed -i /ARPD/d Makefile 5 sed -i 's/arpd.8//' man/man8/Makefile 6 make DESTDIR= 7 make DESTDIR= \ 8 MANDIR=/usr/share/man \ 9 DOCDIR=/usr/share/doc/iproute2-3.10.0 install 10 cd .. 11 rm -rf iproute2-3.10.0
Kbd-1.15.5
1 tar xvf kbd-1.15.5.tar.gz 2 cd kbd-1.15.5 3 sed -i -e '326 s/if/while/' src/loadkeys.analyze.l 4 sed -i 's/\(RESIZECONS_PROGS=\)yes/\1no/g' configure 5 sed -i 's/resizecons.8 //' man/man8/Makefile.in 6 ./configure --prefix=/usr --disable-vlock 7 make 8 make install 9 mkdir -v /usr/share/doc/kbd-1.15.5 10 cp -R -v doc/* /usr/share/doc/kbd-1.15.5 11 cd .. 12 rm -rf kbd-1.15.5
Kmod-14
1 tar xvf kmod-14.tar.xz 2 cd kmod-14 3 ./configure --prefix=/usr \ 4 --bindir=/bin \ 5 --libdir=/lib \ 6 --sysconfdir=/etc \ 7 --disable-manpages \ 8 --with-xz \ 9 --with-zlib 10 make 11 make check 12 make pkgconfigdir=/usr/lib/pkgconfig install 13 for target in depmod insmod modinfo modprobe rmmod; do 14 ln -sv ../bin/kmod /sbin/$target 15 done 16 ln -sv kmod /bin/lsmod 17 cd .. 18 rm -rf kmod-14
Libpipeline-1.2.4
1 tar xvf libpipeline-1.2.4.tar.gz 2 cd libpipeline-1.2.4 3 PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr 4 make 5 make check 6 make install 7 cd .. 8 rm -rf libpipeline-1.2.4
Make-3.82
1 tar xvf make-3.82.tar.bz2 2 cd make-3.82 3 patch -Np1 -i ../make-3.82-upstream_fixes-3.patch 4 ./configure --prefix=/usr 5 make 6 make check 7 make install 8 cd .. 9 rm -rf make-3.82
Man-DB-2.6.5
1 tar xvf man-db-2.6.5.tar.xz 2 cd man-db-2.6.5 3 ./configure --prefix=/usr \ 4 --libexecdir=/usr/lib \ 5 --docdir=/usr/share/doc/man-db-2.6.5 \ 6 --sysconfdir=/etc \ 7 --disable-setuid \ 8 --with-browser=/usr/bin/lynx \ 9 --with-vgrind=/usr/bin/vgrind \ 10 --with-grap=/usr/bin/grap 11 make 12 make check 13 make install 14 cd .. 15 rm -rf man-db-2.6.5
Patch-2.7.1
1 tar xvf patch-2.7.1.tar.xz 2 cd patch-2.7.1 3 ./configure --prefix=/usr 4 make 5 make check 6 make install 7 cd .. 8 rm -rf patch-2.7.1
Sysklogd-1.5
1 tar xvf sysklogd-1.5.tar.gz 2 cd sysklogd-1.5 3 make 4 make BINDIR=/sbin install 5 配置 Sysklogd 6 cat > /etc/syslog.conf << "EOF" 7 # Begin /etc/syslog.conf 8 auth,authpriv.* -/var/log/auth.log 9 *.*;auth,authpriv.none -/var/log/sys.log 10 daemon.* -/var/log/daemon.log 11 kern.* -/var/log/kern.log 12 mail.* -/var/log/mail.log 13 user.* -/var/log/user.log 14 *.emerg * 15 # End /etc/syslog.conf 16 EOF 17 cd .. 18 rm -rf sysklogd-1.5
Sysvinit-2.88dsf
1 tar xvf sysvinit-2.88dsf.tar.bz2 2 cd sysvinit-2.88dsf 3 sed -i 's@Sending processes@& configured via /etc/inittab@g' src/init.c 4 sed -i -e '/utmpdump/d' -e '/mountpoint/d' src/Makefile 5 make -C src 6 make -C src install 7 cd .. 8 rm -rf sysvinit-2.88dsf
Tar-1.26
1 tar xvf tar-1.26.tar.bz2 2 cd tar-1.26 3 patch -Np1 -i ../tar-1.26-manpage-1.patch 4 sed -i -e '/gets is a/d' gnu/stdio.in.h 5 FORCE_UNSAFE_CONFIGURE=1 \ 6 ./configure --prefix=/usr \ 7 --bindir=/bin \ 8 --libexecdir=/usr/sbin 9 make 10 make check 11 make install 12 make -C doc install-html docdir=/usr/share/doc/tar-1.26 13 perl tarman > /usr/share/man/man1/tar.1 14 cd .. 15 rm -rf tar-1.26
Texinfo-5.1
1 tar xvf texinfo-5.1.tar.xz 2 cd texinfo-5.1 3 patch -Np1 -i ../texinfo-5.1-test-1.patch 4 ./configure --prefix=/usr 5 make 6 make check 7 make install 8 make TEXMF=/usr/share/texmf install-tex 9 cd /usr/share/info 10 rm -v dir 11 for f in * 12 do install-info $f dir 2>/dev/null 13 done 14 cd /sources 15 rm -rf texinfo-5.1
Udev-206 (Extracted from systemd-206)
1 tar xvf systemd-206.tar.xz 2 cd systemd-206 3 tar xvf ../udev-lfs-206-1.tar.bz2 4 make -f udev-lfs-206-1/Makefile.lfs 5 make -f udev-lfs-206-1/Makefile.lfs install 6 build/udevadm hwdb --update 7 bash udev-lfs-206-1/init-net-rules.sh 8 cd .. 9 rm -rf systemd-206
Vim-7.4
1 tar xvf vim-7.4.tar.bz2 2 cd vim74 3 echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h 4 ./configure --prefix=/usr --enable-multibyte 5 make 6 make test 7 make install 8 ln -sv vim /usr/bin/vi 9 for L in /usr/share/man/{,*/}man1/vim.1; do 10 ln -sv vim.1 $(dirname $L)/vi.1 11 done 12 ln -sv ../vim/vim74/doc /usr/share/doc/vim-7.4 13 配置vim: 14 cat > /etc/vimrc << "EOF" 15 " Begin /etc/vimrc 16 set nocompatible 17 set backspace=2 18 syntax on 19 if (&term == "iterm") || (&term == "putty") 20 set background=dark 21 endif 22 " End /etc/vimrc 23 EOF 24 cd .. 25 rm -rf vim74
到此,软件基本安装完了。下面就是一些清理工作:
移除软件中的调试符号:
移除之前要确保没有任何二进制正在运行,可以通过logout然后重新进入chroot环境来确保。
1 logout 2 chroot $LFS /tools/bin/env -i \ 3 HOME=/root TERM=$TERM PS1="\$? \u:\w\$ " \ 4 PATH=/bin:/usr/bin:/sbin:/usr/sbin \ 5 /tools/bin/bash --login 6 /tools/bin/find /{,usr/}{bin,lib,sbin} -type f \ 7 -exec /tools/bin/strip --strip-debug '{}' ';'
大量文件会因为格式不支持而报错。这些警告可以安全忽略,这些文件都是脚本而不是二进制.
从现在开始,如果要重新进入 chroot 环境,使用以下修改过的命令:
1 chroot "$LFS" /usr/bin/env -i \ 2 HOME=/root TERM="$TERM" PS1="\$? \u:\w\$ " \ 3 PATH=/bin:/usr/bin:/sbin:/usr/sbin \ 4 /bin/bash --login
原因在于 /tools 中的工具不再需要了。所以 /tools 目录可以移除了。(注意:用于测试的Tcl、Expect 和 DejaGNU
也会被移除)