📄 makeworld.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="generator" content="HTML Tidy, see www.w3.org" /><title>重新编译 world</title><meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.7" /><link rel="HOME" title="FreeBSD 使用手册" href="index.html" /><link rel="UP" title="最前沿" href="cutting-edge.html" /><link rel="PREVIOUS" title="同步你的源码" href="synching.html" /><link rel="NEXT" title="跟踪多台机器" href="small-lan.html" /><link rel="STYLESHEET" type="text/css" href="docbook.css" /><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /></head><body class="SECT1" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#840084"alink="#0000FF"><div class="NAVHEADER"><table summary="Header navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><th colspan="3" align="center">FreeBSD 使用手册</th></tr><tr><td width="10%" align="left" valign="bottom"><a href="synching.html"accesskey="P">后退</a></td><td width="80%" align="center" valign="bottom">章 19. 最前沿</td><td width="10%" align="right" valign="bottom"><a href="small-lan.html"accesskey="N">前进</a></td></tr></table><hr align="LEFT" width="100%" /></div><div class="SECT1"><h1 class="SECT1"><a id="MAKEWORLD" name="MAKEWORLD">19.4. 重新编译 ``world''</a></h1><p>只要你根据一定版本的FreeBSD (FreeBSD-STABLE, FreeBSD-CURRENT,等等),已经同步了你本地的源码树,那么你就可以使用这些源码树来重建系统。</p><div class="WARNING"><blockquote class="WARNING"><p><b>做好备份</b>无需强调在行动 <span class="emphasis"><iclass="EMPHASIS">之前</i></span> 备份整个系统是多么的重要。 尽管重新编译系统是(如果您按照文档的指示做的话) 一件很容易完成的工作, 但出错也是在所难免的, 另外,别人在源码里面引入的错误也可能造成系统无法引导。</p><p>请确信自己已经做过备份, 并且在手边有恢复软盘或可以引导的光盘。您可能永远也不会用到它, 但安全第一嘛!</p></blockquote></div><div class="WARNING"><blockquote class="WARNING"><p><b>订阅恰当的邮件列表</b>FreeBSD-STABLE 和 FreeBSD-CURRENT 分支自然是<spanclass="emphasis"><iclass="EMPHASIS">发展中的</i></span>。为FreeBSD做贡献的都是人,偶尔也会犯错误。</p><p>有时这些错误没什么危害,只是引起你的系统生成新的诊断警告。有时是灾难性的,并导致你的系统不能惊动启动或破坏你的文件系统(甚至更糟)。</p><p>如果出现了类似的问题,贴一封``小心(headsup)''帖到相关的邮件列表里,讲清问题的本质以及受影响的系统。在问题解决后,再贴封``解除(allclear)'' 声明。</p><p>如可你想跟踪FreeBSD-STABLE 或 FreeBSD-CURRENT而又不阅读<ahref="http://lists.FreeBSD.org/mailman/listinfo/freebsd-stable"target="_top">FreeBSD-STABLE 邮件列表</a>和<ahref="http://lists.FreeBSD.org/mailman/listinfo/freebsd-current"target="_top">FreeBSD-CURRENT 邮件列表</a>各自的邮件列表,那么你是自找麻烦。</p></blockquote></div><div class="WARNING"><blockquote class="WARNING"><p><b>不要使用 <tt class="COMMAND">make world</tt></b>许多较早的文档推荐使用 <ttclass="COMMAND">make world</tt> 来完成这项工作。 这样做会跳过一些必要的步骤,因此只有在你知道自己在做什么的时候才可以这样做。 几乎所有的情况下 <ttclass="COMMAND">make world</tt> 都是不应该做的事情, 您应该使用这里描述的方法。</p></blockquote></div><div class="SECT2"><h2 class="SECT2"><a id="AEN27005" name="AEN27005">19.4.1. 更新系统的规范途径</a></h2><p>要更新系统,就要使用下面的过程:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make buildworld</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make buildkernel</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make installkernel</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">reboot</kbd></pre><p>你应该启动到单用户模式下(例如从启动提示符处使用<tt class="COMMAND">boot-s</tt>)。然后执行:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mergemaster -p</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">make installworld</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mergemaster</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">reboot</kbd></pre><div class="WARNING"><blockquote class="WARNING"><p><b>阅读进一步的说明</b>上边描述的序列只是有助于你开始工作的简要。要清楚的理解每一不步,尤其是你想使用定制内核配置,你就应阅读下面的部分。</p></blockquote></div></div><div class="SECT2"><h2 class="SECT2"><a id="AEN27031" name="AEN27031">19.4.2. 阅读 <ttclass="FILENAME">/usr/src/UPDATING</tt></a></h2><p>在你做其它事之前,请阅读<tt class="FILENAME">/usr/src/UPDATING</tt>(或在你的源码里的等效的文件)。这个文件要包含有关于你可能遇到的问题的重要信息,或指定了你可能使用到的命令的执行顺序。如果<tt class="FILENAME">UPDATING</tt> 与你这里读到相矛盾,那就先依据<ttclass="FILENAME">UPDATING</tt>。</p><div class="IMPORTANT"><blockquote class="IMPORTANT"><p><b>重要:</b> 正如先前所述,阅读<ttclass="FILENAME">UPDATING</tt>并不能替代订阅正确的邮件列表。两都是互补的,并不彼此排斥。</p></blockquote></div></div><div class="SECT2"><h2 class="SECT2"><a id="AEN27041" name="AEN27041">19.4.3. 检查 <ttclass="FILENAME">/etc/make.conf</tt></a></h2><p>检查 <tt class="FILENAME">/usr/share/examples/etc/make.conf</tt> (在 FreeBSD 4.X 中叫做 <tt class="FILENAME">/etc/defaults/make.conf</tt>) 以及 <ttclass="FILENAME">/etc/make.conf</tt>。 第一个文件包含了一些默认的定义 -它们中的绝大多数都注释掉了。 为了在重新编译系统时能够使用它们, 请把这些选项加入到 <ttclass="FILENAME">/etc/make.conf</tt>。 请注意在 <tt class="FILENAME">/etc/make.conf</tt>中的任何设置同时也会影响每次运行 <tt class="COMMAND">make</tt> 的结果,因此设置一些适合自己系统的选项是一个好习惯。</p><p>一般的用户通常会从 <tt class="FILENAME">/usr/share/examples/etc/make.conf</tt> (或者FreeBSD 4.X 中的 <tt class="FILENAME">/etc/defaults/make.conf</tt>) 复制 <ttclass="MAKEVAR">CFLAGS</tt> 和 <tt class="MAKEVAR">NOPROFILE</tt> 这样的设置到 <ttclass="FILENAME">/etc/make.conf</tt> 中并令它们生效。</p><p>请考虑其他的一些选项 (例如 <tt class="MAKEVAR">COPTFLAGS</tt>, <ttclass="MAKEVAR">NOPORTDOCS</tt> 等等), 看看是否合用。</p></div><div class="SECT2"><h2 class="SECT2"><a id="AEN27063" name="AEN27063">19.4.4. 更新<ttclass="FILENAME">/etc</tt>里边的文件</a></h2><p><ttclass="FILENAME">/etc</tt>目录包含有除了你的系统启动时执行的脚本外大部分的系统配置信息。有些脚本随FreeBSD的版本而不同。</p><p>有些配置文件在天天运行的系统里也是要使用到的。尤其是<ttclass="FILENAME">/etc/group</tt>。</p><p>偶尔, 某些``makeinstallworld''的安装需要特定的用户名或用户组存在。在升级时,有可能这些用户或组就不存在。这会在升级过程造成出错。有时,``makeinstallworld''会首先检查这些用户或组是否存在。</p><p>最近就有个这样的例子,当时<tt class="USERNAME">smmsp</tt>用户是被增加了的。当<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">mtree</span>(8)</span>试着建立<ttclass="FILENAME">/var/spool/clientmqueue</tt>时,安装过程失败了。</p><p>解决办法是检查<ttclass="FILENAME">/usr/src/etc/group</tt>并把它的组列表与你的进行比较。如果在新文件里有而你的文件里没有的,就把它们复制过来。同样地,你把<tt class="FILENAME">/etc/group</tt>里的任何这样的组进行更名---与<ttclass="FILENAME">/usr/src/etc/group</tt>中有相同GID,但不同名的那些。</p><p>自4.6-RELEASE开始,你可以通过<varclass="OPTION">-p</var>选项以预建(pre-buildworld)模式运行<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">mergemaster</span>(8)</span> 。这样只是比较那些对于成功执行<ttclass="MAKETARGET">buildworld</tt>或<ttclass="MAKETARGET">installworld</tt>起关键作用的文件。在第一次时,如果早期的<ttclass="COMMAND">mergemaster</tt>版本不支持<varclass="OPTION">-p</var>的话,就使用源码树中的新版本:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">cd /usr/src/usr.sbin/mergemaster</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">./mergemaster.sh -p</kbd></pre><div class="TIP"><blockquote class="TIP"><p><b>提示:</b>如果你是个偏执狂(paranoid),你可以检查你的系统看看哪个文件属于你已更名或删除了的那个组。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">find / -group <varclass="REPLACEABLE">GID</var> -print</kbd></pre><p>将显示所有<varclass="REPLACEABLE">GID</var>组(可以是组名也可以是数字地组ID)所有的文件。</p></blockquote></div></div><div class="SECT2"><h2 class="SECT2"><a id="MAKEWORLD-SINGLEUSER" name="MAKEWORLD-SINGLEUSER">19.4.5.改为单用户模式</a></h2><p>你可能相在单用户模式下编译系统。除了对更快处理事情显然有好处外,重装系统将接触许多重要的系统文件,包括所有标准系统二进制文件、库文件、包含(include)文件等等。在运行的系统里(尤其是同时系统里有激活的用户)更改这些文件是自寻烦恼。</p><p>另一种模式是在多用户模式下编译系统,然后转换到单用户模式下安装。如果你喜欢这种方式,只需在建立(build)完成后才执行下边的步骤。你推迟转换到单用户模式下直到你必须<tt class="MAKETARGET">installkernel</tt>或<tt class="MAKETARGET">installworld</tt>。</p><p>从运行的系统里,以超级用户方式执行:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">shutdown now</kbd></pre><p>这样就会转换到单用户模式。</p><p>另外也可以,重启系统,在启动提示符处,输入<varclass="OPTION">-s</var>标识。系统就会启动单用户。再在shell提示符处执行:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">fsck -p</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mount -u /</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">mount -a -t ufs</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">swapon -a</kbd></pre><p>这会检查文件系统,重新装载<tt class="FILENAME">/</tt>为读/写,参考<ttclass="FILENAME">/etc/fstab</tt>装载其它所有的UFS文件系统,然后打开交换(swapping)开关。</p><div class="NOTE"><blockquote class="NOTE"><p><b>注:</b> 如果你的CMOS时钟是设置为本地时间,而不是GMT(如果<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">date</span>(1)</span>命令输出不能显示正确的时间和地区也有确有其事),你可能也需要执行下边的命令:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">adjkerntz -i</kbd></pre><p>这样可以确定你正确的本地时区设置--不这样做,你以后可能会碰到一些问题。</p></blockquote></div></div><div class="SECT2"><h2 class="SECT2"><a id="AEN27143" name="AEN27143">19.4.6. 删除<ttclass="FILENAME">/usr/obj</tt></a></h2><p>在重建部分系统时,它们被(默认地)放到了<ttclass="FILENAME">/usr/obj</tt>目录下边。这些目录影射到了<ttclass="FILENAME">/usr/src</tt>下边。</p><p>删除这个目录,你可以加快``makebuildworld''的过程,并且省下与依赖关系有关的许多头痛的事情。</p><p><ttclass="FILENAME">/usr/obj</tt>下的有些文件可能设置了不可改(immutable)属性(查看<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">chflags</span>(1)</span>了解更多),你必须先把这些标志去掉。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">cd /usr/obj</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">chflags -R noschg *</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">rm -rf *</kbd></pre></div><div class="SECT2"><h2 class="SECT2"><a id="AEN27163" name="AEN27163">19.4.7. 重编译源码</a></h2><div class="SECT3"><h3 class="SECT3"><a id="AEN27165" name="AEN27165">19.4.7.1. 保存输出</a></h3><p>建议把执行<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">make</span>(1)</span>后得到的输出存成一个文件。如果什么地方出了错,你就会有个错误信息的备份。尽管这样不能帮你分析哪里出了错,但如果你把你的问题贴到某个邮件列表里就能帮助其他的人。</p><p>这样做最简单的办法是使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">script</span>(1)</span>命令,同是带上参数指定存放输出的文件名。你应在重建系统之前立即这样做,然后在过程完成时输入<kbd class="USERINPUT">exit</kbd>。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">script /var/tmp/mw.out</kbd>Script started, output file is /var/tmp/mw.out<samp class="PROMPT">#</samp> <kbd class="USERINPUT">make TARGET</kbd>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -