diff --git a/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml b/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml
index 90532b12ca..d4b8b315ac 100644
--- a/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/cutting-edge/chapter.sgml
@@ -1,2749 +1,2749 @@
Jim
Mock
重新组织和部分更新,由
Jordan
Hubbard
原创:
Poul-Henning
Kamp
John
Polstra
Nik
Clayton
张
雪平
中文翻译:
更新与升级 &os;
概述
&os; 在发行版之间始终是持续开发的。 一些人喜欢使用官方发行的版本,
另一些喜欢与最新的开发保持同步。 然而,
即使是官方的发行版本也常常需要安全补丁和重大修正方面的更新。
不论你使用了何种版本, &os; 都提供了所有更新系统所需的工具,
让你轻松的在不同版本间升级。
这一章节将帮助你决定是跟踪开发系统还是坚持使用某个发行的版本。
同时还列出了一些保持系统更新所需的基本工具。
读了本章后,您将了解到:
使用哪些工具来更新系统与 Ports Collection。
如何使用
freebsd-update,
CVSup,
CVS, or
CTM
让你的系统保持更新。
如何比较已安装的系统与原来已知拷贝的状态。
如何使用
CVSup 或者文档 ports 来更新本地的文档。
两个开发分支 &os.stable; 和 &os.current;
的区别。
如何通过 make buildworld
重新编译安装整个基本系统(等等)。
在读本章这前,您应该了解的:
正确设置网络连接 ()。
知道怎样安装附加的第三方软件()。
整个这一章中,cvsup
命令都被用来获取 &os; 源代码的更新。
你需要安装一个像
net/cvsup-without-gui
这样的 port 或者二进制包。
如果你使用的是 &os; 6.2-RELEASE 或之后的版本,
你可以使用 &man.csup.1; 代替,
现在它已经是基本系统的一部分了。
Tom
Rhodes
Written by
Colin
Percival
Based on notes provided by
FreeBSD 更新
Updating and Upgrading
freebsd-update
updating-upgrading
打安全补丁是对于维护计算机软件的一个重要部分,
特别是对于操作系统。对于 &os; 来说,
很长的一段时间以来这都不是一件容易的事情。
补丁打在源代码上,代码需要被重新编译为二进制,
然后再重新安装编译后的程序。
&os; 引入了 freebsd-update
工具之后这便不再是问题了。这个工具提供了 2 种功能。
第一,它可以把二进制的安全和勘误更新直接应用于 &os;
的基本系统,而不需要重新编译和安装。第二,
这个工具还支持主要跟次要的发行版的升级。
由安全小组支持的各种体系结构和发行版都可使用二进制更新。
然而有些特性,比如升级 &os; 操作系统需要最近的 &man.freebsd-update.8;
- 和 &os; 6.3。在升级到一个新的发行版本之前,
- 应先阅读一下当前发行版的声明,
+ 和 &os; 6.3 或更高版本。
+ 在升级到一个新的发行版本之前, 应先阅读一下当前发行版的声明,
因为他们可能包含有关于你期望升级版本的重要消息。
这些发行声明可以通过以下链接查阅:
。
如果 crontab 中存在有用到
freebsd-update 特性的部分,
那么这些在开始以下操作前必须先被禁止。
配置文件
有些用户可能希望通过调整配置文件
/etc/freebsd-update.conf
中的默认配置来更好地控制升级的过程。
可用的参数在文档中介绍的很详细,
但下面的这些可能需要进一步的解释:
# Components of the base system which should be kept updated.
Components src world kernel
这个参数是控制 &os; 的哪一部分将被保持更新。
默认的是更新源代码,整个基本系统还有内核。
这些部件跟安装时的那些相同,举例来说,
在这里加入 “world/games” 就会允许打入游戏相关的补丁。
使用 “src/bin” 则是允许更新
src/bin
目录中的源代码。
最好的选择是把这个选项保留为默认值,
因为如果要修改它去包含一些指定的选项,
就需要用户列出每一个想要更新的项目。
这可能会引起可怕的后果,
因为部分的源代码和二进制程序得不到同步。
# Paths which start with anything matching an entry in an IgnorePaths
# statement will be ignored.
IgnorePaths
添加路径,比如
/bin 或者
/sbin
让这些指定的目录在更新过程中不被修改。
这个选项能够防止本地的修改被
freebsd-update 覆盖。
# Paths which start with anything matching an entry in an UpdateIfUnmodified
# statement will only be updated if the contents of the file have not been
# modified by the user (unless changes are merged; see below).
UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
更新指定目录中的未被修改的配置文件。
用户的任何修改都会使这些文件的自动更新失效。
还有另外一个选项,
KeepModifiedMetadata,
这个能让 freebsd-update
在合并时保存修改。
# When upgrading to a new &os; release, files which match MergeChanges
# will have any local changes merged into the version from the new release.
MergeChanges /etc/ /var/named/etc/
一个 freebsd-update
应该尝试合并的配置文件的列表。文件合并的过程是
一系列的 &man.diff.1; 补丁类似于更少选项的 &man.mergemaster.8;
合并的选项是接受,打开一个文本编辑器,或者
freebsd-update 会被中止。
在不能确定的时候,请先备份 /etc
然后接受合并。更多关于 mergemaster
的信息请参阅 。
# Directory in which to store downloaded updates and temporary
# files used by &os; Update.
# WorkDir /var/db/freebsd-update
这个目录是放置所有补丁和临时文件的。
用户做一个版本升级的话,请确认此处至少有 1 GB
的可用磁盘空间。
# When upgrading between releases, should the list of Components be
# read strictly (StrictComponents yes) or merely as a list of components
# which *might* be installed of which &os; Update should figure out
# which actually are installed and upgrade those (StrictComponents no)?
# StrictComponents no
当设置成 yes 时,
freebsd-update 将假设这个
Components 列表时完整的,
并且对此列表以外的项目不会修改。实际上就是
freebsd-update 会尝试更新
Componets
列表里的每一个文件。
安全补丁
安全补丁存储在远程的机器上,
可以使用如下的命令下载并安装:
&prompt.root; freebsd-update fetch
&prompt.root; freebsd-update install
如果给内核打了补丁,那么系统需要重新启动。
如果一切都进展顺利,系统就应该被打好了补丁而且
freebsd-update 可由夜间
&man.cron.8; 执行。在 /etc/crontab
中加入以下条目足以完成这项任务:
@daily root freebsd-update cron
这条记录是说明每天运行一次
freebsd-update 工具。 用这种方法,
使用了 参数,
freebsd-update 仅检查是否存在更新。
如果有了新的补丁,就会自动下载到本地的磁盘,
但不会自动给系统打上。root
会收到一封电子邮件告知需手动安装补丁。
如果出现了错误,可以使用下面的
freebsd-update
命令回退到上一次的修改:
&prompt.root; freebsd-update rollback
完成以后如果内核或任何的内核模块被修改的话,
就需要重新启动系统。这将使 &os;
装载新的二进制程序进内存。
freebsd-update 工具只能自动更新 GENERIC 内核。
如果您使用自行联编的内核, 则在 freebsd-update
安装完更新的其余部分之后需要手工重新联编和安装内核。 不过,
freebsd-update 会检测并更新位于 /boot/GENERIC (如果存在) 中的
GENERIC 内核, 即使它不是当前 (正在运行的)
系统的内核。
保存一份 GENERIC 内核的副本到 /boot/GENERIC 是一个明智的主意。
在诊断许多问题, 以及在
中介绍的使用
freebsd-update 更新系统时会很有用。
除非修改位于
/etc/freebsd-update.conf 中的配置,
freebsd-update 会随其他安装一起对内核的源代码进行更新。
重新联编并安装定制的内核可以以通常的方式来进行。
通过 freebsd-update 发布的更新有时并不会涉及内核。
如果在执行
freebsd-update install 的过程中内核代码没有进行变动,
就没有必要重新联编内核了。 不过, 由于
freebsd-update 每次都会更新
/usr/src/sys/conf/newvers.sh 文件,
而修订版本 (uname -r 报告的
-p 数字) 来自这个文件, 因此,
即使内核没有发生变化, 重新联编内核也可以让 &man.uname.1; 报告准确的修订版本。
在维护许多系统时这样做会比较有帮助,
因为这一信息可以迅速反映机器上安装的软件更新情况。
重大和次要的更新
这个过程会删除旧的目标文件和库,
这将使大部分的第三方应用程序无法删除。
建议将所有安装的 ports 先删除然后重新安装,或者稍后使用
ports-mgmt/portupgrade
工具升级。 大多数用户将会使用如下命令尝试编译:
&prompt.root; portupgrade -af
这将确保所有的东西都会被正确的重新安装。
请注意环境变量 BATCH 设置成
yes 的话将在整个过程中对所有询问回答
yes,这会帮助在编译过程中免去人工的介入。
如果正在使用的是定制的内核, 则升级操作会复杂一些。
您会需要将一份 GENERIC 内核的副本放到 /boot/GENERIC。 如果系统中没有
GENERIC 内核, 可以用以下两种方法之一来安装:
如果只联编过一次内核, 则位于
/boot/kernel.old 中的内核,
就是 GENERIC 的那一个。 只需将这个目录改名为
/boot/GENERIC 即可。
假如能够直接接触机器, 则可以通过 CD-ROM 介质来安装 GENERIC
内核。 将安装盘插入光驱, 并执行下列命令:
&prompt.root; mount /cdrom
&prompt.root; cd /cdrom/X.Y-RELEASE/kernels
&prompt.root; ./install.sh GENERIC
您需要将 X.Y-RELEASE
替换为您正在使用的版本。
GENERIC 内核默认情况下会安装到 /boot/GENERIC。
如果前面的方法都不可用, 还可以使用源代码来重新联编和安装 GENERIC
内核:
&prompt.root; cd /usr/src
&prompt.root; env DESTDIR=/boot/GENERIC make kernel
&prompt.root; mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
&prompt.root; rm -rf /boot/GENERIC/boot
如果希望 freebsd-update 能够正确地将内核识别为
GENERIC, 您必须确保没有对
GENERIC 配置文件进行过任何变动。
此外, 建议您取消任何其他特殊的编译选项 (例如使用空的
/etc/make.conf)。
上述步骤并不需要使用这个 GENERIC 内核来引导系统。
重大和次要的更新可以由
freebsd-update 命令后指定一个发行版本来执行,
举例来说,下面的命令将帮助你升级到 &os; 6.4:
&prompt.root; freebsd-update -r 6.4-RELEASE upgrade
在这个命令被执行后,freebsd-update
将会先解析配置文件和评估当前的系统以获得更新系统所需的必要信息。
然后便会显示出一个包含了已检测到与未检测到的组件列表。
例如:
Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 6.3-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/base world/info world/lib32 world/manpages
The following components of FreeBSD do not seem to be installed:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs
Does this look reasonable (y/n)? y
此时,freebsd-update
将会尝试下载所有升级所需的文件。在某些情况下,
用户可能被问及需安装些什么和如何进行之类的问题。
当使用定制内核时, 前面的步骤会产生类似下面的警告:
WARNING: This system is running a "MYKERNEL" kernel, which is not a
kernel configuration distributed as part of FreeBSD 6.3-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running "/usr/sbin/freebsd-update install"
此时您可以暂时安全地无视这个警告。 更新的
GENERIC 内核将在升级过程的中间步骤中使用。
在下载完针对本地系统的补丁之后, 这些补丁会被应用到系统上。
这个过程需要消耗的时间取决于机器的速度和其负载。
这个过程中将会对配置文件所做的变动进行合并 — 这一部分需要用户的参与,
文件可能会自动合并, 屏幕上也可能会给出一个编辑器, 用于手工完成合并操作。
在处理过程中, 合并成功的结果会显示给用户。 失败或被忽略的合并,
则会导致这一过程的终止。 用户可能会希望备份一份
/etc 并在这之后手工合并重要的文件,
例如 master.passwd
和 group。
系统至此还没有被修改,所有的补丁和合并都在另外一个目录中进行。
当所有的补丁都被成功的打上了以后,所有的配置文件都被合并后,
我们就已经完成了整个升级过程中最困难的部分,
下面就需要用户来安装这些变更了。
一旦这个步骤完成后,使用如下的命令将升级后的文件安装到磁盘上。
&prompt.root; freebsd-update install
内核和内核模块会首先被打上补丁。 此时必须重新启动计算机。
如果您使用的是定制的内核, 请使用 &man.nextboot.8;
命令来将下一次用于引导系统的内核 /boot/GENERIC (它会被更新):
&prompt.root; nextboot -k GENERIC
在使用 GENERIC 内核启动之前,
请确信它包含了用于引导系统所需的全部驱动程序 (如果您是在远程进行升级操作,
还应确信网卡驱动也是存在的)。 特别要注意的情形是,
如果之前的内核中静态联编了通常以内核模块形式存在的驱动程序, 一定要通过
/boot/loader.conf 机制来将这些模块加载到
GENERIC 内核的基础上。 此外,
您可能也希望临时取消不重要的服务、
磁盘和网络挂载等等, 直到升级过程完成为止。
现在可以用更新后的内核引导系统了:
&prompt.root; shutdown -r now
在系统重新上线后,需要再次运行 freebsd-update。
升级的状态被保存着,这样 freebsd-update
就无需重头开始,但是会删除所有旧的共享库和目标文件。
执行如下命令继续这个阶段的升级:
&prompt.root; freebsd-update install
取决与是否有库的版本更新,通常只有 2 个而不是
3 个安装阶段。
现在需要重新编译和安装第三方软件。
这么做的原因是某些已安装的软件可能依赖于在升级过程中已删除的库。
可使用 ports-mgmt/portupgrade
自动化这个步骤,以如下的命令开始:
&prompt.root; portupgrade -f ruby
&prompt.root; rm /var/db/pkg/pkgdb.db
&prompt.root; portupgrade -f ruby18-bdb
&prompt.root; rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db
&prompt.root; portupgrade -af
一旦这个完成了以后,再最后一次运行
freebsd-update 来结束升级过程。
执行如下命令处理升级中的所有细节:
&prompt.root; freebsd-update install
如果您临时用过 GENERIC 内核来引导系统,
现在是按照通常的方法重新联编并安装新的定制内核的时候了。
重新启动机器进入新版本的 &os; 升级过程至此就完成了。
系统状态对照
freebsd-update
工具也可被用来对着一个已知完好的 &os; 拷贝测试当前的版本。
这个选项评估当前的系统工具,库和配置文件。
使用以下的命令开始对照:
&prompt.root; freebsd-update IDS >> outfile.ids
这个命令的名称是 IDS,
它并不是一个像
security/snort
这样的入侵检测系统的替代品。因为
freebsd-update 在磁盘上存储数据,
很显然它们有被篡改的可能。
当然也可以使用一些方法来降低被篡改的可能性,比如设置
kern.securelevel 和不使用时把
freebsd-update
数据放在只读文件系统上,例如 DVD 或
安全存放的外置 USB 磁盘上。
现在系统将会被检查,生成一份包含了文件和它们的 &man.sha256.1;
哈希值的清单,已知发行版中的值与当前系统中安装的值将会被打印到屏幕上。
这就是为什么输出被送到了 outfile.ids 文件。
它滚动的太块无法用肉眼对照,而且会很快填满控制台的缓冲区。
这个文件中有非常长的行,但输出的格式很容易分析。
举例来说,要获得一份与发行版中不同哈希值的文件列表,
已可使用如下的命令:
&prompt.root; cat outfile.ids | awk '{ print $1 }' | more
/etc/master.passwd
/etc/motd
/etc/passwd
/etc/pf.conf
这份输出时删节缩短后的,其实是有更多的文件。
其中有些文件并非人为修改,比如
/etc/passwd
被修改是因为添加了用户进系统。在某些情况下,
还有另外的一些文件,诸如内核模块与
freebsd-update 的不同是因为它们被更新过了。
为了指定的文件或目录排除在外,把它们加到
/etc/freebsd-update.conf 的
IDSIgnorePaths 选项中。
除了前面讨论过的部分之外,
这也能被当作是对升级方法的详细补充。
Tom
Rhodes
Written by
Colin
Percival
Based on notes provided by
Portsnap: 一个 Ports Collection 更新工具
Updating and Upgrading
Portsnap
Updating and Upgrading
&os; 基本系统也包括了一个更新 Ports Collection 的工具:
&man.portsnap.8;。在运行之后,它会连上一个远程网站,
校验安全密钥,然后下载一份 Ports Collection 的拷贝。
密钥是用来校验所有下载文件的完整性,确保它们在传输是未被修改。
使用以下的命令下载最新的 Ports Collection:
&prompt.root; portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 3 mirrors found.
Fetching snapshot tag from portsnap1.FreeBSD.org... done.
Fetching snapshot metadata... done.
Updating from Wed Aug 6 18:00:22 EDT 2008 to Sat Aug 30 20:24:11 EDT 2008.
Fetching 3 metadata patches.. done.
Applying metadata patches... done.
Fetching 3 metadata files... done.
Fetching 90 patches.....10....20....30....40....50....60....70....80....90. done.
Applying patches... done.
Fetching 133 new ports or files... done.
这个例子展示的是 &man.portsnap.8;
发现并校验了几个用于当前 ports 的补丁。这还表明以前运行过,
如果是第一次运行的话,那么仅仅只会下载 Ports Collection。
在 &man.portsnap.8; 成功地完成一次
fetch 操作之后,
会将校验过的 Ports 套件和后续的补丁保存在本地。
首次执行 portsnap 之后,
需要用 extract 来安装这份快照中的文件:
&prompt.root; portsnap extract
/usr/ports/.cvsignore
/usr/ports/CHANGES
/usr/ports/COPYRIGHT
/usr/ports/GIDs
/usr/ports/KNOBS
/usr/ports/LEGAL
/usr/ports/MOVED
/usr/ports/Makefile
/usr/ports/Mk/bsd.apache.mk
/usr/ports/Mk/bsd.autotools.mk
/usr/ports/Mk/bsd.cmake.mk
...
以后运行 portsnap fetch 之后, 则只需使用
update 安装更新即可:
&prompt.root; portsnap update
至此更新就完成了,然后便可以使用更新后的
Ports Collection 来安装或升级应用程序。
fetch 和 extract 或
update 可以作为连续的动作执行,
如下例所示:
&prompt.root; portsnap fetch update
更新系统附带的文档
更新和升级
文档
更新和升级
除了基本系统和 Ports 套件之外, 文档也是 &os; 操作系统的一个组成部分。
尽管您总是可以通过 &os; 网站 来访问最新的 &os;
文档, 一些用户的网络连接可能很慢, 甚至完全没有网络连接。
幸运的是, 有很多方法可以用来更新随发行版本附带的 &os; 文档的本地副本。
使用 CVSup 来更新文档
&os; 文档的源代码和安装版本都可以通过 CVSup
来以与基本系统 (参考 ) 类似的方法来升级。
这一节中将会介绍:
如何安装联编文档所需的工具集, 用于从源代码来联编 &os;
文档所需的那些工具。
如何使用 CVSup
将文档下载到 /usr/doc。
如何从源代码联编 &os; 文档,
并将其安装到 /usr/share/doc。
联编文档的过程中支持的一些编译选项,
例如只联编某些语言的版本, 或只联编特定的输出格式。
安装 CVSup 和文档工具集
从源代码联编 &os; 文档需要大量的工具。
这些工具并不是 &os; 基本系统的一部分,
因为这些工具需要占用大量的磁盘空间,
而且并不是对所有 &os; 用户都有用;
只有活跃地撰写 &os; 新文档,
或经常从源代码更新文档的用户才需要这些工具。
全部所需的工具, 均可通过 Ports
套件来安装。 textproc/docproj port 是由
&os; 文档计划开发的方便安装和更新这些工具的主
port。
如果不需要 &postscript; 或 PDF 文档的话,
也可以考虑安装 textproc/docproj-nojadetex port。
这套文档工具集包含除了 teTeX
typesetting 引擎之外的其他全部工具。 teTeX
是一个很大的工具集, 因此如果不需要 PDF 输出的话,
排除它会节省很多时间和磁盘空间。
如欲了解关于安装和使用
CVSup 的进一步信息, 请参阅 使用 CVSup。
更新文档源代码
CVSup 工具能够下载文档源代码的原始副本,
您可使用 /usr/share/examples/cvsup/doc-supfile
文件作为配置模板来修改。 在 doc-supfile
中的默认主机名是一个无效的占位主机名,
但 &man.cvsup.1; 能够通过命令行来指定主机名,
因此文档源代码可以使用下面的命令从
CVSup 服务器获得:
&prompt.root; cvsup -h cvsup.FreeBSD.org -g -L 2 /usr/share/examples/cvsup/doc-supfile
您应将 cvsup.FreeBSD.org
改为最近的 CVSup 服务器。 参见 关于镜像站点的完整列表。
初始的文档源代码下载需要一些时间,
您需要耐心等待它完成。
后续的更新可以用同样的命令来进行。
由于 CVSup 工具只下载上次运行之后所发生过的更新,
因此在首次运行之后再运行 CVSup 应该是很快的。
在签出源代码之后, 还可以使用另一种由 /usr/doc 目录中的
Makefile 支持的方法来更新它。 通过在
/etc/make.conf 中配置
SUP_UPDATE、 SUPHOST 和
DOCSUPFILE, 可以通过运行:
&prompt.root; cd /usr/doc
&prompt.root; make update
来完成更新。 典型的 /etc/make.conf
中的 &man.make.1; 选项是:
SUP_UPDATE= yes
SUPHOST?= cvsup.freebsd.org
DOCSUPFILE?= /usr/share/examples/cvsup/doc-supfile
将 SUPHOST
和 DOCSUPFILE 的值使用 ?=
来指定的好处是使 make 命令行能够覆盖这些选项。
在向 make.conf 中增加选项时推荐这样做,
以避免在测试时反复修改这个文件。
文档源代码中可调的选项
&os; 文档的更新和联编系统支持一些方便只更新一部分文档,
或只联编特定格式及译文的选项。
这些选项可以在 /etc/make.conf 文件中配置,
也可以通过 &man.make.1; 工具来指定。
这些选项包括:
DOC_LANG
准备联编和安装的语言列表。
例如, 指定为 en_US.ISO8859-1 表示只联编英文版的文档。
FORMATS
准备输出的格式列表。 目前,
系统支持 html、
html-split、 txt、
ps、 pdf、
和 rtf。
SUPHOST
用于用来更新的 CVSup
服务器的主机名。
DOCDIR
用于安装文档的目录。 默认为
/usr/share/doc。
如欲了解 &os; 中其他可供配置的全局 make 变量, 请参阅 &man.make.conf.5;。
关于 &os; 文档联编系统的其他详情, 请参阅 &os;
文档计划入门之新手必读部分。
从源代码安装 &os; 文档
在 /usr/doc
中下载了最新的文档源代码快照之后,
就可以开始动手联编文档了。
要更新全部 DOC_LANG 中定义的语言的文档,
需要执行下面的命令:
&prompt.root; cd /usr/doc
&prompt.root; make install clean
如果在 make.conf 中配置了正确的
DOCSUPFILE、 SUPHOST
和 SUP_UPDATE 选项,
则可以将更新源代码和安装一步完成:
&prompt.root; cd /usr/doc
&prompt.root; make update install clean
如果只需要更新某个特定语言的文档, 可以在
/usr/doc 中与之对应的目录中运行
&man.make.1;:
&prompt.root; cd /usr/doc/en_US.ISO8859-1
&prompt.root; make update install clean
此外, 还可以透过 make 变量 FORMATS 来控制输出格式,
例如:
&prompt.root; cd /usr/doc
&prompt.root; make FORMATS='html html-split' install clean
Marc
Fonvieille
原作:
使用文档 Ports
Updating and Upgrading
documentation package
Updating and Upgrading
在之前的章节中, 我们已展示了从源代码更新 &os; 文档的方法。
基于源代码的更新的方法可能并不是对于所有的 &os; 系统都可行有效。
编译文档源代码需要一大堆的工具, 文档工具链,
对于 CVS 的一定了解和从仓库中检出源代码,
还有一些编译已检出代码的手工步骤。 这一章节我们将介绍一种使用 Ports
来更新已安装的 &os; 文档:
下载并安装预编译好的文档快照, 而不用在本地编译任何部份
(这样便不再需要安装整个文档工具链了)。
下载文档的源代码并使用 ports 框架编译
(使得检出和编译的步骤更容易些)。
这两种更新 &os; 文档的方法都由一组 &a.doceng; 每月更新的
文档 ports 提供支持。 这些都列在了 &os;
Ports docs
虚拟分类下面。
编译和安装文档 Ports
文档 ports 使用 ports 的构建框架使得文档的编译变得更加容易。
自动化了检出文档源代码, 配以适合的环境设置和命令行参数运行
&man.make.1;, 它们使得安装或卸载文档变得就像安装 &os; 其他
port 或二进制包那样容易。
另一个特性便是当在本地编译文档 ports 时,
文档工具链 ports 会被列入依赖关系,
并自动安装。
文档 ports 按以下的方式组织:
一个 主 port
, 在
misc/freebsd-doc-en
下可以找到这个文档 port。 它是所有文档 ports 的基础。
在默认的情况下, 它只安装英文版文档。
一个 合集 port
,
misc/freebsd-doc-all,
它将构建并安装所有语言版本的所有文档。
最后是各种翻译的 从属 port
, 比如:
misc/freebsd-doc-hu
是匈牙利文版的文档。 所有这些都基于主 port
并会安装上对应语言的翻译文档。
以 root
用户身份运行如下的命令安装文档:
&prompt.root; cd /usr/ports/misc/freebsd-doc-en
&prompt.root; make install clean
这将会安装分章节的英文版本 HTML 格式文档
(与 上的相同) 到
/usr/local/share/doc/freebsd
目录。
常见的调节选项
文档 ports 有许多用来修改默认行为的选项。
以下是一段简要列表:
WITH_HTML
允许构建 HTML 格式: 每份文档为一个单一的 HTML 文件。
此种文档的文件名视情况而定通常是
article.html,
或 book.html,
另外附加一些图片。
WITH_PDF
允许构建 &adobe; Portable Document Format,
可使用 &adobe; &acrobat.reader;,
Ghostscript 或者其他的
PDF 阅读器查阅。 此种文档的文件名视情况而定通常是
article.pdf 或
book.pdf。
DOCBASE
文档将被安装到的目录。默认值 /usr/local/share/doc/freebsd。
请注意默认的目录与 CVSup
方法种所使用的目录不同。 这是因为我们正在安装的是一个 port,
而 ports 通常会被安装到
/usr/local 目录。
这可以指定 PREFIX 变量覆盖默认值。
这是一份简短的关于如何使用以上提到变量来安装
PDF 格式的匈牙利文档:
&prompt.root; cd /usr/ports/misc/freebsd-doc-hu
&prompt.root; make -DWITH_PDF DOCBASE=share/doc/freebsd/hu install clean
使用文档 Packages
正如上文所述, 从 ports
构建文档需要在本地安装一份文档工具链和一些编译所需的磁盘空间。
当不够资源安装文档工具链, 或者从源代码编译需要太多的磁盘空间时,
我们仍然可以安装预编译好的文档快照的 ports。
&a.doceng; 每个月都会制作 &os; 文档快照的包。
这些二进制包可以通过包工具来操作, 比如 &man.pkg.add.1;,
&man.pkg.delete.1;, 等等。
当使用二进制包时, 将安装所指定语言相关的 &os; 文档的
所有 可用格式。
举例来说, 以下的命令将安装最新预编译的匈牙利语文档:
&prompt.root; pkg_add -r hu-freebsd-doc
二进制包使用了以下与对应 ports 名称不同的命名格式:
lang-freebsd-doc。
这里的 lang 是语言代码的简短形式,
比如 hu 表示匈牙利语, 或者
zh_cn 表示简体中文。
更新文档 Ports
任何用于更新 ports 的工具都可以被用来更新已安装的文档 port。
举例来说, 下面的命令通过 ports-mgmt/portupgrade
工具来更新已安装的匈牙利语文档二进制包。
&prompt.root; portupgrade -PP hu-freebsd-doc
Pav
Lucistnik
原作:
Using Docsnap
Updating and Upgrading
Docsnap
Updating and Upgrading
Docsnap 是一个通过 &man.rsync.1;
仓库更新已安装的 &os; 文档简单快速的方法。
一台 Docsnap 服务器
跟踪文档原代码, 并每个小时编译自动成 HTML 格式。 使用
Docsnap 并不需要
textproc/docproj,
有的只是对已编译文档生成的补丁。
使用这项技术唯一需要的就是
net/rsync port
或者对应的二进制包。 可使用如下的命令安装:
&prompt.root; pkg_add -r rsync
Docsnap 原本是被用来更新安装到
/usr/share/doc
的文档, 但是以下的例子同样适用于其他的目录。 对于用户的目录,
这样就不需要 root 权限了。
更新文档, 运行如下的命令:
&prompt.root; rsync -rltvz docsnap.sk.FreeBSD.org::docsnap /usr/share/doc
目前还只有上面所显示的 docsnap.sk.FreeBSD.org
这一台 Docsnap 服务器。
此处不要使用 标志,
因为还有些 make installworld 时安装到
/usr/share/doc
下的文件可能会被意外的移除。 请使用如下的命令清除无用的文件:
&prompt.root; rsync -rltvz --delete docsnap.sk.FreeBSD.org::docsnap/??_??\.\* /usr/share/doc
如果只需升级文档的某一子集, 比如,
可以使用如下的命令升级文档的英文部分:
&prompt.root; rsync -rltvz docsnap.sk.FreeBSD.org::docsnap/en_US.ISO8859-1 /usr/share/doc
]]>
追踪开发分支
-CURRENT
-STABLE
FreeBSD 有两个开发分支: &os.current; 和 &os.stable;。
这一章节将对每个分支作相应介绍与如何保持你的系统更新。
我们将先介绍 &os.current; 然后是 &os.stable;。
使用最新的 &os; CURRENT
这里再次强调, &os.current; 是 &os;
开发的 最前沿
。 &os.current;
用户要有较高的技术能力, 并且应该有能力自已解决困难的系统问题。
如果您是个 &os; 新手, 那么在安装之前最好三思。
&os.current; 是什么?
快照
&os.current; 是 &os; 的发展前沿。
包括了在下一个官方发行的软件中可能存在,
也可能不存在的发展、 试验性改动、 以及过渡性的机制。 尽管许多
&os; 开发者每天都会编译 &os.current; 源代码,
但有时这些代码仍然会是不能编译的。 虽然这些问题会很快解决,
但 &os.current; 是带来破坏还是您正希望的功能性改善,
很可能完全取决于您获取源代码的的时机!
谁需要 &os.current;?
&os.current; 适合下边三种主要兴趣团体:
&os; 社区的成员:
积极工作在源码树的某部分的人和为保持 最新
为绝对需求的人。
&os; 社区的成员: 为促使 &os.current;
保持尽可能的健全而愿花时间去解决问题的积极的测试者;
以及那些愿意提出关于 &os;
变化和总体方向的建设性建议并且提供补丁实现它们的人们。
那些只是想关注或为了参考目的使用当前 (current) 源码的人们
(如,为了阅读,而不是执行)。
这些人也偶尔做做注释或贡献代码。
&os.current; 不是什么?
追求最新功能, 您听说里面有一些很酷的新功能,
并希望成为您周围的人中第一个尝试它们的人。
尽管您能够因此首先了解到最新的功能,
但这也意味着在出现新的 bug 时您也首当其冲。
修复错漏的快捷方式。任何 &os.current
的既定版本在修复已知错漏的同时又可能会产生新的错漏。
无所不在的官方支持
。
我们尽最大努力在3个合法的
&os.current; 组之一真诚给人们提供帮助,但是我们
没有时间提供技术支持。
这并不是因为我们是那种不喜欢帮助人解困的无耻之徒
(如果我们是的话,就不会制作 &os; 了)。
我们不能每天简单地回复上百的消息,而且
我们继续发展 FreeBSD! 在改善 &os;
和回复大量关于实验代码的问题之间如果要做个选择的话,
开发人员会选择前者。
使用 &os.current;
当前版
使用
加入 &a.current.name; 和 &a.svn-src-head.name; 列表。
这个不仅仅是个好主意,而且很 重要。如果您不去
&a.current.name;,
您就不会看到人们所做的关于系统当前状态的说明,
这样您就有可能在别人已经发现并解决了的一大堆问题面前难倒。
更重要的是您会错过一些重要的公告---对于您的系统安全可能是至关重要的。
&a.svn-src-head.name; 列表允许您看到每个变化的提交记录,
因为这些记录与其它相关信息是同步的。
要加入这些列表,或其它可能的列表,请访问
&a.mailman.lists.link; ,并且点击您想订阅的列项。
关于其它步骤的说明那里有提供。
如果你有兴趣追踪整个原代码树的变更记录,
我们建议你订阅 &a.svn-src-all.name;
邮件列表。
从&os; 镜像站点 获取源码。 您有两种方式选择:
cvsup
cron
当前
使用 CVSup 同步
与称作 standard-supfile 的
supfile 一起使用 cvsup,这个可以从
/usr/share/examples/cvsup得到。
这是最被推荐的方式,因为它允许您一次获取整个集合,
以后就只取更改过的部分。许多人从 cron
运行 cvsup,以保持他们的源码自动更新。
您须要定制上边的 supfile 样本,并且配置 cvsup 以适应您的环境。
standard-supfile
例子是为追踪指定的 &os; 安全分支而指定的,
而不是 &os.current;。
你需要编辑这个文件并把如下这行:
*default release=cvs tag=RELENG_X_Y
替换为:
*default release=cvs tag=.
可以参阅手册中的
CVS Tags
章节获得更多可用 tag 的详细说明。
当前的
使用 CTM 同步
使用工具 CTM。
如果您的连接性能不太好(高价连接或只能通过电子邮件存取),
CTM 是个选择。
但这也颇有争议并且常常得到到坏文件。因此很少使用它,
这也注定了不能长期用它来工作。对于使用 9600 bps
或更快连接的人,我们推荐使用 CVSup。
如果您获取源码是用于运行,而不只是看看,那么就获取
整个 &os.current;,不要选部分。
这样做的原因是源码的大部分都依赖于其他部分,
要是您试着只编译其中一部分的话,保证您会陷入麻烦。
当前版
编译
在编译 &os.current; 之前,请仔细阅读
/usr/src 里的
Makefile 文件。
尽管是部分的升级过程,您至少也要首先安装新的内核和重建系统。阅读
&a.current; 邮件列表和 /usr/src/UPDATING,
会让您在其它循序渐进的过程中保持最新,
这对于我们向下一个发行版转移是很有必要的。
热心一点!如果您正运行 &os.current;,
我们很想知道您关于它的一些想法,
尤其是关于错漏修复或增进的建议。
非常欢迎带有代码的建议!
使用最新的 &os; STABLE
&os.stable; 是什么?
稳定版
&os.stable; 是我们的发展分支,我们的主要发行版就由此而来。
这个分支会以不同速度变化,并且假定这些是第一次进入
&os.current; 进行测试。然而,这 仍然
是个发展中的分支,这意味着在一定的时候,&os.stable;
源码可能或不可能满足一些特殊的要求。
它只不过是另一个工程发展途径,并不是终端用户的资源。
谁需要 &os.stable;?
如果您有兴趣追随 FreeBSD 的开发过程或为其做点贡献,
尤其是和下一个
非计划
的 FreeBSD 发行版有关时,
您应该考虑采用 &os.stable;。
尽管安全更新也会进入
&os.stable; 分支,但您并不 必须 使用
&os.stable; 来达到这样的目的。 每一个
FreeBSD 的安全公告都会解释如何修复受到影响的发行版中的问题
这也不总是正确。我们不可能永远支持
FreeBSD 的旧发行版, 尽管我们会在发布之后支持他们数年之久。
关于 FreeBSD 目前对于旧发行版的支持政策的完整描述, 请参见
http://www.FreeBSD.org/security/。
,而因为安全原因而去采用一个开发分支显然可能会同时引入一些不希望的修改。
尽管我们尽力确保 &os.stable; 分支在任何时候都能够正确编译和运行,
但没有人能够担保它在任何时候都总可以。
此外, 尽管代码在进入 &os.stable; 之前都是在 &os.current; 上完成开发,
但使用 &os.stable; 的人要比使用 &os.current; 的更多。
有证据显示, 犄角旮旯里的各种问题有些时候仍然会由于在 &os.current; 不那么明显
而在 &os.stable; 暴露出来。
基于这些原因, 不 推荐您盲目地追随
&os.stable;, 并且, 在粗略地测试过代码之前不要更新任何生产服务器到
&os.stable; 也非常重要。
如果您没有用于完成这些工作的资源, 我们推荐您使用最新的 FreeBSD
发行版, 并使用发行版提供的二进制更新机制来在发行版之间完成迁移。
使用&os.stable;
稳定版
使用
加入 &a.stable.name; 列表。让您随时了解可能出现在
&os.stable; 里的build 依赖性
或其它需要特别注意的问题。
当开发员正在考虑某些有争议的修复或更新时,
他们就会在这个邮件列表里发表声明,给用户机会回应,
看他们对于提出的变化是否还有什么问题。
加入相关的 SVN
列表来追踪你所关心的分支。比如,如果你在追踪 7-STABLE
分支,加入 &a.svn-src-stable-7.name; 列表。
这样每次这个分支上有改动的时候就能让你看到提交记录,
还包括了修改可能引起的副作用之类的相关信息。
要加入这些列表或其他可用的,访问 &a.mailman.lists.link;
并点击您希望订阅的列表。关于其它步骤的说明可以在那里看到。
如果你有兴趣追踪整个原代码树的变更记录,
我们建议你订阅 &a.svn-src-all.name;
邮件列表。
如果您正安装一个新系统, 并希望它运行每月从 &os.stable; 编译的快照,
请察看
Snapshots 网页以了解更多信息。
另外, 也可以从
镜像站点 安装最新的 &os.stable; 发行版,
并按照其中的说明将系统更新到最新的 &os.stable; 源代码。
如果您已经在运行较早的 &os; 版本, 并希望通过源代码方式升级,
则可以通过 &os; 镜像站点 来完成。
这可以通过两种方式来进行:
cvsup
cron
稳定版
使用CVSup同步
与称作 stable-supfile 的
supfile 一起使用 cvsup,这个可以从
/usr/share/examples/cvsup 得到。
这是最被推荐的方式,因为它允许您一次获取整个集合,
以后就只取更改过的部分。许多人从 cron
运行 cvsup,以保持他们的源码自动更新。
您须要定制上边的 supfile 样本,并且配置 cvsup 以适应您的环境。
当前的
使用 CTM 同步
使用工具 CTM。
如果您的连接性能不太好(高价连接或只能通过电子邮件存取),
CTM 是个选择。
但这也颇有争议并且常常得到到坏文件。因此很少使用它,
这也注定了不能长期用它来工作。对于使用 9600 bps
或更快连接的人,我们推荐使用 CVSup。
本质上说,如果您需要快速存取源码并且不计较通信宽带的话,可以使用
cvsup 或 ftp。否则,就使用
CTM。
稳定版
编译
在编译 &os.stable; 之前,请仔细阅读
/usr/src 里的 Makefile。
您至少应该安装一个新的内核并重建系统,
首先做为升级过程的一部分。阅读 &a.stable; 邮件列表和
/usr/src/UPDATING,
可能让您在其它循序渐进的过程中保持更新,
这在我们向下一发行版转移时是很有必要的。
同步您的源码
有许多方式通过互联网(或电子邮件)与 &os;
项目源码特定领域或所有领域保持更新,主要依赖于您的兴趣。
我们提供的主要服务是匿名 CVS、
CVSup,和 CTM。
虽然只更新源码树中的部分是可能的,
唯一被支持的更新过程是更新整个树、并且重编译用户区
(如:在用户空间运行的所有程序,像 /bin
和 /sbin下边的)和内核源码。
只更新源码树中的部分,或只有内核,或只有用户区
(userland) 通常会出现错误。这些问题包括有编译错误、内核崩溃
(kernel panics)、数据出错。
CVS
匿名
匿名 CVS 和
CVSup 使用 下拉(pull)
模式来更新源代码。 在
CVSup 中, 用户 (或者
cron 脚本)
会调用 cvsup 程序, 后者会同某一个
cvsupd 服务进行交互, 以更新您的文件。
您接到的更新是更新时刻最新的, 并且您只会收到那些需要的更新。
您可以很容易地限制更新的范围, 只更新那些您需要的文件。
服务器端会根据您手头已经有的文件即时地生成更新内容。
匿名 CVS
相对于 CVSup 而言要简单一些, 因为它只是对
CVS 的一种扩展,
让您可以从远程的 CVS 代码库得到更新。
CVSup 相对而言,
要比 匿名 CVS 更有效率,
然而后者却更容易使用。
CTM
另一种方法是 CTM。
这种方法并不能将您手头的代码与中央代码库中的版本进行比较,
也不能下载它们。 在主 CTM 服务器上运行的脚本会每天执行多次,
每次运行都能够自动地识别所有文件自上次运行以来所发生的变化,
如果发现有文件发生了变动, 就会压缩、 标上一个序列号,
并进行便于使用电子邮件进行传送的编码操作 (其中只包括可打印的
ASCII 字符)。 一旦接收到,
这些CTM deltas
就会被传送给 &man.ctm.rmail.1;
工具---可以自动进行解码、校验和应用这些变化到用户的复制的源码里。
这个过程比 CVSup 更为有效,
而且更少占用我们的服务器资源,因为它不仅仅采用
下拉(pull) 模式,还采用
上推(push) 模式。
当然, 这样做也会带来一些不便。
如果您不经意删除了您的压缩包的部分内容,
CVSup 会检测到并为您重建破坏的部分。
CTM 是不会这样做的,
如果您删除了您的源码树中的某部分(并已不能恢复),
那么您就必须从破坏处 (从最新的CVS base delta
)
开始,使用 CTM 或
匿名 CVS
进行重建,仅仅删除坏的数据并再同步。
重新编译 world
重新编译 world
只要您根据一定版本的 &os; (&os.stable;、&os.current; 等等),
已经同步了您本地的源码树,那么您就可以使用这些源码树来重建系统。
做好备份
无需强调在行动 之前 备份整个系统是多么的重要。
尽管重新编译系统是 (如果您按照文档的指示做的话) 一件很容易完成的工作,
但出错也是在所难免的, 另外, 别人在源码里面引入的错误也可能造成系统无法引导。
请确信自己已经做过备份, 并且在手边有恢复软盘或可以引导的光盘。
您可能永远也不会用到它, 但安全第一嘛!
订阅恰当的邮件列表
邮件列表
&os.stable; 和 &os.current; 分支自然是
发展中的。为 &os;
做贡献的都是人,偶尔也会犯错误。
有时这些错误没什么危害,只是引起您的系统生成新的诊断警告。
有时是灾难性的,并导致您的系统不能启动或破坏您的文件系统
(甚至更糟)。
如果出现了类似的问题,
贴一封小心(heads up)
帖到相关的邮件列表里,
讲清问题的本质以及受影响的系统。在问题解决后,再贴封解除(all
clear)
声明。
如果使用 &os.stable; 或 &os.current;
而又不阅读 &a.stable; 和 &a.current; 各自的邮件列表,
那么您是自找麻烦。
不要使用 make world
许多较早的文档推荐使用
make world 来完成这项工作。 这样做会跳过一些必要的步骤,
因此只有在您知道自己在做什么的时候才可以这样做。 几乎所有的情况下
make world 都是不应该做的事情, 您应该使用这里描述的方法。
更新系统的规范方法
在更新系统时, 一定要首先查看
/usr/src/UPDATING 文件, 以便了解在 buildworld
之前需要进行的操作, 然后按照下面列出的步骤进行操作:
这些更新步骤假定您使用的是包含旧编译器、 内核以及用户态工具及配置的旧版
&os;。 我们使用 world
来表示系统中的核心执行文件、
函数库和程序文件。 编译器是 world
的一部分,
但有其特殊性。
此外, 我们还假定您已经获得了较新版本操作系统的源代码。
如果您正更新的系统中的源代码也是旧版系统所附带的,
您还需要参阅 来把代码同步到较新的版本。
从源代码更新系统, 有时会比初看上去的时候更麻烦一些,
另一方面, &os; 的开发人员有时会不得不修改推荐的更新步骤,
特别是当出现了一些无法避免的依赖关系的时候。 这一节余下的部分,
将介绍目前推荐的更新步骤背后的原理。
成功的更新操作必须解决下面的这些问题:
旧的编译器可能无法编译新的内核。 (另一方面,
旧的编译器很可能有 bug。) 因此, 新的内核应该以新的编译器编译。
更具体地说, 新的编译器应在新内核开始联编之前已经完成了联编步骤。
请注意, 新的编译器并不一定需要在联编新内核之前
安装 到系统中。
新的 world 有可能依赖一些新的内核特性。
因此, 新内核必须在新的 world 之前安装。
这两个问题就是为什么我们将在后面的章节中介绍的,
需要按照 buildworld、
buildkernel、
installkernel、
installworld 的顺序来更新系统的原因。
这并不是您需要遵守推荐的更新操作的全部原因,
除了这两个最重要的理由之外, 还有一些并不那么显而易见的原因:
旧的 world 可能无法配合新的内核正常工作,
因此, 您在安装完新内核之后, 应尽快将 world 也随之更新。
有些配置文件的变动必须在安装新的 world 之前完成,
而另一些配置文件的变动则有可能导致旧 world 工作不正常。
因此, 通常而言会需要两次不同的配置文件更新步骤。
多数情况下, 更新步骤只会替换或增加文件;
换言之, 现有的旧文件并不会被删除。 有时,
这可能会导致一些其他问题。 因此, 有时安装操作会指明,
必须在某些操作之前手工删除一些文件。 这些在未来可能会被自动化,
也可能不会自动化。
由于有这些考虑, 因此一般情况下我们建议使用下列更新步骤。
请注意, 具体的更新操作中可能会需要一些附加的步骤,
但核心的过程应该是不会轻易发生变化的:
make buildworld
这步操作会联编新的编译器, 以及少量相关工具,
并在随后使用新的编译器来联编
world。 联编的结果会存放在 /usr/obj。
make buildkernel
与旧式的、 使用 &man.config.8; 和
&man.make.1; 的方法不同,
这种做法会使用存放于 /usr/obj
中的 新的 编译器。
这种做法使得您免去了由于编译器与内核源代码不一致导致的问题。
make installkernel
安装新的内核及其模块,
使系统能够以更新后的内核启动。
重启系统并进入单用户模式。
单用户模式使得更新正在运行的软件可能导致的问题减到最少。
此外, 它也使配合新内核运行旧 world 可能出现的问题减到最少。
mergemaster
这步操作会进行完成安装新的 world 所需的配置文件更新操作。
例如, 它可能会在系统的密码数据库中添加新的用户组或用户。
这些操作通常在上次更新之后增加了新的用户组或特殊系统用户之后是需要的,
因为 installworld 这步操作会需要这些用户或组才能顺利完成。
make installworld
从 /usr/obj 中复制 world。
这步操作之后, 您在盘上的系统, 包括内核和 world 就都是新的了。
mergemaster
更新余下的配置文件,
因为您的 world 已经更新完成了。
重启系统。
这步操作将加在新的内核, 以及新的 world 和更新过的配置文件。
注意, 如果您正从同一 &os; 版本分支升级, 例如, 从 7.0 到
7.1, 则上述过程可能没有那么必要, 因为您不太可能遇到严重的编译器、
内核源代码、 用户态程序源代码或配置文件不匹配的情形。
旧式的 make world
然后再联编新内核的升级方法, 很可能有机会能够正常运作而完成升级工作。
但是, 在大版本升级的过程中, 不按照前面所介绍的操作来进行升级时,
便很可能遇到一些问题。
此外, 还需要注意的是, 有些时候升级的过程中
(例如从 4.X 到 5.0) 可能会需要一些额外的步骤
(例如在 installworld 之前更名或删除一些文件)。 请仔细阅读
/usr/src/UPDATING 这个文件,
特别是它的结尾部分所介绍的推荐的升级操作顺序。
由于开发人员发现不可能完全避免一些不匹配方面的问题,
这个过程一直在演化过程中。 不过幸运的是, 目前推荐的这个升级步骤,
应该能够在很长一段时间内不需要做任何调整。
从 &os; 3.X 或更早的版本进行升级,
是一件非常麻烦的事情; 请务必仔细阅读 UPDATING
之后再开始这类升级。
总结一下, 目前推荐的从源代码升级 &os;
的方法是:
&prompt.root; cd /usr/src
&prompt.root; make buildworld
&prompt.root; make buildkernel
&prompt.root; make installkernel
&prompt.root; shutdown -r now
有时, 可能需要额外地执行一次
mergemaster -p 才能够完成
buildworld 步骤。
这些要求, 会在 UPDATING 中进行描述。
一般而言, 您可以简单地跳过这一步, 只要进行的不是大跨度的
&os; 版本升级。
在 installkernel 成功完成之后,
您需要引导到单用户模式 (举例而言,
可以在加载器提示后输入 boot -s)。
接下来执行:
&prompt.root; adjkerntz -i
&prompt.root; mount -a -t ufs
&prompt.root; mergemaster -p
&prompt.root; cd /usr/src
&prompt.root; make installworld
&prompt.root; mergemaster
&prompt.root; reboot
阅读进一步的说明
前面所给出的, 只是帮助您开始工作的简要说明。
要清楚地理解每一步, 特别是如果打算自行定制内核配置,
就应阅读下面的内容。
阅读 /usr/src/UPDATING
在您做其它事之前,请阅读
/usr/src/UPDATING (或在您的源码里的等效的文件)。
这个文件要包含有关于您可能遇到的问题的重要信息,
或指定了您可能使用到的命令的执行顺序。如果
UPDATING 与您这里读到相矛盾,那就先依据
UPDATING。
正如先前所述,阅读 UPDATING
并不能替代订阅正确的邮件列表。两都是互补的,并不彼此排斥。
检查 /etc/make.conf
make.conf
检查
/usr/share/examples/etc/make.conf
以及
/etc/make.conf。 第一个文件包含了一些默认的定义
– 它们中的绝大多数都注释掉了。
为了在重新编译系统时能够使用它们,
请把这些选项加入到 /etc/make.conf。
请注意在 /etc/make.conf 中的任何设置同时也会影响每次运行
make 的结果, 因此设置一些适合自己系统的选项是一个好习惯。
一般的用户通常会从 /usr/share/examples/etc/make.conf
复制
CFLAGS 和
NO_PROFILE 这样的设置到
/etc/make.conf 中并令它们生效。
请考虑其他的一些选项 (例如 COPTFLAGS、
NOPORTDOCS 等等), 看看是否合用。
更新 /etc 里的文件
/etc
目录包含有除了您的系统启动时执行的脚本外大部分的系统配置信息。
有些脚本随 FreeBSD 的版本而不同。
有些配置文件在天天运行的系统里也是要使用到的。尤其是
/etc/group。
偶尔, 作为安装过程的一部分,
make installworld 会要求事先创建某些特定的用户或组。
在进行升级时, 它们可能并不存在。 这会给升级造成问题。
有时, make buildworld 会检查它们是否已经存在。
最近就有个这样的例子, 当时新增了 smmsp
用户。 当用户尝试完成安装操作时, 在 &man.mtree.8; 尝试建立
/var/spool/clientmqueue 时失败了。
解决办法是通过使用
选项以构建前 (pre-buildworld) 模式运行 &man.mergemaster.8;。
这表示只对比那些对于成功执行 buildworld
或 installworld 起关键作用的文件。
在第一次这样做时, 如果使用的是早期的不支持
的 mergemaster 版本的话,
使用源码中的新版本即可。
&prompt.root; cd /usr/src/usr.sbin/mergemaster
&prompt.root; ./mergemaster.sh -p
如果您是个偏执狂 (paranoid),
您可以检查您的系统看看哪个文件属于您已更名或删除了的那个组。
&prompt.root; find / -group GID -print
将显示所有 GID 组
(可以是组名也可以是数字地组 ID)所有的文件。
改为单用户模式
单用户 模式
您可能想在单用户模式下编译系统。
除了对更快处理事情显然有好处外, 重装系统将触及许多重要的系统文件,
包括所有标准系统二进制文件、库文件、包含 (include)
文件等等。 在正运行的系统 (尤其是在有活跃的用户的时候)
中更改这些文件是自寻烦恼。
多用户模式
另一种模式是在多用户模式下编译系统,然后转换到单用户模式下安装。
如果您喜欢这种方式,只需在建立 (build) 完成后才执行下边的步骤。
您推迟转换到单用户模式下直到您必须 installkernel
或 installworld。
从运行的系统里,以超级用户方式执行:
&prompt.root; shutdown now
这样就会转换到单用户模式。
除此之外, 也可以重启系统, 并在启动菜单处选择
single user
(单用户) 选项。 这样系统将以单用户模式启动。
接着, 在 shell 提示符处执行:
&prompt.root; fsck -p
&prompt.root; mount -u /
&prompt.root; mount -a -t ufs
&prompt.root; swapon -a
这会检查文件系统,重新将 /
以读/写模式挂接, 参考 /etc/fstab
挂接其它所有的 UFS 文件系统,然后启用交换区。
如果您的 CMOS 时钟是设置为本地时间,而不是 GMT
(如果 &man.date.1; 命令输出不能显示正确的时间和地区也确有其事),
您可能也需要执行下边的命令:
&prompt.root; adjkerntz -i
这样可以确定您正确的本地时区设置—不这样做,
您以后可能会碰到一些问题。
删除 /usr/obj
随着重新构建系统的进行, 编译结果会放到 (默认情况下)
/usr/obj 下。 这些目录会映射到
/usr/src。
通过删除这个目录, 可以加速 make buildworld
的过程, 并避免相互依赖关系等复杂的问题。
/usr/obj
中的某些文件可能设置了不可改标记 (详情参见 &man.chflags.1;),
需要首先去掉这些标志。
&prompt.root; cd /usr/obj
&prompt.root; chflags -R noschg *
&prompt.root; rm -rf *
重新编译基本系统
保存输出
建议把执行 &man.make.1; 后得到的输出存成一个文件。
如果什么地方出了错,您就会有个错误信息的备份。
尽管这样不能帮您分析哪里出了错,
但如果您把您的问题贴到某个邮件列表里就能帮助其他的人。
这样做最简单的办法是使用 &man.script.1;
命令,同是带上参数指定存放输出的文件名。
您应在重建系统之前立即这样做,然后在过程完成时输入
exit。
&prompt.root; script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out
&prompt.root; make TARGET
… compile, compile, compile …
&prompt.root; exit
Script done, …
如果您这样做,就 不要 把文件存到
/tmp 里边。下次启动时,这个目录就会被清除掉。
存放的最好地方是 /var/tmp (如上个实例)或
root 的主目录。
编译基本系统
您必须在/usr/src目录里边:
&prompt.root; cd /usr/src
(当然,除非您的源码是在其它地方,真是这样的话更换成那个目录就行了)。
make
使用 &man.make.1; 命令重建系统。这个命令会从
Makefile (描述组成 &os; 的程序应该怎样被重建,
以什么样的顺序建立等等) 里读取指令。
输入的一般命令格式如下:
&prompt.root; make -x -DVARIABLE target
这个例子里,
是会传递给 &man.make.1; 的一个选项。查看 &man.make.1;
手册有您可用的选项例子。
传递一个变量给 Makefile。这些变量控制了
Makefile 的行为。这些同
/etc/make.conf 设置的变量一样,
只是提供了另一种设置它们的方法。
&prompt.root; make -DNO_PROFILE target
是另一种指定不被建立 (built) 的先定库
(profiled libraries) 的方式,协同
/etc/make.conf 里的
NO_PROFILE= true # 避免编译性能分析库
一起使用。
目标 (target) 告诉
&man.make.1; 什么该做。每个 Makefile
定义了一定数量不同的目标 (targets)
,
然后您选择的目标就决定了什么会发生。
有些目标列在 Makefile
里的,但并不意味着您要执行。相反,建立过程 (build process)
利用它们把重建系统的一些必要的步骤分割成几个子步骤。
大部分的时间不需要向 &man.make.1;
传递参数,因此您的命令看起来可能象这样:
&prompt.root; make target
此处 target 表示的是若干编译选项。
多数情况下, 第一个 target 都应该是
buildworld。
正如名字所暗示的,buildworld
在 /usr/obj 下边建立了一个全新的树, 然后使用另一个 target,
installworld 在当前的机器里安装它。
将这些选项分开有两个优点。 首先, 它允许您安全地完成建立
(build), 而不对正在运行的系统的组件产生影响。
构建过程是 自主的 (self hosted)
。 因为这样,
您可以安全地在以多用户模式运行的机器里执行
buildworld ,而不用当心不良影响。
但是依然推荐您在单用户模式时运行
installworld。
第二,允许您使用 NFS 挂接 (NFS mounts)
升级您网络里的多台计算机。如果您有三台
A、B 和 C
想进行升级,在A 执行
make buildworld 和
make installworld。 然后将
A 上的
/usr/src 和
/usr/obj 通过 NFS 挂接到
B 和 C 上, 接下来, 只需在
B 和 C 上使用
make installworld
来安装构建的结果就可以了。
尽管 world target
仍然存在,强烈建议您不要用它。
运行
&prompt.root; make buildworld
我们提供了一个试验性的功能, 可以在构建过程中为
make 指定 参数,
令其在构建过程中同时启动多个并发的进程。 对于多 CPU 的机器而言,
这样做有助于发挥其性能。 不过, 由于编译过程中的瓶颈主要是在 IO
而不是 CPU 上, 因此它也会对单 CPU 的机器带来好处。
对典型的单 CPU 机器, 可以使用:
&prompt.root; make -j4 buildworld
这样, &man.make.1; 会最多同时启动 4 个进程。
从发到邮件列表中的经验看, 这样做能带来最佳的性能。
如果您使用的机器有多颗 CPU, 并且配置了 SMP 的内核,
也可以试试看 6 到 10 的数值, 并观察是否能带来构建性能上的改善。
耗时
rebuilding world
timings
联编基本系统所需的时间会受到很多因素的影响,
不过, 较新的机器应该都能在一两个小时之内完成 &os.stable; 源代码的构建,
而无须任何技巧或捷径。 完成 &os.current; 源代码的联编,
则通常需要更长一些的时间。
编译和安装新内核
内核
编译
要充分利用您的新系统,您应该重新编译内核。
这是很有必要的,因为特定的内存结构已经发生了改变,像
&man.ps.1; 和 &man.top.1; 这样的程序会不能工作,
除非内核同源码树的版本是一样的。
最简单、最安全的方式是 build 并安装一个基于
GENERIC 的内核。虽然
GENERIC
可能没有适合您的系统的所有必要的设备,
但它包括了启动您的系统到单用户模式所必需的内容。
这是个不错的检测新系统是否工作正常的测试。在从
GENERIC 启动、核实系统可以工作后,
您就可以建立 (build) 一个基于您的正常内核配置文件的新的内核了。
在 &os; 中, 首先完成 build world 然后再编译新内核非常重要。
如果您想建立一个定制内核,而且已经有了配置文件,
只需象这样使用 KERNCONF=MYKERNEL:
&prompt.root; cd /usr/src
&prompt.root; make buildkernel KERNCONF=MYKERNEL
&prompt.root; make installkernel KERNCONF=MYKERNEL
注意,如果您已把 内核安全级别(kern.securelevel)
调高到了 1 以上,而且还设置了 noschg
或相似的标识到了您的内核二进制里边,您可能会发现转换到单用户模式里使用
installkernel 是很有必要的。
如果您没有设置它, 则应该也能毫无问题地在多用户模式执行这两个命令。 请参考
&man.init.8; 以了解更多关于 内核安全级(kern.securelevel)
的信息;查看 &man.chflags.1; 了解更多关于不同文件标识的信息。
重启到单用户模式
单用户模式
您应该单用户模式测试新内核。照处的说明去做。
安装编译好的新系统
如果您正建立一个足以使用 make buildworld
的 &os; 版本,那么您现在应该使用
installworld 来安装新的系统二进制。
执行
&prompt.root; cd /usr/src
&prompt.root; make installworld
如果在 make buildworld
的命令行指定了变量,您就必须在
make installworld 命令行里指定同样的变量。
对于其它的选项并不是必需的,如,
就不能同 installworld 一起使用。
举例,您执行了:
&prompt.root; make -DNO_PROFILE buildworld
您就必须使用:
&prompt.root; make -DNO_PROFILE installworld
来安装结果,否则就要试着安装先定 (profiled) 的在
make buildworld 阶段没有建立 (built)
的二进制文件。
不是由 make installworld 更新的更新文件
重新编译整个系统不会使用新的或改过的配置文件更新某些目录
(尤其像 /etc、/var
和 /usr)
更新这些文件最简单的方式就是使用
&man.mergemaster.8;,手工去做也是可以的,只要您愿意。
不管您选择哪一种,一定记得备份
/etc 以防出错。
Tom
Rhodes
贡献者:
mergemaster
mergemaster
&man.mergemaster.8; 工具是个 Bourne 脚本,用于检测
/etc 和 /usr/src/etc
源码树里边的配置文件的不同点。
这是保持系统配置文件同源码树里的一起更新的推荐方式。
在提示符里简单地输入 mergemaster
就可以开始,并观看它的开始过程。mergemaster
会建立一个临时的根(root)环境,在 / 下,
放置各种系统配置文件。这些文件然后同当前安装到您系统里的进行比较。
此时,不同的文件会以 &man.diff.1; 格式进行显示,使用
符号标识增加或修改的行,
标识将完全删除的行或将被替换成新行。查看 &man.diff.1;
手册可以得到更多关于 &man.diff.1; 语法和文件不同点怎样显示的信息。
&man.mergemaster.8; 会给您显示每个文件的不同处,
这样您就可以选择是删除新文件 (相对临时文件),
是以未改状态安装临时文件,是以当前安装的文件合并临时文件,
还是再看一次 &man.diff.1; 结果。
选择删除临时文件
将使 &man.mergemaster.8;
知道我们希望保留我们当前的文件不改,并删除新的。
并不推荐这个选择,除非您没有更改当前文件的理由。任何时候在
&man.mergemaster.8; 提示符里输入 ?,您就会得到帮助。
如果选择跳过文件,将在其它文件处理完后再次进行。
选择安装未修改临时文件
将会使新文件替换当前的。
对大部分未改的文件,这是个最好的选择。
选择合并文件
将为您打开一个文本编辑器,
里边是两个文件的内容。您现在就可以一边合并它们,
一边在屏幕里查看,同时从两者中选取部分生成最终文件。
当两个文件一起比较时,l 键会选择左边的内容,
r 会选择右边的。最终的输出是由两个部分组成的一个文件,
用它就可以安装了。这个选项通常用于用户修改了设置的文件。
选择再次查看 &man.diff.1; 结果
将会在提供给选择之前,
显示文件的不同处,就象 &man.mergemaster.8; 所做的一样。
在 &man.mergemaster.8; 完成了对系统文件的处理后,
您会得到其它的选项。&man.mergemaster.8; 可能会问您是否要重建密码文件,
并在最后提示您是否要删除余下的临时文件。
手动更新
如果想要手工更新,但不要只是从
/usr/src/etc 把文件复制到
/etc 就了事。有些文件是必须先安装
的。
这是因为 /usr/src/etc 目录并 不是
想像的那样是 /etc 目录的一个复制。事实上,有些是文件是
/etc 有的,而 /usr/src/etc 里边没有。
如果您使用 &man.mergemaster.8; (作为推荐),您可以向前跳到
下一节。
手工做最简单的方式是安装这些文件到一个新的目录,完成后再来查找不同处。
备份您已有的 /etc
虽然,理论上,没有什么会自动访问这个目录,
事情还是做稳操胜当一点。复制已有 /etc
到一个安全的地方,如:
&prompt.root; cp -Rp /etc /etc.old
完成递归复制
(译者注:即可以复制目录以下的所有内容),
保留文件的时间、所属等等。
您需要建立一个虚目录 (a dummy set of directories)
来安装新的 /etc 和其它文件。
/var/tmp/root 是个不错的选择,
除此之外,还有一些子目录是需要的。
&prompt.root; mkdir /var/tmp/root
&prompt.root; cd /usr/src/etc
&prompt.root; make DESTDIR=/var/tmp/root distrib-dirs distribution
这样就建好了需要的目录结构,然后安装文件。在
/var/tmp/root 下建立的大部分子目录是空的,
而且要删除掉。最简单的方式是:
&prompt.root; cd /var/tmp/root
&prompt.root; find -d . -type d | xargs rmdir 2>/dev/null
这样会删除所有的空目录。(标准的错误信息被重定向到了
/dev/null,以防止关于非空目录的警告。)
/var/tmp/root 现在包含了应放在
/ 下某个位置的所有文件。
您现在必须仔细检查每一个文件,检测它们与您已有的文件有多大不同。
注意,有些已经安装在 /var/tmp/root
下的文件有个.
在开头。在写的时候,像这样唯一的文件是
/var/tmp/root/ 和 /var/tmp/root/root/
里 shell 启动文件,尽管可能有其它的(依赖于您什么时候读取这个)。
确信使用 ls -a 可以看到它们。
最简单的方式是使用 &man.diff.1; 去比较两个文件:
&prompt.root; diff /etc/shells /var/tmp/root/etc/shells
这会显示出 /etc/shells 文件和新的
/var/tmp/root/etc/shells 文件的不同处。
用这些来决定是合并您已做的变化还是复制您的旧文件过来。
使用日戳 (Time Stamp) 命名新的 Root(根)目录(/var/tmp/root),这样您可以轻松地比较两个版本的不同
频繁重建系统意味着必须频繁更新
/etc,而这可能会有点烦琐。
在合并到 /etc 的文件里,
最新更改的您可以做个复制,由此加快这个(指更新)过程。
下边就给出了一个怎样做的主意。
像平常一样建立系统 (Make the world)。当您想更新
/etc 和其它目录里,
给目标目录一个含有当前日期的名字。假如您是 1998 年 2 月 14
日做的,您可以执行下边的:
&prompt.root; mkdir /var/tmp/root-19980214
&prompt.root; cd /usr/src/etc
&prompt.root; make DESTDIR=/var/tmp/root-19980214 \
distrib-dirs distribution
如上边列出的,从这个目录合并变化。
在您完成后,不要 删除
/var/tmp/root-19980214 目录。
在您下载了最新版的源码并改过后,执行第一步。
这样将得到一个新的目录,可能叫做
/var/tmp/root-19980221
(如果等了一周做的升级)。
您现在能看到两个目录间的不同了---在隔周的时间里使用
&man.diff.1; 建立递归 diff 产生的不同:
&prompt.root; cd /var/tmp
&prompt.root; diff -r root-19980214 root-19980221
一般情况下,这两种间的不同处比
/var/tmp/root-19980221/etc 和
/etc 之间的不同要小很多。
因为不同点更小,也就更容易把这些变化移到您的
/etc 目录里边。
您现在可以删除早先的两个
/var/tmp/root-* 目录:
&prompt.root; rm -rf /var/tmp/root-19980214
每次您需要合并这些变化到 /etc
里,就重复这个流程。
您可以使用 &man.date.1; 自动产生目录的名称:
&prompt.root; mkdir /var/tmp/root-`date "+%Y%m%d"`
重启
现在完成了。在您检查所有内容都放置正确后,
您可以重启系统了。只是简单的 &man.shutdown.8; 可以这样做:
&prompt.root; shutdown -r now
结束
恭喜!您现在成功升级了您的 &os; 系统。
如果还有轻微的错误,可以轻易地重建系统的选定部分。
例如,在部分升级或合并 /etc 时,您不小心删除了
/etc/magic,&man.file.1;
命令就会停止工作。这种情况下,执行下边进行修复:
&prompt.root; cd /usr/src/usr.bin/file
&prompt.root; make all install
问题
每个变化您都须要重建系统吗?
这个不好说,因为要看变化的情况。如,如果您刚运行了
CVSup,并得到下边更新的文件:
src/games/cribbage/instr.c
src/games/sail/pl_main.c
src/release/sysinstall/config.c
src/release/sysinstall/media.c
src/share/mk/bsd.port.mk
这就不必重建整个系统。您只需到相关的子目录里执行
make all install,仅此而已。
但是,如果有重大变化,如 src/lib/libc/stdlib,
那么您就要重建系统或至少静态连接的那些部分
(除了您增加的部分都是静态连接的)。
在这天后,就是您的事了。要是说每两个星期重建一下系统的话,
您可能会高兴。或者您可能只想重做改变过的部分,
确信您能找出所有依赖关系。
当然,所有这些依赖于您想升级的频率,和您是否想跟踪
&os.stable; 或 &os.current;。
我的编译失败,并伴随有许多 11
(或其它的数字信息) 号错误。是怎么回事呀?
信号 11
这个通常表示硬件错误。
(重)建系统是个强压测试系统硬件的有效地方式,
并且常常产生内存错误。
这些正好表示它们自已做为编译器离奇地死于收到的奇怪信息。
一个确信的指示器是如果重新开始
make,并且整个过程中会死在不同的点上。
对于这种情况,您没有什么可做的,除了更换机器里的部件,看是哪一个坏了。
我完成后可以删除 /usr/obj 吗?
简短地说,可以。
/usr/obj
包含了所有在编译阶段生成的目标文件。通常,
在 make buildworld 过程中第一步之一就是删除这个目录重新开始。
这种情况下,在您完成后,保留 /usr/obj
没有多大意义,还可释放一大堆磁盘空间(通常在 340 MB 左右)。
只是,如果您清楚您在干什么,您可以让
make buildworld 跳过这一步。
这会让后继的 build 执行得更快,因为大部分的源码都不必再进行编译了。
这个的另一面就在于敏感的依赖问题可以潜在,
并以奇怪的方式引起 build 的失败。这在 &os; 邮件列表里经常引起沸腾,
当有人抱怨他们 build 失败时,并没意识到这是因为自已是想抄近路
(意思是说少了些必要的步骤)。
中断的 build 可以被恢复吗?
依赖于您在您找到问题之前整个过程进行了多远。
一般而言 (当然这并不是硬性规定),
make buildworld
的过程中将会首先构建新版的基本构建工具 (例如 &man.gcc.1;, 以及
&man.make.1;) 和系统库。 随后会安装这些工具和库。
这些新版本的工具和库在随后将被用于重新编译和连接它们本身。
整个系统 (现在包括了常规的用户程序, 例如
&man.ls.1; 或 &man.grep.1;) 会同新版的系统文件一起被重新构建。
如果您正处于最后一个阶段, 并且了解它 (因为您已经看过了所保存的输出)
则可以 (相当安全地) 做:
… 问题修复 …
&prompt.root; cd /usr/src
&prompt.root; make -DNO_CLEAN all
这样就不会取消先前的
make buildworld 所做的工作了。
在make buildworld
的输出中如果看到如下信息:
--------------------------------------------------------------
Building everything..
--------------------------------------------------------------
出现在 make buildworld 的输出中,
则这样做应该不会有什么问题。
如果没有看到这样的信息, 或者您不确定,
则从头开始构建将是万无一失的做法。
我怎样加快建立系统的速度?
以单用户模式运行
把 /usr/src 和 /usr/obj
目录放到不同磁盘里的独立文件系统里。如果可能,这些磁盘在不同的磁盘控制器里。
更好的,是把这些文件系统放置到多个使用
&man.ccd.4; (连接磁盘驱动器--concatenated disk driver)设备的磁盘里。
关掉 profiling (在 /etc/make.conf
里设置 NO_PROFILE=true
)。您差不多用不了它。
在 /etc/make.conf 里也为
CFLAGS 设置上 。
最佳优化 会更慢,而且
和 之间的优化差别基本上可以忽略。
让编译器使用管道而不用临时文件进行通信,
这样可以减少磁盘存取 (以内存作为代价)。
传递 选项给
&man.make.1; 以便并发运行多个进程。
这样就不会考虑您的是否是单个或多个处理器机器。
存放 /usr/src 的文件系统可以使用
选项来挂接 (或重新挂接)。
这样会防止文件系统记录文件的存取时间。 您可能并不需要这些信息。
&prompt.root; mount -u -o noatime /usr/src
这个例子里假定 /usr/src
是在它自已的文件系统里。如果不是 (例如假设它是
/usr 的部分),那么您就需要那个文件系统挂接点,
而不是 /usr/src。
存放 /usr/obj 的文件系统可以使用
选项被挂接 (或重新挂接)。
这样做将启用异步写盘。 换句话说, 对应用程序而言写会立即完成,
而数据则延迟几秒才会写到盘里。 这样做能够成批地写下数据,
从而极大地改善性能。
注意, 这个选项会使您的文件系统变得脆弱。
使用这个选项会提高在电源断掉或机器非正常重启时,
文件系统进入不可恢复状态的概率。
如果在这个文件系统里 /usr/obj
是很关键的,这不是问题。如果您有其它有价值的数据在同一个文件系统,
那么在您使用这个选项这前,确认备份一下。
&prompt.root; mount -u -o async /usr/obj
同上,如果 /usr/obj
不在自已的文件系统里,使用相关挂接点的名字把它从例子里边替换掉。
如果出现了错误我该怎么办?
绝对确信您的环境没有先前 build 留下的残余。这点够简单。
&prompt.root; chflags -R noschg /usr/obj/usr
&prompt.root; rm -rf /usr/obj/usr
&prompt.root; cd /usr/src
&prompt.root; make cleandir
&prompt.root; make cleandir
不错,make cleandir 真的要执行两次。
然后重新开始整个过程,使用 make buildworld 开始。
如果您还有问题,就把错误和 uname -a
的输出发送到 &a.questions; 邮件列表。准备回答其它关于您的设置的问题!
Mike
Meyer
贡献者
跟踪多台机器
NFS
安装多台机器
如果您有多台机器想跟踪同样的源码树,
那么让它们都下载源码并重建所有东西,看起有点浪费资源:
磁盘空间、网络带宽以及 CPU 周期。
解决的办法是让一台机器处理大部分的工作,而其它的机器通过
NFS 挂接 (mount) 这些工作。这部分列举了一种这样做的方法。
准备
首先,确定一批机器,运行的二进制代码是同一套---我们称作
构建集群 (build set)。 每台机器可以使用不同的定制内核,
但它们运行的是相同的用户区二进制文件(userland binaries)。
从这批机器中选择一台机器做为 构建机器(build machine)。
这将是用于构建(build)系统和内核的机器。想像一下,它应该是一台快速的机器,
有足够的空余的 CPU 来执行make buildworld。
您也想要选一台机器做为 测试机器(test machine),
这个将用于软件的更新生成产品之前对他们进行测试。这个
必须 是一台您能提供的平时也可使用的机器。
它可以是构建机器
,但没这个必要。
在这个构建集群
里的所有机器需要从同一台机器、
同一个点上挂接 /usr/obj 和
/usr/src。理想地,
它们在构建机器
上的两个不同的驱动器里,
但是在那台机器上可以进行 NFS 挂接。如果您有多个构建集群
,
/usr/src 应该在某个构建机器
上,
而在其它机器上进行 NFS 挂接。
最后,确认构建集群
里所有机器上的
/etc/make.conf 和
/etc/src.conf 与构建机器
里的相同。
这意味着构建机器
必须构建部分基本系统用于
构建集群
里所有机器的安装。同样,
每台构建机器
要有它自已的内核名字,使用
/etc/make.conf 里的 KERNCONF
进行设置,并且每台构建机器
应该把它们列在
KERNCONF 里,同时把自已的内核列在最前。
构建机器
的
/usr/src/sys/arch/conf
里一定要有每台机器的内核配置文件,如果它想构建它们的内核的话。
基本系统
既然所有的妥当了,就准备构建所有的东西。如中描述的一样在构建机器
上构建内核和系统,
但是什么也不安装。在构建结束后,转到测试机器
上,
安装您刚构建的内核。如果这台机器通过 NFS 挂接了
/usr/src 和 /usr/obj,
在您重启到单用户模式里,您需要启动网络然后挂接他们。
最简单的方式是启动到多用户模式下,然后执行 shutdown now
转到单用户模式。一旦进入,您就可以安装新的内核和系统,并执行
mergemaster,就像平常一样。完成后,
重启返回到一般多用户模式操作这台机器。
在您确信所有在 测试机
里都工作正常后,
就使用相同的过程在 构建集群
里的其它机器里安装新的软件。
Ports
类似的想法是使用 ports 树。
第一个关键的步骤是从同一台计算机上挂接
/usr/ports 到 构建集群
里的全部计算机。
然后正确设置 /etc/make.conf 共享
distfiles。您应把 DISTDIR 设置到一个共享的目录里,
那里可以被任何一个 root 用户写入, 并且是由您的
NFS 挂接映射的。 设置每一台机器的 WRKDIRPREFIX
到一个本地构建 (build) 目录。最后,如果您要构建和发布包
(packages),那么您应该设置 PACKAGES
到一个类似于 DISTDIR 的目录。
diff --git a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
index 981c39b0b4..f0ff254588 100644
--- a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml
@@ -1,3119 +1,3114 @@
获取 &os;
CDROM 和 DVD 发行商
零售盒装产品
可以从下面几个零售商那里买到 &os; 的盒装产品 (&os; CD,
附加软件,印刷文档):
CompUSA
WWW:
Frys Electronics
WWW:
CD 和 DVD 光盘
&os; CD 和 DVD 光盘可以从许多在线零售商那里买到:
&os; Mall, Inc.
700 Harvest Park Ste F
Brentwood, CA 94513
USA
Phone: +1 925 240-6652
Fax: +1 925 674-0821
Email: info@freebsdmall.com
WWW:
Dr. Hinner EDV
St. Augustinus-Str. 10
D-81825 München
Germany
Phone: (089) 428 419
WWW:
Ikarios
22-24 rue Voltaire
92000 Nanterre
France
WWW:
JMC Software
Ireland
Phone: 353 1 6291282
WWW:
The Linux Emporium
Hilliard House, Lester Way
Wallingford
OX10 9TA
United Kingdom
Phone: +44 1491 837010
Fax: +44 1491 837016
WWW:
Linux+ DVD Magazine
Lewartowskiego 6
Warsaw
00-190
Poland
Phone: +48 22 860 18 18
Email: editors@lpmagazine.org
WWW:
Linux System Labs Australia
21 Ray Drive
Balwyn North
VIC - 3104
Australia
Phone: +61 3 9857 5918
Fax: +61 3 9857 8974
WWW:
LinuxCenter.Ru
Galernaya Street, 55
Saint-Petersburg
190000
Russia
Phone: +7-812-3125208
Email: info@linuxcenter.ru
WWW:
发行人
如果您是销售商并且想销售 &os; CDROM 产品,
请和发行人联系:
Cylogistics
809B Cuesta Dr., #2149
Mountain View, CA 94040
USA
Phone: +1 650 694-4949
Fax: +1 650 694-4953
Email: sales@cylogistics.com
WWW:
Ingram Micro
1600 E. St. Andrew Place
Santa Ana, CA 92705-4926
USA
Phone: 1 (800) 456-8000
WWW:
Kudzu, LLC
7375 Washington Ave. S.
Edina, MN 55439
USA
Phone: +1 952 947-0822
Fax: +1 952 947-0876
Email: sales@kudzuenterprises.com
LinuxCenter.Kz
Ust-Kamenogorsk
Kazakhstan
Phone: +7-705-501-6001
Email: info@linuxcenter.kz
WWW:
LinuxCenter.Ru
Galernaya Street, 55
Saint-Petersburg
190000
Russia
Phone: +7-812-3125208
Email: info@linuxcenter.ru
WWW:
Navarre Corp
7400 49th Ave South
New Hope, MN 55428
USA
Phone: +1 763 535-8333
Fax: +1 763 535-0341
WWW:
FTP 站点
官方的 &os; 源代码可以从遍布全球的镜像站点
通过匿名 FTP 下载。 站点
有着良好的网络连接并且允许大量的并发连接, 但是
您或许更想找一个 更近的
镜像站点 (特别是当您想进行某种形式的镜像的时候)。
&os; 镜像
站点数据库要比使用手册中的镜像列表更加精确,
因为它从 DNS 中获取信息而不依赖于静态的主机列表。
&os; 可以从下面这些镜像站点通过匿名 FTP
下载。如果您选择了通过匿名 FTP 获取 &os;,
请尽量使用离您比较近的站点。被列为
主镜像站点
的镜像站点一般都有完整的 &os; 文件
(针对每种体系结构的所有当前可用的版本),
您或许从您所在的国家或地区的站点下载会得到更快的下载速度。
每个站点提供了最流行的体系结构的最近的版本而有可能不提供完整的
&os; 存档。所有的站点都提供匿名 FTP
访问而有些站点也提供其他的访问方式。对每个站点可用的访问方式
在其主机名后有所说明。
&chap.mirrors.ftp.inc;
BitTorrent
BitTorrent
基本发行版 CD 的 ISO 镜像也可以通过 BitTorrent 获得。
用户下载镜像的 torrent 文件能够在这里找到 http://torrents.freebsd.org:8080
BitTorrent 客户端软件可以从这个 port
net-p2p/py-bittorrent
或预编译的二进制包安装。
在通过 BitTorrent 下载了 ISO 镜像之后,
你可以照着 burncd
中的所描述的方法烧录到 CD 或 DVD 介质上。
匿名 CVS
概述
CVS
匿名
匿名 CVS(或人们常说的
anoncvs)是由和 &os; 附带的 CVS 实用工具提供的用于和远程的
CVS 代码库同步的一种特性。
尤其是, 它允许 &os; 用户不需要特殊的权限对任何一台 &os; 项目的官方
anoncvs 服务器执行只读的 CVS 操作。
要使用它,简单的设置 CVSROOT
环境变量指向适当的 anoncvs 服务器,
输入 cvs login 命令
并提供广为人知的密码anoncvs
,然后使用
&man.cvs.1; 命令像访问任何本地仓库一样来访问它。
cvs login 命令把用来登录 CVS
服务器的密码储存在您的 HOME 目录中一个叫
.cvspass 的文件里。
如果这个文件不存在,
第一次使用 cvs
login 的时候可能会出错。 请创建一个空的
.cvspass 文件,然后试试重新登录。
也可以这么说 CVSup 和 anoncvs
服务本质上提供了同样的功能,但是有各种各样
不同的场合可以影响用户对同步方式的选择。简单来说,
CVSup 在网络资源利用方面
更加有效,而且是到目前为止在两者之中技术上更成熟的
除了成本方面。要使用
CVSup,在下载任何东西之前
必须首先安装配置特定的客户端,
而且只能用于下载相当大块的
CVSup 称作
collections。
相比之下,anoncvs 可以通过 CVS
模块名来从单个文件里检出任何东西并赋给特定的程序
(比如 ls 或者 grep)。
当然,anoncvs 也只适用于对
CVS 仓库的只读操作,所以如果您是想用和 &os; 项目共享的仓库提供本地开发的话,
CVSup 几乎是您唯一的选择。
使用匿名 CVS
配置 &man.cvs.1; 使用匿名 CVS 仓库可以简单的设定
CVSROOT 环境变量指向 &os; 项目的
anoncvs 服务器之一。 到此书写作为止,
下面的服务器都是可用的:
法国:
:pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs
- (pserver (口令是 anoncvs
), ssh (没有口令))
-
+ (使用 pserver 模式时, 用 cvs login
+ 配合口令 anoncvs
来登录。
+ 如果使用的是 ssh, 则不需要口令。)
+
台湾地区:
:pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
- (pserver (使用 cvs login 并在提示输入口令时,
- 输入任意口令。), ssh (无口令))
+ (使用 pserver 模式时, 用 cvs login
+ 配合口令 anoncvs
来登录。
+ 如果使用的是 ssh, 则不需要口令。)
SSH2 HostKey: 1024 02:ed:1b:17:d6:97:2b:58:5e:5c:e2:da:3b:89:88:26 /etc/ssh/ssh_host_rsa_key.pub
SSH2 HostKey: 1024 e8:3b:29:7b:ca:9f:ac:e9:45:cb:c8:17:ae:9b:eb:55 /etc/ssh/ssh_host_dsa_key.pub
美国:
- freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs
- (仅 ssh - 无口令)
-
- SSH HostKey: 1024 a1:e7:46:de:fb:56:ef:05:bc:73:aa:91:09:da:f7:f4 root@sanmateo.ecn.purdue.edu
-SSH2 HostKey: 1024 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65 ssh_host_dsa_key.pub
-
-
-
- USA:
- anoncvs@anoncvs1.FreeBSD.org:/home/ncvs (仅限 ssh2 -
- 无口令)
+ anoncvs@anoncvs1.FreeBSD.org:/home/ncvs (使用 ssh 时,
+ 请使用协议版本 2, 不需要口令。)
SSH2 HostKey: 2048 53:1f:15:a3:72:5c:43:f6:44:0e:6a:e9:bb:f8:01:62 /etc/ssh/ssh_host_dsa_key.pub
因为 CVS 实际上允许 检出
曾经存在的 (或者,某种情况下将会存在)
&os; 源代码的任意版本, 您需要熟悉
&man.cvs.1; 的版本 () 参数,
以及在 &os; 代码库中可用的值。
有两种标签,修订标签和分支标签。
修订标签特指一个特定的修订版本。含义始终是不变的。
分支标签,另一方面,
指代给定时间给定开发分支的最新修订,
因为分支标签不涉及特定的修订版本,
它明天所代表的含义就可能和今天的不同。
包括了用户可能感兴趣的
修订标签。 请注意, 这些标签并不适用于 Ports Collection,
因为它并不包含多个开发分支。
当您指定一个分支标签,您通常会得到那个开发分支的文件的最新版本。
如果您希望得到一些旧的版本,您可以用
标记制定一个日期。
察看 &man.cvs.1; 手册页了解更多细节。
示例
在这之前强烈建议您通读 &man.cvs.1; 的手册页,
这里有一些简单的例子来展示如何使用匿名
CVS:
从 -CURRENT 检出些东西 (&man.ls.1;):
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
>在提示符处,输入任意密码 password
.
&prompt.user; cvs co ls
通过 SSH 检出整个 src/
代码树:
&prompt.user; cvs -d freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs co src
The authenticity of host 'anoncvs.freebsd.org (128.46.156.46)' can't be established.
DSA key fingerprint is 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'anoncvs.freebsd.org' (DSA) to the list of known hosts.
检出 6-STABLE 分支中的 &man.ls.1; 版本:
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
在提示符处,输入任意密码 password
。
&prompt.user; cvs co -rRELENG_6 ls
创建 &man.ls.1; 的变化列表(用标准的 diff)
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
在提示符处,输入任意密码 password
。
&prompt.user; cvs rdiff -u -rRELENG_5_3_0_RELEASE -rRELENG_5_4_0_RELEASE ls
找出可以使用的其它的模块名:
&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs login
在提示符处,输入任意密码 password
。
&prompt.user; cvs co modules
&prompt.user; more modules/modules
其他资源
下面附加的资源可能对学习
CVS 有帮助:
CVS 教程,
来自加州州立理工大学。
CVS 主页,
CVS 开发和支持社区。
CVSweb 是
&os; 项目的 CVS web 界面。
使用 CTM
CTM
CTM 是保持远程目录树和中央服务器目录树同步的一种方法。
它被开发用于 &os; 的源代码树,虽然其他人随着时间推移会发现它可以用于其他目的。
当前几乎没有,也或者只有很少的文档讲述创建 deltas 的步骤,
所以如果您希望使用 CTM 去做其它事情,
请联系 &a.ctm-users.name; 邮件列表了解更多信息。
为什么我该使用 CTM?
CTM 会给您一份 &os;
源代码树的本地副本。 代码树有很多的
flavors
可用。不管您是希望跟踪完整的 CVS 树还是只是一个分支,
CTM 都会给您提供信息。
如果您是 &os; 上的一个活跃的开发者,但是缺乏或者不存在 TCP/IP 连接,或者只是希望把变化自动发送给您,
CTM 就是适合您的。对于最积极的分支
您将会每天获得三个以上的 deltas。
然而,您应该考虑通过邮件来自动发送。
升级的大小总是保证尽可能的小。
通常小于 5K,也偶然(十分之一可能)会有 10-50K,也不时地有个大的 100K+ 甚至更大的。
您也需要让自己了解直接和开发代码而不是预发行版本打交道的各种警告。这种情况会很显著,
如果您选择了 current
代码的话。强烈建议您阅读和
&os; 保持同步。
使用
CTM 我需要做什么?
您需要两样东西:CTM
程序,还有初始的 deltas 来 feed it(达到
current
级别)。
CTM 程序从版本 2.0 发布以来
已经是 &os; 的一部分了,如果您安装了源代码副本的话, 它位于
/usr/src/usr.sbin/ctm。
您喂给 CTM 的 deltas
可以有两种方式,FTP 或者 email。
如果您有普通的访问 Internet 的 FTP 权限,
那么下面的 FTP 站点支持访问
CTM:
或者看看这一小节镜像。
FTP 访问相关的目录并取得
README 文件,从那里开始。
如果您希望通过 email 得到您的 deltas:
订阅一个
CTM 分发列表。
&a.ctm-cvs-cur.name; 支持完整的 CVS 树。
&a.ctm-src-cur.name; 支持最新的开发分支。
&a.ctm-src-4.name; 支持 4.X 发行分支,
等等。。(如果您不知道如何订阅邮件列表,
点击上面的列表名或者到
&a.mailman.lists.link; 点击您希望订阅的列表。
列表页包含了所有必要的订阅指导。)
当您开始接收到您邮件中的 CTM
升级时,您可以使用
ctm_rmail 程序来解压并应用它们。
事实上如果您想要让进程以全自动的形式运行的话,您可以通过在
/etc/aliases 中设置直接使用 ctm_rmail 程序。
查看 ctm_rmail 手册页了解更多细节。
不管您使用什么方法得到
CTM deltas,您都应该订阅
&a.ctm-announce.name; 邮件列表。
以后会有单独的地方提交有关
CTM 系统的操作的公告。
点击上面的邮件列表名并按照指示订阅邮件列表。
第一次使用 CTM
在您开始使用 CTM
delta 之前,您需要获得一个起始点。
首先您应该确定您已经有了什么。每个人都可以从一个空
目录开始。
您必须用一个初始的 空的
delta 来开始您的
CTM 支持树。曾经为了您的便利这些
起始
deltas 被有意的通过 CD 来发行,
然而现在已经不这样做了。
因为代码树有数十兆字节,您应该更喜欢从手头上已经有的东西开始。如果您有一张
-RELEASE CD 光盘,您可以从里面复制或者解压缩一份初始代码出来。
这会节省非常多的数据传输量。
您会发现这些初始的
deltas 名字的数字后面都有个
X (比如 src-cur.3210XEmpty.gz)。
后面加一个 X 的设计符合您的初始 seed
的由来。
Empty 是一个空目录。通常一个基本的从
Empty 开始的转换由
100 个 deltas 构成。顺便说一下,他们都很大!70 到 80
兆字节的 gzip 压缩的数据对于
XEmpty deltas 是很平常的。
一旦您已经选定了一个基本的 delta 开始,您就需要比这个数高的所有的 delta。
在您的日常生活中使用 CTM
要应用 deltas,简单的键入:
&prompt.root; cd /where/ever/you/want/the/stuff
&prompt.root; ctm -v -v /where/you/store/your/deltas/src-xxx.*
CTM 能够理解被
gzip 压缩的 deltas,所以您不需要先
gunzip 他们,这可以节省磁盘空间。
除非觉得整个过程非常可靠,
CTM 不会涉及到您的代码树的。您也可以使用
标记来校验 delta,
这样 CTM 就不会涉及代码树;
它会只校验 delta 的完整性看看是否可以安全的用于您的当前代码树。
CTM 还有其他的一些参数,
查看手册页或者源代码了解更多信息。
这真的就是全部的事情了。每次得到一个新的
delta,就通过 CTM 运行它来保证您的代码是最新的。
如果这些 deltas 很难重新下载的话不要删除它们。
有些东西坏掉的时候您会想到保留它们的。
即使您只有软盘,也请考虑使用
fdwrite 来做一份副本。
维持您本地的变动
作为一名开发者喜欢实验,改动代码树中的文件。
CTM
用一种受限的方式支持本地修改:再检查文件
foo 存在之前,首先查找
foo.ctm。如果这个文件存在,
CTM 会对它操作而不是
foo。
这种行为给我们提供了一种简单的方式来维持本地的改动:
只要复制您计划修改的文件并用
.ctm 的后缀重新命名。
然后就可以自由的修改代码了,CTM 会更新
.ctm 文件到最新版本。
其他有趣的 CTM 选项
正确的找出哪些将被更新
您可以确定变动列表,
CTM 可以做到,在您的代码库上使用
CTM 的
选项。
这很有用如果您想要保存改动的日志,
pre- 或者 post- 用各种风格处理修改的文件的纪录,
或者仅仅是想感受一下孩子般的疯狂。
在升级前制作备份
有时您可能想备份将要被 CTM
升级所改动的所有文件。
指定 选项会导致
CTM 备份将要被给定的 CTM
delta 改动的所有文件到 backup-file。
限定受升级影响的文件
有时您可能对限定一个给定的 CTM
升级的范围感兴趣,也有可能想知道怎样从一列 deltas 中解压缩一部分文件。
您可以通过使用 和
选项指定过滤规则表达式来控制 CTM
即将对之操作的文件列表。
例如,要从您保存的CTM deltas
集里解压缩出一个最新的 lib/libc/Makefile
文件,运行这个命令:
&prompt.root; cd /where/ever/you/want/to/extract/it/
&prompt.root; ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.*
对于每一个在 CTM
delta 中指定的文件,
和 选项按照命令行给定的顺序应用。
文件只有在所有的 和
被应用之后标记为合格之后
才能被 CTM 操作。
CTM 未来的计划
其中几项:
在 CTM 中使用一些认证方式,
这样来允许察觉冒充的 CTM 补丁。
整理 CTM 的选项,
它们变得杂乱而违反直觉了。
杂项
也有一系列的
ports collection 的 deltas,但是人们对它的兴致还没有那么高。
CTM 镜像
CTM/&os; 可以在下面的镜像站点通过匿名
FTP 下载。如果您选择通过匿名 FTP 获取 CTM,
请试着使用一个离您较近的站点。
如果有问题,请联系 &a.ctm-users.name;
邮件列表。
加利福尼亚州,旧金山湾区,官方源代码
南非,旧的 deltas 的备份服务器
中国台湾
如果您在您附近找不到镜像或者镜像不完整,
试着使用搜索引擎比如
alltheweb.
使用 CVSup
概述
CVSup 是一个用于从远程服务器主机上的主
CVS 仓库发布和升级源代码树的软件包。
&os; 的源代码维护在加利福尼亚州一台主开发服务器的 CVS 仓库里。
有了 CVSup, &os;
用户可以很容易的保持他们自己的源代码树更新。
CVSup 使用所谓的升级
pull 模式。在 pull
模式下,客户端在需要的时候向服务器端请求更新。
服务器被动的等待客户端的升级请求。
因此所有的升级都是客户端发起的。
服务器决不会发送未请求的升级。用户必须手动运行
CVSup 客户端获取更新,
或者设置一个 cron 作业来让它以固定的规律自动运行。
术语 CVSup用大写字母写正是表示,
代表了完整的软件包。 它的主要组件是运行在每个用户机器上的客户端 cvsup,
和运行在每个 &os; 镜像站点上的服务器端 cvsupd。
当您阅读 &os; 文档和邮件列表时,您可能会看见
sup。
Sup 是
CVSup 的前身,有着相似的目的。
CVSup 使用很多和 sup 相同的方式,
而且, 它还是用使用和 sup 的兼容的配置文件。
Sup 已经不再被 &os; 项目使用了,
因为 CVSup 既快又有更好的灵活性。
csup 是用 C 语言对
CVSup 软件的重写。 它最大的好处是,
这个程序更快一些, 并且也不需要依赖于
Modula-3 语言, 因此也就不需要安装后者。 另外, 如果您使用 &os; 6.2
或更新版本, 就可以直接使用, 因为它成为了基本系统的一部分。
较早的 &os; 版本的基本系统中并不包含 &man.csup.1;, 但可以通过
net/csup port 或预编译包来安装。
假如您决定使用
csup, 则可以跳过安装 CVSup
这一步, 并在文章中余下部分提到的 CVSup 改为
csup。
安装
安装 CVSup 最简单的方式就是使用
&os; packages collection
中预编译的 net/cvsup 包。
如果您想从源代码构建 CVSup,
您可以使用 net/cvsup
port。但是预先警告一下:
net/cvsup port 依赖于 Modula-3
系统,会花费相当的时间和磁盘空间来下载编译。
如果想在没有安装 &xfree86;
或 &xorg; 的计算机, 例如服务器上使用
CVSup, 则只能使用不包含
CVSup GUI
的 net/cvsup-without-gui。
如果希望在 &os; 6.1 或更早版本中安装 csup,
则可以从 &os; 的 packages collection 中安装预编译的
net/csup 包; 如果希望自行从源代码编译
csup,
也可以用 net/csup
port 来安装。
CVSup 配置
CVSup 的操作被一个叫做
supfile 的配置文件所控制。
在目录 /usr/share/examples/cvsup/
下面有一些示例的 supfiles。
supfile 中的信息解答了
CVSup 下面的几个问题:
您想接收
哪些文件?
您想要它们的
哪个版本?
您想从哪里
获取它们?
您想把它们
放在您自己机器的什么地方?
您想把
您的状态文件放在哪?
在下面的章节里,我们通过依次回答这些问题来创建一个典型的
supfile 文件。首先,我们描述一下
supfile 的整体构成。
supfile 是个文本文件。注释用
# 开头,至行尾有效。
空行和只包含注释的行会被忽略。
每个保留行描述一批用户希望接收的文件。
每行以 collection
,
由服务器端定义的合理的文件分组,的名字开头。
collection 的名字告诉服务器您想要的文件。
collection 名字结束或者有更多的字段,用空格分隔。
这些字段回答了上面列出的问题。
字段类型有两种:标记字段和值字段。
标记字段由独立的关键字组成,比如,
delete 或者
compress。值字段也用关键字开头,
关键字后面跟 = 和第二个词而没有空格。
例如,release=cvs 是一个值字段。
一个典型的 supfile 往往接收多于一个的
collection。创建
supfile 的一种方式是明确的为每一个
collection 指定相关的字段。然而,这样使得
supfile 的行变得特别长,很不方便,
因为 supfile 中的所有 collection 的大部分
字段都是相同的。
CVSup 提供了一个默认机制来避免
这些问题。用特定的伪 collection 名 *default
开头的行可以被用来设置标记和值为 supfile
中随后的 collection 中的默认值。
默认值可以通过为这个 collection 自身指定不同的值来对单个的
collection 覆盖设置,
也可以在 mid-supfile 中通过附加的
*default 行改变或扩充。
知道了这些,我们现在就可以开始创建一个
用于接收和升级 &os;-CURRENT 主源代码树的
supfile 文件了。
您想接收哪些文件?
通过 CVSup 可用的文件组织成叫做
collections
的名称组。
这些可用的 collection 在 随后的章节 中描述。
在这个例子里,
我们希望接收 &os; 系统的完整的主代码树。
有一个单独的大的 collection
src-all 让我们完成这个。
创建我们的
supfile 的第一步,
我们简单的列出这些 collection,每个一行(在这个例子里,
只有一行):
src-all
您想要他们的
哪个版本?
通过 CVSup,您实际上可以接收
曾经存在的源代码的任何版本。
这是有可能的,因为
cvsupd 服务器直接通过
CVS 仓库工作,那包含了所有的版本。您可以
用 tag= 和 值字段
指定一个您想要的版本。
仔细的正确指定任何 tag=
字段。有一些 tag 只对特定的 collection 文件合法。
如果您指定了一个不正确的或者
拼写错误的 tag,CVSup
会删除您可能不想删除的文件。
特别地,对 ports-*
collection 只使用
tag=.。
tag= 字段在仓库中表示为一个符号标签。
有两种标签,修订标签和分支标签。
修订标签代表一个特定的修订版本。
它的含义是一成不变的。
分支标签,另一方面,代表给定开发线上给定时间的最新修订。
因为分支标签不代表一个特定的修订版本,
它明天的含义就可能和今天的有所不同。
包含了用户可能感兴趣的分支标签。
当在 CVSup 的配置文件中指定标签的时候,必须用
tag= 开头
(RELENG_4 会变成
tag=RELENG_4)。
记住只有 tag=. 可以用于
Ports Collection。
注意像看到的那样正确的输入标签名。
CVSup 不能辨别合法和不合法标签。
如果您拼写错了标签名,
CVSup
会像您指定了一个没有任何文件的合法标签一样工作,
那会删除您已经存在的代码。
当您指定一个分支标签的时候,您通常会收到开发线上文件的最新版本。
如果您希望接收一些过时的版本,您可以通过用
值字段指定一个日期来做到。
&man.cvsup.1; 手册页解释了如何来做。
对于我们的示例来说,我们希望接收 &os;-CURRENT。
我们在我们的
supfile 的开头添加这行:
*default tag=.
有一个重要的特例,
如果您既没指定 tag= 字段也没指定
date= 字段的情况。这种情况下,
您会收到直接来自于服务器 CVS 仓库的真实的 RCS 文件,
而不是某一特定版本。
开发人员一般喜欢这种操作模式。
通过在他们的系统上维护一份仓库自身的副本,
他们可以浏览修订历史以及检查文件过去的版本。
然而,这个好处是以大量的磁盘空间为代价的。
您想从哪里获取他们?
我们使用 host= 字段来告诉
cvsup 从哪里获取更新。
任何一个 CVSup 镜像站点都可以,
虽然您应该选择一个离您比较近的站点。
在这个例子里我们将使用一个虚拟的 &os; 发布站点,
cvsup99.FreeBSD.org:
*default host=cvsup99.FreeBSD.org
您需要在运行 CVSup
之前把这个改成一个实际存在的站点。
在任何 cvsup 运行的特定时刻,
您都可以在命令行上使用 选项来覆盖主机设置。
您想把它们放在
您自己机器的什么地方?
prefix= 字段告诉
cvsup 把接收的文件放在哪里。
在这个例子里,我们把源代码文件直接放进我们的主源代码树,
/usr/src。
src 目录已经隐含在我们选择接收的 collection 里了,
所以正确的写法是:
*default prefix=/usr
cvsup 在哪里维护它的状态文件?
CVSup 客户端在被叫做 base
的目录里维护了几个状态文件。 这些文件帮助
CVSup 更有效的工作,
通过跟踪您已经接收到哪些更新的方式。
我们将使用标准的 base 目录,
/var/db:
*default base=/var/db
如果您的 base 目录还不存在,现在最好创建它。
如果 base 目录不存在,cvsup
客户端会拒绝工作。
其他的 supfile
设置:
在 supfile
中有一些其他选项需要介绍一下:
*default release=cvs delete use-rel-suffix compress
release=cvs 显示服务器应该从 &os; 的主 CVS 仓库中获取信息。
事实上总是这样的,但是也有可能会超出这个讨论的范围。
delete 给
CVSup 权限删除文件。
您应该总是指定这个,这样
CVSup
可以保证您的源代码树完全更新。CVSup
很小心的只删除那些不再依赖的文件。
您拥有的任何额外的文件会被严格的保留。
use-rel-suffix 是 ... 不可思议的。
如果您真的想了解它,查看 &man.cvsup.1; 手册页。
否则,就指定而不用担心这个。
compress 启用 gzip 风格的信道压缩。
如果您的网络连接是 T1 或者更快, 您可能不想使用压缩。
否则,它非常有帮助。
把它们放在一起:
这是我们的示例的完整 supfile
文件:
*default tag=.
*default host=cvsup99.FreeBSD.org
*default prefix=/usr
*default base=/var/db
*default release=cvs delete use-rel-suffix compress
src-all
refuse 文件
像上面提到的,CVSup 使用一种
pull 方法。基本上,这意味着您要连接到
CVSup 服务器,服务器说,
这有些您能下载的东西
...
,然后您的客户端反应好,我要这个,
这个,这个,还有这个。
在默认的配置中,
CVSup 客户端会取回您在配置文件中选定的
collection 和标签的每个文件。
然而,并不总是您想要的,
尤其是您在同步 doc,ports,或者
www 树 — 大部分人都不能阅读四种或者五种
语言,因此他们不需要下载特定语言的文件。
如果您在 CVSup Ports Collection,您
可以通过单独指定每个 collection 来避免这个
(比如,ports-astrology,
ports-biology,等等取代简单的说明
ports-all)。然而,因为 doc
和 www 树没有特定语言的 collection,您必须
使用 CVSup 许多极好的特性之一:
refuse 文件。
refuse 文件本质上是告诉
CVSup 它不应该从 collection
中取得某些文件;换句话说,它告诉客户端
拒绝 来自服务器的特定的文件。
refuse 文件可以在
base/sup/
中找到(或者,如果您没有,应该创建一个)。
base 在您的 supfile 中定义;
默认情况下,base 就是
/var/db,
这意味着默认的 refuse 文件就是
/var/db/sup/refuse。
refuse 文件的格式很简单;
它仅仅包含您不希望下载的文件和目录名。
例如,如果您除了英语和德语之外不会讲其他语言,
而且也不打算阅读德文的文档翻译版本,
则可以把下面这些放在您的
refuse 文件里:
doc/bn_*
doc/da_*
doc/de_*
doc/el_*
doc/es_*
doc/fr_*
doc/hu_*
doc/it_*
doc/ja_*
doc/mn_*
doc/nl_*
doc/no_*
doc/pl_*
doc/pt_*
doc/ru_*
doc/sr_*
doc/tr_*
doc/zh_*
等等其他语言(您可以通过浏览
&os;
CVS 仓库找到完整的列表)。
有这个非常有用的特性,那些慢速连接或者要为他们的 Internet
连接按时付费的用户就可以节省宝贵的时间因为他们不再需要
下载那些从来不用的文件。要了解
refuse 文件的更多信息以及其它
CVSup 的优雅的特性,请浏览它的
手册页。
运行 CVSup
您现在准备尝试升级了。命令很简单:
&prompt.root; cvsup supfile
supfile
的位置当然就是您刚刚创建的 supfile 文件名啦。
如果您在 X11 下面运行,cvsup
会显示一个有一些可以做平常事情的按钮的 GUI 窗口。
按 go 按钮,然后看着它运行。
在这个例子里您将要升级您目前的
/usr/src 树,您将需要
用 root 来运行程序,这样
cvsup 有需要的权限来更新您的文件。
刚刚创建了您的配置文件,又从来没有使用过这个程序,
紧张不安是可以理解的。有一个简单的方法不改变您当前的文件
来做一次试验性的运行。只要在方便的地方创建一个
空目录,并在命令行上作为一个额外的参数说明:
&prompt.root; mkdir /var/tmp/dest
&prompt.root; cvsup supfile /var/tmp/dest
您指定的目录会作为所有文件更新的目的路径。
CVSup 会检查您在
/usr/src 中的文件,但是不会修改或
删除。任何文件更新都会被放到
/var/tmp/dest/usr/src 里了。
在这种方式下运行 CVSup 也会把它的 base
目录状态文件保持原样。这些文件的新版本
会被写到指定的目录。
因为您有
/usr/src 目录的读权限,所以执行这种试验性的运行
甚至不需要使用 root 用户。
如果您没有运行 X11 或者不喜欢 GUI,
当您运行 cvsup 的时候需要在命令行添加
两个选项:
&prompt.root; cvsup -g -L 2 supfile
告诉
CVSup 不要使用 GUI。如果您
没在运行 X11 这个是自动的,否则您必须指定它。
告诉
CVSup 输出所有正在升级的文件的细节。
有三个等级可以选择,从 到
。默认是 0,意味着除了错误消息
什么都不输出。
还有许多其它的选项可用。想要一个简短的列表,
输入 cvsup -H。要查看更详细的描述,
请查看手册页。
一旦您对升级工作的方式满意了,您就
可以使用 &man.cron.8; 来安排规则的运行
CVSup。
很显然的,您不应该让 CVSup
通过 &man.cron.8; 运行的时候使用它的 GUI。
CVSup 文件 collection
CVSup 可用的文件 collection
是分级组织的。
有几个大的 collection,然后它们有分成更小的子
collection。接收一个大的 collection 等同于
接收它的每一个子 collection。
collection 的等级关系在下面列表中通过缩进的使用
反映出来。
最常用的 collection 是
src-all,和
ports-all。其它的 collection 只被有着特定
目的的小部分人使用,
有些站点可能不全部支持。
cvs-all release=cvs
&os; 主 CVS 仓库,包含
密码系统的代码。
distrib release=cvs
&os; 发行版本和镜像相关的
文件。
doc-all release=cvs
&os; 使用手册和其它文档的源代码。
其中不包含 &os; web 站点的文件。
ports-all release=cvs
&os; Ports Collection。
如果您不想升级全部的
ports-all(整个 ports 树),
而只是使用下面列出的一个子集,
请确保您总是升级了
ports-base 子 collection!
无论何时在 ports 构建下层构造有所改变的时候都会通过
ports-base 表现出来,事实上某些
改变会很快的被实际的
ports 使用,因此,如果您只升级了
实际的
ports 而他们使用了一些新的特性,
就有极大的可能编译会因一些神秘的错误信息而失败。
这种情况下非常快速的要做的事情
就是确保您的
ports-base 子 collection 更新到
最新。
要自行构建 ports/INDEX, 您
必须 接受
ports-all (完整的 ports tree)。
在部分 ports tree 上构建 ports/INDEX
是不被支持的。 请参见
FAQ。
ports-accessibility
release=cvs
用以帮助残疾用户的软件。
ports-arabic
release=cvs
阿拉伯语支持。
ports-archivers
release=cvs
存档工具。
ports-astro
release=cvs
天文相关的 ports。
ports-audio
release=cvs
声音支持。
ports-base
release=cvs
Ports Collection 构建下部构造 -
位于 /usr/ports 的
Mk/ 和
Tools/ 子目录的
各种各样的文件。
请查看
重要警告:您应该
总是更新这个
子 collection,无论您更新
&os; Ports Collection 的任何部分的时候!
ports-benchmarks
release=cvs
基准。
ports-biology
release=cvs
生物学。
ports-cad
release=cvs
计算机辅助设计工具。
ports-chinese
release=cvs
中文语言支持。
ports-comms
release=cvs
通信软件。
ports-converters
release=cvs
字符编码转换。
ports-databases
release=cvs
数据库
ports-deskutils
release=cvs
计算机发明前常出现在桌面上的东西。
ports-devel
release=cvs
开发工具。
ports-dns
release=cvs
DNS 相关软件。
ports-editors
release=cvs
编辑器
ports-emulators
release=cvs
其它操作系统的模拟器
ports-finance
release=cvs
货币,金融相关应用程序。
ports-ftp
release=cvs
FTP 客户端和服务器端工具。
ports-games
release=cvs
游戏
ports-german
release=cvs
德语支持。
ports-graphics
release=cvs
图形图像工具。
ports-hebrew
release=cvs
希伯来语支持。
ports-hungarian
release=cvs
匈牙利语言支持。
ports-irc
release=cvs
Internet 多线交谈(IRC)工具。
ports-japanese
release=cvs
日语支持。
ports-java
release=cvs
&java; 工具。
ports-korean
release=cvs
韩国语言支持。
ports-lang
release=cvs
编程语言。
ports-mail
release=cvs
邮件软件。
ports-math
release=cvs
数值计算软件。
ports-mbone
release=cvs
MBone 应用程序。
ports-misc
release=cvs
杂样工具。
ports-multimedia
release=cvs
多媒体软件。
ports-net
release=cvs
网络软件。
ports-net-im
release=cvs
即时消息软件。
ports-net-mgmt
release=cvs
网管软件。
ports-net-p2p
release=cvs
对等网 (peer to peer network) 应用。
ports-news
release=cvs
USENET 新闻软件。
ports-palm
release=cvs
Palm
系列软件支持。
ports-polish
release=cvs
波兰语支持。
ports-ports-mgmt
release=cvs
用于管理 ports 和预编译包的工具。
ports-portuguese
release=cvs
葡萄牙语支持。
ports-print
release=cvs
打印软件。
ports-russian
release=cvs
俄语支持。
ports-science
release=cvs
科学计算。
ports-security
release=cvs
安全工具。
ports-shells
release=cvs
命令行 shell。
ports-sysutils
release=cvs
系统实用工具。
ports-textproc
release=cvs
文本处理工具(不
包含桌面出版)。
ports-ukrainian
release=cvs
乌克兰语支持。
ports-vietnamese
release=cvs
越南语支持。
ports-www
release=cvs
万维网(WWW)相关软件。
ports-x11
release=cvs
支持 X window 系统的 ports。
ports-x11-clocks
release=cvs
X11 时钟。
ports-x11-drivers
release=cvs
X11 驱动程序。
ports-x11-fm
release=cvs
X11 文件管理器。
ports-x11-fonts
release=cvs
X11 字体和字体工具。
ports-x11-toolkits
release=cvs
X11 工具包。
ports-x11-servers
release=cvs
X11 服务器。
ports-x11-themes
release=cvs
X11 主题。
ports-x11-wm
release=cvs
X11 窗口管理器。
projects-all release=cvs
&os; 内部项目的代码库。
src-all release=cvs
&os; 主代码,包含密码系统的代码。
src-base
release=cvs
/usr/src
顶层的各式各样的文件。
src-bin
release=cvs
但用户模式下可能用到的用户工具
(/usr/src/bin)。
src-cddl
release=cvs
采用了
CDDL 授权的实用工具和函数库
(/usr/src/cddl)。
src-contrib
release=cvs
&os; 项目之外的工具和库,通常在 &os; 中不作修改
(/usr/src/contrib)。
src-crypto release=cvs
&os; 项目之外的
密码系统工具和库,通常在 &os; 中不作修改
(/usr/src/crypto)。
src-eBones release=cvs
Kerberos 和 DES
(/usr/src/eBones)。
目前的 &os; 中不再使用使用。
src-etc
release=cvs
系统配置文件
(/usr/src/etc)。
src-games
release=cvs
游戏
(/usr/src/games)。
src-gnu
release=cvs
GNU 公共许可协议的工具
(/usr/src/gnu)。
src-include
release=cvs
头文件
(/usr/src/include)。
src-kerberos5
release=cvs
Kerberos5 安全包
(/usr/src/kerberos5)。
src-kerberosIV
release=cvs
KerberosIV 安全包
(/usr/src/kerberosIV)。
src-lib
release=cvs
库
(/usr/src/lib)。
src-libexec
release=cvs
通常被其它程序调用的系统程序
(/usr/src/libexec)。
src-release
release=cvs
生成 &os; 版本必需的文件
(/usr/src/release)。
src-rescue
release=cvs
用于紧急修复的静态联编的程序; 请参见 &man.rescue.8;
(/usr/src/rescue)。
src-sbin release=cvs
但用户模式的系统工具
(/usr/src/sbin)。
src-secure
release=cvs
密码相关库和命令
(/usr/src/secure)。
src-share
release=cvs
跨多个平台的共享的文件
(/usr/src/share)。
src-sys
release=cvs
内核
(/usr/src/sys)。
src-sys-crypto
release=cvs
内核密码系统代码
(/usr/src/sys/crypto)。
src-tools
release=cvs
维护 &os; 的各种各样的工具
(/usr/src/tools)。
src-usrbin
release=cvs
用户工具
(/usr/src/usr.bin)。
src-usrsbin
release=cvs
系统工具
(/usr/src/usr.sbin)。
www release=cvs
&os; WWW 站点的源代码。
distrib release=self
CVSup 服务器的
配置文件。用于 CVSup
镜像站点。
gnats release=current
GNATS bug 跟踪数据库。
mail-archive release=current
&os; 邮件列表存档。
www release=current
预处理过的 &os; WWW 站点文件(不是源文件)。
用于 WWW 镜像站点。
更多信息
CVSup FAQ 以及关于
CVSup 的其他信息, 请查看
CVSup 主页。
多数与 &os; 有关的
CVSup 讨论会在
&a.hackers; 进行。 这个软件的新版本会在那里和 &a.announce; 公布。
如果对于
CVSup 有任何问题, 或希望提交 bug 报告, 请参阅
CVSup FAQ。
CVSup 站点
&os; 的 CVSup 服务器运行于
下列站点:
&chap.mirrors.cvsup.inc;
CVS 标签
当使用 cvs 或者
CVSup
获取和升级源代码的时候,必须指定一个修订标签。
修订标签代表 &os; 开发的一个特定分支,
或者一个特定的时间点。第一种叫做
分支标签
,第二种叫做
版本标签
。
分支标签
所有这些,除了 HEAD (这个总是
合法标签)以外,只适用于 src/
树。ports/,doc/,和
www/ 树没有分支。
HEAD
主线的符号名,或者说 &os;-CURRENT。
当没有指定修订版本的时候也是默认的。
在 CVSup 里,这个标签通过
一个 . 来反映出来(不是标点,而是一个
. 字符)。
在 CVS 里,当没有修订标签指定时这是默认的。
在一台 STABLE 机器上检出或者升级到 CURRENT 源代码
通常不是
一个好主意,除非这是您的本意。
RELENG_8
这是 &os;-8.X 的开发分支,
也被称作 &os; 8-STABLE。
RELENG_8_0
&os;-8.0 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_7
这是 &os;-7.X 的开发分支,
也被称作 &os; 7-STABLE。
RELENG_7_3
&os;-7.3 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_7_2
&os;-7.2 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_7_1
&os;-7.1 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_7_0
&os;-7.0 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_6
这是 &os;-6.X 的开发分支,
也被称作 &os; 6-STABLE。
RELENG_6_4
&os;-6.4 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_6_3
&os;-6.3 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_6_2
&os;-6.2 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_6_1
&os;-6.1 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_6_0
&os;-6.0 的发行版分支, 只用于安全公告,
以及其他重要更新。
RELENG_5
这是 &os;-5.X 的开发分支,
也被称作 &os; 5-STABLE。
RELENG_5_5
&os;-5.5 安全分支。 只被安全公告和其它重要更新使用。
RELENG_5_4
&os;-5.4 安全分支。 只被安全公告和其它重要更新使用。
RELENG_5_3
&os;-5.3 安全分支。 只被安全公告和其它重要更新使用。
RELENG_5_2
针对 &os;-5.2 和 &os;-5.2.1 的安全分支,
只被安全公告和其它重要更新使用。
RELENG_5_1
针对 &os;-5.1 的发行版本分支,
只被安全公告和其它重要更新使用。
RELENG_5_0
针对 &os;-5.0 的发行版本分支,
只被安全公告和其它重要更新使用。
RELENG_4
&os;-4.X 开发线,也被叫做
&os;-STABLE。
RELENG_4_11
&os;-4.11 安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_10
&os;-4.10 安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_9
&os;-4.9 安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_8
&os;-4.8 安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_7
&os;-4.7 安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_6
&os;-4.6 和 4.6.2 的安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_5
&os;-4.5 安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_4
&os;-4.4 安全分支。 只被安全公告和其它重要更新使用。
RELENG_4_3
&os;-4.3 安全分支。 只被安全公告和其它重要更新使用。
RELENG_3
&os;-3.X 的开发线,也被叫做
3.X-STABLE。
RELENG_2_2
&os;-2.2.X 的开发线, 也被叫做
2.2-STABLE。 这个分支基本上已经过时了。
版本标签
当一个特定的 &os; 版本发行时,
这些标签代表了一个指定的时间点。发布工程进程在
Release Engineering
Information 和
Release
Process 文档中被详细描述。
src
树使用以 RELENG_ 开头的标签。
ports 和
doc 树使用以
RELEASE 开头的标签。
最后, www 树上不会有任何特定发行版的标签。
RELENG_8_0_0_RELEASE
&os; 8.0
RELENG_7_3_0_RELEASE
&os; 7.3
RELENG_7_2_0_RELEASE
&os; 7.2
RELENG_7_1_0_RELEASE
&os; 7.1
RELENG_7_0_0_RELEASE
&os; 7.0
RELENG_6_4_0_RELEASE
&os; 6.4
RELENG_6_3_0_RELEASE
&os; 6.3
RELENG_6_2_0_RELEASE
&os; 6.2
RELENG_6_1_0_RELEASE
&os; 6.1
RELENG_6_0_0_RELEASE
&os; 6.0
RELENG_5_5_0_RELEASE
&os; 5.5
RELENG_5_4_0_RELEASE
&os; 5.4
RELENG_4_11_0_RELEASE
&os; 4.11
RELENG_5_3_0_RELEASE
&os; 5.3
RELENG_4_10_0_RELEASE
&os; 4.10
RELENG_5_2_1_RELEASE
&os; 5.2.1
RELENG_5_2_0_RELEASE
&os; 5.2
RELENG_4_9_0_RELEASE
&os; 4.9
RELENG_5_1_0_RELEASE
&os; 5.1
RELENG_4_8_0_RELEASE
&os; 4.8
RELENG_5_0_0_RELEASE
&os; 5.0
RELENG_4_7_0_RELEASE
&os; 4.7
RELENG_4_6_2_RELEASE
&os; 4.6.2
RELENG_4_6_1_RELEASE
&os; 4.6.1
RELENG_4_6_0_RELEASE
&os; 4.6
RELENG_4_5_0_RELEASE
&os; 4.5
RELENG_4_4_0_RELEASE
&os; 4.4
RELENG_4_3_0_RELEASE
&os; 4.3
RELENG_4_2_0_RELEASE
&os; 4.2
RELENG_4_1_1_RELEASE
&os; 4.1.1
RELENG_4_1_0_RELEASE
&os; 4.1
RELENG_4_0_0_RELEASE
&os; 4.0
RELENG_3_5_0_RELEASE
&os;-3.5
RELENG_3_4_0_RELEASE
&os;-3.4
RELENG_3_3_0_RELEASE
&os;-3.3
RELENG_3_2_0_RELEASE
&os;-3.2
RELENG_3_1_0_RELEASE
&os;-3.1
RELENG_3_0_0_RELEASE
&os;-3.0
RELENG_2_2_8_RELEASE
&os;-2.2.8
RELENG_2_2_7_RELEASE
&os;-2.2.7
RELENG_2_2_6_RELEASE
&os;-2.2.6
RELENG_2_2_5_RELEASE
&os;-2.2.5
RELENG_2_2_2_RELEASE
&os;-2.2.2
RELENG_2_2_1_RELEASE
&os;-2.2.1
RELENG_2_2_0_RELEASE
&os;-2.2.0
AFS 站点
&os; 的 AFS 服务器运行于下面的站点:
瑞典
文件的路径是:
/afs/stacken.kth.se/ftp/pub/FreeBSD/
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
维护者 ftp@stacken.kth.se
rsync 站点
下面的站点让 &os; 可以通过 rsync 协议下载。
rsync 实用程序和
&man.rcp.1; 的工作方式很相像,
但是有更多的选项,使用 rsync 远程更新协议只传输
两份文件的不同之处,
因此能够大幅度的提高网络同步速率。
如果您是 &os; FTP 服务器或者 CVS 仓库的镜像站点,
这一点非常有用。
rsync 套件可以工作在许多种
操作系统上,在 &os; 上,查看
net/rsync
port 或者使用 package。
捷克共和国
rsync://ftp.cz.FreeBSD.org/
可用的 collection:
ftp: &os; FTP 服务器的
部分镜像。
&os;: &os; FTP 服务器的
完整镜像。
荷兰
rsync://ftp.nl.FreeBSD.org/
可用的 collection:
&os;: 对于
&os; FTP 服务器的完整镜像。
俄罗斯
rsync://ftp.mtu.ru/
可用的 collections:
&os;: 完整的 &os; FTP
服务器镜像。
&os;-gnats: GNATS 问题追踪数据库。
&os;-Archive: &os; 档案的 FTP
服务器镜像。
台湾地区 (中国)
rsync://ftp.tw.FreeBSD.org/
rsync://ftp2.tw.FreeBSD.org/
rsync://ftp6.tw.FreeBSD.org/
可用的 collection:
&os;: &os; FTP
服务器的完整镜像。
英国
rsync://rsync.mirrorservice.org/
可用的 collection:
sites/ftp.FreeBSD.org: &os; FTP 服务器
的完整镜像。
美国
rsync://ftp-master.FreeBSD.org/
服务器只供 &os; 主镜像站点使用。
可用的 collection:
&os;:&os; FTP 服务器的主要存档。
acl:&os; 主 ACL
列表。
rsync://ftp13.FreeBSD.org/
可用的 collection:
&os;:&os; FTP 服务器的完整
镜像。
diff --git a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml
index 1e26cb1ed1..fd977af308 100644
--- a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml
@@ -1,4854 +1,4854 @@
Murray
Stokely
Reorganized by
网络服务器
概要
本章将覆盖某些在 &unix; 系统上常用的网络服务。话题将会涉及
如何安装、配置、测试和维护多种不同类型的网络服务。本章节中将提
供大量配置文件的样例,期望能够对您有所裨益。
在读完本章之后,您将会知道:
如何管理 inetd。
如何设置运行一个网络文件系统。
如何配置一个网络信息服务器以共享用户帐号。
如何通过DHCP自动配置网络。
如何配置一个域名服务器。
如何设置Apache HTTP 服务器。
如何设置文件传输(FTP)服务器。
如何使用Samba为 &windows;
客户端设置文件和打印服务。
如何同步时间和日期,以及如何设置使用NTP协议的时间服务器。
如何配置标准的日志守护进程,
syslogd, 接受远程主机的日志。
在阅读此章节之前,您应当:
理解有关/etc/rc中脚本的基本知识。
熟悉基本网络术语。
懂得如何安装额外的第三方软件()。
Chern
Lee
Contributed by
为 &os; 6.1-RELEASE 进行了更新, 由
The &os; Documentation Project
inetd 超级服务器
总览
&man.inetd.8; 有时也被称作 Internet
超级服务器
, 因为它可以为多种服务管理连接。
当 inetd 收到连接时,
它能够确定连接所需的程序, 启动相应的进程,
并把 socket 交给它 (服务 socket 会作为程序的标准输入、
输出和错误输出描述符)。 使用
inetd 来运行那些负载不重的服务有助于降低系统负载,
因为它不需要为每个服务都启动独立的服务程序。
一般说来, inetd 主要用于启动其它服务程序,
但它也有能力直接处理某些简单的服务,
例如 chargen、
auth, 以及
daytime。
这一节将介绍关于如何通过命令行选项, 以及配置文件
/etc/inetd.conf 来对
inetd 进行配置的一些基础知识。
设置
inetd 是通过 &man.rc.8; 系统启动的。
inetd_enable 选项默认设为
NO, 但可以在安装系统时,
由用户根据需要通过 sysinstall 来打开。
将:
inetd_enable="YES"
或
inetd_enable="NO"
写入
/etc/rc.conf 可以启用或禁用系统启动时
inetd 的自动启动。 命令:
&prompt.root; /etc/rc.d/inetd rcvar
可以显示目前的设置。
此外, 您还可以通过
inetd_flags 参数来向 inetd
传递额外的其它参数。
命令行选项
与多数服务程序类似, inetd
也提供了为数众多的用以控制其行为的参数。 完整的参数列表如下:
inetd
这些参数都可以通过
/etc/rc.conf 的
inetd_flags 选项来传给 inetd。
默认情况下,
inetd_flags 设为
-wW -C 60, 者表示希望为
inetd 的服务启用 TCP wrapping,
并阻止来自同一 IP 每分钟超过 60 次的请求。
初学的用户可能会很高兴地发现这些选项通常并不需要进行修改,
前面提到的速率限制选项在您的服务器收到过量请求的连接时,
则会有效地发挥作用。 完整的参数列表,
可以在 &man.inetd.8; 联机手册中找到。
-c maximum
指定单个服务的最大并发访问数量,默认为不限。
也可以在此服务的具体配置里面通过改掉。
-C rate
指定单个服务一分钟内能被单个IP地址调用的最大次数,
默认不限。也可以在此服务的具体配置里面通过
改掉。
-R rate
指定单个服务一分钟内能被调用的最大次数,默认为256。
设为0 则允许不限次数调用。
-s maximum
指定同一 IP 同时请求同一服务时允许的最大值; 默认值为不限制。
您可以通过
参数来以服务为单位进行限制。
inetd.conf
对于 inetd 的配置,
是通过 /etc/inetd.conf 文件来完成的。
在修改了
/etc/inetd.conf 之后, 可以使用下面的命令来强制
inetd 重新读取配置文件:
重新加载 inetd
配置文件
&prompt.root; /etc/rc.d/inetd reload
配置文件中的每一行都是一个独立的服务程序。 在这个文件中, 前面有
#
的内容被认为是注释。
/etc/inetd.conf 文件的格式如下:
service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
user[:group][/login-class]
server-program
server-program-arguments
下面是针对 IPv4 的 &man.ftpd.8; 服务的例子:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
service-name
指明各个服务的服务名。其服务名必须与/etc/services中列出的一致。
这将决定inetd会监听哪个port。
一旦有新的服务需要添加,必须先在/etc/services里面添加。
socket-type
可以是stream、dgram、raw或者
seqpacket。 stream
用于基于连接的 TCP 服务;而 dgram 则用于使用 UDP 协议的服务。
protocol
下列之一:
协议
说明
tcp, tcp4
TCP IPv4
udp, udp4
UDP IPv4
tcp6
TCP IPv6
udp6
UDP IPv6
tcp46
Both TCP IPv4 and v6
udp46
Both UDP IPv4 and v6
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
指明从inetd
里头调用的服务是否可以自己处理socket.
socket类型必须使用,
而stream socket daemons, 由于通常使用多线程方式,应当使用
. 通常把多个
socket 丢给单个服务进程, 而 则
会为每个新的 socket 生成一个子进程。
选项能够配置
inetd 能为本服务派生出的最大子进程数量。
如果某特定服务需要限定最高10个实例, 把/10
放到后头就可以了。 指定 /0
表示不限制子进程的数量。
除了 之外,
还有两个选项可以限制来自同一位置到特定服务的最大连接数。
可以限制特定 IP
地址每分钟的总连接数, 例如, 限制任何
IP 地址每分钟最多连接十次。
则可以限制为某一 IP 地址在任何时候所启动的子进程数量。
这些选项对于防止针对服务器有意或无意的资源耗竭和拒绝服务 (DoS)
攻击十分有用。
这个字段中, 必须指定 或
两者之一。 而
、
和
则是可选项。
流式多线程服务, 并且不配置任何
、
或
限制时,
其配置为: nowait。
同一个服务, 但希望将服务启动的数量限制为十个时,
则是: nowait/10。
同样配置, 限制每个 IP 地址每分钟最多连接二十次,
而同时启动的子进程最多十个, 应写作:
nowait/10/20。
下面是 &man.fingerd.8; 服务的默认配置:
finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
最后这个例子中, 将子进程数限制为
100 个, 而任意 IP 最多同时建立 5 个连接:
nowait/100/0/5。
user
该开关指定服务将以什么用户身份运行。一般而言,服务运行身份是
root。基于安全目的,可以看到有些服务以
daemon身份,或者是最小特权的
nobody身份运行。
server-program
当连接到来时,执行服务程序的全路径。如果服务是由
inetd内置提供的,以代替。
server-program-arguments
当调用到时,该开关
的值通过argv[0]通过传递给服务而工作。
如果命令行为:mydaemon -d,则
mydaemon -d为
开关的值。同样的,如果服务是由inetd
内置提供的,这里还是
。
Security
随安装时所选的模式不同,
许多 inetd 的服务可能已经默认启用。
如果确实不需要某个特定的服务, 则应考虑禁用它。
在 /etc/inetd.conf 中,
将对应服务的那行前面加上 #
,
然后 重新加载
inetd 配置 就可以了。 某些服务, 例如
fingerd, 可能是完全不需要的,
因为它们提供的信息可能对攻击者有用。
某些服务在设计时是缺少安全意识的, 或者有过长或压根没有连接请求的超时机制。
这使得攻击者能够通过缓慢地对这些服务发起连接, 并耗尽可用的资源。
对于这种情况, 设置 、
或 限制,
来制约服务的行为是个好办法。
默认情况下,TCP wrapping 是打开的。参考
&man.hosts.access.5; 手册,以获得更多关于在各种 inetd
调用的服务上设置TCP限制的信息。
杂项
daytime、
time、
echo、
discard、
chargen, 以及
auth 都是由 inetd
提供的内建服务。
auth 服务提供了网络身份服务,
它可以配置为提供不同级别的服务, 而其它服务则通常只能简单的打开或关闭。
参考 &man.inetd.8; 手册获得更多信息。
Tom
Rhodes
Reorganized and enhanced by
Bill
Swingle
Written by
网络文件系统(NFS)
NFS
网络文件系统是FreeBSD支持的文件系统中的一种,
也被称为 NFS。 NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件
一样访问远端系统上的文件。
以下是NFS最显而易见的好处:
本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一
台机器上而且可以通过网络访问到。
用户不必在每个网络上机器里头都有一个home目录。Home目录
可以被放在NFS服务器上并且在网络上处处可用。
诸如软驱,CDROM,和 &iomegazip; 之类的存储设备可以在网络上面被别的机器使用。
这可以减少整个网络上的可移动介质设备的数量。
NFS是如何工作的
NFS 至少包括两个主要的部分: 一台服务器,
以及至少一台客户机, 客户机远程地访问保存在服务器上的数据。
要让这一切运转起来, 需要配置并运行几个程序。
服务器必须运行以下服务:
NFS
server (服务)
文件服务器
UNIX 客户机
rpcbind
mountd
nfsd
服务
描述
nfsd
NFS,为来自NFS客户端的
请求服务。
mountd
NFS挂载服务,处理&man.nfsd.8;递交过来的请求。
rpcbind
此服务允许
NFS 客户程序查询正在被 NFS 服务使用的端口。
客户端同样运行一些进程,比如
nfsiod。
nfsiod处理来自NFS的请求。
这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。
参考&man.nfsiod.8;手册获得更多信息。
配置NFS
NFS
configuration
NFS的配置过程相对简单。这个过程只需要
对/etc/rc.conf文件作一些简单修改。
在NFS服务器这端,确认/etc/rc.conf
文件里头以下开关都配上了:
rpcbind_enable="YES"
nfs_server_enable="YES"
mountd_flags="-r"
只要NFS服务被置为enable,mountd
就能自动运行。
在客户端一侧,确认下面这个开关出现在
/etc/rc.conf里头:
nfs_client_enable="YES"
/etc/exports文件指定了哪个文件系统
NFS应该输出(有时被称为共享
)。
/etc/exports里面每行指定一个输出的文件系统和
哪些机器可以访问该文件系统。在指定机器访问权限的同时,访问选项
开关也可以被指定。有很多开关可以被用在这个文件里头,不过不会在这
里详细谈。您可以通过阅读&man.exports.5; 手册来发现这些开关。
以下是一些/etc/exports的例子:
NFS
export examples
下面是一个输出文件系统的例子, 不过这种配置与您所处的网络环境及其配置密切相关。
例如, 如果要把 /cdrom 输出给与服务器域名相同的三台计算机
(因此例子中只有机器名, 而没有给出这些计算机的域名), 或在
/etc/hosts 文件中进行了这种配置。
标志表示把输出的文件系统置为只读。 由于使用了这个标志,
远程系统在输出的文件系统上就不能写入任何变动了。
/cdrom -ro host1 host2 host3
下面的例子可以输出/home给三个以IP地址方式表示的主机。
对于在没有配置DNS服务器的私有网络里头,这很有用。
此外, /etc/hosts 文件也可以用以配置主机名;参看 &man.hosts.5; 。
标记允许子目录被作为挂载点。
也就是说,客户端可以根据需要挂载需要的目录。
/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4
下面几行输出 /a ,以便两个来自不同域的客户端可以访问文件系统。
标记授权远端系统上的
root 用户在被输出的文件系统上以root身份进行读写。
如果没有特别指定 -maproot=root 标记,
则即使用户在远端系统上是 root 身份,
也不能修改被输出文件系统上的文件。
/a -maproot=root host.example.com box.example.org
为了能够访问到被输出的文件系统,客户端必须被授权。
请确认客户端在您的 /etc/exports 被列出。
在 /etc/exports 里头,每一行里面,输出信息和文件系统一一对应。
一个远程主机每次只能对应一个文件系统。而且只能有一个默认入口。比如,假设
/usr 是独立的文件系统。这个 /etc/exports 就是无效的:
# Invalid when /usr is one file system
/usr/src client
/usr/ports client
一个文件系统,/usr, 有两行指定输出到同一主机,
client.
解决这一问题的正确的格式是:
/usr/src /usr/ports client
在同一文件系统中, 输出到指定客户机的所有目录, 都必须写到同一行上。
没有指定客户机的行会被认为是单一主机。 这限制了你可以怎样输出的文件系统,
但对绝大多数人来说这不是问题。
下面是一个有效输出列表的例子,
/usr 和 /exports
是本地文件系统:
# 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
在修改了 /etc/exports 文件之后,
就必须让 mountd 服务重新检查它,
以便使修改生效。 一种方法是通过给正在运行的服务程序发送 HUP
信号来完成:
&prompt.root; kill -HUP `cat /var/run/mountd.pid`
或指定适当的参数来运行 mountd &man.rc.8; 脚本:
&prompt.root; /etc/rc.d/mountd onereload
关于使用 rc 脚本的细节, 请参见 。
另外, 系统重启动可以让 FreeBSD 把一切都弄好。 尽管如此,
重启不是必须的。 以 root 身份执行下面的命令可以搞定一切。
在 NFS 服务器端:
&prompt.root; rpcbind
&prompt.root; nfsd -u -t -n 4
&prompt.root; mountd -r
在 NFS 客户端:
&prompt.root; nfsiod -n 4
现在每件事情都应该就绪,以备挂载一个远端文件系统。 在这些例子里头,
服务器名字将是:server ,而客户端的名字将是: client。
如果您只打算临时挂载一个远端文件系统或者只是打算作测试配置正确与否,
只要在客户端以 root 身份执行下面的命令:
NFS
mounting
&prompt.root; mount server:/home /mnt
这条命令会把服务端的 /home 目录挂载到客户端的 /mnt 上。
如果配置正确,您应该可以进入客户端的 /mnt 目录并且看到所有服务端的文件。
如果您打算让系统每次在重启动的时候都自动挂载远端的文件系统,把那个文件系统加到
/etc/fstab 文件里头去。下面是例子:
server:/home /mnt nfs rw 0 0
&man.fstab.5; 手册里有所有可用的开关。
锁
某些应用程序 (例如 mutt)
需要文件上锁支持才能正常运行。 在使用
NFS 时, 可以用 rpc.lockd
来支持文件上锁功能。 要启用它,
需要在服务器和客户机的 /etc/rc.conf 中加入
(假定两端均已配好了 NFS):
rpc_lockd_enable="YES"
rpc_statd_enable="YES"
然后使用下述命令启动该程序:
&prompt.root; /etc/rc.d/lockd start
&prompt.root; /etc/rc.d/statd start
如果并不需要真的在 NFS 客户机和
NFS 服务器间确保上锁的语义,
可以让 NFS 客户机在本地上锁,
方法是使用 &man.mount.nfs.8; 时指定 参数。
请参见 &man.mount.nfs.8; 联机手册以了解更多细节。
实际应用
NFS 有很多实际应用。下面是比较常见的一些:
NFS
uses
多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。
在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。
这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
几台机器可以有通用的/usr/ports/distfiles 目录。
这样的话,当您需要在几台机器上安装port时,您可以无需在每台设备上下载而快速访问源码。
Wylie
Stilwell
Contributed by
Chern
Lee
Rewritten by
通过 amd 自动地挂接
amd
自动挂接服务
&man.amd.8; (自动挂接服务) 能够自动地在访问时挂接远程的文件系统。
如果文件系统在一段时间之内没有活动, 则会被
amd 自动卸下。 通过使用
amd, 能够提供一个持久挂接以外的选择,
而后者往往需要列入
/etc/fstab。
amd 通过将自己以 NFS 服务器的形式,
附加到 /host 和
/net 目录上来工作。
当访问这些目录中的文件时, amd
将查找相应的远程挂接点, 并自动地挂接。
/net 用于挂接远程 IP 地址上导出的文件系统,
而 /host 则用于挂接远程主机名上的文件系统。
访问
/host/foobar/usr 中的文件, 相当于告诉
amd 尝试挂接在主机
foobar 上导出的
/usr。
通过 amd 来挂接导出的文件系统
您可以通过使用 showmount
命令来查看远程主机上导出的文件系统。 例如,
要查看 foobar 上导出的文件系统, 可以用:
&prompt.user; showmount -e foobar
Exports list on foobar:
/usr 10.10.10.0
/a 10.10.10.0
&prompt.user; cd /host/foobar/usr
如同在前面例子中所看到的, showmount 显示了导出的
/usr。 当进入
/host/foobar/usr 这个目录时, amd
将尝试解析主机名 foobar
并自动地挂接需要的文件系统导出。
amd 可以通过启动脚本来启动, 方法是在
/etc/rc.conf 中加入:
amd_enable="YES"
除此之外, 还可以给
amd 通过
amd_flags 选项来传递额外的参数。 默认情况下,
amd_flags 为:
amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"
/etc/amd.map
文件定义了挂接导出文件系统时所使用的默认选项。
/etc/amd.conf 文件, 则定义了更多关于
amd 的高级功能选项。
请参考 &man.amd.8; 和 &man.amd.conf.5; 联机手册,
以了解进一步的情况。
John
Lind
Contributed by
与其他系统集成时的常见问题
某些特定的 ISA PC 系统上的以太网适配器上有一些限制,
这些限制可能会导致严重的网络问题, 特别是与 NFS 配合使用时。
这些问题并非 FreeBSD 所特有的, 但 FreeBSD 系统会受到这些问题的影响。
这样的问题, 几乎总是在当 (FreeBSD) PC 系统与高性能的工作站,
例如 Silicon Graphics, Inc., 和 Sun Microsystems, Inc. 的工作站联网时发生。
NFS 挂接能够正常工作, 而且一些操作也可能成功,
但服务器会很快变得对客户机不太理会,
虽然对其他客户机的请求仍然能够正常处理。
这种情况通常发生在客户端, 无论它是一个 FreeBSD 系统或是终端。
在许多系统上, 一旦发生了这样的问题, 通常没办法正常地关闭客户机。
唯一的办法通常是让终端复位, 因为这一 NFS 状况没有办法被解决。
尽管 正确的
解决办法, 是为
FreeBSD 系统配备一块高性能的、 适用的以太网适配器,
然而也有办法绕过问题并得到相对满意的结果。
如果 FreeBSD 系统是
服务器, 则在客户机挂接时, 应该指定
。 如果
FreeBSD 系统是 客户机,
则应加入 参数。 这些选项可以通过在对应的
fstab 的第四个字段加入,
以便让客户机能够自动地挂接, 或者通过 &man.mount.8; 的
参数在手工挂接时指定。
还需要注意的是另一个问题, 有时会被误认为是和上面一样的问题。
这个问题多见于 NFS 服务器和客户机在不同的网络上时。 如果是这种情况, 一定要
确定 您的路由器确实把必需的 UDP
信息路由到了目的地, 否则您将什么也做不了。
下面的例子中, fastws 是主机
(接口) 的名字, 它是一台高性能的终端, 而
freebox 是另一台主机 (接口) 的名字,
它是一个使用较低性能的以太网适配器的 FreeBSD 系统。 同时,
/sharedfs 将被导出成为 NFS
文件系统 (参见 &man.exports.5;), 而
/project
将是客户机上挂接这一导出文件系统的挂接点。 所有的应用场景中,
请注意附加选项, 例如 或
以及 可能是您的应用所需要的。
关于 FreeBSD 系统 (freebox)
作为客户机的示范 /etc/fstab 文件, 见于
freebox 之上:
fastws:/sharedfs /project nfs rw,-r=1024 0 0
在 freebox 上手工挂接:
&prompt.root; mount -t nfs -o -r=1024 fastws:/sharedfs /project
以 FreeBSD 系统作为服务器的例子, 是 fastws 上的
/etc/fstab:
freebox:/sharedfs /project nfs rw,-w=1024 0 0
在 fastws 上手工挂接的命令是:
&prompt.root; mount -t nfs -o -w=1024 freebox:/sharedfs /project
几乎所有的 16-位 以太网控制器,
都能够在没有上述读写尺寸限制的情况下正常工作。
对于那些关心到底是什么问题的人, 下面是失败如何发生的解释,
同时这也说明了为什么这是一个无法恢复的问题。 典型情况下,
NFS 会使用一个 块
为单位进行操作, 其尺寸是
8 K (虽然它可能会将操作分成更小尺寸的分片)。
由于最大的以太网包尺寸大约是 1500 字节,
因此 NFS 块
会分成多个以太网包,
虽然在更高层的代码看来它仍然是一个完整的单元,
并在接收方重新组装, 作为一个整体来
确认。 高性能的工作站,
可以将构成 NFS 单元的包迅速发出, 其节奏会快到标准允许的最大限度。
在容量较小的卡上, 后来的包会冲掉同一单元内的较早的包,
因而整个单元无法被重建或确认。 其结果是,
工作站将超时并重试, 但仍然是完整的 8 K 单元,
这一过程将无休止地重复下去。
如果将单元尺寸限制在以太网包尺寸之下,
我们就能够确保每一个以太网包都能够被独立地接收和确认,
从而避免了上面的死锁情形。
溢出在高性能工作站将数据库投向 PC 系统时仍会发生,
但在更好的网卡上, 能够保证这类溢出不会在每一个 NFS
单元
上都发生。 当出现溢出时,
被影响的单元被重传, 因而此时有很大的机会它将被正确接收、
重组, 并确认。
Bill
Swingle
Written by
Eric
Ogren
Enhanced by
Udo
Erdelhoff
网络信息服务 (NIS/YP)
它是什么?
NIS
Solaris
HP-UX
AIX
Linux
NetBSD
OpenBSD
NIS,
表示网络信息服务 (Network Information Services),
最初由 Sun Microsystems 开发, 用于 &unix;
(最初是 &sunos;) 系统的集中管理。 目前,
它基本上已经成为了业界标准; 所有主流的类 &unix; 系统
(&solaris;, HP-UX, &aix;, Linux, NetBSD, OpenBSD, FreeBSD,
等等) 都支持 NIS。
黄页 (yellow pages)NIS
NIS
也就是人们所熟知的黄页(Yellow Pages), 但由于商标的问题,
Sun 将其改名为现在的名字。 旧的术语 (以及 yp),
仍然经常可以看到, 并被广泛使用。
NIS
域
这是一个基于 RPC 的客户机/服务器系统,
它允许在一个 NIS 域中的一组机器共享一系列配置文件。
这样, 系统管理员就可以配置只包含最基本配置数据的 NIS 客户机系统,
并在单点上增加、 删除或修改配置数据。
Windows NT
尽管实现的内部细节截然不同, 这和 &windowsnt; 域系统非常类似,
以至于可以将两者的基本功能相互类比。
您应该知道的术语和进程
有一系列术语和重要的用户进程将在您在 FreeBSD
上实现 NIS 时用到, 无论是在创建
NIS 服务器, 或作为 NIS 客户机:
rpcbind
portmap
术语
说明
NIS 域名
NIS 主服务器和所有其客户机
(包括从服务器) 会使用同一 NIS 域名。
和 &windowsnt; 域名类似, NIS 域名与
DNS 无关。
rpcbind
必须运行这个程序, 才能够启用
RPC (远程过程调用, NIS
用到的一种网络协议)。 如果没有运行
rpcbind,
则没有办法运行 NIS 服务器,
或作为 NIS 客户机。
ypbind
绑定(bind)
NIS 客户机到它的 NIS
服务器上。 这样, 它将从系统中获取 NIS 域名,
并使用 RPC 连接到服务器上。
ypbind 是 NIS 环境中,
客户机-服务器通讯的核心; 如果客户机上的
ypbind 死掉的话, 它将无法访问
NIS 服务器。
ypserv
只应在 NIS 服务器上运行它; 这是 NIS 的服务器进程。
如果 &man.ypserv.8; 死掉的话,
则服务器将不再具有响应 NIS 请求的能力 (此时,
如果有从服务器的话, 则会接管操作)。 有一些 NIS
的实现 (但不是 FreeBSD 的这个) 的客户机上,
如果之前用过一个服务器, 而那台服务器死掉的话,
并不尝试重新连接到另一个服务器。 通常,
发生这种情况时, 唯一的办法就是重新启动服务器进程
(或者, 甚至重新启动服务器) 或客户机上的
ypbind 进程。
rpc.yppasswdd
另一个只应在
NIS 主服务器上运行的进程; 这是一个服务程序,
其作用是允许 NIS 客户机改变它们的 NIS 口令。
如果没有运行这个服务, 用户将必须登录到 NIS
主服务器上, 并在那里修改口令。
它是如何工作的?
在 NIS 环境中, 有三种类型的主机:
主服务器, 从服务器, 以及客户机。
服务器的作用是充当主机配置信息的中央数据库。
主服务器上保存着这些信息的权威副本,
而从服务器则是保存这些信息的冗余副本。
客户机依赖于服务器向它们提供这些信息。
许多文件的信息可以通过这种方式来共享。
通常情况下, master.passwd、
group, 以及 hosts
是通过 NIS 分发的。 无论什么时候,
如果客户机上的某个进程请求这些本应在本地的文件中的资料的时候,
它都会向所绑定的 NIS 服务器发出请求, 而不使用本地的版本。
机器类型
NIS
主服务器
一台 NIS 主服务器。
这台服务器, 和 &windowsnt; 域控制器类似,
会维护所有 NIS 客户机所使用的文件。 passwd,
group, 以及许多其他 NIS
客户机所使用的文件, 都被存放到主服务器上。
可以将一台 NIS 主服务器用在多个 NIS 域中。
然而, 本书不打算对这种配置进行介绍,
因为这种配置, 通常只出现在小规模的 NIS 环境中。
NIS
从服务器
NIS 从服务器。 这一概念,
与 &windowsnt; 的备份域控制器类似。 NIS 从服务器,
用于维护 NIS 主服务器的数据文件副本。
NIS 从服务器提供了一种冗余,
这在许多重要的环境中是必需的。 此外,
它也帮助减轻了主服务器的负荷: NIS
客户机总是挂接到最先响应它们的 NIS 服务器上,
而这也包括来自从服务器的响应。
NIS
客户机
NIS 客户机。 NIS 客户机,
和多数 &windowsnt; 工作站类似, 通过
NIS 服务器 (或对于 &windowsnt; 工作站, 则是
&windowsnt; 域控制器) 来完成登录时的身份验证过程。
使用 NIS/YP
这一节将通过实例介绍如何配置 NIS 环境。
规划
假定您正在管理大学中的一个小型实验室。 在这个实验室中,
有 15 台 FreeBSD 机器, 目前尚没有集中的管理点;
每一台机器上有自己的
/etc/passwd 和
/etc/master.passwd。
这些文件通过人工干预的方法来保持与其他机器上版本的同步;
目前, 如果您在实验室中增加一个用户, 将不得不在所有 15
台机器上手工执行 adduser 命令。
毋庸置疑, 这一现状必须改变,
因此您决定将整个实验室转为使用 NIS,
并使用两台机器作为服务器。
因此, 实验室的配置应该是这样的:
机器名
IP 地址
机器的角色
ellington
10.0.0.2
NIS 主服务器
coltrane
10.0.0.3
NIS 从服务器
basie
10.0.0.4
教员工作站
bird
10.0.0.5
客户机
cli[1-11]
10.0.0.[6-17]
其他客户机
如果您是首次配置 NIS, 仔细思考如何进行规划就十分重要。
无论您的网络的大小如何, 都必须进行几个决策。
选择 NIS 域名
NIS
域名
这可能不是您过去使用的 域名(domainname)
。
它的规范的叫法, 应该是
NIS 域名
。 当客户机广播对此信息的请求时,
它会将 NIS 域的名字作为请求的一部分发出。 这样,
统一网络上的多个服务器, 就能够知道谁应该回应请求。
您可以把 NIS 域名想象成以某种方式相关的一组主机的名字。
一些机构会选择使用它们的 Internet
域名来作为 NIS 域名。 并不推荐这样做, 因为在调试网络问题时,
这可能会导致不必要的困扰。 NIS 域名应该是在您网络上唯一的,
并且有助于了解它所描述的到底是哪一组机器。 例如对于 Acme
公司的美工部门, 可以考虑使用
acme-art
这样的 NIS 域名。
在这个例子中, 您使用的域名是
test-domain。
SunOS
然而, 某些操作系统 (最著名的是 &sunos;)
会使用其 NIS 域名作为 Internet 域名。
如果您的网络上存在包含这类限制的机器, 就
必须 使用 Internet 域名来作为您的 NIS 域名。
服务器的物理要求
选择 NIS 服务器时, 需要时刻牢记一些东西。
NIS 的一个不太好的特性就是其客户机对于服务器的依赖程度。
如果客户机无法与其 NIS 域的服务器联系,
则这台机器通常会陷于不可用的状态。 缺少用户和组信息,
会使绝大多数系统进入短暂的冻结状态。 基于这样的考虑,
您需要选择一台不经常重新启动, 或用于开发的机器来承担其责任。
如果您的网络不太忙, 也可以使用运行着其他服务的机器来安放 NIS
服务, 只是需要注意, 一旦 NIS 服务器不可用, 则
所有 的 NIS 客户机都会受到影响。
NIS 服务器
所有的 NIS 信息的正规版本,
都被保存在一台单独的称作 NIS 主服务器的机器上。
用于保存这些信息的数据库, 称为 NIS 映射(map)。
在 FreeBSD 中, 这些映射被保存在
/var/yp/[domainname] 里, 其中
[domainname] 是提供服务的 NIS
域的名字。 一台 NIS 服务器, 可以同时支持多个域,
因此可以建立很多这样的目录, 所支撑一个域对应一个。
每一个域都会有一组独立的映射。
NIS 主和从服务器, 通过 ypserv
服务程序来处理所有的 NIS 请求。
ypserv 有责任接收来自 NIS 客户机的请求,
翻译请求的域, 并将名字映射为相关的数据库文件的路径,
然后将来自数据库的数据传回客户机。
配置 NIS 主服务器
NIS
服务器配置
配置主 NIS 服务器相对而言十分的简单,
而其具体步骤则取决于您的需要。 FreeBSD
提供了一步到位的 NIS 支持。 您需要做的全部事情, 只是在
/etc/rc.conf 中加入一些配置,
其他工作会由 FreeBSD 完成。
nisdomainname="test-domain"
这一行将在网络启动 (例如重新启动) 时, 把 NIS 域名配置为
test-domain。
nis_server_enable="YES"
这将要求 FreeBSD 在网络子系统启动之后立即启动
NIS 服务进程。
nis_yppasswdd_enable="YES"
这将启用 rpc.yppasswdd
服务程序, 如前面提到的,
它允许用户在客户机上修改自己的 NIS 口令。
随 NIS 配置的不同, 可能还需要增加其他一些项目。 请参见 关于 NIS 服务器同时充当 NIS
客户机 这一节, 以了解进一步的情况。
设置好前面这些配置之后, 需要以超级用户身份运行
/etc/netstart 命令。 它会根据
/etc/rc.conf 的设置来配置系统中的其他部分。
最后, 在初始化 NIS 映射之前, 还需要手工启动
ypserv 服务程序:
&prompt.root; /etc/rc.d/ypserv start
初始化 NIS 映射
NIS
映射
NIS 映射 是一些数据库文件,
它们位于 /var/yp 目录中。
这些文件基本上都是根据 NIS 主服务器的 /etc
目录自动生成的, 唯一的例外是:
/etc/master.passwd 文件。 一般来说,
您会有非常充分的理由不将 root
以及其他管理帐号的口令发到所有 NIS 域上的服务器上。
因此, 在开始初始化 NIS 映射之前, 我们应该:
&prompt.root; cp /etc/master.passwd /var/yp/master.passwd
&prompt.root; cd /var/yp
&prompt.root; vi master.passwd
这里, 删除掉和系统有关的帐号对应的项 (bin、
tty、 kmem、
games, 等等),
以及其他不希望被扩散到 NIS 客户机的帐号
(例如 root 和任何其他 UID 0
(超级用户) 的帐号)。
确认
/var/yp/master.passwd 这个文件是同组用户,
以及其他用户不可读的 (模式 600)! 如果需要的话, 用
chmod 命令来改它。
Tru64 UNIX
完成这些工作之后, 就可以初始化
NIS 映射了! FreeBSD 提供了一个名为
ypinit 的脚本来帮助您完成这项工作 (详细信息,
请见其联机手册)。 请注意, 这个脚本在绝大多数 &unix;
操作系统上都可以找到, 但并不是所有操作系统的都提供。
在 Digital UNIX/Compaq Tru64 UNIX 上它的名字是
ypsetup。 由于我们正在生成的是 NIS
主服务器的映射, 因此应该使用 ypinit 的
参数。 如果已经完成了上述步骤,
要生成 NIS 映射, 只需执行:
ellington&prompt.root; ypinit -m test-domain
Server Type: MASTER Domain: test-domain
Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.
Do you want this procedure to quit on non-fatal errors? [y/n: n] n
Ok, please remember to go back and redo manually whatever fails.
If you don't, something might not work.
At this point, we have to construct a list of this domains YP servers.
rod.darktech.org is already known as master server.
Please continue to add any slave servers, one per line. When you are
done with the list, type a <control D>.
master server : ellington
next host to add: coltrane
next host to add: ^D
The current list of NIS servers looks like this:
ellington
coltrane
Is this correct? [y/n: y] y
[..output from map generation..]
NIS Map update completed.
ellington has been setup as an YP master server without any errors.
ypinit 应该会根据
/var/yp/Makefile.dist 来创建
/var/yp/Makefile 文件。
创建完之后, 这个文件会假定您正在操作只有 FreeBSD
机器的单服务器 NIS 环境。 由于 test-domain
还有一个从服务器, 您必须编辑
/var/yp/Makefile:
ellington&prompt.root; vi /var/yp/Makefile
应该能够看到这样一行, 其内容是
NOPUSH = "True"
(如果还没有注释掉的话)。
配置 NIS 从服务器
NIS
从服务器
配置 NIS 从服务器, 甚至比配置主服务器还要简单。
登录到从服务器上, 并按照前面的方法,
编辑 /etc/rc.conf 文件。 唯一的区别是,
在运行 ypinit 时需要使用
参数。
这里的 选项, 同时要求提供 NIS
主服务器的名字, 因此我们的命令行应该是:
coltrane&prompt.root; ypinit -s ellington test-domain
Server Type: SLAVE Domain: test-domain Master: ellington
Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.
Do you want this procedure to quit on non-fatal errors? [y/n: n] n
Ok, please remember to go back and redo manually whatever fails.
If you don't, something might not work.
There will be no further questions. The remainder of the procedure
should take a few minutes, to copy the databases from ellington.
Transferring netgroup...
ypxfr: Exiting: Map successfully transferred
Transferring netgroup.byuser...
ypxfr: Exiting: Map successfully transferred
Transferring netgroup.byhost...
ypxfr: Exiting: Map successfully transferred
Transferring master.passwd.byuid...
ypxfr: Exiting: Map successfully transferred
Transferring passwd.byuid...
ypxfr: Exiting: Map successfully transferred
Transferring passwd.byname...
ypxfr: Exiting: Map successfully transferred
Transferring group.bygid...
ypxfr: Exiting: Map successfully transferred
Transferring group.byname...
ypxfr: Exiting: Map successfully transferred
Transferring services.byname...
ypxfr: Exiting: Map successfully transferred
Transferring rpc.bynumber...
ypxfr: Exiting: Map successfully transferred
Transferring rpc.byname...
ypxfr: Exiting: Map successfully transferred
Transferring protocols.byname...
ypxfr: Exiting: Map successfully transferred
Transferring master.passwd.byname...
ypxfr: Exiting: Map successfully transferred
Transferring networks.byname...
ypxfr: Exiting: Map successfully transferred
Transferring networks.byaddr...
ypxfr: Exiting: Map successfully transferred
Transferring netid.byname...
ypxfr: Exiting: Map successfully transferred
Transferring hosts.byaddr...
ypxfr: Exiting: Map successfully transferred
Transferring protocols.bynumber...
ypxfr: Exiting: Map successfully transferred
Transferring ypservers...
ypxfr: Exiting: Map successfully transferred
Transferring hosts.byname...
ypxfr: Exiting: Map successfully transferred
coltrane has been setup as an YP slave server without any errors.
Don't forget to update map ypservers on ellington.
现在应该会有一个叫做
/var/yp/test-domain 的目录。
在这个目录中, 应该保存 NIS 主服务器上的映射的副本。
接下来需要确定这些文件都及时地同步更新了。 在从服务器上, 下面的
/etc/crontab 项将帮助您确保这一点:
20 * * * * root /usr/libexec/ypxfr passwd.byname
21 * * * * root /usr/libexec/ypxfr passwd.byuid
这两行将强制从服务器将映射与主服务器同步。
由于主服务器会尝试确保所有其 NIS 映射的变动都知会从服务器,
因此这些项并不是绝对必需的, 尽管如此,
强制更新能够保证这些对依赖于服务器的系统至关重要的口令信息及时地同步。
同时, 在繁忙的网络上, 有时也会出现映射同步更新不完全的情况。
现在, 在从服务器上执行 /etc/netstart,
就可以启动 NIS 服务了。
NIS 客户机
NIS 客户机会通过
ypbind 服务程序来与特定的 NIS
服务器建立一种称作绑定的联系。
ypbind 会检查系统的默认域
(这是通过 domainname 命令来设置的),
并开始在本地网络上广播 RPC 请求。 这些请求会指定
ypbind 尝试绑定的域名。
如果已经配置了服务器, 并且这些服务器接到了广播, 它将回应
ypbind, 后者则记录服务器的地址。
如果有多个可用的服务器 (例如一个主服务器, 加上多个从服务器),
ypbind 将使用第一个响应的地址。
从这一时刻开始, 客户机会把所有的 NIS 请求直接发给那个服务器。
ypbind 偶尔会 ping
服务器以确认其仍然在正常运行。 如果在合理的时间内没有得到响应, 则
ypbind 会把域标记为未绑定, 并再次发起广播,
以期找到另一台服务器。
设置 NIS 客户机
NIS
客户机配置
配置一台 FreeBSD 机器作为 NIS 客户机是非常简单的。
编辑 /etc/rc.conf 文件,
并在其中加上下面几行, 以设置 NIS 域名,
并在网络启动时启动 ypbind:
nisdomainname="test-domain"
nis_client_enable="YES"
要从 NIS 服务器导入所有的口令项,
需要从您的
/etc/master.passwd 文件中删除所有用户,
并使用
vipw 在这个文件的最后一行加入:
+:::::::::
这一行将让 NFS 服务器的口令映射中的帐号能够登录。
也有很多修改这一行来配置 NIS 客户机的办法。
请参见稍后的 netgroups
小节 以了解进一步的情况。
要了解更多信息, 可以参阅 O'Reilly 的
Managing NFS and NIS 这本书。
需要至少保留一个本地帐号 (也就是不通过 NIS 导入) 在您的
/etc/master.passwd 文件中,
而这个帐号应该是
wheel 组的成员。 如果 NIS 发生不测,
这个帐号可以用来远程登录,
成为 root, 并修正问题。
要从 NIS 服务器上导入组信息, 需要在
/etc/group 文件末尾加入:
+:*::
想要立即启动 NIS 客户端, 需要以超级用户身份运行执行下列命令:
&prompt.root; /etc/netstart
&prompt.root; /etc/rc.d/ypbind start
完成这些步骤之后, 就应该可以通过运行
ypcat passwd 来看到 NIS 服务器的口令映射了。
NIS 的安全性
基本上, 任何远程用户都可以发起一个 RPC 到
&man.ypserv.8; 并获得您的 NIS 映射的内容,
如果远程用户了解您的域名的话。
要避免这类未经授权的访问, &man.ypserv.8;
支持一个称为 securenets
的特性,
用以将访问限制在一组特定的机器上。 在启动过程中,
&man.ypserv.8; 会尝试从
/var/yp/securenets
中加载 securenet 信息。
这个路径随
参数改变。 这个文件包含了一些项,
每一项中包含了一个网络标识和子网掩码, 中间用空格分开。
以 #
开头的行会被认为是注释。
示范的 securenets 文件如下所示:
# allow connections from local host -- mandatory
127.0.0.1 255.255.255.255
# allow connections from any host
# on the 192.168.128.0 network
192.168.128.0 255.255.255.0
# allow connections from any host
# between 10.0.0.0 to 10.0.15.255
# this includes the machines in the testlab
10.0.0.0 255.255.240.0
如果 &man.ypserv.8; 接到了来自匹配上述任一规则的地址的请求,
则它会正常处理请求。 反之, 则请求将被忽略, 并记录一条警告信息。 如果
/var/yp/securenets 文件不存在, 则
ypserv 会允许来自任意主机的请求。
ypserv 程序也支持
Wietse Venema 的 TCP Wrapper 软件包。
这样, 管理员就能够使用
TCP Wrapper 的配置文件来代替
/var/yp/securenets 完成访问控制。
尽管这两种访问控制机制都能够提供某种程度的安全,
但是, 和特权端口检查一样,
它们无法避免 IP 伪造
攻击。 您的防火墙应该阻止所有与
NIS 有关的访问。
使用 /var/yp/securenets 的服务器,
可能会无法为某些使用陈旧的 TCP/IP 实现的 NIS 客户机服务。
这些实现可能会在广播时, 将主机位都设置为 0,
或在计算广播地址时忽略子网掩码。
尽管这些问题可以通过修改客户机的配置来解决,
其他一些问题也可能导致不得不淘汰那些客户机系统,
或者不使用 /var/yp/securenets。
在使用陈旧的 TCP/IP 实现的系统上,
使用 /var/yp/securenets 是一个非常糟糕的做法,
因为这将导致您的网络上的 NIS 丧失大部分功能。
TCP Wrappers
使用 TCP Wrapper
软件包, 会导致您的 NIS 服务器的响应延迟增加。
而增加的延迟, 则可能会导致客户端程序超时,
特别是在繁忙的网络或者很慢的
NIS 服务器上。 如果您的某个客户机因此而产生一些异常,
则应将这些客户机变为 NIS 从服务器,
并强制其绑定自己。
不允许某些用户登录
在我们的实验室中, basie 这台机器,
是一台教员专用的工作站。 我们不希望将这台机器拿出 NIS 域,
而主 NIS 服务器上的 passwd 文件,
则同时包含了教员和学生的帐号。 这时应该怎么做?
有一种办法来禁止特定的用户登录机器, 即使他们身处 NIS 数据库之中。
要完成这一工作, 只需要在客户机的 /etc/master.passwd
文件中加入一些
-username 这样的项,
其中, username 是希望禁止登录的用户名。
一般推荐使用 vipw 来完成这个工作,
因为 vipw 会对您在 /etc/master.passwd
文件上所作的修改进行合法性检查,
并在编辑结束时重新构建口令数据库。 例如, 如果希望禁止用户
bill 登录
basie, 我们应该:
basie&prompt.root; vipw
[在末尾加入 -bill, 并退出]
vipw: rebuilding the database...
vipw: done
basie&prompt.root; cat /etc/master.passwd
root:[password]:0:0::0:0:The super-user:/root:/bin/csh
toor:[password]:0:0::0:0:The other super-user:/root:/bin/sh
daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5::0:0:System &:/:/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source,,,:/:/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
games:*:7:13::0:0:Games pseudo-user:/usr/games:/sbin/nologin
news:*:8:8::0:0:News Subsystem:/:/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin
bind:*:53:53::0:0:Bind Sandbox:/:/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67::0:0:X-10 daemon:/usr/local/xten:/sbin/nologin
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin
+:::::::::
-bill
basie&prompt.root;
Udo
Erdelhoff
Contributed by
使用 Netgroups
netgroups
前一节介绍的方法,
在您需要为非常少的用户和/或机器进行特殊的规则配置时还算凑合。
在更大的网络上, 您
一定会 忘记禁止某些用户登录到敏感的机器上,
或者, 甚至必须单独地修改每一台机器的配置, 因而丢掉了 NIS 最重要的优越性:
集中式 管理。
NIS 开发人员为这个问题提供的解决方案, 被称作
netgroups。 它们的作用和语义,
基本上可以等同于 &unix; 文件系统上使用的组。
主要的区别是它们没有数字化的 ID, 以及可以在 netgroup
中同时包含用户和其他 netgroup。
Netgroups 被设计用来处理大的、 复杂的包含数百用户和机器的网络。
一方面, 在您不得不处理这类情形时, 这是一个很有用的东西。
而另一方面, 它的复杂性又使得通过非常简单的例子很难解释 netgroup
到底是什么。 这一节的其余部分的例子将展示这个问题。
假设您在实验室中成功地部署 NIS 引起了上司的兴趣。
您接下来的任务是将 NIS 域扩展, 以覆盖校园中的一些其他的机器。
下面两个表格中包括了新用户和新机器, 及其简要说明。
用户名
说明
alpha, beta
IT 部门的普通雇员
charlie, delta
IT 部门的学徒
echo, foxtrott, golf, ...
普通雇员
able, baker, ...
目前的实习生
机器名
说明
war, death,
famine,
pollution
最重要的服务器。 只有 IT
部门的雇员才允许登录这些机器。
pride, greed,
envy, wrath,
lust, sloth
不太重要的服务器, 所有 IT 部门的成员,
都可以登录这些机器。
one, two,
three, four,
...
普通工作站。 只有
真正的 雇员才允许登录这些机器。
trashcan
一台不包含关键数据的旧机器。
即使是实习生, 也允许登录它。
如果您尝试通过一个一个地阻止用户来实现这些限制,
就需要在每一个系统的 passwd 文件中,
为每一个不允许登录该系统的用户添加对应的
-user 行。
如果忘记了任何一个, 就可能会造成问题。 在进行初始配置时,
正确地配置也许不是什么问题, 但随着日复一日地添加新用户,
总有一天 您会忘记为新用户添加某个行。
毕竟, Murphy 是一个乐观的人。
使用 netgroups 来处理这一状况可以带来许多好处。
不需要单独地处理每一个用户; 您可以赋予用户一个或多个 netgroups
身份, 并允许或禁止某一个 netgroup 的所有成员登录。
如果添加了新的机器, 只需要定义 netgroup 的登录限制。
如果增加了新用户, 也只需要将用户加入一个或多个 netgroup。
这些变化是相互独立的: 不再需要 对每一个用户和机器执行
……
。 如果您的 NIS 配置经过了谨慎的规划,
就只需要修改一个中央的配置文件, 就能够允许或禁止访问某台机器的权限了。
第一步是初始化 NIS 映射
netgroup。 FreeBSD 的 &man.ypinit.8; 默认情况下并不创建这个映射,
但它的 NIS 实现能够在创建这个映射之后立即对其提供支持。
要创建空映射, 简单地输入
ellington&prompt.root; vi /var/yp/netgroup
并开始增加内容。 在我们的例子中, 至少需要四个 nergruop:
IT 雇员, IT 学徒, 普通雇员和实习生。
IT_EMP (,alpha,test-domain) (,beta,test-domain)
IT_APP (,charlie,test-domain) (,delta,test-domain)
USERS (,echo,test-domain) (,foxtrott,test-domain) \
(,golf,test-domain)
INTERNS (,able,test-domain) (,baker,test-domain)
IT_EMP, IT_APP 等等,
是 netgroup 的名字。 每一个括号中的组中,
都有一些用户帐号。 组中的三个字段是:
在哪些机器上能够使用这些项。 如果不指定主机名,
则项在所有机器上都有效。 如果指定了主机,
则很容易造成混淆。
属于这个 netgroup 的帐号。
帐号的 NIS 域。 您可以从其他 NIS
域中把帐号导入到您的 netgroup 中,
如果您管理多个 NIS 域的话。
每一个字段都可以包括通配符。 参见
&man.netgroup.5; 了解更多细节。
netgroups
Netgroup 的名字一般来说不应超过 8 个字符,
特别是当您的 NIS 域中有机器打算运行其它操作系统的时候。
名字是区分大小写的; 使用大写字母作为 netgroup 的名字,
能够让您更容易地区分用户、 机器和 netgroup 的名字。
某些 NIS 客户程序 (FreeBSD 以外的那些) 可能无法处理含有大量项的
netgroup。 例如, 某些早期版本的 &sunos; 会在 netgroup
中包含多于 15 个 项 时出现问题。
要绕过这个问题, 可以创建多个 子netgroup,每一个中包含少于 15 个用户,
以及一个包含所有 子netgroup 的真正的 netgroup:
BIGGRP1 (,joe1,domain) (,joe2,domain) (,joe3,domain) [...]
BIGGRP2 (,joe16,domain) (,joe17,domain) [...]
BIGGRP3 (,joe31,domain) (,joe32,domain)
BIGGROUP BIGGRP1 BIGGRP2 BIGGRP3
如果需要超过 225 个用户, 可以继续重复上面的过程。
激活并分发新的 NIS 映射非常简单:
ellington&prompt.root; cd /var/yp
ellington&prompt.root; make
这个操作会生成三个 NIS 映射, 即
netgroup、
netgroup.byhost 和
netgroup.byuser。 用 &man.ypcat.1;
可以检查这些 NIS 映射是否可用了:
ellington&prompt.user; ypcat -k netgroup
ellington&prompt.user; ypcat -k netgroup.byhost
ellington&prompt.user; ypcat -k netgroup.byuser
第一个命令的输出,
应该与 /var/yp/netgroup 的内容相近。
第二个命令, 如果没有指定本机专有的 netgroup,
则应该没有输出。 第三个命令,
则用于显示某个用户对应的 netgroup 列表。
客户机的设置也很简单。 要配置服务器
war, 只需进入
&man.vipw.8; 并把
+:::::::::
改为
+@IT_EMP:::::::::
现在, 只有 netgroup
IT_EMP 中定义的用户会被导入到
war 的口令数据库中,
因此只有这些用户能够登录。
不过, 这个限制也会作用于 shell 的
~, 以及所有在用户名和数字用户 ID
之间实施转换的函数的功能。 换言之, cd
~user 将不会正常工作, 而
ls -l 也将显示数字的 ID 而不是用户名,
并且 find . -user joe -print
将失败, 并给出 No such user 的错误信息。
要修正这个问题, 您需要导入所有的用户项, 而
不允许他们登录服务器。
这可以通过在
/etc/master.passwd 加入另一行来完成。
这行的内容是:
+:::::::::/sbin/nologin, 意思是
导入所有的项, 但导入项的 shell 则替换为
/sbin/nologin
。
通过在 /etc/master.passwd
中增加默认值, 可以替换掉
passwd 中的任意字段。
务必确认
+:::::::::/sbin/nologin 这一行出现在
+@IT_EMP::::::::: 之后。
否则, 所有从 NIS 导入的用户帐号将以 /sbin/nologin
作为登录 shell。
完成上面的修改之后, 在 IT 部门有了新员工时,
只需修改一个 NIS 映射就足够了。 您也可以用类似的方法,
在不太重要的服务器上, 把先前本地版本的 /etc/master.passwd
中的 +::::::::: 改为:
+@IT_EMP:::::::::
+@IT_APP:::::::::
+:::::::::/sbin/nologin
相关的用于普通工作站的配置则应是:
+@IT_EMP:::::::::
+@USERS:::::::::
+:::::::::/sbin/nologin
一切平安无事, 直到数周后, 有一天策略发生了变化:
IT 部门也开始招收实习生了。 IT 实习生允许使用普通的终端,
以及不太重要的服务器; 而 IT 学徒, 则可以登录主服务器。
您增加了新的 netgroup IT_INTERN, 以及新的 IT
实习生到这个 netgroup 并开始修改每一台机器上的配置……
老话说得好:牵一发, 动全身
。
NIS 通过 netgroup 来建立 netgroup 的能力,
正可以避免这样的情形。 一种可能的方法是建立基于角色的 netgroup。
例如, 您可以创建称为
BIGSRV 的 netgroup, 用于定义最重要的服务器上的登录限制,
以及另一个成为 SMALLSRV 的 netgroup,
用以定义次重要的服务器, 以及第三个, 用于普通工作站的 netgroup
USERBOX。 这三个 netgroup 中的每一个,
都包含了允许登录到这些机器上的所有 netgroup。
您的 NIS 映射中的新项如下所示:
BIGSRV IT_EMP IT_APP
SMALLSRV IT_EMP IT_APP ITINTERN
USERBOX IT_EMP ITINTERN USERS
这种定义登录限制的方法,
在您能够将机器分组并加以限制的时候可以工作的相当好。
不幸的是, 这是种例外, 而非常规情况。 多数时候,
需要按机器去定义登录限制。
与机器相关的 netgroup 定义, 是处理上述策略改动的另一种可能的方法。
此时, 每台机器的 /etc/master.passwd 中,
都包含两个 +
开头的行。 第一个用于添加允许登录的 netgroup
帐号, 而第二个则用于增加其它帐号, 并把 shell
设置为 /sbin/nologin。 使用 全大写
的机器名作为 netgroup 名是个好主意。 换言之, 这些行应该类似于:
+@BOXNAME:::::::::
+:::::::::/sbin/nologin
一旦在所有机器上都完成了这样的修改, 就再也不需要修改本地的
/etc/master.passwd 了。
所有未来的修改都可以在 NIS 映射中进行。 这里是一个例子,
其中展示了在这一应用情景中所需要的 netgroup 映射,
以及其它一些常用的技巧:
# Define groups of users first
IT_EMP (,alpha,test-domain) (,beta,test-domain)
IT_APP (,charlie,test-domain) (,delta,test-domain)
DEPT1 (,echo,test-domain) (,foxtrott,test-domain)
DEPT2 (,golf,test-domain) (,hotel,test-domain)
DEPT3 (,india,test-domain) (,juliet,test-domain)
ITINTERN (,kilo,test-domain) (,lima,test-domain)
D_INTERNS (,able,test-domain) (,baker,test-domain)
#
# Now, define some groups based on roles
USERS DEPT1 DEPT2 DEPT3
BIGSRV IT_EMP IT_APP
SMALLSRV IT_EMP IT_APP ITINTERN
USERBOX IT_EMP ITINTERN USERS
#
# And a groups for a special tasks
# Allow echo and golf to access our anti-virus-machine
SECURITY IT_EMP (,echo,test-domain) (,golf,test-domain)
#
# machine-based netgroups
# Our main servers
WAR BIGSRV
FAMINE BIGSRV
# User india needs access to this server
POLLUTION BIGSRV (,india,test-domain)
#
# This one is really important and needs more access restrictions
DEATH IT_EMP
#
# The anti-virus-machine mentioned above
ONE SECURITY
#
# Restrict a machine to a single user
TWO (,hotel,test-domain)
# [...more groups to follow]
如果您正使用某种数据库来管理帐号,
应该可以使用您的数据库的报告工具来创建映射的第一部分。
这样, 新用户就自动地可以访问这些机器了。
最后的提醒: 使用基于机器的 netgroup 并不总是适用的。
如果正在为学生实验室部署数十台甚至上百台同样的机器,
您应该使用基于角色的 netgroup, 而不是基于机器的 netgroup,
以便把 NIS 映射的尺寸保持在一个合理的范围内。
需要牢记的事项
这里是一些其它在使用 NIS 环境时需要注意的地方。
每次需要在实验室中增加新用户时,
必须 只 在 NIS 服务器上加入用户,
而且 一定要记得重建 NIS 映射。
如果您忘记了这样做, 新用户将无法登录除 NIS
主服务器之外的任何其它机器。 例如, 如果要在实验室增加新用户
jsmith, 我们需要:
&prompt.root; pw useradd jsmith
&prompt.root; cd /var/yp
&prompt.root; make test-domain
也可以运行 adduser jsmith 而不是
pw useradd jsmith.
将管理用的帐号排除在
NIS 映射之外。 一般来说,
您不希望这些管理帐号和口令被扩散到那些包含不应使用它们的用户的机器上。
确保 NIS 主和从服务器的安全,
并尽可能减少其停机时间。
如果有人攻入或简单地关闭这些机器,
则整个实验室的任也就无法登录了。
这是集中式管理系统中最薄弱的环节。
如果没有保护好 NIS 服务器, 您就有大批愤怒的用户需要对付了!
NIS v1 兼容性
FreeBSD 的 ypserv 提供了某些为 NIS v1
客户提供服务的支持能力。 FreeBSD 的 NIS 实现,
只使用 NIS v2 协议, 但其它实现可能会包含 v1 协议,
以提供对旧系统的向下兼容能力。 随这些系统提供的
ypbind 服务将首先尝试绑定 NIS v1
服务器, 即使它们并不真的需要它 (有些甚至可能会一直广播搜索请求,
即使已经从某台 v2 服务器得到了回应也是如此)。
注意, 尽管支持一般的客户机调用, 这个版本的
ypserv 并不能处理 v1 的映射传送请求;
因而, 它就不能与较早的支持 v1 协议的 NIS 服务器配合使用,
无论是作为主服务器还是从服务器。 幸运的是,
现今应该已经没有仍然在用的这样的服务器了。
同时作为 NIS 客户机的 NIS 服务器
在多服务器域的环境中, 如果服务器同时作为 NIS 客户, 在运行
ypserv 时要特别小心。
一般来说, 强制服务器绑定自己要比允许它们广播绑定请求要好,
因为这种情况下它们可能会相互绑定。 某些怪异的故障,
很可能是由于某一台服务器停机, 而其它服务器都依赖其服务所导致的。
最终, 所有的客户机都会超时并绑定到其它服务器,
但这个延迟可能会相当可观,
而且恢复之后仍然存在再次发生此类问题的隐患。
您可以强制一台机器绑定到特定的服务器, 这是通过
ypbind 的
参数来完成的。 如果不希望每次启动 NIS 服务器时都手工完成这项工作,
可以在 /etc/rc.conf 中加入:
nis_client_enable="YES" # run client stuff as well
nis_client_flags="-S NIS domain,server"
参见 &man.ypbind.8; 以了解更多情况。
口令格式
NIS
口令格式
在实现 NIS 时, 口令格式的兼容性问题是一种最为常见的问题。
假如您的 NIS 服务器使用 DES 加密口令, 则它只能支持使用 DES
的客户机。 例如, 如果您的网络上有
&solaris; NIS 客户机, 则几乎肯定需要使用 DES 加密口令。
要检查您的服务器和客户机使用的口令格式,
需要查看 /etc/login.conf。
如果主机被配置为使用 DES 加密的口令, 则
default class 将包含类似这样的项:
default:\
:passwd_format=des:\
:copyright=/etc/COPYRIGHT:\
[Further entries elided]
其他一些可能的 passwd_format
包括 blf 和 md5
(分别对应于 Blowfish 和 MD5 加密口令)。
如果修改了
/etc/login.conf, 就必须重建登录性能数据库,
这是通过以
root 身份运行下面的程序来完成的:
&prompt.root; cap_mkdb /etc/login.conf
已经在
/etc/master.passwd 中的口令的格式不会被更新,
直到用户在登录性能数据库重建
之后 首次修改口令为止。
接下来, 为了确保所有的口令都按照您选择的格式加密了,
还需要检查 /etc/auth.conf
中 crypt_default 给出的优先选择的口令格式。
要完成此工作, 将您选择的格式放到列表的第一项。 例如,
当使用 DES 加密的口令时, 对应项应为:
crypt_default = des blf md5
在每一台基于 &os; 的 NIS 服务器和客户机上完成上述工作之后,
就可以肯定您的网络上它们都在使用同样的口令格式了。 如果在 NIS
客户机上做身份验证时发生问题, 这也是第一个可能出现问题的地方。
注意: 如果您希望在混合的网络上部署 NIS 服务器,
可能就需要在所有系统上都使用 DES,
因为这是所有系统都能够支持的最低限度的公共标准。
Greg
Sutter
Written by
网络自动配置 (DHCP)
什么是 DHCP?
动态主机配置协议
DHCP
Internet Systems Consortium (ISC)
DHCP, 动态主机配置协议, 是一种让系统得以连接到网络上,
并获取所需要的配置参数手段。 FreeBSD 6.0 之前的版本,
采用的是 ISC (Internet Systems
Consortium) 的 DHCP 客户端 (&man.dhclient.8;) 实现。
更高版本使用的则是来自 OpenBSD 3.7
的 OpenBSD dhclient。
这里提供的所有关于 dhclient 的信息,
都是以 ISC 或 OpenBSD DHCP 客户端程序为准的。 DHCP
服务器是 ISC 软件包的一部分。
这一节都介绍哪些内容
这一节描述了 ISC 和 DHCP 系统中的客户端,
以及和 ISC DHCP 系统中的服务器端的组件。
客户端程序, dhclient,
是随 FreeBSD 作为它的一部分提供的; 而服务器部分,
则可以通过 net/isc-dhcp31-server port 得到。
&man.dhclient.8;、 &man.dhcp-options.5;、 以及
&man.dhclient.conf.5; 联机手册, 加上下面所介绍的参考文献,
都是非常有用的资源。
它如何工作
UDP
当 DHCP 客户程序, dhclient
在客户机上运行时, 它会开始广播请求配置信息的消息。 默认情况下,
这些请求是在 UDP 端口 68 上。 服务器通过 UDP 67
给出响应, 向客户机提供一个 IP 地址, 以及其他有关的配置参数,
例如子网掩码、 路由器, 以及 DNS 服务器。
所有这些信息都会以 DHCP
lease
的形式给出, 并且只在一段特定的时间内有效
(这是由 DHCP 服务器的维护者配置的)。 这样,
那些已经断开网络的客户机使用的陈旧的 IP 地址就能被自动地回收了。
DHCP 客户程序可以从服务器端获取大量的信息。
关于能获得的信息的详细列表, 请参考
&man.dhcp-options.5;。
FreeBSD 集成
FreeBSD 完全地集成了 ISC 或 OpenBSD 的 DHCP 客户端,
dhclient (取决于您运行的 &os; 版本)。
DHCP 客户端被安装程序直接支持,
并且是基本系统的一部分。
这使得您不再需要去了解那些已经运行了 DHCP 服务器的网络的具体配置参数。
从 FreeBSD 3.2 开始, 每一个发行版中均包含 dhclient。
sysinstall
sysinstall 能够支持 DHCP。 在
sysinstall 中配置网络接口时,
它询问的第二个问题便是: Do you want to try DHCP configuration of
the interface? (您是否希望在此接口上尝试 DHCP 配置?)
。
如果做肯定的回答, 则将运行 dhclient,
一旦成功, 则将自动地填写网络配置信息。
要在系统启动时使用 DHCP, 您必须做两件事:
DHCP
需求
您的内核中, 必须包含 bpf
设备。 如果需要这样做, 需要将
device bpf 添加到内核的编译配置文件中, 并重新编译内核。
要了解关于编译内核的进一步信息, 请参见 。 bpf
设备已经是 FreeBSD 发行版中默认的 GENERIC
内核的一部分了, 因此如果您没有对内核进行定制,
则不用创建一份新的内核配置文件, DHCP 就能工作了。
对于那些安全意识很强的人来说,
您应该知道 bpf
也是包侦听工具能够正确工作的条件之一 (当然,
它们还需要以
root 身份运行才行)。 bpf
是 使用 DHCP 所必须的,
但如果您对安全非常敏感,
则很可能会有理由不把 bpf
加入到您的内核配置中, 直到您真的需要使用 DHCP
为止。
编辑您的 /etc/rc.conf 并加入下面的设置:
ifconfig_fxp0="DHCP"
务必将 fxp0
替换为您希望自动配置的网络接口的名字, 您可以在
找到更进一步的介绍。
如果您希望使用另一位置的
dhclient,
或者需要给 dhclient 传递其他参数,
还可以添加下面的配置 (根据需要进行修改):
dhclient_program="/sbin/dhclient"
dhclient_flags=""
DHCP
服务器
DHCP 服务器, dhcpd,
是作为 net/isc-dhcp31-server port 的一部分提供的。
这个 port 包括了 ISC DHCP 服务器及其文档。
文件
DHCP
配置文件
/etc/dhclient.conf
dhclient 需要一个配置文件,
/etc/dhclient.conf。 一般说来,
这个文件中只包括注释, 而默认值基本上都是合理的。
这个配置文件在 &man.dhclient.conf.5; 联机手册中进行了进一步的阐述。
/sbin/dhclient
dhclient 是一个静态连编的,
它被安装到 /sbin 中。 &man.dhclient.8;
联机手册给出了关于
dhclient 的进一步细节。
/sbin/dhclient-script
dhclient-script 是一个 FreeBSD 专用的
DHCP 客户端配置脚本。 在
&man.dhclient-script.8; 中对它进行了描述,
但一般来说, 用户不需要对其进行任何修改,
就能够让一切正常运转了。
/var/db/dhclient.leases
DHCP 客户程序会维护一个数据库来保存有效的 lease,
它们被以日志的形式保存到这个文件中。 &man.dhclient.leases.5;
给出了更为细致的介绍。
进阶读物
DHCP 协议的完整描述是
RFC 2131。
关于它的其他信息资源的站点
也提供了详尽的资料。
安装和配置 DHCP 服务器
这一章包含哪些内容
这一章提供了关于如何在 FreeBSD 系统上使用 ISC
(Internet 系统协会) 的 DHCP 实现套件来架设 DHCP 服务器的信息。
DHCP 套件中的服务器部分并没有作为 FreeBSD 的一部分来提供,
因此您需要安装
net/isc-dhcp31-server
port 才能提供这个服务。 请参见
以了解关于如何使用 Ports Collection 的进一步详情。
安装 DHCP 服务器
DHCP
安装
为了在您的 FreeBSD 系统上进行配置以便作为 DHCP 服务器来使用,
需要把 &man.bpf.4; 设备编译进内核。 要完成这项工作, 需要将
device bpf 加入到您的内核配置文件中,
并重新联编内核。 要得到关于如何联编内核的进一步信息, 请参见
。
bpf 设备是 FreeBSD 所附带的
GENERIC 内核中已经联入的组件,
因此您并不需要为了让 DHCP 正常工作而特别地定制内核。
如果您有较强的安全意识, 应该注意
bpf 同时也是让听包程序能够正确工作的设备
(尽管这类程序仍然需要以特权用户身份运行)。
bpf
是 使用 DHCP 所必需的,
但如果您对安全非常敏感, 您可能会不希望将
bpf 放进内核,
直到您真的认为 DHCP 是必需的为止。
接下来要做的是编辑示范的
dhcpd.conf, 它由
net/isc-dhcp31-server port
安装。 默认情况下, 它的名字应该是
/usr/local/etc/dhcpd.conf.sample,
在开始修改之前, 您需要把它复制为
/usr/local/etc/dhcpd.conf。
配置 DHCP 服务器
DHCP
dhcpd.conf
dhcpd.conf 包含了一系列关于子网和主机的定义,
下面的例子可以帮助您理解它:
option domain-name "example.com";
option domain-name-servers 192.168.4.100;
option subnet-mask 255.255.255.0;
default-lease-time 3600;
max-lease-time 86400;
ddns-update-style none;
subnet 192.168.4.0 netmask 255.255.255.0 {
range 192.168.4.129 192.168.4.254;
option routers 192.168.4.1;
}
host mailhost {
hardware ethernet 02:03:04:05:06:07;
fixed-address mailhost.example.com;
}
这个选项指定了提供给客户机作为默认搜索域的域名。 请参考
&man.resolv.conf.5; 以了解关于这一概念的详情。
这个选项用于指定一组客户机使用的 DNS 服务器,
它们之间以逗号分隔。
提供给客户机的子网掩码。
客户机可以请求租约的有效期, 而如果没有,
则服务器将指定一个租约有效期, 也就是这个值 (单位是秒)。
这是服务器允许租出地址的最大时长。
如果客户机请求了更长的租期, 则它将得到一个地址,
但其租期仅限于 max-lease-time 秒。
这个选项用于指定 DHCP 服务器在一个地址被接受或释放时是否应对应尝试更新
DNS。 在 ISC 实现中, 这一选项是 必须指定的。
指定地址池中可以用来分配给客户机的 IP 地址范围。
在这个范围之间, 以及其边界的 IP 地址将分配给客户机。
定义客户机的默认网关。
主机的硬件 MAC 地址 (这样 DHCP
服务器就能够在接到请求时知道请求的主机身份)。
指定总是得到同一 IP 地址的主机。
请注意在此处使用主机名是对的, 因为 DHCP
服务器会在返回租借地址信息之前自行解析主机名。
在配制好
dhcpd.conf 之后, 应在
/etc/rc.conf 中启用 DHCP 服务器,
也就是增加:
dhcpd_enable="YES"
dhcpd_ifaces="dc0"
此处的 dc0 接口名应改为 DHCP
服务器需要监听 DHCP 客户端请求的接口 (如果有多个, 则用空格分开)。
接下来, 可以用下面的命令来启动服务:
&prompt.root; /usr/local/etc/rc.d/isc-dhcpd start
如果未来您需要修改服务器的配置, 请务必牢记发送
SIGHUP 信号给
dhcpd 并 不会
导致配置文件的重新加载, 而这在其他服务程序中则是比较普遍的约定。
您需要发送 SIGTERM 信号来停止进程,
然后使用上面的命令来重新启动它。
文件
DHCP
配置文件
/usr/local/sbin/dhcpd
dhcpd 是静态连接的, 并安装到
/usr/local/sbin 中。 随 port 安装的
&man.dhcpd.8; 联机手册提供了关于
dhcpd 更为详尽的信息。
/usr/local/etc/dhcpd.conf
dhcpd 需要配置文件,
即 /usr/local/etc/dhcpd.conf
才能够向客户机提供服务。 这个文件需要包括应提供给客户机的所有信息,
以及关于服务器运行的其他信息。 此配置文件的详细描述可以在随 port
安装的 &man.dhcpd.conf.5; 联机手册上找到。
/var/db/dhcpd.leases
DHCP 服务器会维护一个它签发的租用地址数据库,
并保存在这个文件中, 这个文件是以日志的形式保存的。
随 port 安装的
&man.dhcpd.leases.5; 联机手册提供了更详细的描述。
/usr/local/sbin/dhcrelay
dhcrelay 在更为复杂的环境中,
可以用来支持使用 DHCP 服务器转发请求给另一个独立网络上的
DHCP 服务器。 如果您需要这个功能, 需要安装 net/isc-dhcp31-relay port。
&man.dhcrelay.8; 联机手册提供了更为详尽的介绍。
Chern
Lee
Contributed by
Tom
Rhodes
Daniel
Gerzo
域名系统 (DNS)
纵览
BIND
&os; 在默认情况下使用一个版本的 BIND (Berkeley
Internet Name Domain), 这是目前最为流行的 DNS 协议实现。
DNS 是一种协议, 可以通过它将域名同 IP 地址相互对应。
例如, 查询 www.FreeBSD.org
将得到 &os; Project 的 web 服务器的 IP 地址, 而查询 ftp.FreeBSD.org 则将得到响应的 FTP 机器的
IP 地址。 类似地, 也可以做相反的事情。 查询 IP
地址可以得到其主机名。 当然, 完成 DNS
查询并不需要在系统中运行域名服务器。
目前, 默认情况下&os; 使用的是 BIND9
DNS 服务软件。 我们内建于系统中的版本提供了增强的安全特性、
新的文件目录结构, 以及自动的 &man.chroot.8; 配置。
DNS
在 Internet 上的 DNS 是通过一套较为复杂的权威根域名系统,
顶级域名 (TLD), 以及一系列小规模的,
提供少量域名解析服务并对域名信息进行缓存的域名服务器组成的。
目前, BIND 由
Internet Systems Consortium
维护。
术语
要理解这份文档, 需要首先了解一些相关的
DNS 术语。
resolver (解析器)
reverse DNS (反向 DNS)
root zone (根域)
术语
定义
正向 DNS
将域名映射到 IP 地址
原点 (Origin)
表示特定域文件所在的域
named, BIND
在 &os; 中 BIND 域名服务器软件包的常见叫法。
解析器 (Resolver)
计算机用以向域名服务器查询域名信息的一个系统进程
反向 DNS
将 IP 地址映射为主机名
根域
Internet 域层次的起点。 所有的域都在根域之下,
类似文件系统中, 文件都在根目录之下那样。
域 (Zone)
独立的域, 子域, 或者由同一机构管理的 DNS 的一部分。
域
例子
域的例子:
. 在本文档中通常指代根域。
org. 是根域之下的一个顶级域名
(TLD)。
example.org. 是在
org.
TLD 之下的一个域。
1.168.192.in-addr.arpa 是一个表示所有
192.168.1.*
IP 地址空间中 IP
地址的域。
如您所见, 域名中越细节的部分会越靠左出现。 例如, example.org. 就比
org. 范围更小, 类似地 org. 又比根域更小。
域名各个部分的格局与文件系统十分类似:
/dev 目录在根目录之下, 等等。
运行域名服务器的理由
域名服务器通常会有两种形式: 权威域名服务器,
以及缓存域名服务器。
下列情况需要有权威域名服务器:
想要向全世界提供 DNS 信息,
并对请求给出权威应答。
注册了类似 example.org
的域, 而需要将 IP 指定到其下的主机名上。
某个 IP 地址块需要反向
DNS 项 (IP 到主机名)。
备份服务器, 或常说的从 (slave) 服务器,
会在主服务器出现问题或无法访问时来应答查询请求。
下列情况需要有缓存域名服务器:
本地的 DNS 服务器能够缓存,
并比直接向外界的域名服务器请求更快地得到应答。
当有人查询 www.FreeBSD.org 时,解析器通常会向上级
ISP 的域名服务器发出请求, 并获得回应。 如果有本地的缓存
DNS 服务器, 查询只有在第一次被缓存 DNS
服务器发到外部世界。 其他的查询不会发向局域网外,
因为它们已经有在本地的缓存了。
DNS 如何运作
在 &os; 中, BIND 服务程序被称为
named。
文件
描述
&man.named.8;
BIND 服务程序
&man.rndc.8;
域名服务控制程序
/etc/namedb
BIND 存放域名信息的位置。
/etc/namedb/named.conf
域名服务配置文件
随在服务器上配置的域的性质不同,
域的定义文件一般会存放到
/etc/namedb 目录中的 master、 slave, 或 dynamic 子目录中。
这些文件中提供了域名服务器在响应查询时所需要的 DNS 信息。
启动 BIND
BIND
starting (启动)
由于 BIND 是默认安装的, 因此配置它相对而言很简单。
默认的 named 配置, 是在
&man.chroot.8; 环境中提供基本的域名解析服务,
并且只限于监听本地 IPv4 回环地址 (127.0.0.1)。
如果希望启动这一配置, 可以使用下面的命令:
&prompt.root; /etc/rc.d/named onestart
如果希望 named
服务在每次启动的时候都能够启动, 需要在
/etc/rc.conf 中加入:
named_enable="YES"
当然, 除了这份文档所介绍的配置选项之外, 在
/etc/namedb/named.conf 中还有很多其它的选项。
不过, 如果您需要了解 &os; 中用于启动 named
的那些选项的话, 则可以查看
/etc/defaults/rc.conf 中的
named_* 参数, 并参考
&man.rc.conf.5; 联机手册。 除此之外,
也是一个不错的起点。
配置文件
BIND
configuration files (配置文件)
目前, named 的配置文件存放于
/etc/namedb 目录,
在使用前应根据需要进行修改,
除非您只打算让它完成简单的域名解析服务。
这个目录同时也是您进行绝大多数配置的地方。
/etc/namedb/named.conf
// $FreeBSD$
//
// Refer to the named.conf(5) and named(8) man pages, and the documentation
// in /usr/share/doc/bind9 for more details.
//
// If you are going to set up an authoritative server, make sure you
// understand the hairy details of how DNS works. Even with
// simple mistakes, you can break connectivity for affected parties,
// or cause huge amounts of useless Internet traffic.
options {
// Relative to the chroot directory, if any
directory "/etc/namedb";
pid-file "/var/run/named/pid";
dump-file "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";
// If named is being used only as a local resolver, this is a safe default.
// For named to be accessible to the network, comment this option, specify
// the proper IP address, or delete this option.
listen-on { 127.0.0.1; };
// If you have IPv6 enabled on this system, uncomment this option for
// use as a local resolver. To give access to the network, specify
// an IPv6 address, or the keyword "any".
// listen-on-v6 { ::1; };
// These zones are already covered by the empty zones listed below.
// If you remove the related empty zones below, comment these lines out.
disable-empty-zone "255.255.255.255.IN-ADDR.ARPA";
disable-empty-zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below. This will make you
// benefit from its cache, thus reduce overall DNS traffic in the Internet.
/*
forwarders {
127.0.0.1;
};
*/
// If the 'forwarders' clause is not empty the default is to 'forward first'
// which will fall back to sending a query from your local server if the name
// servers in 'forwarders' do not have the answer. Alternatively you can
// force your name server to never initiate queries of its own by enabling the
// following line:
// forward only;
// If you wish to have forwarding configured automatically based on
// the entries in /etc/resolv.conf, uncomment the following line and
// set named_auto_forward=yes in /etc/rc.conf. You can also enable
// named_auto_forward_only (the effect of which is described above).
// include "/etc/namedb/auto_forward.conf";
正如注释所言, 如果希望从上级缓存中受益,
可以在此处启用 forwarders。
正常情况下, 域名服务器会逐级地查询
Internet 来找到特定的域名服务器, 直到得到答案为止。
这个选项将让它首先查询上级域名服务器 (或另外提供的域名服务器),
从而从它们的缓存中得到结果。 如果上级域名服务器是一个繁忙的高速域名服务器,
则启用它将有助于改善服务品质。
127.0.0.1
不会 正常工作。
一定要把地址改为您上级服务器的 IP 地址。
/*
Modern versions of BIND use a random UDP port for each outgoing
query by default in order to dramatically reduce the possibility
of cache poisoning. All users are strongly encouraged to utilize
this feature, and to configure their firewalls to accommodate it.
AS A LAST RESORT in order to get around a restrictive firewall
policy you can try enabling the option below. Use of this option
will significantly reduce your ability to withstand cache poisoning
attacks, and should be avoided if at all possible.
Replace NNNNN in the example with a number between 49160 and 65530.
*/
// query-source address * port NNNNN;
};
// If you enable a local name server, don't forget to enter 127.0.0.1
// first in your /etc/resolv.conf so this server will be queried.
// Also, make sure to enable it in /etc/rc.conf.
// The traditional root hints mechanism. Use this, OR the slave zones below.
zone "." { type hint; file "named.root"; };
/* Slaving the following zones from the root name servers has some
significant advantages:
1. Faster local resolution for your users
2. No spurious traffic will be sent from your network to the roots
3. Greater resilience to any potential root server failure/DDoS
On the other hand, this method requires more monitoring than the
hints file to be sure that an unexpected failure mode has not
incapacitated your server. Name servers that are serving a lot
of clients will benefit more from this approach than individual
hosts. Use with caution.
To use this mechanism, uncomment the entries below, and comment
the hint zone above.
*/
/*
zone "." {
type slave;
file "slave/root.slave";
masters {
192.5.5.241; // F.ROOT-SERVERS.NET.
};
notify no;
};
zone "arpa" {
type slave;
file "slave/arpa.slave";
masters {
192.5.5.241; // F.ROOT-SERVERS.NET.
};
notify no;
};
zone "in-addr.arpa" {
type slave;
file "slave/in-addr.arpa.slave";
masters {
192.5.5.241; // F.ROOT-SERVERS.NET.
};
notify no;
};
*/
/* Serving the following zones locally will prevent any queries
for these zones leaving your network and going to the root
name servers. This has two significant advantages:
1. Faster local resolution for your users
2. No spurious traffic will be sent from your network to the roots
*/
// RFC 1912
zone "localhost" { type master; file "master/localhost-forward.db"; };
zone "127.in-addr.arpa" { type master; file "master/localhost-reverse.db"; };
zone "255.in-addr.arpa" { type master; file "master/empty.db"; };
// RFC 1912-style zone for IPv6 localhost address
zone "0.ip6.arpa" { type master; file "master/localhost-reverse.db"; };
// "This" Network (RFCs 1912 and 3330)
zone "0.in-addr.arpa" { type master; file "master/empty.db"; };
// Private Use Networks (RFC 1918)
zone "10.in-addr.arpa" { type master; file "master/empty.db"; };
zone "16.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "17.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "18.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "19.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "20.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "21.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "22.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "23.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "24.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "25.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "26.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "27.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "28.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "29.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "30.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "31.172.in-addr.arpa" { type master; file "master/empty.db"; };
zone "168.192.in-addr.arpa" { type master; file "master/empty.db"; };
// Link-local/APIPA (RFCs 3330 and 3927)
zone "254.169.in-addr.arpa" { type master; file "master/empty.db"; };
// TEST-NET for Documentation (RFC 3330)
zone "2.0.192.in-addr.arpa" { type master; file "master/empty.db"; };
// Router Benchmark Testing (RFC 3330)
zone "18.198.in-addr.arpa" { type master; file "master/empty.db"; };
zone "19.198.in-addr.arpa" { type master; file "master/empty.db"; };
// IANA Reserved - Old Class E Space
zone "240.in-addr.arpa" { type master; file "master/empty.db"; };
zone "241.in-addr.arpa" { type master; file "master/empty.db"; };
zone "242.in-addr.arpa" { type master; file "master/empty.db"; };
zone "243.in-addr.arpa" { type master; file "master/empty.db"; };
zone "244.in-addr.arpa" { type master; file "master/empty.db"; };
zone "245.in-addr.arpa" { type master; file "master/empty.db"; };
zone "246.in-addr.arpa" { type master; file "master/empty.db"; };
zone "247.in-addr.arpa" { type master; file "master/empty.db"; };
zone "248.in-addr.arpa" { type master; file "master/empty.db"; };
zone "249.in-addr.arpa" { type master; file "master/empty.db"; };
zone "250.in-addr.arpa" { type master; file "master/empty.db"; };
zone "251.in-addr.arpa" { type master; file "master/empty.db"; };
zone "252.in-addr.arpa" { type master; file "master/empty.db"; };
zone "253.in-addr.arpa" { type master; file "master/empty.db"; };
zone "254.in-addr.arpa" { type master; file "master/empty.db"; };
// IPv6 Unassigned Addresses (RFC 4291)
zone "1.ip6.arpa" { type master; file "master/empty.db"; };
zone "3.ip6.arpa" { type master; file "master/empty.db"; };
zone "4.ip6.arpa" { type master; file "master/empty.db"; };
zone "5.ip6.arpa" { type master; file "master/empty.db"; };
zone "6.ip6.arpa" { type master; file "master/empty.db"; };
zone "7.ip6.arpa" { type master; file "master/empty.db"; };
zone "8.ip6.arpa" { type master; file "master/empty.db"; };
zone "9.ip6.arpa" { type master; file "master/empty.db"; };
zone "a.ip6.arpa" { type master; file "master/empty.db"; };
zone "b.ip6.arpa" { type master; file "master/empty.db"; };
zone "c.ip6.arpa" { type master; file "master/empty.db"; };
zone "d.ip6.arpa" { type master; file "master/empty.db"; };
zone "e.ip6.arpa" { type master; file "master/empty.db"; };
zone "0.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "1.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "2.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "3.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "4.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "5.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "6.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "7.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "8.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "9.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "a.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "b.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "0.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "1.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "2.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "3.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "4.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "5.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "6.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "7.e.f.ip6.arpa" { type master; file "master/empty.db"; };
// IPv6 ULA (RFC 4193)
zone "c.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "d.f.ip6.arpa" { type master; file "master/empty.db"; };
// IPv6 Link Local (RFC 4291)
zone "8.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "9.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "a.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "b.e.f.ip6.arpa" { type master; file "master/empty.db"; };
// IPv6 Deprecated Site-Local Addresses (RFC 3879)
zone "c.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "d.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "e.e.f.ip6.arpa" { type master; file "master/empty.db"; };
zone "f.e.f.ip6.arpa" { type master; file "master/empty.db"; };
// IP6.INT is Deprecated (RFC 4159)
zone "ip6.int" { type master; file "master/empty.db"; };
// NB: Do not use the IP addresses below, they are faked, and only
// serve demonstration/documentation purposes!
//
// Example slave zone config entries. It can be convenient to become
// a slave at least for the zone your own domain is in. Ask
// your network administrator for the IP address of the responsible
// master name server.
//
// Do not forget to include the reverse lookup zone!
// This is named after the first bytes of the IP address, in reverse
// order, with ".IN-ADDR.ARPA" appended, or ".IP6.ARPA" for IPv6.
//
// Before starting to set up a master zone, make sure you fully
// understand how DNS and BIND work. There are sometimes
// non-obvious pitfalls. Setting up a slave zone is usually simpler.
//
// NB: Don't blindly enable the examples below. :-) Use actual names
// and addresses instead.
/* An example dynamic zone
key "exampleorgkey" {
algorithm hmac-md5;
secret "sf87HJqjkqh8ac87a02lla==";
};
zone "example.org" {
type master;
allow-update {
key "exampleorgkey";
};
file "dynamic/example.org";
};
*/
/* Example of a slave reverse zone
zone "1.168.192.in-addr.arpa" {
type slave;
file "slave/1.168.192.in-addr.arpa";
masters {
192.168.1.1;
};
};
*/
在 named.conf 中,
还给出了从域、转发域和反解析域的例子。
如果新增了域, 就必需在 named.conf 中加入对应的项目。
例如, 用于
example.org 的域文件的描述类似下面这样:
zone "example.org" {
type master;
file "master/example.org";
};
如 语句所标示的那样,
这是一个主域, 其信息保存在
/etc/namedb/master/example.org
中, 如 语句所示。
zone "example.org" {
type slave;
file "slave/example.org";
};
在从域的情形中, 所指定的域的信息会从主域名服务器传递过来,
并保存到对应的文件中。 当主域服务器发生问题或不可达时,
从域名服务器就有一份可用的域名信息, 从而能够对外提供服务。
域文件
BIND
zone files (域文件)
下面的例子展示了用于 example.org 的主域文件 (存放于
/etc/namedb/master/example.org):
$TTL 3600 ; 1 hour default TTL
example.org. IN SOA ns1.example.org. admin.example.org. (
2006051501 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
300 ; Negative Reponse TTL
)
; DNS Servers
IN NS ns1.example.org.
IN NS ns2.example.org.
; MX Records
IN MX 10 mx.example.org.
IN MX 20 mail.example.org.
IN A 192.168.1.1
; Machine Names
localhost IN A 127.0.0.1
ns1 IN A 192.168.1.2
ns2 IN A 192.168.1.3
mx IN A 192.168.1.4
mail IN A 192.168.1.5
; Aliases
www IN CNAME example.org.
请注意以 .
结尾的主机名是全称主机名, 而结尾没有
.
的则是相对于原点的主机名。 例如,
ns1 将被转换为
ns1.example.org.
域信息文件的格式如下:
记录名 IN 记录类型 值
DNS
记录
最常用的 DNS 记录:
SOA
域权威开始
NS
权威域名服务器
A
主机地址
CNAME
别名对应的正规名称
MX
邮件传递服务器
PTR
域名指针 (用于反向 DNS)
example.org. IN SOA ns1.example.org. admin.example.org. (
2006051501 ; Serial
10800 ; Refresh after 3 hours
3600 ; Retry after 1 hour
604800 ; Expire after 1 week
300 ) ; Negative Reponse TTL
example.org.
域名, 同时也是这个域信息文件的原点。
ns1.example.org.
该域的主/权威域名服务器。
admin.example.org.
此域的负责人的电子邮件地址,
其中 @
需要换掉 (admin@example.org 对应
admin.example.org)
2006051501
文件的序号。 每次修改域文件时都必须增加这个数字。
现今, 许多管理员会考虑使用
yyyymmddrr 这样的格式来表示序号。
2006051501 通常表示上次修改于
05/15/2006, 而后面的
01 则表示在那天的第一次修改。
序号非常重要, 它用于通知从域服务器更新数据。
IN NS ns1.example.org.
这是一个 NS 项。 每个准备提供权威应答的服务器都必须有一个对应项。
localhost IN A 127.0.0.1
ns1 IN A 192.168.1.2
ns2 IN A 192.168.1.3
mx IN A 192.168.1.4
mail IN A 192.168.1.5
A 记录指明了机器名。 正如在前面所看到的,
ns1.example.org 将解析为
192.168.1.2。
IN A 192.168.1.1
这一行把当前原点 example.org
指定为使用 IP 地址
192.168.1.1。
www IN CNAME @
正规名 (CNAME) 记录通常用于为某台机器指定别名。
在这个例子中, 将 www
指定成了 主
机器的一个别名,
后者的名字与域名
example.org
(192.168.1.1) 相同。
CNAME 不能同与之有相同名字的任何其它记录并存。
MX 记录
IN MX 10 mail.example.org.
MX 记录表示哪个邮件服务器负责接收发到这个域的邮件。
mail.example.org 是邮件服务器的主机名,
而 10 则是它的优先级。
可以有多台邮件服务器, 其优先级分别是 10、
20 等等。 尝试向 example.org 投递邮件的服务器,
会首先尝试优先级最高的 MX (优先级数值最小的记录)、
接着尝试次高的, 并重复这一过程直到邮件递达为止。
in-addr.arpa 域名信息文件 (反向 DNS), 采用的格式是同样的,
只是 PTR 项代替了 A 或 CNAME 的位置。
$TTL 3600
1.168.192.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. (
2006051501 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
300 ) ; Negative Reponse TTL
IN NS ns1.example.org.
IN NS ns2.example.org.
1 IN PTR example.org.
2 IN PTR ns1.example.org.
3 IN PTR ns2.example.org.
4 IN PTR mx.example.org.
5 IN PTR mail.example.org.
这个文件给出了上述假想域中 IP 地址到域名的映射关系。
需要说明的是, 在 PTR 记录右侧的名字必须是全称域名
(也就是必须以 .
结束)。
缓存域名服务器
BIND
缓存域名服务器
缓存域名服务器是一种主要承担解析递归查询角色的域名服务器。
它简单地自行进行查询, 并将查询结果记住以备后续使用。
安全
尽管 BIND 是最为常用的 DNS 实现, 但它总是有一些安全问题。
时常会有人发现一些可能的甚至可以利用的安全漏洞。
尽管 &os; 会自动将
named 放到 &man.chroot.8;
环境中运行, 但仍有一些其它可用的安全机制来帮助您规避潜在的针对
DNS 服务的攻击。
阅读 CERT 的安全公告,
并订阅 the &a.security-notifications; 是一个有助于帮助您了解最新
Internet 及 &os; 安全问题的好习惯。
如果发现了问题, 确保源代码是最新的,
并重新联编一份 named 有可能会有所帮助。
进一步阅读
BIND/named 联机手册:
&man.rndc.8; &man.named.8; &man.named.conf.5;
官方的 ISC BIND
页面
Official ISC BIND
Forum
O'Reilly
DNS 和 BIND 第 5 版
RFC1034
- 域名 - 概念和工具
RFC1035
- 域名 - 实现及其标准
Murray
Stokely
Contributed by
Apache HTTP 服务器
web 服务器
配置
Apache
纵览
&os; 被用于运行许多全球最为繁忙的 web 站点。
大多数 Internet 上的 web 服务器,
都使用 Apache HTTP 服务器。
Apache 软件包可以在您的 FreeBSD
安装盘上找到。 如果没有在首次安装时附带安装
Apache, 则可以通过 www/apache13 或 www/apache22 port 来安装。
一旦成功地安装了 Apache,
就必须对其进行配置。
这一节介绍了 1.3.X 版本的
Apache HTTP 服务器 的配置,
因为它是随 &os; 一同使用的最多的版本。
Apache 2.X 引入了很多新技术,
但在此并不讨论。 要了解关于 Apache 2.X
的更多资料, 请参见 。
配置
Apache
配置文件
主要的 Apache HTTP Server 配置文件,
在 &os; 上会安装为
/usr/local/etc/apache/httpd.conf。
这是一个典型的 &unix; 文本配置文件, 它使用 #
作为注释符。 关于全部配置选项的详尽介绍超出了本书的范围,
这里将只介绍最常被修改的那些。
ServerRoot "/usr/local"
这指定了 Apache
安装的顶级目录。 执行文件被放到服务器根目录 (server root) 的
bin 和
sbin 子目录中,
而配置文件则位于
etc/apache。
ServerAdmin you@your.address
这个地址是在服务器发生问题时应发送电子邮件的地址,
它会出现在服务器生成的页面上, 例如错误页面。
ServerName www.example.com
ServerName 允许您配置发送回客户端的主机名,
如果您的服务器被用户以别的名字访问 (例如, 使用 www
而不是主机本身的真实名字)。
DocumentRoot "/usr/local/www/data"
DocumentRoot: 这个目录是您的文档所在的目录。
默认情况下, 所有的请求都会从这个位置去获取,
但也可以通过符号连接和别名指定其它的位置。
在修改配置之前备份
Apache 的配置文件永远是一个好习惯。
一旦对初始配置满意了, 就可以开始运行 Apache 了。
运行 Apache
Apache
启动和停止
与许多其它网络服务不同, Apache 并不依赖
inetd 超级服务器来运行。
一般情况下会把它配置为一个独立的服务器, 以期在客户的 web
浏览器连入 HTTP 请求时, 能够获得更好的性能。 它提供了一个 shell
脚本来使启动、 停止和重新启动服务器变得尽可能地简单。
首次启动 Apache,
只需执行:
&prompt.root; /usr/local/sbin/apachectl start
可以在任何时候使用下面的命令来停止服务:
&prompt.root; /usr/local/sbin/apachectl stop
当由于某种原因修改了配置文件之后, 需要重启服务器:
&prompt.root; /usr/local/sbin/apachectl restart
要在重启 Apache 服务器时不中断当前的连接,
则应运行:
&prompt.root; /usr/local/sbin/apachectl graceful
更多的信息, 可以在
&man.apachectl.8; 联机手册中找到。
要在系统启动时启动 Apache, 则应在
/etc/rc.conf 中加入:
apache_enable="YES"
或者对于Apache 2.2:
apache22_enable="YES"
如果您希望在系统引导时启动 Apache
httpd 程序并指定其它一些选项,
则可以把下面的行加到
rc.conf:
apache_flags=""
现在 web 服务器就开始运行了, 您可以使用 web 浏览器打开
http://localhost/。 默认显示的 web 页面是
/usr/local/www/data/index.html。
虚拟主机
Apache 支持两种不同类型的虚拟主机。
第一种方法是基于名字的虚拟主机。 基于名字的虚拟主机使用客户机发来的
HTTP/1.1 头来辨别主机名。 这使得不同的域得以共享同一个 IP 地址。
要配置 Apache 来使用基于名字的虚拟主机,
需要把类似下面的项加到您的 httpd.conf 中:
NameVirtualHost *
如果您的 web 服务器的名字是 www.domain.tld,
而您希望建立一个
www.someotherdomain.tld 的虚拟域,
则应在
httpd.conf 中加入:
<VirtualHost *>
ServerName www.domain.tld
DocumentRoot /www/domain.tld
</VirtualHost>
<VirtualHost *>
ServerName www.someotherdomain.tld
DocumentRoot /www/someotherdomain.tld
</VirtualHost>
您需要把上面的地址和文档路径改为所使用的那些。
要了解关于虚拟主机的更多信息,
请参考官方的 Apache 文档, 这些文档可以在 找到。
Apache 模块
Apache
模块
有许多不同的 Apache 模块,
它们可以在基本的服务器基础上提供许多附加的功能。 FreeBSD 的
Ports Collection 为安装
Apache
和常用的附加模块提供了非常方便的方法。
mod_ssl
web 服务器
安全
SSL
密码学
mod_ssl 这个模块使用 OpenSSL 库,
来提供通过 安全套接字层 (SSL v2/v3) 和 传输层安全 (TLS v1)
协议的强加密能力。
这个模块提供了从某一受信的证书签署机构申请签名证书所需的所有工具,
您可以藉此在 &os; 上运行安全的 web 服务器。
如果您未曾安装
Apache, 也可以直接安装一份包含了
mod_ssl 的版本的
Apache
1.3.X, 其方法是通过 www/apache13-modssl port 来进行。 SSL
支持已经作为 Apache 2.X 的一部分提供,
您可以通过
www/apache22 port 来安装后者。
语言绑定
Apache对于一些主要的脚本语言都有相应的模块。
这些模块使得完全使用某种脚本语言来写
Apache 模块成为可能。
他们通常也被嵌入到服务器作为一个常驻内存的解释器,
以避免启动一个外部解释器对于下一节将描述的动态网站所需时间和资源上的开销。
动态网站
web servers
dynamic
在过去的十年里,越来越多的企业为了增加收益和暴光率而转向了互联网。
这也同时增进了对于互动网页内容的需求。有些公司,比如 µsoft;
推出了基于他们专有产品的解决方案,开源社区也做出了积极的回应。
比较时尚的选择包括 Django,Ruby on Rails,
mod_perl, and
mod_php.
Django
Python
Django
Django 是一个以 BSD 许可证发布的 framework,
能让开发者快速写出高性能高品质的 web 应用程序。
它提供给一个对象关系映射组件,数据类型可以被当 Python
中的对象,和一组丰富的动态数据库访问 API,
使开发者避免了写 SQL 语句。它同时还提供了可扩展的模板系统,
让应用程序的逻辑部分与 HTML 的表现层分离。
Django 依赖与 mod_python,
Apache, 和一个可选的 SQL
数据库引擎。 在设置了一些恰当的标志后,FreeBSD 的 Port
系统将会帮助你安装这些必需的依赖库。
安装 Django,Apache2, mod_python3,和 PostgreSQL
&prompt.root; cd /usr/ports/www/py-django; make all install clean -DWITH_MOD_PYTHON3 -DWITH_POSTGRESQL
在安装了 Django 和那些依赖的软件之后,
你需要创建一个 Django 项目的目录,然后配置
Apache,当有对于你网站上应用程序的某些指定的 URL
时调用内嵌的 Python 解释器。
Django/mod_python 有关 Apache 部分的配置
你需要在 Apache 的配置文件
httpd.conf 加入以下这几行,
把对某些 URL 的请求传给你的 web 应用程序:
<Location "/">
SetHandler python-program
PythonPath "['/dir/to/your/django/packages/'] + sys.path"
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonAutoReload On
PythonDebug On
</Location>
Ruby on Rails
Ruby on Rails
Ruby on Rails 是另外一个开源的 web framework,
提供了一个全面的开发框架,能帮助 web
开发者工作更有成效和快速写出强大的应用。
它能非常容易的从 posts 系统安装。
&prompt.root; cd /usr/ports/www/rubygem-rails; make all install clean
mod_perl
mod_perl
Perl
Apache/Perl 集成计划, 将 Perl
程序设计语言的强大功能, 与 Apache
HTTP 服务器 紧密地结合到了一起。
通过 mod_perl 模块,
可以完全使用 Perl 来撰写 Apache 模块。
此外, 服务器中嵌入的持久性解释器, 消除了由于启动外部的解释器为 Perl
脚本的启动所造成的性能损失。
mod_perl 通过多种方式提供。
要使用 mod_perl,
应该注意 mod_perl 1.0
只能配合 Apache 1.3 而
mod_perl 2.0 只能配合
Apache 2.X 使用。
mod_perl 1.0 可以通过
www/mod_perl 安装,
而以静态方式联编的版本, 则可以通过
www/apache13-modperl
来安装。
mod_perl 2.0 则可以通过
www/mod_perl2 安装。
Tom
Rhodes
Written by
mod_php
mod_php
PHP
PHP, 也称为 PHP:
Hypertext Preprocessor
,
是一种特别适合于 Web 开发的通用脚本语言。
它能够很容易地嵌入到 HTML 之中,
其语法接近于 C、 &java;, 以及 Perl, 以期让 web
开发人员的一迅速撰写动态生成的页面。
要获得用于
Apache web 服务器的
PHP5 支持, 可以从安装
lang/php5
port 开始。
在首次安装 lang/php5 port
的时候, 系统会自动显示可用的一系列
OPTIONS (配置选项)。 如果您没有看到菜单,
例如由于过去曾经安装过 lang/php5 port 等等,
可以用下面的命令再次显示配置菜单, 在 port 的目录中执行:
&prompt.root; make config
在配置选项对话框中, 选中
APACHE 这一项, 就可以联编出用于与
Apache web 服务器配合使用的可动态加载的
mod_php5 模块了。
由于各式各样的原因 (例如, 出于已经部署的 web 应用的兼容性考虑),
许多网站仍在使用 PHP4。 如果您需要
mod_php4 而不是
mod_php5, 请使用
lang/php4 port。
lang/php4 port 也支持许多
lang/php5 port 提供的配置和编译时选项。
前面我们已经成功地安装并配置了用于支持动态 PHP 应用所需的模块。
请检查并确认您已将下述配置加入到了
/usr/local/etc/apache/httpd.conf 中:
LoadModule php5_module libexec/apache/libphp5.so
AddModule mod_php5.c
<IfModule mod_php5.c>
DirectoryIndex index.php index.html
</IfModule>
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
</IfModule>
这些工作完成之后, 还需要使用
apachectl 命令来完成一次 graceful
restart 以便加载 PHP 模块:
&prompt.root; apachectl graceful
在未来您升级 PHP 时,
make config 这步操作就不再是必需的了;
您所选择的 OPTIONS 会由 &os;
的 Ports 框架自动保存。
在 &os; 中的 PHP 支持是高度模块化的,
因此基本安装的功能十分有限。 增加其他功能的支持非常简单, 只需通过
lang/php5-extensions port
即可完成。 这个 port 提供了一个菜单驱动的界面来帮助完成
PHP 扩展的安装。 另外, 也可以通过对应的 port
来单独安装扩展。
例如, 要将对于
MySQL 数据库服务器的支持加入
PHP5, 只需简单地安装
databases/php5-mysql
port。
安装完扩展之后, 必须重新启动
Apache 服务器,
来令其适应新的配置变更:
&prompt.root; apachectl graceful
Murray
Stokely
Contributed by
文件传输协议 (FTP)
FTP 服务器
纵览
文件传输协议 (FTP) 为用户提供了一个简单的, 与 FTP 服务器交换文件的方法。 &os;
系统中包含了 FTP
服务软件, ftpd。 这使得在 &os;
上建立和管理 FTP 服务器变得非常简单。
配置
最重要的配置步骤是决定允许哪些帐号访问 FTP 服务器。
一般的 &os; 系统包含了一系列系统帐号分别用于执行不同的服务程序,
但未知的用户不应被允许登录并使用这些帐号。
/etc/ftpusers 文件中, 列出了不允许通过
FTP 访问的用户。 默认情况下, 这包含了前述的系统帐号,
但也可以在这里加入其它不应通过 FTP 访问的用户。
您可能会希望限制通过 FTP 登录的某些用户,
而不是完全阻止他们使用 FTP。 这可以通过 /etc/ftpchroot
文件来完成。 这一文件列出了希望对 FTP 访问进行限制的用户和组的表。
而在 &man.ftpchroot.5; 联机手册中, 已经对此进行了详尽的介绍,
故而不再赘述。
FTP
匿名
如果您想要在服务器上启用匿名的 FTP 访问, 则必须建立一个名为
ftp 的 &os; 用户。 这样, 用户就可以使用
ftp 或 anonymous
和任意的口令 (习惯上, 应该是以那个用户的邮件地址作为口令)
来登录和访问您的 FTP 服务器。 FTP 服务器将在匿名用户登录时调用
&man.chroot.2;, 以便将其访问限制在
ftp 用户的主目录中。
有两个文本文件可以用来指定显示在 FTP 客户程序中的欢迎文字。
/etc/ftpwelcome 文件中的内容将在用户连接上之后,
在登录提示之前显示。 在成功的登录之后, 将显示
/etc/ftpmotd 文件中的内容。
请注意后者是相对于登录环境的, 因此对于匿名用户而言,
将显示 ~ftp/etc/ftpmotd。
一旦正确地配置了 FTP 服务器,
就必须在 /etc/inetd.conf 中启用它。
这里需要做的全部工作就是将注释符
#
从已有的
ftpd 行之前去掉:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
如 所介绍的那样,
修改这个文件之后, 必须让 inetd 重新加载它,
才能使新的设置生效。请参阅
以获取更多有关如何在你系统上启用 inetd
的详细信息。
ftpd 也可以作为一个独立的服务启动。
这样的话就需要在 /etc/rc.conf
中设置如下的变量:
ftpd_enable="YES"
在设置了上述变量之后,独立的服务将在下次系统重启的时候启动,
或者通过以 root 身份手动执行如下的命令启动:
&prompt.root; /etc/rc.d/ftpd start
现在可以通过输入下面的命令来登录您的 FTP 服务器了:
&prompt.user; ftp localhost
维护
syslog
日志文件
FTP
ftpd 服务程序使用
&man.syslog.3; 来记录消息。 默认情况下,
系统日志将把和 FTP 相关的消息记录到
/var/log/xferlog 文件中。 FTP 日志的位置,
可以通过修改
/etc/syslog.conf 中如下所示的行来修改:
ftp.info /var/log/xferlog
FTP
匿名
一定要小心对待在匿名 FTP 服务器中可能遇到的潜在问题。
一般而言, 允许匿名用户上传文件应三思。 您可能发现自己的 FTP
站点成为了交易未经授权的商业软件的论坛, 或发生更糟糕的情况。
如果不需要匿名的 FTP 上传, 可以在文件上配置权限,
使得您能够在其它匿名用户能够下载这些文件之前复查它们。
Murray
Stokely
Contributed by
为 µsoft.windows; 客户机提供文件和打印服务 (Samba)
Samba 服务器
Microsoft Windows
文件服务器
Windows 客户机
打印服务器
Windows 客户机
纵览
Samba 是一个流行的开源软件包,
它提供了针对 µsoft.windows; 客户机的文件和打印服务。
这类客户机可以连接并使用 FreeBSD 系统上的文件空间,
就如同使用本地的磁盘一样, 或者像使用本地打印机一样使用
FreeBSD 上的打印机。
Samba 软件包可以在您的 FreeBSD
安装盘上找到。 如果您没有在初次安装 FreeBSD
时安装 Samba, 则可以通过 net/samba3 port 或 package 来安装。
配置
默认的 Samba 配置文件会以
/usr/local/share/examples/samba/smb.conf.default
的名字安装。这个文件必须复制为
/usr/local/etc/smb.conf 并进行定制,
才能开始使用 Samba。
smb.conf 文件中包含了
Samba 的运行时配置信息,
例如对于打印机的定义, 以及希望共享给 &windows;
客户机的 共享文件系统
。
Samba 软件包包含了一个称为
swat 的 web 管理工具,
后者提供了配置 smb.conf 文件的简单方法。
使用 Samba Web 管理工具 (SWAT)
Samba Web 管理工具 (SWAT) 是一个通过
inetd 运行的服务程序。 因此,
需要把 /etc/inetd.conf 中下面几行的注释去掉,
才能够使用 swat
来配置 Samba:
swat stream tcp nowait/400 root /usr/local/sbin/swat swat
如 中所介绍的那样,
在修改了这个配置文件之后, 必须让 inetd
重新加载配置, 才能使其生效。
一旦在 inetd.conf 中启用了
swat, 就可以用浏览器访问
connect to 了。
您将首先使用系统的 root
帐号登录。
只要成功地登录进了
Samba 配置页面,
就可以浏览系统的文档, 或从
Globals(全局) 选项卡开始配置了。
Globals 小节对应于 [global]
小节中的变量, 前者位于
/usr/local/etc/smb.conf 中。
全局配置
无论是使用 swat,
还是直接编辑 /usr/local/etc/smb.conf,
通常首先要配置的 Samba
选项都是:
workgroup
NT 域名或工作组名,
其他计算机将通过这些名字来找到服务器。
netbios name
NetBIOS
这个选项用于设置 Samba 服务器的
NetBIOS 名字。 默认情况下, 这是所在主机的 DNS 名字的第一部分。
server string
这个选项用于设置通过 net view
命令, 以及某些其他网络工具可以查看到的关于服务器的说明性文字。
安全配置
在
/usr/local/etc/smb.conf 中的两个最重要的配置,
是选定的安全模型, 以及客户机上用户的口令存放后端。
下面的语句控制这些选项:
security
最常见的选项形式是
security = share 和 security
= user。 如果您的客户机使用用户名,
并且这些用户名与您的 &os; 机器一致,
一般应选择用户级 (user) 安全。 这是默认的安全策略,
它要求客户机首先登录, 然后才能访问共享的资源。
如果采用共享级 (share) 安全,
则客户机不需要用有效的用户名和口令登录服务器,
就能够连接共享的资源。 这是较早版本的
Samba 中的默认值。
passdb backend
NIS+
LDAP
SQL 数据库
Samba 提供了若干种不同的验证后端模型。
您可以通过 LDAP、 NIS+、 SQL 数据库, 或经过修改的口令文件,
来完成客户端的身份验证。 默认的验证模式是
smbpasswd, 这也是本章将介绍的全部内容。
假设您使用的是默认的 smbpasswd
后端, 则必须首先创建一个
/usr/local/private/smbpasswd 文件,
来允许 Samba 对客户进行身份验证。
如果您打算让 &unix; 用户帐号能够从 &windows;
客户机上登录, 可以使用下面的命令:
&prompt.root; smbpasswd -a username
从 Samba 3.0.23c 开始,
用于存在验证文件的实际目录变成了
/usr/local/etc/samba。
目前推荐使用的后端是 tdbsam,
您应使用下面的命令来添加用户帐号:
&prompt.root; pdbedit username
请参考
官方的 Samba HOWTO
以了解关于配置选项的进一步信息。 按照前面给出的基本描述,
您应该已经可以启动
Samba 了。
启动 Samba
net/samba3 port
会增加一个新的用于控制
Samba 的启动脚本。 要启用这个脚本,
以便用它来完成启动、 停止或重启
Samba 的任务, 需要在
/etc/rc.conf 文件中加入:
samba_enable="YES"
此外, 也可以进行更细粒度的控制:
nmbd_enable="YES"
smbd_enable="YES"
这也同时配置了在系统引导时启动 Samba。
配置好之后, 就可以在任何时候通过下面的命令来启动
Samba 了:
&prompt.root; /usr/local/etc/rc.d/samba start
Starting SAMBA: removing stale tdbs :
Starting nmbd.
Starting smbd.
请参见 以了解关于使用 rc 脚本的进一步信息。
Samba 事实上包含了三个相互独立的服务程序。
您应该能够看到
nmbd 和 smbd
两个服务程序都是通过 samba 脚本启动的。 如果在
smb.conf 中启用了 winbind 名字解析服务,
则应该可以看到 winbindd
服务被启动起来。
可以在任何时候通过下面的命令来停止运行
Samba:
&prompt.root; /usr/local/etc/rc.d/samba stop
Samba 是一个复杂的软件包,
它提供了用于与 µsoft.windows; 网络进行集成的各式各样的功能。
要了解关于这里所介绍的基本安装以外的其它功能,
请访问 。
Tom
Hukins
Contributed by
通过 NTP 进行时钟同步
NTP
纵览
随着时间的推移, 计算机的时钟会倾向于漂移。
网络时间协议 (NTP) 是一种确保您的时钟保持准确的方法。
许多 Internet 服务依赖、 或极大地受益于本地计算机时钟的准确性。
例如, web 服务器可能会接收到一个请求,
要求如果文件在某一时刻之后修改过才发送它。
在局域网环境中, 共享文件的计算机之间的时钟是否同步至关重要,
因为这样才能使时间戳保持一致。 类似 &man.cron.8;
这样的程序, 也依赖于正确的系统时钟, 才能够准确地执行操作。
NTP
ntpd
FreeBSD 附带了 &man.ntpd.8; NTP 服务器,
它可以用于查询其它的 NTP
服务器, 并配置本地计算机的时钟, 或者为其它机器提供服务。
选择合适的 NTP 服务器
NTP
选择服务器
为了同步您的系统时钟,
需要首先找到至少一个 NTP 服务器以供使用。 网络管理员,
或 ISP 都可能会提供用于这样目的的 NTP
服务器—请查看他们的文档以了解是否是这样。
另外, 也有一个在线的 公开的
NTP 服务器列表, 您可以从中选一个较近的 NTP 服务器。
请确认您选择的服务器的访问策略, 如果需要的话,
申请一下所需的许可。
选择多个相互不连接的 NTP 服务器是一个好主意,
这样在某个服务器不可达, 或者时钟不可靠时就可以有别的选择。
这是因为, &man.ntpd.8;
会智能地选择它收到的响应—它会更倾向于使用可靠的服务器。
配置您的机器
NTP
配置
基本配置
ntpdate
如果只想在系统启动时同步时钟,
则可以使用 &man.ntpdate.8;。 对于经常重新启动,
并且不需要经常同步的桌面系统来说这比较适合,
但绝大多数机器都应该运行 &man.ntpd.8;。
在引导时使用 &man.ntpdate.8; 来配合运行 &man.ntpd.8;
也是一个好主意。 &man.ntpd.8; 渐进地修正时钟,
而 &man.ntpdate.8; 则直接设置时钟,
无论机器的当前时间和正确时间有多大的偏差。
要启用引导时的 &man.ntpdate.8;, 需要把
ntpdate_enable="YES" 加到
/etc/rc.conf 中。 此外,
还需要通过 ntpdate_flags
来设置同步的服务器和选项,
它们将传递给 &man.ntpdate.8;。
NTP
ntp.conf
一般配置
NTP 是通过
/etc/ntp.conf 文件来进行配置的,
其格式在 &man.ntp.conf.5; 中进行了描述。
下面是一个例子:
server ntplocal.example.com prefer
server timeserver.example.org
server ntp2a.example.net
driftfile /var/db/ntp.drift
这里, server 选项指定了使用哪一个服务器,
每一个服务器都独立一行。 如果某一台服务器上指定了 prefer
(偏好) 参数, 如上面的 ntplocal.example.com,
则会优先选择这个服务器。
如果偏好的服务器和其他服务器的响应存在显著的差别,
则丢弃它的响应, 否则将使用来自它的响应,
而不理会其他服务器。 一般来说,
prefer 参数应该标注在非常精确的 NTP
时源, 例如那些包含特殊的时间监控硬件的服务器上。
而 driftfile 选项,
则指定了用来保存系统时钟频率偏差的文件。
&man.ntpd.8; 程序使用它来自动地补偿时钟的自然漂移,
从而使时钟即使在切断了外来时源的情况下,
仍能保持相当的准确度。
另外, driftfile
选项也保存上一次响应所使用的 NTP 服务器的信息。
这个文件包含了 NTP 的内部信息, 它不应被任何其他进程修改。
控制您的服务器的访问
默认情况下, NTP 服务器可以被整个 Internet 上的主机访问。
如果在 /etc/ntp.conf 中指定 restrict
参数, 则可以控制允许哪些机器访问您的服务器。
如果希望拒绝所有的机器访问您的 NTP
服务器, 只需在
/etc/ntp.conf 中加入:
restrict default ignore
这样做会禁止您的服务器访问在本地配置中列出的服务器。
如果您需要令 NTP 服务器与外界的 NTP
服务器同步时间, 则应允许指定服务器。 请参见联机手册
&man.ntp.conf.5; 以了解进一步的细节。
如果只希望子网内的机器通过您的服务器同步时钟,
而不允许它们配置为服务器, 或作为同步时钟的节点来时用,
则加入
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
这里, 需要把 192.168.1.0 改为您网络上的
IP 地址, 并把 255.255.255.0 改为您的子网掩码。
/etc/ntp.conf 可能包含多个
restrict 选项。 要了解进一步的细节,
请参见 &man.ntp.conf.5; 的
Access Control Support(访问控制支持)
小节。
运行 NTP 服务器
要让 NTP 服务器在系统启动时随之开启,
需要把 ntpd_enable="YES" 加入到
/etc/rc.conf 中。
如果希望向 &man.ntpd.8; 传递更多参数, 需要编辑
/etc/rc.conf 中的
ntpd_flags。
要在不重新启动机器的前提下启动服务器, 需要手工运行
ntpd, 并带上
/etc/rc.conf
中的 ntpd_flags 所指定的参数。
例如:
&prompt.root; ntpd -p /var/run/ntpd.pid
在临时性的 Internet 连接上使用 ntpd
&man.ntpd.8; 程序的正常工作并不需要永久性的 Internet 连接。
然而, 如果您的临时性连接是配置为按需拨号的,
那么防止 NTP 通讯频繁触发拨号, 或保持连接就有必要了。
如果您使用用户级 PPP, 可以使用 filter
语句, 在 /etc/ppp/ppp.conf 中进行必要的设置。
例如:
set filter dial 0 deny udp src eq 123
# Prevent NTP traffic from initiating dial out
set filter dial 1 permit 0 0
set filter alive 0 deny udp src eq 123
# Prevent incoming NTP traffic from keeping the connection open
set filter alive 1 deny udp dst eq 123
# Prevent outgoing NTP traffic from keeping the connection open
set filter alive 2 permit 0/0 0/0
要了解进一步的信息, 请参考 &man.ppp.8; 的 PACKET
FILTERING(包过滤) 小节, 以及
/usr/share/examples/ppp/ 中的例子。
某些 Internet 访问提供商会阻止低编号的端口,
这会导致 NTP 无法正常工作, 因为响应无法到达您的机器。
进一步的信息
关于 NTP 服务器的文档, 可以在
/usr/share/doc/ntp/ 找到 HTML
格式的版本。
Tom
Rhodes
Contributed by
使用 syslogd 记录远程主机的日志
处理系统日志对于系统安全和管理是一个重要方面。
当有多台分布在中型或大型网络的机器,再或者是处于各种不同类型的网络中,
监视他们上面的日志文件则显得非常难以操作, 在这种情况下,
配置远程日志记录能使整个处理过程变得更加轻松。
集中记录日志到一台指定的机器能够减轻一些日志文件管理的负担。
日志文件的收集, 合并与循环可以在一处配置,
使用 &os; 原生的工具, 比如 &man.syslogd.8; 和 &man.newsyslog.8;。
在以下的配置示例中, 主机 A, 命名为
logserv.example.com,
将用来收集本地网络的日志信息。 主机 B,
命名为 logclient.example.com
将把日志信息传送给服务器。 在现实中,
这两个主机都需要配置正确的正向和反向的 DNS
或者在 /etc/hosts 中记录。
否则, 数据将被服务器拒收。
日志服务器的配置
日志服务器是配置成用来接收远程主机日志信息的机器。
在大多数的情况下这是为了方便配置, 或者是为了更好的管理。
不论是何原因, 在继续深入之前需要提一些必需条件。
一个正确配置的日志服务器必须符合以下几个最基本的条件:
服务器和客户端的防火墙规则允许 514 端口上的
UDP 报文通过。
syslogd 被配置成接受从远程客户发来的消息。
syslogd 服务器和所有的客户端都必须有配有正确的正向和反向
DNS, 或者在
/etc/hosts 中有相应配置。
配置日志服务器, 客户端必须在
/etc/syslog.conf 中列出,
并指定日志的 facility:
+logclient.example.com
*.* /var/log/logclient.log
更多关于各种被支持并可用的 facility
能在 &man.syslog.conf.5; 手册页中找到。
一旦加入以后, 所有此类 facility
消息都会被记录到先前指定的文件
/var/log/logclient.log。
提供服务的机器还需要在其
/etc/rc.conf 中配置:
syslogd_enable="YES"
syslogd_flags="-a logclient.example.com -vv"
第一个选项表示在系统启动时启用 syslogd
服务, 第二个选项表示允许服务器接收来自指定日志源客户端的数据。
第二行配置中最后的部分, 使用 ,
表示增加日志消息的详细程度。 在调整 facility 配置的时候,
这个配置非常有用, 因为管理员能够看到哪些消息将作为哪个
facility 的内容来记录。
可以同时指定多个 选项来允许多个客户机。
此外, 还可以指定 IP
地址或网段, 请参阅
&man.syslog.3; 联机手册以了解可用配置的完整列表。
最后, 日志文件应该被创建。 不论你用何种方法创建,
比如 &man.touch.1; 能很好的完成此类任务:
&prompt.root; touch /var/log/logclient.log
此时, 应该重启并确认一下 syslogd
守护进程:
&prompt.root; /etc/rc.d/syslogd restart
&prompt.root; pgrep syslog
如果返回了一个 PIC 的话,
服务端应该被成功重启了, 并继续开始配置客户端。
如果服务端没有重启的话, 请在
/var/log/messages
日志中查阅相关输出。
日志客户端配置
日志客户端是一台发送日志信息到日志服务器的机器,
并在本地保存拷贝。
与日志服务器类似, 客户端也需要满足一些最基本的条件:
&man.syslogd.8;
必须被配置成发送指定类型的消息到能接收他们的日志服务器。
防火墙必须允许 514 端口上的 UDP 包通过;
必须配置正向与反向 DNS,
或者在 /etc/hosts 中有正确的记录。
相比服务器来说配置客户端更轻松一些。
客户端的机器在 /etc/rc.conf
中做如下的设置:
syslogd_enable="YES"
syslogd_flags="-s -vv"
和前面类似, 这些选项会在系统启动过程中启用
syslogd 服务, 并增加日志消息的详细程度。
而
选项则表示禁止服务接收来自其他主机的日志。
Facility 是描述某个消息由系统的哪部分生成的。 举例来说,
ftp 和 ipfw 都是 facility。
当这两项服务生成日志消息时, 它们通常在日志消息中包含了这两种工具。
Facility 通常带有一个优先级或等级,
就是用来标记一个日志消息的重要程度。 最普通的为
warning 和 info。
请参阅 &man.syslog.3; 手册页以获得一个完整可用的
facility 与优先级列表。
日志服务器必须在客户端的 /etc/syslog.conf
中指明。 在此例中, @
符号被用来表示发送日志数据到远程的服务器,
看上去差不多如下这样:
*.* @logserv.example.com
添加后, 必须重启 syslogd
使得上述修改生效:
&prompt.root; /etc/rc.d/syslogd restart
测试日志消息是否能通过网络发送,
在准备发出消息的客户机上用 &man.logger.1; 来向
syslogd 发出信息:
- &prompt.root; logger "Test message from logclient"
+ &prompt.root; logger "Test message from logclient"
这段消息现在应该同时出现在客户机的
/var/log/messages 以及日志服务器的
/var/log/logclient.log 中。
调试日志服务器
在某些情况下, 如果日志服务器没有收到消息的话就需要调试一番了。
有几个可能的原因, 最常见的两个是网络连接的问题和
DNS 的问题。 为了测试这些问题,
请确认两边的机器都能使用 /etc/rc.conf
中所设定的主机名访问到对方。 如果这个能正常工作的话,
那么就需要对 /etc/rc.conf
中的 syslogd_flags 选项做些修改了。
在以下的示例中,
/var/log/logclient.log 是空的,
/var/log/message 中也没有表明任何失败的原因。
为了增加调试的输出, 修改 ayalogd_flags
选项至类似于如下的示例, 并重启服务:
syslogd_flags="-d -a logclien.example.com -vv"
&prompt.root; /etc/rc.d/syslogd restart
在重启服务之后, 屏幕上将立刻闪现类似这样的调试数据:
logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
Logging to FILE /var/log/messages
syslogd: kernel boot file is /boot/kernel/kernel
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
rejected in rule 0 due to name mismatch.
很明显,消息是由于主机名不匹配而被拒收的。
在一点一点的检查了配置文件之后, 发现了
/etc/rc.conf 中如下这行有输入错误:
syslogd_flags="-d -a logclien.example.com -vv"
这行应该包涵有 logclient, 而不是
logclien。
在做了正确的修改并重启之后便能见到预期的效果了:
&prompt.root; /etc/rc.d/syslogd restart
logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
syslogd: kernel boot file is /boot/kernel/kernel
logmsg: pri 166, flags 17, from logserv.example.com,
msg Dec 10 20:55:02 <syslog.err> logserv.example.com syslogd: exiting on signal 2
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
accepted in rule 0.
logmsg: pri 15, flags 0, from logclient.example.com, msg Dec 11 02:01:28 trhodes: Test message 2
Logging to FILE /var/log/logclient.log
Logging to FILE /var/log/messages
此刻, 消息能够被正确接收并保存入文件了。
安全性方面的思考
就像其他的网络服务一样, 在实现配置之前需要考虑安全性。
有时日志文件也包含了敏感信息, 比如本地主机上所启用的服务,
用户帐号和配置数据。 从客户端发出的数据经过网络到达服务器,
这期间既没有加密也没有密码保护。 如果有加密需要的话,
可以使用 security/stunnel,
它将在一个加密的隧道中传输数据。
本地安全也同样是个问题。 日志文件在使用中或循环转后都没有被加密。
本地用户可能读取这些文件以获得对系统更深入的了解。
对于这类情况, 给这些文件设置正确的权限是非常有必要的。
&man.newsyslog.8; 工具支持给新创建和循环的日志设置权限。
把日志文件的权限设置为 600
能阻止本地用户不必要的窥探。