Convert zh_CN from GB2312 to UTF-8. While I'm there, also

fix a bunch of font issues when rendering PDF.
This commit is contained in:
Xin LI 2013-11-14 00:20:51 +00:00
parent 8ff93b9827
commit 797a990cf7
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=43188
518 changed files with 189705 additions and 189722 deletions

View file

@ -0,0 +1,16 @@
#
# The FreeBSD Simplified Chinese Project
# Original Revision: 1.52
#
# $FreeBSD$
SUBDIR =
SUBDIR+= contributing
SUBDIR+= cvs-freebsd
SUBDIR+= linux-users
SUBDIR+= nanobsd
SUBDIR+= rc-scripting
SUBDIR+= remote-install
DOC_PREFIX?= ${.CURDIR}/../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,8 @@
#
# The FreeBSD Simplified Chinese Project
# Original Revision: 1.4
#
# $FreeBSD$
#
DESTDIR?= ${DOCDIR}/zh_CN.UTF-8/articles/${.CURDIR:T}

View file

@ -0,0 +1,22 @@
#
# The FreeBSD Simplified Chinese Project
#
# Original Revision: 1.6
# $FreeBSD$
#
# Article: Contributing to FreeBSD
DOC?= article
FORMATS?= html
WITH_ARTICLE_TOC?= YES
INSTALL_COMPRESSED?=gz
INSTALL_ONLY_COMPRESSED?=
SRCS= article.xml
URL_RELPREFIX?= ../../../..
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,488 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
<!--
The FreeBSD Documentation Project
The FreeBSD Chinese (Simplified) Documentation Project
Original Revision: 1.511
-->
<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="zh_cn">
<info><title>为 FreeBSD 提供帮助</title>
<abstract>
<para>无论是作为个人还是组织机构如果您希望为FreeBSD项目提供帮助
都可以在本文中找到合适的方法。</para>
</abstract>
<authorgroup>
<author><personname><firstname>Jordan</firstname><surname>Hubbard</surname></personname><contrib>原著</contrib></author>
</authorgroup>
<legalnotice xml:id="trademarks" role="trademarks">
&tm-attrib.freebsd;
&tm-attrib.ieee;
&tm-attrib.general;
</legalnotice>
<pubdate>$FreeBSD$</pubdate>
<releaseinfo>$FreeBSD$</releaseinfo>
</info>
<indexterm><primary>贡献 </primary></indexterm>
<para>您希望给 FreeBSD 项目做点什么吗? 太好了, 我们欢迎您。 FreeBSD 正是
<emphasis>依靠</emphasis> 广大用户的贡献才得以发展壮大的。
我们不仅非常感谢您所做的贡献,而且,这些工作对于 FreeBSD 的持续发展也至关重要。</para>
<para>也许与您想象的不同, 您既不必是一名出色的程序员, 也无须和
FreeBSD 核心团队成员有很好的私交, 我们会一视同仁的对待您的工作。
FreeBSD 的开发人员遍布全球, 大家技术专长各异, 年龄分布也非常广泛。
每天, 我们都在面对持续增长的工作而苦于没有足够的人手,
因此我们随时欢迎您的帮助。</para>
<para>FreeBSD 项目处理的是一个完整的操作系统环境,
而不只是一个内核或是一些零散的工具包。 因此, 我们的
<filename>TODO</filename> 任务列表里包含各种各样的工作,
从文档、用户测试、演示, 到系统安装程序和高度专业的内核开发。
因此无论您的技术水平如何, 从事何种领域, 都可以帮助这个项目。</para>
<para>我们鼓励从事和 FreeBSD 相关工作的企业和我们联系。
您需要一些特殊的扩展来使您的产品运转起来么?
您会发现我们很乐意答应您的请求, 除非是特别稀奇古怪的。
您是否正从事相关的增值业务? 让我们来帮助您吧,
我们也许可以在其中的某些方面相互协作。
自由软件世界正在努力打破旧有的关于软件开发、 销售和维护的框框,
我们希望恳请您至少能给它一次机会。</para>
<sect1 xml:id="contrib-what">
<title>我们的需求</title>
<para>下面列出了一些需要完成的任务和子项目,
它们基本上可以被等同于 <filename>TODO</filename>(任务列表)
列表, 以及用户的要求。</para>
<sect2 xml:id="non-programmer-tasks">
<title>正在进行中的非开发任务</title>
<para>很多参加FreeBSD项目的人不是程序员。
这个项目里有文档撰写者、 网页设计师、 以及技术支持人员。
对于这些志愿者来说, 他们只需要贡献一些时间,
并且具有学习的意愿。</para>
<orderedlist>
<listitem>
<para>您可以经常通读FAQ和手册 如果您发现了繁琐的解释,
或者是过时的知识, 甚至完全不正确的地方, 都请告诉我们。
如果您能顺手把他们改过来那就更好了
(SGML其实并不难学 但我们也不反对您直接提交
ASCII 的版本)。</para>
</listitem>
<listitem>
<para>帮助我们把 FreeBSD 文档翻译成您的母语。
如果您的母语版本已经存在了,
您也可以翻译一些其他的文档或者检查那些已有的文档是否是最新更新过的。
您可以先简单看看 FreeBSD 文档计划中有关 <link xlink:href="&url.books.fdp-primer;/translations.html">翻译的常见问题</link>
参加翻译工作并不是说您要孤军奋战翻译所有的 FreeBSD 文档。
作为一个志愿者, 做多少工作完全取决于您的意愿。 一旦某个人开始翻译了,
其他人几乎一定会参与到这些工作中来。
如果您只有有限的时间或者精力去翻译部分文档,
您可以首先去翻译安装指南。</para>
</listitem>
<listitem>
<para>阅读 &a.questions; 并偶尔看一看 &ng.misc;
(甚至有规律地这样做)。 与别人分享您的专业知识,
并帮助他们解决问题是一件令人愉悦的事情;
有些时候您甚至可以在这个过程中学到一些新东西!
这些论坛有时也会为您提供一些有价值的主意。</para>
</listitem>
</orderedlist>
</sect2>
<sect2 xml:id="ongoing-programmer-tasks">
<title>正在进行的开发任务</title>
<para>列在这里的大部分任务都需要您投入可观的时间,
或者需要您在 FreeBSD 内核方面有丰富的知识, 或者两者都要。
当然这里也有很多重要的任务也许您一个
<quote>周末开发人员</quote> 就可以干完。</para>
<orderedlist>
<listitem>
<para>如果您正在运行 FreeBSD-CURRENT 版本并且有一条高速的
Internet接入线路 您可以访问 <systemitem class="fqdomainname">current.FreeBSD.org</systemitem>
这里每天会有一个新版本 &mdash; 如果您有空,
您可以隔三岔五地下载一份并且安装它,
其间如果出了什么问题,请告诉我们。</para>
</listitem>
<listitem>
<para>阅读 &a.bugs;。 您可能会为这些问题提供具有建设性意义的评论,
或者帮忙测试一些补丁。 此外,
您甚至可以尝试修正其中的一些问题。</para>
</listitem>
<listitem>
<para>如果您知道有一些修正已经在 -CURRENT 上成功地进行,
但在经过一段时间之后仍然没有合并到 -STABLE
(通常是 2周左右) 给相关的 committer 发一封礼貌的提示信。</para>
</listitem>
<listitem>
<para>将第三方软件加入到源代码中的
<filename>src/contrib</filename> 目录。</para>
</listitem>
<listitem>
<para>确保 <filename>src/contrib</filename>
中的代码是最新的</para>
</listitem>
<listitem>
<para>以更高的警告级别构建源代码 (或一部分源代码)
并清理这些警告。</para>
</listitem>
<listitem>
<para>更新那些在 ports 中使用过时的东西,
例如 <function>gets()</function> 或包含
<filename>malloc.h</filename> 所产生的警告。</para>
</listitem>
<listitem>
<para>如果您制作了 ports 并进行了一些针对
&os; 的改动, 将您的补丁发回给原作者
(这样下次升级时您的工作会变得轻松一些)。</para>
</listitem>
<listitem>
<para>获取一份正式的标准, 如 &posix; 的副本。
您可以在 <link xlink:href="&url.base;/projects/c99/index.html">FreeBSD
C99 &amp; POSIX 标准顺应项目</link> 网站上得到相关的链接。
将 FreeBSD 的行为同标准进行比较。 如果与标准不同,
特别是那些细节地方的微小差异, 请发送一个关于它的 PR (问题报告)。
如果可能, 请指出如何修正它, 并随 PR 提交补丁。
如果您认为标准有问题,
请向标准化团体要求对其进行重新的考虑。</para>
</listitem>
<listitem>
<para>为这份列表建议更多的内容!</para>
</listitem>
</orderedlist>
</sect2>
<sect2>
<title>查看整个 PR 数据库</title>
<indexterm><primary>问题报告数据库</primary></indexterm>
<para><link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi">FreeBSD
PR 列表</link> 展示了所有当前处于活跃状态的问题报告, 以及由
FreeBSD 用户提交的改进建议。 PR
数据库同时包括了开发人员和非开发人员的任务。
查看那些尚未解决的 PR 并看看是否有您感兴趣的任务。
这其中可能有一些是非常简单的问题,
只需要看一看并确认 PR 是正确的。 另外一些可能会非常复杂,
或者完全没有包括任何修正。</para>
<para>首先看一看那些还没有人接手的 PR。
如果 PR 已经分配给了其它人, 但看起来是您能够处理的,
您可以给那个人发信, 并询问您是否可以提供帮助 &mdash;
他们可能已经有了可供测试的补丁, 或有一些可供讨论的意见。</para>
</sect2>
<sect2>
<title><quote>点子</quote> 网页上认领项目</title>
<para><link xlink:href="&url.base;/projects/ideas/">&os;
志愿者项目和点子清单</link> 也是提供给愿意为
&os; 项目做出贡献的人们的。
这张清单一直在被定期更新着,
包含了对程序员和非程序员有用的每个项目的信息。</para>
</sect2>
</sect1>
<sect1 xml:id="contrib-how">
<title>如何提供帮助</title>
<para>帮助改进系统基本上可以分为 5 类:</para>
<sect2 xml:id="contrib-general">
<title>错误报告和一般的注解</title>
<para>通常, <emphasis>一般意义上的</emphasis>
技术想法和建议应该发到 &a.hackers;
同样地, 对于这些东西有兴趣的人 (当然,
他们同时还要能够容忍 <emphasis>大量的</emphasis> 邮件!)
可以考虑订阅 &a.hackers;
参见 <link xlink:href="&url.books.handbook;/eresources.html#ERESOURCES-MAIL">FreeBSD
使用手册</link> 以了解关于这个邮件列表,
以及其它邮件列表的详细情况。</para>
<para>如果您发现了 bug 或者想要提交某些修改,
请通过 &man.send-pr.1; 程序或使用
<link xlink:href="&url.base;/send-pr.html">基于 WEB
的提交页面</link> 来提交。 请试着填写 bug 报告的每一项。
一般来说, 我们建议在 bug 报告中直接附上补丁, 除非它超过了 65KB。
如果补丁可以直接应用到源代码上, 则建议您在报告的
synopsis 一栏写上 <literal>[PATCH]</literal>
在附带补丁时, 请 <emphasis>不要</emphasis>
通过复制和粘贴来进行, 因为这样做会把 tab 变成空格,
结果补丁很可能就不能用了。 如果补丁超过 20KB 很多,
应考虑将其压缩 (例如使用 &man.gzip.1;&man.bzip2.1;)
之后用 &man.uuencode.1; 进行编码之后再放进您的问题报告中。</para>
<para>一旦报告被存档, 您会收到一封确认邮件以及一个事件追踪编号。
请保留这个编号, 因为您可以在之后使用这个编号,
发邮件到 &a.bugfollowup;
来提供关于该事件的进一步信息。 您需要做的是将编号放到邮件的标题中,
例如 <literal>"Re:
kern/3377"</literal>
关于同一问题更进一步的情况应该通过这种方式来提交。</para>
<para>如果您在一段时间之后仍然没有收到确认信 (超过 3
天甚至 1 周, 这取决于您的邮件服务)
或者由于某种原因无法使用 &man.send-pr.1; 命令,
则可以发信给 &a.bugs; 要求别人代您发送它。</para>
<para>请参见 <link xlink:href="&url.articles.problem-reports;/article.html">这篇文章</link>
了解如何撰写好的问题报告。</para>
</sect2>
<sect2>
<title>对于文档的修订</title>
<indexterm><primary>提交文档</primary></indexterm>
<para>对于文档的修改由 &a.doc; 来审查。
请参见 <link xlink:href="&url.books.fdp-primer;/index.html">FreeBSD
文档计划初级读本</link> 来获得完整的指导。
请按照 <xref linkend="contrib-general"/> 中介绍的方法使用 &man.send-pr.1;
来发送新的文档或者对于现有文档的完善 (哪怕是很小的改进也是欢迎的!)。</para>
</sect2>
<sect2>
<title>对于现有源代码的修改</title>
<indexterm><primary>FreeBSD-CURRENT</primary></indexterm>
<para>在现有代码上进行修改或增加功能在某种程度上是需要更多技巧的事情,
并且还和您对于目前 FreeBSD 的开发现状的了解有关。
有多种方式可以得到被称作 <quote>FreeBSD-CURRENT</quote>
的 FreeBSD 开发版本, 您可以通过它来了解最近的开发情况。
请参见 <link xlink:href=" &url.books.handbook;/current-stable.html">FreeBSD
使用手册</link> 来了解使用 FreeBSD-CURRENT 的进一步详情。</para>
<para>在旧的代码上进行修改, 则通常可能由于代码已经过时,
或与新的开发版本差异太大而无法被重新集成到 FreeBSD 中。
如果您订阅了 &a.announce; 以及 &a.current; 邮件列表,
则可以通过它们来大体了解目前的开发状态。</para>
<para>假如说您能够基于尽可能新的代码来完成您的修改,
则下一步要做的事情就是生成您所进行的修改的差异文件,
并将它发给 FreeBSD 的维护人员。 这项工作可以通过 &man.diff.1;
命令来完成。</para>
<para>提交补丁时推荐的 &man.diff.1; 格式是一致差异 (unified diff)
它可以通过 <command>diff
-u</command> 来生成。 不过, 如果您修改了大量的代码,
则使用 <command>diff -c</command> 来生成的上下文格式 (context diff)
的差异可能更容易阅读, 因而推荐使用。</para>
<indexterm>
<primary><command>diff</command></primary>
</indexterm>
<para>例如:</para>
<screen>&prompt.user; <userinput>diff -c oldfile newfile</userinput></screen>
<para>或者</para>
<screen>&prompt.user; <userinput>diff -c -r olddir newdir</userinput></screen>
<para>将分别生成给定文件或目录结构的 context diff。</para>
<para>类似地,</para>
<screen>&prompt.user; <userinput>diff -u oldfile newfile</userinput></screen>
<para></para>
<screen>&prompt.user; <userinput>diff -u -r olddir newdir</userinput></screen>
<para>的作用与前面的类似, 但采用的格式是 unified diff。</para>
<para>请参见 &man.diff.1; 联机手册了解更多细节。</para>
<para>一旦您使用 &man.diff.1; 生成了差异集 (可以使用
&man.patch.1; 命令来测试一下) 就可以提交它们,
以便被 FreeBSD 收录。 通过使用 <xref linkend="contrib-general"/>
中所介绍的 &man.send-pr.1; 程序就可以完成这项工作。
<emphasis>不要</emphasis> 只是把差异集发到 &a.hackers;
否则它们可能会被丢掉! 我们会非常感激您提交的修改
(这是一个志愿者项目!) 因为我们都很忙,
因此有时不一定能够立即修正问题, 但 PR
数据库将一直保持着这些记录,
因此只要有人有了时间它们就能被改正了。
如果您的问题报告中包括补丁, 一定不要忘了在标题上用
<literal>[PATCH]</literal> 来强调一下。</para>
<indexterm>
<primary><command>uuencode</command></primary>
</indexterm>
<para>如果您认为合适 (例如您添加、 删除或重命名了文件)
还可以考虑使用
<command>tar</command> 来将文件打包, 然后用 &man.uuencode.1;
来编码。 我们也欢迎用 &man.shar.1; 创建的包。</para>
<para>如果您的修改可能存在潜在的争议, 例如,
您不确定与之相关的版权问题, 或者感觉需要经过更严格的复审才可以发布它们,
则应直接发给 &a.core; 而不是通过 &man.send-pr.1; 来发送。
&a.core; 是一个小组, 其成员更多的从事 FreeBSD 的日常工作。
需要注意的是, 这个小组也因此 <emphasis>很忙</emphasis>
因此只有在非常必要的时候才应给他们写信。</para>
<para>请参考 &man.intro.9;&man.style.9; 以了解关于编码习惯和约定的详情。
如果您了解这些约定, 则对我们来说将是极大的帮助。</para>
</sect2>
<sect2>
<title>新代码或重要的增值软件包</title>
<para>如果您打算提供规模较大的代码, 或者为 FreeBSD 增加重要的新功能,
则可能必须将它们通过 uuencode 进行编码, 或传到某个 Web 或
FTP 站点, 以便更多的人能够得到它。 如果您没有这样的服务器,
请到相关的 FreeBSD 邮件列表提出, 看看是否有人愿意帮您放置它们。</para>
<para>对于大量的代码而言, 关于版权的问题肯定会被提出。
FreeBSD 基本系统中能够使用的版权声明包括:</para>
<orderedlist>
<listitem>
<para>BSD<indexterm><primary>BSD 版权声明</primary></indexterm> 版权。 我们倾向于使用这类授权的代码,
因为它 <quote>不附加多余的条件</quote> 因而更能够吸引商业企业使用。
FreeBSD 并不反对商业公司使用它的代码, 相反,
我们积极地鼓励商业公司使用我们的代码,
当然, 如果它们最终把一部分代码重新捐赠给 FreeBSD
就更好了。</para>
</listitem>
<listitem>
<para>GNU General Public License<indexterm><primary>GPL</primary><see>GNU General Public License</see></indexterm><indexterm><primary>GNU General Public License</primary></indexterm> 或简称 <quote>GPL</quote>
我们并不很欢迎使用这样授权的代码,
因为商业公司使用它需要做更多的工作。 不过, 由于很多使用
GPL 授权的代码目前是无法避免的 (编译器、 汇编器,
文本排版程序等等) 拒绝使用所有采用这样授权的软件是很不明智的。
采用 GPL 授权的代码会被放到源代码的一些专门的位置, 例如
<filename>/sys/gnu</filename>
<filename>/usr/src/gnu</filename>
以方便那些使用 GPL 代码可能会给他们带来问题的人识别。</para>
</listitem>
</orderedlist>
<para>使用其它授权的代码在进入 FreeBSD 之前必须经过慎重的复审和考虑。
采用包含严厉限制的商业授权的代码, 一般来说会被拒绝,
但我们鼓励这些代码的作者通过自己的渠道来发布它们。</para>
<para>要在您的成果上加入 <quote>BSD式</quote> 的版权,
请把下列文本放到每一个源文件的最开始部分,
并用适当的文字替换 <literal>%%</literal> 之间的文字。</para>
<programlisting>Copyright (c) %%proper_years_here%%
%%your_name_here%%, %%your_state%% %%your_zip%%.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer as
the first lines of this file unmodified.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY %%your_name_here%% ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL %%your_name_here%% BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&#36;Id&#36;</programlisting>
<para>为了方便您的使用, 在
<filename>/usr/share/examples/etc/bsd-style-copyright</filename>
也可以找到此授权的副本。</para>
</sect2>
<sect2>
<title>资金、 硬件或 Internet 接入</title>
<para>我们非常愿意接受各种形式的捐赠, 以进一步拓展 FreeBSD
Project 的事业, 因为有您的支持,
像我们这样的志愿者努力才能够有更大的成就!
捐赠硬件也非常重要, 因为这样能够帮助我们增加可以支持的硬件种类,
而我们中的很多人并没有足够的资金来购置这些硬件。</para>
<sect3 xml:id="donations">
<title>捐款</title>
<para>FreeBSD 基金会是一个非营利的、 有课税豁免权的基金会,
建立这个基金会的目标是为了让 FreeBSD Project 能够达成更加长远的目标。
作为 501(c)3 实体, 一般而言基金会可以免予上缴美国联邦收入税,
以及科罗拉多州收入税。 通常对于课税豁免的实体进行捐赠,
可以折抵联邦收入中应课税部分的金额。</para>
<para>您可以把支票寄往:
<address>
The FreeBSD Foundation
<street>7321 Brockway Dr.</street>
<city>Boulder</city>, <state>CO</state> <postcode>80303</postcode>
<country>USA</country>
</address>
</para>
<para>FreeBSD 基金会现在可以通过 PayPal 从网上接受捐款。
如果您想向基金会捐款, 请访问它的 <link xlink:href="http://www.freebsdfoundation.org">web
站点</link></para>
<para>关于 FreeBSD 基金会的更多详情, 可以在 <link xlink:href="http://people.FreeBSD.org/~jdp/foundation/announcement.html">FreeBSD
基金会 -- 介绍</link> 找到。 要联络基金会,
请发送电子邮件到
<email>bod@FreeBSDFoundation.org</email></para>
</sect3>
<sect3>
<title>捐赠硬件</title>
<indexterm><primary>捐赠</primary></indexterm>
<para>FreeBSD 计划欢迎任何人捐赠可以使用的硬件。
如果您有兴趣捐赠硬件, 请联系 <link xlink:href="&url.base;/donations/">捐赠联络人办公室</link></para>
</sect3>
<sect3>
<title>捐赠 Internet 接入</title>
<para>我们欢迎新的 FTP、 WWW 或
<command>cvsup</command> 镜像。 如果您希望成为这样的镜像,
请参见 <link xlink:href="&url.articles.hubs;/index.html">如何架设 FreeBSD 镜像</link>
一文, 以了解进一步的情况。</para>
</sect3>
</sect2>
</sect1>
<index/>
</article>

View file

@ -0,0 +1,22 @@
# The FreeBSD Simplified Chinese Project
#
# Original Revision: 1.5
# $FreeBSD$
#
# Article: Setting up a CVS repository - the FreeBSD way
MAINTAINER= stijn@win.tue.nl
DOC?= article
FORMATS?= html
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
SRCS= article.xml
URL_RELPREFIX?= ../../../..
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,588 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
<!--
The FreeBSD Documentation Project
The FreeBSD Chinese (Simplified) Documentation Project
From FreeBSD: doc/zh_TW.Big5/articles/cvs-freebsd/article.xml,v 1.2 2006/01/31 01:30:59 vanilla
Original Revision: 1.17
-->
<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="zh_cn">
<info><title>建立 CVS 储存库 (repository) - 以 FreeBSD 的方式</title>
<author><personname><firstname>Stijn</firstname><surname>Hoop</surname></personname><affiliation>
<address><email>stijn@win.tue.nl</email></address>
</affiliation></author>
<pubdate>$FreeBSD$</pubdate>
<copyright>
<year>2001</year>
<year>2002</year>
<year>2003</year>
<holder role="mailto:stijn@win.tue.nl">Stijn Hoop</holder>
</copyright>
<releaseinfo>$FreeBSD$</releaseinfo>
<legalnotice xml:id="trademarks" role="trademarks">
&tm-attrib.freebsd;
&tm-attrib.general;
</legalnotice>
<abstract>
<para>这份文件描述了使用和 FreeBSD 项目相同的命令脚本来建立 CVS 储存库的步骤。
这和标准 CVS 建立的储存库相较之下有许多优点,
它提供了更多对于源代码树的细粒度访问控制,
并能够为每一次的提交生成和发出易读的电子邮件。</para>
</abstract>
</info>
<sect1 xml:id="introduction">
<title>简介</title>
<para>大多数的开放源代码软件项目都使用 <application>CVS</application>
作为它们的源代码控制系统。 尽管 <application>CVS</application> 有许多的优点,
但它也有部份的瑕疵和缺点。
其中之一的原因是和其它的开发者分享源代码树可能会迅速成为系统管理的恶梦,
特别是当有人希望保护部份的源代码树免受于一般的存取时。</para>
<para>FreeBSD 是众多使用 <application>CVS</application> 的项目之一,
因为基于它进行开发的开发人员遍布于全世界。
他们撰写了一些命令脚本使得管理储存库变得更加容易。
最近这些命令脚本由 &a.joe; 重新整理过且更标准化,
使得在其它的项目上再次使用这些命令脚本会更加容易。
本文件将描述使用这些新的命令脚本的方法。</para>
<para>为了使本文件中的信息对您有用, 您需要首先熟悉 <application>CVS</application>
的基本操作方式。</para>
</sect1>
<sect1 xml:id="first-setup">
<title>基本配置</title>
<warning>
<para>最好的方式是在一个全新的储存库中执行这些步骤,
并确定你了解所有的后果。 同时, 请确定你有最新且可读的资料备份!</para>
</warning>
<sect2>
<title>初始化储存库</title>
<para>首先要做的是建立一个新的储存库, 执行下列命令告诉
<application>CVS</application> 建立并初始化:</para>
<screen>&prompt.user; <userinput>cvs -d path-to-repository init</userinput></screen>
<para>这命令告诉 <application>CVS</application> 建立
<filename>CVSROOT</filename> 的目录,
这个目录里放置了所有的配置文件。</para>
</sect2>
<sect2>
<title>配置储存库的用户组</title>
<para>现在我们将建立一个拥有该储存库的用户组,
所有的开发者必须加入这个用户组, 这样他们才能够存取该储存库。
我们假设用户组名称是以 FreeBSD 内部所采用的
<literal>ncvs</literal></para>
<screen>&prompt.root; <userinput>pw groupadd ncvs</userinput></screen>
<para>接着你需要使用 &man.chown.8; 将目录所有者指定给刚刚新增的用户组:</para>
<screen>&prompt.root; <userinput>chown -R :ncvs path-to-your-repository</userinput></screen>
<para>如此一来, 没有适当的用户组许可的用户, 就不再能够写入该储存库。</para>
</sect2>
<sect2>
<title>取回源文件</title>
<para>现在你需要从 FreeBSD 储存库中取回 <filename>CVSROOT</filename> 目录,
从 FreeBSD 匿名的 CVS 镜像站来取回会是最简单的方法。请查阅 <link xlink:href="&url.books.handbook;/anoncvs.html">在 使用手册 中的相关章节</link>
来获得更多信息。 我们假设取回的文件存放在相同目录下的
<filename>CVSROOT-freebsd</filename> 目录中。</para>
</sect2>
<sect2>
<title>复制 FreeBSD 的命令脚本</title>
<para>接下来我们要复制 FreeBSD <filename>CVSROOT</filename>
里的文件到你的储存库中。 如果你熟悉 <application>CVS</application>
你也许会想你可以直接汇入 (import) 这些命令脚本,
从而更容易地在未来有新版时进行版本同步; 不过,事实是
<application>CVS</application> 在这个部份有缺点: 当汇入文件到
<filename>CVSROOT</filename> 时, 它并不会更新配置文件。
为了要认出这些文件, 你还需要在汇入它们后一一重新提交, 这就失去了
<literal>cvs import</literal> 的价值。 因此, 推荐的方法是直接将这些命令脚本复制过去。</para>
<para>如果您不了解这些操作也没有关系 &mdash; 因为最后的结果都是一样的。
首先汇出 (checkout) 你的 <filename>CVSROOT</filename>
然后复制刚刚取回的 FreeBSD 文件到本地的目录中(尚未变动过):</para>
<screen>&prompt.user; <userinput>cvs -d path-to-your-repository checkout CVSROOT</userinput>
&prompt.user; <userinput>cd CVSROOT</userinput>
&prompt.user; <userinput>cp ../CVSROOT-freebsd/* .</userinput>
&prompt.user; <userinput>cvs add *</userinput></screen>
<para>注意: 你很可能会得到一段关于某些目录没有被复制的警告,这是正常的,
你并不需要用到这些目录。</para>
</sect2>
<sect2>
<title>命令脚本说明</title>
<para>现在你的工作目录中有了完整 FreeBSD 项目在他们的储存库中使用的命令脚本的副本,
以下是每个文件简单的介绍。</para>
<itemizedlist>
<listitem>
<para><filename>access</filename> - 此文件在预设的安装中没有被用到。
它是在 <link linkend="freebsdspecific">FreeBSD 的专用配置</link>
中用来控制储存库的存取的。 如果你不希望使用这个配置的话,
则可以删除这个文件。</para>
</listitem>
<listitem>
<para><filename>avail</filename> - 此文件控制储存库的存取。
在此文件中你可以指定允许存取储存库的用户组,
也可以针对目录或文件来拒绝提交。
你应该调整为在你的储存库中将包含的用户组和目录。</para>
</listitem>
<listitem>
<para><filename>cfg.pm</filename> - 此文件说明了配置内容,并提供预设的配置。
<emphasis></emphasis> 应修改此文件, 而应将修改的配置放到
<filename>cfg_local.pm</filename></para>
</listitem>
<listitem>
<para><filename>cfg_local.pm</filename> - 此文件包含所有的系统配置值。
你应该配置所有列在此的配置, 例如提交的邮件要寄到哪、
在哪些主机上的使用者可以提交等等。 更多的相关信息在稍后会提到。</para>
</listitem>
<listitem>
<para><filename>checkoutlist</filename> - 此文件列出所有在
<application>CVS</application> 控制下此目录中的文件, 除了标准在
<literal>cvs init</literal> 建立出的文件。 你可以删除某些不需要的
FreeBSD 专用的文件。</para>
</listitem>
<listitem>
<para><filename>commit_prep.pl</filename> - 此命令脚本执行各种提交前的检查,
这些检查是否启用, 取决于您在 <filename>cfg_local.pm</filename>
中所进行的配置。 你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>commitcheck</filename> - 此命令脚本会直接影响
<application>CVS</application>。 首先它会使用
<filename>cvs_acls.pl</filename> 来检查提交者是否可以存取指定的源代码树,
然后执行 <filename>commit_prep.pl</filename> 来确认各种提交前的检查。
如果一切正常,<application>CVS</application> 将允许此次提交继续执行。
你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>commitinfo</filename> - 此文件是
<application>CVS</application> 用来定义在提交前所要执行的程序 &mdash;
在此例中是 <filename>commitcheck</filename>。你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>config</filename> - 储存库的配置选项。
你可以修改为你想要的, 但大多数的管理者可能会保留默认值。
更多关于可以在此配置的选项信息可以查阅 <application>CVS</application> 手册。</para>
</listitem>
<listitem>
<para><filename>cvs_acls.pl</filename> - 此命令脚本定义提交者的身分,
以及他/她是否允许存取源代码树, 这些判断基于 <filename>avail</filename>
中的配置。 你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>cvsignore</filename> - 此文件列出哪些文件
<application>CVS</application> 不用处理到储存库中,
你可以修改成你想要的。 更多关于可以此文件的说明可以查阅 <application>CVS</application>
手册。</para>
</listitem>
<listitem>
<para><filename>cvswrappers</filename> - 此文件是
<application>CVS</application> 用来启用或停用关键词展开,
或者是否应将文件视为二进制文件。 你可以修改成你想要的。
更多关于可以此文件的说明可以查阅 <application>CVS</application> 手册。
注意 <literal>-t</literal><literal>-f</literal> 选项在
<application>CVS</application> 客户端/服务器 并不能够正确地运作。</para>
</listitem>
<listitem>
<para><filename>edithook</filename> - 此文件已经不再使用了,
仅为历史原因保留。 你可以安全地删除此文件。</para>
</listitem>
<listitem>
<para><filename>editinfo</filename> - <application>CVS</application>
使用这个文件来强迫你使用特定的编辑器。 FreeBSD 没有使用这个功能,
而对输入的日志信息的检查, 则由 <filename>verifymsg</filename>
<filename>logcheck</filename> 来完成。 这是因为
<filename>editinfo</filename> 功能在从远程提交或是使用
<literal>-m</literal><literal>-F</literal> 选项时不会执行。
你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>exclude</filename> - 此文件列出被
<filename>commit_prep.pl</filename> 定义不能包含修正版标头的文件。
在 FreeBSD 版本的配置中, 所有在修正版控制下的文件需有一个修正版标头,
(类似 &dollar;FreeBSD&dollar; 这样)。
此文件逐行列出不应进行检查的文件名字。
你可以在此文件中为不需要修正版标头的文件新增一个正则表达式。
为了安装这些命令脚本, 最好的方法是将
<filename>CVSROOT/</filename> 从标头检查中排除。</para>
</listitem>
<listitem>
<para><filename>log_accum.pl</filename> - 此命令脚本会处理由
<filename>logcheck</filename> 所提供的日志信息,
并且将之为备份目的附加于储存库中的记录文件。
同时也执行要将邮件寄到你提供的信箱中的程序 (在 <filename>cfg_local.pm</filename> 中)。
它和 <application>CVS</application> 之间是由 <filename>loginfo</filename>
负责沟通。 你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>logcheck</filename> - 此文件分析提交者提供的日志信息,
并试图对其作清理动作。 它和 <application>CVS</application>
之间是由 <filename>verifymsg</filename> 负责沟通。 你不应更动此文件。</para>
<note><para>此命令脚本依赖于经过 FreeBSD 修改的 <application>CVS</application>
FreeBSD 版本在此命令脚本修改过后才读取日志信息; 标准的
<application>CVS</application> 版本虽然能够检查语法上是否正确,
但并不会清理日志信息。<application>CVS</application> 1.11.2 可以通过在
<filename>config</filename> 配置 <literal>RereadLogAfterVerify=always</literal>
来和 FreeBSD 版本有相同的作用。</para></note>
</listitem>
<listitem>
<para><filename>loginfo</filename> - 此文件是
<application>CVS</application> 用来控制日志信息要寄到哪里,而
<filename>log_accum.pl</filename> 负责处理。你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>modules</filename> - 此文件保留了
<application>CVS</application> 原始的意义。 你应该删除新增的 FreeBSD
模块, 并修改为你想要的内容。 更多关于可以此文件的说明可以查阅
<application>CVS</application> 手册。</para>
</listitem>
<listitem>
<para><filename>notify</filename> - 此文件为
<application>CVS</application> 用来控制监看某个文件。
在 FreeBSD 的储存库中没有用到此文件,
你可以修改成你想要的。 更多关于可以此文件的说明,
可以查阅 <application>CVS</application> 手册。</para>
</listitem>
<listitem>
<para><filename>options</filename> - 此文件仅限使用于 FreeBSD 和 Debian
<application>CVS</application> 版本。
它包含了需要在修正版标头中展开的关键词。
你可以修改为符合你在 <filename>cfg_local.pm</filename> 中指定的关键词。</para>
</listitem>
<listitem>
<para><filename>rcsinfo</filename> - 此文件定义提交时,
储存库所要使用的日志信息样式模板, 如 <filename>rcstemplate</filename>
FreeBSD 预设为所有的储存库使用同一个样式模板,
你可以加入其它你想要的。</para>
</listitem>
<listitem>
<para><filename>rcstemplate</filename> - 此文件是提交者在提交时会看到的日志信息样式模板,
你应该修改为你在 <filename>cfg_local.pm</filename>
中定义的各种参数。</para>
</listitem>
<listitem>
<para><filename>tagcheck</filename> - 此文件控制在储存库中贴上标签的存取。
标准的 FreeBSD 版本拒绝名为 RELENG* 的标签,因为这是 交付工程组 的工作。
你可以根据需要来修改此文件。</para>
</listitem>
<listitem>
<para><filename>taginfo</filename> - 此文件控制执行在储存库中贴上标签的存取的命令脚本,
<filename>tagcheck</filename>。你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>unwrap</filename> - 此命令脚本可以用来在汇出时自动 <quote>解开</quote>
二进制文件 (请见 <filename>cvswrappers</filename>)。 目前 FreeBSD
并没有使用此配置, 因为此功能在远程提交时执行的并不十分完善。
你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>verifymsg</filename> - 此文件用来执行和日志信息相关的命令脚本,
<filename>logcheck</filename>。你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>wrap</filename> - 此命令脚本可以用来在提交时自动 <quote>包裹</quote>
二进制文件 (请见 <filename>cvswrappers</filename>)。 目前 FreeBSD
并没有使用此配置, 因为此功能在远程提交时执行的并不十分完善。
你不应更动此文件。</para>
</listitem>
</itemizedlist>
</sect2>
<sect2>
<title>定制命令脚本</title>
<para>接下来的步骤要配置这些命令脚本使得它们可以在你的环境中运作。
你应该检查所有在目录中的文件, 并修改为符合你的配置。
尤其, 你会想要修改下列的文件:</para>
<procedure>
<step>
<para>如果你不希望使用 <link linkend="freebsdspecific">FreeBSD 的专用配置</link>
你可以安全地删除 <filename>access</filename></para>
<screen>&prompt.user; <userinput>cvs rm -f access</userinput></screen>
</step>
<step>
<para>编辑 <filename>avail</filename> 来包含你想控制存取的各种储存库目录,
请确定你有保留 <literal>avail||CVSROOT</literal> 这一行,
否则你将会在下一步把你自己锁在外面。</para>
<para>另外你可以在此文件中新增开发者的用户组FreeBSD 预设使用
<filename>access</filename> 来列出所有的开发者,
但你可以使用任何你想要用的文件。 如果你想的话也可以新增用户组 (请使用指定在
<filename>cvs_acls.pl</filename> 前面所介绍的语法)。</para>
</step>
<step>
<para>编辑 <filename>cfg_local.pm</filename> 来包含你需要的选项。
你应该特别检视一下下列的配置项目:</para>
<itemizedlist>
<listitem>
<para><literal>%TEMPLATE_HEADERS</literal> - 这是用来取得日志信息内容的程序,
并加入将呈现的邮件项目和提供非空值的信息。
你可以删除 <literal>PR</literal><literal>MFC after</literal>
叙述,当然也可以加入你想要的。</para>
</listitem>
<listitem>
<para><literal>$MAIL_BRANCH_HDR</literal> - 如果你想要在每一封提交的邮件中加入描述是在哪一个分支中提交的标头,
那么请定义为符合你的配置。 如果你不想使用这样的标头, 那么请配置为空值。</para>
</listitem>
<listitem>
<para><literal>@COMMIT_HOSTS</literal> - 定义使用者能够提交的主机。</para>
</listitem>
<listitem>
<para><literal>$MAILADDRS</literal> - 配置应该收到提交邮件的邮件地址。</para>
</listitem>
<listitem>
<para><literal>@LOG_FILE_MAP</literal> - 以你所需要的来修改这个数组,
每个配置值应该符合被提交的目录,而提交的日志信息会以
<filename>commitlogs</filename> 的名称储存在每个被配置的目录下。</para>
</listitem>
<listitem>
<para><literal>$COMMITCHECK_EXTRA</literal> - 如果你不想使用
<link linkend="freebsdspecific">FreeBSD 专用的存取控制</link>
功能, 你可以在此文件中删除对 <literal>$COMMITCHECK_EXTRA</literal>
的定义。</para>
</listitem>
</itemizedlist>
<note><para>修改 <literal>$IDHEADER</literal> 的功能只有在 FreeBSD
平台上可以运作, 它依赖于 FreeBSD 专用的 <application>CVS</application>
配置。</para></note>
<para>你可以检查 <filename>cfg.pm</filename> 是否有其它的参数可以修改,
但是修改最好是有原因的。</para>
</step>
<step>
<para>删除 <filename>exclude</filename> 中关于FreeBSD 的专用配置的叙述
(如以 <literal>^ports/</literal> 为开头的每一行等)。 此外,
注释掉以 <literal>^CVSROOT/</literal> 为开头的行列, 然后新增一行只有
<literal>^CVSROOT/</literal>。 等到关键词展开的命令脚本安装好后,
你可以在 <filename>CVSROOT</filename> 目录中的文件里加上标头,
然后再恢复刚刚注释的行列, 但在你还没有提交前则只保持这样。</para>
</step>
<step>
<para>编辑 <filename>modules</filename> 并删除所有 FreeBSD 的模块。
加入你需要的模块。</para>
</step>
<step>
<note><para>此步骤只有在你于 <filename>cfg_local.pm</filename> 中指定了
<literal>$IDHEADER</literal> 才有必要配置 (只有在 FreeBSD 专用的
<application>CVS</application> 配置上才能够执行)。</para></note>
<para>编辑 <filename>options</filename> 以符合你在
<filename>cfg_local.pm</filename> 中配置的标签名称。
在所有的文件中搜寻 <literal>FreeBSD</literal>
并替换为你配置的标签名称。</para>
</step>
<step>
<para>修改 <filename>rcstemplate</filename> 为和在
<filename>cfg_local.pm</filename> 中相同的配置。</para>
</step>
<step>
<para>选择性的删除在 <filename>tagcheck</filename> 中针对 FreeBSD
检查的配置。你可以仅仅在文件的最上层加上 <literal>exit 0</literal>
来取消所有标签的检查。</para>
</step>
<step>
<para>在你完成前的最后一件事是确认 commitlogs 可以正确储存。
预设会储存在储存库中 <filename>CVSROOT</filename> 里的
<filename>commitlogs</filename> 子目录中,
而这个目录需要事先建立:</para>
<screen>&prompt.user; <userinput>mkdir commitlogs</userinput>
&prompt.user; <userinput>cvs add commitlogs</userinput></screen>
</step>
</procedure>
<para>现在, 在细心的检视过后, 你可以提交你的修改了。 确定你先前有在
<filename>avail</filename> 中允许你自己存取 <filename>CVSROOT</filename>
目录, 因为如果没有这样做的话你会把你自己锁在外面。
完整确认过后请执行下列命令:</para>
<screen>&prompt.user; <userinput>cvs commit -m '- Initial FreeBSD scripts commit'</userinput></screen>
</sect2>
<sect2>
<title>测试配置</title>
<para>你已经准备好做基本的测试了: 强制提交 <filename>avail</filename>
以确认每件事都如预期的运作。</para>
<screen>&prompt.user; <userinput>cvs commit -f -m 'Forced commit to test the new CVSROOT scripts' avail</userinput></screen>
<para>如果一切正常, 那么恭喜了! 你现在已经为你的储存库建立好 FreeBSD
的命令脚本了。 如果 <application>CVS</application> 仍然有警告什么,
回头检视上述的步骤是否有正确的执行。</para>
</sect2>
</sect1>
<sect1 xml:id="freebsdspecific">
<title>FreeBSD 的专用配置</title>
<para>FreeBSD 项目自己使用一个有点不同的配置,那就是同时也使用 FreeBSD
<filename>CVSROOT</filename> 中的 <filename>freebsd</filename> 子目录。
因为大量的 committer 必须在相同的用户组中, 因此项目写了一个简单的 wrapper
来确保 committer 可以正确的提交, 并配置储存库的用户组名称。</para>
<para>如果你的储存库也需要这样的功能,那么下面就会介绍如何建立,
不过首先要先来看一段复杂的概述。</para>
<sect2>
<title>FreeBSD 配置中使用的文件</title>
<itemizedlist>
<listitem>
<para><filename>access</filename> - 此文件用来控制储存库的存取。
你应该编辑并加入所有在项目中的成员。</para>
</listitem>
<listitem>
<para><filename>freebsd/commitmail.pl</filename> -
此文件已经不再使用了,
只是因为历史原因而保留。 你不应更动此文件。</para>
</listitem>
<listitem>
<para><filename>freebsd/cvswrap.c</filename> - 此 CVS wrapper
源代码是用来建立检查所有存取的工作。更多的信息在稍后会提出。
你应该编辑 <literal>ACCESS</literal><literal>REALCVS</literal>
的路径以符合你的配置。</para>
</listitem>
<listitem>
<para><filename>freebsd/mailsend.c</filename> - 此文件是 FreeBSD 设定
mailing lists 需要的, 你不应更动此文件。</para>
</listitem>
</itemizedlist>
</sect2>
<sect2>
<title>步骤</title>
<procedure>
<step>
<para>只把你的用户名加到 <filename>access</filename> 中。</para>
</step>
<step>
<para>编辑 <filename>cvswrap.c</filename> 的路径以符合你的配置,
定义在大写的 <literal>ACCESS</literal> 中。
同时如果默认值不符合你的情况的话也应该修改本地实际的 <command>cvs</command>
程序所在位置。 原始的 <filename>cvswrap.c</filename>
希望替代服务器端的 CVS 程序,
例如将其改名为 <filename>/usr/bin/ncvs</filename></para>
<para>我的 <filename>cvswrap.c</filename> 是这样:</para>
<programlisting>#define ACCESS "/local/cvsroot/CVSROOT/access"
#define REALCVS "/usr/bin/ncvs"</programlisting>
</step>
<step>
<para>接下来是建立 wrapper 来确认你在提交时是在正确的用户组中。
在你的 <filename>CVSROOT</filename> 中的
<filename>cvswrap.c</filename> 要能够使用。</para>
<para>在你完成编辑并加入正确的路径后我们要来编译源代码:</para>
<screen>&prompt.user; <userinput>cc -o cvs cvswrap.c</userinput></screen>
<para>然后进行需要配置(此步骤需要 root 权限):</para>
<screen>&prompt.root; <userinput>mv /usr/bin/cvs /usr/bin/ncvs</userinput>
&prompt.root; <userinput>mv cvs /usr/bin/cvs</userinput>
&prompt.root; <userinput>chown root:ncvs /usr/bin/cvs /usr/bin/ncvs</userinput>
&prompt.root; <userinput>chmod o-rx /usr/bin/ncvs</userinput>
&prompt.root; <userinput>chmod u-w,g+s /usr/bin/cvs</userinput></screen>
<para>这会将 wrapper 安装成预设的 <command>cvs</command> 程序,
请确定任何要使用储存库的人应该有正确的存取权限。</para>
</step>
<step>
<para>现在你可以删除所有在储存库用户组中的使用者,所有的存取控制会经由
wrapper 完成,同时 wrapper 会配置存取的正确用户组。</para>
</step>
</procedure>
</sect2>
<sect2>
<title>测试配置</title>
<para>你的 wrapper 现在应该已经安装好了,你当然也可以强制提交
<filename>access</filename> 来测试是否正常:</para>
<screen>&prompt.user; <userinput>cvs commit -f -m 'Forced commit to test the new CVSROOT scripts' access</userinput></screen>
<para>同样地,如果有错误,检查是否上述所有步骤都有正确的执行。</para>
</sect2>
</sect1>
</article>

View file

@ -0,0 +1,19 @@
#
# $FreeBSD$
# Original Revision: 1.1
# Article: FreeBSD Quickstart for Linux Users
DOC?= article
FORMATS?= html
WITH_ARTICLE_TOC?= YES
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
SRCS= article.xml
URL_RELPREFIX?= ../../../..
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,572 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
<!--
The FreeBSD Documentation Project
The FreeBSD Chinese (Simplified) Documentation Project
Original Revision: r39170
-->
<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="zh_cn">
<info><title>&linux; 用户的 FreeBSD 快速入门向导</title>
<authorgroup>
<author><personname><firstname>John</firstname><surname>Ferrell</surname></personname></author>
</authorgroup>
<pubdate>$FreeBSD$</pubdate>
<copyright>
<year>2008</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<releaseinfo>$FreeBSD$</releaseinfo>
<legalnotice xml:id="trademarks" role="trademarks">
&tm-attrib.freebsd;
&tm-attrib.linux;
&tm-attrib.intel;
&tm-attrib.redhat;
&tm-attrib.unix;
&tm-attrib.general;
</legalnotice>
<abstract>
<para>本文档旨在快速使那些高级 &linux;
用户熟悉FreeBSD的一些基础知识。</para>
</abstract>
</info>
<sect1 xml:id="intro">
<title>简介</title>
<para>本文档将突出介绍 &os;&linux; 的差别,
以使得那些 &linux; 高级用户能自己快速熟悉 &os;
的基础内容。这只是份技术上的快速入门,
并非是试图描绘这两种操作系统之间的"哲学"上的差异。</para>
<para>此文档假定认为你已经安装好了 &os;
如果你还没有安装 &os; 或者对 &os;
的安装过程方面需要帮助,请参考 &os; 手册的
<link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/install.html">
安装 FreeBSD</link>一章。</para>
</sect1>
<sect1 xml:id="shells">
<title>Shell程序没有Bash吗</title>
<para>那些从 &linux; 转过来的用户经常会惊讶于
<application>Bash</application> 不是 &os; 的默认 Shell。
事实上,<application>Bash</application> 甚至没有包括在
&os; 的默认安装中。代替的是,&os; 使用 &man.tcsh.1;
作为自己的默认 Shell尽管如此<application>Bash</application>
和其他你喜爱的 Shell 程序在 &os;
<link xlink:href="article.html#SOFTWARE">Packages 和 Ports 套件</link>
里都可以找到。</para>
<para>如果你安装了其他的 Shell 你可以使用 &man.chsh.1;
来设置一个用户的默认 Shell。 通常情况下,
强烈建议不要去更改 <systemitem class="username">root</systemitem>
用户的默认 Shell。原因是这些 Shell
没有包括在基本系统中,正常情况下它们会被安装到
<filename>/usr/local/bin</filename>
<filename>/usr/bin</filename> 目录下。万一某天
<filename>/usr/local/bin</filename>
<filename>/usr/bin</filename> 的文件系统不能被挂载,
这样情况下 <systemitem class="username">root</systemitem>
将不能进入自己默认的 Shell从而
<systemitem class="username">root</systemitem> 将不能够登录进去。
鉴于这个原因,第二个系统管理员帐户
<systemitem class="username">toor</systemitem> 创建时使用的是非默认的
Shell。在安全 FAQ 可以查阅到关于 <link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/faq/security.html#TOOR-ACCOUNT">toor 帐户</link>
的信息。</para>
</sect1>
<sect1 xml:id="software">
<title>Packages和Ports&os; 中添加软件</title>
<para>除了经典的 &unix; 安装软件的方法
(下载源码包,解压,编辑源码,编译)外,&os;
还提供了另外两种方法来安装应用程序packages 和 ports。
你可以在 <link xlink:href="http://www.freebsd.org/ports/master-index.html">这里</link>
到一份完整可用的 ports 和 packages 的软件清单。</para>
<sect2 xml:id="packages">
<title>Packages</title>
<para>Packages 是预编译好的应用程序,在 &os;
中等价于基于 Debian/Ubuntu 的系统中的
<filename>.deb</filename> 软件包以及基于
Red&nbsp;Hat/Fedora 的系统中的
<filename>.rpm</filename> 软件包。
Packages使用 &man.pkg.add.1; 来进行安装。
例如,下面的命令将用来安装
<application>Apache 2.2</application></para>
<screen>&prompt.root; <userinput>pkg_add /tmp/apache-2.2.6_2.tbz</userinput></screen>
<para>使用 <option>-r</option> 操作将告诉 &man.pkg.add.1;
来自动获取并安装一个软件包,以及解决所有的依赖关系:</para>
<screen>&prompt.root; <userinput>pkg_add -r apache22</userinput>
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/Latest/apache22.tbz... Done.
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/All/expat-2.0.0_1.tbz... Done.
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/All/perl-5.8.8_1.tbz... Done.
[snip]
To run apache www server from startup, add apache22_enable="YES"
in your /etc/rc.conf. Extra options can be found in startup script.</screen>
<note>
<para>如果你正运行着 release 版本的 &os; 6.26.37.0等,
通常从 CD-ROM 被安装的)<command>pkg_add -r</command>
会为其下载专门为这些特定版本构建好的软件包。
这些软件包 <emphasis>可能</emphasis> 不是当前最新的程序。
你可以使用 <envar>PACKAGESITE</envar> 变量来覆盖默认的动作。
例如,把 <envar>PACHAGESITE</envar> 设置成
<uri xlink:href="ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/">ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/</uri>
来下载 6.X 系列最新的包。</para>
</note>
<para>想了解更多的 packages 信息请查阅 &os;
手册的 4.4 小节:<link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/packages-using.html">使用 Packages 系统</link></para>
</sect2>
<sect2 xml:id="ports">
<title>Ports</title>
<para>&os; 的第二种安装应用程序的方法就是使用 Ports 套件了。
Ports 套件是 &os; 上的一个利用 <filename>Makefile</filename>
和一些补丁文件来特定从源码定制安装各种软件程序的框架。
当安装一个 port 时系统会获取程序源码,
应用任何所需要的补丁,编译源码,
并安装应用程序(并针对依赖关系以同样的方式安装解决)。</para>
<para>Ports 套件,常被称作 ports 树,可以在
<filename>/usr/ports</filename> 下找到。
假设Ports套件已经在安装 &os; 时安装过了。
如果 Ports 套件还没有被安装可以通过 &man.sysinstall.8;
来进行安装,或者使用 &man.csup.1;&man.portsnap.8;
来从 &os; 的服务器上面拉下来。在手册的 <link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/ports-using.html">4.5.1 小节</link>
可以找到安装 Ports 套件的详细介绍。</para>
<para>安装一个 port 就像进入 port
的目录并开始构建过程一样简单(通常情况下),
下面是从 Ports 套件安装
<application>Apache 2.2</application> 的例子:</para>
<screen>&prompt.root; <userinput>cd /usr/ports/www/apache22</userinput>
&prompt.root; <userinput>make install clean</userinput></screen>
<para>使用 ports 安装软件的最大好处就是能够自定义安装选项。
例如,从 ports 安装 <application>Apache 2.2</application>
时你可以通过设置 <varname>WITH_LDAP</varname> &man.make.1;
变量来启用 <application>mod_ldap</application></para>
<screen>&prompt.root; <userinput>cd /usr/ports/www/apache22</userinput>
&prompt.root; <userinput>make WITH_LDAP="YES" install clean</userinput></screen>
<para>请查看 &os; 手册的 4.5 小节,<link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/ports-using.html">
使用 Ports&nbsp;Collection</link>
以获取更多关于Ports&nbsp;Collection 的信息。</para>
</sect2>
<sect2 xml:id="which">
<title>Ports还是packages我应该使用哪个</title>
<para>Packages 就是预编译好的 ports
所以从源码ports安装与从二进制 packages
安装这两者间确实有很大关联。每种方法各有自己的优点:</para>
<itemizedlist>
<title>Packages二进制</title>
<listitem><simpara>更快速的安装
(比较大的应用程序编译起来会花很长时间)。</simpara></listitem>
<listitem><simpara>你不需要知道如何编译软件。</simpara></listitem>
<listitem><simpara>不需要在操作系统上安装编译器。</simpara></listitem>
</itemizedlist>
<itemizedlist>
<title>Ports源码</title>
<listitem><simpara>能够定制安装选项。
Packages通常都是使用标准选项构建的。使用 ports
你能够定义各种各样的选项,
比如类似构建附加的模块或是更改安装路径之类的。)</simpara></listitem>
<listitem><simpara>如果你喜欢的话还可以使用自己的补丁。</simpara></listitem>
</itemizedlist>
<para>如果你没有一些特别的需求, packages
可能刚好最适合你的情况。如果你需要进一步定制,
ports 是最适合的方法了。(请记得,
如果你需要定制而自己又更倾向于使用 packages
你可以使用 <command>make</command>
<buildtarget>package</buildtarget> 从 ports
构建一个定制的 package然后复制到其他的服务器。</para>
</sect2>
</sect1>
<sect1 xml:id="startup">
<title>系统启动:运行级别在哪里?</title>
<para>&linux; 使用 Sysv init 初始化系统,而 &os;
使用的是传统的 BSD 风格的 &man.init.8;。在 BSD 风格的
&man.init.8; 中没有运行级别和 <filename>/etc/inittab</filename>
代替控制启动的是 &man.rc.8; 实用程序。
<filename>/etc/rc</filename> 脚本读取
<filename>/etc/defaults/rc.conf</filename>
<filename>/etc/rc.conf</filename> 文件来决定哪个服务将被启动。
特殊服务在此后由处于 <filename>/etc/rc.d/</filename>
<filename>/usr/local/etc/rc.d/</filename>
下的相应服务初始化脚本文件所启动。
这些脚本类似于位于 &linux; 系统中的
<filename>/etc/init.d/</filename> 目录下的脚本。</para>
<sidebar>
<para><emphasis>为何会有两个服务初始化脚本的目录呢?</emphasis>
<filename>/etc/rc.d/</filename> 下的脚本是属于
<quote>基本</quote> 系统一部分的应用程序所使用的。
&man.cron.8;&man.sshd.8;&man.syslog.3;,以及其他。)
<filename>/usr/local/etc/rc.d/</filename>
下的脚本是用户安装的应用程序如 <application>Apache</application>
<application>Squid</application> 等使用的。</para>
<para><emphasis><quote>基本</quote>
系统和用户安装的应用程序之间的区别是什么?</emphasis> FreeBSD
是一套开发出来的完整的操作系统,也就是说,内核,系统类库,
还有实用应用程序(如 &man.ls.1;&man.cat.1;&man.cp.1; 等)
全部被做为一个整体一起开发并释出。这就是被认为归属于
<quote>基本</quote>系统的程序。用户安装的程序并不是
<quote>基本</quote>系统的一部分,如
<application>Apache</application><application>X11</application>
<application>Moazilla&nbsp;Firefox</application>,等等。这
些用户安装的应用程序通常是使用 &os; 的 Packages 和 Ports
套件安装上去的。为了将这些程序和 <quote>基本</quote>
系统区分开来,用户安装的应用程序通常被安装到
<filename>/usr/local/</filename>下。
因此用户安装的二进制执行文件存在于
<filename>/usr/local/bin</filename>下,配置文件在
<filename>/usr/local/etc</filename>下,以此类推。</para>
</sidebar>
<para>您可以通过在
<filename>/etc/rc.conf</filename>&man.rc.conf.5;
文件中增加与之对应的
<literal>ServiceName_enable="YES"</literal>
配置来启用服务。 看一下系统默认的
<filename>/etc/defaults/rc.conf</filename> 文件, 这些默认配置可以使用
<filename>/etc/rc.conf</filename> 文件来改变。 因此,
当安装附加应用程序时最好回顾下文档来决定到底该如何启用任何相关的服务。</para>
<para>下面的一小段内容用来在 <filename>/etc/rc.conf</filename>
中启用 &man.sshd.8;<application>Apache 2.2</application>
还指定了 <application>Apache</application> 应该通过
SSL 方式启动。</para>
<programlisting># enable SSHD
sshd_enable="YES"
# enable Apache with SSL
apache22_enable="YES"
apache22_flags="-DSSL"</programlisting>
<para>一旦服务已经在 <filename>/etc/rc.conf</filename>
中启用,服务将能够从命令行启动(不需要重新启动系统):</para>
<screen>&prompt.root; <userinput>/etc/rc.d/sshd start</userinput></screen>
<para>如果服务还没有被启用,可以使用
<option>forcestart</option> 来从命令行启动:</para>
<screen>&prompt.root; <userinput>/etc/rc.d/sshd forcestart</userinput></screen>
</sect1>
<sect1 xml:id="network">
<title>网络配置</title>
<sect2 xml:id="interfaces">
<title>网络接口</title>
<para>代替 &linux; 中所使用的标识网络接口所常用的
<emphasis>ethX</emphasis> 格式的是,&os;
使用驱动名字后跟一个数字来标识。下面
&man.ifconfig.8; 的输出显示了两个 &intel;&nbsp;Pro&nbsp;1000
的网络接口(<filename>em0</filename><filename>em1</filename></para>
<screen>&prompt.user; <userinput>ifconfig</userinput>
em0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
options=b&lt;RXCSUM,TXCSUM,VLAN_MTU&gt;
inet 10.10.10.100 netmask 0xffffff00 broadcast 10.10.10.255
ether 00:50:56:a7:70:b2
media: Ethernet autoselect (1000baseTX &lt;full-duplex&gt;)
status: active
em1: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
options=b&lt;RXCSUM,TXCSUM,VLAN_MTU&gt;
inet 192.168.10.222 netmask 0xffffff00 broadcast 192.168.10.255
ether 00:50:56:a7:03:2b
media: Ethernet autoselect (1000baseTX &lt;full-duplex&gt;)
status: active</screen>
</sect2>
<sect2 xml:id="ipaddress">
<title>IP配置</title>
<para>一个 IP 地址可以使用 &man.ifconfig.8;
来指定到一个网络接口。通常,要保持重启后依然能够使用的
IP 配置信息需要包含在 <filename>/etc/rc.conf</filename>
中。下列例子指定了主机名IP 地址,以及默认网关:</para>
<programlisting>hostname="server1.example.com"
ifconfig_em0="inet 10.10.10.100 netmask 255.255.255.0"
defaultrouter="10.10.10.1"</programlisting>
<para>使用下面内容来为网络接口配置DHCP</para>
<programlisting>hostname="server1.example.com"
ifconfig_em0="DHCP"</programlisting>
</sect2>
</sect1>
<sect1 xml:id="firewall">
<title>防火墙</title>
<para>&linux; 中的 <application>IPTABLES</application>
一样, &os; 也提供了一个内核级的防火墙;
实际上 &os; 提供了三个防火墙:</para>
<itemizedlist>
<listitem><simpara><link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html">IPFIREWALL</link></simpara></listitem>
<listitem><simpara><link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/firewalls-ipf.html">IPFILTER</link></simpara></listitem>
<listitem><simpara><link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/firewalls-pf.html">PF</link></simpara></listitem>
</itemizedlist>
<para><application>IPFIREWALL</application> 或是
<application>IPFW</application>(管理
<application>IPFW</application> 规则的 &man.ipfw.8; 命令)
&os; 开发者开发并维持的。
<application>IPFW</application> 能够与 &man.dummynet.4;
配合使用来提供流量图形功能以及模拟不同网络连接类型的功能。</para>
<para>允许 <application>SSH</application>
进入的 <application>IPFW</application> 规则样例如下:</para>
<programlisting>ipfw add allow tcp from any to me 22 in via $ext_if</programlisting>
<para><application>IPFILTER</application>
Darren&nbsp;Reed 所开发的防火墙程序。不是专门针对
&os; 的,它已经被移植到 NetBSDOpenBSDSunOSHP/UX
还有Solaris等一些操作系统之上。</para>
<para>允许 <application>SSH</application>
进入的 <application>IPFILTER</application>
命令样例如下:</para>
<programlisting>pass in on $ext_if proto tcp from any to any port = 22</programlisting>
<para>最后一种防火墙程序,<application>PF</application>
是 OpenBSD 项目所开发的。<application>PF</application>
是被作为 <application>IPFILTER</application>
的一个替代品而被创建出的。就这点而言,
<application>PF</application> 的语法与
<application>IPFILTER</application> 的非常相似。
<application>PF</application> 可以与 &man.altq.4;
配合来提供 QoS 的特性。</para>
<para>允许 <application>SSH</application>
进入的 <application>PF</application>
命令样例如下:</para>
<programlisting>pass in on $ext_if inet proto tcp from any to ($ext_if) port 22</programlisting>
</sect1>
<sect1 xml:id="updates">
<title>升级 &os;</title>
<para>共有三种方法来升级 &os; 系统:
源码,二进制更新,还有安装光盘。</para>
<para>从源码升级是最复杂的升级方法,但是提供了最棒的总体灵活性。
这个过程包含了使用 &os; <application>CVS</application>
(并行版本系统)来同步一个本地的 &os; 源代码。
一旦本地源码已经更新到当前最新你便可以构建新版本的内核以及应用程序。
关于源码更新的更多信息可见于 &os; 手册
<link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/cutting-edge.html">
关于如何更新操作系统的章节</link></para>
<para>二进制更新类似于使用 <command>yum</command>
<command>apt-get</command> 更新 &linux; 系统。
&man.freebsd-update.8; 命令会获取新的更新并安装它们。
这些更新可以通过 &man.cron.8; 使用程序来调度。</para>
<note>
<para>如果你使用 &man.cron.8; 来预定更新,
请确信在你的 &man.crontab.1; 中使用了
<command>freebsd-update cron</command>
来控制大数目的机器同时获取更新。</para>
<programlisting>0 3 * * * root /usr/sbin/freebsd-update cron</programlisting>
</note>
<para>最后一种更新的方法,从安装光盘来升级,是个直接的过程。
从安装光盘启动并选择该选项来更新。</para>
</sect1>
<sect1 xml:id="procfs">
<title>procfs已是过去式但仍未被遗忘</title>
<para>&linux; 中,你可能会通过看一看
<filename>/proc/sys/net/ipv4/ip_forward</filename>
来确定 IP 转发是否被启用。在 &os; 中你应该使用 &man.sysctl.8;
来查看这和其他方面的系统设置,在当前的 &os; 版本中
&man.procfs.5; 已经不赞成使用了。(虽然
<command>sysctl</command>&os; 也同样可用。)</para>
<para>在 IP 转发样例中,你应该使用下列内容来确定 &os;
系统中是否已经开启了 IP 转发:</para>
<screen>&prompt.user; <userinput>sysctl net.inet.ip.forwarding</userinput>
net.inet.ip.forwarding: 0</screen>
<para><option>-a</option> 标志用来列出所有的系统设置:</para>
<screen>&prompt.user; <userinput>sysctl -a</userinput>
kern.ostype: FreeBSD
kern.osrelease: 6.2-RELEASE-p9
kern.osrevision: 199506
kern.version: FreeBSD 6.2-RELEASE-p9 #0: Thu Nov 29 04:07:33 UTC 2007
root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
kern.maxvnodes: 17517
kern.maxproc: 1988
kern.maxfiles: 3976
kern.argmax: 262144
kern.securelevel: -1
kern.hostname: server1
kern.hostid: 0
kern.clockrate: { hz = 1000, tick = 1000, profhz = 666, stathz = 133 }
kern.posix1version: 200112
...</screen>
<note>
<para>某些 <command>sysctl</command> 的参数是只读的。</para>
</note>
<para>需要 procfs 的情况是,运行一些较老的软件,使用
&man.truss.1; 来跟踪系统信号,以及
<link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/linuxemu.html">&linux; 二进制兼容</link>.
(尽管,&linux; 二进制兼容性使用其本身的 procfs&man.linprocfs.5;。)
如果你需要挂载 procfs 你可以在
<filename>/etc/fstab</filename> 中加入如下内容:</para>
<screen>proc /proc procfs rw,noauto 0 0</screen>
<note>
<para><option>noauto</option> 会防止
<filename>/proc</filename> 在启动时被自动挂载。</para>
</note>
<para>然后使用如下命令挂载 procfs</para>
<screen>&prompt.root; <userinput>mount /proc</userinput></screen>
</sect1>
<sect1 xml:id="commands">
<title>常用命令</title>
<sect2 xml:id="packageCommands">
<title>软件包管理</title>
<para>
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
<thead>
<row>
<entry>&linux; 命令 (Red&nbsp;Hat/Debian)</entry>
<entry>&os; 等价命令</entry>
<entry>目的</entry>
</row>
</thead>
<tbody>
<row>
<entry><command>yum install package</command> / <command>apt-get install package</command></entry>
<entry><command>pkg_add -r package</command></entry>
<entry>从远程仓库安装 <replaceable>package</replaceable></entry>
</row>
<row>
<entry><command>rpm -ivh package</command> / <command>dpkg -i package</command></entry>
<entry><command>pkg_add -v package</command></entry>
<entry>安装 package</entry>
</row>
<row>
<entry><command>rpm -qa</command> / <command>dpkg -l</command></entry>
<entry><command>pkg_info</command></entry>
<entry>列出已安装的软件包</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect2>
<sect2 xml:id="systemCommands">
<title>系统管理</title>
<para>
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
<thead>
<row>
<entry>&linux; 命令</entry>
<entry>&os; 等价命令</entry>
<entry>目的</entry>
</row>
</thead>
<tbody>
<row>
<entry><command>lspci</command></entry>
<entry><command>pciconf</command></entry>
<entry>列出 PCI 设备</entry>
</row>
<row>
<entry><command>lsmod</command></entry>
<entry><command>kldstat</command></entry>
<entry>列出已载入的内核模块</entry>
</row>
<row>
<entry><command>modprobe</command></entry>
<entry><command>kldload</command> / <command>kldunload</command></entry>
<entry>载入/卸载内核模块</entry>
</row>
<row>
<entry><command>strace</command></entry>
<entry><command>truss</command></entry>
<entry>跟踪系统调用</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect2>
</sect1>
<sect1 xml:id="conclusion">
<title>总结</title>
<para>非常希望这篇文档能够给予你足够的帮助来开始你的
&os; 之路。务必要再去看一下 <link xlink:href="&url.base;/doc/en_US.ISO8859-1/books/handbook/index.html">&os;&nbsp;手册</link>
所提到的但并没有被包含在本文档中的那些更深入广泛的主题。</para>
</sect1>
</article>

View file

@ -0,0 +1,28 @@
#
# The FreeBSD Simplified Chinese Project
#
# Original Revision: 1.2
# $FreeBSD$
#
# Article: Introduction to NanoBSD
DOC?= article
FORMATS?= html
WITH_ARTICLE_TOC?= YES
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
# Images from the cross-document image library
IMAGES_LIB= callouts/1.png
IMAGES_LIB+= callouts/2.png
IMAGES_LIB+= callouts/3.png
IMAGES_LIB+= callouts/4.png
SRCS= article.xml
URL_RELPREFIX?= ../../../..
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,468 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
<!--
The FreeBSD Documentation Project
The FreeBSD Chinese (Simplified) Documentation Project
Original Revision: 1.7
-->
<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="zh_cn">
<info><title>NanoBSD 简介</title>
<authorgroup>
<author><personname><firstname>Daniel</firstname><surname>Gerzo</surname></personname></author>
</authorgroup>
<copyright>
<year>2006</year>
<holder>The FreeBSD Documentation Project</holder>
</copyright>
<pubdate>$FreeBSD$</pubdate>
<releaseinfo>$FreeBSD$</releaseinfo>
<legalnotice xml:id="trademarks" role="trademarks">
&tm-attrib.freebsd;
&tm-attrib.general;
</legalnotice>
<abstract>
<para>这篇文档提供了关于 <application>NanoBSD</application> 工具的介绍信息,
这一工具可以用来创建用于嵌入式应用的 &os; 系统映像,
以适应存放到袖珍闪存 (Compact Flash) 卡 (或其它大容量存储介质) 上的需要。</para>
</abstract>
</info>
<sect1 xml:id="intro">
<title>NanoBSD 简介</title>
<indexterm><primary>NanoBSD</primary></indexterm>
<para><application>NanoBSD</application>&a.phk; 目前正在开发的一项工具。
它可以用来创建用于嵌入式应用的 &os; 系统映像,
以便配合袖珍闪存 (Compact Flash) 卡 (或其他大容量存储介质) 使用。</para>
<para>这一工具也可以用来构建定制的安装映像,
以简化通常称为 <quote>计算设备 (computer appliances)</quote>
的系统的安装和维护工作。 计算设备通常在产品中将捆绑硬件和软件,
或者换言之, 所有的应用程序都是预先装好的。
这些设备可以直接插到暨存的网络中,
并 (几乎是) 立即投入使用。</para>
<para><application>NanoBSD</application> 提供的功能包括:</para>
<itemizedlist>
<listitem>
<para>可以和 &os; 一样使用 Ports 和预编译包&mdash;
所有的应用程序都可以在 <application>NanoBSD</application> 映像中直接使用,
而方式与 &os; 完全一样。</para>
</listitem>
<listitem>
<para>不减少功能 &mdash; 能够使用 &os; 做的任何工作, 都可以在
<application>NanoBSD</application> 中使用,
除非您在创建 <application>NanoBSD</application> 映像时,
明确地删去它们。</para>
</listitem>
<listitem>
<para>所有对象在运行时均是只读的 &mdash; 可以安全地拔掉电源插销。
在系统非正常关闭之后, 无需运行
&man.fsck.8;</para>
</listitem>
<listitem>
<para>便于联编和定制 &mdash; 只需使用一个 shell 脚本和一个配置文件,
您可以很容易地裁减和定制适于任意需求的映像。</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="howto">
<title>如何使用 NanoBSD</title>
<sect2 xml:id="design">
<title>NanoBSD 的设计</title>
<para>一旦将映像存入介质, 就可以用它来引导 <application>NanoBSD</application>
了。 默认情况下, 大容量存储器会划分为三个区:</para>
<itemizedlist>
<listitem>
<para>两个映像区: <literal>code#1</literal>
<literal>code#2</literal></para>
</listitem>
<listitem>
<para>一个配置文件区, 运行环境中,
可以将其挂接到 <filename>/cfg</filename> 目录下。</para>
</listitem>
</itemizedlist>
<para>这些分区默认情况下以只读方式挂接。</para>
<para><filename>/etc</filename>
<filename>/var</filename> 目录均为
&man.md.4; (malloc) 盘。</para>
<para>配置文件分区保存在
<filename>/cfg</filename> 目录。
它包含了用于 <filename>/etc</filename>
目录的文件, 在启动之后暂时以只读方式挂接。 因此,
在需要从 <filename>/etc</filename>
<filename>/cfg</filename> 目录复制所进行的、
希望在重启时保持不变的配置时, 需要进行一些额外的操作。</para>
<example>
<title><filename>/etc/resolv.conf</filename> 中进行需要保持的修改</title>
<screen>&prompt.root; <userinput>vi /etc/resolv.conf</userinput>
[...]
&prompt.root; <userinput>mount /cfg</userinput>
&prompt.root; <userinput>cp /etc/resolv.conf /cfg</userinput>
&prompt.root; <userinput>umount /cfg</userinput></screen>
</example>
<note>
<para>只有在系统启动过程中, 以及需要修改配置文件的场合, 才需要挂接包含
<filename>/cfg</filename> 的那个分区。</para>
<para>在任何时候都保持挂接 <filename>/cfg</filename>
不是一个好主意, 特别是当您把 <application>NanoBSD</application>
放在不适合进行大量写操作的分区时
(由于文件系统的同步进程会定期向系统盘写一些数据)。</para>
</note>
</sect2>
<sect2>
<title>构建 NanoBSD 映像</title>
<para><application>NanoBSD</application> 映像是通过使用非常简单的
<filename>nanobsd.sh</filename> shell 脚本来构建的, 这个脚本可以在
<filename>/usr/src/tools/tools/nanobsd</filename>
目录中找到。 这个脚本建立的映像文件, 可以用 &man.dd.1; 工具复制到存储介质上。</para>
<para>构建
<application>NanoBSD</application> 映像所需的命令是:</para>
<screen>&prompt.root; <userinput>cd /usr/src/tools/tools/nanobsd</userinput> <co xml:id="nbsd-cd"/>
&prompt.root; <userinput>sh nanobsd.sh</userinput> <co xml:id="nbsd-sh"/>
&prompt.root; <userinput>cd /usr/obj/nanobsd.full</userinput> <co xml:id="nbsd-cd2"/>
&prompt.root; <userinput>dd if=_.disk.full of=/dev/da0 bs=64k</userinput> <co xml:id="nbsd-dd"/></screen>
<calloutlist>
<callout arearefs="nbsd-cd">
<para>进入 <application>NanoBSD</application> 构建脚本的主目录。</para>
</callout>
<callout arearefs="nbsd-sh">
<para>开始构建过程。</para>
</callout>
<callout arearefs="nbsd-cd2">
<para>进入构建好的映像文件所在的目录。</para>
</callout>
<callout arearefs="nbsd-dd">
<para>在存储介质上安装 <application>NanoBSD</application></para>
</callout>
</calloutlist>
</sect2>
<sect2>
<title>定制 NanoBSD 映像</title>
<para>这可能是 <application>NanoBSD</application> 最为重要,
同时也是您最感兴趣的功能。 同时, 您在开发
<application>NanoBSD</application> 应用时,
这也是相当耗时的过程。</para>
<para>执行下面的命令将使
<filename>nanobsd.sh</filename> 从当前目录中的
<filename>myconf.nano</filename> 文件读取配置:</para>
<screen>&prompt.root; <userinput>sh nanobsd.sh -c myconf.nano</userinput></screen>
<para>定制过程包含两步:</para>
<itemizedlist>
<listitem>
<para>配置选项</para>
</listitem>
<listitem>
<para>定制函数</para>
</listitem>
</itemizedlist>
<sect3>
<title>配置选项</title>
<para>通过对配置进行设置, 可以配置用以传递给
<application>NanoBSD</application> 构建过程中
<buildtarget>buildworld</buildtarget>
<buildtarget>installworld</buildtarget> 阶段的联编和安装选项, 以及
<application>NanoBSD</application> 的主构建过程中的选项。
通过使用这些选项可以削减系统的尺寸, 使之能够放入
64MB 的存储。 您还可以进一步通过这些选项来削减 &os;
直到它只包含内核以及两三个用户环境文件为止。</para>
<para>配置文件中包含用以代替默认值的配置选项。
最重要的语句包括:</para>
<itemizedlist>
<listitem>
<para><literal>NANO_NAME</literal> &mdash; 本次构建的名称
(用于创建工作目录的名字)。</para>
</listitem>
<listitem>
<para><literal>NANO_SRC</literal> &mdash; 用以联编和构建映像的源码树的位置。</para>
</listitem>
<listitem>
<para><literal>NANO_KERNEL</literal> &mdash; 用以联编内核的配置文件的名字。</para>
</listitem>
<listitem>
<para><literal>CONF_BUILD</literal> &mdash; 用于传递给
<buildtarget>buildworld</buildtarget> 构建阶段的选项。</para>
</listitem>
<listitem>
<para><literal>CONF_INSTALL</literal> &mdash; 用于传递给
<buildtarget>installworld</buildtarget> 构建阶段的选项。</para>
</listitem>
<listitem>
<para><literal>CONF_WORLD</literal> &mdash; 用以传递给
<buildtarget>buildworld</buildtarget>
<buildtarget>installworld</buildtarget> 这两个构建阶段的选项。</para>
</listitem>
<listitem>
<para><literal>FlashDevice</literal> &mdash; 定义所用的介质类型。
要了解进一步的细节, 请参考 <filename>FlashDevice.sub</filename>
文件。</para>
</listitem>
</itemizedlist>
</sect3>
<sect3>
<title>定制函数</title>
<para>通过在配置文件中使用 shell 函数可以进一步微调
<application>NanoBSD</application>。 下面的例子展示了定制函数的基本模式:</para>
<programlisting>cust_foo () (
echo "bar=baz" &gt; \
&dollar;{NANO_WORLDDIR}/etc/foo
)
customize_cmd cust_foo</programlisting>
<para>下面是一个更贴近实际的例子, 它将默认的
<filename>/etc</filename> 目录尺寸,
从 5MB 调整为 30MB</para>
<programlisting>cust_etc_size () (
cd &dollar;{NANO_WORLDDIR}/conf
echo 30000 &gt; default/etc/md_size
)
customize_cmd cust_etc_size</programlisting>
<para>除此之外, 还有几个默认的预定义定制函数:</para>
<itemizedlist>
<listitem>
<para><literal>cust_comconsole</literal> &mdash; 在 VGA 设备上禁止
&man.getty.8;
(<filename>/dev/ttyv*</filename> 设备节点) 并启用串口 COM1
作为系统控制台。</para>
</listitem>
<listitem>
<para><literal>cust_allow_ssh_root</literal> &mdash; 允许
<systemitem class="username">root</systemitem> 通过 &man.sshd.8; 登录。</para>
</listitem>
<listitem>
<para><literal>cust_install_files</literal> &mdash;
<filename>nanobsd/Files</filename>
目录中安装文件, 这包含一些实用的系统管理脚本。</para>
</listitem>
</itemizedlist>
</sect3>
<sect3>
<title>安装预编译软件包</title>
<para>通过增加自定义的函数, 可以在 <application>NanoBSD</application>
增加预编译的软件包。 下面的函数会添加位于
<filename>/usr/src/tools/tools/nanobsd/packages</filename>
的全部预编译软件包:</para>
<programlisting>install_packages () (
mkdir -p ${NANO_WORLDDIR}/packages
cp /usr/src/tools/tools/nanobsd/packages/* ${NANO_WORLDDIR}/packages
chroot ${NANO_WORLDDIR} sh -c 'cd packages; pkg_add -v *;cd ..;'
rm -rf ${NANO_WORLDDIR}/packages
)
customize_cmd install_packages</programlisting>
</sect3>
<sect3>
<title>配置文件举例</title>
<para>下面是一个用于构建定制的 <application>NanoBSD</application> 映像的完整例子:</para>
<programlisting>NANO_NAME=custom
NANO_SRC=/usr/src
NANO_KERNEL=MYKERNEL
NANO_IMAGES=2
CONF_BUILD='
NO_KLDLOAD=YES
NO_NETGRAPH=YES
NO_PAM=YES
'
CONF_INSTALL='
NO_ACPI=YES
NO_BLUETOOTH=YES
NO_CVS=YES
NO_FORTRAN=YES
NO_HTML=YES
NO_LPR=YES
NO_MAN=YES
NO_SENDMAIL=YES
NO_SHAREDOCS=YES
NO_EXAMPLES=YES
NO_INSTALLLIB=YES
NO_CALENDAR=YES
NO_MISC=YES
NO_SHARE=YES
'
CONF_WORLD='
NO_BIND=YES
NO_MODULES=YES
NO_KERBEROS=YES
NO_GAMES=YES
NO_RESCUE=YES
NO_LOCALES=YES
NO_SYSCONS=YES
NO_INFO=YES
'
FlashDevice SanDisk 1G
cust_nobeastie() (
touch &dollar;{NANO_WORLDDIR}/boot/loader.conf
echo "beastie_disable=\"YES\"" &gt;&gt; &dollar;{NANO_WORLDDIR}/boot/loader.conf
)
customize_cmd cust_comconsole
customize_cmd cust_install_files
customize_cmd cust_allow_ssh_root
customize_cmd cust_nobeastie</programlisting>
</sect3>
</sect2>
<sect2>
<title>更新 NanoBSD</title>
<para>更新 <application>NanoBSD</application> 相对而言较为简单:</para>
<procedure>
<step>
<para>和之前一样构建新的 <application>NanoBSD</application> 映像文件。</para>
</step>
<step>
<para>将新的映像放入正运行的
<application>NanoBSD</application> 设备中的一个未用的分区。</para>
<para>与之前最初安装 <application>NanoBSD</application> 的步骤相比,
这一步骤最重要的区别在于这次不应使用 <filename>_.disk.full</filename> 文件
(它包含整个盘的映像)
而应安装 <filename>_.disk.image</filename> 映像 (这个文件中,
只包含一个系统分区)。</para>
</step>
<step>
<para>重新启动, 并从新安装的分区中启动系统。</para>
</step>
<step>
<para>如果一切顺利的话, 升级工作就完成了。</para>
</step>
<step>
<para>如果发生了任何问题, 则可以从先前的分区启动
(其中包含了旧的、 可用的映像) 来尽可能快地恢复系统功能。
接下来可以修正新联编的版本中存在的问题, 并重复前述步骤。</para>
</step>
</procedure>
<para>要在正在运行的
<application>NanoBSD</application> 系统中安装新的映像, 可以使用位于
<filename>/root</filename> 目录的
<filename>updatep1</filename>
<filename>updatep2</filename> 脚本,
具体使用哪一个脚本, 取决于正在运行的系统位于那个分区。</para>
<para>随时提供新 <application>NanoBSD</application> 映像所提供的服务,
以及采用的传输方法的不同, 您可以参考并使用下列三种方式之一:</para>
<sect3>
<title>使用 &man.ftp.1;</title>
<para>如果传输速度是第一要务,
采用下面的例子:</para>
<screen>&prompt.root; <userinput>ftp myhost
get _.disk.image "| sh updatep1"</userinput></screen>
</sect3>
<sect3>
<title>使用 &man.ssh.1;</title>
<para>如果更倾向于安全传输, 应参考下面的例子:</para>
<screen>&prompt.root; <userinput>ssh myhost cat _.disk.image.gz | zcat | sh updatep1</userinput></screen>
</sect3>
<sect3>
<title>使用 &man.nc.1;</title>
<para>如果远程主机既不提供
&man.ftp.1; 服务, 也不提供 &man.sshd.8; 服务:</para>
<procedure>
<step>
<para>开始时, 在提供映像的主机上开启 TCP 监听,
并令其将映像文件发给客户机:</para>
<screen>myhost&prompt.root; <userinput>nc -l 2222 &lt; _.disk.image</userinput></screen>
<note>
<para>请确认您所使用的端口没有通过防火墙阻止来自
<application>NanoBSD</application> 客户机的联接请求。</para>
</note>
</step>
<step>
<para>连接到提供新映像服务的主机, 并执行
<filename>updatep1</filename> 脚本:</para>
<screen>&prompt.root; <userinput>nc myhost 2222 | sh updatep1</userinput></screen>
</step>
</procedure>
</sect3>
</sect2>
</sect1>
<index/>
</article>

View file

@ -0,0 +1,33 @@
#
# $FreeBSD$
# Original Revision: 1.2
# Article: Practical rc.d scripting in BSD
DOC?= article
FORMATS?= html
WITH_ARTICLE_TOC?= YES
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
SRCS= article.xml
IMAGES_LIB+= callouts/1.png
IMAGES_LIB+= callouts/2.png
IMAGES_LIB+= callouts/3.png
IMAGES_LIB+= callouts/4.png
IMAGES_LIB+= callouts/5.png
IMAGES_LIB+= callouts/6.png
IMAGES_LIB+= callouts/7.png
IMAGES_LIB+= callouts/8.png
IMAGES_LIB+= callouts/9.png
IMAGES_LIB+= callouts/10.png
IMAGES_LIB+= callouts/11.png
IMAGES_LIB+= callouts/12.png
IMAGES_LIB+= callouts/13.png
IMAGES_LIB+= callouts/14.png
URL_RELPREFIX?= ../../../..
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,28 @@
#
# $FreeBSD$
# Original Revision: 1.1
#
DOC?= article
FORMATS?= html
WITH_ARTICLE_TOC?= YES
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
SRCS= article.xml
# Images from the cross-document image library
IMAGES_LIB= callouts/1.png
IMAGES_LIB+= callouts/2.png
IMAGES_LIB+= callouts/3.png
IMAGES_LIB+= callouts/4.png
IMAGES_LIB+= callouts/5.png
IMAGES_LIB+= callouts/6.png
IMAGES_LIB+= callouts/7.png
URL_RELPREFIX?= ../../../..
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,512 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
<!--
The FreeBSD Documentation Project
The FreeBSD Chinese (Simplified) Documentation Project
Original Revision: 1.6
-->
<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="zh_cn">
<info><title>&os; 操作系统在无远程控制台下的远程安装</title>
<author><personname><firstname>Daniel</firstname><surname>Gerzo</surname></personname><affiliation>
<address><email>danger@FreeBSD.org</email></address>
</affiliation></author>
<legalnotice xml:id="trademarks" role="trademarks">
&tm-attrib.freebsd;
&tm-attrib.general;
</legalnotice>
<copyright>
<year>2008</year>
<holder>The &os; Documentation Project</holder>
</copyright>
<pubdate>$FreeBSD$</pubdate>
<releaseinfo>$FreeBSD$</releaseinfo>
<abstract>
<para>本文归档了当远程控制台不可用的情况下 &os; 操作系统的远程安装。
文章背后的主要灵感归功于和 &a.mm; 还有由 &a.pjd;
提供的宝贵输入合作的结果。</para>
</abstract>
</info>
<sect1 xml:id="background">
<title>背景</title>
<para>世界上有很多的服务器主机供应商,
但是他们中只有很少的一部分正式支持 &os;
他们通常为他们提供的服务器上安装 &linux;
发行版提供支持。</para>
<para>在某些情况下,如果你请求这些公司他们会安装一个你首选的 &linux;
发行版。有了这个选择,我们将试图安装 &os;
在其他情况下,他们可能提供一个急救系统用于紧急情况。
使用这个可能将有利于我们的目的更好的实现。</para>
<para>本文涵盖了引导一个包含 RAID-1 及 <application>ZFS</application>
性能的 &os; 系统的远程安装的基本安装配置所必须的步骤。</para>
</sect1>
<sect1 xml:id="intro">
<title>简介</title>
<para>这一节会摘要本文的目的以及更好阐述这里所概括的东西。
本文中的这些指令将有益于那些使用不支持 &os;
的托管设施提供的服务的人。</para>
<procedure>
<step>
<para>如我们提到过的 <link linkend="background">背景</link>
的那一节,许多的有声望的服务器主机托管公司提供了各种的急救系统。
可以从他们自己的 <acronym>局域网</acronym> 启动并可以通过
<application>SSH</application> 访问。
他们通常提供这种支持目的用于帮助他们的顾客修正损坏的操作系统。
如文章将说明的,我们将能够通过这些急救系统的帮助来安装 &os;</para>
<!-- XXXTR: Solaris has a restore command, something like
sysrestore, FreeBSD Should have one too. -->
</step>
<step>
<para>文章的下一小节会描述如何配置,并在本地机器上构建最小限度的
&os;。该版本最终会从随机存储盘运行到远程机器上面去。
这将允许我们使用 <application>sysinstall</application>
实用程序从一个 <acronym>FTP</acronym>
镜像安装一套完整的 &os; 操作系统。</para>
</step>
<step>
<para>文章的剩余内容除了描述 <application>ZFS</application>
文件系统的配置还将描述系统本身的安装步骤。</para>
</step>
</procedure>
<sect2 xml:id="requirements">
<title>需求</title>
<para>想要成功地做下去,你必须:</para>
<itemizedlist>
<listitem>
<para>拥有一个可通过 <application>SSH</application>
网络访问的操作系统。</para>
</listitem>
<listitem>
<para>理解 &os; 的安装过程</para>
</listitem>
<listitem>
<para>熟悉 &man.sysinstall.8; 实用程序</para>
</listitem>
<listitem>
<para>拥有 &os; 安张的 <acronym>ISO</acronym>
镜像文件或者易于使用的 <acronym>CD</acronym></para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
<sect1 xml:id="preparation">
<title>准备工作 - <application>mfsBSD</application></title>
<para>&os; 可能安装到目标系统上之前,
需要先构建一个最小化的从磁盘启动的 &os; 操作系统映像文件。
此方法中新系统必须能够从网络访问,
并且安装的其他过程能够在没有远程访问到系统控制台的情况下完成。</para>
<para><application>mfsBSD</application> 设置工具能够被用来构建一个微小的
&os; 映像。如 <application>mfsBSD</application> 名字的含义
(<quote>mfs</quote> 的意思是 <quote>memory file system</quote> 内存文件系统)
最后的映像全部从随机存储器运行。多亏了这个特性,
磁盘的操作将不会有任何限制,因此它能够被用来安装一个完整的 &os; 操作系统。
<application>mfsBSD</application> 的主页在
<uri xlink:href="http://people.freebsd.org/~mm/mfsbsd/">http://people.freebsd.org/~mm/mfsbsd/</uri>
包含了指向最新释出的设置工具。</para>
<para>请注意关于 <application>mfsBSD</application>
内幕以及它所有的适用都超出了本文的内容,
感兴趣的读者应该去查阅 <application>mfs</application>
的原始文档得到更多详细内容。</para>
<para>下载并解压出最新的 <application>mfsBSD</application>
版本,并改变自己的当前工作目录到存在 <application>mfsBSD</application>
脚本文件的目录:</para>
<screen>&prompt.root; <userinput>fetch http://people.freebsd.org/~mm/mfsbsd/mfsbsd-latest.tar.gz</userinput>
&prompt.root; <userinput>tar xvzf mfsbsd-1.0-beta1.tar.gz</userinput>
&prompt.root; <userinput>cd mfsbsd-1.0-beta1/</userinput></screen>
<sect2 xml:id="mfsbsd-config">
<title><application>mfsBSD</application> 的配置</title>
<para>引导 <application>mfsBSD</application> 之前,
必须设置一些重要的配置选项。
最重要的是我们必须有正确地,自然地,网络配置。
最适合的方法配置网络选项取决于我们是否事先知道我们会用到的网络接口,
而且网络接口驱动程序应被系统为我们的硬件载入。
我们将看到 <application>mfsBSD</application>
如何能够在任一种情况下被配置。</para>
<para>另外一件重要的事情是设置 <systemitem class="username">root</systemitem> 的密码。
这将通过编辑 <filename>conf/rootpw.conf</filename> 文件来完成。
请记住该文件将把你的密码保存在简单的文本中,
所以在此我们不推荐你使用真实的密码。然而,
这只是一个临时使用一次的密码,你可以在随后安装好的系统中更改它。</para>
<sect3>
<title>编辑 <filename>conf/interfaces.conf</filename> 的方法</title>
<para>如果我们安装好的网卡是未知类型的,
我们可以使用 <application>mfsBSD</application> 的自动探测功能。
<application>mfsBSD</application> 启动脚本能够探测到正确的驱动来使用,
基于网络接口的 MAC 地址,我们假设在
<filename>conf/interfaces.conf</filename> 文件中设置如下选项:</para>
<programlisting>initconf_interfaces="ext1"
initconf_mac_ext1="00:00:00:00:00:00"
initconf_ip_ext1="192.168.0.2"
initconf_netmask_ext1="255.255.255.0"</programlisting>
<para>别忘了添加 <literal>defaultrouter</literal>
信息到 <filename>conf/rc.conf</filename> 文件中:</para>
<programlisting>defaultrouter="192.168.0.1"</programlisting>
</sect3>
<sect3>
<title>编辑 <filename>conf/rc.conf</filename> 的方法</title>
<para>当网络接口的驱动是已知类型的,使用
<filename>conf/rc.conf</filename> 文件添加联网选项会更加方便。
该文件的语法跟 &os; 中标准的 &man.rc.conf.5; 文件的语法相同。</para>
<para>例如,当你知道被使用的将是一个 &man.re.4; 网络接口设备,
你可以在 <filename>conf/rc.conf</filename> 文件中设置如下选项:</para>
<programlisting>defaultrouter="192.168.0.1"
ifconfig_re0="inet 192.168.0.2 netmask 255.255.255.0"</programlisting>
</sect3>
</sect2>
<sect2 xml:id="mfsbsd-build">
<title>构建一个 <application>mfsBSD</application> 映像</title>
<para>构建一个 <application>mfsBSD</application>
映像文件的过程是非常简单明了的。</para>
<para>第一步是挂载 &os; 的安装 <acronym>CD</acronym>
或者挂载安装 <acronym>ISO</acronym> 文件到
<filename>/cdrom</filename>
因为例子的缘故,在文章中我们将假定你下载的是 &os; 7.0-RELEASE
<acronym>ISO</acronym> 文件。使用 &man.mdconfig.8;
实用程序挂载 <acronym>ISO</acronym> 映像文件到
<filename>/cdrom</filename> 目录非常简单:</para>
<screen>&prompt.root; <userinput>mdconfig -a -t vnode -u 10 -f 7.0-RELEASE-amd64-disc1.iso</userinput>
&prompt.root; <userinput>mount_cd9660 /dev/md10 /cdrom</userinput></screen>
<para>紧接着,构建可启动的 <application>mfsBSD</application>
映像:</para>
<screen>&prompt.root; <userinput>make BASE=/cdrom/7.0-RELEASE</userinput></screen>
<note>
<para>上面的 <command>make</command> 命令必须在
<application>mfsBSD</application> 目录树的最高一层运行,也就是:
<filename>~/mfsbsd-1.0-beta1/</filename></para>
</note>
</sect2>
<sect2>
<title>启动 <application>mfsBSD </application></title>
<para>现在 <application>mfsBSD</application> 映像已经准备好了,
必须把它上传到远程的一个正在运行的急救系统上或者一个预安装了
&linux; 发行版的系统上。最适合做这个工作的工具是
<application>scp</application></para>
<screen>&prompt.root; <userinput>scp disk.img root@192.168.0.2:.</userinput></screen>
<para>想要正确的引导 <application>mfsBSD</application> 映像,
必须把它安放在机器的第一块(可启动)设备上。
这可能会和使用的例子我们假定的一样,第一块可启动磁盘设备是
<filename>sda</filename></para>
<screen>&prompt.root; <userinput>dd if=/root/disk.img of=/dev/sda bs=1m</userinput></screen>
<para>如果一切正常,该映像现在应该存在于第一块设备的
<acronym>MBR</acronym>(主引导区)而机器也应该能够被启动了。
使用工具 &man.ping.8; 来查看机器是否被正确启动。
一旦它回复在线状态,就应该能够使用 <systemitem class="username">root</systemitem>
用户和配置好的密码通过 &man.ssh.1; 来访问它了。</para>
</sect2>
</sect1>
<sect1 xml:id="installation">
<title>&os; 操作系统的安装</title>
<para><application>mfsBSD</application> 成功被引导后它就应该能够通过
&man.ssh.1; 登入了。这一节会描述如何创建 slices 并标记 slices 的 label
为 RAID-1 配置 <application>gmirror</application>
还有如何使用 <application>sysinstall</application>
来安装一个最小的FreeBSD操作系统版本。</para>
<sect2>
<title>准备磁盘</title>
<para>首要的任务是为 &os; 分配磁盘空间,也就是,
创建 slices 和 partitions。很显然
当前运行的系统是全部被载入到系统内存中的因此操作磁盘将没有任何问题。
要完成这个任务,可以是使用 <application>sysinstall</application>
或者 &man.fdisk.8; 中的二者任一并结合工具 &man.bsdlabel.8;</para>
<para>在开始时,将所有磁盘都标记成空的,
在每个磁盘上重复如下命令:</para>
<screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/ad0 count=2</userinput></screen>
<para>下面,使用你喜欢的工具创建 slices 并标记磁盘 label。
比较简单的方法是使用 <application>sysinstall</application>
强大也可能几乎没有漏洞方法是使用标准的基于文本的 &unix; 工具,
类似于 &man.fdisk.8;&man.bsdlabel.8;
这些工具的使用也会在这一节中包括。前者已经被包括在 &os; 手册的
<link xlink:href="&url.books.handbook;/install-steps.html">安装FreeBSD</link>
一章中了。如本节中刚提到的,这篇文章会展示如何设置一个带有 RAID-1
<application>ZFS</application> 性能的系统。我们的设置由一个小工具
&man.gmirror.8; 镜像为 <filename>/</filename> (root)
<filename>/usr</filename>
<filename>/var</filename> 文件系统,
并把剩余的磁盘空间被分配为 &man.zpool.8; 镜像出的
<application>ZFS</application> 文件系统。请注意,
<application>ZFS</application> 文件系统将在 &os;
操作系统成功安装并启动后才会被配置。</para>
<para>下面的例子会描述如何去创建 slices 和 labels
在每个 partition 上初始化 &man.gmirror.8;
并如何在每个被镜像过的 partition 上创建
<application>UFS2</application> 文件系统:</para>
<screen>&prompt.root; <userinput>fdisk -BI /dev/ad0</userinput> <co xml:id="fdisk"/>
&prompt.root; <userinput>fdisk -BI /dev/ad1</userinput>
&prompt.root; <userinput>bsdlabel -wB /dev/ad0s1</userinput> <co xml:id="bsdlabel-writing"/>
&prompt.root; <userinput>bsdlabel -wB /dev/ad1s1</userinput>
&prompt.root; <userinput>bsdlabel -e /dev/ad0s1</userinput> <co xml:id="bsdlabel-editing"/>
&prompt.root; <userinput>bsdlabel /dev/ad0s1 &gt; /tmp/bsdlabel.txt &amp;&amp; bsdlabel -R /dev/ad1s1 /tmp/bsdlabel.txt</userinput> <co xml:id="bsdlabel-restore"/>
&prompt.root; <userinput>gmirror label root /dev/ad[01]s1a</userinput> <co xml:id="gmirror1"/>
&prompt.root; <userinput>gmirror label var /dev/ad[01]s1d</userinput>
&prompt.root; <userinput>gmirror label usr /dev/ad[01]s1e</userinput>
&prompt.root; <userinput>gmirror label -F swap /dev/ad[01]s1b</userinput> <co xml:id="gmirror2"/>
&prompt.root; <userinput>newfs /dev/mirror/root</userinput> <co xml:id="newfs"/>
&prompt.root; <userinput>newfs /dev/mirror/var</userinput>
&prompt.root; <userinput>newfs /dev/mirror/usr</userinput></screen>
<calloutlist>
<callout arearefs="fdisk">
<para>在整个磁盘上创建一个 slice
并初始化包含在磁盘第一个扇区启动代码。
重复在系统上全部的磁盘上执行此命令。</para>
</callout>
<callout arearefs="bsdlabel-writing">
<para>为每块磁盘写入一个包括启动代码的内容的标准
label。</para>
</callout>
<callout arearefs="bsdlabel-editing">
<para>现在,手动去编辑磁盘的 label。可以查阅 &man.bsdlabel.8;
的联机手册来找到如何建立 partitions 的方法。创建如下
partions<literal>a</literal>
<filename>/</filename> (root) 文件系统,
<literal>b</literal> 为 swap 交换空间,
<literal>d</literal>
<filename>/usr</filename>
还有最后 <literal>f</literal> 被用于
<application>ZFS</application></para>
</callout>
<callout arearefs="bsdlabel-restore">
<para>引入你刚才创建的 label 到第二块磁盘,
所以两块磁盘会使用同样的 label。</para>
</callout>
<callout arearefs="gmirror1">
<para>在每个 partition 上初始化 &man.gmirror.8;</para>
</callout>
<callout arearefs="gmirror2">
<para>注意 <option>-F</option> 选项被用在 swap
交换分区的 partition。 &man.gmirror.8;
这个指令认为设备处于可靠的状态除非电源系统故障。</para>
</callout>
<callout arearefs="newfs">
<para>在每个被镜像的分区上创建一个
<application>UFS2</application> 的文件系统。</para>
</callout>
</calloutlist>
</sect2>
<sect2>
<title>系统安装</title>
<para>这是最重要的一部分。
此节将描述如何在我们上一小节已经准备好的磁盘上安装一个最小的
&os; 版本。要达成这个目的,所有的文件安系统需要被挂载乃至于
<application>sysinstall</application> 可以把 &os;
系统的内容写到磁盘上:</para>
<screen>&prompt.root; <userinput>mount /dev/mirror/root /mnt</userinput>
&prompt.root; <userinput>mkdir /mnt/var /mnt/usr</userinput>
&prompt.root; <userinput>mount /dev/mirror/var /mnt/var</userinput>
&prompt.root; <userinput>mount /dev/mirror/usr /mnt/usr</userinput></screen>
<para>当你做完这些时,打开 &man.sysinstall.8;
从主菜单选择自定义 <guimenuitem>Custom</guimenuitem> 安装。
选中 <guimenuitem>Options</guimenuitem> 选项然后按回车确认。
使用方向键获取帮助,移动鼠标指针到 <literal>Install Root</literal>
选项,按 <keycap>空格</keycap> 更改为
<filename>/mnt</filename>
<keycap>回车</keycap> 提交你的更改并使用
<keycap>q</keycap> 退出 <guimenuitem>Options</guimenuitem>
(选项)菜单。</para>
<warning>
<para>注意这一步骤非常重要,如果被跳过了,
<application>sysinstall</application>
将不能安装 &os;</para>
</warning>
<para><guimenuitem>Distributions</guimenuitem>(发行版)菜单选项,
使用方向键移动鼠标指针到 <option>Minimal</option>(最小化)选项,
并使用 <keycap>空格键</keycap> 选中该选项。
本文使用了最小版本来保存网络联通信息,因为系统本身会通过
<application>ftp</application> 来安装。使用
<option>Exit</option>(退出)选项退出这个菜单。</para>
<note>
<para><guimenuitem>Partition</guimenuitem>
<guimenuitem>Label</guimenuitem> 菜单将被跳过,
这些没有多少价值了。</para>
</note>
<para><guimenuitem>Media</guimenuitem>(媒介)菜单,
选择 <option>FTP</option> 选项。
选择一个距离你最近的镜像站点并交给
<application>sysinstall</application>
假定网络已经配置完好。你将再回到
<guimenuitem>Custom</guimenuitem>
(自定义)菜单。</para>
<para>最后,选择最后的选项来执行系统的安装过程,
<guimenuitem>Commit</guimenuitem>
当安装完成后退出 <application>sysinstall</application>
即可。</para>
</sect2>
<sect2>
<title>后期安装步骤</title>
<para>&os; 操作系统现在应该安装完毕了;通常情况下,
安装过程还没有结束。还需要进行一些安装后期的步骤使得容许
&os; 在将来启动并能够登入系统。</para>
<para>你现在必须 &man.chroot.8;
到刚安装的全新的系统中来完成安装。
使用如下命令: </para>
<screen>&prompt.root; <userinput>chroot /mnt</userinput></screen>
<para>要达到我们的目的,进行如下步骤:</para>
<itemizedlist>
<listitem>
<para>拷贝 <literal>GENERIC</literal>(通用)内核到
<filename>/boot/kernel</filename>
目录:</para>
<screen>&prompt.root; <userinput>cp -Rp /boot/GENERIC/* /boot/kernel</userinput></screen>
</listitem>
<listitem>
<para>创建 <filename>/etc/rc.conf</filename>
<filename>/etc/resolv.conf</filename> 还有
<filename>/etc/fstab</filename> 文件。
不要忘记正确地设置网络信息并在
<filename>/etc/rc.conf</filename>
文件中启用 <application>sshd</application>
<filename>/etc/fstab</filename>
文件内容类似于下面的内容:</para>
<programlisting># Device Mountpoint FStype Options Dump Pass#
/dev/mirror/swap none swap sw 0 0
/dev/mirror/root / ufs rw 1 1
/dev/mirror/usr /usr ufs rw 2 2
/dev/mirror/var /var ufs rw 2 2
/dev/cd0 /cdrom cd9660 ro,noauto 0 0</programlisting>
</listitem>
<listitem>
<para>创建 <filename>/boot/loader.conf</filename>
文件,并写入如下内容:</para>
<programlisting>geom_mirror_load="YES"
zfs_load="YES"</programlisting>
</listitem>
<listitem>
<para>执行下面的命令,使得
<application>ZFS</application> 在下次启动后可用:</para>
<screen>&prompt.root; <userinput>echo 'zfs_enable="YES"' &gt;&gt; /etc/rc.conf </userinput></screen>
</listitem>
<listitem>
<para>可以用 &man.adduser.8; 工具来添加额外的用户。
不要忘记添加一个用户到 <systemitem class="groupname">wheel</systemitem>
组,这样你可以在重新启动后获得 root 权限。</para>
</listitem>
<listitem>
<para>反复检验你的设置是否正确。</para>
</listitem>
</itemizedlist>
<para>现在你的系统在下次启动后应该可用了。使用
&man.reboot.8; 命令重新启动你的系统。</para>
</sect2>
</sect1>
<sect1 xml:id="zfs">
<title>ZFS</title>
<para>如果你的系统重新启动后还完好,现在应该能够登入了。
欢迎来到崭新的 &os; 安装,进行远程的不使用远程控制台的安装。</para>
<para>最后还剩下的步骤是配置 &man.zpool.8; 并创建一些
&man.zfs.8; 文件系统。建立并管理
<application>ZFS</application> 非常简单。
首先创建一个镜像的pool</para>
<screen>&prompt.root; <userinput>zpool create tank mirror /dev/ad[01]s1f</userinput></screen>
<para>再接着,创建一些文件系统:</para>
<screen>&prompt.root; <userinput>zfs create tank/ports</userinput>
&prompt.root; <userinput>zfs create tank/src</userinput>
&prompt.root; <userinput>zfs set compression=gzip tank/ports</userinput>
&prompt.root; <userinput>zfs set compression=on tank/src</userinput>
&prompt.root; <userinput>zfs set mountpoint=/usr/ports tank/ports</userinput>
&prompt.root; <userinput>zfs set mountpoint=/usr/src tank/src</userinput></screen>
<para>这就是全部步骤了。如果你对 &os; 上的
<application>ZFS</application> 感兴趣,请查阅 &os; WIKI 中的
<link xlink:href="http://wiki.freebsd.org/ZFS">ZFS</link> 一节。</para>
</sect1>
</article>