LinuxZhouYing 2008-09-11
最早看到LFS这个名词是在3年前,那时我还在搞.NET,只是简单的查了一下LFS的含义,以为是Linux的又一个发行版,就没在意。最近突然想到了它,就仔细读了一下它的手册,才发现它只是一个手册,指导用户如何从头创建一个Linux系统。于是我就照着手册开始做了。
说是从头开始,其实还是要有一些基本环境的,比如你至少要有一套Linux下的编译环境glibc,gcc等不能少,因为有些安装包的Configure脚本需要用到gawk,grep等工具,所以在开始整个任务前也要检查下这些工具。好在LFS的手册最开始部分已经列出了所需的所有工具,用户只需要看看自己的环境下面有没有就行了。如果是使用LFS的LiveCD,它里面已经包含了这些基本工具,也就不需要再安装其它东西。我在一开始是跳开了这一章,结果在后面的某次编译时,出了一个不明的BUG,在网上查了好一会,才发现是少了gawk这个工具,后来看到这一章,后悔自己没耐心全看完。所以,如果是第一次用LFS时一定要按部就班的来,可以省掉后面很多麻烦,但麻烦也是相对的,如果不出现这些麻烦,也就不会完全理解为什么需要这些工具。
详细的步骤我就不说了,LFS的手册中已经写得很清楚了,这里主要说一下我在编译过程中遇到的一些问题,及解决办法。
第一个问题出现在编译GCC的时候,其中有个选项--with-local-prefix=/tools,其实在这个时候/mnt/lfs/tools/include目录中根本没有glibc的头文件以及linux kernel的头文件,整个手册中也没有交代这些include文件是什么时候从什么地方复制到这个目录中的,我想可能是从系统的/user/include中复制过来的。因为在开始编译的时候使用的glibc是/usr/lib中的。这样一来,不只要复制include文件还要复制lib文件,这时候又有问题了,我应该复制哪些lib文件呢,整个目录中有很多库文件,而且又有各种各样的link,于是我就试着从头开始,在编译binutils之前先安装linux api再编译glibc,除了--prefix=/tools之外,不加任何其他参数,编译成功后,在开始手册上的第一步。这样就使得后面编译过程中--with-local-prefix=/tools这个参数不会导致错误。事后我查到关于gcc升级的步骤,也是先编译glibc(前提是gcc以来的glibc需要更新),然后编译gcc。
第二个问题出现在第二次编译glibc(按照手册的顺序是第一次编译glibc),make时发生错误,网上搜了下,原来是我的debian上缺少gawk,于是就装了一个,重新configure后编译通过,这点在之前也提到过,一定不要漏掉LFS手册中开头的部分。
第三个问题是关于环境变量,LFS手册中再三强调要建立一个lfs用户,并且所有的第一轮编译必须使用这个用户进行。我因为中途切换到root去复制一些文件,之后又忘记切换回来,导致在编译一个工具时出现 cannot compute sizeof ( double long )这个错误。前后检查都没问题,后来突然发现自己用的不是lfs用户,再查看环境变量,和lfs差很多。切换会lfs之后,重新configure,编译成功。事后分析很可能是缺少LC_ALL=POSIX这个环境变量的原因(猜测)。
以上3个是我这几天来遇到的3个主要问题,也都出现在第一轮。第二轮编译,很顺利,基本上是打字编译再打字再编译的工作。整个过程我一共用了2个双休日,和2个半工作日。终于在今天中午顺利的启动了我自己编译的Linux系统,并且在LFS的网站上注册了用户,我的ID是20188。嘿嘿,感觉还不错,接下来就是要把手册中我偷懒漏掉或者没有详细研究的部分再补上,然后继续研究BLFS手册。
感觉这几天来还是学到了不少的Linux知识,包括工具的使用,到Linux中文件结构的组织,这算是给我的Linux之旅充了一次电。