LFS (版本6.1.1) 安装心得

发表于:2007-05-26来源:作者:点击数: 标签:
---前序: 好多年前,安装过早期的Slackware. 两三年前安装过RedHat9. 基本上就是安装好后, 进桌面系统打一下小 游戏 ,然后就删除掉.因为我的硬盘一直很小,20G. 当然一个很主要的原因是我不喜欢这些发行版中一大堆的东西,太乱,看不明白怎么组织的. 前几天换了4
---前序:

好多年前,安装过早期的Slackware.

两三年前安装过RedHat9.

基本上就是安装好后, 进桌面系统打一下小游戏,然后就删除掉.因为我的硬盘一直很小,20G.

当然一个很主要的原因是我不喜欢这些发行版中一大堆的东西,太乱,看不明白怎么组织的.

前几天换了40G硬盘,于是划分了8G安装了Debian.装好了后一看也是一大堆的软件,各式各样.正要准备删除.

不知道在哪里看到了LFS一下,顿时被吸引了,于是计划安装一个LFS.而Debian正好作为host system.

下面是我的安装心得,花了周5,周6两个通宵. (glibc, gclearcase/" target="_blank" >cc, firefox, Xorg耗时很多,在笔记本上安装.)

写点自己的体会,主要是整理自己对LFS安装过程的理解, 特别是ld和gcc的多次编译.



----目标:

为了创建一个干净的LFS系统.



----实现的大步骤:

1. 尽可能的摆脱host system的影响, 首先创建一个最基本的自治的Toolchain.

这个Toolchain中最基本的需要是: binutils(最基本的binary工具), gcc(编译器), glibc(函数库)

因为其它的tools就可以由这三个创建出来了.



2. 当所有的基本Toolchain工具准备好了,就可以chroot.



3. 在Chroot后的虚拟根/环境下, 用toolchain中的工具生成出最后的LFS系统.



---一个说明:

为什么要创建/tools这个link

初始的Toolchain工具创建在/mnt/lfs/tools目录下.

同时为了将来chroot后, 工具中的Interpreter信息仍然指向正确,使用了一个小技巧.

在host system中的/目录下创建一个名为tools的link, 指向/tools --> /mnt/lfs/tools

这个作用打个比方来说就是,当我们在使用host system的时候,我们可以使用/tools/bin/ld找到ld程序,

将来chroot后,/tools/bin/ld还是能找到这个ld.

否则我们在使用host system的时候,使用/mnt/lfs/tools/bin/ld来找到ld,

换句话说生成的程序包含/mnt/lfs这样的信息,将来chroot之后,可就不太好了.



----符号说明:

(为了行文方便)

bin-0 -----> host system的binutils

ld-0 -----> host system 的ld

bin-1 -----> 第一遍编译出的binutils

ld-1 -----> bin-1中的ld

ld-a -----> 第一次调正后的ld

bin-2 -----> 第二遍编译的binutils

ld-2 -----> bin-2中的ld

ld-b -----> 第二次调正后的ld

bin-3 -----> 第三遍编译生成的binutils

ld-3 -----> bin-3中的ld

gcc-0, gcc-1, gcc-2, gcc-3分别表示host system中的gcc, 和Toolchain中的两遍gcc和最后LFS系统的gcc.



----步骤分析:

好,现在让我们从头开始看LFS是如何生成的.



** bin-1和gcc-1的编译:

第一步,我们用host system中编译出bin-1时候,

使用的是host system的binutils(ld), gcc-0和glibc函数库.

(a) 生成的Program无可避免的受到host system的影响, 例如:

使用生成的ld-1程序将会link默认/lib下的libarary.



第二步,我们也许可以用host system直接来编译glibc,但是我们更希望使用自己的gcc来编译glibc,

所以我们先用host system来编译出gcc-1.

注意:编译gcc-1使用的是bin-1/ld-1, gcc-0, glibc-0.生成的gcc-1仍然受到host system的影响.

gcc-1会使用/lib目录下的dynamic linker (ld-linux.so.2), 而不是/tools/lib/ld-linux.so.2.



有了bin-1, gcc-1, 我们就可以立刻使用新生成的bintuils和gcc来编译glibc了.

要注意./configure的参数,它表明了glibc的编译工具都是用的/tools/bin下的ld, gcc了,

而不在是host system中的ld, gcc.虽然这个选项并不重要.



** 第一次进行Toolchain调正

当glibc-1编译完成,是时候修改(a)中提到的问题了.

这次调正的目标就是要让在以后的编译过程中,要求ld和gcc都只使用/tools/lib下的函数库,也就是刚刚编译好的glibc.

调整的办法是:

1.)对于ld,

make -C ld clean (先清空ld)

make -C ld LIB_PATH=/tools/lib (重新编译ld, 告诉ld以后要link /tools/lib下的函授库)

(这两步写在了Binutils-2.15.94.0.2.2 - Pass 1这一节,

我认为不好,应该放到第一次Toolchain调正中,更加连贯.)

make -C ld install (重新install到/tools/bin)

这就生成了ld-a (请注意,ld程序实际上在整个创建LFS过程中编译了5次!!!)

2.)对于gcc,

修改目的:告诉gcc要使用/tools/lib下的dynamic linker.

修改gcc的SPEC文件,把定义dynamic linker的地方修改成/tools/lib/ld-linux.so.2

(建议用vi自己改,更有把握,我第一次拷贝sed命令好像出错了,没有重试).

做完后,务必要做测试, 一定保证以后编译出来的程序使用正确的函数库(/tools/lib的glibc)

这个gcc可以称之为gcc-a



(这里是我们第一遍编译binutils和gcc.在整个系统的创建过程中,bintuils和gcc是要编译三次,

其它的基本Toolchain工具是编译两次, 额外的LFS系统软件仅需要一次.)

一个问题,在准备toolchain的时候为什么要编译bintuils和gcc两次呢?

因为在为了生成Toolchain中的gcc的过程中,我们希望生成的gcc是Self compile的,也就是自己能编译出自己来.

第一遍的binutils和gcc是为了编译出glibc并能自己编译出第二遍的gcc(Self compile).

虽然实际上可以直接由host system编译出Toolchain中的gcc和bintuils,但那样的Toolchain就不是self compile了.

所以gcc和binutils比别的基本工具都多编译了一次. (再次注意:ld共编译了5次!在两次调正中各还编译一次)



** bin-2和gcc-2的编译:

到这里后, 我们手里有了ld-a, gcc-a, 按道理我们应该立刻可以重新编译bintuils和gcc来生成bin-2和gcc-2.

但是为了做将来gcc-2的测试, 先编译了三个测试所需的软件包: Tcl, Expect, DejaGNU.这三个包理论上可以不要.



Okay,现在开始编译gcc-2

用到的编译器,linker和函数库分别是gcc-a, ld-a, glibc-1,可以看到已经没有host system的影响了.

然后编译bin-2,

用的分别是gcc-2, ld-a, glibc-1, 也不再受host system的影响了.

make install bin-2后, ld-a也更新为ld-2,



** 其它基本工具的编译:

以后toolchain中的其它工具就可以很容易的创建了.

使用的都是(ld-2, gcc-2, glibc-1)



** Chroot之后的glibc-2:

当/tools目录下这些工具准备齐全后,我们就可以开始chroot然后在基于根/分区的环境中,

利用这些工具生成最后的系统软件了.



毫无疑问,我们想要最先生成的系统软件就是bintuils和gcc.

但在创建它们之前,还有一个关键的包glibc-2需要编译出来.

glibc-2编译用到是:bin-2/ld-2, gcc-2, glibc-1.



** 第二次调正:

有了glibc-2后,我们就将开始第二次,也是最后一次Toolchain调正.

和第一次调正类似, 最关键的是要调正ld和gcc.

ld-2调正成ld-b:

make -C ld clean

make -C ld LIB_PATH=/usr/lib:/lib (告诉ld以后从这两个目录去找lib)

make -C ld INSTALL=/tools/bin/install install

gcc-2调正成gcc-b:

修改gcc spec文件's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g;

正好和第一次调正相反.



** bin-3和gc-3编译:

有了调正后的ld-b, gcc-b,就可以开始最终系统的编译了.

首先是bin-3. (使用的是: ld-b, gcc-b和glibc-2)

然后是gcc-3. (使用的是: ld-3, gcc-b和glibc-2)



** 系统的其它所需软件:

再后面其它的系统软件就都将由bin-2, gcc-3, glibc-2生成出来了.



走到这里,配置好系统Scripts和Kernel,以及grub.

Reboot!



!!!欢迎进入LFS!!!



----后记BLFS:

很开心, 参考LFS Book (v6.1.1)很顺利地安装好了LFS系统.

LFS最酷的地方,也是最吸引我的地方就是让我知道系统每个软件都有那些功能和哪些文件.

可以自主选择需要安装的软件.



安装好LFS之后, 立刻就删除了的host system --> debian. :-), 腾出空间便于安装X系统.

-gmp,便于拷贝粘贴.

-lynx,可以一边下载软件包和一边浏览BLFS Book.

-wget, 有些情况它比lynx下载快多了.



选择了Xorg.

(很奇怪它没有安装到/usr/X11R6下面,和书上不一致,但是使用好像没有问题,没有深入检查.)

Xorg自带了tvm,但实在太丑.

阅读了一下BLFS,权衡后选择了Xfce.我觉得Xfce已经很漂亮,而且精悍.



最后安装的三个软件分别是:

gdb, gvim, firefox.

原文转自:http://www.ltesting.net