QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6893|回复: 14

LFS 5.1.1安装实录(20050110更新版)

[复制链接]
发表于 2004-10-5 20:02:26 | 显示全部楼层 |阅读模式
LFS安装我已经谋划了很久了,不过这两天刚刚开始做,写些个人经验供大家分享,如果有什么失误的地方还忘大家多多批评。 :-)

  昨天试了基于5,0的版本,不过看着cvs20040109的中文文档安装5。0的总有些怪怪的感觉,具体就是版本号不是完全一样,后来在第二次编译gcc的时候出错了,在configure的时候,找不到c++编译器,看了一下也没找到什么有用的资料(估计是些小问题 )

  今天去lfs的官方网站逛了很久,看到了最新的稳定版5.1.1决定把原来的5.0删了装5.1.1,然后一阵忙活,包括搞定文档和软件包源码 ,现在开始:
  在此对于dannycat提出的建议表示衷心的感谢
  

  
  这里补充一些分区与用户方面的心得,)
  因为lfs必须要有一个宿主系统后才可以安装,所以在安装lfs之前要先检查宿主系统有没有gcc,第一次编译工具链的时候还得靠它的。接下来为你的lfs划分一个单独分区,然后格式化并且按照传统的作法设置一个LFS变量
  export LFS=/mnt/lfs
  

接着用如下的命令挂载分区
   [code:1]
   mkdir -p $LFS
   mount -t ext3 /dev/xxx $LFS; mount不要加什么参数
   [/code:1]
   在开始下载前,你应该用root身份运行下面的命令创建目录:
   [code:1]
   mkdir $LFS/sources
   [/code:1]
   让这个目录对普通用户可写(并设置sticky位)--因为你不会以 root 身份来下载吧)
   [code:1]
   chmod a+wt $LFS/sources  
   [/code:1]
   因为接下来的几个软件对于整个lfs系统来说只是临时性质的,所以建一个tools文件夹以便同后来的工具分开。
   [code:1]
   mkdir $LFS/tools
   [/code:1]
   下一步是在主系统里创建 /tools 符号链接。它指向我们刚才 在 LFS 分区上创建的那个目录:
   [code:1]
   ln -s $LFS/tools / [/code:1]
   这个符号链接使我们的工具链总是指向 /tools
   
   在以root身份登陆时,某个小失误就可能损坏甚至摧毁你的主系统。(fox_eagle注意一下前面这句话)我们推荐在第五章中最好用没有特权的用户(普通用户)来安装软件包。你当然可以用自己的用户名,但为了确保工作环境是干净的,我们将创建一个新用户lfs,并在安装过程里使用它。
   [code:1]
   useradd -s /bin/bash -m lfs
   passwd lfs
   [/code:1]
   为了使这个新的 lfs 用户对 $LFS/tools 目录有完全的权限,运行下面的命令,把这个目录的所有者改成lfs:
   [code:1]
   chown lfs $LFS/tools
   [/code:1]
   因为我单独创建了一个工作目录sources用来存放下载的源代码包,那就要让lfs用户拥有这个目录:
   [code:1]
   chown lfs $LFS/sources
   [/code:1]
   现在以用户lfs身份登陆。这可以通过几种方法,到另一个虚拟终端,用显示管理器(display manager),或用下面一个命令:
   [code:1]
   su - lfs
   [/code:1]
"-" 让 su 命令启动一个新的,干净的shell.   

当你是lfs用户的身份时,用以下命令来设置一个好的工作环境:
   [code:1]
   cat > ~/.bash_profile << "EOF"
   exec env -i HOME=$HOME TERM=$TERM
   PS1='\u:\w\$ '  /bin/bash  [color=red]#!这行和上面是一行的    [/color]   
   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
   [/code:1]
   然后运行下面这条命令重设lfs的环境变量
   [code:1]
   source ~/.bash_profile
   [/code:1]
   
=====================注释=============================  
  命令 exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash ,创建新的Bash实例,并保证这个实例的环境是完全干净的,除了设置 HOME,TERM,PS1几个变量以外。这能保证,lfs的编译环境不被主系统中可能存在的环境变量所污染。我们使用的方法不太正规,但能完成任务。要深入地解释起来,最初的shell是 login(登陆) shell,读取 .bash_profile文件,而新的shell实例是non-login(非登陆) shell,它只读取.bashrc文件(随后创建的那一个).

   set +h 关掉bash的 "hash"功能。hash 通常是一个有用的特性,这时 bash 使用 hash 表(哈希表)来记住可执行文件的完整路径,以避免为了找到同一个文件而进行多次 `PATH' 搜索。然而,我们希望立刻就能使用新安装的工具。关掉hash功能,那些交互的命令(make,patch, sed,cp 等等)将总是使用新的程序。

  把用户文件创建掩码(umask)设置为 022,保证新创建的文件和目录只能被文件的所有者执行写操作,而能被所有人读和执行。

  LFS 变量自然要设置成你加载 LFS 分区的位置。

  LC_ALL 变量控制某些软件包的本地化,使它们输出的信息遵守指定国家的规范。当你的主系统glibc版本低于2.2.4时,如果在现在把$LC_ALL设置成 "POSIX" 或 "C" 以外的值,当你退出后面的chroot环境后,要再次进入就会有麻烦。设置成 "POSIX" (或"C",它们俩是相同的)我们保证在chroot环境中不会出现任何问题。

  现在再把 /tools/bin 附加到标准路径前面,是为了在安装过程中,总是能用到已经安装了的临时工具。

   CC, CXX, CPP, LD_LIBRARY_PATH 和 LD_PRELOAD 环境变量都有可能破坏现在工具链,因此这里取消它们的设置,以预防可能的问题。
=====================================================

   搞定了之后,接下来按步就班的开始安装第一个toolchain,binutils 。
   
   binutils(first)
   
   
   我在解压了软件包后,已经用cd进入了解压的那个源码目录,然  后才执行的编译命令
   

   [code:1]
     mkdir ../binutils-build
     cd ../binutils-build
   [/code:1]
   接着
   [code:1]
   ../binutils-2.14/configure --prefix=/tools --disable-nls
   
   make configure-host
   
   make LDFLAGS="-all-static"
   [/code:1]
   经过大约一柱香的时间   编译完成,然后运行
   make install
   [code:1]
   make -C ld clean
   make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib
   [/code:1]
   搞定。
   
   下一个是GCC-3.3.3(cvs20040109为GCC-3.3.2)
   
   GCC3.3.3(first)
   
   按照要求只解压了GCC-core-3.3.3,然后是
   [code:1]
   mkdir ../gcc-build
   cd ../gcc-build
   ../gcc-3.3.3/configure --prefix=/tools \
    --with-local-prefix=/tools \
    --disable-nls --enable-shared \
    --enable-languages=c
   [/code:1]
   接着
   [code:1]
   make BOOT_LDFLAGS="-static" bootstrap
   [/code:1]
   然后大约4柱香时间后完工,接着只要
   make install就可以了。
   下面这句在guide中话我觉得可能会有点模糊,先看一下
   ln -s gcc /tools/bin/cc
   我觉得这里的gcc应该是同样在/tools/bin/下面的gcc,而不是一   个在gcc-build中的gcc目录。
   好,接下来是内核的头文件,lfs 5.1.1已经把内核升级到2.4.26了,去kernel.org下载源文件,然后
   [code:1]
   make mrproper

   make include/linux/version.h

   make symlinks

   mkdir /tools/include/asm
   
   cp include/asm/* /tools/include/asm

   cp -R include/asm-generic /tools/include

   cp -R include/linux /tools/include
   [/code:1]
   没啥困难就轻松搞定了
   接下就是toolchain的最后一环了glibc
   lfs 5.1.1相对5.0来说在底层变化较多多的就是这个glibc了,虽然版本号只是提升到了2.3.3,包简化成Glibc-2.3.3-lfs-5.1一个,没有了以前glibc需要另外附加的的threads,估计已经集合在一起了,不过在这步我还是出了错,一会儿再说。
   
   glibc-2.3.3-lfs-5.1(first)
   
   [code:1]
     mkdir ../glibc-build
     cd ../glibc-build

    ../glibc-2.3.3-lfs-5.1/configure --prefix=/tools \
    --disable-profile --enable-add-ons=linuxthreads \
    --with-binutils=/tools/bin --with-headers=/tools/include \
    --without-gd [color=red]--without-cvs[/color]
   [/code:1]
   红色为新加的选项。官方说现在不用这个选项也是可以的,不过我还是用了。
   然后是
   [code:1]
   make AUTOCONF=no
   [/code:1]
   这步耗时比较长,大约要七八柱香的时间。
   再接下去要check一下
   [code:1]
   make check
   [/code:1]
   这步我出错了,错误我在下面的贴子里贴出来,觉的时linux threads方面的,到现在还没解决,待会去看看。明天继续。

   已解决
   
   在安装Glibc的过程中,它会警告缺少/tools/etc/ld.so.conf文件。其实这没什么关系,不过下面的命令能修正它:
   [code:1]
   mkdir /tools/etc
   touch /tools/etc/ld.so.conf
   [/code:1]
   现在安装glibc:
   [code:1]
   make install
   [/code:1]
   不同的国家和文化,使用不同的习俗来交流。这样的习俗很  多,从比较简单的时间和日期格式,到非常复杂的语言发音。GNU程序的"internationalization"(国际化,又称i18n,18表示中间的18个字母)是以locales来实现的。然后就安装glibc的locale:
   [code:1]
   make localedata/install-locales
   [/code:1]
   现在临时的C库已经安装好了,为了让本章随后编译的那些工具都连接到这个库上,需要调整连接器脚本和编译器的specs文件。
    首先安装调整过的连接器,在 binutils-build 目录下运行如下命令:
   [code:1]
   make -C ld install
   [/code:1]
   连接器是在第一遍安装Binutils的最后调整的,现在开始,所有的工具都连接到 /tools/lib 里的库文件上。   
   下面要做的是修正我们的 GCC specs 文件,使它指向新的动态连接器。一个简单的 sed 命令就能做到:
    [code:1]
    SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
    sed -e 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
           $SPECFILE > tempspecfile
           mv -f tempspecfile $SPECFILE &&
           unset SPECFILE
    [/code:1]
    最后,有些主系统里的头文件会跑到gcc的头文件目录里,这可能是因为GCC的"fixincludes"脚本在编译GCC的过程中运行了。执行下面的命令,以避免头文件混淆:
    [code:1]
    rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}
    [/code:1]
    现在我检查了一下新工具链的基本功能(编译和连接)是否正常:
    [code:1]
    echo 'main(){}' > dummy.c
    gcc dummy.c
    readelf -l a.out | grep ': /tools'
    [/code:1]
    如果一切正常,应该不会出错,而且最后一个命令的结果是:
   
    [Requesting program interpreter: /tools/lib/ld-linux.so.2]
   

    如果你没看到上面的结果,那么就有大问题了。
    然后记得把dummy.c 和a.out两个文件删除掉。
   
    到次为止toolchain里三个主要的东东都已经搞定了,接下来安装的是几个为test准备的套件。
   
    Tcl-8.4.6
   

    老样子解压后进入源代码目录。执行如下命令:
    [code:1]
    cd unix
    ./configure --prefix=/tools
     [/code:1]
    编译软件包:
    [code:1]
    make
    [/code:1]
    本软件包自带测试套件,能执行一些测试,以确定它是否编译正确。不过,这里运行Tcl的测试套件总是会出错,原因还搞不清楚。如果你也遇到了错误,别紧张,应该不要紧的。如果你想运行测试套件,执行下面的命令:

    TZ=UTC make test
   
#这个我运行过的确出了错,不过有官方说不要紧也就go on了

你可以参考一下LFS Wiki(http://wiki.linuxfromscratch.org/上其他人的结果,本书中的所有测试都可以在那里找到结果。

    安装软件包:
    [code:1]
    make install[/code:1]
   
    不要删除tcl8.4.5 源码目录,因为下一个软件包还需要源码中的头文件。
   

    创建必备的符号链接:
    [code:1]
    ln -s tclsh8.4 /tools/bin/tclsh   
    [/code:1]

    下一个登场的是expect了
   
    Expect-5.41.0
   

    首先打补丁
    [code:1]
    patch -Np1 -i ../expect-5.41.0-spawn-1.patch
   
    然后configure一下
    ./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no
   
    最后再make; make SCRIPTS="" install;
    搞定:mrgreen:
    [/code:1]
   
    接着的就是
   
    DejaGnu-1.4.4
   

    进入解压后的源代码目录,执行
    [code:1]
    ./configure --prefix=/tools
    make install
    [/code:1]
    呵呵,这样就ok
    顺便说一句,花费时间少的我就不说了(以第个个binutils为准)   
=====================================================
    下面是工具链的第二次编译,第一个是gcc
   
    GCC-3.3.3 - Pass 2
   

    第一步
    上面最后三个测试套件受 pseudo 终端(PTYs)的影响很大,这些终端是由主系统提供的,通过 devpts 文件系统实现。你可以用下面的方法,来测试主系统中PTY是否设置正常:
     [code:1]
     expect -c "spawn ls"
     [/code:1]
     如果你得到下面的回答:
     
     The system has no more ptys.  Ask your system administrator to create more.
     

     说明主系统的PTY没设置好。这种情况下,运行GCC和Binutils的测试套件就没什么意义了。需要先解决的是主系统中的PTY设置问题。参见 LFS Wiki(http://wiki.linuxfromscratch.org/).
   
     由于现在要编译C和C++编译器,因此要在同一目录下解压所有的三个GCC压缩包(-core, -g++, 和 -testsuite),它们会释放到名为gcc-3.3.3/的同一子目录中。

     接着是给gcc打上一些补丁:
     [code:1]
     patch -Np1 -i ../gcc-3.3.3-no_fixincludes-1.patch
     patch -Np1 -i ../gcc-3.3.3-specs-1.patch
     [/code:1]
     
    后一个补丁修改gcc的缺省动态连接器ld-linux.so.2的位置,还把/usr/include从GCC的头文件搜索路径里删掉。在安装前打补丁,可以保证新的动态连接器在编译gcc的时候就用上。也就是说,随后的所有临时程序都会连接到新的glibc上。
   
    重要: 这两个补丁 非常重要,为了成功编译,千万别忘了运用它们。
   

   
    再次创建专用的编译目录:
    [code:1]
    mkdir ../gcc-build
    cd ../gcc-build
    [/code:1]
    configure 一下
   

    ../gcc-3.3.3/configure --prefix=/tools \
    --with-local-prefix=/tools \
    --enable-clocale=gnu --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-languages=c,
c++
   

    注意红色的部分是第一次编译gcc时没有的。
    然后运行
    [code:1]
    make
    [/code:1]
    编译gcc
   
    下面这条命令是用来check gcc的,在这里可用可不用,
     我用了,比较好时间。
     [code:1]
     make -k check
     [/code:1]
     -k 参数是让测试套件即使遇到错误,也继续运行,直到完成。GCC 的测试套件非常详细,所以基本上是肯定会出错的。要看测试结果,用下面的命令:
     [code:1]
     ../gcc-3.3.3/contrib/test_summary | more
     [/code:1]
     可以把自己的结果与gcc-testresults邮件列表上贴出来的比较一下。比如,GCC-3.3.3 在i686-pc-linux-gnu平台上的结果,见:http://gcc.gnu.org/ml/gcc-testresults/2004-01/msg00826.html.
     反正我是没看出些啥,不要有unexpect failure就可以了。
     最后安装gcc
     [code:1]
     make install
     [/code:1]
     gcc好时大概为9-10柱香的时间。

     下一个是binutils 2.14
      
     binutils(twice)
     再次创建专门的编译目录:
     [code:1]
     mkdir ../binutils-build
     cd ../binutils-build
     [/code:1]
     为编译 Binutils 作准备:
     [code:1]
     ../binutils-2.14/configure --prefix=/tools \
    --enable-shared --with-lib-path=/tools/lib
     [/code:1]
      
     编译软件包:
     [code:1]
     make
     [/code:1]
     
     安装软件包:
     [code:1]
     make install
     [/code:1]
     
     为了后面的chroot环境需要再次调整工具链
     [code:1]
     make -C ld clean
     make -C ld LIB_PATH=/usr/lib:/lib
     [/code:1]
     
    注意:不要删除 Binutils的源码和编译目录。我们在下一章里还需要这些目录,所以现在不要动它们。

     后面的一些程序安装相对比较简单,这边我就简单一些过去了,只给出些主要的步骤。
       
     Gawk-3.1.3
     

     [code:1]
     ./configure --prefix=/tools
     make
     make install
     [/code:1]
     
     Coreutils-5.2.1
     

     [code:1]
     DEFAULT_POSIX2_VERSION=199209 ./configure --prefix=/tools     
     [/code:1]
     
     注意一下前面的变量,为了给使用glibc 2.3.2编译的head, tail和sort有更好的兼容性而设置的,这个在5.0的时候是没有的。  
     

     [code:1]
     make   
     make install
     [/code:1]
     
     Bzip2-1.0.2
     

     [code:1]
     make PREFIX=/tools install
     [/code:1]
     
     Gzip-1.3.5
     

     ./configure --prefix=/tools
     [code:1]
     make
     make install
     [/code:1]
     
     Diffutils-2.8.1
     

     [code:1]
     ./configure --prefix=/tools
     make
     make install
     [/code:1]
     
     Findutils-4.1.20
     

     [code:1]
     ./configure --prefix=/tools
     make
     make install  
     [/code:1]
     
     Make-3.80
     

     [code:1]
     ./configure --prefix=/tools     
     make
     make install
     [/code:1]
     
     Grep-2.5.1
     

     [code:1]
     ./configure --prefix=/tools \
    --disable-perl-regexp --with-included-regex
            
=====================================================      
       * disable-perl-regexp: 它确保grep不会连接到主系统中可能存在的 PCRE 库上,因为主系统中的库在进入chroot环境后就不能用了。
       * with-included-regex: 它确保grep使用内建的正则表达式代码。没有这个参数,它会使用glibc中的代码,而那些代码是有些小毛病的。
=====================================================
     make
     make install
     [/code:1]
     
     Sed-4.0.9
     

     [code:1]
     ./configure --prefix=/tools
     make
     make install
     [/code:1]
     
     Gettext-0.14.1   
     

     [code:1]
     ./configure --prefix=/tools
     make
     make install
     [/code:1]
     
     Ncurses-5.4   
     

     [code:1]
     ./configure --prefix=/tools --with-shared \
        --without-debug --without-ada --enable-overwrite

=====================================================      
        * without-ada: 这个参数告诉 Ncurses,即使主系统里有ada编译器,也不要编译成ada绑定的。必须这样,因为在我们进入chroot环境后,就不能使用主系统中的ada了。
   
        * enable-overwrite: 本参数告诉 Ncurses把头文件安装到/tools/include下而不是/tools/include/ncurses目录里,这是为了其他软件包能顺利地找到Ncurses头文件。
=====================================================
        make
        make install
        [/code:1]
        
        Patch-2.5.4
        

        [code:1]
        CPPFLAGS=-D_GNU_SOURCE ./configure               --prefix=/tools   
        
=====================================================     
     参数 -D_GNU_SOURCE 只在 PowerPC 平台下才需要,在其他平台下你可以省略掉,不过留着也没什么坏处。
=====================================================
        make
        make install
        [/code:1]
        
        Tar-1.13.94
        

        [code:1]
        ./configure --prefix=/tools
        make
        make install
        [/code:1]
        
        Texinfo-4.7
        
  
        [code:1]
        ./configure --prefix=/tools
        make
        make install
        [/code:1]
        
        Bash-2.05b
        

        这个大家比较眼熟吧,没错它就是shell了。
        [code:1]
        这个要打个patch
        patch -Np1 -i ../bash-2.05b-2.patch
        ./configure --prefix=/tools
        make
        make install
        并且做一个链接
        ln -s bash /tools/bin/sh
        [/code:1]
        
        Util-linux-2.12a
        

        [code:1]
=====================================================        
        Util-linux 不会使用/tools目录里安装的头文件和库文件,修改它的configure脚本可以修正这一bug:
=====================================================        
        cp configure configure.backup
        sed "s@/usr/include@/tools/include@g" configure.backup >  
        \ configure
        ./configure
        make -C lib
        [/code:1]
        下面只需要编译几个命令就可以了,不需要全部
        [code:1]
        make -C mount mount umount
        make -C text-utils more
        cp mount/{,u}mount text-utils/more /tools/bin
        [/code:1]
        
        Perl-5.8.4
        

        [code:1]
        首先要修改一些对C库的硬路径引用
        patch -Np1 -i ../perl-5.8.4-libc-1.patch
        这里和5.0不同的是需要建一个文件
        echo "uname -m" > /tools/bin/arch
        chmod 755 /tools/bin/arch
        ./configure.gnu --prefix=/tools -Dstatic_ext='IO Fcntl
        \ POSIX'

=====================================================        
        * Dstatic_ext='IO Fcntl': 告诉Perl只编译最小的静态扩展
=====================================================
        make perl utilities
  然后考贝一些库文件和命令。
        cp perl pod/pod2man /tools/bin
        mkdir -p /tools/lib/perl5/5.8.4
        cp -R lib/* /tools/lib/perl5/5.8.4
        [/code:1]

================== 第六章============================

在第六章开始之间按你自己的要求可以做一下stripping(也就是去除一些用来调试的东西大概130M左右),目的当然只有一个---------那就是使自己做的lfs系统更加小巧
[code:1]
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
[/code:1]
第一个命令strip的文件中,会报告不能认识约二十个文件的格式。它们大部份是脚本,而不是二进制程序。

注意:不要 在库文件上使用--strip-unneeded -- 这个参数会搞坏库文件,那你就不得不再编译一次glibc这些的了。

为了再多节约一些空间,可以删除所有的文档:
[code:1]
rm -rf /tools/{doc,info,man}
[/code:1]
现在,你的LFS分区上应该至少有850MB以上的空间,才能顺利的在第六章里安装上Glibc。如果你能顺利的安装Glibc,对剩下的那些软件包来说,空间就不成问题了。

从这里开始我们进入真正的编译环境,开始认真地构建LFS系统。也就是说,我们用chroot进入临时的微型Linux系统,创建一些辅助的东西,然后开始一个一个地安装软件包。

如果你打算为在这里安装的包进行编译器优化,那么就看看编译器优化提示:http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt. 编译器优化能够让程序运行得更快,但是也可能会引起某些编译问题。如果使用优化有出了问题,最好的办法是在没有优化的情况下进行编译,看看相同的问题是否还会发生。简单地说,使用编译器优化得到的小幅度性能提升,与它带来的风险相比微不足道。我安装LFS的时候,使用了并行编译和优化,后来确时出了些问题,大家量力而为吧。

在进入chroot环境之前首先得做几件事情:
[code:1]
mkdir -p $LFS/{proc,dev/pts}
mount proc $LFS/proc -t proc
mount devpts $LFS/dev/pts -t devpts
[/code:1]

注意:mount命令要su到root才能做的,当然chroot命令也一样。

然后chroot进入LFS 吧,真正的lfs之旅才刚刚开始
[code:1]
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
[/code:1]

env 命令的 -i 参数将把chroot环境中的变量全部清除。这之后,只有 HOME, TERM, PS1 和 PATH 变量再次被设置。TERM=$TERM这一句会将chroot环境内的$TERM值设置成与chroot外的相同,这样可以使象vim和less等程序可以正常运行。如果你需要其它的变量,比如 CFLAGS 或 CXXFLAGS,就在这里把它们设好。

从现在开始,$LFS变量就不再需要了,因为现在shell已经把 $LFS 看成 / ,也就是chroot命令的第一个参数。


注意,/tools/bin 是在 PATH 环境变量的最后一个。这意味着,只要有新的工具安装上了,第五章里编译的临时工具就不再使用了。当然,这需要关闭掉shell的记忆功能(也就是hash),我们过一会就把它关掉。

记住必须确保本章和以后章节中的所有命令都是在虚拟根环境下执行的。如果已经离开了这个环境(如重启动等原因),请记住一定要在继续工作以前重新进入chroot并且重新加载proc和devpts(马上就将讨论到)。

注意,bash提示中会包含"I have no name!",这个可是很少见的哦,很正常,因为 /etc/passwd 文件还没创建呢。

然后更改一些权限:
[code:1]
chown -R 0:0 /tools

-R为递归选项
[/code:1]

接着创建那些文件夹:
[code:1]
mkdir -p /{bin,boot,dev/{pts,shm},etc/opt,home,lib,mnt,proc}
mkdir -p /{root,sbin,srv,tmp,usr/local,var,opt}
mkdir -p /media/{floppy,cdrom}
mkdir /usr/{bin,include,lib,sbin,share,src}
ln -s share/{man,doc,info} /usr
mkdir /usr/share/{doc,info,locale,man}
mkdir /usr/share/{misc,terminfo,zoneinfo}
mkdir /usr/share/man/man{1,2,3,4,5,6,7,8}
mkdir /usr/local/{bin,etc,include,lib,sbin,share,src}
ln -s share/{man,doc,info} /usr/local
mkdir /usr/local/share/{doc,info,locale,man}
mkdir /usr/local/share/{misc,terminfo,zoneinfo}
mkdir /usr/local/share/man/man{1,2,3,4,5,6,7,8}
mkdir /var/{lock,log,mail,run,spool}
mkdir -p /var/{tmp,opt,cache,lib/misc,local}
mkdir /opt/{bin,doc,include,info}
mkdir -p /opt/{lib,man/man{1,2,3,4,5,6,7,8}}
[/code:1]
记得还要改变一下权限:
[code:1]
chmod 0750 /root
chmod 1777 /tmp /var/tmp
[/code:1]

顺便创建重要的符号链接:
[code:1]
ln -s /tools/bin/{bash,cat,pwd,stty} /bin
ln -s /tools/bin/perl /usr/bin
ln -s /tools/lib/libgcc_s.so.1 /usr/lib
ln -s bash /bin/sh
[/code:1]
为了让shell不用在叫着“i have no name!” ,创建passwd和group文件:
[code:1]
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
EOF
[/code:1]
[code:1]
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:
EOF
[/code:1]

注:cat > filename << "EOF"是创建文件的一种方法,在lfs这个阶段经常用到,有问题的话,看一下manpage


呵呵,下面就要给shell起名了:
[code:1]
exec /tools/bin/bash --login +h
[/code:1]
这下子shell就有名字了,因为login, agetty 和 init (还有些程序)需要log文件,下面touch一些。(在lfs 5.0中没有)
[code:1]
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chmod 644 /var/run/utmp /var/log/{btmp,lastlog,wtmp}
[/code:1]
现在再用MAKEDEV 脚本创建静态的设备节点,通常位于/dev目录下。注意:该压缩包不需要cd进入
[code:1]
bzcat make_devices-1.2.bz2 > /dev/make_devices
chmod 754 /dev/make_devices
[/code:1]

注意:在这个时候不要为了适应自己的硬件配置而去修改这个脚本,官方的文档说这样可能会造成一些启动故障,我用的是hdc的硬盘,默认创建的设备是没有hdc的,解决的方法是在后面装好相应的包后再进行mknod的。

下面开是创建设备:
[code:1]
cd /dev
./make_devices
[/code:1]
下面开始安装真正的lfs系统中的软件包,重要部分我会标出的
使用的默认步骤是解压相应的软件包后进入该目录
     
     Linux-2.4.26 headers     
     

     [code:1]
     cp -a /tools/include/{asm,asm-generic,linux} /usr/include
     touch /usr/include/linux/autoconf.h
     [/code:1]
     Linus 所说的精华部份是头文件应该是 glibc 编译时链接到的. 我们这里的头文件是你后面编译其它包时要用到的,因为它们是与对象(object-code)库文件相匹配的。通过拷贝头文件,我们保证它们在你以后升级内核后能继续使用它们。

注意,附带着说一句,内核代码在 /usr/src/linux 目录里是能正确使用的,只要你没有创建 /usr/include/{linux,asm} 的符号链接。

     
     Man-pages-1.66   
     

     很简单,只需要
     [code:1]
     make install
     [/code:1]
     接下来是重头戏了----Glibc
     
     Glibc-2.3.3-lfs-5.1
     

     Glibc 的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:
     [code:1]
     mkdir ../glibc-build
     cd ../glibc-build
     [/code:1]
     为编译 Glibc 做准备:
     [code:1]
     ../glibc-2.3.3-lfs-5.1/configure --prefix=/usr \
    --disable-profile --enable-add-ons=linuxthreads \
    --libexecdir=/usr/lib --with-headers=/usr/include \
    --without-cvs
         
     make
     [/code:1]
     
     注意接下来的make check请一定要做,如果glibc出错了,后面的东西都会受影响的。
     

     [code:1]
     make check
     [/code:1]
     在安装Glibc的过程中,它会警告缺少/etc/ld.so.conf文件。其实这没什么关系,不过下面的命令能修正它:
     [code:1]
     touch /etc/ld.so.conf
     [/code:1]
    安装软件包:
    [code:1]
    make install
    [/code:1]
    上面的命令没有安装 locale ( Glibc 用它来使你的 Linux 系统能用另一种语言反馈信息),所以用下面的命令来安装它们:   
    [code:1]
    make localedata/install-locales
    [/code:1]
    或着用如下的方法也可以
    [code:1]
    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 fa_IR -f UTF-8 fa_IR
    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
    [/code:1]
    还要做的是安装linuxthreads的man文档:
    [code:1]
    make -C ../glibc-2.3.3-lfs-5.1/linuxthreads/man

    并安装它们:

    make -C ../glibc-2.3.3-lfs-5.1/linuxthreads/man install
    [/code:1]
   
    配置 Glibc
   

    建立一个新的/etc/nsswitch.conf文件:
    [code:1]
    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
    [/code:1]
    接着设置一下你所在的时区,以我的来说选Asia/ShangHai
    [code:1]
    tzselect
   
    cp --remove-destination /usr/share/zoneinfo/Asia/ShangHai
      \  /etc/localtime
    [/code:1]
    建立/etc/ld.so.conf :
    [code:1]
    cat > /etc/ld.so.conf << "EOF"
    # Begin /etc/ld.so.conf

    /usr/local/lib
    /opt/lib

    # End /etc/ld.so.conf
    EOF
    [/code:1]
    Glibc到此为止,总耗时10-11柱香
   
    再次调整工具链
   

    make -C ld INSTALL=/tools/bin/install install
   
    注: 如果你没看到前面关于保留binutils源码目录和编译目录的警告,或者不小心删除了第二遍Binutils的源码目录或编译目录,别紧张,关系不大,别运行上面的命令就行了,这样会使下一个软件包Binutils连接到 /tools 目录下的Glibc库上,而不是 /usr下那个。这不太完美,但经过我们的测试,生成的Binutils应该是一模一样的。

   
    从现在起,所有新编译的程序都只连接到/usr/lib和/lib下的库文件上了。需要INSTALL=/tools/bin/install参数是因为在第二遍 Binutils 时创建的 Makefile还包含了对 /usr/bin/install的引用,而我们这时显然还没有安装它。有的发行版用 ginstall作为install的名称,这里就会出问题了,上面的命令也考虑了这种情况。

   你现在可以删除 Binutils源码和编译目录了。

   下面要做的是修正我们的 GCC specs 文件,使它指向新的动态连接器。和前面一样,我们用一个简单的 sed 命令就能做到:
    [code:1]
    SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
    sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
    $SPECFILE > newspecfile &&
    mv -f newspecfile $SPECFILE &&
    unset SPECFILE
    [/code:1]
    现在停下来,检查一下新工具链的基本功能(编译和连接)是否正常,我们进行一个简单的合理性检查:
    [code:1]
    echo 'main(){}' > dummy.c
    gcc dummy.c
    readelf -l a.out | grep ': /lib'
    [/code:1]
    如果一切正常,应该不会出错,而且最后一个命令的结果是:
   
    [Requesting program interpreter: /lib/ld-linux.so.2]
   

    如果你没看到上面的结果,那么就有大问题了。你需要检查一下前面的操作,看看问题出在哪里,并改正过来。在改正之前,不要继续后面的部份,因为没什么意义。大多数情况下,出错都是因为上面的specs文件没改对。尤其 /lib应该是我们的动态连接器的前缀。当然,如果你的工作平台上动态连接器的名字不是ld-linux.so.2,那上面的结果也会不同。

    在确定一切正常后,删除测试文件:
    [code:1]
    rm dummy.c a.out
    [/code:1]
   
    Binutils
   

    现在我们测试一下在chroot环境中,你的 pseudo 终端 (PTYs) 是否正常工作。运行下面的命令:
    [code:1]
    expect -c "spawn ls"
    [/code:1]
    如果看到这样的输出:
   
    The system has no more ptys.  Ask your system administrator to create more.
   

    说明你的chroot环境没有设置好PTY,这时运行Binutils和GCC的测试套件就没有意义了,必须先解决PTY设置。
    然后开始安装:
    [code:1]
    mkdir ../binutils-build
    cd ../binutils-build
    [/code:1]
    为编译 Binutils 做准备:
    [code:1]
    ../binutils-2.14/configure --prefix=/usr --enable-shared
    [/code:1]
    编译软件包:
    [code:1]
    make tooldir=/usr
    [/code:1]
    运行测试套件(同样在这里最好测试一下,放心一点):
    [code:1]
    make check   
    [/code:1]
    安装软件包:
    [code:1]
    make tooldir=/usr install
    [/code:1]
    安装某些软件包需要的 libiberty 头文件:
    [code:1]
    cp ../binutils-2.14/include/libiberty.h /usr/include
    [/code:1]
   
    GCC-3.3.3
   

    在这里将安装 C 和C++ 编译器,所以需要解压 gcc-core和gcc-g++到同一目录中。除此之外还需要解压GCC-testsuite软件包到相同目录里。完整的 gcc 软件包里还有其它的编译器,编译它们的指导请看

http://www.linuxfromscratch.org/blfs/view/stable/general/gcc.html.
   
   
    注: 注意,这里不要 运用第五章里的specs补丁。
   

    首先,运用前一章里用过的 No-Fixincludes 补丁:
    [code:1]
    patch -Np1 -i ../gcc-3.3.3-no_fixincludes-1.patch
    [/code:1]
    现在运用一个补丁,它禁止安装libiberty.a。我们将使用Binutils带的libiberty.a:
    [code:1]
    sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
    [/code:1]
    GCC 的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:
    [code:1]
    mkdir ../gcc-build
    cd ../gcc-build
    [/code:1]
    为编译 GCC 做准备:
    [code:1]
    ../gcc-3.3.3/configure --prefix=/usr \
    --enable-shared --enable-threads=posix \
    --enable-__cxa_atexit --enable-clocale=gnu \
    --enable-languages=c,c++
    [/code:1]
    编译软件包并测试(同样不要跳过check这一步):
    不过公社的lfs高手  tyfrlj   说check不过去也可以install,他自己就吃过这个螃蟹,滋味还不错呢
    [code:1]
    make
   
    运行测试套件,但遇到错误不停止(你还记得那些老是出错的测试吧):

    make -k check
    [/code:1]
    安装软件包:
    [code:1]
    make install
    [/code:1]
    有的软件包希望 C PreProcessor(预处理器)安装在 /lib 目录下,为了满足它们的要求,创建符号链接:
    [code:1]
    ln -s ../usr/bin/cpp /lib
    [/code:1]
    许多软件包使用 cc 作为 C 编译器的名字,为了满足它们的要求,创建一个 cc 符号链接:
    [code:1]
    ln -s gcc /usr/bin/cc
    [/code:1]
    到这里GCC算是搞定了,耗时大概和上面那个东西差不多接下来就是一些普通的软件包了,go! go! go!
   
    Coreutils-5.2.1
   

    通常 uname 程序总是有点毛病的,比如 -p 参数总是得到 "unknown" 的结果。下面的补丁对 Intel 平台的机器能修正这个问题:
    那么就先打个补丁:
    [code:1]
    patch -Np1 -i ../coreutils-5.2.1-uname-1.patch
    [/code:1]
     我们不希望 Coreutils 安装它带的 hostname 程序,因为它没有 Net-tools 软件包提供的那个版本好。下面这个补丁阻止 hostname 的安装:
    [code:1]
    patch -Np1 -i ../coreutils-5.2.1-hostname-1.patch
     [/code:1]
    然后开始configure -- make 过程
    [code:1]
    DEFAULT_POSIX2_VERSION=199209 ./configure --prefix=/usr
   
    make
    [/code:1]
    第五章里没有安装Coreutils里面带的 su 程序,因为这需要root权限。测试套件中有时会用到它,因此我们用下面的命令来避免错误
    [code:1]
    make install-root
    [/code:1]
    然后建立一个描述已挂载的文件系统的文件,也就是/etc/mtab,并建立两个空的组dummy1和dummy2,添加一个用户dummy加入dummy1组, 这些都是为测试所做的准备.
    [code:1]
    touch /etc/mtab
    echo "dummy1:x:1000" >> /etc/group
    echo "dummy2:x:1001:dummy" >> /etc/group
    echo "dummy:x:1000:1000:::/bin/bash" >> /etc/passwd
    [/code:1]
    先先进行的测试需要以 root运行,然后切换到dummy用户来测试
    [code:1]
    export NON_ROOT_USERNAME=dummy; make check-root
    su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"
    [/code:1]
     完成测试后删掉dummy1, dummy2组和dummy用户,然后安装     
     coreutils,接着把一些程序移动到合适的位置:
     [code:1]
     sed -i.bak '/dummy/d' /etc/passwd /etc/group
     make install
     mv /usr/bin/{basename,cat,chgrp,chmod,chown,cp,dd,df} /bin
     mv /usr/bin/{date,echo,false,head,install,ln,ls} /bin
     mv /usr/bin/{mkdir,mknod,mv,pwd,rm,rmdir,sync} /bin
     mv /usr/bin/{sleep,stty,su,test,touch,true,uname} /bin
     mv /usr/bin/chroot /usr/sbin  
     [/code:1]
     因为我们打算使用procps里的kill, 所以这边的kill当然得move掉了,
     最后创建一些软链接就ok了.
     [code:1]
     ln -s test /bin/[
     ln -s ../../bin/install /usr/bin
     [/code:1]
     
      Zlib-1.2.1
     

     这个比较简单, 跟着三步曲做就可以了
     [code:1]
     ./configure --prefix=/usr --shared
     make
     make install
     [/code:1]
     接下来多了个make 静态库得过程(注意权限的设置)
     [code:1]
     make clean
     ./configure --prefix=/usr
     make
     make install   如果要测试的话在make完后可以make check一下
     chmod 644 /usr/lib/libz.a
     [/code:1]
     由于约定俗称的关系, 重要的库文件是放在/lib下的, 所以我们还要移动一下并修改一些符号链接
     [code:1]
     mv /usr/lib/libz.so.* /lib
     ln -sf ../../lib/libz.so.1 /usr/lib/libz.so
     [/code:1]
     
     Mktemp-1.5
     

     老样子的三步, 没啥特别的
     [code:1]
     patch -Np1 -i ../mktemp-1.5-add-tempfile.patch
     ./configure --prefix=/usr --with-libc
     make
     make install
     make install-tempfile
     [/code:1]
     
     Iana-Etc-1.00
     

     这个包只需要两步
     [code:1]
     make
     make install
     [/code:1]
     
     Findutils-4.1.20
     

     同样三步搞定
     [code:1]
     ./configure --prefix=/usr --libexecdir=/usr/lib/locate \
        --localstatedir=/var/lib/misc
     make
     make install
     [/code:1]
     
     Gawk-3.1.3
     

     [code:1]
     ./configure --prefix=/usr --libexecdir=/usr/lib
     make
     make install
     [/code:1]
     
     Ncurses-5.4
     

     首先是老样子把包安装好
     [code:1]
     ./configure --prefix=/usr --with-shared --without-debug
     make
     make install
     [/code:1]
     然后调整一些权限并移动库文件到/lib下,最后创建一些软链接
     [code:1]
     chmod 755 /usr/lib/*.5.4
     chmod 644 /usr/lib/libncurses++.a
     mv /usr/lib/libncurses.so.5* /lib
     ln -sf ../../lib/libncurses.so.5 /usr/lib/libncurses.so
     ln -sf libncurses.so /usr/lib/libcurses.so
     [/code:1]
     
     Vim-6.2
     

     这个大家都知道啦, 一般干什么坏事都缺不了它
     先把把 vimrc和gvimrc 文件的位置改在 /etc目录下,然后开始编译vim
     [code:1]
     echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
     echo '#define SYS_GVIMRC_FILE "/etc/gvimrc"' >>
                 src/feature.h

     ./configure --prefix=/usr
     make
     make install
     [/code:1]
     由于很多人习惯用vi启动编辑器,所以还要做个链接,接着用vimrc
      configre一下vim
    [code:1]
    cat > /etc/vimrc << "EOF"
    " Begin /etc/vimrc

    set nocompatible
    set backspace=2
    syntax on

    " End /etc/vimrc
    EOF
    [/code:1]
   
    M4-1.4
   

    [code:1]
    ./configure --prefix=/usr
    make
    make install
    [/code:1]
    It's easy  ^_^ , next is what?
   
    Bison-1.875
   

    [code:1]
    patch -Np1 -i ../bison-1.875-attribute.patch

    ./configure --prefix=/usr
    make
    make install
    [/code:1]
   
    Less-382
   

    这个也是老面孔了, 呵呵.
    [code:1]
    ./configure --prefix=/usr --bindir=/bin --sysconfdir=/etc
    make
    make install
    [/code:1]
   
    Groff-1.19
   

    [code:1]
    PAGE=letter ./configure --prefix=/usr
    make
    make install
    ln -s soelim /usr/bin/zsoelim
    ln -s eqn /usr/bin/geqn
    ln -s tbl /usr/bin/gtbl
    [/code:1]
    也就多了建立软链接的过程,其他的和前面几个一样
   
     Sed-4.0.9
   

    名气大大的咚咚,不过安装很简单.
    [code:1]
    ./configure --prefix=/usr --bindir=/bin
    make
    make install
    [/code:1]
   
    Flex-2.5.4a
   

    这个稍微复杂一点, 先是普通的编译过程, 再是为一些库做些链接.
   [code:1]
   ./configure --prefix=/usr
   make
   make install

   ln -s libfl.a /usr/lib/libl.a
   [/code:1]
    一些程序并不知道flex而是试图寻找lex程序(事实上,flex是实现lex功能的另一种也是更好的选择)。为了满足少数一些程序的需要,我们将创建一个lex脚本,这个脚本调用flex并通过它来模仿lex的输出文件命名惯例:
    [code:1]
    cat > /usr/bin/lex << "EOF"
    #!/bin/sh
    # Begin /usr/bin/lex

    exec /usr/bin/flex -l "$@"

    # End /usr/bin/lex
    EOF
   
    chmod 755 /usr/bin/lex
    [/code:1]
   
    Gettext-0.14.1
   

    [code:1]
    ./configure --prefix=/usr
    make
    make install
    [/code:1]
    这个没什么难度
   
    Net-tools-1.60
   

    这个是一些关于网络方面的一个包, 比较重要.
    [code:1]
    patch -Np1 -i ../net-tools-1.60-miitool-gcc33-1.patch
  
  在接下的config过程中如果你不知道在make阶段所有问题的答案,就接受缺省设置,这在大多数情况下都是很好的。这些问题是关于你内核中使用了的网络协议的。缺省的答案将使这个包里的程序能使用大多数的协议,比如 TCP,PPP 以及很多其它的,不过你还要在内核里支持这些协议。你这里做的仅仅是告诉程序使用这些协议,而协议是否能在系统中得到则取决于内核。

   make config
   make
   make update
   [/code:1]
   所不同的就是这个包的安装用的是 make update 而不是make install, 请注意不要顺手就............
   
   Inetutils-1.4. 2
   

    这个包同样是关于网络方面的, 比较重要
    [code:1]
    patch -Np1 -i ../inetutils-1.4.2-no_server_man_pages-1.patch

    ./configure --prefix=/usr --libexecdir=/usr/sbin \
                     --sysconfdir=/etc --localstatedir=/var \
                     --disable-logger --disable-syslogd \
                     --disable-whois --disable-servers
   
    make
    make install
    mv /usr/bin/ping /bin    ;移动ping命令到/bin下
    [/code:1]
   
    Perl-5.8.4
   

     Perl软件包包换的perl是 Practical Extraction and Report Language的缩写。Perl 将 C, sed, awk 和 sh 的最佳特性集于一身,是一种强大的编程语言, 现在就让我们开始编译它吧:
     [code:1]
     ./configure.gnu --prefix=/usr -Dpager="/bin/less -isR"
     
     如果你要对perl的设置进行更多的控制,你可以运行交互的Configure脚本,改变一些缺省的配置。如果你能接受perl的自动配置(是很明智的),就用上面的命令。
     
     make                     ;同样在此之后可以check, 我这里就偷懒了.
     make install
     [/code:1]
     
     Texinfo-4.7
     

     简单的几步就可以搞定.
     [code:1]   
     ./configure --prefix=/usr  
     make
     make install
     
     安装texinfo组件中本应由TeX来安装的部份(可选操作):
      make TEXMF=/usr/share/texmf install-tex
     [/code:1]
     如果任何时候需要重建/usr/share/info/dir(也就是我们常用的info系统), 还需要按下面的步骤做.
     [code:1]
     cd /usr/share/info
     
     rm dir
     for f in *
     do install-info $f dir 2>/dev/null
     done
     [/code:1]
     
     Autoconf-2.59
     

     [code:1]
     ./configure --prefix=/usr
     make
     make install
     [/code:1]
     
     Automake-1.8.4
     

     这个包和上面那个都是以后为了编译源代码而准备的. 有些软件可能需要老一些的autoconf, 以后可以再装一个,不过安装过程还是比较简单的.
     [code:1]
     ./configure --prefix=/usr
     make
     make install
     [/code:1]
     
     Bash-2.05b
     

     这个前面说过了, 现在就不再废话了.
     [code:1]
     patch -Np1 -i ../bash-2.05b-2.patch
     ./configure --prefix=/usr --bindir=/bin
     make
     make install
     [/code:1]
     
     File-4.09
     

     这个包安装的是查看文件类型的咚咚的.
     [code:1]  
     ./configure --prefix=/usr
     make
     make install
     [/code:1]
     
     Libtool-1.5.6
     

     从它的名字就可以看出来, 它带来的是一些与GNU 库打交道的程序  
     [code:1]
      ./configure --prefix=/usr
     make
     make install
     [/code:1]
     
     Bzip2-1.0.2
     

     大家都用过bz2的源代码包吧, 这个就是幕后的功臣了.
     [code:1]
     make -f Makefile-libbz2_so
     make clean
     
     make
     make install
     [/code:1]
      然后把一些可执行的二进制文件放到它该去的地方
     [code:1]
     cp bzip2-shared /bin/bzip2
     cp -a libbz2.so* /lib
     ln -s ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
     rm /usr/bin/{bunzip2,bzcat,bzip2}
     mv /usr/bin/{bzip2recover,bzless,bzmore} /bin
     ln -s bzip2 /bin/bunzip2
     ln -s bzip2 /bin/bzcat
     [/code:1]
     
     Diffutils-2.8.1
     

     这个包安装的是用来比较文件夹差异的可执行文件.
     [code:1]
      ./configure --prefix=/usr
     make
     make install
     [/code:1]
     
     Ed-0.2
     

     这个包提供了一个行编辑工具.
     [code:1]
     patch -Np1 -i ../ed-0.2-mkstemp.patch
     ./configure --prefix=/usr --exec-prefix=""
     make
     make install
     [/code:1]
     
     Kbd-1.12
     

     这个简单的说就是一个键盘映射表.
     [code:1]
     patch -Np1 -i ../kbd-1.12-more-programs-1.patch
     ./configure
     make
     make install
     [/code:1]
     然后设置一下键盘,对于我们绝大多数人来说用默认的就可以了.我就不再介绍了.      
     
     E2fsprogs-1.35
     

     ext文件的一些工具, 没啥好说的.
     [code:1]
     推荐在源码目录外面来编译它:

     mkdir ../e2fsprogs-build
     cd ../e2fsprogs-build
     
     ../e2fsprogs-1.35/configure --prefix=/usr --with-root-prefix="" \
    --enable-elf-shlibs
     make
     make install
     make install-libs   
     [/code:1]
     
     Grep-2.5.1
     

     Grep的大名没人没听过吧 ^_^
     [code:1]
     ./configure --prefix=/usr --bindir=/bin --with-included-regex
     make
     make install
     [/code:1]
     
     Grub-0.94
     

     .....................(省略一千字)
     [code:1]
     ./configure --prefix=/usr
     make
     make install
     mkdir /boot/grub
     cp /usr/share/grub/i386-pc/stage{1,2} /boot/grub
     [/code:1]
     具体的配置grub的过程以后说, 这里我想说的是如果你打算用已经存在的grub来引导lfs的话, 这个包可以不装的.
     
     Gzip-1.3.5
     

     .gz的文件就靠它了.
     [code:1]
     ./configure --prefix=/usr
     
     gzexe程序里包含对gzip程序的硬路径引用。由于我们后面要改变gzip的位置,就需要用下面的命令改变gzexe中的硬路径:
     
     cp gzexe.in{,.backup}
     sed 's%"BINDIR"%/bin%' gzexe.in.backup > gzexe.in

     make
     make install
     [/code:1]
     同样也要把一些东西移动到/bin下面去.
     [code:1]
     mv /usr/bin/gzip /bin
     rm /usr/bin/{gunzip,zcat}
     ln -s gzip /bin/gunzip
     ln -s gzip /bin/zcat
     ln -s gunzip /bin/uncompress
     [/code:1]
     
     Man-1.5m2
     

     man文档........
     [code:1]
     patch -Np1 -i ../man-1.5m2-80cols.patch
     sed -i 's/-is/&R/' configure
     sed -i 's%MANPATH./usr/man%#&%' src/man.conf.in
     ./configure -default -confdir=/etc
     make
     make   install
     [/code:1]
     
     Make-3.80
     

     拿来"作"东西的东西
     [code:1]
     ./configure --prefix=/usr
     make
     make install
     [/code:1]
     
     Modutils-2.4.27
     

     这个包提供modprobe等和kernel_modules打交道的程序的.
     [code:1]
     ./configure
     make
     make install   
     [/code:1]
     
     Patch-2.5.4
     

     打补丁时候用得到的程序
     [code:1]
     CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/usr
     make
     make install
     [/code:1]
     
     Procinfo-18
     

     提供显示kernel运行状态的机制.
     [code:1]
     make LDLIBS=-lncurses
     make install
     [/code:1]
     
     Procps-3.2.1
     

     要与进程打交道就靠它了
     [code:1]
     make
     make install
     rm /lib/libproc.so
     [/code:1]
     
     Psmisc-21.4
     
 楼主| 发表于 2004-10-5 20:05:18 | 显示全部楼层
../linuxthreads/sysdeps/pthread/timer_routines.c:492: undefined reference to `pthread_create'
collect2: ld returned 1 exit status
make[2]: *** [/mnt/lfs/sources/glibc-build/rt/librt.so] Error 1
make[2]: Leaving directory `/mnt/lfs/sources/glibc-2.3.3-lfs-5.1/posix'
make[1]: *** [posix/tests] Error 2
make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.3.3-lfs-5.1'
make: *** [check] Error 2
错误如上


错误已解决。问题就在于前面那个--without-cvs去掉就可以了。
回复

使用道具 举报

发表于 2004-10-5 20:35:19 | 显示全部楼层
linky_fan兄,这个LFS是个什么样的系统啊?它的安装是要自己编译的吗?你把源代码下载下来后再进行自己编译,像编译内核一样可以更自由的定制自己的系统吗?
回复

使用道具 举报

发表于 2004-10-5 20:39:07 | 显示全部楼层
[quote:9e1f79e04d="linky_fan"]下面这句在guide中话我觉得可能会有点模糊,先看一下
ln -s gcc /tools/bin/cc
我觉得这里的gcc应该是同样在/tools/bin/下面的gcc,而不是一 个在gcc-build中的gcc目录。[/quote]

这一句是没错的,等同于 cd /tools/bin; ln -s gcc cc 。人家不是 ln -s ./gcc /tools/bin/cc 。
回复

使用道具 举报

发表于 2004-10-5 20:44:32 | 显示全部楼层
怎么看不到你说明白设置系统环境和用户就开始了哈?
回复

使用道具 举报

 楼主| 发表于 2004-10-5 20:54:11 | 显示全部楼层
to dannycat,
这个因为以前已经做好了,这次只是格了重装哈 ,不要紧,一会补充。那个错误我觉得可以暂时不管。官方文档上有这么一句话As mentioned earlier, we don't recommend running the test suites for the temporary system here in this chapter. 呵呵。
回复

使用道具 举报

 楼主| 发表于 2004-10-5 20:58:40 | 显示全部楼层
to fox_eagle2003,
你可以参考一下下面这个链接,它会告诉你一切的。http://lfs.linuxsir.org/htdocs/lfscvs/preface/foreword.html
回复

使用道具 举报

发表于 2004-10-5 21:04:53 | 显示全部楼层
那个错误…… 你是在 2.6 的内核下编译的吧? 我在 2.4 的内核下从来没有碰到过在 pthread 相关的地方出错,包括第5章这个 not recommend 的 make check。
回复

使用道具 举报

 楼主| 发表于 2004-10-5 21:39:35 | 显示全部楼层
我用的是redhat es3 2.4的内核。查了下也没找到答案,如果是我用2.6的gentoo的话,可能就用nptl了。而最多现在不做make check咯
回复

使用道具 举报

 楼主| 发表于 2004-10-6 13:07:33 | 显示全部楼层
现在正在test gcc,比较慢 :neutral:
回复

使用道具 举报

 楼主| 发表于 2004-10-7 21:09:58 | 显示全部楼层
          
偶的lfs 5.1.1已经完工了,现在正着手写安装日记,希望和我一样的lfs菜鸟可以顺利安装完。
回复

使用道具 举报

发表于 2005-8-26 16:26:51 | 显示全部楼层
我的LFS6.0在键入startx命令后显示:NO screens found 该怎么办?
回复

使用道具 举报

发表于 2005-8-26 16:41:08 | 显示全部楼层
  我的LFS6.0在键入startx命令后显示:NO screens found 该怎么办?
回复

使用道具 举报

 楼主| 发表于 2005-8-26 22:47:22 | 显示全部楼层
我的LFS6.0在键入startx命令后显示:NO screens found 该怎么办?

不会是chroot环境吧?
回复

使用道具 举报

发表于 2005-10-9 14:06:51 | 显示全部楼层
这个帖子含金量高
极具性价比
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-25 21:04 , Processed in 0.106672 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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