所有文档和软件包已经上传到fdl兄的ftp:
ftp://linuxsir:linuxsir@218.5.64.133
现在在upload的pure lfs目录里。
我使用的文档:
Pure lfs 1.0 (http://lfs.cosoft.org.cn/plfs)
lfs-20030219 (http://lfs.cosoft.org.cn)
01-buildscripts-2.2.6(http://www.linuxsir.com/bbs/attachm...p?postid=165148)
先是按照build-init-2.2.6.sh脚本里所使用的软件包版本号下载,下载的地址可以到freshmeat.net上搜。由于我将使用coreutils,所以就没有下载 fileutils, sh-utils 和 textutils.又到http://www.linuxfromscratch.org/~greg
那里下载了所有补丁。
详细的版本:
BINUTILS_VER=2.13.2.1(还下了2.13.90.0.18和2.13.2)
GCC_VER=3.2.2(还下了一个2.95.3的)
KERNEL_VER=2.4.20
GLIBC_VER=2.3.2(以及配套的linux-threads)
ZLIB_VER=1.1.4
GAWK_VER=3.1.1
COREUTILS_VER=4.5.9
BZIP2_VER=1.0.2
GZIP_VER=1.3.3
DIFFUTILS_VER=2.8.1
FINDUTILS_VER=4.1.7(如果是4.1版,还需要findutils-4.1.patch,在http://downloads.linuxfromscratch.org/)
BISON_VER=1.875
FLEX_VER=2.5.27
M4_VER=1.4
MAKE_VER=3.80
GREP_VER=2.5.1
SED_VER=4.0.5
GETTEXT_VER=0.11.5
NCURSES_VER=5.3
PATCH_VER=2.5.4
TAR_VER=1.13(还需要一个补丁,tar-1.13.patch,在http://downloads.linuxfromscratch.org/)
TEXINFO_VER=4.5(脚本里是用的4.3,我没找到,又懒得patch -R,就用了4.5的)
BASH_VER=2.05b
UTILLINUX_VER=2.11z
PERL_VER=5.8.0
TCL_VER=8.4.2
EXPECT_VER=5.38
DEJAGNU_VER=1.4.3
MAKEDEV_VER=1.7
然后是创建分区,创建文件系统(reiserfs),分区加载到/mnt/plfs。创建文件系统的命令可以参考blfs文档章 5. 文件系统的安装reiserfsprogs的内容(应该都装了吧),安装了以后:
mkreiserfs /dev/hdx
添加lfs用户后,按照pure lfs文档里的内容来创建$LFS/stage1:
mkdir $LFS/stage1
chown lfs $LFS/stage1
ln -s $LFS/stage1 /
我建立了$LFS/stage1目录,把源码和补丁都拷贝进去,又把源码的所有者改成lfs用户:
chown -R lfs /mnt/plfs/stage1/
然后就切换到lfs用户:
su - lfs
又设置lfs用户的环境变量:
cat > ~/.bash_profile << "EOF"
set +h
umask 022
LFS=/mnt/plfs
LC_ALL=POSIX
LDFLAGS="-s"
PATH=/stage1/bin:$PATH
unset LANG CFLAGS CXXFLAGS CC
export LFS LC_ALL LDFLAGS PATH
EOF
source ~/.bash_profile
上面的内容里,我加了一行unset命令,主要是用来去掉我系统里的影响,因为我在系统里是设置了这几个变量的,如果不unset,有可能影响到pure lfs的编译。这里不用优化的,因为没有这个必要,现在编译的包,只有binutils,gcc和glibc在最后的系统里用到,而这几个包最好不要用优化。在脚本里有两个设置:
unset LD_LIBRARY_PATH
unset LD_PRELOAD
我在lfs用户下echo了一下,这两个变量并没有值,所以就没加上。
脚本里还有关于时区和locale的设置,我都没有设。
下面就开始安装了。
在主系统里安装tcl,expect和dejagnu。这是为了测试静态的binutils和gcc,并且,在装了这三个包以后,第五章所有的测试都可以用它们来完成。
这三个包的安装很简单,都是:
./configure --prefix=/usr &&
make &&
make install
其中expect要先打一个补丁。在文档里说:额外的注意事项 - 你必须加载了/dev/pts(或使用devfs)才能让dejagnu测试套件工作正常。
所以我进/dev/pts里看了一下,有0,1两个终端,挺正常的。
第五章 - 安装 binutils - Pass 1 (静态)
这一步有一些周折,看完了再装。
我首先看了一下脚本(init)里的check-binutils函数。它主要是测试三个变量是否应该设置上,还可能做一处修改(下面的第三处)。
然后尝试安装2.13.90.0.18:
手动做check-binutils里面的测试:
grep configure-host Makefile.in > /dev/null 2>&1 &&
export BINUTILS_CONF_HOST=Y ||
export BINUTILS_CONF_HOST=N
echo -e " o Requires 'make configure-host' ........... ${BINUTILS_CONF_HOST}"
grep with-lib-path ld/configure > /dev/null 2>&1 &&
export BINUTILS_WITH_LIB_PATH=Y ||
export BINUTILS_WITH_LIB_PATH=N
echo -e " o Has '--with-lib-path=' configure option .. ${BINUTILS_WITH_LIB_PATH}\n"
grep "GENSCRIPTS = LIB_PATH" ld/Makefile.in > /dev/null 2>&1 ||
{
echo " o adding 'LIB_PATH = \$(LIB_PATH)' to GENSCRIPTS definition"
echo " in ld/Makefile.in"
echo " ( Passes value of LIB_PATH to genscripts.sh environment"
echo -e " for ldscript creation. )\n"
}
前两步测试的结果都把变量设置成Y了,记住这两个变量的值,以后会用到。第三步测试的结果是不用修改。 如果要修改,命令应该是:
test -f ld/Makefile.in-ORIG ||
cp ld/Makefile.in ld/Makefile.in-ORIG
cd ld
sed 's@GENSCRIPTS = \$\(SHELL\)@GENSCRIPTS = LIB_PATH=\$\(LIB_PATH\) @g' Makefile.in-ORIG > Makefile.in
然后开始编译:
mkdir ../binutils-static-build &&
cd ../binutils-static-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/stage1 --disable-nls | tee mybinutils.log
注意上面的命令里有通配符。如果有两个目录都符合,就麻烦了。
这时候出错了:
checking for i686-pc-linux-gnu-ar... no
后面一串都是no
换版本。换了2.13.2.1,重复上面的测试,前两个是N,后一个要修改。可是我的LIB_PATH变量是空的啊!不管,先做了再说。用了修改命令后,查看一下ld/Makefile.in,发现没有改过来,只好手动来改,找到:
GENSCRIPTS = $(SHELL)
只有一处,改成:
@GENSCRIPTS = LIB_PATH=$(LIB_PATH)
再编译:
mkdir ../binutils-static-build &&
cd ../binutils-static-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/stage1 --disable-nls | tee mybinutils.log &&
make LDFLAGS="-all-static -s" &&
make check &&
make install
因为BINUTILS_CONF_HOST=N,就不用make configure-host了。make check也顺利通过。
下面是为了以后做准备:
cd ld &&
make clean &&
make LIB_PATH=/stage1/lib
第五章 - 安装 gcc - Pass 1 (静态)
我用的是完整的大包,而不是gcc-core。
运用gcc-3.2.2.mmap_test补丁,但不运用nofixincludes补丁,而是用命令来代替:
cd gcc
test -f Makefile.in-ORIG ||
cp Makefile.in Makefile.in-ORIG
grep -Ev '(README| ./fixinc.sh )' Makefile.in-ORIG | sed 's@LIBGCC2_DEBUG_CFLAGS = -g@LIBGCC2_DEBUG_CFLAGS =@g' > Makefile.in
用diff命令看了一下,修改的确做了。
我又用了gcc-3.2.2.libgcc_no_debug.patch补丁,没用上,说是已经改过了,看了一下,的确在上面的sed命令里改的就是这个,所以没有必要用它了。
编译:
mkdir ../gcc-static-build &&
cd ../gcc-static-build &&
CFLAGS="-O2 -pipe" ../gcc-3*/configure --prefix=/stage1 --with-local-prefix=/stage1 --enable-languages=c --disable-nls --enable-shared &&
make BOOT_LDFLAGS="-static -s" BOOT_CFLAGS="-O2 -pipe" STAGE1_CFLAGS="-pipe" bootstrap &&
make -k check | tee mygcccheck.log
make install &&
ln -sf gcc /stage1/bin/cc
上面make -k check的结果是:
# of expected passes 18919
# of expected failures 68
# of unsupported tests 44
算是通过了吧。
闲话:
看了一下config.cache,里面有:
gcc_cv_as_hidden="yes"
应该不会有那个gcc不能认大于三位版本号的binutils的bug了。
又仔细看了一下gcc目录下configure文件,和以前的相比,多了一项,也就是能认四位版本号的了,但是5位的怎么办呢?下面两个命令,第一个是gcc-3.2.2里面的,没错,第二个是gcc-3.2.1里面的,不行。
ld_vers=`echo $ld_ver | sed -n 's,^.*[ ]\([0-9][0-9]*\.[0-9][0-9]*\(\|\.[0-9][0-9]*\(\|\.[0-9][0-9]*\)\)\)\([ ].*\|\)$,\1,p'`
d_vers=`echo $ld_ver | sed -n 's,^.*[ ]\([0-9][0-9]*\.[0-9][0-9]*\(\|\.[0-9][0-9]*\)\)\([ ].*\|\)$,\1,p'`
ld_date=`echo $ld_ver | sed -n 's,^.*\([2-9][0-9][0-9][0-9]\)[-]*\([01][0-9]\)[-]*\([0-3][0-9]\).*$,\1\2\3,p'`
第五章 - 安装内核头文件
这里同时安装第五章和第六章的内核头文件,在第六章就不用再安装了。
make mrproper &&
make include/linux/version.h &&
make symlinks &&
for destdir in /stage1 ${LFS}/usr; do
mkdir -p ${destdir}/include/asm
yes | cp include/asm/* ${destdir}/include/asm
yes | cp -R include/asm-generic ${destdir}/include
yes | cp -R include/linux ${destdir}/include
touch ${destdir}/include/linux/autoconf.h
done
这里要注意一下,就是我是用lfs用户来安装的,而脚本里是用root,所以这里就要把$LFS的所有者改成lfs,要不然不能创建$LFS/usr目录。
第五章 - 安装 glibc
PLFS最大的包。要进到glibc-2.3.2目录里,再解压linuxthreads:
cd glibc-2.3.2 &&
tar jxvf ../glibc-linuxthreads-2.3.2.tar.bz2
编译:
mkdir -p /stage1/etc &&
touch /stage1/etc/ld.so.conf &&
mkdir ../glibc-init-build &&
cd ../glibc-init-build &&
CFLAGS="-O2 -pipe" ../glibc-2*/configure --prefix=/stage1 --enable-add-ons --disable-profile --with-binutils=/stage1/bin --with-headers=/stage1/include --without-gd &&
make &&
make check
在这里出错了,是文档里说过的libio/tst-atime错误,我用的是reiserfs分区,用的是defaults参数加载,后来用了defaults,atime参数加载,过了这一步。
又出了一个错误,是grp/testgrp.out,先用-k,看看全部结果再说:
make -k check | tee mytest.log
同时查看了一下glibc-init-build/grp/testgrp.out,发现出错的原因是我的lfs用户没有用户组,100用户组没定义,于是在/etc/group里面加了lfs组的定义,在/etc/passwd里把lfs用户的组改成这个,又把$LFS分给lfs.lfs,然后继续测试。
这一次测试通过,顺利进入下一步,安装!
make install &&
mkdir -p /stage1/lib/locale &&
localedef -i de_DE -f ISO-8859-1 de_DE &&
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro &&
localedef -i en_HK -f ISO-8859-1 en_HK &&
localedef -i en_PH -f ISO-8859-1 en_PH &&
localedef -i en_US -f ISO-8859-1 en_US &&
localedef -i es_MX -f ISO-8859-1 es_MX &&
localedef -i fr_FR -f ISO-8859-1 fr_FR &&
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro &&
localedef -i it_IT -f ISO-8859-1 it_IT &&
localedef -i ja_JP -f EUC-JP ja_JP &&
localedef -i zh_CN -f GB2312 zh_CN.GB2312 &&
localedef -i zh_CN -f GB2312 zh_CN &&
localedef -i zh_CN -f GBK zh_CN.GBK &&
localedef -i zh_TW -f BIG5 zh_TW.Big5 &&
localedef -i zh_CN -f GB18030 zh_CN.GB18030 &&
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
第五章 5 - "锁定" 我们的新glibc
这里应该就是pure lfs的精髓了。
ldscripts:
cd ld && make install-data-local
specs:
export SPECFILE=/stage1/lib/gcc-lib/i686-pc-linux-gnu/*/specs &&
cp ${SPECFILE} ./XX &&
sed -e 's@/lib/ld-linux.so.2@/stage1/lib/ld-linux.so.2@g' -e 's@/lib/ld.so.1@/stage1/lib/ld.so.1@g' -e 's@/lib64/ld-linux.so.2@/stage1/lib64/ld-linux.so.2@g' -e 's@/lib64/ld.so.1@/stage1/lib64/ld.so.1@g' ./XX > ${SPECFILE} &&
unset SPECFILE &&
rm -f ./XX
注意上面的sed命令是脚本里的,比文档里的多了三个东东。在我的机子上,后三个命令并没有作用,我想可能是给其他架构的计算机准备的。
下面的命令是为了gcc做准备:
export ARCH=i386
第五章 - 安装 tcl, expect 和 dejagnu
由于我在主系统里安装了这三个包,所以这里就先不装了,而是放在第五章的最后来装。
第五章 - 安装 gcc - Pass 2 (共享)
首先我删除了上次解压的gcc-3.2.2目录。
与上一次安装gcc前的准备差不多,运用gcc-3.2.2.mmap_test补丁,但不运用nofixincludes补丁,而是用命令来代替:
cd gcc
test -f Makefile.in-ORIG ||
cp Makefile.in Makefile.in-ORIG
grep -Ev '(README| ./fixinc.sh )' Makefile.in-ORIG | sed 's@LIBGCC2_DEBUG_CFLAGS = -g@LIBGCC2_DEBUG_CFLAGS =@g' > Makefile.in
上面的sed命令里包含了gcc-3.2.2.libgcc_no_debug.patch的内容,所以就只用gcc-3.2.2.libstdc++_no_debug.patch就行了。其实脚本里也有一个sed命令是干这个的,是:
cd libstdc++-v3
test -f configure-ORIG ||
cp configure configure-ORIG
sed s@DEBUG_FLAGS='-g'@DEBUG_FLAGS=''@g configure-ORIG > configure
不过我用的是补丁。两种方法是一样的。
下面就到文档里说的使用gcc-3*.specs.patch了,脚本里的命令如下:
cd gcc/config/${ARCH}
for hfile in linux.h linux64.h; do
if [ -f ${hfile} ]; then
if [ ! -f ${hfile}-ORIG ]; then
cp ${hfile} ${hfile}-ORIG
fi
sed -e 's@-dynamic-linker /lib/ld-linux.so.2@-dynamic-linker /stage1/lib/ld-linux.so.2@g' -e 's@-dynamic-linker /lib/ld.so.1@-dynamic-linker /stage1/lib/ld.so.1@g' -e 's@-dynamic-linker /lib64/ld-linux.so.2@-dynamic-linker /stage1/lib64/ld-linux.so.2@g' -e 's@-dynamic-linker /lib64/ld.so.1@-dynamic-linker /stage1/lib64/ld.so.1@g' ${hfile}-ORIG > ${hfile}
fi
done
这里要注意了,因为在网站上只找到gcc-3.2.1.specs.patch,没有gcc-3.2.2的,所以就只有用命令来做。使用了上面的命令后,最好看一下linux.h文件有没有变。linux64.h我用不到,就没看它了。
编译:
mkdir ../gcc-init-build &&
cd ../gcc-init-build &&
CFLAGS="-O2 -pipe" CXXFLAGS="-O2 -pipe" ../gcc-3*/configure --prefix=/stage1 --with-local-prefix=/stage1 --enable-languages=c,c++ --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-version-specific-runtime-libs &&
make LDFLAGS="-s"
上面是脚本里的设置参数,与文档里的有两个不同,一个是少了--enable-clocale=gnu,另外还多了--enable-version-specific-runtime-libs
设置时有了checking assembler hidden support... yes,就放心了。
测试:
make -k check | tee mygccpass2test.log
libstdc++的测试结果:
=== libstdc++-v3 Summary ===
# of expected passes 432
# of unexpected failures 1
# of unexpected successes 26
和脚本里写的一样,正确了。真正关键的应该是下面两个:
gcc的测试结果:
=== gcc Summary ===
# of expected passes 18919
# of expected failures 68
# of unsupported tests 44
没有unexpected passes或failures,也正确了。
g++的测试结果:
XPASS: g++.other/init5.C Execution test
=== g++ Summary ===
# of expected passes 7368
# of unexpected successes 1
# of expected failures 88
# of untested testcases 9
# of unsupported tests 3
有一个unexpected successes,也是和脚本里说的一样的,OK!
安装:
make install
test -L /stage1/bin/cc || ln -s gcc /stage1/bin/cc
由于上面使用了--enable-version-specific-runtime-libs,下面还要做一步:
echo "/stage1/lib/gcc-lib/i686-pc-linux-gnu/3.2.2" >> /stage1/etc/ld.so.conf
/stage1/sbin/ldconfig
Chapter 5 - Installing binutils - Pass 2 (Shared)
首先删除了上次解压的binutils-2.13.2.1目录。这里要用到前面测试过的BINUTILS_WITH_LIB_PATH了,因为上面是N(如果记不住了,可以再做一次测试命令,看看这几个变量的值应该是多少),所以configure参数里不能用--with-lib-path,要麻烦一点,在configure后手动来修改ld/Makefile并手动设置LIB_PATH,总算明白上面的用意了。这里是和文档里说的不一样的地方。
配置:
mkdir ../binutils-init-build &&
cd ../binutils-init-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/stage1 --enable-shared
用来修改Makefile的命令:
test ! -f ld/Makefile-ORIG &&
mv ld/Makefile ld/Makefile-ORIG
# Set LIB_PATH
sed 's@^LIB_PATH = @LIB_PATH = /stage1/lib@g' ld/Makefile-ORIG > ld/Makefile
make LDFLAGS="-s"
make -k check
make install
为第六章做准备:
cd ld &&
make clean &&
make LIB_PATH=/lib:/usr/lib
上面两个目录的次序和文档里不一样,觉得没什么关系。
下面是为了第五章剩下的包做准备:
unset LD_LIBRARY_PATH
unset LD_PRELOAD
export PATH=/stage1/bin:/stage1/sbin:${OLDPATH}
ldconfig
上面那个OLDPATH是没有/stage1/bin和/stage1/sbin的主系统路径。
对工具链的总结:一个是ldscripts,一个是gcc的specs,这两个是关键,还有就是路径的控制。在出了问题的时候,多看一下,是不是正确的应用了补丁,是不是正确改变了脚本或Makefile,这都是容易出问题的地方。
安装第五章剩下的软件包:
### ZLIB ###
打了zlib-${ZLIB_VER}-2-vsnprintf补丁。
CFLAGS="-O2 -pipe" CPPFLAGS="-DHAS_vsnprintf" ./configure --prefix=/stage1 &&
LDFLAGS='' make &&
make test &&
make install &&
mkdir -p /stage1/share/man/man3 &&
cp zlib.3 /stage1/share/man/man3 &&
ldconfig
### GAWK ###
下面的这个编译命令是以下包缺省的编译命令。
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 &&
make LDFLAGS="-s" &&
make check &&
make install
### COREUTILS ###
### BZIP2 ###
make -f Makefile-libbz2_so &&
make LDFLAGS="-s" &&
make check &&
make PREFIX=/stage1 install &&
yes | cp bzip2-shared /stage1/bin/bzip2 &&
ln -s libbz2.so.1.0 libbz2.so &&
cp -a libbz2.so* /stage1/lib &&
rm -f /stage1/bin/{bunzip2,bzcat} &&
ln -s bzip2 /stage1/bin/bunzip2 &&
ln -s bzip2 /stage1/bin/bzcat &&
ldconfig
### GZIP ###
安装后还要移动一下二进制文件的位置。
rm -f /stage1/bin/{gunzip,zcat} &&
ln -s gzip /stage1/bin/gunzip &&
ln -s gzip /stage1/bin/zcat &&
ln -s gunzip /stage1/bin/uncompress
### DIFFUTILS ###
### FINDUTILS ###
我的版本是4.1.7,不用补丁。如果是4.1,就要用。
### M4 ###
### BISON ###
要做yacc的文件。
test -f /stage1/bin/yacc ||
cat > /stage1/bin/yacc << "EOF"
#!/bin/sh
# Begin /stage1/bin/yacc
exec /stage1/bin/bison -y "$@"
# End /stage1/bin/yacc
EOF
chmod 755 /stage1/bin/yacc
### FLEX ###
还要做lex文件。
cat > /stage1/bin/lex << "EOF"
#!/bin/sh
# Begin /stage1/bin/lex
exec /stage1/bin/flex -l "$@"
# End /stage1/bin/lex
EOF
chmod 755 /stage1/bin/lex
### MAKE ###
下面两个是脚本里的,第一个不执行,第二个执行。
#chgrp root /usr/bin/make &&
chmod 755 /stage1/bin/make
### GREP ###
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 --disable-perl-regexp --with-included-regex &&
make LDFLAGS="-s" &&
chmod 750 ./tests/*
make check
make install
### SED ###
### GETTEXT ###
可选:
rm -f /stage1/lib/gettext/gnu.gettext.*
因为我的机子上没有java编译器,所以也就不用执行这一步。
### NCURSES ###
cd c++
if [ ! -f ./cursesw.h-ORIG ]; then
mv ./cursesw.h ./cursesw.h-ORIG
fi
sed 's/include <strstream.h>/include <sstream>/g' ./cursesw.h-ORIG > ./cursesw.h
cd ..
./configure --prefix=/stage1 --with-shared --without-debug &&
make &&
make install
chmod 755 /stage1/lib/*.${NCURSES_VER} &&
ln -s libncurses.a /stage1/lib/libcurses.a
ln -sf /stage1/lib/libncurses.so.5 /stage1/lib/libcurses.so
ldconfig
### PATCH ###
CPPFLAGS=-D_GNU_SOURCE CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 &&
make LDFLAGS="-s" &&
make check &&
make install
### TAR ###
因为是1.13版的,用了一个patch
### TEXINFO ###
make TEXMF=/stage1/share/texmf install-tex
## BASH ###
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 --with-curses &&
make LDFLAGS="-s" &&
make tests &&
make install
cd /stage1/bin
ln -s /stage1/bin/bash /stage1/bin/sh
### UTIL-LINUX ###
CFLAGS="-O2 -pipe" ./configure &&
make -C lib &&
make -C mount LDFLAGS=-static mount umount &&
cp mount/{mount,umount} /stage1/bin
### Perl ###
cd hints
if [ ! -f linux.sh-ORIG ]; then
cp linux.sh linux.sh-ORIG
fi
chmod u+w linux.sh # For those not running as a root user
sed 's@/lib/libc.so.6@/stage1/lib/libc.so.6@g' linux.sh-ORIG | sed 's@libc=/lib/\$libc@libc=/stage1/lib/\$libc@g' > linux.sh
echo "locincpth=""
loclibpth=""
glibpth="/stage1/lib"
static_ext="IO re Fcntl"" >> linux.sh
编译和安装:
./configure.gnu --prefix=/stage1 -Doptimize='-O2 -pipe' &&
make perl &&
make utilities &&
cp perl /stage1/bin/perl &&
cp pod/pod2man /stage1/bin &&
mkdir -p /stage1/lib/perl5/5.8.0 &&
cp -R lib/* /stage1/lib/perl5/5.8.0
#
# Optional ancillary test packages
#
tcl:
cd unix &&
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 &&
make LDFLAGS="-s" &&
make test &&
make install
安装后,要创建一个符号链接:
TCLSH=$(basename $(find /stage1/bin -type f -name tclsh\*))
test "tclsh" != "${TCLSH}" &&
ln -s ./${TCLSH} /stage1/bin/tclsh
expect:
打补丁。
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 --with-tcl=/stage1/lib --with-x=no --disable-symbols --cache-file=/dev/null &&
make LDFLAGS="-s" &&
make test &&
make install
dejagnu:
./configure --prefix=/stage1 &&
make &&
make install
后面的内容,应该属于第六章了,不过在第五章的脚本里。
切换用户为root,看一下$LFS对不对:
echo $LFS
为chroot做准备:
改变$LFS的所有者:
chown -R root:root ${LFS}
创建目录:
mkdir -p ${LFS}/{bin,boot,dev/pts,etc/opt,home,lib,mnt,proc}
mkdir -p ${LFS}/{root,sbin,tmp,usr/local,var,opt}
for dirname in ${LFS}/usr ${LFS}/usr/local
do
# Apparently not FHS compliant but without these LFS breaks (RO)
mkdir -p $dirname/{bin,etc,include,lib,sbin,share,src}
ln -sf share/{man,doc,info} $dirname
# More FHS compliant but breaks LFS builds
#mkdir -p $dirname/{bin,include,lib,sbin,share,src}
mkdir -p $dirname/share/{dict,doc,info,locale,man}
mkdir -p $dirname/share/{nls,misc,terminfo,zoneinfo}
mkdir -p $dirname/share/man/man{1,2,3,4,5,6,7,8}
done
mkdir ${LFS}/usr/local/games
ln -sf share/man ${LFS}/usr/local
mkdir -p ${LFS}/var/{lock,log,mail,run,spool} &&
mkdir -p ${LFS}/var/{tmp,opt,cache,lib/misc,local} &&
mkdir -p ${LFS}/opt/{bin,doc,include,info} &&
mkdir -p ${LFS}/opt/{lib,man/man{1,2,3,4,5,6,7,8}} &&
创建几个空文件:
touch ${LFS}/var/run/utmp ${LFS}/var/log/{btmp,lastlog,wtmp} &&
chmod 644 ${LFS}/var/run/utmp ${LFS}/var/log/{btmp,lastlog,wtmp}
设置目录属性:
chmod 0750 ${LFS}/root &&
chmod 1777 ${LFS}/tmp ${LFS}/var/tmp
创建无数的符号链接:
# setup bash symlinks
ln -sf ../stage1/bin/bash ${LFS}/bin
ln -s bash ${LFS}/bin/sh
# Required for glibc build
# Add pwd symlink
ln -sf ../stage1/bin/pwd ${LFS}/bin
# Add perl symlink
ln -sf ../../stage1/bin/perl ${LFS}/usr/bin
# added for glibc make check
ln -sf ../stage1/bin/cat ${LFS}/bin
# added for binutils ar test
# stty
ln -sf ../stage1/bin/stty ${LFS}/bin
# gettext symlinks
ln -sf ../../stage1/bin/msgfmt ${LFS}/usr/bin
ln -sf ../../stage1/bin/xgettext ${LFS}/usr/bin
ln -sf ../../stage1/bin/msgmerge ${LFS}/usr/bin
# install
ln -sf ../../stage1/bin/install ${LFS}/usr/bin
ln -sf ../usr/bin/install ${LFS}/bin
# Added for ch6 findutils locate tests
# (May have missed some, may be extras)
ln -sf ../stage1/bin/echo ${LFS}/bin
ln -sf ../stage1/bin/sed ${LFS}/bin
ln -sf ../stage1/bin/awk ${LFS}/bin
ln -sf ../stage1/bin/rm ${LFS}/bin
ln -sf ../stage1/bin/mv ${LFS}/bin
ln -sf ../stage1/bin/chmod ${LFS}/bin
ln -sf ../stage1/bin/chgrp ${LFS}/bin
root用户名和密码:
if [ ! -f ${LFS}/etc/passwd ]; then
# Our new root user will be called "root".
echo "root:x:0:0:root:/root:/bin/bash" > ${LFS}/etc/passwd
echo "nobody:x:65534:65534:nobody:/home:/bin/true" >> ${LFS}/etc/passwd
fi
test `id -u` = 0 && grep "^${ROOTUSER}:" /etc/shadow | head -n1 | sed "s:^${ROOTUSER}\::root\::g" > ${LFS}/etc/shadow
创建$LFS//etc/group:
if [ ! -f ${LFS}/etc/group ]; then
cat > ${LFS}/etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
floppy:x:6:
disk:x:7:
lp:x:8:
dialout:x:9:
audio:x:10:
wheel:x:11:
users:x:100:
nogroup:x:65534:
EOF
fi
创建nsswitch.conf文件:
cat > ${LFS}/etc/nsswitch.conf << "EOF"
#
# /etc/nsswitch.conf
#
passwd: files
shadow: files
group: files
hosts: files dns
EOF
拷贝为NSS服务的文件:
test -f /etc/resolv.conf &&
{
cp /etc/resolv.conf ${LFS}/etc &&
chmod 644 ${LFS}/etc/resolv.conf
}
NSSFILES="ethers netmasks networks protocols rpc services netgroup automount aliases"
for nssfile in ${NSSFILES}; do
test -e /etc/${nssfile} && cp /etc/${nssfile} ${LFS}/etc &&
# fix permissions, if executable bit was set before copying:
chmod 644 ${LFS}/etc/${nssfile} &&
echo "${nssfile}: files" >> ${LFS}/etc/nsswitch.conf
done
如果是devfs,还要做一步,我不是,就不看它了。
chroot命令:
chroot ${LFS} /stage1/bin/env -i HOME=/root TERM=$TERM PS1='[\u@\h \W]\$ ' PATH=/sbin:/bin:/usr/sbin:/usr/bin:/stage1/sbin:/stage1/bin LDFLAGS="-s" /bin/bash --login
经过了一番烦琐的工作,顺利进入第六章。
在这里,我基本上按照脚本来做,为了方便以后再进入chroot环境,我在另外的shell里建立了一个$LFS/etc/chrootsettings文件(主要是因为在chroot下还没有vi可以用),以后进了chroot,就source一下这个文件,设置就都有了。文件内容如下:
set +h
umask 022
export LC_ALL=POSIX
unset LD_LIBRARY_PATH
unset LD_PRELOAD
export LDFLAGS="-s"
mount proc /proc -t proc
cp -f /proc/mounts /etc/mtab && chmod 644 /etc/mtab
DEVPTS=`cat /proc/mounts | cut -d\ -f3 | grep "^devpts$"`
test -z "${DEVPTS}" && DEVPTS=N || DEVPTS=Y
export DEVPTS # for later usage
test Y = "${DEVPTS}" && mount devpts /dev/pts -t devpts
下面是用MAKEDEV创建设备:
cd /dev &&
cp /stage1/src/MAKEDEV* ./ &&
bunzip2 MAKEDEV* &&
chmod 754 MAKEDEV* &&
./MAKEDEV* -v generic-nopty
第六章 - 安装 glibc
删除上次用过的源码,再解压。别忘了linuxthreads
touch /etc/ld.so.conf &&
mkdir ../glibc-final-build &&
cd ../glibc-final-build &&
CFLAGS="-O2 -pipe" ../glibc-2*/configure --prefix=/usr --enable-add-ons --disable-profile --libexecdir=/usr/bin --with-headers=/usr/include --mandir=/usr/share/man --infodir=/usr/share/info &&
make &&
make check &&
make install &&
mkdir -p /usr/lib/locale &&
localedef -i de_DE -f ISO-8859-1 de_DE &&
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro &&
localedef -i en_HK -f ISO-8859-1 en_HK &&
localedef -i en_PH -f ISO-8859-1 en_PH &&
localedef -i en_US -f ISO-8859-1 en_US &&
localedef -i es_MX -f ISO-8859-1 es_MX &&
localedef -i fr_FR -f ISO-8859-1 fr_FR &&
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro &&
localedef -i it_IT -f ISO-8859-1 it_IT &&
localedef -i ja_JP -f EUC-JP ja_JP &&
localedef -i zh_CN -f GB2312 zh_CN.GB2312 &&
localedef -i zh_CN -f GB2312 zh_CN &&
localedef -i zh_CN -f GBK zh_CN.GBK &&
localedef -i zh_TW -f BIG5 zh_TW.Big5 &&
localedef -i zh_CN -f GB18030 zh_CN.GB18030 &&
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
上面最好一步一步来执行,因为每一步都挺长的,错了就比较麻烦。我这里make check是全部通过的。
创建glibc的配置文件(/etc/nsswitch.conf, /etc/localtime 符号链接和 /etc/ld.so.conf,按照LFS里面的方法。我选的时区是Asia/Shanghai
第六章 - 调整我们的工具链
cd ld &&
make INSTALL=/stage1/bin/install install-data-local
TGT_TRIPLE=`/stage1/bin/gcc -dumpmachine`
SPECFILE=/stage1/lib/gcc-lib/i686-pc-linux-gnu/3.2.2/specs
grep /stage1/lib ${SPECFILE} > /dev/null 2>&1 &&
{
cp ${SPECFILE} ./XX
sed -e 's@/stage1/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' -e 's@/stage1/lib/ld.so.1@/lib/ld.so.1@g' -e 's@/stage1/lib64/ld-linux.so.2@/lib64/ld-linux.so.2@g' -e 's@/stage1/lib64/ld.so.1@/lib64/ld.so.1@g' ./XX > ${SPECFILE}
rm -f ./XX
}
上面改过以后,最好确认一下的确改好了。
第六章 - 安装 binutils
我删除了上次的源码目录。
mkdir ../binutils-final-build &&
cd ../binutils-final-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/usr --enable-shared --mandir=/usr/share/man --infodir=/usr/share/info &&
make LDFLAGS="-s" &&
make check &&
make install &&
rm /usr/lib/libiberty.a
上面make check也全部通过了。只要没有unexpected的就好了。
第六章 - 安装 gcc
删除源码目录,再解压,运用gcc-3.2.2.mmap_test补丁,然后用下面的两组命令来模拟nofixincludes补丁和去掉-g参数:
cd gcc
test -f Makefile.in-ORIG ||
cp Makefile.in Makefile.in-ORIG
# Following mimics the nofixincludes patch
# Also avoid debug symbols in gcc
grep -Ev '(README| ./fixinc.sh )' Makefile.in-ORIG | sed 's@LIBGCC2_DEBUG_CFLAGS = -g@LIBGCC2_DEBUG_CFLAGS =@g' > Makefile.in
cd ..
# Avoid debug symbols in libstc++
cd libstdc++-v3
test -f configure-ORIG ||
cp configure configure-ORIG
sed s@DEBUG_FLAGS='-g'@DEBUG_FLAGS=''@g configure-ORIG > configure
cd ..
创建编译目录:
mkdir ../gcc-final-build &&
cd ../gcc-final-build
配置:
CFLAGS="-O2 -pipe" ../gcc-3.2.2/configure --prefix=/usr --enable-languages=c,c++ --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-version-specific-runtime-libs --mandir=/usr/share/man --infodir=/usr/share/info
我用了VER_SPEC_RT_LIBS.
编译,我没有从bootstrap开始:
make LDFLAGS="-s"
测试:
make -k check | tee gcc-final-test.log
测试结果与第五章里第二次编译gcc时一模一样,应该说是通过了。
安装:
make install &&
ln -s ../usr/bin/cpp /lib &&
ln -sf gcc /usr/bin/cc &&
rm /usr/lib/libiberty.a
还有version-specific-runtime-libs需要的设置:
echo "/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.2" >> /etc/ld.so.conf
/sbin/ldconfig
最后:
unset LD_LIBRARY_PATH
unset LD_PRELOAD
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/stage1/sbin:/stage1/bin
第六章 - 安装 gcc-2.95.3
这里我结合了最新的blfs(20030404)里安装的方法。
http://beyond.linuxfromscratch.org/...neral/gcc2.html
gcc-2.95.3-1.patch和gcc-2.95.3-2.patch内容完全一样,所以随便用哪个都行,又用了nonfixincules补丁。
echo timestamp > gcc/cstamp-h.in &&
mkdir ../gcc-2-build &&
cd ../gcc-2-build &&
../gcc-2.95.3/configure --prefix=/opt/gcc2 --enable-shared --enable-languages=c,c++ --enable-threads=posix --program-suffix="-2.95.3" --mandir=/usr/share/man --infodir=/usr/share/info &&
make BOOT_LDFLAGS="-s" BOOT_CFLAGS="-O2 -pipe" STAGE1_CFLAGS="-pipe" bootstrap &&
make -k check &&
make install
ln -sf gcc /opt/gcc2/bin/cc &&
rm -rf /opt/gcc2/{i686-pc-linux-gnu,info,man}
L=`find /opt/gcc2/lib -name "*libstdc++*.so" -type f` &&
IL=`basename $L`
for i in /opt/gcc2/lib/*.so*; do mv -f $i /usr/lib;
ln -sf /usr/lib/`basename $i` /opt/gcc2/lib; done
ln -sf $IL /usr/lib/libstdc++-libc6.1-1.so.2 &&
ln -sf $IL /usr/lib/libstdc++-libc6.2-2.so.3 &&
ln -sf $IL /usr/lib/libstdc++-libc6.3-2.so.3
记住以后编译内核时用的参数:
make mrproper &&
make menuconfig &&
make CC=/opt/gcc2/bin/gcc dep &&
make CC=/opt/gcc2/bin/gcc bzImage &&
make CC=/opt/gcc2/bin/gcc modules &&
make CC=/opt/gcc2/bin/gcc modules_install &&
cp arch/i386/boot/bzImage /boot/lfskernel &&
cp System.map /boot
第六章 - 安装剩下的软件包
下面是修改过的chroot命令,加了优化参数:
chroot $LFS /stage1/bin/env -i HOME=/root TERM=$TERM PS1='[\u@\h \W]\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/stage1/bin:/stage1/sbin LDFLAGS="-s" CHOST="i686-pc-linux-gnu" CC="gcc -s" CFLAGS="-march=pentium3 -Os -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium3 -Os -pipe -fomit-frame-pointer" /bin/bash --login
优化参数用-Os,试试看效果,呵呵。
新的chrootsettings文件:
set +x
set +h
umask 022
export LC_ALL=POSIX
unset LD_LIBRARY_PATH
unset LD_PRELOAD
export LDFLAGS="-s"
mount proc /proc -t proc
mount devpts /dev/pts -t devpts
下面是按照LFS上来安装的,打//的是没有安装的包,有些版本可能不一样,不过问题不大。
//Installing Linux-2.4.20 headers因为已经装过了头文件
Man-pages-1.56
//Installing Glibc-2.3.1
//Installing GCC-3.2.1
@Zlib-1.1.4:要多打一个补丁。配置命令也不一样了:
CFLAGS="$CFLAGS -fPIC" CPPFLAGS="-DHAS_vsnprintf" ./configure --prefix=/usr --shared
Findutils-4.1.7:因为版本不同,没有用补丁。
Gawk-3.1.1:与LFS 20030219里面的装法完全一样。
Ncurses-5.3:一定要使用在第五章里用过的"etip"补丁,我还用了在第五章里的修改命令,参看上面。
Vim-6.1:same
M4-1.4:same
Bison-1.875:same。
Less-381:
Groff-1.18.1:一定要这样进行configure:-
PAGE=XX ./configure --prefix=/usr
这里的"XX" 是"A4" 或 "letter",根据你的需要来定。
coreutils:用了新出的5.0版。
安装后:
mv /usr/bin/{cat,head} /bin &&
#ln -s ../../bin/install /usr/bin &&
mv /usr/bin/{basename,date,echo,false,pwd} /bin &&
mv /usr/bin/{sleep,stty,su,test,true,uname} /bin &&
mv /usr/bin/chroot /usr/sbin &&
ln -s test /bin/[
//Installing Textutils-2.1
Sed-4.0.5:same
Flex-2.5.27:
//Installing Binutils-2.13.2
//Installing Fileutils-4.1
//Installing Sh-utils-2.0
Gettext-0.11.5:same
Net-tools-1.60:same
Perl-5.8.0:在安装perl前一定要执行"创建/etc/hosts文件"的命令(第七章)
Texinfo-4.5:same
Autoconf-2.57:same
Automake-1.7.2:same
Bash-2.05b:./configure --prefix=/usr --with-curses
File-3.41:same
Libtool-1.4.3:same
//Bin86-0.16.3:same
Bzip2-1.0.2:same
Ed-0.2:same
Kbd-1.08:same
Diffutils-2.8.1:same
E2fsprogs-1.32:same
Grep-2.5:same
Gzip-1.3.3:没打补丁
Man-1.5k:same
//Lilo-22.2
Make-3.80:same
Modutils-2.4.22:same
Netkit-base-0.17:same
Patch-2.5.4:same
Procinfo-18:same
Procps-3.1.5:same打补丁的时候出现偏移了一行,不过成功了。chroot $LFS /stage1/bin/env -i HOME=/root TERM=$TERM PS1='[\u@\h \W]\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/stage1/bin:/stage1/sbin LDFLAGS="-s" CHOST="i686-pc-linux-gnu" CC="gcc -s" CFLAGS="-march=pentium3 -Os -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium3 -Os -pipe -fomit-frame-pointer" /bin/bash --login
Psmisc-21.2:same
Shadow-4.0.3:在configure前一定要"touch /usr/bin/passwd" - 在安装前一定要执行"创建/var/run/utmp, /var/log/wtmp 和/var/log/btmp文件"的命令(在第六章的最后)
Sysklogd-1.4.1:same
Sysvinit-2.84:same
Tar-1.13:same
Util-linux-2.11z:same
Linux-2.4.20 man pages:same
//Installing Glibc-2.3.1
Revised chroot command:
chroot $LFS /usr/bin/env -i HOME=/root TERM=$TERM PS1='[\u@\h \W]\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/stage1/bin:/stage1/sbin LDFLAGS="-s" CHOST="i686-pc-linux-gnu" CC="gcc -s" CFLAGS="-march=pentium3 -Os -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium3 -Os -pipe -fomit-frame-pointer" /bin/bash --login
LFS-Bootscripts-1.11:same
Configuring system components
后面都和书上一样了。
在上面的过程中,基本上是一帆风顺的,在开始阶段有点错误,不过由于make test及时找出了问题,所以后面一直比较顺利。