上一篇我们已经搭建好了临时系统,这一篇我们就开始正式构建我们的最终LFS系统。

首先切换到root,准备虚拟内核文件系统并挂载:

 su -
export LFS=/mnt/lfs
mkdir -pv $LFS/{dev,proc,sys}
mknod -m $LFS/dev/console c
mknod -m $LFS/dev/null c
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=,mode=
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys if [ -h $LFS/dev/shm ]; then
link=$(readlink $LFS/dev/shm)
mkdir -p $LFS/$link
mount -vt tmpfs shm $LFS/$link
unset link
else
mount -vt tmpfs shm $LFS/dev/shm
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环境前必须挂载上面提到的虚拟内核文件系统。

创建目录:

 mkdir -pv /{bin,etc/{opt,sysconfig},home,lib,mnt,opt,run}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m /root
install -dv -m /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{..}
for dir in /usr /usr/local; do
ln -sv share/{man,doc,info} $dir
done
case $(uname -m) in
x86_64) ln -sv lib /lib64 && ln -sv lib /usr/lib64 && ln -sv lib /usr/local/lib64 ;;
esac
mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

创建必要的文件和符号链接:

 ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.} /usr/lib
sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
ln -sv bash /bin/sh

创建mtab文件:

ln -sv /proc/self/mounts /etc/mtab

创建passwd和group文件以便我们可以登录:

 cat > /etc/passwd <<EOF
root:x:::root:/root:/bin/bash
bin:x:::bin:/dev/null:/bin/false
nobody:x:::Unprivileged User:/dev/null:/bin/false
EOF
cat > /etc/group <<EOF
root:x::
bin:x::
sys:x::
kmem:x::
tape:x::
tty:x::
daemon:x::
floppy:x::
disk:x::
lp:x::
dialout:x::
audio:x::
video:x::
utmp:x::
usb:x::
cdrom:x::
mail:x::
nogroup:x::
EOF

重新加载bash,就可以识别我们的用户名了(如果是用脚本自动执行的话,就不要执行下面的这句代码了):

exec /tools/bin/bash --login +h

创建日志文件并给出权限:

touch /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v /var/log/lastlog
chmod -v /var/log/btmp

下面开始编译:

Linux-3.10.10 API Headers

 tar xvf linux-3.10..tar.xz
cd linux-3.10.
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
find dest/include \( -name .install -o -name ..install.cmd \) -delete
cp -rv dest/include/* /usr/include
cd ..
rm -rf linux-3.10.10

Man-pages-3.53

 tar xvf man-pages-3.53.tar.xz
cd man-pages-3.53
make install
cd ..
rm -rf man-pages-3.53

Glibc-2.18

 tar xvf glibc-2.18.tar.xz
cd glibc-2.18
sed -i -e 's/static __m128i/inline &/' sysdeps/x86_64/multiarch/strstr.c
mkdir -v ../glibc-build
cd ../glibc-build
../glibc-2.18/configure \
--prefix=/usr \
--disable-profile \
--enable-kernel=2.6. \
--libexecdir=/usr/lib/glibc
make
make -k check >& | tee glibc-check-log
grep Error glibc-check-log
touch /etc/ld.so.conf
make install
cp -v ../glibc-2.18/sunrpc/rpc/*.h /usr/include/rpc
cp -v ../glibc-2.18/sunrpc/rpcsvc/*.h /usr/include/rpcsvc
cp -v ../glibc-2.18/nis/rpcsvc/*.h /usr/include/rpcsvc mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF- cs_CZ.UTF-8
localedef -i de_DE -f ISO--1 de_DE
localedef -i de_DE@euro -f ISO-- de_DE@euro
localedef -i de_DE -f UTF- de_DE.UTF-8
localedef -i en_GB -f UTF- en_GB.UTF-8
localedef -i en_HK -f ISO-- en_HK
localedef -i en_PH -f ISO-- en_PH
localedef -i en_US -f ISO-- en_US
localedef -i en_US -f UTF- en_US.UTF-8
localedef -i es_MX -f ISO-- es_MX
localedef -i fa_IR -f UTF- fa_IR
localedef -i fr_FR -f ISO-- fr_FR
localedef -i fr_FR@euro -f ISO-- fr_FR@euro
localedef -i fr_FR -f UTF- fr_FR.UTF-8
localedef -i it_IT -f ISO-- it_IT
localedef -i it_IT -f UTF- it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ru_RU -f KOI-R ru_RU.KOI-R
localedef -i ru_RU -f UTF- ru_RU.UTF-8
localedef -i tr_TR -f UTR- tr_TR.UTF-8
localedef -i zh_CN -f GB zh_CN.GB

配置Glibc

 cat > /etc/nsswitch.conf <<EOF
# Begin /etc/nsswitch.conf passwd: files
group: files
shadow: files host: files dns
networks: files protocols: files
services: files
ethers: files
rpc: files # End /etc/nsswitch.conf
EOF

安装时区数据:

 tar -xf ../tzdata2013d.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward pacificnew solar87 solar88 solar89 \
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 iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

创建/etc/localtime文件:

cp -v --remove-destination /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

配置动态加载器:

 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

调整工具链:

 mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
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

下面进行工具链的第一次系列的检查:

 echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep interpreter
正确输出应该是:
[Requesting program interpreter: /lib/ld-linux.so.] 确保设置为使用正确的起始文件:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
如果一切工作正常,就不应改出错,最后一条命令的输出应为:
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/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("/usr/lib")
SEARCH_DIR("/lib"); 确认我们使用的是正确的 libc:
grep "/lib.*/libc.so.6 " dummy.log
如果一切工作正常,就不应改出错,最后一条命令的输出
attempt to open /lib/libc.so. succeeded 最后,确保 GCC 使用正确的动态链接器:
grep found dummy.log
如果一切工作正常,就不应改出错,最后一条命令的输出
found ld-linux.so. at /lib/ld-linux.so. 如果一切都正常,就可以继续往下做了。否则一定要检查到底哪里出错了
rm -v dummy.c a.out dummy.log

Zlib-1.2.8

 tar xvf zlib-1.2..tar.xz
cd zlib-1.2.
./configure --prefix=/usr
make
make check
make install
mv -v /usr/lib/lib.so.* /lib
ln -sfv ../../lib/libz.so.1.2. /usr/lib/libz.so
cd ..
rm -rf zlib-1.2.

File-5.14

 tar xvf file-5.14.tar.gz
cd file-5.14
./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf file-5.14

Binutils-2.23.2

 tar xvf binutils-2.23..tar.bz2
cd binutils-2.23.
expect -c "spawn ls" #输出spawn ls表示正常,可以继续
rm -fv etc/standards.info
sed -i.bak '/^INFO/s/standards.info //' etc/Makefile.in sed -i -e 's/@colophon/@@colophon/' \
-e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo
mkdir -v ../binutils-build
cd ../binutils-build
../binutils-2.23./configure --prefix=/usr --enable-shared
make tooldir=/usr make check
make tooldir=/usr install
cp -v ../binutils-2.23./include/libiberty.h /usr/include
cd ..
rm -rf binutils-2.23. binutils-build

GMP-5.1.2

 tar xvf gmp-5.1..tar.xz
cd gmp-5.1.
./configure --prefix=/usr --enable-cxx
make
make check >& | tee gmp-check-log
awk '/tests passed/{total+=$2} ; END{print total}' gmp-check-log
make install
mkdir -v /usr/share/doc/gmp-5.1.
cp -v doc/{isa_abi_headache,configuration} doc/*.html \
/usr/share/doc/gmp-5.1.2
cd ..
rm -rf gmp-5.1.2

MPFR-3.1.2

 tar xvf mpfr-3.1..tar.xz
cd mpfr-3.1.
./configure --prefix=/usr \
--enable-thread-safe \
--docdir=/usr/share/doc/mpfr-3.1.
make
make check
make install
make html
make install-html
cd ..
rm -rf mpfr-3.1.

MPC-1.0.1

 tar xvf mpc-1.0..tar.gz
cd mpc-1.0.
./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf mpc-1.0.

GCC-4.8.1

 tar xvf gcc-4.8..tar.bz2
cd gcc-4.8.
case `uname -m` in
i?) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in ;;
esac
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
sed -i -e /autogen/d -e /check.sh/d fixincludes/Makefile.in
mv -v libmudflap/testsuite/libmudflap.c++/pass41-frag.cxx{,.disable}
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.8./configure --prefix=/usr \
--libexecdir=/usr/lib \
--enable-shared \
--enable-threads=posix \
--enable-__cxa_atexit \
--enable-clocale=gnu \
--enable-languages=c,c++ \
--disable-multilib \
--disable-bootstrap \
--disable-install-libiberty \
--with-system-zlib
make
ulimit -s
make -k check
make install
ln -sv ../usr/bin/cpp /lib
ln -sv gcc /usr/bin/cc
cd ..
rm -rf gcc-build gcc-4.8.1

现在对工具链进行第二次检查,确保器正常工作:

 echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep interpreter
如果一切正常,应该输出:
[Requesting program interpreter: /lib/ld-linux.so.] 确保设置为使用正确的起始文件:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
如果正常,输出
/usr/lib/gcc/i686-pc-linux-gnu/4.8./../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.8./../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.8./../../../crtn.o succeeded 检查一下编译器是否寻找正确的头文件:
grep -B4 '^ /usr/include' dummy.log
如果成功,输出
#include <...> search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.8./include
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.8./include-fixed
/usr/include 下一步检查新的链接器使用正确的搜索路径:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
如果正常,输出
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib"); 下一步确认我们使用的是正确的 libc:
grep "/lib.*/libc.so.6 " dummy.log
如果正确,输出
attempt to open /lib/libc.so. succeeded 最后,确保 GCC 使用正确的动态链接器:
grep found dummy.log
如果正确,输出
found ld-linux.so. at /lib/ld-linux.so. 如果所有输出都符合要求,则可以继续,否则应该检查。
rm -v dummy.c a.out dummy.log 最后,移动一个位置不正确的文件:
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

接下来就是安装各种软件:

Sed-4.2.2

 tar xvf sed-4.2..tar.bz2
cd sed-4.2.
./configure --prefix=/usr --bindir=/bin \
--htmldir=/usr/share/doc/sed-4.2.
make
make html
make check
make install
make -C doc install-html
cd ..
rm -rf sed-4.2.

Bzip2-1.0.6

 tar xvf bzip2-1.0..tar.gz
cd bzip2-1.0.
patch -Np1 -i ../bzip2-1.0.-install_docs-.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
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.

Pkg-config-0.28

 tar xvf pkg-config-0.28.tar.gz
cd pkg-config-0.28
./configure --prefix=/usr \
--with-internal-glib \
--disable-host-tool \
--docdir=/usr/share/doc/pkg-config-0.28
make
make check
make install
cd ..
rm -rf pkg-config-0.28

Ncurses-5.9

 tar xvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=/usr \
--mandir=/usr/share/man \
--with-shared \
--without-debug \
--enable-pc-files \
--enable-widec
make
make install
mv -v /usr/lib/libncursesw.so.* /lib
ln -sfv ../../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${lib}w.a /usr/lib/lib${lib}.a
ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc
done
ln -sfv libncurses++w.a /usr/lib/libncurses++.a rm -vf /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
ln -sfv libncurses.so /usr/lib/libcurses.so
ln -sfv libncursesw.a /usr/lib/libcursesw.a
ln -sfv libncurses.a /usr/lib/libcurses.a mkdir -v /usr/share/doc/ncurses-5.9
cp -v -R doc/* /usr/share/doc/ncurses-5.9 make distclean
./configure --prefix=/usr \
--with-shared \
--without-normal \
--without-debug \
--without-cxx-binding
make sources libs
cp -av lib/lib*.so.5* /usr/lib
cd ..
rm -rf ncurses-5.9

Shadow-4.1.5.1

 tar xvf shadow-4.1.5.1.tar.bz2
cd shadow-4.1.5.1
sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \
-e 's@/var/spool/mail@/var/mail@' etc/login.defs
./configure --sysconfdir=/etc
make
make install
mv -v /usr/bin/passwd /bin
passwd root
cd ..
rm -rf shadow-4.1.5.1

Util-linux-2.23.2

 tar xvf util-linux-2.23..tar.xz
cd util-linux-2.23.
sed -i -e 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
$(grep -rl '/etc/adjtime' .)
mkdir -pv /var/lib/hwclock
./configure --disable-su --disable-sulogin --disable-login
make
make install
cd ..
rm -rf util-linux-2.23.

Psmisc-22.20

 tar xvf psmisc-22.20.tar.gz
cd psmisc-22.20
./configure --prefix=/usr
make
make install
mv -v /usr/bin/fuser /bin
mv -v /usr/bin/killall /bin
cd ..
rm -rf psmisc-22.20

Procps-ng-3.3.8

 tar xvf procps-ng-3.3..tar.xz
cd procps-ng-3.3.
./configure --prefix=/usr \
--exec-prefix= \
--libdir=/usr/lib \
--docdir=/usr/share/doc/procps-ng-3.3. \
--disable-static \
--disable-skill \
--disable-kill
make
make install
mv -v /usr/lib/libprocps.so.* /lib
ln -sfv ../../lib/libprocps.so.1.1. /usr/lib/libprocps.so
cd ..
rm -rf procps-ng-3.3.

E2fsprogs-1.42.8

 tar xvf e2fsprogs-1.42..tar.gz
cd e2fsprogs-1.42.
mkdir -v build
cd build
../configure --prefix=/usr \
--with-root-prefix="" \
--enable-elf-shlibs \
--disable-libblkid \
--disable-libuuid \
--disable-uuidd \
--disable-fsck
make
make check
make install
make install-libs
chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
cd ../..
rm -rf e2fsprogs-1.42. build

Coreutils-8.21

 tar xvf coreutils-8.21.tar.xz
cd coreutils-8.21
patch -Np1 -i ../coreutils-8.21-i18n-.patch
FORCE_UNSAFE_CONFIGURE= ./configure \
--prefix=/usr \
--libexecdir=/usr/lib \
--enable-no-install-program=kill,uptime
make
make install
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
mv -v /usr/bin/{rmdir,stty,sync,true,uname,test,[} /bin
mv -v /usr/bin/chroot /usr/sbin
mv -v /usr/share/man/man1/chroot. /usr/share/man/man8/chroot.
sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8
mv -v /usr/bin/{head,sleep,nice} /bin
cd ..
rm -rf coreutils-8.21

Iana-Etc-2.30

 tar xvf iana-etc-2.30.tar.bz2
cd iana-etc-2.30
make
make install
cd ..
rm -rf iana-etc-2.30

M4-1.4.16

 tar xvf m4-1.4..tar.bz2
cd m4-1.4.
sed -i -e '/gets is a/d' lib/stdio.in.h
./configure --prefix=/usr
make
make install
cd ..
rm -rf m4-1.4.

Flex-2.5.37

 tar xvf flex-2.5..tar.bz2
cd flex-2.5.
sed -i -e '/test-bison/d' tests/Makefile.in
./configure --prefix=/usr \
--docdir=/usr/share/doc/flex-2.5.
make
make check
make install
ln -sv libfl.a /usr/lib/libl.a
cat > /usr/bin/lex << "EOF"
#!/bin/sh
# Begin /usr/bin/lex
exec /usr/bin/flex -l "$@"
# End /usr/bin/lex
EOF
chmod -v /usr/bin/lex
cd ..
rm -rf flex-2.5.

Bison-3.0

 tar xvf bison-3.0.tar.xz
cd bison-3.0
./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf bison-3.0

Grep-2.14

 tar xvf grep-2.14.tar.xz
cd grep-2.14
./configure --prefix=/usr --bindir=/bin
make
make check
make install
cd ..
rm -rf grep-2.14

Readline-6.2

 tar xvf readline-6.2.tar.gz
cd readline-6.2
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
patch -Np1 -i ../readline-6.2-fixes-.patch
./configure --prefix=/usr --libdir=/lib
make SHLIB_LIBS=-lncurses
make install
mv -v /lib/lib{readline,history}.a /usr/lib
rm -v /lib/lib{readline,history}.so
ln -sfv ../../lib/libreadline.so. /usr/lib/libreadline.so
ln -sfv ../../lib/libhistory.so. /usr/lib/libhistory.so
mkdir -v /usr/share/doc/readline-6.2
install -v -m644 doc/*.{ps,pdf,html,dvi} \
/usr/share/doc/readline-6.2
cd ..
rm -rf readline-6.2

Bash-4.2

 tar xvf bash-4.2.tar.gz
cd bash-4.2
patch -Np1 -i ../bash-4.2-fixes-.patch
./configure --prefix=/usr \
--bindir=/bin \
--htmldir=/usr/share/doc/bash-4.2 \
--without-bash-malloc \
--with-installed-readline
make
make install
exec /bin/bash --login +h
cd ..
rm -rf bash-4.2

Bc-1.06.95

 tar xvf bc-1.06..tar.bz2
cd bc-1.06.
./configure --prefix=/usr --with-readline
make
make install
cd ..
rm -rf bc-1.06.

Libtool-2.4.2

 tar xvf libtool-2.4..tar.gz
cd libtool-2.4.
./configure --prefix=/usr
make
make install
cd ..
rm -rf libtool-2.4.

GDBM-1.10

 tar xvf gdbm-1.10.tar.gz
cd gdbm-1.10
./configure --prefix=/usr --enable-libgdbm-compat
make
make check
make install
cd ..
rm -rf gdbm-1.10

Inetutils-1.9.1

 tar xvf inetutils-1.9..tar.gz
cd inetutils-1.9.
sed -i -e '/gets is a/d' lib/stdio.in.h
./configure --prefix=/usr \
--libexecdir=/usr/sbin \
--localstatedir=/var \
--disable-ifconfig \
--disable-logger \
--disable-syslogd \
--disable-whois \
--disable-servers
make
make check
make install
mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin
cd ..
rm -rf inetutils-1.9.

Perl-5.18.1

 tar xvf perl-5.18..tar.bz2
cd perl-5.18.
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|" \
-e "s|INCLUDE\s*= ./zlib-src|INCLUDE = /usr/include|" \
-e "s|LIB\s*= ./zlib-src|LIB = /usr/lib|" \
cpan/Compress-Raw-Zlib/config.in
sh Configure -des -Dprefix=/usr \
-Dvendorprefix=/usr \
-Dman1dir=/usr/share/man/man1 \
-Dman3dir=/usr/share/man/man3 \
-Dpager="/usr/bin/less -isR" \
-Duseshrplib
make
make -k test
make install
cd ..
rm -rf perl-5.18.

Autoconf-2.69

 tar xvf autoconf-2.69.tar.xz
cd autoconf-2.69
./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf autoconf-2.69

Automake-1.14

 tar xvf automake-1.14.tar.xz
cd automake-1.14
patch -Np1 -i ../automake-1.14-test-.patch
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.14
make
make check
make install
cd ..
rm -rf automake-1.14

Diffutils-3.3

 tar xvf diffutils-3.3.tar.xz
cd diffutils-3.3
./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf diffutils-3.3

Gawk-4.1.0

 tar xvf gawk-4.1..tar.xz
cd gawk-4.1.
./configure --prefix=/usr --libexecdir=/usr/lib
make
make check
make install
mkdir -v /usr/share/doc/gawk-4.1.
cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.
cd ..
rm -rf gawk-4.1.

Findutils-4.4.2

 tar xvf findutils-4.4..tar.gz
cd findutils-4.4.
./configure --prefix=/usr \
--libexecdir=/usr/lib/findutils \
--localstatedir=/var/lib/locate
make
make check
make install
mv -v /usr/bin/find /bin
sed -i 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb
cd ..
rm -rf findutils-4.4.

Gettext-0.18.3

 tar xvf gettext-0.18..tar.gz
cd gettext-0.18.
./configure --prefix=/usr \
--docdir=/usr/share/doc/gettext-0.18.
make
make check
make install
cd ..
rm -rf gettext-0.18.

Groff-1.22.2

 tar xvf groff-1.22..tar.gz
cd groff-1.22.
PAGE=A4 ./configure --prefix=/usr
make
mkdir -p /usr/share/doc/groff-1.22/pdf
make install
ln -sv eqn /usr/bin/geqn
ln -sv tbl /usr/bin/gtbl
cd ..
rm -rf groff-1.22.

Xz-5.0.5

 tar xvf xz-5.0..tar.xz
cd xz-5.0.
./configure --prefix=/usr --libdir=/lib --docdir=/usr/share/doc/xz-5.0.
make
make check
make pkgconfigdir=/usr/lib/pkgconfig install
cd ..
rm -rf xz-5.0.

GRUB-2.00

 tar xvf grub-2.00.tar.xz
cd grub-2.00
sed -i -e '/gets is a/d' grub-core/gnulib/stdio.in.h
./configure --prefix=/usr \
--sysconfdir=/etc \
--disable-grub-emu-usb \
--disable-efiemu \
--disable-werror
make
make install
cd ..
rm -rf grub-2.00

Less-458

 tar xvf less-.tar.gz
cd less-
./configure --prefix=/usr --sysconfdir=/etc
make
make install
cd ..
rm -rf less-

Gzip-1.6

 tar xvf gzip-1.6.tar.xz
cd gzip-1.6
./configure --prefix=/usr --bindir=/bin
make
make check
make install
mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin
mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin
cd ..
rm -rf gzip-1.6

IPRoute2-3.10.0

 tar xvf iproute2-3.10..tar.xz
cd iproute2-3.10.
sed -i '/^TARGETS/s@arpd@@g' misc/Makefile
sed -i /ARPD/d Makefile
sed -i 's/arpd.8//' man/man8/Makefile
make DESTDIR=
make DESTDIR= \
MANDIR=/usr/share/man \
DOCDIR=/usr/share/doc/iproute2-3.10. install
cd ..
rm -rf iproute2-3.10.

Kbd-1.15.5

 tar xvf kbd-1.15..tar.gz
cd kbd-1.15.
sed -i -e '326 s/if/while/' src/loadkeys.analyze.l
sed -i 's/\(RESIZECONS_PROGS=\)yes/\1no/g' configure
sed -i 's/resizecons.8 //' man/man8/Makefile.in
./configure --prefix=/usr --disable-vlock
make
make install
mkdir -v /usr/share/doc/kbd-1.15.
cp -R -v doc/* /usr/share/doc/kbd-1.15.5
cd ..
rm -rf kbd-1.15.5

Kmod-14

 tar xvf kmod-.tar.xz
cd kmod-
./configure --prefix=/usr \
--bindir=/bin \
--libdir=/lib \
--sysconfdir=/etc \
--disable-manpages \
--with-xz \
--with-zlib
make
make check
make pkgconfigdir=/usr/lib/pkgconfig install
for target in depmod insmod modinfo modprobe rmmod; do
ln -sv ../bin/kmod /sbin/$target
done
ln -sv kmod /bin/lsmod
cd ..
rm -rf kmod-

Libpipeline-1.2.4

 tar xvf libpipeline-1.2..tar.gz
cd libpipeline-1.2.
PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf libpipeline-1.2.

Make-3.82

 tar xvf make-3.82.tar.bz2
cd make-3.82
patch -Np1 -i ../make-3.82-upstream_fixes-.patch
./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf make-3.82

Man-DB-2.6.5

 tar xvf man-db-2.6..tar.xz
cd man-db-2.6.
./configure --prefix=/usr \
--libexecdir=/usr/lib \
--docdir=/usr/share/doc/man-db-2.6. \
--sysconfdir=/etc \
--disable-setuid \
--with-browser=/usr/bin/lynx \
--with-vgrind=/usr/bin/vgrind \
--with-grap=/usr/bin/grap
make
make check
make install
cd ..
rm -rf man-db-2.6.

Patch-2.7.1

 tar xvf patch-2.7..tar.xz
cd patch-2.7.
./configure --prefix=/usr
make
make check
make install
cd ..
rm -rf patch-2.7.

Sysklogd-1.5

 tar xvf sysklogd-1.5.tar.gz
cd sysklogd-1.5
make
make BINDIR=/sbin install
配置 Sysklogd
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

Sysvinit-2.88dsf

 tar xvf sysvinit-.dsf.tar.bz2
cd sysvinit-.dsf
sed -i 's@Sending processes@& configured via /etc/inittab@g' src/init.c
sed -i -e '/utmpdump/d' -e '/mountpoint/d' src/Makefile
make -C src
make -C src install
cd ..
rm -rf sysvinit-.dsf

Tar-1.26

 tar xvf tar-1.26.tar.bz2
cd tar-1.26
patch -Np1 -i ../tar-1.26-manpage-.patch
sed -i -e '/gets is a/d' gnu/stdio.in.h
FORCE_UNSAFE_CONFIGURE= \
./configure --prefix=/usr \
--bindir=/bin \
--libexecdir=/usr/sbin
make
make check
make install
make -C doc install-html docdir=/usr/share/doc/tar-1.26
perl tarman > /usr/share/man/man1/tar.
cd ..
rm -rf tar-1.26

Texinfo-5.1

 tar xvf texinfo-5.1.tar.xz
cd texinfo-5.1
patch -Np1 -i ../texinfo-5.1-test-.patch
./configure --prefix=/usr
make
make check
make install
make TEXMF=/usr/share/texmf install-tex
cd /usr/share/info
rm -v dir
for f in *
do install-info $f dir >/dev/null
done
cd /sources
rm -rf texinfo-5.1

Udev-206 (Extracted from systemd-206)

 tar xvf systemd-.tar.xz
cd systemd-
tar xvf ../udev-lfs--.tar.bz2
make -f udev-lfs--/Makefile.lfs
make -f udev-lfs--/Makefile.lfs install
build/udevadm hwdb --update
bash udev-lfs--/init-net-rules.sh
cd ..
rm -rf systemd-

Vim-7.4

 tar xvf vim-7.4.tar.bz2
cd vim
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
./configure --prefix=/usr --enable-multibyte
make
make test
make install
ln -sv vim /usr/bin/vi
for L in /usr/share/man/{,*/}man1/vim.; do
ln -sv vim. $(dirname $L)/vi.
done
ln -sv ../vim/vim74/doc /usr/share/doc/vim-7.4
配置vim:
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
set nocompatible
set backspace=
syntax on
if (&term == "iterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
cd ..
rm -rf vim

到此,软件基本安装完了。下面就是一些清理工作:

移除软件中的调试符号:

移除之前要确保没有任何二进制正在运行,可以通过logout然后重新进入chroot环境来确保。

 logout
chroot $LFS /tools/bin/env -i \
HOME=/root TERM=$TERM PS1="\$? \u:\w\$ " \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/tools/bin/bash --login
/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
-exec /tools/bin/strip --strip-debug '{}' ';'

大量文件会因为格式不支持而报错。这些警告可以安全忽略,这些文件都是脚本而不是二进制.
从现在开始,如果要重新进入 chroot 环境,使用以下修改过的命令:

 chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" PS1="\$? \u:\w\$ " \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login

原因在于 /tools 中的工具不再需要了。所以 /tools 目录可以移除了。(注意:用于测试的Tcl、Expect 和 DejaGNU
也会被移除)

最新文章

  1. Core Animation - 核心动画
  2. (ios实战)单个ViewControl适配不同ios版本xib文件实现
  3. zend studio 10 字体,颜色,快捷键等相关设置
  4. zabbix短信网关调用问题总结
  5. PC端QQ协议解析之0825
  6. java从文件中读取json
  7. 二.LinkedList原理及实现学习总结
  8. Linux下通过受限bash创建指定权限的账号
  9. 新建asp.net core项目
  10. MySQL数据类型--与MySQL零距离接触2-14MySQL默认约束
  11. Autofac和nopcommerce中的Autofac, 还有反射
  12. 【Alpha】第九次Scrum meeting
  13. apache2.2 虚拟主机配置(转)
  14. 【mNOIP模拟赛Day 1】 T2 数颜色
  15. 牛顿迭代法(Newton's Method)
  16. What?
  17. 单点登录(八)-----遇到问题-----Application Not Authorized to Use CAS
  18. 读取数据库中timestamp类型去掉毫秒
  19. 正则表达式-Regular expression学习笔记
  20. python识别一段由字母组成的字符串是拼音还是英文单词

热门文章

  1. Windows下Cygwin中使用NCView
  2. 安卓 开发 The connection to adb is down, and a severe error has occured.
  3. 二叉树单色路径最长&amp;&amp;穿珠子
  4. 《Java数据结构与算法》笔记-CH4-4循环队列
  5. 事件委托(event delegation)
  6. 【多线程】JAVA多线程和并发基础面试问答(转载)
  7. ControlsFX8.0.2中对话框无法判断是否显示的修改
  8. rdlc 分页操作
  9. postconf 命令常用参数
  10. DbHelperSQL和Dapper数据访问的性能对比