<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Big toy for boy! &#187; lfs</title>
	<atom:link href="http://bigtoy4boy.com/blog/tag/lfs/feed/" rel="self" type="application/rss+xml" />
	<link>http://bigtoy4boy.com/blog</link>
	<description>一个有关一些个人兴趣爱好的博客</description>
	<lastBuildDate>Wed, 04 Aug 2010 08:47:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>LFS让你更加熟悉Linux</title>
		<link>http://bigtoy4boy.com/blog/2009/02/lfs-let-you-know-the-linux-detail/</link>
		<comments>http://bigtoy4boy.com/blog/2009/02/lfs-let-you-know-the-linux-detail/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 15:38:31 +0000</pubDate>
		<dc:creator>羽高</dc:creator>
				<category><![CDATA[互联网技术]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[lfs]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[编译]]></category>

		<guid isPermaLink="false">http://www.bigtoy4boy.com/blog/?p=162</guid>
		<description><![CDATA[LFS是Linux From Scratch的缩写，是一个按照文档指导，全部通过软件的源代码编译构建一个自定义Linux系统的项目。先不说它怎么可以定制自己的Linux系统或开发自己的一个Linux发行版，我觉得它可以让大家更深入的了解Linux系统。也许你已经可以在现成的发行版中编译个apache或者mysql什么的，但是你知道linux中众多软件包之间的关系吗？你知道你常用的工具来自那个源代码包吗？你熟悉bash下面一些常用的自动化脚本吗？这些都可以通过成功的完成一次LFS编译来学习到，甚至可以领悟到更多。 很早以前就了解到LFS这个项目了，但是一直没有时间编译一个系统出来，记得两年前曾经搞过一次，当时纯属乱来，卡到中间报错也不知道为什么，无法继续下去又不肯重新来，于是就放弃了。这几天又重新将这个东西拾起来，过程中学到了不少东西。下面就拿出来晒一晒，看你知道这些linux的tips吗？ bash下可以用大括号来代表几个需要遍历的值，比如 cp /tmp/{abc,def}表示 cp /tmp/abc /tmp/def。这样有时候前面路径很长，就写一次就好了。 sed是一个很常用的文本编辑程序，需要程序化调用的时候，批量处理，或者你没有vi的时候，非常方便。你需要熟悉一些简单的正则表达式，如果加入-i参数，就会直接按照给定的规则修改输入的文件。 2&#62;$1这个这么诡异的符号代表将错误输出也重定向到标准输出上来，linux里分stdin,stdout,errout三种东西，前面的指令就是将后两个输出合并。2&#62;$1 &#62; /dev/null就是将所有输出都不予显示。2&#62;$1 &#124; tee tmp.log使用tee这个程序既将显示内容显示在屏幕上又将内容储存在文件中。如果一些工作你需要记录日志，又要查询当前情况，看到屏幕的输出，就可以这么用。 不管是学习还是完整编译一个LFS系统，为了顺利完成，请参考我下面的经验： 所有指令建议自己一个个字敲进去，不要copy &#38; paste，因为你敲进去才会注意细节。想想每一句都是什么意思，尝试将指令搞懂。文档中其实都有很详细的解释，配合着应该所有的指令都能看懂，也能总结出来我上面描述的以前不知道的小窍门。 严格按照文档中的软件包版本号来编译，除非找不到该包，可以尝试稍微新一点版本。因为版本不同，可能提到的一些细节就不被支持，到时候你也不知道正确还是错误，也许会出现很多莫名奇妙的错误。 严格的按照文档中的要求打patch，我有一次就自认为不需要那个patch，结果到后面几步出现问题，排查才发现是这个patch的原因。 遇到问题首先检查当前输入的命令是否正确，环境变量以及前置指令是否拼写正确。如果无法排除错误就要看输出，找到错误提示再尝试看看是不是前置的包安装有问题导致的。Makefile.in其实描述的是批量处理要执行的指令，找出错误的地方手动执行一下，看看错误的细节。例如我就在一个地方发现touch setting times of &#8216;subdirs&#8217;: function not implemented，一开始以为subdirs有问题，后来才发现单独执行touch命令，就会报错function not implemented.明显是touch这个程序有问题，再man touch查所在那个软件包，发现是coreutils，这是前两个步骤编译的东西，退回去就发现了问题。 需要在某个步骤退回去的时候，就要查询一下已经编译的程序都有那些，在path默认能检索到的目录，比如/tools /bin /usr/bin如果有这些程序就应该删除掉，否则退回去以后编译的过程会使用这些也许有错误的程序。 按照文档的提示执行测试，如果测试出现问题并且文档没有提示忽略，应该检查一下问题的根源。如果实在不行就继续，期望后面不会有问题。有些测试无法通过也是正常的现象。 文档的每一个章节都描述的是一个软件包的编译，测试，安装的过程，在此之前请下载并解压进入该软件包，结束所有工作后请删除此目录已经编译时建立的目录。文档中提到的某些软件多次编译，都不是在同一环境下多次编译的，都是需要重新解压一个新的、干净的目录来完成编译的，所以章节的结束就应该删除这些目录，因为此时编译好的程序已经安装到指定的位置了。 花费时间长的就几个包：glibc, gcc, linux kernal。你可以开着电脑睡上一觉，不然漫长的等待在漆黑的夜晚不好过。 虚拟机下是可以完成LFS的编译的，除非它太慢了，你无法忍受，我的系统就在vmwave中安装suse linux，并在其中编译出来的。其实运行vwwave的系统是个Mac 我也许这次算是比较幸运，没有遇到什么头痛的问题，接下来如果你在编译时出现问题，自己解决不了的话，欢迎给我留言，将详细的状态信息，错误信息提交给我，我帮你来分析问题，并且从中大家一起总结经验。就像我翻译的一篇文章所说的“教会别人是学习的最佳途径”，祝大家研究顺利，玩得开心。]]></description>
			<content:encoded><![CDATA[<p>LFS是Linux From Scratch的缩写，是一个按照文档指导，全部通过软件的源代码编译构建一个自定义Linux系统的项目。先不说它怎么可以定制自己的Linux系统或开发自己的一个Linux发行版，我觉得它可以让大家更深入的了解Linux系统。也许你已经可以在现成的发行版中编译个apache或者mysql什么的，但是你知道linux中众多软件包之间的关系吗？你知道你常用的工具来自那个源代码包吗？你熟悉bash下面一些常用的自动化脚本吗？这些都可以通过成功的完成一次LFS编译来学习到，甚至可以领悟到更多。</p>
<p>很早以前就了解到LFS这个项目了，但是一直没有时间编译一个系统出来，记得两年前曾经搞过一次，当时纯属乱来，卡到中间报错也不知道为什么，无法继续下去又不肯重新来，于是就放弃了。这几天又重新将这个东西拾起来，过程中学到了不少东西。下面就拿出来晒一晒，看你知道这些linux的tips吗？</p>
<ol>
<li>bash下可以用大括号来代表几个需要遍历的值，比如 cp /tmp/{abc,def}表示 cp /tmp/abc /tmp/def。这样有时候前面路径很长，就写一次就好了。</li>
<li>sed是一个很常用的文本编辑程序，需要程序化调用的时候，批量处理，或者你没有vi的时候，非常方便。你需要熟悉一些简单的正则表达式，如果加入-i参数，就会直接按照给定的规则修改输入的文件。</li>
<li>2&gt;$1这个这么诡异的符号代表将错误输出也重定向到标准输出上来，linux里分stdin,stdout,errout三种东西，前面的指令就是将后两个输出合并。2&gt;$1 &gt; /dev/null就是将所有输出都不予显示。2&gt;$1 | tee tmp.log使用tee这个程序既将显示内容显示在屏幕上又将内容储存在文件中。如果一些工作你需要记录日志，又要查询当前情况，看到屏幕的输出，就可以这么用。</li>
</ol>
<p>不管是学习还是完整编译一个LFS系统，为了顺利完成，请参考我下面的经验：</p>
<ol>
<li>所有指令建议自己一个个字敲进去，不要copy &amp; paste，因为你敲进去才会注意细节。想想每一句都是什么意思，尝试将指令搞懂。文档中其实都有很详细的解释，配合着应该所有的指令都能看懂，也能总结出来我上面描述的以前不知道的小窍门。</li>
<li>严格按照文档中的软件包版本号来编译，除非找不到该包，可以尝试稍微新一点版本。因为版本不同，可能提到的一些细节就不被支持，到时候你也不知道正确还是错误，也许会出现很多莫名奇妙的错误。</li>
<li>严格的按照文档中的要求打patch，我有一次就自认为不需要那个patch，结果到后面几步出现问题，排查才发现是这个patch的原因。</li>
<li>遇到问题首先检查当前输入的命令是否正确，环境变量以及前置指令是否拼写正确。如果无法排除错误就要看输出，找到错误提示再尝试看看是不是前置的包安装有问题导致的。Makefile.in其实描述的是批量处理要执行的指令，找出错误的地方手动执行一下，看看错误的细节。例如我就在一个地方发现touch setting times of &#8216;subdirs&#8217;: function not implemented，一开始以为subdirs有问题，后来才发现单独执行touch命令，就会报错function not implemented.明显是touch这个程序有问题，再man touch查所在那个软件包，发现是coreutils，这是前两个步骤编译的东西，退回去就发现了问题。</li>
<li>需要在某个步骤退回去的时候，就要查询一下已经编译的程序都有那些，在path默认能检索到的目录，比如/tools /bin /usr/bin如果有这些程序就应该删除掉，否则退回去以后编译的过程会使用这些也许有错误的程序。</li>
<li>按照文档的提示执行测试，如果测试出现问题并且文档没有提示忽略，应该检查一下问题的根源。如果实在不行就继续，期望后面不会有问题。有些测试无法通过也是正常的现象。</li>
<li>文档的每一个章节都描述的是一个软件包的编译，测试，安装的过程，在此之前请下载并解压进入该软件包，结束所有工作后请删除此目录已经编译时建立的目录。文档中提到的某些软件多次编译，都不是在同一环境下多次编译的，都是需要重新解压一个新的、干净的目录来完成编译的，所以章节的结束就应该删除这些目录，因为此时编译好的程序已经安装到指定的位置了。</li>
<li>花费时间长的就几个包：glibc, gcc, linux kernal。你可以开着电脑睡上一觉，不然漫长的等待在漆黑的夜晚不好过。</li>
<li>虚拟机下是可以完成LFS的编译的，除非它太慢了，你无法忍受，我的系统就在vmwave中安装suse linux，并在其中编译出来的。其实运行vwwave的系统是个Mac <img src='http://bigtoy4boy.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ol>
<p>我也许这次算是比较幸运，没有遇到什么头痛的问题，接下来如果你在编译时出现问题，自己解决不了的话，欢迎给我留言，将详细的状态信息，错误信息提交给我，我帮你来分析问题，并且从中大家一起总结经验。就像我翻译的一篇文章所说的“教会别人是学习的最佳途径”，祝大家研究顺利，玩得开心。</p>
]]></content:encoded>
			<wfw:commentRss>http://bigtoy4boy.com/blog/2009/02/lfs-let-you-know-the-linux-detail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
