Linux From Scratch 构建临时编译环境(一)
最新版本:lfslivecd-x86-6.3-r2160.iso
虚拟机版本:VMware Workstation 6.0.3 build-80004
export LFS=/mnt/lfs
mkdir -pv $LFS
mount /dev/sda2 $LFS
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
mkdir -v $LFS/tools
ln -sv $LFS/tools /
passwd lfs
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
su - lfs" -" 参数指示 su 开启一个登陆Shell(login shell)而不是非登陆Shell(non-login shell)
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='/u:/w/$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF
source ~/.bash_profile
cd $LFS/sources
tar xvf /lfs-sources/binutils-2.17.tar.bz2
cd binutils-2.17
Binutils 是一组开发工具,包括连接器、汇编器和其他用于目标文件和档案的工具。mkdir -v ../binutils-build
cd ../binutils-build
CC="gcc -B/usr/bin/" ../binutils-2.17/configure --prefix=/tools --disable-nls --disable-werror
make
make install
make -C ld clean
make -C ld LIB_PATH=/tools/lib
cp -v ld/ld-new /tools/bin
cd ..
rm -rf binutils-build
rm -rf binutils-2.17
GCC-4.0.3 - 第一遍
GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。tar xvf /lfs-sources/gcc-4.1.2.tar.bz2
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
make install
ln -vs gcc /tools/bin/cc
cd ..
rm -rf gcc-build
rm -rf gcc-4.1.2
Linux-Libc-Headers 包含了" 纯净的"内核头文件。tar xvf /lfs-sources/linux-2.6.22.5.tar.bz2
cd linux-2.6.22.5
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
cd ..
rm -rf linux-2.6.22.5
tar xvf /lfs-sources/glibc-2.5.1.tar.bz2
cd glibc-2.5.1
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
mkdir -v /tools/etc
touch /tools/etc/ld.so.conf
make install
cd ..
rm -rf glibc-build
rm -rf glibc-2.5.1
Glibc 包含了主要的C库。这个库提供了基本例程,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等等。
测试工具链的调整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'
如果输出大致如下
[Requesting program interpreter: /tools/lib/ld- linux.so.2]
则表示调整成功,因为所有的库已经连接到了/tools/lib下。
rm -rf a.out dummy.c
Tcl 软件包包含工具命令语言(Tool Command Language)tar xvf /lfs-sources/tcl8.4.15-src.tar.gz
cd tcl8.4.15/unix
./configure --prefix=/tools
make
make install
make install-private-headers
ln -sv tclsh8.4 /tools/bin/tclsh
cd $LFS/sources
tar xvf /lfs-sources/expect-5.43.0.tar.gz
cd expect-5.43
patch -Np1 -i /lfs-sources/expect-5.43.0-spawn-1.patch
cp configure{,.bak}
sed 's:/usr/local/bin:/bin:' configure.bak > configure
./configure --prefix=/tools --with-tcl=/tools/lib --with-tclinclude=/tools/include --with-x=no
make
make SCRIPTS="" install
cd $LFS/sources
tar xvf /lfs-sources/dejagnu-1.4.4.tar.gz
cd dejagnu-1.4.4
./configure --prefix=/tools
make install
cd ..
rm -rf tcl8.4.15
rm -rf expect-5.43
rm -rf dejagnu-1.4.4
Expect 软件包包含一个通过执行脚本对话框与其它交互式程序通信的工具
DejaGNU 软件包包含了一个测试其它程序的框架
GCC-4.0.3 - 第二遍
再次测试工具链的调整,以确保刚刚编译的gcc正确工作tar xvf /lfs-sources/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 /lfs-sources/gcc-4.1.2-specs-1.patch
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
make install
cd ..
rm -rf gcc-build
rm -rf gcc-4.1.2
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep 'tools'
如果输出大致如下
[Requesting program interpreter: /tools/lib/ld- linux.so.2]
则表示调整成功,因为所有的库已经连接到了/tools/lib下。
rm -rf a.out dummy.c
Binutils-2.16.1 - 第二遍
tar xvf /lfs-sources/binutils-2.17.tar.bz2
mkdir -v binutils-build
cd binutils-build
../binutils-2.17/configure --prefix=/tools --disable-nls /
--with-lib-path=/tools/lib
make
make install
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin
cd ..
rm -rf binutils-build
rm -rf binutils-2.17
Ncurses 提供独立于终端的字符终端处理库,含有功能键定义(快捷键)、屏幕绘制以及基于文本终端的图形互动功能tar xvf /lfs-sources/ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --prefix=/tools --with-shared --without-debug --without-ada --enable-overwrite
make
make install
cd ..
rm -rf ncurses-5.6
Bash 是 Bourne-Again Shell 的缩写,它在 UNIX 系统中作为 shell 被广泛使用tar xvf /lfs-sources/bash-3.2.tar.gz
cd bash-3.2
patch -Np1 -i /lfs-sources/bash-3.2-fixes-5.patch
./configure --prefix=/tools --without-bash-malloc
make
make install
ln -vs bash /tools/bin/sh
cd ..
rm -rf bash-3.2
Bzip2 包含了对文件进行压缩和解压缩的工具,对于文本文件, bzip2 比传统的 gzip 拥有更高压缩比tar xvf /lfs-sources/bzip2-1.0.4.tar.gz
cd bzip2-1.0.4
make
make PREFIX=/tools install
cd ..
rm -rf bzip2-1.0.4
Coreutils 软件包包括一整套用于显示和设置基本系统特征的工具tar xvf /lfs-sources/coreutils-6.9.tar.bz2
cd coreutils-6.9
./configure --prefix=/tools
make
make install
cp -v src/su /tools/bin/su-tools
cd ..
rm -rf coreutils-6.9
Diffutils 软件包里的程序可以向你显示两个文件或目录的差异,常用来生成软件的补丁tar xvf /lfs-sources/diffutils-2.8.1.tar.gz
cd diffutils-2.8.1
./configure --prefix=/tools
make
make install
cd ..
rm -rf diffutils-2.8.1
Findutils 软件包包含查找文件的工具,既能即时查找(递归的搜索目录,并可以显示、创建和维护文件),也能在数据库里查找(通常比递归查找快但是在数据库没有及时更新的情况下,结果并不可靠)tar xvf /lfs-sources/findutils-4.2.31.tar.gz
cd findutils-4.2.31
./configure --prefix=/tools
make
make install
cd ..
rm -rf findutils-4.2.31
Gawk 是一个处理文本文件的工具包tar xvf /lfs-sources/gawk-3.1.5.tar.bz2
cd gawk-3.1.5
./configure --prefix=/tools
cat >> config.h << "EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF
make
make install
cd ..
rm -rf gawk-3.1.5
Gawk 是一个处理文本文件的工具包tar xvf /lfs-sources/gettext-0.16.1.tar.gz
cd gettext-0.16.1
cd gettext-tools
./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp -v src/msgfmt /tools/bin
cd $LFS/sources
rm -rf gettext-0.16.1
Grep 可以按指定的匹配模式搜索文件中的内容tar xvf /lfs-sources/grep-2.5.1a.tar.bz2
cd grep-2.5.1a
./configure --prefix=/tools --disable-perl-regexp
make
make install
cd ..
rm -rf grep-2.5.1a
Gzip 软件包包含了压缩和解压文件的程序tar xvf /lfs-sources/gzip-1.3.12.tar.gz
cd gzip-1.3.12
./configure --prefix=/tools
make
make install
cd ..
rm -rf gzip-1.3.12
Make 软件包包含一个编译软件包的程序tar xvf /lfs-sources/make-3.81.tar.bz2
cd make-3.81
./configure --prefix=/tools
make
make install
cd ..
rm -rf make-3.81
Patch 软件包包含一个根据补丁文件来修改原文件的程序。补丁文件通常是用 diff 程序创建的tar xvf /lfs-sources/patch-2.5.4.tar.gz
cd patch-2.5.4
./configure --prefix=/tools
make
make install
cd ..
rm -rf patch-2.5.4
Perl 是 Practical Extraction and Report Language的缩写。Perl 将 C, sed, awk 和 sh 的最佳特性集于一身,是一种强大的编程语言tar xvf /lfs-sources/perl-5.8.8.tar.bz2
cd perl-5.8.8
patch -Np1 -i /lfs-sources/perl-5.8.8-libc-2.patch
./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
make perl utilities
cp -v perl pod/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.8.8
cp -Rv lib/* /tools/lib/perl5/5.8.8
cd ..
rm -rf perl-5.8.8
sed 是一个流编辑程序,在一个输入流(从一个文件或者一个管道的输入)上进行基本的文本编辑操作tar xvf /lfs-sources/sed-4.1.5.tar.gz
cd sed-4.1.5
./configure --prefix=/tools
make
make install
cd ..
rm -rf sed-4.1.5
Tar 软件包含有一个归档程序,用来保存文件到归档文件或者从给定的 tar 归档文件中释放文件tar xvf /lfs-sources/tar-1.18.tar.bz2
cd tar-1.18
./configure --prefix=/tools
make
make install
cd ..
rm -rf tar-1.18
Texinfo 软件包包含读取、写入和转换 Info 文档的程序,以提供系统文档tar xvf /lfs-sources/texinfo-4.9.tar.bz2
cd texinfo-4.9
./configure --prefix=/tools
make
make install
cd ..
rm -rf texinfo-4.9
Util- linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理驱动器,以及打开 tty 端口和处理消息
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{info,man}
exit
chown -R root:root $LFS/tools
这时可以用vmware 做一个snapshot
菜单VM->snapshot->take snapshot
这样在以后 出错时 可以从这个点恢复
http://www.linuxfromscratch.org/lfs/view/stable/
http://lamp.linux.gov.cn/Linux/LFS-6.2/index.html
http://blog.chinaunix.net/u/13265/showart.php?id=477122