diff options
author | Xin LI <delphij@FreeBSD.org> | 2009-02-24 20:00:44 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2009-02-24 20:00:44 +0000 |
commit | cd9e51b0196fe04568417a7c678df62909ec3162 (patch) | |
tree | f625bdcd32673958991375b10f688cebc55234b5 /zh_CN.GB2312/books/handbook/cutting-edge | |
parent | b227896c2086858857f74cc7ff9bf8fb0f6025ca (diff) |
Notes
Diffstat (limited to 'zh_CN.GB2312/books/handbook/cutting-edge')
-rw-r--r-- | zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml | 652 |
1 files changed, 605 insertions, 47 deletions
diff --git a/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml b/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml index 51ad128bc3..9540d7d53a 100644 --- a/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml @@ -2,7 +2,7 @@ The FreeBSD Documentation Project The FreeBSD Simplified Chinese Project - Original Revision: 1.233 + Original Revision: 1.240 $FreeBSD$ --> @@ -85,6 +85,12 @@ </listitem> <listitem> + <para>如何使用 + <application>CVSup</application><!-- 和 + <application>Docsnap</application>--> 来更新本地的文档。</para> + </listitem> + + <listitem> <para>两个开发分支 &os.stable; 和 &os.current; 的区别。</para> </listitem> @@ -168,7 +174,7 @@ <command>freebsd-update</command> 特性的部分, 那么这些在开始以下操作前必须先被禁止。</para> - <sect2> + <sect2 id="freebsdupdate-config-file"> <title>配置文件</title> <para>有些用户可能希望调整配置文件来更好的控制升级过程。 @@ -243,7 +249,7 @@ MergeChanges /etc/ /var/named/etc/</programlisting> # StrictComponents no</programlisting> <para>当设置成 <literal>yes</literal> 时, - <command>freebsd-udpate</command> 将假设这个 + <command>freebsd-update</command> 将假设这个 <literal>Components</literal> 列表时完整的, 并且对此列表以外的项目不会修改。实际上就是 <command>freebsd-update</command> 会尝试更新 @@ -251,7 +257,7 @@ MergeChanges /etc/ /var/named/etc/</programlisting> 列表里的每一个文件。</para> </sect2> - <sect2> + <sect2 id="freebsdupdate-security-patches"> <title>安全补丁</title> <para>安全补丁存储在远程的机器上, @@ -286,18 +292,43 @@ MergeChanges /etc/ /var/named/etc/</programlisting> 就需要重新启动系统。这将使 &os; 装载新的二进制程序进内存。</para> + <para><command>freebsd-update</command> 工具只能自动更新 <literal>GENERIC</literal> 内核。 + 如果您使用自行联编的内核, 则在 <command>freebsd-update</command> + 安装完更新的其余部分之后需要手工重新联编和安装内核。 不过, + <command>freebsd-update</command> 会检测并更新位于 <filename + class="directory">/boot/GENERIC</filename> (如果存在) 中的 + <literal>GENERIC</literal> 内核, 即使它不是当前 (正在运行的) + 系统的内核。</para> + <note> - <para><command>freebsd-update</command> 只能应用于 - <filename>GENERIC</filename> 内核。如果对 - <filename>GENERIC</filename> - 做了任何修改或者安装了一个自行编译的内核, - <command>freebsd-update</command> - 就无法完成升级 — 如前一个范例那样失败后 - 产生一条错误信息。</para> + <para>保存一份 <literal>GENERIC</literal> 内核的副本到 <filename + class="directory">/boot/GENERIC</filename> 是一个明智的主意。 + 在诊断许多问题, 以及在 + <xref linkend="freebsdupdate-upgrade"> 中介绍的使用 + <command>freebsd-update</command> 更新系统时会很有用。</para> + </note> + + <para>除非修改位于 + <filename>/etc/freebsd-update.conf</filename> 中的配置, + <command>freebsd-update</command> 会随其他安装一起对内核的源代码进行更新。 + 重新联编并安装定制的内核可以以通常的方式来进行。</para> + + <note> + <para>通过 <command>freebsd-update</command> 发布的更新有时并不会涉及内核。 + 如果在执行 + <command>freebsd-update install</command> 的过程中内核代码没有进行变动, + 就没有必要重新联编内核了。 不过, 由于 + <command>freebsd-update</command> 每次都会更新 + <filename>/usr/src/sys/conf/newvers.sh</filename> 文件, + 而修订版本 (<command>uname -r</command> 报告的 + <literal>-p</literal> 数字) 来自这个文件, 因此, + 即使内核没有发生变化, 重新联编内核也可以让 &man.uname.1; 报告准确的修订版本。 + 在维护许多系统时这样做会比较有帮助, + 因为这一信息可以迅速反映机器上安装的软件更新情况。</para> </note> </sect2> - <sect2> + <sect2 id="freebsdupdate-upgrade"> <title>重大和次要的更新</title> <para>这个过程会删除旧的目标文件和库, @@ -313,11 +344,58 @@ MergeChanges /etc/ /var/named/etc/</programlisting> <literal>yes</literal> 的话将在整个过程中对所有询问回答 <literal>yes</literal>,这会帮助在编译过程中免去人工的介入。</para> + <para>如果正在使用的是定制的内核, 则升级操作会复杂一些。 + 您会需要将一份 <literal>GENERIC</literal> 内核的副本放到 <filename + class="directory">/boot/GENERIC</filename>。 如果系统中没有 + <literal>GENERIC</literal> 内核, 可以用以下两种方法之一来安装:</para> + + <itemizedlist> + <listitem> + <para>如果只联编过一次内核, 则位于 + <filename class="directory">/boot/kernel.old</filename> 中的内核, + 就是 <literal>GENERIC</literal> 的那一个。 只需将这个目录改名为 + <filename class="directory">/boot/GENERIC</filename> 即可。</para> + </listitem> + + <listitem> + <para>假如能够直接接触机器, 则可以通过 CD-ROM 介质来安装 <literal>GENERIC</literal> + 内核。 将安装盘插入光驱, 并执行下列命令:</para> + + <screen>&prompt.root; <userinput>mount /cdrom</userinput> +&prompt.root; <userinput>cd /cdrom/<replaceable>X.Y-RELEASE</replaceable>/kernels</userinput> +&prompt.root; <userinput>./install.sh GENERIC</userinput></screen> + + <para>您需要将 <filename + class="directory"><replaceable>X.Y-RELEASE</replaceable></filename> + 替换为您正在使用的版本。 + <literal>GENERIC</literal> 内核默认情况下会安装到 <filename + class="directory">/boot/GENERIC</filename>。</para> + </listitem> + + <listitem> + <para>如果前面的方法都不可用, 还可以使用源代码来重新联编和安装 <literal>GENERIC</literal> + 内核:</para> + + <screen>&prompt.root; <userinput>cd /usr/src</userinput> +&prompt.root; <userinput>env DESTDIR=/boot/GENERIC make kernel</userinput> +&prompt.root; <userinput>mv /boot/GENERIC/boot/kernel/* /boot/GENERIC</userinput> +&prompt.root; <userinput>rm -rf /boot/GENERIC/boot</userinput></screen> + + <para>如果希望 <command>freebsd-update</command> 能够正确地将内核识别为 + <literal>GENERIC</literal>, 您必须确保没有对 + <literal>GENERIC</literal> 配置文件进行过任何变动。 + 此外, 建议您取消任何其他特殊的编译选项 (例如使用空的 + <filename>/etc/make.conf</filename>)。</para> + </listitem> + </itemizedlist> + + <para>上述步骤并不需要使用这个 <literal>GENERIC</literal> 内核来引导系统。</para> + <para>重大和次要的更新可以由 <command>freebsd-update</command> 命令后指定一个发行版本来执行, - 举例来说,下面的命令将帮助你升级到 &os; 6.3:</para> + 举例来说,下面的命令将帮助你升级到 &os; 6.4:</para> - <screen>&prompt.root; <userinput>freebsd-update -r 6.3-RELEASE upgrade</userinput></screen> + <screen>&prompt.root; <userinput>freebsd-update -r 6.4-RELEASE upgrade</userinput></screen> <para>在这个命令被执行后,<command>freebsd-update</command> 将会先解析配置文件和评估当前的系统以获得更新系统所需的必要信息。 @@ -325,7 +403,7 @@ MergeChanges /etc/ /var/named/etc/</programlisting> 例如:</para> <screen>Looking up update.FreeBSD.org mirrors... 1 mirrors found. -Fetching metadata signature for 6.3-BETA1 from update1.FreeBSD.org... done. +Fetching metadata signature for 6.3-RELEASE from update1.FreeBSD.org... done. Fetching metadata index... done. Inspecting system... done. @@ -345,16 +423,25 @@ Does this look reasonable (y/n)? y</screen> 将会尝试下载所有升级所需的文件。在某些情况下, 用户可能被问及需安装些什么和如何进行之类的问题。<para> - <para>下载完所有的补丁之后,它们很快就会被打上。 - 这个过程可能会持续一段时间,取决与机器的速度和当前的负载情况。 - 配置文件将会被合并 — 这一部分需要用户的参与, - 因为文件可能被合并或者屏幕上弹出了一个文本编辑器用来手工合并。 - 在处理过程中,每一个成功的合并都会给用户显示出来。 - 失败或者被忽略的合并则会引起合并程序的中止。 - 用户可能想要备份一下 <filename class="directory">/etc</filename> - 之后手工合并重要的文件,比如 - <filename>master.passwd</filename> 或 - <filename>group</filename>。</para> + <para>当使用定制内核时, 前面的步骤会产生类似下面的警告:</para> + + <screen>WARNING: This system is running a "<replaceable>MYKERNEL</replaceable>" kernel, which is not a +kernel configuration distributed as part of FreeBSD 6.3-RELEASE. +This kernel will not be updated: you MUST update the kernel manually +before running "/usr/sbin/freebsd-update install"</screen> + + <para>此时您可以暂时安全地无视这个警告。 更新的 + <literal>GENERIC</literal> 内核将在升级过程的中间步骤中使用。</para> + + <para>在下载完针对本地系统的补丁之后, 这些补丁会被应用到系统上。 + 这个过程需要消耗的时间取决于机器的速度和其负载。 + 这个过程中将会对配置文件所做的变动进行合并 — 这一部分需要用户的参与, + 文件可能会自动合并, 屏幕上也可能会给出一个编辑器, 用于手工完成合并操作。 + 在处理过程中, 合并成功的结果会显示给用户。 失败或被忽略的合并, + 则会导致这一过程的终止。 用户可能会希望备份一份 + <filename class="directory">/etc</filename> 并在这之后手工合并重要的文件, + 例如 <filename>master.passwd</filename> + 和 <filename>group</filename>。</para> <note> <para>系统至此还没有被修改,所有的补丁和合并都在另外一个目录中进行。 @@ -367,8 +454,25 @@ Does this look reasonable (y/n)? y</screen> <screen>&prompt.root; <userinput>freebsd-update install</userinput></screen> - <para>内核与内核模块会先被打上补丁。此时机器必须要重新启动。 - 使用下面的命令重启机器,这样新的内核将载入内存:</para> + <para>内核和内核模块会首先被打上补丁。 此时必须重新启动计算机。 + 如果您使用的是定制的内核, 请使用 &man.nextboot.8; + 命令来将下一次用于引导系统的内核 <filename + class="directory">/boot/GENERIC</filename> (它会被更新):</para> + + <screen>&prompt.root; <userinput>nextboot -k GENERIC</userinput></screen> + + <warning> + <para>在使用 <literal>GENERIC</literal> 内核启动之前, + 请确信它包含了用于引导系统所需的全部驱动程序 (如果您是在远程进行升级操作, + 还应确信网卡驱动也是存在的)。 特别要注意的情形是, + 如果之前的内核中静态联编了通常以内核模块形式存在的驱动程序, 一定要通过 + <filename>/boot/loader.conf</filename> 机制来将这些模块加载到 + <literal>GENERIC</literal> 内核的基础上。 此外, + 您可能也希望临时取消不重要的服务、 + 磁盘和网络挂载等等, 直到升级过程完成为止。</para> + </warning> + + <para>现在可以用更新后的内核引导系统了:</para> <screen>&prompt.root; <userinput>shutdown -r now</userinput></screen> @@ -401,10 +505,13 @@ Does this look reasonable (y/n)? y</screen> <screen>&prompt.root; <userinput>freebsd-update install</userinput></screen> + <para>如果您临时用过 <literal>GENERIC</literal> 内核来引导系统, + 现在是按照通常的方法重新联编并安装新的定制内核的时候了。</para> + <para>重新启动机器进入新版本的 &os; 升级过程至此就完成了。</para> </sect2> - <sect2> + <sect2 id="freebsdupdate-system-comparison"> <title>系统状态对照</title> <para><command>freebsd-update</command> @@ -531,8 +638,304 @@ Fetching 133 new ports or files... done.</screen> <screen>&prompt.root; <userinput>portsnap fetch update</userinput></screen> </sect1> + <sect1 id="updating-upgrading-documentation"> + <title>更新系统附带的文档</title> + + <indexterm><primary>更新和升级</primary></indexterm> + + <indexterm> + <primary>文档</primary> + <see>更新和升级</see> + </indexterm> + + <para>除了基本系统和 Ports 套件之外, 文档也是 &os; 操作系统的一个组成部分。 + 尽管您总是可以通过 <ulink + url="http://www.freebsd.org/doc/">&os; 网站</ulink> 来访问最新的 &os; + 文档, 一些用户的网络连接可能很慢, 甚至完全没有网络连接。 + 幸运的是, 有很多方法可以用来更新随发行版本附带的 &os; 文档的本地副本。</para> + + <sect2 id="csup-doc"> + <title>使用 CVSup 来更新文档</title> + + <para>&os; 文档的源代码和安装版本都可以通过 <application>CVSup</application> + 来以与基本系统 (参考 <xref linkend="makeworld">) 类似的方法来升级。 + 这一节中将会介绍:</para> + + <itemizedlist> + <listitem> + <para>如何安装联编文档所需的工具集, 用于从源代码来联编 &os; + 文档所需的那些工具。</para> + </listitem> + + <listitem> + <para>如何使用 <application>CVSup</application> + 将文档下载到 <filename class="directory">/usr/doc</filename>。</para> + </listitem> + + <listitem> + <para>如何从源代码联编 &os; 文档, + 并将其安装到 <filename class="directory">/usr/share/doc</filename>。</para> + </listitem> + + <listitem> + <para>联编文档的过程中支持的一些编译选项, + 例如只联编某些语言的版本, 或只联编特定的输出格式。</para> + </listitem> + </itemizedlist> + </sect2> + + <sect2 id="installing-documentation-toolchain"> + <title>安装 CVSup 和文档工具集</title> + + <para>从源代码联编 &os; 文档需要大量的工具。 + 这些工具并不是 &os; 基本系统的一部分, + 因为这些工具需要占用大量的磁盘空间, + 而且并不是对所有 &os; 用户都有用; + 只有活跃地撰写 &os; 新文档, + 或经常从源代码更新文档的用户才需要这些工具。</para> + + <para>全部所需的工具, 均可通过 Ports + 套件来安装。 <filename + role="package">textproc/docproj</filename> port 是由 + &os; 文档计划开发的方便安装和更新这些工具的主 + port。</para> + + <note> + <para>如果不需要 &postscript; 或 PDF 文档的话, + 也可以考虑安装 <filename + role="package">textproc/docproj-nojadetex</filename> port。 + 这套文档工具集包含除了 <application>teTeX</application> + typesetting 引擎之外的其他全部工具。 <application>teTeX</application> + 是一个很大的工具集, 因此如果不需要 PDF 输出的话, + 排除它会节省很多时间和磁盘空间。</para> + </note> + + <para>如欲了解关于安装和使用 + <application>CVSup</application> 的进一步信息, 请参阅 <link + linkend="cvsup">使用 CVSup</link>。</para> + </sect2> + + <sect2 id="updating-documentation-sources"> + <title>更新文档源代码</title> + + <para><application>CVSup</application> 工具能够下载文档源代码的原始副本, + 您可使用 <filename>/usr/share/examples/cvsup/doc-supfile</filename> + 文件作为配置模板来修改。 在 <filename>doc-supfile</filename> + 中的默认主机名是一个无效的占位主机名, + 但 &man.cvsup.1; 能够通过命令行来指定主机名, + 因此文档源代码可以使用下面的命令从 + <application>CVSup</application> 服务器获得:</para> + + <screen>&prompt.root; <userinput>cvsup -h <replaceable>cvsup.FreeBSD.org</replaceable> -g -L 2 <filename>/usr/share/examples/cvsup/doc-supfile</filename></userinput></screen> + + <para>您应将 <replaceable>cvsup.FreeBSD.org</replaceable> + 改为最近的 <application>CVSup</application> 服务器。 参见 <xref + linkend="cvsup-mirrors"> 关于镜像站点的完整列表。</para> + + <para>初始的文档源代码下载需要一些时间, + 您需要耐心等待它完成。</para> + + <para>后续的更新可以用同样的命令来进行。 + 由于 <application>CVSup</application> 工具只下载上次运行之后所发生过的更新, + 因此在首次运行之后再运行 <application>CVSup</application> 应该是很快的。</para> + + <para>在签出源代码之后, 还可以使用另一种由 <filename + class="directory">/usr/doc</filename> 目录中的 + <filename>Makefile</filename> 支持的方法来更新它。 通过在 + <filename>/etc/make.conf</filename> 中配置 + <makevar>SUP_UPDATE</makevar>、 <makevar>SUPHOST</makevar> 和 + <makevar>DOCSUPFILE</makevar>, 可以通过运行:</para> + + <screen>&prompt.root; <userinput>cd /usr/doc</userinput> +&prompt.root; <userinput>make update</userinput></screen> + + <para>来完成更新。 典型的 <filename>/etc/make.conf</filename> + 中的 &man.make.1; 选项是:</para> + + <programlisting>SUP_UPDATE= yes +SUPHOST?= cvsup.freebsd.org +DOCSUPFILE?= /usr/share/examples/cvsup/doc-supfile</programlisting> + + <note> + <para>将 <makevar>SUPHOST</makevar> + 和 <makevar>DOCSUPFILE</makevar> 的值使用 <literal>?=</literal> + 来指定的好处是使 make 命令行能够覆盖这些选项。 + 在向 <filename>make.conf</filename> 中增加选项时推荐这样做, + 以避免在测试时反复修改这个文件。</para> + </note> + </sect2> + + <sect2 id="updating-documentation-options"> + <title>文档源代码中可调的选项</title> + + <para>&os; 文档的更新和联编系统支持一些方便只更新一部分文档, + 或只联编特定格式及译文的选项。 + 这些选项可以在 <filename>/etc/make.conf</filename> 文件中配置, + 也可以通过 &man.make.1; 工具来指定。</para> + + <para>这些选项包括:</para> + + <variablelist> + <varlistentry> + <term><makevar>DOC_LANG</makevar></term> + + <listitem> + <para>准备联编和安装的语言列表。 + 例如, 指定为 <literal>en_US.ISO8859-1</literal> 表示只联编英文版的文档。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><makevar>FORMATS</makevar></term> + + <listitem> + <para>准备输出的格式列表。 目前, + 系统支持 <literal>html</literal>、 + <literal>html-split</literal>、 <literal>txt</literal>、 + <literal>ps</literal>、 <literal>pdf</literal>、 + 和 <literal>rtf</literal>。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><makevar>SUPHOST</makevar></term> + + <listitem> + <para>用于用来更新的 <application>CVSup</application> + 服务器的主机名。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><makevar>DOCDIR</makevar></term> + + <listitem> + <para>用于安装文档的目录。 默认为 + <filename + class="directory">/usr/share/doc</filename>。</para> + </listitem> + </varlistentry> + </variablelist> + + <para>如欲了解 &os; 中其他可供配置的全局 make 变量, 请参阅 &man.make.conf.5;。</para> + + <para>关于 &os; 文档联编系统的其他详情, 请参阅 <ulink url="&url.doc.langbase;/books/fdp-primer">&os; + 文档计划入门之新手必读部分</ulink>。</para> + </sect2> + + <sect2 id="updating-installed-documentation"> + <title>从源代码安装 &os; 文档</title> + + <para>在 <filename class="directory">/usr/doc</filename> + 中下载了最新的文档源代码快照之后, + 就可以开始动手联编文档了。</para> + + <para>要更新全部 <makevar>DOC_LANG</makevar> 中定义的语言的文档, + 需要执行下面的命令:</para> + + <screen>&prompt.root; <userinput>cd /usr/doc</userinput> +&prompt.root; <userinput>make install clean</userinput></screen> + + <para>如果在 <filename>make.conf</filename> 中配置了正确的 + <makevar>DOCSUPFILE</makevar>、 <makevar>SUPHOST</makevar> + 和 <makevar>SUP_UPDATE</makevar> 选项, + 则可以将更新源代码和安装一步完成:</para> + + <screen>&prompt.root; <userinput>cd /usr/doc</userinput> +&prompt.root; <userinput>make update install clean</userinput></screen> + + <para>如果只需要更新某个特定语言的文档, 可以在 + <filename class="directory">/usr/doc</filename> 中与之对应的目录中运行 + &man.make.1;:</para> + + <screen>&prompt.root; <userinput>cd /usr/doc/en_US.ISO8859-1</userinput> +&prompt.root; <userinput>make update install clean</userinput></screen> + + <para>此外, 还可以透过 make 变量 <makevar>FORMATS</makevar> 来控制输出格式, + 例如:</para> + + <screen>&prompt.root; <userinput>cd /usr/doc</userinput> +&prompt.root; <userinput>make FORMATS='html html-split' install clean</userinput></screen> + </sect2> + +<!-- FIXME: Waiting for a working docsnap server... --> +<![ IGNORE [ + <sect2 id="docsnap"> + <sect2info> + <authorgroup> + <author> + <firstname>Pav</firstname> + <surname>Lucistnik</surname> + <contrib>Based on information provided by </contrib> + </author> + </authorgroup> + </sect2info> + + <title>Using Docsnap</title> + + <indexterm><primary>Updating and Upgrading</primary></indexterm> + + <indexterm> + <primary>Docsnap</primary> + <see>Updating and Upgrading</see> + </indexterm> + + <para><application>Docsnap</application> is an &man.rsync.1; + repository for updating installed &os; Documentation in a + relatively easy and fast way. A + <quote><application>Docsnap</application> server</quote> tracks + the documentation sources, and builds them in HTML format every + hour. The <filename role="package">textproc/docproj</filename> + is unneeded with <application>Docsnap</application> as only + patches to the built documentation exist.</para> + + <para>The only requirement for using this technique is + the <filename role="package">net/rsync</filename> port or + package. To add it, use the following command:</para> + + <screen>&prompt.root; <userinput>pkg_add -r rsync</userinput></screen> + + <note> + <para><application>Docsnap</application> has been originally + developed for updating documentation installed + to <filename class="directory">/usr/share/doc</filename>, but + the following examples could be adapted for other directories + as well. For user directories, it does not require + <username>root</username> privileges.</para> + </note> + + <para>To update the documentation set, issue the following + command:</para> + + <screen>&prompt.root; <userinput>rsync -rltvz <replaceable>docsnap.sk.FreeBSD.org</replaceable>::docsnap <replaceable>/usr/share/doc</replaceable></userinput></screen> + + <note> + <para>There is only one <application>Docsnap</application> + server at the moment; + the <hostid>docsnap.sk.FreeBSD.org</hostid> shown + above.</para> + </note> + + <para>Do not use the <option>--delete</option> flag here as there + are some items installed + into <filename class="directory">/usr/share/doc</filename> + during <command>make installworld</command>, which would + accidentally be removed. To clean up, use this command + instead:</para> + + <screen>&prompt.root; <userinput>rsync -rltvz --delete <replaceable>docsnap.sk.FreeBSD.org</replaceable>::docsnap/??_??\.\* <replaceable>/usr/share/doc</replaceable></userinput></screen> + + <para>If a subset of documentation needs to be updated, for + example, the English documentation only, the following command + should be used:</para> + + <screen>&prompt.root; <userinput>rsync -rltvz <replaceable>docsnap.sk.FreeBSD.org</replaceable>::docsnap/en_US.ISO8859-1 <replaceable>/usr/share/doc</replaceable></userinput></screen> + </sect2> +]]> + </sect1> + <sect1 id="current-stable"> - <title>追踪开发分支/title> + <title>追踪开发分支</title> <indexterm><primary>-CURRENT</primary></indexterm> <indexterm><primary>-STABLE</primary></indexterm> @@ -1012,13 +1415,167 @@ Fetching 133 new ports or files... done.</screen> <command>make world</command> 都是不应该做的事情, 您应该使用这里描述的方法。</para> </warning> - <sect2> - <title>更新系统的规范途径</title> + <sect2 id="canonical-build"> + <title>更新系统的规范方法</title> + + <para>在更新系统时, 一定要首先查看 + <filename>/usr/src/UPDATING</filename> 文件, 以便了解在 buildworld + 之前需要进行的操作, 然后按照下面列出的步骤进行操作:</para> + + <para>这些更新步骤假定您使用的是包含旧编译器、 内核以及用户态工具及配置的旧版 + &os;。 我们使用 <quote>world</quote> 来表示系统中的核心执行文件、 + 函数库和程序文件。 编译器是 <quote>world</quote> 的一部分, + 但有其特殊性。</para> + + <para>此外, 我们还假定您已经获得了较新版本操作系统的源代码。 + 如果您正更新的系统中的源代码也是旧版系统所附带的, + 您还需要参阅 <xref linkend="synching"> 来把代码同步到较新的版本。</para> + + <para>从源代码更新系统, 有时会比初看上去的时候更麻烦一些, + 另一方面, &os; 的开发人员有时会不得不修改推荐的更新步骤, + 特别是当出现了一些无法避免的依赖关系的时候。 这一节余下的部分, + 将介绍目前推荐的更新步骤背后的原理。</para> + + <para>成功的更新操作必须解决下面的这些问题:</para> + + <itemizedlist> + <listitem> + <para>旧的编译器可能无法编译新的内核。 (另一方面, + 旧的编译器很可能有 bug。) 因此, 新的内核应该以新的编译器编译。 + 更具体地说, 新的编译器应在新内核开始联编之前已经完成了联编步骤。 + 请注意, 新的编译器并不一定需要在联编新内核之前 + <emphasis>安装</emphasis> 到系统中。</para> + </listitem> + + <listitem> + <para>新的 world 有可能依赖一些新的内核特性。 + 因此, 新内核必须在新的 world 之前安装。</para> + </listitem> + </itemizedlist> + + <para>这两个问题就是为什么我们将在后面的章节中介绍的, + 需要按照 <maketarget>buildworld</maketarget>、 + <maketarget>buildkernel</maketarget>、 + <maketarget>installkernel</maketarget>、 + <maketarget>installworld</maketarget> 的顺序来更新系统的原因。 + 这并不是您需要遵守推荐的更新操作的全部原因, + 除了这两个最重要的理由之外, 还有一些并不那么显而易见的原因:</para> + + <itemizedlist> + <listitem> + <para>旧的 world 可能无法配合新的内核正常工作, + 因此, 您在安装完新内核之后, 应尽快将 world 也随之更新。</para> + </listitem> + + <listitem> + <para>有些配置文件的变动必须在安装新的 world 之前完成, + 而另一些配置文件的变动则有可能导致旧 world 工作不正常。 + 因此, 通常而言会需要两次不同的配置文件更新步骤。</para> + </listitem> + + <listitem> + <para>多数情况下, 更新步骤只会替换或增加文件; + 换言之, 现有的旧文件并不会被删除。 有时, + 这可能会导致一些其他问题。 因此, 有时安装操作会指明, + 必须在某些操作之前手工删除一些文件。 这些在未来可能会被自动化, + 也可能不会自动化。</para> + </listitem> + </itemizedlist> + + <para>由于有这些考虑, 因此一般情况下我们建议使用下列更新步骤。 + 请注意, 具体的更新操作中可能会需要一些附加的步骤, + 但核心的过程应该是不会轻易发生变化的:</para> + + <orderedlist> + <listitem> + <para><command>make <maketarget>buildworld</maketarget></command></para> + + <para>这步操作会联编新的编译器, 以及少量相关工具, + 并在随后使用新的编译器来联编 + world。 联编的结果会存放在 <filename class="directory">/usr/obj</filename>。</para> + </listitem> + + <listitem> + <para><command>make <maketarget>buildkernel</maketarget></command></para> + + <para>与旧式的、 使用 &man.config.8; 和 + &man.make.1; 的方法不同, + 这种做法会使用存放于 <filename class="directory">/usr/obj</filename> + 中的 <emphasis>新的</emphasis> 编译器。 + 这种做法使得您免去了由于编译器与内核源代码不一致导致的问题。</para> + </listitem> + + <listitem> + <para><command>make <maketarget>installkernel</maketarget></command></para> + + <para>安装新的内核及其模块, + 使系统能够以更新后的内核启动。</para> + </listitem> + + <listitem> + <para>重启系统并进入单用户模式。</para> + + <para>单用户模式使得更新正在运行的软件可能导致的问题减到最少。 + 此外, 它也使配合新内核运行旧 world 可能出现的问题减到最少。</para> + </listitem> + + <listitem> + <para><command>mergemaster <option>-p</option></command></para> + + <para>这步操作会进行完成安装新的 world 所需的配置文件更新操作。 + 例如, 它可能会在系统的密码数据库中添加新的用户组或用户。 + 这些操作通常在上次更新之后增加了新的用户组或特殊系统用户之后是需要的, + 因为 <maketarget>installworld</maketarget> 这步操作会需要这些用户或组才能顺利完成。</para> + </listitem> + + <listitem> + <para><command>make <maketarget>installworld</maketarget></command></para> + + <para>从 <filename class="directory">/usr/obj</filename> 中复制 world。 + 这步操作之后, 您在盘上的系统, 包括内核和 world 就都是新的了。</para> + </listitem> + + <listitem> + <para><command>mergemaster</command></para> + + <para>更新余下的配置文件, + 因为您的 world 已经更新完成了。</para> + </listitem> + + <listitem> + <para>重启系统。</para> + + <para>这步操作将加在新的内核, 以及新的 world 和更新过的配置文件。</para> + </listitem> + </orderedlist> + + <para>注意, 如果您正从同一 &os; 版本分支升级, 例如, 从 7.0 到 + 7.1, 则上述过程可能没有那么必要, 因为您不太可能遇到严重的编译器、 + 内核源代码、 用户态程序源代码或配置文件不匹配的情形。 + 旧式的 <command>make <maketarget>world</maketarget></command> + 然后再联编新内核的升级方法, 很可能有机会能够正常运作而完成升级工作。</para> + + <para>但是, 在大版本升级的过程中, 不按照前面所介绍的操作来进行升级时, + 便很可能遇到一些问题。</para> + + <para>此外, 还需要注意的是, 有些时候升级的过程中 + (例如从 4.<replaceable>X</replaceable> 到 5.0) 可能会需要一些额外的步骤 + (例如在 installworld 之前更名或删除一些文件)。 请仔细阅读 + <filename>/usr/src/UPDATING</filename> 这个文件, + 特别是它的结尾部分所介绍的推荐的升级操作顺序。</para> + + <para>由于开发人员发现不可能完全避免一些不匹配方面的问题, + 这个过程一直在演化过程中。 不过幸运的是, 目前推荐的这个升级步骤, + 应该能够在很长一段时间内不需要做任何调整。</para> + + <note> + <para>从 &os; 3.<replaceable>X</replaceable> 或更早的版本进行升级, + 是一件非常麻烦的事情; 请务必仔细阅读 <filename>UPDATING</filename> + 之后再开始这类升级。</para> + </note> - <para>要更新系统, 就一定要首先查看 - <filename>/usr/src/UPDATING</filename> 文件, 以了解 - buildworld 之前需要完成的步骤, - 然后使用下面的过程:</para> + <para>总结一下, 目前推荐的从源代码升级 &os; + 的方法是:</para> <screen>&prompt.root; <userinput>cd /usr/src</userinput> &prompt.root; <userinput>make buildworld</userinput> @@ -1040,7 +1597,8 @@ Fetching 133 new ports or files... done.</screen> 可以在加载器提示后输入 <command>boot -s</command>)。 接下来执行:</para> - <screen>&prompt.root; <userinput>mount -a -t ufs</userinput> + <screen>&prompt.root; <userinput>adjkerntz -i</userinput> +&prompt.root; <userinput>mount -a -t ufs</userinput> &prompt.root; <userinput>mergemaster -p</userinput> &prompt.root; <userinput>cd /usr/src</userinput> &prompt.root; <userinput>make installworld</userinput> @@ -1056,7 +1614,7 @@ Fetching 133 new ports or files... done.</screen> </warning> </sect2> - <sect2> + <sect2 id="src-updating"> <title>阅读 <filename>/usr/src/UPDATING</filename></title> <para>在您做其它事之前,请阅读 @@ -1072,7 +1630,7 @@ Fetching 133 new ports or files... done.</screen> </important> </sect2> - <sect2> + <sect2 id="make-conf"> <title>检查 <filename>/etc/make.conf</filename></title> <indexterm> <primary><filename>make.conf</filename></primary> @@ -1098,8 +1656,8 @@ Fetching 133 new ports or files... done.</screen> <makevar>NOPORTDOCS</makevar> 等等), 看看是否合用。</para> </sect2> - <sect2> - <title>更新 <filename>/etc</filename> 里边的文件</title> + <sect2 id="updating-etc"> + <title>更新 <filename>/etc</filename> 里的文件</title> <para><filename>/etc</filename> 目录包含有除了您的系统启动时执行的脚本外大部分的系统配置信息。 @@ -1187,7 +1745,7 @@ Fetching 133 new ports or files... done.</screen> </sect2> - <sect2> + <sect2 id="cleaning-usr-obj"> <title>删除 <filename>/usr/obj</filename></title> <para>随着重新构建系统的进行, 编译结果会放到 (默认情况下) @@ -1355,7 +1913,7 @@ Script done, …</screen> </sect3> </sect2> - <sect2> + <sect2 id="new-kernel"> <title>编译和安装新内核</title> <indexterm> <primary>内核</primary> @@ -1396,7 +1954,7 @@ Script done, …</screen> 的信息;查看 &man.chflags.1; 了解更多关于不同文件标识的信息。</para> </sect2> - <sect2> + <sect2 id="new-kernel-singleuser"> <title>重启到单用户模式</title> <indexterm><primary>单用户模式</primary></indexterm> @@ -1437,7 +1995,7 @@ Script done, …</screen> </note> </sect2> - <sect2> + <sect2 id="post-installworld-updates"> <title>不是由 <command>make installworld</command> 更新的更新文件</title> <para>重新编译整个系统不会使用新的或改过的配置文件更新某些目录 @@ -1665,7 +2223,7 @@ Script done, …</screen> &prompt.root; <userinput>make all install</userinput></screen> </sect2> - <sect2> + <sect2 id="updating-questions"> <title>问题</title> <qandaset> @@ -1951,7 +2509,7 @@ Building everything.. 里一定要有每台机器的内核配置文件,如果它想构建它们的内核的话。</para> </sect2> - <sect2> + <sect2 id="small-lan-base-system"> <title>基本系统</title> <para>既然所有的妥当了,就准备构建所有的东西。如<xref @@ -1969,7 +2527,7 @@ Building everything.. 就使用相同的过程在 <quote>构建集群</quote>里的其它机器里安装新的软件。</para> </sect2> - <sect2> + <sect2 id="small-lan-ports"> <title>Ports</title> <para>类似的想法是使用 ports 树。 |