自動化構建LFS系統

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
春節在家製作多一次LFS,上次製作是一年前,也是寒假時分。
由於上手過,所以這次打算將“製作LFS系統的整個過程”寫成bash腳本,以便以後快速構建系統。

LFS官網有個“自動化構建LFS系統”的項目,叫ALFS。其中官方推薦的ALFS程序有nALFS和jhalfs。
jhalfs的下載網址:
http://www.linuxfromscratch.org/alfs/downloads/jhalfs/stable/

暫時不用官網的jhalfs
Power By Myself
以後再研究jhalfs的代碼也不遲,反正和GNU自由軟體的緣分還長著呢,業餘愛好 :)

自製的ALFS程序集(以下的README文件為使用說明):


--------------------------------------------------------------------
[build-lfs目錄結構]
--------------------------------------------------------------------
.
|-- README
|-- book-2010-02-24
|-- source
|   |-- get-source.sh
|   `-- url
`-- utils
    |-- build-lfs-pass-0-chroot.sh
    |-- build-lfs-pass-1.sh
    |-- build-lfs-pass-2-main.sh
    |-- build-lfs-pass-3-main.sh
    |-- build-lfs-pass-4-chroot.sh
    |-- build-lfs-pass-5.sh
    |-- build-lfs-pass-6-chroot.sh
    |-- build-lfs-pass-7.sh
    |-- build-lfs-pass-8-kernel.sh
    |-- build-lfs-pass-9.sh
    |-- build-temporary-system.sh
    |-- lfs.conf
    |-- lfs.lib
    |-- prepare-0.sh
    |-- prepare-1.sh
    `-- version-check.sh

2 directories, 20 files

--------------------------------------------------------------------
[./source/url]
--------------------------------------------------------------------
http://ftp.gnu.org/gnu/autoconf/autoconf-2.61.tar.bz2
http://ftp.gnu.org/gnu/automake/automake-1.10.tar.bz2
http://ftp.gnu.org/gnu/bash/bash-3.2.tar.gz
http://ftp.gnu.org/gnu/bash/bash-doc-3.2.tar.gz
http://download-east.oracle.com/berkeley-db/db-4.5.20.tar.gz
http://ftp.gnu.org/gnu/binutils/binutils-2.17.tar.bz2
http://ftp.gnu.org/gnu/bison/bison-2.3.tar.bz2
http://www.bzip.org/1.0.4/bzip2-1.0.4.tar.gz
http://ftp.gnu.org/gnu/coreutils/coreutils-6.9.tar.bz2
http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.4.4.tar.gz
http://ftp.gnu.org/gnu/diffutils/diffutils-2.8.1.tar.gz
http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.40.2.tar.gz
http://expect.nist.gov/src/expect-5.43.0.tar.gz
http://ftp.lfs-matrix.net/pub/lfs/conglomeration/file/file-4.21.tar.gz
http://ftp.gnu.org/gnu/findutils/findutils-4.2.31.tar.gz
http://prdownloads.sourceforge.net/flex/flex-2.5.33.tar.bz2
http://ftp.gnu.org/gnu/gawk/gawk-3.1.5.tar.bz2
http://ftp.gnu.org/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2
http://ftp.gnu.org/gnu/gettext/gettext-0.16.1.tar.gz
http://ftp.gnu.org/gnu/glibc/glibc-2.5.1.tar.bz2
http://ftp.gnu.org/gnu/glibc/glibc-libidn-2.5.1.tar.gz
http://ftp.gnu.org/gnu/grep/grep-2.5.1a.tar.bz2
http://ftp.gnu.org/gnu/groff/groff-1.18.1.4.tar.gz
ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz
http://ftp.gnu.org/gnu/gzip/gzip-1.3.12.tar.gz
http://www.sethwklein.net/projects/iana-etc/downloads/iana-etc-2.20.tar.bz2
http://ftp.gnu.org/gnu/inetutils/inetutils-1.5.tar.gz
http://developer.osdl.org/dev/iproute2/download/iproute2-2.6.20-070313.tar.gz
http://www.kernel.org/pub/linux/utils/kbd/kbd-1.12.tar.bz2
http://www.greenwoodsoftware.com/less/less-406.tar.gz
http://www.linuxfromscratch.org/lfs/downloads/6.3/lfs-bootscripts-6.3.tar.bz2
http://ftp.gnu.org/gnu/libtool/libtool-1.5.24.tar.gz
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.5.tar.bz2
http://ftp.gnu.org/gnu/m4/m4-1.4.10.tar.bz2
http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2
http://savannah.nongnu.org/download/man-db/man-db-2.4.4.tar.gz
http://www.kernel.org/pub/linux/docs/manpages/Archive/man-pages-2.63.tar.bz2
http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/6.3/mktemp-1.5.tar.gz
http://www.kerneltools.org/pub/downloads/module-init-tools/module-init-tools-3.2.2.tar.bz2
http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/6.3/ncurses-5.6.tar.gz
http://ftp.gnu.org/gnu/patch/patch-2.5.4.tar.gz
http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/6.3/perl-5.8.8.tar.bz2
http://procps.sourceforge.net/procps-3.2.7.tar.gz
http://prdownloads.sourceforge.net/psmisc/psmisc-22.5.tar.gz
http://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz
http://ftp.gnu.org/gnu/sed/sed-4.1.5.tar.gz
http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/6.3/shadow-4.0.18.1.tar.bz2
http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.4.1.tar.gz
ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz
http://ftp.gnu.org/gnu/tar/tar-1.18.tar.bz2
http://prdownloads.sourceforge.net/tcl/tcl8.4.15-src.tar.gz
http://ftp.gnu.org/gnu/texinfo/texinfo-4.9.tar.bz2
http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-113.tar.bz2
http://www.linuxfromscratch.org/lfs/downloads/6.3/udev-config-6.3.tar.bz2
http://www.kernel.org/pub/linux/utils/util-linux/util-linux-2.12r.tar.bz2
ftp://ftp.vim.org/pub/vim/unix/vim-7.1.tar.bz2
ftp://ftp.vim.org/pub/vim/extra/vim-7.1-lang.tar.gz
http://www.zlib.net/zlib-1.2.3.tar.gz
http://www.linuxfromscratch.org/patches/lfs/6.3/bash-3.2-fixes-5.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/bzip2-1.0.4-install_docs-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/coreutils-6.9-i18n-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/coreutils-6.9-suppress_uptime_kill_su-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/coreutils-6.9-uname-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/db-4.5.20-fixes-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/diffutils-2.8.1-i18n-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/expect-5.43.0-spawn-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/gawk-3.1.5-segfault_fix-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/gcc-4.1.2-specs-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/grep-2.5.1a-redhat_fixes-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/groff-1.18.1.4-debian_fixes-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/grub-0.97-disk_geometry-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/inetutils-1.5-no_server_man_pages-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/kbd-1.12-backspace-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/kbd-1.12-gcc4_fixes-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/man-db-2.4.4-fixes-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/mktemp-1.5-add_tempfile-3.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/module-init-tools-3.2.2-modprobe-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/ncurses-5.6-coverity_fixes-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/perl-5.8.8-libc-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/readline-5.2-fixes-3.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/shadow-4.0.18.1-useradd_fix-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/sysklogd-1.4.1-8bit-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/sysklogd-1.4.1-fixes-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/texinfo-4.9-multibyte-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/texinfo-4.9-tempfile_fix-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/util-linux-2.12r-cramfs-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/util-linux-2.12r-lseek-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/vim-7.1-fixes-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.3/vim-7.1-mandir-1.patch

--------------------------------------------------------------------
[./source/get-source.sh]
--------------------------------------------------------------------
#! /bin/sh

#change
URL=http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/6.3/

wget -c ${URL}/MD5SUMS

echo "************"
echo "缺失的文件列表:"
for name in `cat url`
do
    file_name=`basename $name`
    if [ ! -e $file_name ] ; then
    echo $file_name
    wget -c $URL/$file_name
    fi
done
echo "************"

--------------------------------------------------------------------
[./README]
--------------------------------------------------------------------
--- utils文件夾

[1]. 測試宿主機的軟體版本
version-check.sh

[2]. 製作LFS臨時系統
prepare-0.sh
prepare-1.sh
build-temporary-system.sh

[3]. 製作目標LFS系統
build-lfs-pass-0-chroot.sh
build-lfs-pass-1.sh
build-lfs-pass-2-main.sh
build-lfs-pass-3-main.sh
build-lfs-pass-4-chroot.sh
build-lfs-pass-5.sh
build-lfs-pass-6-chroot.sh
build-lfs-pass-7.sh
build-lfs-pass-8-kernel.sh
build-lfs-pass-9.sh

[4]. 配置文件與函數庫
lfs.conf
lfs.lib

LFS的製作過程為[2] -> [3],按以上列出的順序運行腳本

--- source文件夾

[1]. 製作LFS所需要的所有源代碼包
url
注: 使用方法"運行以下命令"
$ wget -c -i url

[2]. url有的文件無法下載時,運行以下腳本獲得缺失文件
get-source.sh

--- 附加說明

本版本程序集,使用對象為LFS6.3
測試平台為Debian5.0.2
LFS6.3電子書下載網址:
http://www.linuxfromscratch.org/lfs/downloads/6.3/LFS-BOOK-6.3-HTML.tar.bz2

--------------------------------------------------------------------
[./utils/build-temporary-system.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.conf
source lfs.lib

check_lfs

build_binutils()
{
    #檢測
    cd $LFS/sources

    check_file binutils-2.17.tar.bz2
    check_dir binutils-2.17
    check_dir binutils-build

    #解壓
    tar jxvf binutils-2.17.tar.bz2
    cd binutils-2.17

    before_date=`date -R`

    #編譯
    mkdir -v ../binutils-build
    cd ../binutils-build
    CC="gcc -B/usr/bin/" ../binutils-2.17/configure \
    --prefix=/tools --disable-nls --disable-werror
    make || eval "echo \"error: make error in binutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    make -C ld clean
    make -C ld LIB_PATH=/tools/lib
    cp -v ld/ld-new /tools/bin

    #清理
    cd $LFS/sources/
    rm -f -R binutils-2.17
    rm -f -R binutils-build
}

build_gcc()
{
    #檢測
    cd $LFS/sources

    check_file gcc-4.1.2.tar.bz2
    check_dir gcc-4.1.2
    check_dir gcc-build

    #解壓
    tar jxvf gcc-4.1.2.tar.bz2
    cd gcc-4.1.2

    before_date=`date -R`

    #編譯
    mkdir -v ../gcc-build
    cd ../gcc-build
    CC="gcc -B/usr/bin/" ../gcc-4.1.2/configure --prefix=/tools \
    --with-local-prefix=/tools --disable-nls --enable-shared \
    --enable-languages=c
    make bootstrap || eval "echo \"error: make error in gcc\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R gcc-4.1.2
    rm -f -R gcc-build

    #特殊
    ln -vs gcc /tools/bin/cc
}

build_linux_api_headers()
{
    #檢測
    cd $LFS/sources

    check_file linux-2.6.22.5.tar.bz2
    check_dir linux-2.6.22.5

    #解壓
    tar jxvf linux-2.6.22.5.tar.bz2
    cd linux-2.6.22.5

    before_date=`date -R`

    #編譯
    make mrproper
    make headers_check
    make INSTALL_HDR_PATH=dest headers_install
    cp -rv dest/include/* /tools/include

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R linux-2.6.22.5
}

build_glibc()
{
    #檢測
    cd $LFS/sources

    check_file glibc-2.5.1.tar.bz2
    check_dir glibc-2.5.1
    check_dir glibc-build

    #解壓
    tar jxvf glibc-2.5.1.tar.bz2
    cd glibc-2.5.1

    before_date=`date -R`

    #編譯
    mkdir -v ../glibc-build
    cd ../glibc-build

    ../glibc-2.5.1/configure --prefix=/tools \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.0 --with-binutils=/tools/bin \
    --without-gd --with-headers=/tools/include \
    --without-selinux
    make || eval "echo \"error: make error in glibc\" && exit 1"
    mkdir -pv /tools/etc
    touch /tools/etc/ld.so.conf
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R glibc-2.5.1
    rm -f -R glibc-build
}

adjust_toolchain()
{
    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 -dumpspecs | sed 's@^/lib/ld-linux.so.2@/tools&@g' \
    > `dirname $(gcc -print-libgcc-file-name)`/specs

    GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &&
    find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
    rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &&
    unset GCC_INCLUDEDIR

    echo 'main(){}' > dummy.c
    cc dummy.c
    readelf -l a.out | grep ': /tools'
    #read input
    rm -v dummy.c a.out
}

build_tcl()
{
    #檢測
    cd $LFS/sources

    check_file tcl8.4.15-src.tar.gz
    check_dir tcl8.4.15

    #解壓
    tar zxvf tcl8.4.15-src.tar.gz
    cd tcl8.4.15

    before_date=`date -R`

    #編譯
    cd unix
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in tcl\" && exit 1"
    make install && make install-private-headers

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    ln -sv tclsh8.4 /tools/bin/tclsh

    #清理
    cd $LFS/sources/
    rm -f -R tcl8.4.15
}

build_expect()
{
    #檢測
    cd $LFS/sources

    check_file expect-5.43.0.tar.gz
    check_file expect-5.43.0-spawn-1.patch
    check_dir expect-5.43

    #解壓
    tar zxvf expect-5.43.0.tar.gz
    cd expect-5.43

    #特殊
    patch -Np1 -i ../expect-5.43.0-spawn-1.patch
    cp configure{,.bak}
    sed 's:/usr/local/bin:/bin:' configure.bak > configure

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools --with-tcl=/tools/lib \
    --with-tclinclude=/tools/include --with-x=no
    make || eval "echo \"error: make error in expect\" && exit 1"
    make scriptS="" install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R expect-5.43
}

build_dejagnu()
{
    #檢測
    cd $LFS/sources

    check_file dejagnu-1.4.4.tar.gz
    check_dir dejagnu-1.4.4

    #解壓
    tar zxvf dejagnu-1.4.4.tar.gz
    cd dejagnu-1.4.4

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools && \
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R dejagnu-1.4.4
}

build_gcc_pass2()
{
    #測試
    expect -c "spawn ls"
    #read input

    #檢測
    cd $LFS/sources

    check_file gcc-4.1.2.tar.bz2
    check_file gcc-4.1.2-specs-1.patch
    check_dir gcc-4.1.2
    check_dir gcc-build

    #解壓
    tar jxvf gcc-4.1.2.tar.bz2
    cd gcc-4.1.2

    #特殊
    cp -v gcc/Makefile.in{,.orig}
    sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
    cp -v gcc/Makefile.in{,.tmp}
    sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
    > gcc/Makefile.in
    patch -Np1 -i ../gcc-4.1.2-specs-1.patch

    before_date=`date -R`

    #編譯
    mkdir -v ../gcc-build
    cd ../gcc-build
    ../gcc-4.1.2/configure --prefix=/tools \
    --with-local-prefix=/tools --enable-clocale=gnu \
    --enable-shared --enable-threads=posix \
    --enable-__cxa_atexit --enable-languages=c,c++ \
    --disable-libstdcxx-pch
    make || eval "echo \"error: make error in gcc pass2\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R gcc-4.1.2
    rm -f -R gcc-build

    #測試
    echo 'main(){}' > dummy.c
    cc dummy.c
    readelf -l a.out | grep ': /tools'
    #read input
    rm -v dummy.c a.out
}

build_binutils_pass2()
{
    #檢測
    cd $LFS/sources

    check_file binutils-2.17.tar.bz2
    check_dir binutils-2.17
    check_dir binutils-build

    #解壓
    tar jxvf binutils-2.17.tar.bz2
    cd binutils-2.17

    before_date=`date -R`

    #編譯
    mkdir -v ../binutils-build
    cd ../binutils-build
    ../binutils-2.17/configure --prefix=/tools \
    --disable-nls --with-lib-path=/tools/lib
    make || eval "echo \"error: make error in binutils pass2\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    make -C ld clean
    make -C ld LIB_PATH=/usr/lib:/lib
    cp -v ld/ld-new /tools/bin

    #清理
    cd $LFS/sources/
    rm -f -R binutils-2.17
    rm -f -R binutils-build
}

build_ncurses()
{
    #檢測
    cd $LFS/sources

    check_file ncurses-5.6.tar.gz
    check_dir ncurses-5.6

    #解壓
    tar zxvf ncurses-5.6.tar.gz
    cd ncurses-5.6

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools --with-shared \
    --without-debug --without-ada --enable-overwrite
    make || eval "echo \"error: make error in ncurses\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R ncurses-5.6
}

build_bash()
{
    #檢測
    cd $LFS/sources

    check_file bash-3.2.tar.gz
    check_file bash-3.2-fixes-5.patch
    check_dir bash-3.2

    #解壓
    tar zxvf bash-3.2.tar.gz
    cd bash-3.2

    #打補丁
    patch -Np1 -i ../bash-3.2-fixes-5.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools --without-bash-malloc
    make || eval "echo \"error: make error in bash\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    ln -vs bash /tools/bin/sh

    #清理
    cd $LFS/sources/
    rm -f -R bash-3.2
}

build_bzip2()
{
    #檢測
    cd $LFS/sources

    check_file bzip2-1.0.4.tar.gz
    check_dir bzip2-1.0.4

    #解壓
    tar zxvf bzip2-1.0.4.tar.gz
    cd bzip2-1.0.4

    before_date=`date -R`

    #編譯
    make || eval "echo \"error: make error in bzip2\" && exit 1"
    make PREFIX=/tools install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R bzip2-1.0.4
}

build_coreutils()
{
    #檢測
    cd $LFS/sources

    check_file coreutils-6.9.tar.bz2
    check_dir coreutils-6.9

    #解壓
    tar jxvf coreutils-6.9.tar.bz2
    cd coreutils-6.9

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in coreutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    cp -v src/su /tools/bin/su-tools

    #清理
    cd $LFS/sources/
    rm -f -R coreutils-6.9
}

build_diffutils()
{
    #檢測
    cd $LFS/sources

    check_file diffutils-2.8.1.tar.gz
    check_dir diffutils-2.8.1

    #解壓
    tar zxvf diffutils-2.8.1.tar.gz
    cd diffutils-2.8.1

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in diffutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R diffutils-2.8.1
}

build_findutils()
{
    #檢測
    cd $LFS/sources

    check_file findutils-4.2.31.tar.gz
    check_dir findutils-4.2.31

    #解壓
    tar zxvf findutils-4.2.31.tar.gz
    cd findutils-4.2.31

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in findutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R findutils-4.2.31
}

build_gawk()
{
    #檢測
    cd $LFS/sources

    check_file gawk-3.1.5.tar.bz2
    check_dir gawk-3.1.5

    #解壓
    tar jxvf gawk-3.1.5.tar.bz2
    cd gawk-3.1.5

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    cat >> config.h << "EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF
    make || eval "echo \"error: make error in gawk\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R gawk-3.1.5
}

build_gettext()
{
    #檢測
    cd $LFS/sources

    check_file gettext-0.16.1.tar.gz
    check_dir gettext-0.16.1

    #解壓
    tar zxvf gettext-0.16.1.tar.gz
    cd gettext-0.16.1

    before_date=`date -R`

    #編譯
    cd gettext-tools
    ./configure --prefix=/tools --disable-shared
    make -C gnulib-lib
    make -C src msgfmt
    cp -v src/msgfmt /tools/bin

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R gettext-0.16.1
}

build_grep()
{
    #檢測
    cd $LFS/sources

    check_file grep-2.5.1a.tar.bz2
    check_dir grep-2.5.1a

    #解壓
    tar jxvf grep-2.5.1a.tar.bz2
    cd grep-2.5.1a

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools \
    --disable-perl-regexp
    make || eval "echo \"error: make error in grep\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R grep-2.5.1a
}

build_gzip()
{
    #檢測
    cd $LFS/sources

    check_file gzip-1.3.12.tar.gz
    check_dir gzip-1.3.12

    #解壓
    tar zxvf gzip-1.3.12.tar.gz
    cd gzip-1.3.12

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in gzip\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R gzip-1.3.12
}

build_make()
{
    #檢測
    cd $LFS/sources

    check_file make-3.81.tar.bz2
    check_dir make-3.81

    #解壓
    tar jxvf make-3.81.tar.bz2
    cd make-3.81

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in make\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R make-3.81
}

build_patch()
{
    #檢測
    cd $LFS/sources

    check_file patch-2.5.4.tar.gz
    check_dir patch-2.5.4

    #解壓
    tar zxvf patch-2.5.4.tar.gz
    cd patch-2.5.4

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in patch\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R patch-2.5.4
}

build_perl()
{
    #檢測
    cd $LFS/sources

    check_file perl-5.8.8.tar.bz2
    check_file perl-5.8.8-libc-2.patch
    check_dir perl-5.8.8

    #解壓
    tar jxvf perl-5.8.8.tar.bz2
    cd perl-5.8.8

    #打補丁
    patch -Np1 -i ../perl-5.8.8-libc-2.patch

    before_date=`date -R`

    #編譯
    ./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
    make perl utilities || eval "echo \"error: make error in perl\" && exit 1"
    cp -v perl pod/pod2man /tools/bin
    mkdir -pv /tools/lib/perl5/5.8.8
    cp -Rv lib/* /tools/lib/perl5/5.8.8

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R perl-5.8.8
}

build_sed()
{
    #檢測
    cd $LFS/sources

    check_file sed-4.1.5.tar.gz
    check_dir sed-4.1.5

    #解壓
    tar zxvf sed-4.1.5.tar.gz
    cd sed-4.1.5

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in sed\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R sed-4.1.5
}

build_tar()
{
    #檢測
    cd $LFS/sources

    check_file tar-1.18.tar.bz2
    check_dir tar-1.18

    #解壓
    tar jxvf tar-1.18.tar.bz2
    cd tar-1.18

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in tar\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R tar-1.18
}

build_texinfo()
{
    #檢測
    cd $LFS/sources

    check_file texinfo-4.9.tar.bz2
    check_dir texinfo-4.9

    #解壓
    tar jxvf texinfo-4.9.tar.bz2
    cd texinfo-4.9

    before_date=`date -R`

    #編譯
    ./configure --prefix=/tools
    make || eval "echo \"error: make error in texinfo\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R texinfo-4.9
}

build_util_linux()
{
    #檢測
    cd $LFS/sources

    check_file util-linux-2.12r.tar.bz2
    check_dir util-linux-2.12r

    #解壓
    tar jxvf util-linux-2.12r.tar.bz2
    cd util-linux-2.12r

    #特殊
    sed -i 's@/usr/include@/tools/include@g' configure

    before_date=`date -R`

    #編譯
    ./configure
    make -C lib
    make -C mount mount umount
    make -C text-utils more
    cp -v mount/{,u}mount text-utils/more /tools/bin

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd $LFS/sources/
    rm -f -R util-linux-2.12r
}

stripping()
{
    strip --strip-debug /tools/lib/*
    strip --strip-unneeded /tools/{,s}bin/*
    rm -rf /tools/{info,man}
}

logout_comment()
{
    echo "****************"
    echo "now exit from user lfs and type commonds below"
    echo
    echo "$ exit"
    echo
    echo "# export LFS=$LFS"
    echo "# chown -R root:root \$LFS/tools"
    echo
    echo "you can backup $LFS/tools for reuse"
    echo "****************"
}

if [ ! -e $LFS/sources ] ; then
    echo "error: $LFS/sources don't exist"
    exit 1
fi

before_date_sum=`date -R`

build_binutils
build_gcc
build_linux_api_headers
build_glibc
adjust_toolchain
build_tcl
build_expect
build_dejagnu
build_gcc_pass2
build_binutils_pass2
build_ncurses
build_bash
build_bzip2
build_coreutils
build_diffutils
build_findutils
build_gawk
build_gettext
build_grep
build_gzip
build_make
build_patch
build_perl
build_sed
build_tar
build_texinfo
build_util_linux
stripping

#計時
after_date_sum=`date -R`
echo "$before_date_sum"
echo "$after_date_sum"

logout_comment

--------------------------------------------------------------------
[./utils/build-lfs-pass-8-kernel.sh]
--------------------------------------------------------------------
#! /bin/sh

unset LFS
source lfs.lib

check_root

pass6_warning

configure_fstab()
{
    cat > /etc/fstab << "EOF"
# Begin /etc/fstab

# file system  mount-point  type   options         dump  fsck
#                                                        order

/dev/sda9     /            ext3  defaults        1     1
/dev/sda3     swap         swap   pri=1           0     0
proc           /proc        proc   defaults        0     0
sysfs          /sys         sysfs  defaults        0     0
devpts         /dev/pts     devpts gid=4,mode=620  0     0
shm            /dev/shm     tmpfs  defaults        0     0
# End /etc/fstab
EOF
}

build_linux()
{
    #檢測
    cd /sources
    check_file linux-2.6.22.5.tar.bz2
    check_dir linux-2.6.22.5

    #解壓
    tar jxvf linux-2.6.22.5.tar.bz2
    cd linux-2.6.22.5

    before_date=`date -R`

    #編譯
    make mrproper
    echo "wanna to run 'make menuconfig' ? (y/[n])"
    echo "if you press 'n', you should copy your own .config to `pwd`"
    read -s -n 1 -t 20 input
    if [ "$input" = "y" -o "$input" = "Y" ] ; then
    make menuconfig
    else
    if [ ! -e .config ] ; then
        echo "error: .config doesn't exist"
        exit 1
    fi
    fi
    make || eval "echo \"error: make error in linux\" && exit 1"
    make modules_install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    cp -v arch/i386/boot/bzImage /boot/lfskernel-2.6.22.5
    cp -v System.map /boot/System.map-2.6.22.5
    cp -v .config /boot/config-2.6.22.5
    install -d /usr/share/doc/linux-2.6.22.5
    cp -r Documentation/* /usr/share/doc/linux-2.6.22.5

    #清理
    cd /sources/
    rm -f -R linux-2.6.22.5
}

configure_grub()
{
    cat > /boot/grub/menu.lst << "EOF"
# Begin /boot/grub/menu.lst

# By default boot the first menu entry.
default 0

# Allow 30 seconds before booting the default.
timeout 2

# Use prettier colors.
color green/black light-green/black

# The first entry is for LFS.
title LFS 6.3
root (hd0,8)
kernel /boot/lfskernel-2.6.22.5 root=/dev/sda9
EOF
    mkdir -pv /etc/grub
    ln -sv /boot/grub/menu.lst /etc/grub
}

configure_lfs()
{
    echo 6.3 > /etc/lfs-release
}

logout_comment()
{
    echo "******** warning ********"
    echo "please edit /etc/fstab by yourself"
    echo "please edit /boot/grub/menu.lst by yourself"
    echo "then login as root, run the following commands to setup grub"
    echo "這裡的命令很危險!請修改grub> 下的命令參數"
    echo "hd0,8 指第1塊磁碟,第9個分區"
    echo
    echo "示例:"
    echo "# grub"
    echo "grub> root (hd0,8)"
    echo "grub> setup (hd0)"
    echo "grub> quit"
    echo "# logout"
    echo
    echo "the logout from chroot enviroment"
    echo "******** warning ********"
}

configure_fstab
build_linux
configure_grub
configure_lfs

logout_comment

--------------------------------------------------------------------
[./utils/lfs.lib]
--------------------------------------------------------------------
check_root()
{
    myid=$(id -u)
    if [ $myid -ne 0 ] ; then
    echo "error: only root can run this program" >&2
    exit 1
    fi
}

check_lfs()
{
    myid=$(id -urn)
    if [ $myid != "lfs" ] ; then
    echo "error: only lfs can run this program" >&2
    exit 1
    fi
}

check_file()
{
    if [ ! -e $LFS/sources/$1 ] ; then
    echo "error: $LFS/sources/$1 doesn't exist"
    exit 1
    fi
}

check_dir()
{
    if [ -e $LFS/sources/$1 ] ; then
    rm -f -R $LFS/sources/$1
    echo "刪除舊文件夾 $1"
    fi
}

pass0_warning()
{
    echo "******* warning *********"
    echo "這個腳本很危險!請先運行build-lfs-pass-0-chroot.sh"
    echo "在確保運行了chroot后再運行該腳本!"
    echo "******* warning *********"
    echo
    echo "如確認無誤,要運行該腳本,請輸入:"
    echo "GNU & LFS"
    read input
    if [ "$input" != "GNU & LFS" ] ; then
    echo "輸入錯誤,程序中斷運行!"
    exit 0
    fi
}

pass4_warning()
{
    echo "******* warning *********"
    echo "這個腳本很危險!請先運行build-lfs-pass-4-chroot.sh"
    echo "在確保運行了chroot后再運行該腳本!"
    echo "******* warning *********"
    echo
    echo "如確認無誤,要運行該腳本,請輸入:"
    echo "GNU & LFS"
    read input
    if [ "$input" != "GNU & LFS" ] ; then
    echo "輸入錯誤,程序中斷運行!"
    exit 0
    fi
}

pass6_warning()
{
    echo "******* warning *********"
    echo "這個腳本很危險!請先運行build-lfs-pass-6-chroot.sh"
    echo "在確保運行了chroot后再運行該腳本!"
    echo "******* warning *********"
    echo
    echo "如確認無誤,要運行該腳本,請輸入:"
    echo "GNU & LFS"
    read input
    if [ "$input" != "GNU & LFS" ] ; then
    echo "輸入錯誤,程序中斷運行!"
    exit 0
    fi
}

logout_from_chroot_warning()
{
    echo "******* warning *********"
    echo "如果現在是在chroot環境中"
    echo "請確保運行了logout后再運行該腳本!"
    echo "******* warning *********"
    echo
    echo "如確認無誤,要運行該腳本,請輸入:"
    echo "GNU & LFS"
    read input
    if [ "$input" != "GNU & LFS" ] ; then
    echo "輸入錯誤,程序中斷運行!"
    exit 0
    fi
}

--------------------------------------------------------------------
[./utils/prepare-1.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.conf
source lfs.lib

check_lfs

cat > ~/.bash_profile <<EOF
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

#change
cat > ~/.bashrc <<EOF
set +h
umask 022
LFS=/media/exp
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF

source ~/.bash_profile

--------------------------------------------------------------------
[./utils/lfs.conf]
--------------------------------------------------------------------
#LFS為 LFS System 的根文件系統
export LFS=/media/exp

--------------------------------------------------------------------
[./utils/build-lfs-pass-6-chroot.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.conf
source lfs.lib

check_root

logout_from_chroot_warning

virtual_file_system()
{
    mkdir -pv $LFS/{dev,proc,sys}

    if [ ! -e $LFS/dev/console ] ; then
    mknod -m 600 $LFS/dev/console c 5 1
    fi

    if [ ! -e $LFS/dev/null ] ; then
    mknod -m 666 $LFS/dev/null c 1 3
    fi

    mount | grep -q "/dev on $LFS/dev "
    if [ $? -ne 0 ] ; then
    mount -v --bind /dev $LFS/dev
    fi

    mount | grep -q "devpts on $LFS/dev/pts "
    if [ $? -ne 0 ] ; then
    mount -vt devpts devpts $LFS/dev/pts
    fi

    mount | grep -q "shm on $LFS/dev/shm "
    if [ $? -ne 0 ] ; then
    mount -vt tmpfs shm $LFS/dev/shm
    fi

    mount | grep -q "proc on $LFS/proc "
    if [ $? -ne 0 ] ; then
    mount -vt proc proc $LFS/proc
    fi

    mount | grep -q "sysfs on $LFS/sys "
    if [ $? -ne 0 ] ; then
    mount -vt sysfs sysfs $LFS/sys
    fi
}

chroot_comment()
{
    echo "****************"
    echo "now login as root, then run the fllowing commands"
    echo
    echo "# export LFS=$LFS"
    echo "# chroot \"\$LFS\" /usr/bin/env -i  \\
    HOME=/root TERM=\"\$TERM\" PS1='\\u:\\w\\$ ' \\
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \\
    /bin/bash --login"
    echo
    echo "you can delete $LFS/tools now"
    echo "****************"
}

if [ ! -e $LFS/sources ] ; then
    echo "error: $LFS/sources don't exist"
    exit 1
fi

virtual_file_system
chroot_comment

--------------------------------------------------------------------
[./utils/version-check.sh]
--------------------------------------------------------------------
#! /bin/sh

export LC_ALL=C

bash --version | head -n 1 | cut -d " " -f 2-4
echo "/bin/sh -> `readlink -f /bin/sh`"
echo -n "Binutils: "
ld --version | head -n 1 | cut -d " " -f 3-
bison --version | head -n 1
if [ -e /usr/bin/yacc ] ; then
    echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`"
