📄 makeworld.html
字号:
<p>如果还有轻微的错误,可以轻易地重建系统的选定部分。例如,在部分升级或合并<ttclass="FILENAME">/etc</tt>时,你不小心删除了<tt class="FILENAME">/etc/magic</tt>,<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">file</span>(1)</span>命令就会停止工作。这种情况下,执行下边进行修复:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src/usr.bin/file</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make all install</kbd></pre></div><div class="SECT2"><h2 class="SECT2"><a id="AEN31138" name="AEN31138">21.4.16. 问题</a></h2><div class="QANDASET"><dl><dt>21.4.16.1. <a href="makeworld.html#Q21.4.16.1.">每个变化你都须要重建系统吗?</a></dt><dt>21.4.16.2. <ahref="makeworld.html#Q21.4.16.2.">我的编译失败,并伴随有许多11(或其它的数字信息)号错误。是怎么回事呀?</a></dt><dt>21.4.16.3. <a href="makeworld.html#Q21.4.16.3.">我完成后可以删除<ttclass="FILENAME">/usr/obj</tt>吗?</a></dt><dt>21.4.16.4. <a href="makeworld.html#Q21.4.16.4.">中断的build可以被恢复吗?</a></dt><dt>21.4.16.5. <a href="makeworld.html#Q21.4.16.5.">我怎样加快建立系统的速度?</a></dt><dt>21.4.16.6. <a href="makeworld.html#Q21.4.16.6.">如果出现了错误我该怎么办?</a></dt></dl><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q21.4.16.1." name="Q21.4.16.1."></a><b>21.4.16.1.</b>每个变化你都须要重建系统吗?</p></div><div class="ANSWER"><p><b></b>这个不好说,因为要看变化的情况。如,如果你刚运行了<bclass="APPLICATION">CVSup</b>,并得到下边更新的文件:</p><pre class="SCREEN"><tt class="FILENAME">src/games/cribbage/instr.c</tt><tt class="FILENAME">src/games/sail/pl_main.c</tt><tt class="FILENAME">src/release/sysinstall/config.c</tt><tt class="FILENAME">src/release/sysinstall/media.c</tt><tt class="FILENAME">src/share/mk/bsd.port.mk</tt></pre><p>这就不必重建整个系统。你只需到相关的子目录里执行<tt class="COMMAND">make allinstall</tt>,仅此而已。但是,如果有重大变化,如<ttclass="FILENAME">src/lib/libc/stdlib</tt>,那么你就要重建系统或至少静态链接的那些部分(除了你增加的部分都是静态链接的)。</p><p>在这天后,就是你的事了。要是说每两个星期重建一下系统的话,你可能会高兴。或者你可能只想重做改变过的部分,确信你能找出所有依赖关系。</p><p>当然,所有这些依赖于你想升级的频率,和你是否想跟踪FreeBSD-STABLE 或FreeBSD-CURRENT。</p></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q21.4.16.2." name="Q21.4.16.2."></a><b>21.4.16.2.</b>我的编译失败,并伴随有许多11(或其它的数字信息)号错误。是怎么回事呀?</p></div><div class="ANSWER"><p><b></b>这个通常表示硬件错误。(重)建系统是个强压测试系统硬件的有效地方式,并且常常产生内存错误。这些正好表示它们自已做为编译器离奇地死于收到的奇怪信息。</p><p>一个确信的指示器是如果重新开始make,并且整个过程中会死在不同的点上。</p><p>对于这种情况,你没有什么可做的,除了更换机器里的部件,看是哪一个坏了。</p></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q21.4.16.3." name="Q21.4.16.3."></a><b>21.4.16.3.</b> 我完成后可以删除<ttclass="FILENAME">/usr/obj</tt>吗?</p></div><div class="ANSWER"><p><b></b>简短地说可以。</p><p><tt class="FILENAME">/usr/obj</tt> 包含了所有在编译阶段生成的目标文件。通常,在``makeworld''过程中第一步之一就是删除这个目录重新开始。这种情况下,在你完成后,保留<ttclass="FILENAME">/usr/obj</tt>没有多大意义,还可释放一大堆磁盘空间(通常在340 MB左右)。</p><p>只是,如果你清楚你在干什么,你可以让``makeworld''跳过这一步。这会让后继的build执行得更快,因为大部分的源码都不必再进行编译了。这个的另一面就在于敏感的依赖问题可以潜在,并以奇怪的方式引起build的失败。这在FreeBSD邮件列表里经常引起沸腾,当有人抱怨他们build失败时,并没意识到这是因为自已是想抄近路(意思是说少了些必要的步骤)。</p></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q21.4.16.4." name="Q21.4.16.4."></a><b>21.4.16.4.</b>中断的build可以被恢复吗?</p></div><div class="ANSWER"><p><b></b>依赖于你在你找到问题之前整个过程进行了多远。</p><p><span class="emphasis"><i class="EMPHASIS">大体上</i></span>(这个并不是硬性规定),``make world''过程会建立新版的基本工具(如<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">gcc</span>(1)</span>和<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">make</span>(1)</span>)以及系统二进制文件。这些工具和二进制文件然后被安装。新的工具和库然后用来重建它们自已,并再次被安装。整个系统(现在包括了常规的用户程序,如<span class="CITEREFENTRY"><span class="REFENTRYTITLE">ls</span>(1)</span> 或 <spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">grep</span>(1)</span>)然后使用新的系统文件被重建。</p><p>如果你处在最后阶段,你就知道了(因为你已经看过你存储的输出),然后你可以做(相当安全):</p><pre class="SCREEN"><span class="emphasis"><i class="EMPHASIS">... 问题修复 ...</i></span><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make -DNOCLEAN all</kbd></pre><p>这将不能取消``make world''先前所做的工作。</p><p>在``make world''所输出里,如果你看到如下信息:</p><pre class="SCREEN">--------------------------------------------------------------Building everything..--------------------------------------------------------------</pre><p>那么这样做就是相当安全的。</p><p>如果你没有看到那个信息,或者你不能确定,那么安全第一,从问题(scratch)处重新开始。</p></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q21.4.16.5." name="Q21.4.16.5."></a><b>21.4.16.5.</b>我怎样加快建立系统的速度?</p></div><div class="ANSWER"><p><b></b></p><ul class="noindent"><li><p>以单用户模式运行</p></li><li><p>把<tt class="FILENAME">/usr/src</tt>和<ttclass="FILENAME">/usr/obj</tt>目录放到不同磁盘里的独立文件系统里。如果可能,这些磁盘在不同的磁盘控制器里。</p></li><li><p>更好的,是把这些文件系统放置到多个使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ccd</span>(4)</span>(连接磁盘驱动器--concatenated diskdriver)设备的磁盘里。</p></li><li><p>关掉profiling (在<tt class="FILENAME">/etc/make.conf</tt>里设置``NOPROFILE=true'')。你差不多用不了它。</p></li><li><p>在<tt class="FILENAME">/etc/make.conf</tt>里也为<ttclass="MAKEVAR">CFLAGS</tt>设置上<var class="OPTION">-O -pipe</var>。最佳优化<varclass="OPTION">-O2</var>会更慢,而且<var class="OPTION">-O</var> 和 <varclass="OPTION">-O2</var>之间的优化差别基本上可以忽略。 <varclass="OPTION">-pipe</var>让编译器使用管道而不用临时文件进行通信,这样可以减少磁盘存取(以内存作为代价)。</p></li><li><p>传递<var class="OPTION">-j<var class="REPLACEABLE">n</var></var>选项给<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">make</span>(1)</span>以便并发运行多个进程。这样就不会考虑你的是否是单个或多个处理器机器。</p></li><li><p>存放<tt class="FILENAME">/usr/src</tt>的文件系统可以使用<varclass="OPTION">noatime</var>选项被装载(或再装载)。这样会防止文件系统记录文件的存取时间。你可能并不需要这些信息。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mount -u -o noatime /usr/src</kbd></pre><div class="WARNING"><blockquote class="WARNING"><p><b>Warning</b>这个例子里假定<ttclass="FILENAME">/usr/src</tt>是在它自已的文件系统里。如果不是(例如假设它是<ttclass="FILENAME">/usr</tt>的部分),那么你就需要那个文件系统装载点,而不是<ttclass="FILENAME">/usr/src</tt>。</p></blockquote></div></li><li><p>存放<tt class="FILENAME">/usr/obj</tt>的文件系统可以使用<varclass="OPTION">async</var>选项被装载(或被再装载)。这会引起异步写盘。换句话说,写是立即完成了,而数据要延迟几秒才会写到盘里。这就允许写到一堆,如此产生戏剧性的性能提高。</p><div class="WARNING"><blockquote class="WARNING"><p><b>Warning</b>记住,这个选项会使你的文件系统更加脆弱。使用这个选项增大了这样一个机率:要是电源断了,在机器重启后,文件系统将处在不可恢复状态。</p><p>如果在这个文件系统里<ttclass="FILENAME">/usr/obj</tt>是很关键的,这不是问题。如果你有其它有价值的数据在同一个文件系统,那么在你使用这个选项这前,确认备份一下。</p></blockquote></div><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mount -u -o async /usr/obj</kbd></pre><div class="WARNING"><blockquote class="WARNING"><p><b>Warning</b>同上,如果<ttclass="FILENAME">/usr/obj</tt>不在自已的文件系统里,使用相关装载点的名字把它从例子里边替换掉。</p></blockquote></div></li></ul></div></div><div class="QANDAENTRY"><div class="QUESTION"><p><a id="Q21.4.16.6." name="Q21.4.16.6."></a><b>21.4.16.6.</b>如果出现了错误我该怎么办?</p></div><div class="ANSWER"><p><b></b>绝对确信你的环境没有先前build留下的残余。这点够简单。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">chflags -R noschg /usr/obj/usr</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">rm -rf /usr/obj/usr</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make cleandir</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make cleandir</kbd></pre><p>不错,<tt class="COMMAND">make cleandir</tt>真的要执行两次。</p><p>然后重新开始整个过程,使用<tt class="COMMAND">make buildworld</tt>开始。</p><p>如果你还有问题,就把错误和<tt class="COMMAND">uname -a</tt>的输出发送到<ahref="http://lists.FreeBSD.org/mailman/listinfo/freebsd-questions" target="_top">FreeBSDgeneral questions 邮件列表</a>邮件列表。准备回答其它关于你的设置的问题!</p></div></div></div></div></div><div class="NAVFOOTER"><hr align="LEFT" width="100%" /><table summary="Footer navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><td width="33%" align="left" valign="top"><a href="synching.html"accesskey="P">Prev</a></td><td width="34%" align="center" valign="top"><a href="index.html"accesskey="H">Home</a></td><td width="33%" align="right" valign="top"><a href="small-lan.html"accesskey="N">Next</a></td></tr><tr><td width="33%" align="left" valign="top">同步你的源码</td><td width="34%" align="center" valign="top"><a href="cutting-edge.html"accesskey="U">Up</a></td><td width="33%" align="right" valign="top">跟踪多台机器</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -