LFS──Linux from Scratch总结
LFS──Linux from Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式。它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西( raw code) 作成符合自己口味的菜肴──个性化的linux,不单单是个性的桌面。
LFS是一本书,讲述如何逐步编译软件,建立一个基于Linux内核的操作系统的过程。每一个版本的LFS包含软件的版本是特定的。所以,把这些软件搜集到一起是非常重要的,否则就要一个一个的去下载了。幸好LFS的live光碟提供了所有程序的源码,并且提供了一个LINUX的环境,以供编译使用,这个环境就是所谓的宿主系统。
在linux环境下,一个程序的运行,如vim,应该有glibc和ncurses这两个库来承担其运行时动态库,ncurses必须于glibc相适应,而glibc有要于相应的Linux内核匹配。当然还有如shell之类的很多程序在运行。然而,Linux内核并不像glibc那样是依靠动态链接库的方式被调用的,内核不是用动态库的方式被调用的,因此不需要先编译,只要提供对应的头文件即可。
使用LFS编译的系统,首先不能受到宿主系统的影响,否则就没有意义了。为了达到这个目的,LFS把工具链放到/tools目录下,这样做还可方便的从目标系统中剥离此工具链。
那么当目标系统还不完全,不能够完成某些编译的时候,就可以使用/tools里面的编译链了。
这里有一个鸡蛋和母鸡的问题:将要编译的glibc,要在工具链的编译工具产生之前,而工具链的编译工具又依赖于glibc,到底是谁生谁 呢。。。
当然了,不能用宿主系统的工具链进行直接编译,那样会产生所谓的“污染”。于是LFS使用了一个间接的方法:使用一个”纯净“的A编译环境来生成编译目标系统的B编译环境。
这种多此一举的做法,令人迷惑。其根本原因在于:用不同版本的gcc编译出来的程序可能不一样。所以为了避免杂种的产生,必须严格控制母鸡的血统。这事使用这个方法的原因。
所以,制作LFS的工具链必须使用相同版本的gcc和binutils等工具编译出来。
这时候该宿主系统出马了,它的作用就是编译出正确版本的工具链,确定整个系统的血统基础,在这个基础至上,就可以生成所谓“纯净”的LINUX了。
一个明显的问题是,一般宿主系统与编译出来的工具链,版本不一致。这样是否会影响后代的血统呢?
这里用到了一个叫bootstrap的东东。bootstrap is resampling with replacement.它是gcc的一个参数,作用是重复编译它几次。它用第一次编译生成的程序来第二次编译自己,然后又用第二次编译生成的程序来第三次编译自己,最后比较第二次和第三次编译的结果, 以确保编译器能毫无差错的编译自身,这通常表明编译是正确的。
看起来n多领域都有这个东东,以下是是出自统计学的Bootstrap方法:
Bootstrap analysis是一种统计学方法,计算的基本方法是:从待分析的数据中随机重新取样,代替原有的数据,从而重建一系列与原数据同样大小的‘鞋带’式取样数据,一般重复500或1000次。
本质上,bootstrap用于检验由样本得到的统计量的可信度。
如果一个来自正态总体的样本S,我们可以根据它计算出u和sigma,而用bootstrap可以估计出u和sigma的可信度。
很明显:gcc只是自举三次。。。就纯种了。

Comments
还没有评论。
发表评论