diff --git a/zh_CN.GB2312/books/handbook/mail/chapter.sgml b/zh_CN.GB2312/books/handbook/mail/chapter.sgml index 3911ce2601..1b43d2d767 100644 --- a/zh_CN.GB2312/books/handbook/mail/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mail/chapter.sgml @@ -1,2093 +1,2092 @@ Bill Lloyd Original work by Jim Mock Rewritten by 电子邮件 概述 email 电子邮件,或通常所说的 email,是现今使用最广泛的通信方式之一。 本章将对如何在 &os; 上运行邮件服务,以及如何使用 &os; 来收发电子邮件作基本的介绍; 然而,它并不是一份完整的参考手册,实际上,许多需要考虑的重要事项都没有提及。 我们推荐读者阅读 中的参考书籍,以获得对于这部分的全面认识。 读完这章,您将了解: 那些软件与收发电子邮件有关。 &os; 下的基本 sendmail 配置文件在哪里。 本地和远程邮箱之间的区别。 如何阻止垃圾邮件制造者非法地使用您的邮件服务器作为转发中继。 如何安装和配置用于替代 sendmail 的其他邮件传输代理。 如何处理常见的邮件服务器问题。 如何使用 SMTP 和 UUCP。 如何设置系统使其只能发送邮件。 如何在拨号连接时使用邮件。 如何配置 SMTP 验证以增加安全性。 如何安装并使用用户邮件代理,如 mutt 来收发邮件。 如何从远程的 POPIMAP 服务器上下载邮件。 如何在进入的邮件上自动地应用过滤器和规则。 阅读本章之前,您需要: 正确地配置您的网络连接 (). 正确地为您的邮件服务器配置 DNS 信息 (). 知道如何安装第三方软件 (). 使用电子邮件 POP IMAP DNS 邮件交换可以分为 5 部分。它们是: 用户端程序、服务端守护进程、DNS、远程或本地的邮箱、 当然,还有邮件主机自己。 用户端程序 这包括一些基于命令行的程序,例如 muttpineelmmail,以及类似 balsaxfmail 这样的 GUI 程序。 此外,还有我们更熟悉的WWW 浏览器这样的程序。 这些程序简单地通过调用服务守护进程把邮件事务交给本地的 邮件主机,或者通过 TCP 把邮件发出去。 邮件主机上使用的服务程序 邮件服务程序 sendmail 邮件服务程序 postfix 邮件服务程序 qmail 邮件服务程序 exim &os; 默认情况下采用 sendmail, 但它也支持为数众多的其它邮件服务程序, 这其中包括: exim; postfix; qmail. 邮件服务器后台守护程序通常有两个功能 — 接收外面发来的邮件和把邮件传送出去。 但它 负责使用类似 POPIMAP 这样的协议来帮您阅读邮件, 也不负责连接到本地的 mbox 或 Maildir 信箱。 您可能需要其它的 服务程序 来完成这些任务。 较早版本的 sendmail 有一些严重的安全问题, 他们可能导致攻击者从本地和/或远程操作您的电脑。 您应该确认自己使用的是最新版本以避免这些问题。 另外, 也可以从 &os; Ports Collection 来安装其它的 MTA Email 和 DNS 域名系统 (DNS) 及其服务程序 named 在email的投递过程当中扮演着很重要的角色。 为了能够从您的站点向其它的站点传递邮件, 服务程序需要通过 DNS 查找接收邮件的远程站点的位置。 类似地, 在远程站点向您的主机投递邮件时也会发生这样的查找。 MX 记录 DNS 负责将主机名映射为 IP 地址, 同时, 也需要保存递送邮件时所需要的信息, 这些信息称作 MX 记录。 MX (Mail eXchanger,邮件交换) 记录指定了哪个, 或哪些主机能够接收特定域下的邮件。 如果您没有为主机名或域名设置 MX 记录, 则邮件将被直接递交给主机名对应 IP 所在的主机。 您可以通过 &man.host.1; 命令来查找任何域或主机名对应的 MX 记录, 如下面的例子所示: &prompt.user; host -t mx FreeBSD.org FreeBSD.org mail is handled (pri=10) by mx1.FreeBSD.org 接收邮件 电子邮件 接收 为您的域接收邮件是通过邮件服务器来完成的。 它收集发送给您的域的那些邮件,并保存到 mbox (存储邮件默认的方法) 或 Maildir 格式, 这取决于您采用的配置。 一旦邮件被保存下来, 就可以在本地通过类似 &man.mail.1; 或 mutt 这样的程序, 或在远程通过 POPIMAP 这样的协议来读取了。 简单地说, 如果您只在本地阅读邮件,那就没有必要安装 POPIMAP 服务。 通过 <acronym>POP</acronym> 和 <acronym>IMAP</acronym> 访问远程的邮件 POP IMAP 如果希望在远程访问邮箱, 就需要访问 POPIMAP 服务器。 这些协议允许用户从远程方便地访问他们的信箱。 尽管 POPIMAP 都允许用户从远程访问信箱, 但 IMAP 有很多优点, 这包括: IMAP 既可以从远程服务器上抓取邮件, 也可以把邮件放上去。 IMAP 支持并发更新。 IMAP 对于使用低速网络的用户尤为有用, 因为它能够让这些用户把邮件的结构下载下去, 而无需立即下载整个邮件。 它还可以在服务器端执行类似查找这样的操作, 以减少客户机和服务器之间的通讯量。 您可以按照下面的步骤来安装和配置 POPIMAP 服务器: 选择一个最符合需要的 IMAPPOP 服务器。 下列 POPIMAP 服务器是最著名的, 而且都有很多成功案例: qpopper; teapop; imap-uw; courier-imap; 通过 ports collection 安装 POPIMAP 服务。 根据需要修改 /etc/inetd.conf 来加载 POPIMAP 服务。 此外还应注意的是 POPIMAP 传递的信息, 包括用户名和口令等等, 通常都是明文的。 这意味着如果您希望加密传输过程中的信息, 可能需要考虑使用 &man.ssh.1; 隧道。 关于如何实施隧道在 中进行了详细阐述。 操作本地的信箱 信箱可以在邮件服务器本地直接用 MUA 来进行操作。 这通常是通过 mutt 或 &man.mail.1; 这样的用用程序实现的。 邮件服务器 邮件服务器 邮件服务器是通过服务器给的一个名字,这也正是它能在您的主机和网络上发送和接收邮件的原因. Christopher Shumway 作者: <application>sendmail</application> 配置 sendmail &man.sendmail.8; 是 &os; 中的默认邮件传输代理 (MTA)。 sendmail 的任务是从邮件用户代理 (MUA) 接收邮件然后根据配置文件的定义把它们送给配置好的的寄送程序。 sendmail 也能接受网络连接, 并且发送邮件到本地邮箱或者发送它到其它程序。 sendmail 使用下列配置文件: /etc/mail/access /etc/mail/aliases /etc/mail/local-host-names /etc/mail/mailer.conf /etc/mail/mailertable /etc/mail/sendmail.cf /etc/mail/virtusertable 文件名 功能 /etc/mail/access sendmail 访问数据库文件 /etc/mail/aliases 邮箱别名 /etc/mail/local-host-names sendmail 接收邮件主机列表 /etc/mail/mailer.conf 邮寄配置程序 /etc/mail/mailertable 邮件分发列表 /etc/mail/sendmail.cf sendmail的主配置文件 /etc/mail/virtusertable 虚拟用户和域列表 <filename>/etc/mail/access</filename> 访问数据库定义了什么主机或者 IP 地址可以访问本地邮件服务器和它们是哪种类型的访问。 主机可能会列出 或者简单的通过 sendmail 的出错处理程序检测一个给定的邮件错误。 主机默认列出 ,允许传送邮件到主机, 只要邮件的最后目的地是本地主机。列出 将拒绝所有的邮件连接。如果带有 选项的主机将被允许通过这个邮件服务器发送邮件到任何地方。 配置 <application>sendmail</application> 的访问许可数据库 cyberspammer.com 550 We do not accept mail from spammers FREE.STEALTH.MAILER@ 550 We do not accept mail from spammers another.source.of.spam REJECT okay.cyberspammer.com OK 128.32 RELAY 在上面的例子中我们有 5 条记录。 与左边列表匹配的发件人受到右边列表动作的影响。 前边的两个例子给出了 sendmail 的出错处理程序检测到的错误代码。 当一个邮件与左边列表相匹配时,这个信息会被打印到远程主机上。 下一条记录拒绝来自 Internet 上的一个特别主机的邮件 another.source.of.spam。接下来的记录允许来自 okay.cyberspammer.com 的邮件连接, 这条记录比上面那行 cyberspammer.com 更准确。更多的准确匹配使不准确的匹配无效。最后一行允许电子邮件从主机和 128.32 开头的 IP 地址转发。 这些主机将被允许通过这台邮件服务器前往其它邮件服务器发送邮件。 当这个文件被升级的时候,您必须在 /etc/mail/ 运行 make 升级数据库。 <filename>/etc/mail/aliases</filename> 别名数据库包含一个扩展到用户,程序或者其它别名的虚拟邮箱列表。 下面是一些在 /etc/mail/aliases 中使用的例子: 邮件别名 root: localuser ftp-bugs: joe,eric,paul bit.bucket: /dev/null procmail: "|/usr/local/bin/procmail" 这个文件的格式很简单; 冒号左边的邮箱名, 会被展开成右边的形式。 第一个例子简单地将 root 邮箱扩展为 localuser, 之后将继续在别名数据库中进行查找。 如果没有找到匹配的记录, 则邮件会被发给本地用户 localuser。 第二个例子展示了一个邮件列表。 发送到 ftp-bugs 的邮件会被展开成 joeericpaul 这三个邮箱。 注意也可以通过 user@example.com 这样的形式来指定远程的邮箱。 接下来的例子展示了如何把邮件写入到文件中, 这个例子中是 /dev/null。 最后一个例子展示了如何将邮件发给一个程序, 具体而言是通过 &unix; 管道发到 /usr/local/bin/procmail 的标准输入。 更新此文件时, 您需要在 /etc/mail/ 中使用 make 来更新数据库。 <filename>/etc/mail/local-host-names</filename> 这是一个 &man.sendmail.8; 被接受为一个本地主机名的主机名列表。 可以放入任何 sendmail 将从那里收发邮件的域名或主机。例如,如果这个邮件服务器从域 example.com 和主机 mail.example.com 接收邮件,它的 local-host-names 文件,可以看起来象如下这样: example.com mail.example.com 当这个文件被升级,&man.sendmail.8; 必须重新启动,以便更新设置。 <filename>/etc/mail/sendmail.cf</filename> sendmail的主配置文件 sendmail.cf 控制着 sendmail 的所有行为, 包括从重写邮件地址到打印拒绝远程邮件服务器信息等所有事。 当然,作为一个不同的角色,这个配置文件是相当复杂的, 它的细节部分已经超出了本节的范围。幸运的是, 这个文件对于标准的邮件服务器来说很少需要被改动。 sendmail 主配置文件可以用 &man.m4.1; 宏定义 sendmail 的特性和行为。它的细节请看 /usr/src/contrib/sendmail/cf/README 当这个文件被修改时, sendmail 必须重新启动以便对新修改生效。 <filename>/etc/mail/virtusertable</filename> virtusertable 映射虚拟域名和邮箱到真实的邮箱。 这些邮箱可以是本地的、远程的、/etc/mail/aliases 中定义的别名或一个文件。 虚拟域邮件映射的例子 root@example.com root postmaster@example.com postmaster@noc.example.net @example.com joe 在上面这个例子中, 我们映射了一个域 example.com。 这个文件是按照从上到下, 首个匹配的方式来处理的。 第一项将 root@example.com 映射到本地邮箱 root。 下一项则将 postmaster@example.com 映射到位于 noc.example.netpostmaster。 最后, 如果没有来自 example.com 的匹配, 则将使用最后一条映射, 它表示将所有的其它邮件发给 example.com 域的某个人。 这样, 将映射到本地信箱 joe Andrew Boothman Written by Gregory Neil Shapiro Information taken from e-mails written by 改变您的邮件传输代理程序 邮件 改变mta 先前已经提到,FreeBSD 中的 sendmail 已经安装了您的 MTA (邮件传输代理程序)。因此它它负责着您的收发邮件的工作。 然而,基于不同的理由,一些系统管理员想要改变他们系统的 MTA。这些理由从简单的想要尝试另一个 MTA,到需要一个特殊的特性或者 package 依赖某个邮寄程序等等。幸运的是,不管是什么理由,FreeBSD 都能容易的改变它。 安装一个新的 MTA 对于可用的 MTA 您有很多的选择。一个好的出发点是 FreeBSD Ports Collection,在那里您能找到很多。 当然您可以从任何位置不受任何限制的使用 MTA,只要您能让它运行在 FreeBSD 下。 开始安装您的新 MTA。一旦它被安装, 它可以让您有机会决定它是否能满足您的需要和在接管 sendmail 之前让您有机会配置您的新软件。 当完成这些之后,您应该确信安装的新软件不会尝试更改系统的二进制文件例如象 /usr/bin/sendmail。除此以外, 您的新邮件软件启用之前要已经配置好它。 具体配置请参考您所选择的 MTA 软件的配置文档或其它相关资料。 停用 <application>sendmail</application> 值得注意的是启动 sendmail 在 4.5-RELEASE 版本和 4.6-RELEASE 版本之间有些不同。因此,停用它的过程也稍有不同。 FreeBSD 4.5-STABLE 版本 2002/4/4 之前和更早前版本 (包括 4.5-RELEASE 及更早版本) 输入: sendmail_enable="NO" /etc/rc.conf 文件。它将停用 sendmail 接收邮件服务, 但是如果 /etc/mail/mailer.conf 文件(见下文) 没有被改变,sendmail 将仍然可以发送邮件。 FreeBSD 4.5-STABLE 版本 2002/4/4 之后和以后的版本 (包括 4.6-RELEASE 及后续版本) 为了完全的停用 sendmail,您必须在 /etc/rc.conf 文件里使用 sendmail_enable="NONE" 如果用这个方法停止 sendmail 的发送邮件服务,那么就必须有一个能够完全正常地工作的邮件发送系统。 如果不这样做的话,类似 &man.periodic.8; 这样的系统功能将无法正确地通过电子邮件将它们的执行结果送到通常希望的地方去。 系统中的很多部分都要求有和 sendmail 在功能上兼容的系统。 如果应用程序在您禁用之后仍然继续使用 sendmail 的执行文件来发送文件, 则这些邮件可能会进入睡眠的 sendmail 队列,并永远无法到达目的地。 如果只是想要停止 sendmail 的接收邮件服务, 您应该在 /etc/rc.conf 文件中设置 sendmail_enable="NO" 更多的有关 sendmail 可用的启动选项,参看 &man.rc.sendmail.8; 联机手册. 机器引导时运行您的新 MTA 您也许有两种方法在机器引导时运行您的新 MTA,这个也倚赖您所运行的 FreeBSD 版本。 FreeBSD 4.5-STABLE 版本 2002/4/11 以前 (包括 4.5-RELEASE 及更早版本) /usr/local/etc/rc.d/ 中添加一个以 .sh 为后缀的脚本文件, 并可以用 root 身份运行。这个脚本应该接受 startstop 参数。用如下命令启动这个脚本 /usr/local/etc/rc.d/supermailer.sh start 您也可以手工启动这个服务。如果想要停止它, 系统脚本将使用 stop 选项,运行如下命令 /usr/local/etc/rc.d/supermailer.sh stop 您也可以手工停止正在系统运行的服务。 FreeBSD 4.5-STABLE 版本 2002/4/11 以后 (包括 4.6-RELEASE 及后续版本) 在 FreeBSD 较后来的版本, 您可以使用上面的方法或者在 /etc/rc.conf 文件做如下设置 mta_start_script="filename" filename 是您想要在引导时执行的 MTA 脚本文件的名字。 替换系统默认的邮寄程序 <application>sendmail</application> 因为 sendmail 程序是一个在 &unix; 系统下普遍存在的一个标准的软件,一些软件就假定它已经被安装并且配置好。 基于这个原因,许多其它的 MTA 提供者都提供了兼容 sendmail 的命令行界面来执行。 这使它们象混入sendmail 一样变的很容易掌握。 因此,如果您使用其它的邮寄程序, 您必须确定这个软件是去尝试运行标准的 sendmail 二进制,就象 /usr/bin/sendmail,还是运行您自己选择的替换邮寄程序。 幸运的是,FreeBSD 提供了一个系统调用 &man.mailwrapper.8;,它能为您做这件工作。 sendmail 安装后被运行,您可以在 /etc/mail/mailer.conf 中找到如下行: sendmail /usr/libexec/sendmail/sendmail send-mail /usr/libexec/sendmail/sendmail mailq /usr/libexec/sendmail/sendmail newaliases /usr/libexec/sendmail/sendmail hoststat /usr/libexec/sendmail/sendmail purgestat /usr/libexec/sendmail/sendmail 这个的意思就是当这些公共命令 (例如 sendmail 它本身) 运行时, 系统实际上调用了一个 sendmail 指定的 mailwrapper 的副本,它检查 mailer.conf 并且运行 /usr/libexec/sendmail/sendmail 做为替代。当默认的 sendmail 功能被调用, 系统将很容易的改变实际上运行的二进制文件。 因此如果您想要 /usr/local/supermailer/bin/sendmail-compat 替换 sendmail 被运行,您应该改变 /etc/mail/mailer.conf 文件为: sendmail /usr/local/supermailer/bin/sendmail-compat send-mail /usr/local/supermailer/bin/sendmail-compat mailq /usr/local/supermailer/bin/mailq-compat newaliases /usr/local/supermailer/bin/newaliases-compat hoststat /usr/local/supermailer/bin/hoststat-compat purgestat /usr/local/supermailer/bin/purgestat-compat 最后 一旦做完您想要配置的每件事,您应该杀掉 sendmail 进程并且启动属于您的新软件的进程, 或者简单的重启。重启也将给您机会保证您正确的配置您的系统, 在引导的时候自动的运行您新的 MTA。 疑难解答 邮件 疑难解答 为什么必须在我的站点的主机上使用 FQDN? 您可能会发现主机实际上是在另外一个域里面, 例如,如果您是在 foo.bar.edu 里,而您要找一台叫 mumble 的主机,它在 bar.edu 域里,您就必须用完整的域名 mumble.bar.edu,而不是用 mumble BIND 传统上,这在 BSD BIND resolvers 中是可行的。 然而目前随 FreeBSD 附带的 BIND 已不为同一域外提供缩写服务。所以,这个不完整的主机名 mumble 必须以 mumble.foo.bar.edu 这种形式才能被找到, 或者将在根域中搜索它。 这跟以前的处理是不同的,以前版本将会继续寻找 mumble.bar.edumumble.edu。 如果您想要了解这种方式是否是好,或者它有什么安全方面的漏洞, 请参阅 RFC 1535 文档。 如果您想要一个好的工作环境,您可以使用如下行: search foo.bar.edu bar.edu 替换先前旧的版本: domain foo.bar.edu 把这行放在您的 /etc/resolv.conf 文件中。然而,请一定要确定这样的搜寻顺序不会造成 RFC 1535 里提到的boundary between local and public administration 问题。 MX record sendmail 提示信息 mail loops back to myself 下面是 sendmail FAQ 中的回答: 我得到了如下的信息: 553 MX list for domain.net points back to relay.domain.net 554 <user@domain.net>... Local configuration error 我如何解决这个问题? 您已经通过 MX 记录指定把发送给特定的域 (例如,domain.net) 的邮件被转寄到指定的主机 (在这个例子中,relay.domain.net), 而这台机器并不认为它自己是 domain.net。请把 domain.net 添加到 /etc/mail/local-host-names 文件中 [在 8.10 版之前是 /etc/sendmail.cw] (如果您使用 FEATURE(use_cw_file) 的话) 或者在 /etc/mail/sendmail.cf 中添加Cw domain.net sendmail 的 FAQ 可以在 找到, 如果您想要对您的邮件做任何的调整, 则推荐首先看一看它。 PPP 我如何在一个拨号主机上运行一个邮件服务? 您想要把局域网上的 FreeBSD 主机连接到互连网上,而这台 FreeBSD 主机将会成为这个局域网的邮件网关, 这个拨号连接不必一直保持在连接状态。 UUCP MX record 最少有两种方法可以满足您的要求。一种方法就是使用 UUCP。 另一种方法是找到一个专职的服务器来为您的域提供副 MX 主机服务。 例如,如果您公司的域名是 example.com,您的互连网服务提供者把 example.net 作为您域的副 MX 服务: example.com. MX 10 example.com. MX 20 example.net. 只有一台主机被指定当做您的最终收信主机 (在 example.com 主机的 /etc/mail/sendmail.cf 文件中添加 Cw example.com)。 sendmail 试图分发邮件的时候, 它会尝试通过 modem 连接到您 (example.com)。 因为您并不在线,所以总是会得到一个超时的错误。 sendmail 将会把邮件发送到副 MX 主机,也就是说,您的互连网服务提供者 (example.net)。副 MX 主机将周期性的尝试连接并发送邮件到您的主机 (example.com)。 您也许想要使用下面的这个登录脚本: #!/bin/sh # Put me in /usr/local/bin/pppmyisp ( sleep 60 ; /usr/sbin/sendmail -q ) & /usr/sbin/ppp -direct pppmyisp 如果您想要为一个用户建立一个分开登录的脚本, 您可以使用 sendmail -qRexample.com 替换上面的脚本。这样将使所有的邮件按照您的 example.com 队列立即被处理。 更深入的方法可以参考下面这段: 这段信息是从 &a.isp; 拿来的。 > 我们为用户提供副 MX 主机服务。用户每天都会上线好几次 > 并且自动把信件取回主 MX 主机 > (当有他们的邮件时我们并没有通知他们)。 > 我们的 mailqueue 程序每 30 分钟清一次邮件队列。那段时间他们 > 就必须上线 30 分钟以确保他们的信件送达他们的主 MX 主机。 > > 有任何指令可以用 sendmail 寄出所有邮件么? > 普通用户在我们的机器上当然没有 root 权限。 在 sendmail.cf 的privacy flags部分,有这样的设定 Opgoaway,restrictqrun 移除 restrictqrun 可以让非 root 用户启动队列处理的程序。 您可能也要重新安排您的 MX 设定。我们是用户的 MX 主机, 而且我们还设定了这个: # If we are the best MX for a host, try directly instead of generating # local config error. OwTrue 这样的话远程机器会直接把信送给您,而不会尝试连接您的用户的机器。 然后您就可以把邮件发送到您的用户。这个设定只对 主机有效,所以您必须要让您的用户在 DNS 中把他们的邮件主机设置为 customer.com或者 hostname.customer.com。只要为customer.com在 DNS 里添加一个 A 记录就可以了。 为什么当我发送邮件到其它主机总是有 Relaying Denied 出错信息? 默认的 FreeBSD 安装中, sendmail 会配置为只发送来自它所在主机上的邮件。 例如,如果有可用的 POP 服务器,则用户将可以从学校、 公司或其他什么别的地方检查邮件,但他们仍然无法从远程直接发送邮件。 通常,在几次尝试之后, MAILER-DAEMON 将发出一封包含 5.7 Relaying Denied 错误信息的邮件。 有很多方法可以避免这种现象。 最直截了当的方法是把您的 ISP 的地址放到 /etc/mail/relay-domains 文件中。 完成这项工作的简单的方法是: &prompt.root; echo "your.isp.example.com" > /etc/mail/relay-domains 建立或编辑这个文件以后您必须重新启动 sendmail。 如果您是一个管理员并且不希望在本地发送邮件, 或者想要在其它的机器甚至其它的 ISP 上使用一个客户端系统, 这个方法是很方便的。如果您仅有一到两个邮件帐户它也非常的有用。 如果有大量的地址需要添加, 您可以很简单的使用您喜欢的文本编辑器打开这个文件添加域名, 每行一个: your.isp.example.com other.isp.example.net users-isp.example.org www.example.org 现在邮件可以通过您的系统传送, 这个列表中存在的主机 (前提是用户在您的系统上已经有一个帐户) 将可以成功的发送。这是一个允许正常的远程用户从您的系统发送邮件, 并且阻止其它非法用户通过您系统发送垃圾邮件的好方法。 高级主题 下面这节将介绍邮件配置和为整个域安装邮件。 基本配置 邮件 配置 在邮箱外,只要您设置 /etc/resolv.conf 或者运行您自己的名字服务器,您就可以发送邮件到外部的主机。 如果您想要您的邮件发送给某个特定的 MTA(例如, sendmail) 在您的 FreeBSD 主机上,有两个方法: 运行您自己的域名服务器和您自己的域。例如, FreeBSD.org 获得直接分发给您主机的邮件。您可以直接使用您当前的 DNS 名称。例如,example.FreeBSD.org SMTP 不管您选择上面那种方法,为了直接在您的主机上发送邮件, 必须有一个静态的 IP 地址(不是象 PPP 拨号一样的动态地址)。 如果您在防火墙后面,它必须让 SMTP 协议通过。 如果您想要在您的主机上直接的收取邮件, 您必须确定两件事: MX 记录 确定在您 DNS 中的 MX 记录(最小编号的)指向您的 IP 地址。 确定在您 DNS 中的 MX 记录没有禁止您的主机。 上面的每条记录都允许您在您的主机直接接收邮件。 试试这个: &prompt.root; hostname example.FreeBSD.org &prompt.root; host example.FreeBSD.org example.FreeBSD.org has address 204.216.27.XX 如果您看到这些, 则直接发往 yourlogin@example.FreeBSD.org 应该已经可以正常工作了 (假设 sendmail 已经在 example.FreeBSD.org 上正确启动了)。 如果您看到这些: &prompt.root; host example.FreeBSD.org example.FreeBSD.org has address 204.216.27.XX example.FreeBSD.org mail is handled (pri=10) by hub.FreeBSD.org 所有发送到主机 (example.FreeBSD.org) 的邮件在相同的用户名下将会被 hub 终止的收集,而不是直接发送到您的主机。 上面的信息是通过您的 DNS 服务器来处理的。支持邮件路由信息的 DNS 记录是 邮件 交换 记录。如果 MX 记录不存在,邮件将通过它自己的 IP 地址被直接的发送到主机。 freefall.FreeBSD.org的MX记录如下所示: freefall MX 30 mail.crl.net freefall MX 40 agora.rdrop.com freefall MX 10 freefall.FreeBSD.org freefall MX 20 who.cdrom.com 正如您说看到的,freefall 有很多 MX 记录。 最小编号的 MX 记录是直接接收邮件的主机。如果因为一些原因它不可用,其它 (有时会访问backup MXes)接收信息将会暂时接替并做临时的排列。 为了有效的使用交换式 MX 站点,应当从您的机器上分离一些 Internet 连接。您的 ISP 或者其它友好的站点可以没有任何问题的为您提供这个服务。 Mail for Your Domain 为了设置一个邮件主机(又称邮件服务器) 您必须要把许多邮件发送到与它相连的几个工作站中。 基本上,您想要要求在您域的每个主机的所有邮件 (在这个例子里是 *.FreeBSD.org) 转向到您的邮件服务器,从而使您的用户可以在主邮件服务器里接收他们的邮件。 DNS 要使工作最简单,带有同样 用户名 的帐户应该同时存在于两台机器上。使用 &man.adduser.8; 来这样做。 您将使用的邮件主机必须为每个工作站指定一个邮件交换。您可以在 DNS 中这样配置: example.FreeBSD.org A 204.216.27.XX ; Workstation MX 10 hub.FreeBSD.org ; Mailhost 无论 A 记录指向哪,这将为工作站重新定位到邮件主机。邮件将被发送到 MX 主机。 您不能自己这样做除非您运行着一个 DNS 服务器。 如果不是这样,或者不能运行您自己的 DNS 服务器,告诉您的 ISP 或者给您提供 DNS 服务的人。 如果您正在使用虚拟邮件主机,下面的信息将会对您有用。 在这个例子里,我们假定您有一个客户并且他有自己的域, 这个例子中是 customer1.org,您要把 customer1.org 所有的邮件发送到您的邮件主机 mail.myhost.com。 您的 DNS 记录应该是这样: customer1.org MX 10 mail.myhost.com 需要有个 A 记录, 如果您只为域 customer1.org 处理邮件。 必须清楚 customer1.org 将不能工作,除非存在一个 A 记录。 最后一件您必须要做的事是告诉 sendmail 接受邮件的是什么域和(或)主机名。 这里有好几种方法。下面方法可以任选一种: 添加您的主机到 /etc/mail/local-host-names 文件中,如果您使用的是 FEATURE(use_cw_file)。如果您使用 sendmail 8.10 或者更高版本,文件是 /etc/sendmail.cw 添加一行 Cwyour.host.com 到您的 /etc/sendmail.cf/etc/mail/sendmail.cf 文件,如果您使用 sendmail 8.10 或者更高版本。 SMTP 与 UUCP sendmail 的配置,在 FreeBSD 中已经配置好为您的站点直接的连接 Internet。 如果站点希望他们的邮件通过 UUCP 交换,则必须安装其它的 sendmail 配置文件。 手工的配置 /etc/mail/sendmail.cf 是一个高级主题。sendmail 8 版本通过 &man.m4.1; 预处理生成一个配置文件,实际上这个配置发生在一个比较高的抽象层。 &man.m4.1; 配置文件可以在 /usr/src/usr.sbin/sendmail/cf 下找到。 如果您没有在系统上安装全部源码,则可以从单独的压缩文件中提取 sendmail 配置文件。假定您的 FreeBSD 源码 CDROM 已经被 mount: &prompt.root; cd /cdrom/src &prompt.root; cat scontrib.?? | tar xzf - -C /usr/src/contrib/sendmail 这个提取只有几百 K 字节。cf 目录中的 README 文件能够为您提供一个到 &man.m4.1; 配置的基本的介绍。 最好的支持 UUCP 传送的方法是使用 mailertable 的特点。建立一个资料库让 sendmail 可以使用它自己的路由决策。 首先,您必须建立您自己的 .mc 文件。 /usr/src/usr.sbin/sendmail/cf/cf 目录包含一些例子。 假定您已经命名自己的文件叫做 foo.mc, 您要做的只是把它转换成一个有效的 sendmail.cf &prompt.root; cd /usr/src/usr.sbin/sendmail/cf/cf &prompt.root; make foo.cf &prompt.root; cp foo.cf /etc/mail/sendmail.cf 一个典型的 .mc 文件看起来可能象这样: VERSIONID(`Your version number') OSTYPE(bsd4.4) FEATURE(accept_unresolvable_domains) FEATURE(nocanonify) FEATURE(mailertable, `hash -o /etc/mail/mailertable') define(`UUCP_RELAY', your.uucp.relay) define(`UUCP_MAX_SIZE', 200000) define(`confDONT_PROBE_INTERFACES') MAILER(local) MAILER(smtp) MAILER(uucp) Cw your.alias.host.name Cw youruucpnodename.UUCP accept_unresolvable_domainsnocanonifyconfDONT_PROBE_INTERFACES 特性将避免在传送邮件时使用DNS的机会。UUCP_RELAY 项是支持 UUCP 传送所必须的。简单的放入一个 Internet 上可以处理 UUCP 虚拟域地址的主机名。通常,您在这里填入您 ISP 邮件的回复处。 一旦您做完这些,您还需要这个 /etc/mail/mailertable 文件。 如果您只有一个用来传递所有邮件的对外通道的话, 以下的文件就足够了: # # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable . uucp-dom:your.uucp.relay 一个更复杂点的例子象这样: # # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable # horus.interface-business.de uucp-dom:horus .interface-business.de uucp-dom:if-bus interface-business.de uucp-dom:if-bus .heep.sax.de smtp8:%1 horus.UUCP uucp-dom:horus if-bus.UUCP uucp-dom:if-bus . uucp-dom: 头三行处理域地址邮件,不应该被传送出默认的路由, 而由某些 UUCP 邻居取代的特殊情况,这是为了走捷径。 下一行处理本地网的邮件让它可以使用 SMTP 来传送。 最后,UUCP 邻居提起。UUCP 虚拟域的记载, 允许一个 uucp-neighbor !recipient 推翻默认规则。最后一行则以一个单独的句点最为结束, 以 UUCP 传送到提供您所有的邮件网关的 UUCP 邻居。 所有在 uucp-dom: 关键字里的节点名称必须是有效的 UUCP 邻居,您可以用 uuname 去确认。 提醒您这个文件在使用前必须被转换成 DBM 数据库文件。最好在 mailertable 最上面用注解写出命令行来完成这个工作。 当您每次更换您的 mailertable 后您总是需要执行这个命令。 最后提示:如果您不确定某个特定的路径可用, 记得把 选项加到 sendmail。这会将 sendmail 启动在 地址检测模式。只要按下 3,0,接着输入您希望测试的邮件路径位置。 最后一行告诉您使用邮件代理程序, 代理程序会通知目的主机以及 (可能转换) 地址。 要离开此模式请按 CtrlD &prompt.user; sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > 3,0 foo@example.com canonify input: foo @ example . com ... parse returns: $# uucp-dom $@ your.uucp.relay $: foo < @ example . com . > > ^D Bill Moran Contributed by 只发送邮件的配置 许多时候, 可能只希望通过转发服务器来发送邮件。 典型的情况包括: 使用桌面机, 但希望通过类似 &man.send-pr.1; 这样的程序发送邮件。 这样就需要使用 ISP 的邮件转发服务器。 不在本地处理邮件的服务器, 但它需要把邮件交给转发服务器来进行处理。 几乎任何一个 MTA 都能够胜任这样的工作。 然而不幸的是, 要把一个全功能的 MTA 正确地配置为只把邮件交给其他服务器是一件很困难的事情。 使用 sendmail 以及 postfix 这样的程序, 多少有些杀鸡用牛刀的感觉。 此外, 如果您使用典型的 Internet 访问服务, 您的协议可能会包含禁止运行 邮件服务器 的条款。 满足这些需要最简单的办法是安装 mail/ssmtp port。 以 root 身份执行下面的命令: &prompt.root; cd /usr/ports/mail/ssmtp &prompt.root; make install replace clean 一旦装好, mail/ssmtp 就可以用四行 /usr/local/etc/ssmtp/ssmtp.conf 来配置: root=yourrealemail@example.com mailhub=mail.example.com rewriteDomain=example.com hostname=_HOSTNAME_ 请确认您为 root 使用了真实的电子邮件地址。 用您的 ISP 提供的外发邮件转发服务器名称, 替换掉 mail.example.com (某些 ISP 可能将其称为 外发邮件服务器SMTP 服务器)。 接下来确认禁用了 sendmail, 这可以通过将 sendmail_enable="NONE" 加入 /etc/rc.conf 来完成。 mail/ssmtp 也提供了一些其他选项。 请参见在 /usr/local/etc/ssmtp 中的示例配置, 或者 ssmtp 的联机手册来得到一些例子和更多的其他信息。 以这种方式配置 ssmtp, 能够让您计算机上的任何需要发送邮件的软件都正常运转, 而不必冒违反 ISP 的使用政策, 或使您的电脑被劫持用于发送垃圾邮件的风险。 拨号连接时使用邮件传送 如果您有静态的 IP 地址, 就应该不用修改任何默认的配置。 将主机名设置为分配给您的 Internet 名称,其他的事情 sendmail 都会替您做好。 如果您的 IP 地址是动态分配的, 并使用 PPP 连接拨入 Internet, 则您可能会从 ISP 的邮件服务器上得到一个信箱。 这里我们假设您的 ISP 的域名是 example.net, 您的用户名是 user, 您把自己的机器称作 bsd.home, 而您的 ISP 告诉您可以使用 relay.example.net 来转发邮件。 为了从邮箱收取邮件, 需要安装一个收信代理。 fetchmail 是一个能够支持许多种不同协议的不错的选择。 这个程序可以通过 package 或 Ports Collection (mail/fetchmail) 来安装。 通常, 您的 ISP 会提供 POP。 如果您使用用户 PPP,您还可以在 Internet 连接建立时自动地抓取邮件, 这可以通过在 /etc/ppp/ppp.linkup 中增加如下的项来实现: MYADDR: !bg su user -c fetchmail 如果您正使用 sendmail (如下所示) 来为非本地用户传送邮件, 则可能需要让 sendmail 在您的 Internet 连接建立时立即传送邮件队列。 要完成这项工作, 应该把下面的命令放到 /etc/ppp/ppp.linkup 中的 fetchmail 之后 !bg su user -c "sendmail -q" 假设您在 bsd.home 上有一个 user 用户。 在 bsd.home 上的 user 主目录中创建一个 .fetchmailrc 文件: poll example.net protocol pop3 fetchall pass MySecret 因为包含了密码 MySecret, 这个文件应该只有 user 可读。 要使用正确的 from: 头来发送文件, 您必须告诉 sendmail 使用 user@example.net 而不是i user@bsd.home。 另外, 您可能也需要要求 sendmail 通过 relay.example.net 来发送邮件, 以便更快地传送它们。 以下的 .mc 文件应该可以满足您的需求: VERSIONID(`bsd.home.mc version 1.0') OSTYPE(bsd4.4)dnl FEATURE(nouucp)dnl MAILER(local)dnl MAILER(smtp)dnl Cwlocalhost Cwbsd.home MASQUERADE_AS(`example.net')dnl FEATURE(allmasquerade)dnl FEATURE(masquerade_envelope)dnl FEATURE(nocanonify)dnl FEATURE(nodns)dnl define(`SMART_HOST', `relay.example.net') Dmbsd.home define(`confDOMAIN_NAME',`bsd.home')dnl define(`confDELIVERY_MODE',`deferred')dnl 如何转换这个 .mc 文件到 sendmail.cf 文件的细节,请参考前面的章节。 另外,在更新 sendmail.cf 文件后, 不要忘记重启 sendmail James Gorham 作者: SMTP 验证 在您的邮件服务器上启用 SMTP 验证有很多好处。 SMTP 验证可以让 sendmail 多一重安全保障, 而且也使得使用不同机器的漫游用户能够使用同一个邮件服务器, 而不需要每次都修改它们的邮件客户端配置。 从 ports 中安装 security/cyrus-sasl。 您可以从 security/cyrus-sasl 找到它。 security/cyrus-sasl 有一系列编译时可选的选项, 包括我们将要使用的验证方式等等。请务必选择 安装完 security/cyrus-sasl 之后, 编辑 /usr/local/lib/sasl/Sendmail.conf (如果不存在则建立) 并在其中增加: pwcheck_method: passwd 这个方法将允许sendmail 依照您的 FreeBSD passwd 数据库进行验证。 这将为每个用户建立一个新用户名设置和口令使用 SMTP 验证减少麻烦,并且保证登录和邮件口令是相同的。 现在编辑 /etc/make.conf 文件,添加如下行: SENDMAIL_CFLAGS=-I/usr/local/include/sasl1 -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl 这些行将给 sendmail 合适的配置选项, 为在编译时间链接到 cyrus-sasl。 确定 cyrus-sasl 被安装之前重新编译 sendmail 重新编译 sendmail 运行如下命令: &prompt.root; cd /usr/src/usr.sbin/sendmail &prompt.root; make cleandir &prompt.root; make obj &prompt.root; make &prompt.root; make install 如果 /usr/src 和共享库没有大的变化并且它们都必须可用,sendmail 编译应该没有任何问题。 sendmail 被重新编译和安装后, 编辑您的 /etc/mail/freebsd.mc 文件 (或者无论您选择使用的您的哪个 .mc 文件。许多管理员选择使用跟 &man.hostname.1; 一样的唯一的 .mc 文件输出)。添加这些行在这个文件: dnl set SASL options TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl define(`confDEF_AUTH_INFO', `/etc/mail/auth-info')dnl 这些选项配置有不同的方法,对于 sendmail 验证用户。 如果您想要使用除 pwcheck 之外的方法,请参考相关文档。 最后,在 /etc/mail 运行 &man.make.1;。 它将建立您的新 .mc 文件并建立一个 .cf 文件命名为 freebsd.cf (或者您想使用您的其它名字的 .mc文件)。接着使用命令 make install restart,这将复制文件到 sendmail.cf,并且正确的重新启动 sendmail。 更多有关这个过程的信息,您可以参考 /etc/mail/Makefile 文件。 如果所每个步骤都做对了, 您应该可以通过您的邮件客户端进入您的登录信息并且传送一个测试信息。 更多的分析,设置 sendmail 到 13 并且查看 /var/log/maillog 中的信息。 - 您也许希望添加如下行到 /etc/rc.conf 文件, - 这将允许服务在重起之后自动运行: + 您也许希望添加下面的行到 /etc/rc.conf 文件, + 这样, 服务就会重启之后自动运行: - sasl_pwcheck_enable="YES" -sasl_pwcheck_program="/usr/local/sbin/pwcheck" + cyrus_pwcheck_enable="YES" 这将保证 SMTP_AUTH 初始化在系统启动时自动运行。 更多的信息,请参看 sendmail 相关页 SMTP 验证 Marc Silver Contributed by 邮件用户代理 邮件用户代理 邮件用户代理 (MUA) 是一个用于收发邮件的应用程序。 更进一步, 随着电子邮件的 演化 并愈发复杂, MUA 在和电子邮件相结合方面变得日趋强大; 这为用户提供了更多的功能和灵活性。 &os; 包含了对于众多邮件用户代理的支持, 所有这些都可以通过 FreeBSD Ports Collection 来轻松安装。 用户可以选择类似 evolution 以及 balsa 这样的图形界面程序, 也可以选择类似 muttpinemail 这样的控制台程序, 或者某些大型机构使用的 web 界面。 mail &man.mail.1; 是 &os; 中默认的邮件用户代理 (MUA)。 它是一个基于控制台的 MUA, 提供了所有用于收发文本形式的电子邮件所需的基本功能, 虽然它处理附件的能力有限, 而且只支持本地的信箱。 虽然 mail 没有内建的 POPIMAP 服务器支持, 然而这些信箱可以通过类似 fetchmail 这样的应用程序, 来下载到本地的 mbox 文件中。 这一应用程序在本章的稍后部分 () 进行了介绍。 要收发邮件, 只需简单地使用 mail 命令, 如下所示: &prompt.user; mail 用户保存在 /var/mail 中的信箱的内容会被 mail 程序自动地读取。 如果信箱是空的, 程序会退出并给出一个消息表示没有邮件。 一旦读完了信箱, 将启动应用程序的界面, 并列出邮件。 所有的邮件会被自动编号, 类似下面的样子: Mail version 8.1 6/6/93. Type ? for help. "/var/mail/marcs": 3 messages 3 new >N 1 root@localhost Mon Mar 8 14:05 14/510 "test" N 2 root@localhost Mon Mar 8 14:05 14/509 "user account" N 3 root@localhost Mon Mar 8 14:05 14/509 "sample" 现在, 您通过使用 mailt 命令, 并给出邮件的编号, 就可以看到邮件了。 在这个例子中, 我们将阅读第一封邮件: & t 1 Message 1: From root@localhost Mon Mar 8 14:05:52 2004 X-Original-To: marcs@localhost Delivered-To: marcs@localhost To: marcs@localhost Subject: test Date: Mon, 8 Mar 2004 14:05:52 +0200 (SAST) From: root@localhost (Charlie Root) This is a test message, please reply if you receive it. 正如在上面的例子中所看到的, t 键将显示完整的邮件头。 要再次查看邮件的列表, 可以使用 h 键。 如果需要回复邮件, 也可以使用 mail 来完成, 方法是使用 Rr 这两个 mail键。 R 键会要求 mail 只回复发送邮件的人, 而 r 不仅回复发送邮件的人, 而且也会将回复抄送给原来邮件的其他接收者。 如果需要, 也可以在这些命令后面指定邮件的编号。 做完这些之后, 就可以输入回复了, 在邮件的最后应该有一个只有一个 . 的行, 例如: & R 1 To: root@localhost Subject: Re: test Thank you, I did get your email. . EOT 要发出新邮件, 可以使用 m, 后面接收件人的邮件地址。 多个收件人之间, 应该使用 , 隔开。 接下来需要输入邮件的主题, 然后是正文。 同样的, 在邮件最后需要一个只有 . 的空行表示结束。 & mail root@localhost Subject: I mastered mail Now I can send and receive email using mail ... :) . EOT mail 工具中, 可以用 ? 来显示帮助, 而参考 &man.mail.1; 联机手册则可以获得更多关于 mail 的帮助信息。 正如前面所提到的那样, &man.mail.1; 命令在设计时没有考虑到要处理附件, 因而在这方面他的功能很弱。 新的 MUA, 如 mutt, 能够更好地处理附件。 但如果您仍然希望使用 mail 命令, 那么 converters/mpack port 则是一个值得考虑的附加工具。 mutt mutt 是一个短小精悍的邮件用户代理, 它提供了许多卓越的功能, 包括: 能够按线索阅读邮件; 支持使用 PGP 对邮件进行数字签名和加密; 支持 MIME; 支持 Maildir; 高度可定制。 所有这些特性, 都使得 mutt 得以跻身于目前最先进的邮件用户代理的行列。 请参考 以了解更多关于 mutt 的资料。 稳定版本的 mutt 可以通过 mail/mutt port 来安装, 而开发版本, 则可以通过使用 mail/mutt-devel port 安装。 通过 port 安装之后,可以通过下面的命令来启动 mutt &prompt.user; mutt mutt 会自动读取 /var/mail 中的用户信箱, 并显示其内容。 如果用户信箱中没有邮件, 则 mutt 将等待来自用户的命令。 下面的例子展示了 mutt 列出邮件的情形: 要阅读邮件, 只需用光标键选择它, 然后按 Enter 键。 以下是 mutt 显示邮件的例子: 和 &man.mail.1; 类似, mutt 允许用户只回复发件人, 或者回复所有人。 如果只想回复发信任, 使用 r 快捷键。 要回复所有人 (group reply), 可以用 g 快捷键。 mutt 会使用 &man.vi.1; 命令作为编辑器, 用于创建和回复邮件。 这一行为可以通过建立用户自己的 .muttrc 文件来订制, 方法是修改 editor 变量。 要撰写新邮件, 需要首先按 m。 在输入了有效的邮件主题之后, mutt 将启动 &man.vi.1;, 您可以在其中撰写邮件。 写好邮件的内容之后, 存盘并退出 vi, 则 mutt 将继续, 并显示一些关于将发出的邮件的摘要信息。 要发送邮件, 只需按 y。 下面给出了摘要信息的一个例子: mutt 也提供了相当详尽的帮助, 在绝大多数菜单中, 都可以使用 ? 键将其呼出。 屏幕顶行中也会给出常用的快捷键。 pine pine 主要是针对初学者设计的, 但也提供了一些高级功能。 过去, pine 软件被发现有许多远程漏洞, 这些漏洞会允许远程的攻击者在用户的本地系统上, 通过发送精心炮制的邮件来执行任意的代码。 所有的 已知 问题都已经被修正了, 但 pine 的代码是以很不安全的风格编写的, 并且 &os; 安全官相信仍然有一些尚未被发现的安全漏洞。 您应当考虑并承担安装 pine 可能带来的风险。 最新版本的 pine 可以通过使用 mail/pine4 port 来安装。 装好之后, pine 可以通过下面的命令启动: &prompt.user; pine 第一次启动 pine 时, 它会显示出一个欢迎页, 并给出简要的介绍, 以及 pine 开发小组要求用户匿名发送一封邮件, 以便帮助他们了解有多少用户在使用他们开发的客户程序的请求。 要发送这封匿名的邮件, 请按 Enter, 您也可以按 E 退出, 而不发送匿名邮件。 下面是欢迎页的一个例子: 接下来展现给用户的将是主菜单, 可以很容易地通过光标键在上面进行选择。 这个主菜单提供了用于撰写新邮件、 浏览邮件目录, 甚至管理地址簿等等的快捷方式。 主菜单下面是完成各种功能的快捷键说明。 pine 打开的默认目录是 inbox。 要查看邮件所以in, 应按 I, 或选择下面所示的 MESSAGE INDEX 选项: 邮件索引展示了当前目录下的邮件, 可以使用光标键翻阅。 按 Enter 键阅读高亮选定的邮件。 在上面的截屏中, 使用 pine 显示了一封示例邮件。 在屏幕底部也显示了快捷键供参考。 其中的一个例子是 r 键, 它告诉 MUA 回复正显示的邮件。 pine 中回复邮件, 是通过 pico 编辑器完成的, 后者默认情况下会随 pine 一起安装。 而 pico 工具使得浏览邮件变得更加简单, 并且要比 &man.vi.1; 或 &man.mail.1; 更能容忍误操作。 回复写好之后, 可以用 CtrlX 来发出它。 此前, pine 程序会要求确认。 pine 程序可以通过使用主菜单中的 SETUP 选项来进行定制。 请参考 来了解更多信息。 Marc Silver Contributed by 使用 fetchmail fetchmail fetchmail 是一个全功能的 IMAPPOP 客户程序, 它允许用户自动地从远程的 IMAPPOP 服务器上下载邮件, 并保存到本地的信箱中; 这样, 访问这些邮件就变得更方便了。 fetchmail 可以通过 mail/fetchmail port 安装, 它提供了许多有用的功能, 其中包括: 支持 POP3APOPKPOPIMAPETRN 以及 ODMR 协议。 通过 SMTP 转发邮件, 这使得过滤、 转发, 以及邮件别名能够正常工作。 能够以服务程序的方式运行, 并周期性地检查邮件。 能够从多个信箱收取邮件, 并根据配置, 将这些邮件转发给不同的本地用户。 尽管介绍全部 fetchmail 的功能超出了本书的范围, 但这里仍然介绍了其基本的功能。 fetchmail 工具需要一个名为 .fetchmailrc 的配置文件才能正常工作。 这个文件中包含了服务器信息, 以及登录使用的凭据。 由于这个文件包含敏感内容, 建议将其设置为只有属主所有, 使用下面的命令: &prompt.user; chmod 600 .fetchmailrc 下面的 .fetchmailrc 提供了一个将某一用户的信箱通过 POP 下载到本地的例子。 它告诉 fetchmail 连接到 example.com, 并使用用户名 joesoap 和口令 XXX。 这个例子假定 joesoap 同时也是本地的系统用户。 poll example.com protocol pop3 username "joesoap" password "XXX" 下一个例子将连接多个 POPIMAP 服务器, 并根据需要转到不同的本地用户: poll example.com proto pop3: user "joesoap", with password "XXX", is "jsoap" here; user "andrea", with password "XXXX"; poll example2.net proto imap: user "john", with password "XXXXX", is "myth" here; 另外, fetchmail 也可以通过指定 参数, 并给出 fetchmail 在轮询 .fetchmailrc 文件中列出的服务器的时间间隔, 来以服务程序的方式运行。 下面的例子会让 fetchmail 每 60 秒轮询一次: &prompt.user; fetchmail -d 60 更多关于 fetchmail 的资料, 可以在 找到。 Marc Silver Contributed by 使用 procmail procmail procmail 是一个强大得惊人的过滤进入邮件的应用程序。 它允许用户定义 规则, 并用这些规则来匹配进入的邮件, 进而执行某些特定的功能, 或将这些邮件转发到其他信箱和/或邮件地址。 procmail 可以通过 mail/procmail port 来安装。 装好之后, 可以直接把它集成到绝大多数 MTA 中; 请参考您使用的 MTA 的文档了解具体的作法。 另外, procmail 可允许通过把下面的设置加入到用户主目录中的 .forward 文件中, 来启用 procmail 功能: "|exec /usr/local/bin/procmail || exit 75" 接下来我们将介绍一些基本的 procmail 规则, 以及它们都是做什么的。 各种各样的规则, 都应该写到 .procmailrc 文件中, 而这个文件则必须放在用户的主目录下。 主要的规则, 也可以在 &man.procmailex.5; 联机手册中找到。 将所有来自 user@example.com 的邮件, 转发到外部地址 goodmail@example2.com :0 * ^From.*user@example.com ! goodmail@example2.com 转发所有不超过 1000 字节的邮件到外部地址 goodmail@example2.com :0 * < 1000 ! goodmail@example2.com 把所有发送到 alternate@example.com 的邮件放到信箱 alternate 中: :0 * ^TOalternate@example.com alternate 将所有标题为 Spam 的邮件发到 /dev/null :0 ^Subject:.*Spam /dev/null 将收到的所有 &os;.org 邮件列表的邮件, 转发到各自的信箱: :0 * ^Sender:.owner-freebsd-\/[^@]+@FreeBSD.ORG { LISTNAME=${MATCH} :0 * LISTNAME??^\/[^@]+ FreeBSD-${MATCH} } diff --git a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml index 23f8581827..7ab0ef80a5 100644 --- a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml @@ -1,2858 +1,2861 @@ 获取 FreeBSD CDROM 和 DVD 发行商 零售盒装产品 可以从下面几个零售商那里买到 FreeBSD 的盒装产品(FreeBSD CD, 附加软件,印刷文档):
CompUSA WWW:
Frys Electronics WWW:
CD 和 DVD 光盘 FreeBSD CD 和 DVD 光盘可以从许多在线零售商那里买到:
BSD Mall by Daemon News PO Box 161 Nauvoo, IL 62354 USA Phone: +1 866 273-6255 Fax: +1 217 453-9956 Email: sales@bsdmall.com WWW:
BSD-Systems Email: info@bsd-systems.co.uk WWW:
fastdiscs.com 6 Eltham Close Leeds, LS6 2TY United Kingdom Phone: +44 870 1995 171 Email: sales@fastdiscs.com WWW:
FreeBSD Mall, Inc. 3623 Sanford Street Concord, CA 94520-1405 USA Phone: +1 925 674-0783 Fax: +1 925 674-0821 Email: info@freebsdmall.com WWW:
- -
- FreeBSD Services Ltd - 11 Lapwing Close - Bicester - OX26 6XR - United Kingdom - WWW: -
-
-
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:
+ +
+ Linux CD Mall + Private Bag MBE N348 + Auckland 1030 + New Zealand + Phone: +64 21 866529 + 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:
- -
- UNIXDVD.COM LTD - 57 Primrose Avenue - Sheffield - S5 6FS - United Kingdom - WWW: -
-
-
发行人 如果您是销售商并且想销售 FreeBSD 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:
- -
- FreeBSD Services Ltd - 11 Lapwing Close - Bicester - OX26 6XR - United Kingdom - 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.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 站点 官方的 FreeBSD 源代码可以从遍布全球的镜像站点 通过匿名 FTP 下载。 站点 有着良好的网络连接并且允许大量的并发连接, 但是 您或许更想找一个 更近的 镜像站点 (特别是当您想进行某种形式的镜像的时候)。 FreeBSD 镜像 站点数据库要比使用手册中的镜像列表更加精确, 因为它从 DNS 中获取信息而不依赖于静态的主机列表。 FreeBSD 可以从下面这些镜像站点通过匿名 FTP 下载。如果您选择了通过匿名 FTP 获取 FreeBSD, 请尽量使用离您比较近的站点。被列为 主镜像站点 的镜像站点一般都有完整的 FreeBSD 文件 (针对每种体系结构的所有当前可用的版本), 您或许从您所在的国家或地区的站点下载会得到更快的下载速度。 每个站点提供了最流行的体系结构的最近的版本而有可能不提供完整的 FreeBSD 存档。所有的站点都提供匿名 FTP 访问而有些站点也提供其他的访问方式。对每个站点可用的访问方式 在其主机名后有所说明。 &chap.mirrors.ftp.inc; 匿名 CVS <anchor id="anoncvs-intro">概述 CVS 匿名 匿名 CVS(或人们常说的 anoncvs)是由和 FreeBSD 附带的 CVS 实用工具提供的用于和远程的 CVS 代码库同步的一种特性。 尤其是, 它允许 FreeBSD 用户不需要特殊的权限对任何一台 FreeBSD 项目的官方 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 仓库的只读操作,所以如果您是想用和 FreeBSD 项目共享的仓库提供本地开发的话, CVSup 几乎是您唯一的选择。 <anchor id="anoncvs-usage">使用匿名 CVS 配置 &man.cvs.1; 使用匿名 CVS 仓库可以简单的设定 CVSROOT 环境变量指向 FreeBSD 项目的 anoncvs 服务器之一。到此书写作为止, 下面的服务器都是可用的: 奥地利: :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs (使用 cvs login 然后在提示输入口令时输入任意口令。) 法国: :pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs (pserver (口令是 anoncvs), ssh (没有口令)) 德国: :pserver:anoncvs@anoncvs.de.FreeBSD.org:/home/ncvs (Use cvs login and enter the password anoncvs when prompted.) 德国: :pserver:anoncvs@anoncvs2.de.FreeBSD.org:/home/ncvs (rsh, pserver, ssh, ssh/2022) 日本: :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs (Use cvs login and enter the password anoncvs when prompted.) 瑞典: freebsdanoncvs@anoncvs.se.FreeBSD.org:/home/ncvs (仅 ssh - 无口令) SSH HostKey: 1024 a7:34:15:ee:0e:c6:65:cf:40:78:2d:f3:cd:87:bd:a6 root@apelsin.fruitsalad.org SSH2 HostKey: 1024 21:df:04:03:c7:26:3e:e8:36:1a:50:2d:c7:ae:b8:5f 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 /etc/ssh/ssh_host_dsa_key.pub +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 (仅 ssh - 无口令) - SSH HostKey: 1024 f1:6a:9c:6d:e3:f3:ae:f8:b5:68:ac:30:cb:11:32:9b root@ender.liquidneon.com -SSH2 HostKey: 1024 9a:d6:e1:e2:4f:58:36:77:e5:5b:60:ee:94:1b:c1:c0 ssh_host_dsa_key.pub + SSH HostKey: 1024 4b:83:b6:c5:70:75:6c:5b:18:8e:3a:7a:88:a0:43:bb root@ender.liquidneon.com +SSH2 HostKey: 1024 80:a7:87:fa:61:d9:25:5c:33:d5:48:51:aa:8f:b6:12 ssh_host_dsa_key.pub 因为 CVS 实际上允许 检出 曾经存在的 (或者,某种情况下将会存在) FreeBSD 源代码的任意版本, 您需要熟悉 &man.cvs.1; 的版本 () 参数, 以及在 FreeBSD 代码库中可用的值。 有两种标签,修订标签和分支标签。 修订标签特指一个特定的修订版本。含义始终是不变的。 分支标签,另一方面, 指代给定时间给定开发分支的最新修订, 因为分支标签不涉及特定的修订版本, 它明天所代表的含义就可能和今天的不同。 包括了用户可能感兴趣的 修订标签。 另外,这里面没有一个可以用于 Ports Collection, 因为它没有多个修订版本。 当您指定一个分支标签,您通常会得到那个开发分支的文件的最新版本。 如果您希望得到一些旧的版本,您可以用 标记制定一个日期。 察看 &man.cvs.1; 手册页了解更多细节。 示例 在这之前强烈建议您通读 &man.cvs.1; 的手册页, 这里有一些简单的例子来展示如何使用匿名 CVS: 从 -CURRENT 检出些东西(&man.ls.1;) 然后再删除: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co ls &prompt.user; cvs release -d ls &prompt.user; cvs logout 通过 SSH 检出整个 <filename>src/</filename> 代码树: &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. 检出 &man.ls.1; 在 3.X-STABLE 分支中的版本: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co -rRELENG_3 ls &prompt.user; cvs release -d ls &prompt.user; cvs logout 创建 &man.ls.1; 的变化列表(用标准的 diff) &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs rdiff -u -rRELENG_3_0_0_RELEASE -rRELENG_3_4_0_RELEASE ls &prompt.user; cvs logout 找出可以使用的其它的模块名: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co modules &prompt.user; more modules/modules &prompt.user; cvs release -d modules &prompt.user; cvs logout 其他资源 下面附加的资源可能对学习 CVS 有帮助: CVS 指南 来自 Cal Poly。 CVS 主页, CVS 开发和支持论坛。 CVSweb 是 FreeBSD 项目的 CVS web 界面。 使用 CTM CTM CTM 是保持远程目录树和中央服务器目录树同步的一种方法。 它被开发用于 FreeBSD 的源代码树,虽然其他人随着时间推移会发现它可以用于其他目的。 当前几乎没有,也或者只有很少的文档讲述创建 deltas 的步骤, 所以如果您希望使用 CTM 去做其它事情, 请联系 &a.ctm-users.name; 邮件列表了解更多信息。 为什么我该使用 <application>CTM</application>? CTM 会给您一份 FreeBSD 源代码树的本地拷贝。代码树有很多的 flavors 可用。不管您是希望跟踪完整的 CVS 树还是只是一个分支, CTM 都会给您提供信息。 如果您是 FreeBSD 上的一个活跃的开发者,但是缺乏或者不存在 TCP/IP 连接,或者只是希望把变化自动发送给您, CTM 就是适合您的。对于最积极的分支 您将会每天获得三个以上的 deltas。 然而,您应该考虑通过邮件来自动发送。 升级的大小总是保证尽可能的小。 通常小于 5K,也偶然(十分之一可能)会有 10-50K,也不时地有个大的 100K+ 甚至更大的。 您也需要让自己了解直接和开发代码而不是预发行版本打交道的各种警告。这种情况会很显著, 如果您选择了 current 代码的话。强烈建议您阅读和 FreeBSD 保持同步。 使用 <application>CTM</application> 我需要做什么? 您需要两样东西:CTM 程序,还有初始的 deltas 来 feed it(达到 current 级别)。 CTM 程序从版本 2.0 发布以来 已经是 FreeBSD 的一部分了,如果您有一份源代码拷贝的话它位于 /usr/src/usr.sbin/ctm 如果您再运行一个比 2.0 版本早的 FreeBSD 系统, 可以直接从下面下载最新的 CTM 源代码: 您喂给 CTMdeltas 可以有两种方式,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 系统的操作的公告。 点击上面的邮件列表名并按照指示订阅邮件列表。 第一次使用 <application>CTM</application> 在您开始使用 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。 在您的日常生活中使用 <application>CTM</application> 要应用 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 文件到最新版本。 其他有趣的 <application>CTM</application> 选项 正确的找出哪些将被更新 您可以确定变动列表, 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 操作。 <application>CTM</application> 未来的计划 其中几项: CTM 中使用一些认证方式, 这样来允许察觉冒充的 CTM 补丁。 整理 CTM 的选项, 它们变得杂乱而违反直觉了。 杂项 也有一系列的 ports collection 的 deltas,但是人们对它的兴致还没有那么高。 CTM 镜像 CTM/FreeBSD 可以在下面的镜像站点通过匿名 FTP 下载。如果您选择通过匿名 FTP 获取 CTM, 请试着使用一个离您较近的站点。 如果有问题,请联系 &a.ctm-users.name; 邮件列表。 加利福尼亚州,海湾地区,官方源代码 南非,旧的 deltas 的备份服务器 中国台湾 如果您在您附近找不到镜像或者镜像不完整, 试着使用搜索引擎比如 alltheweb. 使用 CVSup 概述 CVSup 是一个用于从远程服务器主机上的主 CVS 仓库发布和升级源代码树的软件包。 FreeBSD 的源代码维护在加利福尼亚州一台主开发服务器的 CVS 仓库里。 有了 CVSup,FreeBSD 用户可以很容易的保持他们自己的源代码树更新。 CVSup 使用所谓的升级 pull 模式。在 pull 模式下,客户端在需要的时候向服务器端请求更新。 服务器被动的等待客户端的升级请求。 因此所有的升级都是客户端发起的。 服务器决不会发送未请求的升级。用户必须手动运行 CVSup 客户端获取更新, 或者设置一个 cron 作业来让它以固定的规律自动运行。 术语 CVSup用大写字母写正是表示, 代表了完整的软件包。 它的主要组件是运行在每个用户机器上的客户端 cvsup, 和运行在每个 FreeBSD 镜像站点上的服务器端 cvsupd 当您阅读 FreeBSD 文档和邮件列表时,您可能会看见 supSupCVSup 的前身,有着相似的目的。 CVSup 使用很多和 sup 相同的方式, 而且, 它还是用使用和 sup 的兼容的配置文件。 Sup 已经不再被 FreeBSD 项目使用了, 因为 CVSup 既快又有更好的灵活性。 安装 安装 CVSup 最简单的方式就是使用 FreeBSD packages collection 中预编译的 net/cvsup 包。 如果您想从源代码构建 CVSup, 您可以使用 net/cvsup port。但是预先警告一下: net/cvsup port 依赖于 Modula-3 系统,会花费相当的时间和磁盘空间来下载编译。 如果想在没有安装 &xfree86;&xorg; 的计算机, 例如服务器上使用 CVSup, 则只能使用不包含 CVSup GUInet/cvsup-without-gui 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 行改变或扩充。 知道了这些,我们现在就可以开始创建一个 用于接收和升级 FreeBSD-CURRENT 主源代码树的 supfile 文件了。 您想接收哪些文件? 通过 CVSup 可用的文件组织成叫做 collections 的名称组。 这些可用的 collection 在 随后的章节 中描述。 在这个例子里, 我们希望接收 FreeBSD 系统的完整的主代码树。 有一个单独的大的 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; 手册页解释了如何来做。 对于我们的示例来说,我们希望接收 FreeBSD-CURRENT。 我们在我们的 supfile 的开头添加这行: *default tag=. 有一个重要的特例, 如果您既没指定 tag= 字段也没指定 date= 字段的情况。这种情况下, 您会收到直接来自于服务器 CVS 仓库的真实的 RCS 文件, 而不是某一特定版本。 开发人员一般喜欢这种操作模式。 通过在他们的系统上维护一份仓库自身的副本, 他们可以浏览修订历史以及检查文件过去的版本。 然而,这个好处是以大量的磁盘空间为代价的。 您想从哪里获取他们? 我们使用 host= 字段来告诉 cvsup 从哪里获取更新。 任何一个 CVSup 镜像站点都可以, 虽然您应该选择一个离您比较近的站点。 在这个例子里我们将使用一个虚拟的 FreeBSD 发布站点, cvsup99.FreeBSD.org *default host=cvsup99.FreeBSD.org 您需要在运行 CVSup 之前把这个改成一个实际存在的站点。 在任何 cvsup 运行的特定时刻, 您都可以在命令行上使用 选项来覆盖主机设置。 您想把它们放在 您自己机器的什么地方? prefix= 字段告诉 cvsup 把接收的文件放在哪里。 在这个例子里,我们把源代码文件直接放进我们的主源代码树, /usr/srcsrc 目录已经隐含在我们选择接收的 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 显示服务器应该从 FreeBSD 的主 CVS 仓库中获取信息。 事实上总是这样的,但是也有可能会超出这个讨论的范围。 deleteCVSup 权限删除文件。 您应该总是指定这个,这样 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 <filename>refuse</filename> 文件 像上面提到的,CVSup 使用一种 pull 方法。基本上,这意味着您要连接到 CVSup 服务器,服务器说, 这有些您能下载的东西 ...,然后您的客户端反应好,我要这个, 这个,这个,还有这个。在默认的配置中, CVSup 客户端会取回您在配置文件中选定的 collection 和标签的每个文件。 然而,并不总是您想要的, 尤其是您在同步 docports,或者 www 树 — 大部分人都不能阅读四种或者五种 语言,因此他们不需要下载特定语言的文件。 如果您在 CVSup Ports Collection,您 可以通过单独指定每个 collection 来避免这个 (比如,ports-astrologyports-biology,等等取代简单的说明 ports-all)。然而,因为 docwww 树没有特定语言的 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/it_* doc/ja_* doc/nl_* doc/no_* doc/pl_* doc/pt_* doc/ru_* doc/sr_* doc/tr_* doc/zh_* 等等其他语言(您可以通过浏览 FreeBSD CVS 仓库找到完整的列表)。 有这个非常有用的特性,那些慢速连接或者要为他们的 Internet 连接按时付费的用户就可以节省宝贵的时间因为他们不再需要 下载那些从来不用的文件。要了解 refuse 文件的更多信息以及其它 CVSup 的优雅的特性,请浏览它的 手册页。 运行 <application>CVSup</application> 您现在准备尝试升级了。命令很简单: &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。 <application>CVSup</application> 文件 collection CVSup 可用的文件 collection 是分级组织的。 有几个大的 collection,然后它们有分成更小的子 collection。接收一个大的 collection 等同于 接收它的每一个子 collection。 collection 的等级关系在下面列表中通过缩进的使用 反映出来。 最常用的 collection 是 src-all,和 ports-all。其它的 collection 只被有着特定 目的的小部分人使用, 有些站点可能不全部支持。 cvs-all release=cvs FreeBSD 主 CVS 仓库,包含 密码系统的代码。 distrib release=cvs FreeBSD 发行版本和镜像相关的 文件。 doc-all release=cvs FreeBSD 使用手册和其它文档的源代码。 其中不包含 FreeBSD web 站点的文件。 ports-all release=cvs FreeBSD 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/portsMk/Tools/ 子目录的 各种各样的文件。 请查看 重要警告:您应该 总是更新这个 子 collection,无论您更新 FreeBSD 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-mgmt release=cvs 网管软件。 ports-news release=cvs USENET 新闻软件。 ports-palm release=cvs Palm 系列软件支持。 ports-polish release=cvs 波兰语支持。 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-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 窗口管理器。 src-all release=cvs FreeBSD 主代码,包含密码系统的代码。 src-base release=cvs /usr/src 顶层的各式各样的文件。 src-bin release=cvs 但用户模式下可能用到的用户工具 (/usr/src/bin)。 src-contrib release=cvs FreeBSD 项目之外的工具和库,通常在 FreeBSD 中不作修改 (/usr/src/contrib)。 src-crypto release=cvs FreeBSD 项目之外的 密码系统工具和库,通常在 FreeBSD 中不作修改 (/usr/src/crypto)。 src-eBones release=cvs Kerberos 和 DES (/usr/src/eBones)。 没有在当前的 FreeBSD 发行中使用。 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 生成 FreeBSD 版本必需的文件 (/usr/src/release)。 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 维护 FreeBSD 的各种各样的工具 (/usr/src/tools)。 src-usrbin release=cvs 用户工具 (/usr/src/usr.bin)。 src-usrsbin release=cvs 系统工具 (/usr/src/usr.sbin)。 www release=cvs FreeBSD WWW 站点的源代码。 distrib release=self CVSup 服务器的 配置文件。用于 CVSup 镜像站点。 gnats release=current GNATS bug 跟踪数据库。 mail-archive release=current FreeBSD 邮件列表存档。 www release=current 预处理过的 FreeBSD WWW 站点文件(不是源文件)。 用于 WWW 镜像站点。 更多信息 CVSup FAQ 和关于 CVSup 的其它信息,请查看 CVSup 主页 大多数 CVSup 的和 FreeBSD 相关的讨论都在 &a.hackers;。软件的新版本在那发布, 还有 &a.announce;。 问题和 bug 报告应该发给 程序作者 cvsup-bugs@polstra.com CVSup 站点 FreeBSD 的 CVSup 服务器运行于 下列站点: &chap.mirrors.cvsup.inc; CVS 标签 当使用 cvs 或者 CVSup 获取和升级源代码的时候,必须指定一个修订标签。 修订标签代表 &os; 开发的一个特定分支, 或者一个特定的时间点。第一种叫做 分支标签,第二种叫做 版本标签 分支标签 所有这些,除了 HEAD (这个总是 合法标签)以外,只适用于 src/ 树。ports/doc/,和 www/ 树没有分支。 HEAD 主线的符号名,或者说 FreeBSD-CURRENT。 当没有指定修订版本的时候也是默认的。 CVSup 里,这个标签通过 一个 . 来反映出来(不是标点,而是一个 . 字符)。 在 CVS 里,当没有修订标签指定时这是默认的。 在一台 STABLE 机器上检出或者升级到 CURRENT 源代码 通常不是 一个好主意,除非这是您的本意。 + + RELENG_6 + + + 这是 FreeBSD-6.X 的开发分支, + 也被称作 FreeBSD 6-STABLE。 + + + RELENG_5 这是 FreeBSD-5.X 的开发分支, 也被称作 FreeBSD 5-STABLE。 + + RELENG_5_4 + + + FreeBSD-5.4 安全分支。 只被安全公告和其它重要更新使用。 + + + RELENG_5_3 FreeBSD-5.3 安全分支。 只被安全公告和其它重要更新使用。 RELENG_5_2 针对 FreeBSD-5.2 和 FreeBSD-5.2.1 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_5_1 针对 FreeBSD-5.1 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_5_0 针对 FreeBSD-5.0 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4 FreeBSD-4.X 开发线,也被叫做 FreeBSD-STABLE。 RELENG_4_11 FreeBSD-4.11 发行版, 只被安全公告和其它重要更新使用。 RELENG_4_10 针对 FreeBSD-4.10 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_9 针对 FreeBSD-4.9 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_8 针对 FreeBSD-4.8 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_7 针对 FreeBSD-4.7 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_6 针对 FreeBSD-4.6 和 FreeBSD-4.6.2 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_5 针对 FreeBSD-4.5 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_4 针对 FreeBSD-4.4 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_3 针对 FreeBSD-4.3 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_3 FreeBSD-3.X 的开发线,也被叫做 3.X-STABLE。 RELENG_2_2 FreeBSD-2.2.X 的开发线,也被叫做 2.2-STABLE。这个分支过于陈旧了。 版本标签 当一个特定的 &os; 版本发行时, 这些标签代表了一个指定的时间点。发布工程进程在 Release Engineering InformationRelease Process 文档中被详细描述。 src 树使用以 RELENG_ 开头的标签。 portsdoc 树使用以 RELEASE 开头的标签。 最后, www 树上不会有任何特定发行版的标签。 + + RELENG_5_4_0_RELEASE + + + FreeBSD 5.4 + + + RELENG_4_11_0_RELEASE FreeBSD 4.11 RELENG_5_3_0_RELEASE FreeBSD 5.3 RELENG_4_10_0_RELEASE FreeBSD 4.10 RELENG_5_2_1_RELEASE FreeBSD 5.2.1 RELENG_5_2_0_RELEASE FreeBSD 5.2 RELENG_4_9_0_RELEASE FreeBSD 4.9 RELENG_5_1_0_RELEASE FreeBSD 5.1 RELENG_4_8_0_RELEASE FreeBSD 4.8 RELENG_5_0_0_RELEASE FreeBSD 5.0 RELENG_4_7_0_RELEASE FreeBSD 4.7 RELENG_4_6_2_RELEASE FreeBSD 4.6.2 RELENG_4_6_1_RELEASE FreeBSD 4.6.1 RELENG_4_6_0_RELEASE FreeBSD 4.6 RELENG_4_5_0_RELEASE FreeBSD 4.5 RELENG_4_4_0_RELEASE FreeBSD 4.4 RELENG_4_3_0_RELEASE FreeBSD 4.3 RELENG_4_2_0_RELEASE FreeBSD 4.2 RELENG_4_1_1_RELEASE FreeBSD 4.1.1 RELENG_4_1_0_RELEASE FreeBSD 4.1 RELENG_4_0_0_RELEASE FreeBSD 4.0 RELENG_3_5_0_RELEASE FreeBSD-3.5 RELENG_3_4_0_RELEASE FreeBSD-3.4 RELENG_3_3_0_RELEASE FreeBSD-3.3 RELENG_3_2_0_RELEASE FreeBSD-3.2 RELENG_3_1_0_RELEASE FreeBSD-3.1 RELENG_3_0_0_RELEASE FreeBSD-3.0 RELENG_2_2_8_RELEASE FreeBSD-2.2.8 RELENG_2_2_7_RELEASE FreeBSD-2.2.7 RELENG_2_2_6_RELEASE FreeBSD-2.2.6 RELENG_2_2_5_RELEASE FreeBSD-2.2.5 RELENG_2_2_2_RELEASE FreeBSD-2.2.2 RELENG_2_2_1_RELEASE FreeBSD-2.2.1 RELENG_2_2_0_RELEASE FreeBSD-2.2.0 AFS 站点 FreeBSD 的 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 站点 下面的站点让 FreeBSD 可以通过 rsync 协议下载。 rsync 实用程序和 &man.rcp.1; 的工作方式很相像, 但是有更多的选项,使用 rsync 远程更新协议只传输 两份文件的不同之处, 因此能够大幅度的提高网络同步速率。 如果您是 FreeBSD FTP 服务器或者 CVS 仓库的镜像站点, 这一点非常有用。 rsync 套件可以工作在许多种 操作系统上,在 FreeBSD 上,查看 net/rsync port 或者使用 package。 捷克共和国 rsync://ftp.cz.FreeBSD.org/ 可用的 collection: ftp:FreeBSD FTP 服务器的 部分镜像。 FreeBSD:FreeBSD FTP 服务器的 完整镜像。 德国 rsync://grappa.unix-ag.uni-kl.de/ 可用的 collection: freebsd-cvs:完整的 FreeBSD CVS 仓库。 这台服务器也镜像 NetBSD 和 OpenBSD 项目, 还有其他的一些项目的 CVS 仓库。 荷兰 rsync://ftp.nl.FreeBSD.org/ 可用的 collection: vol/4/freebsd-core: 对于 FreeBSD FTP 服务器的完整镜像。 英国 rsync://rsync.mirror.ac.uk/ 可用的 collection: ftp.FreeBSD.org: FreeBSD FTP 服务器 的完整镜像。 美国 rsync://ftp-master.FreeBSD.org/ 服务器只供 FreeBSD 主镜像站点使用。 可用的 collection: FreeBSD:FreeBSD FTP 服务器的主要存档。 acl:FreeBSD 主 ACL 列表。 rsync://ftp13.FreeBSD.org/ 可用的 collection: FreeBSD:FreeBSD FTP 服务器的完整 镜像。
diff --git a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml index 270ab4248f..81da1fc89c 100644 --- a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml @@ -1,1608 +1,1622 @@ Ross Lippert 编辑: 雪平 中文翻译: 多媒体 概述 FreeBSD 广泛地支持各种声卡, 让您可以从容地享受来自您的计算机的高保真输出。 这包括了录制和播放 MPEG Audio Layer 3 (MP3)、 WAV、 以及 Ogg Vorbis 等许多种格式声音的能力。 FreeBSD 同时也包括了许多的应用程序,让您可以录音、 增加声音效果以及控制附加的MIDI设备。 要是乐于动手, FreeBSD 也能支持播放一般的视频文件和 DVD。 对各种视频媒体进行编码、 转换和播放的应用程序比起处理声音的应用程序略少一些。 例如, 在撰写这章时, FreeBSD Ports Collection 中还没有类似 audio/sox 那样好的重编码工具能够用来在不同的格式之间转换。 不过, 这个领域的软件研发进展是很快的。 本章将介绍配置声卡的必要步骤。 X11 的安装和配置 () 里已经考虑到了您显卡的问题, 但要想有更好的播放效果, 仍需要调整一些东西。 读了本章后,您将知道: 如何配置系统识别声卡。 运用样本程序去测试声卡工作的方法。 如何排除声卡安装中的问题。 如何播放和编码MP3以及其它格式的音频。 X 服务器如何支持视频。 哪些好的视频播放/压缩ports - 如何播放DVD、 .mpg.avi 文件。 + 如何播放 DVD、 .mpg 以及 + .avi 文件。 如何从CD和DVD中提取文件。 怎样配置电视卡。 如何配置图像扫描仪。 在读本章这前,您应该: 知道如何配置、安装一个新的内核 () 用&man.mount.8; 命令去装载CD光盘,至少会产生一个错误, 更糟的情况下会产生 kernel panic。 这种媒体所用的编码与通常的ISO文件系统是不同的。 Moses Moore 贡献者 Marc Fonvieille Enhanced for &os; 5.X by 安装声卡 配置系统 PCI ISA 声卡 在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。 FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 Hardware Notes 中支持的音频设备列表看看是否支持您的声卡。 这份文档也只论及支持您的声卡的驱动程序。 内核 配置 要使用声卡, 就应装载正确的驱动程序。完成的方式有两种: 最简单的是使用命令 &man.kldload.8; 来装载一个内核模块,在命令行输入 &prompt.root; kldload snd_emu10k1 或者在文件 /boot/loader.conf 里加入一行,内容如下 snd_emu10k1_load="YES" 上边实例用于 Creative &soundblaster; Live! 声卡。 其它可装载的模块列在文件/boot/defaults/loader.conf里边。 如果不知道应该使用哪个驱动, 您可以尝试加载 snd_driver module: &prompt.root; kldload snd_driver 这是个 meta 驱动,一次加载了最常见的设备驱动。 这会提高搜索正确驱动的速度。也可以通过 /boot/loader.conf 工具来加载所有的声卡驱动。 + 如果希望在加载了 snd_driver + meta 驱动之后了解到底选择了哪种声卡, 可以通过使用 + cat /dev/sndstat 来查询 /dev/sndstat + 文件。 + 在 &os; 4.X 下,要加载所有的声卡驱动,您必须加载 snd 模块而不是 snd_driver 模块。 另外,您也可以把支持您声卡的代码静态地编译到内核里去。 下一节就采用这种方式支持硬件给出提示。 关于重新编译内核,请参考 定制内核使其支持声卡 要做的第一件事情就是添加通用音频驱动 &man.sound.4; 到内核中,您需要添加下面这行到内核配置文件中: device sound 在 &os; 4.X 下,使用下面这行: device pcm 接下来就是加入对我们所用声卡的支持了。 首先需要确定我们的声卡需要使用哪一个驱动。 您可以参考 硬件兼容列表 所列出的音频设备, 以确定您声卡的驱动。 例如, Creative &soundblaster; Live! 声卡由 &man.snd.emu10k1.4; 驱动来支持。 要添加它, 需要在内核编译配置文件中加入下面一行: device "snd_emu10k1" 一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的写法, 也可以在 /usr/src/sys/conf/NOTES 文件 (对于 &os; 4.X, 则是 /usr/src/sys/i386/conf/LINT)。 非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息 (IRQ、 I/O 端口, 等等)。 这项工作可以通过 /boot/device.hints 文件来完成。 系统启动时, &man.loader.8; 将读取这个文件, 并将其中的配置传给内核。 例如, 旧式的 Creative &soundblaster; 16 ISA 非即插即用卡需要使用 &man.snd.sbc.4; 驱动, 您可以在内核编译配置文件中增加如下配置: device snd_sbc 还有下面这些到 /boot/device.hints中: hint.sbc.0.at="isa" hint.sbc.0.port="0x220" hint.sbc.0.irq="5" hint.sbc.0.drq="1" hint.sbc.0.flags="0x15" 这样,声卡使用 0x220 I/O 端口和 IRQ 5 /boot/device.hints 文件的写法会在声卡驱动的联机手册中描述。 在 &os; 4.X 上,这些设定直接写进内核配置文件中。 对于我们的 ISA 卡这种情况,我们只要使用这行: device sbc0 at isa? port 0x220 irq 5 drq 1 flags 0x15 上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 &man.snd.sbc.4; 联机手册了解更多信息。 在 &os; 4.X 下, 一些主板内建声卡设备的系统需要在内核配置文件中配置下面的选项: options PNPBIOS 测试声卡 用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中 (&man.dmesg.8;),就像这样: pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0 pcm0: [GIANT-LOCKED] pcm0: <Cirrus Logic CS4205 AC97 Codec> 声卡的状态可以通过 /dev/sndstat 文件来查询: &prompt.root; cat /dev/sndstat FreeBSD Audio Driver (newpcm) Installed devices: pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384 kld snd_ich (1p/2r/0v channels duplex default) 您系统的输出可能与此不同。如果没有看到 pcm 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 常见问题列在一节。 如果一切正常,您现在应该拥有一个多功能声卡了。 如果您的 CD-ROM 或者 DVD-ROM 驱动器适当的与声卡相关联, 您可以把 CD 放入驱动器并用 &man.cdcontrol.1; 来播放: &prompt.user; cdcontrol -f /dev/acd0 play 1 许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。一个快速的测试声卡正在发送数据到 /dev/dsp 的方式,像这样做: &prompt.user; cat filename > /dev/dsp 这里 filename 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。 &os; 4.X 用户需要创建声卡设备节点才能使用。 如果在消息缓存中展示出来的卡是 pcm0, 您必须以 root 来运行下面这两行: &prompt.root; cd /dev &prompt.root; sh MAKEDEV snd0 如果检测的声卡返回 pcm1, 做上面展示的同样的步骤,只是要用 snd1 来取代 snd0 MAKEDEV 会创建一组设备节点让相关联应用程序的不同声音使用。 声卡混音级别可以通过 &man.mixer.8; 命令更改。 更多细节可以在 &man.mixer.8; 联机手册中找到。 常见问题 设备节点 I/O 端口 IRQ DSP 错误信息 解决方法 unsupported subdevice XX 一个或多个设备节点没有正确地建立。重复上面的步骤。 sb_dspwr(XX) timed out I/O端口没有设置正确。 bad irq XX IRQ设置不正确。确信设定的IRQ和声卡的IRQ是一样的。 xxx: gus pcm not attached, out of memory 没有足够的内存空间供设置使用。 xxx: can't open /dev/dsp! 使用命令 fstat | grep dsp 进行检查是否有其它的程序打开了设备。 值得注意的是 esoundKDE 提供的声卡支持经常是造成麻烦的祸根。 - + Munish Chopra 贡献者 利用多个声源 同时有多个声源的声音在播放, 这是完全可能的, 例如当 esound 或者 artsd 不支持与其它程序共享音频设备时。 FreeBSD可以通过 虚拟声道(Virtual Sound Channels) 来达到, 具体设置用工具 &man.sysctl.8; 来完成。 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。 使用两条sysctl命令来设置虚拟声道的数目。 如果您是 root 用户, 执行下面的操作: &prompt.root; sysctl hw.snd.pcm0.vchans=4 &prompt.root; sysctl hw.snd.maxautovchans=4 上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。hw.snd.pcm0.vchanspcm0的虚拟声道数,一当链接上一个设备它就可配置了。 hw.snd.maxautovchans是分配给新的音频设备的虚拟声道数, 此时这个设备要用 &man.kldload.8; 来链接。 因为 pcm 模块可以独立装载许多硬件驱动程序, 因此 hw.snd.maxautovchans 也就可以存储分配给以后链接到的设备的虚拟声道数。 + + 您不能在使用某个设备的时候改变其虚拟通道数。 + 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。 + + 如果不使用 &man.devfs.5;, 就必须把应用程序指向 /dev/dsp0.x, 这里x 为0到3, 因为在上面的例子里 hw.snd.pcm.0.vchans 被设为了4。 在使用&man.devfs.5;的系统里,上边那些会自动分配给用户。 + Josef El-Rayes 这一节的作者是 如何设置混音器通道值 不同的混音通道的默认音量是硬编码进 &man.pcm.4; 驱动程序的。 同时,也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如: hint.pcm.0.vol="100" 当 &man.pcm.4; 加载时,这一设置将改变音量通道原本是100的默认值。 - 只有 &os; 5.3 和更高版本才支持这一功能。 + + 只有 &os; 5.3-RELEASE 和更高版本才支持这一功能。 + Chern Lee 贡献者 MP3音频 MP3 (MPEG Layer 3 Audio)达到过CD音质的效果,FreeBSD工作站没理由会缺少这样的好东东。 MP3播放器 目前为止, 最为流行的 X11 MP3 播放器是 XMMS (X 多媒体系统)。 Winamp 的肤面可以直接用于 XMMS, 因为它的 GUI 几乎和 Nullsoft 的 Winamp 完全一样。 另外, XMMS 也提供了内建的插件支持。 XMMS 可以通过 multimedia/xmms port 或 package 来安装。 XMMS 的界面很直观, 它提供了播放列表、 图形化均衡器等等。 如果您熟悉 Winamp, 就会感觉 XMMS 很容易使用。 audio/mpg123 port 提供了一个命令行界面的 MP3 播放器。 mpg123 可以在执行时通过命令行指定声音设备和要播放的 MP3 文件, 如下所示: &prompt.root; mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3 High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3. Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp. Uses code from various people. See 'README' for more! THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! Playing MPEG stream from Foobar-GreatestHits.mp3 ... MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo /dev/dsp1.0 应该换成您的系统上的 dsp 设备。 抓取CD音轨 在对CD或CD音轨编码成MP3之前, CD上的音频数据应先抓到硬盘里。 这个可以通过复制原始的CDDA(CD数字音频)数据成为波形(WAV)文件。 工具 cdda2wavsysutils/cdrtools 套件的一部份,可用来从CD中获取音频及其相关信息。 把CD放到光驱里,下面的命令可以完成 (作为 root用户) 把整张 CD 分割成单个 (每个音轨) 的WAV文件:/para> &prompt.root; cdda2wav -D 0,1,0 -B cdda2wav 支持 ATAPI (IDE)光驱。 从IDE光驱中抓取音轨, 需要用设备名称代替SCSI的单元号。 例如, 想从 IDE 光驱中抓取第7道音轨: &prompt.root; cdda2wav -D /dev/acd0a -t 7 参数 表示 SCSI 设备 0,1,0, 与命令 cdrecord -scanbus的输出相对应。 抓取单轨,要使用选项,如下所示: &prompt.root; cdda2wav -D 0,1,0 -t 7 这个实例用于抓取第七个音轨。要抓取一定范围的音轨,如从1到7: &prompt.root; cdda2wav -D 0,1,0 -t 1+7 利用&man.dd.1;也可以从ATAPI光驱中抓取音轨,从 可以了解更多。 MP3 编码 现今,可选的MP3编码器是lameLame可以从ports树里的 audio/lame 处找到。 利用抓取的WAV文件,下边的命令就可以把 audio01.wav 转换成audio01.mp3 &prompt.root; lame -h -b 128 \ --tt "Foo Song Title" \ --ta "FooBar Artist" \ --tl "FooBar Album" \ --ty "2001" \ --tc "Ripped and encoded by Foo" \ --tg "Genre" \ audio01.wav audio01.mp3 128 kbits 是标准的MP3位率(bitrate)。 许多人可能喜欢更高的品质例如 160 或 192。 更高的位率, 会使 MP3 占用更多的磁盘空间--但音质会更高。选项 控制 高品质但低速度 (higher quality but a little slower) 模式的开关。 选项 表示把 ID3 标签--通常包含了歌曲的信息, 植入到MP3文件里。 其它的编码选项可以查询 lame 的联机手册。 MP3 解码 要把MP3歌曲刻录成音乐CD,就需要把它转换成非压缩的波形(WAV)格式。 XMMSmpg123 都支持把MP3输出成非压缩格式文件。 XMMS中输出到磁盘: 启动 XMMS. 在窗口里右击鼠标,弹出XMMS菜单。 选项(Options)里选择设定(Preference) 改变输出插件成写磁盘插件(Disk Writer Plugin) 配置(Configure) 输入或选择一个目录用于存放解压的文件。 象平常一样,把MP3文件装入到XMMS里边, 把音量调节到100%并且关掉EQ设定。 按一下播放(Play)XMMS 如同在播放mp3一样,只是听不到声音。 实际上是在播放mp3到一个文件里。 要想再听MP3歌曲,记得把默认的输出插件设回原来的值。 mpg123进行标准输出: 执行 mpg123 -s audio01.mp3 > audio01.pcm XMMS输出的文件是波形(WAV)格式, 而mpg123 则把MP3转换成无压缩的PCM 音频数据。两种格式都支持用 cdrecord 刻录成音乐CD。 使用 &man.burncd.8; 您就必须使用无压缩的PCM。 如果选择波形格式, 就要注意在每道开始时的一小点杂音, 这段声音是波形文件的头部份。 可以使用工具 SoX 来轻松去除。 SoX 可从 audio/sox port 或包(package)中安装得到: &prompt.user; sox -t wav -r 44100 -s -w -c 2 track.wav track.raw 阅读 这部份可以了解到更多在 FreeBSD 里刻盘的信息。 Ross Lippert 贡献者 视频回放 视频回放是个很新并且迅速发展中的应用领域。 一定要有耐心,因为不是所有的事情都象处音频那么顺利。 在开始之前,您要了解显卡的类型以及它所用的芯片的类型。 尽管 &xorg;&xfree86; 支持大量的显卡, 但能达到好的回放效果的却寥寥无几。 在X11运行时,您可以使用命令 &man.xdpyinfo.1; 获得使用您的显卡的X服务器所支持的扩展列表。 为了评估各种播放器和设置,您需要有一小段用作测试的MPEG文件。 由于一些DVD播放器会默认地在 /dev/dvd 里去找DVD文件, 因此, 您会发样建立符号链接到恰当的设备会很有用: &prompt.root; ln -sf /dev/acd0c /dev/dvd &prompt.root; ln -sf /dev/racd0c /dev/rdvd 在使用了 FreeBSD 5.X 的 &man.devfs.5; 里, 有一个略微不同的推荐链接集: &prompt.root; ln -sf /dev/acd0 /dev/dvd &prompt.root; ln -sf /dev/acd0 /dev/rdvd 注意:由于&man.devfs.5;本身的原因, 像这样手工建立的链接在重启后将不会存在。 想要无论什么时候您启动系统都能自动建立符号链接, 那就把下边这行加到 /etc/devfs.conf 里边: link acd0 dvd link acd0 rdvd 另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。 内核选项 CPU_ENABLE_SSE 内核选项 USER_LDT 前面讨论的一些 ports 要正确地联编有赖于下列内核的选项设置。 在试图联编之前, 把这些选项增加到内核配置文件中去, 建立新的内核, 重启系统: option CPU_ENABLE_SSE option USER_LDT option USER_LDT 在&os; 5.X里并不存在。 为了增强用于共享内存的X11接口,推荐增加一些 &man.sysctl.8; 参数的值: kern.ipc.shmmax=67108864 kern.ipc.shmall=32768 测定视频的性能 XVideo SDL DGA 在X11下有几种可以显示图像的方式。 到底哪个能工作很大程序上依赖于硬件。 首先, 下边描述的每一种方法在不同的硬件上都会有不同的品质。 其次, 在X11里的图像显示近来引起普遍的关注, 随着 &xorg;&xfree86; 的每一个版本, 都会有很大的突破。 常见图像接口列表: X11: 一般性的使用共享内存的X11输出。 XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。 SDL: 简单直接媒体层。 DGA: 直接图片存取。 SVGAlib: 低层次掌控图片层。 XVideo &xorg;&xfree86; 4.X 有种扩展叫做XVideo (或称Xvideo, Xv, xv), 它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。 即使在低端的计算机 (例如我的PIII 400 Mhz膝上电脑), 这个扩展也提供了很好的播放质量。 要了解这一扩展是否在正常工作, 使用 xvinfo 命令: &prompt.user; xvinfo 如果显示结果如下,那您的显卡就支持XVideo: X-Video Extension version 2.2 screen #0 Adaptor #0: "Savage Streams Engine" number of ports: 1 port base: 43 operations supported: PutImage supported visuals: depth 16, visualID 0x22 depth 16, visualID 0x23 number of attributes: 5 "XV_COLORKEY" (range 0 to 16777215) client settable attribute client gettable attribute (current value is 2110) "XV_BRIGHTNESS" (range -128 to 127) client settable attribute client gettable attribute (current value is 0) "XV_CONTRAST" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_SATURATION" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_HUE" (range -180 to 180) client settable attribute client gettable attribute (current value is 0) maximum XvImage size: 1024 x 1024 Number of image formats: 7 id: 0x32595559 (YUY2) guid: 59555932-0000-0010-8000-00aa00389b71 bits per pixel: 16 number of planes: 1 type: YUV (packed) id: 0x32315659 (YV12) guid: 59563132-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x30323449 (I420) guid: 49343230-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x36315652 (RV16) guid: 52563135-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x3e0, 0x7c00 id: 0x35315652 (RV15) guid: 52563136-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x7e0, 0xf800 id: 0x31313259 (Y211) guid: 59323131-0000-0010-8000-00aa00389b71 bits per pixel: 6 number of planes: 3 type: YUV (packed) id: 0x0 guid: 00000000-0000-0000-0000-000000000000 bits per pixel: 0 number of planes: 0 type: RGB (packed) depth: 1 red, green, blue masks: 0x0, 0x0, 0x0 同时注意:列出来的格式(YUV2, YUV12, 等等) 并不总是随着 XVdieo的每一次执行而存在。没有它们可能或迷惑有些人。 如果结果看起来是这样: X-Video Extension version 2.2 screen #0 no adaptors present 那么您的显卡可以就不支持XVideo功能。 如果您的卡不支持XVideo, 则只是说明您的显示器在满足刷新图像的计算要求上存在更大的困难。 尽管显卡和处理器很重要,您仍然会有个不错的显示效果。 此外, 您也可以参考我们提供的文献, 在 中有所介绍。 简单直接媒体层 简单直接媒体层(SDL),原意是做为 µsoft.windows;、BeOS 以及 &unix; 之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL 层可以在低层访问硬件, 有时这样做就比 X11 接口层更为高效。 关于 SDL, 可以参考 devel/sdl12 直接图形存取 直接图形存取 (Direct Graphics Access) 是一种 X11 扩展, 通过它, 应用程序能够绕过 X 服务, 并直接修改画面缓存 (framebuffer)。 由于它依赖一种底层的内存映射来实现其功能, 因此使用它的程序必须以 root 身份来执行。 DGA 扩展可以通过 &man.dga.1; 来完成测试和性能测量。 运行 dga 时, 它将随按键改变现实的颜色。 按 q 退出这个程序。 Ports 和 包(Packages) 对视频的解决 视频 ports 视频 包 这部份主要讨论在 FreeBSD Ports 集中提供的可用于视频回放的软件。 视频回放在软件发展中是个很活跃的领域, 并且各种不同程序的功能可能与这里的描述不尽相同。 首先要弄清楚的重要一点是在 FreeBSD 上使用的视频程序其发展与在 Linux 里使用的是一样的。 大部份程序都还处在β阶段。使用 FreeBSD 的包可能面对的问题: 一个应用程序不能播放其它程序制作的文件。 一个应用程序不能播放其自已制作的文件。 不同机上的同样的程序,各自重新建立(rebuild)了一次, 播放同一个文件结果也会有不同。 一个看起来没什么的过滤器, 如图像尺寸的调整, 也有可能因为一个调整例程的问题变得很不象样。 应用程序频繁地留下垃圾(dumps core)。 没有随 port 一起安装的文档可以在网上或者 port 的 work 目录中找到。 这些程序中许多也体现了 Linux主义。即, 有些问题来自于(程序)使用的标准库存在于Linux的发行版中, 或者有些是 Linux 内核的功能, 而该程序的作者事先所假定了的是 Linux内核。这些问题并不总是被 port 编护人员注意到或处理过, 这也就可能导致如下问题: 使用/proc/cpuinfo去检测处理器的特性。 滥用线程可能导致一个程序悬挂完成,而不是完全中止。 软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。 现在,这些程序的开发人员也已同 port 的维护人员进行了联合, 以减少制作port时出错。 MPlayer MPlayer 是近来开发的同时也正迅速发展着的一个视频播放器。 MPlayer 团队的目标是在 Linux 和其它 UNIX 系统中的速度和机动性能。 在团队的创始人实在受不了当时可用的播放器的性能时, 这个计划就开始了。 有人也许会说图形接口已经成为新型设计的牺牲品。 但是一但您习惯了命令行选项和按键控制方式,它就能表现得很好。 创建MPlayer MPlayer making MPlayer 可以从 multimedia/mplayer 找到。 MPlayer 在联编过程中会进行许多硬件检测, 而得到的可执行文件因此将无法移植到其他系统中使用。 因此, 从 ports 完成联编而不是安装预编译的包就很重要。 另外, 在 make 命令行还可以指定许多选项, 在 Makefile 中有所描述, 接下来我们开始联编: &prompt.root; cd /usr/ports/multimedia/mplayer &prompt.root; make N - O - T - E Take a careful look into the Makefile in order to learn how to tune mplayer towards you personal preferences! For example, make WITH_GTK1 builds MPlayer with GTK1-GUI support. If you want to use the GUI, you can either install /usr/ports/multimedia/mplayer-skins or download official skin collections from http://www.mplayerhq.hu/homepage/dload.html 默认的 port 选项对于绝大多数用户来来说是够用了。 不过, 如果您需要 XviD 编解码器, 则必须指定 WITH_XVID 这个命令行选项。 默认的 DVD 设备也可以用 WITH_DVD_DEVICE 选项来定义, 其默认值是 /dev/acd0 撰写这一章的时候, MPlayer port 的联编过程包括了 HTML 文档和两个可执行文件, mplayermencoder, 后者是一个视频再编码工具。 MPlayer 的 HTML 文档提供了丰富的内容。 如果读者发现本章中缺少关于视频硬件的一些信息, 则 MPlayer 的文档将是十分详尽的补充。 如果您正在找关于 &unix; 中的视频支持的资料, 您绝对应该花一些时间来阅读 MPlayer 的文档。 使用MPlayer MPlayer 使用 任何 MPlayer 用户必须在主目录下建立一个叫 .mplayer 的子目录。 输入下边的内容来建立这个必须的子目录: &prompt.user; cd /usr/ports/multimedia/mplayer &prompt.user; make install-user mplayer的手册里列出了它的命令选项。 HTML文档里有更为详细的信息。 这部份里, 我们只是描述了很少的常见应用。 要播放一个文件,如 testfile.avi, 可以通过各种视频接口当中的某一个去设置 选项: &prompt.user; mplayer -vo xv testfile.avi &prompt.user; mplayer -vo sdl testfile.avi &prompt.user; mplayer -vo x11 testfile.avi &prompt.root; mplayer -vo dga testfile.avi &prompt.root; mplayer -vo 'sdl:dga' testfile.avi 所有这些选项都是值得一试的, 因为它们的性能依赖很多因素,并且都与硬件密切相关。 要播放 DVD, 需要把 testfile.avi 改为 。 这里 N 是要播放的节目编号, 而 DEVICE 则是 DVD-ROM 的设备节点。 例如, 要播放 /dev/dvd 的第三个节目: &prompt.root; mplayer -vo xv dvd://3 -dvd-device /dev/dvd 可以在编译 MPlayer 时, 通过 WITH_DVD_DEVICE 来指定默认的 DVD 设备。 系统内定的默认设备是 /dev/acd0。 更多细节, 请参考 port 的 Makefile 要停止、暂停、前进等等,可以参考设定的按键---这些可以通过 mplayer -h 得到或查看手册。 另外,回放的重要选项是:用于全屏模式的 和起辅助完成作用的 为了让 mplayer 的命令行不是太长,使用者可以通过建立一个文件 .mplayer/config 来设定如下默认选项: vo=xv fs=yes zoom=yes 最后,mplayer可以把DVD题目(title)抓取成为 .vob文件。为了从DVD中导出第二个题目,请输入: &prompt.root; mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd 输出文件 out.vob 将是 MPEG 并且可以被这部份描述的其它利用。 mencoder mencoder 在使用 mencoder 之前, 首先熟悉其 HTML 文档中所介绍的选项是一个不错的主意。 它提供了联机手册, 但如果没有 HTML 文档则帮助不大。 有无数种方法来提高视频品质、 降低比特率、 修改格式, 而这些技巧可能会影响性能。 下面是几个例子, 第一个是简单地复制: &prompt.user; mencoder input.avi -oac copy -ovc copy -o output.avi 不正确的命令选项组合可能使生成的文件不能被mplayer播放。因此,如果您只是想抓取文件,一定在mplayer里使用 转换input.avi成为带有MPEG3音频编码 (要求audio/lame )的MPEG4编码: &prompt.user; mencoder input.avi -oac mp3lame -lameopts br=192 \ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi 这样就产生了可被mplayerxine播放的输出。 input.avi 可以换成 并以 root 的身份来执行, 以重新对 DVD 节目进行编码。 由于您第一次做这样的工作时很可能会对结果不太满意, 建议您首先把节目复制成文件, 然后对它进行操作。 xine视频播放器 xine视频播放器是一个关注范围很广的项目,它不仅看准多合一的视频解决,而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。发行有和port版本-- multimedia/xine xine播放器仍然很粗糙,但这很显然与好开头无关。实际上xine 即需要一个快速的带有快速显卡的CPU,也支持XVideo的扩展。图形界面(GUI)可以使用,但很勉强。 到写这章时,还没有可用于播放CSS编码的DVD文件的输入模块随同 xine一起发行。 第三方的建造(builds)里内建有这样的模块, 但都不属于FreeBSD Ports 集。 MPlayer相比,xine 为用户考虑得更多,但同时,对用户来说也少了很多有条理的控制方式。xine 播放器在XVideo接口上做得不错。 默认情况下,播放器xine启动的时后会使用图形界面。那么就可以使用菜单打开指定的文件: &prompt.user; xine 另外,没有图形界面也可以使用如下命令立即打开播放文件: &prompt.user; xine -g -p mymovie.avi 使用transcode 软件transcode不是一个播放器,而是一套再编码.avi.mpg 文件的工具。使用transcode,借助标准输入输出(stdin/stdout)流接口,利用命令行工具,可以合并视频文件、修复坏文件。 MPlayer一样, transcode是个实验性软件,必须通过portmultimedia/transcode来建立。make使用了大量的选项。我们推荐: &prompt.root; make WITH_LIBMPEG2=yes 如果您打算安装multimedia/avifile,那么就把选项WITH_AVIFILE加到您的make命令行里,如下所示: &prompt.root; make WITH_AVIFILE=yes WITH_LIBMPEG2=yes 这里有两个使用transcode进行可调整视频输出的转换实例。第一个把输出编码成openDIVX AVI文件,第二个是编码成更为小巧的MPEG格式。 &prompt.user; transcode -i input.vob -x vob -V -Z 320x240 \ -y opendivx -N 0x55 -o output.avi &prompt.user; transcode -i input.vob -x vob -V -Z 320x240 \ -y mpeg -N 0x55 -o output.tmp &prompt.user; tcmplex -o output.mpg -i output.tmp.m1v -p output.tmp.mpa -m 1 有个关于transcode的参考页,仅有很少的关于各种tc*(如 tcmplex)应用的文档,这也是安装了的。命令行选项 有时也可以给出简单的使用格式的说明。 相比之下,transcodemencoder运行起来要慢许多,但它可以制作出更多可播放的文件。例如,用transcode创建的MPEG文件众所周知可以在&windows.media; Player 和 Apple's &quicktime;里播放。 进一步了解 FreeBSD里不同的视频软件包正迅速发展中。很可能在不久的将来,这里所谈到的问题都将得到解决。同时,有些人想超越FreeBSD的声/像(A/V)能力,那他们就不得不从一些FAQ和指南里学知识,并使用一些不同的应用程序。这里就给这些读者指出一些补充信息。 MPlayer 文档是很技术性的。这些文档可以给那些希望获得关于&unix;视频高级技术的人们提供参考。MPlayer邮件列表很不喜欢没耐心阅读文档的人,如果您发现什么问题想报告给他们,请首先RTFM。 xine HOWTO里边有一章是关于提高性能的,对所有的播放器都很适应。 最后是一些很有前途的程序,读者可以试一下: Avifile,它就是 multimedia/avifile port。 Ogle 它就是 multimedia/ogle port。 Xtheater multimedia/dvdauthor,一个制作 DVD 节目的源码开放包。 Josef El-Rayes 原创: Marc Fonvieille 改编: 安装电视卡 电视卡 介绍 电视卡可以让您在您的计算机里观看到无线或有线电视。许多卡是通过RCA或S-video输入接收复合视频,而且有些卡还带有调频广播接收器。 &os; 通过&man.bktr.4;驱动程序,提供了对基于PCI的电视卡的支持,要求这些卡使用的是Brooktree Bt848/849/878/879 或 Conexant CN-878/Fusion 878a视频采集芯片。您还要确保这个板上带的有被支持的调谐器,参考&man.bktr.4;手册查看所支持的调谐器列表。 增加驱动程序 要使用您的卡,您就要装载&man.bktr.4;驱动程序。这个可以通过往/boot/loader.conf里边添加下边一行来实现。象这样: bktr_load="YES" 另外,您也可以静态地这个支持编译到内核里去,要是这样的话,就把下边几行加到内核配置里去: device bktr device iicbus device iicbb device smbus 这些附加的设备驱动程序是必须的,因为卡的各组成部分是能过一根I2C总线相互连接在一起的。然后建立安装新的内核。 一旦这个支持被加到了您的系统里,您须要重启系统。在启动过程中,您的电视卡应该显示为up(启动),象这样: bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0 iicbb0: <I2C bit-banging driver> on bti2c0 iicbus0: <Philips I2C bus> on iicbb0 master-only iicbus1: <Philips I2C bus> on iicbb0 master-only smbus0: <System Management Bus> on bti2c0 bktr0: Pinnacle/Miro TV, Philips SECAM tuner. 当然,这些信息可能因您的硬件不同而有所区别。但是您应该能检查那个调制器是否被正确检测到了,可能要忽略一些检测到的同&man.sysctl.8; MIB(管理系统库)和内核配置文件选项一起的参数。例如,如果您想强制使用Philips(飞利浦) SECAM制式的调谐器 ,您就应把下列行加到内核配置文件里: options OVERRIDE_TUNER=6 或者,您直接使用&man.sysctl.8;: &prompt.root; sysctl hw.bt848.tuner=6 查看&man.bktr.4;手册和/usr/src/sys/conf/NOTES文件了解更多详细关于可用选项的资料。(如果您在&os; 4.X下,就使用/usr/src/sys/i386/conf/LINT代替 /usr/src/sys/conf/NOTES。) 有用的应用程序 要使用您的电视卡,您需要安装下列应用程序之一: multimedia/fxtv提供窗口电视(TV-in-a-window)功能和图像/声音/图像采集功能。 multimedia/xawtv也是一款电视应用程序,功能同fxtv一样。 misc/alevt解码和显示Videotext/Teletext。 audio/xmradio,一款用于一些电视卡的调频电台调谐器的程序。 audio/wmtune,一款用于电台调谐器的便捷的桌面程序。 更多的程序在&os; Ports Collection(Ports 集)里。 问题解决 如果您的电视卡遇到了什么问题,您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被&man.bktr.4;驱动程序支持,并且是不是使用了正确的配置选项。想得到更多支持和关于您的电视卡的各种问题,您可以接触和使用&a.multimedia.name; 邮件列表的压缩包。 Marc Fonvieille 撰写人 图象扫描仪 图象扫描仪 介绍 像任何其他的现代操作系统一样,&os; 可以使用图像扫描仪。 对扫描仪的标准的访问是通过 &os; Ports Collection 中的 SANE (Scanner Access Now Easy) API 提供的。 SANE 也会使用一些 &os; 设备驱动来访问扫描仪硬件。 &os; 支持 SCSI 和 USB 扫描仪。 在做任何配置之前请确保您的扫描仪被 SANE 支持。SANE 有一个 支持的设备列表,可以为您提供有关扫描仪的支持情况和状态的信息。 &man.uscanner.4; 手册页也提供了一个支持的 USB 扫描仪列表。 内核配置 上面提到 SCSI 和 USB 接口都是支持的。 取决于您的扫描仪接口, 需要不同的设备驱动程序。 USB 接口 默认的 GENERIC 内核包含了支持 USB 扫描仪需要的设备驱动。 如果您决定使用一个定制的内核, 确保下面在您的内核配置文件中存在下面这些行: device usb device uhci device ohci device uscanner 取决于您主板上的 USB 芯片, 您只需要 device uhci 或者 device ohci 中的一种,但是两个都在 内核配置文件中是没有害处的。 如果您不想重新编译内核而且您的内核也不是 GENERIC 的, 您可以用 &man.kldload.8; 命令直接加载 &man.uscanner.4; 设备驱动模块: &prompt.root; kldload uscanner 要在每次系统启动的时候加载这个模块, 添加下面这行到 /boot/loader.conf 中: uscanner_load="YES" 在用正确的内核重新启动后, 或者在加载了需要的模块之后,插上您的 USB 扫描仪。 扫描仪会出现在您的系统消息缓存 (&man.dmesg.8;)中,就像这样: uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2 这表明我们的扫描仪正在使用 /dev/uscanner0 设备节点。 在 &os; 4.X 上,USB 进程(&man.usbd.8;) 必须运行来检测 USB 设备。要启用它, 添加 usbd_enable="YES" 到您的 /etc/rc.conf 文件中并重新启动。 SCSI 接口 如果您的扫描仪是 SCSI 接口的, 重要的是要知道您使用哪种 SCSI 控制器。 取决于所使用的 SCSI 芯片, 您需要调整内核配置文件。 GENERIC 的内核支持最常用的 SCSI 控制器。确保阅读 NOTES 文件(在 &os; 4.x 下面是 LINT)并在您的内核配置文件中添加正确的行。 除了 SCSI 适配器驱动之外, 您还需要在内核配置文件中有如下行: device scbus device pass 一旦完全编译好您的内核, 您就可以在启动时的系统消息缓冲中看到这些设备: pass2 at aic0 bus 0 target 2 lun 0 pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device pass2: 3.300MB/s transfers 如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 &man.camcontrol.8; 命令执行一次 SCSI 总线扫描: &prompt.root; camcontrol rescan all Re-scan of bus 0 was successful Re-scan of bus 1 was successful Re-scan of bus 2 was successful Re-scan of bus 3 was successful 然后扫描仪就会出现在 SCSI 设备列表里: &prompt.root; camcontrol devlist <IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0) <IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1) <AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3) <PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0) 有关 SCSI 设备的更多细节,可以查看 &man.scsi.4; 和 &man.camcontrol.8; 手册页。 SANE 配置 SANE 系统分为两部分: 后端(graphics/sane-backends) 和前端(graphics/sane-frontends)。 后端部分提供到扫描仪自身的访问。 SANE 支持设备列表详细说明了哪一个后端可以支持您的图象扫描仪。 如果您想使用您的设备,就必须为您的扫描仪选定正确的后端。 前端部分提供图形化的扫描界面 (xscanimage)。 要做的第一件事就是安装 graphics/sane-backends port 或者 package。然后,使用 sane-find-scanner 命令来检查 SANE 系统做的扫描仪检测: &prompt.root; sane-find-scanner -q found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3 输出显示了扫描仪的接口类型和扫描仪连接到系统上的设备节点。 生产厂家和产品型号可能没有显示,不过不重要。 一些 USB 扫描仪需要您加载固件,后端的手册页中有这方面的解释。 您也应该阅读 &man.sane-find-scanner.1; 和 &man.sane.7; 手册页。 现在我们需要检查扫描仪是否可以被扫描前端识别。 默认情况下, SANE 后端自带一个叫做 &man.scanimage.1; 的命令行工具。 这个命令允许您列出设备以及从命令行执行图片扫描。 选项用来列出扫描仪设备: &prompt.root; scanimage -L device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner 如果没有输出任何信息, 或提示没有识别到扫描仪, 则说明 &man.scanimage.1; 无法识别它。 如果发生这种情况, 您就需要修改扫描仪支持后端的配置文件, 并定义所使用的扫描设备。 /usr/local/etc/sane.d/ 目录中包含了所有的后端配置文件。 这类识别问题经常会在某些 USB 扫描仪上发生。 例如, 对于在 中所使用的 USB 扫描仪, sane-find-scanner 会给出下面的信息: &prompt.root; sane-find-scanner -q found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0 扫描仪被正确的探测到了,它使用 USB 接口,连接在 /dev/uscanner0 设备节点上。 我们现在可以检查看看扫描仪是否被正确的识别: &prompt.root; scanimage -L No scanners were identified. If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate). Please read the documentation which came with this software (README, FAQ, manpages). 既然扫描仪没有被识别,我们就需要编辑 /usr/local/etc/sane.d/epson.conf 文件。所用的扫描仪型号是 &epson.perfection; 1650, 这样我们知道扫描仪应使用 epson 后端。确保阅读后端配置文件中的帮助注释。 改动非常简单:注释掉导致您的扫描仪使用错误接口的所有行 (在我们这种情况下,我们将注释掉从 scsi 开始的所有行,因为我们的扫描仪使用 USB 接口),然后在文件的结尾添加指定的接口和所用的设备节点。 这种情况下,我们添加下面这行: usb /dev/uscanner0 请确保阅读后端配置文件提供的注释以及后端手册页了解更多细节, 并使用正确的语法。我们现在可以检验扫描仪是否被识别到了: &prompt.root; scanimage -L device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner 我们的 USB 扫描仪被识别到了。如果商标和型号不匹配也不重要。 相关的关键一条是 `epson:/dev/uscanner0' 字段, 这个给了我们正确地后端名称和正确的设备节点。 一旦 scanimage -L 命令可以看到扫描仪, 配置就完成了。设备现在准备好等待扫描了。 &man.scanimage.1; 允许我们从命令行执行图片扫描, 相比之下使用图形用户界面来执行图片扫描会更好。 SANE 提供了一个简单但实用的图形界面: xscanimage (graphics/sane-frontends)。 Xsane (graphics/xsane)是另一个流行的图形扫描前端。 这个前端提供了一些高级特性, 比如多样的扫描模式(photocopy,fax,等。), 色彩校正,批量扫描,等等。这两个程序都可以作为 GIMP 的插件使用。 授予其他用户扫描权限 前面所有的操作都是用 root 权限来完成的。You may however, need 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/uscanner0,这个节点属于 operator 组。将用户 joe 添加到 operator 组会允许他使用扫描仪: &prompt.root; pw groupmod operator -m joe 要了解更多细节, 请阅读 &man.pw.8; 联机手册。 此外, 还需要为 /dev/uscanner0 设备节点设置正确的写入权限 (0660 或 0664), 因为默认情况下, operator 组只能读这个设备节点。 这项工作可以通过在 /etc/devfs.rules 文件中添加如下设置来自东完成: [system=5] add path uscanner0 mode 660 随后您还需要在 /etc/rc.conf 中添加下面的内容并重新启动: devfs_system_ruleset="system" 关于这些配置的进一步细节请参考联机手册 &man.devfs.8;。 对于 &os; 4.X, 默认情况下 operator 组已经拥有对 /dev/uscanner0 的读和写权限。 当然, 考虑安全的原因, 在您将用户添加到任何组, 尤其是 operator 组时, 都应三思而后行。 diff --git a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml index 5c63c4c2eb..f8939a1982 100644 --- a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml @@ -1,4688 +1,4694 @@ Murray Stokely Reorganized by 网络服务器 概要 本章将覆盖某些在 &unix; 系统上常用的网络服务。话题将会涉及 如何安装、配置、测试和维护多种不同类型的网络服务。本章节中将提 供大量配置文件的样例,期望能够对您有所裨益。 在读完本章之后,您将会知道: 如何管理 inetd 如何设置运行一个网络文件系统。 如何配置一个网络信息服务器以共享用户帐号。 如何通过DHCP自动配置网络。 如何配置一个域名服务器。 如何设置Apache HTTP 服务器。 如何设置文件传输(FTP)服务器。 如何使用Samba为 &windows; 客户端设置文件和打印服务。 如何同步时间和日期,以及如何设置使用NTP协议的时间服务器。 在阅读此章节之前,您应当: 理解有关/etc/rc中脚本的基本知识。 熟悉基本网络术语。 懂得如何安装额外的第三方软件()。 Chern Lee Contributed by <application>inetd</application> <quote>超级服务器</quote> 总览 &man.inetd.8; 被叫做 超级 Internet 服务器, 因为它能够管理许多不同的服务程序的连接。 当 inetd 接到连入的连接时, 它就会判断连接所需要启动的服务程序, 并运行它们, 然后将连接转交给这些服务程序 (在启动程序时, 这些程序的标准输入、输出和错误输出描述符被替换为连入的连接)。 与一个一个地运行单独的服务程序相比, 只启动一个 inetd 能够削减平均的系统负荷。 一般说来, inetd 会被用来启动其他服务程序。 但一些非常简单的协议, 例如 chargenauth, 以及 daytime, 则会由它自行处理。 这一节将介绍如何通过命令行选项, 以及配置文件 /etc/inetd.conf 来配置 inetd 的一些基本知识。 设置 inetd 通过 /etc/rc.conf 系统进行初始化。inetd_enable 选项默认被设定为 NO,不过可以通过sysinstall打开, 如果选用中等安全的模板。在/etc/rc.conf中设定: inetd_enable="YES"inetd_enable="NO" 可以激活或者禁止inetd在启动时加载。 此外,可以通过inetd_flags把不同的 命令行参数传给inetd 命令行选项 inetd 语法: -d 打开调试选项。 -l 记录成功的连接 -w 为外部服务打开TCP Wrapping(默认)。 -W inetd的内置服务打开TCP Wrapping (默认)。 -c maximum 指定单个服务的最大并发访问数量,默认为不限。 也可以在此服务的具体配置里面通过改掉。 -C rate 指定单个服务一分钟内能被单个IP地址调用的最大次数, 默认不限。也可以在此服务的具体配置里面通过 改掉。 -R rate 指定单个服务一分钟内能被调用的最大次数,默认为256。 设为0 则允许不限次数调用。 -a 指定绑定的IP地址。此外,可以使用主机名,这样系统就 可以根据主机名对应的IPV4或者IPV6来选择绑定地址。通常当 inetd 在 &man.jail.8; 中运行 的时候指定主机名,这种情况下主机名来自 &man.jail.8; 环 境变量 当使用主机名方式时,如果IPV4和IPV6都会被绑定到服务, 那么,需要在/etc/inetd.conf.中为该服务 的每个对应协议添加一条记录。比如,一个TCP服务需要两条记录, 一条使用tcp4,另一条使用tcp6 -p 指定用来存放进程ID的文件。 以上选项在/etc/rc.conf中将可以 被inetd_flags开关传递给inetd。 默认情况下,inetd_flags 被置为 -wW,也既是对inetd的内置或外部服务打开TCP wrapping. 对于新手,通常不用去动这些参数,就算它们出现在/etc/rc.conf里头。 inetd而言,所谓外部服务是当 连接请求到来时,被调用并接受连接,启动于inetd之外的守护进程。 反之,内置服务则是那些inetd自己可 以完全处理的了。 <filename>inetd.conf</filename> inetd的配置通过 /etc/inetd.conf文件进行控制。 /etc/inetd.conf内容发生改变,可以 对inetd进程发送一个HangUP信号,以强制 inetd重新读取配置文件,如下所示: 对 <application>inetd</application>发送HangUP信号 &prompt.root; kill -HUP `cat /var/run/inetd.pid` 配置文件中的每一行都是一个独立服务。如果要注释掉该服务,可以在行首加上 #/etc/inetd.conf的格式如下: service-name socket-type protocol {wait|nowait}[/max-child[/max-connections-per-ip-per-minute]] user[:group][/login-class] server-program server-program-arguments ftpd使用IPv4的例子: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l service-name 指明各个服务的服务名。其服务名必须与/etc/services中列出的一致。 这将决定inetd会监听哪个port。 一旦有新的服务需要添加,必须先在/etc/services里面添加。 socket-type 可以是streamdgramraw或者 seqpacketstream 用在基于连接的,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]] 指明从inetd 里头调用的服务是否可以自己处理socket. socket类型必须使用, 而stream socket daemons, 由于通常使用多线程方式,应当使用 . 通常usually 把多个socket丢给单个服务进程, 而 则 会为每个新的socket生成一个子进程。 使用选项可以设定针对服务, inetd可以派生出来的最大子进程数量。 如果某特定服务需要限定最高10个实例,把/10 放到后头就可以了。 之外,还有一个开关可以限制 来自同一个地方,针对某个服务的最大连接数。这个开关就是: 。 比如,设定该值为10就可以限定单个IP地址去向某服务的连接最大 为每分钟十个。这个对于防止有意或者无意的资源耗尽或者拒绝服 务(DoS)颇有用处。 在这部分,必须选择 则为可有可无。 一个stream-type多线程的服务,如果没有 或者 需要, 一般使用: nowait 同样的服务,如果需要限制最大连接数,则如下: nowait/10 此外,如果要限制每分钟单个IP来访连接为20个,同时最多 派生10个进程,可以如下: nowait/10/20 以上开关都默认被使用在fingerd服务上面, 如下所示: finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s user 该开关指定服务将以什么用户身份运行。一般而言,服务运行身份是 root。基于安全目的,可以看到有些服务以 daemon身份,或者是最小特权的 nobody身份运行。 server-program 当连接到来时,执行服务程序的全路径。如果服务是由 inetd内置提供的,以代替。 server-program-arguments 调用到时,该开关 的值通过argv[0]通过传递给服务而工作。 如果命令行为:mydaemon -d,则 mydaemon -d 开关的值。同样的,如果服务是由inetd 内置提供的,这里还是 Security 随安装时候选择的安全模式不同,部分inetd的服务 会被设为默认打开。如果没有确实的需要,禁止它们!只要在/etc/inetd.conf里头 需要禁止的服务前头加上#,然后 对inetd发送hangup信号。某些服务,比如fingerd, 由于对攻击者提供太多信息,可能对任何人都应该禁止。 某些服务在安全上没有考虑,并且有一些连接超时检测设得很长或没有检测机制。 这回允许攻击者慢慢地发送连接,这样可以导致可用资源的消耗。在某些服务上面加上 的限制似乎不错。 默认情况下,TCP wrapping 是打开的。参考 &man.hosts.access.5; 手册,以获得更多关于在各种inetd 调用的服务上设置TCP限制的信息。 杂项 daytimetimeechodiscardchargen, 和 auth 都是inetd内置的服务。 auth服务提供 identity (identidentd)网络服务,并且某种程度上可配置。 参考 &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; 之类的存储设备可以在网络上面被别的机器使用。 这可以减少整个网络上的可移动介质设备的数量。 <acronym>NFS</acronym>是如何工作的 NFS 至少包括两个主要的部分: 一台服务器, 以及至少一台客户机, 客户机远程地访问保存在服务器上的数据。 要让这一切运转起来, 需要配置并运行几个程序。 在 &os; 4.X 中, portmap 工具将发挥后续版本中 rpcbind 工具的作用。 因此, 在 &os; 4.X 中, 您可能需要把后续例子中的 rpcbind 改成 portmap 以便使用。 服务器必须运行以下服务: NFS server 文件服务器 UNIX 客户机 rpcbind portmap mountd nfsd 服务 描述 nfsd NFS,为来自NFS客户端的 请求服务。 mountd NFS挂载服务,处理&man.nfsd.8;递交过来的请求。 rpcbind 此服务允许 NFS 客户程序查询正在被 NFS 服务使用的端口。 客户端同样运行一些进程,比如 nfsiodnfsiod处理来自NFS的请求。 这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。 参考&man.nfsiod.8;手册获得更多信息。 配置<acronym>NFS</acronym> 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服务器的私有网络里头,这很有用。 此外,the /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 The properties of one filesystem exported to a given host must all occur on one line. Lines without a client specified are treated as a single host. This limits how you can export filesystems, but for most people this is not an issue. 下面是一个有效输出列表的例子, /usr and /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。 可以通过对mountd 进程发送HUP信号重启: &prompt.root; kill -HUP `cat /var/run/mountd.pid` 另外,系统重启动可以让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; 手册里有所有可用的开关。 实际应用 NFS 有很多实际应用。下面是比较常见的一些: NFS uses 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。 在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。 这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。 几台机器可以有通用的/usr/ports/distfiles 目录。 这样的话,当您需要在几台机器上安装port时,您可以无需在每台设备上下载而快速访问源码。 Wylie Stilwell Contributed by Chern Lee Rewritten by 通过 <application>amd</application> 自动地挂接 amd 自动挂接服务 &man.amd.8; (自动挂接服务) 能够自动地在访问时挂接远程的文件系统。 如果文件系统在一段时间之内没有活动, 则会被 amd 自动卸下。 通过使用 amd, 能够提供一个持久挂接以外的选择, 而后者往往需要列入 /etc/fstab amd 通过将自己以 NFS 服务器的形式, 附加到 /host/net 目录上来工作。 当访问这些目录中的文件时, amd 将查找相应的远程挂接点, 并自动地挂接。 /net 用于挂接远程 IP 地址上导出的文件系统, 而 /host 则用于挂接远程主机名上的文件系统。 访问 /host/foobar/usr 中的文件, 相当于告诉 amd 尝试挂接在主机 foobar 上导出的 /usr 通过 <application>amd</application> 来挂接导出的文件系统 您可以通过使用 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 客户机 (对于 &os; 4.X, portmap 完成 rpcbind 的功能)。 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.passwdgroup, 以及 hosts 是通过 NIS 分发的。 无论什么时候, 如果客户机上的某个进程请求这些本应在本地的文件中的资料的时候, 它都会向所绑定的 NIS 服务器发出请求, 而不使用本地的版本。 机器类型 NIS 主服务器 一台 NIS 主服务器。 这台服务器, 和 &windowsnt; 域控制器类似, 会维护所有 NIS 客户机所使用的文件。 passwdgroup, 以及许多其他 NIS 客户机所使用的文件, 都被存放到主服务器上。 可以将一台 NIS 主服务器用在多个 NIS 域中。 然而, 本书不打算对这种配置进行介绍, 因为这种配置, 通常只出现在小规模的 NIS 环境中。 NIS 从服务器 NIS 从服务器。 这一概念, 与 &windowsnt; 的备份域控制器类似。 NIS 从服务器, 用于维护 NIS 主服务器的数据文件副本。 NIS 从服务器提供了一种冗余, 这在许多重要的环境中是必需的。 此外, 它也帮助减轻了主服务器的负荷: NIS 客户机总是挂接到最先响应它们的 NIS 服务器上, 而这也包括来自从服务器的响应。 NIS 客户机 NIS 客户机。 NIS 客户机, 和多数 &windowsnt; 工作站类似, 通过 NIS 服务器 (或对于 &windowsnt; 工作站, 则是 &windowsnt; 域控制器) 来完成登录时的身份验证过程。 使用 NIS/YP 这一节将通过实例介绍如何配置 NIS 环境。 这一节假定您正运行的是 FreeBSD 3.3 或更高版本。 这里给出的方法 或许 可以在 FreeBSD 3.0 以上的其他版本上使用, 但不保证。 规划 假定您正在管理大学中的一个小型实验室。 在这个实验室中, 有 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 映射 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 这里, 删除掉和系统有关的帐号对应的项 (binttykmemgames, 等等), 以及其他不希望被扩散到 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 文件末尾加入: +:*:: 完成这些步骤之后, 就应该可以通过运行 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 映射, 即 netgroupnetgroup.byhostnetgroup.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 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 包括 blfmd5 (分别对应于 Blowfish 和 MD5 加密口令)。 如果修改了 /etc/login.conf, 就必须重建登录性能数据库, 这是通过以 root 身份运行下面的程序来完成的: &prompt.root; cap_mkdb /etc/login.conf 已经在 /etc/master.passwd 中的口令的格式不会被更新, 直到用户在登录性能数据库重建 之后 首次修改口令为止。 接下来, 为了确保所有的口令都按照您选择的格式加密了, 还需要检查 /etc/auth.confcrypt_default 给出的优先选择的口令格式。 要完成此工作, 将您选择的格式放到列表的第一项。 例如, 当使用 DES 加密的口令时, 对应项应为: crypt_default = des blf md5 在每一台基于 &os; 的 NIS 服务器和客户机上完成上述工作之后, 就可以肯定您的网络上它们都在使用同样的口令格式了。 如果在 NIS 客户机上做身份验证时发生问题, 这也是第一个可能出现问题的地方。 注意: 如果您希望在混合的网络上部署 NIS 服务器, 可能就需要在所有系统上都使用 DES, 因为这是所有系统都能够支持的最低限度的公共标准。 Greg Sutter Written by 网络自动配置 (DHCP) 什么是 DHCP? 动态主机配置协议 DHCP Internet Software Consortium (ISC) DHCP, 动态主机配置协议, 是一种让系统得以连接到网络上, - 并获取所需要的配置参数手段。 FreeBSD - 使用的是 ISC (Internet Software Consortium) 的 DHCP - 实现, 因此这里所有和具体实现紧密相关的内容, 都是以 - ISC 软件包为准的。 + 并获取所需要的配置参数手段。 FreeBSD 6.0 之前的版本, + 采用的是 ISC (Internet Software + Consortium) 的 DHCP 客户端 (&man.dhclient.8;) 实现。 + 更高版本使用的则是来自 OpenBSD 3.7 + 的 OpenBSD dhclient。 + 这里提供的所有关于 dhclient 的信息, + 都是以 ISC 或 OpenBSD DHCP 客户端程序为准的。 DHCP + 服务器是 ISC 软件包的一部分。 这一节都介绍哪些内容 - 这一节描述了 ISC DHCP 系统的客户端和服务器端的组件。 - 客户端程序, dhclient, - 是随 FreeBSD 作为它的一部分提供的; 而服务器部分, - 则可以通过 net/isc-dhcp3-server port 得到。 - &man.dhclient.8;、 &man.dhcp-options.5;、 以及 - &man.dhclient.conf.5; 联机手册, 加上下面所介绍的参考文献, - 都是非常有用的资源。 + 这一节描述了 ISC 和 DHCP 系统中的客户端, + 以及和 ISC DHCP 系统中的服务器端的组件。 + 客户端程序, dhclient, + 是随 FreeBSD 作为它的一部分提供的; 而服务器部分, + 则可以通过 net/isc-dhcp3-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 DHCP 客户端, - dhclient。 DHCP 客户端被安装程序直接支持, + 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 (对于 &os; 4.X 来说, 则应该是 pseudo-device bpf) 添加到内核的编译配置文件中, 并重新编译内核。 要了解关于编译内核的进一步信息, 请参见 bpf 设备已经是 FreeBSD 发行版中默认的 GENERIC 内核的一部分了,, 因此如果您没有对内核进行定制, 则不用创建一份新的内核配置文件, DHCP 就能工作了。 对于那些安全意识很强的人来说, 您应该知道 bpf 也是包侦听工具能够正确工作的条件之一 (当然, 它们还需要以 root 身份运行才行)。 bpf 使用 DHCP 所必须的, 但如果您对安全非常敏感, 则很可能会有理由不把 bpf 加入到您的内核配置中, 直到您真的需要使用 DHCP 为止。 编辑您的 /etc/rc.conf 并加入下面的设置: ifconfig_fxp0="DHCP" 务必将 fxp0 替换为您希望自动配置的网络接口的名字, 您可以在 找到更进一步的介绍。 如果您希望使用另一位置的 dhclient, 或者需要给 dhclient 传递其他参数, 还可以添加下面的配置 (根据需要进行修改): dhcp_program="/sbin/dhclient" dhcp_flags="" DHCP 服务器 DHCP 服务器, dhcpd, 是作为 net/isc-dhcp3-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-dhcp3-server port 才能提供这个服务。 请参见 以了解关于如何使用 Ports Collection 的进一步详情。 安装 DHCP 服务器 DHCP 安装 为了在您的 FreeBSD 系统上进行配置以便作为 DHCP 服务器来使用, 需要把 &man.bpf.4; 设备编译进内核。 要完成这项工作, 需要将 device bpf (如果使用 &os; 4.X 的话, 则写作 pseudo-device bpf) 加入到您的内核配置文件中, 并重新联编内核。 要得到关于如何联编内核的进一步信息, 请参见 bpf 设备是 FreeBSD 所附带的 GENERIC 内核中已经联入的组件, 因此您并不需要为了让 DHCP 正常工作而特地定制内核。 如果您有较强的安全意识, 应该注意 bpf 同时也是让听包程序能够正确工作的设备 (尽管这类程序仍然需要以特权用户身份运行)。 bpf 使用 DHCP 所必需的, 但如果您对安全非常敏感, 您可能会不希望将 bpf 放进内核, 直到您真的认为 DHCP 是必需的为止。 接下来要做的是编辑示范的 dhcpd.conf, 它由 net/isc-dhcp3-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, 就可以用下面的命令来启动服务: &prompt.root; /usr/local/etc/rc.d/isc-dhcpd.sh 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-dhcp3-relay port。 &man.dhcrelay.8; 联机手册提供了更为详尽的介绍。 Chern Lee Contributed by 域名系统 (DNS) 纵览 BIND FreeBSD 在默认情况下使用一个版本的 BIND (Berkeley Internet Name Domain), 这是目前最为流行的 DNS 协议实现。 DNS 是一种协议, 可以通过它将域名同 IP 地址相互对应。 例如, 查询 www.FreeBSD.org 将得到 FreeBSD Project 的 web 服务器的 IP 地址, 而查询 ftp.FreeBSD.org 则将得到响应的 FTP 机器的 IP 地址。 类似地, 也可以做相反的事情。 查询 IP 地址可以得到其主机名。 当然, 完成 DNS 查询并不需要在系统中运行域名服务器。 DNS DNS 在 Internet 上通过一组略显复杂的权威根域名服务器来组织, 它的其余部分则由较小规模的域名服务器组成, 这些服务器提供少量的域名解析服务, 并对域名信息进行缓存。 这份文档介绍的是 BIND 8.x, 因为它是 &os; 中使用的稳定版本。 &os; 5.3 以及更高版本则包含了 BIND9 及其配置的说明可以在这一章的后一部分找到。 使用 &os; 5.2 以及更早版本的用户, 可以通过 net/bind9 port 来安装 BIND9。 RFC1034 和 RFC1035 定义了 DNS 协议。 目前, BIND 由 Internet Software Consortium 维护。 术语 要理解这份文档, 需要首先了解一些相关的 DNS 术语。 解析器 (resolver) 反向 DNS (reverse DNS) 根域 (root zone) 术语 定义 正向 DNS (Forward DNS) 将域名映射到 IP 地址 原点 (Origin) 表示特定域文件所在的域 named, BIND, 域名服务器(name server) 在 FreeBSD 中 BIND 域名服务器软件包的常见叫法 解析器 (Resolver) 计算机用以向域名服务器查询域名信息的一个系统进程 反向 DNS (Reverse DNS) 与正向 DNS 相对; 将 IP 地址映射为主机名 根域 Internet 域层次的起点。 所有的域都在根域之下, 类似文件系统中, 文件都在根目录之下那样。 域 (Zone) 独立的域, 子域, 或者由同一机构管理的 DNS 的一部分。 例子 域的例子: . 是根域。 org. 是一个根域下的域。 example.org.org. 之下的域。 foo.example.org.example.org. 域的子域。 1.2.3.in-addr.arpa 是用于表达 3.2.1.* IP 地址空间之下所有 IP 地址的域。 如您所见, 域名中最细节的部分在它的左边。 举例来说, example.org. 要比 org. 更小, 就像 org. 要比根域更小一样。 主机名的格局和文件系统类似: /dev 目录在根目录中, 等等。 运行域名服务器的理由 域名服务器通常会有两种形式: 权威域名服务器, 以及缓存域名服务器。 下列情况需要有权威域名服务器: 想要向全世界提供 DNS 信息, 并对请求给出权威应答。 注册了类似 example.org 的域, 而需要将 IP 指定到其下的主机名上。 某个 IP 地址块需要反向 DNS 项 (IP 到主机名)。 需要备份服务器, 或常说的从 (slave) 服务器, 在主服务器出现问题或无法访问时来应答查询请求。 下列情况需要有缓存域名服务器: 本地的 DNS 服务器能够缓存, 并比直接向外界的域名服务器请求更快地得到应答。 减少所需的总体网络流量 (DNS 流量通常占全部 Internet 流量的 5% 或更多)。 当有人查询 www.FreeBSD.org 时,解析器通常会向上级 ISP 的域名服务器发出请求, 并获得回应。 如果有本地的缓存 DNS 服务器, 查询只有在第一次被缓存 DNS 服务器发到外部世界。 其他的查询不会发向局域网外, 因为它们已经有在本地的缓存了。 DNS 如何运作 在 FreeBSD 中, BIND 服务程序被称为 named, 其原因显而易见。 文件 描述 named BIND 服务程序 ndc 域名服务控制程序 /etc/namedb BIND 存放域名信息的位置 /etc/namedb/named.conf 域名服务配置文件 域文件通常被放在 /etc/namedb 目录中, 它们包含域名服务器所提供的 DNS 域的信息。 启动 BIND BIND 启动 由于 BIND 会在默认情况下安装, 因此配置它相对而言很简单。 要确保 named 服务程序在引导时被自动启动, 把下面的行加到 /etc/rc.conf 中: named_enable="YES" 要手工启动服务 (在完成配置之后): &prompt.root; ndc start 配置文件 BIND 配置文件 使用 <command>make-localhost</command> 一定要: &prompt.root; cd /etc/namedb &prompt.root; sh make-localhost 以便创建正确的本地 DNS 反向解析域文件 - /etc/namedb/localhost.rev。 + /etc/namedb/master/localhost.rev. <filename>/etc/namedb/named.conf</filename> // $FreeBSD$ // // Refer to the named(8) manual page for details. If you are ever going // to setup a primary server, make sure you've understood the hairy // details of how DNS is working. Even with simple mistakes, you can // break connectivity for affected parties, or cause huge amount of // useless Internet traffic. options { directory "/etc/namedb"; // In addition to the "forwarders" clause, you can force your name // server to never initiate queries of its own, but always ask its // forwarders only, by enabling the following line: // // forward only; // 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; }; */ 如注视所说, 要从上级的缓存中受益, 可以在此处启用 forwarders。 在一般情况下, 域名服务器会逐级地查询 Internet 来找到特定的域名服务器, 直到得到答案为止。 启用这个将让它首先查询上级域名服务器 (或另外提供的域名服务器), 从而从它们的缓存中得到结果。 如果上级域名服务器的负载很重, 在更快的域名服务器上启用它将有助于改善服务品质。 127.0.0.1 不会 正常工作。 一定要把地址改为您上级服务器的 IP 地址。 /* * If there is a firewall between you and name servers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default. */ // query-source address * port 53; /* * If running in a sandbox, you may have to specify a different * location for the dumpfile. */ // dump-file "s/named_dump.db"; }; // Note: the following will be supported in a future release. /* host { any; } { topology { 127.0.0.0/8; }; }; */ // Setting up secondaries is way easier and the rough picture for this // is explained below. // // If you enable a local name server, don't forget to enter 127.0.0.1 // into your /etc/resolv.conf so this server will be queried first. // Also, make sure to enable it in /etc/rc.conf. zone "." { type hint; file "named.root"; }; zone "0.0.127.IN-ADDR.ARPA" { type master; file "localhost.rev"; }; 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.IP6.INT" { type master; file "localhost.rev"; }; // NB: Do not use the IP addresses below, they are faked, and only // serve demonstration/documentation purposes! // // Example secondary config entries. It can be convenient to become // a secondary at least for the zone where your own domain is in. Ask // your network administrator for the IP address of the responsible // primary. // // Never forget to include the reverse lookup (IN-ADDR.ARPA) zone! // (This is the first bytes of the respective IP address, in reverse // order, with ".IN-ADDR.ARPA" appended.) // // Before starting to setup a primary zone, better make sure you fully // understand how DNS and BIND works, however. There are sometimes // unobvious pitfalls. Setting up a secondary is comparably simpler. // // NB: Don't blindly enable the examples below. :-) Use actual names // and addresses instead. // // NOTE!!! FreeBSD runs BIND in a sandbox (see named_flags in rc.conf). // The directory containing the secondary zones must be write accessible // to BIND. The following sequence is suggested: // // mkdir /etc/namedb/s // chown bind:bind /etc/namedb/s // chmod 750 /etc/namedb/s For more information on running BIND in a sandbox, see Running named in a sandbox. /* zone "example.com" { type slave; file "s/example.com.bak"; masters { 192.168.1.1; }; }; zone "0.168.192.in-addr.arpa" { type slave; file "s/0.168.192.in-addr.arpa.bak"; masters { 192.168.1.1; }; }; */ named.conf 中, 这是一些转发用的从域以及反向域的例子。 对于每一个新域, 域对应的项必须加到 named.conf 中。 例如, 最简单的用于 example.org 域的条目类似下面的样子: zone "example.org" { type master; file "example.org"; }; 这是一个主域, 它由 语句标识出来, 而信息则在 /etc/namedb/example.org 域文件中, 这是由 语句指定的。 zone "example.org" { type slave; file "example.org"; }; 在从域的例子中, 域的信息从该域的某个主服务器传送过来, 并保存在指定的文件中。 如果主服务器死掉了或不可达, 从域名服务器将使用这些传过来的域信息, 从而完成应答。 域信息文件 以下是一个用于 example.org 域的主域文件 (保存为 /etc/namedb/example.org): $TTL 3600 example.org. IN SOA ns1.example.org. admin.example.org. ( 5 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL ; DNS Servers @ IN NS ns1.example.org. @ IN NS ns2.example.org. ; Machine Names localhost IN A 127.0.0.1 ns1 IN A 3.2.1.2 ns2 IN A 3.2.1.3 mail IN A 3.2.1.10 @ IN A 3.2.1.30 ; Aliases www IN CNAME @ ; MX Record @ IN MX 10 mail.example.org. 请注意以 . 结尾的主机名是全称主机名, 而结尾没有 . 的则是相对于原点的主机名。 例如, www 将被转换为 www.原点. 在这个假想的域信息文件中, 我们的原点是 example.org., 因此 www 将被当作 www.example.org. 域信息文件的格式如下: 记录名 IN 记录类型 值 DNS 记录 最常用的 DNS 记录: SOA 域权威开始 NS 权威域名服务器 A 主机地址 CNAME 别名对应的正规名称 MX 邮件传递服务器 PTR 域名指针 (用于反向 DNS) example.org. IN SOA ns1.example.org. admin.example.org. ( 5 ; Serial 10800 ; Refresh after 3 hours 3600 ; Retry after 1 hour 604800 ; Expire after 1 week 86400 ) ; Minimum TTL of 1 day example.org. 域名, 同时也是这个域信息文件的原点。 ns1.example.org. 该域的主/权威域名服务器。 admin.example.org. 此域的负责人的电子邮件地址, 其中 @ 被换掉了。 (admin@example.org 对应 admin.example.org) 5 文件的序号。 每次修改域文件时都必须增加这个数字。 现今, 许多管理员会考虑使用 yyyymmddrr 这样的格式来表示序号。 2001041002 通常表示上次修改于 04/10/2001, 而后面的 02 则表示在那天的第几次修改。 序号非常重要, 它用于通知从域服务器更新数据。 @ IN NS ns1.example.org. 这是一个 NS 项。 每个准备提供权威应答的服务器都必须有一个对应项。 这里的 @ 表示 example.org.@ 会被理解为原点。 localhost IN A 127.0.0.1 ns1 IN A 3.2.1.2 ns2 IN A 3.2.1.3 mail IN A 3.2.1.10 @ IN A 3.2.1.30 A 记录代表及其名。 如上面看到的, ns1.example.org 将解析为 3.2.1.2。 在此再次使用了原点符, @, 它表示 example.org 应解析为 3.2.1.30 www IN CNAME @ 正规名记录通常用于对某台机器的别名给出对应的正式名字。 在这个例子中, www 是名字为原点, 或者说 example.org (3.2.1.30) 那台机器的别名。 CNAMEs 可以用来提供主机的别名, 或将同一名字在多台机器上作轮询。 MX 记录 @ IN MX 10 mail.example.org. MX 记录表示哪个邮件服务器负责接收发到这个域的邮件。 mail.example.org 是邮件服务器的主机名, 而 10 则是它的优先级。 可以有多台邮件服务器, 其优先级分别是 3, 2, 1。 向 example.org 进行投递的邮件服务器首先会尝试优先级最高 (数字最小) 的 MX, 然后是较低优先级的, 等等, 直到成功地投递了邮件为止。 对于 in-addr.arpa 域名信息文件 (反向 DNS), 使用了同样的格式, 只是 PTR 项代替了 A 或 CNAME 的位置。 $TTL 3600 1.2.3.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. ( 5 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 3600 ) ; Minimum @ IN NS ns1.example.org. @ IN NS ns2.example.org. 2 IN PTR ns1.example.org. 3 IN PTR ns2.example.org. 10 IN PTR mail.example.org. 30 IN PTR example.org. 这个文件给出了上述假想域中 IP 地址到域名的映射关系。 缓存域名服务器 BIND 缓存域名服务器 缓存域名服务器是对任何域都不提供权威解析的域名服务器。 它自己简单地完成查询, 并记住这些查询以备后续使用。 要建立这样的服务器, 只需像平时一样配置一个域名服务器, 而不配置域就可以了。 在沙盒中运行 <application>named</application> BIND 在沙盒中运行 chroot 要更安全地运行 &man.named.8;, 应该以非特权用户来运行它, 并配置为 &man.chroot.8; 到一个沙盒目录中。 这使得 named 服务无法访问任何沙盒外面的东西。 假如 named 被攻破, 这将减少它所能带来的破坏。 默认情况下, FreeBSD 提供了名为 bind 的用户和组来完成这样的目的。 许多人建议不这样做, 而 named 配置为 chroot, 您应该在一个 &man.jail.8; 中运行 named。 这一节并不涵盖这种情形。 由于 named 没有办法访问沙盒外面的任何东西 (例如共享库, 日志 socket 等等), 您需要做许多事情来让 named 正常工作。 下面的清单假定沙盒是 /etc/namedb 而您没有事先改过这个目录中的内容。 以 root 的身份完成下列步骤: 创建 named 需要访问的所有目录: &prompt.root; cd /etc/namedb &prompt.root; mkdir -p bin dev etc var/tmp var/run master slave &prompt.root; chown bind:bind slave var/* named 只需要写这些目录, 这也是我们赋予它的全部权限。 重新组织基本的域和配置文件: &prompt.root; cp /etc/localtime etc &prompt.root; mv named.conf etc && ln -sf etc/named.conf &prompt.root; mv named.root master -&prompt.root; sh make-localhost && mv localhost.rev localhost-v6.rev master +&prompt.root; sh make-localhost &prompt.root; cat > master/named.localhost $ORIGIN localhost. $TTL 6h @ IN SOA localhost. postmaster.localhost. ( 1 ; serial 3600 ; refresh 1800 ; retry 604800 ; expiration 3600 ) ; minimum IN NS localhost. IN A 127.0.0.1 ^D 这使得 named 能够将正确的时间传递给 &man.syslogd.8;。 syslog 日志文件 named 如果您在运行 &os; 在 4.9-RELEASE 之前的版本, 需要联编一个静态连接的 named-xfer, 并将其复制到沙盒中: &prompt.root; cd /usr/src/lib/libisc &prompt.root; make cleandir && make cleandir && make depend && make all &prompt.root; cd /usr/src/lib/libbind &prompt.root; make cleandir && make cleandir && make depend && make all &prompt.root; cd /usr/src/libexec/named-xfer &prompt.root; make cleandir && make cleandir && make depend && make NOSHARED=yes all &prompt.root; cp named-xfer /etc/namedb/bin && chmod 555 /etc/namedb/bin/named-xfer 在把静态连接的 named-xfer 装好之后需要清理一下, 以免将过时的库或程序留在您的源代码副本中: &prompt.root; cd /usr/src/lib/libisc &prompt.root; make cleandir &prompt.root; cd /usr/src/lib/libbind &prompt.root; make cleandir &prompt.root; cd /usr/src/libexec/named-xfer &prompt.root; make cleandir 据说这一步有时会失败。 如果您遇到这样的问题, 执行下面的命令: &prompt.root; cd /usr/src && make cleandir && make cleandir 并删除 /usr/obj 目录: &prompt.root; rm -fr /usr/obj && mkdir /usr/obj 这将把任何 垃圾 从您的源代码目录中删除, 而后续工作将得以正常进行。 如果您运行 &os; 的 4.9-RELEASE 或更新的版本, 则默认情况下 /usr/libexec 中的 named-xfer 副本已经是静态连接的了。 您可以简单地把它用 &man.cp.1; 复制到沙盒中。 做一个 named 能够看到并写入的 dev/null &prompt.root; cd /etc/namedb/dev && mknod null c 2 2 &prompt.root; chmod 666 null /var/run/ndc 符号链接到 /etc/namedb/var/run/ndc &prompt.root; ln -sf /etc/namedb/var/run/ndc /var/run/ndc 这个非常简单的措施有效地避免了您每次都必须指定 参数来启动 &man.ndc.8; 的麻烦。 由于 /var/run 中的内容会在启动时被删除, 把上述命令加入到 root 的 &man.crontab.5; 中, 并指定 选项会很有用。 syslog 日志文件 named 配置 &man.syslogd.8; 来创建一个 named 可以写的 log socket。 要完成它, 需要将 -l /etc/namedb/dev/log 加到 /etc/rc.confsyslogd_flags 变量中。 chroot 启动 named 并让它自动地把自己 chroot 到沙盒中, 方法是把下面的内容加到 /etc/rc.conf named_enable="YES" named_flags="-u bind -g bind -t /etc/namedb /etc/named.conf" 请注意配置文件 /etc/named.conf 是以 相对于沙盒 的完整路径来指定的, 例如上面那一行, 文件所在的目录实际上是 /etc/namedb/etc/named.conf 下一步是编辑 /etc/namedb/etc/named.confnamed 直到需要加载哪些域, 以及它们在磁盘上的位置。 您可以用注释掉的那个例子 (没有明确地注释掉的哪些和不在沙盒中运行 DNS 服务器时的配置无异): options { directory "/"; named-xfer "/bin/named-xfer"; version ""; // Don't reveal BIND version query-source address * port 53; }; // ndc control socket controls { unix "/var/run/ndc" perm 0600 owner 0 group 0; }; // Zones follow: zone "localhost" IN { type master; file "master/named.localhost"; allow-transfer { localhost; }; notify no; }; zone "0.0.127.in-addr.arpa" IN { type master; file "master/localhost.rev"; allow-transfer { localhost; }; notify no; }; 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.ip6.int" { type master; file "master/localhost-v6.rev"; allow-transfer { localhost; }; notify no; }; zone "." IN { type hint; file "master/named.root"; }; zone "private.example.net" in { type master; file "master/private.example.net.db"; allow-transfer { 192.168.10.0/24; }; }; zone "10.168.192.in-addr.arpa" in { type slave; masters { 192.168.10.2; }; file "slave/192.168.10.db"; }; directory 语句被指定为 /, 因为所有的 named 需要在这个文件中 (这相当于在 普通 模式下运行时的 /etc/namedb)。 指定到 named-xfer 执行文件的完整路径 (相对 named 的参照系)。 这是必须的步骤, 因为 named 在默认情况下会从 /usr/libexec 查找 named-xfer 指定文件名 (相对于前面的 directory 语句指定的目录), named 将在这里查找域信息文件。 指定文件名 (相对于前面的 directory 语句指定的目录), named 将在这里写入成功地从主服务器拿到的域信息文件副本。 这使为什么我们在前面的步骤中将 slave 的属主改为 bind 的原因。 完成这些配置之后, 您可以重新启动服务器, 或重启 &man.syslogd.8; 服务并启动 &man.named.8;, 以确认 syslogd_flagsnamed_flags 的新值生效了。 现在您应该已经在沙盒中运行 named 了! 安全 尽管 BIND 是最为常用的 DNS 实现, 但它总是有一些安全问题。 时常会有人发现一些可能的甚至可以利用的安全漏洞。 经常阅读 CERT 的安全公告并订阅 &a.security-notifications; 会是一个帮助您时刻了解最新 Internet 和 FreeBSD 安全问题的好习惯。 如果出现了问题, 将代码升级到最新版本并重新联编 named 不会带来任何麻烦。 进一步阅读 BIND/named 联机手册: &man.ndc.8; &man.named.8; &man.named.conf.5; 官方的 ISC BIND 页面 BIND FAQ O'Reilly DNS 和 BIND 第4版 RFC1034 - 域名 - 概念和工具 RFC1035 - 域名 - 实现及其标准 Tom Rhodes 撰写者 <acronym>BIND</acronym>9 和 &os; bind9 安装 随着 &os; 5.3 版本的发布, BIND9 DNS 服务软件正式成为了发行版本的一部分。 新的安全特性,文件布局, 以及自动的 &man.chroot.8; 配置也加入进来。 这一节分成两部分, 第一部分讨论了新增特性以及如何配置它们; 后一部分则讲述了升级过程, 帮助用户迁移到 &os; 5.3。 从现在起, 服务器将被简单地写作 &man.named.8; 或 BIND。 这一节跳过了前一节所介绍的那些术语, 以及一些理论上的讨论; 因此, 建议您在继续阅读之前首先看一看前面的章节。 目前, named 的配置文件存放在 /var/named/etc/namedb/, 在使用之前需要进行一些修改。 这也是进行绝大多数相关配置的地方。 主域的配置 要配置主域, 应首先进入 /var/named/etc/namedb/ 并执行下面的命令: &prompt.root; sh make-localhost 如果一切正常, 则在 master 目录中将出现两个新文件。 它们的名字应该是用于本地域名解析的 localhost.rev, 以及用于 IPv6 配置的 localhost-v6.rev。 作为默认的配置文件, 关于它们的配置已经在 named.conf 文件中定义了。 从域的配置 可以通过配置从域来提供额外的域或子域的解析。 多数情况下, master/localhost.rev 文件可以直接复制到 slave 目录中并进行修改。 此后, 这些文件应该加入到 named.conf, 类似下面的 example.com 配置: zone "example.com" { type slave; file "slave/example.com"; masters { 10.0.0.1; }; }; zone "0.168.192.in-addr.arpa" { type slave; file "slave/0.168.192.in-addr.arpa"; masters { 10.0.0.1; }; }; 请注意在这个例子中, 主服务器的 IP 地址指明了我们要从哪里把域传过来; 那台服务器本身并不一定要作为对外的 DNS 服务器来用。 系统的初始配置 为了让 named 服务能够在系统启动时自动加载, 需要把下面的选项加到 rc.conf 文件中: named_enable="YES" 尽管还有其他的一些可用选项, 这是运行域名服务器所需要的最小配置。 请参考 &man.rc.conf.5; 联机手册了解更多的选项。 如果不需要继续在 rc.conf 文件中进行其他配置了, 就可以通过下面的命令行来启动 named &prompt.root; /etc/rc.d/named start <acronym>BIND</acronym>9 的安全 尽管 &os; 会自动地将 named 放到一个 &man.chroot.8; 环境中, 您仍然可以采取一些更为严密的措施来防止潜在的针对 DNS 服务的攻击。 查询访问控制表 查询访问控制表可以用来限制对于域的查询。 这些配置通过在 acl 语句中列出的 IP 地址来发挥作用。 要允许一个子网查询 example.org 中的主机, 可以做下面的定义: acl "example.com" { 192.168.0.0/24; }; zone "example.com" { type slave; file "slave/example.com"; masters { 10.0.0.1; }; allow-query { example.com; }; }; zone "0.168.192.in-addr.arpa" { type slave; file "slave/0.168.192.in-addr.arpa"; masters { 10.0.0.1; }; allow-query { example.com; }; }; 限制版本查询 允许查询 DNS 服务的版本, 可能会给攻击者敞开方便之门。 心存恶意的用户能够利用这一信息找到存在已知漏洞的服务器, 并利用这些漏洞来实施攻击。 配置伪造的版本号并不能阻止服务器被使用已知的攻击手段进行攻击。 唯一能够确保安全的办法是将服务器升级到没有已知问题的版本。 伪造的版本号可以通过 named.confoptions 小节来指定: options { directory "/etc/namedb"; pid-file "/var/run/named/pid"; dump-file "/var/dump/named_dump.db"; statistics-file "/var/stats/named.stats"; version "None of your business"; }; Murray Stokely Contributed by Apache HTTP 服务器 web 服务器 配置 Apache 纵览 &os; 被用于运行许多全球最为繁忙的 web 站点。 大多数 Internet 上的 web 服务器, 都使用 Apache HTTP 服务器Apache 软件包可以在您的 FreeBSD 安装盘上找到。 如果没有在首次安装时附带安装 Apache, 则可以通过 www/apache13www/apache2 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) 的 binsbin 子目录中, 而配置文件则位于 etc/apache ServerAdmin you@your.address 这个地址是在服务器发生问题时应发送电子邮件的地址, 它会出现在服务器生成的页面上, 例如错误页面。 ServerName www.example.com ServerName 允许您配置发送回客户端的主机名, 如果您的服务器被用户以别的名字访问 (例如, 使用 www 而不是主机本身的真实名字)。 DocumentRoot "/usr/local/www/data" DocumentRoot: 这个目录是您的文档所在的目录。 默认情况下, 所有的请求都会从这个位置去获取, 但也可以通过符号连接和别名指定其它的位置。 在修改配置之前备份 Apache 的配置文件永远是一个好习惯。 一旦对初始配置满意了, 就可以开始运行 Apache 了。 运行 <application>Apache</application> 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 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> <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/apache2 port 来安装后者。 mod_perl Perl Apache/Perl 集成计划, 将 Perl 程序设计语言的强大功能, 与 Apache HTTP 服务器 紧密地结合到了一起。 通过 mod_perl 模块, 可以完全使用 Perl 来撰写 Apache 模块。 此外, 服务器中嵌入的持久性解释器, 消除了由于启动外部的解释器为 Perl 脚本的启动所造成的性能损失。 如果您还没有安装 Apache, 也可以通过 www/apache13-modperl port 来安装包含了 mod_perlApache 版本。 Tom Rhodes Written by PHP PHP 在过去的几年中, 更多的企业开始转向 Internet, 以期扩大它们的收入和影响。 这也使得交互式 web 内容的需求日益增长。 尽管某些公司, 例如 µsoft;, 在它们的商业产品中引入了一些解决方案, 但开放源代码团体也给出了自己的答案。 这其中, 使用的最为广泛的就是 PHP PHP, 也成为 Hypertext Preprocessor, 是一种通用的脚本语言, 并且特别适合于 Web 开发。 它能够很容易地嵌入到 HTML 之中, 其语法接近于 C、 &java;、 以及 Perl, 以期让 web 开发人员能够迅速地写出动态生成的 web 页面。 要获得 Apache web 服务器的 PHP5 支持, 可以从安装 www/mod_php5 port 开始。 这样, 将安装并配置用于支持动态 web 应用所需要的模块。 请再次检查, 以确认在 /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) 服务重启: &prompt.root; apachectl graceful 在 &os; 中的 PHP 支持是极端模块化的。 如果需要安装某个扩展, 管理员只需安装相应的 port, 并像上面所建议的那样重新启动 Apache 就可以了。 例如, 要将对于 MySQL 数据库服务器的支持加入 PHP5, 只需简单地安装 databases/php5-mysql 并执行下面的命令: &prompt.root; apachectl graceful 这样, 就启用了 PHPMySQL 支持。 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; 用户。 这样, 用户就可以使用 ftpanonymous 和任意的口令 (习惯上, 应该是以那个用户的邮件地址作为口令) 来登录和访问您的 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 发送 HangUP 信号。 现在可以通过输入下面的命令来登录您的 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/etc/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 如同 中介绍的那样, 修改配置文件之后, 需要向 inetd 发送 HangUP 信号。 一旦在 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 = sharesecurity = 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; grep -v "^#" /etc/passwd | make_smbpasswd > /usr/local/private/smbpasswd &prompt.root; chmod 600 /usr/local/private/smbpasswd 请参见 Samba 的文档, 以了解关于配置选项的进一步信息。 按照前面给出的描述, 您应该已经可以启动 Samba 了。 启动 <application>Samba</application> 要在系统引导时启动 Samba, 将下面的配置加入 /etc/rc.conf samba_enable="YES" 现在可以在任何时候通过下面的命令来启动 Samba 了: &prompt.root; /usr/local/etc/rc.d/samba.sh start Starting SAMBA: removing stale tdbs : Starting nmbd. Starting smbd. Samba 事实上包含了三个相互独立的服务程序。 您应该能够看到 nmbdsmbd 两个服务程序都是通过 samba.sh 脚本启动的。 如果在 smb.conf 中启用了 winbind 名字解析服务, 则应该可以看到 winbindd 服务被启动起来。 可以在任何时候通过下面的命令来停止运行 Samba &prompt.root; /usr/local/etc/rc.d/samba.sh 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 如果只希望子网内的机器通过您的服务器同步时钟, 而不允许它们配置为服务器, 或作为同步时钟的节点来时用, 则加入 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 在 &os; 4.X 中, 需要把上述参数中的 ntpd 改为 xntpd 在临时性的 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 格式的版本。 diff --git a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml index 35ada57c60..478bd3035f 100644 --- a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml @@ -1,2781 +1,2781 @@ Jim Mock Restructured, reorganized, and updated by PPP 和 SLIP 概述 PPP SLIP FreeBSD 有很多方法可以将计算机与计算机连接起来。 通过使用拨号 modem 来建立网络或 Internet 连接, 或允许其他人通过您的机器来连上网络, 这些都要求使用 PPP 或 SLIP。 这章将详细介绍设置这些基于 modem 的通信服务的方法。 - 读完这一章,您将会了解到: + 读完这一章, 您将了解: - 如何设置用户级PPP. + 如何设置用户级 PPP。 - 如何设置内核级PPP. + 如何设置内核级 PPP。 如何设置 PPPoE (PPP over - Ethernet). + Ethernet)。 如何设置 PPPoA (PPP over - ATM). + ATM)。 - 如何配置和安装SLIP客户端和服务器. + 如何配置和安装 SLIP 客户端和服务器。 PPP - 用户级PPP + 用户级 PPP PPP - 内核级PPP + 内核级 PPP PPP - PPPOE + PPPoE - 在阅读这章之前,您应当: + 在阅读这章之前, 您应: - 熟悉基本的网络术语. + 熟悉基本的网络术语。 - 理解拨号连接和PPP,SLIP的基础知识. + 理解拨号连接和 PPP、 SLIP 的基础知识。 - 您可能想知道用户级PPP与内核级PPP不同之处.回答很简单: - 用户级PPP处理用户级的输入和输出数据,而不是内核级. - 在内核与用户区之间复制数据的花费要大一些,但它能提供具有更多特性的PPP实现 . - 用户级PPP使用 tun设备与外界通信而内核级PPP使用 - ppp设备. + 您可能想知道用户级 PPP 与内核级 PPP 之间的不同之处。 回答很简单: + 用户级 PPP 处理用户级的输入和输出数据, 而不是内核级。 + 在内核与用户区之间复制数据的花费要大一些, + 但它能提供具有更多特性的PPP实现。 + 用户级PPP使用 tun + 设备与外界通信而内核级 PPP 使用 + ppp 设备。 - 除非需要与其它PPP软件(比如pppd)相区别,在这一章中 - 用户级PPP就简称为ppp.另外,若没有额外的注明,本章所介绍 - 的所有命令都需要root权限. - . + 除非需要与其它 PPP 软件 (比如 pppd) + 相区别, 在这一章中, + 用户级 PPP 就简称为 ppp。 + 另外, 若没有额外的注明, 本章所介绍的所有命令都需要 + root 权限。 Tom Rhodes Updated and enhanced by Brian Somers Originally contributed by Nik Clayton With input from Dirk Frömberg Peter Childs - 使用用户级PPP + 使用用户级 PPP - 用户级PPP + 用户级 PPP 前提条件 本章假定您具备如下条件: ISP PPP - 您有一个ISP提供的用于连接使用PPP的帐号. + 您有一个 ISP 提供的用于连接使用 PPP 的帐号。 - 您需要一个连接到您的系统并做了正确配置的modem或其它设备,使您能连接到ISP. + 您需要一个连接到您的系统, 并做了正确配置的 modem + 或其它设备, 使您能连接到 ISP。 - ISP的拨号号码. + ISP 的拨号号码。 PAP CHAP UNIX login name password?/primary> - 您的登录名称和密码(可能是一般的UNIX风格的登录名和密码对, - 也可能是PAP或CHAP登录名和密码对.) + 您的登录名称和密码 (可能是一般的 UNIX 风格的登录名和密码对, + 也可能是 PAP 或 CHAP 登录名和密码对。) nameserver - 一个或多个域名服务器IP地址. - 通常,您会从ISP处得到两个这样的IP地址. 如果您至少得到了一个, 就可以 - 在文件ppp.conf中加入enable dns命令 - 使ppp设置域名服务.这个功能取决于ISP对支持DNS协商的具体实现. - + 一个或多个域名服务器 IP 地址。 + 通常, 您会从ISP处得到两个这样的IP地址。 + 如果您至少得到了一个, 就可以在文件 + ppp.conf 中加入 enable dns + 命令使 ppp 设置域名服务。 + 这个功能取决于 ISP 对支持 DNS 协商的具体实现。 - 下面的信息由您的ISP提供,但不是必需的: + 下面的信息由您的 ISP 提供, 但不是必需的: ISP的网关IP地址. 网关是您要连接的且要被设为默认路由的主机. 如果您没有这个信息,您可以虚构一个,在连接时ISP的PPP服务器会自动告诉您正确的值. 这个虚构的IP号被ppp称为 HISADDR. 需要使用的子网掩码.如果ISP没有提供,您可以安全地使用 255.255.255.255. static IP address 如果ISP提供了一个静态的IP地址和主机名,可以输入它们.否则,让对方主机指定它 认为合适的IP地址. 如果您不知道这些信息,请与您的ISP联系. 在这节中,所有作为样例显示的配置文件信息都对行进行了编号. 这些行号只是为了使解释和讨论变得方便,在真实当地用tab键和sp文件中并不存在. 缩进是必需的. 创建PPP设备节点 PPPcreating device nodes 一般情况下,大多数用户只需要一个tun设备 (/dev/tun0),提及tun0时, 即指tunN,N是您系统中具体的号码. 若的FreeBSD(FreeBSD 4.X 及早前版本)没有启用&man.devfs.5;,应当先检查 是否存在tun0设备,如果已经启用了&man.devfs.5;,这一步就没必要了 (因为&man.devfs.5;会根据需要创建设备). 为了确保tun0配置正确, 最简单的方式是重新创建它。 按照以下步骤可以重新创建设备: &prompt.root; cd /dev &prompt.root; sh MAKEDEV tun0 如果您的内核要有16个tunnel设备,您必须创建它们.可以通过执行以下命令完成: &prompt.root; cd /dev &prompt.root; sh MAKEDEV tun15 <application>PPP</application>自动化配置 PPPconfiguration ppppppd(PPP的内核级实现) 都使用/etc/ppp目录中的配置文件.用户级PPP的例子能 在/usr/share/examples/ppp/中找到. 配置ppp要求根据您的需要编辑几个文件.编辑哪几个文件取决于您的 IP是静态分配还是动态分配的. PPP和静态IP地址 PPPwith static IP addresses 您需要编辑配置文件/etc/ppp/ppp.conf.如下所示. 以冒号:结尾的行从第一列 (行首)开始, 其它所有的行都要使用空格或制表符 (Tab) 来缩进。 1 default: 2 set log Phase Chat LCP IPCP CCP tun command 3 ident user-ppp VERSION (built COMPILATIONDATE) 4 set device /dev/cuaa0 5 set speed 115200 6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \ 7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT" 8 set timeout 180 9 enable dns 10 11 provider: 12 set phone "(123) 456 7890" 13 set authname foo 14 set authkey bar 15 set login "TIMEOUT 10 \"\" \"\" gin:--gin: \\U word: \\P col: ppp" 16 set timeout 300 17 set ifaddr x.x.x.x y.y.y.y 255.255.255.255 0.0.0.0 18 add default HISADDR 行1 : 指定默认的项.当PPP运行时这个项中的命令将自动执行. 行2: 启用登录参数.工作正常后,为避免产生过多的日志文件,这行应该简化为: set log phase tun. 行 3: 告诉PPP怎样向对方自我标识. 如果在建立或使用连接时遇到任何麻烦,PPP就会向对方主机自我标识.对方主机管理员 在处理这个问题时,这些信息会有用. 行 4: 标明modem要连接的端口号.COM1/dev/cuaa0, COM2/dev/cuaa1. 行 5: 设置连接的速度.如果115200 不能工作,试试 38400. 行6 和7: PPPuser PPP 拨号字符串. 用户级PPP使用一种与&man.chat.8;程序相似的语法. 请参考联机手册了解这种语言的相关信息. 注意,为了便于阅读此命令进行了换行.任何ppp.conf里的 命令都可以这样做,前提是行的最后一个字符必须是\. 行 8: 设置连接的时间间隔.默认是180秒,所以这一行是多余的. 行 9: 告诉PPP向对方主机确认本地域名解析设置.如果您运行了本地的域名服务器,要注释或删除掉这一行. 行 10: 为了可读性的需要设置一个空行.空行会被PPP忽略. 行 11: provider指定一个项.可以改成 ISP的名字.这样您以后就可以使用 开启连接. 行 12: 设置提供商的电话号码. 多个电话号码可以使用冒号(:) 或管道符号(|)隔开.这两个字符的区别在&man.ppp.8;的联机手册中有介绍. 总的来讲,如果您要循环使用这些号码,可以使用冒号.如果您想使用第一个号码, 当第一个号码失败了再用第二个号码,就使用管道符号。 如所示的那样, 要给整个电话号码加上引号(")。 如果电话号码里有空格,必须用引号(")将其括起来. 否则会造成简单却难以察觉的错误. 行13和14: 指定用户名和密码.当使用一个&unix;风格的命令提示符登录时,这些值可以用带有\U \P参数 的set login命令进行修改.当使用PAP或CHAP进行连接时, 这些值在验证使用. 行 15: PAP CHAP 如果您使用的是PAP或者CHAP,在这里就不会有登录.要注释或删除掉这一行. 请参考 PAP和CHAP认证 以获取更多细节. 登录命令是的语法是chat类型的.在这个例子中,是这样的: J. Random Provider login: foo password: bar protocol: ppp 您需要改变这个脚本以适合您自己的需要.当您第一次写这个脚本时, 应当确保已经启用chat并处于登录状态,这样您才能确认通信是否 正在按计划进行. 行16: timeout 设置默认的超时时间.这里,连接若在300秒内无响应将被断开.如果您不想设置成超时, 将这个值设置成0,或在命令行使用选项. 行 17: ISP 设置接口地址. 字符串 x.x.x.x需要用ISP提供给您的IP地址替换. 字符串 y.y.y.y要用ISP的网关IP地址替换(即您要连接的主机). 如果ISP没有给您网关地址,可以使用10.0.0.2/0. 如果您需要使用一个猜到的地址,请确保在/etc/ppp/ppp.linkup 中为每个PPP和动态IP地址指令创建了项. 如果没有这一行,ppp 将无法运行模式. 第18行: 添加一个到ISP网关的默认路由。 HISADDR这个关键字会被第17行所指定的网关地址替换。 这行必须出现在第17行之后,以免在 HISADDR 初始化之前使用它的值。 如果您不想使用 的 PPP,则这行应挪到, ppp.linkup 文件中。 若您有一个静态IP地址,且使用 模式运行ppp(因为在连接之前已经正确设置了路由表项),那就不需要再向ppp.linkup 添加项.您可能希望在连接以后创建一个项来调用程序.这在以后的sendmail的例子中会解释. . 示例配置文件可以在目录/usr/share/examples/ppp/中找到. PPP和动态IP地址 PPPwith dynamic IP addresses IPCP 如果ISP没给您指定静态的IP地址,ppp要被配置成能够与对方协商确定本地和远程地址. 要完成这项工作,先要一个IP地址,然后允许 ppp在连接后使用IP配置协议(IPCP)进行正确配置. ppp.conf的配置是与 PPP和静态IP地址一样的,除了以下的改变: 17 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 再次强调,不要包括行号,它只是一个引用标记.缩排一个空格是必须的. 行17: /字符以后是PPP所要求的地址位码. 您可以根据需要使用不同IP号码,但以上的例子永远是可行的. 最后的参数(0.0.0.0)告诉 PPP从0.0.0.0 而不是 10.0.0.1 开始协商地址,对于有些ISP, 这是必需的.不要将 0.0.0.0 作为 set ifaddr的第一个参数,因为这使得PPP在 模式时不能设置初始路由. 如果您不运行模式, 就需要在/etc/ppp/ppp.linkup中创建一个项. 连接建立之后,ppp.linkup被启用. 这时候, ppp将指派接口地址,接着再添加路由表项: 1 provider: 2 add default HISADDR Line 1: 为了建立连接, ppp 会按按照如下规则在 ppp.linkup寻找项:首先,试图寻找相同的标签 (如同在ppp.conf一样).如果失败了,寻找作为网关 IP地址的项,此项是四个八位字节的风格.如果依旧没有找到,就寻找MYADDR 行 2: 这行告诉 ppp添加指向 HISADDR的默认路由. HISADDR由通过IPCP协商得到的IP号替换. 参考/usr/share/examples/ppp/ppp.conf.sample/usr/share/examples/ppp/ppp.linkup.sample 中的pmdemand项以获取细节化的例子. 接收拨入 PPPreceiving incoming calls 当要配置 ppp接受来自LAN上的 拨入时,您需要决定是否将包转给LAN.如果是的话,您就必须从LAN子网中 给对方分配一个IP, 需要在文件/etc/ppp/ppp.conf 中使用命令enable proxy .您还应该确定文件 /etc/rc.conf中包含以下内容: gateway_enable="YES" 使用哪个ggtty? 配置FreeBSD的拨号服务描述了怎么使用命令 &man.getty.8;启动拨号服务. 除了getty 还有 mgetty, 它是getty的智能版本,是按照拨号线的思想设计的. 使用mgetty的好处是它能积极地与modems进行 talks , 这就意味着如果在/etc/ttys中的端口被关闭, 您的moderm就不会回应拨入. 最新版本的mgetty (from 0.99beta onwards)也支持自动侦测PPP数据流,允许客户端不使用脚本就可以访问服务器 . 参考Mgetty 和 AutoPPP的联机手册了解更多信息. <application>PPP</application> 权限 ppp命令通常必须作为root用户运行. 但如果想让一个普通用户将ppp运行于服务器模式(就像下面描述的那样) ,您必须要把此用户加入network组以使其获得运行 ppp 的权限. 您还需要使用allow命令使用户能访问配置文 件的一个或多个部分: allow users fred mary 如果这个命令被用在 default 部分中,您可以让指定的用户访问任何东西. 动态IP用户的PPP Shell PPP shells 创建一个名为/etc/ppp/ppp-shell文件,加入以下内容: #!/bin/sh IDENT=`echo $0 | sed -e 's/^.*-\(.*\)$/\1/'` CALLEDAS="$IDENT" TTY=`tty` if [ x$IDENT = xdialup ]; then IDENT=`basename $TTY` fi echo "PPP for $CALLEDAS on $TTY" echo "Starting PPP for $IDENT" exec /usr/sbin/ppp -direct $IDENT 这个脚本要有可执行属性. 然后通过如下命令创建一个指向此脚本且名为 ppp-dialup的符号链接: &prompt.root; ln -s ppp-shell /etc/ppp/ppp-dialup - 您应该将这个脚本作为所有拨入用户的shell. - 以下是在文件/etc/password中关于一个PPP用户的例子,用户名为 - pchilds (切记不要直接修改这个密码文件, - 而是使用vipw命令). + 您应该将这个脚本作为所有拨入用户的 + shell。 + 以下是在文件 /etc/passwd + 中关于 PPP 用户 + pchilds 的例子 (切记, + 不要直接修改这个密码文件, 用 &man.vipw.8; 来修改它)。 pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialup 创建一个名为 /home/ppp的目录作为拨入用户的主目录, 包含以下这些空文件: -r--r--r-- 1 root wheel 0 May 27 02:23 .hushlogin -r--r--r-- 1 root wheel 0 May 27 02:22 .rhosts 这样就可以防止/etc/motd被显示出来. 静态IP用户的Shell PPP shells 像上面那样创建ppp-shell文件, 为每个静态分配IP用户创建一个到 ppp-shell的 符号链接. 例如,如果您有三个拨号用户, fred,sam,和 mary,您为他们路由C类网络,您需要键入以下内容: &prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-fred &prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-sam &prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-mary 每个用户的Shell必须被设成一个符号链接(例如用户 mary的Shell应该是/etc/ppp/ppp-mary). 为动态IP用户设置<filename>ppp.conf</filename> /etc/ppp/ppp.conf文件应该包含下面 这些行: default: set debug phase lcp chat set timeout 0 ttyd0: set ifaddr 203.14.100.1 203.14.100.20 255.255.255.255 enable proxy ttyd1: set ifaddr 203.14.100.1 203.14.100.21 255.255.255.255 enable proxy 缩进得必须的. default:项在每次会话时都会加载.每个在 /etc/ttys中启用的行都必须为其创建一个相似于 ttyd0: 的项.每一行应该从动态IP 地址池中取得 唯一的IP地址. 为静态IP用户配置<filename>ppp.conf</filename> 根据上面/usr/share/examples/ppp/ppp.conf文件的内容, 您必须为每个静态拨号用户添加一个项.我们继续以fred, sam, 和mary为例. fred: set ifaddr 203.14.100.1 203.14.101.1 255.255.255.255 sam: set ifaddr 203.14.100.1 203.14.102.1 255.255.255.255 mary: set ifaddr 203.14.100.1 203.14.103.1 255.255.255.255 如果需要,/etc/ppp/ppp.linkup 也应该包括每个静态IP用户的的路由信息.下面这一行为客户连接添加了 203.14.101.0C类路由. fred: add 203.14.101.0 netmask 255.255.255.0 HISADDR sam: add 203.14.102.0 netmask 255.255.255.0 HISADDR mary: add 203.14.103.0 netmask 255.255.255.0 HISADDR <command>mgetty</command>和AutoPPP mgetty AutoPPP LCP 在配置和编译mgetty 时启用 AUTO_PPP选项 使mgetty能够探测PPP连接的的LCP状态 并自动产生PPP Shell. 但如果默认的login/password队列没有出现, 那就必须使用PAP或CHAP来验证用户. 这节假定您已经为用户成功地配置,编译了带有AUTO_PPP选项的 mgetty. 确认钅件/usr/local/etc/mgetty+sendfax/login.config 包含以下内容: /AutoPPP/ - - /etc/ppp/ppp-pap-dialup 这行告诉mgetty运行 ppp-pap-dialup脚本来侦听PPP连接. 创建/etc/ppp/ppp-pap-dialup文件写入以下内容 (此文件应该是可执行的): #!/bin/sh exec /usr/sbin/ppp -direct pap$IDENT 对应于每个在/etc/ttys的启用行,都要在/etc/ppp/ppp.conf 中创建相应的项. 这和上面的定义是相同的. pap: enable pap set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40 enable proxy - 每个通过这种方式登录的用户必须在 - /etc/ppp/ppp.secret文件中有一个username/password项,或者加入 - 以下选项以使服务器通过PAP方式用/etc/password文件验证用户. + 每个以这种方式登录的用户, 都必须在 + /etc/ppp/ppp.secret 文件中给出用户名/口令, + 或者使用以下选项, 来通过 PAP 方式以 /etc/passwd + 文件提供的信息来完成身份验证。 enable passwdauth 如果您想为某些用户分配静态IP, 可以在/etc/ppp/ppp.secret中将IP号作为第三个参数指定. 参看 /usr/share/examples/ppp/ppp.secret.sample 中的例子. MS Extensions DNS NetBIOS PPPMicrosoft extensions 可以配置PPP以提供DNS和NetBIOS域名服务器地址. 要在PPP版本 1.x中启用这些扩展,必须向 /etc/ppp/ppp.conf的相关项加入以下行: enable msext set ns 203.14.100.1 203.14.100.2 set nbns 203.14.100.5 PPP版本2及以上 : accept dns set dns 203.14.100.1 203.14.100.2 set nbns 203.14.100.5 这将告诉客户端首选域名服务器和备用域名服务器. 在版本2及以上版本中, 如果省略了 set dns, PPP会使用 /etc/resolv.conf中的值. PAP 和CHAP验证 PAP CHAP 一些ISP将系统设置成使用PAP或CHAP机制来完成连接的验证部分. . 如果是这样,在您连接时ISP就不会给出login:提示符而是立即开始PPP对话. PAP安全性要比CHAP差一些,但在这里安全性并不是问题,因为密码(即使用明文传送)只是通过串行线传送. 黑客没有太多机会窃听. 参考PPP 和静态IP地址 或 PPP 和动态IP地址 节,必须做以下修改: 13 set authname MyUserName 14 set authkey MyPassword 15 set login 第 13 行: 这一行指明您的PAP/CHAP用户名. 您需要为MyUserName输入正确的值. 第 14 行: password 这一行指明您的 PAP/CHAP password密码。 您需要为 MyPassword 输入正确的值。 另外,您可能希望加入一些额外的选项,例如: 16 accept PAP 16 accept CHAP 以明确您的意图,但PAP和CHAP都是被默认接受的. Line 15: Your ISP will not normally require that you log into the server if you are using PAP or CHAP. You must therefore disable your set login string. 即时改变您的<command>ppp</command> 配置 与后台运行的ppp程序进行对话是可能的, 前提是设置了一个合适的诊断端口. 做到这一点,需要把下面的行加入到您的配置中: set server /var/run/ppp-tun%d DiagnosticPassword 0177 这行告诉 PPP在指定的&unix;域socket中侦听,当用户连接时需要给出指定的密码. %dtun设备号替换. 一旦启用了socket, 就可以在脚本中调用程序&man.pppctl.8;来处理正在运行的 的PPP. 使用PPP网络地址翻译 PPPNAT PPP可以使用内建的NAT,而不需内核支持. 这个功能可以通过在/etc/ppp/ppp.conf中的 以下行启用: nat enable yes PPP NAT也可以使用命令行选项 -nat启动. 在文件 /etc/rc.conf中也有 ppp_nat项,且是默认启用的. 如果您使用了这个特性, 您还会发现在 /etc/ppp/ppp.conf中以下 选项对于启用incoming connections forwarding是有用的: nat port tcp 10.0.0.2:ftp ftp nat port tcp 10.0.0.2:http http or do not trust the outside at all nat deny_incoming yes 最后的系统配置 PPPconfiguration 现在您已配置了ppp,但在真正工作之前还有一些事情要做.它们都与编辑 /etc/rc.conf有关. 从上依次往下看,确认设置了 hostname= 行, e.g.: hostname="foo.example.com" 如果您的ISP提供给您一个静态的IP和名字,将这个名字设为hostname是最合适的. 寻找 network_interfaces 变量. 如果要配置系统通过拨号连入ISP, 一定要将tun0设备加入这个列表,否则就删除它. network_interfaces="lo0 tun0" ifconfig_tun0= ifconfig_tun0变量应该是空的,且要创建一个名为 /etc/start_if.tun0的文件. 这个文件应该包含这一行: ppp -auto mysystem 此脚本在网络配置时被执行,开启PPP守护进程进入自动模式.如果这台机子充当一个LAN的网关, 您可能希望使用.参考相关联机手册了解更多细节. 务必在 /etc/rc.conf 中, 把路由程序设置为 NO router_enable="NO" routed 不启动 routed 服务程序非常重要, 因为 routed 总会删掉由 ppp 所建立的默认路由。 此外, 还应该确保 sendmail_flags 这一行没有 参数, 否则 sendmail 将会不断地尝试查找网络, 而这样做将会导致机器不断地进行拨号。 可以考虑: sendmail_flags="-bd" sendmail 替代的作法是当每次PPP连接建立时您必须通过键入以下命令强制 sendmail重新检查邮件队列: &prompt.root; /usr/sbin/sendmail -q 您也可以在ppp.linkup使用!bg命令自动完成这些工作: 1 provider: 2 delete ALL 3 add 0 0 HISADDR 4 !bg sendmail -bd -q30m SMTP 如果您不喜欢这样做, 可以设立一个 dfilter 以阻止 SMTP传输.参考相关文件了解更多细节 . 现在您唯一要做的事是重新启动计算机。 重起之后,可以输入: &prompt.root; ppp 然后是dial provider以开启 PPP会话. 或者如果您想让ppp自动建立会话 ,因为您有一个广域连接(且没有创建 start_if.tun0 脚本),键入: &prompt.root; ppp -auto provider 总结 当第一次设置PPP时,下面几步是必须的: 客户端: 确保 tun编译进了进核. 确保tunN 设备文件在 /dev 目录中是可用的. /etc/ppp/ppp.conf中创建一个项. pmdemand示例应该适合于绝大多数ISP. 如果您使用动态IP地址,在/etc/ppp/ppp.linkup创建一个项. 更新/etc/rc.conf 文件. 如果您要求按需拨号,创建一个start_if.tun0脚本. 服务器端: 确保tun设备已编译入内核. 确保tunN设备文件在 /dev目录中是可用的. /etc/passwd中创建一个项 (使用&man.vipw.8;程序). 在用户的home目录创建一个运行 ppp -direct direct-server或相似命令的profile. /etc/ppp/ppp.conf中创建一个项. direct-server示例应该能满足要求. /etc/ppp/ppp.linkup中创建一个项. 更新 /etc/rc.conf 文件. Gennady B. Sorokopud Parts originally contributed by Robert Huff 使用内核级PPP 设立内核级PPP PPPkernel PPP 在开始设置内核级PPP时, 需要确信pppd已经被定位在/usr/sbin 中 且存在/etc/ppp目录 . pppd能在两种模式下工作: 作为一个客户 — 您要通过PPP串行线或modem线把您的机器连接到互联网上 . PPPserver 作为服务器 —计算机已经位于网络上,且被用于通过PPP与其它计算机连接. 两种情况您都需要设立一个选项文件, (/etc/ppp/options 或者是 ~/.ppprc 如果您的计算机有多个用户使用PPP). 您还需要一些modem/serial软件(comms/kermit就很适合), 使您能够拨号并与远程主机建立连接. Trev Roydhouse Based on information provided by 使用<command>pppd</command>作为客户端 PPPclient Cisco 下面这个 /etc/ppp/options选项文件能够被用来与CISCO终端服务器的 PPP线连接. crtscts # enable hardware flow control modem # modem control line noipdefault # remote PPP server must supply your IP address # if the remote host does not send your IP during IPCP # negotiation, remove this option passive # wait for LCP packets domain ppp.foo.com # put your domain name here :<remote_ip> # put the IP of remote PPP host here # it will be used to route packets via PPP link # if you didn't specified the noipdefault option # change this line to <local_ip>:<remote_ip> defaultroute # put this if you want that PPP server will be your # default router 连接: Kermit modem 使用 Kermit (或其他 modem 程序来拨号), 然后输入您的用户名和口令 (或在远程主机上启用 PPP 所需的其他信息)。 退出 Kermit (并不挂断连接)。 键入下面这行: &prompt.root; /usr/src/usr.sbin/pppd.new/pppd /dev/tty01 19200 一定要使用正确的速度和设备名. 现在您的计算机已经用PPP连接. 如果连接失败 , 您可在文件/etc/ppp/options中添加 选项,察看控制台信息以跟踪问题. 下面这个/etc/ppp/pppup脚本能自动完成这三个步骤: #!/bin/sh ps ax |grep pppd |grep -v grep pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi ifconfig ppp0 down ifconfig ppp0 delete kermit -y /etc/ppp/kermit.dial pppd /dev/tty01 19200 Kermit /etc/ppp/kermit.dial 是一个 Kermit 脚本, 它会完成拨号, 并在远程主机上完成所有需要的身份验证过程 (这份文档的最后有一个脚本实例)。 使用下面这个脚本/etc/ppp/pppdown断开PPP连线: #!/bin/sh pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ X${pid} != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill -TERM ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi /sbin/ifconfig ppp0 down /sbin/ifconfig ppp0 delete kermit -y /etc/ppp/kermit.hup /etc/ppp/ppptest 通过执行/usr/etc/ppp/ppptest,看看pppd 是否仍在运行: #!/bin/sh pid=`ps ax| grep pppd |grep -v grep|awk '{print $1;}'` if [ X${pid} != "X" ] ; then echo 'pppd running: PID=' ${pid-NONE} else echo 'No pppd running.' fi set -x netstat -n -I ppp0 ifconfig ppp0 执行脚本 /etc/ppp/kermit.hup以挂起moderm,这个文件包含: set line /dev/tty01 ; put your modem device here set speed 19200 set file type binary set file names literal set win 8 set rec pack 1024 set send pack 1024 set block 3 set term bytesize 8 set command bytesize 8 set flow none pau 1 out +++ inp 5 OK out ATH0\13 echo \13 exit 也可以用chat 代替kermit: 以下两个文件用以建立pppd连接. /etc/ppp/options: /dev/cuaa1 115200 crtscts # enable hardware flow control modem # modem control line connect "/usr/bin/chat -f /etc/ppp/login.chat.script" noipdefault # remote PPP serve must supply your IP address # if the remote host doesn't send your IP during # IPCP negotiation, remove this option passive # wait for LCP packets domain <your.domain> # put your domain name here : # put the IP of remote PPP host here # it will be used to route packets via PPP link # if you didn't specified the noipdefault option # change this line to <local_ip>:<remote_ip> defaultroute # put this if you want that PPP server will be # your default router /etc/ppp/login.chat.script: 以下的内容应该放在一行内. ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT<phone.number> CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: <login-id> TIMEOUT 5 sword: <password> 一旦这些被安装且修改正确,您所要做的就是运行pppd,就像这样: &prompt.root; pppd 使用<command>pppd</command>作为服务器 /etc/ppp/options要包括下面这些内容: crtscts # Hardware flow control netmask 255.255.255.0 # netmask (not required) 192.114.208.20:192.114.208.165 # IP's of local and remote hosts # local ip must be different from one # you assigned to the Ethernet (or other) # interface on your machine. # remote IP is IP address that will be # assigned to the remote machine domain ppp.foo.com # your domain passive # wait for LCP modem # modem line 下面这个脚本/etc/ppp/pppserv 使pppd以服务器方式启动: #!/bin/sh ps ax |grep pppd |grep -v grep pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi # reset ppp interface ifconfig ppp0 down ifconfig ppp0 delete # enable autoanswer mode kermit -y /etc/ppp/kermit.ans # run ppp pppd /dev/tty01 19200 使用脚本/etc/ppp/pppservdown停止服务器: #!/bin/sh ps ax |grep pppd |grep -v grep pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi ifconfig ppp0 down ifconfig ppp0 delete kermit -y /etc/ppp/kermit.noans The following Kermit script (/etc/ppp/kermit.ans) will enable/disable autoanswer mode on your modem. It should look like this: set line /dev/tty01 set speed 19200 set file type binary set file names literal set win 8 set rec pack 1024 set send pack 1024 set block 3 set term bytesize 8 set command bytesize 8 set flow none pau 1 out +++ inp 5 OK out ATH0\13 inp 5 OK echo \13 out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable ; autoanswer mode inp 5 OK echo \13 exit 一个名为/etc/ppp/kermit.dial的脚本用于向远程主机 进行拨号和验证.您要根据需要定制它.要加入您的登寻名和密码.您还要根据modem 和远程主机的反应更改输入语句. ; ; put the com line attached to the modem here: ; set line /dev/tty01 ; ; put the modem speed here: ; set speed 19200 set file type binary ; full 8 bit file xfer set file names literal set win 8 set rec pack 1024 set send pack 1024 set block 3 set term bytesize 8 set command bytesize 8 set flow none set modem hayes set dial hangup off set carrier auto ; Then SET CARRIER if necessary, set dial display on ; Then SET DIAL if necessary, set input echo on set input timeout proceed set input case ignore def \%x 0 ; login prompt counter goto slhup :slcmd ; put the modem in command mode echo Put the modem in command mode. clear ; Clear unread characters from input buffer pause 1 output +++ ; hayes escape sequence input 1 OK\13\10 ; wait for OK if success goto slhup output \13 pause 1 output at\13 input 1 OK\13\10 if fail goto slcmd ; if modem doesn't answer OK, try again :slhup ; hang up the phone clear ; Clear unread characters from input buffer pause 1 echo Hanging up the phone. output ath0\13 ; hayes command for on hook input 2 OK\13\10 if fail goto slcmd ; if no OK answer, put modem in command mode :sldial ; dial the number pause 1 echo Dialing. output atdt9,550311\13\10 ; put phone number here assign \%x 0 ; zero the time counter :look clear ; Clear unread characters from input buffer increment \%x ; Count the seconds input 1 {CONNECT } if success goto sllogin reinput 1 {NO CARRIER\13\10} if success goto sldial reinput 1 {NO DIALTONE\13\10} if success goto slnodial reinput 1 {\255} if success goto slhup reinput 1 {\127} if success goto slhup if < \%x 60 goto look else goto slhup :sllogin ; login assign \%x 0 ; zero the time counter pause 1 echo Looking for login prompt. :slloop increment \%x ; Count the seconds clear ; Clear unread characters from input buffer output \13 ; ; put your expected login prompt here: ; input 1 {Username: } if success goto sluid reinput 1 {\255} if success goto slhup reinput 1 {\127} if success goto slhup if < \%x 10 goto slloop ; try 10 times to get a login prompt else goto slhup ; hang up and start again if 10 failures :sluid ; ; put your userid here: ; output ppp-login\13 input 1 {Password: } ; ; put your password here: ; output ppp-password\13 input 1 {Entering SLIP mode.} echo quit :slnodial echo \7No dialtone. Check the telephone line!\7 exit 1 ; local variables: ; mode: csh ; comment-start: "; " ; comment-start-skip: "; " ; end: Tom Rhodes Contributed by <acronym>PPP</acronym> 连接故障排除 PPPtroubleshooting 本节将讲述通过modem连接使用PPP时可能出现的问题 . 例如,您可能需要确切地知道您拨入的系统会出现一个怎样的命令行提示符.有些ISP会提供 ssword提示符,而其它的可能会出现 password; 如果没有根据情况的不同相应地编写ppp 脚本,登录就会失败.诊断ppp最常用的方法是手动进行连接 . 以下的信息会一步一步地带您完成手动连接. 检查设备节点 如果您的内核是经过重新配置的,那么就需要检查sio设备. 如果没有配置过内核, 就没什么可担心的了.只要查看 dmesg的输出以找到modem设备: &prompt.root; dmesg | grep sio 您应该找到与sio设备有关的输出. 这些就是我们需要的COM端口. 如果您的modem按照标准串行端口工作,您能在sio1COM2找到它. 如果是这样, 您只需创建serial设备,而不必重建内核. cd到/dev目录,然后运行 MAKEDEV脚本 : &prompt.root; sh MAKEDEV cuaa0 cuaa1 cuaa2 cuaa3 它会为您的系统创建串行(serial)设备. 如果modem设备连接在sio1接口(在DOS中称为COM2),那么您的modem将会是 /dev/cuaa1 手动连接 通过手动控制ppp来连接Internet 是诊断连接及获知ISP处理PPP客户端方式的一个快速,简单的方法. .让我们从PPP 命令行开始.在所有的例子中我们使用 example作为运行PPP主机的主机名.键入ppp 命令打开ppp : &prompt.root; ppp 现在我们已经打开了ppp. ppp ON example> set device /dev/cuaa1 设置modem设备,在本例子中是 cuaa1. ppp ON example> set speed 115200 设置连接速度,在本例中我们使用15,200 kbps. ppp ON example> enable dns 使ppp配置域名服务, 在文件/etc/resolv.conf中添加域名服务器行. .如果 ppp不能确定我们的主机名,可以在稍后设置. ppp ON example> term 切换到 终端样我们就能手动地控制模式,这modem. deflink: Entering terminal mode on /dev/cuaa1 type '~h' for help at OK atdt123456789 使用命令at初始化modem, 然后使用atdtISP给您的号码进行拨号. CONNECT 连接配置,如果我们遇到了与硬件无关的连接问题,可以在这里尝试解决. ISP Login:myusername 这里提示您输入用户名,输入ISP提供的用户名然后按回车. ISP Pass:mypassword 这时提示我们输入密码,输入 ISP提供的密码. 如同登录入&os;,密码不会显示. Shell or PPP:ppp 由于ISP的不同,这个提示符可能不会出现.这里我们被问及:是使用 一个运行于提供商端的Shell还是启动ppp. 这本例中,我们选择使用ppp因为我 们想得到Internet连接. Ppp ON example> 注意在这个例子中,第一个 已经大写. 这显示我们已经成功地连接上了ISP. PPp ON example> 我们已经成功通过了 ISP的验证,正在等待分配IP地址. PPP ON example> 我们得到了一个 IP 地址,成功地完成了连接. PPP ON example>add default HISADDR 这里,我们添加默认路由.在能与外界通信之前我们需要这样做,因为现在我们 只与服务器端建立了连接.如果由于已存在的路由而导致操作失败, 您可以在前加!号. 作为另外一种方式,您也可以在真正连接之前设置这些(指add default HISADDR),ppp会根据这项设定协商取 得一个新的路由. 如果一切顺利,现在我们应该能得到一个活动的Internet连接,可以使用CTRL z使其转入后台.如果您发现 PPP重新变为 ppp,那代表我们失去了连接.. 大写的P表明我们有到ISP的连接 而小写的p表明由于某种原因我们失去了连接.这便于我们了解连接状态. ppp 只有这两个状态. 诊断排错 如果您有一根直连线且似乎不能建立连接,要使用以关闭字节流的CTS/RTS.这种情况一般发 生在连接兼容PPP的终端服务器时. 当它向通信连接写入数据时,PPP就会挂起, 一直等待一个CTS, 或者一个不可能出现的Clear to Send信号。 如果使用了这个选项, 您还应使用 选项, 某些存在缺陷的硬件在完成端对端发送特定字符, 特别是 XON/XOFF 时可能会遇到困难。 请参见 &man.ppp.8; 联机手册以了解关于可用选项的更多细节, 以及如何使用它们。 如果您有一个比较旧的modem, 您要用 。 奇偶校验的默认设置是 none, 但在旧式的 (当流量大量增加时) 调制解调器和某些 ISP 被用来纠错。 您需要使用这个选项才能使用 Compuserve ISP PPP 可能并不返回命令模式, 这通常是 ISP 等待您这一端发起协商时发生了错误。 此时, 使用 ~p 命令将强制 ppp 开始发送配置信息。 如果您没有看到登陆提示, 则很可能需要使用 PAPCHAP 验证来代替前面例子中的 &unix; 风格验证。 要使用 PAPCHAP 只需在进入终端模式之前把下面的选项加入 PPP ppp ON example> set authname myusername 此处 myusername 应改为您的 ISP 分配给您的用户名。 ppp ON example> set authkey mypassword 此处 mypassword 应该为您的 ISP 分配给您的口令。 如果连接正常, 但无法查找域名, 请尝试 &man.ping.8; 某个 IP 地址来看看是否返回了信息。 如果您发现百分之百 (100%) 丢包, 那么您很可能没有分配默认路由。 请仔细检查选项 是否在连接时被设置了。 如果您能连接到远程的 IP 地址则有可能域名解析服务器的地址没有被加入到 /etc/resolv.conf。 这个文件应该是下面的样子: domain example.com nameserver x.x.x.x nameserver y.y.y.y 此处 x.x.x.xy.y.y.y 应该改为您的 ISP 的 DNS 服务器的 IP 地址。 这一信息在您注册时可能会提供给您, 不过通常只需给 ISP 打个电话就能知道了。 您还可以让 &man.syslog.3; 为您的 PPP 连接提供日志。 只需增加: !ppp *.* /var/log/ppp.log /etc/syslog.conf 中。 绝大多数情况下, 这个功能默认已经打开了。 Jim Mock Contributed (from http://node.to/freebsd/how-tos/how-to-freebsd-pppoe.html) by 使用基于以太网的PPP(PPPoE) PPPover Ethernet PPPoE PPP, over Ethernet 本节将介绍如何建立基于以太网的PPP (PPPoE). 配置内核 对于PPPOE,并没有必须的内核配置. 如果必需的netgraph支持没有编译入内核 ,它可以由 ppp动态加载. 设置<filename>ppp.conf</filename> 以下是一个ppp.conf的例子: default: set log Phase tun command # you can add more detailed logging if you wish set ifaddr 10.0.0.1/0 10.0.0.2/0 name_of_service_provider: set device PPPoE:xl1 # replace xl1 with your Ethernet device set authname YOURLOGINNAME set authkey YOURPASSWORD set dial set login add default HISADDR 运行<application>ppp</application> 作为root,您可以执行: &prompt.root; ppp -ddial name_of_service_provider 启动时运行<application>ppp</application> 在文件/etc/rc.conf加入以下内容: ppp_enable="YES" ppp_mode="ddial" ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO ppp_profile="name_of_service_provider" 使用 PPPoE 服务标签 在某些时候,有必要使用一个服务标签来建立您的连接.服务标签用于区分同一网络中的不同服务器. 您可以在ISP提供的文档中找到必要的服务标签信息.若不能找到,向您的ISP询求技术支持. 作为最后的方法, 您可以试试 Roaring Penguin PPPoE, 它可以在 Ports Collection 中找到。 然而需要注意的是, 它可能会清楚 modem 的固件, 并使其无法正常工作, 因此一定要仔细考虑之后再做这个操作。 简单地安装由服务提供商随 modem 提供的程序。 随后, 选择 System 菜单。 您的配置文件应该会在这里列出。 一般来说它的名字应该是 ISP 配置文件名 (service tag, 服务标签) 将被用于 PPPoE 在 ppp.conf 中的配置项, 作为服务商 set device 命令的一部分 (参见 &man.ppp.8; 联机手册以了解更多细节)。 它应该类似下面的样子: set device PPPoE:xl1:ISP 记住将xl1换成实际的以太网设备. 记住将 ISP 换成您刚刚找到的profile名. 获得更多的信息,请参考: Cheaper Broadband with FreeBSD on DSL by Renaud Waldura. Nutzung von T-DSL und T-Online mit FreeBSD by Udo Erdelhoff (in German). 带有一个&tm.3com; <trademark class="registered">HomeConnect</trademark>ADSL Modem的PPPOE双重连接 这个modem不遵循RFC 2516 (A Method for transmitting PPP over Ethernet (PPPoE), written by L. Mamakos, K. Lidl, J. Evarts, D. Carrel, D. Simone, and R. Wheeler). 而是使用不同的数据包格式作为以太网的框架.请向 3Com抱怨,如果您认为它应该遵守PPPOE的规范. 为了让FreeBSD能够与这个设备通信,必须设置sysctl.通过更改/etc/sysctl.conf,这一步 可以在启动时自动完成: net.graph.nonstandard_pppoe=1 - 或直接执行命令: - sysctl net.graph.nonstandard_pppoe=1. + 或者, 也可以直接执行下面的命令: + + &prompt.root; sysctl net.graph.nonstandard_pppoe=1 很不幸,由于这是系统全局设置,无法同时与正常的PPP客户端(或服务器) 和&tm.3com;HomeConnect ADSL Modem通信 . Using <application>PPP</application> over ATM (PPPoA) PPPover ATM PPPoA 基于ATM的PPP 以下将介绍如何设置基于ATM的PPP(PPPoA). PPPoA是欧洲DSL提供商的普遍选择 . 使用带有一个Alcatel &speedtouch;USB的PPPoA 针对这一设备的 PPPoA 支持, 在 FreeBSD 中是作为 port 提供的, 因为其固件使用了 阿尔卡特许可协议, 因而不能与 FreeBSD 的基本系统一起免费地再发布。 使用 Ports Collection 可以非常方便地安装 net/pppoa port, 之后按照它提供的指使操作就可以了。 和许多 USB 设备类似, 阿尔卡特的 &speedtouch; USB 需要从主机上下载固件才能够正常工作。 您可以在 &os; 中将此操作自动化, 这样当设备插到某个 USB 口的时候就会自动下载固件了。 可以在 /etc/usbd.conf 文件中加入下面的信息来让它自动完成固件的传送。 注意, 必须以 root 用户的身份编辑它。 device "Alcatel SpeedTouch USB" devname "ugen[0-9]+" vendor 0x06b9 product 0x4061 attach "/usr/local/sbin/modem_run -f /usr/local/libdata/mgmt.o" 要启动USB守护进程usbd, 在/etc/rc.conf加入以下行: usbd_enable="YES" 也可以将ppp设置成启动时拨号. 向 /etc/rc.conf加入以下这几行. 同样地您需要以root用户登录. ppp_enable="YES" ppp_mode="ddial" ppp_profile="adsl" 为了使其正常工作,您需要使用net/pppoa port提供的ppp.conf样例. 使用mpd 可以使用 mpd 来连接多种类型的服务, 特别是 PPTP 服务。 您可以在 Ports Collection 中找到 mpd, 它的位置是 net/mpd。 许多 ADSL modem 需要在 modem 和计算机之间建立一条 PPTP 隧道, 而阿尔卡特 &speedtouch; Home 正是其中的一种。 首先需要从 port 完成安装, 然后才能配置 mpd 来满足您的需要, 并完成服务商的配置。 port 会把一系列包括了详细注解的配置文件实例放到 PREFIX/etc/mpd/。 注意, 这里的 PREFIX 表示 ports 安装的目录, 默认情况下, 应该是 /usr/local/。 关于配置 mpd 的完整说明, 会以 HTML 格式随 port 一起安装。 这些文件将放在 PREFIX/share/doc/mpd/。 下面是通过 mpd 连接 ADSL 服务的一个简单例子。 配置被分别放到了两个文件中, 第一个是 mpd.conf default: load adsl adsl: new -i ng0 adsl adsl set bundle authname username set bundle password password set bundle disable multilink set link no pap acfcomp protocomp set link disable chap set link accept chap set link keep-alive 30 10 set ipcp no vjcomp set ipcp ranges 0.0.0.0/0 0.0.0.0/0 set iface route default set iface disable on-demand set iface enable proxy-arp set iface idle 0 open username用来向您的ISP进行验证. password用来向您的ISP进行验证. mpd.links包含连接的信息: adsl: set link type pptp set pptp mode active set pptp enable originate outcall set pptp self 10.0.0.1 set pptp peer 10.0.0.138 运行mpd的主机的IP地址. ADSL modem的IP地址.Alcatel &speedtouch; Home 默认的是 10.0.0.138. 初始化连接: &prompt.root; mpd -b adsl 您可以通过以下命令查看连接状态: &prompt.user; ifconfig ng0 ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500 inet 216.136.204.117 --> 204.152.186.171 netmask 0xffffffff 使用mpd连接ADSL服务是推荐的方式. 使用pptpclient 也可以使用net/pptpclient连接其它的 PPPoA. 为了使用net/pptpclient连接 DSL服务,需要安装port或package并编辑/etc/ppp/ppp.conf.您需要有 root权限以进行这两项操作.以下是ppp.conf中的一个示例项. 参考ppp的联机手册&man.ppp.8;,以获取更多有关ppp.conf 选项的信息. adsl: set log phase chat lcp ipcp ccp tun command set timeout 0 enable dns set authname username set authkey password set ifaddr 0 0 add default HISADDR The username of your account with the DSL provider. The password for your account. 由于您必须将帐号密码以明文的方式放入ppp.conf 您应该确保没有任何人能看到此文件的内容.以下一系列命令将会确保此文件只对 root用户可读.参考&man.chmod.1;和&man.chown.8; 的联机手册以获得更多信息. &prompt.root; chown root:wheel /etc/ppp/ppp.conf &prompt.root; chmod 600 /etc/ppp/ppp.conf 以下将为到DSL路由器的会话打开一个tunnel. 以太网DSL modem有一个设置的局域网IP地址. 以Alcatel &speedtouch; Home为例,这个地址是 10.0.0.138.路由器的文档应该会告诉您它使用地址.执行以下命令 以打开tunnel并开始会话: &prompt.root; pptp address adsl 您应该在命令的最后加上(&)号,否则 pptp 无法返回到命令行提示符. 要创建一个 tun虚拟设备用于进程pptpppp 之间的交互.一旦您返回到了命令行,或者 pptp 进程确认了一个连接,您可以这样检查tunnel设备: &prompt.user; ifconfig tun0 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 inet 216.136.204.21 --> 204.152.186.171 netmask 0xffffff00 Opened by PID 918 如果您无法连接,一般可以通过telnet或者web浏览器检查路由器(modem)的配置. 如果依旧无法连接,您应该检查pptp的输出及ppp的日志文件 /var/log/ppp.log 以获得线索. Satoshi Asami Originally contributed by Guy Helmer With input from Piero Serini 使用SLIP SLIP 设置SLIP客户端 SLIPclient - 下面是一个在静态主机网络上设置FreeBSD机器的方法.对于动态主机名分配(您的地址在每次拨号时都会改变), - 您可能还需要更复杂的设置. - - 首先,确定您的modem连接的串行口. - 许多人会设置符号连接, 比如/dev/modem指向真实的设备名 - /dev/cuaaN.这充许您抽像真实的设备名. 当您需 - 要在/etc.kermrc文件中修复整个系统上的许多文件时, - 这是一件非常麻烦的事情! + 下面是在静态主机网络上配置 FreeBSD 机器使用 SLIP 的方法。 + 对于动态主机名分配 (您的地址会随每次拨号而不同), + 您可能需要稍复杂一些的设置。 + + 首先, 您需要确认调制解调器所连接的串口。 + 许多人会设置一个符号连接, 例如 + /dev/modem, 用以指向实际的设备名, + /dev/cuaaN (或在 &os; 6.X 下是 + /dev/cuadN)。 这样您就可以对实际的设备名进行抽象, + 以备调制解调器换到其他串口时方便调整之用。 + 不然, 在系统中修改一大堆 /etc 下的文件以及 + .kermrc 将是非常麻烦的事情! - /dev/cuaa0 is - COM1, cuaa1 is + /dev/cuaa0 (or /dev/cuad0 under &os; 6.X) is + COM1, cuaa1 (or /dev/cuad1) is COM2, etc. - 确保您的内核文件包含以下内容: - - pseudo-device sl 1 + 确保您的内核文件包含以下内容: + + device sl - 在 &os; 5.X 中, 则应使用: + 对于 &os; 4.X, 则是: - device sl + pseudo-device sl 1 这包含在GENERIC内核,所以这应该不会是个问题,除非您 已经删除了它。 只需做一次的事情 把您本地网络上的机器、 网关以及域名服务器, 都加入到 /etc/hosts 文件中。 我们的是下面这个样子: 127.0.0.1 localhost loghost 136.152.64.181 water.CS.Example.EDU water.CS water 136.152.64.1 inr-3.CS.Example.EDU inr-3 slip-gateway 128.32.136.9 ns1.Example.EDU ns1 128.32.136.12 ns2.Example.EDU ns2 在 FreeBSD 5.0 之前的版本中, 请务必确保 /etc/host.conf 中的 hostsbind 之前出现。 从 FreeBSD 5.0 开始, 系统转而使用 /etc/nsswitch.conf 文件, 请确认在这个文件中 一行里, files 出现在 dns 之前。 如果没有这些参数, 可能会发生很奇怪的事情。 编辑/etc/rc.conf. 编辑以下这行设置主机名(hostname): hostname="myname.my.domain" 应该用您主机的Internet全名代替. - - 改变以下这些行将sl0添加到网络接口 - 列表中: - - network_interfaces="lo0" - - 改为: - - network_interfaces="lo0 sl0" - - - - 加入以下这一行设置sl0的启动标志: - - ifconfig_sl0="inet ${hostname} slip-gateway netmask 0xffffff00 up" - - default route 改变这一行以指明默认的路由: defaultrouter="NO" 改为: defaultrouter="slip-gateway" 创建文件/etc/resolv.conf,写入以下内容: domain CS.Example.EDU nameserver 128.32.136.9 nameserver 128.32.136.12 nameserver domain name 正如您看到的, 这些行设置了域名服务器.当然,实际的域名和IP地址取决于您的环境. 设置roottoor的密码(其它任何没有密码的帐号). 重启计算机,然后确认使用了正确的主机名. 创建一个SLIP连接 SLIPconnecting with 在命令提示符之后输入 slip 进行拨号, 输入您的机器名和口令。 具体需要输入什么, 与您的环境密切相关。 如果使用 Kermit, 则可以使用类似下面的脚本: # kermit setup set modem hayes set line /dev/modem set speed 115200 set parity none set flow rts/cts set terminal bytesize 8 set file type binary # The next macro will dial up and login define slip dial 643-9600, input 10 =>, if failure stop, - output slip\x0d, input 10 Username:, if failure stop, - output silvia\x0d, input 10 Password:, if failure stop, - output ***\x0d, echo \x0aCONNECTED\x0a 当然, 您还需要修改用户名和口令来满足实际需要。 完成这些操作之后, 只需在 Kermit 提示符之后输入 slip 就可以连接了。 将密码以纯文本的形式存放在文件系统无论如何都是个 主意。 请考虑这样做的风险。 在这里退出 Kermit (也可以用 Ctrl z 将其挂起), 以 root 用户键入: &prompt.root; slattach -h -c -s 115200 /dev/modem 如果您能ping通路由器另一端的主机,就是连接好了! 如果不行, 您可以使用选项代替 作为slattach的参数. 关闭连接 按下面的步骤做: &prompt.root; kill -INT `cat /var/run/slattach.modem.pid` 来杀掉 slattach。 切记上述操作只有以 root 身份才能完成。 接下来回到 kermit (如果之前是将它挂起了, 则使用 fg) 并退出 (q)。 在 &man.slattach.8; 联机手册中提到, 必须使用 ifconfig sl0 down 才能将接口标记为关闭, 但和这样做似乎没有什么区别。 (ifconfig sl0 仍然报告同样的东西。) 有时, 您的 modem 可能会拒绝挂断。 这种情况下, 只需重新启动 kermit 并再次退出它就可以了。 一般来说试二次就可以了。 问题解答 如果还不行, 尽管发邮件到 &a.net.name; 邮件列表来提问。 常见的问题包括: 执行slattach时不使用选项 (这应该不是关键的,但有些用户报告这样做解决了问题.) 使用替换 (在一些字体下很难看出不同). 试试ifconfig sl0来查看您的接口状态.例如,您可以这样做: &prompt.root; ifconfig sl0 sl0: flags=10<POINTOPOINT> inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00 如果在使用 &man.ping.8; 时得到了 no route to host 这样的提示, 则说明您的路由表可能有问题。 可以用 netstat -r 命令来显示当前的路由: &prompt.root; netstat -r Routing tables Destination Gateway Flags Refs Use IfaceMTU Rtt Netmasks: (root node) (root node) Route Tree for Protocol Family inet: (root node) => default inr-3.Example.EDU UG 8 224515 sl0 - - localhost.Exampl localhost.Example. UH 5 42127 lo0 - 0.438 inr-3.Example.ED water.CS.Example.E UH 1 0 sl0 - - water.CS.Example localhost.Example. UGH 34 47641234 lo0 - 0.438 (root node) 前述的例子来自于一个非常繁忙的系统. 您系统上的这些数字会因网络活动的不同而改变. 设置SLIP服务器 SLIPserver 本文提供了在FreeBSD上设置SLIP服务的建议,主要是指配置您的系统使其能根据远程SLIP客户端的 登录自动地开启连接. 前提条件 TCP/IP networking 这一节本身就是非常技术性的, 所以要求有一定的背景知识.本节假定您熟悉TCP/IP网络协议,特别是网络和和结点寻址 ,网络地址掩网, 划分子网, 路由, 路由协议(比如RIP).在一个拨号服务器上配置SLIP需要这些概念性的知识. 如果您不熟悉它们,请先阅读Craig Hunt的 TCP/IP 网络管理 由O'Reilly & Associates, Inc.出版(ISBN号为0-937175-82-X),或者Douglas Comer有关TCP/IP 协议的书籍. modem - 另外还假定您已经设置好了您的modem并配置了相应的文件允许通过modem登录. 如果您还没有准备好您的系统,请 - 参考拨号服务的配置指南; 如果您能使用网页浏览器,也可以浏览 - http://www.FreeBSD.org/docs.html上的指南列表. - 您还需要参考&man.sio.4;以获取串行端口设备驱动的信息, - &man.ttys.5;,&man.gettytab.5;, &man.getty.8;, & &man.init.8;以获取配置系统以接受modem登录的 - 相关信息,也许还有 &man.stty.1;以获取有关串行口参数设置的信息(比如clocal指直线串行 - 接口). + 此外还假定您已经配置好了您的调制解调器以及相应的系统文件, + 以允许通过调制解调器进行登录。 如果您还没有为此配置好系统, + 请参见 以了解关于如何进行拨号服务的配置。 + 您可能也会想看一看 &man.sio.4; 的联机手册, + 以了解关于串口设备驱动的进一步信息, 以及 &man.ttys.5;、 + &man.gettytab.5;、 &man.getty.8; & &man.init.8; + 上关于怎样配置系统来接受来自调制解调器的登录请求的具体情况, + 还有 &man.stty.1; 以了解关于设置串口参数 + (例如 clocal 表示串口直联) 等。 快速浏览 使用FreeBSD作为SLIP服务器,在典型配置时,它是这样工作的: 一个SLIP客户拨号并以专用的login ID登录到FreeBSD SLIP服务器系统.这个用户使用/usr/sbin/sliplogin 作为shell.sliplogin程序在文件/etc/sliphome/slip.hosts中查找这个用户的项, 如果找到了匹配项,就将串行线连接到一个可用的SLIP接口,然后运行shell脚本/etc/sliphome/slip.login 以配置SLIP接口. 一个SLIP服务器登录的例子 例如,如果一个SLIP用户的ID是Shelmerg, 在/etc/master.passwdShelmerg的项如下的所示: Shelmerg:password:1964:89::0:0:Guy Helmer - SLIP:/usr/users/Shelmerg:/usr/sbin/sliplogin Shelmerg登录时, sliplogin在文件 /etc/sliphome/slip.hosts中搜索与用户ID匹配的行;如下所示: Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp sliplogin找到这条区配行, 并将串行线与另一个可用的SLIP接口连起来, 然后执行/etc/sliphome/slip.login脚本: /etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp - 如果一切顺利, - /etc/sliphome/slip.loginsliplogin - )绑定的接口(在上面的例子中,是slip.login参数列表的第一个参数)运行 - ifconfig以设置SLIP接口的本地IP地址(dc-slip),远程IP地址(sl-helmer), - 掩码(0xfffffc00),及其它附加的标志(autocomp). 如果出现错误 - ,sliplogin 通常会使用syslog守护进程将有用的信息写入 - /var/log/messages 参考&man.syslogd.8;和&man.syslog.conf.5;联机手册及/etc/syslog.conf, - 以获知syslogd是如何工作的). - - 好了,让我们开始设置系统 . + 如果一切顺利 + /etc/sliphome/slip.login 将在 sliplogin + 绑定的 SLIP 接口上发出 + ifconfig (前述的例子中是 SLIP 接口 + 0, 这是 slip.login 的第一个参数), + 以设置本地 IP 地址 (dc-slip)、 远程 IP 地址 + (sl-helmer)、 这一 SLIP + 接口的子网掩码 (0xfffffc00), + 以及任何其他标志 (autocomp)。 + 如果发生错误, sliplogin 通常会通过 + syslogd 的 daemon facility + 记下有用的信息, 前者会把这些信息保存到 /var/log/messages + (参见 &man.syslogd.8; 和 &man.syslog.conf.5; 以及 + /etc/syslog.conf 的联机手册, 以了解 + syslogd 在记录什么, + 以及这些内容将被记在哪里)。 内核配置 kernelconfiguration - FreeBSD默认的内核一般定义了两个SLIP接口:(sl0和 - sl1); 您可以使用 netstat - -i命令查看您的内核是否定义了这些接口. - - netstat -i样例输出: - - Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll -ed0 1500 <Link>0.0.c0.2c.5f.4a 291311 0 174209 0 133 -ed0 1500 138.247.224 ivory 291311 0 174209 0 133 -lo0 65535 <Link> 79 0 79 0 0 -lo0 65535 loop localhost 79 0 79 0 0 -sl0* 296 <Link> 0 0 0 0 0 -sl1* 296 <Link> 0 0 0 0 0 + SLIP - netstat -i显示的sl0 - sl1接口表明您的内核内建了两个SLIP接口. ( - sl0sl1 之后的星号表明 - 这两个接口是关闭的.) + &os; 的默认内核 (GENERIC) + 提供了 SLIP (&man.sl.4;) 支持; 使用定制的内核时, + 您必须把下面的设置加入到配置文件: - 然而,FreeBSD默认的内核并没有配置额外的包 (默认的,您的FreeBSD不会被作为一个路由器) - 因为Internet RFC对Internet主机有特殊要求(参考 - RFCs 1009 [Requirements for Internet Gateways], 1122 - [Requirements for Internet Hosts — Communication Layers], - 还有 1127 [A Perspective on the Host Requirements RFCs]). - 如果您想让FreeBSD SLIP服务器成为一个路由器,就必须编辑 - /etc/rc.conf,将gateway_enable变量设为. + device sl - 然后您要重新启动使新的设置生效. + 在 &os; 4.X 下, 则是: - 您会发现靠近默认内核配置文件(/sys/i386/conf/GENERIC)的最后, - 有这么一行: + pseudo-device sl 2 - pseudo-device sl 2 + + 行末的数字表示允许同时使用的最大 SLIP 连接数。 + 从 &os; 5.0 开始, &man.sl.4; + 驱动具有了 自动克隆 的能力, + 因而不再需要这一设置。 + - SLIP - 这一行定义内核中可用的SLIP设备个数;行末尾的数字表示同时进行操作的SLIP连接的最大个数. + 默认情况下, 您的 &os; 计算机不会转发包。 + 如果您希望将 FreeBSD SLIP 服务器作为路由器使用, + 就需要修改 /etc/rc.conf 文件, + 并加入一项将 gateway_enable 变量设为 + 的设制。 + + 接下来需要重新启动以便使新设置生效。 - 请参考FreeBSD内核配置这一章以获取配置内核的帮助. + 请参见 以了解如何配置 FreeBSD + 内核, 并获得在重新配置内核方面的指导。 Sliplogin配置 正如先前所提到的, /etc/sliphome目录有三个文件构成/usr/sbin/sliplogin的配置 (参考sliplogin的联机手册&man.sliplogin.8;): slip.hosts, 定义SLIP用户及有关IP地址; slip.login,一般只配置SLIP接口; 文件 slip.logout(可选的),串行连接终止时,撤消slip.login所做的修改. <filename>slip.hosts</filename> Configuration /etc/sliphome/slip.hosts里的每行包含至少四个元素,元素之间由空格隔开: SLIP用户的登录ID SLIP连接的本地地址(指SLIP服务器) SLIP连接的远程地址 网络掩网 本地和远程地址可以是主机名 (通过文件/etc/hosts或者域名服务解析为IP地址, - 在FreeBSD 5.X上这取决于文件/etc/nsswitch.conf的设置 - 在FreeBSD 4.X里,则是/etc/host.conf),网络掩网可以是一个 + 在FreeBSD 5.X上这取决于文件/etc/nsswitch.conf的设置; + 而在FreeBSD 4.X里,则是/etc/host.conf),网络掩网可以是一个 能通过文件/etc/networks解析的名字.在一个样例系统中, /etc/sliphome/slip.hosts是这样的: # # login local-addr remote-addr mask opt1 opt2 # (normal,compress,noicmp) # Shelmerg dc-slip sl-helmerg 0xfffffc00 autocomp - 在这行的末尾是一个或多个选项. + 在这行末尾是一或多个选项: —不压缩报头 — 压缩报头 —如果远程端允许,压缩报头 —禁用ICMP数据包 (这样就会丢弃所有的ping数据包,不占用您的带宽) SLIP TCP/IP networking 对SLIP连接的本地及远程地址的选择取决是您是准备在SLIP服务器上使用 TCP/IP 子网还是使用ARP代理 (它并不是真正的ARP代理,而是我们在本节用于介绍的术语). 如果您不能确定选择何种方式或者如何分配地址,请参考"前提条件"()里列出的TCP/IP书籍 或者向您的IP网络管理员请教. 如果您准备为您的SLIP客户使用一个独立的子网 , 您需要先从分配得到的网络号中取出一个子网号然后再在这个子网里给每个SLIP客户分配IP地址. 然后您还需要通过SLIP服务器在最近的IP路由器上配置一个指向SLIP子网的静态路由. Ethernet 如果您要使用 代理 ARP的方式,您需要从SLIP服务器的以太子网中为每个SLIP客户分配IP地址, 还必须修改/etc/sliphome/slip.login/etc/sliphome/slip.logout脚本以使用 &man.arp.8;来管理proxy-ARP在服务器ARP表中的项. <filename>slip.login</filename> Configuration 典型的/etc/sliphome/slip.login 如下所示: #!/bin/sh - # # @(#)slip.login 5.1 (Berkeley) 7/1/90 # # generic login file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 inet $4 $5 netmask $6 这个slip.login脚本仅仅为带有相应本地及远程地址和掩码的SLIP接口执行 ifconfig . 如果您决定使用ARP代理 方式(而非为您的SLIP客户使用独立的子网),您的/etc/sliphome/slip.login 应该是这样: #!/bin/sh - # # @(#)slip.login 5.1 (Berkeley) 7/1/90 # # generic login file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 inet $4 $5 netmask $6 # Answer ARP requests for the SLIP client with our Ethernet addr /usr/sbin/arp -s $5 00:11:22:33:44:55 pub slip.login新加的行arp -s $5 00:11:22:33:44:55 pub在SLIP服务器的ARP表中加入了一个表项.这个ARP项使得 每当这个以太网上的其它IP节点对SLIP客户端IP地址进行ARP请求时,SLIP服务器会以自已的以太网MAC地址作为回应 . EthernetMAC address 当使用以上的例子时, 一定要将 以太网MAC地址(00:11:22:33:44:55)替换成您系统网卡的MAC地址,否则ARP代理将 完全无法工作!您可以查看netstat -i输出结果以取得以太网MAC地址; 输出的第二行应该是这样: ed0 1500 <Link>0.2.c1.28.5f.4a 191923 0 129457 0 116 这行表明这个系统的以太网MAC地址是00:02:c1:28:5f:4anetstat -i输出的以太网MAC地址必须改成用冒号隔开,并且要单个十六进数前加上. 这是&man.arp.8;要求的格式; 参考&man.arp.8; 的联机手册以获取完整的使用方法. - 创建 - /etc/sliphome/slip.login和 - /etc/sliphome/slip.logout时,一定要设置 - 执行(execute)位 (chmod 755 - /etc/sliphome/slip.login /etc/sliphome/slip.logout) - ,否则 sliplogin将无法执行它. + 在编写 + /etc/sliphome/slip.login 和 + /etc/sliphome/slip.logout 时, 一定要设置 + 可执行 (execute) 位 (换言之, chmod 755 + /etc/sliphome/slip.login /etc/sliphome/slip.logout), + 否则 sliplogin将无法执行它。 <filename>slip.logout</filename>配置 /etc/sliphome/slip.logout并不是必需的 (除非您使用了ARP代理),如果您准备创建它,这里有一个基本的 slip.logout 脚本的例子 : #!/bin/sh - # # slip.logout # # logout file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 down If you are using proxy ARP, you will want to have /etc/sliphome/slip.logout remove the ARP entry for the SLIP client: #!/bin/sh - # # @(#)slip.logout # # logout file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 down # Quit answering ARP requests for the SLIP client /usr/sbin/arp -d $5 - 命令arp -d $5 删除slip.login在SLIP客户登录时添加的ARP项 . + arp -d $5 将删除由 代理 ARP + slip.login 在 SLIP 客户程序登录时所生成的 + ARP 项。 - 再次强调:确保您创建/etc/sliphome/slip.logout时设置了执行位 - (ie, chmod 755 /etc/sliphome/slip.logout). + 再次强调: 建立 + /etc/sliphome/slip.logout 之后, + 一定要设置可执行位 (也就是说, chmod 755 + /etc/sliphome/slip.logout)。 路由考虑 SLIP routing 如果没有使用 代理 ARP 的方法来在您的 SLIP 客户机和网络的其余部分 (也可能是 Internet) 之间路由数据包, 您可能需要增加离您最近的默认路由器的静态路由, 以便通过 SLIP 服务器来在 SLIP 客户机子网上进行路由。 静态路由 static routes 向您最近的默认路由添加一个静态路由可以说是很麻烦 (或者说是不可能,如果您没有权限这么做)。 如果在您的组织中使用多路由器网络, 有些路由器 (比如 Cisco 和 Proteon 生产的) 不但要配置指向 SLIP 子网的路由, 而且还需要配置将哪些静态路由传给其它的路由器。 所以一些专家意见和问题解答对于使基于静态路由表的路由正常工作很有必要。 运行<application>&gated;</application> &gated; &gated;现在是一个私有软件,无法取得它的源代码 ( &gated;上有更多的信息 ).This section only exists to ensure backwards compatibility for those that are still using an older version. 另一种避免静态路由所造成的头疼的方法, 是在您的 FreeBSD SLIP 服务器上安装 &gated;, 并配置它使用合适的路由协议 (RIP/OSPF/BGP/EGP) 来告诉其他路由器您的 SLIP 子网的存在。 您需要编写一个 /etc/gated.conf 文件来配置 &gated;; 这里是 FreeBSD SLIP 服务器作者编写的一个例子: # # gated configuration file for dc.dsu.edu; for gated version 3.5alpha5 # Only broadcast RIP information for xxx.xxx.yy out the ed Ethernet interface # # # tracing options # traceoptions "/var/tmp/gated.output" replace size 100k files 2 general ; rip yes { interface sl noripout noripin ; interface ed ripin ripout version 1 ; traceoptions route ; } ; # # Turn on a bunch of tracing info for the interface to the kernel: kernel { traceoptions remnants request routes info interface ; } ; # # Propagate the route to xxx.xxx.yy out the Ethernet interface via RIP # export proto rip interface ed { proto direct { xxx.xxx.yy mask 255.255.252.0 metric 1; # SLIP connections } ; } ; # # Accept routes from RIP via ed Ethernet interfaces import proto rip interface ed { all ; } ; RIP 上面这个 gated.conf 示例文件, 将把关于 SLIP 子网 xxx.xxx.yy 的信息, 通过 RIP 广播到 Ethernet 上; 如果您使用了的 Ethernet 驱动不是 ed, 则需要把 ed 改为相应的网络接口。 这个例子也配置了将跟踪信息写到 /var/tmp/gated.output 以提供调试 &gated; 活动的信息; 当然, 如果 &gated; 工作正常, 就可以关闭这些跟踪信息了。 您需要把 xxx.xxx.yy 改成您自己的 SLIP 子网 (一定要同时修改 proto direct 小节)。 一旦在系统中安装并配置了 &gated;, 就可以告诉 FreeBSD 启动脚本来运行 &gated; 而不是 routed 了。 最简单的办法,是配置 routerrouter_flags 两个 /etc/rc.conf 变量。 请参见 &gated; 的联机手册, 以了解更多关于命令行参数的信息。 diff --git a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml index 4e0a0971b7..e46d84fcec 100644 --- a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml @@ -1,2302 +1,2302 @@ 串口通讯 概述 串口通讯 &unix; 一直都是支持串口通讯的。事实上, 早期的 &unix; 系统就是利用串行线来输入和输出数据的。 那时常见的 终端 包括一个每秒10个字符的串行打印机和键盘, 现在这些已经发生了很大的变化。 这章将介绍一些利用 FreeBSD 进行串行通讯的方法。 读完这章,您将了解到: 如何通过终端连接到您的FreeBSD系统。 如何使用modem拨号到远程主机。 如何允许远程用户通过modem登录到您的系统。 如何从串行控制台引导您的系统。 阅读这章之前,您应当了解: 如何配置和安装一个新的内核。()。 理解UNIX的权限和进程()。 准备您打算使用的串行设备 (modem或多插口卡) 的技术参考手册。 介绍 术语 bits-per-second bps 每秒位— 数据的传输速度 DTE DTE 数据终端设备 — 如您的计算机 DCE DCE 数据通讯设备 — 如您的modem RS-232 RS-232C cables 用于硬件串行通讯的EIA标准 当讨论通讯数据速度的时候,这节不会使用术语 baud。Baud指电气标准传输率,它已经使用了很长时间, 而 bps (bits per second) 才是正确使用的术语 (至少它不会打扰那些爱争吵的家伙)。 线缆和端口 要连接 modem 或终端到您的 FreeBSD 系统, 您需要有一个串口以及连接到您串行设备所需的线缆。 如果您比较熟悉硬件和它要求的线缆, 则可以跳过这节。 线缆 有好几种不同的串行线缆。 两个最普通的类型是 null-modem 线缆和标准RS-232线缆。 您硬件的规格说明会有详细描述。 Null-modem线缆 null-modem cable 一根null-modem线缆会直接通过像 地信号 这样的信号,而转换其他的信号。 例如, 数据发送 连到对端的 数据接收 引脚上。 如果需要, 您可以自己做一个null-modem的线缆。 下面这个表列出了这个线缆 DB-25 头上的 RS-232C 信号名和引脚标号。 信号 引脚 # 引脚 # 信号 SG 7 连接到 7 SG TD 2 连接到 3 RD RD 3 连接到 2 TD RTS 4 连接到 5 CTS CTS 5 连接到 4 RTS DTR 20 连接到 6 DSR DCD 8 6 DSR DSR 6 连接到 20 DTR 在连接头里面连接好数据发送就绪 (DSR)和 载波检测 (DCD) 两个信号,然后连接到对端的 数据终端就绪 (DTR)。 标准RS-232C线缆 RS-232C cables 一个标准的串行线缆会直接通过所有的RS-232C信号。 这是连接一个modem到您的 FreeBSD 系统的线缆类型, 线缆的类型需要针对一些终端。 端口 串行端口是FreeBSD主机与终端传输数据的设备。 这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。 端口的种类 存在好几种端口。 在购买和做线缆之前, 您需要确定它是否适合您机器的终端。 绝大多数的终端有DB25端口。个人计算机, 也包括运行 FreeBSD 的PC机, 通常都会有 DB25 或 DB9 插口。 如果您的计算机有一个多插口的串口卡, 则可以使用RJ-12 或RJ-45端口。 请仔细看看硬件的说明, 此外您也可以通过外观了解是什么插口。 端口名称Port Names 在FreeBSD中,您可以通过 /dev 目录中的一个记录来访问每个串行端口。有两种不同的记录: 呼入端口被命名为/dev/ttydN, 这里 N 是端口号,从零开始。 通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测 (DCD) 信号来工作。 呼出端口被命名为 /dev/cuaaN。 您通常不使用呼出端口作为终端, 只使用modem。 如果串行线或终端不支持载波检测数据传输, 您可以使用呼出端口。 如果您已经连接一个终端到第一个串行端口 (在 &ms-dos; 上是COM1), 则可以使用 /dev/ttyd0 来作为终端。 如果它是在第二个串行端口 (COM2), 那就是 /dev/ttyd1,等等。 内核配置 FreeBSD默认支持4个串行端口。在&ms-dos;下,这些是 COM1COM2COM3, 和 COM4。FreeBSD当前支持 dumb 多插口串行接口卡,如 BocaBoard 1008 和 2016,与许多 Digiboard 和 Stallion Technologies 制造的智能多接口卡一样好。 然而, 默认的内核只会寻找标准的COM端口。 要看看您的内核是否支持您的串口,只要在内核启动时查看一下启动信息, 或使用 /sbin/dmesg 命令重新检测内核启动信息。 特别的,寻找以sio字符启动的信息。 提示:要看看带有sio字符的信息, 可以使用下面的命令: &prompt.root; /sbin/dmesg | grep 'sio' 例如,在一个带有4个串口的系统上,这些是串口特定的内核启动信息: sio0 at 0x3f8-0x3ff irq 4 on isa sio0: type 16550A sio1 at 0x2f8-0x2ff irq 3 on isa sio1: type 16550A sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A sio3 at 0x2e8-0x2ef irq 9 on isa sio3: type 16550A 如果您的内核没有认出您的所有串口,您需要为您的系统定制内核。 更多有关配置内核的细节,可以看看第9章 在您的内核配置文件中相关的设备行是这样的,FreeBSD 4.X: device sio0 at isa? port port IO_COM1 irq 4 device sio1 at isa? port port IO_COM2 irq 3 device sio2 at isa? port IO_COM3 irq 5 device sio3 at isa? port IO_COM4 irq 9 FreeBSD 5.X: device sio 您可以注释掉或完全删除您没有的设备。 FreeBSD 5.X 需要修改 /boot/device.hints文件。请看看 &man.sio.4; 的有关如何为您的多插口主板写入配置信息的联机手册。 如果您使用了一个不同版本的 FreeBSD 的配置文件,请小心点, 因为设备的标记在两个版本之间已经改变了。 这里端口 IO_COM1 代替了 0x3f8,端口 IO_COM2 代替了 0x2f8,端口 IO_COM3 代替了 0x3e8,端口 IO_COM4 代替了 0x2e8,这些都是各自端口相应的端口地址。 中断4,3,5,9都是经常用的中断。也要注意有些正常的串行端口可能 无法 在一些ISA总线的PC上共享中断 (多插口板卡有板载的电子设备,允许在板上所有 16550A 的设备共享一个或两个中断请求)。 设备指定文件 内核中的绝大多数设备可以通过 设备特殊文件 来访问, 它就在/dev目录下。 sio 设备通过 /dev/ttydN (拨入)和 /dev/cuaaN (拨出) 设备来访问。 FreeBSD 也提供了初始化的设备 (/dev/ttyidN/dev/cuaiaN) 以及锁定的设备 (/dev/ttyldN/dev/cualaN)。 初始化的设备在每次端口被打开时被用来初始化设备通讯端口参数。 例如使用 RTS/CTS 的流控制信号的 crts的调制解调器。 锁定设备用来锁定端口的标记以阻止用户或程序改变某个参数。 参见 &man.termios.4;、&man.sio.4; 以及 &man.stty.1; 联机手册了解更多信息。 编译设备指定文件 从 FreeBSD 5.0 开始, &man.devfs.5; 文件系统将根据需要创建设备节点。 如果您在运行启用 devfs 的FreeBSD版本, 您就可以跳过这一节。 一个在/dev 目录下的叫做 MAKEDEV 的 shell 脚本管理着设备指定文件。 要使用 MAKEDEV 来建立拨号设备指定文件, 可以使用 COM1: (port 0), cd 进入 /dev, 然后执行命令 MAKEDEV ttyd0。 同样地,要建立拨号设备指定文件以使用 COM2: (port 1), 可以执行 MAKEDEV ttyd1 MAKEDEV 不仅仅创建 /dev/ttydN 设备指定文件,也创建 /dev/cuaaN/dev/cuaiaN/dev/cualaN/dev/ttyldN, 以及 /dev/ttyidN节点。 建立完新设备指定文件后, 需要检查文件的权限来确定谁可以在这些文件上读写 — 您可能不想让普通的用户使用您的 modem 吧。 在/dev/cua*文件上的默认权限应该是足够了: crw-rw---- 1 uucp dialer 28, 129 Feb 15 14:38 /dev/cuaa1 crw-rw---- 1 uucp dialer 28, 161 Feb 15 14:38 /dev/cuaia1 crw-rw---- 1 uucp dialer 28, 193 Feb 15 14:38 /dev/cuala1 这些许可允许用户uucp和在组dialer 上的用户使用呼出设备。 串行端口配置 ttyd cuaa ttydN (或cuaaN) 设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时, 它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置: &prompt.root; stty -a -f /dev/ttyd1 当您修改了这个设备的设置,这个设置会生效,除非设备被关闭。 当它被重新打开时,它将回到默认设置。 要修改默认设置,您可以打开和调整 初始状态 设备的设置。例如, 要为ttyd5 打开 模式,8位通讯和默认的 流控制, 输入: &prompt.root; stty -f /dev/ttyid5 clocal cs8 ixon ixoff rc files rc.serial 串行设备的系统初始化是用/etc/rc.serial文件类控制的。 这个文件会影响串行设备的默认设置。 要防止某个设置被一个应用程序所修改,需要调整 锁状态设备。 例如,要锁定ttyd5 的速度为57600 bit/s, 键入: &prompt.root; stty -f /dev/ttyld5 57600 现在,一个打开ttyd5 和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地, 您需要确定初始状态,然后用root帐户锁定状态设备的写入功能。 MAKEDEV 很显然,您应该只让 root 用户可以初始化或锁定设备的状态。 Sean Kelly Contributed by 终端 终端 当您在计算机控制台或是在一个连接的网络上时, 终端提供了一个方便和低成本的访问FreeBSD系统的方法。 这节描述了如何在FreeBSD上使用终端。 终端的用法和类型 早期的 &unix; 系统没有控制台。 人们通过将终端连接到计算机的串口来登录和使用程序。 它很像用 modem 和一些终端软件来拨号进入一个远程的系统, 只能执行文本的工作。 今天的 PC 已经可以使用高质量的图形了, 但与今天的其他&unix;操作系统一样,建立一个登录会话的能力仍然存在。 通过使用一个终端连接到一个没有使用的串口, 您就能登录和运行任何文本程序或在 X 视窗系统中运行一个 xterm 窗口程序。 对于商业用户,您可以把任何终端连接到 FreeBSD 系统, 然后把它们放在员工的桌面上。 对于家庭用户,则可以使用一台比较老的 IBM PC 或 Macintosh 运行一个终端连接到一台运行 FreeBSD 的高性能机器上。 对于FreeBSD,有三种终端: 哑终端 充当终端的PC X 终端 下面一小节将描述每一种终端。 哑终端 哑终端需要专门的好几种硬件,让您通过串行线连接到计算机。 它们被叫做 是因为它们只能够用来显示, 发送和接收文本。 您不能在它上面运行任何程序。 有好几百种哑终端,包括Digital Equipment Corporation 的VT-100和Wyse的WY-75。只有几种可以在FreeBSD上工作。 一些高端的终端可以显示图形,但只有某些软件包可以使用这些高级特性。 哑终端被广泛用于那些不需要图形应用的工作中。 充当终端的PC 如果一个 哑终端 有足够的能力来显示,发送和接收文本, 那任何个人计算机都可以作为一个哑终端。 您所需要的只是适当的线缆和一些终端模拟软件。 这样一个配置被广泛运用于家庭。例如,如果您的妻子忙于在您的 FreeBSD 系统控制台上工作,您也可以从一台低档的个人计算机登录到 FreeBSD 系统执行一些文本的工作。 X 终端 X终端是最复杂的终端系统。它们通常需要使用以太网来连接。 它们能显示任何X应用程序。 我们介绍X终端只是为了感兴趣。然而, 这章不会涉及X终端的安装,配置或使用。 配置 这节描述了您在一个终端上启用一个登录会话,需要在 FreeBSD 系统上配置些什么。假设您已经配置好了内核来支持串行端口,您就可以连接了。 中曾经提到, init 进程依赖于系统启动时所有的处理控制和初始化。 通过 init 来执行的一些任务将先读取 /etc/ttys文件, 然后在可用的终端上启用一个 getty 进程。 getty 进程可用来阅读一个登录名和启动 login程序。 然而,要为您的FreeBSD系统配置终端,您需要以 root 身份执行下面的步骤: 如果它不在那儿,您需要为串行端口在 /dev目录下添加一行记录到 /etc/ttys 指定 /usr/libexec/getty 在端口上运行, 然后从 /etc/gettytab 文件指定适当的 getty 类型。 指定默认的终端类型。 设置端口为 on 确定端口是否为 secure 迫使init 重新读取 /etc/ttys文件。 作为可选的步骤,您可以通过在 /etc/gettytab 中建立一个记录,在第2步创建一个定制的 getty 类型来使用。这章不会介绍如何做。 您可以参考 &man.gettytab.5; 和 &man.getty.8; 的联机手册了解更多信息。 添加一个记录到<filename>/etc/ttys</filename> /etc/ttys文件列出了您 FreeBSD系统上允许登录的所有端口。 例如, 第一个虚拟控制台 ttyv0 在这个文件中有一个记录。 您可以使用这个记录登录进控制台。 这个文件也包含其他虚拟控制台的记录,串口,和伪 ttys 终端。 对于一个硬连线的终端, 只要列出串行端口的 /dev 记录而不需要 /dev部分 (例如, /dev/ttyv0 可以被列为 ttyv0)。 默认的 FreeBSD 安装包括一个支持最初四个串口 ttyd0ttyd3/etc/ttys 文件。 如果您从那些端口中某一个使用终端,您不需要添加另一个记录。 添加终端记录到<filename>/etc/ttys</filename> 假设我们连接两个终端给系统: 一个 Wyse-50 和一个老的运行 Procomm 终端软件模拟一个 VT-100 终端的286IBM PC。 在 /etc/ttys 文件中的相应的记录是这样的: ttyd1 "/usr/libexec/getty std.38400" wy50 on insecure ttyd5 "/usr/libexec/getty std.19200" vt100 on insecure 第一部分指定了终端指定文件的名称, 它可以在 /dev中找到。 第二部分是在这行执行的命令,通常是 &man.getty.8;。 getty 初始化然后打开一行,设置速度, 用户名的命令和执行登录程序。 getty 程序在它的命令行接收一个参数 (可选), getty 类型。 一个 getty 类型会在终端行描述一个特征, 像波特率和奇偶校验。 getty 程序从 /etc/gettytab 文件读取这些特征。 文件/etc/gettytab 包含了许多老的和新的终端行记录。 在很多例子中,启动文本 std 的记录将用硬连线终端来工作。 这些记录忽略了奇偶性。 这是一个从110到115200 bit/s的 std 记录。 当然,您可以添加您自己的记录到这个文件。 gettytab 的联机手册提供了更多的信息。 当在/etc/ttys中设置 getty 类型的时候, 确信在终端上的通讯设置匹配。 在我们的例子中, Wyse-50 不使用奇偶性, 用38400 bit/s 来连接。286 PC不使用奇偶性,用19200bit/s来连接。 第三部分是通常连接到那个tty行的终端类型。对于拨号端口, unknowndialup 通常被用在这个地方。 对于硬连线的终端,终端类型不会改变, 所以您可以从termcap数据库文件中放一个真正的终端类型。 在我们的例子中, Wyse-50 使用真正的终端类型, 而运行 Procomm 的286 PC将被设置成在VT-100上的模拟。 如果端口被启用,可以指定第四个部分。在第二部分, 把它放在这儿将执行初始化进程来启动程序 getty。如果您在这部分拖延, 将没有getty,在端口上因此就没有登录。 最后部分被用来指定端口是否安全。 标记一个安全的端口意味着您信任它允许用 root 帐户从那个端口登录。 不安全的端口不允许 root登录。 在一个不安全的端口上, 用户必须用无特权的帐户登录, 然后使用 su 或一个相似的机制来获得超级用户的权限。 重新读取<filename>/etc/ttys</filename>来强制<command>init</command> /etc/ttys文件做一个必要的修改后,您必须发送一个 SIGHUP 信号给初始化进程来迫使它重新读取配置文件,例如: &prompt.root; kill -HUP 1 init 总是系统运行时的第一个进程,因此它总是PID 1。 如果能够正确设置,所有的线缆都是适当的,终端将可以启用了, 然后一个 getty 进程将在每个终端运行, 您将在您的终端上看到登录命令行。 您的连接可能出现的问题 即使您小心翼翼地注意细节,您仍然可能会在设置终端时出错。 这有一个有关问题和解决办法的列表: 没有登录命令出现: 确定终端被嵌入和打开了。如果把一台个人计算机充当一个终端, 确信终端模拟软件运行在正确的串口上。 确信线缆被稳固地连接在终端和 FreeBSD 计算机上。 确信用了正确的电缆。 确定终端和 FreeBSD 的传输速度和奇偶设置已经一致了。 如果您有一个图像显示终端,确信对比度已经调节好了。 如果它是一个可打印的终端,确信纸张和墨水已经就绪了。 确定一个 getty 进程正在运行和服务终端。 例如, 可以用ps 命令得到运行 getty 程序的列表,键入: &prompt.root; ps -axww|grep getty 您将看到一个终端的记录。例如,下面的显示表明一个getty 正在第二个串行端口 ttyd1 运行, 正在/etc/gettytab中使用 std.38400 的记录: 22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyd1 如果没有 getty 进程运行, 确信您已经在/etc/ttys中启用了端口。 在修改完/etc/ttys文件后,记得运行 kill -HUP 1 如果 getty 进程确实在运行, 但终端上仍然没有显示出登录提示, 或者虽然显示了单缺不允许您输入, 您的终端或电缆可能不支持硬件握手。 请尝试将 /etc/ttys 中的 std.38400 改为 3wire.38400 并一定能够记得在改完 /etc/ttys 之后 kill -HUP 1)。 3wire 记录和 std 类似, 但忽略硬件握手。 您可能需要在使用 3wire 时减少波特率或启用软件流控制以避免缓冲区溢出。 出现一个 <quote>垃圾</quote> 而不是一个登录命令行 确信终端和 FreeBSD 使用相同的 bit/s 传输率和奇偶校验设置。 检查一下 getty 进程确信当前使用正确的 getty 类型。 如果没有, 编辑/etc/ttys然后运行kill -HUP 1 当键入密码时,字符两个两个出现 将终端 (或终端模拟软件) 从 半双工本地回显 换成 全双工 Guy Helmer Contributed by Sean Kelly Additions by 拨入服务 拨入服务 为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用 modem来拨号而不是终端。 外置vs.内置modem 外置modem看起来很容易拨号。 因为,外置 modem 可以通过储存在非易失性的RAM中的参数来配置, 它们通常提供指示器来显示重要的RS-232信号的状态。 不停闪光的信号灯能给用户留下比较深刻的印象, 而且指示器也可以用来查看modem是否正常地工作。 内置modem通常缺乏非易失性的RAM, 所以对它们的配置可能会限制在通过 DIP 开关来设置。 如果您的内置modem有指示灯,您也很难看得到。 Modem和线缆 modem 如果您使用一个外置的 modem,那您将需要适当的电缆线。 一个标准的串行线应当足够长以至普通的信号能够连接上: Transmitted Data (TD) Received Data (RD) Request to Send (RTS) Clear to Send (CTS) Data Set Ready (DSR) Data Terminal Ready (DTR) Carrier Detect (CD) Signal Ground (SG) FreeBSD需要对速度超过2400bit/s的RTSCTS信号进行流控制, 当一个呼叫被回复或线路被挂起的时候, CD 信号就会被侦测到,一个会话完成之后,DTR 信号就会刷新modem。 一些线缆不需要任何信号就可以连接, 所以如果您有问题, 当线路被挂断时, 一个登录任务就会丢失, 您可能会在线缆上有问题。 像其他 &unix; 类的操作系统一样, FreeBSD 使用硬件信号来寻找出一个呼叫什么时候会回复或一个线路会被挂起。 FreeBSD 避免发送命令给 modem 或监视 modem 的状况。 如果您熟悉连接 modem 到基于 PC 的 BBS,这可能看起来有点笨拙。 串行接口的考虑 FreeBSD支持基于 NS8250, NS16450, NS16550 和 NS16550A 的EIA RS-232C通讯接口。 8250和16450设备有单字符缓冲。 16550设备提供了一个 16 个字符的缓冲, 可以提高更多的系统性能。 因为单字符缓冲设备比 16 个字符的缓冲需要更多的系统资源来工作, 所以基于16550A的接口卡可能更好。 如果系统没有活动的串口, 或有较大的负载, 16 字符缓冲的卡对于低错误率的通讯来说更好。 快速预览 getty 对于终端, init 会在每个配置串口上为每个拨入连接产生一个 getty 进程。 例如, 如果一个 modem 被附带在 /dev/ttyd0 中,用命令ps ax可以显示下面这些: 4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0 当用户拨上modem, 并使用它进行连接时, CD 线就会被 modem 认出。 内核注意到载波信号已经被检测到, 需要完成 getty 端口的打开。 getty 发送一个登录:在指定的初始线速度上的命令行。 Getty 会检查合法的字符是否被接收, 在典型的配置中, 如果发现 垃圾getty 就会设法调节线速度,直到它接收到合理的字符。 /usr/bin/login 用户在键入他/她的登录名称后, getty执行/usr/bin/login, 这会要求用户输入密码来完成登录, 然后启动用户的shell。 配置文件 /etc 目录中,有三个您将需要编辑的系统配置文件, 来允许拨号访问到您的 FreeBSD 系统。 第一, /etc/gettytab 包含了针对 /usr/libexec/getty 守护程序的配置信息。 第二, 保存信息来告诉 /sbin/init 什么 tty 设备将有运行在它们系统上的 getty进程。 最后, 您可以把端口初始化命令放在 /etc/rc.serial 脚本中。 在 &unix; 上, 关于拨号 modem 的想法主要有两种。 一种是把本地接口配置成一个固定速度, 以至一个远程用户拨号进入时都保持一个固定速度。 这样配置的好处是远程用户总是可以立即看到一个系统的登录界面。 这种下降趋势是系统不知道一个用户真正的数据速度是多少, 所以像 Emacs 全屏程序将不会调节屏幕刷新来确保对比较慢的连接有比较好的回应。 另一所学校将他们的 modem 所在的 RS-232 设置为自动适应远程用户的连接速度。 例如, V.32bis (14.4 Kbps) 的连接将让 modem 所在的 RS-232 接口运行在 19.2 Kbps, 而 2400 bps 的连接则会使 modem 的 RS-232 以 2400 bps 运行。 由于 getty 并不知道任何一个特定的 modem 的连接速率, 因此 getty 会以初始的速率给出一个 login: 消息并监视用户回应的字符。 如果用户看到一些乱码, 则他们应该知道连续按 Enter 键直到能够看到可以识别的提示为止。 如果数据传输速率不匹配, getty 将把用户输入的任何信息看作 乱码, 并尝试下一个速度并再次给出 login: 提示。 这个过程可以令人作呕地继续下去, 但用户通常只需按一两次键盘就可以看到正常的提示了。 很明显, 这个登录过程看起来可能没有前面所介绍的 锁定速率 方法那样脉络清晰, 但在低速连接上的用户应该能够从全屏幕程序中得到更好的交互响应。 这一节将尽量给出较为公平的配置信息, 但更偏向于使用遵守连接速率的 modem。 <filename>/etc/gettytab</filename> /etc/gettytab /etc/gettytab是一个用来配置 getty 信息的 termcap 风格的文件。 请看看 gettytab 的联机手册了解完整的文件格式和功能列表。 锁定速度的配置 如果您把您的modem的数据通讯率锁定在一个特殊的速度上, 您不需要对 /etc/gettytab 文件作任何变化。 匹配速度的配置 您将需要在 /etc/gettytab 中设置一个记录来告诉 getty 您希望在 modem 上使用的速度。 如果您的 modem 的速率是 2400 bit/s, 则可以使用现有的 D2400 的记录。 # # Fast dialup terminals, 2400/1200/300 rotary (can start either way) # D2400|d2400|Fast-Dial-2400:\ :nx=D1200:tc=2400-baud: 3|D1200|Fast-Dial-1200:\ :nx=D300:tc=1200-baud: 5|D300|Fast-Dial-300:\ :nx=D2400:tc=300-baud: 如果您有一个更高速度的 modem, 必须在 /etc/gettytab 中添加一个记录。 下面是一个让您可以以最高 19.2 Kbit/s 的用在 14.4 Kbit/s的modem上的接口记录: # # Additions for a V.32bis Modem # um|V300|High Speed Modem at 300,8-bit:\ :nx=V19200:tc=std.300: un|V1200|High Speed Modem at 1200,8-bit:\ :nx=V300:tc=std.1200: uo|V2400|High Speed Modem at 2400,8-bit:\ :nx=V1200:tc=std.2400: up|V9600|High Speed Modem at 9600,8-bit:\ :nx=V2400:tc=std.9600: uq|V19200|High Speed Modem at 19200,8-bit:\ :nx=V9600:tc=std.19200: 这样做的结果是 8-数据位, 没有奇偶校验的连接。 上面使用19.2 Kbit/s的连接速度的例子,也可以使用 9600 bit/s (for V.32), 2400 bit/s, 1200 bit/s,300 bit/s, 直到 19.2 Kbit/s。 通讯率的调节使用 nx= (next table) 来实现。 每条线使用一个 tc= (table continuation) 的记录来加速对于一个特殊传输率的标准设置。 如果您有28.8 Kbit/s的modem,或您想使用它的 14.4Kbit/s 模式, 就需要使用一个更高的超过 19.2 Kbit/s 的通讯速度的 modem。 这是一个启动 57.6 Kbit/s 的 gettytab 记录的例子: # # Additions for a V.32bis or V.34 Modem # Starting at 57.6 Kbps # vm|VH300|Very High Speed Modem at 300,8-bit:\ :nx=VH57600:tc=std.300: vn|VH1200|Very High Speed Modem at 1200,8-bit:\ :nx=VH300:tc=std.1200: vo|VH2400|Very High Speed Modem at 2400,8-bit:\ :nx=VH1200:tc=std.2400: vp|VH9600|Very High Speed Modem at 9600,8-bit:\ :nx=VH2400:tc=std.9600: vq|VH57600|Very High Speed Modem at 57600,8-bit:\ :nx=VH9600:tc=std.57600: 如果您的 CPU 速度较低, 或系统的负荷很重, 而且没有 16550A的串行端口,您可能会在57.6 Kbit/s上得到 sio silo错误。 <filename>/etc/ttys</filename> /etc/ttys /etc/ttys文件的配置在 中介绍过。 配置 modem 是相似的, 但我们必须指定一个不同的终端类型。 锁定速度和匹配速度配置的通用格式是: ttyd0 "/usr/libexec/getty xxx" dialup on 上面的第一条是这个记录的设备特定文件 — ttyd0 表示 /dev/ttyd0 是这个 getty 将被监视的文件。 第二条 "/usr/libexec/getty xxx" 是将运行在设备上的进程 init。 第三条,dialup,是默认的终端类型。 第四个参数, on, 指出了线路是可操作的 init。 也可能会有第五个参数, secure, 但它将只被用作拥有物理安全的终端 (如系统终端)。 默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型, 以至用户可以定制它们的登录脚本来注意终端什么时候拨号, 和自动调节它们的终端类型。 然而, 作者发现它很容易在它的站点上指定 vt102 作为默认的终端类型, 因为用户刚才在它们的远程系统上使用的是VT102模拟器。 您对/etc/ttys作修改之后,您可以发送 init 进程给一个 HUP 信号来重读文件。您可以使用下面的命令来发送信号: &prompt.root; kill -HUP 1 如果这是您的第一次设置系统, 您可能要在发信号 init 之前等一下, 等到您的 modem 正确地配置并连接好。 锁定速度的配置 对于一个锁定速度的配置,您的 ttys 记录必须有一个为 getty 提供固定速度的记录。 对于一个速度被锁定在 19.2kbit/s 的 modem, ttys 记录是这样的: ttyd0 "/usr/libexec/getty std.19200" dialup on 如果您的 modem 被锁定在一个不同的数据速度, 为 std.speed 使用适当的速度来代替 std.19200。 确信您使用了一个在 /etc/gettytab 中列出的正确的类型。 匹配速度的设置 在一个匹配速度的设置中,您的 ttys 录需要参考在 /etc/gettytab 适当的起始 auto-baud 记录。 例如, 如果您为一个以 19.2 Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的 ttys 记录可能是这样的: ttyd0 "/usr/libexec/getty V19200" dialup on <filename>/etc/rc.serial</filename> rc files rc.serial 高速modem, 像 V.32,V.32bis,和 V.34 modem,需要使用硬件 (RTS/CTS) 流控制。 您可以在 /etc/rc.serial 中添加 stty 命令来设置硬件流控制标记。 例如,在拨入和拨出初始设备的第一个 (COM2) 串行端口上设置termios标记crtscts, 下面这些行会被添加到 /etc/rc.serial中: # Serial port initial configuration stty -f /dev/ttyid1 crtscts stty -f /dev/cuaia1 crtscts Modem设置 如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中, 您将必须使用一个终端程序来设置参数。 使用同样的通讯速度来连接 modem 作为初始速度 getty 将使用和配置 modem 的非易失性RAM来匹配这些要求: CD asserted when connected DTR asserted for operation; dropping DTR hangs up line and resets modem CTS transmitted data flow control Disable XON/XOFF flow control RTS received data flow control Quiet mode (no result codes) No command echo 请读读您的 modem 的文档找到您需要用什么命令和 DIP 接口设置。 例如,要在一个 USRobotics Sportster 14400 的外置 modem 上设置上面的参数,可以用下面这些命令: ATZ AT&C1&D2&H1&I0&R2&W 您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用 V.42bis 和 MNP5 压缩。 外置 modem 也有一些用来设置的 DIP 开关, 也许您可以使用这些设置作为一个例子: Switch 1: UP — DTR Normal Switch 2: N/A (Verbal Result Codes/Numeric Result Codes) Switch 3: UP — Suppress Result Codes Switch 4: DOWN — No echo, offline commands Switch 5: UP — Auto Answer Switch 6: UP — Carrier Detect Normal Switch 7: UP — Load NVRAM Defaults Switch 8: N/A (Smart Mode/Dumb Mode) 在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当 getty 在 modem 处于命令模式并回显输入时错误地给出 login: 提示时可能造成的问题。 这样可能导致 getty 与 modem 之间产生更长的不必要交互。 锁定速度的配置 对于锁定速度的配置, 您需要配置 modem 来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。 在一个 USR Sportster 14400 外置 modem 上, 这些命令将锁定 modem到计算机 的传输率: ATZ AT&B1&W 匹配速度的配置 对于一个变速的配置, 您需要配置 modem 调节它的串行端口传输率匹配接收的传输率。 在一个 USR Sportster 14400 的外置 modem 上, 这些命令将锁定 modem 的错误修正传输率适合命令要求的速度, 但允许串行端口速度适应没有纠错的连接: ATZ AT&B2&W 检查modem的配置 大多数高速的modem提供了用来查看当前操作参数的命令。 在USR Sportster 14400外置modem上, 命令 ATI5 显示了存储在非易失性RAM中的设置。 要看看正确的 modem 操作参数, 可以使用命令 ATZ 然后是 ATI4 如果您有一个不同牌子的 modem, 检查 modem 的使用手册看看如何双重检查您的 modem 的配置参数。 问题解答 这儿是几个检查拨号modem的步骤。 检查FreeBSD系统 把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的 modem 有一个指示灯, 当登录时看看 modem 的 DTR 指示灯是否亮: 会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD 已经在适当的通讯端口启动了一个 getty 进程, 等待 modem 接收一个呼叫。 如果DTR指示灯不亮, 通过控制台登录到 FreeBSD系统,然后执行一个 ps ax 命令来看 FreeBSD 是否正在正确的端口运行 getty进程。 您将在进程显示中看到像这样的一行: 114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0 115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1 如果您看到是这样的: 114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0 modem 不接收呼叫, 这意味着 getty 已经在通讯端口打开了。 这可以指出线缆有问题或 modem 错误配置, 因为 getty 无法打开通讯端口。 如果您没有看到任何 getty 进程等待打开想要的 ttydN 端口, 在 /etc/ttys 中双击您的记录看看那儿是否有错误。 另外,检查日志文件 /var/log/messages 看看是否有一些来自 initgetty 的问题日志。 如果有任何信息, 仔细检查配置文件 /etc/ttys/etc/gettytab,还有相应的设备文件 /dev/ttydN, 是否有错误,丢失记录,或丢失了设备指定文件。 尝试接入Try Dialing In 设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。 如果您不能立刻得到一个命令行, 试试每隔一秒按一下 Enter。 如果您仍没有看到一个登录: 设法发送一个 BREAK。 如果您正使用一个高速的 modem 来拨号, 请在锁定拨号 modem 的接口速度后再试试。 如果您不能得到一个登录:prompt,再检查一下 /etc/gettytab,重复检查: /etc/ttys 中指定的初始可用的名称与 /etc/gettytab 的一个可用的相匹配。 每个 nx= 记录与另一个 gettytab 可用名称匹配。 每个 tc= 记录与另一个 gettytab可用名称相匹配。 如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem 能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem 的指示灯来确认 DTR 线连接正确。 如果您做了好几次,它仍然无法工作,打断一会,等会再试试。 如果还不能工作, 也许您应该发一封电子邮件给 &a.questions; 寻求帮助。 拨出设备 dial-out service 下面将让您的主机通过 modem 连接到另一台计算机上。 这只要适当地建立一个终端作为远程主机就可以。 这可以用来登录进一个BBS。 如果您用 PPP 有问题, 那这种连接可以用来从 Internet 上下载一个文件。 如果您必须 FTP 一些东西, 而 PPP 断了, 使用终端会话来 FTP 它们。 然后使用 zmodem 来把它们传输到您的机器上。 我的Stock Hayes Modem不被支持,我该怎么办? 事实上, 联机手册对于这个的描述已经过时了。 一个通用的 Hayes拨号已经内建其中。 只要在您的 /etc/remote 文件中使用 at=hayes Hayes 驱动不够 聪明 只能认出一些比较新的 modem 的高级特性 — 如 BUSYNO DIALTONE, 或 CONNECT 115200 的信息将被搞乱。 当您使用的时候, 您必须把这些信息关掉。(通过 ATX0&W)。 另外,拨号的延迟是 60 秒。 您的 modem 可能使用另外的时间或提示认为有其他的通讯问题。 试试 ATS7=45&W 注意: 实际上 tip 不支持所有的 Hayes modems。 解决方法是编辑 /usr/src/usr.bin/tip/tip 目录中的 tipconf.h 文件。很明显, 您需要它的源代码才能这样做。 把行#define HAYES 0 改为 #define HAYES 1。 然后 makemake install就可以了。 我如何输入这些 AT 命令? /etc/remote /etc/remote 文件中编译一个叫做 direct 的记录。 例如, 如果您的 modem 连接在第一个串行端口, /dev/cuaa0, 就添加下面这行: cuaa0:dv=/dev/cuaa0:br#19200:pa=none 使用 br 命令来启用您 modem 支持的最高传输速度。 然后键入 tip cuaa0, 您就可以连到您的 modem 上了。 如果在您的系统上没有 /dev/cuaa0,可以这样: &prompt.root; cd /dev &prompt.root; sh MAKEDEV cuaa0 或以 root 使用 cu, 执行下面的命令: &prompt.root; cu -lline -sspeed line line是串行端口 (例如 /dev/cuaa0), speed 是速度 (如57600)。 键入 ~. 退出。 现在pn <literal>@</literal>标记不能工作? 在电话号码中的 @ 标记告诉计算机在 /etc/phones 文件中查找一个电话号码。 但 @ 标记也是一个在像 /etc/remote 这样的可用文件中的特殊字符。 用一个反斜线符号退出: pn=\@ 我如何在命令行拨电话号码? 在您的 /etc/remote 文件中通常放着一个叫做 generic 的记录。 例如: tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du: 然后,您可以这样: &prompt.root; tip -115200 5551234 如果您更喜欢cu而不是tip,使用一个通用的cu记录: cu115200|Use cu to dial any number at 115200bps:\ :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du: 然后键入: &prompt.root; cu 5551234 -s 115200 这么做时是否每次都需要重新输入 bps 速率? 添加一项 tip1200cu1200, 并将 bps 速率换成更合适的值。 tip 的默认值是1200  bps, 也就是为什么会有 tip1200 这条记录的原因。 虽然您并不需要使用 1200 bps。 我通过一个终端服务器访问了很多主机。 除非每次都要等到您连接到主机然后键入 CONNECT <host>, 否则使用 tipcm 功能。 例如, 在 /etc/remote 中的这些记录: pain|pain.deep13.com|Forrester's machine:\ :cm=CONNECT pain\n:tc=deep13: muffin|muffin.deep13.com|Frank's machine:\ :cm=CONNECT muffin\n:tc=deep13: deep13:Gizmonics Institute terminal server:\ :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234: 将让您键入 tip paintip muffin 连接到主机pain或muffin, 和 tip deep13 连接到终端服务器。 <command>tip</command>能为每个站点试用多个线路吗? 经常有一个问题, 一个大学有几个modem线路, 几千个学生设法使用它们。 /etc/remote 中为您的大学添加一个记录, 然后为 pn 功能使用 @ 标记: big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none: 接着, 在 /etc/phones 中列出大学的电话号码: big-university 5551111 big-university 5551112 big-university 5551113 big-university 5551114 tip 将按顺序试用每一个,然后就停止。 如果想继续测试, 隔一段时间再运行 tip 为什么我必须键入 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 两次才能发出 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 一次? CtrlP是默认的强制字符,被用来告诉tip下一个字符是文字的数据。您可以用~s给任何其他的字符设置强制字符,这意思是设置一个变量 在新的一行键入 ~sforce=single-charsingle-char 是任何简单的字符。 如果您遗漏了 single-char, 那强制字符就是空字符, 这可以键入 Ctrl2 CtrlSpace 来完成。 更好的 single-char Shift Ctrl 6 , 这只用在一些终端服务器上。 通过在您的 $HOME/.tiprc 文件中指定下面这行, 就可以得到您想要的任何强制字符: force=<single-char> 突然我键入的每一样东西都变成了大写?? 您一定是键入了 Ctrl A , 即 tipraise character, 会临时地指定成坏掉的 caps-lock键。 使用上面的 ~s 来合理地设置各种 raisechar。 事实上, 如果您不想使用这些特性的话,您可以用同样的方法设置强制字符。 这儿有一个很好的示例 .tiprc 文件, 对 Emacs用户来说,需要经常按 Ctrl2 CtrlA force=^^ raisechar=^^ The ^^ is ShiftCtrl6 . 如何用 <command>tip</command> 做文件传输? 如果您正在与另一台 &unix; 系统对话, 您可以用 ~p(put) 和 ~t (take) 发送和接收文件。 这些命令可以在远程系统上运行 catecho 来接收和发送文件。 语法是这样的: ~p local-file remote-file ~t remote-file local-file 由于没有错误校验, 所以您需要使用其他协议, 如 zmodem。 我如何用<command>tip</command>运行zmodem? 要接收这些文件,可以在远程终端启动发送程序。然后,键入 ~C rz 在本地开始接收它们。 要发送文件, 可以在远程终端启动接收程序。 然后, 键入 ~C sz files 把它们发送到远程系统。 Kazutaka YOKOTA Contributed by Bill Paul Based on a document by 设置串行控制台 serial console 介绍 FreeBSD可以通过一个串口只使用一个哑 (dumb) 终端就可以启动一个系统。 这样一种配置只有两种人能使用: 希望在机器上安装 FreeBSD 的系统管理员, 他没有键盘或显示器, 还有就是要调试内核或设备驱动程序的开发人员。 就象 描述的, FreeBSD 采用一个三步的启动过程。 最先两步储存在 FreeBSD 启动磁盘的启动 slice 的启动代码块中。 引导块然后就被加载, 接着运行第三步启动引导器 (/boot/loader)。 为了设置串行控制台, 您必须配置启动代码块, 启动引导器代码和内核。 串行控制台的配置, 简明版 这一节假定您使用默认的配置, 只希望迅速地获得关于配置串口控制台的概览。 使用串口电缆连接 COM1 和控制终端。 - 要在串行控制台上察看启动信息, - 使用下面的命令 echo "set console=comconsole" > - /boot/loader.conf + 要在串口控制台上显示所有的引导信息, + 需要以超级用户的身份执行下面的命令: + &prompt.root; echo 'console="comconsole"' >> /boot/loader.conf 编辑 /etc/ttys 并把 ttyd0off 改为 ondialup 改为 vt100。 否则通过串行控制台上将不会提示输入口令, 从而导致潜在的安全漏洞。 重新启动并观察是否生效。 如果需要不同的配置, 更进一步的配置讨论可以在 找到。 串行控制台的设置S 准备一个串行线缆。 null-modem cable 您需要使用一个 null-modem 的线缆或标准的串行线和一个 null-modem 适配器。 请参考 中有关串行线的讨论。 拔掉键盘。 绝大多数的PC在开机检测的时候会检测到键盘, 如果没有检测到键盘, 则会出现错误。 一些机器会提示缺少键盘, 就不会继续引导系统。 如果您的计算机出现错误, 但仍能继续启动, 您可以不必理它。 如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS 来避免它。 请参考您的主板的使用说明了解更多细节。 在 BIOS 中设置键盘 Not installed 并不意味着您不能使用键盘。 这样做只是告诉 BIOS 不要在机器开机检测时检测键盘以至提示您系统找不到键盘。 即使您设置了 Not installed, 只要把键盘插上去仍然可以使用。 如果系统有 PS/2 鼠标, 如果幸运的话, 您也可以象键盘一样把它拔下来, 这是因为 PS/2 鼠标与键盘的一些硬件是共享的, 您的鼠标插上去, 系统会认为键盘仍在那儿。 插一个哑 (dumb) 终端到COM1:(sio0)。 如果您没有哑终端, 可以使用一个比较老的带有一个 modem 程序的PC/XT机器, 或在其他 &unix; 机器上的串口。 如果您没有 COM1: (sio0), 去找一个。 这时, 您就不能只能选择 COM1:来启动系统。 如果您已经在另一台设备上使用 COM1, 您必须临时删除那个设备, 然后安装一个新的系统引导块和内核。 确信您的内核配置文件已经为 COM1: (sio0) 设置了适当的标记: 有关的标记是: 0x10 启用控制台支持。 如果没有设置它, 则其他的控制台标记都会被忽略。 现在, 绝大多数的设置都有控制台的支持。 这个标记的第一个就是首选的。 这个单独选项是不能确保串口适用于控制台的, 设置下面的标记或加上下面描述的 选项, 和这个放在一起。 0x20 不管下面有没有讨论, 都强制这个选项支持控制台。 这个标记在 FreeBSD 2.X 中取代了 COMCONSOLE选项。 标记 0x20 必须和 一起使用。 0x40 预留这个单元 (配合 0x10) 并让它不能用于普通的使用。 您不应在希望作为控制台的串口单元上设置这个标志。 这一标志是为内核远程调试准备的。 参见 开发者手册 以了解关于远程调试更进一步的情况。 在FreeBSD 4.0-CURRENT和以后的版本中,标记 0x40通常是不同的, 有另一个标记可以来指定一个串口用于远程调试。 例如: device sio0 at isa? port IO_COM1 flags 0x10 irq 4 看看 &man.sio.4; 的联机手册了解更多信息。 如果标记没有被设置, 您必须运行UserConfig或重新编译内核。 在启动磁盘的 a 分区的根目录创建 boot.config 文件。 这个文件将指导引导块代码如何启动系统。 为了激活串行控制台, 您必须有一个或多个下面的选项——如果您要多个选项, 在同一行必须都包含它们: 切换内部和串行控制台。 您使用这个来交换控制台设备。 例如, 如果您从内部控制台启动, 您可以使用 来直接使用启动引导器和内核来使用串口作为它的控制台设备。 另外, 如果您从串口启动, 您可以使用 来告诉启动引导器和内核使用显示设备作为控制台。 切换单一和双重控制台配置。 在单一配置中, 控制台将是本机的控制台 (显示设备) 或串口。 在双重控制台配置中, 显示设备和串口将同时成为控制台, 无论 的选项的情形。 然而, 双控制台配置只在引导块运行的过程中起作用。 一旦启动引导器获得控制, 由 选项指定的控制台将成为唯一的控制台。 在启动时,探测键盘。如果键盘找不到, 选项会自动设置。 由于当前版本引导块的空间限制, 选项只能探测扩展的键盘。 少于101键的键盘将无法被探测到。 如果您碰到这个情况, 您必须避免使用 选项。 目前还没有绕过这个问题的办法。 使用 选项来自动选择控制台, 或使用 选项来激活控制台。 您也可以使用boot联机文档中所描述的其他选项。 除了 选项, 所有选项将被传给启动引导器 (/boot/loader)。 启动引导器将通过检查 选项的状态来决定是显示设备成为控制台, 还是串口成为控制台。 这表示如果您指定 选项, 但在 /boot.config 中没有 选项, 您在启动代码块时使用串口作为控制台。 启动引导器将使用内部显示设备作为控制台。 启动机器 当您启动您的FreeBSD时,引导块将把 /boot.config 的内容发给控制台。例如: /boot.config: -P Keyboard: no 如果您把 放在 /boot.config 中并指出键盘存在或不存在, 那将只出现第二行。 这些信息会被定位到串口或内部控制台, 或两者同时, 这完全取决于 /boot.config 中的选项。 选项 定位信息 none 内部控制台 串行控制台 串行控制台和内部控制台 串行控制台和内部控制台 , 有键盘 内部控制台 , 无键盘 串行控制台 出现上面信息后,在引导块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。 在通常情况下, 您不需要打断启动进程, 但为了确信设置是否正确, 您也可以这样做。 在控制台上按 Enter 以外的任意键就能打断启动进程。 引导块将进入命令行模式。 您将看到: >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/boot/loader boot: 检验上面出现的信息, 可能是串口, 或内部控制台, 或两个同时, 完全取决于您在 /boot.config 中的选项。 如果信息出现在正确的控制台, 按 Enter 继续启动进程。 如果您要使用串行控制台, 但您没有看到命令行, 那可能设置有问题。 这时, 输入 然后按 Enter/Return 来告诉引导块 (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了, 就可以回去检查一下是什么出了问题。 启动引导器加载完后, 您将进入启动进程的第三步, 您仍然可以在启动引导器通过设定您喜欢的环境来切换内部控制台和串行控制台。 参考 摘要 这是几个在这章要讨论的几个设置和选择的控制台的摘要。 例1: 您为 <devicename>sio0</devicename> 设置标记 0x10 device sio0 at isa? port IO_COM1 flags 0x10 irq 4 在/boot.config中的选项 引导块过程中的控制台 启动引导器过程中的控制台 内核中的控制台 内部 内部 内部 串行 串行 串行 串行和内部 内部 内部 串行和内部 串行 串行 , 有键盘 内部 内部 内部 , 没有键盘 串行和内部 串行 串行 例2:您为sio0设置标记为0x30 device sio0 at isa? port IO_COM1 flags 0x30 irq 4 在/boot.config中的选项 引导块过程中的控制台 启动引导器过程中的控制台 内核中的控制台 内部 内部 串行 串行 串行 串行 串行和内部 内部 串行 串行和内部 串行 串行 , 有键盘 内部 内部 串行 , 没有键盘 串行 and internal 串行 串行 串行控制台的提示 设置一个快速的串口速度 默认的串口被设置成9600波特,8数据位, 无奇偶校验, 1个停止位。 如果您希望改变速度, 就必须重新编译引导块。在 /etc/make.conf 中添加下面一行, 然后编译新的引导块: BOOT_COMCONSOLE_SPEED=19200 参见 以了解如何编译和安装新的引导块。 如果串行控制台用其他方法来配置而不是在启动时用 , 或内核使用的串行控制台与引导块使用的不同, 就必须在内核配置中加入下面这行,并重新编译内核: options CONSPEED=19200 使用 <devicename>sio0</devicename> 以外的串口 作为控制台 使用串口而不是 sio0 作为控制台需要做一些重编译。 如果您无论如何都要使用另一个串口, 重新编译引导块, 启动引导器和内核。 取得内核源代码 (参考 )。 编辑 /etc/make.conf 文件, 然后设置 BOOT_COMCONSOLE_PORT作为您要使用 (0x3f80x2f8、 0x3E8 或 0x2E8) 端口的地址。 只有 sio0sio3 (COM1COM4) 都可以使用; 但多口串行卡将不会工作。 不需要任何中断设置。 创建一个定制的内核配置文件, 在您要使用的串口添加合适的标记。 例如, 如果要将 sio1 (COM2) 作为控制台: device sio1 at isa? port port IO_COM2 flags 0x10 irq 3 or device sio1 at isa? port port IO_COM2 flags 0x30 irq 3 其他端口的控制台标记也不要设。 重新编译和安装引导块: &prompt.root; cd /sys/boot &prompt.root; make clean &prompt.root; make &prompt.root; make install 重建和安装内核。 用 &man.disklabel.8; 将引导块写到启动盘上,然后从新内核启动。 通过串行线进入DDB调试器 options BREAK_TO_DEBUGGER options DDB 在串行控制台上得到一个登录命令行 您可能希望通过串行线进入登录提示, 现在您可以看到启动信息, 通过串行控制台键入内核调试信息。可以这样做。 用一个编辑器打开 /etc/ttys 文件, 然后找到下面的行: ttyd0 "/usr/libexec/getty std.9600" unknown off secure ttyd1 "/usr/libexec/getty std.9600" unknown off secure ttyd2 "/usr/libexec/getty std.9600" unknown off secure ttyd3 "/usr/libexec/getty std.9600" unknown off secure ttyd0ttyd3 相当于 COM1COM4。 可以打开或关闭某个端口。 如果您已经改变了串口的速度, 还必须改掉标准的 9600 与当前的例如 19200 相匹配。 您也可以改变终端的类型从不知名的到您串行终端的真实类型。 编辑完这个文件, 您必须 kill -HUP 1 来使这个修改生效。 从启动引导器修改控制台 前面一节描述了如何通过调整引导块来设定串行控制台。 这节将讲到在启动引导器中通过键入一些命令和环境变量来指定控制台。 由于启动引导器会被启动进程的第三步所调用, 引导块以后, 在启动引导器中的设置将忽略在引导块中的设置。 配置串行控制台 您可以很容易地指定启动引导器和内核来使用串行控制台, 只需要在 /boot/loader.rc中写入下面这行: - set console=comconsole + set console="comconsole" 无论前一节中的引导块如何配置, 这个设置都会生效。 您最好把上面一行放在文件的第一行, 以便尽早地在启动时看到串行控制台的启动信息。 同样地,您可以指定内部控制台为: - set console=vidconsole + set console="vidconsole" 如果您不设置启动引导环境变量控制台, 启动引导器和内核将使用在引导块时用 选项指定的控制台。 在 3.2 以及更新的版本中,您可以在 /boot/loader.conf.local/boot/loader.conf 中, 而不是在 /boot/loader.rc 指定控制台。 用这种方法, 您的 /boot/loader.rc 文件将是这样的: include /boot/loader.4th start 然后, 创建 /boot/loader.conf.local 并加入下面的行。 console=comconsole console=vidconsole 看看 &man.loader.conf.5; 的联机手册了解更多信息。 目前, 引导块还没有与引导加载器的 选项等价的选项, 此外也没有在存在键盘时自动选则使用什么控制台的能力。 使用串口而不是<devicename>sio0</devicename>作为控制台 要使用一个串口而不是 sio0 作为串行控制台 需要重新编译启动引导器。下面的步骤跟 描述的相似。 警告 这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。 不幸的是, 绝大多数系统没有键盘可以让您启动, 而没有显示设备就不让您启动。 使用 AMI BIOS 的机器可以通过在 CMOS 中将 graphics adapter 项设为 Not installed 来在启动时不要求显示适配器。 然而, 许多机器并不支持这个选项, 如果您的系统没有显示硬件就拒绝启动。 对于这些机器, 即使您没有显示器, 也必须在机器上插上显示适配器。 建议您试试采用 AMI BIOS 的机器。