aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/handbook
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2004-09-26 05:20:38 +0000
committerHiroki Sato <hrs@FreeBSD.org>2004-09-26 05:20:38 +0000
commit8f1c859fcb214c414fa6913292f585a4879d7655 (patch)
treec62e773df353dd15d663bcea872797a02a9c37cb /zh_CN.GB2312/books/handbook
parent3e941311cb2ef8bb1151068e4f8f6ab382975287 (diff)
Notes
Diffstat (limited to 'zh_CN.GB2312/books/handbook')
-rw-r--r--zh_CN.GB2312/books/handbook/Makefile261
-rw-r--r--zh_CN.GB2312/books/handbook/advanced-networking/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml3779
-rw-r--r--zh_CN.GB2312/books/handbook/appendix.decl2
-rw-r--r--zh_CN.GB2312/books/handbook/basics/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/basics/chapter.sgml2297
-rw-r--r--zh_CN.GB2312/books/handbook/bibliography/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/bibliography/chapter.sgml634
-rw-r--r--zh_CN.GB2312/books/handbook/book.sgml297
-rw-r--r--zh_CN.GB2312/books/handbook/boot/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/boot/chapter.sgml694
-rw-r--r--zh_CN.GB2312/books/handbook/chapter.decl2
-rw-r--r--zh_CN.GB2312/books/handbook/chapters.ent57
-rw-r--r--zh_CN.GB2312/books/handbook/colophon.sgml28
-rw-r--r--zh_CN.GB2312/books/handbook/config/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/config/chapter.sgml2619
-rw-r--r--zh_CN.GB2312/books/handbook/cutting-edge/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml1608
-rw-r--r--zh_CN.GB2312/books/handbook/desktop/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/desktop/chapter.sgml1116
-rw-r--r--zh_CN.GB2312/books/handbook/disks/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/disks/chapter.sgml3353
-rw-r--r--zh_CN.GB2312/books/handbook/eresources/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/eresources/chapter.sgml1401
-rw-r--r--zh_CN.GB2312/books/handbook/install/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/install/chapter.sgml4751
-rw-r--r--zh_CN.GB2312/books/handbook/introduction/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/introduction/chapter.sgml855
-rw-r--r--zh_CN.GB2312/books/handbook/kernelconfig/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml1534
-rw-r--r--zh_CN.GB2312/books/handbook/l10n/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/l10n/chapter.sgml835
-rw-r--r--zh_CN.GB2312/books/handbook/linuxemu/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/linuxemu/chapter.sgml2992
-rw-r--r--zh_CN.GB2312/books/handbook/mac/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/mac/chapter.sgml119
-rw-r--r--zh_CN.GB2312/books/handbook/mail/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/mail/chapter.sgml1594
-rw-r--r--zh_CN.GB2312/books/handbook/mirrors/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/mirrors/chapter.sgml2701
-rw-r--r--zh_CN.GB2312/books/handbook/multimedia/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/multimedia/chapter.sgml1578
-rw-r--r--zh_CN.GB2312/books/handbook/network-servers/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/network-servers/chapter.sgml966
-rw-r--r--zh_CN.GB2312/books/handbook/pgpkeys/Makefile20
-rw-r--r--zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml873
-rw-r--r--zh_CN.GB2312/books/handbook/ports/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/ports/chapter.sgml1113
-rw-r--r--zh_CN.GB2312/books/handbook/ppp-and-slip/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml2734
-rw-r--r--zh_CN.GB2312/books/handbook/preface/preface.sgml522
-rw-r--r--zh_CN.GB2312/books/handbook/printing/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/printing/chapter.sgml1707
-rw-r--r--zh_CN.GB2312/books/handbook/security/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/security/chapter.sgml5053
-rw-r--r--zh_CN.GB2312/books/handbook/serialcomms/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml2301
-rw-r--r--zh_CN.GB2312/books/handbook/txtfiles.ent72
-rw-r--r--zh_CN.GB2312/books/handbook/users/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/users/chapter.sgml973
-rw-r--r--zh_CN.GB2312/books/handbook/vinum/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/vinum/chapter.sgml609
-rw-r--r--zh_CN.GB2312/books/handbook/x11/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/x11/chapter.sgml1619
64 files changed, 54101 insertions, 0 deletions
diff --git a/zh_CN.GB2312/books/handbook/Makefile b/zh_CN.GB2312/books/handbook/Makefile
new file mode 100644
index 0000000000..87a4958500
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/Makefile
@@ -0,0 +1,261 @@
+#
+# $FreeBSD$
+#
+# Build the FreeBSD Handbook (Chinese).
+#
+# Original revision: 1.90
+
+# ------------------------------------------------------------------------
+#
+# Handbook-specific variables
+#
+# WITH_PGPKEYS The print version of the handbook only prints PGP
+# fingerprints by default. If you would like for the
+# entire key to be displayed, then set this variable.
+# This option has no affect on the HTML formats.
+#
+# Handbook-specific targets
+#
+# pgpkeyring This target will read the contents of
+# pgpkeys/chapter.sgml and will extract all of
+# the pgpkeys to standard out. This output can then
+# be redirected into a file and distributed as a
+# public keyring of FreeBSD developers that can
+# easily be imported into PGP/GPG.
+#
+# ------------------------------------------------------------------------
+
+.PATH: ${.CURDIR}/../../share/sgml/glossary
+
+MAINTAINER= doc@FreeBSD.org
+
+DOC?= book
+
+FORMATS?= html-split
+
+HAS_INDEX= true
+
+INSTALL_COMPRESSED?= gz
+INSTALL_ONLY_COMPRESSED?=
+
+IMAGES_EN = advanced-networking/isdn-bus.eps
+IMAGES_EN+= advanced-networking/isdn-twisted-pair.eps
+IMAGES_EN+= advanced-networking/natd.eps
+IMAGES_EN+= advanced-networking/net-routing.pic
+IMAGES_EN+= advanced-networking/static-routes.pic
+IMAGES_EN+= install/adduser1.scr
+IMAGES_EN+= install/adduser2.scr
+IMAGES_EN+= install/adduser3.scr
+IMAGES_EN+= install/boot-mgr.scr
+IMAGES_EN+= install/console-saver1.scr
+IMAGES_EN+= install/console-saver2.scr
+IMAGES_EN+= install/console-saver3.scr
+IMAGES_EN+= install/console-saver4.scr
+IMAGES_EN+= install/desktop.scr
+IMAGES_EN+= install/disklabel-auto.scr
+IMAGES_EN+= install/disklabel-ed1.scr
+IMAGES_EN+= install/disklabel-ed2.scr
+IMAGES_EN+= install/disklabel-fs.scr
+IMAGES_EN+= install/disklabel-root1.scr
+IMAGES_EN+= install/disklabel-root2.scr
+IMAGES_EN+= install/disklabel-root3.scr
+IMAGES_EN+= install/disk-layout.eps
+IMAGES_EN+= install/dist-set.scr
+IMAGES_EN+= install/dist-set2.scr
+IMAGES_EN+= install/docmenu1.scr
+IMAGES_EN+= install/ed0-conf.scr
+IMAGES_EN+= install/ed0-conf2.scr
+IMAGES_EN+= install/edit-inetd-conf.scr
+IMAGES_EN+= install/fdisk-drive1.scr
+IMAGES_EN+= install/fdisk-drive2.scr
+IMAGES_EN+= install/fdisk-edit1.scr
+IMAGES_EN+= install/fdisk-edit2.scr
+IMAGES_EN+= install/ftp-anon1.scr
+IMAGES_EN+= install/ftp-anon2.scr
+IMAGES_EN+= install/hdwrconf.scr
+IMAGES_EN+= install/keymap.scr
+IMAGES_EN+= install/main1.scr
+IMAGES_EN+= install/mainexit.scr
+IMAGES_EN+= install/main-std.scr
+IMAGES_EN+= install/main-options.scr
+IMAGES_EN+= install/main-doc.scr
+IMAGES_EN+= install/main-keymap.scr
+IMAGES_EN+= install/media.scr
+IMAGES_EN+= install/mouse1.scr
+IMAGES_EN+= install/mouse2.scr
+IMAGES_EN+= install/mouse3.scr
+IMAGES_EN+= install/mouse4.scr
+IMAGES_EN+= install/mouse5.scr
+IMAGES_EN+= install/mouse6.scr
+IMAGES_EN+= install/mta-main.scr
+IMAGES_EN+= install/net-config-menu1.scr
+IMAGES_EN+= install/net-config-menu2.scr
+IMAGES_EN+= install/nfs-server-edit.scr
+IMAGES_EN+= install/ntp-config.scr
+IMAGES_EN+= install/options.scr
+IMAGES_EN+= install/pkg-cat.scr
+IMAGES_EN+= install/pkg-confirm.scr
+IMAGES_EN+= install/pkg-install.scr
+IMAGES_EN+= install/pkg-sel.scr
+IMAGES_EN+= install/probstart.scr
+IMAGES_EN+= install/routed.scr
+IMAGES_EN+= install/security.scr
+IMAGES_EN+= install/sysinstall-exit.scr
+IMAGES_EN+= install/timezone1.scr
+IMAGES_EN+= install/timezone2.scr
+IMAGES_EN+= install/timezone3.scr
+IMAGES_EN+= install/userconfig.scr
+IMAGES_EN+= install/userconfig2.scr
+IMAGES_EN+= install/xf86setup.scr
+IMAGES_EN+= mail/mutt1.scr
+IMAGES_EN+= mail/mutt2.scr
+IMAGES_EN+= mail/mutt3.scr
+IMAGES_EN+= mail/pine1.scr
+IMAGES_EN+= mail/pine2.scr
+IMAGES_EN+= mail/pine3.scr
+IMAGES_EN+= mail/pine4.scr
+IMAGES_EN+= mail/pine5.scr
+
+IMAGES_EN+= install/example-dir1.eps
+IMAGES_EN+= install/example-dir2.eps
+IMAGES_EN+= install/example-dir3.eps
+IMAGES_EN+= install/example-dir4.eps
+IMAGES_EN+= install/example-dir5.eps
+IMAGES_EN+= security/ipsec-network.pic
+IMAGES_EN+= security/ipsec-crypt-pkt.pic
+IMAGES_EN+= security/ipsec-encap-pkt.pic
+IMAGES_EN+= security/ipsec-out-pkt.pic
+IMAGES_EN+= vinum/vinum-concat.pic
+IMAGES_EN+= vinum/vinum-mirrored-vol.pic
+IMAGES_EN+= vinum/vinum-raid10-vol.pic
+IMAGES_EN+= vinum/vinum-raid5-org.pic
+IMAGES_EN+= vinum/vinum-simple-vol.pic
+IMAGES_EN+= vinum/vinum-striped-vol.pic
+IMAGES_EN+= vinum/vinum-striped.pic
+
+# 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
+IMAGES_LIB+= callouts/8.png
+IMAGES_LIB+= callouts/9.png
+IMAGES_LIB+= callouts/10.png
+
+#
+# SRCS lists the individual SGML files that make up the document. Changes
+# to any of these files will force a rebuild
+#
+
+# SGML content
+SRCS+= book.sgml
+SRCS+= colophon.sgml
+#SRCS+= freebsd-glossary.sgml
+SRCS+= advanced-networking/chapter.sgml
+SRCS+= basics/chapter.sgml
+SRCS+= bibliography/chapter.sgml
+SRCS+= boot/chapter.sgml
+SRCS+= config/chapter.sgml
+SRCS+= cutting-edge/chapter.sgml
+SRCS+= desktop/chapter.sgml
+SRCS+= disks/chapter.sgml
+SRCS+= eresources/chapter.sgml
+SRCS+= install/chapter.sgml
+SRCS+= introduction/chapter.sgml
+SRCS+= kernelconfig/chapter.sgml
+SRCS+= l10n/chapter.sgml
+SRCS+= linuxemu/chapter.sgml
+SRCS+= mac/chapter.sgml
+SRCS+= mail/chapter.sgml
+SRCS+= mirrors/chapter.sgml
+SRCS+= multimedia/chapter.sgml
+SRCS+= network-servers/chapter.sgml
+SRCS+= pgpkeys/chapter.sgml
+SRCS+= ports/chapter.sgml
+SRCS+= ppp-and-slip/chapter.sgml
+SRCS+= preface/preface.sgml
+SRCS+= printing/chapter.sgml
+SRCS+= security/chapter.sgml
+SRCS+= serialcomms/chapter.sgml
+SRCS+= users/chapter.sgml
+SRCS+= vinum/chapter.sgml
+SRCS+= x11/chapter.sgml
+
+# Entities
+SRCS+= chapters.ent
+
+SYMLINKS= ${DESTDIR} index.html handbook.html
+
+# Turn on all the chapters.
+CHAPTERS?= ${SRCS:M*chapter.sgml}
+
+SGMLFLAGS+= ${CHAPTERS:S/\/chapter.sgml//:S/^/-i chap./}
+#SGMLFLAGS+= -i chap.freebsd-glossary
+
+# XXX The Handbook build currently overflows some internal, hardcoded
+# limits in pdftex. Until we split the Handbook up, build the PDF
+# version using ps2pdf instead of pdftex.
+
+PS2PDF?= ${PREFIX}/bin/ps2pdf
+
+book.tex-pdf:
+ ${TOUCH} book.tex-pdf
+
+book.pdf: book.ps
+ ${PS2PDF} book.ps book.pdf
+
+pgpkeyring: pgpkeys/chapter.sgml
+ @${JADE} -V nochunks ${OTHERFLAGS} ${JADEOPTS} -d ${DSLPGP} -t sgml ${MASTERDOC}
+
+DOC_PREFIX?= ${.CURDIR}/../../..
+
+#
+# Handbook-specific variables
+#
+.if defined(WITH_PGPKEYS)
+JADEFLAGS+= -V withpgpkeys
+.endif
+
+.for p in ftp cvsup
+SRCS+= mirrors.sgml.${p}.inc
+CLEANFILES+= mirrors.sgml.${p}.inc
+CLEANFILES+= mirrors.sgml.${p}.inc.tmp
+.endfor
+
+SRCS+= eresources.sgml.www.inc
+CLEANFILES+= eresources.sgml.www.inc
+CLEANFILES+= eresources.sgml.www.inc.tmp
+
+URL_RELPREFIX?= ../../../..
+DOC_PREFIX?= ${.CURDIR}/../../..
+
+.include "${DOC_PREFIX}/share/mk/doc.project.mk"
+
+.for p in ftp cvsup
+mirrors.sgml.${p}.inc: ${XML_MIRRORS} ${XSL_MIRRORS}
+ ${XSLTPROC} ${XSLTPROCOPTS} \
+ -o $@.tmp \
+ --param 'transtable.xml' "'${XML_TRANSTABLE}'" \
+ --param 'type' "'$p'" \
+ --param 'proto' "'$p'" \
+ --param 'target' "'handbook/mirrors/chapter.sgml'" \
+ ${XSL_MIRRORS} ${XML_MIRRORS}
+ ${SED} -e 's,<\([^ >]*\)\([^>]*\)/>,<\1\2></\1>,;s,</anchor>,,'\
+ < $@.tmp > $@ || (${RM} -f $@ && false)
+ ${RM} -f $@.tmp
+.endfor
+
+eresources.sgml.www.inc: ${XML_MIRRORS} ${XSL_MIRRORS}
+ ${XSLTPROC} ${XSLTPROCOPTS} \
+ -o $@.tmp \
+ --param 'transtable.xml' "'${XML_TRANSTABLE}'" \
+ --param 'type' "'www'" \
+ --param 'proto' "'http'" \
+ --param 'target' "'handbook/eresources/chapter.sgml'" \
+ ${XSL_MIRRORS} ${XML_MIRRORS}
+ ${SED} -e 's,<\([^ >]*\)\([^>]*\)/>,<\1\2></\1>,;s,</anchor>,,'\
+ < $@.tmp > $@ || (${RM} -f $@ && false)
+ ${RM} -f $@.tmp
diff --git a/zh_CN.GB2312/books/handbook/advanced-networking/Makefile b/zh_CN.GB2312/books/handbook/advanced-networking/Makefile
new file mode 100644
index 0000000000..068f0fefb9
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/advanced-networking/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.2
+# $FreeBSD$
+#
+
+CHAPTERS= advanced-networking/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml
new file mode 100644
index 0000000000..f804ff5718
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml
@@ -0,0 +1,3779 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese Documentation Project
+
+ Original revision: 1.344
+ $FreeBSD$
+-->
+
+<chapter id="advanced-networking">
+ <title>高级网络</title>
+
+ <sect1 id="advanced-networking-synopsis">
+ <title>概述</title>
+
+ <para>本章将介绍许多与高级网络有关的话题。</para>
+
+ <para>读完这一章,您将会知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>网关和路由基础</para>
+ </listitem>
+
+ <listitem>
+ <para>如何安装 IEEE 802.11 和 &bluetooth;(蓝牙)设备。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样用 FreeBSD 做"桥接(bridge)"。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何为无盘机设置网络启动。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何设置网络地址翻译(NAT)。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何使用 PLIP 连接两台计算机。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在 FreeBSD 主机上设置 IPv6。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在 &os;5.X 下配置 ATM。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在读这章之前,您应该:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>理解 <filename>/etc/rc</filename> 脚本的基本知识。</para>
+ </listitem>
+
+ <listitem>
+ <para>相关的基本网络术语。</para>
+ </listitem>
+
+ <listitem>
+ <para>了解如何配置和安装新的 FreeBSD 内核
+ (<xref linkend="kernelconfig">)。</para>
+ </listitem>
+
+ <listitem>
+ <para>了解如何安装第三方软件 (<xref linkend="ports">)。</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="network-routing">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Coranth</firstname>
+ <surname>Gryphon</surname>
+ <contrib>贡献者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>袁</firstname>
+ <surname>苏义</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>网关和路由</title>
+
+ <indexterm><primary>路由</primary></indexterm>
+ <indexterm><primary>网关</primary></indexterm>
+ <indexterm><primary>子网</primary></indexterm>
+ <para>为了让一台主机在网能找到另一台主机,
+ 就必须要有一种机制来描述如何从一台主机连至另一台上。这个就叫做
+ <firstterm>路由选择(routing)</firstterm>。
+ 一个<quote>路由</quote>是一对预先定义的地址:
+ <quote>目的地(destination)</quote>和<quote>网关(gateway)</quote>。
+ 这对地址表明如果您想要试着到达这个<emphasis>目的地(destination)</emphasis>,
+ 那么就通过这个<emphasis>网关(gateway)</emphasis>进行通信。
+ 目的地有三种类型: 单个主机(individual hosts),
+ 子网(subnets)和<quote>默认(default)</quote>。
+ 如果没有其它路由应用,就使用<quote>默认路由(default route)</quote>。
+ 关于默认路由我们以后为讨论多一点。有三种类型的网关:
+ 单个主机,接口(也叫<quote>连接(links)</quote>)和以太网硬件地址(MAC addresses)。
+ </para>
+
+ <sect2>
+ <title>实例</title>
+
+ <para>为了说明路由选择的各个部分,我们使用以用下面这个例子。
+ 以下是命令 <command>netstat</command> 的输出:</para>
+
+ <screen>&prompt.user; <userinput>netstat -r</userinput>
+Routing tables
+
+Destination Gateway Flags Refs Use Netif Expire
+
+default outside-gw UGSc 37 418 ppp0
+localhost localhost UH 0 181 lo0
+test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77
+10.20.30.255 link#1 UHLW 1 2421
+example.com link#1 UC 0 0
+host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0
+host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 =>
+host2.example.com link#1 UC 0 0
+224 link#1 UC 0 0</screen>
+
+ <indexterm><primary>默认路由</primary></indexterm>
+ <para>头两行指定默认路由 (我们会在<link
+ linkend="network-routing-default">下一节</link>说明)
+ 和<hostid>本地(localhost)</hostid>路由。</para>
+
+ <indexterm><primary>回环设备</primary></indexterm>
+ <para>这张路由表里指定用于<literal>localhost</literal>的接口
+ (<literal>Netif</literal> 列)是<devicename>lo0</devicename>,
+ 也就是众所周知的<quote>回环设备(loopback device)</quote>。
+ 这就使得所有以此为<quote>目的地</quote>的通信留在了内部,
+ 而不是通过LAN发送出去,因为它会在开始的地方就结束返回。</para>
+
+ <indexterm>
+ <primary>以太网</primary> <secondary>MAC 地址</secondary>
+ </indexterm>
+ <para>接着出现的是以 <hostid role="mac">0:e0:</hostid>
+ 开头的地址。这些是以太网硬件地址,也称为 MAC 地址。
+ FreeBSD 会自动识别在同一个以太网中的任何主机(如
+ <hostid>test0</hostid>),并为这个主机新增一个路由,
+ 以并通过那个以太网接口——<devicename>ed0</devicename>
+ 直接到达它(译者注:那台主机。与这类路由表相关的也有一个超时项
+ (<literal>Expire</literal>列),当我们在指定时间内没有收到从那个主机发来的信息,
+ 这项就派上用场了。这种情况下,到这个主机的路由就会被自动删除。
+ 这些主机被使用一种叫做RIP(路由信息协议--Routing Information
+ Protocol)的机制所识别,这种机制利用基于<quote>最短路径选择
+ (shortest path determination)</quote>的办法计算出到本地主机的路由。</para>
+
+ <indexterm><primary>子网</primary></indexterm>
+ <para>FreeBSD 也会为本地子网添加子网路由(<hostid
+ role="ipaddr">10.20.30.255</hostid> 是子网
+ <hostid role="ipaddr">10.20.30</hostid> 的广播地址,而 <hostid
+ role="domainname">example.com</hostid> 是这个子网相联的域名)。
+ 名称 <literal>link#1</literal> 代表主机上的第一块以太网卡。
+ 您会发现,对于它们没有指定另外的接口。</para>
+
+ <para>这两个组(本地网络主机和本地子网)的路由是由守护进程
+ <application>routed</application> 自动配置的。如果它没有运行,
+ 那就只有被静态定义 (例如,明确输入的) 的路由才存在了。</para>
+
+ <para><literal>host1</literal> 行代表我们的主机,它通过以太网地址来识别。
+ 因为我们是发送端,FreeBSD知道使用回还接口 (<devicename>lo0</devicename>)
+ 而不是通过以太网接口来进行发送。</para>
+
+ <para>两个 <literal>host2</literal> 是我们使用 &man.ifconfig.8;
+ 别名 (请看关于以太网的那部分就会知道我们为什么这么做)
+ 时产生的一个实例。在 <devicename>lo0</devicename>
+ 接口之后的 <literal>=></literal> 符号表明我们不仅使用了回环
+ (因为这个地址也涉及了本地主机),而且明确指出它是个别名。
+ 这类路由只有在支持别名的主机上才能显现出来。
+ 所有本地网上的其它的主机对于这类路由只会简单拥有
+ <literal>link#1</literal>。</para>
+
+ <para>最后一行 (目标子网<hostid role="ipaddr">224</hostid>)
+ 用于处理多播——它会覆盖到其它的区域。</para>
+
+ <para>最后,每个路由的不同属性可以在 <literal>Flags</literal>
+ 列中看到。下边是个关于这些标志和它们的含义的一个简表:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="4*">
+
+ <tbody>
+ <row>
+ <entry>U</entry>
+ <entry>Up: 路由处于活动状态。</entry>
+ </row>
+
+ <row>
+ <entry>H</entry>
+ <entry>Host: 路由目标是单个主机。</entry>
+ </row>
+
+ <row>
+ <entry>G</entry>
+ <entry>Gateway: 所有发到目的地的网络传到这一远程系统上,
+ 并由它决定最后发到哪里。</entry>
+ </row>
+
+ <row>
+ <entry>S</entry>
+ <entry>Static: 这个路由是手工配置的,不是由系统自动生成的。</entry>
+ </row>
+
+ <row>
+ <entry>C</entry>
+ <entry>Clone: 生成一个新的路由,
+ 通过这个路由我们可以连接上这些机子。
+ 这种类型的路由通常用于本地网络。</entry>
+ </row>
+
+ <row>
+ <entry>W</entry>
+ <entry>WasCloned: 指明一个路由——它是基于本地区域网络
+ (克隆) 路由自动配置的。</entry>
+ </row>
+
+ <row>
+ <entry>L</entry>
+ <entry>Link: 路由涉及到了以太网硬件。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ </sect2>
+
+ <sect2 id="network-routing-default">
+ <title>默认路由</title>
+
+ <indexterm><primary>默认路由</primary></indexterm>
+ <para>当本地系统需要与远程主机建立连接时,
+ 它会检查路由表以决定是否有已知的路径存在。
+ 如果远程主机属于一个我们已知如何到达 (克隆的路由)
+ 的子网内,那么系统会检查看沿着那个接口是否能够连接。</para>
+
+ <para>如果所有已知路径都失败,系统还有最后一个选择:
+ <quote>默认</quote>路由。这个路由是特殊类型的网关路由
+ (通常只有一个存在于系统里),并且总是在标志栏使用一个
+ <literal>c</literal>来进行标识。对于本地区域网络里的主机,
+ 这个网关被设置到任何与外界有直接连接的机子里 (无论是通过
+ PPP、DSL、cable modem、T1 或其它的网络接口连接)。</para>
+
+ <para>如果您正为某台本身就做为网关连接外界的机子配置默认路由的话,
+ 那么该默认路由应该是您的<quote>互联网服务商
+ (ISP)</quote>那方的网关机子。</para>
+
+ <para>让我们来看一个关于默认路由的例子。这是个很普遍的配置:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="advanced-networking/net-routing">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced">
+[Local2] &lt;--ether--&gt; [Local1] &lt;--PPP--&gt; [ISP-Serv] &lt;--ether--&gt; [T1-GW]
+ </literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>主机 <hostid>Local1</hostid> 和 <hostid>Local2</hostid>
+ 在您那边。<hostid>Local1</hostid> 通过 PPP 拨号连接到了 ISP。这个
+ PPP 服务器通过一个局域网连接到另一台网关机子——它又通过一个外部接口连接到
+ ISP 提供的互联网上。</para>
+
+ <para>您的每一台机子的默认路由应该是:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Host</entry>
+ <entry>Default Gateway</entry>
+ <entry>Interface</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>Local2</entry>
+ <entry>Local1</entry>
+ <entry>Ethernet</entry>
+ </row>
+
+ <row>
+ <entry>Local1</entry>
+ <entry>T1-GW</entry>
+ <entry>PPP</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>一个常见的问题是<quote>我们为什么 (或怎样)
+ 能 <hostid>T1-GW</hostid> 设置成为 <hostid>Local1</hostid>
+ 默认网关,而不是它所连接 ISP 服务器?</quote></para>
+
+ <para>记住,因为 PPP 接口使用的一个地址是在 ISP
+ 的局域网里的,用于您那边的连接,对于 ISP
+ 的局域网里的其它机子,其路由会自动产生。
+ 因此,您就已经知道了如何到达机子 <hostid>T1-GW</hostid>,
+ 那么也就没必要中那一步了——发送通信给 ISP 服务器。</para>
+
+ <para>通常使用地址 <hostid
+ role="ipaddr">X.X.X.1</hostid> 做为一个局域网的网关。
+ 因此 (使用相同的例子),如果您本地的 C 类地址空间是
+ <hostid role="ipaddr">10.20.30</hostid>,而您的 ISP
+ 使用的是 <hostid role="ipaddr">10.9.9</hostid>,
+ 那么默认路由表将是:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Host</entry>
+ <entry>Default Route</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Local2 (10.20.30.2)</entry>
+ <entry>Local1 (10.20.30.1)</entry>
+ </row>
+ <row>
+ <entry>Local1 (10.20.30.1, 10.9.9.30)</entry>
+ <entry>T1-GW (10.9.9.1)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>您可以很轻易地通过 <filename>/etc/rc.conf</filename>
+ 文件设定默认路由。在我们的实例里,在主机 <hostid>Local2</hostid>
+ 里,我们在文件 <filename>/etc/rc.conf</filename>
+ 里增加了下边内容:</para>
+
+ <programlisting>defaultrouter="10.20.30.1"</programlisting>
+
+ <para>也可以直接在命令行使用 &man.route.8; 命令:</para>
+
+ <screen>&prompt.root; <userinput>route add default 10.20.30.1</userinput></screen>
+
+ <para>想要了解更多关于手工处理网络路由表的信息,参考
+ &man.route.8; 手册页。</para>
+ </sect2>
+
+ <sect2>
+ <title>重宿主机(Dual Homed Hosts)</title>
+ <indexterm><primary>重宿 主机</primary></indexterm>
+ <para>还有一种其它的类型的配置是我们要提及的,
+ 这就是一个主机处于两个不同的网络。技术上,任何做为网关
+ (上边的实例中,使用了 PPP 连接) 的机子就算作是重宿主机。
+ 但这个词实际上仅用来指那种处于两个局域网这中的机子。</para>
+
+ <para>有一种情形,一台机子有两个网卡,
+ 对于各个子网都有各自的一个地址。另一种情况,
+ 这台机子仅有一张网卡,但使用 &man.ifconfig.8;
+ 做了别名。如果有两个独立的以太网在使用的情形就使用前者,
+ 如果只有一个物理网段,但逻辑上分成了两个独立的子网,
+ 就使用后者。</para>
+
+ <para>每种情况都要设置路由表以便两子网都知道这台主机是到其它子网的网关——入站路由
+ (inbound route)。将一台主机配置成两个子网间的路由器,
+ 这种配置经常在我们需要实现单向或双向的包过滤或防火墙时被用到。</para>
+
+ <para>如果想让主机在两个接口间转发数据包,您需要激活
+ FreBSD 的这项功能。至于怎么做,请看下一部分了解更多。</para>
+ </sect2>
+
+ <sect2 id="network-dedicated-router">
+ <title>建立路由器</title>
+
+ <indexterm><primary>路由器</primary></indexterm>
+
+ <para>网络路由器只是一个将数据包从一个接口转发到另一个接口的系统。
+ 互联网标准和良好的工程实践阻止了 FreeBSD 计划在 FreeBSD
+ 中把它置成默认地。您在可以在 &man.rc.conf.5; 中改变下列变量的值为
+ <literal>YES</literal>,使用这个功能生效:</para>
+
+ <programlisting>gateway_enable=YES # Set to YES if this host will be a gateway</programlisting>
+
+ <para>这个选项会把&man.sysctl.8;
+ 变量——<varname>net.inet.ip.forwarding</varname>
+ 设置成 <literal>1</literal>。如果您要临时地停止路由,
+ 您可以把它重为 <literal>0</literal>。</para>
+
+ <para>新的路由器需要有路由才知道将数据传向何处。
+ 如果网络够简单,您可以使用静态路由。FreeBSD
+ 也自带一个标准的BSD路由选择守护进程 &man.routed.8;,
+ 称之为 RIP ( version 1和 version 2) 和 IRDP。对 BGP v4,OSPF v2
+ 和其它复杂路由选择协议的支持可以从
+ <filename role="package">net/zebra</filename> 包中得到。
+ 像 <application>&gated;</application>
+ 一样的商业产品也提供了更复杂的网络路由解决方案。</para>
+
+<indexterm><primary>BGP</primary></indexterm>
+<indexterm><primary>RIP</primary></indexterm>
+<indexterm><primary>OSPF</primary></indexterm>
+
+ <para>即使 FreeBSD 按照这种方法进行了配置,
+ 它也并不完全符合 Internet 标准对路由器的要求。
+ 但对于一般应用已经足够了。</para>
+ </sect2>
+
+ <sect2>
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Coranth</firstname>
+ <surname>Gryphon</surname>
+ <contrib>贡献者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>袁</firstname>
+ <surname>苏义</surname>
+ </author>
+ </authorgroup>
+ </sect2info>
+ <!-- Feb 2004 --> <title>设置静态路由</title>
+
+ <sect3>
+ <title>手动配置</title>
+
+ <para>假设如下这样一个网络:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="advanced-networking/static-routes">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced">
+ INTERNET
+ | (10.0.0.1/24) Default Router to Internet
+ |
+ |Interface xl0
+ |10.0.0.10/24
+ +------+
+ | | RouterA
+ | | (FreeBSD gateway)
+ +------+
+ | Interface xl1
+ | 192.168.1.1/24
+ |
+ +--------------------------------+
+ Internal Net 1 | 192.168.1.2/24
+ |
+ +------+
+ | | RouterB
+ | |
+ +------+
+ | 192.168.2.1/24
+ |
+ Internal Net 2
+ </literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>在这里,<hostid>RouterA</hostid> 是我们的 &os;
+ 机子,它充当连接到互联网其它部分的路由器的角色。
+ 默认路由设置为<hostid
+ role="ipaddr">10.0.0.1</hostid>,
+ 它就允许与外界连接。我们假定已经正确配置了
+ <hostid>RouterB</hostid>,并且知道如何连接到想去的任何地方。
+ (在这个图里很简单。只须在 <hostid>RouterB</hostid>
+ 上增加默认路由,使用 <hostid>192.168.1.1</hostid> 做为网关。)</para>
+
+ <para>如果我们查看一下<hostid>RouterA</hostid>的路由表,
+ 我们就会看到如下一些内容:</para>
+
+ <screen>&prompt.user; <userinput>netstat -nr</userinput>
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+default 10.0.0.1 UGS 0 49378 xl0
+127.0.0.1 127.0.0.1 UH 0 6 lo0
+10.0.0/24 link#1 UC 0 0 xl0
+192.168.1/24 link#2 UC 0 0 xl1</screen>
+
+ <para>使用当前的路由表,<hostid>RouterA</hostid>
+ 是不能到达我们的内网——Internal Net 2 的。它没有到 <hostid
+ role="ipaddr">192.168.2.0/24</hostid> 的路由。
+ 一种可以接受的方法是手工增加这条路由。以下的命令会把
+ Internal Net 2 网络加入到 <hostid>RouterA</hostid> 的路由表中,使用<hostid
+ role="ipaddr">192.168.1.2</hostid> 做为下一个跳跃:</para>
+
+ <screen>&prompt.root; <userinput>route add -net 192.168.2.0/24 192.168.1.2</userinput></screen>
+
+ <para>现在 <hostid>RouterA</hostid>
+ 就可以到达 <hostid role="ipaddr">192.168.2.0/24</hostid>
+ 网络上的任何主机了。</para>
+ </sect3>
+
+ <sect3>
+ <title>永久的配置</title>
+
+ <para>上面的实例对于运行着的系统来说配置静态路由是相当不错了。
+ 只是,有一个问题——如果您重启您的 &os; 机子,路由信息就会消失。
+ 处理附加的静态路由的方法是把它放到您的
+ <filename>/etc/rc.conf</filename> 文件里去。</para>
+
+ <programlisting># Add Internal Net 2 as a static route
+static_routes="internalnet2"
+route_internalnet2="-net 192.168.2.0/24 192.168.1.2"</programlisting>
+
+ <para>配置变量 <literal>static_routes</literal>
+ 是一串以空格格开的字符串。每一串表示一个路由名字。
+ 在上面的例子中我们中有一个串在 <literal>static_routes</literal>
+ 里。这个字符串中 <replaceable>internalnet2</replaceable>。
+ 然后我们新增一个配置变量
+ <literal>route_<replaceable>internalnet2</replaceable></literal>,
+ 这里我们把所有传给 &man.route.8;命令的参数拿了过来。
+ 在上面的实例中的我使用的命令是:</para>
+
+ <screen>&prompt.root; <userinput>route add -net 192.168.2.0/24 192.168.1.2</userinput></screen>
+
+ <para>因此,我们需要的是 <literal>"-net 192.168.2.0/24 192.168.1.2"</literal>。</para>
+
+ <para>前边已经说了,我们可以有不只一个字符串的
+ <literal>static_routes</literal> 里边。
+ 下面我们就建立多个静态路由。下面几行显示了一个为 <hostid
+ role="ipaddr">192.168.0.0/24</hostid> 和 <hostid
+ role="ipaddr">192.168.1.0/24</hostid>
+ 网络在一个假想的路由器上增加静态路由的例子:</para>
+
+ <programlisting>static_routes="net1 net2"
+route_net1="-net 192.168.0.0/24 192.168.0.1"
+route_net2="-net 192.168.1.0/24 192.168.1.1"</programlisting>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>路由传播</title>
+ <indexterm><primary>路由 传播</primary></indexterm>
+ <para>我们已经讨论了如何定义通向外界的路由,
+ 但未谈及外界是如何找到我们的。</para>
+
+ <para>我们已经知道可以设置路由表,
+ 这样任何指向特定地址空间 (在我们的例子中是一个
+ C 类子网) 的数据都会被送往网络上特定的主机,
+ 然后由这台主机向地址空间内部转发数据。</para>
+
+ <para>当您得到一个分配给您的网络的地址空间时,
+ ISP(网络服务商)会设置它们的路由表,
+ 这样指向您子网的数据就会通过 PPP 连接下传到您的网络。
+ 但是其它跨越国界的网络是如何知道将数据传给您的
+ ISP 的呢?</para>
+
+ <para>有一个系统(很像分布式 DNS 信息系统),
+ 它一直跟踪被分配的地址空间,
+ 并说明它们连接到互联网骨干(Internet backbone)的点。
+ <quote>骨干(Backbone)</quote> 指的是负责全世界和跨国的传输的主要干线。
+ 每一台骨干主机(backbone machine)有一份主要表集的拷贝,
+ 它将发送给特定网络的数据导向相应的骨干载体上(backbone carrier),
+ 从结点往下遍历服务提供商链,直到数据到达您的网络。</para>
+
+ <para>服务提供商的任务是向骨干网络广播他们就是到到达您的网点的连接结点
+ (以及进入的路径)。这就是路由传播。</para>
+ </sect2>
+
+ <sect2>
+ <title>问题解答</title>
+ <indexterm>
+ <primary><command>traceroute</command></primary>
+ </indexterm>
+ <para>有时候,路由传播会有一个问题,一些网络无法与您连接。
+ 或许能帮您找出路由是在哪里中断的最有用的命令就是
+ &man.traceroute.8;了。当您无法与远程主机连接时,
+ 这个命令一样有用(例如 &man.ping.8; 失败)。</para>
+
+ <para>&man.traceroute.8; 命令将以您想连接的主机的名字作为参数执行。
+ 不管是到达了目标,还是因为没有连接而终止,
+ 它都会显示所经过的所有网关主机。</para>
+
+ <para>想了解更多的信息,查看 &man.traceroute.8; 的手册。</para>
+ </sect2>
+
+ <sect2>
+ <title>多播路由</title>
+ <indexterm>
+ <primary>多播</primary> <secondary>MROUTING 选项</secondary>
+ </indexterm>
+ <para>FreeBSD 一开始就支持多播应用软件和多播路由选择。
+ 多播程序并不要求FreeBSD的任何特殊的配置,
+ 就可以工作得很好。多播路由需要支持被编译入内核:</para>
+
+ <programlisting>options MROUTING</programlisting>
+
+ <para>另外,多播路由守护进程——&man.mrouted.8;
+ 必须通过 <filename>/etc/mrouted.conf</filename>
+ 配置来开启通道和 <acronym>DVMRP</acronym>。
+ 更多关于多播路由配置的信息可以在 &man.mrouted.8;
+ 的手册里找到。</para>
+ </sect2>
+ </sect1>
+
+
+
+<sect1 id="network-wireless">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Eric</firstname>
+ <surname>Anderson</surname>
+ <contrib>作者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>袁</firstname>
+ <surname>苏义</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>无线网络</title>
+
+ <indexterm><primary>无线网络</primary></indexterm> <indexterm><primary>802.11</primary> <see>无线网络</see></indexterm>
+
+ <sect2>
+ <title>简介</title>
+ <para>如果可以使用没有烦人的随时都通过网线连接的计算机,
+ 会真的很有用。FreeBSD 可以充当无线客户端,
+ 甚至可以做为无线<quote>接入点(access point)</quote>。</para>
+ </sect2>
+
+ <sect2>
+ <title>无线操作模式</title>
+ <para>802.11无线设备有两种不同的配置方式:BSS 和 IBSS.</para>
+
+ <sect3>
+ <title>BSS 模式</title>
+ <para>BSS 模式是常用的模式。
+ 它也被叫做<quote>底层结构(infrastructure)</quote>模式。
+ 在此种模式里,一些无线接入点连接到有线网络。
+ 每个无线网络有个名字。这个名字被称为网络的 SSID。</para>
+
+ <para>无线客户端连接到这些无线接入点上。
+ IEEE 802.11 标准定义了用于无线网络连接的协议。
+ 在设定了 SSID 后,一个无线客户端可以连接到一个指定的网络。
+ 若不明确指定 SSID,一个无线客户端可以被连接到任何的网络。</para>
+ </sect3>
+
+ <sect3>
+ <title>IBSS 模式</title>
+ <para>IBSS 模式,也叫专属(ad-hoc)模式,
+ 是设计来进行点对点的接连的。实际上有两种类型的专属模式。
+ 一种是 IBSS 模式,也叫"ad-hoc" 或"IEEE ad-hoc"模式。
+ 这个模式由 IEEE 802.11 标准定义。
+ 第二个叫做演示专属 (demo ad-hoc) 模式或朗讯专属
+ (Lucent ad-hoc) 模式 (而有时与专属模式是混淆的)。
+ 这个是早先的,准 802.11 专属模式,并且应该只用于过渡性的安装里。
+ 对于两类专属模式我不再做进一步介绍了。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>底层结构 (Infrastructure) 模式</title>
+ <sect3>
+ <title>接入点</title>
+
+ <para>接入点是一种无线网络设备,
+ 它允许一个或更多的无线客户端使用此设备作为中心集线器 (hub)。
+ 使用接入点时, 所有的客户端通过接入点通信。
+ 常用多个接入点来覆盖一个完整的区域,比如一所住房、
+ 一片商业区,或一座公园。</para>
+
+ <para>接入点一般具有多个网络连接:无线网卡、
+ 一块或多块用于连接其它网络有线的以太网适配器。</para>
+
+ <para>可以购买预建的接入点,
+ 您也可以使用 FreeBSD 及其兼容的无线网卡自己建立接入点。
+ 一些产商制造了带有不同功能的无线接入点和无线网卡。</para>
+ </sect3>
+
+ <sect3>
+ <title>建立 FreeBSD 接入点</title> <indexterm><primary>无线网络</primary> <secondary>接入点</secondary></indexterm>
+
+ <sect4><title>要求</title>
+
+ <para>为了在 FreeBSD 上建立接入点,您要有一块兼容的无线网卡。
+ 至今为止,FreeBSD 只支持带有 Prism 芯片组的网卡。
+ 您还需要被 FreeBSD 支持的有线网卡 (这个不难找到,FreeBSD
+ 支持很多不同的设备)。在这里,我们假定您要桥接 (&man.bridge.4;)
+ 有线网卡连接的网络与无线设备之间的所有传输。</para>
+
+ <para>FreeBSD 用来实现接入点的"hostap"功能与一定版本的
+ firmware (固件) 工作得很好。Prism 2 网卡应该使用
+ firmware1.3.4或更新的版本。Prism 2.5 和 Prism 3
+ 网卡应使用firmware1.4.9。老版本的firmware
+ 可能无法正常工作。这时候,升级网卡的唯一方式是使用厂商提供的
+ &windows; firmware 升级工具。</para>
+ </sect4>
+
+ <sect4>
+ <title>设置并运行</title>
+ <para>首先,确保您的系统能识别无线网卡:</para>
+ <screen>&prompt.root; <userinput>ifconfig -a</userinput>
+wi0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
+ inet6 fe80::202:2dff:fe2d:c938%wi0 prefixlen 64 scopeid 0x7
+ inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
+ ether 00:09:2d:2d:c9:50
+ media: IEEE 802.11 Wireless Ethernet autoselect (DS/2Mbps)
+ status: no carrier
+ ssid ""
+ stationname "FreeBSD Wireless node"
+ channel 10 authmode OPEN powersavemode OFF powersavesleep 100
+ wepmode OFF weptxkey 1</screen>
+
+ <para>现在不用考虑细节部分,只要确认有信息表明您已安装了无线网卡。
+ 如果您无法找到无线接口,您可能使用的是 PC 卡,需要查看
+ &man.pccardc.8; 和 &man.pccardd.8; 联机手册以获取更多信息。</para>
+
+ <para>下一步,您需要加载一个模块使 FreeBSD
+ 的桥接部分为接入点作好准备。 加载桥接 &man.bridge.4;
+ 模块,只需运行以下命令:</para>
+
+ <screen>&prompt.root; <userinput>kldload bridge</userinput></screen>
+
+ <para>加载模块应该不会产生任何错误。如果发生了错误,
+ 您就需要将桥接 &man.bridge.4; 代码编译入内核。手册的<link
+ linkend="network-bridging">桥接(Bridging)</link>
+ 部分应该能帮您完成这个任务。</para>
+
+ <para>现在已经完成了桥接的组件,
+ 接着我们需要告诉内核将哪些接口桥接在一起。
+ 我们使用 &man.sysctl.8; 来完成:</para>
+
+ <screen>&prompt.root; <userinput>sysctl net.link.ether.bridge=1</userinput>
+&prompt.root; <userinput>sysctl net.link.ether.bridge_cfg="wi0,xl0"</userinput>
+&prompt.root; <userinput>sysctl net.inet.ip.forwarding=1</userinput></screen>
+
+ <para>在 &os; 5.2-RELEASE 以及更新版本上,您必须使用下面的选项:</para>
+
+ <screen>&prompt.root; <userinput>sysctl net.link.ether.bridge.enable=1</userinput>
+&prompt.root; <userinput>sysctl net.link.ether.bridge.config="wi0,xl0"</userinput>
+&prompt.root; <userinput>sysctl net.inet.ip.forwarding=1</userinput></screen>
+
+ <para>现在来设置并启动无线网卡。以下的命令将网卡设置为接入点状态:</para>
+
+ <screen>
+&prompt.root; <userinput>ifconfig wi0 ssid <replaceable>my_net</replaceable> channel 11 media DS/11Mbps mediaopt hostap up stationname "<replaceable>FreeBSD AP</replaceable>"</userinput>
+ </screen>
+
+ <para>&man.ifconfig.8; 行用于启动 <devicename>wi0</devicename> 接口,
+ 并把它的 SSID 设置为 <replaceable>my_net</replaceable>,
+ 还有把工作站名设置为 <replaceable>FreeBSD AP</replaceable>。
+ <option>media DS/11Mbps</option> 是把卡设置成 11Mbps 模式,
+ 它是任何<option>mediaopt</option>产生作用所必需的。
+ <option>mediaopt hostap</option> 选项把接口设置成接入点模式。
+ <option>channel 11</option> 选项设置为要使用的 802.11b channel(频道)。
+ &man.wicontrol.8; 手册包含一些有效的channel选项。</para>
+
+ <para>现在应该启动并运行着一个完全功能的接入点。
+ 推荐阅读 &man.wicontrol.8;,&man.ifconfig.8; 和
+ &man.wi.4; 以求更深入的了解。
+ </para>
+
+ <para>同样建议您阅读接着关于加密那一节。</para>
+ </sect4>
+
+ <sect4>
+ <title>状态信息</title>
+ <para>一旦接入点配置完成且可操作,
+ 操作者都会希望查看连入接入点的客户。
+ 在任何时候,都可以键入:</para>
+
+ <screen>&prompt.root; <userinput>wicontrol -l</userinput>
+1 station:
+00:09:b7:7b:9d:16 asid=04c0, flags=3&lt;ASSOC,AUTH&gt;, caps=1&lt;ESS&gt;, rates=f&lt;1M,2M,5.5M,11M&gt;, sig=38/15
+</screen>
+
+ <para>显示连接了一个站点,接着的是各种参数。
+ 显示的信号通常只作为强度的相对指示。到
+ dBm 或其它单元的转换因 firmware 版本的不同而有所差异。</para>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>客户端</title>
+
+ <para>一个无线客户端是一个连入接入点或直接连接另一个客户端的系统。 </para>
+
+ <para>一般地,无线客户端只有一个网络设备,也就是无线网卡。</para>
+
+ <para>配置无线客户端的方法有好几种。基于不同的无线模式,一般有
+ BSS (infrastructure 模式,它需要有一个接入点) 和 IBSS 模式
+ (ad-hoc,或点对点模式)。在我们的例子中我们使用了最流行的BSS模式,
+ 讨论接入点。</para>
+
+ <sect4>
+ <title>要求</title>
+ <para>将FreeBSD设置为无线客户端事实上只有一个条件。
+ 就是您需要有一块能被FreeBSD支持的无线网卡。</para>
+ </sect4>
+
+ <sect4>
+ <title>设置FreeBSD无线客户端</title>
+
+ <para>在开始之前,您需要了解有关要连入的无线网络的一些信息。
+ 在本例中,我们将连入一个名为 <replaceable>my_net</replaceable>
+ 的无线网络,且关闭了加密功能。</para>
+
+ <note><para>在本例中,我们不使用加密,这是非常危险的。
+ 在下一节中,您将会学到如何开启加密和这样做的重要性的原因,
+ 以及为什么一些加密技术仍不能完全地保护您。</para></note>
+
+ <para>确保您的网卡能被 FreeBSD 识别:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig -a</userinput>
+wi0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
+ inet6 fe80::202:2dff:fe2d:c938%wi0 prefixlen 64 scopeid 0x7
+ inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
+ ether 00:09:2d:2d:c9:50
+ media: IEEE 802.11 Wireless Ethernet autoselect (DS/2Mbps)
+ status: no carrier
+ ssid ""
+ stationname "FreeBSD Wireless node"
+ channel 10 authmode OPEN powersavemode OFF powersavesleep 100
+ wepmode OFF weptxkey 1</screen>
+
+ <para>现在,我们要正确地设置网卡:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig wi0 inet <replaceable>192.168.0.20</replaceable> netmask <replaceable>255.255.255.0</replaceable> ssid <replaceable>my_net</replaceable></userinput></screen>
+
+ <para>将 <hostid role="ipaddr">192.168.0.20</hostid> 和
+ <hostid role="netmask">255.255.255.0</hostid>
+ 替换为有线网络上合法的 IP 地址和网络掩码。记住,
+ 接入点桥连了无线网络和有线网络之间的数据,
+ 所以对于网络上的其它设备来说,您就如同在有线网络上。</para>
+
+ <para>完成了这些,您应该能 ping 通有线网络上的主机,
+ 就像是通过有线网络连接的一样。</para>
+
+ <para>如果您遇到了问题,确认您是否连上了接入点:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig wi0</userinput></screen>
+
+ <para>此命令会返回一些信息,您应该能看到:</para>
+ <screen>status: associated</screen>
+
+ <para>如果显示没有<literal>连接上 (associated)</literal>,
+ 那您可能在接入点的范围以外,需要关闭加密或者可能有配置问题。</para>
+
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>加密</title> <indexterm><primary>无线网络</primary> <secondary>加密</secondary></indexterm>
+
+ <para>无线网络的加密非常重要因为您无法让网络处于一个被良好保护的区域。
+ 您的无线数据会向整个社区广播,任何人都可以读到它。
+ 这就需要加密。通过加密向电波发送的数据,
+ 使得任何有兴趣的组织从电波中提取数据变得更难。 </para>
+
+ <para>加密客户端与接入点之间数据的最常用的方法有两种:WEP和&man.ipsec.4;。</para>
+
+ <sect4>
+ <title>WEP</title> <indexterm><primary>WEP</primary></indexterm>
+
+ <para>WEP 是 Wired Equivalency Protocol(有线等效协议)
+ 的缩写。 WEP试图使无线网络变得如有线网络一样安全与可靠。
+ 不幸的是它已经被攻破,是非常容易被破解的。
+ 这也意味着它不适用于加密敏感数据。</para>
+
+ <para>但有总比没有好,使用以下命令 FreeBSD 接入点上打开 WEP:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig wi0 inet up ssid <replaceable>my_net</replaceable> wepmode on wepkey <replaceable>0x1234567890</replaceable> media DS/11Mbps mediaopt hostap</userinput></screen>
+
+ <para>您可以使用以下这个命令在客户端上打开 WEP:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig wi0 inet <replaceable>192.168.0.20</replaceable> netmask <replaceable>255.255.255.0</replaceable> ssid <replaceable>my_net</replaceable> wepmode on wepkey <replaceable>0x1234567890</replaceable></userinput></screen>
+
+ <para>注意您应该将 <replaceable>0x1234567890</replaceable> 替换为更独特的密钥。</para>
+
+ </sect4>
+
+ <sect4>
+ <title>IPsec</title>
+
+ <para>&man.ipsec.4; 是一个更加强大的网络数据加密工具。
+ 它无疑是加密无线网络数据的首选。在手册的
+ <link linkend="ipsec">IPsec</link> 部分,您将能更多了解
+ &man.ipsec.4; 的安全性及其实现。</para>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>工具</title>
+
+ <para>有少量用于诊断和设置无线网络的工具,这里我们将介绍几个这样的工具。</para>
+
+ <sect4>
+ <title><application>bsd-airtools</application>包</title>
+
+ <para><application>bsd-airtools</application>
+ 包是一套完整的工具集,包括了用于破解 WEP
+ 密匙的无线审核工具,接入点检测等等。</para>
+
+ <para><application>bsd-airtools</application>
+ 工具集可以从<filename
+ role="package">net/bsd-airtools</filename> port
+ 里安装。关于安装 ports 的信息可以在手册的
+ <xref linkend="ports"> 里找到。</para>
+
+ <para><command>dstumbler</command> 是一个用于接入点发现和显示音噪比
+ (noise ratio) 图表的工具。在您启动运行接入点有困难时,
+ <command>dstumbler</command> 可能会帮您大忙。</para>
+
+ <para>为了测试无线网络的安全性,您可以选用
+ <quote>dweputils</quote> (<command>dwepcrack</command>,
+ <command>dwepdump</command> 和 <command>dwepkeygen</command>)
+ 来帮您测定 WEP 是否是您的无线网络安全需要的正确解决方案。</para>
+
+ </sect4>
+
+ <sect4>
+ <title><command>wicontrol</command>, <command>ancontrol</command> 和 <command>raycontrol</command> 工具集</title>
+
+ <para>这些工具用于控制无线网卡在无线网络上行为。
+ 在以上的例子中,我们选择了 &man.wicontrol.8;,
+ 因为我们的无线网卡是 <devicename>wi0</devicename> 接口。
+ 如果您有 Cisco (思科) 的无线设备,出现的将是
+ <devicename>an0</devicename>,于是您可以使用
+ &man.ancontrol.8;。</para>
+
+ </sect4>
+
+ <sect4>
+ <title><command>ifconfig</command> 命令</title> <indexterm><primary>ifconfig</primary></indexterm>
+
+ <para>&man.ifconfig.8; 命令可以用来处理大量与
+ &man.wicontrol.8; 相同的设置,但它还是少了几个选项。
+ 查看 &man.ifconfig.8; 可以了解到命令行参数和选项。</para>
+
+ </sect4>
+
+ </sect3>
+
+ <sect3>
+ <title>支持的卡</title>
+ <sect4>
+ <title>接入点</title>
+
+ <para>现在唯一被支持用于 BSS (作为接入点) 模式的卡都是基于
+ Prism 2、2.5,或 3 芯片组的。要完整的列表,
+ 查看 &man.wi.4;。</para>
+
+ </sect4>
+
+ <sect4>
+ <title>客户端</title>
+
+ <para>现在几乎所有的 802.11b 无线网卡都能被 FreeBSD
+ 支持。大多数基于 Prism、Spectrum24、Hermes、Aironet
+ 和 Raylink 的网卡能在 IBSS (ad-hoc, peer-to-peer, 和
+ BSS)模式下工作。</para>
+
+ </sect4>
+ </sect3>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-bluetooth">
+ <sect1info>
+ <authorgroup>
+ <author><firstname>Pav</firstname>
+ <surname>Lucistnik</surname>
+ <contrib>作者:</contrib>
+ <affiliation>
+ <address><email>pav@oook.cz</email></address>
+ </affiliation>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>袁</firstname>
+ <surname>苏义</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>蓝牙</title>
+
+ <indexterm><primary>蓝牙</primary></indexterm>
+ <sect2>
+ <title>简介</title>
+ <para>Bluetooth (蓝牙) 是一项无线技术,
+ 用于建立带宽为 2.4GHZ,波长为 10 米的私有网络。
+ 网络一般是由便携式设备,比加手机 (cellular phone),
+ 掌上电脑 (handhelds) 和膝上电脑 (laptops)) 以 ad-hoc
+ 形式组成。不象其它流行的无线技术——Wi-Fi,Bluetooth
+ 提供了更高级的服务层面,像类 FTP 的文件服务、文件推送
+ (file pushing)、语音传送、串行线模拟等等。</para>
+
+ <para>在 &os; 里,蓝牙栈 (Bluetooth stack) 通过使用
+ Netgraph 框架 (请看 &man.netgraph.4;) 来的实现。
+ 大量的"Bluetooth USB dongle"由 &man.ng.ubt.4; 驱动程序支持。
+ 基于 Broadcom BCM2033 芯片组的 Bluetooth 设备可以通过
+ &man.ubtbcmfw.4; 和 &man.ng.ubt.4; 驱动程序支持。
+ 3Com Bluetooth PC 卡 3CRWB60-A 由 &man.ng.bt3c.4; 驱动程序支持。
+ 基于 Serial 和 UART 的蓝牙设备由 &man.sio.4;、&man.ng.h4.4;
+ 和 &man.hcseriald.8;。本节介绍 USB Bluetooth dongle
+ 的使用。在 &os; 5.0 及更新的系统里,都可以支持 Bluetooth。</para>
+ </sect2>
+
+ <sect2>
+ <title>插入设备</title>
+ <para>默认的 Bluetooth 设备驱动程序已存在于内核模块里。
+ 接入设备前,您需要将驱动程序加载入内核:</para>
+
+ <screen>&prompt.root; <userinput>kldload ng_ubt</userinput></screen>
+
+ <para>如果系统启动时 Bluetooth 设备已经存在于系统里,
+ 那么从 <filename>/boot/loader.conf</filename> 里加载这个模块:</para>
+
+ <programlisting>ng_ubt_load="YES"</programlisting>
+
+ <para>插入USB dongle。控制台(console)(或syslog中)会出现类似如下的信息:</para>
+
+ <screen>ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2
+ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2
+ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3,
+ wMaxPacketSize=49, nframes=6, buffer size=294</screen>
+
+ <para>复制 <filename>/usr/share/examples/netgraph/bluetooth/rc.bluetooth</filename>
+ 到一个合适的地方,如 <filename>/etc/rc.bluetooth</filename>。
+ 这个脚本用于启动和停止 Bluetooth stack (蓝牙栈)。
+ 最好在拔出设备前停止 stack(stack),当然也不是非做不可。
+ 启动 stack (栈) 时,会得到如下的输出:</para>
+
+ <screen>&prompt.root; <userinput>/etc/rc.bluetooth start ubt0</userinput>
+BD_ADDR: 00:02:72:00:d4:1a
+Features: 0xff 0xff 0xf 00 00 00 00 00
+&lt;3-Slot&gt; &lt;5-Slot&gt; &lt;Encryption&gt; &lt;Slot offset&gt;
+&lt;Timing accuracy&gt; &lt;Switch&gt; &lt;Hold mode&gt; &lt;Sniff mode&gt;
+&lt;Park mode&gt; &lt;RSSI&gt; &lt;Channel quality&gt; &lt;SCO link&gt;
+&lt;HV2 packets&gt; &lt;HV3 packets&gt; &lt;u-law log&gt; &lt;A-law log&gt; &lt;CVSD&gt;
+&lt;Paging scheme&gt; &lt;Power control&gt; &lt;Transparent SCO data&gt;
+Max. ACL packet size: 192 bytes
+Number of ACL packets: 8
+Max. SCO packet size: 64 bytes
+Number of SCO packets: 8</screen>
+
+ </sect2>
+
+ <indexterm><primary>HCI</primary></indexterm>
+ <sect2>
+ <title>主控制器接口 (HCI)</title>
+
+ <para>主控制器接口 (HCI)
+ 提供了通向基带控制器和连接管理器的命令接口及访问硬件状态字和控制寄存器的通道。
+ 这个接口提供了访问蓝牙基带 (Bluetooth baseband) 功能的统一方式。
+ 主机上的 HCI 层与蓝牙硬件上的 HCI 固件交换数据和命令。
+ 主控制器的传输层 (如物理总线) 驱动程序提供两个 HCI
+ 层交换信息的能力。</para>
+
+ <para>为每个蓝牙 (Bluetooth) 设备创建一个
+ <emphasis>hci</emphasis> 类型的 Netgraph 结点。
+ HCI 结点一般连接蓝牙设备的驱动结点 (下行流) 和
+ L2CAP 结点 (上行流)。 所有的HCI操作必须在 HCI
+ 结点上进行而不是设备驱动结点。HCI 结点的默认名是
+ <quote>devicehci</quote>。更多细节请参考
+ &man.ng.hci.4; 的联机手册。</para>
+
+ <para>最常见的任务是发现在 RF proximity
+ 中的蓝牙 (Bluetooth) 设备。这个就叫做
+ <emphasis>质询(inquiry)</emphasis>。质询及 HCI
+ 相关的操作可以由 &man.hccontrol.8; 工具来完成。
+ 以下的例子展示如何找出范围内的蓝牙设备。
+ 在几秒钟内您应该得到一张设备列表。
+ 注意远程主机只有被置于
+ <emphasis>discoverable(可发现)</emphasis>
+ 模式才能答应质询。</para>
+
+ <screen>&prompt.user; <userinput>hccontrol -n ubt0hci inquiry</userinput>
+Inquiry result, num_responses=1
+Inquiry result #0
+ BD_ADDR: 00:80:37:29:19:a4
+ Page Scan Rep. Mode: 0x1
+ Page Scan Period Mode: 00
+ Page Scan Mode: 00
+ Class: 52:02:04
+ Clock offset: 0x78ef
+Inquiry complete. Status: No error [00]</screen>
+
+ <para><literal>BD_ADDR</literal> 是蓝牙设备的特定地址,
+ 类似于网卡的 MAC 地址。需要用此地址与某个设备进一步地通信。
+ 可以为 BD_ADDR 分配由人可读的名字 (human readable name)。
+ 文件 <filename>/etc/bluetooth/hosts</filename>
+ 包含已知蓝牙主机的信息。
+ 下面的例子展示如何获得分配给远程设备的可读名。</para>
+
+ <screen>&prompt.user; <userinput>hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4</userinput>
+BD_ADDR: 00:80:37:29:19:a4
+Name: Pav's T39</screen>
+
+ <para>如果在远程蓝牙上运行质询,您会发现您的计算机是
+ <quote>your.host.name (ubt0)</quote>。
+ 分配给本地设备的名字可随时改变。</para>
+
+ <para>蓝牙系统提供点对点连接 (只有两个蓝牙设备参与)
+ 和点对多点连接。在点对多点连接中,连接由多个蓝牙设备共享。
+ 以下的例子展示如何取得本地设备的活动基带 (baseband)
+ 连接列表。</para>
+
+ <screen>&prompt.user; <userinput>hccontrol -n ubt0hci read_connection_list</userinput>
+Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State
+00:80:37:29:19:a4 41 ACL 0 MAST NONE 0 0 OPEN</screen>
+
+ <para><emphasis>connection handle(连接柄)</emphasis>
+ 在需要终止基带连接时有用。注意:一般不需要手动完成。
+ 栈 (stack) 会自动终止不活动的基带连接。</para>
+
+ <screen>&prompt.root; <userinput>hccontrol -n ubt0hci disconnect 41</userinput>
+Connection handle: 41
+Reason: Connection terminated by local host [0x16]</screen>
+
+ <para>参考 <command>hccontrol help</command>
+ 获取完整的 HCI 命令列表。大部分 HCI
+ 命令不需要超级用户权限。</para>
+
+ </sect2>
+
+ <indexterm><primary>L2CAP</primary></indexterm>
+ <sect2>
+ <title>逻辑连接控制和适配协议(L2CAP)</title>
+
+ <para>逻辑连接控制和适配协议 (L2CAP)
+ 为上层协议提供面向连接和无连接的数据服务,
+ 并提供多协议功能和分割重组操作。L2CAP
+ 充许上层协议和应用软件传输和接收最大长度为
+ 64K 的 L2CAP 数据包。</para>
+
+ <para>L2CAP 基于 <emphasis>通道(channel)</emphasis> 的概念。
+ 通道 (Channel) 是位于基带 (baseband) 连接之上的逻辑连接。
+ 每个通道以多对一的方式绑定一个单一协议 (single protocol)。
+ 多个通道可以绑定同一个协议,但一个通道不可以绑定多个协议。
+ 每个在通道里接收到的 L2CAP 数据包被传到相应的上层协议。
+ 多个通道可共享同一个基带连接。</para>
+
+ <para>为每个蓝牙 (Bluetooth) 设备创建一个
+ <emphasis>l2cap</emphasis> 类型的 Netgraph 结点。
+ L2CAP 结点一般连接 HCI 结点(下行流)和蓝牙设备的驱动结点(上行流)。
+ L2CAP 结点的默认名是 <quote>devicel2cap</quote>。
+ 更多细节请参考 &man.ng.l2cap.4; 的联机手册。</para>
+
+ <para>一个有用的命令是 &man.l2ping.8;,
+ 它可以用来 ping 其它设备。
+ 一些蓝牙实现可能不会返回所有发送给它们的数据,
+ 所以下例中的 <literal>0 bytes</literal> 是正常的。</para>
+
+ <screen>&prompt.root; <userinput>l2ping -a 00:80:37:29:19:a4</userinput>
+0 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=0
+0 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0</screen>
+
+ <para>&man.l2control.8; 工具用于在 L2CAP 上进行多种操作。
+ 以下这个例子展示如何取得本地设备的逻辑连接 (通道)
+ 和基带连接的列表:</para>
+
+ <screen>&prompt.user; <userinput>l2control -a 00:02:72:00:d4:1a read_channel_list</userinput>
+L2CAP channels:
+Remote BD_ADDR SCID/ DCID PSM IMTU/ OMTU State
+00:07:e0:00:0b:ca 66/ 64 3 132/ 672 OPEN
+&prompt.user; <userinput>l2control -a 00:02:72:00:d4:1a read_connection_list</userinput>
+L2CAP connections:
+Remote BD_ADDR Handle Flags Pending State
+00:07:e0:00:0b:ca 41 O 0 OPEN</screen>
+
+ <para>另一个诊断工具是 &man.btsockstat.1;。
+ 它完成与 &man.netstat.1; 类似的操作,
+ 只是用了蓝牙网络相关的数据结构。
+ 以下这个例子显示与 &man.l2control.8; 相同的逻辑连接。</para>
+
+ <screen>&prompt.user; <userinput>btsockstat</userinput>
+Active L2CAP sockets
+PCB Recv-Q Send-Q Local address/PSM Foreign address CID State
+c2afe900 0 0 00:02:72:00:d4:1a/3 00:07:e0:00:0b:ca 66 OPEN
+Active RFCOMM sessions
+L2PCB PCB Flag MTU Out-Q DLCs State
+c2afe900 c2b53380 1 127 0 Yes OPEN
+Active RFCOMM sockets
+PCB Recv-Q Send-Q Local address Foreign address Chan DLCI State
+c2e8bc80 0 250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3 6 OPEN</screen>
+
+ </sect2>
+
+ <indexterm><primary>RFCOMM</primary></indexterm>
+ <sect2>
+ <title>RFCOMM 协议</title>
+
+ <para>RFCOMM 协议提供基于 L2CAP 协议的串行端口模拟。
+ 该协议基于 ETSI TS 07.10 标准。RFCOMM 是一个简单的传输协议,
+ 附加了摸拟 9 针 RS-232(EIATIA-232-E) 串行端口的定义。
+ RFCOMM 协议最多支持 60 个并发连接 (RFCOMM通道)。</para>
+
+ <para>为了实现 RFCOMM,
+ 运行于不同设备上的应用程序建立起一条关于它们之间通信段的通信路径。
+ RFCOMM实际上适用于使用串行端口的应用软件。
+ 通信段是一个设备到另一个设备的蓝牙连接 (直接连接)。</para>
+
+ <para>RFCOMM 关心的只是直接连接设备之间的连接,
+ 或在网络里一个设备与 modem 之间的连接。RFCOMM 能支持其它的配置,
+ 比如在一端通过蓝牙无线技术通讯而在另一端使用有线接口。</para>
+
+ <para>在&os;,RFCOMM 协议在蓝牙套接字层 (Bluetooth sockets layer) 实现。</para>
+ </sect2>
+
+ <indexterm><primary>结对</primary></indexterm>
+ <sect2>
+ <title>设备的结对(Pairing of Devices)</title>
+
+ <para>默认情况下,蓝牙通信是不需要验证的,
+ 任何设备可与其它任何设备对话。一个蓝牙设备 (比如手机)
+ 可以选择通过验证以提供某种特殊服务 (比如拨号服务)。
+ 蓝牙验证一般使用 <emphasis>PIN码(PIN codes)</emphasis>。
+ 一个 PIN 码是最长为 16 个字符的 ASCII 字符串。
+ 用户需要在两个设备中输入相同的PIN码。用户输入了 PIN 码后,
+ 两个设备会生成一个 <emphasis>连接密匙(link key)</emphasis>。
+ 接着连接密钥可以存储在设备或存储器中。
+ 连接时两个设备会使用先前生成的连接密钥。
+ 以上介绍的过程被称为 <emphasis>结对(pairing)</emphasis>。
+ 注意如果任何一方丢失了连接密钥,必须重新进行结对。</para>
+
+ <para>守护进程 &man.hcsecd.8; 负责处理所有蓝牙验证请求。
+ 默认的配置文件是 <filename>/etc/bluetooth/hcsecd.conf</filename>。
+ 下面的例子显示一个手机的 PIN 码被预设为<quote>1234</quote>:</para>
+
+ <programlisting>device {
+ bdaddr 00:80:37:29:19:a4;
+ name "Pav's T39";
+ key nokey;
+ pin "1234";
+ }</programlisting>
+
+ <para>PIN 码没有限制(除了长度)。有些设备
+ (例如蓝牙耳机) 会有一个预置的 PIN 码。<option>-d</option>
+ 开关强制 &man.hcsecd.8; 守护进程处于前台,因此很容易看清发生了什么。
+ 设置远端设备准备接收结对 (pairing),然后启动蓝牙连接到远端设备。
+ 远端设备应该回应接收了结对并请求PIN码。输入与
+ <filename>hcsecd.conf</filename> 中一样的 PIN 码。
+ 现在您的个人计算机已经与远程设备结对了。
+ 另外您也可以在远程设备上初始结点。以下是简单的
+ <application>hcsecd</application> 服务输出样本:</para>
+
+<programlisting>hcsecd[16484]: Got Link_Key_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', link key doesn't exist
+hcsecd[16484]: Sending Link_Key_Negative_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Got PIN_Code_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4
+hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', PIN code exists
+hcsecd[16484]: Sending PIN_Code_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4</programlisting>
+
+ </sect2>
+
+ <indexterm><primary>SDP</primary></indexterm>
+ <sect2>
+ <title>服务发现协议 (SDP)</title>
+ <para>服务发现协议 (SDP) 提供给客户端软件一种方法,
+ 它能发现由服务器软件提供的服务及属性。
+ 服务的属性包括所提供服务的类型或类别,
+ 使用该服务所需要的机制或协议。</para>
+
+ <para>SDP 包括 SDP 服务器和 SDP 客户端之间的通信。
+ 服务器维护一张服务记录列表,它介绍服务器上服务的特性。
+ 每个服务记录包含关于单个服务的信息。通过发出 SDP 请求,
+ 客户端会得到服务记录列表的信息。如果客户端 (或者客户端上的应用软件)
+ 决定使用一个服务,为了使用这个服务它必须与服务提供都建立一个独立的连接。
+ SDP 提供了发现服务及其属性的机制,但它并不提供使用这些服务的机制。</para>
+
+ <para>一般地,SDP客户端按照服务的某种期望特征来搜索服务。
+ 但是,即使没有任何关于由 SDP 服务端提供的服务的预设信息,
+ 有时也能令人满意地发现它的服务记录里所描述的是哪种服务类型。
+ 这种发现所提供服务的过程称为 <emphasis>浏览(browsing)</emphasis>。</para>
+
+ <para>蓝牙 SDP 服务端 &man.sdpd.8; 和命令行客户端
+ &man.sdpcontrol.8; 都包括在了标准的 &os; 安装里。
+ 下面的例子展示如何进行 SDP 浏览查询。</para>
+
+ <screen>&prompt.user; <userinput>sdpcontrol -a 00:01:03:fc:6e:ec browse</userinput>
+Record Handle: 00000000
+Service Class ID List:
+ Service Discovery Server (0x1000)
+Protocol Descriptor List:
+ L2CAP (0x0100)
+ Protocol specific parameter #1: u/int/uuid16 1
+ Protocol specific parameter #2: u/int/uuid16 1
+
+Record Handle: 0x00000001
+Service Class ID List:
+ Browse Group Descriptor (0x1001)
+
+Record Handle: 0x00000002
+Service Class ID List:
+ LAN Access Using PPP (0x1102)
+Protocol Descriptor List:
+ L2CAP (0x0100)
+ RFCOMM (0x0003)
+ Protocol specific parameter #1: u/int8/bool 1
+Bluetooth Profile Descriptor List:
+ LAN Access Using PPP (0x1102) ver. 1.0
+</screen>
+
+ <para>...等等。注意每个服务有一个属性
+ (比如 RFCOMM 通道)列表。
+ 根据服务您可能需要为一些属性做个注释。
+ 有些<quote>蓝牙实现 (Bluetooth implementation)</quote>不支持服务浏览,
+ 可能会返回一个空列表。这种情况,可以搜索指定的服务。
+ 下面的例子展示如何搜索 OBEX Object Push (OPUSH) 服务:</para>
+
+ <screen>&prompt.user; <userinput>sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH</userinput></screen>
+
+ <para>要在 &os; 里为蓝牙客户端提供服务,可以使用 &man.sdpd.8; 服务:</para>
+ <screen>&prompt.root; <userinput>sdpd</userinput></screen>
+
+ <para>需要为远端提供蓝牙服务的本地的服务程序会使用本地 SDP
+ 进程注册服务。像这样的程序就有 &man.rfcomm.pppd.8;。
+ 一旦启动它,就会使用本地 SDP 进程注册蓝牙 LAN 服务。</para>
+
+ <para>使用本地 SDP 进程注册的服务列表,可以通过本地控制通道发出
+ SDP 浏览查询获得:</para>
+
+ <screen>&prompt.root; <userinput>sdpcontrol -l browse</userinput></screen>
+
+ </sect2>
+
+ <sect2>
+ <title>拨号网络 (DUN) 和使用 PPP(LAN) 层面的网络接入</title>
+
+ <para>拨号网络 (DUN) 配置通常与 modem 和手机一起使用。
+ 如下是这一配置所涉及的内容:</para>
+
+ <itemizedlist>
+ <listitem><para>计算机使用手机或 modem 作为无线
+ modem 来连接拨号因特网连入服务器,
+ 或者使用其它的拨号服务;</para></listitem>
+
+ <listitem><para>计算机使用手机或 modem 接收数据请求。</para></listitem></itemizedlist>
+
+ <para>使用 PPP(LAN) 层面的网络接入常使用在如下情形:</para>
+
+ <itemizedlist><listitem><para>单个蓝牙设备的局域网连入;
+ </para></listitem>
+
+ <listitem><para>多个蓝牙设备的局域网接入;
+ </para></listitem>
+
+ <listitem><para>PC 到 PC (使用基于串行线模拟的 PPP 网络)。</para></listitem></itemizedlist>
+
+ <para>在 &os; 中,两个层面使用 &man.ppp.8; 和
+ &man.rfcomm.pppd.8; (一种封装器,可以将 RFCOMM
+ 蓝牙连接转换为 PPP 可操作的东西) 来实现。
+ 在使用任何层面之前,一个新的 PPP 标识必须在
+ <filename>/etc/ppp/ppp.conf</filename> 中建立。
+ 想要实例请参考 &man.rfcomm.pppd.8;。</para>
+
+ <para>在下面的例子中,&man.rfcomm.pppd.8; 用来在
+ NUN RFCOMM 通道上打开一个到 BD_ADDR 为 00:80:37:29:19:a4
+ 的设备的 RFCOMM 连接。具体的 RFCOMM 通道号要通过 SDP
+ 从远端设备获得。也可以手动指定通 RFCOMM,这种情况下
+ &man.rfcomm.pppd.8; 将不能执行 SDP 查询。使用
+ &man.sdpcontrol.8; 来查找远端设备上的 RFCOMM 通道。</para>
+
+ <screen>&prompt.root; <userinput>rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup</userinput></screen>
+
+ <para>为了提供 PPP(LAN) 网络接入服务,必须运行
+ &man.sdpd.8; 服务。一个新的 LAN 客户端条目必须在
+ <filename>/etc/ppp/ppp.conf</filename> 文件中建立。
+ 想要实例请参考 &man.rfcomm.pppd.8;。
+ 最后,在有效地通道号上开始 RFCOMM PPP 服务。
+ RFCOMM PPP 服务会使用本地 SDP 进程自动注册蓝牙 LAN
+ 服务。下面的例子展示如何启动 RFCOMM PPP 服务。</para>
+
+ <screen>&prompt.root; <userinput>rfcomm_pppd -s -C 7 -l rfcomm-server</userinput></screen>
+
+ </sect2>
+
+ <indexterm><primary>OBEX</primary></indexterm>
+ <sect2>
+ <title>OBEX 对象推送 (OBEX Object Push - OPUSH) 层面</title>
+ <para>OBEX协议被广泛地用于移动设备之间简单的文件传输。
+ 它的主要用处是在红外线通信领域,
+ 被用于笔记本或手持设备之间的一般文件传输。</para>
+
+ <para>OBEX 服务器和客户端由第三方软件包
+ <application>obexapp</application>实现,它可以从
+ <filename role="package">comms/obexapp</filename>
+ port 安装。</para>
+
+ <para>OBEX 客户端用于向 OBEX 服务器推入或接出对象。
+ 一个对像可以是(举个例子)商业卡片或约会。 OBEX 客户能通过
+ SDP 从远程设备取得 RFCOMM 通道号。这可以通过指定服务名代替
+ RFCOMM 通道号来完成。支持的服务名是有:IrMC、FTRN 和 OPUSH。
+ 也可以用数字来指定 RFCOMM 通道号。下面是一个 OBEX
+ 会话的例子,一个设备信息对像从手机中被拉出,
+ 一个新的对像被推入手机的目录。</para>
+
+ <screen>&prompt.user; <userinput>obexapp -a 00:80:37:29:19:a4 -C IrMC</userinput>
+obex&gt; get
+get: remote file&gt; telecom/devinfo.txt
+get: local file&gt; devinfo-t39.txt
+Success, response: OK, Success (0x20)
+obex&gt; put
+put: local file&gt; new.vcf
+put: remote file&gt; new.vcf
+Success, response: OK, Success (0x20)
+obex&gt; di
+Success, response: OK, Success (0x20)</screen>
+
+ <para>为了提供 OBEX 推入服务,&man.sdpd.8;
+ 必须处于运行状态。必须创建一个根目录用于存放所有进入的对象。
+ 根文件夹的默认路径是 <filename>/var/spool/obex</filename>。
+ 最后,在有效的 RFCOMM 通道号上开始 OBEX 服务。OBEX 服务会使用
+ SDP 进程自动注册 OBEX 对象推送 (OBEX Object Push) 服务。
+ 下面的例子展示如何启动 OBEX 服务。</para>
+
+ <screen>&prompt.root; <userinput>obexapp -s -C 10</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>串口(SP)层面</title>
+ <para>串口(SP)层面允许蓝牙设备完成 RS232 (或类似) 串口线的仿真。
+ 这个层面所涉及到情形是,
+ 通过虚拟串口使用蓝牙代替线缆来处理以前的程序。</para>
+
+ <para>工具 &man.rfcomm.sppd.1; 来实现串口层。
+ <quote>Pseudo tty</quote> 用来作为虚拟的串口。
+ 下面的例子展示如何连接远程设备的串口服务。
+ 注意您不必指定 RFCOMM 通道——&man.rfcomm.sppd.1;
+ 能够通过 SDP 从远端设备那里获得。
+ 如果您想代替它的话,可以在命令行里指定 RFCOMM
+ 通道来实现:</para>
+
+ <screen>&prompt.root; <userinput>rfcomm_sppd -a 00:07:E0:00:0B:CA -t /dev/ttyp6</userinput>
+rfcomm_sppd[94692]: Starting on /dev/ttyp6...</screen>
+
+ <para>一旦连接上,<quote>pseudo tty</quote>就可以充当串口了:</para>
+
+ <screen>&prompt.root; <userinput>cu -l ttyp6</userinput></screen>
+
+ </sect2>
+
+ <sect2>
+ <title>问题解答</title>
+
+ <sect3>
+ <title>不能连接远端设备</title>
+ <para>一些较老的蓝牙设备并不支持角色转换
+ (role switching)。默认情况下,&os; 接受一个新的连接时,
+ 它会尝试进行角色转换并成为主控端 (master)。
+ 不支持角色转换的设备将无法连接。
+ 注意角色转换是在新连接建立时运行的,
+ 因此如果远程设备不支持角色转换,就不可能向它发出请求。
+ 一个 HCI 选项用来在本地端禁用角色转换。</para>
+
+ <screen>&prompt.root; <userinput>hccontrol -n ubt0hci write_node_role_switch 0</userinput></screen>
+
+ </sect3>
+
+ <sect3>
+ <title>有些东西正发生错误,我能查看发生了什么吗?</title>
+ <para>是的,您能。使用第三方软件包
+ <application>hcidump-1.5</application>,这个可以从<ulink
+ url="http://www.geocities.com/m_evmenkin/"></ulink>下载到。
+ 工具<application>hcidump</application> 类似于 &man.tcpdump.1;。
+ 它可以用来显示蓝牙数据包的内容并将其存入文件中。</para>
+ </sect3>
+
+ </sect2>
+
+ </sect1>
+
+
+ <sect1 id="network-bridging">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Steve</firstname>
+ <surname>Peterson</surname>
+ <contrib>作者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>袁</firstname>
+ <surname>苏义</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>桥接</title>
+
+ <sect2>
+ <title>简介</title>
+ <indexterm>
+ <primary>IP 子网</primary>
+ </indexterm>
+ <indexterm>
+ <primary>桥接</primary>
+ </indexterm>
+ <para>有时候需要将一个物理网络分成两个独立的网段,
+ 而无需创建新的 IP 子网和连接两个网段的路由器。
+ 以这种方式连接两个网络的设备称为<quote>网桥 (bridge)</quote>。
+ 有两个网络接口的 FreeBSD 系统可以作为网桥。</para>
+
+ <para>网桥通过学习每个网络接口上的 MAC 层地址 (以太网地址) 工作。
+ 只当数据包的源地址和目标地址处于不同网络时网桥才进行转发。</para>
+
+ <para>在很多方面,网桥就像一个带有很少端口的以太网交换机。</para>
+ </sect2>
+
+ <sect2>
+ <title>适合桥接的情况</title>
+
+ <para>目前,有两种常见的情况下使用网桥。</para>
+
+ <sect3>
+ <title>网段上存在高流量</title>
+
+ <para>一种情况是您的物理网段流量过载,
+ 但是您不希望划分子网以路由器连接两个子网。</para>
+
+ <para>让我们考虑一个关于报社的例子,
+ 它的编辑部和产品部处于同一子网中。
+ 所有的编辑用户都使用服务器 <hostid>A</hostid>
+ 的文件服务,而产品部使用服务器 <hostid>B</hostid>。
+ 一个以太网将所有的用户连接在一起,
+ 高的流量负载使得网络速度变慢。</para>
+
+ <para>如果编辑部的用户能被分隔到一个网段中,
+ 产品部用户被分隔到另一个网段中那么这两个网段可以通过网桥连接起来。
+ 只当数据包目标为网桥<quote>其它</quote>端接口时,
+ 它才会被传到其它的网络上——这样就减少了各个网络的拥塞。</para>
+ </sect3>
+
+ <sect3>
+ <title>过滤/数据传输防火墙</title>
+ <indexterm>
+ <primary>防火墙</primary>
+ </indexterm>
+ <indexterm>
+ <primary>网络地址转换 (NAT)</primary>
+ </indexterm>
+
+ <para>第二种常见的情况是需要防火墙的地方没有进行网络地址转换(NAT)。</para>
+
+ <para>一个例子是一个小公司,它通过 DSL 或 ISDN 连接到 ISP。
+ 它拥有 13 个 ISP 分配的全局 IP 地址和 10 台 PC。
+ 在这种情况下,由于划分子网的问题,
+ 使用基于路由的防火墙存在一定难度。</para>
+
+ <indexterm>
+ <primary>路由器</primary>
+ </indexterm>
+ <indexterm>
+ <primary>DSL</primary>
+ </indexterm>
+ <indexterm>
+ <primary>ISDN</primary>
+ </indexterm>
+ <para>一个基于网桥的防火墙可以成接在 DSL/ISDN
+ 路由器的后面而免去了所有的 IP 号问题。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>配置网桥</title>
+
+ <sect3>
+ <title>选择网络接口卡</title>
+
+ <para>一个网桥至少需要两块网卡才能运行。
+ 不幸的是,并不是所有的网卡都能被 FreeBSD 4.0
+ 支持用于桥接。阅读 &man.bridge.4;
+ 了解所支持网卡的细节。</para>
+
+ <para>在继续之前要先安装并测试这两块网卡。</para>
+ </sect3>
+
+ <sect3>
+ <title>改变内核配置</title>
+ <indexterm>
+ <primary>内核 选项</primary>
+ <secondary>BRIDGE 选项</secondary>
+ </indexterm>
+
+ <para>为了激活内核对桥接的支持,增加以下语句:</para>
+
+ <programlisting>options BRIDGE</programlisting>
+
+ <para>到您的内核配置文件里,然后重建内核。</para>
+ </sect3>
+
+ <sect3>
+ <title>防火墙支持</title>
+ <indexterm><primary>防火墙</primary></indexterm>
+ <para>如果您打算把网桥作为防火墙来使用,
+ 则还需要加入 <literal>IPFIREWALL</literal> 的设置。
+ 请参考 <xref linkend="firewalls">
+ 以了解关于将网桥配置为防火墙的其它信息。</para>
+
+ <para>如果允许非IP(non-IP)数据包 (比如 ARP) 穿过网桥,
+ 必须设置一个防火墙 (firewall) 选项。这个选项是
+ <literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal>。
+ 注意:这个选项改变了默认的规则使得防火墙接受任何的数据包。
+ 在您设置这些规则前,请确认这些规则可能会产生什么后果。</para>
+ </sect3>
+
+ <sect3>
+ <title>数据传输支持</title>
+
+ <para>如果您希望将网桥作为一个数据传输器,
+ 您需要向内核文件中加入 <literal>DUMMYNET</literal>
+ 选项。阅读 &man.dummynet.4; 以做进一步了解。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>激活网桥</title>
+
+ <para>增加下行:</para>
+
+ <programlisting>net.link.ether.bridge=1</programlisting>
+
+ <para>到 <filename>/etc/sysctl.conf</filename> 里,
+ 以便在运行时激活网桥,然后加下行:</para>
+
+ <programlisting>net.link.ether.bridge_cfg=<replaceable>if1</replaceable>,<replaceable>if2</replaceable></programlisting>
+
+ <para>以便在指定的接口上激活网桥
+ (使用您的两个网络接口的名字替换 <replaceable>if1</replaceable>
+ 和 <replaceable>if2</replaceable> )。如果您希望用 &man.ipfw.8;
+ 来过滤桥接的数据包,您还应该加入:</para>
+
+ <programlisting>net.link.ether.bridge_ipfw=1</programlisting>
+
+ <para>这样一行。</para>
+
+ <para>对于&os; 5.2-RELEASE 及以后的版本,使用下面几行来代替:</para>
+
+ <programlisting>net.link.ether.bridge.enable=1
+net.link.ether.bridge.config=<replaceable>if1</replaceable>,<replaceable>if2</replaceable>
+net.link.ether.bridge.ipfw=1</programlisting>
+
+ </sect2>
+
+ <sect2>
+ <title>其它信息</title>
+
+ <para>如果您希望可以从网络上 &man.ssh.1; 进入网桥,
+ 给一个网卡分配 IP 地址就可以了。
+ 原则上给两张卡分配一个地址是很不好的。</para>
+
+ <para>如果网络中有多个网桥,
+ 任何两个工作站之间的路径不能多于一条。
+ 技术上说,它的意思是不支持生成连接树管理。</para>
+
+ <para>网桥会增加 &man.ping.8; 的延迟时间,
+ 尤其是不同网段之间的传输。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-diskless">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Jean-Fran&ccedil;ois</firstname>
+ <surname>Dock&egrave;s</surname>
+ <contrib>更新: </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Alex</firstname>
+ <surname>Dupre</surname>
+ <contrib>重新组织及增强:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>袁</firstname>
+ <surname>苏义</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>无盘操作</title>
+
+ <indexterm>
+ <primary>无盘工作站</primary>
+ </indexterm>
+ <indexterm>
+ <primary>无盘操作</primary>
+ </indexterm>
+
+ <para>FreeBSD 主机可以从网络启动而无需本地磁盘就可操作,
+ 使用的是从 <acronym>NFS</acronym> 服务器装载的文件系统。
+ 除了标准的配置文件,无需任何的系统修改。
+ 很容易设置这样的系统因为所有必要的元素都很容易得到:</para>
+ <itemizedlist><listitem>
+ <para>至少有两种可能的方法从网络加载内核:</para>
+ <itemizedlist><listitem>
+ <para><acronym>PXE</acronym>:&intel;
+ 的先启动执行环境 (Preboot Xecution Environment)
+ 系统是一种灵活的引导 ROM 模式,这个 ROM
+ 内建在一些网卡或主板的中。查看 &man.pxeboot.8;
+ 以获取更多细节。</para>
+ </listitem> <listitem>
+ <para><application>Etherboot</application> port (<filename
+ role="package">net/etherboot</filename>)
+ 产生通过网络加载内核的可 ROM 代码。这些代码可以烧入网卡上的
+ PROM 上,或从本地软盘 (或硬盘) 驱动器加载,或从运行着的
+ &ms-dos; 系统加载。它支持多种网卡。</para>
+ </listitem></itemizedlist></listitem>
+
+ <listitem>
+ <para>一个样板脚本
+ (<filename>/usr/share/examples/diskless/clone_root</filename>)
+ 简化了对服务器上的工作站根文件系统的创建和维护。
+ 这个脚本需要少量的自定义,但您能很快的熟悉它。</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>/etc</filename>
+ 存在标准的系统启动文件用于侦测和支持无盘的系统启动。</para>
+ </listitem>
+
+ <listitem>
+ <para>可以向 <acronym>NFS</acronym>
+ 文件或本地磁盘进行交换(如果需要的话)。</para>
+ </listitem></itemizedlist>
+
+ <para>设置无盘工作站有许多方法。
+ 有很多相关的元素大部分可以自定义以适合本地情况。
+ 以下将介绍一个完整系统的安装,强调的是简单性和与标准
+ FreeBSD 启动脚本的兼容。介绍的系统有以下特性:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>无盘工作站使用一个共享的只读 <filename>/</filename>
+ 文件系统和一个共享的只读<filename>/usr</filename>。</para>
+ <para>root 文件系统是一份标准的 FreeBSD 根文件系统
+ (一般是服务器的),只是一些配置文件被特定于无盘操作的配置文件覆盖。</para>
+ <para>root 文件系统必须可写的部分被 &man.mfs.8;
+ (&os; 4.X) 或 &man.md.4; (&os; 5.X) 文件系统覆盖。
+ 任何的改写在重启后都会丢失。</para>
+ </listitem>
+ <listitem>
+ <para>内核由 <application>etherboot</application> 或
+ <acronym>PXE</acronym> 传送和加载,
+ 有些情况可能会指定使用其中之一。</para>
+ </listitem>
+ </itemizedlist>
+
+ <caution><para>如上所述,这个系统是不安全的。
+ 它应该处于网络的受保护区域并不被其它主机信任。</para>
+ </caution>
+
+ <para>这部分所有的信息都已使用 &os;releases 4.9-RELEASE 和
+ 5.2.1-RELEASE 测试过。文本主是使用 4.X 格式组织的。为适应
+ 5.X 的改变,都有注释被加入。</para>
+
+ <sect2>
+ <title>背景信息</title>
+
+ <para>设置无盘工作站相对要简单而又易出错。
+ 有时分析一些原因是很难的。例如:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>编译时选项在运行时可能产生不同的行为。</para>
+ </listitem>
+
+ <listitem>
+ <para>出错信息经常是加密了的或根本就没有。</para>
+ </listitem></itemizedlist>
+
+ <para>在这里,
+ 涉及到的一些背景知识对于可能出现的问题的解决是很有帮助的。</para>
+
+ <para>要成功地引导系统还有些操作需要做。</para>
+
+ <itemizedlist><listitem>
+ <para>机子需要获取初始的参数,如它的 IP
+ 地址、执行文件、服务器名、根路径。这个可以使用
+ <acronym></acronym>或 BOOTP 协议来完成。
+ <acronym>DHCP</acronym> 是 BOOTP 的兼容扩展,
+ 并使用相同的端口和基本包格式。</para>
+
+ <para>只使用 BOOTP 来配置系统也是可行的。
+ &man.bootpd.8; 服务程序被包含在基本的
+ &os; 系统里。</para>
+
+ <para>不过,<acronym>DHCP</acronym> 相比
+ BOOTP 有几个好处 (更好的配置文件,使用 <acronym>PXE</acronym>
+ 的可能性,以及许多其它并不直接相关的无盘操作),
+ 接着我们会要描述一个 <acronym>DHCP</acronym> 配置,
+ 可能的话会利用与使用 &man.bootpd.8;
+ 相同的例子。这个样板配置会使用<application>ISC DHCP</application>
+ 软件包 (3.0.1.r12 发行版安装在测试服务器上)。</para>
+ </listitem>
+
+ <listitem>
+ <para>机子需要传送一个或多个程序到本地内存。
+ <acronym>TFTP</acronym> 或 <acronym>NFS</acronym>
+ 会被使用。选择<acronym>TFTP</acronym> 还是 <acronym>NFS</acronym>
+ 需要在几个地方的<quote>编译时间</quote>选项里设置。
+ 通常的错误源是为文件名指定了错误的协议:<acronym>TFTP</acronym>
+ 通常从服务器里的一个单一目录传送所有文件,并需要相对这个目录的文件名。
+ <acronym>NFS</acronym> 需要的是绝对文件路径。</para>
+ </listitem>
+
+ <listitem>
+ <para>介于启动程序和内核之间的可能的部分需要被初始化并执行。
+ 在这部分有几个重要的变量:</para>
+
+ <itemizedlist><listitem>
+ <para><acronym>PXE</acronym> 会装入
+ &man.pxeboot.8;——它是 &os; 第三阶段装载器的修改版。
+ &man.loader.8; 会获得许多参数用于系统启动,
+ 并在传送控制之前把它们留在内核环境里。
+ 在这种情况下,使用 <filename>GENERIC</filename>
+ 内核就可能了。</para>
+ </listitem>
+
+ <listitem>
+ <para><application>Etherboot</application>
+ 会做很少的准备直接装载内核。
+ 您要使用指定的选项建立 (build) 内核。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><acronym>PXE</acronym> 和
+ <application>Etherboot</application> 在 4.X
+ 系统里工作得一样的好。因为 5.X 内核通常让 &man.loader.8;
+ 做了更多的事情,<acronym>PXE</acronym> 比较适合 5.X 系统。</para>
+
+ <para>如果您的 <acronym>BIOS</acronym> 和网卡支持
+ <acronym>PXE</acronym>,您应该使用它。当然,
+ 使用 <application>Etherboot</application> 依然可以启动
+ 5.X 系统。</para>
+ </listitem>
+
+ <listitem>
+ <para>最后,机子需要访问它的文件系统。
+ <acronym>NFS</acronym> 使用在所有的情况下。</para>
+ </listitem></itemizedlist>
+
+ <para>查看 &man.diskless.8; 手册页。</para>
+ </sect2>
+
+ <sect2>
+ <title>安装说明</title>
+
+ <sect3>
+ <title>配置使用<application>ISC DHCP</application></title>
+ <indexterm>
+ <primary>DHCP</primary>
+ <secondary>无盘操作</secondary>
+ </indexterm>
+
+ <para><application>ISC DHCP</application>
+ 服务器可以回应 BOOTP 和 <acronym>DHCP</acronym>
+ 的请求。</para>
+
+ <para>对于4.9的发行版,<application>ISC DHCP 3.0</application>
+ 并不属于基本系统。首先您需要安装
+ <filename role="package">net/isc-dhcp3-server</filename>
+ port 或相应的<quote>包</quote>。</para>
+
+ <para>一旦安装了 <application>ISC DHCP</application>,
+ 还需要一个配置文件才能运行 (通常名叫
+ <filename>/usr/local/etc/dhcpd.conf</filename>)。
+ 这里有个注释过的例子,里边主机 <hostid>margaux</hostid>
+ 使用 <application>Etherboot</application>,
+ 而主机<hostid>corbieres</hostid> 使用 <acronym>PXE</acronym>:</para>
+
+ <programlisting>
+default-lease-time 600;
+max-lease-time 7200;
+authoritative;
+
+option domain-name "example.com";
+option domain-name-servers 192.168.4.1;
+option routers 192.168.4.1;
+
+subnet 192.168.4.0 netmask 255.255.255.0 {
+ use-host-decl-names on; <co id="co-dhcp-host-name">
+ option subnet-mask 255.255.255.0;
+ option broadcast-address 192.168.4.255;
+
+ host margaux {
+ hardware ethernet 01:23:45:67:89:ab;
+ fixed-address margaux.example.com;
+ next-server 192.168.4.4; <co id="co-dhcp-next-server">
+ filename "/data/misc/kernel.diskless"; <co id="co-dhcp-filename">
+ option root-path "192.168.4.4:/data/misc/diskless"; <co id="co-dhcp-root-path">
+ }
+ host corbieres {
+ hardware ethernet 00:02:b3:27:62:df;
+ fixed-address corbieres.example.com;
+ next-server 192.168.4.4;
+ filename "pxeboot";
+ option root-path "192.168.4.4:/data/misc/diskless";
+ }
+}
+ </programlisting>
+
+ <calloutlist>
+ <callout arearefs="co-dhcp-host-name">
+ <para>这个选项告诉 <application>dhcpd</application>
+ 发送<literal>host</literal> 里声明的用于无盘主机的主机名的值。
+ 另外可能会增加一个
+ <literal>option host-name <replaceable>margaux</replaceable></literal>
+ 到 <literal>host</literal> 声明里。</para>
+ </callout>
+
+ <callout arearefs="co-dhcp-next-server">
+ <para><literal>next-server</literal> 正式指定
+ <acronym>TFTP</acronym> 或 <acronym>NFS</acronym>
+ 服务用于载入装载器或内核文件
+ (默认使用的是相同的主机作为<acronym>DHCP</acronym>
+ 服务器)。</para>
+ </callout>
+
+ <callout arearefs="co-dhcp-filename">
+ <para><literal>filename</literal>
+ 正式定义这样的文件——<application>etherboot</application>
+ 或 <acronym>PXE</acronym> 为执行下一步将装载它。
+ 根据使用的传输方式,它必须要指定。
+ <application>Etherboot</application> 可以被编译来使用
+ <acronym>NFS</acronym> 或 <acronym>TFTP</acronym>。
+ &os; port 默认配置了<acronym>NFS</acronym>。
+ <acronym>PXE</acronym> 使用 <acronym>TFTP</acronym>,
+ 这就是为什么在这里使用相对文件名 (这可能依赖于
+ <acronym>TFTP</acronym> 服务器配置,不过会相当典型)。
+ 同样,<acronym>PXE</acronym> 会装载 <filename>pxeboot</filename>,
+ 而不是内核。另外有几个很有意思的可能,如从 &os; CD-ROM
+ 的 <filename role="directory">/boot</filename> 目录装载
+ <filename>pxeboot</filename> (因为 &man.pxeboot.8; 能够装载
+ <filename>GENERIC</filename> 内核,这就使得可以使用
+ <acronym>PXE</acronym> 从远程的 CD-ROM 里启动)。</para>
+ </callout>
+
+ <callout arearefs="co-dhcp-root-path">
+ <para><literal>root-path</literal> 选项定义到根
+ (root) 文件系统的路径,通常是 <acronym>NFS</acronym>
+ 符号。当使用 <acronym>PXE</acronym> 时,只要您不启用内核里的
+ BOOTP 选项,可以不管主机的IP。<acronym>NFS</acronym>
+ 服务器然后就如同 <acronym>TFTP</acronym> 一样。</para>
+ </callout></calloutlist>
+
+ </sect3>
+ <sect3>
+ <title>配置使用BOOTP</title>
+ <indexterm>
+ <primary>BOOTP</primary>
+ <secondary>无盘操作</secondary>
+ </indexterm>
+
+ <para>这里紧跟的是一个等效的 <application>bootpd</application>
+ 配置 (减少到一个客户端)。这个可以在
+ <filename>/etc/bootptab</filename> 里找到。</para>
+
+ <para>请注意:为了使用BOOTP,<application>etherboot</application>
+ 必须使用非默认选项 <literal>NO_DHCP_SUPPORT</literal>
+ 来进行编译,而且 <acronym>PXE</acronym> <emphasis> 需要
+ </emphasis> <acronym>DHCP</acronym>。<application>bootpd</application>
+ 的唯一可见的好处是它存在于基本系统中。</para>
+
+ <programlisting>
+.def100:\
+ :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\
+ :sm=255.255.255.0:\
+ :ds=192.168.4.1:\
+ :gw=192.168.4.1:\
+ :hd="/tftpboot":\
+ :bf="/kernel.diskless":\
+ :rp="192.168.4.4:/data/misc/diskless":
+
+margaux:ha=0123456789ab:tc=.def100</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>使用<application>Etherboot</application>准备启动程序</title>
+
+ <indexterm>
+ <primary>Etherboot</primary>
+ </indexterm>
+
+ <para><ulink url="http://etherboot.sourceforge.net">Etherboot
+ 的网站</ulink> 包含有<ulink
+ url="http://etherboot.sourceforge.net/doc/html/userman/t1.html">更多的文档
+ </ulink>——主要瞄准的是 Linux 系统,但无疑包含有有用的信息。
+ 如下列出的是关于在 FreeBSD 系统里使用
+ <application>Etherboot</application>。</para>
+
+ <para>首先您必须安装<filename
+ role="package">net/etherboot</filename> 包或 port。</para>
+
+ <para>您可以改变 <application>Etherboot</application> 的配置
+ (如使用 <acronym>TFTP</acronym> 来代替 <acronym>NFS</acronym>),
+ 方法是修改 <filename>Config</filename> 文件——在
+ <application>Etherboot</application> 源目录里。</para>
+
+ <para>对于我们的设置,我们要使用一张启动软盘。
+ 对于其它的方法(PROM,或 &ms-dos;程序),
+ 请参考 <application>Etherboot</application> 文档。</para>
+
+ <para>想要使用启动软盘,先插入一张软盘到安装有
+ <application>Etherboot</application> 的机器的驱动器里,
+ 然后把当前路径改到 <filename>src</filename>
+ 目录——在 <application>Etherboot</application> 树下,
+ 接着输入:</para>
+
+ <screen>
+&prompt.root; <userinput>gmake bin32/<replaceable>devicetype</replaceable>.fd0</userinput>
+ </screen>
+
+ <para><replaceable>devicetype</replaceable>
+ 依赖于无盘工作站上的以太网卡的类型。
+ 参考在同一个目录下的 <filename>NIC</filename>
+ 文件确认正确的 <replaceable>devicetype</replaceable>。</para>
+
+ </sect3>
+
+ <sect3>
+ <title>使用<acronym>PXE</acronym>启动</title>
+
+ <para>默认地,&man.pxeboot.8; 装载器通过 <acronym>NFS</acronym>
+ 装载内核。它可以编译来使用 <acronym>TFTP</acronym>——通过在文件
+ <filename>/etc/make.conf</filename> 里指定
+ <literal>LOADER_TFTP_SUPPORT</literal> 选项来代替。查看
+ <filename>/etc/defaults/make.conf</filename> 里的注释
+ (或5.X系统的 <filename>/usr/share/examples/etc/make.conf</filename>)
+ 可以获得指导。</para>
+
+ <para>其它有两个未说明的 <filename>make.conf</filename>
+ 选项——它可能对于设置一系列控制台无盘机器会有用:
+ <literal>BOOT_PXELDR_PROBE_KEYBOARD</literal>和
+ <literal>BOOT_PXELDR_ALWAYS_SERIAL</literal>
+ (后者只存在于 &os; 5.X 里)。</para>
+
+ <para>当机器启动里,要使用 <acronym>PXE</acronym>,
+ 通常需要选择 <literal>Boot from network</literal>
+ 选项——在 <acronym>BIOS</acronym> 设置里,
+ 或者在 PC 初始化的时候输入一个功能键 (function key)。</para>
+ </sect3>
+
+ <sect3>
+ <title>配置 <acronym>TFTP</acronym> 和 <acronym>NFS</acronym> 服务器</title>
+
+ <indexterm>
+ <primary>TFTP</primary>
+ <secondary>无盘操作</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>NFS</primary>
+ <secondary>无盘操作</secondary>
+ </indexterm>
+
+ <para>如果您正在使用 <acronym>PXE</acronym> 或
+ <application>Etherboot</application>——配置使用了
+ <acronym>TFTP</acronym>,那么您需要在文件服务器上启用
+ <application>tftpd</application>:</para>
+ <procedure>
+ <step>
+ <para>建立一个目录——从那里 <application>tftpd</application>
+ 可以提供文件服务,如 <filename>/tftpboot</filename>。</para>
+ </step>
+
+ <step>
+ <para>把这一行加入到 <filename>/etc/inetd.conf</filename>里:</para>
+
+ <programlisting>tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot</programlisting>
+
+ <note><para>好像有一些版本的 <acronym>PXE</acronym>
+ 需要 <acronym>TCP</acronym> 版本的 <acronym>TFTP</acronym>。
+ 在这种情况下,加入第二行,使用 <literal>stream tcp</literal>
+ 来代替 <literal>dgram udp</literal>。</para>
+ </note>
+ </step>
+ <step>
+ <para>让 <application>inetd</application> 重读它的配置文件:</para>
+ <screen>&prompt.root; <userinput>kill -HUP `cat /var/run/inetd.pid`</userinput></screen>
+ </step>
+ </procedure>
+
+ <para>您可把 <filename>tftpboot</filename> 目录放到服务器上的什何地方。
+ 确定这个位置设置在 <filename>inetd.conf</filename> 和
+ <filename>dhcpd.conf</filename> 里。</para>
+
+ <para>在所有的情况下,您都需要启用 <acronym>NFS</acronym>,
+ 并且 <acronym>NFS</acronym> 服务器上导出相应的文件系统。</para>
+
+ <procedure><step>
+ <para>把这一行加入到<filename>/etc/rc.conf</filename>里:</para>
+ <programlisting>nfs_server_enable="YES"</programlisting></step>
+
+ <step>
+ <para>通过往 <filename>/etc/exports</filename>
+ 里加入下面几行(调整<quote>载入点</quote>列,
+ 并且使用无盘工作站的名字替换
+ <replaceable>margaux corbieres</replaceable>),
+ 导出文件系统——无盘根目录存在于此:</para>
+
+ <programlisting><replaceable>/data/misc</replaceable> -alldirs -ro <replaceable>margaux corbieres</replaceable></programlisting>
+ </step>
+ <step>
+ <para>让 <application>mountd</application>
+ 重读它的配置文件。如果您真的需要启用第一步的
+ <filename>/etc/rc.conf</filename> 里 <acronym>NFS</acronym>,
+ 您可能就要重启系统了。</para>
+ <screen>&prompt.root; <userinput>kill -HUP `cat /var/run/mountd.pid`</userinput></screen>
+ </step>
+ </procedure>
+
+ </sect3>
+
+ <sect3>
+ <title>建立无盘内核</title>
+
+ <indexterm>
+ <primary>无盘操作</primary>
+ <secondary>内核配置</secondary>
+ </indexterm>
+
+ <para>如果您在使用 <application>Etherboot</application>,
+ 您需要为无盘客户端建立内核配置文件,
+ 使用如下选项(除了常使用的外):</para>
+
+ <programlisting>
+options BOOTP # Use BOOTP to obtain IP address/hostname
+options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info
+ </programlisting>
+
+ <para>您可能也想使用 <literal>BOOTP_NFSV3</literal>,
+ <literal>BOOT_COMPAT</literal> 和 <literal>BOOTP_WIRED_TO</literal>
+ (参考 4.X 里的 <filename>LINT</filename> 或5.X里的
+ <filename>NOTES</filename>)。</para>
+
+ <para>这些名字具有历史性,并且有些有些误导,
+ 因为它们实际上启用了内核里 (它可能强制限制 BOOTP 或
+ <acronym>DHCP</acronym> 的使用),与 <acronym>DHCP</acronym>
+ 和 BOOTP 的无关的应用。</para>
+
+ <para>编译内核(参考<xref linkend="kernelconfig">),
+ 然后将它复制到 <filename>dhcpd.conf</filename>
+ 里指定的地方。</para>
+
+ <note>
+ <para>当使用 <acronym>PXE</acronym> 里,
+ 使用以上选项建立内核并不做严格要求(尽管建议这样做)。
+ 启用它们会在内核启动时引起更多的 <acronym>DHCP</acronym>
+ 提及过的请求,带来的小小的风险是在有些特殊情况下新值和由
+ &man.pxeboot.8; 取回的值之间的不一致性。
+ 使用它们的好处是主机名会被附带设置。否则,
+ 您就需要使用其它的方法来设置主机名,如在客户端指定的
+ <filename>rc.conf</filename> 文件里。</para>
+ </note>
+
+ <note>
+ <para>为了使带有 <application>Etherboot</application>
+ 的 5.X 内核可引导,就需要把设备提示 (device hint)
+ 编译进去。通常要在配置文件(查看 <filename>NOTES</filename>
+ 配置注释文件) 里设置下列选项:</para>
+
+ <programlisting>hints "GENERIC.hints"</programlisting></note>
+
+ </sect3>
+
+ <sect3>
+ <title>准备根(root)文件系统</title>
+
+ <indexterm>
+ <primary>根文件系统</primary>
+ <secondary>无盘操作</secondary>
+ </indexterm>
+
+ <para>您需要为无盘工作站建立根文件系统,位置列在
+ <filename>dhcpd.conf</filename> 里的 <literal>root-path</literal>
+ 里边。下面部分描述了要这样做的两种方法:</para>
+
+ <sect4>
+ <title>使用 <filename>clone_root</filename> 脚本</title>
+
+ <para>这是建立根文件系统最快的方法,只是目前只在 &os;4.X
+ 里支持。这个 shell 脚本位于
+ <filename>/usr/share/examples/diskless/clone_root</filename>
+ 并且需要定制,至少需要调整将会被建立文件系统的地方
+ (<literal>DEST</literal> 可变)。</para>
+
+ <para>参考用于指导的脚本的最前边的注释。
+ 它们说明了如何建立一个基本文件系统,
+ 并且如果根据特定版本的无盘工作站、子网或个人工作站选择性地忽略。
+ 它们也为无盘的 <filename>/etc/fstab</filename> 的
+ <filename>/etc/rc.conf</filename> 文件给出了例子。</para>
+
+ <para>在 <filename>/usr/share/examples/diskless</filename> 里的
+ <filename>README</filename> 文件包含了许多有趣的背景信息,
+ 但是,他们同 <filename>diskless</filename> 目录里的其它例子一起,
+ 实际上说明了一种配置方法——与被 <filename>clone_root</filename>
+ 和 <filename role="directory">/etc</filename>
+ 里的系统启动脚本使用的完全不同,这个有点迷惑人。
+ 使用它们只用做参考,
+ 除非您使用它们所描述的方法——这种情况下您需要定制
+ <filename>rc</filename> 脚本。</para>
+ </sect4>
+
+ <sect4>
+ <title>使用标准的 <command>make world</command> 程序</title>
+
+ <para>这种方法可以应用到 &os; 4.X 或 5.X,
+ 而且会安装一个彻底干净的系统(不仅仅是根文件系统)到
+ <envar>DESTDIR</envar>。您需要做的就是简单地执行下面的脚本:</para>
+
+ <programlisting>#!/bin/sh
+export DESTDIR=/data/misc/diskless
+mkdir -p ${DESTDIR}
+cd /usr/src; make world && make kernel
+cd /usr/src/etc; make distribution</programlisting>
+
+ <para>一旦完成,您可能需要定制 <filename>/etc/rc.conf</filename>
+ 和 <filename>/etc/fstab</filename>——根据您的需要放到
+ <envar>DESTDIR</envar>里。</para>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>配置 swap(交换)</title>
+
+ <para>如果需要,位于服务器上的交换文件可以通过
+ <acronym>NFS</acronym> 来访问。完成它的一种普遍使用的方法在
+ 5.X 的发行版里已不再继续(使用)。</para>
+
+ <sect4>
+ <title><acronym>NFS</acronym>与 &os; 4.X 之间的 Swap(交换)</title>
+
+ <para>交换文件的位置和大小可以使用BOOTP/<acronym>DHCP</acronym>
+ 来指定,&os; 指定的选项是 128 和 129。用于
+ <application>ISC DHCP 3.0</application> 或
+ <application>bootpd</application>的配置文件例子如下:</para>
+
+ <procedure><step><para>把下边几行加到 <filename>dhcpd.conf</filename> 里:</para>
+ <programlisting>
+# Global section
+option swap-path code 128 = string;
+option swap-size code 129 = integer 32;
+
+host margaux {
+ ... # Standard lines, see above
+ option swap-path <replaceable>"192.168.4.4:/netswapvolume/netswap"</replaceable>;
+ option swap-size <replaceable>64000</replaceable>;
+}
+ </programlisting>
+
+ <para><literal>swap-path</literal> 指的是存放交换文件存的路径。
+ 每个文件会命名为
+ <filename>swap.<replaceable>client-ip</replaceable></filename>。</para>
+
+ <para>旧版的 <application>dhcpd</application> 使用的风格是
+ <literal>option option-128 "...</literal>,这个已不在支持。</para>
+ <para><filename>/etc/bootptab</filename> 会使用下面的格式代替:</para>
+
+ <programlisting>T128="192.168.4.4:/netswapvolume/netswap":T129=0000fa00</programlisting>
+
+ <note><para>在 <filename>/etc/bootptab</filename> 里,
+ 交换大小必须以十六进制表示。</para>
+ </note>
+ </step>
+
+ <step>
+ <para>在 <acronym>NFS</acronym> 交换文件服务器上,建立交换文件:</para>
+ <screen>
+&prompt.root; <userinput>mkdir <replaceable>/netswapvolume/netswap</replaceable></userinput>
+&prompt.root; <userinput>cd <replaceable>/netswapvolume/netswap</replaceable></userinput>
+&prompt.root; <userinput>dd if=/dev/zero bs=1024 count=<replaceable>64000</replaceable> of=swap.<replaceable>192.168.4.6</replaceable></userinput>
+&prompt.root; <userinput>chmod 0600 swap.<replaceable>192.168.4.6</replaceable></userinput>
+ </screen>
+ <para><replaceable>192.168.4.6</replaceable> 是无盘客户端的 IP 地址。</para>
+ </step>
+
+ <step>
+ <para>在 <acronym>NFS</acronym> 交换文件服务器上,
+ 增加下面几行到 <filename>/etc/exports</filename>:</para>
+ <programlisting>
+<replaceable>/netswapvolume</replaceable> -maproot=0:10 -alldirs <replaceable>margaux corbieres</replaceable>
+ </programlisting>
+ <para>然后让 <application>mountd</application>
+ 重读 <filename>exports</filename>文件,同上。</para>
+ </step>
+ </procedure>
+ </sect4>
+
+ <sect4>
+ <title><acronym>NFS</acronym> 与 &os; &amp;os 5.X 之间的 Swap(交换)</title>
+
+ <para>这个内核在启动时并不支持启用 <acronym>NFS</acronym>。
+ Swap 必须在启动脚本里启用,方法是装入一个可写的文件系统,
+ 然后建立和启用交换文件。要建立一个适当大小的交换文件,
+ 您可以这样做:</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=<replaceable>/path/to/swapfile</replaceable> bs=1k count=1 oseek=<replaceable>100000</replaceable></userinput></screen>
+
+ <para>要启用它,您须要把下面几行加到
+ <filename>rc.conf</filename>里:</para>
+
+ <programlisting>swapfile=<replaceable>/path/to/swapfile</replaceable></programlisting>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>杂项问题</title>
+
+
+ <sect4>
+ <title>运行时 <filename>/usr</filename> 是只读在</title>
+
+ <indexterm>
+ <primary>无盘操作</primary>
+ <secondary>只读的 /usr</secondary>
+ </indexterm>
+
+ <para>如果无盘工作站是配置来支持 X,
+ 那么您就必须调整 <application>XDM</application>
+ 配置文件,因为它默认把错误信息写到
+ <filename>/usr</filename>。</para>
+ </sect4>
+ <sect4>
+ <title>使用非 FreeBSD 服务器</title>
+
+ <para>当用作根文件系统的服务器运行的是不
+ FreeBSD,您须要在 FreeBSD 机器上建立根文件系统,
+ 然后把它复制到它的目的地,使用的命令可以是
+ <command>tar</command> 或 <command>cpio</command>。</para>
+ <para>在这种情况下,有时对于 <filename>/dev</filename>
+ 里的一些特殊的文件会有问题,原因就是不同的
+ <quote>最大/最小</quote>整数大小。
+ 一种解决的方法就是从非 FreeBSD 服务里导出一个目录,
+ 并把它载入 FreeBSD 到机子上,然后在 FreeBSD 机子上执行
+ <command>MAKEDEV</command> 来建立正确的设备条目
+ (FreeBSD 5.0及新版使用 &man.devfs.5;
+ 来为用户透明地分派设备节点,在这些版本上执行
+ <command>MAKEDEV</command> 是毫无意义的)。</para>
+
+ </sect4>
+
+ </sect3>
+
+ </sect2>
+ </sect1>
+
+
+ <sect1 id="network-isdn">
+ <title>ISDN</title>
+
+ <indexterm><primary>ISDN</primary></indexterm>
+
+ <para>关于 ISDN 技术和硬件的一个好的资源是<ulink
+ url="http://www.alumni.caltech.edu/~dank/isdn/">Dan Kegel
+ 的 ISDN 主页</ulink>。</para>
+
+ <para>一个快速简单的到 ISDN 的路线图如下:</para>
+
+ <itemizedlist><listitem>
+ <para>如果您住在欧洲,您可能要查看一下 ISDN 卡部分。</para>
+ </listitem>
+
+ <listitem>
+ <para>如果您正计划首要地使用 ISDN
+ 基于拨号非专用线路连接到带有提供商的互联网,
+ 您可能要了解一下终端适配器。如果您更改提供商的话,
+ 这会给您带来最大的灵活性、最小的麻烦。</para>
+ </listitem>
+
+ <listitem>
+ <para>如果您连接了两个局域网 (LAN),或使用了专用的
+ ISDN 连线连接到互联网,您可能要考虑选择单独的路由器/网桥。</para>
+ </listitem></itemizedlist>
+
+ <para>在决定选择哪一种方案的时候,价格是个很关键的因素。
+ 下面列有从不算贵到最贵的选择:</para>
+
+ <sect2 id="network-isdn-cards">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Hellmuth</firstname>
+ <surname>Michaelis</surname>
+ <contrib>贡献者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ </authorgroup>
+ </sect2info>
+ <title>ISDN 卡</title>
+
+ <indexterm>
+ <primary>ISDN</primary>
+ <secondary>卡</secondary>
+ </indexterm>
+
+ <para>FreeBSD 的 ISDN 工具通过被动卡
+ (passive card) 仅支持 DSS1/Q.931(或 Euro-ISDN) 标准。启动
+ FreeBSD 4.4,有些主动卡 (active card) 也被支持,
+ 这时它也支持其它发信协议;包括有最先支持的
+ <quote>Primary Rate (PRI) ISDN</quote>卡。</para>
+
+ <para><application>isdn4bsd</application> 软件允许连接到其它
+ ISDN 路由器,使用的是原始的 HDLC 上的 IP 或利用同步 PPP:使用带有
+ <literal>isppp</literal> (一个修改过的 &man.sppp.4; 驱动程序)的
+ PPP 内核,或使用用户区 (userland) &man.ppp.8;。通过使用
+ userland &man.ppp.8;,两个或更多 ISDN 的 B 通道联结变得可能。
+ 除了许多如 300 波特 (Baud) 的软 modem 一样的工具外,
+ 还可以实现电话应答机应用。</para>
+
+ <para>在 FreeBSD 里,正有更多的 PC ISDN 卡被支持;
+ 报告显示在整个欧洲及世界的其它许多地区可以成功使用。</para>
+
+ <para>被支持的主动型 ISDN 卡主要是带有 Infineon (以前的 Siemens)
+ ISAC/HSCX/IPAC ISDN 芯片组,另外还有带有 Cologne (只有 ISA 总线)
+ 芯片的 ISDN 卡、带有 Winbond W6692 芯片的 PCI 卡、一部分带有
+ Tiger300/320/ISAC 芯片组的卡以及带有一些商家专有的芯片组的卡
+ (如 AVM Fritz&excl;Card PCI V.1.0 和 the AVM Fritz&excl;Card PnP)。</para>
+
+ <para>当前积极的支持的 ISDN 卡有 AVM B1 (ISA 和 PCI) BRI
+ 卡和 AVM T1 PCI PRI 卡。</para>
+
+ <para>关于 <application>isdn4bsd</application> 的文档,请查看
+ FreeBSD 系统里的 <filename>/usr/share/examples/isdn/</filename>
+ 目录或查看 <ulink
+ url="http://www.freebsd-support.de/i4b/">isdn4bsd的主页</ulink>,
+ 那里也有提示、勘误表以及更多的文档 (如 <ulink
+ url="http://people.FreeBSD.org/~hm/">isdn4bsd手册</ulink>)。</para>
+
+ <para>要是您有兴趣增加对不同 ISDN 协议的支持,对当前还不支持的
+ ISDN PC 卡的支持或想增强 <application>isdn4bsd</application>
+ 的性能,请联系 &a.hm;。</para>
+
+ <para>对于安装、配置以及 <application>isdn4bsd</application>
+ 故障排除的问题,可以利用 &a.isdn.name; 邮件列表。</para>
+ </sect2>
+
+ <sect2>
+ <title>ISDN 终端适配器</title>
+
+ <para>终端适配器 (TA) 对于 ISDN 就好比 modem 对于常规电话线。</para>
+ <indexterm><primary>modem</primary></indexterm>
+ <para>许多 TA 使用标准的 Hayes modem AT 命令集,并且可以降级来代替 modem。</para>
+
+ <para>TA 基本的运作同 modem 一样,不同之处是连接和整个速度更比老
+ modem 更快。同 modem 的安装一样,您也需要配置
+ <link linkend="ppp">PPP</link>。确认您的串口速度已足够高。</para>
+ <indexterm>
+ <primary>PPP</primary>
+ </indexterm>
+ <para>使用 TA 连接互联网提供商的主要好处是您可以做动态的 PPP。
+ 由于 IP 地址空间变得越来越紧张,许多提供商都不愿再提供静态
+ IP。许多的独立的路由器是不支持动态 IP 分配的。</para>
+
+ <para>TA 完全依赖于您在运行的 PPP 进程,
+ 以完成它们的功能和稳定的连接。这可以让您在 FreeBSD
+ 机子里轻易地从使用 modem 升级到 ISDN,要是您已经安装了
+ PPP 的话。只是,在您使用 PPP 程序时所体验到任何问题同时也存在。</para>
+
+ <para>如果您想要最大的稳定性,请使用 <link
+ linkend="ppp">PPP</link> 内核选项,而不要使用 <link
+ linkend="userppp">userland PPP</link>。</para>
+
+ <para>下面的 TA 就可以同 FreeBSD 一起工作:</para>
+
+ <itemizedlist><listitem>
+ <para>Motorola BitSurfer 和 Bitsurfer Pro</para>
+ </listitem>
+
+ <listitem>
+ <para>Adtran</para>
+ </listitem></itemizedlist>
+
+ <para>大部分其它的 TA 也可能工作,TA
+ 提供商试图让他们的产品可以接受大部分的标准 modem AT 命令集。</para>
+
+ <para>对于外置 TA 的实际问题是:象 modem
+ 要一样,您机子需要有一个好的串行卡。</para>
+
+ <para>想要更深入地理解串行设备以及异步和同步串口这间的不同点,
+ 您就要读读 <ulink
+ url="&url.articles.serial-uart;/index.html">FreeBSD
+ 串行硬件</ulink>教程了。</para>
+
+ <para>TA 将标准的 PC 串口 (同步的) 限制到了 115.2 Kbs,即使您有
+ 128 Kbs 的连接。 想要完全利用 ISDN 有能力达到的 128 Kbs,您就需要把
+ TA 移到同步串行卡上。</para>
+
+ <para>当心被骗去买一个内置的 TA 以及自认为可以避免同步/异步问题。内置的
+ TA 只是简单地将一张标准 PC 串口芯片内建在里边。
+ 所做的这些只是让您省去买另一根串行线以及省去寻找另一个空的插孔。</para>
+
+ <para>带有 TA 的同步卡至少和一个独立的路由器同一样快地,
+ 而且仅使用一个简单的 386 FreeBSD 盒驱动它。</para>
+
+ <para>选择同步卡/TA 还是独立的路由器,是个要高度谨慎的问题。
+ 在邮件列表里有些相关的讨论。我们建议您去搜索一下关于完整讨论的<ulink
+ url="&url.base;/search/index.html">记录</ulink>。</para>
+ </sect2>
+
+ <sect2>
+ <title>单独的 ISDN 桥/路由器</title>
+ <indexterm>
+ <primary>ISDN</primary>
+ <secondary>单独的 桥/路由器</secondary>
+ </indexterm>
+ <para>ISDN 桥或路由器根本就没有指定要 FreeBSD
+ 或其它任何的操作系统。更多完整的关于路由和桥接技术的描述,
+ 请参考网络指南的书籍。</para>
+
+ <para>这部分的内容里,路由器和桥接这两个词汇将会交替地使用。</para>
+
+ <para>随着 ISDN 路由器/桥的价格下滑,对它们的选择也会变得越来越流行。
+ ISDN 路由器是一个小盒子,可以直接地接入您的本地以太网,
+ 并且自我管理到其它桥/路由器的连接。它有个内建的软件用于与通信——通过
+ PPP 和其它流行的协议。</para>
+
+ <para>路由器有比标准 TA 更快的吞吐量,因为它会使用完全同步的 ISDN 连接。</para>
+
+ <para>使用 ISDN 路由器和桥的主要问题是两个生产商之间的协同性仍存在问题。
+ 如果您计划连接到互联网提供商,您应该跟他们进行交涉。</para>
+
+ <para>如果您计划连接两个局域网网段,如您的家庭网和办公网,
+ 这将是最简单最低维护的解决方案。因为您买的设备是用于连接两边的,
+ 可以保证这种连接一定会成功。</para>
+
+ <para>例如连接到家里的计算机,或者是办公网里的一个分支连接到办公主网,
+ 那么下面的设置就可能用到:</para>
+
+ <example><title>办公室局部或家庭网</title>
+
+ <indexterm><primary>10 base 2</primary></indexterm>
+ <para>网络使用基于总线拓扑的 10 base 2 以太网
+ (<quote>瘦网(thinnet)</quote>)。如果有必要,用网线连接路由器和
+ AUI/10BT 收发器。</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="advanced-networking/isdn-bus">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced">---Sun workstation
+|
+---FreeBSD box
+|
+---Windows 95
+|
+Stand-alone router
+ |
+ISDN BRI line</literallayout>
+ </textobject>
+
+ <textobject>
+ <phrase>10 Base 2 Ethernet</phrase>
+ </textobject>
+ </mediaobject>
+
+ <para>如果您的家里或办公室支部里只有一台计算机,
+ 您可以使用一根交叉的双绞线直接连接那台独立路由器。</para>
+ </example>
+
+ <example><title>主办公室或其它网络</title>
+
+ <indexterm><primary>10 base T</primary></indexterm>
+ <para>网络使用的是星形拓扑的 10 base T 以太网(<quote>双绞线</quote>)。</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="advanced-networking/isdn-twisted-pair">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced"> -------Novell Server
+ | H |
+ | ---Sun
+ | |
+ | U ---FreeBSD
+ | |
+ | ---Windows 95
+ | B |
+ |___---Stand-alone router
+ |
+ ISDN BRI line</literallayout>
+ </textobject>
+
+ <textobject>
+ <phrase>ISDN Network Diagram</phrase>
+ </textobject>
+ </mediaobject>
+ </example>
+
+ <para>大部分路由器/网桥有一大好处就是,它们允许您在
+ <emphasis>同一</emphasis> 时间,有两个 <emphasis>分开独立的</emphasis>
+ PPP 连接到两个分开的点上。这点在许多的 TA 上是不支持的,
+ 除非带有两个串口的特定模式(通常都很贵)。请不要把它与通道连接、MPP
+ 等相混淆。</para>
+
+ <para>这是个非常有用的功能,例如,如果在您的办公室里您有个专有的
+ ISDN 连接,而且您想接入到里边,但休想让另一根 ISDN 线也能工作。
+ 办公室里的路由器能够管理专有的B通道连接到互联网 (64 Kbps)
+ 以及使用另一个通道 B 来完成单独的数据连接。 第二个 B
+ 通道可以用于拨进、拨出或动态与第一个B通道进行连接
+ (MPP等),以获取更大宽带。</para>
+
+ <indexterm><primary>IPX/SPX</primary></indexterm>
+ <para>以太网桥也允许您传输的不仅仅是 IP 通信。您也可以发送
+ IPX/SPX 或其它任何您所使用的协议。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-natd">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>作者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>李</firstname>
+ <surname>鑫</surname>
+ <contrib>译者:</contrib>
+ <affiliation>
+ <address><email>delphij@FreeBSD.org.cn</email></address>
+ </affiliation>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>网络地址转换</title>
+
+ <sect2 id="network-natoverview">
+ <title>概要</title>
+ <indexterm>
+ <primary><application>natd</application></primary>
+ </indexterm>
+ <para>FreeBSD 的网络地址转换服务, 通常也被称为
+ &man.natd.8; 是一个能够接收连入的未经处理的 IP 包,
+ 将源地址修改为本级地址然后重新将这些包注入到发出
+ IP 包流中。 &man.natd.8; 同时修改源地址和端口,
+ 当接收到响应数据时,它作逆向转换以便把数据发回原先的请求者。</para>
+ <indexterm><primary>Internet 连接共享</primary></indexterm>
+ <indexterm><primary>IP 伪装</primary></indexterm>
+ <para>NAT 最常见的用途是为人们所熟知的
+ Internet 连接共享。</para>
+ </sect2>
+
+ <sect2 id="network-natsetup">
+ <title>安装</title>
+ <para>随着 IPv4 的 IP 地址空间的日益枯竭,
+ 以及使用如 DSL 和电缆等高速连接的用户的逐渐增多,
+ 越来越多的人开始需要 Internet 连接共享这样的解决方案。
+ 由于能够将许多计算机通过一个对外的 IP 地址进行接入,
+ &man.natd.8; 成为了一个理想的选择。</para>
+
+ <para>更为常见的情况, 一个用户通过电缆或者 DSL 线路
+ 接入,并拥有一个 IP 地址,同时,希望通过这台接入
+ Internet 的计算机来为
+ LAN 上更多的计算机提供接入服务。</para>
+
+ <para>为了完成这一任务, 接入 Internet 的 FreeBSD
+ 机器必须扮演网关的角色。
+ 这台网关必须有两块网卡 &mdash; 一块用于连接
+ Internet 路由器, 另一块用来连接 LAN。 所有 LAN
+ 上的机器通过 Hub 或交换机进行连接。</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="advanced-networking/natd">
+ </imageobject>
+ <textobject>
+ <literallayout class="monospaced"> _______ __________ ________
+ | | | | | |
+ | Hub |-----| Client B |-----| Router |----- Internet
+ |_______| |__________| |________|
+ |
+ ____|_____
+| |
+| Client A |
+|__________|</literallayout>
+ </textobject>
+
+ <textobject>
+ <phrase>Network Layout</phrase>
+ </textobject>
+ </mediaobject>
+
+ <para>上述配置被广泛地用于共享 Internet 连接。
+ <acronym>LAN</acronym> 中的一台机器连接到 Internet 中。
+ 其余的计算机则通过那台 <quote>网关</quote> 机来连接 Internet。</para>
+ </sect2>
+
+ <sect2 id="network-natdkernconfiguration">
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>配置</secondary>
+ </indexterm>
+ <title>配置</title>
+ <para>下面这些选项必须放到内核配置文件中:</para>
+ <programlisting>options IPFIREWALL
+options IPDIVERT</programlisting>
+
+ <para>此外,下列是一些可选的选项:</para>
+ <programlisting>options IPFIREWALL_DEFAULT_TO_ACCEPT
+options IPFIREWALL_VERBOSE</programlisting>
+
+ <para>这些配置必须放到 <filename>/etc/rc.conf</filename> 中:</para>
+
+ <programlisting>gateway_enable="YES" <co id="co-natd-gateway-enable">
+firewall_enable="YES" <co id="co-natd-firewall-enable">
+firewall_type="OPEN" <co id="co-natd-firewall-type">
+natd_enable="YES"
+natd_interface="<replaceable>fxp0</replaceable>" <co id="co-natd-natd-interface">
+natd_flags="" <co id="co-natd-natd-flags"></programlisting>
+
+ <calloutlist>
+ <callout arearefs="co-natd-gateway-enable">
+ <para>将机器配置为网关。 执行
+ <command>sysctl net.inet.ip.forwarding=1</command> 效果相同。</para>
+ <callout arearefs="co-natd-firewall-enable">
+ <para>在启动时启用
+ <filename>/etc/rc.firewall</filename> 中的防火墙规则。</para>
+ <callout arearefs="co-natd-firewall-type">
+ <para>指定一个预定义的允许所有包进入的防火墙规则集。 参见
+ <filename>/etc/rc.firewall</filename> 以了解其他类型的规则集。</para>
+ <callout arearefs="co-natd-natd-interface">
+ <para>指定通过哪个网络接口转发包
+ (接入 Internet 的那一个)。</para>
+ <callout arearefs="co-natd-natd-flags">
+ <para>其他希望在启动时传递给
+ &man.natd.8; 的参数。</para>
+ </calloutlist>
+
+ <para>在 <filename>/etc/rc.conf</filename> 中加入上述选项将在系统启动时运行
+ <command>natd -interface fxp0</command>。 这一工作也可以手工完成。</para>
+
+ <note>
+ <para>当有太多选项要传递时,也可以使用一个 &man.natd.8;
+ 的配置文件来完成。这种情况下,这个配置文件必须通过在
+ <filename>/etc/rc.conf</filename> 里增加下面内容来定义:</para>
+
+ <programlisting>natd_flags="-f /etc/natd.conf"</programlisting>
+
+ <para><filename>/etc/natd.conf</filename> 文件会包含一个配置选项列表,
+ 每行一个。在紧跟部分的例子里将使用下面的文件:</para>
+
+ <programlisting>redirect_port tcp 192.168.0.2:6667 6667
+redirect_port tcp 192.168.0.3:80 80</programlisting>
+
+ <para>关于配置文件的更多信息,参考 &man.natd.8; 手册页中关于
+ <option>-f</option> 选项那一部分。</para>
+ </note>
+
+ <para>在LAN后面的每一台机子和接口应该被分配私有地址空间(由<ulink
+ url="ftp://ftp.isi.edu/in-notes/rfc1918.txt">RFC 1918</ulink>定义)
+ 里的 IP 地址,并且默认网关设成 <application>natd</application>
+ 机子的内连 IP 地址。</para>
+
+ <para>例如:客户端 <hostid>A</hostid> 和 <hostid>B</hostid> 在
+ LAN 后面,IP 地址是 <hostid
+ role="ipaddr">192.168.0.2</hostid> 和 <hostid
+ role="ipaddr">192.168.0.3</hostid>,同时 natd 机子的 LAN 接口上的 IP 地址是 <hostid
+ role="ipaddr">192.168.0.1</hostid>。客户端 <hostid>A</hostid> 和
+ <hostid>B</hostid> 的默认网关必须要设成 <application>natd</application>
+ 机子的 IP——<hostid
+ role="ipaddr">192.168.0.1</hostid>。<application>natd</application>
+ 机子外连,或互联网接口不需要为了 &man.natd.8;
+ 而做任何特别的修改就可工作。</para>
+ </sect2>
+
+ <sect2 id="network-natdport-redirection">
+ <title>端口重定向</title>
+
+ <para>使用 &man.natd.8; 的缺点就是 LAN 客户不能从互联网访问。LAN
+ 上的客户可以进行到外面的连接,而不能接收进来的连接。如果想在
+ LAN 的客户端机子上运行互联网服务,这就会有问题。
+ 对此的一种简单方法是在 <application>natd</application>
+ 机子上重定向选定的互联网端口到 LAN 客户端。
+ </para>
+
+ <para>例如:在客户端 <hostid>A</hostid> 上运行 IRC
+ 服务,而在客户端 <hostid>B</hostid> 上运行 web 服务。
+ 想要正确的工作,在端口 6667 (IRC) 和 80 (web)
+ 上接收到的连接就必须重定向到相应的机子上。
+ </para>
+
+ <para><option>-redirect_port</option>
+ 需要使用适当的选项传送给 &man.natd.8;。语法如下:</para>
+ <programlisting> -redirect_port proto targetIP:targetPORT[-targetPORT]
+ [aliasIP:]aliasPORT[-aliasPORT]
+ [remoteIP[:remotePORT[-remotePORT]]]</programlisting>
+
+ <para>在上面的例子中,参数应该是:</para>
+
+ <programlisting> -redirect_port tcp 192.168.0.2:6667 6667
+ -redirect_port tcp 192.168.0.3:80 80</programlisting>
+
+ <para>
+ 这就会重定向适当的 <emphasis>tcp</emphasis> 端口到 LAN 上的客户端机子。
+ </para>
+
+ <para><option>-redirect_port</option>
+ 参数可以用来指出端口范围来代替单个端口。例如,
+ <replaceable>tcp 192.168.0.2:2000-3000 2000-3000</replaceable>
+ 就会把所有在端口 2000 到 3000 上接收到的连接重定向到主机
+ <hostid>A</hostid> 上的端口 2000 到 3000。</para>
+
+ <para>当直接运行 &man.natd.8; 时,就可以使用这些选项,
+ 把它们放到 <filename>/etc/rc.conf</filename> 里的
+ <literal>natd_flags=""</literal> 选项上,
+ 或通过一个配置文件进行传送。</para>
+
+ <para>想要更多配置选项,请参考 &man.natd.8;。</para>
+ </sect2>
+
+ <sect2 id="network-natdaddress-redirection">
+ <title>地址重定向</title>
+ <indexterm>
+ <primary>地址重定向</primary>
+ </indexterm>
+ <para>如果有几个 IP 地址提供,那么地址重定向就会很有用,
+ 然而他们必须在一个机子上。使用它,&man.natd.8;
+ 就可以分配给每一个 LAN 客户端它们自己的外部 IP 地址。&man.natd.8;
+ 然后会使用适当的处部 IP 地址重写从 LAN 客户端外出的数据包,
+ 以及重定向所有进来的数据包——一定的 IP 地址回到特定的
+ LAN 客户端。这也叫做静态 NAT。例如,IP 地址
+ <hostid role="ipaddr">128.1.1.1</hostid>、
+ <hostid role="ipaddr">128.1.1.2</hostid> 和
+ <hostid role="ipaddr">128.1.1.3</hostid> 属于
+ <application>natd</application> 网关机子。
+ <hostid role="ipaddr">128.1.1.1</hostid> 可以用来作
+ <application>natd</application> 网关机子的外连 IP 地址,而
+ <hostid role="ipaddr">128.1.1.2</hostid> 和
+ <hostid role="ipaddr">128.1.1.3</hostid> 用来转发回 LAN 客户端
+ <hostid>A</hostid> 和 <hostid>B</hostid>。</para>
+
+ <para><option>-redirect_address</option> 语法如下:</para>
+
+ <programlisting>-redirect_address localIP publicIP</programlisting>
+
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>localIP</entry>
+ <entry>LAN 客户端的内部 IP 地址。</entry>
+ </row>
+ <row>
+ <entry>publicIP</entry>
+ <entry>相应 LAN 客户端的外部 IP 地址。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>在这个例子里,参数是:</para>
+
+ <programlisting>-redirect_address 192.168.0.2 128.1.1.2 -redirect_address 192.168.0.3 128.1.1.3</programlisting>
+
+ <para>象 <option>-redirect_port</option> 一样,这些参数也是放在
+ <filename>/etc/rc.conf</filename> 里的
+ <literal>natd_flags=""</literal> 选项上,
+ 或通过一个配置文件传送给它。使用地址重定向,
+ 就没有必要用端口重定向了,因为所有在某个 IP
+ 地址上收到的数据都被重定向了。</para>
+
+ <para>在 <application>natd</application> 机子上的外部 IP
+ 地址必须激活并且别名到 (aliased) 外连接口。要这做就看看
+ &man.rc.conf.5;。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-plip">
+ <title>平行线 IP(PLIP)</title>
+
+ <indexterm>
+ <primary>PLIP</primary>
+ </indexterm>
+ <indexterm>
+ <primary>平行线 IP</primary>
+ </indexterm>
+
+ <para>PLIP 允许我们在两个平行的端口间运行 TCP/IP。
+ 这会在没有网卡的机子里有用,或安装在膝上电脑上。
+ 这部分,我们将讨论:</para>
+
+ <itemizedlist><listitem>
+ <para>建立平行的 (laplink) 线缆。</para>
+ </listitem>
+
+ <listitem>
+ <para>使用 PLIP 连接两台机子。</para>
+ </listitem></itemizedlist>
+
+ <sect2 id="network-create-parallel-cable">
+ <title>建立平行的线缆。</title>
+
+ <para>您可以在许多计算机供应店里买到平行线缆。
+ 如果不行或您想知道怎么做线,
+ 下面的表格就显示了如何利用普通的打印机平行线做一根:</para>
+
+ <table frame="none">
+ <title>为网络配平行线</title>
+
+ <tgroup cols="5"><thead><row><entry>A-name</entry>
+
+ <entry>A 端</entry>
+
+ <entry>B 端</entry>
+
+ <entry>描述</entry>
+
+ <entry>Post/Bit</entry></row></thead>
+
+ <tbody><row><entry><literallayout>DATA0 -ERROR</literallayout></entry>
+
+ <entry><literallayout>2 15</literallayout></entry>
+
+ <entry><literallayout>15 2</literallayout></entry>
+
+ <entry>数据</entry>
+
+ <entry><literallayout>0/0x01 1/0x08</literallayout></entry></row>
+
+ <row><entry><literallayout>DATA1 +SLCT</literallayout></entry>
+
+ <entry><literallayout>3 13</literallayout></entry>
+
+ <entry><literallayout>13 3</literallayout></entry>
+
+ <entry>数据</entry>
+
+ <entry><literallayout>0/0x02 1/0x10</literallayout></entry></row>
+
+ <row><entry><literallayout>DATA2 +PE</literallayout></entry>
+
+ <entry><literallayout>4 12</literallayout></entry>
+
+ <entry><literallayout>12 4</literallayout></entry>
+
+ <entry>数据</entry>
+
+ <entry><literallayout>0/0x04 1/0x20</literallayout></entry></row>
+
+ <row><entry><literallayout>DATA3 -ACK</literallayout></entry>
+
+ <entry><literallayout>5 10</literallayout></entry>
+
+ <entry><literallayout>10 5</literallayout></entry>
+
+ <entry>脉冲 (Strobe)</entry>
+
+ <entry><literallayout>0/0x08 1/0x40</literallayout></entry></row>
+
+ <row><entry><literallayout>DATA4 BUSY</literallayout></entry>
+
+ <entry><literallayout>6 11</literallayout></entry>
+
+ <entry><literallayout>11 6</literallayout></entry>
+
+ <entry>数据</entry>
+
+ <entry><literallayout>0/0x10 1/0x80</literallayout></entry></row>
+
+ <row><entry>GND</entry>
+
+ <entry>18-25</entry>
+
+ <entry>18-25</entry>
+
+ <entry>GND</entry>
+
+ <entry>-</entry></row></tbody></tgroup></table>
+ </sect2>
+
+ <sect2 id="network-plip-setup">
+ <title>设置 PLIP</title>
+
+ <para>首先,您需要一根 laplink 线。然后,
+ 确认两台计算机的内核都有对 &man.lpt.4;
+ 驱动程序的支持:</para>
+
+ <screen>&prompt.root; <userinput>grep lp /var/run/dmesg.boot</userinput>
+lpt0: &lt;Printer&gt; on ppbus0
+lpt0: Interrupt-driven port</screen>
+
+ <para>平行端口必须是一个中断驱动的端口,在 &os; 4.X
+ 里,您的内核配置文件应该有一行和下面的差不多:</para>
+
+ <programlisting>device ppc0 at isa? irq 7</programlisting>
+
+ <para>在 &os; 5.X 里,文件 <filename>/boot/device.hints</filename>
+ 应该包括下面几行:</para>
+
+ <programlisting>hint.ppc.0.at="isa" hint.ppc.0.irq="7"</programlisting>
+
+ <para>然后,检查看内核配置文件里是否有 <literal>device plip</literal>
+ 行或是否装载了 <filename>plip.ko</filename> 内核模块。两种情况下,
+ 在您直接使用 &man.ifconfig.8; 命令时,应该有平行的网络接口显示。在
+ &os; 4.X 里,就象这样:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig lp0</userinput>
+lp0: flags=8810&lt;POINTOPOINT,SIMPLEX,MULTICAST&gt; mtu 1500</screen>
+
+ <para>而对于 &os; 5.X: 应该是:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig plip0</userinput>
+plip0: flags=8810&lt;POINTOPOINT,SIMPLEX,MULTICAST&gt; mtu 1500</screen>
+
+ <note><para>用于平行接口的设备名在 &os; 4.X
+ (<devicename>lp<replaceable>X</replaceable></devicename>)
+ 和 &os; 5.X (<devicename>plip<replaceable>X</replaceable></devicename>)
+ 是不相同的。</para></note>
+
+ <para>插入 laplink 线到两台计算机的平行接口里。</para>
+
+ <para>在两边以 <username>root</username> 身份配置网络接口参数。
+ 例如,如果您想让运行着 &os; 4.X 的主机 <hostid>host1</hostid>
+ 连接到运行着 &os; 5.X 的主机 <hostid>host2</hostid>:</para>
+
+ <programlisting> host1 &lt;-----&gt; host2
+IP Address 10.0.0.1 10.0.0.2</programlisting>
+
+ <para>配置 <hostid>host1</hostid> 上的网络接口,照此做:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig lp0 10.0.0.1 10.0.0.2</userinput></screen>
+
+ <para>配置 <hostid>host2</hostid> 上的网络接口,照此做:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig plip0 10.0.0.2 10.0.0.1</userinput></screen>
+
+
+ <para>您现在应该有个工作的连接了。想要更详细的信息,
+ 请阅读 &man.lp.4; 和 &man.lpt.4; 手册页。</para>
+
+ <para>您还应该增加两个主机到 <filename>/etc/hosts</filename>:</para>
+
+ <programlisting>127.0.0.1 localhost.my.domain localhost
+10.0.0.1 host1.my.domain host1
+10.0.0.2 host2.my.domain</programlisting>
+
+ <para>要确认连接是否工作,可以到每一台机子上,然后
+ ping 另外一台。例如,在 <hostid>host1</hostid> 上:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig lp0</userinput>
+lp0: flags=8851&lt;UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
+ inet 10.0.0.1 --&gt; 10.0.0.2 netmask 0xff000000
+&prompt.root; <userinput>netstat -r</userinput>
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+host2 host1 UH 0 0 lp0
+&prompt.root; <userinput>ping -c 4 host2</userinput>
+PING host2 (10.0.0.2): 56 data bytes
+64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=2.774 ms
+64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.530 ms
+64 bytes from 10.0.0.2: icmp_seq=2 ttl=255 time=2.556 ms
+64 bytes from 10.0.0.2: icmp_seq=3 ttl=255 time=2.714 ms
+
+--- host2 ping statistics ---
+4 packets transmitted, 4 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms</screen>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-ipv6">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Aaron</firstname>
+ <surname>Kaplan</surname>
+ <contrib>原始作者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>重新组织和增加:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Brad</firstname>
+ <surname>Davis</surname>
+ <contrib>Extended by </contrib>
+ </author>
+ </authorgroup>
+
+ </sect1info>
+
+ <title>IPv6</title>
+ <para>IPv6 (也叫 IPng <quote>IP下一代</quote>)
+ 是著名的 IP 协议 (也叫 <acronym>IPv4</acronym>)
+ 的新版。象其它当前的 *BSD 系统一样,FreeBSD 包括了
+ <literal>KAME</literal> IPv6 相关工具。因此您的 FreeBSD
+ 系统事带有所有您在体验 IPv6 时所需要的。这部分主要集中在
+ IPv6 的配置和运行上。</para>
+
+ <para>在二十世纪 90 年代早期,人们开始当心迅速缩小的 IPv4
+ 地址空间。根据互联网的膨胀率,有两点需要考虑:</para>
+
+ <itemizedlist><listitem>
+ <para>所有的 IP 地址用光。今天不再那么当心了,
+ 因为有私有地址空间 (<hostid role="ipaddr">10.0.0.0/8</hostid>、
+ <hostid role="ipaddr">192.168.0.0/24</hostid> 等等)
+ 和网络地址转换 (<acronym>NAT</acronym>) 可以利用。</para>
+ </listitem>
+
+ <listitem>
+ <para>路由表条目变得太大。这点今天仍然是焦点。</para>
+ </listitem></itemizedlist>
+
+ <para>IPv6 解决这些和其它许多的问题:</para>
+
+ <itemizedlist><listitem>
+ <para>128 位地址空间。换句话,理论上有
+ 340,282,366,920,938,463,463,374,607,431,768,211,456
+ 个地址可以使用。这意味着在我们的星球上每平方米大约有
+ 6.67 * 10^27 个 IPv6 地址。</para>
+ </listitem>
+
+ <listitem>
+ <para>路由器仅在它们的路由表里存放网络地址集,
+ 这就减少路由表的平均空间到 8192 个条目。</para>
+ </listitem></itemizedlist>
+
+ <para>IPv6 还有其它许多有用的功能,如:</para>
+
+ <itemizedlist><listitem>
+ <para>地址自动配置 (<ulink
+ url="http://www.ietf.org/rfc/rfc2462.txt">RFC2462</ulink>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Anycast (任意播) 地址(<quote>一对多</quote>)</para>
+ </listitem>
+
+ <listitem>
+ <para>强制的多播地址</para>
+ </listitem>
+
+ <listitem>
+ <para>IPsec (IP 安全)</para>
+ </listitem>
+
+ <listitem>
+ <para>简单的头结构</para>
+ </listitem>
+
+ <listitem>
+ <para>移动的 (Mobile) <acronym>IP</acronym></para>
+ </listitem>
+
+ <listitem>
+ <para>IPv6 到 IPv4 的转换机制</para>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>要更多信息,请查看:</para>
+
+ <itemizedlist><listitem>
+ <para>IPv6 概观,在<ulink
+ url="http://playground.sun.com/pub/ipng/html/ipng-main.html">
+ playground.sun.com</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.kame.net">KAME.net</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.6bone.net">6bone.net</ulink></para>
+ </listitem></itemizedlist>
+
+ <sect2>
+ <title>关于 IPv6 地址的背景知识</title>
+ <para>有几种不同类型的 IPv6 地址:Unicast,Anycast 和 Multicast。</para>
+
+ <para>Unicast 地址是为人们所熟知的地址。一个被发送到
+ unicast 地址的包实际上会到达属于这个地址的接口。</para>
+
+ <para>Anycast 地址语义上与 unicast 地址没有差别,
+ 只是它们强调一组接口。指定为 anycast 地址的包会到达最近的
+ (以路由为单位) 接口。Anycast 地址可能只被路由器使用。</para>
+
+ <para>Multicast 地址标识一组接口。指定为 multicast
+ 地址的包会到达属于 multicast 组的所有的接口。</para>
+
+ <note><para>IPv4 广播地址 (通常为
+ <hostid role="ipaddr">xxx.xxx.xxx.255</hostid>) 由
+ IPv6 的 multicast 地址来表示。</para></note>
+
+ <table frame="none">
+ <title>保留的 IPv6 地址</title>
+
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>IPv6 地址</entry>
+ <entry>预定长度 (bits)</entry>
+ <entry>描述</entry>
+ <entry>备注</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><hostid role="ip6addr">::</hostid></entry>
+ <entry>128 bits</entry>
+ <entry>未指定</entry>
+ <entry>类似 IPv4 中的 <hostid role="ipaddr">0.0.0.0</hostid></entry>
+ </row>
+
+ <row>
+ <entry><hostid role="ip6addr">::1</hostid></entry>
+ <entry>128 bits</entry>
+ <entry>环回地址</entry>
+ <entry>类似 IPv4 中的 <hostid role="ipaddr">127.0.0.1</hostid></entry>
+ </row>
+
+ <row>
+ <entry><hostid
+ role="ip6addr">::00:xx:xx:xx:xx</hostid></entry>
+ <entry>96 bits</entry>
+ <entry>嵌入的 IPv4</entry>
+ <entry>低 32 bits 是 IPv4 地址。这也称作
+ <quote>IPv4 兼容 IPv6
+ 地址</quote></entry>
+ </row>
+
+ <row>
+ <entry><hostid
+ role="ip6addr">::ff:xx:xx:xx:xx</hostid></entry>
+ <entry>96 bits</entry>
+ <entry>IPv4 影射的 IPv6 地址</entry>
+ <entry>低的 32 bits 是 IPv4 地址。 用于那些不支持 IPv6 的主机。</entry>
+ </row>
+
+ <row>
+ <entry><hostid role="ip6addr">fe80::</hostid> - <hostid
+ role="ip6addr">feb::</hostid></entry>
+ <entry>10 bits</entry>
+ <entry>链路环回</entry>
+ <entry>类似 IPv4 的环回地址。</entry>
+ </row>
+
+ <row>
+ <entry><hostid role="ip6addr">fec0::</hostid> - <hostid
+ role="ip6addr">fef::</hostid></entry>
+ <entry>10 bits</entry>
+ <entry>站点环回</entry>
+ <entry>&nbsp;</entry>
+ </row>
+
+ <row>
+ <entry><hostid role="ip6addr">ff::</hostid></entry>
+ <entry>8 bits</entry>
+ <entry>多播</entry>
+ <entry>&nbsp;</entry>
+ </row>
+
+ <row>
+ <entry><hostid role="ip6addr">001</hostid> (base
+ 2)</entry>
+ <entry>3 bits</entry>
+ <entry>全球多播</entry>
+ <entry>所有的全球多播地址都指定到这个地址池中。前三个二进制位是
+ <quote>001</quote>。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2>
+ <title>IPv6 地址的读法</title>
+
+ <para>规范形式被描述为:<hostid role="ip6addr">x:x:x:x:x:x:x:x</hostid>,
+ 每一个<quote>x</quote>就是一个 16 位的 16 进制值。当然,
+ 每个十六进制块以三个<quote>0</quote>开始头的也可以省略。如
+ <hostid role="ip6addr">FEBC:A574:382B:23C1:AA49:4592:4EFE:9982</hostid></para>
+
+ <para>通常一个地址会有很长的子串全部为零,
+ 因此每个地址的这种子串常被简写为<quote>::</quote>。
+ 例如:<hostid role="ip6addr">fe80::1</hostid>
+ 对应的规范形式是
+ <hostid role="ip6addr">fe80:0000:0000:0000:0000:0000:0000:0001</hostid>。</para>
+
+ <para>第三种形式是以众所周知的用点<quote>.</quote>作为分隔符的十进制
+ IPv4 形式,写出最后 32 Bit 的部分。例如
+ <hostid role="ip6addr">2002::10.0.0.1</hostid>
+ 对应的十进制正规表达方式是
+ <hostid role="ip6addr">2002:0000:0000:0000:0000:0000:0a00:0001</hostid>
+ 它也相当于写成
+ <hostid role="ip6addr">2002::a00:1</hostid>.</para>
+
+ <para>到现在,读者应该能理解下面的内容了:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig</userinput></screen>
+
+ <programlisting>rl0: flags=8943&lt;UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST&gt; mtu 1500
+ inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255
+ inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1
+ ether 00:00:21:03:08:e1
+ media: Ethernet autoselect (100baseTX )
+ status: active</programlisting>
+
+ <para><hostid role="ip6addr">fe80::200:21ff:fe03:8e1%rl0</hostid>
+ 是一个自动配置的链路环回地址。它作为自动配置的一部分由 MAC 生成。</para>
+
+ <para>关于 IPv6 地址的结构的更多信息,请参看 <ulink
+ url="http://www.ietf.org/rfc/rfc3513.txt">RFC3513</ulink>。</para>
+ </sect2>
+
+ <sect2>
+ <title>进行连接</title>
+
+ <para>目前,有四种方式可以连接到其它 IPv6 主机和网络:</para>
+
+ <itemizedlist><listitem>
+ <para>加入试验性的 6bone(骨干)</para>
+ </listitem>
+
+ <listitem>
+ <para>从您的上一级提供商那里获得 IPv6 网络。与您的互联网提供商讨论以求指导。</para>
+ </listitem>
+
+ <listitem>
+ <para>使用 6-to-4 通道 (<ulink
+ url="http://www.ietf.org/rfc/rfc3068.txt">RFC3068</ulink>)</para>
+ </listitem>
+
+ <listitem>
+ <para>如果您是括号连接 (dial-up connection),请使用
+ <filename role="package">net/freenet6</filename> port。</para>
+ </listitem></itemizedlist>
+
+ <para>这里我们就讨论如何连接到 6bone,因为它目前看来是最流行的一种方式。</para>
+
+ <para>首先看一下 <ulink url="http://www.6bone.net/">6bone</ulink>
+ 网站,并找出离您最近的 6bone 连接。给某位值得信赖的人写信过去,
+ 如果运气好,您就会得到关于如何设置您的连接的指导。通常这包括了设置
+ GRE (gif) 通道。</para>
+
+ <para>这里有一个典型的关于设置 &man.gif.4; 通道的例子。</para>
+
+ <screen>&prompt.root; <userinput>ifconfig gif0 create</userinput>
+&prompt.root; <userinput>ifconfig gif0</userinput>
+gif0: flags=8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1280
+&prompt.root; <userinput>ifconfig gif0 tunnel <replaceable>MY_IPv4_ADDR</replaceable> <replaceable>HIS_IPv4_ADDR</replaceable></userinput>
+&prompt.root; <userinput>ifconfig gif0 inet6 alias <replaceable>MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR</replaceable></userinput></screen>
+
+ <para>把大写字母换成您从上一级 6bone 节点收到的信息。</para>
+
+ <para>这样就建立了通道。通过 &man.ping6.8;
+ <hostid role="ip6addr">ff02::1%gif0</hostid>,
+ 检查通道是否工作。您应该会收到两个 ping 回应。</para>
+
+ <note><para>或许您会对地址 <hostid role="ip6addr">ff02:1%gif0</hostid>
+ 感兴趣,它是一个 multicast 地址。<literal>%gif0</literal> 表明在网络接口
+ <devicename>gif0</devicename> 上的 multicast 地址已经用上了。因为我们
+ <command>ping</command> 一个 multicast 地址的时候,
+ 通道的另一端也应该会回应。</para></note>
+
+ <para>到现在,设置一个到 6bone 上级连接的路由应该是相当简单了。</para>
+
+ <screen>&prompt.root; <userinput>route add -inet6 default -interface gif0</userinput>
+&prompt.root; <userinput>ping6 -n <replaceable>MY_UPLINK</replaceable></userinput></screen>
+
+ <screen>&prompt.root; <userinput>traceroute6 www.jp.FreeBSD.org</userinput>
+(3ffe:505:2008:1:2a0:24ff:fe57:e561) from 3ffe:8060:100::40:2, 30 hops max, 12 byte packets
+ 1 atnet-meta6 14.147 ms 15.499 ms 24.319 ms
+ 2 6bone-gw2-ATNET-NT.ipv6.tilab.com 103.408 ms 95.072 ms *
+ 3 3ffe:1831:0:ffff::4 138.645 ms 134.437 ms 144.257 ms
+ 4 3ffe:1810:0:6:290:27ff:fe79:7677 282.975 ms 278.666 ms 292.811 ms
+ 5 3ffe:1800:0:ff00::4 400.131 ms 396.324 ms 394.769 ms
+ 6 3ffe:1800:0:3:290:27ff:fe14:cdee 394.712 ms 397.19 ms 394.102 ms</screen>
+
+ <para>这个输出可能随机器而不同。到现在,您应该可以到达 IPv6
+ 站点<ulink url="http://www.kame.net">www.kame.net</ulink>,
+ 并看到那只正跳舞的乌龟 &mdash; 如果您有一个支持 IPv6 的浏览器,如
+ <filename role="package">www/mozilla</filename>、
+ <application>Konqueror</application> (<filename
+ role="package">x11/kdebase3</filename>的一部分) 或
+ <filename role="package">www/epiphany</filename>。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>IPv6 世界里的 DNS</title>
+ <para>对于 IPv6 有两种类型的 DNS 记录:IETF
+ 已经宣布 A6 是过时标准;现行的标准是 AAAA 记录。</para>
+
+ <para>使用AAAA记录是很简单的。通过增加下面内容,
+ 给您的主机分配置您刚才接收到的新的 IPv6 地址:</para>
+
+ <programlisting>MYHOSTNAME AAAA MYIPv6ADDR</programlisting>
+
+ <para>到您的主域 DNS 文件里,就可以完成。要是您自已没有
+ <acronym>DNS</acronym> 域服务,您可以询问您的 <acronym>DNS</acronym>
+ 提供商。目前的 <application>bind</application> 版本 (version 8.3 与 9)
+ 和 <filename role="package">dns/djbdns</filename>(含IPv6补丁) 支持 AAAA 记录。</para>
+ </sect2>
+
+ <sect2>
+ <title>在 <filename>/etc/rc.conf</filename> 中进行所需的修改</title>
+
+ <sect3>
+ <title>IPv6 客户机设置</title>
+
+ <para>这些设置将帮助您把一台您 LAN 上的机器配置为一台客户机, 而不是路由器。
+ 要让 &man.rtsol.8; 在启动时自动配置您的网卡, 只需添加:</para>
+
+ <programlisting>ipv6_enable="YES"</programlisting>
+
+ <para>要自动地静态指定 IP 地址, 例如 <hostid role="ip6addr">
+ 2001:471:1f11:251:290:27ff:fee0:2093</hostid>, 到
+ <devicename>fxp0</devicename> 上, 则写上:</para>
+
+ <programlisting>ipv6_ifconfig_fxp0="2001:471:1f11:251:290:27ff:fee0:2093"</programlisting>
+
+ <para>要指定
+ <hostid role="ip6addr">2001:471:1f11:251::1</hostid>
+ 作为默认路由, 需要在 <filename>/etc/rc.conf</filename> 中加入:</para>
+
+ <programlisting>ipv6_defaultrouter="2001:471:1f11:251::1"</programlisting>
+
+ </sect3>
+
+ <sect3>
+ <title>IPv6 路由器/网关配置</title>
+
+ <para>这将帮助您从隧道提供商, 例如
+ <ulink url="http://www.6bone.net/">6bone</ulink> 那里取得必要的资料,
+ 并将这些资料转化为在重启时能够保持住的设置。 要在启动时恢复您的隧道,
+ 需要在 <filename>/etc/rc.conf</filename> 中增加:</para>
+
+ <para>列出要配置的通用隧道接口, 例如
+ <devicename>gif0</devicename>:</para>
+
+ <programlisting>gif_interfaces="gif0"</programlisting>
+
+ <para>配置该接口使用本地端地址
+ <replaceable>MY_IPv4_ADDR</replaceable> 和远程端地址
+ <replaceable>REMOTE_IPv4_ADDR</replaceable>:</para>
+
+ <programlisting>gifconfig_gif0="<replaceable>MY_IPv4_ADDR REMOTE_IPv4_ADDR</replaceable>"</programlisting>
+
+ <para>应用分配给您用于 IPv6 隧道远端的 IPv6
+ 地址, 需要增加:</para>
+
+ <programlisting>ipv6_ifconfig_gif0="<replaceable>MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR</replaceable>"</programlisting>
+
+ <para>此后十设置 IPv6 的默认路由。 这是 IPv6 隧道的另一端:</para>
+
+ <programlisting>ipv6_defaultrouter="<replaceable>MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR</replaceable>"</programlisting>
+
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>路由宣告和主机自动配置</title>
+
+ <para>这节将帮助您配置 &man.rtadvd.8; 来宣示默认的
+ IPv6 路由。</para>
+
+ <para>要启用 &man.rtadvd.8; 您需要在
+ <filename>/etc/rc.conf</filename> 中添加:</para>
+
+ <programlisting>rtadvd_enable="YES"</programlisting>
+
+ <para>指定由哪个网络接口来完成
+ IPv6 路由请求非常重要。 举例来说, 让 &man.rtadvd.8; 使用
+ <devicename>fxp0</devicename>:</para>
+
+ <programlisting>rtadvd_interfaces="fxp0"</programlisting>
+
+ <para>接下来我们需要创建配置文件,
+ <filename>/etc/rtadvd.conf</filename>。 示例如下:</para>
+
+ <programlisting>fxp0:\
+ :addrs#1:addr="2001:471:1f11:246::":prefixlen#64:tc=ether:</programlisting>
+
+ <para>将 <devicename>fxp0</devicename> 改为您打算使用的接口名。</para>
+
+ <para>接下来, 将 <hostid role="ip6addr">2001:471:1f11:246::</hostid>
+ 改为分配给您的地址前缀。</para>
+
+ <para>如果您拥有专用的 <hostid role="netmask">/64</hostid> 子网,
+ 则不需要修改其他设置。 反之, 您需要把
+ <literal>prefixlen#</literal> 改为正确的值。</para>
+
+ </sect2>
+ </sect1>
+<sect1 id="network-atm">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Harti</firstname>
+ <surname>Brandt</surname>
+ <contrib>贡献者:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ <affiliation>
+ <address><email>zxpmyth@yahoo.com.cn</email></address>
+ </affiliation>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>&os; 5.X 上的 ATM</title>
+
+ <sect2>
+ <title>配置 classical IP over ATM (PVCs)</title>
+
+ <para>Classical IP over ATM (<acronym>CLIP</acronym>)
+ 是一种最简单的使用带 IP 的 ATM 的方法。
+ 这种方法可以用在交换式连接 (SVC) 和永久连接
+ (PVC) 上。这部分描述的就是配置基于 PVC 的网络。</para>
+
+ <sect3>
+ <title>完全互连的配置</title>
+
+ <para>第一种使用PVC来设置 <acronym>CLIP</acronym>
+ 的方式就是通过专用的 PVC 让网络里的每一台机子都互连在一起。
+ 尽管这样配置起来很简单,但对于数量更多一点的机子来说就有些不切实际了。
+ 例如我们有四台机子在网络里,每一台都使用一张 ATM 适配器卡连接到 ATM
+ 网络。第一步就是规划 IP 地址和机子间的 ATM 连接。我们使用下面的:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="1*">
+ <thead>
+ <row>
+ <entry>主机</entry>
+ <entry>IP 地址</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><hostid>hostA</hostid></entry>
+ <entry><hostid role="ipaddr">192.168.173.1</hostid></entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostB</hostid></entry>
+ <entry><hostid role="ipaddr">192.168.173.2</hostid></entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostC</hostid></entry>
+ <entry><hostid role="ipaddr">192.168.173.3</hostid></entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostD</hostid></entry>
+ <entry><hostid role="ipaddr">192.168.173.4</hostid></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>为了建造完全交错的网络,我们需要在第一对机子间有一个 ATM 连接:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="1*">
+ <thead>
+ <row>
+ <entry>机器</entry>
+ <entry>VPI.VCI 对</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><hostid>hostA</hostid> - <hostid>hostB</hostid></entry>
+ <entry>0.100</entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostA</hostid> - <hostid>hostC</hostid></entry>
+ <entry>0.101</entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostA</hostid> - <hostid>hostD</hostid></entry>
+ <entry>0.102</entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostB</hostid> - <hostid>hostC</hostid></entry>
+ <entry>0.103</entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostB</hostid> - <hostid>hostD</hostid></entry>
+ <entry>0.104</entry>
+ </row>
+
+ <row>
+ <entry><hostid>hostC</hostid> - <hostid>hostD</hostid></entry>
+ <entry>0.105</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+
+ <para>在每一个连接端 VPI 和 VCI 的值都可能会不同,
+ 只是为了简单起见,我们假定它们是一样的。
+ 下一步我们需要配置每一个主机上的 ATM 接口:</para>
+
+ <screen>hostA&prompt.root; <userinput>ifconfig hatm0 192.168.173.1 up</userinput>
+hostB&prompt.root; <userinput>ifconfig hatm0 192.168.173.2 up</userinput>
+hostC&prompt.root; <userinput>ifconfig hatm0 192.168.173.3 up</userinput>
+hostD&prompt.root; <userinput>ifconfig hatm0 192.168.173.4 up</userinput></screen>
+
+ <para>假定所有主机上的 ATM 接口都是 <devicename>hatm0</devicename>。
+ 现在 PVC 需要配置到 <hostid>hostA</hostid> 上
+ (我们假定它们都已经配置在了 ATM 交换机上,至于怎么做的,
+ 您就需要参考一下该交换机的手册了)。</para>
+
+ <screen>hostA&prompt.root; <userinput>atmconfig natm add 192.168.173.2 hatm0 0 100 llc/snap ubr</userinput>
+hostA&prompt.root; <userinput>atmconfig natm add 192.168.173.3 hatm0 0 101 llc/snap ubr</userinput>
+hostA&prompt.root; <userinput>atmconfig natm add 192.168.173.4 hatm0 0 102 llc/snap ubr</userinput>
+
+hostB&prompt.root; <userinput>atmconfig natm add 192.168.173.1 hatm0 0 100 llc/snap ubr</userinput>
+hostB&prompt.root; <userinput>atmconfig natm add 192.168.173.3 hatm0 0 103 llc/snap ubr</userinput>
+hostB&prompt.root; <userinput>atmconfig natm add 192.168.173.4 hatm0 0 104 llc/snap ubr</userinput>
+
+hostC&prompt.root; <userinput>atmconfig natm add 192.168.173.1 hatm0 0 101 llc/snap ubr</userinput>
+hostC&prompt.root; <userinput>atmconfig natm add 192.168.173.2 hatm0 0 103 llc/snap ubr</userinput>
+hostC&prompt.root; <userinput>atmconfig natm add 192.168.173.4 hatm0 0 105 llc/snap ubr</userinput>
+
+hostD&prompt.root; <userinput>atmconfig natm add 192.168.173.1 hatm0 0 102 llc/snap ubr</userinput>
+hostD&prompt.root; <userinput>atmconfig natm add 192.168.173.2 hatm0 0 104 llc/snap ubr</userinput>
+hostD&prompt.root; <userinput>atmconfig natm add 192.168.173.3 hatm0 0 105 llc/snap ubr</userinput></screen>
+
+ <para>当然,除 UBR 外其它的通信协定也可让 ATM 适配器支持这些。
+ 此种情况下,通信协定的名字要跟人通信参数后边。工具
+ &man.atmconfig.8; 的帮助可以这样得到:</para>
+
+ <screen>&prompt.root; <userinput>atmconfig help natm add</userinput></screen>
+
+ <para>或者在 &man.atmconfig.8; 手册页里得到。</para>
+
+ <para>相同的配置也可以通过 <filename>/etc/rc.conf</filename>
+ 来完成。对于 <hostid>hostA</hostid>,看起来就象这样:</para>
+
+<programlisting>network_interfaces="lo0 hatm0"
+ifconfig_hatm0="inet 192.168.173.1 up"
+natm_static_routes="hostB hostC hostD"
+route_hostB="192.168.173.2 hatm0 0 100 llc/snap ubr"
+route_hostC="192.168.173.3 hatm0 0 101 llc/snap ubr"
+route_hostD="192.168.173.4 hatm0 0 102 llc/snap ubr"</programlisting>
+
+ <para>所有 <acronym>CLIP</acronym> 路由的当前状态可以使用如下命令获得:</para>
+
+ <screen>hostA&prompt.root; <userinput>atmconfig natm show</userinput></screen>
+ </sect3>
+ </sect2>
+ </sect1>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
+<!-- LocalWords: config mnt www -->
diff --git a/zh_CN.GB2312/books/handbook/appendix.decl b/zh_CN.GB2312/books/handbook/appendix.decl
new file mode 100644
index 0000000000..b6ae5e04c3
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/appendix.decl
@@ -0,0 +1,2 @@
+<!DOCTYPE appendix PUBLIC "-//FreeBSD//DTD DocBook V3.1-Based Extension//EN">
+<!-- $FreeBSD$ -->
diff --git a/zh_CN.GB2312/books/handbook/basics/Makefile b/zh_CN.GB2312/books/handbook/basics/Makefile
new file mode 100644
index 0000000000..8c29323b92
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/basics/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= basics/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/basics/chapter.sgml b/zh_CN.GB2312/books/handbook/basics/chapter.sgml
new file mode 100644
index 0000000000..f43b3fb2a7
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/basics/chapter.sgml
@@ -0,0 +1,2297 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.126
+ $FreeBSD$
+-->
+
+<chapter id="basics">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Chris</firstname>
+ <surname>Shumway</surname>
+ <contrib>Rewritten by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 10 Mar 2000 -->
+ </chapterinfo>
+
+ <title>UNIX 基础</title>
+
+ <sect1 id="basics-synopsis">
+ <title>概述</title>
+ <indexterm><primary>基础</primary></indexterm>
+
+
+ <para>下列章节的命令和功能适用于FreeBSD操作系统。
+ 同时这里许多内容和一些 &unix; 类似操作系统相关。
+ 假如您已经熟悉这些内容可跳过不阅读。
+ 假如您是FreeBSD新手, 那您应该认真详细地从头到尾读一遍这些章节。</para>
+
+ <para>读取这些内容,您将会学到:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>怎样在FreeBSD使用<quote>虚拟控制台</quote>。</para>
+ </listitem>
+ <listitem>
+ <para>&unix;文件权限是怎样工作的。</para>
+ </listitem>
+ <listitem>
+ <para>&os;默认文件系统的架构。</para>
+ </listitem>
+ <listitem>
+ <para>&os;磁盘架构。</para>
+ </listitem>
+ <listitem>
+ <para>怎样挂接或卸下文件系统。</para>
+ </listitem>
+ <listitem>
+ <para>什么是进程、守护进程、信号。</para>
+ </listitem>
+ <listitem>
+ <para>什么是shell,应当怎样去改变登录进入的默认环境。
+ </para>
+ </listitem>
+ <listitem>
+ <para>怎样使用基本的文本编辑器。</para>
+ </listitem>
+ <listitem>
+ <para>什么是设备,什么是设备节点。</para>
+ </listitem>
+ <listitem>
+ <para>&os; 下,使用的是什么可执行文件格式。</para>
+ </listitem>
+ <listitem>
+ <para>怎样使用 man 手册并取得更多资讯。</para>
+ </listitem>
+ </itemizedlist>
+
+ </sect1>
+
+ <sect1 id="consoles">
+ <title>虚拟控制台和终端</title>
+ <indexterm><primary>虚拟控制台</primary></indexterm>
+ <indexterm><primary>终端</primary></indexterm>
+
+ <para>FreeBSD能多方面应用,其中之一它能在字符终端输入命令。
+ 您可以在这方面容易地使用FreeBSD这个有强大适应性和功能的 &unix; 系统,
+ 这部份介绍 <quote>多终端</quote> 和<quote>多控制台</quote>,
+ 和您在 FreeBSD 应怎样使用它们。</para>
+
+ <sect2 id="consoles-intro">
+ <title>控制台</title>
+ <indexterm><primary>控制台</primary></indexterm>
+
+ <para>假如您没有设置到 FreeBSD 在启动期间给出图形登录,
+ 那么系统将在引导和启动脚本正确运行完成后,给您一个登录的提示。
+ 您会看到类似这样的界面:</para>
+
+ <screen>Additional ABI support:.
+Local package initialization:.
+Additional TCP options:.
+
+Fri Sep 20 13:01:06 EEST 2002
+
+FreeBSD/i386 (pc3.example.org) (ttyv0)
+
+login:</screen>
+
+ <para>这些信息可能和您的系统稍微有点不同,但不会有很大差别。
+ 最后两行是我们感兴趣的,
+ 理解这一行:</para>
+
+ <programlisting>FreeBSD/i386 (pc3.example.org) (ttyv0)</programlisting>
+
+ <para>这一行是您刚才启动的系统信息其中一块,
+ 您所看到的是一个<quote>FreeBSD</quote>控制台,
+ 运行在一个Intel或兼容的x86体系架构上面<footnote>
+ <para>现在理解一下<literal>i386</literal>的含义。 请注意
+ 即使您的 FreeBSD 不是运行在一个 Intel 386 CPU, 都会定为<literal>i386</literal>。
+ 他不是指您的处理器,而处理器的<quote>体系结构</quote>已经显示过去了。</para>
+ </footnote>。这个结构名称 (每一种&unix;结构都有自己的名称) 叫
+ <hostid>pc3.example.org</hostid>, 就是现在这个系统控制台&mdash;这个 <devicename>ttyv0</devicename>
+ 终端的样子。</para>
+
+ <para>在最后,最后一行一直保持这样:</para>
+
+ <programlisting>login:</programlisting>
+
+ <para>假设在这一部份您的用户名
+ <quote>username</quote>已经注册在FreeBSD里,
+ 那一步介绍您应怎样做。</para>
+ </sect2>
+
+ <sect2 id="consoles-login">
+ <title>进入FreeBSD</title>
+
+ <para>FreeBSD是一个多用户和多重处理的系统,
+ 这个介绍换句话来说就是一个系统可容纳许多不同的用户,
+ 谁都可以同时在单一结构下运行大量的程序。</para>
+
+ <para>每一个多用户系统都必须在某方面去区别<quote>user</quote>,
+ 在FreeBSD里 (和这&unix; 类似的操作系统),完成这方面工作是有必要的,
+ 每位使用者在运行程之前都必须<quote>登录</quote>,
+ 每位用户都有他的用户名 (<quote>username</quote>) 和密码
+ (<quote>password</quote>)。
+ FreeBSD 会在用户进入之前作出两次询问。</para>
+
+ <indexterm><primary>启动脚本</primary></indexterm>
+ <para>在FreeBSD启动和启动脚本正确运行完后
+ <footnote>
+ <para>启动脚本这些程序在FreeBSD在启动过程中运行。
+ 它们的主要功能为其他每方面的运行作好准备,
+ 和运行您的配置所用到的相关环境。</para>
+ </footnote>,它将要求您提供一个有效的用户名:
+ </para>
+
+ <screen>login:</screen>
+
+ <para>举个例子更容易理解,我们假设您的用户名叫<username>john</username>。
+ 在提示符下输入 <literal>john</literal>并单击<keycap>Enter</keycap>,
+ 此时您应该看到这个提示<quote>password</quote>:
+ </para>
+
+ <screen>login: <userinput>john</userinput>
+Password:</screen>
+
+ <para>现在输入 <username>john</username>的密码,和单击
+ <keycap>Enter</keycap>。这个密码是<emphasis>没有回显的!</emphasis>
+ 您在这时不必担心,它出于安全考虑才这样做的。</para>
+
+ <para>假如您输入的密码是正确的,您应该尽快进入FreeBSD并为练习可用的命令作好准备。
+ </para>
+
+ <para>您应该看见 <acronym>MOTD</acronym> 或者出现一个命令提示符
+ (<literal>#</literal>、<literal>$</literal> 或 <literal>%</literal> 字符).
+ 这表明您已成功登录进入FreeBSD。</para>
+ </sect2>
+
+ <sect2 id="consoles-virtual">
+ <title>多个控制台</title>
+
+ <para>在一个控制台运行 &unix; 命令虽说很好, 但FreeBSD具有一次运行
+ 多个程序的能力。仅使用一个控制台只会浪费FreeBSD同时运行多任务的能力。
+ 而<quote>虚拟控制台</quote>在这方面发挥强大的功能。</para>
+
+ <para>FreeBSD 能配置出给您不同需求的虚拟控制台,
+ 在键盘上您用一组键就能从各个虚拟控制台之间切换。
+ 各个控制台有自己的传输通道,
+ 当您从各个控制台切换时 FreeBSD
+ 会切换到合适的键盘传输通道和显示器传输通道。</para>
+
+ <para>FreeBSD 各个控制台之间可利用特殊组键切换并保留原有控制台
+ <footnote>
+ <para>关于 FreeBSD
+ 的控制台和键盘设备这些详细资料或使用技巧可在手册里找到:
+ &man.syscons.4;、&man.atkbd.4;、&man.vidcontrol.1;
+ 和 &man.kbdcontrol.1;。 我们不在这里详细介绍,
+ 但是爱好者总会在手册里找到详细的答案。</para>
+ </footnote>,您可这样做:
+ <keycombo><keycap>Alt</keycap><keycap>F1</keycap></keycombo>,
+ <keycombo><keycap>Alt</keycap><keycap>F2</keycap></keycombo>, 一直到
+ <keycombo><keycap>Alt</keycap><keycap>F8</keycap></keycombo>
+ 在FreeBSD里切换到其中一个虚拟控制台。</para>
+
+ <para>同样地, 您正在从其中某个控制台切换到另一个控制台的时候,
+ FreeBSD 会保存正在使用和恢复将要使用屏幕传输通道。
+ 这种结果形成一种 <quote>错觉</quote>,
+ 您拥有许多<quote>虚拟</quote>屏幕和键盘可以输入很多的命令。
+ 这些程序需要在一个虚拟控制台不能停止运行而又不需要观察它,
+ 它继续运行而您可以切换到其他的虚拟控制台。</para>
+ </sect2>
+
+ <sect2 id="consoles-ttys">
+ <title><filename>/etc/ttys</filename>文件</title>
+
+ <para>FreeBSD虚拟控制台的默认配置为8个,但并不是硬性设置,
+ 您可以很容易设置虚拟控制台的个数增多或减少。
+ 虚拟控制台的的编号和设置在<filename>/etc/ttys</filename> 文件里。</para>
+
+ <para>您可以使用<filename>/etc/ttys</filename>文件在FreeBSD下配置虚拟控制台。
+ 文件里每一未加注释的行都能设置一个终端或虚拟控制台
+ (当行里含有 <literal>#</literal> 这个字符时不能使用) 。
+ FreeBSD 默认配置是配置出9个虚拟控制台而只能启动8个,
+ 以下这些行是 <literal>ttyv</literal> 一起启动:</para>
+
+ <programlisting># name getty type status comments
+#
+ttyv0 "/usr/libexec/getty Pc" cons25 on secure
+# Virtual terminals
+ttyv1 "/usr/libexec/getty Pc" cons25 on secure
+ttyv2 "/usr/libexec/getty Pc" cons25 on secure
+ttyv3 "/usr/libexec/getty Pc" cons25 on secure
+ttyv4 "/usr/libexec/getty Pc" cons25 on secure
+ttyv5 "/usr/libexec/getty Pc" cons25 on secure
+ttyv6 "/usr/libexec/getty Pc" cons25 on secure
+ttyv7 "/usr/libexec/getty Pc" cons25 on secure
+ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure</programlisting>
+
+ <para>您能在这文件详细设置每行的参数,加载虚拟控制台启动所需要的物件。
+ 请参考 &man.ttys.5; 联机手册。</para>
+ </sect2>
+
+ <sect2 id="consoles-singleuser">
+ <title>单用户模式的控制台</title>
+
+ <para>关于 <quote>单用户模式</quote> 详细介绍在 <xref linkend="boot-singleuser">
+ 这里可以找到。 当您运行单用户模式时只能使用一个控制台,
+ 没有多个虚拟控制台可使用。 单用户模式的控制台同也可以在
+ <filename>/etc/ttys</filename> 文件设置,
+ 可在这行找到要启动的<literal>控制台</literal>:</para>
+
+ <programlisting># name getty type status comments
+#
+# If console is marked "insecure", then init will ask for the root password
+# when going to single-user mode.
+console none unknown off secure</programlisting>
+
+ <note>
+ <para>这个 <literal>console</literal> 已经注释掉,
+ 您可编辑这行把 <literal>secure</literal> 改为
+ <literal>insecure</literal>。 假如您这么做,
+ 当用单用户进入 FreeBSD 时, 它仍然要求提供
+ <username>root</username> 用户的密码。</para>
+
+ <para><emphasis>在把这个选项改为
+ <literal>insecure</literal></emphasis> 的时候一定要小心,
+ 如果您忘记了
+ <username>root</username>用户的密码, 进入单用户会有点麻烦。
+ 尽管仍然能进入单用户模式, 但如果您不熟悉它就会非常令人头疼。</para>
+ </note>
+ </sect2>
+ </sect1>
+
+ <sect1 id="permissions">
+ <title>权限</title>
+ <indexterm><primary>UNIX</primary></indexterm>
+
+ <para>FreeBSD,是 BSD &unix; 的延续, 并基于几个关键的 &unix; 观念。
+ 从一开始就多处提到 FreeBSD 是一个多用户的操作系统,
+ 它能分别处理几个同时工作的用户所分配的毫无关联任务。
+ 并负责为每位用户的硬件设备、 外设、 内存和
+ CPU 处理时间作出合理安排。</para>
+
+ <para>因为系统有能力支持多用户, 在每一方面系统都会作出谁能读、
+ 写和执行的资源权力限制。 这点权限以三个八位元的方式储存着,
+ 一个是表示文件所属者, 一个是表示文件所属群组, 一个是表示其他人。
+ 这些数字以下列方式表示:</para>
+
+ <indexterm><primary>权限</primary></indexterm>
+ <indexterm>
+ <primary>文件权限</primary>
+ </indexterm>
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>数值</entry>
+ <entry>权限</entry>
+ <entry>目录列表</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>不能读,不能写,不能执行</entry>
+ <entry><literal>---</literal></entry>
+ </row>
+
+ <row>
+ <entry>1</entry>
+ <entry>不能读,不能写,可执行</entry>
+ <entry><literal>--x</literal></entry>
+ </row>
+
+ <row>
+ <entry>2</entry>
+ <entry>不能读,可写,不能执行</entry>
+ <entry><literal>-w-</literal></entry>
+ </row>
+
+ <row>
+ <entry>3</entry>
+ <entry>不能读,可写,可执行</entry>
+ <entry><literal>-wx</literal></entry>
+ </row>
+
+ <row>
+ <entry>4</entry>
+ <entry>可读,不能写,不能执行</entry>
+ <entry><literal>r--</literal></entry>
+ </row>
+
+ <row>
+ <entry>5</entry>
+ <entry>可读,不能写,可执行</entry>
+ <entry><literal>r-x</literal></entry>
+ </row>
+
+ <row>
+ <entry>6</entry>
+ <entry>可读,可写,不能执行</entry>
+ <entry><literal>rw-</literal></entry>
+ </row>
+
+ <row>
+ <entry>7</entry>
+ <entry>可读,可写,可执行</entry>
+ <entry><literal>rwx</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <indexterm>
+ <primary><command>ls</command></primary>
+ </indexterm>
+ <indexterm><primary>目录</primary></indexterm>
+
+ <para>使用命令的 <option>-l</option> (&man.ls.1;)
+ 参数可以显示出文件的所属者、 所属组和其他人等属性。
+ 请看以下的例子:</para>
+
+ <screen>&prompt.user; <userinput>ls -l</userinput>
+total 530
+-rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile
+-rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile
+-rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt
+...</screen>
+
+ <para>使用 <command>ls -l</command> 在每行的开始出现了:</para>
+
+ <screen>-rw-r--r--</screen>
+
+ <para>从左边起的第一个字,告诉我们这个文件是一怎样的文件:
+ 普通文件?目录?特殊设备?套接字(socket)?或是pseudo-file device?
+ 在这个例子,<literal>-</literal>表示一个普通文件。
+ 接下来三个字是<literal>rw-</literal>是文件拥有者的权限。
+ 再接下来的三个字是<literal>r--</literal>是文件所属群组的权限。
+ 最後三个字是<literal>r--</literal>是其他人的权限。
+ 以这一个文件为例,他的权限设定是拥有者可以读写这个文件、群组可以读取、
+ 其他使用者也能读取这个文件。
+ 根据上面的表格, 用数字表示这个文件其三部分的权限应该是
+ <literal>644</literal>。 </para>
+
+ <para>这样很好,但系统怎样对设备进行权限控制的?
+ 事实上FreeBSD将大部份设备(的每一个设备)当作一个文件看待,
+ 用程序能打开、读取、写入数据就如其他的文件一样。
+ 而设备文件放在<filename>/dev</filename> 目录。
+ </para>
+
+ <para>目录也视为一种文件,也有读取、写入、执行的权限。
+ 但目录的执行权限意义并不与普通文件相同,
+ 实际上执行权限是进入权限。
+ 当一个目录是被标示可以执行的时候,那表示它可以被进入,
+ 利用<quote>cd</quote> (变化目录位置)可以进入。
+ 这意味着访问这些目录必须是谁才有权力
+ (当然目录下的文件也受到访问限制)。</para>
+
+ <para>详细方面,想读取一个目录的列表就必须设为可读权限,
+ 同时想删除一个已知的文件,就必须把目录下这个文件设为可写
+ <emphasis>和</emphasis> 执行权限。
+ </para>
+
+ <para>还有更多权限设定,
+ 但是他们大多用在特殊状况下如一个setuid的执行文件和粘贴性目录,
+ 如果想要得知有关文件权限和如何设定的更多资讯,请看手册&man.chmod.1;。
+ </para>
+
+ <sect2>
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>权限符号</title>
+ <indexterm><primary>权限</primary><secondary>符号</secondary></indexterm>
+
+ <para>权限符号,某些时候就是指符号表达式,
+ 使用八进制的字符给目录或文件分配权限。
+ 权限符号的使用语法是 (谁) (作用) (权限)。
+ 看看下列数值的在那些地方所起什么样的作用:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>选项</entry>
+ <entry>字母</entry>
+ <entry>介绍</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>(谁)</entry>
+ <entry>u</entry>
+ <entry>用户</entry>
+ </row>
+
+ <row>
+ <entry>(谁)</entry>
+ <entry>g</entry>
+ <entry>所属群体</entry>
+ </row>
+
+ <row>
+ <entry>(谁)</entry>
+ <entry>o</entry>
+ <entry>其他人</entry>
+ </row>
+
+ <row>
+ <entry>(谁)</entry>
+ <entry>a</entry>
+ <entry>所有人 (<quote>全部</quote>)</entry>
+ </row>
+
+ <row>
+ <entry>(作用)</entry>
+ <entry>+</entry>
+ <entry>增加权限</entry>
+ </row>
+
+ <row>
+ <entry>(作用)</entry>
+ <entry>-</entry>
+ <entry>减少权限</entry>
+ </row>
+
+ <row>
+ <entry>(作用)</entry>
+ <entry>=</entry>
+ <entry>确定权限</entry>
+ </row>
+
+ <row>
+ <entry>(权限)</entry>
+ <entry>r</entry>
+ <entry>可读</entry>
+ </row>
+
+ <row>
+ <entry>(权限)</entry>
+ <entry>w</entry>
+ <entry>可写</entry>
+ </row>
+
+ <row>
+ <entry>(权限)</entry>
+ <entry>x</entry>
+ <entry>执行</entry>
+ </row>
+
+ <row>
+ <entry>(权限)</entry>
+ <entry>t</entry>
+ <entry>粘贴位</entry>
+ </row>
+
+ <row>
+ <entry>(权限)</entry>
+ <entry>s</entry>
+ <entry>设置 UID 或 GID</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>这些数值 &man.chmod.1; 以习惯标定的。
+ 举个例子,用以下命令阻止其他人访问
+ <replaceable>FILE</replaceable>文件:</para>
+
+ <screen>&prompt.user; <userinput>chmod go= FILE</userinput></screen>
+
+ <para>倘若对一个文件作太多的变化设置可用逗号分开,
+ 在下面的例子里,
+ 可以去掉<replaceable>FILE</replaceable>文件的群体和 <quote>全部</quote> 可写权限,
+ 但所有人都可以有执行权限:
+ </para>
+
+ <screen>&prompt.user; <userinput>chmod go-w,a+x <replaceable>FILE</replaceable></userinput></screen>
+
+<!--
+ <para>大部份用户没有注意到这点,
+ 应当指出这个方法仅使用在配置一个文件权限,不会添加或删除(文件)。
+ </para>
+-->
+ </sect2>
+ </sect1>
+
+ <sect1 id="dirstructure">
+ <title>目录架构</title>
+ <indexterm><primary>目录层次</primary></indexterm>
+
+ <para>目录层次是理解一个系统的重要基础,
+ 最重要的莫过于它的根目录 <quote>/</quote>,
+ 这个目录在启动时就就挂上, 它包含了启动时所需的基本系统。
+ 这个根目录同样包含了您想挂上的每一个文件系统。</para>
+
+ <para>挂接点 (mount point) 是新增的文件系统根目录接入现有文件系统的目录,
+ 标准的挂接点包含
+ <filename>/usr</filename>、<filename>/var</filename>、
+ <filename>/mnt</filename>和 <filename>/cdrom</filename>。
+ 这些目录通常被纪录在 <filename>/etc/fstab</filename> 文件。
+ <filename>/etc/fstab</filename>
+ 文件是一个纪录系统上的多样文件系统和挂接点的表格,
+ <filename>/etc/fstab</filename>
+ 文件会依据这一个脚本 &man.rc.8; 在开机的时候被自动挂上,
+ 除非加上 <option>noauto</option> (非自动) 这个选项。
+ 请查阅手册 &man.fstab.5; 以了解
+ <filename>/etc/fstab</filename> 所用的格式和他包含的选项。</para>
+
+ <para>您可以由 &man.hier.7;得知 man page 提供了完整的目录架构的介绍。
+ 现在,我们介绍一般目录以供参考。</para>
+
+ <para>
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>目录</entry>
+ <entry>介绍</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><filename class="directory">/</filename></entry>
+ <entry>文件系统的根目录。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/bin/</filename></entry>
+ <entry>在单个用户和多用户环境下的基本工具目录。
+ </entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/boot/</filename></entry>
+ <entry>在操作系统在启动加载期间所用的程序和配置。
+ </entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/boot/defaults/</filename></entry>
+ <entry>默认每步引导启动的配置内容,请查阅&man.loader.conf.5;。
+ </entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/dev/</filename></entry>
+ <entry>设备接点,请查阅 &man.intro.4;。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/etc/</filename></entry>
+ <entry>系统启动的配置和脚本。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/etc/defaults/</filename></entry>
+ <entry>系统默认的启动配置和脚本,请参考 &man.rc.8; 。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/etc/mail/</filename></entry>
+ <entry>关系到邮件系统运作的配置, 请参考 &man.sendmail.8;。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/etc/namedb/</filename></entry>
+ <entry><command>named</command> 配置文件,请参考 &man.named.8;。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/etc/periodic/</filename></entry>
+ <entry>每天、每星期和每月周期性地运行的脚本,
+ 请通过 &man.cron.8;查阅 &man.periodic.8;。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/etc/ppp/</filename></entry>
+ <entry><command>ppp</command>配置文件,请查阅&man.ppp.8;。
+ </entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/mnt/</filename></entry>
+ <entry>由管理员习惯使用挂接点的临时空目录。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/proc/</filename></entry>
+ <entry>运行中的文件系统,请参阅 &man.procfs.5;
+ 和 &man.mount.procfs.8;。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/root/</filename></entry>
+ <entry><username>root</username>用户的Home(主)目录。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/sbin/</filename></entry>
+ <entry>在单个用户和多用户环境下的存放系统程序和管理所需的基本实用目录。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/stand/</filename></entry>
+ <entry>持久独一无二的程序环境。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/tmp/</filename></entry>
+ <entry>存放临时文件,通常存放一些系统重启后不需要保护的 &man.mfs.8;
+ 基于内存的文件系统。</entry>
+ </row>
+
+
+ <row>
+ <entry><filename class="directory">/usr/</filename></entry>
+ <entry>存放大多数用户的应用软件。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/bin/</filename></entry>
+ <entry>存放实用命令,程序设计工具,和应用软件。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/include/</filename></entry>
+ <entry>存放标准 C include 文件.</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/lib/</filename></entry>
+ <entry>存放库文件。</entry>
+ </row>
+
+
+ <row>
+ <entry><filename class="directory">/usr/libdata/</filename></entry>
+ <entry>存放各种实用工具的数据文件。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/libexec/</filename></entry>
+ <entry>存放系统实用或后台程序 (从另外的程序启动执行)。</entry>
+ </row>
+
+ <row>
+ <entry><filename
+ class="directory">/usr/local/</filename></entry>
+
+ <entry>存放本地执行文件, 库文件等等,
+ 同时也是 FreeBSD ports 安装的默认安装目录。
+ <filename>/usr/local</filename> 在
+ <filename>/usr</filename> 总体布置请查阅 man.hier.7;。
+ man 目录例外, 它们直接放在
+ <filename>/usr/local</filename> 而不是
+ <filename>/usr/local/share</filename> 下,
+ 而 ports 说明文档在
+ <filename>share/doc/<replaceable>port</replaceable></filename>。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/obj/</filename></entry>
+ <entry>通过联编 <filename>/usr/src</filename> 得到的目标文件。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/ports</filename></entry>
+ <entry>存放 FreeBSD 收集到的 ports (可选)。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/sbin/</filename></entry>
+ <entry>存放系统后台程序 和 系统工具 (由用户执行)。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/share/</filename></entry>
+ <entry>存放架构独立的文件。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/usr/src/</filename></entry>
+ <entry>存放 BSD 或者本地源码文件。</entry>
+ </row>
+
+ <row>
+ <entry><filename
+ class="directory">/usr/X11R6/</filename></entry>
+ <entry>存放 X11R6 可执行文件、 库文件、 配置文件等的目录(可选)。
+ </entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/var/</filename></entry>
+ <entry>存放多用途记录、临时性、短期的和打印假脱机系统文件.
+ </entry>
+ </row>
+
+
+ <row>
+ <entry><filename class="directory">/var/log/</filename></entry>
+ <entry>存放各种的系统记录文件。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/var/mail/</filename></entry>
+ <entry>存放用户mailbox(一种邮件存放格式)文件。</entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/var/spool/</filename></entry>
+ <entry>各种打印机和邮件系统spooling(回环)的目录。
+ </entry>
+ </row>
+
+ <row>
+ <entry><filename class="directory">/var/tmp/</filename></entry>
+ <entry>存放系统重启前受控制的临时文件。</entry>
+ </row>
+
+ <row>
+ <entry><filename>/var/yp</filename></entry>
+ <entry>NIS 映射。</entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+ </sect1>
+
+ <sect1 id="disk-organization">
+ <title>磁盘组织</title>
+
+ <para>FreeBSD 查找文件的最小单位是文件名。
+ 而文件名区分大小写,这就意味着
+ <filename>readme.txt</filename> 和 <filename>README.TXT</filename>
+ 是两个不相同的文件。 FreeBSD 不凭文件扩展名
+ (<filename>.txt</filename>) 去识别这个文件是
+ 程序、或是文档、或是其他格式的数据。</para>
+
+ <para>各种文件存放在目录里。 一个目录可以含有许许多多的文件,
+ 允许含有其他的目录,同样允许您添加不同层次的目录在里面。
+ 可以轻松地组织您的数据。</para>
+
+ <para>可以通过文件或目录名来指定文件和目录,
+ 在目录名后面加上一个斜线, <literal>/</literal>,
+ 如果需要的话。 如果您有一个名为 <filename>foo</filename>
+ 的目录, 它包含另一个目录
+ <filename>bar</filename>, 后者重包括一个叫
+ <filename>readme.txt</filename> 的文件, 则全名, 或者说到文件的
+ <firstterm>路径</firstterm> 就是
+ <filename>foo/bar/readme.txt</filename>。</para>
+
+ <para>在文件系统里目录和文件的作用是存储数据。
+ 每一个文件系统都正确含有一个顶级目录<firstterm>根目录</firstterm>,
+ 这个根目录包含其他目录。</para>
+
+ <para>您也许在其他的一些操作系统碰到类似这里的情况,
+ 当然也有不同的情况。 举些例子, &ms-dos; 是用
+ <literal>\</literal> 分隔文件名或目录名,
+ 而 &macos; 则使用<literal>:</literal>。</para>
+
+ <para>FreeBSD在路径方面不使用驱动器名符号或驱动器名称,
+ 在FreeBSD里您不能这样使用:
+ <filename>c:/foo/bar/readme.txt</filename>。</para>
+
+ <para>为了代替(驱动器名符号), 一个文件系统会指定 <firstterm>根
+ 文件系统</firstterm>, 根文件系统的根目录是
+ <literal>/</literal>。 其他每一个文件系统
+ <firstterm>挂接在</firstterm>根文件系统下。
+ 无论有多少磁盘在FreeBSD 系统里, 每个磁盘都会以目录的方式加上。</para>
+
+ <para>假设您有三个文件系统, 名为 <literal>A</literal>、
+ <literal>B</literal> 和 <literal>C</literal>。
+ 每个文件系统有一个根目录, 而各自含有两个其他的目录, 名为
+ <literal>A1</literal>, <literal>A2</literal> (
+ <literal>B1</literal>, <literal>B2</literal> 和
+ <literal>C1</literal>, <literal>C2</literal>)。</para>
+
+ <para>看看 <literal>A</literal> 这个根文件系统。 假如您用
+ <command>ls</command> 命令来查看这个目录您会见到两个子目录:
+ <literal>A1</literal> 和 <literal>A2</literal>。
+ 这个目录树是这个样子:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/example-dir1" format="EPS">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced"> /
+ |
+ +--- A1
+ |
+ `--- A2</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>一个文件系统必须挂到另一个文件系统的某一目录,
+ 所以现在假设把 <literal>B</literal> 文件系统挂到
+ <literal>A1</literal>目录, 那 <literal>B</literal> 根目录因此代替
+ 了 <literal>A1</literal>,而显示出 <literal>B</literal>
+ 目录(的内容):</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/example-dir2" format="EPS">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced"> /
+ |
+ +--- A1
+ | |
+ | +--- B1
+ | |
+ | `--- B2
+ |
+ `--- A2</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>无论<literal>B1</literal> 或
+ <literal>B2</literal> 目录在那里而延伸出来的路径必须为
+ <filename>/A1/B1</filename> 或 <filename>/A1/B2</filename>。
+ 而在 <filename>/A1</filename> 里原有的文件会临时隐藏。
+ 想这些文件再出现把 <literal>B</literal> 从 A
+ <firstterm>挂接释放</firstterm>。</para>
+
+ <para>把 <literal>B</literal> 挂接在 <literal>A2</literal>
+ 那图表的样子就是这样子:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/example-dir3" format="EPS">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced"> /
+ |
+ +--- A1
+ |
+ `--- A2
+ |
+ +--- B1
+ |
+ `--- B2</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>这个路径分别是 <filename>/A2/B1</filename> 和
+ <filename>/A2/B2</filename> 。</para>
+
+ <para>文件系统能把顶部挂接上另一个文件系统上。
+ 继续这个例子, 把 <literal>C</literal> 文件系统挂接在
+ <literal>B</literal> 文件系统里的 <literal>B1</literal> 目录,
+ 排列如下:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/example-dir4" format="EPS">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced"> /
+ |
+ +--- A1
+ |
+ `--- A2
+ |
+ +--- B1
+ | |
+ | +--- C1
+ | |
+ | `--- C2
+ |
+ `--- B2</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>或者把 <literal>C</literal> 文件系统挂接在 <literal>A</literal>
+ 文件系统里的<literal>A1</literal>目录:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/example-dir5" format="EPS">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced"> /
+ |
+ +--- A1
+ | |
+ | +--- C1
+ | |
+ | `--- C2
+ |
+ `--- A2
+ |
+ +--- B1
+ |
+ `--- B2</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>假如您熟悉 &ms-dos;并知到<command>join</command> 命令,
+ 尽管不相同,其实是相似的。</para>
+
+ <para>这方面不是普通知识而且涉及到您自己所关心的,
+ 当您安装FreeBSD并在以后添加新磁盘时,
+ 您必须知到该如何新建文件系统和挂接上。</para>
+
+ <para>(FreeBSD系统)它有一个主要的根文件系统, 不需要另外新建立,
+ 但当需要手工处理时,这是一个有用的知识。</para>
+
+ <itemizedlist>
+ <title>多样性文件系统的益处</title>
+
+ <listitem>
+ <para>不同的文件系统可用不同的 <firstterm>挂接参数</firstterm>。
+ 举些例子, 仔细想一下, 根文件系统能用只读的方的方式挂接上,
+ 防止不经意删除或编辑到一个危险的文件。
+ 把各用户能写入的文件系统分开,
+ 像<filename>/home</filename>这样,
+ 由另外的文件系统分别用
+ <firstterm>nosuid</firstterm> 参数挂接,这个参数防止
+ <firstterm>suid</firstterm>/<firstterm>guid</firstterm>
+ 在执行这个文件系统中的文件时生效, 从而缓解了一些安全问题。</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD 对一个文件系统的文件布局自动优化,
+ 并依赖文件系统的使用习惯。
+ 所以一个文件系统应有一个针对大量小型文件频繁写入的优化,
+ 另外大型文件系统的优化也应落实。</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD 的文件系统能够在断电时尽可能避免损失。
+ 然而, 在关键点时的电源失效仍然可能会破坏文件系统的结构。
+ 将您的文件系统分成多个有助于分散风险, 并方便备份和恢复。</para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist>
+ <title>统一文件系统的益处</title>
+
+ <listitem>
+ <para>文件系统是固定大小的。
+ 当安装FreeBSD时新建一个文件系统并设定一个大小,
+ 您会在稍后发觉到必须去建一个大的分区。
+ 如果配置不当, 则需要备份、 重新创建文件系统,
+ 然后再恢复数据。</para>
+
+ <important>
+ <para>FreeBSD&nbsp;4.4 或更高的版本提供了 &man.growfs.8;
+ 命令。 这使得能够实时地调整文件系统的大小,
+ 因而不再受其限制。</para>
+ </important>
+ </listitem>
+ </itemizedlist>
+
+ <para>文件系统是和分区一一对应的。
+ 这里的分区和常用的术语分区 (例如, &ms-dos; 分区)
+ 的意思并不一样, 这是由于 &os; 的 &unix; 传统造成的。
+ 每一个分区使用一个从 <literal>a</literal> 到
+ <literal>h</literal> 的字母来表示。 每个分区只能包含一个文件系统,
+ 这意味着文件系统通常可以由它们在文件系统目录结构中的挂接点,
+ 或对应的分区字母来表示。</para>
+
+ <para>FreeBSD 的 <firstterm>交换分区</firstterm> 也需要使用磁盘空间。
+ 交换分区是给 FreeBSD 作 <firstterm>虚拟内存</firstterm> 使用的,
+ 这样能令您的计算机有更多的内存可使用,
+ 当FreeBSD在运行而内存不够的时候,
+ 它会把其他一些可转移的数据转移到交换分区,
+ 空出内存的位置以供使用。</para>
+
+ <para>某些 partitions 的用途是确定的。</para>
+
+ <informaltable frame="none" pgwide="1">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="5*">
+
+ <thead>
+ <row>
+ <entry>分区</entry>
+
+ <entry>约定</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><literal>a</literal></entry>
+
+ <entry>通常指定为根文件系统</entry>
+ </row>
+
+ <row>
+ <entry><literal>b</literal></entry>
+
+ <entry>通常指定为交换分区</entry>
+ </row>
+
+ <row>
+ <entry><literal>c</literal></entry>
+
+ <entry>通常它和所在的 slice 大小相同。
+ <literal>c</literal> 分区上工作时必定会影响到事整个
+ slice (举个例子,坏块扫描器)。
+ 您通常不愿意在这个partition建立文件系统。</entry>
+ </row>
+
+ <row>
+ <entry><literal>d</literal></entry>
+
+ <entry>分区 <literal>d</literal> 曾经有特殊的含义,
+ 虽然(对我们来说)早已远离而去。
+ 但直到今天,一些工具在
+ 分区 <literal>d</literal>上运行会发生古怪事情, 所以
+ <application>sysinstall</application> 通常不建立分区
+ <literal>d</literal>。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>每一个包含了文件系统的分区被保存在
+ FreeBSD 称为 <firstterm>slice</firstterm> 的部分上。
+ Slice 是一个 FreeBSD 术语, 通常被叫做分区,
+ 再次强调, 这是由于
+ FreeBSD 的 &unix; 背景。 Slices 有其编号, 从1到4。</para>
+
+ <indexterm><primary>slices</primary></indexterm>
+ <indexterm><primary>partitions</primary></indexterm>
+ <indexterm><primary>专用 (dangerously dedicated)</primary></indexterm>
+
+ <para>Slice 编号在设备名后面, 并有一个 <literal>s</literal>
+ 前缀, 从 1 开始。 因此 <quote>da0<emphasis>s1</emphasis></quote>
+ 是第一个 SCSI 驱动器的第一个 slice。 每个磁盘上只能有四个物理的
+ slices, 但您可以在物理 slice 中使用适当的类型来创建逻辑 slice。
+ 这些扩展 slice 编号从 5 开始, 因此
+ <quote>ad0<emphasis>s5</emphasis></quote> 是第一个 IDE 磁盘中的第一个
+ 扩展 slice。 文件系统所使用的设备应该占满 slice。</para>
+
+ <para>Slices, <quote>专项指定</quote> 物理驱动器,
+ 和其他驱动器都包含<firstterm>partitions</firstterm>,
+ 那几个的partitions都是用字母
+ 从 <literal>a</literal> 到 <literal>h</literal>来标定的,
+ 而这些字母都在驱动器名字之后,所以
+ <quote>da0<emphasis>a</emphasis></quote> 是指首个da设备的 a partition,
+ 而那个就是 <quote>专项指定</quote>。
+ <quote>ad1s3<emphasis>e</emphasis></quote> 是指IDE磁盘第三个slice的第五个partition。
+ </para>
+
+ <para>最终,每个磁盘都被系统识别。
+ 一个磁盘名字是用磁盘类型代码和编号来标识的,
+ 它不像slices,磁盘的编号是由0开始的。
+ 对应代码请看这里所列出的<xref linkend="basics-dev-codes">。
+ </para>
+
+ <para>当提供一个partition名字给FreeBSD时,
+ slice 和 磁盘所必须有这个partition,还应当提供所partition所涉及
+ 到的slice和磁盘的名字。可这样列出:
+ 磁盘名称,<literal>s</literal>,slice 编号,和partition标定字母。
+ 例子请看这里
+ <xref linkend="basics-disk-slice-part">。</para>
+
+ <para><xref linkend="basics-concept-disk-model">
+ 这里显示了一个磁盘的布局,有更清楚的帮助。
+ </para>
+
+ <para>在安装FreeBSD时,您首先要配置好磁盘slices,
+ 然后在FreeBSD使用的slice上建立partitions。
+ 并在每个partition上建立一个文件系统(或交换分区),
+ 和指定文件系统的挂接位置。
+ </para>
+
+ <table frame="none" pgwide="1" id="basics-dev-codes">
+ <title>磁盘设备的代码</title>
+
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="5*">
+
+ <thead>
+ <row>
+ <entry>代码</entry>
+
+ <entry>说明</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><devicename>ad</devicename></entry>
+
+ <entry>ATAPI (IDE) 磁盘</entry>
+ </row>
+
+ <row>
+ <entry><devicename>da</devicename></entry>
+
+ <entry>SCSI 直接存取磁盘</entry>
+ </row>
+
+ <row>
+ <entry><devicename>acd</devicename></entry>
+
+ <entry>ATAPI (IDE) 光驱</entry>
+ </row>
+
+ <row>
+ <entry><devicename>cd</devicename></entry>
+
+ <entry>SCSI 光驱</entry>
+ </row>
+
+ <row>
+ <entry><devicename>fd</devicename></entry>
+
+ <entry>软驱</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <example id="basics-disk-slice-part">
+ <title>样例磁盘, Slice, 和 Partition 它们的命名</title>
+
+ <informaltable frame="none" pgwide="1">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="5*">
+
+ <thead>
+ <row>
+ <entry>命名</entry>
+
+ <entry>说明</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><literal>ad0s1a</literal></entry>
+
+ <entry>在首个IDE磁盘(<literal>ad0</literal>)上的
+ 第一个slice (<literal>s1</literal>)里的
+ 第一个partition (<literal>a</literal>)。
+ </entry>
+ </row>
+
+ <row>
+ <entry><literal>da1s2e</literal></entry>
+
+ <entry>在第二个SCSI磁盘(<literal>da1</literal>)上的
+ 第二个slice(<literal>s2</literal>)里的
+ 第五个partition(<literal>e</literal>)。
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </example>
+
+ <example id="basics-concept-disk-model">
+ <title>一个磁盘的布局</title>
+
+ <para>
+ 从在系统里的首个IDE磁盘图表可以显示出FreeBSD的见解。
+ 假设磁盘大小为4&nbsp;GB,它里面包含了两个2&nbsp;GB 大小的slices (但在&ms-dos;叫partitions)。
+ 首个slice是一个&ms-dos;磁盘叫<devicename>C:</devicename>,
+ 而第二个slice是FreeBSD配置好的slice。
+ FreeBSD配置好的slice有三个partitions和另一个交换分区。
+ </para>
+
+ <para>
+ 这三个partitions各自控制一个文件系。
+ partition<literal>a</literal>用于根文件系统,
+ partition<literal>e</literal>用于<filename>/var</filename>目录层,
+ partition<literal>f</literal>用于<filename>/usr</filename>目录层。
+ </para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disk-layout" format="EPS">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced">.-----------------. --.
+| | |
+| DOS / Windows | |
+: : > First slice, ad0s1
+: : |
+| | |
+:=================: ==: --.
+| | | Partition a, mounted as / |
+| | > referred to as ad0s2a |
+| | | |
+:-----------------: ==: |
+| | | Partition b, used as swap |
+| | > referred to as ad0s2b |
+| | | |
+:-----------------: ==: | Partition c, no
+| | | Partition e, used as /var > filesystem, all
+| | > referred to as ad0s2e | of FreeBSD slice,
+| | | | ad0s2c
+:-----------------: ==: |
+| | | |
+: : | Partition f, used as /usr |
+: : > referred to as ad0s2f |
+: : | |
+| | | |
+| | --' |
+`-----------------' --'</literallayout>
+ </textobject>
+ </mediaobject>
+ </example>
+ </sect1>
+
+
+
+ <sect1 id="mount-unmount">
+ <title>文件系统的挂接和卸下</title>
+
+ <para>
+ 这种文件系统就像一棵树那样用<filename>/</filename>确立根部,
+ 是比较理想的文件系统。
+ 而<filename>/dev</filename>、 <filename>/usr</filename>和其他目录
+ 就是根目录的分枝,
+ 另外这些目录可以再分枝,例如<filename>/usr/local</filename>。
+ </para>
+
+ <indexterm><primary>根文件系统</primary></indexterm>
+ <para>应该考虑给某些目录一些空间从而分散文件系统。
+ <filename>/var</filename>
+ 之下包含目录 <filename>log/</filename>,目录<filename>spool/</filename>,
+ 和不同类型的临时文件,很可能把它塞满。
+ 把什么都塞进根文件系统不是一个好主意,
+ 好的做法是应该把 <filename>/var</filename> 从
+ <filename>/</filename>分离出去。</para>
+
+ <para>另一个要考虑的是,给物理设备或虚拟磁盘这些自带空间的文件系统确定目录结构树。
+ 例如 <link
+ linkend="network-nfs">网络文件系统</link> 或光驱的挂接。
+ </para>
+
+ <sect2 id="disks-fstab">
+ <title><filename>fstab</filename> 文件</title>
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>使用fstab的挂接</secondary>
+ </indexterm>
+
+ <para>在<link linkend="boot">导入处理</link>期间,
+ 自动挂上<filename>/etc/fstab</filename>所列出的文件系统。
+ (除非他们注明为<option>noauto</option> 选项)。
+ </para>
+
+ <para> <filename>/etc/fstab</filename> 文件包含的各行的列表格式如下:
+ </para>
+
+ <programlisting><replaceable>device</replaceable> <replaceable>/mount-point</replaceable> <replaceable>fstype</replaceable> <replaceable>options</replaceable> <replaceable>dumpfreq</replaceable> <replaceable>passno</replaceable></programlisting>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>device</literal></term>
+ <listitem>
+ <para>设备名称(设备必须存在), 说明在
+ <xref linkend="disks-naming">.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>mount-point</literal></term>
+
+ <listitem><para>目录 (目录必须存在),
+ 用在那个挂接上的文件系统上。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>fstype</literal></term>
+
+ <listitem><para>文件系统类型,请通过&man.mount.8;查阅。
+ 默认的FreeBSD文件系统类型是<literal>ufs</literal>。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>options</literal></term>
+
+ <listitem><para>
+ 设为可读写文件系统的<option>rw</option>选项,
+ 或设为只读文件系统的<option>ro</option>选项,
+ 或其他一些选项,可随意选一个。
+ 一个常用的选项 <option>noauto</option> 用在不需在导入期间挂接的文件系统。
+ 其他的选项在 &man.mount.8; 手册里列出。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>dumpfreq</literal></term>
+
+ <listitem><para>&man.dump.8; 使用这项去决定那个
+ 文件系统必须移贮。假如缺少这项,默认的数值为0。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>passno</literal></term>
+
+ <listitem>
+ <para>这一项决定文件系统的检查顺序,
+ 文件系统想跳过检查应将<literal>passno</literal>设为0。
+ 根文件系统(那个是在每方面开始之前必须检查的)
+ 应该将它的 <literal>passno</literal> 设为1,
+ 其他文件系统的 <literal>passno</literal>
+ 必须把数值设到大于1。假如多个文件系统的<literal>passno</literal>的值相同,
+ 那么&man.fsck.8; 在充许的情况下将尝试并行地去检查文件系统。
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2 id="disks-mount">
+ <title> <command>mount</command> 命令</title>
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>挂接</secondary>
+ </indexterm>
+
+ <para>这个 &man.mount.8; 命令是挂接文件系统的基本运用。
+ </para>
+
+ <para>使用最多的基本格式:</para>
+
+ <informalexample>
+ <screen>&prompt.root; <userinput>mount <replaceable>device</replaceable> <replaceable>mountpoint</replaceable></userinput></screen>
+ </informalexample>
+
+ <para>它的选项非常多,而&man.mount.8; 手册同样提及, 但常用的都在这里:</para>
+
+ <variablelist>
+ <title>挂接的各种选项</title>
+
+ <varlistentry>
+ <term><option>-a</option></term>
+
+ <listitem>
+ <para>挂接<filename>/etc/fstab</filename>里所有列出的文件系统。
+ 除非标记为 <quote>noauto</quote> 或作了排除在外的
+ <option>-t</option> 类型标记,或者在这之前已挂上。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-d</option></term>
+
+ <listitem>
+ <para>除了实际上系统调用以外,可以完成任何事情,这个选项是和
+ <option>-v</option>参数一起连在一块使用,可以决定&man.mount.8;所做的事情。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-f</option></term>
+
+ <listitem>
+ <para>强制去挂接一个未知的文件系统(会有危险),
+ 或当把一个文件系统挂接状态由可读写降为只读时,强制撤消可写通道。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-r</option></term>
+
+ <listitem>
+ <para>以只读的方式挂上文件系。
+ 使用<option>-o</option> 选项加<option>rdonly</option>是一样的。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-t</option>
+ <replaceable>fstype</replaceable></term>
+
+ <listitem>
+ <para>根据给出的文件系统类型挂接文件系统,
+ 假如给于<option>-a</option>选项,仅挂接这个类型的文件系统。
+ </para>
+
+ <para><quote>ufs</quote> 是默认的文件系统类型。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-u</option></term>
+
+ <listitem>
+ <para>在文件系统上修改挂接选项。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-v</option></term>
+
+ <listitem>
+ <para>版本模式。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-w</option></term>
+
+ <listitem>
+ <para>以可读写方式挂接文件系统。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>The <option>-o</option> 选项采用一个逗号分开以下多个选项:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>nodev</term>
+
+ <listitem>
+ <para>拒绝把文件系统识别为特别的设备。这是一个有用的安全选项。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>noexec</term>
+
+ <listitem>
+ <para>不允许文件系统上的二进制程序执行。这也是一个有用的安全选项。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>nosuid</term>
+
+ <listitem>
+ <para>不允许文件系统上的 setuid 或 setgid 标记生效。这也是一个有用的安全选项。
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2 id="disks-umount">
+ <title> <command>umount</command> 命令</title>
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>卸下</secondary>
+ </indexterm>
+
+ <para>&man.umount.8; 命令同样采用一个参数、一个挂接点、一个设备名。
+ 或采用<option>-a</option>选项,又或采用<option>-A</option>选项。
+ </para>
+
+ <para>所有格式都可采用 <option>-f</option> 去强行卸下,
+ 或采用<option>-v</option> 用那适当的版本。 但警告,采用
+ <option>-f</option>并不是一个好主意,
+ 强行卸下文件系统可能损坏计算机或破坏文件系统上的数据。
+ </para>
+
+ <para><option>-a</option> 和 <option>-A</option> 会卸下所有已挂接的文件系,
+ 可能通过<option>-t</option>后面列出的文件系统进行修改,
+ 但无论如何,<option>-A</option>都不会尝试去卸下根文件系统。
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="basics-processes">
+ <title>进程</title>
+
+ <para>FreeBSD 是一个多任务操作系统。
+ 这就意味着好像一次可以运行一个以上的程序。
+ 每个占用一定时间运行的程序就叫<firstterm>process</firstterm>。
+ 每个程序启动运行时至少有一个新进程,并在所有运行的时候保持有一个系统进程的编号,
+ 而一直由系统对它监管。
+ </para>
+
+ <para>每个进程用来标识的一个编号就叫
+ <firstterm>进程 ID</firstterm>, 或叫 <firstterm>PID</firstterm>。
+ 而且,就像文件那样,每个进程也有所属用户和所属群体。
+ 所属用户和所属群体使用在这方面:确定这个进程可以打开那些文件和那些设备,
+ 从而在初期使用文件的权限。 多数的进程都同样有一个父进程,
+ 而进程是依靠父进程来启动的。
+ 例如,假如您把命令输入到shell里那shell是一个进程,而您运行的各个命令同样是进程,
+ 那么,shell就是您各个运行进程的父进程。
+ 而这方面有一个例外的进程就叫&man.init.8;。
+ <command>init</command>始终是首个进程,,所以他的PID始终是1,
+ 而<command>init</command>在FreeBSD起动时由内核自动启动。</para>
+
+ <para>在系统上,有两个命令对进程观察非常有用:&man.ps.1; 和 &man.top.1;。
+ 这个<command>ps</command>命令作用是观察当前运行进程的状态,
+ 显示他们的PID,使用了多少内存,它们启动的命令行。
+ 而<command>top</command>命令则是显示所有运行进程,并在以秒计的短时内更新数据。
+ 您能交互式的观察您计算机的工作。
+ </para>
+
+ <para>默认情况下, <command>ps</command>仅显示出您自己所运行的命令。
+ 例如:</para>
+
+ <screen>&prompt.user; <userinput>ps</userinput>
+ PID TT STAT TIME COMMAND
+ 298 p0 Ss 0:01.10 tcsh
+ 7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
+37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
+48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
+48730 p0 IW 0:00.00 (dns helper) (navigator-linux-)
+72210 p0 R+ 0:00.00 ps
+ 390 p1 Is 0:01.14 tcsh
+ 7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y
+ 6688 p3 IWs 0:00.00 tcsh
+10735 p4 IWs 0:00.00 tcsh
+20256 p5 IWs 0:00.00 tcsh
+ 262 v0 IWs 0:00.00 -tcsh (tcsh)
+ 270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
+ 280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
+ 284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc
+ 285 v0 S 0:38.45 /usr/X11R6/bin/sawfish</screen>
+
+ <para>在这个例子里您可看到,从 &man.ps.1; 输出的每一列是有规律的。
+ <literal>PID</literal> 就是进程ID,这个较早前已讨论过了。
+ PID号的分配由 1一直上升直到99999,
+ 当您运行到超过限制时,这些编号会回转分配。
+ <literal>TT</literal>这一列显示了程序运行所在的终端, 目前可以安全地忽略。
+ <literal>STAT</literal> 显示程序的状态,也可以安全地被忽略。
+ <literal>TIME</literal>是程序在CPU处理时间&mdash;运行的时间量,
+ 并不是指您程序启动到现在的所用的时间。
+ 许多程序碰巧遇到某方面在他们之前要花费大量CPU处理时间时,他们就必须等候。
+
+ Finally, <literal>COMMAND</literal> is the command line that was used to
+ run the program.</para>
+
+ <para>&man.ps.1;支持使用各种选项去改变显示出来的内容,
+ 最有用的一个就是<literal>auxww</literal>。
+ <option>a</option>选项显示出所有运行进程的内容,而且显示出进程的并一定是您的进程。
+ <option>u</option>选项显示出进程所归属的用户名字以及内存使用,
+ <option>x</option> 选项显示出后台进程。 而
+ <option>ww</option> 选项表示为 &man.ps.1; 把整个命令行全部显示完,
+ 而不是由于命令行过长就把它从屏幕上截去。</para>
+
+ <para>下面和从&man.top.1;输出是类似的,一个示例式对话就象这样子:
+ </para>
+
+ <screen>&prompt.user; <userinput>top</userinput>
+last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10
+47 processes: 1 running, 46 sleeping
+CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle
+Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
+Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
+
+ PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND
+72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top
+ 7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14
+ 281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA
+ 296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm
+48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu
+ 175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd
+ 7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt
+...</screen>
+
+ <para>这个输出分成两部份。 前面部份(起始前五行)
+ 显示了:运行于最后进程的PID、 系统负载均衡
+ (那个是指系统繁忙时的调节方式)、 系统正常运行时间 (
+ 指从启动算起所用的时间) 和当前时间。 前面部份另外的图表
+ 涉及:多少进程在运行(这个情况是47), 多少内存和多少交换分区在使用,
+ 和在不同CPU状态里系统消耗多少时间。</para>
+
+ <para>在那下面一连串的纵列和从&man.ps.1;输出的的内存是相似的。
+ 如以前&man.ps.1;一样,您能见到:PID、用户名、CPU处理时间合计、运行的命令。
+ &man.top.1;默认是显示您的进程所用内存空间的合计。
+ 内存空间这里分成两列,一列为总体大小,另一列是必须请求驻留大小是多少内存&mdash;总体大小。
+ 而驻留大小实际上是瞬间使用的多少。
+ 在以上那个例子,您会看到那<application>&netscape;</application>总计需要30&nbsp;MB内存,
+ 但实际只用了9&nbsp;MB。
+ </para>
+
+ <para>&man.top.1; 每两秒自动刷新一次,您可以用<option>s</option>改变刷新的秒数。
+ </para>
+ </sect1>
+
+ <sect1 id="basics-daemons">
+ <title>守护进程,信号和杀死进程</title>
+
+ <para>当您运行一个编辑器时它是很容易控制的,告诉它去加载文件它就加载。
+ 您之所以能这样做,是因为编辑器提供这样便利去这样做,和因为有编辑器去附上的<firstterm>终端</firstterm>。
+ 一些程序在运行中不需要连续的用户输入,一有机会就从终端里分离到后台去。
+ 例如,一个web系统整天都在作web请求的响应,他不需要您输入任何东西就能完成,
+ 这个类别的另一个例子就是把email的传送。
+ </para>
+
+ <para>我们把那些程序叫<firstterm>守护进程</firstterm>。
+ 守护神是希腊神话中的一些人物,非正非邪,他们是些守护小幽灵,大体上为人类作出贡献。
+ 许多类似web系统或mail系统的系统对于今天仍有用途,
+ 这就是为什么在那么长的时间里,BSD的吉祥物保持为一双鞋加一把钢叉的守护神模样。
+ </para>
+
+ <para>守护进程的程序命名通常在最后加一个<quote>d</quote>。
+ <application>BIND</application>是伯克莱互联网络守护进程命名(and the actual program that executes is called
+ <command>named</command>),
+ <application>Apache</application>web系统的程序就叫<command>httpd</command>,
+ 在行式打印机上的打印守护进程就是<command>lpd</command>。
+ 这只是一种惯例,不是标准或硬性规定。
+ 例如,为<application>Sendmail</application>而应用的主要mail守护进程就叫<command>sendmail</command>,
+ 却不叫<command>maild</command>,这和您推测的一样。
+ </para>
+
+ <para>有时您必须和一个守护进程的程序通信,这些通信就叫<firstterm>信号</firstterm>。
+ 您能发送一个信号给守护进程(或有关的另一些运行进程)与它进行通信,
+ 各个不同的信号各自就是一个数字编号,而您所发送的&mdash;数字编号各自有一个特殊的含义。
+ 有些人把信号解悉为'请求',并在'请求'的文档里告诉您怎样把信号理解为请求。
+ 您只能给所属于您的进程发信号,假如您给其他人的进程发信号,
+ 进程就会用&man.kill.1; 或 &man.kill.2;权限进行拒绝。
+ 当然,<username>root</username> 用户会例外,它能把各种信号发送给每个进程。
+ </para>
+
+ <para>在某些案例里,FreeBSD也会向应用软件发送信号。
+ 假如一个应用软件含有恶意写入并试图去访问内存,那是不可想象的,FreeBSD会向那个进程发送
+ <firstterm>段式违规</firstterm> 信号 (<literal>SIGSEGV</literal>)。
+ 假如一个应用软件使用&man.alarm.3;系统去进行周期性调用闹钟功能,每当达到时间时,
+ FreeBSD会向应用软件发送闹钟信号(<literal>SIGALRM</literal>)。
+ </para>
+
+ <para>有两个信号可以停止进程:<literal>SIGTERM</literal> 和 <literal>SIGKILL</literal>。
+ <literal>SIGTERM</literal>比较友好,进程能<emphasis>捕捉</emphasis>这个信号,
+ 根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。
+ 在一些案例里,假如进程正在进行作业而且不能中断,那么进程可以忽略这个<literal>SIGTERM</literal>信号。
+ </para>
+
+ <para>对于<literal>SIGKILL</literal>信号,进程是不能忽略的。 这是一个
+ '<quote>我不管您在做什么,立刻停止</quote>'的信号。
+ 假如您发送<literal>SIGKILL</literal>信号给进程,
+ FreeBSD就将进程停止在那里。<footnote>
+ <para>有点不正确&mdash;少数的东西是不能中断的。
+ 例如,假如进程试图从网络上另一个计算机的一个文件读取,
+ 而那个的计算机会因为某些原因拿走了这个文件,那这个进程从上术情况来看是<quote>不能中断</quote>。
+ 最终这个进程会超时,典型的两分钟。一出现超时进程将被杀死。
+ </para>
+ </footnote>.</para>
+
+ <para>您可能会去使用
+ <literal>SIGHUP</literal>、 <literal>SIGUSR1</literal> 和
+ <literal>SIGUSR2</literal>信号。 这都是些通用的信号,各种应用程序都可以应用
+ 在各方面的信号发送。
+ </para>
+
+ <para>假如您改变了web系统的配置文件&mdash;并想web系统去重读它的配置,
+ 您可以停止然后再启动<command>httpd</command>。但这样做web系统会导致一个短暂
+ 的中断周期,那样是不受欢迎的。几乎所有的守护进程在编写时,都会指定对<literal>SIGHUP</literal>
+ 信号进行响应从而重读配置文件。
+ 所以最好的方法就是不去杀死并重启<command>httpd</command>,而是发一个<literal>SIGHUP</literal>信号给他。
+ 因为在这方面没有一个标准,不同的守护进程有不同的用法,所以不了解时应读一下守护进程的文档。
+ </para>
+
+ <para>发送信号可用&man.kill.1; 命令, 请参考&man.kill.1;所列出的例子。
+ </para>
+
+ <procedure>
+ <title>发送一个信号给进程</title>
+
+ <para>这个例子显示了怎样去发一个信号给&man.inetd.8;。
+ <command>inetd</command>配置文件是<filename>/etc/inetd.conf</filename>,
+ 如果想<command>inetd</command> 去重读文件系统的话,可以给它发一个<literal>SIGHUP</literal>
+ 信号。
+ </para>
+
+ <step>
+ <para>寻找您要发送信号的进程ID,可以用&man.ps.1; 加 &man.grep.1;来完成。
+ &man.grep.1;命令被用在搜索输出方面,搜索您指定的字符串。
+ 这命令是由普通用户来执行的,而&man.inetd.8;是<username>root</username>用户运行的,
+ 所以必须给&man.ps.1;带上<option>ax</option>选项。
+ </para>
+
+ <screen>&prompt.user; <userinput>ps -ax | grep inetd</userinput>
+ 198 ?? IWs 0:00.00 inetd -wW</screen>
+
+ <para>得出 &man.inetd.8; PID号是198。 有时
+ <literal>grep inetd</literal> 命令也出现在输出中,
+ 这是因为在这方面 &man.ps.1; 也是寻找列表中运行进程。
+ </para>
+ </step>
+
+ <step>
+ <para>使用 &man.kill.1; 去发送信号。 因为 &man.inetd.8;
+ 是由 <username>root</username>启动的, 您必须使用 &man.su.1; 去
+ 变为 <username>root</username> 用户。</para>
+
+ <screen>&prompt.user; <userinput>su</userinput>
+<prompt>Password:</prompt>
+&prompt.root; <userinput>/bin/kill -s HUP 198</userinput></screen>
+
+ <para>和大多数 &unix; 命令一样, &man.kill.1; 完成任务之是没有内容输出的。
+ 假如您发送信号给一个不属于您的进程,
+ 您会看到 <errorname>kill:
+ <replaceable>PID</replaceable>: Operation not
+ permitted</errorname>.
+ 假如输错了PID号,把信号发送到其他进程,那是坏事。
+ 或者您侥幸,把信号发送到不存在的进程,
+ 您会看见 <errorname>kill:
+ <replaceable>PID</replaceable>: No such process</errorname>.</para>
+
+ <note>
+ <title>为什么使用 <command>/bin/kill</command>?</title>
+
+ <para>许多shell提供了内建<command>kill</command>命令,
+ 这样, shell就能直接发送信号,而不是运行 <filename>/bin/kill</filename>。
+ 这点非常有用, 但不同shell有不同的语法来指定发送信号的名字,
+ 与其试图把它们学完倒不如简单地直接使用
+ <command>/bin/kill <replaceable>...</replaceable></command>。
+ </para>
+ </note>
+ </step>
+ </procedure>
+
+ <para>发送其他的信号也很相似,只要在命令行替换<literal>TERM</literal>或<literal>KILL</literal>就行了。
+ </para>
+
+ <important>
+ <para>在系统上随意杀死进程是个坏主意,特别是&man.init.8;,它的进程ID是1,它非常特殊。
+ 可以运行 <command>/bin/kill -s KILL 1</command> 命令来让系统迅速关机。
+ 当您按下 <keycap>Return</keycap> 键时, <emphasis>始终</emphasis> 必须
+ 去详细检查您所运行的 &man.kill.1;。
+
+ </para>
+ </important>
+ </sect1>
+
+ <sect1 id="shells">
+ <title>Shells</title>
+ <indexterm><primary>shells</primary></indexterm>
+ <indexterm><primary>命令行</primary></indexterm>
+
+ <para>在FreeBSD里,每日有一大堆工作是在命令行的界面完成的,那就叫做shell。
+ 一个shell的主要功能就是从输入是取得命令然后去执行他。
+ 许多的shell同样能帮我们完成内建的每日功能,例如:文件管理、文件寻找、命令行编辑、
+ 宏指令和环境变量。FreeBSD内含了一些shell,例如:<command>sh</command>、Bourne Shell、
+ <command>tcsh</command>和改良过的C-shell。
+ 另外也有些shell也可在FreeBSD的Ports得到,例如:<command>zsh</command>和<command>bash</command>。
+ </para>
+
+ <para>您想使用那一种shell取决于您的喜好,
+ 假如您是C程序设计师,您可能选择一个C-like shell例如<command>tcsh</command>。
+ 假如您是从Linux过来的或是一个命令行的新手,您可能会试一下<command>bash</command>。
+ 这一点告诉我们每一个shell都有各自的特性,可能适用于您的工作环境,也可能不适用于您的工作环境。
+ </para>
+
+ <para>每个shell都有一个共通点就是文件名补全。
+ 输入命令或文件名的前几个字,然后按<keycap>Tab</keycap>键,就能靠shell的自动补全功能得出
+ 命令或文件名。这里有一个例子,假设您有两个文件叫
+ <filename>foobar</filename> 和<filename>foo.bar</filename>,而您想删除
+ <filename>foo.bar</filename>, 可这样在键盘上输入
+ <command>rm fo[<keycap>Tab</keycap>].[<keycap>Tab</keycap>]</command>。</para>
+
+ <para>那么shell就会输出 <command>rm
+ foo[BEEP].bar</command>。</para>
+
+ <para>这个[BEEP] 是这控制台铃声, 那个是告诉我们它不能完成文件名补全,因为有多个文件名符合。
+ <filename>foobar</filename> 和
+ <filename>foo.bar</filename> 都是以 <literal>fo</literal>开头, 它只可以补全到
+ <literal>foo</literal>。 输入
+ <literal>.</literal>并再按一次 <keycap>Tab</keycap>,shell才把其余的文件名全部显示出来。
+ </para>
+ <indexterm><primary>环境变量</primary></indexterm>
+
+ <para>另一个特点就是shell利用环境变量运行。环境变量是贮存在shell环境空间上相对应的键和可变值,
+ 这个空间能够补程序从shell里读出,而且包含了许多程序的配置。
+ 这个一个常用环境变量列和其含义的列表:</para>
+ <indexterm><primary>环境变量</primary></indexterm>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>变量</entry>
+ <entry>说明</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><envar>USER</envar></entry>
+ <entry>当前登录进入的用户名。</entry>
+ </row>
+
+ <row>
+ <entry><envar>PATH</envar></entry>
+ <entry>搜索程序路径,以两点的冒号分隔开。</entry>
+ </row>
+
+ <row>
+ <entry><envar>DISPLAY</envar></entry>
+ <entry>假如有这个变量的话,就是X11显示器的网络名称。
+ </entry>
+ </row>
+
+ <row>
+ <entry><envar>SHELL</envar></entry>
+ <entry>当前所用的shell。</entry>
+ </row>
+
+ <row>
+ <entry><envar>TERM</envar></entry>
+ <entry>用户终端的名字,通常用在确定终端的能力。</entry>
+ </row>
+
+ <row>
+ <entry><envar>TERMCAP</envar></entry>
+ <entry>各种终端功能所用终端分离编码的基本数据项目。</entry>
+ </row>
+
+ <row>
+ <entry><envar>OSTYPE</envar></entry>
+ <entry>操作系统类型,默认是FreeBSD。</entry>
+ </row>
+
+ <row>
+ <entry><envar>MACHTYPE</envar></entry>
+ <entry>是指系统上运行的CPU体系结构。
+ </entry>
+ </row>
+
+ <row>
+ <entry><envar>EDITOR</envar></entry>
+ <entry>用户首选的文本编辑器。</entry>
+ </row>
+
+ <row>
+ <entry><envar>PAGER</envar></entry>
+ <entry>用户首选的文本页面调度程序 。</entry>
+ </row>
+
+ <row>
+ <entry><envar>MANPATH</envar></entry>
+ <entry>搜索联机手册路径,以两点的冒号分隔开。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <indexterm><primary>Bourne shells</primary></indexterm>
+ <para>不同的shell设置环境变量也不相同。举个例子,
+ 在如<command>tcsh</command> 和 <command>csh</command>这样的C-Style shell,
+ 您必须使用<command>setenv</command>去设置环境变量。
+ 而在如<command>sh</command>和<command>bash</command>这样的Bourne shell,
+ 您必须使用<command>export</command>去设置当前环境变量。
+ 再举个例子,要去设置或改变<envar>EDITOR</envar>环境变量,
+ 在<command>csh</command>或<command>tcsh</command>下将<envar>EDITOR</envar>设为
+ <filename>/usr/local/bin/emacs</filename>:</para>
+
+ <screen>&prompt.user; <userinput>setenv EDITOR /usr/local/bin/emacs</userinput></screen>
+
+ <para>而在Bourne shell下,则是:</para>
+
+ <screen>&prompt.user; <userinput>export EDITOR="/usr/local/bin/emacs"</userinput></screen>
+
+ <para>您也可以在命令行上加一个<literal>$</literal>字符在变量之前从而取得环境变量。
+ 举个例子,用<command>echo $TERM</command> 就会显示出<envar>$TERM</envar>的设定值,
+ 其实就是shell取得<envar>$TERM</envar>并传给<command>echo</command>来显示的。</para>
+
+ <para>shell里有许多特别的字符代表着特别的资料,我们把叫做meta-characters。
+ 最常用的就是<literal>*</literal>字符,它可代表文件名的任何字符。
+ 这些特别字符应用到文件名全域方面。假如,输入
+ <command>echo *</command>和输入
+ <command>ls</command>的效果是相同的,其实就是 shell 取得了全部符合
+ <literal>*</literal>的文件名,并传给
+ <command>echo</command> 在命令行下显示出来。</para>
+
+ <para>为了防止shell去分析这些特别字符, 我们可在它之前加一个
+ <literal>\</literal>字符去说明它只是普通字符。
+ <command>echo $TERM</command>就会显示出您的终端情况,
+ 而 <command>echo \$TERM</command> 就会显示出 <envar>$TERM</envar>
+ 这几个字。</para>
+
+ <sect2 id="changing-shells">
+ <title>改变您用的Shell</title>
+
+ <para>改变您的Shell的最简单方法是使用
+ <command>chsh</command> 命令。 执行 <command>chsh</command> 将根据您设定的<envar>EDITOR</envar>
+ 环境变量进入到那个编辑器,假如没有设定,就会进入<command>vi</command>编辑器。
+ 请改变<quote>Shell:</quote>这行对应值。</para>
+
+ <para>您可使用<command>chsh</command> 的<option>-s</option>选项,
+ 这样就能设置您的shell却又不用编辑器。假如您想把shell改为<command>bash</command>
+ 可用下面的技巧。</para>
+
+ <screen>&prompt.user; <userinput>chsh -s /usr/local/bin/bash</userinput></screen>
+
+ <para>运行<command>chsh</command> 不加参数只编辑shell也会达到相同的效果。
+ </para>
+
+ <note>
+ <para>您使用的shells<emphasis>必须</emphasis>
+ 在<filename>/etc/shells</filename> 文件里列出。 假如您从
+ <link linkend="ports">ports</link>里装一个shell, 那就不用做这步了。
+ 假如您手工装一个shell,那就要手工添加进去。</para>
+
+ <para>举个例了子,假如您手工把 <command>bash</command>装到
+ <filename>/usr/local/bin</filename>里,您还要进行这一步:
+ </para>
+
+ <screen>&prompt.root; <userinput>echo &quot;/usr/local/bin/bash&quot; &gt;&gt; /etc/shells</userinput></screen>
+
+ <para>然后运行<command>chsh</command>。</para>
+ </note>
+ </sect2>
+ </sect1>
+
+ <sect1 id="editors">
+ <title>文本编辑器</title>
+ <indexterm><primary>文本编辑器</primary></indexterm>
+ <indexterm><primary>编辑器</primary></indexterm>
+
+ <para>在FreeBSD里有许多的配置是依靠编辑文本文件来完成的,
+ 正因为这样,最好就是去熟悉一种文本编辑器。
+ FreeBSD基本系统本身就自带有几种,还有许多已可在ports里得到。</para>
+
+ <indexterm>
+ <primary><command>ee</command></primary>
+ </indexterm>
+ <para>最容易学的而又简单的编辑器是
+ <application>ee</application>编辑器, 是个标准的简易编辑器。 要启动
+ <application>ee</application>,首先就要在命令行输入
+ <command>ee <replaceable>filename</replaceable></command>,
+ <replaceable>filename</replaceable> 是一个要编辑的文件名。
+ 例如,要编辑 <filename>/etc/rc.conf</filename>就要输入
+ <command>ee /etc/rc.conf</command>,在
+ <command>ee</command>的控制内, 编辑器所有功能的操作方法都显示在最上方。
+ 这个<literal>^</literal> 字符代表
+ 键盘上的<keycap>Ctrl</keycap> 键, 所以<literal>^e</literal> 就是
+ <keycombo action="simul"><keycap>Ctrl</keycap><keycap>e</keycap></keycombo>组合键。
+ 假如想离开<application>ee</application>,
+ 按<keycap>Esc</keycap>键,就可选择离开编辑器。
+ 当您修改了内容的时候,编辑器会提示您保存。</para>
+
+ <indexterm>
+ <primary><command>vi</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary>编辑器</primary>
+ <secondary><command>vi</command></secondary>
+ </indexterm>
+ <indexterm>
+ <primary><command>emacs</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary>编辑器</primary>
+ <secondary><command>emacs</command></secondary>
+ </indexterm>
+ <para>FreeBSD本身也带许可多有强大功能的文本编辑器, 例如
+ <application>vi</application>。还有其他在FreeBSD Ports里几种, 像
+ <application>emacs</application> 和 <application>vim</application>。
+ 这些编辑器有着强大的功能但同时学习起来比较复习。
+ 不管怎样,假如您从事文字编辑方面的工作,
+ 学习如<application>vim</application> 或 <application>emacs</application>
+ 这些有强大功能的编辑器用法,
+ 在长时间工作里会帮您节省不少的时间。</para>
+ </sect1>
+
+ <sect1 id="basics-devices">
+ <title>设备和设备节点</title>
+
+ <para>在一个系统里,硬件描述通常用法就是一个设备对应一个术语,包括磁盘、打印机、显卡和键盘。
+ 当FreeBSD导入时,大多数的设备都能探测到并显示出来,
+ 您也可以查阅<filename>/var/run/dmesg.boot</filename>,
+ 导入时所有信息都在里面。</para>
+
+ <para>例如, <devicename>acd0</devicename> 就是
+ 首个 IDE 光盘设备, 而 <devicename>kbd0</devicename>
+ 则代表键盘。</para>
+
+ <para>在&unix;操作系统里,大多数设备存在的特殊访问文件就是叫做设备节点,
+ 他们都定位在<filename>/dev</filename>目录里。</para>
+
+ <sect2>
+ <title>建立设备节点</title>
+ <para>当增加一个新设备或付加设备需要寻求支持时,
+ 您也许需要在新设备上建立单个或多个的设备节点。</para>
+
+ <sect3>
+ <title>MAKEDEV 脚本</title>
+ <para>当系统缺少<literal>DEVFS</literal> (涉及的是FreeBSD 5.0之前的版本),
+ 建立设备节点可以使用&man.MAKEDEV.8;,就如下面显示的那样:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>sh MAKEDEV ad1</userinput>
+ </screen>
+
+ <para>这个是一个例子,在安装等二个IDE设备时去建立设备节点。</para>
+ </sect3>
+
+ <sect3>
+ <title><literal>DEVFS</literal> (DEVice 文件系统)</title>
+
+ <para> 这个设备文件系统, 或叫 <literal>DEVFS</literal>,
+ 为内核的设备命名在整体文件系统命名里提供通道,
+ 并不是建立或更改设备节点,
+ <literal>DEVFS</literal>只是为您的特别文件系统进行维护。</para>
+
+ <para>更多的资料请查 &man.devfs.5; 手册。
+ </para>
+
+ <para><literal>DEVFS</literal>在FreeBSD&nbsp;5.0或更高的版本里是默认使用。</para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="binary-formats">
+ <title>二进制文件格式</title>
+
+ <para>要理解为什么 &os; 使用 &man.elf.5; 格式, 您必须首先了解一些 &unix; 系统中的
+ 三种 <quote>主要</quote> 可执行文件格式的有关知识:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>&man.a.out.5;</para>
+
+ <para>是最古老和<quote>经典的</quote> &unix; 目标文件格式,
+ 这种格式在其文件的开始处有一个短小而又紧凑的首部,
+ 该首部带有一个魔幻数字,用来标识具体的格式(更多详情参见&man.a.out.5;)。
+ 这种格式包含3个要装载入内存的段:.text, .data, 和 .bss,以及
+ 一个符号表和一个字符串表。</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>COFF</acronym></para>
+
+ <para>SVR3目标文件格式。其文件头现在包括一个区段表(section table),
+ 因此除了.text,.data,和.bss区段以外,您还可以包含其它的区段。</para>
+ </listitem>
+
+ <listitem>
+ <para>&man.elf.5;</para>
+
+ <para><acronym>COFF</acronym> 的后继, 其特点是可以有多个区段,
+ 并可以使用32位或64位的值。 它有一个主要的缺点:
+ <acronym>ELF</acronym> 在其设计时假设每个系统体系结构只有一种 ABI。
+ 这种假设事实上相当错误, 甚至在商业化的SYSV世界中都是错误的
+ (它们至少有三种ABI: SVR4, Solaris, SCO)。</para>
+
+ <para>FreeBSD试图在某种程度上解决这个问题,它提供一个工具,可以
+ 对一个已知的<acronym>ELF</acronym>可执行文件
+ <emphasis>标识</emphasis>它所遵从的ABI的信息。
+ 更多这方面的知识可以参见手册页&man.brandelf.1;</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>FreeBSD从<quote>经典</quote>阵营中来,因此使用了&man.a.out.5;格式,
+ 众多BSD版本的发行(直到3.X分支的开始)也证明了这种格式的有效性。
+ 虽然在那以前的某段时间,在FreeBSD系统上创建和运行<acronym>ELF</acronym>格式
+ 的二进制可执行文件(和内核)也是可能的,但FreeBSD一开始并不积极<quote>进步</quote>
+ 到使用<acronym>ELF</acronym>作为其缺省的格式。为什么?噢,当Linux阵营完成了
+ 转换到<acronym>ELF</acronym>格式的痛苦历程后,却发现并不足以由此而放弃
+ <filename>a.out</filename>可执行文件格式,因为正是由于它们不灵活的,
+ 基于跳转表的共享库机制,使得销售商和开发者们构建共享库非常困难。
+ 直到已有的<acronym>ELF</acronym>工具提供了一种解决共享库问题的办法,
+ 并被普遍认为是<quote>前进方向</quote>以后,迁徙的代价在FreeBSD界才被接受,
+ 并由此完成了迁徙。FreeBSD的共享库机制其基础更类似于Sun &sunos;的共享库机制,
+ 并且正因为此,其易用性很好。</para>
+
+ <para>那么,为什么会有这么多不同的格式呢?</para>
+
+ <para>回溯到蒙昧和黑暗的过去,那时只有简单的硬件。这种简单的硬件支撑了一个简单
+ 和小型的系统。在这样的简单系统上(PDP-11)<filename>a.out</filename>格式
+ 足以胜任表达二进制文件的任务。当人们将&unix;从这种简单的系统中移植出来的时候,
+ <filename>a.out</filename>格式被保留了下来,因为对于早期将&unix移植到
+ Motorola 68k,VAXen等系统来说,它还是足够可用的。</para>
+
+ <para>然后,一些聪明的硬件工程师认为,如果可以让软件完成一些简单的聪明操作,
+ 那么他们就可以在硬件设计中减少若干门电路,并可以让CPU核心运行得更快。
+ 当<filename>a.out</filename>格式用于这种新型的硬件系统时(现在我们叫它
+ <acronym>RISC</acronym>),显得并不合适。因此,人们设计了许多新的格式
+ 以便在这样的硬件系统上能获得比简单的<filename>a.out</filename>格式更优越
+ 的性能。诸如<acronym>COFF</acronym>,<acronym>ECOFF</acronym>,还有其它
+ 一些晦涩难懂的格式正是在这个阶段被发明出来的,人们也研究了这些格式的局限性,
+ 慢慢地最终落实到<acronym>ELF</acronym>格式。</para>
+
+ <para>同时,程序的大小变得越来越大,磁盘空间(以及物理内存)相对来说却仍然较小,
+ 因此共享库的概念便产生了。VM系统也变得越来越复杂了。当所有这些进步都建立在
+ <filename>a.out</filename>格式的基础上的时候,它的可用性随着每个新特性
+ 的产生就受到了严重考验。并且,人们还希望可以在运行时动态装载某些东西,或者
+ 在初始化代码运行以后可以丢弃部分程序代码,以便节约主存储器和交换区。编程语言
+ 也变得越来越复杂,人们希望可以在main()函数执行之前自动执行某些代码。为了实现
+ 所有这些功能,人们对<filename>a.out</filename>格式作了很多改动(hack),
+ 他们在某个阶段里基本也是可行的。随着时间的推移,<filename>a.out</filename>格式
+ 不得不增加大量的代码和复杂度来满足这些需求。虽然<acronym>ELF</acronym>格式
+ 解决了许多这样的问题,但是从一个可用的系统迁移到另一个系统却是痛苦的。因此
+ 直到继续保留<filename>a.out</filename>格式的代价比迁移到<acronym>ELF</acronym>格式
+ 的代价还大的时候,人们才会最终转换到<acronym>ELF</acronym>格式。</para>
+
+ <para>然而,随着时间的推移,FreeBSD系统本身的编译工具(特别是汇编器和装载器)
+ 赖以派生的编译工具,其发展却形成了两个平行的分支。FreeBSD这个分支增加了共享库,
+ 并修改了一些错误。而原先编写了这些工具的GNU人则重写了这些工具,并对交叉编译提供了
+ 更简化的支持,还随意插入了不同格式的支持,等等。虽然很多人希望创建针对FreeBSD的
+ 交叉编译器,但他们却并未如愿以偿,因为FreeBSD的<application>as</application>
+ 和<application>ld</application>的源代码更为老旧,所以无法完成这个任务。
+ 新的GNU工具链(<application>binutils</application>)则确实支持交叉编译,<acronym>ELF</acronym>
+ 格式,共享库,C++扩展,等等。并且,由于很多供应商都发布<acronym>ELF</acronym>格式的
+ 二进制文件,因而让FreeBSD能够运行它们将是一个很好的事情。</para>
+
+ <para><acronym>ELF</acronym>格式比<filename>a.out</filename>格式开销要大些,同时也
+ 允许基础系统有更好的扩展性。<acronym>ELF</acronym>格式的有关工具有着更好的维护,
+ 并且提供交叉编译支持,这对许多人来说是很重要的。<acronym>ELF</acronym>格式可能会稍微
+ 慢一些,但很难测量出来。另外,在这两者之间,有许多细节也是不同的,比如它们映射页面的方式,
+ 处理初始化代码的方式,等等。所有这些都不太重要,但这也确实是不同之处。在将来的适当时候,
+ <filename>GENERIC</filename>内核将不再支持<filename>a.out</filename>格式,并且,
+ 当不再需要运行遗留的<filename>a.out</filename>格式程序时,内核也将不再提供对其的支持。</para>
+ </sect1>
+
+ <sect1 id="basics-more-information">
+ <title>取得更多的资讯</title>
+
+ <sect2 id="basics-man">
+ <title>联机手册</title>
+ <indexterm><primary>联机手册</primary></indexterm>
+
+ <para>最详细的使用说明文档莫过于 FreeBSD 里的联机手册了。
+ 几乎每一个程序都会附上一份简短说明,
+ 以介绍这个程序的的基本功能以及参数的用法。
+ 我们能通过 <command>man</command> 命令来阅读这些说明, 而使用
+ <command>man</command> 命令却是简单的事情:</para>
+
+ <screen>&prompt.user; <userinput>man <replaceable>command</replaceable></userinput></screen>
+
+ <para><literal>command</literal> 就是您要了解的命令命称。
+ 举个例子,想了解 <command>ls</command> 命令就输入:</para>
+
+ <screen>&prompt.user; <userinput>man ls</userinput></screen>
+
+ <para>这些在线手册分下列章节:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>用户命令。</para>
+ </listitem>
+
+ <listitem>
+ <para>系统调用以及错误代码。</para>
+ </listitem>
+
+ <listitem>
+ <para>C 库文件里的函数说明。</para>
+ </listitem>
+
+ <listitem>
+ <para>设备驱动程序。</para>
+ </listitem>
+
+ <listitem>
+ <para>文件格式。</para>
+ </listitem>
+
+ <listitem>
+ <para>游戏以及其他娱乐。</para>
+ </listitem>
+
+ <listitem>
+ <para>各种资讯。</para>
+ </listitem>
+
+ <listitem>
+ <para>系统维护以及命令。</para>
+ </listitem>
+
+ <listitem>
+ <para>内核开发情况。</para>
+ </listitem>
+ </orderedlist>
+
+ <para>在某些情况下,同样的主题也会出现在在线手册的不同章节。
+ 举个例子,系统里有<command>chmod</command>这个用户命令,而又有个
+ <function>chmod()</function> 系统调用。 在这种情形下,您应当向
+ <command>man</command> 命令指定需要的内容:
+ </para>
+
+ <screen>&prompt.user; <userinput>man 1 chmod</userinput></screen>
+
+ <para>这样就会显示出手册里的用户 <command>chmod</command> 命令。
+ 传统上,我们在写入文档时把特定详细参考内容在在线手册括号里注明。
+ 所以 &man.chmod.1; 是指 <command>chmod</command> 用户命令,
+ 而 &man.chmod.2; 是指系统调用。
+ </para>
+
+ <para>如果您已经知道命令的名字,只是不知道要怎样使用的话,那就比较好办。
+ 但您连名字都不知到呢?这个时候您就可以利用 <command>man</command> 的搜寻功能,
+ 它会在手册的介绍部份找寻您要搜寻的关键字,它的选项是 <option>-k</option>:</para>
+
+ <screen>&prompt.user; <userinput>man -k mail</userinput></screen>
+
+ <para>当您使用这个命令的时候,man会把介绍里含有<quote>mail</quote>关键字
+ 的命令列出来,实际上这和<command>apropos</command>命令的功能是相同的。</para>
+
+ <para>有时您会看到<filename>/usr/bin</filename> 下有许多命令但不知他们的用途,
+ 您只需这样做:</para>
+
+ <screen>&prompt.user; <userinput>cd /usr/bin</userinput>
+&prompt.user; <userinput>man -f *</userinput></screen>
+
+ <para>或者这样做</para>
+
+ <screen>&prompt.user; <userinput>cd /usr/bin</userinput>
+&prompt.user; <userinput>whatis *</userinput></screen>
+
+ <para>两个命令是一样的。</para>
+ </sect2>
+
+ <sect2 id="basics-info">
+ <title>GNU Info 文件</title>
+ <indexterm><primary>Free软件基金会</primary></indexterm>
+
+ <para>FreeBSD许多应用软件以及实用工具来自Free软件基金会(FSF)。
+ 作为手册的扩充,这些程序提供了一种更具有活力的超文档说明<literal>info</literal>,
+ 您可用<command>info</command>命令来阅读他们。
+ 假如您装上<application>emacs</application>,也能利用<application>emacs</application>
+ 的info模式来阅读。
+ </para>
+
+ <para>使用 &man.info.1; 这个命令只需简单地输入:</para>
+
+ <screen>&prompt.user; <userinput>info</userinput></screen>
+
+ <para>想得到简单介绍, 请按 <literal>h</literal>。 想快速得到的命令说明,
+ 请按 <literal>?</literal>。</para>
+ </sect2>
+ </sect1>
+</chapter>
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/bibliography/Makefile b/zh_CN.GB2312/books/handbook/bibliography/Makefile
new file mode 100644
index 0000000000..8b2751b9b7
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/bibliography/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= bibliography/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml b/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml
new file mode 100644
index 0000000000..4860c6a2d5
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/bibliography/chapter.sgml
@@ -0,0 +1,634 @@
+<!--
+ The FreeBSD Chinese Documentation Project
+
+ Original Revision: 1.67
+ $FreeBSD$
+-->
+
+<appendix id="bibliography">
+ <title>参考文献</title>
+
+ <para>尽管手册页能够提供对于 FreeBSD 操作系统最为权威的参考资料,它们有时却不能告诉我们如何让整个系统很好地运转起来。
+ 因此,一本关于 &unix; 系统管理的好书,以及一份好的用户手册是不可或缺的。</para>
+
+ <sect1 id="bibliography-freebsd">
+ <title>关于 FreeBSD 的专业书籍与杂志</title>
+
+ <para><emphasis>非英文的书籍和杂志:</emphasis></para>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink
+ url="http://jdli.tw.FreeBSD.org/publication/book/freebsd2/index.htm">FreeBSD 入门与应用</ulink> (繁体中文)。</para>
+ </listitem>
+
+ <listitem>
+
+ <para>FreeBSD 技术内幕(中译本),
+ <ulink url="http://www.hzbook.com/">机械工业出版社</ulink>。ISBN 7-111-10201-0。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD 使用大全 第一版,
+ 机械工业出版社。ISBN 7-111-07482-3。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD 使用大全 第二版,
+ 机械工业出版社。ISBN 7-111-10286-X。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD Handbook (第二版中译本),
+ <ulink url="http://www.ptpress.com.cn/">人民邮电出版社</ulink>。ISBN 7-115-10541-3。
+ </para>
+ </listitem>
+
+ <listitem>
+
+ <para>FreeBSD 3.x Internet 高级服务器的架设与管理
+ <ulink url="http://www.tup.tsinghua.edu.cn/">清华大学出版社</ulink>。ISBN 7-900625-66-6。</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD & Windows 集成组网实务,中国铁道出版社。ISBN 7-113-03845-X。</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD 网站架设实务,中国铁道出版社。ISBN 7-113-03423-3。</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD for PC 98'ers (日文, 出版商:SHUWA System
+ Co, LTD. ISBN 4-87966-468-5 C3055 P2900E。</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD (日文, 出版商:CUTT. ISBN 4-906391-22-2
+ C3055 P2400E.</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.shoeisha.com/book/Detail.asp?bid=650">Complete Introduction to FreeBSD</ulink> (日文, 出版商:<ulink url="http://www.shoeisha.co.jp/">Shoeisha Co., Ltd</ulink>. ISBN 4-88135-473-6 P3600E.</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.ascii.co.jp/pb/book1/shinkan/detail/1322785.html">Personal UNIX Starter Kit FreeBSD</ulink> (日文, 出版商:<ulink url="http://www.ascii.co.jp/">ASCII</ulink>. ISBN 4-7561-1733-3 P3000E.</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD Handbook (日文译本, 出版商:<ulink
+ url="http://www.ascii.co.jp/">ASCII</ulink>. ISBN 4-7561-1580-2
+ P3800E.</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD mit Methode (德文, 出版商:<ulink url="http://www.cul.de">Computer und
+ Literatur Verlag</ulink>/Vertrieb Hanser, 1998. ISBN 3-932311-31-0.</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.cul.de/freebsd.html">FreeBSD 4 - Installieren, Konfigurieren, Administrieren</ulink>
+ (德文, 出版商:<ulink url="http://www.cul.de">Computer und Literatur Verlag</ulink>, 2001.
+ ISBN 3-932311-88-4.</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.cul.de/freebsd.html">FreeBSD 5 - Installieren, Konfigurieren, Administrieren</ulink>
+ (德文), 出版商: <ulink url="http://www.cul.de">Computer und Literatur Verlag</ulink>, 2003.
+ ISBN 3-936546-06-1.</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.mitp.de/vmi/mitp/detail/pWert/1343/">
+ FreeBSD de Luxe</ulink> (德文), 出版商:
+ <ulink url="http://www.mitp.de">Verlag Modere Industrie</ulink>,
+ 2003. ISBN 3-8266-1343-0.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.pc.mycom.co.jp/FreeBSD/install-manual.html">FreeBSD Install and Utilization Manual</ulink> (日文), 出版商: <ulink url="http://www.pc.mycom.co.jp/">Mainichi Communications Inc.</ulink>.</para>
+ </listitem>
+
+ <listitem>
+ <para>Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo
+ <emphasis><ulink url="http://maxwell.itb.ac.id/">
+ Building Internet Server with
+ FreeBSD</ulink></emphasis> (印尼文), 出版商: <ulink url="http://www.elexmedia.co.id/">Elex Media Komputindo</ulink>.</para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para><emphasis>英文版的书籍和杂志:</emphasis></para>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="http://www.AbsoluteBSD.com/">Absolute
+ BSD: The Ultimate Guide to FreeBSD</ulink>, 出版商:
+ <ulink url="http://www.nostarch.com/">No Starch Press</ulink>, 2002.
+ ISBN: 1886411743</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.freebsdmall.com/cgi-bin/fm/bsdcomp">
+ The Complete FreeBSD</ulink>, 出版商:
+ <ulink url="http://www.oreilly.com/">O'Reilly</ulink>, 2003.
+ ISBN: 0596005164</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.freebsd-corp-net-guide.com/">The
+ FreeBSD Corporate Networker's Guide</ulink>, 出版商:
+ <ulink url="http://www.awl.com/aw/">Addison-Wesley</ulink>, 2000.
+ ISBN: 0201704811</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://andrsn.stanford.edu/FreeBSD/introbook/">
+ FreeBSD: An Open-Source Operating System for Your Personal
+ Computer</ulink>, 出版商: The Bit Tree Press, 2001.
+ ISBN: 0971204500</para>
+ </listitem>
+
+ <listitem>
+ <para>Teach Yourself FreeBSD in 24 Hours, 出版商:
+ <ulink url="http://www.samspublishing.com/">Sams</ulink>, 2002.
+ ISBN: 0672324245</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD unleashed, 出版商:
+ <ulink url="http://www.samspublishing.com/">Sams</ulink>, 2002.
+ ISBN: 0672324563</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD: The Complete Reference, 出版商:
+ <ulink url="http://books.mcgraw-hill.com">McGrawHill</ulink>, 2003.
+ ISBN: 0072224096 </para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-userguides">
+ <title>用户指南</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Computer Systems Research Group, UC Berkeley. <emphasis>4.4BSD
+ User's Reference Manual</emphasis>. O'Reilly &amp; Associates,
+ Inc., 1994. ISBN 1-56592-075-9</para>
+ </listitem>
+
+ <listitem>
+ <para>Computer Systems Research Group, UC Berkeley. <emphasis>4.4BSD
+ User's Supplementary Documents</emphasis>. O'Reilly &amp;
+ Associates, Inc., 1994. ISBN 1-56592-076-7</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>UNIX in a Nutshell</emphasis>. O'Reilly &amp;
+ Associates, Inc., 1990. ISBN 093717520X</para>
+ </listitem>
+
+ <listitem>
+ <para>Mui, Linda. <emphasis>What You Need To Know When You Can't Find
+ Your UNIX System Administrator</emphasis>. O'Reilly &amp;
+ Associates, Inc., 1995. ISBN 1-56592-104-6</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www-wks.acs.ohio-state.edu/">Ohio State
+ University</ulink> 编写了一份 <ulink
+ url="http://www-wks.acs.ohio-state.edu/unix_course/unix.html">UNIX
+ 介绍性课程</ulink> ,并提供在线的 HTML 和 PostScript 版本。</para>
+ </listitem>
+
+ <listitem>
+ <para>这份文档的意大利文 <ulink
+ url="&url.doc.base;/it_IT.ISO8859-15/books/unix-introduction/index.html">翻译</ulink>
+ 是 FreeBSD Italian Documentation Project 的一部分。</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.jp.FreeBSD.org/">Jpman Project, Japan
+ FreeBSD Users Group</ulink>. <ulink
+ url="http://www.pc.mycom.co.jp/FreeBSD/urm.html">FreeBSD User's
+ Reference Manual</ulink> (日文译本). <ulink
+ url="http://www.pc.mycom.co.jp/">Mainichi Communications
+ Inc.</ulink>, 1998. ISBN4-8399-0088-4 P3800E.</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.ed.ac.uk/">Edinburgh
+ University</ulink> has written an <ulink
+ url="http://unixhelp.ed.ac.uk/">Online Guide</ulink> for
+ newcomers to the UNIX environment.</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-adminguides">
+ <title>管理员指南</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Albitz, Paul and Liu, Cricket. <emphasis>DNS and
+ BIND</emphasis>, 4th Ed. O'Reilly &amp; Associates, Inc., 2001.
+ ISBN 1-59600-158-4</para>
+ </listitem>
+
+ <listitem>
+ <para>Computer Systems Research Group, UC Berkeley. <emphasis>4.4BSD
+ System Manager's Manual</emphasis>. O'Reilly &amp; Associates,
+ Inc., 1994. ISBN 1-56592-080-5</para>
+ </listitem>
+
+ <listitem>
+ <para>Costales, Brian, et al. <emphasis>Sendmail</emphasis>, 2nd Ed.
+ O'Reilly &amp; Associates, Inc., 1997. ISBN 1-56592-222-0</para>
+ </listitem>
+
+ <listitem>
+ <para>Frisch, &AElig;leen. <emphasis>Essential System
+ Administration</emphasis>, 2nd Ed. O'Reilly &amp; Associates,
+ Inc., 1995. ISBN 1-56592-127-5</para>
+ </listitem>
+
+ <listitem>
+ <para>Hunt, Craig. <emphasis>TCP/IP Network
+ Administration</emphasis>, 2nd Ed. O'Reilly &amp; Associates, Inc., 1997.
+ ISBN 1-56592-322-7</para>
+ </listitem>
+
+ <listitem>
+ <para>Nemeth, Evi. <emphasis>UNIX System Administration
+ Handbook</emphasis>. 3rd Ed. Prentice Hall, 2000. ISBN
+ 0-13-020601-6</para>
+ </listitem>
+
+ <listitem>
+ <para>Stern, Hal <emphasis>Managing NFS and NIS</emphasis> O'Reilly
+ &amp; Associates, Inc., 1991. ISBN 0-937175-75-7</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.jp.FreeBSD.org/">Jpman Project, Japan
+ FreeBSD Users Group</ulink>. <ulink
+ url="http://www.pc.mycom.co.jp/FreeBSD/sam.html">FreeBSD System
+ Administrator's Manual</ulink> (日文译本). <ulink
+ url="http://www.pc.mycom.co.jp/">Mainichi Communications
+ Inc.</ulink>, 1998. ISBN4-8399-0109-0 P3300E.</para>
+ </listitem>
+
+ <listitem>
+ <para>Dreyfus, Emmanuel. <ulink
+ url="http://www.eyrolles.com/Informatique/Livre/9782212114638/">Cahiers
+ de l'Admin: BSD</ulink> 2nd Ed. (in French), Eyrolles, 2004.
+ ISBN 2-212-11463-X</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-programmers">
+ <title>开发指南</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Asente, Paul, Converse, Diana, and Swick, Ralph.
+ <emphasis>X Window System Toolkit</emphasis>. Digital Press,
+ 1998. ISBN 1-55558-178-1</para>
+ </listitem>
+
+ <listitem>
+ <para>Computer Systems Research Group, UC Berkeley. <emphasis>4.4BSD
+ Programmer's Reference Manual</emphasis>. O'Reilly &amp;
+ Associates, Inc., 1994. ISBN 1-56592-078-3</para>
+ </listitem>
+
+ <listitem>
+ <para>Computer Systems Research Group, UC Berkeley. <emphasis>4.4BSD
+ Programmer's Supplementary Documents</emphasis>. O'Reilly &amp;
+ Associates, Inc., 1994. ISBN 1-56592-079-1</para>
+ </listitem>
+
+ <listitem>
+ <para>Harbison, Samuel P. and Steele, Guy L. Jr. <emphasis>C: A
+ Reference Manual</emphasis>. 4rd ed. Prentice Hall, 1995.
+ ISBN 0-13-326224-3</para>
+ </listitem>
+
+ <listitem>
+ <para>Kernighan, Brian and Dennis M. Ritchie. <emphasis>The C
+ Programming Language.</emphasis>. PTR Prentice Hall, 1988.
+ ISBN 0-13-110362-9</para>
+ </listitem>
+
+ <listitem>
+ <para>Lehey, Greg. <emphasis>Porting UNIX Software</emphasis>.
+ O'Reilly &amp; Associates, Inc., 1995. ISBN 1-56592-126-7</para>
+ </listitem>
+
+ <listitem>
+ <para>Plauger, P. J. <emphasis>The Standard C Library</emphasis>.
+ Prentice Hall, 1992. ISBN 0-13-131509-9</para>
+ </listitem>
+
+ <listitem>
+ <para>Spinellis, Diomidis. <ulink
+ url="http://www.spinellis.gr/codereading/"><emphasis>Code
+ Reading: The Open Source Perspective</emphasis></ulink>.
+ Addison-Wesley, 2003. ISBN 0-201-79940-5</para>
+ </listitem>
+
+ <listitem>
+ <para>Stevens, W. Richard. <emphasis>Advanced Programming in the UNIX
+ Environment</emphasis>. Reading, Mass. : Addison-Wesley, 1992.
+ ISBN 0-201-56317-7</para>
+ </listitem>
+
+ <listitem>
+ <para>Stevens, W. Richard. <emphasis>UNIX Network
+ Programming</emphasis>. 2nd Ed, PTR Prentice Hall, 1998. ISBN
+ 0-13-490012-X</para>
+ </listitem>
+
+ <listitem>
+ <para>Wells, Bill. <quote>Writing Serial Drivers for UNIX</quote>.
+ <emphasis>Dr. Dobb's Journal</emphasis>. 19(15), December 1994.
+ pp68-71, 97-99.</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-osinternals">
+ <title>操作系统原理</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Andleigh, Prabhat K. <emphasis>UNIX System
+ Architecture</emphasis>. Prentice-Hall, Inc., 1990. ISBN
+ 0-13-949843-5</para>
+ </listitem>
+
+ <listitem>
+ <para>Jolitz, William. <quote>Porting UNIX to the 386</quote>.
+ <emphasis>Dr. Dobb's Journal</emphasis>. 1991年1月 - 1992年6月 </para>
+ </listitem>
+
+ <listitem>
+ <para>Leffler, Samuel J., Marshall Kirk McKusick, Michael J Karels and
+ John Quarterman <emphasis>The Design and Implementation of the
+ 4.3BSD UNIX Operating System</emphasis>. Reading, Mass. :
+ Addison-Wesley, 1989. ISBN 0-201-06196-1</para>
+ </listitem>
+
+ <listitem>
+ <para>Leffler, Samuel J., Marshall Kirk McKusick, <emphasis>The Design
+ and Implementation of the 4.3BSD UNIX Operating System: Answer
+ Book</emphasis>. Reading, Mass. : Addison-Wesley, 1991. ISBN
+ 0-201-54629-9</para>
+ </listitem>
+
+ <listitem>
+ <para>McKusick, Marshall Kirk, Keith Bostic, Michael J Karels, and
+ John Quarterman. <emphasis>The Design and Implementation of the
+ 4.4BSD Operating System</emphasis>. Reading, Mass. :
+ Addison-Wesley, 1996. ISBN 0-201-54979-4</para>
+
+ <para>(这本书的第二章的 <ulink
+ url="&url.books.design-44bsd;/book.html">在线版本</ulink> 是
+ FreeBSD Documentation Project的一部分, 此外,第九章可以在 <ulink
+ url="http://www.netapp.com/tech_library/nfsbook.print">
+ 这里</ulink>找到.)</para>
+ </listitem>
+
+ <listitem>
+ <para>Marshall Kirk McKusick, George V. Neville-Neil<emphasis>The Design
+ and Implementation of the FreeBSD UNIX Operating System</emphasis>.
+ Boston, Mass. : Addison-Wesley, 2004. ISBN 0-201-70245-2</para>
+ </listitem>
+
+ <listitem>
+ <para>Stevens, W. Richard. <emphasis>TCP/IP Illustrated, Volume 1:
+ The Protocols</emphasis>. Reading, Mass. : Addison-Wesley,
+ 1996. ISBN 0-201-63346-9</para>
+ </listitem>
+
+ <listitem>
+ <para>Schimmel, Curt. <emphasis>Unix Systems for Modern
+ Architectures</emphasis>. Reading, Mass. : Addison-Wesley, 1994.
+ ISBN 0-201-63338-8</para>
+ </listitem>
+
+ <listitem>
+ <para>Stevens, W. Richard. <emphasis>TCP/IP Illustrated, Volume 3:
+ TCP for Transactions, HTTP, NNTP and the UNIX Domain
+ Protocols</emphasis>. Reading, Mass. : Addison-Wesley, 1996.
+ ISBN 0-201-63495-3</para>
+ </listitem>
+
+ <listitem>
+ <para>Vahalia, Uresh. <emphasis>UNIX Internals -- The New
+ Frontiers</emphasis>. Prentice Hall, 1996. ISBN
+ 0-13-101908-2</para>
+ </listitem>
+
+ <listitem>
+ <para>Wright, Gary R. and W. Richard Stevens. <emphasis>TCP/IP
+ Illustrated, Volume 2: The Implementation</emphasis>. Reading,
+ Mass. : Addison-Wesley, 1995. ISBN 0-201-63354-X</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-security">
+ <title>信息安全方面的参考文献</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Cheswick, William R. and Steven M. Bellovin. <emphasis>Firewalls
+ and Internet Security: Repelling the Wily Hacker</emphasis>.
+ Reading, Mass. : Addison-Wesley, 1995. ISBN
+ 0-201-63357-4</para>
+ </listitem>
+
+ <listitem>
+ <para>Garfinkel, Simson and Gene Spafford.
+ <emphasis>Practical UNIX &amp; Internet Security</emphasis>.
+ 2nd Ed. O'Reilly &amp; Associates, Inc., 1996. ISBN
+ 1-56592-148-8</para>
+ </listitem>
+
+ <listitem>
+ <para>Garfinkel, Simson. <emphasis>PGP Pretty Good
+ Privacy</emphasis> O'Reilly &amp; Associates, Inc., 1995. ISBN
+ 1-56592-098-8</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-hardware">
+ <title>硬件参考</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Anderson, Don and Tom Shanley. <emphasis>Pentium Processor
+ System Architecture</emphasis>. 2nd Ed. Reading, Mass. :
+ Addison-Wesley, 1995. ISBN 0-201-40992-5</para>
+ </listitem>
+
+ <listitem>
+ <para>Ferraro, Richard F. <emphasis>Programmer's Guide to the EGA,
+ VGA, and Super VGA Cards</emphasis>. 3rd ed. Reading, Mass. :
+ Addison-Wesley, 1995. ISBN 0-201-62490-7</para>
+ </listitem>
+
+ <listitem>
+ <para>Intel 公司在他们的 <ulink
+ url="http://developer.intel.com/">开发人员网站</ulink>上,
+ 提供了关于他们的 CPU,芯片组,以及标准的文档。多数是PDF文件.</para>
+ </listitem>
+
+ <listitem>
+ <para>Shanley, Tom. <emphasis>80486 System Architecture</emphasis>.
+ 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN
+ 0-201-40994-1</para>
+ </listitem>
+
+ <listitem>
+ <para>Shanley, Tom. <emphasis>ISA System Architecture</emphasis>.
+ 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN
+ 0-201-40996-8</para>
+ </listitem>
+
+ <listitem>
+ <para>Shanley, Tom. <emphasis>PCI System Architecture</emphasis>.
+ 4th ed. Reading, Mass. : Addison-Wesley, 1999. ISBN
+ 0-201-30974-2</para>
+ </listitem>
+
+ <listitem>
+ <para>Van Gilluwe, Frank. <emphasis>The Undocumented PC</emphasis>, 2nd Ed.
+ Reading, Mass: Addison-Wesley Pub. Co., 1996. ISBN
+ 0-201-47950-8</para>
+ </listitem>
+
+ <listitem>
+ <para>Messmer, Hans-Peter. <emphasis>The Indispensable PC Hardware Book</emphasis>, 4th Ed.
+ Reading, Mass: Addison-Wesley Pub. Co., 2002. ISBN
+ 0-201-59616-4</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-history">
+ <title>&unix; 历史</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Lion, John <emphasis>Lion's Commentary on UNIX, 6th Ed. With
+ Source Code</emphasis>. ITP Media Group, 1996. ISBN
+ 1573980137</para>
+ </listitem>
+
+ <listitem>
+ <para>Raymond, Eric S. <emphasis>The New Hacker's Dictionary, 3rd
+ edition</emphasis>. MIT Press, 1996. ISBN
+ 0-262-68092-0. 它也被称作 <ulink
+ url="http://www.catb.org/~esr/jargon/html/index.html">Jargon
+ File</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para>Salus, Peter H. <emphasis>A quarter century of UNIX</emphasis>.
+ Addison-Wesley Publishing Company, Inc., 1994. ISBN
+ 0-201-54777-5</para>
+ </listitem>
+
+ <listitem>
+ <para>Simon Garfinkel, Daniel Weise, Steven Strassmann. <emphasis>The
+ UNIX-HATERS Handbook</emphasis>. IDG Books Worldwide, Inc.,
+ 1994. ISBN 1-56884-203-1</para>
+ </listitem>
+
+ <listitem>
+ <para>Don Libes, Sandy Ressler <emphasis>Life with UNIX</emphasis>
+ &mdash; special edition. Prentice-Hall, Inc., 1989. ISBN
+ 0-13-536657-7</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>BSD 族谱</emphasis>.
+ <ulink url="http://www.FreeBSD.org/cgi/cvsweb.cgi/src/share/misc/bsd-family-tree"></ulink>
+ 或在任何一台较新的 FreeBSD 机器中的 <ulink type="html" url="file://localhost/usr/share/misc/bsd-family-tree"><filename>/usr/share/misc/bsd-family-tree</filename></ulink>
+ 。</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>The BSD Release Announcements collection</emphasis>.
+ 1997. <ulink url="http://www.de.FreeBSD.org/de/ftp/releases/"></ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>Networked Computer Science Technical Reports
+ Library</emphasis>. <ulink url="http://www.ncstrl.org/"></ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>Old BSD releases from the Computer Systems Research
+ group (CSRG)</emphasis>.
+ <ulink url="http://www.mckusick.com/csrg/"></ulink>:
+ The 4CD set covers all BSD versions from 1BSD to 4.4BSD and
+ 4.4BSD-Lite2 (but not 2.11BSD, unfortunately). As well, the last
+ disk holds the final sources plus the SCCS files.</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="bibliography-journals">
+ <title>各种期刊</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>The C/C++ Users Journal</emphasis>. R&amp;D
+ Publications Inc. ISSN 1075-2838</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>Sys Admin &mdash; The Journal for UNIX System
+ Administrators</emphasis> Miller Freeman, Inc., ISSN
+ 1061-2688</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>freeX &mdash; Das Magazin f&uuml;r Linux - BSD - UNIX</emphasis>
+ (德文) Computer- und Literaturverlag GmbH, ISSN 1436-7033</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+</appendix>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../appendix.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "appendix")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/book.sgml b/zh_CN.GB2312/books/handbook/book.sgml
new file mode 100644
index 0000000000..e9e81e2844
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/book.sgml
@@ -0,0 +1,297 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese (Simplified) Documentation Project
+
+ Original Revision: 1.156
+ $FreeBSD$
+-->
+
+<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
+<!ENTITY % books.ent PUBLIC "-//FreeBSD//ENTITIES DocBook FreeBSD Books Entity Set//EN">
+%books.ent;
+<!ENTITY % chapters SYSTEM "chapters.ent">
+%chapters;
+<!ENTITY % txtfiles SYSTEM "txtfiles.ent">
+%txtfiles;
+
+<!ENTITY % not.published "INCLUDE">
+
+<!ENTITY % chap.introduction "IGNORE">
+<!ENTITY % chap.install "IGNORE">
+<!ENTITY % chap.basics "IGNORE">
+<!ENTITY % chap.ports "IGNORE">
+<!ENTITY % chap.config "IGNORE">
+<!ENTITY % chap.boot "IGNORE">
+<!ENTITY % chap.users "IGNORE">
+<!ENTITY % chap.kernelconfig "IGNORE">
+<!ENTITY % chap.security "IGNORE">
+<!ENTITY % chap.printing "IGNORE">
+<!ENTITY % chap.disks "IGNORE">
+<!ENTITY % chap.vinum "IGNORE">
+<!ENTITY % chap.x11 "IGNORE">
+<!ENTITY % chap.l10n "IGNORE">
+<!ENTITY % chap.multimedia "IGNORE">
+<!ENTITY % chap.desktop "IGNORE">
+<!ENTITY % chap.serialcomms "IGNORE">
+<!ENTITY % chap.ppp-and-slip "IGNORE">
+<!ENTITY % chap.advanced-networking "IGNORE">
+<!ENTITY % chap.network-servers "IGNORE">
+<!ENTITY % chap.mail "IGNORE">
+<!ENTITY % chap.cutting-edge "IGNORE">
+<!ENTITY % chap.linuxemu "IGNORE">
+<!ENTITY % chap.mirrors "IGNORE">
+<!ENTITY % chap.bibliography "IGNORE">
+<!ENTITY % chap.eresources "IGNORE">
+<!ENTITY % chap.pgpkeys "IGNORE">
+<!ENTITY % chap.index "IGNORE">
+<!ENTITY % chap.freebsd-glossary "IGNORE">
+<!ENTITY % chap.mac "IGNORE">
+
+<!ENTITY % pgpkeys SYSTEM "../../../share/pgpkeys/pgpkeys.ent"> %pgpkeys;
+]>
+
+<book>
+ <bookinfo>
+ <title>FreeBSD 使用手册</title>
+
+ <corpauthor>The FreeBSD Documentation Project</corpauthor>
+ <corpauthor>FreeBSD 中文化项目</corpauthor>
+ <pubdate>1999年,二月</pubdate>
+
+ <copyright>
+ <year>1995</year>
+ <year>1996</year>
+ <year>1997</year>
+ <year>1998</year>
+ <year>1999</year>
+ <year>2000</year>
+ <year>2001</year>
+ <year>2002</year>
+ <year>2003</year>
+ <year>2004</year>
+ <holder>The FreeBSD Documentation Project</holder>
+ </copyright>
+
+ &bookinfo.legalnotice;
+
+ <legalnotice id="trademarks" role="trademarks">
+ &tm-attrib.freebsd;
+ &tm-attrib.3com;
+ &tm-attrib.3ware;
+ &tm-attrib.arm;
+ &tm-attrib.adaptec;
+ &tm-attrib.adobe;
+ &tm-attrib.apple;
+ &tm-attrib.corel;
+ &tm-attrib.creative;
+ &tm-attrib.cvsup;
+ &tm-attrib.heidelberger;
+ &tm-attrib.ibm;
+ &tm-attrib.ieee;
+ &tm-attrib.intel;
+ &tm-attrib.intuit;
+ &tm-attrib.linux;
+ &tm-attrib.lsilogic;
+ &tm-attrib.m-systems;
+ &tm-attrib.macromedia;
+ &tm-attrib.microsoft;
+ &tm-attrib.netscape;
+ &tm-attrib.nexthop;
+ &tm-attrib.opengroup;
+ &tm-attrib.oracle;
+ &tm-attrib.powerquest;
+ &tm-attrib.realnetworks;
+ &tm-attrib.redhat;
+ &tm-attrib.sap;
+ &tm-attrib.sun;
+ &tm-attrib.symantec;
+ &tm-attrib.themathworks;
+ &tm-attrib.thomson;
+ &tm-attrib.usrobotics;
+ &tm-attrib.vmware;
+ &tm-attrib.waterloomaple;
+ &tm-attrib.wolframresearch;
+ &tm-attrib.xfree86;
+ &tm-attrib.xiph;
+ &tm-attrib.general;
+ </legalnotice>
+
+ <abstract>
+ <para>欢迎使用 FreeBSD! 本手册适用于安装 <emphasis>FreeBSD &rel2.current;-RELEASE</emphasis>
+ 和 <emphasis>FreeBSD &rel.current;-RELEASE</emphasis> 以及它们的日常使用。
+ 这个手册目前由很多人 <emphasis>持续地</emphasis> 维护。其中的内容需要不断的添加和更新。
+ 如果您有兴趣参加这个项目,请发邮件到 &a.doc;。此文档最新的版本可以从 <ulink
+ url="http://www.FreeBSD.org/">FreeBSD Web站点</ulink> 上获得。
+ 其他的各种格式和压缩的文档可以从 <ulink
+ url="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/">FreeBSD 的 FTP
+ 服务器</ulink>或下列其中的一个<link
+ linkend="mirrors-ftp">镜像站点</link>下载获得。如果您更希望得到一份印刷版本的手册,可以从
+ <ulink url="http://www.FreeBSDmall.com/">FreeBSD Mall</ulink> 购买. 您还可以<ulink
+ url="&url.base;/search/index.html">搜索手册</ulink>。</para>
+ </abstract>
+ </bookinfo>
+
+ &chap.preface;
+
+ <part id="getting-started">
+ <title>起步</title>
+
+ <partintro>
+ <para>手册的以下章节主要是针对刚开始使用 FreeBSD 的用户及管理员:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>FreeBSD 入门。</para>
+ </listitem>
+
+ <listitem>
+ <para>安装过程向导。</para>
+ </listitem>
+
+ <listitem>
+ <para>教您 &unix; 基本知识和基本原理。</para>
+ </listitem>
+
+ <listitem>
+ <para>展示如何在 FreeBSD 上安装大量的第三方应用。</para>
+ </listitem>
+
+ <listitem>
+ <para>介绍使用 X,&unix; 窗口系统,以及为一些生产环境配置桌面环境的细节。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>我们尝试用最少的页数来保持前言的索引,以至于可以用最少翻页次数将该手册从头至尾读过。</para>
+ </partintro>
+
+ <![ %chap.introduction; [ &chap.introduction; ]]>
+ <![ %chap.install; [ &chap.install; ]]>
+ <![ %chap.basics; [ &chap.basics; ]]>
+ <![ %chap.ports; [ &chap.ports; ]]>
+ <![ %chap.x11; [ &chap.x11; ]]>
+ </part>
+
+ <part id="common-tasks">
+ <title>常见的任务</title>
+
+ <partintro>
+ <para>前面已经介绍了必要的基础知识, 手册的这一部分将讨论 FreeBSD 的一些最常用的功能。
+ 这些章节包括:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>向您介绍流行和实用的桌面应用程序:
+ 浏览器、产品工具、文档察看程序,等等。</para>
+ </listitem>
+
+ <listitem>
+ <para>向您介绍一系列可以在 FreeBSD 上使用的多媒体工具。</para>
+ </listitem>
+
+ <listitem>
+ <para>介绍构建定制的 FreeBSD 内核以启用附加功能的方法。</para>
+ </listitem>
+
+ <listitem>
+ <para>详细介绍包括桌面和网络打印机在内的打印系统设置。</para>
+ </listitem>
+
+ <listitem>
+ <para>向您展示如何在 FreeBSD 上运行 Linux 应用程序。</para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para>某些章节希望您首先阅读过其他部分,在这些章的开头部分也会给出类似的提示。</para>
+
+ </partintro>
+
+ <![ %chap.desktop; [ &chap.desktop; ]]>
+ <![ %chap.multimedia; [ &chap.multimedia; ]]>
+ <![ %chap.kernelconfig; [ &chap.kernelconfig; ]]>
+ <![ %chap.printing; [ &chap.printing; ]]>
+ <![ %chap.linuxemu; [ &chap.linuxemu; ]]>
+ </part>
+
+ <part id="system-administration">
+ <title>系统管理</title>
+
+ <partintro>
+ <para>FreeBSD 手册中其余章节的内容都是关于系统管理。每一章节都从描述开始,由浅入深。</para>
+
+ <para>这些章节被设计成很多相对完整的部分,如果您需要了解某部分内容,直接阅读这部分内容即可,无需按照顺序,也不用在您使用 FreeBSD 的时候需要先读一遍。</para>
+ </partintro>
+
+ <![ %chap.config; [ &chap.config; ]]>
+ <![ %chap.boot; [ &chap.boot; ]]>
+ <![ %chap.users; [ &chap.users; ]]>
+ <![ %chap.security; [ &chap.security; ]]>
+ <![ %chap.mac; [ &chap.mac; ]]>
+ <![ %chap.disks; [ &chap.disks; ]]>
+ <![ %chap.vinum; [ &chap.vinum; ]]>
+ <![ %chap.l10n; [ &chap.l10n; ]]>
+ <![ %chap.cutting-edge; [ &chap.cutting-edge; ]]>
+ </part>
+
+ <part id="network-communication">
+ <title>网络通讯</title>
+
+ <partintro>
+ <para>FreeBSD 是目前以高性能网络服务为目的而部署范围最广的操作系统之一。
+ 讨论这些话题的章节包括:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>串口通讯</para>
+ </listitem>
+
+ <listitem>
+ <para>PPP 和以太网上的 PPP</para>
+ </listitem>
+
+ <listitem>
+ <para>电子邮件</para>
+ </listitem>
+
+ <listitem>
+ <para>运行网络服务</para>
+ </listitem>
+
+ <listitem>
+ <para>其他高级网络话题</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>这些章节主要供您在需要时参考。
+ 不需要以特定的顺序来阅读它们, 此外, 您开始在网络中使用 FreeBSD 之前也不必把它们都读完。</para>
+ </partintro>
+
+ <![ %chap.serialcomms; [ &chap.serialcomms; ]]>
+ <![ %chap.ppp-and-slip; [ &chap.ppp-and-slip; ]]>
+ <![ %chap.mail; [ &chap.mail; ]]>
+ <![ %chap.network-servers; [ &chap.network-servers; ]]>
+ <![ %chap.advanced-networking; [ &chap.advanced-networking; ]]>
+
+ </part>
+
+ <part id="appendices">
+ <title>附录</title>
+
+ <![ %chap.mirrors; [ &chap.mirrors; ]]>
+ <![ %chap.bibliography; [ &chap.bibliography; ]]>
+ <![ %chap.eresources; [ &chap.eresources; ]]>
+ <![ %chap.pgpkeys; [ &chap.pgpkeys; ]]>
+ </part>
+ <![ %chap.freebsd-glossary; [ &bookinfo.freebsd-glossary; ]]>
+ <![ %chap.index; [ &chap.index; ]]>
+ &chap.colophon;
+</book>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/boot/Makefile b/zh_CN.GB2312/books/handbook/boot/Makefile
new file mode 100644
index 0000000000..84225cae6f
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/boot/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= boot/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/boot/chapter.sgml b/zh_CN.GB2312/books/handbook/boot/chapter.sgml
new file mode 100644
index 0000000000..99b437b85f
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/boot/chapter.sgml
@@ -0,0 +1,694 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese (Simplified) Project
+
+ Original Revision: 1.56
+ $FreeBSD$
+-->
+
+<chapter id="boot"> <title>FreeBSD 引导过程</title>
+
+ <sect1 id="boot-synopsis"> <title>概述</title>
+ <indexterm><primary>引导</primary></indexterm>
+
+ <para>启动电脑以及加载操作系统的过程被称为<quote>引导过程</quote>,
+ 或者简称为<quote>引导</quote>。
+ FreeBSD 的引导过程给用户自定义启动提供了很大的伸缩性,
+ 您可以选择启动不同的操作系统,或者是同一系统的不同版本及内核。</para>
+ <para>本章将详细介绍您能在 FreeBSD 引导过程中设置的配置选项。
+ 这包括了引导内核、探测设备并启动 &man.init.8; 等等之前所发生的所有事情。
+ 这些事项一般发生在文本由白变灰时。</para>
+
+ <para>读完这章您将会知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>FreeBSD 引导系统里的各项组件,
+ 以及它们之间的交互方式.</para>
+ </listitem>
+
+ <listitem>
+ <para>在 FreeBSD 引导时给各组件配置选项以控制引导过程。</para>
+ </listitem>
+
+ <listitem>
+ <para> &man.device.hints.5;的基本知识。</para>
+ </listitem>
+ </itemizedlist>
+
+ <note>
+ <title>只适用于x86 </title>
+
+ <para>本章只描述了运行于 Intel x86 体系之上的 FreeBSD 的引导过程。</para>
+ </note>
+ </sect1>
+
+ <sect1 id="boot-introduction">
+ <title>引导问题</title>
+
+ <para>启动电脑及启动和引导操作系统构成了一个有趣的两难境地。
+ 按照定义在操作系统被启动之前计算机是无法完成任何任务的,包括运行磁盘上的程序。
+ 如果计算机在没有操作系统的情况下不能运行来自于磁盘上的程序而操作系统又是放在磁盘上的,
+ 那操作系统是如何启动的呢?</para>
+
+ <para>这个问题在 <citetitle>The Adventures of
+ Baron Munchausen</citetitle> 这本书中有类似的描述。
+ 一个字符从管道中掉下来,克服重重困难抓住了引导程序,
+ 活了下来。在以前,计算机术语<firstterm>bootstrap</firstterm>
+ 指加载操作系统的机制,简称<quote>booting</quote>。</para>
+
+ <para>在 x86 硬件体系中,基本输入/输出系统 (BIOS) 负责加载操作系统,
+ 为了做到这一点,BIOS 在磁盘上寻找主引导记录 (MBR),而 MBR
+ 必须在放置的磁盘的特定位置。BIOS 有足够的能力来读入和运行 MBR,
+ 且假使地认为 MBR 能完成加载操作系统的剩余任务。</para>
+
+ <indexterm>
+ <primary>BIOS</primary>
+ <secondary>基本输入/输出系统</secondary>
+ </indexterm>
+
+ <para>如果您只安装了一个操作系统,那么一个标准的 MBR 就足够了。
+ 这个 MBR 先在磁盘上搜索可引导的分区,
+ 然后运行分区上的代码以加载操作系统的其它部分。</para>
+
+ <para>如果您在磁盘上安装了多个操作系统那么您可以安装一个不同的
+ MBR,它能显示一张操作系统的列表,您能从中选择启动哪个。
+ FreeBSD 自带了一个这样的 MBR,其它的操作系统厂商亦提供可选的
+ MBR。</para>
+
+ <para>启动系统的剩余部分被分为三个阶段。第一阶段由
+ MBR 执行,它只是使计算机进入特定的状态然后执行第二阶段。
+ 第二阶段稍微干得多一些。第三阶段完成加载操作系统的任务。
+ 工作被分为三个阶段是因为 PC 标准对第一第二阶段执行的程序的大小有所限制。
+ 把这些任务连在一起使得 FreeBSD 可以提供更大伸缩性的加载器 (loader)。</para>
+
+ <indexterm><primary>内核</primary></indexterm>
+ <indexterm><primary><command>init</command></primary></indexterm>
+
+ <para>然后内核启动,它开始探测设备并初始化它们。
+ 一旦内核引导进程完成任务,内核将控制权交给用户进程 &man.init.8;,
+ 它确认磁盘是否处于可用状态。&man.init.8; 然后开始用户级资源配置:
+ 加载文件系统启动网卡,及粗略地启动所有 FreeBSD
+ 系统加载时经常运行的进程。</para>
+ </sect1>
+
+ <sect1 id="boot-blocks">
+ <title>MBR 和引导阶段一、二、三</title>
+
+ <sect2 id="boot-boot0">
+ <title>MBR,<filename>/boot/boot0</filename></title>
+ <indexterm><primary>主引导记录 (MBR)</primary></indexterm>
+
+ <para> FreeBSD MBR 放置在 <filename>/boot/boot0</filename>。
+ 这是真实 MBR 的一份 <emphasis>复制品</emphasis>,真正的 MBR
+ 必须放在磁盘上 FreeBSD 分区以外的特定部分。</para>
+
+ <para><filename>boot0</filename> 是非常简单的,因为在
+ <abbrev>MBR</abbrev> 里的代码只有 512 字节。
+ 如果您安装了 FreeBSD MBR 且装了多个操作系统,
+ 在引导时您会看到如下的内容:</para>
+
+ <example id="boot-boot0-example">
+ <title><filename>boot0</filename> 截屏</title>
+
+ <screen>F1 DOS
+F2 FreeBSD
+F3 Linux
+F4 ??
+F5 Drive 1
+
+Default: F2</screen>
+ </example>
+
+ <para>其它操作系统,特别是 &windows;&nbsp;95,以用自己的
+ MBR 覆盖现有 MBR 而著称。如果发生了这种事情,或者您想用
+ FreeBSD 的 MBR 覆盖现有的 MBR,您可以使用以下的命令:</para>
+
+ <screen>&prompt.root; <userinput>fdisk -B -b /boot/boot0 <replaceable>device</replaceable></userinput></screen>
+
+ <para><replaceable>device</replaceable> 是要写入 MBR
+ 的设备名,比如 <devicename>ad0</devicename>
+ 代表第一个 IDE 磁盘,<devicename>ad2</devicename>
+ 代表第二个 IDE 控制器上的第一个 IDE 磁盘,
+ <devicename>da0</devicename> 代表第一个 SCSI 磁盘,等等。</para>
+
+ <para>如果您是 linux 用户,您可能更喜欢使用
+ <application>LILO</application> 来控制引导过程,您可以编辑
+ <filename>/etc/lilo.conf</filename> 文件,或者在安装 FreeBSD 过程中选择
+ <option>Leave The Master Boot Record Untouched</option> 选项。
+ 如果您安装了 FreeBSD 引导管理器,您可以启动 linux 然后更改
+ <application>LILO</application> 的配置文件
+ <filename>/etc/lilo.conf</filename>,加入以下的选项:</para>
+
+ <programlisting>other=/dev/hdXY
+table=/dev/hdb
+loader=/boot/chain.b
+label=FreeBSD</programlisting>
+
+ <para>这样就可以通过
+ <application>LILO</application> 来引导 FreeBSD 和 linux 了。
+ 在我们的例子中,我们使用
+ <replaceable>XY</replaceable> 确定驱动器号和分区。
+ 如果您使用的是 <acronym>SCSI</acronym> 驱动器,您需要将
+ <replaceable>/dev/hdXY</replaceable> 改成 <replaceable>/dev/sdXY</replaceable>,
+ 这里再次使用了 <replaceable>XY</replaceable> 的语法。
+ 如果您安装的两个系统在同一驱动器上,<option>loader=/boot/chain.b</option>
+ 选项可以去掉。现在您可以执行 <command>/sbin/lilo -v</command>
+ 使修改生效。</para>
+ </sect2>
+
+ <sect2 id="boot-boot1">
+ <title>第一阶段,<filename>/boot/boot1</filename>,和第二阶段,
+ <filename>/boot/boot2</filename></title>
+
+ <para>概念上,第一,第二阶段同属于一个程序,处于磁盘的相同区域。但由于空间限制,
+ 它们被分为两部分。可是您总是会一起安装它们。</para>
+
+ <para>它们放置在引导分区的引导扇区里。在引导扇区里能找到 <link
+ linkend="boot-boot0">boot0</link>、<abbrev>MBR</abbrev>
+ 以及其它用于引导系统的程序。<filename>/boot</filename>
+ 目录下的文件是真实文件的拷贝,真实文件放置在 FreeBSD
+ 文件系统之外。</para>
+
+ <para><filename>boot1</filename> 非常简单,因为它再多也只能有 512 字节,
+ 只能识别储存着分区信息的 <firstterm>disklabel</firstterm>,
+ 及寻找执行 <filename>boot2</filename>。</para>
+
+ <para><filename>boot2</filename> 稍微有点加强,能够理解 FreeBSD
+ 的文件系统以便于寻找里面的文件,
+ 能提供选择内核和加载器的简单界面。</para>
+
+ <para>因为 <link linkend="boot-loader">loader</link> 有着更强的功能,
+ 提供了一套易于使用的引导配置,<filename>boot2</filename> 一般都执行 loader,
+ 但以前它的任务是直接运行内核。</para>
+
+ <example id="boot-boot2-example">
+ <title><filename>boot2</filename> 的屏幕输出</title>
+
+ <screen>&gt;&gt; FreeBSD/i386 BOOT
+Default: 0:ad(0,a)/kernel
+boot:</screen>
+ </example>
+
+ <para>如果您要更改已安装的 <filename>boot1</filename> 和
+ <filename>boot2</filename>,请使用命令
+ &man.disklabel.8;。</para>
+ <screen>&prompt.root; <userinput>disklabel -B <replaceable>diskslice</replaceable></userinput></screen>
+
+ <para><replaceable>diskslice</replaceable> 是用于引导的磁盘和分区,
+ 比如 <devicename>ad0s1</devicename>
+ 代表第一个 IDE 磁盘上的第一个分区。</para>
+
+ <warning>
+ <title>dangerously dedicated</title>
+
+ <para>如果您在 &man.disklabel.8; 命令中只使用了磁盘名,比如
+ <devicename>ad0</devicename>,就会破坏磁盘上的所有分区。
+ 这当然不是您所希望的,所以在按下 <keycap>回车</keycap> 之前
+ 一定要对命令进行多次确认。</para>
+ </warning>
+ </sect2>
+
+ <sect2 id="boot-loader">
+ <title>第三阶段,<filename>/boot/loader</filename></title>
+
+ <indexterm><primary>boot-loader</primary></indexterm>
+ <para>加载器 (loader) 是三个阶段中的最后阶段,
+ 且是放置在文件系统之中的,一般是文件
+ <filename>/boot/loader</filename>。</para>
+
+ <para>loader 被作为一种友好的配置方式,使用了一组内建且易用的命令集。
+ 这些命令由一个强大的多的解释器支持构建,其本身带有复杂得多的命令集。</para>
+
+ <sect3 id="boot-loader-flow">
+ <title>Loader 程序流程</title>
+
+ <para>初始时,loader 会探测控制台和磁盘,识别是从哪块盘引导的。
+ 它会根据这些信息设置变量,
+ 启动解释器以接受通过脚本或交互方式传来的用户命令。</para>
+ <indexterm><primary>loader</primary></indexterm>
+ <indexterm><primary>loader 配置</primary></indexterm>
+
+ <para>loader 然后会读取并运行 <filename>/boot/loader.rc</filename>,
+ 默认地读取 <filename>/boot/defaults/loader.conf</filename>
+ 以设置可靠的默认变量,读取 <filename>/boot/loader.conf</filename>
+ 对这些变量作本地修改。<filename>loader.rc</filename>
+ 依据这些变量进行动作,加载任何被选择的模块和内核。</para>
+
+ <para>最后,默认地,loader 会停留 10 秒等待按键,
+ 若没有发生中断,就开始引导内核。如果被中断,用户会得到一个命令行提示符,
+ 在这里用户得更改变量、卸载所有模块、加载模块、最后引导
+ 或重新引导。</para>
+
+ </sect3>
+
+ <sect3 id="boot-loader-commands">
+ <title>Loader 内建的命令</title>
+
+ <para>这些是最常用的 loader 命令.对所有可用命令的解释请参见
+ &man.loader.8;。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>autoboot<replaceable>seconds</replaceable></term>
+
+ <listitem>
+ <para>在给定的时间内如果没有中断发生就引导内核。它显示一个倒数计时,
+ 默认的时间范围是 10 秒。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>boot
+ <optional><replaceable>-options</replaceable></optional>
+ <optional><replaceable>kernelname</replaceable></optional></term>
+
+ <listitem>
+ <para>立即按照给定的选项 (如果有的话) 和内核名
+ (如果是内核的) 引导内核。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>boot-conf</term>
+
+ <listitem>
+ <para>基于变量对各种模块进行自动配置 (和引导内核时发生的一样)。
+ 您只须记住要先使用 <command>unload</command> 命令,
+ 然后修改一些变量,比如 <envar>kernel</envar>。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>help
+ <optional><replaceable>topic</replaceable></optional></term>
+
+ <listitem>
+ <para>显示从文件 <filename>/boot/loader.help</filename>
+ 读取的帮助信息。如果给定的主题是 <literal>index</literal>,
+ 那么列出来的是所有可用的主题。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>include <replaceable>filename</replaceable>
+ &hellip;</term>
+
+ <listitem>
+ <para>通过给定的文件名处理文件。文件被读入,然后被一行一行地解释。
+ 任何错误都会立即中止 include 命令。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>load <optional><option>-t</option>
+ <replaceable>type</replaceable></optional>
+ <replaceable>filename</replaceable></term>
+
+ <listitem>
+ <para>加载内核、内核模块,或者是给定类型的文件 (通过给定的文件名)。
+ 任何在文件名后面的参数都会被传给文件。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ls <optional><option>-l</option></optional>
+ <optional><replaceable>path</replaceable></optional></term>
+
+ <listitem>
+ <para>显示给定路径或者是根目录 (如果路径没有指定) 下面的文件列表。
+ 如果指定了 <option>-l</option> 选项,文件大小也会显示。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>lsdev <optional><option>-v</option></optional></term>
+
+ <listitem>
+ <para>列出所有可以加载模块的设备。
+ 如果指定了<option>-v</option> 选项,会显示出更多的细节。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>lsmod <optional><option>-v</option></optional></term>
+
+ <listitem>
+ <para>显示已被加载的模块。如果指明了 <option>-v</option> 选项,
+ 会显示更多的细节。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>more <replaceable>filename</replaceable></term>
+
+ <listitem>
+ <para>显示指定的文件,每隔 <varname>LINES</varname> 停顿一次。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>reboot</term>
+
+ <listitem>
+ <para>立即重启系统。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>set <replaceable>variable</replaceable></term>
+ <term>set
+ <replaceable>variable</replaceable>=<replaceable>value</replaceable></term>
+
+ <listitem>
+ <para>设置 loader 的环境变量。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>unload</term>
+
+ <listitem>
+ <para>移除所有已被加载的模块。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3 id="boot-loader-examples">
+ <title>Loader 示例</title>
+
+ <para>这里有一些实际中 loader 用法的示例</para>
+
+ <itemizedlist>
+ <indexterm><primary>single-user mode</primary></indexterm>
+ <listitem>
+ <para>只是简单的引导默认内核,不同的是进入单用户模式:</para>
+
+ <screen><userinput>boot -s</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>卸载默认内核和模块,然后加载旧的 (或者其它) 的内核:</para>
+ <indexterm>
+ <primary><filename>kernel.old</filename></primary>
+ </indexterm>
+
+ <screen><userinput>unload</userinput>
+<userinput>load <replaceable>kernel.old</replaceable></userinput></screen>
+
+ <para>您可以使用被称为通用内核的 <filename>kernel.GENERIC</filename>,
+ 或者您以前安装的内核 <filename>kernel.old</filename>
+ (当您升级或配置了您自己的内核等时候)。</para>
+
+ <note>
+ <para>使用以下命令加载常用的模块和另一个内核:</para>
+
+ <screen><userinput>unload</userinput>
+<userinput>set kernel="<replaceable>kernel.old</replaceable>"</userinput>
+<userinput>boot-conf</userinput></screen></note>
+ </listitem>
+
+ <listitem>
+ <para>加载内核配置脚本:</para>
+
+ <screen><userinput>load -t userconfig_script <replaceable>/boot/kernel.conf</replaceable></userinput></screen>
+ </listitem>
+ </itemizedlist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="boot-kernel">
+ <title>内核在引导时的交互</title>
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>引导交互</secondary>
+ </indexterm>
+
+ <para>一旦内核被 <link
+ linkend="boot-loader">loader</link> (一般情况下) 或者 <link
+ linkend="boot-boot1">boot2</link> (越过 loader) 加载,
+ 它将检查引导标志,如果有的话,就会进行必要的动作调整。</para>
+
+ <sect2 id="boot-kernel-bootflags">
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>引导标志</secondary>
+ </indexterm>
+ <title>内核引导标志</title>
+
+ <para>这里是一些常用的引导标志:</para>
+
+ <variablelist id="boot-kernel-bootflags-list">
+ <varlistentry>
+ <term><option>-a</option></term>
+
+ <listitem>
+ <para>在内核初始化时,询问作为根加载的设备。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-C</option></term>
+
+ <listitem>
+ <para>从 CDROM 引导。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-c</option></term>
+
+ <listitem>
+ <para>运行 UserConfig (引导时的内核配置器)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-s</option></term>
+
+ <listitem>
+ <para>引导进入单用户模式</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-v</option></term>
+
+ <listitem>
+ <para>在内核引导过程中显示更有的信息</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <note>
+ <para>还有更多的引导标志,阅读 &man.boot.8;
+ 以获取有关它们的信息。</para></note>
+ </sect2>
+
+<!-- <sect2 id="boot-kernel-userconfig">
+ <title>UserConfig: 引导时的内核配置器</title>
+
+ <para> </para>
+ </sect2> -->
+ </sect1>
+
+ <sect1 id="device-hints">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 18 OCT 2002 -->
+ </sect1info>
+ <indexterm>
+ <primary>device.hints</primary>
+ </indexterm>
+ <title>Device Hints</title>
+
+ <note><para>这是 FreeBSD&nbsp;5.0 及其以后版本的组件,
+ 不存在于早前的版本中。</para></note>
+
+ <para>在初始化系统启动时,&man.loader.8; 会读取
+ &man.device.hints.5; 文件。这个文件以变量的形式储存着内核引导信息,
+ 有时被称为 <quote>device hints</quote>。
+ 设备驱动程序用<quote>device hints</quote>
+ 对设备进行配置。</para>
+
+ <para>Device hints 也可以在 <link linkend="boot-loader">
+ 第三阶段的boot loader</link> 的命令行提示符中指定。变量可以用
+ <command>set</command> 命令添加,<command>unset</command> 命令删除,
+ <command>show</command> 命令查看。在文件 <filename>/boot/device.hints</filename>
+ 设置的变量亦可以在这里被覆盖。键入 boot loader
+ 中的变量不是永久性的,在下次启动时就会被忘记。</para>
+
+ <para>一旦系统引导成功,&man.kenv.1; 命令可以用来清楚所有的变量。</para>
+
+ <para>文件 <filename>/boot/device.hints</filename> 的语法是一行一个变量,
+ 使用<quote>#</quote>作为注释标记。
+ 每行是按照如下方式组织的:</para>
+
+ <screen><userinput>hint.driver.unit.keyword="<replaceable>value</replaceable>"</userinput></screen>
+
+ <para>第三阶段 boot loader 的语法是:</para>
+ <screen><userinput>set hint.driver.unit.keyword=<replaceable>value</replaceable></userinput></screen>
+
+ <para><literal>driver</literal> 是设备驱动程序名,<literal>unit</literal>
+ 是设备驱动程序单位名,<literal>keyword</literal> 是 hint 关键字。
+ 关键字可以由以下选项组成:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>at</literal>:指明设备所绑定的总线</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>port</literal>:指明所使用 <acronym>I/O</acronym>
+ 的起始地址。</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>irq</literal>:指明所使用的中断请求号。</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>drq</literal>:指明 DMA channel 号。</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>maddr</literal>:指明设备占用的物理内存地址。</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>flags</literal>:给设备设置各种标志位。</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>disabled</literal>:如果设成 <literal>1</literal>,
+ 设备被禁用。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>设备驱动程序能够接受更多的 hints,推荐您参看它们的联机手册。参看
+ &man.device.hints.5;、&man.kenv.1;、&man.loader.conf.5; 和
+ &man.loader.8; 联机手册以获取更多的信息。</para>
+ </sect1>
+
+ <sect1 id="boot-init">
+ <indexterm>
+ <primary><command>init</command></primary>
+ </indexterm>
+ <title>Init:进程控制及初始化</title>
+
+ <para>一旦内核完成引导,它就把控制权交给了用户进程
+ &man.init.8;,它放置在 <filename>/sbin/init</filename>,
+ 或者 <envar>init_path</envar> 变量指定的程序路径中。
+ 这个变量是在 <command>loader</command> 里面设置的。</para>
+
+ <sect2 id="boot-autoreboot">
+ <title>自动重启队列</title>
+
+ <para>自动重启队列保证了可用的文件系统是稳定的。
+ 如果不是,且 &man.fsck.8; 不能修复这些错误,
+ &man.init.8; 会进入<link linkend="boot-singleuser">单用户模式</link>
+ 以便系统管理员直接解决问题。</para>
+ </sect2>
+
+ <sect2 id="boot-singleuser">
+ <title>单用户模式</title>
+ <indexterm><primary>单用户模式</primary></indexterm>
+ <indexterm><primary>控制台</primary></indexterm>
+
+ <para>此模式可以通过
+ <link linkend="boot-autoreboot"> 自动重启队列</link>或者通过带有
+ <option>-s</option> 选项的用户引导或通过在 <command>loader</command>
+ 里设置 <envar>boot_single</envar> 变量等多种方式来达到。</para>
+
+ <para>也可以在多用户模式下调动无 reboot(<option>-r</option>)选项和
+ halt (<option>-h</option>) 选项的 &man.shutdown.8;
+ 命令来进入单用户模式。</para>
+
+ <para>如果系统 <literal>控制台</literal> 在文件
+ <filename>/etc/ttys</filename> 中被设置为
+ <literal>不安全(insecure)</literal>,
+ 在初始化单用户模式前会出现要求输入 <username>root</username>
+ 密码的命令行提示符。</para>
+
+ <example id="boot-insecure-console">
+ <title>在 <filename>/etc/ttys</filename> 文件中的不安全控制台</title>
+
+ <programlisting># name getty type status comments
+#
+# If console is marked "insecure", then init will ask for the root password # when going to single-user mode.
+console none unknown off insecure</programlisting>
+ </example>
+
+ <note>
+ <para>把控制台设置成 <literal>不安全 (insecure)</literal>
+ 使只知道 <username>root</username> 密码的人才能进入单用户模式,
+ 因为您认为控制台在物理上是不安全的。因此如果您考虑到安全性,
+ 请选择 <literal>不安全 (insecure)</literal>,而非
+ <literal>安全 (secure)</literal>。</para>
+ </note>
+ </sect2>
+
+ <sect2 id="boot-multiuser">
+ <title>多用户模式</title>
+ <indexterm><primary>多用户模式</primary></indexterm>
+
+ <para>如果 &man.init.8; 发现您的文件系统一切正常,又或者用户在<link
+ linkend="boot-singleuser">单用户模式</link>完成了工作,
+ 系统就会进入多用户模式,开始系统的资源配置。</para>
+
+ <sect3 id="boot-rc">
+ <indexterm><primary>rc 文件</primary></indexterm>
+ <title>资源配置 (rc)</title>
+
+ <para>资源配置分别从文件 <filename>/etc/defaults/rc.conf</filename>、
+ <filename>/etc/rc.conf</filename> 中读取默认配置和细节配置,
+ 然后加载在文件 <filename>/etc/fstab</filename> 中提及的文件系统、
+ 启动网络服务、启动各种系统守护进程,最后启动本地安装包的启动脚本。</para>
+
+ <para>&man.rc.8; 联机手册是关于资源配置的很好的参考。</para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="boot-shutdown">
+ <title>shutdown 队列</title>
+ <indexterm>
+ <primary><command>shutdown</command></primary>
+ </indexterm>
+
+ <para>由命令 &man.shutdown.8; 的控制,
+ &man.init.8; 会试着运行 <filename>/etc/rc.shutdown</filename> 脚本,
+ 给所有进程发送 <literal>TERM</literal> 信号,然后给不按时停止的进程发送
+ <literal>KILL</literal>信号。</para>
+
+ <para>在支持电源管理的体系上关闭 FreeBSD 系统的电源,只要简单的使用命令
+ <command>shutdown -p now</command> 立即关闭电源。使用命令
+ <command>shutdown -r now</command> 重启 FreeBSD。要执行 &man.shutdown.8;
+ 您必须是 <username>root</username> 用户或 <groupname>operator</groupname> 组的成员。
+ 也可以使用 &man.halt.8; 和 &man.reboot.8; 命令来关闭系统,
+ 请参看它们的联机手册以获得更多的信息。</para>
+
+ <note>
+ <para>电源管理需要支持,在 FreeBSD&nbsp;5.X 中要求内核支持
+ &man.acpi.4; 或以模块加载,在 FreeBSD&nbsp;4.X 中需要
+ &man.apm.4; 的支持。</para>
+ </note>
+
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/chapter.decl b/zh_CN.GB2312/books/handbook/chapter.decl
new file mode 100644
index 0000000000..2ff5a67164
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/chapter.decl
@@ -0,0 +1,2 @@
+<!DOCTYPE chapter PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN">
+<!-- $FreeBSD$ -->
diff --git a/zh_CN.GB2312/books/handbook/chapters.ent b/zh_CN.GB2312/books/handbook/chapters.ent
new file mode 100644
index 0000000000..a7ed45b0dd
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/chapters.ent
@@ -0,0 +1,57 @@
+<!--
+ Creates entities for each chapter in the FreeBSD Handbook. Each entity
+ is named chap.foo, where foo is the value of the id attribute on that
+ chapter, and corresponds to the name of the directory in which that
+ chapter's .sgml file is stored.
+
+ Chapters should be listed in the order in which they are referenced.
+
+ Original revision: 1.28
+ $FreeBSD$
+-->
+
+<!ENTITY chap.preface SYSTEM "preface/preface.sgml">
+
+<!-- Part one -->
+<!ENTITY chap.introduction SYSTEM "introduction/chapter.sgml">
+<!ENTITY chap.install SYSTEM "install/chapter.sgml">
+<!ENTITY chap.basics SYSTEM "basics/chapter.sgml">
+<!ENTITY chap.ports SYSTEM "ports/chapter.sgml">
+<!ENTITY chap.x11 SYSTEM "x11/chapter.sgml">
+
+<!-- Part two -->
+<!ENTITY chap.desktop SYSTEM "desktop/chapter.sgml">
+<!ENTITY chap.multimedia SYSTEM "multimedia/chapter.sgml">
+<!ENTITY chap.kernelconfig SYSTEM "kernelconfig/chapter.sgml">
+<!ENTITY chap.printing SYSTEM "printing/chapter.sgml">
+<!ENTITY chap.linuxemu SYSTEM "linuxemu/chapter.sgml">
+
+<!-- Part three -->
+<!ENTITY chap.config SYSTEM "config/chapter.sgml">
+<!ENTITY chap.boot SYSTEM "boot/chapter.sgml">
+<!ENTITY chap.users SYSTEM "users/chapter.sgml">
+<!ENTITY chap.security SYSTEM "security/chapter.sgml">
+<!ENTITY chap.mac SYSTEM "mac/chapter.sgml">
+<!ENTITY chap.disks SYSTEM "disks/chapter.sgml">
+<!ENTITY chap.vinum SYSTEM "vinum/chapter.sgml">
+<!ENTITY chap.l10n SYSTEM "l10n/chapter.sgml">
+<!ENTITY chap.cutting-edge SYSTEM "cutting-edge/chapter.sgml">
+
+<!-- Part four -->
+<!ENTITY chap.serialcomms SYSTEM "serialcomms/chapter.sgml">
+<!ENTITY chap.ppp-and-slip SYSTEM "ppp-and-slip/chapter.sgml">
+<!ENTITY chap.mail SYSTEM "mail/chapter.sgml">
+<!ENTITY chap.network-servers SYSTEM "network-servers/chapter.sgml">
+<!ENTITY chap.advanced-networking SYSTEM "advanced-networking/chapter.sgml">
+
+<!-- Part five (appendices) -->
+<!ENTITY chap.mirrors SYSTEM "mirrors/chapter.sgml">
+<!ENTITY chap.mirrors.ftp.inc SYSTEM "mirrors.sgml.ftp.inc">
+<!ENTITY chap.mirrors.cvsup.inc SYSTEM "mirrors.sgml.cvsup.inc">
+
+<!ENTITY chap.bibliography SYSTEM "bibliography/chapter.sgml">
+<!ENTITY chap.eresources SYSTEM "eresources/chapter.sgml">
+<!ENTITY chap.eresources.www.inc SYSTEM "eresources.sgml.www.inc">
+<!ENTITY chap.pgpkeys SYSTEM "pgpkeys/chapter.sgml">
+<!ENTITY chap.index SYSTEM "index.sgml">
+<!ENTITY chap.colophon SYSTEM "colophon.sgml">
diff --git a/zh_CN.GB2312/books/handbook/colophon.sgml b/zh_CN.GB2312/books/handbook/colophon.sgml
new file mode 100644
index 0000000000..971d153938
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/colophon.sgml
@@ -0,0 +1,28 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.8
+ $FreeBSD$
+-->
+
+<colophon id='colophon'>
+ <para>本书包含了为 <quote>The FreeBSD Documentation Project</quote> 工作的数百名志愿者的工作成果。
+ 这些文字使用符合 DocBook DTD 的 SGML 撰写, 并使用开放源代码的 DSSSL 引擎, <application>Jade</application>
+ 将其转化为许多其他的表现方式。 采用了 Norm Walsh 的 DSSSL 样式表,
+ 并进行了一些追加的定制, 以指引 <application>Jade</application> 产生正确的结果。
+ Donald Knuth 的 <application>&tex;</application> 排版语言,
+ 以及 Leslie Lamport 的 <application>LaTeX</application> 或 Sebastian
+ Rahtz 的 <application>JadeTeX</application> 宏集为本文档的印刷版本发挥了至关重要的作用。</para>
+</colophon>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/config/Makefile b/zh_CN.GB2312/books/handbook/config/Makefile
new file mode 100644
index 0000000000..bacbb8e8dd
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/config/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= config/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/config/chapter.sgml b/zh_CN.GB2312/books/handbook/config/chapter.sgml
new file mode 100644
index 0000000000..512f6d29b9
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/config/chapter.sgml
@@ -0,0 +1,2619 @@
+<!--
+ The FreeBSD Chinese Documentation Project
+
+ Original Revision: 1.174
+ $FreeBSD$
+-->
+
+<chapter id="config-tuning">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>Written by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Mike</firstname>
+ <surname>Smith</surname>
+ <contrib>Based on a tutorial written by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Matt</firstname>
+ <surname>Dillon</surname>
+ <contrib>Also based on tuning(7) written by </contrib>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>设置和调整</title>
+
+ <sect1 id="config-synopsis">
+ <title>概述</title>
+
+ <indexterm><primary>系统配置</primary></indexterm>
+ <indexterm><primary>系统优化</primary></indexterm>
+
+ <para>&os; 的一个重要问题是系统配置。
+ 正确地配置系统能充分地减少以后维护和升级系统所需的工作量。
+ 这章将解释一些 &os; 的配置过程,包括一些可以调整的 &os;
+ 系统的一些参数。</para>
+
+ <para>阅读完本章之后您将会知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>怎样有效的利用文件系统和交换分区。</para>
+ </listitem>
+ <listitem>
+ <para><filename>rc.conf</filename> 的基本设置和
+ <filename>/usr/local/etc/rc.d</filename> 启动体系。</para>
+ </listitem>
+ <listitem>
+ <para>怎样设置和测试一块网卡。</para>
+ </listitem>
+ <listitem>
+ <para>怎样在您的网络设备上设置虚拟主机。</para>
+ </listitem>
+ <listitem>
+ <para>怎样使用 <filename>/etc</filename> 下的各配置文件。</para>
+ </listitem>
+ <listitem>
+ <para>怎样使用 <command>sysctl</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>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="configtuning-initial">
+ <title>初步配置</title>
+
+ <sect2>
+ <title>分区规划</title>
+
+ <indexterm><primary>分区规划</primary></indexterm>
+ <indexterm>
+ <primary><filename>/etc</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/var</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/usr</filename></primary>
+ </indexterm>
+
+ <sect3>
+ <title>基本分区</title>
+
+ <para>当使用 &man.disklabel.8; 或者 &man.sysinstall.8;
+ 来分割您的文件系统的时候,
+ 要记住硬盘驱动器外磁道传输数据要比从内磁道传输数据快。
+ 因此应该将小的和经常访问的文件系统放在驱动器靠外的位置,
+ 一些大的分区比如 <filename>/usr</filename>
+ 应该放在比较靠里的位置。
+ 以类似这样的顺序建立分区是一个不错的主意:root,swap,
+ <filename>/var</filename>,<filename>/usr</filename>。</para>
+
+ <para><filename>/var</filename> 的大小能反映您的机器使用情况。
+ 它用来存储邮件,日志文件和打印队列缓存,
+ 特别是邮箱和日志文件可能会达到无法预料的大小,
+ 这主要取决于在您的系统上有多少用户和您的日志文件可以保存多长时间。
+ 一般大多数用户不需要一个 G 以上的空间,但要记住
+ <filename>/var/tmp</filename> 应该足够大来以便存储一些
+ packages。</para>
+
+ <para><filename>/usr</filename> 分区存储很多用来系统运行所需要的文件例如
+ &man.ports.7; (建议这样做) 和源代码 (可选的)。安装的时候这两项都是可选的。
+ 这个分区至少要保留两个 G 的可用空间。</para>
+
+ <para>当选择分区大小的时候,记住保留一些空间。
+ 用完了一个分区的空间而在另一个分区上还有很多,
+ 可能会导致出现一些错误。</para>
+
+ <note><para>一些用户会发现 &man.sysinstall.8; 的
+ <literal>Auto-defaults</literal> 自动分区有时会分配给
+ <filename>/var</filename> 和 <filename>/</filename> 较小的分区空间。
+ 分区应该精确一些并且大一些。</para></note>
+
+ </sect3>
+
+ <sect3 id="swap-design">
+ <title>交换分区</title>
+
+ <indexterm><primary>交换分区分配</primary></indexterm>
+ <indexterm><primary>交换分区</primary></indexterm>
+
+ <para>一般来讲,交换分区应该大约是系统内存 (RAM) 的两倍。
+ 例如,如果机器有 128M 内存,交换文件应该是 256M。
+ 较小内存的系统可以通过多一点地交换分区来提升性能。
+ 不建议小于 256&nbsp;兆的交换分区,并且扩充您的内存应该被考虑一下。
+ 当交换分区最少是主内存的两倍的时候,内核的 VM (虚拟内存)
+ 页面调度算法可以将性能调整到最好。如果您给机器添加更多内存,
+ 配置太小的交换分区会导致 VM 页面扫描的代码效率低下。</para>
+
+ <para>在使用多块SCSI磁盘(或者不同控制器上的IDE磁盘)的大系统上,
+ 建议在每个驱动器上建立交换分区(直到四个驱动器)。
+ 交换分区应该大约一样大小。内核可以使用任意大小,
+ 但内部数据结构则是最大交换分区的 4 倍。保持交换分区同样的大小,
+ 可以允许内核最佳地调度交换空间来访问磁盘。
+ 即使不太使用,分配大的交换分区也是好的,
+ 在被迫重启之前它可以让您更容易的从一个失败的程序中恢复过来。</para>
+ </sect3>
+
+ <sect3>
+ <title>为什么要分区?</title>
+
+ <para>一些用户认为一个单独的大分区将会很好,
+ 但是有很多原因会证明为什么这是个坏主意。首先,
+ 每个分区有不同的分区特性,因此分开可以让文件系统调整它们。
+ 例如,根系统和 <filename>/usr</filename> 一般只是读取,写入很少。
+ 很多读写频繁的被放在 <filename>/var</filename> 和
+ <filename>/var/tmp</filename>中。</para>
+
+ <para>适当的划分一个系统,用比较小的分区方法,
+ 那些以写为主的分区将不会比以读为主的分区付出更高的代价。
+ 将以写为主的分区放在靠近磁盘的边缘,
+ 例如放在实际的大硬盘的前面代替放在分区表的后面,将会提高您需要的分区的
+ I/O 性能。现在可能也需要在比较大的分区上有很好的 I/O 性能,
+ 把他们移动到磁盘外围不会带来多大的性能提升,反而把
+ <filename>/var</filename> 移到外面会有很好的效果。最后涉及到安全问题。
+ 一个主要是只读的小的、整洁的根分区可以提高从一个严重的系统崩溃中恢复过来的机会。
+</para>
+ </sect3>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="configtuning-core-configuration">
+ <title>核心配置</title>
+
+ <indexterm>
+ <primary>rc 文件</primary>
+ <secondary><filename>rc.conf</filename></secondary>
+ </indexterm>
+
+ <para>系统的配置信息主要位于 <filename>/etc/rc.conf</filename>。
+ 这个文件包含了配置信息很大的一部分,主要在系统启动的时候来配置系统,
+ 这个名字直接说明了这点;它也是 <filename>rc*</filename>
+ 文件的配置信息。</para>
+
+ <para>系统管理员应该在 <filename>rc.conf</filename> 文件中建立记录来覆盖
+ <filename>/etc/defaults/rc.conf</filename> 中的默认设置。
+ 这个默认文件不应该被逐字的拷贝到
+ <filename>/etc</filename> —— 它包含的是默认值而不是一个例子。
+ 所有特定的改变应该在 <filename>rc.conf</filename> 中。</para>
+
+ <para>为了降低管理成本,有很多策略可以应用在成群的应用程序中来从系统指定的配置中分离
+ site-wide 配置。建议的方法是将 site-wide 配置放在另一个文件中,例如
+ <filename>/etc/rc.conf.site</filename>,
+ 并且把它包含进然后把这个文件包括进只包含系统指定信息的
+ <filename>/etc/rc.conf</filename>。</para>
+
+ <para>由于 <filename>rc.conf</filename> 可以被 &man.sh.1;
+ 阅读,所以达到这个目的很简单,例如:</para>
+
+ <itemizedlist>
+ <listitem><para>rc.conf:</para>
+<programlisting> . rc.conf.site
+ hostname="node15.example.com"
+ network_interfaces="fxp0 lo0"
+ ifconfig_fxp0="inet 10.1.1.1"</programlisting></listitem>
+ <listitem><para>rc.conf.site:</para>
+<programlisting> defaultrouter="10.1.1.254"
+ saver="daemon"
+ blanktime="100"</programlisting></listitem>
+ </itemizedlist>
+
+ <para><filename>rc.conf.site</filename> 文件会被分发给每一个使用
+ <command>rsync</command> 或相似程序的系统,同时
+ <filename>rc.conf</filename> 文件仍然保持独立。</para>
+
+ <para>使用 &man.sysinstall.8; 或者 <command>make world</command>
+ 来升级系统不会覆盖 <filename>rc.conf</filename>
+ 文件, 所以系统配置信息不会丢失。</para>
+
+ </sect1>
+
+ <sect1 id="configtuning-appconfig">
+ <title>应用程序配置</title>
+
+ <para>典型的,被安装的应用程序有他自己的配置文件、语法等等。
+ 从基本系统中分开他们是很重要的以至于他们可以容易的被
+ package 管理工具定位和管理</para>
+
+ <indexterm><primary>/usr/local/etc</primary></indexterm>
+
+ <para>一般来说,这些文件被安装在
+ <filename>/usr/local/etc</filename>。这个例子中,
+ 一个应用程序有很多配置文件并且创建了一个子目录来存放他们。</para>
+
+ <para>通常,当一个 port 或者 package 被安装的时候,
+ 配置文件示例也同样被安装了。它们通常用 <filename>.default</filename>
+ 的后缀来标识。如果不存在这个应用程序的配置文件,它们会通过拷贝
+ <filename>.default</filename> 文件来创建。</para>
+
+ <para>例如,看一下这个目下的内容 <filename>/usr/local/etc/apache</filename>:</para>
+
+<literallayout class="monospaced">-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf
+-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default
+-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf
+-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default
+-rw-r--r-- 1 root wheel 12205 May 20 1998 magic
+-rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default
+-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types
+-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default
+-rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf
+-rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default</literallayout>
+
+ <para>文件大小显示了只有 <filename>srm.conf</filename> 改变了。以后
+ <application>Apache</application> 的升级就不会改变这个文件。</para>
+
+ </sect1>
+
+ <sect1 id="configtuning-starting-services">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>启动服务</title>
+
+ <indexterm><primary>服务</primary></indexterm>
+
+ <para>很多 &os; 用户选择用ports来安装第三方软件。
+ 大多数情况下需要一种方式来配置软件,
+ 这种方式可以让软件在系统初始化之后就启动。
+ 很多软件需要在系统初始化时就启动,类似于其中的两个
+ <filename role="package">mail/postfix</filename> 或者
+ <filename role="package">www/apache13</filename>。
+ 因此必须有一个行之有效的方法来配合第三方软件,
+ 偶然的出错会导致程序不能正确启动。</para>
+
+ <para>&os; 包含的大多数服务,例如 &man.cron.8;,
+ 就是通过系统启动脚本启动的。 这些脚本也许会有些不同,
+ 这取决于 &os; 版本。 但是不管怎样,
+ 需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。</para>
+
+ <para>自从 rcNG 出现以来,系统为第三方软件初始化变得清晰而有条理了。
+ 应用程序将会把一个简单的启动脚本放在
+ <filename role="directory">/usr/local/etc/rc.d</filename>
+ 目录,系统初始化脚本会读取这个目录下面的脚本。
+ 这些脚本在系统启动之后被执行。</para>
+
+ <para>当很多人花费时间把旧的配置格式融入到新系统的时候,
+ 仍然残留有一些第三方软件需要把脚本放在上述目录中。
+ 这些脚本中的细微差别依赖于 rcNG 是否被使用。
+ &os; 5.1 之前的所有版本并不需要额外的配置;
+ 当然,大多数情况下这些久经考验的脚本都会工作的很好。</para>
+
+ <para>每个脚本都应该遵守 &os; 版本所需求的一些规定:
+ 每个脚本必须在文件名最后添加一个 <filename>.sh</filename>
+ 的扩展名,并且这个脚本能被系统执行。
+ 后者可以通过 <command>chmod</command> 把权限设置为
+ <literal>755</literal>来实现。
+ 它还应该能接受 <literal>start</literal>
+ 选项来启动程序并且接受 <literal>stop</literal>
+ 选项来结束程序。</para>
+
+ <para>一个简单的脚本看起来可能会像这样:</para>
+
+ <programlisting>#!/bin/sh
+echo -n ' utility'
+
+case "$1" in
+start)
+ /usr/local/bin/utility
+ ;;
+stop)
+ kill -9 `cat /var/run/utility.pid`
+ ;;
+*)
+ echo "Usage: `basename $0` {start|stop}" >&2
+ exit 64
+ ;;
+esac
+
+exit 0</programlisting>
+
+ <para>这个脚本提供了一个 <literal>start</literal>
+ 和 <literal>stop</literal> 选项,
+ 这可以让应用程序被当作组件(utility)来引用。
+ 可以在 <filename>/etc/rc.conf</filename> 写这么一行:</para>
+
+ <programlisting>utility_enable="YES"</programlisting>
+
+ <para>可以用如下方法来启动:</para>
+
+ <screen>&prompt.root; <userinput><filename>/usr/local/etc/rc.d/utility.sh</filename> start</userinput></screen>
+
+ <para>现在不是所有第三方软件都需要在
+ <filename>rc.conf</filename>有这么一行,
+ 不过几乎每天都有port被修改来接受这个配置。
+ 对于一个特定的应用程序来说,
+ 你可以查看安装的最终输出来获得更多信息。
+ 一些第三方软件仍然提供一个脚本来供 rcNG 来使用,
+ 这将在下一节介绍。</para>
+
+ <sect2>
+ <title>扩展应用程序配置</title>
+
+ <para>现在 &os; 包含rcNG,软件启动配置更加理想了,
+ 当然也变得更深奥。
+ 用 <link linkend="configtuning-rcNG">rcNG</link>
+ 这章介绍的关键字,应用程序现在被配置为可以在某一个服务之后启动,
+ 例如<acronym>DNS</acronym>;
+ 可能还要在 <filename>rc.conf</filename>
+ 传递更多的参数给启动脚本。
+ 一个基本的脚本看起来有点象下面这个样子:</para>
+
+ <programlisting>#!/bin/sh
+#
+# PROVIDE: utility
+# REQUIRE: DAEMON
+# BEFORE: LOGIN
+# KEYWORD: FreeBSD shutdown
+
+#
+# DO NOT CHANGE THESE DEFAULT VALUES HERE
+# SET THEM IN THE /etc/rc.conf FILE
+#
+utility_enable=${utility_enable-"NO"}
+utility_flags=${utility_flags-""}
+utility_pidfile=${utility_pidfile-"/var/run/utility.pid"}
+
+. /etc/rc.subr
+
+name="utility"
+rcvar=`set_rcvar`
+command="/usr/local/sbin/utility"
+
+load_rc_config $name
+
+pidfile="${utility_pidfile}"
+
+start_cmd="echo \"Starting ${name}.\"; /usr/bin/nice -5 ${command} ${utility_flags} ${command_args}"
+
+run_rc_command "$1"</programlisting>
+
+ <para>这个脚本将保证
+ <application>utility</application> 能够在
+ <literal>login</literal> 服务之前, 并且在
+ <literal>daemon</literal> 服务之后启动。 它同时也提供了一个设置和跟踪
+ <acronym>PID</acronym>, 也称作进程
+ <acronym>ID</acronym> 文件的方法。</para>
+
+ <para>这个新方法也使得命令行参数、包含 <filename>/etc/rc.subr</filename>
+ 中所提供的功能, 兼容 &man.rcorder.8; 工具并提供更简单的通过
+ <filename>rc.conf</filename> 文件来配置的方法。 实际上它甚至可以放到
+ <filename role="directory">/etc/rc.d</filename> 目录中。
+ 当然, 在使用 &man.mergemaster.8; 来完成软件升级时这会带来一些麻烦。</para>
+ </sect2>
+
+ <sect2>
+ <title>使用服务来启动服务</title>
+
+ <para>其他服务, 例如 <acronym>POP</acronym>3 服务器,
+ <acronym>IMAP</acronym>, 等等, 可以通过
+ &man.inetd.8; 来启动。 这样的过程包括从
+ ports collection 安装相应的程序, 并把配置添加进
+ <filename>/etc/inetd.conf</filename> 文件, 或去掉当前配置中的注释。
+ 如何使用 <command>inetd</command> 并进行配置在
+ <link linkend="network-inetd">inetd</link> 一节中有深入的阐述。</para>
+
+ <para>一些情况下, 通过
+ &man.cron.8; 来启动系统服务也是一种可行的选择。
+ 这种方法有很多好处, 因为 <command>cron</command> 会以
+ <command>crontab</command> 的文件属主身份执行那些进程。
+ 这使得普通用户也能够执行他们的应用。</para>
+
+ <para><command>cron</command> 工具提供了一个独有的功能, 以
+ <literal>@reboot</literal> 来指定时间。
+ 这样的设置将在 &man.cron.8; 启动时运行,
+ 通常这也是系统初始化的时候。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="configtuning-cron">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ <!-- 20 May 2003 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>配置 <command>cron</command></title>
+
+ <indexterm><primary>cron</primary>
+ <secondary>配置</secondary></indexterm>
+
+ <para>&os; 最有用的软件包(utilities)中的一个是 &man.cron.8;。
+ <command>cron</command> 软件在后台运行并且经常检查
+ <filename>/etc/crontab</filename> 文件。<command>cron</command>
+ 软件也检查 <filename>/var/cron/tabs</filename> 目录,搜索新的
+ <filename>crontab</filename> 文件。这些 <filename>crontab</filename>
+ 文件存储一些 <command>cron</command> 在特定时间执行任务的信息。</para>
+
+ <para><command>cron</command> 程序使用两种不同类型的配置文件,
+ 即系统 crontab 和用户 crontabs。 两种格式的唯一区别是第六个字段。
+ 在系统 crontab 中,第六个字段是用于执行命令的用户名。
+ 这给予了系统 crontab 以任意用户身份执行命令的能力。
+ 在用户 crontab 中, 第六个字段是要执行的命令,
+ 所有的命令都会以这个用户自己的身份执行;
+ 这是一项重要的安全功能。</para>
+
+ <note>
+ <para>用户 crontabs 允许每一个用户在不需要 root 特权的前提下调度自己的任务。
+ 在用户的 crontab 中的命令将以该用户的权限执行。</para>
+
+ <para>同任何其他用户一样, <username>root</username> 用户也可以有自己的 crontab。
+ 它不同于 <filename>/etc/crontab</filename> (也就是系统 crontab)。
+ 因为有系统 crontab 的存在,通常不需要给 <username>root</username>
+ 建立单独的 crontab。</para>
+ </note>
+
+ <para>让我们来看一下 <filename>/etc/crontab</filename> 文件:</para>
+
+
+ <programlisting># /etc/crontab - root's crontab for &os;
+#
+# &dollar;&os;: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp &dollar;
+# <co id="co-comments">
+#
+SHELL=/bin/sh
+PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin <co id="co-env">
+HOME=/var/log
+#
+#
+#minute hour mday month wday who command <co id="co-field-descr">
+#
+#
+*/5 * * * * root /usr/libexec/atrun <co id="co-main">
+</programlisting>
+
+ <calloutlist>
+ <callout arearefs="co-comments">
+ <para>像大多数 &os; 配置文件一样,<literal>#</literal> 字符是注释。
+ 作为什么和为什么要执行,可以加一个注释来描述以便将来提醒您。
+ 注释不能跟命令一样在同一行上否则他们会被看成命令的一部分。
+ 注释应该另起一行。空行将会被忽略。</para>
+ </callout>
+
+ <callout arearefs="co-env">
+ <para>首先应该定义环境变量。等号
+ (<literal>=</literal>) 字符用来定义任何环境变量,像这个例子用到了
+ <envar>SHELL</envar>,<envar>PATH</envar> 和 <envar>HOME</envar>
+ 变量。如果 shell 行被忽略掉,<command>cron</command> 将会用默认值
+ <command>sh</command>。如果 <option>PATH</option> 变量被忽略,
+ 那么就没有默认值并且需要指定文件绝对位置。如果 <option>HOME</option>
+ 被忽略,<command>cron</command> 将用用执行者的 home 目录。</para>
+ </callout>
+
+ <callout arearefs="co-field-descr">
+ <para>这一行定义了七个字段。它们是 <literal>minute</literal>、
+ <literal>hour</literal>、<literal>mday</literal>、
+ <literal>month</literal>、<literal>wday</literal>、
+ <literal>who</literal> 和 <literal>command</literal>。
+ 它们差不多已经说明了各自的用处。Minute 是命令要运行时的分钟,Hour
+ 跟 minute 差不多,只是用小时来表示。Mday 是每个月的天。Month 跟 hour
+ 还有 minute 都差不多,用月份来表示。wday 字段表示星期几。
+ 所有这些字段的值必须是数字并且用24小时制来表示。<quote>who</quote>
+ 字段是特别的,并且只在 <filename>/etc/crontab</filename> 文件中存在。
+ 这个字段指定了命令应该以哪个用户的身份来运行。当一个用户添加了他(她)的
+ <filename>crontab</filename> 文件的时候,他们就会没有这个字段选项。最后,是
+ <literal>command</literal> 字段。这是最后的一个字段,
+ 所以自然就是它指定要运行的程序。</para>
+ </callout>
+
+ <callout arearefs="co-main">
+ <para>最后一行定义了上面所说的值。注意这里我们有一个
+ <literal>*/5</literal> 列表,紧跟着是一些 <literal>*</literal>
+ 字符。<literal>*</literal> 字符代表<quote>开始到最后</quote>,
+ 也可以被解释成 <emphasis>每次</emphasis>。所以,根据这行,
+ 显然表明了无论在何时每隔 5 分钟以 <username>root</username>
+ 身份来运行 <command>atrun</command> 命令。查看 &man.atrun.8;
+ 手册页以获得 <command>atrun</command> 的更多信息。</para>
+
+ <para>命令可以有任意多个传递给它们的标志。无论怎样,
+ 扩展到多行的命令应该用反斜线(<quote>\</quote>)来续行。</para>
+ </callout>
+ </calloutlist>
+
+ <para>这是每个 <filename>crontab</filename> 文件的基本设置,
+ 虽然它们有一个不同。第六行我们指定的用户名只存在于系统
+ <filename>/etc/crontab</filename> 文件。这个字段在普通用户的
+ <filename>crontab</filename> 文件中应该被忽略。</para>
+
+
+ <sect2 id="configtuning-installcrontab">
+ <title>安装 Crontab</title>
+
+ <important>
+ <para>绝对不要用这种方法来编辑/安装系统 crontab。
+ 您需要做的只是使用自己喜欢的编辑器:
+ <command>cron</command> 程序会注意到文件发生了变化,
+ 并立即开始使用新的版本。参见
+ <ulink url="&url.books.faq;/admin.html#ROOT-NOT-FOUND-CRON-ERRORS">
+ 这个 FAQ 项目 </ulink> 以了解进一步的情况。</para>
+ </important>
+
+ <para>要安装刚写好的用户
+ <filename>crontab</filename>,
+ 首先使用最习惯的编辑器来创建一个符合要求格式的文件,然后用
+ <command>crontab</command> 程序来完成。最常见的用法是:</para>
+
+ <screen>&prompt.user; <userinput>crontab crontab-file</userinput></screen>
+
+ <para>In this example, <filename>crontab-file</filename> is the filename
+ of a <filename>crontab</filename> that was previously created.</para>
+
+ <para>还有一个选项用来列出安装的 <filename>crontab</filename> 文件:
+ 只要传递 <option>-l</option> 选项给 <command>crontab</command>
+ 然后看一下输出。</para>
+
+ <para>用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用
+ <command>crontab -e</command> 选项也是可以的。
+ 它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候,
+ 它会自动的用 <command>crontab</command> 来安装这个文件。
+ </para>
+
+ <para>如果您稍后想要彻底删除自己的用户 <filename>crontab</filename>
+ 可以使用 <command>crontab</command> 的 <option>-r</option>
+ 选项。
+ </para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="configtuning-rcNG">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ <!-- 16 May 2003 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>在 FreeBSD 5.X 下使用 rc</title>
+
+ <indexterm><primary>rcNG</primary></indexterm>
+
+ <para>&os; 最近整合了 NetBSD 的 <filename>rc.d</filename>
+ 系统以完成系统初始化。用户要注意 <filename>/etc/rc.d</filename>
+ 目录下的文件。这些文件中的很多都是可以接受 <option>start</option>、
+ <option>stop</option> 和 <option>restart</option> 选项的基本服务。
+ 例如,&man.sshd.8; 可以用下面的命令重启:</para>
+
+ <screen>&prompt.root; <userinput>/etc/rc.d/sshd restart</userinput></screen>
+
+ <para>其它的服务跟这个过程相似。当然,在 &man.rc.conf.5;
+ 指定的服务通常可以自动启动。例如,让网络地址转换(NAT)
+ 守护进程在系统启动的时候启动可以简单的在
+ <filename>/etc/rc.conf</filename> 中添加下面一行:</para>
+
+ <programlisting>natd_enable="YES"</programlisting>
+
+ <para>如果 <option>natd_enable="NO"</option> 行已经存在,
+ 只要简单的把 <option>NO</option> 改成
+ <option>YES</option> 即可。
+ rc 脚本在下次重新启动的时候会自动的装载所需要的服务,
+ 像下面所描述的那样。</para>
+
+ <para>由于 <filename>rc.d</filename>
+ 系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的
+ <filename>/etc/rc.conf</filename> 变量,标准的
+ <option>start</option>、<option>stop</option> 和
+ <option>restart</option> 选项将会执行他们的动作。例如
+ <command>sshd restart</command> 命令只在 <filename>/etc/rc.conf</filename>
+ 中的 <varname>sshd_enable</varname> 设置成 <option>YES</option>
+ 的时候工作。不管是否在 <filename>/etc/rc.conf</filename> 中设置了,要
+ <option>start</option>、<option>stop</option> 或者 <option>restart</option>
+ 一个服务,命令前可以加上一个<quote>force</quote>前缀。例如要不顾当前
+ <filename>/etc/rc.conf</filename> 的设置重新启动
+ <command>sshd</command>,执行下面的命令:
+</para>
+
+ <screen>&prompt.root; <userinput>/etc/rc.d/sshd forcerestart</userinput></screen>
+
+ <para>用选项 <option>rcvar</option> 可以简单来的检查
+ <filename>/etc/rc.conf</filename> 中用适当的 <filename>rc.d</filename>
+ 脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查
+ <command>sshd</command> 是否真的在 <filename>/etc/rc.conf</filename>
+ 中被启动了:</para>
+
+ <screen>&prompt.root; <userinput>/etc/rc.d/sshd rcvar</userinput>
+# sshd
+$sshd_enable=YES</screen>
+
+ <note>
+ <para>第二行 (<literal># sshd</literal>) 是从
+ <command>sshd</command> 命令中输出的,而不是
+ <username>root</username> 控制台。</para>
+ </note>
+
+ <para>为了确定一个服务是否真的在运行,可以用 <option>status</option>
+ 选项。例如验证 <command>sshd</command> 是否真的启动了:</para>
+
+ <screen>&prompt.root; <userinput>/etc/rc.d/sshd status</userinput>
+sshd is running as pid 433.</screen>
+
+ <para><option>reload</option> 一个服务也是可以的。
+ 这将要尝试发送一个信号给一个单独的服务,
+ 强制这个服务重新装载它的配置文件。大多数情况这意味着给服务发送一个
+ <literal>SIGHUP</literal> 信号。
+ </para>
+
+ <para><application>rcNG</application> 结构不仅仅是给网络服务提供的,
+ 它也给很多系统初始化提供服务。例如,处理 <filename>bgfsck</filename>
+ 文件。当这个脚本执行的时候,它会输出下列信息:
+ </para>
+
+ <screen>Starting background file system checks in 60 seconds.</screen>
+
+ <para>这个文件用做后台文件系统检查,系统初始化的时候完成。</para>
+
+ <para>很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于
+ RPC 的服务启动可能在 <command>rpcbind</command> 服务启动之前失败。
+ 要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。
+ 程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。
+ 下面的字句可能会包含在每个启动脚本文件的前面:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>PROVIDE</literal>: Specifies the services this file provides.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>REQUIRE</literal>: Lists services which are required for this
+ service. This file will run <emphasis>after</emphasis>
+ the specified services.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>BEFORE</literal>: Lists services which depend on this service.
+ This file will run <emphasis>before</emphasis>
+ the specified services.</para>
+ </listitem>
+
+ <listitem>
+ <para>KEYWORD: &os; or NetBSD. This is used for *BSD dependent features.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>通过这种方法,系统管理员可以容易的控制系统而不用像其他一些
+ &unix; 操作系统一样要用 <quote>runlevels</quote> 来控制。</para>
+
+ <para>&os;5.X 的附加信息: <filename>rc.d</filename> 系统可以在
+ &man.rc.8; 和 &man.rc.subr.8; 手册页中找到。</para>
+ </sect1>
+
+ <sect1 id="config-network-setup">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>Contributed by </contrib>
+ <!-- 6 October 2002 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>设置网卡</title>
+
+ <indexterm><primary>网卡配置</primary></indexterm>
+
+ <para>现在我们不可想象一个计算机没有网络连接的情况。
+ 添加和配置一块网卡是任何 &os; 系统管理员的一项基本任务。
+ </para>
+
+ <sect2>
+ <title>查找正确的驱动程序</title>
+
+ <indexterm>
+ <primary>网卡配置</primary>
+ <secondary>查找驱动程序</secondary>
+ </indexterm>
+
+ <para>在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI
+ 还是 ISA 网卡。&os; 支持很多种 PCI 和 ISA 网卡。
+ 可以查看您的版本硬件兼容性列表以确定您的网卡被支持。
+ </para>
+
+ <para>
+ 现在您已经确信您的网卡被支持了,您需要为这块网卡选择正确的驱动程序。
+ <filename>/usr/src/sys/i386/conf/LINT</filename>
+ 文件将会给您一些被支持的芯片/网卡驱动信息的列表。
+ 如果您对哪个是正确的驱动有疑问,阅读驱动的使用手册。
+ 手册会提供所支持硬件的更多信息和相关可能产生的问题。</para>
+
+ <para>如果您有一个普通的网卡,大多数时候您不需要为驱动浪费精力。
+ 常用的网卡在 <filename>GENERIC</filename> 内核中已经支持了,
+ 所以您的网卡在启动时就会显示出来,像是:</para>
+
+<screen>dc0: &lt;82c169 PNIC 10/100BaseTX&gt; port 0xa000-0xa0ff mem 0xd3800000-0xd38
+000ff irq 15 at device 11.0 on pci0
+dc0: Ethernet address: 00:a0:cc:da:da:da
+miibus0: &lt;MII bus&gt; on dc0
+ukphy0: &lt;Generic IEEE 802.3u media interface&gt; on miibus0
+ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
+dc1: &lt;82c169 PNIC 10/100BaseTX&gt; port 0x9800-0x98ff mem 0xd3000000-0xd30
+000ff irq 11 at device 12.0 on pci0
+dc1: Ethernet address: 00:a0:cc:da:da:db
+miibus1: &lt;MII bus&gt; on dc1
+ukphy1: &lt;Generic IEEE 802.3u media interface&gt; on miibus1
+ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto</screen>
+
+ <para>在这个例子中,我们看到有两块使用 &man.dc.4; 驱动的网卡在系统中。</para>
+
+ <para>为了使用网卡,需要装载正确的驱动程序。这可能通过两种途径来完成。
+ 最简单的方法是简单的用 &man.kldload.8; 来装载一个驱动该网卡的内核模块。
+ 一个模块不是支持所有网卡驱动的(例如ISA 网卡用 &man.ed.4; 来驱动)。
+ 另一种可选择的方法是您可以把支持您网卡的驱动静态的编译进内核。查看
+ <filename>/usr/src/sys/i386/conf/LINT</filename>
+ 和手册中的驱动部分来了解把什么添加到您的内核配置文件中。可以查看 <xref
+ linkend="kernelconfig"> 以获得更多的重新编译内核的信息。
+ 如果您的网卡在启动时被您的内核 (<filename>GENERIC</filename>)
+ 检测到了,那么就没有必要建立一个新内核了。
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>配置网卡</title>
+
+ <indexterm>
+ <primary>网卡配置</primary>
+ <secondary>配置</secondary>
+ </indexterm>
+
+ <para>现在正确的网卡驱动程序已经装载,那么就应该配置它了。
+ 跟其他配置一样,网卡可以在安装时用
+ <application> sysinstall </application> 来配置。</para>
+
+ <para>要显示您系统上的网络接口的配置,输入下列命令:</para>
+
+<screen>&prompt.user; <userinput>ifconfig</userinput>
+dc0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
+ inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
+ ether 00:a0:cc:da:da:da
+ media: Ethernet autoselect (100baseTX &lt;full-duplex&gt;)
+ status: active
+dc1: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
+ inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
+ ether 00:a0:cc:da:da:db
+ media: Ethernet 10baseT/UTP
+ status: no carrier
+lp0: flags=8810&lt;POINTOPOINT,SIMPLEX,MULTICAST&gt; mtu 1500
+lo0: flags=8049&lt;UP,LOOPBACK,RUNNING,MULTICAST&gt; mtu 16384
+ inet 127.0.0.1 netmask 0xff000000
+tun0: flags=8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1500</screen>
+
+ <note>
+ <para>老版本的 &os; 可能需要在 &man.ifconfig.8; 后面接
+ <option>-a</option> 选项,需要了解更多的 &man.ifconfig.8;
+ 语法请查阅使用手册。注意所有关于 IPv6 (<literal>inet6</literal>
+ 等等) 的记录在这个例子里都被忽略了。</para>
+ </note>
+
+ <para>在这个例子中,显示出了下列设备:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><devicename>dc0</devicename>: The first Ethernet
+ interface</para>
+ </listitem>
+
+ <listitem>
+ <para><devicename>dc1</devicename>: The second Ethernet
+ interface</para>
+ </listitem>
+
+ <listitem>
+ <para><devicename>lp0</devicename>: The parallel port
+ interface</para>
+ </listitem>
+
+ <listitem>
+ <para><devicename>lo0</devicename>: The loopback device</para>
+ </listitem>
+
+ <listitem>
+ <para><devicename>tun0</devicename>: The tunnel device used by
+ <application>ppp</application></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ &os; 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如
+ <devicename>sis2</devicename> 是系统中使用 &man.sis.4;
+ 驱动的第三块网卡。
+ </para>
+
+ <para>在这个例子中,<devicename>dc0</devicename>
+ 设备启用了。主要表现在:</para>
+
+ <orderedlist>
+ <listitem>
+ <para><literal>UP</literal> 表示这块网卡已经配置完成准备工作。</para>
+ </listitem>
+
+ <listitem>
+ <para>这块网卡有一个 Internet (<literal>inet</literal>) 地址
+ (这个例子中是 <hostid role="ipaddr">192.168.1.3</hostid>)。</para>
+ </listitem>
+
+ <listitem>
+ <para>它有一个有效的子网掩码 (<literal>netmask</literal>;
+ <hostid role="netmask">0xffffff00</hostid> 等同于
+ <hostid role="netmask">255.255.255.0</hostid>)。</para>
+ </listitem>
+
+ <listitem>
+ <para>它有一个有效的广播地址 (这个例子中是
+ <hostid role="ipaddr">192.168.1.255</hostid>)。</para>
+ </listitem>
+
+ <listitem>
+ <para>网卡的 MAC (<literal>ether</literal>) 地址是
+ <hostid role="mac">00:a0:cc:da:da:da</hostid></para>
+ </listitem>
+
+ <listitem>
+ <para>物理传输媒介模式处于自动选择状态
+ (<literal>media: Ethernet autoselect
+ (100baseTX &lt;full-duplex&gt;)</literal>)。我们看到
+ <devicename>dc1</devicename> 被配置成运行在
+ <literal>10baseT/UTP</literal> 模式下。
+ 要了解驱动媒介类型的更多信息,
+ 请查阅它们的使用手册。</para>
+ </listitem>
+
+ <listitem>
+ <para>连接状态 (<literal>status</literal>)是
+ <literal>active</literal>,也就是说连接信号被检测到了。对于
+ <devicename>dc1</devicename>,我们看到
+ <literal>status: no carrier</literal>。
+ 这通常是网线没有插好。</para>
+ </listitem>
+ </orderedlist>
+
+ <para>如果 &man.ifconfig.8; 的输出显示了类似于:</para>
+
+<screen>dc0: flags=8843&lt;BROADCAST,SIMPLEX,MULTICAST&gt; mtu 1500
+ ether 00:a0:cc:da:da:da</screen>
+
+ <para>的信息,那么就是还没有配置网卡。</para>
+
+ <para>要配置网卡,您需要 <username>root</username> 权限。
+ 网卡配置可以通过使用 &man.ifconfig.8; 命令行方式来完成,
+ 但是这样每次启动都要做一遍。放置网卡配置信息的文件是
+ <filename>/etc/rc.conf</filename>。</para>
+
+ <para>用您自己喜欢的编辑器打开 <filename>/etc/rc.conf</filename>。
+ 并且您需要为每一块系统中存在的网卡添加一行,
+ 在我们的例子中,添加如下几行:</para>
+
+<programlisting>ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
+ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"</programlisting>
+
+ <para>用自己正确的设备名和地址来替换例子中的
+ <devicename>dc0</devicename>,<devicename>dc1</devicename>
+ 等内容。您应该应该查阅网卡驱动和 &man.ifconfig.8;
+ 的手册页来了解各选项,也要查看一下 &man.rc.conf.5;
+ 帮助页来了解 <filename>/etc/rc.conf</filename> 的语法。</para>
+
+ <para>
+ 如果在安装的时候配置了网络,关于网卡的一些行可能已经存在了。
+ 所以在添加新行前仔细检查一下 <filename>/etc/rc.conf</filename>。
+ </para>
+
+ <para>
+ 您也可能需要编辑 <filename>/etc/hosts</filename>
+ 来添加局域网中不同的机器名称和 IP 地址,如果它们不存在,查看
+ &man.hosts.5; 帮助和 <filename>/usr/share/examples/etc/hosts</filename>
+ 以获得更多信息。</para>
+ </sect2>
+
+ <sect2>
+ <title>测试和调试</title>
+
+ <para>对 <filename>/etc/rc.conf</filename>
+ 做了必要的修改之后应该重启系统以应用对接口的修改,
+ 并且确认系统重启后没有任何配置错误。</para>
+
+ <para>系统重启后就应该测试网络接口了。</para>
+
+ <sect3>
+ <title>测试以太网卡</title>
+
+ <indexterm>
+ <primary>网卡配置</primary>
+ <secondary>测试网卡</secondary>
+ </indexterm>
+
+ <para>为了确认网卡被正确的配置了,在这里我们要做两件事情。首先,
+ ping 自己的网络接口,接着 ping 局域网内的其他机器。</para>
+
+ <para>首先测试本地接口:</para>
+
+<screen>&prompt.user; <userinput>ping -c5 192.168.1.3</userinput>
+PING 192.168.1.3 (192.168.1.3): 56 data bytes
+64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
+64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
+64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
+64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
+64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms
+
+--- 192.168.1.3 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms</screen>
+
+ <para>现在我们应该 ping 局域网内的其他机器:</para>
+
+<screen>&prompt.user; <userinput>ping -c5 192.168.1.2</userinput>
+PING 192.168.1.2 (192.168.1.2): 56 data bytes
+64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
+64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
+64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
+64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
+64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms
+
+--- 192.168.1.2 ping statistics ---
+5 packets transmitted, 5 packets received, 0% packet loss
+round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms</screen>
+
+ <para>您如果您设置了 <filename>/etc/hosts</filename>
+ 文件,也可以用机器名来替换 <hostid role="ipaddr">192.168.1.2</hostid>。</para>
+ </sect3>
+
+ <sect3>
+ <title>调试</title>
+
+ <indexterm>
+ <primary>网卡配置</primary>
+ <secondary>调试</secondary>
+ </indexterm>
+
+ <para>调试硬件和软件配置一直是一件头痛的事情,
+ 从最简单的开始可以减轻一些痛苦。
+ 例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗?
+ 是否使用了被 & os; 支持的网卡?
+ 在发送错误报告之前您应该查看一下硬件说明,
+ 升级 &os; 到最新的 STABLE 版本,
+ 看一下邮件列表或者在 Internet 上搜索一下。</para>
+
+ <para>如果网卡工作了,
+ 但性能低下,应该好好阅读一下 &man.tuning.7; 联机手册。
+ 您也可以检查一下网络配置,
+ 不正确的设置会导致慢速的网络连接。</para>
+
+ <para>一些用户可能会在一些网卡上经历一到两次
+ <errorname>device timeouts</errorname>, 这通常是正常现象。
+ 如果经常这样甚至引起麻烦, 则应确定一下它跟其他设备没有冲突。
+ 仔细检查网线连接, 或者换一块网卡。</para>
+
+ <para>有时用户会看到少量 <errorname>watchdog timeout</errorname>
+ 错误。 这种情况要做的第一件事就是检查线缆连接。
+ 一些网卡需要支持总线控制的 PCI 插槽。
+ 在一些老的主板上,只有一个 PCI 插槽支持 (一般是 slot 0)。
+ 检查网卡和主板说明书来确定是不是这个问题。</para>
+
+ <para><errorname>No route to host</errorname>
+ 通常发生在如果系统不能发送一个路由到目的主机的包的时候。
+ 这在没有指定默认路由或者网线没有插上时会发生。
+ 检查 <command>netstat -rn</command>
+ 的输出并确认有一个有效的路由能到达相应的主机。
+ 如果没有,请查阅 <xref linkend="advanced-networking">。</para>
+
+ <para><errorname>ping: sendto: Permission denied</errorname>
+ 错误信息经常由防火墙的配置错误引起。
+ 如果 <command>ipfw</command> 在内核中启用了但是没有定义规则,
+ 那么默认的规则就是拒绝所有通讯,甚至 ping 请求!
+ 查阅 <xref linkend="firewalls"> 以了解更多信息。</para>
+
+ <para>有时网卡性能低下或者低于平均水平,
+ 这种情况最好把传输媒介模式从 <literal>autoselect</literal>
+ 改变为正确的传输介质模式。
+ 这通常对大多数硬件有用, 但可能不会解决所有人的问题。
+ 接着,检查所有网络设置,并且阅读 &man.tuning.7; 手册页。</para>
+
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="configtuning-virtual-hosts">
+ <title>虚拟主机</title>
+
+ <indexterm><primary>虚拟主机</primary></indexterm>
+ <indexterm><primary>IP 别名</primary></indexterm>
+
+ <para> &os; 的一个很普通的用途是虚拟主机站点,
+ 一个服务器虚拟成很多服务器一样提供网络服务。
+ 这通过在一个接口上绑定多个网络地址来实现。</para>
+
+ <para>一个特定的网络接口有一个<quote>真实</quote>的地址,
+ 也可能有一些<quote>别名</quote>地址。这些别名通常用
+ <filename>/etc/rc.conf</filename> 中的记录来添加。</para>
+
+ <para>一个 <devicename>fxp0</devicename> 的别名记录类似于:</para>
+
+<programlisting>ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"</programlisting>
+
+ <para>
+ 记住别名记录必须从 <literal>alias0</literal>
+ 开始并且按顺序递增(例如 <literal>_alias1</literal>、
+ <literal>_alias2</literal>)。
+ 配置程序将会停止在第一个缺少的数字的地方。</para>
+
+ <para>
+ 计算别名的子网掩码是很重要的,幸运的是它很简单。
+ 对于一个接口来说,必须有一个描述子网掩码的地址。
+ 任何在这个网段下的地址必须有一个全是 <literal>1</literal>
+ 的子网掩码(通常表示为
+ <hostid role="netmask">255.255.255.255</hostid> 或
+ <hostid role="netmask">0xffffffff</hostid>。</para>
+
+ <para>例如,假设 <devicename>fxp0</devicename> 连接到两个网段,
+ 子网掩码是 <hostid role="netmask">255.255.255.0</hostid> 的
+ <hostid role="ipaddr">10.1.1.0</hostid> 和子网掩码是
+ <hostid role="netmask">255.255.255.240</hostid> 的
+ <hostid role="ipaddr">202.0.75.16</hostid>。我们将要系统使用从
+ <hostid role="ipaddr">10.1.1.1</hostid> 到
+ <hostid role="ipaddr">10.1.1.5</hostid> 和从
+ <hostid role="ipaddr">202.0.75.17</hostid> 到
+ <hostid role="ipaddr">202.0.75.20</hostid> 的地址)。
+ 如前面说明的那样, 只有给定网络范围内的第一个地址 (在这个例子中,
+ <hostid role="ipaddr">10.0.1.1</hostid> 和
+ <hostid role="ipaddr">202.0.75.17</hostid>) 需要有实际的子网掩码;
+ 所有其它地址 (<hostid role="ipaddr">10.1.1.2</hostid>
+ 到 <hostid role="ipaddr">10.1.1.5</hostid> 以及
+ <hostid role="ipaddr">202.0.75.18</hostid> 到
+ <hostid role="ipaddr">202.0.75.20</hostid>) 必须配置为使用掩码
+ <hostid role="netmask">255.255.255.255</hostid>。</para>
+
+ <para>下面的记录会正确的设置这个适配器:</para>
+
+<programlisting> ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
+ ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
+ ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
+ ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
+ ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
+ ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
+ ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
+ ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
+ ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"</programlisting>
+
+ </sect1>
+
+ <sect1 id="configtuning-configfiles">
+ <title>配置文件</title>
+
+ <sect2>
+ <title><filename>/etc</filename> 布局</title>
+ <para>在配置信息中有很多的目录,这些包括:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="2*">
+
+ <tbody>
+ <row>
+ <entry><filename>/etc</filename></entry>
+ <entry>一般的系统配置信息。这儿的数据是与特定系统相关的。</entry>
+ </row>
+ <row>
+ <entry><filename>/etc/defaults</filename></entry>
+ <entry>系统配置文件的默认版本。</entry>
+ </row>
+ <row>
+ <entry><filename>/etc/mail</filename></entry>
+ <entry>额外的 &man.sendmail.8; 配置信息,其他 MTA 配置文件。
+ </entry>
+ </row>
+ <row>
+ <entry><filename>/etc/ppp</filename></entry>
+ <entry>用于用户级和内核级 ppp 程序的配置。
+ </entry>
+ </row>
+ <row>
+ <entry><filename>/etc/namedb</filename></entry>
+ <entry>&man.named.8; 数据的默认位置。通常 <filename>named.conf</filename> 和区域文件存放在这里。</entry>
+ </row>
+ <row>
+ <entry><filename>/usr/local/etc</filename></entry>
+ <entry>被安装的应用程序配置文件。可以参考每个应用程序的子目录。</entry>
+ </row>
+ <row>
+ <entry><filename>/usr/local/etc/rc.d</filename></entry>
+ <entry>被安装程序的 启动/停止 脚本。</entry>
+ </row>
+ <row>
+ <entry><filename>/var/db</filename></entry>
+ <entry>特定系统自动产生的数据库文件,像 package 数据库,位置数据库等等。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2>
+ <title>主机名</title>
+
+ <indexterm><primary>主机名</primary></indexterm>
+ <indexterm><primary>DNS</primary></indexterm>
+
+ <sect3>
+ <title><filename>/etc/resolv.conf</filename></title>
+
+ <indexterm>
+ <primary><filename>resolv.conf</filename></primary>
+ </indexterm>
+
+ <para><filename>/etc/resolv.conf</filename> 指示了 &os; 如何访问域名系统(DNS)。</para>
+
+ <para><filename>resolv.conf</filename> 中最常见的记录是:
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="2*">
+
+ <tbody>
+ <row>
+ <entry><literal>nameserver</literal></entry>
+ <entry>按顺序要查询的名字服务器的 IP 地址,最多三个。</entry>
+ </row>
+ <row>
+ <entry><literal>search</literal></entry>
+ <entry>
+ 搜索机器名的列表。这通常由本地机器名的域决定。</entry>
+ </row>
+ <row>
+ <entry><literal>domain</literal></entry>
+ <entry>本地域名。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>一个典型的 <filename>resolv.conf</filename> 文件:</para>
+
+ <programlisting>search example.com
+nameserver 147.11.1.11
+nameserver 147.11.100.30</programlisting>
+
+ <note><para>只能使用一个 <literal>search</literal> 和
+ <literal>domain</literal> 选项。</para></note>
+
+ <para>如果您在使用 DHCP,&man.dhclient.8; 经常使用从 DHCP
+ 服务器接受来的信息重写 <filename>resolv.conf</filename>。</para>
+ </sect3>
+
+ <sect3>
+ <title><filename>/etc/hosts</filename></title>
+
+ <indexterm><primary>主机</primary></indexterm>
+
+ <para><filename>/etc/hosts</filename> 是 Internet
+ 早期使用的一个简单文本数据库。
+ 它结合 DNS 和 NIS 提供名字到 IP 地址的映射。
+ 通过局域网连接的机器可以用这个简单的命名方案来替代设置一个
+ &man.named.8; 服务器。另外,<filename>/etc/hosts</filename>
+ 也可以提供一个 Internet 名称的本地纪录以减轻需要从外部查询带来的负担。</para>
+
+ <programlisting># &dollar;&os;&dollar;
+#
+# Host Database
+# This file should contain the addresses and aliases
+# for local hosts that share this file.
+# In the presence of the domain name service or NIS, this file may
+# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
+#
+#
+::1 localhost localhost.my.domain myname.my.domain
+127.0.0.1 localhost localhost.my.domain myname.my.domain
+
+#
+# Imaginary network.
+#10.0.0.2 myname.my.domain myname
+#10.0.0.3 myfriend.my.domain myfriend
+#
+# According to RFC 1918, you can use the following IP networks for
+# private nets which will never be connected to the Internet:
+#
+# 10.0.0.0 - 10.255.255.255
+# 172.16.0.0 - 172.31.255.255
+# 192.168.0.0 - 192.168.255.255
+#
+# In case you want to be able to connect to the Internet, you need
+# real official assigned numbers. PLEASE PLEASE PLEASE do not try
+# to invent your own network numbers but instead get one from your
+# network provider (if any) or from the Internet Registry (ftp to
+# rs.internic.net, directory `/templates').
+#</programlisting>
+
+ <para><filename>/etc/hosts</filename> 用简单的格式:</para>
+
+ <programlisting>[Internet address] [official hostname] [alias1] [alias2] ...</programlisting>
+
+ <para>例如:</para>
+
+ <programlisting>10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2</programlisting>
+
+ <para>参考 &man.hosts.5; 以获得更多信息。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>日志文件配置</title>
+
+ <indexterm><primary>日志文件</primary></indexterm>
+
+ <sect3>
+ <title><filename>syslog.conf</filename></title>
+
+ <indexterm><primary>syslog.conf</primary></indexterm>
+
+ <para><filename>syslog.conf</filename> 是 &man.syslogd.8; 程序的配置文件。
+ 它指出了的 <command>syslog</command> 哪种信息类型被存储在特定的日志文件中。</para>
+
+ <programlisting># &dollar;&os;&dollar;
+#
+# Spaces ARE valid field separators in this file. However,
+# other *nix-like systems still insist on using tabs as field
+# separators. If you are sharing this file between systems, you
+# may want to use only tabs as field separators here.
+# Consult the syslog.conf(5) manual page.
+*.err;kern.debug;auth.notice;mail.crit /dev/console
+*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
+security.* /var/log/security
+mail.info /var/log/maillog
+lpr.info /var/log/lpd-errs
+cron.* /var/log/cron
+*.err root
+*.notice;news.err root
+*.alert root
+*.emerg *
+# uncomment this to log all writes to /dev/console to /var/log/console.log
+#console.info /var/log/console.log
+# uncomment this to enable logging of all log messages to /var/log/all.log
+#*.* /var/log/all.log
+# uncomment this to enable logging to a remote log host named loghost
+#*.* @loghost
+# uncomment these if you're running inn
+# news.crit /var/log/news/news.crit
+# news.err /var/log/news/news.err
+# news.notice /var/log/news/news.notice
+!startslip
+*.* /var/log/slip.log
+!ppp
+*.* /var/log/ppp.log</programlisting>
+
+ <para>参考 &man.syslog.conf.5; 手册页以获得更多信息</para>
+ </sect3>
+
+ <sect3>
+ <title><filename>newsyslog.conf</filename></title>
+
+ <indexterm><primary>newsyslog.conf</primary></indexterm>
+
+ <para><filename>newsyslog.conf</filename> 是一个通常用
+ &man.cron.8; 计划运行的 &man.newsyslog.8; 程序的配置文件。
+ &man.newsyslog.8; 指出了什么时候日志文件需要打包或者重新整理。
+ 比如 <filename>logfile</filename> 被移动到
+ <filename>logfile.0</filename>,<filename>logfile.0</filename>
+ 被移动到 <filename>logfile.1</filename> 等等。另外,日志文件可以用
+ &man.gzip.1; 来压缩,它们是这样的命名格式:
+ <filename>logfile.0.gz</filename>,<filename>logfile.1.gz</filename>
+ 等等。</para>
+
+ <para><filename>newsyslog.conf</filename>
+ 指出了哪个日志文件要被管理,要保留多少和它们什么时候被创建。
+ 日志文件可以在它们达到一定大小或者在特定的日期被重新整理。</para>
+
+ <programlisting># configuration file for newsyslog
+# &dollar;&os;&dollar;
+#
+# filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num]
+/var/log/cron 600 3 100 * Z
+/var/log/amd.log 644 7 100 * Z
+/var/log/kerberos.log 644 7 100 * Z
+/var/log/lpd-errs 644 7 100 * Z
+/var/log/maillog 644 7 * @T00 Z
+/var/log/sendmail.st 644 10 * 168 B
+/var/log/messages 644 5 100 * Z
+/var/log/all.log 600 7 * @T00 Z
+/var/log/slip.log 600 3 100 * Z
+/var/log/ppp.log 600 3 100 * Z
+/var/log/security 600 10 100 * Z
+/var/log/wtmp 644 3 * @01T05 B
+/var/log/daily.log 640 7 * @T00 Z
+/var/log/weekly.log 640 5 1 $W6D0 Z
+/var/log/monthly.log 640 12 * $M1D0 Z
+/var/log/console.log 640 5 100 * Z</programlisting>
+
+ <para>参考 &man.newsyslog.8; 手册页以获得更多信息。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="configtuning-sysctlconf">
+ <title><filename>sysctl.conf</filename></title>
+
+ <indexterm><primary>sysctl.conf</primary></indexterm>
+ <indexterm><primary>sysctl</primary></indexterm>
+
+ <para><filename>sysctl.conf</filename> 看起来很像
+ <filename>rc.conf</filename>。它用 <literal>variable=value</literal>
+ 的形式来设定值。指定的值在系统进入多用户模式之后被设定。
+ 并不是所有的变量都可以在这个模式下设定。</para>
+
+ <para> 一个简单的例子举明了在 <filename>sysctl.conf</filename>
+ 中关闭了重要的退出信号的日志并且让 Linux 程序知道他们其实运行在
+ &os; 下面:</para>
+
+ <programlisting>kern.logsigexit=0 # Do not log fatal signal exits (e.g. sig 11)
+compat.linux.osname=&os;
+compat.linux.osrelease=4.3-STABLE</programlisting>
+ </sect2>
+ </sect1>
+
+ <sect1 id="configtuning-sysctl">
+ <title>用 sysctl 进行调整</title>
+
+ <indexterm><primary>sysctl</primary></indexterm>
+ <indexterm>
+ <primary>调整</primary>
+ <secondary>以 sysctl</secondary>
+ </indexterm>
+
+ <para>&man.sysctl.8; 是一个允许您改变正在运行中的 &os;
+ 系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项,
+ 这可以让有经验的管理员提高引人注目的系统性能。用
+ &man.sysctl.8; 可以读取设置超过五百个系统变量。</para>
+
+ <para>基于这点,&man.sysctl.8; 提供两个功能:读取和修改系统设置。</para>
+
+ <para>查看所有可读变量:</para>
+
+ <screen>&prompt.user; <userinput>sysctl -a</userinput></screen>
+
+ <para>读一个指定的变量,例如 <varname>kern.maxproc</varname>:</para>
+
+ <screen>&prompt.user; <userinput>sysctl kern.maxproc</userinput>
+kern.maxproc: 1044</screen>
+
+ <para>要设置一个指定的变量,直接用
+ <replaceable>variable</replaceable>=<replaceable>value</replaceable>
+ 这样的语法:</para>
+
+ <screen>&prompt.root; <userinput>sysctl kern.maxfiles=5000</userinput>
+kern.maxfiles: 2088 -> 5000</screen>
+
+ <para>sysctl 变量的设置通常是字符串、数字或者布尔型。
+ (布尔型用 <literal>1</literal> 来表示'yes',用
+ <literal>0</literal> 来表示'no')。</para>
+
+ <para>If you want to set automatically some variables each time
+ the machine boots, add them to the
+ <filename>/etc/sysctl.conf</filename> file. For more information
+ see the &man.sysctl.conf.5; manual page and the
+ <xref linkend="configtuning-sysctlconf">.</para>
+
+ <sect2 id="sysctl-readonly">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ <!-- 31 January 2003 -->
+ </author>
+ </authorgroup>
+ </sect2info>
+ <title>只读的 &man.sysctl.8;</title>
+
+ <para>有时想要修改只读的 &man.sysctl.8; 的值。
+ 有时这不被推荐,有时也是不可避免的。</para>
+
+ <para>例如一些膝上型电脑的 &man.cardbus.4;
+ 设备不会探测内存范围,并且产生看似于这样的错误:</para>
+
+ <screen>cbb0: Could not map register memory
+device_probe_and_attach: cbb0 attach returned 12</screen>
+
+ <para>像上面的错误通常需要修改一些只读的 &man.sysctl.8;
+ 默认设置。要实现这点,用户可以在本地的
+ <filename>/boot/loader.conf.local</filename> 里面放一个
+ &man.sysctl.8; <quote>OIDs</quote>。那些设置定位在
+ <filename>/boot/defaults/loader.conf</filename> 文件中。</para>
+
+ <para>修复上面的问题用户需要在刚才所说的文件中设置
+ <option>hw.pci.allow_unsupported_io_range=1</option>。现在
+ &man.cardbus.4; 就会正常的工作了。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="configtuning-disk">
+ <title>调整磁盘</title>
+
+ <sect2>
+ <title>Sysctl 变量</title>
+
+ <sect3>
+ <title><varname>vfs.vmiodirenable</varname></title>
+
+ <indexterm>
+ <primary><varname>vfs.vmiodirenable</varname></primary>
+ </indexterm>
+
+ <para><varname>vfs.vmiodirenable</varname> sysctl
+ 变量可以设置成0(关)或者1(开);默认是1。
+ 这个变量控制目录是否被系统缓存。大多数目录是小的,
+ 在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小
+ (典型的是512字节)。当这个变量设置为关闭 (0) 时,
+ 缓存器仅仅缓存固定数量的目录,即使您有很大的内存。
+ 而将其开启 (设置为1) 时, 则允许缓存器用 VM
+ 页面缓存来缓存这些目录,让所有可用内存来缓存目录。
+ 不利的是最小的用来缓存目录的核心内存是大于 512
+ 字节的物理页面大小(通常是 4k)。
+ 我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。
+ 这些服务包括 web 缓存,大容量邮件系统和新闻系统。
+ 尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。
+ 但还是应该检验一下。</para>
+ </sect3>
+
+ <sect3>
+ <title><varname>vfs.write_behind</varname></title>
+
+ <indexterm>
+ <primary><varname>vfs.write_behind</varname></primary>
+ </indexterm>
+
+ <para><varname>vfs.write_behind</varname> sysctl
+ 变量默认是 <literal>1</literal> (打开)。
+ 它告诉文件系统簇被收集满的时候把内容写进介质,
+ 典型的是在写入大的连续的文件时。
+ 主要的想法是, 如果可能对 I/O 性能会产生负面影响时,
+ 应尽量避免让缓冲缓存被未同步缓冲区充满。
+ 然而它可能降低处理速度并且在某些情况下您可能想要关闭它。</para>
+ </sect3>
+
+ <sect3>
+ <title><varname>vfs.hirunningspace</varname></title>
+
+ <indexterm>
+ <primary><varname>vfs.hirunningspace</varname></primary>
+ </indexterm>
+
+ <para><varname>vfs.hirunningspace</varname> sysctl
+ 变量决定了在任何场合多少写 I/O 被排进队列以给系统的磁盘控制器。
+ 默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成
+ 4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。
+ 不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。</para>
+
+ <para>sysctl 中还有许多与 buffer cache 和 VM页面 cache
+ 有关的值, 一般不推荐修改它们。 从 &os;&nbsp;4.3
+ 开始,虚拟内存系统已经能够很好地进行自动调整了。</para>
+ </sect3>
+
+ <sect3>
+ <title><varname>vm.swap_idle_enabled</varname></title>
+
+ <indexterm>
+ <primary><varname>vm.swap_idle_enabled</varname></primary>
+ </indexterm>
+
+ <para><varname>vm.swap_idle_enabled</varname> sysctl
+ 变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。
+ 这些系统注重在空闲的内存中间产生连续压力的处理。通过
+ <varname>vm.swap_idle_threshold1</varname> 和
+ <varname>vm.swap_idle_threshold2</varname> 打开这个特性并且调整交换滞后
+ (在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页
+ (pageout)算法更快。这给出页守护进程带来了帮助。
+ 除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存,
+ 因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果,
+ 但是在大的系统上它已经做了合适的页面调度这个选项允许 VM
+ 系统容易的让全部的进程进出内存。</para>
+ </sect3>
+
+ <sect3>
+ <title><varname>hw.ata.wc</varname></title>
+
+ <indexterm>
+ <primary><varname>hw.ata.wc</varname></primary>
+ </indexterm>
+
+ <para>&os;&nbsp;4.3 IDE 写缓存关掉了。这降低了到 IDE
+ 磁盘的带宽但是保证了传进磁盘数据的严格完整性。这个问题是因为
+ IDE 驱动器当写完成的时候无所事事。IDE 写缓存打开的时候,IDE
+ 驱动器不按顺序把数据写进磁盘。当有很重的磁盘负载的时候它有时迟延写入一些块。
+ 当机或者掉电会引起严重的文件系统讹误。&os; 的默认值改变成安全的模式。
+ 不幸的是结果是带来了很大的性能损失,所以我们在发行版之后把写缓存的默认值改成了
+ on。您应该注意 <varname>hw.ata.wc</varname> sysctl 变量来检查一下系统中的默认值。
+ 如果 IDE 写缓存被关闭了,您可以通过设置内核变量为 1 来打开它。这必须在启动时通过
+ boot loader 来完成。在内核启动之后尝试这么做将会没有效果。</para>
+
+ <para>要了解更多的信息,请查阅 &man.ata.4;。</para>
+ </sect3>
+
+ <sect3>
+ <title><literal>SCSI_DELAY</literal>
+ (<varname>kern.cam.scsi_delay</varname>)</title>
+
+ <indexterm>
+ <primary><literal>SCSI_DELAY</literal></primary>
+ <secondary><varname>kern.cam.scsi_delay</varname></secondary>
+ </indexterm>
+
+ <para><literal>SCSI_DELAY</literal> 内核配置会缩短系统启动时间。
+ 默认值在系统启动过程中有 <literal>15</literal> 秒的迟延时间,
+ 这是一个足够多且可靠的值。把它减少到 <literal>5</literal>
+ 通常也能工作(特别是现代的驱动器)。新一些的 &os;
+ (5.0 或更高版本) 应该用启动时刻可调整
+ <varname>kern.cam.scsi_delay</varname>。
+ 这个可调整的和内核配置选项接受的值是
+ <emphasis>毫秒</emphasis> <emphasis>不是
+ </emphasis> <emphasis>秒</emphasis> 。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="soft-updates">
+ <title>Soft Updates</title>
+
+ <indexterm><primary>Soft Updates</primary></indexterm>
+ <indexterm><primary>tunefs</primary></indexterm>
+
+ <para>&man.tunefs.8; 程序能够用来很好的调整文件系统。
+ 这个程序有很多不同的选项,但是现在只介绍 Soft Updates
+ 的打开和关闭,这样做:</para>
+
+ <screen>&prompt.root; <userinput>tunefs -n enable /filesystem</userinput>
+&prompt.root; <userinput>tunefs -n disable /filesystem</userinput></screen>
+
+ <para>在文件系统被挂载之后不能用 &man.tunefs.8; 来修改。打开
+ Soft Updates 的最佳时机是在单用户模式下任何分区被被挂载前。</para>
+
+ <note><para>像 &os;&nbsp;4.5,在文件系统创建时也可以打开
+ Soft Updates,通过 &man.newfs.8; 的 <literal>-U</literal> 选项。</para></note>
+
+ <para>
+ Soft Updates 彻底的改善了数据描述(meta-data)的性能,
+ 主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用
+ Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates
+ 保证了崩溃后的文件系统完整性,但是很可能有几秒钟 (甚至一分钟!)
+ 之前的数据没有写到物理磁盘。如果您的系统崩溃了您可能会丢失很多工作。
+ 第二,SoftUpdates 推迟文件系统块的释放时间。如果在文件系统
+ (例如根文件系统)快满了的情况下对系统进行大规模的升级比如
+ <command>make installworld</command>,
+ 可能会引起磁盘空间不足从而造成升级失败。
+ </para>
+
+ <sect3>
+ <title>Soft Updates 的详细资料</title>
+
+ <indexterm>
+ <primary>Soft Updates</primary>
+ <secondary>详细资料</secondary>
+ </indexterm>
+
+ <para>
+ 有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。
+ (Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据)</para>
+
+ <para>
+ 从前,默认方法是同步更新这些元数据(meta-data)。
+ 如果一个目录改变了,系统在真正写到磁盘之前一直等待。
+ 文件数据缓存(文件内容)在这之后以非同步形式写入。
+ 这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data)
+ 一直处于完整状态。文件要不就被完整的创建要不根本就不创建。
+ 如果崩溃时找不到文件的数据块,&man.fsck.8;
+ 可以找到并且依靠把文件大小设置为 0 来修复文件系统。
+ 另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如
+ <command>rm -r</command> 命令,从而改变目录下的所有文件,
+ 但是每个目录的改变(删除一个文件)都要同步写入磁盘。
+ 这包含它自己更新目录,inode 表和可能对文件分散的块的更新。
+ 同样问题出现大的文件操作上(比如 <command>tar -x</command>)。</para>
+
+ <para>
+ 第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的
+ <command>mount -o async</command> 默认的方法。所有元数据更新也是通过缓存。
+ 也就是它们会混合在文件内容数据更新中。
+ 这个方法的优点是不需要等待每个元数据更新都写到磁盘上,
+ 所以所有引起元数据更新大的操作比同步方式更快。同样,
+ 这个方法也是清楚且简单的,所以代码中的漏洞风险很小。
+ 缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败
+ (例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。
+ 系统再启动时没有机会检查文件系统的状态;inode
+ 表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用
+ <command>fsck</command> 命令来清理(因为磁盘上没有所需要的信息)。
+ 如果文件系统修复后损坏了,唯一的选择是使用 &man.newfs.8; 并且从备份中恢复它。
+ </para>
+
+ <para>
+ 这个问题通常的解决办法是使用 <emphasis>dirty region logging</emphasis>
+ 或者 <emphasis>journaling</emphasis>
+ 尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。
+ 这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。
+ 过后他们将会被移动到正确的位置。因为纪录区很小,
+ 磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。
+ 另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次
+ (一次写到纪录区域,一次写到正确的区域)。正常情况下,
+ 悲观的性能可能会发生。从另一方面来讲,
+ 崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。
+ </para>
+
+ <para>Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates
+ 解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘
+ (<quote>有序的元数据更新</quote>)。这样的结果是,在繁重的元数据操作中,
+ 如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。
+ 所以所有的目录操作在写进磁盘的时候首先在内存中执行
+ (数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。
+ 如果系统崩溃了这将导致一个固定的 <quote>日志回朔</quote>:
+ 所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在
+ 30 到 60 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后,
+ 唯一的资源分配错误是一个实际是<quote>空闲</quote>的资源的资源被标记为<quote>使用</quote>。
+ &man.fsck.8; 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用
+ <command>mount -f</command> 强制挂上的文件系统的错误状态是安全的。
+ 为了释放可能没有使用的资源,&man.fsck.8; 需要在过后的时间运行。一个主意是用
+ <emphasis>后台 fsck</emphasis>:系统启动的时候只有一个文件系统的
+ <emphasis>快照</emphasis> 被记录下来。<command>fsck</command>
+ 可以在过后运行。所有文件系统可以在<quote>有错误</quote>的时候被挂接,
+ 所以系统可以在多用户模式下启动。接着,后台 <command>fsck</command>
+ 可以在所有文件系统需要的时候启动来释放可能没有使用的资源。
+ (尽管这样,不用 Soft Updates 的文件系统依然需要通常的
+ <command>fsck</command>。)
+ </para>
+
+ <para>
+ 它的优点是元数据操作几乎跟非同步一样快
+ (也就是比需要两次元数据写操作的 <emphasis>logging</emphasis>
+ 更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险)
+ 和高的内存使用量。另外它有些特点需要知道。崩溃之后,
+ 文件系统状态会<quote>落后</quote>一些。同步的方法用
+ <command>fsck</command> 后在一些地方可能产生一些零字节的文件,
+ 这些文件在用 Soft Updates 文件系统之后不会存在,
+ 因为元数据和文件内容根本没有写进磁盘(可能发生在运行
+ <command>rm</command> 之后)。这可能在文件系统上安装大量数据时候引发问题,
+ 没有足够的剩余空间来两次存储所有文件。</para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="configtuning-kernel-limits">
+ <title>调整内核限制</title>
+
+ <indexterm>
+ <primary>调整</primary>
+ <secondary>内核限制</secondary>
+ </indexterm>
+
+ <sect2 id="file-process-limits">
+ <title>文件/进程限制</title>
+
+ <sect3 id="kern-maxfiles">
+ <title><varname>kern.maxfiles</varname></title>
+
+ <indexterm>
+ <primary><varname>kern.maxfiles</varname></primary>
+ </indexterm>
+
+ <para><varname>kern.maxfiles</varname> 可以根据系统的需求加大或者减小。
+ 这个变量指出了在系统上文件描述符的最大数量。当文件描述符表曼的时候,
+ 用 <command>dmesg</command> 命令可以看到
+ <errorname>file: table is full</errorname>
+ 将会在系统信息缓存里反复的出现。</para>
+
+ <para>每个打开的文件、套接字、fifo 都使用一个描述符。
+ 一个大规模的服务器很容易使用上千个文件描述符,
+ 这取决于系统中同时运行着的服务的数量和类型。</para>
+
+ <para>
+ <varname>kern.maxfile</varname> 的默认值以系统配置文件中的
+ <option>MAXUSERS</option> 选项来决定。<varname>kern.maxfiles</varname>
+ 同 <option>MAXUSERS</option> 的值成比例的增长。编译一个自定义内核的时候,
+ 按照您系统中用户的数量来设置这个值是个好主意。
+ 从这个数字可以确定内核很多先前定义的限制。即使一台机器不会真有
+ 256 个用户同时连接,所需要的资源也可能跟一个高负荷的 web
+ 服务器差不多。
+ </para>
+
+ <note><para>像是 &os;&nbsp;4.5,在您的内核配置中设置
+ <option>MAXUSERS</option> 为会通过系统中内存的数量来选择一个合适的值。</para></note>
+
+ </sect3>
+
+ <sect3>
+ <title><varname>kern.ipc.somaxconn</varname></title>
+
+ <indexterm>
+ <primary><varname>kern.ipc.somaxconn</varname></primary>
+ </indexterm>
+
+ <para><varname>kern.ipc.somaxconn</varname> sysctl 变量
+ 限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载
+ web服务环境来说,默认的 <literal>128</literal> 太小了。
+ 大多数环境这个值建议增加到 <literal>1024</literal> 或者更多。
+ 服务进程会自己限制侦听队列的大小(例如 &man.sendmail.8;
+ 或者 <application>Apache</application>),
+ 常常在它们的配置文件中有设置队列大小的选项。
+ 大的侦听队列对防止拒绝服务 <abbrev>DoS</abbrev> 攻击也会有所帮助。</para>
+ </sect3>
+
+ </sect2>
+ <sect2>
+ <title>网络限制</title>
+
+ <para><literal>NMBCLUSTERS</literal> 内核配置选项指出了系统可用的网络Mbuf的数量。
+ 一个高流量的服务器使用一个小数目的网络缓存会影响 &os; 的性能。
+ 每个 cluster 可能需要2K内存,所以一个1024的值需要在内核中给网络缓存保留2M内存。
+ 可以用简单的方法计算出来需要多少网络缓存。
+ 如果您有一个同时发生1000个以上连接的web服务器,
+ 并且每个连接用掉16K接收和发送缓存, 就需要大概32M网络缓存来确保web服务器的工作。
+ 一个好的简单计算方法是乘以2,所以2x32Mb/2Kb=64MB/2kb=32768。
+ 我们建议在有大量内存的机器上把这个值设置在4096到32768之间。
+ 没有必要把它设置成任意太高的值,它会在启动时引起崩溃。
+ &man.netstat.1; 的 <option>-m</option> 选项可以用来观察网络cluster使用情况。</para>
+
+ <para><varname>kern.ipc.nmbclusters</varname> 可以用来在启动时刻调节这个。
+ 仅仅在旧版本的 &os; 需要使用 <literal>NMBCLUSTERS</literal>
+ &man.config.8; 选项。</para>
+
+ <para>经常使用 &man.sendfile.2; 系统调用的繁忙的服务器,
+ 有必要通过 <literal>NSFBUFS</literal> 内核选项或者在
+ <filename>/boot/loader.conf</filename> (查看 &man.loader.8; 以获得更多细节)
+ 中设置它的值来调节 &man.sendfile.2; 缓存数量。
+ 这个参数需要调节的普通原因是在进程中看到 <literal>sfbufa</literal>
+ 状态。sysctl <varname>kern.ipc.nsfbufs</varname>
+ 变量在内核配置变量中是只读的。 这个参数是由 <varname>kern.maxusers</varname>
+ 决定的,然而它可能有必有因此而调整。</para>
+
+ <important>
+ <para>
+ 即使一个套接字被标记成非阻塞,在这个非阻塞的套接字上呼叫
+ &man.sendfile.2; 可能导致 &man.sendfile.2; 呼叫阻塞直到有足够的
+ <literal>struct sf_buf</literal> 可用。
+ </para>
+ </important>
+
+ <sect3>
+ <title><varname>net.inet.ip.portrange.*</varname></title>
+
+ <indexterm>
+ <primary>net.inet.ip.portrange.*</primary>
+ </indexterm>
+
+ <para><varname>net.inet.ip.portrange.*</varname> sysctl
+ 变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。
+ 这里有三个范围:一个低端范围,一个默认范围和一个高端范围。
+ 大多数网络程序分别使用由 <varname>net.inet.ip.portrange.first</varname>
+ 和 <varname>net.inet.ip.portrange.last</varname> 控制的从 1024 到 5000
+ 的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口,
+ 这经常发生在运行一个高负荷 web 代理服务器的时候。
+ 这个端口范围不是用来限制主要的例如 web
+ 服务器进入连接或者有固定端口例如邮件传递对外连接的。
+ 有时您可能用完了端口,那就建议适当的增加
+ <varname>net.inet.ip.portrange.last</varname>。
+ <literal>10000</literal>、<literal>20000</literal> 或者
+ <literal>30000</literal> 可能是适当的值。
+ 更改端口范围的时候也要考虑到防火墙。一些防火墙会阻止端口的大部分范围
+ (通常是低范围的端口)并且用高端口进行对外连接(&mdash;)。
+ 基于这个问题建议把 <varname>net.inet.ip.portrange.first</varname>
+ 设置的小一点。</para>
+ </sect3>
+
+ <sect3>
+ <title>TCP 带宽迟延(Bandwidth Delay Product)</title>
+
+ <indexterm>
+ <primary>TCP 带宽迟延限制</primary>
+ <secondary><varname>net.inet.tcp.inflight_enable</varname></secondary>
+ </indexterm>
+
+ <para>The TCP Bandwidth Delay Product Limiting 类似于 NetBSD 的TCP/Vegas。
+ 它可以通过设置 <varname>net.inet.tcp.inflight_enable</varname> sysctl
+ 变量为 <literal>1</literal> 来启动。
+ 系统将会为每个连接尝试带宽迟延并且限制发送到网络中的队列中的数据数量以维持适当的吞吐量。</para>
+
+ <para>
+ 如果您在使用调制解调器,千兆以太网或者高速的广域网连接
+ (或者其他有高的带宽迟延的产品)提供数据服务,这个特性就会很有用。
+ 特别是您在使用窗口缩放或者配置一个大的发送窗口。如果启用了这个选项,
+ 同时要确信设置 <varname>net.inet.tcp.inflight_debug</varname> 为
+ <literal>0</literal>(关闭调试),对于生产用来说,设置
+ <varname>net.inet.tcp.inflight_min</varname> 至少为
+ <literal>6144</literal> 可能会受益。然而,
+ 注意设置一个高的最小值能有效的关闭依赖连接的带宽限制。
+ 这个限制特性减少了在路由和交换包队列的堵塞数据数量,
+ 也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、
+ 交互式连接,尤其是通过慢速的调制解调器,也能用低的
+ <emphasis>往返时间</emphasis>操作。但是,注意这只影响到数据发送
+ (上载/服务端)。对数据接收(下载)没有效果。</para>
+
+ <para>调整 <varname>net.inet.tcp.inflight_stab</varname>
+ 是 <emphasis>不</emphasis> 被建议的。这个参数的默认值是 20,
+ 它代表两个最大的包被添加到带宽迟延窗口考虑。
+ 另外的窗口是稳定算法和改善改变条件时的应答所需要的,
+ 但是它也能导致通过慢速连接产生高的 ping 时间(虽然比您不用这个算法还慢)。
+ 这些情况下,您可能想试着把这个参数减小到 15,10 或者 5;
+ 并且也可能需要减小 <varname>net.inet.tcp.inflight_min</varname>
+ (例如3500)来达到效果。减少这些参数应该是最后的唯一手段。</para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="adding-swap-space">
+ <title>添加交换空间</title>
+
+ <para>
+ 不管您计划的如何好,有时候系统并不像您所期待的那样运行。
+ 如果您发现需要更多的交换空间,添加它很简单。
+ 有三种方法增加交换空间:添加一块新的硬盘驱动器、通过
+ NFS 使用交换空间和在一个现有的分区上创建一个交换文件。</para>
+
+ <sect2 id="new-drive-swap">
+ <title>在新的硬盘驱动器上使用交换空间</title>
+
+ <para>这是添加交换空间最好的方法,
+ 当然为了达到这个目的需要添加一块硬盘。
+ 毕竟您总是可以使用另一块磁盘。如果能这么做,
+ 重新阅读一下手册中关于交换空间的 <xref
+ linkend="configtuning-initial"> 来了解如何最优地安排交换空间。</para>
+ </sect2>
+
+ <sect2 id="nfs-swap">
+ <title>通过 NFS 交换</title>
+
+ <para>
+ 通过 NFS 来交换只在您没有本地硬盘交换的时候被建议。在
+ &os; 4.X 以前的版本中使用NFS交换速度很慢并且效率低下。4.0-RELEASE
+ 和更新的版本中他的速度和效率还是可以接受的。即使使用新版本的
+ &os;,NFS 交换也会被可用的网络带宽限制并且增加 NFS 服务器的负担。</para>
+ </sect2>
+
+ <sect2 id="create-swapfile">
+ <title>交换文件</title>
+
+ <para>
+ 您可以创建一个指定大小的文件用来当作交换文件。
+ 在我们的例子中我们将会使用叫做 <filename>/usr/swap0</filename>
+ 的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。</para>
+
+ <example>
+ <title>在 &os; 4.X 上创建一个交换文件</title>
+
+ <orderedlist>
+ <listitem>
+ <para>确认您的内核配置包含了 vnode 驱动。
+ 它不包含在最近版本的 <filename>GENERIC</filename>。</para>
+
+ <programlisting>pseudo-device vn 1 #Vnode driver (turns a file into a device)</programlisting>
+ </listitem>
+
+ <listitem>
+ <para>创建一个 vn-device 设备:</para>
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>sh MAKEDEV vn0</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>创建一个交换文件 (<filename>/usr/swap0</filename>):</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=/usr/swap0 bs=1024k count=64</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>赋予它(<filename>/usr/swap0</filename>)一个适当的权限:</para>
+
+ <screen>&prompt.root; <userinput>chmod 0600 /usr/swap0</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>在 <filename>/etc/rc.conf</filename> 中启用交换文件:</para>
+
+ <programlisting>swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.</programlisting>
+ </listitem>
+
+ <listitem>
+
+ <para>通过重新启动机器或下面的命令使交换文件立刻生效:</para>
+
+ <screen>&prompt.root; <userinput>vnconfig -e /dev/vn0b /usr/swap0 swap</userinput></screen>
+ </listitem>
+ </orderedlist>
+
+ </example>
+ <example>
+ <title>在 &os; 5.X 上创建一个交换文件:</title>
+
+ <orderedlist>
+ <listitem>
+ <para>确认您的内核配置包含虚拟磁盘(Memory disk)驱动
+ (&man.md.4;)。它在 <filename>GENERIC</filename> 内核中是默认的。</para>
+
+ <programlisting>device md # Memory "disks"</programlisting>
+ </listitem>
+
+ <listitem>
+ <para>创建一个交换文件(<filename>/usr/swap0</filename>):</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=/usr/swap0 bs=1024k count=64</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>赋予它(<filename>/usr/swap0</filename>)一个适当的权限:</para>
+
+ <screen>&prompt.root; <userinput>chmod 0600 /usr/swap0</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>在 <filename>/etc/rc.conf</filename> 中启用交换文件:</para>
+
+ <programlisting>swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.</programlisting>
+ </listitem>
+
+ <listitem>
+
+ <para>通过重新启动机器或下面的命令使交换文件立刻生效:</para>
+
+ <screen>&prompt.root; <userinput>mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0</userinput></screen>
+ </listitem>
+ </orderedlist>
+
+ </example>
+ </sect2>
+ </sect1>
+
+ <sect1 id="acpi-overview">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Hiten</firstname>
+ <surname>Pandya</surname>
+ <contrib>Written by </contrib>
+ </author>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>电源和资源管理</title>
+
+ <para>
+ 以有效的方式利用硬件资源是非常重要的。在提出 <acronym>ACPI</acronym>
+ 之前,管理电源使用和系统散热对操作系统是很困难的。硬件被嵌入的
+ <acronym>BIOS</acronym> 接口管理,例如<emphasis>可插拔 BIOS
+ (PNPBIOS)</emphasis>或者<emphasis>高级电源管理(APM)</emphasis>
+ 等等。电源和资源管理是现代操作系统的关键组成部分。
+ 例如您可能当系统温度过高的时候让您的操作系统能监视到
+ (并且可能提醒您)。
+ </para>
+
+ <para>
+ 在 &os; 使用手册的这一章节,我们将提供 <acronym>ACPI</acronym>
+ 全面的信息。参考资料会在末尾。<acronym>ACPI</acronym> 在
+ &os; 5.X 及以上的操作系统中作为一个默认的内核模块被支持。对于
+ &os; 4.9,<acronym>ACPI</acronym> 可以通过在内核配置文件中添加
+ <literal>device acpica</literal> 并且重新编译内核来启用。
+ </para>
+
+ <sect2 id="acpi-intro">
+ <title>什么是 ACPI?</title>
+
+ <para>高级配置和电源接口(<acronym>ACPI</acronym>)
+ 是一个业界标准的硬件资源和电源管理接口(因此而得名)。它是
+ <emphasis>操作系统控制的配置和电源管理(Operating System-directed
+ configuration and Power Management)</emphasis>,也就是说,
+ 它给操作系统(<acronym>OS</acronym>)提供了更多的控制和弹性。
+ 现代操作系统<quote>延伸</quote>了当前即插即用接口(像是 &os;4.X
+ 中使用的 APM)的限制,在 <acronym>ACPI</acronym> 的介绍之前。
+ <acronym>ACPI</acronym> 是 <acronym>APM(高级电源管理)</acronym>
+ 的直接继承者。</para>
+ </sect2>
+
+ <sect2 id="acpi-old-spec">
+ <title>高级电源管理 (APM) 的缺点</title>
+
+ <para><emphasis>高级电源管理 (APM)</emphasis>
+ 是一种基于系统目前的活动控制其电源使用的机制。
+ APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。
+ 在 OS 中的 APM 驱动作为中介来访问 <emphasis>APM 软件接口</emphasis>,
+ 从而实现对电源使用的管理。</para>
+
+ <para>APM 有四个主要的问题。 首先, 电源管理是通过
+ (制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。
+ 例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值,
+ 当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度,
+ 而不会征求 OS 的同意。 第二, APM 逻辑是嵌入
+ BIOS 的, 因此它是在 OS 的控制之外运转的。
+ 这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS
+ 才能够解决某些问题; 而这是一个很危险的操作, 一旦失败,
+ 则可能使系统进入一个无法恢复的状态。 第三, APM
+ 是一种制造商专属的技术, 也就是说有很多第三方的
+ (重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有,
+ 也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM
+ BIOS 没有为实现复杂的电源策略提供足够的余地,
+ 也无法实现能够非常适合具体机器的策略。</para>
+
+ <para><emphasis>即插即用 BIOS (PNPBIOS)</emphasis>
+ 在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术,
+ 因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法
+ <quote>接口</quote>。</para>
+
+ <para>&os; <acronym>APM</acronym> 驱动在 &man.apm.4; 手册页中有描述。</para>
+ </sect2>
+
+ <sect2 id="acpi-config">
+ <title>配置 <acronym>ACPI</acronym></title>
+
+ <para><filename>acpi.ko</filename> 驱动默认的在启动时通过
+ &man.loader.8; 被加载并且 <emphasis>不应该</emphasis>
+ 被编译进内核。原因是这个模块跟系统很容易的工作在一起,比方说不用为了
+ <filename>acpi.ko</filename> 而重新编译内核。
+ 这对更简单的测试来说很有利。另一个原因是系统启动后再启动
+ <acronym>ACPI</acronym> 不是很有用,并且在一些情况下会失败。
+ 拿不准的话只要全部禁止 <acronym>ACPI</acronym> 即可。
+ 这个驱动不应该而且不能被卸载,因为系统通过它跟各种各样的硬件打交道。
+ <acronym>ACPI</acronym> 可以通过 &man.acpiconf.8; 来禁止。实际上通过
+ <acronym>ACPI</acronym> 的交互可以通过 &man.acpiconf.8; 来完成。
+ 简单的说,如果任何关于 <acronym>ACPI</acronym> 的信息在
+ &man.dmesg.8; 的输出中,那么它很可能已经运行了。</para>
+
+ <note><para><acronym>ACPI</acronym> 和 <acronym>APM</acronym>
+ 不能共存并且应该份开始用。后来装载的如果注意到另一个在运行将会终止执行。</para></note>
+
+ <para>最简单的表现形式是,<acronym>ACPI</acronym> 可以通过
+ &man.acpiconf.8; 的 <option>-s</option> 标志和一个
+ <literal>1-5</literal> 的选项来使系统进入休眠状态。
+ <literal>5</literal> 选项将会像下面动作一样让系统软关机:</para>
+
+ <screen>&prompt.root; <userinput>halt -p</userinput></screen>
+
+ <para>其他选项也是可行的。查看 &man.acpiconf.8; 手册页以获得更多信息。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="ACPI-debug">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Nate</firstname>
+ <surname>Lawson</surname>
+ <contrib>撰写人:</contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Peter</firstname>
+ <surname>Schultz</surname>
+ <contrib>协力:</contrib>
+ </author>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>使用和调试 &os; <acronym>ACPI</acronym></title>
+
+ <para><acronym>ACPI</acronym> 是在本质上是一种发现设备、管理电源使用,
+ 提供过去由 <acronym>BIOS</acronym> 管理的访问不同硬件的标准化方法。
+ 让 <acronym>ACPI</acronym> 在各种系统上都能正确使用的工作一直在进行,
+ 但许多主板的 <firstterm><acronym>ACPI</acronym> 机器语言</firstterm>
+ (<acronym>AML</acronym>) 字节代码中的 bug, &os; 的内核中资系统设计的不完善,
+ 以及 Intel <acronym>ACPI-CA</acronym> 解释器中的 bug 仍然市场会出现。</para>
+
+ <para>这份文档期望能够帮助您协助 &os;
+ <acronym>ACPI</acronym> 的维护人员来找到您所观察到的问题的根源,
+ 并通过调试找到其解决方法。 感谢您阅读这份文档,
+ 我们也希望能够解决您的系统上的问题。</para>
+
+ <sect2 id="ACPI-submitdebug">
+ <title>提交调试信息</title>
+
+ <note>
+ <para>在提交问题之前, 请确认您已经在运行最新的
+ <acronym>BIOS</acronym> 版本, 此外, 也包括嵌入式控制器的固件版本。</para>
+ </note>
+
+ <para>如果您希望提交一个问题,
+ 请确保将下述信息法到
+ <ulink url="mailto:freebsd-acpi@FreeBSD.org">
+ freebsd-acpi@FreeBSD.org</ulink></para>
+
+ <itemizedlist>
+ <listitem>
+ <para>问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。
+ 另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。</para>
+ </listitem>
+
+ <listitem>
+ <para>在 <quote>boot
+ <option>-v</option></quote>之后得到的 dmesg 输出, 包括任何在重现 bug
+ 之后出现的错误信息。</para>
+ </listitem>
+
+ <listitem>
+ <para>在禁用了 <acronym>ACPI</acronym> 之后的 <quote>boot
+ <option>-v</option></quote> 的 dmesg 输出, 如果您发现禁用 ACPI
+ 能够帮助消除问题。</para>
+ </listitem>
+
+ <listitem>
+ <para>来自 <quote>sysctl hw.acpi</quote> 的输出。 这也是找到您的系统所提供的功能的一种好办法。</para>
+ </listitem>
+
+ <listitem>
+ <para>能够得到您的 <firstterm><acronym>ACPI</acronym> Source Language</firstterm>
+ (<acronym>ASL</acronym>) 的 <acronym>URL</acronym>。
+ <emphasis>不要</emphasis> 把
+ <acronym>ASL</acronym> 直接发到邮件列表中,
+ 因为它们可能非常大。
+ 为了得到 <acronym>ASL</acronym>
+ 您可以运行这个命令:</para>
+
+ <screen>&prompt.root; <userinput>acpidump -t -d &gt; <replaceable>name</replaceable>-<replaceable>system</replaceable>.asl</userinput></screen>
+
+ <para>(把
+ <replaceable>name</replaceable> 改为您的登录名,
+ 并把
+ <replaceable>system</replaceable> 改为您的硬件制造商及其型号。 例如:
+ <filename>njl-FooCo6000.asl</filename>)</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>许多开发者也会订阅 &a.current;
+ 但还是请发到 &a.acpi.name; 这样它会被更多人看到。
+ 请耐心等待, 因为我们都有全职的其他工作。
+ 如果您的 bug 不是显而易见的, 我们可能会要求您通过
+ &man.send-pr.1; 来提交一个 <acronym>PR</acronym>。
+ 在输入 <acronym>PR</acronym> 时,请将同样的信息包含进去。
+ 这将帮助我们来追踪和解决问题。
+ 不要在给 &a.acpi.name; 写信之前发送
+ <acronym>PR</acronym> 因为我们把它当作已知文体的备忘录而不是报告机制。
+ 您的问题很可能已经被其他人报告过了。</para>
+ </sect2>
+
+ <sect2 id="ACPI-background">
+ <title>背景</title>
+
+ <para><acronym>ACPI</acronym> 存在于采用
+ ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。
+ 完整的标准具有大量的各式功能, 包括
+ <acronym>CPU</acronym> 性能管理、 电源控制、 温度监控、
+ 电池系统、 嵌入式控制器以及总线枚举。
+ 绝大多数系统实现比完整标准的功能要少一些。 例如,
+ 桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。
+ 笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。</para>
+
+ <para>符合 <acronym>ACPI</acronym> 的系统中有许多组件。
+ <acronym>BIOS</acronym> 和芯片组制造商提供一些固定的表
+ (例如, <acronym>FADT</acronym>) 在存储器中, 以提供类似
+ <acronym>APIC</acronym> 映射 (用于 <acronym>SMP</acronym>)、
+ 配置寄存器、 以及简单的配置值等等。 另外,
+ 一个字节代码 (bytecode) 表
+ (<firstterm>系统区别描述表</firstterm>
+ <acronym>DSDT</acronym>)
+ 则提供了通过树状命名空间来指定设备及其功能的方法。</para>
+
+ <para><acronym>ACPI</acronym> 驱动必须要处理固定表,
+ 实现字节码解释器, 并修改驱动程序和内核, 以接受来自
+ <acronym>ACPI</acronym> 子系统的信息。 对于 &os;, Intel
+ 提供了一个解释器 (<acronym>ACPI-CA</acronym>),
+ 它在 Linux 和 NetBSD 也可以使用。
+ <acronym>ACPI-CA</acronym> 源代码可以在
+ <filename role="directory">src/sys/contrib/dev/acpica</filename>
+ 找到。 用于在 &os; 中允许 <acronym>ACPI-CA</acronym>
+ 正确运转的代码则在
+ <filename>src/sys/dev/acpica/Osd</filename>。
+ 最后, 用于实现 <acronym>ACPI</acronym> 设备的驱动可以在
+ <filename role="directory">src/sys/dev/acpica</filename> 找到。</para>
+ </sect2>
+
+ <sect2 id="ACPI-comprob">
+ <title>常见问题</title>
+
+ <para>为了使 <acronym>ACPI</acronym> 正常工作,
+ 它的每一部分都必须工作正常。 这里是一些常见的问题,
+ 按照出现的频繁程度顺序排序, 并提供了一些绕过或修正它们的方法。</para>
+
+ <sect3>
+ <title>休眠/唤醒</title>
+
+ <para><acronym>ACPI</acronym> 提供了三种休眠到
+ <acronym>RAM</acronym> (<acronym>STR</acronym>) 的状态,
+ <literal>S1</literal>-<literal>S3</literal>,
+ 以及一个休眠到磁盘的状态 (<literal>STD</literal>),
+ 称作 <literal>S4</literal>。 <literal>S5</literal> 是
+ <quote>软关机</quote> 同时也是系统接好电源但没有开机时的正常状态。
+ <literal>S4</literal> 实际上可以用两种不同的方法来实现。
+ <literal>S4</literal><acronym>BIOS</acronym> 是一种由
+ <acronym>BIOS</acronym> 辅助的挂起到磁盘方法, 而
+ <literal>S4</literal><acronym>OS</acronym>
+ 则是完全由操作系统实现的。</para>
+
+ <para>可以使用 <command>sysctl</command>
+ <option>hw.acpi</option> 来查看与休眠有关的项目。
+ 这里是我的 Thinkpad 上得到的结果。</para>
+
+ <screen>hw.acpi.supported_sleep_state: S3 S4 S5</screen>
+ <screen>hw.acpi.s4bios: 0</screen>
+
+ <para>这表示我可以使用 <command>acpiconf -s</command>
+ 来测试 <literal>S3</literal>,
+ <literal>S4</literal><acronym>OS</acronym>, 以及
+ <literal>S5</literal>。 如果 <option>s4bios</option> 是一
+ (<literal>1</literal>), 则可以使用
+ <literal>S4</literal><acronym>BIOS</acronym>
+ 来代替 <literal>S4</literal>
+ <acronym>OS</acronym>。</para>
+
+ <para>当测试休眠/唤醒时, 从
+ <literal>S1</literal> 开始, 如果它被支持的话。
+ 这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。
+ 没有人实现 <literal>S2</literal> 但如果您有它的支持,
+ 则应该和 <literal>S1</literal> 类似。 下一件值得尝试的是
+ <literal>S3</literal>。 这是最深的
+ <acronym>STR</acronym> 状态,
+ 并需要一系列驱动的支持才能够正常地重新初始化您的硬件。
+ 如果您在唤醒系统时遇到问题, 请不要吝惜发邮件给 &a.acpi.name;
+ 邮件列表, 尽管不要指望问题一定会很快解决,
+ 因为有许多驱动程序/硬件需要进行更多的测试和改进。</para>
+
+ <para>为了帮助隔离问题, 请在内核中删去尽可能多的驱动。
+ 如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。
+ 通常预编译的驱动程序如
+ <filename>nvidia.ko</filename>、 <application>X11</application>
+ 显示驱动, 以及 <acronym>USB</acronym> 的问题最多,
+ 而以太网卡的驱动则通常工作的很好。
+ 如果您能够通过加载和卸载驱动使系统正常工作,
+ 您可以通过将适当的命令放到
+ <filename>/etc/rc.suspend</filename> 和
+ <filename>/etc/rc.resume</filename> 来将这个过程自动化。
+ 在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。
+ 另外您还可以将 <option>hw.acpi.reset_video</option> 设置为零
+ (0), 如果您的显示在唤醒之后显得很混乱。
+ 此外您还可以尝试更长或更短的
+ <option>hw.acpi.sleep_delay</option> 值看看是否有所助益。</para>
+
+ <para>另一件值得一试的事情是使用一个比较新的包含
+ <acronym>ACPI</acronym> 支持的 Linux 发行版来试试看他们的
+ 休眠/唤醒 功能是否在同样的硬件上能够正常工作。
+ 如果在 Linux 下正常, 则很可能是 &os; 驱动程序的问题,
+ 而隔离问题并找到存在问题的驱动有助于解决它。
+ 需要注意的是 <acronym>ACPI</acronym> 的维护人员通常并不维护其他驱动
+ (例如 声音、 <acronym>ATA</acronym>, 等等)
+ 因此如果最终发现是驱动的问题最好还是发到
+ &a.current.name; 邮件列表并发给驱动程序的维护者。
+ 如果您喜欢冒险, 则可以加一些 &man.printf.3;
+ 到有问题的驱动中, 以找到它的恢复功能发生问题的位置。</para>
+
+ <para>最后, 试试看禁用 <acronym>ACPI</acronym>
+ 并代之以启用 <acronym>APM</acronym>。
+ 如果 休眠/唤醒 能够在 <acronym>APM</acronym> 下正常工作,
+ 使用 <acronym>APM</acronym> 可能会更好,
+ 特别是对于较老的硬件 (2000年以前)。
+ 硬件制造商需要一些时间来让老硬件的
+ <acronym>ACPI</acronym> 工作正常,
+ 而 <acronym>ACPI</acronym> 的问题十之八九是
+ <acronym>BIOS</acronym> 中的毛病引发的。</para>
+ </sect3>
+
+ <sect3>
+ <title>系统停止响应 (暂时或永久性地)</title>
+
+ <para>绝大多数系统停止响应是由于未能及时响应中断或发生了中断风暴导致的。
+ 芯片组有很多问题最终会溯源到 <acronym>BIOS</acronym>
+ 如何在引导系统之前配置中断, <acronym>APIC</acronym>
+ (<acronym>MADT</acronym>) 表的正确性, 以及
+ <firstterm>系统控制中断</firstterm>
+ (<acronym>SCI</acronym>) 如何路由。</para>
+
+ <para>通过察看 <command>vmstat -i</command>
+ 的输出中包括 <literal>acpi0</literal>
+ 的那一行可以区分中断风暴和未能及时响应中断。
+ 如果每秒计数器增长的速度多于一两个,
+ 则您是遇到了中断风暴。 如果系统停止了响应,
+ 您可以尝试停止内核并进入 <acronym>DDB</acronym>
+ (在控制台上按 <keycombo action="simul"><keycap>CTRL</keycap>
+ <keycap>ALT</keycap><keycap>ESC</keycap></keycombo>)
+ 并输入 <option>show interrupts</option>。</para>
+
+ <para>处理中断问题的救命稻草是尝试禁用
+ <acronym>APIC</acronym> 支持, 这是通过在
+ <filename>loader.conf</filename> 中加入
+ <literal>hint.apic.0.disabled="1"</literal>
+ 完成的。</para>
+ </sect3>
+
+ <sect3>
+ <title>崩溃</title>
+
+ <para>崩溃对于 <acronym>ACPI</acronym> 是比较罕见的情况,
+ 如果发现, 将会非常重视并很快修复。
+ 您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话)
+ 的操作并获取一份调用队战。 请启用
+ <option>options DDB</option> 并设置串行控制台
+ (参见 <xref linkend="serialconsole-ddb">)
+ 或配置一个 &man.dump.8; 分区。 您将在
+ <acronym>DDB</acronym> 中通过 <option>tr</option>
+ 得到调用队战。 如果您只能用手抄的方法记录它,
+ 一定要记下头五 (5) 行和最后五 (5) 行。</para>
+
+ <para>然后, 尝试通过在启动时禁用
+ <acronym>ACPI</acronym> 来隔离故障。 如果这样做能够正常工作,
+ 请通过设置 <option>debug.acpi.disable</option>
+ 的那组数值来隔离具体是哪个 <acronym>ACPI</acronym>
+ 子系统的问题。 请参见
+ &man.acpi.4; 联机手册中给出的那些例子。</para>
+ </sect3>
+
+ <sect3>
+ <title>系统在休眠或关机之后又启动了</title>
+ <para>首先请尝试在 &man.loader.conf.5; 中设置
+ <option>hw.acpi.disable_on_poweroff=</option><quote>0</quote>。
+ 这将让 <acronym>ACPI</acronym> 不再在关机过程中禁用一些事件。
+ 基于同样的原因, 一些系统需要把这个值设置为 <quote>1</quote>
+ (这是默认值)。
+ 这通常能够修复在休眠或关机时立即再次启动的问题。</para>
+ </sect3>
+
+ <sect3>
+ <title>其他问题</title>
+
+ <para>如果您有 <acronym>ACPI</acronym> 的其他问题
+ (同 docking station 协同工作、 无法检测设备, 等等),
+ 请把描述发给邮件列表; 不过, 这些问题也有可能和
+ <acronym>ACPI</acronym> 中尚未完成的部分有关,
+ 它们可能需要时间才能被实现。 请保持耐心,
+ 并准备测试我们可能会发给您的补丁。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="ACPI-aslanddump">
+ <title><acronym>ASL</acronym>、<command>acpidump</command>, 以及
+ <acronym>IASL</acronym></title>
+
+ <para>最常见的问题是 <acronym>BIOS</acronym>
+ 制造商提供的不正确 (甚至完全错误的!) 字节代码。
+ 这通常会以类似下面这样的内核消息显示在控制台上:</para>
+
+ <screen>ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
+(Node 0xc3f6d160), AE_NOT_FOUND</screen>
+
+ <para>通常您可以通过将
+ <acronym>BIOS</acronym> 升级到最新版本来解决这类问题。
+ 绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常,
+ 则从 <acronym>AML</acronym> 开始查找问题将是一条捷径。
+ 字节代码, 或常说的 <acronym>AML</acronym>, 是从一种称作
+ <acronym>ASL</acronym> 语言的原代码编译得到的结果。
+ <acronym>AML</acronym> 在
+ <acronym>DSDT</acronym> 表中。 要得到您系统的
+ <acronym>ASL</acronym>, 需要使用 &man.acpidump.8;。
+ 您应该使用 <option>-t</option> (显示固定表的内容)
+ 和 <option>-d</option> (将 <acronym>AML</acronym> 反汇编成
+ <acronym>ASL</acronym>) 两个选项。 参考
+ <link linkend="ACPI-submitdebug">如何提交调试信息</link>
+ 一节以获得示范用法。</para>
+
+ <para>您可以检查的第一件事是重新编译
+ <acronym>ASL</acronym> 来看看是否有错误。
+ 警告通常都可以忽略, 而错误通常会使导致
+ <acronym>ACPI</acronym> 无法正常工作的原因。 要编译您的
+ <acronym>ASL</acronym>, 使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>iasl your.asl</userinput></screen>
+ </sect2>
+
+ <sect2 id="ACPI-fixasl">
+ <title>修复 <acronym>ASL</acronym></title>
+
+ <para>我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用
+ <acronym>ACPI</acronym>。 然而, 目前我们仍然在开发绕过
+ <acronym>BIOS</acronym> 制造商常见错误的方法。
+ Microsoft 解释器 (<filename>acpi.sys</filename> 和
+ <filename>acpiec.sys</filename>) 并不会严格地检查是否遵守了标准,
+ 因此许多只在 Windows 中测试 <acronym>ACPI</acronym> 的
+ <acronym>BIOS</acronym> 制造商很可能永远不会修正他们的
+ <acronym>ASL</acronym>。 我们希望不断地找出并用文档说明
+ Microsoft 的解释器到底允许那些不标准的行为,
+ 并在 &os; 进行对应的修改使它能够正常工作而不需要用户修正
+ <acronym>ASL</acronym>。 作为一项临时缓解问题的方法,
+ 并帮助我们确认其行为, 您可以手工修正
+ <acronym>ASL</acronym>。 如果这样能够解决问题,
+ 请把新旧 <acronym>ASL</acronym> 的 &man.diff.1;
+ 发给我们, 这样我们就有可能绕过 <acronym>ACPI-CA</acronym>
+ 中的错误行为, 从而不再需要您来手工修正。</para>
+
+ <para>下面是一些常见的错误信息, 它们的原因,
+ 以及如何修正。</para>
+
+ <sect3>
+ <title>_OS dependencies (_OS 依赖)</title>
+
+ <para>某些 <acronym>AML</acronym> 假定世界是由不同版本的
+ Windows 组成的。 您可以让 &os; 声称自己是任意
+ <acronym>OS</acronym> 来看一看是否能够修正问题。
+ 比较简单的办法是设置
+ <option>hw.acpi.osname</option>=<quote>Windows 2001</quote>
+ 到 <filename>/boot/loader.conf</filename> 中, 或使用您在
+ <acronym>ASL</acronym> 中找到的其他字符串。</para>
+ </sect3>
+
+ <sect3>
+ <title>Missing Return statements (缺少返回语句)</title>
+
+ <para>一些方法可能没按照标准要求的那样显式地返回值。
+ 尽管 <acronym>ACPI-CA</acronym> 无法处理它,
+ 但 &os; 提供了一个绕过它并允许其暗含地返回值的方法。
+ 您也可以增加一个显式的
+ Return 语句, 如果您知道那里需要返回一个值的话。
+ 要强制 <command>iasl</command> 编译
+ <acronym>ASL</acronym>, 需要使用 <option>-f</option>
+ 标志。</para>
+ </sect3>
+
+ <sect3>
+ <title>替换默认的 <acronym>AML</acronym></title>
+
+ <para>在定制 <filename>your.asl</filename> 之后,
+ 您可以通过下面的命令编译它:</para>
+
+ <screen>&prompt.root; <userinput>iasl your.asl</userinput></screen>
+
+ <para>可以使用 <option>-f</option> 标志来强制创建
+ <acronym>AML</acronym>, 即使在编译过程中发生了错误。
+ 请注意某些错误 (例如, 缺少 Return 语句)
+ 会自动被解释器忽略掉。</para>
+
+ <para><filename>DSDT.aml</filename> 是
+ <command>iasl</command> 命令的默认输出文件名。
+ 可以加载它来取代您 <acronym>BIOS</acronym>
+ 中存在问题的副本 (它仍然存在于闪存中),
+ 其方法是按下面的说明编辑
+ <filename>/boot/loader.conf</filename>:</para>
+
+ <programlisting>acpi_dsdt_load="YES"
+acpi_dsdt_name="/boot/DSDT.aml"</programlisting>
+
+ <para>一定要把您的 <filename>DSDT.aml</filename> 复制到
+ <filename role="directory">/boot</filename> 目录中。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="ACPI-debugoutput">
+ <title>从
+ <acronym>ACPI</acronym> 中获取调试输出信息</title>
+
+ <para><acronym>ACPI</acronym> 驱动程序提供了非常灵活的调试机制。
+ 这允许您指定一组子系统, 以及所需要的详细信息。
+ 需要调试的子系统可以按 <quote>layers(层)</quote>
+ 来指定, 并分为 <acronym>ACPI-CA</acronym> 组件 (ACPI_ALL_COMPONENTS)
+ 和 <acronym>ACPI</acronym> 硬件支持 (ACPI_ALL_DRIVERS)。
+ 调试输出的详细程度可以通过
+ <quote>level(详细度)</quote> 来指定, 其范围是
+ ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。
+ <quote>level</quote> 是一个位掩码因此可以一次设置多个选项,
+ 中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出,
+ 如果它太长以至于冲掉了控制台消息缓冲的话。
+ 不同的层和输出详细度的完整列表可以在 &man.acpi.4; 联机手册中找到。</para>
+
+ <para>调试输出默认并不开启。 要起用它, 您需要在内核设置中添加
+ <option>options ACPI_DEBUG</option>, 如果您的内核中编入了
+ <acronym>ACPI</acronym> 的话。 您还可以在
+ <filename>/etc/make.conf</filename> 中加入
+ <option>ACPI_DEBUG=1</option> 来在全局起用它。
+ 如果它只是模块, 您可以用下面的方法来重新编译
+ <filename>acpi.ko</filename>:</para>
+
+ <screen>&prompt.root; <userinput>cd /sys/modules/acpi/acpi
+&amp;&amp; make clean &amp;&amp;
+make ACPI_DEBUG=1</userinput></screen>
+
+ <para>安装 <filename>acpi.ko</filename> 到
+ <filename role="directory">/boot/kernel</filename>
+ 并把所需的详细度和层在 <filename>loader.conf</filename> 中指定。
+ 这个例子讲起用所有
+ <acronym>ACPI-CA</acronym> 组件以及所有
+ <acronym>ACPI</acronym> 硬件驱动
+ (<acronym>CPU</acronym>、 <acronym>LID</acronym>, 等等) 的消息。
+ 只输出错误信息, 也就是最低的详细度。</para>
+
+ <programlisting>debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
+debug.acpi.level="ACPI_LV_ERROR"</programlisting>
+
+ <para>如果您需要的信息是由某个特定的事件触发的
+ (比如说, 休眠之后的唤醒), 您可以不修改
+ <filename>loader.conf</filename> 而转而使用
+ <command>sysctl</command>
+ 来在启动和为那个事件准备系统之后再指定层和详细度。
+ 这些 <command>sysctl</command> 的名字和
+ <filename>loader.conf</filename> 中的一致。</para>
+ </sect2>
+
+ <sect2 id="ACPI-References">
+ <title>参考文献</title>
+
+ <para>关于 <acronym>ACPI</acronym> 的更多信息可以从下面这些地方找到:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The &a.acpi;</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>ACPI</acronym> 邮件列表存档
+ <ulink url="http://lists.freebsd.org/pipermail/freebsd-acpi/"></ulink></para>
+ </listitem>
+
+ <listitem>
+ <para>旧的 <acronym>ACPI</acronym> 邮件列表存档
+ <ulink url="http://home.jp.FreeBSD.org/mail-list/acpi-jp/"></ulink></para>
+ </listitem>
+
+ <listitem>
+ <para>The <acronym>ACPI</acronym> 2.0 标准
+ <ulink url="http://acpi.info/spec.htm"></ulink></para>
+ </listitem>
+
+ <listitem>
+ <para>&os; 手册页: &man.acpi.4;,
+ &man.acpi.thermal.4;, &man.acpidump.8;, &man.iasl.8;,
+ &man.acpidb.8;</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt">
+ <acronym>DSDT</acronym> 调试资源</ulink>.
+ (使用 Compaq 作为例子但通常情况下都很有用。)</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/cutting-edge/Makefile b/zh_CN.GB2312/books/handbook/cutting-edge/Makefile
new file mode 100644
index 0000000000..6d1e5a6e98
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/cutting-edge/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= cutting-edge/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml b/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml
new file mode 100644
index 0000000000..5461e0d311
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml
@@ -0,0 +1,1608 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.208
+ $FreeBSD$
+-->
+
+<chapter id="cutting-edge">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>重新组织和部分更新,由</contrib>
+ </author>
+ <!-- Mar 2000 -->
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Jordan</firstname>
+ <surname>Hubbard</surname>
+ <contrib>原创:</contrib>
+ </author>
+ <author>
+ <firstname>Poul-Henning</firstname>
+ <surname>Kamp</surname>
+ </author>
+ <author>
+ <firstname>John</firstname>
+ <surname>Polstra</surname>
+ </author>
+ <author>
+ <firstname>Nik</firstname>
+ <surname>Clayton</surname>
+ </author>
+ </authorgroup>
+
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译:</contrib>
+ </author>
+ </authorgroup>
+
+ <!-- with feedback from various others -->
+ </chapterinfo>
+
+ <title>最前沿</title>
+
+ <sect1 id="cutting-edge-synopsis">
+ <title>概述</title>
+
+ <para>&os; 在两个发行版之间都有着持续的发展。
+ 对于喜欢冒险的人来说,有几种机制让您的系统与最新的发展保持同步。
+ 警告&mdash;冒险并不适合每一个人!
+ 本章将有助于您决定是紧跟最新发展还是坚持发行版。</para>
+
+ <para>读了本章后,您将了解到:</para>
+
+ <itemizedlist>
+ <listitem><para>&os.stable; 和 &os.current;两个发展分支的不同点。</para>
+ </listitem>
+ <listitem><para>怎样使用<application>CVSup</application>,
+ <application>CVS</application>或
+ <application>CTM</application>保持您的系统更新。</para>
+ </listitem>
+ <listitem><para>如何使用 <command>make buildworld</command>
+ 等命令来重新编译和安装基本系统。</para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para>在读本章这前,您应该了解的:</para>
+
+ <itemizedlist>
+ <listitem><para>正确设置网络连接 (<xref
+ linkend="advanced-networking">)。</para>
+ </listitem>
+ <listitem><para>知道怎样安装附加的第三方软件(<xref
+ linkend="ports">)。</para></listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="current-stable">
+ <title>&os.current; 和 &os.stable; 的对比</title>
+ <indexterm><primary>CURRENT</primary></indexterm>
+ <indexterm><primary>STABLE</primary></indexterm>
+
+ <para>FreeBSD有两个开发分支:&os.current; 和 &os.stable;。
+ 这部分将对每个做些说明,并且讲述您的系统如何与各自的树一同保持最新。
+ 先讨论 &os.current;,然后是 &os.stable;。</para>
+
+ <sect2 id="current">
+ <title>使用最新的 &os; CURRENT</title>
+
+ <para>我们再次强调, &os.current; 是 &os;
+ 开发的<quote>最前沿</quote>。&os.current;
+ 用户要有较高的技术能力,并且应该有能力自已解决困难的系统问题。
+ 如果您是个 &os; 新手,那么在安装之前最好三思。</para>
+
+ <sect3>
+ <title>&os.current; 是什么?</title>
+ <indexterm><primary>快照</primary></indexterm>
+
+ <para>&os.current; 是 &os; 的发展前沿。
+ 包括了在下一个官方发行的软件中可能存在,
+ 也可能不存在的发展、实验性变化、传统机制。由于许多
+ &os; 开发者每天编译 &os.current; 源代码,有时这些代码会是不能编译的。
+ 虽然这些问题会很快解决,但不管是 &os.current; 引起的破坏还是急切的泛涵性
+ (greatly desired functionality) 都将是在您获取源代码的的时候值得注意的!</para>
+ </sect3>
+
+ <sect3>
+ <title>谁需要 &os.current;?</title>
+
+ <para>&os.current; 适合下边三种主要兴趣团体:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>&os; 社区的成员:
+ 积极工作在源码树的某部分的人和为保持 <quote>最新</quote>
+ 为绝对需求的人。</para>
+ </listitem>
+
+ <listitem>
+ <para>&os; 社区的成员: 为促使 &os.current;
+ 保持尽可能的健全而愿花时间去解决问题的积极的测试员;
+ 以及那些愿意提出关于 &os;
+ 变化和总体方向的建设性建议并且提供补丁实现它们的人们。</para>
+ </listitem>
+
+ <listitem>
+ <para>那些只是想关注或为了参考目的使用当前 (current) 源码的人们
+ (如,为了<emphasis>阅读</emphasis>,而不是执行)。
+ 这些人也偶尔做做注释或贡献代码。</para>
+ </listitem>
+ </orderedlist>
+ </sect3>
+
+ <sect3>
+ <title>&os.current; <emphasis>不是</emphasis>什么?</title>
+
+ <orderedlist>
+ <listitem>
+ <para>因为您听说里边有些新而酷 (cool) 的功能,
+ 而且您想在首先在您的天地 (block) 里拥有它,
+ 所以紧紧跟随、不放过预先发行的每一个字节。
+ 由于是系统中第一个使用新功能的人,
+ 也就意味着在系统里产生新问题的您是第一个。</para>
+ </listitem>
+
+ <listitem>
+ <para>修复错漏的快捷方式。任何 &os.current
+ 的既定版本在修复已知错漏的同时又可能会产生新的错漏。</para>
+ </listitem>
+
+ <listitem>
+ <para>无所不在的<quote>官方支持</quote>。
+ 我们尽最大努力在3个<quote>合法的</quote>
+ &os.current; 组之一真诚给人们提供帮助,但是我们
+ <emphasis>没有时间</emphasis>提供技术支持。
+ 这并不是因为我们是那种不喜欢帮助人解困的无耻之徒
+ (如果我们是的话,就不会制作 &os; 了)。
+ 我们不能每天简单地回复上百的消息,<emphasis>而且</emphasis>
+ 我们继续发展 FreeBSD! 在改善 &os;
+ 和回复大量关于实验代码的问题之间如果要做个选择的话,
+ 开发人员会选择前者。</para>
+ </listitem>
+ </orderedlist>
+ </sect3>
+
+ <sect3>
+ <title>使用 &os.current;</title>
+
+ <indexterm>
+ <primary>当前版</primary>
+ <secondary>使用</secondary>
+ </indexterm>
+ <orderedlist>
+ <listitem>
+ <para>加入 &a.current.name; 和 &a.cvsall.name; 列表。
+ 这个不仅仅是个好主意,而且很 <emphasis>重要</emphasis>。如果您不去
+ <emphasis>&a.current.name;</emphasis>,
+ 您就不会看到人们所做的关于系统当前状态的说明,
+ 这样您就有可能在别人已经发现并解决了的一大堆问题面前难倒。
+ 更重要的是您会错过一些重要的公告---对于您的系统安全可能是至关重要的。</para>
+
+ <para>&a.cvsall.name; 列表允许您看到每个变化的提交记录,
+ 因为这些记录与其它相关信息是同步的。</para>
+
+ <para>要加入这些列表,或其它可能的列表,请访问
+ &a.mailman.lists.link; ,并且点击您想订阅的列项。
+ 关于其它步骤的说明那里有提供。</para>
+ </listitem>
+
+ <listitem>
+ <para>从&os; <link
+ linkend="mirrors">镜像站点</link>获取源码。您有两种方式选择:</para>
+
+ <orderedlist>
+ <indexterm>
+ <primary><command>cvsup</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary><command>cron</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary>当前</primary>
+ <secondary>使用 <application>CVSup</application> 同步</secondary>
+ </indexterm>
+
+ <listitem>
+ <para>与称作 <filename>standard-supfile</filename> 的
+ <filename>supfile</filename> 一起使用 <link
+ linkend="cvsup">cvsup</link>,这个可以从
+ <filename>/usr/share/examples/cvsup</filename>得到。
+ 这是最被推荐的方式,因为它允许您一次获取整个集合,
+ 以后就只取更改过的部分。许多人从 <command>cron</command>
+ 运行 <command>cvsup</command>,以保持他们的源码自动更新。
+ 您须要定制上边的 <filename>supfile</filename> 样本,并且配置 <link
+ linkend="cvsup">cvsup</link> 以适应您的环境。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>当前的</primary>
+ <secondary>使用 CTM 同步</secondary>
+ </indexterm>
+ <listitem>
+ <para>使用工具 <application><link
+ linkend="ctm">CTM</link></application>。
+ 如果您的连接性能不太好(高价连接或只能通过电子邮件存取),
+ <application>CTM</application> 是个选择。
+ 但这也颇有争议并且常常得到到坏文件。因此很少使用它,
+ 这也注定了不能长期用它来工作。对于使用 9600&nbsp;bps
+ 或更快连接的人,我们推荐使用 <application><link
+ linkend="cvsup">CVSup</link></application>。
+ </para>
+ </listitem>
+ </orderedlist>
+ </listitem>
+
+ <listitem>
+ <para>如果您获取源码是用于运行,而不只是看看,那么就获取
+ <emphasis>整个</emphasis> &os.current;,不要选部分。
+ 这样做的原因是源码的大部分都依赖于其他部分,
+ 要是您试着只编译其中一部分的话,保证您会陷入麻烦。</para>
+
+ <indexterm>
+ <primary>当前版</primary>
+ <secondary>编译</secondary>
+ </indexterm>
+ <para>在编译 &os.current; 之前,请仔细阅读
+ <filename>/usr/src</filename> 里的
+ <filename>Makefile</filename> 文件。
+ 尽管是部分的升级过程,您至少也要首先<link
+ linkend="makeworld">安装新的内核和重建系统</link>。阅读
+ &a.current; 邮件列表和 <filename>/usr/src/UPDATING</filename>,
+ 会让您在其它循序渐进的过程中保持最新,
+ 这对于我们向下一个发行版转移是很有必要的。</para>
+ </listitem>
+
+ <listitem>
+ <para>热心一点!如果您正运行 &os.current;,
+ 我们很想知道您关于它的一些想法,
+ 尤其是关于错漏修复或增进的建议。
+ 非常欢迎带有代码的建议!</para>
+ </listitem>
+ </orderedlist>
+ </sect3>
+ </sect2>
+
+ <sect2 id="stable">
+ <title>使用最新的 &os; STABLE</title>
+
+ <sect3>
+ <title>&os.stable; 是什么?</title>
+ <indexterm><primary>稳定版</primary></indexterm>
+
+ <para>&os.stable; 是我们的发展分支,我们的主要发行版就由此而来。
+ 这个分支会以不同速度变化,并且假定这些是第一次进入
+ &os.current; 进行测试。然而,这 <emphasis>仍然</emphasis>
+ 是个发展中的分支,这意味着在一定的时候,&os.stable;
+ 源码可能或不可能满足一些特殊的要求。
+ 它只不过是另一个工程发展途径,并不是终端用户的资源。</para>
+ </sect3>
+
+ <sect3>
+ <title>谁需要 &os.stable;?</title>
+
+ <para>如果您有兴趣追随 FreeBSD 的开发过程或为其做点贡献,
+ 尤其是和下一个
+ <quote>非计划</quote> 的 FreeBSD 发行版有关时,
+ 您应该考虑采用 &os.stable;。</para>
+
+ <para>尽管安全更新也会进入
+ &os.stable; 分支,但您并不 <emphasis>必须</emphasis> 使用
+ &os.stable; 来达到这样的目的。 每一个
+ FreeBSD 的安全公告都会解释如何修复受到影响的发行版中的问题
+ <footnote><para>这也不总是正确。我们不可能永远支持
+ FreeBSD 的旧发行版, 尽管我们会在发布之后支持他们数年之久。
+ 关于 FreeBSD 目前对于旧发行版的支持政策的完整描述, 请参见
+ <ulink
+ url="&url.base;/security/">http://www.FreeBSD.org/security/</ulink>。</para>
+ </footnote>,而因为安全原因而去采用一个开发分支显然可能会同时引入一些不希望的修改。</para>
+
+ <para>尽管我们尽力确保 &os.stable; 分支在任何时候都能够正确编译和运行,
+ 但没有人能够担保它在任何时候都总可以。
+ 此外, 尽管代码在进入 &os.stable; 之前都是在 &os.current; 上完成开发,
+ 但使用 &os.stable; 的人要比使用 &os.current; 的更多。
+ 有证据显示, 犄角旮旯里的各种问题有些时候仍然会由于在 &os.current; 不那么明显
+ 而在 &os.stable; 暴露出来。</para>
+
+ <para>基于这些原因, <emphasis>不</emphasis> 推荐您盲目地追随
+ &os.stable;, 并且, 在粗略地测试过代码之前不要更新任何生产服务器到
+ &os.stable; 也非常重要。</para>
+
+ <para>如果您没有用于完成这些工作的资源, 我们推荐您使用最新的 FreeBSD
+ 发行版, 并使用发行版提供的二进制更新机制来在发行版之间完成迁移。</para>
+ </sect3>
+
+ <sect3>
+ <title>使用&os.stable;</title>
+
+ <indexterm>
+ <primary>稳定版</primary>
+ <secondary>使用</secondary>
+ </indexterm>
+ <orderedlist>
+ <listitem>
+ <para>加入 &a.stable.name; 列表。让您随时了解可能出现在
+ &os.stable; 里的<quote>build 依赖性</quote>或其它需要特别注意的问题。
+ 当开发员正在考虑某些有争议的修复或更新时,
+ 他们就会在这个邮件列表里发表声明,给用户机会回应,
+ 看他们对于提出的变化是否还有什么问题。</para>
+
+ <para>&a.cvsall.name; 列表允许您看到每一个变化的提交记录条目,
+ 这些变化是随着由可能的副作用引起的任何相关信息而产生的。</para>
+
+ <para>要加入这些列表或其他可用的,访问 &a.mailman.lists.link;
+ 并点击您希望订阅的列表。关于其它步骤的说明可以在那里看到。</para>
+ </listitem>
+
+ <listitem>
+ <para>如果安装一个新的系统又想它尽可能稳定的话,您可以仅仅从 <ulink
+ url="ftp://snapshots.jp.FreeBSD.org/pub/FreeBSD/snapshots/"></ulink>
+ 获取最新的分支快照并象其它发行版一样安装它。或者您可以从<link
+ linkend="mirrors">镜像站点</link>安装最新的 &os.stable; 发行版,
+ 并按照下边的说明升级您的系统到最新的 &os.stable; 源码。</para>
+
+ <para>如果您已经在运行以前的 &os; 发行版,并希望通过源码方式升级,
+ 那么您可能轻易的从 &os; <link linkend="mirrors">镜像站点</link>完成。
+ 有两种方式:</para>
+
+ <orderedlist>
+ <indexterm>
+ <primary><command>cvsup</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary><command>cron</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary>稳定版</primary>
+ <secondary>使用<application>CVSup</application>同步</secondary>
+ </indexterm>
+ <listitem>
+ <para>与称作 <filename>standard-supfile</filename> 的
+ <filename>supfile</filename> 一起使用 <link
+ linkend="cvsup">cvsup</link>,这个可以从
+ <filename>/usr/share/examples/cvsup</filename> 得到。
+ 这是最被推荐的方式,因为它允许您一次获取整个集合,
+ 以后就只取更改过的部分。许多人从 <command>cron</command>
+ 运行 <command>cvsup</command>,以保持他们的源码自动更新。
+ 您须要定制上边的 <filename>supfile</filename> 样本,并且配置 <link
+ linkend="cvsup">cvsup</link> 以适应您的环境。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>当前的</primary>
+ <secondary>使用 CTM 同步</secondary>
+ </indexterm>
+ <listitem>
+ <para>使用工具 <application><link linkend="ctm">CTM</link></application>。
+ 如果您的连接性能不太好(高价连接或只能通过电子邮件存取),
+ <application>CTM</application> 是个选择。
+ 但这也颇有争议并且常常得到到坏文件。因此很少使用它,
+ 这也注定了不能长期用它来工作。对于使用 9600&nbsp;bps
+ 或更快连接的人,我们推荐使用 <application><link
+ linkend="cvsup">CVSup</link></application>。
+ </para>
+ </listitem>
+ </orderedlist>
+ </listitem>
+
+ <listitem>
+ <para>本质上说,如果您需要快速存取源码并且不计较通信宽带的话,可以使用
+ <command>cvsup</command> 或 <command>ftp</command>。否则,就使用
+ <application>CTM</application>。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>稳定版</primary>
+ <secondary>编译</secondary>
+ </indexterm>
+ <listitem>
+ <para>在编译 &os.stable; 之前,请仔细阅读
+ <filename>/usr/src</filename> 里的 <filename>Makefile</filename>。
+ 您至少应该<link linkend="makeworld">安装一个新的内核并重建系统</link>,
+ 首先做为升级过程的一部分。阅读 &a.stable; 邮件列表和
+ <filename>/usr/src/UPDATING</filename>,
+ 可能让您在其它循序渐进的过程中保持更新,
+ 这在我们向下一发行版转移时是很有必要的。</para>
+ </listitem>
+ </orderedlist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="synching">
+ <title>同步您的源码</title>
+
+ <para>有许多方式通过互联网(或电子邮件)与 &os;
+ 项目源码特定领域或所有领域保持更新,主要依赖于您的兴趣。
+ 我们提供的主要服务是<link linkend="anoncvs">匿名 CVS</link>、
+ <link linkend="cvsup">CVSup</link>,和 <link linkend="ctm">CTM</link>。</para>
+
+ <warning>
+ <para>虽然只更新源码树中的部分是可能的,
+ 唯一被支持的更新过程是更新整个树、并且重编译用户区
+ (如:在用户空间运行的所有程序,像 <filename>/bin</filename>
+ 和 <filename>/sbin</filename>下边的)和内核源码。
+ 只更新源码树中的部分,或只有内核,或只有用户区
+ (userland) 通常会出现错误。这些问题包括有编译错误、内核崩溃
+ (kernel panics)、数据出错。</para>
+ </warning>
+
+ <indexterm><primary>Anonymous CVS</primary></indexterm>
+ <para><application>Anonymous CVS</application> 和
+ <application>CVSup</application> 使用 <emphasis>下拉(pull)</emphasis>
+ 模式更新源码。在 <application>CVSup</application> 方式下,用户
+ (或 <command>cron</command> 脚本) 调用 <command>cvsup</command>
+ 程序,并且与某个地方的 <command>cvsupd</command>
+ 服务器交互一起更新您的文件。您收到的更新文件是更新到秒的,
+ 并且在您得到他们时,也只有那时您会需要它们。
+ 您可以轻易的限定您的更新到您感兴趣的指定文件或目录。
+ 服务器会根据您所有的和您想要的更新在空闲时生成。
+ <application>Anonymous CVS</application> 相比
+ <application>CVSup</application> 要简单一点,
+ <application>CVSup</application> 只是
+ <application>CVS</application>(让您可以直接从远端的
+ CVS 仓库里下拉更改)的扩展。<application>CVSup</application>
+ 完成得更有效率,但 <application>Anonymous CVS</application>
+ 更易使用。</para>
+
+ <indexterm>
+ <primary><application>CTM</application></primary>
+ </indexterm>
+ <para><application>CTM</application>,在另一方面,
+ 不能交互的把您有的源码与主压缩包里的进行比较,
+ 也不能把它们拉下来。实际上,在主 CTM 机器里,
+ 可以用来识别文件里自上次运行以来发生的变化的脚本,
+ 每天要执行好几次,任何侦测到的变化都会被压缩、
+ 标识上序列号并进行编码以利于能过电子邮件传输
+ (只能是可打印的ASCII)。一旦接收到,
+ 这些<quote>CTM deltas</quote>就会被传送给 &man.ctm.rmail.1;
+ 工具---可以自动进行解码、校验和应用这些变化到用户的复制的源码里。
+ 这个过程比 <application>CVSup</application> 更为有效,
+ 而且更少占用我们的服务器资源,因为它不仅仅采用
+ <emphasis>下拉(pull)</emphasis> 模式,还采用
+ <emphasis>上推(push)</emphasis> 模式。</para>
+
+ <para>当然,There are other trade-offs, of course.
+ 如果您不经意删除了您的压缩包的部分内容,
+ <application>CVSup</application> 会检测到并为您重建破坏的部分。
+ <application>CTM</application> 是不会这样做的,
+ 如果您删除了您的源码树中的某部分(并已不能恢复),
+ 那么您就必须从破坏处 (从最新的CVS <quote>base delta</quote>)
+ 开始,使用 <application>CTM</application> 或
+ <application>Anonymous CVS</application>
+ 进行重建,仅仅删除坏的数据并再同步。</para>
+ </sect1>
+
+ <sect1 id="makeworld">
+ <title>重新编译 <quote>world</quote></title>
+
+ <indexterm>
+ <primary>重新编译 <quote>world</quote></primary>
+ </indexterm>
+ <para>只要您根据一定版本的 &os; (&os.stable;、&os.current; 等等),
+ 已经同步了您本地的源码树,那么您就可以使用这些源码树来重建系统。</para>
+
+ <warning>
+ <title>做好备份</title>
+
+ <para>无需强调在行动 <emphasis>之前</emphasis> 备份整个系统是多么的重要。
+ 尽管重新编译系统是 (如果您按照文档的指示做的话) 一件很容易完成的工作,
+ 但出错也是在所难免的, 另外, 别人在源码里面引入的错误也可能造成系统无法引导。</para>
+
+ <para>请确信自己已经做过备份, 并且在手边有恢复软盘或可以引导的光盘。
+ 您可能永远也不会用到它, 但安全第一嘛!</para>
+ </warning>
+
+ <warning>
+ <title>订阅恰当的邮件列表</title>
+
+ <indexterm><primary>邮件列表</primary></indexterm>
+ <para>&os.stable; 和 &os.current; 分支自然是
+ <emphasis>发展中的</emphasis>。为 &os;
+ 做贡献的都是人,偶尔也会犯错误。</para>
+
+ <para>有时这些错误没什么危害,只是引起您的系统生成新的诊断警告。
+ 有时是灾难性的,并导致您的系统不能惊动启动或破坏您的文件系统
+ (甚至更糟)。</para>
+
+ <para>如果出现了类似的问题,
+ 贴一封<quote>小心(heads up)</quote>帖到相关的邮件列表里,
+ 讲清问题的本质以及受影响的系统。在问题解决后,再贴封<quote>解除(all
+ clear)</quote>声明。</para>
+
+ <para>如可您想跟踪 &os.stable; 或 &os.current;
+ 而又不阅读 &a.stable; 和 &a.current; 各自的邮件列表,那么您是自找麻烦。</para>
+ </warning>
+
+ <warning>
+ <title>不要使用 <command>make world</command></title>
+
+ <para>许多较早的文档推荐使用
+ <command>make world</command> 来完成这项工作。 这样做会跳过一些必要的步骤,
+ 因此只有在您知道自己在做什么的时候才可以这样做。 几乎所有的情况下
+ <command>make world</command> 都是不应该做的事情, 您应该使用这里描述的方法。</para>
+ </warning>
+
+ <sect2>
+ <title>更新系统的规范途径</title>
+
+ <para>要更新系统,就要使用下面的过程:</para>
+
+ <screen>&prompt.root; <userinput>make buildworld</userinput>
+&prompt.root; <userinput>make buildkernel</userinput>
+&prompt.root; <userinput>make installkernel</userinput>
+&prompt.root; <userinput>reboot</userinput></screen>
+
+ <para>您应该启动到单用户模式下(例如从启动提示符处使用
+ <command>boot -s</command>)。然后执行:</para>
+
+ <screen>&prompt.root; <userinput>mergemaster -p</userinput>
+&prompt.root; <userinput>make installworld</userinput>
+&prompt.root; <userinput>mergemaster</userinput>
+&prompt.root; <userinput>reboot</userinput></screen>
+
+ <warning>
+ <title>阅读进一步的说明</title>
+
+ <para>上边描述的序列只是有助于您开始工作的简要。
+ 要清楚的理解每一不步,尤其是您想使用定制内核配置,
+ 您就应阅读下面的部分。</para>
+ </warning>
+ </sect2>
+
+ <sect2>
+ <title>阅读 <filename>/usr/src/UPDATING</filename></title>
+
+ <para>在您做其它事之前,请阅读
+ <filename>/usr/src/UPDATING</filename> (或在您的源码里的等效的文件)。
+ 这个文件要包含有关于您可能遇到的问题的重要信息,
+ 或指定了您可能使用到的命令的执行顺序。如果
+ <filename>UPDATING</filename> 与您这里读到相矛盾,那就先依据
+ <filename>UPDATING</filename>。</para>
+
+ <important>
+ <para>正如先前所述,阅读 <filename>UPDATING</filename>
+ 并不能替代订阅正确的邮件列表。两都是互补的,并不彼此排斥。</para>
+ </important>
+ </sect2>
+
+ <sect2>
+ <title>检查 <filename>/etc/make.conf</filename></title>
+ <indexterm>
+ <primary><filename>make.conf</filename></primary>
+ </indexterm>
+
+ <para>检查
+ <filename>/usr/share/examples/etc/make.conf</filename>
+ (在 &os; &nbsp; 4.X 中叫做 <filename>/etc/defaults/make.conf</filename>) 以及
+ <filename>/etc/make.conf</filename>。 第一个文件包含了一些默认的定义
+ &ndash; 它们中的绝大多数都注释掉了。
+ 为了在重新编译系统时能够使用它们,
+ 请把这些选项加入到 <filename>/etc/make.conf</filename>。
+ 请注意在 <filename>/etc/make.conf</filename> 中的任何设置同时也会影响每次运行
+ <command>make</command> 的结果, 因此设置一些适合自己系统的选项是一个好习惯。</para>
+
+ <para>一般的用户通常会从 <filename>/usr/share/examples/etc/make.conf</filename>
+ (或者 &os;&nbsp;4.X 中的 <filename>/etc/defaults/make.conf</filename>) 复制
+ <makevar>CFLAGS</makevar> 和
+ <makevar>NOPROFILE</makevar> 这样的设置到
+ <filename>/etc/make.conf</filename> 中并令它们生效。</para>
+
+ <para>请考虑其他的一些选项 (例如 <makevar>COPTFLAGS</makevar>、
+ <makevar>NOPORTDOCS</makevar> 等等), 看看是否合用。</para>
+ </sect2>
+
+ <sect2>
+ <title>更新 <filename>/etc</filename> 里边的文件</title>
+
+ <para><filename>/etc</filename>
+ 目录包含有除了您的系统启动时执行的脚本外大部分的系统配置信息。
+ 有些脚本随 FreeBSD 的版本而不同。</para>
+
+ <para>有些配置文件在天天运行的系统里也是要使用到的。尤其是
+ <filename>/etc/group</filename>。</para>
+
+ <para>偶尔,某些<quote>make
+ installworld</quote>的安装需要特定的用户名或用户组存在。
+ 在升级时,有可能这些用户或组就不存在。这会在升级过程造成出错。
+ 有时,<quote>make installworld</quote>会首先检查这些用户或组是否存在。</para>
+
+ <para>最近就有个这样的例子,当时 <username>smmsp</username>
+ 用户是被增加了的。当 &man.mtree.8; 试着建立
+ <filename>/var/spool/clientmqueue</filename> 时,安装过程失败了。</para>
+
+ <para>解决办法是检查 <filename>/usr/src/etc/group</filename>
+ 并把它的组列表与您的进行比较。如果在新文件里有而您的文件里没有的,
+ 就把它们复制过来。同样地,您把 <filename>/etc/group</filename>
+ 里的任何这样的组进行更名---与 <filename>/usr/src/etc/group</filename>
+ 中有相同 GID,但不同名的那些。</para>
+
+ <para>自 4.6-RELEASE 开始,您可以通过 <option>-p</option>
+ 选项以预建 (pre-buildworld) 模式运行 &man.mergemaster.8;。
+ 这样只是比较那些对于成功执行 <maketarget>buildworld</maketarget>
+ 或 <maketarget>installworld</maketarget> 起关键作用的文件。
+ 在第一次时,如果早期的 <command>mergemaster</command> 版本不支持
+ <option>-p</option> 的话,就使用源码树中的新版本:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src/usr.sbin/mergemaster</userinput>
+&prompt.root; <userinput>./mergemaster.sh -p</userinput></screen>
+
+ <tip>
+ <para>如果您是个偏执狂 (paranoid),
+ 您可以检查您的系统看看哪个文件属于您已更名或删除了的那个组。</para>
+
+ <screen>&prompt.root; <userinput>find / -group <replaceable>GID</replaceable> -print</userinput></screen>
+
+ <para>将显示所有 <replaceable>GID</replaceable> 组
+ (可以是组名也可以是数字地组 ID)所有的文件。</para>
+ </tip>
+ </sect2>
+
+ <sect2 id="makeworld-singleuser">
+ <title>改为单用户模式</title>
+ <indexterm><primary>单用户 模式</primary></indexterm>
+
+ <para>您可能相在单用户模式下编译系统。
+ 除了对更快处理事情显然有好处外,重装系统将接触许多重要的系统文件,
+ 包括所有标准系统二进制文件、库文件、包含 (include)
+ 文件等等。在运行的系统里(尤其是同时系统里有激活的用户)
+ 更改这些文件是自寻烦恼。</para>
+
+ <indexterm><primary>多用户模式</primary></indexterm>
+ <para>另一种模式是在多用户模式下编译系统,然后转换到单用户模式下安装。
+ 如果您喜欢这种方式,只需在建立 (build) 完成后才执行下边的步骤。
+ 您推迟转换到单用户模式下直到您必须 <maketarget>installkernel</maketarget>
+ 或 <maketarget>installworld</maketarget>。</para>
+
+ <para>从运行的系统里,以超级用户方式执行:</para>
+
+ <screen>&prompt.root; <userinput>shutdown now</userinput></screen>
+
+ <para>这样就会转换到单用户模式。</para>
+
+ <para>另外也可以,重启系统,在启动提示符处,输入
+ <option>-s</option> 标识。系统就会启动单用户。再在 shell
+ 提示符处执行:</para>
+
+ <screen>&prompt.root; <userinput>fsck -p</userinput>
+&prompt.root; <userinput>mount -u /</userinput>
+&prompt.root; <userinput>mount -a -t ufs</userinput>
+&prompt.root; <userinput>swapon -a</userinput></screen>
+
+ <para>这会检查文件系统,重新装载 <filename>/</filename>
+ 为读/写,参考 <filename>/etc/fstab</filename>
+ 装载其它所有的 UFS 文件系统,然后打开交换 (swapping) 开关。</para>
+
+
+ <note>
+ <para>如果您的 CMOS 时钟是设置为本地时间,而不是 GMT
+ (如果 &man.date.1; 命令输出不能显示正确的时间和地区也有确有其事),
+ 您可能也需要执行下边的命令:</para>
+<screen>&prompt.root; <userinput>adjkerntz -i</userinput></screen>
+
+ <para>这样可以确定您正确的本地时区设置&mdash;不这样做,
+ 您以后可能会碰到一些问题。</para>
+ </note>
+
+ </sect2>
+
+ <sect2>
+ <title>删除 <filename>/usr/obj</filename></title>
+
+ <para>在重建部分系统时,它们被(默认地)放到了
+ <filename>/usr/obj</filename> 目录下边。这些目录影射到了
+ <filename>/usr/src</filename> 下边。</para>
+
+ <para>删除这个目录,您可以加快<quote>make buildworld</quote>的过程,
+ 并且省下与依赖关系有关的许多头痛的事情。</para>
+
+ <para><filename>/usr/obj</filename> 下的有些文件可能设置了不可改
+ (immutable) 属性(查看 &man.chflags.1; 了解更多),
+ 您必须先把这些标志去掉。</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/obj</userinput>
+&prompt.root; <userinput>chflags -R noschg *</userinput>
+&prompt.root; <userinput>rm -rf *</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>重编译源码</title>
+
+ <sect3>
+ <title>保存输出</title>
+
+ <para>建议把执行 &man.make.1; 后得到的输出存成一个文件。
+ 如果什么地方出了错,您就会有个错误信息的备份。
+ 尽管这样不能帮您分析哪里出了错,
+ 但如果您把您的问题贴到某个邮件列表里就能帮助其他的人。</para>
+
+ <para>这样做最简单的办法是使用 &man.script.1;
+ 命令,同是带上参数指定存放输出的文件名。
+ 您应在重建系统之前立即这样做,然后在过程完成时输入
+ <userinput>exit</userinput>。</para>
+
+ <screen>&prompt.root; <userinput>script /var/tmp/mw.out</userinput>
+Script started, output file is /var/tmp/mw.out
+&prompt.root; <userinput>make TARGET</userinput>
+<emphasis>&hellip; compile, compile, compile &hellip;</emphasis>
+&prompt.root; <userinput>exit</userinput>
+Script done, &hellip;</screen>
+
+ <para>如果您这样做,就 <emphasis>不要</emphasis> 把文件存到
+ <filename>/tmp</filename> 里边。下次启动时,这个目录就会被清除掉。
+ 存放的最好地方是 <filename>/var/tmp</filename> (如上个实例)或
+ <username>root</username> 的主目录。</para>
+ </sect3>
+
+ <sect3 id="make-buildworld">
+ <title>编译基本系统</title>
+
+ <para>您必须在<filename>/usr/src</filename>目录里边:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src</userinput></screen>
+
+ <para>(当然,除非您的源码是在其它地方,真是这样的话更换成那个目录就行了)。</para>
+ <indexterm><primary><command>make</command></primary></indexterm>
+
+ <para>使用 &man.make.1; 命令重建系统。这个命令会从
+ <filename>Makefile</filename> (描述组成 &os; 的程序应该怎样被重建,
+ 以什么样的顺序建立等等) 里读取指令。</para>
+
+ <para>输入的一般命令格式如下:</para>
+
+ <screen>&prompt.root; <userinput>make -<replaceable>x</replaceable> -D<replaceable>VARIABLE</replaceable> <replaceable>target</replaceable></userinput></screen>
+
+ <para>这个例子里,<option>-<replaceable>x</replaceable></option>
+ 是会传递给 &man.make.1; 的一个选项。查看 &man.make.1;
+ 手册有您可用的选项例子。</para>
+
+ <para><option>-D<replaceable>VARIABLE</replaceable></option>
+ 传递一个变量给 <filename>Makefile</filename>。这些变量控制了
+ <filename>Makefile</filename> 的行为。这些同
+ <filename>/etc/make.conf</filename> 设置的变量一样,
+ 只是提供了另一种设置它们的方法。</para>
+
+ <screen>&prompt.root; <userinput>make -DNOPROFILE <replaceable>target</replaceable></userinput></screen>
+
+ <para>是另一种指定不被建立 (built) 的先定库
+ (profiled libraries) 的方式,协同
+ <filename>/etc/make.conf</filename> 里的</para>
+
+ <programlisting>NOPROFILE= true # 避免编译先定库</programlisting>
+
+ <para>一起使用。</para>
+
+ <para><replaceable>目标 (target)</replaceable> 告诉
+ &man.make.1; 什么该做。每个 <filename>Makefile</filename>
+ 定义了一定数量不同的<quote>目标 (targets)</quote>,
+ 然后您选择的目标就决定了什么会发生。</para>
+
+ <para>有些目标列在 <filename>Makefile</filename>
+ 里的,但并不意味着您要执行。相反,建立过程 (build process)
+ 利用它们把重建系统的一些必要的步骤分割成几个子步骤。</para>
+
+ <para>大部分的时间不需要向 &man.make.1;
+ 传递参数,因此您的命令看起来可能象这样:</para>
+
+ <screen>&prompt.root; <userinput>make <replaceable>target</replaceable></userinput></screen>
+
+ <para>从 &os; 的 2.2.5 版本开始 (实际上,是先在 &os.current;
+ 分支里第一次创建,然后在 &os.stable; 的 2.2.2 和 2.2.5
+ 两个版本间,进行了大翻新),<maketarget>world</maketarget> target
+ 已经分成了两个部分:<maketarget>buildworld</maketarget> 和
+ <maketarget>installworld</maketarget>。
+ 从 &os; 的 5.3 版开始, <maketarget>world</maketarget> target
+ 在默认时已经改为完全不动作,
+ 因为它事实上对于许多用户都具有相当的危险性。</para>
+
+ <para>正如名字所暗示的,<maketarget>buildworld</maketarget>
+ 在 <filename>/usr/obj</filename> 下边建立了一个全新的树,然后
+ <maketarget>installworld</maketarget> 就在当前的机器里安装这个树。</para>
+
+ <para>因为两个原因,这点很有用。首先,它允许您安全地完成建立
+ (build),而没有您运行的系统组成部分的影响。建立 (build)
+ 是<quote>自主的 (self hosted)</quote>。因为这样,
+ 您可以安全地在以多用户模式运行的机器里执行
+ <maketarget>buildworld</maketarget> ,而不用当心不良影响。
+ 但是依然推荐您在单用户模式时运行
+ <maketarget>installworld</maketarget>。</para>
+
+ <para>第二,允许您使用 NFS 装载 (NFS mounts)
+ 升级您网络里的多台计算机。如果您有三台
+ <hostid>A</hostid>、<hostid>B</hostid> 和 <hostid>C</hostid>
+ 想进行升级,在<hostid>A</hostid> 执行
+ <command>make buildworld</command> 和
+ <command>make installworld</command>。然后从
+ <hostid>A</hostid> NFS 装载 (NFS mount)
+ <hostid>B</hostid> 和 <hostid>C</hostid> 的
+ <filename>/usr/src</filename> 和
+ <filename>/usr/obj</filename>,接着您就执行
+ <command>make installworld</command> 在
+ <hostid>B</hostid> 和 <hostid>C</hostid>
+ 上安装建立 (build) 的结果。</para>
+
+ <para>尽管 <maketarget>world</maketarget> target
+ 仍然存在,强烈建议您不要用它。</para>
+
+ <para>运行</para>
+
+ <screen>&prompt.root; <userinput>make buildworld</userinput></screen>
+
+ <para>现在可能给 <command>make</command> 指定
+ <option>-j</option> 选项了,这样会使用产生出几个并发的进程来。
+ 这在多处理器 (multi-CPU) 机器里最有用。但是,
+ 由于大部分的编译过程是 IO 限制远胜 CPU 限制,它在单处理器
+ (single-CPU) 的机器里也是有用的。</para>
+
+ <para>在一般的单 CPU 机器里,您要运行:</para>
+
+ <screen>&prompt.root; <userinput>make -j4 buildworld</userinput></screen>
+
+ <para>&man.make.1; 然后会有至多 4 个进程在同一时刻执行。
+ 贴到邮件列表里的实验证据显示这样会收到最好的效果。</para>
+
+ <para>如果您有一台多 CPU 机器,那您就使用 SMP
+ 配置内核,试试 6 到 10 之间的值,看这些值提速如何。</para>
+
+ <para>注意,这仍处在实验性阶段,如果提交到源码树上的话,
+ 可能会断送其前程 (break this feature)。
+ 如果用这个参数编译的话,您报告错误前试试不用它。</para>
+ </sect3>
+
+ <sect3>
+ <title>耗时</title>
+ <indexterm>
+ <primary>Rebuilding <quote>world</quote></primary>
+ <secondary>timings</secondary>
+ </indexterm>
+
+ <para>有许多因素影响 build 时间,但通常一台带有
+ 128&nbsp;MB 内存 500&nbsp;MHz 的
+ &pentium;&nbsp;III 要花费大约 2&nbsp; 小时来
+ build &os.stable; 树,并且在整个过程中不带什么技巧或捷径。
+ &os.current; 树花的时间还要更长一点。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>编译和安装新内核</title>
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>编译</secondary>
+ </indexterm>
+
+ <para>要充分利用您的新系统,您应该重新编译内核。
+ 这是很有必要的,因为特定的内存结构已经发生了改变,像
+ &man.ps.1; 和 &man.top.1; 这样的程序会不能工作,
+ 除非内核同源码树的版本是一样的。</para>
+
+ <para>最简单、最安全的方式是 build 并安装一个基于
+ <filename>GENERIC</filename> 的内核。虽然
+ <filename>GENERIC</filename>
+ 可能没有适合您的系统的所有必要的设备,
+ 但它包括了启动您的系统到单用户模式所必需的内容。
+ 这是个不错的检测新系统是否工作正常的测试。在从
+ <filename>GENERIC</filename> 启动、核实系统可以工作后,
+ 您就可以建立 (build) 一个基于您的正常内核配置文件的新的内核了。</para>
+
+ <para>在新的 FreeBSD 版本中,首先完成 <link
+ linkend="make-buildworld">build world</link> 然后再编译新内核非常重要。</para>
+
+ <note><para>如果您想建立一个定制内核,而且已经有了配置文件,
+ 只需象这样使用 <literal>KERNCONF=<replaceable>MYKERNEL</replaceable>:</literal></para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src</userinput>
+&prompt.root; <userinput>make buildkernel KERNCONF=<replaceable>MYKERNEL</replaceable></userinput>
+&prompt.root; <userinput>make installkernel KERNCONF=<replaceable>MYKERNEL</replaceable></userinput></screen>
+
+ <para>在 FreeBSD&nbsp;4.2 或更早的版本里,您必须使用
+ <literal>KERNEL=</literal> 替换 <literal>KERNCONF=</literal>。在
+ 2001 年 2 月 2 号以前发行的 4.2-STABLE 并不识别
+ <literal>KERNCONF=</literal>。</para>
+ </note>
+
+ <para>注意,如果您已把 <literal>内核安全级别(kern.securelevel)</literal>
+ 调高到了 1 以上,而且还设置了 <literal>noschg</literal>
+ 或相似的标识到了您的内核二进制里边,您可能会发现转换到单用户模式里使用
+ <maketarget>installkernel</maketarget> 是很有必要的。
+ 另外您应该也能毫无问题地从多用户模式执行这两个命令。查看
+ &man.init.8; 了解更多关于 <literal>内核安全级(kern.securelevel)</literal>
+ 的信息;查看 &man.chflags.1; 了解更多关于不同文件标识的信息。</para>
+ <para>如果您升级到 &os; 4.0 以前版本,您应旧的内核 build
+ 程序。但还是推荐您使用新版的 &man.config.8;,
+ 可以使用下边的命令行:</para>
+
+ <screen>&prompt.root; <userinput>/usr/obj/usr/src/usr.sbin/config/config <replaceable>KERNELNAME</replaceable></userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>重启到单用户模式</title>
+ <indexterm><primary>单用户模式</primary></indexterm>
+
+ <para>您应该单用户模式测试新内核。照<xref
+ linkend="makeworld-singleuser">处的说明去做。</para>
+ </sect2>
+
+ <sect2>
+ <title>安装新的系统二进制(System Binaries)</title>
+
+ <para>如果您正建立一个足以使用 <command>make buildworld</command>
+ 的 &os; 版本,那么您现在应该使用
+ <maketarget>installworld</maketarget> 来安装新的系统二进制。</para>
+
+ <para>执行</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src</userinput>
+&prompt.root; <userinput>make installworld</userinput></screen>
+
+ <note>
+ <para>如果在 <command>make buildworld</command>
+ 的命令行指定了变量,您就必须在
+ <command>make installworld</command> 命令行里指定同样的变量。
+ 对于其它的选项也不是必需的,如,<option>-j</option>
+ 就不能同 <maketarget>installworld</maketarget> 一起使用。</para>
+
+ <para>举例,您执行了:</para>
+
+ <screen>&prompt.root; <userinput>make -DNOPROFILE buildworld</userinput></screen>
+
+ <para>您就必须使用:</para>
+
+ <screen>&prompt.root; <userinput>make -DNOPROFILE installworld</userinput></screen>
+
+ <para>来安装结果,否则就要试着安装先定 (profiled) 的在
+ <command>make buildworld</command> 阶段没有建立 (built)
+ 的二进制文件。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>不是由 <command>make installworld</command> 更新的更新文件</title>
+
+ <para>重新编译整个系统不会使用新的或改过的配置文件更新某些目录
+ (尤其像 <filename>/etc</filename>、<filename>/var</filename>
+ 和 <filename>/usr</filename>)</para>
+
+ <para>更新这些文件最简单的方式就是使用
+ &man.mergemaster.8;,手工去做也是可以的,只要您愿意。
+ 不管您选择哪一种,一定记得备份
+ <filename>/etc</filename> 以防出错。</para>
+
+ <sect3 id="mergemaster">
+ <sect3info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>贡献者:</contrib>
+ </author>
+ </authorgroup>
+ </sect3info>
+ <title><command>mergemaster</command></title>
+ <indexterm><primary><command>mergemaster</command></primary></indexterm>
+
+ <para>&man.mergemaster.8; 工具是个有针对性的脚本 (Bourne script),用于检测
+ <filename>/etc</filename> 和 <filename>/usr/src/etc</filename>
+ 源码树里边的配置文件的不同点。
+ 这是保持系统配置文件同源码树里的一起更新的推荐方式。</para>
+
+ <para><command>mergemaster</command> 被集成到了 3.3-RELEASE 和
+ 3.4-RELEASE 之间的 FreeBSD 基本系统里,这意味着自 3.3
+ 版本起所有的 -STABLE 和 -CURRENT 系统都有。</para>
+
+ <para>在提示符里简单地输入 <command>mergemaster</command>
+ 就可以开始,并观看它的开始过程。<command>mergemaster</command>
+ 会建立一个临时的根(root)环境,在 <filename>/</filename> 下,
+ 放置各种系统配置文件。这些文件然后同当前安装到您系统里的进行比较。
+ 此时,不同的文件会以 &man.diff.1; 格式进行显示,使用
+ <option>+</option> 符号标识增加或修改的行,<option>-</option>
+ 标识将完全删除的行或将被替换成新行。查看 &man.diff.1;
+ 手册可以得到更多关于 &man.diff.1; 语法和文件不同点怎样显示的信息。</para>
+
+ <para>&man.mergemaster.8; 会给您显示每个文件的不同处,
+ 这样您就可以选择是删除新文件 (相对临时文件),
+ 是以未改状态安装临时文件,是以当前安装的文件合并临时文件,
+ 还是再看一次 &man.diff.1; 结果。</para>
+
+ <para><quote>选择删除临时文件</quote>将使 &man.mergemaster.8;
+ 知道我们希望保留我们当前的文件不改,并删除新的。
+ 并不推荐这个选择,除非您没有更改当前文件的理由。任何时候在
+ &man.mergemaster.8; 提示符里输入 <keycap>?</keycap>,您就会得到帮助。
+ 如果选择跳过文件,在其它文件处理完后再次进行。</para>
+
+ <para><quote>选择安装未修改临时文件</quote>将会使新文件替换当前的。
+ 对大部分未改的文件,这是个最好的选择。</para>
+
+ <para><quote>选择合并文件</quote>将为您打开一个文本编辑器,
+ 里边是两个文件的内容。您现在就可以一边合并它们,
+ 一边在屏幕里查看,同时从两者中选取部分生成最终文件。
+ 当两个文件一起比较时,<keycap>l</keycap> 键会选择左边的内容,
+ <keycap>r</keycap> 会选择右边的。最终的输出是由两个部分组成的一个文件,
+ 用它就可以安装了。这个选项通常用于用户修改了设置的文件。</para>
+
+ <para><quote>选择再次查看 &man.diff.1; 结果</quote>将会在提供给选择之前,
+ 显示文件的不同处,就象 &man.mergemaster.8; 所做的一样。</para>
+
+ <para>在 &man.mergemaster.8; 完成了对系统文件的处理后,
+ 您会得到其它的选项。&man.mergemaster.8; 可能会问您是否要重建密码文件,
+ 如果您的 FreeBSD 版本超过 5.0,还会问您是否想要执行
+ &man.MAKEDEV.8;,最后带上一个选项删除剩下的临时文件。</para>
+ </sect3>
+
+ <sect3>
+ <title>手动更新</title>
+
+ <para>如果想要手工更新,但不要只是从
+ <filename>/usr/src/etc</filename> 把文件复制到
+ <filename>/etc</filename> 就了事。有些文件是必须先<quote>安装</quote>的。
+ 这是因为 <filename>/usr/src/etc</filename> 目录并 <emphasis>不是</emphasis>
+ 想像的那样是 <filename>/etc</filename> 目录的一个复制。事实上,有些是文件是
+ <filename>/etc</filename> 有的,而 <filename>/usr/src/etc</filename> 里边没有。</para>
+
+ <para>如果您使用 &man.mergemaster.8; (作为推荐),您可以向前跳到<link
+ linkend="update-dev">下一节</link>。</para>
+
+ <para>手工做最简单的方式是安装这些文件到一个新的目录,完成后再来查找不同处。</para>
+
+ <warning>
+ <title>备份您已有的 <filename>/etc</filename></title>
+
+ <para>虽然,理论上,没有什么会自动访问这个目录,
+ 事情还是做稳操胜当一点。复制已有 <filename>/etc</filename>
+ 到一个安全的地方,如:</para>
+
+ <screen>&prompt.root; <userinput>cp -Rp /etc /etc.old</userinput></screen>
+
+ <para><option>-R</option> 完成递归复制
+ (设者注:即可以复制目录以下的所有内容),<option>-p</option>
+ 保留文件的时间、所属等等。</para>
+ </warning>
+
+ <para>您需要建立的个虚目录 (a dummy set of directories )
+ 来安装新的 <filename>/etc</filename> 和其它文件。
+ <filename>/var/tmp/root</filename> 是个不错的选择,
+ 除此之外,还有一些子目录是需要的。</para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/tmp/root</userinput>
+&prompt.root; <userinput>cd /usr/src/etc</userinput>
+&prompt.root; <userinput>make DESTDIR=/var/tmp/root distrib-dirs distribution</userinput></screen>
+
+ <para>这样就建好了需要的目录结构,然后安装文件。在
+ <filename>/var/tmp/root</filename> 下建立的大部分子目录是空的,
+ 而且要删除掉。最简单的方式是:</para>
+
+ <screen>&prompt.root; <userinput>cd /var/tmp/root</userinput>
+&prompt.root; <userinput>find -d . -type d | xargs rmdir 2&gt;/dev/null</userinput></screen>
+
+ <para>这样会删除所有的空目录。(标准的错误信息被重定向到了
+ <filename>/dev/null</filename>,以防止关于非空目录的警告。</para>
+
+ <para><filename>/var/tmp/root</filename> 现在包含了应放在
+ <filename>/</filename> 下某个位置的所有文件。
+ 您现在必须仔细检查每一个文件,检测它们与您已有的文件有多大不同。</para>
+
+ <para>注意,有些已经安装在 <filename>/var/tmp/root</filename>
+ 下的文件有个<quote>.</quote>在开头。在写的时候,像这样唯一的文件是
+ <filename>/var/tmp/root/</filename> 和 <filename>/var/tmp/root/root/</filename>
+ 里 shell 启动文件,尽管可能有其它的(依赖于您什么时候读取这个)。
+ 确信使用 <command>ls -a</command> 可以看到它们。</para>
+
+ <para>最简单的方式是使用 &man.diff.1; 去比较两个文件:</para>
+
+ <screen>&prompt.root; <userinput>diff /etc/shells /var/tmp/root/etc/shells</userinput></screen>
+
+ <para>这会显示出 <filename>/etc/shells</filename> 文件和新的
+ <filename>/var/tmp/root/etc/shells</filename> 文件的不同处。
+ 用这些来决定是合并您已做的变化还是复制您的旧文件过来。</para>
+
+ <tip>
+ <title>使用日戳 (Time Stamp) 命名新的 Root(根)目录(<filename>/var/tmp/root</filename>),这样您可以轻松地比较两个版本的不同</title>
+
+ <para>频繁重建系统意味着必须频繁更新
+ <filename>/etc</filename>,而这可能会有点烦琐。</para>
+
+ <para>在合并到 <filename>/etc</filename> 的文件里,
+ 最新更改的您可以做个复制,由此加快这个(指更新)过程。
+ 下边就给出了一个怎样做的主意。</para>
+
+ <procedure>
+ <step>
+ <para>像平常一样建立系统 (Make the world)。当您想更新
+ <filename>/etc</filename> 和其它目录里,
+ 给目标目录一个含有当前日期的名字。假如您是 1998 年 2 月 14
+ 日做的,您可以执行下边的:</para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/tmp/root-19980214</userinput>
+&prompt.root; <userinput>cd /usr/src/etc</userinput>
+&prompt.root; <userinput>make DESTDIR=/var/tmp/root-19980214 \
+ distrib-dirs distribution</userinput></screen>
+ </step>
+
+ <step>
+ <para>如上边列出的,从这个目录合并变化。</para>
+
+ <para>在您完成后,<emphasis>不要</emphasis> 删除
+ <filename>/var/tmp/root-19980214</filename> 目录。</para>
+ </step>
+
+ <step>
+ <para>在您下载了最新版的源码并改过后,执行第一步。
+ 这样将得到一个新的目录,可能叫做
+ <filename>/var/tmp/root-19980221</filename>
+ (如果等了一周做的升级)。</para>
+ </step>
+
+ <step>
+ <para>您现在能看到两个目录间的不同了---在隔周的时间里使用
+ &man.diff.1; 建立递归 diff 产生的不同:</para>
+
+ <screen>&prompt.root; <userinput>cd /var/tmp</userinput>
+&prompt.root; <userinput>diff -r root-19980214 root-19980221</userinput></screen>
+
+ <para>一般情况下,这两种间的不同处比
+ <filename>/var/tmp/root-19980221/etc</filename> 和
+ <filename>/etc</filename> 之间的不同要小很多。
+ 因为不同点更小,也就更容易把这些变化移到您的
+ <filename>/etc</filename> 目录里边。</para>
+ </step>
+
+ <step>
+ <para>您现在可以删除早先的两个
+ <filename>/var/tmp/root-*</filename> 目录:</para>
+
+ <screen>&prompt.root; <userinput>rm -rf /var/tmp/root-19980214</userinput></screen>
+ </step>
+
+ <step>
+ <para>每次您需要合并这些变化到 <filename>/etc</filename>
+ 里,就重复这个流程。</para>
+ </step>
+ </procedure>
+
+ <para>您可以使用 &man.date.1; 自动产生目录的名称:</para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/tmp/root-`date "+%Y%m%d"`</userinput></screen>
+ </tip>
+ </sect3>
+ </sect2>
+
+ <sect2 id="update-dev">
+ <title>更新<filename>/dev</filename></title>
+
+ <note>
+ <indexterm><primary>DEVFS</primary></indexterm>
+ <para>如果您正在运行 FreeBSD&nbsp;5.0 或更后的版本,
+ 您可以安全地跳过这部分。这些版本使用了
+ &man.devfs.5; 来透明地分配设备结点。</para>
+ </note>
+
+ <para>许多情况下,在有必要更新设备结点时,&man.mergemaster.8;
+ 工具就可以实现,并且可以自动地完成。
+ 这里的说明用于怎样手工更新设备结点。</para>
+
+ <para>考虑到安全,这里用的是多步流程。</para>
+
+ <procedure>
+ <step>
+ <para>复制 <filename>/var/tmp/root/dev/MAKEDEV</filename>
+ 到 <filename>/dev</filename>:</para>
+
+ <screen>&prompt.root; <userinput>cp /var/tmp/root/dev/MAKEDEV /dev</userinput></screen>
+ <indexterm>
+ <primary><filename>MAKEDEV</filename></primary>
+ </indexterm>
+
+ <para>如果您使用 &man.mergemaster.8; 去更新
+ <filename>/etc</filename>,那么您的 <filename>MAKEDEV</filename>
+ 脚本应该已经被更新过,虽然它不会影响检查 (使用 &man.diff.1;),
+ 必要时手工复制一下。</para>
+ </step>
+
+ <step>
+ <para>现在,给当前的 <filename>/dev</filename>
+ 做个快照。照的时候一定要注意每个文件名的许可
+ (permissions)、所属(ownerships)、主从数字 (major and minor numbers),
+ 不必包括日戳 (time stamps)。最简单的方式是使用 &man.awk.1; 提取信息:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev.out</userinput></screen>
+ </step>
+
+ <step>
+ <para>重做设备结点:</para>
+
+ <screen>&prompt.root; <userinput>sh MAKEDEV all</userinput></screen>
+ </step>
+
+ <step>
+ <para>这时,把这个目录的另一个快照输出到
+ <filename>/var/tmp/dev2.out</filename>。现在检查这两个文件,
+ 查找任何您没建立的设备结点。就该不会很多,但是保险一点总是好的。</para>
+
+ <screen>&prompt.root; <userinput>diff /var/tmp/dev.out /var/tmp/dev2.out</userinput></screen>
+
+ <para>您可能注意到磁盘分区 (disk slice) 的差别,它会使像:</para>
+
+ <screen>&prompt.root; <userinput>sh MAKEDEV sd0s1</userinput></screen>
+
+ <para>那样的命令重新建立分区入口 (slice entries)。您的具体情况可能不同。</para>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2>
+ <title>更新<filename>/stand</filename></title>
+
+ <note>
+ <para>这一步只是为了收尾,可以安全省略。如果您在使用
+ FreeBSD&nbsp;5.2 或更新的版本,<filename>/rescue</filename>
+ 目录会为用户进行自动更新,使用的是在 <command>make installworld</command>
+ 期间静态编译地最新的二进制文件,因此也就不用废话更新
+ <filename>/stand</filename> 的必要性了。</para>
+ </note>
+
+ <para>为了完成,您可能想额外地更新 <filename>/stand</filename>
+ 里的文件。这些文件由链接到 <filename>/stand/sysinstall</filename>
+ 的二进制文件硬链接组成。这个文件要静态链接,以便没有其它文件系统时
+ (尤其是 <filename>/usr</filename>) 被装载时也能工作。</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src/release/sysinstall</userinput>
+&prompt.root; <userinput>make all install</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>重启</title>
+
+ <para>现在完成了。在您检查所有内容都放置正确后,
+ 您可以重启系统了。只是简单的 &man.shutdown.8; 可以这样做:</para>
+
+ <screen>&prompt.root; <userinput>shutdown -r now</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>结束</title>
+
+ <para>恭喜!您现在成功升级了您的 &os; 系统。</para>
+
+ <para>如果还有轻微的错误,可以轻易地重建系统的选定部分。
+ 例如,在部分升级或合并 <filename>/etc</filename> 时,您不小心删除了
+ <filename>/etc/magic</filename>,&man.file.1;
+ 命令就会停止工作。这种情况下,执行下边进行修复:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src/usr.bin/file</userinput>
+&prompt.root; <userinput>make all install</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>问题</title>
+
+ <qandaset>
+ <qandaentry>
+ <question>
+ <para>每个变化您都须要重建系统吗?</para>
+ </question>
+
+ <answer>
+ <para>这个不好说,因为要看变化的情况。如,如果您刚运行了
+ <application>CVSup</application>,并得到下边更新的文件:</para>
+
+ <screen><filename>src/games/cribbage/instr.c</filename>
+<filename>src/games/sail/pl_main.c</filename>
+<filename>src/release/sysinstall/config.c</filename>
+<filename>src/release/sysinstall/media.c</filename>
+<filename>src/share/mk/bsd.port.mk</filename></screen>
+
+ <para>这就不必重建整个系统。您只需到相关的子目录里执行
+ <command>make all install</command>,仅此而已。
+ 但是,如果有重大变化,如 <filename>src/lib/libc/stdlib</filename>,
+ 那么您就要重建系统或至少静态链接的那些部分
+ (除了您增加的部分都是静态链接的)。</para>
+
+ <para>在这天后,就是您的事了。要是说每两个星期重建一下系统的话,
+ 您可能会高兴。或者您可能只想重做改变过的部分,
+ 确信您能找出所有依赖关系。</para>
+
+ <para>当然,所有这些依赖于您想升级的频率,和您是否想跟踪
+ &os.stable; 或 &os.current;。</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>我的编译失败,并伴随有许多 11
+ (或其它的数字信息) 号错误。是怎么回事呀?</para>
+ </question>
+ <indexterm><primary>信号 11</primary></indexterm>
+
+ <answer>
+
+ <para>这个通常表示硬件错误。
+ (重)建系统是个强压测试系统硬件的有效地方式,
+ 并且常常产生内存错误。
+ 这些正好表示它们自已做为编译器离奇地死于收到的奇怪信息。</para>
+
+ <para>一个确信的指示器是如果重新开始
+ make,并且整个过程中会死在不同的点上。</para>
+
+ <para>对于这种情况,您没有什么可做的,除了更换机器里的部件,看是哪一个坏了。</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>我完成后可以删除 <filename>/usr/obj</filename> 吗?</para>
+ </question>
+
+ <answer>
+ <para>简短地说,可以。</para>
+
+ <para><filename>/usr/obj</filename>
+ 包含了所有在编译阶段生成的目标文件。通常,
+ 在<quote>make buildworld</quote>过程中第一步之一就是删除这个目录重新开始。
+ 这种情况下,在您完成后,保留 <filename>/usr/obj</filename>
+ 没有多大意义,还可释放一大堆磁盘空间(通常在 340&nbsp;MB 左右)。</para>
+
+ <para>只是,如果您清楚您在干什么,您可以让<quote>make buildworld</quote>跳过这一步。
+ 这会让后继的 build 执行得更快,因为大部分的源码都不必再进行编译了。
+ 这个的另一面就在于敏感的依赖问题可以潜在,
+ 并以奇怪的方式引起 build 的失败。这在 &os; 邮件列表里经常引起沸腾,
+ 当有人抱怨他们 build 失败时,并没意识到这是因为自已是想抄近路
+ (意思是说少了些必要的步骤)。</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>中断的 build 可以被恢复吗?</para>
+ </question>
+
+ <answer>
+ <para>依赖于您在您找到问题之前整个过程进行了多远。</para>
+
+ <para><emphasis>大体上</emphasis> (这个并不是硬性规定),
+ <quote>make buildworld</quote>过程会建立新版的基本工具
+ (如 &man.gcc.1; 和 &man.make.1;) 以及系统二进制文件。
+ 这些工具和二进制文件然后被安装。新的工具和库然后用来重建它们自已,
+ 并再次被安装。整个系统 (现在包括了常规的用户程序,如
+ &man.ls.1; 或 &man.grep.1;) 然后使用新的系统文件被重建。</para>
+
+ <para>如果您处在最后阶段,您就知道了
+ (因为您已经看过您存储的输出),然后您可以做(相当安全):</para>
+
+ <screen><emphasis>&hellip; 问题修复 &hellip;</emphasis>
+&prompt.root; <userinput>cd /usr/src</userinput>
+&prompt.root; <userinput>make -DNOCLEAN all</userinput></screen>
+
+ <para>这将不能取消
+ <quote>make buildworld</quote>先前所做的工作。</para>
+
+ <para>在<quote>make buildworld</quote>的输出中如果看到如下信息:</para>
+
+ <screen>--------------------------------------------------------------
+Building everything..
+--------------------------------------------------------------</screen>
+
+ <para>那么这样做就是相当安全的。</para>
+
+ <para>如果您没有看到那个信息,或者您不能确定,那么安全第一,从头开始。</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>我怎样加快建立系统的速度?</para>
+ </question>
+
+ <answer>
+ <itemizedlist>
+ <listitem>
+ <para>以单用户模式运行</para>
+ </listitem>
+
+ <listitem>
+ <para>把 <filename>/usr/src</filename> 和 <filename>/usr/obj</filename>
+ 目录放到不同磁盘里的独立文件系统里。如果可能,这些磁盘在不同的磁盘控制器里。</para>
+ </listitem>
+
+ <listitem>
+ <para>更好的,是把这些文件系统放置到多个使用
+ &man.ccd.4; (连接磁盘驱动器--concatenated disk driver)设备的磁盘里。</para>
+ </listitem>
+
+ <listitem>
+ <para>关掉 profiling (在 <filename>/etc/make.conf</filename>
+ 里设置 <quote>NOPROFILE=true</quote>)。您差不多用不了它。</para>
+ </listitem>
+
+ <listitem>
+ <para>在 <filename>/etc/make.conf</filename> 里也为
+ <makevar>CFLAGS</makevar> 设置上 <option>-O -pipe</option>。
+ 最佳优化 <option>-O2</option> 会更慢,而且 <option>-O</option>
+ 和 <option>-O2</option> 之间的优化差别基本上可以忽略。
+ <option>-pipe</option> 让编译器使用管道而不用临时文件进行通信,
+ 这样可以减少磁盘存取 (以内存作为代价)。</para>
+ </listitem>
+
+ <listitem>
+ <para>传递 <option>-j<replaceable>n</replaceable></option> 选项给
+ &man.make.1; 以便并发运行多个进程。
+ 这样就不会考虑您的是否是单个或多个处理器机器。</para>
+ </listitem>
+
+ <listitem><para>存放 <filename>/usr/src</filename> 的文件系统可以使用
+ <option>noatime</option> 选项被装载(或再装载)。
+ 这样会防止文件系统记录文件的存取时间。您可能并不需要这些信息。</para>
+
+ <screen>&prompt.root; <userinput>mount -u -o noatime /usr/src</userinput></screen>
+
+ <warning>
+ <para>这个例子里假定 <filename>/usr/src</filename>
+ 是在它自已的文件系统里。如果不是 (例如假设它是
+ <filename>/usr</filename> 的部分),那么您就需要那个文件系统装载点,
+ 而不是 <filename>/usr/src</filename>。</para>
+ </warning>
+ </listitem>
+
+ <listitem>
+ <para>存放 <filename>/usr/obj</filename> 的文件系统可以使用
+ <option>async</option> 选项被装载(或被再装载)。
+ 这会引起异步写盘。换句话说,写是立即完成了,
+ 而数据要延迟几秒才会写到盘里。这就允许写到一堆,
+ 如此产生戏剧性的性能提高。</para>
+
+ <warning>
+ <para>记住,这个选项会使您的文件系统更加脆弱。
+ 使用这个选项增大了这样一个机率:要是电源断了,
+ 在机器重启后,文件系统将处在不可恢复状态。</para>
+
+ <para>如果在这个文件系统里 <filename>/usr/obj</filename>
+ 是很关键的,这不是问题。如果您有其它有价值的数据在同一个文件系统,
+ 那么在您使用这个选项这前,确认备份一下。</para>
+ </warning>
+
+ <screen>&prompt.root; <userinput>mount -u -o async /usr/obj</userinput></screen>
+
+ <warning>
+ <para>同上,如果 <filename>/usr/obj</filename>
+ 不在自已的文件系统里,使用相关装载点的名字把它从例子里边替换掉。</para>
+ </warning>
+ </listitem>
+ </itemizedlist>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>如果出现了错误我该怎么办?</para>
+ </question>
+
+ <answer>
+ <para>绝对确信您的环境没有先前 build 留下的残余。这点够简单。</para>
+
+ <screen>&prompt.root; <userinput>chflags -R noschg /usr/obj/usr</userinput>
+&prompt.root; <userinput>rm -rf /usr/obj/usr</userinput>
+&prompt.root; <userinput>cd /usr/src</userinput>
+&prompt.root; <userinput>make cleandir</userinput>
+&prompt.root; <userinput>make cleandir</userinput></screen>
+
+ <para>不错,<command>make cleandir</command> 真的要执行两次。</para>
+
+ <para>然后重新开始整个过程,使用 <command>make buildworld</command> 开始。</para>
+
+ <para>如果您还有问题,就把错误和 <command>uname -a</command>
+ 的输出发送到 &a.questions; 邮件列表。准备回答其它关于您的设置的问题!</para>
+ </answer>
+ </qandaentry>
+ </qandaset>
+ </sect2>
+ </sect1>
+
+ <sect1 id="small-lan">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Mike</firstname>
+ <surname>Meyer</surname>
+ <contrib>贡献者</contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>跟踪多台机器</title>
+ <indexterm>
+ <primary>NFS</primary>
+ <secondary>安装多台机器</secondary>
+ </indexterm>
+
+ <para>如果您有多台机器想跟踪同样的源码树,
+ 那么让它们都下载源码并重建所有东西,看起有点浪费资源:
+ 磁盘空间、网络带宽以及 CPU 周期。
+ 解决的办法是让一台机器处理大部分的工作,而其它的机器通过
+ NFS 装载 (mount) 这些工作。这部分列举了一种这样做的方法。</para>
+
+ <sect2 id="small-lan-preliminaries">
+ <title>准备</title>
+
+ <para>首先,确定一批机器,运行的二进制代码是同一套---我们称作
+ <emphasis>建造套件(build set)</emphasis>。每台机器可以有定制内核,
+ 但他们运行的是相同的用户区二进制文件(userland binaries)。
+ 从这个集起,选择一台机器做为 <emphasis>建造机器(build machine)</emphasis>。
+ 这将是用于建造(build)系统和内核的机器。想像一下,它应该是一台快速的机器,
+ 有足够的空余的 CPU 来执行<command>make buildworld</command>。
+ 您也想要选一台机器做为 <emphasis>测试机器(test machine)</emphasis>,
+ 这个将用于软件的更新生成产品之前对他们进行测试。这个
+ <emphasis>必须</emphasis> 是一台您能提供的平时也可使用的机器。
+ 它可以是<quote>建造机器</quote>,但没这个必要。</para>
+
+ <para>在这个<quote>建造套件</quote>里的所有机器需要从同一台机器、
+ 同一个点上装载 <filename>/usr/obj</filename> 和
+ <filename>/usr/src</filename>。理想地,
+ 它们在<quote>建造机器</quote>上的两个不同的驱动器里,
+ 但是在那台机器上可以进行 NFS 装载。如果您有多个<quote>建造套件</quote>,
+ <filename>/usr/src</filename> 应该在某个<quote>建造机器</quote>上,
+ 而在其它机器上进行 NFS 装载。</para>
+
+ <para>最后,确认<quote>建造套件</quote>里所有机器上的
+ <filename>/etc/make.conf</filename> 与<quote>建造机器</quote>里的相同。
+ 这意味着<quote>建造机器</quote>必须建造部分基本系统用于
+ <quote>建造套件</quote>里所有机器的安装。同样,
+ 每台<quote>建造机器</quote>要有它自已的内核名字,使用
+ <filename>/etc/make.conf</filename> 里的 <makevar>KERNCONF</makevar>
+ 进行设置,并且每台<quote>建造机器</quote>应该把它们列在
+ <makevar>KERNCONF</makevar> 里,同时把自已的内核列在最前。
+ <quote>建造机器</quote>的
+ <filename>/usr/src/sys/<replaceable>arch</replaceable>/conf</filename>
+ 里一定要有每台机器的内核配置文件,如果它想建造它们的内核的话。</para>
+ </sect2>
+
+ <sect2>
+ <title>基本系统</title>
+
+ <para>既然所有的妥当了,就准备建造所有的东西。如<xref
+ linkend="make-buildworld">中描述的一样在<quote>建造机器</quote>上建造内核和系统,
+ 但是什么也不安装。在建造结束后,转到<quote>测试机器</quote>上,
+ 安装您刚建造的内核。如果这台机器通过 NFS 装载了
+ <filename>/usr/src</filename> 和 <filename>/usr/obj</filename>,
+ 在您重启到单用户模式里,您需要启动网络然后装载他们。
+ 最简单的方式是启动到多用户模式下,然后执行 <command>shutdown now</command>
+ 转到单用户模式。一旦进入,您就可以安装新的内核和系统,并执行
+ <command>mergemaster</command>,就像平常一样。完成后,
+ 重启返回到一般多用户模式操作这台机器。</para>
+
+ <para>在您确信所有在<quote>测试机器</quote>里都工作正常后,
+ 就使用相同的过程在<quote>建造套件</quote>里的其它机器里安装新的软件。</para>
+ </sect2>
+
+ <sect2>
+ <title>Ports</title>
+
+ <para>类似的想法是使用 ports 树。
+ 第一个关键的步骤是从同一台机子里装载
+ <filename>/usr/ports</filename> 到<quote>建造套件</quote>里的所有机子。
+ 然后正确设置 <filename>/etc/make.conf</filename> 共享
+ distfiles。您应把 <makevar>DISTDIR</makevar> 设置到一个共享的目录里,
+ 那里可以被任何一个 <username>root</username> 用户写入,并且是由您的
+ NFS 装载映射的。设置每一台机子的 <makevar>WRKDIRPREFIX</makevar>
+ 到一个本地建造 (build) 目录。最后,如果您要建造和发布包
+ (packages),那么您应该设置 <makevar>PACKAGES</makevar>
+ 到一个类似于 <makevar>DISTDIR</makevar> 的目录。</para>
+ </sect2>
+ </sect1>
+</chapter>
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/desktop/Makefile b/zh_CN.GB2312/books/handbook/desktop/Makefile
new file mode 100644
index 0000000000..12e0bc3642
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/desktop/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= desktop/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/desktop/chapter.sgml b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml
new file mode 100644
index 0000000000..b161afc285
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml
@@ -0,0 +1,1116 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese Project
+
+ Original Revision: 1.41
+ $FreeBSD$
+-->
+
+<chapter id="desktop">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Christophe</firstname>
+ <surname>Juniet</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>桌面应用</title>
+
+ <sect1 id="desktop-synopsis">
+ <title>概述</title>
+
+ <para>FreeBSD 能够运行相当多桌面应用程序,
+ 象浏览器和字处理软件。这些程序大部分都有 package 或者能从
+ ports 编译。许多新用户希望在桌面上就可以找到这样的应用程序。
+ 本章将介绍如何轻松的从 package 或 ports 安装一些常见的桌面应用程序。</para>
+
+ <para>需要注意的是从 ports 安装意味着要编译源码。根据编译的
+ ports 和电脑速度的不同,这也许需要花费相当长的时间。
+ 若是您觉得编译源码太过于花费时间的话,大部分的 ports
+ 都有预先编译好的版本可以安装。</para>
+
+ <para>因为 FreeBSD 兼容 Linux 二进制的特性,许多原本为 Linux
+ 开发的程序都可以直接用在您的桌面。在安装任何的 Linux
+ 应用程序之前,强烈的推荐您阅读<xref linkend="linuxemu">。
+ 当您在寻找特定的 ports 时,比如使用 &man.whereis.1;
+ 要记得许多利用 Linux 二进制兼容特性的 ports 都以<quote>linux-</quote>开头。
+ 在下面的介绍中,都假设安装 Linux 应用程序前已经开启了 Linux 二进制兼容功能。</para>
+
+ <para>本章涵盖以下种类应用程序:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>浏览器 (例如 <application>Mozilla</application>、
+ <application>&netscape;</application>、
+ <application>Opera</application>、
+ <application>Firefox</application>、
+ <application>Konqueror</application>)</para>
+ </listitem>
+
+ <listitem>
+ <para>办公、图象处理 (例如
+ <application>KOffice</application>、
+ <application>AbiWord</application>、
+ <application>GIMP</application>、
+ <application>OpenOffice.org</application>)</para>
+ </listitem>
+
+ <listitem>
+ <para>文档查看 (例如 <application>&acrobat.reader;</application>、
+ <application>gv</application>、
+ <application>Xpdf</application>、
+ <application>GQview</application>)</para>
+ </listitem>
+
+ <listitem>
+ <para>财务 (例如
+ <application>GnuCash</application>、
+ <application>Gnumeric</application>、
+ <application>Abacus</application>)</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>阅读这章之前,您应该:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>知道如何安装额外的第三方软件(<xref linkend="ports">)。</para>
+ </listitem>
+
+ <listitem>
+ <para>知道如何安装 Linux 软件(<xref linkend="linuxemu">)。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>想要获得更多的有关多媒体环境的信息,请阅读
+ <xref linkend="multimedia">。如果您想要建立和使用电子邮件,
+ 请参考<xref linkend="mail">。</para>
+ </sect1>
+
+ <sect1 id="desktop-browsers">
+ <title>浏览器</title>
+
+ <para>FreeBSD并没有预先安装特定的浏览器。然而,在 ports 的目录 <ulink
+ url="http://www.FreeBSD.org/ports/www.html">www</ulink>
+ 有许多浏览器可以安装。如果您没有时间一一编译它们
+ (有些时候这可能需要花费相当长的时间) 大部分都有 package 可用。</para>
+
+ <para><application>KDE</application> 和
+ <application>GNOME</application> 已经提供 HTML 浏览器。
+ 请参考<xref linkend="x11-wm">得到更多完整的有关设定这些桌面环境的信息。</para>
+
+ <para>如果您想要寻找小型的浏览器,您可以试试看
+ <filename role="package">www/dillo</filename>、
+ <filename role="package">www/links</filename> 或
+ <filename role="package">www/w3m</filename>。</para>
+
+ <para>这一节涉及如下程序:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>程序名称</entry>
+ <entry>资源需求</entry>
+ <entry>安装时间</entry>
+ <entry>主要依赖</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><application>Mozilla</application></entry>
+ <entry>多</entry>
+ <entry>大量时间和空间</entry>
+ <entry><application>Gtk+</application></entry>
+ </row>
+
+ <row>
+ <entry><application>&netscape;</application></entry>
+ <entry>多</entry>
+ <entry>轻松</entry>
+ <entry>兼容Linux Binary</entry>
+ </row>
+
+ <row>
+ <entry><application>Opera</application></entry>
+ <entry>少</entry>
+ <entry>轻松</entry>
+ <entry>同时有可用的 FreeBSD 和 Linux 版本。 Linux 版本需要使用
+ Linux 二进制兼容模块和
+ <application>linux-openmotif</application>。</entry>
+
+ <row>
+ <entry><application>Firefox</application></entry>
+ <entry>中等</entry>
+ <entry>长</entry>
+ <entry><application>Gtk+</application></entry>
+ </row>
+
+ <row>
+ <entry><application>Konqueror</application></entry>
+ <entry>中等</entry>
+ <entry>长</entry>
+ <entry>需要 <application>KDE</application> 库</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <sect2>
+ <title>Mozilla</title>
+ <indexterm>
+ <primary><application>Mozilla</application></primary>
+ </indexterm>
+
+ <para><application>Mozilla</application> 也许是 FreeBSD
+ 桌面上最合适的浏览器了。它新颖稳定,且完整的移植到了
+ FreeBSD。拥有非常合乎标准的 HTML 支持,它也能处理邮件和阅读新闻组。
+ 假如您打算做一个自己的主页的话,它甚至提供一个 HTML 编辑器。
+ <application>&netscape;</application> 的使用者可能觉得它和
+ <application>Communicator</application> 非常相似,
+ 两者有些部分实际上是相通的。</para>
+
+ <para>在 CPU 速度低于 233MHz 或者内存少于 64MB
+ 的老式电脑上,<application>Mozilla</application>
+ 会占用相当多资源而难以使用。您也许可以试试
+ <application>Opera</application> 浏览器,本章稍后将会介绍它。</para>
+
+ <para>也许基于某种原因,您不能或者不想编译
+ <application>Mozilla</application>,FreeBSD GNOME 团队已经为您制作好了
+ package。只需要通过网络安装它:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r mozilla</userinput></screen>
+
+ <para>如果没 package 可用,而您又有足够的时间和磁盘空间,您可以获取
+ <application>Mozilla</application> 的源码来编译并安装它到您的系统上。
+ 执行以下指令既可:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/www/mozilla</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para><application>Mozilla</application> 需要 <username>root</username>
+ 权限执行 chrom 注册来确定正确的初始化。另外,
+ 如果您想要一些额外的插件比如象 mouse gestures,您也必须以
+ <username>root</username> 权限执行 <application>Mozilla</application>
+ 以便正确的安装。</para>
+
+ <para>一旦您完成了 <application>Mozilla</application> 安装,您就再也不需要
+ <username>root</username> 权限了。您可以用如下方式执行
+ <application>Mozilla</application>:</para>
+
+ <screen>&prompt.user; <userinput>mozilla</userinput></screen>
+
+ <para>也可以用如下方式直接运行电子邮件和新闻阅读器:</para>
+
+ <screen>&prompt.user; <userinput>mozilla -mail</userinput></screen>
+ </sect2>
+
+ <sect2 id="moz-java-flash">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>Mozilla、&java; 和 &macromedia; &flash;</title>
+
+ <para>安装 <application>Mozilla</application> 很简单,但是安装
+ <application>Mozilla</application> 的额外支持比如象
+ &java; 和 &macromedia; &flash; 却会消耗很多时间和磁盘空间。</para>
+
+ <para>第一件事就是使用 <application>Mozilla</application>
+ 下载要安装的文件。让您的浏览器连接到 <ulink
+ url="http://www.sun.com/software/java2/download.html"></ulink>,
+ 在他们的页面上建立一个帐户。记得要保存用户名和密码,也许以后会用的着它。
+ 下载 <filename>j2sdk-1_3_1-src.tar.gz</filename> 文件到
+ <filename>/usr/ports/distfiles/</filename> 位置,ports
+ 不会自动的下载它,这是因为许可证的限制。然后从 <ulink
+ url="http://java.sun.com/webapps/download/Display?BundleId=7905"></ulink>
+ 下载<quote>java 环境</quote>。
+ 它的文件名是 <filename>j2sdk-1_3_1_08-linux-i586.bin</filename> 比较大
+ (大约是 25MB!)。象前边一样,这个文件必须放到
+ <filename>/usr/ports/distfiles/</filename>。
+ 最后下载<quote>java patchkit</quote>,它在这里可以找到<ulink
+ url="http://www.eyesbeyond.com/freebsddom/java/"></ulink>,
+ 然后把它放在 <filename>/usr/ports/distfiles/</filename>。</para>
+
+ <para>用标准的 <command>make install clean</command> 安装
+ <filename role="package">java/jdk13</filename> 并且接着安装
+ <filename role="package">www/flashpluginwrapper</filename> port。这个
+ port 需要 <filename role="package">emulators/linux_base</filename>
+ 这个庞大的 port。虽然有其它的 <application>&flash;</application>
+ 插件存在,然而他们对我来说却不能用。</para>
+
+ <para>如果 <application>Mozilla</application> 还没有安装,安装
+ <filename role="package">www/mozilla</filename> port。</para>
+
+ <para>现在用如下方式复制 <application>&flash;</application> 插件:</para>
+
+ <screen>&prompt.root; <userinput>cp /usr/local/lib/flash/libflashplayer.so \
+ /usr/X11R6/lib/browser_plugins/libflashplayer_linux.so</userinput></screen>
+
+ <screen>&prompt.root; <userinput>cp /usr/local/lib/flash/ShockwaveFlash.class \
+ /usr/X11R6/lib/browser_plugins/</userinput></screen>
+
+ <para>把下面这些行加入到 <application>Mozilla</application> 启动脚本
+ <filename>/usr/X11R6/bin/mozilla</filename> 的开头 (在
+ <literal>#!/bin/sh</literal> 之后)。</para>
+
+<programlisting>LD_PRELOAD=/usr/local/lib/libflashplayer.so.1
+export LD_PRELOAD</programlisting>
+
+ <para>这将会启用 <application>&flash;</application> 插件.</para>
+
+ <para>现在只要如下启动 <application>Mozilla</application>:</para>
+
+ <screen>&prompt.user; <userinput>mozilla &amp;</userinput></screen>
+
+ <para>并且从 <guimenu>Help</guimenu> 菜单选取
+ <guimenuitem>About Plug-ins</guimenuitem> 选项,
+ 所有可用的插件列表就会出现。<application>&java;</application> 和
+ <application>&shockwave; &flash;</application> 应该都会被列出。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>&netscape;</title>
+ <indexterm>
+ <primary><application>Netscape</application></primary>
+ </indexterm>
+
+ <para>ports collection 里包含数个版本的 &netscape;
+ 浏览器。因为 FreeBSD 版本包含有一个严重的安全问题,
+ 强烈建议不要安装它们。作为替代,使用最近的 Linux 或者其它
+ UNIX 版本。</para>
+
+ <para>最新的稳定版的 &netscape; 浏览器是
+ <application>&netscape; 7</application>。它可以从
+ ports collection 安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/www/netscape7</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>在 French、German 和 Japanese 目录下,也有本地化过的版本。</para>
+
+ <caution>
+ <para>不推荐您使用 <application>&netscape; 4.x</application>
+ 版本,因为它已经不适应当今的标准。然而,
+ <application>&netscape; 7.x</application>
+ 和最新的版本只可以使用在 &i386; 平台。</para>
+ </caution>
+ </sect2>
+
+ <sect2>
+ <title>Opera</title>
+ <indexterm>
+ <primary><application>Opera</application></primary>
+ </indexterm>
+
+ <para><application>Opera</application> 是一个快速、拥有许多特性,
+ 和标准兼容的浏览器。它有两个版本:<quote>native</quote>FreeBSD
+ 版本和一个可运行在 Linux 模拟器下的版本。对于每个操作系统,
+ 它都有一个免费的但是有广告和一个没有广告但是必须向 <ulink
+ url="http://www.opera.com/">Opera web site</ulink> 付费的版本。</para>
+
+ <para>要使用 <application>Opera</application> 的 FreeBSD
+ 版本来浏览网页,安装以下的 package:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r opera</userinput></screen>
+
+ <para>有些 FTP 站点没有所有版本的 package,您也可以通过 ports collection 来安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/www/opera</userinput> &prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>要安装 Linux 版本的
+ <application>Opera</application>,将上面例子中的
+ <literal>opera</literal> 替换为 <literal>linux-opera</literal>。Linux
+ 版本在某些情况下非常有用,象是使用只有 Linux 版本的插件,例如 <application>Adobe
+ &acrobat.reader;</application>。不然的话在其它方面,
+ FreeBSD 和 Linux 版本是完全一样的。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>Firefox</title>
+ <indexterm>
+ <primary><application>Firefox</application></primary>
+ </indexterm>
+
+ <para><application>Firefox</application> 是基于
+ <application>Mozilla</application> 代码基础的的下一代浏览器。
+ <application>Mozilla</application> 是一个完整的应用程序套件,
+ 包括比如浏览器、邮件客户端、聊天客户端等等。
+ <application>Firefox</application> 只是一个浏览器,
+ 所以更小、更快。</para>
+
+ <para>安装软件包键入:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r firefox</userinput></screen>
+
+ <para>如果您更喜欢从源代码编译,也可以使用 ports collection:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/www/firefox</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+ <sect2>
+ <title>Konqueror</title>
+ <indexterm>
+ <primary><application>Konqueror</application></primary>
+ </indexterm>
+
+ <para><application>Konqueror</application> 是
+ <application>KDE</application> 的一部分,不过也可以通过安装
+ <filename role="package">x11/kdebase3</filename>
+ 在非 <application>KDE</application> 环境下使用。
+ <application>Konqueror</application> 不止是一个浏览器,
+ 也是一个文件管理器和多媒体播放器。</para>
+
+ <para><application>Konqueror</application> 也带有丰富的插件,
+ 可以在 <filename role="package">misc/konq-plugins</filename> 下面找到。</para>
+
+ <para><application>Konqueror</application> 也支持 <application>&flash;</application>,
+ 可以在 <ulink url="http://freebsd.kde.org/howto.php"></ulink> 找到一个 How To。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="desktop-productivity">
+ <title>办公、图象处理</title>
+
+ <para>当需要进行办公或者进行图象处理时,
+ 新用户通常都会找一些好用的办公套件或者字处理软件。目前有一些<link
+ linkend="x11-wm">桌面环境</link>比如象
+ <application>KDE</application> 已经提供了办公套件。
+ FreeBSD 提供所有的要求,桌面环境也不例外。</para>
+
+ <para>这节涉及如下程序:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>软件名称</entry>
+ <entry>资源需求</entry>
+ <entry>安装时间</entry>
+ <entry>主要依赖</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><application>KOffice</application></entry>
+ <entry>少</entry>
+ <entry>多</entry>
+ <entry><application>KDE</application></entry>
+ </row>
+
+ <row>
+ <entry><application>AbiWord</application></entry>
+ <entry>少</entry>
+ <entry>少</entry>
+ <entry><application>Gtk+</application> 或 <application>GNOME</application></entry>
+ </row>
+
+ <row>
+ <entry><application>The Gimp</application></entry>
+ <entry>少</entry>
+ <entry>长</entry>
+ <entry><application>Gtk+</application></entry>
+ </row>
+
+ <row>
+ <entry><application>OpenOffice.org</application></entry>
+ <entry>多</entry>
+ <entry>长</entry>
+ <entry><application>GCC 3.1</application>、<application>&jdk; 1.3</application>、<application>Mozilla</application></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <sect2>
+ <title>KOffice</title>
+ <indexterm>
+ <primary><application>KOffice</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary>办公套件</primary>
+ <secondary><application>KOffice</application></secondary>
+ </indexterm>
+
+ <para><application>KDE</application> 社区提供了一套办公套件,
+ 它能用在桌面环境。它包含四个标准的组件,这些组件可以在其它办公套件中找到。
+ <application>KWord</application> 是字处理程序、
+ <application>KSpread</application> 是电子表格程序、
+ <application>KPresenter</application> 是演示文档制作管理程序、
+ <application>Kontour</application>是矢量绘图软件。</para>
+
+ <para>安装最新的
+ <application>KOffice</application> 之前,先确定您是否安装了最新版的
+ <application>KDE</application>。</para>
+
+ <para>使用 package 来安装 <application>KOffice</application>,安装细节如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r koffice</userinput></screen>
+
+ <para>如果没有可用的 package,您可以使用 ports collection 安装。
+ 安装 <application>KDE3</application> 的
+ <application>KOffice</application> 版本,如下:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/editors/koffice-kde3</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>AbiWord</title>
+ <indexterm>
+ <primary><application>AbiWord</application></primary>
+ </indexterm>
+
+ <para><application>AbiWord</application> 是一个免费的字处理程序,它看起来和
+ <application>&microsoft; Word</application> 的感觉很相似。
+ 它适合用来打印文件、信函、报告、备忘录等等,
+ 它非常快且包含许多特性,并且非常容易使用。</para>
+
+ <para><application>AbiWord</application> 可以导入或输出很多文件格式,
+ 包括一些象 Microsoft<filename>.doc</filename> 格式的文件。</para>
+
+ <para><application>AbiWord</application> 也有 package
+ 的安装方式。您可以用以下方法安装:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r AbiWord2</userinput></screen>
+
+ <para>如果没有可用的 package,它也可以从 ports collection 编译。ports
+ collection 应该是最新的。它的安装方式如下:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/editors/AbiWord2</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>GIMP</title>
+ <indexterm>
+ <primary><application>GIMP</application></primary>
+ </indexterm>
+
+ <para>对图象的编辑或者加工,
+ <application>GIMP</application> 是一个非常精通图象处理的软件。
+ 它可以被用来当作简单的绘图程序或者一个专业的照片处理套件。
+ 它支持大量的插件和具有脚本界面的特性。
+ <application>GIMP</application> 可以读写众多的文件格式,
+ 支持扫描仪和手写板。</para>
+
+ <para>您可以用下列命令安装:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r gimp</userinput></screen>
+
+ <para>如果您在 FTP 站点没有找到这个 package,您也可以使用
+ ports collection 的方法安装。ports 的 <ulink
+ url="http://www.FreeBSD.org/ports/graphics.html">graphics</ulink>
+ 目录也包含有 <application>Gimp 手册</application>。
+ 以下是安装它们的方法:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/graphics/gimp1</userinput>
+&prompt.root; <userinput>make install clean</userinput> &prompt.root; <userinput>cd /usr/ports/graphics/gimp-manual-pdf</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <note>
+ <para>ports 中的 <ulink
+ url="http://www.FreeBSD.org/ports/graphics.html">graphics</ulink>
+ 目录也有开发中的 <application>GIMP</application> 版本
+ <filename role="package">graphics/gimp-devel</filename>。
+ <application>Gimp 手册</application>的 HTML 和 &postscript; 版本在
+ <filename role="package">graphics/gimp-manual-html</filename> 和
+ <filename role="package">graphics/gimp-manual-ps</filename>。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>OpenOffice.org</title>
+ <indexterm>
+ <primary><application>OpenOffice.org</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary>办公套件</primary>
+ <secondary><application>OpenOffice.org</application></secondary>
+ </indexterm>
+
+ <para><application>OpenOffice.org</application> 包括一套完整的办公套件:
+ 一个字处理程序、一个电子表格程序、一个演示文档管理程序和一个绘图程序。
+ 它和其它的办公套件的特征非常相似,它可以导入输出不同的流行的文件格式。
+ 它包括一些不同的语言界面、拼写检查和字典。</para>
+
+ <para><application>OpenOffice.org</application> 的字处理程序使用 XML
+ 文件格式使它增加了可移植性和灵活性。电子表格程序支持宏语言和使用外来的数据库界面。
+ <application>OpenOffice.org</application> 已经可以平稳的运行在
+ &windows;、&solaris;、Linux、FreeBSD
+ 和 &macos;&nbsp;X 等各种操作系统下。更多的有关
+ <application>OpenOffice.org</application> 的信息您可以在
+ <ulink url="http://www.openoffice.org/">OpenOffice网页</ulink>找到。
+ 对于特定的 FreeBSD 版本的信息,您可以在直接在 <ulink
+ url="http://porting.openoffice.org/freebsd/">FreeBSD OpenOffice
+ 移植团队</ulink>的页面下载。</para>
+
+ <para>安装 <application>OpenOffice.org</application> 方法如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r openoffice</userinput></screen>
+
+ <para>一旦 package 被安装,您必须运行 setup 程序并且选择一个
+ <option>标准的工作站设置</option>。运行下面的命令来使用
+ <application>OpenOffice.org</application>:</para>
+
+ <screen>&prompt.user; <userinput>openoffice-setup</userinput></screen>
+
+ <para>如果没有可用的 <application>OpenOffice.org</application>
+ package,您仍旧可以选择编译 port。然而,
+ 您必须记住它的要求以及大量的磁盘空间和相当长的时间编译。</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/editors/openoffice</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>一旦这个完成,运行
+ <application>OpenOffice.org</application> setup 设置程序并且选择一个
+ <option>标准的工作站设置</option> 如下:</para>
+
+ <screen>&prompt.user; <userinput>cd /usr/ports/editors/openoffice</userinput>
+&prompt.user; <userinput>make install-user</userinput></screen>
+
+ <para>如果您想要使用一个本地化的版本,有如下一些 ports 可用:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="2*">
+ <thead>
+ <row>
+ <entry>语言</entry>
+ <entry>Port</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>阿拉伯语</entry>
+ <entry><filename role="package">editors/openoffice-ar</filename></entry>
+ </row>
+
+ <row>
+ <entry>丹麦语</entry>
+ <entry><filename role="package">editors/openoffice-dk</filename></entry>
+ </row>
+
+ <row>
+ <entry>西班牙语</entry>
+ <entry><filename role="package">editors/openoffice-es</filename></entry>
+ </row>
+
+ <row>
+ <entry>希腊语</entry>
+ <entry><filename role="package">editors/openoffice-gr</filename></entry>
+ </row>
+
+ <row>
+ <entry>意大利语</entry>
+ <entry><filename role="package">editors/openoffice-it</filename></entry>
+ </row>
+
+ <row>
+ <entry>荷兰语</entry>
+ <entry><filename role="package">editors/openoffice-nl</filename></entry>
+ </row>
+
+ <row>
+ <entry>瑞典语</entry>
+ <entry><filename role="package">editors/openoffice-se</filename></entry>
+ </row>
+
+ <row>
+ <entry>土耳其语</entry>
+ <entry><filename role="package">editors/openoffice-tr</filename></entry>
+ </row>
+
+ <row>
+ <entry>法语</entry>
+ <entry><filename role="package">french/openoffice</filename></entry>
+ </row>
+
+ <row>
+ <entry>德语</entry>
+ <entry><filename role="package">german/openoffice</filename></entry>
+ </row>
+
+ <row>
+ <entry>日语</entry>
+ <entry><filename role="package">japanese/openoffice</filename></entry>
+ </row>
+
+ <row>
+ <entry>韩国语</entry>
+ <entry><filename role="package">korean/openoffice</filename></entry>
+ </row>
+
+ <row>
+ <entry>波兰语</entry>
+ <entry><filename role="package">polish/openoffice</filename></entry>
+ </row>
+
+ <row>
+ <entry>葡萄牙语</entry>
+ <entry><filename role="package">portuguese/openoffice</filename></entry>
+ </row>
+
+ <row>
+ <entry>俄语</entry>
+ <entry><filename role="package">russian/openoffice</filename></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+ </sect1>
+
+ <sect1 id="desktop-viewers">
+ <title>文档查看器</title>
+
+ <para>一些新的文档格式近来得到流行。它们所需要的标准查看器可能不一定在系统内。
+ 在本节我们将了解如何安装它们。</para>
+
+ <para>这节涵盖如下应用程序:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>软件名称</entry>
+ <entry>资源需求</entry>
+ <entry>安装时间</entry>
+ <entry>主要依赖</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><application>&acrobat.reader;</application></entry>
+ <entry>少</entry>
+ <entry>少</entry>
+ <entry>Linux二进制兼容</entry>
+ </row>
+
+ <row>
+ <entry><application>gv</application></entry>
+ <entry>少</entry>
+ <entry>少</entry>
+ <entry><application>Xaw3d</application></entry>
+ </row>
+
+ <row>
+ <entry><application>Xpdf</application></entry>
+ <entry>少</entry>
+ <entry>少</entry>
+ <entry><application>FreeType</application></entry>
+ </row>
+
+ <row>
+ <entry><application>GQview</application></entry>
+ <entry>少</entry>
+ <entry>少</entry>
+ <entry><application>Gtk+</application> 或 <application>GNOME</application></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <sect2>
+ <title>&acrobat.reader;</title>
+ <indexterm>
+ <primary><application>Acrobat Reader</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary>PDF</primary>
+ <secondary>查看器</secondary>
+ </indexterm>
+
+ <para>现在许多文档都用 PDF 格式,
+ 根据<quote>轻便小巧文档格式</quote>的定义。一个被建议使用的查看器是
+ <application>&acrobat.reader;</application>,由 Adobe 所发行的
+ Linux 版本。因为 FreeBSD 能够运行 Linux 二进制文件,
+ 所以它也可以用在 FreeBSD 中。</para>
+
+ <para>安装 <application>&acrobat.reader; 5</application>
+ package,如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r acroread5</userinput></screen>
+
+ <para>通常, 如果 package 不可用或者您想要一个最新的版本,
+ 您可以用 ports collection 来安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/print/acroread5</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <note><para><application>&acrobat.reader;</application> 有几个不同的版本可用。
+ 在写这个的同时它们已经有如下版本:
+ <filename role="package">print/acroread</filename> (version 3.0.2)、
+ <filename role="package">print/acroread4</filename> (version 4.0.5) 和
+ <filename role="package">print/acroread5</filename> (version 5.0.6)。
+ 它们不全是都有 package 给您现在版本的 FreeBSD 使用。ports
+ collection 总是包含最新的版本。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>gv</title>
+ <indexterm>
+ <primary><application>gv</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary>PDF</primary>
+ <secondary>查看器</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>PostScript</primary>
+ <secondary>查看器</secondary>
+ </indexterm>
+
+ <para><application>gv</application> 是 &postscript; 和
+ PDF 文件格式查看器。它源自 <application>ghostview</application>
+ 因为使用 <application>Xaw3d</application> 函数库让它看起来更美观。
+ 它很快而且界面很干净。<application>gv</application>
+ 有很多特性比如象纸张大小、刻度或者抗锯齿。
+ 大部分操作都可以用键盘或鼠标完成。</para>
+
+ <para>安装 <application>gv</application> package,如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r gv</userinput></screen>
+
+ <para>如果您没有可用的 package,您可以使用 ports collection 安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/print/gv</userinput> &prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>Xpdf</title>
+ <indexterm>
+ <primary><application>Xpdf</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary>PDF</primary>
+ <secondary>查看器</secondary>
+ </indexterm>
+
+ <para>如果您想要一个小型的 FreeBSD PDF 查看器,
+ <application>Xpdf</application> 是一个小巧并且高效的查看器。
+ 它只需要很少的资源而且非常稳定。它使用标准的 X
+ 字体并且不需要 <application>&motif;</application> 或者其它的
+ X 工具包。</para>
+
+ <para>安装 <application>Xpdf</application> package,使用如下命令:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r xpdf</userinput></screen>
+
+ <para>如果 package 不可用或者您宁愿使用 ports collection,如下:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/graphics/xpdf</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>一旦安装完成,您就可以启动
+ <application>Xpdf</application> 并且使用鼠标右键来使用菜单。</para>
+ </sect2>
+
+ <sect2>
+ <title>GQview</title>
+ <indexterm>
+ <primary><application>GQview</application></primary>
+ </indexterm>
+
+ <para><application>GQview</application> 是一个图片管理器。
+ 您可以单击鼠标来观看一个文件、开启一个外部编辑器、
+ 使用预览和更多的功能。它也有幻灯片播放模式和一些基本的文件操作。
+ 您可以管理采集的图片并且很容易找到重复的。
+ <application>GQview</application> 可以全屏幕观看并且支持国际化。</para>
+
+ <para>如果您想要安装
+ <application>GQview</application> package,如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r gqview</userinput></screen>
+
+ <para>如果您没有可用的 package 或者您宁愿使用 ports collection,如下:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/graphics/gqview</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+ </sect1>
+
+ <sect1 id="desktop-finance">
+ <title>财务</title>
+
+ <para>假如,基于任何的理由,您想要在 FreeBSD Desktop
+ 管理您个人的财政,有一些强大并且易于使用的软件可以被您选择安装。
+ 它们中的一些与流行的文件格式兼容象
+ <application><trademark class="registered">Quicken</trademark></application>
+ 或 <application>Excel</application> 文件。</para>
+
+ <para>本节涵盖如下软件:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>软件名称</entry>
+ <entry>资源需求</entry>
+ <entry>安装时间</entry>
+ <entry>主要依赖</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><application>GnuCash</application></entry>
+ <entry>少</entry>
+ <entry>长</entry>
+ <entry><application>GNOME</application></entry>
+ </row>
+
+ <row>
+ <entry><application>Gnumeric</application></entry>
+ <entry>少</entry>
+ <entry>长</entry>
+ <entry><application>GNOME</application></entry>
+ </row>
+
+ <row>
+ <entry><application>Abacus</application></entry>
+ <entry>少</entry>
+ <entry>少</entry>
+ <entry><application>Tcl/Tk</application></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <sect2>
+ <title>GnuCash</title>
+ <indexterm>
+ <primary><application>GnuCash</application></primary>
+ </indexterm>
+
+ <para><application>GnuCash</application> 是
+ <application>GNOME</application> 的一部分,<application>GNOME</application>
+ 致力于为最终用户提供用户友好且功能强大的软件。使用
+ <application>GnuCash</application>,您可以关注您的收入和开支、您的银行帐户,
+ 或者您的股票。它的界面特性看起来非常的专业。</para>
+
+ <para><application>GnuCash</application> 提供一个智能化的注册、帐户分级系统、
+ 很多键盘快捷方式和自动完成方式。它能分开一个单个的处理到几个详细的部分。
+ <application>GnuCash</application> 能导入和合并
+ <application>Quicken</application> QIF 文件格式。
+ 它也支持大部分的国际日期和流行的格式。</para>
+
+ <para>安装 <application>GnuCash</application> 到您的系统,如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r gnucash</userinput></screen>
+
+ <para>如果 package 不可用,您可以使用 ports collection 安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/finance/gnucash</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>Gnumeric</title>
+ <indexterm>
+ <primary><application>Gnumeric</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary>电子表格</primary>
+ <secondary><application>Gnumeric</application></secondary>
+ </indexterm>
+
+ <para><application>Gnumeric</application> 是一个电子表格程序,
+ <application>GNOME</application> 桌面环境的一部分。
+ 它以通过元素格式和许多片断的自动填充系统来方便的自动<quote>猜测</quote>用户输入而著称。
+ 它能导入一些流行的文件格式,比如象 <application>Excel</application>、
+ <application>Lotus 1-2-3</application> 或 <application>Quattro Pro</application>。
+ <application>Gnumeric</application> 凭借 <filename
+ role="package">math/guppi</filename> 支持图表。
+ 它有大量的嵌入函数和允许所有通常比如象、数字、货币、日期、
+ 时间等等的一些单元格式。</para>
+
+ <para>安装 <application>Gnumeric</application> package,如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r gnumeric</userinput></screen>
+
+ <para>如果 package 不可用,您可以使用 ports collection 安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/math/gnumeric</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>Abacus</title>
+ <indexterm>
+ <primary><application>Abacus</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary>spreadsheet</primary>
+ <secondary><application>Abacus</application></secondary>
+ </indexterm>
+
+ <para><application>Abacus</application> 是一个小巧易用的电子表格程序。
+ 它包含许多嵌入函数在一些领域如统计学、财务和数学方面很有帮助。
+ 它能导入和输出 <application>Excel</application> 文件格式。
+ <application>Abacus</application> 可以产生 &postscript;
+ 输出。</para>
+
+ <para>安装 <application>Abacus</application> package,如下:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r abacus</userinput></screen>
+
+ <para>如果 package 不可用,您可以使用 ports collection 安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/deskutils/abacus</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+ </sect2>
+ </sect1>
+
+ <sect1 id="desktop-summary">
+ <title>总结</title>
+
+ <para>当 FreeBSD 因为它的效能和稳定而在 ISP 之间流行时,
+ 它也可以完全应用在桌面环境。拥有数以千计的
+ <ulink url="http://www.FreeBSD.org/where.html">packages</ulink> 或者
+ <ulink url="http://www.FreeBSD.org/ports/index.html">ports</ulink>,
+ 您可以为您的需要建立完美的桌面环境。</para>
+
+ <para>一旦您完成了您的桌面环境的安装,您可能想要进一步了解
+ <filename role="package">misc/instant-workstation</filename>。
+ <quote>meta-port</quote> 允许您为一个工作站建立一个定制的 ports 设置。您可以编辑
+ <filename>/usr/ports/misc/instant-workstation/Makefile</filename> 定制它。
+ 接着是缺省添加和删除 ports 的语法,和使用通常的步骤建立它。
+ 最后,您将能建立一个适合您自己桌面的大的 package
+ 并在您的其它的工作站上安装它!</para>
+
+ <para>下面是本章涉及到的所有的软件的快速回顾:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>软件名称</entry>
+ <entry>Package 名称</entry>
+ <entry>Ports 名称</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><application>Mozilla</application></entry>
+ <entry><literal>mozilla</literal></entry>
+ <entry><filename role="package">www/mozilla</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>&netscape;</application></entry>
+ <entry><literal>linux-netscape7</literal></entry>
+ <entry><filename role="package">www/netscape7</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>Opera</application></entry>
+ <entry><literal>linux-opera</literal></entry>
+ <entry><filename role="package">www/linux-opera</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>Firefox</application></entry>
+ <entry><literal>firefox</literal></entry>
+ <entry><filename role="package">www/firefox</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>KOffice</application></entry>
+ <entry><literal>koffice-kde3</literal></entry>
+ <entry><filename role="package">editors/koffice-kde3</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>AbiWord</application></entry>
+ <entry><literal>AbiWord-gnome</literal></entry>
+ <entry><filename role="package">editors/AbiWord</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>The GIMP</application></entry>
+ <entry><literal>gimp</literal></entry>
+ <entry><filename role="package">graphics/gimp1</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>OpenOffice.org</application></entry>
+ <entry><literal>openoffice</literal></entry>
+ <entry><filename role="package">editors/openoffice</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>&acrobat.reader;</application></entry>
+ <entry><literal>acroread5</literal></entry>
+ <entry><filename role="package">print/acroread5</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>gv</application></entry>
+ <entry><literal>gv</literal></entry>
+ <entry><filename role="package">print/gv</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>Xpdf</application></entry>
+ <entry><literal>xpdf</literal></entry>
+ <entry><filename role="package">graphics/xpdf</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>GQview</application></entry>
+ <entry><literal>gqview</literal></entry>
+ <entry><filename role="package">graphics/gqview</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>GnuCash</application></entry>
+ <entry><literal>gnucash</literal></entry>
+ <entry><filename role="package">finance/gnucash</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>Gnumeric</application></entry>
+ <entry><literal>gnumeric</literal></entry>
+ <entry><filename role="package">math/gnumeric</filename></entry>
+ </row>
+
+ <row>
+ <entry><application>Abacus</application></entry>
+ <entry><literal>abacus</literal></entry>
+ <entry><filename role="package">deskutils/abacus</filename></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/disks/Makefile b/zh_CN.GB2312/books/handbook/disks/Makefile
new file mode 100644
index 0000000000..7f815d8d4d
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/disks/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= disks/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/disks/chapter.sgml b/zh_CN.GB2312/books/handbook/disks/chapter.sgml
new file mode 100644
index 0000000000..565af7caea
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/disks/chapter.sgml
@@ -0,0 +1,3353 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.221
+ $FreeBSD$
+-->
+
+<chapter id="disks">
+ <title>存储</title>
+
+ <sect1 id="disks-synopsis">
+ <title>概述</title>
+
+
+ <para>这章介绍了 FreeBSD 中磁盘的使用方法。包括内存盘,
+ 网络附属磁盘和标准的 SCSI/IDE 存储设备,以及使用 USB 的设备。</para>
+
+ <para>读完这章,您将了解到:</para>
+ <itemizedlist>
+ <listitem><para>FreeBSD 中用来描述硬盘上数据组织的术语 (partitions and slices)。</para>
+ </listitem>
+ <listitem><para>如何在您的系统上增加硬盘。</para>
+ </listitem>
+ <listitem>
+ <para>如何配置 &os; 来使用 USB 存储设备。</para>
+ </listitem>
+ <listitem><para>如何设置虚拟文件系统,例如内存磁盘。</para></listitem>
+ <listitem>
+ <para>如何使用配额来限制磁盘空间的使用。</para>
+ </listitem>
+ <listitem>
+ <para>如何增加磁盘安全来预防功击。</para>
+ </listitem>
+ <listitem>
+ <para>如何刻录 CD 和 DVD 。</para>
+ </listitem>
+ <listitem>
+ <para>用于备份的多种存储媒介。</para>
+ </listitem>
+ <listitem>
+ <para>如何在 FreeBSD 上使用备份程序。</para>
+ </listitem>
+ <listitem>
+ <para>如何备份到软磁盘。</para>
+ </listitem>
+ <listitem>
+ <para>怎样高效的来使用这些概要信息。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在读这章之前,您应该:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>知道怎样去配置和安装新的 FreeBSD 内核
+ (<xref linkend="kernelconfig">).</para>
+ </listitem>
+ </itemizedlist>
+
+ </sect1>
+
+ <sect1 id="disks-naming">
+ <title>设备命名</title>
+
+ <para>下面是在 FreeBSD 上被支持的物理存储设备和它们被分配的设备名。</para>
+
+ <table id="disk-naming-physical-table" frame="none">
+ <title>物理磁盘命名规则</title>
+
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>驱动器类型</entry>
+ <entry>驱动设备命名</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>IDE hard drives</entry>
+ <entry><literal>ad</literal></entry>
+ </row>
+ <row>
+ <entry>IDE CDROM drives</entry>
+ <entry><literal>acd</literal></entry>
+ </row>
+ <row>
+ <entry>SCSI hard drives and USB Mass storage devices</entry>
+ <entry><literal>da</literal></entry>
+ </row>
+ <row>
+ <entry>SCSI CDROM drives</entry>
+ <entry><literal>cd</literal></entry>
+ </row>
+ <row>
+ <entry>Assorted non-standard CDROM drives</entry>
+ <entry><literal>mcd</literal> for Mitsumi CD-ROM,
+ <literal>scd</literal> for Sony CD-ROM,
+ <literal>matcd</literal> for Matsushita/Panasonic CD-ROM
+ <footnote>
+ <para>&man.matcd.4; 驱动从 2002 年 10 月 5 日已经从
+ FreeBSD&nbsp;4.X 分支删去,并且 FreeBSD&nbsp;5.0 和
+ 5.1 版本也不再包含此驱动。但是从 2003 年 6 月16 日此
+ 驱动又被包含进 FreeBSD&nbsp;5.X 分支。</para>
+ </footnote>
+ </entry>
+ </row>
+ <row>
+ <entry>Floppy drives</entry>
+ <entry><literal>fd</literal></entry>
+ </row>
+ <row>
+ <entry>SCSI tape drives</entry>
+ <entry><literal>sa</literal></entry>
+ </row>
+ <row>
+ <entry>IDE tape drives</entry>
+ <entry><literal>ast</literal></entry>
+ </row>
+ <row>
+ <entry>Flash drives</entry>
+ <entry><literal>fla</literal> for &diskonchip; Flash device</entry>
+ </row>
+ <row>
+ <entry>RAID drives</entry>
+ <entry><literal>aacd</literal> for &adaptec; AdvancedRAID,
+ <literal>mlxd</literal> and <literal>mlyd</literal>
+ for &mylex;,
+ <literal>amrd</literal> for AMI &megaraid;,
+ <literal>idad</literal> for Compaq Smart RAID,
+ <literal>twed</literal> for &tm.3ware; RAID.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+
+ <sect1 id="disks-adding">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>David</firstname>
+ <surname>O'Brien</surname>
+ <contrib>Originally contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 26 Apr 1998 -->
+ </sect1info>
+
+ <title>添加磁盘</title>
+
+ <indexterm>
+ <primary>磁盘</primary>
+ <secondary>添加</secondary>
+ </indexterm>
+
+ <para>假设我们要给一台只有一个磁盘的机器增加一个新的 SCSI 磁盘。首先
+ 需要关掉计算机,然后按操作规程来安装驱动器,控制器和驱动程序。由于
+ 各厂家生产的产品各不相同,具体的安装细节不在此文档介绍之内。</para>
+
+ <para>以 <username>root</username> 用户登录。安装完驱动后,检查一下
+ <filename>/var/run/dmesg.boot</filename> 有没有找到新的磁盘。在我们
+ 的例子中新增加的磁盘就是 <devicename>da1</devicename>,我们从
+ <filename>/1</filename> 挂上它。 (如果您正添加一个 IDE 驱动器,在
+ 4.0 版以前的系统里是 <devicename>wd1</devicename>,以后的版本的系
+ 统里是 <devicename>ad1</devicename> )。</para>
+
+ <indexterm><primary>
+ partitions</primary></indexterm>
+ <indexterm><primary>slices</primary></indexterm>
+ <indexterm>
+ <primary><command>fdisk</command></primary>
+ </indexterm>
+
+ <para>因为 FreeBSD 运行在 IBM-PC 兼容机上,它必须遵循 PC BIOS 分区
+ 规范。这与传统的 BSD 分区是不同的。一个 PC 的磁盘最高只能有四个 BIOS
+ 主分区。如果磁盘只安装 FreeBSD 您可以使用 <emphasis>dedicated</emphasis>
+ 模式。另外, FreeBSD 必须安装在 PC BIOS 支持的分区内。FreeBSD 把分区叫作
+ <emphasis>slices</emphasis> 这可能会把人搞糊涂。您也可以在只安装
+ FreeBSD 的磁盘上使用 slices,也可以在安装有其它操作系统的磁盘上使用
+ slices。这不会影响其它操作系统的 <command>fdisk</command> 分区工具。
+ </para>
+
+ <para>在 slice 方式表示下,驱动器被添加到 <filename>/dev/da1s1e</filename>。
+ 可以读作:SCSI 磁盘,编号为 1 (第二个SCSI 磁盘), slice 1 (PC BIOS 分区 1),
+ 的 BSD 分区 <filename>e</filename> 。在有些例子中,也可以简化为
+ <filename>/dev/da1e</filename>。</para>
+
+ <para>由于 &man.bsdlabel.8; (在 &os;&nbsp;4.X 中叫做 &man.disklabel.8;)
+ 使用 32-位 的整数来表示扇区号, 因此在多数情况下它的表现力限于每个磁盘
+ 2^32-1 个扇区或 2TB。 &man.fdisk.8; 格式允许的起始扇区号不能高于
+ 2^32-1 而分区长度也不能大于 2^32-1, 通常情况下这限制了分区大小最大为
+ 2TB 而磁盘大小则是 4TB。 &man.sunlabel.8; 格式的限制是每个分区
+ 2^32-1 个扇区, 但允许 8 个分区因此最大支持 16TB 的磁盘。
+ 要使用更大的分区, 则应使用 &man.gpt.8;。</para>
+
+ <sect2>
+ <title>使用 &man.sysinstall.8;</title>
+ <indexterm>
+ <primary><application>sysinstall</application></primary>
+ <secondary>adding disks</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>su</primary>
+ </indexterm>
+ <procedure>
+ <step>
+ <title>使用 <application>Sysinstall</application></title>
+
+ <para>您可以使用 <command>/stand/sysinstall</command> 命令,
+ 选择它的使用菜单来分区和标记一个新的磁盘。需要有 root 权限,
+ 或者直接使用 <username>root</username> 账户登录或者使用
+ <command>su</command> 命令来切换到根用户。运行
+ <command>/stand/sysinstall</command> ,然后选择
+ <literal>Configure</literal> 菜单。在
+ <literal>FreeBSD Configuration Menu</literal> 下,上下滚动,
+ 选择 <literal>Fdisk</literal> 条目。</para>
+ </step>
+
+ <step>
+ <title><application>fdisk</application> 分区编辑器</title>
+ <para>进入 <application>fdisk</application> 分区编辑器后,选择
+ <userinput>A</userinput> ,FreeBSD 将使用全部的磁盘。当被告知
+ <quote>remain cooperative with any future possible operating
+ systems</quote>时,回答 <literal>YES</literal>。使用
+ <userinput>W</userinput> 保存刚才的修改。现在使用 <userinput>q</userinput>
+ 退出 FDISK 编辑器。下面会看到有关主引导区的信息。现在您已经在
+ 运行的系统上添加了一个磁盘,就选择 <literal>None</literal>。</para>
+ </step>
+
+ <step>
+ <title>Disk Label 编辑器</title>
+ <indexterm><primary>BSD partitions</primary></indexterm>
+
+ <para>接下来,您应该退出 <application>sysinstall</application>
+ 并且再次启动它,并按照上面的步骤直接进入
+ <literal>Label</literal> 选项。进入 <literal>磁盘标签编辑器</literal>。
+ 这就是您要创建的 BSD 分区。一个磁盘最多可以有 8 个分区,标记为
+ <literal>a-h</literal>。有几个分区标签有特殊的用途。
+ <literal>a</literal> 分区被用来作为根分区(<filename>/</filename>)。
+ 系统磁盘(例如:从那儿启动的分区)必须有一个 <literal>a</literal>
+ 分区。<literal>b</literal> 分区被用作交换分区,可以用很多磁盘用作交
+ 换分区。 <literal>c</literal> 分区代表整个硬盘,或在 FreeBSD slice
+ 模式下代表整个 slice。其它分区作为一般分区来使用。</para>
+
+ <para><application>sysinstall</application> 的标签编辑器用 <literal>e</literal>
+ 表示非 root 和非 swap 分区。在标签编辑器中,可以使用键入<userinput>C</userinput>
+ 创建一个文件系统。当提示这是否是一个 FS(文件系统)或 swap 时,选择
+ <literal>FS</literal>,然后给出一个加载点(如: <filename>/mnt</filename>)。
+ 当在 post-install 模式时添加一个磁盘, <application>sysinstall</application>
+ 不会在 <filename>/etc/fstab</filename> 中创建记录,所以是否指定加载点并不重要。
+ </para>
+
+ <para>现在已经准备把新标签写到磁盘上,然后创建一个文件系统,可以按下
+ <userinput>W</userinput>。出现任何错误都会不能创建新的分区。可以退出标签编辑
+ 器然后重新执行 <application>sysinstall</application> 。</para>
+ </step>
+
+ <step>
+ <title>完成</title>
+
+ <para>下面一步就是编辑 <filename>/etc/fstab</filename>,为您的磁盘添加一个新
+ 记录。</para>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2>
+ <title>使用命令行工具</title>
+
+ <sect3>
+ <title>使用 Slices</title>
+
+ <para>这步安装将允许磁盘与可能安装在您计算机上的其它操作系统一起
+ 正确工作,而不会搞乱其它操作系统的分区。推荐使用这种方法来安装
+ 新磁盘,除非您有更好的理由再使用 <literal>dedicated</literal>
+ 模式!</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/da1 bs=1k count=1</userinput>
+&prompt.root; <userinput>fdisk -BI da1</userinput> #初始化新磁盘
+&prompt.root; <userinput>disklabel -B -w -r da1s1 auto</userinput> #加上标签
+&prompt.root; <userinput>disklabel -e da1s1</userinput> # 现在编辑您刚才创建的磁盘分区
+&prompt.root; <userinput>mkdir -p /1</userinput>
+&prompt.root; <userinput>newfs /dev/da1s1e</userinput> # 为您创建的每个分区重复这个操作
+&prompt.root; <userinput>mount /dev/da1s1e /1</userinput> # 挂上分区
+&prompt.root; <userinput>vi /etc/fstab</userinput> # 完成之后,添加合适的记录到您的 <filename>/etc/fstab</filename>文件。</screen>
+
+ <para>如果有一个 IDE 磁盘,记得要用 <filename>ad</filename>
+ 来替换 <filename>da</filename>,4.X 以前的系统要用 <filename>wd</filename>。</para>
+ </sect3>
+
+ <sect3>
+ <title>专用模式</title>
+ <indexterm><primary>OS/2</primary></indexterm>
+
+ <para>如果您并没有安装其它的操作系统,可以使用 <literal>dedicated</literal>
+ 模式。记住这种模式可能会弄乱 Microsoft 的操作系统,但不会对它进行破坏。
+ 它不识别找到的 IBM &os2 的 <quote>appropriate</quote> 分区。</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/da1 bs=1k count=1</userinput>
+&prompt.root; <userinput>disklabel -Brw da1 auto</userinput>
+&prompt.root; <userinput>disklabel -e da1</userinput> # 创建 `e' 分区
+&prompt.root; <userinput>newfs -d0 /dev/da1e</userinput>
+&prompt.root; <userinput>mkdir -p /1</userinput>
+&prompt.root; <userinput>vi /etc/fstab</userinput> # 为 /dev/da1e添加一个记录
+&prompt.root; <userinput>mount /1</userinput></screen>
+
+ <para>另一种方法:</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/da1 count=2</userinput>
+&prompt.root; <userinput>disklabel /dev/da1 | disklabel -BrR da1 /dev/stdin</userinput>
+&prompt.root; <userinput>newfs /dev/da1e</userinput>
+&prompt.root; <userinput>mkdir -p /1</userinput>
+&prompt.root; <userinput>vi /etc/fstab</userinput> # 为 /dev/da1e添加一个记录
+&prompt.root; <userinput>mount /1</userinput></screen>
+
+ <note><para>从 &os;&nbsp;5.1-RELEASE 版本开始, &man.bsdlabel.8; 程序代替了
+ 老版本的 &man.disklabel.8; 程序。&man.bsdlabel.8; 中大量过时的选项
+ 和参数也被取消。在上面的例子中选项 <option>-r</option> 可以使用
+ &man.bsdlabel.8;程序来删除。更多的信息,请参考 &man.bsdlabel.8; 手册页。
+ </para></note>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="raid">
+ <title>RAID</title>
+
+ <sect2 id="raid-soft">
+ <title>软件 RAID</title>
+
+ <sect3 id="ccd">
+ <sect3info>
+ <authorgroup>
+ <author>
+ <firstname>Christopher</firstname>
+ <surname>Shumway</surname>
+ <contrib>Original work by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Brown</surname>
+ <contrib>Revised by </contrib>
+ </author>
+ </authorgroup>
+ </sect3info>
+
+<indexterm><primary>RAID</primary><secondary>software</secondary></indexterm>
+<indexterm>
+ <primary>RAID</primary><secondary>CCD</secondary>
+</indexterm>
+
+ <title>连接磁盘驱动器配置 (CCD) </title>
+ <para>选择一个大容量存储比较好的解决方案,最重要的因素是产品的速度、
+ 性能和成本。通常这三者不可能都满足;要获得比较快和可靠的大容量存储
+ 设备,就比较昂贵。但如果将成本降下来,那它的速度或可靠性就会打折扣。
+ </para>
+
+ <para>在设计下面描述的系统时,价格被选为最重要的因素,接下来是速度
+ 和性能。这人系统的数据传输速度及大的取决于网络。性能也非常重要,
+ CCD 驱动器上的所有数据都被备份到了 CD-R 盘,可以很容易的对数据进行恢复。
+ </para>
+
+ <para>在选择一个大容量的存储解决方案时,第一步是要设计您自己的需求。
+ 如果您的需求更偏重于速度和性能,那么您的解决方案将就不同于上面的设计。
+ </para>
+
+
+ <sect4 id="ccd-installhw">
+ <title>安装硬件</title>
+
+ <para>除了 IDE 系统磁盘外,还有三个 Western Digital 30GB、5400 RPM
+ 的 IDE 磁盘构成了大约 90G 的连接磁盘驱动存储空间。最好是每个 IDE 硬盘
+ 都使用一个自己的 IDE 控制器和数据线,为了降低成本,没有使用更多的
+ IDE 控制器,取而代之配置跳线使每个 IDE 控制器都拥有一个主盘和一个
+ 从盘。</para>
+
+ <para>重启动后,系统 BIOS 被配置成自动检测硬盘。FreeBSD 检测到它们:</para>
+
+ <programlisting>ad0: 19574MB &lt;WDC WD205BA&gt; [39770/16/63] at ata0-master UDMA33
+ad1: 29333MB &lt;WDC WD307AA&gt; [59598/16/63] at ata0-slave UDMA33
+ad2: 29333MB &lt;WDC WD307AA&gt; [59598/16/63] at ata1-master UDMA33
+ad3: 29333MB &lt;WDC WD307AA&gt; [59598/16/63] at ata1-slave UDMA33</programlisting>
+
+ <note><para>如果 FreeBSD 没有检测到它们,请确定它们的跳线是否设置
+ 正确。大多数 IDE 磁盘有一个 <quote>Cable Select</quote> 跳线。这个
+ <emphasis>不是</emphasis> 设置 master/slave 硬盘的跳线。查阅文档
+ 信息来确定正确的跳线设置。</para></note>
+
+ <para>接下来考虑的是,如何创建文件系统。应该好好研究一下 &man.vinum.8; (<xref
+ linkend="vinum-vinum">)和 &man.ccd.4; 两种方式,在这里我们选择 &man.ccd.4;
+ </para>
+ </sect4>
+
+ <sect4 id="ccd-setup">
+ <title>安装 CCD</title>
+
+ <para>&man.ccd.4; 允许用户将几个相同的的磁盘通过一个逻辑文件系统
+ 连接起来。要使用 &man.ccd.4;,您需要在内核中配置 &man.ccd.4;
+ 支持选项。把这行加入到内核配置文件中,然后重建内核:</para>
+
+ <programlisting>pseudo-device ccd 4</programlisting>
+
+ <para>在 5.X 和以后的版本中,您必须使用下面的行来代替:</para>
+
+ <programlisting>device ccd</programlisting>
+
+ <note><para>在 FreeBSD&nbsp;5.X 里,不必指定一系统的 &man.ccd.4; 设备,
+ &man.ccd.4; 设备将自动按需要创建新的 &mdash; 设备。</para></note>
+
+ <para>&man.ccd.4; 在FreeBSD 3.0 或以后的版本中也可以作为一个内核模块
+ 来加载</para>
+
+ <para>要安装 &man.ccd.4;, 首先需要使用 &man.disklabel.8; 来编辑硬盘:</para>
+
+ <programlisting>disklabel -r -w ad1 auto
+disklabel -r -w ad2 auto
+disklabel -r -w ad3 auto</programlisting>
+
+ <para>这儿把整个硬盘创建成 <devicename>ad1c</devicename>, <devicename>ad2c</devicename>
+ 和 <devicename>ad3c</devicename> 。</para>
+
+ <note><para>从 &os;&nbsp;5.1-RELEASE 开始, &man.bsdlabel.8; 程序代替
+ 了老版本的 &man.disklabel.8; 程序。&man.bsdlabel.8; 中大量过时的选项
+ 和参数也被取消; 在上面的例子中,选项 <option>-r</option> 应该被删掉。
+ 更的信息可以参考 &man.bsdlabel.8; 手册。</para></note>
+
+ <para>下一步是改变 disklable 的类型。也可以使用 &man.disklabel.8; 来编辑:
+ </para>
+
+ <programlisting>disklabel -e ad1
+disklabel -e ad2
+disklabel -e ad3</programlisting>
+
+ <para>这儿在每个已经设置了 <envar>EDITOR</envar> 环境变量的磁盘上打开了
+ disklable,在我我例子中使用的是 &man.vi.1;。</para>
+
+ <para>可以看到:</para>
+
+ <programlisting>8 partitions:
+# size offset fstype [fsize bsize bps/cpg]
+ c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)</programlisting>
+
+ <para>添加一个新的 <literal>e</literal> 分区给 &man.ccd.4; 用。这可以是
+ <literal>c</literal> 分区的一个拷贝,但 <option>fstype</option> <emphasis>必须</emphasis>
+ 是 <userinput>4.2BSD</userinput>。做完之后,您会看到一面这些:</para>
+
+ <programlisting>8 partitions:
+# size offset fstype [fsize bsize bps/cpg]
+ c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
+ e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597)</programlisting>
+
+ </sect4>
+
+ <sect4 id="ccd-buildingfs">
+ <title>建立文件系统</title>
+
+ <para><devicename>ccd0c</devicename> 的设备节点可能不存在,所以要
+ 创建它,执行下面的命令:</para>
+
+ <programlisting>cd /dev
+sh MAKEDEV ccd0</programlisting>
+
+ <note><para>在 FreeBSD 5.0 中,&man.devfs.5; 将自动管理在 <filename>/dev</filename>,
+ 里的设备结点,所以没有必要使用 <command>MAKEDEV</command> 命令。</para></note>
+
+ <para>现在已给每个磁盘都加上了标签,下面需要建立 &man.ccd.4;。要这样做,
+ 需要使用 &man.ccdconfig.8; 工具,同时要提供类似下面的选项:</para>
+
+ <programlisting>ccdconfig ccd0<co id="co-ccd-dev"> 32<co id="co-ccd-interleave"> 0<co id="co-ccd-flags"> /dev/ad1e<co id="co-ccd-devs"> /dev/ad2e /dev/ad3e</programlisting>
+
+ <para>每个选项的意义和用法如下所示:</para>
+
+ <calloutlist>
+ <callout arearefs="co-ccd-dev">
+ <para>配置设备的第一个参数,在这是 <filename>/dev/ccd0c</filename>。
+ <filename>/dev/</filename> 部分是任选项。</para>
+ </callout>
+
+ <callout arearefs="co-ccd-interleave">
+
+ <para>下一个参数是文件系统的插入页(interleave)。插入页定义了一个
+ 磁盘块中一个分段或条带(stripe)的大小,通常是 512 个字节。所以一个为
+ 32 的插入页将是 16,384 字节。</para>
+ </callout>
+
+ <callout arearefs="co-ccd-flags">
+ <para>插入页为 &man.ccdconfig.8; 附带了标记。如果您要启用驱动器镜像,
+ 需要在这儿指定它。在这个配置中没有做 &man.ccd.4; 的镜像,所以把它
+ 设为 0 (zero)。</para>
+ </callout>
+
+ <callout arearefs="co-ccd-devs">
+ <para> &man.ccdconfig.8; 的最后配置是设备的排列问题。使用完整的设备
+ 路径名。</para>
+ </callout>
+ </calloutlist>
+
+
+ <para>运行 &man.ccdconfig.8; 后 &man.ccd.4; 就配置好了。现在要创建文件
+ 系统了,参考 &man.newfs.8; 选项,执行下同的命令: </para>
+
+ <programlisting>newfs /dev/ccd0c</programlisting>
+
+
+ </sect4>
+
+ <sect4 id="ccd-auto">
+ <title>自动创建</title>
+
+ <para>最后,要挂上 &man.ccd.4; ,需要先配置它。把当前的配置文件写入
+ <filename>/etc/ccd.conf</filename> 中,使用下面的命令:</para>
+
+ <programlisting>ccdconfig -g &gt; /etc/ccd.conf</programlisting>
+
+ <para>当重新启动系统时,如果 <filename>/etc/ccd.conf</filename> 存在,
+ 脚本 <command>/etc/rc</command> 就运行 <command>ccdconfig -C</command>。
+ 这样就能自动配置 &man.ccd.4; 以到它能被挂上。</para>
+
+ <note><para>如果启动进入了单用户模式,在 &man.mount.8; 上 &man.ccd.4;
+ 之前,需要执行下面的命令来配置队列:</para>
+
+ <programlisting>ccdconfig -C</programlisting>
+ </note>
+
+ <para>要自动挂接 &man.ccd.4;,需要为 &man.ccd.4; 在
+ <filename>/etc/fstab</filename> 中配置一个记录,以便在启动时它能被挂上。
+ 如下所示:</para>
+
+ <programlisting>/dev/ccd0c /media ufs rw 2 2</programlisting>
+ </sect4>
+ </sect3>
+
+ <sect3 id="vinum">
+ <title> Vinum 卷管理</title>
+
+<indexterm><primary>RAID</primary><secondary>software</secondary></indexterm>
+<indexterm>
+ <primary>RAID</primary>
+ <secondary>Vinum</secondary>
+</indexterm>
+
+ <para>Vinum 卷管理是一个实现虚拟磁盘的块驱动设备工具。它使磁盘从
+ 块设备的接口和数据映射中独立出来。与传统的存储设备相比,增加了
+ 灵活性、性能和可靠性。 &man.vinum.8; 实现了 RAID-0、RAID-1 和
+ RAID-5 三种模式,它们即可以独立使用,也可组合使用。</para>
+
+ <para>参考 <xref linkend="vinum-vinum"> 得到更多 &man.vinum.8;
+ 的信息。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="raid-hard">
+ <title>硬件 RAID</title>
+
+ <indexterm>
+ <primary>RAID</primary>
+ <secondary>hardware</secondary>
+ </indexterm>
+
+ <para>FreeBSD 支持很多硬件 <acronym>RAID</acronym> 控制器。
+ 这些硬件不需要 FreeBSD 指定软件来管理 <acronym>RAID</acronym> 系统。
+ </para>
+
+ <para>使用 <acronym>BIOS</acronym> 支持的硬件,一般情况下这些硬件可以自行操作。
+ 下面是一个简明的描述设置一个 Promise <acronym>IDE</acronym> <acronym>RAID</acronym> 控制器。
+ 当硬件设备装好且系统重启后,屏幕上显示一个询问信息。接着进入硬件设置屏幕。在这里,
+ 您可以把所有的磁盘联合在一起使用。这样 FreeBSD 将磁盘看作一个驱动器。其它
+ 级别的 <acronym>RAID</acronym> 也可以相应的进行设置。
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>重建 ATA RAID1 阵列</title>
+
+ <para>FreeBSD 允许您热插拔阵列中损坏的磁盘。
+ 在您重新启动系统之前请注意这一点。</para>
+
+ <para>您可能会在 <filename>/var/log/messages</filename> 或者在 &man.dmesg.8;
+ 的输出中看到类似下面这些的内容:</para>
+
+ <programlisting>ad6 on monster1 suffered a hard error.
+ad6: READ command timeout tag=0 serv=0 - resetting
+ad6: trying fallback to PIO mode
+ata3: resetting devices .. done
+ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\
+status=59 error=40
+ar0: WARNING - mirror lost</programlisting>
+
+ <para>使用 &man.atacontrol.8;,查看更多的信息:</para>
+
+ <screen>&prompt.root; <userinput>atacontrol list</userinput>
+ATA channel 0:
+ Master: no device present
+ Slave: acd0 &lt;HL-DT-ST CD-ROM GCR-8520B/1.00&gt; ATA/ATAPI rev 0
+
+ATA channel 1:
+ Master: no device present
+ Slave: no device present
+
+ATA channel 2:
+ Master: ad4 &lt;MAXTOR 6L080J4/A93.0500&gt; ATA/ATAPI rev 5
+ Slave: no device present
+
+ATA channel 3:
+ Master: ad6 &lt;MAXTOR 6L080J4/A93.0500&gt; ATA/ATAPI rev 5
+ Slave: no device present
+
+&prompt.root; <userinput>atacontrol status ar0</userinput>
+ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED</screen>
+
+ <procedure>
+ <step>
+ <para>您首先需要将磁盘从阵列中移除以便您可以
+ 安全的拆除它:</para>
+
+ <screen>&prompt.root; <userinput>atacontrol detach 3</userinput></screen>
+ </step>
+
+ <step>
+ <para>换上磁盘</para>
+ </step>
+
+ <step>
+ <para>把磁盘作为备用磁盘安装:</para>
+
+ <screen>&prompt.root; <userinput>atacontrol attach 3</userinput>
+Master: ad6 &lt;MAXTOR 6L080J4/A93.0500&gt; ATA/ATAPI rev 5
+Slave: no device present</screen>
+ </step>
+
+ <step>
+ <para>重建阵列:</para>
+
+ <screen>&prompt.root; <userinput>atacontrol rebuild ar0</userinput></screen>
+ </step>
+
+ <step>
+ <para>rebuild 命令挂起直到完成。然而,可以打开另一个终端
+ (使用 <keycombo action="simul"><keycap>Alt</keycap> <keycap>F<replaceable>n</replaceable></keycap></keycombo>)
+ 通过下面的命令来检查进程:</para>
+
+ <screen>&prompt.root; <userinput>dmesg | tail -10</userinput>
+[output removed]
+ad6: removed from configuration
+ad6: deleted from ar0 disk1
+ad6: inserted into ar0 disk1 as spare
+
+&prompt.root; <userinput>atacontrol status ar0</userinput>
+ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed</screen>
+ </step>
+
+ <step>
+ <para>等待操作完成。</para>
+ </step>
+ </procedure>
+ </sect2>
+ </sect1>
+
+ <sect1 id="usb-disks">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- Jul 2004 -->
+ </sect1info>
+
+ <title>USB 存储设备</title>
+ <indexterm>
+ <primary>USB</primary>
+ <secondary>disks</secondary>
+ </indexterm>
+
+ <para>到目前为止,有许多外部外部存储解决方案,
+ 例如:通用串行总线 (USB):硬盘、USB thumbdrives、CD-R burners
+ 等等。 &os; 为这些设备提供了支持。</para>
+
+ <sect2>
+ <title>配置</title>
+
+ <para> USB 大容量存储设备驱动,在 &man.umass.4;,
+ 中提供了对 USB 存储设备的支持。如果您使用
+ <filename>GENERIC</filename> 内核,您不必要改变配置文件里的任何内容。
+ 如果您使用了定制的内核,就要确定下面的行出现在您的内核配置文件里:</para>
+
+ <programlisting>device scbus
+device da
+device pass
+device uhci
+device ohci
+device usb
+device umass</programlisting>
+
+ <para> &man.umass.4; 驱动程序使用 SCSI 子系统来访问 USB 存储设备,
+ 您的 USB 设备将被系统看成为一个 SCSI 设备。依靠您主板上的 USB 芯片,
+ 您只须选择 <literal>device
+ uhci</literal> 或 <literal>device ohci</literal> 二者之一即可,
+ 但是两者都加入内核配置文件当中也没有坏外。
+ 不要忘了如果您加入了上面的几行要重新编译和安装内核。</para>
+
+ <note>
+ <para>如果您的 USB 设备是一个 CD-R 或 DVD 刻录机, SCSI CD-ROM
+ 驱动程序, &man.cd.4;, 就必须加入内核中通过下面这行:</para>
+
+ <programlisting>device cd</programlisting>
+
+ <para>因为刻录机被看作一个 SCSI 设备drive, 驱动程序
+ &man.atapicam.4; 不应该在内核配置文件中使用。</para>
+ </note>
+
+ <para>在&os;&nbsp;5.X,中提供了对 USB 2.0 控制器的支持,
+ 在 4.X 分支从 &os;&nbsp;4.10-RELEASE 后,您应该加入:</para>
+
+ <programlisting>device ehci</programlisting>
+
+ <para>到您的配置文件以提供对 USB 2.0 的支持。注意
+ &man.uhci.4; 和 &man.ohci.4; 驱动程序仍然需要,如果您想提供对
+ USB 1.X 的支持。</para>
+
+ <note>
+ <para>在 &os;&nbsp;4.X 上, USB daemon (&man.usbd.8;) 必须能够
+ 检测到正在运行的一些 USB 设备。为了启用它,
+ 添加 <literal>usbd_enable="YES"</literal> 到您的
+ <filename>/etc/rc.conf</filename> 文件里,然后重新启动
+ 计算机。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>测试配置</title>
+
+ <para>配置好后准备进行测试:插入您的 USB 设备,
+ 在系统信息中 (&man.dmesg.8;), 应该会出现像下面的设备:</para>
+
+ <screen>umass0: USB Solid state disk, rev 1.10/1.00, addr 2
+GEOM: create disk da0 dp=0xc2d74850
+da0 at umass-sim0 bus 0 target 0 lun 0
+da0: &lt;Generic Traveling Disk 1.11&gt; Removable Direct Access SCSI-2 device
+da0: 1.000MB/s transfers
+da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C)</screen>
+
+ <para>当然啦,商标,设备标识
+ (<devicename>da0</devicename>) 和其它的细节信息会根据您的配置不同
+ 而有所不同。</para>
+
+ <para>因为 USB 设备被看作 SCSI 设备中的一个,
+ <command>camcontrol</command> 命令也能够用来列出
+ USB 存储设备和系统的关联:</para>
+
+ <screen>&prompt.root; <userinput>camcontrol devlist</userinput>
+&lt;Generic Traveling Disk 1.11&gt; at scbus0 target 0 lun 0 (da0,pass0)</screen>
+
+ <para>如果设备要作成文件系统,您应该能够挂接它。
+ <xref linkend="disks-adding"> 将帮助您格式化和创建分区在
+ USB 设备上,如果您需要。</para>
+
+ <para>如果您要去摘下设备 (在此这前磁盘必须被 unmount),
+ 在系统信息中您能够看到下面的信息:</para>
+
+ <screen>umass0: at uhub0 port 1 (addr 2) disconnected
+(da0:umass-sim0:0:0:0): lost device
+(da0:umass-sim0:0:0:0): removing device entry
+GEOM: destroy disk da0 dp=0xc2d74850
+umass0: detached</screen>
+ </sect2>
+
+ <sect2>
+ <title>深入阅读</title>
+
+ <para>除了 <link linkend="disks-adding">Adding
+ Disks</link> 和 <link linkend="mount-unmount">Mounting and
+ Unmounting File Systems</link> 章之外,阅读
+ &man.umass.4;, &man.camcontrol.8;, 和 &man.usbdevs.8;
+ 也是很有益的。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="creating-cds">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Mike</firstname>
+ <surname>Meyer</surname>
+ <contrib>Contributed by </contrib>
+ <!-- mwm@mired.org -->
+ </author>
+ </authorgroup>
+ <!-- Apr 2001 -->
+ </sect1info>
+
+ <title>创建和使用光学介质(CD)</title>
+ <indexterm>
+ <primary>CDROMs</primary>
+ <secondary>creating</secondary>
+ </indexterm>
+
+ <sect2>
+ <title>介绍</title>
+
+ <para>CD 与普通的磁盘相比有很多不同的特性。最初它们是不能被用户写入的。
+ 由于没有磁头和磁道移动时的延迟,所以它们可以连续的进行读取。
+ 方便的在两个系统之间进行数据的传输,比起相同大小的存储介质来说。</para>
+
+ <para>CD 有磁道,这关系到数据读取时的连续性而不是物理磁盘的性能。
+ 要在 FreeBSD 中制作一个 CD,您要准备好要写到 CD 上的数据文件,
+ 然后根据每个 tracks 写入到 CD。</para>
+
+ <indexterm><primary>ISO 9660</primary></indexterm>
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>ISO 9660</secondary>
+ </indexterm>
+ <para>ISO 9660 文件系统被设计用来处理这些差异。它通常不会对文件系统作限制。
+ 幸运的是,它提供了一个可扩展机制允许在制作 CD 时越越这些限制,
+ 而同时在不支持这些扩展的系统上仍旧能够进行工作。</para>
+
+ <indexterm>
+ <primary><filename role="package">sysutils/cdrtools</filename></primary>
+ </indexterm>
+ <para><filename role="package">sysutils/</filename>
+ port 包括了 &man.mkisofs.8;, 这是一个可以用来生成包含 ISO 9660 文件系统的数据文件的程序。
+ 他也提供了对于一些扩展的支持选项,下面将详细介绍。</para>
+
+ <indexterm>
+ <primary>CD burner</primary>
+ <secondary>ATAPI</secondary>
+ </indexterm>
+ <para>使用哪个工具来刻录 CD 依赖于 CD 刻录机是 ATAPI 还是其它类型的。ATAPI CD
+ 刻录器使用 <command><link linkend="burncd">burncd</link></command>
+ 程序,可以在基本系统中找到。SCSI 和 USB CD 刻录机使用
+ <command><link linkend="cdrecord">cdrecord</link></command> 程序,可以
+ 在 <filename role="package">sysutils/cdrtools</filename> port中找到。</para>
+
+ <para><command>burncd</command> 程序受到一系列支持设备的限制。如果想知道
+ 设备是否被支持,可以查看
+ <ulink url="http://www.freebsd.dk/ata/">支持的 CD-R/RW
+ 驱动器</ulink> 列表。</para>
+
+ <note>
+ <indexterm>
+ <primary>CD burner</primary>
+ <secondary>ATAPI/CAM driver</secondary>
+ </indexterm>
+ <para>如果您运行的是 &os;&nbsp;5.X、&os;&nbsp;4.8-RELEASE 或更高版本,
+ 它将可能使用 <command><link linkend="cdrecord">cdrecord</link></command>
+ 和其它工作在一个 ATAPI 硬件 <link linkend="atapicam">ATAPI/CAM module</link>
+ 为 SCSI 设备。</para>
+ </note>
+
+ <para>如果您想使用一个图形界面的 CD 刻录软件,
+ 您可以参考一下
+ <application>X-CD-Roast</application> 或
+ <application>K3b</application>。这些工具作为安装包可以从
+ <filename
+ role="package">sysutils/xcdroast</filename> 和 <filename
+ role="package">sysutils/k3b</filename> ports 得到。
+ <application>X-CD-Roast</application> 和
+ <application>K3b</application> 需要 <link
+ linkend="atapicam">ATAPI/CAM module</link> 和 ATAPI
+ 硬件。</para>
+ </sect2>
+
+ <sect2 id="mkisofs">
+ <title>mkisofs</title>
+
+ <para>&man.mkisofs.8; 程序作为
+ <filename role="package">sysutils/cdrtools</filename> port 的一部分,
+ 将生成 ISO 9660 文件系统,其中包含 &unix; 命名空间中的文件名。
+ 最简单的用法是:</para>
+
+ <screen>&prompt.root; <userinput>mkisofs -o <replaceable>imagefile.iso</replaceable> <replaceable>/path/to/tree</replaceable></userinput></screen>
+
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>ISO 9660</secondary>
+ </indexterm>
+ <para>这个命令将创建一个包含 ISO9660 文件系统的 <replaceable>imagefile.iso</replaceable>
+ 文件,它是目录树 <replaceable>/path/to/tree</replaceable> 的一个拷贝。在处理过程中,
+ 它将文件名称映射为标准的 ISO9660 文件系统的文件名,将排除那些不典型的 ISO 文件系统的
+ 文件。</para>
+
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>HFS</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>Joliet</secondary>
+ </indexterm>
+ <para>有很多选项能够用来克服那些限制。特别的,<option>-R</option> 选项能够启用
+ Rock Ridge 扩展一般的 &unix; 系统,<option>-J</option> 选项能启用用于
+ Microsoft 系统的 Joliet 扩展,<option>-hfs</option> 选项能用来创建用于
+ &macos; 系统的 HFS 文件系统。</para>
+
+ <para>对于那些即将要在 FreeBSD 系统中使用 CD 的人来说,<option>-U</option>
+ 选项能用来消除所有文件名的限制。当使用 <option>-R</option> 选项时,它会产生一个
+ 文件系统映像,它与您从那儿启动 FreeBSD 树是一样的,虽然它在许多方面也违反了
+ ISO 9660 的标准。</para>
+
+ <indexterm>
+ <primary>CDROMs</primary>
+ <secondary>创建启动光盘</secondary>
+ </indexterm>
+ <para>最后一个常用的选项是 <option>-b</option>。这可以用来指定启动映像的位置,
+ 以产生一个 <quote>El Torito</quote> 的启动光盘。 这个选项有一个参数,这个
+ 参数是指向已被写入到 CD 的目录树顶部的启动映像的路径。所以,
+ <filename>/tmp/myboot</filename> 在<filename>/tmp/myboot/boot/cdboot</filename>
+ 中保存了一个可启动的 FreeBSD 系统,您应当像下面这样在
+ <filename>/tmp/bootable.iso</filename> 中生成一个 ISO9660 文件系统的映像:</para>
+
+ <screen>&prompt.root; <userinput>mkisofs -U -R -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot</userinput></screen>
+
+ <para>如果内核中已经配置了 <devicename>vn</devicename>
+ (FreeBSD&nbsp;4.X), 或 <devicename>md</devicename>
+ (FreeBSD&nbsp;5.X),就可以挂上文件系统:</para>
+
+ <screen>&prompt.root; <userinput>vnconfig -e vn0c /tmp/bootable.iso</userinput>
+&prompt.root; <userinput>mount -t cd9660 /dev/vn0c /mnt</userinput></screen>
+
+ <para>在 FreeBSD&nbsp;4.X, 和 FreeBSD&nbsp;5.X 中:</para>
+
+ <screen>&prompt.root; <userinput>mdconfig -a -t vnode -f /tmp/bootable.iso -u 0</userinput>
+&prompt.root; <userinput>mount -t cd9660 /dev/md0 /mnt</userinput></screen>
+
+ <para>可以发现 <filename>/mnt</filename> 和 <filename>/tmp/myboot</filename>
+ 是一样的。</para>
+
+ <para>还可以使用 &man.mkisofs.8;
+ 的其它选项来调整它的行为。特别是修改 ISO 9660 的划分格式,创建 Joliet
+ 和 HFS 格式的磁盘。查看 &man.mkisofs.8; 手册页得到更多的帮助。</para>
+ </sect2>
+
+ <sect2 id="burncd">
+ <title>burncd</title>
+ <indexterm>
+ <primary>CDROMs</primary>
+ <secondary>burning</secondary>
+ </indexterm>
+ <para>如果用的是 ATAPE 的 CD 刻录机,可以使用 <command>burncd</command>
+  命令来记录您的 CD ISO 映像文件。 <command>burncd</command> 命令是基本
+  系统的一部分,中以使用 <filename>/usr/sbin/burncd</filename> 来安装。
+  用法如下:</para>
+
+ <screen>&prompt.root; <userinput>burncd -f <replaceable>cddevice</replaceable> data <replaceable>imagefile.iso</replaceable> fixate</userinput></screen>
+
+ <para>在 <replaceable>cddevice</replaceable> 上刻录一份
+ <replaceable>imagefile.iso</replaceable> 的副本。
+ 默认的设备是
+ <filename>/dev/acd0</filename> (在 &os;&nbsp;4.X 下则是
+ <filename>/dev/acd0c</filename>)。
+ 请参考 &man.burncd.8; 以了解设置写入速度的参数,如何在刻录完成之后自动弹出CD,以及刻录音频数据。</para>
+ </sect2>
+
+ <sect2 id="cdrecord">
+ <title>cdrecord</title>
+
+ <para>如果没有一个 ATAPI CD 刻录机,必须使用 <command>cdrecord</command>
+ 来刻录您的 CD 。 <command>cdrecord</command> 不是基本系统的一部分;必须
+ 从 <filename role="package">sysutils/cdrtools</filename> 或适当的
+ package 安装它。基本系统的变化可能会引起这个程序的错误。可能是由
+ <quote>coaster</quote> 引起的。当升级系统时,同时需要升级 port ,或者
+ 如果已升级到 <link linkend="stable">tracking -STABLE</link> ,那么使用
+ 新版本时也要升级 port。</para>
+
+ <para><command>cdrecord</command> 有许多选项,基本用法与 <command>burncd</command>
+ 相似。刻录一个 ISO 9660 映像文件只需这样做:</para>
+
+ <screen>&prompt.root; <userinput>cdrecord dev=<replaceable>device</replaceable> <replaceable>imagefile.iso</replaceable></userinput></screen>
+
+ <para>使用 <command>cdrecord</command> 的比较巧妙的方法是找到使用的
+ <option>dev</option> 。要找到正确的设置,可以使用 <command>cdrecord</command>
+ 的 <option>-scanbus</option> 标记,这会产生这样的结果:</para>
+ <indexterm>
+ <primary>CDROMs</primary>
+ <secondary>burning</secondary>
+ </indexterm>
+ <screen>&prompt.root; <userinput>cdrecord -scanbus</userinput>
+Cdrecord 1.9 (i386-unknown-freebsd4.2) Copyright (C) 1995-2000 J&ouml;rg Schilling
+Using libscg version 'schily-0.1'
+scsibus0:
+ 0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
+ 0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
+ 0,2,0 2) *
+ 0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
+ 0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
+ 0,5,0 5) *
+ 0,6,0 6) *
+ 0,7,0 7) *
+scsibus1:
+ 1,0,0 100) *
+ 1,1,0 101) *
+ 1,2,0 102) *
+ 1,3,0 103) *
+ 1,4,0 104) *
+ 1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
+ 1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
+ 1,7,0 107) *</screen>
+
+ <para>这个列表列出了设备的的适当的 <option>dev</option> 值。找到您的
+ CD burner ,使用三个用逗号分隔的数值来表示 <option>dev</option>.在
+ 这个例子中,CRW 是 <option>dev=1,5,0</option>,所以正确的输入应是
+ dev=1,5,0 。有一个很容易的方法可以指定这个值;看看 &man.cdrecord.1;
+ 的介绍了解有关音轨,控制速度和其他的东西。</para>
+ </sect2>
+
+ <sect2 id="duplicating-audiocds">
+ <title>复制音频 CD</title>
+
+ <para>您可以这样复制 CD,把 CD 上面的音频数据解压缩出一系列的文件,
+ 再把这些文件写到一张空白 CD 上。
+ 这个过程对于 ATAPI 和 SCSI 驱动器来说有些微的不同。
+ </para>
+
+ <procedure>
+ <title>SCSI 驱动器</title>
+
+ <step>
+ <para>使用 <command>cdda2wav</command> 来解压缩音频。</para>
+
+ <screen>&prompt.user; <userinput>cdda2wav -v255 -D2,0 -B -Owav</userinput></screen>
+ </step>
+
+ <step>
+ <para>使用 <command>cdrecord</command> 来写
+ <filename>.wav</filename> 文件。</para>
+
+ <screen>&prompt.user; <userinput>cdrecord -v dev=<replaceable>2,0</replaceable> -dao -useinfo *.wav</userinput></screen>
+
+ <para>确保 <replaceable>2.0</replaceable> 被适当的
+ 设置,像 <xref linkend="cdrecord"> 中描述的那样。</para>
+ </step>
+ </procedure>
+
+ <procedure>
+ <title>ATAPI 驱动器</title>
+
+ <step>
+ <para>ATAPI CD 驱动用
+ <filename>/dev/acd<replaceable>d</replaceable>t<replaceable>nn</replaceable></filename>表示每个轨道,
+ 这里 <replaceable>d</replaceable> 是驱动器号,
+ <replaceable>nn</replaceable> 是轨道号,由两位小数位组成,省略前缀零。
+ 所以第一个盘片上的第一个轨道就是
+ <filename>/dev/acd0t01</filename>,第二个就是
+ <filename>/dev/acd0t02</filename>,第三个就是
+ <filename>/dev/acd0t03</filename>,等等。</para>
+
+ <para>确保在 <filename>/dev</filename> 中存在合适的文件。
+ </para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>sh MAKEDEV acd0t99</userinput></screen>
+
+ <note><para>在 FreeBSD 5.0 中,&man.devfs.5; 会为您自动创建
+ 并管理 <filename>/dev</filename> 中的节点,
+ 所以不再需要使用
+ <command>MAKEDEV</command>。</para></note>
+ </step>
+
+ <step>
+ <para>使用 &man.dd.1; 解压缩每个轨道。当解压缩文件的时候您也必须使用
+ 一个特殊的块大小。</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/acd0t01 of=track1.cdr bs=2352</userinput>
+&prompt.root; <userinput>dd if=/dev/acd0t02 of=track2.cdr bs=2352</userinput>
+...
+</screen>
+ </step>
+
+ <step>
+ <para>使用
+ <command>burncd</command> 把解压缩的文件刻录到光盘上。您必须指定
+ 这些文件是音频文件,这样 <command>burncd</command> 会在刻录完成时
+ 结束光盘。</para>
+
+ <screen>&prompt.root; <userinput>burncd -f <replaceable>/dev/acd0</replaceable> audio track1.cdr track2.cdr <replaceable>...</replaceable> fixate</userinput></screen>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2 id="imaging-cd">
+ <title>复制数据 CD</title>
+
+ <para>您可以把数据 CD 复制成一个与之等价的镜像文件,
+ 镜像文件可以使用
+ &man.mkisofs.8; 创建,您可以使用这个工具复制
+ 任何数据 CD。这里给出的例子假定您的 CDROM
+ 设备 <devicename>acd0</devicename>。代替您
+ 正确的 CDROM 设备。在 &os;&nbsp;4.X 下面,字符 <literal>c</literal> 必须被附加到
+ 设备名的结尾处来指明是整个分区,
+ 或者对于 CDROM,指明是整个光盘。</para>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/acd0 of=file.iso bs=2048</userinput></screen>
+
+ <para>现在您有一个镜像文件了,您可以像上面描述的那样把它刻录成 CD。
+ </para>
+ </sect2>
+
+ <sect2 id="mounting-cd">
+ <title>使用数据 CD</title>
+
+ <para>现在您已经创建了一张标准的数据 CDROM,您或许想要
+ 挂载来读取上面的设备。
+ 默认情况下,&man.mount.8; 假定文件系统是
+ <literal>ufs</literal> 类型的。如果您尝试下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>mount /dev/cd0 /mnt</userinput></screen>
+
+ <para>您会得到一条 <errorname>Incorrect super
+ block</errorname> 的错误信息,没有挂载成功。CDROM 不是
+ <literal>UFS</literal> 文件系统,所以试图这样挂载它是
+ 是不行的。您需要告诉 &man.mount.8;
+ 文件系统是 <literal>ISO9660</literal> 类型的,这样
+ 就可以了。只需要指定 &man.mount.8; 的
+ <option>-t cd9660</option> 选项。例如,
+ 如果您想要挂载 CDROM 设备,
+ <filename>/dev/cd0</filename> 到
+ <filename>/mnt</filename> 目录,您需要执行:</para>
+
+ <screen>&prompt.root; <userinput>mount -t cd9660 /dev/cd0 /mnt</userinput></screen>
+
+ <para>注意您的设备名
+ (在这个例子中是 <filename>/dev/cd0</filename>)可能
+ 有所不同,取决于您的 CDROM 使用的接口。另外,
+ <option>-t cd9660</option> 选项等同于执行
+ &man.mount.cd9660.8;。上面的例子可以缩短
+ 为:</para>
+
+<screen>&prompt.root; <userinput>mount_cd9660 /dev/cd0 /mnt</userinput></screen>
+
+ <para>用这种方法您基本可以使用任何买到的数据 CDROM。
+ 然而某些有 ISO 9660 扩展的光盘可能会行为古怪。
+ 例如,joliet 光盘用两个字节的 unicode 字符存储所有的文件名。
+ FreeBSD 内核还不能识别
+ unicode (重要!),所以非英语字符被做了有问题的标记。
+ (如果您正在运行 FreeBSD 4.3 或者以后的版本,
+ CD9660 驱动包含了加载合适的 unicode 换算表的方法。
+ 一些常用编码的模块可以通过
+ <filename role="package">sysutils/cd9660_unicode</filename> port 来安装。)</para>
+
+ <para>有时候,当您试图挂载 CDROM 的时候,会得到一条 <errorname>Device not
+ configured</errorname> 的错误信息。这通常
+ 表明 CDROM 驱动认为托盘里没有光盘,
+ 或者驱动器在总线上不可见。
+ 需要几秒钟时间等待 CDROM 驱动器辨别已经接到反馈的信息,
+ 请耐心等待。</para>
+
+ <para>有时候,SCSI CDROM 可能会找不到,因为没有足够的
+ 时间来应答总线的 reset 信号。如果您有一个 SCSI
+ CDROM 请将下面的选项添加到您的内核
+ 配置文件并<link linkend="kernelconfig-building">重建您的内核</link>。</para>
+
+ <programlisting>options SCSI_DELAY=15000</programlisting>
+
+ <para>这个告诉您的 SCSI 总线启动时暂停 15 秒钟,
+ 给您的 CDROM 驱动器足够的机会来应答
+ 总线 reset 信号。</para>
+ </sect2>
+
+ <sect2 id="rawdata-cd">
+ <title>刻录原始数据 CD</title>
+
+ <para>您可以选择把一个文件目录刻录到 CD 上而不用
+ 创建 ISO 9660 文件系统。有些人这么做是为了备份的
+ 目的。这个运行的比刻录一个标准 CD 速度要快的多:</para>
+
+ <screen>&prompt.root; <userinput>burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate</userinput></screen>
+
+ <para>要重新找回这样刻录到 CD 上的数据,
+ 您必须从原始设备节点读取数据:</para>
+
+ <screen>&prompt.root; <userinput>tar xzvf /dev/acd1</userinput></screen>
+
+ <para>您不能像挂载一个通常的 CDROM 一样挂载这张光盘。
+ 这样的 CDROM 也不能在除了 FreeBSD 之外的任何操作系统上读出。
+ 如果您想要可以挂载 CD,或者
+ 和另一种操作系统共享数据,您必须像上面描述的那样使用
+ &man.mkisofs.8;。</para>
+ </sect2>
+
+ <sect2 id="atapicam">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <indexterm>
+ <primary>CD burner</primary>
+ <secondary>ATAPI/CAM driver</secondary>
+ </indexterm>
+ <title>使用 ATAPI/CAM 驱动</title>
+
+ <para>这个驱动允许 ATAPI 设备(CD-ROM, CD-RW, DVD
+ 驱动器等...)通过 SCSI 子系统访问,
+ 这样允许使用像 <filename
+ role="package">sysutils/cdrdao</filename> 或者
+ &man.cdrecord.1; 这样的程序。</para>
+
+ <para>要使用这个驱动,您需要把下面几行
+ 添加到您的内核配置文件中:</para>
+
+ <programlisting>device atapicam
+device scbus
+device cd
+device pass</programlisting>
+
+ <para>您也需要在您的内核配置文件有
+ 下面几行:</para>
+
+ <programlisting>device ata</programlisting>
+
+ <para>这个应该已经有了。</para>
+
+ <para>然后重建,安装您的新内核,重新启动机器。
+ 在启动过程中,您的刻录机会被识别,
+ 就像这样:</para>
+
+ <screen>acd0: CD-RW &lt;MATSHITA CD-RW/DVD-ROM UJDA740&gt; at ata1-master PIO4
+cd0 at ata1 bus 0 target 0 lun 0
+cd0: &lt;MATSHITA CDRW/DVD UJDA740 1.00&gt; Removable CD-ROM SCSI-0 device
+cd0: 16.000MB/s transfers
+cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed</screen>
+
+ <para>驱动器现在可以通过
+ <filename>/dev/cd0</filename> 设备名访问了,例如要
+ 挂载 CD-ROM 到 <filename>/mnt</filename>,只需要键入下面的
+ 命令:</para>
+
+ <screen>&prompt.root; <userinput>mount -t cd9660 <replaceable>/dev/cd0</replaceable> /mnt</userinput></screen>
+
+ <para>作为 <username>root</username>,您可以运行下面的
+ 命令来得到刻录机的 SCSI 地址:</para>
+
+ <screen>&prompt.root; <userinput>camcontrol devlist</userinput>
+&lt;MATSHITA CDRW/DVD UJDA740 1.00&gt; at scbus1 target 0 lun 0 (pass0,cd0)</screen>
+
+ <para>这样 <literal>1,0,0</literal> 就是 SCSI 地址了,可以被
+ &man.cdrecord.1; 和其他的 SCSI 程序使用。</para>
+
+ <para>有关 ATAPI/CAM 和 SCSI 系统的更多信息,
+ 可以参阅 &man.atapicam.4; 和 &man.cam.4; 手册
+ 页。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="creating-dvds">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Andy</firstname>
+ <surname>Polyakov</surname>
+ <contrib>With inputs from </contrib>
+ </author>
+ </authorgroup>
+ <!-- Feb 2004 -->
+ </sect1info>
+
+ <title>创建和使用光学介质(DVD)</title>
+ <indexterm>
+ <primary>DVD</primary>
+ <secondary>burning</secondary>
+ </indexterm>
+
+ <sect2>
+ <title>介绍</title>
+
+ <para>和 CD 相比,DVD 是下一代光学存储介质技术。
+ DVD 可以容纳比任何 CD 更多的数据,已经成为现今视频出版业的标准。</para>
+
+ <para>我们称作可记录 DVD 的有五种物理记录格式:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>DVD-R:这是第一种可用的 DVD 可记录格式。
+ DVD-R 标准由 <ulink
+ url="http://www.dvdforum.com/forum.shtml">DVD Forum</ulink> 定义。
+ 这种格式是一次可写的。</para>
+ </listitem>
+
+ <listitem>
+ <para>DVD-RW:这是 DVD-R 标准的可覆写版本。
+ 一张 DVD-RW 可以被覆写大约 1000
+ 次。</para>
+ </listitem>
+
+ <listitem>
+ <para>DVD-RAM:这也是一种被 DVD Forum 所支持的可覆写格式。
+ DVD-RAM 可以被看作一种可移动硬盘。
+ 然而,这种介质和大部分
+ DVD-ROM 驱动器以及 DVD-Video 播放器不兼容;
+ 只有少数 DVD 刻录机支持 DVD-RAM。</para>
+ </listitem>
+
+ <listitem>
+ <para>DVD+RW:这是一种由
+ <ulink url="http://www.dvdrw.com/">DVD+RW
+ Alliance</ulink> 定义的可覆写格式。一张 DVD+RW 可以被覆写大约 1000
+ 次。</para>
+ </listitem>
+
+ <listitem>
+ <para>DVD+R:这种格式是 DVD+RW 格式的一次可写变种。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>一张单层的可记录 DVD 可以存储
+ 4,700,000,000&nbsp; 字节,相当于 4.38&nbsp;GB 或者说
+ 4485&nbsp;MB (1 千字节等于 1024 字节)。</para>
+
+ <note>
+ <para>必须说明一下物理介质与应用程序的分歧。
+ 例如 DVD-Video 是一种特殊的文件系统,
+ 可以被覆写到任何可记录的 DVD 物理介质上:
+ DVD-R、DVD+R、DVD-RW 等等。在选择介质类型之前,
+ 您一定要确认刻录机和
+ DVD-Video 播放器 (一种单独的播放器或者计算机上的 DVD-ROM 驱动器)
+ 是和这种介质兼容的。</para></note>
+ </sect2>
+
+ <sect2>
+ <title>配置</title>
+
+ <para>&man.growisofs.1; 将被用来实施 DVD
+ 刻录。 这个命令是
+ <application>dvd+rw-tools</application> 工具集 (<filename
+ role="package">sysutils/dvd+rw-tools</filename>) 的一部分。
+ <application>dvd+rw-tools</application> 支持所有的 DVD 介质类型。</para>
+
+ <para>这些工具将使用 SCSI 子系统来访问设备,因此
+ <link linkend="atapicam">ATAPI/CAM 支持</link> 必须加入内核。
+ 如果您的刻录机采用 USB 接口则不需要这么做,请参考
+ <xref linkend="usb-disks"> 来了解 USB
+ 设备配置的进一步详情。</para>
+
+ <para>此外,还需要启用 ATAPI 设备的 DMA 支持。 这一工作可以通过在
+ <filename>/boot/loader.conf</filename> 文件中加入下面的行来完成:</para>
+
+ <programlisting>hw.ata.atapi_dma="1"</programlisting>
+
+ <para>试图使用
+ <application>dvd+rw-tools</application> 之前您应该参考
+ <ulink
+ url="http://fy.chalmers.se/~appro/linux/DVD+RW/hcn.html">dvd+rw-tools
+ 硬件兼容性列表</ulink> 是否有与您的 DVD 刻录机有关的信息。</para>
+
+ <note>
+ <para>如果您想要一个图形化的用户界面,您应该看一看
+ <application>K3b</application> (<filename
+ role="package">sysutils/k3b</filename>),它提供了
+ &man.growisofs.1; 的一个友好界面和许多其他刻录工具。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>刻录数据 DVD</title>
+
+ <para>&man.growisofs.1; 命令是 <link
+ linkend="mkisofs">mkisofs</link> 的前端,它会调用
+ &man.mkisofs.8; 来创建文件系统布局,完成到 DVD 上的刻录。
+ 这意味着您不需要在刻录之前创建数据映像。</para>
+
+ <para>要把 <filename
+ role="directory">/path/to/data</filename> 目录的数据刻录到 DVD+R
+ 或者 DVD-R 上面,使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -dvd-compat -Z <replaceable>/dev/cd0</replaceable> -J -R <replaceable>/path/to/data</replaceable></userinput></screen>
+
+ <para><option>-J -R</option> 选项传递给
+ &man.mkisofs.8; 用于文件系统创建(这种情况下:
+ 带有 joliet 和 Rock Ridge 扩展的 ISO 9660 文件系统),
+ 参考 &man.mkisofs.8; 手册页了解更多细节。</para>
+
+ <para>选项 <option>-Z</option> 用来在任何情况下初始刻录会话:
+ 不管多会话与否。
+ DVD 设备,<replaceable>/dev/cd0</replaceable>,
+ 必须依照您的配置做出改变。
+ <option>-dvd-compat</option> 参数会结束光盘,
+ 光盘成为不可附加的。这会提供更多的和
+ DVD-ROM 驱动器的介质兼容性。</para>
+
+ <para>也可以刻录成一个 pre-mastered 映像,
+ 例如记录一个映像文件
+ <replaceable>imagefile.iso</replaceable>, 我们可以运行:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -dvd-compat -Z <replaceable>/dev/cd0</replaceable>=<replaceable>imagefile.iso</replaceable></userinput></screen>
+
+ <para>刻录的速度可以被检测到并自动进行调整,
+ 根据介质和驱动器的使用情况。如果您想强制改变速度,
+ 可以使用 <option>-speed=</option>
+ 参数。更多的信息,请看 &man.growisofs.1;
+ 联机手册。</para>
+ </sect2>
+
+ <indexterm>
+ <primary>DVD</primary>
+ <secondary>DVD-Video</secondary>
+ </indexterm>
+
+ <sect2>
+ <title>刻录 DVD-Video</title>
+
+ <para> DVD-Video 是一个特殊的基于 ISO 9660
+ 和 micro-UDF (M-UDF) 规范的文件系统。DVD-Video
+ 也呈现了一个特殊的数据体系结构,
+ 这就是为什么您需要一个特殊的程序像 <filename
+ role="package">multimedia/dvdauthor</filename> 来制作
+ DVD 的原因。</para>
+
+ <para>如果您已经有了 DVD-Video 文件系统的映像,
+ 就可以以同样的方式制作另一个映像,可以参看前面章节的例子。
+ 如果您想制作 DVD 并想放在特定的目录中,如在目录
+ <filename role="directory">/path/to/video</filename> 中,
+ 可以使用下面的命令来刻录 DVD-Video:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -Z <replaceable>/dev/cd0</replaceable> -dvd-video <replaceable>/path/to/video</replaceable></userinput></screen>
+
+ <para> <option>-dvd-video</option> 选项将传递给
+ &man.mkisofs.8; 并指示它创建一个 DVD-Video 文件系统布局。
+ 除此之外。 <option>-dvd-video</option> 选项也包含了
+ <option>-dvd-compat</option> &man.growisofs.1;
+ 选项。</para>
+ </sect2>
+
+ <indexterm>
+ <primary>DVD</primary>
+ <secondary>DVD+RW</secondary>
+ </indexterm>
+
+ <sect2>
+ <title>使用 DVD+RW</title>
+
+ <para>不像 CD-RW, 一个空白的 DVD+RW 在每一次使用前必须先格式化。
+ &man.growisofs.1; 程序将会适时的自动对其进行适当的处理,
+ 这是 <emphasis>recommended</emphasis> 的方式。您也可以使用
+ <command>dvd+rw-format</command> 来对 DVD+RW 进行格式化:</para>
+
+ <screen>&prompt.root; <userinput>dvd+rw-format <replaceable>/dev/cd0</replaceable></userinput></screen>
+
+ <para>您只需要执行这样的操作一次,牢记只有空白的
+ DVD+RW 介质才需要格式化。您可以以前面章节同样的方式来刻录
+ DVD+RW。</para>
+
+ <para>如果您想刻录新的数据 (刻录一个新的完整的文件系统
+ 而不仅仅是追加一些数据) 到 DVD+RW,您不必再将其格式化成空白盘,
+ 您只须要直接覆盖掉以前的记录即可。
+ (执行一个新的初始化对话), 像这样:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -Z <replaceable>/dev/cd0</replaceable> -J -R <replaceable>/path/to/newdata</replaceable></userinput></screen>
+
+ <para>DVD+RW 格式化程序为简单的向以前的记录追加数据提供了可能性。
+ 这个操作有一个新的会话和一个已经存在的会话合并而成。
+ 它不需要多个写会话过程,
+ &man.growisofs.1; 将在介质上 <emphasis>增加</emphasis>
+ ISO 9660 文件系统。</para>
+
+ <para>例如,我们想追加一些数据到到我们以前的
+ DVD+RW 上,我们可以使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -M <replaceable>/dev/cd0</replaceable> -J -R <replaceable>/path/to/nextdata</replaceable></userinput></screen>
+
+ <para>我们用来刻录初始会话的同样的 &man.mkisofs.8;
+ 选项会在以后的写操作中使用。</para>
+
+ <note>
+ <para>如果您想获得与 DVD-ROM 驱动更好的兼容性,可以使用 <option>-dvd-compat</option>
+ 选项。在 DVD+RW 这种情况下,将不能预防您添加数据。</para>
+ </note>
+
+ <para>如果出于某种原因您真的想要空白介质盘,
+ 可以执行下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -Z <replaceable>/dev/cd0</replaceable>=<replaceable>/dev/zero</replaceable></userinput></screen>
+ </sect2>
+
+ <indexterm>
+ <primary>DVD</primary>
+ <secondary>DVD-RW</secondary>
+ </indexterm>
+
+ <sect2>
+ <title>使用 DVD-RW</title>
+
+ <para> DVD-RW 接受两种光盘格式:增补顺序写入和受限式覆写。默认的
+ DVD-RW 盘是顺序写入格式。</para>
+
+ <para>空白的 DVD-RW 能够直接进行刻录而不需要格式化操作,
+ 然而非空的顺序写入格式的 DVD-RW 需要格式化才能写入新的初始区段。</para>
+
+ <para>要格式化一张 DVD-RW 为顺序写入模式,运行:</para>
+
+ <screen>&prompt.root; <userinput>dvd+rw-format -blank=full <replaceable>/dev/cd0</replaceable></userinput></screen>
+
+ <note>
+ <para>一次完全的格式化 (<option>-blank=full</option>)
+ 在 1x 倍速的介质上将会花费大约 1 个小时。快速格式化可以使用
+ <option>-blank</option> 选项来进行,如果
+ DVD-RW 要以 Disk-At-Once (DAO) 模式刻录的话。要以
+ DAO 模式刻录 DVD-RW,使用命令:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -use-the-force-luke=dao -Z <replaceable>/dev/cd0</replaceable>=<replaceable>imagefile.iso</replaceable></userinput></screen>
+
+ <para><option>-use-the-force-luke=dao</option> 选项不是必需的,
+ 因为 &man.growisofs.1; 试图最低限度的检测 (快速格式化) 介质并进行
+ DAO 写入。</para>
+
+ <para>事实上对于任何 DVD-RW 都应该使用受限式覆写模式,
+ 这种格式比默认的增补顺序写入更加灵活。</para>
+ </note>
+
+ <para>在一张顺序 DVD-RW 上写入数据,使用和其他 DVD 格式相同的说明:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -Z <replaceable>/dev/cd0</replaceable> -J -R <replaceable>/path/to/data</replaceable></userinput></screen>
+
+ <para>如果您想在您以前的刻录上附加数据,您必须使用
+ &man.growisofs.1; 的 <option>-M</option> 选项。然而,
+ 如果您在一张增补顺序写入模式的 DVD-RW 上附加数据,
+ 将会在盘上创建一个新的区段,结果就是一张多区段光盘。</para>
+
+ <para>受限式覆写格式的 DVD-RW 在新的初始化区段前不需要格式化,
+ 您只是要用 <option>-Z</option> 选项覆写光盘,这和
+ DVD+RW 的情形是相似的。也可以用和 DVD+RW 同样方式的
+ <option>-M</option> 选项把现存的 ISO 9660 文件系统写入光盘。
+ 结果会是一张单区段 DVD。</para>
+
+ <para>要把 DVD-RW 置于受限式覆写格式,
+ 必须使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>dvd+rw-format <replaceable>/dev/cd0</replaceable></userinput></screen>
+
+ <para>更改回顺序写入模式使用:</para>
+
+ <screen>&prompt.root; <userinput>dvd+rw-format -blank=full <replaceable>/dev/cd0</replaceable></userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>多区段</title>
+
+ <para>几乎没有哪个 DVD-ROM 驱动器支持多区段
+ DVD,它们大多数时候都只读取第一个区段。
+ 顺序写入格式的 DVD+R、DVD-R 和 DVD-RW 可以支持多区段,
+ DVD+RW 和 DVD-RW 受限式覆写格式不存在多区段的概念。</para>
+
+ <para>在 DVD+R、DVD-R 或者 DVD-RW 的顺序写入格式下,
+ 一次初始化 (未关闭) 区段之后使用下面的命令,
+ 将会在光盘上添加一个新的区段:</para>
+
+ <screen>&prompt.root; <userinput>growisofs -M <replaceable>/dev/cd0</replaceable> -J -R <replaceable>/path/to/nextdata</replaceable></userinput></screen>
+
+ <para>对 DVD+RW 或者 DVD-RW 在受限式覆写模式下使用这条命令,
+ 会合并新区段到存在的区段中来附加数据。
+ 结果就是一张单区段光盘。
+ 这是在这些介质上用于在最初的写操作之后添加数据的方式。</para>
+
+ <note>
+ <para>介质上的一些空间用于区段之间区段的开始与结束。
+ 因此,应该用大量的数据添加区段来优化介质空间。
+ 对于 DVD+R 来说区段的数量限制为 154,
+ 对于 DVD-R 来说大约是 2000,对于双层 DVD+R 来说是 127。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>更多的信息</title>
+
+ <para>要获得更多的关于 DVD 的信息
+ <command>dvd+rw-mediainfo
+ <replaceable>/dev/cd0</replaceable></command> 命令可以运行来获得
+ 更多的信息。</para>
+
+ <para>更多的关于
+ <application>dvd+rw-tools</application> 的信息可以在
+ &man.growisofs.1; 手册页找到,在 <ulink
+ url="http://fy.chalmers.se/~appro/linux/DVD+RW/">dvd+rw-tools
+ web site</ulink> 和 <ulink
+ url="http://lists.debian.org/cdwrite/">cdwrite mailing
+ list</ulink> 联接中也可找到。</para>
+
+ <note>
+ <para> <command>dvd+rw-mediainfo</command> 命令的输出结果记录或
+ 媒体的问题被做成问题报告。没有这些输出,对你的帮助将会十分困难。</para>
+ </note>
+ </sect2>
+ </sect1>
+
+ <sect1 id="floppies">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Julio</firstname>
+ <surname>Merino</surname>
+ <contrib>Original work by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 24 Dec 2001 -->
+ <authorgroup>
+ <author>
+ <firstname>Martin</firstname>
+ <surname>Karlsson</surname>
+ <contrib>Rewritten by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 27 Apr 2003 -->
+ </sect1info>
+
+ <title>创建和使用软盘</title>
+
+ <para>把数据存储在软盘上有时也是十分有用的。
+ 例如,当没有其它可靠的存储介质或要传递少量的数据到其它的
+ 计算机。</para>
+
+ <para>这一章将介绍怎样在 FreeBSD 上使用软盘。
+ 在使用 DOS 3.5 英寸软盘时首要要涉及的就是格式化,
+ 但其概念与其它的软盘格式化极为类似。</para>
+
+ <sect2>
+ <title>格式化软盘</title>
+
+ <sect3>
+ <title>设备</title>
+
+ <para>软盘的访问像其它设备一样是通过在
+ <filename>/dev</filename> 中的条目来实现的。
+ 访问 raw 软盘在 4.X 和更早的版本,使用
+ <filename>/dev/fd<replaceable>N</replaceable></filename>,
+ 这里 <replaceable>N</replaceable> 标识设备号,通常为 0 ,
+ 或 <filename>/dev/fd<replaceable>NX</replaceable></filename>,
+ 这里 <replaceable>X</replaceable> 标识为一个字符。</para>
+
+ <para>在 5.0 或更新的版本中,简单的使用
+ <filename>/dev/fd<replaceable>N</replaceable></filename>。</para>
+
+ <sect4>
+ <title>4.X 以及更早版本的磁盘大小</title>
+
+ <para>也有 <filename>/dev/fd<replaceable>N</replaceable>.<replaceable>size</replaceable></filename>
+ 这样的设备,这里 <replaceable>size</replaceable> 代表软盘的含量以 KB 为单位。
+ 这个条目用在低级格式化时来确定磁盘的大小。下面的例子就是 1440kB </para>
+
+ <para>有时这些条目必须在 <filename>/dev</filename> 目录中进行重建。
+ 可以这样做:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev && ./MAKEDEV "fd*"</userinput></screen>
+ </sect4>
+
+ <sect4>
+ <title>5.0 以及更新版本的磁盘大小</title>
+
+ <para>在 5.0 版本中, &man.devfs.5; 将自动管理在
+ <filename>/dev</filename> 目录中的设备,所以不摧荐使用
+ <command>MAKEDEV</command> 命令。</para>
+
+ <para>如果期望得到确定大小的磁盘可以给 &man.fdformat.1; 传递
+ <option>-f</option> 参数。支持的大小列在
+ &man.fdcontrol.8; 中,但是建议和工作状态最好的 1440kB 。</para>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>格式化</title>
+
+ <para>一张软盘在使用这前必须先被低级格式化。
+ 通常卖主已经做过了,但格式化是检测介质完整性的一种好方法。
+ 尽管这有可能会强取大量(或少量)的硬盘大小,但
+ 大部分磁盘都能被格式化设计为 1440kB 。</para>
+
+ <para>低级格式化软盘你需要使用
+ &man.fdformat.1; 命令。这个程序需要设备名作为参数。</para>
+
+ <para>要留意一切错误信息,这些信息能够帮助你确定
+ 磁盘的好与坏。</para>
+
+ <sect4>
+ <title>在 4.X 以及更早版本中格式化</title>
+
+ <para>使用
+ <filename>/dev/fd<replaceable>N</replaceable>.<replaceable>size</replaceable></filename>
+ 设备来格式化软盘。插入一张新的 3.5 英寸的软盘在你的设备里:</para>
+
+ <screen>&prompt.root; <userinput>/usr/sbin/fdformat /dev/fd0.1440</userinput></screen>
+
+ </sect4>
+
+ <sect4>
+ <title>在 5.0 以及更新版本中格式化</title>
+
+ <para>使用
+ <filename>/dev/fd<replaceable>N</replaceable></filename>
+ 设备来格式化软盘。插入一张新的 3.5 英寸的软盘在你的设备中:</para>
+
+ <screen>&prompt.root; <userinput>/usr/sbin/fdformat -f 1440 /dev/fd0</userinput></screen>
+
+ </sect4>
+ </sect3>
+ </sect2>
+
+
+
+ <sect2>
+ <title>磁盘标签</title>
+
+ <para>经过低级格式化后,你需要给它分配一个标签。
+ 这个磁盘标签以后会被消毁,但是系统却需要它来确定硬盘的大小。</para>
+
+ <para>新的磁盘标签将会接管整个磁盘,会包括所有合适的关于软盘的 geometry 信息。
+ 磁盘标签的 geometry 值列在
+ <filename>/etc/disktab</filename>中。</para>
+
+ <para>你能够使用 &man.disklabel.8; 像下面这样:</para>
+
+ <screen>&prompt.root; <userinput>/sbin/disklabel -B -r -w /dev/fd0 fd1440</userinput></screen>
+
+ <note><para>从 &os;&nbsp;5.1-RELEASE, 开始 &man.bsdlabel.8;
+ 程序代替了旧版本的 &man.disklabel.8; 程序。随着
+ &man.bsdlabel.8; 一起许多陈旧的选项和参数也被清除了;
+ 在上面的例子中,选项
+ <option>-r</option> 将被去掉。要想得到更多的信息,
+ 请参考 &man.bsdlabel.8; 手册页。</para></note>
+
+ </sect2>
+
+ <sect2>
+ <title>文件系统</title>
+
+ <para>现在对软盘进行高级格式化。
+ 这会在它上面安置一个新的文件系统,可使 FreeBSD 来对它进行读写。
+ 在创建完新的文件系统后,磁盘标签将被消毁,所以如果你想重新格式化磁盘,
+ 你必须重新创建磁盘标签。</para>
+
+ <para>软盘的文件系统可以选择 UFS 或 FAT 。
+ FAT 是通常情况下软盘比较好的选择。</para>
+
+ <para>要制作新的文件系统在软盘上,可以使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>/sbin/newfs_msdos /dev/fd0</userinput></screen>
+
+ <para>现在磁盘已经可以进行读取和使用。</para>
+ </sect2>
+
+
+ <sect2>
+ <title>使用软盘</title>
+
+ <para>要使用软盘,需要先使用 &man.mount.msdos.8; (在
+ 4.X 和更早的版本中) 或 &man.mount.msdosfs.8; (在 5.0 或更新
+ 的版本中)。也可以使用在 ports collection
+ 中的<filename role="package">emulators/mtools</filename> 程序。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="backups-tapebackups">
+ <title>用磁带机备份</title>
+
+ <indexterm><primary>tape media</primary></indexterm>
+ <para>主流的磁带机有 4mm, 8mm, QIC, mini-cartridge 和 DLT。</para>
+
+ <sect2 id="backups-tapebackups-4mm">
+ <title>4mm (DDS: Digital Data Storage)</title>
+
+ <indexterm>
+ <primary>tape media</primary>
+ <secondary>DDS (4mm) tapes</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>tape media</primary>
+ <secondary>QIC tapes</secondary>
+ </indexterm>
+ <para>4mm 磁带机取代了 QIC 而成为工作站备份数据在设备面停止了 QIC 设备
+ 的生产。 4mm 的驱动器更加小和安静,但对于数据保存的可信度仍不及 8mm
+ 驱动器。它要比 8mm 的便宜和小得多 (3 x 2 x 0.5 inches, 76 x 51
+ x 12 mm) 。和 8mm 的一样,读写关的寿命都不长,因为它们同样使用螺旋式
+ 的方式来读写。</para>
+
+ <para>数据传输的速度约在 ~150&nbsp;kB/s, 到 ~500&nbsp;kB/s 之间,可存储
+ 空间从 1.3&nbsp;GB 到 2.0&nbsp;GB 之间,硬件压缩可使空间加倍。磁带库
+ 单元可以有 6 台磁带机,120 个磁带匣,以自动切换的方式使用同一个磁带柜,
+ 磁带库的容量可达 240&nbsp;GB 。</para>
+
+ <para>DDS-3 标准现在支持的磁带机容量最高可达到 12&nbsp;GB (或压缩的 24&nbsp;GB )。</para>
+
+ <para>4mm 和 8mm 同样都使用螺旋式读写的方式,所有螺旋式读写的优点及缺点,
+ 都可以在 4mm 和 8mm 磁带机上看到。</para>
+
+ <para>磁带在经过 2,000 次的使用或 100 次的全部备份后,就该退休了。</para>
+ </sect2>
+
+ <sect2 id="backups-tapebackups-8mm">
+ <title>8mm (Exabyte)</title>
+ <indexterm>
+ <primary>tape media</primary>
+ <secondary>Exabyte (8mm) tapes</secondary>
+ </indexterm>
+
+ <para>8mm 磁带机是最常见的 SCSI 磁带机,也是磁带交换的最佳选择。几乎每个
+ 工作站都有一台 2&nbsp;GB 8mm 磁带机。8mm 磁带机可信度高、方便、安静。
+ 卡匣小 (4.8 x 3.3 x 0.6 inches; 122 x 84 x 15 mm)而且不贵。8mm 磁带机
+ 的下边是一个短短的读写头,而读写头的寿命取决于磁带经过读写头时,相对高
+ 速运动情况。</para>
+
+ <para>数据传输速度约在 250&nbsp;kB/s 到 500&nbsp;kB/s 之间,可存储的空间从
+ 300&nbsp;MB 到 7&nbsp;GB,硬件压缩可使空间加倍。磁带库单元可以有 6 台磁
+ 带机,120 个磁带匣,以自动切换的方式使用同一个磁带柜,磁带库的容量可达
+ 840+&nbsp;GB。</para>
+
+ <para>Exabyte <quote>Mammoth</quote> 模型支持 12&nbsp;GB 的容量在一个磁带
+ 上(压缩后可达 24&nbsp;GB )相当于普通磁带的二倍。</para>
+
+ <para>数据是使用螺旋式读写的方式记录在磁带上的,读写头和磁带约相差 6 度,
+ 磁带以 270 度缠绕着轴,并抵住读写头,轴适时地旋转,使得磁带具有高密度,
+ 从一端到另一端并可使磁道紧密地分布。</para>
+ </sect2>
+
+ <sect2 id="backups-tapebackups-qic">
+ <title>QIC</title>
+ <indexterm>
+ <primary>tape media</primary>
+ <secondary>QIC-150</secondary>
+ </indexterm>
+
+ <para>QIC-150 是最常见的磁带机。 QIC 磁带机是最便宜的 <quote>正规</quote>
+ 备份驱动器。和 8mm or 4mm 比较,QIC 磁带机最高可能要 5 倍的价钱每 GB。
+ 假如您需要六台左右的磁带机,那么 QIC 将是正确的选择。 QIC 是
+ <emphasis>最常见</emphasis> 的磁带机,每个工作站都会有一台 QIC 磁带机。
+ QIC 磁带机具有几种不同的存储密度。QIC 磁带机并不安静,读写时的声音都可清
+ 淅地听到。 QIC 磁带机的规格:(6 x 4 x 0.7 inches; 15.2 x10.2 x 1.7 mm)。</para>
+
+ <para>数据传输的速度介于 150&nbsp;kB/s 到 500&nbsp;kB/s 之间,可存储的空间
+ 从 40&nbsp;MB 到 15&nbsp;GB。较新的 QIC 磁带机具有硬件压缩的功能。 QIC
+ 的使用率愈来愈低,渐渐被 DAT 所取代。</para>
+
+ <para>数据以磁道的方式记录在磁带上,磁道数及磁道的宽度会根据容量而有所不同。
+ 通常新的磁带机具有的向后兼容的读取功能(通常也具备写入的功能)。对于数据
+ 的安全性,QIC 具有不错的评价。</para>
+
+ <para>磁带机在经过 5,000 次的使用后,就该退休了。</para>
+ </sect2>
+
+ <sect2 id="backups-tapebackups-dlt">
+ <title>DLT</title>
+ <indexterm>
+ <primary>tape media</primary>
+ <secondary>DLT</secondary>
+ </indexterm>
+
+ <para>在这一章列出的磁带机中 DLT 具有最快的数据传输率。 1/2" (12.5mm) 的
+ 磁带包含在单轴的磁带匣 (4 x 4 x 1 inches; 100 x 100 x 25 mm)中。磁带匣
+ 的一边是一个旋转匣道,通过匣道的开合,可以让磁带卷动。磁带匣内只有一个
+ 轴,而本章中所提到的其他磁带匣都是有两个轴的(9磁道磁带机例外)。</para>
+
+ <para>数据传输的速度约 1.5&nbsp;MB/s,是 4mm, 8mm, 或 QIC 磁带机的三倍。
+ 可存储的空间从 10&nbsp;GB 到 20&nbsp;GB,具有磁带机数据库。磁带机数据库
+ 单元可以有 1 to 20 台磁带机,5 到 900 个磁带匣,磁带机数据库的容量可达
+ 50&nbsp;GB 到 9&nbsp;TB 。</para>
+
+ <para>如果要压缩的话,DLT 型 IV 格式的磁带机最高可支持 70&nbsp;GB 的存储
+ 容量。</para>
+
+ <para>数据存储在平行于磁带运行方向的磁道上(就像 QIC 磁带),一次写入两个
+ 磁道。读写头的寿命相当长,每当磁带停止前进,磁带与读写头之间没有相对运动。</para>
+ </sect2>
+
+ <sect2>
+ <title id="backups-tapebackups-ait">AIT</title>
+ <indexterm>
+ <primary>tape media</primary>
+ <secondary>AIT</secondary>
+ </indexterm>
+
+ <para>AIT 是 Sony 开发的一种新格式,每个磁带最高可以存储 50&nbsp;GB。磁带
+ 机使用内存芯片来保存磁带上的索引内容。这个索引能够被磁带机驱动器快速阅读
+ 来搜索磁带机上文件所处的位置,而不像其他的磁带机需要花几分钟的时间才能找
+ 到文件。像 <application>SAMS:Alexandria</application> 这样的软件:能够操
+ 作四十或者更多的 AIT 磁带库,直接使用内存芯片来进行通信把内容显示在屏幕上,
+ 以决定把什么文件备份到哪个磁带上,加载和恢复数据。</para>
+
+ <para>像这样的库成本大概在 $20,000 美元左右,零售市场可能还要贵一点。</para>
+ </sect2>
+
+ <sect2>
+ <title>第一次使用新的磁带机</title>
+
+ <para>当在一块完全空白的磁带上尝试定入数据时,会得到类似下面这样的错误信息:</para>
+
+ <screen>sa0(ncr1:4:0): NOT READY asc:4,1
+sa0(ncr1:4:0): Logical unit is in process of becoming ready</screen>
+
+ <para>信息指出这块磁带没有块编号 (block 编号为 0)。在 QIC-525 之后的所有 QIC
+ 磁带,都采用 QIC-525 标准,必须写入一个 Identifier Block 。对于这种问题,
+ 有以下两种解决的办法:
+
+ <itemizedlist>
+ <listitem>
+ <para>用<command>mt fsf 1</command> 可以让磁带机对磁带写入 Identifier Block 。</para>
+ </listitem>
+
+ <listitem>
+ <para>使用面板上的按钮磁带。</para>
+
+ <para>再插入一次,并存储 <command>dump</command> 数据到磁带上。</para>
+
+ <para>这时<command>dump</command> 将传回 <errorname>DUMP: End of tape
+ detected</errorname> ,然后您会得到这样的错误信息: <errorname>HARDWARE
+ FAILURE info:280 asc:80,96</errorname>。</para>
+
+ <para>这时用 <command>mt rewind</command> 来倒转磁带。</para>
+
+ <para>磁带操作的后续操作就完成了。</para>
+ </listitem>
+ </itemizedlist>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="backups-floppybackups">
+ <title>用软盘备份</title>
+
+ <sect2 id="floppies-using">
+ <title>能够使用软盘来备份数据吗</title>
+ <indexterm><primary>backup floppies</primary></indexterm>
+ <indexterm><primary>floppy disks</primary></indexterm>
+
+ <para>软磁盘通常是用来备份的设备中不太合适的设备:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>这种设备不太可靠,特别是长期使用。</para>
+ </listitem>
+
+ <listitem>
+ <para>备份和恢复都很慢</para>
+ </listitem>
+
+ <listitem>
+ <para>它们只有非常有限的存储容量。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>然而,如果没有其它的备份数据的方法,那软盘备份总比没有备份要好。</para>
+
+ <para>如果必须使用软盘的话,必须确保盘片的质量。软盘在办公室中使用已经有许多
+ 年了。最好使用一些名牌厂商的产品以确保质量。</para>
+ </sect2>
+
+ <sect2 id="floppies-creating">
+ <title>如何备份数据到软盘</title>
+
+ <para>最好的备份数据到软盘的方法是使用 &man.tar.1; 程序加上 <option>-M</option> 选项,
+ 它可以允许数据备份到多张软盘上。</para>
+
+ <para>要备份当前目录中所有的文件可以使用这个命令 (需要有 <username>root</username>权限):</para>
+
+ <screen>&prompt.root; <userinput>tar Mcvf /dev/fd0 *</userinput></screen>
+
+ <para>当第一张盘满的时候, &man.tar.1; 会指示您插入下一张盘,插入第二张盘之后就按回车。</para>
+
+ <screen>Prepare volume #2 for /dev/fd0 and hit return:</screen>
+
+ <para>这个步骤可能需要重复很多次,直到这些文件备份完成为止。</para>
+ </sect2>
+
+ <sect2 id="floppies-compress">
+ <title>可以压缩备份吗</title>
+ <indexterm>
+ <primary><command>tar</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary><command>gzip</command></primary>
+ </indexterm>
+ <indexterm><primary>compression</primary></indexterm>
+
+ <para>不幸的是,&man.tar.1; 在为多卷文件作备份时是不允许使用 <option>-z</option>
+ 选项的。当然,可以用 &man.gzip.1; 压缩所有的文件,把它们打包到磁盘,以后在用
+ &man.gunzip.1; 解开。</para>
+ </sect2>
+
+ <sect2 id="floppies-restoring">
+ <title>如何恢复备份</title>
+
+ <para>要恢复所有文件:</para>
+
+ <screen>&prompt.root; <userinput>tar Mxvf /dev/fd0</userinput></screen>
+
+ <para>有两种方法来恢复软盘中的个别文件。首先,就要用第一张软盘启动:</para>
+
+ <screen>&prompt.root; <userinput>tar Mxvf /dev/fd0 <replaceable>filename</replaceable></userinput></screen>
+
+ <para>&man.tar.1; 程序会提示您插入后面的软盘,直到它找到所需要的文件。</para>
+
+ <para>如果您知道哪个文件在哪个盘上,您就可以插入那张盘,然后使用上同同样的命令。
+ 如果软盘上的第一个文件与前面的文件是连续的,那 &man.tar.1; 命令会警告您它无法
+ 恢复,即使您不要求它这样做。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="backup-basics">
+ <title>备份程序</title>
+
+ <para>有三个主要的备份程序 &man.dump.8;、&man.tar.1; 和 &man.cpio.1;。</para>
+
+ <sect2>
+ <title>Dump 和 Restore</title>
+ <indexterm>
+ <primary>备份软件</primary>
+ <secondary>dump / restore</secondary>
+ </indexterm>
+ <indexterm><primary><command>dump</command></primary></indexterm>
+ <indexterm><primary><command>restore</command></primary></indexterm>
+
+ <para><command>dump</command> 和 <command>restore</command> 是 &unix;
+ 传统的备份程序。它以 block 而不是以文件为单位来备份数据、链接或目录。
+ <command>dump</command> 备份的是设备上的整个文件系统,不能只备份一
+ 一个文件系统的部分或是用到两个以上文件系统的目录树。
+ <command>dump</command> 不会写文件和目录到磁带机,而是写入包含文件
+ 和目录的原始数据块。</para>
+
+ <note><para>如果在您的 root 目录使用 <command>dump</command> ,将不需要
+ 备份 <filename>/home</filename>、<filename>/usr</filename> 或其他目录,
+ 因为这些是典型的其他文件系统或符号连接到那些文件系统的加载点。</para></note>
+
+ <para><command>dump</command> 是最早出现于 AT&amp;T UNIX 的 Version 6 (约 1975)。
+ 默认的参数适用于 9-track 磁带(6250 bpi),所以如果要用高密度的磁带(最高可达
+ 62,182 ftpi),就不能用默认的参数,而要另外指定参数。这些默认值必须在命令行被
+ 修改以更好地利用当前磁带机的功能。</para>
+
+ <indexterm><primary><filename>.rhosts</filename></primary></indexterm>
+ <para><command>rdump</command> 和 <command>rrestore</command> 可以通过网络在另一
+ 台计算机的磁带机上备份数据。这两个程序都是依靠 <command>rcmd</command> 和
+ <command>ruserok</command> 来访问远程的磁带机。因此,运行备份的用户必须要有远程
+ 主机的 <filename>.rhosts</filename> 访问权。<command>rdump</command> 和
+ <command>rrestore</command> 的参数必须适用于远程主机(例如,当您从 FreeBSD 连到
+ 一台 SUN 工作站 knomodo 去使用磁带机时,使用:</para>
+
+ <screen>&prompt.root; <userinput>/sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&amp;1</userinput></screen>
+
+ <para>要注意的是:必须检查您在使用 <filename>.rhosts</filename> 时的安全情况。</para>
+
+ <para>也可以通过使用 <command>ssh</command> 用一个更安全的方式来使用 <command>dump</command>
+ 和 <command>restore</command> 。</para>
+
+ <example>
+ <title>通过 <application>ssh</application> 使用 <command>dump</command> </title>
+
+ <screen>&prompt.root; <userinput>/sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
+ targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz</userinput></screen>
+
+ </example>
+
+ <para>或使用 <command>dump</command> 的 built-in 方法,
+ 设置环境变量 <envar>RSH</envar>:</para>
+
+ <example>
+ <title>通过设置 <application>ssh</application> 环境变量 <envar>RSH</envar> 使用 <command>dump</command> </title>
+
+ <screen>&prompt.root; <userinput>RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0</userinput></screen>
+
+ </example>
+
+ </sect2>
+
+ <sect2>
+ <title><command>tar</command></title>
+ <indexterm>
+ <primary>备份软件</primary>
+ <secondary><command>tar</command></secondary>
+ </indexterm>
+
+ <para>&man.tar.1; 也同样是在 AT&amp;T UNIX Version 6 (约 1975)中出现的。
+ <command>tar</command> 可以直接对文件系统操作。它直接将文件和目录写到
+ 磁带上, <command>tar</command> 不支持像 &man.cpio.1; 那样多的选项,但
+ <command>tar</command> 不需要用像用 <command>cpio</command> 那样奇怪的
+ 命令行管道。</para>
+
+ <indexterm><primary><command>tar</command></primary></indexterm>
+ <para>许多版本的 <command>tar</command> 不支持通过网络备份,而 GNU 版的
+ <command>tar</command> (FreeBSD 用的就是 GNU 版的)提供与 <command>rdump</command>
+ 相同的语法来使用远程的设备。例如要 <command>tar</command> Sun 工作站
+ <hostid>komodo</hostid> 上一台 Exabyte 磁带机,主使用:</para>
+
+ <screen>&prompt.root; <userinput>/usr/bin/tar cf komodo:/dev/nsa8 . 2>&amp;1</userinput></screen>
+
+ <para>对于不支持远程设备的版本,可以使用一个管道和 <command>rsh</command>
+ 传送数据给远程的磁带机。</para>
+
+ <screen>&prompt.root; <userinput>tar cf - . | rsh <replaceable>hostname</replaceable> dd of=<replaceable>tape-device</replaceable> obs=20b</userinput></screen>
+
+ <para>如果您担心通过网络备份会有安全问题,应当使用 <command>ssh</command> ,
+ 而不是 <command>rsh</command>。</para>
+ </sect2>
+
+ <sect2>
+ <title><command>cpio</command></title>
+ <indexterm>
+ <primary>backup software</primary>
+ <secondary><command>cpio</command></secondary>
+ </indexterm>
+
+ <para>&man.cpio.1; 是 &unix; 最早用来作文件交换的磁带机程序。它有执行字节
+ 交换的选项,可以用几种不同的格式写入,并且可以将数据用管道传给其他程序。
+ <command>cpio</command> 没办法自动查找目录树内的文件列表,必须通过标准
+ 输入 <filename>stdin</filename> 来指定。</para>
+ <indexterm><primary><command>cpio</command></primary></indexterm>
+
+ <para><command>cpio</command> 不支持通过网络的备份方式。可以使用 pipeline 和
+ <command>rsh</command> 来传送数据给远程的磁带机。</para>
+
+ <screen>&prompt.root; <userinput>for f in <replaceable>directory_list; do</replaceable></userinput>
+<userinput>find $f >> backup.list</userinput>
+<userinput>done</userinput>
+&prompt.root; <userinput>cpio -v -o --format=newc < backup.list | ssh <replaceable>user</replaceable>@<replaceable>host</replaceable> "cat > <replaceable>backup_device</replaceable>"</userinput></screen>
+
+ <para>这里的 <replaceable>directory_list</replaceable> 是要备份的目录列表,
+ <replaceable>user</replaceable>@<replaceable>host</replaceable> 结合了将
+ 要执行备份的用户名和主机名,<replaceable>backup_device</replaceable> 是写
+ 入备份的设备(如 <filename>/dev/nsa0</filename>)。</para>
+ </sect2>
+
+ <sect2>
+ <title><command>pax</command></title>
+ <indexterm>
+ <primary>backup software</primary>
+ <secondary><command>pax</command></secondary>
+ </indexterm>
+ <indexterm><primary><command>pax</command></primary></indexterm>
+ <indexterm><primary>POSIX</primary></indexterm>
+ <indexterm><primary>IEEE</primary></indexterm>
+
+ <para>&man.pax.1; 是符合 IEEE/&posix; 标准的程序。多年来各种不同版本
+ 的 <command>tar</command> 和 <command>cpio</command> 间有些不兼容。
+ 为了防止这种情况,并使其标准化,&posix; 出了这套新的工具程序。
+ <command>pax</command> 尝试可以读写各种 <command>cpio</command>
+ 和 <command>tar</command> 的格式,并可以自己增加新的格式。它的命令
+ 集比 <command>tar</command> 更接近 <command>cpio</command>。</para>
+ </sect2>
+
+ <sect2 id="backups-programs-amanda">
+ <title><application>Amanda</application></title>
+ <indexterm>
+ <primary>backup software</primary>
+ <secondary><application>Amanda</application></secondary>
+ </indexterm>
+ <indexterm><primary><application>Amanda</application></primary></indexterm>
+
+ <!-- Remove link until <port> tag is available -->
+ <para><application>Amanda</application> (Advanced Maryland
+ Network Disk Archiver) 并非单一的程序,而是一个客户机/服务器模式的备份系统
+ 。一台 <application>Amanda</application> 服务器可以备份任意数量执行
+ <application>Amanda</application> 的客户机或是将连上 <application>Amanda</application>
+ 服务器的计算机上的数据备份到一台磁带机上。一个常见的问题是,数据写入磁带机的时间将超
+ 过取行数据的时间,而 <application>Amanda</application> 解决了这个问题。它使用一个
+ <quote>holding disk</quote> 来同时备份几个文件系统。 <application>Amanda</application>
+ 建立 <quote>archive sets</quote> 的一组磁带,用来备份在 <application>Amanda</application>
+ 的配置文件中所列出的完整的文件系统。</para>
+
+ <para> <application>Amanda</application> 配置文件提供完整的备份控制及
+ <application>Amanda</application> 产生的网络传输。 <application>Amanda</application>
+ 可以使用上述任何一个设备程序来向磁带写入数据。<application>Amanda</application>
+ 可以从 port 或 package 取得,它并非系统默认安装的。</para>
+ </sect2>
+
+ <sect2>
+ <title>Do Nothing 备份策略</title>
+
+ <para><quote>Do nothing</quote> 不是一个程序,而是被广泛使用的备份策略。
+ 不需要预算,不需要备份的计划表,全部都不用。如果您的数据发生了什么问题,
+ 忽略它!</para>
+
+ <para>如果您的时间和数据不值得您做这些事,那么 <quote>Do nothing</quote>
+ 将是最好的备份程序。要注意的是,&unix; 是相当好用的工具,您可能在几个月
+ 内,就发现您已经收集了不少对您来说相当具有价值的文件和程序。</para>
+
+ <para><quote>Do nothing</quote> 对于像 <filename>/usr/obj</filename> 和其他
+ 可由您的计算机产生的文件来说,是最好的方法。例如这本手册包含有 HTML 或
+ &postscript; 格式的文件。这些文档格式是从 SGML 输入文件创建的。创建 HTML
+ 或 &postscript; 格式的文件的备份就没有必要了。只要经常备份 SGML 文件就够了。</para>
+ </sect2>
+
+ <sect2>
+ <title>哪个备份程序最好?</title>
+ <indexterm>
+ <primary>LISA</primary>
+ </indexterm>
+
+ <para>在&man.dump.8; <emphasis>时期</emphasis> Elizabeth D. Zwicky
+ 测试了所有以上列出的备份程序。在各种各样怪异的文件系统中,
+ <command>dump</command> 是您明智的选择。Elizabeth 建立起各种各样、
+ 奇怪或常见的文件系统,并用各种备份程序,测试在各种文件系统上备份
+ 及恢复数据。这些怪异之处包括:具有 holes 和一个 nulls block 的文件,
+ 文件名具有有趣字符,无法读写的文件及设备,在备份时改变文件大小,在
+ 备份时建立或删除的文件。她将结果刑在: LISA V in Oct. 1991.
+ See <ulink
+ url="http://berdmann.dyndns.org/zwicky/testdump.doc.html">torture-testing
+ Backup and Archive Programs</ulink>.</para>
+ </sect2>
+
+ <sect2>
+ <title>应急恢复程序</title>
+
+ <sect3>
+ <title>在出现灾难前</title>
+
+ <para>在遇到灾难前,只需要执行以下四个步骤:</para>
+ <indexterm>
+ <primary><command>disklabel</command></primary>
+ </indexterm>
+
+ <para>第一,打出您的每个磁盘驱动器的磁盘标签(例如:
+ <command>disklabel da0 | lpr</command>),文件系统表,
+ (<filename>/etc/fstab</filename>) ,以及所有启动信息,并将每个拷贝
+ 两份。</para>
+
+ <indexterm><primary>fix-it floppies</primary></indexterm>
+ <para>第二,确定遇到的情况时,用来启动及修复的软盘
+ (<filename>boot.flp</filename> 和 <filename>fixit.flp</filename>)
+ 具有您所有的设备代号。最简单的方法是用软盘启动,然后检查启动信息,
+ 如果设备都被列出,并且可以正常使用,就可以跳到第三步。</para>
+
+ <para>否则,必须建立两张传统的可启动软盘,并包含:
+ <command>fdisk</command>, <command>disklabel</command>,
+ <command>newfs</command>, <command>mount</command>, 以及所有使用的
+ 备份程序。这些程序必须被静态的连接。如果使用的是 <command>dump</command>,
+ 那么这张软盘就必须包含 <command>restore</command>。</para>
+
+ <para>第三,定期将数据备份到磁带。任何在上次备份后的改变都无法恢复。记得将
+ 磁盘写保护。</para>
+
+ <para>第四,测试在第二步所建立的软盘及备份的磁带,将过程记录下来,并和这张
+ 可启动的软盘和磁带放在一起。也许您在恢复时会想要,而这份记录将防止您破坏
+ 您的磁带 (怎么说呢?因为您可能将 <command>tar xvf /dev/sa0</command> 打成
+ <command>tar cvf /dev/sa0</command> 而重写了备份磁带)。</para>
+
+ <para>为了安全,您可以每次都做两份备份磁带及一张启动磁盘,并将其中
+ 一份备份磁带存放在其它地方。其它地方不是指同一栋办公大楼的地下室
+ (世贸中心的一些公司应该学到了一些教训),而是真的要让人的磁带离您
+ 的的计算机远远的。</para>
+
+ <example>
+ <title>一个建立启动磁盘的 shell 脚本例子:</title>
+
+ <programlisting><![ CDATA [#!/bin/sh
+#
+# create a restore floppy
+#
+# format the floppy
+#
+PATH=/bin:/sbin:/usr/sbin:/usr/bin
+
+fdformat -q fd0
+if [ $? -ne 0 ]
+then
+ echo "Bad floppy, please use a new one"
+ exit 1
+fi
+
+# place boot blocks on the floppy
+#
+disklabel -w -B /dev/fd0c fd1440
+
+#
+# newfs the one and only partition
+#
+newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/fd0a
+
+#
+# mount the new floppy
+#
+mount /dev/fd0a /mnt
+
+#
+# create required directories
+#
+mkdir /mnt/dev
+mkdir /mnt/bin
+mkdir /mnt/sbin
+mkdir /mnt/etc
+mkdir /mnt/root
+mkdir /mnt/mnt # for the root partition
+mkdir /mnt/tmp
+mkdir /mnt/var
+
+#
+# populate the directories
+#
+if [ ! -x /sys/compile/MINI/kernel ]
+then
+ cat << EOM
+The MINI kernel does not exist, please create one.
+Here is an example config file:
+#
+# MINI -- A kernel to get FreeBSD onto a disk.
+#
+machine "i386"
+cpu "I486_CPU"
+ident MINI
+maxusers 5
+
+options INET # needed for _tcp _icmpstat _ipstat
+ # _udpstat _tcpstat _udb
+options FFS #Berkeley Fast File System
+options FAT_CURSOR #block cursor in syscons or pccons
+options SCSI_DELAY=15 #Be pessimistic about Joe SCSI device
+options NCONS=2 #1 virtual consoles
+options USERCONFIG #Allow user configuration with -c XXX
+
+config kernel root on da0 swap on da0 and da1 dumps on da0
+
+device isa0
+device pci0
+
+device fdc0 at isa? port "IO_FD1" bio irq 6 drq 2 vector fdintr
+device fd0 at fdc0 drive 0
+
+device ncr0
+
+device scbus0
+
+device sc0 at isa? port "IO_KBD" tty irq 1 vector scintr
+device npx0 at isa? port "IO_NPX" irq 13 vector npxintr
+
+device da0
+device da1
+device da2
+
+device sa0
+
+pseudo-device loop # required by INET
+pseudo-device gzip # Exec gzipped a.out's
+EOM
+ exit 1
+fi
+
+cp -f /sys/compile/MINI/kernel /mnt
+
+gzip -c -best /sbin/init > /mnt/sbin/init
+gzip -c -best /sbin/fsck > /mnt/sbin/fsck
+gzip -c -best /sbin/mount > /mnt/sbin/mount
+gzip -c -best /sbin/halt > /mnt/sbin/halt
+gzip -c -best /sbin/restore > /mnt/sbin/restore
+
+gzip -c -best /bin/sh > /mnt/bin/sh
+gzip -c -best /bin/sync > /mnt/bin/sync
+
+cp /root/.profile /mnt/root
+
+cp -f /dev/MAKEDEV /mnt/dev
+chmod 755 /mnt/dev/MAKEDEV
+
+chmod 500 /mnt/sbin/init
+chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt
+chmod 555 /mnt/bin/sh /mnt/bin/sync
+chmod 6555 /mnt/sbin/restore
+
+#
+# create the devices nodes
+#
+cd /mnt/dev
+./MAKEDEV std
+./MAKEDEV da0
+./MAKEDEV da1
+./MAKEDEV da2
+./MAKEDEV sa0
+./MAKEDEV pty0
+cd /
+
+#
+# create minimum file system table
+#
+cat > /mnt/etc/fstab <<EOM
+/dev/fd0a / ufs rw 1 1
+EOM
+
+#
+# create minimum passwd file
+#
+cat > /mnt/etc/passwd <<EOM
+root:*:0:0:Charlie &:/root:/bin/sh
+EOM
+
+cat > /mnt/etc/master.passwd <<EOM
+root::0:0::0:0:Charlie &:/root:/bin/sh
+EOM
+
+chmod 600 /mnt/etc/master.passwd
+chmod 644 /mnt/etc/passwd
+/usr/sbin/pwd_mkdb -d/mnt/etc /mnt/etc/master.passwd
+
+#
+# umount the floppy and inform the user
+#
+/sbin/umount /mnt
+echo "The floppy has been unmounted and is now ready."]]></programlisting>
+
+ </example>
+
+ </sect3>
+
+ <sect3>
+ <title>出现灾难后</title>
+
+ <para>主要的问题在于:您的硬件有用吗?由于已经做好了定期的备份工作,
+ 就不必担心软件的问题。</para>
+
+ <para>如果硬件已经损坏,首先,必须先将已损坏的硬件换掉。</para>
+
+ <para>如果硬件没有问题,再检查一下您的软盘。如果用的是传统的启动盘,
+ 以 single-user 启动 (在出现 <prompt>boot:</prompt> 后键入 <literal>-s</literal> ),
+ 并跳过下面这段。</para>
+
+ <para>如果使用的是具有 <filename>boot.flp</filename> 和
+ <filename>fixit.flp</filename> 的启动磁盘,首先用这张磁盘启动。当屏幕
+ 出现安装选单时,选择 <literal>Fixit--Repair mode with CDROM or
+ floppy.</literal> 。根据屏幕的提示,插入有 <filename>fixit.flp</filename>
+ 的磁盘, <command>restore</command> ,其他需要用到的程序就会出现在
+ <filename>/mnt2/stand</filename>。</para>
+
+ <para>分别恢复每一个文件系统</para>
+
+ <indexterm>
+ <primary><command>mount</command></primary>
+ </indexterm>
+ <indexterm><primary>root partition</primary></indexterm>
+ <indexterm>
+ <primary><command>disklabel</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary><command>newfs</command></primary>
+ </indexterm>
+ <para>试着 <command>mount</command> 上您的第一个磁盘的 root 分区(例如: <command>mount /dev/da0a
+ /mnt</command>)。假如这个磁盘标签已经损坏,使用 <command>disklabel</command>
+ 来重新分割并分配磁盘标签(利用您以前保留下来的数据)。使用 <command>newfs</command>
+ 来建立文件系统,并重新挂上软盘读写的 root 分区 (<command>mount -u -o rw
+ /mnt</command>)。然后使用备份程序及备份磁带来修复文件系统 (例如: <command>restore vrf
+ /dev/sa0</command>)。最后 Unmount 这个文件系统 (例如: <command>umount
+ /mnt</command>)。对于每个损坏的文件系统都重复一次。</para>
+
+ <para>当您的系统正常启动后,将您的数据备份到新的磁带。任何造成数据丢失的
+ 的灾难都可能再次发生。现在花一些时间,也许可以使您免于下次的灾难。</para>
+ </sect3>
+
+<![ %not.published; [
+
+ <sect3>
+ <title>* I Did Not Prepare for the Disaster, What Now?</title>
+
+ <para></para>
+ </sect3>
+]]>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="disks-virtual">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>Reorganized and enhanced by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>网络、内存和 File-Backed 文件系统</title>
+ <indexterm><primary>virtual disks</primary></indexterm>
+ <indexterm>
+ <primary>磁盘</primary>
+ <secondary>虚拟</secondary>
+ </indexterm>
+
+ <para>除了你的物理磁盘以外,插入你计算机的:
+ 软盘 CDs,硬盘驱动器,等等;其它磁盘格式是不被
+ FreeBSD - <firstterm>virtual
+ disks</firstterm>支持的。</para>
+
+ <indexterm><primary>NFS</primary></indexterm>
+ <indexterm><primary>Coda</primary></indexterm>
+ <indexterm>
+ <primary>disks</primary>
+ <secondary>memory</secondary>
+ </indexterm>
+ <para>这还包括网络文件系统,例如 <link
+ linkend="network-nfs">Network File System</link> 和 Coda, 基于内存的
+ 文件系统和后备文件系统。</para>
+
+ <para>按照你运行的 FreeBSD 版本,你可以使用不同的工具来创建和使用
+ 后备文件系统和内存文件系统。</para>
+
+ <note>
+ <para>FreeBSD&nbsp;4.X 用户可以使用 &man.MAKEDEV.8;
+ 来创建需要的设备。 FreeBSD&nbsp;5.0 和更新的版本使用
+ &man.devfs.5; 来创建设备节点,对用户来说是透明的。</para>
+ </note>
+
+ <sect2 id="disks-vnconfig">
+ <title>FreeBSD&nbsp;4.X 下的 File-Backed 文件系统</title>
+ <indexterm>
+ <primary>磁盘</primary>
+ <secondary>file-backed (4.X)</secondary>
+ </indexterm>
+
+ <para>应用程序 &man.vnconfig.8; 可以配置和启用 vnode 伪磁盘设备。
+ 一个 <firstterm>vnode</firstterm> 代表一个文件。这就意味
+ 使用 &man.vnconfig.8; 可以用来创建和操作一个文件系统。
+ 也可以在文件中挂接一个软盘或 CD 映像。</para>
+
+ <para>要使用 &man.vnconfig.8;,你需要在内核配置文件中 &man.vn.4; 的支持:</para>
+
+ <programlisting>pseudo-device vn</programlisting>
+
+ <para>挂接一个存在的文件系统映像:</para>
+
+ <example>
+ <title>使用 vnconfig 来挂接一个存在的文件系统映像在
+ FreeBSD&nbsp;4.X 系统上。</title>
+
+ <screen>&prompt.root; <userinput>vnconfig vn<replaceable>0</replaceable> <replaceable>diskimage</replaceable></userinput>
+&prompt.root; <userinput>mount /dev/vn<replaceable>0</replaceable>c <replaceable>/mnt</replaceable></userinput></screen>
+ </example>
+
+ <para>使用 &man.vnconfig.8; 创建一个新的文件系统映像:</para>
+
+ <example>
+ <title>使用 <command>vnconfig</command> 创建一个新的 File-Backed 磁盘</title>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=<replaceable>newimage</replaceable> bs=1k count=<replaceable>5</replaceable>k</userinput>
+5120+0 records in
+5120+0 records out
+&prompt.root; <userinput>vnconfig -s labels -c vn<replaceable>0</replaceable> <replaceable>newimage</replaceable></userinput>
+&prompt.root; <userinput>disklabel -r -w vn<replaceable>0</replaceable> auto</userinput>
+&prompt.root; <userinput>newfs vn<replaceable>0</replaceable>c</userinput>
+Warning: 2048 sector(s) in last cylinder unallocated
+/dev/vn0c: 10240 sectors in 3 cylinders of 1 tracks, 4096 sectors
+ 5.0MB in 1 cyl groups (16 c/g, 32.00MB/g, 1280 i/g)
+super-block backups (for fsck -b #) at:
+ 32
+&prompt.root; <userinput>mount /dev/vn<replaceable>0</replaceable>c <replaceable>/mnt</replaceable></userinput>
+&prompt.root; <userinput>df <replaceable>/mnt</replaceable></userinput>
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/vn0c 4927 1 4532 0% /mnt</screen>
+ </example>
+ </sect2>
+
+ <sect2 id="disks-mdconfig">
+ <title>FreeBSD&nbsp;5.X 下的 File-Backed 文件系统</title>
+ <indexterm>
+ <primary>磁盘</primary>
+ <secondary>file-backed (5.X)</secondary>
+ </indexterm>
+
+ <para>在 FreeBSD&nbsp;5.X 系统中使用应用程序 &man.mdconfig.8;
+  被用来配置和启用内存磁盘,&man.md.4;,使用
+ &man.mdconfig.8;你需要在你的内核配置文件中添加 &man.md.4; 模块来支持它:</para>
+
+ <programlisting>device md</programlisting>
+
+ <para> &man.mdconfig.8; 命令支持三种类型的内存后备虚拟磁盘:
+ 使用 &man.malloc.9;,来分配内存磁盘,内存磁盘作为文件或作为
+ 备用的交换分区。一种使用方式是在文件中来挂接一个软盘和
+ CD 映像。</para>
+
+ <para>挂接一个存在的文件系统映像:</para>
+
+ <example>
+ <title>在 FreeBSD&nbsp;5.X 中使用 <command>mdconfig</command> 命令来挂接一个存在的文件系统映像。</title>
+
+ <screen>&prompt.root; <userinput>mdconfig -a -t vnode -f <replaceable>diskimage</replaceable> -u <replaceable>0</replaceable></userinput>
+&prompt.root; <userinput>mount /dev/md<replaceable>0</replaceable> <replaceable>/mnt</replaceable></userinput></screen>
+ </example>
+
+ <para>使用 &man.mdconfig.8; 来创建一个新的文件系统映像:</para>
+
+ <example>
+ <title>用 <command>mdconfig</command> 创建一个新的 File-Backed 磁盘</title>
+
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=<replaceable>newimage</replaceable> bs=1k count=<replaceable>5</replaceable>k</userinput>
+5120+0 records in
+5120+0 records out
+&prompt.root; <userinput>mdconfig -a -t vnode -f <replaceable>newimage</replaceable> -u <replaceable>0</replaceable></userinput>
+&prompt.root; <userinput>disklabel -r -w md<replaceable>0</replaceable> auto</userinput>
+&prompt.root; <userinput>newfs md<replaceable>0</replaceable>c</userinput>
+/dev/md0c: 5.0MB (10240 sectors) block size 16384, fragment size 2048
+ using 4 cylinder groups of 1.27MB, 81 blks, 256 inodes.
+super-block backups (for fsck -b #) at:
+ 32, 2624, 5216, 7808
+&prompt.root; <userinput>mount /dev/md<replaceable>0</replaceable>c <replaceable>/mnt</replaceable></userinput>
+&prompt.root; <userinput>df <replaceable>/mnt</replaceable></userinput>
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md0c 4846 2 4458 0% /mnt</screen>
+ </example>
+
+ <para>如果你没有使用 <option>-u</option> 选项指定一个单位号
+ &man.mdconfig.8; 将使用
+ &man.md.4; 自动为它选择一个未使用的设备。
+ 分配给它的单位名将被输出到标准输出设备像
+ <devicename>md4</devicename>。想得到更多的关于
+ &man.mdconfig.8; 的信息请参考手册页。</para>
+
+ <note><para>从 &os;&nbsp;5.1-RELEASE 开始, &man.bsdlabel.8;
+ 程序代替了旧版的 &man.disklabel.8; 程序。相应的
+ &man.bsdlabel.8; 中的许多陈旧的选项和参数也被取消;
+ 在上面的例子中选项
+ <option>-r</option> 应该被删掉。想获得更多的信息,
+ 请参考 &man.bsdlabel.8; 的手册页。</para></note>
+
+ <para>应用程序 &man.mdconfig.8; 是非常有作的,然而它
+ 需要许多命令行来创建一个 file-backed 文件系统。
+ FreeBSD&nbsp;5.0 也提供了一个被称作 &man.mdmfs.8; 的工具,
+ 这个程序配置一个 &man.md.4; 磁盘使用
+ &man.mdconfig.8;,在它上面安装一个 UFS 文件系统使用
+ &man.newfs.8;,挂接它使用 &man.mount.8;。例如,
+ 如果你想创建和挂接像上面一样的文件系统映像,
+ 简单的执行下面的步骤:</para>
+
+ <example>
+ <title>使用 <command>mdmfs</command> 命令配置和挂接一个 File-Backed 磁盘</title>
+ <screen>&prompt.root; <userinput>dd if=/dev/zero of=<replaceable>newimage</replaceable> bs=1k count=<replaceable>5</replaceable>k</userinput>
+5120+0 records in
+5120+0 records out
+&prompt.root; <userinput>mdmfs -F <replaceable>newimage</replaceable> -s <replaceable>5</replaceable>m md<replaceable>0</replaceable> <replaceable>/mnt</replaceable></userinput>
+&prompt.root; <userinput>df <replaceable>/mnt</replaceable></userinput>
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md0 4846 2 4458 0% /mnt</screen>
+ </example>
+
+ <para>如果你使用没有加单位号的 <option>md</option> 选项,
+ &man.mdmfs.8; 将使用 &man.md.4; 的自动单位号特性来自动为其
+ 选择一个未使用的设备。更详细的
+ &man.mdmfs.8;,请参考手册页。</para>
+
+ </sect2>
+
+ <sect2 id="disks-md-freebsd4">
+ <title>FreeBSD&nbsp;4.X 下的内存后备式文件系统</title>
+ <indexterm>
+ <primary>磁盘</primary>
+ <secondary>内存文件系统(4.X)</secondary>
+ </indexterm>
+
+ <para> &man.md.4; 驱动程序是一个简单有效的手段用来创建
+ 内存文件系统在 FreeBSD&nbsp;4.X 系统上。&man.malloc.9; 被
+ 用来分配内存。</para>
+
+ <para>简单的获得一个文件系统你需要准备,例如:
+ &man.vnconfig.8;</para>
+
+ <example>
+ <title>FreeBSD&nbsp;4.X 下的 md 内存磁盘</title>
+
+ <screen>&prompt.root; <userinput>dd if=<replaceable>newimage</replaceable> of=/dev/md<replaceable>0</replaceable></userinput>
+5120+0 records in
+5120+0 records out
+&prompt.root; <userinput>mount /dev/md<replaceable>0c</replaceable> <replaceable>/mnt</replaceable></userinput>
+&prompt.root; <userinput>df <replaceable>/mnt</replaceable></userinput>
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md0c 4927 1 4532 0% /mnt</screen>
+ </example>
+
+ <para>更多的详情,请参考 &man.md.4; 手册页。</para>
+ </sect2>
+
+ <sect2 id="disks-md-freebsd5">
+ <title>FreeBSD&nbsp;5.X 下的内存后备式文件系统</title>
+ <indexterm>
+ <primary>磁盘</primary>
+ <secondary>内存文件系统(5.X)</secondary>
+ </indexterm>
+
+ <para>同样的工具也可以用来创建内存后备式文件系统:
+ &man.mdconfig.8; 或 &man.mdmfs.8;。内存后备文件系统的
+ 内存分配要使用 &man.malloc.9; 来完成。</para>
+
+ <example>
+ <title>用 <command>mdconfig</command>
+ 创建一个新的内存后备磁盘</title>
+
+ <screen>&prompt.root; <userinput>mdconfig -a -t malloc -s <replaceable>5</replaceable>m -u <replaceable>1</replaceable></userinput>
+&prompt.root; <userinput>newfs -U md<replaceable>1</replaceable></userinput>
+/dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048
+ using 4 cylinder groups of 1.27MB, 81 blks, 256 inodes.
+ with soft updates
+super-block backups (for fsck -b #) at:
+ 32, 2624, 5216, 7808
+&prompt.root; <userinput>mount /dev/md<replaceable>1</replaceable> <replaceable>/mnt</replaceable></userinput>
+&prompt.root; <userinput>df <replaceable>/mnt</replaceable></userinput>
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md1 4846 2 4458 0% /mnt</screen>
+ </example>
+
+ <example>
+ <title>用 <command>mdmfs</command>
+ 创建一个新的内存后备磁盘</title>
+ <screen>&prompt.root; <userinput>mdmfs -M -s <replaceable>5</replaceable>m md<replaceable>2</replaceable> <replaceable>/mnt</replaceable></userinput>
+&prompt.root; <userinput>df <replaceable>/mnt</replaceable></userinput>
+Filesystem 1K-blocks Used Avail Capacity Mounted on
+/dev/md2 4846 2 4458 0% /mnt</screen>
+ </example>
+
+ <para>代替使用一个 &man.malloc.9; 后备文件系统,可以使用
+ swap,正确的替换使用 <option>swap</option> 替换
+ <option>malloc</option> 在命令行
+ &man.mdconfig.8; 中。&man.mdmfs.8; 程序默认
+ (没有 <option>-M</option> 选项) 创建一个 swap-based
+ 磁盘。更多的详情,请参考 &man.mdconfig.8;
+ 和 &man.mdmfs.8; 手册页。</para>
+ </sect2>
+
+ <sect2>
+ <title>从系统中移除内存盘</title>
+ <indexterm>
+ <primary>磁盘</primary>
+ <secondary>移除内存盘</secondary>
+ </indexterm>
+
+ <para>当一个内存后备式文件系统不再使用时,你应该释放掉系统的资源。
+ 每一件要做的事情就是摘掉文件系统,然后使用
+ &man.mdconfig.8; 把磁盘从系统中分离出来释放看资源。</para>
+
+ <para>例如分离和释放所有的资源使用
+ <filename>/dev/md4</filename> 命令:</para>
+
+ <screen>&prompt.root; <userinput>mdconfig -d -u <replaceable>4</replaceable></userinput></screen>
+
+ <para><command>mdconfig -l</command> 命令可以列出关于配置
+ &man.md.4; 设备的信息。</para>
+
+ <para>在 FreeBSD&nbsp;4.X 系统中,&man.vnconfig.8; 命令用来分离设备。
+ 例如分离所有的资源使用 <filename>/dev/vn4</filename> 命令:</para>
+
+ <screen>&prompt.root; <userinput>vnconfig -u vn<replaceable>4</replaceable></userinput></screen>
+
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="snapshots">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 15 JUL 2002 -->
+ </sect1info>
+
+ <title>文件系统快照</title>
+
+ <indexterm>
+ <primary>文件系统</primary>
+ <secondary>快照</secondary>
+ </indexterm>
+
+ <para>FreeBSD&nbsp;5.0 提供了一个和 <link linkend="soft-updates">Soft Updates</link>
+ 关联的新功能: 文件系统快照</para>
+
+ <para>快照允许用户创建指定文件系统的映像,并把它们当做一个文件来对待。
+ 快照文件必须在文件系统正在使用时创建,一个用户对每个文件系统创建的
+ 快照不能大于20个。活动的快照文件被记录在超级块中,所以它们可以在系统
+ 启动的时候一块进行挂接后摘掉。当一个快照不再需要时,可以使用标准的
+ &man.rm.1; 使用来使其删除。快照可以以任何顺序进行移除,但所有使用
+ 的快照不可能同时进行移除,因为其它的快照将有可能互相引用一些块。</para>
+
+ <para>在初始创建时,<option>schg</option> 标志 (看 &man.chflags.1; 手册页)
+ 用来确保 <username>root</username> 用户不能用来写快照文件系统。
+ &man.unlink.1; 命令是个例外对快照文件来说。
+ 它能够移除 <option>schg</option> 标志位,在不删除快照文件前,
+ 没有必要清除 <option>schg</option> 标志。</para>
+
+ <para>快照被 &man.mount.8; 命令创建。放置一个快照
+ <filename>/var</filename> 到文件系统
+ <filename>/var/snapshot/snap</filename> 使用下面的命令:</para>
+
+<screen>&prompt.root; <userinput>mount -u -o snapshot /var/snapshot/snap /var</userinput></screen>
+
+ <para>作为选择,你也可以使用 &man.mksnap.ffs.8; 来创建一个快照:</para>
+<screen>&prompt.root; <userinput>mksnap_ffs /var /var/snapshot/snap</userinput></screen>
+
+ <para>当快照文件被创建好后,可以用于下面一些目的:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>有些管理员用文件快照来进行备份,
+ 因为快照可以被转移到 CD 或磁带上。</para>
+ </listitem>
+
+ <listitem>
+ <para>检查文件系统的完整性, &man.fsck.8; 可以用来检查快照文件。
+ 假设文件系统在挂接后前是一致的,
+ 则会得到一致的结果 (不做修改)。
+ 这是由 &man.fsck.8; 进程在后台完成的。</para>
+ </listitem>
+
+ <listitem>
+ <para>在快照上运行 &man.dump.8; 程序。
+ dump 将返回包含文件系统和快照的时间戳。&man.dump.8;
+ 也能够抓取快照,使用 <option>-L</option>
+ 标志可以首先创建快照, 完成 dump 映像之后再自动删除它。</para>
+ </listitem>
+
+ <listitem>
+ <para>用 &man.mount.8; 来挂接快照作为文件系统的一个冻结的镜像。
+ 要 &man.mount.8; 快照
+ <filename>/var/snapshot/snap</filename> 运行:</para>
+
+<screen>&prompt.root; <userinput>mdconfig -a -t vnode -f /var/snapshot/snap -u 4</userinput>
+&prompt.root; <userinput>mount -r /dev/md4 /mnt</userinput></screen>
+
+ </listitem>
+ </itemizedlist>
+
+ <para>现在你就可以看到挂接在 <filename>/mnt</filename> 目录下的 <filename>/var</filename>
+ 文件系统的快照。 每一样东西都保存的像它创建时的状态一样。
+ 唯一例外的是更早的快照文件将表现为长度为 0 的文件。
+ 用完快照文件之后可以把它卸下,使用:</para>
+
+<screen>&prompt.root; <userinput>umount /mnt</userinput>
+&prompt.root; <userinput>mdconfig -d -u 4</userinput></screen>
+
+ <para>想了解更多关于 <option>softupdates</option> 和
+ 文件系统快照的信息, 包括技术说明, 可以访问
+ Marshall Kirk McKusick 的 WWW 站点
+ <ulink url="http://www.mckusick.com/"></ulink>。</para>
+ </sect1>
+
+ <sect1 id="quotas">
+ <title>文件系统配额</title>
+ <indexterm>
+ <primary>accounting</primary>
+ <secondary>disk space</secondary>
+ </indexterm>
+ <indexterm><primary>disk quotas</primary></indexterm>
+
+ <para>配额是操作系统的一个可选择的属性,它允许限制用户使用的磁盘空间大小或是
+ 使用的文件数量。这可以防止某个用户占用所有的磁盘空间。</para>
+
+ <sect2>
+ <title>配置系统来启用磁盘配额</title>
+
+ <para>在决定使用磁盘配额前,确信磁盘配额已经在内核中配置好了。只要在在内核
+ 中配置文件中添加下面一行就行了:</para>
+
+ <programlisting>options QUOTA</programlisting>
+
+ <para>在默认情况下 <filename>GENERIC</filename> 内核是不会启用这个功能的,
+ 所以必须配置、重建和安装一个定制的内核。请参考 FreeBSD 内核配置
+ <xref linkend="kernelconfig"> 这章了解更多有关内核配置的信息。</para>
+
+ <para>接下来,需要在 <filename>/etc/rc.conf</filename> 中启用磁盘配额。可以
+ 通过添加下面这行来完成:</para>
+
+ <programlisting>enable_quotas="YES"</programlisting>
+ <indexterm>
+ <primary>disk quotas</primary>
+ <secondary>checking</secondary>
+ </indexterm>
+ <para>为了更好的控制配额时的启动,还有另外一个可配置的变量。通常
+ 启动时,集成在每个文件系统上的配额会被配额检查程序
+ &man.quotacheck.8; 自动检查。配额检查功能能够确保在配额数据库中
+ 的数据正确地反映了文件系统的数
+ 据情况。这是一个很耗时间的处理进程,它会影响系统的启动时间。如果
+ 想跳过这一步,可以在文件 <filename>/etc/rc.conf</filename> 加入
+ 下面这一行来达到目的:</para>
+
+ <programlisting>check_quotas="NO"</programlisting>
+
+ <para>如果运行的是 3.2-RELEASE 以前的版本,配置比较简单,只需要配置
+ 一个选项,在您的 <filename>/etc/rc.conf</filename> 中设置下面这行:</para>
+
+ <programlisting>check_quotas="YES"</programlisting>
+
+ <para>最后,要编辑 <filename>/etc/fstab</filename> 文件,以在每一个
+ 文件系统基础上雇用磁盘配额。这是启用用户和组配额,或同时启用用户
+ 和组配额的地方。</para>
+
+ <para>要在一个文件系统上启用每个用户的配额,可以在 <filename>/etc/fstab</filename>
+ 里添加 <option>userquota</option> 选项在要雇用配额文件的系统上。例如:</para>
+
+ <programlisting>/dev/da1s2g /home ufs rw,userquota 1 2</programlisting>
+
+ <para>同样的,要启用组配额,使用 <option>groupquota</option> 选项来代替
+ <option>userquota</option> 选项。要同时启用用户和组配额,可以这样做:</para>
+
+ <programlisting>/dev/da1s2g /home ufs rw,userquota,groupquota 1 2</programlisting>
+
+ <para>默认情况下,配额文件是存放在文件系统的以 <filename>quota.user</filename>
+ 和 <filename>quota.group</filename> 命名的根目录下。可以查看 &man.fstab.5;
+ 联机手册了解更多信息。即使联机手册 &man.fstab.5; 说中以为配额文件指定其他
+ 的位置,这里并不推荐这样做,因为不同的配额工具不一定遵循这样的规则。</para>
+
+ <para>到这儿,可以用新内核重新启动系统。 <filename>/etc/rc</filename> 将自动
+ 运行适当的命令来创建最初的配额文件,所以并不需要手动来创建任何零长度的配额
+ 文件。</para>
+
+ <para>在通常的操作过程中,并不要求手动运行 &man.quotacheck.8;、
+ &man.quotaon.8;, 或 &man.quotaoff.8; 命令,然而可能需要阅读与他们的操作
+ 相似的联机手册。</para>
+ </sect2>
+
+ <sect2>
+ <title>设置配额限制</title>
+ <indexterm>
+ <primary>disk quotas</primary>
+ <secondary>limits</secondary>
+ </indexterm>
+
+ <para>一旦您配置好了启用配额的系统,可以检查一下它们是真的有用。
+ 可以这样做:</para>
+
+ <screen>&prompt.root; <userinput>quota -v</userinput></screen>
+
+ <para>您应该能够看到一行当前正在使用的每个文件系统启用的磁盘配额
+ 使用情况的摘要信息。</para>
+
+ <para>现在可以使用 &man.edquota.8; 命令准备启用配额限制。</para>
+
+ <para>有几个有关如何强制限制用户或组可以分配到的磁盘空间大小的选项。
+ 您可以限制磁盘窨的分配,或文件的数量,或两者都有。这些限制中的每
+ 一个最终可分为两类:硬限制和软限制。</para>
+
+ <indexterm><primary>hard limit</primary></indexterm>
+ <para>一个硬限制可能无法被超越。一旦一个用户达到了他们的硬限制,他们
+ 将无法在文件系统中行到更多的配额。例如,如果用户在文件系统上且个
+ 500 blocks 的硬限制,而当前已经分派了490个 blocks ,用户就只能分派
+ 剩下的 10 个 blocks 。如果硬是要分派 11 个 blocks 将会失败。</para>
+
+ <indexterm><primary>soft limit</primary></indexterm>
+ <para>软限制可以被有时间限制性地被越过。这段时间可以被理解为允许限期,
+ 默认是一个星期。如果一个用户延缓时间太长的话,软限制将会变成硬限制,
+ 根本就不允许再继续占用磁盘配额。当用户因到软限制以下时,允许延期将
+ 重新开始计算。</para>
+
+ <para>下面是一个运行 &man.edquota.8; 时看到的例子。当 &man.edquota.8;
+ 命令被调用时,会被转移进 <envar>EDITOR</envar> 环境变量指派的编辑
+ 器中,允许编辑配额限制。如果环境变量没有设置,默认在
+ <application>vi</application> 编辑器上进行。</para>
+
+ <screen>&prompt.root; <userinput>edquota -u test</userinput></screen>
+
+ <programlisting>Quotas for user test:
+/usr: blocks in use: 65, limits (soft = 50, hard = 75)
+ inodes in use: 7, limits (soft = 50, hard = 60)
+/usr/var: blocks in use: 0, limits (soft = 50, hard = 75)
+ inodes in use: 0, limits (soft = 50, hard = 60)</programlisting>
+
+ <para>在每一个启用了磁盘配额的文件系统上,通常会看到两行。一行是
+ block 限制,另一行是 inode 限制。简单地改变要修改的配额限制的值。
+ 例如,提高这个用户软限制的数值到 500 ,硬限制到 600 :</para>
+
+ <programlisting>/usr: blocks in use: 65, limits (soft = 50, hard = 75)</programlisting>
+
+ <para>to:</para>
+
+ <programlisting> /usr: blocks in use: 65, limits (soft = 500, hard = 600)</programlisting>
+
+ <para>当离开编辑器的时候,新的配额限制设置将会被保存。</para>
+
+ <para>有时,在 UIDs 的范围上设置配额限制是非常必要的。这可以通过在
+ &man.edquota.8; 命令后面加上 <option>-p</option> 选项来完成。首先,
+ 给用户分配所需要的配额限制,然后运行命令
+ <command>edquota -p protouser startuid-enduid</command>。例如,如果
+ 用户 <username>test</username> 已经有了所需要的配额限制,下面的命令
+ 可以被用来复制那些 UIDs 为10,000 到 19,999 的配额限制:</para>
+
+ <screen>&prompt.root; <userinput>edquota -p test 10000-19999</userinput></screen>
+
+ <para>更多细节请参考 &man.edquota.8; 手册页。</para>
+ </sect2>
+
+ <sect2>
+ <title>检查配额限制和磁盘使用</title>
+ <indexterm>
+ <primary>disk quotas</primary>
+ <secondary>checking</secondary>
+ </indexterm>
+
+ <para>即可以使用 &man.quota.1; 也可以使用 &man.repquota.8; 命令来检查
+ 配额限制和磁盘使用情况。 &man.quota.1; 命令能够检查单个用户和组的配置
+ 使用情况。只有超级用户才可以检查其它用户的配额和磁盘使用情况。
+ &man.repquota.8; 命令可以用来了解所有配额和磁盘的使用情况。</para>
+
+ <para>下面是一个使用 <command>quota -v</command> 命令后的输出情况:</para>
+
+ <programlisting>Disk quotas for user test (uid 1002):
+ Filesystem blocks quota limit grace files quota limit grace
+ /usr 65* 50 75 5days 7 50 60
+ /usr/var 0 50 75 0 50 60</programlisting>
+
+ <indexterm><primary>grace period</primary></indexterm>
+ <para>上面的例子表示在 <filename>/usr</filename> 文件系统中,这个文件系统
+ 中,这个用户超越了软限制(50 blocks )15个 blocks ,但是他有5天的宽限期。
+ 注意: <literal>*</literal> 号表示用户当前超过了他的配额限制。</para>
+
+ <para>通常用户没有在上面使用任何磁盘空间的文件系统不会在 &man.quota.1;
+ 命令的输出中显示,即使他有一个针对文件系统的配置限制。
+ <option>-v</option> 选项将显示那些文件系统,如上一个例子中的
+ <filename>/usr/var</filename> 文件系统。</para>
+ </sect2>
+
+ <sect2>
+ <title>通过 NFS 使用磁盘配额</title>
+ <indexterm><primary>NFS</primary></indexterm>
+
+ <para>配额能够在 NFS 服务器上被配额子系统强迫使用。在 NFS 客房端,
+ &man.rpc.rquotad.8; 命令可以使用 quota 信息用于 &man.quota.1;
+ 命令,可以允许用户察看它们的 quota 统计信息。</para>
+
+ <para>可以这样在 <filename>/etc/inetd.conf</filename> 中启用
+ <command>rpc.rquotad</command>:</para>
+
+ <programlisting>rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad</programlisting>
+
+ <para>现在重启 <command>inetd</command>:</para>
+
+ <screen>&prompt.root; <userinput>kill -HUP `cat /var/run/inetd.pid`</userinput></screen>
+ </sect2>
+ </sect1>
+
+
+ <sect1 id="disks-encrypting">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Lucky</firstname>
+ <surname>Green</surname>
+ <contrib>Contributed by </contrib>
+ <affiliation>
+ <address><email>shamrock@cypherpunks.to</email></address>
+ </affiliation>
+ </author>
+ </authorgroup>
+ <!-- 11 MARCH 2003 -->
+ </sect1info>
+
+ <title>加密磁盘分区</title>
+ <indexterm>
+ <primary>disks</primary>
+ <secondary>encrypting</secondary></indexterm>
+
+ <para>FreeBSD 提供了极好的数据保护措施,防止未受权的数据访问。
+ 文件权限和强制访问控制(MAC)(看 <xref linkend="mac">)
+ 可以帮助预防在操作系统处于运行状态和计算机加电时未受权的第三方访问数据。
+ 但是,和操作系统强制受权不相关的是,如果黑客有物理上访问计算机的可能,
+ 那他就可以简单的把计算机的硬件安装到另一个系统上拷贝出敏感的数据。</para>
+
+ <para>不管怎样,黑客都有可能取得并获取停机时的硬件,
+ <application>GEOM 基于磁盘的加密 (gbde)</application>
+ 能够保护在计算机文件系统上的数据并防止黑客得到重要的信息。
+ 不像 cumbersome 加密方法只加密个别的文件,
+ <application>gbde</application> 透明的加密整个文件系统。
+ 整个硬盘都是加密过的非明文数据。</para>
+
+ <sect2>
+ <title>在内核中启用 gbde</title>
+
+ <procedure>
+ <step>
+ <title>成为 <username>root</username></title>
+
+ <para>配置 <application>gbde</application>
+ 需要超级用户的权力。</para>
+
+ <screen>&prompt.user; <userinput>su -</userinput>
+Password:</screen>
+ </step>
+
+ <step>
+ <title>验证操作系统的版本</title>
+
+ <para>&man.gbde.4; 需要 FreeBSD 5.0 或更高的版本。</para>
+
+ <screen>&prompt.root; <userinput>uname -r</userinput>
+5.0-RELEASE</screen>
+ </step>
+
+ <step>
+ <title>在内核配置文件中添加对 &man.gbde.4; 的支持</title>
+
+ <para>使用您喜欢的文本编辑器,
+ 在内核配置文件中添加下面一行:</para>
+
+ <para><literal>options GEOM_BDE</literal></para>
+
+ <para>配置,编译,安装 FreeBSD 内核,
+ 这个过程在 <xref
+ linkend="kernelconfig"> 中有详细描述。</para>
+
+ <para>重新引导进入新的内核。</para>
+ </step>
+ </procedure>
+ </sect2>
+
+
+ <sect2>
+ <title>准备加密整个硬盘</title>
+
+ <para>下面这个例子假设您添加了一个新的硬盘在您的系统并将拥有一个单独的加密分区。
+ 这个分区将挂接在 <filename>/private</filename>目录下。
+ <application>gbde</application> 也可以用来加密
+ <filename>/home</filename> 和 <filename>/var/mail</filename>,
+ 但是这需要更多的复杂命令来执行。</para>
+
+ <procedure>
+ <step>
+ <title>添加新的硬盘</title>
+
+ <para>添加新的硬盘到系统中可以查看在 <xref
+ linkend="disks-adding"> 中的说明。
+ 这个例子的目的是说明一个新的硬盘分区已经添加到系统中如:
+ <filename>/dev/ad4s1c</filename>。在例子中
+ <filename>/dev/ad0s1<replaceable>*</replaceable></filename>
+ 设备代表系统中存在的标准 FreeBSD 分区。</para>
+
+ <screen>&prompt.root; <userinput>ls /dev/ad*</userinput>
+/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
+/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
+/dev/ad0s1a /dev/ad0s1d /dev/ad4</screen>
+ </step>
+
+ <step>
+ <title>创建一个目录来保存 gbde Lock 文件</title>
+
+ <screen>&prompt.root; <userinput>mkdir /etc/gbde</userinput></screen>
+
+ <para><application>gbde</application> lock 文件包含了
+ <application>gbde</application> 需要访问的加密分区的信息。
+ 没有 lock 文件,
+ <application>gbde</application> 将不能解密包含在加密分区上的数据。
+ 每个加密分区使用一个独立的 lock 文件。</para>
+ </step>
+
+ <step>
+ <title>初始化 gbde 分区</title>
+
+ <para>一个 <application>gbde</application> 分区在使用前必须被初始化,
+ 这个初始化过程只需要执行一次:</para>
+
+ <screen>&prompt.root; <userinput>gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c</userinput></screen>
+
+ <para>&man.gbde.8; 将打开您的编辑器,
+ 提示您去设置在一个模板文件中的配置变量。
+ 使用 UFS1 或 UFS2,设置扇区大小为 2048:</para>
+
+ <programlisting>$<!-- This is not the space you are looking
+for-->FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $
+#
+# Sector size is the smallest unit of data which can be read or written.
+# Making it too small decreases performance and decreases available space.
+# Making it too large may prevent filesystems from working. 512 is the
+# minimum and always safe. For UFS, use the fragment size
+#
+sector_size = 2048
+[...]
+</programlisting>
+
+ <para>&man.gbde.8; 将让您输入两次用来加密数据的密钥短语。
+ 两次输入的密钥必须相同。
+ <application>gbde</application>
+ 保护您数据的能力依靠您选择输入的密钥的质量。
+ <footnote>
+ <para>这个提示教您怎样选择一个安全易记的密钥短语,
+ 请看 <ulink
+ url="http://world.std.com/~reinhold/diceware.html">Diceware
+ Passphrase</ulink> 网站。</para></footnote></para>
+
+ <para><command>gbde init</command> 命令为您的
+ <application>gbde</application> 分区创建了一个 lock 文件,
+ 在这个例子中存储在
+ <filename>/etc/gbde/ad4s1c</filename>中。</para>
+
+ <caution>
+ <para><application>gbde</application> lock
+ 文件<emphasis>必须</emphasis>和加密分区上的内容一块备份。
+ 当一个 lock 文件被独自删除时,
+ 不能确定一个
+ <application>gbde</application> 分区上的数据被解密过。
+ 没有 lock 文件,
+ 就是合法的磁盘所有者不经过大量细致的工作也将不能访问经过加密分区上的数据,
+ 这是 &man.gbde.8; 在设计时整体上不支持。</para>
+ </caution>
+ </step>
+
+ <step>
+ <title>把加密分区和内核进行关联</title>
+
+ <screen>&prompt.root; <userinput>gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c</userinput></screen>
+
+ <para>在加密分区的初始化过程中您将被要求提供一个密码短语。
+ 新的加密设备将在
+ <filename>/dev</filename> 中显示为
+ <filename>/dev/device_name.bde</filename>:</para>
+
+ <screen>&prompt.root; <userinput>ls /dev/ad*</userinput>
+/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
+/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
+/dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde</screen>
+ </step>
+
+ <step>
+ <title>在加密设备上创建文件系统</title>
+
+ <para>当加密设备和内核进行关联后,
+ 您就可以使用 &man.newfs.8; 在此设备上创建文件系统,
+ 使用 &man.newfs.8; 来初始化一个 UFS2
+ 文件系统比初始化一个 UFS1 文件系统还要快,摧荐使用
+ <option>-O2</option> 选项。</para>
+
+ <note><para><option>-O2</option> 选项在 &os;&nbsp;5.1-RELEASE
+ 或更新的版本中是默认的选项。</para></note>
+
+ <screen>&prompt.root; <userinput>newfs -U -O2 /dev/ad4s1c.bde</userinput></screen>
+
+ <note>
+ <para>&man.newfs.8; 命令必须在一个
+ <application>gbde</application> 分区上执行,
+ 这个分区通过一个存在的
+ <filename><replaceable>*</replaceable>.bde</filename>
+ 设备名进行标识。</para>
+ </note>
+ </step>
+
+ <step>
+ <title>挂接加密分区</title>
+
+ <para>为加密文件系统创建一个挂接点。</para>
+
+ <screen>&prompt.root; <userinput>mkdir /private</userinput></screen>
+
+ <para>挂接加密文件系统。</para>
+
+ <screen>&prompt.root; <userinput>mount /dev/ad4s1c.bde /private</userinput></screen>
+ </step>
+
+ <step>
+ <title>校验加密文件系统是否有效</title>
+
+ <para>加密的文件系统现在对于
+ &man.df.1; 应该可见并可以使用。</para>
+
+ <screen>&prompt.user; <userinput>df -H</userinput>
+Filesystem Size Used Avail Capacity Mounted on
+/dev/ad0s1a 1037M 72M 883M 8% /
+/devfs 1.0K 1.0K 0B 100% /dev
+/dev/ad0s1f 8.1G 55K 7.5G 0% /home
+/dev/ad0s1e 1037M 1.1M 953M 0% /tmp
+/dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr
+/dev/ad4s1c.bde 150G 4.1K 138G 0% /private</screen>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2>
+ <title>挂接已经存在的加密文件系统</title>
+
+ <para>每次系统启动后,
+ 在使用加密文件系统前必须和内核重新进行关联,
+ 校验错误和再次挂接。使用的命令必须由
+ <username>root</username>用户来执行。</para>
+
+ <procedure>
+ <step>
+ <title>关联 gbde 分区到内核</title>
+
+ <screen>&prompt.root; <userinput>gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c</userinput></screen>
+
+ <para>您将被要求提供您在初始化加密
+ gbde 分区的过程中选定的密码短语。</para>
+ </step>
+
+ <step>
+ <title>校验文件系统错误</title>
+
+ <para>加密文件系统不能列在
+ <filename>/etc/fstab</filename> 文件中进行自动加载,
+ 在加载前必须手动运行 &man.fsck.8;
+ 命令对文件系统进行错误检测。</para>
+
+ <screen>&prompt.root; <userinput>fsck -p -t ffs /dev/ad4s1c.bde</userinput></screen>
+ </step>
+
+ <step>
+ <title>挂接加密文件系统</title>
+
+ <screen>&prompt.root; <userinput>mount /dev/ad4s1c.bde /private</userinput></screen>
+
+ <para>加密后的文件系统现在可以有效使用。</para>
+ </step>
+ </procedure>
+
+ <sect3>
+ <title>自动挂接加密文件系统</title>
+
+ <para>可以创建一个脚本来自动进行关联、检测、和挂接一个加密分区,
+ 但是为了安全起见,脚本程序中不应该包含 &man.gbde.8; 密码。
+ 取而代之,摧荐这样的脚本要手工来运行,
+ 在要求提供密码时可以通过控制台或 &man.ssh.1;。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>用 gbde 进行加密保护</title>
+
+ <para>&man.gbde.8; 在 CBC 模式上使用 128-bit AES 对扇区进行加密,
+ 每个扇区在硬盘上的加密都使用不同的 AES 密钥。
+ 想了解更多的信息关于 <application>gbde</application>
+ 的设计,包括每个扇区的密钥是怎样从用户提供的密钥短语产生的,
+ 请看 &man.gbde.4;。</para>
+ </sect2>
+
+ <sect2>
+ <title>兼容性问题</title>
+
+ <para>&man.sysinstall.8; 是和
+ <application>gbde</application> 加密设备不兼容的。
+ 在启动 &man.sysinstall.8; 时必须将
+ <devicename><replaceable>*</replaceable>.bde</devicename>
+ 设备和内核进行分离,否则在初始化探测设备时将引起冲突。
+ 与加密设备进行分离在我们的例子中使用如下的命令:</para>
+ <screen>&prompt.root; <userinput>gbde detach /dev/ad4s1c</userinput></screen>
+
+ <para>也应该注意,作为 &man.vinum.4; 不能使用 &man.geom.4; 子系统,
+ 您不能同时使用
+ <application>gbde</application> 和
+ <application>vinum</application> 卷。</para>
+ </sect2>
+
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/eresources/Makefile b/zh_CN.GB2312/books/handbook/eresources/Makefile
new file mode 100644
index 0000000000..2009047f83
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/eresources/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= eresources/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/eresources/chapter.sgml b/zh_CN.GB2312/books/handbook/eresources/chapter.sgml
new file mode 100644
index 0000000000..534fbbea7a
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/eresources/chapter.sgml
@@ -0,0 +1,1401 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.148
+ $FreeBSD$
+-->
+
+<appendix id="eresources">
+ <title>Internet上的资源</title>
+
+ <para>发展迅猛的FreeBSD使得现有的印刷、平面媒体跟不上它的发展进度!
+ 而电子版的也许是最好的,通常是唯一一个可以跟上最新发展方向的。FreeBSD来自于志愿者的成果,
+ 用户社区通常也扮演着是“技术支持部门”的角色。通过电子邮件和USENET新闻组可以很快的找到他们。</para>
+
+ <para>以下列出了尽量多的联系FreeBSD用户社区的方式。如果您发现有其他的资源没有被包括在这儿,
+ 请告诉&a.doc;,以便将它们加入到这里。</para>
+
+ <sect1 id="eresources-mail">
+ <title>邮件列表</title>
+
+ <para>虽然大部分的FreeBSD开发人员都会阅读USENET,
+ 如果您只将问题发表在 <literal>comp.unix.bsd.freebsd.*</literal> 其中之一的讨论组上,
+ 我们也不能保证我们永远可以及时了解您的问题。如果您将问题发到适当的邮件列表上,
+ 您不但可以同时让FreeBSD研发人员和其他的读者看到,
+ 通常也可以得到一个较好的(至少会比较快)的回应。</para>
+
+ <para>本文的最后给出了各个不同的邮件列表的使用规则。
+ <emphasis>在订阅其中任何一个列表之前,请先阅读使用条文</emphasis>。
+ 现在订阅这些邮件列表的人每天都会收到上百封关于FreeBSD的信件。
+ 设立列表的使用条文有助于维护讨论质量。否则这些讨论计划的列表将失去其意义。</para>
+
+ <para>全部的邮件列表记录都可以在<ulink url="&url.base;/search/index.html">FreeBSD World
+ Wide Web服务器</ulink>上找到。此服务器提供了很棒的关键词搜寻功能,可让您找到FAQ的解答。
+ 而在邮件列表上提问之前,请先搜寻是否已有答案。</para>
+
+ <sect2 id="eresources-summary">
+ <title>列表摘要</title>
+
+ <para><emphasis>一般性的列表:</emphasis> 以下的列表都是一般性的,
+ 而且可以自由地加入,鼓励大家加入他们:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>目录</entry>
+ <entry>用途</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>&a.cvsall.name;</entry>
+ <entry>FreeBSD源代码的变动</entry>
+ </row>
+
+ <row>
+ <entry>&a.advocacy.name;</entry>
+ <entry>FreeBSD鼓吹者</entry>
+ </row>
+
+ <row>
+ <entry>&a.announce.name;</entry>
+ <entry>重要的事件和里程碑</entry>
+ </row>
+
+ <row>
+ <entry>&a.arch.name;</entry>
+ <entry>架构和设计的讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.bugbusters.name;</entry>
+ <entry>与FreeBSD问题报告数据库和有关工具维护相关的讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.bugs.name;</entry>
+ <entry>报告FreeBSD的Bug</entry>
+ </row>
+
+ <row>
+ <entry>&a.chat.name;</entry>
+ <entry>和技术无关的FreeBSD讨论区</entry>
+ </row>
+
+ <row>
+ <entry>&a.config.name;</entry>
+ <entry>FreeBSD安装和配置工具的开发</entry>
+ </row>
+
+ <row>
+ <entry>&a.current.name;</entry>
+ <entry>讨论使用 &os.current; 有关的一些问题</entry>
+ </row>
+
+ <row>
+ <entry>&a.isp.name;</entry>
+ <entry>ISP使用FreeBSD的讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.jobs.name;</entry>
+ <entry>与FreeBSD有关的工作机会</entry>
+ </row>
+
+ <row>
+ <entry>&a.newbies.name;</entry>
+ <entry>FreeBSD新手在这里活跃和讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.policy.name;</entry>
+ <entry>FreeBSD核心团队方针讨论。低流量并且只读的</entry>
+ </row>
+
+ <row>
+ <entry>&a.questions.name;</entry>
+ <entry>用户问题和技术支持</entry>
+ </row>
+
+ <row>
+ <entry>&a.security-notifications.name;</entry>
+ <entry>安全通知</entry>
+ </row>
+
+ <row>
+ <entry>&a.stable.name;</entry>
+ <entry>讨论使用 &os.stable; 有关的一些问题</entry>
+ </row>
+
+ <row>
+ <entry>&a.test.name;</entry>
+ <entry>在真正发送一个邮件到邮件列表之前可以先发送到这里测试</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para><emphasis>技术性的邮件列表:</emphasis> 以下的邮件列表是用来讨论技术性问题的。
+ 在加入订阅及讨论之前请务必认真阅读每个列表主题,因为他们讨论的内容都是严格地被限制着的。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>目录</entry>
+ <entry>用途</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>&a.acpi.name;</entry>
+ <entry>ACPI和电源管理的开发</entry>
+ </row>
+
+ <row>
+ <entry>&a.afs.name;</entry>
+ <entry>将AFS移植到FreeBSD</entry>
+ </row>
+
+ <row>
+ <entry>&a.aic7xxx.name;</entry>
+ <entry>为&adaptec; AIC 7xxx开发驱动</entry>
+ </row>
+
+ <row>
+ <entry>&a.alpha.name;</entry>
+ <entry>将FreeBSD移植到Alpha工作站</entry>
+ </row>
+
+ <row>
+ <entry>&a.amd64.name;</entry>
+ <entry>将FreeBSD移植到AMD64系统</entry>
+ </row>
+
+ <row>
+ <entry>&a.apache.name;</entry>
+ <entry>Discussion about <application>Apache</application> related ports</entry>
+ </row>
+
+ <row>
+ <entry>&a.arm.name;</entry>
+ <entry>将FreeBSD移植到&arm; 处理器</entry>
+ </row>
+
+ <row>
+ <entry>&a.atm.name;</entry>
+ <entry>在FreeBSD上使用ATM网络</entry>
+ </row>
+
+ <row>
+ <entry>&a.audit.name;</entry>
+ <entry>源代码审核</entry>
+ </row>
+
+ <row>
+ <entry>&a.binup.name;</entry>
+ <entry>二进制更新系统的设计和开发</entry>
+ </row>
+
+ <row>
+ <entry>&a.cluster.name;</entry>
+ <entry>在一个群环境中使用FreeBSD</entry>
+ </row>
+
+ <row>
+ <entry>&a.cvsweb.name;</entry>
+ <entry>CVSweb维护</entry>
+ </row>
+
+ <row>
+ <entry>&a.database.name;</entry>
+ <entry>讨论FreeBSD下发展及使用数据库</entry>
+ </row>
+
+ <row>
+ <entry>&a.doc.name;</entry>
+ <entry>创建FreeBSD相关文档</entry>
+ </row>
+
+ <row>
+ <entry>&a.emulation.name;</entry>
+ <entry>在FreeBSD上仿真其它系统,如:Linux/DOS/&windows;</entry>
+ </row>
+
+ <row>
+ <entry>&a.firewire.name;</entry>
+ <entry>FreeBSD的 &firewire; (iLink, IEEE 1394)技术讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.fs.name;</entry>
+ <entry>文件系统</entry>
+ </row>
+
+ <row>
+ <entry>&a.geom.name;</entry>
+ <entry>针对GEOM的讨论和执行</entry>
+ </row>
+
+ <row>
+ <entry>&a.gnome.name;</entry>
+ <entry>移植<application>GNOME</application> 和 <application>GNOME</application>应用程序</entry>
+ </row>
+
+ <row>
+ <entry>&a.hackers.name;</entry>
+ <entry>一般性的技术讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.hardware.name;</entry>
+ <entry>一般性的支持FreeBSD的硬件的讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.i18n.name;</entry>
+ <entry>FreeBSD的国际化</entry>
+ </row>
+
+ <row>
+ <entry>&a.ia32.name;</entry>
+ <entry>FreeBSD运行在IA-32 (&intel; x86) 平台</entry>
+ </row>
+
+ <row>
+ <entry>&a.ia64.name;</entry>
+ <entry>移植FreeBSD到Intel即将推出的IA64系统</entry>
+ </row>
+
+ <row>
+ <entry>&a.ipfw.name;</entry>
+ <entry>关于IP防火墙代码再设计的技术性讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.isdn.name;</entry>
+ <entry>ISDN开发人员</entry>
+ </row>
+
+ <row>
+ <entry>&a.java.name;</entry>
+ <entry>给&java; 开发人员以及移植&jdk;s到FreeBSD的人们</entry>
+ </row>
+
+ <row>
+ <entry>&a.kde.name;</entry>
+ <entry>移植<application>KDE</application> 和 <application>KDE</application>应用程序</entry>
+ </row>
+
+ <row>
+ <entry>&a.lfs.name;</entry>
+ <entry>移植LFS到FreeBSD上</entry>
+ </row>
+
+ <row>
+ <entry>&a.libh.name;</entry>
+ <entry>第二代的安装和package系统</entry>
+ </row>
+
+ <row>
+ <entry>&a.mips.name;</entry>
+ <entry>移植FreeBSD到&mips;</entry>
+ </row>
+
+ <row>
+ <entry>&a.mobile.name;</entry>
+ <entry>关于便携式计算机的讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.mozilla.name;</entry>
+ <entry>移植<application>Mozilla</application>到FreeBSD上</entry>
+ </row>
+
+ <row>
+ <entry>&a.multimedia.name;</entry>
+ <entry>多媒体应用程序</entry>
+ </row>
+
+ <row>
+ <entry>&a.newbus.name;</entry>
+ <entry>技术讨论关于总线架构</entry>
+ </row>
+
+ <row>
+ <entry>&a.net.name;</entry>
+ <entry>网络讨论和TCP/IP源代码</entry>
+ </row>
+
+ <row>
+ <entry>&a.openoffice.name;</entry>
+ <entry>移植<application>OpenOffice.org</application> 和
+ <application>&staroffice;</application>到FreeBSD上</entry>
+ </row>
+
+ <row>
+ <entry>&a.performance.name;</entry>
+ <entry>高性能、负载下安装后的性能调整问题</entry>
+ </row>
+
+ <row>
+ <entry>&a.perl.name;</entry>
+ <entry>许多与<application>perl</application>相关的ports的维护</entry>
+ </row>
+
+ <row>
+ <entry>&a.platforms.name;</entry>
+ <entry>将FreeBSD移植到非Intel架构的平台上</entry>
+ </row>
+
+ <row>
+ <entry>&a.ports.name;</entry>
+ <entry>ports collection讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.ports-bugs.name;</entry>
+ <entry>ports bugs/PRs讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.ppc.name;</entry>
+ <entry>移植FreeBSD到&powerpc;</entry>
+ </row>
+
+ <row>
+ <entry>&a.qa.name;</entry>
+ <entry>质量保证(QA)讨论, 通常在未发布之前</entry>
+ </row>
+
+ <row>
+ <entry>&a.realtime.name;</entry>
+ <entry>FreeBSD实时扩展的开发</entry>
+ </row>
+
+ <row>
+ <entry>&a.scsi.name;</entry>
+ <entry>SCSI子系统</entry>
+ </row>
+
+ <row>
+ <entry>&a.security.name;</entry>
+ <entry>系统安全</entry>
+ </row>
+
+ <row>
+ <entry>&a.small.name;</entry>
+ <entry>在嵌入式系统上使用FreeBSD</entry>
+ </row>
+
+ <row>
+ <entry>&a.smp.name;</entry>
+ <entry>有关对称多处理器的设计讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.sparc.name;</entry>
+ <entry>移植FreeBSD到&sparc; 系统</entry>
+ </row>
+
+ <row>
+ <entry>&a.standards.name;</entry>
+ <entry>让FreeBSD去顺应C99 以及 &posix; 标准</entry>
+ </row>
+
+ <row>
+ <entry>&a.threads.name;</entry>
+ <entry>线程</entry>
+ </row>
+
+ <row>
+ <entry>&a.testing.name;</entry>
+ <entry>FreeBSD性能和稳定性测试</entry>
+ </row>
+
+ <row>
+ <entry>&a.tokenring.name;</entry>
+ <entry>在FreeBSD中支持Token Ring</entry>
+ </row>
+
+ <row>
+ <entry>&a.vuxml.name;</entry>
+ <entry>关于 VuXML 的问题讨论</entry>
+ </row>
+
+ <row>
+ <entry>&a.x11.name;</entry>
+ <entry>维护和支持X11在FreeBSD上运行</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para><emphasis>限制订阅的列表:</emphasis> 以下的列表是针对某些特定的读者而设的,
+ 而且并不适合被当成是一般公开讨论区。您最好在某一技术讨论区参与讨论后再选择订阅这些
+ 限制订阅的邮件列表,因为这样您可以了解到在这些讨论区发言所需要的礼仪。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>目录</entry>
+ <entry>用途</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>&a.hubs.name;</entry>
+ <entry>运行镜象站点的成员(支持基本服务)</entry>
+ </row>
+
+ <row>
+ <entry>&a.usergroups.name;</entry>
+ <entry>用户组调整</entry>
+ </row>
+
+ <row>
+ <entry>&a.vendors.name;</entry>
+ <entry>商家在发布之前的调整</entry>
+ </row>
+
+ <row>
+ <entry>&a.www.name;</entry>
+ <entry><ulink url="&url.base;/index.html">www.FreeBSD.org</ulink>的维护</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para><emphasis>分类列表:</emphasis> 所有以上的列表在一个分类格式里面是可利用的。
+ 一旦订阅了一个列表,您可以在您的账号选项里面设置您的分类选项。</para>
+
+ <para><emphasis>CVS列表:</emphasis> 以下的邮件是给对FreeBSD源代码的变更记录有兴趣的人看的,
+ 而且它们是<emphasis>只读</emphasis>的邮件列表,您不能发Email给他们。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>列表</entry>
+ <entry>源位置</entry>
+ <entry>描述</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>&a.cvsall.name;</entry>
+ <entry><filename>/usr/(CVSROOT|doc|ports|projects|src)</filename></entry>
+ <entry>所有对源代码的改变纪录</entry>
+ </row>
+
+ <row>
+ <entry>&a.cvs-doc.name;</entry>
+ <entry><filename>/usr/(doc|www)</filename></entry>
+ <entry>所有对doc和www源代码的改变记录</entry>
+ </row>
+
+ <row>
+ <entry>&a.cvs-ports.name;</entry>
+ <entry><filename>/usr/ports</filename></entry>
+ <entry>所有对ports源代码的改变记录</entry>
+ </row>
+
+ <row>
+ <entry>&a.cvs-projects.name;</entry>
+ <entry><filename>/usr/projects</filename></entry>
+ <entry>所有对projects源代码的改变记录</entry>
+ </row>
+
+ <row>
+ <entry>&a.cvs-src.name;</entry>
+ <entry><filename>/usr/src</filename></entry>
+ <entry>所有对src源代码的改变记录</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2 id="eresources-subscribe">
+ <title>如何订阅</title>
+
+ <para>订阅一个列表,点击上面的列表名字或到&a.mailman.lists.link;
+ 并点击进入您感兴趣的列表,这个列表的页面包含了所必需的订阅操作指南。</para>
+
+ <para>其实您只需发送邮件到
+ &lt;<replaceable>listname</replaceable>@FreeBSD.org&gt;。
+ 他将被再次转发到全世界的这个邮件列表的成员。</para>
+
+ <para>点击上面的URL,在列表的底部可以从订阅的列表中退出。
+ 也可以发送一个电子邮件到freebsd-[listname]-unsubscribe@FreeBSD.org来退订。</para>
+
+ <para>此外,我们要求您必须保持在技术性的邮件列表中只是讨论技术。
+ 如果您只是对一些重要的公告感兴趣,建议您加入&a.announce;,它的通信量比较低。</para>
+ </sect2>
+
+ <sect2 id="eresources-charters">
+ <title>列表规章</title>
+
+ <para><emphasis>所有</emphasis>FreeBSD的邮件列表都有同样的基本规则,所有人必须按照规则来做。
+ 不按照规则做的都会导致两个来自FreeBSD Postmaster <email>postmaster@FreeBSD.org</email>写
+ 给您的警告,之后,就是第三个提醒,FreeBSD Postmaster将从所有FreeBSD的邮件列表中删除他们。
+ 我们很遗憾必须要遵守这样的规则,但今天的互联网是一个很混乱的环境,它看起来很多机制都是很脆弱的。</para>
+
+ <para>具体规则:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>任何发表的主题都应当附合基本的列表概况。例如,如果列表是有关技术问题的,
+ 那您发表的文章包含技术讨论。不要把不相关的讨论放在一起。
+ 对于没有主题的自由形式的讨论,可以使用FreeBSD-chat <email>freebsd-chat@FreeBSD.org</email>。</para>
+ </listitem>
+
+ <listitem>
+ <para>不要将同一个问题发送到超过两个的邮件列表上,当有一个清晰和明显的必须要
+ 发表到两个列表的要求时,也只能是两个。对于大多数的列表,已经有相当多的订户了,
+ 除了一些比较深奥的问题(如<quote>-stable &amp; -scsi</quote>) ,没有必要同时将一个问题发到多个列表上。
+ 如果一个信息以这种方式(多个邮件列表在<literal>Cc</literal>行出现)被发送给您,
+ 那<literal>Cc</literal>行在把它再发送出去之前也将被整理。
+ <emphasis>无论谁是最初发表者,都会导致您自己的交叉发送。</emphasis></para>
+ </listitem>
+
+ <listitem>
+ <para>不容许进行人身攻击和亵渎(在前后的争论中),包括用户和开发人员。
+ 应当遵守最起码的网络礼节,象需要征得同意才可以引用或张贴私人邮件等。
+ <emphasis>然而</emphasis>,也有非常少的情况下,这样的内容会符合列表规章,
+ 因此,它会在最初给予警告(或禁止)。</para>
+ </listitem>
+
+ <listitem>
+ <para>严格的禁止非FreeBSD相关产品或服务的广告,一旦发现将马上取缔。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><emphasis>单独的列表规章:</emphasis></para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>&a.acpi.name;</term>
+
+ <listitem>
+ <para><emphasis>ACPI和电源管理开发</emphasis></para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.afs.name;</term>
+
+ <listitem>
+ <para><emphasis>Andrew文件系统</emphasis></para>
+
+ <para>这个列表是用来讨论porting和从CMU/Transarc使用AFS。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.announce.name;</term>
+
+ <listitem>
+ <para><emphasis>重要事件/里程碑</emphasis></para>
+
+ <para>这是一个发布FreeBSD重大事件的邮件列表。这包括有关snapshots和其他版本的公告,
+ 新的FreeBSD的性能的公告,还可以用于指派志愿者等等。这个列表比较小。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.arch.name;</term>
+
+ <listitem>
+ <para><emphasis>架构和设计讨论</emphasis></para>
+
+ <para>这个列表是讨论FreeBSD的架构。本质上应保证内容的纯技术性。例如主题是:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如何重新创建系统使其同时有几个自己构造的系统运行。</para>
+ </listitem>
+
+ <listitem>
+ <para>需要什么才能修复VFS来使Heidemann层工作。</para>
+ </listitem>
+
+ <listitem>
+ <para>我们怎么改变设备驱动程序接口以便能够在多种总线和体系结构上使用同样的驱动程序。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何写一个网络驱动。</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.audit.name;</term>
+
+ <listitem>
+ <para><emphasis>源代码审核计划</emphasis></para>
+
+ <para>这个是针对FreeBSD源代码审核计划的邮件列表,
+ 虽然这最初是针对安全方面代码修正的讨论,现在它已经扩展到任何代码修正的讨论。</para>
+
+ <para>这个列表涉及补丁方面的问题比较多,可能普通的FreeBSD用户对此不感兴趣。
+ 不与一个特定的代码修正相关的安全讨论将放在freebsd-security中。相反的,
+ 所有的开发人员都被鼓励把他们的补丁发到这儿来,
+ 特别是如果他们发现有一个错误可能会影响系统的完整性时。</para>
+
+<!-- I can't actually find a charter for this, but there's this email: http://www.FreeBSD.org/cgi/getmsg.cgi?fetch=223347+225804+/usr/local/www/db/text/2000/cvs-all/20001210.cvs-all -->
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.binup.name;</term>
+
+ <listitem>
+ <para><emphasis>FreeBSD二进制升级计划</emphasis></para>
+
+ <para>这个列表主要是讨论二进制升级<application>binup</application>系统。
+ 设计问题,执行细节,补丁,错误报告,状态报告,特性要求,
+ 提交日志,和所有其他与 <application>binup</application>相关的东西都可以。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.bugbusters.name;</term>
+
+ <listitem>
+ <para><emphasis>同等问题报告处理结果</emphasis></para>
+
+ <para>这个列表的目的是作为一个调整和讨论论坛来服务于Bug列表的成员,Bugbuster列表成员
+ 和其他任何的对PR数据库真正的有兴趣的成员。这个列表不是为了讨论关于Bug细节,补丁或PRs。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.bugs.name;</term>
+
+ <listitem>
+ <para><emphasis>Bug报告</emphasis></para>
+
+ <para>这是一个报告FreeBSD的Bug的邮件列表。可以随时通过
+ &man.send-pr.1;
+ 命令或<ulink
+ url="&url.base;/send-pr.html">WEB页面</ulink>来提交Bug。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.chat.name;</term>
+
+ <listitem>
+ <para><emphasis>与FreeBSD社区相关的非技术性项目</emphasis></para>
+
+ <para>这个列表超出了其他有关非技术、社会信息的内容。
+ 包括谈论Jordan看起来是否像一个机敏的侦探,是否句首的字母要大写, 谁喝了很多咖啡,
+ 哪儿的啤酒酿造的最好,谁在他们的地下室里酿造了啤酒等等。对于偶然宣布重大的事件
+ (例如:将要举行的聚会,婚礼,生日,新工作等等)也能使用这种技术列表,除上述列举之外
+ 任何事情都可以发布在-chat列表上。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.core.name;</term>
+
+ <listitem>
+ <para><emphasis>FreeBSD核心团队</emphasis></para>
+
+ <para>这是一个只供核心成员内部使用的邮件列表,只有当一个与FreeBSD相关的严重的事情需要裁决或严格审核时,
+ 才能发送消息到这个邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.current.name;</term>
+
+ <listitem>
+ <para><emphasis>关于使用&os.current;版的讨论</emphasis></para>
+
+ <para>这是一个针对&os.current;用户的邮件列表。
+ 它包括一些可能影响用户的新特性的警告,使用FreeBSD-current的一些指导。
+ 任何运行<quote>CURRENT</quote>的人必须同意这个列表,这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.cvsweb.name;</term>
+
+ <listitem>
+ <para><emphasis>FreeBSD CVSweb计划</emphasis></para>
+
+ <para>关于FreeBSD-CVSweb的使用,开发和维护的技术性讨论。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.doc.name;</term>
+
+ <listitem>
+ <para><emphasis>文档计划</emphasis></para>
+
+ <para>这个邮件列表是与FreeBSD创建的文档的出版和计划的讨论。
+ 这个邮件列表的成员都会提交到<quote>The FreeBSD Documentation Project</quote>。
+ 它是一个开放的列表,可以自由地加入和做贡献!</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.firewire.name;</term>
+
+ <listitem>
+ <para><emphasis>&firewire; (iLink, IEEE 1394)</emphasis></para>
+
+ <para>这个邮件列表是关于FreeBSD子系统&firewire; (aka IEEE 1394 aka
+ iLink)的设计和执行。相关特定的主题包括标准,总线设计和他们的协议,
+ 适配器板/卡/芯片设置,及他们的正确的代码的结构和实施。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.fs.name;</term>
+
+ <listitem>
+ <para><emphasis>文件系统</emphasis></para>
+
+ <para>关于FreeBSD文件系统的讨论。这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.geom.name;</term>
+
+ <listitem>
+ <para><emphasis>GEOM</emphasis></para>
+
+ <para>针对GEOM和相关执行的讨论。这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.gnome.name;</term>
+
+ <listitem>
+ <para><emphasis>GNOME</emphasis></para>
+
+ <para>讨论关于在FreeBSD系统上的<application>GNOME</application>桌面环境
+ 这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.ipfw.name;</term>
+
+ <listitem>
+ <para><emphasis>IP防火墙</emphasis></para>
+
+ <para>这是关于在FreeBSD里重新设计IP防火墙代码的技术讨论论坛。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.ia64.name;</term>
+
+ <listitem>
+ <para><emphasis>移植FreeBSD到IA64</emphasis></para>
+
+ <para>这是一个有关将FreeBSD移植到Intel IA64架构上的技术讨论列表,
+ 讨论一些相关的问题与解决方案。也欢迎对这些问题感兴趣的个别讨论者。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.isdn.name;</term>
+
+ <listitem>
+ <para><emphasis>ISDN通信</emphasis></para>
+
+ <para>这是一个FreeBSD支持的ISDN系统开发的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.java.name;</term>
+
+ <listitem>
+ <para><emphasis>&java;开发</emphasis></para>
+
+ <para>这是一个讨论&java; 应用开发和 &jdk;s的porting与维护的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="eresources-charters-jobs">
+ <term>&a.jobs.name;</term>
+
+ <listitem>
+ <para><emphasis>工作的提供和寻找</emphasis></para>
+
+ <para>这个论坛是针对与&os;相关的雇佣信息和个人简历,比如:如果您想找一个与&os;相关的
+ 工作或有一个工作需要&os;这是一个很好的地方让您来广告。这<emphasis>不</emphasis>是
+ 对一般性雇佣问题的邮件列表,对这个问题已经有了足够多的论坛。</para>
+
+ <para>注意这个列表,像其他的FreeBSD.org邮件列表一样是分布在世界范围内的。
+ 因此,您需要明白关于位置和地域问题,确定之间是容易联系和可合作的。</para>
+
+ <para>Email最好应该使用 &mdash;纯文本格式,不过基本的<acronym>PDF</acronym>,HTML和
+ 很少其他的能被更多读者接受的格式也是可以的。&microsoft; Word (<filename>.doc</filename>)
+ 格式是被邮件列表服务器拒绝的。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.kde.name;</term>
+
+ <listitem>
+ <para><emphasis>KDE</emphasis></para>
+
+ <para>讨论关于在FreeBSD系统上使用<application>KDE</application>。
+ 这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.hackers.name;</term>
+
+ <listitem>
+ <para><emphasis>技术讨论</emphasis></para>
+
+ <para>这是一个与FreeBSD相关的技术讨论论坛,是一个主要的技术性邮件列表。
+ 他是针对个别的工作在FreeBSD上的人来提出问题或讨论相关的解决方案,
+ 也欢迎对这些问题感兴趣的个别的讨论者。这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.hardware.name;</term>
+
+ <listitem>
+ <para><emphasis>FreeBSD硬件的普通讨论</emphasis></para>
+
+ <para>有关FreeBSD运行的硬件类型的普通讨论,包括是否该买的一些问题和建议。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.hubs.name;</term>
+
+ <listitem>
+ <para><emphasis>镜象站点</emphasis></para>
+
+ <para>人们运行FreeBSD的镜象站点的公告和讨论。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.isp.name;</term>
+
+ <listitem>
+ <para><emphasis>ISP供应商问题</emphasis></para>
+
+ <para>这是一个讨论使用FreeBSD的ISP供应商的邮件列表。这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.newbies.name;</term>
+
+ <listitem>
+ <para><emphasis>新手的讨论区</emphasis></para>
+
+ <para>我们掌握了新手的任何行为,在这里包括:独立地学习和解决问题,寻找和使用资源,寻求帮助,
+ 如何使用邮件列表和使用哪个邮件列表,普通的交谈,犯错误,成就
+ 共享主意,故事,精神支持和加入FreeBSD社区。我们带着我们的难题和
+ 支持问题到freebsd-questions,freebsd-newbies给新手来使用。
+ 我们处理自己的问题和支持freebsd-questions的同时,这里对新手来说,
+ freebsd-newbies的使用能使新手之间相互交流。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.openoffice.name;</term>
+
+ <listitem>
+ <para><emphasis>OpenOffice.org</emphasis></para>
+
+ <para>关于<application>OpenOffice.org</application>和<application>&staroffice;</application>.
+ 的移植和维护。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.performance.name;</term>
+
+ <listitem>
+ <para><emphasis>讨论关于调整及高速运行FreeBSD</emphasis></para>
+
+ <para>这个邮件列表提供了一个为黑客,管理员和有关的团体去讨论与FreeBSD性能相关的主题的空间。
+ 可以在这里进行讨论的包括在任意高负载下,体验版下或者是有限制的条件下安装FreeBSD。
+ 非常鼓励自愿地为了改进FreeBSD性能的相关团体去订阅这个列表。
+ 这是个高技术含量的列表理论上说适合有丰富经验的FreeBSD用户,黑客,或对FreeBSD的速度、性能
+ 、升级感兴趣的管理员。这不是一个问答式的列表,关于这些应该去读相关文档,但他是
+ 一个可以投稿的地方,或者了解关于待解决的与性能相关的主题。</para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.platforms.name;</term>
+
+ <listitem>
+ <para><emphasis>移植到非Intel平台上</emphasis></para>
+
+ <para>跨平台的FreeBSD问题,非Intel平台的Port讨论和建议。这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.policy.name;</term>
+
+ <listitem>
+ <para><emphasis>核心团队策略的决定</emphasis></para>
+
+ <para>这是一个很小的只读的有关核心团队策略决定的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.ports.name;</term>
+
+ <listitem>
+ <para><emphasis><quote>ports</quote>的讨论</emphasis></para>
+
+ <para>关于FreeBSD的<quote>ports collection</quote> (<filename>/usr/ports</filename>)的讨论,
+ ports的基础构造和调整过的ports结构。这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.ports-bugs.name;</term>
+
+ <listitem>
+ <para><emphasis><quote>ports</quote> bugs的讨论</emphasis></para>
+
+ <para>讨论关于FreeBSD的<quote>ports collection</quote> (<filename>/usr/ports</filename>),问题报告
+ ports建议,或者ports的修正。这是一个纯技术的邮件列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.questions.name;</term>
+
+ <listitem>
+ <para><emphasis>用户问题</emphasis></para>
+
+ <para>这是一个有关FreeBSD问题的邮件列表。您不应当发送<quote>how to</quote>
+ 问题给技术列表,除非您认为这个问题是非常可爱的技术问题。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.scsi.name;</term>
+
+ <listitem>
+ <para><emphasis>SCSI子系统</emphasis></para>
+
+ <para>这是一个讨论FreeBSD的SCSI子系统的邮件列表。这是一个纯技术的列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.security.name;</term>
+
+ <listitem>
+ <para><emphasis>安全问题</emphasis></para>
+
+ <para>FreeBSD的计算机安全问题(DES,Kerberos,已知的安全漏洞和修复等)。
+ 这是一个纯技术的邮件列表。注意:这不是一个问和答的列表,但是同时给出
+ 问题和答案到FAQ是欢迎的。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.security-notifications.name;</term>
+
+ <listitem>
+ <para><emphasis>安全通知</emphasis></para>
+
+ <para>FreeBSD安全问题和修复的通知。这不是一个讨论列表,讨论的列表应当是FreeBSD-security</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.small.name;</term>
+
+ <listitem>
+ <para><emphasis>在嵌入式应用程序中使用FreeBSD</emphasis></para>
+
+ <para>这个列表讨论了与极小的和嵌入的FreeBSD安装的讨论主题。这是一个纯技术的列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.stable.name;</term>
+
+ <listitem>
+ <para><emphasis>讨论关于&os.stable;版的使用</emphasis></para>
+
+ <para>这是一个&os.stable;用户的邮件列表。它包括-STABLE的新特性可能会影响用户的警告。
+ 任何运行<quote>STABLE</quote>的人应当经常关注这个列表。这是一个纯技术的列表。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.standards.name;</term>
+
+ <listitem>
+ <para><emphasis>C99 &amp; POSIX一致</emphasis></para>
+
+ <para>这是关于FreeBSD顺应C99和POSIX标准的技术讨论论坛。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.usergroups.name;</term>
+
+ <listitem>
+ <para><emphasis>用户组调整列表</emphasis></para>
+
+ <para>这个邮件列表为协调从各地的使用群体到彼此相互讨论问题和
+ 从核心团队中指定个人。这个邮件列表应被限制到大纲和协调用户组
+ 计划的范围之内。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>&a.vendors.name;</term>
+
+ <listitem>
+ <para><emphasis>商家</emphasis></para>
+
+ <para>讨论FreeBSD计划和FreeBSD软硬件商家的协调。</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect2>
+ <sect2 id="eresources-mailfiltering">
+ <title>过滤邮件列表</title>
+
+ <para>&os;邮件列表是使用了多种过滤方法去消除垃圾邮件、病毒和其他没用的电子邮件。
+ 这部分所描述的并不包括所有常用的保护邮件列表的消除方法。</para>
+
+ <para>邮件列表只包含一些允许的附件类型。所有在列表中有MIME类型的附件的电子邮件在
+ 邮件列表中被转发之前将被过滤掉。</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>application/octet-stream</para>
+ </listitem>
+
+ <listitem>
+ <para>application/pdf</para>
+ </listitem>
+
+ <listitem>
+ <para>application/pgp-signature</para>
+ </listitem>
+
+ <listitem>
+ <para>application/x-pkcs7-signature</para>
+ </listitem>
+
+ <listitem>
+ <para>message/rfc822</para>
+ </listitem>
+
+ <listitem>
+ <para>multipart/alternative</para>
+ </listitem>
+
+ <listitem>
+ <para>multipart/related</para>
+ </listitem>
+
+ <listitem>
+ <para>multipart/signed</para>
+ </listitem>
+
+ <listitem>
+ <para>text/html</para>
+ </listitem>
+
+ <listitem>
+ <para>text/plain</para>
+ </listitem>
+
+ <listitem>
+ <para>text/x-diff</para>
+ </listitem>
+
+ <listitem>
+ <para>text/x-patch</para>
+ </listitem>
+ </itemizedlist>
+
+ <note>
+ <para>一些邮件列表可以允许附件为其他MIME类型,但是以上列出的
+ 应该被多数的邮件列表所采用。</para>
+ </note>
+
+ <para>如果一个电子邮件包含HTML和纯文本形式,HTML的形式将被删除。
+ 如果一个电子邮件内容只是HTML形式,他将被转换为纯文本格式。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="eresources-news">
+ <title>Usenet新闻组</title>
+
+ <para>除了FreeBSD两个特殊的新闻组,还有很多讨论FreeBSD或与FreeBSD用户相关的其他讨论组。
+ 一些新闻组的<ulink
+ url="http://minnie.tuhs.org/BSD-info/bsdnews_search.html">关键词搜索档案</ulink>是可以使用的,
+ 有什么问题可以与Warren Toomey <email>wkt@cs.adfa.edu.au</email>联系。</para>
+
+ <sect2>
+ <title>BSD特殊的新闻组</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.bsd.freebsd.announce">comp.unix.bsd.freebsd.announce</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.bsd.freebsd.misc">comp.unix.bsd.freebsd.misc</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:de.comp.os.unix.bsd">de.comp.os.unix.bsd</ulink> (德语)</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:fr.comp.os.bsd">fr.comp.os.bsd</ulink> (法语)</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:it.comp.os.freebsd">it.comp.os.freebsd</ulink> (意大利语)</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2>
+ <title>Internet上其他的&unix;新闻组</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="news:comp.unix">comp.unix</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.questions">comp.unix.questions</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.admin">comp.unix.admin</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.programmer">comp.unix.programmer</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.shell">comp.unix.shell</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.user-friendly">comp.unix.user-friendly</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.security.unix">comp.security.unix</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.sources.unix">comp.sources.unix</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.advocacy">comp.unix.advocacy</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.misc">comp.unix.misc</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.bugs.4bsd">comp.bugs.4bsd</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.bugs.4bsd.ucb-fixes">comp.bugs.4bsd.ucb-fixes</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.unix.bsd">comp.unix.bsd</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2>
+ <title>X Window系统</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink
+ url="news:comp.windows.x.i386unix">comp.windows.x.i386unix</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.windows.x">comp.windows.x</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.windows.x.apps">comp.windows.x.apps</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.windows.x.announce">comp.windows.x.announce</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.windows.x.intrinsics">comp.windows.x.intrinsics</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.windows.x.motif">comp.windows.x.motif</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.windows.x.pex">comp.windows.x.pex</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="news:comp.emulators.ms-windows.wine">comp.emulators.ms-windows.wine</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="eresources-web">
+ <title>World Wide Web服务器</title>
+
+ &chap.eresources.www.inc;
+ </sect1>
+
+ <sect1 id="eresources-email">
+ <title>Email地址</title>
+
+ <para>下面的用户组提供了与FreeBSD相关的邮件地址。如果他被滥用的话,
+ 这个列表的管理员有收回的权利。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>域</entry>
+ <entry>工具</entry>
+ <entry>用户组</entry>
+ <entry>管理员</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>ukug.uk.FreeBSD.org</entry>
+ <entry>Forwarding only</entry>
+ <entry><email>freebsd-users@uk.FreeBSD.org</email></entry>
+ <entry>Lee Johnston
+ <email>lee@uk.FreeBSD.org</email></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect1>
+
+ <sect1 id="eresources-shell">
+ <title>Shell账号</title>
+
+ <para>下面的用户组为积极支持FreeBSD的人们提供了shell账号。如果他被滥用的话,
+ 这个列表的管理员有撤销的权利。 </para>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>主机</entry>
+ <entry>访问</entry>
+ <entry>工具</entry>
+ <entry>管理员</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>storm.uk.FreeBSD.org</entry>
+ <entry>SSH only</entry>
+ <entry>Read-only cvs, personal web space, email</entry>
+ <entry>&a.brian;</entry>
+ </row>
+
+ <row>
+ <entry>dogma.freebsd-uk.eu.org</entry>
+ <entry>Telnet/FTP/SSH</entry>
+ <entry>Email, Web space, Anonymous FTP</entry>
+ <entry>Lee Johnston
+ <email>lee@uk.FreeBSD.org</email></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect1>
+</appendix>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../appendix.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "appendix")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/install/Makefile b/zh_CN.GB2312/books/handbook/install/Makefile
new file mode 100644
index 0000000000..bc80e45c4e
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/install/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= install/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/install/chapter.sgml b/zh_CN.GB2312/books/handbook/install/chapter.sgml
new file mode 100644
index 0000000000..5b8cfaab66
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/install/chapter.sgml
@@ -0,0 +1,4751 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.300
+ $FreeBSD$
+-->
+
+<chapter id="install">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>结构、组织重整, 部分重写 </contrib>
+ </author>
+ </authorgroup>
+
+ <authorgroup>
+ <author>
+ <firstname>Randy</firstname>
+ <surname>Pratt</surname>
+ <contrib>sysinstall 操作流程、屏幕抓图以及一般性文件</contrib>
+ </author>
+ </authorgroup>
+ <!-- January 2000 -->
+ </chapterinfo>
+
+ <title>安装 FreeBSD</title>
+
+ <sect1 id="install-synopsis">
+ <title>概述</title>
+
+ <indexterm><primary>installation</primary></indexterm>
+
+ <para>FreeBSD 提供了一个以文字为主,简单好用的安装程序,叫做
+ <application>sysinstall</application> 。这是 FreeBSD 默认使用的安装程序;
+ 厂商如果想,也可以提供适合自己需要的安装程序。本章说明如何使用
+ <application>sysinstall</application> 来安装 FreeBSD。</para>
+
+ <para>学习完本章之后,您将会知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如何制作 FreeBSD 安装磁盘</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD如何参照及分割您的硬盘</para>
+ </listitem>
+
+ <listitem>
+ <para>如何启动 <application>sysinstall</application>.</para>
+ </listitem>
+
+ <listitem>
+ <para>在执行 <application>sysinstall</application> 时您将要回答的问题、
+ 问题代表什么意义,以及该如何回答它们。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在阅读本章之前,您应该:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>阅读您要安装的 FreeBSD 版本所附的硬件支持列表以确定您的硬件有没有被支持。</para>
+ </listitem>
+ </itemizedlist>
+
+ <note>
+ <para>一般来说,此安装说明是针对 &i386; (<quote>PC 兼容机</quote>) 体系结构的电脑。
+ 如果有其它体系结构(如Alpha)的安装说明,我们将一并列出。
+ 虽然本文档经常保持更新,但有可能与您安装版本上所带的说明文档有些许出入。
+ 在这里建议您使用本说明文章作为一般性的安装指导参考手册。</para>
+ </note>
+
+ </sect1>
+
+ <sect1 id="install-pre">
+ <title>安装前的准备工作</title>
+
+ <sect2 id="install-inventory">
+ <title>列出您电脑的硬件清单</title>
+
+ <para>在安装 FreeBSD 之前,您应该试着将您电脑中的硬件清单列出来。FreeBSD
+ 安装程序会将这些硬件(磁盘、网卡、光驱等等)以及型号及制造厂商列出来。
+ FreeBSD 也会尝试为这些设备找出最适当的 IRQ 及 IO 端口的设定。但是因为 PC
+ 的硬件种类实在太过复杂,这个步骤不一定总是能成功。
+ 这时,您就可能需要手动更改有问题的设备的设定值。</para>
+
+ <para>如果您已经安装了其它的操作系统,如 &windows; 或 Linux,那么您可以先由
+ 这些系统所提供的工具来查看您的设备设定值是怎么分配的。如果您真的没办法
+ 确定某些接口卡用什么设定值,那么您可以检查看看,说不定它的设定已经标示
+ 在卡上。常用的 IRQ 号号码为 3、5 以及 7;IO 端口的值通常以 16 进制位表示,例如
+ Ox330。</para>
+
+ <para>我们建议您在安装 FreeBSD 之前把这些信息打印或记录下来,做成表格
+ 的样子也许会比较有帮助,例如:</para>
+
+ <table pgwide="1" frame="none">
+ <title>硬件设备清单</title>
+
+ <tgroup cols="4">
+ <colspec colwidth="2*">
+ <colspec colwidth="1*">
+ <colspec colwidth="1*">
+ <colspec colwidth="4*">
+ <thead>
+ <row>
+ <entry>设备名</entry>
+
+ <entry>IRQ</entry>
+
+ <entry>IO 端口号</entry>
+
+ <entry>备注</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>第一块硬盘</entry>
+
+ <entry>N/A</entry>
+
+ <entry>N/A</entry>
+
+ <entry>40&nbsp;GB,Seagate 制造,第一个 IDE 接口主设备</entry>
+ </row>
+
+ <row>
+ <entry>CDROM</entry>
+
+ <entry>N/A</entry>
+
+ <entry>N/A</entry>
+
+ <entry>第一个 IDE 接口从设备</entry>
+ </row>
+
+ <row>
+ <entry>第二块硬盘</entry>
+
+ <entry>N/A</entry>
+
+ <entry>N/A</entry>
+
+ <entry>20&nbsp;GB,IBM 制造, 第二个 IDE 接口主设备</entry>
+ </row>
+
+ <row>
+ <entry>第一个 IDE 控制器</entry>
+
+ <entry>14</entry>
+
+ <entry>0x1f0</entry>
+
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry>网卡</entry>
+
+ <entry>N/A</entry>
+
+ <entry>N/A</entry>
+
+ <entry>&intel; 10/100</entry>
+ </row>
+
+ <row>
+ <entry>Modem</entry>
+
+ <entry>N/A</entry>
+
+ <entry>N/A</entry>
+
+ <entry>&tm.3com; 56K faxmodem,位于 COM1 口</entry>
+ </row>
+
+ <row>
+ <entry>&hellip;</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2>
+ <title>备份您的数据</title>
+
+ <para>如果您的电脑上面存有重要的数据资料,那么在安装 FreeBSD 前请确定
+ 您已经将这些资料备份了,并且先测试这些备份文档是否有问题。FreeBSD
+ 安装程序在要写入任何资料到您的硬盘前都会先提醒您确认,一旦您确定要
+ 写入,那么以后就没有反悔的机会。</para>
+ </sect2>
+
+ <sect2 id="install-where">
+ <title>决定要将 FreeBSD 安装到哪里</title>
+
+ <para>如果您想让 FreeBSD 使用整个硬盘,那么请直接跳到下一节。</para>
+ <para>但是,如果您想让 FreeBSD 跟您已有的系统并存,那么您必须对您数据
+ 存在硬盘的分布方式有深入的了解以及其所造成的影响。</para>
+
+ <sect3 id="install-where-i386">
+ <title>&i386; 体系结构的硬盘分配方式</title>
+
+ <para>一个 PC 硬盘可以被细分为许多分散的区域。这些区域叫做
+ <firstterm>分区(partitions)</firstterm>。 由于设计的原因,每个硬盘仅
+ 支持四个分区;这些分区叫做<firstterm>主分区(Primary partion)</firstterm>。
+ 为了突破这个限制以便能使用更多的分区,就有了新的分区类型,叫做<firstterm>
+ 扩展分区(Extended partition)</firstterm>。一个硬盘可以拥有一个扩展分区。在
+ 扩展分区里可以建立许多个所谓的<firstterm>逻辑分区(Logical partitions)</firstterm>。</para>
+
+ <para>每个分区都有其独立的<firstterm>分区号(partition ID)</firstterm>,
+ 用以区分每个分区的数据类型。FreeBSD 分区的分区号为 <literal>165</literal>。
+ </para>
+
+ <para>一般而言,每种操作系统都会有自己独特的方式来区别分区。例如 Dos 及其
+ 之后的 &windows;,会分配给每个主分区及逻辑分区一个<firstterm>驱动器字符
+ (drive letter)</firstterm>,从 <devicename>C:</devicename> 开始。</para>
+
+ <para>FreeBSD 必须安装在主分区。 FreeBSD 可以在这个分区上面存放系统数据
+ 或是您建立的任何文件。然而,如果您有多个硬盘,您也可以在这些硬盘上(全部
+ 或部分)建立 FreeBSD 分区。在您安装 FreeBSD 的时候,必须要有一个分区可以给
+ FreeBSD 使用。这个分区可以是尚未规划的分区或是已经划好,但是里面的数据
+ 您都不想保存的分区。</para>
+
+ <para>如果您已经用完了您硬盘上的所有分区,那么您必须使用其它操作系统所
+ 提供的工具(如 DOS 或 &windows; 下的 <command>fdisk</command>)来腾出一个分区
+ 给 FreeBSD 使用。</para>
+
+ <para>如果您的某个分区有多余的空间,您可以使用它。但是使用前您需要先整理
+ 一下这些分区。</para>
+
+ <para>FreeBSD 最小安装需要约 100&nbsp;MB 的空间,但是这仅是 <emphasis>非常</emphasis>
+ 基本的安装,几乎没有剩下多少空间可以建立您自己的文件。一个较理想的最小安装是
+ 250&nbsp;MB,不含图形界面;或是 350&nbsp;MB 以上,包含图形界面。如果您还需要安装
+ 其它的第三方厂商的套件,那么将需要更多的硬盘空间。</para>
+
+ <para>您可以使用商业软件,例如 <application>&partitionmagic;(硬盘分区魔术师)
+ </application> 来建立给 FreeBSD 使用的空间。FreeBSD 光盘的 <filename>tools</filename>
+ 目录包含两个免费的工具也可以完成这个工作:<application>FIPS</application> 以及
+ <application>PResizer</application>,它们的文档可以在同一目录中找到。<application>FIPS</application>、
+ <application>PResizer</application>,和 <application>&partitionmagic;</application>
+ 能够改变 <acronym>FAT16</acronym> 以及 <acronym>FAT32</acronym> 分区大小&mdash;
+ 在 &ms-dos; 方式下使用以及 &windows; ME。这些工具的说明文件可以在同一个目录下面找到
+ <application>&partitionmagic;</application> 是知道的唯一能改变 <acronym>NTFS</acronym>
+ 分区大小的应用软件。</para>
+
+ <warning>
+ <para>不当的使用这些工具可能会删掉您硬盘上的数据资料!在使用这些工具前
+ 确定您有最近的、没问题的备份数据。</para>
+ </warning>
+
+ <example>
+ <title>使用已存在的分区</title>
+
+ <para>假设您只有一个 4GB 的硬盘,而且已经装了 &windows; 然后您将这个硬盘分成两个分区
+ <devicename>C:</devicename> 跟 <devicename>D:</devicename>,每个分区大小为
+ 2&nbsp;GB。在 <devicename>C:</devicename> 分区上存放有 1&nbsp;GB 的数据、
+ <devicename>D:</devicename>分区上存放 0.5&nbsp;GB 的数据。</para>
+
+ <para>这意味着您的盘上有两个分区,一个驱动器符号是一个分区(如 c:、d:)。
+ 您可以把所有存放在 <devicename>D:</devicename> 分区上的数据拷贝到
+ <devicename>C:</devicename> 分区,这样就空出了一个分区(d:)给 FreeBSD 使用。</para>
+ </example>
+
+ <example>
+ <title>缩减已现在的分区</title>
+
+ <para>假设您只有一个 4&nbsp;GB 的硬盘,而且已经装了 &windows;。您在安装 &windows; 的时候
+ 把 4&nbsp;GB 都给了 <devicename>C:</devicename> 分区,并且已经使用了 1.5&nbsp;GB 的空间。
+ 您想将剩余空间中的 2&nbsp;GB 给 FreeBSD 使用。</para>
+
+ <para>为了安装 FreeBSD,您必须从下面两种方式中选择一种:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>备份 &windows; 的数据资料,然后重新安装 &windows;,并给 &windows; 分配 2&nbsp;GB
+ 的空间。</para>
+ </listitem>
+
+ <listitem>
+ <para>使用上面提及的 <application>&partitionmagic;</application> 来整理
+ 或切割您的分区。</para>
+ </listitem>
+ </orderedlist>
+ </example>
+
+ </sect3>
+
+ <sect3>
+ <title>Alpha 体系结构的硬盘分配方式</title>
+
+ <indexterm><primary>Alpha</primary></indexterm>
+
+ <para>在 Alpha 上,您必须使用一整颗硬盘给 FreeBSD,没有办法在同一个硬盘上跟
+ 其它操作系统共存。根据不同的 Alpha 机器,您的硬盘可以是 SCSI 或 IDE 硬盘,只要
+ 您的机器可以从这些硬盘开机就可以。</para>
+
+ <para>按照 Digital/Compaq 使用手册书写的惯例,所有 SRM 输入的部分都用大写
+ 表示。注意,SRM 大小写有别。</para>
+
+ <para>要想得知您硬盘的名称以及型号,可以在 SRM console 提示符下使用 <literal>
+ SHOW DEVICE</literal> 命令:</para>
+
+ <screen>&gt;&gt;&gt;<userinput>SHOW DEVICE</userinput>
+dka0.0.0.4.0 DKA0 TOSHIBA CD-ROM XM-57 3476
+dkc0.0.0.1009.0 DKC0 RZ1BB-BS 0658
+dkc100.1.0.1009.0 DKC100 SEAGATE ST34501W 0015
+dva0.0.0.0.1 DVA0
+ewa0.0.0.3.0 EWA0 00-00-F8-75-6D-01
+pkc0.7.0.1009.0 PKC0 SCSI Bus ID 7 5.27
+pqa0.0.0.4.0 PQA0 PCI EIDE
+pqb0.0.1.4.0 PQB0 PCI EIDE</screen>
+
+ <para>此范例使用 Digital Personal Workstation 433au 并且显示出此机器联接
+ 有三个硬盘。第一个是 CDROM,叫做 <devicename>DKA0</devicename>;另外两个
+ 是两个硬盘,分别叫做 <devicename>DKC0</devicename> 及 <devicename>DKC100
+ </devicename>。</para>
+
+ <para>硬盘名称中有 <devicename>DKx</devicename> 字样的是 SCSI 硬盘。例如
+ <devicename>DKA100</devicename> 表示是一个 SCSI 设备,其 SCSI ID 为 1,位于
+ 第一个 SCSI 接口 (A)。 <devicename>DKC300</devicename> 表示一个 SCSI 硬盘,
+ SCSI ID 为 3,位于第三个 SCSI 接口 (C)。设备名称 <devicename>PKx</devicename>
+ 表示 SCSI 控制卡。由以上 <literal>SHOW DEVICE</literal> 指令的输出结果看来,
+ SCSI 光盘也被视为是 SCSI 硬盘的一种。</para>
+
+ <para>IDE 硬盘的名称类似 <devicename>DQx</devicename>,而 <devicename>PQx
+ </devicename> 则表示相对应的硬盘控制器。</para>
+
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>收集您的网络配置相关资料</title>
+
+ <para>如果您想通过网络(FTP 或是 NFS)安装 FreeBSD,那么您就必须知道您的网络配置
+ 信息。在安装 FreeBSD 的过程中将会提示您输入这些资料,以顺利完成安装过程。</para>
+
+ <sect3>
+ <title>使用以太网或电缆/DSL Modem</title>
+
+ <para>如果您通过局域网或是要通过网卡使用电缆/DSL 上网,那么您必须准备下面
+ 的信息:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>IP 地址。</para>
+ </listitem>
+
+ <listitem>
+ <para>默认网关 IP 地址。</para>
+ </listitem>
+
+ <listitem>
+ <para>主机名称。</para>
+ </listitem>
+
+ <listitem>
+ <para>DNS 服务器的 IP 地址。</para>
+ </listitem>
+
+ <listitem>
+ <para>子网掩码。</para>
+ </listitem>
+ </orderedlist>
+
+ <para>如果您不知道这些信息,您可以询问系统管理员或是您的网络服务提供者。
+ 他们可能会说这些信息会由 <firstterm>DHCP</firstterm> 自动分配;如果这样的话,
+ 请记住这一点就可以了。</para>
+ </sect3>
+
+ <sect3>
+ <title>使用 Modem 连接</title>
+
+ <para>如果您由 ISP 提供的拨号服务上网,您仍然可以通过它安装 FreeBSD,
+ 只是会需要很长的时间。</para>
+
+ <para>您必须知道:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>拨号到 ISP 的电话号码。</para>
+ </listitem>
+
+ <listitem>
+ <para>您的 modem 是连接到哪个 COM 端口。</para>
+ </listitem>
+
+ <listitem>
+ <para>您拨号到 ISP 所用的账号和密码。</para>
+ </listitem>
+ </orderedlist>
+ </sect3>
+ </sect2>
+ <sect2>
+ <title>检查 FreeBSD 发行勘误</title>
+
+ <para>虽然我们尽力确保每个 FreeBSD 发行版本的稳定性,但偶尔也会有一些错误进入发行版。
+ 极少数情况下,这些问题甚至可能会影响安装。
+ 当发现和修正问题之后,它们会列在 FreeBSD 网站中的
+ <ulink url="http://www.FreeBSD.org/releases/&rel.current;R/errata.html">FreeBSD 发行勘误</ulink> 中。
+ 在您安装之前,应该首先看一看这份勘误表,以了解可能存在的问题。</para>
+
+ <para>虽然我们尽力使得每个 FreeBSD 释出版本都很稳定,但是过程中仍然不免有时
+ 会发现错误。在很罕见的情形下,这些错误会影响到安装过程。当我们发现这些
+ 错误并且修正后,会将它们列在 FreeBSD 网站的 <ulink url="http://www.freebsd.org/releases/&rel.current;R/errata.html">FreeBSD Errata(勘误表)</ulink>中, 在您安装FreeBSD前应该
+ 先看看勘误表中有没有什么问题会影响到您的安装。</para>
+
+ <para>关于所有释出版本的信息,包括勘误表,可以在
+ <ulink
+ url="&url.base;/index.html">FreeBSD 网站</ulink>的<ulink
+ url="&url.base;/releases/index.html">发行版信息</ulink> 一节中找到。</para>
+ </sect2>
+
+ <sect2>
+ <title>准备安装介质</title>
+
+ <para>FreeBSD 可以通过下面任何一种安装介质进行安装:</para>
+
+ <itemizedlist>
+ <title>安装介质</title>
+
+ <listitem>
+ <para>CDROM 或 DVD</para>
+ </listitem>
+
+ <listitem>
+ <para>在同一计算机上的 DOS 分区</para>
+ </listitem>
+
+ <listitem>
+ <para> SCSI 或 QIC 磁带</para>
+ </listitem>
+
+ <listitem>
+ <para>软盘</para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist>
+ <title>网络</title>
+
+ <listitem>
+ <para>通过防火墙的一个 FTP 站点,或使用 HTTP 代理。</para>
+ </listitem>
+
+ <listitem>
+ <para> NFS 服务器</para>
+ </listitem>
+
+ <listitem>
+ <para>一个指定的并行或串行接口</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您购买了 FreeBSD 的 CD 或 DVD,那么您可以直接进入下一节
+ <xref linkend="install-floppies">。</para>
+
+ <para>如果您还没有 FreeBSD 的安装文件,您应该回到
+ <xref linkend="install-diff-media"> 一节,
+ 它介绍了如何准备所需要的安装介质。之后,您就可以回到这一节,
+ 并从 <xref linkend="install-floppies"> 继续。</para>
+ </sect2>
+
+ <sect2 id="install-floppies">
+ <title>准备引导介质</title>
+
+ <para>FreeBSD 的安装过程开始于将您的电脑开机进入 FreeBSD 安装环境&mdash;-并非在
+ 其它的操作系统上运行一个程序。计算机通常使用安装在硬盘上的操作系统进行
+ 引导,也可以配置成使用一张<quote>bootable(可引导)</quote>的软盘进行启动。
+ 大多数现代计算机都可以从光驱进行引导系统。</para>
+
+ <tip>
+ <para>如果您有 FreeBSD 的安装光盘或 DVD(或者是您购买的,或者是您自己准备的。)
+ 并且您的计算机可以从光驱进行启动 (通常在 BIOS 中会有 <quote>Boot Order</quote>
+ 或类似的选项可以设置),那么您就可以跳过此小节。因为 FreeBSD 光盘及 DVD 光盘都是可
+ 以引导的,用它们开机您不用做什么特别的准备。</para>
+ </tip>
+
+ <para>一般来说,要建立安装盘(软盘)请依照下列步骤:</para>
+
+ <procedure>
+ <step>
+ <title>获取开机软盘映像文件</title>
+
+ <para>开机软盘映像文件可以在您的安装介质的
+ <filename>floppies/</filename> 目录下找到,
+ 另外您也可以从下述网站的 floppies 目录下载: <literal>ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/<replaceable>&lt;arch&gt;</replaceable>/<replaceable>&lt;version&gt;</replaceable>-RELEASE/floppies/</literal>.
+ 将 <replaceable>&lt;arch&gt;</replaceable> 和
+ <replaceable>&lt;version&gt;</replaceable>
+ 替换为您使用的计算机体系结构和希望安装的版本号。
+ 例如,用于安装 &i386; 上的
+ &os;&nbsp;&rel.current;-RELEASE 的文件的地址,
+ 应该是 <ulink url="ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/&rel.current;-RELEASE/floppies/"></ulink>。</para>
+
+ <para>软盘映像文件的扩展名为 <filename>.flp</filename>。在
+ <filename>floppies/</filename> 目录下包含了许多不同的映像文件,根据您
+ 要安装的 FreeBSD 版本有不同的映像文件;有时候不同的硬件也需要不同的映像
+ 文件, 在大部分的情形下,您需要两个文件: <filename>kern.flp</filename>
+ 和 <filename>mfsroot.flp</filename>。另处不同的系统可能需要额处的硬件
+ 驱动程序。这些驱动程序在 <filename>drivers.flp</filename> 映像文件里
+ 提供。查看同一目录下的 <filename>README.TXT</filename> 文件以获得最新
+ 的软盘映像文件信息。</para>
+
+ <important>
+ <para>您的 FTP 程序必须使用 <emphasis>二进制模式</emphasis> 来下载这些映
+ 像文件。有些浏览器只会用<emphasis>text</emphasis> (或<emphasis>ASCII
+ </emphasis>) 模式来传输数据,用这些浏览器下载的映像文件做成的软盘可
+ 能无法正常开机。</para>
+ </important>
+ </step>
+
+ <step>
+ <title>准备软盘</title>
+
+ <para>您必须为您下载的每一个映像文件准备一张软盘。并且请避免使用到坏掉的
+ 软盘。最简单的方式就是您先将这些软盘格式化,不要相信所谓的已格式化的软
+ 盘。在 &windows; 下的格式化程序不会告诉您出现多少坏块,它只是简单的标记它
+ 们为 <quote>bad</quote> 并且忽略它们。根据建议您应该使用全新的软盘来存放
+ 安装程序。</para>
+
+ <important>
+ <para>如果您在安装 FreeBSD 的过程中造成当机、冻结或是其它怪异现象,第一个
+ 要怀疑的就是引导软盘。请用其它的软盘制作映像文件再试试看。</para>
+ </important>
+ </step>
+
+ <step>
+ <title>将映像文件写入软盘中</title>
+
+ <para><filename>.flp</filename> 文件 <emphasis>并非</emphasis> 一般的文件,
+ 您不能直接将它们复制到软盘上。事实上它是一张包含完整磁盘内容的映像文件。这
+ 表示您 <emphasis>不能</emphasis> 简单的使用 DOS 的 copy 命令将文件写到软盘上,
+ 而必须使用特别的工具程序将映像文件直接写到软盘中。</para>
+
+ <indexterm><primary>DOS</primary></indexterm>
+ <para>如果您使用 &ms-dos; 或 &windows; 操作系统来制作引导盘,那么您可以使用我们提供
+ 的 <command>fdimage</command> 程序来将映像文件写到软盘中。</para>
+
+ <para>如果您使用的是光盘,假设光盘的驱动器符号为 <devicename>E:</devicename>,
+ 那么请执行下面的命令:</para>
+
+ <screen><prompt>E:\&gt;</prompt> <userinput>tools\fdimage floppies\kern.flp A:</userinput></screen>
+
+ <para>重复上述命令以完成每个 <filename>.flp</filename> 文件的写入,每换一个
+ 映像文件都必须更换软盘;制作好的软盘请注明是使用哪个映像文件做的。如果您的映
+ 像文件存放在不同的地方,请自行修改上面的指令指向您存放 <filename>.flp</filename>
+ 文件的地方。要是您没有 FreeBSD 光盘,您可以到 FreeBSD 的 FTP 站点<ulink url="ftp://ftp.FreeBSD.org/pub/FreeBSD/tools/"><filename class="directory">tools</filename>
+ 目录</ulink> 中下载。</para>
+
+ <para>如果您在 &unix; 系统上制作软盘(例如其它 FreeBSD 机器),您可以使用
+ &man.dd.1; 命令来将映像文件写到软盘中。如果您用 FreeBSD,可以执行下面的命令:
+ </para>
+
+ <screen>&prompt.root; <userinput>dd if=kern.flp of=/dev/fd0</userinput></screen>
+
+ <para>在 FreeBSD 中,<filename>/dev/fd0</filename> 指的是第一个软驱(即
+ <devicename>A:</devicename> 驱动器);<filename>/dev/fd1</filename> 是
+ <devicename>B:</devicename> 驱动器,依此类推。其它的 &unix; 系统可能会用
+ 不同的的名称,这时您就要查阅该系统的说明文件。</para>
+ </step>
+ </procedure>
+
+ <para>您现在可以安装 FreeBSD 了</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="install-start">
+ <title>开始安装</title>
+
+ <important>
+ <para>默认情况下, 安装过程并不会改变任何您硬盘中的数据,除非您看到
+ 下面的讯息:</para>
+
+ <literallayout class="monospaced">Last Chance: Are you SURE you want continue the installation?
+
+If you're running this on a disk with data you wish to save then WE
+STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
+
+We can take no responsibility for lost disk contents!</literallayout>
+
+ <para>在看到这最后的警告讯息前您都可以随时离开安装程序面不会变更您的硬盘。
+ 如果您发现有任何设定错误,这时您可以直接将电源关掉而不会造成任何伤害。</para>
+ </important>
+
+ <sect2 id="install-starting">
+ <title>开机启动</title>
+
+ <sect3 id="install-starting-i386">
+ <title>引导 &i386; 系统</title>
+
+ <procedure>
+ <step>
+ <para>从电脑尚未开机开始说起</para>
+ </step>
+
+ <step>
+ <para>将电脑电源打开。刚开始的时候它应该会显示进入系统设置菜单或 BIOS
+ 要按哪个键,常见的是 <keycap>F2</keycap>、<keycap>F10</keycap>、
+ <keycap>Del</keycap> 或 <keycombo action="simul">
+ <keycap>Alt</keycap>
+ <keycap>S</keycap>
+ </keycombo>。不论是要按哪个键,请按它进入 BIOS 设置画面。有时您的计算机
+ 可能会显示一个图形画面,典型的做法是按 <keycap>Esc</keycap> 将关掉这个图形
+ 画面,以使您能够看到必要的设置信息。</para>
+ </step>
+
+ <step>
+ <para>找到设置开机顺序的选项,它的标记为 <quote>Boot Order</quote>
+ 通常会列出一些设备让您选择,例如:<literal>Floppy</literal>、
+ <literal>CDROM</literal>、<literal>First Hard Disk</literal> 等等。</para>
+
+ <para>如果您要用软盘安装,请确定选到 floppy disk;如果您要用光盘安装,
+ 请选择 CDROM。为了避免疑惑,请参考您的主板说明手册。</para>
+
+ <para>储存设定并离开,系统应该会重新启动。</para>
+ </step>
+
+ <step>
+ <para>如果您用软盘安装,请将在 <xref linkend="install-floppies">
+ 一节中制作好的第一张引导盘,里面包含<filename>kern.flp</filename>
+ 文件的那张盘,放入软盘驱动器中。</para>
+
+ <para>如果您是从光盘安装,那么开机后请将 FreeBSD 光盘放入光驱中。</para>
+
+ <para>如果您开机后如往常一样并没有从软盘或光盘引导,请检查:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>是不是软盘或光盘太晚放入面错失开机引导时间。如果是,请将它们
+ 放入后重新开机。</para>
+ </listitem>
+
+ <listitem>
+ <para>BIOS 设定不对,请重新检查 BIOS 的设定。</para>
+ </listitem>
+
+ <listitem>
+ <para>您的 BIOS 不支持从这些安装介质引导。</para>
+ </listitem>
+ </orderedlist>
+ </step>
+
+ <step>
+ <para>FreeBSD 即将启动。如果您是从光盘引导,您会见到类似下面的画面:</para>
+
+ <screen>Verifying DMI Pool Data ........
+Boot from ATAPI CD-ROM :
+ 1. FD 2.88MB System Type-(00)
+Uncompressing ... done
+
+BTX loader 1.00 BTX version is 1.01
+Console: internal video/keyboard
+BIOS drive A: is disk0
+BIOS drive B: is disk1
+BIOS drive C: is disk2
+BIOS drive D: is disk3
+BIOS 639kB/261120kB available memory
+
+FreeBSD/i386 bootstrap loader, Revision 0.8
+
+/kernel text=0x277391 data=0x3268c+0x332a8 |
+
+|
+Hit [Enter] to boot immediately, or any other key for command prompt.
+Booting [kernel] in 9 seconds... _</screen>
+
+ <para>如果您是从软盘引导,会看到类似下面的画画:</para>
+
+ <screen>Verifying DMI Pool Data ........
+
+BTX loader 1.00 BTX version is 1.01
+Console: internal video/keyboard
+BIOS drive A: is disk0
+BIOS drive C: is disk1
+BIOS 639kB/261120kB available memory
+
+FreeBSD/i386 bootstrap loader, Revision 0.8
+
+/kernel text=0x277391 data=0x3268c+0x332a8 |
+
+Please insert MFS root floppy and press enter:</screen>
+
+ <para>按照指示,将<filename>kern.flp</filename> 软盘取出,放入
+ <filename>mfsroot.flp</filename> 软盘,然后按<keycap>Enter</keycap>。</para>
+ </step>
+
+ <step>
+ <para>不论是从软盘或光盘引导,您都会看到下面这段信息:</para>
+
+ <screen>Hit [Enter] to boot immediately, or any other key for command prompt.
+Booting [kernel] in 9 seconds... _</screen>
+
+ <para>您可以等待10秒或是按 <keycap>Enter</keycap> 键跳过。之后就会进入内核
+ 配置菜单。</para>
+ </step>
+ </procedure>
+
+ </sect3>
+ <sect3>
+ <title>引导 Alpha 系统</title>
+
+ <indexterm><primary>Alpha</primary></indexterm>
+
+ <procedure>
+ <step>
+ <para>从电脑尚未打开电源开始。</para>
+ </step>
+
+ <step>
+ <para>找开电脑电源并等待屏幕上出现开机提示信息。</para>
+ </step>
+
+ <step>
+ <para>如您需要准备安装软盘,请参考<xref linkend="install-floppies"> 。
+ 将用 <filename>kern.flp</filename> 做的引导盘放入软驱中然后输入下列命令
+ (请视实际情况修改命令中的软驱盘符):</para>
+
+ <screen>&gt;&gt;&gt;<userinput>BOOT DVA0 -FLAGS '' -FILE ''</userinput></screen>
+
+ <para>如果您要从光盘引导,请将光盘放入光驱中然后输入下列命令开始安装
+ (请视情况修改命令中的光驱盘符):</para>
+
+ <screen>&gt;&gt;&gt;<userinput>BOOT DKA0 -FLAGS '' -FILE ''</userinput></screen>
+ </step>
+
+ <step>
+ <para>然后 FreeBSD 就会启动。如果您从软盘引导,到某个阶段您会看到下面的信息:</para>
+
+ <screen>Please insert MFS root floppy and press enter:</screen>
+
+ <para>按照屏幕指示,将 <filename>kern.flp</filename> 软盘取出,换上
+ <filename>mfsroot.flp</filename> 然后按<keycap>Enter</keycap>键。</para>
+ </step>
+
+ <step>
+ <para>不论从软盘或光盘引导,您都会看到下面这段信息:</para>
+
+ <screen>Hit [Enter] to boot immediately, or any other key for command prompt.
+Booting [kernel] in 9 seconds... _</screen>
+
+ <para>您可以等待 10 秒或是按 <keycap>Enter</keycap> 跳过。之后就会进入内核
+ 设定菜单。</para>
+ </step>
+ </procedure>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="start-userconfig">
+ <title>配置内核</title>
+
+ <note><para>从FreeBSD 5.0 版以后, 用户配置已经不赞成使用新的 &man.device.hints.5;
+ 方法,更多的信息 &man.device.hints.5; 请访问 <xref linkend="device-hints">
+ </para></note>
+
+ <para><firstterm>内核</firstterm>是操作系统最核心的部分。它负责很多工作,
+ 包括存取系统上所有设备,如硬盘、网卡、声卡等等。每一个 FreeBSD
+ 核心支持的设备都有其相对应的驱动程序。这些驱动程序的名称由两个或三个字母级成,譬如:
+ <devicename>sa</devicename> 表示 SCSI 存取驱动程序;<devicename>sio</devicename>
+ 表示串口 I/O 驱动程序(管理 COM 端口)。</para>
+
+ <para>当内核启动的时候,每个驱动程序会检查系统中是否有它所支持的设备。如果找到的话,
+ 这些驱动程序就会配置这些设备的状态以代核心使用。</para>
+
+ <para>上述设备的检查我们称做 <firstterm>device probing(设备探测)</firstterm>。
+ 但是很不幸地,这样做并不是完全安全的。因为有些硬件驱动程序没有办法想到共存,
+ 有时找到这个设备却让另一个设备处在不稳定的状态。这是 <acronym>PC</acronym>
+ 设计上的限制。</para>
+
+ <para>许多早期的称作 ISA 的设备&mdash;(相对于 PCI 设备而言)。ISA
+ 设备的规格需要将硬件的某些数据写死在设备上,最具代表性的就是中断号(IRQ)以及
+ IO 端口号。这些设定值通常是通过改变设备上的 <firstterm>jumpers(跳线)</firstterm>,
+ 或是使用由厂商提供的 DOS 工具程序来改变。</para>
+
+ <para>这通常是问题的所在,因为这没办法让两个设备共同分享一个 IRQ 或是 IO 端口
+ 地址。</para>
+
+ <para>新的设备都按照 PCI 规格设计,这些设备就没有上述限制;它们会参考 BIOS
+ 中的设定然后动态分配 IRQ 及 IO 端口地址。</para>
+
+ <para>如果您的系统中有任何 ISA 设备,那么在设置 FreeBSD 驱动程序的时候您就
+ 必须指定这些设备的 IRQ 及 IO 地址。这也是我们在 <xref
+ linkend="install-inventory">一节中希望您先准备一份设备清单的用意。</para>
+
+ <para>仍然很不幸地,预设给某些设备使用的 IRQ 会跟内存地址互相冲突。这是因为
+ 有些 ISA 设备出厂的设定值就会跟其它的设备冲突。撇开这个不谈,FreeBSD 驱动
+ 程序通常都会根据各制造商设备的出厂设定值来设定,这也是为什么许多设备可
+ 以在 FreeBSD 顺利驱动的原因。</para>
+
+ <para>在跑 FreeBSD 的时候根本不会有上冲突的问题,因为当两个设备互相冲突的
+ 时候,其中一个设备将被停用(不论您用的是哪种操作系统)。</para>
+
+ <para>通常在第一次安装 FreeBSD 的时候才会有问题,因为内核希望尽是多包含一
+ 些驱动程序,这样才能支持许多不同设备的配置。这意味着在找到的这些设备中
+ 有可能设定值会互相冲突。FreeBSD 在探测系统设备的时候会按照一的顺序,如
+ 果您的某个设备在较后面探测到,但是跟前面找到的设备设定冲突,那么在安装
+ FreeBSD 的时候,这个设备不一定能正确雇用。</para>
+
+ <para>因为如此,当您在安装 FreeBSD 前,可以先看看在系统内核中包含了哪些驱
+ 动程序,如果您没有某些设备,则可以将它们的驱动程序删除或是在稍后您也
+ 可以确认您有的设备的设定值有没有问题。</para>
+
+ <para>这听起来好像很复杂,但不全然如此。</para>
+
+ <para><xref linkend="kernel-config"> 显示的是内核能设置的第一个配置菜单。
+ 我们推荐您选择<guimenuitem>Start kernel configuration in full-screen visual
+ mode</guimenuitem> 选项, 因为这对新手来说比较容易。</para>
+
+ <figure id="kernel-config">
+ <title>内核配置菜单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/userconfig" format="PNG">
+ </imageobject>
+
+ <textobject>
+ <screen>&txt.install.userconfig;</screen>
+ </textobject>
+ </mediaobject>
+ </figure>
+
+ <para>内核配置画面 (图<xref linkend="fig-userconfig">)
+ 被分成四个部分:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>在<quote>active(可用)</quote>区域的展开式选择菜单分为四个群,例如
+ <literal>Storage(储存设备)</literal>、 <literal>Network(网络设备)</literal>。
+ 每个设备会显示一个对应的说明、由二或三个字母组成的驱动程序名称以及驱动程序
+ 所使用的IRQ和内存地址。另外,如果可用的驱动程序跟另一个可用的驱动程序有冲突,
+ 它们的驱动程序名称之后会显示 <literal>CONF</literal> 字样。同时栏目标题也会
+ 显示在可用的设备中总共有几个设备有冲突。</para>
+ </listitem>
+
+ <listitem>
+ <para>在 Inactive(停用)区域的驱动程序仍然保留在内核中,但当内核启动的时候
+ 并不会探测这些设备。这个区域的分组方式跟可用区一样。</para>
+ </listitem>
+
+ <listitem>
+ <para>第三区(信息显示区)显示的是目前所选择设备的细节项目设置,包括 IRQ 及
+ IO 端口地址。</para>
+ </listitem>
+
+ <listitem>
+ <para>第四区告诉您这个画面的操作按键。</para>
+ </listitem>
+ </orderedlist>
+
+ <figure id="fig-userconfig">
+ <title>配置内核可视化视觉接口</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/userconfig2" format="PNG">
+ </imageobject>
+
+ <textobject>
+ <screen>&txt.install.userconfig2;</screen>
+ </textobject>
+ </mediaobject>
+ </figure>
+
+ <para>在这个阶段,您总是会看到有冲突的设备被列出。请不要担心,因为这是正
+ 常的;前面提到在安装的时候所有的设备都会被启用,而其中的某些设备就会跟
+ 其它的设备产生冲突。</para>
+
+ <para>现在您必须逐一检查这些设备驱动程序,然后解决冲突的问题。</para>
+
+ <procedure>
+ <title>解决驱动程序冲突</title>
+
+ <step>
+ <para>按下 <keycap>X</keycap> 键可以将所选择区域的驱动程序完全展开以方便您
+ 检阅。您可以使用方向键在可用设备区前后移动。</para>
+
+ <para><xref linkend="hardware-conflicts"> 显示按下 <keycap>X</keycap> 键
+ 后的结果。 </para>
+
+ <figure id="hardware-conflicts">
+ <title>展开驱动程序清单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/hdwrconf" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </step>
+
+ <step>
+ <para>停用任何您没有的设备的驱动程序。要停用一个设备,用方向键移动将该
+ 设备反白然后按下 <keycap>Del</keycap> 键,则此设备驱动程序就会被移到
+ <literal>Inactive Drivers(停用设备区)</literal> 列表。</para>
+
+ <para>如果您不小心将一个设备停用,那么请按 <keycap>Tab</keycap> 切换到
+ <literal>Inactive Drivers</literal> 区, 选择被停用的设备,然后按下
+ <keycap>Enter</keycap> 键将它移回可用设备区。</para>
+
+ <warning>
+ <para>请不要移除 <devicename>sc0</devicename>。这个驱动程序是控制屏幕
+ 用的,除非您是通过串行线进行安装,否则请不要移除它。</para>
+ </warning>
+
+ <warning>
+ <para>如果您用的是 USB 键盘才可以停用 <devicename>atkbd0</devicename> 用一般
+ 的键盘请保留此 <devicename>atkbd0</devicename> 设备驱动程序。</para>
+ </warning>
+ </step>
+
+ <step>
+ <para>如果现在显示没有冲突,那么您可以跳过这一步骤。否则,剩下的冲突还是必
+ 须解决。如果在信息显示区没有看到 <quote>allowed conflict(允许冲突)</quote>,
+ 那么您必须改变这边显示的 IRQ 及内存地址, <emphasis>或</emphasis> 必须变更设备
+ 上面的 IRQ 及内存地址。</para>
+
+ <para>要改变设备驱动程序的 IRQ 及 IO 端口地址,选择要变更的驱动程序然后
+ 按 <keycap>Enter</keycap> 键。之后等光标移到第三区(信息显示区)时候您就
+ 可以理发这些设置。您应该输入之前做硬件清单列表的时候所记录的 IRQ 及 IO 端
+ 口地址。要完成更改请按 <keycap>Q</keycap> 键并回到可用设备区。</para>
+
+ <para>如果您不确定该设定什么值,那么可以试试看 <literal>-1</literal>。
+ 有些 FreeBSD 驱动程序在搜寻设备的时候可以安全找出设备的正确设定值;所以这里设置
+ <literal>-1</literal> 就是告诉这些驱动程序自行去尝试找出合适的设置。</para>
+
+ <para>如果要直接在设备硬件上改变设定值,设定的方法每种设备都不大相同。有些
+ 设备您必须将它从电脑中拆下来然后调整路线或是DIP开关;其它的可能厂商会提供 DOS
+ 工具软盘,里面有程序可以更改这些设定。不论是哪一种方式,您都应该参考设备所附
+ 的使用手册。很明显地,改变这些设定值必须重新开机后才会生效,所以您必须重新进
+ 入 FreeBSD 安装程序。</para>
+ </step>
+
+ <step>
+ <para>当所有的冲突都解决了以后,您会看到类似<xref linkend="userconfig-done">
+ 的画面。</para>
+
+ <figure id="userconfig-done">
+ <title>没有冲突的设备驱动程序状态画面</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/probstart" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>如您所见,可用设备列表变得干净多了,只列出您系统中有的设备。</para>
+
+ <para>现在您可以储存所做的改变,然后进到下一个安装步骤。按 <keycap>Q</keycap>
+ 键离开设备配置界面,您会看到下面的信息:</para>
+
+ <screen>Save these parameters before exiting? ([Y]es/[N]o/[C]ancel)</screen>
+
+ <para>回答 <keycap>Y</keycap> 保存配置到内存(安装完成后将后保存到磁盘)然后开始
+ 探测设备。在设备探测完毕后,<application>sysinstall</application> 就会启动并且显
+ 示它的主界面。(<xref linkend="sysinstall-main">)。</para>
+
+ <figure id="sysinstall-main">
+ <title>Sysinstall 主界面</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/main1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2 id="view-probe">
+ <title>查看设备探测的结果</title>
+
+ <para>前面屏幕显示的最后几百行字会存在缓冲区中以便您查阅。</para>
+
+ <para>要浏览缓冲区,您可以按下 <keycap>Scroll Lock</keycap> 键,这会开启画面的
+ 卷动功能。然后您就可以使用方向键或 <keycap>PageUp</keycap> 、<keycap>PageDown
+ </keycap> 键来上下翻阅。再按一次 <keycap>Scroll Lock</keycap> 键将停止画面卷动。</para>
+
+ <para>在您浏览的时候会看到类似 <xref linkend="install-dev-probe">的画面。
+ 真正的结果依照您的电脑装置而有所不同。</para>
+
+ <figure id="install-dev-probe">
+ <title>典型的设备探测结果</title>
+
+ <screen>avail memory = 253050880 (247120K bytes)
+Preloaded elf kernel "kernel" at 0xc0817000.
+Preloaded mfs_root "/mfsroot" at 0xc0817084.
+md0: Preloaded image &lt;/mfsroot&gt; 4423680 bytes at 0xc03ddcd4
+
+md1: Malloc disk
+Using $PIR table, 4 entries at 0xc00fde60
+npx0: &lt;math processor&gt; on motherboard
+npx0: INT 16 interface
+pcib0: &lt;Host to PCI bridge&gt; on motherboard
+pci0: &lt;PCI bus&gt; on pcib0
+pcib1:&lt;VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge&gt; at device 1.0 on pci0
+pci1: &lt;PCI bus&gt; on pcib1
+pci1: &lt;Matrox MGA G200 AGP graphics accelerator&gt; at 0.0 irq 11
+isab0: &lt;VIA 82C586 PCI-ISA bridge&gt; at device 7.0 on pci0
+isa0: &lt;iSA bus&gt; on isab0
+atapci0: &lt;VIA 82C586 ATA33 controller&gt; port 0xe000-0xe00f at device 7.1 on pci0
+ata0: at 0x1f0 irq 14 on atapci0
+ata1: at 0x170 irq 15 on atapci0
+uhci0 &lt;VIA 83C572 USB controller&gt; port 0xe400-0xe41f irq 10 at device 7.2 on pci
+0
+usb0: &lt;VIA 83572 USB controller&gt; on uhci0
+usb0: USB revision 1.0
+uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr1
+uhub0: 2 ports with 2 removable, self powered
+pci0: &lt;unknown card&gt; (vendor=0x1106, dev=0x3040) at 7.3
+dc0: &lt;ADMtek AN985 10/100BaseTX&gt; port 0xe800-0xe8ff mem 0xdb000000-0xeb0003ff ir
+q 11 at device 8.0 on pci0
+dc0: Ethernet address: 00:04:5a:74:6b:b5
+miibus0: &lt;MII bus&gt; on dc0
+ukphy0: &lt;Generic IEEE 802.3u media interface&gt; on miibus0
+ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
+ed0: &lt;NE2000 PCI Ethernet (RealTek 8029)&gt; port 0xec00-0xec1f irq 9 at device 10.
+0 on pci0
+ed0 address 52:54:05:de:73:1b, type NE2000 (16 bit)
+isa0: too many dependant configs (8)
+isa0: unexpected small tag 14
+orm0: &lt;Option ROM&gt; at iomem 0xc0000-0xc7fff on isa0
+fdc0: &lt;NEC 72065B or clone&gt; at port 0x3f0-0x3f5,0x3f7 irq 6 drq2 on isa0
+fdc0: FIFO enabled, 8 bytes threshold
+fd0: &lt;1440-KB 3.5" drive&gt; on fdc0 drive 0
+atkbdc0: &lt;Keyboard controller (i8042)&gt; at port 0x60,0x64 on isa0
+atkbd0: &lt;AT Keyboard&gt; flags 0x1 irq1 on atkbdc0
+kbd0 at atkbd0
+psm0: &lt;PS/2 Mouse&gt; irq 12 on atkbdc0
+psm0: model Generic PS/@ mouse, device ID 0
+vga0: &lt;Generic ISA VGA&gt; at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
+sc0: &lt;System console&gt; at flags 0x100 on isa0
+sc0: VGA &lt;16 virtual consoles, flags=0x300&gt;
+sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
+sio0: type 16550A
+sio1 at port 0x2f8-0x2ff irq 3 on isa0
+sio1: type 16550A
+ppc0: &lt;Parallel port&gt; at port 0x378-0x37f irq 7 on isa0
+pppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
+ppc0: FIFO with 16/16/15 bytes threshold
+plip0: &lt;PLIP network interface&gt; on ppbus0
+ad0: 8063MB &lt;IBM-DHEA-38451&gt; [16383/16/63] at ata0-master UDMA33
+acd0: CD-RW &lt;LITE-ON LTR-1210B&gt; at ata1-slave PIO4
+Mounting root from ufs:/dev/md0c
+/stand/sysinstall running as init on vty0</screen>
+ </figure>
+
+ <para>仔细检查探测结果以确定 FreeBSD 找到所有您期望出现的设备。如果设备没有
+ 探测到,那么就不会列出。如果此设备需要设定 IRQ 以及 IO 端口地址,请您再确定
+ 是否设定的正确。</para>
+
+ <para>如果您需要改变某些设备的设置,您可以很容易地退出 <application>sysinstall
+ </application> 程序,然后从头重新来过。这也有助您熟悉这些过程。</para>
+
+ <figure id="sysinstall-exit">
+ <title>选择离开 Sysinstall</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/sysinstall-exit" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>在主界面使用方向键选择 <guimenuitem>Exit Install</guimenuitem> 您会看到
+ 如下的信息:</para>
+
+
+ <screen> User Confirmation Requested
+ Are you sure you wish to exit? The system will reboot
+ (be sure to remove any floppies from the drives).
+
+ [ Yes ] No</screen>
+
+ <para>如果 CDROM 还留在光驱里,而且选择了
+ &gui.yes;, 则安装程序将重新启动。</para>
+
+ <para>如果您是从软盘启动,那么重新开机前您必须将 <filename>mfsroot.flp</filename>
+ 软盘取出再换上 <filename>kern.flp</filename> 软盘。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="using-sysinstall">
+ <title>介绍 Sysinstall</title>
+
+ <para><application>sysinstall</application> 是 FreeBSD 项目所提供的安装程序。
+ 它以 console(控制台)为主,分为向个菜单及画面让您配置及控制安装过程。</para>
+
+ <para><application>sysinstall</application> 菜单画面由方向键、<keycap>Enter
+ </keycap>、 <keycap>Space</keycap>、以及其它按键所控制。在主画面的 Usage 菜单
+ 有这些按键的说明。</para>
+
+ <para>要查看这些说明,请将光标移到 <guimenuitem>Usage</guimenuitem> 项目,然后
+ <guibutton>[Select]</guibutton> 按键被选择,<xref linkend="sysinstall-main3">,
+ 然后按下 <keycap>Enter</keycap> 键。</para>
+
+ <para>安装画面的使用说明会显示出来,阅读完毕请按 <keycap>Enter</keycap> 键回到主
+ 画面。</para>
+
+ <figure id="sysinstall-main3">
+ <title>选取 Sysinstall 主菜单的 Usage 项目</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/main1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <sect2 id="select-doc">
+ <title>选择 Documentation(说明文件) 菜单</title>
+
+ <para>用方向键从主菜单选择 <guimenuitem>Doc</guimenuitem> 条目然后按
+ <keycap>Enter</keycap>键。</para>
+
+ <figure id="main-doc">
+ <title>选择说明文件菜单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/main-doc" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>这将会进入说明文件菜单。</para>
+
+ <figure id="docmenu1">
+ <title>Sysinstall 说明文件菜单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/docmenu1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>阅读这些说明文件很重要。</para>
+
+ <para>要阅读一篇文章,请用方向键选取要阅读的文章然后按 <keycap>Enter</keycap> 键。
+ 阅读中再按一下 <keycap>Enter</keycap> 就会回到说明文件画面。</para>
+
+ <para>若要回到主菜单,用方向键选择 <guimenuitem>Exit</guimenuitem> 然后按下
+ <keycap>Enter</keycap> 键。</para>
+ </sect2>
+
+ <sect2 id="keymap">
+ <title>选择键盘对应(Keymap)菜单</title>
+
+ <para>如果要改变键盘按键的对应方式,请在主菜单选取 <guimenuitem>Keymap</guimenuitem>
+ 然后按 <keycap>Enter</keycap> 键。一般情况下不改变引项,除非您使用了非标准键盘或非
+ 美国键盘。</para>
+
+ <figure id="sysinstall-keymap">
+ <title>Sysinstall 主菜单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/main-keymap" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>您可以使用上下键移动到您想使用的键盘对应方式,然后按下 <keycap>Space</keycap>
+ 键以选取它;再按 <keycap>Space</keycap> 键可以取消选取。当您完成后,请选择 &gui.ok;
+ 然后按 <keycap>Enter</keycap> 键。</para>
+
+ <para>这一屏幕只显示出部分列表。选择 &gui.cancel; 按 <keycap>Tab</keycap> 键将使用
+ 默认的键盘对应,并返回到主菜单</para>
+
+ <figure id="sysinstall-keymap-menu">
+ <title>Sysinstall 键盘对应菜单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/keymap" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ </sect2>
+
+ <sect2 id="viewsetoptions">
+ <title>安装选项设置画面</title>
+
+ <para>选择 <guimenuitem>Options</guimenuitem> 然后按 <keycap>Enter</keycap> 键。</para>
+
+ <figure id="sysinstall-options">
+ <title>Sysinstall 主菜单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/main-options" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <figure id="options">
+ <title>Sysinstall 选项设置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/options" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>预设值通常可以适用于大部分的使用者,您并不需要改变它们。版本名称要
+ 根据安装的版本进行变化。</para>
+
+ <para>目前选择项目的描述会在屏幕下方以蓝底白字显示。注意其中有一个项目是
+ <guimenuitem>Use Defaults(使用默认值)</guimenuitem>您可以由此项将所有的
+ 设定还原为预设值。</para>
+
+ <para>可以按下 <keycap>F1</keycap> 来阅读各选项的说明。</para>
+
+ <para>按 <keycap>Q</keycap> 键可以回到主画面。</para>
+ </sect2>
+
+ <sect2 id="start-install">
+ <title>开始进行标准安装</title>
+
+ <para><guimenuitem>Standard(标准)</guimenuitem> 安装适用于那些 &unix; 或
+ FreeBSD 的初级使用者。用方向键选择 <guimenuitem>Standard</guimenuitem> 然后按
+ <keycap>Enter</keycap> 键可开始进入标准安装。</para>
+
+ <figure id="sysinstall-standard">
+ <title>开始进行标准安装</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/main-std" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </sect2>
+ </sect1>
+
+ <sect1 id="install-steps">
+ <title>分配磁盘空间</title>
+
+ <para>您的第一个工作就是要分配 FreeBSD 用的硬盘空间以便 <application>sysinstall
+ </application> 先做好一些准备。为了完成这个工作,您必须先对 FreeBSD 如何找到
+ 磁盘信息做一个了解。</para>
+
+ <sect2 id="install-drive-bios-numbering">
+ <title>BIOS 磁盘编号</title>
+
+ <para>当您在系统上安装配置 FreeBSD 之前,有一个重要的事情一定要注意,尤其
+ 是当您有多个硬盘的时候。</para>
+
+ <indexterm><primary>DOS</primary></indexterm>
+ <indexterm><primary>Microsoft Windows</primary></indexterm>
+ <para>在 pc 架构,当您跑像 &ms-dos; 或 &microsoft.windows; 这种跟 BIOS 相关的操作
+ 系统的时候,BIOS 有能力改变正常的磁盘顺序,然后这些操作系统会跟着 BIOS 做改变。
+ 这让使用者不一定非要有所谓的 <quote>primary master</quote> 硬盘开机。许多人发
+ 现最简单而便宜备份系统的方式就是再去买一块一模一样的硬盘,然后定期将数据从第
+ 一块硬盘复制到第二个硬盘,使用
+ <application><trademark class="registered">Ghost</trademark></application> 或
+ <application>XCOPY</application>。所以,当第一个硬盘死了,或者是被病毒破坏,
+ 或者有坏轨道,他们可以调整 BIOS 中的开机顺序而直接用第二块硬盘开机。这跟将机壳
+ 拆开,把第二块硬盘跟第一块硬盘对调(要调jumper)有同样的效果,差别就是不用拆壳;
+ 因此,对有这方面需求的人而言,直接在 BIOS 中设定非常方便。</para>
+
+ <indexterm><primary>SCSI</primary></indexterm>
+ <indexterm><primary>BIOS</primary></indexterm>
+ <para>比较昂贵,配有 SCSI 控制卡的系统通常可以延伸 BIOS 的功能来让 SCSI 设备(可达七个)
+ 达到类似改变顺序的功能。</para>
+
+ <para>习惯于使用这种方式的使用者可能会感到惊讶,因为在 FreeBSD 中并非如此。
+ FreeBSD 不会参考 BIOS,而且也不知道所谓的 <quote>BIOS 逻辑磁盘对应</quote>。
+ 是怎么回事。这会让人感觉很疑惑,明明就是一样的硬盘而且资料也完全从另一块
+ 复制过来的,结果却没办法像以前那样用。</para>
+
+ <para>当使用 FreeBSD 以前,请将 BIOS 中的硬盘开机顺序调回正常的顺序,并且以后
+ 不要再改变。如果您仍然需要交换硬盘,那请用硬件的方式,打开机壳,调整调线。</para>
+
+ <sidebar>
+ <title>范例:Bill 和 Fred 的安装历险</title>
+
+ <para>Bill 替 Fred 把旧的 Wintel 的机器装上了 FreeBSD。他装了一台 SCSI 硬盘,
+ ID 是 0,然后把 FreeBSD 装在上面。</para>
+
+ <para>Fred 开始使用他新的 FreeBSD 系统;但是过了几天,他发现这旧的 SCSI
+ 硬盘发生了许多小问题。之后,他就跟 Bill 说起这件事。</para>
+
+ <para>又过了几天,Bill 决定是该解决问题的时候了,所以他从后面房间的硬盘
+ <quote>收藏</quote> 中找出了一个一模一样的硬盘,并且经过表面测试后显示这块
+ 硬盘没有问题。因此,Bill 将它的 ID 调成 4,然后安装到 Fred 的机器,并且将资料从
+ 磁盘 0 复制到磁盘 4。现在新硬盘装好了,而且看起来好像一切正常;所以,Bill 认为
+ 现在应该可以开始用它了。Bill 于是到 SCSI BIOS 中设定 SCSI ID 4 为开机盘,用磁盘 4
+ 重新开机后,一切跑得很顺利。</para>
+
+ <para>继续用了几天后,Bill 跟 Fred 决定要来玩点新的:该将 FreeBSD 升级了。Bill
+ 将 ID 0 的硬盘移除(因为有问题)并且又从收藏区中拿了一块一样的硬盘来。然后他
+ 用 Fred 神奇的网络 FTP 磁盘将新版的 FreeBSD 安装在这块硬盘上;安装过程没什么问
+ 题发生。</para>
+
+ <para>Fred 用了这新版本几天后,觉得它很适合用在工程部门…是时候将以前放在旧
+ 系统的工作资料复制过来了。因此,Fred 将 ID4 的 SCSI 硬盘(里面有放着旧系统中复制
+ 过来的最新资料)mount 起来,结果竟然发现在 ID4 的硬盘上,他以前的所有资料都不见
+ 了!</para>
+
+ <para>资料跑到哪里去了呢?</para>
+
+ <para>当初 Bill 将 ID0 硬盘的资料复制到 ID4 的时候,ID4 即成为一个<quote>新的副本
+ </quote>。而当他调 SCSI BIOS 设定 ID4 为开机盘,想让系统从 ID4 开机,这其实只是他
+ 自己笨,因为大部分的系统可以直接调 BIOS 而改变开机顺序,但是 FreeBSD 却会把开机
+ 顺序还原成正常的模式,因此,Fred 的 FreeBSD 还是从原来那块 ID0 的硬盘开机的。所有
+ 的资料都还在那块硬盘上,而不是在想象之中的 ID4 硬盘。</para>
+
+ <para>我们很高兴在我们发现这件事的时候那些资料都还在,我们把资料从最早的
+ 那块 ID0 硬盘取出来并交还给 Fred,而且 Bill 也从此了解o的重要…</para>
+
+ <para>虽然我们这里的例子使用 SCSI 硬盘,但是相同的概念也可以套用在 IDE 硬盘上。</para>
+ </sidebar>
+ </sect2>
+
+ <sect2 id="main-fdisk">
+ <title>使用 FDisk 创建分区</title>
+
+ <note>
+ <para>如果不再做改变,数据将会写进硬盘。如果您犯了一个错误想重新开始,请选择
+ <application>sysinstall</application> 安装程序的退出按钮(exit)。或按
+ <keycap>U</keycap> 键来 <guimenuitem>Undo</guimenuitem> 操作。如果您的操作没有结果,您总可以重新启动您
+ 的计算机来达到您的目的。</para>
+ </note>
+
+ <para>当您在 <application>sysinstall</application> 主菜单选择使用标准安装
+ 后,您会看到下面的信息:</para>
+
+ <screen> Message
+ In the next menu, you will need to set up a DOS-style ("fdisk")
+ partitioning scheme for your hard disk. If you simply wish to devote
+ all disk space to FreeBSD (overwriting anything else that might be on
+ the disk(s) selected) then use the (A)ll command to select the default
+ partitioning scheme followed by a (Q)uit. If you wish to allocate only
+ free space to FreeBSD, move to a partition marked "unused" and use the
+ (C)reate command.
+ [ OK ]
+
+ [ Press enter or space ]</screen>
+
+ <para>如屏幕指示,按 <keycap>Enter</keycap> 键,然后您就会看到一个列表
+ 列出所有在探测设备的时候找到的硬盘。<xref linkend="sysinstall-fdisk-drive1">
+ 范例显示的是有找到两个 IDE 硬盘的情形,这两个硬盘分别为
+ <devicename>ad0</devicename> 和 <devicename>ad2</devicename>。</para>
+
+ <figure id="sysinstall-fdisk-drive1">
+ <title>选择要分区的硬盘</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/fdisk-drive1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>您可能正在奇怪,为什么 <devicename>ad1</devicename> 没有列出来?
+ 为什么遗失了呢?</para>
+
+ <para>试想,如果您有两个 IDE 硬盘,一个是在第一个 Primary master,一个是
+ Secondary master,这样会发生什么事呢?如果 FreeBSD 依照找到的顺序来为他们
+ 命名,如 <devicename>ad0</devicename> 和<devicename>ad1</devicename>
+ 那么就不会有什么问题。</para>
+
+ <para>但是,现在问题来了。如果您现在想在 primary slave 加装第三个硬盘,
+ 那么这个硬盘的名称就会是 <devicename>ad1</devicename>,之前的
+ <devicename>ad1</devicename> 就会变成<devicename>ad2</devicename>。
+ 这会造成什么问题呢?因为设备的名称(如<devicename>ad1s1a</devicename>)
+ 是用来寻找文件系统的,因此您可能会发现,突然,您有些文件系统从此无法正确
+ 地显示出来,必须修改 FreeBSD 配置文件(译注:/etc/fstab)才可以正确显示。</para>
+
+ <para>为了解决这些问题,在配置内核的时候可以叫 FreeBSD 直接用 IDE 设备所
+ 在的位置来命名,而不是要据的到的顺序。使用这种方式的话,在 secondary master
+ 的 IDE 设备就 <emphasis>永远是</emphasis> <devicename>ad2</devicename>,
+ 即使您的系统中没有<devicename>ad0</devicename> 或 <devicename>ad1</devicename>
+ 也不受影响。</para>
+
+ <para>此为 FreeBSD 内核的默认值,这也是为什么上面的画面只显示
+ <devicename>ad0</devicename> 和 <devicename>ad2</devicename>的原因。
+ 画面上这台机器的两颗硬盘是装在 primary 及 secondary 的 master 上面;并没有任何一个
+ 硬盘安装在 slave 插槽上。</para>
+
+ <para>您应该选择您想安装 FreeBSD 的硬盘,然后按下 &gui.ok;。之后
+ <application>FDisk</application> 就会开始,您会看到类似
+ <xref linkend="sysinstall-fdisk1">的画面。</para>
+
+ <para><application>FDisk</application> 的显示画面分为三个部分。</para>
+
+ <para>第一部分是画面上最上面两行,显示的是目前所选择的硬盘的信息。包含它的
+ FreeBSD 名称、硬盘分布以及硬盘的总容量。</para>
+
+ <para>第二部分显示的是目前选择的硬盘上有哪些分区,每个分区的开始及结束位置、
+ 所占容量、FreeBSD 名称、它们的描述以及类别(sub-type)。此范例显示有两个分区、
+ 一个大的 <acronym>FAT</acronym> 分区,(很可能是 &ms-dos; 或 &windows; 的
+ <devicename>C:</devicename> )、以及一个扩展分区(在 &ms-dos; 或 &windows; 里
+ 面还可以包含逻辑分区)。</para>
+
+ <para>第三个部分显示 <application>FDisk</application> 中可用的命令。</para>
+
+ <figure id="sysinstall-fdisk1">
+ <title>典型的尚未编辑前的 Fdisk 分区表</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/fdisk-edit1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>接下来要做的事跟您要怎么给您的硬盘分区有关。</para>
+
+ <para>如果您要让 FreeBSD 使用整个硬盘(稍后您确认要 <application>sysinstall
+ </application> 继续安装后会删除所有这个硬盘上的资料),那么您就可以按
+ <keycap>A</keycap> 键(<guimenuitem>Use Entire Disk</guimenuitem> )
+ 目前已有的分区都会被删除,取而代之的是一个小的,标示为 <literal>unused
+ </literal> 的分区,以及一个大的 FreeBSD 分区。之后,请用方向键将光标移到这个
+ FreeBSD 分区,然后按 <keycap>S</keycap> 以将此分区高为开机启动分区。您会看
+ 到类似<xref linkend="sysinstall-fdisk2">的画面。注意在<literal>Flags</literal>
+ 栏目的 <literal>A</literal> 记号表示这个分区是 <emphasis>启动</emphasis> 状态,
+ 并且会由此分区开机。</para>
+
+ <para>如果要删除已的分区以空出空间给 FreeBSD,您可以将光标移动到要删除
+ 的分区后按 <keycap>D</keycap> 键。然后就可按 <keycap>C</keycap> 键,会出现
+ 对话框请您输入要创建的分区的大小。输入合适的大小后按 <keycap>Enter</keycap>
+ 键。默认情况下,这个对话框中的值为您可以给这个分区分配的可能的最大值。
+ 它可能是最大的邻接分区或未分配的整个硬盘大小。</para>
+
+ <para>如果您已经建立好给 FreeBSD 的分区(使用像 <application>&partitionmagic;
+ </application>类似的工具),那么您可以按下 <keycap>C</keycap> 键来建立一个新
+ 的分区。同样的,会有对话框询问您要建立的分区的大小。</para>
+
+ <figure id="sysinstall-fdisk2">
+ <title>Fdisk 分区使用整个硬盘</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/fdisk-edit2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>完成后,按 <keycap>Q</keycap> 键。您的变更会存在 <application>sysinstall
+ </application> 中,但是还不会真正写入您的硬盘。</para>
+ </sect2>
+
+ <sect2 id="bootmgr">
+ <title>安装多重引导</title>
+
+ <para>在这步骤您可以选择要不要安装一个多重引导管理器。一般而言,如果碰到
+ 下列的情形,您应该选择要安装多重引导管理程序。</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>您有一个以上的硬盘,并且 FreeBSD 并不是安装在第一个硬盘上。</para>
+ </listitem>
+
+ <listitem>
+ <para>您可以在一个硬盘上,除了 FreeBSD,您还有安装其它的操作系统;然后
+ 您想要选择在开机的时候要进入哪个系统。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您在这台机器上只安装一个 FreeBSD 操作系统,并且安装在第一个硬盘,
+ 那么选择 <guimenuitem>Standard</guimenuitem> 安装就可以了。如果您已经使用
+ 了一个第三方的多重引导程序,那么请选择 <guimenuitem>None</guimenuitem>。</para>
+
+ <para>选择好配置后请按 <keycap>Enter</keycap>。</para>
+
+ <figure id="sysinstall-bootmgr">
+ <title>Sysinstall 多重引导管理程序</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/boot-mgr" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>按下 <keycap>F1</keycap> 键所显示的在线说明中有讨论一些操作系统共存
+ 可能发生的问题。</para>
+ </sect2>
+
+ <sect2>
+ <title>在其它硬盘上创建分区</title>
+
+ <para>如果您的系统上有一个以上的硬盘,在选择完多重引导管理程序后会再回到
+ 选择硬盘的画面。如果您要将 FreeBSD 安装在多个硬盘上,那么您可以在这里选择
+ 其它的硬盘,然后重复使用 <application>FDisk</application> 来建立分区。</para>
+
+ <important>
+ <para>如果您想让 FreeBSD 来管理其它的硬盘,那么两个硬盘都必须安装 FreeBSD
+ 的多重引导管理程序。</para>
+ </important>
+
+ <figure id="sysinstall-fdisk-drive2">
+ <title>离开选择硬盘画面</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/fdisk-drive2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para><keycap>Tab</keycap> 键可以在您最后选择的硬盘、 &gui.ok; 以及 &gui.cancel;
+ 之间进行切换。</para>
+
+ <para>用 <keycap>Tab</keycap> 键将光标移动到 &gui.ok;然后按 <keycap>Enter</keycap>
+ 键继续安装过程。</para>
+ </sect2>
+
+ <sect2 id="disklabeleditor">
+ <title>使用<application>Disklabel</application>
+ 创建分区</title>
+
+ <para>您现在必须在刚刚建立好的分区中规划一些分区。请记住,每个分区代号是
+ <literal>a</literal> 到 <literal>h</literal>, 并且分区
+ partitions <literal>b</literal>, <literal>c</literal>以及
+ <literal>d</literal> 为习惯使用的特殊分区,不应该随意变动。</para>
+
+ <para>某些应用程序可以利用一些特殊的分区而达到较好的效果,尤其是分区分散
+ 在不同的硬盘的时候。但是,现在您是第一次安装FreeBSD,所以不需要去烦恼如
+ 何分割您的硬盘。最重要的是,装好FreeBSD然后学习如何使用它。当您对FreeBSD
+ 有相当程序的熟悉后,您可以随时重新安装FreeBSD,然后改变您分区的方式。</para>
+
+ <para>下面的范例中有四个分区&mdash;一个是磁盘交换分区,别外三个是文件系统。</para>
+
+ <table frame="none" pgwide="1">
+ <title>为第一个硬盘分区</title>
+
+ <tgroup cols="4">
+ <colspec colwidth="1*">
+ <colspec colwidth="1*">
+ <colspec colwidth="1*">
+ <colspec colwidth="4*">
+
+ <thead>
+ <row>
+ <entry>分区</entry>
+
+ <entry>文件系统</entry>
+
+ <entry>大小</entry>
+
+ <entry>描述</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><literal>a</literal></entry>
+
+ <entry><filename>/</filename></entry>
+
+ <entry>100&nbsp;MB</entry>
+
+ <entry>这是一个根文件系统(root filesystem)。任何其它的文件系统都会
+ 挂在根目录(译注:用根目录比较亲切)下面。 100&nbsp;MB 对于要目录来说
+ 是合理的大小,因为您往后并不会在这里存放太多的数据;在安装FreeBSD后会
+ 用掉约 40&nbsp;MB 的根目录空间。剩下的空间是用来存放临时文件用的,同时,
+ 您也应该预留一些空间,因为以后的FreeBSD版本可能会需要较多的
+ <filename>/</filename>(根目录)空间。</entry>
+ </row>
+
+ <row>
+ <entry><literal>b</literal></entry>
+
+ <entry>N/A</entry>
+
+ <entry>2-3 x RAM</entry>
+
+ <entry><para>此分区为系统磁盘交换分区(swap space)。选择正确的交换空间
+ 大小可是一门学问唷。一般来说,交换空间的大小应该是您系统上内存(RAM)
+ 大小的2到3倍。交换空间至少要有 64&nbsp;MB 因此,如果您的电脑上的RAM比
+ 32&nbsp;MB 小,请将交换空间大小设为 64&nbsp;MB。</para><para>
+
+ 如果您有一个以上的硬盘,您可以在每个硬盘上都配置交换分区。FreeBSD会利用
+ 第个硬盘上的交换空间,swap速度会比较快。如果是这种情形,先算出您总共需
+ 要的交换空间大小(如128&nbsp;MB),然后除以您拥有的硬盘数目(如2块),算
+ 出的结果就是每个硬盘上要配置的交换空间的大小。在这个例子中,第个硬盘的交
+ 换空间为 64&nbsp;MB </para></entry>
+ </row>
+
+ <row>
+ <entry><literal>e</literal></entry>
+
+ <entry><filename>/var</filename></entry>
+
+ <entry>50&nbsp;MB</entry>
+
+ <entry><filename>/var</filename> 目录会存放不同长度的文件、日志以及
+ 其它管理用途的文件。大部分这些文件都是FreeBSD每天在运行的时候会读取或
+ 是写入的。当这些文件放在另外的文件系统(译注:即/var)可以避免影响到
+ 其它目录下面类似的文件存取机制。</entry>
+ </row>
+
+ <row>
+ <entry><literal>f</literal></entry>
+
+ <entry><filename>/usr</filename></entry>
+
+ <entry>剩下的硬盘空间</entry>
+
+ <entry>您所有的其它的文件通常都会存在<filename>/usr</filename>
+ 目录以及其子目录下面。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>如果您要将FreeBSD安装在一个以上的硬盘,那么您必须在您配置的其它分区上
+ 再建立分区。最简单的方式就是在第个硬盘上建立两个分区,一个是交换分区,一个
+ 是文件系统分区。</para>
+
+ <table frame="none" pgwide="1">
+ <title>为其它磁盘分区</title>
+
+ <tgroup cols="4">
+ <colspec colwidth="1*">
+ <colspec colwidth="1*">
+ <colspec colwidth="2*">
+ <colspec colwidth="3*">
+
+ <thead>
+ <row>
+ <entry>分区</entry>
+
+ <entry>文件系统</entry>
+
+ <entry>大小</entry>
+
+ <entry>描述</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><literal>b</literal></entry>
+
+ <entry>N/A</entry>
+
+ <entry>见描述</entry>
+
+ <entry>之前提过,交换分区是可以跨硬盘的。但是,即使
+ <literal>a</literal> 分区没有使用,习惯上还是会把交换分区放在
+ <literal>b</literal> 分区上。</entry>
+ </row>
+
+ <row>
+ <entry><literal>e</literal></entry>
+
+ <entry>/disk<replaceable>n</replaceable></entry>
+
+ <entry>剩下的硬盘空间</entry>
+
+ <entry>剩下的空间是一个在的分区,最简单的做法是将之规划为
+ <literal>a</literal>分区而不是<literal>e</literal>分区。然而,
+ 习惯上<literal>a</literal>分区是保留给根目录 (<filename>/</filename>)
+ 用的。您不一定要遵守这个习惯,但是<application>sysinstall</application>
+ 会,所以照着它做会使您的安装比较清爽、干净。您可以将这些文件系统挂在任何
+ 地方,本范例建议将它们挂在<filename>/disk<replaceable>n</replaceable></filename> 目录,<replaceable>n</replaceable> 依据每个硬盘而有所不同,但是,您喜欢的话
+ 也可将它们挂在别的地方。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>分区的配置完成后,您可以用<application>sysinstall</application>.
+ 来建立它们了。您会看到下面的信息:</para>
+
+ <screen> Message
+ Now, you need to create BSD partitions inside of the fdisk
+ partition(s) just created. If you have a reasonable amount of disk
+ space (200MB or more) and don't have any special requirements, simply
+ use the (A)uto command to allocate space automatically. If you have
+ more specific needs or just don't care for the layout chosen by
+ (A)uto, press F1 for more information on manual layout.
+
+ [ OK ]
+ [ Press enter or space ]</screen>
+
+ <para>按下 <keycap>Enter</keycap> 键开始FreeBSD分区表编辑器,称做
+ <application>Disklabel</application>。</para>
+
+ <para><xref linkend="sysinstall-label"> 显示您第一次执行
+ <application>Disklabel</application>的画面。画面分为三个区域。</para>
+
+ <para>前几行显示的是您正在编辑的硬盘以及您正在建立的slice位于哪个分区上。
+ (在这里, <application>Disklabel</application> 使用的是
+ <literal>分区名称</literal> 而不是 slice 名)。此画面也会显示slice还有
+ 多少空间可以使用;亦即,有多余的空间,但是尚未指派分区。</para>
+
+ <para>画面中间区域显示已建立的区区,每个分区的文件系统名称、所占的大小以及
+ 一些关于建立这些文件系统的参数选项。</para>
+
+ <para>下方的第三区显示在 <application>Disklabel</application>中可用的按键。</para>
+
+ <figure id="sysinstall-label">
+ <title>Sysinstall Disklabel 编辑器</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disklabel-ed1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para><application>Disklabel</application> 您可以自动配置分区以及给它们预设
+ 的大小。您可以按 <keycap>A</keycap>键使用此功能。您会看到类似
+ <xref linkend="sysinstall-label2">的画面。根据您硬盘的大小,自动分配所配置
+ 的大小不一定合适。但是没有关系,您并不一定要使用预设的大小。</para>
+
+ <note>
+ <para>从 FreeBSD&nbsp;4.5开始,自动配置会给<filename>/tmp</filename>
+ 目录一个独立分区,而不是附属在 <filename>/</filename> 之下。这样可以
+ 避免将一些临时文件放到根目录中(译注:可能会用完根目录空间)。</para>
+ </note>
+
+ <figure id="sysinstall-label2">
+ <title>Sysinstall Disklabel 编辑器-使用自动配置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disklabel-auto" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>如果要删除自动配置的分区,然后想自行建立,您可以使用方向键移到第一
+ 个分区,然后按<keycap>D</keycap> 键删除它。重复此动作直到删除所有自动配置
+ 的分区。</para>
+
+ <para>要建立第一个分区(<literal>a</literal>, 挂接点为<filename>/</filename> &mdash;
+ 根目录),先确定画现上方的硬盘slice有被选取(反蓝),然后按下 <keycap>C</keycap>
+ 键。接着会出现一个对话框询问您要配置的分区大小(如 <xref linkend="sysinstall-label-add">)
+ 您可以输入要的block数量或是(译注:通常会)输入想使用的大小,然后后面另上
+ <literal>M</literal> 表示MB、<literal>G</literal> GB或是 <literal>C</literal>
+ 表示(柱面)。</para>
+
+ <note><para>从 FreeBSD&nbsp;5.X版本开始,用户可以:选择 <literal>Custom Newfs</literal>
+ 选项来使用<acronym>UFS2</acronym> (<keycap>Z</keycap>) ,使用<literal>Auto Defaults
+ </literal> 来创建 labels ,并使用 <literal>Custom Newfs</literal>选项来修改它们。
+ 或是在创建时加上<option>-O 2</option>规则。如果您使用了<literal>Custom Newfs</literal>
+ 标记不要忘了添加<option>-U</option>标记来升级它们。</para></note>
+
+ <figure id="sysinstall-label-add">
+ <title>根目录使用空间</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disklabel-root1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>显示在对话框中的默认大小是使用整个分区,您可以用
+ <keycap>Backspace</keycap>键删除这些数字然后按照上述方式输入您想要的
+ 大小,如<userinput>64M</userinput>(<xref linkend="sysinstall-label-add2">),
+ 然后按&gui.ok;。</para>
+
+ <figure id="sysinstall-label-add2">
+ <title>编辑要分区大小</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disklabel-root2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>输入完大小后接着部您要建立的分区是文件系统还是交换空间,如
+ <xref linkend="sysinstall-label-type">所示。第一个分区是文件系统,所以
+ 确认选择 <guimenuitem>FS</guimenuitem>后按<keycap>Enter</keycap>键。</para>
+
+ <figure id="sysinstall-label-type">
+ <title>选择根分区类型</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disklabel-fs" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>最后,因为您要建立的是一个文件系统,所以必须告诉
+ <application>Disklabel</application> 这个文件系统要挂接在什么地方,如
+ <xref linkend="sysinstall-label-mount">所示。根文件系统的挂接点
+ <filename>/</filename>, 所以请输入 <userinput>/</userinput>,然后按
+ <keycap>Enter</keycap>键。</para>
+
+ <figure id="sysinstall-label-mount">
+ <title>选择根挂接点</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disklabel-root3" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>刚刚制作好的分区会显示在画面上。您应该重复上述的动作以建立其它的
+ 分区。当建立交换空间的时候,系统不会问您要将它挂接在哪里,因为交换空间是不用
+ 挂在系统上的。当您在建立最后一个分区<filename>/usr</filename>的时候,您可以
+ 直接使用默认的大小,即所有此分区剩余的空间。</para>
+
+ <para>您最终的 FreeBSD DiskLabel 编辑器画面会类似
+ <xref linkend="sysinstall-label4">, 实际数字按您的选择而有所不同。按下
+ <keycap>Q</keycap> 键完成分区的建立。</para>
+
+ <figure id="sysinstall-label4">
+ <title>Sysinstall Disklabel 编辑器</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/disklabel-ed2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </sect2>
+ </sect1>
+
+ <sect1 id="install-choosing">
+ <title>选择要安装的软件包</title>
+
+ <sect2 id="distset">
+ <title>选择要安装的软件包</title>
+
+ <para>安装哪些软件包在很大程度上取决于系统将被用来做什么,以及有多少可用的磁盘空间。
+ 内建的选项包括了运行所需要的最小系统,到把所有软件包全都装上的常用配置。
+ &unix; 或 FreeBSD 新手通常直接选择一个设定好的软件包就可以了,
+ 而有经验的使用者则可以考虑自己订制安装哪些软件包。</para>
+
+ <para>按下 <keycap>F1</keycap> 可以看到有关软件包的更多选项信息,
+ 以及它们都包含了哪些软件,之后,可以按 <keycap>Enter</keycap>
+ 回到软件包选择画面。</para>
+
+ <para>如果您想要使用图形界面,您必须选择软件包名称开头是 <literal>X</literal>
+ 的软件包。 <application>&xfree86;</application> 的配置以及选择其默认桌面管理
+ 员必须等到安装完毕后再来做。</para>
+
+ <para> <application>&xfree86;</application> 的版本依赖于您正在安装的FreeBSD
+ 的版本。如果您安装的是FreeBSD 4.6以前的版本,那么默认的情况下安装
+ <application>&xfree86; 3.X</application> 版本。如果您安装的 FreeBSD&nbsp;4.6
+ 以后的版本,那么默认情况下安装<application>&xfree86; 4.X</application> 版本。</para>
+
+ <para>您应该到<ulink url="http://www.xfree86.org/">&xfree86;</ulink>
+ 网站看看您的显卡有没有被您安装的FreeBSD所支持。您也可以选择不安装
+ 图形界面,等安装完成后,再通过ports collection来安装和配置适合版本
+ 的<application>&xfree86;</application> 。</para>
+
+ <para>如果您以后要自己编译内核,那么请您选择包含原始代码的软件包。如果您
+ 想知道为什么要建立自订的内核或是如何建立自订的内核,请参考
+ <xref linkend="kernelconfig">。</para>
+
+ <para>很明显,安装容量最大的当然就是全部安装啦。如果您的硬盘够大,您
+ 可以选择<guimenuitem>All</guimenuitem> (如图
+ <xref linkend="distribution-set1"> )然后按下 <keycap>Enter</keycap>。
+ 如果您的硬盘空间有问题,那么请选择适合您情部的软件包。在安装完毕后,
+ 您还是可以安装其它的软件。</para>
+
+ <figure id="distribution-set1">
+ <title>选择软件包</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/dist-set" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </sect2>
+
+ <sect2 id="portscol">
+ <title>安装ports软件包</title>
+
+ <para>当选择完您想要安装的部分后,接着会询问您要不要安装FreeBSD Ports
+ 软件包;Ports软件包可以让您简单方便地安装软件包。Ports本身并不包含编辑
+ 软件所需要的程序源代码,而是一个包含自动下载、编辑以及安装的文档集合。
+ <xref linkend="ports"> 一章讨论如何使用Ports.</para>
+
+ <para>安装程序并不会检查您是否有足够的硬盘空间来放ports,所以,如果要安装
+ ports软件所,请先确定您有足够的硬盘空间。 FreeBSD &rel.current;版本
+ FreeBSD Ports Collection 大约占用 &ports.size; 大小的硬盘空间。您要为
+ 这些版本设置大一点的值来安装它们。</para>
+
+<screen> User Confirmation Requested
+ Would you like to install the FreeBSD ports collection?
+
+ This will give you ready access to over &os.numports; ported software packages,
+ at a cost of around &ports.size; of disk space when "clean" and possibly much
+ more than that if a lot of the distribution tarballs are loaded
+ (unless you have the extra CDs from a FreeBSD CD/DVD distribution
+ available and can mount it on /cdrom, in which case this is far less
+ of a problem).
+
+ The ports collection is a very valuable resource and well worth having
+ on your /usr partition, so it is advisable to say Yes to this option.
+
+ For more information on the ports collection & the latest ports,
+ visit:
+ http://www.FreeBSD.org/ports
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 将会安装
+ ports collection, 而选择 &gui.no;
+ 则将跳过它。 选好后按 <keycap>Enter</keycap> 继续。
+ 此后, 选择安装的软件包的屏幕将再次出现。</para>
+
+ <figure id="distribution-set2">
+ <title>确认您要安装的软件包</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/dist-set2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>如果对您的选择感到满意,请选择<guimenuitem>Exit</guimenuitem>
+ 退出,确保&gui.ok; 被高亮显示,然后按<keycap>Enter</keycap>
+ 继续。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="install-media">
+ <title>选择您要使用的安装介质</title>
+
+ <para>如果要从 CDROM 或 DVD安装,使用方向键将光标移到
+ <guimenuitem>Install from a FreeBSD CD/DVD</guimenuitem>。确认
+ &gui.ok; 被选取,然后按 <keycap>Enter</keycap> 开始安装程序。</para>
+
+ <para>如果要使用其它的方式安装,请选择适当的安装介质然后按照屏幕指示
+ 进行安装。</para>
+
+ <para>按 <keycap>F1</keycap> 可以显示安装介质的在线说明。按一下
+ <keycap>Enter</keycap> 可返回选择安装介质画面。</para>
+
+ <figure id="choose-media">
+ <title>选择安装介质</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/media" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <note>
+ <title>FTP安装模式</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>network</secondary>
+ <tertiary>FTP</tertiary>
+ </indexterm>
+
+ <para>使用FTP安装,有三种方式:主动式(active)FTP、被动式(passive)FTP
+ 或是透过HTTP代理服务器。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>主动式FTP: <guimenuitem>从FTP服务器安装</guimenuitem></term>
+
+ <listitem>
+ <para>这个选项将会使所有的FTP传输使用 <quote>Active</quote>模式。
+ 这将无法通过防火墙,但是可以使用在那些比较早期,不支持被动模式的FTP站。
+ 如果您的连接在使用被动(默认值)模式卡住了,请换主动模式看看!</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>被动模式FTP: <guimenuitem>通过防火墙从FTP服务器安装</guimenuitem></term>
+
+ <listitem>
+ <indexterm>
+ <primary>FTP</primary>
+ <secondary>passive mode</secondary>
+ </indexterm>
+
+ <para>此选项会让 <application>sysinstall</application> 使用
+ <quote>Passive</quote>模式来安装。这使得使用者可以穿过
+ 不允许用非固定TCP PORTS连入的防火墙。 </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>FTP 透过 HTTP 代理服务器: <guimenuitem>透过HTTP代理服务器,由
+ FTP服务器安装</guimenuitem></term>
+
+ <listitem>
+ <indexterm>
+ <primary>FTP</primary>
+ <secondary>via a HTTP proxy</secondary>
+ </indexterm>
+
+ <para>此选项会让 <application>sysinstall</application> 通过HTTP协议
+ (像浏览器一样)连到proxy服务器。proxy服务器会解释送出的请求,
+ 然后通知FTP服务器。因为通过HTTP协议,所以可以穿过防火墙。
+ 要用这种方式,您必须指定proxy服务器的地址。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>对于一个 FTP 代理服务器而言,通常在使用者登入名称中加入您要登入的
+ 服务器的用户名,加在 <quote>@</quote> 符号后面。然后代理服务器就会
+ <quote>假装</quote> 成一个真的服务器。 例如, 假设您要从
+ <hostid role="fqdn">ftp.FreeBSD.org</hostid> 安装,通过 FTP
+ 代理服务器 <hostid role="fqdn">foo.example.com</hostid>,使用1024端口。</para>
+
+ <para>在这种情况下,您可以到 options 菜单,将 FTP username 设为
+ <literal>ftp@ftp.FreeBSD.org</literal>,密码设为您的电子邮件地址。
+ 安装介质部分,指定FTP (或是被动式 FTP,如果代理服务器支持的话) 以及URL为
+ <literal>ftp://foo.example.com:1234/pub/FreeBSD</literal>。</para>
+
+ <para>因为<hostid role="fqdn">ftp.FreeBSD.org</hostid>的
+ <filename>/pub/FreeBSD</filename> 目录会被抓取到
+ <hostid role="fqdn">foo.example.com</hostid>之下,您就可以从
+ <emphasis>这台</emphasis> 机器 (会从
+ <hostid role="fqdn">ftp.FreeBSD.org</hostid> 抓取文件) 安装。</para>
+ </note>
+ </sect1>
+
+ <sect1 id="install-final-warning">
+ <title>安装确认</title>
+
+ <para>到此为止,可以开始进行安装了,这也是您避免更动到您的硬盘的最后机会。</para>
+
+ <screen> User Confirmation Requested
+ Last Chance! Are you SURE you want to continue the installation?
+
+ If you're running this on a disk with data you wish to save then WE
+ STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
+
+ We can take no responsibility for lost disk contents!
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 然后按下
+ <keycap>Enter</keycap> 确认安装</para>
+
+ <para>安装所需的时间会根据您所选择的软件、安装介质以及您电脑的速度而有所不同。
+ 在安装的过程中会有一些信息来显示目前蝗进度。</para>
+
+ <para>当您看到下面的信息表示已经安装完成了:</para>
+
+ <screen> Message
+
+Congratulations! You now have FreeBSD installed on your system.
+
+We will now move on to the final configuration questions.
+For any option you do not wish to configure, simply select No.
+
+If you wish to re-enter this utility after the system is up, you may
+do so by typing: /stand/sysinstall .
+
+ [ OK ]
+
+ [ Press enter to continue ]</screen>
+
+ <para>按下 <keycap>Enter</keycap> 以进行安装后的配置。</para>
+
+ <para>选择 &gui.no; 然后按 <keycap>Enter</keycap>
+ 会取消安装,不会对您的系统造成更动。您会看到下面的信息:</para>
+
+ <screen> Message
+Installation complete with some errors. You may wish to scroll
+through the debugging messages on VTY1 with the scroll-lock feature.
+You can also choose "No" at the next prompt and go back into the
+installation menus to retry whichever operations have failed.
+
+ [ OK ]</screen>
+
+ <para>产生这个信息是因为什么东西也没有安装,按下 <keycap>Enter</keycap>
+ 后会离开安装程序回到主安装界面。从主安装界面可以退出安装程序。</para>
+ </sect1>
+
+ <sect1 id="install-post">
+ <title>安装后的配置</title>
+
+ <para>如果安装成功,您将可以对一些基本的项目作安装后初步的配置。任何一项
+ 配置在重新开机前都可以重新配置,系统会使用最后一次的配置值。重新开机后
+ 如果再做配置,可以执行<command>/stand/sysinstall</command> 命令然后选择
+ <guimenuitem>Configure</guimenuitem>选项。</para>
+
+ <sect2 id="inst-network-dev">
+ <title>配置网卡</title>
+
+ <para>如果您之前配置用 PPP 通过 FTP 安装,那么这个画面将不会出现;正像所说
+ 的那样,您可以稍后再做配置。</para>
+
+ <para>如果想更多的了解网卡或将FreeBSD配置为网关或路由器,请参考
+ <link linkend="advanced-networking">Advanced Networking</link>
+ 的相关文章。</para>
+
+ <screen> User Confirmation Requested
+ Would you like to configure any Ethernet or SLIP/PPP network devices?
+
+ [ Yes ] No</screen>
+
+ <para>如果要配置网卡,请选择
+ &gui.yes; 然后按 <keycap>Enter</keycap>。
+ 否则请选择 &gui.no; 继续。</para>
+
+ <figure id="ed-config1">
+ <title>选择网卡设备</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/ed0-conf" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>用方向键选择您要配置的网卡接口,然后按<keycap>Enter</keycap>。</para>
+
+ <screen> User Confirmation Requested
+ Do you want to try IPv6 configuration of the interface?
+
+ Yes [ No ]</screen>
+
+ <para>目录私人区域网络IP协议<acronym>IPv4</acronym>已经足够,所以选择
+ &gui.no; 然后按 <keycap>Enter</keycap>。</para>
+
+ <para>如果想试试新的IP通信协议 <acronym>IPv6</acronym> ,使用 <acronym>RA</acronym>
+ 服务,请选择 &gui.yes; 然后按 <keycap>Enter</keycap>。
+ 寻找 RA 服务器将会花费几秒的时间。</para>
+
+ <screen> User Confirmation Requested
+ Do you want to try DHCP configuration of the interface?
+
+ Yes [ No ]</screen>
+
+ <para>如果您不需要 DHCP (Dynamic Host Configuration Protocol 动态主机配置协议)
+ ,选择 &gui.no; 然后按<keycap>Enter</keycap>。</para>
+
+ <para>选择 &gui.yes; 会执行<application>dhclient</application>,
+ 如果成功,它会自动将网络配置信息填上。更多的信息请参考
+ <xref linkend="network-dhcp"> 。</para>
+
+ <para>下面的网络配置显示了怎样把以太网设备配置成区域网络网关的角色。</para>
+
+ <figure id="ed-config2">
+ <title>配置 ed0接口</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/ed0-conf2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>使用<keycap>Tab</keycap> 键可以在各个栏目之间进行切换,请输入适当
+ 的信息:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>Host(机器名称)</term>
+
+ <listitem>
+ <para>完整的机器名称,例如本例中的 <hostid role="fqdn">k6-2.example.com</hostid> 。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Domain(域名)</term>
+
+ <listitem>
+ <para>您机器所在的域名称,如本例的 <hostid role="domainname">example.com</hostid>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>IPv4 Gateway(IPv4网关)</term>
+
+ <listitem>
+ <para>输入将数据包传送到远端网络的机器IP地址。只有当机器是网络上的
+ 一个接点时才要输入。如果这台机器要作为您局域网的网关,
+ <emphasis>请将此处设为空白</emphasis>。IPv4网关,也被称作默认网关或
+ 默认路由器。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>域名服务器</term>
+
+ <listitem>
+ <para>本地网络中的域名服务器的IP地址。本例中假设机器所在的网络中
+ 没有域名服务器,所以填入的是ISP提供的域名服务器地址
+ (<hostid role="ipaddr">208.163.10.2</hostid>。)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>IPv4 地址</term>
+
+ <listitem>
+ <para>本机所使用的IP地址。本例为
+ <hostid role="ipaddr">192.168.0.1</hostid>。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>子网掩码</term>
+
+ <listitem>
+ <para>本范例中的IP地址属于一个C类地址
+ (<hostid role="ipaddr">192.168.0.0</hostid> -
+ <hostid role="ipaddr">192.168.255.255</hostid>)。默认的子网掩码为
+ (<hostid role="netmask">255.255.255.0</hostid>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term> ifconfig 额外参数设定</term>
+
+ <listitem>
+ <para>任何<command>ifconfig</command>命令跟网卡接口有关的参数。
+ 本范例中没有。</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para>使用 <keycap>Tab</keycap> 键选择 &gui.ok;然后按
+ <keycap>Enter</keycap>键。</para>
+
+
+ <screen> User Confirmation Requested
+ Would you like to Bring Up the ed0 interface right now?
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 然后按
+ <keycap>Enter</keycap> 将会将机器的网卡转为启用状态。机器下次启动
+ 的时候即可实用。</para>
+ </sect2>
+
+ <sect2 id="gateway">
+ <title>配置网关</title>
+
+ <screen> User Confirmation Requested
+ Do you want this machine to function as a network gateway?
+
+ [ Yes ] No</screen>
+
+ <para>如果这台机器要作为本地网络和其它机器之间传送数据包的网关,请选择
+ &gui.yes; 然后按 <keycap>Enter</keycap>。
+ 如果这台机器只是网络上的一个节点主,请选择 &gui.no;
+ 并按<keycap>Enter</keycap> 继续。</para>
+ </sect2>
+
+ <sect2 id="inetd-services">
+ <title>配置网络服务</title>
+
+ <screen> User Confirmation Requested
+Do you want to configure inetd and the network services that it provides?
+
+ Yes [ No ]</screen>
+
+ <para>如果选择 &gui.no; ,许多网络服务,如
+ <application>telnetd</application> 将不会启用。这表示远端用户将无法
+ <application>telnet</application> 进入这台机器。本机器上的用户还是可以
+ <application>telnet</application>到远端机器的。</para>
+
+ <para>这些服务可以在安装完成后修改<filename>/etc/inetd.conf</filename>
+ 配置文件来启用它们。请参阅 <xref linkend="network-inetd-overview">
+ 以获得更多的信息。</para>
+
+ <para>如果您想现在就配置这些网络服务,请选择<guibutton>[ Yes ]</guibutton> ,
+ 然后会看到下面的信息:</para>
+
+ <screen> User Confirmation Requested
+The Internet Super Server (inetd) allows a number of simple Internet
+services to be enabled, including finger, ftp and telnetd. Enabling
+these services may increase risk of security problems by increasing
+the exposure of your system.
+
+With this in mind, do you wish to enable inetd?
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 继续。</para>
+
+ <screen> User Confirmation Requested
+inetd(8) relies on its configuration file, /etc/inetd.conf, to determine
+which of its Internet services will be available. The default FreeBSD
+inetd.conf(5) leaves all services disabled by default, so they must be
+specifically enabled in the configuration file before they will
+function, even once inetd(8) is enabled. Note that services for
+IPv6 must be separately enabled from IPv4 services.
+
+Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to
+use the current settings.
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 将允许您添加网络服务
+ (将相应网络服务每行开头的<literal>#</literal>除掉即呆。</para>
+
+ <figure id="inetd-edit">
+ <title>编辑 <filename>inetd.conf</filename>配置文件</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/edit-inetd-conf" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>在加入您想启用的服务后,按下 <keycap>Esc</keycap>键会出现一个
+ 对话框可以让您离开以及保存修改。</para>
+
+ </sect2>
+
+ <sect2 id="ftpanon">
+ <title>匿名 FTP</title>
+
+ <screen> User Confirmation Requested
+ Do you want to have anonymous FTP access to this machine?
+
+ Yes [ No ]</screen>
+
+ <sect3 id="deny-anon">
+ <title>不允许匿名 FTP访问</title>
+
+ <para>选择默认的 &gui.no; 并按下
+ <keycap>Enter</keycap> 键将仍然可以让在这台机器上有账号的用户访问
+ FTP。</para>
+ </sect3>
+
+ <sect3 id="ftpallow">
+ <title>允许匿名 FTP访问</title>
+
+ <para>如果您选择允许匿名 FTP 存取,那么网络中任何人都可以使用FTP来访问您
+ 的机器。在启用匿名访问之前应该考虑网络的安全问题。如果要知道更多有关网络
+ 安全的信息,请参阅 <xref linkend="security">。</para>
+
+ <para>要启用FTP匿名访问,用方向键选择 &gui.yes;
+ 然后按 <keycap>Enter</keycap>键。您会看到下面(或类似)的画面:</para>
+
+ <figure id="anon-ftp2">
+ <title>默认的匿名 FTP 配置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/ftp-anon1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>按 <keycap>F1</keycap> 键可以查看在线帮助文档:</para>
+
+ <screen>This screen allows you to configure the anonymous FTP user.
+
+The following configuration values are editable:
+
+UID: The user ID you wish to assign to the anonymous FTP user.
+ All files uploaded will be owned by this ID.
+
+Group: Which group you wish the anonymous FTP user to be in.
+
+Comment: String describing this user in /etc/passwd
+
+
+FTP Root Directory:
+
+ Where files available for anonymous FTP will be kept.
+
+Upload subdirectory:
+
+ Where files uploaded by anonymous FTP users will go.</screen>
+
+ <para>默认的FTP根目录将放在 <filename>/var</filename>目录下。如果您
+ 的/var目录空间不足以应付您的FTP需求,您可以将FTP的根目录改为
+ <filename>/usr</filename> 目录下的 <filename>/usr/ftp</filename>
+ 目录。</para>
+
+ <para>当您对一切配置都满意后,请按 <keycap>Enter</keycap> 键继续。</para>
+
+ <screen> User Confirmation Requested
+ Create a welcome message file for anonymous FTP users?
+
+ [ Yes ] No</screen>
+
+ <para>如果您选择 &gui.yes; 并按下
+ <keycap>Enter</keycap>键,系统会自动打开文本编辑器让您编辑FTP的欢迎信息。</para>
+
+ <figure id="anon-ftp4">
+ <title>编辑FTP欢迎信息</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/ftp-anon2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>此文本编辑器叫做 <command>ee</command>。按照指示修改信息文本或是
+ 稍后再用您喜爱的文本编辑器来修改。请记住画面下方显示的文件位置。</para>
+
+ <para>按 <keycap>Esc</keycap> 将弹出一个默认为
+ <guimenuitem>a) leave editor</guimenuitem>的对话框。按
+ <keycap>Enter</keycap> 退出并继续。再次按
+ <keycap>Enter</keycap> 将保存修改。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="nfsconf">
+ <title>配置网络文件系统</title>
+
+ <para>网络文件系统 (NFS) 可以让您可以在网络上共享您的文件。一台机器可以
+ 配置成NFS服务器、客户端或两者并存。请参考
+ <xref linkend="network-nfs"> 以获得更多的信息。</para>
+
+ <sect3 id="nsf-server-options">
+ <title>NFS 服务器</title>
+
+ <screen> User Confirmation Requested
+ Do you want to configure this machine as an NFS server?
+
+ Yes [ No ]</screen>
+
+ <para>如果您不想安装网络文件系统,请选择 &gui.no;
+ 然后按 <keycap>Enter</keycap>键。</para>
+
+ <para>如果您选择 &gui.yes; 将会出现一个对话框提醒您
+ 必须先建立一个 <filename>exports</filename> 文件。</para>
+
+ <screen> Message
+Operating as an NFS server means that you must first configure an
+/etc/exports file to indicate which hosts are allowed certain kinds of
+access to your local filesystems.
+Press [Enter] now to invoke an editor on /etc/exports
+ [ OK ]</screen>
+
+ <para>按 <keycap>Enter</keycap> 键继续。系统会启动文本编辑器让您编辑
+ <filename>exports</filename> 文件。</para>
+
+ <figure id="nfs-server-edit">
+ <title>编辑 <filename>exports</filename>文件</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/nfs-server-edit" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>按照指示加入真实输出的文件目录或是稍后用您喜爱的编辑器自行编辑。
+ 请记下画面下方显示的文件名称及位置。</para>
+
+ <para>按下 <keycap>Esc</keycap> 键会出现一具对话框,默认选项是
+ <guimenuitem>a) leave editor</guimenuitem>。按下
+ <keycap>Enter</keycap> 离开并继续。</para>
+ </sect3>
+
+ <sect3 id="nfs-client-options">
+ <title>NFS 客户端</title>
+
+ <para> NFS 客户端允许您的机器访问NFS服务器。</para>
+
+ <screen> User Confirmation Requested
+ Do you want to configure this machine as an NFS client?
+
+ Yes [ No ]</screen>
+
+ <para>按照您的需要,选择 &gui.yes;
+ 或 &gui.no; 然后按 <keycap>Enter</keycap>。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="securityprofile">
+ <title>安全配置</title>
+
+ <para><quote>安全配置</quote> 中包含了一些可以通过启用或停用某些程序
+ 来达到某些程序的安全性配置。安全配置越严格,则默认启动的程序就越少。
+ 基本的原则是:除非必要,否则不要执行一些可有有无的程序。</para>
+
+ <para>请注意,安全文件的配置都是默认值,在安装完成后您可以随时通过
+ 编辑 <filename>/etc/rc.conf</filename>配置文件来改变这些配置。
+ 如果想得到更多的信息请参阅 &man.rc.conf.5; 手册。</para>
+
+ <para>下表说明每一种安全等级的意义。每列所代表的是安全等级,每行所
+ 代表的是程序或功能是启用还是停用。</para>
+
+ <table>
+ <title>可能的安全等级</title>
+
+ <tgroup cols=3>
+ <thead>
+ <row>
+ <entry></entry>
+
+ <entry>极/高度安全</entry>
+
+ <entry>中度安全</entry>
+ </row>
+ </thead>
+
+ <tbody>
+
+ <row>
+ <entry>&man.sendmail.8;</entry>
+
+ <entry>否</entry>
+
+ <entry>是</entry>
+ </row>
+
+ <row>
+ <entry>&man.sshd.8;</entry>
+
+ <entry>否</entry>
+
+ <entry>是</entry>
+ </row>
+
+ <row>
+ <entry>&man.portmap.8;</entry>
+
+ <entry>否</entry>
+
+ <entry>不一定
+ <footnote>
+ <para>如果之前安装时配置机器为NFS客户端或服务器,则会启用些
+ 项目。</para>
+ </footnote>
+ </entry>
+ </row>
+
+ <row>
+ <entry>NFS server</entry>
+
+ <entry>否</entry>
+
+ <entry>是</entry>
+ </row>
+
+ <row>
+ <entry>&man.securelevel.8;</entry>
+
+ <entry>是
+ <footnote>
+ <para>如果您选择的安全等级配置 securelevel 为 <quote>极度或高度</quote>
+ 或 <quote>High</quote>,请阅读&man.init.8;手册并特别注意有关安全
+ 等级意义的部分;否则稍后您可能会过到很大的困难!</para>
+ </footnote>
+ </entry>
+
+ <entry>否</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <screen> User Confirmation Requested
+ Do you want to select a default security profile for this host (select
+ No for "medium" security)?
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.no; 并按
+ <keycap>Enter</keycap> 会将安全等级高为中度安全。</para>
+
+ <para>选择 &gui.yes; 并按
+ <keycap>Enter</keycap>将允许您选择不同程序的安全等级。</para>
+
+ <figure id="security-profile">
+ <title>选择安全等级</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/security" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>按 <keycap>F1</keycap> 显示在线帮助;按<keycap>Enter</keycap>
+ 键可以回到选择画面。</para>
+
+ <para>如果您没有什么特殊的等级需求,请用方向键选择 <guimenuitem>中度</guimenuitem>,
+ 确定选择了 &gui.ok; 然后按<keycap>Enter</keycap>。</para>
+
+ <para>依据您选择的安全等级,会显示相对应的确认信息。</para>
+
+ <screen> Message
+
+Moderate security settings have been selected.
+
+Sendmail and SSHd have been enabled, securelevels are
+disabled, and NFS server setting have been left intact.
+PLEASE NOTE that this still does not save you from having
+to properly secure your system in other ways or exercise
+due diligence in your administration, this simply picks
+a standard set of out-of-box defaults to start with.
+
+To change any of these settings later, edit /etc/rc.conf
+
+ [OK]</screen>
+
+ <screen> Message
+
+Extreme security settings have been selected.
+
+Sendmail, SSHd, and NFS services have been disabled, and
+securelevels have been enabled.
+PLEASE NOTE that this still does not save you from having
+to properly secure your system in other ways or exercise
+due diligence in your administration, this simply picks
+a more secure set of out-of-box defaults to start with.
+
+To change any of these settings later, edit /etc/rc.conf
+
+ [OK]</screen>
+
+ <para>按下 <keycap>Enter</keycap> 继续安装后面的配置。</para>
+
+ <warning>
+ <para>安全等级并非万能药!即使您选择极度安全,您还是必须时常阅读
+ <xref linkend="eresources-mail">邮件列表中有关安全的部分、使用有效的密码以及平常就注意安全问题。
+ 这里只是稍为配置一下常用的安全等级而已。</para>
+ </warning>
+
+ </sect2>
+
+ <sect2 id="console">
+ <title>配置系统终端</title>
+
+ <para>系统提供了几个选项可以让您配置终端的表现方式。</para>
+
+ <screen> User Confirmation Requested
+ Would you like to customize your system console settings?
+
+ [ Yes ] No</screen>
+
+ <para>要查阅及配置这些选项,请选择 &gui.yes;
+ 并按<keycap>Enter</keycap>。</para>
+
+ <figure id="saver-options">
+ <title>系统终端配置选项</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/console-saver1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>最常用的选项就是屏幕保护程序了。使用方向键将光标移动到
+ <guimenuitem>Saver</guimenuitem> 然后按<keycap>Enter</keycap>。</para>
+
+ <figure id="saver-select">
+ <title>屏幕保护程序选项</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/console-saver2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择您想使用的屏幕保护程序,然后按 <keycap>Enter</keycap>。
+ 之后回到系统终端配置画面。</para>
+
+ <para>默认开启屏幕保护程序的时间是300秒。如果要更改此时间,请再次选择
+ <guimenuitem>Saver</guimenuitem> 。然后选择 <guimenuitem>Timeout</guimenuitem>
+ 并按 <keycap>Enter</keycap>键。系统会弹出一个对话框如下:</para>
+
+ <figure id="saver-timeout">
+ <title>屏幕保护时间设置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/console-saver3" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>您可以直接改变这个值,然后选 &gui.ok;并按 <keycap>Enter</keycap>
+ 键回到系统终端配置画面。</para>
+
+ <figure id="saver-exit">
+ <title>退出系统终端配置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/console-saver4" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择 <guimenuitem>Exit</guimenuitem> 然后按下
+ <keycap>Enter</keycap> 键会回到安装后的配置画面。</para>
+ </sect2>
+
+ <sect2 id="timezone">
+ <title>配置时区</title>
+
+ <para>配置您机器的时区可以让系统自动校正任何区域时间的变更并且在执行
+ 一些跟时区相关的程序时不会出错。</para>
+
+ <para>例子中假设此台机器位于美国东部的时区。请参考您所在的地理位置来配置。</para>
+
+ <screen> User Confirmation Requested
+ Would you like to set this machine's time zone now?
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 并按下
+ <keycap>Enter</keycap>键以配置时区。</para>
+
+ <screen> User Confirmation Requested
+ Is this machine's CMOS clock set to UTC? If it is set to local time
+ or you don't know, please choose NO here!
+
+ Yes [ No ]</screen>
+
+ <para>这里按照您机器时间的配置,选择 &gui.yes;
+ 或 &gui.no; 然后按 <keycap>Enter</keycap>。</para>
+
+ <figure id="set-timezone-region">
+ <title>选择您所处的地理区域</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/timezone1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>请选择适当的区域然后按 <keycap>Enter</keycap>。</para>
+
+ <figure id="set-timezone-country">
+ <title>选择您所在的国家</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/timezone2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择您所在的国家然后按 <keycap>Enter</keycap>。</para>
+
+ <figure id="set-timezone-locality">
+ <title>选择您所在的时区</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/timezone3" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择您所在的时区然后按 <keycap>Enter</keycap>。</para>
+
+ <screen> Confirmation
+ Does the abbreviation 'EDT' look reasonable?
+
+ [ Yes ] No</screen>
+
+ <para>检查一下时区的缩写是否正确,如果没错,请按 <keycap>Enter</keycap>
+ 返回系统安装后的配置画面。</para>
+ </sect2>
+
+ <sect2 id="linuxcomp">
+ <title>Linux 兼容性</title>
+
+ <screen> User Confirmation Requested
+ Would you like to enable Linux binary compatibility?
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 并按下<keycap>Enter</keycap>
+ 键,将允许您在FreeBSD中执行Linux的软件。安装程序会安装一些为了跟Linux
+ 兼容的软件包。</para>
+
+ <para>如果您是通过FTP安装,那么您必须连到网络上。有时候FTP站并不会包含
+ 所有的安装软件包(例如Linux兼容软件包);不过,稍后您还可以再安装这个
+ 项目。</para>
+ </sect2>
+
+ <sect2 id="mouse">
+ <title>配置鼠标</title>
+
+ <para>此选项可以让您在终端上使用三键鼠标剪贴文字。如果您用的鼠标是两个
+ 按钮,请参考手册 &man.moused.8;;以取得有关模拟三键鼠标的信息。范例中
+ 使用的鼠标不是USB接口。(例如ps/2或com接口的鼠标):</para>
+
+ <screen> User Confirmation Requested
+ Does this system have a non-USB mouse attached to it?
+
+ [ Yes ] No </screen>
+
+ <para>如果您使用的不是USB鼠标,请选择 &gui.yes; ;
+ 否则请选择 &gui.no; 。然后按<keycap>Enter</keycap>。</para>
+
+ <figure id="mouse-protocol">
+ <title>选择鼠标类型</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mouse1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>使用方向键选择 <guimenuitem>Type</guimenuitem> 然后按
+ <keycap>Enter</keycap>。</para>
+
+ <figure id="set-mouse-protocol">
+ <title>设置鼠标协议</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mouse2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>在这个例子中使用的类型是ps/2鼠标,所以可以使用默认的
+ <guimenuitem>Auto(自动)</guimenuitem> 。 您可以用方向键选择合适的项目,
+ 确定选择了 &gui.ok; 后按 <keycap>Enter</keycap> 键离开此画面。</para>
+
+ <figure id="config-mouse-port">
+ <title>配置鼠标端口</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mouse3" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择 <guimenuitem>Port</guimenuitem> 然后按 <keycap>Enter</keycap>。</para>
+
+ <figure id="set-mouse-port">
+ <title>配置鼠标端口</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mouse4" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>假设这台机器用的是ps/2鼠标,您可以采用默认的
+ <guimenuitem>PS/2</guimenuitem> 选项。请选择适当的项目然后按
+ <keycap>Enter</keycap>。</para>
+
+ <figure id="test-daemon">
+ <title>启动鼠标服务进程</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mouse5" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择<guimenuitem>Enable</guimenuitem>然后按
+ <keycap>Enter</keycap> 来启动和测试鼠标。</para>
+
+
+ <figure id="test-mouse-daemon">
+ <title>测试鼠标功能</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mouse6" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>鼠标指针可以在屏幕上移动,指明鼠标服务已经正常启用。那么请选择
+ &gui.yes; 按 <keycap>Enter</keycap>键。否则鼠标没
+ 有配置成功 &mdash; 选择 &gui.no; 并尝试不同的配置
+ 选项。</para>
+
+ <para>选择 <guimenuitem>Exit</guimenuitem> 并按
+ <keycap>Enter</keycap> 退回到系统安装完成后的配置画面。</para>
+ </sect2>
+
+ <sect2 id="network-services">
+ <title>配置额外的网络服务</title>
+
+ <para>配置网络服务总是让那些新手敬畏,因为他们缺乏在这个领域应有的基础知识。
+ 网络,包括因特网有许多关于现代操作系统包括 &os;;的评论文章。这些文章对于
+ 理解&os;拥有的广泛的网络性能是非常有帮助的。在安装这些服务的过程中也能让
+ 用户理解它们可用的各种服务。</para>
+
+ <para>网络服务是一些可以使在网络的任何人来访问您提供的服务的程序。有许多
+ 努力想使这些程序不会有任何的 <quote>伤害</quote>。不幸的是,这些程序并
+ 不是十全十美的,黑客可能会掌握程序中的一些露洞来进行功击。只启用一些您
+ 熟悉的和需要的服务十分重要。如果您存在一些疑虑或没有启用这些服务的必要
+ 那么最好不要使用这些服务。您可以事后通过运行
+ <application>sysinstall</application> 程序或使用
+ <filename>/etc/rc.conf</filename> 配置文件来启用它们。</para>
+
+ <para>选择 <quote>Networking</quote> 选项将下显示一个类似下面的菜单:</para>
+
+ <figure id="network-configuration">
+ <title>网络配置之上层配置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/net-config-menu1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>第一个选项,<guimenuitem>Interfaces</guimenuitem>,
+ 已经在前面 <xref linkend="inst-network-dev"> 中讨论过,因此这里可以略过。</para>
+
+ <para>选择 <guimenuitem>AMD</guimenuitem> 选项,添加 <acronym>BSD</acronym>
+ 对自动挂接程序的支持。这个程序和<acronym>NFS</acronym> 协议一起使用
+ 不需要经过特别的设置就可以自动挂接远程文件系统。</para>
+
+ <para>下一行是 <guimenuitem>AMD Flags</guimenuitem> 的参数选项。当您选择后,会弹出一个
+ 子菜单来让您选择 <acronym>AMD</acronym> 的参数。菜单中包含一系列的选项:</para>
+
+ <screen>-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map</screen>
+
+ <para><option>-a</option> 选项用来设置默认的挂接位置,这里使用的是
+ <filename>/.amd_mnt</filename>目录。 <option>-l</option>
+ 指定默认的 <filename>日志</filename> 文件;但是,当
+ <literal>syslogd</literal> 被指定用来接收所有的日志时,那么它们会被送到
+ 系统日志程序。<filename role="directory">/host</filename> 被用来挂接远程
+ 主机输出的一个文件系统,例子中<filename role="directory">/net</filename>
+ 目录被用来挂接从<acronym>IP</acronym>输出的一个文件系统。
+ <filename>/etc/amd.map</filename> 文件定义了 <acronym>AMD</acronym> 的默认
+ 输出选项。</para>
+
+ <para><guimenuitem>Anon FTP</guimenuitem> 允许匿名 <acronym>FTP</acronym> 访问。
+ 选中这个选项,可以使这台机器成为一台匿名 <acronym>FTP</acronym> 服务器。
+ 要注意启用这个选项的安全风险。其它的菜单将说明一些安全问题和更深入的配置。</para>
+
+ <para><guimenuitem>Gateway</guimenuitem> 配置菜单可以使本机器成为一台以前我们提到过
+ 的网关。如果您在安装过程中偶尔选中了它,也可以在这里选中这个选项来取消。</para>
+
+ <para> <guimenuitem>Inetd</guimenuitem> 选项用来配置或完全禁止我们在上面讨论的
+ &man.inetd.8; 守护程序。</para>
+
+ <para> <guimenuitem>Mail</guimenuitem> 可以用来配置系统默认的 <acronym>MTA</acronym>
+ 或邮件传输代理。选择这个选项将了出现下面的菜单:</para>
+
+ <figure id="mta-selection">
+ <title>选择默认的 MTA</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mta-main" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>这里给您提供了一个安装默认<acronym>MTA</acronym> 的机会。
+ <acronym>MTA</acronym> 用来投递本系统上用户邮件到因特网去。</para>
+
+ <para>选择 <guimenuitem>Sendmail</guimenuitem> 将会安装 &os;默认的
+ 流行的的 <application>sendmail</application> 服务程序。
+ <guimenuitem>Sendmail local</guimenuitem> 选项用来设置<application>sendmail</application>
+ 默认的<acronym>MTA</acronym>,也可以禁止它从Internet接收邮件的能力。
+ 还有其它的一些选项如:
+ <guimenuitem>Postfix</guimenuitem> 和
+ <guimenuitem>Exim</guimenuitem> 都类似于
+ <guimenuitem>Sendmail</guimenuitem>的角色。它们两者也可以投递邮件;
+ 有些用户更喜欢选择使用<application>Sendmail</application>、
+ <acronym>MTA</acronym>二者之一。</para>
+
+ <para>选择 <acronym>MTA</acronym>或不选择它之后,网络配置菜单的下一
+ 个选项是 <guimenuitem>NFS client</guimenuitem> 客房端程序。</para>
+
+ <para> <guimenuitem>NFS client</guimenuitem> 客房端可以使系统通过 <acronym>NFS</acronym>
+ 与服务器进行通信。
+ <acronym>NFS</acronym> 服务器通过<acronym>NFS</acronym>
+ 协议可以使其它在网络上的机器来访问自己的文件系统。如果这台机器要作为一台
+ 独立的服务器,这个选项可以保留不选。下面可能还有更多的配置,关于客户端和
+ 服务器的配置请参阅<xref linkend="network-nfs"> 一节。</para>
+
+ <para>接下来的 <acronym>NFS</acronym> 服务器选项,可以允许您把系统设备成
+ 为一台<acronym>NFS</acronym> 服务器。这需要更多的信息来启动远程过程调
+ 用( <acronym>RPC</acronym>)服务。 <acronym>RPC</acronym>用来连接调
+ 用两台机器上的程序。</para>
+
+ <para>下一项是 <guimenuitem>Ntpdate</guimenuitem> 选项,处理时间同步。当选择它后,
+ 会出现一个像下面所似的菜单:</para>
+
+ <figure id="Ntpdate-config">
+ <title>Ntpdate 配置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/ntp-config" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>从这个菜单选择一个离您最近的服务器。在您连接这台服务器时,除去
+ 连接时的反应时间,时间同步最精确的服务器。</para>
+
+ <para>下一个选项是 <acronym>PCNFSD</acronym> 。这个选项将从安装包中
+ 安装<filename role="package">net/pcnfsd</filename> 软件。这个程序
+ 能够为不能提供它们自己,例如微软的 &ms-dos; 操作系统提供
+ <acronym>NFS</acronym> 的认证服务。</para>
+
+ <para>滚屏到下一页看一下其它选项:</para>
+
+ <figure id="Network-configuration-cont">
+ <title>网络配置之下层配置</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/net-config-menu2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para> &man.rpcbind.8;,&man.rpc.statd.8;和&man.rpc.lockd.8;
+ 程序全都可以用来提供远程过程调用 (<acronym>RPC</acronym>)服务。
+ <command>rpcbind</command> 程序管理<acronym>NFS</acronym>
+ 服务器和客户端的通信,使<acronym>NFS</acronym> 执行正确的操作。
+ <application>rpc.statd</application>程序可以和其它主机上<application>rpc.statd</application>
+ 程序提供的状态监视进行交互。状态报告通常被保存在
+ <filename>/var/db/statd.status</filename> 文件里。最后的一项是
+ <guimenuitem>rpc.lockd</guimenuitem>选项,当选中这时,将提供文件锁定服务。
+ 它通常被用业通过<application>rpc.statd</application>来监视主机请求锁定什么文件和
+ 怎样频繁的访问它们。这最后的两项调试功能,可以需要
+ <acronym>NFS</acronym> 服务器和客户端的正常操作。</para>
+
+ <para>下一个项目是<guimenuitem>Routed</guimenuitem>,这是一个路由程序。
+ &man.routed.8; 程序管理网络路由表,发现多播路由,并且支持在网络上
+ 与它物理相连的主机来拷贝它的路由表的请求。它被广泛的应用在本地
+ 网络中并扮演关网关的角色。
+ 当选择它后,一个子菜单会来询问您这个程序的默认位置。默认的位置已经
+ 被定义过,您可以选择 <keycap>Enter</keycap> 键,您也可以按下其它的键。
+ 这时会出来另一个菜单来询问您传递给 <command>routed</command>程序的参数。
+ 默认的是 <option>-q</option> 参数。</para>
+
+ <para>接下来是 <guimenuitem>Rwhod</guimenuitem> 选项,选中它会启用 &man.rwhod.8; 程序
+ 在系统初时化的时候。 <command>rwhod</command>程序通过网络周期性的广播系统
+ 信息或以<quote>客户</quote>的身份来收集这些信息。更多的信息可以查看
+ &man.ruptime.1; 和&man.rwho.1; 手册页。</para>
+
+ <para>倒数第二个选项是&man.sshd.8; 程序。它可以通过使用
+ <application>OpenSSH</application>来提供安全的shell服务,我们推荐通过
+ 使用它来使用 <application>telnet</application> 和 <acronym>FTP</acronym> 服务。
+ <application>sshd</application>服务通过使用加密技术来创建从一台机器到另一台机
+ 器的安全连接。</para>
+
+ <para>最后有一个 <guimenuitem>TCP</guimenuitem> 扩展选项。这可以用来扩展在
+ <acronym>RFC</acronym>&nbsp;1323 和<acronym>RFC</acronym>&nbsp;1644
+ 里定义的<acronym>TCP</acronym> 功能。当许多主机以高速连接本机时,可
+ 能会引起某些连接被丢弃。我们不推荐使用这个选项,但是当使用独立的主机
+ 时可以从它上面得到一些好处。</para>
+
+ <para>现在您已经配置完成了网络服务,您可以滚动屏幕到顶部选择 <guimenuitem>Exit</guimenuitem>
+ 项,退出进入下一个配置部分。</para>
+
+ </sect2>
+
+ <sect2 id="x-server">
+ <title>配置 X Server</title>
+
+ <para>为了使用图形化用户界面,例如<application>KDE</application>,
+ <application>GNOME</application>,或其它窗口管理程序,您必须
+ 配置 X server 。</para>
+
+ <note>
+ <para>为了以非<username>root</username>用户运行
+ <application>&xfree86;</application> 您必须安装
+ <filename role="package">x11/wrapper</filename> 软件。在FreeBSD 4.7及以上
+ 版本是默认安装的,但以前的版本要手工安装到系统中。</para>
+ </note>
+
+ <para>要知道您的显卡是否被支持,请参考
+ <ulink url="http://www.xfree86.org/">&xfree86;</ulink> 网站。</para>
+
+ <screen> User Confirmation Requested
+ Would you like to configure your X server at this time?
+
+ [ Yes ] No</screen>
+
+ <warning>
+ <para>您必须知道您的显示器及显卡的制造规格。如果配置有误,有可能造成设备
+ 损毁。如果您手边没有这样的信息,请选择
+ &gui.no; 并且等到您有这些信息后再执行
+ <command>/stand/sysinstall</command>程序,选择
+ <guimenuitem>Configure</guimenuitem> 下的
+ <guimenuitem>XFree86</guimenuitem>来配置。这时如果配置X server
+ 不正确的话系统会出现锁死。建议在安装完毕后再配置X server。</para>
+ </warning>
+
+ <para>如果您有显卡和显示器的信息,请选择
+ &gui.yes; 并按 <keycap>Enter</keycap>
+ 来配置 X-server。</para>
+
+ <figure id="xserver2">
+ <title>选择配置方法菜单</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/xf86setup" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>您可以通过许多方法来配置 X server。在认真读了所有的说明后,
+ 请使用方向键来选择一种配置方式,并按<keycap>Enter</keycap>。
+ 键确认。</para>
+
+ <para><application>xf86cfg</application> 和
+ <application>xf86cfg -textmode</application> 配置方法可能会使屏幕黑屏一会
+ 过一会即会启动。要有耐心。</para>
+
+
+ <para>下面将介绍<application>xf86config</application> 配置工具。
+ 根据系统硬件的不同,下面的信息可能会适当的发生变动:</para>
+
+ <screen> Message
+ You have configured and been running the mouse daemon.
+ Choose "/dev/sysmouse" as the mouse port and "SysMouse" or
+ "MouseSystems" as the mouse protocol in the X configuration utility.
+
+ [ OK ]
+
+ [ Press enter to continue ]</screen>
+
+ <para>这个信息指明,前面配置的鼠标驱动程序被检测到。按
+ <keycap>Enter</keycap> 键继续。</para>
+
+ <para>启动 <application>xf86config</application> 后会显示一个简单的说明:</para>
+
+ <screen>This program will create a basic XF86Config file, based on menu selections you
+make.
+
+The XF86Config file usually resides in /usr/X11R6/etc/X11 or /etc/X11. A sample
+XF86Config file is supplied with XFree86; it is configured for a standard
+VGA card and monitor with 640x480 resolution. This program will ask for a
+pathname when it is ready to write the file.
+
+You can either take the sample XF86Config as a base and edit it for your
+configuration, or let this program produce a base XF86Config file for your
+configuration and fine-tune it.
+
+Before continuing with this program, make sure you know what video card
+you have, and preferably also the chipset it uses and the amount of video
+memory on your video card. SuperProbe may be able to help with this.
+
+Press enter to continue, or ctrl-c to abort.</screen>
+
+ <para>按 <keycap>Enter</keycap> 将启动鼠标配置。请按照指示选择
+ <quote>Mouse Systems</quote> 作为鼠标协议,
+ <filename>/dev/sysmouse</filename> 作为鼠标端口。下面的例子
+ 向您说明的是使用一个 PS/2 鼠标:</para>
+
+ <screen>First specify a mouse protocol type. Choose one from the following list:
+
+ 1. Microsoft compatible (2-button protocol)
+ 2. Mouse Systems (3-button protocol) & FreeBSD moused protocol
+ 3. Bus Mouse
+ 4. PS/2 Mouse
+ 5. Logitech Mouse (serial, old type, Logitech protocol)
+ 6. Logitech MouseMan (Microsoft compatible)
+ 7. MM Series
+ 8. MM HitTablet
+ 9. Microsoft IntelliMouse
+
+If you have a two-button mouse, it is most likely of type 1, and if you have
+a three-button mouse, it can probably support both protocol 1 and 2. There are
+two main varieties of the latter type: mice with a switch to select the
+protocol, and mice that default to 1 and require a button to be held at
+boot-time to select protocol 2. Some mice can be convinced to do 2 by sending
+a special sequence to the serial port (see the ClearDTR/ClearRTS options).
+
+Enter a protocol number: 2
+
+You have selected a Mouse Systems protocol mouse. If your mouse is normally
+in Microsoft-compatible mode, enabling the ClearDTR and ClearRTS options
+may cause it to switch to Mouse Systems mode when the server starts.
+
+Please answer the following question with either 'y' or 'n'.
+Do you want to enable ClearDTR and ClearRTS? n
+
+You have selected a three-button mouse protocol. It is recommended that you
+do not enable Emulate3Buttons, unless the third button doesn't work.
+
+Please answer the following question with either 'y' or 'n'.
+Do you want to enable Emulate3Buttons? y
+
+Now give the full device name that the mouse is connected to, for example
+/dev/tty00. Just pressing enter will use the default, /dev/mouse.
+On FreeBSD, the default is /dev/sysmouse.
+
+Mouse device: /dev/sysmouse</screen>
+
+ <para>下一个要配置的项目是键盘。在例子中使用的键盘一般是101-key 。您可以选择不
+ 同的键盘类型或直接按 <keycap>Enter</keycap> 键来使用默认配置。</para>
+
+ <screen>Please select one of the following keyboard types that is the better
+description of your keyboard. If nothing really matches,
+choose 1 (Generic 101-key PC)
+
+ 1 Generic 101-key PC
+ 2 Generic 102-key (Intl) PC
+ 3 Generic 104-key PC
+ 4 Generic 105-key (Intl) PC
+ 5 Dell 101-key PC
+ 6 Everex STEPnote
+ 7 Keytronic FlexPro
+ 8 Microsoft Natural
+ 9 Northgate OmniKey 101
+ 10 Winbook Model XP5
+ 11 Japanese 106-key
+ 12 PC-98xx Series
+ 13 Brazilian ABNT2
+ 14 HP Internet
+ 15 Logitech iTouch
+ 16 Logitech Cordless Desktop Pro
+ 17 Logitech Internet Keyboard
+ 18 Logitech Internet Navigator Keyboard
+ 19 Compaq Internet
+ 20 Microsoft Natural Pro
+ 21 Genius Comfy KB-16M
+ 22 IBM Rapid Access
+ 23 IBM Rapid Access II
+ 24 Chicony Internet Keyboard
+ 25 Dell Internet Keyboard
+
+Enter a number to choose the keyboard.
+
+1
+
+
+Please select the layout corresponding to your keyboard
+
+
+ 1 U.S. English
+ 2 U.S. English w/ ISO9995-3
+ 3 U.S. English w/ deadkeys
+ 4 Albanian
+ 5 Arabic
+ 6 Armenian
+ 7 Azerbaidjani
+ 8 Belarusian
+ 9 Belgian
+ 10 Bengali
+ 11 Brazilian
+ 12 Bulgarian
+ 13 Burmese
+ 14 Canadian
+ 15 Croatian
+ 16 Czech
+ 17 Czech (qwerty)
+ 18 Danish
+
+Enter a number to choose the country.
+Press enter for the next page
+
+1
+
+
+Please enter a variant name for 'us' layout. Or just press enter
+for default variant
+
+us
+
+
+Please answer the following question with either 'y' or 'n'.
+Do you want to select additional XKB options (group switcher,
+group indicator, etc.)? n</screen>
+
+ <para>接下来,我们要配置显示器。不要超过您显示器的刷新频率,这样可以
+ 会损坏您的显示器。如果您有疑问,请参考其它信息后再做配置。</para>
+
+ <screen>Now we want to set the specifications of the monitor. The two critical
+parameters are the vertical refresh rate, which is the rate at which the
+whole screen is refreshed, and most importantly the horizontal sync rate,
+which is the rate at which scanlines are displayed.
+
+The valid range for horizontal sync and vertical sync should be documented
+in the manual of your monitor. If in doubt, check the monitor database
+/usr/X11R6/lib/X11/doc/Monitors to see if your monitor is there.
+
+Press enter to continue, or ctrl-c to abort.
+
+
+
+You must indicate the horizontal sync range of your monitor. You can either
+select one of the predefined ranges below that correspond to industry-
+standard monitor types, or give a specific range.
+
+It is VERY IMPORTANT that you do not specify a monitor type with a horizontal
+sync range that is beyond the capabilities of your monitor. If in doubt,
+choose a conservative setting.
+
+ hsync in kHz; monitor type with characteristic modes
+ 1 31.5; Standard VGA, 640x480 @ 60 Hz
+ 2 31.5 - 35.1; Super VGA, 800x600 @ 56 Hz
+ 3 31.5, 35.5; 8514 Compatible, 1024x768 @ 87 Hz interlaced (no 800x600)
+ 4 31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Hz interlaced, 800x600 @ 56 Hz
+ 5 31.5 - 37.9; Extended Super VGA, 800x600 @ 60 Hz, 640x480 @ 72 Hz
+ 6 31.5 - 48.5; Non-Interlaced SVGA, 1024x768 @ 60 Hz, 800x600 @ 72 Hz
+ 7 31.5 - 57.0; High Frequency SVGA, 1024x768 @ 70 Hz
+ 8 31.5 - 64.3; Monitor that can do 1280x1024 @ 60 Hz
+ 9 31.5 - 79.0; Monitor that can do 1280x1024 @ 74 Hz
+10 31.5 - 82.0; Monitor that can do 1280x1024 @ 76 Hz
+11 Enter your own horizontal sync range
+
+Enter your choice (1-11): 6
+
+You must indicate the vertical sync range of your monitor. You can either
+select one of the predefined ranges below that correspond to industry-
+standard monitor types, or give a specific range. For interlaced modes,
+the number that counts is the high one (e.g. 87 Hz rather than 43 Hz).
+
+ 1 50-70
+ 2 50-90
+ 3 50-100
+ 4 40-150
+ 5 Enter your own vertical sync range
+
+Enter your choice: 2
+
+You must now enter a few identification/description strings, namely an
+identifier, a vendor name, and a model name. Just pressing enter will fill
+in default names.
+
+The strings are free-form, spaces are allowed.
+Enter an identifier for your monitor definition: Hitachi</screen>
+
+ <para>下一个配置是从显卡的驱动列表里选择一个显卡驱动程序。如果忽略
+ 当前列表中的选项,请直接按<keycap>Enter</keycap> 下一屏将会出现在屏幕上,
+ 会显示下面的信息:</para>
+
+ <screen>Now we must configure video card specific settings. At this point you can
+choose to make a selection out of a database of video card definitions.
+Because there can be variation in Ramdacs and clock generators even
+between cards of the same model, it is not sensible to blindly copy
+the settings (e.g. a Device section). For this reason, after you make a
+selection, you will still be asked about the components of the card, with
+the settings from the chosen database entry presented as a strong hint.
+
+The database entries include information about the chipset, what driver to
+run, the Ramdac and ClockChip, and comments that will be included in the
+Device section. However, a lot of definitions only hint about what driver
+to run (based on the chipset the card uses) and are untested.
+
+If you can't find your card in the database, there's nothing to worry about.
+You should only choose a database entry that is exactly the same model as
+your card; choosing one that looks similar is just a bad idea (e.g. a
+GemStone Snail 64 may be as different from a GemStone Snail 64+ in terms of
+hardware as can be).
+
+Do you want to look at the card database? y
+
+
+
+288 Matrox Millennium G200 8MB mgag200
+289 Matrox Millennium G200 SD 16MB mgag200
+290 Matrox Millennium G200 SD 4MB mgag200
+291 Matrox Millennium G200 SD 8MB mgag200
+292 Matrox Millennium G400 mgag400
+293 Matrox Millennium II 16MB mga2164w
+294 Matrox Millennium II 4MB mga2164w
+295 Matrox Millennium II 8MB mga2164w
+296 Matrox Mystique mga1064sg
+297 Matrox Mystique G200 16MB mgag200
+298 Matrox Mystique G200 4MB mgag200
+299 Matrox Mystique G200 8MB mgag200
+300 Matrox Productiva G100 4MB mgag100
+301 Matrox Productiva G100 8MB mgag100
+302 MediaGX mediagx
+303 MediaVision Proaxcel 128 ET6000
+304 Mirage Z-128 ET6000
+305 Miro CRYSTAL VRX Verite 1000
+
+Enter a number to choose the corresponding card definition.
+Press enter for the next page, q to continue configuration.
+
+288
+
+Your selected card definition:
+
+Identifier: Matrox Millennium G200 8MB
+Chipset: mgag200
+Driver: mga
+Do NOT probe clocks or use any Clocks line.
+
+Press enter to continue, or ctrl-c to abort.
+
+
+
+Now you must give information about your video card. This will be used for
+the "Device" section of your video card in XF86Config.
+
+You must indicate how much video memory you have. It is probably a good
+idea to use the same approximate amount as that detected by the server you
+intend to use. If you encounter problems that are due to the used server
+not supporting the amount memory you have (e.g. ATI Mach64 is limited to
+1024K with the SVGA server), specify the maximum amount supported by the
+server.
+
+How much video memory do you have on your video card:
+
+ 1 256K
+ 2 512K
+ 3 1024K
+ 4 2048K
+ 5 4096K
+ 6 Other
+
+Enter your choice: 6
+
+Amount of video memory in Kbytes: 8192
+
+You must now enter a few identification/description strings, namely an
+identifier, a vendor name, and a model name. Just pressing enter will fill
+in default names (possibly from a card definition).
+
+Your card definition is Matrox Millennium G200 8MB.
+
+The strings are free-form, spaces are allowed.
+Enter an identifier for your video card definition:</screen>
+
+ <para>接下来,设置显卡的分辨率。典型的使用范围是 640x480, 800x600,
+ 和 1024x768,这些显卡的功能特性、分辨率的大小以眼睛的舒适为准。
+ 当选择颜色深度时,可以选择您显卡支持最大模式。</para>
+
+ <screen>For each depth, a list of modes (resolutions) is defined. The default
+resolution that the server will start-up with will be the first listed
+mode that can be supported by the monitor and card.
+Currently it is set to:
+
+"640x480" "800x600" "1024x768" "1280x1024" for 8-bit
+"640x480" "800x600" "1024x768" "1280x1024" for 16-bit
+"640x480" "800x600" "1024x768" "1280x1024" for 24-bit
+
+Modes that cannot be supported due to monitor or clock constraints will
+be automatically skipped by the server.
+
+ 1 Change the modes for 8-bit (256 colors)
+ 2 Change the modes for 16-bit (32K/64K colors)
+ 3 Change the modes for 24-bit (24-bit color)
+ 4 The modes are OK, continue.
+
+Enter your choice: 2
+
+Select modes from the following list:
+
+ 1 "640x400"
+ 2 "640x480"
+ 3 "800x600"
+ 4 "1024x768"
+ 5 "1280x1024"
+ 6 "320x200"
+ 7 "320x240"
+ 8 "400x300"
+ 9 "1152x864"
+ a "1600x1200"
+ b "1800x1400"
+ c "512x384"
+
+Please type the digits corresponding to the modes that you want to select.
+For example, 432 selects "1024x768" "800x600" "640x480", with a
+default mode of 1024x768.
+
+Which modes? 432
+
+You can have a virtual screen (desktop), which is screen area that is larger
+than the physical screen and which is panned by moving the mouse to the edge
+of the screen. If you don't want virtual desktop at a certain resolution,
+you cannot have modes listed that are larger. Each color depth can have a
+differently-sized virtual screen
+
+Please answer the following question with either 'y' or 'n'.
+Do you want a virtual screen that is larger than the physical screen? n
+
+
+
+For each depth, a list of modes (resolutions) is defined. The default
+resolution that the server will start-up with will be the first listed
+mode that can be supported by the monitor and card.
+Currently it is set to:
+
+"640x480" "800x600" "1024x768" "1280x1024" for 8-bit
+"1024x768" "800x600" "640x480" for 16-bit
+"640x480" "800x600" "1024x768" "1280x1024" for 24-bit
+
+Modes that cannot be supported due to monitor or clock constraints will
+be automatically skipped by the server.
+
+ 1 Change the modes for 8-bit (256 colors)
+ 2 Change the modes for 16-bit (32K/64K colors)
+ 3 Change the modes for 24-bit (24-bit color)
+ 4 The modes are OK, continue.
+
+Enter your choice: 4
+
+
+
+Please specify which color depth you want to use by default:
+
+ 1 1 bit (monochrome)
+ 2 4 bits (16 colors)
+ 3 8 bits (256 colors)
+ 4 16 bits (65536 colors)
+ 5 24 bits (16 million colors)
+
+Enter a number to choose the default depth.
+
+4</screen>
+
+ <para>最后,要保存您的配置,确定输入 <filename>/etc/XF86Config</filename>
+ 作为保存位置。</para>
+
+ <screen>I am going to write the XF86Config file now. Make sure you don't accidently
+overwrite a previously configured one.
+
+Shall I write it to /etc/X11/XF86Config? y</screen>
+
+ <para>如果您配置失败,您也可以尝试着按 &gui.yes; 来
+ 重新再试一次,会显示下面的信息:</para>
+
+ <screen> User Confirmation Requested
+The XFree86 configuration process seems to have
+failed. Would you like to try again?
+
+ [ Yes ] No</screen>
+
+ <para>如果配置 <application>&xfree86;</application>时遇上困难,请选择
+ &gui.no; 并按 <keycap>Enter</keycap>键继续
+ 进行安装。安装完成后可以使用 <command>xf86cfg -textmode</command> 或
+ <command>xf86config</command> 命令行配置程序来以 <username>root</username>
+ 用户的身份进行配置。配置 <application>&xfree86;</application> 的另外一种方法
+ 描述在 <xref linkend="x11">。如果您选择不配置<application>&xfree86;</application>
+ 那么下一个菜单将让您选择要安装的软件包。</para>
+
+ <para>默认情况下可以使用组合键 <keycombo action='simul'>
+ <keycap>Ctrl</keycap><keycap>Alt</keycap>
+ <keycap>Backspace</keycap></keycombo>,在发生错误或在硬件损坏前退出
+ 设置屏幕。</para>
+
+ <para>默认的显示模式可以使用X系统下的
+ <keycombo action='simul'>
+ <keycap>Ctrl</keycap><keycap>Alt</keycap><keycap>+</keycap>
+ </keycombo> 或
+ <keycombo action='simul'>
+ <keycap>Ctrl</keycap><keycap>Alt</keycap><keycap>-</keycap>
+ </keycombo>来改变。
+ </para>
+
+ <para>一旦有了可以运行的 <application>&xfree86;</application>,
+ 就可以使用 <application>xvidtune</application> 来调整显示的高度和宽度以及显示器的中心位置。</para>
+
+ <para>一些不适当的配置可能会损坏您的设备。如果在使用它们前存在疑虑,请不要
+ 安装它们。可以使用监视器的控制工具来调整X窗口的显示。与文本显示模式不同
+ 它更容易损坏设备。</para>
+
+ <para>在调整这些参数前,请阅读 &man.xvidtune.1; 手册。</para>
+
+ <para>下面是一个配置 <application>&xfree86;</application> 的成功例子,它选择了
+ 使用默认的桌面。</para>
+ </sect2>
+
+ <sect2 id="default-desktop">
+ <title>选择默认的桌面</title>
+
+ <para>有许多窗口管理器可以使用。它们从基本的桌面环境到全部的桌面应用,是
+ 一个大型的软件集。一些人可能只希望使用一些占用磁盘空间少,内存低的窗口
+ 管理器;而另外一些人则更倾向于使用有便多特性的桌面环境。选择使用那种桌
+ 面的最好的方法就是尝试着试用一些不同的桌面环境。这些桌面都可以在安装
+ 完成后通过ports收集或包管理器来进行安装。</para>
+
+ <para>您可以选择一个流行的桌面配置成为默认的桌面,可以使您在安装完
+ 成后立刻启动它。</para>
+
+ <figure id="x-desktop">
+ <title>选择默认桌面</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/desktop" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>使用箭头选择一个桌面,然后键入<keycap>Enter</keycap>键。选择的桌面将被
+ 安装。</para>
+ </sect2>
+
+ <sect2 id="packages">
+ <title>安装软件包</title>
+
+ <para>这些软件包已经被预编译成二进制程序了,安装软件有一个很简单的方法。</para>
+
+ <para>为了说明问题,这里给您做了一个怎样来安装软件包的范例,额外的软件包
+ 也可以在这时安装。您也可以在安装结束后使用
+ <command>/stand/sysinstall</command> 程序来安装软件包。</para>
+
+ <screen> User Confirmation Requested
+ The FreeBSD package collection is a collection of hundreds of
+ ready-to-run applications, from text editors to games to WEB servers
+ and more. Would you like to browse the collection now?
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 按<keycap>Enter</keycap>
+ 将会显示软件包选择屏幕。</para>
+
+ <figure id="package-category">
+ <title>选择软件所的种类</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/pkg-cat" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>在任何时候只有安装介质上有的软件包才能被安装进系统。</para>
+
+ <para>如果选择<guimenuitem>All</guimenuitem> 那么所有的软件包将会被显示,您也
+ 可以选择一个特殊的分类。使用箭头进行选择,然后键入 <keycap>Enter</keycap>。</para>
+
+ <para>一个菜单将会显示这个分类中可用的所有软件包。</para>
+
+ <figure id="package-select">
+ <title>选择软件包</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/pkg-sel" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para> <application>bash</application> shell 被选中了。通过在加亮的软件
+ 上键入<keycap>Space</keycap> 键,来选择您想要的软件所。每个选择的软件
+ 包的简短描述都会显示在屏幕左下脚。</para>
+
+ <para>按 <keycap>Tab</keycap> 键选择 &gui.ok;或 &gui.cancel;。</para>
+
+ <para>当您完成了安装标记之后,键入 <keycap>Tab</keycap> 键选择 &gui.ok;
+ 然后键入<keycap>Enter</keycap> 返回软件包选择菜单。</para>
+
+ <para>左右箭头键也可以用来选择 &gui.ok;和 &gui.cancel;。用这种方法也可以
+ 用 &gui.ok; 然后按 <keycap>Enter</keycap> 来返回软件包选择菜单。</para>
+
+ <figure id="package-install">
+ <title>安装软件包</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/pkg-install" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>使用 <keycap>Tab</keycap> 和箭头键来选择 <guibutton>[&nbsp;Install&nbsp;]</guibutton>
+ 然后键入 <keycap>Enter</keycap>。您接着需要确定您要安装的软件包。</para>
+
+ <figure id="package-install-confirm">
+ <title>确认安装的软件包</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/pkg-confirm" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择 &gui.ok; 然后键入<keycap>Enter</keycap> 键将开始软件的安装,
+ 安装信息将会不断地出现。如果有一些错误信息,请作好记录。</para>
+
+ <para>安装完成之后,继续最后的配置。如果您不想安装任何软件包并退回到
+ 最终配置屏幕,请选择<guibutton>Install</guibutton> 。</para>
+ </sect2>
+
+ <sect2 id="addusers">
+ <title>添加用户/组</title>
+
+ <para>您至少要在安装过程中添加一个用户,以便于您能不用<username>root</username>
+ 来登陆使用系统。根分区通常比较小,用 <username>root</username> 来运行应用程序
+ 可能会快一点。但这样会有一些危险:</para>
+
+ <screen> User Confirmation Requested
+ Would you like to add any initial user accounts to the system? Adding
+ at least one account for yourself at this stage is suggested since
+ working as the "root" user is dangerous (it is easy to do things which
+ adversely affect the entire system).
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 然后键入<keycap>Enter</keycap> 继续添加用户。</para>
+
+ <figure id="add-user2">
+ <title>选择用户</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/adduser1" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>用箭头键来选择 <guimenuitem>User</guimenuitem> 然后按
+ <keycap>Enter</keycap>。</para>
+
+ <figure id="add-user3">
+ <title>添加用户信息</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/adduser2" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>下面的描述信息会出现在屏幕的下方,可以使用 <keycap>Tab</keycap>
+ 键来切换不同的项目,以便输入相关信息:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>Login ID</term>
+
+ <listitem>
+ <para>新用户的登陆名(强制性必须写)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>UID</term>
+
+ <listitem>
+ <para>这个用户的ID编号(如果不写,系统自动添加)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Group</term>
+
+ <listitem>
+ <para>这个用户的登陆组名(如果不写,系统自动添加)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Password</term>
+
+ <listitem>
+ <para>这个用户的密码(键入这个需要很仔细!)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Full name</term>
+
+ <listitem>
+ <para>用户的全名(解释、备注)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Member groups</term>
+
+ <listitem>
+ <para>这个用户所在的组</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Home directory</term>
+
+ <listitem>
+ <para>用户的主目录(如果不写,系统自动添加)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Login shell</term>
+ <listitem>
+ <para>用户登陆的shell(默认是<filename>/bin/sh</filename>)。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>登陆的shell可以在 <filename>/bin/sh</filename> 到
+ <filename>/usr/local/bin/bash</filename> 中修改。
+ <application>bash</application> shell 是先前默认安装的shell。
+ 不要使用一个不存在的或您不能登陆的shell。最通用的shell是使用
+ BSD-world 的 C shell,可以通过指定<filename>/bin/tcsh</filename>来修改。</para>
+
+ <para>用户也可以被添加到 <groupname>wheel</groupname> 组中成了一个超级用户,
+ 从而拥有 <username>root</username>权限。</para>
+
+ <para>当您感觉满意时,键入 &gui.ok; 键,用户和组管理菜单将会重新出现。</para>
+
+ <figure id="add-user4">
+ <title>退出用户和组管理</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/adduser3" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>因特殊需要的组也可以在此时进行添加,也可以在安装完成后使用
+ <filename>/stand/sysinstall</filename> 来完成。</para>
+
+ <para>当您完成添加用户的时候,选择<guimenuitem>Exit</guimenuitem>
+ 然后键入<keycap>Enter</keycap> 继续下面的安装。</para>
+ </sect2>
+
+ <sect2 id="rootpass">
+ <title>设置 <username>root</username> 密码</title>
+
+ <screen> Message
+ Now you must set the system manager's password.
+ This is the password you'll use to log in as "root".
+
+ [ OK ]
+
+ [ Press enter to continue ]</screen>
+
+ <para>键入 <keycap>Enter</keycap> 来设置 <username>root</username>
+ 密码。</para>
+
+ <para>密码必须正确地输入两次。</para>
+
+ <screen>Changing local password for root.
+New password :
+Retype new password :</screen>
+
+ <para>密码成功键入后,安装将继续。</para>
+ </sect2>
+
+ <sect2 id="exit-inst">
+ <title>退出安装</title>
+
+ <para>如果您需要配置额外的网络设备或要做其它的配置,您可以在这时或以后
+ 通过 <filename>/stand/sysinstall</filename>来安装。</para>
+
+ <screen> User Confirmation Requested
+ Visit the general configuration menu for a chance to set any last
+ options?
+
+ Yes [ No ]</screen>
+
+ <para>选择 &gui.no; 然后键入 <keycap>Enter</keycap>
+ 返回到主安装菜单。</para>
+
+ <figure id="final-main">
+ <title>退出安装</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="install/mainexit" format="PNG">
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>选择 <guibutton>[X Exit Install]</guibutton> 然后键入
+ <keycap>Enter</keycap>。您可能需要确认是否真的退出安装:</para>
+
+ <screen> User Confirmation Requested
+ Are you sure you wish to exit? The system will reboot (be sure to
+ remove any floppies from the drives).
+
+ [ Yes ] No</screen>
+
+ <para>选择 &gui.yes; 取出软盘。CDROM驱动器将被锁定,
+ 直到机器重新启动。CDROM然后就可以从驱动器中取出来了。</para>
+
+ <para>在系统重新启动的时候可能会见到出错信息。</para>
+ </sect2>
+
+ <sect2 id="freebsdboot">
+ <title>FreeBSD的启动</title>
+
+ <sect3 id="freebsdboot-i386">
+ <title>FreeBSD 在 &i386;上启动</title>
+
+ <para>如果启动正常,您将看到在屏幕上有很多信息滚动,最后您会看到登陆命令行。
+ 您可以通过键入 <keycap>Scroll-Lock</keycap>和使用 <keycap>PgUp</keycap>
+ 与 <keycap>PgDn</keycap>来查看信息,再键入 <keycap>Scroll-Lock</keycap>
+ 回到命令行。</para>
+
+ <para>记录信息可能不会显示(缓冲区的限制)。您可以通过键入
+ <command>dmesg</command> 来查看。</para>
+
+ <para>使用您在安装过程中设置的用户名/密码来登陆。(例子中使用
+ <username>rpratt</username>)。除非必须的时候请不要用
+ <username>root</username> 用户登陆。</para>
+
+ <para>典型的启动信息:(忽略版本信息)</para>
+
+<screen>Copyright (c) 1992-2002 The FreeBSD Project.
+Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+
+Timecounter "i8254" frequency 1193182 Hz
+CPU: AMD-K6(tm) 3D processor (300.68-MHz 586-class CPU)
+ Origin = "AuthenticAMD" Id = 0x580 Stepping = 0
+ Features=0x8001bf&lt;FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX&gt;
+ AMD Features=0x80000800&lt;SYSCALL,3DNow!&gt;
+real memory = 268435456 (262144K bytes)
+config&gt; di sn0
+config&gt; di lnc0
+config&gt; di le0
+config&gt; di ie0
+config&gt; di fe0
+config&gt; di cs0
+config&gt; di bt0
+config&gt; di aic0
+config&gt; di aha0
+config&gt; di adv0
+config&gt; q
+avail memory = 256311296 (250304K bytes)
+Preloaded elf kernel "kernel" at 0xc0491000.
+Preloaded userconfig_script "/boot/kernel.conf" at 0xc049109c.
+md0: Malloc disk
+Using $PIR table, 4 entries at 0xc00fde60
+npx0: &lt;math processor&gt; on motherboard
+npx0: INT 16 interface
+pcib0: &lt;Host to PCI bridge&gt; on motherboard
+pci0: &lt;PCI bus&gt; on pcib0
+pcib1: &lt;VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge&gt; at device 1.0 on pci0
+pci1: &lt;PCI bus&gt; on pcib1
+pci1: &lt;Matrox MGA G200 AGP graphics accelerator&gt; at 0.0 irq 11
+isab0: &lt;VIA 82C586 PCI-ISA bridge&gt; at device 7.0 on pci0
+isa0: &lt;ISA bus&gt; on isab0
+atapci0: &lt;VIA 82C586 ATA33 controller&gt; port 0xe000-0xe00f at device 7.1 on pci0
+ata0: at 0x1f0 irq 14 on atapci0
+ata1: at 0x170 irq 15 on atapci0
+uhci0: &lt;VIA 83C572 USB controller&gt; port 0xe400-0xe41f irq 10 at device 7.2 on pci0
+usb0: &lt;VIA 83C572 USB controller&gt; on uhci0
+usb0: USB revision 1.0
+uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
+uhub0: 2 ports with 2 removable, self powered
+chip1: &lt;VIA 82C586B ACPI interface&gt; at device 7.3 on pci0
+ed0: &lt;NE2000 PCI Ethernet (RealTek 8029)&gt; port 0xe800-0xe81f irq 9 at
+device 10.0 on pci0
+ed0: address 52:54:05:de:73:1b, type NE2000 (16 bit)
+isa0: too many dependant configs (8)
+isa0: unexpected small tag 14
+fdc0: &lt;NEC 72065B or clone&gt; at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
+fdc0: FIFO enabled, 8 bytes threshold
+fd0: &lt;1440-KB 3.5" drive&gt; on fdc0 drive 0
+atkbdc0: &lt;keyboard controller (i8042)&gt; at port 0x60-0x64 on isa0
+atkbd0: &lt;AT Keyboard&gt; flags 0x1 irq 1 on atkbdc0
+kbd0 at atkbd0
+psm0: &lt;PS/2 Mouse&gt; irq 12 on atkbdc0
+psm0: model Generic PS/2 mouse, device ID 0
+vga0: &lt;Generic ISA VGA&gt; at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
+sc0: &lt;System console&gt; at flags 0x1 on isa0
+sc0: VGA &lt;16 virtual consoles, flags=0x300&gt;
+sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
+sio0: type 16550A
+sio1 at port 0x2f8-0x2ff irq 3 on isa0
+sio1: type 16550A
+ppc0: &lt;Parallel port&gt; at port 0x378-0x37f irq 7 on isa0
+ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
+ppc0: FIFO with 16/16/15 bytes threshold
+ppbus0: IEEE1284 device found /NIBBLE
+Probing for PnP devices on ppbus0:
+plip0: &lt;PLIP network interface&gt; on ppbus0
+lpt0: &lt;Printer&gt; on ppbus0
+lpt0: Interrupt-driven port
+ppi0: &lt;Parallel I/O&gt; on ppbus0
+ad0: 8063MB &lt;IBM-DHEA-38451&gt; [16383/16/63] at ata0-master using UDMA33
+ad2: 8063MB &lt;IBM-DHEA-38451&gt; [16383/16/63] at ata1-master using UDMA33
+acd0: CDROM &lt;DELTA OTC-H101/ST3 F/W by OIPD&gt; at ata0-slave using PIO4
+Mounting root from ufs:/dev/ad0s1a
+swapon: adding /dev/ad0s1b as swap device
+Automatic boot in progress...
+/dev/ad0s1a: FILESYSTEM CLEAN; SKIPPING CHECKS
+/dev/ad0s1a: clean, 48752 free (552 frags, 6025 blocks, 0.9% fragmentation)
+/dev/ad0s1f: FILESYSTEM CLEAN; SKIPPING CHECKS
+/dev/ad0s1f: clean, 128997 free (21 frags, 16122 blocks, 0.0% fragmentation)
+/dev/ad0s1g: FILESYSTEM CLEAN; SKIPPING CHECKS
+/dev/ad0s1g: clean, 3036299 free (43175 frags, 374073 blocks, 1.3% fragmentation)
+/dev/ad0s1e: filesystem CLEAN; SKIPPING CHECKS
+/dev/ad0s1e: clean, 128193 free (17 frags, 16022 blocks, 0.0% fragmentation)
+Doing initial network setup: hostname.
+ed0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
+ inet6 fe80::5054::5ff::fede:731b%ed0 prefixlen 64 tentative scopeid 0x1
+ ether 52:54:05:de:73:1b
+lo0: flags=8049&lt;UP,LOOPBACK,RUNNING,MULTICAST&gt; mtu 16384
+ inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
+ inet6 ::1 prefixlen 128
+ inet 127.0.0.1 netmask 0xff000000
+Additional routing options: IP gateway=YES TCP keepalive=YES
+routing daemons:.
+additional daemons: syslogd.
+Doing additional network setup:.
+Starting final network daemons: creating ssh RSA host key
+Generating public/private rsa1 key pair.
+Your identification has been saved in /etc/ssh/ssh_host_key.
+Your public key has been saved in /etc/ssh/ssh_host_key.pub.
+The key fingerprint is:
+cd:76:89:16:69:0e:d0:6e:f8:66:d0:07:26:3c:7e:2d root@k6-2.example.com
+ creating ssh DSA host key
+Generating public/private dsa key pair.
+Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
+Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
+The key fingerprint is:
+f9:a1:a9:47:c4:ad:f9:8d:52:b8:b8:ff:8c:ad:2d:e6 root@k6-2.example.com.
+setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib
+/usr/local/lib
+a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout
+starting standard daemons: inetd cron sshd usbd sendmail.
+Initial rc.i386 initialization:.
+rc.i386 configuring syscons: blank_time screensaver moused.
+Additional ABI support: linux.
+Local package initialization:.
+Additional TCP options:.
+
+FreeBSD/i386 (k6-2.example.com) (ttyv0)
+
+login: rpratt
+Password:</screen>
+
+ <para>生成 RSA 和 DSA密钥在比较慢的机器上可能要花很长时间。这只是一个
+ 新安装后的首次启动,以后的启动会变得更快一点。</para>
+
+ <para>如果 X 服务器已经配置好了,默认的桌面也选择好了,就可以在命令行键入
+ <command>startx</command> 来启动视察环境。</para>
+
+ </sect3>
+
+ <sect3>
+ <title> FreeBSD 在 Alpha机器上启动</title>
+
+ <indexterm><primary>Alpha</primary></indexterm>
+
+ <para>一旦安装完成,您就可以键入下面的命令来启动FreeBSD:</para>
+
+ <screen>&gt;&gt;&gt;<userinput>BOOT DKC0</userinput></screen>
+
+ <para>这是从指定的固定硬件进行引导。如果要使 FreeBSD 下次能够自动启动,
+ 使用下面的命令:</para>
+
+ <screen><prompt>&gt;&gt;&gt;</prompt> <userinput>SET BOOT_OSFLAGS A</userinput>
+<prompt>&gt;&gt;&gt;</prompt> <userinput>SET BOOT_FILE ''</userinput>
+<prompt>&gt;&gt;&gt;</prompt> <userinput>SET BOOTDEF_DEV DKC0</userinput>
+<prompt>&gt;&gt;&gt;</prompt> <userinput>SET AUTO_ACTION BOOT</userinput></screen>
+
+ <para>启动信息跟启动 &i386;机器时差不多。(但不完全一样)</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="shutdown">
+ <title>FreeBSD 关机</title>
+
+ <para>正确的关闭操作系统是很重要的。不要仅仅关闭电源。首先,您需要成为一个超
+ 级用户,通过键入 <command>su</command> 命令来实现。然后输入
+ <username>root</username> 密码。这需要用户是 <groupname>wheel</groupname>
+ 组的一名成员。然后,以<username>root</username>键入
+ <command>shutdown -h now</command>命令。</para>
+
+ <screen>The operating system has halted.
+Please press any key to reboot.</screen>
+
+ <para>当shutdown命令发出后,屏幕上出现 <quote>Please press any key to reboot</quote>
+ 信息时,您就可以安全的关闭计算机了。如果按下任意一个键,计算机将重新启动。</para>
+
+ <para>您也能够使用
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>Alt</keycap>
+ <keycap>Del</keycap>
+ </keycombo>
+ 组合键来重新启动计算机,但是不推荐使用这个操作。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="install-supported-hardware">
+ <title>支持的硬件</title>
+
+ <indexterm><primary>hardware</primary></indexterm>
+ <para>FreeBSD当前可以广泛运行在ISA、VLB、EISA、PCI总线的PC上,包括
+ Inter,AMD,Cyrix或 NexGen <quote>x86</quote>系列的机器,还有一些
+ Compaq Alpha的机器。支持普通的 IDE 或 ESDI 驱动配置,各种SCSI控制器,
+ PCMCIA卡,USB设备,网卡和其它网络串口设备。FreeBSD也支持IBM微通道
+ (MCA)的总线结构。</para>
+
+ <para>每个发行版都会提供一个FreeBSD支持的硬件列表。您可以在名字叫做
+ <filename>HARDWARE.TXT</filename>的文件中找到。它可以在CDROM或FTP发行组件
+ 或<application>sysinstall</application>的文档菜单中找到。对于特定的架构,都
+ 有相应的硬件支持列表。也可以在FreeBSD的网站 <ulink
+ url="http://www.FreeBSD.org/releases/index.html">Release
+ Information</ulink> 找到更多的信息。</para>
+ </sect1>
+
+ <sect1 id="install-trouble">
+ <title>常见问题</title>
+
+ <indexterm>
+ <primary>安装</primary>
+ <secondary>常见问题</secondary>
+ </indexterm>
+ <para>下面将介绍一些在安装过程中常见的问题,像如何报告发生的问题,如何
+ 双重启动FreeBSD和 &ms-dos;。/para>
+
+ <sect2>
+ <title>当您遇到错误时,应该怎么做?</title>
+
+ <para>由于pc结构的限制,不可能100%的不出现问题,但是有些问题是您可以
+ 自己解决的。</para>
+
+ <para>先检查您的硬件,确保您的硬件被支持。</para>
+
+ <para>如果您的硬件能够被扶持,但还是会出问题,那就重新启动计算机。当出现
+ 内核配置信息的时候,重新配置一下硬件信息。因为绝大多数硬件的IRQ,淡IO地
+ 址,DMA通道都有它们的生产商预先进行默认配置。如果您的硬件已经重新装配了,
+ 就需要使用配置编辑器告诉FreeBSD到哪里去找相关信息。</para>
+
+ <para>如果某个设备配置好后,发现又有个设备出现错误。碰到这种情况,就当卸掉
+ 这个设备的驱动程序。</para>
+
+ <note>
+ <para>有些安装问题可以借助更新硬件的程序来解决,特别是主板的
+ <acronym>BIOS</acronym> 。大部分的主板制造商都会提供网站给用户下载新的
+ BIOS以及提供如何更新的说明。</para>
+
+ <para>也有许多制造商强烈建议,除非必要否则不要轻易更新
+ <acronym>BIOS</acronym> 。因为更新的过程<emphasis>可能</emphasis>
+ 会发生问题,进而损害<acronym>BIOS</acronym> 芯片。</para>
+ </note>
+
+ <warning>
+ <para>不要在安装中把您必需的驱动程序卸掉,如您的监视器<devicename>sc0</devicename>
+ 。如果安装中在修改守配置后,仍然会出现一些意想不到的情况,最好所配置文件恢复到原来
+ 的样子。把它重新启动,再试一下。</para>
+ </warning>
+
+ <para>在配置模式下,您可以:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>列出在内核中安装的设备驱动程序。</para>
+ </listitem>
+
+ <listitem>
+ <para>禁用不适合您机器的设备驱动程序。</para>
+ </listitem>
+
+ <listitem>
+ <para>通过驱动程序改变IRQ,DRQ和IO端口地址。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>调整内核与您的硬件设置一致之后,键入 <command>Q</command> ,以新的设置
+ 重新启动计算机。当FreeBSD安装完成之后,在配置模式下做的更改会一直存在,不需
+ 要在每次启动计算机时再重新设置。即使如此,有可能您会想建立一个定制内核使您
+ 的系统效率达到最好,可以看看以下的链接 <link
+ linkend="kernelconfig">custom kernel</link>。</para>
+ </sect2>
+
+ <sect2>
+ <title>处理 &ms-dos; 分区存在的问题</title>
+
+ <indexterm><primary>DOS</primary></indexterm>
+ <para>许多&os;的用户基于&microsoft; 的 <acronym>PC</acronym>
+ 上安装FreeBSD。以下是一些关于在这种系统中安装FreeBSD常会出现的问题。
+ &os; 中有一个<application>FIPS</application>的应用程序。这个工具程序可以在
+ 安装光盘的 <filename>tools</filename> 目录下找到或从<link linkend="mirrors">&os; 的镜像站点</link>下载。</para>
+
+ <para> <application>FIPS</application> 允许您将现有的 &ms-dos; 分区一分为二,保留原
+ 原有的分区,让您安装到空出来的分区上。您首先要用 &windows;的
+ <application>Disk Defragmenter</application>或
+ <application>Norton Disk Tools</application>来对 &ms-dos; 分区进行碎片整理。然后,
+ 就可以重新启动把<application>FIPS</application> 。 看一下安装菜单,估计一下大概需要
+ 多少安装空间。随后您就可以在新分区上重新引导安装 &os;请查阅
+ <guimenuitem>Distributions</guimenuitem> 菜单上您的安装类型需要多少空间。</para>
+
+ <para>有一个由PowerQuest公司生产的非常有用的工具。从
+ <ulink url="http://www.powerquest.com/">http://www.powerquest.com</ulink>网站上
+ 可以得到<application>&partitionmagic;</application>。这个工具的功能比
+ <application>FIPS</application>要强大。如果您经常要添加或删除操作系统,强烈建议
+ 您使用它。当然,它很贵。如果您只是想安装 &os; 的话, <application>FIPS</application>
+ 就已足够了。</para>
+ </sect2>
+
+ <sect2>
+ <title>使用 &ms-dos; 和 &windows; 文件系统</title>
+
+ <para>现在 &os; 还不支持经过<application>Double Space&trade;</application>
+ 应用程序压缩过的文件系统。因此其它的文件系统在被&os;访问其数据之前必须先
+ 解压缩。它可以通过运行位于 <guimenuitem>Start</guimenuitem>&gt;
+ <guimenuitem>Programs</guimenuitem> &gt;
+ <guimenuitem>System Tools</guimenuitem> menu中的
+ <application>Compression Agent</application>程序来实现。 </para>
+
+ <para>&os;可以支持基于 &ms-dos; 的文件系统。这要求您使用带参数的 &man.mount.msdos.8;
+ 命令 (在 &os; 5.X版本,相应的命令为 &man.mount.msdosfs.8;)
+ 最常使用的是:</para>
+
+ <screen>&prompt.root; <userinput>mount_msdos /dev/ad0s1 /mnt</userinput></screen>
+
+ <para>在此例子中, &ms-dos; 文件系统位于主硬盘的第一个分区。您的情况可能与引不同,
+ 查看命令 <command>dmesg</command>和 <command>mount</command> 的输出。它们应该
+ 可以让您得到足够的分区信息。</para>
+
+ <note><para> &ms-dos; 的扩展分区会被映射在 &os;分区的末尾。换句话说,分区号要大于
+ &os; 正在使用的分区号。例如,第一个 &ms-dos; 分区可能位于
+ <filename>/dev/ad0s1</filename>,&os; 分区可能位于
+ <filename>/dev/ad0s2</filename>,跟着是 &ms-dos; 的扩展分区位于
+ <filename>/dev/ad0s3</filename>。这可能会使您感觉迷茫。</para></note>
+
+ <para>NTFS 分区也可以通过类似 &man.mount.ntfs.8; 命令挂接在FreeBSD上。</para>
+ </sect2>
+
+ <sect2>
+ <title>Alpha 用户的问题与解答</title>
+
+ <indexterm><primary>Alpha</primary></indexterm>
+
+ <para>这节主要回答一些在Alpha系统上安装FreeBSD时经常问到的问题。</para>
+
+ <qandaset>
+ <qandaentry>
+ <question>
+ <para>我可以从 ARC 或 Alpha BIOS 控制台启动吗?</para>
+ </question>
+
+ <indexterm><primary>ARC</primary></indexterm>
+ <indexterm><primary>Alpha BIOS</primary></indexterm>
+ <indexterm><primary>SRM</primary></indexterm>
+
+ <answer>
+ <para>不行。 &os;,像Compaq Tru64 和 VMS,只能从SRM 控制台启动。</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>求救,我没有空间了!我需要删除每一样东西吗?</para>
+ </question>
+
+ <answer>
+ <para>不,这个时候不行。</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>我可以挂上 Compaq Tru64 或 VMS 的文件系统吗?</para>
+ </question>
+
+ <answer>
+ <para>不,这个时候不行。</para>
+ </answer>
+ </qandaentry>
+ </qandaset>
+ </sect2>
+ </sect1>
+
+ <sect1 id="install-advanced">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Valentino</firstname>
+ <surname>Vaschetto</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ <!-- May 2001 -->
+ </authorgroup>
+ </sect1info>
+
+ <title>高级安装指南</title>
+
+ <para>这节主要描述在一些特殊情况下如何安装FreeBSD。</para>
+
+ <sect2 id="headless-install">
+ <title>在一个没有显示器或键盘的系统上安装FreeBSD</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>headless (serial console)</secondary>
+ </indexterm>
+ <indexterm><primary>serial console</primary></indexterm>
+ <para>这种类型的安装叫做 <quote>headless install(无关安装)</quote>,
+ 因您正要安装FreeBSD的机器不是没带显示器,就是没有显卡。您可能会问那怎么安装?
+ 可以使用一个串行控制台。串行控制台基本上是使用另外一台机器来充当主显示设备
+ 和键盘。要这样做,只要执行下面的步骤:创建安装软件,请看 <xref
+ linkend="install-floppies">一节说明。</para>
+
+ <para>按下面的步骤,修改这些软盘用来引导进入一个串行控制台:</para>
+
+ <procedure>
+ <step>
+ <title>通过启动软盘来引导进入一个串行控制台</title>
+ <indexterm>
+ <primary><command>mount</command></primary>
+ </indexterm>
+ <para>如果您想用软盘,FreeBSD将进入它通常的安装模式。我们要把FreeBSD
+ 引导进入串行控制台,需要这样做,您必须使用 &man.mount.8;命令在FreeBSD系统
+ 上挂一<filename>kern.flp</filename>的那个软盘。</para>
+
+ <screen>&prompt.root; <userinput>mount /dev/fd0 /mnt</userinput></screen>
+
+ <para>现在您已经挂上了软盘,
+ 需要进入 <filename role="directory">/mnt</filename> 目录:</para>
+
+ <screen>&prompt.root; <userinput>cd /mnt</userinput></screen>
+
+ <para>这儿是您必须设置软盘引导进入串行控制台的地方。您必须制作一个包含
+ <literal>/boot/loader -h</literal>这行的叫做<filename>boot.config</filename>
+ 的文件。所有这些是为了给引导程序一个标记以引导进入串行控制台。</para>
+
+ <screen>&prompt.root; <userinput>echo "/boot/loader -h" > boot.config</userinput></screen>
+
+ <para>现在您已经正确配置好了软盘,您必须使用 &man.umount.8;
+ 命令卸下软盘。</para>
+
+ <screen>&prompt.root; <userinput>cd /</userinput>
+&prompt.root; <userinput>umount /mnt</userinput></screen>
+
+ <para>现在您可以从软盘驱动器中取出软盘了。</para>
+ </step>
+
+ <step>
+ <title>连接您的 null Modem 线</title>
+
+ <indexterm><primary>null modem cable</primary></indexterm>
+ <para>您现在需要一根<link linkend="term-cables-null">null modem线</link>来连接两台机器。
+ 只要连接两台机器的串口。
+ <emphasis>普通的串行线是不行的</emphasis>,您需要使用一根null modem的线,
+ 因为它在一些十字交叉口有金属线。</para>
+ </step>
+
+ <step>
+ <title>开始启动安装</title>
+
+ <para>现在开始启动安装。把 <filename>kern.flp</filename> 的那张软盘
+ 插入软盘驱动器,然后开启电源。</para>
+ </step>
+
+ <step>
+ <title>连接您的无头机器</title>
+ <indexterm>
+ <primary><command>cu</command></primary>
+ </indexterm>
+ <para>现在您已经通过&man.cu.1;连接到了那台机器。</para>
+
+ <screen>&prompt.root; <userinput>cu -l /dev/cuaa0</userinput></screen>
+ </step>
+ </procedure>
+
+ <para>就这样!您已经能够通过您的<command>cu</command> session对话来控制
+ 那台<quote>无头</quote>机器了。它将要求您把 <filename>mfsroot.flp</filename>的那张软盘
+ 插入驱动器,然后它将提示选择使用哪种终端。只要选择FreeBSD的彩色控制台,然后
+ 继续您的安装。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="install-diff-media">
+ <title>准备您自己的安装介质</title>
+
+ <note>
+ <para>为了避免重复 <quote>FreeBSD disk</quote> 在这里指 FreeBSD CDROM or DVD
+ 那即意味着您要购买或自己制做。</para>
+ </note>
+
+ <para>有好几个原因需要您创建自己的FreeBSD安装介质。这可能是物理介质,如磁带,
+ 使用 <application>sysinstall</application>程序找到的安装文件,FTP站点或
+ &ms-dos;分区。</para>
+
+ <para>例如:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>您有许多机器连接到本地网络,使用一个FreeBSD光盘。您要使用FreeBSD来
+ 创建一个本地FTP站点,然后使用这个FTP站点来代替连接到Internet。</para>
+ </listitem>
+
+ <listitem>
+ <para>您有一个FreeBSD光盘,FreeBSD不支持您的 CD/DVD驱动器,但
+ &ms-dos;/&windows; 支持。您要拷贝安装文件到一个DOS分区,然后使用
+ 这些文件进行安装。</para>
+ </listitem>
+
+ <listitem>
+ <para>您要安装的计算机没有 CD/DVD驱动器和网卡,但您可以连接一个
+ <quote>Laplink-style</quote> 串口或并口线缆到那台计算机。</para>
+ </listitem>
+
+ <listitem>
+ <para>您要通过一个磁带机来安装FreeBSD.</para>
+ </listitem>
+ </itemizedlist>
+
+ <sect2 id="install-cdrom">
+ <title>创建一张安装光盘</title>
+
+ <para>FreeBSD的每个发行版本都提供两张CDROM映像(<quote>ISO images</quote>)。
+ 如果您有刻录机,这些映像文件可以被(<quote>burned</quote>) 成FreeBSD的安装光盘。
+ 如果没有刻录机,而上网带宽却很便宜,它也是一种很好的安装方式。</para>
+
+ <procedure>
+ <step>
+ <title>下载正确的 ISO 映像文件</title>
+
+ <para>每个版本的ISO映像文件都可以从 <filename>ftp://ftp.FreeBSD.org/pub/FreeBSD/ISO-IMAGES-<replaceable>arch</replaceable>/<replaceable>version</replaceable></filename>
+ 或最近的镜像站点下载。选择合适的 <replaceable>arch</replaceable>
+ <replaceable>version</replaceable> 。</para>
+
+ <para>目录中包含下面一些映像文件:</para>
+
+ <table frame="none">
+ <title>FreeBSD ISO映像文件名和含意</title>
+
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>文件名</entry>
+
+ <entry>包含内容</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><filename><replaceable>version</replaceable>-mini.iso</filename></entry>
+
+ <entry>您安装 FreeBSD所需要的最基本的东西。</entry>
+ </row>
+
+ <row>
+ <entry><filename><replaceable>version</replaceable>-disc1.iso</filename></entry>
+
+ <entry>您安装 FreeBSD所需要的最基本的东西,和一些附加的第三方厂商的试用版软件包
+ </entry>
+ </row>
+
+ <row>
+ <entry><filename><replaceable>version</replaceable>-disc2.iso</filename></entry>
+
+ <entry><quote>live filesystem</quote>,它是用来在
+ <application>sysinstall</application>程序里用来 <quote>修复</quote>系统
+ 用的。里面包含 FreeBSD CVS 树的一个拷贝,还有许多附加的第三方厂商的试用
+ 版软件包。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+<!-- XXX we don't need to mention things prior to 4.4 anymore
+ <note>
+ <para>The mini ISO was only produced for FreeBSD&nbsp;4.4 and
+ subsequent releases. The images for discs two, three, and four
+ were only produced for FreeBSD&nbsp;4.5 and subsequent
+ releases.</para>
+ </note>
+-->
+
+ <para>您<emphasis>必须</emphasis> 下载一个 mini-ISO 映像盘,或是disc one映像盘。
+ 不要都下载下来,因为disc one 映像盘的内容包括了所有在 mini ISO映像盘中的内容。</para>
+
+ <para>如果您的网络费用很低,您可以使用 mini ISO 映像。它可以让您完成安装
+ FreeBSD的任务,如果您还想安装其它的软件包,可以下载它们并使用 ports/packages
+ 系统来安装。(详细请看<xref linkend="ports">)</para>
+
+ <para>如果您想适当的在安装介质上安装一些第三方的软件包,那么您可以使用
+ disc one映像盘。</para>
+
+ <para>其它的映像盘也是很有用的,但不是必须的,尤其是在您有高速的网络连接时。</para>
+ </step>
+
+ <step>
+ <title>刻录 CDs</title>
+
+ <para>您必须把这些映像文件刻录成光盘。如果您在其它的FreeBSD系统上完成
+ 此项工作,请看 <xref linkend="creating-cds"> 得到更多的信息,(特别是
+ <xref linkend="burncd"> 和 <xref linkend="cdrecord">)</para>
+
+ <para>如果您在其它的系统平台上执行,您需要相应的刻录软件。映像文件使用
+ 的是标准的ISO格式,必须被您的刻录软件所支持。</para>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2 id="install-ftp">
+ <title>使用FreeBSD磁盘作为本地端FTP站点</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>network</secondary>
+ <tertiary>FTP</tertiary>
+ </indexterm>
+
+ <para>FreeBSD磁盘的配置跟FreeBSD FTP站点的配置是一样的。这让您很简单
+ 建立一个本地的FTP站点以便给本地网络中其它机器安装FreeBSD使用。</para>
+
+ <procedure>
+ <step>
+ <para>在要作为FTP站点的那台FreeBSD机器上,确定FreeBSD磁盘放入光驱
+ 中并将它挂在<filename>/cdrom</filename>目录中。</para>
+
+ <screen>&prompt.root; <userinput>mount /cdrom</userinput></screen>
+ </step>
+
+ <step>
+ <para>在<filename>/etc/passwd</filename>文件中建立一个可匿名访问FTP
+ 服务器的账号。您可以利用&man.vipw.8; 命令编辑<filename>/etc/passwd</filename>
+ 文件,加入下面这一行叙述:</para>
+
+ <programlisting>ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent</programlisting>
+ </step>
+
+ <step>
+ <para>确定在<filename>/etc/inetd.conf</filename>配置文件中开启
+ 了FTP服务。</para>
+ </step>
+ </procedure>
+
+ <para>任何本地网络中的机器在安装FreeBSD选择安装介质时就可以选择透过
+ FTP站点,然后选取 <quote>Other</quote>后输入
+ <userinput>ftp://<replaceable>本地FTP服务器</replaceable></userinput>
+ 即可以透过本地的FTP站点来安装FreeBSD。</para>
+
+ <warning>
+ <para>此方式最好使用在有防火墙保护的内部网络。如果要将此FTP服务公开给外面的
+ 网际网络(非本地用户),您的电脑必须承担被侵入或其它的风险。我们强烈建议您
+ 要有完善的安全机制才这样做。</para>
+ </warning>
+ </sect2>
+
+ <sect2>
+ <title>创建安装软盘</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>floppies</secondary>
+ </indexterm>
+
+ <para>如果您从软盘安装(我们<emphasis>不</emphasis>推荐那样做),或者是由于
+ 不支持硬件或者更简单的理由是因为您坚持要使用软盘安装。您必须准备几张软盘。</para>
+
+ <para>至少这些软盘必须是 1.44 MB 或 1.2 MB 的,用来容纳所有在
+ <filename>bin</filename> (二进制软件包)目录下的文件。如果您在DOS操作系统
+ 下准备就 <emphasis>MUST</emphasis>使用 &ms-dos;下的 <command>FORMAT</command>
+ 命令来格式化软盘。如果您使用的是 &windows;操作系统,在文件浏览器中用右键
+ 单击 <devicename>A:</devicename> 驱动器,并选择 <quote>Format</quote>。</para>
+
+ <para><emphasis>不要</emphasis> 指望厂家的预先格式化!最好还是亲自进行格式化。
+ 过去用户报告的很多问题都是由于不正确地使用格式化设备所造成的,所以我们需要在这
+ 儿着重提一下。</para>
+
+ <para>如果您在另外一台FreeBSD的机器上做了启动盘的话,进行格式化是一个不
+ 错的主意。虽然您不需要把每张盘都做成DOS文件系统。您也可以使用
+ <command>disklabel</command> 和 <command>newfs</command>
+ 命令来创建一个UFS文件系统,具体操作按下面的顺序进行:</para>
+
+ <screen>&prompt.root; <userinput>fdformat -f 1440 fd0.1440</userinput>
+&prompt.root; <userinput>disklabel -w -r fd0.1440 floppy3</userinput>
+&prompt.root; <userinput>newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0</userinput></screen>
+
+ <note>
+ <para>如果使用 5.25"软盘的话,需要使用 <literal>fd0.1200</literal> 和
+ <literal>floppy5</literal> 来格式化 1.2&nbsp;MB 的磁盘空间。</para>
+ </note>
+
+ <para>然后您就可以像其它的文件系统一样挂上和写入这些磁盘。</para>
+
+ <para>格式化这些磁盘后,您必须拷贝文件到磁盘中。这些发行文件被分割成刚
+ 好可存进五张 1.44&nbsp;MB 软盘。检查您所有的磁盘,找出所有可能适合的文件。
+ 直到您找到所有需要的配置并且将它们以这种方式安置。第一个配置都应该有一个
+ 子目录在磁盘上,例如:
+ <filename>a:\bin\bin.aa</filename>,
+ <filename>a:\bin\bin.ab</filename>, 等等。</para>
+
+ <para>一旦您进入选择安装介质的屏幕,选择 <guimenuitem>Floppy</guimenuitem>
+ 将会看到后面的提示符。</para>
+ </sect2>
+
+ <sect2 id="install-msdos">
+ <title>从一个 &ms-dos; 分区安装</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>from MS-DOS</secondary>
+ </indexterm>
+ <para>如果从一个 &ms-dos; 分区安装,您需要从发布文档拷贝文件到分区
+ 要目录下一个叫做 <filename>freebsd</filename> 的目录中。例如:
+ <filename>c:\freebsd</filename>。CDROM或FTP站点目录中的内容会部分的
+ 拷贝到这个目录中,如果从光盘中拷贝,所以我们建议您使用DOS的 <command>xcopy</command>
+ 命令。例如,准备一个最小的FreeBSD安装。</para>
+
+ <screen><prompt>C:\&gt;</prompt> <userinput>md c:\freebsd</userinput>
+<prompt>C:\&gt;</prompt> <userinput>xcopy e:\bin c:\freebsd\bin\ /s</userinput>
+<prompt>C:\&gt;</prompt> <userinput>xcopy e:\manpages c:\freebsd\manpages\ /s</userinput></screen>
+
+ <para>假设 <devicename>C:</devicename> 盘是您的空闲空间,
+ <devicename>E:</devicename> 盘是您挂接的 CDROM。</para>
+
+ <para>如果您没有光盘驱动器,您可以从以下网站下载发行包。 <ulink
+ url="ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/&rel.current;-RELEASE/">ftp.FreeBSD.org</ulink>.
+ 每一个发行包都在一个目录中,例如 <emphasis>base</emphasis> 发行包可以在 <ulink
+ url="ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/&rel.current;-RELEASE/base/">&rel.current;/base/</ulink>目录中找到。</para>
+
+ <note>
+ <para>在 4.X 和其它老版本的 &os; the <quote>base</quote>发行包被叫做
+ <quote>bin</quote>. 如果您使用这些版本的话,请调整上例中的命令和URLS.</para>
+ </note>
+
+ <para>对很多发行包来说,如果您希望从 &ms-dos;分区安装的话(您有足够的空间),
+ 安装 <filename>c:\freebsd</filename> &mdash; 下的每个文件-这个
+ <literal>BIN</literal> 发行包只是最低限度的要求。</para>
+ </sect2>
+
+ <sect2>
+ <title>创建一个安装磁带</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>from QIC/SCSI Tape</secondary>
+ </indexterm>
+ <para>从磁带安装也许是最简单的方式,比在线使用 FTP 安装或使用 CDROM 还快。
+ 安装的程序假设是简单地被压缩在磁带上。在您到所有配置文件后,简单的解开它们,
+ 用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>cd /freebsd/distdir</userinput>
+&prompt.root; <userinput>tar cvf /dev/rwt0 dist1 ... dist2</userinput></screen>
+
+ <para>在您安装的时候,您要确定留有足够的空间给临时目录(允许您选择)
+ 来容纳磁带安装时 <emphasis>全部</emphasis> 的内容。由于不是随机访问
+ 磁带的,所以这种安装方法需要很多临时空间。</para>
+
+ <note>
+ <para>开始安装时,在从软盘启动<emphasis>before</emphasis>,磁带机
+ 必须已经放在驱动设备中。否则,安装过程中可能会找不到它。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>通过网络安装</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>network</secondary>
+ <tertiary>serial (SLIP or PPP)</tertiary>
+ </indexterm>
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>network</secondary>
+ <tertiary>parallel (PLIP)</tertiary>
+ </indexterm>
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>network</secondary>
+ <tertiary>Ethernet</tertiary>
+ </indexterm>
+ <para>有三种类型的网络安装方法。串口(SLIP或PPP),并口(PLIP),以太网
+ (标准的以太网控制器,包括PCMCIA)。</para>
+
+ <para> SLIP 支持是相当原始的,并且被限制在主要对hard-wired 的连接,就像
+ 一台膝上型计算机与另一台计算机间的串行线。现在的SLIP的安装还没有提供拨号功能,
+ 这个连接应该是 hard-wired ;用PPP工具提供的这种便利性应该首先尽可能被用于SLIP
+ 设备。</para>
+
+ <para>如果您使用一个MODEM,那您就只有PPP这一种选择了。在您安装的过程中,
+ 要确定您能很容易地获得完整且快速的关于您服务提供商的信息。</para>
+
+ <para>如果您使用 PAP 或 CHAP 方式连接到您的 ISP,(换句话说,如果您不使用
+ 脚本在&windows;中连接到您的ISP),那么您需要在<application>ppp</application>
+ 提示符下输入<command>dial</command> 命令。否则,当PPP连接者只提供一种最简单的
+ 终端模拟器,您必须知道如何使用针对MODEM的 <quote>AT commands</quote>拨号到您
+ 的ISP。想知道更深入的信息可以参考用户级PPP那节 <link
+ linkend="userppp">handbook</link> and <ulink
+ url="&url.books.faq;/ppp.html">FAQ</ulink> 。如果您有一些问题,可以使用
+ <command>set log local ...</command>命令将日志显示在屏幕上。</para>
+
+ <para>您也可以通过并口电缆连接到另外一台FreeBSD(2.0或以后的版本)机器上进行
+ 安装,您可以考虑使用 <quote>laplink</quote> 并口电缆进行安装。通过并口安装要
+ 比通过串口(最高 50&nbsp;kbytes/sec)安装快得多。</para>
+
+ <para>最后,通过网络安装最快的方法是利用以太网技术!FreeBSD支持绝大多数普通
+ 的以太网卡。每个FreeBSD发行版都在硬件注释中提供支持的网卡的列表和需要的设置。
+ 如果您要使用PCMCIA接口的以太网,在启动计算机 <emphasis>before</emphasis>,
+ 确信已经把它插好了。目前,FreeBSD还不支持PCMCIA的热插拔。</para>
+
+ <para>通过网络安装,您可能需要知道IP地址,地址掩码,还有机器的字。如果您
+ 通过PPP进行安装,就不需要静态的IP地址,IP地址会由ISP给您自动指派。您的系统
+ 管理员会告诉您通过网络安装的细节。如果您通过主机名而不是IP地址来访问其它主
+ 机,需要有一个域名服务器或一个网关地址(如果您使用PPP进行安装,那它就您的
+ 的ISP的IP地址)。如果您要通过一个HTTP的代理服务器进行FTP安装,需要一个代理
+ 服务器地址。如果您不知道这些,在安装 <emphasis>before</emphasis>可以询问
+ 您的系统管理员或您的ISP服务商。</para>
+
+ <sect3>
+ <title>通过NFS安装之前</title>
+
+ <indexterm>
+ <primary>installation</primary>
+ <secondary>network</secondary>
+ <tertiary>NFS</tertiary>
+ </indexterm>
+ <para>NFS安装方式是非常方便的。只需要简单地将FreeBSD文件拷贝到一台服务器上,
+ 然后在安装时选择NFS介质。</para>
+
+ <para>如果这个服务器要<quote>特权端口</quote>才能支持(如SUN的工作站),
+ 您需要在安装前在Options菜单中设置<option>NFS Secure</option>。</para>
+
+ <para>如果您的一台网卡比较糟糕,速度很慢,则应考虑<option>NFS Slow</option>的选项。</para>
+
+ <para>为了达到NFS安装的目的,这个服务器必须支持 subdir 加载。例如,如果您的
+ FreeBSD&nbsp;&rel.current; 目录存在:
+ <filename>ziggy:/usr/archive/stuff/FreeBSD</filename>,然后
+ <hostid>ziggy</hostid> 将必须允许直接挂上
+ <filename>/usr/archive/stuff/FreeBSD</filename>,而不仅仅是
+ <filename>/usr</filename> 或
+ <filename>/usr/archive/stuff</filename>。</para>
+
+ <para>在 FreeBSD的 <filename>/etc/exports</filename> 配置文件中,是由
+ <option>-alldirs</option> 选项来控制的。其它 NFS服务器也许有不同的方式。
+ 如果您从服务器得到<errorname>permission denied</errorname> 这个信息,可能是因为您没有正确的启用它。</para>
+ </sect3>
+
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/introduction/Makefile b/zh_CN.GB2312/books/handbook/introduction/Makefile
new file mode 100644
index 0000000000..471fbb6461
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/introduction/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= introduction/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/introduction/chapter.sgml b/zh_CN.GB2312/books/handbook/introduction/chapter.sgml
new file mode 100644
index 0000000000..e9cc4ad4c3
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/introduction/chapter.sgml
@@ -0,0 +1,855 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.102
+ $FreeBSD$
+-->
+
+<chapter id="introduction">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Restructured, reorganized, and parts
+ rewritten by </contrib>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>介绍</title>
+
+ <sect1 id="introduction-synopsis">
+ <title>概述</title>
+
+ <para>非常感谢您对 FreeBSD 感兴趣!
+ 下面的章节覆盖了 FreeBSD 项目的各个方面,
+ 比如它的历史、目标、开发模式,等等。</para>
+
+ <para>阅读完这章,您将了解:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>FreeBSD 与其它计算机操作系统的关系。</para>
+ </listitem>
+ <listitem>
+ <para>FreeBSD 项目的历史。</para>
+ </listitem>
+ <listitem>
+ <para>FreeBSD 项目的目标。</para>
+ </listitem>
+ <listitem>
+ <para>FreeBSD 开放源代码开发模式的基础。</para>
+ </listitem>
+ <listitem>
+ <para>当然还有:<quote>FreeBSD</quote> 这个名称的由来。</para>
+ </listitem>
+ </itemizedlist>
+
+ </sect1>
+
+ <sect1 id="nutshell">
+ <title>欢迎来到 FreeBSD 的世界!</title>
+ <indexterm><primary>4.4BSD-Lite</primary></indexterm>
+
+ <para>FreeBSD 是一个支持
+ Intel (x86 和 &itanium;),AMD64,<trademark>Alpha</trademark>,Sun
+ &ultrasparc; 计算机的基于 4.4BSD-Lite 的操作系统。
+ 到其他体系结构的移植也在进行中。
+ 您也可以阅读 <link linkend="history">FreeBSD 的历史</link>,
+ 或者<link linkend="relnotes">最新的发行版本</link>。
+ 如果您有意捐助(代码,
+ 硬件,不记名捐款),请看<ulink
+ url="&url.articles.contributing;/index.html">为 FreeBSD 做贡献</ulink>这篇文章。</para>
+
+ <sect2 id="os-overview">
+ <title>FreeBSD 能做些什么?</title>
+
+ <para>FreeBSD有许多非凡的特性。其中一些是:</para>
+
+ <itemizedlist>
+ <indexterm><primary>抢占式多任务</primary></indexterm>
+ <listitem>
+ <para><emphasis>抢占式多任务</emphasis>与动态优先级调整确保在应用程序和用户之间平滑公正的分享计算机资源,
+ 即使工作在最大的负载下。</para>
+ </listitem>
+
+ <indexterm><primary>多用户设备</primary></indexterm>
+ <listitem>
+ <para><emphasis>多用户设备</emphasis> 使得许多用户能够同时使用同一
+ FreeBSD 系统做各种事情。
+ 比如,
+ 像打印机和磁带驱动器这样的系统外设可以完全的在系统或者网络上的所有用户之间共享,
+ 可以对用户或者用户组进行个别的资源限制,
+ 以保护临界系统资源不被滥用。</para>
+ </listitem>
+
+ <indexterm><primary>TCP/IP 网络</primary></indexterm>
+ <listitem>
+ <para>符合业界标准的强大 <emphasis>TCP/IP 网络</emphasis> 支持,
+ 例如 SLIP,PPP,NFS,DHCP,还有 NIS。
+ 这意味着您的 FreeBSD 主机可以很容易的和其他系统互操作,
+ 也可以作为企业的服务器,提供重要的功能,
+ 比如 NFS(远程文件访问)以及 email 服务, 或将您的组织接入
+ Internet 并提供 WWW,FTP,路由和防火墙(安全)服务。</para>
+ </listitem>
+
+ <indexterm><primary>内存保护</primary></indexterm>
+ <listitem>
+ <para><emphasis>内存保护</emphasis>确保应用程序(或者用户)不会相互干扰。
+ 一个应用程序崩溃不会以任何方式影响其他程序。</para>
+ </listitem>
+
+ <listitem>
+ <para>FreeBSD 是一个 <emphasis>32 位</emphasis>操作系统
+ (在 Alpha,&itanium;,AMD64,和 &ultrasparc; 上是<emphasis>64 位</emphasis>),
+ 并且从开始就是如此设计的。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>X Window 系统</primary>
+ <seealso>XFree86</seealso>
+ </indexterm>
+
+ <listitem>
+ <para>业界标准的 <emphasis>X Window 系统</emphasis>
+ (X11R6)为便宜的常见 VGA 显示卡和监视器提供了一个图形化的用户界面(GUI),
+ 并且完全开放代码。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>二进制代码兼容性</primary>
+ <secondary>Linux</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>二进制代码兼容性</primary>
+ <secondary>SCO</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>二进制代码兼容性</primary>
+ <secondary>SVR4</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>二进制代码兼容性</primary>
+ <secondary>BSD/OS</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>二进制代码兼容性</primary>
+ <secondary>NetBSD</secondary>
+ </indexterm>
+ <listitem>
+ <para>和许多 Linux,SCO,SVR4,BSDI 和 NetBSD 程序的<emphasis>二进制代码兼容性</emphasis></para>
+ </listitem>
+
+ <listitem>
+ <para>数以千计的 <emphasis>ready-to-run</emphasis>
+ 应用程序可以从 FreeBSD
+ <emphasis>ports</emphasis> 和 <emphasis>packages</emphasis>
+ collection 中找到。您可以顺利的从这里找到,
+ 何用搜索网络?</para>
+ </listitem>
+
+ <listitem>
+ <para>可以在 Internet 上找到成千上万其它
+ <emphasis>easy-to-port</emphasis> 的应用程序。
+ FreeBSD 和大多数流行的商业 &unix; 代码级兼容,
+ 因此大多数应用程序不需要或者只要很少的改动就可以编译。</para>
+ </listitem>
+
+ <indexterm><primary>虚拟内存</primary></indexterm>
+ <listitem>
+ <para>页式请求<emphasis>虚拟内存</emphasis>和<quote>集成的
+ VM/buffer 缓存</quote>设计有效的满足了应用程序巨大的内存需求并依然保持其他用户的交互式响应。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>对称多处理器(SMP)</primary>
+ </indexterm>
+ <listitem>
+ <para><emphasis>SMP</emphasis> 提供对多处理器的支持。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>编译器</primary>
+ <secondary>C</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>编译器</primary>
+ <secondary>C++</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>编译器</primary>
+ <secondary>FORTRAN</secondary>
+ </indexterm>
+ <listitem>
+ <para><emphasis>C</emphasis>,
+ <emphasis>C++</emphasis>,<emphasis>Fortran</emphasis>,和
+ <emphasis>Perl</emphasis> 开发工具的完整扩充。
+ 许多附加的用于高级研究和开发的程序语言也可以在
+ ports 和 packages collection 中找到。</para>
+ </listitem>
+
+ <indexterm><primary>源代码</primary></indexterm>
+ <listitem>
+ <para>完整的系统<emphasis>源代码</emphasis>意味着您对您环境的最大程度的控制。
+ 当您拥有了一个真正的开放系统时,
+ 为什么还要受困于私有的解决方案,
+ 任商业公司摆布呢?</para>
+ </listitem>
+
+ <listitem>
+ <para>丰富的<emphasis>在线文档</emphasis>。</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>不仅如此!</emphasis></para>
+ </listitem>
+ </itemizedlist>
+
+ <indexterm><primary>4.4BSD-Lite</primary></indexterm>
+ <indexterm>
+ <primary>计算机系统研究组(CSRG)</primary>
+ </indexterm>
+ <indexterm><primary>U.C. Berkeley</primary></indexterm>
+ <para>FreeBSD 基于加州大学伯克利分校计算机系统研究组(CSRG)发布的 4.4BSD-Lite,
+ 继承了 BSD 系统开发的优良传统。
+ 除了 CSRG 优秀的工作之外,
+ FreeBSD 项目花费了非常多的时间来优化调整系统,
+ 使其在真实负载情况下拥有最好的性能和可靠性。
+ 像许多商业巨人努力的增进 PC 操作系统的特性、性能和可靠性一样,
+ FreeBSD <emphasis>现在</emphasis> 就已经可以提供了!</para>
+
+ <para>FreeBSD 可以提供的应用真的仅局限于您的想象力。
+ 从软件开发到工厂自动化,从存货控制到遥远的人造卫星天线方位控制,
+ 如果商业的 &unix; 产品可以做到,那么就非常有可能您也可以用 FreeBSD 来做!
+ FreeBSD 也极大地受益于全世界的研究中心和大学开发的数以千计的高质量的应用程序,
+ 这些程序通常只需要很少的花费甚至免费。
+ 商业应用程序也是可用的,并且每天都有大量的出现。</para>
+
+ <para>因为 FreeBSD 自身的源代码是完全公开的,
+ 所以对于特定的应用程序或项目,可以对系统进行最大限度的定制。
+ 这对于大多数主流的商业生产商的操作系统来说几乎是不可能的。
+ 以下是当前人们应用 FreeBSD 的某些程序的例子:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Internet 服务:</emphasis>FreeBSD 内建的强大的 TCP/IP
+ 网络让它成为各种 Internet 服务的理想平台,比如:</para>
+
+ <itemizedlist>
+ <indexterm><primary>FTP 服务器</primary></indexterm>
+ <listitem>
+ <para>FTP 服务器</para>
+ </listitem>
+
+ <indexterm><primary>web 服务器</primary></indexterm>
+ <listitem>
+ <para>World Wide Web 服务器(标准的或者安全的
+ [SSL])</para>
+ </listitem>
+
+ <indexterm><primary>防火墙</primary></indexterm>
+ <indexterm><primary>IP 伪装</primary></indexterm>
+ <listitem>
+ <para>防火墙和 NAT(<quote>IP 伪装</quote>)
+ 网关</para>
+ </listitem>
+
+ <indexterm><primary>电子邮件</primary></indexterm>
+ <listitem>
+ <para>电子邮件服务器</para>
+ </listitem>
+
+ <indexterm><primary>USENET</primary></indexterm>
+ <listitem>
+ <para>USENET 新闻组和电子布告栏系统</para>
+ </listitem>
+
+ <listitem>
+ <para>还有许多...</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>使用 FreeBSD,您可以容易的从便宜的
+ 386 类 PC 起步,并随着您的企业成长,一路升级到带有
+ RAID 存储的四路 Xeon 服务器。</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>教育:</emphasis>您是一名计算机科学或者相关工程领域的学生吗?
+ 学习操作系统,计算机体系结构和网络没有比在 FreeBSD
+ 可提供的体验下动手实践更好的办法了。许多可自由使用的
+ CAD、数学和图形设计包也使它对于那些主要兴趣是在计算机上完成<emphasis>其他</emphasis>工作的人非常有帮助。</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>研究:</emphasis>有完整的系统源代码,
+ FreeBSD 对于操作系统研究以及其他计算机科学分支都是一个极好的平台。
+ FreeBSD 可自由获得的本性,
+ 同样可以使处在不同地方的开发团队在开放的论坛上讨论问题、
+ 交流想法与合作开发成为可能,
+ 且不必担心特别的版权协定或者限制。</para>
+ </listitem>
+
+ <indexterm><primary>路由</primary></indexterm>
+ <indexterm><primary>DNS 服务器</primary></indexterm>
+ <listitem>
+ <para><emphasis>网络:</emphasis>需要一个新的路由器?
+ 一台名称服务器(DNS)?一个隔离您的内部网络的防火墙?
+ FreeBSD 可以容易的把丢弃在角落不用的 386 或者
+ 486 PC 变成一台完善的带包过滤能力的高级路由器。</para>
+ </listitem>
+
+ <indexterm>
+ <primary>X Window 系统</primary>
+ <secondary>XFree86</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>X Window 系统</primary>
+ <secondary>Accelerated-X</secondary>
+ </indexterm>
+ <listitem>
+ <para><emphasis>X Window 工作站:</emphasis>FreeBSD
+ 是一个便宜的 X 终端解决方案的好的选择,
+ 不管是使用可免费获得的 &xfree86; 服务器还是 <ulink
+ url="http://www.xig.com">Xi Graphics</ulink>
+ 提供的一个优秀的商业服务器。
+ 不像 X 终端,如果需要的话 FreeBSD 允许许多程序在本地运行,
+ 从而减少中央服务器的负担。
+ FreeBSD 甚至可以<quote>无盘</quote>启动,
+ 让个人工作站更便宜而且容易管理。</para>
+ </listitem>
+
+ <indexterm><primary>GNU Compiler Collection</primary></indexterm>
+ <listitem>
+ <para><emphasis>软件开发:</emphasis>
+ 基本的 FreeBSD 系统带有包括著名的 GNU C/C++
+ 编译器和调试工具在内的一整套开发工具。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>FreeBSD 可以通过 CDROM、DVD,
+ 以及匿名 FTP 以源代码和二进制方式获得。请查看<xref linkend="mirrors">
+ 了解获取 FreeBSD 的更多细节。</para>
+ </sect2>
+
+ <sect2>
+ <title>谁在使用 FreeBSD?</title>
+
+ <indexterm>
+ <primary>用户</primary>
+ <secondary>运行 FreeBSD 的大型站点</secondary>
+ </indexterm>
+
+ <para>FreeBSD 用来支持 Internet 上一些最大的站点,
+ 包括:</para>
+
+ <itemizedlist>
+ <indexterm><primary>Yahoo!</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.yahoo.com/">Yahoo!</ulink></para>
+ </listitem>
+
+ <indexterm><primary>Apache</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.apache.org/">Apache</ulink></para>
+ </listitem>
+
+ <indexterm><primary>Blue Mountain Arts</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.bluemountain.com/">Blue Mountain
+ Arts</ulink></para>
+ </listitem>
+
+ <indexterm><primary>Pair Networks</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.pair.com/">Pair
+ Networks</ulink></para>
+ </listitem>
+
+ <indexterm><primary>Sony Japan</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.sony.co.jp/">Sony
+ Japan</ulink></para>
+ </listitem>
+
+ <indexterm><primary>Netcraft</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.netcraft.com/">Netcraft</ulink>
+ </para>
+ </listitem>
+
+ <indexterm><primary>Weathernews</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.wni.com/">Weathernews</ulink>
+ </para></listitem>
+
+ <indexterm><primary>Supervalu</primary></indexterm>
+ <listitem>
+ <para><ulink
+ url="http://www.supervalu.com/">Supervalu</ulink></para>
+ </listitem>
+
+ <indexterm><primary>TELEHOUSE America</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.telehouse.com/">TELEHOUSE
+ America</ulink></para>
+ </listitem>
+
+ <indexterm><primary>Sophos Anti-Virus</primary></indexterm>
+ <listitem>
+ <para><ulink url="http://www.sophos.com/">Sophos
+ Anti-Virus</ulink></para>
+ </listitem>
+
+ <indexterm><primary>JMA Wired</primary></indexterm>
+ <listitem>
+ <para><ulink
+ url="http://www.jmawired.com/">JMA Wired</ulink></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>等等许多。</para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="history">
+ <title>关于 FreeBSD 项目</title>
+
+ <para>下面的章节提供了项目的一些背景信息,
+ 包括简要的历史、项目目标、以及项目开发模式。</para>
+
+ <sect2 id="intro-history">
+ <sect2info role="firstperson">
+ <authorgroup>
+ <author>
+ <firstname>Jordan</firstname>
+ <surname>Hubbard</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>FreeBSD 的简要历史</title>
+
+ <indexterm><primary>386BSD Patchkit</primary></indexterm>
+ <indexterm><primary>Hubbard, Jordan</primary></indexterm>
+ <indexterm><primary>Williams, Nate</primary></indexterm>
+ <indexterm><primary>Grimes, Rod</primary></indexterm>
+ <indexterm>
+ <primary>FreeBSD 项目</primary>
+ <secondary>历史</secondary>
+ </indexterm>
+ <para>FreeBSD 项目起源于 1993 年早期,
+ 部分作为 <quote>Unofficial 386BSD
+ Patchkit</quote> 的副产物,patchkit 的最后 3 个协调维护人是:Nate
+ Williams,Rod Grimes 和我。</para>
+
+ <indexterm><primary>386BSD</primary></indexterm>
+ <para>我们最初的目标是做出一份 386BSD 的测试版以修正一些
+ Patchkit 机制无法解决的错误(bug)。
+ 您们中的一些人可能还记得早期的项目名称叫做
+ <quote>386BSD 0.5</quote> 或者 <quote>386BSD Interim</quote>
+ 就是这个原因。</para>
+
+ <indexterm><primary>Jolitz, Bill</primary></indexterm>
+ <para>386BSD 是 Bill Jolitz 的操作系统,
+ 一直到忍受了激烈的将近一年的忽视。
+ 由于 Patchkit 的急剧膨胀,
+ 使得很难每天都能够消化吸收,
+ 我们一致同意应该做些事情并决定通过提供这个临时的
+ <quote>cleanup</quote> 版本来帮助 Bill。
+ 然而,Bill 却在事先没有指出这个项目应该如何开展下去的情况下,
+ 突然决定退出这个项目,最终这个计划只好被迫停止。</para>
+
+ <indexterm><primary>Greenman, David</primary></indexterm>
+ <indexterm><primary>Walnut Creek CDROM</primary></indexterm>
+ <para>没过多久,我们认为在没有 Bill 的支持下,项目仍有保留的价值,
+ 因此,我们采用了 David Greenman 的意见,给其命名为
+ <quote>FreeBSD</quote>。在和当时的几个用户商量后,
+ 我们提出了最初的目标, 而这件事明朗化后,
+ 这个项目就走上了正轨,甚至可能成为现实。
+ 为了增加 FreeBSD 的发行渠道,我抱着试试看的心态,
+ 联系了光盘商 Walnut Creek CDROM,
+ 以便那些上网不方便的用户得到 FreeBSD。
+ Walnut Creek CDROM 不仅支持发行 FreeBSD 光盘版的想法,
+ 还为这个计划提供了所需的计算机和高速网络接入。
+ 在那时,没有 Walnut Creek CDROM 对一个完全未知的项目的空前信任,
+ FreeBSD 不太可能像它今天这样,影响如此深远,发展如此快速。</para>
+
+ <indexterm><primary>4.3BSD-Lite</primary></indexterm>
+ <indexterm><primary>Net/2</primary></indexterm>
+ <indexterm><primary>U.C. Berkeley</primary></indexterm>
+ <indexterm><primary>386BSD</primary></indexterm>
+ <indexterm><primary>Free Software Foundation</primary></indexterm>
+ <para>第一个 CDROM (以及在整个互连网范围内发行的) 发行版本是
+ FreeBSD&nbsp;1.0,于 1993 年 10 月发布。这个版本基于
+ U.C. Berkeley 的 4.3BSD-Lite(<quote>Net/2</quote>)磁带,
+ 也有许多组件是 386BSD 和自由软件基金会提供的。
+ 对于第一次发行,这算是相当成功了。
+ 在 1994 年 5 月,我们发布了更加成功的 FreeBSD 1.1 版。</para>
+
+ <indexterm><primary>Novell</primary></indexterm>
+ <indexterm><primary>U.C. Berkeley</primary></indexterm>
+ <indexterm><primary>Net/2</primary></indexterm>
+ <indexterm><primary>AT&amp;T</primary></indexterm>
+ <para>然而此后不久,发生了一些意外的情况。
+ Novell 和 U.C. Berkeley 决定就 Berkeley Net/2
+ 磁带的归属权问题打的那场马拉松式的官司达成和解。
+ 判决的结果是,
+ U.C. Berkeley 承认 Net/2 很大一部分代码是<quote>侵占来的</quote>
+ 且这些代码归 Novell 公司所拥有。这些代码是 Novell 不久前从
+ AT&amp;T 买来的。
+ Berkeley 得到了来自 Novell 的 <quote>祝福</quote>:
+ 4.4BSD-Lite 发行后,将不认为是侵权,
+ 且要求现存的 Net/2 的用户更换新版。
+ 这也包括 FreeBSD,我们的项目被要求在 1994 年 6 月底停止发行基于
+ Net/2 的产品。在此协议允许的时间内,
+ 本项目被允许发行最后一版,也就是 FreeBSD&nbsp;1.1.5.1。</para>
+
+ <para>于是 FreeBSD 开始艰苦的从全新的而且不完整的 4.4BSD-Lite
+ 中重新整合自己。<quote>Lite</quote> 版本是不完整的,
+ 因为 Berkeley 的 CSRG 已经删除了大量的构建可启动运行的系统所需要的代码
+ (因为各种各样的版权问题),事实上 4.4 的 Intel port 是非常不完整的。
+ 直到 1994 年 11 月项目才完成这个转换,这个时候才把
+ FreeBSD&nbsp;2.0 通过网络和 CDROM(在 12 月)发布出来。
+ 尽管系统很多地方还很粗糙,这个版本还是取得了重大的成功,
+ 接下来在 1995 年 6 月发布了更强大和容易安装的 FreeBSD&nbsp;2.0.5
+ 版本。</para>
+
+ <para>我们于 1996 年 8 月发布了 FreeBSD&nbsp;2.1.5 版本,
+ 它在 ISP 和商业团体中非常流行。
+ 随后, 2.1-STABLE 分支的另一个版本应运而生,它就是
+ FreeBSD&nbsp;2.1.7.1,在 1997 年 2 月发布并停止了
+ 2.1-STABLE 的主流开发。现在,它处于维护状态,
+ 仅仅提供安全性的增强和其他严重的错误修补的维护(RELENG_2_1_0)。</para>
+
+ <para>FreeBSD&nbsp;2.2 版作为 RELENG_2_2 分支,于 1996 年 11 月从开发主线
+ (<quote>-CURRENT</quote>)分出来。
+ 它的第一个完整版(2.2.1)于 1997 年 4 月发布出来。
+ 97 年夏秋之间,顺着 2.2 分支的更进一步的版本在开发。
+ 其最后一版(2.2.8)于 1998 年 11 月发布出来。
+ 第一个官方的 3.0 版本出现在 1998 年 10 月,
+ 意味着 2.2 分支结束的开始。</para>
+
+ <para>1999 年 1 月 20 日又出现了新的分支,就是
+ 4.0-CURRENT 和 3.X-STABLE 分支。从 3.X-STABLE 起,3.1 在
+ 1999 年 2 月 15 日发行,3.2 在1999 年 5 月 15 日,3.3 在
+ 1999 年 9 月 16 日,3.4 在 1999 年 12 月 20 日,3.5 在
+ 2000 年 6 月 24 日,接下来几天后发布了很少的修补升级至
+ 3.5.1,加入了对 Kerberos 安全性方面的修补。
+ 这是 3.X 分支最后一个发行版本。</para>
+
+ <para>2000 年 3 月 13 日,有了另一个分支,
+ 看到了 4.X-STABLE 分支的曙光,现在,采用了
+ <quote>current -stable 分支方法</quote>。从那时迄今为止已经有了几个发行版本:
+ 4.0-RELEASE 在 2000 年 3 月发布,
+ 最新的 &rel2.current;-RELEASE 在
+ &rel2.current.date; 发布。沿着
+ 4.X-stable(RELENG_4)分支还会有几个后续版本,直到 2003 年。</para>
+
+ <para>期待已久的 5.0-RELEASE 在 2003 年 1 月 19 日发布。
+ 它是将近三年工作的顶点,这个版本开始了 FreeBSD
+ 对高级多处理器和应用程序线程的支持,并加入了对 &ultrasparc; 和
+ <literal>ia64</literal> 平台的支持。这个版本接下来就是 2003
+ 年 6 月发布的 5.1 版。除了许多新的特性,5.X
+ 版本也包含了许多正在进行的系统结构方面的主要进展。然而,随着这些先进的机制,
+ 带给系统极大数量的新的未经过广泛测试的代码。
+ 因为这个原因,5.X
+ 版本被看作是<quote>新技术展示</quote>版本,而 4.X
+ 系列则作为<quote>生产</quote>版本。5.X 会被及时的公布为
+ stable 并开始着手下一个开发分支,6.0-CURRENT。</para>
+
+ <para>现在,对 5.X-CURRENT(trunk)分支的长期开发计划仍在继续着。
+ 5.x 的 SNAPshot 版本
+ CDROM(当然,还有网络)一直作为工作进程在
+ <ulink url="ftp://current.FreeBSD.org/pub/FreeBSD/snapshots/">
+ the snapshot server</ulink> 上制作。</para>
+ </sect2>
+
+ <sect2 id="goals">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Jordan</firstname>
+ <surname>Hubbard</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>FreeBSD 项目目标</title>
+
+ <indexterm>
+ <primary>FreeBSD Project</primary>
+ <secondary>goals</secondary>
+ </indexterm>
+ <para>FreeBSD 项目的目标是为那些不管出于什么目的,
+ 不需要有任何限制的人提供软件。
+ 我们中的许多人对代码(和计划)都有非常大的投入和研究,
+ 当然也不介意一些资金上的补偿,不管是现在或者将来。
+ 但是,我们确定不准备坚持这么做。
+ 我们认为我们的首要<quote>使命</quote>是为任何人和新来者提供代码,
+ 不管他们出于什么目的。以便代码能得到最大限度的利用,
+ 带给使用者最大的好处。
+ 我认为这是自由软件和我们的狂热支持者的一个最基本的目标。</para>
+
+ <indexterm>
+ <primary>GNU General Public License (GPL)</primary>
+ </indexterm>
+ <indexterm>
+ <primary>GNU Lesser General Public License (LGPL)</primary>
+ </indexterm>
+ <indexterm><primary>BSD Copyright</primary></indexterm>
+ <para>我们源代码树中在 GNU
+ 公共许可证(GPL) 或者 GNU 函数库公共许可证
+ (LGPL) 下发布的代码带有少许的附加限制,
+ 还好只是强制性的要求开放代码而不是别的。
+ 由于使用 GPL 的软件在商业用途上会增加若干复杂性,
+ 因此,我们宁愿在可以选择的时候对提交的软件使用更宽松的
+ BSD 版权。</para>
+ </sect2>
+
+ <sect2 id="development">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Satoshi</firstname>
+ <surname>Asami</surname>
+ <contrib>撰写者 </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>FreeBSD 开发模式</title>
+
+ <indexterm>
+ <primary>FreeBSD Project</primary>
+ <secondary>开发模式</secondary>
+ </indexterm>
+ <para>FreeBSD 的开发是一个非常开放且有有伸缩性的过程,
+ 就像从我们的<ulink
+ url="&url.articles.contributors;/article.html">
+ 贡献者列表</ulink>里看到的,它是完全由来自全世界的数以百计的贡献者发展起来的。
+ FreeBSD 的开发基础结构允许数以百计的开发者通过互联网协同工作。
+ 我们也经常关注着那些对我们的计划感兴趣的新开发者和新的创意,
+ 那些有兴趣更进一步参与项目的人只需要在
+ &a.hackers; 联系我们。
+ &a.announce; 对那些希望了解我们工作所涉及到哪些领域的人也是有用的。</para>
+
+ <para>无论是独立地工作或者封闭式的团队工作,
+ 了解FreeBSD计划和它的开发过程都是有益的:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>CVS 代码库<anchor
+ id="development-cvs-repository"></term>
+
+ <indexterm>
+ <primary>CVS</primary>
+ <secondary>代码库</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>并行版本系统</primary>
+ <see>CVS</see>
+ </indexterm>
+ <listitem>
+ <para>FreeBSD 的中央源代码树是由
+ <ulink url="http://www.cvshome.org/">CVS</ulink>
+ (并行版本控制系统)来维护的。CVS 是一个与
+ FreeBSD 捆绑的可自由获得的源代码控制工具。
+ 主 <ulink url="http://www.FreeBSD.org/cgi/cvsweb.cgi">CVS
+ 代码库</ulink>放置在美国加利福尼亚州圣克拉拉的一台机器上,
+ 它被复制到全世界的大量镜像站上。CVS 中包括了 <link
+ linkend="current">-CURRENT</link> 和 <link
+ linkend="stable">-STABLE</link> 树,
+ 它同样可以很容易地复制到您的机器上。
+ 请查阅<link linkend="synching">
+ 同步您的源代码树</link>这一章节来了解更多信息。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>committer 列表<anchor
+ id="development-committers"></term>
+
+ <indexterm><primary>committers</primary></indexterm>
+ <listitem>
+ <para><firstterm>committer</firstterm>
+ 是那些对 CVS 树有<emphasis>写</emphasis>权限的人,
+ 他们被授权修改 FreeBSD 的源代码
+ (术语 <quote>committer</quote>
+ 来自于 &man.cvs.1; 的 <command>commit</command>
+ 命令,这个命令用来把新的修改提交给 CVS
+ 代码库)。提交修正的最好方法是使用 &man.send-pr.1;
+ 命令。如果您发现在系统中出现了一些问题的话,
+ 您也可以通过邮件将它们发送至 &a.committers;。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>FreeBSD 核心团队<anchor id="development-core"></term>
+
+ <indexterm><primary>core team</primary></indexterm>
+ <listitem>
+ <para>如果把 FreeBSD 项目看作一个公司,那么
+ <firstterm>FreeBSD 核心团队</firstterm>就相当于董事会。
+ 核心团队的主要任务是提出总体上的发展计划,然后确定一个正确的方向。
+ 邀请那些富有献身精神和可靠的开发者加入到 committer
+ 队伍中来也是核心团队的工作之一,
+ 这些新的成员将作为新核心团队成员和其他人一起继续前进。
+ 当前的核心团队是 2004 年 7 月从 committer
+ 中选举产生的。选举每两年一次。
+ </para>
+
+ <para>一些核心团队的成员还负责特定的责任范围,
+ 也就是说他们必须尽力确保某个子系统能工作正常。
+ FreeBSD 开发者的完整列表和他们的责任范围,请参见<ulink
+ url="&url.articles.contributors;/article.html">
+ 贡献者列表</ulink></para>
+
+ <note>
+ <para>核心团队的大部分成员加入 FreeBSD 开发的时候都是志愿的,
+ 并没有从项目中获得任何财政上的资助,
+ 所以<quote>承诺</quote>不应该被理解为<quote>支持保证</quote>。
+ 前面所述<quote>董事会</quote>的类推并不十分准确,
+ 或许更好的说法是,他们是一群愿意放弃他们的生活,
+ 投身于 FreeBSD 项目而非选择其个人更好的生活的人!</para>
+ </note>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>外围贡献者</term>
+
+ <indexterm><primary>contributors</primary></indexterm>
+ <listitem>
+ <para>事实上,最大的开发团队正是为我们提供反馈和错误修补的用户自己。
+ FreeBSD 的非集中式的开发者保持联系的主要方式就是预订
+ &a.hackers;,很多事情在那里讨论。查看<xref
+ linkend="eresources">了解众多 FreeBSD 邮件列表的更多信息。</para>
+
+ <para><citetitle><ulink
+ url="&url.articles.contributors;/article.html">
+ FreeBSD 贡献者列表</ulink></citetitle> 很长并在不断增长,
+ 为什么不加入它来为 FreeBSD 做贡献呢?</para>
+
+ <para>提供代码不是为这个计划做贡献的唯一方式;
+ 有一个更完整的需要做的事情的列表,可以参见 <ulink
+ url="&url.base;/index.html">FreeBSD
+ 项目网站</ulink>。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>总的来说,我们的开发模式好像是一组没有拘束的同心圆。
+ 这种集中式的开发模式,主要是考虑到<emphasis>用户</emphasis>的方便,
+ 同时让他们能很容易地维护同一份软件,
+ 而不会把潜在的贡献者排除在外!
+ 我们的目标是提供一个包含有大量具有一致性
+ <link linkend="ports">应用程序</link>的稳定的操作系统,
+ 以利于用户的安装和使用,&mdash;
+ 这种模式在完成目标的过程中工作得非常有效。</para>
+
+ <para>我们对于那些想要加入,成为FreeBSD开发者的期待是:
+ 具有如同当前其他人一样的投入,来确保持续的成功!</para>
+ </sect2>
+
+ <sect2 id="relnotes">
+ <title>最新的 FreeBSD 发行版本</title>
+
+ <indexterm><primary>NetBSD</primary></indexterm>
+ <indexterm><primary>OpenBSD</primary></indexterm>
+ <indexterm><primary>386BSD</primary></indexterm>
+ <indexterm><primary>Free Software Foundation</primary></indexterm>
+ <indexterm><primary>U.C. Berkeley</primary></indexterm>
+ <indexterm>
+ <primary>Computer Systems Research Group (CSRG)</primary>
+ </indexterm>
+ <para>FreeBSD 是一个免费使用且带有完整源代码的基于 4.4BSD-Lite 的系统,
+ 它广泛运行于 Intel &i386;、&i486;、&pentium;、
+ &pentium;&nbsp;Pro、
+ &celeron;、
+ &pentium;&nbsp;II、
+ &pentium;&nbsp;III、
+ &pentium;&nbsp;4(或者兼容系统)、
+ &xeon;、DEC <trademark>Alpha</trademark>
+ 和 Sun &ultrasparc; 的计算机系统上。
+ 它主要以 加州大学伯克利分校 的
+ CSRG 研究小组的软件为基础,并加入了 NetBSD、OpenBSD、386BSD
+ 以及来自 自由软件基金会 的一些东西。</para>
+
+ <para>自从 94 年末我们的 FreeBSD&nbsp;2.0 发行以来,
+ FreeBSD 的性能,可定制性,稳定性都有了令人注目的提高。
+ <!-- XXX is the rest of this paragraph still true ? -->
+ 最大的变化是通过 整合虚拟内存/文件系统 中的高速缓存改进的虚拟内存系统,
+ 它不仅提升了性能,而且减少了 FreeBSD 对内存的需要,
+ 使得 5&nbsp;MB 内存成为可接受的最小配置。
+ 其他的改进包括完整的 NIS 客户端和服务器端的支持,
+ 事务 TCP 协议支持,按需拨号的 PPP,集成的 DHCP 支持,改进的 SCSI 子系统,
+ ISDN 的支持,ATM,FDDI,快速 Gigabit 以太网(1000&nbsp;Mbit)支持,
+ 提升了最新的 Adaptec 控制器的支持和修补了很多的错误。</para>
+
+ <para>除了最基本的系统软件,FreeBSD
+ 还提供了一个拥有成千上万广受欢迎的程序组成的软件的 ports collection。
+ 到本书付印时,已有超过 &os.numports; 个 ports (ports 包括从
+ http(WWW) 服务器到游戏、程序设计语言、编辑器以及您能想到的几乎所有的东西。
+ 完整的 ports collection 大约需要
+ &ports.size; 的存储空间。所有的只提供对原始代码的
+ <quote>修正</quote>。这使得我们能够容易地更新软件,
+ 而且减少了老旧的 1.0 ports collection 对硬盘空间的浪费。
+ 要编译一个 port,您只要切换到您想要安装的程序的目录,
+ 输入 <command>make
+ install</command>,然后让系统去做剩下的事情。
+ 您要编译的每一个程序完整的原始代码可以从 CDROM 或本地 FTP
+ 获得,所以您只需要编译您想要软件的足够的磁盘空间。
+ 几乎大多数的软件都提供了事先编译好的
+ <quote>package</quote> 以方便安装,对于那些不希望从源代码编译他们自己的
+ ports 的人只要使用一个简单的命令
+ (<command>pkg_add</command>)就可以安装。
+ 有关 package 和 ports 的更多信息可以在<xref linkend="ports">中找到。</para>
+
+ <para>您可以在最近的 FreeBSD 主机的 <filename>/usr/share/doc</filename>
+ 目录下找到许多有用的文件来帮助您安装及使用 FreeBSD。
+ 您也可以用一个 HTML 浏览器来查阅本地安装的手册,
+ 使用下面的 URL:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>FreeBSD 使用手册</term>
+
+ <listitem>
+ <para><ulink type="html"
+ url="file://localhost/usr/share/doc/handbook/index.html"><filename>/usr/share/doc/handbook/index.html</filename></ulink></para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>FreeBSD FAQ</term>
+
+ <listitem>
+ <para><ulink type="html"
+ url="file://localhost/usr/share/doc/faq/index.html"><filename>/usr/share/doc/faq/index.html</filename></ulink></para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>您也可以查看在 <ulink
+ url="&url.base;/index.html">http://www.FreeBSD.org/</ulink>
+ 主站的副本(持续更新中)。</para>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/kernelconfig/Makefile b/zh_CN.GB2312/books/handbook/kernelconfig/Makefile
new file mode 100644
index 0000000000..c63975d774
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/kernelconfig/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= kernelconfig/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml
new file mode 100644
index 0000000000..7dfb54ccf5
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml
@@ -0,0 +1,1534 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese Documentation Project
+
+ Original Revision: 1.140
+ $FreeBSD$
+-->
+
+<chapter id="kernelconfig">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Updated and restructured by </contrib>
+ <!-- Mar 2000 -->
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Jake</firstname>
+ <surname>Hamby</surname>
+ <contrib>Originally contributed by </contrib>
+ <!-- 6 Oct 1995 -->
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>配置FreeBSD的内核</title>
+
+ <sect1 id="kernelconfig-synopsis">
+ <title>概述</title>
+
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>建立一个定制的内核</secondary>
+ </indexterm>
+
+ <para>内核是&os;操作系统的核心。它用来管理内存,执行
+ 安全控制,网络,磁盘访问等等。虽然现在&os;可以更多地
+ 进行动态配置,但有时您还是需要重新配置和编译您的内核。</para>
+
+ <para>读完这章,您将了解到:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para> 为什么需要建立一个定制的内核。</para>
+ </listitem>
+
+ <listitem>
+ <para> 如何写一个内核配置文件,或修改已存在的配置文件。</para>
+ </listitem>
+
+ <listitem>
+ <para> 如何使用内核配置文件创建和建立一个新的内核。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何安装一个新内核。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在<filename>/dev</filename>中创建设备节点。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何出现问题怎么办。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>这一章给出的命令应该以 <username>root</username> 身份执行,
+ 否则可能会不成功。</para>
+ </sect1>
+
+ <sect1 id="kernelconfig-custom-kernel">
+ <title>为什么需要建立一个定制的内核?</title>
+
+ <para>过去, &os; 采用称作 <quote>单片式</quote> 的内核。
+ 这句话的意思是说内核是一个大的程序, 支持固定的设备,
+ 如果您希望改变内核的行为则必须编译一个新的,
+ 并重新启动计算机来引导它。</para>
+
+ <para>今天, &os; 已经迅速地转移到了一个新的模型,
+ 其重要特征是内核功能可以由能够根据需要动态加载和卸载的模块来提供。
+ 这是的内核能够迅速地适应硬件的调整 (例如笔记本电脑的 PCMICA),
+ 或为内核增加在最初编译它时所不具备的新的功能。
+ 这一模式成为模块化内核。</para>
+
+ <para>尽管如此, 一些功能仍然需要静态地连编进内核。
+ 一些情况是因为这些功能于内核的结合十分紧密,
+ 而不可能将它们做成可以动态加载的。
+ 另一种情况是因为没有人有时间来编写实现那个功能的可以动态加载的内核模块。</para>
+
+ <para>建造定制的内核是几乎每一个 BSD 用户所必须经历的一关。
+ 尽管这项工作可能比较耗时, 但它能够为使用 &os; 系统带来很多好处。
+ 与必须支持大量各式硬件的 <filename>GENERIC</filename>
+ 内核不同, 定制的内核可以只包含对于
+ <emphasis>您的</emphasis> PC 硬件的支持。
+ 这有很多好处, 例如:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>更快地启动。 因为内核只需要检测您系统上的硬件,
+ 启动时所花费的时间将大大缩短。</para>
+ </listitem>
+
+ <listitem>
+ <para>使用更少的内存。 定制的内核通常会比
+ <filename>GENERIC</filename> 内核使用更少的内存,
+ 由于内核必须时刻处于物理内存中, 因此这就显得更加重要。
+ 给予这样的原因, 对于内存较小的系统来说,
+ 定制内核将发挥更大的作用。</para>
+ </listitem>
+
+ <listitem>
+ <para>支持更多的硬件。 定制的内核允许您增加类似声卡这样的
+ <filename>GENERIC</filename> 内核没有提供内建支持的硬件。</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="kernelconfig-building">
+ <title>建立并安装一个定制的内核</title>
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>建立/安装</secondary>
+ </indexterm>
+
+ <para>首先对内核构建目录做一个快速的浏览。
+ 这里所提到的所有目录都在
+ <filename>/usr/src/sys</filename> 目录中; 也可以通过
+ <filename>/sys</filename> 来访问它。
+ 这里的众多子目录包含了内核的不同部分,
+ 但对我们所要完成的任务最重要的目录是
+ <filename><replaceable>arch</replaceable>/conf</filename>,
+ 您将在这里编辑定制的内核配置; 以及
+ <filename>compile</filename>, 编译过程中的文件将放置在这里。
+ <replaceable>arch</replaceable> 表示
+ <filename>i386</filename>、 <filename>alpha</filename>、
+ <filename>amd64</filename>、 <filename>ia64</filename>、
+ <filename>powerpc</filename>、 <filename>sparc64</filename>, 或
+ <filename>pc98</filename> (在日本比较流行的另一种
+ PC 硬件开发分支)。 在特定硬件架构目录中的文件只和特定的硬件有关;
+ 而其余代码则是与机器无关的, 则所有已经或将要移植并运行 &os;
+ 的平台上都共享这些代码。
+ 文件目录是按照逻辑组织的, 所支持的硬件设备、
+ 文件系统, 以及可选的组件通常都在它们自己的目录中。
+ 5.X 版之前的 &os; 只支持
+ <filename>i386</filename>、 <filename>alpha</filename>
+ 和 <filename>pc98</filename> 这三种硬件架构。</para>
+
+ <para>这一章提供的例子假定您使用 i386 架构的计算机。
+ 如果您的情况不是这样, 只需对目录名作相应的调整即可。</para>
+
+ <note>
+ <para>如果在您的系统上<emphasis>没有</emphasis><filename>/usr/src/sys</filename>这个目录,
+ 那么内核源代码就没有被安装。最简单的方法是以<username>root</username>身份执行<command>/stand/sysinstall</command>,
+ 选择<guimenuitem>Configure</guimenuitem>,
+ 接着是<guimenuitem>Distributions</guimenuitem>,
+ 下来<guimenuitem>src</guimenuitem>,
+ 最后<guimenuitem>sys</guimenuitem>。
+ 如果您已经有一张<quote>官方</quote>&os;系统安装盘;并且您有权限使用
+ 光驱,那么您也可以通过下面命令行来安装源代码:</para>
+ <screen>&prompt.root; <userinput>mount /cdrom</userinput>
+&prompt.root; <userinput>mkdir -p /usr/src/sys</userinput>
+&prompt.root; <userinput>ln -s /usr/src/sys /sys</userinput>
+&prompt.root; <userinput>cat /cdrom/src/ssys.[a-d]* | tar -xzvf -</userinput></screen>
+</note>
+
+ <para>接下来, 进入 <filename><replaceable>arch</replaceable>/conf</filename>
+ 目录下面, 复制 <filename>GENERIC</filename> 配置文件,
+ 并给这个文件起一个容易辨认的名称, 它就是您的内核名称。例如:</para>
+ <screen>&prompt.root; <userinput>cd /usr/src/sys/<replaceable>i386</replaceable>/conf</userinput>
+&prompt.root; <userinput>cp GENERIC MYKERNEL</userinput></screen>
+
+ <para>通常,这个名称是大写的,如果您正维护着多台不同硬件的&os;机器,
+ 以您机器的域名来命名是非常好的主意。我们把它命名为<filename>MYKERNEL</filename>就是这个原因。
+ </para>
+
+ <tip>
+ <para>将您的内核配置文件直接保存在
+ <filename>/usr/src</filename> 可能不是一个好主意。
+ 如果您遇到问题, 删掉
+ <filename>/usr/src</filename> 并重新开始很可能是一个诱人的选择。
+ 一旦开始做这件事,
+ 您可能几秒钟之后才会意识到您同时会删除定制的内核配置文件。
+ 另外, 也不要直接编辑 <filename>GENERIC</filename>,
+ 因为下次您
+ <link linkend="cutting-edge">更新代码</link> 时它会被覆盖,
+ 而您的修改也就随之丢失了。</para>
+
+ <para>您可以考虑将内核配置文件放到别的地方,
+ 然后在 <filename><replaceable>i386</replaceable></filename>
+ 目录中建立一个符号连接指向它。</para>
+
+ <para>例如:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src/sys/<replaceable>i386</replaceable>/conf</userinput>
+&prompt.root; <userinput>mkdir /root/kernels</userinput>
+&prompt.root; <userinput>cp GENERIC /root/kernels/<replaceable>MYKERNEL</replaceable></userinput>
+&prompt.root; <userinput>ln -s /root/kernels/<replaceable>MYKERNEL</replaceable></userinput></screen>
+ </tip>
+
+ <note>
+ <para>必须以 <username>root</username> 身份执行这些和接下来命令,
+ 否则就会得到 <errortype>permission denied</errortype> 的错误提示。
+ </para>
+ </note>
+
+ <para>现在就可以用您喜欢的文本编辑器来编辑 <filename>MYKERNEL</filename> 了。
+ 如果您刚刚开始使用 FreeBSD, 唯一可用的编辑器很可能是
+ <application>vi</application>, 它的使用比较复杂, 限于篇幅,
+ 这里不予介绍, 您可以在 <link
+ linkend="bibliography">参考书目</link> 一章中找到很多相关书籍。
+ 不过, &os; 也提供了一个更好用的编辑器,
+ 它叫做 <application>ee</application>, 对于新手来说,
+ 它很可能是一个不错的选择。
+ 您可以修改配置文件中的注释以反映您的配置,
+ 或其他与 <filename>GENERIC</filename> 不同的地方。</para>
+ <indexterm><primary>SunOS</primary></indexterm>
+
+ <para>如果您在&sunos;或者其他BSD系统下定制过内核,那这个文件中的绝大部分将对您非常熟悉。
+ 如果您使用的是诸如DOS这样的系统,那<filename>GENERIC</filename>配置文件看起来就非常困难,
+ 所以在下面的 <link linkend="kernelconfig-config">配置文件</link>章节将慢慢地、仔细地进行介绍。
+ </para>
+
+ <note>
+ <para>如果您和 &os; project 进行了 <link
+ linkend="cutting-edge">代码同步</link>,
+ 则一定要在进行任何更新之前查看
+ <filename>/usr/src/UPDATING</filename>。
+ 这个文件中描述了更新过的代码中出现的重大问题或需要注意的地方。
+ <filename>/usr/src/UPDATING</filename> 总是和您的
+ &os; 源代码对应, 因此能够提供比手册更具时效性的新内容。</para>
+ </note>
+
+ <para>现在应该编译内核的源代码了。 一共有两种方法来完成这项工作,
+ 使用哪一种取决于您为什么要重新编译内核, 以及所运行的 &os;
+ 版本。</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如果您<emphasis>只</emphasis>安装内核源代码,使用方法1。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>如果您运行的是&os;4.0以前的版本的话,而且您<emphasis>不</emphasis>升级到
+ &os;&nbsp;4.0或更高版本,只要使用方法1。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para> 如果您在没有升级源代码的情况下编译一个新内核(也许您只想为内核添加一个新的选项,
+ 如<literal>IPFIREWALL</literal>),可以使用任何一种方法。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>如果您正在重建的内核是作为<maketarget>make world</maketarget>进程的一部分,需要使用方法2。
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <indexterm>
+ <primary><command>cvsup</command></primary>
+ </indexterm>
+ <indexterm><primary>匿名 CVS</primary></indexterm>
+ <indexterm><primary>CTM</primary></indexterm>
+ <indexterm>
+ <primary>CVS</primary>
+ <secondary>匿名</secondary>
+ </indexterm>
+
+ <para>如果从上次成功地完成 <maketarget>buildworld</maketarget>-<maketarget>installworld</maketarget>
+ 以来您还 <emphasis>没有</emphasis> 升级过代码
+ (也就是没有运行 <application>CVSup</application>、
+ <application>CTM</application>, 或使用
+ <application>anoncvs</application>), 则可以放心使用
+ <command>config</command>、 <maketarget>make depend</maketarget>、
+ <command>make</command>、 <maketarget>make install</maketarget>。
+ </para>
+
+ <procedure>
+ <title>方法1. 用<quote>传统</quote>方法建立一个内核</title>
+
+ <step>
+ <para>运行&man.config.8;来产生内核源代码。</para>
+
+ <screen>&prompt.root; <userinput>/usr/sbin/config <replaceable>MYKERNEL</replaceable></userinput></screen>
+ </step>
+
+ <step>
+ <para>进入编译内核的目录。 &man.config.8; 将在像上面一样显示执行它所在的目录的名字。</para>
+
+ <screen>&prompt.root; <userinput>cd ../compile/<replaceable>MYKERNEL</replaceable></userinput></screen>
+
+ <para>对于 &os; 5.0 以及更早的版本, 使用下面的形式:</para>
+
+ <screen>&prompt.root; <userinput>cd ../../compile/<replaceable>MYKERNEL</replaceable></userinput></screen>
+ </step>
+
+ <step>
+ <para>编译内核。</para>
+
+ <screen>&prompt.root; <userinput>make depend</userinput>
+&prompt.root; <userinput>make</userinput></screen>
+ </step>
+
+ <step>
+ <para>安装新内核。</para>
+
+ <screen>&prompt.root; <userinput>make install</userinput></screen>
+ </step>
+ </procedure>
+
+ <procedure>
+ <title>方法2. 用<quote>新的</quote>方法建立一个内核</title>
+
+ <step>
+ <para>切换到<filename>/usr/src</filename> 目录。</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src</userinput></screen>
+ </step>
+
+ <step>
+ <para>编译内核。</para>
+
+ <screen>&prompt.root; <userinput>make buildkernel KERNCONF=<replaceable>MYKERNEL</replaceable></userinput></screen>
+ </step>
+
+ <step>
+ <para>安装新内核。</para>
+
+ <screen>&prompt.root; <userinput>make installkernel KERNCONF=<replaceable>MYKERNEL</replaceable></userinput></screen>
+ </step>
+ </procedure>
+
+ <note>
+ <para>在&os;&nbsp;4.2老版本里面您必须用<literal>KERNEL=</literal>
+ 来替换<literal>KERNCONF=</literal>。2001年2月2日以后生成的4.2-STABLE
+ 就可以认出<literal>KERNCONF=</literal>。</para>
+ </note>
+
+ <indexterm>
+ <primary><filename class="directory">/boot/kernel.old</filename></primary>
+ </indexterm>
+
+ <para>新内核将会被复制到 <filename
+ class="directory">/boot/kernel</filename> 目录中成为
+ <filename>/boot/kernel/kernel</filename> 而旧的则被移到
+ <filename>/boot/kernel.old/kernel</filename>。
+ 现在关闭系统, 然后用新的内核启动计算机。 如果出现问题,
+ 后面的一些 <link linkend="kernelconfig-trouble">故障排除方法</link>
+ 将帮您摆脱困境。 如果您的内核 <link
+ linkend="kernelconfig-noboot">无法启动</link>, 请参考那一节。</para>
+
+ <note>
+ <para>在 &os; 4.X 以及更早的版本中, 内核被安装到
+ <filename>/kernel</filename> 而模块则放到 <filename
+ class="directory">/modules</filename>, 旧的内核则被备份到
+ <filename>/kernel.old</filename>。
+ 其他与启动过程相关的文件, 如
+ &man.loader.8; 以及配置则放在
+ <filename>/boot</filename>。 第三方或定制的模块也可以放在
+ <filename class="directory">/modules</filename>,
+ 不过应该注意保持模块和内核的同步时很重要的,
+ 否则会导致不稳定和错误。</para>
+ </note>
+
+ <note>
+ <para>如果添加了新设备 (例如声卡)
+ 并在运行 &os;&nbsp;4.X 或更早的版本,
+ 则可能好需要在
+ <filename class="directory">/dev</filename> 目录中添加它们的设备节点之后才能使用。
+ 欲了解详情,请参考本章稍后的 <link
+ linkend="kernelconfig-nodes">制作设备节点</link>
+ 一节。</para>
+ </note>
+ </sect1>
+
+ <sect1 id="kernelconfig-config">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Joel</firstname>
+ <surname>Dahl</surname>
+ <contrib>Updated for &os; 5.X by </contrib>
+ <!-- August 2004, PR docs/70674 -->
+ </author>
+ <!-- <editor><othername role="freefall login">ceri</othername></editor> -->
+ </authorgroup>
+ </sect1info>
+ <title>配置文件</title>
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>NOTES</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>kernel</primary>
+ <secondary>LINT</secondary>
+ </indexterm>
+ <indexterm><primary>NOTES</primary></indexterm>
+ <indexterm><primary>LINT</primary></indexterm>
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>配置文件</secondary>
+ </indexterm>
+
+ <para>配置文件的格式是非常简单的。
+ 每一行都包括一个关键词, 以及一个或多个参数。
+ 实际上, 绝大多数行都只包括一个参数。
+ 在 <literal>#</literal> 之后的内容会被认为是注释而忽略掉。
+ 下面的每个小节,将依次介绍每个列在
+ <filename>GENERIC</filename> 中的选项,
+ 当然, 一些相关的关键词 (如网络) 将被放在一起,
+ 尽管在 <filename>GENERIC</filename> 中可能分散在各处。 <anchor
+ id="kernelconfig-options"> 如果需要与平台有关的选项和设备的详细列表,
+ 请参考与 <filename>GENERIC</filename> 在同一个目录中的那个<filename>NOTES</filename>,
+ 而平台无关的选项, 则可以在
+ <filename>/usr/src/sys/conf/NOTES</filename>
+ 找到。</para>
+
+ <note>
+ <para><filename>NOTES</filename> 在 &os;&nbsp;4.X 中并不存在。
+ 与此相反, 请参考 <filename>LINT</filename> 文件来获得关于
+ <filename>GENERIC</filename> 中的选项和设备详细介绍。
+ <filename>LINT</filename> 在 4.X 中完成了两项使命:
+ 为构建定制内核提供可选的选项, 以及提供尽可能多的调整为非默认值的选项。
+ 这么做背后的原因是这种配置文件能够帮助 (并且仍然能)
+ 测试新代码以及现有代码的修改是否会造成与内核其他部分的冲突。
+ 然而, 内核配置的架构在 5.X 中经历了巨大的变化;
+ 其中的一个例子是设备驱动的选项被移到了 <literal>hints</literal>
+ 中, 从而可以随时修改并在启动时动态加载,
+ 而 <filename>LINT</filename> 不能再包含这些 hints 了。
+ 由于这个以及许多其他原因,
+ 决定将 <filename>LINT</filename> 改名为
+ <filename>NOTES</filename>, 而保留它的主要是为了前面所说的第一个原因:
+ 给出可用的选项, 为用户提供方便。</para>
+
+ <para>在 &os; 5.X 和以后的版本中您仍然可以通过下面的命令生成
+ <filename>LINT</filename> 文件:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src/sys/<replaceable>i386</replaceable>/conf && make LINT</userinput></screen>
+ </note>
+
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>配置文件例子</secondary>
+ </indexterm>
+
+ <para>下面是一个 <filename>GENERIC</filename>
+ 内核配置文件的例子, 它包括了一些需要解释的注释。
+ 这个例子应该和您复制的
+ <filename>/usr/src/sys/<replaceable>i386</replaceable>/conf/GENERIC</filename>
+ 非常接近。</para>
+
+ <programlisting>#
+# GENERIC -- Generic kernel configuration file for &os;/i386
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.&os;.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# &os; World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# &dollar;FreeBSD: /repoman/r/ncvs/src/sys/i386/conf/GENERIC,v 1.413 2004/08/11 01:34:18 rwatson Exp &dollar;</programlisting>
+
+ <para>下面这个选项在<emphasis>每个</emphasis>中都要有:</para>
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>机器</secondary>
+ </indexterm>
+
+ <programlisting>machine i386</programlisting>
+
+ <para>这是机器的架构, 他只能是
+ <literal>alpha</literal>, <literal>amd64</literal>,
+ <literal>i386</literal>, <literal>ia64</literal>,
+ <literal>pc98</literal>, <literal>powerpc</literal>, 或
+ <literal>sparc64</literal> 中的一种。</para>
+
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>cpu</secondary>
+ </indexterm>
+ <programlisting>cpu I486_CPU
+cpu I586_CPU
+cpu I686_CPU</programlisting>
+
+ <para>上面的选项指定了您系统中所使用的 CPU 类型。
+ 您可以使用多个 CPU 类型 (例如,
+ 您不确定是应该指定
+ <literal>I586_CPU</literal> 或 <literal>I686_CPU</literal>)。
+ 然而对于定制的内核, 最好能够只指定您使用的那种 CPU。
+ 如果您对于自己使用的 CPU 类型没有把握, 可以通过查看
+ <filename>/var/run/dmesg.boot</filename> 中的启动信息来了解。</para>
+
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>cpu类型</secondary>
+ </indexterm>
+ <para>在&os;的内核里面仍然支持<literal>I386_CPU</literal>,但是在-STABLE和
+ -CURRENT里面缺省已经被禁用了。这就意味着安装&os;在386-class的cpu,
+ 一般有下面几种情况:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>安装一个老的&os; release并且按照<xref linkend="kernelconfig-building">从源码重建系统.</para>
+ </listitem>
+
+ <listitem>
+ <para>在一个新的机器上构建用户和内核程序,然后用已经编译好的<filename>/usr/obj</filename>下的文件
+ 安装到386的机器上(详细情况看<xref linkend="small-lan">)。</para>
+ </listitem>
+
+ <listitem>
+ <para>定制您自己的 &os; 发行版本, 其中的安装光盘包含
+ <literal>I386_CPU</literal> 支持。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>第一种情况可能是最容易的, 但您需要大量的磁盘空间,
+ 而 386-级别拥有这种配置的计算机可能很难找到。</para>
+
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>ident</secondary>
+ </indexterm>
+
+ <programlisting>ident GENERIC</programlisting>
+
+ <para>这是内核的名字。 您应该取一个自己的名字,
+ 例如取名叫 <literal>MYKERNEL</literal>,
+ 如果您一直在按照前面的说明做的话。
+ 您放在
+ <literal>ident</literal> 后面的字符串在启动内核时会显示出来,
+ 因此如果希望能够容易区分常用的内核和刚刚定制的内核,
+ 就应该采取不同的名字 (例如, 您想定制一个试验性的内核)。</para>
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>maxusers</secondary>
+ </indexterm>
+
+ <programlisting>maxusers <replaceable>n</replaceable></programlisting>
+
+ <para>这个 <literal>maxusers</literal> 选项设置了重要系统表的大小。
+ 这个数值粗略地假设您的机器同时会有多少用户。</para>
+
+ <para>从&os;&nbsp;4.5开始,如果手动设置这个值为<literal>0</literal>系统将会自动赋值。<footnote>
+ <para>自动赋值算法是设置<literal>maxusers</literal>等于系统的内存总量,最小到32,最大到384。
+ </para></footnote>.
+ 在&os;&nbsp; 5.X 和更高版本中,<literal>maxusers</literal> 如果没有定义,将缺省为
+ <literal>0</literal>。如果您使用的&os;早于4.5, 或者您想自己设置这个值,
+ 那么您至少要设置<literal>maxusers</literal>为4, 特别是您要执行X Window或是编译程序。
+ 原因是<literal>maxusers</literal>值决定了系统同时可有多少个进程(process),
+ 其算法是<literal>20 + 16 * maxusers</literal>,所以如果您设置<literal>maxusers</literal>为1,
+ 则您的系统只能同时存在36个进程,包括18个(或更多)系统启动要占去的进程。
+ 如果您执行了X Window,则又要用掉15个以上。甚至阅读一个man page也会使用九个进程来过滤、解压缩、然后显示文件。
+ 设置<literal>maxusers</literal>到64将允许您有1044个进程,对任何人应该都是足够的。
+ 当您执行程序时, 得到像是<errortype>proc table full</errortype>这样的错误信息,
+ 或者您要建一个同时会有很多人来访问的网站(比如<hostid role="fqdn">ftp.FreeBSD.org</hostid>)时,
+ 您就要增加这个设置的值,然后重新编译内核。</para>
+
+ <note>
+ <para><literal>maxusers</literal> 并 <emphasis>不会</emphasis>
+ 限制能够登录到您机器上的用户数量。
+ 它只是简单地设置一些系统表的尺寸,
+ 以适应您的系统中登录这样多的用户时能够执行的最大进程数。
+ <emphasis>确实</emphasis> 会限制同时能够登录的远程用户以及
+ X 终端窗口的关键字是 <link
+ linkend="kernelconfig-ptys"><literal>pseudo-device pty
+ 16</literal></link>。 在 &os;&nbsp;5.X 中, 您并不需要担心这个数值, 因为 &man.pty.4; 驱动提供了
+ <quote>自动克隆(auto-cloning)</quote> 的能力;
+ 在配置文件中您只需简单地指定
+ <literal>device pty</literal> 就可以了。</para>
+ </note>
+
+ <programlisting># Floating point support - do not disable.
+device npx</programlisting>
+
+ <para><literal>npx</literal> 是 &os; 中浮点运算单元的接口,
+ 用于支持硬件的浮点运算协处理器, 以及软件仿真程序。
+ 这个设置 <emphasis>不是</emphasis>
+ 可有可无的。</para>
+
+ <programlisting># Pseudo devices
+device loop # Network loopback</programlisting>
+
+ <para>这是 TCP/IP 的通用回环设备。 如果您 telnet
+ 或 FTP 到 <hostid>localhost</hostid> (也就是 <hostid
+ role="ipaddr">127.0.0.1</hostid>) 则将通过这个设备回到本机。
+ 这个设备是 <emphasis>必需的</emphasis>。 在
+ &os;&nbsp;4.X 中, 则应使用 <literal>pseudo-device
+ loop</literal>。</para>
+
+ <para>接下来的那些项有一个或多个选项,关于每个选项的更多的信息参考下面注释。</para>
+
+ <programlisting>#To statically compile in device wiring instead of /boot/device.hints
+#hints "GENERIC.hints" # Default places to look for devices.</programlisting>
+
+ <para>在&os; 5.X和更新的版本里面,&man.device.hints.5;被用来配置设备驱动选项。
+ 在启动的时候&man.loader.8;将会检查缺省位置<filename>/boot/devicehints</filename>。
+ 使用<literal>hints</literal>选项您就可以把这些hints静态编译进内核。
+ 这样就没有必要在<filename>/boot</filename>下创建<filename>devicehints</filename>。
+ </para>
+
+ <!-- XXX: Add a comment here that explains when compiling hints into
+ the kernel is a good idea and why. -->
+
+ <programlisting>#makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols</programlisting>
+
+ <para>一般的 &os; 构建过程并不包括调试信息,
+ 在构建内核时, 绝大多数符号会在最终的内核连接之后剔除出去,
+ 以节省安装时所需的空间。 如果您打算测试 -CURRENT 分支的内核,
+ 或开发您自己的 &os; 内核功能, 则可能会需要去掉这一行的注释。
+ 这将启用 <option>-g</option> 选项, 它会在 &man.gcc.1;
+ 中打开调试信息。 如果您使用 <quote>传统</quote>
+ 方法来构建内核, 也可以通过 &man.config.8; 的
+ <option>-g</option> 选项来达到同样的目的
+ (参见 <xref linkend="kernelconfig-building">
+ 了解进一步的信息)。</para>
+
+ <programlisting>options SCHED_4BSD # 4BSD scheduler</programlisting>
+
+ <para>这是 &os; 的传统调度器。 取决于您系统的工作负荷,
+ 使用新的 ULE 调度器通常可以获得更好的性能。 它是专门为
+ &os; 在 SMP 上运行而设计的调度器, 但在 UP
+ 系统上也能工作得很好。 如果您想试验这个功能,
+ 则应把配置文件中的 <literal>SCHED_4BSD</literal>
+ 改为 <literal>SCHED_ULE</literal>。</para>
+
+ <programlisting>options INET # InterNETworking</programlisting>
+
+ <para>网络支持,即使您不打算连网,也请保留它,大部分的程序至少需要回环网络(就是和本机进行网络连接),所以强烈要求保留它。
+ </para>
+
+ <programlisting>options INET6 # IPv6 communications protocols</programlisting>
+
+ <para>这将打开IPv6连接协议。</para>
+
+ <programlisting>options FFS # Berkeley Fast Filesystem</programlisting>
+
+ <para>这是最基本的硬盘文件系统,如果打算从本地硬盘启动,请保留它。</para>
+
+ <programlisting>options UFS_ACL # Support for access control lists</programlisting>
+
+ <para>这个选项只能在 &os;&nbsp;5.X 和更高版本中使用,
+ 它将启用内核中的访问控制表的支持。
+ 这依赖于扩展属性以及 <acronym>UFS2</acronym>,
+ 以及在 <xref linkend="fs-acl"> 中所介绍的那些特性。
+ <acronym>ACL</acronym> 默认是启用的,
+ 并且如果已经在文件系统上使用了这一特性,
+ 就不应再关掉它, 因为这会去掉文件的访问控制表,
+ 并以不可预期的方式改变受保护的文件的访问方式。</para>
+
+ <programlisting>options UFS_DIRHASH # Improve performance on big directories</programlisting>
+
+ <para>通过使用额外的内存,这个选项可以加速在大目录上的磁盘操作。
+ 您应该在大型服务器和频繁使用的工作站上打开这个选项,而在磁盘操作不是很重要的
+ 小型系统上关闭它,比如防火墙。</para>
+
+ <programlisting>options SOFTUPDATES # Enable FFS Soft Updates support</programlisting>
+
+ <para>这个选项将启用内核的 Soft Updates,
+ 它有助于提高磁盘的写操作速度。
+ 尽管这个功能是内核提供的, 仍然需要对具体的磁盘打开它。
+ 请查看 &man.mount.8; 的输出以了解
+ Soft Updates 是否已经在您的系统磁盘上启用了。
+ 如果您没有看到 <literal>soft-updates</literal>
+ 挂接选项, 则需要通过使用 &man.tunefs.8; (对于已经存在的文件系统)
+ 或 &man.newfs.8; (对于新的文件系统) 命令来激活它。</para>
+
+ <programlisting>options MD_ROOT # MD is a potential root device</programlisting>
+
+ <para>这个选项将打开以基于内存的虚拟磁盘作为根设备的支持。</para>
+
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>NFS</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>NFS_ROOT</secondary>
+ </indexterm>
+ <programlisting>options NFSCLIENT # Network Filesystem Client
+options NFSSERVER # Network Filesystem Server
+options NFS_ROOT # NFS usable as /, requires NFSCLIENT</programlisting>
+
+ <para>网络文件系统。 如果您不打算通过 TCP/IP 挂接
+ &unix; 文件服务器的分区, 就可以注释掉它。</para>
+
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>MSDOSFS</secondary>
+ </indexterm>
+ <programlisting>options MSDOSFS # MSDOS Filesystem</programlisting>
+
+ <para>&ms-dos; 文件系统。 只要您不打算在启动时挂接由 DOS 格式化的硬盘分区,
+ 就可以把它注释掉。
+ 如前面所介绍的那样, 在您第一次挂接 DOS 分区时,
+ 内核会自动加载需要的模块。 此外,
+ <filename role="package">emulators/mtools</filename>
+ 软件提供了一个很方便的功能,
+ 通过它您可以直接访问 DOS 软盘而无需挂接或卸下它们
+ (而且也完全不需要 <literal>MSDOSFS</literal>)。</para>
+
+ <programlisting>options CD9660 # ISO 9660 Filesystem</programlisting>
+
+ <para>用于 CDROM 的 ISO 9660 文件系统。 如果没有 CDROM
+ 驱动器或很少挂接光盘数据 (因为在首次使用数据 CD 时会自动加载),
+ 就可以把它注释掉。 音乐 CD 并不需要这个选项。</para>
+
+ <programlisting>options PROCFS # Process filesystem</programlisting>
+
+ <para>进程文件系统。 这是一个挂接在 <filename>/proc</filename>
+ 的一个 <quote>伪装的</quote> 文件系统,
+ 允许类似 &man.ps.1; 这样的程序给出正在运行的进程的更多信息。
+ 在 &os; 5.X 和更高版本中, 绝大多数情况下都不再需要
+ <literal>PROCFS</literal>,
+ 因为绝大多数调试和监视工具都已经进行了修改,
+ 不再需要 <literal>PROCFS</literal>: 与 &os; 4.X
+ 不同, 新安装的 &os; 5.X 默认情况下髌骨挂接它。
+ 此外, 6.X-CURRENT 内核在使用
+ <literal>PROCFS</literal> 时还必须加入
+ <literal>PSEUDOFS</literal> 的支持:</para>
+
+ <programlisting>options PSEUDOFS # Pseudo-filesystem framework</programlisting>
+
+ <para><literal>PSEUDOFS</literal> 在 &os; 4.X 上不可用。</para>
+
+ <programlisting>options GEOM_GPT # GUID Partition Tables.</programlisting>
+
+ <para>这个选项提供了在一个磁盘上使用大量的分区的能力。</para>
+
+ <programlisting>options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!]</programlisting>
+
+ <para>使系统兼容4.3BSD。不要去掉这一行,不然有些程序将无法正常运行。
+ </para>
+
+ <programlisting>options COMPAT_FREEBSD4 # Compatible with &os;4</programlisting>
+
+ <para>为了支持在旧版本的&os;下编译的程序,该选项在&os;&nbsp;5.X &i386;和Alpha systems下需要打开。
+ 最好在所有的&i386;和Alpha systems下打开这个选项,因为可能要运行老应用程序。
+ 在5.X才开始支持的平台,比如ia64和&sparc64;,就不需要这个选项。</para>
+
+ <programlisting>options SCSI_DELAY=15000 # Delay (in ms) before probing SCSI</programlisting>
+
+ <para>这将让内核在探测每个 SCSI 设备之前等待 15 秒。
+ 如果您只有 IDE 硬盘驱动器, 则可以不管它,
+ 反之您可能会想降低这个数值, 可能减少到 5 秒,
+ 以加速启动过程。 当然, 如果您这么做之后
+ &os; 在识别您的 SCSI 设备时遇到问题,
+ 则您还需要再把它改回去。</para>
+
+ <programlisting>options KTRACE # ktrace(1) support</programlisting>
+
+ <para>这个选项打开内核进程跟踪,在调试时很有用。
+ </para>
+
+ <programlisting>options SYSVSHM # SYSV-style shared memory</programlisting>
+
+ <para>提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸,
+ 不少绘图相关程序会自动使用SHM来提供额外的速度。如果您要使用X Window,您最好加入这个选项。
+ </para>
+
+ <programlisting>options SYSVSEM # SYSV-style semaphores</programlisting>
+
+ <para>支持System V semaphores,不常用到,只在kernel中占用几百个字节的空间。</para>
+
+ <programlisting>options SYSVMSG # SYSV-style message queues</programlisting>
+
+ <para>支持 System V 消息。 同样地, 这只会在内核中增加数百字节的空间占用。</para>
+
+ <note>
+ <para>&man.ipcs.1; 命令的 <option>-p</option> 选项可以显示出任何用到这些
+ System V 机制的进程。</para>
+ </note>
+
+ <programlisting>options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions</programlisting>
+
+ <para>在1993年&posix;添加的实时扩展. 在ports collection中某些应用程序会用到这些
+ (比如<application>&staroffice;</application>)。
+ </para>
+
+ <programlisting>options KBD_INSTALL_CDEV # install a CDEV entry in /dev</programlisting>
+
+ <para>这个选项与键盘有关。 它在 <filename>/dev</filename>
+ 中安装一个 CDEV 项。</para>
+
+ <programlisting>options AHC_REG_PRETTY_PRINT # Print register bitfields in debug
+ # output. Adds ~128k to driver.
+options AHD_REG_PRETTY_PRINT # Print register bitfields in debug
+ # output. Adds ~215k to driver.</programlisting>
+
+ <para>这个选项主要用于帮助调试, 它能够给出更容易阅读的寄存器数值。</para>
+
+ <programlisting>options ADAPTIVE_GIANT # Giant mutex is adaptive.</programlisting>
+
+ <para>这个选项使得内核全局锁 (Giant) 按照和其它 mutex 类似的方式自适应地自旋。</para>
+
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>SMP</secondary>
+ </indexterm>
+ <programlisting># To make an SMP kernel, the next two are needed
+options SMP # Symmetric MultiProcessor Kernel
+device apic # I/O APIC</programlisting>
+
+ <para>上述两个选项是 SMP 支持所必需的,
+ 在单处理器的机器上可以去掉它们。</para>
+
+ <programlisting>device isa</programlisting>
+
+ <para>所有为 &os; 所支持的 PC 都需要这个设置,
+ 即使没有 ISA 插槽也是一样。 如果您使用
+ IBM PS/2 (微通道架构) 的计算机, &os; 目前只能提供有限的支持。
+ 要了解关于 MCA 支持的详情, 请参考
+ <filename>/usr/src/sys/i386/conf/NOTES</filename>。</para>
+
+ <programlisting>device eisa</programlisting>
+
+ <para>如果您的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。</para>
+
+ <programlisting>device pci</programlisting>
+
+ <para>如果您的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。</para>
+
+ <programlisting>device agp</programlisting>
+
+ <para>如果您有图形加速卡(AGP card),这个选项将打开图形加速支持。</para>
+
+ <programlisting># Floppy drives
+device fdc</programlisting>
+
+ <para>这是软驱控制器。</para>
+
+ <programlisting># ATA and ATAPI devices
+device ata</programlisting>
+
+ <para>这个驱动器支持所有ATA和ATAPI设备。您只要在内核中加入<literal>device ata</literal>选项,
+ 就可以让内核支持现代计算机上的所有PCI ATA/ATAPI设备。
+ </para>
+
+ <programlisting>device atadisk # ATA disk drives</programlisting>
+
+ <para>这个是ATAPI 磁盘驱动器所必须的。</para>
+
+ <programlisting>device ataraid # ATA RAID drives</programlisting>
+
+ <para>这个选项需要 <literal>device ata</literal>, 它用于 ATA
+ RAID 驱动。</para>
+
+ <programlisting><anchor id="kernelconfig-atapi">
+device atapicd # ATAPI CDROM drives</programlisting>
+
+ <para>这个是ATAPI CDROM驱动器所必须的。</para>
+
+ <programlisting>device atapifd # ATAPI floppy drives</programlisting>
+
+ <para>这个是ATAPI 磁盘驱动器所必须的。</para>
+
+ <programlisting>device atapist # ATAPI tape drives</programlisting>
+
+ <para>这个是ATAPI 磁带机驱动器所必须的.</para>
+
+ <programlisting>options ATA_STATIC_ID # Static device numbering</programlisting>
+
+ <para>这指定对控制器使用其静态的编号; 如果没有这个选项,
+ 则会动态地分配设备的编号。</para>
+
+ <programlisting># SCSI Controllers
+device ahb # EISA AHA1742 family
+device ahc # AHA2940 and onboard AIC7xxx devices
+device ahd # AHA39320/29320 and onboard AIC79xx devices
+device amd # AMD 53C974 (Teckram DC-390(T))
+device isp # Qlogic family
+device mpt # LSI-Logic MPT-Fusion
+#device ncr # NCR/Symbios Logic
+device sym # NCR/Symbios Logic (newer chipsets)
+device trm # Tekram DC395U/UW/F DC315U adapters
+
+device adv # Advansys SCSI adapters
+device adw # Advansys wide SCSI adapters
+device aha # Adaptec 154x SCSI adapters
+device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
+device bt # Buslogic/Mylex MultiMaster SCSI adapters
+
+device ncv # NCR 53C500
+device nsp # Workbit Ninja SCSI-3
+device stg # TMC 18C30/18C50</programlisting>
+
+ <para>SCSI控制器。可以注释掉您系统中没有的设备。如果您只有IDE设备,您可以把这些一起删掉。</para>
+
+ <programlisting># SCSI peripherals
+device scbus # SCSI bus (required for SCSI)
+device ch # SCSI media changers
+device da # Direct Access (disks)
+device sa # Sequential Access (tape etc)
+device cd # CD
+device pass # Passthrough device (direct SCSI access)
+device ses # SCSI Environmental Services (and SAF-TE)</programlisting>
+
+ <para>SSCSI外围设备。也可以像上面一样操作。</para>
+
+ <note>
+ <para>目前系统提供的 USB &man.umass.4; 驱动 (以及少量其它驱动) 使用了
+ SCSI 子系统, 尽管它们并不是真的 SCSI 设备。
+ 因此, 如果在内核配置使用了这类驱动程序, 请务必不要删除
+ SCSI 支持。</para>
+ </note>
+
+ <programlisting># RAID controllers interfaced to the SCSI subsystem
+device amr # AMI MegaRAID
+device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID
+device ciss # Compaq Smart RAID 5*
+device dpt # DPT Smartcache III, IV - See NOTES for options
+device iir # Intel Integrated RAID
+device ips # IBM (Adaptec) ServeRAID
+device mly # Mylex AcceleRAID/eXtremeRAID
+device twa # 3ware 9000 series PATA/SATA RAID
+
+# RAID controllers
+device aac # Adaptec FSA RAID
+device aacp # SCSI passthrough for aac (requires CAM)
+device ida # Compaq Smart RAID
+device mlx # Mylex DAC960 family
+device pst # Promise Supertrak SX6000
+device twe # 3ware ATA RAID</programlisting>
+
+ <para>支持RAID控制器。如果您没有这些,可以把它们注释掉或是删掉。</para>
+
+ <programlisting># atkbdc0 controls both the keyboard and the PS/2 mouse
+device atkbdc # AT keyboard controller</programlisting>
+
+ <para>键盘控制器(<literal>atkbdc</literal>)提供AT键盘输入以及PS/2指针设备的I/O服务。
+ 键盘驱动程序(<literal>atkbd</literal>)与PS/2鼠标驱动程序(<literal>psm</literal>)需要这个控制器,所以不要删除它。
+ </para>
+
+ <programlisting>device atkbd # AT keyboard</programlisting>
+
+ <para><literal>atkbd</literal>驱动程序,与<literal>atkbdc</literal>控制器一起使用,
+ 提供连接到AT键盘控制器的AT 84键盘与AT加强型键盘的访问服务。
+ </para>
+
+ <programlisting>device psm # PS/2 mouse</programlisting>
+
+ <para>如果您的鼠标连接到PS/2鼠标端口,就使用这个设备驱动程序。</para>
+
+ <programlisting>device vga # VGA video card driver</programlisting>
+
+ <para>显卡驱动。</para>
+
+ <programlisting># splash screen/screen saver
+device splash # Splash screen and screen saver support</programlisting>
+
+ <para>启动时出现了 splash 画面!屏幕保护程序也需要它。
+ 在 &os;&nbsp;4.X 中,应写作 <literal>pseudo-device splash</literal> 。</para>
+
+ <programlisting># syscons is the default console driver, resembling an SCO console
+device sc</programlisting>
+
+ <para><literal>sc</literal> 是默认的控制台驱动程序, 类似 SCO 控制台。
+ 由于绝大部分全屏幕程序都通过类似
+ <filename>termcap</filename> 这样的终端数据库函数库赖访问控制台,
+ 因此无论您使用这个或与 <literal>VT220</literal> 兼容的
+ <literal>vt</literal> 都没有什么关系。
+ 如果您在运行这种控制台时使用全屏幕程序时发生问题, 清在登录之后将
+ <envar>TERM</envar> 变量设置为 <literal>scoansi</literal>。</para>
+
+ <programlisting># Enable this for the pcvt (VT220 compatible) console driver
+#device vt
+#options XSERVER # support for X server on a vt console
+#options FAT_CURSOR # start with block cursor</programlisting>
+
+ <para>这是一个兼容 VT220 的控制台驱动, 它同时能够向下兼容
+ VT100/102。 在同 <literal>sc</literal>
+ 硬件不兼容的一些笔记本上它能够运行的很好。
+ 当然, 登录系统时请把
+ <envar>TERM</envar> 变量设置为 <literal>vt100</literal> 或
+ <literal>vt220</literal>。
+ 此驱动在连接网络上大量不同的机器时也被证明非常有用,
+ 因为此时 <filename>termcap</filename> 或
+ <filename>terminfo</filename> 通常没有可用的
+ <literal>sc</literal> 设备 &mdash; 而 <literal>vt100</literal>
+ 则几乎每种平台都支持。</para>
+
+ <programlisting># Power management support (see NOTES for more options)
+#device apm</programlisting>
+
+ <para>Advanced Power Management support. Useful for laptops,
+ although in &os; 5.X and above this is disabled in
+ <filename>GENERIC</filename> by default.</para>
+
+ <programlisting># Add suspend/resume support for the i8254.
+device pmtimer</programlisting>
+
+ <para>用于电源管理事件, 例如 APM 和 ACPI 的时钟设备驱动。</para>
+
+ <programlisting># PCCARD (PCMCIA) support
+# PCMCIA and cardbus bridge support
+device cbb # cardbus (yenta) bridge
+device pccard # PC Card (16-bit) bus
+device cardbus # CardBus (32-bit) bus</programlisting>
+
+ <para>PCMCIA支持。如果您使用膝上型计算机,您需要这个。</para>
+
+ <programlisting># Serial (COM) ports
+device sio # 8250, 16[45]50 based serial ports</programlisting>
+
+ <para>这些串口在 &ms-dos;/&windows; 的世界中称为
+ <devicename>COM</devicename> 口。</para>
+
+ <note>
+ <para>如果使用内置式的调制解调器, 并占用 <devicename>COM4</devicename>
+ 而您另有一个串口在 <devicename>COM2</devicename>, 则必须把调制解调器的
+ IRQ 改为 2 (由于晦涩的技术原因,
+ IRQ2 = IRQ 9) 才能够在 &os; 中访问它。
+ 如果有多口的串口卡, 请参考 &man.sio.4; 以了解需要在
+ <filename>/boot/device.hints</filename> 中进行的设置。
+ 某些显卡 (特别是基于 S3 芯片的卡) 使用形如 <literal>0x*2e8</literal>
+ 的 IO 地址, 而许多廉价的串口卡不能够正确地对 16-位
+ IO 地址空间进行解码, 因此它们会产生冲突,
+ 并造成 <devicename>COM4</devicename> 实际上无法使用。</para>
+
+ <para>每一个串口都需要有一个唯一的 IRQ (除非您使用支持中断分享的串口卡),
+ 因此默认的 <devicename>COM3</devicename>
+ 和 <devicename>COM4</devicename> IRQ 是不能使用的。</para>
+ </note>
+
+ <programlisting># Parallel port
+device ppc</programlisting>
+
+ <para>ISA-bus并行接口。</para>
+
+ <programlisting>device ppbus # Parallel port bus (required)</programlisting>
+
+ <para>提供并行总线的支持。</para>
+
+ <programlisting>device lpt # Printer</programlisting>
+
+ <para>提供并口打印机的支持。</para>
+
+ <note>
+ <para>要使用并口打印机,就必须同时加入上面三行设置。</para>
+ </note>
+
+ <programlisting>device plip # TCP/IP over parallel</programlisting>
+
+ <para>这是针对并行网络接口的驱动器。</para>
+
+ <programlisting>device ppi # Parallel port interface device</programlisting>
+
+ <para>普通用途的I/O (<quote>geek port</quote>) + IEEE1284 I/O.</para>
+
+ <programlisting>#device vpo # Requires scbus and da</programlisting>
+
+ <indexterm><primary>zip drive</primary></indexterm>
+ <para>这是针对Iomega Zip驱动器的。它要求<literal>scbus</literal>和<literal>da</literal>的支持。
+ 最好的执行效果是工作在EPP 1.9模式。
+ </para>
+
+ <programlisting>#device puc</programlisting>
+
+ <para>如果您有由 &man.puc.4 支持的 <quote>哑</quote>
+ 串行或并行 PCI 卡, 则应去掉这一行的注释。</para>
+
+ <programlisting># PCI Ethernet NICs.
+device de # DEC/Intel DC21x4x (<quote>Tulip</quote>)
+device em # Intel PRO/1000 adapter Gigabit Ethernet Card
+device ixgb # Intel PRO/10GbE Ethernet Card
+device txp # 3Com 3cR990 (<quote>Typhoon</quote>)
+device vx # 3Com 3c590, 3c595 (<quote>Vortex</quote>)</programlisting>
+
+ <para>多种PCI网卡驱动器。注释或删除您系统中没有的设备.</para>
+
+ <programlisting># PCI Ethernet NICs that use the common MII bus controller code.
+# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
+device miibus # MII bus support</programlisting>
+
+ <para>MII总线支持对于一些PCI 10/100 Ethernet NIC来说是必需的。
+ </para>
+
+ <programlisting>device dc # DEC/Intel 21143 and various workalikes
+device miibus # MII bus support
+device bfe # Broadcom BCM440x 10/100 Ethernet
+device bge # Broadcom BCM570xx Gigabit Ethernet
+device dc # DEC/Intel 21143 and various workalikes
+device fxp # Intel EtherExpress PRO/100B (82557, 82558)
+device pcn # AMD Am79C97x PCI 10/100 (precedence over 'lnc')
+device re # RealTek 8139C+/8169/8169S/8110S
+device rl # RealTek 8129/8139
+device sf # Adaptec AIC-6915 (<quote>Starfire</quote>)
+device sis # Silicon Integrated Systems SiS 900/SiS 7016
+device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet
+device ste # Sundance ST201 (D-Link DFE-550TX)
+device ti # Alteon Networks Tigon I/II gigabit Ethernet
+device tl # Texas Instruments ThunderLAN
+device tx # SMC EtherPower II (83c170 <quote>EPIC</quote>)
+device vr # VIA Rhine, Rhine II
+device wb # Winbond W89C840F
+device xl # 3Com 3c90x (<quote>Boomerang</quote>, <quote>Cyclone</quote>)</programlisting>
+
+ <para>使用MII总线控制器代码的驱动器。</para>
+
+ <programlisting># ISA Ethernet NICs. pccard NICs included.
+device cs # Crystal Semiconductor CS89x0 NIC
+# 'device ed' requires 'device miibus'
+device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards
+device ex # Intel EtherExpress Pro/10 and Pro/10+
+device ep # Etherlink III based cards
+device fe # Fujitsu MB8696x based cards
+device ie # EtherExpress 8/16, 3C507, StarLAN 10 etc.
+device lnc # NE2100, NE32-VL Lance Ethernet cards
+device sn # SMC's 9000 series of Ethernet chips
+device xe # Xircom pccard Ethernet
+
+# ISA devices that use the old ISA shims
+#device le</programlisting>
+
+ <para>ISA 以太网卡驱动。 参见
+ <filename>/usr/src/sys/<replaceable>i386</replaceable>/conf/NOTES</filename>
+ 以了解关于哪个驱动程序能够驱动您的网卡的细节。</para>
+
+ <programlisting># Wireless NIC cards
+device wlan # 802.11 support
+device an # Aironet 4500/4800 802.11 wireless NICs.
+device awi # BayStack 660 and others
+device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
+#device wl # Older non 802.11 Wavelan wireless NIC.</programlisting>
+
+ <para>Support for various wireless cards.</para>
+
+ <programlisting>device mem # Memory and kernel memory devices</programlisting>
+
+ <para>The system memory devices.</para>
+
+ <programlisting>device io # I/O device</programlisting>
+
+ <para>This option allows a process to gain I/O privileges. This is
+ useful in order to write userland programs that can handle hardware
+ directly. This is required to run the X Window system.</para>
+
+ <programlisting>device random # Entropy device</programlisting>
+
+ <para>Cryptographically secure random number generator.</para>
+
+ <programlisting>device ether # Ethernet support</programlisting>
+
+ <para><literal>ether</literal> 只有在使用以太网卡时才需要。
+ 它包含了通用的以太网协议代码。在
+ &os;&nbsp;4.X 中应写作 <literal>pseudo-device
+ ether</literal>.</para>
+
+ <programlisting>device sl # Kernel SLIP</programlisting>
+
+ <para><literal>sl</literal> 用以提供 SLIP 支持。
+ 目前它几乎已经完全被 PPP 取代了, 因为后者更容易配置,
+ 而且更适合调制解调器之间的连接, 并提供了更强大的功能。
+ 在 &os;&nbsp;4.X 中, 这一行应写作 <literal>pseudo-device
+ sl</literal>.</para>
+
+ <programlisting>device ppp # Kernel PPP</programlisting>
+
+ <para>这一选项用以提供内核级的 PPP 支持, 用于拨号连接。
+ 也有以用户模式运行的 PPP 实现, 使用
+ <literal>tun</literal> 并提供包括按需拨号在内的更为灵活的功能。
+ 在 &os;&nbsp;4.X 中应写作
+ <literal>pseudo-device ppp</literal>.</para>
+
+ <programlisting>device tun # Packet tunnel.</programlisting>
+
+ <para>它会被用户模式的 PPP 软件用到。
+ 参考本书的 <link linkend="userppp">PPP</link> 以了解更多的细节。
+ 在 &os;&nbsp;4.X 中则应使用 <literal>pseudo-device
+ tun</literal>。</para>
+
+ <programlisting><anchor id="kernelconfig-ptys">
+device pty # Pseudo-ttys (telnet etc)</programlisting>
+
+ <para>这是一个 <quote>pseudo-terminal</quote> 或模拟登入端口。
+ 它用来接收连入的 <command>telnet</command> 以及
+ <command>rlogin</command> 会话、
+ <application>xterm</application>, 以及一些其它程序如
+ <application>Emacs</application> 等。</para>
+
+ <note><para>在 &os;&nbsp;4.X 中,
+ 您应该使用 <literal>pseudo-device pty
+ <replaceable>number</replaceable></literal>。 <literal>pty</literal>
+ 后面的 <replaceable>number</replaceable> 用于指定要创建的
+ <literal>pty</literal> 数量。 如果您需要多于默认的同时
+ 16 个 <application>xterm</application> 窗口或远程登录会话,
+ 则应相应的提高这个值, 其上限是 256。</para></note>
+
+ <programlisting>device md # Memory <quote>disks</quote></programlisting>
+
+ <para>Memory disk pseudo-devices. With &os;&nbsp;4.X use the
+ line <literal>pseudo-device md</literal>.</para>
+
+ <programlisting>device gif # IPv6 and IPv4 tunneling</programlisting>
+
+ <para>它实现了在 IPv4 上的 IPv6 隧道、 IPv6 上的 IPv4 隧道、
+ IPv4 上的 IPv4 隧道、 以及IPv6 上的 IPv6隧道。
+ 从 &os;&nbsp;4.4 开始 <literal>gif</literal> 设备具有了
+ <quote>自动克隆</quote> 能力, 因此只需指定
+ <literal>pseudo-device gif</literal>。
+ 更早版本的 &os;&nbsp;4.X 需要手工指定一个数字, 例如
+ <literal>pseudo-device gif 4</literal>。</para>
+
+ <programlisting>device faith # IPv6-to-IPv4 relaying (translation)</programlisting>
+
+ <para>这个伪设备能捕捉发给它的数据包,并把它们转发给
+ IPv4/IPv6 翻译服务程序。在
+ &os;&nbsp;4.X 中,应写作
+ <literal>pseudo-device faith 1</literal>。</para>
+
+ <programlisting># The `bpf' device enables the Berkeley Packet Filter.
+# Be aware of the administrative consequences of enabling this!
+device bpf # Berkeley packet filter</programlisting>
+
+ <para>这是 Berkeley 包过滤器。这个伪设备允许网络接口被置于混杂模式,
+ 从而,截获广播网 (例如,以太网) 上的每一个数据包。
+ 截获的数据报可以保存到磁盘上,也可以使用 &man.tcpdump.1; 程序来分析。
+ 在 &os;&nbsp;4.X 中,应写作
+ <literal>pseudo-device bpf</literal>。</para>
+
+ <note>
+ <para>&man.bpf.4; 设备也被用于
+ &man.dhclient.8; 来获取默认路由器(网关)的 IP 地址。如果使用DHCP,就不要注释掉这行。</para>
+ </note>
+
+ <programlisting># USB support
+#device uhci # UHCI PCI-&gt;USB interface
+#device ohci # OHCI PCI-&gt;USB interface
+device usb # USB Bus (required)
+#device udbp # USB Double Bulk Pipe devices
+device ugen # Generic
+device uhid # <quote>Human Interface Devices</quote>
+device ukbd # Keyboard
+device ulpt # Printer
+device umass # Disks/Mass storage - Requires scbus and da
+device ums # Mouse
+device urio # Diamond Rio 500 MP3 player
+device uscanner # Scanners
+# USB Ethernet, requires mii
+device aue # ADMtek USB Ethernet
+device axe # ASIX Electronics USB Ethernet
+device cue # CATC USB Ethernet
+device kue # Kawasaki LSI USB Ethernet
+device rue # RealTek RTL8150 USB Ethernet</programlisting>
+
+ <para>支持各类 USB 设备。</para>
+
+ <programlisting># FireWire support
+device firewire # FireWire bus code
+device sbp # SCSI over FireWire (Requires scbus and da)
+device fwe # Ethernet over FireWire (non-standard!)</programlisting>
+
+ <para>支持各类火线设备。</para>
+
+ <para>要了解 &os; 所支持的设备的其他情况, 请参考
+ <filename>/usr/src/sys/<replaceable>i386</replaceable>/conf/NOTES</filename>。</para>
+
+ <sect2>
+ <title>大内存支持(<acronym>PAE</acronym>)</title>
+ <indexterm>
+ <primary>
+ 物理地址扩展 (<acronym>PAE</acronym>)
+ </primary>
+ <secondary>
+ 大内存支持的配置
+ </secondary>
+ </indexterm>
+
+ <para>大内存配置的机器需要超过4GB的虚拟地址。
+ 因为4GB的限制,Intel在&pentium;及后续的CPUs上增加了36位物理地址的支持。
+ </para>
+
+ <para>&intel; &pentium; Pro和后续的CPUs允许内存地址扩展到64GB.(<acronym>PAE</acronym>)
+ &os;通过<option>PAE</option>选项来支持这个能力。
+ 在&os; 4.X系列里面,4.9-RELEASE开始支持,&os; 5.X系列里面,从5.1-RELEASE开始支持。
+ in the 4.X series of &os; beginning with 4.9-RELEASE and
+ in the 5.X series of &os; beginning with 5.1-RELEASE。因为Intel架构的限制,
+ 高于或低于4GB都没有什么区别,内存分配到大于4GB仅仅是增加了可利用的内存池。
+ </para>
+
+ <para>为了让内核支持<acronym>PAE</acronym>,只要增加下面这一行到配置文件:</para>
+
+ <programlisting>options PAE</programlisting>
+
+ <note>
+ <para><acronym>PAE</acronym>在&os;里面现在只能支持 &intel; IA-32处理器。
+ 同时,还应该注意,&os;的<acronym>PAE</acronym>支持没有经过广泛的测试,
+ 和其他稳定的特性相比只能当作是beta版。</para>
+ </note>
+
+ <para><acronym>PAE</acronym>在&os;下有如下的一些限制:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>进程不能接触大于4GB的VM空间。</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>KLD</acronym> 模块不能加载到一个打开了<acronym>PAE</acronym>支持的内核里面,
+ 这是因为内核模块和内核的建立框架不一样。</para>
+ </listitem>
+
+ <listitem>
+ <para>没有使用&man.bus.dma.9;界面的设备驱动程序在打开了<acronym>PAE</acronym>支持的内核里面
+ 会导致数据腐化(corruption)。因为这个原因,&os; 5.X的<filename>PAE</filename>内核配置文件
+ 把所有在打开了<acronym>PAE</acronym>的内核上不能工作的驱动程序排除在外。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>一些系统打开了探测系统内存资源使用能力的功能,因为打开了
+ <acronym>PAE</acronym>支持,这些功能可能会被覆盖掉。
+ 其中一个例子就是内核参数<option>kern.maxvnodes</option>,它是控制
+ 内核能使用的最大vnodes数目的,建议重新调整它及其他类似参数到合适的值。</para>
+ </listitem>
+
+ <listitem>
+ <para>为了避免<acronym>KVA</acronym>的消耗,很有必要增加系统的内核虚拟地址,
+ 或者减少很耗系统资源的内核选项的总量(看上面)。<option>KVA_PAGES</option>选项
+ 可以用来增加<acronym>KVA</acronym>空间。
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>为了稳定和高性能,建议查看&man.tuning.7;手册页。&man.pae.4;手册页包含
+ &os;'s<acronym>PAE</acronym>支持的最新信息。
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="kernelconfig-nodes">
+ <title>创建设备节点</title>
+
+ <indexterm><primary>设备节点</primary></indexterm>
+ <indexterm>
+ <primary><command>MAKEDEV</command></primary>
+ </indexterm>
+
+ <para><emphasis>如果您在运行 &os;&nbsp;5.0 或更高版本,
+ 则可以略过这节。 新版本使用
+ &man.devfs.5; 来分配设备节点, 这一过程对用户是透明的。</emphasis></para>
+
+ <para>内核中的几乎每个设备在 <filename>/dev</filename> 目录中都有对应的
+ <quote>节点</quote> 项。 这些节点看上去像是普通的文件,
+ 但事实上却是程序在使用对应的设备时, 与内核联系的入口。
+ Shell 脚本 <filename>/dev/MAKEDEV</filename>
+ 在首次安装操作系统时会创建几乎所有能够支持的设备节点。
+ 然而, 它并不会创建 <emphasis>所有的</emphasis> 节点,
+ 因此当您增加了某些设备的支持时, 就需要检查这个目录中是否有对应的项了,
+ 如果没有, 就应该添加它们。 这有一个简单的例子:</para>
+
+ <para>假定在内核中加入了IDE CD-ROM的支持。可以这样加入:</para>
+
+ <programlisting>device acd0</programlisting>
+
+ <para>这意味着您应当在<filename>/dev</filename>目录下找一些以<filename>acd0</filename>为起点的入口,
+ 通常后面有一个字母,像是以<literal>c</literal>,或者<literal>r</literal>开头,表示这是一个<quote>raw</quote>设备。
+ 如果那些文件不在那儿,就必须改变到<filename>/dev</filename>目录然后键入:</para>
+
+ <indexterm>
+ <primary><command>MAKEDEV</command></primary></indexterm>
+ <screen>&prompt.root; <userinput>sh MAKEDEV acd0</userinput></screen>
+
+ <para>这些脚本完成后,您要在<filename>/dev</filename>目录下确认有<filename>acd0c</filename>和
+ <filename>racd0c</filename>等几个入口,这表示程序已经正确执行。
+ </para>
+
+ <para>以下是加入声卡节点的例子:</para>
+
+ <screen>&prompt.root; <userinput>sh MAKEDEV snd0</userinput></screen>
+
+ <note>
+ <para>当创建完诸如声卡这样的设备节点时,如果其他人有权访问您的机器,
+ 可能有必要在<filename>/etc/fbtab</filename>文件中添加这些节点来保护系统安全。
+ 更多的信息参考&man.fbtab.5;
+ </para>
+ </note>
+
+ <para>依上述的简单程序,建立任何不在<filename>GENERIC</filename>里的硬件设备节点
+ </para>
+
+ <note>
+ <para> 所有的SCSI控制器都使用一样的设备节点,所以您无须重新建立节点。
+ 另外,网卡与SLIP/PPP虚拟设备并没有任何设备节点,所以您不必担心怎么建立节点。
+ </para>
+ </note>
+ </sect1>
+
+ <sect1 id="kernelconfig-trouble">
+ <title>如果出现问题怎么办</title>
+
+ <para>在定制一个内核时,可能会出现五种问题。它们是:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><command>config</command>失败:</term>
+
+ <listitem>
+ <para>如果 &man.config.8; 在给出您的内核描述时失败,
+ 则可能在某些地方引入了一处小的错误。
+ 幸运的是, &man.config.8; 会显示出它遇到问题的行号,
+ 这样您就能够迅速地定位错误。 例如, 如果您看到:</para>
+
+ <screen>config: line 17: syntax error</screen>
+
+ <para>可以通过与 <filename>GENERIC</filename> 或其他参考资料对比,
+ 来确定这里的关键词是否拼写正确。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>make</command>失败:</term>
+
+ <listitem>
+ <para>如果 <command>make</command> 命令失败,
+ 它通常表示内核描述中发生了 &man.config.8; 无法找出的的错误。
+ 同样地, 仔细检查您的配置, 如果仍然不能解决问题,
+ 发一封邮件到 &a.questions; 并附上您的内核配置,
+ 则问题应该很快就能解决。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>安装新内核失败:</term>
+
+ <listitem>
+ <para>如果内核编译得很顺利, 但安装失败
+ (即 <command>make install</command> 或
+ <command>make installkernel</command> 命令失败),
+ 第一件事是检查您的系统是否是以 1 或更高的安全级运行的
+ (参见 &man.init.8;)。 内核安装过程将尝试去掉原有内核的
+ immutable (不可改) 标志, 并在新的内核上设置它。
+ 由于安全级 1 或更高的安全级会阻止修改系统中任何文件的这个标志,
+ 因此安装内核需要 0 或者更低的安全级。</para>
+
+ <para>不过这只对 &os; 4.X 以及更早的版本有效。
+ &os; 5.X 以及之后的版本并不会给内核设置不可改标志,
+ 因此安装失败可能说明发生了更深层次的问题。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>内核无法启动:<anchor
+ id="kernelconfig-noboot"></term>
+
+ <listitem>
+ <para>如果您的内核无法启动, 或不识别您的设备, 千万别慌!
+ 非常幸运的是, &os; 有一个很好的机制帮助您从不兼容的内核恢复。
+ 在 &os; 启动加载器那里简单地选择一下要启动的内核就可以了。
+ 当系统在引导菜单的 10 秒倒计时时进入它。 按下除了
+ <keycap>Enter</keycap> 之外的任意键, <command>unload</command>
+ 然后输入
+ <command>boot /boot/<replaceable>kernel.old</replaceable>/kernel</command>,
+ 或者其他任何一个可以正确引导的内核即可。
+ 当重新配置内核时, 保持一个已经证明能够正常启动的内核永远是一个好习惯。</para>
+
+ <para>当使用好的内核启动之后您可以检查配置文件并重新尝试编译它。
+ 比较有用的资源是 <filename>/var/log/messages</filename> 文件,
+ 它会记录每次成功启动所产生的所有内核消息。
+ 此外, &man.dmesg.8; 命令也会显示这次启动时产生的内核消息。</para>
+
+ <note>
+ <para>如果在编译内核时遇到麻烦, 请务必保留一个
+ <filename>GENERIC</filename> 或已知可用的其他内核,
+ 并命名为别的名字以免在下次启动时被覆盖。
+ 不要依赖 <filename>kernel.old</filename>
+ 因为在安装新内核时, <filename>kernel.old</filename>
+ 会被上次安装的那个可能不正常的内核覆盖掉。
+ 另外, 尽快把可用的内核挪到
+ <filename class="directory">/boot/kernel</filename>
+ 否则类似 &man.ps.1; 这样的命令可能无法正常工作。
+ 为了完成这一点, 需要修改目录的名字:</para>
+
+ <screen>&prompt.root; <userinput>mv /boot/kernel /boot/kernel.bad</userinput>
+<userinput>mv /boot/<replaceable>kernel.good</replaceable> /boot/kernel</userinput></screen>
+
+ <para>对于 &os; 5.X 之前的版本, 正确的
+ <quote>解除</quote> <command>make</command>
+ 所实施的保护的命令 (为了把另一个内核永久性地挪回来) 是:</para>
+
+ <screen>&prompt.root; <userinput>chflags noschg /kernel</userinput></screen>
+
+ <para>如果您发现您不能这样做,您的系统的安全级别可能大于0了。在<filename>/etc/rc.conf</filename>里面编辑
+ <literal>kern_securelevel</literal>并把它设置为<literal>-1</literal>然后重启。
+ 当您很满意这个内核的时候,您可以再把设置改回去。</para>
+
+ <para>另外,如果您要<quote>锁住</quote>内核或其他文件,以致它不能被移动或修改,
+ 可以用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>chflags schg /kernel</userinput></screen>
+ </note>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>内核工作,但是&man.ps.1;根本不工作:</term>
+
+ <listitem>
+ <para>如果您安装了一个与系统中内建工具版本不同的内核,
+ 例如在 4.x 系统上安装了 5.x 的内核, 许多用于检查系统状态的工具如
+ &man.ps.1; 和 &man.vmstat.8; 都将无法正常使用。
+ 您应该 <link linkend="makeworld">重新编译一个和内核版本一致的系统</link>。
+ 这也是为什么一般不鼓励使用与系统其他部分版本不同的内核的一个主要原因。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/l10n/Makefile b/zh_CN.GB2312/books/handbook/l10n/Makefile
new file mode 100644
index 0000000000..adce6d413f
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/l10n/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= l10n/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/l10n/chapter.sgml b/zh_CN.GB2312/books/handbook/l10n/chapter.sgml
new file mode 100644
index 0000000000..28c96130de
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/l10n/chapter.sgml
@@ -0,0 +1,835 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese Documentation Project
+
+ Original Revision: 1.102
+ $FreeBSD$
+-->
+
+<chapter id="l10n">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Andrey A.</firstname>
+ <surname>Chernov</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Michael C.</firstname>
+ <surname>Wu</surname>
+ <contrib>Rewritten by </contrib>
+ </author>
+ <!-- 30 Nv 2000 -->
+ </authorgroup>
+ </chapterinfo>
+
+ <title>本地化-I18N/L10N使用和设置</title>
+
+ <sect1 id="l10n-synopsis">
+ <title>概述</title>
+
+ <para>FreeBSD是一个由分布于全世界的用户和贡献者支持的项目。
+ 这章将讨论FreeBSD的国际化和本地化的问题,允许非英语用户也能使用FreeBSD很好地工作。
+ 在系统和应用水平上,主要是通过执行i18N标准来实现的,所以这里我们将为读者提供详细的介绍。
+ </para>
+
+ <para>读完这一章,您将了解到:</para>
+ <itemizedlist>
+ <listitem><para>不同的语言和地域是如何在现代操作系统上进行编码的。
+ </para></listitem>
+ <listitem><para>如何为您的登入shell设置本地化。</para></listitem>
+ <listitem><para>如何配置您的控制台为非英语语言。
+ languages.</para></listitem>
+ <listitem><para>如何使用不同的语言来有效地使用X Windows。</para></listitem>
+ <listitem><para>在哪里可以找到更多有关开发符合i18N标准的应用程序的信息。</para></listitem>
+ </itemizedlist>
+
+ <para>阅读这章之前,您应当了解:</para>
+
+ <itemizedlist>
+ <listitem><para>怎样安装额外的第三方程序(<xref linkend="ports">)。</para></listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="l10n-basics">
+ <title>基础知识</title>
+
+ <sect2>
+ <title>什么是I18N/L10N?</title>
+ <indexterm><primary>国际化</primary></indexterm>
+ <indexterm><primary>本地化</primary></indexterm>
+
+ <para>开发人员把internationalization简写成I18N,中间的数字是前后两个字母间的字母个数。
+ L10N依据<quote>localization</quote> 使用同样的命名规则。
+ I18N/L10N方法、协议和应用结合在一起,允许用户使用他们自己所选择的语言。</para>
+
+ <para>I18N应用程序使用I18N工具来编程。它允许开发人员写一个简单的文件,
+ 就可以将显示的菜单和文本翻译成本地语言。我们非常鼓励程序员遵循这种规则。</para>
+ </sect2>
+
+ <sect2>
+ <title>为什么要使用I18N/L10N?</title>
+
+ <para>I18N/L10N标准能够很好地支持您查看、输入或处理非英语语言。</para>
+ </sect2>
+
+ <sect2>
+ <title>I18N支持哪里语言?</title>
+
+ <para>I18N和L10N不是FreeBSD特有的。当前,它能支持世界上绝大部分主力语言,
+ 包括但不限于:中文,德文,日文,朝鲜文,法文,俄文,越南文等等。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="using-localization">
+ <title>使用本地化语言</title>
+
+ <para>I18N不是FreeBSD特有的,它是一个规则。我们鼓励您帮助FreeBSD完善这一规则。</para>
+ <indexterm><primary>locale</primary></indexterm>
+
+ <para>本地化设置需要具备三个条件:语言代码 (Language Code)、 国家代码
+ (Country Code) 和编码(Encoding)。 本地名字可以用下面这些部分来构造:</para>
+
+ <programlisting><replaceable>语言代码</replaceable>_<replaceable>国家代码</replaceable>.<replaceable>编码</replaceable></programlisting>
+
+ <sect2>
+ <title>语言和国家代码</title>
+ <indexterm><primary>语言代码</primary></indexterm>
+ <indexterm><primary>国家代码</primary></indexterm>
+
+ <para>为了用特殊的语言来对FreeBSD系统进行本地化(或其他类&unix;系统),
+ 用户必须要知道相应的国家和语言代码(国家代码告诉应用程序使用哪一种语言规范)。
+ 此外,WEB浏览器,SMTP/POP服务器,web服务器等都是以这个为基础的。下面就是一个国家和语言代码的例子:
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>语言/国家代码</entry>
+ <entry>描述</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>en_US</entry>
+ <entry>美国英语</entry>
+ </row>
+
+ <row>
+ <entry>ru_RU</entry>
+ <entry>俄语</entry>
+ </row>
+
+ <row>
+ <entry>zh_CN</entry>
+ <entry>简体中文</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ </sect2>
+
+ <sect2>
+ <title>编码</title>
+ <indexterm><primary>编码</primary></indexterm>
+ <indexterm><primary>ASCII</primary></indexterm>
+
+ <para>一些语言不使用 ASCII 编码,它们使用8位,更宽或多位的字符,
+ 更多的信息可以看看&man.multibyte.3; 。
+ 比较老的应用程序可能会无法认出它们,把它们误认为是控制字符。
+ 比较新的应用程序通常会认出8位字符。 根据执行情况,用户可能需要使用更
+ 宽或多位字符支持的标准来重新编译这个应用程序,或者将它正确配置。<ulink
+ url="&url.base;/ports/index.html">FreeBSD Ports collection</ulink>
+ 已经为每一个语言提供了相应的程序。可以在各自的FreeBSD port中参考一下I18N的文档。</para>
+
+ <para>需要特别指出的:用户需要看看应用程序的文档以决定如何配置才能正确设置configure/Makefile/compiler。
+ </para>
+
+ <para>记住下面这些:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>特定语言的简单C字符集(参考&man.multibyte.3;),以及ISO-8859-1, ISO-8859-15, KOI8-R, CP437.</para>
+ </listitem>
+
+ <listitem>
+ <para>宽字节或多字节编码,如EUC, Big5。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>您可以在<ulink
+ url="http://www.iana.org/assignments/character-sets">IANA Registry</ulink>检查一下现行的字符集列表。</para>
+
+ <note>
+ <para>FreeBSD 4.5及以后的版本使用X11兼容的本地编码来代替。</para>
+ </note>
+
+ </sect2>
+
+ <sect2>
+ <title>I18N应用程序</title>
+
+ <para>在FreeBSD Ports和Package系统里面,I18N应用程序已经使用<literal>I18N</literal>
+ 来命名。然而它们不是总支持需要的语言。</para>
+ </sect2>
+
+ <sect2 id="setting-locale">
+ <title>本地化设置</title>
+
+ <para>通常只要在登入shell里面设置<envar>LANG</envar>为本地化,
+ 一般通过设置用户的 <filename>~/.login_conf</filename>
+ 或用户shell的启动文件(<filename>~/.profile</filename>,<filename>~/.bashrc</filename>,
+ <filename>~/.cshrc</filename>)。没有必要设置
+ <envar>LC_CTYPE</envar>,<envar>LC_CTIME</envar>。
+ 更多的信息请参考特定语言的FreeBSD文档。</para>
+
+ <para>您应当在您的配置文件中设置下面两个变量:</para>
+
+ <itemizedlist>
+ <indexterm><primary>POSIX</primary></indexterm>
+ <listitem>
+ <para><envar>LANG</envar> 为&posix;设置本地化语言功能。</para>
+ </listitem>
+
+ <indexterm><primary>MIME</primary></indexterm>
+ <listitem>
+ <para><envar>MM_CHARSET</envar>应用程序的MIME字符集。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>这包括用户的shell配置,特定的应用配置和X11配置。</para>
+
+ <sect3>
+ <title>设置本地化的方法</title>
+ <indexterm><primary>本地化</primary></indexterm>
+ <indexterm><primary>登入分类</primary></indexterm>
+
+ <para>有两种方法来设置本地化,接下来都会描述。
+ 第一种 (推荐) 就是在 <link linkend="login-class">登入分类</link>里面指定环境变量。
+ 第二种方法是把环境变量加到shell的<link linkend="startup-file">启动文件</link>里面。
+ </para>
+
+ <sect4 id="login-class">
+ <title>登入分类方法</title>
+
+ <para>这种方法允许把本地化名称和MIME字符集的环境变量赋给可能的shell,
+ 而不是加到每个特定shell的启动文件里面。
+ <link linkend="usr-setup">用户级设置
+ Level Setup</link> 允许普通用户自己完成这个设置,而<link
+ linkend="adm-setup">管理员级设置</link>需要超级用户权限。</para>
+
+ <sect5 id="usr-setup">
+ <title>用户级设置</title>
+
+ <para>这有一个设置用户根目录文件<filename>.login_conf</filename>的小例子,
+ 它为上述两个变量设置了Latin-1编码。</para>
+
+ <programlisting>me:\
+ :charset=ISO-8859-1:\
+ :lang=de_DE.ISO8859-1:</programlisting>
+
+ <indexterm><primary>繁体中文</primary><secondary>BIG-5编码</secondary></indexterm>
+ <para>这是一个为<filename>.login_conf</filename>设置繁体中文的BIG-5编码的例子。应该设置下面的大部分变量,
+ 因为很多软件都没有为中文,日文和韩文设置正确的本地化变量。</para>
+
+ <programlisting>#Users who do not wish to use monetary units or time formats
+#of Taiwan can manually change each variable
+me:\
+ :lang=zh_TW.Big5:\
+ :lc_all=zh_TW.Big:\
+ :lc_collate=zh_TW.Big5:\
+ :lc_ctype=zh_TW.Big5:\
+ :lc_messages=zh_TW.Big5:\
+ :lc_monetary=zh_TW.Big5:\
+ :lc_numeric=zh_TW.Big5:\
+ :lc_time=zh_TW.Big5:\
+ :charset=big5:\
+ :xmodifiers="@im=xcin": #Setting the XIM Input Server</programlisting>
+
+ <para>更多的信息参考<link linkend="adm-setup">管理员级设置</link>和&man.login.conf.5;</para>
+ </sect5>
+
+ <sect5 id="adm-setup">
+ <title>管理员级设置</title>
+
+ <para>检查用户的登入分类在
+ <filename>/etc/login.conf</filename>里面是否设置了正确的语言。主要确定下面的几个设置:</para>
+
+ <programlisting><replaceable>language_name</replaceable>:<replaceable>accounts_title</replaceable>:\
+ :charset=<replaceable>MIME_charset</replaceable>:\
+ :lang=<replaceable>locale_name</replaceable>:\
+ :tc=default:</programlisting>
+
+ <para>再次使用前面的Latin-1编码的例子:</para>
+
+ <programlisting>german:German Users Accounts:\
+ :charset=ISO-8859-1:\
+ :lang=de_DE.ISO8859-1:\
+ :tc=default:</programlisting>
+
+ <bridgehead renderas=sect4>使用&man.vipw.8;改变登入类型。</bridgehead>
+
+ <indexterm>
+ <primary><command>vipw</command></primary>
+ </indexterm>
+ <para>使用<command>vipw</command>添加新用户,看起来像下面这样:
+ </para>
+
+ <programlisting>user:password:1111:11:<replaceable>language</replaceable>:0:0:User Name:/home/user:/bin/sh</programlisting>
+
+ <bridgehead renderas=sect4>用&man.adduser.8;改变登入类型。</bridgehead>
+
+ <indexterm>
+ <primary><command>adduser</command></primary>
+ </indexterm>
+ <indexterm><primary>登入分类</primary></indexterm>
+ <para>用<command>adduser</command>添加新用户看起来像下面这样:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>在<filename>/etc/adduser.conf</filename>里面设置<literal>defaultclass =
+ <replaceable>语言</replaceable></literal>。应该记住,您必须为使用其它语言的所有用户设置
+ <literal>缺省</literal>类别。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>每一次使用&man.adduser.8;的时候,一个特定语言的可选择性回答会像下面这样给出:
+ <screen><prompt>Enter login class: default []: </prompt></screen>
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>如果您打算给每一个用户使用另外一种语言,您应该这样:
+ </para>
+
+ <screen>&prompt.root; <userinput>adduser -class <replaceable>language</replaceable></userinput></screen>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead renderas=sect4>使用&man.pw.8;改变登入类型。</bridgehead>
+ <indexterm>
+ <primary><command>pw</command></primary>
+ </indexterm>
+ <para>如果您使用&man.pw.8;来添加新用户,应该这样使用:</para>
+
+ <screen>&prompt.root; <userinput>pw useradd <replaceable>user_name</replaceable> -L <replaceable>language</replaceable></userinput></screen>
+ </sect5>
+ </sect4>
+
+ <sect4 id="startup-file">
+ <title>Shell启动文件方法</title>
+
+ <note>
+ <para>不推荐使用这种方法,因为它需要给每一个可能的shell程序一个不同的启动文件。
+ 应该用<link linkend="login-class">登入分类方法</link>来代替这种方法。
+ </para>
+ </note>
+
+ <indexterm><primary>MIME</primary></indexterm>
+ <indexterm><primary>locale</primary></indexterm>
+ <para>为了设置本地化名称和MIME字符集,只要在<filename>/etc/profile</filename>或
+ <filename>/etc/csh.login</filename>启动文件里面设置这两个变量。下面我们使用德语做例子:
+ </para>
+
+ <para>在<filename>/etc/profile</filename>里面:</para>
+
+ <programlisting><envar>LANG=de_DE.ISO8859-1; export LANG</envar>
+<envar>MM_CHARSET=ISO-8859-1; export MM_CHARSET</envar></programlisting>
+
+ <para>或在<filename>/etc/csh.login</filename>里面:</para>
+
+ <programlisting><envar>setenv LANG de_DE.ISO8859-1</envar>
+<envar>setenv MM_CHARSET ISO-8859-1</envar></programlisting>
+
+ <para>另外,您可以把上面的设置添加到<filename>/usr/share/skel/dot.profile</filename>
+ (和前面的<filename>/etc/profile</filename>一样),或者<filename>/usr/share/skel/dot.login</filename>
+ (和前面的<filename>/etc/csh.login</filename>一样)。</para>
+
+ <para>对于X11:</para>
+
+ <para>在<filename>$HOME/.xinitrc</filename>里面:</para>
+
+ <programlisting><envar>LANG=de_DE.ISO8859-1; export LANG</envar></programlisting>
+
+ <para>或者:</para>
+
+ <programlisting><envar>setenv LANG de_DE.ISO8859-1</envar></programlisting>
+
+ <para>依赖您的shell(看上面)。</para>
+
+ </sect4>
+ </sect3>
+ </sect2>
+
+ <sect2 id="setting-console">
+ <title>控制台设置</title>
+
+ <para>对于所有的简单C字符集,在<filename>/etc/rc.conf</filename>中用正在讨论的语言设置正确的控制台字符:
+ </para>
+
+ <programlisting>font8x16=<replaceable>font_name</replaceable>
+font8x14=<replaceable>font_name</replaceable>
+font8x8=<replaceable>font_name</replaceable></programlisting>
+
+ <para>这儿的<replaceable>font_name</replaceable>来自于<filename>/usr/share/syscons/fonts</filename>目录,
+ 不带<filename>.fnt</filename>后缀。</para>
+
+ <indexterm>
+ <primary><application>sysinstall</application></primary>
+ </indexterm>
+ <indexterm><primary>键盘布局</primary></indexterm>
+ <indexterm><primary>屏幕布局</primary></indexterm>
+ <para>也可以通过<filename>/stand/sysinstall</filename>来设置键盘布局和屏幕布局。
+ 进入<application>sysinstall</application>,选择<guimenuitem>Configure</guimenuitem>,然后
+ <guimenuitem>Console</guimenuitem>。您也可以在<filename>/etc/rc.conf</filename>里面添加下面几行:</para>
+
+ <programlisting>scrnmap=<replaceable>screenmap_name</replaceable>
+keymap=<replaceable>keymap_name</replaceable>
+keychange="<replaceable>fkey_number sequence</replaceable>"</programlisting>
+
+ <para>这儿的<replaceable>screenmap_name</replaceable>是来自<filename>/usr/share/syscons/scrnmaps</filename>目录,
+ 不带<filename>.scm</filename>后缀。 一个带影射字体的屏幕布局通常被作为一个工作区,
+ 用来在VGA适配器字体矩阵上扩展8位到9位。 如果屏幕字体是使用一个8位的排列,要移动这些字母离开这些区域。</para>
+
+ <para>
+ 如果您在<filename>/etc/rc.conf</filename>里面启用了<application>moused</application> daemon:</para>
+
+<programlisting>moused_enable="YES"</programlisting>
+
+ <para>那么需要在下一段检查鼠标指针信息。</para>
+
+ <indexterm>
+ <primary><application>moused</application></primary>
+ </indexterm>
+ <para>默认情况下, &man.syscons.4;驱动程序的鼠标指针在字符集中占用0xd0-0xd3的范围。
+ 如果您的语言使用这个范围,您必须把指针范围移出这个范围。
+ 要在5.0以前的FreeBSD版本中启用工作区,需要在您的内核中添加下面这行:</para>
+
+ <programlisting>options SC_MOUSE_CHAR=0x03</programlisting>
+
+ <para>对于 FreeBSD 4.4 和以后的版本, 需要在
+ <filename>/etc/rc.conf</filename> 中加入:</para>
+
+ <programlisting>mousechar_start=3</programlisting>
+
+ <para>这儿的<replaceable>keymap_name</replaceable>来自于<filename>/usr/share/syscons/keymaps</filename>目录,
+ 不带<filename>.kbd</filename>后缀。如果您不确定该使用哪一种键盘布局,使用&man.kbdmap.1;您可以不重起
+ 来检测您的键盘布局。</para>
+
+ <para>因为功能键的范围不能被定义在键盘地图中,所以<literal>keychange</literal>通常需要安排功能键来匹配选择的终端类型。</para>
+
+ <para>也可以在<filename>/etc/ttys</filename>为所有<literal>ttyv*</literal>记录设定正确的控制台终端类型。
+ 当前,预定义是这样的:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>字符集设置</entry>
+ <entry>终端类型</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>ISO-8859-1 or ISO-8859-15</entry>
+ <entry><literal>cons25l1</literal></entry>
+ </row>
+
+ <row>
+ <entry>ISO-8859-2</entry>
+ <entry><literal>cons25l2</literal></entry>
+ </row>
+
+ <row>
+ <entry>ISO-8859-7</entry>
+ <entry><literal>cons25l7</literal></entry>
+ </row>
+
+ <row>
+ <entry>KOI8-R</entry>
+ <entry><literal>cons25r</literal></entry>
+ </row>
+
+ <row>
+ <entry>KOI8-U</entry>
+ <entry><literal>cons25u</literal></entry>
+ </row>
+
+ <row>
+ <entry>CP437 (VGA default)</entry>
+ <entry><literal>cons25</literal></entry>
+ </row>
+
+ <row>
+ <entry>US-ASCII</entry>
+ <entry><literal>cons25w</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>对于多字节字符语言,可以您的在
+ <filename>/usr/ports/<replaceable>language</replaceable></filename>
+ 目录中使用正确的FreeBSD port。一些port以控制台出现,
+ 而系统把它作为串行vtty终端,因此, 必须为 X11
+ 和伪串行控制台准备足够的vtty终端。
+ 下面是在控制台中使用其他语言的应用程序的部分列表:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>语言</entry>
+ <entry>特定区域</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>Traditional Chinese (BIG-5)</entry>
+ <entry><filename role="package">chinese/big5con</filename></entry>
+ </row>
+
+ <row>
+ <entry>Japanese</entry>
+ <entry><filename role="package">japanese/kon2-16dot</filename> or
+ <filename role="package">japanese/mule-freewnn</filename></entry>
+ </row>
+
+ <row>
+ <entry>Korean</entry>
+ <entry><filename role="package">korean/han</filename></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2>
+ <title>X11设置</title>
+
+ <para>虽然X11不是FreeBSD计划的一部分,
+ 但我们已经为FreeBSD用户包含了一些信息。
+ 具体细节可以参考
+ <ulink url="http://www.xfree86.org/">&xfree86;web站点</ulink>
+ 或是您使用的 X11 Server。</para>
+
+ <para>在<filename>~/.Xresources</filename>里面,您可以适当调整特定应用程序的I18N设置(如字体,菜单等)。</para>
+
+ <sect3>
+ <title>显示字体</title>
+ <indexterm><primary>X11 True Type字体服务器</primary></indexterm>
+ <para>安装X11 &truetype; 公共服务器 (<filename role="package">x11-servers/XttXF86srv-common</filename>)
+ 和安装对应语言的&truetype;字体。设置正确的本地信息可以允许您在菜单上看到您所选的语言。
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>输入非英语字符</title>
+ <indexterm><primary>X11输入方法(XIM)</primary></indexterm>
+ <para>
+ X11输入方法(XIM)协议是所有X11客户端的一个新标准。
+ 所有将作为XIM客户端来写的X11应用程序从XIM输入服务器输入。
+ 不同的语言有几种XIM服务器可用。
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>打印机设置</title>
+
+ <para>一些简单的C字符集通常是用硬编码来编码进打印机的。更宽或多位的字符集需要特定的设置,
+ 我们推荐使用<application>apsfilter</application>。您也可以使用特定语言转换器把文档转换为
+ &postscript;或PDF格式。
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>内核和文件系统</title>
+
+ <para>FreeBSD快速文件系统(FFS)是纯8位的,所以它能使用任何简单的C字符集(参考&man.multibyte.3;),
+ 但不会有字符集名字会储存在文件系统中。它是不知道任何有关编码规则的。
+ 正式的,FFS不支持任何更宽的或多位的字符集形式。
+ 然而一些更宽的或多位的字符集已经通过添加补丁来对FFS进行支持。
+ 他们只是临时性的修正,我们决定不把他们包括在源代码树中。
+ 可以参考相关语言的web站点看看更多信息和修正文件。
+ </para>
+
+ <indexterm><primary>DOS</primary></indexterm>
+ <indexterm><primary>Unicode</primary></indexterm>
+ <para>FreeBSD &ms-dos;已经能够配置成用在&ms-dos;上,Unicode字符集和可选的FreeBSD文件系统字符集的更多信息,
+ 请参考&man.mount.msdos.8;手册页。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="l10n-compiling">
+ <title>编译I18N程序</title>
+
+ <para>许多FreeBSD Ports已经支持I18N了。他们中的一些都用-I18N作标记。
+ 这些和其他很多程序已经内建I18N的支持,不需要考虑其他的事项了。
+ </para>
+
+ <indexterm>
+ <primary><application>MySQL</application></primary>
+ </indexterm>
+ <para>然而一些像<application>MySQL</application>这样的应用程序需要重新配置字符集,可在
+ <filename>Makefile</filename>里面设置,或者直接把参数传递给<application>configure</application>。
+ </para>
+ </sect1>
+
+ <sect1 id="lang-setup">
+ <title>本地化FreeBSD</title>
+
+ <sect2 id="ru-localize">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Andrey A.</firstname>
+ <surname>Chernov</surname>
+ <contrib>Originally contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+ <title>俄语(KOI8-R编码)</title>
+ <indexterm>
+ <primary>本地化</primary>
+ <secondary>俄语</secondary>
+ </indexterm>
+
+ <para>关于KOI8-R编码的更多信息请查阅<ulink
+ url="http://koi8.pp.ru/">KOI8-R参考(Russian Net Character Set)</ulink>。
+ </para>
+
+ <sect3>
+ <title>本地设置</title>
+
+ <para>把下面的行加入到您的<filename>~/.login_conf</filename>文件:</para>
+
+ <programlisting>me:My Account:\
+ :charset=KOI8-R:\
+ :lang=ru_RU.KOI8-R:</programlisting>
+
+ <para>参看前面的设置<link linkend="setting-locale">本地化</link>的例子。</para>
+ </sect3>
+
+ <sect3>
+ <title>控制台设置</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ 对于FreeBSD 5.0以前的版本,添加下面这行到内核配置文件:
+ </para>
+
+ <programlisting>options SC_MOUSE_CHAR=0x03</programlisting>
+
+ <para>对于 FreeBSD 4.4 和更高版本把下面一行加到
+ <filename>/etc/rc.conf</filename>:</para>
+
+ <programlisting>mousechar_start=3</programlisting>
+ </listitem>
+
+ <listitem>
+ <para>在<filename>/etc/rc.conf</filename>里面使用如下设置:</para>
+
+ <programlisting>keymap="ru.koi8-r"
+scrnmap="koi8-r2cp866"
+font8x16="cp866b-8x16"
+font8x14="cp866-8x14"
+font8x8="cp866-8x8"</programlisting>
+
+ </listitem>
+
+ <listitem>
+ <para>对于<filename>/etc/ttys</filename>里面的<literal>ttyv*</literal>记录,要使用
+ <literal>cons25r</literal>作为终端类型。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>参看前面的设置<link linkend="setting-console">控制台</link>的例子。</para>
+ </sect3>
+
+ <sect3>
+ <title>打印机设置</title>
+ <indexterm><primary>打印机</primary></indexterm>
+ <para>既然绝大多数带俄语字符的打印机遵循CP866的标准,
+ 那么需要一个针对KOI8-R到CP866转换的特定输出过滤器。这样的一个过滤器默认的安装在
+ <filename>/usr/libexec/lpr/ru/koi2alt</filename>。
+ 一个支持俄语的打印机的<filename>/etc/printcap</filename>记录看起来是这样的:
+ </para>
+
+ <programlisting>lp|Russian local line printer:\
+ :sh:of=/usr/libexec/lpr/ru/koi2alt:\
+ :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:</programlisting>
+
+ <para>更多信息参考&man.printcap.5;手册页。</para>
+ </sect3>
+
+ <sect3>
+ <title>&ms-dos;文件系统和俄语文件名</title>
+
+ <para>下面的例子是在挂上&ms-dos; 文件系统后,启用对俄语文件名支持的&man.fstab.5;记录:
+ </para>
+
+ <programlisting>/dev/ad0s2 /dos/c msdos rw,-Wkoi2dos,-Lru_RU.KOI8-R 0 0</programlisting>
+
+ <para>选项<option>-L</option>是选择本地化,<option>-W</option>是设置字符转换表。
+ 要使用<option>-W</option>选项,必须在 &ms-dos; 之前挂上<filename>/usr</filename>,
+ 因为转换表位于<filename>/usr/libdata/msdosfs</filename>。更多的信息参考&man.mount.msdos.8;手册页。
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>X11设置</title>
+
+ <orderedlist>
+ <listitem>
+ <para>先描述<link linkend="setting-locale">没有X的本地化设置</link>
+ </para>
+
+ <note>
+ <para><anchor id="russian-note">俄语KOI8-R本地化方法可能在低于<application>&xfree86;</application>3.3
+ 不能工作。
+ <application>&xfree86; 4.X</application>现在在FreeBSD上是缺省的版本。所以这应该不是问题,除非您
+ 是使用的老版本。
+ </para>
+ </note>
+ </listitem>
+
+ <listitem>
+ <para>进入<filename role="package">russian/X.language</filename>目录,然后执行如下的命令:
+ </para>
+
+ <screen>&prompt.root; <userinput>make install</userinput></screen>
+ <para>上面的port安装了KOI8-R字体的最新版本,<application>&xfree86; 3.3</application> 已经支持了一些KOI8-R字体,但这些更好。
+ </para>
+
+ <para>在您的<filename>/etc/XF86Config</filename> 文件中检查<literal>"Files"</literal>那节。
+ 需要在其他<literal>FontPath</literal> 记录<emphasis>之前</emphasis>加入下面这几行:
+ </para>
+
+ <programlisting>FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/misc"
+FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/75dpi"
+FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/100dpi"</programlisting>
+
+ <para>如果您使用一个高分辨率的显示模式,可以交换75 dpi 和100 dpi行。</para>
+ </listitem>
+
+ <listitem>
+ <para>为了激活俄语<literal>"键盘"</literal>,加下面几行到<filename>XF86Config</filename>文件里面:
+ </para>
+
+ <para>对于<application>&xfree86; 3.X</application>:</para>
+
+ <programlisting>XkbLayout "ru"
+XkbOptions "grp:caps_toggle"</programlisting>
+
+ <para>对于<application>&xfree86; 4.X</application>:</para>
+
+ <programlisting>Option "XkbLayout" "ru"
+Option "XkbOptions" "grp:caps_toggle"</programlisting>
+
+ <para>要确信<literal>XkbDisable</literal> 已经关闭(注释掉)了。</para>
+
+ <para>RUS/LAT的切换用<keycap>CapsLock</keycap>。老的<keycap>CapsLock</keycap>功能可以通过
+ <keycombo action="simul"><keycap>Shift</keycap><keycap>CapsLock</keycap></keycombo>
+ 来模拟(只有在LAT模式的时候)。</para>
+
+ <para>如果您的键盘上有<quote>&windows;</quote>键,
+ 注意在俄语模式中,一些非字母顺序的键会影射错误,可以在<filename>XF86Config</filename>文件中添加下面这行:
+ </para>
+
+ <para>对于<application>&xfree86; 3.X</application>:</para>
+
+ <programlisting>XkbVariant "winkeys"</programlisting>
+
+ <para>对于<application>&xfree86; 4.X</application>:</para>
+
+ <programlisting>Option "XkbVariant" "winkeys"</programlisting>
+
+ <note>
+ <para>俄语的XKB键盘可能不能在老版本的<application>&xfree86;</application>下工作,
+ 更多的信息参考<link linkend="russian-note">上面的注释</link>。俄语XKB键盘也不能很好的工作在
+ 非本地化应用程序下面。早期的非本地化应用程序最低限度应该调用<function>XtSetLanguageProc (NULL, NULL,
+ NULL);</function>。更多的本地化X11应用程序的信息请参考<ulink
+ url="http://koi8.pp.ru/xwin.html">
+ KOI8-R for X Window</ulink>。</para>
+ </note>
+ </listitem>
+ </orderedlist>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>设置繁体中文</title>
+ <indexterm>
+ <primary>本地化</primary>
+ <secondary>繁体中文</secondary>
+ </indexterm>
+ <para>FreeBSD-Taiwan计划有一个使用很多中文ports的中文化指南在
+ <ulink url="http://netlab.cse.yzu.edu.tw/~statue/freebsd/zh-tut/"></ulink>。
+ 目前, <literal>FreeBSD 中文化指南</literal> 的维护人员是
+ 沈俊兴 <email>statue@freebsd.sinica.edu.tw</email>。
+ </para>
+
+ <para>沈俊兴 <email>statue@freebsd.sinica.edu.tw</email>
+ 利用 FreeBSD-Taiwan 的 <literal>zh-L10N-tut</literal>建立了
+ <ulink url="http://netlab.cse.yzu.edu.tw/~statue/cfc/">
+ Chinese FreeBSD Collection (CFC)</ulink>。 相关的 packages 和脚本等可以在
+ <ulink url="ftp://freebsd.csie.nctu.edu.tw/pub/taiwan/CFC/"></ulink> 找到。</para>
+ </sect2>
+
+ <sect2>
+ <title>德语本地化(适合所有的ISO 8859-1语言)</title>
+ <indexterm>
+ <primary>本地化</primary>
+ <secondary>德语</secondary>
+ </indexterm>
+
+ <para>Slaven Rezic <email>eserte at cs.tu-berlin.de</email>
+ 写了一个在FreeBSD机器下如何使用日尔曼语言的德语指南。
+ 可以在<ulink url="http://www.de.FreeBSD.org/de/umlaute/"></ulink>下找到。</para>
+ </sect2>
+
+ <sect2>
+ <title>日语和韩语本地化</title>
+ <indexterm>
+ <primary>本地化</primary>
+ <secondary>日语</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>本地化</primary>
+ <secondary>韩语</secondary>
+ </indexterm>
+ <para>日语本地化请参考<ulink url="http://www.jp.FreeBSD.org/"></ulink>,韩语参考
+ <ulink url="http://www.kr.FreeBSD.org/"></ulink>。</para>
+ </sect2>
+
+ <sect2>
+ <title>非英语的FreeBSD文档</title>
+
+ <para>一些FreeBSD的贡献者已经将部分FreeBSD文档翻译成了其他语言。
+ 可以通过<ulink
+ url="&url.base;/index.html">主站</ulink> 或者
+ <filename>/usr/share/doc</filename> 查到。</para>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/linuxemu/Makefile b/zh_CN.GB2312/books/handbook/linuxemu/Makefile
new file mode 100644
index 0000000000..f960df52cf
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/linuxemu/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= linuxemu/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/linuxemu/chapter.sgml b/zh_CN.GB2312/books/handbook/linuxemu/chapter.sgml
new file mode 100644
index 0000000000..97596d46e2
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/linuxemu/chapter.sgml
@@ -0,0 +1,2992 @@
+<!--
+ The FreeBSD Documentation Project
+
+ Original Revision: 1.114
+ $FreeBSD$
+-->
+
+<chapter id="linuxemu">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Restructured and parts updated by </contrib>
+ </author>
+ <!-- 22 Mar 2000 -->
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Brian N.</firstname>
+ <surname>Handy</surname>
+ <contrib>Originally contributed by </contrib>
+ </author>
+ <author>
+ <firstname>Rich</firstname>
+ <surname>Murphey</surname>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+<title>Linux二进制兼容模式</title>
+
+ <sect1 id="linuxemu-synopsis">
+ <title>概述</title>
+ <indexterm><primary>Linux二进制兼容模式</primary></indexterm>
+ <indexterm>
+ <primary>二进制兼容模式</primary>
+ <secondary>Linux</secondary>
+ </indexterm>
+
+ <para>FreeBSD提供了与其他几种类&unix;操作系统兼容的模式,包括Linux。
+ 您可能会问为什么FreeBSD要能够运行Linux二进制程序?
+ 问题的答案很简单。许多公司和开发人员只为Linux开发程序,
+ 因为它是目前计算机世界<quote>最热门</quote>的技术。
+ 这样就导致我们这些FreeBSD用户必须把他们这些公司和开发人员开发的应用程序移植到本地FreeBSD版本上来。
+ 问题是,这些公司中的绝大多数都无法知道有多少人会使用他们的FreeBSD版本的产品,
+ 所以许多公司仍然只开发Linux平台的产品。那么FreeBSD用户应该做些什么呢?
+ 这就是使用Linux二进制兼容性的原因。
+ </para>
+
+ <para>简单来讲,这种兼容性允许FreeBSD用户能够不做任何修改就可以运行大约90%的Linux应用程序。
+ 这些包括<application>&staroffice;</application>,
+ Linux版的<application>&netscape;</application>,
+ <application>&adobe;&nbsp;&acrobat;</application>,
+ <application><trademark class="registered">RealPlayer</trademark></application>
+ 5和7, <application><trademark>VMware</trademark></application>,
+ <application>&oracle;</application>,
+ <application><trademark class="registered">WordPerfect</trademark></application>,
+ <application>Doom</application>, <application>Quake</application>,和更多的其他程序。
+ 据说在某些情况下,在FreeBSD上Linux程序的性能比它们在Linux上运行得还要好。</para>
+ <indexterm>
+ <primary>Linux</primary>
+ <secondary><filename>/proc</filename>文件系统</secondary>
+ </indexterm>
+
+ <para>然而,一些具有Linux本身操作系统特性的程序就无法在FreeBSD上运行。
+ 如果它们使用Linux的<filename>/proc</filename>文件系统
+ (它与FreeBSD的<filename>/proc</filename>文件系统是不同的)
+ 或如启用虚拟8086模式这样特定的 &i386;调用,那Linux的兼容模式就无法工作。
+ </para>
+
+ <para>读完这章,您将了解到:</para>
+ <itemizedlist>
+ <listitem>
+ <para> 如何在您的系统中启用Linux兼容模式。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何安装额外的Linux共享库。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在FreeBSD上安装Linux应用程序。</para>
+ </listitem>
+
+ <listitem>
+ <para>在FreeBSD上,Linux兼容模式的执行细节。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>阅读这章之前,您应该知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如何安装第三方软件(<xref linkend="ports">)。</para>
+ </listitem>
+ </itemizedlist>
+
+ </sect1>
+
+ <sect1 id="linuxemu-lbc-install">
+ <title>安装</title>
+
+ <indexterm><primary>KLD (kernel loadable object)</primary></indexterm>
+
+ <para>默认的Linux兼容模式没有被打开。启用这个功能的最容易的方法是调用<literal>linux</literal>
+ KLD对象(<quote>Kernel LoaDable object</quote>)。您可以在命令行通过健入<command>linux</command>来加载这个模块。
+ </para>
+
+ <para>如果您想让Linux二进制兼容性总是被启用,您可以在<filename>/etc/rc.conf</filename>加入下面这一行:</para>
+
+ <programlisting>linux_enable="YES"</programlisting>
+
+ <para>&man.kldstat.8;可以用来检查KLD模块是否加载:</para>
+
+ <screen>&prompt.user; <userinput>kldstat</userinput>
+Id Refs Address Size Name
+ 1 2 0xc0100000 16bdb8 kernel
+ 7 1 0xc24db000 d000 linux.ko</screen>
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>LINUX</secondary>
+ </indexterm>
+
+ <para>如果您不想或者无法将Linux KLD加载,您就需要在内核中静态链接进Linux二进制兼容模式。您必须在
+ 您的内核配置文件里面加入<literal>options COMPAT_LINUX</literal>,然后按照<xref linkend="kernelconfig">重新编译内核。
+ </para>
+
+ <sect2>
+ <title>安装Linux运行时库</title>
+ <indexterm>
+ <primary>Linux</primary>
+ <secondary>安装Linux运行时库</secondary>
+ </indexterm>
+
+ <para>有两种方法来安装Linux运行时库,要么使用<link linkend="linuxemu-libs-port">linux_base</link> port,
+ 要么<link linkend="linuxemu-libs-manually">手动</link>安装。</para>
+
+ <sect3 id="linuxemu-libs-port">
+ <title>使用linux_base Port安装</title>
+ <indexterm><primary>ports collection</primary></indexterm>
+
+ <para>这是最容易的安装方法,只需要像安装其他port一样从
+ <ulink type="html" url="file://localhost/usr/ports/">ports collection</ulink>来安装:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base</userinput>
+&prompt.root; <userinput>make install distclean</userinput></screen>
+
+ <para>
+ 您现在应当是工作在Linux兼容模式下了。一些程序可能会提示系统库的版本不正确。通常,这不是问题。</para>
+
+ <note><para>有多个版本的<filename
+ role="package">emulators/linux_base</filename> port,针对不同的版本的Linux。
+ 您应该选择最接近Linux应用程序需要的那个版本来安装。</para></note>
+
+ </sect3>
+
+ <sect3 id="linuxemu-libs-manually">
+ <title>手动安装</title>
+
+ <para>如果您没有安装 Ports Collection,您也可以通过手动来安装Linux运行时库。
+ 您将需要这些程序依赖的Linux共享库,而且您需要创建一个<quote>shadow root</quote>
+ 目录<filename>/compat/linux</filename>,任何要被Linux程序打开的共享库都首先在这个目录里面查找。
+ 所以,如果一个Linux程序加载了,例如,<filename>/lib/libc.so</filename>,FreeBSD 会首先尝试打开
+ <filename>/compat/linux/lib/libc.so</filename>,如果不存在,它将尝试打开<filename>/lib/libc.so</filename>。
+ 共享库应该安装在<filename>/compat/linux/lib</filename>而不是Linux <command>ld.so</command>报告的其他路径。</para>
+
+ <para>通常,您需要寻找Linux程序依赖的共享库。然后,
+ 您需要在系统上做一个高效的Linux共享库设置,以便能够运行最新的Linux程序。
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>如何安装额外的共享库</title>
+ <indexterm><primary>共享库</primary></indexterm>
+
+ <para>如果您安装了<filename>linux_base</filename> port,但是您的
+ 您的应用程序仍会报告丢失共享库的信息?您如何知道Linux程序需要哪个共享库?
+ 基本上,有两种可能性(接下来的指令需要<username>root</username>权限):</para>
+
+ <para>如果您有可以访问的Linux系统, 看看应用程序需要什么共享库,
+ 把它们拷贝到您的FreeBSD系统。看下面的例子:</para>
+
+ <informalexample>
+ <para>我们假设您通过FTP得到Linux程序<application>Doom</application>,
+ 并把它放在您能访问的Linux系统上。然后您可以通过<command>ldd linuxdoom</command>来检查需要哪些共享库,
+ 就像这样:</para>
+
+ <screen>&prompt.user; <userinput>ldd linuxdoom</userinput>
+libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0
+libX11.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libX11.so.3.1.0
+libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
+
+ <indexterm><primary>符号链接</primary></indexterm>
+ <para>您需要得到上面输出的右列的所有文件,并把他们拷贝到<filename>/compat/linux</filename>,
+ 第一列的名字用符号连接指向它们。这样您的FreeBSD系统上就有了这些文件:</para>
+
+ <screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
+/compat/linux/usr/X11/lib/libXt.so.3 -&gt; libXt.so.3.1.0
+/compat/linux/usr/X11/lib/libX11.so.3.1.0
+/compat/linux/usr/X11/lib/libX11.so.3 -&gt; libX11.so.3.1.0
+/compat/linux/lib/libc.so.4.6.29
+/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
+
+ <blockquote>
+ <note>
+ <para>如果您已经有了一个与<command>ldd</command> 输出的第一列的主修订号相匹配的Linux共享库,
+ 您将不需要把右列命名的文件拷贝到您的系统,您已经完成了工作。
+ 如果有一个新的版本,那无论如何都要拷贝一个共享库。
+ 您可以删掉旧的,您只要做一个符号连接到新的版本。
+ 所以,如果有这些库在您的系统上:
+ </para>
+
+ <screen>/compat/linux/lib/libc.so.4.6.27
+/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.27</screen>
+
+ <para>如果您根据<command>ldd</command>输出的发现需要一个更新版本的库:</para>
+
+ <screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>
+
+ <para>如果结尾的数字只有一到两个版本过期,那也不要担心拷贝<filename>/lib/libc.so.4.6.29</filename>,
+ 因为程序在稍微旧一些的版本上也能很好地工作。
+ 然而,如果喜欢的话,您可以替换<filename>libc.so</filename>,变成这样:</para>
+
+ <screen>/compat/linux/lib/libc.so.4.6.29
+/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
+ </note>
+ </blockquote>
+
+ <blockquote>
+ <note>
+ <para>符号链接机制<emphasis>仅仅是</emphasis>Linux程序需要的。
+ FreeBSD的运行时连接器会自己寻找匹配的主修订号,您不需要为此担心。</para>
+ </note>
+ </blockquote>
+ </informalexample>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>安装Linux ELF程序</title>
+ <indexterm>
+ <primary>Linux</primary>
+ <secondary>ELF程序</secondary>
+ </indexterm>
+
+ <para>ELF格式的程序需要一步额外的步骤<quote>标记</quote>。如果您尝试运行没有标记的ELF程序,
+ 您会得到像下面这样的错误信息:</para>
+
+ <screen>&prompt.user; <userinput>./my-linux-elf-binary</userinput>
+ELF binary type not known
+Abort</screen>
+
+ <para>为了帮助FreeBSD内核分辨FreeBSD ELF程序和Linux程序,要使用&man.brandelf.1;工具:</para>
+
+ <screen>&prompt.user; <userinput>brandelf -t Linux my-linux-elf-binary</userinput></screen>
+
+ <indexterm><primary>GNU工具</primary></indexterm>
+ <para>GNU工具现在会自动把适当的标记信息放到ELF程序中,您以后遇到这个问题的机会越来越少。</para>
+ </sect2>
+
+ <sect2>
+ <title>配置主机名解析器</title>
+
+ <para>如果DNS不能正常工作或是您得到下列信息:</para>
+
+ <screen>resolv+: "bind" is an invalid keyword resolv+:
+"hosts" is an invalid keyword</screen>
+
+ <para>您就需要配置<filename>/compat/linux/etc/host.conf</filename>文件,此文件包含:</para>
+
+ <programlisting>order hosts, bind
+multi on</programlisting>
+
+ <para>order这一行指出<filename>/etc/hosts</filename>先被搜索再接着搜索DNS。
+ 如果<filename>/compat/linux/etc/host.conf</filename>没有被安装,Linux程序会读取FreeBSD的
+ <filename>/etc/host.conf</filename>然后提示不兼容的FreeBSD语法。
+ 如果您没有使用<filename>/etc/resolv.conf</filename> 文件设置DNS,应该删除<literal>bind</literal>。
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="linuxemu-mathematica">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Murray</firstname>
+ <surname>Stokely</surname>
+ <contrib>Updated for Mathematica 4.X by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Bojan</firstname>
+ <surname>Bistrovic</surname>
+ <contrib>Merged with work by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>安装&mathematica;</title>
+
+ <indexterm>
+ <primary>applications</primary>
+ <secondary><application>Mathematica</application></secondary>
+ </indexterm>
+
+ <para>这节描述在FreeBSD系统上安装Linux版的<application>&mathematica; 4.X</application>。
+ </para>
+
+ <para>Linux版<application>&mathematica;</application>在FreeBSD下运行的很好,但是
+ 由Wolfram打包的二进制程序需要标记才能让FreeBSD知道需要使用Linux ABI来执行它们。</para>
+
+ <para>Linux版的<application>&mathematica;</application>
+ 或<application>&mathematica; for Students</application>
+ 可以从<ulink url="http://www.wolfram.com/"></ulink>直接定购。</para>
+
+ <sect2>
+ <title>标记Linux程序</title>
+<para>
+Linux程序可以在Wolfram发布的CDROM的<application>&mathematica; </application><filename>Unix</filename>目录中找到。
+您必须将这个目录树拷贝到本地硬盘上,以便您能在运行安装程序之前用&man.brandelf.1; 来标记Linux程序:
+</para>
+
+ <screen>&prompt.root; <userinput>mount /cdrom</userinput>
+&prompt.root; <userinput>cp -rp /cdrom/Unix/ /localdir/</userinput>
+&prompt.root; <userinput>brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/*</userinput>
+&prompt.root; <userinput>brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/*</userinput>
+&prompt.root; <userinput>brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/*</userinput>
+&prompt.root; <userinput>brandelf -t Linux /localdir/Files/SystemFiles/Graphics/Binaries/Linux/*</userinput>
+&prompt.root; <userinput>brandelf -t Linux /localdir/Files/SystemFiles/Converters/Binaries/Linux/*</userinput>
+&prompt.root; <userinput>brandelf -t Linux /localdir/Files/SystemFiles/LicenseManager/Binaries/Linux/mathlm</userinput>
+&prompt.root; <userinput>cd /localdir/Installers/Linux/</userinput>
+&prompt.root; <userinput>./MathInstaller</userinput></screen>
+
+ <para>另外,您也可以简单地用下面的命令将默认的ELF标记成Linux:
+ </para>
+ <screen>&prompt.root; <userinput>sysctl kern.fallback_elf_brand=3</userinput></screen>
+ <para>这将让FreeBSD知道没有标记的ELF程序使用Linux ABI,所以您将可以直接从CDROM来运行安装程序。 </para>
+ </sect2>
+
+ <sect2>
+ <title>获得您的&mathematica; 密码</title>
+
+ <para>在您运行<application>&mathematica;</application>之前,您必须从Wolfram获得对应您的<quote>机器ID</quote>的密码。
+ </para>
+ <indexterm>
+ <primary>以太网</primary>
+ <secondary>MAC地址</secondary>
+ </indexterm>
+
+ <para>一旦您安装了Linux运行时库,并把<application>&mathematica;</application>解包开了,
+ 您可以在安装目录通过运行<command>mathinfo</command>来获得您的<quote>机器ID</quote>。
+ 这个机器ID是以您的第一块以太网卡的MAC地址为基础的。</para>
+
+ <screen>&prompt.root; <userinput>cd /localdir/Files/SystemFiles/Installation/Binaries/Linux</userinput>
+&prompt.root; <userinput>mathinfo</userinput>
+disco.example.com 7115-70839-20412</screen>
+
+ <para>当您用email,电话或者传真向Wolfram注册时,给他们您的<quote>机器ID</quote>,就会返回一个包含一组数字的密码。
+ 当您第一次运行<application>&mathematica;</application>时就需要得到的密码。
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>通过网络来运行&mathematica;</title>
+
+ <para><application>&mathematica;</application> 使用一些特殊的字体来显示字符,
+ 与现在使用的标准字体不一样(integrals, sums, Greek letters,等等)。 X协议要求将这些字体安装在
+ <emphasis>本地</emphasis>。
+ 这意味着您需要从<application>&mathematica;</application>的CDROM里面拷贝这些字体并安装到本地。
+ 这些字体一般在CDROM的<filename>/cdrom/Unix/Files/SystemFiles/Fonts</filename>里面,
+ 或本地硬盘的<filename>/usr/local/mathematica/SystemFiles/Fonts</filename>。
+ 实际的字体在<filename>Type1</filename>和<filename>X</filename>子目录。有很多种方法来使用它们。
+ </para>
+
+ <para>第一种方法是把字体拷贝到一个已存在的目录<filename>/usr/X11R6/lib/X11/fonts</filename>。
+ 这需要编辑<filename>fonts.dir</filename>文件。添加字体名字进去,并改变第一行的字体数目。
+ 另外,您也需要在拷贝字体的目录下执行&man.mkfontdir.1;。
+ </para>
+
+ <para>第二种方法是拷贝目录到<filename>/usr/X11R6/lib/X11/fonts</filename>:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts</userinput>
+&prompt.root; <userinput>mkdir X</userinput>
+&prompt.root; <userinput>mkdir MathType1</userinput>
+&prompt.root; <userinput>cd /cdrom/Unix/Files/SystemFiles/Fonts</userinput>
+&prompt.root; <userinput>cp X/* /usr/X11R6/lib/X11/fonts/X</userinput>
+&prompt.root; <userinput>cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1</userinput>
+&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts/X</userinput>
+&prompt.root; <userinput>mkfontdir</userinput>
+&prompt.root; <userinput>cd ../MathType1</userinput>
+&prompt.root; <userinput>mkfontdir</userinput></screen>
+
+ <para>现在,添加新的字体目录到您的字体目录:</para>
+
+ <screen>&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/X</userinput>
+&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/MathType1</userinput>
+&prompt.root; <userinput>xset fp rehash</userinput></screen>
+
+ <para>如果您正在使用<application>&xfree86;</application>服务器,您可以把它们添加到您的
+ <filename>XF86Config</filename>文件来自动加载。</para>
+ <indexterm><primary>fonts</primary></indexterm>
+
+ <para>如果您<emphasis>没有</emphasis>一个叫<filename>/usr/X11R6/lib/X11/fonts/Type1</filename>的目录,
+ 您可以把<filename>MathType1</filename>改成<filename>Type1</filename>。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="linuxemu-maple">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Aaron</firstname>
+ <surname>Kaplan</surname>
+<!-- <address><email>aaron@lo-res.org</email></address>-->
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Robert</firstname>
+ <surname>Getschmann</surname>
+<!-- <address><email>rob@getschmann.org</email></address>-->
+ <contrib>Thanks to </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>安装&maple;</title>
+
+ <indexterm>
+ <primary>应用程序</primary>
+ <secondary><application>Maple</application></secondary>
+ </indexterm>
+
+ <para><application>&maple;</application>是一个类似于<application>&mathematica;</application>的商业数学软件。
+ 您可以从<ulink
+ url="http://www.maplesoft.com/"></ulink>买到这个软件并注册得到一个使用许可。
+ 要在FreeBSD上安装这个软件,请按照下面的步骤:</para>
+
+ <procedure>
+ <step><para>从软件的发行包执行<filename>INSTALL</filename> shell脚本。当进入安装程序的提示符时,
+ 选择<quote>RedHat</quote> 选项。典型的安装目录是<filename
+ class="directory">/usr/local/maple</filename>。</para></step>
+
+ <step><para>如果您不这样做,可以从Maple Waterloo Software (<ulink url="http://register.maplesoft.com/"></ulink>)
+ 为<application>&maple;</application>订购一个许可。
+ 然后拷贝到<filename>/usr/local/maple/license/license.dat</filename>。</para></step>
+
+ <step><para>通过运行<application>&maple;</application>中的<filename>INSTALL_LIC</filename>安装shell脚本来
+ 安装<application>FLEXlm</application>许可管理器。 指定许可服务器为您的机器名。</para></step>
+
+ <step><para>像下面这样Patch您的<filename>/usr/local/maple/bin/maple.system.type</filename>
+ 文件:</para>
+<programlisting> ----- snip ------------------
+*** maple.system.type.orig Sun Jul 8 16:35:33 2001
+--- maple.system.type Sun Jul 8 16:35:51 2001
+***************
+*** 72,77 ****
+--- 72,78 ----
+ # the IBM RS/6000 AIX case
+ MAPLE_BIN="bin.IBM_RISC_UNIX"
+ ;;
++ "FreeBSD"|\
+ "Linux")
+ # the Linux/x86 case
+ # We have two Linux implementations, one for Red Hat and
+ ----- snip end of patch -----</programlisting>
+
+ <para>请注意<literal>"FreeBSD"|\</literal>后面没有空格。</para>
+
+ <para>这个补丁指示<application>&maple;</application>把<quote>FreeBSD</quote>识别为一种Linux系统。
+ <filename>bin/maple</filename> shell脚本调用<filename>bin/maple.system.type</filename>
+ 脚本执行<command>uname -a</command>来查找操作系统名,根据操作系统名,就知道该使用哪个程序。
+ </para></step>
+
+ <step><para>启动许可服务器。</para>
+
+ <para>下面的脚本,安装成<filename>/usr/local/etc/rc.d/lmgrd.sh</filename>,
+ 是很方便的启动<command>lmgrd</command>的方法:</para>
+
+ <programlisting> ----- snip ------------
+
+#! /bin/sh
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
+PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
+export PATH
+
+LICENSE_FILE=/usr/local/maple/license/license.dat
+LOG=/var/log/lmgrd.log
+
+case "$1" in
+start)
+ lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2
+ echo -n " lmgrd"
+ ;;
+stop)
+ lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2
+ ;;
+*)
+ echo "Usage: `basename $0` {start|stop}" 1>&2
+ exit 64
+ ;;
+esac
+
+exit 0
+ ----- snip ------------</programlisting></step>
+
+
+ <step><para>开始测试<application>&maple;</application>:</para>
+ <screen>&prompt.user; <userinput>cd /usr/local/maple/bin</userinput>
+&prompt.user; <userinput>./xmaple</userinput></screen>
+
+<para>您应该成功启动起来了。记得写信告诉Maplesoft您想要一个本地FreeBSD版本!</para></step>
+ </procedure>
+
+ <sect2>
+ <title>一些缺陷</title>
+
+ <itemizedlist>
+ <listitem><para><application>FLEXlm</application>许可管理器可能是一个使用比较困难的工具。
+ 关于它的额外的文档可以在<ulink
+ url="http://www.globetrotter.com/"></ulink>找到。</para></listitem>
+
+ <listitem><para><command>lmgrd</command>对许可文件非常挑剔,有一点问题就会core dump。
+ 正确的许可文件看起来像下面这样:
+ </para>
+
+<programlisting># =======================================================
+# License File for UNIX Installations ("Pointer File")
+# =======================================================
+SERVER chillig ANY
+#USE_SERVER
+VENDOR maplelmg
+
+FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
+ PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
+ ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
+ SN=XXXXXXXXX</programlisting>
+
+ <note><para>序列号被'X'代替了。 <hostid>chillig</hostid>是主机名。</para></note>
+
+ <para>只要不修改<quote>FEATURE</quote>行,编辑后一般都能工作。</para></listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="linuxemu-matlab">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Dan</firstname>
+ <surname>Pelleg</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ <!-- daniel+handbook@pelleg.org -->
+ </authorgroup>
+ </sect1info>
+ <title>安装&matlab;</title>
+
+ <indexterm>
+ <primary>应用程序</primary>
+ <secondary><application>MATLAB</application></secondary>
+ </indexterm>
+
+ <para>这一节描述在一个 &os; 上安装Linux版本的<application>&matlab; version 6.5</application>。
+ 它工作的很好,除了<application>&java.virtual.machine;</application>例外(参考
+ <xref linkend="matlab-jre">)。</para>
+
+ <para>Linux版本的<application>&matlab;</application>可以从MathWorks<ulink
+ url="http://www.mathworks.com"></ulink>订购。请确定您也得到了许可文件或安装说明。
+ 等您成功后,让他们知道您想要一个本地&os;版本。</para>
+
+ <sect2>
+ <title>安装&matlab;</title>
+
+ <para>请按照下面的步骤安装<application>&matlab;</application>:</para>
+
+ <procedure>
+ <step>
+ <para>以<username>root</username>身份插入安装CD并挂载上。
+ 推荐使用安装脚本,为了启动安装脚本,键入:</para>
+
+ <screen>&prompt.root; <userinput>/compat/linux/bin/sh /cdrom/install</userinput></screen>
+
+ <tip>
+ <para>安装程序是图形的。如果您得到不能打开显示的错误,可以键入
+ <command>setenv HOME ~<replaceable>USER</replaceable></command>,
+ <replaceable>USER</replaceable>是您&man.su.1;成的用户。</para>
+ </tip>
+ </step>
+
+ <step>
+ <para>
+ 当问<application>&matlab;</application>的根目录时,键入:
+ <userinput>/compat/linux/usr/local/matlab</userinput>。</para>
+
+ <tip>
+ <para>为了下面的安装过程更方便,在shell提示符下键入
+ <command>set MATLAB=/compat/linux/usr/local/matlab</command></para>
+ </tip>
+ </step>
+
+ <step>
+ <para>根据获得<application>&matlab;</application>许可时的指示来编辑许可文件。</para>
+
+ <tip>
+ <para>您可以用您喜欢的编辑器提前准备这个文件,并在安装程序要您编辑它之前拷贝到
+ <filename>$MATLAB/license.dat</filename>
+ </para>
+ </tip>
+ </step>
+
+ <step>
+ <para>完成安装过程</para>
+ </step>
+ </procedure>
+
+ <para>到这里,您的<application>&matlab;</application>安装已经完成了。
+ 接下来的步骤是让它和您的&os; 系统<quote>胶合</quote>在一起。</para>
+ </sect2>
+
+ <sect2>
+ <title>许可管理器的启动</title>
+ <procedure>
+ <step>
+ <para>为许可管理器建立符号链接的脚本:</para>
+
+ <screen>&prompt.root; <userinput>ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW</userinput>
+&prompt.root; <userinput>ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW</userinput></screen>
+ </step>
+
+ <step>
+ <para>建立启动文件<filename>/usr/local/etc/rc.d/flexlm.sh</filename>。
+ 下面的例子是一个<filename>$MATLAB/etc/rc.lm.glnx86</filename>的修改版本。
+ 变化的是文件的位置,和模拟Linux下许可管理器的启动。 </para>
+
+ <programlisting>#!/bin/sh
+case "$1" in
+ start)
+ if [ -f /usr/local/etc/lmboot_TMW ]; then
+ /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u <replaceable>username</replaceable> &amp;&amp; echo 'MATLAB_lmgrd'
+ fi
+ ;;
+ stop)
+ if [ -f /usr/local/etc/lmdown_TMW ]; then
+ /compat/linux/bin/sh /usr/local/etc/lmdown_TMW &gt; /dev/null 2&gt;&amp;1
+ fi
+ ;;
+ *)
+ echo "Usage: $0 {start|stop}"
+ exit 1
+ ;;
+esac
+
+exit 0</programlisting>
+
+ <important>
+ <para>必须使脚本文件可执行:</para>
+
+ <screen>&prompt.root; <userinput>chmod +x /usr/local/etc/rc.d/flexlm.sh</userinput></screen>
+
+ <para>您也必须替换<replaceable>username</replaceable>为机器上的一个用户(不要是<username>root</username>)。
+ </para>
+ </important>
+ </step>
+
+ <step>
+ <para>用命令启动许可管理器:</para>
+
+ <screen>&prompt.root; <userinput>/usr/local/etc/rc.d/flexlm.sh start</userinput></screen>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2 id="matlab-jre">
+ <title>链接&java;运行时环境</title>
+
+ <para>改变<application>&java;</application>运行时环境(JRE),链接到一个可以工作的版本:
+ </para>
+
+ <screen>&prompt.root; <userinput>cd $MATLAB/sys/java/jre/glnx86/</userinput>
+&prompt.root; <userinput>unlink jre; ln -s ./jre1.1.8 ./jre</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>创建&matlab;启动脚本</title>
+
+ <procedure>
+ <step>
+ <para>把下面的启动脚本放到<filename>/usr/local/bin/matlab</filename>:
+ </para>
+
+ <programlisting>#!/bin/sh
+/compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"</programlisting>
+ </step>
+
+ <step>
+ <para>然后输入命令<command>chmod +x /usr/local/bin/matlab</command>。</para>
+ </step>
+ </procedure>
+
+ <tip>
+ <para>依赖于您的<filename role="package">emulators/linux_base</filename>版本,
+ 您在运行这个脚本时可能会出错,为了避免错误,编辑<filename>/compat/linux/usr/local/matlab/bin/matlab</filename>,
+ 把这行:</para>
+
+ <programlisting>if [ `expr "$lscmd" : '.*-&gt;.*'` -ne 0 ]; then</programlisting>
+
+ <para>(在13.0.1版本是在第410行)改成:</para>
+
+ <programlisting>if test -L $newbase; then</programlisting>
+ </tip>
+ </sect2>
+
+ <sect2>
+ <title>Creating a &matlab; Shutdown Script</title>
+
+ <para>The following is needed to solve a problem with &matlab;
+ not exiting correctly.</para>
+
+ <procedure>
+ <step>
+ <para>Create a file
+ <filename>$MATLAB/toolbox/local/finish.m</filename>, and
+ in it put the single line:</para>
+
+ <programlisting>! $MATLAB/bin/finish.sh</programlisting>
+
+ <note><para>The <literal>$MATLAB</literal> is
+ literal.</para></note>
+
+ <tip>
+ <para>In the same directory, you will find the files
+ <filename>finishsav.m</filename> and
+ <filename>finishdlg.m</filename>, which let you save
+ your workspace before quitting. If you use either of
+ them, insert the line above immediately after the
+ <literal>save</literal> command.</para></tip>
+ </step>
+
+ <step>
+ <para>Create a file
+ <filename>$MATLAB/bin/finish.sh</filename>, which will
+ contain the following:</para>
+
+ <programlisting>#!/usr/compat/linux/bin/sh
+(sleep 5; killall -1 matlab_helper) &
+exit 0</programlisting>
+ </step>
+
+ <step>
+ <para>Make the file executable:</para>
+
+ <screen>&prompt.root; <userinput>chmod +x $MATLAB/bin/finish.sh</userinput></screen>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2 id="matlab-using">
+ <title>使用&matlab;</title>
+
+ <para>现在您已经可以键入
+ <command>matlab</command> 并开始使用它了。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="linuxemu-oracle">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marcel</firstname>
+ <surname>Moolenaar</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ <!-- marcel@cup.hp.com -->
+ </authorgroup>
+ </sect1info>
+ <title>安装&oracle;</title>
+
+ <indexterm>
+ <primary>应用程序</primary>
+ <secondary><application>Oracle</application></secondary>
+ </indexterm>
+
+ <sect2>
+ <title>前言</title>
+ <para>这节描述在FreeBSD上安装Linux版的<application>&oracle; 8.0.5</application>和<application>&oracle; 8.0.5.1 Enterprise Edition</application>。
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>安装Linux环境</title>
+
+ <para>确信您已经从ports collection安装了<filename role='package'>emulators/linux_base</filename>
+ 和<filename role='package'>devel/linux_devtools</filename>。如果运行这些ports有困难,
+ 您可能不得不使用packages或老版本的ports collection。</para>
+
+ <para>如果您想运行智能代理,您还需要安Red Hat Tcl package:
+ <filename>tcl-8.0.3-20.i386.rpm</filename>。安装这些包的命令是使用官方安装程序
+ <application>RPM</application>(ports里面<filename role='package'>archivers/rpm</filename>):</para>
+
+ <screen>&prompt.root; <userinput>rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm <replaceable>package</replaceable></userinput></screen>
+
+ <para><replaceable>包</replaceable>的安装通常不会出错。 </para>
+ </sect2>
+
+ <sect2>
+ <title>创建&oracle;环境</title>
+
+ <para>安装<application>&oracle;</application>之前,您需要设置正确的环境。
+ 这节只描述了在FreeBSD下安装Linux版本<application>&oracle;</application>需要<emphasis>特别</emphasis>注意的地方。
+ 不像在<application>&oracle;</application>安装指南中所描述的那样。
+ </para>
+
+ <sect3 id="linuxemu-kernel-tuning">
+ <title>调整内核</title>
+ <indexterm><primary>调整内核</primary></indexterm>
+
+ <para>正如<application>&oracle;</application>安装指南描述的那样,您需要设置共享内存的最大值。
+ 不要在FreeBSD下使用<literal>SHMMAX</literal>,<literal>SHMMAX</literal>
+ 只是用来计算<literal>SHMMAXPGS</literal>和<literal>PGSIZE</literal>的。
+ 因此要使用<literal>SHMMAXPGS</literal>。所有其他要使用的选项可以参考指南,例如:</para>
+
+ <programlisting>options SHMMAXPGS=10000
+options SHMMNI=100
+options SHMSEG=10
+options SEMMNS=200
+options SEMMNI=70
+options SEMMSL=61</programlisting>
+
+ <para>设置这些选项来适应 <application>&oracle;</application>的使用。</para>
+
+ <para>当然,确信您的内核配置文件中有下面这些选项:</para>
+
+<programlisting>options SYSVSHM #SysV shared memory
+options SYSVSEM #SysV semaphores
+options SYSVMSG #SysV interprocess communication</programlisting>
+ </sect3>
+
+ <sect3 id="linuxemu-oracle-account">
+
+ <title>&oracle;帐号</title>
+
+ <para>创建一个<username>oracle</username>帐号,正如您创建其他帐号一样。
+ <username>oracle</username> 帐号特殊的地方是您需要给它一个Linux shell。
+ 添加<literal>/compat/linux/bin/bash</literal>到<filename>/etc/shells</filename>,
+ 然后设置<username>oracle</username>帐号的shell为<filename>/compat/linux/bin/bash</filename>。
+ </para>
+ </sect3>
+
+ <sect3 id="linuxemu-environment">
+ <title>环境</title>
+
+ <para>除了普通的<application>&oracle;</application>变量外,
+ 比如<envar>ORACLE_HOME</envar>和<envar>ORACLE_SID</envar>,您还必须设置下面的环境变量:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="2*">
+ <thead>
+ <row>
+ <entry>变量</entry>
+
+ <entry>值</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><envar>LD_LIBRARY_PATH</envar></entry>
+
+ <entry><literal>$ORACLE_HOME/lib</literal></entry>
+ </row>
+
+ <row>
+ <entry><envar>CLASSPATH</envar></entry>
+
+ <entry><literal>$ORACLE_HOME/jdbc/lib/classes111.zip</literal></entry>
+ </row>
+
+ <row>
+ <entry><envar>PATH</envar></entry>
+
+ <entry><literal>/compat/linux/bin
+/compat/linux/sbin
+/compat/linux/usr/bin
+/compat/linux/usr/sbin
+/bin
+/sbin
+/usr/bin
+/usr/sbin
+/usr/local/bin
+$ORACLE_HOME/bin</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>建议在<filename>.profile</filename>里面设置所有的环境变量。一个完整的例子是:
+ </para>
+
+<programlisting>ORACLE_BASE=/oracle; export ORACLE_BASE
+ORACLE_HOME=/oracle; export ORACLE_HOME
+LD_LIBRARY_PATH=$ORACLE_HOME/lib
+export LD_LIBRARY_PATH
+ORACLE_SID=ORCL; export ORACLE_SID
+ORACLE_TERM=386x; export ORACLE_TERM
+CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
+export CLASSPATH
+PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
+PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
+PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
+export PATH</programlisting>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>安装&oracle;</title>
+
+ <para>由于linux模拟器的一个小错误,在启动安装程序之前,您必须在<filename>/var/tmp</filename>下
+ 创建<filename>.oracle</filename>目录。您可以把它设为所有人可写,或者由<username>oracle</username>用户拥有。
+ 您必须没有问题的安装<application>&oracle;</application>,如果有问题,请检查一下<application>&oracle;</application>
+ 发行包,或先配置它。安装完<application>&oracle;</application>后,执行下面两步的修补工作。
+ </para>
+
+ <para>一个经常出现的问题是TCP协议的适配器没有安装好。结果您不能启动任何TCP监听。下面的工作将帮助您解决这个问题:
+ </para>
+
+ <screen>&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput>
+&prompt.root; <userinput>make -f ins_network.mk ntcontab.o</userinput>
+&prompt.root; <userinput>cd $ORACLE_HOME/lib</userinput>
+&prompt.root; <userinput>ar r libnetwork.a ntcontab.o</userinput>
+&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput>
+&prompt.root; <userinput>make -f ins_network.mk install</userinput></screen>
+
+ <para>不要忘记了再运行一下<filename>root.sh</filename>!</para>
+
+ <sect3 id="linuxemu-patch-root">
+ <title>修补root.sh</title>
+
+ <para>从CD安装<application>&oracle;</application>时,一些工作需要在<username>root</username>下执行,
+ 这些工作都被记录在一个叫<filename>root.sh</filename>的脚本里面。这个脚本被写在<filename>orainst</filename>目录。
+ 为了使用<filename>root.sh</filename>来正确定位<command>chown</command>或在Linux本地shell下执行脚本,
+ 应该对它进行修补。</para>
+
+ <programlisting>*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
+--- orainst/root.sh Mon Dec 28 15:58:53 1998
+***************
+*** 31,37 ****
+# This is the default value for CHOWN
+# It will redefined later in this script for those ports
+# which have it conditionally defined in ss_install.h
+! CHOWN=/bin/chown
+#
+# Define variables to be used in this script
+--- 31,37 ----
+# This is the default value for CHOWN
+# It will redefined later in this script for those ports
+# which have it conditionally defined in ss_install.h
+! CHOWN=/usr/sbin/chown
+#
+# Define variables to be used in this script</programlisting>
+
+ <para>当您不从CD安装<application>&oracle;</application>时,
+ 您可以从源代码来修补<filename>root.sh</filename>。
+ 它叫做<filename>rthd.sh</filename>,定位在源代码树的<filename>orainst</filename>目录。
+ </para>
+ </sect3>
+
+ <sect3 id="linuxemu-patch-tcl">
+ <title>修补genclntsh</title>
+
+ <para><command>genclntsh</command>脚本用来创建一个简单的共享客户端库。在建立demos时被使用。
+ 完成补丁后就注释掉了下面的<envar>PATH</envar>变量:</para>
+
+ <programlisting>*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
+--- bin/genclntsh Tue Dec 22 15:36:49 1998
+***************
+*** 32,38 ****
+#
+# Explicit path to ensure that we're using the correct commands
+#PATH=/usr/bin:/usr/ccs/bin export PATH
+! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
+#
+# each product MUST provide a $PRODUCT/admin/shrept.lst
+--- 32,38 ----
+#
+# Explicit path to ensure that we're using the correct commands
+#PATH=/usr/bin:/usr/ccs/bin export PATH
+! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
+#
+# each product MUST provide a $PRODUCT/admin/shrept.lst</programlisting>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>运行&oracle;</title>
+
+ <para>如果您已经按上面的指示去操作,您应该可以像在Linux下运行<application>&oracle;</application>了。 </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="sapr3">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Holger</firstname>
+ <surname>Kipp</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- holger.kipp@alogis.com -->
+ <authorgroup>
+ <author>
+ <firstname>Valentino</firstname>
+ <surname>Vaschetto</surname>
+ <contrib>Original version converted to SGML by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>安装&sap.r3;</title>
+
+ <indexterm>
+ <primary>应用程序</primary>
+ <secondary><application>SAP R/3</application></secondary>
+ </indexterm>
+
+ <para>在FreeBSD上安装的<application>&sap;</application>系统不会被&sap;
+ 支持团队&mdash; 所支持——他们只支持某些特定的平台。
+ </para>
+
+ <sect2 id="preface">
+ <title>前言</title>
+
+ <para>这篇文章描述了在FreeBSD系统上安装一个带有<application>&oracle; Database</application>
+ for Linux的<application>&sap.r3; System</application>,包括 FreeBSD的安装和<application>&oracle;</application>的安装。
+ 下面将描述两个不同的配置:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>在FreeBSD 4.3-STABLE上安装带有<application>&oracle; 8.0.5</application>
+ 的<application>&sap.r3; 4.6B (IDES)</application>。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>在FreeBSD 4.5-STABLE上安装带有<application>&oracle; 8.1.7</application>的
+ <application>&sap.r3; 4.6C</application>。
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>虽然这篇文章深入地描述了许多重要的安装步骤,但它不能取代<application>&oracle;</application>和
+ <application>&sap.r3;</application>的安装指南。</para>
+
+ <para>请参考<application>&sap.r3;</application> Linux edition自带的文档和
+ <application>&oracle;</application>的特殊问题。</para>
+ </sect2>
+
+ <sect2 id="software">
+ <title>软件</title>
+
+ <para>下面的CD-ROMs被用作<application>&sap;</application>的安装:</para>
+
+ <sect3 id="software-46b">
+ <title>&sap.r3; 4.6B, &oracle; 8.0.5</title>
+
+ <informaltable frame="none">
+ <tgroup cols=3>
+ <thead>
+ <row>
+ <entry>名称</entry> <entry>号码</entry> <entry>描述</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>KERNEL</entry> <entry>51009113</entry> <entry>SAP Kernel Oracle /
+ Installation / AIX, Linux, Solaris</entry>
+ </row>
+
+ <row>
+ <entry>RDBMS</entry> <entry>51007558</entry> <entry>Oracle / RDBMS 8.0.5.X /
+ Linux</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT1</entry> <entry>51010208</entry> <entry>IDES / DB-Export /
+ Disc 1 of 6</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT2</entry> <entry>51010209</entry> <entry>IDES / DB-Export /
+ Disc 2 of 6</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT3</entry> <entry>51010210</entry> <entry>IDES / DB-Export /
+ Disc 3 of 6</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT4</entry> <entry>51010211</entry> <entry>IDES / DB-Export /
+ Disc 4 of 6</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT5</entry> <entry>51010212</entry> <entry>IDES / DB-Export /
+ Disc 5 of 6</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT6</entry> <entry>51010213</entry> <entry>IDES / DB-Export /
+ Disc 6 of 6</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>此外,我们使用<application>&oracle; 8
+ Server</application> (Linux版本的8.0.5预览版,Linux内核是2.0.33)和
+ FreeBSD 4.3-STABLE。</para>
+
+ </sect3>
+ <sect3 id="software-46c">
+ <title>&sap.r3; 4.6C SR2, &oracle; 8.1.7</title>
+
+ <informaltable frame="none">
+ <tgroup cols=3>
+ <thead>
+ <row>
+ <entry>名称</entry> <entry>号码</entry> <entry>描述</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>KERNEL</entry> <entry>51014004</entry> <entry>SAP Kernel Oracle /
+ SAP Kernel Version 4.6D / DEC, Linux</entry>
+ </row>
+
+ <row>
+ <entry>RDBMS</entry> <entry>51012930</entry> <entry>Oracle 8.1.7/ RDBMS /
+ Linux</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT1</entry> <entry>51013953</entry> <entry>Release 4.6C SR2 / Export
+ / Disc 1 of 4</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT1</entry> <entry>51013953</entry> <entry>Release 4.6C SR2 / Export
+ / Disc 2 of 4</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT1</entry> <entry>51013953</entry> <entry>Release 4.6C SR2 / Export
+ / Disc 3 of 4</entry>
+ </row>
+
+ <row>
+ <entry>EXPORT1</entry> <entry>51013953</entry> <entry>Release 4.6C SR2 / Export
+ / Disc 4 of 4</entry>
+ </row>
+
+ <row>
+ <entry>LANG1</entry> <entry>51013954</entry> <entry>Release 4.6C SR2 /
+ Language / DE, EN, FR / Disc 1 of 3</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>依赖于您要安装的语言,可能需要额外的语言CDs。
+ 这儿我们只使用DE和EN,所以只需要第一张语言CD。
+ 还要注意的是所有EXPORT CDs的号码是一样的。
+ 其他3张语言CDs的号码也一样(这和4.6B IDES release CD的号码不同)。
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="sap-notes">
+ <title>&sap; Notes</title>
+
+ <para>安装使用<application>&sap.r3;</application>之前,请先看看下面的注释:
+ </para>
+
+ <sect3 id="sap-notes-46b">
+ <title>&sap.r3; 4.6B, &oracle; 8.0.5</title>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>号码</entry>
+ <entry>标题</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry>0171356</entry> <entry>SAP Software on Linux: Essential
+ Comments</entry>
+ </row>
+
+ <row>
+ <entry>0201147</entry> <entry>INST: 4.6C R/3 Inst. on UNIX -
+ Oracle</entry>
+ </row>
+
+ <row>
+ <entry>0373203</entry> <entry>Update / Migration Oracle 8.0.5 --&gt;
+ 8.0.6/8.1.6 LINUX</entry>
+ </row>
+
+ <row>
+ <entry>0072984</entry> <entry>Release of Digital UNIX 4.0B for
+ Oracle</entry>
+ </row>
+
+ <row>
+ <entry>0130581</entry> <entry>R3SETUP step DIPGNTAB terminates</entry>
+ </row>
+
+ <row>
+ <entry>0144978</entry> <entry>Your system has not been installed
+ correctly</entry>
+ </row>
+
+ <row>
+ <entry>0162266</entry> <entry>Questions and tips for R3SETUP on Windows
+ NT / W2K</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect3>
+
+ <sect3 id="sap-notes-46c">
+ <title>&sap.r3; 4.6C, &oracle; 8.1.7</title>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>号码</entry>
+ <entry>标题</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0015023</entry> <entry>Initializing table TCPDB (RSXP0004)
+ (EBCDIC)</entry>
+ </row>
+
+ <row>
+ <entry>0045619</entry> <entry>R/3 with several languages or
+ typefaces</entry>
+ </row>
+
+ <row>
+ <entry>0171356</entry> <entry>SAP Software on Linux: Essential
+ Comments</entry>
+ </row>
+
+ <row>
+ <entry>0195603</entry> <entry>RedHat 6.1 Enterprise version:
+ Known problems</entry>
+ </row>
+
+ <row>
+ <entry>0212876</entry> <entry>The new archiving tool SAPCAR</entry>
+ </row>
+
+ <row>
+ <entry>0300900</entry> <entry>Linux: Released DELL Hardware</entry>
+ </row>
+
+ <row>
+ <entry>0377187</entry> <entry>RedHat 6.2: important remarks</entry>
+ </row>
+
+ <row>
+ <entry>0387074</entry> <entry>INST: R/3 4.6C SR2 Installation on
+ UNIX</entry>
+ </row>
+
+ <row>
+ <entry>0387077</entry> <entry>INST: R/3 4.6C SR2 Inst. on UNIX -
+ Oracle</entry>
+ </row>
+
+ <row>
+ <entry>0387078</entry> <entry>SAP Software on UNIX: OS Dependencies
+ 4.6C SR2</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect3>
+ </sect2>
+
+ <sect2 id="hardware-requirements">
+ <title>硬件要求</title>
+
+ <para>下面的设备配置对<application>&sap.r3; System</application>来说已经足够了。如果
+ 用于生产用途,就需要更强的配置:
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>组件</entry>
+ <entry>4.6B</entry>
+ <entry>4.6C</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>处理器</entry>
+ <entry>2 x 800MHz &pentium; III</entry>
+ <entry>2 x 800MHz &pentium; III</entry>
+ </row>
+
+ <row>
+ <entry>内存</entry>
+ <entry>1GB ECC</entry>
+ <entry>2GB ECC</entry>
+ </row>
+
+ <row>
+ <entry>Hard Disk Space</entry>
+ <entry>50-60GB (IDES)</entry>
+ <entry>50-60GB (IDES)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>用于生产使用,就需要使用带大缓存的&xeon;处理器,和高速大容量磁盘(SCSI, RAID hardware controller),以及USV
+ 和ECC-RAM内存。 配置IDES System前需要大量的硬盘空间,因为安装时将创建27&nbsp;GB的数据库文件。
+ 这些空间用于系统和数据的初始化也是足够的。
+ </para>
+
+ <sect3 id="hardware-46b">
+ <title>&sap.r3; 4.6B, &oracle; 8.0.5</title>
+
+ <para>对于这个安装,我的硬件配置如下:带2个800&nbsp;MHz &pentium;&nbsp;III处理器的主板, &adaptec; 29160 Ultra160
+ SCSI适配器(能够访问40/80&nbsp;GB DLT磁带机和CDROM),
+ &mylex; &acceleraid; (2个通道, firmware 6.00-1-00 with 32&nbsp;MB RAM)。
+ &mylex; RAID controller被挂上2个17&nbsp;GB(mirrored)硬盘和4个36&nbsp;GB硬盘(RAID level 5)。</para>
+ </sect3>
+
+ <sect3 id="hardware-46c">
+ <title>&sap.r3; 4.6C, &oracle; 8.1.7</title>
+
+ <para>对于这个安装,配置是&dell; &poweredge; 2500,带2个1000&nbsp;MHz &pentium;&nbsp;III处理器的
+ 主板(256&nbsp;kB Cache), 2&nbsp;GB PC133 ECC SDRAM, PERC/3 DC PCI RAID Controller
+with 128&nbsp;MB,和一个EIDE DVD-ROM驱动器。RAID controller被挂上2个18&nbsp;GB硬盘(mirrored)
+和4个36&nbsp;GB硬盘(RAID level 5)。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="installation">
+ <title>安装FreeBSD</title>
+
+ <para>首先需要安装FreeBSD。有几种方法来装(FreeBSD&nbsp;4.3通过FTP安装, FreeBSD&nbsp;4.5直接从RELEASE CD安装)。
+ 更多信息参考<xref
+ linkend="install-diff-media">。</para>
+
+ <sect3 id="disk-layout">
+ <title>磁盘划分</title>
+
+ <para>为了简单,对<application>&sap.r3; 46B</application>和<application>&sap.r3; 46C
+ SR2</application>的安装使用相同的磁盘划分。只是设备名换了,因为是安装在不同的硬件上
+ (<filename>/dev/da</filename> 和 <filename>/dev/amr</filename>,
+ 所以如果是使用AMI &megaraid;,我们能看到 <filename>/dev/amr0s1a</filename> 代替了
+ <filename>/dev/da0s1a</filename>):</para>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>文件系统</entry>
+ <entry>尺寸(1k-blocks)</entry>
+ <entry>尺寸(GB)</entry>
+ <entry>挂载点</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><filename>/dev/da0s1a</filename></entry>
+ <entry>1.016.303</entry>
+ <entry>1</entry>
+ <entry><filename>/</filename></entry>
+ </row>
+
+ <row>
+ <entry><filename>/dev/da0s1b</filename></entry>
+ <entry> </entry>
+ <entry>6</entry>
+ <entry>swap</entry>
+ </row>
+
+ <row>
+ <entry><filename>/dev/da0s1e</filename></entry>
+ <entry>2.032.623</entry>
+ <entry>2</entry>
+ <entry><filename>/var</filename></entry>
+ </row>
+
+ <row>
+ <entry><filename>/dev/da0s1f</filename></entry>
+ <entry>8.205.339</entry>
+ <entry>8</entry>
+ <entry><filename>/usr</filename></entry>
+ </row>
+
+ <row>
+ <entry><filename>/dev/da1s1e</filename></entry>
+ <entry>45.734.361</entry>
+ <entry>45</entry>
+ <entry><filename>/compat/linux/oracle</filename></entry>
+ </row>
+
+ <row>
+ <entry><filename>/dev/da1s1f</filename></entry>
+ <entry>2.032.623</entry>
+ <entry>2</entry>
+ <entry><filename>/compat/linux/sapmnt</filename></entry>
+ </row>
+
+ <row>
+ <entry><filename>/dev/da1s1g</filename></entry>
+ <entry>2.032.623</entry>
+ <entry>2</entry>
+ <entry><filename>/compat/linux/usr/sap</filename></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>预先用&mylex; 或PERC/3 RAID 软件配置和初始化这两个逻辑驱动器。
+ 改变<acronym>BIOS</acronym>的引导顺序来启动软件。</para>
+
+ <para>请注意这里的磁盘划分和&sap;推荐的是不一样的,&sap;建议把
+ <application>&oracle;</application>子目录(及其他子目录)分离开来,
+ 我决定只简单的创建几个子目录。
+ </para>
+ </sect3>
+
+ <sect3 id="makeworldandnewkernel">
+ <title><command>make world</command>和建立新内核</title>
+
+ <para>下载最新的-STABLE源代码,配置完内核配置文件后重建系统和新内核。
+ 这儿当然要包括 <application>&sap.r3;</application>
+ 和<application>&oracle;</application>需要的<link linkend="kerneltuning">内核参数</link>。
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="installingthelinuxenviornment">
+ <title>安装Linux环境</title>
+
+ <sect3 id="installinglinuxbase-system">
+ <title>安装Linux基本系统</title>
+
+ <para>首先<link linkend="linuxemu-libs-port">linux_base</link>
+ port需要安装(以<username>root</username>身份):</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base</userinput>
+&prompt.root; <userinput>make install distclean</userinput></screen>
+
+ </sect3>
+
+
+ <sect3 id="installinglinuxdevelopment">
+ <title>安装Linux开发环境</title>
+
+ <para>如果您想根据<xref linkend="linuxemu-oracle">在FreeBSD上安装
+ <application>&oracle;</application> :</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/devel/linux_devtools</userinput>
+&prompt.root; <userinput>make install distclean</userinput></screen>
+
+ <para>Linux开发环境只是安装给<application>&sap.r3;
+ 46B IDES</application>的,如果<application>&oracle; DB</application>不是在这个
+ FreeBSD系统上重新链接,它就不需要了。
+ </para>
+
+ </sect3>
+
+
+ <sect3 id="installingnecessaryrpms">
+ <title>安装必需的RPMs</title>
+ <indexterm><primary>RPMs</primary></indexterm>
+
+ <para>为了启动<command>R3SETUP</command>程序, PAM支持是必需的。
+ 第一次安装<application>&sap;</application>到FreeBSD 4.3-STABLE时我们先安装了
+ PAM的所有依赖包再安装PAM包,它可以工作。对于<application>&sap.r3; 4.6C SR2</application>我们
+ 直接安装PAM RPM也可以工作,所以依赖包不是必需的:</para>
+
+
+<screen>&prompt.root; <userinput>rpm -i --ignoreos --nodeps --root /compat/linux --dbpath /var/lib/rpm \
+pam-0.68-7.i386.rpm</userinput></screen>
+
+ <para>要让<application>&oracle; 8.0.5</application>运行智能代理,
+ 我们需要安装RedHat Tcl包<filename>tcl-8.0.5-30.i386.rpm</filename>
+ (否则重新链接<application>&oracle;</application>不能工作)。
+ 重新链接<application>&oracle;</application>时还有其他要注意的地方,
+ 但那是<application>&oracle;</application> Linux的问题,不是FreeBSD的问题。
+ </para>
+
+ </sect3>
+
+ <sect3 id="linuxprocandfallbackelfbrand">
+ <title>其它一些注意的地方</title>
+
+ <para>添加<literal>linprocfs</literal>到<filename>/etc/fstab</filename>是个好主意,
+ 更多信息看&man.linprocfs.5;手册页。
+ 另一个要设置的参数是<literal>kern.fallback_elf_brand=3</literal>,
+ 在<filename>/etc/sysctl.conf</filename>里面设置。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="creatingsapr3env">
+ <title>创建&sap.r3;环境</title>
+
+ <sect3 id="filesystemsandmountpoints">
+ <title>创建必需的文件系统和挂载点</title>
+
+ <para>对简单的安装,创建下面的文件系统就够了:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>mount point</entry>
+ <entry>size in GB</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><filename>/compat/linux/oracle</filename></entry>
+ <entry>45 GB</entry>
+ </row>
+
+ <row>
+ <entry><filename>/compat/linux/sapmnt</filename></entry>
+ <entry>2 GB</entry>
+ </row>
+
+ <row>
+ <entry><filename>/compat/linux/usr/sap</filename></entry>
+ <entry>2 GB</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>创建一些链接也是必要的,否则<application>&sap;</application>安装程序在检查创建的链接时
+ 会报错:
+ </para>
+
+ <screen>&prompt.root; <userinput>ln -s /compat/linux/oracle /oracle</userinput>
+&prompt.root; <userinput>ln -s /compat/linux/sapmnt /sapmnt</userinput>
+&prompt.root; <userinput>ln -s /compat/linux/usr/sap /usr/sap</userinput></screen>
+
+ <para>安装时可能出现的错误(对于<emphasis>PRD</emphasis>系统和<application>&sap.r3; 4.6C SR2</application>
+ 的安装):</para>
+
+ <screen>INFO 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:200
+ Checking existence of symbolic link /usr/sap/PRD/SYS/exe/dbg to
+ /sapmnt/PRD/exe. Creating if it does not exist...
+
+WARNING 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:400
+ Link /usr/sap/PRD/SYS/exe/dbg exists but it points to file
+ /compat/linux/sapmnt/PRD/exe instead of /sapmnt/PRD/exe. The
+ program cannot go on as long as this link exists at this
+ location. Move the link to another location.
+
+ERROR 2002-03-19 16:45:36 R3LINKS_IND_IND Ins_SetupLinks:0
+ can not setup link '/usr/sap/PRD/SYS/exe/dbg' with content
+ '/sapmnt/PRD/exe'</screen>
+ </sect3>
+
+ <sect3 id="creatingusersanddirectories">
+ <title>创建用户和目录</title>
+
+ <para><application>&sap.r3;</application>需要两个用户和3个组。
+ 用户名依赖于包含3个字母的<application>&sap;</application>系统ID(SID)。一些SIDs
+ 被<application>&sap;</application>保留(例如<literal>SAP</literal>和<literal>NIX</literal>)。
+ 完成的列表参考<application>&sap;</application>文档。对于IDES的安装,我们使用<literal>IDS</literal>,
+ 对于4.6C SR2安装,使用<literal>PRD</literal>。 这样我们定义了下面的几个组:
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>组ID</entry>
+ <entry>组名</entry>
+ <entry>描述</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>100</entry>
+ <entry>dba</entry>
+ <entry>Data Base Administrator</entry>
+ </row>
+ <row>
+ <entry>101</entry>
+ <entry>sapsys</entry>
+ <entry>&sap; System</entry>
+ </row>
+ <row>
+ <entry>102</entry>
+ <entry>oper</entry>
+ <entry>Data Base Operator</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>对于默认的<application>&oracle;</application>安装,只有<groupname>dba</groupname>组被使用。
+ 和<groupname>oper</groupname>组一样,我们也可以使用<groupname>dba</groupname>组
+ (更详细的信息参考<application>&oracle;</application>和
+ <application>&sap;</application>文档)。</para>
+
+ <para>我们也需要下面的用户</para>
+
+ <informaltable frame="none">
+ <tgroup cols="6">
+ <thead>
+ <row>
+ <entry>用户ID</entry>
+ <entry>用户名</entry>
+ <entry>普通名称</entry>
+ <entry>组</entry>
+ <entry>附加组</entry>
+ <entry>描述</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>1000</entry>
+ <entry>idsadm/prdadm</entry>
+ <entry><replaceable>sid</replaceable>adm</entry>
+ <entry>sapsys</entry>
+ <entry>oper</entry>
+ <entry>&sap; Administrator</entry>
+ </row>
+ <row>
+ <entry>1002</entry>
+ <entry>oraids/oraprd</entry>
+ <entry>ora<replaceable>sid</replaceable></entry>
+ <entry>dba</entry>
+ <entry>oper</entry>
+ <entry>&oracle; Administrator</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>使用&man.adduser.8;添加用户要求<quote>&sap; Administrator</quote>有下面的记录
+ (请注意shell和home目录):</para>
+
+ <programlisting>Name: <replaceable>sid</replaceable>adm
+Password: ******
+Fullname: SAP Administrator <replaceable>SID</replaceable>
+Uid: 1000
+Gid: 101 (sapsys)
+Class:
+Groups: sapsys dba
+HOME: /home/<replaceable>sid</replaceable>adm
+Shell: bash (/compat/linux/bin/bash)</programlisting>
+
+ <para>对于<quote>&oracle; Administrator</quote>:</para>
+
+ <programlisting>Name: ora<replaceable>sid</replaceable>
+Password: ******
+Fullname: Oracle Administrator <replaceable>SID</replaceable>
+Uid: 1002
+Gid: 100 (dba)
+Class:
+Groups: dba
+HOME: /oracle/<replaceable>sid</replaceable>
+Shell: bash (/compat/linux/bin/bash)</programlisting>
+
+ <para>在您使用组<groupname>dba</groupname>和<groupname>oper</groupname>的情况下您也应该包括
+ <groupname>oper</groupname>。</para>
+
+ </sect3>
+
+ <sect3 id="creatingdirectories">
+ <title>创建目录</title>
+
+ <para>这些目录通常建立在不同的文件系统上。这完全依赖于您的需求。
+ 我们选择把它们建立在同一个目录:
+ </para>
+
+ <para>首先我们将设置一些目录的所有者和权限(以<username>root</username>身份设置):</para>
+
+ <screen>&prompt.root; <userinput>chmod 775 /oracle</userinput>
+&prompt.root; <userinput>chmod 777 /sapmnt</userinput>
+&prompt.root; <userinput>chown root:dba /oracle</userinput>
+&prompt.root; <userinput>chown <replaceable>sid</replaceable>adm:sapsys /compat/linux/usr/sap</userinput>
+&prompt.root; <userinput>chmod 775 /compat/linux/usr/sap</userinput></screen>
+
+ <para>然后我们以<username>ora<replaceable>sid</replaceable></username>身份创建目录,
+ 这些目录将成为<filename>/oracle/<replaceable>SID</replaceable></filename>的子目录:</para>
+
+ <screen>&prompt.root; <userinput>su - ora<replaceable>sid</replaceable></userinput>
+&prompt.root; <userinput>cd /oracle/<replaceable>SID</replaceable></userinput>
+&prompt.root; <userinput>mkdir mirrlogA mirrlogB origlogA origlogB</userinput>
+&prompt.root; <userinput>mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6</userinput>
+&prompt.root; <userinput>mkdir saparch sapreorg</userinput>
+&prompt.root; <userinput>exit</userinput></screen>
+
+ <para>对于<application>&oracle; 8.1.7</application>的安装,需要一些额外的目录:
+ </para>
+
+ <screen>&prompt.root; <userinput>su - ora<replaceable>sid</replaceable></userinput>
+&prompt.root; <userinput>cd /oracle</userinput>
+&prompt.root; <userinput>mkdir 805_32</userinput>
+&prompt.root; <userinput>mkdir client stage</userinput>
+&prompt.root; <userinput>mkdir client/80x_32</userinput>
+&prompt.root; <userinput>mkdir stage/817_32</userinput>
+&prompt.root; <userinput>cd /oracle/<replaceable>SID</replaceable></userinput>
+&prompt.root; <userinput>mkdir 817_32</userinput></screen>
+
+ <note><para>目录<filename>client/80x_32</filename>必须是这个名字,不要用其他数字或字母来替换<emphasis>x</emphasis>。
+ </para></note>
+
+ <para>第三步我们要以<username><replaceable>sid</replaceable>adm</username>身份创建目录:
+ </para>
+
+ <screen>&prompt.root; <userinput>su - <replaceable>sid</replaceable>adm</userinput>
+&prompt.root; <userinput>cd /usr/sap</userinput>
+&prompt.root; <userinput>mkdir <replaceable>SID</replaceable></userinput>
+&prompt.root; <userinput>mkdir trans</userinput>
+&prompt.root; <userinput>exit</userinput></screen>
+ </sect3>
+
+ <sect3 id="entriesinslashetcslashservices">
+ <title><filename>/etc/services</filename>中的条目</title>
+
+ <para><application>&sap.r3;</application>在<filename>/etc/services</filename>里面需要一些条目,
+ 这些不会在安装过程中被正确设置,请添加下面的条目:</para>
+
+ <programlisting>
+sapdp00 3200/tcp # SAP Dispatcher. 3200 + Instance-Number
+sapgw00 3300/tcp # SAP Gateway. 3300 + Instance-Number
+sapsp00 3400/tcp # 3400 + Instance-Number
+sapms00 3500/tcp # 3500 + Instance-Number
+sapms<replaceable>SID</replaceable> 3600/tcp # SAP Message Server. 3600 + Instance-Number
+sapgw00s 4800/tcp # SAP Secure Gateway 4800 + Instance-Number</programlisting>
+ </sect3>
+
+ <sect3 id="necessarylocales">
+ <title>必要的本地化</title>
+ <indexterm><primary>本地化</primary></indexterm>
+
+ <para><application>&sap;</application>至少要求两个本地化设置,它不是RedHat的默认安装。
+ &sap;提供从他们的FTP服务器下载必需的RPMs(只有您是OSS的客户才能访问)。
+ 看注解0171356查找您需要的RPMs列表。</para>
+
+ <para>也可以只创建适当的链接(例如从<emphasis>de_DE</emphasis>到<emphasis>en_US</emphasis>),
+ 但是我们不推荐在生产系统上这样做(尽管它让IDES system工作的没有一点问题)。
+ 下面的本地化设置是必需的:</para>
+
+ <programlisting>de_DE.ISO-8859-1
+en_US.ISO-8859-1</programlisting>
+
+ <para>像这样创建链接</para>
+
+ <screen>&prompt.root; <userinput>cd /compat/linux/usr/share/locale</userinput>
+&prompt.root; <userinput>ln -s de_DE de_DE.ISO-8859-1</userinput>
+&prompt.root; <userinput>ln -s en_US en_US.ISO-8859-1</userinput></screen>
+
+ <para>如果他们不出现,在安装时可能会有问题。如果忽略这些问题(通过设置<filename>CENTRDB.R3S</filename>文件
+ 里面的<literal>STATUS</literal>为<literal>OK</literal>),不费一番周折,
+ 您就别想登陆进<application>&sap;</application>系统。</para>
+ </sect3>
+
+ <sect3 id="kerneltuning">
+ <title>内核调整</title>
+ <indexterm><primary>内核调整</primary></indexterm>
+
+ <para><application>&sap.r3;</application>
+ 需要许多资源。我因此添加了下面的参数在我的内核配置文件中:
+</para>
+
+ <programlisting># Set these for memory pigs (SAP and Oracle):
+options MAXDSIZ="(1024*1024*1024)"
+options DFLDSIZ="(1024*1024*1024)"
+# System V options needed.
+options SYSVSHM #SYSV-style shared memory
+options SHMMAXPGS=262144 #max amount of shared mem. pages
+#options SHMMAXPGS=393216 #use this for the 46C inst.parameters
+options SHMMNI=256 #max number of shared memory ident if.
+options SHMSEG=100 #max shared mem.segs per process
+options SYSVMSG #SYSV-style message queues
+options MSGSEG=32767 #max num. of mes.segments in system
+options MSGSSZ=32 #size of msg-seg. MUST be power of 2
+options MSGMNB=65535 #max char. per message queue
+options MSGTQL=2046 #max amount of msgs in system
+options SYSVSEM #SYSV-style semaphores
+options SEMMNU=256 #number of semaphore UNDO structures
+options SEMMNS=1024 #number of semaphores in system
+options SEMMNI=520 #number of semaphore identifiers
+options SEMUME=100 #number of UNDO keys</programlisting>
+
+
+ <para>这篇文档中指定的最小值是来自&sap;。没有针对Linux的描述,看看HP-UX的相关介绍了解更多信息 。
+ 安装4.6C SR2需要更多的内存,共享内存比<application>&sap;</application>和
+ <application>&oracle;</application>需要的还多,所以尽量为共享内存选一个大值。
+ </para>
+
+ <note><para>FreeBSD&nbsp;4.5在&i386;上缺省应该设置<literal>MAXDSIZ</literal>和
+ <literal>DFLDSIZ</literal>到1&nbsp;GB。否则,奇怪的错误像
+ <errorname>ORA-27102: out of memory</errorname>和
+ <errorname>Linux Error: 12: Cannot allocate memory</errorname>
+ 会出现。</para></note>
+ </sect3>
+ </sect2>
+
+ <sect2 id="installingsapr3">
+ <title>安装&sap.r3;</title>
+
+ <sect3 id="preparingsapcdroms">
+ <title>准备&sap; CDROMs</title>
+
+ <para>在安装过程中,有许多CDROM要被挂上和卸下。建议您有多个CDROM驱动器,
+ 您可以把它们都挂上。我决定拷贝CDROM的内容到相应的目录:</para>
+
+ <programlisting>/oracle/<replaceable>SID</replaceable>/sapreorg/<replaceable>cd-name</replaceable></programlisting>
+
+ <para>对于4.6B/IDES的安装,<replaceable>cd-name</replaceable>是<filename>KERNEL</filename>,
+ <filename>RDBMS</filename>, <filename>EXPORT1</filename>,
+ <filename>EXPORT2</filename>,<filename>EXPORT3</filename>,
+ <filename>EXPORT4</filename>, <filename>EXPORT5</filename> 和
+ <filename>EXPORT6</filename>中的一个,对于4.6C SR2的安装,是
+ <filename>KERNEL</filename>, <filename>RDBMS</filename>,
+ <filename>DISK1</filename>,<filename>DISK2</filename>,
+ <filename>DISK3</filename>,<filename>DISK4</filename>和
+ <filename>LANG</filename>中的一个。
+ 所有挂载上的CDs里面的文件名都应该是大写, 否则要用<option>-g</option>选项来挂载。所以使用下面的命令:
+ </para>
+
+ <screen>&prompt.root; <userinput>mount_cd9660 -g /dev/cd0a /mnt</userinput>
+&prompt.root; <userinput>cp -R /mnt/* /oracle/<replaceable>SID</replaceable>/sapreorg/<replaceable>cd-name</replaceable></userinput>
+&prompt.root; <userinput>umount /mnt</userinput></screen>
+ </sect3>
+
+ <sect3 id="runningtheinstall-script">
+ <title>运行安装脚本</title>
+
+ <para>首先您需要准备一个<filename class="directory">install</filename>目录:</para>
+
+ <screen>&prompt.root; <userinput>cd /oracle/<replaceable>SID</replaceable>/sapreorg</userinput>
+&prompt.root; <userinput>mkdir install</userinput>
+&prompt.root; <userinput>cd install</userinput></screen>
+
+ <para>然后运行安装脚本,他会拷贝所有相关的文件到<filename class="directory">install</filename>目录:</para>
+
+ <screen>&prompt.root; <userinput>/oracle/<replaceable>SID</replaceable>/sapreorg/KERNEL/UNIX/INSTTOOL.SH</userinput></screen>
+
+ <para>由于这是一个完全定制化的&sap.r3;演示系统的IDES安装(4.6B),
+ 我们有6个而不仅仅是3个EXPORT CDs。
+ 基于这点,安装模板<filename>CENTRDB.R3S</filename>是用来安装一个标准的中央环境
+ (<application>&r3;</application>和数据库),而不是IDES中央环境,
+ 所以从<filename class="directory">EXPORT1</filename>目录拷贝相应的<filename>CENTRDB.R3S</filename>,
+ 否则<command>R3SETUP</command>只要求3个EXPORT CDs。
+ </para>
+
+ <para>新的<application>&sap; 4.6C SR2</application>发行版带有4张EXPORT CDs。
+ 控制安装步骤的参数文件是<filename>CENTRAL.R3S</filename>。
+ 和早期发行版不同,它没有分开的中央环境的安装模板。
+ </para>
+
+ <para>安装完后,使用<command>hostname</command>命令得到<application>&sap;</application>需要的主机名,
+ 不需要完整的域名。
+ 所以为<username>ora<replaceable>sid</replaceable></username>和
+ <username><replaceable>sid</replaceable>adm</username>
+ 直接设置主机名,或设置别名<command>alias hostname='hostname -s'</command>。
+ 可以在<filename>.profile</filename>和<filename>.login</filename>里面为这两个用户设置。
+ </para>
+ </sect3>
+
+ <sect3 id="startr3setup-46B">
+ <title>启动<command>R3SETUP</command> 4.6B</title>
+
+ <para>确定<envar>LD_LIBRARY_PATH</envar>设置正确:
+ </para>
+
+ <screen>&prompt.root; <userinput>export LD_LIBRARY_PATH=/oracle/IDS/lib:/sapmnt/IDS/exe:/oracle/805_32/lib</userinput></screen>
+
+ <para>从安装目录以<username>root</username>身份启动<command>R3SETUP</command>:
+ </para>
+
+ <screen>&prompt.root; <userinput>cd /oracle/IDS/sapreorg/install</userinput>
+&prompt.root; <userinput>./R3SETUP -f CENTRDB.R3S</userinput></screen>
+
+ <para>这个脚本会问一些问题(括号里面是缺省值,后面是实际输入):
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>问题</entry>
+ <entry>缺省值</entry>
+ <entry>输入</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Enter SAP System ID</entry>
+ <entry>[C11]</entry>
+ <entry>IDS<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter SAP Instance Number</entry>
+ <entry>[00]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter SAPMOUNT Directory</entry>
+ <entry>[/sapmnt]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter name of SAP central host</entry>
+ <entry>[troubadix.domain.de]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter name of SAP db host</entry>
+ <entry>[troubadix]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Select character set</entry>
+ <entry>[1] (WE8DEC)</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Oracle server version (1) Oracle 8.0.5, (2) Oracle 8.0.6, (3) Oracle 8.1.5, (4) Oracle 8.1.6</entry>
+ <entry> </entry>
+ <entry>1<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Extract Oracle Client archive</entry>
+ <entry>[1] (Yes, extract)</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter path to KERNEL CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/KERNEL</entry>
+ </row>
+ <row>
+ <entry>Enter path to RDBMS CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/RDBMS</entry>
+ </row>
+ <row>
+ <entry>Enter path to EXPORT1 CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/EXPORT1</entry>
+ </row>
+ <row>
+ <entry>Directory to copy EXPORT1 CD</entry>
+ <entry>[/oracle/IDS/sapreorg/CD4_DIR]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter path to EXPORT2 CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/EXPORT2</entry>
+ </row>
+ <row>
+ <entry>Directory to copy EXPORT2 CD</entry>
+ <entry>[/oracle/IDS/sapreorg/CD5_DIR]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter path to EXPORT3 CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/EXPORT3</entry>
+ </row>
+ <row>
+ <entry>Directory to copy EXPORT3 CD</entry>
+ <entry>[/oracle/IDS/sapreorg/CD6_DIR]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter path to EXPORT4 CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/EXPORT4</entry>
+ </row>
+ <row>
+ <entry>Directory to copy EXPORT4 CD</entry>
+ <entry>[/oracle/IDS/sapreorg/CD7_DIR]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter path to EXPORT5 CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/EXPORT5</entry>
+ </row>
+ <row>
+ <entry>Directory to copy EXPORT5 CD</entry>
+ <entry>[/oracle/IDS/sapreorg/CD8_DIR]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter path to EXPORT6 CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/IDS/sapreorg/EXPORT6</entry>
+ </row>
+ <row>
+ <entry>Directory to copy EXPORT6 CD</entry>
+ <entry>[/oracle/IDS/sapreorg/CD9_DIR]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter amount of RAM for SAP + DB</entry>
+ <entry> </entry>
+ <entry>850<keycap>Enter</keycap> (in Megabytes)</entry>
+ </row>
+ <row>
+ <entry>Service Entry Message Server</entry>
+ <entry>[3600]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Group-ID of sapsys</entry>
+ <entry>[101]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Group-ID of oper</entry>
+ <entry>[102]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Group-ID of dba</entry>
+ <entry>[100]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter User-ID of <replaceable>sid</replaceable>adm</entry>
+ <entry>[1000]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter User-ID of ora<replaceable>sid</replaceable></entry>
+ <entry>[1002]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Number of parallel procs</entry>
+ <entry>[2]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>如果没有把CD拷贝到不同的位置,那么<application>&sap;</application>安装程序就不能
+ 找到需要的CD(通过CD上的<filename>LABEL.ASC</filename>来辨别),
+ 它会要求您挂上CD,或键入加载路径。
+ </para>
+
+ <para><filename>CENTRDB.R3S</filename>不可能是自由出错的,
+ 它再次请求EXPORT4 CD,但是正确的值是6_LOCATI ON,然后7_LOCATION 等,所以您可以键入正确的值。
+ </para>
+
+
+
+
+ <para>处理下面提到的问题,一样东西都要直接通过&oracle;数据库软件安装的地方。
+ </para>
+ </sect3>
+
+ <sect3 id="startr3setup-46C">
+ <title>Start <command>R3SETUP</command> 4.6C SR2</title>
+
+ <para>确定<envar>LD_LIBRARY_PATH</envar>设置正确。
+ 这和带<application>&oracle; 8.0.5</application>的4.6B的安装是不同的:
+ </para>
+
+ <screen>&prompt.root; <userinput>export LD_LIBRARY_PATH=/sapmnt/PRD/exe:/oracle/PRD/817_32/lib</userinput></screen>
+
+ <para>以<username>root</username>身份从安装目录启动<filename>R3SETUP</filename> :</para>
+
+ <screen>&prompt.root; <userinput>cd /oracle/PRD/sapreorg/install</userinput>
+&prompt.root; <userinput>./R3SETUP -f CENTRAL.R3S</userinput></screen>
+
+ <para>这个脚本会问一些问题(括号里面是缺省值,后面是实际输入):</para>
+
+ <informaltable frame="none">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>问题</entry>
+ <entry>缺省值</entry>
+ <entry>输入</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Enter SAP System ID</entry>
+ <entry>[C11]</entry>
+ <entry>PRD<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter SAP Instance Number</entry>
+ <entry>[00]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter SAPMOUNT Directory</entry>
+ <entry>[/sapmnt]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter name of SAP central host</entry>
+ <entry>[majestix]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Database System ID</entry>
+ <entry>[PRD]</entry>
+ <entry>PRD<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter name of SAP db host</entry>
+ <entry>[majestix]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Select character set</entry>
+ <entry>[1] (WE8DEC)</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Oracle server version (2) Oracle 8.1.7</entry>
+ <entry> </entry>
+ <entry>2<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Extract Oracle Client archive</entry>
+ <entry>[1] (Yes, extract)</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter path to KERNEL CD</entry>
+ <entry>[/sapcd]</entry>
+ <entry>/oracle/PRD/sapreorg/KERNEL</entry>
+ </row>
+ <row>
+ <entry>Enter amount of RAM for SAP + DB</entry>
+ <entry>2044</entry>
+ <entry>1800<keycap>Enter</keycap> (in Megabytes)</entry>
+ </row>
+ <row>
+ <entry>Service Entry Message Server</entry>
+ <entry>[3600]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Group-ID of sapsys</entry>
+ <entry>[100]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Group-ID of oper</entry>
+ <entry>[101]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Group-ID of dba</entry>
+ <entry>[102]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter User-ID of <username>oraprd</username></entry>
+ <entry>[1002]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter User-ID of <username>prdadm</username></entry>
+ <entry>[1000]</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>LDAP support</entry>
+ <entry> </entry>
+ <entry>3<keycap>Enter</keycap> (no support)</entry>
+ </row>
+ <row>
+ <entry>Installation step completed</entry>
+ <entry>[1] (continue)</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Choose installation service</entry>
+ <entry>[1] (DB inst,file)</entry>
+ <entry><keycap>Enter</keycap></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>到目前为止, 安装阶段只在创建用户时给出了一个错误OSUSERDBSID_IND_ORA(创建
+ 用户<username>ora<replaceable>sid</replaceable></username>)和
+ OSUSERSIDADM_IND_ORA(创建用户<username><replaceable>sid</replaceable>adm</username>)。</para>
+
+ <para>处理下面提到的问题,一样东西都要直接通过&oracle;数据库软件安装的地方。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="installingoracle805">
+ <title>安装&oracle; 8.0.5</title>
+
+ <para>请看相应的&sap;注释和 &oracle;的关于Linux的<filename>Readme</filename>
+ 以及<application>&oracle; DB</application>可能出现的问题。不是所有的问题都和不兼容库有关。
+ </para>
+
+ <para>关于<application>&oracle;</application>更多的安装信息,请参考<link
+ linkend="linuxemu-oracle">安装&oracle;</link>。</para>
+
+
+ <sect3 id="installingtheoracle805withorainst">
+ <title>用<command>orainst</command>安装&oracle; 8.0.5</title>
+
+ <para>如果<application>&oracle; 8.0.5</application>要被使用,一些其他的库需要被成功地重新链接,
+ 因为<application>&oracle; 8.0.5</application>是与一个老的glibc连接的(Redhat 6.0),
+ 但RedHat 6.1已经使用了一个新的glibc。所以您必须安装下面额外的软件包来保证链接正常:
+ </para>
+
+ <para><filename>compat-libs-5.2-2.i386.rpm</filename></para>
+ <para><filename>compat-glibc-5.2-2.0.7.2.i386.rpm</filename></para>
+ <para><filename>compat-egcs-5.2-1.0.3a.1.i386.rpm</filename></para>
+ <para><filename>compat-egcs-c++-5.2-1.0.3a.1.i386.rpm</filename></para>
+ <para><filename>compat-binutils-5.2-2.9.1.0.23.1.i386.rpm</filename></para>
+
+ <para>更多的信息,看相应的&sap;注释和&oracle;的<filename>Readme</filename>。
+ 如果这不是选项,您可以使用最初的程序,或使用与最初的Redhat系统重链接的程序。
+ </para>
+
+ <para>要编译智能代理,必须安装RedHat Tcl包。如果您不能得到
+ <filename>tcl-8.0.3-20.i386.rpm</filename>,一个更新的
+ <filename>tcl-8.0.5-30.i386.rpm</filename>也可以用。</para>
+
+ <para>除了重新链接,安装是直截了当的:</para>
+
+ <screen>&prompt.root; <userinput>su - oraids</userinput>
+&prompt.root; <userinput>export TERM=xterm</userinput>
+&prompt.root; <userinput>export ORACLE_TERM=xterm</userinput>
+&prompt.root; <userinput>export ORACLE_HOME=/oracle/IDS</userinput>
+&prompt.root; <userinput>cd /ORACLE_HOME/orainst_sap</userinput>
+&prompt.root; <userinput>./orainst</userinput></screen>
+
+ <para>用<keycap>Enter</keycap>来确认所有的屏幕直到安装完成,除了您必须取消
+ <emphasis>&oracle; On-Line Text Viewer</emphasis>选项,因为当前Linux下不可用。
+ <application>&oracle;</application>会要求用<command>i386-glibc20-linux-gcc</command>重新链接来
+ 代替<command>gcc</command>,<command>egcs</command>或者<command>i386-redhat-linux-gcc
+ </command>。</para>
+
+
+ <para>由于时间紧迫,我决定使用<application>&oracle; 8.0.5 PreProduction</application>版本。
+ </para>
+
+ </sect3>
+
+ <sect3 id="installingtheoracle805preproduction">
+ <title>安装&oracle; 8.0.5 Pre-production Release for
+ Linux (Kernel 2.0.33)</title>
+
+
+ <para>个安装很容易。挂上CD,启动安装程序。它就会要求&oracle;home目录的定位,
+ 然后拷贝那儿所有的程序。我不删除先前安装的RDBMS。
+
+ </para>
+
+ <para>然后,<application>&oracle;</application>数据库就可以毫无问题地运行了。
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="installingoracle817">
+ <title>安装&oracle; 8.1.7 Linux压缩包</title>
+ <para>拷贝<filename>oracle81732.tgz</filename>到您要安装的目录,
+ 然后解压到<filename>/oracle/<replaceable>SID</replaceable>/817_32/</filename>。
+ </para>
+ </sect2>
+
+ <sect2 id="continuewithsapr4installation">
+ <title>继续&sap.r3;安装</title>
+
+ <para>首先检查用户<username>idsamd</username>
+ (<replaceable>sid</replaceable>adm)和
+ <username>oraids</username>(ora<replaceable>sid</replaceable>)的环境变量。
+ 他们现在都有使用主机名的<filename>.profile</filename>,<filename>.login</filename>
+ 和<filename>.cshrc</filename>文件。在这个例子中,系统的主机名是没有限制的名称,
+ 您必须在所有三个文件中改变hostname为hostname -s。
+ </para>
+
+ <sect3 id="databaseload">
+ <title>加载数据库</title>
+
+ <para>然后,可以重新启动或继续<command>R3SETUP</command>。 <command>R3SETUP</command>就使用<command>R3load</command>
+ 创建表空间加载数据(对46B IDES,从EXPORT1到EXPORT6,对46C从DISK1到DISK4)。
+ </para>
+
+ <para>数据加载完后(可能需要一些时间),需要创建一些口令。对于测试安装,可以使用缺省口令:
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>问题</entry>
+ <entry>输入</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Enter Password for sapr3</entry>
+ <entry>sap<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Confirum Password for sapr3</entry>
+ <entry>sap<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Password for sys</entry>
+ <entry>change_on_install<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Confirm Password for sys</entry>
+ <entry>change_on_install<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Enter Password for system</entry>
+ <entry>manager<keycap>Enter</keycap></entry>
+ </row>
+ <row>
+ <entry>Confirm Password for system</entry>
+ <entry>manager<keycap>Enter</keycap></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>到目前为止,我们只在安装4.6B的过程中<command>dipgntab</command>出现了几个问题。
+ </para>
+ </sect3>
+
+ <sect3 id="listener">
+ <title>监听</title>
+
+ <para>像下面这样用<username>ora<replaceable>sid</replaceable></username>用户启动
+ <application>&oracle;</application>:
+ </para>
+
+ <screen>&prompt.user; <userinput>umask 0; lsnrctl start</userinput></screen>
+
+ <para>另外您可能得到<errorcode>ORA-12546</errorcode>错误,因为sockets没有正确的权限。
+ 看&sap;注释072984。</para>
+ </sect3>
+
+ <sect3 id="mnlstables">
+ <title>更新MNLS表</title>
+ <para>如果您打算倒入non-Latin-1 languages到<application>&sap;</application>系统,
+ 您必须更新表的多语言支持。这在&sap; OSS注释15023和45619有描述。否则,
+ 您可以在安装<application>&sap;</application>的时候忽略这个问题。
+ </para>
+ <note><para>如果您不需要MNLS,还是需要检查表TCPDB和初始化工作是否做了。
+ 更多信息参考&sap;注释0015023和0045619。</para></note>
+ </sect3>
+ </sect2>
+
+ <sect2 id="postinstallationsteps">
+ <title>快速安装步骤</title>
+
+ <sect3 id="requestsapr3licensekey">
+ <title>需要&sap.r3;许可密钥</title>
+
+ <para>您不得不要<application>&sap.r3;</application>许可密钥。这是必需的,
+ 因为临时许可只能用4个星期。 首先得到硬件的密匙。以用<username>idsadm</username>登入,
+ 然后调用<command>saplicense</command>:</para>
+
+ <screen>&prompt.root; <userinput>/sapmnt/IDS/exe/saplicense -get</userinput></screen>
+
+ <para>不带参数调用<command>saplicense</command>会给出一系列选项。
+ 要安装上面的许可密钥,可以这样:</para>
+
+ <screen>&prompt.root; <userinput>/sapmnt/IDS/exe/saplicense -install</userinput></screen>
+
+ <para>您要输入下面的值:</para>
+
+ <programlisting>SAP SYSTEM ID = <replaceable>SID, 3 chars</replaceable>
+CUSTOMER KEY = <replaceable>hardware key, 11 chars</replaceable>
+INSTALLATION NO = <replaceable>installation, 10 digits</replaceable>
+EXPIRATION DATE = <replaceable>yyyymmdd, usually "99991231"</replaceable>
+LICENSE KEY = <replaceable>license key, 24 chars</replaceable></programlisting>
+ </sect3>
+
+ <sect3 id="creatingusers">
+ <title>创建用户</title>
+
+ <para>在客户机000中创建一个用户(有些工作需用客户机000来完成,但与用户<username>sap*</username>和
+ <username>ddic</username>有些不同)。 作为一个用户名,我通常选择<username>wartung</username>
+ (或英语中的<username>service</username>)。 配置文件需要<literal>sap_new</literal>和
+ <literal>sap_all</literal>。对于额外的安全的默认用户口令应当被改变(这包括用户<username>sap*</username>和
+ <username>ddic</username>)。
+ </para>
+ </sect3>
+
+ <sect3 id="configtranssysprofileopermodesetc">
+ <title>配置传送系统,配置,操作模式等</title>
+
+ <para>在客户端000,用户不同于<username>ddic</username>和<username>sap*</username>,做下面的工作:
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>任务</entry>
+ <entry>处理</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Configure Transport System, e.g. as <emphasis>Stand-Alone
+ Transport Domain Entity</emphasis></entry>
+ <entry>STMS</entry>
+ </row>
+ <row>
+ <entry>Create / Edit Profile for System</entry>
+ <entry>RZ10</entry>
+ </row>
+ <row>
+ <entry>Maintain Operation Modes and Instances</entry>
+ <entry>RZ04</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>些和所有其他的快速安装步骤在<application>&sap;</application>安装指南里面有描述。
+ </para>
+ </sect3>
+
+ <sect3 id="editintsidsap">
+ <title>编辑<filename>init<replaceable>sid</replaceable>.sap</filename>(<filename>initIDS.sap</filename>)</title>
+
+ <para>文件<filename>/oracle/IDS/dbs/initIDS.sap</filename>
+ 包含了<application>&sap;</application>备份配置。
+ 这儿是使用的磁带机的大小,压缩的类型。要使用<command>sapdba</command> /
+ <command>brbackup</command>来得到这些。
+ 我们可以改变下面的值:</para>
+
+ <programlisting>compress = hardware
+archive_function = copy_delete_save
+cpio_flags = "-ov --format=newc --block-size=128 --quiet"
+cpio_in_flags = "-iuv --block-size=128 --quiet"
+tape_size = 38000M
+tape_address = /dev/nsa0
+tape_address_rew = /dev/sa0</programlisting>
+
+ <para>解释</para>
+
+
+
+ <para><varname>compress</varname>:我使用的磁带机是HP DLT1,它支持硬件压缩。 </para>
+
+
+ <para><varname>archive_function</varname>:
+ 这个定义了保存&oracle;文件日志的默认行为:新的日志文件被保存到磁带机上,
+ 保存的日志文件会被再次保存然后再删除。如果您需要恢复数据库,
+ 而其中一个磁带机已经损坏了,这可以防止出现麻烦。
+ </para>
+
+ <para><varname>cpio_flags</varname>:缺省使用<option>-B</option>来设置块大小为
+ 5120&nbsp;Bytes。对于DLT-Tapes,HP建议至少32&nbsp;K,所以我们使用<option>--block-size=128</option>
+ 设置64&nbsp;K。 <option>--format=newc</option>是必需的,因为我的inode数目超过了65535。
+ 最后一个选项<option>--quiet</option>是必需的,否则<command>brbackup</command>会在用
+ <command>cpio</command>来输出的时候报错。
+ </para>
+
+ <para><varname>cpio_in_flags</varname>:
+ 这个标志从磁带机加载回数据。格式是自动验证的。
+ </para>
+
+ <para><varname>tape_size</varname>:
+ 通常给出了磁带机的存储容量。出于安全原因,这个值要比实际的值要小一些。
+ </para>
+
+ <para><varname>tape_address</varname>:被<command>cpio</command>使用的非rewindable的设备。
+ </para>
+
+ <para><varname>tape_address_rew</varname>:被<command>cpio</command>使用的非rewindable的设备。</para>
+ </sect3>
+
+ <sect3>
+ <title>安装后的配置</title>
+
+ <para>下面的<application>&sap;</application>参数应该在安装以后调整(例子是IDES 46B, 1&nbsp;GB内存):
+ </para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>名称</entry>
+ <entry>值</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>ztta/roll_extension</entry>
+ <entry>250000000</entry>
+ </row>
+ <row>
+ <entry>abap/heap_area_dia</entry>
+ <entry>300000000</entry>
+ </row>
+ <row>
+ <entry>abap/heap_area_nondia</entry>
+ <entry>400000000</entry>
+ </row>
+ <row>
+ <entry>em/initial_size_MB</entry>
+ <entry>256</entry>
+ </row>
+ <row>
+ <entry>em/blocksize_kB</entry>
+ <entry>1024</entry>
+ </row>
+ <row>
+ <entry>ipc/shm_psize_40</entry>
+ <entry>70000000</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>&sap;注释0013026:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>名称</entry>
+ <entry>值</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>ztta/dynpro_area</entry>
+ <entry>2500000</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>&sap;注释0157246:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Name</entry>
+ <entry>Value</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>rdisp/ROLL_MAXFS</entry>
+ <entry>16000</entry>
+ </row>
+ <row>
+ <entry>rdisp/PG_MAXFS</entry>
+ <entry>30000</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <note>
+ <para>根据上面的参数,在使用1&nbsp;GB内存的系统上,可以像下面这样找到内存消耗:
+ </para>
+
+ <programlisting>Mem: 547M Active, 305M Inact, 109M Wired, 40M Cache, 112M Buf, 3492K Free</programlisting>
+ </note>
+ </sect3>
+ </sect2>
+
+ <sect2 id="problemsduringinstallation">
+ <title>安装过程出现的问题</title>
+
+ <sect3 id="restartr3setup">
+ <title>修复一个问题后重起<command>R3SETUP</command></title>
+
+ <para>如果出现问题<command>R3SETUP</command>会停止。如果您找到相关的日志文件并修复了问题。
+ 您需要再次重起<command>R3SETUP</command>,对于<command>R3SETUP</command>报的最后一个错误可以使用
+ REPEAT选项。
+ </para>
+
+ <para>要重起<command>R3SETUP</command>,只要使用相应的<filename>R3S</filename>文件重起:</para>
+
+ <screen>&prompt.root; <userinput>./R3SETUP -f CENTRDB.R3S</userinput></screen>
+
+ <para>for 4.6B, or with</para>
+
+ <screen>&prompt.root; <userinput>./R3SETUP -f CENTRAL.R3S</userinput></screen>
+
+ <para>对4.6C,不管有没有错误都使用<filename>CENTRAL.R3S</filename>或
+ <filename>DATABASE.R3S</filename>。</para>
+
+ <note><para>在某些阶段,<command>R3SETUP</command>假设database和<application>&sap;</application>
+ 进程都启动了。但是如果发生错误使得database没有启动,您就必须手动启动database和<application>&sap;</application>。
+ 修复错误后,还需要再次重起<command>R3SETUP</command>。
+ </para>
+ <para>也不要忘记再次重起<application>&oracle;</application>监听。
+ </para>
+ </note>
+ </sect3>
+
+ <sect3 id="indoraduringduringr3setup">
+ <title>OSUSERSIDADM_IND_ORA during <command>R3SETUP</command></title>
+
+ <para>如果在这阶段<command>R3SETUP</command>报错,编辑<command>R3SETUP</command>使用的模板文件
+ (<filename>CENTRDB.R3S</filename> (4.6B)或者<filename>CENTRAL.R3S</filename>或者<filename>DATABASER3S</filename> (4.6C))。定位到<literal>[OSUSERSIDADM_IND_ORA]</literal>或者搜索<literal>STATUS=ERROR</literal>条目
+ 然后像下面这样编辑它:
+ </para>
+
+ <programlisting>HOME=/home/<replaceable>sid</replaceable>adm (was empty)
+STATUS=OK (had status ERROR)
+ </programlisting>
+
+ <para>然后重起<command>R3SETUP</command>。
+ </para>
+ </sect3>
+
+ <sect3 id="indoraduringr3setup">
+ <title>OSUSERDBSID_IND_ORA during <command>R3SETUP</command></title>
+
+ <para><command>R3SETUP</command>也可能在这个阶段报错。修正方法和上面的OSUSERSIDADM_IND_ORA一样。
+ 编辑下面的值:
+ </para>
+
+ <programlisting>STATUS=OK</programlisting>
+
+ <para>重起<command>R3SETUP</command>。
+ </para>
+ </sect3>
+
+ <sect3 id="oraviewvrffilenotfound">
+ <title>&oracle;安装找不到<errorname>oraview.vrf文件</errorname></title>
+
+ <para>开始安装之前没有取消<emphasis>&oracle; On-Line Text Viewer</emphasis>
+
+ 既然这个选项当前没有用于Linux,这在安装时是需要标记的,在<application>&oracle;</application>
+ 安装中取消它,然后重新安装。</para>
+ </sect3>
+
+ <sect3 id="textenvincalid">
+ <title><errorname>TEXTENV_INVALID</errorname> during <command>R3SETUP</command>, RFC or SAPgui Start</title>
+
+ <para>如果这个错误还出现,正确的本地化可能已经丢了。 &sap;注释0171356列出了必须的RPMs
+ (比如<filename>saplocales-1.0-3</filename>,
+ <filename>saposcheck-1.0-1</filename> for RedHat 6.1)。 在这个例子中,您忽略了所有相关的错误,
+ <literal>STATUS</literal>从<literal>ERROR</literal>到<literal>OK</literal>然后重起
+ <command>R3SETUP</command>。<application>&sap;</application>系统不会被正确地配置,
+ 您就不能用一个<application>SAPgui</application>连接到系统。
+ 设法使用一个旧的Linux sapgui连接会得到下面的信息:</para>
+
+ <programlisting>Sat May 5 14:23:14 2001
+*** ERROR => no valid userarea given [trgmsgo. 0401]
+Sat May 5 14:23:22 2001
+*** ERROR => ERROR NR 24 occured [trgmsgi. 0410]
+*** ERROR => Error when generating text environment. [trgmsgi. 0435]
+*** ERROR => function failed [trgmsgi. 0447]
+*** ERROR => no socket operation allowed [trxio.c 3363]
+Speicherzugriffsfehler</programlisting>
+
+ <para>这个问题归咎于<application>&sap.r3;</application>不能正确地本地化,也不能自己正确地配置。
+ 要能够连接到<application>&sap;</application>, 需要在 <filename>DEFAULT.PFL</filename>(看注释0043288)
+ 文件中添加下面的记录:
+ </para>
+
+ <programlisting>abap/set_etct_env_at_new_mode = 0
+install/collate/active = 0
+rscp/TCP0B = TCP0B</programlisting>
+
+ <para>重起<application>&sap;</application>系统。现在,您可以连接到系统,
+ 即使您指定的国家语言不能正常工作。设置完国家后,这些记录会从<filename>DEFAULT.PFL</filename>文件
+ 删除。然后重新启动<application>&sap;</application>系统。</para>
+
+ </sect3>
+
+ <sect3 id="ora-00001">
+ <title><errorcode>ORA-00001</errorcode></title>
+ <para>这个错误只会在FreeBSD&nbsp;4.5上安装<application>&oracle; 8.1.7</application>
+ 的时候出现。因为<application>&oracle;</application>database不能自己正确初始化。
+ 在系统上保留semaphores和shared memory。
+ 然后再次启动数据库会出现<errorcode>ORA-00001</errorcode>错误。
+ </para>
+
+ <para>用<command>ipcs -a</command>找到再用<command>ipcrm</command>去掉。</para>
+ </sect3>
+
+ <sect3 id="ora-00445pmon">
+ <title><errorcode>ORA-00445</errorcode> (后台进程PMON没有启动)</title>
+ <para>这个错误发生在<application>&oracle; 8.1.7</application>上。
+ 如果没有用<username>prdadm</username>用户启动<command>startsap</command>脚本
+ (例如<command>startsap_majestix_00</command>)会报这个错误。</para>
+
+ <para>一种可能的解决方法是用<username>oraprd</username>用户使用<command>svrmgrl</command>:
+ </para>
+
+ <screen>&prompt.user; <userinput>svrmgrl</userinput>
+SVRMGR&gt; <userinput>connect internal;</userinput>
+SVRMGR&gt; <userinput>startup</userinput>;
+SVRMGR&gt; <userinput>exit</userinput></screen>
+
+ </sect3>
+
+ <sect3 id="ora-12546">
+ <title><errorcode>ORA-12546</errorcode>(用正确的权限启动监听)</title>
+
+ <para>以<username>oraids</username>用户启动<application>&oracle;</application>监听:
+ </para>
+
+ <screen>&prompt.root; <userinput>umask 0; lsnrctl start</userinput></screen>
+
+ <para>如果您得到<errorcode>ORA-12546</errorcode>错误,没有权限连接到sockets。
+ 请看&sap;注释0072984。</para>
+ </sect3>
+
+ <sect3 id="ora-27102">
+ <title><errorcode>ORA-27102</errorcode> (Out of Memory)</title>
+
+ <para>这个错误发生在使用<literal>MAXDSIZ</literal>和<literal>DFLDSIZ</literal>大于
+ 1&nbsp;GB(1024x1024x1024)。 我们一般得到错误<errorname>Linux Error 12: Cannot allocate memory</errorname>。
+ </para>
+ </sect3>
+
+ <sect3 id="dipgntabindind">
+ <title>[DIPGNTAB_IND_IND] during <command>R3SETUP</command></title>
+
+ <para>通常,看&sap;注释0130581 (<command>R3SETUP</command>步骤里面的
+ <literal>DIPGNTAB</literal>终止)。在IDES-specific安装的时候,因为某些原因
+ 安装过程没有使用正确的<application>&sap;</application>系统名<quote>IDS</quote>,而是用空字符
+ <literal>""</literal>代替。 这会导致一些访问目录的小问题,因为路径是动态使用
+ <replaceable>SID</replaceable>来创建的(这里是IDS)。所以用下面的方法代替:
+ </para>
+
+ <programlisting>/usr/sap/IDS/SYS/...
+/usr/sap/IDS/DVMGS00</programlisting>
+
+ <para>下面的路径被使用</para>
+
+ <programlisting>/usr/sap//SYS/...
+/usr/sap/D00</programlisting>
+
+ <para>为了继续安装,我们创建了一个附加的目录:
+ </para>
+
+ <screen>&prompt.root; <userinput>pwd</userinput>
+/compat/linux/usr/sap
+&prompt.root; <userinput>ls -l</userinput>
+total 4
+drwxr-xr-x 3 idsadm sapsys 512 May 5 11:20 D00
+drwxr-x--x 5 idsadm sapsys 512 May 5 11:35 IDS
+lrwxr-xr-x 1 root sapsys 7 May 5 11:35 SYS -> IDS/SYS
+drwxrwxr-x 2 idsadm sapsys 512 May 5 13:00 tmp
+drwxrwxr-x 11 idsadm sapsys 512 May 4 14:20 trans</screen>
+
+ <para>我们也发现在&sap;注释(0029227和0008401)里面描述了这个行为。
+ 我们没有在<application>&sap; 4.6C</application>安装里面遭遇这些问题。
+ </para>
+ </sect3>
+
+ <sect3 id="rfcrswboiniindind">
+ <title>[RFCRSWBOINI_IND_IND] during <command>R3SETUP</command></title>
+
+ <para>安装<application>&sap; 4.6C</application>时,这个错误是前面发生过的一个错误的
+ 结果。所以,您不得不查看相应的日志文件并修复错误。
+ </para>
+
+ <para>如果查看完日志文件后这个错误确实存在(看&sap;注释),您可以设置<literal>STATUS</literal>
+ 从<literal>ERROR</literal>到<literal>OK</literal>(<filename>CENTRDB.R3S</filename>文件里面)
+ 然后重起<command>R3SETUP</command>。安装完后,您必须从事务SE38执行
+ <literal>RSWBOINS</literal>。关于<literal>RFCRSWBOINI</literal>和<literal>RFCRADDBDIF</literal>的更多信息
+ 查看&sap;注释0162266。
+ </para>
+ </sect3>
+
+ <sect3 id="rfcraddbdifindind">
+ <title>[RFCRADDBDIF_IND_IND] during <command>R3SETUP</command></title>
+ <para>通过查看日志文件确定这个错误,它不是由于前面的问题导致的。
+ </para>
+
+ <para>如果您确定已经应用了&sap;注释0162266,就只要设置
+ <literal>STATUS</literal>从<literal>ERROR</literal>到<literal>OK</literal>
+ (<filename>CENTRDB.R3S</filename>文件里面)。然后重起<command>R3SETUP</command>。
+ 安装完后,您必须从事务SE38执行<literal>RADDBDIF</literal>。
+ </para>
+ </sect3>
+
+ <sect3 id="sigactionsig31">
+ <title><errorcode>sigaction sig31: File size limit exceeded</errorcode></title>
+
+ <para>这个错误在启动<application>&sap;</application>进程<emphasis>disp+work</emphasis>时出现。
+ 如果用<command>startsap</command>脚本启动<application>&sap;</application>,
+ 就会启动子进程,并由它启动后面所有的其他<application>&sap;</application>进程。
+ 所以脚本本身不会注意到有错误发生。
+ </para>
+
+ <para>为了检查<application>&sap;</application>进程是否正确启动,可以用
+ <command>ps ax | grep <replaceable>SID</replaceable></command>查看进程的状态。
+ 您会得到所有<application>&oracle;</application>和<application>&sap;</application>进程列表。
+ 如果看起来有些进程没有启动,或者您不能正确连接到<application>&sap;</application>系统。
+ 查看相应的日志文件,可以在
+ <filename>/usr/sap/<replaceable>SID</replaceable>/DVEBMGS<replaceable>nr</replaceable>/work/</filename>
+ 下找到, 一般查看 <filename>dev_ms</filename> 和
+ <filename>dev_disp</filename> 文件。</para>
+
+ <para>如果<application>&oracle;</application>和<application>&sap;</application>的共享内存总量超过了
+ 内核配置文件定义的大小就会出现signal 31错误,并且不能解析大的内存地址:
+ </para>
+
+ <programlisting># larger value for 46C production systems:
+options SHMMAXPGS=393216
+# smaller value sufficient for 46B:
+#options SHMMAXPGS=262144</programlisting>
+
+ </sect3>
+
+ <sect3 id="saposcolfails">
+ <title>启动<command>saposcol</command>失败</title>
+ <para>使用<command>saposcol</command> (version 4.6D)会出现一些问题。
+ <application>&sap;</application>系统使用<command>saposcol</command>收集系统性能数据。
+ 这个程序不是必需的。所以这些问题可以看作是小问题。
+ 老版本(4.6B)可以工作,但是不能收集所有的性能数据(很多调用只返回0,像CPU使用率)。
+ </para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="linuxemu-advanced">
+ <title>高级主题</title>
+
+ <para>如果您对Linux兼容模式是如何工作的感到好奇,这节正是您所需要的。 下面的绝大部分内容是由
+ Terry Lambert<email>tlambert@primenet.com</email> (Message ID:
+ <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>)发表在邮件列表&a.chat;上的内容组成的。
+ </para>
+
+ <sect2>
+ <title>它是如何工作的?</title>
+ <indexterm><primary>可执行类加载器</primary></indexterm>
+
+ <para>FreeBSD有一个<quote>可执行类加载器</quote>。它主要是嵌入了&man.execve.2;系统调用。
+</para>
+
+
+ <para>碰巧的是FreeBSD有一个引导器(loader)的列表,而不是一个简单的返回一个
+ 符号 <literal>#!</literal>的引导器!</para>
+
+ <para>从历史上来讲,只有&unix;平台的引导器会检查魔术(magic)数
+ (通常是文件的前4个或8个字节)是否是二进制的,
+ 如果是,就调用二进制引导程序。</para>
+
+
+
+ <para>如果它不是二进制类型的&man.execve.2;调用就会返回一个错误,shell就试图用shell命令执行它。
+ </para>
+
+ <para>缺省是使用<quote>当前设定的shell</quote>。</para>
+
+
+
+ <para>随后,进行了一些hack, &man.sh.1;开始检查前两个字符,如果它们是<literal>:\n</literal>,
+ 那它就调用&man.csh.1;(我们相信是SCO最先做这个hack的)。</para>
+
+ <para>FreeBSD现在所做的是用一个普通的<literal>#!</literal>引导器仔细检查引导器的列表,
+ 然后由解释程序一个接一个地解释,返回给<filename>/bin/sh</filename>。
+ </para>
+ <indexterm><primary>ELF</primary></indexterm>
+
+ <para>为了支持Linux ABI,FreeBSD就把魔术数看作为一个二进制ELF程序。(
+ 这样一来,它就使得在FreeBSD, &solaris;,Linux和其他任何操作系统之间只要使用ELF格式就都可以顺利运行)。
+ </para>
+ <indexterm><primary>Solaris</primary></indexterm>
+
+ <para>ELF引导器会寻找一个专门的<emphasis>标记</emphasis>,
+ 它是在ELF映像中的一个注释部分,但在SVR4/&solaris;的ELF中没有。
+</para>
+
+ <para>为了执行Linux程序,它们必须被打上<literal>Linux</literal>类型的<emphasis>标记</emphasis>;
+ 使用&man.brandelf.1;:</para>
+
+ <screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>
+
+
+
+ <para>做完之后,ELF引导器就会看到文件上的<literal>Linux</literal>的标记。
+ </para>
+ <indexterm>
+ <primary>ELF</primary>
+ <secondary>标记</secondary>
+ </indexterm>
+
+ <para>当ELF引导器看到<literal>Linux</literal>的标记,
+ 引导器就会在<literal>proc</literal>结构中替换一个指示器。
+ 所有的系统调用就会通过这个指示器来索引(在一个传统的 &unix;系统中,
+ 这就是<literal>sysent[]</literal>结构队列,包含系统调用)。
+ 此外,为了解决由于信号杂乱所造成的陷阱向量的问题,会造成线程的剧增,
+ 需要切断其他(或较小的)由Linux内核模块产生的修正。
+ </para>
+
+
+
+ <para>Linux系统调用向量包含一个<literal>sysent[]</literal>记录的列表,
+ 它的地址位于内核模块之中。</para>
+
+ <para>当一个系统调用被Linux程序调用时,有缺陷的代码会把系统调用功能的指示器从<literal>proc</literal>结构中解除,
+ 然后获得Linux,而不是FreeBSD,系统调用入口点。</para>
+
+ <para>另外,Linux模式动态地<emphasis>reroots</emphasis>查找;这和启动文件系统的<option>union</option>
+ 选项是等效的(即时不是<literal>unionfs</literal>文件系统)。
+ 首先会试图在<filename>/compat/linux/<replaceable>original-path</replaceable></filename>
+ 目录查找文件,如果失败了,就会在<filename>/<replaceable>original-path</replaceable></filename>
+ 目录下查找。这使得需要其它程序的程序可以运行(例如,Linux工具链都可以在Linux ABI的支持下工作)。
+ 也就是说Linux程序可以加载和执行FreeBSD程序,如果当前没有相应的Linux程序,
+ 那您可以在<filename>/compat/linux</filename>目录树中放置一个&man.uname.1;,来确保Linux程序不提示它们不能运行在Linux上。
+ </para>
+
+ <para>在FreeBSD内核中有一个Linux内核;由内核提供的能够提供所有服务的各种潜在功能
+ 在FreeBSD系统调用表记录和Linux系统调用表记录之间是一样的:
+ 文件系统操作,虚拟内存操作,信号发送,System V IPC,&hellip;等等。
+ 唯一的不同是FreeBSD会得到FreeBSD的<emphasis>胶合</emphasis>功能,
+ 而Linux程序会得到Linux的<emphasis>胶合</emphasis>功能
+ (大部分老的操作系统只有它们自己的<emphasis>胶合</emphasis>函数,
+ 函数地址在静态全局变量<literal>sysent[]</literal>结构数据里面,
+ 而不是动态的初始化到进程的<literal>proc</literal>结构)。
+ </para>
+
+
+
+ <para>哪一个是FreeBSD自己的ABI呢?这无关紧要。基本上,
+ 唯一的不同是FreeBSD的<emphasis>胶合</emphasis>功能是被静态连接到内核,
+ 而Linux的<emphasis>胶合</emphasis>功能可能是被静态连接到内核,
+ 也可能它们通过一个内核模块来访问。
+ </para>
+
+
+
+ <para>有一个真正的模拟器吗?没有,它只不过是一个ABI执行机制,不是一个模拟器。</para>
+
+ <para>为什么有时它被叫做<quote>Linux模拟器</quote>?
+ 只是为了更容易地卖出FreeBSD罢了!
+ 实际上,历史上从来没有描述这样一种执行机制的名字,FreeBSD并不是真正地运行Linux程序,如果您不编译进代码,
+ 或加载一个模块。
+ 就需要有一个名字来描述这样一种加载功能--因此就想出了<quote>Linux模拟器</quote>这样一个名字。
+ </para>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/mac/Makefile b/zh_CN.GB2312/books/handbook/mac/Makefile
new file mode 100644
index 0000000000..fc6a90a182
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/mac/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= mac/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/mac/chapter.sgml b/zh_CN.GB2312/books/handbook/mac/chapter.sgml
new file mode 100644
index 0000000000..40b3dc2fa1
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/mac/chapter.sgml
@@ -0,0 +1,119 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Skeleton File; Obtained from FreeBSD Handbook-fr
+ $FreeBSD$
+-->
+
+<chapter id="mac">
+
+ <title>Mandatory Access Control ** 翻译进行中 **</title>
+
+ <sect1 id="mac-synopsis">
+ <title>Synopsis</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-glossary">
+ <title>Key Terms in this Chapter</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-initial">
+ <title>Explanation of MAC</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-understandlabel">
+ <title>Understanding MAC Labels</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-modules">
+ <title>Module Configuration</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-bsdextended">
+ <title>The MAC bsdextended Module</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-ifoff">
+ <title>The MAC ifoff Module</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-portacl">
+ <title>The MAC portacl Module</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-labelingpolicies">
+ <title>MAC Policies with Labeling Features</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-partition">
+ <title>The MAC partition Module</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-mls">
+ <title>The MAC Multi-Level Security Module</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-biba">
+ <title>The MAC Biba Module</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-lomac">
+ <title>The MAC LOMAC Module</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-implementing">
+ <title>Implementing a Secure Environment with MAC</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="MAC-examplehttpd">
+ <title>Another Example: Using MAC to Constrain a Web Server</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mac-troubleshoot">
+ <title>Troubleshooting the MAC Framework</title>
+
+ <para></para>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/mail/Makefile b/zh_CN.GB2312/books/handbook/mail/Makefile
new file mode 100644
index 0000000000..bfebfae160
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/mail/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= mail/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/mail/chapter.sgml b/zh_CN.GB2312/books/handbook/mail/chapter.sgml
new file mode 100644
index 0000000000..28c42a506b
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/mail/chapter.sgml
@@ -0,0 +1,1594 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese Documentation Project
+
+ Original Revision: 1.120
+ $FreeBSD$
+-->
+
+<chapter id="mail">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Bill</firstname>
+ <surname>Lloyd</surname>
+ <contrib>Original work by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Rewritten by </contrib>
+ <!-- 2 Dec 1999 -->
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>电子邮件</title>
+
+ <sect1 id="mail-synopsis">
+ <title>概述</title>
+ <indexterm><primary>email</primary></indexterm>
+ <indexterm><primary>电子邮件</primary></indexterm>
+
+ <para><quote>电子邮件</quote>,或通常所说的 email,是现今使用最广泛的通信方式之一。
+ 本章将对如何在 &os; 上运行邮件服务,以及如何使用 &os; 来收发电子邮件作基本的介绍;
+ 然而,它并不是一份完整的参考手册,实际上,许多需要考虑的重要事项都没有提及。
+ 我们推荐读者阅读 <xref linkend="bibliography"> 中的参考书籍,以获得对于这部分的全面认识。</para>
+
+ <para>读完这章,您将了解:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>那些软件与收发电子邮件有关。</para>
+ </listitem>
+
+ <listitem>
+ <para>&os; 下的基本 <application>sendmail</application> 配置文件在哪里。</para>
+ </listitem>
+
+ <listitem>
+ <para>本地和远程邮箱之间的区别。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何阻止垃圾邮件制造者非法地使用您的邮件服务器作为转发中继。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何安装和配置用于替代 <application>sendmail</application> 的其他邮件传输代理。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何处理常见的邮件服务器问题。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何使用 SMTP 和 UUCP。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何设置系统使其只能发送邮件。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在拨号连接时使用邮件。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何配置 SMTP 验证以增加安全性。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何安装并使用用户邮件代理,如
+ <application>mutt</application> 来收发邮件。</para>
+ </listitem>
+
+ <listitem>
+
+ <para>如何从远程的 <acronym>POP</acronym>
+ 或 <acronym>IMAP</acronym> 服务器上下载邮件。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在进入的邮件上自动地应用过滤器和规则。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>阅读本章之前,您需要:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>正确地配置您的网络连接
+ (<xref linkend="advanced-networking">).</para>
+ </listitem>
+
+ <listitem>
+ <para>正确地为您的邮件服务器配置 DNS 信息
+ (<xref linkend="advanced-networking">)。</para>
+ </listitem>
+
+ <listitem>
+ <para>知道如何安装第三方软件
+ (<xref linkend="ports">).</para></listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="mail-using">
+ <title>使用电子邮件</title>
+ <indexterm><primary>POP</primary></indexterm>
+ <indexterm><primary>IMAP</primary></indexterm>
+ <indexterm><primary>DNS</primary></indexterm>
+
+ <para>邮件交换可以分为 5 部分。它们是:
+ <link linkend="mail-mua">用户端程序</link>、<link
+ linkend="mail-mta">服务端守护进程</link>、<link
+ linkend="mail-dns">DNS</link>、<link
+ linkend="mail-receive">远程或本地的邮箱</link>、
+ 当然,<link linkend="mail-host">还有邮件主机自己</link>。</para>
+
+ <sect2 id="mail-mua">
+ <title>用户端程序</title>
+
+ <para>这包括一些基于命令行的程序,例如
+ <application>mutt</application>、
+ <application>pine</application>、<application>elm</application>
+ 和 <command>mail</command>,以及类似 <application>balsa</application>、
+ <application>xfmail</application> 这样的 <acronym>GUI</acronym> 程序。
+ 此外,还有我们更<quote>熟悉的</quote>WWW 浏览器这样的程序。
+ 这些程序简单地通过调用<link
+ linkend="mail-mta">服务守护进程</link>把邮件事务交给本地的
+ <link linkend="mail-host"><quote>邮件主机</quote></link>,或者通过
+ <acronym>TCP</acronym> 把邮件发出去。</para>
+ </sect2>
+ <sect2 id="mail-mta">
+ <title>邮件主机上使用的服务程序</title>
+ <indexterm>
+ <primary>邮件服务程序</primary>
+ <secondary><application>sendmail</application></secondary>
+ </indexterm>
+ <indexterm>
+ <primary>邮件服务程序</primary>
+ <secondary><application>postfix</application></secondary>
+ </indexterm>
+ <indexterm>
+ <primary>邮件服务程序</primary>
+ <secondary><application>qmail</application></secondary>
+ </indexterm>
+ <indexterm>
+ <primary>邮件服务程序</primary>
+ <secondary><application>exim</application></secondary>
+ </indexterm>
+
+ <para>&os; 默认情况下采用 <application>sendmail</application>,
+ 但它也支持为数众多的其它邮件服务程序,
+ 这其中包括:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><application>exim</application>;</para>
+ </listitem>
+
+ <listitem>
+ <para><application>postfix</application>;</para>
+ </listitem>
+
+ <listitem>
+ <para><application>qmail</application>.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>邮件服务器后台守护程序通常有两个功能 &mdash;
+ 接收外面发来的邮件和把邮件传送出去。 但它
+ <emphasis>不</emphasis> 负责使用类似
+ <acronym>POP</acronym> 或 <acronym>IMAP</acronym> 这样的协议来帮您阅读邮件,
+ 也不负责连接到本地的
+ <filename>mbox</filename> 或 Maildir 信箱。 您可能需要其它的
+ <link linkend="mail-receive">服务程序</link> 来完成这些任务。</para>
+
+ <warning>
+ <para>较早版本的 <application>sendmail</application>
+ 有一些严重的安全问题, 他们可能导致攻击者从本地和/或远程操作您的电脑。
+ 您应该确认自己使用的是最新版本以避免这些问题。
+ 另外, 也可以从 <link linkend="ports">&os;
+ Ports Collection</link> 来安装其它的
+ <acronym>MTA</acronym>。</para>
+ </warning>
+ </sect2>
+
+ <sect2 id="mail-dns">
+ <title>Email 和 DNS</title>
+
+ <para>域名系统 (DNS) 及其服务程序
+ <command>named</command> 在email的投递过程当中扮演着很重要的角色。
+ 为了能够从您的站点向其它的站点传递邮件, 服务程序需要通过 DNS 查找接收邮件的远程站点的位置。
+ 类似地, 在远程站点向您的主机投递邮件时也会发生这样的查找。</para>
+
+ <indexterm>
+ <primary>MX 记录</primary>
+ </indexterm>
+
+ <para><acronym>DNS</acronym> 负责将主机名映射为 IP 地址,
+ 同时, 也需要保存递送邮件时所需要的信息, 这些信息称作 MX 记录。
+ MX (Mail eXchanger,邮件交换) 记录指定了哪个, 或哪些主机能够接收特定域下的邮件。
+ 如果您没有为主机名或域名设置 MX 记录, 则邮件将被直接递交给主机名对应 IP 所在的主机。</para>
+
+ <para>您可以通过
+ &man.host.1; 命令来查找任何域或主机名对应的 MX 记录, 如下面的例子所示:</para>
+
+ <screen>&prompt.user; <userinput>host -t mx FreeBSD.org</userinput>
+FreeBSD.org mail is handled (pri=10) by mx1.FreeBSD.org</screen>
+ </sect2>
+
+ <sect2 id="mail-receive">
+ <title>接收邮件</title>
+ <indexterm>
+ <primary>电子邮件</primary>
+ <secondary>接收</secondary>
+ </indexterm>
+
+ <para>为您的域接收邮件是通过邮件服务器来完成的。
+ 它收集发送给您的域的那些邮件,并保存到
+ <filename>mbox</filename> (存储邮件默认的方法) 或 Maildir 格式,
+ 这取决于您采用的配置。
+ 一旦邮件被保存下来, 就可以在本地通过类似
+ &man.mail.1; 或
+ <application>mutt</application> 这样的程序, 或在远程通过
+ <acronym>POP</acronym> 或 <acronym>IMAP</acronym> 这样的协议来读取了。
+ 简单地说, 如果您只在本地阅读邮件,那就没有必要安装
+ <acronym>POP</acronym> 或 <acronym>IMAP</acronym> 服务。</para>
+
+ <sect3 id="pop-and-imap">
+ <title>通过 <acronym>POP</acronym> 和 <acronym>IMAP</acronym> 访问远程的邮件</title>
+
+ <indexterm><primary>POP</primary></indexterm>
+ <indexterm><primary>IMAP</primary></indexterm>
+ <para>如果希望在远程访问邮箱, 就需要访问
+ <acronym>POP</acronym> 或 <acronym>IMAP</acronym>
+ 服务器。 这些协议允许用户从远程方便地访问他们的信箱。 尽管
+ <acronym>POP</acronym> 和 <acronym>IMAP</acronym> 都允许用户从远程访问信箱,
+ 但 <acronym>IMAP</acronym> 有很多优点, 这包括:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><acronym>IMAP</acronym> 既可以从远程服务器上抓取邮件, 也可以把邮件放上去。</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>IMAP</acronym> 支持并发更新。</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>IMAP</acronym> 对于使用低速网络的用户尤为有用,
+ 因为它能够让这些用户把邮件的结构下载下去, 而无需立即下载整个邮件。
+ 它还可以在服务器端执行类似查找这样的操作, 以减少客户机和服务器之间的通讯量。</para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para>您可以按照下面的步骤来安装和配置 <acronym>POP</acronym> 或
+ <acronym>IMAP</acronym> 服务器:</para>
+
+ <procedure>
+ <step>
+ <para>选择一个最符合需要的 <acronym>IMAP</acronym> 或
+ <acronym>POP</acronym> 服务器。
+ 下列 <acronym>POP</acronym> 和
+ <acronym>IMAP</acronym> 服务器是最著名的, 而且都有很多成功案例:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><application>qpopper</application>;</para>
+ </listitem>
+
+ <listitem>
+ <para><application>teapop</application>;</para>
+ </listitem>
+
+ <listitem>
+ <para><application>imap-uw</application>;</para>
+ </listitem>
+
+ <listitem>
+ <para><application>courier-imap</application>;</para>
+ </listitem>
+ </itemizedlist>
+
+ </step>
+
+ <step>
+ <para>通过 ports collection 安装 <acronym>POP</acronym> 或
+ <acronym>IMAP</acronym> 服务。</para>
+ </step>
+
+ <step>
+ <para>根据需要修改 <filename>/etc/inetd.conf</filename>
+ 来加载 <acronym>POP</acronym> 或
+ <acronym>IMAP</acronym> 服务。</para>
+ </step>
+ </procedure>
+
+ <warning>
+ <para>此外还应注意的是 <acronym>POP</acronym> 和
+ <acronym>IMAP</acronym> 传递的信息, 包括用户名和口令等等,
+ 通常都是明文的。 这意味着如果您希望加密传输过程中的信息,
+ 可能需要考虑使用 &man.ssh.1; 隧道。 关于如何实施隧道在
+ <xref linkend="security-ssh-tunneling"> 中进行了详细阐述。</para>
+ </warning>
+ </sect3>
+
+ <sect3 id="local">
+ <title>操作本地的信箱</title>
+
+ <para>信箱可以在邮件服务器本地直接用
+ <acronym>MUA</acronym> 来进行操作。
+ 这通常是通过
+ <application>mutt</application> 或 &man.mail.1; 这样的用用程序实现的。
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="mail-host">
+ <title>邮件服务器</title>
+ <indexterm><primary>邮件服务器</primary></indexterm>
+
+ <para>邮件服务器是通过服务器给的一个名字,这也正是它能在您的主机和网络上发送和接收邮件的原因.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="sendmail">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Christopher</firstname>
+ <surname>Shumway</surname>
+ <contrib>作者:</contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title><application>sendmail</application> 配置</title>
+
+ <indexterm>
+ <primary><application>sendmail</application></primary>
+ </indexterm>
+
+ <para>&man.sendmail.8; 是 &os; 中的默认邮件传输代理 (MTA)。
+ <application>sendmail</application> 的任务是从邮件用户代理
+ (<acronym>MUA</acronym>) 接收邮件然后根据配置文件的定义把它们送给配置好的的寄送程序。
+ <application>sendmail</application> 也能接受网络连接,
+ 并且发送邮件到本地邮箱或者发送它到其它程序。</para>
+
+ <para><application>sendmail</application> 使用下列配置文件:</para>
+
+ <indexterm>
+ <primary><filename>/etc/mail/access</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/etc/mail/aliases</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/etc/mail/local-host-names</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/etc/mail/mailer.conf</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/etc/mail/mailertable</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/etc/mail/sendmail.cf</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>/etc/mail/virtusertable</filename></primary>
+ </indexterm>
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>文件名</entry>
+ <entry>功能</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <filename>/etc/mail/access</filename>
+ </entry>
+ <entry><application>sendmail</application> 访问数据库文件
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <filename>/etc/mail/aliases</filename>
+ </entry>
+ <entry>邮箱别名</entry>
+ </row>
+ <row>
+ <entry>
+ <filename>/etc/mail/local-host-names</filename>
+ </entry>
+ <entry> <application>sendmail</application>
+ 接收邮件主机列表</entry>
+ </row>
+ <row>
+ <entry>
+ <filename>/etc/mail/mailer.conf</filename>
+ </entry>
+ <entry>邮寄配置程序</entry>
+ </row>
+ <row>
+ <entry>
+ <filename>/etc/mail/mailertable</filename>
+ </entry>
+ <entry>邮件分发列表</entry>
+ </row>
+ <row>
+ <entry>
+ <filename>/etc/mail/sendmail.cf</filename>
+ </entry>
+ <entry><application>sendmail</application>的主配置文件
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <filename>/etc/mail/virtusertable</filename>
+ </entry>
+ <entry>虚拟用户和域列表</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <sect2>
+ <title><filename>/etc/mail/access</filename></title>
+
+ <para>访问数据库定义了什么主机或者 IP
+ 地址可以访问本地邮件服务器和它们是哪种类型的访问。
+ 主机可能会列出 <option>OK</option>、
+ <option>REJECT</option>、<option>RELAY</option> 或者简单的通过
+ <application>sendmail</application> 的出错处理程序检测一个给定的邮件错误。
+ 主机默认列出 <option>OK</option>,允许传送邮件到主机,
+ 只要邮件的最后目的地是本地主机。列出 <option>REJECT</option>
+ 将拒绝所有的邮件连接。如果带有 <option>RELAY</option>
+ 选项的主机将被允许通过这个邮件服务器发送邮件到任何地方。</para>
+
+ <example>
+ <title>配置<application>sendmail</application>
+ 访问数据库</title>
+
+ <programlisting>cyberspammer.com 550 We don't accept mail from spammers
+FREE.STEALTH.MAILER@ 550 We don't accept mail from spammers
+another.source.of.spam REJECT
+okay.cyberspammer.com OK
+128.32 RELAY</programlisting>
+ </example>
+
+ <para>在上面的例子中我们有 5 条记录。
+ 与左边列表匹配的发件人受到右边列表动作的影响。
+ 前边的两个例子给出了 <application>sendmail</application>
+ 的出错处理程序检测到的错误代码。
+ 当一个邮件与左边列表相匹配时,这个信息会被打印到远程主机上。
+ 下一条记录拒绝来自 Internet 上的一个特别主机的邮件
+ <hostid>another.source.of.spam</hostid>。接下来的记录允许来自
+ <hostid role="fqdn">okay.cyberspammer.com</hostid> 的邮件连接,
+ 这条记录比上面那行 <hostid role="domainname">cyberspammer.com</hostid>
+ 更准确。更多的准确匹配使不准确的匹配无效。最后一行允许电子邮件从主机和
+ <hostid>128.32</hostid> 开头的 IP 地址转发。
+ 这些主机将被允许通过这台邮件服务器前往其它邮件服务器发送邮件。</para>
+
+ <para>当这个文件被升级的时候,您必须在
+ <filename>/etc/mail/</filename> 运行 <command>make</command>
+ 升级数据库。</para>
+
+ </sect2>
+ <sect2>
+ <title><filename>/etc/mail/aliases</filename></title>
+
+ <para>别名数据库包含一个扩展到用户,程序或者其它别名的虚拟邮箱列表。
+ 下面是一些在 <filename>/etc/mail/aliases</filename> 中使用的例子:</para>
+
+ <example>
+ <title>邮件别名</title>
+ <programlisting>root: localuser
+ftp-bugs: joe,eric,paul
+bit.bucket: /dev/null
+procmail: "|/usr/local/bin/procmail"</programlisting>
+ </example>
+
+ <para>文件格式比较简单:邮箱名在冒号左边,右边是扩展的目标。
+ 第一个例子简单的扩展邮箱 <username>root</username>
+ 到邮箱 <username>localuser</username>,它可以在别名数据库中被找到。
+ 如果没有找到匹配的,那么这个信息会被发送给本地用户
+ <username>localuser</username>。接下来的例子显示了一个邮件列表。
+ 发送到 <username>ftp-bugs</username> 邮箱的邮件会被扩展为三个本地邮箱
+ <username>joe</username>、
+ <username>eric</username> 和 <username>paul</username>。注意
+ 一个远程邮箱可以用 <literal>user@example.com</literal> 的形式指定。
+ 下个例子显示将邮件写到 <filename>/dev/null</filename> 文件。
+ 最后一个例子向您展示了传送邮件到一个程序,在这个例子里邮件通过
+ &unix; 管道被写到 <filename>/usr/local/bin/procmail</filename>
+ 标准输入里。</para>
+
+ <para>当这个文件被升级时, 您必须在<filename>/etc/mail/</filename>运行
+ <command>make</command>来升级数据库.</para>
+ </sect2>
+ <sect2>
+ <title><filename>/etc/mail/local-host-names</filename></title>
+
+ <para>这是一个 &man.sendmail.8; 被接受为一个本地主机名的主机名列表。
+ 可以放入任何 <application>sendmail</application>
+ 将从那里收发邮件的域名或主机。例如,如果这个邮件服务器从域
+ <hostid role="domainname">example.com</hostid> 和主机
+ <hostid role="fqdn">mail.example.com</hostid> 接收邮件,它的
+ <filename>local-host-names</filename> 文件,可以看起来象如下这样:</para>
+
+ <programlisting>example.com
+mail.example.com</programlisting>
+
+ <para>当这个文件被升级,&man.sendmail.8; 必须重新启动,以便更新设置。</para>
+
+ </sect2>
+
+ <sect2>
+ <title><filename>/etc/mail/sendmail.cf</filename></title>
+
+ <para><application>sendmail</application>的主配置文件
+ <filename>sendmail.cf</filename> 控制着
+ <application>sendmail</application> 的所有行为,
+ 包括从重写邮件地址到打印拒绝远程邮件服务器信息等所有事。
+ 当然,作为一个不同的角色,这个配置文件是相当复杂的,
+ 它的细节部分已经超出了本节的范围。幸运的是,
+ 这个文件对于标准的邮件服务器来说很少需要被改动。</para>
+
+ <para><application>sendmail</application> 主配置文件可以用
+ &man.m4.1; 宏定义 <application>sendmail</application>
+ 的特性和行为。它的细节请看
+ <filename>/usr/src/contrib/sendmail/cf/README</filename>。</para>
+
+ <para>当这个文件被修改时,
+ <application>sendmail</application> 必须重新启动以便对新修改生效。</para>
+
+ </sect2>
+ <sect2>
+ <title><filename>/etc/mail/virtusertable</filename></title>
+
+ <para><filename>virtusertable</filename> 映射虚拟域名和邮箱到真实的邮箱。
+ 这些邮箱可以是本地的、远程的、<filename>/etc/mail/aliases</filename>
+ 中定义的别名或一个文件。</para>
+
+ <example>
+ <title>虚拟域邮件映射的例子</title>
+
+ <programlisting>root@example.com root
+postmaster@example.com postmaster@noc.example.net
+@example.com joe</programlisting>
+ </example>
+
+ <para>在上面这个例子里,我们映射了一个域
+ <hostid role="domainname">example.com</hostid>。
+ 这个文件用一个最初匹配的文件处理。第一项映射
+ <literal>root@example.com</literal> 到本地邮箱
+ <username>root</username>。下一项映射
+ <literal>postmaster@example.com</literal> 到
+ <hostid role="fqdn">noc.example.net</hostid> 主机的
+ <username>postmaster</username> 邮箱。最后,如果域
+ <hostid role="domainname">example.com</hostid>
+ 没有被什么匹配,它将与最后一个映射匹配,在
+ <hostid role="domainname">example.com</hostid>
+ 域,每个其它邮件信息地址到某一个主机被匹配。
+ 在这里被映射到本地邮箱 <username>joe</username>。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="mail-changingmta">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Andrew</firstname>
+ <surname>Boothman</surname>
+ <contrib>Written by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Gregory</firstname>
+ <surname>Neil Shapiro</surname>
+ <contrib>Information taken from e-mails written by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>改变您的邮件传输代理程序</title>
+ <indexterm>
+ <primary>邮件</primary>
+ <secondary>改变mta</secondary>
+ </indexterm>
+
+ <para>先前已经提到,FreeBSD 中的
+ <application>sendmail</application> 已经安装了您的
+ MTA (邮件传输代理程序)。因此它它负责着您的收发邮件的工作。</para>
+
+ <para>然而,基于不同的理由,一些系统管理员想要改变他们系统的
+ MTA。这些理由从简单的想要尝试另一个 MTA,到需要一个特殊的特性或者
+ package 依赖某个邮寄程序等等。幸运的是,不管是什么理由,FreeBSD
+ 都能容易的改变它。</para>
+
+ <sect2>
+ <title>安装一个新的 MTA</title>
+
+ <para>对于可用的 MTA 您有很多的选择。一个好的出发点是
+ <link linkend="ports">FreeBSD Ports Collection</link>,在那里您能找到很多。
+ 当然您可以从任何位置不受任何限制的使用 MTA,只要您能让它运行在
+ FreeBSD 下。</para>
+
+ <para>开始安装您的新 MTA。一旦它被安装,
+ 它可以让您有机会决定它是否能满足您的需要和在接管
+ <application>sendmail</application> 之前让您有机会配置您的新软件。
+ 当完成这些之后,您应该确信安装的新软件不会尝试更改系统的二进制文件例如象
+ <filename>/usr/bin/sendmail</filename>。除此以外,
+ 您的新邮件软件启用之前要已经配置好它。</para>
+
+ <para>具体配置请参考您所选择的 MTA 软件的配置文档或其它相关资料。</para>
+ </sect2>
+
+ <sect2>
+ <title>停用 <application>sendmail</application></title>
+
+ <para>值得注意的是启动
+ <application>sendmail</application> 在 4.5-RELEASE 版本和
+ 4.6-RELEASE 版本之间有些不同。因此,停用它的过程也稍有不同。</para>
+
+ <sect3>
+ <title>FreeBSD 4.5-STABLE 版本 2002/4/4 之前和更早前版本
+ (包括 4.5-RELEASE 及更早版本)</title>
+
+ <para>输入:</para>
+
+ <programlisting>sendmail_enable="NO"</programlisting>
+
+ <para>到 <filename>/etc/rc.conf</filename> 文件。它将停用
+ <application>sendmail</application> 接收邮件服务,
+ 但是如果 <filename>/etc/mail/mailer.conf</filename> 文件(见下文)
+ 没有被改变,<application>sendmail</application> 将仍然可以发送邮件。</para>
+ </sect3>
+
+ <sect3>
+ <title>FreeBSD 4.5-STABLE 版本 2002/4/4 之后和以后的版本
+ (包括 4.6-RELEASE 及后续版本)</title>
+
+ <para>为了完全的停用
+ <application>sendmail</application>,您必须在
+ <filename>/etc/rc.conf</filename> 文件里使用</para>
+
+ <programlisting>sendmail_enable="NONE"</programlisting>
+
+ <warning>
+ <para>如果用这个方法停止 <application>sendmail</application>
+ 的发送邮件服务,那么就必须有一个能够完全正常地工作的邮件发送系统。
+ 如果不这样做的话,类似 &man.periodic.8;
+ 这样的系统功能将无法正确地通过电子邮件将它们的执行结果送到通常希望的地方去。
+ 系统中的很多部分都要求有和
+ <application>sendmail</application> 在功能上兼容的系统。
+ 如果应用程序在您禁用之后仍然继续使用
+ <application>sendmail</application> 的执行文件来发送文件,
+ 则这些邮件可能会进入睡眠的
+ <application>sendmail</application> 队列,并永远无法到达目的地。</para>
+ </warning>
+
+ <para>如果只是想要停止
+ <application>sendmail</application> 的接收邮件服务,
+ 您应该在 <filename>/etc/rc.conf</filename> 文件中设置</para>
+
+ <programlisting>sendmail_enable="NO"</programlisting>
+
+ <para>更多的有关
+ <application>sendmail</application> 可用的启动选项,参看
+ &man.rc.sendmail.8; 联机手册.</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>机器引导时运行您的新 MTA</title>
+
+ <para>您也许有两种方法在机器引导时运行您的新
+ MTA,这个也倚赖您所运行的 FreeBSD 版本。</para>
+
+ <sect3>
+ <title>FreeBSD 4.5-STABLE 版本 2002/4/11 以前
+ (包括 4.5-RELEASE 及更早版本)</title>
+
+ <para>在 <filename>/usr/local/etc/rc.d/</filename>
+ 中添加一个以 <filename>.sh</filename> 为后缀的脚本文件,
+ 并可以用 <username>root</username> 身份运行。这个脚本应该接受
+ <literal>start</literal> 和 <literal>stop</literal>
+ 参数。用如下命令启动这个脚本</para>
+
+ <programlisting>/usr/local/etc/rc.d/supermailer.sh start</programlisting>
+
+ <para>您也可以手工启动这个服务。如果想要停止它,
+ 系统脚本将使用 <literal>stop</literal> 选项,运行如下命令</para>
+
+ <programlisting>/usr/local/etc/rc.d/supermailer.sh stop</programlisting>
+
+ <para>您也可以手工停止正在系统运行的服务。</para>
+
+ </sect3>
+
+ <sect3>
+ <title>FreeBSD 4.5-STABLE 版本 2002/4/11 以后
+ (包括 4.6-RELEASE 及后续版本)</title>
+
+ <para>在 FreeBSD 较后来的版本,
+ 您可以使用上面的方法或者在 <filename>/etc/rc.conf</filename>
+ 文件做如下设置</para>
+
+ <programlisting>mta_start_script="filename"</programlisting>
+
+ <para><replaceable>filename</replaceable> 是您想要在引导时执行的
+ MTA 脚本文件的名字。</para>
+ </sect3>
+
+ </sect2>
+
+ <sect2>
+ <title>替换系统默认的邮寄程序 <application>sendmail</application></title>
+
+ <para>因为 <application>sendmail</application> 程序是一个在
+ &unix; 系统下普遍存在的一个标准的软件,一些软件就假定它已经被安装并且配置好。
+ 基于这个原因,许多其它的 MTA 提供者都提供了兼容
+ <application>sendmail</application> 的命令行界面来执行。
+ 这使它们象<quote>混入</quote><application>sendmail</application>
+ 一样变的很容易掌握。</para>
+
+ <para>因此,如果您使用其它的邮寄程序,
+ 您必须确定这个软件是去尝试运行标准的
+ <application>sendmail</application> 二进制,就象
+ <filename>/usr/bin/sendmail</filename>,还是运行您自己选择的替换邮寄程序。
+ 幸运的是,FreeBSD 提供了一个系统调用
+ &man.mailwrapper.8;,它能为您做这件工作。</para>
+
+ <para>当 <application>sendmail</application> 安装后被运行,您可以在
+ <filename>/etc/mail/mailer.conf</filename> 中找到如下行:</para>
+
+<programlisting>sendmail /usr/libexec/sendmail/sendmail
+send-mail /usr/libexec/sendmail/sendmail
+mailq /usr/libexec/sendmail/sendmail
+newaliases /usr/libexec/sendmail/sendmail
+hoststat /usr/libexec/sendmail/sendmail
+purgestat /usr/libexec/sendmail/sendmail</programlisting>
+
+ <para>这个的意思就是当这些公共命令
+ (例如 <filename>sendmail</filename> 它本身) 运行时,
+ 系统实际上调用了一个 <filename>sendmail</filename> 指定的
+ mailwrapper 的副本,它检查 <filename>mailer.conf</filename>
+ 并且运行 <filename>/usr/libexec/sendmail/sendmail</filename>
+ 做为替代。当默认的 <filename>sendmail</filename> 功能被调用,
+ 系统将很容易的改变实际上运行的二进制文件。</para>
+
+ <para>因此如果您想要
+ <filename>/usr/local/supermailer/bin/sendmail-compat</filename>
+ 替换 <application>sendmail</application> 被运行,您应该改变
+ <filename>/etc/mail/mailer.conf</filename> 文件为:</para>
+
+<programlisting>sendmail /usr/local/supermailer/bin/sendmail-compat
+send-mail /usr/local/supermailer/bin/sendmail-compat
+mailq /usr/local/supermailer/bin/mailq-compat
+newaliases /usr/local/supermailer/bin/newaliases-compat
+hoststat /usr/local/supermailer/bin/hoststat-compat
+purgestat /usr/local/supermailer/bin/purgestat-compat</programlisting>
+
+ </sect2>
+
+ <sect2>
+ <title>最后</title>
+
+ <para>一旦做完您想要配置的每件事,您应该杀掉
+ <application>sendmail</application> 进程并且启动属于您的新软件的进程,
+ 或者简单的重启。重启也将给您机会保证您正确的配置您的系统,
+ 在引导的时候自动的运行您新的 MTA。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="mail-trouble">
+ <title>疑难解答</title>
+ <indexterm>
+ <primary>邮件</primary>
+ <secondary>疑难解答</secondary>
+ </indexterm>
+
+ <qandaset>
+ <qandaentry>
+ <question>
+ <para>为什么必须在我的站点的主机上使用 FQDN?</para>
+ </question>
+
+ <answer>
+ <para>您可能会发现主机实际上是在另外一个域里面,
+ 例如,如果您是在
+ <hostid role="fqdn">foo.bar.edu</hostid> 里,而您要找一台叫
+ <hostid>mumble</hostid> 的主机,它在
+ <hostid role="domainname">bar.edu</hostid> 域里,您就必须用完整的域名
+ <hostid role="fqdn">mumble.bar.edu</hostid>,而不是用
+ <hostid>mumble</hostid>。</para>
+
+ <indexterm><primary>BIND</primary></indexterm>
+ <para>传统上,这在 BSD BIND resolvers 中是可行的。
+ 然而目前随 FreeBSD 附带的 <application>BIND</application>
+ 已不为同一域外提供缩写服务。所以,这个不完整的主机名
+ <hostid>mumble</hostid> 必须以 <hostid
+ role="fqdn">mumble.foo.bar.edu</hostid> 这种形式才能被找到,
+ 或者将在根域中搜索它。</para>
+
+ <para>这跟以前的处理是不同的,以前版本将会继续寻找
+ <hostid role="domainname">mumble.bar.edu</hostid> 和
+ <hostid role="domainname">mumble.edu</hostid>。
+ 如果您想要了解这种方式是否是好,或者它有什么安全方面的漏洞,
+ 请参阅 RFC 1535 文档。</para>
+
+ <para>如果您想要一个好的工作环境,您可以使用如下行:
+
+ <programlisting>search foo.bar.edu bar.edu</programlisting>
+
+ 替换先前旧的版本:
+
+ <programlisting>domain foo.bar.edu</programlisting>
+
+ 把这行放在您的 <filename>/etc/resolv.conf</filename>
+ 文件中。然而,请一定要确定这样的搜寻顺序不会造成 RFC 1535
+ 里提到的<quote>boundary between local and public administration</quote>
+ 问题。</para>
+ </answer>
+ </qandaentry>
+
+ <indexterm>
+ <primary>MX record</primary>
+ </indexterm>
+
+ <qandaentry>
+ <question>
+ <para><application>sendmail</application> 提示信息 <errorname>mail
+ loops back to myself</errorname></para>
+ </question>
+
+ <answer>
+ <para>下面是
+ <application>sendmail</application> FAQ 中的回答:</para>
+
+ <programlisting>我得到了如下的信息:
+
+553 MX list for domain.net points back to relay.domain.net
+554 &lt;user@domain.net&gt;... Local configuration error
+
+我如何解决这个问题?
+
+您已经通过 MX 记录指定把发送给特定的域 (例如,domain.net)
+的邮件被转寄到指定的主机 (在这个例子中,relay.domain.net),
+而这台机器并不认为它自己是 domain.net。请把 domain.net 添加到
+/etc/mail/local-host-names 文件中 [在 8.10 版之前是 /etc/sendmail.cw]
+(如果您使用 FEATURE(use_cw_file) 的话) 或者在 /etc/mail/sendmail.cf
+中添加<quote>Cw domain.net</quote>。</programlisting>
+
+ <para><application>sendmail</application> 的 FAQ 可以在
+ <ulink url="http://www.sendmail.org/faq/"></ulink> 找到,
+ 如果您想要对您的邮件做任何的<quote>调整</quote>,
+ 则推荐首先看一看它。</para>
+ </answer>
+ </qandaentry>
+
+ <indexterm><primary>PPP</primary></indexterm>
+ <qandaentry>
+ <question>
+ <para>我如何在一个拨号主机上运行一个邮件服务?</para>
+ </question>
+
+ <answer>
+ <para>您想要把局域网上的 FreeBSD 主机连接到互连网上,而这台
+ FreeBSD 主机将会成为这个局域网的邮件网关,
+ 这个拨号连接不必一直保持在连接状态。</para>
+
+ <indexterm><primary>UUCP</primary></indexterm>
+ <indexterm>
+ <primary>MX record</primary>
+ </indexterm>
+
+ <para>最少有两种方法可以满足您的要求。一种方法就是使用 UUCP。</para>
+
+ <para>另一种方法是找到一个专职的服务器来为您的域提供副 MX 主机服务。
+ 例如,如果您公司的域名是
+ <hostid role="domainname">example.com</hostid>,您的互连网服务提供者把
+ <hostid role="domainname">example.net</hostid> 作为您域的副 MX 服务:</para>
+
+ <programlisting>example.com. MX 10 example.com.
+ MX 20 example.net.</programlisting>
+
+ <para>只有一台主机被指定当做您的最终收信主机
+ (在 <hostid role="domainname">example.com</hostid> 主机的
+ <filename>/etc/mail/sendmail.cf</filename> 文件中添加
+ <literal>Cw example.com</literal>)。</para>
+
+ <para>当 <command>sendmail</command> 试图分发邮件的时候,
+ 它会尝试通过 modem 连接到您 (<hostid role="domainname">example.com</hostid>)。
+ 因为您并不在线,所以总是会得到一个超时的错误。
+ <application>sendmail</application> 将会把邮件发送到副
+ MX 主机,也就是说,您的互连网服务提供者
+ (<hostid role="domainname">example.net</hostid>)。副
+ MX 主机将周期性的尝试连接并发送邮件到您的主机
+ (<hostid role="domainname">example.com</hostid>)。</para>
+
+ <para>您也许想要使用下面的这个登录脚本:</para>
+
+ <programlisting>#!/bin/sh
+# Put me in /usr/local/bin/pppmyisp
+( sleep 60 ; /usr/sbin/sendmail -q ) &amp;
+/usr/sbin/ppp -direct pppmyisp</programlisting>
+
+ <para>如果您想要为一个用户建立一个分开登录的脚本,
+ 您可以使用 <command>sendmail -qRexample.com</command>
+ 替换上面的脚本。这样将使所有的邮件按照您的
+ <hostid role="domainname">example.com</hostid>
+ 队列立即被处理。</para>
+
+ <para>更深入的方法可以参考下面这段:</para>
+
+ <para>这段信息是从 &a.isp; 拿来的。</para>
+
+ <programlisting>&gt; 我们为用户提供副 MX 主机服务。用户每天都会上线好几次
+&gt; 并且自动把信件取回主 MX 主机
+&gt; (当有他们的邮件时我们并没有通知他们)。
+&gt; 我们的 mailqueue 程序每 30 分钟清一次邮件队列。那段时间他们
+&gt; 就必须上线 30 分钟以确保他们的信件送达他们的主 MX 主机。
+&gt;
+&gt; 有任何指令可以用 sendmail 寄出所有邮件么?
+&gt; 普通用户在我们的机器上当然没有 root 权限。
+
+在 sendmail.cf 的<quote>privacy flags</quote>部分,有这样的设定
+Opgoaway,restrictqrun
+
+移除 restrictqrun 可以让非 root 用户启动队列处理的程序。
+您可能也要重新安排您的 MX 设定。我们是用户的 MX 主机,
+而且我们还设定了这个:
+
+# If we are the best MX for a host, try directly instead of generating # local config error.
+OwTrue
+
+这样的话远程机器会直接把信送给您,而不会尝试连接您的用户的机器。
+然后您就可以把邮件发送到您的用户。这个设定只对
+<quote>主机</quote>有效,所以您必须要让您的用户在 DNS 中把他们的邮件主机设置为
+<quote>customer.com</quote>或者
+<quote>hostname.customer.com</quote>。只要为<quote>customer.com</quote>在 DNS
+里添加一个 A 记录就可以了。</programlisting>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question>
+ <para>为什么当我发送邮件到其它主机总是有 <errorname>Relaying
+ Denied</errorname> 出错信息?</para>
+ </question>
+
+ <answer>
+ <para>默认的 FreeBSD 安装中,
+ <application>sendmail</application> 会配置为只发送来自它所在主机上的邮件。
+ 例如,如果有可用的 <acronym>POP</acronym> 服务器,则用户将可以从学校、
+ 公司或其他什么别的地方检查邮件,但他们仍然无法从远程直接发送邮件。
+ 通常,在几次尝试之后,
+ <application>MAILER-DAEMON</application> 将发出一封包含
+ <errorname>5.7 Relaying Denied</errorname> 错误信息的邮件。</para>
+
+ <para>有很多方法可以避免这种现象。
+ 最直截了当的方法是把您的 ISP 的地址放到
+ <filename>/etc/mail/relay-domains</filename> 文件中。
+ 完成这项工作的简单的方法是:</para>
+
+ <screen>&prompt.root; <userinput>echo "your.isp.example.com" &gt; /etc/mail/relay-domains</userinput></screen>
+
+ <para>建立或编辑这个文件以后您必须重新启动
+ <application>sendmail</application>。
+ 如果您是一个管理员并且不希望在本地发送邮件,
+ 或者想要在其它的机器甚至其它的 ISP 上使用一个客户端系统,
+ 这个方法是很方便的。如果您仅有一到两个邮件帐户它也非常的有用。
+ 如果有大量的地址需要添加,
+ 您可以很简单的使用您喜欢的文本编辑器打开这个文件添加域名,
+ 每行一个:</para>
+
+ <programlisting>your.isp.example.com
+other.isp.example.net
+users-isp.example.org
+www.example.org</programlisting>
+
+ <para>现在邮件可以通过您的系统传送,
+ 这个列表中存在的主机 (前提是用户在您的系统上已经有一个帐户)
+ 将可以成功的发送。这是一个允许正常的远程用户从您的系统发送邮件,
+ 并且阻止其它非法用户通过您系统发送垃圾邮件的好方法。</para>
+
+ </answer>
+ </qandaentry>
+ </qandaset>
+ </sect1>
+
+ <sect1 id="mail-advanced">
+ <title>高级主题</title>
+
+ <para>下面这节将介绍邮件配置和为整个域安装邮件。</para>
+
+ <sect2 id="mail-config">
+ <title>基本配置</title>
+ <indexterm>
+ <primary>邮件</primary>
+ <secondary>配置</secondary>
+ </indexterm>
+
+ <para>在邮箱外,只要您设置 <filename>/etc/resolv.conf</filename>
+ 或者运行您自己的名字服务器,您就可以发送邮件到外部的主机。
+ 如果您想要您的邮件发送给某个特定的 MTA(例如,
+ <application>sendmail</application>) 在您的 FreeBSD
+ 主机上,有两个方法:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>运行您自己的域名服务器和您自己的域。例如,
+ <hostid role="domainname">FreeBSD.org</hostid></para>
+ </listitem>
+
+ <listitem>
+ <para>获得直接分发给您主机的邮件。您可以直接使用您当前的
+ DNS 名称。例如,<hostid
+ role="fqdn">example.FreeBSD.org</hostid>。</para>
+ </listitem>
+ </itemizedlist>
+
+ <indexterm><primary>SMTP</primary></indexterm>
+ <para>不管您选择上面那种方法,为了直接在您的主机上发送邮件,
+ 必须有一个静态的 IP 地址(不是象 PPP 拨号一样的动态地址)。
+ 如果您在防火墙后面,它必须让 SMTP 协议通过。
+ 如果您想要在您的主机上直接的收取邮件,
+ 您必须确定两件事:</para>
+
+ <itemizedlist>
+ <indexterm><primary>MX 记录</primary></indexterm>
+ <listitem>
+ <para>确定在您 DNS 中的 MX 记录(最小编号的)指向您的 IP 地址。</para>
+ </listitem>
+
+ <listitem>
+ <para>确定在您 DNS 中的 MX 记录没有禁止您的主机。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>上面的每条记录都允许您在您的主机直接接收邮件。</para>
+
+ <para>试试这个:</para>
+
+ <screen>&prompt.root; <userinput>hostname</userinput>
+example.FreeBSD.org
+&prompt.root; <userinput>host example.FreeBSD.org</userinput>
+example.FreeBSD.org has address 204.216.27.XX</screen>
+
+ <para>如果您看到这些,直接使用
+ <email>yourlogin@example.FreeBSD.org</email> 应该没有问题
+ (假定 <application>sendmail</application> 已经
+ 正确的运行在 <hostid role="fqdn">example.FreeBSD.org</hostid>)。</para>
+
+ <para>如果您看到这些:</para>
+
+ <screen>&prompt.root; <userinput>host example.FreeBSD.org</userinput>
+example.FreeBSD.org has address 204.216.27.XX
+example.FreeBSD.org mail is handled (pri=10) by hub.FreeBSD.org</screen>
+
+ <para>所有发送到主机 (<hostid
+ role="fqdn">example.FreeBSD.org</hostid>) 的邮件在相同的用户名下将会被
+ <hostid>hub</hostid> 终止的收集,而不是直接发送到您的主机。</para>
+
+ <para>上面的信息是通过您的 DNS 服务器来处理的。支持邮件路由信息的 DNS
+ 记录是 <emphasis>邮件</emphasis> <emphasis>交换</emphasis> 记录。如果
+ MX 记录不存在,邮件将通过它自己的 IP 地址被直接的发送到主机。</para>
+
+ <para><hostid
+ role="fqdn">freefall.FreeBSD.org</hostid>的MX记录如下所示:</para>
+
+ <programlisting>freefall MX 30 mail.crl.net
+freefall MX 40 agora.rdrop.com
+freefall MX 10 freefall.FreeBSD.org
+freefall MX 20 who.cdrom.com</programlisting>
+
+ <para>正如您说看到的,<hostid>freefall</hostid> 有很多 MX 记录。
+ 最小编号的 MX 记录是直接接收邮件的主机。如果因为一些原因它不可用,其它
+ (有时会访问<quote>backup MXes</quote>)接收信息将会暂时接替并做临时的排列。</para>
+
+ <para>为了有效的使用交换式 MX 站点,应当从您的机器上分离一些
+ Internet 连接。您的 ISP 或者其它友好的站点可以没有任何问题的为您提供这个服务。</para>
+ </sect2>
+
+ <sect2 id="mail-domain">
+ <title>Mail for Your Domain</title>
+
+ <para>为了设置一个<quote>邮件主机</quote>(又称邮件服务器)
+ 您必须要把许多邮件发送到与它相连的几个工作站中。
+ 基本上,您想要<quote>要求</quote>在您域的每个主机的所有邮件
+ (在这个例子里是 <hostid role="fqdn">*.FreeBSD.org</hostid>)
+ 转向到您的邮件服务器,从而使您的用户可以在主邮件服务器里接收他们的邮件。</para>
+
+ <indexterm><primary>DNS</primary></indexterm>
+ <para>要使工作最简单,带有同样
+ <emphasis>用户名</emphasis> 的帐户应该同时存在于两台机器上。使用
+ &man.adduser.8; 来这样做。</para>
+
+ <para>您将使用的邮件主机必须为每个工作站指定一个邮件交换。您可以在
+ DNS 中这样配置:</para>
+
+ <programlisting>example.FreeBSD.org A 204.216.27.XX ; Workstation
+ MX 10 hub.FreeBSD.org ; Mailhost</programlisting>
+
+ <para>无论 A 记录指向哪,这将为工作站重新定位到邮件主机。邮件将被发送到 MX
+ 主机。</para>
+
+ <para>您不能自己这样做除非您运行着一个 DNS 服务器。
+ 如果不是这样,或者不能运行您自己的 DNS 服务器,告诉您的 ISP
+ 或者给您提供 DNS 服务的人。</para>
+
+ <para>如果您正在使用虚拟邮件主机,下面的信息将会对您有用。
+ 在这个例子里,我们假定您有一个客户并且他有自己的域,
+ 这个例子中是 <hostid role="domainname">customer1.org</hostid>,您要把
+ <hostid role="domainname">customer1.org</hostid>
+ 所有的邮件发送到您的邮件主机 <hostid role="fqdn">mail.myhost.com</hostid>。
+ 您的 DNS 记录应该是这样:</para>
+
+ <programlisting>customer1.org MX 10 mail.myhost.com</programlisting>
+
+ <para>您 <emphasis>不</emphasis> 需要有个 A 记录,
+ 如果您只为域 <hostid role="domainname">customer1.org</hostid>
+ 处理邮件。</para>
+
+ <note>
+ <para>必须清楚 <hostid role="domainname">customer1.org</hostid>
+ 将不能工作,除非存在一个 A 记录。</para>
+ </note>
+
+ <para>最后一件您必须要做的事是告诉
+ <application>sendmail</application> 接受邮件的是什么域和(或)主机名。
+ 这里有好几种方法。下面方法可以任选一种:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>添加您的主机到
+ <filename>/etc/mail/local-host-names</filename> 文件中,如果您使用的是
+ <literal>FEATURE(use_cw_file)</literal>。如果您使用
+ <application>sendmail</application> 8.10 或者更高版本,文件是
+ <filename>/etc/sendmail.cw</filename>。</para>
+ </listitem>
+
+ <listitem>
+ <para>添加一行 <literal>Cwyour.host.com</literal> 到您的
+ <filename>/etc/sendmail.cf</filename> 或
+ <filename>/etc/mail/sendmail.cf</filename> 文件,如果您使用
+ <application>sendmail</application> 8.10 或者更高版本。</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="SMTP-UUCP">
+ <title>SMTP 与 UUCP</title>
+
+ <para><application>sendmail</application> 的配置,在
+ FreeBSD 中已经配置好为您的站点直接的连接 Internet。
+ 如果站点希望他们的邮件通过 UUCP 交换,则必须安装其它的
+ <application>sendmail</application> 配置文件。</para>
+
+ <para>手工的配置 <filename>/etc/mail/sendmail.cf</filename>
+ 是一个高级主题。<application>sendmail</application> 8 版本通过
+ &man.m4.1; 预处理生成一个配置文件,实际上这个配置发生在一个比较高的抽象层。
+ &man.m4.1; 配置文件可以在 <filename>/usr/src/usr.sbin/sendmail/cf</filename>
+ 下找到。</para>
+
+ <para>如果您没有在系统上安装全部源码,则可以从单独的压缩文件中提取
+ sendmail 配置文件。假定您的 FreeBSD 源码 CDROM 已经被 mount:</para>
+
+ <screen>&prompt.root; <userinput>cd /cdrom/src</userinput>
+&prompt.root; <userinput>cat scontrib.?? | tar xzf - -C /usr/src/contrib/sendmail</userinput></screen>
+
+ <para>这个提取只有几百 K 字节。<filename>cf</filename>
+ 目录中的 <filename>README</filename> 文件能够为您提供一个到
+ &man.m4.1; 配置的基本的介绍。</para>
+
+ <para>最好的支持 UUCP 传送的方法是使用
+ <literal>mailertable</literal> 的特点。建立一个资料库让
+ <application>sendmail</application> 可以使用它自己的路由决策。</para>
+
+ <para>首先,您必须建立您自己的 <filename>.mc</filename> 文件。
+ <filename>/usr/src/usr.sbin/sendmail/cf/cf</filename> 目录包含一些例子。
+ 假定您已经命名自己的文件叫做 <filename>foo.mc</filename>,
+ 您要做的只是把它转换成一个有效的 <filename>sendmail.cf</filename>:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src/usr.sbin/sendmail/cf/cf</userinput>
+&prompt.root; <userinput>make foo.cf</userinput>
+&prompt.root; <userinput>cp foo.cf /etc/mail/sendmail.cf</userinput></screen>
+
+ <para>一个典型的 <filename>.mc</filename> 文件看起来可能象这样:</para>
+
+ <programlisting>VERSIONID(`<replaceable>Your version number</replaceable>') OSTYPE(bsd4.4)
+
+FEATURE(accept_unresolvable_domains)
+FEATURE(nocanonify)
+FEATURE(mailertable, `hash -o /etc/mail/mailertable')
+
+define(`UUCP_RELAY', <replaceable>your.uucp.relay</replaceable>)
+define(`UUCP_MAX_SIZE', 200000)
+define(`confDONT_PROBE_INTERFACES')
+
+MAILER(local)
+MAILER(smtp)
+MAILER(uucp)
+
+Cw <replaceable>your.alias.host.name</replaceable>
+Cw <replaceable>youruucpnodename.UUCP</replaceable></programlisting>
+
+ <para>
+ <literal>accept_unresolvable_domains</literal>、
+ <literal>nocanonify</literal> 和 <literal>confDONT_PROBE_INTERFACES</literal>
+ 特性将避免在传送邮件时使用DNS的机会。<literal>UUCP_RELAY</literal>
+ 项是支持 UUCP 传送所必须的。简单的放入一个 Internet 上可以处理
+ UUCP 虚拟域地址的主机名。通常,您在这里填入您 ISP 邮件的回复处。</para>
+
+ <para>一旦您做完这些,您还需要这个
+ <filename>/etc/mail/mailertable</filename> 文件。
+ 如果您只有一个用来传递所有邮件的对外通道的话,
+ 以下的文件就足够了:</para>
+
+ <programlisting>#
+# makemap hash /etc/mail/mailertable.db &lt; /etc/mail/mailertable
+. uucp-dom:<replaceable>your.uucp.relay</replaceable></programlisting>
+
+ <para>一个更复杂点的例子象这样:</para>
+
+ <programlisting>#
+# makemap hash /etc/mail/mailertable.db &lt; /etc/mail/mailertable
+#
+horus.interface-business.de uucp-dom:horus
+.interface-business.de uucp-dom:if-bus
+interface-business.de uucp-dom:if-bus
+.heep.sax.de smtp8:%1
+horus.UUCP uucp-dom:horus
+if-bus.UUCP uucp-dom:if-bus
+. uucp-dom:</programlisting>
+
+
+ <para>头三行处理域地址邮件,不应该被传送出默认的路由,
+ 而由某些 UUCP 邻居取代的特殊情况,这是为了走<quote>捷径</quote>。
+ 下一行处理本地网的邮件让它可以使用 SMTP 来传送。
+ 最后,UUCP 邻居提起。UUCP 虚拟域的记载,
+ 允许一个 <literal><replaceable>uucp-neighbor
+ </replaceable>!<replaceable>recipient</replaceable></literal>
+ 推翻默认规则。最后一行则以一个单独的句点最为结束,
+ 以 UUCP 传送到提供您所有的邮件网关的 UUCP 邻居。
+ 所有在 <literal>uucp-dom:</literal> 关键字里的节点名称必须是有效的
+ UUCP 邻居,您可以用 <literal>uuname</literal> 去确认。</para>
+
+ <para>提醒您这个文件在使用前必须被转换成 DBM 数据库文件。最好在
+ <filename>mailertable</filename> 最上面用注解写出命令行来完成这个工作。
+ 当您每次更换您的 <filename>mailertable</filename> 后您总是需要执行这个命令。</para>
+
+ <para>最后提示:如果您不确定某个特定的路径可用,
+ 记得把 <option>-bt</option> 选项加到
+ <application>sendmail</application>。这会将
+ <application>sendmail</application> 启动在
+ <emphasis>地址检测模式</emphasis>。只要按下
+ <literal>3,0</literal>,接着输入您希望测试的邮件路径位置。
+ 最后一行告诉您使用邮件代理程序,
+ 代理程序会通知目的主机以及 (可能转换) 地址。
+ 要离开此模式请按 <keycombo
+ action="simul"><keycap>Ctrl</keycap><keycap>D</keycap></keycombo>。</para>
+
+ <screen>&prompt.user; <userinput>sendmail -bt</userinput>
+ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
+Enter &lt;ruleset&gt; &lt;address&gt;
+<prompt>&gt;</prompt> <userinput>3,0 foo@example.com</userinput>
+canonify input: foo @ example . com
+...
+parse returns: $# uucp-dom $@ <replaceable>your.uucp.relay</replaceable> $: foo &lt; @ example . com . &gt;
+<prompt>&gt;</prompt> <userinput>^D</userinput></screen>
+ </sect1>
+
+ <sect1 id="outgoing-only">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Bill</firstname>
+ <surname>Moran</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>Setting Up to Send Only ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="SMTP-dialup">
+ <title>拨号连接时使用邮件传送</title>
+
+ <para>如果您有静态的 IP 地址, 就应该不用修改任何默认的配置。
+ 将主机名设置为分配给您的 Internet 名称,其他的事情
+ <application>sendmail</application> 都会替您做好。</para>
+
+ <para>如果您的 IP 地址是动态分配的, 并使用 PPP 连接拨入
+ Internet, 则您可能会从 ISP 的邮件服务器上得到一个信箱。
+ 这里我们假设您的 ISP 的域名是
+ <hostid role="domainname">example.net</hostid>, 您的用户名是
+ <username>user</username>, 您把自己的机器称作
+ <hostid role="fqdn">bsd.home</hostid>, 而您的 ISP 告诉您可以使用
+ <hostid role="fqdn">relay.example.net</hostid> 来转发邮件。</para>
+
+ <para>为了从邮箱收取邮件, 需要安装一个收信代理。
+ <application>fetchmail</application> 是一个能够支持许多种不同协议的不错的选择。
+ 这个程序可以通过 package 或 ports collection (<filename
+ role="package">mail/fetchmail</filename>) 来安装。
+ 通常, 您的 <acronym>ISP</acronym> 会提供 <acronym>POP</acronym>。
+ 如果您使用用户 <acronym>PPP</acronym>,您还可以在 Internet 连接建立时自动地抓取邮件,
+ 这可以通过在
+ <filename>/etc/ppp/ppp.linkup</filename> 中增加如下的项来实现:</para>
+
+ <programlisting>MYADDR:
+!bg su user -c fetchmail</programlisting>
+
+ <para>如果您正使用<application>sendmail</application> (如下所示)
+ 传送邮件到非本地帐户,这会强迫
+ <application>sendmail</application> 在连接网络后马上处理邮件进程队列,它在
+ <filename>/etc/ppp/ppp.linkup</filename> 文件执行
+ <command>fetchmail</command> 命令。</para>
+
+ <programlisting> !bg su user -c "sendmail -q"</programlisting>
+
+ <para>假设您有一个
+ <username>user</username> 帐户,在 <hostid
+ role="fqdn">bsd.home</hostid>机器上。在 <hostid role="fqdn">bsd.home</hostid>
+ 机器上的 <username>user</username> 目录里建立一个
+ <filename>.fetchmailrc</filename>文件:</para>
+
+ <programlisting>poll example.net protocol pop3 fetchall pass MySecret</programlisting>
+
+ <para>这个文件除了 <username>user</username> 外不应该被任何人读取,
+ 因为它包含了 <literal>MySecret</literal> 这个密码。</para>
+
+ <para>为了在发信时有正确的抬头
+ <literal>from:</literal>,您必须告诉
+ <application>sendmail</application> 使用
+ <literal>user@example.net</literal> 而非
+ <literal>user@bsd.home</literal>。您可能会希望告诉
+ <application>sendmail</application> 从 <hostid
+ role="fqdn">relay.example.net</hostid> 发送所有邮件,加快邮件的传送。</para>
+
+ <para>以下的 <filename>.mc</filename> 文件应该可以满足您的需求:</para>
+
+ <programlisting>VERSIONID(`bsd.home.mc version 1.0')
+OSTYPE(bsd4.4)dnl
+FEATURE(nouucp)dnl
+MAILER(local)dnl
+MAILER(smtp)dnl
+Cwlocalhost
+Cwbsd.home
+MASQUERADE_AS(`example.net')dnl
+FEATURE(allmasquerade)dnl
+FEATURE(masquerade_envelope)dnl
+FEATURE(nocanonify)dnl
+FEATURE(nodns)dnl
+define(`SMART_HOST', `relay.example.net')
+Dmbsd.home
+define(`confDOMAIN_NAME',`bsd.home')dnl
+define(`confDELIVERY_MODE',`deferred')dnl</programlisting>
+
+ <para>如何转换这个 <filename>.mc</filename> 文件到
+ <filename>sendmail.cf</filename> 文件的细节,请参考前面的章节。
+ 另外,在更新 <filename>sendmail.cf</filename> 文件后,
+ 不要忘记重启 <application>sendmail</application>。</para>
+ </sect1>
+
+ <sect1 id="SMTP-Auth">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>James</firstname>
+ <surname>Gorham</surname>
+ <contrib>作者:</contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>SMTP 验证</title>
+
+ <para>在您的邮件服务器上启用 <acronym>SMTP</acronym> 验证有很多好处。
+ <acronym>SMTP</acronym> 验证可以让
+ <application>sendmail</application> 多一重安全保障,
+ 而且也使得使用不同机器的漫游用户能够使用同一个邮件服务器,
+ 而不需要每次都修改它们的邮件客户端配置。</para>
+
+ <procedure>
+ <step>
+ <para>从 ports 中安装 <filename role="package">security/cyrus-sasl</filename>。
+ 您可以从 <filename role="package">security/cyrus-sasl</filename> 找到它。
+ <filename role="package">security/cyrus-sasl</filename> 有一系列编译时可选的选项,
+ 包括我们将要使用的验证方式等等。请务必选择
+ <option>pwcheck</option>。</para>
+ </step>
+
+ <step>
+ <para>安装完 <filename role="package">security/cyrus-sasl</filename> 之后,
+ 编辑 <filename>/usr/local/lib/sasl/Sendmail.conf</filename>
+ (如果不存在则建立) 并在其中增加:</para>
+
+ <programlisting>pwcheck_method: passwd</programlisting>
+
+ <para>这个方法将允许<application>sendmail</application>
+ 依照您的 FreeBSD <filename>passwd</filename> 数据库进行验证。
+ 这将为每个用户建立一个新用户名设置和口令使用
+ <acronym>SMTP</acronym> 验证减少麻烦,并且保证登录和邮件口令是相同的。</para>
+ </step>
+
+ <step>
+ <para>现在编辑 <filename>/etc/make.conf</filename> 文件,添加如下行:</para>
+
+ <programlisting>SENDMAIL_CFLAGS=-I/usr/local/include/sasl1 -DSASL
+SENDMAIL_LDFLAGS=-L/usr/local/lib
+SENDMAIL_LDADD=-lsasl</programlisting>
+
+ <para>这些行将给 <application>sendmail</application> 合适的配置选项,
+ 为在编译时间链接到 <filename role="package">cyrus-sasl</filename>。
+ 确定 <filename role="package">cyrus-sasl</filename>
+ 被安装之前重新编译 <application>sendmail</application>。</para>
+ </step>
+
+ <step>
+ <para>重新编译 <application>sendmail</application> 运行如下命令:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/src/usr.sbin/sendmail</userinput>
+&prompt.root; <userinput>make cleandir</userinput>
+&prompt.root; <userinput>make obj</userinput>
+&prompt.root; <userinput>make</userinput>
+&prompt.root; <userinput>make install</userinput></screen>
+
+ <para>如果 <filename>/usr/src</filename>
+ 和共享库没有大的变化并且它们都必须可用,<application>sendmail</application>
+ 编译应该没有任何问题。</para>
+ </step>
+
+ <step>
+ <para><application>sendmail</application> 被重新编译和安装后,
+ 编辑您的 <filename>/etc/mail/freebsd.mc</filename>
+ 文件 (或者无论您选择使用的您的哪个 <filename>.mc</filename>
+ 文件。许多管理员选择使用跟 &man.hostname.1; 一样的唯一的
+ <filename>.mc</filename> 文件输出)。添加这些行在这个文件:</para>
+
+ <programlisting>dnl set SASL options
+TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl
+define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl
+define(`confDEF_AUTH_INFO', `/etc/mail/auth-info')dnl</programlisting>
+
+ <para>这些选项配置有不同的方法,对于
+ <application>sendmail</application> 验证用户。
+ 如果您想要使用除
+ <application>pwcheck</application> 之外的方法,请参考相关文档。</para>
+ </step>
+
+ <step>
+ <para>最后,在 <filename>/etc/mail</filename> 运行 &man.make.1;。
+ 它将建立您的新 <filename>.mc</filename> 文件并建立一个
+ <filename>.cf</filename> 文件命名为 <filename>freebsd.cf</filename>
+ (或者您想使用您的其它名字的 <filename>.mc</filename>文件)。接着使用命令
+ <command>make install restart</command>,这将复制文件到
+ <filename>sendmail.cf</filename>,并且正确的重新启动
+ <application>sendmail</application>。
+ 更多有关这个过程的信息,您可以参考
+ <filename>/etc/mail/Makefile</filename> 文件。</para>
+ </step>
+ </procedure>
+
+ <para>如果所每个步骤都做对了,
+ 您应该可以通过您的邮件客户端进入您的登录信息并且传送一个测试信息。
+ 更多的分析,设置 <application>sendmail</application> 的
+ <option>LogLevel</option> 到 13 并且查看 <filename>/var/log/maillog</filename>
+ 中的信息。</para>
+
+ <para>您也许希望添加如下行到 <filename>/etc/rc.conf</filename> 文件,
+ 这将允许服务在重起之后自动运行:</para>
+
+ <programlisting>sasl_pwcheck_enable="YES"
+sasl_pwcheck_program="/usr/local/sbin/pwcheck"</programlisting>
+
+ <para>这将保证 <acronym>SMTP_AUTH</acronym> 初始化在系统启动时自动运行。</para>
+
+ <para>更多的信息,请参看 <application>sendmail</application>
+ 相关页<ulink url="http://www.sendmail.org/~ca/email/auth.html">
+ <acronym>SMTP</acronym> 验证</ulink>。</para>
+
+ </sect1>
+
+ <sect1 id="mail-agents">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Silver</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Mail User Agents ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>Mail User Agents ** 翻译进行中 **</primary>
+ </indexterm>
+
+ <para></para>
+
+ <sect2 id="mail-command">
+ <title>mail ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="mutt-command">
+ <title>mutt ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="pine-command">
+ <title>pine ** 翻译进行中 **</title>
+
+ <para></para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="mail-fetchmail">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Silver</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Using fetchmail ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>Using fetchmail</primary>
+ </indexterm>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="mail-procmail">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Silver</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Using procmail ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>Using procmail</primary>
+ </indexterm>
+
+ <para></para>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/mirrors/Makefile b/zh_CN.GB2312/books/handbook/mirrors/Makefile
new file mode 100644
index 0000000000..1b5b3cf271
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/mirrors/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision:
+# $FreeBSD$
+#
+
+CHAPTERS= mirrors/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
new file mode 100644
index 0000000000..05b3034231
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
@@ -0,0 +1,2701 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Chinese Documentation Project
+
+ Original revision: 1.356
+ $FreeBSD$
+-->
+
+<appendix id="mirrors">
+ <title>获取 FreeBSD</title>
+
+ <sect1 id="mirrors-cdrom">
+ <title>CDROM 和 DVD 发行商</title>
+
+ <sect2>
+ <title>零售盒装产品</title>
+
+ <para>可以从下面几个零售商那里买到 FreeBSD 的盒装产品(FreeBSD CD,
+ 附加软件,印刷文档):</para>
+
+ <itemizedlist>
+ <listitem>
+ <address>
+ <otheraddr>CompUSA</otheraddr>
+ WWW: <otheraddr><ulink url="http://www.compusa.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>Frys Electronics</otheraddr>
+ WWW: <otheraddr><ulink url="http://www.frys.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2>
+ <title>CD 和 DVD 光盘</title>
+
+ <para>FreeBSD CD 和 DVD 光盘可以从许多在线零售商那里买到:</para>
+
+ <itemizedlist>
+ <listitem>
+ <address>
+ <otheraddr>Daemon News Mall</otheraddr>
+ <street>560 South State Street, Suite A2</street>
+ <city>Orem</city>, <state>UT</state> <postcode>84058</postcode>
+ <country>USA</country>
+ Phone: <phone>+1 800 407-5170</phone>
+ Fax: <fax>+1 1 801 765-0877</fax>
+ Email: <email>sales@bsdmall.com</email>
+ WWW: <otheraddr><ulink url="http://www.bsdmall.com/freebsd1.html"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>FreeBSD Mall, Inc.</otheraddr>
+ <street>3623 Sanford Street</street>
+ <city>Concord</city>, <state>CA</state> <postcode>94520-1405</postcode>
+ <country>USA</country>
+ Phone: <phone>+1 925 674-0783</phone>
+ Fax: <fax>+1 925 674-0821</fax>
+ Email: <email>info@freebsdmall.com</email>
+ WWW: <otheraddr><ulink url="http://www.freebsdmall.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>FreeBSD Services Ltd</otheraddr>
+ <street>11 Lapwing Close</street>
+ <city>Bicester</city>
+ <postcode>OX26 6XR</postcode>
+ <country>United Kingdom</country>
+ WWW: <otheraddr><ulink url="http://www.freebsd-services.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>Hinner EDV</otheraddr>
+ <street>St. Augustinus-Str. 10</street>
+ <postcode>D-81825</postcode> <city>M&uuml;nchen</city>
+ <country>Germany</country>
+ Phone: <phone>(089) 428 419</phone>
+ WWW: <otheraddr><ulink url="http://www.hinner.de/linux/freebsd.html"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>Ikarios</otheraddr>
+ <street>22-24 rue Voltaire</street>
+ <postcode>92000</postcode> <city>Nanterre</city>
+ <country>France</country>
+ WWW: <otheraddr><ulink url="http://ikarios.com/form/#freebsd"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>Ingram Micro</otheraddr>
+ <street>1600 E. St. Andrew Place</street>
+ <city>Santa Ana</city>, <state>CA</state> <postcode>92705-4926</postcode>
+ <country>USA</country>
+ Phone: <phone>1 (800) 456-8000</phone>
+ WWW: <otheraddr><ulink url="http://www.ingrammicro.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>JMC Software</otheraddr>
+ <country>Ireland</country>
+ Phone: <phone>353 1 6291282</phone>
+ WWW: <otheraddr><ulink url="http://www.thelinuxmall.com"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>The Linux Emporium</otheraddr>
+ <street>Hilliard House, Lester Way</street>
+ <city>Wallingford</city>
+ <postcode>OX10 9TA</postcode>
+ <country>United Kingdom</country>
+ Phone: <phone>+44 1491 837010</phone>
+ Fax: <fax>+44 1491 837016</fax>
+ WWW: <otheraddr><ulink url="http://www.linuxemporium.co.uk/products/freebsd/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>Linux System Labs Australia</otheraddr>
+ <street>21 Ray Drive</street>
+ <city>Balwyn North</city>
+ <postcode>VIC - 3104</postcode>
+ <country>Australia</country>
+ Phone: <phone>+61 3 9857 5918</phone>
+ Fax: <fax>+61 3 9857 8974</fax>
+ WWW: <otheraddr><ulink url="http://www.lsl.com.au"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>LinuxCenter.Ru</otheraddr>
+ <street>Galernaya Street, 55</street>
+ <city>Saint-Petersburg</city>
+ <postcode>190000</postcode>
+ <country>Russia</country>
+ Phone: <phone>+7-812-3125208</phone>
+ Email: <email>info@linuxcenter.ru</email>
+ WWW: <otheraddr><ulink url="http://linuxcenter.ru/freebsd"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>UNIXDVD.COM LTD</otheraddr>
+ <street>57 Primrose Avenue</street>
+ <city>Sheffield</city>
+ <postcode>S5 6FS</postcode>
+ <country>United Kingdom</country>
+ WWW: <otheraddr><ulink url="http://www.unixdvd.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ </itemizedlist>
+ </sect2>
+
+ <sect2>
+ <title>发行人</title>
+
+ <para>如果您是销售商并且想销售 FreeBSD CDROM 产品,
+ 请和发行人联系:</para>
+
+ <itemizedlist>
+ <listitem>
+ <address>
+ <otheraddr>Cylogistics</otheraddr>
+ <street>2672 Bayshore Parkway, Suite 610</street>
+ <city>Mountain View</city>, <state>CA</state> <postcode>94043</postcode>
+ <country>USA</country>
+ Phone: <phone>+1 650 694-4949</phone>
+ Fax: <fax>+1 650 694-4953</fax>
+ Email: <email>sales@cylogistics.com</email>
+ WWW: <otheraddr><ulink url="http://www.cylogistics.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>FreeBSD Services Ltd</otheraddr>
+ <street>11 Lapwing Close</street>
+ <city>Bicester</city>
+ <postcode>OX26 6XR</postcode>
+ <country>United Kingdom</country>
+ WWW: <otheraddr><ulink url="http://www.freebsd-services.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>Kudzu, LLC</otheraddr>
+ <street>7375 Washington Ave. S.</street>
+ <city>Edina</city>, <state>MN</state> <postcode>55439</postcode>
+ <country>USA</country>
+ Phone: <phone>+1 952 947-0822</phone>
+ Fax: <fax>+1 952 947-0876</fax>
+ Email: <email>sales@kudzuenterprises.com</email>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>LinuxCenter.Ru</otheraddr>
+ <street>Galernaya Street, 55</street>
+ <city>Saint-Petersburg</city>
+ <postcode>190000</postcode>
+ <country>Russia</country>
+ Phone: <phone>+7-812-3125208</phone>
+ Email: <email>info@linuxcenter.ru</email>
+ WWW: <otheraddr><ulink url="http://linuxcenter.ru/freebsd"></ulink></otheraddr>
+ </address>
+ </listitem>
+
+ <listitem>
+ <address>
+ <otheraddr>Navarre Corp</otheraddr>
+ <street>7400 49th Ave South</street>
+ <city>New Hope</city>, <state>MN</state> <postcode>55428</postcode>
+ <country>USA</country>
+ Phone: <phone>+1 763 535-8333</phone>
+ Fax: <fax>+1 763 535-0341</fax>
+ WWW: <otheraddr><ulink url="http://www.navarre.com/"></ulink></otheraddr>
+ </address>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="mirrors-ftp">
+ <title>FTP 站点</title>
+
+ <para>官方的 FreeBSD 源代码可以从遍布全球的镜像站点
+ 通过匿名 FTP 下载。站点
+ <ulink url="ftp://ftp.FreeBSD.org/pub/FreeBSD/"></ulink> 有着良好的
+ 网络连接并且允许大量的并发连接,但是
+ 您或许更想找一个<quote>更近的</quote>
+ 镜像站点(甚至于决定去给镜像站点做一下排序)。</para>
+
+ <para><ulink
+ url="http://mirrorlist.FreeBSD.org/">FreeBSD 镜像
+ 站点数据库</ulink>要比使用手册中的镜像列表更加精确,
+ 因为它从 DNS 中获取信息而不依赖于静态的主机列表。</para>
+
+ <para>FreeBSD 可以从下面这些镜像站点通过匿名 FTP
+ 下载。如果您选择了通过匿名 FTP 获取 FreeBSD,
+ 请尽量使用离您比较近的站点。被列为
+ <quote>主镜像站点</quote>的镜像站点一般都有完整的 FreeBSD 存档(针对
+ 每种体系结构的所有当前可用的版本),
+ 您或许从您所在的国家或地区的站点下载会得到更快的下载速度。
+ 每个站点提供了最流行的体系结构的最近的版本而有可能不提供完整的
+ FreeBSD 存档。所有的站点都提供匿名 FTP
+ 访问而有些站点也提供其他的访问方式。对每个站点可用的访问方式
+ 在其主机名后有所说明。</para>
+
+ &chap.mirrors.ftp.inc;
+ </sect1>
+
+ <sect1 id="anoncvs">
+ <title>匿名 CVS</title>
+
+ <sect2>
+ <title><anchor id="anoncvs-intro">概述</title>
+
+ <para>匿名 CVS(或人们常说的
+ <emphasis>anoncvs</emphasis>)是由和 FreeBSD 附带的 CVS 实用工具提供的用于和远程的
+ CVS 代码库同步的一种特性。
+ 尤其是, 它允许 FreeBSD 用户不需要特殊的权限对任何一台 FreeBSD 项目的官方
+ anoncvs 服务器执行只读的 CVS 操作。
+ 要使用它,简单的设置 <envar>CVSROOT</envar>
+ 环境变量指向适当的 anoncvs 服务器,
+ 输入 <command>cvs login</command> 命令
+ 并提供广为人知的密码<quote>anoncvs</quote>,然后使用
+ &man.cvs.1; 命令像访问任何本地仓库一样来访问它。</para>
+
+ <note>
+ <para><command>cvs login</command> 命令把用来登录 CVS
+ 服务器的密码储存在您的 <envar>HOME</envar> 目录中一个叫
+ <filename>.cvspass</filename> 的文件里。
+ 如果这个文件不存在,
+ 第一次使用 <command>cvs
+ login</command> 的时候可能会出错。 请创建一个空的
+ <filename>.cvspass</filename> 文件,然后试试重新登录。</para>
+ </note>
+
+ <para>也可以这么说 <link
+ linkend="cvsup">CVSup</link> 和 <emphasis>anoncvs</emphasis>
+ 服务本质上提供了同样的功能,但是有各种各样
+ 不同的场合可以影响用户对同步方式的选择。简单来说,
+ <application>CVSup</application> 在网络资源利用方面
+ 更加有效,而且是到目前为止在两者之中技术上更成熟的
+ 除了成本方面。要使用
+ <application>CVSup</application>,在下载任何东西之前
+ 必须首先安装配置特定的客户端,
+ 而且只能用于下载相当大块的
+ <application>CVSup</application> 称作
+ <emphasis>collections</emphasis>。</para>
+
+ <para>相比之下,<application>anoncvs</application> 可以通过 CVS
+ 模块名来从单个文件里检出任何东西并赋给特定的程序
+ (比如 <command>ls</command> 或者 <command>grep</command>)。
+ 当然,<application>anoncvs</application> 也只适用于对
+ CVS 仓库的只读操作,所以如果您是想用和 FreeBSD 项目共享的仓库提供本地开发的话,
+ <application>CVSup</application> 几乎是您唯一的选择。</para>
+ </sect2>
+
+ <sect2>
+ <title><anchor id="anoncvs-usage">使用匿名 CVS</title>
+
+ <para>配置 &man.cvs.1; 使用匿名 CVS 仓库可以简单的设定
+ <envar>CVSROOT</envar> 环境变量指向 FreeBSD 项目的
+ <emphasis>anoncvs</emphasis> 服务器之一。到此书写作为止,
+ 下面的服务器都是可用的:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>奥地利</emphasis>:
+ :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs
+ (使用 <command>cvs login</command> 然后在提示输入口令时输入任意口令。)</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>法国</emphasis>:
+ :pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs
+ (pserver (口令是 <quote>anoncvs</quote>), ssh (没有口令))
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>德国</emphasis>:
+ :pserver:anoncvs@anoncvs.de.FreeBSD.org:/home/ncvs
+ (Use <command>cvs login</command> and enter the password
+ <quote>anoncvs</quote> when prompted.)</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>德国</emphasis>:
+ :pserver:anoncvs@anoncvs2.de.FreeBSD.org:/home/ncvs
+ (rsh, pserver, ssh, ssh/2022)
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>日本</emphasis>:
+ :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs
+ (Use <command>cvs login</command> and enter the password
+ <quote>anoncvs</quote> when prompted.)</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>瑞典</emphasis>:
+ freebsdanoncvs@anoncvs.se.FreeBSD.org:/home/ncvs
+ (仅 ssh - 无口令)</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>美国</emphasis>:
+ freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs
+ (仅 ssh - 无口令)</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>CVS 实际上允许<quote>检出</quote>
+ 曾经存在的(或者,某种情况下将会存在)的
+ FreeBSD 源代码的任意版本,您需要熟悉
+ &man.cvs.1; 的修订(<option>-r</option>)标签以及
+ 在 FreeBSD 项目仓库中的一些许可值。</para>
+
+ <para>有两种标签,修订标签和分支标签。
+ 修订标签特指一个特定的修订版本。含义始终是不变的。
+ 分支标签,另一方面,
+ 指代给定时间给定开发分支的最新修订,
+ 因为分支标签不涉及特定的修订版本,
+ 它明天所代表的含义就可能和今天的不同。</para>
+
+ <para><xref linkend="cvs-tags"> 包括了用户可能感兴趣的
+ 修订标签。 另外,这里面没有一个是对 ports collection 可用的因为
+ ports collection 没有多个修订版本。</para>
+
+ <para>当您指定一个分支标签,您通常会得到那个开发分支的文件的最新版本。
+ 如果您希望得到一些旧的版本,您可以用
+ <option>-D date</option> 标记制定一个日期。
+ 察看 &man.cvs.1; 手册页了解更多细节。</para>
+ </sect2>
+
+ <sect2>
+ <title>示例</title>
+
+ <para>在这之前强烈建议您通读 &man.cvs.1; 的手册页,
+ 这里有一些简单的例子来展示如何使用匿名
+ CVS:</para>
+
+ <example>
+ <title>从 -CURRENT 检出些东西(&man.ls.1;)
+ 然后再删除:</title>
+
+ <screen>&prompt.user; <userinput>setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs</userinput>
+&prompt.user; <userinput>cvs login</userinput>
+<emphasis>在提示符处,输入密码</emphasis> <quote>anoncvs</quote>.
+&prompt.user; <userinput>cvs co ls</userinput>
+&prompt.user; <userinput>cvs release -d ls</userinput>
+&prompt.user; <userinput>cvs logout</userinput>
+ </screen>
+ </example>
+
+ <example>
+ <title>检出 &man.ls.1; 在 3.X-STABLE 分支
+ 中的版本:</title>
+
+ <screen>&prompt.user; <userinput>setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs</userinput>
+&prompt.user; <userinput>cvs login</userinput>
+<emphasis>在提示符处,输入密码</emphasis> <quote>anoncvs</quote>.
+&prompt.user; <userinput>cvs co -rRELENG_3 ls</userinput>
+&prompt.user; <userinput>cvs release -d ls</userinput>
+&prompt.user; <userinput>cvs logout</userinput>
+ </screen>
+ </example>
+
+ <example>
+ <title>创建 &man.ls.1; 的变化列表(用标准的 diff)</title>
+
+ <screen>&prompt.user; <userinput>setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs</userinput>
+&prompt.user; <userinput>cvs login</userinput>
+<emphasis>在提示符处,输入密码</emphasis> <quote>anoncvs</quote>.
+&prompt.user; <userinput>cvs rdiff -u -rRELENG_3_0_0_RELEASE -rRELENG_3_4_0_RELEASE ls</userinput>
+&prompt.user; <userinput>cvs logout</userinput>
+ </screen>
+ </example>
+
+ <example>
+ <title>找出可以使用的其它的模块名:</title>
+
+ <screen>&prompt.user; <userinput>setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs</userinput>
+&prompt.user; <userinput>cvs login</userinput>
+<emphasis>在提示符处,输入密码</emphasis> <quote>anoncvs</quote>.
+&prompt.user; <userinput>cvs co modules</userinput>
+&prompt.user; <userinput>more modules/modules</userinput>
+&prompt.user; <userinput>cvs release -d modules</userinput>
+&prompt.user; <userinput>cvs logout</userinput>
+ </screen>
+ </example>
+ </sect2>
+
+ <sect2>
+ <title>其他资源</title>
+
+ <para>下面附加的资源可能对学习
+ CVS 有帮助:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink
+ url="http://www.csc.calpoly.edu/~dbutler/tutorials/winter96/cvs/">CVS 指南</ulink> 来自 Cal Poly。</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.cvshome.org/">CVS 主页</ulink>,
+ CVS 开发和支持论坛。</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.FreeBSD.org/cgi/cvsweb.cgi">CVSweb</ulink> 是
+ FreeBSD 项目的 CVS web 界面。</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+
+ <sect1 id="ctm">
+ <title>使用 CTM</title>
+
+ <para><application>CTM</application> 是保持远程目录树和中央服务器目录树同步的一种方法。
+ 它被开发用于 FreeBSD 的源代码树,虽然其他人随着时间推移会发现它可以用于其他目的。
+ 当前几乎没有,也或者只有很少的文档讲述创建 deltas 的步骤,
+ 所以如果您希望使用 <application>CTM</application> 去做其它事情,
+ 请联系 &a.ctm-users.name; 邮件列表了解更多信息。</para>
+
+ <sect2>
+ <title>为什么我该使用 <application>CTM</application>?</title>
+
+ <para><application>CTM</application> 会给您一份 FreeBSD
+ 源代码树的本地拷贝。代码树有很多的
+ <quote>flavors</quote> 可用。不管您是希望跟踪完整的 CVS 树还是只是一个分支,
+ <application>CTM</application> 都会给您提供信息。
+ 如果您是 FreeBSD 上的一个活跃的开发者,但是缺乏或者不存在 TCP/IP 连接,或者只是希望把变化自动发送给您,
+ <application>CTM</application> 就是适合您的。对于最积极的分支
+ 您将会每天获得三个以上的 deltas。
+ 然而,您应该考虑通过邮件来自动发送。
+ 升级的大小总是保证尽可能的小。
+ 通常小于 5K,也偶然(十分之一可能)会有 10-50K,也不时地有个大的 100K+ 甚至更大的。</para>
+
+ <para>您也需要让自己了解直接和开发代码而不是预发行版本打交道的各种警告。这种情况会很显著,
+ 如果您选择了 <quote>current</quote> 代码的话。强烈建议您阅读<link linkend="current">和
+ FreeBSD 保持同步</link>。</para>
+ </sect2>
+
+ <sect2>
+ <title>使用
+ <application>CTM</application> 我需要做什么?</title>
+
+ <para>您需要两样东西:<application>CTM</application>
+ 程序,还有初始的 deltas 来 feed it(达到
+ <quote>current</quote> 级别)。</para>
+
+ <para><application>CTM</application> 程序从版本 2.0 发布以来
+ 已经是 FreeBSD 的一部分了,如果您有一份源代码拷贝的话它位于
+ <filename>/usr/src/usr.sbin/ctm</filename>。</para>
+
+ <para>如果您再运行一个比 2.0 版本早的 FreeBSD 系统,
+ 可以直接从下面下载最新的 <application>CTM</application>
+ 源代码:</para>
+
+ <para><ulink url="http://www.FreeBSD.org/cgi/cvsweb.cgi/src/usr.sbin/ctm/"></ulink></para>
+
+ <para>您喂给 <application>CTM</application> 的 <quote>deltas</quote>
+ 可以有两种方式,FTP 或者 email。
+ 如果您有普通的访问 Internet 的 FTP 权限,
+ 那么下面的 FTP 站点支持访问
+ <application>CTM</application>:</para>
+
+ <para><ulink url="ftp://ftp.FreeBSD.org/pub/FreeBSD/CTM/"></ulink></para>
+
+ <para>或者看看这一小节<link
+ linkend="mirrors-ctm">镜像</link>。</para>
+
+ <para>FTP 访问相关的目录并取得
+ <filename>README</filename> 文件,从那里开始。</para>
+
+ <para>如果您希望通过 email 得到您的 deltas:</para>
+
+ <para>订阅一个
+ <application>CTM</application> 分发列表。
+ &a.ctm-cvs-cur.name; 支持完整的 CVS 树。
+ &a.ctm-src-cur.name; 支持最新的开发分支。
+ &a.ctm-src-4.name; 支持 4.X 发行分支,
+ 等等。。(如果您不知道如何订阅邮件列表,
+ 点击上面的列表名或者到
+ &a.mailman.lists.link; 点击您希望订阅的列表。
+ 列表页包含了所有必要的订阅指导。)</para>
+
+ <para>当您开始接收到您邮件中的 <application>CTM</application>
+ 升级时,您可以使用
+ <command>ctm_rmail</command> 程序来解压并应用它们。
+ 事实上如果您想要让进程以全自动的形式运行的话,您可以通过在
+ <filename>/etc/aliases</filename> 中设置直接使用 <command>ctm_rmail</command> 程序。
+ 查看 <command>ctm_rmail</command> 手册页了解更多细节。</para>
+
+ <note>
+ <para>不管您使用什么方法得到
+ <application>CTM</application> deltas,您都应该订阅
+ &a.ctm-announce.name; 邮件列表。
+ 以后会有单独的地方提交有关
+ <application>CTM</application> 系统的操作的公告。
+ 点击上面的邮件列表名并按照指示订阅邮件列表。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>第一次使用 <application>CTM</application></title>
+
+ <para>在您开始使用 <application>CTM</application>
+ delta 之前,您需要获得一个起始点。</para>
+
+ <para>首先您应该确定您已经有了什么。每个人都可以从一个<quote>空</quote>目录开始。
+ 您必须用一个初始的 <quote>空的</quote> delta 来开始您的
+ <application>CTM</application> 支持树。曾经为了您的便利这些
+ <quote>起始</quote> deltas 被有意的通过 CD 来发行,
+ 然而现在已经不这样做了。</para>
+
+ <para>因为代码树有数十兆字节,您应该更喜欢从手头上已经有的东西开始。如果您有一张
+ -RELEASE CD 光盘,您可以从里面拷贝或者解压缩一份初始代码出来。
+ 这会节省非常多的数据传输量。</para>
+
+ <para>您会发现这些<quote>初始的</quote> deltas 名字的数字后面都有个
+ <literal>X</literal> (比如 <filename>src-cur.3210XEmpty.gz</filename>)。
+ 后面加一个 <literal>X</literal> 的设计符合您的初始 <quote>seed</quote> 的由来。
+ <filename>Empty</filename> 是一个空目录。通常一个基本的从
+ <literal>Empty</literal> 开始的转换由
+ 100 个 deltas 构成。顺便说一下,他们都很大!70 到 80
+ 兆字节的 <command>gzip</command> 压缩的数据对于
+ <filename>XEmpty</filename> deltas 是很平常的。</para>
+
+ <para>一旦您已经选定了一个基本的 delta 开始,您就需要比这个数高的所有的 delta。</para>
+ </sect2>
+
+ <sect2>
+ <title>在您的日常生活中使用 <application>CTM</application></title>
+
+ <para>要应用 deltas,简单的键入:</para>
+
+ <screen>&prompt.root; <userinput>cd /where/ever/you/want/the/stuff</userinput>
+&prompt.root; <userinput>ctm -v -v /where/you/store/your/deltas/src-xxx.*</userinput></screen>
+
+ <para><application>CTM</application> 能够理解被
+ <command>gzip</command> 压缩的 deltas,所以您不需要先
+ <command>gunzip</command> 他们,这可以节省磁盘空间。</para>
+
+ <para>除非觉得整个过程非常可靠,
+ <application>CTM</application> 不会涉及到您的代码树的。您也可以使用
+ <option>-c</option> 标记来校验 delta,
+ 这样 <application>CTM</application> 就不会涉及代码树;
+ 它会只校验 delta 的完整性看看是否可以安全的用于您的当前代码树。</para>
+
+ <para><application>CTM</application> 还有其他的一些参数,
+ 查看手册页或者源代码了解更多信息。</para>
+
+ <para>这真的就是全部的事情了。每次得到一个新的
+ delta,就通过 <application>CTM</application> 运行它来保证您的代码是最新的。</para>
+
+ <para>如果这些 deltas 很难重新下载的话不要删除它们。
+ 有些东西坏掉的时候您会想到保留它们的。
+ 即使您只有软盘,也请考虑使用
+ <command>fdwrite</command> 来做一份拷贝。</para>
+ </sect2>
+
+ <sect2>
+ <title>维持您本地的变动</title>
+
+ <para>作为一名开发者喜欢实验,改动代码树中的文件。
+ <application>CTM</application>
+ 用一种受限的方式支持本地修改:再检查文件
+ <filename>foo</filename> 存在之前,首先查找
+ <filename>foo.ctm</filename>。如果这个文件存在,
+ <application>CTM</application> 会对它操作而不是
+ <filename>foo</filename>。</para>
+
+ <para>这种行为给我们提供了一种简单的方式来维持本地的改动:
+ 只要复制您计划修改的文件并用
+ <filename>.ctm</filename> 的后缀重新命名。
+ 然后就可以自由的修改代码了,<application>CTM</application> 会更新
+ <filename>.ctm</filename> 文件到最新版本。</para>
+ </sect2>
+
+ <sect2>
+ <title>其他有趣的 <application>CTM</application> 选项</title>
+
+ <sect3>
+ <title>正确的找出哪些将被更新</title>
+
+ <para>您可以确定变动列表,
+ <application>CTM</application> 可以做到,在您的代码库上使用
+ <application>CTM</application> 的
+ <option>-l</option> 选项。</para>
+
+ <para>这很有用如果您想要保存改动的日志,
+ pre- 或者 post- 用各种风格处理修改的文件的纪录,
+ 或者仅仅是想感受一下孩子般的疯狂。</para>
+ </sect3>
+
+ <sect3>
+ <title>在升级前制作备份</title>
+
+ <para>有时您可能想备份将要被 <application>CTM</application>
+ 升级所改动的所有文件。</para>
+
+ <para>指定 <option>-B backup-file</option> 选项会导致
+ <application>CTM</application> 备份将要被给定的 <application>CTM</application>
+ delta 改动的所有文件到 <filename>backup-file</filename>。</para>
+ </sect3>
+
+ <sect3>
+ <title>限定受升级影响的文件</title>
+
+ <para>有时您可能对限定一个给定的 <application>CTM</application>
+ 升级的范围感兴趣,也有可能想知道怎样从一列 deltas 中解压缩一部分文件。</para>
+
+ <para>您可以通过使用 <option>-e</option> 和 <option>-x</option>
+ 选项指定过滤规则表达式来控制 <application>CTM</application>
+ 即将对之操作的文件列表。</para>
+
+ <para>例如,要从您保存的<application>CTM</application> deltas
+ 集里解压缩出一个最新的 <filename>lib/libc/Makefile</filename>
+ 文件,运行这个命令:</para>
+
+ <screen>&prompt.root; <userinput>cd /where/ever/you/want/to/extract/it/</userinput>
+&prompt.root; <userinput>ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.*</userinput></screen>
+
+ <para>对于每一个在 <application>CTM</application>
+ delta 中指定的文件,<option>-e</option>
+ 和 <option>-x</option> 选项按照命令行给定的顺序应用。
+ 文件只有在所有的 <option>-e</option> 和
+ <option>-x</option> 被应用之后标记为合格之后
+ 才能被 <application>CTM</application> 操作。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title><application>CTM</application> 未来的计划</title>
+
+ <para>其中几项:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>在 <application>CTM</application> 中使用一些认证方式,
+ 这样来允许察觉冒充的 <application>CTM</application> 补丁。</para>
+ </listitem>
+
+ <listitem>
+ <para>整理 <application>CTM</application> 的选项,
+ 它们变得杂乱而违反直觉了。</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2>
+ <title>杂项</title>
+
+ <para>也有一系列的
+ <literal>ports</literal> collection 的 deltas,但是人们对它的兴致还没有那么高。</para>
+ </sect2>
+
+ <sect2 id="mirrors-ctm">
+ <title>CTM 镜像</title>
+
+ <para><link linkend="ctm">CTM</link>/FreeBSD 可以在下面的镜像站点通过匿名
+ FTP 下载。如果您选择通过匿名 FTP 获取 <application>CTM</application>,
+ 请试着使用一个离您较近的站点。</para>
+
+ <para>如果有问题,请联系 &a.ctm-users.name;
+ 邮件列表。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>加利福尼亚州,海湾地区,官方源代码</term>
+
+ <listitem>
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="ftp://ftp.FreeBSD.org/pub/FreeBSD/development/CTM/"></ulink></para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>南非,旧的 deltas 的备份服务器</term>
+
+ <listitem>
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="ftp://ftp.za.FreeBSD.org/pub/FreeBSD/CTM/"></ulink></para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>中国台湾</term>
+
+ <listitem>
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="ftp://ctm.tw.FreeBSD.org/pub/FreeBSD/development/CTM/"></ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="ftp://ctm2.tw.FreeBSD.org/pub/FreeBSD/development/CTM/"></ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="ftp://ctm3.tw.FreeBSD.org/pub/FreeBSD/development/CTM/"></ulink></para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>如果您在您附近找不到镜像或者镜像不完整,
+ 试着使用搜索引擎比如
+ <ulink url="http://www.alltheweb.com/">alltheweb</ulink>.</para>
+ </sect2></sect1>
+
+ <sect1 id="cvsup">
+ <title>使用 CVSup</title>
+
+ <sect2 id="cvsup-intro">
+ <title>概述</title>
+
+ <para><application>CVSup</application> 是一个用于从远程服务器主机上的主
+ CVS 仓库发布和升级源代码树的软件包。
+ FreeBSD 的源代码维护在加利福尼亚州一台主开发服务器的 CVS 仓库里。
+ 有了 <application>CVSup</application>,FreeBSD
+ 用户可以很容易的保持他们自己的源代码树更新。</para>
+
+ <para><application>CVSup</application> 使用所谓的升级
+ <emphasis>pull</emphasis> 模式。在 pull
+ 模式下,客户端在需要的时候向服务器端请求更新。
+ 服务器被动的等待客户端的升级请求。
+ 因此所有的升级都是客户端发起的。
+ 服务器决不会发送未请求的升级。用户必须手动运行
+ <application>CVSup</application> 客户端获取更新,
+ 或者设置一个 <command>cron</command> 作业来让它以固定的规律自动运行。</para>
+
+ <para>术语 <application>CVSup</application>用大写字母写正是表示,
+ 代表了完整的软件包。 它的主要组件是运行在每个用户机器上的客户端 <command>cvsup</command>,
+ 和运行在每个 FreeBSD 镜像站点上的服务器端 <command>cvsupd</command>。</para>
+
+ <para>当您阅读 FreeBSD 文档和邮件列表时,您可能会看见
+ <application>sup</application>。
+ <application>Sup</application> 是
+ <application>CVSup</application> 的前身,有着相似的目的。
+ <application>CVSup</application> 使用很多和 sup 相同的方式,
+ 而且, 它还是用使用和 <command>sup</command> 的兼容的配置文件。
+ <application>Sup</application> 已经不再被 FreeBSD 项目使用了,
+ 因为 <application>CVSup</application> 既快又有更好的灵活性。</para>
+ </sect2>
+
+ <sect2 id="cvsup-install">
+ <title>安装</title>
+
+ <para>安装 <application>CVSup</application> 最简单的方式就是使用
+ FreeBSD <link linkend="ports">packages collection</link>
+ 中预编译的 <filename role="package">net/cvsup</filename> 包。
+ 如果您想从源代码构建 <application>CVSup</application>,
+ 您可以使用 <filename role="package">net/cvsup</filename>
+ port。但是预先警告一下:
+ <filename role="package">net/cvsup</filename> port 依赖于 Modula-3
+ 系统,会花费相当的时间和磁盘空间来下载编译。</para>
+
+ <note>
+ <para>如果想在没有安装 <application>&xfree86;</application>
+ 或 <application>&xorg;</application> 的计算机, 例如服务器上使用
+ <application>CVSup</application>, 则只能使用不包含
+ <application>CVSup</application> <acronym>GUI</acronym>
+ 的 <filename role="package">net/cvsup-without-gui</filename>。</para>
+ </note>
+ </sect2>
+
+ <sect2 id="cvsup-config">
+ <title>CVSup 配置</title>
+
+ <para><application>CVSup</application> 的操作被一个叫做
+ <filename>supfile</filename> 的配置文件所控制。
+ 在目录 <ulink type="html"
+ url="file://localhost/usr/share/examples/cvsup/"><filename>/usr/share/examples/cvsup/</filename></ulink>
+ 下面有一些示例的 <filename>supfiles</filename>。</para>
+
+ <para><filename>supfile</filename> 中的信息解答了
+ <application>CVSup</application> 下面的几个问题:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><link linkend="cvsup-config-files">您想接收
+ 哪些文件?</link></para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="cvsup-config-vers">您想要它们的
+ 哪个版本?</link></para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="cvsup-config-where">您想从哪里
+ 获取它们?</link></para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="cvsup-config-dest">您想把它们
+ 放在您自己机器的什么地方?</link></para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="cvsup-config-status">您想把
+ 您的状态文件放在哪?</link></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在下面的章节里,我们通过依次回答这些问题来创建一个典型的
+ <filename>supfile</filename> 文件。首先,我们描述一下
+ <filename>supfile</filename> 的整体构成。</para>
+
+ <para><filename>supfile</filename> 是个文本文件。注释用
+ <literal>#</literal> 开头,至行尾有效。
+ 空行和只包含注释的行会被忽略。</para>
+
+ <para>每个保留行描述一批用户希望接收的文件。
+ 每行以 <quote>collection</quote>,
+ 由服务器端定义的合理的文件分组,的名字开头。
+ collection 的名字告诉服务器您想要的文件。
+ collection 名字结束或者有更多的字段,用空格分隔。
+ 这些字段回答了上面列出的问题。
+ 字段类型有两种:标记字段和值字段。
+ 标记字段由独立的关键字组成,比如,
+ <literal>delete</literal> 或者
+ <literal>compress</literal>。值字段也用关键字开头,
+ 关键字后面跟 <literal>=</literal> 和第二个词而没有空格。
+ 例如,<literal>release=cvs</literal> 是一个值字段。</para>
+
+ <para>一个典型的 <filename>supfile</filename> 往往接收多于一个的
+ collection。创建
+ <filename>supfile</filename> 的一种方式是明确的为每一个
+ collection 指定相关的字段。然而,这样使得
+ <filename>supfile</filename> 的行变得特别长,很不方便,
+ 因为 <filename>supfile</filename> 中的所有 collection 的大部分
+ 字段都是相同的。
+ <application>CVSup</application> 提供了一个默认机制来避免
+ 这些问题。用特定的伪 collection 名 <literal>*default</literal>
+ 开头的行可以被用来设置标记和值为 <filename>supfile</filename>
+ 中随后的 collection 中的默认值。
+ 默认值可以通过为这个 collection 自身指定不同的值来对单个的
+ collection 覆盖设置,
+ 也可以在 mid-supfile 中通过附加的
+ <literal>*default</literal> 行改变或扩充。</para>
+
+ <para>知道了这些,我们现在就可以开始创建一个
+ 用于接收和升级 <link
+ linkend="current">FreeBSD-CURRENT</link> 主源代码树的
+ <filename>supfile</filename> 文件了。</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><anchor id="cvsup-config-files">您想接收哪些文件?</para>
+
+ <para>通过 <application>CVSup</application> 可用的文件组织成叫做
+ <quote>collections</quote> 的名称组。
+ 这些可用的 collection 在 <link
+ linkend="cvsup-collec">随后的章节</link> 中描述。
+ 在这个例子里,
+ 我们希望接收 FreeBSD 系统的完整的主代码树。
+ 有一个单独的大的 collection
+ <literal>src-all</literal> 让我们完成这个。
+ 创建我们的
+ <filename>supfile</filename> 的第一步,
+ 我们简单的列出这些 collection,每个一行(在这个例子里,
+ 只有一行):</para>
+
+ <programlisting>src-all</programlisting>
+ </listitem>
+
+ <listitem>
+ <para><anchor id="cvsup-config-vers">您想要他们的
+ 哪个版本?</para>
+
+ <para>通过 <application>CVSup</application>,您实际上可以接收
+ 曾经存在的源代码的任何版本。
+ 这是有可能的,因为
+ <application>cvsupd</application> 服务器直接通过
+ CVS 仓库工作,那包含了所有的版本。您可以
+ 用 <literal>tag=</literal> 和 <option>date=</option> 值字段
+ 指定一个您想要的版本。</para>
+
+ <warning>
+ <para>仔细的正确指定任何 <literal>tag=</literal>
+ 字段。有一些 tag 只对特定的 collection 文件合法。
+ 如果您指定了一个不正确的或者
+ 拼写错误的 tag,<application>CVSup</application>
+ 会删除您可能不想删除的文件。
+ 特别地,对 <literal>ports-*</literal>
+ collection <emphasis>只</emphasis>使用
+ <literal>tag=.</literal>。</para>
+ </warning>
+
+ <para><literal>tag=</literal> 字段在仓库中表示为一个符号标签。
+ 有两种标签,修订标签和分支标签。
+ 修订标签代表一个特定的修订版本。
+ 它的含义是一成不变的。
+ 分支标签,另一方面,代表给定开发线上给定时间的最新修订。
+ 因为分支标签不代表一个特定的修订版本,
+ 它明天的含义就可能和今天的有所不同。</para>
+
+ <para><xref linkend="cvs-tags"> 包含了用户可能感兴趣的分支标签。
+ 当在 <application>CVSup</application> 的配置文件中指定标签的时候,必须用
+ <literal>tag=</literal> 开头
+ (<literal>RELENG_4</literal> 会变成
+ <literal>tag=RELENG_4</literal>)。
+ 记住只有 <literal>tag=.</literal> 是
+ ports collection 相适应的。</para>
+
+ <warning>
+ <para>注意像看到的那样正确的输入标签名。
+ <application>CVSup</application> 不能辨别合法和不合法标签。
+ 如果您拼写错了标签名,
+ <application>CVSup</application>
+ 会像您指定了一个没有任何文件的合法标签一样工作,
+ 那会删除您已经存在的代码。</para>
+ </warning>
+
+ <para>当您指定一个分支标签的时候,您通常会收到开发线上文件的最新版本。
+ 如果您希望接收一些过时的版本,您可以通过用
+ <option>date=</option> 值字段指定一个日期来做到。
+ &man.cvsup.1; 手册页解释了如何来做。</para>
+
+ <para>对于我们的示例来说,我们希望接收 FreeBSD-CURRENT。
+ 我们在我们的
+ <filename>supfile</filename> 的开头添加这行:</para>
+
+ <programlisting>*default tag=.</programlisting>
+
+ <para>有一个重要的特例,
+ 如果您既没指定 <literal>tag=</literal> 字段也没指定
+ <literal>date=</literal> 字段的情况。这种情况下,
+ 您会收到直接来自于服务器 CVS 仓库的真实的 RCS 文件,
+ 而不是某一特定版本。
+ 开发人员一般喜欢这种操作模式。
+ 通过在他们的系统上维护一份仓库自身的副本,
+ 他们可以浏览修订历史以及检查文件过去的版本。
+ 然而,这个好处是以大量的磁盘空间为代价的。</para>
+ </listitem>
+
+ <listitem>
+ <para><anchor id="cvsup-config-where">您想从哪里获取他们?</para>
+
+ <para>我们使用 <literal>host=</literal> 字段来告诉
+ <command>cvsup</command> 从哪里获取更新。
+ 任何一个 <link linkend="cvsup-mirrors">CVSup 镜像站点</link>都可以,
+ 虽然您应该选择一个离您比较近的站点。
+ 在这个例子里我们将使用一个虚拟的 FreeBSD 发布站点,
+ <hostid role="fqdn">cvsup99.FreeBSD.org</hostid>:</para>
+
+ <programlisting>*default host=cvsup99.FreeBSD.org</programlisting>
+
+ <para>您需要在运行 <application>CVSup</application>
+ 之前把这个改成一个实际存在的站点。
+ 在任何 <command>cvsup</command> 运行的特定时刻,
+ 您都可以在命令行上使用 <option>-h
+ <replaceable>hostname</replaceable></option> 选项来覆盖主机设置。</para>
+ </listitem>
+
+ <listitem>
+ <para><anchor id="cvsup-config-dest">您想把它们放在
+ 您自己机器的什么地方?</para>
+
+ <para><literal>prefix=</literal> 字段告诉
+ <command>cvsup</command> 把接收的文件放在哪里。
+ 在这个例子里,我们把源代码文件直接放进我们的主源代码树,
+ <filename>/usr/src</filename>。
+ <filename>src</filename> 目录已经隐含在我们选择接收的 collection 里了,
+ 所以正确的写法是:</para>
+
+ <programlisting>*default prefix=/usr</programlisting>
+ </listitem>
+
+ <listitem>
+ <para><anchor id="cvsup-config-status">
+ <command>cvsup</command> 在哪里维护它的状态文件?</para>
+
+ <para><application>CVSup</application> 客户端在被叫做 <quote>base</quote>
+ 的目录里维护了几个状态文件。 这些文件帮助
+ <application>CVSup</application> 更有效的工作,
+ 通过跟踪您已经接收到哪些更新的方式。
+ 我们将使用标准的 base 目录,
+ <filename>/var/db</filename>:</para>
+
+ <programlisting>*default base=/var/db</programlisting>
+
+ <para>这个设置如果没有在 <filename>supfile</filename>
+ 中指定的话就会被使用,
+ 所以实际上我们不需要上面这行。</para>
+
+ <para>如果您的 base 目录还不存在,现在最好创建它。
+ 如果 base 目录不存在,<command>cvsup</command>
+ 客户端会拒绝工作。</para>
+ </listitem>
+
+ <listitem>
+ <para>其他的 <filename>supfile</filename>
+ 设置:</para>
+
+ <para>在 <filename>supfile</filename>
+ 中有一些其他选项需要介绍一下:</para>
+
+ <programlisting>*default release=cvs delete use-rel-suffix compress</programlisting>
+
+ <para><literal>release=cvs</literal> 显示服务器应该从 FreeBSD 的主 CVS 仓库中获取信息。
+ 事实上总是这样的,但是也有可能会超出这个讨论的范围。</para>
+
+ <para><literal>delete</literal> 给
+ <application>CVSup</application> 权限删除文件。
+ 您应该总是指定这个,这样
+ <application>CVSup</application>
+ 可以保证您的源代码树完全更新。<application>CVSup</application>
+ 很小心的只删除那些不再依赖的文件。
+ 您拥有的任何额外的文件会被严格的保留。</para>
+
+ <para><literal>use-rel-suffix</literal> 是 ... 不可思议的。
+ 如果您真的想了解它,查看 &man.cvsup.1; 手册页。
+ 否则,就指定而不用担心这个。</para>
+
+ <para><literal>compress</literal> 启用 gzip 风格的信道压缩。
+ 如果您的网络连接是 T1 或者更快, 您可能不想使用压缩。
+ 否则,它非常有帮助。</para>
+ </listitem>
+
+ <listitem>
+ <para>把它们放在一起:</para>
+
+ <para>这是我们的示例的完整 <filename>supfile</filename>
+ 文件:</para>
+
+ <programlisting>*default tag=.
+*default host=cvsup99.FreeBSD.org
+*default prefix=/usr
+*default base=/var/db
+*default release=cvs delete use-rel-suffix compress
+
+src-all</programlisting>
+ </listitem>
+ </itemizedlist>
+ <sect3 id="cvsup-refuse-file">
+ <title><filename>refuse</filename> 文件</title>
+
+ <para>像上面提到的,<application>CVSup</application> 使用一种
+ <emphasis>pull 方法</emphasis>。基本上,这意味着您要连接到
+ <application>CVSup</application> 服务器,服务器说,
+ <quote>这有些您能下载的东西
+ ...</quote>,然后您的客户端反应<quote>好,我要这个,
+ 这个,这个,还有这个。</quote>在默认的配置中,
+ <application>CVSup</application> 客户端会取回您在配置文件中选定的
+ collection 和标签的每个文件。
+ 然而,并不总是您想要的,
+ 尤其是您在同步 <filename>doc</filename>,<filename>ports</filename>,或者
+ <filename>www</filename> 树 &mdash; 大部分人都不能阅读四种或者五种
+ 语言,因此他们不需要下载特定语言的文件。
+ 如果您在 <application>CVSup</application> ports collection,您
+ 可以通过单独指定每个 collection 来避免这个
+ (比如,<emphasis>ports-astrology</emphasis>,
+ <emphasis>ports-biology</emphasis>,等等取代简单的说明
+ <emphasis>ports-all</emphasis>)。然而,因为 <filename>doc</filename>
+ 和 <filename>www</filename> 树没有特定语言的 collection,您必须
+ 使用 <application>CVSup</application> 许多极好的特性之一:
+ <filename>refuse</filename> 文件。</para>
+
+ <para><filename>refuse</filename> 文件本质上是告诉
+ <application>CVSup</application> 它不应该从 collection
+ 中取得某些文件;换句话说,它告诉客户端
+ <emphasis>拒绝</emphasis> 来自服务器的特定的文件。
+ <filename>refuse</filename> 文件可以在
+ <filename><replaceable>base</replaceable>/sup/</filename>
+ 中找到(或者,如果您没有,应该创建一个)。
+ <replaceable>base</replaceable> 在您的 <filename>supfile</filename> 中定义;
+ 默认情况下,<replaceable>base</replaceable> 就是
+ <filename>/var/db</filename>,
+ 这意味着默认的 <filename>refuse</filename> 文件就是
+ <filename>/var/db/sup/refuse</filename>。</para>
+
+ <para><filename>refuse</filename> 文件的格式很简单;
+ 它仅仅包含您不希望下载的文件和目录名。
+ 例如,如果您除了英语和一些德语之外不会讲其他语言,
+ 而且感觉不需要使用德语应用程序(或者除了英语之外任何语言的应用程序),
+ 您可以把下面这些放在您的
+ <filename>refuse</filename> 文件里:</para>
+
+ <screen>ports/arabic
+ports/chinese
+ports/french
+ports/german
+ports/hebrew
+ports/hungarian
+ports/japanese
+ports/korean
+ports/polish
+ports/portuguese
+ports/russian
+ports/ukrainian
+ports/vietnamese
+doc/da_*
+doc/de_*
+doc/el_*
+doc/es_*
+doc/fr_*
+doc/it_*
+doc/ja_*
+doc/nl_*
+doc/no_*
+doc/pl_*
+doc/pt_*
+doc/ru_*
+doc/sr_*
+doc/zh_*</screen>
+
+ <para>等等其他语言(您可以通过浏览
+ <ulink
+ url="http://www.FreeBSD.org/cgi/cvsweb.cgi/">FreeBSD
+ CVS 仓库</ulink>找到完整的列表)。</para>
+
+ <para>有这个非常有用的特性,那些慢速连接或者要为他们的 Internet
+ 连接按时付费的用户就可以节省宝贵的时间因为他们不再需要
+ 下载那些从来不用的文件。要了解
+ <filename>refuse</filename> 文件的更多信息以及其它
+ <application>CVSup</application> 的优雅的特性,请浏览它的
+ 手册页。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>运行 <application>CVSup</application></title>
+
+ <para>您现在准备尝试升级了。命令很简单:</para>
+
+ <screen>&prompt.root; <userinput>cvsup <replaceable>supfile</replaceable></userinput></screen>
+
+ <para><filename><replaceable>supfile</replaceable></filename>
+ 的位置当然就是您刚刚创建的 <filename>supfile</filename> 文件名啦。
+ 如果您在 X11 下面运行,<command>cvsup</command>
+ 会显示一个有一些可以做平常事情的按钮的 GUI 窗口。
+ 按 <guibutton>go</guibutton> 按钮,然后看着它运行。</para>
+
+ <para>在这个例子里您将要升级您目前的
+ <filename>/usr/src</filename> 树,您将需要
+ 用 <username>root</username> 来运行程序,这样
+ <command>cvsup</command> 有需要的权限来更新您的文件。
+ 刚刚创建了您的配置文件,又从来没有使用过这个程序,
+ 紧张不安是可以理解的。有一个简单的方法不改变您当前的文件
+ 来做一次试验性的运行。只要在方便的地方创建一个
+ 空目录,并在命令行上作为一个额外的参数说明:</para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/tmp/dest</userinput>
+&prompt.root; <userinput>cvsup supfile /var/tmp/dest</userinput></screen>
+
+ <para>您指定的目录会作为所有文件更新的目的路径。
+ <application>CVSup</application> 会检查您在
+ <filename>/usr/src</filename> 中的文件,但是不会修改或
+ 删除。任何文件更新都会被放到
+ <filename>/var/tmp/dest/usr/src</filename> 里了。
+ 在这种方式下运行 <application>CVSup</application> 也会把它的 base
+ 目录状态文件保持原样。这些文件的新版本
+ 会被写到指定的目录。
+ 因为您有
+ <filename>/usr/src</filename> 目录的读权限,所以执行这种试验性的运行
+ 甚至不需要使用 <username>root</username> 用户。</para>
+
+ <para>如果您没有运行 X11 或者不喜欢 GUI,
+ 当您运行 <command>cvsup</command> 的时候需要在命令行添加
+ 两个选项:</para>
+
+ <screen>&prompt.root; <userinput>cvsup -g -L 2 <replaceable>supfile</replaceable></userinput></screen>
+
+ <para><option>-g</option> 告诉
+ <application>CVSup</application> 不要使用 GUI。如果您
+ 没在运行 X11 这个是自动的,否则您必须指定它。</para>
+
+ <para><option>-L 2</option> 告诉
+ <application>CVSup</application> 输出所有正在升级的文件的细节。
+ 有三个等级可以选择,从 <option>-L 0</option> 到
+ <option>-L 2</option>。默认是 0,意味着除了错误消息
+ 什么都不输出。</para>
+
+ <para>还有许多其它的选项可用。想要一个简短的列表,
+ 输入 <command>cvsup -H</command>。要查看更详细的描述,
+ 请查看手册页。</para>
+
+ <para>一旦您对升级工作的方式满意了,您就
+ 可以使用 &man.cron.8; 来安排规则的运行
+ <application>CVSup</application>。
+ 很显然的,您不应该让 <application>CVSup</application>
+ 通过 &man.cron.8; 运行的时候使用它的 GUI。</para>
+ </sect2>
+
+ <sect2 id="cvsup-collec">
+ <title><application>CVSup</application> 文件 collection</title>
+
+ <para><application>CVSup</application> 可用的文件 collection
+ 是分级组织的。
+ 有几个大的 collection,然后它们有分成更小的子
+ collection。接收一个大的 collection 等同于
+ 接收它的每一个子 collection。
+ collection 的等级关系在下面列表中通过缩进的使用
+ 反映出来。</para>
+
+ <para>最常用的 collection 是
+ <literal>src-all</literal>,和
+ <literal>ports-all</literal>。其它的 collection 只被有着特定
+ 目的的小部分人使用,
+ 有些站点可能不全部支持。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>cvs-all release=cvs</literal></term>
+
+ <listitem>
+ <para>FreeBSD 主 CVS 仓库,包含
+ 密码系统的代码。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>distrib release=cvs</literal></term>
+
+ <listitem>
+ <para>FreeBSD 发行版本和镜像相关的
+ 文件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>doc-all release=cvs</literal></term>
+ <listitem>
+ <para>FreeBSD 使用手册和其它文档的源代码。
+ 其中不包含 FreeBSD web 站点的文件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-all release=cvs</literal></term>
+
+ <listitem>
+ <para>FreeBSD Ports Collection。</para>
+
+ <important id="cvsup-collec-pbase-warn">
+ <para>如果您不想升级全部的
+ <literal>ports-all</literal>(整个 ports 树),
+ 而只是使用下面列出的一个子集,
+ 请确保您<emphasis>总是</emphasis>升级了
+ <literal>ports-base</literal> 子 collection!
+ 无论何时在 ports 构建下层构造有所改变的时候都会通过
+ <literal>ports-base</literal> 表现出来,事实上某些
+ 改变会很快的被<quote>实际的</quote>
+ ports 使用,因此,如果您只升级了
+ <quote>实际的</quote> ports 而他们使用了一些新的特性,
+ 就有极大的可能编译会因一些神秘的错误信息而失败。
+ 这种情况下<emphasis>非常快速的</emphasis>要做的事情
+ 就是确保您的
+ <literal>ports-base</literal> 子 collection 更新到
+ 最新。</para>
+ </important>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>ports-archivers
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>存档工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-astro
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>天文相关的 ports。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-audio
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>声音支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-base
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>Ports Collection 构建下部构造 -
+ 位于 <filename>/usr/ports</filename> 的
+ <filename>Mk/</filename> 和
+ <filename>Tools/</filename> 子目录的
+ 各种各样的文件。</para>
+
+ <note>
+ <para>请查看<link
+ linkend="cvsup-collec-pbase-warn">
+ 重要警告</link>:您应该
+ <emphasis>总是</emphasis>更新这个
+ 子 collection,无论您更新
+ FreeBSD Ports Collection 的任何部分的时候!</para>
+ </note>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-benchmarks
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>基准。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-biology
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>生物学。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-cad
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>计算机辅助设计工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-chinese
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>中文语言支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-comms
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>通信软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-converters
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>字符编码转换。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-databases
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>数据库</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-deskutils
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>计算机发明前常出现在桌面上的东西。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-devel
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>开发工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-dns
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>DNS 相关软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-editors
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>编辑器</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-emulators
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>其它操作系统的模拟器</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-finance
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>货币,金融相关应用程序。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-ftp
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>FTP 客户端和服务器端工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-games
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>游戏</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-german
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>德语支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-graphics
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>图形图像工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-hungarian
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>匈牙利语言支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-irc
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>Internet 多线交谈(IRC)工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-japanese
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>日语支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-java
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>&java; 工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-korean
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>韩国语言支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-lang
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>编程语言。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-mail
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>邮件软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-math
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>数值计算软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-mbone
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>MBone 应用程序。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-misc
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>杂样工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-multimedia
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>多媒体软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-net
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>网络软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-news
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>USENET 新闻软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-palm
+ release=cvs</literal></term>
+
+ <listitem>
+ <para><trademark class="trade">Palm</trademark>
+ 系列软件支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-polish
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>波兰语支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-portuguese
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>葡萄牙语支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-print
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>打印软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-russian
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>俄语支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-security
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>安全工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-shells
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>命令行 shell。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-sysutils
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>系统实用工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-textproc
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>文本处理工具(不
+ 包含桌面出版)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-vietnamese
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>越南语支持。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-www
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>万维网(WWW)相关软件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-x11
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>支持 X window 系统的 ports。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-x11-clocks
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>X11 时钟。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-x11-fm
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>X11 文件管理器。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-x11-fonts
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>X11 字体和字体工具。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-x11-toolkits
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>X11 工具包。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-x11-servers</literal></term>
+
+ <listitem>
+ <para>X11 服务器。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ports-x11-wm</literal></term>
+
+ <listitem>
+ <para>X11 窗口管理器。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-all release=cvs</literal></term>
+
+ <listitem>
+ <para>FreeBSD 主代码,包含密码系统的代码。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>src-base
+ release=cvs</literal></term>
+
+ <listitem>
+ <para><filename>/usr/src</filename>
+ 顶层的各式各样的文件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-bin
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>但用户模式下可能用到的用户工具
+ (<filename>/usr/src/bin</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-contrib
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>FreeBSD 项目之外的工具和库,通常在 FreeBSD 中不作修改
+ (<filename>/usr/src/contrib</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-crypto release=cvs</literal></term>
+
+ <listitem>
+ <para>FreeBSD 项目之外的
+ 密码系统工具和库,通常在 FreeBSD 中不作修改
+ (<filename>/usr/src/crypto</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-eBones release=cvs</literal></term>
+
+ <listitem>
+ <para>Kerberos 和 DES
+ (<filename>/usr/src/eBones</filename>)。
+ 没有在当前的 FreeBSD 发行中使用。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-etc
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>系统配置文件
+ (<filename>/usr/src/etc</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-games
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>游戏
+ (<filename>/usr/src/games</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-gnu
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>GNU 公共许可协议的工具
+ (<filename>/usr/src/gnu</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-include
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>头文件
+ (<filename>/usr/src/include</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-kerberos5
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>Kerberos5 安全包
+ (<filename>/usr/src/kerberos5</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-kerberosIV
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>KerberosIV 安全包
+ (<filename>/usr/src/kerberosIV</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-lib
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>库
+ (<filename>/usr/src/lib</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-libexec
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>通常被其它程序调用的系统程序
+ (<filename>/usr/src/libexec</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-release
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>生成 FreeBSD 版本必需的文件
+ (<filename>/usr/src/release</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-sbin release=cvs</literal></term>
+
+ <listitem>
+ <para>但用户模式的系统工具
+ (<filename>/usr/src/sbin</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-secure
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>密码相关库和命令
+ (<filename>/usr/src/secure</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-share
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>跨多个平台的共享的文件
+ (<filename>/usr/src/share</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-sys
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>内核
+ (<filename>/usr/src/sys</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-sys-crypto
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>内核密码系统代码
+ (<filename>/usr/src/sys/crypto</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-tools
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>维护 FreeBSD 的各种各样的工具
+ (<filename>/usr/src/tools</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-usrbin
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>用户工具
+ (<filename>/usr/src/usr.bin</filename>)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>src-usrsbin
+ release=cvs</literal></term>
+
+ <listitem>
+ <para>系统工具
+ (<filename>/usr/src/usr.sbin</filename>)。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>www release=cvs</literal></term>
+
+ <listitem>
+ <para>FreeBSD WWW 站点的源代码。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>distrib release=self</literal></term>
+
+ <listitem>
+ <para><application>CVSup</application> 服务器的
+ 配置文件。用于 <application>CVSup</application>
+ 镜像站点。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>gnats release=current</literal></term>
+
+ <listitem>
+ <para>GNATS bug 跟踪数据库。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>mail-archive release=current</literal></term>
+
+ <listitem>
+ <para>FreeBSD 邮件列表存档。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>www release=current</literal></term>
+
+ <listitem>
+ <para>预处理过的 FreeBSD WWW 站点文件(不是源文件)。
+ 用于 WWW 镜像站点。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2>
+ <title>更多信息</title>
+
+ <para><application>CVSup</application> FAQ 和关于
+ <application>CVSup</application> 的其它信息,请查看
+ <ulink url="http://www.polstra.com/projects/freeware/CVSup/">
+ CVSup 主页</ulink>。</para>
+
+ <para>大多数
+ <application>CVSup</application> 的和 FreeBSD 相关的讨论都在
+ &a.hackers;。软件的新版本在那发布,
+ 还有 &a.announce;。</para>
+
+ <para>问题和 bug 报告应该发给
+ 程序作者 <email>cvsup-bugs@polstra.com</email>。</para>
+ </sect2>
+
+ <sect2 id="cvsup-mirrors">
+ <title>CVSup 站点</title>
+
+ <para>FreeBSD 的 <link linkend="cvsup">CVSup</link> 服务器运行于
+ 下列站点:</para>
+
+ &chap.mirrors.cvsup.inc;
+ </sect2>
+ </sect1>
+
+ <sect1 id="cvs-tags">
+ <title>CVS 标签</title>
+
+ <para>当使用 <application>cvs</application> 或者
+ <application>CVSup</application>
+ 获取和升级源代码的时候,必须指定一个修订标签。
+ 修订标签代表 &os; 开发的一个特定分支,
+ 或者一个特定的时间点。第一种叫做
+ <quote>分支标签</quote>,第二种叫做
+ <quote>版本标签</quote>。</para>
+
+ <sect2>
+ <title>分支标签</title>
+
+ <para>所有这些,除了 <literal>HEAD</literal> (这个总是
+ 合法标签)以外,只适用于 <filename>src/</filename>
+ 树。<filename>ports/</filename>,<filename>doc/</filename>,和
+ <filename>www/</filename> 树没有分支。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>HEAD</term>
+
+ <listitem>
+ <para>主线的符号名,或者说 FreeBSD-CURRENT。
+ 当没有指定修订版本的时候也是默认的。</para>
+
+ <para>在 <application>CVSup</application> 里,这个标签通过
+ 一个 <literal>.</literal> 来反映出来(不是标点,而是一个
+ <literal>.</literal> 字符)。</para>
+
+ <note>
+ <para>在 CVS 里,当没有修订标签指定时这是默认的。
+ 在一台 STABLE 机器上检出或者升级到 CURRENT 源代码
+ 通常<emphasis>不是</emphasis>
+ 一个好主意,除非这是您的本意。</para>
+ </note>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5</term>
+
+ <listitem>
+ <para>FreeBSD-5.X 的开发分支, 在 FreeBSD-5.3 之后,
+ 它将成为 FreeBSD-STABLE。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5_2</term>
+
+ <listitem>
+ <para>针对 FreeBSD-5.2 和 FreeBSD-5.2.1 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5_1</term>
+
+ <listitem>
+ <para>针对 FreeBSD-5.1 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5_0</term>
+
+ <listitem>
+ <para>针对 FreeBSD-5.0 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4</term>
+
+ <listitem>
+ <para>FreeBSD-4.X 开发线,也被叫做
+ FreeBSD-STABLE。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_10</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.10 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_9</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.9 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_8</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.8 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_7</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.7 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_6</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.6 和 FreeBSD-4.6.2 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_5</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.5 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_4</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.4 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_3</term>
+
+ <listitem>
+ <para>针对 FreeBSD-4.3 的发行版本分支,只做
+ 安全咨询和其它紧急的修正。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_3</term>
+
+ <listitem>
+ <para>FreeBSD-3.X 的开发线,也被叫做
+ 3.X-STABLE。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.X 的开发线,也被叫做
+ 2.2-STABLE。这个分支过于陈旧了。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2>
+ <title>版本标签</title>
+
+ <para>当一个特定的 &os; 版本发行时,
+ 这些标签代表了一个指定的时间点。发布工程进程在
+ <ulink url="&url.base;/releng/">Release Engineering
+ Information</ulink> 和
+ <ulink url="&url.articles.releng;/release-proc.html">Release
+ Process</ulink> 文档中被详细描述。
+ <filename role="directory">src</filename> 树使用
+ 以 <literal>RELENG_</literal> 开头的标签。
+ <filename role="directory">ports</filename> 和
+ <filename role="directory">doc</filename> 树使用以
+ <literal>RELEASE</literal> 开头的标签。
+ 最后,<filename role="directory">www</filename> 树没有
+ 任何特定发行名称的标记。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>RELENG_4_10_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.10</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5_2_1_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 5.2.1</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5_2_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 5.2</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_9_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.9</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5_1_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 5.1</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_8_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.8</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_5_0_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 5.0</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_7_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.7</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_6_2_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.6.2</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_6_1_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.6.1</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_6_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.6</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_5_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.5</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_4_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.4</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_3_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.3</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_2_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.2</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_1_1_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.1.1</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_1_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.1</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_4_0_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD 4.0</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_3_5_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-3.5</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_3_4_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-3.4</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_3_3_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-3.3</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_3_2_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-3.2</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_3_1_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-3.1</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_3_0_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-3.0</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2_8_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.8</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2_7_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.7</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2_6_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.6</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2_5_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.5</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2_2_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.2</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2_1_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.1</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RELENG_2_2_0_RELEASE</term>
+
+ <listitem>
+ <para>FreeBSD-2.2.0</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="mirrors-afs">
+ <title>AFS 站点</title>
+
+ <para>FreeBSD 的 AFS 服务器运行于下面的站点:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>瑞典</term>
+
+ <listitem>
+ <para>文件的路径是:
+ <filename>/afs/stacken.kth.se/ftp/pub/FreeBSD/</filename></para>
+
+ <programlisting>stacken.kth.se # Stacken Computer Club, KTH, Sweden
+130.237.234.43 #hot.stacken.kth.se
+130.237.237.230 #fishburger.stacken.kth.se
+130.237.234.3 #milko.stacken.kth.se</programlisting>
+
+ <para>维护者 <email>ftp@stacken.kth.se</email></para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <sect1 id="mirrors-rsync">
+ <title>rsync 站点</title>
+
+ <para>下面的站点让 FreeBSD 可以通过 rsync 协议下载。
+ <application>rsync</application> 实用程序和
+ &man.rcp.1; 的工作方式很相像,
+ 但是有更多的选项,使用 rsync 远程更新协议只传输
+ 两份文件的不同之处,
+ 因此能够大幅度的提高网络同步速率。
+ 如果您是 FreeBSD FTP 服务器或者 CVS 仓库的镜像站点,
+ 这一点非常有用。
+ <application>rsync</application> 套件可以工作在许多种
+ 操作系统上,在 FreeBSD 上,查看
+ <filename role="package">net/rsync</filename>
+ port 或者使用 package。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>捷克共和国</term>
+
+ <listitem>
+ <para>rsync://ftp.cz.FreeBSD.org/</para>
+
+ <para>可用的 collection:</para>
+ <itemizedlist>
+ <listitem><para>ftp:FreeBSD FTP 服务器的
+ 部分镜像。</para></listitem>
+ <listitem><para>FreeBSD:FreeBSD FTP 服务器的
+ 完整镜像。</para></listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>德国</term>
+
+ <listitem>
+ <para>rsync://grappa.unix-ag.uni-kl.de/</para>
+
+ <para>可用的 collection:</para>
+ <itemizedlist>
+ <listitem><para>freebsd-cvs:完整的 FreeBSD
+ CVS 仓库。</para></listitem>
+ </itemizedlist>
+ <para>这台服务器也镜像 NetBSD 和 OpenBSD 项目,
+ 还有其他的一些项目的 CVS 仓库。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>荷兰</term>
+
+ <listitem>
+ <para>rsync://ftp.nl.FreeBSD.org/</para>
+
+ <para>可用的 collection:</para>
+ <itemizedlist>
+ <listitem><para>vol/3/freebsd-core: FreeBSD FTP 服务器
+ 的完整镜像。</para></listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>英国</term>
+
+ <listitem>
+ <para>rsync://rsync.mirror.ac.uk/</para>
+
+ <para>可用的 collection:</para>
+ <itemizedlist>
+ <listitem><para>ftp.FreeBSD.org: FreeBSD FTP 服务器
+ 的完整镜像。</para></listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>美国</term>
+
+ <listitem>
+ <para>rsync://ftp-master.FreeBSD.org/</para>
+
+ <para>服务器只供 FreeBSD 主镜像站点使用。</para>
+ <para>可用的 collection:</para>
+ <itemizedlist>
+ <listitem><para>FreeBSD:FreeBSD FTP 服务器的主要存档。</para></listitem>
+ <listitem><para>acl:FreeBSD 主 ACL
+ 列表。</para></listitem>
+ </itemizedlist>
+
+ <para>rsync://ftp13.FreeBSD.org/</para>
+
+ <para>可用的 collection:</para>
+ <itemizedlist>
+ <listitem><para>FreeBSD:FreeBSD FTP 服务器的完整
+ 镜像。</para></listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+</appendix>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../appendix.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "appendix")
+ End:
+-->
+
diff --git a/zh_CN.GB2312/books/handbook/multimedia/Makefile b/zh_CN.GB2312/books/handbook/multimedia/Makefile
new file mode 100644
index 0000000000..7a74dfaf9a
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/multimedia/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.2
+# $FreeBSD$
+#
+
+CHAPTERS= multimedia/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml
new file mode 100644
index 0000000000..c5a3202822
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml
@@ -0,0 +1,1578 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Documentation Project
+
+ Original Revision: 1.98
+ $FreeBSD$
+-->
+
+<chapter id="multimedia">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Ross</firstname>
+ <surname>Lippert</surname>
+ <contrib>编辑: </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>张</firstname>
+ <surname>雪平</surname>
+ <contrib>中文翻译: </contrib>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>多媒体</title>
+ <sect1 id="multimedia-synopsis">
+ <title>概述</title>
+
+ <para>FreeBSD 广泛地支持各种声卡,
+ 让您可以从容地享受来自您的计算机的高保真输出。
+ 这包括了录制和播放 MPEG Audio Layer
+ 3 (MP3)、 WAV、 以及 Ogg Vorbis 等许多种格式声音的能力。
+ FreeBSD 同时也包括了许多的应用程序,让您可以录音、
+ 增加声音效果以及控制附加的MIDI设备。</para>
+
+ <para>要是乐于动手, FreeBSD 也能支持播放一般的视频文件和
+ DVD。 对各种视频媒体进行编码、
+ 转换和播放的应用程序比起处理声音的应用程序略少一些。
+ 例如, 在撰写这章时,
+ FreeBSD Ports Collection 中还没有类似 <filename
+ role="package">audio/sox</filename>
+ 那样好的重编码工具能够用来在不同的格式之间转换。
+ 不过, 这个领域的软件研发进展是很快的。</para>
+
+ <para>本章将介绍配置声卡的必要步骤。 X11 的安装和配置
+ (<xref linkend="x11">) 里已经考虑到了您显卡的问题,
+ 但要想有更好的播放效果, 仍需要调整一些东西。</para>
+
+ <para>读了本章后,您将知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如何配置系统识别声卡。</para>
+ </listitem>
+
+ <listitem>
+ <para>运用样本程序去测试声卡工作的方法。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何排除声卡安装中的问题。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何播放和编码MP3以及其它格式的音频。</para>
+ </listitem>
+
+ <listitem>
+ <para>X 服务器如何支持视频。</para>
+ </listitem>
+
+ <listitem>
+ <para>哪些好的视频播放/压缩<quote>ports</quote>。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何播放DVD、 <filename>.mpg</filename> 和 <filename>.avi</filename> 文件。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何从CD和DVD中提取文件。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样配置电视卡。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何配置图像扫描仪。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在读本章这前,您应该:</para>
+
+ <itemizedlist>
+ <listitem><para>知道如何配置、安装一个新的内核 (<xref
+ linkend="kernelconfig">)</para></listitem>
+ </itemizedlist>
+
+ <warning>
+ <para>用&man.mount.8; 命令去装载CD光盘,至少会产生一个错误,
+ 更糟的情况下会产生 <emphasis>kernel panic</emphasis>。
+ 这种媒体所用的编码与通常的ISO文件系统是不同的。</para>
+ </warning>
+
+ </sect1>
+
+ <sect1 id="sound-setup">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Moses</firstname>
+ <surname>Moore</surname>
+ <contrib>贡献者 </contrib>
+ <!-- 20 November 2000 -->
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>Enhanced for &os;&nbsp;5.X by </contrib>
+ <!-- 13 September 2004 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>安装声卡</title>
+
+ <sect2 id="sound-device">
+ <title>配置系统</title>
+
+ <indexterm><primary>PCI</primary></indexterm>
+ <indexterm><primary>ISA</primary></indexterm>
+ <indexterm><primary>声卡</primary></indexterm>
+ <para>在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。
+ FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 <ulink
+ url="&rel.current.hardware;">Hardware Notes</ulink>
+ 中支持的音频设备列表看看是否支持您的声卡。
+ 这份文档也只论及支持您的声卡的驱动程序。</para>
+
+ <indexterm>
+ <primary>内核</primary>
+ <secondary>配置</secondary>
+ </indexterm>
+
+ <para>要使用声卡,您就应装载正确的驱动程序。完成的方式有两种:
+ 最简单的是使用命令 &man.kldload.8; 来装载一个内核模块,在命令行输入</para>
+
+ <screen>&prompt.root; <userinput>kldload snd_emu10k1</userinput></screen>
+
+ <para>或者在文件 <filename>/boot/loader.conf</filename> 里加入一行,内容如下</para>
+
+ <programlisting>snd_emu10k1_load="YES"</programlisting>
+
+ <para>上边实例用于 Creative &soundblaster; Live! 声卡。
+ 其它可装载的模块列在文件<filename>/boot/defaults/loader.conf</filename>里边。
+ 如果不知道应该使用哪个驱动, 您可以尝试加载
+ <filename>snd_driver</filename> module:</para>
+
+ <screen>&prompt.root; <userinput>kldload snd_driver</userinput></screen>
+
+ <para>这是个 meta 驱动,一次加载了最常见的设备驱动。
+ 这会提高搜索正确驱动的速度。也可以通过
+ <filename>/boot/loader.conf</filename> 工具来加载所有的声卡驱动。</para>
+
+ <note>
+ <para>在 &os;&nbsp;4.X 下,要加载所有的声卡驱动,您必须加载
+ <filename>snd</filename> 模块而不是
+ <filename>snd_driver</filename> 模块。</para>
+ </note>
+
+ <para>另外,您也可以把支持您声卡的代码静态地编译到内核里去。
+ 下面的部份就采用这种方式支持硬件给出提示。关于重新编译内核,请参考 <xref
+ linkend="kernelconfig">。</para>
+
+ <sect3>
+ <title>配置包含声音支持的定制内核</title>
+
+ <para>要做的第一件事情就是添加通用音频驱动 &man.sound.4;
+ 到内核中,您需要添加下面这行到内核配置文件中:</para>
+
+ <programlisting>device sound</programlisting>
+
+ <para>在 &os;&nbsp;4.X 下,使用下面这行:</para>
+
+ <programlisting>device pcm</programlisting>
+
+ <para>之后我们必须添加对我们的声卡的支持。
+ 因此,我们需要知道哪一个驱动支持我们的声卡。检查 <ulink
+ url="&rel.current.hardware;">Hardware Notes</ulink> 的支持的音频设备列表,
+ 确定您声卡的正确驱动。比如,一个 Creative &soundblaster; Live! 声卡由
+ &man.snd.emu10k1.4; 驱动来支持。要添加这个卡的支持,
+ 使用下面这行:</para>
+
+ <programlisting>device snd_emu10k1</programlisting>
+
+ <para>一定要阅读驱动的联机手册了解要使用的语法。
+ 关于内核配置文件中声卡驱动的语法的信息,也可以在
+ <filename>/usr/src/sys/conf/NOTES</filename> 文件
+ (对于 &os;&nbsp;4.X 是 <filename>/usr/src/sys/i386/conf/LINT</filename>)。</para>
+
+ <para>非-PnP ISA 卡可能要求您提供给内核声卡的设置信息(IRQ、I/O
+ 端口等等),可以通过
+ <filename>/boot/device.hints</filename> 文件来做。在系统启动时,
+ &man.loader.8; 会读取这个文件并把设定传给内核。比如,
+ 一个古老的 Creative &soundblaster; 16 ISA 非-PnP 卡使用
+ &man.snd.sbc.4; 驱动,添加下面这行道内核配置文件中:</para>
+
+ <programlisting>device sbc</programlisting>
+
+ <para>还有下面这些到
+ <filename>/boot/device.hints</filename>中:</para>
+
+ <programlisting>hint.sbc.0.at="isa"
+hint.sbc.0.port="0x220"
+hint.sbc.0.irq="5"
+hint.sbc.0.drq="1"
+hint.sbc.0.flags="0x15"</programlisting>
+
+ <para>这样,声卡使用 <literal>0x220</literal>
+ I/O 端口和 IRQ <literal>5</literal>。</para>
+
+ <para><filename>/boot/device.hints</filename>
+ 文件使用的语法在声卡驱动的联机手册中描述。
+ 在 &os;&nbsp;4.X 上,这些设定直接写进内核配置文件中。
+ 对于我们的 ISA 卡这种情况,我们只要使用这行:</para>
+
+ <programlisting>device sbc0 at isa? port 0x220 irq 5 drq 1 flags 0x15</programlisting>
+
+ <para>上面展示的设定是默认的。有时候,
+ 您可能需要更改 IRQ 或者其他的设定来匹配您的卡。
+ 查看 &man.snd.sbc.4; 联机手册了解更多信息。</para>
+
+ <note>
+ <para>在 &os;&nbsp;4.X 下,
+ 一些主板内建声卡设备的系统需要在内核配置文件中配置下面的选项:</para>
+
+ <programlisting>options PNPBIOS</programlisting>
+ </note>
+ </sect3>
+ </sect2>
+
+ <sect2 id="sound-testing">
+ <title>测试声卡</title>
+
+ <para>用修改过的内核重起,或者加载了需要的模块之后,
+ 声卡将会出现在您的系统消息缓存中
+ (&man.dmesg.8;),就像这样:</para>
+
+ <screen>pcm0: &lt;Intel ICH3 (82801CA)&gt; port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0
+pcm0: [GIANT-LOCKED]
+pcm0: &lt;Cirrus Logic CS4205 AC97 Codec&gt;</screen>
+
+ <para>声卡的状态可以通过
+ <filename>/dev/sndstat</filename> 文件来查询:</para>
+
+ <screen>&prompt.root; <userinput>cat /dev/sndstat</userinput>
+FreeBSD Audio Driver (newpcm)
+Installed devices:
+pcm0: &lt;Intel ICH3 (82801CA)&gt; at io 0xd800, 0xdc80 irq 5 bufsz 16384
+kld snd_ich (1p/2r/0v channels duplex default)</screen>
+
+ <para>您系统的输出可能与此不同。如果没有看到
+ <devicename>pcm</devicename> 设备,回顾并检查一下前面做的。
+ 重新检查您的内核配置文件并保证选择了正确的设备。
+ 常见问题列在<xref
+ linkend="troubleshooting">一节。</para>
+
+ <para>如果一切正常,您现在应该拥有一个多功能声卡了。
+ 如果您的 CD-ROM 或者 DVD-ROM 驱动器适当的与声卡相关联,
+ 您可以把 CD 放入驱动器并用 &man.cdcontrol.1; 来播放:</para>
+
+ <screen>&prompt.user; <userinput>cdcontrol -f /dev/acd0 play 1</userinput></screen>
+
+ <para>许多应用程序,比如 <filename
+ role="package">audio/workman</filename> 可以提供一个友好的界面。
+ 您可能想要安装一个应用程序比如
+ <filename role="package">audio/mpg123</filename> 来听
+ MP3 音频文件。一个快速的测试声卡正在发送数据到
+ <filename>/dev/dsp</filename> 的方式,像这样做:</para>
+
+ <screen>&prompt.user; <userinput>cat <replaceable>filename</replaceable> &gt; /dev/dsp</userinput></screen>
+
+ <para>这里 <replaceable>filename</replaceable> 可以是任意文件。
+ 这行命令会产生一些噪音,证明声卡果真在工作。</para>
+
+ <note>
+ <para>&os;&nbsp;4.X 用户需要创建声卡设备节点才能使用。
+ 如果在消息缓存中展示出来的卡是 <devicename>pcm0</devicename>,
+ 您必须以 <username>root</username> 来运行下面这两行:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>sh MAKEDEV snd0</userinput></screen>
+
+ <para>如果检测的声卡返回 <devicename>pcm1</devicename>,
+ 做上面展示的同样的步骤,只是要用
+ <devicename>snd1</devicename> 来取代
+ <devicename>snd0</devicename>。</para>
+
+ <para><command>MAKEDEV</command>
+ 会创建一组设备节点让相关联应用程序的不同声音使用。</para>
+ </note>
+
+ <para>声卡混音级别可以通过 &man.mixer.8; 命令更改。
+ 更多细节可以在 &man.mixer.8; 联机手册中找到。</para>
+
+ <sect3 id="troubleshooting">
+ <title>常见问题</title>
+
+ <indexterm><primary>设备节点</primary></indexterm>
+ <indexterm><primary>I/O 端口</primary></indexterm>
+ <indexterm><primary>IRQ</primary></indexterm>
+ <indexterm><primary>DSP</primary></indexterm>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>错误信息</entry>
+ <entry>解决方法</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><errorname>unsupported subdevice XX</errorname></entry>
+ <entry><para>一个或多个设备节点没有正确地建立。重复上面的步骤。</para></entry>
+ </row>
+
+ <row>
+ <entry><errorname>sb_dspwr(XX) timed out</errorname></entry>
+ <entry><para>I/O端口没有设置正确。</para></entry>
+ </row>
+
+ <row>
+ <entry><errorname>bad irq XX</errorname></entry>
+ <entry><para>IRQ设置不正确。确信设定的IRQ和声卡的IRQ是一样的。</para></entry>
+ </row>
+
+ <row>
+ <entry><errorname>xxx: gus pcm not attached, out of memory</errorname></entry>
+ <entry><para>没有足够的内存空间供设置使用。</para></entry>
+ </row>
+
+ <row>
+ <entry><errorname>xxx: can't open /dev/dsp!</errorname></entry>
+ <entry><para>使用命令 <command>fstat | grep dsp</command>
+ 进行检查是否有其它的程序打开了设备。 值得注意的是
+ <application>esound</application> 和
+ <application>KDE</application> 提供的声卡支持经常是造成麻烦的祸根。</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Munish</firstname>
+ <surname>Chopra</surname>
+ <contrib>贡献者</contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+ <title>利用多个声源</title>
+
+ <para>同时有多个声源的声音在播放, 这是完全可能的, 例如当
+ <application>esound</application> 或者 <application>artsd</application>
+ 不支持与其它程序共享音频设备时。</para>
+
+ <para>FreeBSD可以通过 <emphasis>虚拟声道(Virtual Sound
+ Channels)</emphasis> 来达到, 具体设置用工具 &man.sysctl.8; 来完成。
+ 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。</para>
+
+ <para>使用两条sysctl命令来设置虚拟声道的数目。 如果您是
+ <username>root</username> 用户, 执行下面的操作:</para>
+ <screen>&prompt.root; <userinput>sysctl hw.snd.pcm0.vchans=4</userinput>
+&prompt.root; <userinput>sysctl hw.snd.maxautovchans=4</userinput></screen>
+
+ <para>上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。<varname>hw.snd.pcm0.vchans</varname>
+ 是<devicename>pcm0</devicename>的虚拟声道数,一当链接上一个设备它就可配置了。
+ <literal>hw.snd.maxautovchans</literal>是分配给新的音频设备的虚拟声道数,
+ 此时这个设备要用 &man.kldload.8; 来链接。 因为 <devicename>pcm</devicename>
+ 模块可以独立装载许多硬件驱动程序, 因此 <varname>hw.snd.maxautovchans</varname>
+ 也就可以存储分配给以后链接到的设备的虚拟声道数。</para>
+
+ <para>如果不使用 &man.devfs.5;, 就必须把应用程序指向
+ <filename>/dev/dsp0</filename>.<replaceable>x</replaceable>,
+ 这里<replaceable>x</replaceable> 为0到3, 因为在上面的例子里
+ <varname>hw.snd.pcm.0.vchans</varname> 被设为了4。
+ 在使用&man.devfs.5;的系统里,上边那些会自动分配给用户。</para>
+ </sect2>
+
+ <sect2>
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Josef</firstname>
+ <surname>El-Rayes</surname>
+ <contrib>这一节的作者是 </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>如何设置混音器通道值</title>
+
+ <para>不同的混音通道的默认音量是硬编码进 &man.pcm.4; 驱动程序的。
+ 同时,也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。
+ 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。
+ 这可以通过在 <filename>/boot/device.hints</filename> 定义适当的值来实现。
+ 例如:</para>
+<programlisting>hint.pcm.0.vol="100"</programlisting>
+
+ <para>当 &man.pcm.4; 加载时,这一设置将改变音量通道原本是100的默认值。</para>
+
+ <note><para>只有 &os; 5.3 和更高版本才支持这一功能。</para></note>
+ </sect2>
+</sect1>
+
+ <sect1 id="sound-mp3">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>贡献者</contrib>
+ </author>
+ </authorgroup>
+ <!-- 11 Sept 2001 -->
+ </sect1info>
+
+ <title>MP3音频</title>
+
+ <para>MP3 (MPEG Layer 3 Audio)达到过CD音质的效果,FreeBSD工作站没理由会缺少这样的好东东。</para>
+
+ <sect2 id="mp3-players">
+ <title>MP3播放器</title>
+
+ <para>到目前为止,最为流行的 <application>&xfree86;</application> MP3
+ 播放器是<application>XMMS</application> (X 多媒体系统)。
+ <application>Winamp</application> 肤面可以应用到 <application>XMMS</application>上,
+ 因为它与 Nullsoft's <application>Winamp</application> 的 GUI (图形界面)
+ 几乎是相同的。 另外, <application>XMMS</application> 也支持插件功能</para>
+
+ <para><application>XMMS</application>可以从
+ <filename role="package">multimedia/xmms</filename> port 或 package
+ (<quote>包</quote>)里安装得到。</para>
+
+ <para><application>XMMS'</application> 的界面很直观,有播放列表、
+ 图表化的均衡器等等。 那些熟悉 <application>Winamp</application>
+ 的人会发现使用 <application>XMMS</application> 很简单。</para>
+
+ <para><filename role="package">audio/mpg123</filename> port
+ 是一个可选用的命令行 MP3 播放器。</para>
+
+ <para><application>mpg123</application> 可以在命令行指定音频设备和 MP3
+ 文件执行,如下所示:</para>
+
+ <screen>&prompt.root; <userinput>mpg123 -a <replaceable>/dev/dsp1.0</replaceable> Foobar-GreatestHits.mp3</userinput>
+High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3.
+Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp.
+Uses code from various people. See 'README' for more!
+THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
+
+
+
+
+
+Playing MPEG stream from Foobar-GreatestHits.mp3 ...
+MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
+</screen>
+
+ <para><literal>/dev/dsp1.0</literal> 应该换成您的系统上的
+ <devicename>dsp</devicename> 设备。</para>
+
+ </sect2>
+
+ <sect2 id="rip-cd">
+ <title>抓取CD音轨</title>
+
+ <para>在对CD或CD音轨编码成MP3之前, CD上的音频数据应先抓到硬盘里。
+ 这个可以通过复制原始的CDDA(CD数字音频)数据成为波形(WAV)文件。</para>
+
+ <para>工具 <command>cdda2wav</command> 是 <filename role="package">sysutils/cdrtools</filename>
+ 套件的一部份,可用来从CD中获取音频及其相关信息。</para>
+
+ <para>把CD放到光驱里,下面的命令可以完成 (作为 <username>root</username>用户)
+ 把整张 CD 分割成单个 (每个音轨) 的WAV文件:/para>
+
+ <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>0,1,0</replaceable> -B</userinput></screen>
+
+ <para><application>cdda2wav</application> 支持 ATAPI (IDE)光驱。
+ 从IDE光驱中抓取音轨, 需要用设备名称代替SCSI的单元号。 例如, 想从
+ IDE 光驱中抓取第7道音轨:</para>
+
+ <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>/dev/acd0a</replaceable> -t 7</userinput></screen>
+
+ <para>参数 <option>-D <replaceable>0,1,0</replaceable></option> 表示
+ SCSI 设备 <devicename>0,1,0</devicename>, 与命令
+ <command>cdrecord -scanbus</command>的输出相对应。</para>
+
+ <para>抓取单轨,要使用选项<option>-t</option>,如下所示:</para>
+
+ <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>0,1,0</replaceable> -t 7</userinput></screen>
+
+ <para>这个实例用于抓取第七个音轨。要抓取一定范围的音轨,如从1到7:</para>
+
+ <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>0,1,0</replaceable> -t 1+7</userinput></screen>
+
+ <para>利用&man.dd.1;也可以从ATAPI光驱中抓取音轨,从
+ <xref linkend="duplicating-audiocds">可以了解更多。</para>
+
+ </sect2>
+
+ <sect2 id="mp3-encoding">
+ <title>MP3 编码</title>
+
+ <para>现今,可选的MP3编码器是<application>lame</application>。
+ <application>Lame</application>可以从ports树里的
+ <filename role="package">audio/lame</filename> 处找到。</para>
+
+ <para>利用抓取的WAV文件,下边的命令就可以把 <filename>audio01.wav</filename>
+ 转换成<filename>audio01.mp3</filename>:</para>
+
+ <screen>&prompt.root; <userinput>lame -h -b <replaceable>128</replaceable> \
+--tt "<replaceable>Foo Song Title</replaceable>" \
+--ta "<replaceable>FooBar Artist</replaceable>" \
+--tl "<replaceable>FooBar Album</replaceable>" \
+--ty "<replaceable>2001</replaceable>" \
+--tc "<replaceable>Ripped and encoded by Foo</replaceable>" \
+--tg "<replaceable>Genre</replaceable>" \
+<replaceable>audio01.wav audio01.mp3</replaceable></userinput></screen>
+
+ <para>128&nbsp;kbits 是标准的MP3位率(bitrate)。
+ 许多人可能喜欢更高的品质例如 160 或 192。 更高的位率, 会使 MP3
+ 占用更多的磁盘空间--但音质会更高。选项 <option>-h</option> 控制
+ <quote>高品质但低速度 (higher quality
+ but a little slower)</quote> 模式的开关。 选项 <option>--t</option>
+ 表示把 ID3 标签--通常包含了歌曲的信息, 植入到MP3文件里。
+ 其它的编码选项可以查询 lame 的联机手册。</para>
+ </sect2>
+
+ <sect2 id="mp3-decoding">
+ <title>MP3 解码</title>
+
+ <para>要把MP3歌曲刻录成音乐CD,就需要把它转换成非压缩的波形(WAV)格式。
+ <application>XMMS</application> 和
+ <application>mpg123</application> 都支持把MP3输出成非压缩格式文件。</para>
+
+ <para>在<application>XMMS</application>中输出到磁盘:</para>
+
+ <procedure>
+ <step>
+ <para>启动 <application>XMMS</application>.</para>
+ </step>
+
+ <step>
+ <para>在窗口里右击鼠标,弹出<application>XMMS</application>菜单。</para>
+ </step>
+
+ <step>
+ <para>在<literal>选项(Options)</literal>里选择<literal>设定(Preference)</literal>。</para>
+ </step>
+
+ <step>
+ <para>改变输出插件成<quote>写磁盘插件(Disk Writer
+ Plugin)</quote>。</para>
+ </step>
+
+ <step>
+ <para>按<literal>配置(Configure)</literal>。</para>
+ </step>
+
+ <step>
+ <para>输入或选择一个目录用于存放解压的文件。</para>
+ </step>
+
+ <step>
+ <para>象平常一样,把MP3文件装入到<application>XMMS</application>里边,
+ 把音量调节到100%并且关掉EQ设定。</para>
+ </step>
+
+ <step>
+ <para>按一下<literal>播放(Play)</literal> &mdash;
+ <application>XMMS</application> 如同在播放mp3一样,只是听不到声音。
+ 实际上是在播放mp3到一个文件里。</para>
+ </step>
+
+ <step>
+ <para>要想再听MP3歌曲,记得把默认的输出插件设回原来的值。</para>
+ </step>
+ </procedure>
+
+ <para>用<application>mpg123</application>进行标准输出:</para>
+
+ <procedure>
+ <step>
+ <para>执行<command> mpg123 -s <replaceable>audio01.mp3</replaceable>
+ &gt; audio01.pcm</command></para>
+ </step>
+ </procedure>
+
+ <para><application>XMMS</application>输出的文件是波形(WAV)格式,
+ 而<application>mpg123</application> 则把MP3转换成无压缩的PCM
+ 音频数据。两种格式都支持用 <application>cdrecord</application>
+ 刻录成音乐CD。 使用 &man.burncd.8; 您就必须使用无压缩的PCM。
+ 如果选择波形格式, 就要注意在每道开始时的一小点杂音,
+ 这段声音是波形文件的头部份。 可以使用工具
+ <application>SoX</application> 来轻松去除。
+ <application>SoX</application> 可从 <filename role="package">audio/sox</filename>
+ port 或包(package)中安装得到:</para>
+
+ <screen>&prompt.user; <userinput>sox -t wav -r 44100 -s -w -c 2 <replaceable>track.wav track.raw</replaceable></userinput></screen>
+
+ <para>阅读 <xref linkend="creating-cds"> 这部份可以了解到更多在
+ FreeBSD 里刻盘的信息。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="video-playback">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Ross</firstname>
+ <surname>Lippert</surname>
+ <contrib>贡献者</contrib>
+ </author>
+ </authorgroup>
+ <!-- 5 June 2002 -->
+ </sect1info>
+
+ <title>视频回放</title>
+
+ <para>视频回放是个很新并且迅速发展中的应用领域。
+ 一定要有耐心,因为不是所有的事情都象处音频那么顺利。</para>
+
+ <para>在开始之前,您要了解显卡的类型以及它所用的芯片的类型。
+ 尽管 <application>&xorg;</application>
+ 和 <application>&xfree86;</application>
+ 支持大量的显卡, 但能达到好的回放效果的却寥寥无几。
+ 在X11运行时,您可以使用命令 &man.xdpyinfo.1;
+ 获得使用您的显卡的X服务器所支持的扩展列表。</para>
+
+ <para>为了评估各种播放器和设置,您需要有一小段用作测试的MPEG文件。
+ 由于一些DVD播放器会默认地在
+ <filename>/dev/dvd</filename> 里去找DVD文件, 因此,
+ 您会发样建立符号链接到恰当的设备会很有用:</para>
+
+ <screen>&prompt.root; <userinput>ln -sf /dev/acd0c /dev/dvd</userinput>
+&prompt.root; <userinput>ln -sf /dev/racd0c /dev/rdvd</userinput></screen>
+
+ <para>在使用了 FreeBSD&nbsp;5.X 的 &man.devfs.5; 里, 有一个略微不同的推荐链接集:</para>
+
+ <screen>&prompt.root; <userinput>ln -sf /dev/acd0 /dev/dvd</userinput>
+&prompt.root; <userinput>ln -sf /dev/acd0 /dev/rdvd</userinput></screen>
+
+ <para>注意:由于&man.devfs.5;本身的原因,
+ 像这样手工建立的链接在重启后将不会存在。
+ 想要无论什么时候您启动系统都能自动建立符号链接,
+ 那就把下边这行加到 <filename>/etc/devfs.conf</filename> 里边:</para>
+
+ <programlisting>link acd0 dvd
+link acd0 rdvd</programlisting>
+
+ <para>另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。</para>
+
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>option CPU_ENABLE_SSE</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>内核选项</primary>
+ <secondary>option USER_LDT</secondary>
+ </indexterm>
+
+ <para>前面讨论的一些 ports 要正确地联编有赖于下列内核的选项设置。
+ 在试图联编之前, 把这些选项增加到内核配置文件中去, 建立新的内核,
+ 重启系统:</para>
+
+ <programlisting>option CPU_ENABLE_SSE
+option USER_LDT</programlisting>
+
+ <note>
+ <para><literal>option USER_LDT</literal> 在&os;&nbsp;5.X里并不存在。</para>
+ </note>
+
+ <para>为了增强用于共享内存的X11接口,推荐增加一些 &man.sysctl.8; 参数的值:</para>
+
+ <programlisting>kern.ipc.shmmax=67108864
+kern.ipc.shmall=32768</programlisting>
+
+ <sect2 id="video-interface">
+ <title>测定视频的性能</title>
+
+ <indexterm><primary>XVideo</primary></indexterm>
+ <indexterm><primary>SDL</primary></indexterm>
+ <indexterm><primary>DGA</primary></indexterm>
+
+ <para>在X11下有几种可以显示图像的方式。
+ 到底哪个能工作很大程序上依赖于硬件。 首先,
+ 下边描述的每一种方法在不同的硬件上都会有不同的品质。
+ 其次, 在X11里的图像显示近来引起普遍的关注,
+ 随着 <application>&xorg;</application>
+ 或 <application>&xfree86;</application> 的每一个版本,
+ 都会有很大的突破。</para>
+
+ <para>常见图像接口列表:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>X11: 一般性的使用共享内存的X11输出。</para>
+ </listitem>
+ <listitem>
+ <para>XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。</para>
+ </listitem>
+ <listitem>
+ <para>SDL: 简单直接媒体层。</para>
+ </listitem>
+ <listitem>
+ <para>DGA: 直接图片存取。</para>
+ </listitem>
+ <listitem>
+ <para>SVGAlib: 低层次掌控图片层。</para>
+ </listitem>
+ </orderedlist>
+
+ <sect3 id="video-interface-xvideo">
+ <title>XVideo</title>
+
+ <para><application>&xorg;</application> 和 <application>&xfree86; 4.X</application>
+ 有种扩展叫做<emphasis>XVideo</emphasis>
+ (或称Xvideo, Xv, xv),
+ 它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。
+ 即使在低端的计算机 (例如我的PIII&nbsp;400&nbsp;Mhz膝上电脑),
+ 这个扩展也提供了很好的播放质量。</para>
+
+ <para>要了解这一扩展是否在正常工作, 使用
+ <command>xvinfo</command> 命令:</para>
+
+ <screen>&prompt.user; <userinput>xvinfo</userinput></screen>
+
+ <para>如果显示结果如下,那您的显卡就支持XVideo:</para>
+<screen>X-Video Extension version 2.2
+screen #0
+ Adaptor #0: "Savage Streams Engine"
+ number of ports: 1
+ port base: 43
+ operations supported: PutImage
+ supported visuals:
+ depth 16, visualID 0x22
+ depth 16, visualID 0x23
+ number of attributes: 5
+ "XV_COLORKEY" (range 0 to 16777215)
+ client settable attribute
+ client gettable attribute (current value is 2110)
+ "XV_BRIGHTNESS" (range -128 to 127)
+ client settable attribute
+ client gettable attribute (current value is 0)
+ "XV_CONTRAST" (range 0 to 255)
+ client settable attribute
+ client gettable attribute (current value is 128)
+ "XV_SATURATION" (range 0 to 255)
+ client settable attribute
+ client gettable attribute (current value is 128)
+ "XV_HUE" (range -180 to 180)
+ client settable attribute
+ client gettable attribute (current value is 0)
+ maximum XvImage size: 1024 x 1024
+ Number of image formats: 7
+ id: 0x32595559 (YUY2)
+ guid: 59555932-0000-0010-8000-00aa00389b71
+ bits per pixel: 16
+ number of planes: 1
+ type: YUV (packed)
+ id: 0x32315659 (YV12)
+ guid: 59563132-0000-0010-8000-00aa00389b71
+ bits per pixel: 12
+ number of planes: 3
+ type: YUV (planar)
+ id: 0x30323449 (I420)
+ guid: 49343230-0000-0010-8000-00aa00389b71
+ bits per pixel: 12
+ number of planes: 3
+ type: YUV (planar)
+ id: 0x36315652 (RV16)
+ guid: 52563135-0000-0000-0000-000000000000
+ bits per pixel: 16
+ number of planes: 1
+ type: RGB (packed)
+ depth: 0
+ red, green, blue masks: 0x1f, 0x3e0, 0x7c00
+ id: 0x35315652 (RV15)
+ guid: 52563136-0000-0000-0000-000000000000
+ bits per pixel: 16
+ number of planes: 1
+ type: RGB (packed)
+ depth: 0
+ red, green, blue masks: 0x1f, 0x7e0, 0xf800
+ id: 0x31313259 (Y211)
+ guid: 59323131-0000-0010-8000-00aa00389b71
+ bits per pixel: 6
+ number of planes: 3
+ type: YUV (packed)
+ id: 0x0
+ guid: 00000000-0000-0000-0000-000000000000
+ bits per pixel: 0
+ number of planes: 0
+ type: RGB (packed)
+ depth: 1
+ red, green, blue masks: 0x0, 0x0, 0x0</screen>
+
+ <para>同时注意:列出来的格式(YUV2, YUV12, 等等) 并不总是随着
+ XVdieo的每一次执行而存在。没有它们可能或迷惑有些人。</para>
+
+ <para>如果结果看起来是这样:</para>
+<screen>X-Video Extension version 2.2
+screen #0
+no adaptors present</screen>
+
+ <para>那么您的显卡可以就不支持XVideo功能。</para>
+
+ <para>如果您的卡不支持XVideo,
+ 则只是说明您的显示器在满足刷新图像的计算要求上存在更大的困难。
+ 尽管显卡和处理器很重要,您仍然会有个不错的显示效果。
+ 此外, 您也可以参考我们提供的文献, 在 <xref
+ linkend="video-further-reading"> 中有所介绍。</para>
+
+ </sect3>
+
+ <sect3 id="video-interface-SDL">
+ <title>简单直接媒体层</title>
+
+ <para>简单直接媒体层(SDL),原意是做为 &microsoft.windows;、BeOS 以及 &unix;
+ 之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL
+ 层可以在低层访问硬件, 有时这样做就比 X11 接口层更为高效。</para>
+
+ <para>关于SDL可以参考<filename role="package">devel/sdl12</filename>。</para>
+
+ </sect3>
+
+ <sect3 id="video-interface-DGA">
+ <title>直接图形存取</title>
+
+ <para><quote>直接图形存取</quote> 是 <application>&xfree86;</application>
+ 的扩展,它允许程序绕过 X server 直接改变 framebuffer。
+ 因为它依靠一个底层的交换存储器来影响这种共享, 程序必须以
+ <username>root</username> 身份执行。</para>
+
+ <para>DGA扩展可以能过 &man.dga.1; 来测试和衡量。 在 <command>dga</command>
+ 执行时,一旦检测到按键, 它就会改变显示的颜色。
+ 按 <keycap>q</keycap> 退出。</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="video-ports">
+ <title>Ports 和 包(Packages) 对视频的解决</title>
+
+ <indexterm><primary>视频 ports</primary></indexterm>
+ <indexterm><primary>视频 包</primary></indexterm>
+
+ <para>这部份主要讨论在 FreeBSD Ports 集中提供的可用于视频回放的软件。
+ 视频回放在软件发展中是个很活跃的领域,
+ 并且各种不同程序的功能可能与这里的描述不尽相同。</para>
+
+ <para>首先要弄清楚的重要一点是在 FreeBSD 上使用的视频程序其发展与在
+ Linux 里使用的是一样的。 大部份程序都还处在β阶段。使用 FreeBSD
+ 的包可能面对的问题:</para>
+
+ <orderedlist>
+
+ <listitem>
+ <para>一个应用程序不能播放其它程序制作的文件。</para>
+ </listitem>
+
+ <listitem>
+ <para>一个应用程序不能播放其自已制作的文件。</para>
+ </listitem>
+
+ <listitem>
+ <para>不同机上的同样的程序,各自重新建立(rebuild)了一次,
+ 播放同一个文件结果也会有不同。</para>
+ </listitem>
+
+ <listitem>
+ <para>一个看起来没什么的过滤器, 如图像尺寸的调整,
+ 也有可能因为一个调整例程的问题变得很不象样。</para>
+ </listitem>
+
+ <listitem>
+ <para>应用程序频繁地留下垃圾(dumps core)。</para>
+ </listitem>
+
+ <listitem>
+ <para>文档如没有随着port一起安装,实际上也可以上网找到,或者去 port
+ 的 <filename role='directory'>work</filename> 目录下找。</para>
+ </listitem>
+
+ </orderedlist>
+
+ <para>这些程序中许多也体现了 <quote>Linux主义</quote>。即,
+ 有些问题来自于(程序)使用的标准库存在于Linux的发行版中,
+ 或者有些是 Linux 内核的功能, 而该程序的作者事先所假定了的是
+ Linux内核。这些问题并不总是被 port 编护人员注意到或处理过,
+ 这也就可能导致如下问题:</para>
+
+ <orderedlist>
+
+ <listitem>
+ <para>使用<filename>/proc/cpuinfo</filename>去检测处理器的特性。</para>
+ </listitem>
+
+ <listitem>
+ <para>滥用线程可能导致一个程序悬挂完成,而不是完全中止。</para>
+ </listitem>
+
+ <listitem>
+ <para>软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。</para>
+ </listitem>
+
+ </orderedlist>
+
+ <para>现在,这些程序的开发人员也已同 port 的维护人员进行了联合,
+ 以减少制作port时出错。</para>
+
+ <sect3 id="video-mplayer">
+ <title>MPlayer</title>
+
+ <para><application>MPlayer</application>
+ 是近来开发的同时也正迅速发展着的一个视频播放器。
+ <application>MPlayer</application> 团队的目标是在
+ Linux 和其它 UNIX 系统中的速度和机动性能。
+ 在团队的创始人实在受不了当时可用的播放器的性能时,
+ 这个计划就开始了。 有人也许会说图形接口已经成为新型设计的牺牲品。
+ 但是一但您习惯了命令行选项和按键控制方式,它就能表现得很好。</para>
+
+ <sect4 id="video-mplayer-building">
+ <title>创建MPlayer</title>
+ <indexterm><primary>MPlayer</primary>
+ <secondary>making</secondary></indexterm>
+
+ <para><application>MPlayer</application> 可以从 <filename
+ role="package">multimedia/mplayer</filename> 找到。
+ <application>MPlayer</application> 在联编过程中会进行许多硬件检测,
+ 而得到的可执行文件因此将无法移植到其他系统中使用。
+ 因此, 从 ports 完成联编而不是安装预编译的包就很重要。
+ 另外, 在 <command>make</command> 命令行还可以指定许多选项,
+ 在 <filename>Makefile</filename> 中有所描述, 接下来我们开始联编:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/multimedia/mplayer</userinput>
+&prompt.root; <userinput>make</userinput>
+N - O - T - E
+
+Take a careful look into the Makefile in order
+to learn how to tune mplayer towards you personal preferences!
+For example,
+make WITH_GTK1
+builds MPlayer with GTK1-GUI support.
+If you want to use the GUI, you can either install
+/usr/ports/multimedia/mplayer-skins
+or download official skin collections from
+http://www.mplayerhq.hu/homepage/dload.html
+</screen>
+
+ <para>默认的 port 选项对于绝大多数用户来来说是够用了。
+ 不过, 如果您需要 XviD 编解码器, 则必须指定
+ <makevar>WITH_XVID</makevar> 这个命令行选项。
+ 默认的 DVD 设备也可以用 <makevar>WITH_DVD_DEVICE</makevar>
+ 选项来定义, 其默认值是 <filename>/dev/acd0</filename>。</para>
+
+ <para>撰写这一章的时候, <application>MPlayer</application> port 的联编过程包括了
+ HTML 文档和两个可执行文件,
+ <command>mplayer</command> 和
+ <command>mencoder</command>, 后者是一个视频再编码工具。</para>
+
+ <para><application>MPlayer</application> 的 HTML 文档提供了丰富的内容。
+ 如果读者发现本章中缺少关于视频硬件的一些信息,
+ 则 <application>MPlayer</application> 的文档将是十分详尽的补充。
+ 如果您正在找关于 &unix; 中的视频支持的资料,
+ 您绝对应该花一些时间来阅读 <application>MPlayer</application>
+ 的文档。</para>
+
+ </sect4>
+
+ <sect4 id="video-mplayer-using">
+ <title>使用MPlayer</title>
+ <indexterm><primary>MPlayer</primary>
+ <secondary>使用</secondary></indexterm>
+
+ <para>任何 <application>MPlayer</application> 用户必须在主目录下建立一个叫
+ <filename>.mplayer</filename> 的子目录。
+ 输入下边的内容来建立这个必须的子目录:</para>
+
+<screen>&prompt.user; <userinput>cd /usr/ports/multimedia/mplayer</userinput>
+&prompt.user; <userinput>make install-user</userinput></screen>
+
+ <para>在<command>mplayer</command>的手册里列出了它的命令选项。
+ HTML文档里有更为详细的信息。 这部份里, 我们只是描述了很少的常见应用。</para>
+
+ <para>要播放一个文件,如
+ <filename><replaceable>testfile.avi</replaceable></filename>,
+ 可以通过各种视频接口当中的某一个去设置 <option>-vo</option> 选项:</para>
+
+ <screen>&prompt.user; <userinput>mplayer -vo xv testfile.avi</userinput></screen>
+ <screen>&prompt.user; <userinput>mplayer -vo sdl testfile.avi</userinput></screen>
+ <screen>&prompt.user; <userinput>mplayer -vo x11 testfile.avi</userinput></screen>
+ <screen>&prompt.root; <userinput>mplayer -vo dga testfile.avi</userinput></screen>
+ <screen>&prompt.root; <userinput>mplayer -vo 'sdl:dga' testfile.avi</userinput></screen>
+
+ <para>所有这些选项都是值得一试的,
+ 因为它们的性能依赖很多因素,并且都与硬件密切相关。</para>
+
+ <para>要播放 DVD, 需要把
+ <filename>testfile.avi</filename> 改为 <option>dvd://<replaceable>N</replaceable> -dvd-device
+ <replaceable>DEVICE</replaceable></option>。 这里 <replaceable>N</replaceable>
+ 是要播放的节目编号, 而
+ <filename><replaceable>DEVICE</replaceable></filename> 则是
+ DVD-ROM 的设备节点。 例如, 要播放 <filename>/dev/dvd</filename>
+ 的第三个节目:</para>
+
+ <screen>&prompt.root; <userinput>mplayer -vo xv dvd://3 -dvd-device /dev/dvd</userinput></screen>
+
+ <note>
+ <para>The default DVD device can be defined during the build
+ of the <application>MPlayer</application> port via the
+ <makevar>WITH_DVD_DEVICE</makevar> option. By default,
+ this device is <filename>/dev/acd0</filename>. More
+ details can be found in the port
+ <filename>Makefile</filename>.</para>
+ </note>
+
+ <para>要停止、暂停、前进等等,可以参考设定的按键---这些可以通过
+ <command>mplayer -h</command> 得到或查看手册。</para>
+
+ <para>另外,回放的重要选项是:用于全屏模式的 <option>-fs -zoom</option>
+ 和起辅助完成作用的<option>-framedrop</option>。</para>
+
+ <para>为了让 mplayer 的命令行不是太长,使用者可以通过建立一个文件
+ <filename>.mplayer/config</filename> 来设定如下默认选项:</para>
+<programlisting>vo=xv
+fs=yes
+zoom=yes</programlisting>
+
+ <para>最后,<command>mplayer</command>可以把DVD题目(title)抓取成为
+ <filename>.vob</filename>文件。为了从DVD中导出第二个题目,请输入:</para>
+
+ <screen>&prompt.root; <userinput>mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd</userinput></screen>
+
+ <para>输出文件 <filename>out.vob</filename> 将是 MPEG
+ 并且可以被这部份描述的其它<quote>包</quote>利用。</para>
+
+ </sect4>
+ <sect4 id="video-mencoder">
+ <title>mencoder</title>
+ <indexterm>
+ <primary>mencoder</primary>
+ </indexterm>
+
+ <para>在使用
+ <command>mencoder</command> 之前, 首先熟悉其 HTML
+ 文档中所介绍的选项是一个不错的主意。 它提供了联机手册,
+ 但如果没有 HTML 文档则帮助不大。 有无数种方法来提高视频品质、
+ 降低比特率、 修改格式, 而这些技巧可能会影响性能。
+ 下面是几个例子, 第一个是简单地复制:</para>
+
+ <screen>&prompt.user; <userinput>mencoder input.avi -oac copy -ovc copy -o output.avi</userinput></screen>
+
+ <para>不正确的命令选项组合可能使生成的文件不能被<command>mplayer</command>播放。因此,如果您只是想抓取文件,一定在<command>mplayer</command>里使用<quote><option>-dumpfile</option></quote>。</para>
+
+ <para>转换<filename>input.avi</filename>成为带有MPEG3音频编码 (要求<filename role="package">audio/lame</filename> )的MPEG4编码:</para>
+
+ <screen>&prompt.user; <userinput>mencoder input.avi -oac mp3lame -lameopts br=192 \
+ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi</userinput></screen>
+
+ <para>这样就产生了可被<command>mplayer</command> 和 <command>xine</command>播放的输出。</para>
+
+ <para><filename>input.avi</filename> 可以换成
+ <option>dvd://1 -dvd-device /dev/dvd</option> 并以
+ <username>root</username> 的身份来执行, 以重新对 DVD 节目进行编码。
+ 由于您第一次做这样的工作时很可能会对结果不太满意,
+ 建议您首先把节目复制成文件, 然后对它进行操作。</para>
+ </sect4>
+
+ </sect3>
+
+ <sect3 id="video-xine">
+ <title>xine视频播放器</title>
+
+ <para><application>xine</application>视频播放器是一个关注范围很广的项目,它不仅看准多合一的视频解决,而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。发行有<quote>包</quote>和port版本-- <filename role="package">multimedia/xine</filename>。</para>
+
+ <para><application>xine</application>播放器仍然很粗糙,但这很显然与好开头无关。实际上<application>xine</application> 即需要一个快速的带有快速显卡的CPU,也支持XVideo的扩展。图形界面(GUI)可以使用,但很勉强。</para>
+
+ <para>到写这章时,还没有可用于播放CSS编码的DVD文件的输入模块随同
+ <application>xine</application>一起发行。
+ 第三方的建造(builds)里内建有这样的模块,
+ 但都不属于FreeBSD Ports 集。</para>
+
+ <para>与<application>MPlayer</application>相比,<application>xine</application> 为用户考虑得更多,但同时,对用户来说也少了很多有条理的控制方式。<application>xine</application> 播放器在XVideo接口上做得不错。</para>
+
+ <para>默认情况下,播放器<application>xine</application>启动的时后会使用图形界面。那么就可以使用菜单打开指定的文件:</para>
+
+ <screen>&prompt.user; <userinput>xine</userinput></screen>
+
+ <para>另外,没有图形界面也可以使用如下命令立即打开播放文件:</para>
+
+ <screen>&prompt.user; <userinput>xine -g -p mymovie.avi</userinput></screen>
+
+ </sect3>
+
+ <sect3 id="video-ports-transcode">
+ <title>使用transcode</title>
+
+ <para>软件<application>transcode</application>不是一个播放器,而是一套再编码<filename>.avi</filename> 和 <filename>.mpg</filename> 文件的工具。使用<application>transcode</application>,借助标准输入输出(<filename>stdin/stdout</filename>)流接口,利用命令行工具,可以合并视频文件、修复坏文件。</para>
+
+ <para>像<application>MPlayer</application>一样, <application>transcode</application>是个实验性软件,必须通过port<filename
+ role="package">multimedia/transcode</filename>来建立。<command>make</command>使用了大量的选项。我们推荐:</para>
+
+ <screen>&prompt.root; <userinput>make WITH_LIBMPEG2=yes</userinput></screen>
+
+ <para>如果您打算安装<filename
+ role="package">multimedia/avifile</filename>,那么就把选项<literal>WITH_AVIFILE</literal>加到您的<command>make</command>命令行里,如下所示:</para>
+
+ <screen>&prompt.root; <userinput>make WITH_AVIFILE=yes WITH_LIBMPEG2=yes</userinput></screen>
+
+ <para>这里有两个使用<command>transcode</command>进行可调整视频输出的转换实例。第一个把输出编码成openDIVX AVI文件,第二个是编码成更为小巧的MPEG格式。</para>
+
+ <screen>&prompt.user; <userinput>transcode -i input.vob -x vob -V -Z 320x240 \
+-y opendivx -N 0x55 -o output.avi</userinput></screen>
+
+ <screen>&prompt.user; <userinput>transcode -i input.vob -x vob -V -Z 320x240 \
+-y mpeg -N 0x55 -o output.tmp</userinput>
+&prompt.user; <userinput>tcmplex -o output.mpg -i output.tmp.m1v -p output.tmp.mpa -m 1</userinput></screen>
+
+ <para>有个关于<command>transcode</command>的参考页,仅有很少的关于各种<command>tc*</command>(如
+ <command>tcmplex</command>)应用的文档,这也是安装了的。命令行选项 <option>-h</option> 有时也可以给出简单的使用格式的说明。</para>
+
+ <para>相比之下,<command>transcode</command>比<command>mencoder</command>运行起来要慢许多,但它可以制作出更多可播放的文件。例如,用<command>transcode</command>创建的MPEG文件众所周知可以在<application>&windows.media; Player</application> 和 Apple's <application>&quicktime;</application>里播放。</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="video-further-reading">
+ <title>进一步了解</title>
+
+ <para>FreeBSD里不同的视频软件包正迅速发展中。很可能在不久的将来,这里所谈到的问题都将得到解决。同时,有些人想超越FreeBSD的声/像(A/V)能力,那他们就不得不从一些FAQ和指南里学知识,并使用一些不同的应用程序。这里就给这些读者指出一些补充信息。</para>
+
+ <para><ulink url="http://www.mplayerhq.hu/DOCS/">MPlayer 文档</ulink>是很技术性的。这些文档可以给那些希望获得关于&unix;视频高级技术的人们提供参考。<application>MPlayer</application>邮件列表很不喜欢没耐心阅读文档的人,如果您发现什么问题想报告给他们,请首先RTFM。</para>
+
+ <para><ulink url="http://dvd.sourceforge.net/xine-howto/en_GB/html/howto.html"> xine HOWTO</ulink>里边有一章是关于提高性能的,对所有的播放器都很适应。</para>
+
+ <para>最后是一些很有前途的程序,读者可以试一下:</para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para><ulink
+ url="http://avifile.sourceforge.net/">Avifile</ulink>,它就是 <filename
+ role='package'>multimedia/avifile</filename> port。</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.dtek.chalmers.se/groups/dvd/">Ogle</ulink>
+ 它就是 <filename
+ role='package'>multimedia/ogle</filename> port。</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://xtheater.sourceforge.net/">Xtheater</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><filename
+ role="package">multimedia/dvdauthor</filename>,一个制作 DVD 节目的源码开放包。</para>
+ </listitem>
+
+ </itemizedlist>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="tvcard">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Josef</firstname>
+ <surname>El-Rayes</surname>
+ <contrib>原创: </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>改编:</contrib>
+ <!-- 02 January 2004 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>安装电视卡</title>
+ <indexterm>
+ <primary>电视卡</primary>
+ </indexterm>
+
+ <sect2>
+ <title>介绍</title>
+
+ <para>电视卡可以让您在您的计算机里观看到无线或有线电视。许多卡是通过RCA或S-video输入接收复合视频,而且有些卡还带有调频广播接收器。</para>
+
+ <para>&os; 通过&man.bktr.4;驱动程序,提供了对基于PCI的电视卡的支持,要求这些卡使用的是Brooktree Bt848/849/878/879 或 Conexant CN-878/Fusion 878a视频采集芯片。您还要确保这个板上带的有被支持的调谐器,参考&man.bktr.4;手册查看所支持的调谐器列表。</para>
+ </sect2>
+
+ <sect2>
+ <title>增加驱动程序</title>
+
+ <para>要使用您的卡,您就要装载&man.bktr.4;驱动程序。这个可以通过往<filename>/boot/loader.conf</filename>里边添加下边一行来实现。象这样:</para>
+
+ <programlisting>bktr_load="YES"</programlisting>
+
+ <para>另外,您也可以静态地这个支持编译到内核里去,要是这样的话,就把下边几行加到内核配置里去:</para>
+
+ <programlisting>device bktr
+device iicbus
+device iicbb
+device smbus</programlisting>
+
+ <para>这些附加的设备驱动程序是必须的,因为卡的各组成部分是能过一根I2C总线相互连接在一起的。然后建立安装新的内核。</para>
+
+ <para>一旦这个支持被加到了您的系统里,您须要重启系统。在启动过程中,您的电视卡应该显示为up(启动),象这样:</para>
+
+ <programlisting>bktr0: &lt;BrookTree 848A&gt; mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0
+iicbb0: &lt;I2C bit-banging driver&gt; on bti2c0
+iicbus0: &lt;Philips I2C bus&gt; on iicbb0 master-only
+iicbus1: &lt;Philips I2C bus&gt; on iicbb0 master-only
+smbus0: &lt;System Management Bus&gt; on bti2c0
+bktr0: Pinnacle/Miro TV, Philips SECAM tuner.</programlisting>
+
+ <para>当然,这些信息可能因您的硬件不同而有所区别。但是您应该能检查那个调制器是否被正确检测到了,可能要忽略一些检测到的同&man.sysctl.8; MIB(管理系统库)和内核配置文件选项一起的参数。例如,如果您想强制使用Philips(飞利浦) SECAM制式的调谐器 ,您就应把下列行加到内核配置文件里:</para>
+
+ <programlisting>options OVERRIDE_TUNER=6</programlisting>
+
+ <para>或者,您直接使用&man.sysctl.8;:</para>
+
+ <screen>&prompt.root; <userinput>sysctl hw.bt848.tuner=6</userinput></screen>
+
+ <para>查看&man.bktr.4;手册和<filename>/usr/src/sys/conf/NOTES</filename>文件了解更多详细关于可用选项的资料。(如果您在&os;&nbsp;4.X下,就使用<filename>/usr/src/sys/i386/conf/LINT</filename>代替 <filename>/usr/src/sys/conf/NOTES</filename>。)</para>
+ </sect2>
+
+ <sect2>
+ <title>有用的应用程序</title>
+
+ <para>要使用您的电视卡,您需要安装下列应用程序之一:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><filename role="package">multimedia/fxtv</filename>提供<quote>窗口电视(TV-in-a-window)</quote>功能和图像/声音/图像采集功能。</para>
+ </listitem>
+ <listitem>
+ <para><filename role="package">multimedia/xawtv</filename>也是一款电视应用程序,功能同<application>fxtv</application>一样。</para>
+ </listitem>
+ <listitem>
+ <para><filename role="package">misc/alevt</filename>解码和显示Videotext/Teletext。</para>
+ </listitem>
+ <listitem>
+ <para><filename role="package">audio/xmradio</filename>,一款用于一些电视卡的调频电台调谐器的程序。</para>
+ </listitem>
+ <listitem>
+ <para><filename role="package">audio/wmtune</filename>,一款用于电台调谐器的便捷的桌面程序。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>更多的程序在&os; Ports Collection(Ports 集)里。</para>
+ </sect2>
+
+ <sect2>
+ <title>问题解决</title>
+
+ <para>如果您的电视卡遇到了什么问题,您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被&man.bktr.4;驱动程序支持,并且是不是使用了正确的配置选项。想得到更多支持和关于您的电视卡的各种问题,您可以接触和使用&a.multimedia.name; 邮件列表的压缩包。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="scanners">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ <contrib>撰写人 </contrib>
+ <!-- 04 August 2004 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>图象扫描仪</title>
+ <indexterm>
+ <primary>图象扫描仪</primary>
+ </indexterm>
+
+ <sect2>
+ <title>介绍</title>
+
+ <para>像任何其他的现代操作系统一样,&os; 可以使用图像扫描仪。
+ 对扫描仪的标准的访问是通过 &os; Ports Collection 中的
+ <application>SANE</application> (Scanner Access Now
+ Easy) <acronym role="Application Programming
+ Interface">API</acronym> 提供的。
+ <application>SANE</application> 也会使用一些
+ &os; 设备驱动来访问扫描仪硬件。</para>
+
+ <para>&os; 支持 SCSI 和 USB 扫描仪。
+ 在做任何配置之前请确保您的扫描仪被 <application>SANE</application>
+ 支持。<application>SANE</application> 有一个<ulink
+ url="http://sane-project.org/sane-supported-devices.html">
+ 支持的设备</ulink>列表,可以为您提供有关扫描仪的支持情况和状态的信息。
+ &man.uscanner.4; 手册页也提供了一个支持的 USB 扫描仪列表。</para>
+ </sect2>
+
+ <sect2>
+ <title>内核配置</title>
+
+ <para>上面提到 SCSI 和 USB 接口都是支持的。
+ 取决于您的扫描仪接口,
+ 需要不同的设备驱动程序。</para>
+
+ <sect3 id="scanners-kernel-usb">
+ <title>USB 接口</title>
+
+ <para>默认的 <filename>GENERIC</filename>
+ 内核包含了支持 USB 扫描仪需要的设备驱动。
+ 如果您决定使用一个定制的内核,
+ 确保下面在您的内核配置文件中存在下面这些行:</para>
+
+ <programlisting>device usb
+device uhci
+device ohci
+device uscanner</programlisting>
+
+ <para>取决于您主板上的 USB 芯片,
+ 您只需要 <literal>device uhci</literal> 或者
+ <literal>device ohci</literal> 中的一种,但是两个都在
+ 内核配置文件中是没有害处的。</para>
+
+ <para>如果您不想重新编译内核而且您的内核也不是
+ <filename>GENERIC</filename> 的,
+ 您可以用 &man.kldload.8; 命令直接加载
+ &man.uscanner.4; 设备驱动模块:</para>
+
+ <screen>&prompt.root; <userinput>kldload uscanner</userinput></screen>
+
+ <para>要在每次系统启动的时候加载这个模块,
+ 添加下面这行到
+ <filename>/boot/loader.conf</filename> 中:</para>
+
+ <programlisting>uscanner_load="YES"</programlisting>
+
+ <para>在用正确的内核重新启动后,
+ 或者在加载了需要的模块之后,插上您的 USB 扫描仪。
+ 扫描仪会出现在您的系统消息缓存
+ (&man.dmesg.8;)中,就像这样:</para>
+
+ <screen>uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2</screen>
+
+ <para>这表明我们的扫描仪正在使用
+ <filename>/dev/uscanner0</filename> 设备节点。</para>
+
+ <note>
+ <para>在 &os;&nbsp;4.X 上,USB 进程(&man.usbd.8;)
+ 必须运行来检测 USB 设备。要启用它,
+ 添加 <literal>usbd_enable="YES"</literal> 到您的
+ <filename>/etc/rc.conf</filename> 文件中并重新启动。</para>
+ </note>
+ </sect3>
+
+ <sect3>
+ <title>SCSI 接口</title>
+
+ <para>如果您的扫描仪是 SCSI 接口的,
+ 重要的是要知道您使用哪种 SCSI 控制器。
+ 取决于所使用的 SCSI 芯片,
+ 您需要调整内核配置文件。
+ <filename>GENERIC</filename> 的内核支持最常用的
+ SCSI 控制器。确保阅读
+ <filename>NOTES</filename> 文件(在 &os;&nbsp;4.x 下面是
+ <filename>LINT</filename>)并在您的内核配置文件中添加正确的行。
+ 除了 SCSI 适配器驱动之外,
+ 您还需要在内核配置文件中有如下行:</para>
+
+ <programlisting>device scbus
+device pass</programlisting>
+
+ <para>一旦完全编译好您的内核,
+ 您就可以在启动时的系统消息缓冲中看到这些设备:</para>
+
+ <screen>pass2 at aic0 bus 0 target 2 lun 0
+pass2: &lt;AGFA SNAPSCAN 600 1.10&gt; Fixed Scanner SCSI-2 device
+pass2: 3.300MB/s transfers</screen>
+
+ <para>如果您的扫描仪没有在系统启动的时候加电,
+ 很可能还需要强制手动检测一下,用 &man.camcontrol.8;
+ 命令执行一次 SCSI 总线扫描:</para>
+
+ <screen>&prompt.root; <userinput>camcontrol rescan all</userinput>
+Re-scan of bus 0 was successful
+Re-scan of bus 1 was successful
+Re-scan of bus 2 was successful
+Re-scan of bus 3 was successful</screen>
+
+ <para>然后扫描仪就会出现在 SCSI 设备列表里:</para>
+
+ <screen>&prompt.root; <userinput>camcontrol devlist</userinput>
+&lt;IBM DDRS-34560 S97B&gt; at scbus0 target 5 lun 0 (pass0,da0)
+&lt;IBM DDRS-34560 S97B&gt; at scbus0 target 6 lun 0 (pass1,da1)
+&lt;AGFA SNAPSCAN 600 1.10&gt; at scbus1 target 2 lun 0 (pass3)
+&lt;PHILIPS CDD3610 CD-R/RW 1.00&gt; at scbus2 target 0 lun 0 (pass2,cd0)</screen>
+
+ <para>有关 SCSI 设备的更多细节,可以查看
+ &man.scsi.4; 和 &man.camcontrol.8; 手册页。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>SANE 配置</title>
+
+ <para><application>SANE</application> 系统分为两部分:
+ 后端(<filename
+ role="package">graphics/sane-backends</filename>)
+ 和前端(<filename
+ role="package">graphics/sane-frontends</filename>)。
+ 后端部分提供到扫描仪自身的访问。
+ <application>SANE</application> 的<ulink
+ url="http://sane-project.org/sane-supported-devices.html">
+ 支持设备</ulink>列表详细说明了哪一个后端可以支持您的图象扫描仪。
+ 如果您想使用您的设备,就必须为您的扫描仪选定正确的后端。
+ 前端部分提供图形化的扫描界面
+ (<application>xscanimage</application>)。</para>
+
+ <para>要做的第一件事就是安装 <filename
+ role="package">graphics/sane-backends</filename> port 或者
+ package。然后,使用 <command>sane-find-scanner</command>
+ 命令来检查 <application>SANE</application>
+ 系统做的扫描仪检测:</para>
+
+ <screen>&prompt.root; <userinput>sane-find-scanner -q</userinput>
+found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3</screen>
+
+ <para>输出显示了扫描仪的接口类型和扫描仪连接到系统上的设备节点。
+ 生产厂家和产品型号可能没有显示,不过不重要。</para>
+
+ <note>
+ <para>一些 USB 扫描仪需要您加载固件,后端的手册页中有这方面的解释。
+ 您也应该阅读 &man.sane-find-scanner.1; 和 &man.sane.7;
+ 手册页。</para>
+ </note>
+
+ <para>现在我们需要检查扫描仪是否可以被扫描前端识别。
+ 默认情况下,
+ <application>SANE</application> 后端自带一个叫做
+ &man.scanimage.1; 的命令行工具。
+ 这个命令允许您列出设备以及从命令行执行图片扫描。
+ <option>-L</option> 选项用来列出扫描仪设备:</para>
+
+ <screen>&prompt.root; <userinput>scanimage -L</userinput>
+device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner</screen>
+
+ <para>没有输出或者消息说明扫描仪没有识别到,
+ 这表明 &man.scanimage.1; 无法识别扫描仪。
+ 如果发生这种情况,您需要编辑后端配置文件定义所用的扫描仪设备。
+ <filename
+ role="directory">/usr/local/etc/sane.d/</filename>
+ 目录包含了所有的后端配置文件。
+ 识别的问题会出现在某些 USB 扫描仪上。</para>
+
+ <para>例如,对于<xref
+ linkend="scanners-kernel-usb">中所用的 USB 扫描仪,
+ <command>sane-find-scanner</command> 给我们下面的信息:</para>
+
+ <screen>&prompt.root; <userinput>sane-find-scanner -q</userinput>
+found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0</screen>
+ <para>扫描仪被正确的探测到了,它使用 USB
+ 接口,连接在
+ <filename>/dev/uscanner0</filename> 设备节点上。
+ 我们现在可以检查看看扫描仪是否被正确的识别:</para>
+
+ <screen>&prompt.root; <userinput>scanimage -L</userinput>
+
+No scanners were identified. If you were expecting something different,
+check that the scanner is plugged in, turned on and detected by the
+sane-find-scanner tool (if appropriate). Please read the documentation
+which came with this software (README, FAQ, manpages).</screen>
+
+ <para>既然扫描仪没有被识别,我们就需要编辑
+ <filename>/usr/local/etc/sane.d/epson.conf</filename>
+ 文件。所用的扫描仪型号是 &epson.perfection; 1650,
+ 这样我们知道扫描仪应使用 <literal>epson</literal>
+ 后端。确保阅读后端配置文件中的帮助注释。
+ 改动非常简单:注释掉导致您的扫描仪使用错误接口的所有行
+ (在我们这种情况下,我们将注释掉从
+ <literal>scsi</literal> 开始的所有行,因为我们的扫描仪使用 USB
+ 接口),然后在文件的结尾添加指定的接口和所用的设备节点。
+ 这种情况下,我们添加下面这行:</para>
+
+ <programlisting>usb /dev/uscanner0</programlisting>
+
+ <para>请确保阅读后端配置文件提供的注释以及后端手册页了解更多细节,
+ 并使用正确的语法。我们现在可以检验扫描仪是否被识别到了:</para>
+
+ <screen>&prompt.root; <userinput>scanimage -L</userinput>
+device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner</screen>
+
+ <para>我们的 USB 扫描仪被识别到了。如果商标和型号不匹配也不重要。
+ 相关的关键一条是
+ <literal>`epson:/dev/uscanner0'</literal> 字段,
+ 这个给了我们正确地后端名称和正确的设备节点。</para>
+
+ <para>一旦 <command>scanimage -L</command> 命令可以看到扫描仪,
+ 配置就完成了。设备现在准备好等待扫描了。</para>
+
+ <para>&man.scanimage.1; 允许我们从命令行执行图片扫描,
+ 相比之下使用图形用户界面来执行图片扫描会更好。
+ <application>SANE</application> 提供了一个简单但实用的图形界面:
+ <application>xscanimage</application>
+ (<filename
+ role="package">graphics/sane-frontends</filename>)。</para>
+
+ <para><application>Xsane</application> (<filename
+ role="package">graphics/xsane</filename>)是另一个流行的图形扫描前端。
+ 这个前端提供了一些高级特性,
+ 比如多样的扫描模式(photocopy,fax,等。),
+ 色彩校正,批量扫描,等等。这两个程序都可以作为
+ <application>GIMP</application>
+ 的插件使用。</para>
+ </sect2>
+
+ <sect2>
+ <title>授予其他用户扫描权限</title>
+
+ <para>前面所有的操作都是用
+ <username>root</username> 权限来完成的。You may however, need
+ 然而您可能需要让其他的用户也可以访问扫描仪。
+ 用户需要有扫描仪所用的设备节点的读和写权限。
+ 比如,我们的 USB 扫描仪使用设备节点
+ <filename>/dev/uscanner0</filename>,这个节点属于
+ <groupname>operator</groupname> 组。将用户
+ <username>joe</username> 添加到
+ <groupname>operator</groupname> 组会允许他使用扫描仪:</para>
+
+ <screen>&prompt.root; <userinput>pw groupmod operator -m <replaceable>joe</replaceable></userinput></screen>
+
+ <para>要了解更多细节请阅读 &man.pw.8; 手册页。</para>
+
+ <note>
+ <para>当然,考虑安全的因素,您在添加用户到任何组,
+ 尤其是
+ <groupname>operator</groupname> 组的时候都应该三思而后行。</para>
+ </note>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/network-servers/Makefile b/zh_CN.GB2312/books/handbook/network-servers/Makefile
new file mode 100644
index 0000000000..d1ea7b7f6e
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/network-servers/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= network-servers/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml
new file mode 100644
index 0000000000..08f408eb80
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml
@@ -0,0 +1,966 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.29
+ $FreeBSD$
+-->
+
+<chapter id="network-servers">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Murray</firstname>
+ <surname>Stokely</surname>
+ <contrib>Reorganized by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 23 July 2004 -->
+ </chapterinfo>
+
+ <title>Network Servers</title>
+
+ <sect1 id="network-servers-synopsis">
+ <title>概要</title>
+
+ <para>本章将覆盖某些在 &unix; 系统上常用的网络服务。话题将会涉及
+ 如何安装、配置、测试和维护多种不同类型的网络服务。本章节中将提
+ 供大量配置文件的样例,期望能够对您有所裨益。</para>
+
+ <para>在读完本章之后,您将会知道:</para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>如何管理<application>inetd</application>
+ 。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何设置运行一个网络文件系统。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何配置一个网络信息服务器以共享用户帐号。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何通过DHCP自动配置网络。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何配置一个域名服务器。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何设置<application>Apache</application> HTTP 服务器。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何设置文件传输(FTP)服务器。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何使用<application>Samba</application>为 &windows;
+ 客户端设置文件和打印服务。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何同步时间和日期,以及如何设置使用NTP协议的时间服务器。</para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para>在阅读此章节之前,您应当:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>理解有关<filename>/etc/rc</filename>中脚本的基本知识。</para>
+ </listitem>
+
+ <listitem>
+ <para>熟悉基本网络术语。</para>
+ </listitem>
+
+ <listitem>
+ <para>懂得如何安装额外的第三方软件(<xref linkend="ports">)。</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="network-inetd">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title> <application>inetd</application> <quote>超级服务器</quote></title>
+
+ <sect2 id="network-inetd-overview">
+ <title>总览</title>
+
+ <para>&man.inetd.8; 被称为<quote>Internet
+ Super-Server</quote>, 因为它管理几个守护程序的链接。提供网络
+ 服务的程序被称为守护进程。<application>inetd</application>
+ 作为一个为其他服务的管理服务器,当一个被<application>inetd</application>
+ 收到后,它将决定连接将前往哪个程序,然后拉起对应的守护进程,
+ 并将socket转交过去。 比起来将所有守护进程以stand-alone模式
+ 运行,运行单个<application>inetd</application>实例可以降低
+ 系统开销。</para>
+
+ <para>一般说来,<application>inetd</application> 被用来拉起
+ 其他守护进程,不过有些细碎的协议被直接接管,比如<application>chargen</application>,
+ <application>auth</application>,和
+ <application>daytime</application>。</para>
+
+ <para>这一部分将通过命令行选项和<filename>/etc/inetd.conf</filename>
+ 文件来介绍配置<application>inetd</application> 的基础知识。</para>
+ </sect2>
+
+ <sect2 id="network-inetd-settings">
+ <title>设置</title>
+
+ <para><application>inetd</application> 通过 <filename>/etc/rc.conf</filename>
+ 系统进行初始化。<literal>inetd_enable</literal> 选项默认被设定为
+ <literal>NO</literal>,不过可以通过<application>sysinstall</application>打开,
+ 如果选用中等安全的模板。在<filename>/etc/rc.conf</filename>中设定:
+ <programlisting>inetd_enable="YES"</programlisting> 或
+ <programlisting>inetd_enable="NO"</programlisting>
+ 可以激活或者禁止<application>inetd</application>在启动时加载。</para>
+
+ <para>此外,可以通过<literal>inetd_flags</literal>把不同的
+ 命令行参数传给<application>inetd</application>。</para>
+ </sect2>
+
+ <sect2 id="network-inetd-cmdline">
+ <title>命令行选项</title>
+
+ <para><application>inetd</application> 语法:</para>
+
+ <para><option> inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address | hostname]
+ [-p filename] [-R rate] [configuration file]</option></para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-d</term>
+
+ <listitem>
+ <para>打开调试选项。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-l</term>
+
+ <listitem>
+ <para>纪录成功的连接</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-w</term>
+
+ <listitem>
+ <para>为外部服务打开TCP Wrapping(默认)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-W</term>
+
+ <listitem>
+ <para>为<application>inetd</application>的内置服务打开TCP Wrapping (默认)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-c maximum</term>
+
+ <listitem>
+ <para>指定单个服务的最大并发访问数量,默认为不限。
+ 也可以在此服务的具体配置里面通过<option>max-child</option>改掉。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-C rate</term>
+
+ <listitem>
+ <para>指定单个服务一分钟内能被单个IP地址调用的最大次数,
+ 默认不限。也可以在此服务的具体配置里面通过<option>max-connections-per-ip-per-minute</option>
+ 改掉。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-R rate</term>
+
+ <listitem>
+ <para>指定单个服务一分钟内能被调用的最大次数,默认为256。
+ 设为0 则允许不限次数调用。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-a</term>
+
+ <listitem>
+ <para>指定绑定的IP地址。此外,可以使用主机名,这样系统就
+ 可以根据主机名对应的IPV4或者IPV6来选择绑定地址。通常当
+ <application>inetd</application> 在 &man.jail.8; 中运行
+ 的时候指定主机名,这种情况下主机名来自 &man.jail.8; 环
+ 境变量</para>
+
+ <para>当使用主机名方式时,如果IPV4和IPV6都会被绑定到服务,
+ 那么,需要在<filename>/etc/inetd.conf</filename>.中为该服务
+ 的每个对应协议添加一条记录。比如,一个TCP服务需要两条纪录,
+ 一条使用<literal>tcp4</literal>,另一条使用<literal>tcp6</literal>。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-p</term>
+
+ <listitem>
+ <para>指定用来存放进程ID的文件。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>以上选项在<filename>/etc/rc.conf</filename>中将可以
+ 被<literal>inetd_flags</literal>开关传递给<application>inetd</application>。
+ 默认情况下,<literal>inetd_flags</literal> 被置为
+ <literal>-wW</literal>,也既是对<application>inetd</application>的内置或外部服务打开TCP wrapping.
+ 对于新手,通常不用去动这些参数,就算它们出现在<filename>/etc/rc.conf</filename>里头。</para>
+
+ <note>
+ <para>对<application>inetd</application>而言,所谓外部服务是当
+ 连接请求到来时,被调用并接受连接,启动于inetd之外的守护进程。
+ 反之,内置服务则是那些<application>inetd</application>自己可
+ 以完全处理的了。</para>
+ </note>
+
+ </sect2>
+
+ <sect2 id="network-inetd-conf">
+ <title><filename>inetd.conf</filename></title>
+
+ <para><application>inetd</application>的配置通过
+ <filename>/etc/inetd.conf</filename>文件进行控制。</para>
+
+ <para>当
+ <filename>/etc/inetd.conf</filename>内容发生改变,可以
+ 对<application>inetd</application>进程发送一个HangUP信号,以强制
+ <application>inetd</application>重新读取配置文件,如下所示:</para>
+
+ <example id="network-inetd-hangup">
+ <title>对 <application>inetd</application>发送HangUP信号</title>
+
+ <screen>&prompt.root; <userinput>kill -HUP `cat /var/run/inetd.pid`</userinput></screen>
+ </example>
+
+ <para>配置文件中的每一行都是一个独立服务。如果要注释掉该服务,可以在行首加上
+ <quote>#</quote>。<filename>/etc/inetd.conf</filename>的格式如下:</para>
+
+ <programlisting>service-name
+socket-type
+protocol
+{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
+user[:group][/login-class]
+server-program
+server-program-arguments</programlisting>
+
+ <para><application>ftpd</application>使用IPv4的例子:</para>
+
+ <programlisting>ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l</programlisting>
+
+ <variablelist>
+ <varlistentry>
+ <term>service-name</term>
+
+ <listitem>
+ <para>指明各个服务的服务名。其服务名必须与<filename>/etc/services</filename>中列出的一致。
+ 这将决定<application>inetd</application>会监听哪个port。
+ 一旦有新的服务需要添加,必须先在<filename>/etc/services</filename>里面添加。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>socket-type</term>
+
+ <listitem>
+ <para>可以是<literal>stream</literal>、<literal>dgram</literal>、<literal>raw</literal>或者
+ <literal>seqpacket</literal>。 <literal>stream</literal>
+ 用在基于连接的,TCP 服务;而<literal>dgram</literal>被用于服务用于<acronym>UDP</acronym>传输协议。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>protocol</term>
+
+ <listitem>
+ <para>下列之一:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>协议</entry>
+ <entry>说明</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>tcp, tcp4</entry>
+ <entry>TCP IPv4</entry>
+ </row>
+ <row>
+ <entry>udp, udp4</entry>
+ <entry>UDP IPv4</entry>
+ </row>
+ <row>
+ <entry>tcp6</entry>
+ <entry>TCP IPv6</entry>
+ </row>
+ <row>
+ <entry>udp6</entry>
+ <entry>UDP IPv6</entry>
+ </row>
+ <row>
+ <entry>tcp46</entry>
+ <entry>Both TCP IPv4 and v6</entry>
+ </row>
+ <row>
+ <entry>udp46</entry>
+ <entry>Both UDP IPv4 and v6</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]</term>
+
+ <listitem>
+ <para><option>wait|nowait</option> 指明从<application>inetd</application>
+ 里头调用的服务是否可以自己处理socket.
+ <option>dgram</option>socket类型必须使用<option>wait</option>,
+ 而stream socket daemons, 由于通常使用多线程方式,应当使用
+ <option>nowait</option>. <option>wait</option> 通常usually
+ 把多个socket丢给单个服务进程, 而<option>nowait</option> 则
+ 会为每个新的socket生成一个子进程。</para>
+
+ <para>使用<option>max-child</option>选项可以设定针对服务,
+ <application>inetd</application>可以派生出来的最大子进程数量。
+ 如果某特定服务需要限定最高10个实例,把<literal>/10</literal>
+ 放到<option>nowait</option>后头就可以了。</para>
+
+ <para>在<option>max-child</option>之外,还有一个开关可以限制
+ 来自同一个地方,针对某个服务的最大连接数。这个开关就是:
+ <option>max-connections-per-ip-per-minute</option>。
+ 比如,设定该值为10就可以限定单个IP地址去向某服务的连接最大
+ 为每分钟十个。这个对于防止有意或者无意的资源耗尽或者拒绝服
+ 务(DoS)颇有用处。</para>
+
+ <para>在这部分,必须选择<option>wait</option>或
+ <option>nowait</option>。
+ <option>max-child</option>和
+ <option>max-connections-per-ip-per-minute</option> 则为可有可无。</para>
+
+ <para>一个stream-type多线程的服务,如果没有
+ <option>max-child</option>或者
+ <option>max-connections-per-ip-per-minute</option>需要,
+ 一般使用: <literal>nowait</literal>。</para>
+
+ <para>同样的服务,如果需要限制最大连接数,则如下:
+ <literal>nowait/10</literal>。</para>
+
+ <para>此外,如果要限制每分钟单个IP来访连接为20个,同时最多
+ 派生10个进程,可以如下:
+ <literal>nowait/10/20</literal>。</para>
+
+ <para>以上开关都默认被使用在<application>fingerd</application>服务上面,
+ 如下所示:</para>
+
+ <programlisting>finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s</programlisting>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>user</term>
+
+ <listitem>
+ <para>该开关指定服务将以什么用户身份运行。一般而言,服务运行身份是
+ <username>root</username>。基于安全目的,可以看到有些服务以
+ <username>daemon</username>身份,或者是最小特权的
+ <username>nobody</username>身份运行。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>server-program</term>
+
+ <listitem>
+ <para>当连接到来时,执行服务程序的全路径。如果服务是由
+ <application>inetd</application>内置提供的,以<option>internal</option>代替。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>server-program-arguments</term>
+
+ <listitem>
+ <para>当<option>server-program</option>调用到时,该开关
+ 的值通过<literal>argv[0]</literal>通过传递给服务而工作。
+ 如果命令行为:<command>mydaemon -d</command>,则
+ <literal>mydaemon -d</literal>为<option>server-program-arguments</option>
+ 开关的值。同样的,如果服务是由<application>inetd</application>
+ 内置提供的,这里还是
+ <option>internal</option>。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2 id="network-inetd-security">
+ <title>Security</title>
+
+ <para>随安装时候选择的安全模式不同,部分<application>inetd</application>的服务
+ 会被设为默认打开。如果没有确实的需要,禁止它们!只要在<filename>/etc/inetd.conf</filename>里头
+ 需要禁止的服务前头加上<quote>#</quote>,然后<link linkend="network-inetd-hangup">
+ 对inetd发送hangup信号</link>。某些服务,比如<application>fingerd</application>,
+ 由于对攻击者提供太多信息,可能对任何人都应该禁止。</para>
+
+ <para>某些服务在安全上没有考虑,并且有一些连接超时检测设得很长或没有检测机制。
+ 这回允许攻击者慢慢地发送连接,这样可以导致可用资源的消耗。在某些服务上面加上
+ <option>max-connections-per-ip-per-minute</option>和<option>max-child</option>
+ 的限制似乎不错。</para>
+
+ <para>默认情况下,TCP wrapping 是打开的。参考
+ &man.hosts.access.5; 手册,以获得更多关于在各种<application>inetd</application>
+ 调用的服务上设置TCP限制的信息。</para>
+ </sect2>
+
+ <sect2 id="network-inetd-misc">
+ <title>杂项</title>
+
+ <para><application>daytime</application>,
+ <application>time</application>,
+ <application>echo</application>,
+ <application>discard</application>,
+ <application>chargen</application>, 和
+ <application>auth</application> 都是<application>inetd</application>内置的服务。</para>
+
+ <para><application>auth</application>服务提供
+ identity (<application>ident</application>,
+ <application>identd</application>)网络服务,并且某种程度上可配置。</para>
+
+ <para>参考 &man.inetd.8; 手册获得更多信息。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-nfs">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Reorganized and enhanced by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Bill</firstname>
+ <surname>Swingle</surname>
+ <contrib>Written by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>网络文件系统(NFS)</title>
+
+ <indexterm><primary>NFS</primary></indexterm>
+ <para>网络文件系统是FreeBSD支持的文件系统中的一种,也被称为<acronym role="Network
+ File System">NFS</acronym>. <acronym role="Network File
+ System">NFS</acronym>允许一个系统在网络上与它人共享目录和文件。通过使用<acronym
+ role="Network File System">NFS</acronym>,用户和程序可以象访问本地文件
+ 一样访问远端系统上的文件。</para>
+
+ <para>以下是<acronym>NFS</acronym>最显而易见的好处:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一
+ 台机器上而且可以通过网络访问到。</para>
+ </listitem>
+
+ <listitem>
+ <para>用户不必在每个网络上机器里头都有一个home目录。Home目录
+ 可以被放在<acronym>NFS</acronym>服务器上并且在网络上处处可用。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>诸如软驱,CDROM,和 &iomegazip; 之类的存储设备可以在网络上面被别的机器使用。
+ 这可以减少整个网络上的可移动介质设备的数量。</para>
+ </listitem>
+ </itemizedlist>
+
+ <sect2>
+ <title><acronym>NFS</acronym>是如何工作的</title>
+
+ <para><acronym>NFS</acronym>至少有两个主要部分:一台服务器和一
+ 台(或者更多)客户机。客户机远程访问存放在服务器上的数据。为了
+ 正常工作,一些进程需要被配置并运行。</para>
+
+ <note><para>在 &os; 5.X上面,<application>portmap</application>
+ 被<application>rpcbind</application>替换了。而且,在&os; 5.X上面,
+ the user is required to replace every instance of
+ <application>portmap</application> with
+ <application>rpcbind</application> in the forthcoming
+ examples。</para></note>
+
+ <para>服务器必须运行以下服务:</para>
+ <indexterm>
+ <primary>NFS</primary>
+ <secondary>server</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>file server </primary>
+ <secondary>unix clients </secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary><application>portmap</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary><application>mountd</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary><application>nfsd</application></primary>
+ </indexterm>
+
+ <informaltable frame="none" pgwide="1">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="3*">
+
+ <thead>
+ <row>
+ <entry>服务</entry>
+ <entry>描述</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><application>nfsd</application></entry>
+ <entry><acronym>NFS</acronym>,为来自<acronym>NFS</acronym>客户端的
+ 请求服务。</entry>
+ </row>
+ <row>
+ <entry><application>mountd</application></entry>
+ <entry><acronym>NFS</acronym>挂载服务,处理&man.nfsd.8;递交过来的请求。</entry>
+ </row>
+ <row>
+ <entry><application>portmap</application></entry>
+ <entry> portmap服务允许
+ <acronym>NFS</acronym>客户端查看<acronym>NFS</acronym>服务在用的端口。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>客户端同样运行一些进程,比如
+ <application>nfsiod</application>。
+ <application>nfsiod</application>处理来自<acronym>NFS</acronym>的请求。
+ 这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。
+ 参考&man.nfsiod.8;手册获得更多信息。
+ </para>
+ </sect2>
+
+ <sect2 id="network-configuring-nfs">
+ <title>配置<acronym>NFS</acronym></title>
+ <indexterm>
+ <primary>NFS</primary>
+ <secondary>configuration</secondary>
+ </indexterm>
+
+ <para><acronym>NFS</acronym>的配置过程相对简单。这个过程只需要
+ 对<filename>/etc/rc.conf</filename>文件作一些简单修改。</para>
+
+ <para>在<acronym>NFS</acronym>服务器这端,确认<filename>/etc/rc.conf</filename>
+ 文件里头以下开关都配上了:</para>
+
+ <programlisting>portmap_enable="YES"
+nfs_server_enable="YES"
+mountd_flags="-r"</programlisting>
+
+ <para>只要<acronym>NFS</acronym>服务被置为enable,<application>mountd</application>
+ 就能自动运行。</para>
+
+ <para>在客户端一侧,确认下面这个开关出现在
+ <filename>/etc/rc.conf</filename>里头:</para>
+
+ <programlisting>nfs_client_enable="YES"</programlisting>
+
+ <para><filename>/etc/exports</filename>文件指定了哪个文件系统
+ <acronym>NFS</acronym>应该输出(有时被称为<quote>共享</quote>)。
+ <filename>/etc/exports</filename>里面每行指定一个输出的文件系统和
+ 哪些机器可以访问该文件系统。在指定机器访问权限的同时,访问选项
+ 开关也可以被指定。有很多开关可以被用在这个文件里头,不过不会在这
+ 里详细谈。您可以通过阅读&man.exports.5; 手册来发现这些开关。</para>
+
+ <para>以下是一些<filename>/etc/exports</filename>的例子:</para>
+
+ <indexterm>
+ <primary>NFS</primary>
+ <secondary>export examples</secondary>
+ </indexterm>
+
+ <para>紧接着的这个例子说明了如何输出一个文件系统,尽管具体设定和您
+ 的环境以及网络配置有关。作为实例,为了输出<filename>/cdrom</filename>
+ 到三个的例子机器,它们有同样域名(因此他们的域名不大对)或者在您的
+ <filename>/etc/hosts</filename>文件里头有纪录。<option>-ro</option>
+ 标志将被输出的文件系统置为只读。由于这个标志,远程系统将无法在被输出
+ 的文件系统上写入任何变动。</para>
+
+ <programlisting>/cdrom -ro host1 host2 host3</programlisting>
+
+ <para>下面的例子可以输出<filename>/home</filename>给三个以IP地址方式表示的主机。
+ 对于在没有配置<acronym>DNS</acronym>服务器的私有网络里头,这很有用。
+ 此外,the <filename>/etc/hosts</filename> 文件也可以用以配置主机名;参看 &man.hosts.5; 。
+ <option>-alldirs</option> 标记允许子目录被作为挂载点。
+ 也就是说,客户端可以根据需要挂载需要的目录。 </para>
+
+ <programlisting>/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4</programlisting>
+
+ <para>下面几行输出 <filename>/a</filename> ,以便两个来自不同域的客户端可以访问文件系统。
+ <option>-maproot=root</option> 标记授权远端系统上的
+ <username>root</username> 用户在被输出的文件系统上以<username>root</username>身份进行读写。
+ 如果没有特别指定 <literal>-maproot=root</literal> 标记,
+ 则即使用户在远端系统上是 <username>root</username> 身份,
+ 也不能修改被输出文件系统上的文件。 </para>
+
+ <programlisting>/a -maproot=root host.example.com box.example.org</programlisting>
+
+ <para> 为了能够访问到被输出的文件系统,客户端必须被授权。
+ 请确认客户端在您的 <filename>/etc/exports</filename> 被列出。 </para>
+
+ <para>在 <filename>/etc/exports</filename> 里头,每一行里面,输出信息和文件系统一一对应。
+ 一个远程主机每次只能对应一个文件系统。而且只能有一个默认入口。比如,假设
+ <filename>/usr</filename> 是独立的文件系统。这个 <filename>/etc/exports</filename> 就是无效的:</para>
+
+ <programlisting>/usr/src client
+/usr/ports client</programlisting>
+
+ <para>一个文件系统,<filename>/usr</filename>, 有两行指定输出到同一主机,
+ <hostid>client</hostid>.
+ 解决这一问题的正确的格式是:</para>
+
+ <programlisting>/usr/src /usr/ports client</programlisting>
+
+ <para>The properties of one filesystem exported to a given host
+ must all occur on one line. Lines without a client specified
+ are treated as a single host. This limits how you can export
+ filesystems, but for most people this is not an issue.</para>
+
+ <para>下面是一个有效输出列表的例子,
+ <filename>/usr</filename> and <filename>/exports</filename>
+ 是本地文件系统:</para>
+
+ <programlisting># Export src and ports to client01 and client02, but only
+# client01 has root privileges on it
+/usr/src /usr/ports -maproot=root client01
+/usr/src /usr/ports client02
+# The client machines have root and can mount anywhere
+# on /exports. Anyone in the world can mount /exports/obj read-only
+/exports -alldirs -maproot=root client01 client02
+/exports/obj -ro</programlisting>
+
+ <para>一旦修改 <filename>/etc/exports</filename> 了之后,
+ 为了让变动生效,您必须重启 <application>mountd</application>。
+ 可以通过对<command>mountd</command> 进程发送HUP信号重启:</para>
+
+ <screen>&prompt.root; <userinput>kill -HUP `cat /var/run/mountd.pid`</userinput></screen>
+
+ <para>另外,系统重启动可以让FreeBSD把一切都弄好。尽管如此,重启不是必须的。
+ 以 <username>root</username> 身份执行下面的命令可以搞定一切。</para>
+
+ <para>在 <acronym>NFS</acronym> 服务器端:</para>
+
+ <screen>&prompt.root; <userinput>portmap</userinput>
+&prompt.root; <userinput>nfsd -u -t -n 4</userinput>
+&prompt.root; <userinput>mountd -r</userinput></screen>
+
+ <para>在 <acronym>NFS</acronym> 客户端:</para>
+
+ <screen>&prompt.root; <userinput>nfsiod -n 4</userinput></screen>
+
+ <para>现在每件事情都应该就绪,以备挂载一个远端文件系统。 在这些例子里头,
+ 服务器名字将是:<hostid>server</hostid> ,而客户端的名字将是: <hostid>client</hostid>。
+ 如果您只打算临时挂载一个远端文件系统或者只是打算作测试配置正确与否,
+ 只要在客户端以 <username>root</username> 身份执行下面的命令:</para>
+ <indexterm>
+ <primary>NFS</primary>
+ <secondary>mounting</secondary>
+ </indexterm>
+ <screen>&prompt.root; <userinput>mount server:/home /mnt</userinput></screen>
+
+ <para>这条命令会把服务端的 <filename>/home</filename> 目录挂载到客户端的 <filename>/mnt</filename> 上。
+ 如果配置正确,您应该可以进入客户端的 <filename>/mnt</filename> 目录并且看到所有服务端的文件。 </para>
+
+ <para>如果您打算让系统每次在重启动的时候都自动挂载远端的文件系统,把那个文件系统加到
+ <filename>/etc/fstab</filename> 文件里头去。下面是例子:</para>
+
+ <programlisting>server:/home /mnt nfs rw 0 0</programlisting>
+
+ <para> &man.fstab.5; 手册里有所有可用的开关。</para>
+ </sect2>
+
+ <sect2>
+ <title>实际应用</title>
+
+ <para><acronym>NFS</acronym> 有很多实际应用。下面是比较常见的一些:</para>
+
+ <indexterm>
+ <primary>NFS</primary>
+ <secondary>uses</secondary>
+ </indexterm>
+ <itemizedlist>
+ <listitem>
+ <para>多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>在大型网络中,配置一台中心 <acronym>NFS</acronym> 服务器用来放置所有用户的home目录可能会带来便利。
+ 这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>几台机器可以有通用的<filename>/usr/ports/distfiles</filename> 目录。
+ 这样的话,当您需要在几台机器上安装port时,您可以无需在每台设备上下载而快速访问源码。
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2 id="network-amd">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Wylie</firstname>
+ <surname>Stilwell</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>Rewritten by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+ <title>使用 <application>amd</application> 自动挂载 ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="network-nfs-integration">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>John</firstname>
+ <surname>Lind</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+ <title>Problems Integrating with Other Systems ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-nis">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Bill</firstname>
+ <surname>Swingle</surname>
+ <contrib>Written by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Eric</firstname>
+ <surname>Ogren</surname>
+ <contrib>Enhanced by </contrib>
+ </author>
+ <author>
+ <firstname>Udo</firstname>
+ <surname>Erdelhoff</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Network Information System (NIS/YP) ** 翻译进行中 **</title>
+
+ <sect2 id="network-netgroups">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Udo</firstname>
+ <surname>Erdelhoff</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>Using Netgroups ** 翻译进行中 **</title>
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>Important Things to Remember ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="network-nis-server-is-client">
+ <title>NIS Servers That Are Also NIS Clients ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="network-dhcp">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Greg</firstname>
+ <surname>Sutter</surname>
+ <contrib>Written by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Automatic Network Configuration (DHCP) ** 翻译进行中 **</title>
+
+ <sect2 id="network-dhcp-server">
+ <title>Installing and Configuring a DHCP Server ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="network-dns">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Domain Name System (DNS)</title>
+
+ <sect2 id="network-named-sandbox">
+ <title>Running <application>named</application> in a Sandbox ** 翻译进行中 **</title>
+ <indexterm>
+ <primary>BIND</primary>
+ <secondary>running in a sandbox</secondary>
+ </indexterm>
+
+ <para></para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="network-apache">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Murray</firstname>
+ <surname>Stokely</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Apache HTTP Server ** 翻译进行中 **</title>
+
+ <indexterm><primary>web server</primary>
+ <secondary>setting up</secondary></indexterm>
+ <indexterm><primary>Apache</primary></indexterm>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="network-samba">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Murray</firstname>
+ <surname>Stokely</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>File and Print Services for &microsoft.windows; clients (Samba) ** 翻译进行中 **</title>
+
+ <indexterm><primary>Samba server</primary></indexterm>
+ <indexterm><primary>Microsoft Windows</primary></indexterm>
+ <indexterm>
+ <primary>file server</primary>
+ <secondary>Windows clients</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>print server</primary>
+ <secondary>Windows clients</secondary>
+ </indexterm>
+
+ <sect2>
+ <title>Overview ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="network-ntp">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Hukins</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Clock Synchronization with NTP ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect1>
+
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
+<!-- LocalWords: config mnt www -->
diff --git a/zh_CN.GB2312/books/handbook/pgpkeys/Makefile b/zh_CN.GB2312/books/handbook/pgpkeys/Makefile
new file mode 100644
index 0000000000..b92a3c3ccc
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/pgpkeys/Makefile
@@ -0,0 +1,20 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.3
+# $FreeBSD$
+#
+
+CHAPTERS= pgpkeys/chapter.sgml
+
+PGPKEYS!= perl -ne 'm/\"([\w-]+.key)\"/ && print "$$1\n"' \
+ ${DOC_PREFIX}/share/pgpkeys/pgpkeys.ent
+SRCS+= ${PGPKEYS}
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml b/zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml
new file mode 100644
index 0000000000..97b5c70cfe
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/pgpkeys/chapter.sgml
@@ -0,0 +1,873 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.242
+ $FreeBSD$
+-->
+<!--
+
+ Do not edit this file except as instructed by the addkey.sh script.
+
+ See the README file in doc/share/pgpkeys for instructions.
+
+-->
+<appendix id="pgpkeys">
+ <title>PGP公钥</title>
+
+ <indexterm><primary>pgp keys</primary></indexterm>
+ <para>有些时候,您可能需要校验签名或者发送加密的邮件给官员或者开发者,
+ 这里为了方便您而提供了一些密钥。完整的 <hostid role="domainname">FreeBSD.org</hostid> 用户密钥可以在
+ <ulink url="&url.base;/doc/pgpkeyring.txt">http://www.FreeBSD.org/doc/pgpkeyring.txt</ulink>
+ 下载。</para>
+
+ <sect1 id="pgpkeys-officers">
+ <title>官员</title>
+
+ <sect2 id="pgpkey-security-officer">
+ <title>&a.security-officer;</title>
+ &pgpkey.security-officer;
+ </sect2>
+
+ <sect2 id="pgpkey-core-secretary">
+ <title>&a.core-secretary;</title>
+ &pgpkey.core-secretary;
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="pgpkeys-core">
+ <title>核心团队成员</title>
+
+ <sect2 id="pgpkey-jhb">
+ <title>&a.jhb;</title>
+ &pgpkey.jhb;
+ </sect2>
+
+ <sect2 id="pgpkey-kuriyama">
+ <title>&a.kuriyama;</title>
+ &pgpkey.kuriyama;
+ </sect2>
+
+ <sect2 id="pgpkey-scottl">
+ <title>&a.scottl;</title>
+ &pgpkey.scottl;
+ </sect2>
+
+ <sect2 id="pgpkey-imp">
+ <title>&a.imp;</title>
+ &pgpkey.imp;
+ </sect2>
+
+ <sect2 id="pgpkey-wes">
+ <title>&a.wes;</title>
+ &pgpkey.wes;
+ </sect2>
+
+ <sect2 id="pgpkey-murray">
+ <title>&a.murray;</title>
+ &pgpkey.murray;
+ </sect2>
+
+ <sect2 id="pgpkey-peter">
+ <title>&a.peter;</title>
+ &pgpkey.peter;
+ </sect2>
+ </sect1>
+
+ <sect1 id="pgpkeys-developers">
+ <title>开发者</title>
+
+ <sect2 id="pgpkey-will">
+ <title>&a.will;</title>
+ &pgpkey.will;
+ </sect2>
+
+ <sect2 id="pgpkey-mat">
+ <title>&a.mat;</title>
+ &pgpkey.mat;
+ </sect2>
+
+ <sect2 id="pgpkey-asami">
+ <title>&a.asami;</title>
+ &pgpkey.asami;
+ </sect2>
+
+ <sect2 id="pgpkey-dougb">
+ <title>&a.dougb;</title>
+ &pgpkey.dougb;
+ </sect2>
+
+ <sect2 id="pgpkey-tobez">
+ <title>&a.tobez;</title>
+ &pgpkey.tobez;
+ </sect2>
+
+ <sect2 id="pgpkey-mbr">
+ <title>&a.mbr;</title>
+ &pgpkey.mbr;
+ </sect2>
+
+ <sect2 id="pgpkey-hart">
+ <title>&a.harti;</title>
+ &pgpkey.harti;
+ </sect2>
+
+ <sect2 id="pgpkey-obraun">
+ <title>&a.obraun;</title>
+ &pgpkey.obraun;
+ </sect2>
+
+ <sect2 id="pgpkey-jmb">
+ <title>&a.jmb;</title>
+ &pgpkey.jmb;
+ </sect2>
+
+ <sect2 id="pgpkey-brueffer">
+ <title>&a.brueffer;</title>
+ &pgpkey.brueffer;
+ </sect2>
+
+ <sect2 id="pgpkey-markus">
+ <title>&a.markus;</title>
+ &pgpkey.markus;
+ </sect2>
+
+ <sect2 id="pgpkey-wilko">
+ <title>&a.wilko;</title>
+ &pgpkey.wilko;
+ </sect2>
+
+ <sect2 id="pgpkey-perky">
+ <title>&a.perky;</title>
+ &pgpkey.perky;
+ </sect2>
+
+ <sect2 id="pgpkey-jon">
+ <title>&a.jon;</title>
+ &pgpkey.jon;
+ </sect2>
+
+ <sect2 id="pgpkey-luoqi">
+ <title>&a.luoqi;</title>
+ &pgpkey.luoqi;
+ </sect2>
+
+ <sect2 id="pgpkey-ache">
+ <title>&a.ache;</title>
+ &pgpkey.ache;
+ </sect2>
+
+ <sect2 id="pgpkey-seanc">
+ <title>&a.seanc;</title>
+ &pgpkey.seanc;
+ </sect2>
+
+ <sect2 id="pgpkey-cjh">
+ <title>&a.cjh;</title>
+ &pgpkey.cjh;
+ </sect2>
+
+ <sect2 id="pgpkey-cjc">
+ <title>&a.cjc;</title>
+ &pgpkey.cjc;
+ </sect2>
+
+ <sect2 id="pgpkey-marcus">
+ <title>&a.marcus;</title>
+ &pgpkey.marcus;
+ </sect2>
+
+ <sect2 id="pgpkey-nik">
+ <title>&a.nik;</title>
+ &pgpkey.nik;
+ </sect2>
+
+ <sect2 id="pgpkey-ceri">
+ <title>&a.ceri;</title>
+ &pgpkey.ceri;
+ </sect2>
+
+ <sect2 id="pgpkey-brooks">
+ <title>&a.brooks;</title>
+ &pgpkey.brooks;
+ </sect2>
+
+ <sect2 id="pgpkey-pjd">
+ <title>&a.pjd;</title>
+ &pgpkey.pjd;
+ </sect2>
+
+ <sect2 id="pgpkey-bsd">
+ <title>&a.bsd;</title>
+ &pgpkey.bsd;
+ </sect2>
+
+ <sect2 id="pgpkey-danfe">
+ <title>&a.danfe;</title>
+ &pgpkey.danfe;
+ </sect2>
+
+ <sect2 id="pgpkey-dd">
+ <title>&a.dd;</title>
+ &pgpkey.dd;
+ </sect2>
+
+ <sect2 id="pgpkey-ale">
+ <title>&a.ale;</title>
+ &pgpkey.ale;
+ </sect2>
+
+ <sect2 id="pgpkey-peadar">
+ <title>&a.peadar;</title>
+ &pgpkey.peadar;
+ </sect2>
+
+ <sect2 id="pgpkey-josef">
+ <title>&a.josef;</title>
+ &pgpkey.josef;
+ </sect2>
+
+ <sect2 id="pgpkey-ue">
+ <title>&a.ue;</title>
+ &pgpkey.ue;
+ </sect2>
+
+ <sect2 id="pgpkey-ru">
+ <title>&a.ru;</title>
+ &pgpkey.ru;
+ </sect2>
+
+ <sect2 id="pgpkey-le">
+ <title>&a.le;</title>
+ &pgpkey.le;
+ </sect2>
+
+ <sect2 id="pgpkey-stefanf">
+ <title>&a.stefanf;</title>
+ &pgpkey.stefanf;
+ </sect2>
+
+ <sect2 id="pgpkey-jedgar">
+ <title>&a.jedgar;</title>
+ &pgpkey.jedgar;
+ </sect2>
+
+ <sect2 id="pgpkey-green">
+ <title>&a.green;</title>
+ &pgpkey.green;
+ </sect2>
+
+ <sect2 id="pgpkey-lioux">
+ <title>&a.lioux;</title>
+ &pgpkey.lioux;
+ </sect2>
+
+ <sect2 id="pgpkey-fanf">
+ <title>&a.fanf;</title>
+ &pgpkey.fanf;
+ </sect2>
+
+ <sect2 id="pgpkey-blackend">
+ <title>&a.blackend;</title>
+ &pgpkey.blackend;
+ </sect2>
+
+ <sect2 id="pgpkey-petef">
+ <title>&a.petef;</title>
+ &pgpkey.petef;
+ </sect2>
+
+ <sect2 id="pgpkey-billf">
+ <title>&a.billf;</title>
+ &pgpkey.billf;
+ </sect2>
+
+ <sect2 id="pgpkey-patrick">
+ <title>&a.patrick;</title>
+ &pgpkey.patrick;
+ </sect2>
+
+ <sect2 id="pgpkey-gioria">
+ <title>&a.gioria;</title>
+ &pgpkey.gioria;
+ </sect2>
+
+ <sect2 id="pgpkey-jmg">
+ <title>&a.jmg;</title>
+ &pgpkey.jmg;
+ </sect2>
+
+ <sect2 id="pgpkey-dannyboy">
+ <title>&a.dannyboy;</title>
+ &pgpkey.dannyboy;
+ </sect2>
+
+ <sect2 id="pgpkey-dhartmei">
+ <title>&a.dhartmei;</title>
+ &pgpkey.dhartmei;
+ </sect2>
+
+ <sect2 id="pgpkey-jhay">
+ <title>&a.jhay;</title>
+ &pgpkey.jhay;
+ </sect2>
+
+ <sect2 id="pgpkey-sheldonh">
+ <title>&a.sheldonh;</title>
+ &pgpkey.sheldonh;
+ </sect2>
+
+ <sect2 id="pgpkey-mikeh">
+ <title>&a.mikeh;</title>
+ &pgpkey.mikeh;
+ </sect2>
+
+ <sect2 id="pgpkey-ghelmer">
+ <title>&a.ghelmer;</title>
+ &pgpkey.ghelmer;
+ </sect2>
+
+ <sect2 id="pgpkey-mux">
+ <title>&a.mux;</title>
+ &pgpkey.mux;
+ </sect2>
+
+ <sect2 id="pgpkey-mich">
+ <title>&a.mich;</title>
+ &pgpkey.mich;
+ </sect2>
+
+ <sect2 id="pgpkey-foxfair">
+ <title>&a.foxfair;</title>
+ &pgpkey.foxfair;
+ </sect2>
+
+ <sect2 id="pgpkey-jkh">
+ <title>&a.jkh;</title>
+ &pgpkey.jkh;
+ </sect2>
+
+ <sect2 id="pgpkey-trevor">
+ <title>&a.trevor;</title>
+ &pgpkey.trevor;
+ </sect2>
+
+ <sect2 id="pgpkey-phk">
+ <title>&a.phk;</title>
+ &pgpkey.phk;
+ </sect2>
+
+ <sect2 id="pgpkey-joe">
+ <title>&a.joe;</title>
+ &pgpkey.joe;
+ </sect2>
+
+ <sect2 id="pgpkey-vkashyap">
+ <title>&a.vkashyap;</title>
+ &pgpkey.vkashyap;
+ </sect2>
+
+ <sect2 id="pgpkey-kris">
+ <title>&a.kris;</title>
+ &pgpkey.kris;
+ </sect2>
+
+ <sect2 id="pgpkey-keramida">
+ <title>&a.keramida;</title>
+ &pgpkey.keramida;
+ </sect2>
+
+ <sect2 id="pgpkey-fjoe">
+ <title>&a.fjoe;</title>
+ &pgpkey.fjoe;
+ </sect2>
+
+ <sect2 id="pgpkey-andreas">
+ <title>&a.andreas;</title>
+ &pgpkey.andreas;
+ </sect2>
+
+ <sect2 id="pgpkey-sergei">
+ <title>&a.sergei;</title>
+ &pgpkey.sergei;
+ </sect2>
+
+ <sect2 id="pgpkey-maxim">
+ <title>&a.maxim;</title>
+ &pgpkey.maxim;
+ </sect2>
+
+ <sect2 id="pgpkey-jkoshy">
+ <title>&a.jkoshy;</title>
+ &pgpkey.jkoshy;
+ </sect2>
+
+ <sect2 id="pgpkey-rik">
+ <title>&a.rik;</title>
+ &pgpkey.rik;
+ </sect2>
+
+ <sect2 id="pgpkey-rushani">
+ <title>&a.rushani;</title>
+ &pgpkey.rushani;
+ </sect2>
+
+ <sect2 id="pgpkey-clement">
+ <title>&a.clement;</title>
+ &pgpkey.clement;
+ </sect2>
+
+ <sect2 id="pgpkey-mlaier">
+ <title>&a.mlaier;</title>
+ &pgpkey.mlaier;
+ </sect2>
+
+ <sect2 id="pgpkey-alex">
+ <title>&a.alex;</title>
+ &pgpkey.alex;
+ </sect2>
+
+ <sect2 id="pgpkey-erwin">
+ <title>&a.erwin;</title>
+ &pgpkey.erwin;
+ </sect2>
+
+ <sect2 id="pgpkey-leeym">
+ <title>&a.leeym;</title>
+ &pgpkey.leeym;
+ </sect2>
+
+ <sect2 id="pgpkey-netchild">
+ <title>&a.netchild;</title>
+ &pgpkey.netchild;
+ </sect2>
+
+ <sect2 id="pgpkey-lesi">
+ <title>&a.lesi;</title>
+ &pgpkey.lesi;
+ </sect2>
+
+ <sect2 id="pgpkey-glewis">
+ <title>&a.glewis;</title>
+ &pgpkey.glewis;
+ </sect2>
+
+ <sect2 id="pgpkey-delphij">
+ <title>&a.delphij;</title>
+ &pgpkey.delphij;
+ </sect2>
+
+ <sect2 id="pgpkey-ijliao">
+ <title>&a.ijliao;</title>
+ &pgpkey.ijliao;
+ </sect2>
+
+ <sect2 id="pgpkey-clive">
+ <title>&a.clive;</title>
+ &pgpkey.clive;
+ </sect2>
+
+ <sect2 id="pgpkey-clsung">
+ <title>&a.clsung;</title>
+ &pgpkey.clsung;
+ </sect2>
+
+ <sect2 id="pgpkey-arved">
+ <title>&a.arved;</title>
+ &pgpkey.arved;
+ </sect2>
+
+ <sect2 id="pgpkey-pav">
+ <title>&a.pav;</title>
+ &pgpkey.pav;
+ </sect2>
+
+ <sect2 id="pgpkey-bmah">
+ <title>&a.bmah;</title>
+ &pgpkey.bmah;
+ </sect2>
+
+ <sect2 id="pgpkey-mtm">
+ <title>&a.mtm;</title>
+ &pgpkey.mtm;
+ </sect2>
+
+ <sect2 id="pgpkey-dwmalone">
+ <title>&a.dwmalone;</title>
+ &pgpkey.dwmalone;
+ </sect2>
+
+ <sect2>
+ <title>&a.kwm;</title>
+ &pgpkey.kwm;
+ </sect2>
+
+ <sect2 id="pgpkey-matusita">
+ <title>&a.matusita;</title>
+ &pgpkey.matusita;
+ </sect2>
+
+ <sect2 id="pgpkey-ken">
+ <title>&a.ken;</title>
+ &pgpkey.ken;
+ </sect2>
+
+ <sect2 id="pgpkey-dinoex">
+ <title>&a.dinoex;</title>
+ &pgpkey.dinoex;
+ </sect2>
+
+ <sect2 id="pgpkey-sanpei">
+ <title>&a.sanpei;</title>
+ &pgpkey.sanpei;
+ </sect2>
+
+ <sect2 id="pgpkey-jim">
+ <title>&a.jim;</title>
+ &pgpkey.jim;
+ </sect2>
+
+ <sect2 id="pgpkey-marcel">
+ <title>&a.marcel;</title>
+ &pgpkey.marcel;
+ </sect2>
+
+ <sect2 id="pgpkey-marck">
+ <title>&a.marck;</title>
+ &pgpkey.marck;
+ </sect2>
+
+ <sect2 id="pgpkey-tmm">
+ <title>&a.tmm;</title>
+ &pgpkey.tmm;
+ </sect2>
+
+ <sect2 id="pgpkey-rich">
+ <title>&a.rich;</title>
+ &pgpkey.rich;
+ </sect2>
+
+ <sect2 id="pgpkey-knu">
+ <title>&a.knu;</title>
+ &pgpkey.knu;
+ </sect2>
+
+ <sect2 id="pgpkey-max">
+ <title>&a.max;</title>
+ &pgpkey.max;
+ </sect2>
+
+ <sect2 id="pgpkey-yoichi">
+ <title>&a.yoichi;</title>
+ &pgpkey.yoichi;
+ </sect2>
+
+ <sect2 id="pgpkey-bland">
+ <title>&a.bland;</title>
+ &pgpkey.bland;
+ </sect2>
+
+ <sect2 id="pgpkey-simon">
+ <title>&a.simon;</title>
+ &pgpkey.simon;
+ </sect2>
+
+ <sect2 id="pgpkey-anders">
+ <title>&a.anders;</title>
+ &pgpkey.anders;
+ </sect2>
+
+ <sect2 id="pgpkey-obrien">
+ <title>&a.obrien;</title>
+ &pgpkey.obrien;
+ </sect2>
+
+ <sect2 id="pgpkey-philip">
+ <title>&a.philip;</title>
+ &pgpkey.philip;
+ </sect2>
+
+ <sect2 id="pgpkey-hmp">
+ <title>&a.hmp;</title>
+ &pgpkey.hmp;
+ </sect2>
+
+ <sect2 id="pgpkey-mp">
+ <title>&a.mp;</title>
+ &pgpkey.mp;
+ </sect2>
+
+ <sect2 id="pgpkey-roam">
+ <title>&a.roam;</title>
+ &pgpkey.roam;
+ </sect2>
+
+ <sect2 id="pgpkey-den">
+ <title>&a.den;</title>
+ &pgpkey.den;
+ </sect2>
+
+ <sect2 id="pgpkey-pirzyk">
+ <title>&a.pirzyk;</title>
+ &pgpkey.pirzyk;
+ </sect2>
+
+ <sect2 id="pgpkey-jdp">
+ <title>&a.jdp;</title>
+ &pgpkey.jdp;
+ </sect2>
+
+ <sect2 id="pgpkey-krion">
+ <title>&a.krion;</title>
+ &pgpkey.krion;
+ </sect2>
+
+ <sect2 id="pgpkey-markp">
+ <title>&a.markp;</title>
+ &pgpkey.markp;
+ </sect2>
+
+ <sect2 id="pgpkey-thomas">
+ <title>&a.thomas;</title>
+ &pgpkey.thomas;
+ </sect2>
+
+ <sect2 id="pgpkey-hq">
+ <title>&a.hq;</title>
+ &pgpkey.hq;
+ </sect2>
+
+ <sect2 id="pgpkey-dfr">
+ <title>&a.dfr;</title>
+ &pgpkey.dfr;
+ </sect2>
+
+ <sect2 id="pgpkey-trhodes">
+ <title>&a.trhodes;</title>
+ &pgpkey.trhodes;
+ </sect2>
+
+ <sect2 id="pgpkey-benno">
+ <title>&a.benno;</title>
+ &pgpkey.benno;
+ </sect2>
+
+ <sect2 id="pgpkey-paul">
+ <title>&a.paul;</title>
+ &pgpkey.paul;
+ </sect2>
+
+ <sect2 id="pgpkey-roberto">
+ <title>&a.roberto;</title>
+ &pgpkey.roberto;
+ </sect2>
+
+ <sect2 id="pgpkey-guido">
+ <title>&a.guido;</title>
+ &pgpkey.guido;
+ </sect2>
+
+ <sect2 id="pgpkey-niklas">
+ <title>&a.niklas;</title>
+ &pgpkey.niklas;
+ </sect2>
+
+ <sect2 id="pgpkey-marks">
+ <title>&a.marks;</title>
+ &pgpkey.marks;
+ </sect2>
+
+ <sect2 id="pgpkey-hrs">
+ <title>&a.hrs;</title>
+ &pgpkey.hrs;
+ </sect2>
+
+ <sect2 id="pgpkey-wosch">
+ <title>&a.wosch;</title>
+ &pgpkey.wosch;
+ </sect2>
+
+ <sect2 id="pgpkey-das">
+ <title>&a.das;</title>
+ &pgpkey.das;
+ </sect2>
+
+ <sect2 id="pgpkey-schweikh">
+ <title>&a.schweikh;</title>
+ &pgpkey.schweikh;
+ </sect2>
+
+ <sect2 id="pgpkey-gshapiro">
+ <title>&a.gshapiro;</title>
+ &pgpkey.gshapiro;
+ </sect2>
+
+ <sect2 id="pgpkey-arun">
+ <title>&a.arun;</title>
+ &pgpkey.arun;
+ </sect2>
+
+ <sect2 id="pgpkey-vanilla">
+ <title>&a.vanilla;</title>
+ &pgpkey.vanilla;
+ </sect2>
+
+ <sect2 id="pgpkey-cshumway">
+ <title>&a.cshumway;</title>
+ &pgpkey.cshumway;
+ </sect2>
+
+ <sect2 id="pgpkey-demon">
+ <title>&a.demon;</title>
+ &pgpkey.demon;
+ </sect2>
+
+ <sect2 id="pgpkey-jesper">
+ <title>&a.jesper;</title>
+ &pgpkey.jesper;
+ </sect2>
+
+ <sect2 id="pgpkey-scop">
+ <title>&a.scop;</title>
+ &pgpkey.scop;
+ </sect2>
+
+ <sect2 id="pgpkey-glebius">
+ <title>&a.glebius;</title>
+ &pgpkey.glebius;
+ </sect2>
+
+ <sect2 id="pgpkey-kensmith">
+ <title>&a.kensmith;</title>
+ &pgpkey.kensmith;
+ </sect2>
+
+ <sect2 id="pgpkey-ben">
+ <title>&a.ben;</title>
+ &pgpkey.ben;
+ </sect2>
+
+ <sect2 id="pgpkey-des">
+ <title>&a.des;</title>
+ &pgpkey.des;
+ </sect2>
+
+ <sect2 id="pgpkey-sobomax">
+ <title>&a.sobomax;</title>
+ &pgpkey.sobomax;
+ </sect2>
+
+ <sect2 id="pgpkey-dcs">
+ <title>&a.dcs;</title>
+ &pgpkey.dcs;
+ </sect2>
+
+ <sect2 id="pgpkey-brian">
+ <title>&a.brian;</title>
+ &pgpkey.brian;
+ </sect2>
+
+ <sect2 id="pgpkey-nsouch">
+ <title>&a.nsouch;</title>
+ &pgpkey.nsouch;
+ </sect2>
+
+ <sect2 id="pgpkey-ssouhlal">
+ <title>&a.ssouhlal;</title>
+ &pgpkey.ssouhlal;
+ </sect2>
+
+ <sect2 id="pgpkey-vs">
+ <title>&a.vs;</title>
+ &pgpkey.vs;
+ </sect2>
+
+ <sect2 id="pgpkey-gsutter">
+ <title>&a.gsutter;</title>
+ &pgpkey.gsutter;
+ </sect2>
+
+ <sect2 id="pgpkey-metal">
+ <title>&a.metal;</title>
+ &pgpkey.metal;
+ </sect2>
+
+ <sect2 id="pgpkey-nyan">
+ <title>&a.nyan;</title>
+ &pgpkey.nyan;
+ </sect2>
+
+ <sect2 id="pgpkey-mi">
+ <title>&a.mi;</title>
+ &pgpkey.mi;
+ </sect2>
+
+ <sect2 id="pgpkey-gordon">
+ <title>&a.gordon;</title>
+ &pgpkey.gordon;
+ </sect2>
+
+ <sect2 id="pgpkey-lth">
+ <title>&a.lth;</title>
+ &pgpkey.lth;
+ </sect2>
+
+ <sect2 id="pgpkey-thierry">
+ <title>&a.thierry;</title>
+ &pgpkey.thierry;
+ </sect2>
+
+ <sect2 id="pgpkey-viny">
+ <title>&a.viny;</title>
+ &pgpkey.viny;
+ </sect2>
+
+ <sect2 id="pgpkey-nectar">
+ <title>&a.nectar;</title>
+ &pgpkey.nectar;
+ </sect2>
+
+ <sect2 id="pgpkey-adamw">
+ <title>&a.adamw;</title>
+ &pgpkey.adamw;
+ </sect2>
+
+ <sect2 id="pgpkey-nate">
+ <title>&a.nate;</title>
+ &pgpkey.nate;
+ </sect2>
+
+ <sect2 id="pgpkey-wollman">
+ <title>&a.wollman;</title>
+ &pgpkey.wollman;
+ </sect2>
+
+ <sect2 id="pgpkey-joerg">
+ <title>&a.joerg;</title>
+ &pgpkey.joerg;
+ </sect2>
+
+ <sect2 id="pgpkey-bz">
+ <title>&a.bz;</title>
+ &pgpkey.bz;
+ </sect2>
+
+ <sect2 id="pgpkey-phantom">
+ <title>&a.phantom;</title>
+ &pgpkey.phantom;
+ </sect2>
+
+ </sect1>
+</appendix>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../appendix.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "appendix")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/ports/Makefile b/zh_CN.GB2312/books/handbook/ports/Makefile
new file mode 100644
index 0000000000..c7f468104e
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/ports/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= ports/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/ports/chapter.sgml b/zh_CN.GB2312/books/handbook/ports/chapter.sgml
new file mode 100644
index 0000000000..c6329b8f75
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/ports/chapter.sgml
@@ -0,0 +1,1113 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Documentation Project
+
+ Original Revision: 1.227
+ $FreeBSD$
+-->
+
+<chapter id="ports">
+ <title>安装应用程序: Packages 和 Ports</title>
+
+ <sect1 id="ports-synopsis">
+ <title>概述</title>
+
+ <indexterm><primary>ports</primary></indexterm>
+ <indexterm><primary>packages</primary></indexterm>
+ <para>FreeBSD 捆绑了很多系统工具作为基本系统的一部分。然而,在实际工作中,
+ 您可能仍需要安装额外的第三方应用程序。 FreeBSD
+ 提供了两种安装第三方应用程序的方法: FreeBSD ports collection 和二进制软件包
+ (package)。 无论用哪种方式, 您都可以从本地媒体 (设备)
+ 或直接通过网络来安装您喜欢的最新版本的应用程序。</para>
+
+ <para>读完这章,您将了解到:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如何安装第三方的二进制软件包。</para>
+ </listitem>
+ <listitem>
+ <para>如何从ports collection安装第三方软件。</para>
+ </listitem>
+ <listitem>
+ <para>如何删除先前安装的软件包。</para>
+ </listitem>
+ <listitem>
+ <para>如何改动ports collection里面的一些参数,定制软件使用。</para>
+ </listitem>
+ <listitem>
+ <para>如何找到您需要的软件包。</para>
+ </listitem>
+ <listitem>
+ <para>如何升级您的ports。</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="ports-overview">
+ <title>软件安装预览</title>
+
+ <para>如果您以前使用过 &unix; 系统,那典型的第三方软件安装的步骤是像下面描述的:</para>
+
+ <procedure>
+ <step>
+ <para>下载这个软件,软件的发行版可能是源代码格式,或是一个二进制包。</para>
+ </step>
+
+ <step>
+ <para>解开软件(其中代表性的是用 &man.compress.1;, &man.gzip.1;, 或
+ &man.bzip2.1; 压缩过的tar包)。</para>
+ </step>
+
+ <step>
+ <para>阅读相关文档,了解如何安装。 (多半一个文件名是<filename>INSTALL</filename>或<filename>README</filename>,
+ 或在<filename>doc/</filename> 目录下的一些文档)</para>
+ </step>
+
+ <step>
+ <para>如果软件是以源代码形式发布的,那就需要编译它。可能需要编辑一个
+ <filename>Makefile</filename>文件, 或运行
+ <command>configure</command>脚本,和其他的一些工作。</para>
+ </step>
+
+ <step>
+ <para>测试和安装软件。</para>
+ </step>
+ </procedure>
+
+ <para>如果一切顺利的话,就这么简单。如果您在安装一个软件包时发生一些错误,
+ 您可能需要编辑一下它的代码,以使它能正常工作。</para>
+
+ <para>您可以继续使用 <quote>传统的</quote>方式安装软件。 然而, FreeBSD
+ 提供了两种技术: packages 和 ports。 就在写这篇文章的时候,
+ 已经有超过 &os.numports; 个第三方的应用程序可以使用了。</para>
+
+ <para>对于任意一个应用程序包,是一个可以下载的FreeBSD package文件。这个
+ FreeBSD package包含了编译好的的副本, 还有一些配置文件或文档。
+ 一个下载的包文件可以用 FreeBSD 的包管理命令来操作, 例如
+ &man.pkg.add.1;,&man.pkg.delete.1;, &man.pkg.info.1; 等等。
+ 可以使用一个简单的命令安装一个新的应用程序。</para>
+
+ <para>一个FreeBSD的port是一个可以自动从源代码编译成应用程序的文件集合。</para>
+
+ <para>记住,如果您自己来编译的话,需要执行很多步的操作 (解压, 补丁, 编译,
+ 安装)。 这些整理 port 的文件集合包含了系统需要完成这个工作的必需信息。
+ 您可以运行一些简单的命令, 那些源代码就可以自动地下载, 解开, 打补丁,
+ 编译, 直至安装完成。</para>
+
+ <para>实际上,ports 系统也能做出被 <command>pkg_add</command>
+ 的程序包和不久就要讲到的其他包管理命令来安装的软件包。</para>
+
+ <para>Packages 和 ports 是互相 <emphasis>依赖</emphasis> 的。
+ 假设您想安装一个依赖于已经安装的特定库的应用程序。
+ 应用程序和那个库都已经应用于 FreeBSD ports 和 packages。
+ 如果您使用 <command></command> 命令或 ports 系统来添加应用程序,
+ 两个都必须注意库是否被安装, 如果没有, 它会自动先安装库。</para>
+
+ <para>这里给出的两种技术是很相似的,您可能会奇怪为什么 FreeBSD
+ 会弄出这两种技术。 其实, packages 和 ports 都有它们自己的长处,
+ 使用哪一种完全取决于您自己的喜好。</para>
+
+ <itemizedlist>
+ <title>Package的优点</title>
+
+ <listitem>
+ <para>一个压缩的 package 通常要比一个压缩的包含源代码的应用程序小得多。</para>
+ </listitem>
+
+ <listitem>
+ <para>package 不需要进行额外的编译。 对于大型应用程序如
+ <application>Mozilla</application>, <application>KDE</application> 或
+ <application>GNOME</application> 来说这显得尤为重要,
+ 特别是在您的系统资源比较差的情况下。</para>
+ </listitem>
+
+ <listitem>
+ <para>package不需要您知道如何在FreeBSD上编译软件的详细过程。</para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist>
+ <title>Ports 的优点</title>
+
+ <listitem>
+ <para>package 在编译时通常使用比较保守的选项,
+ 这是为了保证它们能够运行在大多数的系统上。 通过从 port 安装,
+ 您可以细微调整编译选项来产生适合于处理器的代码 (针对于 Pentium IV
+ 或 AMD 的 Athlon CPU)。</para>
+ </listitem>
+
+ <listitem>
+ <para>一些软件包已经把与它们相关的能做和不能做的事情的选项都编译进去了。
+ 例如, <application>Apache</application> 可能就配置了很多的选项。
+ 从 port 中安装时, 您不一定要接受默认的选项, 可以自己来设置。</para>
+
+ <para>在一些例子中,一个软件有不同的配置存在多个package。 例如,
+ <application>Ghostscript</application>存在
+ <filename>ghostscript</filename> package 和
+ <filename>ghostscript-nox11</filename> package两个配置package,
+ 这取决于您是否安装了X11服务器。 这样的调整对package是可能的,
+ 但如果一个应用程序有超过一个或两个不同的编译时间选项时, 就不行了。</para>
+ </listitem>
+
+ <listitem>
+ <para>一些软件的许可条件禁止采用二进制形式发行。 它们必须带上源代码。</para>
+ </listitem>
+
+ <listitem>
+ <para>一些人不信任二进制发行形式。 至少有了源代码, (理论上)
+ 可以亲自阅读它,寻找潜在的问题。</para>
+ </listitem>
+
+ <listitem>
+ <para>如果您要自己对软件打补丁,您就需要有源代码。</para>
+ </listitem>
+
+ <listitem>
+ <para>一些人喜欢整天围着源代码转, 所以他们喜欢亲自阅读源代码,
+ 修改源代码等等。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>保持更新 ports, 订阅邮件列表 &a.ports; 和递交错误报告 &a.ports-bugs;。</para>
+
+ <warning>
+ <para>在安装任何应用程序之前,应该首先检查 <ulink
+ url="http://vuxml.freebsd.org/"></ulink>
+ 上是否有与所安装的应用程序有关的安全问题报告。</para>
+
+ <para>另外,也可以安装 <filename
+ role="package">security/portaudit</filename>。
+ 除了可以自动地检测所有已经安装的软件中是否有已知的安全漏洞之外,
+ 在开始编译新的 port 之前它也会检查是否存在已知的问题。
+ 另外,在安装了一些软件包之后,也可以使用 <command>portaudit
+ -F -a</command> 来强制系统作一下检查。</para>
+ </warning>
+
+ <para>这章的其余部分将介绍如何使用packages和ports来安装和管理第三方软件。</para>
+ </sect1>
+
+ <sect1 id="ports-finding-applications">
+ <title>寻找您要的应用程序</title>
+
+ <para>在您安装任何应用程序之前,需要知道您需要什么,那个应用程序叫什么。</para>
+
+ <para>FreeBSD中可用的应用程序正在不断地增长着。幸运的是,
+ 有许多方法可以找到您所需要的程序:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>FreeBSD站点上有一个可以搜索到的当前所有可用的应用程序列表,在 <ulink
+ url="&url.base;/ports/index.html">http://www.FreeBSD.org/ports/</ulink>。
+ 它分很多种类,您既可以通过程序的名称来搜索,
+ 也可以在分类中列出所有可用的应用程序 (如果您知道名字),
+ 也可以在分类中列出所有可用的应用程序。</para>
+ </listitem>
+
+ <indexterm><primary>FreshPorts</primary></indexterm>
+
+ <listitem>
+ <para>Dan Langille 维护着网站 FreshPorts,在 <ulink
+ url="http://www.FreshPorts.org/"></ulink>。 FreshPort时刻 <quote>追踪</quote>
+ 着在 ports 中应用程序的变化。当有任何程序被升级时,他们就会发 email 提醒您。</para>
+ </listitem>
+
+ <indexterm><primary>FreshMeat</primary></indexterm>
+
+ <listitem>
+ <para>I如果您不知道您想要的应用程序的名字,可以通过 (<ulink
+ url="http://www.freshmeat.net/"></ulink>) 网站来查找,
+ 如果找到了应用程序, 您可以回 FreeBSD 的主站去看一下这个应用程序是否已经被
+ port 进去了。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>如果您知道一个port的准确名字, 但需要知道在哪个类别里面能找到它,您可以使用
+ &man.whereis.1; 这个命令。简单地输入 <command>whereis
+ <replaceable>file</replaceable></command>,
+ <replaceable>file</replaceable> 就是您想安装的程序名字。
+ 如果系统找到了它, 您将被告知在它在哪里, 例如:</para>
+
+ <screen>&prompt.root; <userinput>whereis lsof</userinput>
+lsof: /usr/ports/sysutils/lsof</screen>
+
+ <para>结果告诉我们这个命令<command>lsof</command> (一个系统配置程序)可以在
+ <filename>/usr/ports/sysutils/lsof</filename>目录中找到。</para></listitem>
+
+ <listitem>
+ <para>还有另外的一个寻找您需要的port的方法--是用ports collecton
+ 内嵌的搜索机制。要使用这个搜索, 您需要先到
+ <filename>/usr/ports</filename>目录下面。 在那个目录里面,
+ 运行<command>make search
+ name=<replaceable>program-name</replaceable></command>,
+ <replaceable>program-name</replaceable> 就是您想寻找的程序名字。
+ 举个例子, 如果您想找 <command>lsof</command>:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports</userinput>
+&prompt.root; <userinput>make search name=lsof</userinput>
+Port: lsof-4.56.4
+Path: /usr/ports/sysutils/lsof
+Info: Lists information about open files (similar to fstat(1))
+Maint: obrien@FreeBSD.org
+Index: sysutils
+B-deps:
+R-deps: </screen>
+
+ <para>在输出的内容里面您要特别注意包含 <quote>Path:</quote>
+ 的这行将告诉您在哪里可以找到这个 port。 如果要安装此 port,
+ 那其他输出的信息不是必须的, 但是还是显示输出了。</para>
+
+ <para>为了更深入的搜索,您还可以用 <command>make
+ search key=<replaceable>string</replaceable></command>,
+ <replaceable>string</replaceable>就是您想搜索的部分内容。
+ 它将搜索port的名字、 注释, 描述和从属关系,
+ 如果您不知道您想搜索的程序名字,
+ 可以利用它搜索一些关键主题来找到您需要的。</para>
+
+ <para>上面说的这些方法, 搜索的关键字没有大小写区分的。
+ 搜索 <quote>LSOF</quote>的结果将和搜索<quote>lsof</quote>的结果一样。</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="packages-using">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 30 Mar 2001 -->
+ </sect1info>
+
+ <title>使用Packages系统</title>
+
+ <sect2>
+ <title>一个package的安装</title>
+ <indexterm>
+ <primary>packages</primary>
+ <secondary>installing</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary><command>pkg_add</command></primary>
+ </indexterm>
+ <para>您可以用 &man.pkg.add.1;
+ 这个命令从本地文件或网络上的服务器来安装一个 FreeBSD 软件包。</para>
+
+ <example>
+ <title>在本地手动下载一个package,并安装它</title>
+
+ <screen>&prompt.root; <userinput>ftp -a <replaceable>ftp2.FreeBSD.org</replaceable></userinput>
+Connected to ftp2.FreeBSD.org.
+220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready.
+331 Guest login ok, send your email address as password.
+230-
+230- This machine is in Vienna, VA, USA, hosted by Verio.
+230- Questions? E-mail freebsd@vienna.verio.net.
+230-
+230-
+230 Guest login ok, access restrictions apply.
+Remote system type is UNIX.
+Using binary mode to transfer files.
+<prompt>ftp></prompt> <userinput>cd /pub/FreeBSD/ports/packages/sysutils/</userinput>
+250 CWD command successful.
+<prompt>ftp></prompt> <userinput>get lsof-4.56.4.tgz</userinput>
+local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz
+200 PORT command successful.
+150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes).
+100% |**************************************************| 92375 00:00 ETA
+226 Transfer complete.
+92375 bytes received in 5.60 seconds (16.11 KB/s)
+<prompt>ftp></prompt> <userinput>exit</userinput>
+&prompt.root; <userinput>pkg_add <replaceable>lsof-4.56.4.tgz</replaceable></userinput></screen>
+ </example>
+
+ <para>如果您没有本地package的安装盘 (如 FreeBSD CD-ROM),
+ 可以执行 &man.pkg.add.1; 命令并加上 <option>-r</option> 选项。
+ 这将迫使程序自动决定目标文件的正确格式和版本,
+ 然后自动从一个 FTP 站点寻找和安装 package。</para>
+
+ <indexterm>
+ <primary><command>pkg_add</command></primary></indexterm>
+ <screen>&prompt.root; <userinput>pkg_add -r <replaceable>lsof</replaceable></userinput></screen>
+
+ <para>上面的例子将下载正确的package, 而不需要用户的干预就可以安装。
+ 如果您想指定 FreeBSD package 的镜像站点, 替换主站点, 您必须新设置
+ <envar>PACKAGESITE</envar> 这个环境变量, 覆盖原来的设置。
+ &man.pkg.add.1; 使用 &man.fetch.3; 下载文件, 可以使用多种环境变量,
+ 包含 <envar>FTP_PASSIVE_MODE</envar>、 <envar>FTP_PROXY</envar>,
+ 和 <envar>FTP_PASSWORD</envar>。 如果您使用 FTP/HTTP
+ 代理或在防火墙后面, 您可能需要设置这些环境变量。
+ 详细的列表请参考 &man.fetch.3;。上述例子中用 <literal>lsof</literal>
+ 替代了 <literal>lsof-4.56.4</literal>。 当使用远程安装 Package
+ 的时候软件名字不需要包含版本号。 &man.pkg.add.1;
+ 将自动的找到这个软件最新的版本。</para>
+
+ <note>
+ <para>如果您使用 &os.current; 或 &os.stable;版本的FreeBSD, &man.pkg.add.1;
+ 将下载您的应用软件的最新版本。 如果您使用 -RELEASE 版本的
+ FreeBSD, 它将会获得与您的版本相应的软件包版本。
+ 如果您更改了 <envar>PACKAGESITE</envar>
+ 这个环境变量可能会发生不同的情况。</para>
+ </note>
+
+ <para>软件包采用 <filename>.tgz</filename> 和 <filename>.tbz</filename>
+ 两种格式。您可以在 <ulink
+ url="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/"></ulink>
+ 下面或从 FreeBSD 的发行光盘找到, 它在每一个 4CD 的 FreeBSD 发行版的
+ <filename>/packages</filename>目录中。 软件包的设计规划与
+ <filename>/usr/ports</filename> 树一致。 每个分类都有自己的目录,
+ 所有的软件包可以在目录 <filename>All</filename>中找到。
+ </para>
+
+ <para>软件包系统的目录结构与ports的设计规划一致; 它们共同构成了整个 package/port。
+ </para>
+
+ </sect2>
+
+ <sect2>
+ <title>软件包的管理</title>
+
+ <indexterm>
+ <primary>packages</primary>
+ <secondary>managing</secondary>
+ </indexterm>
+ <para>&man.pkg.info.1; 是用于列出已安装的所有软件包列表和描述的程序。
+ </para>
+
+ <indexterm>
+ <primary><command>pkg_info</command></primary>
+ </indexterm>
+ <screen>&prompt.root; <userinput>pkg_info</userinput>
+cvsup-16.1 A general network file distribution system optimized for CV
+docbook-1.2 Meta-port for the different versions of the DocBook DTD
+...</screen>
+ <para>&man.pkg.version.1;是一个用来统计所有安装的软件包版本的工具。
+ 它可以用来比较本地 package 的版本与 ports 目录中的当前版本是否一致。
+ </para>
+ <indexterm>
+ <primary><command>pkg_version</command></primary>
+ </indexterm>
+ <screen>&prompt.root; <userinput>pkg_version</userinput>
+cvsup =
+docbook =
+...</screen>
+
+ <para>在第二列的符号指出了安装版本的相关时间和本地ports目录树中可用的版本。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>符号</entry>
+ <entry>含义</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>=</entry> <entry>在本地ports树中与已安装的软件包版本相匹配。</entry>
+ </row>
+
+ <row><entry>&lt;</entry>
+ <entry>已安装的版本要比在ports树中的版本旧。</entry>
+ </row>
+
+ <row><entry>&gt;</entry><entry>已安装的版本要比在ports树中的版本新
+ (本地的port树可能没有更新)。</entry></row>
+
+ <row><entry>?</entry><entry> 已安装的软件包无法在ports索引中找到。
+ (可能发生这种事情,举个例子, 您早先安装的一个 port 从 port
+ 树中移出或改名了)</entry></row>
+
+ <row><entry>*</entry><entry>软件包有很多版本。</entry></row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2>
+ <title>删除一个软件包</title>
+ <indexterm>
+ <primary><command>pkg_delete</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary>packages</primary>
+ <secondary>deleting</secondary>
+ </indexterm>
+ <para>要删除先前安装的软件package,只要使用&man.pkg.delete.1; 工具。
+
+ </para>
+
+ <screen>&prompt.root; <userinput>pkg_delete <replaceable>xchat-1.7.1</replaceable></userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>其它</title>
+ <para>所有已安装的 package 信息都保存在 <filename>/var/db/pkg</filename>
+ 目录下。 安装文件的列表和每个 package
+ 的内容和描述都能在这个目录的相关文件中找到。
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="ports-using">
+ <title>使用Ports Collection</title>
+
+ <para>下面的章节提供了使用ports collection来安装或卸载程序的基本用法。</para>
+
+ <sect2 id="ports-tree">
+ <title>获得Ports Collection</title>
+
+ <para>在您能使用ports之前, 您必须先获得 ports collection &mdash;
+ 本质上是 <filename>/usr/ports</filename> 目录下的一堆
+ <filename>Makefile</filename>、 补丁和描述文件。
+ </para>
+
+ <para>在您安装 FreeBSD 系统的时候, <application>sysinstall</application>
+ 会询问您是否需要安装 ports collection。 如果您选择 no,
+ 那您可以用下面的指令来安装ports collection:</para>
+
+ <procedure>
+ <title>Sysinstall 方式</title>
+
+ <para>这种方式使用 <application>sysinstall</application>
+ 再次手动安装ports collection。</para>
+
+ <step>
+ <para>用<username>root</username>用户, 运行
+ <command>/stand/sysinstall</command>命令,像下面显示的:</para>
+
+ <screen>&prompt.root; <userinput>/stand/sysinstall</userinput></screen>
+ </step>
+
+ <step>
+ <para>选择 <guimenuitem>Configure</guimenuitem>, 按 <keycap>Enter</keycap>。</para>
+ </step>
+
+ <step>
+ <para>选择 <guimenuitem>Distributions</guimenuitem>, 按 <keycap>Enter</keycap>。</para>
+ </step>
+
+ <step>
+ <para>选择 <guimenuitem>ports</guimenuitem>, 按 <keycap>Space</keycap>。</para>
+ </step>
+
+ <step>
+ <para>选择 <guimenuitem>Exit</guimenuitem>, 按 <keycap>Enter</keycap>。</para>
+ </step>
+
+ <step>
+ <para>选择您的安装介质,就像CDROM,FTP,等等</para>
+ </step>
+
+ <step>
+ <para>选择 <guimenuitem>Exit</guimenuitem> 并按 <keycap>Enter</keycap>。</para>
+ </step>
+
+ <step>
+ <para>按 <keycap>X</keycap> 键退出 <application>sysinstall</application>。</para>
+ </step>
+ </procedure>
+
+ <para>您可以使用 <application>CVSup</application>,这个程序让您获得和更新
+ ports collection。 <application>CVSup</application> 需要使用
+ <filename>/usr/share/examples/cvsup/ports-supfile</filename> 这个配置文件。
+ 如果您想获得关于 <application>CVSup</application> 这个应用程序的更多信息,
+ 请看 <link linkend="cvsup">使用 CVSup</link> (<xref linkend="cvsup">) 和本文。</para>
+
+ <procedure>
+ <title>CVSup 方法</title>
+
+ <para>使用 <application>CVSup</application> 获得 ports collection,
+ 是一个非常快捷的方法。 如果您想保持您的 ports 树的最新状态,
+ 或了解更多关于 <application>CVSup</application>
+ 的内容, 您可以阅读刚才提及的内容。</para>
+
+ <step>
+ <para>安装<filename role="package">net/cvsup</filename> port。详情请参阅<link
+ linkend="cvsup-install">CVSup 安装</link> (<xref
+ linkend="cvsup-install">) 。</para>
+ </step>
+
+ <step>
+ <para>用 <username>root</username> 用户, 复制
+ <filename>/usr/share/examples/cvsup/ports-supfile</filename>
+ 到一个新的地方, 比如 <filename>/root</filename> 或您的家目录。</para>
+ </step>
+
+ <step>
+ <para>编辑 <filename>ports-supfile</filename>。</para>
+ </step>
+
+ <step>
+ <para>把 <replaceable>CHANGE_THIS.FreeBSD.org</replaceable> 改为离您比较近的
+ <application>CVSup</application> 服务器。 您可以参考
+ <link linkend="cvsup-mirrors">CVSup 镜像</link> (<xref
+ linkend="cvsup-mirrors">) 服务器的完整列表。</para>
+ </step>
+
+ <step>
+ <para>运行 <command>cvsup</command>:</para>
+
+ <screen>&prompt.root; <userinput>cvsup -g -L 2 <replaceable>/root/ports-supfile</replaceable></userinput></screen>
+ </step>
+
+ <step>
+ <para>运行这个命令之后将下载和应用所有变化的ports系统,
+ 但并不在您的系统中重新编译 ports 系统。</para>
+ </step>
+ </procedure>
+ </sect2>
+
+ <sect2 id="ports-skeleton">
+ <title>安装 Ports</title>
+
+ <indexterm>
+ <primary>ports</primary>
+ <secondary>安装</secondary>
+ </indexterm>
+ <para>当提到 Ports collection 时,
+ 第一个要说明的就是何谓 <quote>skeleton</quote>。 简单地说,
+ port skeleton 是让一个程序在 FreeBSD
+ 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>一个 <filename>Makefile</filename>。 <filename>Makefile</filename>
+ 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>一个 <filename>distinfo</filename> 文件。这个文件包括这些信息:
+ 这些文件用来对下载后的文件校验和进行检查, 使用 &man.md5.1;
+ 来确保在下载过程中文件没有被破坏。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>一个 <filename>files</filename> 目录。 这个目录包括在
+ FreeBSD 系统上编译和安装程序需要用到的补丁。
+ 这些补丁基本上都是些小文件, 指出特定文件作了哪些修正。
+ 它们都是纯文本的的格式,基本上是这样的
+ <quote>删除第 10 行</quote> 或
+ <quote>将第 26 行改为这样 ...</quote>,
+ 补丁文件也被称作 <quote>diffs</quote>,
+ 他们由 &man.diff.1; 程序生成。
+ </para>
+
+ <para>这个目录也包含了在编译 port 时要用到的其它文件。</para>
+ </listitem>
+
+ <listitem>
+ <para>一个 <filename>pkg-descr</filename> 文件。
+ 这是一个提供更多细节,有软件的多行描述。</para>
+ </listitem>
+
+ <listitem>
+ <para>一个 <filename>pkg-plist</filename> 文件。
+ 这是即将被安装的所有文件的列表。它告诉 ports
+ 系统在卸载时需要删除哪些文件。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>一些ports还有些其它的文件, 例如
+ <filename>pkg-message</filename>。 ports
+ 系统在一些特殊情况下会用到这些文件。
+ 如果您想知道这些文件更多的细节以及 ports 的概要, 请参阅
+ <ulink url="&url.books.porters-handbook;/index.html">FreeBSD Porter's Handbook</ulink>。</para>
+
+ <para>port里面包含着如何编译源代码的指令, 但不包含真正的源代码。 您可以在网上或
+ CD-ROM 上获得源代码。 源代码可能被开发者发布成任何格式。
+ 一般来说应该是一个被 tar 和 gzip 过的文件,
+ 或者是被一些其他的工具压缩或未压缩的文件。
+ ports中这个程序源代码标示文件叫 <quote>distfile</quote>,
+ 安装 &os; port的方法还不止这两种。</para>
+
+ <note>
+ <para>您必须使用 <username>root</username> 用户登录后安装 ports。</para>
+ </note>
+
+ <warning>
+ <para>在安装任何 port 之前, 应该首先确保已经更新到了最新的
+ ports collection, 并检查 <ulink
+ url="http://vuxml.freebsd.org/"></ulink> 中是否有与那个
+ port 有关的安全问题。</para>
+
+ <para>在安装应用程序之前, 可以使用
+ <application>portaudit</application> 来自动地检查是否存在已知的安全问题。
+ 这个工具同样可以在
+ ports collection (<filename
+ role="package">security/portaudit</filename>) 中找到。
+ 在安装新的 port 之前, 可以考虑先运行一下
+ <command>portaudit -F</command> 来抓取最新的漏洞数据库。
+ 在每天的周期性系统安全检察时, 数据库会被自动更新,
+ 并且会在这之后实施安全审计。
+ 欲了解进一步的情况,请参阅 &man.portaudit.1; 和 &man.periodic.8;。</para>
+ </warning>
+
+ <sect3 id="ports-cd">
+ <title>从光盘安装 Ports</title>
+
+ <indexterm>
+ <primary>ports</primary>
+ <secondary>从 CD-ROM 安装</secondary>
+ </indexterm>
+ <para>FreeBSD 项目发行的官方光盘文件不再包含 distfiles。
+ 他们提供了许多更多的更好的使用编译好的软件包。
+ 如果您从 <ulink
+ url="http://www.freebsdmall.com/">FreeBSD Mall</ulink> 购买了像
+ FreeBSD PowerPak 这样的光盘产品, 里面就包含了distfiles。
+ 下面的章节假设您已经有了一张FreeBSD的安装光盘。
+ </para>
+
+ <para>把 FreeBSD 的光盘放入驱动器。Mount到 <filename>/cdrom</filename>。
+ (如果您使用了不同的挂接点,这个安装将不会工作)。 首先, 进入到您要安装的
+ port 所在的目录:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/sysutils/lsof</userinput></screen>
+
+ <para>一旦进入了 <filename>lsof</filename> 的目录,您将会看到这个port的结构。
+ 下一步就是 make,或说 <quote>联编</quote> 这个 port。
+ 只需在命令行简单地输入 <command>make</command> 命令就可轻松完成这一工作。
+ 做好之后,您可以看到下面的信息:</para>
+
+ <screen>&prompt.root; <userinput>make</userinput>
+&gt;&gt; lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+&gt;&gt; Attempting to fetch from file:/cdrom/ports/distfiles/.
+===&gt; Extracting for lsof-4.57
+...
+[extraction output snipped]
+...
+&gt;&gt; Checksum OK for lsof_4.57D.freebsd.tar.gz.
+===&gt; Patching for lsof-4.57
+===&gt; Applying FreeBSD patches for lsof-4.57
+===&gt; Configuring for lsof-4.57
+...
+[configure output snipped]
+...
+===&gt; Building for lsof-4.57
+...
+[compilation output snipped]
+...
+&prompt.root;</screen>
+
+ <para>注意,一旦编译完成,您就会回到命令行。 下一步安装 port,
+ 要安装它只需要在 <command>make</command> 命令后跟上一个单词
+ <command>install</command> 即可:</para>
+
+ <screen>&prompt.root; <userinput>make install</userinput>
+===&gt; Installing for lsof-4.57
+...
+[installation output snipped]
+...
+===&gt; Generating temporary packing list
+===&gt; Compressing manual pages for lsof-4.57
+===&gt; Registering installation for lsof-4.57
+===&gt; SECURITY NOTE:
+ This port has installed the following binaries which execute with
+ increased privileges.
+&prompt.root;</screen>
+
+ <para>一旦您返回到提示符,您就可以运行您刚刚安装的程序了。因为
+ <command>lsof</command> 是一个赋予特殊权限的程序,
+ 因此显示了一个安全警告。 在编译和安装 ports 的时候,
+ 您应该留意任何出现的警告。</para>
+
+ <note>
+ <para>您可以运行一个命令 <command>make
+ install</command> 来替换 <command>make</command> 和
+ <command>make install</command>这两个分离的步骤。</para>
+ </note>
+
+ <note>
+ <para>在一些shell中,为了对这些程序做快速查找的操作,
+ 它对环境变量 <envar>PATH</envar> 指定的目录中的可执行命令有缓存。
+ 对于在基本系统中的一部分 shell (就像 <command>tcsh</command>),
+ 和在 port 中的一些 shell (举个例子,
+ <filename role="package">shells/zsh</filename>),
+ 如果您使用了这些 shell 中的一个, 您必须在安装完一个 port 后执行
+ <command>rehash</command> 命令, 这样新安装的程序才能使用。</para>
+ </note>
+
+ <note>
+ <para>有一小部分的 port 由于许可协议的问题不允许包含在光盘内。
+ 可能是因为在下载前需要注册一些信息或不允许再发布, 或者其他理由。
+ 如果您想安装的 port 不在光盘中, 为此您将需要在线操作来安装
+ (请看 <link linkend="ports-inet">下一章节</link>)。</para>
+ </note>
+ </sect3>
+
+ <sect3 id="ports-inet">
+ <title>从互联网安装Port</title>
+
+ <para>作为最后一节, 本节假定您有一个可用的互联网连接。 如果您没有,
+ 您需要察看上一章节<link linkend="ports-cd">从光盘安装</link>,
+ 或者手工将 distfile 放到 <filename>/usr/ports/distfiles</filename>
+ </para>
+
+ <para>实际上从互联网安装 port 和从光盘安装差不多,
+ 不同的是从互联网下载distfile,而不是从光盘读取。</para>
+
+ <para>相关步骤是一样的:</para>
+
+ <screen>&prompt.root; <userinput>make install</userinput>
+&gt;&gt; lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+&gt;&gt; Attempting to fetch from ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
+Receiving lsof_4.57D.freebsd.tar.gz (439860 bytes): 100%
+439860 bytes transferred in 18.0 seconds (23.90 kBps)
+===&gt; Extracting for lsof-4.57
+...
+[extraction output snipped]
+...
+&gt;&gt; Checksum OK for lsof_4.57D.freebsd.tar.gz.
+===&gt; Patching for lsof-4.57
+===&gt; Applying FreeBSD patches for lsof-4.57
+===&gt; Configuring for lsof-4.57
+...
+[configure output snipped]
+...
+===&gt; Building for lsof-4.57
+...
+[compilation output snipped]
+...
+===&gt; Installing for lsof-4.57
+...
+[installation output snipped]
+...
+===&gt; Generating temporary packing list
+===&gt; Compressing manual pages for lsof-4.57
+===&gt; Registering installation for lsof-4.57
+===&gt; SECURITY NOTE:
+ This port has installed the following binaries which execute with
+ increased privileges.
+&prompt.root;</screen>
+
+ <para>就像您看到的, 唯一区别是有一行告知您系统正在从哪里获得 port 的
+ distfile 的信息。</para>
+
+ <para>ports 系统使用 &man.fetch.1; 去下载文件, 它有很多可以设置的环境变量,
+ 其中包括 <envar>FTP_PASSIVE_MODE</envar>、 <envar>FTP_PROXY</envar>,
+ 和 <envar>FTP_PASSWORD</envar>。 如果您在防火墙之后,或使用 FTP/HTTP代理,
+ 您就可能需要设置它们。 完整的说明请看 &man.fetch.3;。</para>
+
+ <para>当使用者不是所有时间都能连接上网络, 则可以利用 <command>make
+ <maketarget>fetch</maketarget></command>。 您只要在顶层目录
+ (<filename>/usr/ports</filename>) 下运行这个命令,
+ 所有需要的文件都将被下载。 这个命令也同样可以在下级类别目录中使用,
+ 例如: <filename>/usr/ports/net</filename>。
+ 注意, 如果一个port有一些依赖的库或其他 port, 它将 <emphasis>不</emphasis>
+ 下载这些依赖的 port 的 distfile 文件, 如果您想获取所有依赖的
+ port 的所有 distfile, 请用 <maketarget>fetch-recursive</maketarget>
+ 命令代替 <maketarget>fetch</maketarget>命令。</para>
+
+ <note><para>您可以在一个类别或在顶级目录编译所有的 port, 或者使用上述提到的
+ <command>make <makevar>fetch</makevar></command>命令。 这样是非常危险的,
+ 因为有一些port不能并存。 或者有另一种可能, 一些port会安装两个不同的文件,
+ 但是却是相同的文件名。</para></note>
+
+ <para>在一些罕见的例子中, 用户可能需要在除了 <makevar>MASTER_SITES</makevar>
+ 以外的一个站点(本地已经下载下来的文件)去获得一个文件包。
+ 您可以用以下命令不使用 <makevar>MASTER_SITES</makevar>:
+ </para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/<replaceable>directory</replaceable></userinput>
+&prompt.root; <userinput>make MASTER_SITE_OVERRIDE= \
+ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch</userinput></screen>
+
+ <para>在这个例子中,我们把
+ <makevar>MASTER_SITES</makevar>这个选项改为了 <hostid
+ role="fqdn">ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/</hostid>。</para>
+
+ <note><para>一些 port 允许 (或甚至要求) 您指定编译选项来
+ 启用/禁用 应用程序中非必需的功能, 一些安全选项,
+ 以及其他可以订制的内容。 具有代表性的包括
+ <filename role="package">www/mozilla</filename>、 <filename
+ role="package">security/gpgme</filename>、 以及 <filename
+ role="package">mail/sylpheed-claws</filename>。
+ 如果存在这样的选项, 通常会在编译时给出提示。</para></note>
+ </sect3>
+
+ <sect3>
+ <title>改变默认的 Ports 目录</title>
+
+ <para>一些时候使用不同的 distfiles 和 ports 目录可能很有用
+ (甚至是必要的)。 可以用
+ <makevar>PORTSDIR</makevar> 和 <makevar>PREFIX</makevar>
+ 来改变默认的目录。 例如:</para>
+
+ <screen>&prompt.root; <userinput>make PORTSDIR=/usr/home/example/ports install</userinput></screen>
+
+ <para>将把编译
+ <filename>/usr/home/example/ports</filename> 中的 port 并把所有的文件安装到
+ <filename>/usr/local</filename>。</para>
+
+ <screen>&prompt.root; <userinput>make PREFIX=/usr/home/example/local install</userinput></screen>
+
+ <para>将在 <filename>/usr/ports</filename> 编译它并安装到
+ <filename>/usr/home/example/local</filename>。</para>
+
+ <para>当然,</para>
+
+ <screen>&prompt.root; <userinput>make PORTSDIR=../ports PREFIX=../local install</userinput></screen>
+
+ <para>将包含两种设置 (没有办法在这一页把它写完,
+ 但您应该已经知道怎么回事了)。</para>
+
+ <para>另外, 这些变量也可以作为环境变量来设置。
+ 请参考您的 shell 的联机手册上关于如何设置环境变量的说明。</para>
+ </sect3>
+
+ <sect3>
+ <title>处理 <command>imake</command></title>
+
+ <para>一些 port 使用 <command>imake</command> (这是
+ X Window 系统的一部分) 不能正常地配合
+ <makevar>PREFIX</makevar>, 它们会坚持把文件安装到
+ <filename>/usr/X11R6</filename> 下面。
+ 类似地, 一些 Perl port 会忽略 <makevar>PREFIX</makevar>
+ 并把文件安装到 Perl 的目录中。
+ 让这些 port 尊重
+ <makevar>PREFIX</makevar> 是困难甚至是不可能的事情。</para>
+
+ </sect3>
+ </sect2>
+
+ <sect2 id="ports-removing">
+ <title>卸载已经安装的 Ports</title>
+
+ <indexterm>
+ <primary>ports</primary>
+ <secondary>卸载</secondary>
+ </indexterm>
+ <para>现在您已经知道如何安装 port, 您可能很想知道如何卸载它们,
+ 例如您安装了一个之后才意识到装错了。
+ 我们将卸载前面的例子中安装的那个
+ (也就是 <command>lsof</command>, 如果您没有注意过的话)。
+ 和安装 port 时类似, 第一件事是进入 port 的目录,
+ <filename>/usr/ports/sysutils/lsof</filename>。
+ 之后您就可以卸载 <command>lsof</command> 了。
+ 这可以通过命令 <command>make deinstall</command> 来完成:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/sysutils/lsof</userinput>
+&prompt.root; <userinput>make deinstall</userinput>
+===&gt; Deinstalling for lsof-4.57</screen>
+
+ <para>这个过程足够地简单。 现在已经从系统上卸载了
+ <command>lsof</command>。
+ 如果您想重新安装它, 可以在
+ <filename>/usr/ports/sysutils/lsof</filename> 目录中运行
+ <command>make reinstall</command> 来达到目的。</para>
+
+ <para><command>make deinstall</command> 以及 <command>make
+ reinstall</command> 在您执行过
+ <command>make clean</command> 之后就不能用了。
+ 如果您在清理目录之后还想删除 port,
+ 可以用 <link linkend="packages-using">使用手册中的
+ Package 相关章节</link> 中介绍的 &man.pkg.delete.1;
+ 来完成。</para>
+ </sect2>
+
+ <sect2 id="ports-disk-space">
+ <title>Ports 与磁盘空间</title>
+
+ <indexterm>
+ <primary>ports</primary>
+ <secondary>磁盘空间</secondary>
+ </indexterm>
+ <para>使用 ports collection 显然会吃掉您的一些磁盘空间。
+ 基于这样的考虑您应该经常通过 <command>make
+ <makevar>clean</makevar></command> 来清理工作目录。
+ 它将会在您编译和安装 port 之后删除
+ <filename>work</filename> 目录。
+ 您也可以考虑从 <filename>distfiles</filename>
+ 目录中删掉对应的 tar 文件, 并在用完之后卸载 port。</para>
+
+ <para>一些用户还通过把一些不需要的 port 分类放入
+ <filename>refuse</filename> 文件来避免下载它们。 这样在运行
+ <application>CVSup</application> 时就不会下载这些分类中的文件了。
+ 关于 <filename>refuse</filename> 的详情请参考 <xref
+ linkend="cvsup-refuse-file">。</para>
+ </sect2>
+
+ <sect2 id="ports-upgrading">
+ <title>升级 Ports</title>
+
+ <indexterm>
+ <primary>portupgrade</primary>
+ </indexterm>
+ <indexterm>
+ <primary>ports</primary>
+ <secondary>升级</secondary>
+ </indexterm>
+ <note>
+ <para>一旦您更新了 ports collection, 在开始升级之前,
+ 应该首先检查一下
+ <filename>/usr/ports/UPDATING</filename> 文件。
+ 它描述了在升级时可能遇到的问题, 以及因应的步骤。</para>
+ </note>
+
+ <para>保持 ports 最新可能是一件乏味的工作。 例如,
+ 为了更新 port 您需要进入它的目录, 编译, 卸载旧的,
+ 然后安装新的, 并在之后进行清理。 考虑一下对五个 port
+ 做这样的升级, 很乏味是不是? 这是系统管理员需要处理的一大难题,
+ 而我们现在有了一些能够帮助我们做这件事的工具。
+ 例如 <filename role="package">sysutils/portupgrade</filename>
+ 就能够帮助您完成所有这一切! 只需像其他 port 一样用
+ <command>make <makevar>install
+ clean</makevar></command> 来安装它就可以了。</para>
+
+ <para>接下来需要通过 <command>pkgdb -F</command>
+ 命令来创建一个数据库。 这将读取已经安装的 port 并创建一个数据库文件到
+ <filename>/var/db/pkg</filename> 目录中。
+ 接下来执行 <command>portupgrade
+ -a</command>, 它会读取这个数据库以及 ports 的
+ <filename>INDEX</filename> 文件。 最后,
+ <application>portupgrade</application> 将开始下载, 编译,
+ 备份, 安装并清理更新了的 ports。
+ <application>portupgrade</application> 包含了许多的选项,
+ 最重要的那些将在下面说明。</para>
+
+ <para>如果您只想升级某个具体的应用程序而不是数据库中的记录的所有程序,
+ 则使用 <command>portupgrade
+ <replaceable>pkgname</replaceable></command>,
+ 如果您认为 <application>portupgrade</application>
+ 应该升级所有基于那个 port 的软件,
+ 则需要指定 <option>-r</option>;
+ 使用 <option>-R</option>
+ 则它用到的所有包也会以通升级。
+ 要使用预编译的包而不是 ports 来安装,
+ 则可以指定
+ <option>-P</option> 选项; 如果只想下载需要的 distfile
+ 而不编译或安装什么, 则指定 <option>-F</option>。
+ 更具体的细节请参考 &man.portupgrade.1;。</para>
+
+ <note>
+ <para>规律性地更新 package 数据库非常重要。 您可以使用
+ <command>pkgdb -F</command> 来修复不一致, 特别是当
+ <application>portupgrade</application> 要求您这么做的时候。 当
+ <application>portupgrade</application> 正在更新数据库时请不要打断它,
+ 因为这将做的结果将是不一致的数据库。</para>
+ </note>
+
+ <para>还有一些其他工具能够完成类似的以及其他一些任务, 请查看
+ <filename>ports/sysutils</filename> 目录中是否有您需要的。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="ports-nextsteps">
+ <title>安装之后的待办事宜
+</title>
+
+ <para>通常,您通过port安装完一个软件后,可以阅读它带的一些文档(如果它包含文档的话),
+ 或需要编辑它的配置文件,来确保这个软件的运行,
+ 或在机器启动的时候启动(如果它是一个服务的话),等等。</para>
+
+ <para>对于不同的软件有着不同的配置步骤。不管怎样,
+ 如果您装好了一个软件,但是不知道下一步怎么办的时候,
+ 这些小技巧可能可以帮助您:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>使用 &man.pkg.info.1; 命令,它能找到安装了哪些文件,以及装在哪里。
+ 举个例子,如果您安装了 FooPackage version 1.0.0, 那么这个命令</para>
+
+ <screen>&prompt.root; <userinput>pkg_info -L foopackage-1.0.0 | less</userinput></screen>
+
+ <para>将显示这个软件包安装的所有文件,您要特别注意在<filename>man/</filename>目录里面的文件,
+ 它们可能是手册,<filename>etc/</filename>目录里面的配置文件,以及 <filename>doc/</filename>目录下面更多的文档。</para>
+
+ <para>如果您不确定已经安装好的软件版本,您可以使用这样的命令</para>
+
+ <screen>&prompt.root; <userinput>pkg_info | grep -i <replaceable>foopackage</replaceable></userinput></screen>
+
+ <para>它将会找到所有已安装的软件包名字中包含<replaceable>foopackage</replaceable>
+ 的软件包。 对于其他的查找, 您只需要在命令行中替换
+ <replaceable>foopackage</replaceable>。</para>
+ </listitem>
+
+ <listitem>
+ <para>一旦一些软件手册已被您确认安装,您可以使用 &man.man.1; 查看它。
+ 同样的,如果有的话,您还可以完整的查看一边配置文件的示例,以及任何额外的文档。</para>
+ </listitem>
+
+ <listitem>
+ <para>如果应用软件有网站, 您还可以从网站上找到文档,常见问题的解答,或其他更多。
+ 如果您不知道它们的网站地址,请使用下面的命令</para>
+
+ <screen>&prompt.root; <userinput>pkg_info <replaceable>foopackage-1.0.0</replaceable></userinput></screen>
+
+ <para>一个 <literal>WWW:</literal> 行, 如果它存在,
+ 它将提供一个这个应用程序的网站URL.</para>
+ </listitem>
+
+ <listitem>
+ <para>Ports 如果需要在服务器启动时运行(就像互联网服务器),
+ 它通常会把一个脚本的样例放入
+ <filename>/usr/local/etc/rc.d</filename> 目录。为了保证正确性,
+ 您可以查看这个脚本, 并编辑或更改这个脚本的名字。 详情请看<link
+ linkend="configtuning-starting-services">启动服务</link>。</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="ports-broken">
+ <title>如何处理坏掉的 Ports</title>
+
+ <para>如果您发现某个 port 无法正常工作,
+ 有几件事值得尝试, 包括:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>修好它! <ulink
+ url="&url.books.porters-handbook;/index.html">Porter
+ 手册</ulink> 中包括了关于
+ <quote>Ports</quote> 基础设施的详细信息,
+ 它们能够帮助您修好有问题的 port 甚至提交自己的 port!</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>通过电子邮件</emphasis> &mdash; 抱怨!
+ 首先发邮件给 port 的维护人员 (maintainer)。 使用
+ <command>make maintainer</command> 或阅读
+ <filename>Makefile</filename> 都可以找到维护人员的电子邮件地址。
+ 请记得把 port 的名字和版本写在邮件里
+ (<filename>Makefile</filename> 中的
+ <literal>&dollar;FreeBSD:</literal>这一行) 并把错误输出的头几行发给 maintainer。
+ 如果维护人员没有回应您的邮件, 则可以使用 &man.send-pr.1;
+ 来提交问题报告。</para>
+ </listitem>
+
+ <listitem>
+ <para>从较近的 FTP 站点下载一个编译好的安装包。
+ <quote>中央的</quote> package collection 在 <hostid
+ role="fqdn">ftp.FreeBSD.org</hostid> 的 <ulink
+ url="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/">packages
+ 目录中</ulink>, 但 <emphasis>在此之前</emphasis>
+ 一定记得先看看本地镜像上是否已经有了!
+ 通常情况下这些安装包都可以直接使用,
+ 而且应该比自行编译快一些。
+ 安装过程本身可以通过 &man.pkg.add.1; 来完成。</para>
+ </listitem>
+ </orderedlist>
+ </sect1>
+
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/ppp-and-slip/Makefile b/zh_CN.GB2312/books/handbook/ppp-and-slip/Makefile
new file mode 100644
index 0000000000..c980dc2eff
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/ppp-and-slip/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.143
+# $FreeBSD$
+#
+
+CHAPTERS= ppp-and-slip/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml
new file mode 100644
index 0000000000..608bed46ba
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml
@@ -0,0 +1,2734 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.143
+ $FreeBSD$
+-->
+
+<chapter id="ppp-and-slip">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Restructured, reorganized, and updated by </contrib>
+ <!-- 1 Mar 2000 -->
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>PPP 和 SLIP</title>
+
+ <sect1 id="ppp-and-slip-synopsis">
+ <title>概述</title>
+ <indexterm id="ppp-ppp">
+ <primary>PPP</primary>
+ </indexterm>
+ <indexterm id="ppp-slip">
+ <primary>SLIP</primary>
+ </indexterm>
+
+ <para>FreeBSD有很多方法可以将计算机与计算机连接起来. 通过一个拨号modem来建立一个网络或Internet连接,
+ 或允许其他人与您连接,要求使用PPP或SLIP.这章将详细介绍设置这些基于modem的通信服务的方法 .</para>
+
+ <para>读完这一章,您将会了解到:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para> 如何设置用户级PPP.</para>
+ </listitem>
+ <listitem>
+ <para>如何设置内核级PPP.</para>
+ </listitem>
+ <listitem>
+ <para>如何设置 <acronym>PPPoE</acronym> (PPP over
+ Ethernet).</para>
+ </listitem>
+ <listitem>
+ <para>如何设置 <acronym>PPPoA</acronym> (PPP over
+ ATM).</para>
+ </listitem>
+ <listitem>
+ <para>如何配置和安装SLIP客户端和服务器.</para>
+ </listitem>
+ </itemizedlist>
+
+ <indexterm id="ppp-ppp-user">
+ <primary>PPP</primary>
+ <secondary>用户级PPP</secondary>
+ </indexterm>
+ <indexterm id="ppp-ppp-kernel">
+ <primary>PPP</primary>
+ <secondary>内核级PPP</secondary>
+ </indexterm>
+ <indexterm id="ppp-ppp-ethernet">
+ <primary>PPP</primary>
+ <secondary>PPPOE</secondary>
+ </indexterm>
+
+ <para>在阅读这章之前,您应当:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>熟悉基本的网络术语.</para>
+ </listitem>
+ <listitem>
+ <para> 理解拨号连接和PPP,SLIP的基础知识.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>您可能想知道用户级PPP与内核级PPP不同之处.回答很简单:
+ 用户级PPP处理用户级的输入和输出数据,而不是内核级.
+ 在内核与用户区之间复制数据的花费要大一些,但它能提供具有更多特性的PPP实现 .
+ 用户级PPP使用 <devicename>tun</devicename>设备与外界通信而内核级PPP使用
+ <devicename>ppp</devicename>设备.</para>
+
+ <note>
+ <para>除非需要与其它PPP软件(比如<application>pppd</application>)相区别,在这一章中
+ 用户级PPP就简称为<application>ppp</application>.另外,若没有额外的注明,本章所介绍
+ 的所有命令都需要<username>root</username>权限.
+ .</para>
+ </note>
+ </sect1>
+
+ <sect1 id="userppp">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Updated and enhanced by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Brian</firstname>
+ <surname>Somers</surname>
+ <contrib>Originally contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Nik</firstname>
+ <surname>Clayton</surname>
+ <contrib>With input from </contrib>
+ </author>
+ <author>
+ <firstname>Dirk</firstname>
+ <surname>Fr&ouml;mberg</surname>
+ </author>
+ <author>
+ <firstname>Peter</firstname>
+ <surname>Childs</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>使用用户级PPP</title>
+
+ <sect2>
+ <title>用户级PPP</title>
+
+ <sect3>
+ <title>前提条件</title>
+
+ <para>本章假定您具备如下条件:</para>
+
+ <itemizedlist>
+ <indexterm id="ppp-isp">
+ <primary>ISP</primary>
+ </indexterm>
+ <indexterm id="ppp-ppp2">
+ <primary>PPP</primary>
+ </indexterm>
+ <listitem>
+ <para>您有一个ISP提供的用于连接使用PPP的帐号.</para>
+ </listitem>
+
+ <listitem>
+ <para>您需要一个连接到您的系统并做了正确配置的modem或其它设备,使您能连接到ISP.</para>
+ </listitem>
+
+ <listitem>
+ <para>ISP的拨号号码.</para>
+ </listitem>
+
+ <indexterm id="ppp-pap">
+ <primary>PAP</primary>
+ </indexterm>
+ <indexterm id="ppp-chap">
+ <primary>CHAP</primary>
+ </indexterm>
+ <indexterm id="ppp-unix">
+ <primary>UNIX</primary>
+ </indexterm>
+ <indexterm id="ppp-login">
+ <primary>login name</primary>
+ </indexterm>
+ <indexterm id="ppp-password">
+ <primary>password?/primary>
+ </indexterm>
+ <listitem>
+ <para>您的登录名称和密码(可能是一般的UNIX风格的登录名和密码对,
+ 也可能是PAP或CHAP登录名和密码对.)</para>
+ </listitem>
+
+ <indexterm id="ppp-nameserver">
+ <primary>nameserver</primary>
+ </indexterm>
+ <listitem>
+ <para>一个或多个域名服务器IP地址.
+ 通常,您会从ISP处得到两个这样的IP地址. 如果您至少得到了一个, 就可以
+ 在文件<filename>ppp.conf</filename>中加入<command>enable dns</command>命令
+ 使<application>ppp</application>设置域名服务.这个功能取决于ISP对支持DNS协商的具体实现.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>下面的信息由您的ISP提供,但不是必需的:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>ISP的网关IP地址. 网关是您要连接的且要被设为<emphasis>默认路由</emphasis>的主机.
+ 如果您没有这个信息,您可以虚构一个,在连接时ISP的PPP服务器会自动告诉您正确的值.</para>
+
+ <para>这个虚构的IP号被<application>ppp</application>称为
+ <literal>HISADDR</literal>.</para>
+ </listitem>
+
+ <listitem>
+ <para>需要使用的子网掩码.如果ISP没有提供,您可以安全地使用
+ <hostid role="netmask">255.255.255.255</hostid>.</para>
+ </listitem>
+
+ <indexterm id="ppp-static-ip">
+ <primary>static IP address</primary>
+ </indexterm>
+ <listitem>
+ <para>如果ISP提供了一个静态的IP地址和主机名,可以输入它们.否则,让对方主机指定它
+ 认为合适的IP地址.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您不知道这些信息,请与您的ISP联系.</para>
+
+ <note><para>在这节中,所有作为样例显示的配置文件信息都对行进行了编号.
+ 这些行号只是为了使解释和讨论变得方便,在真实当地用tab键和sp文件中并不存在.
+ 缩进是必需的.</para>
+ </note>
+
+ </sect3>
+
+ <sect3>
+ <title>创建PPP设备节点</title>
+ <indexterm><primary>PPP</primary><secondary>creating device nodes</secondary></indexterm>
+
+ <para>一般情况下,大多数用户只需要一个<devicename>tun</devicename>设备
+ (<filename>/dev/tun0</filename>),提及<devicename>tun0</devicename>时,
+ 即指<devicename>tun<replaceable>N</replaceable></devicename>,N是您系统中具体的号码.</para>
+
+ <para>若的FreeBSD(FreeBSD&nbsp;4.X 及早前版本)没有启用&man.devfs.5;,应当先检查
+ 是否存在<devicename>tun0</devicename>设备,如果已经启用了&man.devfs.5;,这一步就没必要了
+ (因为&man.devfs.5;会根据需要创建设备).</para>
+
+ <para>为了确保<devicename>tun0</devicename>配置正确,最古老的方式是重新创建它.
+ 按照以下步骤可以重新创建设备:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>sh MAKEDEV tun0</userinput></screen>
+
+ <para>如果您的内核要有16个tunnel设备,您必须创建它们.可以通过执行以下命令完成:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>sh MAKEDEV tun15</userinput></screen>
+ </sect3>
+
+ <sect3>
+ <title><application>PPP</application>自动化配置</title>
+
+ <indexterm><primary>PPP</primary><secondary>configuration</secondary></indexterm>
+ <para> <command>ppp</command>和<command>pppd</command>(PPP的内核级实现)
+ 都使用<filename>/etc/ppp</filename>目录中的配置文件.用户级PPP的例子能
+ 在<filename>/usr/share/examples/ppp/</filename>中找到.</para>
+
+ <para>配置<command>ppp</command>要求根据您的需要编辑几个文件.编辑哪几个文件取决于您的
+ IP是静态分配还是动态分配的.</para>
+
+ <sect4 id="userppp-staticIP">
+ <title>PPP和静态IP地址</title>
+
+ <indexterm><primary>PPP</primary><secondary>with static IP addresses</secondary></indexterm>
+ <para>您需要编辑配置文件<filename>/etc/ppp/ppp.conf</filename>.如下所示.</para>
+
+ <note>
+ <para>以冒号<literal>:</literal>结尾的行从第一列 (行首)开始,
+ 其它所有的行都要缩进一个空格或制表区间.</para>
+ </note>
+
+ <programlisting>1 default:
+2 set log Phase Chat LCP IPCP CCP tun command
+3 ident user-ppp VERSION (built COMPILATIONDATE)
+4 set device /dev/cuaa0
+5 set speed 115200
+6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
+7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
+8 set timeout 180
+9 enable dns
+10
+11 provider:
+12 set phone "(123) 456 7890"
+13 set authname foo
+14 set authkey bar
+15 set login "TIMEOUT 10 \"\" \"\" gin:--gin: \\U word: \\P col: ppp"
+16 set timeout 300
+17 set ifaddr <replaceable>x.x.x.x</replaceable> <replaceable>y.y.y.y</replaceable> 255.255.255.255 0.0.0.0
+18 add default HISADDR</programlisting>
+
+ <variablelist>
+ <varlistentry>
+ <term>行1 :</term>
+
+ <listitem>
+ <para>指定默认的项.当PPP运行时这个项中的命令将自动执行.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行2:</term>
+
+ <listitem>
+ <para>启用登录参数.工作正常后,为避免产生过多的日志文件,这行应该简化为:
+ <programlisting>set log phase tun</programlisting>.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 3:</term>
+
+ <listitem>
+ <para>告诉PPP怎样向对方自我标识.
+ 如果在建立或使用连接时遇到任何麻烦,PPP就会向对方主机自我标识.对方主机管理员
+ 在处理这个问题时,这些信息会有用.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 4:</term>
+
+ <listitem>
+ <para>标明modem要连接的端口号.<devicename>COM1</devicename>是
+ <filename>/dev/cuaa0</filename>, <devicename>COM2</devicename>
+ 是<filename>/dev/cuaa1</filename>.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 5:</term>
+
+ <listitem>
+ <para>设置连接的速度.如果115200
+ 不能工作,试试 38400.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行6 和7:</term>
+
+ <indexterm><primary>PPP</primary><secondary>user PPP</secondary></indexterm>
+ <listitem>
+ <para>拨号字符串. 用户级PPP使用一种与&man.chat.8;程序相似的语法.
+ 请参考联机手册了解这种语言的相关信息.</para>
+
+ <para>注意,为了便于阅读此命令进行了换行.任何<filename>ppp.conf</filename>里的
+ 命令都可以这样做,前提是行的最后一个字符必须是<quote>\</quote>.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 8:</term>
+
+ <listitem>
+ <para>设置连接的时间间隔.默认是180秒,所以这一行是多余的.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 9:</term>
+
+ <listitem>
+ <para>告诉PPP向对方主机确认本地域名解析设置.如果您运行了本地的域名服务器,要注释或删除掉这一行.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 10:</term>
+
+ <listitem>
+ <para>为了可读性的需要设置一个空行.空行会被PPP忽略.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 11:</term>
+
+ <listitem>
+ <para>为<quote>provider</quote>指定一个项.可以改成
+ <acronym>ISP</acronym>的名字.这样您以后就可以使用<option>load ISP</option>
+ 开启连接.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 12:</term>
+
+ <listitem>
+ <para>设置提供商的电话号码. 多个电话号码可以使用冒号(<literal>:</literal>)
+ 或管道符号(<literal>|</literal>)隔开.这两个字符的区别在&man.ppp.8;的联机手册中有介绍.
+ 总的来讲,如果您要循环使用这些号码,可以使用冒号.如果您想使用第一个号码,
+ 当第一个号码失败了再用第二个号码,就使用管道符号.正如显示的那样,要用括号将号码集括起来.</para>
+
+ <para> 如果电话号码里有空格,必须用引号(<literal>"</literal>)将其括起来.
+ 否则会造成简单却难以察觉的错误.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行13和14:</term>
+
+ <listitem>
+ <para>指定用户名和密码.当使用一个&unix;风格的命令提示符登录时,这些值可以用带有\U \P参数
+ 的<command>set login</command>命令进行修改.当使用PAP或CHAP进行连接时,
+ 这些值在验证使用.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 15:</term>
+
+ <listitem>
+ <indexterm><primary>PAP</primary></indexterm>
+ <indexterm><primary>CHAP</primary></indexterm>
+ <para>如果您使用的是PAP或者CHAP,在这里就不会有登录.要注释或删除掉这一行.
+ 请参考 <link linkend="userppp-PAPnCHAP">PAP和CHAP认证</link> 以获取更多细节.</para>
+
+ <para>登录命令是的语法是chat类型的.在这个例子中,是这样的:</para>
+
+ <screen>J. Random Provider
+login: <replaceable>foo</replaceable>
+password: <replaceable>bar</replaceable>
+protocol: ppp</screen>
+
+ <para>您需要改变这个脚本以适合您自己的需要.当您第一次写这个脚本时,
+ 应当确保已经启用<quote>chat</quote>并处于登录状态,这样您才能确认通信是否
+ 正在按计划进行.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行16:</term>
+
+ <indexterm><primary>timeout</primary></indexterm>
+ <listitem>
+ <para>设置默认的超时时间.这里,连接若在300秒内无响应将被断开.如果您不想设置成超时,
+ 将这个值设置成0,或在命令行使用<option>-ddial</option>选项.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 17:</term>
+ <indexterm><primary>ISP</primary></indexterm>
+ <listitem>
+ <para>设置接口地址. 字符串
+ <replaceable>x.x.x.x</replaceable>需要用ISP提供给您的IP地址替换. 字符串
+ <replaceable>y.y.y.y</replaceable>要用ISP的网关IP地址替换(即您要连接的主机).
+ 如果ISP没有给您网关地址,可以使用<hostid role="netmask">10.0.0.2/0</hostid>.
+ 如果您需要使用一个<quote>猜到</quote>的地址,请确保在<filename>/etc/ppp/ppp.linkup</filename>
+ 中为每个<link linkend="userppp-dynamicIP">PPP和动态IP地址</link>指令创建了项.
+ 如果没有这一行,<command>ppp</command> 将无法运行<option>-auto</option>模式.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>第18行:</term>
+
+ <listitem>
+ <para>添加一个到ISP网关的默认路由。
+ <literal>HISADDR</literal>这个关键字会被第17行所指定的网关地址替换。
+ 这行必须出现在第17行之后,以免在 <literal>HISADDR</literal>
+ 初始化之前使用它的值。</para>
+
+ <para>如果您不想使用 <option>-auto</option> 的 PPP,则这行应挪到,
+ <filename>ppp.linkup</filename> 文件中。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>若您有一个静态IP地址,且使用<option>-auto</option>
+ 模式运行ppp(因为在连接之前已经正确设置了路由表项),那就不需要再向<filename>ppp.linkup</filename>
+ 添加项.您可能希望在连接以后创建一个项来调用程序.这在以后的sendmail的例子中会解释.
+ .</para>
+
+ <para>示例配置文件可以在目录<filename>/usr/share/examples/ppp/</filename>中找到.</para>
+ </sect4>
+
+ <sect4 id="userppp-dynamicIP">
+ <title>PPP和动态IP地址</title>
+ <indexterm><primary>PPP</primary><secondary>with dynamic IP addresses</secondary></indexterm>
+ <indexterm><primary>IPCP</primary></indexterm>
+ <para>如果ISP没给您指定静态的IP地址,<command>ppp</command>要被配置成能够与对方协商确定本地和远程地址.
+ 要完成这项工作,先要<quote>猜</quote>一个IP地址,然后允许
+ <command>ppp</command>在连接后使用IP配置协议(IPCP)进行正确配置.
+ <filename>ppp.conf</filename>的配置是与
+ <link linkend="userppp-staticIP">PPP和静态IP地址</link>一样的,除了以下的改变:</para>
+
+ <programlisting>17 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255</programlisting>
+
+ <para>再次强调,不要包括行号,它只是一个引用标记.缩排一个空格是必须的.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>行17:</term>
+
+ <listitem>
+ <para><literal>/</literal>字符以后是PPP所要求的地址位码.
+ 您可以根据需要使用不同IP号码,但以上的例子永远是可行的.</para>
+
+ <para>最后的参数(<literal>0.0.0.0</literal>)告诉
+ PPP从<hostid
+ role="ipaddr">0.0.0.0</hostid> 而不是 <hostid
+ role="ipaddr">10.0.0.1</hostid> 开始协商地址,对于有些ISP,
+ 这是必需的.不要将 <literal>0.0.0.0</literal>
+ 作为 <command>set ifaddr</command>的第一个参数,因为这使得PPP在
+ <option>-auto</option> 模式时不能设置初始路由.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>如果您不运行<option>-auto</option>模式,
+ 就需要在<filename>/etc/ppp/ppp.linkup</filename>中创建一个项.
+ 连接建立之后,<filename>ppp.linkup</filename>被启用. 这时候,
+ <command>ppp</command>将指派接口地址,接着再添加路由表项:</para>
+ <programlisting>1 provider:
+2 add default HISADDR</programlisting>
+
+ <variablelist>
+ <varlistentry>
+ <term>Line 1:</term>
+
+ <listitem>
+ <para>为了建立连接,
+ <command>ppp</command> 会按按照如下规则在
+ <filename>ppp.linkup</filename>寻找项:首先,试图寻找相同的标签
+ (如同在<filename>ppp.conf</filename>一样).如果失败了,寻找作为网关
+ IP地址的项,此项是四个八位字节的风格.如果依旧没有找到,就寻找<literal>MYADDR</literal>项</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>行 2:</term>
+
+ <listitem>
+ <para>这行告诉 <command>ppp</command>添加指向
+ <literal>HISADDR</literal>的默认路由.
+ <literal>HISADDR</literal>由通过IPCP协商得到的IP号替换.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>参考<filename>/usr/share/examples/ppp/ppp.conf.sample</filename>
+ 和<filename>/usr/share/examples/ppp/ppp.linkup.sample</filename>
+ 中的<literal>pmdemand</literal>项以获取细节化的例子.</para>
+ </sect4>
+
+ <sect4>
+ <title>接收拨入</title>
+ <indexterm><primary>PPP</primary><secondary>receiving
+ incoming calls</secondary></indexterm>
+ <para>当要配置 <application>ppp</application>接受来自LAN上的
+ 拨入时,您需要决定是否将包转给LAN.如果是的话,您就必须从LAN子网中
+ 给对方分配一个IP, 需要在文件<filename>/etc/ppp/ppp.conf</filename>
+ 中使用命令<command>enable proxy</command> .您还应该确定文件
+ <filename>/etc/rc.conf</filename>中包含以下内容:</para>
+
+ <programlisting>gateway_enable="YES"</programlisting>
+ </sect4>
+
+ <sect4>
+ <title>使用哪个ggtty?</title>
+
+ <para><link linkend="dialup">配置FreeBSD的拨号服务</link>描述了怎么使用命令
+ &man.getty.8;启动拨号服务.</para>
+
+ <para>除了<command>getty</command> 还有 <ulink
+ url="http://www.leo.org/~doering/mgetty/index.html">mgetty</ulink>,
+ 它是<command>getty</command>的智能版本,是按照拨号线的思想设计的.</para>
+
+ <para>使用<command>mgetty</command>的好处是它能积极地与modems进行
+ <emphasis>talks</emphasis> ,
+ 这就意味着如果在<filename>/etc/ttys</filename>中的端口被关闭,
+ 您的moderm就不会回应拨入.</para>
+
+ <para>最新版本的<command>mgetty</command> (from
+ 0.99beta onwards)也支持自动侦测PPP数据流,允许客户端不使用脚本就可以访问服务器
+ .</para>
+
+ <para>参考<link linkend="userppp-mgetty">Mgetty 和
+ AutoPPP</link>的联机手册了解更多信息.</para>
+ </sect4>
+
+ <sect4>
+ <title><application>PPP</application> 权限</title>
+
+ <para> <command>ppp</command>命令通常必须作为<username>root</username>用户运行.
+ 但如果想让一个普通用户将<command>ppp</command>运行于服务器模式(就像下面描述的那样)
+ ,您必须要把此用户加入<username>network</username>组以使其获得运行 <command>ppp</command>
+ 的权限.</para>
+
+ <para>您还需要使用<command>allow</command>命令使用户能访问配置文
+ 件的一个或多个部分:</para>
+ <programlisting>allow users fred mary</programlisting>
+
+ <para>如果这个命令被用在 <literal>default</literal>
+ 部分中,您可以让指定的用户访问任何东西.</para>
+ </sect4>
+
+ <sect4>
+ <title>动态IP用户的PPP Shell</title>
+ <indexterm><primary>PPP shells</primary></indexterm>
+
+ <para>创建一个名为<filename>/etc/ppp/ppp-shell</filename>文件,加入以下内容:</para>
+ <programlisting>#!/bin/sh
+IDENT=`echo $0 | sed -e 's/^.*-\(.*\)$/\1/'`
+CALLEDAS="$IDENT"
+TTY=`tty`
+
+if [ x$IDENT = xdialup ]; then
+ IDENT=`basename $TTY`
+fi
+
+echo "PPP for $CALLEDAS on $TTY"
+echo "Starting PPP for $IDENT"
+
+exec /usr/sbin/ppp -direct $IDENT</programlisting>
+
+ <para>这个脚本要有可执行属性. 然后通过如下命令创建一个指向此脚本且名为
+ <filename>ppp-dialup</filename>的符号链接:</para>
+
+ <screen>&prompt.root; <userinput>ln -s ppp-shell /etc/ppp/ppp-dialup</userinput></screen>
+
+ <para>您应该将这个脚本作为所有拨入用户的<emphasis>shell</emphasis>.
+ 以下是在文件<filename>/etc/password</filename>中关于一个PPP用户的例子,用户名为
+ <username>pchilds</username> (切记不要直接修改这个密码文件,
+ 而是使用<command>vipw</command>命令).</para>
+
+ <programlisting>pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialup</programlisting>
+
+ <para>创建一个名为 <filename>/home/ppp</filename>的目录作为拨入用户的主目录,
+ 包含以下这些空文件:</para>
+
+ <screen>-r--r--r-- 1 root wheel 0 May 27 02:23 .hushlogin
+-r--r--r-- 1 root wheel 0 May 27 02:22 .rhosts</screen>
+
+ <para>这样就可以防止<filename>/etc/motd</filename>被显示出来.</para>
+ </sect4>
+
+ <sect4>
+ <title>静态IP用户的Shell </title>
+ <indexterm><primary>PPP shells</primary></indexterm>
+
+ <para>像上面那样创建<filename>ppp-shell</filename>文件,
+ 为每个静态分配IP用户创建一个到 <filename>ppp-shell</filename>的
+ 符号链接.</para>
+
+ <para>例如,如果您有三个拨号用户,
+ <username>fred</username>,<username>sam</username>,和
+ <username>mary</username>,您为他们路由C类网络,您需要键入以下内容:</para>
+
+ <screen>&prompt.root; <userinput>ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-fred</userinput>
+&prompt.root; <userinput>ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-sam</userinput>
+&prompt.root; <userinput>ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-mary</userinput></screen>
+
+ <para>每个用户的Shell必须被设成一个符号链接(例如用户
+ <username>mary</username>的Shell应该是<filename>/etc/ppp/ppp-mary</filename>).</para>
+ </sect4>
+
+ <sect4>
+ <title>为动态IP用户设置<filename>ppp.conf</filename> </title>
+
+ <para> <filename>/etc/ppp/ppp.conf</filename>文件应该包含下面
+ 这些行:</para>
+
+ <programlisting>default:
+ set debug phase lcp chat
+ set timeout 0
+
+ttyd0:
+ set ifaddr 203.14.100.1 203.14.100.20 255.255.255.255
+ enable proxy
+
+ttyd1:
+ set ifaddr 203.14.100.1 203.14.100.21 255.255.255.255
+ enable proxy</programlisting>
+
+ <note>
+ <para>缩进得必须的.</para>
+ </note>
+
+ <para> <literal>default:</literal>项在每次会话时都会加载.每个在
+ <filename>/etc/ttys</filename>中启用的行都必须为其创建一个相似于
+ <literal>ttyd0:</literal> 的项.每一行应该从动态IP 地址池中取得
+ 唯一的IP地址.</para>
+ </sect4>
+
+ <sect4>
+ <title> 为静态IP用户配置<filename>ppp.conf</filename></title>
+
+ <para>根据上面<filename>/usr/share/examples/ppp/ppp.conf</filename>文件的内容,
+ 您必须为每个静态拨号用户添加一个项.我们继续以<username>fred</username>, <username>sam</username>,
+ 和<username>mary</username>为例.</para>
+
+ <programlisting>fred:
+ set ifaddr 203.14.100.1 203.14.101.1 255.255.255.255
+
+sam:
+ set ifaddr 203.14.100.1 203.14.102.1 255.255.255.255
+
+mary:
+ set ifaddr 203.14.100.1 203.14.103.1 255.255.255.255</programlisting>
+
+ <para> 如果需要,<filename>/etc/ppp/ppp.linkup</filename>
+ 也应该包括每个静态IP用户的的路由信息.下面这一行为客户连接添加了
+ <hostid role="ipaddr">203.14.101.0</hostid>C类路由.</para>
+
+ <programlisting>fred:
+ add 203.14.101.0 netmask 255.255.255.0 HISADDR
+
+sam:
+ add 203.14.102.0 netmask 255.255.255.0 HISADDR
+
+mary:
+ add 203.14.103.0 netmask 255.255.255.0 HISADDR</programlisting>
+ </sect4>
+
+ <sect4 id="userppp-mgetty">
+ <title><command>mgetty</command>和AutoPPP</title>
+ <indexterm>
+ <primary><command>mgetty</command></primary>
+ </indexterm>
+ <indexterm><primary>AutoPPP</primary></indexterm>
+ <indexterm><primary>LCP</primary></indexterm>
+
+ <para>在配置和编译<command>mgetty</command>
+ 时启用 <literal>AUTO_PPP</literal>选项
+ 使<command>mgetty</command>能够探测PPP连接的的LCP状态
+ 并自动产生PPP Shell. 但如果默认的login/password队列没有出现,
+ 那就必须使用PAP或CHAP来验证用户.</para>
+
+ <para>这节假定您已经为用户成功地配置,编译了带有<literal>AUTO_PPP</literal>选项的
+ <command>mgetty</command>.</para>
+ <para>确认钅件<filename>/usr/local/etc/mgetty+sendfax/login.config</filename>
+ 包含以下内容:</para>
+
+ <programlisting>/AutoPPP/ - - /etc/ppp/ppp-pap-dialup</programlisting>
+
+ <para>这行告诉<command>mgetty</command>运行
+ <filename>ppp-pap-dialup</filename>脚本来侦听PPP连接.</para>
+
+ <para>创建<filename>/etc/ppp/ppp-pap-dialup</filename>文件写入以下内容 (此文件应该是可执行的):</para>
+
+ <programlisting>#!/bin/sh
+exec /usr/sbin/ppp -direct pap$IDENT</programlisting>
+
+ <para>对应于每个在<filename>/etc/ttys</filename>的启用行,都要在<filename>/etc/ppp/ppp.conf</filename>
+ 中创建相应的项. 这和上面的定义是相同的.</para>
+
+ <programlisting>pap:
+ enable pap
+ set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
+ enable proxy</programlisting>
+
+ <para>每个通过这种方式登录的用户必须在
+ <filename>/etc/ppp/ppp.secret</filename>文件中有一个username/password项,或者加入
+ 以下选项以使服务器通过PAP方式用<filename>/etc/password</filename>文件验证用户.</para>
+
+ <programlisting>enable passwdauth</programlisting>
+
+ <para>如果您想为某些用户分配静态IP,
+ 可以在<filename>/etc/ppp/ppp.secret</filename>中将IP号作为第三个参数指定. 参看
+ <filename>/usr/share/examples/ppp/ppp.secret.sample</filename>
+ 中的例子.</para>
+ </sect4>
+
+ <sect4>
+ <title>MS Extensions</title>
+ <indexterm><primary>DNS</primary></indexterm>
+ <indexterm><primary>NetBIOS</primary></indexterm>
+ <indexterm><primary>PPP</primary><secondary>Microsoft extensions</secondary></indexterm>
+ <para>可以配置PPP以提供DNS和NetBIOS域名服务器地址.</para>
+
+ <para>要在PPP版本 1.x中启用这些扩展,必须向
+ <filename>/etc/ppp/ppp.conf</filename>的相关项加入以下行:</para>
+
+ <programlisting>enable msext
+set ns 203.14.100.1 203.14.100.2
+set nbns 203.14.100.5</programlisting>
+
+ <para>PPP版本2及以上 :</para>
+
+ <programlisting>accept dns
+set dns 203.14.100.1 203.14.100.2
+set nbns 203.14.100.5</programlisting>
+
+ <para>这将告诉客户端首选域名服务器和备用域名服务器.</para>
+
+ <para>在版本2及以上版本中, 如果省略了
+ <literal>set dns</literal>, PPP会使用
+ <filename>/etc/resolv.conf</filename>中的值.</para>
+ </sect4>
+
+ <sect4 id="userppp-PAPnCHAP">
+ <title>PAP 和CHAP验证</title>
+ <indexterm><primary>PAP</primary></indexterm>
+ <indexterm><primary>CHAP</primary></indexterm>
+ <para>一些ISP将系统设置成使用PAP或CHAP机制来完成连接的验证部分.
+ . 如果是这样,在您连接时ISP就不会给出<prompt>login:</prompt>提示符而是立即开始PPP对话.</para>
+
+ <para>PAP安全性要比CHAP差一些,但在这里安全性并不是问题,因为密码(即使用明文传送)只是通过串行线传送.
+ 黑客没有太多机会<quote>窃听</quote>.</para>
+
+ <para>参考<link linkend="userppp-staticIP">PPP
+ 和静态IP地址</link> 或 <link
+ linkend="userppp-dynamicIP">PPP 和动态IP地址</link>
+ 节,必须做以下修改:</para>
+
+ <programlisting>13 set authname <replaceable>MyUserName</replaceable>
+14 set authkey <replaceable>MyPassword</replaceable>
+15 set login</programlisting>
+
+ <variablelist>
+ <varlistentry>
+ <term>第 13 行:</term>
+
+ <listitem>
+ <para>这一行指明您的PAP/CHAP用户名.
+ 您需要为<replaceable>MyUserName</replaceable>输入正确的值.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>第 14 行:</term>
+ <indexterm><primary>password</primary></indexterm>
+ <listitem>
+ <para>这一行指明您的 PAP/CHAP password密码。
+ 您需要为 <replaceable>MyPassword</replaceable> 输入正确的值。
+ 另外,您可能希望加入一些额外的选项,例如:</para>
+
+ <programlisting>16 accept PAP</programlisting>
+
+ <para>或</para>
+
+ <programlisting>16 accept CHAP</programlisting>
+
+ <para>以明确您的意图,但PAP和CHAP都是被默认接受的.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Line 15:</term>
+
+ <listitem>
+ <para>Your ISP will not normally require that you log into
+ the server if you are using PAP or CHAP. You must
+ therefore disable your <quote>set login</quote>
+ string.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect4>
+
+ <sect4>
+ <title>即时改变您的<command>ppp</command> 配置</title>
+
+ <para>与后台运行的<command>ppp</command>程序进行对话是可能的,
+ 前提是设置了一个合适的诊断端口. 做到这一点,需要把下面的行加入到您的配置中:</para>
+
+ <programlisting>set server /var/run/ppp-tun<replaceable>%d</replaceable> DiagnosticPassword 0177</programlisting>
+
+ <para>这行告诉 PPP在指定的&unix;域socket中侦听,当用户连接时需要给出指定的密码.
+ <literal>%d</literal>用<devicename>tun</devicename>设备号替换.</para>
+
+ <para>一旦启用了socket, 就可以在脚本中调用程序&man.pppctl.8;来处理正在运行的
+ 的PPP.</para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="userppp-nat">
+ <title>使用PPP网络地址翻译</title>
+ <indexterm><primary>PPP</primary><secondary>NAT</secondary></indexterm>
+
+ <para>PPP可以使用内建的NAT,而不需内核支持. 这个功能可以通过在<filename>/etc/ppp/ppp.conf</filename>中的
+ 以下行启用:</para>
+
+ <programlisting>nat enable yes</programlisting>
+
+ <para> PPP NAT也可以使用命令行选项
+ <literal>-nat</literal>启动. 在文件
+ <filename>/etc/rc.conf</filename>中也有
+ <literal>ppp_nat</literal>项,且是默认启用的.</para>
+
+ <para>如果您使用了这个特性, 您还会发现在
+<filename>/etc/ppp/ppp.conf</filename>中以下
+ 选项对于启用incoming connections forwarding是有用的:</para>
+
+ <programlisting>nat port tcp 10.0.0.2:ftp ftp
+nat port tcp 10.0.0.2:http http</programlisting>
+
+ <para>or do not trust the outside at all</para>
+
+ <programlisting>nat deny_incoming yes</programlisting>
+ </sect3>
+
+ <sect3 id="userppp-final">
+ <title>最后的系统配置</title>
+ <indexterm><primary>PPP</primary><secondary>configuration</secondary></indexterm>
+
+ <para>现在您已配置了<command>ppp</command>,但在真正工作之前还有一些事情要做.它们都与编辑
+ <filename>/etc/rc.conf</filename>有关.</para>
+
+ <para>从上依次往下看,确认设置了
+ <literal>hostname=</literal> 行, e.g.:</para>
+
+ <programlisting>hostname="foo.example.com"</programlisting>
+
+ <para>如果您的ISP提供给您一个静态的IP和名字,将这个名字设为hostname是最合适的.</para>
+
+ <para>寻找 <literal>network_interfaces</literal> 变量.
+ 如果要配置系统通过拨号连入ISP,
+ 一定要将<devicename>tun0</devicename>设备加入这个列表,否则就删除它.</para>
+
+ <programlisting>network_interfaces="lo0 tun0"
+ifconfig_tun0=</programlisting>
+
+ <note>
+ <para> <literal>ifconfig_tun0</literal>变量应该是空的,且要创建一个名为
+ <filename>/etc/start_if.tun0</filename>的文件.
+ 这个文件应该包含这一行:</para>
+
+ <programlisting>ppp -auto mysystem</programlisting>
+
+ <para>此脚本在网络配置时被执行,开启PPP守护进程进入自动模式.如果这台机子充当一个LAN的网关,
+ 您可能希望使用<option>-alias</option>.参考相关联机手册了解更多细节.</para>
+ </note>
+
+ <para>在<filename>/etc/rc.conf</filename>用下面这一行把路由程序设为<literal>NO</literal>:</para>
+
+ <programlisting>router_enable="NO"</programlisting>
+
+ <indexterm>
+ <primary><application>routed</application></primary>
+ </indexterm>
+ <para>这很重要,如果您没有启动 <command>routed</command> 服务的话(这是默认情况),
+ 因为 <command>routed</command> 总是会删掉 <command>ppp</command> 所建立的默认路由。</para>
+
+ <para>此外,可能还应该确认一下
+ <literal>sendmail_flags</literal> 中不包括
+ <option>-q</option> 这个选项,否则
+ <command>sendmail</command> 会不断地尝试做网络连接,这可能会导致您的机器不停地进行拨号。
+ 可以试试看:</para>
+
+ <programlisting>sendmail_flags="-bd"</programlisting>
+
+ <indexterm>
+ <primary><application>sendmail</application></primary>
+ </indexterm>
+ <para>替代的作法是当每次PPP连接建立时您必须通过键入以下命令强制
+ <command>sendmail</command>重新检查邮件队列:</para>
+
+ <screen>&prompt.root; <userinput>/usr/sbin/sendmail -q</userinput></screen>
+
+ <para>您也可以在<filename>ppp.linkup</filename>使用<command>!bg</command>命令自动完成这些工作:</para>
+
+ <programlisting>1 provider:
+2 delete ALL
+3 add 0 0 HISADDR
+4 !bg sendmail -bd -q30m</programlisting>
+
+ <indexterm><primary>SMTP</primary></indexterm>
+ <para>如果您不喜欢这样做, 可以设立一个
+ <quote>dfilter</quote> 以阻止 SMTP传输.参考相关文件了解更多细节 .</para>
+
+ <para>现在您唯一要做的事是重新启动计算机。
+ 重起之后,可以输入:</para>
+
+ <screen>&prompt.root; <userinput>ppp</userinput></screen>
+
+ <para>然后是<command>dial provider</command>以开启 PPP会话.
+ 或者如果您想让<command>ppp</command>自动建立会话
+ ,因为您有一个广域连接(且没有创建 <filename>start_if.tun0</filename>
+ 脚本),键入:</para>
+
+ <screen>&prompt.root; <userinput>ppp -auto provider</userinput></screen>
+ </sect3>
+
+ <sect3>
+ <title>总结</title>
+
+ <para>当第一次设置PPP时,下面几步是必须的:</para>
+
+ <para>客户端:</para>
+
+ <procedure>
+ <step>
+ <para>确保 <devicename>tun</devicename>编译进了进核.</para>
+ </step>
+
+ <step>
+ <para>确保<filename>tun<replaceable>N</replaceable></filename>
+ 设备文件在 <filename>/dev</filename> 目录中是可用的.</para>
+ </step>
+
+ <step>
+ <para>在
+ <filename>/etc/ppp/ppp.conf</filename>中创建一个项.
+ <filename>pmdemand</filename>示例应该适合于绝大多数ISP.</para>
+ </step>
+
+ <step>
+ <para>如果您使用动态IP地址,在<filename>/etc/ppp/ppp.linkup</filename>创建一个项.</para>
+ </step>
+
+ <step>
+ <para>更新<filename>/etc/rc.conf</filename>
+ 文件.</para>
+ </step>
+
+ <step>
+ <para>如果您要求按需拨号,创建一个<filename>start_if.tun0</filename>脚本.</para>
+ </step>
+ </procedure>
+
+ <para>服务器端:</para>
+
+ <procedure>
+ <step>
+ <para>确保<devicename>tun</devicename>设备已编译入内核.</para>
+ </step>
+
+ <step>
+ <para>确保<filename>tun<replaceable>N</replaceable></filename>设备文件在
+ <filename>/dev</filename>目录中是可用的.</para>
+ </step>
+
+ <step>
+ <para>在<filename>/etc/passwd</filename>中创建一个项
+ (使用&man.vipw.8;程序).</para>
+ </step>
+
+ <step>
+ <para>在用户的home目录创建一个运行
+ <command>ppp -direct direct-server</command>或相似命令的profile.</para>
+ </step>
+
+ <step>
+ <para>在<filename>/etc/ppp/ppp.conf</filename>中创建一个项.
+ <filename>direct-server</filename>示例应该能满足要求.</para>
+ </step>
+
+ <step>
+ <para>在
+ <filename>/etc/ppp/ppp.linkup</filename>中创建一个项.</para>
+ </step>
+
+ <step>
+ <para>更新 <filename>/etc/rc.conf</filename>
+ 文件.</para>
+ </step>
+ </procedure>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="ppp">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Gennady B.</firstname>
+ <surname>Sorokopud</surname>
+ <contrib>Parts originally contributed by </contrib>
+ </author>
+ <author>
+ <firstname>Robert</firstname>
+ <surname>Huff</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>使用内核级PPP</title>
+
+ <sect2>
+ <title>设立内核级PPP</title>
+ <indexterm><primary>PPP</primary><secondary>kernel PPP</secondary></indexterm>
+
+ <para>在开始设置内核级PPP时, 需要确信<command>pppd</command>已经被定位在<filename>/usr/sbin</filename> 中
+ 且存在<filename>/etc/ppp</filename>目录 .</para>
+
+ <para><command>pppd</command>能在两种模式下工作:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>作为一个<quote>客户</quote> &mdash; 您要通过PPP串行线或modem线把您的机器连接到互联网上
+ .</para>
+ </listitem>
+
+ <indexterm><primary>PPP</primary><secondary>server</secondary></indexterm>
+ <listitem>
+ <para>作为<quote>服务器</quote> &mdash;计算机已经位于网络上,且被用于通过PPP与其它计算机连接.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>两种情况您都需要设立一个选项文件,
+ (<filename>/etc/ppp/options</filename> 或者是
+ <filename>~/.ppprc</filename> 如果您的计算机有多个用户使用PPP).</para>
+
+ <para>您还需要一些modem/serial软件(<filename role="package">comms/kermit</filename>就很适合),
+ 使您能够拨号并与远程主机建立连接.</para>
+ </sect2>
+
+ <sect2>
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Trev</firstname>
+ <surname>Roydhouse</surname>
+ <contrib>Based on information provided by </contrib>
+ <!-- Trev.Roydhouse@f401.n711.z3.fidonet.org -->
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>使用<command>pppd</command>作为客户端</title>
+ <indexterm><primary>PPP</primary><secondary>client</secondary></indexterm>
+ <indexterm><primary>Cisco</primary></indexterm>
+ <para>下面这个 <filename>/etc/ppp/options</filename>选项文件能够被用来与CISCO终端服务器的
+ PPP线连接.</para>
+
+ <programlisting>crtscts # enable hardware flow control
+modem # modem control line
+noipdefault # remote PPP server must supply your IP address
+ # if the remote host does not send your IP during IPCP
+ # negotiation, remove this option
+passive # wait for LCP packets
+domain ppp.foo.com # put your domain name here
+
+:&lt;remote_ip&gt; # put the IP of remote PPP host here
+ # it will be used to route packets via PPP link
+ # if you didn't specified the noipdefault option
+ # change this line to &lt;local_ip&gt;:&lt;remote_ip&gt;
+
+defaultroute # put this if you want that PPP server will be your
+ # default router</programlisting>
+
+ <para>连接:</para>
+
+ <indexterm><primary>kermit</primary></indexterm>
+ <indexterm><primary>modem</primary></indexterm>
+ <procedure>
+ <step>
+ <para>使用<application>kermit</application>(或其它的拨号软件)拨号到远程主机, 然后键入用户名和密码 (或者其它).
+ </para>
+ </step>
+
+ <step>
+ <para>退出<application>kermit</application> (不挂断连接).</para>
+ </step>
+
+ <step>
+ <para>键入下面这行:</para>
+
+ <screen>&prompt.root; <userinput>/usr/src/usr.sbin/pppd.new/pppd <replaceable>/dev/tty01</replaceable> <replaceable>19200</replaceable></userinput></screen>
+
+ <para>一定要使用正确的速度和设备名.</para>
+ </step>
+ </procedure>
+
+ <para>现在您的计算机已经用PPP连接. 如果连接失败
+ , 您可在文件<filename>/etc/ppp/options</filename>中添加 <option>debug</option>选项,察看控制台信息以跟踪问题.</para>
+
+ <para>下面这个<filename>/etc/ppp/pppup</filename>脚本能自动完成这三个步骤:</para>
+
+ <programlisting>#!/bin/sh
+ps ax |grep pppd |grep -v grep
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill ${pid}
+fi
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+
+ifconfig ppp0 down
+ifconfig ppp0 delete
+
+kermit -y /etc/ppp/kermit.dial
+pppd /dev/tty01 19200</programlisting>
+
+ <indexterm><primary>kermit</primary></indexterm>
+ <para><filename>/etc/ppp/kermit.dial</filename>是一个 <application>kermit</application>脚本,它用于
+ 向远程主机进行拨号和验证(在文档的最后有这个脚本的例子).</para>
+
+ <para>使用下面这个脚本<filename>/etc/ppp/pppdown</filename>断开PPP连线:</para>
+
+ <programlisting>#!/bin/sh
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ X${pid} != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill -TERM ${pid}
+fi
+
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+
+/sbin/ifconfig ppp0 down
+/sbin/ifconfig ppp0 delete
+kermit -y /etc/ppp/kermit.hup
+/etc/ppp/ppptest</programlisting>
+
+ <para>通过执行<filename>/usr/etc/ppp/ppptest</filename>,看看<command>pppd</command> 是否仍在运行:</para>
+
+ <programlisting>#!/bin/sh
+pid=`ps ax| grep pppd |grep -v grep|awk '{print $1;}'`
+if [ X${pid} != "X" ] ; then
+ echo 'pppd running: PID=' ${pid-NONE}
+else
+ echo 'No pppd running.'
+fi
+set -x
+netstat -n -I ppp0
+ifconfig ppp0</programlisting>
+
+ <para>执行脚本
+ <filename>/etc/ppp/kermit.hup</filename>以挂起moderm,这个文件包含:</para>
+
+ <programlisting>set line /dev/tty01 ; put your modem device here
+set speed 19200
+set file type binary
+set file names literal
+set win 8
+set rec pack 1024
+set send pack 1024
+set block 3
+set term bytesize 8
+set command bytesize 8
+set flow none
+
+pau 1
+out +++
+inp 5 OK
+out ATH0\13
+echo \13
+exit</programlisting>
+
+ <para>也可以用<command>chat</command>
+ 代替<command>kermit</command>:</para>
+
+ <para>以下两个文件用以建立<command>pppd</command>连接.</para>
+
+ <para><filename>/etc/ppp/options</filename>:</para>
+
+ <programlisting>/dev/cuaa1 115200
+
+crtscts # enable hardware flow control
+modem # modem control line
+connect "/usr/bin/chat -f /etc/ppp/login.chat.script"
+noipdefault # remote PPP serve must supply your IP address
+ # if the remote host doesn't send your IP during
+ # IPCP negotiation, remove this option
+passive # wait for LCP packets
+domain &lt;your.domain&gt; # put your domain name here
+
+: # put the IP of remote PPP host here
+ # it will be used to route packets via PPP link
+ # if you didn't specified the noipdefault option
+ # change this line to &lt;local_ip&gt;:&lt;remote_ip&gt;
+
+defaultroute # put this if you want that PPP server will be
+ # your default router</programlisting>
+
+ <para><filename>/etc/ppp/login.chat.script</filename>:</para>
+
+ <note>
+ <para>以下的内容应该放在一行内.</para>
+ </note>
+
+ <programlisting>ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT&lt;phone.number&gt;
+ CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: &lt;login-id&gt;
+ TIMEOUT 5 sword: &lt;password&gt;</programlisting>
+
+ <para>一旦这些被安装且修改正确,您所要做的就是运行<command>pppd</command>,就像这样:</para>
+
+ <screen>&prompt.root; <userinput>pppd</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>使用<command>pppd</command>作为服务器</title>
+
+ <para><filename>/etc/ppp/options</filename>要包括下面这些内容:</para>
+
+ <programlisting>crtscts # Hardware flow control
+netmask 255.255.255.0 # netmask (not required)
+192.114.208.20:192.114.208.165 # IP's of local and remote hosts
+ # local ip must be different from one
+ # you assigned to the Ethernet (or other)
+ # interface on your machine.
+ # remote IP is IP address that will be
+ # assigned to the remote machine
+domain ppp.foo.com # your domain
+passive # wait for LCP
+modem # modem line</programlisting>
+
+ <para>下面这个脚本<filename>/etc/ppp/pppserv</filename>
+ 使<application>pppd</application>以服务器方式启动:</para>
+
+ <programlisting>#!/bin/sh
+ps ax |grep pppd |grep -v grep
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill ${pid}
+fi
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+
+# reset ppp interface
+ifconfig ppp0 down
+ifconfig ppp0 delete
+
+# enable autoanswer mode
+kermit -y /etc/ppp/kermit.ans
+
+# run ppp
+pppd /dev/tty01 19200</programlisting>
+
+ <para>使用脚本<filename>/etc/ppp/pppservdown</filename>停止服务器:</para>
+
+ <programlisting>#!/bin/sh
+ps ax |grep pppd |grep -v grep
+pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing pppd, PID=' ${pid}
+ kill ${pid}
+fi
+ps ax |grep kermit |grep -v grep
+pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
+if [ "X${pid}" != "X" ] ; then
+ echo 'killing kermit, PID=' ${pid}
+ kill -9 ${pid}
+fi
+ifconfig ppp0 down
+ifconfig ppp0 delete
+
+kermit -y /etc/ppp/kermit.noans</programlisting>
+
+ <para>The following <application>kermit</application> script
+ (<filename>/etc/ppp/kermit.ans</filename>) will enable/disable
+ autoanswer mode on your modem. It should look like this:</para>
+
+ <programlisting>set line /dev/tty01
+set speed 19200
+set file type binary
+set file names literal
+set win 8
+set rec pack 1024
+set send pack 1024
+set block 3
+set term bytesize 8
+set command bytesize 8
+set flow none
+
+pau 1
+out +++
+inp 5 OK
+out ATH0\13
+inp 5 OK
+echo \13
+out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable
+ ; autoanswer mode
+inp 5 OK
+echo \13
+exit</programlisting>
+
+ <para>一个名为<filename>/etc/ppp/kermit.dial</filename>的脚本用于向远程主机
+ 进行拨号和验证.您要根据需要定制它.要加入您的登寻名和密码.您还要根据modem
+ 和远程主机的反应更改输入语句.</para>
+
+ <programlisting>;
+; put the com line attached to the modem here:
+;
+set line /dev/tty01
+;
+; put the modem speed here:
+;
+set speed 19200
+set file type binary ; full 8 bit file xfer
+set file names literal
+set win 8
+set rec pack 1024
+set send pack 1024
+set block 3
+set term bytesize 8
+set command bytesize 8
+set flow none
+set modem hayes
+set dial hangup off
+set carrier auto ; Then SET CARRIER if necessary,
+set dial display on ; Then SET DIAL if necessary,
+set input echo on
+set input timeout proceed
+set input case ignore
+def \%x 0 ; login prompt counter
+goto slhup
+
+:slcmd ; put the modem in command mode
+echo Put the modem in command mode.
+clear ; Clear unread characters from input buffer
+pause 1
+output +++ ; hayes escape sequence
+input 1 OK\13\10 ; wait for OK
+if success goto slhup
+output \13
+pause 1
+output at\13
+input 1 OK\13\10
+if fail goto slcmd ; if modem doesn't answer OK, try again
+
+:slhup ; hang up the phone
+clear ; Clear unread characters from input buffer
+pause 1
+echo Hanging up the phone.
+output ath0\13 ; hayes command for on hook
+input 2 OK\13\10
+if fail goto slcmd ; if no OK answer, put modem in command mode
+
+:sldial ; dial the number
+pause 1
+echo Dialing.
+output atdt9,550311\13\10 ; put phone number here
+assign \%x 0 ; zero the time counter
+
+:look
+clear ; Clear unread characters from input buffer
+increment \%x ; Count the seconds
+input 1 {CONNECT }
+if success goto sllogin
+reinput 1 {NO CARRIER\13\10}
+if success goto sldial
+reinput 1 {NO DIALTONE\13\10}
+if success goto slnodial
+reinput 1 {\255}
+if success goto slhup
+reinput 1 {\127}
+if success goto slhup
+if < \%x 60 goto look
+else goto slhup
+
+:sllogin ; login
+assign \%x 0 ; zero the time counter
+pause 1
+echo Looking for login prompt.
+
+:slloop
+increment \%x ; Count the seconds
+clear ; Clear unread characters from input buffer
+output \13
+;
+; put your expected login prompt here:
+;
+input 1 {Username: }
+if success goto sluid
+reinput 1 {\255}
+if success goto slhup
+reinput 1 {\127}
+if success goto slhup
+if < \%x 10 goto slloop ; try 10 times to get a login prompt
+else goto slhup ; hang up and start again if 10 failures
+
+:sluid
+;
+; put your userid here:
+;
+output ppp-login\13
+input 1 {Password: }
+;
+; put your password here:
+;
+output ppp-password\13
+input 1 {Entering SLIP mode.}
+echo
+quit
+
+:slnodial
+echo \7No dialtone. Check the telephone line!\7
+exit 1
+
+; local variables:
+; mode: csh
+; comment-start: "; "
+; comment-start-skip: "; "
+; end:</programlisting>
+ </sect2>
+ </sect1>
+
+ <sect1 id="ppp-troubleshoot">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 13 June 2003 -->
+ </sect1info>
+ <title><acronym>PPP</acronym> 连接故障排除</title>
+
+ <indexterm><primary>PPP</primary><secondary>troubleshooting</secondary></indexterm>
+
+ <para>本节将讲述通过modem连接使用PPP时可能出现的问题
+ . 例如,您可能需要确切地知道您拨入的系统会出现一个怎样的命令行提示符.有些<acronym>ISP</acronym>会提供
+ <literal>ssword</literal>提示符,而其它的可能会出现
+ <literal>password</literal>; 如果没有根据情况的不同相应地编写<command>ppp</command>
+ 脚本,登录就会失败.诊断<command>ppp</command>最常用的方法是手动进行连接
+ . 以下的信息会一步一步地带您完成手动连接.</para>
+
+ <sect2>
+ <title>检查设备节点</title>
+
+ <para>如果您的内核是经过重新配置的,那么就需要检查<devicename>sio</devicename>设备.
+ 如果没有配置过内核, 就没什么可担心的了.只要查看
+ <command>dmesg</command>的输出以找到modem设备:</para>
+
+ <screen>&prompt.root;<userinput>dmesg | grep sio</userinput></screen>
+
+ <para>您应该找到与<devicename>sio</devicename>设备有关的输出. 这些就是我们需要的COM端口.
+ 如果您的modem按照标准串行端口工作,您能在<devicename>sio1</devicename>或<devicename>COM2</devicename>找到它. 如果是这样,
+ 您只需创建serial设备,而不必重建内核. cd到<filename>/dev</filename>目录,然后运行
+ <filename>MAKEDEV</filename>脚本 :</para>
+
+ <screen>&prompt.root; <userinput>sh MAKEDEV cuaa0 cuaa1 cuaa2 cuaa3</userinput></screen>
+
+ <para>它会为您的系统创建串行(serial)设备.
+ 如果modem设备连接在<devicename>sio1</devicename>接口(在DOS中称为<devicename>COM2</devicename>),那么您的modem将会是
+ <filename>/dev/cuaa1</filename>。</para>
+ </sect2>
+
+ <sect2>
+ <title>手动连接</title>
+
+ <para>通过手动控制<command>ppp</command>来连接Internet
+ 是诊断连接及获知<acronym>ISP</acronym>处理<application>PPP</application>客户端方式的一个快速,简单的方法.
+ .让我们从<application>PPP</application> 命令行开始.在所有的例子中我们使用
+ <emphasis>example</emphasis>作为运行<application>PPP</application>主机的主机名.键入<command>ppp</command>
+ 命令打开<command>ppp</command> :</para>
+
+ <screen>&prompt.root; <userinput>ppp</userinput></screen>
+
+ <para>现在我们已经打开了<command>ppp</command>.</para>
+
+ <screen>ppp ON example&gt; <userinput>set device <filename>/dev/cuaa1</filename></userinput></screen>
+
+ <para>设置modem设备,在本例子中是
+ <devicename>cuaa1</devicename>.</para>
+
+ <screen>ppp ON example&gt; <userinput>set speed 115200</userinput></screen>
+
+ <para>设置连接速度,在本例中我们使用15,200 <acronym>kbps</acronym>.</para>
+
+ <screen>ppp ON example&gt; <userinput>enable dns</userinput></screen>
+
+ <para>使<command>ppp</command>配置域名服务,
+ 在文件<filename>/etc/resolv.conf</filename>中添加域名服务器行.
+ .如果 <command>ppp</command>不能确定我们的主机名,可以在稍后设置.</para>
+
+ <screen>ppp ON example&gt; <userinput>term</userinput></screen>
+
+ <para>切换到 <quote>终端</quote>样我们就能手动地控制模式,这modem.</para>
+
+ <programlisting>deflink: Entering terminal mode on <filename>/dev/cuaa1</filename>
+type '~h' for help</programlisting>
+
+ <screen><userinput>at</userinput>
+OK
+<userinput>atdt<replaceable>123456789</replaceable></userinput></screen>
+
+ <para>使用命令<command>at</command>初始化modem,
+ 然后使用<command>atdt</command>和<acronym>ISP</acronym>给您的号码进行拨号.</para>
+
+ <screen>CONNECT</screen>
+
+ <para>连接配置,如果我们遇到了与硬件无关的连接问题,可以在这里尝试解决.</para>
+
+ <screen>ISP Login:<userinput>myusername</userinput></screen>
+
+ <para>这里提示您输入用户名,输入<acronym>ISP</acronym>提供的用户名然后按回车.</para>
+
+ <screen>ISP Pass:<userinput>mypassword</userinput></screen>
+
+ <para>这时提示我们输入密码,输入
+ <acronym>ISP</acronym>提供的密码.
+ 如同登录入&os;,密码不会显示.</para>
+
+ <screen>Shell or PPP:<userinput>ppp</userinput></screen>
+
+ <para>由于<acronym>ISP</acronym>的不同,这个提示符可能不会出现.这里我们被问及:是使用
+ 一个运行于提供商端的Shell还是启动<command>ppp</command>. 这本例中,我们选择使用<command>ppp</command>因为我
+ 们想得到Internet连接.</para>
+
+ <screen>Ppp ON example&gt;</screen>
+
+ <para>注意在这个例子中,第一个 <option>p</option>已经大写. 这显示我们已经成功地连接上了<acronym>ISP</acronym>.</para>
+
+ <screen>PPp ON example&gt;</screen>
+
+ <para>我们已经成功通过了
+ <acronym>ISP</acronym>的验证,正在等待分配<acronym>IP</acronym>地址.</para>
+
+ <screen>PPP ON example&gt;</screen>
+
+ <para>我们得到了一个 <acronym>IP</acronym>
+ 地址,成功地完成了连接.</para>
+
+ <screen>PPP ON example&gt;<userinput>add default HISADDR</userinput></screen>
+
+ <para>这里,我们添加默认路由.在能与外界通信之前我们需要这样做,因为现在我们
+ 只与服务器端建立了连接.如果由于已存在的路由而导致操作失败,
+ 您可以在<option>add</option>前加<literal>!</literal>号.
+ 作为另外一种方式,您也可以在真正连接之前设置这些(指add default HISADDR),ppp会根据这项设定协商取
+ 得一个新的路由.</para>
+
+ <para>如果一切顺利,现在我们应该能得到一个活动的Internet连接,可以使用<keycombo
+ action="simul"><keycap>CTRL</keycap>
+ <keycap>z</keycap></keycombo>使其转入后台.如果您发现
+ <command>PPP</command>重新变为 <command>ppp</command>,那代表我们失去了连接..
+ 大写的P表明我们有到<acronym>ISP</acronym>的连接
+ 而小写的p表明由于某种原因我们失去了连接.这便于我们了解连接状态.
+ <command>ppp</command> 只有这两个状态.</para>
+
+ <sect3>
+ <title>诊断排错</title>
+
+ <para>如果您有一根直连线且似乎不能建立连接,要使用<option>set
+ ctsrts off</option>以关闭字节流的<acronym>CTS/RTS</acronym>.这种情况一般发
+ 生在连接兼容<application>PPP</application>的终端服务器时.
+ 当它向通信连接写入数据时,<application>PPP</application>就会挂起,
+ 一直等待一个<acronym>CTS</acronym>,
+ 或者一个不可能出现的Clear to Send信号。 如果使用了这个选项, 您还应使用
+ <option>set accmap</option>选项,
+ 某些存在缺陷的硬件在完成端对端发送特定字符, 特别是
+ XON/XOFF 时可能会遇到困难。 请参见 &man.ppp.8;
+ 联机手册以了解关于可用选项的更多细节, 以及如何使用它们。</para>
+
+ <para>如果您有一个比较旧的modem, 您要用
+ <option>set parity even</option>。 奇偶校验的默认设置是 none,
+ 但在旧式的 (当流量大量增加时) 调制解调器和某些
+ <acronym>ISP</acronym> 被用来纠错。 您需要使用这个选项才能使用
+ Compuserve <acronym>ISP</acronym>。</para>
+
+ <para><application>PPP</application> 可能并不返回命令模式,
+ 这通常是 <acronym>ISP</acronym> 等待您这一端发起协商时发生了错误。
+ 此时, 使用 <command>~p</command> 命令将强制 ppp 开始发送配置信息。</para>
+
+ <para>如果您没有看到登陆提示, 则很可能需要使用
+ <acronym>PAP</acronym> 或
+ <acronym>CHAP</acronym> 验证来代替前面例子中的
+ &unix; 风格验证。 要使用
+ <acronym>PAP</acronym> 或 <acronym>CHAP</acronym>
+ 只需在进入终端模式之前把下面的选项加入
+ <application>PPP</application>:</para>
+
+ <screen>ppp ON example&gt; <userinput>set authname <replaceable>myusername</replaceable></userinput></screen>
+
+ <para>此处 <replaceable>myusername</replaceable> 应改为您的
+ <acronym>ISP</acronym> 分配给您的用户名。</para>
+
+ <screen>ppp ON example&gt; <userinput>set authkey <replaceable>mypassword</replaceable></userinput></screen>
+
+ <para>此处 <replaceable>mypassword</replaceable> 应该为您的
+ <acronym>ISP</acronym> 分配给您的口令。</para>
+
+ <para>如果连接正常, 但无法查找域名, 请尝试
+ &man.ping.8; 某个 <acronym>IP</acronym>
+ 地址来看看是否返回了信息。 如果您发现百分之百 (100%) 丢包,
+ 那么您很可能没有分配默认路由。 请仔细检查选项
+ <option>add default HISADDR</option>
+ 是否在连接时被设置了。 如果您能连接到远程的
+ <acronym>IP</acronym> 地址则有可能域名解析服务器的地址没有被加入到
+ <filename>/etc/resolv.conf</filename>。 这个文件应该是下面的样子:</para>
+
+ <programlisting>domain <replaceable>example.com</replaceable>
+nameserver <replaceable>x.x.x.x</replaceable>
+nameserver <replaceable>y.y.y.y</replaceable></programlisting>
+
+ <para>此处 <replaceable>x.x.x.x</replaceable> 和
+ <replaceable>y.y.y.y</replaceable> 应该改为您的
+ <acronym>ISP</acronym> 的 DNS 服务器的
+ <acronym>IP</acronym> 地址。
+ 这一信息在您注册时可能会提供给您,
+ 不过通常只需给 <acronym>ISP</acronym> 打个电话就能知道了。</para>
+
+ <para>您还可以让 &man.syslog.3; 为您的 <application>PPP</application>
+ 连接提供日志。 只需增加:</para>
+
+ <programlisting>!ppp
+*.* /var/log/ppp.log</programlisting>
+
+ <para>到 <filename>/etc/syslog.conf</filename> 中。 绝大多数情况下,
+ 这个功能默认已经打开了。</para>
+
+ </sect3>
+ </sect2>
+ </sect1>
+
+
+
+
+ <sect1 id="pppoe">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Contributed (from http://node.to/freebsd/how-tos/how-to-freebsd-pppoe.html) by </contrib>
+ </author>
+ </authorgroup>
+ <!-- 10 Jan 2000 -->
+ </sect1info>
+
+ <title>使用基于以太网的PPP(PPPoE)</title>
+ <indexterm><primary>PPP</primary><secondary>over Ethernet</secondary></indexterm>
+ <indexterm>
+ <primary>PPPoE</primary>
+ <see>PPP, over Ethernet</see>
+ </indexterm>
+
+ <para>本节将介绍如何建立基于以太网的PPP
+ (<acronym>PPPoE</acronym>).</para>
+
+ <sect2>
+ <title>配置内核</title>
+
+ <para>对于PPPOE,并没有必须的内核配置. 如果必需的netgraph支持没有编译入内核 ,它可以由
+ <application>ppp</application>动态加载.</para>
+ </sect2>
+
+ <sect2>
+ <title>设置<filename>ppp.conf</filename></title>
+
+ <para>以下是一个<filename>ppp.conf</filename>的例子:</para>
+
+ <programlisting>default:
+ set log Phase tun command # you can add more detailed logging if you wish
+ set ifaddr 10.0.0.1/0 10.0.0.2/0
+
+name_of_service_provider:
+ set device PPPoE:<replaceable>xl1</replaceable> # replace xl1 with your Ethernet device
+ set authname YOURLOGINNAME
+ set authkey YOURPASSWORD
+ set dial
+ set login
+ add default HISADDR</programlisting>
+
+ </sect2>
+
+ <sect2>
+ <title>运行<application>ppp</application></title>
+
+ <para>作为<username>root</username>,您可以执行:</para>
+
+ <screen>&prompt.root; <userinput>ppp -ddial name_of_service_provider</userinput></screen>
+
+ </sect2>
+
+ <sect2>
+ <title>启动时运行<application>ppp</application> </title>
+
+ <para>在文件<filename>/etc/rc.conf</filename>加入以下内容:</para>
+
+ <programlisting>ppp_enable="YES"
+ppp_mode="ddial"
+ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO
+ppp_profile="name_of_service_provider"</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>使用 PPPoE 服务标签</title>
+
+ <para>在某些时候,有必要使用一个服务标签来建立您的连接.服务标签用于区分同一网络中的不同服务器.</para>
+
+ <para>您可以在ISP提供的文档中找到必要的服务标签信息.若不能找到,向您的ISP询求技术支持.</para>
+
+ <para>作为最后的方法, 您可以试试程序
+ <ulink url="http://www.roaringpenguin.com/pppoe/">Roaring Penguin
+ PPPoE</ulink> 所建议的方法,这个程序可以在 <link
+ linkend="ports">ports collection</link>找到. 但要切记,
+ 这会de-program您的modem,可能使其无效,因此在使用之前要考虑再三.装与modem一起取得的程序.然后访问
+ 这个程序的<guimenu>System</guimenu>菜单.您的profile名应该在那里显示出来.一般是会
+ <emphasis>ISP</emphasis>的名称.</para>
+
+ <para> profile名(服务器标签)会在
+ <filename>ppp.conf</filename>中的PPPOE配置项作为 <command>set device</command>命令的provider部分被用到(参考&man.ppp.8;).
+ 如下所示:</para>
+
+ <programlisting>set device PPPoE:<replaceable>xl1</replaceable>:<replaceable>ISP</replaceable></programlisting>
+
+ <para>记住将<replaceable>xl1</replaceable>换成实际的以太网设备.</para>
+ <para>记住将 <replaceable>ISP</replaceable>
+ 换成您刚刚找到的profile名.</para>
+
+ <para>获得更多的信息,请参考:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink
+ url="http://renaud.waldura.com/doc/freebsd/pppoe/">Cheaper
+ Broadband with FreeBSD on DSL</ulink> by Renaud
+ Waldura.</para>
+ </listitem>
+
+ <listitem>
+ <para><ulink
+ url="http://www.ruhr.de/home/nathan/FreeBSD/tdsl-freebsd.html">
+ Nutzung von T-DSL und T-Online mit FreeBSD</ulink>
+ by Udo Erdelhoff (in German).</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2 id="ppp-3com">
+
+ <title>带有一个&tm.3com; <trademark class="registered">HomeConnect</trademark>ADSL Modem的PPPOE双重连接</title>
+
+ <para>这个modem不遵循<ulink
+ url="http://www.faqs.org/rfcs/rfc2516.html">RFC 2516</ulink>
+ (<emphasis>A Method for transmitting PPP over Ethernet
+ (PPPoE)</emphasis>, written by L. Mamakos, K. Lidl, J. Evarts,
+ D. Carrel, D. Simone, and R. Wheeler). 而是使用不同的数据包格式作为以太网的框架.请向
+ <ulink url="http://www.3com.com/">3Com</ulink>抱怨,如果您认为它应该遵守PPPOE的规范.</para>
+
+ <para>为了让FreeBSD能够与这个设备通信,必须设置sysctl.通过更改<filename>/etc/sysctl.conf</filename>,这一步
+ 可以在启动时自动完成:</para>
+
+ <programlisting>net.graph.nonstandard_pppoe=1</programlisting>
+
+ <para>或直接执行命令:
+ <command>sysctl net.graph.nonstandard_pppoe=1</command>.</para>
+
+ <para>很不幸,由于这是系统全局设置,无法同时与正常的PPP客户端(或服务器)
+ 和&tm.3com;<trademark class="registered">HomeConnect</trademark> ADSL Modem通信
+ .</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="pppoa">
+ <title>Using <application>PPP</application> over ATM (PPPoA)</title>
+ <indexterm><primary>PPP</primary><secondary>over ATM</secondary></indexterm>
+ <indexterm>
+ <primary>PPPoA</primary>
+ <see>基于ATM的PPP</see>
+ </indexterm>
+
+ <para>以下将介绍如何设置基于ATM的PPP(PPPoA).
+ PPPoA是欧洲DSL提供商的普遍选择 .</para>
+
+ <sect2>
+ <title>使用带有一个Alcatel &speedtouch;USB的PPPoA </title>
+
+ <para>在FreeBSD中对这个设备的PPPoA支持是作为一个port
+ 提供的.因为此设备的驱动程序是在 <ulink
+ url="http://www.speedtouchdsl.com/disclaimer_lx.htm">Alcatel的许可协议</ulink>下发布的,
+ 无法再在FreeBSD的基础系统中自由的重新发布.</para>
+
+ <para>要安装这个软件,只需使用<link linkend="ports">ports collection</link>. 安装
+ <filename role="package">net/pppoa</filename>port,然后根据提供的指示操作.</para>
+
+ <para>如同大部分的USB设备, Alcatel &speedtouch; USB也需要从主机上
+ 下载驱动程序以正常工作.可以在&os;中自动完成这个过程(当每次设备被接入USB接口时,即完成传输).
+ 加入到<filename>/etc/usbd.conf</filename>需要加入以下内容以启用自动化固件传输.
+ <username>root</username>才有用户有权限编辑这个文件.</para>
+
+ <programlisting>device "Alcatel SpeedTouch USB"
+ devname "ugen[0-9]+"
+ vendor 0x06b9
+ product 0x4061
+ attach "/usr/local/sbin/modem_run -f /usr/local/libdata/mgmt.o"</programlisting>
+
+ <para>要启动USB守护进程<application>usbd</application>,
+ 在<filename>/etc/rc.conf</filename>加入以下行:</para>
+
+ <programlisting>usbd_enable="YES"</programlisting>
+
+ <para>也可以将<application>ppp</application>设置成启动时拨号. 向
+ <filename>/etc/rc.conf</filename>加入以下这几行.
+ 同样地您需要以<username>root</username>用户登录.</para>
+
+ <programlisting>ppp_enable="YES"
+ppp_mode="ddial"
+ppp_profile="adsl"</programlisting>
+
+ <para>为了使其正常工作,您需要使用<filename role="package">net/pppoa</filename>
+ port提供的<filename>ppp.conf</filename>样例.</para>
+
+ </sect2>
+
+ <sect2>
+ <title>使用mpd</title>
+
+ <para>您可以使用<application>mpd</application>连接多种服务
+ ,特别是PPTP服务.您能在ports collection中找到<application>mpd</application>
+ (<filename role="package">net/mpd</filename>).许多ADSL modem
+ 需要在计算机和modem之间创建一个PPTP tunnel. Alcatel &speedtouch;
+ Home就是这样的modem.</para>
+
+ <para>首先您必须安装这个port,然后您要配置
+ <application>mpd</application>以符合您的需要及提供商的设置.这个port把一系列编写
+ 地很好的配置文件样例放在<filename><replaceable>PREFIX</replaceable>/etc/mpd/</filename>目录中.
+ 注意这里的 <replaceable>PREFIX</replaceable>指的是port安装的目录,默认的是
+ <filename>/usr/local/</filename>.port完成安装后,会有一份完整的<application>mpd</application>配置向导放在
+ <filename><replaceable>PREFIX</replaceable>/share/doc/mpd/</filename>目录.
+ 这里是一个使用<application>mpd</application>连接ADSL的样例配置信息. 配置分为两个文件
+ 第一个是<filename>mpd.conf</filename>:</para>
+
+ <programlisting>default:
+ load adsl
+
+adsl:
+ new -i ng0 adsl adsl
+ set bundle authname <replaceable>username</replaceable> <co
+ id="co-mpd-ex-user">
+ set bundle password <replaceable>password</replaceable> <co
+ id="co-mpd-ex-pass">
+ set bundle disable multilink
+
+ set link no pap acfcomp protocomp
+ set link disable chap
+ set link accept chap
+ set link keep-alive 30 10
+
+ set ipcp no vjcomp
+ set ipcp ranges 0.0.0.0/0 0.0.0.0/0
+
+ set iface route default
+ set iface disable on-demand
+ set iface enable proxy-arp
+ set iface idle 0
+
+ open</programlisting>
+
+ <calloutlist>
+ <callout arearefs="co-mpd-ex-user">
+ <para>username用来向您的ISP进行验证.</para>
+ </callout>
+ <callout arearefs="co-mpd-ex-pass">
+ <para> password用来向您的ISP进行验证.</para>
+ </callout>
+ </calloutlist>
+
+ <para><filename>mpd.links</filename>包含连接的信息:</para>
+
+ <programlisting>adsl:
+ set link type pptp
+ set pptp mode active
+ set pptp enable originate outcall
+ set pptp self <replaceable>10.0.0.1</replaceable> <co
+ id="co-mpd-ex-self">
+ set pptp peer <replaceable>10.0.0.138</replaceable> <co
+ id="co-mpd-ex-peer"></programlisting>
+
+ <calloutlist>
+ <callout arearefs="co-mpd-ex-self">
+ <para>运行<application>mpd</application>的主机的IP地址.</para>
+ </callout>
+ <callout arearefs="co-mpd-ex-peer">
+ <para>ADSL modem的IP地址.Alcatel
+ &speedtouch; Home 默认的是 <hostid
+ role="ipaddr">10.0.0.138</hostid>.</para>
+ </callout>
+ </calloutlist>
+
+ <para>初始化连接:</para>
+
+ <screen>&prompt.root; <userinput>mpd -b <replaceable>adsl</replaceable></userinput></screen>
+
+ <para>您可以通过以下命令查看连接状态:</para>
+
+ <screen>&prompt.user; <userinput>ifconfig <replaceable>ng0</replaceable></userinput>
+ng0: flags=88d1&lt;UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST&gt; mtu 1500
+ inet 216.136.204.117 --> 204.152.186.171 netmask 0xffffffff</screen>
+
+ <para>使用<application>mpd</application>连接ADSL服务是推荐的方式.</para>
+
+ </sect2>
+
+ <sect2>
+ <title>使用pptpclient</title>
+
+ <para>也可以使用<filename role="package">net/pptpclient</filename>连接其它的
+ PPPoA.</para>
+
+ <para>为了使用<filename role="package">net/pptpclient</filename>连接
+ DSL服务,需要安装port或package并编辑<filename>/etc/ppp/ppp.conf</filename>.您需要有
+ <username>root</username>权限以进行这两项操作.以下是<filename>ppp.conf</filename>中的一个示例项.
+ 参考<application>ppp</application>的联机手册&man.ppp.8;,以获取更多有关<filename>ppp.conf</filename>
+ 选项的信息.</para>
+
+ <programlisting>adsl:
+ set log phase chat lcp ipcp ccp tun command
+ set timeout 0
+ enable dns
+ set authname <replaceable>username</replaceable> <co id="co-pptp-ex-user">
+ set authkey <replaceable>password</replaceable> <co id="co-pptp-ex-pass">
+ set ifaddr 0 0
+ add default HISADDR</programlisting>
+
+ <calloutlist>
+ <callout arearefs="co-pptp-ex-user">
+ <para>The username of your account with the DSL provider.</para>
+ </callout>
+ <callout arearefs="co-pptp-ex-pass">
+ <para>The password for your account.</para>
+ </callout>
+ </calloutlist>
+
+ <warning>
+ <para>由于您必须将帐号密码以明文的方式放入<filename>ppp.conf</filename>
+ 您应该确保没有任何人能看到此文件的内容.以下一系列命令将会确保此文件只对
+ <username>root</username>用户可读.参考&man.chmod.1;和&man.chown.8; 的联机手册以获得更多信息.</para>
+ <screen>&prompt.root; <userinput>chown root:wheel /etc/ppp/ppp.conf</userinput>
+&prompt.root; <userinput>chmod 600 /etc/ppp/ppp.conf</userinput></screen>
+ </warning>
+
+ <para>以下将为到DSL路由器的会话打开一个tunnel.
+ 以太网DSL modem有一个设置的局域网IP地址. 以Alcatel &speedtouch; Home为例,这个地址是
+ <hostid role="ipaddr">10.0.0.138</hostid>.路由器的文档应该会告诉您它使用地址.执行以下命令
+ 以打开tunnel并开始会话:</para>
+
+ <screen>&prompt.root; <userinput>pptp <replaceable>address</replaceable> <replaceable>adsl</replaceable></userinput></screen>
+
+ <tip>
+ <para>您应该在命令的最后加上(<quote>&amp;</quote>)号,否则 <application>pptp</application>
+ 无法返回到命令行提示符.</para>
+ </tip>
+
+ <para>要创建一个 <devicename>tun</devicename>虚拟设备用于进程<application>pptp</application>
+ 和<application>ppp</application> 之间的交互.一旦您返回到了命令行,或者 <application>pptp</application>
+ 进程确认了一个连接,您可以这样检查tunnel设备:</para>
+
+ <screen>&prompt.user; <userinput>ifconfig <replaceable>tun0</replaceable></userinput>
+tun0: flags=8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1500
+ inet 216.136.204.21 --> 204.152.186.171 netmask 0xffffff00
+ Opened by PID 918</screen>
+
+ <para>如果您无法连接,一般可以通过<application>telnet</application>或者web浏览器检查路由器(modem)的配置.
+ 如果依旧无法连接,您应该检查<command>pptp</command>的输出及<application>ppp</application>的日志文件
+ <filename>/var/log/ppp.log</filename> 以获得线索.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="slip">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Satoshi</firstname>
+ <surname>Asami</surname>
+ <contrib>Originally contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Guy</firstname>
+ <surname>Helmer</surname>
+ <contrib>With input from </contrib>
+ </author>
+ <author>
+ <firstname>Piero</firstname>
+ <surname>Serini</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>使用SLIP</title>
+ <indexterm><primary>SLIP</primary></indexterm>
+
+ <sect2 id="slipc">
+ <title>设置SLIP客户端</title>
+ <indexterm><primary>SLIP</primary><secondary>client</secondary></indexterm>
+ <para>下面是一个在静态主机网络上设置FreeBSD机器的方法.对于动态主机名分配(您的地址在每次拨号时都会改变),
+ 您可能还需要更复杂的设置.</para>
+
+ <para>首先,确定您的modem连接的串行口.
+ 许多人会设置符号连接, 比如<filename>/dev/modem</filename>指向真实的设备名
+ <filename>/dev/cuaaN</filename>.这充许您抽像真实的设备名. 当您需
+ 要在<filename>/etc</filename>和<filename>.kermrc</filename>文件中修复整个系统上的许多文件时,
+ 这是一件非常麻烦的事情!</para>
+
+ <note>
+ <para><filename>/dev/cuaa0</filename> is
+ <devicename>COM1</devicename>, <filename>cuaa1</filename> is
+ <devicename>COM2</devicename>, etc.</para>
+ </note>
+
+ <para>确保您的内核文件包含以下内容:</para>
+
+ <programlisting>pseudo-device sl 1</programlisting>
+
+ <para>在 &os;&nbsp;5.X 中, 则应使用:</para>
+
+ <programlisting>device sl</programlisting>
+
+ <para>这包含在<filename>GENERIC</filename>内核,所以这应该不会是个问题,除非您
+ 已经删除了它。</para>
+
+ <sect3>
+ <title>只需做一次的事情</title>
+
+ <procedure>
+ <step>
+ <para>向文件<filename>/etc/hosts</filename>添加您的主机,网关和域名服务器.我的是这样的:</para>
+
+ <programlisting>127.0.0.1 localhost loghost
+136.152.64.181 water.CS.Example.EDU water.CS water
+136.152.64.1 inr-3.CS.Example.EDU inr-3 slip-gateway
+128.32.136.9 ns1.Example.EDU ns1
+128.32.136.12 ns2.Example.EDU ns2</programlisting>
+ </step>
+
+ <step>
+ <para>在FreeBSD5.0以前的版本中,请确保<filename>/etc/host.conf</filename>中<option>绑定
+ </option>的<option>hosts</option>必须是存在的.从FreeBSD&nbsp;5.0开始,系统开始改用
+ 文件<filename>/etc/nsswitch.conf</filename>,
+ <option>hosts</option>行的<option>dns</option>选项之前必须有<option>files</option>选项.
+ 缺少这些可能会发生很滑稽的事.</para>
+ </step>
+
+ <step>
+ <para>编辑<filename>/etc/rc.conf</filename>.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>编辑以下这行设置主机名(hostname):</para>
+
+ <programlisting>hostname="myname.my.domain"</programlisting>
+
+ <para>应该用您主机的Internet全名代替.</para>
+ </listitem>
+
+ <listitem>
+ <para>改变以下这些行将<devicename>sl0</devicename>添加到网络接口
+ 列表中:</para>
+
+ <programlisting>network_interfaces="lo0"</programlisting>
+
+ <para>改为:</para>
+
+ <programlisting>network_interfaces="lo0 sl0"</programlisting>
+ </listitem>
+
+ <listitem>
+ <para> 加入以下这一行设置<devicename>sl0</devicename>的启动标志:</para>
+
+ <programlisting>ifconfig_sl0="inet ${hostname} slip-gateway netmask 0xffffff00 up"</programlisting>
+ </listitem>
+
+ <indexterm><primary>default route</primary></indexterm>
+ <listitem>
+ <para>改变这一行以指明默认的路由:</para>
+
+ <programlisting>defaultrouter="NO"</programlisting>
+
+ <para>改为:</para>
+
+ <programlisting>defaultrouter="slip-gateway"</programlisting>
+ </listitem>
+ </orderedlist>
+ </step>
+
+ <step>
+ <para>创建文件<filename>/etc/resolv.conf</filename>,写入以下内容:</para>
+
+ <programlisting>domain CS.Example.EDU
+nameserver 128.32.136.9
+nameserver 128.32.136.12</programlisting>
+
+ <indexterm><primary>nameserver</primary></indexterm>
+ <indexterm><primary>domain name</primary></indexterm>
+ <para>正如您看到的, 这些行设置了域名服务器.当然,实际的域名和IP地址取决于您的环境.</para>
+ </step>
+
+ <step>
+ <para>设置<username>root</username>和
+ <username>toor</username>的密码(其它任何没有密码的帐号).</para>
+ </step>
+
+ <step>
+ <para>重启计算机,然后确认使用了正确的主机名.</para>
+ </step>
+ </procedure>
+ </sect3>
+
+ <sect3>
+ <title>创建一个SLIP连接</title>
+ <indexterm><primary>SLIP</primary><secondary>connecting with</secondary></indexterm>
+ <procedure>
+ <step>
+ <para>在命令行输入<command>slip</command>进行拨号,
+ 输入您的主机名和密码.需要输入的内容取决您的环境.如果您使用kermit,可以试试这个脚本:</para>
+
+ <programlisting># kermit setup
+set modem hayes
+set line /dev/modem
+set speed 115200
+set parity none
+set flow rts/cts
+set terminal bytesize 8
+set file type binary
+# The next macro will dial up and login
+define slip dial 643-9600, input 10 =&gt;, if failure stop, -
+output slip\x0d, input 10 Username:, if failure stop, -
+output silvia\x0d, input 10 Password:, if failure stop, -
+output ***\x0d, echo \x0aCONNECTED\x0a</programlisting>
+
+ <para>当然,您需要更改主机名和密码以符合实际情况.完成了这些后,您只需在kermit提示符下键入
+ <command>slip</command>进行连接.</para>
+
+ <note>
+ <para>将密码以纯文本的形式存放在文件系统无论如何都是个 <emphasis>坏</emphasis>主意.
+ Do it at your own risk.</para>
+ </note>
+ </step>
+
+ <step>
+ <para>退出kermit(您可以用
+ <keycombo>
+ <keycap>Ctrl</keycap>
+ <keycap>z</keycap>
+ </keycombo>将其挂起),以<username>root</username>用户键入:</para>
+
+ <screen>&prompt.root; <userinput>slattach -h -c -s 115200 /dev/modem</userinput></screen>
+
+ <para>如果您能<command>ping</command>通路由器另一端的主机,就是连接好了! 如果不行,
+ 您可以使用<option>-a</option>选项代替
+<option>-c</option>作为<command>slattach</command>的参数.</para>
+ </step>
+ </procedure>
+ </sect3>
+
+ <sect3>
+ <title>关闭连接</title>
+
+ <para>按下面的步骤做:</para>
+
+ <screen>&prompt.root; <userinput>kill -INT `cat /var/run/slattach.modem.pid`</userinput></screen>
+
+ <para>kill <command>slattach</command>. 切记您一定要是 <username>root</username>用户才有权限.
+ 然后回到kermit(如果想将其挂起,执行命令<command>fg</command>)再从中退出(<command>q</command>).</para>
+
+ <para><command>slattach</command>的联机手册说必须用<command>ifconfig sl0 down</command>
+ 将这个接口标记为关闭,但对我来说,这似乎没有任何区别.
+ (<command>ifconfig sl0</command>仍报告一样的东西.)</para>
+
+ <para>有时候,您的modem会拒绝退出
+ (我的时常这样).遇到这种情况,您只要启动kermit然后再次退出.一般在试二次就可以了.</para>
+ </sect3>
+
+ <sect3>
+ <title>问题解答</title>
+
+ <para>如果不行,尽管来问我.一般可以这样解决问题:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>执行<command>slattach</command>时不使用<option>-c</option>和<option>-a</option>选项
+ (这应该不是关键的,但有些用户报告这样做解决了问题.)</para>
+ </listitem>
+
+ <listitem>
+ <para>使用<option>s10</option>替换
+ <option>sl0</option> (在一些字体下很难看出不同).</para>
+ </listitem>
+
+ <listitem>
+ <para>试试<command>ifconfig sl0</command>来查看您的接口状态.例如,您可以这样做:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig sl0</userinput>
+sl0: flags=10&lt;POINTOPOINT&gt;
+ inet 136.152.64.181 --&gt; 136.152.64.1 netmask ffffff00</screen>
+ </listitem>
+
+ <listitem>
+ <para>如果在ping时得到一条<errorname>no route to host</errorname>
+ 信息,您的路由表可能有问题.可以使用 <command>netstat -r</command>
+ 命令显示当前路由:</para>
+
+ <screen>&prompt.root; <userinput>netstat -r</userinput>
+Routing tables
+Destination Gateway Flags Refs Use IfaceMTU Rtt Netmasks:
+
+(root node)
+(root node)
+
+Route Tree for Protocol Family inet:
+(root node) =&gt;
+default inr-3.Example.EDU UG 8 224515 sl0 - -
+localhost.Exampl localhost.Example. UH 5 42127 lo0 - 0.438
+inr-3.Example.ED water.CS.Example.E UH 1 0 sl0 - -
+water.CS.Example localhost.Example. UGH 34 47641234 lo0 - 0.438
+(root node)</screen>
+
+ <para>前述的例子来自于一个非常繁忙的系统.
+ 您系统上的这些数字会因网络活动的不同而改变.</para>
+
+ </listitem>
+ </itemizedlist>
+ </sect3>
+ </sect2>
+
+ <sect2 id="slips">
+ <title>设置SLIP服务器</title>
+ <indexterm><primary>SLIP</primary><secondary>server</secondary></indexterm>
+
+ <para>本文提供了在FreeBSD上设置SLIP服务的建议,主要是指配置您的系统使其能根据远程SLIP客户端的
+ 登录自动地开启连接.</para>
+
+ <!-- Disclaimer is not necessarily relevant
+ <para> The author has written this document based
+ on his experience; however, as your system and needs may be
+ different, this document may not answer all of your questions, and
+ the author cannot be responsible if you damage your system or lose
+ data due to attempting to follow the suggestions here.</para>
+ -->
+
+ <sect3 id="slips-prereqs">
+ <title>前提条件</title>
+ <indexterm><primary>TCP/IP networking</primary></indexterm>
+ <para>这一节本身就是非常技术性的, 所以要求有一定的背景知识.本节假定您熟悉TCP/IP网络协议,特别是网络和和结点寻址
+ ,网络地址掩网, 划分子网, 路由, 路由协议(比如RIP).在一个拨号服务器上配置SLIP需要这些概念性的知识.
+ 如果您不熟悉它们,请先阅读Craig Hunt的 <emphasis>TCP/IP 网络管理</emphasis>
+ 由O'Reilly &amp; Associates, Inc.出版(ISBN号为0-937175-82-X),或者Douglas Comer有关TCP/IP
+ 协议的书籍.</para>
+
+ <indexterm><primary>modem</primary></indexterm>
+ <para>另外还假定您已经设置好了您的modem并配置了相应的文件允许通过modem登录. 如果您还没有准备好您的系统,请
+ 参考拨号服务的配置指南; 如果您能使用网页浏览器,也可以浏览
+ <ulink url="&url.base;/docs.html">http://www.FreeBSD.org/docs.html</ulink>上的指南列表.
+ 您还需要参考&man.sio.4;以获取串行端口设备驱动的信息,
+ &man.ttys.5;,&man.gettytab.5;, &man.getty.8;, &amp; &man.init.8;以获取配置系统以接受modem登录的
+ 相关信息,也许还有 &man.stty.1;以获取有关串行口参数设置的信息(比如<literal>clocal</literal>指直线串行
+ 接口).</para>
+ </sect3>
+
+ <sect3>
+ <title>快速浏览</title>
+
+ <para>使用FreeBSD作为SLIP服务器,在典型配置时,它是这样工作的:
+ 一个SLIP客户拨号并以专用的login ID登录到FreeBSD SLIP服务器系统.这个用户使用<filename>/usr/sbin/sliplogin</filename>
+ 作为shell.<command>sliplogin</command>程序在文件<filename>/etc/sliphome/slip.hosts</filename>中查找这个用户的项,
+ 如果找到了匹配项,就将串行线连接到一个可用的SLIP接口,然后运行shell脚本<filename>/etc/sliphome/slip.login</filename>
+ 以配置SLIP接口.</para>
+
+ <sect4>
+ <title>一个SLIP服务器登录的例子</title>
+
+ <para>例如,如果一个SLIP用户的ID是<username>Shelmerg</username>,
+ 在<filename>/etc/master.passwd</filename>中<username>Shelmerg</username>的项如下的所示:</para>
+
+ <programlisting>Shelmerg:password:1964:89::0:0:Guy Helmer - SLIP:/usr/users/Shelmerg:/usr/sbin/sliplogin</programlisting>
+
+ <para><username>Shelmerg</username>登录时,
+ <command>sliplogin</command>在文件
+ <filename>/etc/sliphome/slip.hosts</filename>中搜索与用户ID匹配的行;如下所示:</para>
+
+ <programlisting>Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp</programlisting>
+
+ <para><command>sliplogin</command>找到这条区配行,
+ 并将串行线与另一个可用的SLIP接口连起来,
+ 然后执行<filename>/etc/sliphome/slip.login</filename>脚本:</para>
+
+ <programlisting>/etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp</programlisting>
+
+ <para>如果一切顺利,
+ <filename>/etc/sliphome/slip.login</filename>为<command>sliplogin</command>
+ )绑定的接口(在上面的例子中,是<filename>slip.login</filename>参数列表的第一个参数)运行
+ <command>ifconfig</command>以设置SLIP接口的本地IP地址(<hostid>dc-slip</hostid>),远程IP地址(<hostid>sl-helmer</hostid>),
+ 掩码(<hostid role="netmask">0xfffffc00</hostid>),及其它附加的标志(<literal>autocomp</literal>). 如果出现错误
+ ,<command>sliplogin</command> 通常会使用syslog<literal>守护进程</literal>将有用的信息写入
+ <filename>/var/log/messages</filename> 参考&man.syslogd.8;和&man.syslog.conf.5;联机手册及<filename>/etc/syslog.conf</filename>,
+ 以获知<command>syslogd</command>是如何工作的).</para>
+
+ <para>好了,让我们开始设置系统 .</para>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>内核配置</title>
+ <indexterm><primary>kernel</primary><secondary>configuration</secondary></indexterm>
+ <para>FreeBSD默认的内核一般定义了两个SLIP接口:(<devicename>sl0</devicename>和
+ <devicename>sl1</devicename>); 您可以使用 <command>netstat
+ -i</command>命令查看您的内核是否定义了这些接口.</para>
+
+ <para><command>netstat -i</command>样例输出:</para>
+
+ <screen>Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
+ed0 1500 &lt;Link&gt;0.0.c0.2c.5f.4a 291311 0 174209 0 133
+ed0 1500 138.247.224 ivory 291311 0 174209 0 133
+lo0 65535 &lt;Link&gt; 79 0 79 0 0
+lo0 65535 loop localhost 79 0 79 0 0
+sl0* 296 &lt;Link&gt; 0 0 0 0 0
+sl1* 296 &lt;Link&gt; 0 0 0 0 0</screen>
+
+ <para><command>netstat -i</command>显示的<devicename>sl0</devicename>
+ <devicename>sl1</devicename>接口表明您的内核内建了两个SLIP接口. (
+ <literal>sl0</literal>和<literal>sl1</literal> 之后的星号表明
+ 这两个接口是<quote>关闭</quote>的.)</para>
+
+ <para>然而,FreeBSD默认的内核并没有配置额外的包 (默认的,您的FreeBSD不会被作为一个路由器)
+ 因为Internet RFC对Internet主机有特殊要求(参考
+ RFCs 1009 [Requirements for Internet Gateways], 1122
+ [Requirements for Internet Hosts &mdash; Communication Layers],
+ 还有 1127 [A Perspective on the Host Requirements RFCs]).
+ 如果您想让FreeBSD SLIP服务器成为一个路由器,就必须编辑
+ <filename>/etc/rc.conf</filename>,将<literal>gateway_enable</literal>变量设为<option>YES</option>.</para>
+
+ <para>然后您要重新启动使新的设置生效.</para>
+
+ <para>您会发现靠近默认内核配置文件(<filename>/sys/i386/conf/GENERIC</filename>)的最后,
+ 有这么一行:</para>
+
+ <programlisting>pseudo-device sl 2</programlisting>
+
+ <indexterm><primary>SLIP</primary></indexterm>
+ <para>这一行定义内核中可用的SLIP设备个数;行末尾的数字表示同时进行操作的SLIP连接的最大个数.</para>
+
+ <para>请参考<xref linkend="kernelconfig">FreeBSD内核配置这一章以获取配置内核的帮助.</para>
+ </sect3>
+
+ <sect3>
+ <title>Sliplogin配置</title>
+
+ <para>正如先前所提到的,
+ <filename>/etc/sliphome</filename>目录有三个文件构成<filename>/usr/sbin/sliplogin</filename>的配置
+ (参考<command>sliplogin</command>的联机手册&man.sliplogin.8;): <filename>slip.hosts</filename>,
+ 定义SLIP用户及有关IP地址; <filename>slip.login</filename>,一般只配置SLIP接口; 文件
+ <filename>slip.logout</filename>(可选的),串行连接终止时,撤消<filename>slip.login</filename>所做的修改.</para>
+
+ <sect4>
+ <title><filename>slip.hosts</filename> Configuration</title>
+
+ <para><filename>/etc/sliphome/slip.hosts</filename>里的每行包含至少四个元素,元素之间由空格隔开:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>SLIP用户的登录ID</para>
+ </listitem>
+
+ <listitem>
+ <para>SLIP连接的本地地址(指SLIP服务器)</para>
+ </listitem>
+
+ <listitem>
+ <para>SLIP连接的远程地址</para>
+ </listitem>
+
+ <listitem>
+ <para>网络掩网</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>本地和远程地址可以是主机名
+ (通过文件<filename>/etc/hosts</filename>或者域名服务解析为IP地址,
+ 在FreeBSD&nbsp;5.X上这取决于文件<filename>/etc/nsswitch.conf</filename>的设置
+ 在FreeBSD&nbsp;4.X里,则是<filename>/etc/host.conf</filename>),网络掩网可以是一个
+ 能通过文件<filename>/etc/networks</filename>解析的名字.在一个样例系统中,
+ <filename>/etc/sliphome/slip.hosts</filename>是这样的:</para>
+
+ <programlisting>#
+# login local-addr remote-addr mask opt1 opt2
+# (normal,compress,noicmp)
+#
+Shelmerg dc-slip sl-helmerg 0xfffffc00 autocomp</programlisting>
+
+ <para>在这行的末尾是一个或多个选项.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><option>normal</option> &mdash;不压缩报头
+ </para>
+ </listitem>
+
+ <listitem>
+ <para><option>compress</option> &mdash; 压缩报头</para>
+ </listitem>
+
+ <listitem>
+ <para><option>autocomp</option> &mdash;如果远程端允许,压缩报头</para>
+ </listitem>
+
+ <listitem>
+ <para><option>noicmp</option> &mdash;禁用ICMP数据包
+ (这样就会丢弃所有的<quote>ping</quote>数据包,不占用您的带宽)</para>
+ </listitem>
+ </itemizedlist>
+
+ <indexterm><primary>SLIP</primary></indexterm>
+ <indexterm><primary>TCP/IP networking</primary></indexterm>
+ <para>对SLIP连接的本地及远程地址的选择取决是您是准备在SLIP服务器上使用 TCP/IP
+ 子网还是使用<quote>ARP代理</quote> (它并不是<quote>真正的</quote>ARP代理,而是我们在本节用于介绍的术语).
+ 如果您不能确定选择何种方式或者如何分配地址,请参考"前提条件"(<xref linkend="slips-prereqs">)里列出的TCP/IP书籍
+ 或者向您的IP网络管理员请教.</para>
+
+ <para>如果您准备为您的SLIP客户使用一个独立的子网
+ , 您需要先从分配得到的网络号中取出一个子网号然后再在这个子网里给每个SLIP客户分配IP地址.
+ 然后您还需要通过SLIP服务器在最近的IP路由器上配置一个指向SLIP子网的静态路由.</para>
+
+ <indexterm><primary>Ethernet</primary></indexterm>
+ <para> 如果您要使用 <quote>代理 ARP</quote>的方式,您需要从SLIP服务器的以太子网中为每个SLIP客户分配IP地址,
+ 还必须修改<filename>/etc/sliphome/slip.login</filename> 和
+ <filename>/etc/sliphome/slip.logout</filename>脚本以使用
+ &man.arp.8;来管理proxy-ARP在服务器ARP表中的项.</para>
+ </sect4>
+
+ <sect4>
+ <title><filename>slip.login</filename> Configuration</title>
+
+ <para>典型的<filename>/etc/sliphome/slip.login</filename>
+ 如下所示:</para>
+
+ <programlisting>#!/bin/sh -
+#
+# @(#)slip.login 5.1 (Berkeley) 7/1/90
+
+#
+# generic login file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 inet $4 $5 netmask $6</programlisting>
+
+ <para>这个<filename>slip.login</filename>脚本仅仅为带有相应本地及远程地址和掩码的SLIP接口执行
+ <command>ifconfig</command> .</para>
+
+ <para>如果您决定使用<quote>ARP代理</quote>
+ 方式(而非为您的SLIP客户使用独立的子网),您的<filename>/etc/sliphome/slip.login</filename>
+ 应该是这样:</para>
+
+ <programlisting>#!/bin/sh -
+#
+# @(#)slip.login 5.1 (Berkeley) 7/1/90
+
+#
+# generic login file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 inet $4 $5 netmask $6
+# Answer ARP requests for the SLIP client with our Ethernet addr
+/usr/sbin/arp -s $5 00:11:22:33:44:55 pub</programlisting>
+
+ <para><filename>slip.login</filename>新加的行<command>arp -s
+ &#36;5 00:11:22:33:44:55 pub</command>在SLIP服务器的ARP表中加入了一个表项.这个ARP项使得
+ 每当这个以太网上的其它IP节点对SLIP客户端IP地址进行ARP请求时,SLIP服务器会以自已的以太网MAC地址作为回应
+ .</para>
+
+ <indexterm><primary>Ethernet</primary><secondary>MAC address</secondary></indexterm>
+ <para>当使用以上的例子时, 一定要将
+ 以太网MAC地址(<hostid role="mac">00:11:22:33:44:55</hostid>)替换成您系统网卡的MAC地址,否则<quote>ARP代理</quote>将
+ 完全无法工作!您可以查看<command>netstat -i</command>输出结果以取得以太网MAC地址;
+ 输出的第二行应该是这样:</para>
+
+ <screen>ed0 1500 &lt;Link&gt;0.2.c1.28.5f.4a 191923 0 129457 0 116</screen>
+
+ <para>这行表明这个系统的以太网MAC地址是<hostid role="mac">00:02:c1:28:5f:4a</hostid>
+ &mdash;<command>netstat -i</command>输出的以太网MAC地址必须改成用冒号隔开,并且要单个十六进数前加上.
+ 这是&man.arp.8;要求的格式; 参考&man.arp.8; 的联机手册以获取完整的使用方法.</para>
+
+ <note>
+ <para>创建
+ <filename>/etc/sliphome/slip.login</filename>和
+ <filename>/etc/sliphome/slip.logout</filename>时,一定要设置
+ <quote>执行(execute)</quote>位 (<command>chmod 755
+ /etc/sliphome/slip.login /etc/sliphome/slip.logout</command>)
+ ,否则 <command>sliplogin</command>将无法执行它.</para>
+ </note>
+ </sect4>
+
+ <sect4>
+ <title><filename>slip.logout</filename>配置</title>
+
+ <para><filename>/etc/sliphome/slip.logout</filename>并不是必需的
+ (除非您使用了<quote>ARP代理</quote>),如果您准备创建它,这里有一个基本的
+ <filename>slip.logout</filename> 脚本的例子 :</para>
+
+ <programlisting>#!/bin/sh -
+#
+# slip.logout
+
+#
+# logout file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 down</programlisting>
+
+ <para>If you are using <quote>proxy ARP</quote>, you will want to
+ have <filename>/etc/sliphome/slip.logout</filename> remove the
+ ARP entry for the SLIP client:</para>
+
+ <programlisting>#!/bin/sh -
+#
+# @(#)slip.logout
+
+#
+# logout file for a slip line. sliplogin invokes this with
+# the parameters:
+# 1 2 3 4 5 6 7-n
+# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
+#
+/sbin/ifconfig sl$1 down
+# Quit answering ARP requests for the SLIP client
+/usr/sbin/arp -d $5</programlisting>
+
+ <para>命令<command>arp -d &#36;5</command> 删除<filename>slip.login</filename>在SLIP客户登录时添加的ARP项 .</para>
+
+ <para>再次强调:确保您创建<filename>/etc/sliphome/slip.logout</filename>时设置了执行位
+ (ie, <command>chmod 755 /etc/sliphome/slip.logout</command>).</para>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>路由考虑</title>
+ <indexterm>
+ <primary>SLIP</primary>
+ <secondary>routing</secondary>
+ </indexterm>
+ <para>如果您不使用<quote>ARP代理</quote>的
+ 方式来路由SLIP客户端与网络的其余部分(可能是Internet)之间的数据包,
+ 您就必须通过SLIP服务器向最近的默认路由器添加静态路由以路由您的SLIP客户子网.</para>
+
+ <sect4>
+ <title>静态路由</title>
+ <indexterm><primary>static routes</primary></indexterm>
+
+ <para>向您最近的默认路由添加一个静态路由可以说是很麻烦
+ (或者说是不可能,如果您没有权限这么做)。 如果在您的组织中使用多路由器网络,
+ 有些路由器 (比如 Cisco 和 Proteon 生产的) 不但要配置指向 SLIP
+ 子网的路由, 而且还需要配置将哪些静态路由传给其它的路由器。
+ 所以一些专家意见和问题解答对于使基于静态路由表的路由正常工作很有必要。</para>
+ </sect4>
+
+ <sect4>
+ <title>运行<application>&gated;</application></title>
+ <indexterm>
+ <primary><application>gated</application></primary>
+ </indexterm>
+
+ <note>
+ <para><application>&gated;</application>现在是一个私有软件,无法取得它的源代码
+ ( <ulink url="http://www.gated.org/">&gated;</ulink>上有更多的信息 ).This
+ section only exists to ensure backwards compatibility for
+ those that are still using an older version.</para>
+ </note>
+
+ <para>为了避免静态路由使您头疼,您可以在FreeBSD SLIP服务器上安装
+ <application>&gated;</application>
+ ,然后配置它使用合适的路由协议
+ (RIP/OSPF/BGP/EGP)以告知其它路由器有关SLIP子网的信息.
+ 您需要编写一个名为 <filename>/etc/gated.conf</filename>
+ 文件来配置您的gated;这里有一个样例,与作者所使用的相同:</para>
+
+ <programlisting>#
+# gated configuration file for dc.dsu.edu; for gated version 3.5alpha5
+# Only broadcast RIP information for xxx.xxx.yy out the ed Ethernet interface
+#
+#
+# tracing options
+#
+traceoptions "/var/tmp/gated.output" replace size 100k files 2 general ;
+
+rip yes {
+ interface sl noripout noripin ;
+ interface ed ripin ripout version 1 ;
+ traceoptions route ;
+} ;
+
+#
+# Turn on a bunch of tracing info for the interface to the kernel:
+kernel {
+ traceoptions remnants request routes info interface ;
+} ;
+
+#
+# Propagate the route to xxx.xxx.yy out the Ethernet interface via RIP
+#
+
+export proto rip interface ed {
+ proto direct {
+ <replaceable>xxx.xxx.yy</replaceable> mask 255.255.252.0 metric 1; # SLIP connections
+ } ;
+} ;
+
+#
+# Accept routes from RIP via ed Ethernet interfaces
+
+import proto rip interface ed {
+ all ;
+} ;</programlisting>
+
+ <indexterm><primary>RIP</primary></indexterm>
+ <para>以上这个<filename>gated.conf</filename> 文件
+ 通过RIP向以太网广播有关SLIP子网的信息<replaceable>xxx.xxx.yy</replaceable>;
+ 如果您使用的以太网驱动与<devicename>ed</devicename>不同
+ 您需要将<devicename>ed</devicename>改成合适的接口.
+ 这个示例文件也设置了将跟踪信息写入<filename>/var/tmp/gated.output</filename>
+ 以诊断<application>&gated;</application>的活动;如果<application>&gated;</application>工作正常,
+ 您当然也可以关闭跟踪选项.要把<replaceable>xxx.xxx.yy</replaceable>
+ 改成实际的SLIP子网网络地址
+ (确保同时更改了 <literal>proto direct</literal>中的掩码 ).</para>
+
+ <para>一旦您在系统上安装并配置了
+ <application>&gated;</application>,您需要告知
+ FreeBSD<application>&gated;</application>的启动脚本以代替
+ <application>routed</application>. 最古老的做法是在<filename>/etc/rc.conf</filename>中设置
+ <varname>router</varname>
+ <varname>router_flags</varname>变量. 参考
+ <application>&gated;</application>的联机手册以获得有关命令行参数的信息.</para>
+ </sect4>
+ </sect3>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/preface/preface.sgml b/zh_CN.GB2312/books/handbook/preface/preface.sgml
new file mode 100644
index 0000000000..db86de9c18
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/preface/preface.sgml
@@ -0,0 +1,522 @@
+<!--
+ The FreeBSD Chinese Documentation Project
+
+ Original Revision: 1.25
+ $FreeBSD$
+-->
+
+<preface id="book-preface">
+ <title>前言</title>
+
+ <bridgehead id="preface-audience" renderas=sect1>Intended
+ Audience</bridgehead>
+
+ <para>作为 FreeBSD 的新用户,您将会在本手册第一部分找到 FreeBSD
+ 的安装方法,同时逐渐引入概念和习俗来加强 &unix; 基础。
+ 阅读这部分只需要您有探索的精神和接受新概念的能力。</para>
+
+ <para>读完这些之后,手册中很漫长的第二部分是 FreeBSD
+ 中系统管理员感兴趣的所有主题的全面参考。
+ 在阅读这些章节的内容时所需要的背景知识都注释在每一章节的大纲里面,
+ 如果需要,可在阅读前进行预习。</para>
+
+ <para>要获得附加的信息来源列表,请查阅 <xref linkend="bibliography">。</para>
+
+ <bridgehead id="preface-changes-from2" renderas=sect1>相对于第二版的改动</bridgehead>
+
+ <para>您目前看到的这本手册的第三版是 FreeBSD 文档计划的成员历时两年完成的顶峰之作。
+ 第三版包含了如下的的主要变动:</para>
+
+
+ <itemizedlist>
+ <listitem>
+ <para><xref linkend="config-tuning">, 配置和优化, 进行了扩充并增加了关于
+ ACPI 电源和资源管理, cron 系统实用程序,以及更多的内核优化选项的相关内容。</para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="security">, 安全 一章增加了虚拟专用网
+ (VPNs), 文件访问控制表 (ACLs), 以及安全公告的内容。</para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="mac">, 强制访问控制 (MAC) 是这一版新增的章节。
+ 它解释了什么是 MAC, 以及这一机制如何使您的 FreeBSD 系统更安全。</para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="disks">, 存储, 在原有基础上增加了
+ USB 存储设备, 文件系统快照, 文件系统容限, 基于文件及网络的文件系统,
+ 以及与加密磁盘分区有关的内容。</para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="vinum-vinum">,Vinum, 是这一版中的新章节。
+ 描述了如何使用这种提供了设备无关的逻辑磁盘、软件 RAID-0,
+ RAID-1 和 RAID-5 的卷管理系统——Vinum。</para>
+ </listitem>
+
+ <listitem>
+ <para>在 <xref linkend="ppp-and-slip">,PPP 和 SLIP 一章中增加了排除故障的说明。</para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="mail">, 电子邮件 一章中增加了关于如何使用其它的邮件传输代理、
+ SMTP 认证, UUCP, fecthmail,
+ procmail, 以及其它进阶内容。</para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="network-servers">,网络服务, 是新版中全新的一章。
+ 这一章包括了如何架设 Apache HTTP 服务器, FTPd,以及用于支持 Microsoft Windows
+ 客户的 Samba。 一些段落来自原先的 <xref
+ linkend="advanced-networking">, 进阶网络应用 一章。</para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="advanced-networking">,进阶网络应用 一章增加了关于在
+ FreeBSD 中使用蓝牙设备, 安装无线网络, 以及使用异步传输模式 (ATM)
+ 网络的内容。</para>
+ </listitem>
+
+ <listitem>
+ <para>增加了一份词汇表, 用以说明整本书中出现的术语。</para>
+ </listitem>
+
+ <listitem>
+ <para>对于全书中图表进行了进一步的美化工作。</para>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead id="preface-changes" renderas=sect1>
+ 相对于第一版的改变</bridgehead>
+
+ <para>
+ 本手册的第二版是 FreeBSD 文档计划的成员历时两年完成的顶峰之作。
+ 第二版包含了如下的的主要变动:</para>
+
+<!-- Talk a little about justification and other stylesheet changes? -->
+
+ <itemizedlist>
+ <listitem>
+ <para>添加了完整的索引。</para>
+ </listitem>
+ <listitem>
+ <para>用图形替换了以前所有用 ASCII 插图。</para>
+ </listitem>
+ <listitem>
+ <para>
+ 每个章节添加了标准大纲,列出了该章所包含的信息和读者所应该了解的知识。</para>
+ </listitem>
+ <listitem>
+ <para>
+ 内容逻辑地分成三个部分:
+ <quote>起步</quote>,<quote>系统管理</quote>和<quote>附录</quote>。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="install"> (<quote>安装
+ FreeBSD</quote>) 新版本中使用了抓屏图片,使新用户更容易的领会正文。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="basics"> (<quote>&unix;
+ 基础</quote>)扩充了进程、守护进程和信号的附加信息。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="ports"> (<quote>安装应用程序</quote>)
+ 扩充了二进制包管理的附加信息。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="x11"> (<quote>X Window 系统</quote>)
+ 新版本中着重介绍使用现代桌面技术例如 &xfree86; 4.x 上的
+ <application>KDE</application> 和 <application>GNOME</application></para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="boot"> (<quote>FreeBSD
+ 启动过程</quote>)对第一版内容进行扩充。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="disks"> (<quote>存储</quote>)
+ 由第一版中两个单独的章节<quote>磁盘</quote>和<quote>备份</quote>合并而成。
+ 我们认为这两部分作为一个整体比较容易理解。同时 RAID (包括硬件和软件 RAID)
+ 部分也被添加进来。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="serialcomms"> (<quote>串口通信</quote>)
+ 对第一版进行完善,并为 FreeBSD 4.x/5.x 做了更新。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="ppp-and-slip"> (<quote>PPP 和
+ SLIP</quote>) 全部更新。</para>
+ </listitem>
+ <listitem>
+ <para>许多新的内容被添加到 <xref linkend="advanced-networking">
+ (<quote>高级网络</quote>).</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="mail"> (<quote>电子邮件</quote>)增加了关于配置
+ <application>sendmail</application> 的信息。</para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="linuxemu">(<quote>&linux; 兼容性</quote>)
+ 增加了关于安装 <application>&oracle;</application> 和
+ <application>&sap.r3;</application> 的信息。</para>
+ </listitem>
+ <listitem>
+ <para>
+ 第二版中也涵盖了下列主题:</para>
+ <itemizedlist>
+ <listitem>
+ <para>配置和调整(<xref linkend="config-tuning">)。</para>
+ </listitem>
+ <listitem>
+ <para>多媒体(<xref linkend="multimedia">)</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </itemizedlist>
+
+ <bridgehead id="preface-overview" renderas=sect1>本手册的组织</bridgehead>
+
+ <para>这本手册分成了三个逻辑清晰的部分。第一部分
+ <emphasis>起步</emphasis> 涵盖了 FreeBSD 的安装和基本使用方法。
+ 读者可根据自己的情况按顺序或者跳过一些熟悉的主题来阅读。第二部分
+ <emphasis>常用操作</emphasis> 涵盖了 FreeBSD 常用的功能,
+ 这部分可以不按顺序阅读。每个部分由一个简明的大纲开始,
+ 这个大纲描述本章节涵盖的内容和读者应该已经知道的知识。
+ 这主要是让读者可以更好的选择感兴趣的章节阅读。第三部分
+ <emphasis>系统管理</emphasis> 涵盖了 FreeBSD 高级用户所感兴趣的广泛的话题。
+ 第四部分 <emphasis>网络通讯</emphasis> 包括了网络和服务的话题,
+ 而第五部分则是资源信息的附录。</para>
+
+ <variablelist>
+
+<!-- Part I - Introduction -->
+
+ <varlistentry>
+ <term><emphasis><xref linkend="introduction">, 介绍</emphasis></term>
+ <listitem>
+ <para>向新用户介绍 FreeBSD。它描述了 FreeBSD 计划的历史、目标和开发模式。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="install">,安装</emphasis></term>
+ <listitem>
+ <para>
+ 本章将会带领用户完成安装过程。一些高级安装主题,
+ 例如如何通过串行控制台安装,也涵盖在内。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="basics">,&unix; 基础</emphasis></term>
+ <listitem>
+ <para>本章涵盖了 FreeBSD 操作系统基础命令和功能。
+ 如果熟悉 &linux; 或者其他类 &unix; 操作系统,则可以跳过这章。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="ports">,安装应用程序</emphasis></term>
+ <listitem>
+ <para>
+ 本章涵盖如何用 FreeBSD 的 <quote>Ports Collection</quote>
+ 和标准二进制软件包来安装第三方软件。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="x11">,X Window 系统</emphasis></term>
+ <listitem>
+ <para>本章概要的描述了 X Window 系统并详细地介绍了如何在
+ FreeBSD 上使用 <application>&xfree86;</application>,
+ 也描述了通用的桌面环境,例如 <application>KDE</application>
+ 和 <application>GNOME</application>。</para>
+ </listitem>
+ </varlistentry>
+
+<!-- Part II Common Tasks -->
+
+ <varlistentry>
+ <term><emphasis><xref linkend="desktop">,桌面应用</emphasis></term>
+ <listitem>
+ <para>列出了一些常用的桌面应用程序,比如 web 浏览器和办公套件,
+ 描述了在 FreeBSD 上如何安装它们。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="multimedia">,多媒体</emphasis></term>
+ <listitem>
+ <para>展示了如何为您的系统设置声卡和视频回放支持。
+ 也描述了一些简单的音频和视频应用程序。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="kernelconfig">,配置 FreeBSD
+ 内核</emphasis></term>
+ <listitem>
+ <para>解释了为什么需要配置一个新内核并提供了配置、
+ 编译、安装自定义内核的详细说明。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="printing">,打印</emphasis></term>
+ <listitem>
+ <para>描绘了 FreeBSD 上打印机管理,
+ 包括横幅页、打印统计,还有初始的设置。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="linuxemu">,&linux; 二进制兼容</emphasis></term>
+ <listitem>
+ <para>描述了 FreeBSD 的 &linux; 兼容特性。
+ 也提供了许多流行的 &linux; 应用程序的详细的安装说明,
+ 比如 <application>&oracle;</application>、<application>&sap.r3;</application>,还有
+ <application>&mathematica;</application>。</para>
+ </listitem>
+ </varlistentry>
+
+<!-- Part III - System Administration -->
+
+ <varlistentry>
+ <term><emphasis><xref linkend="config-tuning">,配置和调整</emphasis></term>
+ <listitem>
+ <para>本章描述了管理员调整 FreeBSD 系统以优化性能时可能用到的一些参数。
+ 也描述了 FreeBSD 中的各种配置文件以及它们所在的位置。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="boot">,启动过程</emphasis></term>
+ <listitem>
+ <para>本章描述 FreeBSD 的启动过程并且解释了如何用配置选项来控制这个过程。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="users">,用户和基本帐号管理</emphasis></term>
+ <listitem>
+ <para>本章描述了如何创建和操作用户帐号,
+ 同样也论述了设置用户资源限制和其他账号管理任务的方法。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="security">, 安全</emphasis></term>
+ <listitem>
+ <para>
+ 本章描述为保证 FreeBSD 系统安全可以用到的不同工具,包括
+ Kerberos,IPsec,OpenSSH 和网络防火墙。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="mac">, 强制访问控制</emphasis></term>
+ <listitem>
+ <para>解释了何谓强制访问控制 (MAC) 以及如何利用这一机制来加强
+ FreeBSD 系统的安全。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="disks">,存储</emphasis></term>
+ <listitem>
+ <para>本章描述了怎样用 FreeBSD 来管理存储介质和文件系统,包括物理磁盘、RAID
+ 阵列、光学和磁带媒体、后备存储磁盘以及网络文件系统。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="vinum-vinum">,Vinum</emphasis></term>
+ <listitem>
+ <para>本章描述了怎样使用逻辑卷管理器 Vinum。它提供了设备无关的逻辑磁盘和软件
+ RAID-0、RAID-1 以及 RAID-5。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="l10n">,本地化</emphasis></term>
+ <listitem>
+ <para>本章描述了如何在 FreeBSD 上使用非英语语言。它涵盖了系统和应用程序级的本地化。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="cutting-edge">, 最前沿</emphasis></term>
+ <listitem>
+ <para>介绍了 FreeBSD-STABLE、
+ FreeBSD-CURRENT 以及 FreeBSD 发行版本之间的差异。
+ 描述了一般用户如何紧跟开发过程并从中受益。</para>
+ </listitem>
+ </varlistentry>
+
+<!-- Part IV - Network Communications -->
+
+ <varlistentry>
+ <term><emphasis><xref linkend="serialcomms">,串行通信</emphasis></term>
+ <listitem>
+ <para>本章解释了如何连接终端和调制解调器到 FreeBSD 系统,包括拨入和拨出连接。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="ppp-and-slip">,PPP 和 SLIP</emphasis></term>
+ <listitem>
+ <para>本章描述了如何用 FreeBSD 通过使用 PPP,SLIP 或者基于以太网的
+ PPP(PPPoE)来连接远程系统。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="mail">, 电子邮件</emphasis></term>
+ <listitem>
+ <para>本章解释了一个 email 服务器的不同组成部分并且简单讨论了关于最流行的
+ mail 服务器软件 <application>sendmail</application> 的配置。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="network-servers">, 网络服务</emphasis></term>
+ <listitem>
+ <para>提供了详细的指引和示范配置文件以说明如何将一台 FreeBSD 机器作为网络文件系统服务器,
+ 域名服务器, 网络信息服务器或时间同步服务器来使用的方法。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="advanced-networking">, 高级网络应用</emphasis></term>
+ <listitem>
+ <para>描述了许多关于网络的主题,包括如何在您的局域网中共享
+ Internet 连接, 高级路由话题, 无线网络, 蓝牙, ATM, IPv6以及许多高级话题。</para>
+ </listitem>
+ </varlistentry>
+
+<!-- Part V - Appendices -->
+
+ <varlistentry>
+ <term><emphasis><xref linkend="mirrors">,获取 FreeBSD </emphasis></term>
+ <listitem>
+ <para>列出了获得 FreeBSD 安装 CDROM 或 DVDROM 的不同资源,也提供了允许您自由下载
+ FreeBSD 的不同 Internet 站点。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="bibliography">,参考书目</emphasis></term>
+ <listitem>
+ <para>由于本手册触及到了很多不同的主题,因而可能引发您想要获取更多详细的讲解。
+ 参考书目列出了很多写作这本书时参考的好书。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="eresources">,Internet 上的资源</emphasis></term>
+ <listitem>
+ <para>讲述了很多对 FreeBSD 用户有用的能够提出问题并进行技术交流的关于
+ FreeBSD 的论坛。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis><xref linkend="pgpkeys">,PGP 秘钥</emphasis></term>
+ <listitem>
+ <para>列出了一些 FreeBSD 开发者的 PGP 签名。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <bridgehead id="preface-conv" renderas=sect1>本书中使用的一些约定</bridgehead>
+
+ <para>为了使本书保持一致性和易读性特做了以下约定:</para>
+
+ <bridgehead id="preface-conv-typographic" renderas=sect2>排版约定</bridgehead>
+
+ <variablelist>
+ <varlistentry>
+ <term><emphasis>斜体</emphasis></term>
+ <listitem>
+ <para><emphasis>斜体</emphasis> 字用来表示文件名、URLs、强调文字和术语的主流用法。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>反白</varname></term>
+ <listitem>
+ <para><varname>反白</varname> 字用来表示错误信息、命令、环境变量、port
+ 的名字、主机名、用户名、组名、设备名以及变量和代码片断。</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><application>粗体</application></term>
+ <listitem>
+ <para><application>粗体</application> 字用来表示应用程序、命令和关键字。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+<!-- Var list -->
+ <bridgehead id="preface-conv-commands"
+ renderas=sect2>用户输入</bridgehead>
+
+ <para>
+ 按键用<keycap>粗体</keycap>来突出于其他文本。
+ 组合键意味着字用‘<literal>+</literal>’连接时,同时的按下它们,例如:</para>
+
+ <para>
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>Alt</keycap>
+ <keycap>Del</keycap>
+ </keycombo>
+ </para>
+
+ <para>表示您应该同时按下 <keycap>Ctrl</keycap>,
+ <keycap>Alt</keycap> 和 <keycap>Del</keycap> 键。</para>
+
+ <para>按顺序依次键入的关键字通常是用逗号隔开,例如:</para>
+
+ <para>
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>X</keycap>
+ </keycombo>,
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>S</keycap>
+ </keycombo>
+ </para>
+
+ <para>这意味着用户应该同时按<keycap>Ctrl</keycap> 和
+ <keycap>X</keycap>,然后同时按 <keycap>Ctrl</keycap>
+ 和 <keycap>S</keycap>。</para>
+
+<!-- How to type in key stokes, etc.. -->
+ <bridgehead id="preface-conv-examples"
+ renderas=sect2>示例</bridgehead>
+
+ <para>以 <devicename>E:\&gt;</devicename> 开头的例子代表一个
+ &ms-dos; 命令。除非另有说明,这些命令都可以在一个现代的
+ &microsoft.windows; <quote>命令行</quote>窗口环境被执行。</para>
+
+ <screen><prompt>E:\&gt;</prompt> <userinput>tools\fdimage floppies\kern.flp A:</userinput></screen>
+
+ <para>以 &prompt.root; 开头的例子代表必须以 FreeBSD
+ 超级用户身份执行的命令。您可以用 <username>root</username>
+ 身份登录来输入这些命令,或者以普通账号登录然后用 &man.su.1;
+ 来获得超级用户权限。</para>
+
+ <screen>&prompt.root; <userinput>dd if=kern.flp of=/dev/fd0</userinput></screen>
+
+ <para>以 &prompt.user; 开头的例子代表命令应该被普通账号执行。
+ 除非另有说明,C-shell 语法来设置环境变量和其他 shell 命令。</para>
+
+ <screen>&prompt.user; <userinput>top</userinput></screen>
+
+ <bridgehead id="preface-acknowledgements"
+ renderas=sect1>致谢</bridgehead>
+
+ <para>您所看到的这本书是全球几百人努力的结果。
+ 无论他们只是纠正一些错误或提交完整的章节,所有的贡献都是非常有用的。</para>
+
+ <para>
+ 一些公司通过提供资金让作者专注于文档开发、提供出版资金等等方式来支持文档开发。
+ 其中,BSDi (后并入<ulink url="http://www.windriver.com">Wind River Systems</ulink>)
+ 资助 FreeBSD 文档计划成员来专职改善这本书直到 2000 年三月第一个印刷版
+ (ISBN 1-57176-241-8) 的出版。Wind River Systems
+ 同时资助其他作者来对输出结构做很多改进和给文章添加一些附加章节。
+ 这项工作结束于 2001 年 11 月印刷第二版 (ISBN 1-57176-303-1)。在 2003-2004 两年中,<ulink
+ url="http://www.freebsdmall.com">FreeBSD Mall</ulink>,
+ 向为改进这本手册以使其第三版印刷版本能够出版的志愿者支付了报酬。</para>
+
+</preface>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "book" "preface")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/printing/Makefile b/zh_CN.GB2312/books/handbook/printing/Makefile
new file mode 100644
index 0000000000..80ce214947
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/printing/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= printing/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/printing/chapter.sgml b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
new file mode 100644
index 0000000000..5f5917ba96
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
@@ -0,0 +1,1707 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.88
+ $FreeBSD$
+-->
+
+<chapter id="printing">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Sean</firstname>
+ <surname>Kelly</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ <!-- 30 Sept 1995 -->
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Restructured and updated by </contrib>
+ <!-- Mar 2000 -->
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>打印</title>
+
+ <sect1 id="printing-synopsis">
+ <title>概述</title>
+ <indexterm><primary>LPD spooling system</primary></indexterm>
+ <indexterm><primary>printing</primary></indexterm>
+
+ <para>FreeBSD 可以支持众多种类的打印机,
+ 从最古老的针式打印机到最新的激光打印机以及它们之间所有类型的打印机。
+ 您可以使运行的应用程序产生高质量的打印输出。</para>
+
+ <para>FreeBSD 也可以被设置成一个网络上的打印服务器。 它可以从包括
+ FreeBSD、 &windows; 及 &macos; 在内的多种其他主机上接收打印任务。
+ FreeBSD 将保证任务在某时被打印, 并且可以把哪台机器, 哪位用户打印的最多记录在统计表中,
+ 生成 <quote>横幅</quote> 页, 显示哪份打印输出的是哪位用户的等等。</para>
+
+ <para>在读完这章后,您将知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>怎样配置FreeBSD打印池。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样安装打印过滤器来对特殊的打印任务做特殊的处理,
+ 包括把传来的文档转换成打印机能理解的格式。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样在打印输出上开启报头或者横幅页功能。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样打印到连接在其他计算机上的打印机。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样打印到直接连接在网络上的打印机。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样控制打印机的限制, 包括限制打印任务的大小和阻止某些用户打印。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样记录打印机统计表和使用情况。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样解决打印故障。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在读这章之前, 您应该:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>知道怎样配置并安装新内核
+ (<xref linkend="kernelconfig">)。 </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="printing-intro-spooler">
+ <title>介绍</title>
+
+ <para>为了在FreeBSD中使用打印机,
+ 您需要将伯克利行式打印机打印池系统即<application>LPD</application>
+ 打印池系统设置好。
+ 它是FreeBSD的标准打印控制系统。 这章介绍<application>LPD</application>
+ 打印池系统, 经常简称<application>LPD</application>,
+ 并且将指导您贯穿它的配置。</para>
+
+ <para>如果您已经熟悉了
+ <application>LPD</application>或者其他打印池系统, 您可以跳到<link
+ linkend="printing-intro-setup">设置打印池系统</link>这部分。</para>
+
+ <para><application>LPD</application>完全控制一台主机的打印机。
+ 它负责许多的事情:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>它控制本地和连接在网络上其他主机上的打印机的访问。</para>
+ </listitem>
+
+ <indexterm><primary>print jobs</primary></indexterm>
+ <listitem>
+ <para>它允许用户提交要打印的文件;
+ 这些通常被认为是<emphasis>任务</emphasis>。</para>
+ </listitem>
+
+ <listitem>
+ <para>它为每个打印机维护一个<emphasis>队列</emphasis>来防止多个用户在同一时刻访问一台打印机。</para>
+ </listitem>
+
+ <listitem>
+ <para>它可以打印<emphasis>报头</emphasis>(也叫做<emphasis>banner</emphasis>或者<emphasis>
+ burst</emphasis>页使用户可以轻松的从一堆打印输出中找到它们打印的任务。</para>
+ </listitem>
+
+ <listitem>
+ <para>它来设置连接在串口上的打印机的通讯参数。</para>
+ </listitem>
+
+ <listitem>
+ <para>它能通过网络将任务发送到另外一台主机的
+ <application>LPD</application>打印池中。</para>
+ </listitem>
+
+ <listitem>
+ <para>它可以根据不同种类的打印机语言和打印机的性能运行特殊的过滤器来格式化任务。</para>
+ </listitem>
+
+ <listitem>
+ <para>它记录打印机的使用情况。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>通过配置文件
+ (<filename>/etc/printcap</filename>)和提供的特殊过滤程序,
+您可以使<application>LPD</application>
+ 系统在众多种类的打印机硬件上完成上面全部的或者一些子集的功能。</para>
+
+ <sect2 id="printing-intro-why">
+ <title>为什么要用打印池</title>
+
+ <para>如果您是系统唯一的用户, 您可能会奇怪为什么要在您不需要访问控制,
+ 报头页或者打印机使用统计时为打印池费心。
+ 它可以设置成允许直接访问打印机, 但您还是应该使用打印池, 因为:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><application>LPD</application>在后台打印任务; 您不用被迫等待数据被完全拷贝到打印机的时间。</para>
+ </listitem>
+
+ <indexterm><primary>&tex;</primary></indexterm>
+ <listitem>
+
+ <para><application>LPD</application>可以可以方便的通过过滤器给任务加上日期/
+ 时间的页眉或者把一种特殊的文件格式 (比如&tex; DVI 文件) 转换成一种打印机可以理解的格式。 您不必去手动做这些步骤。</para>
+ </listitem>
+
+ <listitem>
+ <para>许多提供打印功能的免费和商业程序想要和您系统上的打印池通讯。
+ 通过设置打印池系统, 您将更轻松的支持其他以后要添加的或者现有的软件。</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-intro-setup">
+ <title>基本设置</title>
+
+ <para>要想在<application>LPD</application>打印池
+ 系统上使用打印机, 您需要
+ 设置打印机硬件和
+ <application>LPD</application>软件。 这个
+ 文档描述了这两级设置: </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>参见<link linkend="printing-simple">简单打印机
+ 设置</link>来了解怎样连接一个打印机, 告诉
+ <application>LPD</application>怎样与
+ 它通讯, 并且打印纯文本到
+ 打印机。 </para>
+ </listitem>
+
+ <listitem>
+ <para>参见<link linkend="printing-advanced">高级
+ 打印机设置</link>来了解怎样打印多种
+ 特殊格式的文件, 怎样打印报头页, 怎样通过网络
+ 打印, 怎样控制打印机的访问权限, 并且学会为打印
+ 作业记帐统计。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <sect2 id="printing-simple">
+ <title>简单打印机设置</title>
+
+ <para>这部分讲解怎样配置打印机硬件和
+ <application>LPD</application>使之与打印机配合。
+ 讲解的基础知识有: </para>
+
+ <itemizedlist>
+ <listitem>
+ <para><link linkend="printing-hardware">硬件
+ 设置</link>部分将讲解怎样把一台打印机连接到
+ 您计算机的一个端口上。 </para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="printing-software">软件
+ 设置</link>部分将讲解怎样配置
+ <application>LPD</application>打印池的配置
+ 文件 (<filename>/etc/printcap</filename>)。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您正在设置一台通过网络协议
+ 接收数据来打印而不是通过串行或者并行界面的打印机,
+ 参见<link linkend="printing-advanced-network-net-if">使用
+ 网络数据流界面的打印机</link>。 </para>
+
+ <para>尽管这部分叫<quote>简单打印机
+ 设置</quote>, 但还是相当复杂的。 使打印机
+ 配合和<application>LPD</application>
+ 打印池在计算机上正常运转是最难的
+ 部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐,
+ 是相当简单的。 </para>
+
+ <sect3 id="printing-hardware">
+ <title>硬件设置</title>
+
+ <para>这部分讲述了打印机连接到计算机的多种
+ 途径。 主要讨论了多种接口和
+ 连接线, 还有允许 FreeBSD 与打印机通讯所需的
+ 内核配置。 </para>
+
+ <para>如果您已经连接好了您的打印机而且已经
+ 用它在另外一个操作系统下成功的打印, 您
+ 或许可以跳到这个部分<link
+ linkend="printing-software">软件设置</link>。 </para>
+
+ <sect4 id="printing-ports">
+ <title>端口和连接电缆</title>
+
+ <para>现在所出售的在 PC 上使用的打印机通常至少有
+ 以下三种接口中的一个: </para>
+
+ <itemizedlist>
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>serial</secondary>
+ </indexterm>
+ <listitem>
+ <para><emphasis>串行</emphasis>接口, 也叫
+ RS232C, RS232D 或者 COM 口, 使用您计算机上的
+ 串口来发送数据到打印机。 串行
+ 接口在计算机上已经非常普遍, 而且电缆
+ 也非常容易买到且容易制作。 串行
+ 接口有时需要特殊的电缆, 而且可能需要
+ 您去配置稍微有点儿复杂的通讯
+ 选项。 大多数 PC 的串口的最高
+ 传输速度只有 115200&nbsp;bps, 这使得打印
+ 很大的图像需要的时间很长。 </para>
+ </listitem>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>parallel</secondary>
+ </indexterm>
+ <listitem>
+ <para><emphasis>并行</emphasis>界面使用
+ 计算机上的并口来发送数据到
+ 打印机。 并行接口在计算机上也已经非常普遍
+ 而且速度高于 RS232 串行界面。
+ 电缆非常容易买到, 但很难手工
+ 制作。 并行接口通常没有
+ 通讯选项, 这使得
+ 配置它相当简单。 </para>
+
+ <indexterm>
+ <primary>centronics</primary>
+ <see>parallel printers</see>
+ </indexterm>
+ <para>并口按打印机上的接头来命名也叫做
+ <quote>Centronics</quote>接口
+ 。 </para>
+ </listitem>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>USB</secondary>
+ </indexterm>
+ <listitem>
+ <para>USB 接口, 即通用串行
+ 总线, 可以达到比并口和串口
+ 高很多的速度。 而电缆简单又便宜。
+ USB 用来打印比串口和并口
+ 更有优势, 但是 &unix;
+ 系统不能很好的支持它。 避免这个问题的方法就是购买一台
+ 像大多数打印机一样的即有 USB 接口又有并口的
+ 打印机。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>一般来说并口只提供
+ 单向通讯( 计算机到打印机), 而串口
+ 和 USB 则可以提供双向通讯。 新的并口( EPP and
+ ECP) 和打印机
+ 在使用了 IEEE1284 标准的电缆之后, 可以在FreeBSD下
+ 双向通讯。 </para>
+
+ <indexterm><primary>PostScript</primary></indexterm>
+
+ <para>与打印机通过并口双向通讯
+ 通常由这两种方法中的一种来完成。 第一个方法是
+ 使用为 FreeBSD 编写的可以通过打印机使用的语言
+ 与打印机通讯的驱动程序。 这通常
+ 用在喷墨打印机上, 并且可以用来报告
+ 剩余墨水多少和其他状态信息。 第二种方法
+ 使用在支持
+ &postscript; 的打印机上。 </para>
+
+ <para>&postscript; 任务
+ 事实上由程序发送给打印机; 但它并不进行打印
+ 而是直接将结果返回给计算机。
+ &postscript; 也采取双向通讯来将打印中的问题
+ 报告给计算机, 比如 &postscript; 程序中的错误
+ 或者打印机卡纸。 这些信息对于用户来说也许是非常
+ 有价值的。 此外, 最好的在支持
+ &postscript; 的打印机上记帐的方法需要双向
+ 通讯: 询问打印机打印总页数 ( 打印机
+ 从出厂一共打印过多少页 ), 然后发送
+ 用户的任务, 之后再次查询总打印页数。 将打印前后得到
+ 的两个值相减就可以得到该用户要付多少
+ 纸钱。 </para>
+ </sect4>
+
+ <sect4 id="printing-parallel">
+ <title>并口</title>
+
+ <para>用并口连接打印机需要用
+ Centronics 电缆把打印机与计算机连接起来。
+ 具体说明指导应该在打印机, 计算机的说明书上有, 或者
+ 干脆两个上面都有。 </para>
+
+ <para>记住您用的计算机上的哪个并口。
+ 第一个并口在 FreeBSD 上叫 <filename>/dev/ppc0</filename>
+ ; 第二个叫 <filename>/dev/ppc1</filename>, 依此
+ 类推。 打印机设备也用同样的方法命名:
+ <filename>/dev/lpt0</filename> 是连接在第一个并口
+ 上的打印机, 依此类推。 </para>
+ </sect4>
+
+ <sect4 id="printing-serial">
+ <title>串口</title>
+
+ <para>用串口连接打印机需要用
+ 合适的串口电缆把打印机与计算机连接起来。 具体
+ 说明指导应该在打印机, 计算机的说明书上有, 或者
+ 同样干脆两个上面都有。 </para>
+
+ <para>如果您不确定什么样儿的电缆才是 <quote> 合适的串口
+ 电缆 </quote> , 您可以尝试以下几种不同的
+ 电缆: </para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>调制解调器</emphasis> 电缆每一端的
+ 每一根引脚都直接连接到另一端
+ 相应的引脚
+ 上。 这种电缆也叫做
+ <quote>DTE-to-DCE</quote> 电缆。 </para>
+ </listitem>
+
+ <indexterm><primary>null-modem cable</primary></indexterm>
+ <listitem>
+ <para><emphasis>非调制解调器</emphasis>电缆上每一端的有些引脚
+ 是与另一端相应引脚直接连接的, 而有一些则是交叉连接的 (比如, 发送数据引脚连接到
+ 接收数据引脚 ), 还有一些引脚直接在电缆连接头儿内
+ 短接。 这种电缆也叫做
+ <quote>DTE-to-DTE</quote> 电缆。 </para>
+ </listitem>
+
+ <listitem>
+ <para>一些特殊的打印机需要的<emphasis>串行打印机</emphasis> 电缆,
+ 是一种和非调制解调器电缆类似的电缆,
+ 只是一些信号还是送到了另一端, 而
+ 不是直接在连接头儿内短路。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <indexterm><primary>baud rate</primary></indexterm>
+ <indexterm><primary>parity</primary></indexterm>
+ <indexterm><primary>flow control protocol</primary></indexterm>
+ <para>当然, 您还得为打印机设置通讯参数。
+ 一般是通过打印机面板上的按钮或者 DIP
+ 开关进行设置。 在计算机和打印机上都选择它们所支持的最高
+ <literal>波特</literal> (每秒多少比特, 有时也叫
+ <emphasis>波特率</emphasis>) 的传输速率。
+ 选择7或者8个数据位; 选择不校验,
+ 偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量
+ 控制协议: 无, XON/XOFF (也叫做
+ <quote>in-band</quote> 或 <quote>软件</quote>) 流量控制。
+ 记住您的软件配置中的参数也要设成上面的
+ 数值。 </para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-software">
+ <title>软件设置</title>
+
+ <para>这部分描述了要使用FreeBSD系统中的
+ <application>LPD</application> 打印池进行打印所需的软件设置。
+ </para>
+
+ <para>包括这几个步骤: </para>
+
+ <procedure>
+ <step>
+ <para>在需要的时候配置内核来允许您连接
+ 打印机的端口; <link
+ linkend="printing-kernel">配置内核</link> 部分会告诉您
+ 需要做什么。 </para>
+ </step>
+
+ <step>
+ <para>如果您使用并口, 则需要设置一下
+ 并口的通讯模式; <link
+ linkend="printing-parallel-port-mode">设置
+ 并口通讯模式</link> 部分会告诉您具体的
+ 细节。 </para>
+ </step>
+
+ <step>
+ <para>测试操作系统是否能够发送数据到打印机。
+ <link linkend="printing-testing">检测打印机
+ 联机状况</link> 部分会告诉您要怎样
+ 做。 </para>
+ </step>
+
+ <step>
+ <para>为 <application>LPD</application> 设置与打印机匹配的参数则
+ 通过修改
+ <filename>/etc/printcap</filename> 这个文件来完成。 这章后面
+ 的部分将讲解如何来完成设置。 </para>
+ </step>
+ </procedure>
+
+ <sect4 id="printing-kernel">
+ <title>配置内核</title>
+
+ <para>操作系统的内核为了使某些特殊设备工作需要重新
+ 编译。 打印机所用的串口、
+ 并口就属于那些特殊设备。 因此, 可能需要
+ 添加对串口或并口的支持,
+ 如果内核并没有配置它们的话。 </para>
+
+ <para>要想知道您现在使用的内核是否支持串口,
+ 输入: </para>
+
+ <screen>&prompt.root; <userinput>grep sio<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen>
+
+ <para>其中 <replaceable>N</replaceable> 是串口的
+ 编号, 从0开始。 如果您看到
+ 类似下面的输出: </para>
+
+ <screen>sio2 at port 0x3e8-0x3ef irq 5 on isa
+sio2: type 16550A</screen>
+
+ <para>则说明您现在使用的内核支持串口。 </para>
+
+ <para>要想知道您现在使用的内核是否支持并口,
+ 输入: </para>
+
+ <screen>&prompt.root; <userinput>grep ppc<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen>
+
+ <para>其中 <replaceable>N</replaceable> 是并口的
+ 编号, 同样从0开始。 如果得到类似
+ 下面的输出: </para>
+
+ <screen>ppc0: &lt;Parallel port&gt; at port 0x378-0x37f irq 7 on isa0
+ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
+ppc0: FIFO with 16/16/8 bytes threshold</screen>
+
+ <para>那么您现在使用的内核支持并口。 </para>
+
+ <para>您可能必须为了使操作系统支持您打印机需要的串口或
+ 并口而
+ 重新配置内核。 </para>
+
+ <para>要增加对串口的支持, 参见
+ 内核配置这部分。 要增加对并口的支持, 除了参见
+ 上面提到的那部分之外, <emphasis>还要</emphasis> 参见下面的
+ 部分。 </para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-dev-ports">
+ <title>在 <filename>/dev</filename> 中为端口添加
+ 设备节点</title>
+
+ <note><para>FreeBSD&nbsp;5.0 支持 <literal>devfs</literal>
+ 这种在需要的时候自动添加设备节点
+ 的文件系统。 如果您正在使用的 FreeBSD 开启了
+ <literal>devfs</literal> 文件系统, 那么您可以安全的跳过
+ 这部分。 </para></note>
+
+ <para>尽管内核可能已经支持通过串口或者并口
+ 通讯, 但您还是需要一个软件接口
+ 来使您系统上的程序通过它发送和接收
+ 数据。 这也是
+ <filename>/dev</filename> 目录中那些设备节点的作用。 </para>
+
+ <para><emphasis>要在 <filename>/dev</filename> 中为端口添加
+ 一个设备节点: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>使用 &man.su.1; 命令切换到 <username>root</username> 帐号。
+ 在出现提示的时候输入 <username>root</username> 帐号的密码。 </para>
+ </step>
+
+ <step>
+ <para>将当前目录改变到 <filename>/dev</filename>
+ 目录: </para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput></screen>
+ </step>
+
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>./MAKEDEV <replaceable>port</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>port</replaceable> 替换成
+ 您需要添加端口的节点名。 当打印机连接在第一个并口上时, 替换成
+ <literal>lpt0</literal> , 连接在第二个并口上时, 替换成
+ <literal>lpt1</literal> , 依此类推; 当打印机连接在第一个串口上时, 替换成
+ <literal>ttyd0</literal> , 连接在第二个串口上时, 替换成
+ <literal>ttyd1</literal> , 依此类推。 </para>
+ </step>
+
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>ls -l <replaceable>port</replaceable></userinput></screen>
+
+ <para>来检查设备节点是否正常建立。 </para>
+ </step>
+ </procedure>
+
+ <sect4 id="printing-parallel-port-mode">
+ <title>设置并口的通讯
+ 模式</title>
+
+ <para>在使用并口时, 您可以选择
+ 让 FreeBSD 用中断方式还是轮询方式来
+ 与打印机通讯。 在
+ FreeBSD&nbsp;4.X and 5.X 上, 通用的打印机驱动 (&man.lpt.4;)
+ 使用 &man.ppbus.4; 系统, 它由
+ &man.ppc.4; 驱动来控制端口芯片。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>中断</emphasis> 方式是
+ GENERIC 核心的默认方式。 在这种方式下,
+ 操作系统占用一条中断请求线来检测什么时候
+ 打印机做好接收数据的准备。 </para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>轮询</emphasis> 方式是
+ 操作系统反复不断的询问打印机是否做好
+ 接收数据的准备。 当它返回准备好时, 核心开始发送
+ 下面要发送的数据。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>中断方式速度通常会快一些,
+ 但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机
+ 不能正常的工作在中断模式下,
+ 是由于一些定时问题 (还没正确的理解)
+ 造成的。 这些打印机需要使用轮询方式。 您应该使用
+ 任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以
+ 工作, 但在中断模式下会慢的要命。 </para>
+
+ <para>您可以用以下两种方法设定通讯模式: 通过
+ 配置内核或者使用 &man.lptcontrol.8;
+ 这个程序。 </para>
+
+ <para><emphasis>要通过配置内核的方法设置
+ 通讯模式: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>修改内核配置文件。 找到
+ 一个叫 <literal>ppc0</literal> 的记录。 如果您想要设置的是
+ 第二个并口, 那么用 <literal>ppc1</literal>
+ 代替。 使用第三个并口的时候用 <literal>ppc2</literal> 代替,
+ 依此类推。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如果您想要使用中断方式, 在 FreeBSD&nbsp;4.X 下的方法是指定一个
+ <literal>irq</literal> : </para>
+
+ <programlisting>device ppc0 at isa? irq <replaceable>N</replaceable></programlisting>
+
+ <para>其中 <replaceable>N</replaceable> 是计算机并口
+ 的中断编号。 </para>
+
+ <para>在 FreeBSD&nbsp;5.X 下, 修改下面这一行: </para>
+
+ <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting>
+
+ <para>它在 <filename>/boot/device.hints</filename> 这个文件中,
+ 其中 <replaceable>N</replaceable> 用正确的中断
+ 编号代替。 同时, 核心配置文件也必须
+ 包括 &man.ppc.4; 的驱动: </para>
+
+ <screen>device ppc</screen>
+
+ </listitem>
+
+ <listitem>
+ <para>如果您想要使用轮询方式, 则不用指定
+ <literal>irq</literal> : </para>
+
+ <para>在 FreeBSD&nbsp;4.X 下, 在内核配置文件中使用下面
+ 这行: </para>
+
+ <programlisting>device ppc0 at isa?</programlisting>
+
+ <para>在 FreeBSD&nbsp;5.X 下, 只需要把
+ <filename>/boot/device.hints</filename> 这个文件中的下面这行
+ 删除掉: </para>
+
+ <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting>
+
+ <para>在
+ FreeBSD&nbsp;5.X 下, 有时上面的方法并不能使并口工作在轮询方式。 大多数
+ 情况是由于 &man.acpi.4; 驱动造成的, 它
+ 可以自动侦测到设备并将其挂载到系统上, 但也因此,
+ 它控制着打印机端口的访问模式. 您
+ 得检查 &man.acpi.4; 的配置来
+ 解决这个问题。 </para>
+ </listitem>
+ </itemizedlist>
+ </step>
+
+ <step>
+ <para>保存文件。 然后配置, 建立, 并安装刚配置的
+ 内核, 最后重新启动。 参见 <link
+ linkend="kernelconfig">内核配置</link> 这章来获得
+ 更多细节。 </para>
+ </step>
+ </procedure>
+
+ <para><emphasis>使用</emphasis>
+ &man.lptcontrol.8; <emphasis>设置通讯模式</emphasis> : </para>
+
+ <procedure>
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>lptcontrol -i -d /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>将
+ <literal>lpt<replaceable>N</replaceable></literal> 设置成中断方式。 </para>
+ </step>
+
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>lptcontrol -p -d /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>将
+ <literal>lpt<replaceable>N</replaceable></literal> 设置成轮询方式。 </para>
+ </step>
+ </procedure>
+
+ <para>您可以把这些命令加入到
+ <filename>/etc/rc.local</filename> 这个文件中, 这样每次启动系统
+ 时都会设置成您想要的方式。 参见 &man.lptcontrol.8; 来获得
+ 更多信息。 </para>
+ </sect4>
+
+ <sect4 id="printing-testing">
+ <title>检测打印机的通讯</title>
+
+ <para>在设置打印池系统之前, 您
+ 应该确保您的计算机可以把数据
+ 发送到打印机上。 分别独立调试打印机的通讯和打印池系统
+ 会更简单。 </para>
+
+ <para>我们为了测试打印机,将发送一些文本给它。 一个叫 &man.lptest.1;
+ 的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的
+ 字符: 它在每行打出
+ 可以打印的 96 个 ASCII 字符。 </para>
+
+ <indexterm><primary>PostScript</primary></indexterm>
+ <para>当我们使用的是一台 &postscript; ( 或者以其他语言为基础的 ) 打印机, 那么
+ 需要更仔细的检测。 一段小小的 &postscript;
+ 程序足以完成检测的任务, 比如下面这段程序: </para>
+
+ <programlisting>%!PS
+100 100 moveto 300 300 lineto stroke
+310 310 moveto /Helvetica findfont 12 scalefont setfont
+(Is this thing working?) show
+showpage</programlisting>
+
+ <para>可以把上面这段 &postscript; 代码写进一个文件里,
+ 并且像下面部分的例子里那样
+ 使用。 </para>
+
+ <indexterm><primary>PCL</primary></indexterm>
+ <note>
+ <para>上面的小程序是基于
+ &postscript; 写成的, 而不是惠普
+ 的 PCL 。 尽管 PCL 拥有强大的功能, 比如
+ 您可以在打印纯文本的同时夹带着特殊的命令。
+ &postscript; 不能直接打印纯文本, 所以
+ 这类打印机语言是我们要特殊照顾的
+ 对象。 </para>
+ </note>
+
+ <sect5 id="printing-checking-parallel">
+ <title>检测并口打印机</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>parallel</secondary>
+ </indexterm>
+ <para>这部分内容将指导您怎样检测FreeBSD是否
+ 可以与一台已经连接在并口上的打印机
+ 通讯。 </para>
+
+ <para><emphasis>要测试并口上的
+ 打印机: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>用 &man.su.1; 命令转换到 <username>root</username> 用户。 </para>
+ </step>
+
+ <step>
+ <para>发送数据到打印机。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如果打印机可以直接打印纯文本, 可以用
+ &man.lptest.1; 。 输入: </para>
+
+ <screen>&prompt.root; <userinput>lptest &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>N</replaceable> 是并口的
+ 编号, 从0开始。 </para>
+ </listitem>
+
+ <listitem>
+ <para>如果打印机支持 &postscript; 或者
+ 其他打印机语言, 可以发送一段小程序到
+ 打印机。 输入: </para>
+
+ <screen>&prompt.root; <userinput>cat &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>然后, 一行一行的 <emphasis>输入</emphasis> 输入
+ 这段程序。 因为在按下 <literal>换行</literal> 或者
+ <literal>回车</literal> 之后, 这一行就不能再修改了。
+ 当您输入完
+ 这段程序之后, 按
+ <literal>CONTROL+D</literal>, 或者其他
+ 表示文件结束的键。 </para>
+
+ <para>另外一种办法, 您可以把这段程序写在一个文件
+ 里并输入: </para>
+
+ <screen>&prompt.root; <userinput>cat <replaceable>file</replaceable> &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>file</replaceable> 是
+ 包含这您要发给打印机程序的
+ 文件名。 </para>
+ </listitem>
+ </itemizedlist>
+ </step>
+ </procedure>
+
+ <para>之后, 您应该看到打印出了一些东西。 如果打印出的东西
+ 看起来并不正确, 请不要着急; 我们将在后面指导您怎样
+ 解决这类问题。 </para>
+ </sect5>
+
+ <sect5 id="printing-checking-serial">
+ <title>检测串行打印机</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>serial</secondary>
+ </indexterm>
+ <para>这部分将告诉您如何检测FreeBSD是否可以与
+ 连接在串口上的打印机通讯。 </para>
+
+ <para><emphasis>要测试一个连接在串口上
+ 的打印机: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>通过 &man.su.1; 命令转换成 <username>root</username> 用户。 </para>
+ </step>
+
+ <step>
+ <para>修改 <filename>/etc/remote</filename> 这个文件。 增加
+ 下面这些内容: </para>
+
+ <programlisting>printer:dv=/dev/<replaceable>port</replaceable>:br#<replaceable>bps-rate</replaceable>:pa=<replaceable>parity</replaceable></programlisting>
+
+ <indexterm><primary>bits-per-second</primary></indexterm>
+ <indexterm><primary>serial port</primary></indexterm>
+ <indexterm><primary>parity</primary></indexterm>
+ <para>其中 <replaceable>port</replaceable> 是
+ 串口的设备节点 (<literal>ttyd0</literal>,
+ <literal>ttyd1</literal>, 等等。 ),
+ <replaceable>bps-rate</replaceable> 是
+ 与打印机通讯时使用的波特,
+ <replaceable>parity</replaceable> 是通讯时打印机要求
+ 的校验方法 (either <literal>even</literal>,
+ <literal>odd</literal>, <literal>none</literal>, or
+ <literal>zero</literal>)。 </para>
+
+ <para>这儿有一个串口打印机的例子,
+ 它连接在第三个串口上, 速度为 19200 &nbsp; 波特,
+ 不进行校验: </para>
+
+ <programlisting>printer:dv=/dev/ttyd2:br#19200:pa=none</programlisting>
+ </step>
+
+ <step>
+ <para>用 &man.tip.1; 连接打印机。
+ 输入: </para>
+
+ <screen>&prompt.root; <userinput>tip printer</userinput></screen>
+
+ <para>如果没能成功, 则要再次修改
+ <filename>/etc/remote</filename> 这个文件, 并且试试用
+ <filename>/dev/cuaa<replaceable>N</replaceable></filename>
+ 代替
+ <filename>/dev/ttyd<replaceable>N</replaceable></filename>。 </para>
+ </step>
+
+ <step>
+ <para>发送数据到打印机。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如果打印机可以直接打印纯文本, 则用
+ &man.lptest.1; 。 输入: </para>
+
+ <screen>&prompt.user; <userinput>$lptest</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>如果打印机支持 &postscript; 或者其他
+ 打印机语言, 则发送一段小程序到
+ 打印机。 一行一行的输入程序, 必须
+ <emphasis>非常仔细</emphasis> 因为像退格
+ 或者其他编辑键也许对打印机来说有它的
+ 意义。 您同样也需要按一个特殊的
+ 文件结束键, 让打印机知道它已经
+ 接收了整个程序。 对于 &postscript;
+ 打印机, 按 <literal>CONTROL+D</literal>。 </para>
+
+ <para>或者, 您同样也可以把程序存储在一个文件里
+ 并输入: </para>
+
+ <screen>&prompt.user; <userinput>&gt;<replaceable>file</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>file</replaceable> 是
+ 包含要发送程序的文件名。 在
+ &man.tip.1; 发送这个文件之后, 按代表
+ 文件结束的键。 </para>
+ </listitem>
+ </itemizedlist>
+ </step>
+ </procedure>
+
+ <para>您应该看到打印出了一些东西。 如果它们看起来
+ 并不正确也不要着急; 我们将在以后的部分中解决它。 </para>
+ </sect5>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-printcap">
+ <title>开启打印池: 文件 <filename>/etc/printcap</filename>
+ </title>
+
+ <para>目前, 您的打印机应该已经连好了线, 系统内核
+ 也为与打印机联机而重新配置好 ( 如果需要的话 ), 而且您也
+ 已经可以发送一些简单的数据到打印机。 现在, 我们要
+ 配置 <application>LPD</application> 来使其控制您的
+ 打印机。 </para>
+
+ <para>配置 <application>LPD</application> 要修改
+ <filename>/etc/printcap</filename> 这个文件。
+ <application>LPD</application> 打印池系统
+ 在每次打印池被使用的时候都会读取这个文件, 所以对这个文件
+ 的修改会立即生效。 </para>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>capabilities</secondary>
+ </indexterm>
+ <para> &man.printcap.5; 这个文件的格式很简单。
+ 您可以用您最喜欢的文本编辑器来修改
+ <filename>/etc/printcap</filename> 这个文件。 这种格式和其他的
+ 像
+ <filename>/usr/share/misc/termcap</filename> 和
+ <filename>/etc/remote</filename> 这类文件是一样的。 要得到完整的
+ 关于这种格式的信息, 参见 &man.cgetent.3; 。 </para>
+
+ <para>简单的打印池配置包括下面的几
+ 步: </para>
+
+ <procedure>
+ <step>
+ <para>为打印机起一个名字 ( 和一些方便的别名 )
+ , 然后把它们写进文件
+ <filename>/etc/printcap</filename> ; 参见
+ <link linkend="printing-naming">Naming the Printer</link>
+ 这章来得到更多的关于起名的帮助。 </para>
+ </step>
+
+ <indexterm><primary>header pages</primary></indexterm>
+ <step>
+ <para>关掉报头页 ( 它默认是打开的 ), 通过
+ 增加 <literal>sh</literal> 项目; 参见
+ <link linkend="printing-no-header-pages">Suppressing Header
+ Pages</link> 部分来得到更多信息。 </para>
+ </step>
+
+ <step>
+ <para>建立一个打印池缓冲的目录, 并且通过
+ <literal>sd</literal> 项目指定它的位置; 参见 <link
+ linkend="printing-spooldir">Making the Spooling
+ Directory</link> 部分来得到更多信息。 </para>
+ </step>
+
+ <step>
+ <para>在 <filename>/dev</filename> 下设置打印机设备
+ 节点, 并且在写在 <filename>/etc/printcap</filename>
+ 文件中 <literal>lp</literal> 项目里; 参见 <link
+ linkend="printing-device">识别打印机
+ 设备</link> 这部分得到更多信息。 还有, 如果打印机连接在
+ 串口上, 设置通讯参数要写在
+ <literal>ms#</literal> 项目中。 这些参数在 <link
+ linkend="printing-commparam">配置打印池
+ 通讯参数</link> 这部分已经讨论过。 </para>
+ </step>
+
+ <step>
+ <para>安装纯文本过滤器; 参见 <link
+ linkend="printing-textfilter">安装文本
+ 过滤器</link> 这章来得到细节。 </para>
+ </step>
+
+ <step>
+ <para>用
+ &man.lpr.1; 命令来测试设置。 想得到更多信息可以参见
+ <link linkend="printing-trying">测试</link> and
+ <link
+ linkend="printing-troubleshooting">疑难问题解答</link>
+ 部分。 </para>
+ </step>
+ </procedure>
+
+ <note>
+ <para>基于打印机语言的打印机, 比如 &postscript; 打印机,
+ 不能直接打印纯文本。 简单的设置方法在上面
+ 提到并且下面的部分也要讨论, 假如您正在
+ 安装这样一台只能打印它明白的文件的
+ 打印机。 </para>
+ </note>
+
+ <para>用户总是希望他们能在任何一个安装在他们系统的打印机上打印
+ 纯文本。 使用
+ <application>LPD</application> 接口的程序也通常这样
+ 希望。
+ 如果您正在安装这样一台打印机, 并且想要它能打印
+ 基于它支持的打印机语言的任务 <emphasis> 并且 </emphasis>
+ 还可以打印纯文本的任务, 那么强烈建议您在上面提到
+ 的简单设置的步骤上增加一步: 安装一个
+ 自动纯文本到 &postscript; ( 或者其他打印机语言 ) 的
+ 转化程序。 参见 <link
+ linkend="printing-advanced-if-conversion"> 在
+ &postscript; 打印机上打印纯文本 </link> 将得到
+ 更多有关信息。 </para>
+
+ <sect4 id="printing-naming">
+ <title>命名打印机</title>
+
+ <para>第一步 ( 简单 ) 就是给打印机起一个名字。
+ 您是按功能起名字还是干脆起个古怪的名字都没有关系,
+ 因为您可以给打印机设置许多的
+ 别名。 </para>
+
+ <para>在
+ <filename>/etc/printcap</filename> 里至少有一个打印机必须指定, 别名是
+ <literal>lp</literal>. 这是默认的打印机名。
+ 如果用户既没有 <envar>PRINTER</envar> 环境
+ 变量, 也没有在任何
+ <application>LPD</application> 命令的命令行中指定打印机名,
+ 则 <literal>lp</literal> 将是默认
+ 要使用的打印机。 </para>
+
+ <para>还有, 我们通常把最后一个别名设置成
+ 能完全描述打印机的名字, 包括厂家
+ 和型号。 </para>
+
+ <para>一旦您选好了名字或者一些别名, 把它们
+ 放进文件 <filename>/etc/printcap</filename> 里。 打印机的
+ 名字应该从最左边的一列写起。 用
+ 竖杠来隔开每个别名, 并且在最后一个别名后面
+ 加上一个冒号。 </para>
+
+ <para>在下面的例子中, 我们从一个基本的
+ <filename>/etc/printcap</filename> 开始, 它只定义了两台打印机
+ (一台 Diablo 630 行式打印机和一台 Panasonic KX-P4455 &postscript;
+ 激光打印机 ):</para>
+
+ <programlisting>#
+# /etc/printcap for host rose
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:</programlisting>
+
+ <para>在这个例子中, 第一台打印机被命名为
+ <literal>rattan</literal> 并且设置了
+ <literal>line</literal>, <literal>diablo</literal>,
+ <literal>lp</literal>, 和 <literal>Diablo 630 Line
+ Printer</literal> 这几个别名。 因为它被设置了
+ <literal>lp</literal> 这个别名, 所以它是默认打印机。 第二台
+ 被命名为 <literal>bamboo</literal>, 并且设置了
+ <literal>ps</literal>, <literal>PS</literal>,
+ <literal>S</literal>, <literal>panasonic</literal>, 和
+ <literal>Panasonic KX-P4455 PostScript v51.4</literal> 这几个别名。 </para>
+ </sect4>
+
+ <sect4 id="printing-no-header-pages">
+ <title>不打印报头页</title>
+ <indexterm>
+ <primary>printing</primary>
+ <secondary>header pages</secondary>
+ </indexterm>
+
+ <para> <application>LPD</application> 打印池系统默认
+ 会为每个任务打印
+ <emphasis>报头页</emphasis>。 报头页
+ 包含了发送这个任务的用户, 发送这个任务
+ 的主机, 任务的名字, 并用
+ 大字母打出。 但不幸的是, 所有这些额外的文本会妨碍
+ 在简单设置打印机时的除错, 所以我们将先
+ 不打印报头页。 </para>
+
+ <para>要暂停打印报头页, 为打印机的记录增加 <literal>sh</literal>
+ 标记, 在
+ <filename>/etc/printcap</filename> 文件中。 这儿有一个
+ <filename>/etc/printcap</filename> 文件中使用 <literal>sh</literal>
+ 的例子: </para>
+
+ <programlisting>#
+# /etc/printcap for host rose - no header pages anywhere
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:</programlisting>
+
+ <para>注意我们的正确格式: 第一行从
+ 最左边一列开始, 而后的每一行用
+ TAB 缩进一次。 一行写不下需要换行时, 在换行前打一个
+ 反斜杠。 </para>
+ </sect4>
+
+ <sect4 id="printing-spooldir">
+ <title>建立打印池目录</title>
+ <indexterm><primary>printer spool</primary></indexterm>
+ <indexterm><primary>print jobs</primary></indexterm>
+
+ <para>下一步设置就是要建立一个
+ <emphasis>打印池目录</emphasis>, 一个在任务被打印完
+ 之前存放任务的目录, 也有很多其他
+ 的打印池系统所用到的文件存在里面。 </para>
+
+ <para>由于打印池目录的变量本质, 通常
+ 把这些目录安排在
+ <filename>/var/spool</filename> 下。 您也没有必要去
+ 备份打印池目录里的内容。
+ 重新建立它们只要简单的使用 &man.mkdir.1; 命令。 </para>
+
+ <para>通常, 我们习惯将目录名起成和
+ 打印机一样的名字, 像下面
+ 这样: </para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/spool/<replaceable>printer-name</replaceable></userinput></screen>
+
+ <para>然而, 如果您有很多网络打印机,
+ 您可能想要把这些打印池目录放在一个单独的
+ 您专门为使用
+ <application>LPD</application> 打印而准备的目录里。 我们
+ 将用我们的两台打印机作为例子
+ <literal>rattan</literal> 和
+ <literal>bamboo</literal>:</para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/spool/lpd</userinput>
+&prompt.root; <userinput>mkdir /var/spool/lpd/rattan</userinput>
+&prompt.root; <userinput>mkdir /var/spool/lpd/bamboo</userinput></screen>
+
+ <note>
+ <para>如果您在关心用户任务的保密
+ 性, 您可能想保护相应的打印池目录, 使它们
+ 不能被公开访问。 打印池
+ 目录应该被daemon用户拥有, 用户daemon和daemon组拥有读写和
+ 搜索的权限, 并且其他用户没有。
+ 我们将用我们的两台打印机作为例子:</para>
+
+ <screen>&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/rattan</userinput>
+&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/bamboo</userinput>
+&prompt.root; <userinput>chmod 770 /var/spool/lpd/rattan</userinput>
+&prompt.root; <userinput>chmod 770 /var/spool/lpd/bamboo</userinput></screen>
+ </note>
+
+ <para>最后, 您需要通过<filename>/etc/printcap</filename> 文件告诉 <application>LPD</application>
+ 这些
+ 目录。 您可以用 <literal>sd</literal> 标记来指定
+ 打印池目录的
+ 路径:</para>
+
+ <programlisting>#
+# /etc/printcap for host rose - added spooling directories
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:</programlisting>
+
+ <para>注意打印机的名字要从
+ 第1列开始, 其他记录每行都要
+ 用TAB键缩进一次, 写不开需要换行在最后加上反
+ 斜杠。 </para>
+
+ <para>如果您没用
+ <literal>sd</literal> 标记指定打印池目录, 打印池系统会将
+ <filename>/var/spool/lpd</filename> 目录作为默认目录。 </para>
+ </sect4>
+
+ <sect4 id="printing-device">
+ <title>识别打印机设备</title>
+
+ <para>在 <link linkend="printing-dev-ports">为端口在
+ <filename>/dev</filename> 目录下增加设备节点</link>
+ 章节中, 我们确定了使用
+ <filename>/dev</filename> 目录中的哪个节点来让 FreeBSD 与打印机
+ 通讯。 现在, 我们来告诉
+ <application>LPD</application> 这个
+ 信息。 当打印池系统有任务需要打印, 它
+ 将为过滤程序(负责传送数据到打印机)打开
+ 指定的设备。 </para>
+
+ <para>用 <literal>lp</literal> 标记在 <filename>/etc/printcap</filename> 里列出 <filename>/dev</filename>
+ 下的设备节点
+ 。</para>
+
+ <para>在我们的例子中, 假设打印机
+ <literal>rattan</literal> 在第一个并口上, 打印机
+ <literal>bamboo</literal> 在第六个串口上; 下面是
+ 要对 <filename>/etc/printcap</filename> 文件里增加的内容 :</para>
+
+ <programlisting>#
+# /etc/printcap for host rose - identified what devices to use
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:</programlisting>
+
+ <para>如果您没在您的 <filename>/etc/printcap</filename> 文件中
+ 用 <literal>lp</literal> 标记指定设备节点,
+ <application>LPD</application> 将默认使用 <filename>/dev/lp</filename>
+ 。
+ <filename>/dev/lp</filename> 目前在
+ FreeBSD 中不存在。 </para>
+
+ <para>如果您正在安装的打印机是连接在
+ 并口上的, 请跳到 <link
+ linkend="printing-textfilter">安装文本
+ 过滤器</link> 这章。 如果不是的话, 还是最好按下面介绍的
+ 步骤做。 </para>
+ </sect4>
+
+ <sect4 id="printing-commparam">
+ <title>配置打印池通讯参数</title>
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>serial</secondary>
+ </indexterm>
+
+ <para>对于连在串口上的打印机, <application>LPD</application>
+ 可以为发送数据到打印机的过滤程序设置好波特率,
+ 校验, 和其他串口通讯参数
+ 。 这是有利的,
+ 因为:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>它可以让您只需简单的修改
+ <filename>/etc/printcap</filename> 就能尝试不同的通讯
+ 参数; 您并不需要去重新编译过滤器
+ 程序。 </para>
+ </listitem>
+
+ <listitem>
+ <para>它使得打印池系统可以在
+ 多台有不同串口通讯设置的打印机上使用
+ 相同的过滤器程序。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>下面这个 <filename>/etc/printcap</filename> 中
+ 用 <literal>lp</literal> 标记来控制列出设备的
+ 串口通讯参数 :</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>br#<replaceable>bps-rate</replaceable></literal></term>
+
+ <listitem>
+ <para>设置设备的通讯速度为
+ <replaceable>bps-rate</replaceable>, 这里
+ <replaceable>bps-rate</replaceable> 可以为 50, 75, 110,
+ 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600,
+ 19200, 38400, 57600, or 115200 比特每秒.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ms#<replaceable>stty-mode</replaceable></literal></term>
+
+ <listitem>
+ <para>设置已打开的中端设备的选项
+ 。 &man.stty.1; 将详细
+ 讲述可用的选项。 </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>当 <application>LPD</application> 打开
+ 用 <literal>lp</literal> 指定的设备时, 它会
+ 将设备的特性设置成在
+ <literal>ms#</literal> 标记后指定的那样。 特别是
+ <literal>parenb</literal>,
+ <literal>parodd</literal>, <literal>cs5</literal>,
+ <literal>cs6</literal>, <literal>cs7</literal>,
+ <literal>cs8</literal>, <literal>cstopb</literal>,
+ <literal>crtscts</literal>, 和 <literal>ixon</literal>
+ 这些模式, 它们在 &man.stty.1;
+ 手册中有详细说明。 </para>
+
+ <para>我们举个例子来添加我们连在第6个串口上的
+ 打印机。 我们将设波特为38400。 至于模式,
+ 我们将用 <literal>-parenb</literal> 设置成不校验,
+ 用 <literal>cs8</literal> 设置成8位字符,
+ 用 <literal>clocal</literal> 设置成不要调制解调器控制,
+ 用 <literal>crtscts</literal> 设置成硬件流量控制: </para>
+
+ <programlisting>bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:</programlisting>
+ </sect4>
+
+ <sect4 id="printing-textfilter">
+ <title>安装文本过滤器</title>
+ <indexterm>
+ <primary>printing</primary>
+ <secondary>filters</secondary>
+ </indexterm>
+
+ <para>我们现在准备告诉 <application>LPD</application>
+ 使用什么文本过滤器
+ 给打印机发送任务。 <emphasis> 文本过滤器</emphasis>,
+ 也叫 <emphasis> 输入过滤器</emphasis>, 是一个
+ 在 <application>LPD</application> 有一个任务要发给
+ 打印机时运行的程序。 当 <application>LPD</application>
+ 为打印机运行文本过滤器时, 它设置过滤器的
+ 标准输入为要发给打印机的任务, 而标准输出为
+ 用 <literal>lp</literal> 标记指定的打印机
+ 。 过滤器先从标准输入读取
+ 任务, 为打印机进行一些转换
+ , 并将结果写到标准输出, 这些结果
+ 将被打印。 想得到更多关于文本过滤器的信息, 见
+ <link linkend="printing-advanced-filters">过滤器</link>
+ 这节。 </para>
+
+ <para>对于简单的打印机设置, 文本过滤器可以仅仅是一段
+ 执行 <command>/bin/cat</command> 的 shell 脚本来
+ 发送任务到打印机。
+ FreeBSD 还提供了一个叫做
+ <filename>lpf</filename> 的过滤器, 它可以处理退格和下划线来
+ 使那些可能不能很好处理这类字符流的打印机正常工作。
+ 而且, 当然, 您可以用任何其他的
+ 您想用的过滤程序。 <command>lpf</command> 过滤器在
+ <link
+ linkend="printing-advanced-lpf">lpf: 一个文本
+ 过滤器</link> 这节将有详细描述。 </para>
+
+ <para>首先, 我们来写一段叫做
+ <filename>/usr/local/libexec/if-simple</filename> 的简单
+ shell 脚本作为文本过滤器。 用您熟悉的文本编辑器将下面的内容放进
+ 这个文件: </para>
+
+ <programlisting>#!/bin/sh
+#
+# if-simple - Simple text input filter for lpd
+# Installed in /usr/local/libexec/if-simple
+#
+# Simply copies stdin to stdout. Ignores all filter arguments.
+
+/bin/cat &amp;&amp; exit 0
+exit 2</programlisting>
+
+ <para>使这个文件可以被执行: </para>
+
+ <screen>&prompt.root; <userinput>chmod 555 /usr/local/libexec/if-simple</userinput></screen>
+
+ <para>然后用
+ <literal>if</literal> 标记在
+ <filename>/etc/printcap</filename> 里告诉 LPD 使用这个脚本。 我们将仍然为
+ 一直作为例子的这两台打印机在
+ <filename>/etc/printcap</filename> 里增加这个标记: </para>
+
+ <programlisting>#
+# /etc/printcap for host rose - added text filter
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:\
+ :if=/usr/local/libexec/if-simple:</programlisting>
+
+ <note>
+ <para>一份 <filename>if-simple</filename> 脚本
+ 的拷贝可以在 <filename
+ role="directory">/usr/share/examples/printing</filename>
+ 这个目录中找到。 </para>
+ </note>
+ </sect4>
+
+ <sect4>
+ <title>开启 <application>LPD</application></title>
+
+ <para>&man.lpd.8; 在 <filename>/etc/rc</filename> 中被运行,
+ 它是否被运行由 <literal>lpd_enable</literal> 这个变量控制。 这个
+ 变量默认是 <literal>NO</literal>。 如果您还没有修改
+ , 那么增加这行: </para>
+
+ <programlisting>lpd_enable="YES"</programlisting>
+
+ <para>到 <filename>/etc/rc.conf</filename> 文件当中, 然后既可以重启您的
+ 机器, 也可以直接运行 &man.lpd.8;。 </para>
+
+ <screen>&prompt.root; <userinput>lpd</userinput></screen>
+ </sect4>
+
+ <sect4 id="printing-trying">
+ <title>测试</title>
+
+ <para>现在已经基本完成了
+ <application>LPD</application> 的基本设置。
+ 但不幸的是, 还不是庆祝的时候,
+ 因为我们还需要测试设置并且修正所有的
+ 问题。 要测试设置, 尝试打印一些东西。 要
+ 用 <application>LPD</application> 系统打印, 您可以
+ 使用 &man.lpr.1; 命令,
+ 它可以提交一个任务来打印。 </para>
+
+ <para>您可以联合使用 &man.lpr.1; 和 the &man.lptest.1;
+ 程序, 在 <link
+ linkend="printing-testing">检查打印机
+ 通讯</link> 这节介绍怎样生成一些测试文本。 </para>
+
+ <para><emphasis>要测试简单 <application>LPD</application>
+ 设置: </emphasis></para>
+
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>lptest 20 5 | lpr -P<replaceable>printer-name</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>printer-name</replaceable> 是
+ 在 <filename>/etc/printcap</filename> 中指定的打印机的一个名字 ( 或者一个别名)
+ 。 要测试默认
+ 打印机, 输入 &man.lpr.1; 不带任何 <option>-P</option>
+ 选项。 同样, 如果您正在测试一台使用
+ &postscript; 的打印机, 发送一个 &postscript; 程序到打印机而不是
+ 使用 &man.lptest.1;。 您可以把程序放在一个
+ 文件里, 然后输入: <command>lpr
+ <replaceable>file</replaceable></command>.</para>
+
+ <para>对于一台 &postscript; 打印机, 您应该得到那段程序的
+ 结果。 而如果您使用的 &man.lptest.1;, 则您得到的
+ 结果应该看起来像下面这样: </para>
+
+ <programlisting>!"#$%&amp;'()*+,-./01234
+"#$%&amp;'()*+,-./012345
+#$%&amp;'()*+,-./0123456
+$%&amp;'()*+,-./01234567
+%&amp;'()*+,-./012345678</programlisting>
+
+ <para>要更进一步的测试打印机, 尝试下载一些大的
+ 程序 (为基于特定语言的打印机 ) 或者运行
+ &man.lptest.1; 并使用不同的参数。 比如,
+ <command>lptest 80 60</command> 将生成 60 行 每行 80
+ 个字符。 </para>
+
+ <para>如果打印机不能工作, 参考 <link
+ linkend="printing-troubleshooting">故障排除</link>
+ 这节。 </para>
+ </sect4>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-advanced">
+ <title>Advanced Printer Setup ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect2 id="printing-advanced-filter-intro">
+ <title>Filters ** 翻译进行中 **</title>
+ <indexterm>
+ <primary>printing</primary>
+ <secondary>filters</secondary>
+ </indexterm>
+
+ <para></para>
+
+ <sect3 id="printing-advanced-filters">
+ <title>How Filters Work ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-if-conversion">
+ <title>Accommodating Plain Text Jobs on &postscript; Printers
+ ** 翻译进行中 **</title>
+ <indexterm><primary>print jobs</primary></indexterm>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-ps">
+ <title>Simulating &postscript; on Non &postscript; Printers ** 翻译进行中 **</title>
+ <indexterm>
+ <primary>PostScript</primary>
+ <secondary>emulating</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>Ghostscript</primary></indexterm>
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-convfilters">
+ <title>Conversion Filters ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect4 id="printing-advanced-autoconv">
+ <title>Automated Conversion: an Alternative to Conversion
+ Filters ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-advanced-of">
+ <title>Output Filters ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-lpf">
+ <title><command>lpf</command>: a Text Filter ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-header-pages">
+ <title>Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect3 id="printing-advanced-header-pages-enabling">
+ <title>Enabling Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-header-pages-controlling">
+ <title>Controlling Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-header-pages-accounting">
+ <title>Accounting for Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-header-pages-ps">
+ <title>Header Pages on &postscript; Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-network-printers">
+ <title>Networked Printing ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>network</secondary>
+ </indexterm>
+ <indexterm><primary>network printing</primary></indexterm>
+ <para></para>
+
+ <sect3 id="printing-advanced-network-rm">
+ <title>Printers Installed on Remote Hosts ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-network-net-if">
+ <title>Printers with Networked Data Stream Interfaces ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-restricting">
+ <title>Restricting Printer Usage ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>restricting access to</secondary>
+ </indexterm>
+ <para></para>
+
+ <sect3 id="printing-advanced-restricting-copies">
+ <title>Restricting Multiple Copies ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-restricting-access">
+ <title>Restricting Access to Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-restricting-sizes">
+ <title>Controlling Sizes of Jobs Submitted ** 翻译进行中 **</title>
+
+ <indexterm><primary>print jobs</primary></indexterm>
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-restricting-remote">
+ <title>Restricting Jobs from Remote Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-acct">
+ <title>Accounting for Printer Usage ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>accounting</primary>
+ <secondary>printer</secondary>
+ </indexterm>
+ <para></para>
+
+ <sect3>
+ <title>Quick and Dirty Printer Accounting ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3>
+ <title>How Can You Count Pages Printed? ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-using">
+ <title>Using Printers ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>usage</secondary>
+ </indexterm>
+ <para></para>
+
+ <sect2 id="printing-lpr">
+ <title>Printing Jobs ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="printing-lpq">
+ <title>Checking Jobs ** 翻译进行中 **</title>
+
+ <indexterm><primary>print jobs</primary></indexterm>
+ <para></para>
+ </sect2>
+
+ <sect2 id="printing-lprm">
+ <title>Removing Jobs ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="printing-lpr-options">
+ <title>Beyond Plain Text: Printing Options ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect3 id="printing-lpr-options-format">
+ <title>Formatting and Conversion Options ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-lpr-options-job-handling">
+ <title>Job Handling Options ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-lpr-options-misc">
+ <title>Header Page Options ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-lpc">
+ <title>Administering Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-lpd-alternatives">
+ <title>Alternatives to the Standard Spooler ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="printing-troubleshooting">
+ <title>Troubleshooting ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/security/Makefile b/zh_CN.GB2312/books/handbook/security/Makefile
new file mode 100644
index 0000000000..b1e706759c
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/security/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= security/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/security/chapter.sgml b/zh_CN.GB2312/books/handbook/security/chapter.sgml
new file mode 100644
index 0000000000..e4f9313acc
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/security/chapter.sgml
@@ -0,0 +1,5053 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.225
+ $FreeBSD$
+-->
+
+<chapter id="security">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Matthew</firstname>
+ <surname>Dillon</surname>
+ <contrib>这一章的许多内容来自 security(7) 联机手册,其作者是 </contrib>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>安全</title>
+ <indexterm><primary>security</primary></indexterm>
+
+ <sect1 id="security-synopsis">
+ <title>概述</title>
+
+ <para>
+ 这一章将对系统安全的基本概念进行介绍,除此之外,还将介绍一些好的习惯,以及 &os;
+ 下的一些更深入的话题。这章的许多内容对于一般的系统和Internet安全也适用。如今,
+ Internet已经不再像以前那样是一个人人都愿意与您作好邻居的 <quote>友善</quote>
+ 的地方。 让系统更加安全,将保护您的数据、智力财产、时间,
+ 以及其他很多东西不至于被入侵者或类似人员所窃取。</para>
+
+ <para>&os;提供了大量的工具和机制来确保您的系统和网络的安全。</para>
+
+ <para>读完这章,您将了解:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>基本的 &os; 系统安全概念。</para>
+ </listitem>
+
+ <listitem>
+ <para>&os; 中众多可用的密码学设施,例如
+ <acronym>DES</acronym> 和 <acronym>MD5</acronym>。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何设置一次性口令验证机制。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何配置 <acronym>TCP</acronym> Wrappers 以便与
+ <command>inetd</command> 配合使用。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在 &os; 5.0 以前的版本上设置
+ <application>KerberosIV</application>。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在 &os; 5.0 或更高版本上设置
+ <application>Kerberos5</application>。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何使用 <acronym>IPFW</acronym> 来创建防火墙。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何配置 IPsec 并在 &os;/&windows; 间建立
+ <acronym>VPN</acronym>。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何配置并使用 <application>OpenSSH</application>,以及 &os; 的 <acronym>SSH</acronym>
+ 执行方式。</para>
+ </listitem>
+
+ <listitem>
+ <para>系统 <acronym>ACL</acronym> 的概念,以及如何使用它们。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何从 &os; 的安全公告中获得有用信息并采取相应措施。</para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para>在开始阅读这章之前,您需要:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>理解基本的 &os; 和 Internet 概念。</para>
+ </listitem>
+ </itemizedlist>
+
+ </sect1>
+
+ <sect1 id="security-intro">
+ <title>介绍</title>
+
+ <para>安全是系统管理至始至终最基本的要求。由于所有的 BSD &unix;
+ 多用户系统都有它自身内在的安全性,建立和维护额外的安全机制,
+ 确保用户的 <quote>诚实</quote> 大概是系统管理最艰巨的工作之一。
+ 机器仅保持着建立时最原始的安全性,而安全性必须要考虑到用户使用的便利性。
+ 通常, &unix; 系统能够支持巨大的并发用户处理,
+ 而这些处理中绝大部分是以服务器形式处理的 &mdash; 这意味着外部的实体能够与它们互连和互动。
+ 昨天的小型计算机和主机变成了今天的桌面机,计算机已连到局域网和互联网,
+ 安全就成了一个非常严峻的问题。</para>
+
+ <para>通过像 <quote>洋葱</quote> 那样分层的方法,能够很好地实现安全。
+ 简而言之,您所要做的就是创建很多的安全层,然后仔细地监视系统以防入侵。
+ 不过,过多地创建安全层可能会出现问题,您可能不希望大量地阅读检测结果,
+ 因为检测是所有安全机制中最重要的一环。例如,在所有的系统可执行文件上都设置
+ <literal>schg</literal> 标记 (参考 &man.chflags.1;)
+ 的意义就不大,因为尽管这也许能够暂时地保护那些执行文件,
+ 它阻止了攻击者轻易地闯入并作一个容易被检测出来的修改,
+ 却很可能最终导致您的安全机制根本检测不到入侵者。</para>
+
+ <para>系统安全也涉及到许多攻击方式,包括试图摧毁或使系统无法使用,
+ 但并不试图窃取 <username>root</username> 帐号
+ (<quote>干掉 root</quote>)。 安全问题主要分成以下几类:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>拒绝服务攻击。</para>
+ </listitem>
+
+ <listitem>
+ <para>窃取其他用户的帐户。</para>
+ </listitem>
+
+ <listitem>
+ <para> 通过可访问服务窃取root帐户。</para>
+ </listitem>
+
+ <listitem>
+ <para>通过用户帐户窃取root帐户。</para>
+ </listitem>
+
+ <listitem>
+ <para>建立后门。</para>
+ </listitem>
+ </orderedlist>
+
+ <indexterm>
+ <primary>DoS 攻击</primary>
+ <see>拒绝服务攻击 (DoS)</see>
+ </indexterm>
+ <indexterm>
+ <primary>安全</primary>
+ <secondary>DoS 攻击</secondary>
+ <see>拒绝服务攻击 (DoS)</see>
+ </indexterm>
+ <indexterm><primary>拒绝服务攻击 (DoS)</primary></indexterm>
+
+ <para>拒绝式服务攻击是侵占机器所需资源的一种行为。
+ 通常, DoS 攻击采用暴力(brute-force)手段通过压倒性的流量来破坏服务器和网络栈,
+ 以使机器崩溃或无法使用。 某些 DoS 攻击则利用在网络栈中的错误,
+ 仅用一个简单的信息包就可以让机器崩溃, 这类情况通常只能通过给内核打补丁来修复。
+ 在一些不利的条件下, 对服务器的攻击能够被修复,
+ 只要适当地修改一下系统的选项来限制系统对服务器的负荷。
+ 顽强的网络攻击是很难对付的。 例如,一个欺骗性信息包的攻击,
+ 无法阻止入侵者切断您的系统与Internet的连接。
+ 它不会使您的机器死掉,但它会把Internet连接占满。</para>
+
+ <indexterm>
+ <primary>security</primary>
+ <secondary>窃取用户帐户</secondary>
+ </indexterm>
+
+ <para>窃取用户帐户要比D.o.S.攻击更加普遍。
+ 许多系统管理员仍然在他们的服务器上运行着基本的
+ <application>telnetd</application>,<application>rlogind</application>,
+ <application>rshd</application> 和 <application>ftpd</application>
+ 服务。 这些服务在默认情况下不会以加密连接来操作。
+ 结果是如果您的系统有中等规模大小的用户群,
+ 在通过远程登录的方式登录到您系统的用户中, 一些人的口令会被人窃取。
+ 仔细的系统管理员会从那些成功登录系统的远程访问日志中寻找可疑的源地址。</para>
+
+
+
+ <para>通常必须假定,如果一个入侵者已经访问到了一个用户的帐户,
+ 那么它就可能使自己成为 <username>root</username>。 然而,
+ 事实是在一个安全和维护做得很好的系统中,
+ 访问用户的帐户不一定会让入侵者成为 <username>root</username>。
+ 这个差别是很重要的,因为没有成为
+ <username>root</username> 则入侵者通常是无法隐藏它的轨迹的, 而且,
+ 如果走运的话, 除了让用户的文件乱掉和系统崩溃之外,
+ 它不能做什么别的事情。 窃取用户帐户是很普遍的事情,
+ 因为用户往往不会对系统管理员的警告采取措施。</para>
+
+ <indexterm>
+ <primary>security</primary>
+ <secondary>后门</secondary>
+ </indexterm>
+
+ <para>系统管理员必须牢牢记住,可能有许多潜在的方法会使他们机器上的
+ <username>root</username> 用户受到威胁。入侵者可能知道
+ <username>root</username> 的口令,而如果在以
+ <username>root</username> 权限运行的服务器上找到一个缺陷 (bug),
+ 就可以通过网络连接到那台服务器上达到目的;另外,
+ 一旦入侵者已经侵入了一个用户的帐户,
+ 可以在自己的机器上运行一个 suid-root 程序来发现服务器的漏洞,
+ 从而让他侵入到服务器并获取 <username>root</username>。
+ 攻击者找到了入侵一台机器上 <username>root</username> 的途径之后,
+ 他们就不再需要安装后门了。许多 <username>root</username>
+ 漏洞被发现并修正之后, 入侵者会想尽办法去删除日志来消除自己的访问痕迹,
+ 所以他们会安装后门。
+ 后门能给入侵者提供一个简单的方法来重新获取访问系统的 <username>root</username>
+ 权限, 但它也会给聪明的系统管理员一个检测入侵的简便方法。
+ 让入侵者无法安装后门事实上对您的系统安全是有害的,
+ 因为这样这样并不会修复那些侵入系统的入侵者所发现的新漏洞。</para>
+
+
+ <para>安全的管理方法应当使用像 <quote>洋葱皮</quote> 一样多层次的方法来实现,
+ 这些措施可以按下面的方式进行分类:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>确保 <username>root</username> 和维护人员帐户的安全。</para>
+ </listitem>
+
+ <listitem>
+ <para>确保 <username>root</username> &ndash; 以root用户权限运行的服务器和suid/sgid可执行程序的安全。</para>
+ </listitem>
+
+ <listitem>
+ <para>确保用户帐户的安全。</para>
+ </listitem>
+
+ <listitem>
+ <para>确保口令文件的安全。</para>
+ </listitem>
+
+ <listitem>
+ <para>确保内核中核心组件、直接访问设备和文件系统的安全。</para>
+ </listitem>
+
+ <listitem>
+ <para>快速检测系统中发生的不适当的变化。</para>
+ </listitem>
+
+ <listitem>
+ <para>做个偏执狂。</para>
+ </listitem>
+ </orderedlist>
+
+ <para>这一章的下一节将比较深入地讲述上面提到的每一个条目。</para>
+ </sect1>
+
+ <sect1 id="securing-freebsd">
+ <title>确保FreeBSD的安全</title>
+ <indexterm>
+ <primary>security</primary>
+ <secondary>确保FreeBSD的安全</secondary>
+ </indexterm>
+
+ <note>
+ <title>命令与协议</title>
+ <para>在这份文档中,我们使用
+ <application>粗体</application> 来表示应用程序,
+ 并使用 <command>单倍距</command> 字体来表示命令。
+ 这样的排版区分能够有效地区分类似 ssh 这样的概念,
+ 因为它既可以表示命令,又可以表示协议。</para>
+ </note>
+
+ <para>下面几节中的内容将包括 <link
+ linkend="security-intro">前一节</link> 中提到的那些加强 FreeBSD
+ 安全性的方法。</para>
+
+ <sect2 id="securing-root-and-staff">
+ <title>确保 <username>root</username> 和维护人员帐户的安全 </title>
+ <indexterm>
+ <primary><command>su</command></primary>
+ </indexterm>
+
+ <para>首先,如果您没有确保 <username>root</username> 帐户的安全,
+ 就没必要先劳神确保用户帐户的安全了。绝大多数系统都会指派一个口令给
+ <username>root</username> 帐户。 我们的第一个假定是,口令
+ <emphasis>总是</emphasis> 不安全的。 这并不意味着您要把口令删掉。
+ 口令通常对访问机器的控制台来说是必须的。 也就是说,
+ 您不应当让它用到控制台以外的口令, 即使是使用 &man.su.1; 命令。
+ 例如,确信您的 pty 终端在 <filename>/etc/ttys</filename>
+ 文件中被指定为 insecure (不安全),这将使直接通过
+ <command>telnet</command> 或 <command>rlogin</command> 登录
+ <username>root</username> 会不被接受。 如果使用如
+ <application>sshd</application> 这样的其他登录服务,
+ 也要确认直接登录 root 是关闭的。您可以通过编辑
+ <filename>/etc/ssh/sshd_config</filename> 文件来做到这一点,确信
+ <literal>PermitRootLogin</literal> 被设置成 <literal>NO</literal>。
+ 考虑到每一种访问方法 &mdash; 如FTP这样的服务,
+ 以免因为它们而导致安全性的损失。
+ 直接登录 <username>root</username> 只有通过系统控制台才被允许。</para>
+ <indexterm>
+ <primary><groupname>wheel</groupname></primary>
+ </indexterm>
+
+ <para>当然, 作为一个系统管理员, 您应当获得
+ <username>root</username>身份, 因此, 我们开了一些后门来允许自己进入。
+ 但这些后门只有在经过了额外的口令确认之后才能使用。
+ 一种让 <username>root</username>
+ 可访问的方法是增加适当的用户帐户到
+ <groupname>wheel</groupname> 组 (在
+ <filename>/etc/group</filename> 中)。<groupname>wheel</groupname>
+ 组中的用户成员可以使用 <command>su</command>
+ 命令来成为 <username>root</username>。
+ 绝对不应该通过在口令项中进行设置来赋予维护人员天然的
+ <groupname>wheel</groupname> 组成员身份。 维护人员应被放置在
+ <groupname>staff</groupname> 组中,然后通过
+ <filename>/etc/group</filename> 文件加入到 <groupname>wheel</groupname>
+ 组。事实上,只有那些需要以 <username>root</username> 身份进行操作的用户才需要放进
+ <groupname>wheel</groupname> 组中。 当然,也可以通过
+ 某种其它的验证手段,例如 Kerberos,可以通过 <username>root</username>
+ 帐户中的 <filename>.k5login</filename> 文件来允许执行
+ &man.ksu.1; 成为 <username>root</username> ,而不必把它们放进
+ <groupname>wheel</groupname> 组。 这可能是一种更好的解决方案,
+ 因为 <groupname>wheel</groupname> 机制仍然可能导致入侵者获得
+ <username>root</username> ,如果他拿到了口令文件,并能够进入职员的帐户。
+ 尽管有 <groupname>wheel</groupname> 比什么都没有要强一些,
+ 但它并不是一种绝对安全的办法。</para>
+
+ <!-- XXX:
+ This will need updating depending on the outcome of PR bin/71147.
+ Personally I know what I'd like to see, which puts this in definite
+ need of a rewrite, but we'll have to wait and see. ceri@
+ -->
+
+ <para>一种间接地提高员工帐号,以及 <username>root</username>
+ 访问的方法,使采用其他的登录访问方式,并使用 <quote>星号</quote>
+ 替代员工加密的口令。使用 &man.vipw.8; 命令,
+ 可以把每一个加密的口令替换成一个 <quote><literal>*</literal></quote> 符。
+ 这将更新 <filename>/etc/master.passwd</filename> 文件,以及
+ 用户名/口令数据库,以禁用口令登录。</para>
+
+ <para>如下面的员工帐号</para>
+
+ <programlisting>foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting>
+
+ <para>应被改为:</para>
+
+ <programlisting>foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting>
+
+ <para>这一更改将阻止一般的登录,因为加密的口令永远不会与
+ <quote><literal>*</literal></quote> 匹配。一旦这么做之后,
+ 任何员工都必须使用其他的方式来完成登录,例如,使用
+ &man.kerberos.1; 或者通过 &man.ssh.1; 利用 公钥/密钥对
+ 的方式来完成登录。当使用 Kerberos 这样的工具时,通常必须加强运行
+ Kerberos 的服务器,以及桌面工作站的安全性。当使用 公钥/密钥对以
+ ssh 登录时,通常必须加固用户 <emphasis>开始</emphasis>
+ 登录的那台机器的安全 (通常这是他们的工作站)。
+ 在这之上还可以增加一层安全性,即在使用 &man.ssh-keygen.1;
+ 生成它的时候,使用口令来保护它们。 如果能够用
+ <quote>星号</quote> 替换掉所有员工的口令,
+ 那么,这也就保证了他们只能通过您设置的安全的方法来登录。
+ 这将迫使所有的员工使用安全的、经过加密的连接来完成他们的会话,
+ 而这将使得入侵者通过监听网络通讯, 从某些不相关的、
+ 不太安全的机器上窃取口令成为不可能。</para>
+
+ <para>另一钟间接的安全机制则是,
+ 从严格受限的机器向限制更宽松的机器上登录。 例如,
+ 如果您的服务器运行了所有的服务,那么,工作站应该什么都不运行。
+ 为了让工作站尽可能地安全,应该避免运行任何没有必要的服务,
+ 甚至不运行任何服务。 另外, 也应该考虑使用带口令保护功能的屏幕保护程序。
+ 毋庸置疑, 如果攻击者能够物理地接触您的工作站,
+ 那么他就有能力破坏任何安全设施,这确实是我们需要考虑的一个问题,但同样地,
+ 真正能够物理接触您的工作站或服务器并实施攻击的人在现实生活中并不常见,
+ 绝大多数攻击来自于网络, 而攻击者往往无法物理地接触服务器或工作站。</para>
+ <indexterm><primary>KerberosIV</primary></indexterm>
+
+ <para>使用类似 Kerberos 这样的工具,也为我们提供了使用一个工具来禁用某个用户,
+ 或修改他们口令并在所有机器上立即生效的方法。如果员工的帐号被窃取,
+ 能够在所有的其他机器上生效的口令变更将很有意义。如果口令分散地保存在多个机器上,
+ 一次修改 N 台机器上的口令很可能是一件痛苦的事情。
+ 此外, Kerberos 还能够提供更多的限制,除了 Kerberos 令牌有很好的过期机制之外,
+ 它还能够强制用户在某个特定的期限内修改口令(比如说,每月一次). </para>
+ </sect2>
+
+ <sect2>
+ <title>确保以root用户权限运行的服务器和suid/sgid可执行程序的安全</title>
+
+ <indexterm>
+ <primary><command>ntalk</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary><command>comsat</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary><command>finger</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary>sandboxes</primary>
+ </indexterm>
+ <indexterm>
+ <primary><application>sshd</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary><application>telnetd</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary><application>rshd</application></primary>
+ </indexterm>
+ <indexterm>
+ <primary><application>rlogind</application></primary>
+ </indexterm>
+
+ <para>谨慎的管理员只运行它们需要的服务,不多,不少。
+ 要当心第三方的服务程序很可能有更多的问题。例如,运行旧版的
+ <application>imapd</application> 或者
+ <application>popper</application> 无异于将
+ <username>root</username> 令牌拱手送给全世界的攻击者。
+ 永远不要运行那些您没有仔细检查过的服务程序,许多服务程序并不需要以
+ <username>root</username> 身份运行。例如,<application>ntalk</application>,
+ <application>comsat</application>,以及
+ <application>finger</application> 服务程序都能够以一种称作
+ <firstterm>沙盒</firstterm> 的特殊用户身份运行。除非您解决了大量的麻烦,
+ 否则沙盒远不是一个完美的策略,但洋葱规则仍然成立,
+ 如果某个人设法攻破了在沙盒中运行的程序,那么他们还必须冲出沙盒才能够做的更多。
+ 攻击者需要冲破的层次越多,他成功的机会就越小。root漏洞曾经在几乎所有的以
+ <username>root</username> 身份运行的程序中存在,包括基本的系统服务。
+ 另外,如果您只通过
+ <application>sshd</application> 登录,而不打算使用
+ <application>telnetd</application> 或
+ <application>rshd</application> 或
+ <application>rlogind</application>,那么,毫不犹豫地关闭这些服务!</para>
+
+ <para>FreeBSD 现在默认在沙盒中运行
+ <application>ntalkd</application>,
+ <application>comsat</application>, 以及
+ <application>finger</application>。此外, &man.named.8; 也可以这样运行。
+ <filename>/etc/defaults/rc.conf</filename> 中包括了如何如此运行
+ <application>named</application> 的方法,只是这些内容被注释掉了。
+ 如何升级或安装系统将决定这些沙盒所使用的特殊用户是否被自动安装。
+ 谨慎的系统管理员将根据需要研究并实现沙盒。</para>
+ <indexterm>
+ <primary><application>sendmail</application></primary>
+ </indexterm>
+
+ <para>此外,还有一些服务通常并不在沙盒中运行:
+ <application>sendmail</application>,
+ <application>popper</application>,
+ <application>imapd</application>, <application>ftpd</application>,
+ 以及一些其他的服务。当然,它们有一些替代品,但安装那些服务可能需要做更多额外的工作。
+ 可能必须以 <username>root</username> 身份运行这些程序,
+ 并通过其他机制来检测入侵。</para>
+
+ <para>系统中另一个比较大的 <username>root</username> 漏洞
+ 是安装在其中的 suid-root 和 sgid 的可执行文件。绝大多数这类程序,
+ 例如 <application>rlogin</application>, 被存放于
+ <filename>/bin</filename>, <filename>/sbin</filename>,
+ <filename>/usr/bin</filename>, 或 <filename>/usr/sbin</filename> 中。
+ 尽管并没有 100% 的安全保证,但系统默认的 suid 和 sgid 可执行文件通常是相对安全的。
+ 当然,偶尔也会发现一些存在于这些可执行文件中的
+ <username>root</username> 漏洞。1998年,<literal>Xlib</literal>
+ 中发现了一处 <username>root</username> 漏洞,这使得
+ <application>xterm</application> (通常是做了suid的) 变得可以入侵。
+ 安全通常比时候沮丧更好,因此,谨慎的管理员通常会限制 suid 可执行文件,
+ 并保证只有员工帐号能够执行它们,或只开放给特定的用户组,甚至彻底干掉
+ (<command>chmod 000</command>) 任何 suid 可执行文件,
+ 以至于没有人能够执行它们。没有显示设备的服务器通常不会需要
+ <application>xterm</application> 可执行文件。 sgid 可执行文件通常同样地危险。
+ 一旦入侵者攻克了sgid-kmem,那么他就能够读取
+ <filename>/dev/kmem</filename> 并进而读取经过加密的口令文件,
+ 从而窃取任何包含口令的帐号。另外,攻破了 <literal>kmem</literal>
+ 的入侵者能够监视通过 pty 传送的按键序列,即使用户使用的是安全的登录方式。
+ 攻破了 <groupname>tty</groupname> 组的用户则能够向几乎所有用户的
+ tty 写入数据。如果用户正在运行一个终端程序,或包含了键盘模拟功能的终端仿真程序,
+ 那么,入侵者能够以那个用户的身份执行任何命令。</para>
+ </sect2>
+
+ <sect2 id="secure-users">
+ <title>确保用户帐户的安全</title>
+
+ <para>用户帐号的安全通常是最难保证的。虽然您可以为您的员工设置严苛的登录限制,
+ 并用 <quote>星号</quote> 替换掉他们的口令,但您可能无法对普通的用户这么做。
+ 如果有足够的决策权,那么在保证用户帐号安全的斗争中或许会处于优势,
+ 但如果不是这样,您能做的只是警惕地监控这些帐号的异动。
+ 让用户使用 ssh 或 Kerberos 可能会有更多的问题,
+ 因为需要更多的管理和技术支持,尽管如此,与使用加密的口令文件相比,
+ 这仍不失为一个好办法。</para>
+ </sect2>
+
+ <sect2>
+ <title>确保口令文件的安全</title>
+
+ <para>尽可能使用 <literal>*</literal> 替换掉口令是保证口令文件安全唯一的解决方法,
+ 如果能够用 ssh 或 Kerberos 的话。即使只有
+ <username>root</username> 用户能够读取加密过的口令文件 (<filename>/etc/spwd.db</filename>)
+ 入侵者仍然可能设法读到它,即使他暂时还无法写入这个文件。</para>
+
+ <para>您的安全脚本应该经常检查并报告口令文件的异动 (参见后面的 <link
+ linkend="security-integrity">检查文件完整性</link> 一节)。</para>
+ </sect2>
+
+ <sect2>
+ <title>确保内核中内核设备、直接访问设备和文件系统的安全</title>
+
+ <para>如果攻击者已经拿到了 <username>root</username> 那么他就有能力作任何事情,
+ 当然, 有一些事情是他们比较喜欢干的。
+ 例如, 绝大多数现代的内核都包括一个内建的听包设备。
+ 在 FreeBSD 中,这个设备被称作
+ <devicename>bpf</devicename> 。攻击者通常会尝试在攻克的系统上运行它。
+ 如果您不需要 <devicename>bpf</devicename> 设备提供的功能,那么,就不要把它编入内核。</para>
+
+ <indexterm>
+ <primary><command>sysctl</command></primary>
+ </indexterm>
+ <para>但即使已经关掉了 <devicename>bpf</devicename>
+ 设备,您仍然需要担心
+ <filename>/dev/mem</filename> 和 <filename>/dev/kmem</filename> 。
+ 就事论事地说,攻击者仍然能够通过直接访问的方式写入磁盘设备。同样地,
+ 还有一个被称作模块加载器, &man.kldload.8; 的机制,也会包含潜在的危险。
+ 尝试入侵企业网络的入侵者会尝试在正在运行的内核上安装他自己的
+ <devicename>bpf</devicename> 设备,或其他听包设备。为了防止这些问题,
+ 需要抬高内核安全级,至少调整到1。可以通过对 <varname>kern.securelevel</varname>
+ 执行 <command>sysctl</command> 来完成这个任务。一旦把安全级调整到1,
+ 对于直接访问设备的写入操作将被拒绝,而特殊的 <command>chflags</command>
+ 标记,如 <literal>schg</literal> ,将被强制执行。一定要在重要的启动执行文件、
+ 目录和脚本文件上设置 <literal>schg</literal> 标记 &mdash;
+ 在安全级生效之前的所有文件。这可能做得有些过火,
+ 并将导致在较高安全级上运行时升级系统变得困难。 此外,
+ 运行于较高安全级上,而没有正确设置 <literal>schg</literal>
+ 标记的系统仍然是存在弱点的。另一种方法是把
+ <filename>/</filename> 和 <filename>/usr</filename> 以只读方式挂接。
+ 此外,请注意过于严苛的安全设置将使得入侵检测同样无法进行。</para>
+ </sect2>
+
+ <sect2 id="security-integrity">
+ <title>检查文件完整性: 可执行文件,配置文件和其他文件</title>
+
+ <para>当实施严格的限制时,往往会在使用的方便性上付出代价。例如,使用
+ <command>chflags</command> 来把 <literal>schg</literal> 标记
+ 应用到 <filename>/</filename> 和
+ <filename>/usr</filename> 中的绝大多数文件上可能会起到反作用,
+ 因为尽管它能够保护那些文件,但同样关掉了一个很好的监测机制。
+ 层次化安全的最后一层可能是最重要的 &mdash; 检测。
+ 安全的其他部分可能相对来讲意义并不那么大 (或者,更糟糕的事情是,
+ 那些措施会给您安全的假象), 加入您无法检测潜在的入侵事件。
+ 层次化安全最重要的功能是减缓入侵者,
+ 而不是彻底不让他们入侵,这能够让检测起到作用,并更好地捕捉入侵行为。</para>
+
+ <para>检测入侵的一种好办法是查找那些被修改、删除或添加的文件。
+ 检测文件修改的最佳方法是与某个 (通常是中央的) 受限访问的系统上的文件进行比对。
+ 在一台严格限制访问的系统上撰写您的安全脚本通常不能够被入侵者察觉,
+ 因此,这非常重要。为了最大限度地发挥这一策略的优势,通常会使用只读的 NFS,
+ 或者设置 ssh 钥匙对以便为其他机器提供访问。除了网络交互之外,
+ NFS可能是一种很难被察觉的方法 &mdash; 它允许您监控每一台客户机上的文件系统,
+ 而这种监控几乎是无法察觉的。如果一台严格受限的服务器和客户机是通过交换机连接的,
+ 那么 NFS 将是一种非常好的方式。 不过,如果那台监控服务器和客户机之间通过集线器
+ (Hub),或经过许多层的路由来连接,则这种方式就很不安全了,
+ 此时,应考虑使用 ssh ,即使这可以在审计记录中查到。</para>
+
+ <para>一旦为这个受限的机器赋予了至少读取它应监控的客户系统的权限,
+ 就应该为实际的监控撰写脚本。以 NFS 挂接为例,可以用类似 &man.find.1;
+ 和 &man.md5.1; 这样的命令为基础来完成我们所需的工作。
+ 最好能够每天对被控机的所有执行文件计算一遍 md5,同时,还应以更高的频率测试那些
+ <filename>/etc</filename> 和 <filename>/usr/local/etc</filename>
+ 中的控制文件。一旦发现了不匹配的情形,监控机应立即通知系统管理员。
+ 好的安全脚本也应该检查在系统分区,如 <filename>/</filename> 和
+ <filename>/usr</filename> 中是否有新增或删除的可执行文件,以及不适宜的 suid 。</para>
+
+ <para>如果打算使用 ssh 来代替 NFS,那么撰写安全脚本将变得困难许多。
+ 本质上,需要在脚本中使用 <command>scp</command> 在客户端复制文件,
+ 另一方面,用于检查的执行文件 (例如 find) 也需要使用
+ <command>scp</command> 传到客户端,因为
+ <application>ssh</application> 客户程序很可能已经被攻陷。
+ 总之,在一条不够安全的链路上 ssh 可能是必须的,
+ 但也必须应付它所带来的难题。</para>
+
+ <para>安全脚本还应该检查用户以及职员成员的权限设置文件:
+ <filename>.rhosts</filename>、 <filename>.shosts</filename>、
+ <filename>.ssh/authorized_keys</filename> 等等。 &hellip;
+ 这些文件可能并非通过
+ <literal>MD5</literal> 来进行检查。</para>
+
+ <para>如果您的用户磁盘空间很大, 检查这种分区上面的文件可能非常耗时。
+ 这种情况下, 采用标志来禁止使用 suid 可执行文件和设备在这些文件系统上出现将是一个好主意。
+ 您可能会想看看 <literal>nodev</literal> 和
+ <literal>nosuid</literal> 这两个选项 (参见 &man.mount.8;)。
+ 尽管如此, 这些扫描仍然应该至少每周进行一次, 这样做的意义并不是检测有效的攻击,
+ 而是检查攻击企图。</para>
+
+ <para>进程记帐 (参见 &man.accton.8;) 是一种相对成本较低的,
+ 可以帮助您在被入侵后评估损失的机制。
+ 对于找出入侵者是如何进入系统的这件事情来说,
+ 它会非常的有所助益,特别是当入侵者什么文件都没有修改的情况下。</para>
+
+ <para>最后, 安全脚本应该处理日志文件, 而日志文件本身应该通过尽可能安全的方法生成
+ &mdash; 远程 syslog 可能非常有用。 入侵者会试图掩盖他们的踪迹,
+ 而日志文件对于希望了解入侵发生时间的系统管理员来说则显得尤为重要。
+ 保持日志文件的永久性记录的一种方法是在串口上运行系统控制台,
+ 并持续不断地在一台安全的机器上收集这些信息。</para>
+ </sect2>
+
+ <sect2>
+ <title>偏执</title>
+
+ <para>带点偏执不会带来伤害。作为一种惯例,
+ 系统管理员在不影响使用的便利的前提下可以启用任何安全特性,此外,
+ 在经过深思熟虑之后,也可以增加一些
+ <emphasis>确实会</emphasis> 让使用变得不那么方便的安全特性。
+ 更重要的是,有安全意识的管理员应该学会混合不同的安全策略 &mdash;
+ 如果您逐字逐句地按照这份文档来配置您的机器,
+ 那无异于向那些同样能得到这份文档的攻击者透露了更多的信息。</para>
+ </sect2>
+
+ <sect2>
+ <title>拒绝服务攻击</title>
+ <indexterm><primary>拒绝服务 (DoS)</primary></indexterm>
+
+ <para>这一节将介绍拒绝服务攻击。 DoS 攻击通常是基于数据包的攻击,
+ 尽管几乎没有任何办法来阻止大量的伪造数据包耗尽网络资源,
+ 但通常可以通过一些手段来限制这类攻击的损害,使它们无法击垮服务器。</para>
+
+ <orderedlist>
+ <listitem>
+ <para>限制服务进程 fork.</para>
+ </listitem>
+
+ <listitem>
+ <para>限制 springboard 攻击 (ICMP 响应攻击, ping
+ 广播,等等)。</para>
+ </listitem>
+
+ <listitem>
+ <para>内核路由缓存</para>
+ </listitem>
+ </orderedlist>
+
+ <para>对于通过复制进程 (fork) 来进行服务的服务器的一种很常见的攻击是想办法耗尽其进程、
+ 文件描述符或者内存, 直到机器彻底死掉。
+ <application>inetd</application>
+ (参见 &man.inetd.8;) 提供了许多选项来限制这类攻击。
+ 需要注意的是, 尽管能够阻止一台机器彻底垮掉,
+ 但通常无法防止服务本身被击垮。
+ 请仔细阅读 <application>inetd</application> 的联机手册,
+ 特别是它的 <option>-c</option>、 <option>-C</option> 以及
+ <option>-R</option> 这三个选项。 伪造 IP 攻击能够绕过
+ <application>inetd</application> 的 <option>-C</option> 选项,
+ 因此, 这些选项需要配合使用。 某些独立的服务器也有类似的限制参数。</para>
+
+ <para>例如, <application>Sendmail</application> 就提供了自己的
+ <option>-OMaxDaemonChildren</option> 选项, 它通常比 sendmail 的负载限制选项更为有效,
+ 因为服务器负载的计算有滞后性。 您可以在启动 <application>sendmail</application> 时指定一个
+ <literal>MaxDaemonChildren</literal> 参数, 把它设的足够高以便承载您所需要的负荷,
+ 当然, 不要高到足以让运行 <application>sendmails</application> 的机器死掉。
+ 此外, 以队列模式
+ (<option>-ODeliveryMode=queued</option>) 并把服务程序
+ (<command>sendmail -bd</command>) 和队列执行程序分别执行
+ (<command>sendmail -q15m</command>) 也是一个好主意。
+ 如果您希望保证队列的实时性, 可以考虑使用更短的间隔, 例如
+ <option>-q1m</option>, 但同时也需要指定一个合理的子进程数, 也就是通过
+ <literal>MaxDaemonChildren</literal> 选项以免
+ <emphasis>那个</emphasis> sendmail 造成重叠的故障。</para>
+
+ <para><application>Syslogd</application> 可以被直接地攻击,因此,
+ 强烈建议只要可行,就在启动它的时候加上 <option>-s</option> 参数,
+ 其他情况下,则至少应该加上 <option>-a</option>。</para>
+
+ <para>对于基于连接的服务,例如
+ <application>tcpwrapper</application> 的 reverse-identd, 都应该格外的小心,
+ 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 <application>tcpwrappers</application>
+ 所提供的 reverse-ident 这样的功能。</para>
+
+ <para>此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要,
+ 这些工作可以通过设置边界路由器来完成。
+ 主要的想法, 是阻止来自您的 LAN 以外的访问, 这有助于避免
+ <username>root</username> 受到攻击。
+ 尽可能配置排他式的防火墙, 例如,
+ <quote>用防火墙阻止所有的网络流量 <emphasis>除了</emphasis> 端口 A、B、
+ C、D,以及 M-Z</quote>。 通过采用这种方法, 您可以很容易地将低端口的访问阻止在外,
+ 而又不难配置使防火墙放过那些明确需要开放的服务, 例如
+ <application>named</application> (如果您的机器准备作为域的主要解析服务器),
+ <application>ntalkd</application>,
+ <application>sendmail</application>,以及其他可以从 Internet 访问的服务。
+ 如果您尝试以其他方式配置防火墙
+ &mdash; 采用比较宽松的策略, 那么您将很有可能忘记
+ <quote>关掉</quote> 一两个服务,
+ 或者在增加了一些服务之后忘记更新防火墙策略。
+ 尽管如此, 仍然可以考虑允许段口号较高的那一部分端口进入数据,
+ 这将保证那些需要这样特性的服务能够正常工作,
+ 而又不影响低端口服务的安全性。
+ 此外, 还应注意到 FreeBSD 允许您来控制动态绑定的端口的范围,
+ 即一系列 <varname>net.inet.ip.portrange</varname> 变量,通过
+ <command>sysctl</command> 来完成设置。 (<command>sysctl -a | fgrep
+ portrange</command>)。 这使得您完成较复杂的防火墙策略变得易如反掌。
+ 例如, 您可能希望普通的高段端口的起止范围是
+ 4000 到 5000, 而更高范围则是 49152 到
+ 65535, 随后在防火墙中阻止低于 4000 的所有端口
+ (当然, 除了那些特地为 Internet 访问而开设的端口)。</para>
+
+ <indexterm><primary>ICMP_BANDLIM</primary></indexterm>
+
+ <para>另一种常被称作 springboard 的攻击也是非常常见的 DoS 攻击
+ &mdash; 它通过使服务器产生其无法处理的响应来达到目的。
+ 最常见的攻击就是 <emphasis>ICMP ping 广播攻击</emphasis>。
+ 攻击者通过伪造 ping 包, 将其源 IP 设置为希望攻击的机器的 IP。
+ 如果您的边界路由器没有进行禁止 ping 广播地址的设置, 则您的网络将最终陷于响应伪造的
+ ping 之中, 特别是当攻击者同时使用了多个不同的网络时。
+ 广播攻击能够产生超过 120 兆位的瞬时流量。
+ 另一种常见的针对 ICMP 错误报告系统的 springboard 攻击,
+ 通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源,
+ 并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽 mbuf
+ 来使得使得被攻击的服务器崩溃,特别是当这些服务器无法足够快地完成
+ ICPM 响应的时候。 可以通过为 FreeBSD 内核配置称为
+ <option>ICMP_BANDLIM</option> 的编译时选项来使这类攻击变得不那么有效。
+ 最后一类主要的 springboard 是针对某些
+ <application>inetd</application> 的内部服务, 例如
+ udp echo 服务进行的。 攻击者简单地伪造一个来自服务器 A 的
+ echo 口的 UDP 包, 然后将这个包发到 B 的 echo 口。
+ 于是, 两台服务器将不停地将包弹给对方。
+ 攻击者能够将两台服务器的这种服务都耗竭,
+ 并且通过这种方式, 之需要很少的包就可以让 LAN 超载。
+ 类似的问题对
+ <application>chargen</application> 口也是存在的。
+ 好的系统管理员应该关闭这些 inetd 的测试服务。</para>
+
+ <para>伪造的包攻击也可以用来使内核的路由缓存过载。
+ 请参考 <varname>net.inet.ip.rtexpire</varname>,
+ <varname>rtminexpire</varname>, 以及 <varname>rtmaxcache</varname>
+ <command>sysctl</command> 参数。 伪造的包可以用随机的源 IP 攻击,
+ 使得内核在路由表中产生一个临时的缓存项, 它可以通过
+ <command>netstat -rna | fgrep W3</command> 看到。 这些路由通常需要
+ 1600 秒才会过期。 如果内核发现路由表变得太大, 它会动态地降低
+ <varname>rtexpire</varname> 但以
+ <varname>rtminexpire</varname> 为限。 这引发了两个问题:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>在访问量不大的服务器上, 内核对于突然袭击的反应不够快。</para>
+ </listitem>
+
+ <listitem>
+ <para><varname>rtminexpire</varname> 的值没有低到让内核在此类攻击时活下去的程度。</para>
+ </listitem>
+ </orderedlist>
+
+ <para>如果您的服务器通过 T3 或更快的线路接入 Internet,
+ 那么通过 &man.sysctl.8; 来手动地降低
+ <varname>rtexpire</varname> 和 <varname>rtminexpire</varname>
+ 就非常必要。 当然,绝不要把它们设置为零 (除非您想让机器崩溃)
+ 将这两个参数设置为 2 通常已经足以抵御这类攻击了。</para>
+ </sect2>
+
+ <sect2>
+ <title>Kerberos 和 SSH 的访问问题</title>
+ <indexterm><primary><command>ssh</command></primary></indexterm>
+ <indexterm><primary>KerberosIV</primary></indexterm>
+
+ <para>如果您打算使用, 那么 Kerberos 和 ssh 都有一些需要解决的问题。
+ Kerberos V 是一个很棒的验证协议, 但使用了它的
+ <application>telnet</application> 和
+ <application>rlogin</application> 应用程序有一些 bug,
+ 使得它们不适合处理二进制流。
+ 而且, 除非使用了 <option>-x</option> 选项, 否则默认情况下
+ Kerberos 并不加密会话。
+ <application>ssh</application>
+ 在默认时加密所有的会话内容。</para>
+
+ <para>除了默认转发加密密钥, ssh 在所有的其他方面都做得很好。
+ 这意味着如果您持有供您访问系统其他部分密钥的工作站作了很好的安全防护,
+ 而您连到了一台不安全的机器上, 则您的密钥可能被别人获得。
+ 尽管实际的密钥并没有被泄漏, 但由于 ssh 会在您登录的过程中启用一个转发端口,
+ 如果攻击者拿到那台不安全的机器上的
+ <username>root</username> 那么他将能够利用那个端口来使用您的密钥,
+ 从而访问您能够访问的那些机器。</para>
+
+ <para>我们建议您在使用 ssh 时配合
+ Kerberos 来完成工作人员的登录过程。
+ <application>ssh</application> 在编译时可以加入 Kerberos 支持。
+ 在减少了潜在地暴露 ssh 密钥的机会的同时, 它还能够通过 Kerberos 来保护口令。
+ ssh 密钥只有在做过安全防护的机器上执行自动操作时才应使用
+ (这是 Kerberos 不适合的情形)。 此外,我们还建议您要么在
+ ssh 配置中关闭密钥转发, 要么在 <filename>authorized_keys</filename> 中增加
+ <literal>from=IP/DOMAIN</literal> 选项, 来限制这些密钥能够登录的来源机器。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="crypt">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Bill</firstname>
+ <surname>Swingle</surname>
+ <contrib>部分重写、更新来自 </contrib>
+ </author>
+ </authorgroup>
+ <!-- 21 Mar 2000 -->
+ </sect1info>
+
+ <title>DES,MD5,以及Crypt</title>
+ <indexterm>
+ <primary>安全</primary>
+ <secondary>密码</secondary>
+ </indexterm>
+
+ <indexterm><primary>crypt</primary></indexterm>
+ <indexterm><primary>DES</primary></indexterm>
+ <indexterm><primary>MD5</primary></indexterm>
+
+ <para>&unix; 系统上的每个用户都有一个与其帐户关联的口令。很显然,
+ 密码只需要被这个用户和操作系统知道。为了保证口令的私密性,
+ 使用了一种容易加密,却很难解密的被称作 <quote>单向散列</quote>
+ 的方法来处理口令。换言之,我们刚刚说的那句话并不十分确切:
+ 操作系统本身并不 <emphasis>真的</emphasis> 知道您的口令。
+ 它只知道口令 <emphasis>经过加密的形式</emphasis>。
+ 获取口令对应
+ <quote>明文</quote> 的唯一办法是采用暴力在口令可能的区间内穷举。</para>
+
+ <para>不幸的是,当 &unix; 刚刚出现时,安全地加密口令的唯一方法基于DES,
+ 数据加密标准 ( the Data Encryption Standard )。
+ 于是这给那些非美国居民带来了问题,
+ 因为 DES 的源代码在当时不能被出口到美国以外的地方,
+ FreeBSD 必须找到符合美国法律,但又要与其他那些使用 DES
+ 的 &unix; 版本兼容的办法。</para>
+
+ <para>解决方案是把加密函数库分割为两个,
+ 于是美国的用户可以安装并使用 DES 函数库,
+ 而国际用户则使用另外一套库提供的一种可以出口的加密算法。
+ 这就是 FreeBSD 为什么使用 MD5 作为它的默认加密算法的原因。
+ MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。</para>
+
+ <sect2>
+ <title>识别您采用的加密算法</title>
+
+ <para>在 FreeBSD&nbsp;4.4 之前,<filename>libcrypt.a</filename> 曾经是
+ 一个指向相应加密算法的符号连接。FreeBSD&nbsp;4.4 开始,把
+ <filename>libcrypt.a</filename> 变成了一个可以配置的密码验证散列库。
+ 现在这个库支持 DES,MD5和Blowfish散列函数。默认情况下,FreeBSD
+ 使用 MD5 来加密口令。</para>
+
+ <para>可以很容易地识别 FreeBSD 使用哪种加密方法。
+ 检查 <filename>/etc/master.passwd</filename> 文件中的加密密码是一种方法。
+ 用 MD5 散列加密的密码通常要比用
+ DES 散列得到的长一些, 并且以
+ <literal>&dollar;1&dollar;</literal> 字符开始。 以
+ <literal>&dollar;2a&dollar;</literal> 开始的口令是通过
+ Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征,
+ 但他们要比 MD5 短, 并且以不包括 <literal>&dollar;</literal> 在内的
+ 64 个可显示字符来表示,
+ 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。</para>
+
+ <para>新口令锁使用的密码格式是由 <filename>/etc/login.conf</filename>
+ 中的 <literal>passwd_format</literal> 来控制的, 可供选择的算法包括
+ <literal>des</literal>, <literal>md5</literal> 和
+ <literal>blf</literal>。 请参考 &man.login.conf.5; 联机帮助以获得更进一步的详情。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="one-time-passwords">
+ <title>一次性口令</title>
+ <indexterm><primary>一次性口令</primary></indexterm>
+ <indexterm>
+ <primary>安全</primary>
+ <secondary>一次性口令</secondary>
+ </indexterm>
+
+ <para>S/Key 是基于单向 hash 功能的一次性密码管理方式。
+ 为了考虑兼容性而使用了 MD4 散列, 而其他系统则使用了
+ MD5 和 DES-MAC。 S/Key 从 1.1.5 版之后就一直是
+ FreeBSD 基本系统的一部分, 包含这一特性的操作系统也日益增多。
+ S/Key 是 Bell Communications Research, Inc. 的注册商标。</para>
+
+ <para>从 FreeBSD 的 5.0 版开始, S/Key 被功能相同的
+ OPIE (One-time Passwords In Everything) 取代了。
+ OPIE 默认使用 MD5 散列。</para>
+
+ <para>下面将介绍三种不同的口令。
+ 第一种是您常用的 &unix; 风格或 Kerberos 口令; 我们在后面的章节中将称其为
+ <quote>&unix; 口令</quote>。 第二种是使用 S/Key <command>key</command>
+ 程序或 OPIE &man.opiekey.1; 程序生成, 并为 <command>keyinit</command>
+ 或 &man.opiepasswd.1; 以及登录提示所接受的一次性口令,我们称其为
+ <quote>一次性口令</quote>。 最后一类口令是您输入给
+ <command>key</command>/<command>opiekey</command> 程序 (有些时候是
+ <command>keyinit</command>/<command>opiepasswd</command> 程序)
+ 用以产生一次性口令的秘密口令,我们称其为 <quote>秘密口令</quote>
+ 或简称为 <quote>秘密口令</quote>。</para>
+
+ <para>秘密口令和您的 &unix; 口令毫无关系, 尽管可以设置为相同的,
+ 但不推荐这么做。 S/Key 和 OPIE 秘密口令并不像旧式的
+ &unix; 口令那样只能限于8位以内<footnote><para>在 &os; 中标准的登录口令最长可达
+ 128 个字符那么长。</para></footnote>。
+ 您想要用多长的口令都可以。 有六、七个词的短句是很常见的选择。
+ 在绝大多数时候,
+ S/Key 或 OPIE 系统和 &unix; 口令系统完全相互独立地工作。</para>
+
+ <para>除了口令之外, 对于 S/Key 和 OPIE 还有两组至关重要的数据。
+ 其一被称作 <quote>种子</quote> 或 <quote>key</quote>, 它包括两个字符和五个数字。
+ 另一个被称作 <quote>迭代轮数</quote>, 这是一个 1 到 100 之间的数字。
+ S/Key 通过将种子加到秘密口令后面, 并执行迭代轮数那么多次的 MD4/MD5
+ 散列运算来得到结果, 并将结果表示为 6 个短的英文单词。
+ 这 6 个英文单词就是您的一次性口令。
+ 验证系统 (主要是 PAM) 会记录上次使用的一次性口令,
+ 如果用户提供的口令的散列值与上次一致, 则可以通过身份验证。
+ 由于使用了单向的散列函数, 因此即使截获了上次使用的口令,
+ 也没有办法恢复出下次将要使用的口令;
+ 每次成功登录都将导致迭代轮数递减, 这样用户和登录程序将保持同步。
+ 每当迭代轮数减少到 1 时, 都必须重新初始化 S/Key 和 OPIE。</para>
+
+ <para>接下来将讨论和每个系统有关的三个程序。
+ <command>key</command> 和
+ <command>opiekey</command> 程序能够接收带迭代计数, 种子和秘密口令,
+ 并生成一个一次性口令, 或一张包含所有有关口令的表格。
+ <command>keyinit</command> 和 <command>opiepasswd</command>
+ 程序分别用于初始化 S/Key 和 OPIE, 并修改口令、
+ 迭代次数、种子和一次性口令。 <command>keyinfo</command>
+ 和 <command>opieinfo</command> 程序可以用于检查相应的验证数据文件
+ (<filename>/etc/skeykeys</filename> 或
+ <filename>/etc/opiekeys</filename>) 并显示执行命令的用户当前的迭代轮数和种子。</para>
+
+ <para>我们将介绍四种不同的操作。
+ 在安全的连接上通过 <command>keyinit</command> 或
+ <command>opiepasswd</command> 来第一次设置一次性口令,
+ 或修改口令及种子。
+ 第二类操作是在不安全的连接上使用 <command>keyinit</command>
+ 或 <command>opiepasswd</command> 辅以在安全连接上执行的
+ <command>key</command> 或 <command>opiekey</command>
+ 来完成同样的工作。 第三类操作是在不安全的连接上使用
+ <command>key</command>/<command>opiekey</command> 来登录。
+ 最后一类操作是采用 <command>key</command>
+ 或 <command>opiekey</command> 来生成大批的密码,
+ 以便抄下来或打印出来,在没有安全连接的地方使用。</para>
+
+ <sect2>
+ <title>安全连接的初始化</title>
+
+ <para>第一次初始化 S/Key, 修改口令或种子需要在安全的连接
+ (例如, 在那台机器的控制台上或者通过 <application>ssh</application>)
+ 登录来完成。 以自己的身份登录并执行不带参数的
+ <command>keyinit</command> 命令:</para>
+
+ <screen>&prompt.user; <userinput>keyinit</userinput>
+Adding unfurl:
+Reminder - Only use this method if you are directly connected.
+If you are using telnet or rlogin exit with no password and use keyinit -s.
+Enter secret password:
+Again secret password:
+
+ID unfurl s/key is 99 to17757
+DEFY CLUB PRO NASH LACE SOFT</screen>
+
+ <para>对于 OPIE, 则使用 <command>opiepasswd</command>:</para>
+
+ <screen>&prompt.user; <userinput>opiepasswd -c</userinput>
+[grimreaper] ~ $ opiepasswd -f -c
+Adding unfurl:
+Only use this method from the console; NEVER from remote. If you are using
+telnet, xterm, or a dial-in, type ^C now or exit with no password.
+Then run opiepasswd without the -c parameter.
+Using MD5 to compute responses.
+Enter new secret pass phrase:
+Again new secret pass phrase:
+ID unfurl OTP key is 499 to4268
+MOS MALL GOAT ARM AVID COED
+</screen>
+
+ <para>在 <prompt>Enter new secret pass phrase:</prompt> 或
+ <prompt>Enter secret password:</prompt> 提示之后,
+ 应输入一个密码或口令字。 请留意, 这并不是您用于登录的口令,
+ 它用于生成一次性的登录密钥。
+ <quote>ID</quote> 这一行给出了所需的参数:
+ 您的登录名,
+ 迭代轮数, 以及种子。 登录系统时,
+ 它能够记住这些参数并呈现给您, 因此无需记忆它们。
+ 最后一行给出了与您的秘密口令对应的、用于登录的一个一次性口令;
+ 如果您立即重新登录, 则它将是您需要使用的那个口令。</para>
+ </sect2>
+
+ <sect2>
+ <title>不安全连接初始化</title>
+
+ <para>如果您需要通过一个不安全的连接来初始化,
+ 则应首先在安全连接上执行过一次 <command>key</command>
+ 或 <command>opiekey</command>; 这可以在
+ &macintosh; 的桌面附件, 或是在可信的机器的 shell 上面完成。
+ 此外还需要指定一个迭代轮数 (100 也许是一个较好的选择)
+ 也可以选择一个自己的种子, 或让计算机随机生成一个。
+ 在不安全的连接上 (当然是连到您希望初始化的机器上),使用 <command>keyinit
+ -s</command> 命令:</para>
+
+ <screen>&prompt.user; <userinput>keyinit -s</userinput>
+Updating unfurl:
+Old key: to17758
+Reminder you need the 6 English words from the key command.
+Enter sequence count from 1 to 9999: <userinput>100</userinput>
+Enter new key [default to17759]:
+s/key 100 to 17759
+s/key access password:
+s/key access password:<userinput>CURE MIKE BANE HIM RACY GORE</userinput>
+</screen>
+
+ <para>对于 OPIE, 则需要使用 <command>opiepasswd</command>:</para>
+
+ <screen>&prompt.user; <userinput>opiepasswd</userinput>
+
+Updating unfurl:
+You need the response from an OTP generator.
+Old secret pass phrase:
+ otp-md5 498 to4268 ext
+ Response: GAME GAG WELT OUT DOWN CHAT
+New secret pass phrase:
+ otp-md5 499 to4269
+ Response: LINE PAP MILK NELL BUOY TROY
+
+ID mark OTP key is 499 gr4269
+LINE PAP MILK NELL BUOY TROY
+</screen>
+
+ <para>为了接受默认的种子 (
+ <command>keyinit</command> 程序令人困惑地将其称作
+ <literal>key</literal>), 按下 <keycap>Return</keycap>。
+ 在输入访问口令之前, 到一个有安全连接或
+ S/Key 桌面附件的机器上, 并给它同样的参数:</para>
+
+ <screen>&prompt.user; <userinput>key 100 to17759</userinput>
+Reminder - Do not use this program while logged in via telnet or rlogin.
+Enter secret password: <userinput>&lt;secret password&gt;</userinput>
+CURE MIKE BANE HIM RACY GORE</screen>
+
+ <para>对于 OPIE:</para>
+
+ <screen>&prompt.user; <userinput>opiekey 498 to4268</userinput>
+Using the MD5 algorithm to compute response.
+Reminder: Don't use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase:
+GAME GAG WELT OUT DOWN CHAT
+</screen>
+
+ <para>现在回到不安全的连接, 并将生成的一次性口令粘贴到相应的应用程序中。</para>
+ </sect2>
+
+ <sect2>
+ <title>产生一个一次性密码</title>
+
+ <para>一旦初始化过 S/Key 或 OPIE, 当您登录时将看到类似这样的提示:</para>
+
+<screen>&prompt.user; <userinput>telnet example.com</userinput>
+Trying 10.0.0.1...
+Connected to example.com
+Escape character is '^]'.
+
+FreeBSD/i386 (example.com) (ttypa)
+
+login: <userinput>&lt;username&gt;</userinput>
+s/key 97 fw13894
+Password: </screen>
+
+ <para>对于 OPIE 则是:</para>
+
+<screen>&prompt.user; <userinput>telnet example.com</userinput>
+Trying 10.0.0.1...
+Connected to example.com
+Escape character is '^]'.
+
+FreeBSD/i386 (example.com) (ttypa)
+
+login: <userinput>&lt;username&gt;</userinput>
+otp-md5 498 gr4269 ext
+Password: </screen>
+
+ <para>另外, S/Key 和 OPIE 提示有一个很有用的特性
+ (这里没有表现出来): 如果您在口令提示的地方按下 <keycap>Return</keycap>
+ 则将开启提示返显, 您可以藉此看到自己所键入的内容。
+ 如果试图手工键入一个一次性密码, 这会非常有用。</para>
+
+ <indexterm><primary>MS-DOS</primary></indexterm>
+ <indexterm><primary>Windows</primary></indexterm>
+ <indexterm><primary>MacOS</primary></indexterm>
+
+ <para>此时您需要生成一个一次性密码来回答这一提示。
+ 这项工作必须在一个可信的系统上执行 <command>key</command> 或
+ <command>opiekey</command> 来完成。 (也可以找到 DOS、
+ &windows; 以及 &macos; 等操作系统上运行的版本)。
+ 这个程序需要将迭代轮数和种子提供给它。
+ 您可以从登录提示那里复制和粘贴它们。</para>
+
+ <para>在可信的系统上:</para>
+
+ <screen>&prompt.user; <userinput>key 97 fw13894</userinput>
+Reminder - Do not use this program while logged in via telnet or rlogin.
+Enter secret password:
+WELD LIP ACTS ENDS ME HAAG</screen>
+
+ <para>对于 OPIE:</para>
+
+ <screen>&prompt.user; <userinput>opiekey 498 to4268</userinput>
+Using the MD5 algorithm to compute response.
+Reminder: Don't use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase:
+GAME GAG WELT OUT DOWN CHAT</screen>
+
+ <para>现在使用刚刚生成的一次性口令登录:</para>
+
+ <screen>login: <userinput>&lt;username&gt;</userinput>
+s/key 97 fw13894
+Password: <userinput>&lt;return to enable echo&gt;</userinput>
+s/key 97 fw13894
+Password [echo on]: WELD LIP ACTS ENDS ME HAAG
+Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ... </screen>
+
+ </sect2>
+
+ <sect2>
+ <title>产生多个一次性口令</title>
+
+ <para>有时,会需要到不能访问可信的机器或安全连接的地方。
+ 这中情形下, 可以使用 <command>key</command> 和
+ <command>opiekey</command> 命令来一次生成许多一次性口令。 例如:</para>
+
+ <screen>&prompt.user; <userinput>key -n 5 30 zz99999</userinput>
+Reminder - Do not use this program while logged in via telnet or rlogin.
+Enter secret password: <userinput>&lt;secret password&gt;</userinput>
+26: SODA RUDE LEA LIND BUDD SILT
+27: JILT SPY DUTY GLOW COWL ROT
+28: THEM OW COLA RUNT BONG SCOT
+29: COT MASH BARR BRIM NAN FLAG
+30: CAN KNEE CAST NAME FOLK BILK</screen>
+
+ <para>对于 OPIE:</para>
+
+ <screen>&prompt.user; <userinput>opiekey -n 5 30 zz99999</userinput>
+Using the MD5 algorithm to compute response.
+Reminder: Don't use opiekey from telnet or dial-in sessions.
+Enter secret pass phrase: <userinput>&lt;secret password&gt;</userinput>
+26: JOAN BORE FOSS DES NAY QUIT
+27: LATE BIAS SLAY FOLK MUCH TRIG
+28: SALT TIN ANTI LOON NEAL USE
+29: RIO ODIN GO BYE FURY TIC
+30: GREW JIVE SAN GIRD BOIL PHI</screen>
+
+ <para><option>-n 5</option> 按顺序请求 5 个口令,
+ <option>30</option> 则指定了最后一个迭代轮数应该是多少。
+ 注意这些将按按与使用相反的顺序显示。
+ 如果您比较偏执, 可以手工写下这些结果;
+ 一般来说把它粘贴到 <command>lpr</command> 就可以了。
+ 注意,每一行都显示迭代轮数机器对应的一次性的密码;
+ 一些人建议用完一个就划掉一个。</para>
+ </sect2>
+
+ <sect2>
+ <title>限制使用 &unix; 口令</title>
+
+ <para>S/Key 可以对 &unix; 口令的使用实施基于主机名、
+ 用户名、 终端端口或登录会话的 IP 地址的各种限制。
+ 这些限制可以在配置文件 <filename>/etc/skey.access</filename> 中找到。
+ &man.skey.access.5; 联机帮助提供了关于文件格式的详细资料,
+ 并给出了更详细的使用这一配置文件时在安全方面需要注意的事项。</para>
+
+ <para>如果没有 <filename>/etc/skey.access</filename> 这个文件
+ (在 FreeBSD 4.X 系统上这是默认的), 那么所有的用户都可以使用
+ &unix; 口令。 然而如果它存在,
+ 所有的用户将被要求使用 S/Key,
+ 除非明确地在
+ <filename>skey.access</filename> 中配置允许这样做。
+ 无论如何, &unix; 在控制台上总是可用的。</para>
+
+ <para>下面是一个示例的 <filename>skey.access</filename> 配置文件,
+ 它展示了最常用的三类配置语句:</para>
+
+ <programlisting>permit internet 192.168.0.0 255.255.0.0
+permit user fnord
+permit port ttyd0</programlisting>
+
+ <para>第一行 (<literal>permit internet</literal>) 允许来自这些 IP
+ 的用户 (这类 IP 很容易伪造)
+ 使用 &unix; 口令。 这不应被认为是一种安全的机制,
+ 因为使用不安全的网络的用户需要使用 S/Key 验证。</para>
+
+ <para>第二行 (<literal>permit user</literal>) 允许指定的用户,
+ 在本例中是 <username>fnord</username>, 在任何时候使用
+ &unix; 口令。 一般说来, 只应为无法使用
+ <command>key</command> 程序, 例如使用哑终端的那些人,
+ 或无法学会如何使用它的人来使用。</para>
+
+ <para>第三行 (<literal>permit port</literal>) 允许通过指定终端线的用户使用
+ &unix; 口令; 这可以被用于拨号用户。</para>
+
+ <para>OPIE 可以像 S/Key 一样对 &unix; 口令的使用进行基于 IP 的登录限制。
+ 对应的文件是 <filename>/etc/opieaccess</filename>, 在
+ FreeBSD 5.0 以及更新一些的系统中它是缺省存在的。
+ 请参阅 &man.opieaccess.5; 以了解关于这个文件进一步的情况,
+ 以及安全方面需要进行的一些考虑。</para>
+
+ <para>这是一个示范的 <filename>opieaccess</filename> 文件:</para>
+
+ <programlisting>permit 192.168.0.0 255.255.0.0</programlisting>
+
+ <para>这行允许指定 IP 地址的用户 (再次强调这种地址容易被伪造)
+ 在任何时有使用 &unix; 口令登录。</para>
+
+ <para>如果 <filename>opieaccess</filename> 中没有匹配的规则,
+ 则将默认拒绝任何非 OPIE 登录。</para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="tcpwrappers">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>作者:</contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <indexterm><primary>TCP Wrappers</primary></indexterm>
+
+ <title>TCP Wrappers</title>
+
+ <para>任何熟悉 &man.inetd.8; 都应该听说过
+ <acronym>TCP</acronym> Wrappers,
+ 但几乎没有人对它在网络环境中的作用有全面的理解。
+ 几乎每个人都会安装防火墙来处理网络连接,
+ 然而虽然防火墙有非常广泛的用途, 它却不是万能的,
+ 例如它无法处理类似向连接发起者发送一些文本这样的任务。
+ 而 <acronym>TCP</acronym> 软件能够完成它以及更多的其他事情。
+ 接下来的几段中将讨论许多
+ <acronym>TCP</acronym> Wrappers 提供的功能,
+ 并且, 还给出了一些配置实例。</para>
+
+ <para><acronym>TCP</acronym> Wrappers 软件扩展了
+ <command>inetd</command> 为受其控制的服务程序实施控制的能力。
+ 通过使用这种方法, 它能够提供日志支持、 返回消息给联入的连接、
+ 使得服务程序只接受内部连接, 等等。
+ 尽管防火墙也能够完成其中的某些功能,
+ 但这不仅增加了一层额外的保护,
+ 也提供了防火墙所不能提供的功能。</para>
+
+ <para>由 <acronym>TCP</acronym> Wrappers
+ 所增加的功能不应被看作好的防火墙的替代品;
+ 它应该与防火墙以及其他安全设施一道,
+ 作为系统的一层额外的安全防护来看待。</para>
+
+ <para>由于这些配置是对于
+ <command>inetd</command> 配置的扩展, 因此读者应首先阅读
+ <link linkend="network-inetd">配置 inetd</link>
+ 一节。</para>
+
+ <sect2>
+ <title>初始配置</title>
+
+ <para>在 &os; 中使用 <acronym>TCP</acronym>
+ Wrappers 的唯一要求是确保 <command>inetd</command>
+ 在从 <filename>rc.conf</filename> 中启动时包含了
+ <option>-Ww</option> 选项; 这是默认的设置。
+ 当然, 还需要对
+ <filename>/etc/hosts.allow</filename> 进行适当的配置, 但
+ &man.syslogd.8; 在配置不当时会在系统日志中记录相关消息。</para>
+
+ <note>
+ <para>与其它的 <acronym>TCP</acronym>
+ Wrappers 实现不同, 使用 <filename>hosts.deny</filename>
+ 在这里被认为是不推荐和过时的做法。
+ 所有的配置选项应放到
+ <filename>/etc/hosts.allow</filename> 中。</para>
+ </note>
+
+ <para>在最简单的配置中, 服务程序的连接策略是根据
+ <filename>/etc/hosts.allow</filename> 允许或阻止。
+ &os; 中的默认配置是允许一切发到由 <command>inetd</command>
+ 所启动的服务的连接请求。 在基本配置之后将讨论更复杂的情况。</para>
+
+ <para>基本配置的形式通常是
+ <literal>服务 : 主机选项 : 动作</literal>。
+ 这里 <literal>服务</literal> 是从
+ <command>inetd</command> 启动的服务程序的名字。 而
+ <literal>地址</literal> 可以使任何有效的主机名、 一个
+ <acronym>IP</acronym> 或由方括号 ([&nbsp;])
+ 括起来的 IPv6 地址。 动作字段可以使 allow 或 deny,
+ 分别用于允许和禁止相应的访问。
+ 在配置时您需要注意所有的配置都是按照第一个匹配的规则运转的,
+ 这表示配置文件将按照顺序查找匹配规则, 而一旦找到匹配,
+ 则搜索也就停止了。</para>
+
+ <para>另外也有许多其他选项, 这些将在后面介绍。
+ 简单的配置行从上面这些描述之中可以很容易得出。
+ 例如, 允许 <acronym>POP</acronym>3 连接通过
+ <filename role="package">mail/qpopper</filename> 服务,
+ 应把下面的行添加到
+ <filename>hosts.allow</filename>:</para>
+
+ <programlisting># This line is required for POP3 connections:
+qpopper : ALL : allow</programlisting>
+
+ <para>增加这样之后, 需要重新启动 <command>inetd</command>。
+ 可以通过使用 &man.kill.1; 命令来完成这项工作,
+ 或使用 <filename>/etc/rc.d/inetd</filename>
+ 的 <parameter>restart</parameter> parameter 参数。</para>
+ </sect2>
+
+ <sect2>
+ <title>高级配置</title>
+
+ <para><acronym>TCP</acronym> Wrappers 也有一些高级的配置选项;
+ 它们能够用来对如何处理连接实施更多的控制。
+ 一些时候, 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。
+ 其他情况下, 记录日志或者发送邮件给管理员可能更为适合。
+ 另外, 一些服务可能只希望为本机提供。
+ 这些需求都可以通过使用 <literal>通配符</literal>,
+ 扩展字符以及外部命令来实现。
+ 接下来的两节将介绍这些。</para>
+
+ <sect3>
+ <title>外部命令</title>
+
+ <para>假设由于发生了某种状况, 而导致连接应该被拒绝掉,
+ 而将其原因发送给发起连接的人。 如何完成这样的任务呢?
+ 这样的动作可以通过使用 <option>twist</option> 选项来实现。
+ 当发起了连接请求时, <option>twist</option>
+ 将调用一个命令或脚本。 在
+ <filename>hosts.allow</filename> 文件中已经给出了一个例子:</para>
+
+ <programlisting># The rest of the daemons are protected.
+ALL : ALL \
+ : severity auth.info \
+ : twist /bin/echo "You are not welcome to use %d from %h."</programlisting>
+
+ <para>这个例子将把消息
+ <quote>You are not allowed to use <literal>daemon</literal>
+ from <literal>hostname</literal>.</quote>
+ 返回给访问先前没有配置过允许访问的服务客户。
+ 对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说,
+ 这样的配置非常有用。
+ 请注意所有反馈信息
+ <emphasis>必须</emphasis> 被引号
+ <literal>"</literal> 包围; 这一规则是没有例外的。</para>
+
+ <warning>
+ <para>如果攻击者向服务程序发送大量的连接请求,
+ 则可能发动一次成功的拒绝服务攻击。</para>
+ </warning>
+
+ <para>另一种可能是针对这种情况使用 <option>spawn</option>。
+ 类似 <option>twist</option>,
+ <option>spawn</option> 也暗含拒绝连接,
+ 并可以用来执行外部命令或服务。
+ 与 <option>twist</option> 不同的是, <option>spawn</option>
+ 不会向连接发起者发送回应。
+ 考虑下面的配置:</para>
+
+ <programlisting># We do not allow connections from example.com:
+ALL : .example.com \
+ : spawn (/bin/echo %a from %h attempted to access %d &gt;&gt; \
+ /var/log/connections.log) \
+ : deny</programlisting>
+
+ <para>浙江拒绝来自
+ <hostid role="fqdn">*.example.com</hostid> 域的所有连接;
+ 同时还将记录主机名, <acronym>IP</acronym>
+ 地址, 以及对方所尝试连接的服务名字到
+ <filename>/var/log/connections.log</filename> 文件中。</para>
+
+ <para>除了前面已经介绍过的转义字符,
+ 例如 %a 之外, 还有一些其它的转义符。 参考
+ &man.hosts.access.5; 联机手册可以获得完整的列表。</para>
+ </sect3>
+
+ <sect3>
+ <title>通配符选项</title>
+
+ <para>前面的例子都使用了 <literal>ALL</literal>。
+ 其它选项能够将功能扩展到更远。
+ 例如, <literal>ALL</literal> 可以被用来匹配每一个服务、
+ 域,或 <acronym>IP</acronym> 地址。
+ 另一些可用的通配符包括
+ <literal>PARANOID</literal>, 它可以用来匹配任何来自可能被伪造的
+ <acronym>IP</acronym> 地址的主机。
+ 换言之, <literal>paranoid</literal> 可以被用来定义来自
+ <acronym>IP</acronym> 与其主机名不符的客户。
+ 下面的例子将给您更多的感性认识:</para>
+
+ <programlisting># Block possibly spoofed requests to sendmail:
+sendmail : PARANOID : deny</programlisting>
+
+ <para>在这个例子中, 所有连接
+ <command>sendmail</command> 的
+ <acronym>IP</acronym> 地址与其主机名不符的主机都将被拒绝。</para>
+
+ <caution>
+ <para>如果服务器和客户机有一方的
+ <acronym>DNS</acronym> 配置不正确,
+ 使用 <literal>PARANOID</literal> 可能会严重地削弱服务。
+ 在设置之前, 管理员应该谨慎地考虑。</para>
+ </caution>
+
+ <para>要了解关于通配符和他们的功能,
+ 请参考 &man.hosts.access.5; 联机手册。</para>
+
+ <para>为了使设置能够生效, 应该首先把
+ <filename>hosts.allow</filename> 的第一行配置注释掉。
+ 这节的开始部分已经说明了这一点。</para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="kerberosIV">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Mark</firstname>
+ <surname>Murray</surname>
+ <contrib>撰写者 </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Mark</firstname>
+ <surname>Dapoz</surname>
+ <contrib>初稿 </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title><application>KerberosIV</application></title>
+
+ <para>Kerberos 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。
+ 象远程登录,远程拷贝,系统间的相互文件拷贝和其他完成高风险任务的服务将被变得相当安全和可控制。</para>
+
+ <para>下面将具体介绍如何配置随 FreeBSD 发行的
+ Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。</para>
+
+ <sect2>
+ <title>安装 <application>KerberosIV</application></title>
+
+ <indexterm><primary>MIT</primary></indexterm>
+ <indexterm>
+ <primary>KerberosIV</primary>
+ <secondary>安装</secondary>
+ </indexterm>
+ <para>Kerberos 是 &os; 的一项可选组件。 安装该软件最简单的办法就是
+ 在使用 <application>sysinstall</application> 安装 FreeBSD 时选择
+ <literal>krb4</literal> 或
+ <literal>krb5</literal>。 这样将会安装
+ <quote>eBones</quote> (KerberosIV) 或 <quote>Heimdal</quote> (Kerberos5)
+ 的 Kerberos 实现。 采用实现的原因是它们在美国/加拿大 以外的地区开发,
+ 因此这些国家之外的人使用, 而不必受美国的加密代码出口管制的限制。</para>
+
+ <para>此外, 您可以从
+ <filename role="package">security/krb5</filename> 获取 Kerberos 的 MIT 实现。</para>
+ </sect2>
+
+ <sect2>
+ <title>创建最初的数据库</title>
+
+ <para>这项工作只需要在 Kerberos 服务器上完成。 首先确认没有旧的
+ Kerberos 数据库存在。 您应该进入到
+ <filename>/etc/kerberosIV</filename> 目录中并检查下述文件是否已经存在:</para>
+
+ <screen>&prompt.root; <userinput>cd /etc/kerberosIV</userinput>
+&prompt.root; <userinput>ls</userinput>
+README krb.conf krb.realms</screen>
+
+ <para>如果您发现了除此之外的其它文件 (例如 <filename>principal.*</filename>
+ 或 <filename>master_key</filename>) 已经存在, 请使用
+ <command>kdb_destroy</command> 命令来销毁旧的数据库,
+ 或者, 如果 Kerberos 没有在运行,简单地删除掉那些多余的文件。</para>
+
+ <para>现在必须编辑 <filename>krb.conf</filename> 和
+ <filename>krb.realms</filename> 文件来定义您的 Kerberos 领域。
+ 在本例中, 这个领域将是 <literal>EXAMPLE.COM</literal> 而其服务器是
+ <hostid role="fqdn">grunt.example.com</hostid>。 我们编辑或创建如下的
+ <filename>krb.conf</filename> 文件:</para>
+
+ <screen>&prompt.root; <userinput>cat krb.conf</userinput>
+EXAMPLE.COM
+EXAMPLE.COM grunt.example.com admin server
+CS.BERKELEY.EDU okeeffe.berkeley.edu
+ATHENA.MIT.EDU kerberos.mit.edu
+ATHENA.MIT.EDU kerberos-1.mit.edu
+ATHENA.MIT.EDU kerberos-2.mit.edu
+ATHENA.MIT.EDU kerberos-3.mit.edu
+LCS.MIT.EDU kerberos.lcs.mit.edu
+TELECOM.MIT.EDU bitsy.mit.edu
+ARC.NASA.GOV trident.arc.nasa.gov</screen>
+
+ <para>在这个例子中, 除此之外的其它领域并不时必须的。
+ 把他们在这里一并展示是为了演示如何让机器了解多个领域的存在。
+ 简单起见, 在实际的配置中可以省略它们。</para>
+
+ <para>第一行命名了这个系统工作的领域。
+ 其它行包含了领域/主机的记录。
+ 每行的第一项是一个领域, 其后是在这个领域中充当
+ <quote>密钥分发中心</quote> 的主机名。 其后的 <literal>admin
+ server</literal> 表示该主机同时还提供管理数据库服务。进一步的详细说明请参考
+ Kerberos 联机手册。</para>
+
+ <para>现在应该添加 <hostid role="fqdn">grunt.example.com</hostid>
+ 到 <literal>EXAMPLE.COM</literal> 领域, 同时追加一项以便将出现在
+ <literal>EXAMPLE.COM</literal> 领域中
+ <hostid role="domainname">.example.com</hostid> 域的所有主机也加入进来。
+ <filename>krb.realms</filename> 这个文件需要按照下面的方法修改:</para>
+
+ <screen>&prompt.root; <userinput>cat krb.realms</userinput>
+grunt.example.com EXAMPLE.COM
+.example.com EXAMPLE.COM
+.berkeley.edu CS.BERKELEY.EDU
+.MIT.EDU ATHENA.MIT.EDU
+.mit.edu ATHENA.MIT.EDU</screen>
+
+ <para>再次强调, 其它领域并不时必需的。 在这里只是要展示如何使用多个领域。
+ 可以删掉它们以简化配置。</para>
+
+ <para>第一行将 <emphasis>指定的</emphasis> 系统置于所指名字的领域内。
+ 这一行的其它部分则指明了特定子域内的主机应该默认属于哪个领域。</para>
+
+ <para>接下来我们就可以创建数据库了。 只有在
+ Kerberos 服务器上 (或密钥分发中心上) 才需要它。 可以通过
+ <command>kdb_init</command> 命令来完成这一步:</para>
+
+ <screen>&prompt.root; <userinput>kdb_init</userinput>
+<prompt>Realm name [default ATHENA.MIT.EDU ]:</prompt> <userinput>EXAMPLE.COM</userinput>
+You will be prompted for the database Master Password.
+It is important that you NOT FORGET this password.
+
+<prompt>Enter Kerberos master key:</prompt> </screen>
+
+ <para>现在我们应该保存密钥, 这样本机上运行的其他服务就能够了解这一变化。
+ 用 <command>kstash</command> 命令来完成这一步:</para>
+
+ <screen>&prompt.root; <userinput>kstash</userinput>
+
+<prompt>Enter Kerberos master key:</prompt>
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!</screen>
+
+ <para>这一操作将把主口令保存到
+ <filename>/etc/kerberosIV/master_key</filename>。</para>
+ </sect2>
+
+ <sect2>
+ <title>让一切运转起来</title>
+
+ <indexterm>
+ <primary>KerberosIV</primary>
+ <secondary>初始配置</secondary>
+ </indexterm>
+
+ <para>有两个主要的东西需要被添加到要用 Kerberos 来确保安全的
+ <emphasis>每一个</emphasis> 系统上。
+ 它们的名字是 <literal>kpasswd</literal> 和 <literal>rcmd</literal>。
+ 这些程序允许另外系统改变 Kerberos 的密码, 在不同的系统上可能有不同的名字。</para>
+
+ <para>服务程序 <application>kpasswd</application> 和
+ <application>rcmd</application> 使得其他系统能够修改 Kerberos
+ 口令, 以及执行类似 &man.rcp.1;,
+ &man.rlogin.1; 和 &man.rsh.1; 这样的命令。</para>
+
+ <para>我们添加下面这些记录:</para>
+
+ <screen>&prompt.root; <userinput>kdb_edit</userinput>
+Opening database...
+
+<prompt>Enter Kerberos master key:</prompt>
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Previous or default values are in [brackets] ,
+enter return to leave the same, or new value.
+
+<prompt>Principal name:</prompt> <userinput>passwd</userinput>
+<prompt>Instance:</prompt> <userinput>grunt</userinput>
+
+&lt;Not found&gt;, <prompt>Create [y] ?</prompt> <userinput>y</userinput>
+
+Principal: passwd, Instance: grunt, kdc_key_ver: 1
+<prompt>New Password:</prompt> &lt;---- enter RANDOM here
+Verifying password
+
+<prompt>New Password:</prompt> &lt;---- enter RANDOM here
+
+<prompt>Random password [y] ?</prompt> <userinput>y</userinput>
+
+Principal's new key version = 1
+<prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt>
+<prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt>
+<prompt>Attributes [ 0 ] ?</prompt>
+Edit O.K.
+<prompt>Principal name:</prompt> <userinput>rcmd</userinput>
+<prompt>Instance:</prompt> <userinput>grunt</userinput>
+
+&lt;Not found&gt;, <prompt>Create [y] ?</prompt>
+
+Principal: rcmd, Instance: grunt, kdc_key_ver: 1
+<prompt>New Password:</prompt> &lt;---- enter RANDOM here
+Verifying password
+
+<prompt>New Password:</prompt> &lt;---- enter RANDOM here
+
+<prompt>Random password [y] ?</prompt>
+
+Principal's new key version = 1
+<prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt>
+<prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt>
+<prompt>Attributes [ 0 ] ?</prompt>
+Edit O.K.
+<prompt>Principal name:</prompt> &lt;---- null entry here will cause an exit</screen>
+ </sect2>
+
+ <sect2>
+ <title>创建服务器文件</title>
+
+ <para>现在需要分析在每台机器上定义的服务的所有情况。
+ 为了做到这一点, 可以使用
+ <command>ext_srvtab</command> 命令。 这将创建一个文件,
+ 它需要被 <emphasis>通过安全的途径</emphasis> 复制或移动到每一个
+ Kerberos 客户端的
+ <filename>/etc/kerberosIV</filename> 目录中。
+ 在每一台服务器上都必须存在这个文件,
+ 它对 Kerberos 的运行至关重要。</para>
+
+
+ <screen>&prompt.root; <userinput>ext_srvtab grunt</userinput>
+<prompt>Enter Kerberos master key:</prompt>
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Generating 'grunt-new-srvtab'....</screen>
+
+ <para>现在,这个命令只产生一个临时文件,必须被重命名为 <filename>srvtab</filename>
+ 以便所有的服务可以识别它。 用 &man.mv.1; 命令把它挪到原系统的这个位置:</para>
+
+ <screen>&prompt.root; <userinput>mv grunt-new-srvtab srvtab</userinput></screen>
+
+ <para>如果文件是针对客户系统的, 而且网络可能会不安全,
+ 则应把
+ <filename><replaceable>client</replaceable>-new-srvtab</filename> 复制到可移动的介质上,
+ 并通过物理上安全的方式拿走。
+ 将其改名为 <filename>srvtab</filename> 并放到客户机的
+ <filename>/etc/kerberosIV</filename> 目录中, 并赋予
+ mode 600:</para>
+
+ <screen>&prompt.root; <userinput>mv grumble-new-srvtab srvtab</userinput>
+&prompt.root; <userinput>chmod 600 srvtab</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>复制数据库</title>
+
+ <para>现在添加一些用户记录到数据库。 首先为用户
+ <username>jane</username> 创建其对应的项。 使用
+ <command>kdb_edit</command> 命令来完成此项工作:</para>
+
+ <screen>&prompt.root; <userinput>kdb_edit</userinput>
+Opening database...
+
+<prompt>Enter Kerberos master key:</prompt>
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Previous or default values are in [brackets] ,
+enter return to leave the same, or new value.
+
+<prompt>Principal name:</prompt> <userinput>jane</userinput>
+<prompt>Instance:</prompt>
+
+&lt;Not found&gt;, <prompt>Create [y] ?</prompt> <userinput>y</userinput>
+
+Principal: jane, Instance: , kdc_key_ver: 1
+<prompt>New Password:</prompt> &lt;---- enter a secure password here
+Verifying password
+
+<prompt>New Password:</prompt> &lt;---- re-enter the password here
+Principal's new key version = 1
+<prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt>
+<prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt>
+<prompt>Attributes [ 0 ] ?</prompt>
+Edit O.K.
+<prompt>Principal name:</prompt> &lt;---- null entry here will cause an exit</screen>
+ </sect2>
+
+ <sect2>
+ <title>测试全部相关信息</title>
+
+ <para>首先必须启动 Kerberos 的服务程序。 这里需要指出,
+ 如果您正确地修改了 <filename>/etc/rc.conf</filename> 则系统在启动时会自动完成这个工作。
+ 只有在
+ Kerberos 服务器上才需要这么做。 Kerberos 客户程序将自动地从
+ <filename>/etc/kerberosIV</filename> 目录中的文件或去所需要的信息。</para>
+
+ <screen>&prompt.root; <userinput>kerberos &amp;</userinput>
+Kerberos server starting
+Sleep forever on error
+Log file is /var/log/kerberos.log
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+
+Current Kerberos master key version is 1
+Local realm: EXAMPLE.COM
+&prompt.root; <userinput>kadmind -n &amp;</userinput>
+KADM Server KADM0.0A initializing
+Please do not use 'kill -9' to kill this job, use a
+regular kill instead
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!</screen>
+
+ <para>接下来应使用 <command>kinit</command> 命令来获取与我们刚刚创建的
+ ID <username>jane</username> 对应的 ticket:</para>
+
+ <screen>&prompt.user; <userinput>kinit jane</userinput>
+MIT Project Athena (grunt.example.com)
+Kerberos Initialization for "jane"
+<prompt>Password:</prompt> </screen>
+
+ <para>尝试使用 <command>klist</command> 列出句柄以了解是否真的拥有它们:</para>
+
+ <screen>&prompt.user; <userinput>klist</userinput>
+Ticket file: /tmp/tkt245
+Principal: jane@EXAMPLE.COM
+
+ Issued Expires Principal
+Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM</screen>
+
+ <para>现在可以试试看用 &man.passwd.1; 来修改口令,
+ 以验证 <application>kpasswd</application> 服务程序是否能够从
+ Kerberos 数据库中获得需要的授权:</para>
+
+ <screen>&prompt.user; <userinput>passwd</userinput>
+realm EXAMPLE.COM
+<prompt>Old password for jane:</prompt>
+<prompt>New Password for jane:</prompt>
+Verifying password
+<prompt>New Password for jane:</prompt>
+Password changed.</screen>
+ </sect2>
+
+ <sect2>
+ <title>授予 <command>su</command> 特权</title>
+
+ <para>Kerberos 使我们能够给予 <emphasis>每一个</emphasis> 需要使用
+ <username>root</username> 特权的用户使用他们自己
+ <emphasis>s单独的</emphasis> &man.su.1; 口令。
+ 现在我们追加一个被授予 &man.su.1; 到 <username>root</username>
+ 权限的 ID。 这件事是由与 <username>root</username> 相关联的一个
+ principal 实例来控制的。使用 <command>kdb_edit</command>
+ 可以在 Kerberos 数据库中建立一个 <literal>jane.root</literal> 条目:</para>
+
+ <screen>&prompt.root; <userinput>kdb_edit</userinput>
+Opening database...
+
+<prompt>Enter Kerberos master key:</prompt>
+
+Current Kerberos master key version is 1.
+
+Master key entered. BEWARE!
+Previous or default values are in [brackets] ,
+enter return to leave the same, or new value.
+
+<prompt>Principal name:</prompt> <userinput>jane</userinput>
+<prompt>Instance:</prompt> <userinput>root</userinput>
+
+&lt;Not found&gt;, Create [y] ? y
+
+Principal: jane, Instance: root, kdc_key_ver: 1
+<prompt>New Password:</prompt> &lt;---- enter a SECURE password here
+Verifying password
+
+<prompt>New Password:</prompt> &lt;---- re-enter the password here
+
+Principal's new key version = 1
+<prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt>
+<prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt> <userinput>12</userinput> &lt;--- Keep this short!
+<prompt>Attributes [ 0 ] ?</prompt>
+Edit O.K.
+<prompt>Principal name:</prompt> &lt;---- null entry here will cause an exit</screen>
+
+ <para>现在试试看获得相应的句柄, 以确认它已经正常工作了:</para>
+
+ <screen>&prompt.root; <userinput>kinit jane.root</userinput>
+MIT Project Athena (grunt.example.com)
+Kerberos Initialization for "jane.root"
+<prompt>Password:</prompt></screen>
+
+ <para>接下来我们需要把用户添加到 <username>root</username>的
+ <filename>.klogin</filename> 文件里:</para>
+
+ <screen>&prompt.root; <userinput>cat /root/.klogin</userinput>
+jane.root@EXAMPLE.COM</screen>
+
+ <para>试试看 &man.su.1;:</para>
+
+ <screen>&prompt.user; <userinput>su</userinput>
+<prompt>Password:</prompt></screen>
+
+ <para>然后看看我们拥有哪些句柄:</para>
+
+ <screen>&prompt.root; <userinput>klist</userinput>
+Ticket file: /tmp/tkt_root_245
+Principal: jane.root@EXAMPLE.COM
+
+ Issued Expires Principal
+May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM</screen>
+ </sect2>
+
+ <sect2>
+ <title>使用其它命令</title>
+
+ <para>在前文给出的粒子中, 我们创建了一个称为
+ <literal>jane</literal> 的用户, 以及一个 <literal>root</literal> 实例。
+ 此处的用户名和它的 principal 相同, 这是
+ Kerberos 默认的; 一个形如 <literal>&lt;username&gt;.</literal><username>root</username>
+ 的
+ <literal>&lt;principal&gt;.&lt;instance&gt;</literal> 将允许
+ <literal>&lt;username&gt;</literal> 使用 &man.su.1; 成为
+ <username>root</username>, 只要所需的那些条目在 <username>root</username>
+ home 目录中的
+ <filename>.klogin</filename> 中存在的话:</para>
+
+ <screen>&prompt.root; <userinput>cat /root/.klogin</userinput>
+jane.root@EXAMPLE.COM</screen>
+
+ <para>类似地, 如果用户的 home 目录中有这样的设置:</para>
+
+ <screen>&prompt.user; <userinput>cat ~/.klogin</userinput>
+jane@EXAMPLE.COM
+jack@EXAMPLE.COM</screen>
+
+ <para>则表明在 <literal>EXAMPLE.COM</literal> 领域的经过身份验证的
+ <username>jane</username> 或者
+ <username>jack</username> (通过 <command>kinit</command>, 详情见前文)
+ 能够使用 <username>jane</username> 的身份或系统 (<hostid>grunt</hostid>)
+ 中的文件, 无论通过 &man.rlogin.1;, &man.rsh.1; 或是
+ &man.rcp.1;。</para>
+
+ <para>举例来说, <username>jane</username> 现在通过
+ Kerberos 登入了其它系统:</para>
+
+ <screen>&prompt.user; <userinput>kinit</userinput>
+MIT Project Athena (grunt.example.com)
+<prompt>Password:</prompt>
+&prompt.user; <userinput>rlogin grunt</userinput>
+Last login: Mon May 1 21:14:47 from grumble
+Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+
+FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen>
+
+ <para>Or <username>jack</username> logs into <username>jane</username>'s account on the same machine
+ (<username>jane</username> having
+ set up the <filename>.klogin</filename> file as above, and the person
+ in charge of Kerberos having set up principal
+ <emphasis>jack</emphasis> with a null instance):</para>
+
+ <screen>&prompt.user; <userinput>kinit</userinput>
+&prompt.user; <userinput>rlogin grunt -l jane</userinput>
+MIT Project Athena (grunt.example.com)
+<prompt>Password:</prompt>
+Last login: Mon May 1 21:16:55 from grumble
+Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen>
+ </sect2>
+ </sect1>
+
+ <sect1 id="kerberos5">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tillman</firstname>
+ <surname>Hodgson</surname>
+ <contrib>撰写者 </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Mark</firstname>
+ <surname>Murray</surname>
+ <contrib>原文来自 </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title><application>Kerberos5</application></title>
+
+ <para>在 &os;-5.1 之后的每一个 &os; 版本都只包含
+ <application>Kerberos5</application> 支持了, 因而,
+ <application>Kerberos5</application> 是它们所包含的唯一的
+ Kerberos 版本, 其配置在绝大多数方面和
+ <application>KerberosIV</application> 非常类似。
+ 下述信息只适用于 &os;-5.0 之后版本中的
+ <application>Kerberos5</application>。
+ 希望使用
+ <application>KerberosIV</application> 的用户可以安装
+ <filename role="package">security/krb4</filename> port。</para>
+
+ <para><application>Kerberos</application> 是一组附加的网络系统/协议,
+ 用以让用户通过一台安全服务器提供的服务来验证身份。
+ 包括远程登录、远程复制、在系统间安全地复制文件,
+ 以及其它高危险性的操作, 由于其存在而显著地提高了安全型并且更加可控。</para>
+
+ <para><application>Kerberos</application> 可以理解为一种身份验证代理系统。
+ 它也被描述为一种受信第三方玮主导的身份验证系统。
+ <application>Kerberos</application> 只提供一种功能
+ &mdash; 在网络上安全地完成用户的身份验证。
+ 它并不提供授权功能 (也就是说用户能够做什么操作)
+ 或审计功能 (记录用户作了什么操作)。
+ 一旦客户和服务器都使用了
+ <application>Kerberos</application> 来证明各自的身份之后,
+ 他们还可以加密全部的通讯以保证业务数据的私密性和完整性。</para>
+
+ <para>因此, 强烈建议将
+ <application>Kerberos</application> 同其它提供授权和审计服务的安全手段联用。</para>
+
+ <para>接下来的说明可以用来指导如何安装 &os; 所附带的
+ <application>Kerberos</application>。
+ 不过, 您仍然需要参考相应的联机手册以获得完整的描述。</para>
+
+ <para>为了展示 <application>Kerberos</application>
+ 的安装过程, 我们约定:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><acronym>DNS</acronym> 域 (<quote>zone</quote>)
+ 为 example.org。</para>
+ </listitem>
+
+ <listitem>
+ <para><application>Kerberos</application> 领域是
+ EXAMPLE.ORG。</para>
+ </listitem>
+ </itemizedlist>
+
+ <note>
+ <para>在安装
+ <application>Kerberos</application> 时请使用实际的域名即使您只是想在内部网上用一用。
+ 这可以避免 <acronym>DNS</acronym> 问题并保证了同其它
+= <application>Kerberos</application> 之间的互操作性。</para>
+ </note>
+
+ <sect2>
+ <title>历史</title>
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>历史</secondary>
+ </indexterm>
+
+ <para><application>Kerberos</application> 最早由
+ <acronym>MIT</acronym> 作为解决网络安全问题的一个方案提出。
+ <application>Kerberos</application> 协议采用了枪加密,
+ 因此客户能够在不安全的网络上向服务器
+ (以及相反地) 验证自己的身份。</para>
+
+ <para><application>Kerberos</application> 是网络验证协议名字,
+ 同时也是用以表达实现了它的程序的形容词。
+ (例如 <application>Kerberos</application> telnet)。
+ 目前最新的协议版本是 5,在
+ <acronym>RFC</acronym>&nbsp;1510 中有所描述。</para>
+
+ <para>该协议有许多免费的实现, 这些实现涵盖了许多种不同的操作系统。
+ 最初研制 <application>Kerberos</application> 的麻省理工学院
+ (<acronym>MIT</acronym>) 也仍然在继续开发他们的 <application>Kerberos</application>
+ 软件包。 在 <acronym>US</acronym> 它被作为一种加密产品使用,
+ 因而历史上曾经受到 <acronym>US</acronym> 出口管制。
+ <acronym>MIT</acronym> <application>Kerberos</application>
+ 可以通过 port (<filename role="package">security/krb5</filename>)
+ 来安装和使用。 Heimdal
+ <application>Kerberos</application> 是另一种第 5 版实现,
+ 并且明确地在
+ <acronym>US</acronym> 之外的地区开发, 以避免出口管制
+ (因此在许多非商业的类 &unix; 系统中非常常用。
+ Heimdal <application>Kerberos</application> 软件包可以通过
+ port
+ (<filename role="package">security/heimdal</filename>) 安装,
+ 最新的 &os; 的最小安装也会包含它。</para>
+
+ <para>为使尽可能多的受众受益, 这份说明以 &os; 附带的
+ Heimdal 软件包为准。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>配置 Heimdal <acronym>KDC</acronym></title>
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>密钥分发中心配置</secondary>
+ </indexterm>
+
+ <para>密钥分发中心 (<acronym>KDC</acronym>) 是
+ <application>Kerberos</application> 提供的集中式验证服务 &mdash; 它是签发
+ <application>Kerberos</application> tickets 的那台计算机。
+ <acronym>KDC</acronym> 在 <application>Kerberos</application>
+ 领域中的其它机器看来是 <quote>受信的</quote>,
+ 因此必须格外注意其安全性。</para>
+
+ <para>需要说明 <application>Kerberos</application> 服务器只需要非常少的计算资源,
+ 尽管如此, 基于安全理由仍然推荐使用独占的机器来扮演 <acronym>KDC</acronym>
+ 的角色。</para>
+
+ <para>要开始配置 <acronym>KDC</acronym>, 首先请确认您的
+ <filename>/etc/rc.conf</filename> 文件包含了作为一个
+ <acronym>KDC</acronym> 所需的设置 (您可能需要适当地调整路径以适应自己系统的情况):</para>
+
+ <programlisting>kerberos5_server_enable="YES"
+kadmind5_server_enable="YES"
+kerberos_stash="YES"</programlisting>
+
+ <note>
+ <para><option>kerberos_stash</option> 只在
+ &os; 4.X 上使用。</para>
+ </note>
+
+ <para>接下来需要修改 <application>Kerberos</application>
+ 的配置文件, <filename>/etc/krb5.conf</filename>:</para>
+
+ <programlisting>[libdefaults]
+ default_realm = EXAMPLE.ORG
+[realms]
+ EXAMPLE.ORG = {
+ kdc = kerberos.example.org
+ }
+[domain_realm]
+ .example.org = EXAMPLE.ORG</programlisting>
+
+ <para>请注意这个 <filename>/etc/krb5.conf</filename> 文件假定您的
+ <acronym>KDC</acronym> 有一个完整的主机名,
+ 即 <hostid role="fqdn">kerberos.example.org</hostid>。
+ 如果您的 <acronym>KDC</acronym> 主机名与它不同,
+ 则应添加一条 CNAME (别名) 项到 zone 中去。</para>
+
+ <note>
+ <para>对于有正确地配置过的
+ <acronym>BIND</acronym> <acronym>DNS</acronym> 服务器的大型网络,
+ 上述例子可以精简为:</para>
+
+ <programlisting>[libdefaults]
+ default_realm = EXAMPLE.ORG</programlisting>
+
+ <para>将下面的内容加入到
+ <hostid role="fqdn">example.org</hostid> zone 数据文件中:</para>
+
+ <programlisting>_kerberos._udp IN SRV 01 00 88 kerberos.example.org.
+_kerberos._tcp IN SRV 01 00 88 kerberos.example.org.
+_kpasswd._udp IN SRV 01 00 464 kerberos.example.org.
+_kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org.
+_kerberos IN TXT EXAMPLE.ORG.</programlisting></note>
+
+ <para>接下来需要创建 <application>Kerberos</application> 数据库。
+ 这个数据库包括了使用主密码加密的所有实体的密钥。
+ 您并不需要记住这个密码, 它会保存在一个文件
+ (<filename>/var/heimdal/m-key</filename>) 中。
+ 要创建主密钥,
+ 需要执行 <command>kstash</command> 并输入一个口令。</para>
+
+ <para>主密钥一旦建立, 您就可以用
+ <command>kadmin</command> 程序的
+ <literal>-l</literal> 参数 (表示 <quote>local</quote>) 来初始化数据库了。
+ 这个选项让 <command>kadmin</command> 直接地修改数据库文件而不是通过
+ <command>kadmind</command> 的网络服务。 这解决了在数据库创建之前连接它的鸡生蛋的问题。
+ 进入 <command>kadmin</command> 提示符之后, 用
+ <command>init</command> 命令来创建领域的初始数据库。</para>
+
+ <para>最后, 仍然在 <command>kadmin</command> 中, 使用
+ <command>add</command> 命令来创建第一个 principal。
+ 暂时使用全部的默认设置, 随后可以在任何时候使用
+ <command>modify</command> 命令来修改这些设置。
+ 另外, 也可以用 <literal>?</literal> 命令来了解可用的选项。</para>
+
+ <para>下面是一个典型的数据库创建过程:</para>
+
+ <screen>&prompt.root; <userinput>kstash</userinput>
+Master key: <userinput>xxxxxxxx</userinput>
+Verifying password - Master key: <userinput>xxxxxxxx</userinput>
+
+&prompt.root; <userinput>kadmin -l</userinput>
+kadmin> <userinput>init EXAMPLE.ORG</userinput>
+Realm max ticket life [unlimited]:
+kadmin> <userinput>add tillman</userinput>
+Max ticket life [unlimited]:
+Max renewable life [unlimited]:
+Attributes []:
+Password: <userinput>xxxxxxxx</userinput>
+Verifying password - Password: <userinput>xxxxxxxx</userinput></screen>
+
+ <para>现在是启动 <acronym>KDC</acronym> 服务的时候了。
+ 运行 <command>/etc/rc.d/kerberos start</command> 以及
+ <command>/etc/rc.d/kadmind start</command> 来启动这些服务。
+ 尽管此时还没有任何正在运行的 Kerberos 服务, 但您仍然可以通过获取并列出您刚刚创建的那个
+ principal (用户) 的 ticket 来验证
+ <acronym>KDC</acronym> 确实在正常工作, 使用
+ <acronym>KDC</acronym> 本身的功能:</para>
+
+ <screen>&prompt.user; <userinput>k5init <replaceable>tillman</replaceable></userinput>
+tillman@EXAMPLE.ORG's Password:
+
+&prompt.user; <userinput>k5list</userinput>
+Credentials cache: FILE:<filename>/tmp/krb5cc_500</filename>
+ Principal: tillman@EXAMPLE.ORG
+
+ Issued Expires Principal
+Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG</screen>
+
+ </sect2>
+
+ <sect2>
+ <title>为 <application>Kerberos</application> 启用
+ Heimdal 服务</title>
+
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>启用服务</secondary>
+ </indexterm>
+
+ <para>首先我们需要一份 <application>Kerberos</application> 配置文件
+ <filename>/etc/krb5.conf</filename> 的副本。 只需简单地用安全的方式
+ (使用类似 &man.scp.1; 的网络工具, 或通过软盘)
+ <acronym>KDC</acronym> 上的版本覆盖掉客户机上的对应文件就可以了。</para>
+
+ <para>接下来需要一个 <filename>/etc/krb5.keytab</filename> 文件。
+ 这是提供
+ <application>Kerberos</application> 服务的服务器和工作站的一个主要区别
+ &mdash; 服务器必须有
+ <filename>keytab</filename> 文件。 这个文件包括了服务器的主机密钥,
+ 这使得
+ <acronym>KDC</acronym> 得以验证它们的身份。
+ 此文件必须以安全的方式传到服务器上,
+ 因为如果密钥被公之于众, 则安全也就毁于一旦。
+ 也就是说, 通过明文的通道, 例如 <acronym>FTP</acronym> 是非常糟糕的想法。</para>
+
+ <para>一般来说, 您会希望使用 <command>kadmin</command> 程序来把
+ <filename>keytab</filename> 传到服务器上。
+ 由于也需要使用 <command>kadmin</command> 来为主机建立 principal
+ (<acronym>KDC</acronym> 一端的
+ <filename>krb5.keytab</filename>), 因此这并不复杂。</para>
+
+ <para>注意您必须已经获得了一个 ticket 而且这个 ticket 必须许可使用
+ <filename>kadmind.acl</filename> 中的 <command>kadmin</command>
+ 接口。 请参考 Heimdal info 中的 <quote>Remote administration(远程管理)</quote>
+ 一节 (<command>info heimdal</command>) 以了解如何设计访问控制表。
+ 如果不希望启用远程的
+ <command>kadmin</command> 操作, 则可以简单地采用安全的方式连接
+ <acronym>KDC</acronym> (通过本机控制台,
+ &man.ssh.1; 或 <application>Kerberos</application>
+ &man.telnet.1;) 并使用 <command>kadmin -l</command> 在本地执行管理操作。</para>
+
+ <para>安装了 <filename>/etc/krb5.conf</filename> 文件之后,
+ 您就可以使用 <application>Kerberos</application> 上的
+ <command>kadmin</command> 了。
+ <command>add --random-key</command> 命令可以用于添加主机 principal,
+ 而 <command>ext</command> 命令则允许导出服务器的主机 principal 到它的
+ keytab 中。 例如:</para>
+
+ <screen>&prompt.root; <userinput>kadmin</userinput>
+kadmin><userinput> add --random-key host/myserver.example.org</userinput>
+Max ticket life [unlimited]:
+Max renewable life [unlimited]:
+Attributes []:
+kadmin><userinput> ext host/myserver.example.org</userinput>
+kadmin><userinput> exit</userinput></screen>
+
+ <para>注意 <command>ext</command> 命令 (这是
+ <quote>extract</quote> 的简写) 默认时会把导出的密钥放到
+ <filename>/etc/krb5.keytab</filename> 中。</para>
+
+ <para>如果您由于没有在 <acronym>KDC</acronym> 上运行
+ <command>kadmind</command> (例如基于安全理由) 因而无法远程地使用
+ <command>kadmin</command> 您可以直接在 <acronym>KDC</acronym>
+ 上添加主机 principal
+ (<username>host/myserver.EXAMPLE.ORG</username>) 随后将其导出到一个临时文件中
+ (以免覆盖 <acronym>KDC</acronym> 上的 <filename>/etc/krb5.keytab</filename>),
+ 方法是使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>kadmin</userinput>
+kadmin><userinput> ext --keytab=/tmp/example.keytab host/myserver.example.org</userinput>
+kadmin><userinput> exit</userinput></screen>
+
+ <para>随后需要把 keytab 复制到服务器上
+ (例如使用 <command>scp</command> 或软盘)。
+ 一定要指定一个不同于默认的 keytab 名字以免覆盖
+ <acronym>KDC</acronym> 上的 keytab。</para>
+
+ <para>到现在您的服务器已经可以同
+ <acronym>KDC</acronym> 通讯了 (因为已经配置了 <filename>krb5.conf</filename>
+ 文件), 而且它还能够证明自己的身份 (由于配置了
+ <filename>krb5.keytab</filename> 文件)。 现在可以启用一些
+ <application>Kerberos</application> 服务。
+ 在这个例子中, 我们将在 <filename>/etc/inetd.conf</filename>
+ 中添加下面的行来启用 <command>telnet</command>
+ 服务, 随后用 <command>/etc/rc.d/inetd restart</command> 重启
+ &man.inetd.8; 服务来使设置生效:</para>
+
+ <programlisting>telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user</programlisting>
+
+ <para>关键的部分是 <command>-a</command>
+ (表示验证) 类型设置为用户 (user)。 请参考
+ &man.telnetd.8; 联机手册以了解细节。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>使用 Heimdal 来启用客户端 <application>Kerberos</application></title>
+
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>客户端配置</secondary>
+ </indexterm>
+
+ <para>设置客户机是非常简单的。 在正确配置了
+ <application>Kerberos</application> 的网络中,
+ 只需要将位于 <filename>/etc/krb5.conf</filename> 的配置文件进行一下设置就可以了。
+ 这一步骤可以简单地通过安全的方式将文件从
+ <acronym>KDC</acronym> 复制到客户机上来完成。</para>
+
+ <para>尝试在客户机上执行
+ <command>kinit</command>、 <command>klist</command>, 以及
+ <command>kdestroy</command> 来测试获取、 显示并删除
+ 刚刚为 principal 建立的 ticket 是否能够正常进行, 如果能,
+ 则用其它的 <application>Kerberos</application> 应用程序来连接启用了
+ <application>Kerberos</application> 的服务。 如果应用程序不能正常工作而获取
+ ticket 正常, 则通常是服务本身, 而非客户机或 <acronym>KDC</acronym>
+ 有问题。</para>
+
+ <para>在测试类似 <command>telnet</command> 的应用程序时,
+ 应考虑使用抓包程序 (例如 &man.tcpdump.1;)
+ 来确认您的口令没有以明文方式传输。
+ 尝试使用 <command>telnet</command> 的 <literal>-x</literal>
+ 参数, 它将加密整个数据流 (类似
+ <command>ssh</command>)。</para>
+
+ <para>核心的 <application>Kerberos</application> 客户端应用
+ (按照传统命名, 包括了 <command>kinit</command>、
+ <command>klist</command>、 <command>kdestroy</command>, 以及
+ <command>kpasswd</command>) 已经随
+ 基本的 &os; 安装到了系统上。 请注意 5.0 之前的 &os; 版本将它们改名为
+ <command>k5init</command>、
+ <command>k5list</command>、 <command>k5destroy</command>、
+ <command>k5passwd</command>, 以及 <command>k5stash</command>
+ (尽管这些命令通常只会用到一次)。</para>
+
+ <para>许多非核心的 <application>Kerberos</application> 客户应用程序也是默认安装的。
+ 在 Hemidal 的 <quote>最小</quote> 安装理念下,
+ <command>telnet</command> 是唯一一个采用了
+ <application>Kerberos</application> 的服务。</para>
+
+ <para>Heimdal port 则提供了一些默认不安装的客户应用程序, 例如启用了
+ <application>Kerberos</application> 版本的
+ <command>ftp</command>、 <command>rsh</command>、
+ <command>rcp</command>、 <command>rlogin</command> 以及一些更不常用的程序。
+ <acronym>MIT</acronym> port 也包括了一整套 <application>Kerberos</application>
+ 客户应用程序。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>用户配置文件: <filename>.k5login</filename> 和 <filename>.k5users</filename></title>
+
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>用户配置文件</secondary>
+ </indexterm>
+
+ <para>在某个领域中的用户往往都有自己的
+ <application>Kerberos</application> principal (例如
+ <username>tillman@EXAMPLE.ORG</username>) 并映射到本机用户帐户
+ (例如本机上名为 <username>tillman</username> 的帐户)。
+ 客户端应用程序, 如
+ <command>telnet</command> 通常并不需要用户名或 principal。</para>
+
+ <para>不过, 有时您可能会需要赋予某些没有匹配 <application>Kerberos</application> principal
+ 的人使用本地用户帐户的权限。 例如
+ <username>tillman@EXAMPLE.ORG</username> 可能需要访问本地的
+ <username>webdevelopers</username> 用户帐号。 其它
+ principal 可能也会需要访问这个本地帐号。</para>
+
+ <para>用户 home 目录中的 <filename>.k5login</filename> 和
+ <filename>.k5users</filename> 这两个文件可以配合
+ <filename>.hosts</filename> 和 <filename>.rhosts</filename>
+ 来有效地解决这个问题。 例如, 如果
+ <filename>.k5login</filename> 中有如下内容:</para>
+
+ <screen>tillman@example.org
+jdoe@example.org</screen>
+
+ <para>并放到了本地用户
+ <username>webdevelopers</username> 的 home 目录中, 则列出的两个 principals
+ 都可以使用那个帐号, 而无须共享口令。</para>
+
+ <para>建议您在开始实施之前首先阅读这些命令的联机帮助。
+ 特别地, <command>ksu</command> 的联机手册包括了
+ <filename>.k5users</filename> 的相关内容。</para>
+
+ </sect2>
+
+ <sect2>
+ <title><application>Kerberos</application> 提示、技巧和故障排除</title>
+
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>故障排除</secondary>
+ </indexterm>
+
+ <itemizedlist>
+ <listitem>
+ <para>当使用 Heimdal 或 <acronym>MIT</acronym>
+ <application>Kerberos</application> ports 时, 需要确认
+ <envar>PATH</envar> 环境变量把 <application>Kerberos</application>
+ 客户应用列在系统自带的版本之前。</para>
+ </listitem>
+
+ <listitem>
+ <para>同一领域内的所有计算机的时间设置是否同步?
+ 如果不是的话, 则身份验证可能会失败。
+ <xref linkend="network-ntp"> 描述了如何使用
+ <acronym>NTP</acronym> 来同步时钟。</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>MIT</acronym> 和 Heimdal 能够很好地互操作。
+ 一个例外是 <command>kadmin</command>, 因为这个协议没有被标准化。</para>
+ </listitem>
+
+ <listitem>
+ <para>如果您改变了主机名, 您还需要修改您的
+ <username>host/</username> principal 并更新 keytab。
+ 这一规律也适用于类似 Apache 的 <filename role="package">www/mod_auth_kerb</filename>
+ 所使用的 <username>www/</username> principal 这样的特殊
+ keytab 项。</para>
+ </listitem>
+
+ <listitem>
+ <para>您的领域中的每一台主机必须在 <acronym>DNS</acronym>
+ (或至少在 <filename>/etc/hosts</filename> 中) 可以解析
+ (同时包括正向和反向)。
+ CNAME 能够正常使用,
+ 但必须有正确的对应 A 和 PTR 记录。
+ 此时给出的错误信息可能很让人困惑:
+ <errorname>Kerberos5 refuses authentication because Read req
+ failed: Key table entry not found</errorname>。</para>
+ </listitem>
+
+ <listitem>
+ <para>某些作为客户使用您的 <acronym>KDC</acronym> 的操作系统可能没有将
+ <command>ksu</command> 设置为 setuid
+ <username>root</username> 的权限。 这意味着
+ <command>ksu</command> 将不能够正常工作,
+ 从安全角度说这是一个不错的主意,
+ 但可能令人烦恼。
+ 这类问题并不是
+ <acronym>KDC</acronym> 的错误。</para>
+ </listitem>
+
+ <listitem>
+ <para>使用 <acronym>MIT</acronym>
+ <application>Kerberos</application> 时, 如果希望允许一个
+ principal 拥有超过默认的十小时有效期的 ticket 则必须使用
+ <command>kadmin</command> 中的 <command>modify_principal</command>
+ 来修改 principal 本身以及 <username>krbtgt</username>
+ 的 maxlife(最大有效期)。
+ 此后, principal 可以使用 <command>kinit</command> 的
+ <literal>-l</literal> 参数来请求一个有更长有效期的 ticket。</para>
+ </listitem>
+
+ <listitem>
+ <note><para>如果在 <acronym>KDC</acronym> 上运行了听包程序,
+ 并在工作站上执行 <command>kinit</command>,
+ 您可能会注意到 <acronym>TGT</acronym> 是在
+ <command>kinit</command> 一开始执行的时候就发出了的 &mdash;
+ 甚至在您输入口令之前! 关于这个现象的解释是
+ <application>Kerberos</application> 服务器可以无限制地收发
+ <acronym>TGT</acronym> (Ticket Granting
+ Ticket) 给任何未经授权的请求; 但是, 每一个
+ <acronym>TGT</acronym> 都是使用用户的口令派生出来的密钥进行加密的。
+ 因此, 当用户输入口令时它并不会发送给 <acronym>KDC</acronym>,
+ 而是直接用于解密 <command>kinit</command> 所拿到的 <acronym>TGT</acronym>。
+ 如果解密过程得到了一个包含合法的时间戳的有效 ticket,
+ 则说明用户的 <application>Kerberos</application> 凭据有效。
+ 这些凭据包含了一个会话密钥用以在随后建立
+ <application>Kerberos</application> 服务器的加密通讯,
+ 传递由服务器自己的私钥加密的实际的 ticket-granting ticket。
+ 这个第二层加密对于用户来说是看不到的, 但它使得
+ <application>Kerberos</application> 服务器能够验证每一个
+ <acronym>TGT</acronym> 的真实性。</para></note>
+ </listitem>
+
+ <listitem>
+ <para>如果需要有效期更长的 ticket (例如一周)
+ 而且您使用 <application>OpenSSH</application>
+ 连接保存您的 ticket 的机器,
+ 请确认 <filename>sshd_config</filename> 中的
+ <application>Kerberos</application>
+ <option>TicketCleanup</option> 被设置为 <literal>no</literal>
+ 否则在注销时会自动删除所有的 ticket。</para>
+ </listitem>
+
+ <listitem>
+ <para>切记主机的 principals 的 ticket 有效期一定要比用户的长。
+ 如果您的用户 principal 的有效期是一周,
+ 而所连接的主机的有效期是九个小时,
+ 则缓存的主机 principal 将先行过期,
+ 结果是 ticket 缓存无法正常工作。</para>
+ </listitem>
+
+ <listitem>
+ <para>当配置 <filename>krb5.dict</filename> 文件来防止使用特定的简单口令
+ (<command>kadmind</command> 的联机手册中简要介绍了它),
+ 请切记只有指定了口令策略的 principals 才会使用它们。
+ <filename>krb5.dict</filename> 文件的格式很简单:
+ 每个串占一行。 创建一个到 <filename>/usr/share/dict/words</filename>
+ 的符号连接会很有用。</para>
+ </listitem>
+ </itemizedlist>
+
+ </sect2>
+
+ <sect2>
+ <title>与 <acronym>MIT</acronym> port 的区别</title>
+
+ <para><acronym>MIT</acronym> 和
+ Heimdal 主要的区别在于 <command>kadmin</command>
+ 程序使用不同 (尽管等价) 的命令和协议。 如果您的
+ <acronym>KDC</acronym> 是 <acronym>MIT</acronym> 的,
+ 则其影响是不能使用 Heimdal 的 <command>kadmin</command>
+ 程序来远程管理 <acronym>KDC</acronym>
+ (或相反)。</para>
+
+ <para>完成同样工作的命令可能会有些许的不同。 推荐按照
+ <acronym>MIT</acronym>
+ <application>Kerberos</application> 的网站
+ (<ulink url="http://web.mit.edu/Kerberos/www/"></ulink>)
+ 上的说明来操作。 请小心关于路径的问题,
+ <acronym>MIT</acronym> port 会默认安装到
+ <filename>/usr/local/</filename>, 您因此可能会执行
+ <quote>普通的</quote> 系统应用程序而非
+ <acronym>MIT</acronym>, 如果您的 <envar>PATH</envar> 环境变量把
+ 把系统目录放在前面的话。</para>
+
+ <note><para>如果使用 &os; 提供的 <acronym>MIT</acronym>
+ <filename role="package">security/krb5</filename> port,
+ 一定要仔细阅读 port 所安装的
+ <filename>/usr/local/share/doc/krb5/README.FreeBSD</filename>,
+ 如果您想知道为什么通过
+ <command>telnetd</command> 和 <command>klogind</command>
+ 登录时会出现一些诡异的现象的话。 最重要地,
+ <quote>incorrect permissions on cache file(缓存文件权限不正确)</quote>
+ 行为需要使用 <command>login.krb5</command> 来进行验证,
+ 才能够正确地修改转发凭据的属主。</para></note>
+
+ </sect2>
+
+ <sect2>
+ <title>缓解 <application>Kerberos</application> 的限制</title>
+
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>限制和不足</secondary>
+ </indexterm>
+
+ <sect3>
+ <title><application>Kerberos</application> 是一种 all-or-nothing 方式</title>
+
+ <para>在网络上启用的每个服务都必须进行修改以便让其能够配合
+ <application>Kerberos</application> 工作
+ (否则就只能使用其它方法来保护它们不受网络攻击的侵害),
+ 如果不是这样, 则用户的凭据就有可能被窃取并再次使用。
+ 一个例子是对所有的远程 shell (例如通过
+ <command>rsh</command> 和 <command>telnet</command>)
+ 启用了
+ <application>Kerberos</application>
+ 但没有将使用明文验证的 <acronym>POP3</acronym> 邮件服务器 Kerberos化。</para>
+
+ </sect3>
+
+ <sect3>
+ <title><application>Kerberos</application> 是为单用户工作站设计的</title>
+
+ <para>在多用户环境中
+ <application>Kerberos</application> 的安全性会被削弱。
+ 这是因为它把 ticket 保存到
+ <filename>/tmp</filename> 目录中, 而这个目录可以被任何用户读取。
+ 如果有用户与其它人同时共享一台计算机 (也就是 multi-user),
+ 则这个用户的 ticket 就可能被其它用户窃取 (复制)。</para>
+
+ <para>可以通过使用 <literal>-c</literal> 文件名 这样的命令行选项,
+ 或者(推荐的)改变 <envar>KRB5CCNAME</envar> 环境变量来避免这个问题,
+ 但很少有人这么做。原则上, 将 ticket 保存到用户的 home
+ 目录并简单地设置权限就能够缓解这个问题。</para>
+
+ </sect3>
+
+ <sect3>
+ <title>KDC 会成为单点崩溃故障点</title>
+
+ <para>根据设计, <acronym>KDC</acronym> 必须是安全的,
+ 因为主密码数据库保存在它上面。 决不应该在
+ <acronym>KDC</acronym>上面运行其它服务,
+ 而且还应确保它的物理安全。
+ 由于 <application>Kerberos</application>
+ 使用同一个密钥 (传说中的那个
+ <quote>主</quote> 密钥) 来加密所有的密码, 而将这个文件保存在
+ <acronym>KDC</acronym>, 因此其安全尤为重要</para>
+
+ <para>不过, 主密钥的泄露并没有想象中的那么可怕。
+ 主密钥只用来加密 <application>Kerberos</application>
+ 数据库以及产生随机数发生器的种子。
+ 只要 <acronym>KDC</acronym> 是安全的,
+ 即使攻击者拿到了主密钥也做不了什么。</para>
+
+ <para>另外, 如果 <acronym>KDC</acronym> 不可用
+ (例如由于拒绝服务攻击或网络故障)
+ 则网络服务将由于验证服务无法进行而不能使用,
+ 从而导致更大范围的拒绝服务攻击。
+ 通过部署多个 <acronym>KDC</acronym> (一个主服务器,
+ 配合一个或多个从服务器) 并采用经过仔细设计和实现的备用验证方式可以避免这种问题
+ (<acronym>PAM</acronym> 是一个不错的选择)。</para>
+
+ </sect3>
+
+ <sect3>
+ <title><application>Kerberos</application> 的不足</title>
+
+ <para><application>Kerberos</application> 允许用户、主机和服务之间进行相互认证。
+ 但它并没有提供机制来向用户、主机或服务验证 <acronym>KDC</acronym>。
+ 这意味着种过木马的程序,例如
+ <command>kinit</command> 有可能记录用户所有的用户名和密码。
+ 尽管如此, 可以用类似
+ <filename role="package">security/tripwire</filename>
+ 这样的文件系统完整性检查工具来避免此类情况的发生。</para>
+
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>相关资源和其它资料</title>
+
+ <indexterm>
+ <primary>Kerberos5</primary>
+ <secondary>外界的资源</secondary>
+ </indexterm>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink
+ url="http://www.faqs.org/faqs/Kerberos-faq/general/preamble.html">
+ The <application>Kerberos</application> FAQJ</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://web.mit.edu/Kerberos/www/dialogue.html">Designing
+ an Authentication System: a Dialog in Four Scenes</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.ietf.org/rfc/rfc1510.txt?number=1510">RFC 1510,
+ The <application>Kerberos</application> Network Authentication Service
+ (V5)</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://web.mit.edu/Kerberos/www/"><acronym>MIT</acronym>
+ <application>Kerberos</application> home page</ulink></para>
+ </listitem>
+
+ <listitem>
+ <para><ulink url="http://www.pdc.kth.se/heimdal/">Heimdal
+ <application>Kerberos</application> home page</ulink></para>
+ </listitem>
+
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="firewalls">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Gary</firstname>
+ <surname>Palmer</surname>
+ <contrib>作者 </contrib>
+ </author>
+ <author>
+ <firstname>Alex</firstname>
+ <surname>Nash</surname>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>防火墙</title>
+ <indexterm><primary>防火墙</primary></indexterm>
+ <indexterm>
+ <primary>安全</primary>
+ <secondary>防火墙</secondary>
+ </indexterm>
+
+ <para>对于接入 Internet 的人来说, 防火墙是一个越来越让人感兴趣的领域。
+ 人们甚至在设法寻找一些能够在私有网络中使用并提供更好安全型的应用程序。
+ 这节将介绍防火墙是什么, 如何使用它们, 以及如何利用 &os; 内核提供的机制来实现它。</para>
+
+ <note>
+ <para>人们经常认为在内部网络与
+ <quote>硕大无朋而臭名昭著的 Internet</quote> 之间建立一个防火墙能够解决所有的安全问题。
+ 这可能会有所帮助, 但糟糕的防火墙设置可能要比没有防火墙更加危险。
+ 防火墙可以为系统增加另一个安全层, 但不可能完全阻止一些入侵高手侵入系统。
+ 如果觉得防火墙能够完全阻止入侵而放松了安全设置,
+ 那可能会让黑客侵入系统变得更加容易。</para>
+ </note>
+
+ <sect2>
+ <title>防火墙是什么?</title>
+
+ <para>目前常见的 Internet 防火墙主要有两种类型。
+ 第一种类型正式的名字叫
+ <emphasis>包过滤路由器</emphasis>, 这类防火墙通过一台接入多个网段的机器,
+ 以及一组规则来决定转发或阻止数据包的传输。
+ 第二种类型被称为 <emphasis>代理服务器</emphasis>,
+ 依赖服务程序来完成包的转发,
+ 而内核的包转发则可能被禁用。</para>
+
+ <para>有时,一些站点同时使用两种类型的防火墙, 这样只有某个特定的机器
+ (称为 <emphasis>bastion host</emphasis>) 能够通过包过滤路由器将包发给内网。
+ 代理服务器在 bastion host 上运行, 这通常比一般的验证机制更安全。</para>
+
+ <para>FreeBSD 有一个内核数据包过滤程序 (也就是人们熟悉的
+ IPFW), 本节余下的部分将集中介绍它。
+ 可以在 FreeBSD 上通过安装第三方软件来建立代理服务器,
+ 但限于篇幅, 这里将不予介绍。</para>
+
+ <sect3 id="firewalls-packet-filters">
+ <title>包过滤路由器</title>
+
+ <para>路由器是负责在网络之间转发数据的机器。
+ 包过滤路由器通过将每一个包与一组规则表对比, 然后决定是否转发它来完成其功能。
+ 多数现代的 IP 路由软件都包括了包过滤功能, 并默认转发所有的包。
+ 为了启用过滤器, 需要您定义一组规则。</para>
+
+ <para>为了确定一个包是否应该通过, 防火墙需要便利其规则集中所有于包头匹配的规则。
+ 一旦发现一个匹配, 则会采取规则所指定的动作。
+ 规则动作可以是丢弃包, 转发包, 甚至给发包的人发送一个 ICMP 消息。
+ 只有第一个匹配是有效的, 因为规则是按顺序进行搜索的。
+ 因此, 规则表也可以称作 <quote>规则链</quote>。</para>
+
+ <para>包的匹配规则随所使用的软件的不同而不同,
+ 但基本上典型的包过滤防火墙都允许基于源 IP 地址、 目的 IP 地址、
+ 源端口号、 目的端口号 (对于那些支持端口号的协议), 甚至协议类型
+ (UDP, TCP, ICMP, etc) 的过滤。</para>
+ </sect3>
+
+ <sect3 id="firewalls-proxy-servers">
+ <title>代理服务器</title>
+
+ <para>代理服务器上的那些普通的系统服务
+ (<application>telnetd</application>、
+ <application>ftpd</application>等等) 换成了一些特别的服务。
+ 这些服务被称为 <emphasis>代理服务</emphasis>, 因为它们只允许进行一个方向的连接。
+ 这使得您可以在作为防火墙的机器上运行 (举例来说)
+ 一个代理的 <application>telnet</application> 服务,
+ 而人们可以从外面 <application>telnet</application> 到防火墙上,
+ 并通过适当的验证之后, 就能够访问内网
+ (另外, 代理服务器也可以用来让内网能够访问外网)。</para>
+
+ <para>一般而言代理服务器较之普通的服务器更为安全,
+ 而且能够使用更多的验证方式,
+ 包括 <quote>一次性</quote> 口令系统等等, 因此即使有人拿到了您的口令,
+ 他们也没有办法用这个口令做什么,因为口令在第一次用过之后马上就过期了。
+ 由于并没有授予用户使用代理本身的权限,
+ 因此在防火墙上做后门并进而进行更多的破坏会变得困难许多。</para>
+
+ <para>代理服务器通常有更多的限制访问的方法,
+ 例如可以设置只有从特定主机才能够访问到服务器。
+ 许多代理服务软件也允许管理员来指定哪些用户可以访问哪些机器。
+ 当然, 能够使用哪些机制很大程度上取决于采用了什么代理软件。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>IPFW 能用来做什么?</title>
+ <indexterm><primary><command>ipfw</command></primary></indexterm>
+
+ <para>FreeBSD 提供的 IPFW 软件,
+ 是一个内核级的包过滤和审计系统,
+ 它同时还提供了一个用户界面的控制工具, 即
+ &man.ipfw.8;。 这两部分配合使用,
+ 您可以轻松地定义和查询内核在进行路由决策时所采用的规则。</para>
+
+ <para>IPFW 有两个相关的部分。
+ 防火墙部分实施的是包过滤。
+ 另一部分是 IP 审计,
+ 它将记录路由器的使用, 并采用与防火墙部分类似的规则。
+ 这样, 管理员就能够监视从特定机器上使用了多少路由资源,
+ 举例来说, 它转发了多少了多少 WWW 的访问流量。</para>
+
+ <para>由于 IPFW 的这种设计, 您也可以把 IPFW 用在非路由的哪些机器上,
+ 以便对进入和送出的连接进行包过滤。
+ 这是 IPFW 更为普遍的用法中的一个特例,
+ 而此时您仍然可以使用相同的命令和技巧。</para>
+ </sect2>
+
+ <sect2>
+ <title>在 FreeBSD 上启用 IPFW</title>
+ <indexterm>
+ <primary><command>ipfw</command></primary>
+ <secondary>启用</secondary>
+ </indexterm>
+
+ <para>由于 IPFW 的主要部分是在内核中运行的,
+ 因此会需要在内核配置文件中添加一些选项, 这取决于您需要使用哪些机制,
+ 随后是重新编译内核。
+ 请参见 "Reconfiguring your Kernel" (<xref
+ linkend="kernelconfig">)
+ 一节来了解如何重新编译内核。</para>
+
+ <warning>
+ <para>IPFW 的默认策略是 <literal>deny ip from any to
+ any</literal>。 因此如果您没有在启动时增加其他策略来允许一些包进入,
+ 则如果使用了启用过防火墙的内核, 则<emphasis>您将把自己挡在服务器外面</emphasis>。
+ 我们建议您在第一次使用时在 <filename>/etc/rc.conf</filename>
+ 中设置 <literal>firewall_type=open</literal>,
+ 然后再到 <filename>/etc/rc.firewall</filename> 中慢慢微调它。
+ 保险起见, 您可能会考虑在本地控制台上, 而不是通过
+ <application>ssh</application> 来完成防火墙的配置。
+ 另一种方法是同时启用
+ <literal>IPFIREWALL</literal> 和
+ <literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal>
+ 两个选项,这时 IPFW 的默认规则将是 <literal>allow ip from any to
+ any</literal> 从而避免了将自己锁在外面的尴尬局面。</para>
+ </warning>
+
+ <para>目前一共有五个与 IPFW 有关的内核选项:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>options IPFIREWALL</literal></term>
+
+ <listitem>
+ <para>将包过滤部分的代码编译进内核。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>options IPFIREWALL_VERBOSE</literal></term>
+
+ <listitem>
+ <para>启用通过 &man.syslogd.8; 记录的日志。 如果没有指定这个选项,
+ 即使您在过滤规则中指定记录包, 也不会真的记录它们。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>options IPFIREWALL_VERBOSE_LIMIT=10</literal></term>
+
+ <listitem>
+ <para>限制通过 &man.syslogd.8; 记录的每项包规则的记录条数。
+ 在恶劣的环境中如果您想记录防火墙的活动,
+ 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击,
+ 那么这个选项将会很有用。</para>
+
+ <para>当规则链中的某一项达到这一限制数值时,
+ 它所对应的日志将不再记录。
+ 如果需要恢复, 则需要使用 &man.ipfw.8; 工具来复位对应的计数器:</para>
+
+ <screen>&prompt.root; <userinput>ipfw zero 4500</userinput></screen>
+ <para>这里 4500 是希望继续记录日志的规则在链中的编号。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>options IPFIREWALL_DEFAULT_TO_ACCEPT</literal></term>
+
+ <listitem>
+ <para>这将把默认的规则动作从 <quote>deny</quote>
+ 改为 <quote>allow</quote>。 这可以防止在没有配置防火墙之前使用启用过
+ <literal>IPFIREWALL</literal> 支持的内核重启时把自己锁在外面。
+ 另外, 如果您经常使用
+ &man.ipfw.8; 来解决一些问题时它也非常有用。
+ 尽管如此, 在使用时应该小心,
+ 因为这将使防火墙敞开, 并改变它的行为。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <note><para>先前版本的 FreeBSD 包括了一个
+ <literal>IPFIREWALL_ACCT</literal> 选项。 它现在已经过时了,
+ 因为新的防火墙代码已经包括了审计机制。</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>配置 IPFW</title>
+ <indexterm>
+ <primary><command>ipfw</command></primary>
+ <secondary>配置</secondary>
+ </indexterm>
+
+ <para>对于 IPFW 软件的配置是通过
+ &man.ipfw.8; 来完成的。 它的命令看上去很复杂,
+ 但只要您理解了其结构,
+ 就会感到很简单。</para>
+
+ <para>目前这个工具有四种不同的命令:
+ 添加/删除、 列表、 清空规则链以及让审计项归零。
+ 添加删除类的命令主要用来建立控制如何接受、拒绝和记录包的规则。
+ 列表类命令用于检视目前的规则集 (有时也称作规则链) 和包计数器 (审计)。
+ 清空规则链则删除链中的所有规则,
+ 而审计项归零则可以让一些审计项重新从零开始计数。</para>
+
+ <sect3>
+ <title>改变 IPFW 的规则</title>
+
+ <para>这类命令的格式是:
+ <cmdsynopsis>
+ <command>ipfw</command>
+ <arg>-N</arg>
+ <arg choice="plain">命令</arg>
+ <arg>编号</arg>
+ <arg choice="plain">动作</arg>
+ <arg>log(日志)</arg>
+ <arg choice="plain">协议</arg>
+ <arg choice="plain">地址</arg>
+ <arg>其它选项</arg>
+ </cmdsynopsis></para>
+
+ <para>当使用这种形式的命令时,有一个可用的参数:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-N</term>
+
+ <listitem>
+ <para>在输出中解析地址和服务的名字。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>给出的 <emphasis>命令</emphasis> 可以简写为能够为一分辨它们的最短形式。
+ 可用的 <emphasis>命令</emphasis>
+ 包括:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>add</term>
+
+ <listitem>
+ <para>添加一个防火墙/审计规则到规则链中。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>delete</term>
+
+ <listitem>
+ <para>从规则链中删除一项防火墙/审计规则。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>先前版本的 IPFW 使用分别的防火墙和审计规则项。
+ 目前的版本则为每一个防火墙规则项进行审计。</para>
+
+ <para>如果给出了 <emphasis>编号</emphasis> 值,
+ 则它将决定规则项在链中的位置。
+ 如果没有指定, 则系统会自动分配一个比链的最后一项大 100 的编号
+ (当然, 不包括默认规则, 即 65535 号规则, deny)。</para>
+
+ <para>选项 <literal>log</literal> 则将使匹配规则的包输出到控制台上,
+ 当然前提是把 <literal>IPFIREWALL_VERBOSE</literal> 编译进内核。</para>
+
+ <para>可用的 <emphasis>动作</emphasis> 包括:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>reject</term>
+
+ <listitem>
+ <para>丢掉包, 并回应一个(相应的) ICMP 主机或端口不可达消息给包的来源地址。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>allow</term>
+
+ <listitem>
+ <para>让包通过。 (等价的别名:
+ <literal>pass</literal>、 <literal>permit</literal>、 以及
+ <literal>accept</literal>)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>deny</term>
+
+ <listitem>
+ <para>丢弃包。 但源地址并不会得到相关的
+ ICMP 消息通知 (因此对它来说就像包没有到达目的地址一样)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>count</term>
+
+ <listitem>
+ <para>更新包过滤启但并不执行允许/丢弃的动作。
+ 此后将会继续查找规则链中的下一条规则。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>每一个 <emphasis>动作</emphasis> 都可以使用其无二义性的最短前缀来代替。</para>
+
+ <para>可以指定的 <emphasis>协议</emphasis> 是:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>all</term>
+
+ <listitem>
+ <para>匹配任何的 IP 包</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>icmp</term>
+
+ <listitem>
+ <para>匹配 ICMP 包</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>tcp</term>
+
+ <listitem>
+ <para>匹配 TCP 包</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>udp</term>
+
+ <listitem>
+ <para>匹配 UDP 包</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>可以指定的 <emphasis>地址</emphasis> 是:</para>
+
+ <cmdsynopsis>
+ <arg choice="plain">from</arg>
+ <arg choice="plain"><replaceable>地址/掩码</replaceable></arg><arg><replaceable>端口</replaceable></arg>
+ <arg choice="plain">to</arg>
+ <arg choice="plain"><replaceable>地址/掩码</replaceable></arg><arg><replaceable>端口</replaceable></arg>
+ <arg>via <replaceable>网络接口名</replaceable></arg>
+ </cmdsynopsis>
+
+ <para>只有在使用支持 <replaceable>端口</replaceable> 的
+ <emphasis>协议</emphasis>
+ (UDP and TCP) 时才能指定端口。</para>
+
+ <para><option>via</option> 是一个可选的选项, 它可以通过指定来自某个本地网络接口的 IP
+ 地址或名字 (例如 <devicename>ed0</devicename>) 来匹配来自那个接口的包。
+ 接口的单元号可以用通配符来指定。例如, 使用 <literal>ppp*</literal>
+ 来匹配所有的内核 PPP 接口。</para>
+
+ <para>指定
+ <replaceable>地址/掩码</replaceable> 的语法是:
+
+ <screen><replaceable>地址</replaceable></screen>
+
+ 或者
+
+ <screen><replaceable>地址</replaceable>/<replaceable>掩码位数</replaceable></screen>
+
+ 或者
+
+ <screen><replaceable>地址</replaceable>:<replaceable>掩码模式</replaceable></screen>
+ </para>
+
+ <para>可以在 IP 地址的位置指定一个有效的主机名。
+ <option><replaceable>掩码位数</replaceable></option> 是一个十进制的数,
+ 用以表达地址掩码中的前多少位应当被置一。
+ 例如, 指定 <hostid role="netmask">192.216.222.1/24</hostid>
+ 将建立一个匹配对应 C 类子网的掩码 (在本例中,
+ <hostid role="ipaddr">192.216.222</hostid>)。
+ <option><replaceable>掩码模式</replaceable></option> 是一个将与之执行逻辑与操作的
+ IP 地址。 此外, 还可以用 <literal>any</literal> 来指定 <quote>任意 IP
+ 地址</quote>。</para>
+
+ <para>端口地址范围可以指定为:
+
+ <cmdsynopsis>
+ <arg choice="plain"><replaceable>端口</replaceable><arg>,<replaceable>端口</replaceable><arg>,<replaceable>端口</replaceable><arg>&hellip;</arg></arg></arg></arg>
+ </cmdsynopsis>
+
+ 如果想指定一组不连续的端口。 用
+
+ <cmdsynopsis>
+ <arg choice="plain"><replaceable>端口</replaceable>-<replaceable>端口</replaceable></arg>
+ </cmdsynopsis>
+
+ 来指定一组连续的端口。 这两种格式可以在同一规则中使用,
+ 但连续端口必须先于单个端口指定。</para>
+
+ <para>可用的 <emphasis>其它选项</emphasis> 是:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>frag</term>
+
+ <listitem>
+ <para>匹配数据报中非第一分片的所有分片。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>in</term>
+
+ <listitem>
+ <para>匹配进入的包。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>out</term>
+
+ <listitem>
+ <para>匹配送出的包。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>ipoptions <replaceable>标志</replaceable></term>
+
+ <listitem>
+ <para>匹配 IP 头包含逗号分隔的 <replaceable>标志</replaceable>
+ 的包。 支持的 IP 选项包括: <literal>ssrr</literal>
+ (严格使用源路由)、 <literal>lsrr</literal> (使用松散的源路由)、
+ <literal>rr</literal> (记录包路由)、 以及
+ <literal>ts</literal> (时间戳)。 如果想指定不包括某个标志,
+ 则在选项前加入一个
+ <literal>!</literal>。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>established</term>
+
+ <listitem>
+ <para>匹配属于已经建立的 TCP 连接的包 (也就是说其
+ RST 或 ACK 是置1的)。 您可以通过在规则链中较早的位置上放置
+ <emphasis>established</emphasis> 规则来优化防火墙性能。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>setup</term>
+
+ <listitem>
+ <para>匹配尝试建立 TCP 连接的包 (SYN 置位而 ACK 没有)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>tcpflags <replaceable>标志</replaceable></term>
+
+ <listitem>
+ <para>匹配 TCP 报头包括指定的 <replaceable>标志</replaceable>
+ 的包。 支持的标志是
+ <literal>fin</literal>, <literal>syn</literal>,
+ <literal>rst</literal>, <literal>psh</literal>,
+ <literal>ack</literal>, 以及 <literal>urg</literal>。
+ 如果需要匹配某一位为0, 则在对应的标志前面加
+ <literal>!</literal>。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>icmptypes <replaceable>类型</replaceable></term>
+
+ <listitem>
+ <para>匹配 ICMP 类型在
+ <replaceable>类型</replaceable> 表中的包。
+ 这个表使用逗号分隔, 可以指定任何范围和/或单个的类型。
+ 常见的 ICMP 类型包括: <literal>0</literal>
+ 原样回应 (ping 响应), <literal>3</literal> 目的不可达、
+ <literal>5</literal> 重定向、
+ <literal>8</literal> 原样回应请求 (ping 请求), 以及
+ <literal>11</literal> 超时 (在 &man.traceroute.8; 这样的程序中用来追踪
+ TTL超时)。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3>
+ <title>列出 IPFW 规则</title>
+
+ <para>这类命令的格式是:
+ <cmdsynopsis>
+ <command>ipfw</command>
+ <arg>-a</arg>
+ <arg>-c</arg>
+ <arg>-d</arg>
+ <arg>-e</arg>
+ <arg>-t</arg>
+ <arg>-N</arg>
+ <arg>-S</arg>
+ <arg choice="plain">list</arg>
+ </cmdsynopsis></para>
+
+ <para>七个标志的意义分别是:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-a</term>
+
+ <listitem>
+ <para>当列条目时,显示计数器的值。这个选项是可以看到计数器值的唯一方法。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-c</term>
+
+ <listitem>
+ <para>以紧凑的形式列出规则。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-d</term>
+
+ <listitem>
+ <para>除了静态规则之外, 还列出动态的规则。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-e</term>
+
+ <listitem>
+ <para>如果指定了 <option>-d</option>, 同时列出已经过期的动态规则。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-t</term>
+
+ <listitem>
+ <para>列出每一规则的最后匹配时间。
+ 显示的格式和 &man.ipfw.8; 使用的时间语法并不兼容。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-N</term>
+
+ <listitem>
+ <para>解析地址和服务的名字。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-S</term>
+
+ <listitem>
+ <para>显示每个规则所述的规则集。 如果没有指定标志,
+ 则不会列出已经禁用的规则。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3>
+ <title>清空 IPFW 规则</title>
+
+ <para>用于清空规则链的语法是:
+ <cmdsynopsis>
+ <command>ipfw</command>
+ <arg choice="plain">flush</arg>
+ </cmdsynopsis></para>
+
+ <para>这将导致防火墙规则链中除了由内核强制的默认规则
+ (编号是 65535) 的所有规则都被清除。
+ 这么做时需要格外的孝心;
+ 默认 deny 的策略将切断网络连接,
+ 直到新的规则添加进来为止。</para>
+ </sect3>
+
+ <sect3>
+ <title>将 IPFW 包计数器归零</title>
+
+ <para>将某个或某些包计数器归零的命令语法是:
+ <cmdsynopsis>
+ <command>ipfw</command>
+ <arg choice="plain">zero</arg>
+ <arg choice="opt"><replaceable>编号</replaceable></arg>
+ </cmdsynopsis></para>
+
+ <para>当不带 <replaceable>编号</replaceable> 参数使用时,
+ 所有的包计数器都会归零。 如果指定了
+ <replaceable>编号</replaceable> 参数, 则归零操作只影响那个规则。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>与 <application>ipfw</application> 有关的命令示范</title>
+
+ <para>下面的命令将丢弃所有来自主机 <hostid
+ role="fqdn">evil.crackers.org</hostid> 到主机
+ <hostid role="fqdn">nice.people.org</hostid> 端口的包:</para>
+
+ <screen>&prompt.root; <userinput>ipfw add deny tcp from evil.crackers.org to nice.people.org 23</userinput></screen>
+
+ <para>下一个例子则将拒绝并记录来自整个
+ <hostid role="domainname">crackers.org</hostid> 网络 (C类) 到
+ <hostid role="fqdn">nice.people.org</hostid> 机器的流量 (任何端口)。</para>
+
+ <screen>&prompt.root; <userinput>ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org</userinput></screen>
+
+ <para>如果不希望人们发送 X 到您的内网
+ (一个 C 类子网), 则可以使用下面的规则:</para>
+
+ <screen>&prompt.root; <userinput>ipfw add deny tcp from any to my.org/28 6000 setup</userinput></screen>
+
+ <para>察看审计记录:
+
+ <screen>&prompt.root; <userinput>ipfw -a list</userinput></screen>
+
+ 或者以简写的形式
+
+ <screen>&prompt.root; <userinput>ipfw -a l</userinput></screen>
+ </para>
+
+ <para>可以通过下面的方法察看每个规则上次匹配的时间:</para>
+
+ <screen>&prompt.root; <userinput>ipfw -at l</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>建立包过滤的防火墙</title>
+
+ <note>
+ <para>注意:下面的建议仅仅是:建议。
+ 每个防火墙的要求是不同的,
+ 我们不能告诉如何建构符合特殊要求的防火墙。</para>
+ </note>
+
+ <para>当一开始设置防火墙时,
+ 除非有一个测试平台来在可控的环境中测试防火墙主机,
+ 否则强烈建议使用启用了日志的命令, 并启用内核中的日志功能。
+ 这将帮助您快速地确定问题所在并加以修复。
+ 即使初始安装已经完成,
+ 仍然建议记录 `deny' 因为它能够记录攻击企图,
+ 并帮助您在必要时在事后调整防火墙规则。</para>
+
+ <note>
+ <para>如果使用了带日志的 <command>accept</command>
+ 命令, 则可能产生
+ <emphasis>大量的</emphasis> 日志数据。
+ 通过防火墙的所有包都会被记录, 因此大的 FTP/http 传输等等,
+ 都会让系统变得很慢。
+ 由于在数据包通过之前会要求内核做更多的工作,
+ 因此这些更大的延迟。 另外, <application>syslogd</application>
+ 将会使用更多的处理器时间来吧所有那些额外的数据记录到磁盘上,
+ 这也很容易把 <filename>/var/log</filename>
+ 所在的分区填满。</para>
+ </note>
+
+ <para>一般情况下应该从
+ <filename>/etc/rc.conf.local</filename> 或
+ <filename>/etc/rc.conf</filename> 启动防火墙。
+ 相关的联机手册会解释如何设置和列出当前的防火墙配置。
+ 如果不使用当前的配置, <command>ipfw list</command>
+ 列表将输出当前的规则设置, 您可以把这些设置放到
+ <filename>rc.conf</filename> 中。 如果不想用
+ <filename>/etc/rc.conf.local</filename> 或
+ <filename>/etc/rc.conf</filename> 来启用防火墙,
+ 则确认防火墙是在任何 IP 接口之前已经配置好就很重要了。</para>
+
+ <para>下一个问题是防火墙实际上 <emphasis>做了</emphasis> 些什么!
+ 着很大程度上取决于您希望外界如何访问您的网络,
+ 以及允许什么样的访问被发到外网。
+ 下面是一些通用的规则:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>阻止所有低于 1024 的 TCP 端口。 很多对安全最敏感的服务都在这些端口上运行,
+ 例如 finger、 SMTP (mail) 以及 telnet。</para>
+ </listitem>
+
+ <listitem>
+ <para>阻止 <emphasis>所有</emphasis> 进入的 UDP 传输。 使用 UDP
+ 的有用的服务很少, 而每一个有用的服务往往都同时伴随着安全威胁
+ (例如 Sun 的 RPC 和 NFS 协议)。 还有其他一些缺点, 由于 UDP 是一种无连接的协议,
+ 阻止 UDP 传输同时也就阻止了对发出 UDP 传输的回应。
+ 这可能会给人们 (在内网上工作的那些) 访问外部的
+ archie (prospero) 服务器造成问题。 想要允许访问 archie,
+ 就需要允许来自 191 和 1525 到任何内部 UDP 端口的数据通过防火墙。
+ <application>ntp</application> 是另一种可能需要允许通过防火墙的服务,
+ 它使用的端口号是 123。</para>
+ </listitem>
+
+ <listitem>
+ <para>阻止来自外界到端口 6000 的访问。 这个端口主要用来访问
+ X11 服务器, 着很可能是对安全的威胁
+ (特别是对那些有在他们工作站上做 <command>xhost
+ +</command> 癖好的人)。 X11 实际上可以使用从
+ 6000 开始的端口, 其上限取决于机器上运行了多少个 X
+ 显示。 由 RFC 1700 (Assigned Numbers) 所定义的上限是 6063。</para>
+ </listitem>
+
+ <listitem>
+ <para>检查内部服务器使用什么服务 (例如 SQL 服务等等)。
+ 同时阻止到这些端口的访问可能也是很好的习惯,
+ 因为它们往往不在前面所指定的 1-1024 的端口范围内。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>另外可以到 CERT 的网站去查看一下防火墙配置的推荐步骤,
+ 其网址是 <ulink
+ url="http://www.cert.org/tech_tips/packet_filtering.html"></ulink></para>
+
+ <para>如前面提到的, 这些只是 <emphasis>指导原则</emphasis>。
+ 必须根据具体情况决定使用什么过滤规则。
+ 即使按照上面提到的方法做了, 也没办法保证一定没有人能够侵入您的网络。</para>
+ </sect2>
+
+ <sect2 id="ipfw-overhead">
+ <title>IPFW 的开销和优化</title>
+
+ <para>许多人希望知道 IPFW 会给系统增加多少开销。
+ 答案很大程度上取决于您的规则集大小以及处理器速度。
+ 对于运行在一台网上的绝大多数应用和小规则集来说,
+ 这种开销是 <quote>可忽略的</quote>。
+ 如果您仍然像知道实际的大小来满足好奇心,
+ 则请继续读下去。</para>
+
+ <para>下面的测试是在 486-66 上运行的 2.2.5-STABLE 上完成的。
+ (虽然 IPFW 在之后版本的 FreeBSD 上有很多小规模的修改,
+ 但它们的速度仍然接近)。 IPFW 经过了修改以给出在
+ <literal>ip_fw_chk</literal> 子程序上消耗的时间,
+ 并在每处理1000个数据包之后在控制台上打出结果。</para>
+
+ <para>使用两个各包含 1000 条规则的规则集进行了测试。
+ 第一个规则集是用来展现最差情况的,
+ 它重复下面的规则:</para>
+
+ <screen>&prompt.root; <userinput>ipfw add deny tcp from any to any 55555</userinput></screen>
+
+ <para>通过使绝大多数 IPFW 的包检查子程序被执行之后才能完成决策,
+ 这样做将会展现最差情况, 因为所有的包都不可能匹配这些规则
+ (因为端口号)。
+ 在重复 999 之有一条
+ <literal>allow ip from any to any</literal>规则。</para>
+
+ <para>第二组规则用于在规则的开始就停止判断:</para>
+
+ <screen>&prompt.root; <userinput>ipfw add deny ip from 1.2.3.4 to 1.2.3.4</userinput></screen>
+
+ <para>由于源 IP 地址不匹配上述规则将很快被挑过。
+ 像之前一样, 第
+ 1000 条规则也是 <literal>allow ip from any to
+ any</literal>。</para>
+
+ <para>第一个情况下处理大约需要
+ 2.703&nbsp;毫秒/包, 大致相当于每条规则 2.7&nbsp;毫秒。
+ 这种情况下最大的包处理能力达约是每秒
+ 370 个包。 假设在 10&nbsp;Mbps 以太网上,
+ 包的大小大致是 ~1500&nbsp; 字节,
+ 则只能达到 55.5% 的带宽利用率。</para>
+
+ <para>对于后一种情况每个包的处理大约需要
+ 1.172&nbsp;毫秒, 大致相当于每条规则 1.2&nbsp;毫秒。
+ 理论上每秒大约能够处理
+ 853&nbsp;个包, 能够完全占满 10&nbsp;Mbps 以太网的带宽。</para>
+
+ <para>测试中这些过多的规则数目和规则本身是无法模拟实际的情况的
+ -- 它们只是用来产生这里需要的计时信息。
+ 在建立规则时请牢记下面一些技巧:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>在尽可能早的地方放一个 <literal>established</literal>
+ 规则来处理主要的 TCP 传输。 不要在这条规则之前写任何其它的
+ <literal>allow tcp</literal> 语句。</para>
+ </listitem>
+
+ <listitem>
+ <para>将常用的规则放在规则集尽可能早的位置, 而将不太常用的放在后面
+ (当然, <emphasis>不要改变防火墙的性质</emphasis>)。
+ 您可以通过 <command>ipfw -a
+ l</command> 统计包的计数。</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="openssl">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>作者 </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>OpenSSL</title>
+ <indexterm>
+ <primary>安全</primary>
+ <secondary>OpenSSL</secondary>
+ </indexterm>
+
+ <para>许多用户可能并没有注意到 &os; 所附带的
+ <application>OpenSSL</application> 工具包的功能。
+ <application>OpenSSL</application> 提供了建立在普通的通讯层基础上的加密传输层;
+ 这些功能为许多网络应用和服务程序所广泛使用。</para>
+
+ <para>对 <application>OpenSSL</application> 的一些常见用法包括加密邮件客户的身份验证过程,
+ 基于 Web 的交易如信用卡等等。 许多 ports 如
+ <filename role="package">www/apache13-ssl</filename>, 以及
+ <filename role="package">mail/sylpheed-claws</filename>
+ 等等都提供了编译进
+ <application>OpenSSL</application> 支持的方法。</para>
+
+ <note>
+ <para>绝大多数情况下 ports collection 会试图使用
+ <filename role="package">security/openssl</filename>
+ 除非明确地将 <makevar>WITH_OPENSSL_BASE</makevar> make
+ 变量设置为 <quote>yes</quote>。</para>
+ </note>
+
+ <para>&os; 中附带的 <application>OpenSSL</application> 版本能够支持
+ 安全套接字层 v2/v3 (SSLv2/SSLv3) 和 安全传输层
+ v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库用于应用程序。</para>
+
+ <note>
+ <para>尽管 <application>OpenSSL</application> 支持
+ <acronym>IDEA</acronym> 算法, 但由于美国专利,
+ 它在默认情况下是不编译的。 如果想使用它,
+ 请查阅相应的授权, 如果认为授权可以接受, 则可以在
+ <filename>make.conf</filename> 中设置
+ <makevar>MAKE_IDEA</makevar>。</para>
+ </note>
+
+ <para>为应用软件创建和提供证书可能是
+ <application>OpenSSL</application> 最为常用的功能。
+ 证书是一种确保公司或个人身份有效性的凭据。
+ 如果证书没有被权威发证机构, 即 <acronym>CA</acronym> 验证,
+ 则通常会收到一个警告。 权威发证机构是通过签署证书来证明个人或公司凭据有效性的公司,
+ 如 VeriSign。 这个过程是需要收费的, 并且也不是使用证书时必须的工作;
+ 不过, 这可以让那些比较偏执的用户感到轻松。</para>
+
+ <sect2>
+ <title>生成证书</title>
+
+ <indexterm>
+ <primary>OpenSSL</primary>
+ <secondary>生成证书</secondary>
+ </indexterm>
+
+ <para>为了生成证书, 需要使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>openssl req -new -nodes -out req.pem -keyout cert.pem</userinput>
+Generating a 1024 bit RSA private key
+................++++++
+.......................................++++++
+writing new private key to 'cert.pem'
+-----
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter '.', the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:<userinput><replaceable>US</replaceable></userinput>
+State or Province Name (full name) [Some-State]:<userinput><replaceable>PA</replaceable></userinput>
+Locality Name (eg, city) []:<userinput><replaceable>Pittsburgh</replaceable></userinput>
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:<userinput><replaceable>My Company</replaceable></userinput>
+Organizational Unit Name (eg, section) []:<userinput><replaceable>Systems Administrator</replaceable></userinput>
+Common Name (eg, YOUR name) []:<userinput><replaceable>localhost.example.org</replaceable></userinput>
+Email Address []:<userinput><replaceable>trhodes@FreeBSD.org</replaceable></userinput>
+
+Please enter the following 'extra' attributes
+to be sent with your certificate request
+A challenge password []:<userinput><replaceable>SOME PASSWORD</replaceable></userinput>
+An optional company name []:<userinput><replaceable>Another Name</replaceable></userinput></screen>
+
+ <para>请注意在回答
+ <quote>Common Name</quote> 时使用的是一个域名。
+ 这个提示要求输入服务器的名字, 以完成验证过程;
+ 如果在这里填入其他内容, 则证书就没有什么意义了。
+ 其他选项主要是关于证书有效期和使用的算法。
+ &man.openssl.1; 联机手册中包括了更详细的信息。</para>
+
+ <para>上述命令执行完之后应该会生成一个 <filename>cert.pem</filename>
+ 到当前目录中。 这个证书可以发给一个 <acronym>CA</acronym>
+ 进行签名。</para>
+
+ <para>如果不需要由 <acronym>CA</acronym> 签名, 也可以使用自签名的证书。
+ 首先需要生成 <acronym>CA</acronym> 密钥:</para>
+
+ <screen>&prompt.root; <userinput>openssl gendsa -des3 -out \
+<filename>myca.key</filename> 1024</userinput></screen>
+
+ <para>然后用这个密钥来创建证书:</para>
+
+ <screen>&prompt.root; <userinput>openssl req -new -x509 -days 365 -key \
+<filename>myca.key</filename> -out <filename>new.crt</filename></userinput></screen>
+
+ <para>上述步骤将在当前目录中生成两个新文件:
+ 一个是权威发证机构的签名文件, <filename>myca.key</filename> 另一个则是证书本身,
+ <filename>new.crt</filename>。 这些文件应放到一个目录中, 通常推荐放在
+ <filename role="directory">/etc</filename> 下, 且只能被 root 读取。
+ 0600 这样的权限应该就足够了, 您可以用 <command>chmod</command> 来完成修改。</para>
+ </sect2>
+
+ <sect2>
+ <title>使用证书的一个例子</title>
+
+ <para>那么有了这些文件可以做些什么呢? 一个比较典型的用法是用来加密
+ <application>Sendmail</application> <acronym>MTA</acronym>
+ 的通讯连接。 这可以解决用户通过本地 <acronym>MTA</acronym>
+ 发送邮件时使用明文进行身份验证的问题。</para>
+
+ <note>
+ <para>这个用法可能并不完美, 因为某些
+ <acronym>MUA</acronym> 会由于没有在本地安装证书而向用户发出警告。
+ 请参考那些软件的说明了解关于安装证书的信息。</para>
+ </note>
+
+ <para>下面的设置应添加到本地的
+ <filename>.mc</filename> 文件</para>
+
+ <programlisting>dnl SSL Options
+define(`confCACERT_PATH',`/etc/certs')dnl
+define(`confCACERT',`/etc/certs/new.crt')dnl
+define(`confSERVER_CERT',`/etc/certs/new.crt')dnl
+define(`confSERVER_KEY',`/etc/certs/myca.key')dnl
+define(`confTLS_SRV_OPTIONS', `V')dnl</programlisting>
+
+ <para>这里 <filename role="directory">/etc/certs/</filename>
+ 是准备用来在本地保存证书和密钥的位置。 最后需要重新生成本地的
+ <filename>.cf</filename> 文件。 这个工作可以很容易地通过在
+ <filename role="directory">/etc/mail</filename> 目录中执行
+ <command>make</command>
+ <parameter>install</parameter> 来完成。
+ 然后可以执行 <command>make</command>
+ <parameter>restart</parameter> 来重新启动
+ <application>Sendmail</application> 服务程序。</para>
+
+ <para>如果一切正常, 则
+ <filename>/var/log/maillog</filename> 中不会出现错误提示,
+ <application>Sendmail</application> 也应该出现在进程列表中。</para>
+
+ <para>做一个简单的测试, 使用 &man.telnet.1; 来连接邮件服务器:</para>
+
+ <screen>&prompt.root; <userinput>telnet <replaceable>example.com</replaceable> 25</userinput>
+Trying 192.0.34.166...
+Connected to <hostid role="fqdn">example.com</hostid>.
+Escape character is '^]'.
+220 <hostid role="fqdn">example.com</hostid> ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT)
+<userinput>ehlo <replaceable>example.com</replaceable></userinput>
+250-example.com Hello example.com [192.0.34.166], pleased to meet you
+250-ENHANCEDSTATUSCODES
+250-PIPELINING
+250-8BITMIME
+250-SIZE
+250-DSN
+250-ETRN
+250-AUTH LOGIN PLAIN
+250-STARTTLS
+250-DELIVERBY
+250 HELP
+<userinput>quit</userinput>
+221 2.0.0 <hostid role="fqdn">example.com</hostid> closing connection
+Connection closed by foreign host.</screen>
+
+ <para>如果输出中出现了 <quote>STARTTLS</quote> 则说明一切正常。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="ipsec">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Nik</firstname>
+ <surname>Clayton</surname>
+ <affiliation>
+ <address><email>nik@FreeBSD.org</email></address>
+ </affiliation>
+ <contrib>撰写者 </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>在 IPsec 上的 VPN</title>
+ <para>使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 VPN。</para>
+
+ <sect2>
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Hiten M.</firstname>
+ <surname>Pandya</surname>
+ <affiliation>
+ <address><email>hmp@FreeBSD.org</email></address>
+ </affiliation>
+ <contrib>撰写者 </contrib>
+ </author>
+ </authorgroup>
+ </sect2info>
+
+ <title>理解 IPsec</title>
+
+ <para>这一节将指导您完成架设 IPsec, 并在一个包含了
+ FreeBSD 和 <application>&microsoft.windows; 2000/XP</application>
+ 机器的网络中使用它来进行安全的通讯的全过程。 为了配置
+ IPsec, 您应当熟悉如何编译一个定制的内核的一些概念
+ (参见
+ <xref linkend="kernelconfig">)。</para>
+
+ <para><emphasis>IPsec</emphasis> 是一种建立在 Internet
+ 协议 (IP) 层之上的协议。 它能够让两个或更多主机以安全的方式来通讯
+ (并因此而得名)。
+ FreeBSD IPsec <quote>网络协议栈</quote> 基于
+ <ulink url="http://www.kame.net/">KAME</ulink> 的实现,
+ 它支持两种协议族, IPv4 和 IPv6。</para>
+
+ <note>
+ <para>FreeBSD 5.X 包括了采用 <quote>硬件加速的</quote>
+ IPsec 协议栈, 也称作 <quote>Fast
+ IPsec</quote>, 它来自 OpenBSD。
+ 它能够通过 &man.crypto.4; 子系统来利用加密硬件 (只要可能)
+ 优化 IPSec 的性能。
+ 这个子系统是新的, 暂时还不支持 KAME 版本的 IPsec
+ 的全部功能。 此外, 为了启用硬件加速的
+ IPsec, 必须把下面的选项加入到内核配置中:</para>
+
+ <screen>
+options FAST_IPSEC # new IPsec (cannot define w/ IPSEC)
+ </screen>
+
+ <para>请注意, 目前还不能把
+ <quote>Fast IPsec</quote> 子系统同 KAME
+ 的 IPsec 实现同时混用。 请参考 &man.fast.ipsec.4;
+ 联机手册以了解进一步的信息。</para>
+
+ </note>
+
+ <para>IPsec 包括了两个子协议:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Encapsulated Security Payload
+ (ESP)</emphasis>, 保护 IP 包数据不被第三方介入,
+ 通过使用对称加密算法 (例如 Blowfish、
+ 3DES)。</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Authentication Header (AH)</emphasis>,
+ 保护 IP 包头不被第三方介入和伪造,
+ 通过计算校验和以及对 IP 包头的字段进行安全散列来实现。
+ 随后是一个包含了散列值的附加头,
+ 以便能够验证包。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><acronym>ESP</acronym> 和 <acronym>AH</acronym> 根据环境的不同,
+ 和以分别或一同使用。</para>
+
+ <para>IPsec 既可以用来直接加密主机之间的网络通讯
+ (也就是 <emphasis>传输模式</emphasis>); 也可以用来在两个子网之间建造
+ <quote>虚拟隧道</quote> 用于两个网络之间的安全通讯
+ (也就是 <emphasis>隧道模式</emphasis>)。
+ 后一种更多的被称为是 <emphasis>虚拟专用网 (VPN)</emphasis>。
+ &man.ipsec.4; 联机手册提供了关于 FreeBSD 中 IPsec 子系统的详细信息。</para>
+
+ <para>为了把 IPsec 支持放进内核,
+ 需要在配置文件中加入下面的选项:</para>
+
+ <screen>
+options IPSEC #IP security
+options IPSEC_ESP #IP security (crypto; define w/ IPSEC)
+ </screen>
+
+ <para>如果需要 IPsec 的调试支持, 还需要增加:</para>
+
+ <screen>
+options IPSEC_DEBUG #debug for IP security
+ </screen>
+ </sect2>
+
+ <sect2>
+ <title>问题</title>
+
+ <para>由于对如何建立 VPN 并不存在标准, 因此 VPN
+ 可以采用许多种不同的技术来实现, 每种技术都有其长处和弱点。
+ 这篇文章讲展现一个具体的应用情景, 并为它设计了适合的 VPN。</para>
+ </sect2>
+
+ <sect2>
+ <title>情况: 两个网络都接入了 Internet, 希望像一个网络那样工作</title>
+
+ <para>前提如下:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>至少有两个不同的站点</para>
+ </listitem>
+ <listitem>
+ <para>每个站点都使用内部的 IP</para>
+ </listitem>
+ <listitem>
+ <para>两个站点都通过运行 FreeBSD 的网关接入 Internet。</para>
+ </listitem>
+ <listitem>
+ <para>每个网络上的网关至少有一个公网的 IP 地址。</para>
+ </listitem>
+ <listitem>
+ <para>网络的内部地址可以是公网或私有的 IP 地址,
+ 这并不是问题。 如果需要,您可以在网关上运行 NAT。</para>
+ </listitem>
+ <listitem>
+ <para>两个网络上的 IP 地址
+ <emphasis>不冲突</emphasis>。 虽然理论上可以通过
+ VPN 和 NAT 连用来使这种情况能够正常工作,
+ 但那毫无疑问将是管理的噩梦。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您发现您正打算连接两个内网使用同样私有 IP 地址范围的网络
+ (例如它们都使用 <hostid
+ role="ipaddr">192.168.1.x</hostid>), 则建议改掉其中一个网络的地址。</para>
+
+ <para>网络的拓扑结构如下:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="security/ipsec-network" align="center">
+ </imageobject>
+
+ <textobject>
+<literallayout class="monospaced">
+网络 #1 [ 内部主机 ] 私有网络,192.168.1.2-254
+ [ Win9x/NT/2K ]
+ [ UNIX ]
+ |
+ |
+ .---[fxp1]---. 私有 IP, 192.168.1.1
+ | FreeBSD |
+ `---[fxp0]---' 公网 IP, A.B.C.D
+ |
+ |
+ -=-=- Internet -=-=-
+ |
+ |
+ .---[fxp0]---. 公网 IP, W.X.Y.Z
+ | FreeBSD |
+ `---[fxp1]---' 私有 IP, 192.168.2.1
+ |
+ |
+网络 #2 [ Internal Hosts ]
+ [ Win9x/NT/2K ] 私有网络, 192.168.2.2-254
+ [ UNIX ]</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>请注意两个公网 IP 地址。 在这篇文章的其余部分我将用这些字母来表示它们。
+ 在文章中看到这些字母的时候, 请把它们换成自己的公网 IP 地址。
+ 另外, 在内部, 两个网关都是使用的 .1 的 IP地址,
+ 而两个网络使用了不同的私有 IP 地址 (相应地, <hostid
+ role="ipaddr">192.168.1.x</hostid> 和 <hostid
+ role="ipaddr">192.168.2.x</hostid>)。 所有私有网络上的机器都被配置为使用
+ <hostid role="ipaddr">.1</hostid> 这台机器作为它们的网关。</para>
+
+ <para>我们希望, 从网络的观点看,
+ 每一个网络上的机器都应该能够像在直接连接到同一路由器上一样看到对方网络上的机器
+ -- 尽管可能比路由器略慢一些, 并且有时会有丢包的现象。</para>
+
+ <para>这意味着 (举例来说), 主机 <hostid
+ role="ipaddr">192.168.1.20</hostid> 应该能够运行</para>
+
+ <programlisting>ping 192.168.2.34</programlisting>
+
+ <para>并且这能够透明地工作。 &windows; 机器应该能够看到其他网络上的机器,
+ 浏览文件共享, 等等, 就像在本地网络上一样。</para>
+
+ <para>而且这些事情必须是安全的, 也就是说两个网络之间的通讯必须加密。</para>
+
+ <para>在两个网络之间建立 VPN 可以分为几步。
+ 这些步骤包括:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>在两个网络之间, 通过 Internet 建立一个
+ <quote>虚拟的</quote> 网络连接。
+ 使用类似 &man.ping.8; 这样的工作来验证它是否正常工作。</para>
+ </listitem>
+
+ <listitem>
+ <para>在两个网络之间应用安全策略以保证它们之间的通讯被透明地加密盒解密。
+ 可以使用 &man.tcpdump.1; 或类似的工具来验证这一点。</para>
+ </listitem>
+
+ <listitem>
+ <para>在 FreeBSD 网关上配置其他软件,
+ 让 &windows; 机器能够通过 VPN 看到另一个网络中的机器。</para>
+ </listitem>
+ </orderedlist>
+
+ <sect3>
+ <title>步骤 1: 建立并测试 <quote>虚拟的</quote>
+ 网络连接</title>
+
+ <para>假设您目前已经登录到了网络 #1 的网关机上
+ (其公网 IP 地址是 <hostid
+ role="ipaddr">A.B.C.D</hostid>, 私网 IP 地址是 <hostid
+ role="ipaddr">192.168.1.1</hostid>), 则您可以执行 <command>ping
+ 192.168.2.1</command>, 这是公网 IP 为 <hostid role="ipaddr">W.X.Y.Z</hostid>
+ 的私网地址。 需要做什么实现上述功能呢?</para>
+
+ <orderedlist>
+ <listitem>
+ <para>作为网关的机器需要知道如何能够到达 <hostid
+ role="ipaddr">192.168.2.1</hostid>。 换言之,
+ 它需要一条通往 <hostid
+ role="ipaddr">192.168.2.1</hostid> 的路由。</para>
+ </listitem>
+ <listitem>
+ <para>私网 IP 地址, 例如 <hostid
+ role="ipaddr">192.168.x</hostid> 这样的地址是不应在 Internet 上面大量出现的。
+ 于此相反, 发送到 <hostid role="ipaddr">192.168.2.1</hostid> 的数据包将会封装到另外的包中。
+ 这样的包对外展现的应该是来自 <hostid role="ipaddr">A.B.C.D</hostid>,
+ 并被发到 <hostid
+ role="ipaddr">W.X.Y.Z</hostid> 去。 这个过程称为
+ <firstterm>封装</firstterm>。</para>
+ </listitem>
+ <listitem>
+ <para>一旦包到达了 <hostid
+ role="ipaddr">W.X.Y.Z</hostid> 就需要对其
+ <quote>拆封</quote>, 并传递给 <hostid
+ role="ipaddr">192.168.2.1</hostid>。</para>
+ </listitem>
+ </orderedlist>
+
+ <para>可以把上述过程理解为在两个网络间建立了一个 <quote>隧道</quote>。
+ 两个 <quote>隧道口</quote> 是 IP 地址 <hostid role="ipaddr">A.B.C.D</hostid>
+ 和 <hostid role="ipaddr">W.X.Y.Z</hostid>, 而隧道必须被告知哪些私有地址可以自由地在其中通过。
+ 隧道被用来在公共的 Internet 上传递私有的 IP 数据。</para>
+
+ <para>在 FreeBSD 上, 隧道可以通过一般的网络接口, 或
+ <devicename>gif</devicename> 来建立。
+ 您也许已经猜到了, 每一台网关机的 <devicename>gif</devicename>
+ 接口需要配置四个 IP 地址; 两个是公网 IP 地址,
+ 另两个则是私网 IP 地址。</para>
+
+ <para>对于 gif 设备的支持必须在两台网关机上编译进内核。
+ 可以通过添加下面的设置:</para>
+
+ <programlisting>pseudo-device gif</programlisting>
+
+ <para>到两边的内核配置文件中, 并重新编译、 安装和启动它们。</para>
+
+ <para>配置隧道可以分为两步来完成。 首先隧道必须被告知外部的
+ (或公网的) IP 地址, 可以通过 &man.gifconfig.8; 来完成这步。
+ 私网 IP 地址则必须使用 &man.ifconfig.8; 来配置。</para>
+
+ <note>
+ <para>在 &os;&nbsp;5.X 中,
+ &man.gifconfig.8; 的功能已经并入
+ &man.ifconfig.8;。</para></note>
+
+ <para>在网络 #1 的网关机上可以通过下面的两个命令来配置隧道。</para>
+
+ <programlisting>gifconfig gif0 A.B.C.D W.X.Y.Z
+ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
+ </programlisting>
+
+ <para>在另一边也需要做类似的设置, 只是 IP 地址的顺序是反过来的。</para>
+
+ <programlisting>gifconfig gif0 W.X.Y.Z A.B.C.D
+ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
+ </programlisting>
+
+ <para>随后执行:</para>
+
+ <programlisting>gifconfig gif0</programlisting>
+
+ <para>可以查看当前的配置情况。 例如, 在网络 #1
+ 的网关上您应该能够看到:</para>
+
+ <screen>&prompt.root; <userinput>gifconfig gif0</userinput>
+gif0: flags=8011&lt;UP,POINTTOPOINT,MULTICAST&gt; mtu 1280
+inet 192.168.1.1 --&gt; 192.168.2.1 netmask 0xffffffff
+physical address inet A.B.C.D --&gt; W.X.Y.Z
+ </screen>
+
+ <para>如您所见, 虽然到已经在物理地址 <hostid role="ipaddr">A.B.C.D</hostid> 和
+ <hostid role="ipaddr">W.X.Y.Z</hostid> 之间建立起来,
+ 而允许通过隧道的地址则是 <hostid
+ role="ipaddr">192.168.1.1</hostid> 到 <hostid
+ role="ipaddr">192.168.2.1</hostid> 这个范围。</para>
+
+ <para>这同时会在两边机器的路由表中加入一项,
+ 可以通过 <command>netstat -rn</command> 来观察。
+ 来自网络 #1的网关机的输出如下。</para>
+
+ <screen>&prompt.root; <userinput>netstat -rn</userinput>
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+...
+192.168.2.1 192.168.1.1 UH 0 0 gif0
+...
+ </screen>
+
+ <para>正如 <quote>Flags</quote> 的值所显示的那样, 这是一个主机路由,
+ 这意味着每一个网关都知道如何到达另一端的网关,
+ 但它们现在还不知道如何到达对方的网络。
+ 我们接下来立刻解决这个问题。</para>
+
+ <para>您很可能在两台机器上都在运行防火墙。
+ 这需要作一些变动, 以便适应 VPN 的需要。
+ 一般来说会希望两个网络相互传递数据包,
+ 或者通过防火墙来隔离两边的危险。</para>
+
+ <para>如果您将防火墙配置为允许两边的网络传输通过,
+ 则测试工作会简单不少。 随后您可以随时将限制变得更严格一些。
+ 假如您在网关上使用 &man.ipfw.8; 则下面的命令</para>
+
+ <programlisting>ipfw add 1 allow ip from any to any via gif0</programlisting>
+
+ <para>将允许两端点的 VPN 数据通过, 而不影响其他防火墙策略。
+ 很显然, 您需要在两个网关上都执行上述命令。</para>
+
+ <para>现在已经可以让两台机器相互 ping 了。
+ 在 <hostid role="ipaddr">192.168.1.1</hostid> 您应该能够正常执行</para>
+
+ <programlisting>ping 192.168.2.1</programlisting>
+
+ <para>并得到回应。 对于另一台网关来说也是一样。</para>
+
+ <para>然而, 到目前为止仍然还无法连上另一网络上的内部主机。
+ 原因是路由 -- 尽管网关机知道如何到达对方那里,
+ 但它们都不知道如何到达对方后面的网络。</para>
+
+ <para>要解决这个问题, 就必须在两边都添加一条静态路由。
+ 可以在第一台网关上执行:</para>
+
+ <programlisting>route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
+ </programlisting>
+
+ <para>这相当于是说 <quote>为了到达
+ <hostid role="ipaddr">192.168.2.0</hostid> 子网的机器,
+ 需要把包发给 <hostid
+ role="ipaddr">192.168.2.1</hostid></quote>。
+ 您需要在另一个网关上也执行类似的命令, 但使用
+ <hostid role="ipaddr">192.168.1.x</hostid> 的地址。</para>
+
+ <para>来自一个网络上的 IP 访问现在能够抵达对面的网络了。</para>
+
+ <para>在两个网络之间建立 VPN 的过程已经完成了三分之二,
+ 它现在已经是 <quote>虚拟的</quote> <quote>网络</quote>,
+ 然而它还不够专用。 您可以使用
+ &man.ping.8; 和 &man.tcpdump.1; 来进行测试, 并记录两边收发的数据包</para>
+
+ <programlisting>tcpdump dst host 192.168.2.1</programlisting>
+
+ <para>接下来登录到本机的另一个会话</para>
+
+ <programlisting>ping 192.168.2.1</programlisting>
+
+ <para>您将在输出中发现</para>
+
+ <programlisting>
+16:10:24.018080 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
+16:10:24.018109 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
+16:10:25.018814 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
+16:10:25.018847 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
+16:10:26.028896 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
+16:10:26.029112 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
+ </programlisting>
+
+ <para>如您所见, ICMP 消息在收发的过程中都没有加密。
+ 如果使用了 <option>-s</option> 参数来运行
+ &man.tcpdump.1;, 甚至可以得到包中的更多信息以及其中的数据。</para>
+
+ <para>很明显这是不能接受的。 下一节将讨论如何让两个网络之间的连接更安全,
+ 这件事是通过对通讯实施加密来完成的。</para>
+
+ <itemizedlist>
+ <title>小结:</title>
+ <listitem>
+ <para>使用 <quote>pseudo-device
+ gif</quote> 配置两边的内核。</para>
+ </listitem>
+ <listitem>
+ <para>编辑网关 #1 上的 <filename>/etc/rc.conf</filename> 并将下面的行添加进去
+ (根据需要改 IP )。</para>
+ <programlisting>gifconfig_gif0="A.B.C.D W.X.Y.Z"
+ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
+static_routes="vpn"
+route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
+ </programlisting>
+ </listitem>
+
+ <listitem>
+ <para>在两台机器上编辑防火墙脚本
+ (<filename>/etc/rc.firewall</filename>, 或类似的名字)
+ 在其中加入</para>
+
+ <programlisting>ipfw add 1 allow ip from any to any via gif0</programlisting>
+ </listitem>
+ <listitem>
+ <para>在网络 #2 的网关机上也对
+ <filename>/etc/rc.conf</filename> 做同样的修改, 注意把 IP 地址倒过来。</para>
+ </listitem>
+ </itemizedlist>
+ </sect3>
+
+ <sect3>
+ <title>步骤 2: 对连接实施安全加固</title>
+
+ <para>为了加密连接通讯将用到 IPsec。
+ IPsec 提供了一种机制, 使得两台主机协商一个加密密钥,
+ 并使用它加密之间的通讯。</para>
+
+ <para>在配置时有两个地方需要考虑。</para>
+
+ <orderedlist>
+ <listitem>
+ <para>必须有能够让两台主机协商所采用的加密方式的机制。
+ 一旦双方确认了这机制, 则称他们之间建立了
+ <quote>安全关联</quote>。</para>
+ </listitem>
+ <listitem>
+ <para>必须采用某种机制来指定哪些通讯需要加密。
+ 很明显地, 通常并不需要所有的发出数据都被加密
+ -- 一般只需要加密在 VPN 上传输的那些数据。
+ 这类决定哪些数据被加密的规则被称为
+ <quote>安全策略</quote>。</para>
+ </listitem>
+ </orderedlist>
+
+ <para>安全关联和安全策略都是由内核来维护的,
+ 并可以通过用户态的程序来修改。
+ 在能够这样做之前, 首先需要配置内核来让它支持
+ IPsec 和安全载荷封装
+ (ESP) 协议。 配置下面的内核选项</para>
+
+ <programlisting>options IPSEC
+options IPSEC_ESP
+ </programlisting>
+
+ <para>然后重新编译、 安装最后重新启动新的内核。
+ 在继续进行设置之前, 您需要在两台网关上都进行同样的设置。</para>
+
+ <para>在建立安全关联时有两种选择。
+ 一种方法是完全手工地在两台主机之间选择加密算法、 密钥等等,
+ 另一种方法是使用实现了 Internet 密钥交换协议 (IKE) 的服务程序来帮您完成这些任务。</para>
+
+ <para>我们推荐后者。 不说别的, 它配置起来要容易得多。</para>
+
+ <para>用 &man.setkey.8; 可以编辑和显示安全策略。
+ 打个比方, <command>setkey</command> 之于内核的安全策略表,
+ 就相当于 &man.route.8; 之于内核中的路由表。
+ <command>setkey</command> 还可以显示当前的安全关联,
+ 这一点和 <command>netstat -r</command>
+ 类似。</para>
+
+ <para>FreeBSD 上用于管理安全关联的可供选择的服务程序有很多。
+ 这篇文章将介绍如何使用其中的一种, racoon。
+ racoon 可以从 FreeBSD ports collection 安装,
+ 它位于 security/ 分类下。 安装方法与其他软件无异。</para>
+
+ <para>racoon 需要在两台网关机上都运行。
+ 需要配置 VPN 另一端的 IP, 以及一个密钥
+ (这个密钥可以任意选择, 但两个网关上的密钥必须一致)。</para>
+
+ <para>两端的服务程序将相互通讯, 并确认它们各自的身份 (使用刚刚配置的密钥)
+ 然后服务程序将生成一个新的密钥, 并用它来加密 VPN 上的数据通讯。
+ 它们定期地改变密钥, 因此即使供给者破解了一个密钥 (虽然这在理论上并不十分可行)
+ 他也得不到什么 -- 破解密钥的时候, 已经产生一组新的密钥了。</para>
+
+ <para>racoon 的配置保存在
+ <filename>${PREFIX}/etc/racoon</filename> 中。
+ 在那里应该能够找到一个配置文件, 不需要修改太多的设置。
+ raccon 配置的另一部分, 也就是需要修改的内容,
+ 是 <quote>预先配置的共享密钥</quote>。</para>
+
+ <para>默认的 racoon 配置文件应该可以在
+ <filename>${PREFIX}/etc/racoon/psk.txt</filename> 这个文件中找到。
+ 需要强调的是, 这个密钥 <emphasis>并非</emphasis> 用于加密 VPN 连接的密钥,
+ 他们只是密钥管理服务程序用以信任对方的一种凭据。</para>
+
+ <para><filename>psk.txt</filename> 包含了需要打交道的每一个远程站点。
+ 在本例中一共有两个站点, 每一个 <filename>psk.txt</filename> 都只有一行
+ (因为每个 VPN 接入点都只和一个端点连接)。</para>
+
+ <para>在网关机 #1 上应该是:</para>
+
+ <programlisting>W.X.Y.Z secret</programlisting>
+
+ <para>这包括了远程站点的 <emphasis>公网</emphasis> IP 地址,
+ 空格, 以及提供秘密的字符串。
+ 很明显不应使用 <quote>secret</quote> 作为实际的密钥 -- 通常的口令选择策略应该应用到这里。</para>
+
+ <para>在网关 #2 上对应的配置是</para>
+
+ <programlisting>A.B.C.D secret</programlisting>
+
+ <para>也就是说, 对面端的公网 IP 地址, 以及同样的密钥。
+ <filename>psk.txt</filename> 的权限必须是
+ <literal>0600</literal> (也就是说, 只有
+ <username>root</username> 能够读写) 否则 racoon 将不能运行。</para>
+
+ <para>两边的机器上都必须执行 racoon。
+ 另外, 还需要增加一些防火墙规则来允许 IKE 通讯通过,
+ 它是通过 UDP 在 ISAKMP (Internet 安全关联密钥管理协议)
+ 端口上运行的协议。 再次强调, 这个规则应该在规则集尽可能早的位置出现。</para>
+
+ <programlisting>ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
+ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
+ </programlisting>
+
+ <para>一旦 racoon 开始运行, 就可以开始测试让网关进行相互的 ping 了。
+ 此时连接还没有进行加密, 但
+ racoon 将在两个主机之间建立安全关联 --
+ 这可能需要一段时间, 对您来说, 具体的现象则是在 ping 命令开始响应之前会有短暂的延迟。</para>
+
+ <para>一旦安全关联建立之后, 就可以使用 &man.setkey.8; 来查看它了。 在两边的网关上执行</para>
+
+ <programlisting>setkey -D</programlisting>
+
+ <para>就可以看到安全关联的相关信息了。</para>
+
+ <para>现在只完成了一半的工作。 另一半是设置安全策略。</para>
+
+ <para>想要完成一个有判断力的安全策略, 首先要看我们已经完成的步骤。
+ 接下来的讨论针对连接的两端。</para>
+
+ <para>您所发出的每一个 IP 包都包括一个包头, 其内容是和这个包有关的描述性数据。
+ 包头包括了包的来源和目的的 IP 地址。
+ 正如我们所了解的那样, 私有 IP 地址,
+ 例如 <hostid role="ipaddr">192.168.x.y</hostid>
+ 这样的地址范围, 不应该出现在 Internet 的公网上。
+ 于此相反, 他们必须首先封装到别的包中。
+ 包的来源或目的如果是私有 IP 地址,
+ 则必须替换成公网 IP 地址。</para>
+
+ <para>因此如果发出的包类似下面这样:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="security/ipsec-out-pkt" align="center">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced">
+ .-------------------.
+ | Src: 192.168.1.1 |
+ | Dst: 192.168.2.1 |
+ | &lt;其他头信息 &gt; |
+ +-------------------+
+ | &lt;包数据 &gt; |
+ `-------------------'</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>随后它将被封装进另一个包中, 像下面这样:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="security/ipsec-encap-pkt" align="center">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced">
+ .--------------------------.
+ | Src: A.B.C.D |
+ | Dst: W.X.Y.Z |
+ | &lt;附加头信息 &gt; |
+ +--------------------------+
+ | .----------------------. |
+ | | Src: 192.168.1.1 | |
+ | | Dst: 192.168.2.1 | |
+ | | &lt;附加头信息 &gt; | |
+ | +----------------------+ |
+ | | &lt;包数据 &gt; | |
+ | `----------------------' |
+ `--------------------------'</literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>封装过程是在
+ <devicename>gif</devicename> 设备上完成的。 如上图所示,
+ 包现在有了外部的实际 IP 地址, 而原始的包则被封装到里面作为数据。
+ 这个包将通过 Internet 传递。</para>
+
+ <para>很明显地, 我们希望 VPN 之间的通讯是加密的。
+ 用语言来描述大致是:</para>
+
+ <para><quote>如果包从 <hostid
+ role="ipaddr">A.B.C.D</hostid> 发出且其目的地是 <hostid
+ role="ipaddr">W.X.Y.Z</hostid>, 则通过必要的安全关联进行加密。</quote></para>
+
+ <para><quote>如果包来自 <hostid
+ role="ipaddr">W.X.Y.Z</hostid> 且其目的地是 <hostid
+ role="ipaddr">A.B.C.D</hostid>, 则通过必要的安全关联进行解密。</quote></para>
+
+ <para>这已经很接近了, 但还不够正确。 如果这么做的话,
+ 所有来自和发到 <hostid role="ipaddr">W.X.Y.Z</hostid> 的包,
+ 无论是否属于 VPN 通讯都会被加密。 这可能并不是您所希望的,
+ 因此正确的安全策略应该是</para>
+
+ <para><quote>如果包从 <hostid
+ role="ipaddr">A.B.C.D</hostid> 发出, 且封装了其他的包,
+ 其目的地是 <hostid
+ role="ipaddr">W.X.Y.Z</hostid>, 则通过必要的安全关联进行加密。</quote></para>
+
+ <para><quote>如果包来自 <hostid
+ role="ipaddr">W.X.Y.Z</hostid>, 且封装了其他的包,
+ 其目的地是 <hostid
+ role="ipaddr">A.B.C.D</hostid>, 则通过必要的安全关联进行解密。</quote></para>
+
+ <para>一个很小, 但却必要的改动。</para>
+
+ <para>安全策略也是通过 &man.setkey.8; 设置的。
+ &man.setkey.8; 提供了一种用于配置策略的语言。
+ 可以直接在 stdin 上输入策略, 或通过 <option>-f</option>
+ 选项来指定一个包含配置命令的文件。</para>
+
+ <para>网关 #1 上的配置 (其
+ IP 地址是 <hostid role="ipaddr">A.B.C.D</hostid>) 强制将所有到
+ <hostid role="ipaddr">W.X.Y.Z</hostid> 的通讯进行加密的配置是:</para>
+
+ <programlisting>
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+ </programlisting>
+
+ <para>把这些命令放到一个文件 (例如
+ <filename>/etc/ipsec.conf</filename>) 然后执行</para>
+
+ <screen>&prompt.root; <userinput>setkey -f /etc/ipsec.conf</userinput></screen>
+
+ <para><option>spdadd</option> 会告诉 &man.setkey.8; 我们希望把规则加入到安全策略数据库中。
+ 命令的其它部分指定了什么样的包能够匹配这规则。
+ <hostid role="ipaddr">A.B.C.D/32</hostid> 和 <hostid
+ role="ipaddr">W.X.Y.Z/32</hostid> 是用于指定规则能够匹配的网络或主机的
+ IP 地址和掩码。 本例中, 希望应用到两个主机之间的通讯上。
+ <option>ipencap</option> 则告诉内核这规则只应被用于封装其他包的那些数据包。
+ <option>-P out</option> 表示策略是针对发出的包的, 而
+ <option>ipsec</option> 则表示需要对数据包进行加密。</para>
+
+ <para>第二行指定了如何加密。
+ <option>esp</option> 是将要使用的协议,
+ 而 <option>tunnel</option> 则表示包应该进一步封装进一个
+ IPsec 包里面。 反复使用
+ <hostid role="ipaddr">A.B.C.D</hostid> 和 <hostid
+ role="ipaddr">W.X.Y.Z</hostid> 用来选择所用的安全关联
+ 而最后的 <option>require</option> 则强制所有匹配这规则的包都被加密。</para>
+
+ <para>上面的规则只匹配了发出的包。 接下来需要配置类似的匹配进入包的规则。</para>
+
+ <programlisting>spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;</programlisting>
+
+ <para>请注意本例中 <option>in</option> 代替了
+ <option>out</option> 并且 IP 地址的顺序也相反。</para>
+
+ <para>在另一个网关上 (其公网 IP 地址是
+ <hostid role="ipaddr">W.X.Y.Z</hostid>) 也需要类似的规则。</para>
+
+ <programlisting>spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;</programlisting>
+
+ <para>最后是添加允许 ESP 和
+ IPENCAP 包进出的防火墙规则。 这些规则需要在两边分别设置。</para>
+
+ <programlisting>ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
+ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
+ </programlisting>
+
+ <para>由于规则的对称性, 因此可以在两台网关上使用同样的规则。</para>
+
+ <para>发出的包如下图所示:</para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="security/ipsec-crypt-pkt" align="center">
+ </imageobject>
+
+ <textobject>
+ <literallayout class="monospaced">
+ .------------------------------. --------------------------.
+ | Src: A.B.C.D | |
+ | Dst: W.X.Y.Z | |
+ | &lt;other header info&gt; | | Encrypted
+ +------------------------------+ | packet.
+ | .--------------------------. | -------------. | contents
+ | | Src: A.B.C.D | | | | are
+ | | Dst: W.X.Y.Z | | | | completely
+ | | &lt;other header info&gt; | | | |- secure
+ | +--------------------------+ | | Encap'd | from third
+ | | .----------------------. | | -. | packet | party
+ | | | Src: 192.168.1.1 | | | | Original |- with real | snooping
+ | | | Dst: 192.168.2.1 | | | | packet, | IP addr |
+ | | | &lt;other header info&gt; | | | |- private | |
+ | | +----------------------+ | | | IP addr | |
+ | | | &lt;packet data&gt; | | | | | |
+ | | `----------------------' | | -' | |
+ | `--------------------------' | -------------' |
+ `------------------------------' --------------------------'
+ </literallayout>
+ </textobject>
+ </mediaobject>
+
+ <para>当 VPN 数据被远端接到时, 它将首先被解密
+ (使用 racoon 协商得到的安全关联)。
+ 然后它们将进入
+ <devicename>gif</devicename> 接口, 并在那里展开第二层,
+ 直到只剩下最里层的包, 并将其转发到内网上。</para>
+
+ <para>可以通过与之前同样的 &man.ping.8; 命令来测试安全性。
+ 首先登录到
+ <hostid role="ipaddr">A.B.C.D</hostid> 网关上并执行:</para>
+
+ <programlisting>tcpdump dst host 192.168.2.1</programlisting>
+
+ <para>在同一主机上登录另一会话, 执行</para>
+
+ <programlisting>ping 192.168.2.1</programlisting>
+
+ <para>此时的输出应该是:</para>
+
+ <programlisting>XXX tcpdump output</programlisting>
+
+ <para>如您看到的, &man.tcpdump.1; 给出的将是 ESP 包。
+ 假如您想查看它们的内容可以使用 <option>-s</option> option 选项,
+ 您将 (显然地) 看到一些乱码, 因为传输过程实施了加密。</para>
+
+ <para>祝贺您。 您已经完成了两个远程站点之间的 VPN 的架设工作。</para>
+
+ <itemizedlist>
+ <title>小结</title>
+ <listitem>
+ <para>将两边的内核配置加入:</para>
+
+ <programlisting>options IPSEC
+options IPSEC_ESP
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>安装 <filename
+ role="package">security/racoon</filename>。 编辑两台网关上的
+ <filename>${PREFIX}/etc/racoon/psk.txt</filename>
+ 并添加远程主机的 IP 和共享的密钥。 文件的权限应该是 0600。</para>
+ </listitem>
+ <listitem>
+ <para>将下面的设置加入两台主机的
+ <filename>/etc/rc.conf</filename> 中:</para>
+
+ <programlisting>ipsec_enable="YES"
+ipsec_file="/etc/ipsec.conf"
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>在两个网关上都建立 <filename>/etc/ipsec.conf</filename>
+ 并添加必要的 spdadd。 在网关 #1 上是:</para>
+
+ <programlisting>
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
+ esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
+ esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+</programlisting>
+
+ <para>在网关 #2 上则是:</para>
+
+<programlisting>
+spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
+ esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
+ esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+</programlisting>
+ </listitem>
+ <listitem>
+ <para>添加防火墙规则以允许 IKE, ESP, 和 IPENCAP
+ 通讯能够到达各自的主机:</para>
+
+ <programlisting>
+ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
+ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
+ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
+ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
+ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
+ </programlisting>
+ </listitem>
+ </itemizedlist>
+
+ <para>前面的两部应该足以让 VPN 运转起来了。
+ 两个网络上的机器都应该能通过 IP 来访问对方,
+ 而所有的通讯都被自动地进行加密。</para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="openssh">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ <contrib>原著 </contrib>
+ </author>
+ <!-- 21 April 2001 -->
+ </authorgroup>
+ </sect1info>
+
+ <title>OpenSSH</title>
+ <indexterm><primary>OpenSSH</primary></indexterm>
+ <indexterm>
+ <primary>安全</primary>
+ <secondary>OpenSSH</secondary>
+ </indexterm>
+
+ <para><application>OpenSSH</application> 是一组用于安全地访问远程计算机的连接工具。
+ 它可以作为 <command>rlogin</command>、
+ <command>rsh</command> <command>rcp</command> 以及
+ <command>telnet</command> 的直接替代品使用。
+ 更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。
+ <application>OpenSSH</application> 对所有的传输进行加密,
+ 从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。</para>
+
+ <para><application>OpenSSH</application> 由 OpenBSD project 维护, 它基于
+ SSH v1.2.12 并包含了最新的错误修复和更新。
+ 它同时兼容 SSH 协议的 1 和 2 两个版本。
+ 从 FreeBSD&nbsp;4.0 开始, <application>OpenSSH</application> 成为了基本系统的一部分。</para>
+
+ <sect2>
+ <title>使用 OpenSSH 的好处</title>
+
+ <para>通常,当使用 &man.telnet.1; 或 &man.rlogin.1; 时,
+ 数据是以明码的形式发送的,并没有加密。
+ 在客户机和服务器之间的网络上运行的听包程序可以在会话中偷窃到传输的用户名/密码和数据。
+ <application>OpenSSH</application> 提供了多种的身份验证和加密方法来防止这种情况的发生。</para>
+ </sect2>
+
+ <sect2>
+ <title>启用 sshd</title>
+ <indexterm>
+ <primary>OpenSSH</primary>
+ <secondary>启用</secondary>
+ </indexterm>
+
+ <para>确信已将下面这行加入了
+ <filename>rc.conf</filename> 文件:</para>
+ <screen>sshd_enable="YES"</screen>
+ <para>将在下次启动系统时加载 <application>OpenSSH</application> 的 &man.sshd.8; 服务程序。
+ 另外, 也可以简单地使用 <command>sshd</command> 来直接启动
+ <application>sshd</application> 服务。</para>
+ </sect2>
+
+ <sect2>
+ <title>SSH 客户</title>
+ <indexterm>
+ <primary>OpenSSH</primary>
+ <secondary>客户</secondary>
+ </indexterm>
+
+ <para>&man.ssh.1; 的工作方式和
+ &man.rlogin.1; 非常类似。</para>
+
+ <screen>&prompt.root; <userinput>ssh <replaceable>user@example.com</replaceable></userinput>
+Host key not found from the list of known hosts.
+Are you sure you want to continue connecting (yes/no)? <userinput>yes</userinput>
+Host 'example.com' added to the list of known hosts.
+user@example.com's password: <userinput>*******</userinput></screen>
+
+ <para>登录过程和使用
+ <command>rlogin</command> 或
+ <command>telnet</command> 建立的会话非常类似。
+ 在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。
+ 只有在第一次连接时, 用户会被要求输入
+ <literal>yes</literal>。 之后的连接将会验证预先保存下来的密钥指纹。
+ 如果保存的指纹与登录时接收到的不符, 则将会给出警告。
+ 指纹保存在 <filename>~/.ssh/known_hosts</filename> 中, 对于 SSH v2 指纹, 则是
+ <filename>~/.ssh/known_hosts2</filename>。</para>
+
+ <para>默认情况下 <application>OpenSSH</application> 服务器的配置会接受
+ SSH v1 和 SSH v2 的连接。 然而, 客户端则可以选择两者之一。
+ 一般认为, 第2版更加健壮和安全。</para>
+
+ <para>通过 <option>-1</option> 或 <option>-2</option> 参数,
+ 可以强制 &man.ssh.1; 使用 v1 或 v2 的协议。</para>
+ </sect2>
+
+ <sect2>
+ <title>安全复制</title>
+ <indexterm>
+ <primary>OpenSSH</primary>
+ <secondary>安全复制</secondary>
+ </indexterm>
+ <indexterm><primary><command>scp</command></primary></indexterm>
+
+ <para>&man.scp.1; 命令和
+ &man.rcp.1;; 的用法类似, 它用于将文件复制到远程的机器上, 或复制过来,
+ 区别是它是安全的。</para>
+
+ <screen>&prompt.root; <userinput> scp <replaceable>user@example.com:/COPYRIGHT COPYRIGHT</replaceable></userinput>
+user@example.com's password: <userinput>*******</userinput>
+COPYRIGHT 100% |*****************************| 4735
+00:00
+&prompt.root;</screen>
+ <para>由于先前的例子中已经保存了指纹, 使用 &man.scp.1;
+ 时会自动地加以验证。</para>
+
+ <para>&man.scp.1; 使用的参数同
+ &man.cp.1; 类似。 第一个参数是一个或一组文件,
+ 然后是复制的目标。 由于文件是通过 SSH 在网上传递的,
+ 因此某些文件的名字需要写成
+ <option>用户名@主机名:&lt;远程文件路径&gt;</option>。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>配置</title>
+ <indexterm>
+ <primary>OpenSSH</primary>
+ <secondary>配置</secondary>
+ </indexterm>
+
+ <para>针对 <application>OpenSSH</application>
+ 服务程序和客户端的系统级配置文件在 <filename>/etc/ssh</filename>
+ 目录中。</para>
+
+ <para><filename>ssh_config</filename> 用于配置客户端的设定,
+ 而 <filename>sshd_config</filename> 则用于配置服务器端。</para>
+
+ <para>另外 <option>sshd_program</option>
+ (默认是 <filename>/usr/sbin/sshd</filename>), 以及
+ <option>sshd_flags</option> 这两个 <filename>rc.conf</filename>
+ 选项提供了更多的配置选择。</para>
+ </sect2>
+
+ <sect2>
+ <title>ssh-keygen</title>
+
+ <para>&man.ssh-keygen.1; 可以被用来生成
+ RSA 密钥对来代替使用口令验证用户的身份:</para>
+
+ <screen>&prompt.user; <userinput>ssh-keygen -t <replaceable>rsa1</replaceable></userinput>
+Initializing random number generator...
+Generating p: .++ (distance 66)
+Generating q: ..............................++ (distance 498)
+Computing the keys...
+Key generation complete.
+Enter file in which to save the key (/home/user/.ssh/identity):
+Enter passphrase:
+Enter the same passphrase again:
+Your identification has been saved in /home/user/.ssh/identity.
+...</screen>
+
+ <para>&man.ssh-keygen.1; 将产生一个公私密钥对来用于验证身份。
+ 私钥被保存到
+ <filename>~/.ssh/identity</filename>, 而公钥则保存到
+ <filename>~/.ssh/identity.pub</filename>。
+ 远程机器上的 <filename>~/.ssh/authorized_keys</filename>
+ 中必须有对应的公钥, 才能够完成身份验证过程。</para>
+
+ <para>这将允许从远程以基于 RSA 的验证来代替口令验证连接到本机上。</para>
+
+ <note><para>使用 <option>-t rsa1</option> 这个选项将创建用于 第1版 SSH 协议的
+ RSA 密钥对。 如果您希望使用用于 SSH 第2版协议的 RSA密钥对, 则应使用
+ <command>ssh-keygen -t rsa</command> 这个命令。</para></note>
+
+ <para>如果在 &man.ssh-keygen.1; 中使用了通行字,
+ 则每次使用私钥时都需要输入它。</para>
+
+ <para>另外, 还可以使用 <command>ssh-keygen -t dsa</command> 来创建一个用于第2版
+ SSH 协议的 DSA 密钥。
+ 这将生成一对 DSA 公/私钥, 并且只能用于第2版的 SSH 协议会话。
+ 公钥将保存为 <filename>~/.ssh/id_dsa.pub</filename>,
+ 而私钥保存为 <filename>~/.ssh/id_dsa</filename>。</para>
+
+ <para>DSA 公钥也应该放到远程主机的
+ <filename>~/.ssh/authorized_keys</filename> 里面。</para>
+
+ <para>&man.ssh-agent.1; 和 &man.ssh-add.1; 是用于管理多个受密码保护的私钥的工具。</para>
+
+ <warning><para>随版本的不同, <application>OpenSSH</application>
+ 可能会使用不同的文件和选项。
+ 为了避免出现问题, 请参考 &man.ssh-keygen.1; 联机手册。</para></warning>
+ </sect2>
+
+ <sect2 id="security-ssh-tunneling">
+ <title>SSH 隧道</title>
+ <indexterm>
+ <primary>OpenSSH</primary>
+ <secondary>隧道</secondary>
+ </indexterm>
+
+ <para><application>OpenSSH</application> 能够创建隧道以便用加密的会话来封装其他协议。</para>
+
+ <para>下面的命令告诉 &man.ssh.1; 为 <application>telnet</application> 创建一个隧道:</para>
+
+ <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5023:localhost:23 user@foo.example.com</replaceable></userinput>
+&prompt.user;</screen>
+
+ <para>上述 <command>ssh</command> 命令使用了下面这些选项:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>-2</option></term>
+
+ <listitem>
+ <para>强制 <command>ssh</command> 使用第2版的协议
+ (如果需要和较老的 SSH 一同工作请不要使用这个选项)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-N</option></term>
+
+ <listitem>
+ <para>表示不使用命令行, 或者说只使用隧道。 如果省略,
+ <command>ssh</command> 将同时初始化会话。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-f</option></term>
+
+ <listitem>
+ <para>强制 <command>ssh</command> 在后台执行。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-L</option></term>
+
+ <listitem>
+ <para>表示产生一条
+ <replaceable>本地端口:远程主机:远程端口</replaceable>
+ 形式的隧道。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>user@foo.example.com</option></term>
+
+ <listitem>
+ <para>远程 SSH 服务器。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+
+ <para>SSH 隧道通过监听
+ <hostid>localhost</hostid> 上面指定端口来完成工作。
+ 它将把本机主机/端口上街道的连接通过 SSH 连接转发到远程主机/端口。</para>
+
+ <para>本例中, 位于 <hostid>localhost</hostid> 的 <replaceable>5023</replaceable> 端口
+ 被用于转发 <hostid>localhost</hostid> 的连接到远程主机的
+ <replaceable>23</replaceable> 端口。
+ 由于 <replaceable>23</replaceable> 是 <application>telnet</application> 使用的,
+ 因此它将通过 SSH 隧道完成 <application>telnet</application> 会话。</para>
+
+ <para>这可以用来封装任意不安全的 TCP 协议, 例如
+ SMTP、 POP3、 FTP等等。</para>
+
+ <example>
+ <title>使用 SSH 为 SMTP 创建安全隧道</title>
+
+ <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5025:localhost:25 user@mailserver.example.com</replaceable></userinput>
+user@mailserver.example.com's password: <userinput>*****</userinput>
+&prompt.user; <userinput>telnet localhost 5025</userinput>
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+220 mailserver.example.com ESMTP</screen>
+
+ <para>这可以与
+ &man.ssh-keygen.1; 以及额外的用户帐号配合来建立一个更透明的 SSH
+ 隧道环境。 密钥可以被用在需要输入口令的地方, 而且可以为不同的用户配置不同的隧道。</para>
+ </example>
+
+ <sect3>
+ <title>实用的 SSH 通道例子</title>
+
+ <sect4>
+ <title>加强 POP3 服务的安全</title>
+
+ <para>工作时, 有一个允许外来连接的 SSH 服务器。
+ 同一个办公网络中有一个邮件服务器提供 POP3 服务。
+ 这个网络, 或从您家到办公室的网络可能不,
+ 或不完全可信。 基于这样的原因,
+ 您需要以安全的方式来察看邮件。
+ 解决方法是创建一个到办公室 SSH 服务器的连接,
+ 并通过这个连接来访问 POP3 服务:</para>
+
+ <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>2110:mail.example.com:110 user@ssh-server.example.com</replaceable></userinput>
+user@ssh-server.example.com's password: <userinput>******</userinput></screen>
+
+ <para>当这个通道连上时, 您可以把 POP3 请求发到
+ <hostid>localhost</hostid> 端口 2110。
+ 这个连接将通过通道安全地转发到
+ <hostid>mail.example.com</hostid>。</para>
+ </sect4>
+
+ <sect4>
+ <title>绕过严厉的防火墙</title>
+
+ <para>一些大脑长包的网络管理员会使用一些极端的防火墙策略,
+ 不仅过滤进入的连接, 而且也过滤连出的连接。
+ 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行
+ SSH 和网页浏览。</para>
+
+ <para>您可能希望访问一些其它的 (也许与工作无关的) 服务,
+ 例如提供流式音乐的 Ogg Vorbis 服务器。
+ 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐,
+ 则您将无法访问它。</para>
+
+ <para>解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH
+ 服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。</para>
+
+ <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>8888:music.example.com:8000 user@unfirewalled-system.example.org</replaceable></userinput>
+user@unfirewalled-system.example.org's password: <userinput>*******</userinput></screen>
+
+ <para>现在您可以把客户程序指定到
+ <hostid>localhost</hostid> 的 8888 端口, 它将把请求转发给
+ <hostid>music.example.com</hostid> 的 8000
+ 端口, 从而绕过防火墙。</para>
+ </sect4>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>进一步的资料</title>
+ <para><ulink url="http://www.openssh.com/">OpenSSH</ulink></para>
+ <para>&man.ssh.1; &man.scp.1; &man.ssh-keygen.1;
+ &man.ssh-agent.1; &man.ssh-add.1;</para>
+ <para>&man.sshd.8; &man.sftp-server.8;</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="fs-acl">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>作者 </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <indexterm>
+ <primary>ACL</primary>
+ </indexterm>
+ <title>文件系统访问控制表</title>
+
+ <para>与文件系统在其他方面的加强, 如快照等一道, FreeBSD 5.0
+ 及更高版本提供了通过文件系统访问控制表
+ (<acronym>ACLs</acronym>) 实现的安全机制。</para>
+
+ <para>访问控制表以高度兼容 (&posix;.1e) 的方式扩展了标准的 &unix;
+ 权限模型。 这一特性使得管理员能够利用其优势设计更为复杂的安全模型。</para>
+
+ <para>如果想为 <acronym>UFS</acronym> 文件系统启用 <acronym>ACL</acronym>
+ 支持, 则需要添加下列选项:</para>
+
+ <programlisting>options UFS_ACL</programlisting>
+
+ <para>并重新编译内核。 如果这个选项没有编译进内核,
+ 则在挂接支持 <acronym>ACL</acronym> 的文件系统时将会收到警告。
+ 这个选项在 <filename>GENERIC</filename> 内核中已经包含了。
+ <acronym>ACL</acronym> 依赖于在文件系统上启用扩展属性。
+ 在新一代的
+ &unix; file system, <acronym>UFS2</acronym> 中内建了这种支持。</para>
+
+ <note><para>在 <acronym>UFS1</acronym> 上配置扩展属性需要比 <acronym>UFS2</acronym>
+ 更多的管理开销。 在 <acronym>UFS2</acronym> 上的扩展属性的性能也要高不少。
+ 因此, 如果想要使用访问控制表, 推荐使用 <acronym>UFS2</acronym>
+ 而不是 <acronym>UFS1</acronym>。</para></note>
+
+ <para><acronym>ACL</acronym> 可以在挂接时通过选项
+ <option>acls</option> 来启动, 它可以加入 <filename>/etc/fstab</filename>。
+ 另外, 也可以通过使用 &man.tunefs.8; 修改超级块中的 <acronym>ACL</acronym>
+ 标记来持久性地设置自动的挂接属性。 一般而言, 后一种方法是推荐的做法,
+ 其原因是:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>挂接时的 <acronym>ACL</acronym> 标记无法被重挂接
+ (&man.mount.8; <option>-u</option>) 改变, 只有完整地
+ &man.umount.8; 并做一次新的 &man.mount.8; 才能改变它。
+ 这意味着 <acronym>ACLs</acronym> 状态在系统启动之后就不可能在 root 文件系统上发生变化了。
+ 另外也没有办法改变正在使用的文件系统的这个状态。</para>
+ </listitem>
+
+ <listitem>
+ <para>在超级块中的设置将使得文件系统总被以启用
+ <acronym>ACLs</acronym> 的方式挂接, 即使在
+ <filename>fstab</filename> 中的对应项目没有作设置, 或设备顺序发生变化时也是如此。
+ 这避免了不慎将文件系统以没有启用 <acronym>ACLs</acronym> 的状态挂接,
+ 从而避免没有强制 <acronym>ACLs</acronym> 这样的安全问题。</para>
+ </listitem>
+ </itemizedlist>
+
+ <note><para>可以修改 <acronym>ACL</acronym> 行为, 以允许在没有执行一次全新的
+ &man.mount.8; 的情况下启用它, 但我们认为不鼓励在不启用
+ <acronym>ACL</acronym> 的时候这么做是有必要的, 因为如果启用了
+ <acronym>ACL</acronym>, 然后关掉它, 然后在没有刷新扩展属性的情况下重新启用它是很容易造成问题的。
+ 一般而言, 一旦启用了文件系统的 <acronym>ACLs</acronym> 就不应该再关掉它,
+ 因为此时的文件系统的保护措施可能和用户所期待的样子不再兼容,
+ 而重新启用 <acronym>ACL</acronym> 将重新把先前的
+ <acronym>ACL</acronym> 附着到文件上, 而由于它们的权限发生了变化,
+ 就很可能造成无法预期的行为。</para></note>
+
+ <para>在察看目录时, 启用了 <acronym>ACLs</acronym> 的文件将在通常的属性后面显示 <literal>+</literal>
+ (加号)。 例如:</para>
+
+ <programlisting>drwx------ 2 robert robert 512 Dec 27 11:54 private
+drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1
+drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2
+drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3
+drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting>
+
+ <para>这里我们看到了 <filename>directory1</filename>,
+ <filename>directory2</filename>, 以及 <filename>directory3</filename>
+ 目录使用了 <acronym>ACLs</acronym>。 而
+ <filename>public_html</filename> 则没有。</para>
+
+ <sect2>
+ <title>使用 <acronym>ACL</acronym></title>
+
+ <para>文件系统 <acronym>ACL</acronym> 可以使用
+ &man.getfacl.1; 工具来查看。 例如, 如果想查看 <filename>test</filename> 的
+ <acronym>ACL</acronym> 设置, 所用的命令是:</para>
+
+ <screen>&prompt.user; <userinput>getfacl <filename>test</filename></userinput>
+ #file:
+ #owner:1001
+ #group:1001
+ user::rw-
+ group::r--
+ other::r--</screen>
+
+ <para>要修改这个文件上的 <acronym>ACL</acronym> 设置,
+ 则需要使用 &man.setfacl.1; 工具。 例如:</para>
+
+ <screen>&prompt.user; <userinput>setfacl -k <filename>test</filename></userinput></screen>
+
+ <para><option>-k</option> 参数将把所有当前定义的
+ <acronym>ACL</acronym> 从文件或文件系统中删除。
+ 一般来说应该使用 <option>-b</option> 因为它会保持让
+ <acronym>ACL</acronym> 正常工作的那些项不变。</para>
+
+ <screen>&prompt.user; <userinput>setfacl -m u:trhodes:rwx,group:web:r--,o::--- <filename>test</filename></userinput></screen>
+
+ <para>在前面的命令中, <literal>-m</literal>
+ 选项被用来修改默认的 <acronym>ACL</acronym> 项。由于已经被先前的命令
+ 删除,因此没有预先定义的项,于是默认的选项被恢复,并附加上指定的选项。
+ 请小心地检查,如果您加入了一个不存在的用户或组,那么将会在
+ <devicename>stdout</devicename> 得到一条 <errorname>Invalid argument</errorname>
+ 的错误提示。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="security-advisories">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>作者 </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <indexterm>
+ <primary>FreeBSD 安全公告</primary>
+ </indexterm>
+ <title>&os; 安全公告</title>
+
+ <para>像其它具有产品级品质的操作系统一样, &os; 会发布
+ <quote>安全公告</quote>。
+ 通常这类公告会只有在在相应的发行版本已经正确地打过补丁之后发到安全邮件列表并在勘误中说明。
+ 本节将介绍什么是安全公告, 如何理解它, 以及为系统打补丁的具体步骤。</para>
+
+ <sect2>
+ <title>安全公告看上去是什么样子?</title>
+
+ <para>&os; 安全公告的样式类似下面的范例, 这一例子来自
+ &a.security-notifications.name; 邮件列表。</para>
+
+ <programlisting>=============================================================================
+&os;-SA-XX:XX.UTIL Security Advisory
+ The &os; Project
+
+Topic: denial of service due to some problem<co id="co-topic">
+
+Category: core<co id="co-category">
+Module: sys<co id="co-module">
+Announced: 2003-09-23<co id="co-announce">
+Credits: Person@EMAIL-ADDRESS<co id="co-credit">
+Affects: All releases of &os;<co id="co-affects">
+ &os; 4-STABLE prior to the correction date
+Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE)
+ 2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6)
+ 2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15)
+ 2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8)
+ 2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18)
+ 2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21)
+ 2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33)
+ 2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43)
+ 2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39)<co id="co-corrected">
+&os; only: NO<co id="co-only">
+
+For general information regarding FreeBSD Security Advisories,
+including descriptions of the fields above, security branches, and the
+following sections, please visit
+http://www.FreeBSD.org/security/.
+
+I. Background<co id="co-backround">
+
+
+II. Problem Description<co id="co-descript">
+
+
+III. Impact<co id="co-impact">
+
+
+IV. Workaround<co id="co-workaround">
+
+
+V. Solution<co id="co-solution">
+
+
+VI. Correction details<co id="co-details">
+
+
+VII. References<co id="co-ref"></programlisting>
+
+
+ <calloutlist>
+ <callout arearefs="co-topic">
+ <para><literal>Topic</literal>(标题) 一栏说明了问题到底是什么。
+ 它基本上是对所发现的安全问题及其所涉及的工具的描述。</para>
+ </callout>
+
+ <callout arearefs="co-category">
+ <para><literal>Category</literal>(分类) 是指系统的哪一部分受到影响,
+ 这一栏可能是 <literal>core</literal>, <literal>contrib</literal>,或
+ <literal>ports</literal> 之一。 <literal>core</literal>
+ 分类表示安全弱点影响到了 &os; 操作系统的某个核心组件。
+ <literal>contrib</literal> 分类表示弱点存在于某个捐赠给
+ &os; Project 的软件, 例如
+ <application>sendmail</application>。
+ 最后是 <literal>ports</literal>, 它表示该弱点影响了 ports
+ collection 中的某个第三方软件。</para>
+ </callout>
+
+ <callout arearefs="co-module">
+ <para><literal>Module</literal>(模块) 一栏给出了组件的具体位置,
+ 例如 <literal>sys</literal>。 在这个例子中, 可以看到
+ <literal>sys</literal> 模块是存在问题的; 因此,
+ 这个漏洞会影响某个在内核中的组件。</para>
+ </callout>
+
+ <callout arearefs="co-announce">
+ <para><literal>Announced</literal>(发布时间) 一栏反映了与安全公告有关的数据是什么时候公之于众的。
+ 这说明安全团队已经证实问题确实存在, 而补丁已经写入了 &os;
+ 的代码库。</para>
+ </callout>
+
+ <callout arearefs="co-credit">
+ <para><literal>Credits</literal>(作者) 一栏给出了注意到问题存在并报告它的个人或团体。</para>
+ </callout>
+
+ <callout arearefs="co-affects">
+ <para>The <literal>Affects</literal>(影响范围) 一栏给出了 &os; 的那些版本存在这个漏洞。
+ 对于内核来说, 检视受影响的文件上执行的 <command>ident</command> 输出可以帮助确认文件版本。
+ 对于 ports, 版本号在 <filename>/var/db/pkg</filename> 里面的 port 的名字后面列出。
+ 如果系统没有与 &os; <acronym>CVS</acronym> 代码库同步并每日构建,
+ 它很可能是有问题的。</para>
+ </callout>
+
+ <callout arearefs="co-corrected">
+ <para><literal>Corrected</literal>(修正时间) 一栏给出了发行版本中修正问题的具体日期、时间和时差。</para>
+ </callout>
+
+ <callout arearefs="co-only">
+ <para><literal>&os; only</literal>(仅 &os;) 一栏说明了漏洞是否只影响
+ &os;, 还是也影响一些其它操作系统。</para>
+ </callout>
+
+ <callout arearefs="co-backround">
+ <para><literal>Background</literal>(技术背景) 一栏提供了受影响的组件的作用。
+ 多数时候这一部分会说明为什么 &os; 中包含了它, 它的作用, 以及它的一些原理。</para>
+ </callout>
+
+ <callout arearefs="co-descript">
+ <para><literal>Problem Description</literal>(问题描述) 一栏深入阐述安全漏洞的技术细节。
+ 这部分有时会包括有问题的代码相关的详细情况,
+ 甚至是这个部件如何能够被恶意利用并打开漏洞的细节。</para>
+ </callout>
+
+ <callout arearefs="co-impact">
+ <para><literal>Impact</literal>(影响) 一栏描述了问题能够造成的影响类型。
+ 例如, 可能导致拒绝服务攻击, 权限提升, 甚至导致得到超级用户的权限。</para>
+ </callout>
+
+ <callout arearefs="co-workaround">
+ <para><literal>Workaround</literal>(应急方案) 一栏给出了系统管理员在暂时无法升级系统时可以采取的临时性对策。
+ 这些原因可能包括时间限制, 网络资源的限制, 或其它因素。
+ 不过无论如何, 安全不能够被轻视, 有问题的系统要么应该打补丁,
+ 要么应该实施这种应急方案。</para>
+ </callout>
+
+ <callout arearefs="co-solution">
+ <para><literal>Solution</literal>(解决方案) 一栏提供了如何给有问题的系统打补丁的方法。
+ 这是经过逐步测试和验证过的给系统打补丁并让其安全地工作的方法。</para>
+ </callout>
+
+ <callout arearefs="co-details">
+ <para>=<literal>Correction Details</literal>(修正细节) 一栏展示了针对
+ <acronym>CVS</acronym> 分支或某个发行版的修正特征。
+ 同时也提供了每个分支上相关文件的版本号。</para>
+ </callout>
+
+ <callout arearefs="co-ref">
+ <para><literal>References</literal>(文献) 一栏通常会给出其它信息的来源。
+ 这可能包括 <acronym>URL</acronym>, 书籍、 邮件列表以及新闻组。</para>
+ </callout>
+ </calloutlist>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/serialcomms/Makefile b/zh_CN.GB2312/books/handbook/serialcomms/Makefile
new file mode 100644
index 0000000000..e3cc528c84
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/serialcomms/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= serialcomms/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml
new file mode 100644
index 0000000000..00bdbda953
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml
@@ -0,0 +1,2301 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.95
+ $FreeBSD$
+-->
+
+<chapter id="serialcomms">
+ <title>串口通讯</title>
+
+ <sect1 id="serial-synopsis">
+ <title>概述</title>
+
+ <indexterm><primary>串口通讯</primary></indexterm>
+ <para>&unix; 一直都是支持串口通讯的。事实上,
+ 早期的 &unix; 系统就是利用串行线来输入和输出数据的。
+ 那时常见的 <quote>终端</quote> 包括一个每秒10个字符的串行打印机和键盘,
+ 现在这些已经发生了很大的变化。 这章将介绍一些利用 FreeBSD
+ 进行串行通讯的方法。</para>
+
+ <para>读完这章,您将了解到:</para>
+ <itemizedlist>
+ <listitem><para>如何通过终端连接到您的FreeBSD系统。</para></listitem>
+ <listitem><para>如何使用modem拨号到远程主机。</para></listitem>
+ <listitem><para>如何允许远程用户通过modem登录到您的系统。</para></listitem>
+ <listitem><para>如何从串行控制台引导您的系统。</para></listitem>
+ </itemizedlist>
+
+ <para>阅读这章之前,您应当了解:</para>
+ <itemizedlist>
+ <listitem><para>如何配置和安装一个新的内核。(<xref
+ linkend="kernelconfig">)。</para></listitem>
+ <listitem><para>理解UNIX的权限和进程(<xref linkend="basics">)。</para></listitem>
+ <listitem><para>准备您打算使用的串行设备 (modem或多插口卡)
+ 的技术参考手册。</para></listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="serial">
+ <title>介绍</title>
+
+ <!-- XXX Write me! -->
+
+ <sect2 id="serial-terminology">
+ <title>术语</title>
+
+ <variablelist>
+ <indexterm><primary>bits-per-second</primary></indexterm>
+ <varlistentry>
+ <term>bps</term>
+ <listitem>
+ <para>每秒位&mdash; 数据的传输速度</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>DTE</term>
+ <indexterm><primary>DTE</primary></indexterm>
+ <listitem>
+ <para>数据终端设备 &mdash; 如您的计算机</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>DCE</term>
+ <indexterm><primary>DCE</primary></indexterm>
+ <listitem>
+ <para>数据通讯设备 &mdash; 如您的modem</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>RS-232</term>
+ <indexterm><primary>RS-232C cables</primary></indexterm>
+ <listitem>
+ <para>用于硬件串行通讯的EIA标准</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>当讨论通讯数据速度的时候,这节不会使用术语
+ <quote>baud</quote>。Baud指电气标准传输率,它已经使用了很长时间,
+ 而 <quote>bps</quote> (bits per second) 才是正确使用的术语
+ (至少它不会打扰那些爱争吵的家伙)。</para>
+ </sect2>
+
+ <sect2 id="serial-cables-ports">
+ <title>线缆和端口</title>
+
+ <para>要连接 modem 或终端到您的 FreeBSD 系统,
+ 您需要有一个串口以及连接到您串行设备所需的线缆。
+ 如果您比较熟悉硬件和它要求的线缆, 则可以跳过这节。</para>
+
+ <sect3 id="term-cables">
+ <title>线缆</title>
+
+ <para>有好几种不同的串行线缆。 两个最普通的类型是 null-modem
+ 线缆和标准RS-232线缆。 您硬件的规格说明会有详细描述。</para>
+
+ <sect4 id="term-cables-null">
+ <title>Null-modem线缆</title>
+
+ <indexterm>
+ <primary>null-modem cable</primary>
+ </indexterm>
+ <para>一根null-modem线缆会直接通过像 <quote>地信号</quote>
+ 这样的信号,而转换其他的信号。 例如,
+ <quote>数据发送</quote> 连到对端的
+ <quote>数据接收</quote> 引脚上。</para>
+
+ <para>如果需要, 您可以自己做一个null-modem的线缆。
+ 下面这个表列出了这个线缆 DB-25 头上的 RS-232C 信号名和引脚标号。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="5">
+ <thead>
+ <row>
+ <entry>信号</entry>
+ <entry>引脚 #</entry>
+ <entry></entry>
+ <entry>引脚 #</entry>
+ <entry>信号</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>SG</entry>
+ <entry>7</entry>
+ <entry>连接到</entry>
+ <entry>7</entry>
+ <entry>SG</entry>
+ </row>
+
+ <row>
+ <entry>TD</entry>
+ <entry>2</entry>
+ <entry>连接到</entry>
+ <entry>3</entry>
+ <entry>RD</entry>
+ </row>
+
+ <row>
+ <entry>RD</entry>
+ <entry>3</entry>
+ <entry>连接到</entry>
+ <entry>2</entry>
+ <entry>TD</entry>
+ </row>
+
+ <row>
+ <entry>RTS</entry>
+ <entry>4</entry>
+ <entry>连接到</entry>
+ <entry>5</entry>
+ <entry>CTS</entry>
+ </row>
+
+ <row>
+ <entry>CTS</entry>
+ <entry>5</entry>
+ <entry>连接到</entry>
+ <entry>4</entry>
+ <entry>RTS</entry>
+ </row>
+
+ <row>
+ <entry>DTR</entry>
+ <entry>20</entry>
+ <entry>连接到</entry>
+ <entry>6</entry>
+ <entry>DSR</entry>
+ </row>
+
+ <row>
+ <entry>DCD</entry>
+ <entry>8</entry>
+ <entry></entry>
+ <entry>6</entry>
+ <entry>DSR</entry>
+ </row>
+
+ <row>
+ <entry>DSR</entry>
+ <entry>6</entry>
+ <entry>连接到</entry>
+ <entry>20</entry>
+ <entry>DTR</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <note>
+ <para>在连接头里面连接好<quote>数据发送就绪</quote> (DSR)和
+ <quote>载波检测</quote> (DCD) 两个信号,然后连接到对端的
+ <quote>数据终端就绪</quote> (DTR)。</para>
+ </note>
+ </sect4>
+
+ <sect4 id="term-cables-std">
+ <title>标准RS-232C线缆</title>
+ <indexterm><primary>RS-232C cables</primary></indexterm>
+
+ <para>一个标准的串行线缆会直接通过所有的RS-232C信号。
+ 这是连接一个modem到您的 FreeBSD 系统的线缆类型,
+ 线缆的类型需要针对一些终端。</para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="term-ports">
+ <title>端口</title>
+
+ <para>串行端口是FreeBSD主机与终端传输数据的设备。
+ 这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。</para>
+
+ <sect4 id="term-portkinds">
+ <title>端口的种类</title>
+
+ <para>存在好几种端口。 在购买和做线缆之前,
+ 您需要确定它是否适合您机器的终端。</para>
+
+ <para>绝大多数的终端有DB25端口。个人计算机, 也包括运行 FreeBSD
+ 的PC机, 通常都会有 DB25 或 DB9 插口。
+ 如果您的计算机有一个多插口的串口卡,
+ 则可以使用RJ-12 或RJ-45端口。</para>
+
+ <para>请仔细看看硬件的说明, 此外您也可以通过外观了解是什么插口。</para>
+ </sect4>
+
+ <sect4 id="term-portnames">
+ <title>端口名称Port Names</title>
+
+ <para>在FreeBSD中,您可以通过 <filename>/dev</filename>
+ 目录中的一个记录来访问每个串行端口。有两种不同的记录:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>呼入端口被命名为<filename>/dev/ttyd<replaceable>N</replaceable></filename>,
+ 这里 <replaceable>N</replaceable> 是端口号,从零开始。
+ 通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测
+ (DCD) 信号来工作。</para>
+ </listitem>
+
+ <listitem>
+ <para>呼出端口被命名为 <filename>/dev/cuaa<replaceable>N</replaceable></filename>。
+ 您通常不使用呼出端口作为终端, 只使用modem。
+ 如果串行线或终端不支持载波检测数据传输,
+ 您可以使用呼出端口。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您已经连接一个终端到第一个串行端口 (在 &ms-dos;
+ 上是<devicename>COM1</devicename>),
+ 则可以使用 <filename>/dev/ttyd0</filename> 来作为终端。
+ 如果它是在第二个串行端口 (<devicename>COM2</devicename>),
+ 那就是 <filename>/dev/ttyd1</filename>,等等。</para>
+
+ </sect4>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>内核配置</title>
+
+ <para>FreeBSD默认支持4个串行端口。在&ms-dos;下,这些是
+ <devicename>COM1</devicename>,
+ <devicename>COM2</devicename>,
+ <devicename>COM3</devicename>,
+ 和
+ <devicename>COM4</devicename>。FreeBSD当前支持 <quote>dumb</quote>
+ 多插口串行接口卡,如 BocaBoard 1008 和 2016,与许多 Digiboard
+ 和 Stallion Technologies 制造的智能多接口卡一样好。 然而,
+ 默认的内核只会寻找标准的COM端口。</para>
+
+ <para>要看看您的内核是否支持您的串口,只要在内核启动时查看一下启动信息,
+ 或使用 <command>/sbin/dmesg</command> 命令重新检测内核启动信息。
+ 特别的,寻找以<literal>sio</literal>字符启动的信息。</para>
+
+ <tip><para>提示:要看看带有<literal>sio</literal>字符的信息,
+ 可以使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>/sbin/dmesg | grep 'sio'</userinput></screen>
+ </tip>
+
+ <para>例如,在一个带有4个串口的系统上,这些是串口特定的内核启动信息:</para>
+
+ <screen>sio0 at 0x3f8-0x3ff irq 4 on isa
+sio0: type 16550A
+sio1 at 0x2f8-0x2ff irq 3 on isa
+sio1: type 16550A
+sio2 at 0x3e8-0x3ef irq 5 on isa
+sio2: type 16550A
+sio3 at 0x2e8-0x2ef irq 9 on isa
+sio3: type 16550A</screen>
+
+ <para>如果您的内核没有认出您的所有串口,您需要为您的系统定制内核。
+ 更多有关配置内核的细节,可以看看第9章<xref
+ linkend="kernelconfig">。</para>
+
+ <para>在您的内核配置文件中相关的设备行是这样的,FreeBSD&nbsp;4.X:</para>
+
+ <programlisting>
+device sio0 at isa? port port IO_COM1 irq 4
+device sio1 at isa? port port IO_COM2 irq 3
+device sio2 at isa? port IO_COM3 irq 5
+device sio3 at isa? port IO_COM4 irq 9</programlisting>
+
+
+ <para>FreeBSD&nbsp;5.X:</para>
+
+ <programlisting>device sio</programlisting>
+
+ <para>您可以注释掉或完全删除您没有的设备。 FreeBSD&nbsp;5.X 需要修改
+ <filename>/boot/device.hints</filename>文件。请看看 &man.sio.4;
+ 的有关如何为您的多插口主板写入配置信息的联机手册。
+ 如果您使用了一个不同版本的 FreeBSD 的配置文件,请小心点,
+ 因为设备的标记在两个版本之间已经改变了。</para>
+
+ <note>
+ <para>这里端口 <literal>IO_COM1</literal> 代替了
+ <literal>0x3f8</literal>,端口 <literal>IO_COM2</literal> 代替了
+ <literal>0x2f8</literal>,端口 <literal>IO_COM3</literal> 代替了
+ <literal>0x3e8</literal>,端口 <literal>IO_COM4</literal> 代替了
+ <literal>0x2e8</literal>,这些都是各自端口相应的端口地址。
+ 中断4,3,5,9都是经常用的中断。也要注意有些正常的串行端口可能
+ <emphasis>无法</emphasis> 在一些ISA总线的PC上共享中断
+ (多插口板卡有板载的电子设备,允许在板上所有 16550A
+ 的设备共享一个或两个中断请求)。</para>
+ </note>
+
+ </sect2>
+
+ <sect2>
+ <title>设备指定文件</title>
+
+ <para>内核中的绝大多数设备可以通过 <quote>设备特殊文件</quote> 来访问,
+ 它就在<filename>/dev</filename>目录下。
+ <devicename>sio</devicename> 设备通过
+ <filename>/dev/ttyd<replaceable>N</replaceable></filename> (拨入)和
+ <filename>/dev/cuaa<replaceable>N</replaceable></filename> (拨出)
+ 设备来访问。 FreeBSD 也提供了初始化的设备
+ (<filename>/dev/ttyid<replaceable>N</replaceable></filename> 和
+ <filename>/dev/cuaia<replaceable>N</replaceable></filename>) 以及锁定的设备
+ (<filename>/dev/ttyld<replaceable>N</replaceable></filename> 和
+ <filename>/dev/cuala<replaceable>N</replaceable></filename>)。
+ 初始化的设备在每次端口被打开时被用来初始化设备通讯端口参数。
+ 例如使用 <literal>RTS/CTS</literal> 的流控制信号的
+ <literal>crts</literal>的调制解调器。
+ 锁定设备用来锁定端口的标记以阻止用户或程序改变某个参数。
+ 参见 &man.termios.4;、&man.sio.4; 以及 &man.stty.1;
+ 联机手册了解更多信息。</para>
+
+ <sect3>
+ <title>编译设备指定文件</title>
+
+ <note><para>从 FreeBSD&nbsp;5.0 开始, &man.devfs.5;
+ 文件系统将根据需要创建设备节点。 如果您在运行启用
+ <literal>devfs</literal> 的FreeBSD版本,
+ 您就可以跳过这一节。</para></note>
+
+ <para>一个在<filename>/dev</filename> 目录下的叫做
+ <command>MAKEDEV</command> 的 shell 脚本管理着设备指定文件。
+ 要使用 <command>MAKEDEV</command> 来建立拨号设备指定文件,
+ 可以使用 <devicename>COM1</devicename>: (port 0),
+ <command>cd</command> 进入 <filename>/dev</filename>,
+ 然后执行命令 <command>MAKEDEV ttyd0</command>。
+ 同样地,要建立拨号设备指定文件以使用
+ <devicename>COM2</devicename>: (port 1),
+ 可以执行 <command>MAKEDEV ttyd1</command>。</para>
+
+ <para><command>MAKEDEV</command> 不仅仅创建
+ <filename>/dev/ttyd<replaceable>N</replaceable></filename> 设备指定文件,也创建
+ <filename>/dev/cuaa<replaceable>N</replaceable></filename>,
+ <filename>/dev/cuaia<replaceable>N</replaceable></filename>,
+ <filename>/dev/cuala<replaceable>N</replaceable></filename>,
+ <filename>/dev/ttyld<replaceable>N</replaceable></filename>, 以及
+ <filename>/dev/ttyid<replaceable>N</replaceable></filename>节点。</para>
+
+ <para>建立完新设备指定文件后, 需要检查文件的权限来确定谁可以在这些文件上读写
+ &mdash; 您可能不想让普通的用户使用您的 modem 吧。
+ 在<filename>/dev/cua*</filename>文件上的默认权限应该是足够了:</para>
+
+ <screen>crw-rw---- 1 uucp dialer 28, 129 Feb 15 14:38 /dev/cuaa1
+crw-rw---- 1 uucp dialer 28, 161 Feb 15 14:38 /dev/cuaia1
+crw-rw---- 1 uucp dialer 28, 193 Feb 15 14:38 /dev/cuala1</screen>
+
+ <para>这些许可允许用户<username>uucp</username>和在组<username>dialer</username>
+ 上的用户使用呼出设备。</para>
+ </sect3>
+ </sect2>
+
+
+ <sect2 id="serial-hw-config">
+ <title>串行端口配置</title>
+
+ <indexterm><primary><devicename>ttyd</devicename></primary></indexterm>
+ <indexterm><primary><devicename>cuaa</devicename></primary></indexterm>
+
+ <para><devicename>ttyd<replaceable>N</replaceable></devicename> (或<devicename>cuaa<replaceable>N</replaceable></devicename>)
+ 设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时,
+ 它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置:</para>
+
+ <screen>&prompt.root; <userinput>stty -a -f /dev/ttyd1</userinput></screen>
+
+ <para>当您修改了这个设备的设置,这个设置会生效,除非设备被关闭。
+ 当它被重新打开时,它将回到默认设置。 要修改默认设置,您可以打开和调整
+ <quote>初始状态</quote> 设备的设置。例如,
+ 要为<devicename>ttyd5</devicename> 打开
+ <option>CLOCAL</option> 模式,8位通讯和默认的 <option>XON/XOFF</option> 流控制,
+ 输入:</para>
+
+ <screen>&prompt.root; <userinput>stty -f /dev/ttyid5 clocal cs8 ixon ixoff</userinput></screen>
+
+ <indexterm>
+ <primary>rc files</primary>
+ <secondary><filename>rc.serial</filename></secondary>
+ </indexterm>
+
+ <!-- XXX; /etc/rc.serial is gone in 5.1.
+ How do you set default parameters for these devices in 5.X ? -->
+
+ <para>串行设备的系统初始化是用<filename>/etc/rc.serial</filename>文件类控制的。
+ 这个文件会影响串行设备的默认设置。</para>
+
+ <para>要防止某个设置被一个应用程序所修改,需要调整 <quote>锁状态</quote>设备。
+ 例如,要锁定<devicename>ttyd5</devicename> 的速度为57600&nbsp;bit/s,
+ 键入:</para>
+
+ <screen>&prompt.root; <userinput>stty -f /dev/ttyld5 57600</userinput></screen>
+
+ <para>现在,一个打开<devicename>ttyd5</devicename>
+ 和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地,
+ 您需要确定初始状态,然后用root帐户锁定状态设备的写入功能。</para>
+
+ <indexterm>
+ <primary><command>MAKEDEV</command></primary>
+ </indexterm>
+ <para>很显然,您应该只让 <username>root</username>
+ 用户可以初始化或锁定设备的状态。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="term">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Sean</firstname>
+ <surname>Kelly</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ <!-- 28 July 1996 -->
+ </authorgroup>
+ </sect1info>
+ <title>终端</title>
+
+ <indexterm><primary>终端</primary></indexterm>
+
+ <para>当您在计算机控制台或是在一个连接的网络上时,
+ 终端提供了一个方便和低成本的访问FreeBSD系统的方法。
+ 这节描述了如何在FreeBSD上使用终端。</para>
+
+ <sect2 id="term-uses">
+ <title>终端的用法和类型</title>
+
+ <para>早期的 &unix; 系统没有控制台。
+ 人们通过将终端连接到计算机的串口来登录和使用程序。
+ 它很像用 modem 和一些终端软件来拨号进入一个远程的系统,
+ 只能执行文本的工作。</para>
+
+ <para>今天的 PC 已经可以使用高质量的图形了,
+ 但与今天的其他&unix;操作系统一样,建立一个登录会话的能力仍然存在。
+ 通过使用一个终端连接到一个没有使用的串口,
+ 您就能登录和运行任何文本程序或在 X 视窗系统中运行一个
+ <command>xterm</command> 窗口程序。</para>
+
+ <para>对于商业用户,您可以把任何终端连接到 FreeBSD 系统,
+ 然后把它们放在员工的桌面上。 对于家庭用户,则可以使用一台比较老的
+ IBM PC 或 Macintosh 运行一个终端连接到一台运行 FreeBSD
+ 的高性能机器上。</para>
+
+ <para>对于FreeBSD,有三种终端:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><link linkend="term-dumb">哑终端</link></para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="term-pcs">充当终端的PC</link></para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="term-x">X 终端</link></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>下面一小节将描述每一种终端。</para>
+
+ <sect3 id="term-dumb">
+ <title>哑终端</title>
+
+ <para>哑终端需要专门的好几种硬件,让您通过串行线连接到计算机。
+ 它们被叫做 <quote>哑</quote> 是因为它们只能够用来显示,
+ 发送和接收文本。 您不能在它上面运行任何程序。</para>
+
+ <para>有好几百种哑终端,包括Digital Equipment Corporation
+ 的VT-100和Wyse的WY-75。只有几种可以在FreeBSD上工作。
+ 一些高端的终端可以显示图形,但只有某些软件包可以使用这些高级特性。</para>
+
+ <para>哑终端被广泛用于那些不需要图形应用的工作中。</para>
+ </sect3>
+
+ <sect3 id="term-pcs">
+ <title>充当终端的PC</title>
+
+ <para>如果一个 <link linkend="term-dumb">哑终端</link>
+ 有足够的能力来显示,发送和接收文本,
+ 那任何个人计算机都可以作为一个哑终端。
+ 您所需要的只是适当的线缆和一些终端模拟软件。</para>
+
+ <para>这样一个配置被广泛运用于家庭。例如,如果您的妻子忙于在您的
+ FreeBSD 系统控制台上工作,您也可以从一台低档的个人计算机登录到
+ FreeBSD 系统执行一些文本的工作。</para>
+ </sect3>
+
+ <sect3 id="term-x">
+ <title>X 终端</title>
+
+ <para>X终端是最复杂的终端系统。它们通常需要使用以太网来连接。
+ 它们能显示任何X应用程序。</para>
+
+ <para>我们介绍X终端只是为了感兴趣。然而,
+ 这章<emphasis>不会</emphasis>涉及X终端的安装,配置或使用。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="term-config">
+ <title>配置</title>
+
+ <para>这节描述了您在一个终端上启用一个登录会话,需要在 FreeBSD
+ 系统上配置些什么。假设您已经配置好了内核来支持串行端口,您就可以连接了。</para>
+
+ <para>在 <xref linkend="boot"> 中曾经提到, <command>init</command>
+ 进程依赖于系统启动时所有的处理控制和初始化。
+ 通过 <command>init</command> 来执行的一些任务将先读取
+ <filename>/etc/ttys</filename>文件,
+ 然后在可用的终端上启用一个 <command>getty</command> 进程。
+ <command>getty</command> 进程可用来阅读一个登录名和启动
+ <command>login</command>程序。</para>
+
+ <para>然而,要为您的FreeBSD系统配置终端,您需要以
+ <username>root</username> 身份执行下面的步骤:</para>
+
+ <procedure>
+ <step>
+ <para>如果它不在那儿,您需要为串行端口在
+ <filename>/dev</filename>目录下添加一行记录到
+ <filename>/etc/ttys</filename>。</para>
+ </step>
+
+ <step>
+ <para>指定 <command>/usr/libexec/getty</command> 在端口上运行,
+ 然后从 <filename>/etc/gettytab</filename> 文件指定适当的
+ <replaceable>getty</replaceable> 类型。</para>
+ </step>
+
+ <step>
+ <para>指定默认的终端类型。</para>
+ </step>
+
+ <step>
+ <para>设置端口为 <quote>on</quote>。</para>
+ </step>
+
+ <step>
+ <para>确定端口是否为 <quote>secure</quote>。</para>
+ </step>
+
+ <step>
+ <para>迫使<command>init</command> 重新读取
+ <filename>/etc/ttys</filename>文件。</para>
+ </step>
+ </procedure>
+
+ <para>作为可选的步骤,您可以通过在 <filename>/etc/gettytab</filename>
+ 中建立一个记录,在第2步创建一个定制的
+ <replaceable>getty</replaceable> 类型来使用。这章不会介绍如何做。
+ 您可以参考 &man.gettytab.5; 和 &man.getty.8;
+ 的联机手册了解更多信息。</para>
+
+ <sect3 id="term-etcttys">
+ <title>添加一个记录到<filename>/etc/ttys</filename></title>
+
+ <para><filename>/etc/ttys</filename>文件列出了您
+ FreeBSD系统上允许登录的所有端口。 例如, 第一个虚拟控制台
+ <filename>ttyv0</filename> 在这个文件中有一个记录。
+ 您可以使用这个记录登录进控制台。
+ 这个文件也包含其他虚拟控制台的记录,串口,和伪 ttys 终端。
+ 对于一个硬连线的终端, 只要列出串行端口的
+ <filename>/dev</filename> 记录而不需要
+ <filename>/dev</filename>部分 (例如,
+ <filename>/dev/ttyv0</filename> 可以被列为
+ <devicename>ttyv0</devicename>)。</para>
+
+ <para>默认的 FreeBSD 安装包括一个支持最初四个串口
+ <filename>ttyd0</filename> 到 <filename>ttyd3</filename>
+ 的<filename>/etc/ttys</filename> 文件。
+ 如果您从那些端口中某一个使用终端,您不需要添加另一个记录。</para>
+
+ <example id="ex-etc-ttys">
+ <title>添加终端记录到<filename>/etc/ttys</filename></title>
+
+ <para>假设我们连接两个终端给系统: 一个 Wyse-50 和一个老的运行
+ <application>Procomm</application> 终端软件模拟一个
+ VT-100 终端的286IBM PC。 在 <filename>/etc/ttys</filename>
+ 文件中的相应的记录是这样的:</para>
+
+ <programlisting>ttyd1<co
+ id="co-ttys-line1col1"> "/usr/libexec/getty std.38400"<co
+ id="co-ttys-line1col2"> wy50<co
+ id="co-ttys-line1col3"> on<co
+ id="co-ttys-line1col4"> insecure<co
+ id="co-ttys-line1col5">
+ttyd5 "/usr/libexec/getty std.19200" vt100 on insecure
+ </programlisting>
+
+ <calloutlist>
+ <callout arearefs="co-ttys-line1col1">
+ <para>第一部分指定了终端指定文件的名称, 它可以在
+ <filename>/dev</filename>中找到。</para>
+ </callout>
+ <callout arearefs="co-ttys-line1col2">
+
+ <para>第二部分是在这行执行的命令,通常是 &man.getty.8;。
+ <command>getty</command> 初始化然后打开一行,设置速度,
+ 用户名的命令和执行登录程序。</para>
+
+ <para><command>getty</command> 程序在它的命令行接收一个参数 (可选),
+ <replaceable>getty</replaceable> 类型。 一个
+ <replaceable>getty</replaceable> 类型会在终端行描述一个特征,
+ 像波特率和奇偶校验。 <command>getty</command> 程序从
+ <filename>/etc/gettytab</filename> 文件读取这些特征。</para>
+
+ <para>文件<filename>/etc/gettytab</filename>
+ 包含了许多老的和新的终端行记录。
+ 在很多例子中,启动文本 <literal>std</literal>
+ 的记录将用硬连线终端来工作。 这些记录忽略了奇偶性。
+ 这是一个从110到115200 bit/s的 <literal>std</literal> 记录。
+ 当然,您可以添加您自己的记录到这个文件。
+ gettytab 的联机手册提供了更多的信息。</para>
+
+ <para>当在<filename>/etc/ttys</filename>中设置
+ <replaceable>getty</replaceable> 类型的时候,
+ 确信在终端上的通讯设置匹配。
+ 在我们的例子中, Wyse-50 不使用奇偶性, 用38400 bit/s
+ 来连接。286 PC不使用奇偶性,用19200bit/s来连接。</para>
+
+ </callout>
+
+ <callout arearefs="co-ttys-line1col3">
+
+ <para>第三部分是通常连接到那个tty行的终端类型。对于拨号端口,
+ <literal>unknown</literal> 或 <literal>dialup</literal>
+ 通常被用在这个地方。 对于硬连线的终端,终端类型不会改变,
+ 所以您可以从termcap数据库文件中放一个真正的终端类型。</para>
+
+ <para>在我们的例子中, Wyse-50 使用真正的终端类型,
+ 而运行 <application>Procomm</application> 的286
+ PC将被设置成在VT-100上的模拟。</para>
+
+ </callout>
+
+ <callout arearefs="co-ttys-line1col4">
+ <para>如果端口被启用,可以指定第四个部分。在第二部分,
+ 把它放在这儿将执行初始化进程来启动程序
+ <command>getty</command>。如果您在这部分拖延,
+ 将没有<command>getty</command>,在端口上因此就没有登录。</para>
+ </callout>
+
+ <callout arearefs="co-ttys-line1col5">
+ <para>最后部分被用来指定端口是否安全。
+ 标记一个安全的端口意味着您信任它允许用 <username>root</username>
+ 帐户从那个端口登录。 不安全的端口不允许
+ <username>root</username>登录。 在一个不安全的端口上,
+ 用户必须用无特权的帐户登录, 然后使用
+ <command>su</command> 或一个相似的机制来获得超级用户的权限。</para>
+ </callout>
+ </calloutlist>
+ </example>
+ </sect3>
+
+ <sect3 id="term-hup">
+ <title>重新读取<filename>/etc/ttys</filename>来强制<command>init</command>
+ </title>
+
+ <para>对<filename>/etc/ttys</filename>文件做一个必要的修改后,您必须发送一个
+ SIGHUP 信号给初始化进程来迫使它重新读取配置文件,例如:</para>
+
+ <screen>&prompt.root; <userinput>kill -HUP 1</userinput></screen>
+
+ <note>
+ <para><command>init</command> 总是系统运行时的第一个进程,因此它总是PID 1。</para>
+ </note>
+
+ <para>如果能够正确设置,所有的线缆都是适当的,终端将可以启用了,
+ 然后一个 <command>getty</command> 进程将在每个终端运行,
+ 您将在您的终端上看到登录命令行。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="term-debug">
+ <title>您的连接可能出现的问题</title>
+
+ <para>即使您小心翼翼地注意细节,您仍然可能会在设置终端时出错。
+ 这有一个有关问题和解决办法的列表:</para>
+
+ <sect3>
+ <title>没有登录命令出现:</title>
+
+ <para>确定终端被嵌入和打开了。如果把一台个人计算机充当一个终端,
+ 确信终端模拟软件运行在正确的串口上。</para>
+
+ <para>确信线缆被稳固地连接在终端和 FreeBSD 计算机上。
+ 确信用了正确的电缆。</para>
+
+ <para>确定终端和 FreeBSD 的传输速度和奇偶设置已经一致了。
+ 如果您有一个图像显示终端,确信对比度已经调节好了。
+ 如果它是一个可打印的终端,确信纸张和墨水已经就绪了。</para>
+
+ <para>确定一个 <command>getty</command> 进程正在运行和服务终端。
+ 例如, 可以用<command>ps</command> 命令得到运行
+ <command>getty</command> 程序的列表,键入:</para>
+
+ <screen>&prompt.root; <userinput>ps -axww|grep getty</userinput></screen>
+
+ <para>您将看到一个终端的记录。例如,下面的显示表明一个<command>getty</command>
+ 正在第二个串行端口 <literal>ttyd1</literal> 运行,
+ 正在<filename>/etc/gettytab</filename>中使用 <literal>std.38400</literal>
+ 的记录:</para>
+
+ <screen>22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyd1</screen>
+
+ <para>如果没有 <command>getty</command> 进程运行,
+ 确信您已经在<filename>/etc/ttys</filename>中启用了端口。
+ 在修改完<filename>/etc/ttys</filename>文件后,记得运行
+ <command>kill -HUP 1</command>。</para>
+
+ <para>如果 <command>getty</command> 进程确实在运行,
+ 但终端上仍然没有显示出登录提示, 或者虽然显示了单缺不允许您输入,
+ 您的终端或电缆可能不支持硬件握手。 请尝试将
+ <filename>/etc/ttys</filename> 中的
+ <literal>std.38400</literal> 改为
+ <literal>3wire.38400</literal> 并一定能够记得在改完
+ <filename>/etc/ttys</filename> 之后
+ <command>kill -HUP 1</command>)。
+ <literal>3wire</literal> 记录和
+ <literal>std</literal> 类似, 但忽略硬件握手。
+ 您可能需要在使用 <literal>3wire</literal>
+ 时减少波特率或启用软件流控制以避免缓冲区溢出。</para>
+
+ </sect3>
+
+ <sect3>
+ <title>出现一个 <quote>垃圾</quote> 而不是一个登录命令行</title>
+
+ <para>确信终端和 FreeBSD 使用相同的 bit/s 传输率和奇偶校验设置。
+ 检查一下 <command>getty</command> 进程确信当前使用正确的
+ <replaceable>getty</replaceable> 类型。 如果没有,
+ 编辑<filename>/etc/ttys</filename>然后运行<command>kill
+ -HUP 1</command>。</para>
+
+ </sect3>
+
+ <sect3>
+ <title>当键入密码时,字符两个两个出现</title>
+
+ <para>将终端 (或终端模拟软件) 从 <quote>半双工</quote>
+ 或 <quote>本地回显</quote> 换成
+ <quote>全双工</quote>。</para>
+
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="dialup">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Guy</firstname>
+ <surname>Helmer</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Sean</firstname>
+ <surname>Kelly</surname>
+ <contrib>Additions by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>拨入服务</title>
+ <indexterm><primary>拨入服务</primary></indexterm>
+
+ <para>为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用
+ modem来拨号而不是终端。</para>
+
+ <sect2>
+ <title>外置vs.内置modem</title>
+
+ <para>外置modem看起来很容易拨号。 因为,外置 modem
+ 可以通过储存在非易失性的RAM中的参数来配置,
+ 它们通常提供指示器来显示重要的RS-232信号的状态。
+ 不停闪光的信号灯能给用户留下比较深刻的印象,
+ 而且指示器也可以用来查看modem是否正常地工作。</para>
+
+ <para>内置modem通常缺乏非易失性的RAM,
+ 所以对它们的配置可能会限制在通过 DIP 开关来设置。
+ 如果您的内置modem有指示灯,您也很难看得到。</para>
+
+ <sect3>
+ <title>Modem和线缆</title>
+ <indexterm><primary>modem</primary></indexterm>
+
+ <para>如果您使用一个外置的 modem,那您将需要适当的电缆线。
+ 一个标准的串行线应当足够长以至普通的信号能够连接上:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Transmitted Data (<acronym>TD</acronym>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Received Data (<acronym>RD</acronym>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Request to Send (<acronym>RTS</acronym>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Clear to Send (<acronym>CTS</acronym>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Data Set Ready (<acronym>DSR</acronym>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Data Terminal Ready (<acronym>DTR</acronym>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Carrier Detect (<acronym>CD</acronym>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Signal Ground (<acronym>SG</acronym>)</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>FreeBSD需要对速度超过2400bit/s的<acronym>RTS</acronym> 和
+ <acronym>CTS</acronym>信号进行流控制,
+ 当一个呼叫被回复或线路被挂起的时候, <acronym>CD</acronym>
+ 信号就会被侦测到,一个会话完成之后,<acronym>DTR</acronym>
+ 信号就会刷新modem。 一些线缆不需要任何信号就可以连接,
+ 所以如果您有问题, 当线路被挂断时, 一个登录任务就会丢失,
+ 您可能会在线缆上有问题。</para>
+
+ <para>像其他 &unix; 类的操作系统一样, FreeBSD
+ 使用硬件信号来寻找出一个呼叫什么时候会回复或一个线路会被挂起。
+ FreeBSD 避免发送命令给 modem 或监视 modem 的状况。
+ 如果您熟悉连接 modem 到基于 PC 的 BBS,这可能看起来有点笨拙。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>串行接口的考虑</title>
+
+ <para>FreeBSD支持基于 NS8250, NS16450, NS16550 和 NS16550A
+ 的EIA RS-232C通讯接口。 8250和16450设备有单字符缓冲。
+ 16550设备提供了一个 16 个字符的缓冲, 可以提高更多的系统性能。
+ 因为单字符缓冲设备比 16 个字符的缓冲需要更多的系统资源来工作,
+ 所以基于16550A的接口卡可能更好。 如果系统没有活动的串口,
+ 或有较大的负载, 16 字符缓冲的卡对于低错误率的通讯来说更好。</para>
+ </sect2>
+
+ <sect2>
+ <title>快速预览</title>
+
+ <indexterm><primary>getty</primary></indexterm>
+ <para>对于终端, <command>init</command>
+ 会在每个配置串口上为每个拨入连接产生一个 <command>getty</command>
+ 进程。 例如, 如果一个 modem 被附带在 <filename>/dev/ttyd0</filename>
+ 中,用命令<command>ps ax</command>可以显示下面这些:</para>
+
+ <screen> 4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0</screen>
+
+ <para>当用户拨上modem, 并使用它进行连接时, <acronym>CD</acronym>
+ 线就会被 modem 认出。 内核注意到载波信号已经被检测到,
+ 需要完成 <command>getty</command> 端口的打开。
+ <command>getty</command> 发送一个登录:在指定的初始线速度上的命令行。
+ Getty 会检查合法的字符是否被接收, 在典型的配置中,
+ 如果发现 <quote>垃圾</quote>, <command>getty</command>
+ 就会设法调节线速度,直到它接收到合理的字符。</para>
+
+ <indexterm>
+ <primary><command>/usr/bin/login</command></primary>
+ </indexterm>
+ <para>用户在键入他/她的登录名称后,
+ <command>getty</command>执行<filename>/usr/bin/login</filename>,
+ 这会要求用户输入密码来完成登录, 然后启动用户的shell。</para>
+ </sect2>
+
+
+ <sect2>
+ <title>配置文件</title>
+
+ <para>在 <filename>/etc</filename> 目录中,有三个您将需要编辑的系统配置文件,
+ 来允许拨号访问到您的 FreeBSD 系统。 第一,
+ <filename>/etc/gettytab</filename> 包含了针对
+ <filename>/usr/libexec/getty</filename> 守护程序的配置信息。
+ 第二, 保存信息来告诉 <filename>/sbin/init</filename>
+ 什么 <filename>tty</filename> 设备将有运行在它们系统上的
+ <command>getty</command>进程。 最后,
+ 您可以把端口初始化命令放在 <filename>/etc/rc.serial</filename>
+ 脚本中。</para>
+
+ <para>在 &unix; 上, 关于拨号 modem 的想法主要有两种。
+ 一种是把本地接口配置成一个固定速度,
+ 以至一个远程用户拨号进入时都保持一个固定速度。
+ 这样配置的好处是远程用户总是可以立即看到一个系统的登录界面。
+ 这种下降趋势是系统不知道一个用户真正的数据速度是多少,
+ 所以像 Emacs 全屏程序将不会调节屏幕刷新来确保对比较慢的连接有比较好的回应。</para>
+
+ <para>另一所学校将他们的 modem 所在的 RS-232 设置为自动适应远程用户的连接速度。
+ 例如, V.32bis (14.4&nbsp;Kbps) 的连接将让 modem 所在的 RS-232 接口运行在
+ 19.2&nbsp;Kbps, 而 2400&nbsp;bps 的连接则会使 modem 的 RS-232 以
+ 2400&nbsp;bps 运行。 由于
+ <command>getty</command> 并不知道任何一个特定的 modem 的连接速率,
+ 因此 <command>getty</command> 会以初始的速率给出一个
+ <prompt>login:</prompt> 消息并监视用户回应的字符。
+ 如果用户看到一些乱码, 则他们应该知道连续按
+ <keycode>Enter</keycode> 键直到能够看到可以识别的提示为止。
+ 如果数据传输速率不匹配, <command>getty</command>
+ 将把用户输入的任何信息看作 <quote>乱码</quote>,
+ 并尝试下一个速度并再次给出 <prompt>login:</prompt> 提示。
+ 这个过程可以令人作呕地继续下去,
+ 但用户通常只需按一两次键盘就可以看到正常的提示了。
+ 很明显, 这个登录过程看起来可能没有前面所介绍的
+ <quote>锁定速率</quote> 方法那样脉络清晰,
+ 但在低速连接上的用户应该能够从全屏幕程序中得到更好的交互响应。</para>
+
+ <para>这一节将尽量给出较为公平的配置信息, 但更偏向于使用遵守连接速率的
+ modem。</para>
+
+ <sect3>
+ <title><filename>/etc/gettytab</filename></title>
+
+ <indexterm>
+ <primary><filename>/etc/gettytab</filename></primary>
+ </indexterm>
+ <para><filename>/etc/gettytab</filename>是一个用来配置
+ <command>getty</command> 信息的 termcap 风格的文件。 请看看
+ gettytab 的联机手册了解完整的文件格式和功能列表。</para>
+
+ <sect4>
+ <title>锁定速度的配置</title>
+
+ <para>如果您把您的modem的数据通讯率锁定在一个特殊的速度上,
+ 您不需要对 <filename>/etc/gettytab</filename> 文件作任何变化。</para>
+ </sect4>
+
+ <sect4>
+ <title>匹配速度的配置</title>
+
+ <para>您将需要在 <filename>/etc/gettytab</filename>
+ 中设置一个记录来告诉 <command>getty</command> 您希望在
+ modem 上使用的速度。 如果您的 modem 的速率是 2400&nbsp;bit/s,
+ 则可以使用现有的 <literal>D2400</literal> 的记录。</para>
+
+ <programlisting>#
+# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
+#
+D2400|d2400|Fast-Dial-2400:\
+ :nx=D1200:tc=2400-baud:
+3|D1200|Fast-Dial-1200:\
+ :nx=D300:tc=1200-baud:
+5|D300|Fast-Dial-300:\
+ :nx=D2400:tc=300-baud:</programlisting>
+
+ <para>如果您有一个更高速度的 modem, 必须在
+ <filename>/etc/gettytab</filename> 中添加一个记录。
+ 下面是一个让您可以以最高 19.2 Kbit/s 的用在
+ 14.4 Kbit/s的modem上的接口记录:</para>
+
+ <programlisting>#
+# Additions for a V.32bis Modem
+#
+um|V300|High Speed Modem at 300,8-bit:\
+ :nx=V19200:tc=std.300:
+un|V1200|High Speed Modem at 1200,8-bit:\
+ :nx=V300:tc=std.1200:
+uo|V2400|High Speed Modem at 2400,8-bit:\
+ :nx=V1200:tc=std.2400:
+up|V9600|High Speed Modem at 9600,8-bit:\
+ :nx=V2400:tc=std.9600:
+uq|V19200|High Speed Modem at 19200,8-bit:\
+ :nx=V9600:tc=std.19200:</programlisting>
+
+ <para>这样做的结果是 8-数据位, 没有奇偶校验的连接。</para>
+
+ <para>上面使用19.2 Kbit/s的连接速度的例子,也可以使用
+ 9600 bit/s (for V.32), 2400 bit/s, 1200 bit/s,300 bit/s,
+ 直到 19.2 Kbit/s。 通讯率的调节使用 <literal>nx=</literal>
+ (<quote>next table</quote>) 来实现。 每条线使用一个
+ <literal>tc=</literal> (<quote>table continuation</quote>)
+ 的记录来加速对于一个特殊传输率的标准设置。</para>
+
+ <para>如果您有28.8 Kbit/s的modem,或您想使用它的 14.4Kbit/s
+ 模式, 就需要使用一个更高的超过 19.2 Kbit/s 的通讯速度的
+ modem。 这是一个启动 57.6 Kbit/s 的 <filename>gettytab</filename>
+ 记录的例子:</para>
+
+ <programlisting>#
+# Additions for a V.32bis or V.34 Modem
+# Starting at 57.6 Kbps
+#
+vm|VH300|Very High Speed Modem at 300,8-bit:\
+ :nx=VH57600:tc=std.300:
+vn|VH1200|Very High Speed Modem at 1200,8-bit:\
+ :nx=VH300:tc=std.1200:
+vo|VH2400|Very High Speed Modem at 2400,8-bit:\
+ :nx=VH1200:tc=std.2400:
+vp|VH9600|Very High Speed Modem at 9600,8-bit:\
+ :nx=VH2400:tc=std.9600:
+vq|VH57600|Very High Speed Modem at 57600,8-bit:\
+ :nx=VH9600:tc=std.57600:</programlisting>
+
+ <para>如果您的 CPU 速度较低, 或系统的负荷很重, 而且没有
+ 16550A的串行端口,您可能会在57.6 Kbit/s上得到
+ <errorname>sio</errorname> <quote>silo</quote>错误。</para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="dialup-ttys">
+ <title><filename>/etc/ttys</filename></title>
+ <indexterm>
+ <primary><filename>/etc/ttys</filename></primary>
+ </indexterm>
+
+ <para><filename>/etc/ttys</filename>文件的配置在
+ <xref linkend="ex-etc-ttys">中介绍过。 配置 modem 是相似的,
+ 但我们必须指定一个不同的终端类型。
+ 锁定速度和匹配速度配置的通用格式是:</para>
+
+ <programlisting>ttyd0 "/usr/libexec/getty <replaceable>xxx</replaceable>" dialup on</programlisting>
+
+ <para>上面的第一条是这个记录的设备特定文件 &mdash;
+ <literal>ttyd0</literal> 表示 <filename>/dev/ttyd0</filename>
+ 是这个 <command>getty</command> 将被监视的文件。 第二条
+ <literal>"/usr/libexec/getty
+ <replaceable>xxx</replaceable>"</literal>
+ 是将运行在设备上的进程 <command>init</command>。
+ 第三条,dialup,是默认的终端类型。 第四个参数,
+ <literal>on</literal>, 指出了线路是可操作的
+ <command>init</command>。 也可能会有第五个参数,
+ <literal>secure</literal>, 但它将只被用作拥有物理安全的终端
+ (如系统终端)。</para>
+
+ <para>默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型,
+ 以至用户可以定制它们的登录脚本来注意终端什么时候拨号,
+ 和自动调节它们的终端类型。 然而, 作者发现它很容易在它的站点上指定
+ <literal>vt102</literal> 作为默认的终端类型,
+ 因为用户刚才在它们的远程系统上使用的是VT102模拟器。</para>
+
+ <para>您对<filename>/etc/ttys</filename>作修改之后,您可以发送
+ <command>init</command> 进程给一个 <acronym>HUP</acronym>
+ 信号来重读文件。您可以使用下面的命令来发送信号:
+
+ <screen>&prompt.root; <userinput>kill -HUP 1</userinput></screen>
+
+ 如果这是您的第一次设置系统, 您可能要在发信号
+ <command>init</command> 之前等一下, 等到您的 modem
+ 正确地配置并连接好。
+ </para>
+
+ <sect4>
+ <title>锁定速度的配置</title>
+
+ <para>对于一个锁定速度的配置,您的 <filename>ttys</filename>
+ 记录必须有一个为 <command>getty</command> 提供固定速度的记录。
+ 对于一个速度被锁定在 19.2kbit/s 的 modem,
+ <filename>ttys</filename> 记录是这样的:</para>
+
+ <programlisting>ttyd0 "/usr/libexec/getty std.19200" dialup on</programlisting>
+
+ <para>如果您的 modem 被锁定在一个不同的数据速度,
+ 为 std.speed 使用适当的速度来代替 std.19200。
+ 确信您使用了一个在 <filename>/etc/gettytab</filename>
+ 中列出的正确的类型。</para>
+ </sect4>
+
+ <sect4>
+ <title>匹配速度的设置</title>
+
+ <para>在一个匹配速度的设置中,您的 <filename>ttys</filename>
+ 录需要参考在 <filename>/etc/gettytab</filename> 适当的起始
+ <quote>auto-baud</quote> 记录。 例如, 如果您为一个以 19.2
+ Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的
+ <filename>ttys</filename> 记录可能是这样的:</para>
+
+ <programlisting>ttyd0 "/usr/libexec/getty V19200" dialup on</programlisting>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title><filename>/etc/rc.serial</filename></title>
+ <indexterm>
+ <primary>rc files</primary>
+ <secondary><filename>rc.serial</filename></secondary>
+ </indexterm>
+
+ <para>高速modem, 像 V.32,V.32bis,和 V.34 modem,需要使用硬件
+ (<filename>RTS/CTS</filename>) 流控制。 您可以在
+ <filename>/etc/rc.serial</filename> 中添加
+ <command>stty</command> 命令来设置硬件流控制标记。</para>
+
+ <para>例如,在拨入和拨出初始设备的第一个 (<devicename>COM2</devicename>)
+ 串行端口上设置termios标记crtscts, 下面这些行会被添加到
+ <filename>/etc/rc.serial</filename>中:</para>
+ <programlisting># Serial port initial configuration
+stty -f /dev/ttyid1 crtscts
+stty -f /dev/cuaia1 crtscts</programlisting>
+
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Modem设置</title>
+
+ <para>如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中,
+ 您将必须使用一个终端程序来设置参数。 使用同样的通讯速度来连接
+ modem 作为初始速度 <command>getty</command> 将使用和配置
+ modem 的非易失性RAM来匹配这些要求:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><acronym>CD</acronym> asserted when connected</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>DTR</acronym> asserted for operation; dropping DTR
+ hangs up line and resets modem</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>CTS</acronym> transmitted data flow control</para>
+ </listitem>
+
+ <listitem>
+ <para>Disable <acronym>XON/XOFF</acronym> flow control</para>
+ </listitem>
+
+ <listitem>
+ <para><acronym>RTS</acronym> received data flow control</para>
+ </listitem>
+
+ <listitem>
+ <para>Quiet mode (no result codes)</para>
+ </listitem>
+
+ <listitem>
+ <para>No command echo</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>请读读您的 modem 的文档找到您需要用什么命令和 DIP 接口设置。</para>
+
+ <para>例如,要在一个 USRobotics Sportster 14400 的外置 modem
+ 上设置上面的参数,可以用下面这些命令:</para>
+
+ <programlisting>ATZ
+AT&amp;C1&amp;D2&amp;H1&amp;I0&amp;R2&amp;W</programlisting>
+
+ <para>您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用
+ V.42bis 和 MNP5 压缩。</para>
+
+ <para>外置 modem 也有一些用来设置的 DIP 开关,
+ 也许您可以使用这些设置作为一个例子:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Switch 1: UP &mdash; DTR Normal</para>
+ </listitem>
+
+ <listitem>
+ <para>Switch 2: N/A (Verbal Result Codes/Numeric Result
+ Codes)</para>
+ </listitem>
+
+ <listitem>
+ <para>Switch 3: UP &mdash; Suppress Result Codes</para>
+ </listitem>
+
+ <listitem>
+ <para>Switch 4: DOWN &mdash; No echo, offline commands</para>
+ </listitem>
+
+ <listitem>
+ <para>Switch 5: UP &mdash; Auto Answer</para>
+ </listitem>
+
+ <listitem>
+ <para>Switch 6: UP &mdash; Carrier Detect Normal</para>
+ </listitem>
+
+ <listitem>
+ <para>Switch 7: UP &mdash; Load NVRAM Defaults</para>
+ </listitem>
+
+ <listitem>
+ <para>Switch 8: N/A (Smart Mode/Dumb Mode)</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当
+ <command>getty</command> 在 modem 处于命令模式并回显输入时错误地给出
+ <prompt>login:</prompt> 提示时可能造成的问题。
+ 这样可能导致 <command>getty</command> 与 modem
+ 之间产生更长的不必要交互。</para>
+
+ <sect3>
+ <title>锁定速度的配置</title>
+
+ <para>对于锁定速度的配置, 您需要配置 modem
+ 来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。
+ 在一个 USR Sportster 14400 外置 modem 上, 这些命令将锁定
+ modem到计算机 的传输率:</para>
+
+ <programlisting>ATZ
+AT&amp;B1&amp;W</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>匹配速度的配置</title>
+
+ <para>对于一个变速的配置, 您需要配置 modem
+ 调节它的串行端口传输率匹配接收的传输率。
+ 在一个 USR Sportster 14400 的外置 modem 上, 这些命令将锁定
+ modem 的错误修正传输率适合命令要求的速度,
+ 但允许串行端口速度适应没有纠错的连接:</para>
+
+ <programlisting>ATZ
+AT&amp;B2&amp;W</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>检查modem的配置</title>
+
+ <para>大多数高速的modem提供了用来查看当前操作参数的命令。
+ 在USR Sportster 14400外置modem上, 命令 <command>ATI5</command>
+ 显示了存储在非易失性RAM中的设置。 要看看正确的 modem 操作参数,
+ 可以使用命令 <command>ATZ</command> 然后是
+ <command>ATI4</command>。</para>
+
+ <para>如果您有一个不同牌子的 modem, 检查 modem
+ 的使用手册看看如何双重检查您的 modem 的配置参数。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>问题解答</title>
+
+ <para>这儿是几个检查拨号modem的步骤。</para>
+
+ <sect3>
+ <title>检查FreeBSD系统</title>
+
+ <para>把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的
+ modem 有一个指示灯, 当登录时看看 modem 的 DTR 指示灯是否亮:
+ 会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD
+ 已经在适当的通讯端口启动了一个 <command>getty</command> 进程,
+ 等待 modem 接收一个呼叫。</para>
+
+ <para>如果<acronym>DTR</acronym>指示灯不亮, 通过控制台登录到
+ FreeBSD系统,然后执行一个 <command>ps ax</command>
+ 命令来看 FreeBSD 是否正在正确的端口运行
+ <command>getty</command>进程。
+ 您将在进程显示中看到像这样的一行:</para>
+
+ <screen> 114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0
+ 115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1</screen>
+
+ <para>如果您看到是这样的:</para>
+
+ <screen> 114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0</screen>
+
+ <para>modem 不接收呼叫, 这意味着 <command>getty</command>
+ 已经在通讯端口打开了。 这可以指出线缆有问题或 modem 错误配置,
+ 因为 <command>getty</command> 无法打开通讯端口。</para>
+
+ <para>如果您没有看到任何 <command>getty</command> 进程等待打开想要的
+ <devicename>ttyd<replaceable>N</replaceable></devicename> 端口,
+ 在 <filename>/etc/ttys</filename> 中双击您的记录看看那儿是否有错误。
+ 另外,检查日志文件 <filename>/var/log/messages</filename>
+ 看看是否有一些来自 <command>init</command> 或
+ <command>getty</command> 的问题日志。 如果有任何信息,
+ 仔细检查配置文件 <filename>/etc/ttys</filename> 和
+ <filename>/etc/gettytab</filename>,还有相应的设备文件
+ <devicename>/dev/ttyd<replaceable>N</replaceable></devicename>,
+ 是否有错误,丢失记录,或丢失了设备指定文件。</para>
+ </sect3>
+
+ <sect3>
+ <title>尝试接入Try Dialing In</title>
+
+ <para>设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。
+ 如果您不能立刻得到一个命令行, 试试每隔一秒按一下
+ <keycode>Enter</keycode>。 如果您仍没有看到一个登录: 设法发送一个
+ <command>BREAK</command>。 如果您正使用一个高速的 modem 来拨号,
+ 请在锁定拨号 modem 的接口速度后再试试。</para>
+
+ <para>如果您不能得到一个登录:prompt,再检查一下
+ <filename>/etc/gettytab</filename>,重复检查:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>在<filename>/etc/ttys</filename> 中指定的初始可用的名称与
+ <filename>/etc/gettytab</filename> 的一个可用的相匹配。</para>
+ </listitem>
+
+ <listitem>
+ <para>每个 <literal>nx=</literal> 记录与另一个
+ <filename>gettytab</filename> 可用名称匹配。</para>
+ </listitem>
+
+ <listitem>
+ <para>每个 <literal>tc=</literal> 记录与另一个
+ <filename>gettytab</filename>可用名称相匹配。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem
+ 能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem
+ 的指示灯来确认 <acronym>DTR</acronym> 线连接正确。</para>
+
+ <para>如果您做了好几次,它仍然无法工作,打断一会,等会再试试。
+ 如果还不能工作, 也许您应该发一封电子邮件给 &a.questions;
+ 寻求帮助。</para>
+ </sect3>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="dialout">
+ <title>拨出设备</title>
+ <indexterm><primary>dial-out service</primary></indexterm>
+
+ <para>下面将让您的主机通过 modem 连接到另一台计算机上。
+ 这只要适当地建立一个终端作为远程主机就可以。</para>
+
+ <para>这可以用来登录进一个BBS。</para>
+
+ <para>如果您用 PPP 有问题, 那这种连接可以用来从 Internet
+ 上下载一个文件。 如果您必须 FTP 一些东西, 而 PPP 断了,
+ 使用终端会话来 FTP 它们。 然后使用 zmodem 来把它们传输到您的机器上。</para>
+
+ <sect2>
+ <title>我的Stock Hayes Modem不被支持,我该怎么办?</title>
+
+ <para>事实上, 联机手册对于这个的描述已经过时了。 一个通用的
+ Hayes拨号已经内建其中。 只要在您的 <filename>/etc/remote</filename>
+ 文件中使用 <literal>at=hayes</literal>。</para>
+
+ <para>Hayes 驱动不够 <quote>聪明</quote> 只能认出一些比较新的 modem
+ 的高级特性 &mdash; 如 <literal>BUSY</literal>、
+ <literal>NO DIALTONE</literal>, 或 <literal>CONNECT 115200</literal>
+ 的信息将被搞乱。 当您使用的时候, 您必须把这些信息关掉。(通过
+ <command>ATX0&amp;W</command>)。</para>
+
+ <para>另外,拨号的延迟是 60 秒。 您的 modem
+ 可能使用另外的时间或提示认为有其他的通讯问题。
+ 试试 <command>ATS7=45&amp;W</command>。</para>
+
+ <note>
+ <para>注意: 实际上 <command>tip</command> 不支持所有的
+ Hayes modems。 解决方法是编辑
+ <filename>/usr/src/usr.bin/tip/tip</filename>
+ 目录中的 <filename>tipconf.h</filename> 文件。很明显,
+ 您需要它的源代码才能这样做。</para>
+
+ <para>把行<literal>#define HAYES 0</literal> 改为
+ <literal>#define HAYES 1</literal>。 然后
+ <command>make</command> 并
+ <command>make install</command>就可以了。</para>
+ </note>
+ </sect2>
+
+ <sect2 id="direct-at">
+ <title>我如何输入这些 AT 命令?</title>
+
+ <indexterm>
+ <primary><filename>/etc/remote</filename></primary>
+ </indexterm>
+ <para>在 <filename>/etc/remote</filename> 文件中编译一个叫做
+ <quote>direct</quote> 的记录。 例如, 如果您的 modem
+ 连接在第一个串行端口, <filename>/dev/cuaa0</filename>,
+ 就添加下面这行:</para>
+
+ <programlisting>cuaa0:dv=/dev/cuaa0:br#19200:pa=none</programlisting>
+
+ <para>使用 br 命令来启用您 modem 支持的最高传输速度。
+ 然后键入 <command>tip</command> cuaa0,
+ 您就可以连到您的 modem 上了。</para>
+
+ <para>如果在您的系统上没有 <filename>/dev/cuaa0</filename>,可以这样:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput>
+&prompt.root; <userinput>sh MAKEDEV cuaa0</userinput></screen>
+
+ <para>或以 <username>root</username> 使用 <command>cu</command>,
+ 执行下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>cu -l<replaceable>line</replaceable> -s<replaceable>speed</replaceable></userinput></screen>
+
+ <para><replaceable>line</replaceable> line是串行端口 (例如
+ <filename>/dev/cuaa0</filename>), speed 是速度 (如57600)。
+ 键入 <keycap>~.</keycap> 退出。</para>
+ </sect2>
+
+ <sect2>
+ <title>现在pn <literal>@</literal>标记不能工作?</title>
+
+ <para>在电话号码中的 <literal>@</literal> 标记告诉计算机在
+ <filename>/etc/phones</filename> 文件中查找一个电话号码。 但
+ <literal>@</literal> 标记也是一个在像 <filename>/etc/remote</filename>
+ 这样的可用文件中的特殊字符。 用一个反斜线符号退出:</para>
+
+ <programlisting>pn=\@</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>我如何在命令行拨电话号码?</title>
+
+ <para>在您的 <filename>/etc/remote</filename> 文件中通常放着一个叫做
+ <quote>generic</quote> 的记录。 例如:</para>
+
+ <programlisting>tip115200|Dial any phone number at 115200 bps:\
+ :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du:
+tip57600|Dial any phone number at 57600 bps:\
+ :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:</programlisting>
+
+ <para>然后,您可以这样:</para>
+
+ <screen>&prompt.root; <userinput>tip -115200 5551234</userinput></screen>
+
+ <para>如果您更喜欢<command>cu</command>而不是<command>tip</command>,使用一个通用的<literal>cu</literal>记录:</para>
+
+ <programlisting>cu115200|Use cu to dial any number at 115200bps:\
+ :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:</programlisting>
+
+ <para>然后键入:</para>
+
+ <screen>&prompt.root; <userinput>cu 5551234 -s 115200</userinput></screen>
+ </sect2>
+
+ <sect2>
+ <title>这么做时是否每次都需要重新输入 bps 速率?</title>
+
+ <para>添加一项 <literal>tip1200</literal> 或
+ <literal>cu1200</literal>, 并将 bps 速率换成更合适的值。
+ <command>tip</command> 的默认值是1200 &nbsp;bps, 也就是为什么会有
+ <literal>tip1200</literal> 这条记录的原因。
+ 虽然您并不需要使用 1200&nbsp;bps。</para>
+ </sect2>
+
+ <sect2>
+ <title>我通过一个终端服务器访问了很多主机。</title>
+
+ <para>除非每次都要等到您连接到主机然后键入
+ <command>CONNECT &lt;host&gt;</command>, 否则使用
+ <command>tip</command> 的 <literal>cm</literal> 功能。
+ 例如, 在 <filename>/etc/remote</filename> 中的这些记录:</para>
+
+ <programlisting>pain|pain.deep13.com|Forrester's machine:\
+ :cm=CONNECT pain\n:tc=deep13:
+muffin|muffin.deep13.com|Frank's machine:\
+ :cm=CONNECT muffin\n:tc=deep13:
+deep13:Gizmonics Institute terminal server:\
+ :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234:</programlisting>
+
+ <para>将让您键入 <command>tip pain</command> 或 <command>tip
+ muffin</command> 连接到主机pain或muffin, 和 <command>tip
+ deep13</command> 连接到终端服务器。</para>
+ </sect2>
+
+ <sect2>
+ <title><command>tip</command>能为每个站点试用多个线路吗?</title>
+
+ <para>经常有一个问题, 一个大学有几个modem线路, 几千个学生设法使用它们。</para>
+
+ <para>在 <filename>/etc/remote</filename> 中为您的大学添加一个记录,
+ 然后为 <literal>pn</literal> 功能使用 <literal>@</literal> 标记:</para>
+
+ <programlisting>big-university:\
+ :pn=\@:tc=dialout
+dialout:\
+ :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:</programlisting>
+
+ <para>接着, 在 <filename>/etc/phones</filename>
+ 中列出大学的电话号码:</para>
+
+ <programlisting>big-university 5551111
+big-university 5551112
+big-university 5551113
+big-university 5551114</programlisting>
+
+ <para><command>tip</command> 将按顺序试用每一个,然后就停止。
+ 如果想继续测试, 隔一段时间再运行 <command>tip</command>。</para>
+ </sect2>
+
+ <sect2>
+ <title>为什么我必须键入
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>P</keycap>
+ </keycombo>
+ 两次才能发出
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>P</keycap>
+ </keycombo>
+ 一次?</title>
+
+ <para><keycombo action="simul"><keycap>Ctrl</keycap><keycap>P</keycap></keycombo>是默认的<quote>强制</quote>字符,被用来告诉<command>tip</command>下一个字符是文字的数据。您可以用<command>~s</command>给任何其他的字符设置强制字符,这意思是<quote>设置一个变量</quote>。</para>
+
+ <para>在新的一行键入 <command>~sforce=<replaceable>single-char</replaceable></command>。
+ <replaceable>single-char</replaceable> 是任何简单的字符。 如果您遗漏了
+ <replaceable>single-char</replaceable>, 那强制字符就是空字符,
+ 这可以键入
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap><keycap>2</keycap>
+ </keycombo>
+ 或
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap><keycap>Space</keycap>
+ </keycombo>来完成。 更好的 <replaceable>single-char</replaceable>
+ 是
+ <keycombo action="simul">
+ <keycap>Shift</keycap>
+ <keycap>Ctrl</keycap>
+ <keycap>6</keycap>
+ </keycombo>, 这只用在一些终端服务器上。</para>
+
+ <para>通过在您的 <filename>&#36;HOME/.tiprc</filename>
+ 文件中指定下面这行, 就可以得到您想要的任何强制字符:</para>
+
+ <programlisting>force=&lt;single-char&gt;</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>突然我键入的每一样东西都变成了大写??</title>
+
+ <para>您一定是键入了
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>A</keycap>
+ </keycombo>, 即 <command>tip</command>
+ 的 <quote>raise character</quote>,
+ 会临时地指定成坏掉的 caps-lock键。 使用上面的
+ <command>~s</command> 来合理地设置各种
+ <literal>raisechar</literal>。 事实上,
+ 如果您不想使用这些特性的话,您可以用同样的方法设置强制字符。</para>
+
+ <para>这儿有一个很好的示例 .tiprc 文件, 对
+ <application>Emacs</application>用户来说,需要经常按
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap><keycap>2</keycap>
+ </keycombo>
+ 和
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap><keycap>A</keycap>
+ </keycombo>:</para>
+
+ <programlisting>force=^^
+raisechar=^^</programlisting>
+
+ <para>The ^^ is
+ <keycombo action="simul">
+ <keycap>Shift</keycap><keycap>Ctrl</keycap><keycap>6</keycap>
+ </keycombo>.</para>
+
+ </sect2>
+
+ <sect2>
+ <title>如何用 <command>tip</command> 做文件传输?</title>
+
+ <para>如果您正在与另一台 &unix; 系统对话, 您可以用
+ <command>~p</command>(put) 和 <command>~t</command> (take)
+ 发送和接收文件。 这些命令可以在远程系统上运行 <command>cat</command>
+ 和 <command>echo</command> 来接收和发送文件。 语法是这样的:</para>
+
+ <cmdsynopsis>
+ <command>~p</command>
+ <arg choice="plain">local-file</arg>
+ <arg choice="opt">remote-file</arg>
+ </cmdsynopsis>
+
+ <cmdsynopsis>
+ <command>~t</command>
+ <arg choice="plain">remote-file</arg>
+ <arg choice="opt">local-file</arg>
+ </cmdsynopsis>
+
+ <para>由于没有错误校验, 所以您需要使用其他协议, 如 zmodem。</para>
+ </sect2>
+
+ <sect2>
+ <title>我如何用<command>tip</command>运行zmodem?</title>
+
+ <para>要接收这些文件,可以在远程终端启动发送程序。然后,键入
+ <command>~C rz</command> 在本地开始接收它们。 要发送文件,
+ 可以在远程终端启动接收程序。 然后, 键入 <command>~C sz
+ <replaceable>files</replaceable></command>
+ 把它们发送到远程系统。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="serialconsole-setup">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Kazutaka</firstname>
+ <surname>YOKOTA</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Bill</firstname>
+ <surname>Paul</surname>
+ <contrib>Based on a document by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>设置串行控制台</title>
+ <indexterm><primary>serial console</primary></indexterm>
+
+ <sect2 id="serialconsole-intro">
+ <title>Introduction</title>
+
+ <para>FreeBSD可以通过一个串口只使用一个哑 (dumb) 终端就可以启动一个系统。
+ 这样一种配置只有两种人能使用: 希望在机器上安装 FreeBSD 的系统管理员,
+ 他没有键盘或显示器, 还有就是要调试内核或设备驱动程序的开发人员。</para>
+
+ <para>就象 <xref linkend="boot"> 描述的, FreeBSD
+ 采用一个三步的启动过程。 最先两步储存在 FreeBSD 启动磁盘的启动
+ slice 的启动代码块中。 引导块然后就被加载,
+ 接着运行第三步启动引导器 (<filename>/boot/loader</filename>)。</para>
+
+ <para>为了设置串行控制台, 您必须配置启动代码块, 启动引导器代码和内核。</para>
+
+ </sect2>
+
+ <sect2 id="serialconsole-howto-fast">
+ <title>串行控制台的配置, 简明版</title>
+
+ <para>本节假定您使用默认的配置, 了解如何连接串口,
+ 并且希望快速地了解一下串行控制台。 如果您在采取这些步骤时遇到问题,
+ 请参考
+ <xref linkend="serialconsole-howto"> 中关于高级设置的详细介绍。</para>
+
+ <procedure>
+
+ <step>
+ <para>连接串口。 串行控制台将出现在
+ <devicename>COM1</devicename> 上。</para>
+ </step>
+
+ <step>
+ <para>使用 <command>echo -h &gt; /boot.config</command>
+ 来启用引导加载器和内核的串口控制台。</para>
+ </step>
+
+ <step>
+ <para>编辑 <filename>/etc/ttys</filename> 并把 <literal>ttyd0</literal> 的
+ <literal>off</literal> 改为 <literal>on</literal>。
+ 这将在串口控制台上启用一个登录提示, 其内容和普通的控制台一样。</para>
+ </step>
+
+ <step>
+ <para><command>shutdown -r now</command> 将重启系统并启用串行控制台。</para>
+ </step>
+
+ </procedure>
+
+ </sect2>
+
+ <sect2 id="serialconsole-howto">
+ <title>串行控制台的设置S</title>
+
+ <procedure>
+ <step>
+ <para>准备一个串行线缆。</para>
+
+ <indexterm><primary>null-modem cable</primary></indexterm>
+ <para>您需要使用一个 null-modem 的线缆或标准的串行线和一个 null-modem
+ 适配器。 请参考 <xref linkend="serial-cables-ports">
+ 中有关串行线的讨论。</para>
+ </step>
+
+ <step>
+ <para>拔掉键盘。</para>
+
+ <para>绝大多数的PC在开机检测的时候会检测到键盘,
+ 如果没有检测到键盘, 则会出现错误。 一些机器会提示缺少键盘,
+ 就不会继续引导系统。</para>
+
+ <para>如果您的计算机出现错误, 但仍能继续启动, 您可以不必理它。</para>
+
+ <para>如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS
+ 来避免它。 请参考您的主板的使用说明了解更多细节。</para>
+
+ <tip>
+ <para>在 BIOS 中设置键盘 <quote>Not installed</quote>
+ 并不意味着您不能使用键盘。 这样做只是告诉 BIOS
+ 不要在机器开机检测时检测键盘以至提示您系统找不到键盘。
+ 即使您设置了 <quote>Not installed</quote>,
+ 只要把键盘插上去仍然可以使用。</para>
+ </tip>
+
+ <note>
+ <para>如果系统有 PS/2 鼠标, 如果幸运的话,
+ 您也可以象键盘一样把它拔下来, 这是因为 PS/2
+ 鼠标与键盘的一些硬件是共享的, 您的鼠标插上去,
+ 系统会认为键盘仍在那儿。</para>
+ </note>
+ </step>
+
+ <step>
+ <para>插一个哑 (dumb) 终端到<devicename>COM1</devicename>:(<devicename>sio0</devicename>)。</para>
+
+ <para>如果您没有哑终端, 可以使用一个比较老的带有一个 modem
+ 程序的PC/XT机器, 或在其他 &unix; 机器上的串口。 如果您没有
+ <devicename>COM1</devicename>: (<devicename>sio0</devicename>),
+ 去找一个。 这时, 您就不能只能选择
+ <devicename>COM1</devicename>:来启动系统。
+ 如果您已经在另一台设备上使用 <devicename>COM1</devicename>,
+ 您必须临时删除那个设备, 然后安装一个新的系统引导块和内核。</para>
+ </step>
+
+ <step>
+ <para>确信您的内核配置文件已经为 <devicename>COM1</devicename>:
+ (<devicename>sio0</devicename>) 设置了适当的标记:</para>
+
+ <para>有关的标记是:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>0x10</literal></term>
+
+ <listitem>
+ <para>启用控制台支持。 如果没有设置它,
+ 则其他的控制台标记都会被忽略。 现在,
+ 绝大多数的设置都有控制台的支持。
+ 这个标记的第一个就是首选的。
+ 这个单独选项是不能确保串口适用于控制台的,
+ 设置下面的标记或加上下面描述的 <option>-h</option> 选项,
+ 和这个放在一起。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>0x20</literal></term>
+
+ <listitem>
+ <para>不管下面有没有讨论, 都强制这个选项支持控制台。
+ 这个标记在 FreeBSD 2.X 中取代了
+ <literal>COMCONSOLE</literal>选项。
+ 标记 <literal>0x20</literal> 必须和
+ <option>0x10</option> 一起使用。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>0x40</literal></term>
+
+ <listitem>
+
+ <para>预留这个单元 (配合
+ <literal>0x10</literal>) 并让它不能用于普通的使用。
+ 您不应在希望作为控制台的串口单元上设置这个标志。
+ 这一标志是为内核远程调试准备的。
+ 参见 <ulink
+ url="&url.books.developers-handbook;/index.html">开发者手册</ulink>
+ 以了解关于远程调试更进一步的情况。</para>
+
+ <note>
+ <para>在FreeBSD 4.0-CURRENT和以后的版本中,标记
+ <literal>0x40</literal>通常是不同的,
+ 有另一个标记可以来指定一个串口用于远程调试。</para>
+ </note>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>例如:</para>
+
+ <programlisting>device sio0 at isa? port IO_COM1 flags 0x10 irq 4</programlisting>
+
+ <para>看看 &man.sio.4; 的联机手册了解更多信息。</para>
+
+ <para>如果标记没有被设置, 您必须运行UserConfig或重新编译内核。</para>
+ </step>
+
+ <step>
+ <para>在启动磁盘的 <literal>a</literal> 分区的根目录创建
+ <filename>boot.config</filename> 文件。</para>
+
+ <para>这个文件将指导引导块代码如何启动系统。 为了激活串行控制台,
+ 您必须有一个或多个下面的选项——如果您要多个选项,
+ 在同一行必须都包含它们:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>-h</option></term>
+
+ <listitem>
+ <para>切换内部和串行控制台。 您使用这个来交换控制台设备。
+ 例如, 如果您从内部控制台启动, 您可以使用 <option>-h</option>
+ 来直接使用启动引导器和内核来使用串口作为它的控制台设备。
+ 另外, 如果您从串口启动, 您可以使用 <option>-h</option>
+ 来告诉启动引导器和内核使用显示设备作为控制台。/para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-D</option></term>
+
+ <listitem>
+ <para>切换单一和双重控制台配置。 在单一配置中,
+ 控制台将是本机的控制台 (显示设备) 或串口。
+ 在双重控制台配置中, 显示设备和串口将同时成为控制台,
+ 无论 <option>-h</option> 的选项的情形。 然而,
+ 双控制台配置只在引导块运行的过程中起作用。
+ 一旦启动引导器获得控制, 由 <option>-h</option>
+ 选项指定的控制台将成为唯一的控制台。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-P</option></term>
+
+ <listitem>
+ <para>在启动时,探测键盘。如果键盘找不到,
+ <option>-D</option> 和 <option>-h</option> 选项会自动设置。</para>
+
+ <note>
+ <para>由于当前版本引导块的空间限制, <option>-P</option>
+ 选项只能探测扩展的键盘。 少于101键的键盘将无法被探测到。
+ 如果您碰到这个情况, 您必须避免使用 <option>-P</option>
+ 选项。 目前还没有绕过这个问题的办法。</para>
+ </note>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>使用 <option>-P</option> 选项来自动选择控制台, 或使用
+ <option>-h</option> 选项来激活控制台。</para>
+
+ <para>您也可以使用boot联机文档中所描述的其他选项。</para>
+
+ <para>除了 <option>-P</option> 选项, 所有选项将被传给启动引导器
+ (<filename>/boot/loader</filename>)。 启动引导器将通过检查
+ <option>-h</option> 选项的状态来决定是显示设备成为控制台,
+ 还是串口成为控制台。 这表示如果您指定 <option>-D</option> 选项,
+ 但在 <filename>/boot.config</filename> 中没有 <option>-h</option>
+ 选项, 您在启动代码块时使用串口作为控制台。
+ 启动引导器将使用内部显示设备作为控制台。</para>
+ </step>
+
+ <step>
+ <para>启动机器</para>
+
+ <para>当您启动您的FreeBSD时,引导块将把 <filename>/boot.config</filename>
+ 的内容发给控制台。例如:</para>
+
+ <screen>/boot.config: -P
+Keyboard: no</screen>
+
+ <para>如果您把 <option>-P</option> 放在 <filename>/boot.config</filename>
+ 中并指出键盘存在或不存在, 那将只出现第二行。
+ 这些信息会被定位到串口或内部控制台, 或两者同时, 这完全取决于
+ <filename>/boot.config</filename> 中的选项。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>选项</entry>
+ <entry>定位信息</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>none</entry>
+ <entry>内部控制台</entry>
+ </row>
+
+ <row>
+ <entry><option>-h</option></entry>
+ <entry>串行控制台</entry>
+ </row>
+
+ <row>
+ <entry><option>-D</option></entry>
+ <entry>串行控制台和内部控制台</entry>
+ </row>
+
+ <row>
+ <entry><option>-Dh</option></entry>
+ <entry>串行控制台和内部控制台</entry>
+ </row>
+
+ <row>
+ <entry><option>-P</option>, 有键盘</entry>
+ <entry>内部控制台</entry>
+ </row>
+
+ <row>
+ <entry><option>-P</option>, 无键盘</entry>
+ <entry>串行控制台</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>出现上面信息后,在引导块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。
+ 在通常情况下, 您不需要打断启动进程, 但为了确信设置是否正确, 您也可以这样做。</para>
+
+ <para>在控制台上按 <keycode>Enter</keycode> 以外的任意键就能打断启动进程。
+ 引导块将进入命令行模式。 您将看到:</para>
+
+ <screen>>> FreeBSD/i386 BOOT
+Default: 0:ad(0,a)/boot/loader
+boot:</screen>
+
+ <para>检验上面出现的信息, 可能是串口, 或内部控制台, 或两个同时,
+ 完全取决于您在 <filename>/boot.config</filename> 中的选项。
+ 如果信息出现在正确的控制台, 按 <keycode>Enter</keycode>
+ 继续启动进程。</para>
+
+ <para>如果您要使用串行控制台, 但您没有看到命令行, 那可能设置有问题。
+ 这时, 输入 <option>-h</option> 然后按 Enter/Return 来告诉引导块
+ (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了,
+ 就可以回去检查一下是什么出了问题。</para>
+ </step>
+ </procedure>
+
+ <para>启动引导器加载完后, 您将进入启动进程的第三步,
+ 您仍然可以在启动引导器通过设定您喜欢的环境来切换内部控制台和串行控制台。
+ 参考 <xref linkend="serialconsole-loader">。</para>
+ </sect2>
+
+ <sect2 id="serialconsole-summary">
+ <title>摘要</title>
+
+ <para>这是几个在这章要讨论的几个设置和选择的控制台的摘要。</para>
+
+ <sect3>
+ <title>例1: 您为 <devicename>sio0</devicename> 设置标记 0x10</title>
+
+ <programlisting>device sio0 at isa? port IO_COM1 flags 0x10 irq 4</programlisting>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>在/boot.config中的选项</entry>
+ <entry>引导块过程中的控制台</entry>
+ <entry>启动引导器过程中的控制台</entry>
+ <entry>内核中的控制台</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>无</entry>
+ <entry>内部</entry>
+ <entry>内部</entry>
+ <entry>内部</entry>
+ </row>
+
+ <row>
+ <entry><option>-h</option></entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ </row>
+
+ <row>
+ <entry><option>-D</option></entry>
+ <entry>串行和内部</entry>
+ <entry>内部</entry>
+ <entry>内部</entry>
+ </row>
+
+ <row>
+ <entry><option>-Dh</option></entry>
+ <entry>串行和内部</entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ </row>
+
+ <row>
+ <entry><option>-P</option>, 有键盘</entry>
+ <entry>内部</entry>
+ <entry>内部</entry>
+ <entry>内部</entry>
+ </row>
+
+ <row>
+ <entry><option>-P</option>, 没有键盘</entry>
+ <entry>串行和内部</entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect3>
+
+ <sect3>
+ <title>例2:您为sio0设置标记为0x30</title>
+
+ <programlisting>device sio0 at isa? port IO_COM1 flags 0x30 irq 4</programlisting>
+
+ <informaltable frame="none">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>在/boot.config中的选项</entry>
+ <entry>引导块过程中的控制台</entry>
+ <entry>启动引导器过程中的控制台</entry>
+ <entry>内核中的控制台</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>无</entry>
+ <entry>内部</entry>
+ <entry>内部</entry>
+ <entry>串行</entry>
+ </row>
+
+ <row>
+ <entry><option>-h</option></entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ </row>
+
+ <row>
+ <entry><option>-D</option></entry>
+ <entry>串行和内部</entry>
+ <entry>内部</entry>
+ <entry>串行</entry>
+ </row>
+
+ <row>
+ <entry><option>-Dh</option></entry>
+ <entry>串行和内部</entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ </row>
+
+ <row>
+ <entry><option>-P</option>, 有键盘</entry>
+ <entry>内部</entry>
+ <entry>内部</entry>
+ <entry>串行</entry>
+ </row>
+
+ <row>
+ <entry><option>-P</option>, 没有键盘</entry>
+ <entry>串行 and internal</entry>
+ <entry>串行</entry>
+ <entry>串行</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect3>
+ </sect2>
+
+ <sect2 id="serialconsole-tips">
+ <title>串行控制台的提示</title>
+
+ <sect3>
+ <title>设置一个快速的串口速度</title>
+
+ <para>默认的串口被设置成9600波特,8数据位, 无奇偶校验, 1个停止位。
+ 如果您希望改变速度, 就必须重新编译引导块。在 <filename>/etc/make.conf</filename>
+ 中添加下面一行, 然后编译新的引导块:</para>
+
+ <programlisting>BOOT_COMCONSOLE_SPEED=19200</programlisting>
+
+ <para>参见 <xref linkend="serialconsole-com2">
+ 以了解如何编译和安装新的引导块。</para>
+
+ <para>如果串行控制台用其他方法来配置而不是在启动时用
+ <option>-h</option>, 或内核使用的串行控制台与引导块使用的不同,
+ 就必须在内核配置中加入下面这行,并重新编译内核:</para>
+
+ <programlisting>options CONSPEED=19200</programlisting>
+ </sect3>
+
+ <sect3 id="serialconsole-com2">
+ <title>使用 <devicename>sio0</devicename> 以外的串口
+ 作为控制台</title>
+
+ <para>使用串口而不是 <devicename>sio0</devicename>
+ 作为控制台需要做一些重编译。 如果您无论如何都要使用另一个串口,
+ 重新编译引导块, 启动引导器和内核。</para>
+
+ <procedure>
+ <step>
+ <para>取得内核源代码 (参考 <xref linkend="cutting-edge">)。</para>
+ </step>
+
+ <step>
+ <para>编辑 <filename>/etc/make.conf</filename> 文件, 然后设置
+ <literal>BOOT_COMCONSOLE_PORT</literal>作为您要使用
+ (<literal>0x3f8</literal>、 <literal>0x2f8</literal>、 0x3E8
+ 或 0x2E8) 端口的地址。 只有 <devicename>sio0</devicename> 到
+ <devicename>sio3</devicename> (<devicename>COM1</devicename> 到
+ <devicename>COM4</devicename>) 都可以使用; 但多口串行卡将不会工作。
+ 不需要任何中断设置。</para>
+ </step>
+
+ <step>
+ <para>创建一个定制的内核配置文件, 在您要使用的串口添加合适的标记。
+ 例如, 如果要将 <devicename>sio1</devicename>
+ (<devicename>COM2</devicename>) 作为控制台:</para>
+
+ <programlisting>device sio1 at isa? port port IO_COM2 flags 0x10 irq 3</programlisting>
+
+ <para>or</para>
+
+ <programlisting>device sio1 at isa? port port IO_COM2 flags 0x30 irq 3</programlisting>
+
+ <para>其他端口的控制台标记也不要设。</para>
+ </step>
+
+ <step>
+ <para>重新编译和安装引导块:</para>
+
+ <screen>&prompt.root; <userinput>cd /sys/boot</userinput>
+&prompt.root; <userinput>make clean</userinput>
+&prompt.root; <userinput>make</userinput>
+&prompt.root; <userinput>make install</userinput></screen>
+ </step>
+
+ <step>
+ <para>重建和安装内核。</para>
+ </step>
+
+ <step>
+ <para>用 &man.disklabel.8;
+ 将引导块写到启动盘上,然后从新内核启动。</para>
+ </step>
+ </procedure>
+ </sect3>
+
+ <sect3 id="serialconsole-ddb">
+ <title>通过串行线进入DDB调试器</title>
+
+ <programlisting>options BREAK_TO_DEBUGGER
+options DDB</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>在串行控制台上得到一个登录命令行</title>
+
+ <para>您可能希望通过串行线进入登录提示, 现在您可以看到启动信息,
+ 通过串行控制台键入内核调试信息。可以这样做。</para>
+
+ <para>用一个编辑器打开 <filename>/etc/ttys</filename> 文件,
+ 然后找到下面的行:</para>
+
+ <programlisting>ttyd0 "/usr/libexec/getty std.9600" unknown off secure
+ttyd1 "/usr/libexec/getty std.9600" unknown off secure
+ttyd2 "/usr/libexec/getty std.9600" unknown off secure
+ttyd3 "/usr/libexec/getty std.9600" unknown off secure</programlisting>
+
+ <para><literal>ttyd0</literal> 到 <literal>ttyd3</literal> 相当于
+ <devicename>COM1</devicename> 到 <devicename>COM4</devicename>。
+ 可以打开或关闭某个端口。 如果您已经改变了串口的速度,
+ 还必须改掉标准的 9600 与当前的例如 19200 相匹配。</para>
+
+ <para>您也可以改变终端的类型从不知名的到您串行终端的真实类型。
+ 编辑完这个文件, 您必须 <command>kill -HUP 1</command>
+ 来使这个修改生效。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="serialconsole-loader">
+ <title>从启动引导器修改控制台</title>
+
+ <para>前面一节描述了如何通过调整引导块来设定串行控制台。
+ 这节将讲到在启动引导器中通过键入一些命令和环境变量来指定控制台。
+ 由于启动引导器会被启动进程的第三步所调用, 引导块以后,
+ 在启动引导器中的设置将忽略在引导块中的设置。</para>
+
+ <sect3>
+ <title>配置串行控制台</title>
+
+ <para>您可以很容易地指定启动引导器和内核来使用串行控制台, 只需要在
+ <filename>/boot/loader.rc</filename>中写入下面这行:</para>
+
+ <programlisting>set console=comconsole</programlisting>
+
+ <para>无论前一节中的引导块如何配置, 这个设置都会生效。</para>
+
+ <para>您最好把上面一行放在文件的第一行,
+ 以便尽早地在启动时看到串行控制台的启动信息。</para>
+
+ <para>同样地,您可以指定内部控制台为:</para>
+
+ <programlisting>set console=vidconsole</programlisting>
+
+ <para>如果您不设置启动引导环境变量控制台,
+ 启动引导器和内核将使用在引导块时用 <option>-h</option>
+ 选项指定的控制台。</para>
+
+ <para>在 3.2 以及更新的版本中,您可以在 <filename>/boot/loader.conf.local</filename>
+ 或 <filename>/boot/loader.conf</filename> 中,
+ 而不是在 <filename>/boot/loader.rc</filename> 指定控制台。
+ 用这种方法, 您的 <filename>/boot/loader.rc</filename>
+ 文件将是这样的:</para>
+
+ <programlisting>include /boot/loader.4th
+start</programlisting>
+
+ <para>然后, 创建 <filename>/boot/loader.conf.local</filename> 并加入下面的行。</para>
+
+ <programlisting>console=comconsole</programlisting>
+
+ <para>或</para>
+
+ <programlisting>console=vidconsole</programlisting>
+
+ <para>看看 &man.loader.conf.5; 的联机手册了解更多信息。</para>
+
+ <note>
+ <para>目前, 引导块还没有与引导加载器的
+ <option>-P</option> 选项等价的选项,
+ 此外也没有在存在键盘时自动选则使用什么控制台的能力。</para>
+ </note>
+ </sect3>
+
+ <sect3>
+ <title>使用串口而不是<devicename>sio0</devicename>作为控制台</title>
+
+ <para>要使用一个串口而不是 <devicename>sio0</devicename> 作为串行控制台
+ 需要重新编译启动引导器。下面的步骤跟
+ <xref linkend="serialconsole-com2"> 描述的相似。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="serialconsole-caveats">
+ <title>警告</title>
+
+ <para>这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。
+ 不幸的是, 绝大多数系统没有键盘可以让您启动,
+ 而没有显示设备就不让您启动。 使用 AMI BIOS 的机器可以通过在 CMOS
+ 中将 <quote>graphics adapter</quote> 项设为
+ <quote>Not installed</quote> 来在启动时不要求显示适配器。</para>
+
+ <para>然而, 许多机器并不支持这个选项,
+ 如果您的系统没有显示硬件就拒绝启动。 对于这些机器, 即使您没有显示器,
+ 也必须在机器上插上显示适配器。 建议您试试采用 AMI BIOS 的机器。</para>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/txtfiles.ent b/zh_CN.GB2312/books/handbook/txtfiles.ent
new file mode 100644
index 0000000000..a488ef26ec
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/txtfiles.ent
@@ -0,0 +1,72 @@
+<!--
+ Creates entities for each .txt screenshot that is included in the
+ Handbook.
+
+ Each entity is named txt.dir.foo, where dir is the directory in
+ which it is stored, and foo is its filename, without the '.txt'
+ extension.
+
+ Entities should be listed in alphabetical order.
+
+ Original Revision: 1.2
+ $FreeBSD$
+-->
+
+<!ENTITY txt.install.adduser1 SYSTEM "install/adduser1.txt">
+<!ENTITY txt.install.adduser2 SYSTEM "install/adduser2.txt">
+<!ENTITY txt.install.adduser3 SYSTEM "install/adduser3.txt">
+<!ENTITY txt.install.boot-mgr SYSTEM "install/boot-mgr.txt">
+<!ENTITY txt.install.console-saver1 SYSTEM "install/console-saver1.txt">
+<!ENTITY txt.install.console-saver2 SYSTEM "install/console-saver2.txt">
+<!ENTITY txt.install.console-saver3 SYSTEM "install/console-saver3.txt">
+<!ENTITY txt.install.console-saver4 SYSTEM "install/console-saver4.txt">
+<!ENTITY txt.install.desktop SYSTEM "install/desktop.txt">
+<!ENTITY txt.install.disklabel-auto SYSTEM "install/disklabel-auto.txt">
+<!ENTITY txt.install.disklabel-ed1 SYSTEM "install/disklabel-ed1.txt">
+<!ENTITY txt.install.disklabel-ed2 SYSTEM "install/disklabel-ed2.txt">
+<!ENTITY txt.install.disklabel-fs SYSTEM "install/disklabel-fs.txt">
+<!ENTITY txt.install.disklabel-root1 SYSTEM "install/disklabel-root1.txt">
+<!ENTITY txt.install.disklabel-root2 SYSTEM "install/disklabel-root2.txt">
+<!ENTITY txt.install.disklabel-root3 SYSTEM "install/disklabel-root3.txt">
+<!ENTITY txt.install.dist-set SYSTEM "install/dist-set.txt">
+<!ENTITY txt.install.dist-set2 SYSTEM "install/dist-set2.txt">
+<!ENTITY txt.install.docmenu1 SYSTEM "install/docmenu1.txt">
+<!ENTITY txt.install.ed0-conf SYSTEM "install/ed0-conf.txt">
+<!ENTITY txt.install.ed0-conf2 SYSTEM "install/ed0-conf2.txt">
+<!ENTITY txt.install.edit-inetd-conf SYSTEM "install/edit-inetd-conf.txt">
+<!ENTITY txt.install.fdisk-drive1 SYSTEM "install/fdisk-drive1.txt">
+<!ENTITY txt.install.fdisk-drive2 SYSTEM "install/fdisk-drive2.txt">
+<!ENTITY txt.install.fdisk-edit1 SYSTEM "install/fdisk-edit1.txt">
+<!ENTITY txt.install.fdisk-edit2 SYSTEM "install/fdisk-edit2.txt">
+<!ENTITY txt.install.ftp-anon1 SYSTEM "install/ftp-anon1.txt">
+<!ENTITY txt.install.ftp-anon2 SYSTEM "install/ftp-anon2.txt">
+<!ENTITY txt.install.hdwrconf SYSTEM "install/hdwrconf.txt">
+<!ENTITY txt.install.keymap SYSTEM "install/keymap.txt">
+<!ENTITY txt.install.main-doc SYSTEM "install/main-doc.txt">
+<!ENTITY txt.install.main-keymap SYSTEM "install/main-keymap.txt">
+<!ENTITY txt.install.main-options SYSTEM "install/main-options.txt">
+<!ENTITY txt.install.main-std SYSTEM "install/main-std.txt">
+<!ENTITY txt.install.main1 SYSTEM "install/main1.txt">
+<!ENTITY txt.install.mainexit SYSTEM "install/mainexit.txt">
+<!ENTITY txt.install.media SYSTEM "install/media.txt">
+<!ENTITY txt.install.mouse1 SYSTEM "install/mouse1.txt">
+<!ENTITY txt.install.mouse2 SYSTEM "install/mouse2.txt">
+<!ENTITY txt.install.mouse3 SYSTEM "install/mouse3.txt">
+<!ENTITY txt.install.mouse4 SYSTEM "install/mouse4.txt">
+<!ENTITY txt.install.mouse5 SYSTEM "install/mouse5.txt">
+<!ENTITY txt.install.mouse6 SYSTEM "install/mouse6.txt">
+<!ENTITY txt.install.nfs-server-edit SYSTEM "install/nfs-server-edit.txt">
+<!ENTITY txt.install.options SYSTEM "install/options.txt">
+<!ENTITY txt.install.pkg-cat SYSTEM "install/pkg-cat.txt">
+<!ENTITY txt.install.pkg-confirm SYSTEM "install/pkg-confirm.txt">
+<!ENTITY txt.install.pkg-install SYSTEM "install/pkg-install.txt">
+<!ENTITY txt.install.pkg-sel SYSTEM "install/pkg-sel.txt">
+<!ENTITY txt.install.probstart SYSTEM "install/probstart.txt">
+<!ENTITY txt.install.security SYSTEM "install/security.txt">
+<!ENTITY txt.install.sysinstall-exit SYSTEM "install/sysinstall-exit.txt">
+<!ENTITY txt.install.timezone1 SYSTEM "install/timezone1.txt">
+<!ENTITY txt.install.timezone2 SYSTEM "install/timezone2.txt">
+<!ENTITY txt.install.timezone3 SYSTEM "install/timezone3.txt">
+<!ENTITY txt.install.userconfig SYSTEM "../../../share/images/books/handbook/install/userconfig.txt">
+<!ENTITY txt.install.userconfig2 SYSTEM "../../../share/images/books/handbook/install/userconfig2.txt">
+<!ENTITY txt.install.xf86setup SYSTEM "install/xf86setup.txt">
diff --git a/zh_CN.GB2312/books/handbook/users/Makefile b/zh_CN.GB2312/books/handbook/users/Makefile
new file mode 100644
index 0000000000..7fbe5dd83d
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/users/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= users/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/users/chapter.sgml b/zh_CN.GB2312/books/handbook/users/chapter.sgml
new file mode 100644
index 0000000000..5260329caf
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/users/chapter.sgml
@@ -0,0 +1,973 @@
+<!--
+ The FreeBSD Chinese Documentation Project
+
+ Original Revision: 1.47
+ $FreeBSD$
+-->
+
+<chapter id="users">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Neil</firstname>
+ <surname>Blakey-Milner</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ <!-- Feb 2000 -->
+ </chapterinfo>
+
+ <title>用户和基本的帐户管理</title>
+
+ <sect1 id="users-synopsis">
+ <title>概述</title>
+
+ <para>FreeBSD允许多个用户同时使用计算机. 当然,这些用户中不是很多人同时坐在同一台计算机前.
+ <footnote>
+ <para>Well, 除非您连接多个终端设备,这种情况我们在<xref linkend="serialcomms">讨论.</para>
+ </footnote>,而是其他用户可以通过网络来使用同一台计算机以完成他们的工作.要使用系统,每个人都应该有一个帐户.</para>
+
+ <para>读完这章,您将了解到:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>在一个FreeBSD系统上不同用户帐户之间的区别.</para>
+ </listitem>
+
+ <listitem>
+ <para>如何添加用户帐户.</para>
+ </listitem>
+
+ <listitem>
+ <para>如何删除用户帐户.</para>
+ </listitem>
+
+ <listitem>
+ <para>如何改变帐户细节,如用户的全名,或首选的shell.</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在每个帐户基础上设置限制,来控制像内存,CPU时钟这样的资源.</para>
+ </listitem>
+
+ <listitem>
+ <para>如何使用组来使帐户管理更容易.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在阅读这章之前,您应当了解:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>了解&unix;和FreeBSD的基础知识 (<xref
+ linkend="basics">).</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="users-introduction">
+ <title>介绍</title>
+
+ <para>所有访问系统的用户都是通过帐户完成的,所以用户和帐户管理是FreeBSD系统不可或缺的重要部分.</para>
+
+ <para>每个FreeBSD系统的帐户都有一些和它相对应的信息去验证它.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>用户名</term>
+
+ <listitem>
+ <para>用户名在<prompt>login:</prompt> 提示符的后面键入。
+ 用户名对于一台计算机来讲是唯一的;
+ 您不可以使用两个相同的用户名来登录。
+ 有很多用来创建正确用户名的规则, 具体请参考 &man.passwd.5;;
+ 您使用的用户名通常需要8个或更少的小写字母。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>口令</term>
+
+ <listitem>
+ <para>每个帐户都有一个口令与它对应。
+ 口令可以是空的, 这样不需要口令就可以访问系统。
+ 这通常不是一个好主意; 每个帐户都应该有口令。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>用户 ID (UID)</term>
+
+ <listitem>
+ <para>UID是系统用来识别用户的数字,传统上它的范围是0到65536之间<footnote id="users-largeuidgid">
+ <para>可以使用的 UID/GID 的最大值是
+ 4294967295, 但这可能会给采用上述假定的软件造成严重的问题。</para>
+ </footnote>,用以唯一地标识用户。
+ FreeBSD在内部使用UID来识别用户 &mdash; 在工作以前。
+ 任何允许您指定一个用户名的 FreeBSD 命令都会把它转换成UID。
+ 这意味着您可以用不同的用户名使用多个帐户, 但它们的UID是一样的。
+ FreeBSD 会把这些帐户认定是同一个用户。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>组ID (GID)</term>
+
+ <listitem>
+ <para>GID是用来识别用户所在的组的, 传统上范围在0到65536之间<footnoteref linkend="users-largeuidgid">的数字。
+ 组是一种基于用户GID而不是它们的UID的用来控制用户访问资源的机制。 这可以减少一些配置文件的大小。
+ 一个用户也可以属于多个组。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>登录类</term>
+
+ <listitem>
+ <para>登录类是对组机制的扩展,当把系统分配给不同用户时,它提供了额外的灵活性.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>口令的定期更改</term>
+
+ <listitem>
+ <para>默认情况下, FreeBSD 并不强制用户去改变他们的口令。
+ 您可以以用户为单位强制要求一些或所有的用户定期改变他们的口令。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>帐户的到期时间</term>
+
+ <listitem>
+ <para>默认情况下 FreeBSD 不会自动完成帐户过期操作。
+ 如果您正在创建帐户, 您应该知道一个帐户的有效使用期限。
+ 例如, 在学校里您会为每个学生建立一个帐户,
+ 您可以指定它们何时过期。
+ 帐户过期后, 虽然帐户的目录和文件仍然存在,
+ 但帐户已经不能继续使用了。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>用户的全名</term>
+
+ <listitem>
+ <para>用户名可以唯一地识别FreeBSD的帐户,
+ 但它不会反映用户的全名。 这些信息可能与帐户是相关的。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>主目录</term>
+
+ <listitem>
+ <para>主目录是用户用来启动的目录的完全路径。
+ 一个通常的规则是把所有用户的主目录都放在
+ <filename>/home/<replaceable>username</replaceable></filename>
+ 下,或者
+ <filename>/usr/home/<replaceable>username</replaceable></filename>
+ 下。 用户将把他们的个人文件放在自己的主目录下,
+ 他们可以在那里创建任何目录.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>用户 shell</term>
+
+ <listitem>
+ <para>Shell提供了用户用来操作系统的默认环境。 有很多不同的shell,
+ 有经验的用户会根据他们的经验来选择自己喜好的shell。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>有三种类型的帐户: <link
+ linkend="users-superuser">超级用户</link>, <link
+ linkend="users-system">系统用户</link>, 以及 <link
+ linkend="users-user">普通用户</link>。
+ 超级用户帐户通常叫做 <username>root</username>,
+ 可以没有限制地管理系统。 系统用户运行服务。
+ 最后, 普通用户给那些登录系统以及阅读邮件的人使用。</para>
+ </sect1>
+
+ <sect1 id="users-superuser">
+ <title>超级用户帐户</title>
+
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>超级用户 (root)</secondary>
+ </indexterm>
+ <para>超级用户帐户,
+ 通常叫做 <username>root</username>,
+ 可以重新配置和管理系统, 在收发邮件, 系统检查或编程这样的日常工作中,
+ 尽量不要使用root权限。</para>
+
+ <para>这是因为不象普通用户帐户, 超级用户能够无限制地操作系统,
+ 超级用户帐户的滥用可能会引起无法想象的灾难。
+ 普通的用户帐户不会由于出错而破坏系统, 所以要尽可能的使用普通帐户,
+ 除非您需要额外的特权。</para>
+
+ <para>在使用超级用户命令时要再三检查,
+ 因为一个额外的空格或缺少某个字符的命令都可能会引起数据丢失。</para>
+
+ <para>所以, 在阅读完这章后您第一件要做的事就是,
+ 在平时使用的时候, 创建一个没有特权的用户帐户。
+ 无论您使用的是单用户还是多用户系统这样的申请都是相同的。 在这章的后面,
+ 我们将讨论如何创建一个额外的帐户和如何在普通用户和超级用户之间进行切换。</para>
+ </sect1>
+
+ <sect1 id="users-system">
+ <title>系统帐户</title>
+
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>系统</secondary>
+ </indexterm>
+ <para>系统用户是那些要使用诸如DNS、 邮件, web等服务的用户。
+ 使用帐户的原因就是安全; 如果所有的用户都由超级用户来运行,
+ 那它们就可以不受约束地做任何事情。</para>
+
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary><username>daemon</username></secondary>
+ </indexterm>
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary><username>operator</username></secondary>
+ </indexterm>
+ <para>系统帐户可以是<username>daemon</username>,
+ <username>operator</username>、 <username>bind</username>
+ (供域名服务使用),和<username>news</username>。 系统管理员经常创建
+ <username>httpd</username> 来运行 web 服务器。</para>
+
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary><username>nobody</username></secondary>
+ </indexterm>
+ <para><username>nobody</username> 是普通的没有特权的系统用户。
+ 然而, 大多数与用户联系很密切的服务是使用
+ <username>nobody</username>的, 记的这点非常重要,
+ 这样可能使用户变的非常有特权。</para>
+ </sect1>
+
+ <sect1 id="users-user">
+ <title>用户帐户</title>
+
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>用户</secondary>
+ </indexterm>
+ <para>用户帐户是让真实的用户访问系统的主要方式,
+ 这些帐户把用户和环境隔离, 能阻止用户损坏系统和其他用户,
+ 在不影响其他用户的情况之下定制自己的环境。</para>
+
+ <para>任何人访问您的系统必须要有他们自己唯一的帐户。
+ 这可以让您找到谁做了什么事,
+ 并且阻止人们破坏其他用户的设置和阅读其他人的邮件等等。</para>
+
+ <para>每个用户能够设置他们自己的环境, 以利于他们通过改变shell,
+ 编辑器, 键盘绑定和语言等适应并且更好的使用这个系统。</para>
+ </sect1>
+
+ <sect1 id="users-modifying">
+ <title>修改帐户</title>
+
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>修改</secondary>
+ </indexterm>
+
+ <para>在&unix; 的处理用户帐户的环境中有很多不同的命令可用.
+ 最普通的命令如下, 接下来是详细使用它们的例子。</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <colspec colwidth="1*">
+ <colspec colwidth="2*">
+
+ <thead>
+ <row>
+ <entry>命令</entry>
+ <entry>摘要</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>&man.adduser.8;</entry>
+ <entry>在命令行添加新用户.</entry>
+ </row>
+ <row>
+ <entry>&man.rmuser.8;</entry>
+ <entry>在命令行删除用户.</entry>
+ </row>
+ <row>
+ <entry>&man.chpass.1;</entry>
+ <entry>一个灵活的用于修改用户数据库信息的工具.</entry>
+ </row>
+ <row>
+ <entry>&man.passwd.1;</entry>
+ <entry>一个用于修改用户口令的简单的命令行工具.</entry>
+ </row>
+ <row>
+ <entry>&man.pw.8;</entry>
+ <entry>一个强大灵活修改用户帐户的工具.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <sect2 id="users-adduser">
+ <title><command>添加用户</command></title>
+
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>添加</secondary>
+ </indexterm>
+ <indexterm>
+ <primary><command>添加用户</command></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename class=directory>/usr/share/skel</filename></primary>
+ </indexterm>
+ <indexterm><primary>skeleton directory</primary></indexterm>
+ <para>&man.adduser.8; 是一个简单的添加新用户的命令. 它为用户创建
+ <filename>passwd</filename> 和 <filename>group</filename>
+ 文件。 它也为新用户创建一个主目录, 它拷贝一个默认的配置文件
+ (<quote>dotfiles</quote>) 从 <filename>/usr/share/skel</filename>
+ 这个目录, 然后给新用户发送一封带欢迎信息的邮件。</para>
+
+ <para>在&os;&nbsp;5.0版本, &man.adduser.8;命令从Perl脚本改写为shell脚本,
+ 起包装&man.pw.8;的作用, 所以它的用法在 &os;&nbsp;4.X
+ 上和 &os;&nbsp;5.X 上略有不同。</para>
+
+ <para>建立初始化配置文件, 使用
+ <command>adduser -s -config_create</command>.
+ <footnote>
+ <para>选项<option>-s</option>&man.adduser.8;
+ 是。 当我们想要改变默认设置可以使用<option>-v</option>选项</para>
+ </footnote>
+ 接下来, 我们配置 &man.adduser.8; 的默认设置,
+ 并建立第一个普通用户帐户, 因为将
+ <username>root</username> 用于日常使用会带来很多潜在问题。</para>
+
+ <example>
+ <title>配置 <command>adduser</command> 和添加一个新用户,在&os;&nbsp;4.X版本</title>
+
+ <screen>&prompt.root; <userinput>adduser -v</userinput> Use option ``-silent'' if you don't want to see all warnings and questions.
+Check /etc/shells
+Check /etc/master.passwd
+Check /etc/group
+Enter your default shell: csh date no sh tcsh zsh [sh]: <userinput>zsh</userinput> Your default shell is: zsh -&gt; /usr/local/bin/zsh Enter your default HOME partition: [/home]:
+Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
+Send message from file: /etc/adduser.message no
+[/etc/adduser.message]: <userinput>no</userinput> Do not send message Use passwords (y/n) [y]: <userinput>y</userinput>
+
+Write your changes to /etc/adduser.conf? (y/n) [n]: <userinput>y</userinput>
+
+Ok, let's go.
+Don't worry about mistakes. I will give you the chance later to correct any input.
+Enter username [a-z0-9_-]: <userinput>jru</userinput> Enter full name []: <userinput>J. Random User</userinput> Enter shell csh date no sh tcsh zsh [zsh]:
+Enter home directory (full path) [/home/jru]:
+Uid [1001]:
+Enter login class: default []:
+Login group jru [jru]:
+Login group is ``jru''. Invite jru into other groups: guest no
+[no]: <userinput>wheel</userinput>
+Enter password []:
+Enter password again []:
+
+Name: jru
+Password: ****
+Fullname: J. Random User
+Uid: 1001
+Gid: 1001 (jru)
+Class:
+Groups: jru wheel
+HOME: /home/jru
+Shell: /usr/local/bin/zsh
+OK? (y/n) [y]: <userinput>y</userinput>
+Added user ``jru''
+Copy files from /usr/share/skel to /home/jru Add another user? (y/n) [y]: <userinput>n</userinput> Goodbye!
+&prompt.root;</screen>
+ </example>
+
+ <para>总体而言, 我们把默认的shell设置成
+ <application>zsh</application> (一个可以在 Ports Collection 找到的
+ shell), 关闭欢迎邮件。 然后保存配置,
+ 接着创建一个名为 <username>jru</username>的帐户,
+ 并且确信 <username>jru</username> 在
+ <username>wheel</username> 组里 (这样它就能够通过 &man.su.1;
+ 转变为 <username>root</username>。)</para>
+
+ <note>
+ <para>口令不会被回显, 也不会用星号来显示。
+ 两次输入的口令必须一致。
+ </para>
+ </note>
+
+ <note>
+ <para>从现在起, 使用 &man.adduser.8; 不再需要改变默认设置。
+ 如果您要求改变默认设置, 先退出程序,
+ 然后使用 <option>-s</option> 选项。</para>
+ </note>
+
+ <example>
+ <title>添加一个新用户在&os;&nbsp;5.X版本</title>
+
+ <screen>&prompt.root; <userinput>adduser</userinput>
+Username: <userinput>jru</userinput>
+Full name: <userinput>J. Random User</userinput> Uid (Leave empty for default):
+Login group [jru]:
+Login group is jru. Invite jru into other groups? []: <userinput>wheel</userinput> Login class [default]:
+Shell (sh csh tcsh zsh nologin) [sh]: <userinput>zsh</userinput> Home directory [/home/jru]:
+Use password-based authentication? [yes]:
+Use an empty password? (yes/no) [no]:
+Use a random password? (yes/no) [no]:
+Enter password:
+Enter password again:
+Lock out the account after creation? [no]:
+Username : jru
+Password : ****
+Full Name : J. Random User
+Uid : 1001
+Class :
+Groups : jru wheel
+Home : /home/jru
+Shell : /usr/local/bin/zsh
+Locked : no
+OK? (yes/no): <userinput>yes</userinput>
+adduser: INFO: Successfully added (jru) to the user database.
+Add another user? (yes/no): <userinput>no</userinput> Goodbye!
+&prompt.root;</screen>
+ </example>
+ </sect2>
+
+ <sect2 id="users-rmuser">
+ <title><command>删除用户</command></title>
+
+ <indexterm><primary><command>rmuser</command></primary></indexterm>
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>删除</secondary>
+ </indexterm>
+
+ <para>您可以使用&man.rmuser.8; 从系统中完全删除一个用户.
+ &man.rmuser.8; 执行如下步骤:</para>
+
+ <procedure>
+ <step>
+ <para>删除用户的 &man.crontab.1; 记录 (如果有的话).</para>
+ </step>
+ <step>
+ <para>删除属于用户的&man.at.1; 工作.</para>
+ </step>
+ <step>
+ <para>杀掉属于用户的所有进程.</para>
+ </step>
+ <step>
+ <para>删除本地口令文件中的用户.</para>
+ </step>
+ <step>
+ <para>删除用户的主目录 (如果他有自己的主目录).</para>
+ </step>
+ <step>
+ <para>删除来自 <filename>/var/mail</filename>属于用户的邮件.</para>
+ </step>
+ <step>
+ <para>删除所有诸如 <filename>/tmp</filename>的临时文件存储区中的文件.</para>
+ </step>
+ <step>
+ <para>最后, 删除 <filename>/etc/group</filename>中所有属于组的该用户名.
+
+ <note>
+ <para>如果一个组变成空,而组名和用户名一样,组将被删除.
+ &man.adduser.8;命令建立每个用户唯一的组.</para>
+ </note>
+ </para>
+ </step>
+ </procedure>
+
+ <para>&man.rmuser.8; 不能用来删除超级用户的帐户, 因为那样做是对系统极大的破坏.</para>
+
+ <para>默认情况下, 使用交互模式, 这样能够让您清楚的知道您在做什么.</para>
+
+ <example>
+ <title><command>删除用户</command> 交互模式下的帐户删除</title>
+
+ <screen>&prompt.root; <userinput>rmuser jru</userinput> Matching password entry:
+jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh Is this the entry you wish to remove? <userinput>y</userinput> Remove user's home directory (/home/jru)? <userinput>y</userinput> Updating password file, updating databases, done.
+Updating group file: trusted (removing group jru -- personal group is empty) done.
+Removing user's incoming mail file /var/mail/jru: done.
+Removing files belonging to jru from /tmp: done.
+Removing files belonging to jru from /var/tmp: done.
+Removing files belonging to jru from /var/tmp/vi.recover: done.
+&prompt.root;</screen>
+ </example>
+ </sect2>
+
+ <sect2 id="users-chpass">
+ <title><command>chpass</command></title>
+
+ <indexterm><primary><command>chpass</command></primary></indexterm>
+ <para>&man.chpass.1; 可以改变用户的口令, shells, 和包括个人信息在内的数据库信息.</para>
+
+ <para>只有系统管理员, 既超级用户, 才可以用&man.chpass.1;改变其他用户口令和信息.</para>
+
+ <para>除了可选择的用户名,
+ 不需要任何选项, &man.chpass.1; 将显示一个包含用户信息的编辑器. 可以试图改变用户在数据库中的信息.</para>
+
+ <note>
+ <para>在 &os;&nbsp;5.X版本, 编辑退出后,您应该索要您的口令,如果您不是超级用户的话.</para>
+ </note>
+
+ <example>
+ <title>以超级用户交互执行 <command>chpass</command> 命令</title>
+
+ <screen>#Changing user database information for jru.
+Login: jru
+Password: *
+Uid [#]: 1001
+Gid [# or name]: 1001
+Change [month day year]:
+Expire [month day year]:
+Class:
+Home directory: /home/jru
+Shell: /usr/local/bin/zsh
+Full Name: J. Random User
+Office Location:
+Office Phone:
+Home Phone:
+Other information:</screen>
+ </example>
+
+ <para>普通用户只能改变他们自己很少的一部分信息.</para>
+
+ <example>
+ <title>以普通用户交互执行 <command>chpass</command> 命令</title>
+
+ <screen>#Changing user database information for jru.
+Shell: /usr/local/bin/zsh
+Full Name: J. Random User
+Office Location:
+Office Phone:
+Home Phone:
+Other information:</screen>
+ </example>
+
+ <note>
+ <para>&man.chfn.1; 和 &man.chsh.1; 只是到 &man.chpass.1; 的符号连接,
+ 类似地,
+ &man.ypchpass.1;, &man.ypchfn.1;
+ 以及 &man.ypchsh.1; 也是这样。
+ NIS 是自动支持的,
+ 不一定要在命令前指定 <literal>yp</literal>。
+ 如果这让您有点不太明白, 不必担心,
+ NIS 将在 <xref linkend="advanced-networking"> 介绍。</para>
+ </note>
+ </sect2>
+ <sect2 id="users-passwd">
+ <title><command>passwd命令</command></title>
+
+ <indexterm><primary><command>passwd命令</command></primary></indexterm>
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>改变口令</secondary>
+ </indexterm>
+ <para>&man.passwd.1; 是改变您自己作为一个普通用户口令或者作为超级用户口令常用的方法.</para>
+
+ <note>
+ <para>用户改变口令前必须键入原来的口令, 防止用户离开终端时非授权的用户进入改变合法用户的口令。</para>
+ </note>
+
+ <example>
+ <title>改变您的口令</title>
+
+ <screen>&prompt.user; <userinput>passwd</userinput> Changing local password for jru.
+Old password:
+New password:
+Retype new password:
+passwd: updating the database...
+passwd: done</screen>
+ </example>
+
+ <example>
+ <title>改变其他用户的口令同超级用户的一样</title>
+
+ <screen>&prompt.root; <userinput>passwd jru</userinput> Changing local password for jru.
+New password:
+Retype new password:
+passwd: updating the database...
+passwd: done</screen>
+ </example>
+
+ <note>
+ <para>就象 &man.chpass.1;一样,
+ &man.yppasswd.1; 只是一个到
+ &man.passwd.1;的连接, 所以NIS用任何一个命令都可以正常工作.</para>
+ </note>
+ </sect2>
+
+
+ <sect2 id="users-pw">
+ <title><command>pw命令</command></title>
+ <indexterm><primary><command>pw命令</command></primary></indexterm>
+
+ <para>&man.pw.8; 是一个用来创建、删除、修改、显示用户和组的命令行工具。
+ 它还有系统用户和组文件编辑器的功能。 &man.pw.8;
+ 有一个非常强大的命令行选项设置,
+ 但新用户可能会觉得它比这里讲的其它命令要复杂很多。</para>
+ </sect2>
+
+
+ </sect1>
+
+ <sect1 id="users-limiting">
+ <title>限制用户使用系统资源</title>
+
+ <indexterm><primary>限制用户使用系统资源</primary></indexterm>
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>限制</secondary>
+ </indexterm>
+ <para>如果您有一些用户, 并想要对他们所使用的系统资源加以限制,
+ FreeBSD 提供了一些系统管理员限制用户访问系统资源的方法。
+ 这些限制通常被分为两种: 磁盘配额, 以及其它资源限制。</para>
+
+ <indexterm><primary>配额</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>配额</secondary>
+ </indexterm>
+ <indexterm><primary>磁盘配额</primary></indexterm>
+ <para>磁盘配额限制用户对磁盘的使用,
+ 而且它还提供一种快速检查用户使用磁盘数量而不需要时刻计算的方法。
+ 配额将在 <xref
+ linkend="quotas">讨论.</para>
+
+ <para>其它资源限制包括CPU、 内存以及用户可能会使用的其它资源。
+ 这些是通过对登录进行分类完成的, 下面将做讨论。</para>
+
+ <indexterm>
+ <primary><filename>/etc/login.conf</filename></primary>
+ </indexterm>
+ <para>登录的类由 <filename>/etc/login.conf</filename> 文件定义。
+ 比较精确的描述超出了本章的范围, 但 &man.login.conf.5;
+ 联机手册会有比较详细的描述。 可以说每个用户都分配到一个登录类
+ (默认是 <literal>defalut</literal>),
+ 每个登录类都有一套和它相对应的功能。 登录功能是
+ <literal><replaceable>名字</replaceable>=<replaceable>值</replaceable></literal>
+ 这样的一对值, 其中<replaceable>名字</replaceable>
+ 是一个众所周知的标识符, <replaceable>值</replaceable>
+ 是一个根据名字经过处理得到的任意字符串。 设置登录类和功能相当简单,
+ 在 &man.login.conf.5; 联机手册会有比较详细的描述。</para>
+
+ <note>
+ <para>系统并不直接读取
+ <filename>/etc/login.conf</filename> 中的配置,
+ 相反, 它读取数据库文件
+ <filename>/etc/login.conf.db</filename>。
+ 为了从 <filename>/etc/login.conf</filename> 生成
+ <filename>/etc/login.conf.db</filename>,
+ 需要执行下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>cap_mkdb /etc/login.conf</userinput></screen>
+ </note>
+
+ <para>资源限制与普通登录限制是有区别的。
+ 首先, 对于每种限制, 有软限制 (比较常见) 和硬限制之分。
+ 一个软限制可能被用户调整过, 但不会超过硬限制。
+ 越往后可能越低, 但不会升高。 其次,
+ 绝大多数资源限制会分配特定用户的每个进程, 而不是该用户的全部进程。
+ 注意, 这些区别是资源限制的特殊操作所规定的,
+ 不是登录功能框架的完成 (也就是说, 他们<emphasis>实际上</emphasis>
+ 不是一个登录功能的特例)。</para>
+
+ <para>不再罗嗦了, 下面是绝大多数资源限制的例子
+ (您可以在 &man.login.conf.5; 找到其它与登录功能相关的内容)。</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>coredumpsize</literal></term>
+
+ <listitem>
+ <indexterm><primary>coredumpsize</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>coredumpsize</secondary>
+ </indexterm>
+ <para>很明显, 由程序产生的核心文件大小的限制在磁盘使用上是属于其它限制的
+ (例如, <literal>文件大小</literal>, 磁盘配额)。
+ 不过, 由于用户自己无法产生核心文件, 而且通常并不删除它们,
+ 设置这个可以尽量避免由于一个大型应用程序的崩溃所造成的大量磁盘空间的浪费。
+ (例如, <application>emacs</application>) 崩溃。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>cputime</literal></term>
+
+ <listitem>
+ <indexterm><primary>cputime</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>cputime</secondary>
+ </indexterm>
+ <para>这是一个用户程序所能消耗掉的最大CPU时钟数量. 一些不理想的进程会被内核杀掉.
+
+ <note>
+ <para>这是一个有关CPU消耗的<emphasis>时钟</emphasis>
+ 限制, 不是&man.top.1; 和 &man.ps.1;
+ 命令时屏幕上显示的CPU消耗的百分比。 在写此说明时,
+ 后者的限制是是不太可能和没有价值的: 编译器 &mdash;
+ 编译一个可能是合法的工作 &mdash; 可以在某一时刻轻易的用掉
+ 100% 的 CPU。</para>
+ </note>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>filesize</literal></term>
+
+ <listitem>
+ <indexterm><primary>filesize</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>filesize</secondary>
+ </indexterm>
+ <para>这是用户可以处理一个文件的最大值。
+ 不象 <link linkend="quotas">磁盘配额</link>,
+ 这个限制是对单个文件强制执行的,
+ 不是用户自己的所有文件。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>maxproc</literal></term>
+
+ <listitem>
+ <indexterm><primary>maxproc</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>maxproc</secondary>
+ </indexterm>
+ <para>这是一个用户可以运行的最大进程数。
+ 这包括前台和后台进程。 很明显, 这不可能比系统指定
+ <varname>kern.maxproc</varname> &man.sysctl.8;
+ 的限制要大。 同时也要注意, 设置的过小会妨碍用户的处理能力:
+ 可能需要多次登录或执行多个管道。 一些任务,
+ 例如编译一些大的程序, 也可能会产生很多进程
+ (例如, &man.make.1;, &man.cc.1; 以及其它一些预处理程序)。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>memorylocked</literal></term>
+
+ <listitem>
+ <indexterm><primary>memorylocked</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>memorylocked</secondary>
+ </indexterm>
+ <para>这是一个进程可能会被锁定到主存中的最大内存数量 (参见
+ &man.mlock.2;)。 大型程序,
+ 例如像 &man.amd.8; 在遇到问题时,
+ 它们得到的巨大交换量无法传递给系统进行处理。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>memoryuse</literal></term>
+
+ <listitem>
+ <indexterm><primary>memoryuse</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>memoryuse</secondary>
+ </indexterm>
+ <para>这是在给定时间内一个进程可能消耗的最大内存数量。
+ 它包括核心内存和交换内存。
+ 在限制内存消耗方面, 这不是一个完全的限制,但它是一个好的开始。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>openfiles</literal></term>
+
+ <listitem>
+ <indexterm><primary>openfiles</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>openfiles</secondary>
+ </indexterm>
+ <para>这是一个进程可以打开的最大文件数。 在FreeBSD中,
+ 文件可以被表现为套接字和IPC通道; 注意不要把这个数设置的太小。
+ 系统级的限制是由 <varname>kern.maxfiles</varname>
+ 定义的, 详情参见 &man.sysctl.8;。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>sbsize</literal></term>
+
+ <listitem>
+ <indexterm><primary>sbsize</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>sbsize</secondary>
+ </indexterm>
+ <para>这是网络内存数量的限制,
+ 这主要是针对通过创建许多套接字的老式 DoS 攻击的,
+ 但也可以用来限制网络通信。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>stacksize</literal></term>
+
+ <listitem>
+ <indexterm><primary>stacksize</primary></indexterm>
+ <indexterm>
+ <primary>限制用户使用系统资源</primary>
+ <secondary>stacksize</secondary>
+ </indexterm>
+ <para>这是一个进程堆栈可能达到的最大值。
+ 它不能单独的限制一个程序可能使用的内存数量;
+ 所以, 需要与其它的限制手段配合使用。</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>在设置资源限制时, 有一些其他的事需要注意。
+ 下面是一些通常的技巧、 建议和注意事项。</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>系统启动的进程<filename>/etc/rc</filename>会被指派给
+ <literal>守护程序</literal> 的登录类.</para>
+ </listitem>
+
+ <listitem>
+ <para>虽然 <filename>/etc/login.conf</filename>
+ 文件是一个对绝大多数限制做合理配置的资源文件,
+ 但只有您也就是系统管理员,才知道什么最适合您的系统。
+ 设置的太高可能会因为过于开放而造成系统的被人滥用,
+ 设置的过低则会降低效率。</para>
+ </listitem>
+
+ <listitem>
+ <para>使用 X Window 的用户可能要比其他用户使用更多的资源。
+ 因为X11本身就使用很多资源, 而且它鼓励用户同时运行更多的程序。</para>
+ </listitem>
+
+ <listitem>
+ <para>要记得许多限制会被用于单个进程, 不是用户的所有进程。
+ 例如, 将 <varname>openfiles</varname> 设置为 50
+ 意味着每个用户进程最高只能打开 50 个文件。 然而,
+ 用户可以打开的文件的总的大小是根据
+ <literal>maxproc</literal>
+ 值逐步增加的
+ <literal>openfiles</literal> 值。
+ 同样的规则也适用于内存相关的限制。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>有关资源限制,登录类的更深入信息可以查看相关联机手册:
+ &man.cap.mkdb.1;, &man.getrlimit.2;, &man.login.conf.5;.</para>
+ </sect1>
+
+ <sect1 id="users-personalizing">
+ <title>个性化用户设置</title>
+
+ <para>本地化是由系统管理员或用户设置的的一个环境,
+ 它可以用来调整不同的语言、 字符设置、 时钟时区等等。
+ 这将在 <link linkend="l10n">本地化</link> 一章做详细讨论。</para>
+ </sect1>
+
+ <sect1 id="users-groups">
+ <title>组</title>
+
+ <indexterm><primary>组</primary></indexterm>
+ <indexterm>
+ <primary><filename>/etc/groups</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary>帐户</primary>
+ <secondary>组</secondary>
+ </indexterm>
+ <para>组简单的讲就是一个用户列表. 组通过组名和GID (组 ID) 来识别。
+ 在 FreeBSD (以及绝大多数其他 &unix; 系统) 中,
+ 内核用以决定一个进程是能够完成一项动作的两个因素是它所属的用户 ID
+ 和组 ID。 与用户 ID 不同, 每个进程都有一个和它相关联的组的列表。
+ 您可能听说过用户或进程的 <quote>组 ID</quote>;
+ 大多数情况下, 这表示列表中的第一个组。</para>
+
+ <para>与组ID对应的组名在<filename>/etc/group</filename>中。
+ 这是一个由冒号来界定的文本文件。 第一部分是组名,
+ 第二部分是加密后的口令, 第三部分是组ID,
+ 第四部分是以逗号相隔的成员列表。 它可以用手工方式进行编辑
+ (当然, 如果您能保证不出语法错误的话!)。
+ 对于更完整的语法描述, 参见 &man.group.5; 联机手册.</para>
+
+ <para>假如您想要手工编辑<filename>/etc/group</filename>,
+ 您可以使用 &man.pw.8; 添加和编辑组。 例如,
+ 要添加一个叫 <groupname>teamtwo</groupname> 的组,
+ 确定它存在:</para>
+
+ <example>
+ <title>使用&man.pw.8;添加一个组</title>
+
+ <screen>&prompt.root; <userinput>pw groupadd teamtwo</userinput> &prompt.root; <userinput>pw groupshow teamtwo</userinput> teamtwo:*:1100:</screen>
+ </example>
+
+ <para>上面的数字 <literal>1100</literal> 是组
+ <groupname>teamtwo</groupname> 的组 ID。
+ 目前, <groupname>teamtwo</groupname> 还没有成员,
+ 因此也就没有多大用处。
+ 接下来, 把 <username>jru</username> 加入到
+ <groupname>teamtwo</groupname> 组。</para>
+
+ <example>
+ <title>使用 &man.pw.8; 在组中添加用户</title>
+
+ <screen>&prompt.root; <userinput>pw groupmod teamtwo -M jru</userinput> &prompt.root; <userinput>pw groupshow teamtwo</userinput> teamtwo:*:1100:jru</screen>
+ </example>
+
+ <para><option>-M</option> 所需的参数是一个用逗号分隔的组中用户成员的列表。
+ 在前面我们已经每个用户在口令文件中也包含了一个组。
+ 之后用户被自动地添加到组列表里; 当我们使用
+ <option>groupshow</option> 命令时 &man.pw.8; 用户列表不被显示出来。
+ 但当通过 &man.id.1; 或者类似工具查看时,
+ 就会看到用户列表。 换言之, &man.pw.8; 命令只能读取
+ <filename>/etc/group</filename> 文件; 它从不尝试从
+ <filename>/etc/passwd</filename> 文件读取更多信息。</para>
+
+ <example>
+ <title>使用&man.id.1;来决定组成员</title>
+
+ <screen>&prompt.user; <userinput>id jru</userinput>
+uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)</screen>
+ </example>
+
+ <para>正如您所看到的, <username>jru</username> 是组 <groupname>jru</groupname> 和组
+ <groupname>teamtwo</groupname>的成员.</para>
+
+ <para>有关&man.pw.8;的更多信息, 请参看其它联机手册。
+ 更多的关于 <filename>/etc/group</filename> 文件格式的信息,
+ 请参考 &man.group.5; 联机手册。</para>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->
diff --git a/zh_CN.GB2312/books/handbook/vinum/Makefile b/zh_CN.GB2312/books/handbook/vinum/Makefile
new file mode 100644
index 0000000000..d39fba7293
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/vinum/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= vinum/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/vinum/chapter.sgml b/zh_CN.GB2312/books/handbook/vinum/chapter.sgml
new file mode 100644
index 0000000000..9d02b525d6
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/vinum/chapter.sgml
@@ -0,0 +1,609 @@
+<!--
+ The Vinum Volume Manager
+ By Greg Lehey (grog at lemis dot com)
+
+ Added to the Handbook by Hiten Pandya <hiten@FreeBSD.org>
+ and Tom Rhodes <trhodes@FreeBSD.org>
+
+ For the FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.32
+ $FreeBSD$
+-->
+
+<chapter id="vinum-vinum">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Greg</firstname>
+ <surname>Lehey</surname>
+ <contrib>Originally written by </contrib>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>Vinum 卷管理程序</title>
+
+ <sect1 id="vinum-synopsis">
+ <title>概述</title>
+
+ <para>无论您有什么样的磁盘,总会有一些潜在问题:</para>
+ <itemizedlist>
+ <listitem>
+ <para>它们可能容量太小。</para>
+ </listitem>
+
+ <listitem>
+ <para>它们可能速度太慢。</para>
+ </listitem>
+
+ <listitem>
+ <para>它们可能也太不可靠。</para>
+ </listitem>
+ </itemizedlist>
+
+<para>一些用户采取一些技术来保护他们免与受到这些问题的影响,
+例如使用多个, 有些时候甚至是冗余的, 磁盘。</para>
+
+<para>除了支持许多种不同的硬件 RAID 控制器之外,
+FreeBSD 的基本系统中包括了 Vinum 卷管理器, 它是一个用以实现磁盘驱动器的块设备。</para>
+
+<para>Vinum 提供了比传统磁盘存储更好的灵活性、性能和可靠性,
+它还实现了 RAID-0, RAID-1, 以及 RAID-5
+并可以单独和组合使用。</para>
+
+<para>这一章对传统磁盘存储的潜在问题进行了简要说明,并介绍了 Vinum 卷管理器。</para>
+
+ </sect1>
+
+ <sect1 id="vinum-intro">
+ <title>磁盘容量太小</title>
+
+ <indexterm><primary>Vinum</primary></indexterm>
+ <indexterm><primary>RAID</primary>
+ <secondary>Software</secondary></indexterm>
+
+ <para><emphasis>Vinum</emphasis> 是一个所谓的 <emphasis>卷管
+ 理工具</emphasis>, 是能够解决这三个问题的虚拟磁盘驱动程序。
+ 让我们来仔细地看看这些问题。已经有针对这些问题的很多方法被提出和实现了:
+ </para>
+
+
+ <para>磁盘越大,存储的数据也就越多。您经常会发现您需要
+ 一个比您可使用的磁盘大得多的文件系统。 无可否认,这个问题
+ 已经没有十年前那样严峻了,但它仍然存在。通过创建一个在许多
+ 磁盘上存储数据的抽象设备,一些系统可以解决这个问题。</para>
+ </sect1>
+
+ <sect1 id="vinum-access-bottlenecks">
+ <title>访问瓶颈</title>
+
+ <para>现代系统经常需要用一个高度并发的方式来访问数据。
+ 例如,巨大的FTP 或HTTP 服务器可以支持数以千计的并发会话,
+ 可以有多个连到外部世界的100&nbsp;Mbit/s ,
+ 这远远地超过了绝大多数磁盘的数据传输速率。</para>
+
+ <para>当前的磁盘驱动器最高可以以70&nbsp;MB/s的速度传输数据,
+ 但这个值在一个有许多不受约束的进程访问一个驱动器的环境中变得并不重要,
+ 它们可能只完成了这些值的一小部分。这样一种情况下,从磁盘子
+ 系统的角度来看问题就更加有趣:重要的参数是在子系统上的负
+ 荷,换句话说是传输占用了驱动器多少时间。</para>
+
+ <para>在任何磁盘传输中, 驱动器必须先寻道, 等待磁头访问第一个扇区,
+ 然后执行传输. 这些动作看起来可能很细小:
+ 我们不会感有任何中断。
+ </para>
+
+ <para><anchor id="vinum-latency"> 假设传输10&nbsp;kB数据,
+ : 现在的高性能磁盘平均寻道时间是3.5ms。
+ 最快的驱动器可以旋转在15,000 rpm,, 所以平均寻址时间为2ms.
+ 在70&nbsp;MB/s的速度传输时, 数据的传输时间大约150&nbsp;&mu;s,
+ 几乎无法和寻址时间相比. 在这样一种情况下, 高效的传输也会降低到
+ 1&nbsp;MB/s 显然传输的快慢依赖与所传输数据的大小。
+ </para>
+
+ <para>对于这个瓶颈的一般和明显的解决方法是采用
+ <quote>多个磁盘</quote>:而不是只使用一个大磁盘,
+ 它使用几个比较小的磁盘联合起来形成一个大的磁盘.
+ 每个磁盘都可以独立地进行传输数据,所以通过使用多个磁盘
+ 大大提高了数据吞吐量。
+ </para>
+
+ <para>当然,所要求的吞吐量的提高要比磁盘的数量小得多。
+ 尽管每个驱动器并行传输数据,但没有办法确保请求能够平均
+ 分配到每个驱动器上。不可避免一个驱动器的负载可能比另一个要高得多。
+ </para>
+
+ <indexterm>
+ <primary>磁盘的串连</primary>
+ </indexterm>
+ <indexterm>
+ <primary>Vinum</primary>
+ <secondary>串连</secondary>
+ </indexterm>
+
+ <para>磁盘的负载平衡很大程度依赖于驱动器上数据的共享方式.
+ 在下面的讨论中, 将磁盘存储想象成一个巨大的数据扇区,像一本书的页
+ 那样用编号来设定地址. 最明显的方法是把虚拟磁盘分成许多连续的扇区组,
+ 每个扇区大小就是独立的磁盘大小,用这种方法来存储数据,
+ 就像把一本厚厚的书分成很多小的章节。
+ 这个方法叫做
+ <emphasis>串联</emphasis> 它有一个优点就是磁盘不需要
+ 有任何特定的大小关系。
+ 当访问到的虚拟磁盘根据它的地址空间来分布的时候,它能工作得
+ 很好。当访问集中在一个比较小的区域的时候,性能的提高没有显著的改进。
+ <xref linkend="vinum-concat">
+ 举例说明了用串联组织的方式来分配存储单元的顺序。
+ </para>
+
+ <para>
+ <figure id="vinum-concat">
+ <title>串联组织</title>
+ <graphic fileref="vinum/vinum-concat">
+ </figure>
+ </para>
+
+ <indexterm>
+ <primary>disk striping</primary>
+ </indexterm>
+ <indexterm>
+ <primary>Vinum</primary>
+ <secondary>striping</secondary>
+ </indexterm>
+
+ <para>另外一种影射方法是把地址空间分布在比较小的容量相同的磁盘上,
+ 从而能够在不同的设备上存储它们。例如,前256 个扇区可能存储在第一
+ 个磁盘上,接着的256 个扇区存储在另一个磁盘上等等。 写满最后一个磁
+ 盘后,进程会重复以前的工作,直到所有的磁盘被写满。这个影射叫做
+ <emphasis>分段(striping)</emphasis> 或者 <acronym>RAID-0</acronym>
+
+ <footnote>
+ <indexterm><primary>RAID</primary></indexterm>
+
+ <para><acronym>RAID</acronym> 代表<emphasis>廉价磁盘容错(Redundant
+ Array of Inexpensive Disks)</emphasis> 提供各种容错机制,
+ 但后面这个术语可能会有些让人误解:它不提供冗余功能。</para> </footnote>.
+
+ 分段要求很精确地寻址,通过多个磁盘进行数据传输的时候,它
+ 可能会引起额外的I/O 负载,但它也可能提供更多的连续负载。
+ <xref linkend="vinum-striped"> 显示了用分段形式分配的存储单元的顺序。
+ </para>
+
+ <para>
+ <figure id="vinum-striped">
+ <title>分段组织</title>
+ <graphic fileref="vinum/vinum-striped">
+ </figure>
+ </para>
+ </sect1>
+
+ <sect1 id="vinum-data-integrity">
+ <title>数据的完整性</title>
+
+ <para>T当前磁盘的最后一个问题是它们不太可靠。虽然磁盘驱动器
+ 的可靠性在过去几年有了很大的提高,它们仍然是会损坏的服务器的
+ 最核心组件。当它们发生故障的时候, 结果可能是灾难性的:
+ 替换一个坏的磁盘驱动器,然后恢复数据可能要花费几天时间。
+ </para>
+
+ <indexterm>
+ <primary>disk mirroring</primary>
+ </indexterm>
+ <indexterm>
+ <primary>Vinum</primary>
+ <secondary>mirroring</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>RAID-1</primary>
+ </indexterm>
+
+ <para>解决这个问题的传统方法是建立镜象
+ <emphasis>镜象</emphasis>, 在不同的物理硬件上对数据做两个拷贝。
+ 由于<acronym>RAID</acronym> 的出现levels, 所以这个技术也被叫做
+ <acronym>第一级RAID</acronym> 或者
+ <acronym>RAID-1</acronym>. 任何写到卷的数据也会被写到镜象上,所
+ 以可以从任何一个拷贝读取数据,如果其中有一个失败了,数据就可以
+ 在其他驱动器上访问到。</para>
+
+ <para>镜象有两个问题:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>价格. 它需要两倍的存储容量。</para>
+ </listitem>
+
+ <listitem>
+ <para>性能影响。 写入操作必须在两个驱动器上执行,所以它们
+ 花费两倍的带宽。读取数据并不会影响性能:看起来它们会更快。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><indexterm><primary>RAID-5</primary></indexterm>一个
+ 可选的方案采用 <emphasis>parity</emphasis>,
+ 其实现了 <acronym>RAID</acronym> 2, 3, 4 和
+ 5. 当然, <acronym>RAID-5</acronym> 是最有趣的。
+ As implemented in Vinum, it is a variant on a
+ striped organization which dedicates one block of each stripe
+ to parity of the other blocks. As implemented by Vinum, a
+ <acronym>RAID-5</acronym> plex is similar to a striped plex,
+ except that it implements <acronym>RAID-5</acronym> by
+ including a parity block in each stripe. As required by
+ <acronym>RAID-5</acronym>, the location of this parity block
+ changes from one stripe to the next. The numbers in the data
+ blocks indicate the relative block numbers.</para>
+
+ <para>
+ <figure id="vinum-raid5-org">
+ <title>RAID-5 Organization ** 翻译进行中 **</title>
+ <graphic fileref="vinum/vinum-raid5-org">
+ </figure>
+ </para>
+
+ <!-- WIP -->
+ <para>本节尚未翻译</para>
+ </sect1>
+
+ <sect1 id="vinum-objects">
+ <title>Vinum 目标</title>
+ <para>为了解决这些问题,Vinum 提出了一个四层的目标结构:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>T最显著的目标是虚拟磁盘, 叫做
+ <emphasis>卷(volume)</emphasis>. 卷本质上与一个UNIX 磁盘
+ 驱动器有同样的属性,虽然它们是有些不太一样。它们没有大小的限制。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>卷下面是 <emphasis>plexes</emphasis>,
+ 每一个表示卷的所有地址空间。在层次结构中的这个水平能够提供
+ 冗余功能。可以把plex 想象成用一个镜象排列的方式组织起来的
+ 独立磁盘,每个都包含同样的数据。</para>
+ </listitem>
+
+ <listitem>
+ <para>由于Vinum 存在于UNIX 磁盘存储框架中,所以它也可能
+ 使用UNIX 分区作为多个磁盘plex 的组成部分,
+ 但事实上这并不可靠:UNIX 磁盘只能有有限数量的分区。
+ 取而代之,Vinum 把一个简单的UNIX 分区 (the <emphasis>drive</emphasis>)
+ 分解成叫做<emphasis>subdisks</emphasis>的相邻区域, 它可以使用这个
+ 来为plex 建立块。</para>
+ </listitem>
+
+ <listitem>
+ <para>Subdisks 位于 Vinum <emphasis>驱动器上</emphasis>,
+ 当前的UNIX 分区。Vinum 驱动器可以包含很多的subdisks。
+ 除了驱动器开始的一小块区域用来存储配置和描述信息以外,整个
+ 驱动器都可以用于存储数据。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>下面的章节描述了这些目标提供了Vinum 所要求的功能的方法。</para>
+
+ <sect2>
+ <title>卷的大小要求</title>
+
+ <para>在Vinum的配置中,Plex可以把多个subdisk 分布在所有的驱动上。
+ 结果, 每个独立的驱动器的大小都不会限制plex 的大小,从而不会限制卷的大小
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>多余的数据存储</title>
+ <para>Vinum 通过给一个卷连上多个plex 来完成镜象的功能。
+ 每个plex 是一个在一个卷中的数据的描述。一个卷可以包含一个
+ 到八个plex。</para>
+
+ <para>Although虽然一个plex 描述了一个卷的所有数据,,
+ 但可能描述的部分被物理地丢失了。可能是设计的问题
+ (没有为plex 部分定义一个subdisk)也可能是意外的故障
+ (由于驱动器的故障导致)。只要至少有一个plex 能够为
+ 卷的完全地址范围提供数据,卷就能够正常工作。
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>性能问题</title>
+
+ <para>Vinum 在plex 水平既执行串联也执行分段:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>一个<emphasis>串连的plex</emphasis>轮流使用
+ 每个subdisk 的地址空间。</para>
+ </listitem>
+
+ <listitem>
+ <para>一个 <emphasis>分段的plex</emphasis> 在每个subdisk 上
+ 划分数据. Subdisk 必须是大小一样的,为了从一个连接的plex 中
+ 区分开它,必须至少有两个subdisk。 </para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2>
+ <title>哪种plex 组织更有效?</title>
+ <para>FreeBSD &rel.current提供的Vinum 版本能实现两种plex:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>串联的plex 更加灵活:它们可以包含任何数量的subdisk,
+ subdisk 也可能有不同的长度。Plex 可以通过添加额外的subdisk
+ 来得到扩展。 它们需要更少的
+ <acronym>CPU</acronym> 时钟相对分段plexes, 尽管
+ <acronym>CPU</acronym> 上的负载差异是不可测量的。
+ 另一方面,它们的负载可能不平衡,一个磁盘可能负载很重,
+ 而其他的可能很空闲。</para>
+ </listitem>
+
+ <listitem>
+ <para>分段(<acronym>RAID-0</acronym>) plexes 的最大优点是
+ 它们减少了负载不平衡的情况: 通过选择一个最合适大小的分段
+ (大约是256&nbsp;kB), 您甚至可以在各个组成的驱动器上降低负载
+ . 这种方法的缺点是在subdisk 上受到非常复杂的编码限制
+ : 它们必须是同样大小, 通过添加新的subdisk 来扩展一个plex
+ 是非常复杂的,以至Vinum 当前没有实现它. Vinum 利用一个额外
+ 的,代价不高的限制:一个分段的plex 必须有至少两个subdisk,
+ 因为否则的话,它是无法从一个连接的plex 进行区分的。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><xref linkend="vinum-comparison"> 总结一下每个plex 组织
+ 的优点和缺点.</para>
+
+ <table id="vinum-comparison" frame="none">
+ <title>Vinum Plex组织图</title>
+ <tgroup cols="5">
+ <thead>
+ <row>
+ <entry>Plex 类型</entry>
+ <entry>最少subdisks</entry>
+ <entry>可否添加subdisks</entry>
+ <entry>必须相同大小</entry>
+ <entry>应用</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>串联 </entry>
+ <entry>1</entry>
+ <entry>可以</entry>
+ <entry>不可以</entry>
+ <entry>带有很大弹性和适中性能的大数据量存储。
+ </entry>
+ </row>
+
+ <row>
+ <entry>分段</entry>
+ <entry>2</entry>
+ <entry>不可以</entry>
+ <entry>可以</entry>
+ <entry>大量并发访问时,具有较高性能。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+ </sect1>
+
+ <sect1 id="vinum-examples">
+ <title>一些例子</title>
+
+ <para>Vinum 维护着一个描述以一个独立系统为目标
+ <emphasis>配置数据库</emphasis>的。最初,用户通过&man.vinum.8;
+ 工具的帮助从一个或多个配置文件创建配置数据库。Vinum 在它的控制
+ 下在每个磁盘(Vinum 叫 <emphasis>device</emphasis>) 上存储一个
+ 它的配置数据库的拷贝。这个数据库在每个状态变化的时候被升级,
+ 以便能精确地回复每个Vinum 目标的状态。
+ </para>
+
+ <sect2>
+ <title>配置文件</title>
+ <para>配置文件描述了独立的 Vinum.一个简单卷的定义可能是这样的:</para>
+
+ <programlisting>
+ drive a device /dev/da3h
+ volume myvol
+ plex org concat
+ sd length 512m drive a</programlisting>
+
+ <para>这个文件描述了四个Vinum 目标:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>drive</emphasis> 行描述了一个磁盘分区(驱动器)
+ 和与下面的硬件相关的它的位置。它给出了一个符号名
+ <emphasis>a</emphasis>. 这个与设备名称分开的符号名允许
+ 磁盘从一个位置移动到另一个位置而不会搞混。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para> <emphasis>volume</emphasis> 行描述了一个卷。
+ 唯一的必须属性是名称,在这个例子中是
+ <emphasis>myvol</emphasis>.</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>plex</emphasis> 行定义了一个plex。
+ 唯一需要的参数是组织,在这个例子中是
+ <emphasis>concat</emphasis>. 没有名称是必然的:
+ 系统自动通过添加suffix
+ <emphasis>.p</emphasis><emphasis>x</emphasis>px
+ 来从卷名称产生一个名字,这里的<emphasis>x</emphasis>
+ 是在卷中的plex 的编号。而这个plex 将被
+ 叫做<emphasis>myvol.p0</emphasis>。</para>
+
+
+ </listitem>
+
+ <listitem>
+ <para> <emphasis>sd</emphasis> 行描述了一个subdisk。
+ 最小的说明是存储subdisk 的驱动器名称,和subdisk 的长度。
+ 对于plex,没有名称也是必然的:系统自动通过添加
+ suffix <emphasis>.s</emphasis><emphasis>x</emphasis>
+ 来分配源自plex 的名称,这里 <emphasis>x</emphasis>是plex 中subdisk 的编号。
+ Vinum 给这个subdisk 命名为<emphasis>myvol.p0.s0</emphasis>。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>处理完这个文件后, &man.vinum.8会产生下面的输出:</para>
+
+ <programlisting width="97">
+ &prompt.root; vinum -&gt; <userinput>create config1</userinput>
+ Configuration summary
+ Drives: 1 (4 configured)
+ Volumes: 1 (4 configured)
+ Plexes: 1 (8 configured)
+ Subdisks: 1 (16 configured)
+
+ D a State: up Device /dev/da3h Avail: 2061/2573 MB (80%)
+
+ V myvol State: up Plexes: 1 Size: 512 MB
+
+ P myvol.p0 C State: up Subdisks: 1 Size: 512 MB
+
+ S myvol.p0.s0 State: up PO: 0 B Size: 512 MB</programlisting>
+
+ <para>这个输出显示了&man.vinum.8简要的列表格式。
+ 图<xref linkend="vinum-simple-vol">中它用图形来表示这一点。</para>
+
+ <para>
+ <figure id="vinum-simple-vol">
+ <title>一个简单的Vinum 卷</title>
+ <graphic fileref="vinum/vinum-simple-vol">
+ </figure>
+ </para>
+
+ <para>下面这个图显示了一个由按顺序排列的subdisk 组成的plex。
+ 在这个小小的例子中,卷包含一个plex,plex 包含一个subdisk。
+ </para>
+
+ <para>这个特殊的卷与一个传统的磁盘分区没有什么特别的优势。
+ 下面的章节会描述到几个非常有趣的配置方法。
+ This particular volume has no specific advantage over a
+ conventional disk partition. It contains a single plex, so it
+ is not redundant. The plex contains a single subdisk, so
+ there is no difference in storage allocation from a
+ conventional disk partition. The following sections
+ illustrate various more interesting configuration
+ methods.</para>
+ </sect2>
+
+ <sect2>
+ <title>增强的可靠性:镜象 ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>Optimizing Performance ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>Resilience and Performance ** 翻译进行中 **</title>
+
+ <para><anchor id="vinum-resilience"></para>
+
+ <para>
+ <figure id="vinum-raid10-vol">
+ <title>A Mirrored, Striped Vinum Volume</title>
+ <graphic fileref="vinum/vinum-raid10-vol">
+ </figure>
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="vinum-object-naming">
+ <title>Object Naming ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect2>
+ <title>Creating File Systems ** 翻译进行中 **</title>
+
+ <para></para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="vinum-config">
+ <title>Configuring Vinum ** 翻译进行中 **</title>
+
+ <para></para>
+
+
+ <sect2>
+ <title>Startup ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect3 id="vinum-rc-startup">
+ <title>Automatic Startup ** 翻译进行中 **</title>
+
+ <para></para>
+
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="vinum-root">
+ <title>Using Vinum for the Root Filesystem ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect2>
+ <title>Starting up Vinum Early Enough for the Root
+ Filesystem ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>Making a Vinum-based Root Volume Accessible to the
+ Bootstrap ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>Example of a Vinum-based Root Setup ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2>
+ <title>Troubleshooting ** 翻译进行中 **</title>
+
+ <sect3>
+ <title>System Bootstrap Loads, but System Does Not Boot</title>
+ <para></para>
+ </sect3>
+
+ <sect3>
+ <title>Only Primary Bootstrap Loads ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="vinum-root-panic">
+ <title>Nothing Boots, the Bootstrap
+ Panics ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="vinum-root-4x">
+ <title>Differences for FreeBSD 4.X ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+ </sect1>
+</chapter>
+
diff --git a/zh_CN.GB2312/books/handbook/x11/Makefile b/zh_CN.GB2312/books/handbook/x11/Makefile
new file mode 100644
index 0000000000..cf0eafa4e7
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/x11/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= x11/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/x11/chapter.sgml b/zh_CN.GB2312/books/handbook/x11/chapter.sgml
new file mode 100644
index 0000000000..5d0b4c2a53
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/x11/chapter.sgml
@@ -0,0 +1,1619 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.150
+
+ $FreeBSD$
+-->
+
+<chapter id="x11">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Ken</firstname>
+ <surname>Tom</surname>
+ <contrib>Updated for X.Org's X11 server by </contrib>
+ </author>
+ <author>
+ <firstname>Marc</firstname>
+ <surname>Fonvieille</surname>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>X Window 系统</title>
+
+ <sect1 id="x11-synopsis">
+ <title>概述</title>
+
+ <para>FreeBSD 使用 X11 来为用户提供功能强大的图形用户界面。
+ X11 是一种开放源代码的 X Window 系统实现,
+ 它包括 <application>&xorg;</application> 和
+ <application>&xfree86;</application>。 &os; 在包括 &os;&nbsp;4.10-RELEASE
+ 和 &os;&nbsp;5.2.1-RELEASE 以前的版本中默认安装
+ <application>&xfree86;</application>, 一种由 The &xfree86; Project, Inc.
+ 发行的 X11 服务。 从 &os;&nbsp;5.3-RELEASE 开始,
+ 默认并且为官方支持的 X11 改为了
+ <application>&xorg;</application>, 它是由 X.Org Foundation
+ 开发的 X11 服务。</para>
+
+ <para>这章将介绍 X11 的安装和配置, 并着重强调
+ <application>&xorg;</application>。</para>
+
+ <para>欲了解 X11 所支持的显示卡等硬件,
+ 请访问 <ulink
+ url="http://www.x.org/">&xorg;</ulink> 或 <ulink
+ url="http://www.XFree86.org/">&xfree86;</ulink> 的网站。</para>
+
+ <para>在阅读完这一章后,您将会了解:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>X 视窗系统的不同组件,它们是如何协同工作的。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何安装和配置 X11。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何安装和使用不同的窗口管理器。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何在 X11 中使用 &truetype; 字体。</para>
+ </listitem>
+
+ <listitem>
+ <para>如何为您的系统设置图形登陆
+ (<application>XDM</application>)。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在阅读这一章之前,您应该:</para>
+
+ <itemizedlist>
+ <listitem><para>知道如何安装额外的第三方应用程序(<xref linkend="ports">)。
+ </para></listitem>
+ </itemizedlist>
+
+ <note>
+ <para>这一章介绍了 <application>&xorg;</application> 和
+ <application>&xfree86;</application> 两种 X11 服务的安装和配置。
+ 绝大多数时候, 配置文件、 命令句法是完全一样的。 当存在差异时,
+ <application>&xorg;</application> 和
+ <application>&xfree86;</application> 的写法都会有所体现。</para>
+ </note>
+ </sect1>
+
+ <sect1 id="x-understanding">
+ <title>理解 X</title>
+
+ <para>对于那些熟悉其他图形环境,比如
+ &microsoft.windows; 或者
+ &macos; 的用户来说,第一次使用 X 可能会感觉很惊讶。</para>
+
+ <para>尽管您不需要了解各种 X 组件的所有细节和它们是如何互相影响的;
+ 然而, 了解一些基本的知识可以让您很好地利用 X 的强大功能。</para>
+
+ <sect2>
+ <title>为什么要使用 X?</title>
+
+ <para>X 不是第一个为 &unix;而开发的视窗系统,但它是最流行的。
+ X 的原始开发团队在开发 X 之前就已经在另外一个视窗系统上工作了。
+ 那个系统的名字叫做
+ <quote>W</quote> (就是 <quote>Window</quote>)。X 只是罗马字母中 W 后面
+ 的一个。</para>
+
+ <para>X 可以被叫做 <quote>X</quote>, <quote>X Window 系统</quote>,
+ <quote>X11</quote>, 等等。把 X11 称做
+ <quote>X Windows</quote> 可能会冒犯某些人;
+ 查看 &man.X.7; 可以了解更多的信息。</para>
+ </sect2>
+
+ <sect2>
+ <title>X 客户机/服务器模型</title>
+
+ <para>X 一开始就是针对网络而设计的,所以
+ 采用了 <quote>client-server</quote> 模型。在 X 模型中,
+ <quote>X server</quote> 运行在有键盘,显示器,鼠标的计算机上。
+ 服务器用来管理显示信息,处理来自键盘和鼠标的输入等。
+ 每一个 X 应用程序 (比如 <application>XTerm</application>, 或者
+ <application>&netscape;</application>) 就是一个 <quote>client</quote>。
+ 一个 client 给服务器发送信息,如 <quote>Please draw a
+ window at these coordinates</quote>, 然后服务器就返回处理信息,如
+ <quote>The user just clicked on the OK
+ button</quote>。</para>
+
+ <para>如果您在只有一台计算机的家里或小型办公环境中使用 FreeBSD,您就
+ 需要在同一台计算机上运行 X server和 X client。然而,如果您有很多运行
+ FreeBSD 的机器,您可以在您的桌面计算机上运行 X server,而在比较高档
+ 的服务器上运行 X 应用程序。在这样的环境中,X server 和 X client 之间的
+ 通信就可以通过网络来进行。</para>
+
+ <para>这迷惑了一些人,因为 X 的术语和他们料想的有些不同。
+ 他们以为 <quote>X server</quote> 是运行在功能强大的大型机上的,而
+ <quote>X client</quote> 是运行在他们桌面上的计算机上的。</para>
+
+ <para>记住,X server 是有键盘和显示器的那台计算机,而
+ X client 是那些显示窗口的程序。</para>
+
+ <para>并不需要 client 和 server 都运行在同一种操作系统上,或甚至运行在
+ 同一种类型的计算机上。在 &microsoft.windows; 或者 Apple 公司的 &macos; 上运行
+ 一个 X server 也是可以的,在它们上面也有很多免费的和商业化的应用程序。</para>
+
+ <para>从 &os;&nbsp;5.3-RELEASE 开始, 随 &os; 一同安装的 X 服务改成了
+ <application>&xorg;</application>,
+ 它在类似 FreeBSD 的授权下可以免费使用。
+ 此外, 也有一些针对 FreeBSD 的商业 X 服务器。</para>
+ </sect2>
+
+ <sect2>
+ <title>窗口管理器</title>
+
+ <para>X 的设计哲学很像 &unix; 的设计哲学,
+ <quote>tools, not policy</quote>。这就意味着 X 不会试图去规定任务应该如何
+ 去完成,而是,只给用户提供一些工具,至于决定如何使用这些工具是用户自己的
+ 事情。</para>
+
+ <para>这套哲学扩展了 X,它不会规定窗口在屏幕上应该是什么样子,要如何移动鼠标,
+ 什么键应该用来切换窗体 (比如,
+ <keycombo action="simul">
+ <keycap>Alt</keycap>
+ <keycap>Tab</keycap>
+ </keycombo>按键,在 &microsoft.windows; 环境中的作用), 每个窗口的工具条应该
+ 看起来像什么,他们是否应该有关闭按钮等等。</para>
+
+ <para>实际上,X 行使了一种叫做
+ <quote>窗口管理器</quote>的应用程序的职责。有很多这样的程序可用:
+ <application>AfterStep</application>,
+ <application>Blackbox</application>, <application>ctwm</application>,
+ <application>Enlightenment</application>,
+ <application>fvwm</application>, <application>Sawfish</application>,
+ <application>twm</application>,
+ <application>Window Maker</application>,等等。每一个窗口管理器
+ 都提供了不同的界面和观感;其中一些还支持
+ <quote>虚拟桌面</quote>;有一些允许您可以定制一些键来管理您的桌面;
+ 一些有<quote>开始</quote>
+ 按钮,或者其他类似的设计;一些有 <quote>themeable</quote>,通过安装一个
+ 新的主题允许外观的完全改变。这些窗口管理器,还有很多其他的,都可以在
+ Ports Collection 的
+ <filename>x11-wm</filename> 分类目录里找到。</para>
+
+ <para>另外,<application>KDE</application> 和
+ <application>GNOME</application> 桌面环境都有他们自己的窗口管理器
+ 与桌面集成。</para>
+
+ <para>每个窗口管理器也有不同的配置机制;有些需要手工来写配置文件,
+ 而另外一些则可以使用 GUI 工具来完成大部分的配置任务,至少
+ (<application>Sawfish</application>) 有一个用 Lisp 语言来写的配置
+ 文件。</para>
+
+ <note>
+ <title>焦点策略</title>
+
+ <para>窗口管理器的另一个特性是鼠标的 <quote>focus policy</quote>。
+ 每个窗口系统都需要有一个选择窗口的方法来接受键盘的输入信息,以及当前
+ 哪个窗口处于可用状态。</para>
+
+ <para>您通常比较熟悉的是一个叫做 <quote>click-to-focus</quote> 的焦点策略。
+ 这是 &microsoft.windows; 使用的典型焦点策略,也就是您在一个窗口上点击
+ 一下鼠标,这个窗口就处于当前可用的状态。</para>
+
+ <para>X 不支持一些特殊的焦点策略。而是,窗口管理器控制着在什么时候哪个窗口
+ 拥有焦点。不同的窗口管理器支持不同的焦点方案。它们都支持点击即获得焦点,
+ 而且它们中的大多数都支持好几种方案。</para>
+
+ <para>最流行的焦点策略:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>focus-follows-mouse</term>
+
+ <listitem>
+ <para>鼠标指示器下面的窗口就是获得焦点的窗口。这可以不是位于其他所有
+ 窗口顶部的窗口。您可以通过将鼠标移到另一个窗口就可以来改变焦点,您
+ 不需要在它上面点击。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>sloppy-focus</term>
+
+ <listitem>
+ <para>这种方式是对 focus-follows-mouse 策略的一个小小扩展。对于
+ focus-follows-mouse,如果您在根窗口(或桌面背景)上移动鼠标,键盘的
+ 输入也会丢失。对于 sloppy-focus,只有当指针在键入一个新窗口时,窗口
+ 焦点才会发生变化,当退出当前窗口时是不会变化的。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>click-to-focus</term>
+
+ <listitem>
+ <para>当前窗口由鼠标点击来选择。窗口被<quote>突出显示</quote> ,
+ 出现在所有其他窗口的前面。即使指针被移向了另一个窗口,所有的键盘输入
+ 仍会被这个窗口接收。
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>许多窗口管理器支持其他的策略,与这些相比又有些变化。您可以看具体
+ 窗口管理器的文档。
+ </para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>窗口部件</title>
+
+ <para>提供工具而非策略的 X 方法使得在每个应用程序屏幕上看到的窗口部件得到了
+ 大大的扩展。</para>
+
+ <para><quote>Widget</quote> 只是针对用户接口中所有列举项目的一个术语,它
+ 可以用某种方法来点击或操作;如按钮,复选框,单选按钮,图标,列表框等等。
+ &microsoft.windows; 把这些叫做<quote>控件</quote>。</para>
+
+ <para>&microsoft.windows; 和苹果公司的 &macos; 都有一个严格的窗口部件策略。
+ 应用程序开发者被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。
+ 对于 X,它并不要求一个特殊的图形风格或一套相结合的窗口部件集。</para>
+
+ <para>这样的结果是您不能期望 X 应用程序只拥有一个普通的所见即所得的界面。
+ 有很多的流行的窗口部件集设置,包括来自于 MIT 的 Athena,
+ <application>&motif;</application> (模仿
+ &microsoft.windows; 的窗口风格),<application>OpenLook</application>,
+ 和其他一些窗口部件集。</para>
+
+ <para>今天,绝大多数比较新的 X 应用程序将使用一个现代风格的窗口设计,
+ 像 Qt, 用来设计 <application>KDE</application>, 或
+ GTK+,用来设计
+ <application>GNOME</application>。
+ 在这样一种窗口系统下,&unix; 桌面的一些所见即所得特性作了一些收敛,以使
+ 初学者感到更容易一些。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="x-install">
+ <title>安装 X11</title>
+
+ <para><application>&xorg;</application> 或
+ <application>&xfree86;</application> 都可以安装到 &os; 上。
+ 从 &os;&nbsp;5.3-RELEASE 开始,
+ <application>&xorg;</application> 成为了 &os;
+ 上的默认 X11 实现。
+ <application>&xorg;</application> 是由 X.Org Foundation 发行的
+ X11R6.7 实现。 X11R6.7 基于
+ <application>&xfree86&nbsp;4.4RC2</application> 和 X11R6.6
+ 的代码。 The X.Org Foundation 于 2004 年 4月正式发行了 X11R6.7。</para>
+
+ <para>如果需要从 ports collection 编译和安装 <application>&xorg;</application>:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/x11/xorg</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <note>
+ <para>想要完整地编译 <application>&xorg;</application> 则需要至少 2GB
+ 的剩余磁盘空间。</para>
+ </note>
+
+ <para>如果想从 ports collection 中编译和安装 <application>&xfree86;</application>:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/x11/XFree86-4</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>另外 X11 也可以直接从 package 来安装。
+ 我们提供了可以与 &man.pkg.add.1; 工具配合使用的 X11 安装包。
+ 如果从远程下载并安装时,
+ &man.pkg.add.1; 请不要指定版本号。
+ &man.pkg.add.1; 会自动地下载最新版本的安装包。</para>
+
+ <para>想要从 package 安装
+ <application>&xorg;</application>, 简单地输入下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r xorg</userinput></screen>
+
+ <para><application>&xfree86;&nbsp;4.X</application> 也可以用类似的办法安装:</para>
+
+ <screen>&prompt.root; <userinput>pkg-add -r XFree86</userinput></screen>
+
+ <note><para>上面的例子介绍了如何安装完整的
+ X11 软件包, 包括服务器端,客户端,字体等等。
+ 此外, 也有一些单独的 X11 的 ports 和 packages.</para></note>
+
+ <para>这一章余下的部分将会讲解如何配置
+ X11, 以及如何设置一个高效的桌面环境。</para>
+
+ <sect2 id="x-to-xorg">
+ <title>从 <application>&xfree86;</application> 转移到
+ <application>&xorg;</application></title>
+
+ <para>任何 port 都一样,您应该检查
+ <filename>/usr/ports/UPDATING</filename> 文件看看有哪些改变。
+ 这个文件中包含了把您的系统从
+ <application>&xfree86;</application> 转换到
+ <application>&xorg;</application> 的说明。</para>
+
+ <para>在尝试任何转换之前请使用 <application>CVSup</application>
+ 来更新您的 ports tree。在转换您的 X11 安装前您还需要安装 <filename
+ role="package">sysutils/portupgrade</filename>。</para>
+
+ <para>在 <filename>/etc/make.conf</filename> 中您需要添加变量
+ <literal>X_WINDOW_SYSTEM=xorg</literal>。
+ 这样做确保您的系统知道正在使用哪种 X11。
+ 旧的 <literal>XFREE86_VERSION</literal> 变量已经过时并被
+ <literal>X_WINDOW_SYSTEM</literal> 变量所取代。</para>
+
+ <para>然后,使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>pkg_delete -f /var/db/pkg/imake-4* /var/db/pkg/XFree86-*</userinput>
+&prompt.root; <userinput>cd /usr/ports/x11/xorg</userinput>
+&prompt.root; <userinput>make install clean</userinput>
+&prompt.root; <userinput>pkgdb -F</userinput></screen>
+
+ <para>&man.pkgdb.1; 命令是
+ <application>portupgrade</application> 软件的一部分,
+ 会更新各种软件包的依赖关系。</para>
+
+ <note>
+ <para>要完全编译 <application>&xorg;</application>,
+ 请确保有至少 2GB 的剩余磁盘空间。</para>
+ </note>
+ </sect2>
+ </sect1>
+
+ <sect1 id="x-config">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Christopher</firstname>
+ <surname>Shumway</surname>
+ <contrib>Contributed by </contrib>
+ <!-- July 2001 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>配置 X11</title>
+
+
+ <indexterm><primary>&xfree86;&nbsp;4.X</primary></indexterm>
+ <indexterm><primary>&xfree86;</primary></indexterm>
+ <indexterm><primary>&xorg;</primary></indexterm>
+ <indexterm><primary>X11</primary></indexterm>
+
+ <sect2>
+ <title>开始之前</title>
+
+ <para>在配置 X11 之前,
+ 您需要了解所安装的系统的下列信息:</para>
+
+ <itemizedlist>
+ <listitem><para>显示器规格</para></listitem>
+ <listitem><para>显示卡的芯片类型</para></listitem>
+ <listitem><para>显示卡的显存容量</para></listitem>
+ </itemizedlist>
+
+ <indexterm><primary>水平刷新率</primary></indexterm>
+ <indexterm><primary>垂直刷新率</primary></indexterm>
+
+ <para>显示器的规格被 X11 用来决定显示的分辨率和刷新率。
+ 这些规格通常可以从显示器所带的文档中,
+ 以及制造商的网站找到。
+ 需要知道两个数字范围: 垂直刷新率和水平刷新率。</para>
+
+ <para>显示卡的芯片类型将决定
+ X11 使用什么模块来驱动图形硬件。
+ 绝大多数的硬件都能被自动检测,
+ 但是了解它在自动检测出错的时候还是很有用处的。</para>
+
+ <para>显示卡的显存大小决定了系统支持的分辨率和颜色深度。
+ 了解这些限制非常重要。</para>
+
+ </sect2>
+
+ <sect2>
+ <title>配置 X11</title>
+
+ <para>配置 X11 需要几步。 第一步是以超级用户的身份建立初始的配置文件:</para>
+
+ <screen>&prompt.root; <userinput>Xorg -configure</userinput></screen>
+
+ <para>在使用 <application>&xfree86;</application>
+ 的情况下键入:</para>
+
+ <screen>&prompt.root; <userinput>XFree86 -configure</userinput></screen>
+
+ <para>这会在 <filename>/root</filename> 中生成一个叫做
+ <filename>xorg.conf.new</filename> 的配置文件
+ (无论您使用 &man.su.1; 或直接登录,
+ 都会改变默认的 <envar>$HOME</envar> 目录变量)。
+ 对于 <application>&xfree86;</application> 来说,
+ 配置文件的名字是 <filename>XF86Config.new</filename>。
+ X11 程序将尝试探测系统中的图形硬件并写包含检测到的硬件的配置文件,
+ 以便加载正确的驱动程序。</para>
+
+ <para>下一步是测试现存的配置文件,
+ 以确认 <application>&xorg;</application>
+ 能够同系统上的图形设备正常工作。
+ 要完成这个任务,只需:</para>
+
+ <screen>&prompt.root; <userinput>Xorg -config xorg.conf.new</userinput></screen>
+
+ <para><application>&xfree86;</application> 用户应:</para>
+
+ <screen>&prompt.root; <userinput>XFree86 -xf86config XF86Config.new</userinput></screen>
+
+ <para>如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功
+ 的。要退出测试,只要同时键入
+ <keycombo action="simul">
+ <keycap>Ctrl</keycap>
+ <keycap>Alt</keycap>
+ <keycap>Backspace</keycap>
+ </keycombo>。</para>
+
+ <note><para>如果鼠标工作不正常, 请首先配置它。
+ 请查看 <xref linkend="mouse">
+ &os; 安装一章</para></note>
+
+ <indexterm><primary>微调 X11</primary></indexterm>
+
+ <para>接下来是调整 <filename>xorg.conf.new</filename> (或 <filename>XF86Config.new</filename>, 如果运行 <application>&xfree86</application> 的话)
+ 配置文件并作测试。 用文本编辑器如
+ &man.emacs.1; 或 &man.ee.1; 打开这个文件。 要做的第一件事是为当前系统的显示器设置刷新率。
+ 这些值包括垂直和水平的同步频率。 把它们加到
+ <filename>xorg.conf.new</filename> 的
+ <literal>"Monitor"</literal> 小节中:</para>
+
+ <programlisting>Section "Monitor"
+ Identifier "Monitor0"
+ VendorName "Monitor Vendor"
+ ModelName "Monitor Model"
+ HorizSync 30-107
+ VertRefresh 48-120
+EndSection</programlisting>
+
+ <para><literal>HorizSync</literal> 和
+ <literal>VertRefresh</literal> 在配置文件中可能没有。
+ 如果是这样的话, 就需要添加它们, 并在
+ <literal>HorizSync</literal> 以及 <literal>VertRefresh</literal>
+ 后面设置合适的数值。 在上面的例子中, 给出了相应的显示其的参数。</para>
+
+ <para>X 能够利用显示器所支持的 DPMS (能源之星) 功能。
+ &man.xset.1; 程序可以控制超时时间, 并强制待机、挂起或关机。
+ 如果希望启用显示器的 DPMS 功能, 则需要把下面的设置添加到 monitor 节中:</para>
+
+ <programlisting>
+ Option "DPMS"</programlisting>
+
+ <indexterm>
+ <primary><filename>xorg.conf</filename></primary>
+ </indexterm>
+ <indexterm>
+ <primary><filename>XF86Config</filename></primary>
+ </indexterm>
+
+ <para>关闭 <filename>xorg.conf.new</filename> (或 <filename>XF86Config.new</filename>)
+ 之前还应该选择默认的分辨率和色深。
+ 这是在 <literal>"Screen"</literal> 小节中定义的:</para>
+
+ <programlisting>Section "Screen"
+ Identifier "Screen0"
+ Device "Card0"
+ Monitor "Monitor0"
+ DefaultDepth 24
+ SubSection "Display"
+ Viewport 0 0
+ Depth 24
+ Modes "1024x768"
+ EndSubSection
+EndSection</programlisting>
+
+ <para><literal>DefaultDepth</literal> 关键字描述了要运行的默认色深。
+ 这可以通过 &man.Xorg.1; (或 &man.XFree86.1;) 的
+ <option>-depth</option> 命令行开关来替代配置文件中的设置。
+ <literal>Modes</literal> 关键字描述了给定颜色深度下屏幕的分辨率。
+ 需要说明的是, 目标系统的图形硬件只支持由 VESA 定义的标准模式。
+ 前面的例子中, 默认色深是使用 24位色。
+ 在采用这个色深时, 允许的分辨率是 1024x768。</para>
+
+ <para>最后就是将配置文件存盘, 并使用前面介绍的测试模式测试一下。</para>
+
+ <note>
+ <para>在发现并解决问题的过程中可以帮助您的工具之一就是
+ X11 的日志文件,包含了与 X11 服务器相关的每个设备的信息。
+ <application>&xorg;</application> 日志的文件名是
+ <filename>/var/log/Xorg.0.log</filename> 这样的格式
+ (<application>&xfree86;</application> 日志文件名是
+ <filename>XFree86.0.log</filename> 这样的格式)。日志的准确的名字
+ 可以从 <filename>Xorg.0.log</filename> 到
+ <filename>Xorg.8.log</filename> 等等。</para>
+ </note>
+
+ <para>如果一切准备停当, 就可以把配置文件放到公共的目录中了。
+ 您可以在 &man.Xorg.1; (或 &man.XFree86.1;) 里面找到具体位置。
+ 这个位置通常是 <filename>/etc/X11/xorg.conf</filename> 或
+ <filename>/usr/X11R6/etc/X11/xorg.conf</filename> (对于
+ <application>&xfree86;</application> 它应该是
+ <filename>/etc/X11/XF86Config</filename> 或
+ <filename>/usr/X11R6/etc/X11/XF86Config</filename>)。</para>
+
+ <screen>&prompt.root; <userinput>cp xorg.conf.new /etc/X11/xorg.conf</userinput></screen>
+
+ <para>For <application>&xfree86;</application>:</para>
+
+ <screen>&prompt.root; <userinput>cp XF86Config.new /etc/X11/XF86Config</userinput></screen>
+
+ <para>现在已经完成了 X11 的配置全过程。 为了使用 &man.startx.1; 来启动
+ <application>&xfree86;&nbsp;4.X</application> 需要安装
+ <filename role="package">x11/wrapper</filename> port。
+ <application>&xorg;</application> 已经包含了 wrapper 代码,
+ 因此并不需要安装 wrapper port。
+ X11 服务器也可以用
+ &man.xdm.1; 来启动。</para>
+
+ <note><para>有一个图形配置工具,
+ &man.xorgcfg.1; (对于 <application>&xfree86;</application> 来说, 是 &man.xf86cfg.1;),
+ 随 X11 软件包一同安装。 它可以通过选择合适的驱动和设置交互式地定义配置。
+ 这个程序可以从控制台通过命令 <command>xorgcfg -textmode</command> 来直接启动。
+ 与了解详情, 请参考 &man.xorgcfg.1; 和 &man.xf86cfg.1; 的联机手册。</para>
+
+ <para>另外还有一个叫做 &man.xorgconfig.1; 的文本界面配置工具
+ (对于 <application>&xfree86;</application> 是 &man.xf86config.1;),
+ 这是一个控制台工具因此对用户显得不太友好,
+ 不过当其他工具无法工作时, 它仍然可能可以使用。</para></note>
+
+ </sect2>
+
+ <sect2>
+ <title>高级配置主题</title>
+
+ <sect3>
+ <title>配置 &intel; i810 显示芯片组</title>
+
+ <indexterm><primary>Intel i810 显示芯片</primary></indexterm>
+
+ <para>配置Intel i810芯片组的显示卡需要有针对 X11
+ 的能够用来驱动显示卡的 <devicename>agpgart</devicename> AGP程序接口。
+ 自从发行版本 4.8-RELEASE 和 5.0-RELEASE 发行以来 &man.agp.4; 驱动程序就包含在
+ <filename>GENERIC</filename> 内核配置里面了。
+ 在以前的发行版里,您必须要在您的内核配置文件里添加下面的一行:</para>
+
+ <programlisting>device agp</programlisting>
+
+ <para>然后重新编译一个新的内核。
+ 或者,您可以在启动的时候使用 &man.loader.8; 自动加载
+ <filename>agp.ko</filename> 内核模块。
+ 简单的添加下面这行到
+ <filename>/boot/loader.conf</filename> 文件里:</para>
+
+ <programlisting>agp_load="YES"</programlisting>
+
+ <para>接下来,如果您正在运行 FreeBSD&nbsp;4.X 或者更早的版本,
+ 需要创建一个设备节点作为程序接口。
+ 要创建 AGP 设备节点,在 <filename>/dev</filename> 下运行
+ &man.MAKEDEV.8;:</para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput> &prompt.root; <userinput>sh MAKEDEV agpgart</userinput></screen>
+
+ <note>
+ <para>FreeBSD&nbsp;5.X 和以后的版本会使用 &man.devfs.5; 来半透明的分配
+ 设备节点,因此
+ &man.MAKEDEV.8; 这一步是不必要的。</para>
+ </note>
+
+ <para>这也适用于其他的图形卡硬件配置。
+ 注意如果系统没有将 &man.agp.4;
+ 驱动程序编译进内核,尝试用 &man.kldload.8; 加载模块是无效的。
+ 这个驱动程序必须编译进内核或者使用 <filename>/boot/loader.conf</filename>
+ 在启动时加载进入内核。</para>
+
+ <para>如果您正在使用 <application>&xfree86;&nbsp;4.1.0</application> (或者以后的
+ 版本) 并且出现了像 <literal>fbPictureInit</literal> 这样未解决的符号提示,
+ 试着在 X11 配置文件里的
+ <literal>Driver "i810"</literal> 一行后面加入下面这行:</para>
+ <programlisting>Option "NoDDC"</programlisting>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="x-fonts">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Murray</firstname>
+ <surname>Stokely</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>在 X11 中使用字体</title>
+
+ <sect2 id="type1">
+ <title>Type1 字体</title>
+ <para>X11 使用的默认字体不是很理想。
+ 大型的字体显得参差不齐,看起来很不专业,在
+ <application>&netscape;</application> 中,小字体也显得莫名颇。
+ 然而,有几个自由的,高质量的字体可以在 X11 中使用。 例如,URW字体集合
+ (<filename role="package">x11-fonts/urwfonts</filename>) 就包括了高质量的
+ 标准 type1 字体 (<trademark class="registered">Times Roman</trademark>,
+ <trademark class="registered">Helvetica</trademark>, <trademark class="registered">Palatino</trademark> 和其他一些).在 Freefont 集合中
+ (<filename role="package">x11-fonts/freefonts</filename>) 也包括更多的字体,
+ 但它们中的绝大部分使用在图形软件中,如
+ <application>Gimp</application>,在屏幕字体中使用并不完美。另外,
+ 只要花很少的功夫,可以将
+ <application>&xfree86;</application> 配置成能使用
+ &truetype; 字体:请参见后面的
+ <link linkend="truetype">&truetype; 字体一节</link>。</para>
+
+ <para>要安装上面的Type1字体,您只需要运行下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/x11-fonts/urwfonts</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>freefont 或其他的字库和上面所说的大体类似。 为了让 X
+ 服务器能够检测到这些字体, 需要在
+ X 服务器的配置文件 <filename>/etc/X11/</filename>
+ (<application>&xorg;</application> 是 <filename>xorg.conf</filename> 而
+ <application>&xfree86;</application> 则是 <filename>XF86Config</filename>)
+ 中增加下面的配置:</para>
+
+ <programlisting>FontPath "/usr/X11R6/lib/X11/fonts/URW/"</programlisting>
+
+ <para>或者,也可以在命令行运行:</para>
+
+ <screen>&prompt.user; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/URW</userinput>
+&prompt.user; <userinput>xset fp rehash</userinput></screen>
+
+ <para>这样会起作用,但是当 X 会话结束后就会丢失,
+ 除非它被添加到启动文件 (<filename>~/.xinitrc</filename> 中,
+ 针对一个寻常的 <command>startx</command> 会话,或者当您通过一个类似
+ <application>XDM</application> 的图形登陆管理器登陆时添加到
+ <filename>~/.xsession</filename> 中)。
+ 第三种方法是使用新的
+ <filename>/usr/X11R6/etc/fonts/local.conf</filename> 文件: 查看
+ <link linkend="antialias">anti-aliasing</link> 章节。
+ </para>
+ </sect2>
+
+ <sect2 id="truetype">
+ <title>&truetype; 字体</title>
+
+ <indexterm><primary>TrueType Fonts</primary></indexterm>
+ <indexterm><primary>fonts</primary>
+ <secondary>TrueType</secondary>
+ </indexterm>
+
+ <para><application>&xfree86;&nbsp;4.X</application> 和
+ <application>&xorg;</application> 都已经内建了对
+ &truetype; 字体的支持。有两个不同的模块能够启用这个功能。
+ 在这个例子中使用 freetype 这个模块,因为它与其他的字体描绘后端
+ 是兼容的。要启用 freetype 模块,只需要将下面这行添加到
+ <filename>/etc/X11/XF86Config</filename> 文件的
+ <literal>"Module"</literal> 部分。</para>
+
+ <programlisting>Load "freetype"</programlisting>
+
+ <para>对于 <application>&xfree86;&nbsp;3.3.X</application>,需要额外的
+ &truetype; 字体服务器。
+ <application>Xfstt</application> 通常被用于这个目的。
+ 要安装 <application>Xfstt</application>,
+ 只要简单的安装 port
+ <filename role="package">x11-servers/Xfstt</filename>.</para>
+
+ <para>现在,为 &truetype; 字体创建一个目录 (比如,
+ <filename>/usr/X11R6/lib/X11/fonts/TrueType</filename>)
+ 然后把所有的 &truetype; 字体拷贝到这个目录。记住您不能直接从
+ &macintosh; 计算机中提取 &truetype; 字体;
+ 能被 X11 使用的必须是
+ &unix;/&ms-dos;/&windows; 格式的。
+ 一旦您已经拷贝了这些文件到这个目录,使用
+ <application>ttmkfdir</application> 来创建一个
+ <filename>fonts.dir</filename> 文件,以便让X字体引擎知道
+ 您已经安装了这些新文件。
+ <command>ttmkfdir</command> 可以在 FreeBSD
+ Ports Collection
+ <filename role="package">x11-fonts/ttmkfdir</filename> 中找到。</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts/TrueType</userinput>
+&prompt.root; <userinput>ttmkfdir &gt; fonts.dir</userinput></screen>
+
+ <para>现在把 &truetype; 字体目录添加到字体路径中。
+ 这和上面 <link linkend="type1">Type1</link> 字体的步骤是一样的,
+ 那就是,使用</para>
+
+ <screen>&prompt.user; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/TrueType</userinput>
+&prompt.user; <userinput>xset fp rehash</userinput></screen>
+
+ <para>或者把 <literal>FontPath</literal> 这行加到
+ <filename>xorg.conf</filename> (或 <filename>XF86Config</filename>) 文件中。</para>
+
+ <para>就是这样。现在 <application>&netscape;</application>,
+ <application>Gimp</application>,
+ <application>&staroffice;</application> 和其他所有的 X 应用程序
+ 应该可以认出安装的 &truetype;
+ 字体。一些很小的字体(如在 Web 页面上高分辨率显示的文本)
+ 和一些很大的字体(在
+ <application>&staroffice;</application> 下) 现在看起来已经很好了。
+
+ </para>
+ </sect2>
+
+ <sect2 id="antialias">
+ <sect2info>
+ <authorgroup>
+ <author>
+ <firstname>Joe Marcus</firstname>
+ <surname>Clarke</surname>
+ <contrib>Updated by </contrib>
+ <!-- May 2003 -->
+ </author>
+ </authorgroup>
+ </sect2info>
+ <title>Anti-Aliased 字体</title>
+
+ <indexterm><primary>anti-aliased fonts</primary></indexterm>
+ <indexterm><primary>fonts</primary>
+ <secondary>anti-aliased</secondary></indexterm>
+
+ <para>X11 从 <application>&xfree86;</application> 4.0.2 开始支持字体的反走样。
+ 但是, 字体配置在
+ <application>&xfree86;</application> 4.3.0 之前是非常繁琐的。
+ 从 <application>&xfree86;</application> 4.3.0 开始,
+ 对于所有支持 Xft 的应用程序, 所有放到 X11
+ <filename>/usr/X11R6/lib/X11/fonts/</filename> 和
+ <filename>~/.fonts/</filename> 中的字体都自动地被加入反走样支持。
+ 并不是所有的应用程序都支持 Xft, 但已经有相当多的程序提供 Xft 支持了。
+ 支持 Xft 的应用程序包括 Qt 2.3 以及更高版本
+ (用以开发 <application>KDE</application> 桌面的工具包)、
+ GTK+ 2.0 和更高版本 (用于开发
+ <application>GNOME</application> 桌面的工具包), 以及
+ <application>Mozilla</application> 1.2 和更高版本。
+ </para>
+
+ <para>要控制哪些字体是 anti-aliased,或者配置 anti-aliased 特性,
+ 创建(或者编辑,如果文件已经存在的话)文件
+ <filename>/usr/X11R6/etc/fonts/local.conf</filename>。Xft 字体系统的几个
+ 高级特性都可以使用这个文件来调节;
+ 这一部分只描述几种最简单的情况。要了解更多的细节,请查看
+ &man.fonts-conf.5;.</para>
+
+ <indexterm><primary>XML</primary></indexterm>
+
+ <para>这个文件一定是 XML 格式的。注意确保所有的标签都完全的关闭掉。
+ 这个文件用一个 DOCTYPE 定义的普通的 XML 头开始,
+ 然后是 <literal>&lt;fontconfig&gt;</literal> 标签:</para>
+
+ <programlisting>
+ &lt;?xml version="1.0"?&gt;
+ &lt;!DOCTYPE fontconfig SYSTEM "fonts.dtd"&gt;
+ &lt;fontconfig&gt;
+ </programlisting>
+
+ <para>像前面所做的那样,在
+ <filename>/usr/X11R6/lib/X11/fonts/</filename> 和
+ <filename>~/.fonts/</filename> 目录下的所有字体已经可以被支持 Xft 的
+ 应用程序使用了。如果您想添加这两个目录以外的其他路径,
+ 简单的添加下面这行到
+ <filename>/usr/X11R6/etc/fonts/local.conf</filename>文件中:</para>
+
+ <programlisting>&lt;dir&gt;/path/to/my/fonts&lt;/dir&gt;</programlisting>
+
+ <para>添加了新的字体,尤其是添加了新的字体目录后,
+ 您应该运行下面的命令重建字体缓存:</para>
+
+ <screen>&prompt.root; <userinput>fc-cache -f</userinput></screen>
+
+ <para>Anti-aliasing 会让字体边缘有些模糊,这样增加了非常小的文本的可读性,
+ 然后从大文本字体中删除 <quote>staircases</quote>
+ 但如果使用普通的文本,可能会引起眼疲劳。
+ 要将字体大小范围控制在14号以下,包括这些行:</para>
+
+ <programlisting> &lt;match target="font"&gt;
+ &lt;test name="size" compare="less"&gt;
+ &lt;double&gt;14&lt;/double&gt;
+ &lt;/test&gt;
+ &lt;edit name="antialias" mode="assign"&gt;
+ &lt;bool&gt;false&lt;/bool&gt;
+ &lt;/edit&gt;
+ &lt;/match&gt;
+ &lt;match target="font"&gt;
+ &lt;test name="pixelsize" compare="less" qual="any"&gt;
+ &lt;double&gt;14&lt;/double&gt;
+ &lt;/test&gt;
+ &lt;edit mode="assign" name="antialias"&gt;
+ &lt;bool&gt;false&lt;/bool&gt;
+ &lt;/edit&gt;
+ &lt;/match&gt;</programlisting>
+
+ <indexterm><primary>fonts</primary>
+ <secondary>spacing</secondary></indexterm>
+
+ <para>用 anti-aliasing 来间隔一些等宽字体也是不适当的。
+ 这似乎是 <application>KDE</application> 的一个问题。
+ 要修复这个问题需要确保每个字体之间的间距保持在100。
+ 加入下面这些行:</para>
+
+ <programlisting> &lt;match target="pattern" name="family"&gt;
+ &lt;test qual="any" name="family"&gt;
+ &lt;string&gt;fixed&lt;/string&gt;
+ &lt;/test&gt;
+ &lt;edit name="family" mode="assign"&gt;
+ &lt;string&gt;mono&lt;/string&gt;
+ &lt;/edit&gt;
+ &lt;/match&gt;
+ &lt;match target="pattern" name="family"&gt;
+ &lt;test qual="any" name="family"&gt;
+ &lt;string&gt;console&lt;/string&gt;
+ &lt;/test&gt;
+ &lt;edit name="family" mode="assign"&gt;
+ &lt;string&gt;mono&lt;/string&gt;
+ &lt;/edit&gt;
+ &lt;/match&gt;</programlisting>
+
+ <para>(这里把其他普通的修复的字体作为
+ <literal>"mono"</literal>),然后加入:</para>
+
+ <programlisting> &lt;match target="pattern" name="family"&gt;
+ &lt;test qual="any" name="family"&gt;
+ &lt;string&gt;mono&lt;/string&gt;
+ &lt;/test&gt;
+ &lt;edit name="spacing" mode="assign"&gt;
+ &lt;int&gt;100&lt;/int&gt;
+ &lt;/edit&gt;
+ &lt;/match&gt; </programlisting>
+
+ <para>某些字体,比如 Helvetica,当 anti-aliased 的时候可能存在问题。
+ 通常的表现为字体本身似乎被垂直的切成两半。
+ 糟糕的时候,还可能导致应用程序比如
+ <application>Mozilla</application> 崩溃。
+ 为了避免这样的现象,考虑添加下面几行到
+ <filename>local.conf</filename>文件里面:</para>
+
+ <programlisting> &lt;match target="pattern" name="family"&gt;
+ &lt;test qual="any" name="family"&gt;
+ &lt;string&gt;Helvetica&lt;/string&gt;
+ &lt;/test&gt;
+ &lt;edit name="family" mode="assign"&gt;
+ &lt;string&gt;sans-serif&lt;/string&gt;
+ &lt;/edit&gt;
+ &lt;/match&gt; </programlisting>
+
+ <para>一旦您完成对
+ <filename>local.conf</filename> 文件的编辑,确保您使用了
+ <literal>&lt;/fontconfig&gt;</literal> 标签来结束文件。
+ 不这样做将会导致您的更改被忽略。</para>
+
+ <para>X11 默认的字库当使用反走样时会比较难看。
+ 更好的字库可以在
+ <filename role="package">x11-fonts/bitstream-vera</filename>
+ port 中找到。 这个 port 会创建一个
+ <filename>/usr/X11R6/etc/fonts/local.conf</filename> 文件,
+ 如果这个文件不存在的话。 反之,
+ port 将创建 <filename>/usr/X11R6/etc/fonts/local.conf-vera
+ </filename> 文件。 将其内容合并到
+ <filename>/usr/X11R6/etc/fonts/local.conf</filename> 中,
+ 则 Bitstream 字体将自动地代替默认的
+ X11 Serif, Sans Serif, 以及单倍距字体。</para>
+
+ <para>最后,用户可以添加他们自己的设定通过他们个人的
+ <filename>.fonts.conf</filename> 文件。这样做,每个用户应该简单的
+ 创建文件 <filename>~/.fonts.conf</filename>。这个文件也必须是 XML 格式的。
+ </para>
+
+ <indexterm><primary>LCD screen</primary></indexterm>
+ <indexterm><primary>Fonts</primary>
+ <secondary>LCD screen</secondary></indexterm>
+
+ <para>最后一点:对于LCD屏幕,需要有子像素的取样。这个基本上
+ 由(水平分割的)红,绿,蓝三色组成,用来提高水平刷新率,结果
+ 可能很有趣。要启用这个,需要在
+ <filename>local.conf</filename> 文件的某个地方加入下面这行:
+ </para>
+
+ <programlisting>
+ &lt;match target="font"&gt;
+ &lt;test qual="all" name="rgba"&gt;
+ &lt;const&gt;unknown&lt;/const&gt;
+ &lt;/test&gt;
+ &lt;edit name="rgba" mode="assign"&gt;
+ &lt;const&gt;rgb&lt;/const&gt;
+ &lt;/edit&gt;
+ &lt;/match&gt;
+ </programlisting>
+
+ <note><para>依赖于显示器的种类,
+ <literal>rgb</literal> 可能需要被更改为 <literal>bgr</literal>,
+ <literal>vrgb</literal> 或 <literal>vbgr</literal>:实验一下
+ 看看那个更好。</para></note>
+
+ <indexterm><primary>Mozilla</primary></indexterm>
+ <indexterm><primary>web browsers</primary>
+ <secondary>Mozilla</secondary>
+ <see>Mozilla</see></indexterm>
+
+ <para>Anti-aliasing 在您下次启动系统时就能用了。
+ 然而,注意您的程序必须知道如何使用它。现在,Qt 工具包做到了,
+ 所以整个 <application>KDE</application> 环境能够使用
+ anti-aliased 字体 (查看 <application>KDE</application> 上的
+ <xref linkend="x11-wm-kde-antialias"> 了解细节)。 GTK+ 和
+ <application>GNOME</application> 也可以被编译为使用
+ anti-aliasing 通过 <quote>Font</quote> capplet (查看 <xref
+ linkend="x11-wm-gnome-antialias"> 了解细节)。默认情况下,
+ <application>Mozilla</application> 1.2 以及更高版本都会自动的使用
+ anti-aliasing。要禁用它,使用 <makevar>-DWITHOUT_XFT</makevar> 选项
+ 重新编译 <application>Mozilla</application>。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="x-xdm">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Seth</firstname>
+ <surname>Kingsley</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>X 显示管理器</title>
+ <sect2>
+ <title>概要</title>
+
+ <indexterm><primary>X Display Manager</primary></indexterm>
+ <para>X 显示管理器(<application>XDM</application>)
+ 是一个X视窗系统用于进行登陆会话管理的可选项。
+ 这个可以应用于多种情况下,包括小
+ <quote>X Terminals</quote>,
+ 桌面,大网络显示服务器。既然 X 视窗系统不受网络和协议的限制,
+ 那对于通过网络连接起来的运行 X 客户端和服务器端的不同机器,
+ 就会有很多的可配置项。
+ <application>XDM</application>
+ 提供了一个选择要连接到哪个显示服务器的图形接口,
+ 只要键入如登陆用户名和密码这样的验证信息。</para>
+
+ <para>您也可以把 <application>XDM</application> 想象成与
+ &man.getty.8 工具一样(see <xref linkend="term-config"> for
+ details)。为用户提供了同样功能。它可以完成系统的登陆任务,
+ 然后为用户运行一个会话管理器
+ (通常是一个 X 视窗管理器)。接下来 <application>XDM</application>
+ 就等待这个程序退出,发出信号用户已经登陆完成,应当退出屏幕。
+ 这时,
+ <application>XDM</application>
+ 就可以为下一个登陆用户显示登陆和可选择屏幕。</para>
+ </sect2>
+
+ <sect2>
+ <title>使用 XDM</title>
+
+ <para><application>XDM</application> 精灵程序在
+ <filename>/usr/X11R6/bin/xdm</filename> 中。您可以在任何时候
+ 用 <username>root</username> 来运行这个程序,
+ 在本地机器上,它将启动管理X的画面。如果要
+ <application>XDM</application> 每次机器一启动就开始运行,
+ 一个简单的办法是在 <filename>/etc/ttys</filename> 中加入一个记录。
+ 有关这个文件的更多的格式和使用方法,可以看看 <xref
+ linkend="term-etcttys">。在默认的
+ <filename>/etc/ttys</filename> 文件中用于运行
+ <application>XDM</application> 守护程序的一行是这样的:</para>
+
+ <screen>ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure</screen>
+
+ <para>默认情况下,这个记录是关闭的,要启用它,
+ 您需要把第5部分的 <literal>off</literal> 改为
+ <literal>on</literal> 然后按照 <xref linkend="term-hup"> 的指导
+ 重新启动 &man.init.8;。第一部分,这个程序将管理的终端名称是
+ <literal>ttyv8</literal>。这意味着
+ <application>XDM</application> 将运行在第9个虚拟终端上。</para>
+ </sect2>
+
+ <sect2>
+ <title>配置 XDM</title>
+
+ <para><application>XDM</application> 的配置目录是在
+ <filename>/usr/X11R6/lib/X11/xdm</filename>中。在这个目录中,
+ 您会看到几个用来改变
+ <application>XDM</application> 行为和外观的文件。您会找到这些文件:</para>
+
+ <informaltable frame="none">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>文件</entry>
+ <entry>描述</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><filename>Xaccess</filename></entry>
+ <entry>客户端授权规则。</entry>
+ </row>
+
+ <row>
+ <entry><filename>Xresources</filename></entry>
+ <entry>默认的X资源值。</entry>
+ </row>
+
+ <row>
+ <entry><filename>Xservers</filename></entry>
+ <entry>远程和本地显示管理列表。</entry>
+ </row>
+
+ <row>
+ <entry><filename>Xsession</filename></entry>
+ <entry>用于登陆的默认的会话脚本。</entry>
+ </row>
+
+ <row>
+ <entry><filename>Xsetup_</filename>*</entry>
+ <entry>登陆之前用于加载应用程序的脚本。</entry>
+ </row>
+
+ <row>
+ <entry><filename>xdm-config</filename></entry>
+ <entry>运行在这台机器上的所有显示的全局配置。</entry>
+ </row>
+
+ <row>
+ <entry><filename>xdm-errors</filename></entry>
+ <entry>服务器程序产生的错误。</entry>
+ </row>
+
+ <row>
+ <entry><filename>xdm-pid</filename></entry>
+ <entry>当前运行的 XDM 的进程 ID。</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>当 <application>XDM</application> 运行时,
+ 在这个目录中有几个脚本和程序可以用来设置桌面。
+ 这些文件中的每一个的用法都将被简要地描述。
+ 这些文件的更详细的语法和用法在
+ &man.xdm.1; 中将有详细描述。</para>
+
+ <para>默认的配置是一个矩形的登陆窗口,上面有机器的名称,
+ <quote>Login:</quote> 和
+ <quote>Password:</quote>。如果您想设计您自己个性化的
+ <application>XDM</application> 屏幕,这是一个很好的起点。</para>
+
+ <sect3>
+ <title>Xaccess</title>
+
+ <para>连接到
+ <application>XDM</application> 的用来控制显示的协议
+ 叫做 X 显示管理连接协议(XDMCP)。
+ 这个文件是一个用来控制来自远程机器的XDMCP连接。默认的,
+ 它允许任何客户端连接,但那没有用,除非
+ <filename>xdm-config</filename>
+ 被修改成用于侦听远程连接。</para>
+ </sect3>
+
+ <sect3>
+ <title>Xresources</title>
+ <para>这是一个默认的用来显示选项和登陆屏幕的应用程序文件。这
+ 就是您能够定制登陆程序的外观的地方。这个格式与
+ X11 文档中描述的默认应用
+ 程序文件是一样的。</para>
+ </sect3>
+
+ <sect3>
+ <title>Xservers</title>
+ <para>这是一个选择者应当提供的作为可选的远程显示列表。
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>Xsession</title>
+ <para>这是一个用户登陆后针对
+ <application>XDM</application> 的默认会话脚本。通常,在
+ <filename>~/.xsession</filename>
+ 中每个用户将有一个可定制的会话脚本。</para>
+ </sect3>
+
+ <sect3>
+ <title>Xsetup_*</title>
+ <para>在显示选择者或登陆接口之前,这些将被自动运行。
+ 这是一个每个显示都要用到的脚本,叫做
+ <filename>Xsetup_</filename>,
+ 后面会跟一个本地显示的数字(比如
+ <filename>Xsetup_0</filename>)。典型的,这些脚本将在后台
+ (如 <command>xconsole</command>)运行一个或两个程序。</para>
+ </sect3>
+
+ <sect3>
+ <title>xdm-config</title>
+ <para>此文件以应用程序默认值的形式,
+ 提供了在安装时所使用的普适的显示设置。</para>
+ </sect3>
+
+ <sect3>
+ <title>xdm-errors</title>
+ <para>这个文件包含了正在设法运行的
+ <application>XDM</application> 的X server输出。如果一个
+ <application>XDM</application> 正设法运行的显示由于某种原因被挂起,
+ 那这是一个寻找错误信息的好地方。
+ 这些信息会在每一个会话的基础上被写到用户的
+ <filename>~/.xsession-errors</filename>
+ 文件中。</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>运行一个网络显示服务器</title>
+
+ <para>对于其他客户端来说,为了连接到显示服务器,您将必须编辑访问控制规则,
+ 然后启用连接侦听。默认的这些被设置成比较保守的值。
+ 要让<application>XDM</application>能侦听连接,先要在
+ <filename>xdm-config</filename>
+ 文件中注释掉一行:</para>
+
+ <screen>! SECURITY: do not listen for XDMCP or Chooser requests ! Comment out this line if you want to manage X terminals with xdm
+DisplayManager.requestPort: 0</screen>
+
+ <para>然后重新启动<application>XDM</application>。
+ 记住默认应用程序文件的注释以<quote>!</quote>
+ 字母开始,不是<quote>#</quote>。
+ 您需要设置严格的访问控制。看看在
+ <filename>Xaccess</filename>文件中的实例记录,可以参考
+ &man.xdm.1; 的联机手册。</para>
+ </sect2>
+
+ <sect2>
+ <title>替换 XDM</title>
+
+ <para>有几个替换默认
+ <application>XDM</application>程序的方案。它们是,
+ 上一节已经描述过的<application>kdm</application> (与
+ <application>KDE</application>捆绑在一起)。
+ <application>kdm</application> 提供了许多视觉上的改进和局部的修饰,
+ 同样能让用户在启动时能选择他们喜欢的窗口管理器。</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="x11-wm">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Valentino</firstname>
+ <surname>Vaschetto</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ <!-- June 2001 -->
+ </authorgroup>
+ </sect1info>
+
+ <title>桌面环境</title>
+
+ <para>这节描述了 FreeBSD 上用于 X 的不同桌面环境。
+ <quote>桌面环境</quote>
+ 可能仅仅是一个简单的窗口管理器,
+ 也可能是一个像
+ <application>KDE</application> 或者 <application>GNOME</application>这样的完整桌面应用程序套件。
+ </para>
+
+ <sect2 id="x11-wm-gnome">
+ <title>GNOME</title>
+
+ <sect3 id="x11-wm-gnome-about">
+ <title>有关 GNOME</title>
+
+ <indexterm><primary>GNOME</primary></indexterm>
+ <para><application>GNOME</application> 是一个用户界面友好的桌面环境,
+ 能够使用户很容易地使用和配置他们的计算机。
+ <application>GNOME</application>
+ 包括一个面板(用来启动应用程序和显示状态),
+ 一个桌面(存放数据和应用程序的地方),
+ 一套标准的桌面工具和应用程序,
+ 和一套与其他人相互协同工作的协议集。
+ 其他操作系统的用户在使用
+ <application>GNOME</application>提供的强大的图形驱动环境时会觉得很好。
+ 更多的关于 FreeBSD 上 <application>GNOME</application> 的信息
+ 可以在 <ulink
+ url="http://www.FreeBSD.org/gnome">FreeBSD GNOME
+ Project</ulink>的网页上找到。</para>
+ </sect3>
+
+ <sect3 id="x11-wm-gnome-install">
+ <title>安装 GNOME</title>
+
+ <para>安装
+ <application>GNOME</application>的最简单的方法是
+ <xref linkend="default-desktop"> 第&nbsp;2 章描述的在FreeBSD安装过程中通过
+ <quote>Desktop Configuration</quote>菜单来进行。
+ 它们也可以很容易地从一个package或ports collection安装:</para>
+
+ <para>要从网络安装<application>GNOME</application>,
+ 只要键入:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r gnome2</userinput></screen>
+
+ <para>从源代码编译<application>GNOME</application>,可以使用
+ ports树:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/x11/gnome2</userinput> &prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>一旦<application>GNOME</application>被安装好,
+ X Server必须被告知启动
+ <application>GNOME</application>以代替默认的窗口管理器。
+ 如果在适当的位置已经定制好了文件<filename>.xinitrc</filename>,
+ 简单地将启动当前窗口管理器的那行替换为
+ <application>/usr/X11R6/bin/gnome-session</application>。
+ 如果对配置文件不想添加任何特殊改动,只需简单地键入:</para>
+
+ <screen>&prompt.user; <userinput>echo "/usr/X11R6/bin/gnome-session" &gt; ~/.xinitrc</userinput></screen>
+
+ <para>接着,键入<command>startx</command>,
+ <application>GNOME</application>桌面环境就启动了。</para>
+
+ <note><para>如果已经使用了一个像
+ <application>XDM</application>这样的显示管理器,就不能这样做。
+ 而是,用同样的命令创建一个可执行文件<filename>.xsession</filename>。
+ 要这样做,需要先编辑文件,然后用
+ <application>/usr/X11R6/bin/gnome-session</application>替换已存在的窗口管理命令:
+ </para></note>
+
+ <screen>&prompt.user; <userinput>echo "#!/bin/sh" > ~/.xsession</userinput> &prompt.user; <userinput>echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession</userinput> &prompt.user; <userinput>chmod +x ~/.xsession</userinput></screen>
+
+ <para>另一个选项是在登陆时配置显示管理器允许您选择窗口管理器;有关
+ <link linkend="x11-wm-kde-details">KDE 细节</link>
+ 会解释如何使用<application>kdm</application>,
+ <application>KDE</application>显示管理器来做。</para>
+ </sect3>
+
+ <sect3 id="x11-wm-gnome-antialias">
+ <title>在GNOME上使用Anti-aliased字体</title>
+
+ <indexterm><primary>GNOME</primary>
+ <secondary>anti-aliased fonts</secondary></indexterm>
+ <para>X11 通过<quote>RENDER</quote>扩展来支持 anti-aliasing。
+ GTK+ 2.0 以及更高的版本(被
+ <application>GNOME</application>使用的工具包)可以使用这个功能。
+ 配置 anti-aliasing 在
+ <xref linkend="antialias">描述。所以,使用最近的软件,
+ anti-aliasing 可以应用在
+ <application>GNOME</application>桌面环境中。只需要依次选择
+ <menuchoice>
+ <guimenu>应用程序</guimenu>
+ <guisubmenu>桌面首选项</guisubmenu>
+ <guimenuitem>字体</guimenuitem></menuchoice>,然后选上
+ <guibutton>最佳形状</guibutton>,
+ <guibutton>最佳对比度</guibutton>,或者
+ <guibutton>像素圆滑(LCD)</guibutton>。对于
+ GTK+ 应用程序,它们不是
+ <application>GNOME</application> 桌面的一部分,在启动程序前需要设置
+ 环境变量<varname>GDK_USE_XFT</varname>的值为
+ <literal>1</literal>。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="x11-wm-kde">
+ <title>KDE</title>
+
+ <indexterm><primary>KDE</primary></indexterm>
+ <sect3 id="x11-wm-kde-about">
+ <title>有关 KDE</title>
+
+ <para><application>KDE</application> 是一个容易使用的现代桌面环境。
+ <application>KDE</application> 有很多很好的特性:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>一个美丽的现代的桌面。</para>
+ </listitem>
+
+ <listitem>
+ <para>一个集合了完美网络环境的桌面。</para>
+ </listitem>
+
+ <listitem>
+ <para>一个集成的允许您方便,高效地帮助您使用
+ <application>KDE</application> 桌面和它的应用程序的帮助系统。</para>
+ </listitem>
+
+ <listitem>
+ <para>所有的<application>KDE</application>应用程序具有一致的所见即所得界面。</para>
+ </listitem>
+
+ <listitem>
+ <para>标准的菜单和工具栏,键盘布局,颜色配置等。</para>
+ </listitem>
+
+ <listitem>
+ <para>国际化:<application>KDE</application>
+ 可以使用超过40种语言。</para>
+ </listitem>
+
+ <listitem>
+ <para>集中的一致化的桌面驱动配置。</para>
+ </listitem>
+
+ <listitem>
+ <para>许多有用的
+ <application>KDE</application>应用程序。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><application>KDE</application> 有一个以
+ <application>KDE</application> 的
+ <quote>KParts</quote> 技术为基础的办公套件。
+ 它包括电子表格,幻灯片,日程管理和新闻等软件。
+ <application>KDE</application>
+ 也包含一个与当前 &unix; 系统上其他Web浏览器相竞争的叫做
+ <application>Konqueror</application> 的浏览器。
+ systems. 关于 <application>KDE</application> 的更多信息可以在
+ <ulink url="http://www.kde.org/">KDE 网站</ulink>上找到。
+ <application>KDE</application> 上关于 FreeBSD 的特定信息和资源,可以参考
+ <ulink url="http://freebsd.kde.org/">FreeBSD-KDE
+ team</ulink>的网站。</para>
+ </sect3>
+
+ <sect3 id="x11-wm-kde-install">
+ <title>安装 KDE</title>
+
+ <para>与 <application>GNOME</application> 或其他桌面环境一样,安装
+ <application>KDE</application> 的最容易的方法是通过
+ <xref linkend="default-desktop"> 第 2 章所描绘的 FreeBSD 安装过程的
+ <quote>Desktop Configuration</quote> 菜单来安装。
+ 另外,它也可以很容易地从packages或ports collection安装:</para>
+
+ <para>要从网络安装 <application>KDE</application> 只需要:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r kde</userinput></screen>
+
+ <para>&man.pkg.add.1; 就回自动的下在最新版本的应用程序。</para>
+
+ <para>要从源代码编译 <application>KDE</application>,
+ 可以使用 port 树:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/x11/kde3</userinput> &prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para><application>KDE</application> 安装完成后,
+ X server必须被告知启动这个应用程序以代替默认的窗口管理器。
+ 这可以通过编辑 <filename>.xinitrc</filename> 文件来完成:</para>
+
+ <screen>&prompt.user; <userinput>echo "exec startkde" &gt; ~/.xinitrc</userinput></screen>
+
+ <para>现在,无论您什么时候用
+ <command>startx</command>进入 X 视窗系统,
+ <application>KDE</application> 就将成为您的桌面环境。</para>
+
+ <para>如果使用一个像
+ <application>XDM</application>这样的显示管理器,
+ 那配置文件可能有点不同。需要编辑一个
+ <filename>.xsession</filename> 文件,有关
+ <application>kdm</application> 的用法会在这章的后面介绍。</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="x11-wm-kde-details">
+ <title>有关 KDE 的更多细节</title>
+
+ <para>现在 <application>KDE</application> 已经被安装在系统中了。
+ 通过帮助页面或点击多个菜单可以发现很多东西。
+ &windows; 或 &mac; 用户会有回到家的感觉。</para>
+
+ <para>有关 <application>KDE</application> 的最好的参考资料是
+ 它的在线文档。<application>KDE</application>
+ 拥有它自己的 web 浏览器
+ <application>Konqueror</application>,
+ 还有很多其他的应用程序和丰富文档。
+ 这节的余下部分将讨论一些很难用走马观花的方法来学习的技术项目。</para>
+
+ <sect3 id="x11-wm-kde-kdm">
+ <title>KDE 显示管理器</title>
+
+ <indexterm><primary>KDE</primary>
+ <secondary>display manager</secondary></indexterm>
+ <para>一个多用户系统的系统管理员可能希望给用户提供一个图形化的登陆界面,
+ 像前面描述的一样,可以使用 <link linkend="x-xdm">xdm</link>。
+ 然而,
+ <application>KDE</application> 提供了另一种选择,
+ <application>kdm</application>,
+ 它看起来很吸引人,还包含很多登陆选项。
+ 特别的,用户可以很容易地(通过一个菜单) 选择登陆后使用哪个桌面环境
+ (<application>KDE</application>,
+ <application>GNOME</application>或其他)。</para>
+
+ <para>首先,以 <username>root</username> 用户身份运行 <application>KDE</application>
+ 控制面板,<command>kcontrol</command>。
+ 通常情况下,以 <username>root</username> 身份运行 X 环境是很不安全的。
+ 您应当以普通用户来使用窗口管理器,
+ 打开一个终端窗口(例如
+ <filename>xterm</filename> 或者 <application>KDE</application> 的
+ <filename>konsole</filename>),用 <userinput>su</userinput> 来切换成
+ <username>root</username>(这个用户必须首先在 <filename>/etc/group</filename>
+ 的 <groupname>wheel</groupname> 组里),然后再键入
+ <userinput>kcontrol</userinput>。</para>
+
+ <para>点击左边标记
+ <guibutton>系统</guibutton>的图标,然后选择<guibutton>登陆管理器
+ </guibutton>。在右面,有几个配置选项,
+ <application>KDE</application> 手册会解释的更加详细一些。
+ 点击右边的<guibutton>会话</guibutton>。
+ 点击<guibutton>新类型</guibutton>来添加几个窗口管理器或桌面环境。
+ 这些只是标签,所以它们用
+ <application>KDE</application>或
+ <application>GNOME</application>要比用
+ <application>startkde</application>或者
+ <application>gnome-session</application>来得好。
+ 也可以是<literal>failsafe</literal>。</para>
+
+ <para>也可以用同样方法定制其他菜单,它们主要是起修饰和自我解释用的。
+ 完成之后,键入<guibutton>Apply</guibutton>按钮,退出控制中心。</para>
+
+ <para>要确信<application>kdm</application>理解标签
+ (<application>KDE</application>,
+ <application>GNOME</application>等)的意思,需要编辑一些
+ <link linkend="x-xdm">xdm</link>用的文件。
+ <note><para>在<application>KDE 2.2</application>中,这有些变化:
+ <application>kdm</application>现在使用它自己的配置文件。
+ 请看看<application>KDE 2.2</application>的文档。</para>
+ </note>
+ 在一个终端窗口,作为<username>root</username>用户,要编辑
+ <filename>/usr/X11R6/lib/X11/xdm/Xsession</filename>文件,
+ 中间有一部分是这样的:</para>
+
+ <screen>case $# in
+1)
+ case $1 in
+ failsafe)
+ exec xterm -geometry 80x24-0-0
+ ;;
+ esac
+esac</screen>
+
+ <para>需要在这部分加几行。
+ 假定使用的标签是<quote>KDE</quote>和
+ <quote>GNOME</quote>,
+ 就像下面这样:</para>
+
+ <screen>case $# in
+1)
+ case $1 in
+ kde)
+ exec /usr/local/bin/startkde
+ ;;
+ GNOME)
+ exec /usr/X11R6/bin/gnome-session
+ ;;
+ failsafe)
+ exec xterm -geometry 80x24-0-0
+ ;;
+ esac
+esac</screen>
+
+ <para>为了加上<application>KDE</application>
+ 的登陆桌面背景,
+ 需要在
+ <filename>/usr/X11R6/lib/X11/xdm/Xsetup_0</filename>中加入下面这行:</para>
+
+ <screen>/usr/local/bin/kdmdesktop</screen>
+
+ <para>现在,确信<application>kdm</application>在
+ <filename>/etc/ttys</filename>中列出来了,并且将被启动。
+ 要这样做,只要跟着先前有关
+ <link linkend="x-xdm">XDM</link>用法,用
+ <command>/usr/X11R6/bin/xdm</command>
+ 程序的用法替换<command>/usr/local/bin/kdm</command>的用法就可以了。</para>
+ </sect3>
+
+ <sect3 id="x11-wm-kde-antialias">
+ <title>Anti-aliased字体</title>
+
+ <indexterm><primary>KDE</primary>
+ <secondary>anti-aliased fonts</secondary></indexterm>
+ <para>X11 通过它的
+ <quote>RENDER</quote>扩展来支持anti-aliasing,从2.3版本开始,
+ Qt (被<application>KDE</application>使用的工具包)也支持
+ 这个扩展。在有关anti-aliasing X11字体的<xref
+ linkend="antialias">节描述到了如何配置这些。
+ 所以,对于现在的软件,anti-aliasing也可以用在
+ <application>KDE</application>桌面上。只需要到KDE
+ 菜单,到
+ <menuchoice>
+ <guimenu>Preferences</guimenu>
+ <guisubmenu>Look and Feel</guisubmenu>
+ <guimenuitem>Fonts</guimenuitem></menuchoice>,然后点击
+ <guibutton>Use Anti-Aliasing for Fonts and Icons</guibutton>。
+ 对于一个不是
+ <application>KDE</application>的一部分的Qt应用程序,环境变量
+ <varname>QT_XFT</varname>需要在启动程序前被设置成<literal>true</literal>。</para>
+
+ </sect3>
+ </sect2>
+
+ <sect2 id="x11-wm-xfce">
+ <title>XFce</title>
+ <sect3 id="x11-wm-xfce-about">
+ <title>有关XFce</title>
+
+ <para><application>XFce</application>是以被<application>GNOME</application>
+ 使用的 GTK+ 工具包为基础的桌面环境,
+ 但是更加轻巧,适合于那些需要一个易于使用和配置并且简单而高效的桌面的人。
+ 看起来,它非常像使用在商业&unix;系统上的
+ <application>CDE</application>环境。
+ <application>XFce</application>的主要特性有下面这些:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>一个简单,易于使用的桌面。</para>
+ </listitem>
+
+ <listitem>
+ <para>完全通过鼠标的拖动和按键来控制等。</para>
+ </listitem>
+
+ <listitem>
+ <para>与<application>CDE</application>
+ 相似的主面板,菜单,applets和应用launchers。</para>
+ </listitem>
+
+ <listitem>
+ <para>集成的窗口管理器,文件管理器,声音管理器,
+ <application>GNOME</application>应用模块,和其他一些。</para>
+ </listitem>
+
+ <listitem>
+ <para>可配置界面的主题。(因为它使用GTK+)</para>
+ </listitem>
+
+ <listitem>
+ <para>快速,轻便,高效:对于比较老的/旧的机器或带有很少内存的机器仍然很理想。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>更多有关<application>XFce</application>
+ 的信息可以参考<ulink url="http://www.xfce.org/">XFce
+ 网站</ulink>。</para>
+ </sect3>
+
+ <sect3 id="x11-wm-xfce-install">
+ <title>安装XFce</title>
+
+ <para>有一个二进制的<application>XFce</application>
+ 软件包存在(在写作的时候)。要安装的话,执行下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>pkg_add -r xfce4</userinput></screen>
+
+ <para>另外,要从源代码建立,使用ports collection:</para>
+
+ <screen>&prompt.root; <userinput>cd /usr/ports/x11-wm/xfce4</userinput>
+&prompt.root; <userinput>make install clean</userinput></screen>
+
+ <para>现在,要告诉X服务器在下次X启动时执行
+ <application>XFce</application>。
+ 只要执行下面的命令:</para>
+
+ <screen>&prompt.user; <userinput>echo "/usr/X11R6/bin/startxfce4" &gt; ~/.xinitrc</userinput></screen>
+
+ <para>接下来就是启动 X,
+ <application>XFce</application>将成为您的桌面。
+ 与以前一样,如果使用像
+ <filename>XDM</filename> 这样的显示管理器,需要创建一个
+ <filename>.xsession</filename>文件,就像有关
+ <link linkend="x11-wm-gnome">GNOME</link> 的那节描述的,
+ 使用<filename>/usr/X11R6/bin/startxfce4</filename>
+ 命令,或者,配置显示管理器允许在启动时选择一个桌面,
+ 就像有关<link linkend="x11-wm-kde-kdm">kdm</link>的那节描述的。</para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->