• 22 二 2009 /  互联网技术

    LFS是Linux From Scratch的缩写,是一个按照文档指导,全部通过软件的源代码编译构建一个自定义Linux系统的项目。先不说它怎么可以定制自己的Linux系统或开发自己的一个Linux发行版,我觉得它可以让大家更深入的了解Linux系统。也许你已经可以在现成的发行版中编译个apache或者mysql什么的,但是你知道linux中众多软件包之间的关系吗?你知道你常用的工具来自那个源代码包吗?你熟悉bash下面一些常用的自动化脚本吗?这些都可以通过成功的完成一次LFS编译来学习到,甚至可以领悟到更多。

    很早以前就了解到LFS这个项目了,但是一直没有时间编译一个系统出来,记得两年前曾经搞过一次,当时纯属乱来,卡到中间报错也不知道为什么,无法继续下去又不肯重新来,于是就放弃了。这几天又重新将这个东西拾起来,过程中学到了不少东西。下面就拿出来晒一晒,看你知道这些linux的tips吗?

    1. bash下可以用大括号来代表几个需要遍历的值,比如 cp /tmp/{abc,def}表示 cp /tmp/abc /tmp/def。这样有时候前面路径很长,就写一次就好了。
    2. sed是一个很常用的文本编辑程序,需要程序化调用的时候,批量处理,或者你没有vi的时候,非常方便。你需要熟悉一些简单的正则表达式,如果加入-i参数,就会直接按照给定的规则修改输入的文件。
    3. 2>$1这个这么诡异的符号代表将错误输出也重定向到标准输出上来,linux里分stdin,stdout,errout三种东西,前面的指令就是将后两个输出合并。2>$1 > /dev/null就是将所有输出都不予显示。2>$1 | tee tmp.log使用tee这个程序既将显示内容显示在屏幕上又将内容储存在文件中。如果一些工作你需要记录日志,又要查询当前情况,看到屏幕的输出,就可以这么用。

    不管是学习还是完整编译一个LFS系统,为了顺利完成,请参考我下面的经验:

    1. 所有指令建议自己一个个字敲进去,不要copy & paste,因为你敲进去才会注意细节。想想每一句都是什么意思,尝试将指令搞懂。文档中其实都有很详细的解释,配合着应该所有的指令都能看懂,也能总结出来我上面描述的以前不知道的小窍门。
    2. 严格按照文档中的软件包版本号来编译,除非找不到该包,可以尝试稍微新一点版本。因为版本不同,可能提到的一些细节就不被支持,到时候你也不知道正确还是错误,也许会出现很多莫名奇妙的错误。
    3. 严格的按照文档中的要求打patch,我有一次就自认为不需要那个patch,结果到后面几步出现问题,排查才发现是这个patch的原因。
    4. 遇到问题首先检查当前输入的命令是否正确,环境变量以及前置指令是否拼写正确。如果无法排除错误就要看输出,找到错误提示再尝试看看是不是前置的包安装有问题导致的。Makefile.in其实描述的是批量处理要执行的指令,找出错误的地方手动执行一下,看看错误的细节。例如我就在一个地方发现touch setting times of ’subdirs’: function not implemented,一开始以为subdirs有问题,后来才发现单独执行touch命令,就会报错function not implemented.明显是touch这个程序有问题,再man touch查所在那个软件包,发现是coreutils,这是前两个步骤编译的东西,退回去就发现了问题。
    5. 需要在某个步骤退回去的时候,就要查询一下已经编译的程序都有那些,在path默认能检索到的目录,比如/tools /bin /usr/bin如果有这些程序就应该删除掉,否则退回去以后编译的过程会使用这些也许有错误的程序。
    6. 按照文档的提示执行测试,如果测试出现问题并且文档没有提示忽略,应该检查一下问题的根源。如果实在不行就继续,期望后面不会有问题。有些测试无法通过也是正常的现象。
    7. 文档的每一个章节都描述的是一个软件包的编译,测试,安装的过程,在此之前请下载并解压进入该软件包,结束所有工作后请删除此目录已经编译时建立的目录。文档中提到的某些软件多次编译,都不是在同一环境下多次编译的,都是需要重新解压一个新的、干净的目录来完成编译的,所以章节的结束就应该删除这些目录,因为此时编译好的程序已经安装到指定的位置了。
    8. 花费时间长的就几个包:glibc, gcc, linux kernal。你可以开着电脑睡上一觉,不然漫长的等待在漆黑的夜晚不好过。
    9. 虚拟机下是可以完成LFS的编译的,除非它太慢了,你无法忍受,我的系统就在vmwave中安装suse linux,并在其中编译出来的。其实运行vwwave的系统是个Mac :-)

    我也许这次算是比较幸运,没有遇到什么头痛的问题,接下来如果你在编译时出现问题,自己解决不了的话,欢迎给我留言,将详细的状态信息,错误信息提交给我,我帮你来分析问题,并且从中大家一起总结经验。就像我翻译的一篇文章所说的“教会别人是学习的最佳途径”,祝大家研究顺利,玩得开心。

    Tags: , , , ,