else
    echo "yacc not found"
fi
bzip2 --version 2>&1 < /dev/null | head -n 1 | cut -d " " -f 1,6-
echo -n "Coreutils: "
chown --version | head -n 1 | cut -d ")" -f 2
diff --version | head -n 1
find --version | head -n 1
gawk --version | head -n 1
if [ -e /usr/bin/awk ] ; then
    echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`"
else
    echo "awk not found"
fi
gcc --version | head -n 1
/lib/libc.so.6 | head -n 1 | cut -d " " -f 1-7
grep --version | head -n 1
gzip --version | head -n 1
cat /proc/version
m4 --version | head -n 1
make --version | head -n 1
patch --version | head -n 1
echo Perl `perl -V:version`
sed --version | head -n 1
tar --version | head -n 1
makeinfo --version | head -n 1
echo "main(){}" > dummy.c && gcc -o dummy dummy.c
if [ -x dummy ] ; then
    echo "Compilation OK"
else
    echo "Compilation failed"
fi
rm -f dummy.c dummy

--------------------------------------------------------------------
[./utils/build-lfs-pass-0-chroot.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.conf
source lfs.lib

check_root

virtual_file_system()
{
    mkdir -pv $LFS/{dev,proc,sys}

    if [ ! -e $LFS/dev/console ] ; then
    mknod -m 600 $LFS/dev/console c 5 1
    fi

    if [ ! -e $LFS/dev/null ] ; then
    mknod -m 666 $LFS/dev/null c 1 3
    fi

    mount | grep -q "/dev on $LFS/dev "
    if [ $? -ne 0 ] ; then
    mount -v --bind /dev $LFS/dev
    fi

    mount | grep -q "devpts on $LFS/dev/pts "
    if [ $? -ne 0 ] ; then
    mount -vt devpts devpts $LFS/dev/pts
    fi

    mount | grep -q "shm on $LFS/dev/shm "
    if [ $? -ne 0 ] ; then
    mount -vt tmpfs shm $LFS/dev/shm
    fi

    mount | grep -q "proc on $LFS/proc "
    if [ $? -ne 0 ] ; then
    mount -vt proc proc $LFS/proc
    fi

    mount | grep -q "sysfs on $LFS/sys "
    if [ $? -ne 0 ] ; then
    mount -vt sysfs sysfs $LFS/sys
    fi
}

chroot_comment()
{
    echo "****************"
    echo "now login as root, then run the fllowing commands"
    echo
    echo "# export LFS=$LFS"
    echo "# chroot \"\$LFS\" /tools/bin/env -i \\
    HOME=/root TERM=\"\$TERM\" PS1='\\u:\\w\\$ ' \\
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \\
    /tools/bin/bash --login +h"
    echo
    echo "****************"
}

if [ ! -e $LFS/sources ] ; then
    echo "error: $LFS/sources don't exist"
    exit 1
fi

virtual_file_system
chroot_comment

--------------------------------------------------------------------
[./utils/build-lfs-pass-2-main.sh]
--------------------------------------------------------------------
#! /bin/sh

unset LFS
source lfs.lib

check_root

pass0_warning

essential_file()
{
    touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
    chgrp -v utmp /var/run/utmp /var/log/lastlog
    chmod -v 664 /var/run/utmp /var/log/lastlog
}

build_linux_api_headers()
{
    #檢測
    cd /sources

    check_file linux-2.6.22.5.tar.bz2
    check_dir linux-2.6.22.5

    #解壓
    tar jxvf linux-2.6.22.5.tar.bz2
    cd linux-2.6.22.5

    #特殊
    sed -i '/scsi/d' include/Kbuild

    before_date=`date -R`

    #編譯
    make mrproper
    make headers_check
    make INSTALL_HDR_PATH=dest headers_install
    cp -rv dest/include/* /usr/include

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R linux-2.6.22.5
}

build_man_pages()
{
    #檢測
    cd /sources

    check_file man-pages-2.63.tar.bz2
    check_dir man-pages-2.63

    #解壓
    tar jxvf man-pages-2.63.tar.bz2
    cd man-pages-2.63

    before_date=`date -R`

    #編譯
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R man-pages-2.63
}

build_glibc()
{
    #檢測
    cd /sources

    check_file glibc-2.5.1.tar.bz2
    check_file glibc-libidn-2.5.1.tar.gz
    check_dir glibc-2.5.1
    check_dir glibc-build

    #解壓
    tar jxvf glibc-2.5.1.tar.bz2
    cd glibc-2.5.1
    tar zxvf ../glibc-libidn-2.5.1.tar.gz
    mv glibc-libidn-2.5.1 libidn

    #特殊
    sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
    sed -i \
    's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' \
        scripts/test-installation.pl
    sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in

    before_date=`date -R`

    #編譯
    mkdir -v ../glibc-build
    cd ../glibc-build

    ../glibc-2.5.1/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
    make || eval "echo \"error: make error in glibc\" && exit 1"
#    make -k check 2>&1 | tee glibc-check-log
#    grep Error glibc-check-log
#    echo "glibc check done, please press enter"
#    read input

    touch /etc/ld.so.conf
    make install

    #國際化,這裡全部安裝
    make localedata/install-locales

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #配置
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

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

# End /etc/ld.so.conf
EOF

    #清理
    cd /sources/
    rm -f -R glibc-2.5.1
    rm -f -R glibc-build
}

adjust_toolchain()
{
    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 -dumpspecs | sed \
    -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@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 ': /lib'

    grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
    grep -B1 '^ /usr/include' dummy.log
    grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
    grep "/lib/libc.so.6 " dummy.log
    grep found dummy.log

#read input

    rm -v dummy.c a.out
}

build_binutils()
{
    #檢測
    cd /sources

    check_file binutils-2.17.tar.bz2
    check_dir binutils-2.17
    check_dir binutils-build

    #測試
    expect -c "spawn ls"
#    read input

    #解壓
    tar jxvf binutils-2.17.tar.bz2
    cd binutils-2.17

    before_date=`date -R`

    #編譯
    mkdir -v ../binutils-build
    cd ../binutils-build
    ../binutils-2.17/configure --prefix=/usr \
    --enable-shared
    make tooldir=/usr || eval "echo \"error: make error in binutils\" && exit 1"
#    make check
    make tooldir=/usr install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    cp -v ../binutils-2.17/include/libiberty.h /usr/include

    #清理
    cd /sources/
    rm -f -R binutils-2.17
    rm -f -R binutils-build
}

build_gcc()
{
    #檢測
    cd /sources

    check_file gcc-4.1.2.tar.bz2
    check_dir gcc-4.1.2
    check_dir gcc-build

    #解壓
    tar jxvf gcc-4.1.2.tar.bz2
    cd gcc-4.1.2

    #特殊
    sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
    sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
    sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
    sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in

    before_date=`date -R`

    #編譯
    mkdir -v ../gcc-build
    cd ../gcc-build
    ../gcc-4.1.2/configure --prefix=/usr \
    --libexecdir=/usr/lib --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-clocale=gnu --enable-languages=c,c++
    make || eval "echo \"error: make error in gcc\" && exit 1"
#    make -k check
#    ../gcc-4.1.2/contrib/test_summary
#    echo "check done, please press enter to continue"
#    read input
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    ln -sv ../usr/bin/cpp /lib
    ln -sv gcc /usr/bin/cc

    #測試
    echo 'main(){}' > dummy.c
    cc dummy.c -v -Wl,--verbose &> dummy.log
    readelf -l a.out | grep ': /lib'
    grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
    grep -B3 '^ /usr/include' dummy.log
    grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
    grep "/lib/libc.so.6 " dummy.log
    grep found dummy.log
#    echo "check log done, please press enter to continue"
#    read input
    rm -f -v dummy.c a.out dummy.log

    #清理
    cd /sources/
    rm -f -R gcc-4.1.2
    rm -f -R gcc-build
}

build_db()
{
    #檢測
    cd /sources

    check_file db-4.5.20.tar.gz
    check_file db-4.5.20-fixes-1.patch
    check_dir db-4.5.20

    #解壓
    tar zxvf db-4.5.20.tar.gz
    cd db-4.5.20

    #打補丁
    patch -Np1 -i ../db-4.5.20-fixes-1.patch

    before_date=`date -R`

    #編譯
    cd build_unix
    ../dist/configure --prefix=/usr --enable-compat185 --enable-cxx
    make || eval "echo \"error: make error in db\" && exit 1"
    make docdir=/usr/share/doc/db-4.5.20 install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    chown -Rv root:root /usr/share/doc/db-4.5.20

    #清理
    cd /sources/
    rm -f -R db-4.5.20
}

build_sed()
{
    #檢測
    cd /sources

    check_file sed-4.1.5.tar.gz
    check_dir sed-4.1.5

    #解壓
    tar zxvf sed-4.1.5.tar.gz
    cd sed-4.1.5

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --bindir=/bin --enable-html
    make || eval "echo \"error: make error in sed\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R sed-4.1.5
}

build_e2fsprogs()
{
    #檢測
    cd /sources

    check_file e2fsprogs-1.40.2.tar.gz
    check_dir e2fsprogs-1.40.2

    #解壓
    tar zxvf e2fsprogs-1.40.2.tar.gz
    cd e2fsprogs-1.40.2

    #特殊
    sed -i -e 's@/bin/rm@/tools&@' lib/blkid/test_probe.in

    before_date=`date -R`

    #編譯
    mkdir -v build
    cd build
    ../configure --prefix=/usr --with-root-prefix="" \
    --enable-elf-shlibs
    make || eval "echo \"error: make error in e2fsprogs\" && exit 1"
    make install
    make install-libs

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R e2fsprogs-1.40.2
}

build_coreutils()
{
    #檢測
    cd /sources

    check_file coreutils-6.9.tar.bz2
    check_file coreutils-6.9-uname-1.patch
    check_file coreutils-6.9-suppress_uptime_kill_su-1.patch
    check_file coreutils-6.9-i18n-1.patch
    check_dir coreutils-6.9

    #解壓
    tar jxvf coreutils-6.9.tar.bz2
    cd coreutils-6.9

    before_date=`date -R`

    #打補丁
    patch -Np1 -i ../coreutils-6.9-uname-1.patch
    patch -Np1 -i ../coreutils-6.9-suppress_uptime_kill_su-1.patch
    patch -Np1 -i ../coreutils-6.9-i18n-1.patch

    #特殊
    chmod +x tests/sort/sort-mb-tests

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in coreutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
    mv -v /usr/bin/{false,hostname,ln,ls,mkdir,mknod,mv,pwd,readlink,rm} /bin
    mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
    mv -v /usr/bin/chroot /usr/sbin
    mv -v /usr/bin/{head,sleep,nice} /bin

    #清理
    cd /sources/
    rm -f -R coreutils-6.9
}

build_iana_etc()
{
    #檢測
    cd /sources

    check_file iana-etc-2.20.tar.bz2
    check_dir iana-etc-2.20

    #解壓
    tar jxvf iana-etc-2.20.tar.bz2
    cd iana-etc-2.20

    before_date=`date -R`

    #編譯
    make || eval "echo \"error: make error in iana-etc\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R iana-etc-2.20
}

build_m4()
{
    #檢測
    cd /sources

    check_file m4-1.4.10.tar.bz2
    check_dir m4-1.4.10

    #解壓   
    tar jxvf m4-1.4.10.tar.bz2
    cd m4-1.4.10

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in m4\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R m4-1.4.10
}

build_bison()
{
    #檢測
    cd /sources

    check_file bison-2.3.tar.bz2
    check_dir bison-2.3

    #解壓   
    tar jxvf bison-2.3.tar.bz2
    cd bison-2.3

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    echo '#define YYENABLE_NLS 1' >> config.h
    make || eval "echo \"error: make error in bison\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R bison-2.3
}

build_ncurses()
{
    #檢測
    cd /sources

    check_file ncurses-5.6.tar.gz
    check_file ncurses-5.6-coverity_fixes-1.patch
    check_dir ncurses-5.6

    #打補丁
    patch -Np1 -i ../ncurses-5.6-coverity_fixes-1.patch

    #解壓
    tar zxvf ncurses-5.6.tar.gz
    cd ncurses-5.6

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --with-shared --without-debug --enable-widec
    make || eval "echo \"error: make error in ncurses\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    chmod -v 644 /usr/lib/libncurses++w.a
    mv -v /usr/lib/libncursesw.so.5* /lib
    ln -sfv ../../lib/libncursesw.so.5 /usr/lib/libncursesw.so
    for lib in curses 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 ; \
    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

    #清理
    cd /sources/
    rm -f -R ncurses-5.6
}

build_procps()
{
    #檢測
    cd /sources

    check_file procps-3.2.7.tar.gz
    check_dir procps-3.2.7

    #解壓   
    tar zxvf procps-3.2.7.tar.gz
    cd procps-3.2.7

    before_date=`date -R`

    #編譯
    make || eval "echo \"error: make error in procps\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R procps-3.2.7
}

build_libtool()
{
    #檢測
    cd /sources

    check_file libtool-1.5.24.tar.gz
    check_dir libtool-1.5.24

    #解壓   
    tar zxvf libtool-1.5.24.tar.gz
    cd libtool-1.5.24

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in libtool\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R libtool-1.5.24
}

build_perl()
{
    #檢測
    cd /sources

    check_file perl-5.8.8.tar.bz2
    check_file perl-5.8.8-libc-2.patch
    check_dir perl-5.8.8

    #特殊
    echo "127.0.0.1 localhost $(hostname)" > /etc/hosts

    #解壓
    tar jxvf perl-5.8.8.tar.bz2
    cd perl-5.8.8

    before_date=`date -R`

    #編譯
    ./configure.gnu --prefix=/usr \
    -Dman1dir=/usr/share/man/man1 \
    -Dman3dir=/usr/share/man/man3 \
    -Dpager="/usr/bin/less -isR"
    make || eval "echo \"error: make error in perl\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R perl-5.8.8
}

build_readline()
{
    #檢測
    cd /sources

    check_file readline-5.2.tar.gz
    check_file readline-5.2-fixes-3.patch
    check_dir readline-5.2

    #解壓
    tar zxvf readline-5.2.tar.gz
    cd readline-5.2

    #特殊
    sed -i '/MV.*old/d' Makefile.in
    sed -i '/{OLDSUFF}/c:' support/shlib-install

    #打補丁
    patch -Np1 -i ../readline-5.2-fixes-3.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --libdir=/lib
    make SHLIB_LIBS=-lncurses || eval "echo \"error: make error in readline\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /lib/lib{readline,history}.a /usr/lib
    rm -v /lib/lib{readline,history}.so
    ln -sfv ../../lib/libreadline.so.5 /usr/lib/libreadline.so
    ln -sfv ../../lib/libhistory.so.5 /usr/lib/libhistory.so

    #清理
    cd /sources/
    rm -f -R readline-5.2
}

build_zlib()
{
    #檢測
    cd /sources

    check_file zlib-1.2.3.tar.gz
    check_dir zlib-1.2.3

    #解壓
    tar zxvf zlib-1.2.3.tar.gz
    cd zlib-1.2.3

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --shared --libdir=/lib
    make || eval "echo \"error: make error in zlib\" && exit 1"
    make install
    rm -v /lib/libz.so
    ln -sfv ../../lib/libz.so.1.2.3 /usr/lib/libz.so
    make clean
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in zlib\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    chmod -v 644 /usr/lib/libz.a

    #清理
    cd /sources/
    rm -f -R zlib-1.2.3
}

build_autoconf()
{
    #檢測
    cd /sources

    check_file autoconf-2.61.tar.bz2
    check_dir autoconf-2.61

    #解壓
    tar jxvf autoconf-2.61.tar.bz2
    cd autoconf-2.61

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in autoconf\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R autoconf-2.61
}

build_automake()
{
    #檢測
    cd /sources

    check_file automake-1.10.tar.bz2
    check_dir automake-1.10

    #解壓
    tar jxvf automake-1.10.tar.bz2
    cd automake-1.10

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in automake\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R automake-1.10
}

bash_comment()
{
    echo "****************"
    echo "please run the following commands"
    echo
    echo "# exec /bin/bash --login +h"
    echo
    echo "****************"
}

build_bash()
{
    #檢測
    cd /sources

    check_file bash-3.2.tar.gz
    check_file bash-doc-3.2.tar.gz
    check_file bash-3.2-fixes-5.patch
    check_dir bash-3.2

    #解壓
    tar zxvf bash-3.2.tar.gz
    cd bash-3.2
    tar zxvf ../bash-doc-3.2.tar.gz

    #特殊
    sed -i "s|htmldir = @htmldir@|htmldir = /usr/share/doc/bash-3.2|" \
    Makefile.in

    #打補丁
    patch -Np1 -i ../bash-3.2-fixes-5.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --bindir=/bin \
    --without-bash-malloc --with-installed-readline
    make || eval "echo \"error: make error in bash\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    ln -vs bash /tools/bin/sh

    #清理
    cd /sources/
    rm -f -R bash-3.2

    #重新登錄
    bash_comment
}

before_date_sum=`date -R`

essential_file
build_linux_api_headers
build_man_pages
build_glibc
adjust_toolchain
build_binutils
build_gcc
build_db
build_sed
build_e2fsprogs
build_coreutils
build_iana_etc
build_m4
build_bison
build_ncurses
build_procps
build_libtool
build_perl
build_readline
build_zlib
build_autoconf
build_automake
build_bash

#計時
after_date_sum=`date -R`
echo "$before_date_sum"
echo "$after_date_sum"

--------------------------------------------------------------------
[./utils/build-lfs-pass-5.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.lib

check_root

pass4_warning

stripping()
{
    /tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
    -exec /tools/bin/strip --strip-debug '{}' ';'
}

logout_comment()
{
    echo "****************"
    echo "run the fllowing command to logout"
    echo
    echo "# logout"
    echo
    echo "****************"
}

stripping
logout_comment

--------------------------------------------------------------------
[./utils/build-lfs-pass-1.sh]
--------------------------------------------------------------------
#! /tools/bin/sh

source lfs.lib

check_root

pass0_warning

create_directories()
{
    mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
    mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
    install -dv -m 0750 /root
    install -dv -m 1777 /tmp /var/tmp
    mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
    mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
    mkdir -pv  /usr/{,local/}share/{misc,terminfo,zoneinfo}
    mkdir -pv /usr/{,local/}share/man/man{1..8}
    for dir in /usr /usr/local; do
    ln -sv share/{man,doc,info} $dir
    done
    mkdir -pv /var/{lock,log,mail,run,spool}
    mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
}

essential_file()
{
    ln -sv /tools/bin/{bash,cat,echo,grep,pwd,stty} /bin
    ln -sv /tools/bin/perl /usr/bin
    ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
    ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
    ln -sv bash /bin/sh
    touch /etc/mtab

    cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF

    cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape: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:
mail:x:34:
nogroup:x:99:
EOF
}

prompt_comment()
{
    echo "****************"
    echo "now run this commonds to remove the \"I have no name!\""
    echo
    echo "# exec /tools/bin/bash --login +h"
    echo
    echo "****************"
}

create_directories
essential_file
prompt_comment

--------------------------------------------------------------------
[./utils/build-lfs-pass-7.sh]
--------------------------------------------------------------------
#! /bin/sh

unset LFS
source lfs.lib

check_root

pass6_warning

build_lfs_bootscripts()
{
    #檢測
    cd /sources
    check_file lfs-bootscripts-6.3.tar.bz2
    check_dir lfs-bootscripts-6.3

    #解壓
    tar jxvf lfs-bootscripts-6.3.tar.bz2
    cd lfs-bootscripts-6.3

    before_date=`date -R`

    #編譯
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R lfs-bootscripts-6.3
}

configure_setclock()
{
    cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock

UTC=1

# End /etc/sysconfig/clock
EOF
}

configure_inputrc()
{
    cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>

# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off

# Enable 8bit input
set meta-flag On
set input-meta On

# Turns off 8th bit stripping
set convert-meta Off

# Keep the 8th bit for display
set output-meta On

# none, visible or audible
set bell-style none

# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"\eOd": backward-word
"\eOc": forward-word

# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert

# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line

# End /etc/inputrc
EOF
}

configure_bash()
{
    cat > /etc/profile << "EOF"
# Begin /etc/profile

export LANG=zh_CN.utf8

# End /etc/profile
EOF
}

configure_localnet()
{
    #enter you host name
    echo "HOSTNAME=babyaries" > /etc/sysconfig/network
}

configure_hosts()
{
    cat > /etc/hosts << "EOF"
# Begin /etc/hosts (network card version)

#127.0.0.1 localhost
#<192.168.1.1> <HOSTNAME.example.org> [alias1] [alias2 ...]
127.0.0.1 babyaries localhost

# End /etc/hosts (network card version)
EOF
}

configure_network()
{
    cd /etc/sysconfig/network-devices && \
    mkdir -v ifconfig.eth0 && \
    cat > ifconfig.eth0/ipv4 << "EOF"
ONBOOT=yes
SERVICE=ipv4-static
IP=192.168.1.1
GATEWAY=192.168.1.2
PREFIX=24
BROADCAST=192.168.1.255
EOF
    cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf

#domain <Your Domain Name>
#nameserver <IP address of your primary nameserver>
#nameserver <IP address of your secondary nameserver>

nameserver 202.96.128.166
nameserver 202.96.134.133

# End /etc/resolv.conf
EOF
}

network_comment()
{
    echo "******** warning ********"
    echo "please edit /etc/resolv.conf by yourself"
    echo "******** warning ********"
}

build_lfs_bootscripts
configure_setclock
configure_inputrc
configure_bash
configure_localnet
configure_hosts
configure_network

network_comment

--------------------------------------------------------------------
[./utils/build-lfs-pass-9.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.conf
source lfs.lib

check_root

logout_from_chroot_warning

virtual_file_system()
{
    mkdir -pv $LFS/{dev,proc,sys}

    if [ ! -e $LFS/dev/console ] ; then
    mknod -m 600 $LFS/dev/console c 5 1
    fi

    if [ ! -e $LFS/dev/null ] ; then
    mknod -m 666 $LFS/dev/null c 1 3
    fi

    mount | grep -q "/dev on $LFS/dev "
    if [ $? -ne 0 ] ; then
    mount -v --bind /dev $LFS/dev
    fi

    mount | grep -q "devpts on $LFS/dev/pts "
    if [ $? -ne 0 ] ; then
    mount -vt devpts devpts $LFS/dev/pts
    fi

    mount | grep -q "shm on $LFS/dev/shm "
    if [ $? -ne 0 ] ; then
    mount -vt tmpfs shm $LFS/dev/shm
    fi

    mount | grep -q "proc on $LFS/proc "
    if [ $? -ne 0 ] ; then
    mount -vt proc proc $LFS/proc
    fi

    mount | grep -q "sysfs on $LFS/sys "
    if [ $? -ne 0 ] ; then
    mount -vt sysfs sysfs $LFS/sys
    fi
}

umount_and_reboot()
{
    umount -v $LFS/dev/pts
    umount -v $LFS/dev/shm
    umount -v $LFS/dev
    umount -v $LFS/proc
    umount -v $LFS/sys
    umount -v $LFS
    echo "****************"
    echo "restart the system, good luck :)"
    echo
    echo "# init 6"
    echo
    echo "****************"
}

if [ ! -e $LFS/sources ] ; then
    echo "error: $LFS/sources don't exist"
    exit 1
fi

virtual_file_system
umount_and_reboot
--------------------------------------------------------------------
[./utils/prepare-0.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.conf
source lfs.lib

check_root

mkdir -pv $LFS/sources
chmod -v a+wt $LFS/sources

mkdir -pv $LFS/tools
#重要,'/tools -> $LFS/tools',chroot時也會用到
ln -sv $LFS/tools /

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
echo "enter user lfs' password"
passwd lfs
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources

echo "****************"
echo "enter 'su - lfs' to run prepare-1.sh now"
echo "****************"

--------------------------------------------------------------------
[./utils/build-lfs-pass-4-chroot.sh]
--------------------------------------------------------------------
#! /bin/sh

source lfs.conf
source lfs.lib

check_root

logout_from_chroot_warning

virtual_file_system()
{
    mkdir -pv $LFS/{dev,proc,sys}

    if [ ! -e $LFS/dev/console ] ; then
    mknod -m 600 $LFS/dev/console c 5 1
    fi

    if [ ! -e $LFS/dev/null ] ; then
    mknod -m 666 $LFS/dev/null c 1 3
    fi

    mount | grep -q "/dev on $LFS/dev "
    if [ $? -ne 0 ] ; then
    mount -v --bind /dev $LFS/dev
    fi

    mount | grep -q "devpts on $LFS/dev/pts "
    if [ $? -ne 0 ] ; then
    mount -vt devpts devpts $LFS/dev/pts
    fi

    mount | grep -q "shm on $LFS/dev/shm "
    if [ $? -ne 0 ] ; then
    mount -vt tmpfs shm $LFS/dev/shm
    fi

    mount | grep -q "proc on $LFS/proc "
    if [ $? -ne 0 ] ; then
    mount -vt proc proc $LFS/proc
    fi

    mount | grep -q "sysfs on $LFS/sys "
    if [ $? -ne 0 ] ; then
    mount -vt sysfs sysfs $LFS/sys
    fi
}

chroot_comment()
{
    echo "****************"
    echo "now login as root, then run the fllowing commands"
    echo
    echo "# export LFS=$LFS"
    echo "# chroot \"\$LFS\" /tools/bin/env -i \\
    HOME=/root TERM=\"\$TERM\" PS1='\\u:\\w\\$ ' \\
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \\
    /tools/bin/bash --login"
    echo
    echo "****************"
}

if [ ! -e $LFS/sources ] ; then
    echo "error: $LFS/sources don't exist"
    exit 1
fi

virtual_file_system
chroot_comment

--------------------------------------------------------------------
[./utils/build-lfs-pass-3-main.sh]
--------------------------------------------------------------------
#! /bin/sh

unset LFS
source lfs.lib

check_root

pass0_warning

build_bzip2()
{
    #檢測
    cd /sources

    check_file bzip2-1.0.4.tar.gz
    check_file bzip2-1.0.4-install_docs-1.patch
    check_dir bzip2-1.0.4

    #解壓
    tar zxvf bzip2-1.0.4.tar.gz
    cd bzip2-1.0.4

    #打補丁
    patch -Np1 -i ../bzip2-1.0.4-install_docs-1.patch

    before_date=`date -R`

    #編譯
    make -f Makefile-libbz2_so
    make clean
    make || eval "echo \"error: make error in bzip2\" && exit 1"
    make PREFIX=/usr install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    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 /sources/
    rm -f -R bzip2-1.0.4
}

build_diffutils()
{
    #檢測
    cd /sources

    check_file diffutils-2.8.1.tar.gz
    check_file diffutils-2.8.1-i18n-1.patch
    check_dir diffutils-2.8.1

    #解壓
    tar zxvf diffutils-2.8.1.tar.gz
    cd diffutils-2.8.1

    #打補丁
    patch -Np1 -i ../diffutils-2.8.1-i18n-1.patch

    #特殊
    touch man/diff.1

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in diffutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R diffutils-2.8.1
}

build_file()
{
    #檢測
    cd /sources

    check_file file-4.21.tar.gz
    check_dir file-4.21

    #解壓
    tar zxvf file-4.21.tar.gz
    cd file-4.21

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in file\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R file-4.21
}

build_findutils()
{
    #檢測
    cd /sources

    check_file findutils-4.2.31.tar.gz
    check_dir findutils-4.2.31

    #解壓
    tar zxvf findutils-4.2.31.tar.gz
    cd findutils-4.2.31

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --libexecdir=/usr/lib/findutils \
    --localstatedir=/var/lib/locate
    make || eval "echo \"error: make error in findutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /usr/bin/find /bin
    sed -i -e 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb

    #清理
    cd /sources/
    rm -f -R findutils-4.2.31
}

build_flex()
{
    #檢測
    cd /sources

    check_file flex-2.5.33.tar.bz2
    check_dir flex-2.5.33

    #解壓
    tar jxvf flex-2.5.33.tar.bz2
    cd flex-2.5.33

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in flex\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    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 755 /usr/bin/lex

    #清理
    cd /sources/
    rm -f -R flex-2.5.33
}

build_grub()
{
    #檢測
    cd /sources

    check_file grub-0.97.tar.gz
    check_file grub-0.97-disk_geometry-1.patch
    check_dir grub-0.97

    #解壓
    tar zxvf grub-0.97.tar.gz
    cd grub-0.97

    #打補丁
    patch -Np1 -i ../grub-0.97-disk_geometry-1.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in grub\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊,/boot有可能是在另外一個掛載
    mkdir -v /boot/grub
    cp -v /usr/lib/grub/i386-pc/stage{1,2} /boot/grub
    cp -v /usr/lib/grub/i386-pc/e2fs_stage1_5 /boot/grub

    #清理
    cd /sources/
    rm -f -R grub-0.97
}

build_gawk()
{
    #檢測
    cd /sources

    check_file gawk-3.1.5.tar.bz2
    check_file gawk-3.1.5-segfault_fix-1.patch
    check_dir gawk-3.1.5

    #解壓
    tar jxvf gawk-3.1.5.tar.bz2
    cd gawk-3.1.5

    #打補丁
    patch -Np1 -i ../gawk-3.1.5-segfault_fix-1.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --libexecdir=/usr/lib
    cat >> config.h << "EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF
    make || eval "echo \"error: make error in gawk\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R gawk-3.1.5
}

build_gettext()
{
    #檢測
    cd /sources

    check_file gettext-0.16.1.tar.gz
    check_dir gettext-0.16.1

    #解壓
    tar zxvf gettext-0.16.1.tar.gz
    cd gettext-0.16.1

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in gettext\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R gettext-0.16.1
}

build_grep()
{
    #檢測
    cd /sources

    check_file grep-2.5.1a.tar.bz2
    check_file grep-2.5.1a-redhat_fixes-2.patch
    check_dir grep-2.5.1a

    #解壓
    tar jxvf grep-2.5.1a.tar.bz2
    cd grep-2.5.1a

    #打補丁
    patch -Np1 -i ../grep-2.5.1a-redhat_fixes-2.patch

    #特殊
    chmod +x tests/fmbtest.sh

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --bindir=/bin
    make || eval "echo \"error: make error in grep\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R grep-2.5.1a
}

build_groff()
{
    #檢測
    cd /sources

    check_file groff-1.18.1.4.tar.gz
    check_file groff-1.18.1.4-debian_fixes-1.patch
    check_dir groff-1.18.1.4

    #解壓
    tar zxvf groff-1.18.1.4.tar.gz
    cd groff-1.18.1.4

    #打補丁
    patch -Np1 -i ../groff-1.18.1.4-debian_fixes-1.patch

    #特殊
    sed -i -e 's/2010/002D/' -e 's/2212/002D/' \
    -e 's/2018/0060/' -e 's/2019/0027/' font/devutf8/R.proto

    before_date=`date -R`

    #編譯
    PAGE=A4 ./configure --prefix=/usr --enable-multibyte
    make || eval "echo \"error: make error in groff\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    ln -sv eqn /usr/bin/geqn
    ln -sv tbl /usr/bin/gtbl

    #清理
    cd /sources/
    rm -f -R groff-1.18.1.4
}

build_gzip()
{
    #檢測
    cd /sources

    check_file gzip-1.3.12.tar.gz
    check_dir gzip-1.3.12

    #解壓
    tar zxvf gzip-1.3.12.tar.gz
    cd gzip-1.3.12

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --bindir=/bin
    make || eval "echo \"error: make error in gzip\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin
    mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin

    #清理
    cd /sources/
    rm -f -R gzip-1.3.12
}

build_inetutils()
{
    #檢測
    cd /sources

    check_file inetutils-1.5.tar.gz
    check_file inetutils-1.5-no_server_man_pages-2.patch
    check_dir inetutils-1.5

    #解壓
    tar zxvf inetutils-1.5.tar.gz
    cd inetutils-1.5

    #打補丁
    patch -Np1 -i ../inetutils-1.5-no_server_man_pages-2.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --libexecdir=/usr/sbin \
    --sysconfdir=/etc --localstatedir=/var \
    --disable-ifconfig --disable-logger --disable-syslogd \
    --disable-whois --disable-servers
    make || eval "echo \"error: make error in inetutils\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /usr/bin/ping /bin

    #清理
    cd /sources/
    rm -f -R inetutils-1.5
}

build_iproute()
{
    #檢測
    cd /sources

    check_file iproute2-2.6.20-070313.tar.gz
    check_dir iproute-2.6.20-070313

    #解壓
    tar zxvf iproute2-2.6.20-070313.tar.gz
    cd iproute-2.6.20-070313

    #特殊
    sed -i -e '/tc-bfifo.8/d' -e '/tc-pfifo.8/s/pbfifo/bfifo/' Makefile

    before_date=`date -R`

    #編譯
    make SBINDIR=/sbin || eval "echo \"error: make error in iproute\" && exit 1"
    make SBINDIR=/sbin install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /sbin/arpd /usr/sbin

    #清理
    cd /sources/
    rm -f -R iproute-2.6.20-070313
}

build_kbd()
{
    #檢測
    cd /sources

    check_file kbd-1.12.tar.bz2
    check_file kbd-1.12-backspace-1.patch
    check_file kbd-1.12-gcc4_fixes-1.patch
    check_dir kbd-1.12

    #解壓
    tar jxvf kbd-1.12.tar.bz2
    cd kbd-1.12

    #打補丁
    patch -Np1 -i ../kbd-1.12-backspace-1.patch
    patch -Np1 -i ../kbd-1.12-gcc4_fixes-1.patch

    before_date=`date -R`

    #編譯
    ./configure --datadir=/lib/kbd
    make || eval "echo \"error: make error in kbd\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /usr/bin/{kbd_mode,openvt,setfont} /bin

    #清理
    cd /sources/
    rm -f -R kbd-1.12
}

build_less()
{
    #檢測
    cd /sources

    check_file less-406.tar.gz
    check_dir less-406

    #解壓
    tar zxvf less-406.tar.gz
    cd less-406

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --sysconfdir=/etc
    make || eval "echo \"error: make error in less\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R less-406
}

build_make()
{
    #檢測
    cd /sources

    check_file make-3.81.tar.bz2
    check_dir make-3.81

    #解壓
    tar jxvf make-3.81.tar.bz2
    cd make-3.81

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in make\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R make-3.81
}

build_man_db()
{
    #檢測
    cd /sources

    check_file man-db-2.4.4.tar.gz
    check_file man-db-2.4.4-fixes-1.patch
    check_dir man-db-2.4.4

    #解壓
    tar zxvf man-db-2.4.4.tar.gz
    cd man-db-2.4.4

    #特殊
    mv man/de{_DE.88591,}
    mv man/es{_ES.88591,}
    mv man/it{_IT.88591,}
    mv man/ja{_JP.eucJP,}
    sed -i 's,\*_\*,??,' man/Makefile.in
    sed -i -e '\%\t/usr/man%d' -e '\%\t/usr/local/man%d' src/man_db.conf.in

    cat >> include/manconfig.h.in << "EOF"
#define WEB_BROWSER "exec /usr/bin/lynx"
#define COL "/usr/bin/col"
#define VGRIND "/usr/bin/vgrind"
#define GRAP "/usr/bin/grap"
EOF

    #打補丁
    patch -Np1 -i ../man-db-2.4.4-fixes-1.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --enable-mb-groff --disable-setuid
    make || eval "echo \"error: make error in man_db\" && exit 1"
    make install

    #特殊
    cat >> convert-mans << "EOF"
#!/bin/sh -e
FROM="$1"
TO="$2"
shift ; shift
while [ $# -gt 0 ]
do
        FILE="$1"
        shift
        iconv -f "$FROM" -t "$TO" "$FILE" >.tmp.iconv
        mv .tmp.iconv "$FILE"
done
EOF
    install -m755 convert-mans  /usr/bin

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R man-db-2.4.4
}

build_mktemp()
{
    #檢測
    cd /sources

    check_file mktemp-1.5.tar.gz
    check_file mktemp-1.5-add_tempfile-3.patch
    check_dir mktemp-1.5

    #解壓
    tar zxvf mktemp-1.5.tar.gz
    cd mktemp-1.5

    #打補丁
    patch -Np1 -i ../mktemp-1.5-add_tempfile-3.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --with-libc
    make || eval "echo \"error: make error in mktemp\" && exit 1"
    make install
    make install-tempfile

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R mktemp-1.5
}

build_module_init_tools()
{
    #檢測
    cd /sources

    check_file module-init-tools-3.2.2.tar.bz2
    check_file module-init-tools-3.2.2-modprobe-1.patch
    check_dir module-init-tools-3.2.2

    #解壓
    tar jxvf module-init-tools-3.2.2.tar.bz2
    cd module-init-tools-3.2.2

    #打補丁
    patch -Np1 -i ../module-init-tools-3.2.2-modprobe-1.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/ --enable-zlib
    make || eval "echo \"error: make error in module_init_tools\" && exit 1"
    make INSTALL=install install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R module-init-tools-3.2.2
}

build_patch()
{
    #檢測
    cd /sources

    check_file patch-2.5.4.tar.gz
    check_dir patch-2.5.4

    #解壓
    tar zxvf patch-2.5.4.tar.gz
    cd patch-2.5.4

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in patch\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R patch-2.5.4
}

build_psmisc()
{
    #檢測
    cd /sources

    check_file psmisc-22.5.tar.gz
    check_dir psmisc-22.5

    #解壓
    tar zxvf psmisc-22.5.tar.gz
    cd psmisc-22.5

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --exec-prefix=""
    make || eval "echo \"error: make error in psmisc\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /bin/pstree* /usr/bin
    ln -sv killall /bin/pidof

    #清理
    cd /sources/
    rm -f -R psmisc-22.5
}

build_shadow()
{
    #檢測
    cd /sources

    check_file shadow-4.0.18.1.tar.bz2
    check_file shadow-4.0.18.1-useradd_fix-2.patch
    check_dir shadow-4.0.18.1

    #解壓
    tar jxvf shadow-4.0.18.1.tar.bz2
    cd shadow-4.0.18.1

    #打補丁
    patch -Np1 -i ../shadow-4.0.18.1-useradd_fix-2.patch

    before_date=`date -R`

    #編譯
    ./configure --libdir=/lib --sysconfdir=/etc --enable-shared \
    --without-selinux
    sed -i 's/groups$(EXEEXT) //' src/Makefile
    find man -name Makefile -exec sed -i 's/groups\.1 / /' {} \;
    sed -i -e 's/ ko//' -e 's/ zh_CN zh_TW//' man/Makefile
    for i in de es fi fr id it pt_BR; do
    convert-mans UTF-8 ISO-8859-1 man/${i}/*.?
    done
    for i in cs hu pl; do
    convert-mans UTF-8 ISO-8859-2 man/${i}/*.?
    done
    convert-mans UTF-8 EUC-JP man/ja/*.?
    convert-mans UTF-8 KOI8-R man/ru/*.?
    convert-mans UTF-8 ISO-8859-9 man/tr/*.?
    sed -i -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \
    -e 's@/var/spool/mail@/var/mail@' etc/login.defs
    make || eval "echo \"error: make error in shadow\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    mv -v /usr/bin/passwd /bin
    mv -v /lib/libshadow.*a /usr/lib
    rm -v /lib/libshadow.so
    ln -sfv ../../lib/libshadow.so.0 /usr/lib/libshadow.so

    pwconv
    grpconv
    useradd -D -b /home
    sed -i 's/yes/no/' /etc/default/useradd

#optional
#    echo "enter root's password"
#    passwd root

    #清理
    cd /sources/
    rm -f -R shadow-4.0.18.1
}

passwd_comment()
{
    echo "******** warning ********"
    echo "remeber to run the following command!"
    echo
    echo "# passwd root"
    echo
    echo "******** warning ********"
}

build_sysklogd()
{
    #檢測
    cd /sources

    check_file sysklogd-1.4.1.tar.gz
    check_file sysklogd-1.4.1-fixes-2.patch
    check_file sysklogd-1.4.1-8bit-1.patch
    check_dir sysklogd-1.4.1

    #解壓
    tar zxvf sysklogd-1.4.1.tar.gz
    cd sysklogd-1.4.1

    #打補丁
    patch -Np1 -i ../sysklogd-1.4.1-fixes-2.patch
    patch -Np1 -i ../sysklogd-1.4.1-8bit-1.patch

    before_date=`date -R`

    #編譯
    make || eval "echo \"error: make error in sysklogd\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    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 /sources/
    rm -f -R sysklogd-1.4.1
}

build_sysvinit()
{
    #檢測
    cd /sources

    check_file sysvinit-2.86.tar.gz
    check_dir sysvinit-2.86

    #解壓
    tar zxvf sysvinit-2.86.tar.gz
    cd sysvinit-2.86

    #特殊
    sed -i 's@Sending processes@& configured via /etc/inittab@g' \
    src/init.c

    before_date=`date -R`

    #編譯
    make -C src || eval "echo \"error: make error in sysvinit\" && exit 1"
    make -C src install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    cat > /etc/inittab << "EOF"
# Begin /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/init.d/rc sysinit

l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S016:once:/sbin/sulogin

1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# End /etc/inittab
EOF

    #清理
    cd /sources/
    rm -f -R sysvinit-2.86
}

build_tar()
{
    #檢測
    cd /sources

    check_file tar-1.18.tar.bz2
    check_dir tar-1.18

    #解壓
    tar jxvf tar-1.18.tar.bz2
    cd tar-1.18

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin
    make || eval "echo \"error: make error in tar\" && exit 1"
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R tar-1.18
}

build_texinfo()
{
    #檢測
    cd /sources

    check_file texinfo-4.9.tar.bz2
    check_file texinfo-4.9-multibyte-1.patch
    check_file texinfo-4.9-tempfile_fix-1.patch
    check_dir texinfo-4.9

    #解壓
    tar jxvf texinfo-4.9.tar.bz2
    cd texinfo-4.9

    #打補丁
    patch -Np1 -i ../texinfo-4.9-multibyte-1.patch
    patch -Np1 -i ../texinfo-4.9-tempfile_fix-1.patch

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr
    make || eval "echo \"error: make error in texinfo\" && exit 1"
    make install
    make TEXMF=/usr/share/texmf install-tex

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    cd /usr/share/info
    rm dir
    for f in *
    do
    install-info $f dir 2>/dev/null
    done

    #清理
    cd /sources/
    rm -f -R texinfo-4.9
}

build_udev()
{
    #檢測
    cd /sources

    check_file udev-113.tar.bz2
    check_file udev-config-6.3.tar.bz2
    check_dir texinfo-4.9

    #解壓
    tar jxvf udev-113.tar.bz2
    cd udev-113

    #特殊
    install -dv /lib/{firmware,udev/devices/{pts,shm}}
    mknod -m0666 /lib/udev/devices/null c 1 3
    ln -sv /proc/self/fd /lib/udev/devices/fd
    ln -sv /proc/self/fd/0 /lib/udev/devices/stdin
    ln -sv /proc/self/fd/1 /lib/udev/devices/stdout
    ln -sv /proc/self/fd/2 /lib/udev/devices/stderr
    ln -sv /proc/kcore /lib/udev/devices/core

    before_date=`date -R`

    #編譯
    make EXTRAS="`echo extras/*/`" || eval "echo \"error: make error in udev\" && exit 1"
    make DESTDIR=/ EXTRAS="`echo extras/*/`" install
    cp -v etc/udev/rules.d/[0-9]* /etc/udev/rules.d/
    cd udev-config-6.3
    make install
    make install-doc
    make install-extra-doc
    cd ..
    install -m644 -v docs/writing_udev_rules/index.html \
    /usr/share/doc/udev-113/index.html


    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R udev-113
}

build_util_linux()
{
    #檢測
    cd /sources

    check_file util-linux-2.12r.tar.bz2
    check_file util-linux-2.12r-cramfs-1.patch
    check_file util-linux-2.12r-lseek-1.patch
    check_dir util-linux-2.12r

    #解壓
    tar jxvf util-linux-2.12r.tar.bz2
    cd util-linux-2.12r

    #特殊
    sed -e 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
    -i $(grep -rl '/etc/adjtime' .)
    mkdir -pv /var/lib/hwclock

    #打補丁
    patch -Np1 -i ../util-linux-2.12r-cramfs-1.patch
    patch -Np1 -i ../util-linux-2.12r-lseek-1.patch

    before_date=`date -R`

    #編譯
    ./configure
    make HAVE_KILL=yes HAVE_SLN=yes || eval "echo \"error: make error in util_linux\" && exit 1"
    make HAVE_KILL=yes HAVE_SLN=yes install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #清理
    cd /sources/
    rm -f -R util-linux-2.12r
}

build_vim()
{
    #檢測
    cd /sources

    check_file vim-7.1.tar.bz2
    check_file vim-7.1-fixes-1.patch
    check_file vim-7.1-mandir-1.patch
    check_dir vim71

    #解壓
    tar jxvf vim-7.1.tar.bz2
    cd vim71

    #打補丁
    patch -Np1 -i ../vim-7.1-fixes-1.patch
    patch -Np1 -i ../vim-7.1-mandir-1.patch

    #特殊
    echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h

    before_date=`date -R`

    #編譯
    ./configure --prefix=/usr --enable-multibyte || eval "echo \"error: make error in vim\" && exit 1"
    make
    make install

    #計時
    after_date=`date -R`
    echo "$before_date"
    echo "$after_date"

    #特殊
    ln -sv vim /usr/bin/vi
    for L in "" fr it pl ru; do
    ln -sv vim.1 /usr/share/man/$L/man1/vi.1
    done
    ln -sv ../vim/vim71/doc /usr/share/doc/vim-7.1
    cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc

set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
  set background=dark
endif

" End /etc/vimrc
EOF

    #清理
    cd /sources/
    rm -f -R vim71
}

logout_comment()
{
    echo "****************"
    echo "run the fllowing command then logout"
    echo
    echo "# passwd root"
    echo "# logout"
    echo
    echo "****************"
}

before_date_sum=`date -R`

build_bzip2
build_diffutils
build_file
build_findutils
build_flex
build_grub
build_gawk
build_gettext
build_grep
build_groff
build_gzip
build_inetutils
build_iproute
build_kbd
build_less
build_make
build_man_db
build_mktemp
build_module_init_tools
build_patch
build_psmisc
build_shadow
build_sysklogd
build_sysvinit
build_tar
build_texinfo
build_udev
build_util_linux
build_vim

#計時
after_date_sum=`date -R`
echo "$before_date_sum"
echo "$after_date_sum"

logout_comment

build-lfs打包下載

網路資源

1. LFS官方網址
http://www.linuxfromscratch.org/

2. 手把手教你如何建立自己的Linux系統 第二版
http://www.[把這個方括弧去掉,代替成“將linux_sir中_去掉”的單詞,因為sir被和諧了]/bbs/thread322894.html

gnu lfs





[火星人 ] 自動化構建LFS系統已經有424次圍觀

http://coctec.com/docs/program/show-post-71606.html