分享
 
 
 

Purelfs安装手记

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

所有文档和软件包已经上传到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及时找出了问题,所以后面一直比较顺利。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有