📄 makeworld.html
字号:
<div class="SECT3"><h3 class="SECT3"><a id="MAKE-BUILDWORLD" name="MAKE-BUILDWORLD">21.4.7.2.编译基本系统</a></h3><p>你必须在<tt class="FILENAME">/usr/src</tt>目录里边:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src</kbd></pre><p>(当然,除非你的源码是在其它地方,真是这样的话更换成那个目录就行了)。</p><p>使用<span class="CITEREFENTRY"><span class="REFENTRYTITLE">make</span>(1)</span>命令重建系统。这个命令会从<ttclass="FILENAME">Makefile</tt>(描述组成FreeBSD的程序应该怎样被重建,以什么样的顺序建立等等)里读取指令。</p><p>输入的一般命令格式如下:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make -<varclass="REPLACEABLE">x</var> -D<var class="REPLACEABLE">VARIABLE</var> <varclass="REPLACEABLE">target</var></kbd></pre><p>这个例子里,<var class="OPTION">-<var class="REPLACEABLE">x</var></var>是会传递给<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">make</span>(1)</span>的一个选项。查看<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">make</span>(1)</span>手册有你可用的选项例子。</p><p><var class="OPTION">-D<var class="REPLACEABLE">VARIABLE</var></var>传递一个变量给<ttclass="FILENAME">Makefile</tt>。这些变量控制了<ttclass="FILENAME">Makefile</tt>的行为。这些同<ttclass="FILENAME">/etc/make.conf</tt>设置的变量一样,只是提供了另一种设置它们的方法。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make -DNOPROFILE <varclass="REPLACEABLE">target</var></kbd></pre><p>是另一种指定不被建立(built)的先定库(profiled libraries)的方式,协同<ttclass="FILENAME">/etc/make.conf</tt>里的</p><pre class="PROGRAMLISTING">NOPROFILE= true # 避免编译先定库</pre><p>一起使用。</p><p><var class="REPLACEABLE">目标(target)</var>告诉<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">make</span>(1)</span> 什么该做。每个<ttclass="FILENAME">Makefile</tt>定义了一定数量不同的``目标(targets)'',然后你选择的目标就决定了什么会发生。</p><p>有些目标列在<ttclass="FILENAME">Makefile</tt>里的,但并不意味着你要执行。相反,建立过程(buildprocess)利用它们把重建系统的一些必要的步骤分割成几个子步骤。</p><p>大部分的时间不需要向<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">make</span>(1)</span>传递参数,因此你的命令看起来可能象这样:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make <varclass="REPLACEABLE">target</var></kbd></pre><p>从FreeBSD 的2.2.5版本开始(实际上,是先在FreeBSD-CURRENT分支里第一次创建,然后在FreeBSD-STABLE的2.2.2 和 2.2.5两个版本间,进行了大翻新),<ttclass="MAKETARGET">world</tt> target已经分成了两个部分:<ttclass="MAKETARGET">buildworld</tt> 和<tt class="MAKETARGET">installworld</tt>。</p><p>正如名字所暗示的,<tt class="MAKETARGET">buildworld</tt>在<ttclass="FILENAME">/usr/obj</tt>下边建立了一个全新的树,然后<ttclass="MAKETARGET">installworld</tt> 就在当前的机器里安装这个树。</p><p>因为两个原因,这点很有用。首先,它允许你安全地完成建立(build),而没有你运行的系统组成部分的影响。建立(build)是``自主的(selfhosted)''。因为这样,你可以安全地在以多用户模式运行的机器里执行<ttclass="MAKETARGET">buildworld</tt>,而不用当心不良影响。但是依然推荐你在单用户模式时运行<ttclass="MAKETARGET">installworld</tt>。</p><p>第二,允许你使用NFS装载(NFS mounts)升级你网络里的多台计算机。如果你有三台<ttclass="HOSTID">A</tt>, <tt class="HOSTID">B</tt> 和 <ttclass="HOSTID">C</tt>想进行升级,在<tt class="HOSTID">A</tt>执行<tt class="COMMAND">makebuildworld</tt> 和 <tt class="COMMAND">make installworld</tt>。然后从<ttclass="HOSTID">A</tt>NFS装载(NFS mount)<tt class="HOSTID">B</tt> 和 <ttclass="HOSTID">C</tt>的<tt class="FILENAME">/usr/src</tt>和<ttclass="FILENAME">/usr/obj</tt>,接着你就执行<tt class="COMMAND">make installworld</tt>在<tt class="HOSTID">B</tt> 和 <tt class="HOSTID">C</tt>上安装建立(build)的结果。</p><p>尽管<tt class="MAKETARGET">world</tt> target仍然存在,强烈建议你不要用它。</p><p>运行</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make buildworld</kbd></pre><p>现在可能给<tt class="COMMAND">make</tt>指定<varclass="OPTION">-j</var>选项了,这样会使用产生出几个并发的进程来。这在多处理器(multi-CPU)机器里最有用。但是,由于大部分的编译过程是IO限制远胜CPU限制,它在单处理器(single-CPU)的机器里也是有用的。</p><p>在一般的单CPU机器里,你要运行:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make -j4 buildworld</kbd></pre><p><span class="CITEREFENTRY"><span class="REFENTRYTITLE">make</span>(1)</span>然后会有至多4个进程在同一时刻执行。贴到邮件列表里的实验证据显示这样会收到最好的效果。</p><p>如果你有一台多CPU机器,那你就使用SMP配置内核,试试6到10之间的值,看这些值提速如何。</p><p>注意,这仍处在实验性阶段,如果提交到源码树上的话,可能会断送其前程(break thisfeature)。如果用这个参数编译的话,你报告错误前试试不用它。</p></div><div class="SECT3"><h3 class="SECT3"><a id="AEN30734" name="AEN30734">21.4.7.3. 耗时</a></h3><p>有许多因素影响build时间,但通常一台带有128 MB内存500 MHz的 <spanclass="TRADEMARK">Pentium</span>® III要花费大约2 小时来build FreeBSD-STABLE树,并且在整个过程中不带什么技巧或捷径。FreeBSD-CURRENT 树花的时间还要更长一点。</p></div></div><div class="SECT2"><h2 class="SECT2"><a id="AEN30742" name="AEN30742">21.4.8. 编译和安装新内核</a></h2><p>要充分利用你的新系统,你应该重新编译内核。这是很有必要的,因为特定的内存结构已经发生了改变,像<span class="CITEREFENTRY"><span class="REFENTRYTITLE">ps</span>(1)</span> 和 <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">top</span>(1)</span>这样的程序会不能工作,除非内核同源码树的版本是一样的。</p><p>最简单、最安全的方式是build 并安装一个基于<ttclass="FILENAME">一般性(GENERIC)</tt>的内核。虽然<ttclass="FILENAME">GENERIC</tt>可能没有适合你的系统的所有必要的设备,但它包括了启动你的系统到单用户模式所必需的内容。这是个不错的检测新系统是否工作正常的测试。在从<tt class="FILENAME">GENERIC</tt>启动、核实系统可以工作后,你就可以建立(build)一个基于你的正常内核配置文件的新的内核了。</p><p>如果你升级到FreeBSD 4.0 或更高的版本,那么旧的内核build过程 (在<ahref="kernelconfig.html">Chapter 9</a>有描述)就不适用了。实际上,你应该在你已经<ahref="makeworld.html#MAKE-BUILDWORLD">使用<ttclass="MAKETARGET">buildworld</tt>建立系统(built the world)</a>后,执行这些命令。</p><div class="NOTE"><blockquote class="NOTE"><p><b>Note:</b> 如果你想建立一个定制内核,而且已经有了配置文件,只需象这样使用<varclass="LITERAL">KERNCONF=<var class="REPLACEABLE">MYKERNEL</var>:</var></p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make buildkernel KERNCONF=<varclass="REPLACEABLE">MYKERNEL</var></kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make installkernel KERNCONF=<varclass="REPLACEABLE">MYKERNEL</var></kbd></pre><p>在FreeBSD 4.2或更早的版本里,你必须使用<var class="LITERAL">KERNEL=</var>替换<varclass="LITERAL">KERNCONF=</var>。在2001年2月2号以前发行的4.2-STABLE并不识别<varclass="LITERAL">KERNCONF=</var>。</p></blockquote></div><p>注意,如果你已把<varclass="LITERAL">内核安全级别(kern.securelevel)</var>调高到了1以上,而且还设置了<varclass="LITERAL">noschg</var>或相似的标识到了你的内核二进制里边,你可能会发现转换到单用户模式里使用<tt class="MAKETARGET">installkernel</tt>是很有必要的。另外你应该也能毫无问题地从多用户模式执行这两个命令。查看<span class="CITEREFENTRY"><span class="REFENTRYTITLE">init</span>(8)</span>了解更多关于<varclass="LITERAL">内核安全级(kern.securelevel)</var>的信息;查看<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">chflags</span>(1)</span>了解更多关于不同文件标识的信息。</p><p>如果你升级到FreeBSD 4.0以前版本,你应旧的内核build程序。但还是推荐你使用新版的<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">config</span>(8)</span>,可以使用下边的命令行:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">/usr/obj/usr/src/usr.sbin/config/config <varclass="REPLACEABLE">KERNELNAME</var></kbd></pre></div><div class="SECT2"><h2 class="SECT2"><a id="AEN30798" name="AEN30798">21.4.9. 重启到单用户模式</a></h2><p>你应该单用户模式测试新内核。照<a href="makeworld.html#MAKEWORLD-SINGLEUSER">Section21.4.5</a>处的说明去做。</p></div><div class="SECT2"><h2 class="SECT2"><a id="AEN30804" name="AEN30804">21.4.10. 安装新的系统二进制(SystemBinaries)</a></h2><p>如果你正建立一个足以使用<tt class="COMMAND">makebuildworld</tt>的FreeBSD版本,那么你现在应该使用<ttclass="MAKETARGET">installworld</tt>来安装新的系统二进制。</p><p>执行</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/src</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make installworld</kbd></pre><div class="NOTE"><blockquote class="NOTE"><p><b>Note:</b> 如果在<tt class="COMMAND">makebuildworld</tt>的命令行指定了变量,你就必须在<tt class="COMMAND">makeinstallworld</tt>如命令行里指定同样的变量。对于其它的选项也不是必需的,如,<varclass="OPTION">-j</var>就不能同<tt class="MAKETARGET">installworld</tt>一起使用。</p><p>举例,你执行了:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make -DNOPROFILE buildworld</kbd></pre><p>你就必须使用:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make -DNOPROFILE installworld</kbd></pre><p>来安装结果,否则就要试着安装先定(profiled)的在<tt class="COMMAND">makebuildworld</tt>阶段没有建立(built)的二进制文件。</p></blockquote></div></div><div class="SECT2"><h2 class="SECT2"><a id="AEN30831" name="AEN30831">21.4.11. 不是由<ttclass="COMMAND">make world</tt>更新的更新文件</a></h2><p>重制系统(Remaking the world)不会使用新的或改过的配置文件更新某些目录(尤其像<ttclass="FILENAME">/etc</tt>, <tt class="FILENAME">/var</tt> 和 <ttclass="FILENAME">/usr</tt>)</p><p>更新这些文件最简单的方式就是使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>,手工去做也是可能的,只要你愿意。不管你选择哪一种,一定记得备份<tt class="FILENAME">/etc</tt>以防出错。</p><div class="SECT3"><h3 class="SECT3"><a id="MERGEMASTER" name="MERGEMASTER">21.4.11.1. <ttclass="COMMAND">mergemaster(合并主管)</tt></a></h3><i class="AUTHORGROUP"><span class="CONTRIB">贡献者:</span> Tom Rhodes.</i> <p><span class="CITEREFENTRY"><span class="REFENTRYTITLE">mergemaster</span>(8)</span>工具是个有针对性的脚本(Bourne script),用于检测<tt class="FILENAME">/etc</tt>和<ttclass="FILENAME">/usr/src/etc</tt>源码树里边的配置文件的不同点。这是保持系统配置文件同源码树里的一起更新的推荐方式。</p><p><tt class="COMMAND">mergemaster</tt>被集成到了3.3-RELEASE和3.4-RELEASE之间的FreeBSD基本系统里,这意味着自3.3版本起所有的-STABLE和 -CURRENT系统都有。</p><p>在提示符里简单地输入<ttclass="COMMAND">mergemaster</tt>就可以开始,并观看它的开始过程。<ttclass="COMMAND">mergemaster</tt>会建立一个临时的根(root)环境,在<ttclass="FILENAME">/</tt>下,放置各种系统配置文件。这些文件然后同当前安装到你系统里的进行比较。此时,不同的文件会以<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">diff</span>(1)</span>格式进行显示,使用<varclass="OPTION">+</var>符号标识增加或修改的行,<varclass="OPTION">-</var>标识将完全删除的行或将被替换成新行。查看<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">diff</span>(1)</span>手册可以得到更多关于<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">diff</span>(1)</span>语法和文件不同点怎样显示的信息。</p><p><span class="CITEREFENTRY"><span class="REFENTRYTITLE">mergemaster</span>(8)</span>会给你显示每个文件的不同处,这样你就可以选择是删除新文件(相对临时文件),是以未改状态安装临时文件,是以当前安装的文件合并临时文件,还是再看一次<span class="CITEREFENTRY"><span class="REFENTRYTITLE">diff</span>(1)</span>结果。</p><p>“选择删除临时文件”将使<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>知道我们希望保留我们当前的文件不改,并删除新的。并不推荐这个选择,除非你没有更改当前文件的理由。任何时候在<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span>提示符里输入<bclass="KEYCAP">?</b>,你就会得到帮助。如果选择跳过文件,在其它文件处理完后再次进行。</p><p>“选择安装未修改临时文件”将会使新文件替换当前的。对大部分未改的文件,这是个最好的选择。</p><p>“选择合并文件”将为你打开一个文本编辑器,里边是两个文件的内容。你现在就可以一边合并它们,一边在屏幕里查看,同时从两者中选取部分生成最终文件。当两个文件一起比较时,<b class="KEYCAP">l</b>键会选择左边的内容,<bclass="KEYCAP">r</b>会选择右边的。最终的输出是由两个部分组成的一个文件,用它就可以安装了。这个选项通常用于用户修改了设置的文件。</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -