diff options
Diffstat (limited to 'zh_CN.GB2312/books/handbook/updating/chapter.sgml')
-rw-r--r-- | zh_CN.GB2312/books/handbook/updating/chapter.sgml | 477 |
1 files changed, 477 insertions, 0 deletions
diff --git a/zh_CN.GB2312/books/handbook/updating/chapter.sgml b/zh_CN.GB2312/books/handbook/updating/chapter.sgml new file mode 100644 index 0000000000..a590ed151e --- /dev/null +++ b/zh_CN.GB2312/books/handbook/updating/chapter.sgml @@ -0,0 +1,477 @@ +<!-- + Original Revision: 1.2 + $FreeBSD$ +--> + +<chapter id="updating"> + <chapterinfo> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Written by </contrib> + </author> + </authorgroup> + <authorgroup> + <author> + <firstname>Colin</firstname> + <surname>Percival</surname> + <contrib>Based on notes provided by </contrib> + </author> + </authorgroup> + </chapterinfo> + + <title>更新 &os;</title> + + <sect1 id="updating-synopsis"> + <title>概述</title> + + <indexterm><primary>Updating FreeBSD</primary></indexterm> + <indexterm> + <primary>freebsd-update</primary> + <see>Updating</see> + </indexterm> + + <para>长久以来,&os 操作系统的一个主要方面始终没有改变, + 那就是使用应用程序和工具去获得系统各种大大小小的更新。</para> + + <para>多年来用户升级他们的系统,收集安全补丁, + 无损 Ports Collection 更新 ports 和 package + 唯一的选择是使用 <application>CVSup</application> + 工具。</para> + + <para>当然原来的 <application>CVSup</application> 仍被支持, + 现在有一个 C 语言的版本加入了 &os;, + 并且有些新的方法能用来获得系统更新。</para> + + <para>类似像 &man.portsnap.8; 和 &man.freebsd-update.8; + 这样的工具使得升级过程变得更加简便有效。 + 这些新的方法在提高效率的同时也给用户提供一个简洁的接口。 + 一些新的工具能通过 &man.cron.8; 执行, + 从而减少系统管理员的人为介入,这会有益于那些管理着成百上千台 &os; + 的人。<para> + + <para>这一章节将会介绍这些新的方法, + 以及用户跟系统管理如何从这些新方法的实用和易用中获益。</para> + + <para>在阅读了这章以后,你将了解:</para> + + <itemizedlist> + <listitem> + <para>哪些工具能被用来更新系统和 Ports Collection。<para> + </listitem> + + <listitem> + <para>如何使用 <command>freebsd-update</command> + 打安全补丁和完成主要及次要的 &os; 升级。</para> + </listitem> + + <listitem> + <para>如何比较已安装的系统与原来已知拷贝的状态。</para> + </listitem> + </itemizedlist> + + <para>在阅读这章之前,你应该:</para> + + <itemizedlist> + <listitem> + <para>了解一些 &unix; 和 &os; 的基础知识 + (<xref linkend="basics">)。</para> + </listitem> + + <listitem> + <para>熟悉基本的内核配置/编译方法 + (<xref linkend="kernelconfig">)。</para> + </listitem> + + <listitem> + <para>熟悉使用 Ports Collection 在 &os; + 上安装第三方的应用程序 + (<xref linkend="ports">)。</para> + </listitem> + + <listitem> + <para>熟悉组成 &os; 的各个部分以及使用 + &man.mergemaster.8; 工具 + (<xref linkend="cutting-edge">)。</para> + </listitem> + </itemizedlist> + </sect1> + + <sect1 id="updating-freebsdupdate"> + <title>FreeBSD 更新</title> + + <para>打安全补丁是对于维护计算机软件的一个重要部分, + 特别是对于操作系统。对于 &os; 来说, + 很长的一段时间以来这都不是一件容易的事情。 + 补丁打在源代码上,代码需要被重新编译为二进制, + 然后再重新安装编译后的程序。</para> + + <para>&os; 引入了 <command>freebsd-update</command> + 工具之后这便不再是问题了。这个工具提供了 2 种功能。 + 第一,它可以把二进制的安全和勘误更新直接应用于 &os; + 的基本系统,而不需要重新编译和安装。第二, + 这个工具还支持主要跟次要的发行版的升级。</para> + + <note> + <para>由安全小组支持的各种体系结构和发行版都可使用二进制更新。 + 然而有些特性,比如升级 &os; 操作系统需要最近的 &man.freebsd-update.8; + 和 &os; 6.3。在升级到一个新的发行版本之前, + 应先阅读一下当前发行版的声明, + 因为他们可能包含有关于你期望升级版本的重要消息。 + 这些发行声明可以通过以下链接查阅: + <ulink url="http://www.FreeBSD.org/releases/"></ulink>。</para> + </note> + + <para>如果 <command>crontab</command> 中存在有用到 + <command>freebsd-update</command> 特性的部分, + 那么这些在开始以下操作前必须先被禁止。最新版本的 + <command>freebsd-update</command> 可以通过上面的 + <acronym>URL</acronym> 下载用 <command>tar</command> + 和 <command>gzip</command> 打包的版本, + 并按照下面的命令安装:</para> + + <screen>&prompt.root; <userinput>gunzip -c freebsd-update-upgrade.tgz | tar xvf -</userinput> +&prompt.root; <userinput>mv freebsd-update.sh /usr/sbin/freebsd-update</userinput> +&prompt.root; <userinput>mv freebsd-update.conf /etc</userinput></screen> + + <para>对于所有当前流行的发行版本来说, + 并不需要下载最新版。</para> + + <sect2> + <title>配置文件</title> + + <para>有些用户可能希望调整配置文件来更好的控制升级过程。 + 可用参数的文档非常齐全, + 但下面的这些可能需要进一步的解释:</para> + + <programlisting># Components of the base system which should be kept updated. +Components src world kernel</programlisting> + + <para>这个参数是控制 &os; 的哪一部分将被保持更新。 + 默认的是更新源代码,整个基本系统还有内核。 + 这些部件跟安装时的那些相同,举例来说, + 在这里加入 “world/games” 就会允许打入游戏相关的补丁。 + 使用 “src/bin” 则是允许更新 + <filename class="directory">src/bin</filename> + 目录中的源代码。</para> + + <para>最好的选择是把这个选项保留为默认值, + 因为如果要修改它去包含一些指定的选项, + 就需要用户列出每一个想要更新的项目。 + 这可能会引起可怕的后果, + 因为部分的源代码和二进制程序得不到同步。</para> + + <programlisting># Paths which start with anything matching an entry in an IgnorePaths +# statement will be ignored. +IgnorePaths</programlisting> + + <para>添加路径,比如 + <filename class="directory">/bin</filename> 或者 + <filename class="directory">/sbin</filename> + 让这些指定的目录在更新过程中不被修改。 + 这个选项能够防止本地的修改被 + <command>freebsd-update</command> 覆盖。</para> + + <programlisting># Paths which start with anything matching an entry in an UpdateIfUnmodified +# statement will only be updated if the contents of the file have not been +# modified by the user (unless changes are merged; see below). +UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile</programlisting> + + <para>更新指定目录中的未被修改的配置文件。 + 用户的任何修改都会使这些文件的自动更新失效。 + 还有另外一个选项, + <literal>KeepModifiedMetadata</literal>, + 这个能让 <command>freebsd-update</command> + 在合并时保存修改。</para> + + <programlisting># When upgrading to a new &os; release, files which match MergeChanges +# will have any local changes merged into the version from the new release. +MergeChanges /etc/ /var/named/etc/</programlisting> + + <para>一个 <command>freebsd-update</command> + 应该尝试合并的配置文件的列表。文件合并的过程是 + 一系列的 &man.diff.1; 补丁类似于更少选项的 &man.mergemaster.8; + 合并的选项是接受,打开一个文本编辑器,或者 + <command>freebsd-update</command> 会被中止。 + 在不能确定的时候,请先备份 <filename class="directory">/etc</filename> + 然后接受合并。更多关于 <command>mergemaster</command> + 的信息请参阅 <xref linkend="cutting-edge">。</para> + + <programlisting># Directory in which to store downloaded updates and temporary +# files used by &os; Update. +# WorkDir /var/db/freebsd-update</programlisting> + + <para>这个目录是放置所有补丁和临时文件的。 + 用户做一个版本升级的话,请确认此处至少有 1 GB + 的可用磁盘空间。</para> + + <programlisting># When upgrading between releases, should the list of Components be +# read strictly (StrictComponents yes) or merely as a list of components +# which *might* be installed of which &os; Update should figure out +# which actually are installed and upgrade those (StrictComponents no)? +# StrictComponents no</programlisting> + + <para>当设置成 <literal>yes</literal> 时, + <command>freebsd-udpate</command> 将假设这个 + <literal>Components</literal> 列表时完整的, + 并且对此列表以外的项目不会修改。实际上就是 + <command>freebsd-update</command> 会尝试更新 + <literal>Componets</literal> + 列表里的每一个文件。</para> + </sect2> + + <sect2> + <title>安全补丁</title> + + <para>安全补丁存储在远程的机器上, + 可以使用如下的命令下载并安装:</para> + + <screen>&prompt.root; <userinput>freebsd-update fetch</userinput> +&prompt.root; <userinput>freebsd-update install</userinput></screen> + + <para>如果给内核打了补丁,那么系统需要重新启动。 + 如果一切都进展顺利,系统就应该被打好了补丁而且 + <command>freebsd-update</command> 可由夜间 + &man.cron.8; 执行。在 <filename>/etc/crontab</filename> + 中加入以下条目足以完成这项任务:</para> + + <programlisting>@daily root freebsd-update cron</programlisting> + + <para>这条记录是说明每天运行一次 + <command>freebsd-update</command>。用这种方法, + 使用了 <option>cron</option> 参数, + <command>freebsd-update</command> 仅检查是否存在更新。 + 如果有了新的补丁,就会自动下载到本地的磁盘, + 但不会自动给系统打上。<username>root</username> + 会收到一封电子邮件告知需手动安装补丁。</para> + + <para>如果出现了错误,可以使用下面的 + <command>freebsd-update</command> + 命令回退到上一次的修改:</para> + + <screen>&prompt.root; <userinput>freebsd-update rollback</userinput></screen> + + <para>完成以后如果内核或任何的内核模块被修改的话, + 就需要重新启动系统。这将使 &os; + 装载新的二进制程序进内存。</para> + + <note> + <para><command>freebsd-update</command> 只能应用于 + <filename>GENERIC</filename> 内核。如果对 + <filename>GENERIC</filename> + 做了任何修改或者安装了一个自行编译的内核, + <command>freebsd-update</command> + 就无法完成升级 — 如前一个范例那样失败后 + 产生一条错误信息。</para> + </note> + </sect2> + + <sect2> + <title>重大和次要的更新</title> + + <para>这个过程会删除旧的目标文件和库, + 这将使大部分的第三方应用程序无法删除。 + 建议将所有安装的 ports 先删除然后重新安装,或者稍后使用 + <filename role="package">ports-mgmt/portupgrade</filename> + 工具升级。 大多数用户将会使用如下命令尝试编译:</para> + + <screen>&prompt.root; <userinput>portupgrade -af</userinput></screen> + + <para>这将确保所有的东西都会被正确的重新安装。 + 请注意环境变量 <makevar>BATCH</makevar> 设置成 + <literal>yes</literal> 的话将在整个过程中对所有询问回答 + <literal>yes</literal>,这会帮助在编译过程中免去人工的介入。</para> + + <para>重大和次要的更新可以由 + <command>freebsd-update</command> 命令后指定一个发行版本来执行, + 举例来说,下面的命令将帮助你升级到 &os; 6.3:</para> + + <screen>&prompt.root; <userinput>freebsd-update -r 6.3-RELEASE upgrade</userinput></screen> + + <para>在这个命令被执行后,<command>freebsd-update</command> + 将会先解析配置文件和评估当前的系统以获得更新系统所需的必要信息。 + 然后便会显示出一个包含了已检测到与未检测到的组件列表。 + 例如:</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 index... done. +Inspecting system... done. + +The following components of FreeBSD seem to be installed: +kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games +src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue +src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin +world/base world/info world/lib32 world/manpages + +The following components of FreeBSD do not seem to be installed: +kernel/generic world/catpages world/dict world/doc world/games +world/proflibs + +Does this look reasonable (y/n)? y</screen> + + <para>此时,<command>freebsd-update</command> + 将会尝试下载所有升级所需的文件。在某些情况下, + 用户可能被问及需安装些什么和如何进行之类的问题。<para> + + <para>下载完所有的补丁之后,它们很快就会被打上。 + 这个过程可能会持续一段时间,取决与机器的速度和当前的负载情况。 + 配置文件将会被合并 — 这一部分需要用户的参与, + 因为文件可能被合并或者屏幕上弹出了一个文本编辑器用来手工合并。 + 在处理过程中,每一个成功的合并都会给用户显示出来。 + 失败或者被忽略的合并则会引起合并程序的中止。 + 用户可能想要备份一下 <filename class="directory">/etc</filename> + 之后手工合并重要的文件,比如 + <filename>master.passwd</filename> 或 + <filename>group</filename>。</para> + + <note> + <para>系统至此还没有被修改,所有的补丁和合并都在另外一个目录中进行。 + 当所有的补丁都被成功的打上了以后,所有的配置文件都被合并后, + 我们就已经完成了整个升级过程中最困难的部分, + 下面就需要用户来安装这些变更了。</para> + </note> + + <para>一旦这个步骤完成后,使用如下的命令将升级后的文件安装到磁盘上。</para> + + <screen>&prompt.root; <userinput>freebsd-update install</userinput></screen> + + <para>内核与内核模块会先被打上补丁。此时机器必须要重新启动。 + 使用下面的命令重启机器,这样新的内核将载入内存:</para> + + <screen>&prompt.root; <userinput>shutdown -r now</userinput></screen> + + <para>在系统重新上线后,需要再次运行 <command>freebsd-update</command>。 + 升级的状态被保存着,这样 <command>freebsd-update</command> + 就无需重头开始,但是会删除所有旧的共享库和目标文件。 + 执行如下命令继续这个阶段的升级:</para> + + <screen>&prompt.root; <userinput>freebsd-update install</userinput></screen> + + <note> + <para>取决与是否有库的版本更新,通常只有 2 个而不是 + 3 个安装阶段。</para> + </note> + + <para>现在需要重新编译和安装第三方软件。 + 这么做的原因是某些已安装的软件可能依赖于在升级过程中已删除的库。 + 可使用 <filename role="package">ports-mgmt/portupgrade</filename> + 自动化这个步骤,以如下的命令开始:</para> + + <screen>&prompt.root; <userinput>portupgrade -f ruby</userinput> +&prompt.root; <userinput>rm /var/db/pkg/pkgdb.db</userinput> +&prompt.root; <userinput>portupgrade -f ruby18-bdb</userinput> +&prompt.root; <userinput>rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db</userinput> +&prompt.root; <userinput>portupgrade -af</userinput></screen> + + <para>一旦这个完成了以后,再最后一次运行 + <command>freebsd-update</command> 来结束升级过程。 + 执行如下命令处理升级中的所有细节:</para> + + <screen>&prompt.root; <userinput>freebsd-update install</userinput></screen> + + <para>重新启动机器进入新版本的 &os; 升级过程至此就完成了。</para> + </sect2> + + <sect2> + <title>系统状态对照</title> + + <para><command>freebsd-update</command> + 工具也可被用来对着一个已知完好的 &os; 拷贝测试当前的版本。 + 这个选项评估当前的系统工具,库和配置文件。 + 使用以下的命令开始对照:</para> + + <screen>&prompt.root; <userinput>freebsd-update IDS >> outfile.ids</userinput></screen> + + <warning> + <para>这个命令的名称是 <acronym>IDS</acronym>, + 它并不是一个像 + <filename role="package">security/snort</filename> + 这样的入侵检测系统的替代品。因为 + <command>freebsd-update</command> 在磁盘上存储数据, + 很显然它们有被篡改的可能。 + 当然也可以使用一些方法来降低被篡改的可能性,比如设置 + <varname>kern.securelevel</varname> 和不使用时把 + <command>freebsd-update</command> + 数据放在只读文件系统上,例如 <acronym>DVD</acronym> 或 + 安全存放的外置 <acronym>USB</acronym> 磁盘上。 + </warning> + + <para>现在系统将会被检查,生成一份包含了文件和它们的 &man.sha256.1; + 哈希值的清单,已知发行版中的值与当前系统中安装的值将会被打印到屏幕上。 + 这就是为什么输出被送到了 <filename>outfile.ids</filename> 文件。 + 它滚动的太块无法用肉眼对照,而且会很快填满控制台的缓冲区。</para> + + <para>这个文件中有非常长的行,但输出的格式很容易分析。 + 举例来说,要获得一份与发行版中不同哈希值的文件列表, + 已可使用如下的命令:</para> + + <screen>&prompt.root; <userinput>cat outfile.ids | awk '{ print $1 }' | more</userinput> +/etc/master.passwd +/etc/motd +/etc/passwd +/etc/pf.conf</screen> + + <para>这份输出时删节缩短后的,其实是有更多的文件。 + 其中有些文件并非人为修改,比如 + <filename>/etc/passwd</filename> + 被修改是因为添加了用户进系统。在某些情况下, + 还有另外的一些文件,诸如内核模块与 + <command>freebsd-update</command> 的不同是因为它们被更新过了。 + 为了指定的文件或目录排除在外,把它们加到 + <filename>/etc/freebsd-update.conf</filename> 的 + <literal>IDSIgnorePaths</literal> 选项中。</para> + + <para>除了前面讨论过的部分之外, + 这也能被当作是对升级方法的详细补充。</para> + </sect2> + </sect1> + + <sect1 id="updating-portsnap"> + <title>Portsnap: 一个 Ports Collection 更新工具</title> + + <para>&os; 基本系统也包括了一个更新 Ports Collection 的工具: + &man.portsnap.8;。在运行之后,它会连上一个远程网站, + 校验安全密钥,然后下载一份 Ports Collection 的拷贝。 + 密钥是用来校验所有下载文件的完整性,确保它们在传输是未被修改。 + 使用以下的命令下载最新的 Ports Collection:</para> + + <screen>&prompt.root; <userinput>portsnap fetch</userinput> +Looking up portsnap.FreeBSD.org mirrors... 3 mirrors found. +Fetching snapshot tag from portsnap1.FreeBSD.org... done. +Fetching snapshot metadata... done. +Updating from Wed Aug 6 18:00:22 EDT 2008 to Sat Aug 30 20:24:11 EDT 2008. +Fetching 3 metadata patches.. done. +Applying metadata patches... done. +Fetching 3 metadata files... done. +Fetching 90 patches.....10....20....30....40....50....60....70....80....90. done. +Applying patches... done. +Fetching 133 new ports or files... done.</screen> + + <para>这个例子展示的是 &man.portsnap.8; + 发现并校验了几个用于当前 ports 的补丁。这还表明以前运行过, + 如果是第一次运行的话,那么仅仅只会下载 Ports Collection。</para> + + <para>在 &man.portsnap.8; 成功完成一次 + <command>fetch</command> 操作后,而且本地系统上的 Ports Collection + 和随之而来的补丁通过校验以后。键入以下命令安装更新文件:</para> + + <screen>&prompt.root; <userinput>portsnap extract</userinput> +/usr/ports/.cvsignore +/usr/ports/CHANGES +/usr/ports/COPYRIGHT +/usr/ports/GIDs +/usr/ports/KNOBS +/usr/ports/LEGAL +/usr/ports/MOVED +/usr/ports/Makefile +/usr/ports/Mk/bsd.apache.mk +/usr/ports/Mk/bsd.autotools.mk +/usr/ports/Mk/bsd.cmake.mk +<replaceable>...</replaceable></screen> + + <para>至此更新就完成了,然后便可以使用更新后的 + Ports Collection 来安装或升级应用程序。</para> + </sect1> +</chapter> |