LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 7847|回复: 24

[==LFS精华系列==]Pure lfs 安装手记

[复制链接]
发表于 2003-4-7 18:56:20 | 显示全部楼层 |阅读模式
所有文档和软件包已经上传到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.cn/bbs/attachment.php?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/binPATH
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的设置,我都没有设。
 楼主| 发表于 2003-4-7 18:58:24 | 显示全部楼层
下面就开始安装了。
在主系统里安装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
 楼主| 发表于 2003-4-7 18:59:29 | 显示全部楼层
第五章 - 安装 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目录。
 楼主| 发表于 2003-4-7 18:59:52 | 显示全部楼层
第五章 - 安装 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
由于我在主系统里安装了这三个包,所以这里就先不装了,而是放在第五章的最后来装。
 楼主| 发表于 2003-4-7 19:00:17 | 显示全部楼层
第五章 - 安装 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
 楼主| 发表于 2003-4-7 19:00:55 | 显示全部楼层
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
 楼主| 发表于 2003-4-7 19:01:26 | 显示全部楼层
### 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
 楼主| 发表于 2003-4-7 19:02:04 | 显示全部楼层
#
# 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
 楼主| 发表于 2003-4-7 19:02:40 | 显示全部楼层
后面的内容,应该属于第六章了,不过在第五章的脚本里。
切换用户为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
 楼主| 发表于 2003-4-7 19:03:03 | 显示全部楼层
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表