diff --git a/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml index 359a2be96a..83a67fcf65 100644 --- a/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml @@ -1,5155 +1,5152 @@ 高级网络 概述 本章将就一系列与网络有关的高级话题进行讨论。 读完这章,您将了解: 关于网关和路由的基础知识。 如何配置 IEEE 802.11 和 蓝牙(&bluetooth;) 设备。 如何用 FreeBSD 做网桥。 如何为无盘机上配置网络启动。 如何配置网络地址转换 (NAT)。 如何使用 PLIP 连接两台计算机。 如何在运行 FreeBSD 的计算机上配置 IPv6。 如何配置 ATM。 如何利用 CARP, &os; 支持的 Common Access Redundancy Protocol (共用地址冗余协议) 在读这章之前, 您应: 理解 /etc/rc 脚本的基本知识。 熟悉基本的网络术语。 了解如何配置和安装新的 FreeBSD 内核 ()。 了解如何安装第三方软件 ()。 Coranth Gryphon 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
网关和路由 路由 网关 子网 要让网络上的两台计算机能够相互通讯, 就必须有一种能够描述如何从一台计算机到另一台计算机的机制, 这一机制称作 路由选择(routing)路由项 是一对预先定义的地址: 目的地(destination)网关(gateway)。 这个地址对所表达的意义是, 通过 网关 能够完成与 目的地 的通信。 有三种类型的目的地址: 单个主机、 子网、 以及 默认。 如果没有可用的其它路由, 就会使用 默认路由, 有关默认路由的内容, 将在稍后的章节中进行讨论。 网关也有三种类型: 单个主机, 网络接口 (也叫 链路 (links)) 和以太网硬件地址 (MAC 地址)。 实例 为了说明路由选择的各个部分, 首先来看看下面的例子。 这是 netstat 命令的输出: &prompt.user; netstat -r Routing tables Destination Gateway Flags Refs Use Netif Expire default outside-gw UGSc 37 418 ppp0 localhost localhost UH 0 181 lo0 test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77 10.20.30.255 link#1 UHLW 1 2421 example.com link#1 UC 0 0 host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0 host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 => host2.example.com link#1 UC 0 0 224 link#1 UC 0 0 默认路由 头两行给出了当前配置中的默认路由 (将在 下一节 中进行介绍) 和 localhost (本机) 路由。 回环设备 这里的路由表中给出的用于 localhost 的接口 (Netif 列) 是 lo0, 也就是大家熟知的 回环设备。 它表示所有以此为 目的地 的通信都留在本机, 而不通过 LAN 发出, 因为这些流量最终会回到起点。 以太网 MAC 地址 接着出现的是以 0:e0: 开头的地址。这些是以太网硬件地址,也称为 MAC 地址。 FreeBSD 会自动识别在同一个以太网中的任何主机 (如 test0), 并为其新增一个路由, 并通过那个以太网接口 — ed0 直接与它通讯 (译者注:那台主机)。与这类路由表相关的也有一个超时项 (Expire列),当我们在指定时间内没有收到从那个主机发来的信息, 这项就派上用场了。这种情况下,到这个主机的路由就会被自动删除。 这些主机被使用一种叫做RIP(路由信息协议--Routing Information Protocol)的机制所识别,这种机制利用基于最短路径选择 (shortest path determination)的办法计算出到本地主机的路由。 子网 FreeBSD 也会为本地子网添加子网路由(10.20.30.255 是子网 10.20.30 的广播地址,而 example.com 是这个子网相联的域名)。 名称 link#1 代表主机上的第一块以太网卡。 您会发现,对于它们没有指定另外的接口。 这两个组(本地网络主机和本地子网)的路由是由守护进程 routed 自动配置的。如果它没有运行, 那就只有被静态定义 (例如,明确输入的) 的路由才存在了。 host1 行代表我们的主机,它通过以太网地址来识别。 因为我们是发送端,FreeBSD知道使用回环接口 (lo0) 而不是通过以太网接口来进行发送。 两个 host2 行是我们使用 &man.ifconfig.8; 别名 (请看关于以太网的那部分就会知道我们为什么这么做) 时产生的一个实例。在 lo0 接口之后的 => 符号表明我们不仅使用了回环 (因为这个地址也涉及了本地主机),而且明确指出它是个别名。 这类路由只有在支持别名的主机上才能显现出来。 所有本地网上的其它的主机对于这类路由只会简单拥有 link#1 最后一行 (目标子网224) 用于处理多播——它会覆盖到其它的区域。 最后,每个路由的不同属性可以在 Flags 列中看到。下边是个关于这些标志和它们的含义的一个简表: U Up: 路由处于活动状态。 H Host: 路由目标是单个主机。 G Gateway: 所有发到目的地的网络传到这一远程系统上, 并由它决定最后发到哪里。 S Static: 这个路由是手工配置的,不是由系统自动生成的。 C Clone: 生成一个新的路由, 通过这个路由我们可以连接上这些机子。 这种类型的路由通常用于本地网络。 W WasCloned: 指明一个路由——它是基于本地区域网络 (克隆) 路由自动配置的。 L Link: 路由涉及到了以太网硬件。 默认路由 默认路由 当本地系统需要与远程主机建立连接时, 它会检查路由表以决定是否有已知的路径存在。 如果远程主机属于一个我们已知如何到达 (克隆的路由) 的子网内,那么系统会检查看沿着那个接口是否能够连接。 如果所有已知路径都失败,系统还有最后一个选择: 默认路由。这个路由是特殊类型的网关路由 (通常只有一个存在于系统里),并且总是在标志栏使用一个 c来进行标识。对于本地区域网络里的主机, 这个网关被设置到任何与外界有直接连接的机子里 (无论是通过 PPP、DSL、cable modem、T1 或其它的网络接口连接)。 如果您正为某台本身就做为网关连接外界的机子配置默认路由的话, 那么该默认路由应该是您的互联网服务商 (ISP)那方的网关机子。 让我们来看一个关于默认路由的例子。这是个很普遍的配置: [Local2] <--ether--> [Local1] <--PPP--> [ISP-Serv] <--ether--> [T1-GW] 主机 Local1Local2 在您那边。Local1 通过 PPP 拨号连接到了 ISP。这个 PPP 服务器通过一个局域网连接到另一台网关机子——它又通过一个外部接口连接到 ISP 提供的互联网上。 您的每一台机子的默认路由应该是: Host Default Gateway Interface Local2 Local1 Ethernet Local1 T1-GW PPP 一个常见的问题是我们为什么 (或怎样) 能将 T1-GW 设置成为 Local1 默认网关,而不是它所连接 ISP 服务器? 记住,因为 PPP 接口使用的一个地址是在 ISP 的局域网里的,用于您那边的连接,对于 ISP 的局域网里的其它机子,其路由会自动产生。 因此,您就已经知道了如何到达机子 T1-GW, 那么也就没必要中那一步了——发送通信给 ISP 服务器。 通常使用地址 X.X.X.1 做为一个局域网的网关。 因此 (使用相同的例子),如果您本地的 C 类地址空间是 10.20.30,而您的 ISP 使用的是 10.9.9, 那么默认路由表将是: Host Default Route Local2 (10.20.30.2) Local1 (10.20.30.1) Local1 (10.20.30.1, 10.9.9.30) T1-GW (10.9.9.1) 您可以很轻易地通过 /etc/rc.conf 文件设定默认路由。在我们的实例里,在主机 Local2 里,我们在文件 /etc/rc.conf 里增加了下边内容: defaultrouter="10.20.30.1" 也可以直接在命令行使用 &man.route.8; 命令: &prompt.root; route add default 10.20.30.1 要了解关于如何手工维护网络路由表的进一步细节, 请参考 &man.route.8; 联机手册。 重宿主机(Dual Homed Hosts) 重宿 主机 还有一种其它的类型的配置是我们要提及的, 这就是一个主机处于两个不同的网络。技术上,任何作为网关 (上边的实例中,使用了 PPP 连接) 的机子就算作是重宿主机。 但这个词实际上仅用来指那种处于两个局域网之中的机子。 有一种情形,一台机子有两个网卡, 对于各个子网都有各自的一个地址。另一种情况, 这台机子仅有一张网卡,但使用 &man.ifconfig.8; 做了别名。如果有两个独立的以太网在使用的情形就使用前者, 如果只有一个物理网段,但逻辑上分成了两个独立的子网, 就使用后者。 每种情况都要设置路由表以便两子网都知道这台主机是到其它子网的网关——入站路由 (inbound route)。将一台主机配置成两个子网间的路由器, 这种配置经常在我们需要实现单向或双向的包过滤或防火墙时被用到。 如果想让主机在两个接口间转发数据包,您需要激活 FreBSD 的这项功能。至于怎么做,请看下一部分了解更多。 建立路由器 路由器 网络路由器只是一个将数据包从一个接口转发到另一个接口的系统。 互联网标准和良好的工程实践阻止了 FreeBSD 计划在 FreeBSD 中把它置成默认值。您在可以在 &man.rc.conf.5; 中改变下列变量的值为 YES,使这个功能生效: gateway_enable=YES # Set to YES if this host will be a gateway 这个选项会把&man.sysctl.8; 变量——net.inet.ip.forwarding 设置成 1。如果您要临时地停止路由, 您可以把它重设为 0 新的路由器需要有路由才知道将数据传向何处。 如果网络够简单,您可以使用静态路由。FreeBSD 也自带一个标准的BSD路由选择守护进程 &man.routed.8;, 称之为 RIP ( version 1和 version 2) 和 IRDP。对 BGP v4,OSPF v2 和其它复杂路由选择协议的支持可以从 net/zebra 包中得到。 像 &gated; 一样的商业产品也提供了更复杂的网络路由解决方案。 BGP RIP OSPF Coranth Gryphon 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
设置静态路由 手动配置 假设如下这样一个网络: INTERNET | (10.0.0.1/24) Default Router to Internet | |Interface xl0 |10.0.0.10/24 +------+ | | RouterA | | (FreeBSD gateway) +------+ | Interface xl1 | 192.168.1.1/24 | +--------------------------------+ Internal Net 1 | 192.168.1.2/24 | +------+ | | RouterB | | +------+ | 192.168.2.1/24 | Internal Net 2 在这里,RouterA 是我们的 &os; 机子,它充当连接到互联网其它部分的路由器的角色。 默认路由设置为10.0.0.1, 它就允许与外界连接。我们假定已经正确配置了 RouterB,并且知道如何连接到想去的任何地方。 (在这个图里很简单。只须在 RouterB 上增加默认路由,使用 192.168.1.1 做为网关。) 如果我们查看一下RouterA的路由表, 我们就会看到如下一些内容: &prompt.user; netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 10.0.0.1 UGS 0 49378 xl0 127.0.0.1 127.0.0.1 UH 0 6 lo0 10.0.0/24 link#1 UC 0 0 xl0 192.168.1/24 link#2 UC 0 0 xl1 使用当前的路由表,RouterA 是不能到达我们的内网——Internal Net 2 的。它没有到 192.168.2.0/24 的路由。 一种可以接受的方法是手工增加这条路由。以下的命令会把 Internal Net 2 网络加入到 RouterA 的路由表中,使用192.168.1.2 做为下一个跳跃: &prompt.root; route add -net 192.168.2.0/24 192.168.1.2 现在 RouterA 就可以到达 192.168.2.0/24 网络上的任何主机了。 永久配置 上面的实例对于运行着的系统来说配置静态路由是相当不错了。 只是,有一个问题——如果您重启您的 &os; 机子,路由信息就会消失。 处理附加的静态路由的方法是把它放到您的 /etc/rc.conf 文件里去。 # Add Internal Net 2 as a static route static_routes="internalnet2" route_internalnet2="-net 192.168.2.0/24 192.168.1.2" 配置变量 static_routes 是一串以空格格开的字符串。每一串表示一个路由名字。 在上面的例子中我们中有一个串在 static_routes 里。这个字符串中 internalnet2。 然后我们新增一个配置变量 route_internalnet2, 这里我们把所有传给 &man.route.8;命令的参数拿了过来。 在上面的实例中的我使用的命令是: &prompt.root; route add -net 192.168.2.0/24 192.168.1.2 因此,我们需要的是 "-net 192.168.2.0/24 192.168.1.2" 前边已经提到, 可以把多个静态路由的名称, 放到 static_routes 里边。 接着我们就来建立多个静态路由。 下面几行所展示的, 是在一个假想的路由器上增加 192.168.0.0/24192.168.1.0/24 之间静态路由的例子: static_routes="net1 net2" route_net1="-net 192.168.0.0/24 192.168.0.1" route_net2="-net 192.168.1.0/24 192.168.1.1"
路由传播 路由 传播 我们已经讨论了如何定义通向外界的路由, 但未谈及外界是如何找到我们的。 我们已经知道可以设置路由表, 这样任何指向特定地址空间 (在我们的例子中是一个 C 类子网) 的数据都会被送往网络上特定的主机, 然后由这台主机向地址空间内部转发数据。 当您得到一个分配给您的网络的地址空间时, ISP(网络服务商)会设置它们的路由表, 这样指向您子网的数据就会通过 PPP 连接下传到您的网络。 但是其它跨越国界的网络是如何知道将数据传给您的 ISP 的呢? 有一个系统(很像分布式 DNS 信息系统), 它一直跟踪被分配的地址空间, 并说明它们连接到互联网骨干(Internet backbone)的点。 骨干(Backbone) 指的是负责全世界和跨国的传输的主要干线。 每一台骨干主机(backbone machine)有一份主要表集的副本, 它将发送给特定网络的数据导向相应的骨干载体上(backbone carrier), 从结点往下遍历服务提供商链,直到数据到达您的网络。 服务提供商的任务是向骨干网络广播,以声明它们就是通向您的网点的连接结点 (以及进入的路径)。这就是路由传播。 问题解答 traceroute 有时候,路由传播会有一个问题,一些网络无法与您连接。 或许能帮您找出路由是在哪里中断的最有用的命令就是 &man.traceroute.8;了。当您无法与远程主机连接时, 这个命令一样有用(例如 &man.ping.8; 失败)。 &man.traceroute.8; 命令将以您想连接的主机的名字作为参数执行。 不管是到达了目标,还是因为没有连接而终止, 它都会显示所经过的所有网关主机。 想了解更多的信息,查看 &man.traceroute.8; 的手册。 多播路由 多播路由 内核选项 MROUTING FreeBSD 一开始就支持多播应用软件和多播路由选择。 多播程序并不要求FreeBSD的任何特殊的配置, 就可以工作得很好。多播路由需要支持被编译入内核: options MROUTING 另外,多播路由守护进程——&man.mrouted.8; 必须通过 /etc/mrouted.conf 配置来开启通道和 DVMRP。 更多关于多播路由配置的信息可以在 &man.mrouted.8; 的手册里找到。 + + + &os; 7.0 开始 &man.mrouted.8; + 多播路由守护进程已从基本系统中移除。 实现 DVMRP + 多播路由协议的程序主要由 &man.pim.4; 取代。相关的 + &man.map-mbone.8; 和 &man.mrinfo.8 工具也被移除了。 + 这些程序能在 &os; 的 Ports Collection + net/mrouted 中找到。 +
陈福康 Marc Fonvieille Murray Stokely 无线网络 wireless networking (无线网络) 802.11 wireless networking (无线网络) 无线网络基础 绝大多数无线网络都采用了 IEEE 802.11 标准。 基本的无线网络中, 都包含多个以 2.4GHz 或 5GHz 频段的无线电波广播的站点 (不过, 随所处地域的不同, 或者为了能够更好地进行通讯, 具体的频率会在 2.3GHz 和 4.9GHz 的范围内变化)。 802.11 网络有两种组织方式: 在 infrastructure 模式 中, 一个通讯站作为主站, 其他通讯站都与其关联; 这种网络称为 BSS, 而主站则成为无线访问点 (AP)。 在 BSS 中, 所有的通讯都是通过 AP 来完成的; 即使通讯站之间要相互通讯, 也必须将消息发给 AP。 在第二种形式的网络中, 并不存在主站, 通讯站之间是直接通讯的。 这种网络形式称作 IBSS, 通常也叫做 ad-hoc 网络 802.11 网络最初在 2.4GHz 频段上部署, 并采用了由 IEEE 802.11 和 802.11b 标准所定义的协议。 这些标准定义了采用的操作频率、 包括分帧和传输速率 (通讯过程中可以使用不同的速率) 在内的 MAC 层特性等。 稍后的 802.11a 标准定义了使用 5GHz 频段进行操作, 以及不同的信号机制和更高的传输速率。 其后定义的 802.11g 标准启用了在 2.4GHz 上如何使用 802.11a 信号和传输机制, 以提供对较早的 802.11b 网络的向前兼容。 802.11 网络中采用的各类底层传输机制提供了不同类型的安全机制。 最初的 802.11 标准定义了一种称为 WEP 的简单安全协议。 这个协议采用固定的预发布密钥, 并使用 RC4 加密算法来对在网络上传输的数据进行编码。 全部通讯站都必须采用同样的固定密钥才能通讯。 这一格局已经被证明很容易被攻破, 因此目前已经很少使用了, 采用这种方法只能让那些接入网络的用户迅速断开。 最新的安全实践是由 IEEE 802.11i 标准给出的, 它定义了新的加密算法, 并通过一种附加的协议来让通讯站向无线访问点验证身份, 并交换用于进行数据通讯的密钥。 更进一步, 用于加密的密钥会定期地刷新, 而且有机制能够监测入侵的尝试 (并阻止这种尝试)。 无线网络中另一种常用的安全协议标准是 WPA。 这是在 802.11i 之前由业界组织定义的一种过渡性标准。 WPA 定义了在 802.11i 中所规定的要求的子集, 并被设计用来在旧式硬件上实施。 特别地, WPA 要求只使用由最初 WEP 所采用的算法派生的 TKIP 加密算法。 802.11i 则不但允许使用 TKIP, 而且还要求支持更强的加密算法 AES-CCM 来用于加密数据。 (在 WPA 中并没有要求使用 AES 加密算法, 因为在旧式硬件上实施这种算法时所需的计算复杂性太高。) 除了前面介绍的那些协议标准之外, 还有一种需要介绍的标准是 802.11e。 它定义了用于在 802.11 网络上运行多媒体应用, 如视频流和使用 IP 传送的语音 (VoIP) 的协议。 与 802.11i 类似, 802.11e 也有一个前身标准, 通常称作 WME (后改名为 WMM), 它也是由业界组织定义的 802.11e 的子集, 以便能够在旧式硬件中使用多媒体应用。 关于 802.11e 与 WME/WMM 之间的另一项重要区别是, 前者允许对流量通过服务品质 (QoS) 协议和增强媒体访问协议来安排优先级。 对于这些协议的正确实现, 能够实现高速突发数据和流量分级。 从 6.0 版本开始, &os; 支持采用 802.11a, 802.11b 和 802.11g 的网络。 类似地, 它也支持 WPA 和 802.11i 安全协议 (与 11a、 11b 和 11g 配合), 而 WME/WMM 所需要的 QoS 和流量分级, 则在部分无线设备上提供了支持。 基本安装 内核配置 要使用无线网络, 您需要一块无线网卡, 并适当地配置内核令其提供无线网络支持。 后者被分成了多个模块, 因此您只需配置使用您所需要的软件就可以了。 首先您需要的是一个无线设备。 最为常用的一种无线配件是 Atheros 生产的。 这些设备由 &man.ath.4; 驱动程序提供支持, 您需要把下面的配置加入到 /boot/loader.conf 文件中: if_ath_load="YES" Atheros 驱动分为三个部分: 驱动部分 (&man.ath.4;)、 用于处理芯片专有功能的支持层 (&man.ath.hal.4;), 以及一组用以选择传输帧速率的算法 (ath_rate_sample here)。 当以模块方式加载这一支持时, 所需的其它模块会自动加载。 如果您使用的不是 Atheros 设备, 则应选择对应的模块; 例如: if_wi_load="YES" 表示使用基于 Intersil Prism 产品的无线设备 (&man.wi.4; 驱动)。 在这篇文挡余下的部分中, 我们将使用一张 &man.ath.4; 卡作示范, 如果您要套用这些配置的话, 就必须根据实际的配置情况来替换设备名。 在联机手册 &man.wlan.4; 的开头部分给出了一份可用的驱动列表。 如果您的无线设备没有专用于 &os; 的驱动程序, 也可以尝试使用 NDIS 驱动封装机制来直接使用 &windows; 驱动。 在配置好设备驱动之后, 您还需要引入驱动程序所需要的 802.11 网络支持。 对于 &man.ath.4; 驱动而言, 至少需要 &man.wlan.4; 模块; 这个模块会自动随无线设备驱动一同加载。 除此之外, 您还需要提供您希望使用的安全协议所需的加密支持模块。 这些模块是设计来让 &man.wlan.4; 模块根据需要自动加载的, 但目前还必须手工进行配置。 您可以使用下面这些模块: &man.wlan.wep.4;、 &man.wlan.ccmp.4; 和 &man.wlan.tkip.4;。 &man.wlan.ccmp.4; 和 &man.wlan.tkip.4; 这两个驱动都只有在您希望采用 WPA 和/或 802.11i 安全协议时才需要。 如果您的网络是完全开放的 (也就是不加密) 则甚至连 &man.wlan.wep.4; 支持也是不需要的。 要在系统引导时加载这些模块, 就需要在 /boot/loader.conf 中加入下面的配置: wlan_wep_load="YES" wlan_ccmp_load="YES" wlan_tkip_load="YES" 通过系统引导配置文件 (也就是 /boot/loader.conf) 中的这些信息生效, 您必须重新启动运行 &os; 的计算机。 如果不想立刻重新启动, 也可以使用 &man.kldload.8; 来手工加载。 如果不想加载模块, 也可以将这些驱动编译到内核中, 方法是在内核的编译配置文件中加入下面的配置: device ath # Atheros IEEE 802.11 wireless network driver device ath_hal # Atheros Hardware Access Layer device ath_rate_sample # John Bicket's SampleRate control algorithm. device wlan # 802.11 support (Required) device wlan_wep # WEP crypto support for 802.11 devices device wlan_ccmp # AES-CCMP crypto support for 802.11 devices device wlan_tkip # TKIP and Michael crypto support for 802.11 devices 将这些信息写到内核编译配置文件中之后, 您需要重新编译内核, 并重新启动运行 &os; 的计算机。 在系统启动之后, 您会在引导时给出的信息中, 找到类似下面这样的关于无线设备的信息: ath0: <Atheros 5212> mem 0xff9f0000-0xff9fffff irq 17 at device 2.0 on pci2 ath0: Ethernet address: 00:11:95:d5:43:62 ath0: mac 7.9 phy 4.5 radio 5.6 Infrastructure 模式 通常的情形中使用的是 infrastructure 模式或称 BSS 模式。 在这种模式中, 有一系列无线访问点接入了有线网络。 每个无线网都会有自己的名字, 这个名字称作网络的 SSID。 无线客户端都通过无线访问点来完成接入。 &os; 客户机 如何查找无线访问点 您可以通过使用 ifconfig 命令来扫描网络。 由于系统需要在操作过程中切换不同的无线频率并探测可用的无线访问点, 这种请求可能需要数分钟才能完成。 只有超级用户才能启动这种扫描: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS dlinkap 00:13:46:49:41:76 6 54M 29:3 100 EPS WPA WME freebsdap 00:11:95:c3:0d:ac 1 54M 22:1 100 EPS WPA 在开始扫描之前, 必须将网络接口设为 。 后续的扫描请求就不需要再将网络接口设为 up 了。 扫描会列出所请求到的所有 BSS/IBSS 网络列表。 除了网络的名字 SSID 之外, 我们还会看到 BSSID 即无线访问点的 MAC 地址。 而 CAPS 字段则给出了网络类型及其提供的功能, 其中包括: E Extended Service Set (ESS)。 表示通讯站是 infrastructure 网络 (相对于 IBSS/ad-hoc 网络) 的成员。 I IBSS/ad-hoc 网络。 表示通讯站是 ad-hoc 网络 (相对于 ESS 网络) 的成员。 P 私密。 在 BSS 中交换的全部数据帧均需保证数据保密性。 这表示 BSS 需要通讯站使用加密算法, 例如 WEP、 TKIP 或 AES-CCMP 来加密/解密与其他通讯站交换的数据帧。 S 短前导码 (Short Preamble)。 表示网络采用的是短前导码 (由 802.11b High Rate/DSSS PHY 定义, 短前导码采用 56-位 同步字段, 而不是在长前导码模式中所采用的 128-位 字段)。 s 短碰撞槽时间 (Short slot time)。 表示由于不存在旧式 (802.11b) 通讯站, 802.11g 网络正使用短碰撞槽时间。 要显示目前已知的网络, 可以使用下面的命令: &prompt.root; ifconfig ath0 list scan 这些信息可能会由无线适配器自动更新, 也可使用 手动更新。 快取缓存中的旧数据会自动删除, 因此除非进行更多扫描, 这个列表会逐渐缩小。 基本配置 在这一节中我们将展示一个简单的例子来介绍如何让无线网络适配器在 &os; 中以不加密的方式工作。 在您熟悉了这些概念之后, 我们强烈建议您在实际的使用中采用 WPA 来配置网络。 配置无线网络的过程可分为三个基本步骤: 选择无线访问点、 验证您的通讯站身份, 以及配置 IP 地址。 下面的几节中将分步骤地介绍它们。 选择无线访问点 多数时候让系统以内建的探测方式选择无线访问点就可以了。 这是在您将网络接口置为 up 或在 /etc/rc.conf 中配置 IP 地址时的默认方式, 例如: ifconfig_ath0="DHCP" 如果存在多个无线访问点, 而您希望从中选择具体的一个, 则可以通过指定 SSID 来实现: ifconfig_ath0="ssid your_ssid_here DHCP" 在某些环境中, 多个访问点可能会使用同样的 SSID (通常, 这样做的目的是简化漫游), 这时可能就需要与某个具体的设备关联了。 这种情况下, 您还应指定无线访问点的 BSSID (这时可以不指定 SSID): ifconfig_ath0="ssid your_ssid_here bssid xx:xx:xx:xx:xx:xx DHCP" 除此之外, 还有一些其它的方法能够约束查找无线访问点的范围, 例如限制系统扫描的频段, 等等。 如果您的无线网卡支持多个频段, 这样做可能会非常有用, 因为扫描全部可用频段是一个十分耗时的过程。 要将操作限制在某个具体的频段, 可以使用 参数; 例如: ifconfig_ath0="mode 11g ssid your_ssid_here DHCP" 就会强制卡使用采用 2.4GHz 的 802.11g, 这样在扫描的时候, 就不会考虑那些 5GHz 的频段了。 除此之外, 还可以通过 参数来将操作锁定在特定频率, 以及通过 参数来指定扫描的频段列表。 关于这些参数的进一步信息, 可以在联机手册 &man.ifconfig.8; 中找到。 验证身份 一旦您选定了无线访问点, 您的通讯站就需要完成身份验证, 以便开始发送和接收数据。 身份验证可以通过许多方式进行, 最常用的一种方式称为开放式验证, 它允许任意通讯站加入网络并相互通信。 这种验证方式只应在您第一次配置无线网络进行测试时使用。 其它的验证方式则需要在进行数据通讯之前, 首先进行密钥协商握手; 这些方式要么使用预先分发的密钥或密码, 要么是用更复杂一些的后台服务, 如 RADIUS。 绝大多数用户会使用默认的开放式验证, 而第二多的则是 WPA-PSK, 它也称为个人 WPA, 在 下面 的章节中将进行介绍。 如果您使用 &apple; &airport; Extreme 基站作为无线访问点, 则可能需要同时在两端配置 WEP 共享密钥验证。 这可以通过在 /etc/rc.conf 文件中进行设置, 或使用 &man.wpa.supplicant.8; 程序来手工完成。 如果您只有一个 &airport; 基站, 则可以用类似下面的方法来配置: ifconfig_ath0="authmode shared wepmode on weptxkey 1 wepkey 01234567 DHCP" 一般而言, 应尽量避免使用共享密钥这种验证方法, 因为它以非常受限的方式使用 WEP 密钥, 使得攻击者能够很容易地破解密钥。 如果必须使用 WEP (例如, 为了兼容旧式的设备) 最好使用 WEP 配合 open 验证方式。 关于 WEP 的更多资料请参见 通过 DHCP 获取 IP 地址 在您选定了无线访问点, 并配置了验证参数之后, 还必须获得 IP 地址才能真正开始通讯。 多数时候, 您会通过 DHCP 来获得无线 IP 地址。 要达到这个目的, 只需简单地编辑 /etc/rc.conf 并在配置中加入 DHCP ifconfig_ath0="DHCP" 现在您已经完成了启用无线网络接口的全部准备工作了, 下面的操作将启用它: &prompt.root; /etc/rc.d/netif start 一旦网络接口开始运行, 就可以使用 ifconfig 来查看网络接口 ath0 的状态了: &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/54Mbps) status: associated ssid dlinkap channel 6 bssid 00:13:46:49:41:76 authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 这里的 status: associated 表示您已经连接到了无线网络 (在这个例子中, 这个网络的名字是 dlinkap)。 bssid 00:13:46:49:41:76 是指您所用无线访问点的 MAC 地址; authmode 这行指出您所做的通讯将不进行加密 (OPEN)。 静态 IP 地址 如果无法从某个 DHCP 服务器获得 IP 地址, 则可以配置一个静态 IP 地址, 方法是将前面的 DHCP 关键字替换为地址信息。 请务必保持其他用于连接无线访问点的参数: ifconfig_ath0="ssid your_ssid_here inet 192.168.1.100 netmask 255.255.255.0" WPA WPA (Wi-Fi 保护访问) 是一种与 802.11 网络配合使用的安全协议, 其目的是消除 WEP 中缺少身份验证能力的问题, 以及一些其它的安全弱点。 WPA 采用了 802.1X 认证协议, 并采用从多种与 WEP 不同的加密算法中选择一种来保证数据保密性。 WPA 支持的唯一一种加密算法是 TKIP (临时密钥完整性协议), 这是一种对 WEP 所采用的基本 RC4 加密算法的扩展, 除此之外还提供了对检测到的入侵的响应机制。 TKIP 被设计用来与旧式硬件一同工作, 只需要进行部分软件修改; 它提供了一种改善安全性的折衷方案, 但仍有可能受到攻击。 WPA 也指定了 AES-CCMP 加密作为 TKIP 的替代品, 在可能时倾向于使用这种加密; 表达这一规范的常用术语是 WPA2 (或 RSN)。 WPA 定义了验证和加密协议。 验证通常是使用两种方法之一来完成的: 通过 802.1X 或类似 RADIUS 这样的后端验证服务, 或通过在通讯站和无线访问点之间通过事先分发的密码来进行最小握手。 前一种通常称作企业 WPA, 而后者通常也叫做个人 WPA。 因为多数人不会为无线网络配置 RADIUS 后端服务器, 因此 WPA-PSK 是在 WPA 中最为常见的一种。 对无线连接的控制和身份验证工作 (密钥协商或通过服务器验证) 是通过 &man.wpa.supplicant.8; 工具来完成的。 这个程序运行时需要一个配置文件, /etc/wpa_supplicant.conf。 关于这个文件的更多信息, 请参考联机手册 &man.wpa.supplicant.conf.5;。 WPA-PSK WPA-PSK 也称作 个人-WPA, 它基于预先分发的密钥 (PSK), 这个密钥是根据作为无线网络上使用的主密钥的密码生成的。 这表示每个无线用户都会使用同样的密钥。 WPA-PSK 主要用于小型网络, 在这种网络中, 通常不需要或没有办法架设验证服务器。 无论何时, 都应使用足够长, 且包括尽可能多字母和数字的强口令, 以免被猜出和/或攻击。 第一步是修改配置文件 /etc/wpa_supplicant.conf, 并在其中加入在您网络上使用的 SSID 和事先分发的密钥: network={ ssid="freebsdap" psk="freebsdmall" } 接下来, 在 /etc/rc.conf 中, 我们将指定无线设备的配置, 令其采用 WPA, 并通过 DHCP 来获取 IP 地址: ifconfig_ath0="WPA DHCP" 下面, 启用无线网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 5 DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 6 DHCPOFFER from 192.168.0.1 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 除此之外, 您也可以手动地使用 above 中那份 /etc/wpa_supplicant.conf 来配置, 方法是执行: &prompt.root; wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf Trying to associate with 00:11:95:c3:0d:ac (SSID='freebsdap' freq=2412 MHz) Associated with 00:11:95:c3:0d:ac WPA: Key negotiation completed with 00:11:95:c3:0d:ac [PTK=TKIP GTK=TKIP] 接下来的操作, 是运行 dhclient 命令来从 DHCP 服务器获取 IP: &prompt.root; dhclient ath0 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/48Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 如果 /etc/rc.conf 的配置中, 使用了 ifconfig_ath0="DHCP", 就不需要手工运行 dhclient 命令了, 因为 dhclient 将在 wpa_supplicant 探测到密钥之后执行。 在这个例子中, DHCP 并不可用, 您可以在 wpa_supplicant 为通讯站完成了身份认证之后, 指定静态 IP 地址: &prompt.root; ifconfig ath0 inet 192.168.0.100 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 如果没有使用 DHCP, 还需要手工配置默认网关, 以及域名服务器: &prompt.root; route add default your_default_router &prompt.root; echo "nameserver your_DNS_server" >> /etc/resolv.conf 使用 EAP-TLS 的 WPA 使用 WPA 的第二种方式是使用 802.1X 后端验证服务器, 在这个例子中, WPA 也称作 企业-WPA, 以便与安全性较差、 采用事先分发密钥的 个人-WPA 区分开来。 在 企业-WPA 中, 验证操作是采用 EAP 完成的 (可扩展认证协议)。 EAP 并未附带加密方法, 因此设计者决定将 EAP 放在加密信道中进行传送。 为此设计了许多 EAP 验证方法, 最常用的方法是 EAP-TLS、 EAP-TTLS 和 EAP-PEAP。 EAP-TLS (带 传输层安全 的 EAP) 是一种在无线世界中得到了广泛支持的验证协议, 因为它是 Wi-Fi 联盟 核准的第一个 EAP 方法。 EAP-TLS 需要使用三个证书: CA 证书 (在所有计算机上安装)、 用以向您证明服务器身份的服务器证书, 以及每个无线客户端用于证明身份的客户机证书。 在这种 EAP 方式中, 验证服务器和无线客户端均通过自己的证书向对方证明身份, 它们均验证对方的证书是本机构的证书发证机构 (CA) 签发的。 与之前介绍的方法类似, 配置也是通过 /etc/wpa_supplicant.conf 来完成的: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=TLS identity="loader" ca_cert="/etc/certs/cacert.pem" client_cert="/etc/certs/clientcert.pem" private_key="/etc/certs/clientkey.pem" private_key_passwd="freebsdmallclient" } 这个字段表示网络名 (SSID)。 这里, 我们使用 RSN (IEEE 802.11i) 协议, 也就是 WPA2。 key_mgmt 这行表示所用的密钥管理协议。 在我们的例子中, 它是使用 EAP 验证的 WPA: WPA-EAP 这个字段中, 提到了我们的连接采用 EAP 方式。 identity 字段包含了 EAP 的实体串。 ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。 client_cert 这行给出了客户机证书的路径名。 对每个无线客户端而言, 这个证书都是在全网范围内唯一的。 private_key 字段是客户机证书私钥文件的路径名。 private_key_passwd 字段是私钥的口令字。 接着, 把下面的配置加入到 /etc/rc.conf ifconfig_ath0="WPA DHCP" 下一步是使用 rc.d 机制来启用网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 如前面提到的那样, 也可以手工通过 wpa_supplicantifconfig 命令达到类似的目的。 使用 EAP-TTLS 的 WPA 在使用 EAP-TLS 时, 参与验证过程的服务器和客户机都需要证书, 而在使用 EAP-TTLS (带传输层安全隧道的 EAP) 时, 客户机证书则是可选的。 这种方式与某些安全 web 站点更为接近, 即使访问者没有客户端证书, 这些 web 服务器也能建立安全的 SSL 隧道。 EAP-TTLS 会使用加密的 TLS 隧道来传送验证信息。 对于它的配置, 同样是通过 /etc/wpa_supplicant.conf 文件来进行的: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=TTLS identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase2="auth=MD5" } 这个字段是我们的连接所采用的 EAP 方式。 identity 字段中是在加密 TLS 隧道中用于 EAP 验证的身份串。 password 字段中是用于 EAP 验证的口令字。 ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。 这个字段中给出了加密 TLS 隧道中使用的验证方式。 在这个例子中, 我们使用的是带 MD5-加密口令 的 EAP。 inner authentication (译注:内部鉴定) 通常也叫 phase2 您还必须把下面的配置加入到 /etc/rc.conf ifconfig_ath0="WPA DHCP" 下一步是启用网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 使用 EAP-PEAP 的 WPA PEAP (受保护的 EAP) 被设计用以替代 EAP-TTLS。 有两种类型的 PEAP 方法, 最常用的是 PEAPv0/EAP-MSCHAPv2。 在这篇文档余下的部分中, 术语 PEAP 是指这种 EAP 方法。 PEAP 是在 EAP-TLS 之后最为常用的 EAP 标准, 换言之, 如果您的网络中有多种不同的操作系统, PEAP 将是仅次于 EAP-TLS 的支持最广的标准。 PEAP 与 EAP-TTLS 很像: 它使用服务器端证书, 通过在客户端与验证服务器之间建立加密的 TLS 隧道来向用户验证身份, 这保护了验证信息的交换过程。 在安全方面, EAP-TTLS 与 PEAP 的区别是 PEAP 会以明文广播用户名, 只有口令是通过加密 TLS 隧道传送的。 而 EAP-TTLS 在传送用户名和口令时, 都使用 TLS 隧道。 我们需要编辑 /etc/wpa_supplicant.conf 文件, 并加入与 EAP-PEAP 有关的配置: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=PEAP identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase1="peaplabel=0" phase2="auth=MSCHAPV2" } 这个字段的内容是用于连接的 EAP 方式。 identity 字段中是在加密 TLS 隧道中用于 EAP 验证的身份串。 password 字段中是用于 EAP 验证的口令字。 ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。 这个字段包含了第一阶段验证 (TLS 隧道) 的参数。 随您使用的验证服务器的不同, 您需要指定验证的标签。 多数时候, 标签应该是 客户端 EAP 加密, 这可以通过使用 peaplabel=0 来指定。 更多信息可以在联机手册 &man.wpa.supplicant.conf.5; 中找到。 这个字段的内容是验证协议在加密的 TLS 隧道中使用的信息。 对 PEAP 而言, 这是 auth=MSCHAPV2 您还必须把下面的配置加入到 /etc/rc.conf ifconfig_ath0="WPA DHCP" 下一步是启用网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 WEP WEP (有线等效协议) 是最初 802.11 标准的一部分。 其中没有提供身份验证机制, 只提供了弱访问控制, 而且很容易破解。 WEP 可以通过 ifconfig 配置: &prompt.root; ifconfig ath0 ssid my_net wepmode on weptxkey 3 wepkey 3:0x3456789012 \ inet 192.168.1.100 netmask 255.255.255.0 weptxkey 指明了使用哪个 WEP 密钥来进行数据传输。 这里我们使用第三个密钥。 它必须与无线访问点的配置一致。 wepkey 表示设置所选的 WEP 密钥。 其格式应为 index:key, 如果没有给出 index 值, 则默认为 1。 因此, 如果需要设置的密钥不是第一个, 就必需指定 index 了。 您需要将 0x3456789012 改为在无线接入点上配置的那个。 我们建议您阅读联机手册 &man.ifconfig.8; 来了解进一步的信息。 wpa_supplicant 机制也可以用来配置您的无线网卡使用 WEP。 前面的例子也可以通过在 /etc/wpa_supplicant.conf 中加入下述设置来实现: network={ ssid="my_net" key_mgmt=NONE wep_key3=3456789012 wep_tx_keyidx=3 } 接着: &prompt.root; wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf Trying to associate with 00:13:46:49:41:76 (SSID='dlinkap' freq=2437 MHz) Associated with 00:13:46:49:41:76 Ad-hoc 模式 IBSS 模式, 也称为 ad-hoc 模式, 是为点对点连接设计的。 例如, 如果希望在计算机 AB 之间建立 ad-hoc 网络, 我们只需选择两个 IP 地址和一个 SSID 就可以了。 在计算机 A 上: &prompt.root; ifconfig ath0 ssid freebsdap mediaopt adhoc inet 192.168.0.1 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4 ether 00:11:95:c3:0d:ac media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>) status: associated ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 此处的 adhoc 参数表示无线网络接口应以 IBSS 模式运转。 此时, 在 B 上应该能够检测到 A 的存在了: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS freebsdap 02:11:95:c3:0d:ac 2 54M 19:3 100 IS 在输出中的 I 再次确认了 A 机是以 ad-hoc 模式运行的。 我们只需给 B 配置一不同的 IP 地址: &prompt.root; ifconfig ath0 ssid freebsdap mediaopt adhoc inet 192.168.0.2 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>) status: associated ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 这样, AB 就可以交换信息了。 &os; 基于主机的(无线)访问接入点 &os; 可以作为一个(无线)访问接入点(AP), 这样可以不必再去买一个硬件 AP 或者使用 ad-hoc 模式的网络。 当你的 &os; 机器作为网关连接到另外一个网络的时候将非常有用。 基本配置 在把你的 &os; 机器配置成一个 AP 以前, 你首先需要先在内核配置好对你的无线网卡的无线网络支持。 当然你还需要加上你想用的安全协议。想获得更详细的信息, 请参阅 目前还不支持使用 &windows; 驱动和 NDIS 驱动包装的网卡做为 AP 使用。只有 &os; 原生的无线驱动能够支持 AP 模式。 一旦装载了无线网络的支持, 你就可以检查一下看看你的无线设备是否支持基于主机的无线访问接入模式 (通常也被称为 hostap 模式): &prompt.root; ifconfig ath0 list caps ath0=783ed0f<WEP,TKIP,AES,AES_CCM,IBSS,HOSTAP,AHDEMO,TXPMGT,SHSLOT,SHPREAMBLE,MONITOR,TKIPMIC,WPA1,WPA2,BURST,WME> 这段输出显示了网卡所支持的各种功能; 其中的关键字 HOSTAP 表示这块无线网卡能作为一个(无线)访问接入点使用。 同时也提到了各种加密算法: WEP,TKIP,WPA2,等等, 这些信息对于知道在访问接入点上使用何种安全协议非常重要。 现在这块无线设备在配置了正确的 SSID 和 IP 地址后进入 hostap 模式了。 &prompt.root; ifconfig ath0 ssid freebsdap mode 11g mediaopt hostap inet 192.168.0.1 netmask 255.255.255.0 再一次用 ifconfig 查看一下 ath0 网络接口的状态: &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4 ether 00:11:95:c3:0d:ac media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap> status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 38 bmiss 7 protmode CTS burst dtimperiod 1 bintval 100 hostap 参数说明这个网络接口目前正运行在基于主机的接入访问模式。 也可以在 /etc/rc.conf 中加入以下这行使得网络界面的配置能够在机器启动的时候自动完成: ifconfig_ath0="ssid freebsdap mode 11g mediaopt hostap inet 192.168.0.1 netmask 255.255.255.0" 不使用认证或加密的(无线)访问接入点 尽管我们不推荐运行一个不使用任何认证或加密的 AP, 但这是一个非常简单的检测 AP 是否正常工作的方法。 这样配置对于调试客户端问题也非常重要。 一旦 AP 被配置成了我们前面所展示的那样, 就可以在另外一台无线机器上初始化一次扫描来找到这个 AP: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS freebsdap 00:11:95:c3:0d:ac 1 54M 22:1 100 ES 在客户机上能看到已经连接上了(无线)访问接入点: &prompt.root; ifconfig ath0 ssid freebsdap inet 192.168.0.2 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/54Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 使用 WPA 的(无线)访问接入点 这一段将注重介绍在 &os; (无线)访问接入点上配置使用 WPA 安全协议。 更多有关 WPA 和配置基于 WPA 无线客户端的细节 请参阅 hostapd 守护进程将被用于处理与客户端的认证和在启用 WPA (无线)访问接入点上的密钥管理。 接下来,所有的配置操作都将在作为 AP 的 &os; 机器上完成。 一旦 AP 能够正确的工作了,便把如下这行加入 /etc/rc.conf 使得 hostapd 能在机器启动的时候自动运行: hostapd_enable="YES" 在配置 hostapd 以前, 请确保你已经完成了基本配置中所介绍的步骤 WPA-PSK WPA-PSK 旨在为没有认证服务器的小型网络而设计的。 配置文件为 /etc/hostapd.conf file: interface=ath0 debug=1 ctrl_interface=/var/run/hostapd ctrl_interface_group=wheel ssid=freebsdap wpa=1 wpa_passphrase=freebsdmall wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP TKIP 这一项标明了访问接入点所使用的无线接口。 这一项设置了执行 hostapd 时候显示相关信息的详细程度。 1 表示最小的级别。 ctrl_interface 这项给出了 hostapd 存储与其他外部程序(比如 &man.hostapd.cli.8;) 通信的域套接口文件路径。这里使用了默认值。 ctrl_interface_group 这行设置了允许访问控制界面文件的组属性 (这里我们使用了 wheel 组)。 这一项是设置网络的名称。 wpa 这项表示启用了 WPA 而且指明要使用何种 WPA 认证协议。 值 1 表示 AP 将使用 WPA-PSK。 wpa_passphrase 这项包含用于 WPA 认证的 ASCII 密码。 通常使用从丰富的字母表生成足够长度的强壮密码, 以不至于被轻易的猜测或攻击到。 wpa_key_mgmt 这行表明了我们所使用的密钥管理协议。 在这个例子中是 WPA-PSK。 wpa_pairwise 这项表示(无线)访问接入点所接受的加密算法。 在这个例子中,TKIP(WPA) 和 CCMP(WPA2) 密码都会被接受。 CCMP 密码是除 TKIP 外的另一种选择, CCMP 一般作为首选密码; 仅有在 CCMP 不能被使用的环境中选择 TKIP。 接下来的一步就是运行 hostapd &prompt.root /etc/rc.d/hostapd forcestart &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2290 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4 ether 00:11:95:c3:0d:ac media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap> status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy MIXED deftxkey 2 TKIP 2:128-bit txpowmax 36 protmode CTS dtimperiod 1 bintval 100 现在客户端能够连接上运行的(无线)访问接入点了, 更多细节可以参阅 。 查看有哪些客户连接上了 AP 可以运行命令 ifconfig ath0 list sta 使用 WEP 的(无线)访问接入点 我们不推荐使用 WEP 来设置一个(无线)访问接入点, 因为没有认证的机制并容易被破解。 一些历史遗留下的无线网卡仅支持 WEP 作为安全协议, 这些网卡仅允许搭建不含认证或 WEP 协议的 AP。 在设置了正确的 SSID 和 IP 地址后,无线设备就可以进入 hostap 模式了: &prompt.root; ifconfig ath0 ssid freebsdap wepmode on weptxkey 3 wepkey 3:0x3456789012 mode 11g mediaopt hostap \ inet 192.168.0.1 netmask 255.255.255.0 weptxkey 表示传输中使用哪一个 WEP 密钥。 这个例子中用了第3把密钥(请注意密钥的编号从 1开始)。 这个参数必须设置以用来加密数据。 wepkey 表示设置所使用的 WEP 密钥。 它应该符合 index:key 这样的格式。 如果没有指定 index,那么默认值为 1。 这就是说如果我们使用了除第一把以外的密钥, 那么就需要指定 index。 再使用一次 ifconfig 命令查看 ath0 接口的状态: &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4 ether 00:11:95:c3:0d:ac media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap> status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode OPEN privacy ON deftxkey 3 wepkey 3:40-bit txpowmax 36 protmode CTS dtimperiod 1 bintval 100 现在可以从另外一台无线机器上初始化一次扫描来找到这个 AP 了: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS freebsdap 00:11:95:c3:0d:ac 1 54M 22:1 100 EPS 现在客户机能够使用正确的参数(密钥等) 找到并连上(无线)访问接入点了, 更多细节请参阅 故障排除 如果您在使用无线网络时遇到了麻烦, 此处提供了一系列用以帮助排除故障的步骤。 如果您在列表中找不到无线访问点, 请确认您没有将无线设备配置为使用有限的一组频段。 如果您无法关联到无线访问点, 请确认您的通讯站配置与无线访问点的配置一致。 这包括认证模式以及安全协议。 尽可能简化您的配置。 如果您正使用类似 WPA 或 WEP 这样的安全协议, 请将无线访问点配置为开放验证和不采用安全措施, 并检查是否数据能够通过。 一旦您能够关联到无线访问点之后, 就可以使用简单的工具如 &man.ping.8; 来诊断安全配置了。 wpa_supplicant 提供了许多调试支持; 尝试手工运行它, 在启动时指定 选项, 并察看输出结果。 除此之外还有许多其它的底层调试工具。 您可以使用 /usr/src/tools/tools/net80211 中的 wlandebug 命令来启用 802.11 协议支持层的调试功能。 例如: &prompt.root; wlandebug -i ath0 +scan+auth+debug+assoc net.wlan.0.debug: 0 => 0xc80000<assoc,auth,scan> 可以用来启用与扫描无线访问点和 802.11 协议在安排通讯时与握手有关的控制台信息。 还有许多有用的统计信息是由 802.11 层维护的; wlanstats 工具可以显示这些信息。 这些统计数据能够指出由 802.11 层识别出来的错误。 请注意某些错误可能是由设备驱动在 802.11 层之下识别出来的, 因此这些错误可能并不显示。 要诊断与设备有关的问题, 您需要参考设备驱动程序的文档。 如果上述信息没能帮助您找到具体的问题所在, 请提交问题报告, 并在其中附上这些工具的输出。 Pav Lucistnik 作者:
pav@FreeBSD.org
雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
蓝牙 蓝牙 简介 Bluetooth (蓝牙) 是一项无线技术, 用于建立带宽为 2.4GHZ,波长为 10 米的私有网络。 网络一般是由便携式设备,比加手机 (cellular phone), 掌上电脑 (handhelds) 和膝上电脑 (laptops)) 以 ad-hoc 形式组成。不象其它流行的无线技术——Wi-Fi,Bluetooth 提供了更高级的服务层面,像类 FTP 的文件服务、文件推送 (file pushing)、语音传送、串行线模拟等等。 在 &os; 里,蓝牙栈 (Bluetooth stack) 通过使用 Netgraph 框架 (请看 &man.netgraph.4;) 来的实现。 大量的"Bluetooth USB dongle"由 &man.ng.ubt.4; 驱动程序支持。 基于 Broadcom BCM2033 芯片组的 Bluetooth 设备可以通过 &man.ubtbcmfw.4; 和 &man.ng.ubt.4; 驱动程序支持。 3Com Bluetooth PC 卡 3CRWB60-A 由 &man.ng.bt3c.4; 驱动程序支持。 基于 Serial 和 UART 的蓝牙设备由 &man.sio.4;、&man.ng.h4.4; 和 &man.hcseriald.8;。本节介绍 USB Bluetooth dongle 的使用。 插入设备 默认的 Bluetooth 设备驱动程序已存在于内核模块里。 接入设备前,您需要将驱动程序加载入内核: &prompt.root; kldload ng_ubt 如果系统启动时 Bluetooth 设备已经存在于系统里, 那么从 /boot/loader.conf 里加载这个模块: ng_ubt_load="YES" 插入USB dongle。控制台(console)(或syslog中)会出现类似如下的信息: ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2 ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2 ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3, wMaxPacketSize=49, nframes=6, buffer size=294 - - 在 &os; 6.0, 以及 &os; 5.X 系列中 5.5 之前的版本上, - 蓝牙栈必须手动启动。 在 &os; 5.5、 6.1 以及更新一些的版本上, - 这一工作会由 &man.devd.8; 自动完成。 - 复制 /usr/share/examples/netgraph/bluetooth/rc.bluetooth 到一个合适的地方,如 /etc/rc.bluetooth。 这个脚本用于启动和停止 Bluetooth stack (蓝牙栈)。 最好在拔出设备前停止 stack(stack),当然也不是非做不可。 启动 stack (栈) 时,会得到如下的输出: &prompt.root; /etc/rc.bluetooth start ubt0 BD_ADDR: 00:02:72:00:d4:1a Features: 0xff 0xff 0xf 00 00 00 00 00 <3-Slot> <5-Slot> <Encryption> <Slot offset> <Timing accuracy> <Switch> <Hold mode> <Sniff mode> <Park mode> <RSSI> <Channel quality> <SCO link> <HV2 packets> <HV3 packets> <u-law log> <A-law log> <CVSD> <Paging scheme> <Power control> <Transparent SCO data> Max. ACL packet size: 192 bytes Number of ACL packets: 8 Max. SCO packet size: 64 bytes Number of SCO packets: 8 - HCI 主控制器接口 (HCI) 主控制器接口 (HCI) 提供了通向基带控制器和连接管理器的命令接口及访问硬件状态字和控制寄存器的通道。 这个接口提供了访问蓝牙基带 (Bluetooth baseband) 功能的统一方式。 主机上的 HCI 层与蓝牙硬件上的 HCI 固件交换数据和命令。 主控制器的传输层 (如物理总线) 驱动程序提供两个 HCI 层交换信息的能力。 为每个蓝牙 (Bluetooth) 设备创建一个 hci 类型的 Netgraph 结点。 HCI 结点一般连接蓝牙设备的驱动结点 (下行流) 和 L2CAP 结点 (上行流)。 所有的HCI操作必须在 HCI 结点上进行而不是设备驱动结点。HCI 结点的默认名是 devicehci。更多细节请参考 &man.ng.hci.4; 的联机手册。 最常见的任务是发现在 RF proximity 中的蓝牙 (Bluetooth) 设备。这个就叫做 质询(inquiry)。质询及 HCI 相关的操作可以由 &man.hccontrol.8; 工具来完成。 以下的例子展示如何找出范围内的蓝牙设备。 在几秒钟内您应该得到一张设备列表。 注意远程主机只有被置于 discoverable(可发现) 模式才能答应质询。 &prompt.user; hccontrol -n ubt0hci inquiry Inquiry result, num_responses=1 Inquiry result #0 BD_ADDR: 00:80:37:29:19:a4 Page Scan Rep. Mode: 0x1 Page Scan Period Mode: 00 Page Scan Mode: 00 Class: 52:02:04 Clock offset: 0x78ef Inquiry complete. Status: No error [00] BD_ADDR 是蓝牙设备的特定地址, 类似于网卡的 MAC 地址。需要用此地址与某个设备进一步地通信。 可以为 BD_ADDR 分配由人可读的名字 (human readable name)。 文件 /etc/bluetooth/hosts 包含已知蓝牙主机的信息。 下面的例子展示如何获得分配给远程设备的可读名。 &prompt.user; hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4 BD_ADDR: 00:80:37:29:19:a4 Name: Pav's T39 如果在远程蓝牙上运行质询,您会发现您的计算机是 your.host.name (ubt0)。 分配给本地设备的名字可随时改变。 蓝牙系统提供点对点连接 (只有两个蓝牙设备参与) 和点对多点连接。在点对多点连接中,连接由多个蓝牙设备共享。 以下的例子展示如何取得本地设备的活动基带 (baseband) 连接列表。 &prompt.user; hccontrol -n ubt0hci read_connection_list Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State 00:80:37:29:19:a4 41 ACL 0 MAST NONE 0 0 OPEN connection handle(连接柄) 在需要终止基带连接时有用。注意:一般不需要手动完成。 栈 (stack) 会自动终止不活动的基带连接。 &prompt.root; hccontrol -n ubt0hci disconnect 41 Connection handle: 41 Reason: Connection terminated by local host [0x16] 参考 hccontrol help 获取完整的 HCI 命令列表。大部分 HCI 命令不需要超级用户权限。 L2CAP 逻辑连接控制和适配协议(L2CAP) 逻辑连接控制和适配协议 (L2CAP) 为上层协议提供面向连接和无连接的数据服务, 并提供多协议功能和分割重组操作。L2CAP 充许上层协议和应用软件传输和接收最大长度为 64K 的 L2CAP 数据包。 L2CAP 基于 通道(channel) 的概念。 通道 (Channel) 是位于基带 (baseband) 连接之上的逻辑连接。 每个通道以多对一的方式绑定一个单一协议 (single protocol)。 多个通道可以绑定同一个协议,但一个通道不可以绑定多个协议。 每个在通道里接收到的 L2CAP 数据包被传到相应的上层协议。 多个通道可共享同一个基带连接。 为每个蓝牙 (Bluetooth) 设备创建一个 l2cap 类型的 Netgraph 结点。 L2CAP 结点一般连接 HCI 结点(下行流)和蓝牙设备的驱动结点(上行流)。 L2CAP 结点的默认名是 devicel2cap。 更多细节请参考 &man.ng.l2cap.4; 的联机手册。 一个有用的命令是 &man.l2ping.8;, 它可以用来 ping 其它设备。 一些蓝牙实现可能不会返回所有发送给它们的数据, 所以下例中的 0 bytes 是正常的。 &prompt.root; l2ping -a 00:80:37:29:19:a4 0 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0 &man.l2control.8; 工具用于在 L2CAP 上进行多种操作。 以下这个例子展示如何取得本地设备的逻辑连接 (通道) 和基带连接的列表: &prompt.user; l2control -a 00:02:72:00:d4:1a read_channel_list L2CAP channels: Remote BD_ADDR SCID/ DCID PSM IMTU/ OMTU State 00:07:e0:00:0b:ca 66/ 64 3 132/ 672 OPEN &prompt.user; l2control -a 00:02:72:00:d4:1a read_connection_list L2CAP connections: Remote BD_ADDR Handle Flags Pending State 00:07:e0:00:0b:ca 41 O 0 OPEN 另一个诊断工具是 &man.btsockstat.1;。 它完成与 &man.netstat.1; 类似的操作, 只是用了蓝牙网络相关的数据结构。 以下这个例子显示与 &man.l2control.8; 相同的逻辑连接。 &prompt.user; btsockstat Active L2CAP sockets PCB Recv-Q Send-Q Local address/PSM Foreign address CID State c2afe900 0 0 00:02:72:00:d4:1a/3 00:07:e0:00:0b:ca 66 OPEN Active RFCOMM sessions L2PCB PCB Flag MTU Out-Q DLCs State c2afe900 c2b53380 1 127 0 Yes OPEN Active RFCOMM sockets PCB Recv-Q Send-Q Local address Foreign address Chan DLCI State c2e8bc80 0 250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3 6 OPEN RFCOMM RFCOMM 协议 RFCOMM 协议提供基于 L2CAP 协议的串行端口模拟。 该协议基于 ETSI TS 07.10 标准。RFCOMM 是一个简单的传输协议, 附加了摸拟 9 针 RS-232(EIATIA-232-E) 串行端口的定义。 RFCOMM 协议最多支持 60 个并发连接 (RFCOMM通道)。 为了实现 RFCOMM, 运行于不同设备上的应用程序建立起一条关于它们之间通信段的通信路径。 RFCOMM实际上适用于使用串行端口的应用软件。 通信段是一个设备到另一个设备的蓝牙连接 (直接连接)。 RFCOMM 关心的只是直接连接设备之间的连接, 或在网络里一个设备与 modem 之间的连接。RFCOMM 能支持其它的配置, 比如在一端通过蓝牙无线技术通讯而在另一端使用有线接口。 在&os;,RFCOMM 协议在蓝牙套接字层 (Bluetooth sockets layer) 实现。 结对 设备的结对(Pairing of Devices) 默认情况下,蓝牙通信是不需要验证的, 任何设备可与其它任何设备对话。一个蓝牙设备 (比如手机) 可以选择通过验证以提供某种特殊服务 (比如拨号服务)。 蓝牙验证一般使用 PIN码(PIN codes)。 一个 PIN 码是最长为 16 个字符的 ASCII 字符串。 用户需要在两个设备中输入相同的PIN码。用户输入了 PIN 码后, 两个设备会生成一个 连接密匙(link key)。 接着连接密钥可以存储在设备或存储器中。 连接时两个设备会使用先前生成的连接密钥。 以上介绍的过程被称为 结对(pairing)。 注意如果任何一方丢失了连接密钥,必须重新进行结对。 守护进程 &man.hcsecd.8; 负责处理所有蓝牙验证请求。 默认的配置文件是 /etc/bluetooth/hcsecd.conf。 下面的例子显示一个手机的 PIN 码被预设为1234 device { bdaddr 00:80:37:29:19:a4; name "Pav's T39"; key nokey; pin "1234"; } PIN 码没有限制(除了长度)。有些设备 (例如蓝牙耳机) 会有一个预置的 PIN 码。 开关强制 &man.hcsecd.8; 守护进程处于前台,因此很容易看清发生了什么。 设置远端设备准备接收结对 (pairing),然后启动蓝牙连接到远端设备。 远端设备应该回应接收了结对并请求PIN码。输入与 hcsecd.conf 中一样的 PIN 码。 现在您的个人计算机已经与远程设备结对了。 另外您也可以在远程设备上初始结点。 在 &os; 5.5、 6.1 以及更新版本上, 可以通过在 /etc/rc.conf 文件中增加下面的行, 以便让 hcsecd 在系统启动时自动运行: hcsecd_enable="YES" 以下是简单的 hcsecd 服务输出样本: hcsecd[16484]: Got Link_Key_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', link key doesn't exist hcsecd[16484]: Sending Link_Key_Negative_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Got PIN_Code_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', PIN code exists hcsecd[16484]: Sending PIN_Code_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4 SDP 服务发现协议 (SDP) 服务发现协议 (SDP) 提供给客户端软件一种方法, 它能发现由服务器软件提供的服务及属性。 服务的属性包括所提供服务的类型或类别, 使用该服务所需要的机制或协议。 SDP 包括 SDP 服务器和 SDP 客户端之间的通信。 服务器维护一张服务记录列表,它介绍服务器上服务的特性。 每个服务记录包含关于单个服务的信息。通过发出 SDP 请求, 客户端会得到服务记录列表的信息。如果客户端 (或者客户端上的应用软件) 决定使用一个服务,为了使用这个服务它必须与服务提供都建立一个独立的连接。 SDP 提供了发现服务及其属性的机制,但它并不提供使用这些服务的机制。 一般地,SDP客户端按照服务的某种期望特征来搜索服务。 但是,即使没有任何关于由 SDP 服务端提供的服务的预设信息, 有时也能令人满意地发现它的服务记录里所描述的是哪种服务类型。 这种发现所提供服务的过程称为 浏览(browsing) 蓝牙 SDP 服务端 &man.sdpd.8; 和命令行客户端 &man.sdpcontrol.8; 都包括在了标准的 &os; 安装里。 下面的例子展示如何进行 SDP 浏览查询。 &prompt.user; sdpcontrol -a 00:01:03:fc:6e:ec browse Record Handle: 00000000 Service Class ID List: Service Discovery Server (0x1000) Protocol Descriptor List: L2CAP (0x0100) Protocol specific parameter #1: u/int/uuid16 1 Protocol specific parameter #2: u/int/uuid16 1 Record Handle: 0x00000001 Service Class ID List: Browse Group Descriptor (0x1001) Record Handle: 0x00000002 Service Class ID List: LAN Access Using PPP (0x1102) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 1 Bluetooth Profile Descriptor List: LAN Access Using PPP (0x1102) ver. 1.0 ...等等。注意每个服务有一个属性 (比如 RFCOMM 通道)列表。 根据服务您可能需要为一些属性做个注释。 有些蓝牙实现 (Bluetooth implementation)不支持服务浏览, 可能会返回一个空列表。这种情况,可以搜索指定的服务。 下面的例子展示如何搜索 OBEX Object Push (OPUSH) 服务: &prompt.user; sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH 要在 &os; 里为蓝牙客户端提供服务,可以使用 &man.sdpd.8; 服务。 在 &os; 5.5、 6.1 和更新版本之上, 可以通过在 /etc/rc.conf 中加入下面的行: sdpd_enable="YES" 接下来使用下面的命令来启动 sdpd 服务: &prompt.root; /etc/rc.d/sdpd start - 在 &os; 6.0, 以及 5.5 之前的 &os; 5.X 版本上, - sdpd 没有集成进系统启动脚本。 - 它可以用下面的命令来手动启动: - - &prompt.root; sdpd - 需要为远端提供蓝牙服务的本地的服务程序会使用本地 SDP 进程注册服务。像这样的程序就有 &man.rfcomm.pppd.8;。 一旦启动它,就会使用本地 SDP 进程注册蓝牙 LAN 服务。 使用本地 SDP 进程注册的服务列表,可以通过本地控制通道发出 SDP 浏览查询获得: &prompt.root; sdpcontrol -l browse 拨号网络 (DUN) 和使用 PPP(LAN) 层面的网络接入 拨号网络 (DUN) 配置通常与 modem 和手机一起使用。 如下是这一配置所涉及的内容: 计算机使用手机或 modem 作为无线 modem 来连接拨号因特网连入服务器, 或者使用其它的拨号服务; 计算机使用手机或 modem 接收数据请求。 使用 PPP(LAN) 层面的网络接入常使用在如下情形: 单个蓝牙设备的局域网连入; 多个蓝牙设备的局域网接入; PC 到 PC (使用基于串行线模拟的 PPP 网络)。 在 &os; 中,两个层面使用 &man.ppp.8; 和 &man.rfcomm.pppd.8; (一种封装器,可以将 RFCOMM 蓝牙连接转换为 PPP 可操作的东西) 来实现。 在使用任何层面之前,一个新的 PPP 标识必须在 /etc/ppp/ppp.conf 中建立。 想要实例请参考 &man.rfcomm.pppd.8;。 在下面的例子中,&man.rfcomm.pppd.8; 用来在 NUN RFCOMM 通道上打开一个到 BD_ADDR 为 00:80:37:29:19:a4 的设备的 RFCOMM 连接。具体的 RFCOMM 通道号要通过 SDP 从远端设备获得。也可以手动指定通 RFCOMM,这种情况下 &man.rfcomm.pppd.8; 将不能执行 SDP 查询。使用 &man.sdpcontrol.8; 来查找远端设备上的 RFCOMM 通道。 &prompt.root; rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup 为了提供 PPP(LAN) 网络接入服务,必须运行 &man.sdpd.8; 服务。一个新的 LAN 客户端条目必须在 /etc/ppp/ppp.conf 文件中建立。 想要实例请参考 &man.rfcomm.pppd.8;。 最后,在有效地通道号上开始 RFCOMM PPP 服务。 RFCOMM PPP 服务会使用本地 SDP 进程自动注册蓝牙 LAN 服务。下面的例子展示如何启动 RFCOMM PPP 服务。 &prompt.root; rfcomm_pppd -s -C 7 -l rfcomm-server OBEX OBEX 对象推送 (OBEX Object Push - OPUSH) 层面 OBEX协议被广泛地用于移动设备之间简单的文件传输。 它的主要用处是在红外线通信领域, 被用于笔记本或手持设备之间的一般文件传输。 OBEX 服务器和客户端由第三方软件包 obexapp实现,它可以从 comms/obexapp port 安装。 OBEX 客户端用于向 OBEX 服务器推入或接出对象。 一个对像可以是(举个例子)商业卡片或约会。 OBEX 客户能通过 SDP 从远程设备取得 RFCOMM 通道号。这可以通过指定服务名代替 RFCOMM 通道号来完成。支持的服务名是有:IrMC、FTRN 和 OPUSH。 也可以用数字来指定 RFCOMM 通道号。下面是一个 OBEX 会话的例子,一个设备信息对像从手机中被拉出, 一个新的对像被推入手机的目录。 &prompt.user; obexapp -a 00:80:37:29:19:a4 -C IrMC obex> get telecom/devinfo.txt devinfo-t39.txt Success, response: OK, Success (0x20) obex> put new.vcf Success, response: OK, Success (0x20) obex> di Success, response: OK, Success (0x20) 为了提供 OBEX 推入服务,&man.sdpd.8; 必须处于运行状态。必须创建一个根目录用于存放所有进入的对象。 根文件夹的默认路径是 /var/spool/obex。 最后,在有效的 RFCOMM 通道号上开始 OBEX 服务。OBEX 服务会使用 SDP 进程自动注册 OBEX 对象推送 (OBEX Object Push) 服务。 下面的例子展示如何启动 OBEX 服务。 &prompt.root; obexapp -s -C 10 串口(SP)层面 串口(SP)层面允许蓝牙设备完成 RS232 (或类似) 串口线的仿真。 这个层面所涉及到情形是, 通过虚拟串口使用蓝牙代替线缆来处理以前的程序。 工具 &man.rfcomm.sppd.1; 来实现串口层。 Pseudo tty 用来作为虚拟的串口。 下面的例子展示如何连接远程设备的串口服务。 注意您不必指定 RFCOMM 通道——&man.rfcomm.sppd.1; 能够通过 SDP 从远端设备那里获得。 如果您想代替它的话,可以在命令行里指定 RFCOMM 通道来实现: &prompt.root; rfcomm_sppd -a 00:07:E0:00:0B:CA -t /dev/ttyp6 rfcomm_sppd[94692]: Starting on /dev/ttyp6... 一旦连接上,pseudo tty就可以充当串口了: &prompt.root; cu -l ttyp6 问题解答 不能连接远端设备 一些较老的蓝牙设备并不支持角色转换 (role switching)。默认情况下,&os; 接受一个新的连接时, 它会尝试进行角色转换并成为主控端 (master)。 不支持角色转换的设备将无法连接。 注意角色转换是在新连接建立时运行的, 因此如果远程设备不支持角色转换,就不可能向它发出请求。 一个 HCI 选项用来在本地端禁用角色转换。 &prompt.root; hccontrol -n ubt0hci write_node_role_switch 0 如果有错, 能否知道到底正在发生什么? 可以。 需要借助第三方软件包 hcidump, 它可以通过 comms/hcidump port 来安装。 hcidump 工具和 &man.tcpdump.1; 非常相像。 它可以用来显示蓝牙数据包的内容, 并将其记录到文件中。
Andrew Thompson 原作 桥接 简介 IP 子网 桥接 有时, 会有需要将一个物理网络分成两个独立的网段, 而不是创建新的 IP 子网, 并将其通过路由器相连。 以这种方式连接两个网络的设备称为 网桥 (bridge)。 有两个网络接口的 FreeBSD 系统可以作为网桥来使用。 网桥通过学习每个网络接口上的 MAC 层地址 (以太网地址) 工作。 只当数据包的源地址和目标地址处于不同的网络时, 网桥才进行转发。 在很多方面,网桥就像一个带有很少端口的以太网交换机。 适合桥接的情况 适合使用网桥的, 有许多种不同的情况。 使多个网络相互联通 网桥的基本操作是将两个或多个网段连接在一起。 由于各式各样的原因, 人们会希望使用一台真正的计算机, 而不是网络设备来充任网桥的角色, 常见的原因包括线缆的限制、 需要进行防火墙, 或为虚拟机网络接口连接虚拟网络。 网桥也可以将无线网卡以 hostap 模式接入有线网络。 过滤/数据整形防火墙 防火墙 NAT 使用防火墙的常见情形是无需进行路由或网络地址转换的情况 (NAT)。 举例来说, 一家通过 DSL 或 ISDN 连接到 ISP 的小公司, 拥有 13 个 ISP 分配的全局 IP 地址和 10 台 PC。 在这种情况下, 由于划分子网的问题, 采用路由来实现防火墙会比较困难。 路由器 DSL ISDN 基于网桥的防火墙可以串接在 DSL/ISDN 路由器的后面, 而无需考虑 IP 编制的问题。 网络监视 网桥可以用于连接两个不同的网段, 并用于监视往返的以太网帧。 这可以通过在网桥接口上使用 &man.bpf.4;/&man.tcpdump.1;, 或通过将全部以太网帧复制到另一个网络接口 (span 口) 来实现。 2层 VPN 通过 IP 连接的网桥, 可以利用 EtherIP 隧道或基于 &man.tap.4; 的解决方案, 如 OpenVPN 可以将两个以太网连接到一起。 2层 冗余 网络可以通过多条链路连接在一起, 并使用生成树协议 (Spanning Tree Protocol) 来阻止多余的通路。 为使以太网能够正确工作, 两个设备之间应该只有一条激活通路, 而生成树能够检测环路, 并将多余的链路置为阻断状态。 当激活通路断开时, 协议能够计算另外一棵树, 并重新激活阻断的通路, 以恢复到网络各点的连通性。 内核配置 这一节主要介绍 &man.if.bridge.4; 网桥实现。 除此之外, 还有一个基于 netgraph 的网桥实现, 如欲了解进一步细节, 请参见联机手册 &man.ng.bridge.4;。 网桥驱动是一个内核模块, 并会随使用 &man.ifconfig.8; 创建网桥接口时自动加载。 您也可以将 device if_bridge 加入到内核配置文件中, 以便将其静态联编进内核。 包过滤可以通过使用了 &man.pfil.9; 框架的任意一种防火墙软件包来完成。 这些防火墙可以以模块形式加载, 也可以静态联编进内核。 通过配合 &man.altq.4; 和 &man.dummynet.4;, 网桥也可以用于流量控制。 启用网桥 网桥是通过接口复制来创建的。 您可以使用 &man.ifconfig.8; 来创建网桥接口, 如果内核不包括网桥驱动, 则它会自动将其载入。 &prompt.root; ifconfig bridge create bridge0 &prompt.root; ifconfig bridge0 bridge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 96:3d:4b:f1:79:7a id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200 root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0 如此就建立了一个网桥接口, 并为其随机分配了以太网地址。 maxaddrtimeout 参数能够控制网桥在转发表中保存多少个 MAC 地址, 以及表项中主机的过期时间。 其他参数控制生成树的运转方式。 将成员网络接口加入网桥。 为了让网桥能够为所有网桥成员接口转发包, 网桥接口和所有成员接口都需要处于启用状态: &prompt.root; ifconfig bridge0 addm fxp0 addm fxp1 up &prompt.root; ifconfig fxp0 up &prompt.root; ifconfig fxp1 up 网桥现在会在 fxp0fxp1 之间转发以太网帧。 等效的 /etc/rc.conf 配置如下, 如此配置将在系统启动时创建同样的网桥。 cloned_interfaces="bridge0" ifconfig_bridge0="addm fxp0 addm fxp1 up" ifconfig_fxp0="up" ifconfig_fxp1="up" 如果网桥主机需要 IP 地址, 则应将其绑在网桥设备本身, 而不是某个成员设备上。 这可以通过静态设置或 DHCP 来完成: &prompt.root; ifconfig bridge0 inet 192.168.0.1/24 除此之外, 也可以为网桥接口指定 IPv6 地址。 防火墙 firewall (防火墙) 当启用包过滤时, 通过网桥的包可以分别在进入的网络接口、 网桥接口和发出的网络接口上进行过滤。 这些阶段均可禁用。 当包的流向很重要时, 最好在成员接口而非网桥接口上配置防火墙。 网桥上可以进行许多配置以决定非 IP 及 ARP 包能否通过, 以及通过 IPFW 实现二层防火墙。 请参见 &man.if.bridge.4; 联机手册以了解进一步的细节。 生成树 网桥驱动实现了快速生成树协议 (RSTP 或 802.1w), 并与较早的生成树协议 (STP) 兼容。 生成树可以用来在网络拓扑中检测并消除环路。 RSTP 提供了比传统 STP 更快的生成树覆盖速度, 这种协议会在相邻的交换机之间交换信息, 以迅速进入转发状态, 而不会产生环路。 下表展示了支持的运行模式: OS 版本 STP 模式 默认模式 &os; 5.4—&os; 6.2 STP STP &os; 6.3+ RSTP 或 STP STP &os; 7.0+ RSTP 或 STP RSTP 使用 stp 命令可以在成员接口上启用生成树。 对包含 fxp0fxp1 的网桥, 可以用下列命令启用 STP: &prompt.root; ifconfig bridge0 stp fxp0 stp fxp1 bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether d6:cf:d5:a0:94:6d id 00:01:02:4b:d4:50 priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200 root id 00:01:02:4b:d4:50 priority 32768 ifcost 0 port 0 member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 3 priority 128 path cost 200000 proto rstp role designated state forwarding member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 4 priority 128 path cost 200000 proto rstp role designated state forwarding 网桥的生成树 ID 为 00:01:02:4b:d4:50 而优先级为 32768。 其中 root id 与生成树相同, 表示这是作为生成树根的网桥。 另一个网桥也启用了生成树: bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 96:3d:4b:f1:79:7a id 00:13:d4:9a:06:7a priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200 root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4 member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 4 priority 128 path cost 200000 proto rstp role root state forwarding member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 5 priority 128 path cost 200000 proto rstp role designated state forwarding 这里的 root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4 表示根网桥是前面的 00:01:02:4b:d4:50, 而从此网桥出发的通路代价为 400000, 此通路到根网桥是通过 port 4fxp0 连接的。 网桥的高级用法 重建流量流 网桥支持监视模式, 在 &man.bpf.4; 处理之后会将包丢弃, 而不是继续处理或转发。 这可以用于将两个或多个接口上的输入转化为一个 &man.bpf.4; 流。 在将两个独立的接口上的传输的 RX/TX 信号重整为一个时, 这会非常有用。 如果希望将四个网络接口上的输入转成一个流: &prompt.root; ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 monitor up &prompt.root; tcpdump -i bridge0 镜像口 (Span port) 网桥收到的每个以太网帧都可以发到镜像口上。 网桥上的镜像口数量没有限制, 如果一个接口已经被配置为镜像口, 则它就不能再作为网桥的成员口来使用。 这种用法主要是为与网桥镜像口相连的监听机配合使用。 如果希望将所有帧发到名为 fxp4 的接口上: &prompt.root; ifconfig bridge0 span fxp4 专用接口 (Private interface) 专用接口不会转发流量到除专用接口之外的其他端口。 这些流量会无条件地阻断, 因此包括 ARP 在内的以太网帧均不会被转发。 如果需要选择性地阻断流量, 则应使用防火墙。 自学习接口 (Sticky Interfaces) 如果网桥的成员接口标记为自学习, 则动态学习的地址项一旦进入转发快取缓存, 即被认为是静态项。 自学习项不会从快取缓存中过期或替换掉, 即使地址在另一接口上出现也是如此。 这使得不必事先发布转发表, 也能根据学习结果得到静态项的有点, 但在这些网段被网桥看到的客户机, 就不能漫游至另一网段了。 另一种用法是将网桥与 VLAN 功能连用, 这样客户网络会被隔离在一边, 而不会浪费 IP 地址空间。 考虑 CustomerAvlan100 上, 而 CustomerB 则在 vlan101 上。 网桥地址为 192.168.0.1, 同时作为 internet 路由器使用。 &prompt.root; ifconfig bridge0 addm vlan100 sticky vlan100 addm vlan101 sticky vlan101 &prompt.root; ifconfig bridge0 inet 192.168.0.1/24 两台客户机均将 192.168.0.1 作为默认网关, 由于网桥快取缓存是自学习的, 因而它们无法伪造 MAC 地址来截取其他客户机的网络流量。 在 VLAN 之间的通讯可以通过专用接口 (或防火墙) 来阻断: &prompt.root; ifconfig bridge0 private vlan100 private vlan101 这样这些客户机就完全相互隔离了。 可以使用整个的 /24 地址空间, 而无需划分子网。 地址限制 接口后的源 MAC 地址数量是可以控制的。 一旦到达了限制未知源地址的包将会被丢弃, 直至现有缓存中的一项过期或被移除。 下面的例子是设置 CustomerAvlan100 上可连接的以太网设备最大值为 10。 &prompt.root; ifconfig bridge0 ifmaxaddr vlan100 10 SNMP 管理 网桥接口和 STP 参数能够由 &os; 基本系统的 SNMP 守护进程进行管理。导出的网桥 MIB 符和 IETF 标准, 所以任何 SNMP 客户端或管理包都可以被用来接收数据。 在网桥机器上从/etc/snmp.config 文件中去掉以下这行的注释 begemotSnmpdModulePath."bridge" = "/usr/lib/snmp_bridge.so" 并启动 bsnmpd 守护进程。 其他的配置选项诸如 community names 和 access lists 可能也许也需要修改。 参阅 &man.bsnmpd.1; 和 &man.snmp.bridge.3; 获取更多信息。 以下的例子中使用了 Net-SNMP 软件 (net-mgmt/net-snmp) 来查询一个网桥,当然同样也能够使用port net-mgmt/bsnmptools。 在 SNMP 客户端 Net-SNMP 的配置文件 $HOME/.snmp/snmp.conf 中 加入以下几行来导入网桥的 MIB 定义: mibdirs +/usr/share/snmp/mibs mibs +BRIDGE-MIB:RSTP-MIB:BEGEMOT-MIB:BEGEMOT-BRIDGE-MIB 通过 IETF BRIDGE-MIB(RFC4188) 监测一个单独的网桥 &prompt.user; snmpwalk -v 2c -c public bridge1.example.com mib-2.dot1dBridge BRIDGE-MIB::dot1dBaseBridgeAddress.0 = STRING: 66:fb:9b:6e:5c:44 BRIDGE-MIB::dot1dBaseNumPorts.0 = INTEGER: 1 ports BRIDGE-MIB::dot1dStpTimeSinceTopologyChange.0 = Timeticks: (189959) 0:31:39.59 centi-seconds BRIDGE-MIB::dot1dStpTopChanges.0 = Counter32: 2 BRIDGE-MIB::dot1dStpDesignatedRoot.0 = Hex-STRING: 80 00 00 01 02 4B D4 50 ... BRIDGE-MIB::dot1dStpPortState.3 = INTEGER: forwarding(5) BRIDGE-MIB::dot1dStpPortEnable.3 = INTEGER: enabled(1) BRIDGE-MIB::dot1dStpPortPathCost.3 = INTEGER: 200000 BRIDGE-MIB::dot1dStpPortDesignatedRoot.3 = Hex-STRING: 80 00 00 01 02 4B D4 50 BRIDGE-MIB::dot1dStpPortDesignatedCost.3 = INTEGER: 0 BRIDGE-MIB::dot1dStpPortDesignatedBridge.3 = Hex-STRING: 80 00 00 01 02 4B D4 50 BRIDGE-MIB::dot1dStpPortDesignatedPort.3 = Hex-STRING: 03 80 BRIDGE-MIB::dot1dStpPortForwardTransitions.3 = Counter32: 1 RSTP-MIB::dot1dStpVersion.0 = INTEGER: rstp(2) dot1dStpTopChanges.0的值为2 意味着 STP 网桥拓扑改变了2次,拓扑的改变表示1个或多个 网络中的连接改变或失效并且有一个新树生成。 dot1dStpTimeSinceTopologyChange.0 的值则能够显示这是何时改变的。 监测多个网桥接口可以使用 private BEGEMOT-BRIDGE-MIB: &prompt.user; snmpwalk -v 2c -c public bridge1.example.com enterprises.fokus.begemot.begemotBridge BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge0" = STRING: bridge0 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge2" = STRING: bridge2 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge0" = STRING: e:ce:3b:5a:9e:13 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge2" = STRING: 12:5e:4d:74:d:fc BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge0" = INTEGER: 1 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge2" = INTEGER: 1 ... BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge0" = Timeticks: (116927) 0:19:29.27 centi-seconds BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge2" = Timeticks: (82773) 0:13:47.73 centi-seconds BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge0" = Counter32: 1 BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge2" = Counter32: 1 BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge0" = Hex-STRING: 80 00 00 40 95 30 5E 31 BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge2" = Hex-STRING: 80 00 00 50 8B B8 C6 A9 通过 mib-2.dot1dBridge 子树改变正在被监测的网桥接口: &prompt.user; snmpset -v 2c -c private bridge1.example.com BEGEMOT-BRIDGE-MIB::begemotBridgeDefaultBridgeIf.0 s bridge2 Andrew Thompson Written by 链路聚合与故障转移 lagg failover (故障转移) fec lacp loadbalance (负载均衡) roundrobin (轮转) 介绍 使用 &man.lagg.4; 接口, 能够将多个网络接口聚合为一个虚拟接口, 以提供容灾和高速连接的能力。 运行模式 failover (故障转移) 只通过主网口收发数据。 如果主网口不可用, 则使用下一个激活的网口。 您在这里加入的第一个网口便会被视为主网口; 此后加入的其他网口, 则会被视为故障转移的备用网口。 fec 用以支持 Cisco EtherChannel。 这是一种静态配置, 并不进行节点间协商或交换以太网帧来监控链路情况。 如果交换机支持 LACP, 则应使用后者而非这种配置。 这种做法是将输出流量在激活的网口之间以协议头散列信息为依据分拆, 并接收来自任意激活网口的入流量。 散列信息包含以太网源地址、 目的地址, 以及 (如果有的话) VLAN tag 和 IPv4/IPv6 源地址及目的地址信息。 lacp 支持 IEEE 802.3ad 链路聚合控制协议 (LACP) 和标记协议。 LACP 能够在节点与若干链路聚合组之间协商链路。 每一个链路聚合组 (LAG) 由一组相同速度、 以全双工模式运行的网口组成。 流量在 LAG 中的网口之间, 会以总速度最大的原则进行分摊。 当物理链路发生变化时, 链路聚合会迅速适应变动形成新的配置。 这种做法也是将输出流量在激活的网口之间以协议头散列信息为依据分拆, 并接收来自任意激活网口的入流量。 散列信息包含以太网源地址、 目的地址, 以及 (如果有的话) VLAN tag 和 IPv4/IPv6 源地址及目的地址信息。 loadbalance (负载均衡) 这是 fec 模式的别名。 roundrobin (轮转) 将输出流量以轮转方式在所有激活端口之间调度, 并从任意激活端口接收进入流量。 这种模式违反了以太网帧排序规则, 因此应小心使用。 例子 与 Cisco 交换机配合完成 LACP 链路聚合 在这个例子中, 我们将 &os; 的两个网口作为一个负载均衡和故障转移链路聚合组接到交换机上。 在此基础上, 还可以增加更多的网口, 以提高吞吐量和故障容灾能力。 由于以太网链路上两节点间的帧序是强制性的, 因此两个节点之间的连接速度, 会取决于一块网卡的最大速度。 传输算法会尽量采用更多的信息, 以便将不同的网络流量分摊到不同的网络接口上, 并平衡不同网口的负载。 在 Cisco 交换机上将网口添加到通道组 (channel group) 中。 interface FastEthernet0/1 channel-group 1 mode active channel-protocol lacp ! interface FastEthernet0/2 channel-group 1 mode active channel-protocol lacp ! 在 &os; 机器上创建 lagg 接口。 &prompt.root; ifconfig lagg0 create &prompt.root; ifconfig lagg0 up laggproto lacp laggport fxp0 laggport fxp1 从 ifconfig 查看接口状态: 标记为 ACTIVE 的接口属于激活的聚合组, 并且已经完成了与交换机的协商过程, 能够收发网络流量了。 您可以利用 &man.ifconfig.8; 的输出细节来检视 LAG 标识。 lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 00:05:5d:71:8d:b8 media: Ethernet autoselect status: active laggproto lacp laggport: fxp1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> laggport: fxp0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> 交换机上会显示哪些端口是激活的。 如果需要了解更多细节, 则可以使用 show lacp neighbor detail switch# show lacp neighbor Flags: S - Device is requesting Slow LACPDUs F - Device is requesting Fast LACPDUs A - Device is in Active mode P - Device is in Passive mode Channel group 1 neighbors Partner's information: LACP port Oper Port Port Port Flags Priority Dev ID Age Key Number State Fa0/1 SA 32768 0005.5d71.8db8 29s 0x146 0x3 0x3D Fa0/2 SA 32768 0005.5d71.8db8 29s 0x146 0x4 0x3D 故障转移模式 故障转移模式可以用于在主端口连接中断时切换到备用端口。 &prompt.root; ifconfig lagg0 create &prompt.root; ifconfig lagg0 up laggproto failover laggport fxp0 laggport fxp1 lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 00:05:5d:71:8d:b8 media: Ethernet autoselect status: active laggproto failover laggport: fxp1 flags=0<> laggport: fxp0 flags=5<MASTER,ACTIVE> 系统将在 fxp0 上进行流量的收发。 如果 fxp0 的连接中断, 则 fxp1 会自动成为激活连接。 如果主端口的连接恢复, 则它又会成为激活连接。 Jean-François Dockès 更新: Alex Dupre 重新组织及增强: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
无盘操作 无盘工作站 无盘操作 FreeBSD 主机可以从网络启动而无需本地磁盘就可操作, 使用的是从 NFS 服务器装载的文件系统。 除了标准的配置文件,无需任何的系统修改。 很容易设置这样的系统因为所有必要的元素都很容易得到: 至少有两种可能的方法从网络加载内核: PXE:&intel; 的先启动执行环境 (Preboot eXecution Environment) 系统是一种灵活的引导 ROM 模式,这个 ROM 内建在一些网卡或主板的中。查看 &man.pxeboot.8; 以获取更多细节。 Etherboot port (net/etherboot) 产生通过网络加载内核的可 ROM 代码。这些代码可以烧入网卡上的 PROM 上,或从本地软盘 (或硬盘) 驱动器加载,或从运行着的 &ms-dos; 系统加载。它支持多种网卡。 一个样板脚本 (/usr/share/examples/diskless/clone_root) 简化了对服务器上的工作站根文件系统的创建和维护。 这个脚本需要少量的自定义,但您能很快的熟悉它。 /etc 存在标准的系统启动文件用于侦测和支持无盘的系统启动。 可以向 NFS 文件或本地磁盘进行交换(如果需要的话)。 设置无盘工作站有许多方法。 有很多相关的元素大部分可以自定义以适合本地情况。 以下将介绍一个完整系统的安装,强调的是简单性和与标准 FreeBSD 启动脚本的兼容。介绍的系统有以下特性: 无盘工作站使用一个共享的只读 / 文件系统和一个共享的只读/usr root 文件系统是一份标准的 FreeBSD 根文件系统 (一般是服务器的),只是一些配置文件被特定于无盘操作的配置文件覆盖。 root 文件系统必须可写的部分被 &man.md.4; 文件系统覆盖。 任何的改写在重启后都会丢失。 内核由 etherbootPXE 传送和加载, 有些情况可能会指定使用其中之一。 如上所述,这个系统是不安全的。 它应该处于网络的受保护区域并不被其它主机信任。 这部分所有的信息均在 5.2.1-RELEASE 上测试过。 背景信息 设置无盘工作站相对要简单而又易出错。 有时分析一些原因是很难的。例如: 编译时选项在运行时可能产生不同的行为。 出错信息经常是加密了的或根本就没有。 在这里, 涉及到的一些背景知识对于可能出现的问题的解决是很有帮助的。 要成功地引导系统还有些操作需要做。 机子需要获取初始的参数,如它的 IP 地址、执行文件、服务器名、根路径。这个可以使用 或 BOOTP 协议来完成。 DHCP 是 BOOTP 的兼容扩展, 并使用相同的端口和基本包格式。 只使用 BOOTP 来配置系统也是可行的。 &man.bootpd.8; 服务程序被包含在基本的 &os; 系统里。 不过,DHCP 相比 BOOTP 有几个好处 (更好的配置文件,使用 PXE 的可能性,以及许多其它并不直接相关的无盘操作), 接着我们会要描述一个 DHCP 配置, 可能的话会利用与使用 &man.bootpd.8; 相同的例子。这个样板配置会使用ISC DHCP 软件包 (3.0.1.r12 发行版安装在测试服务器上)。 机子需要传送一个或多个程序到本地内存。 TFTPNFS 会被使用。选择TFTP 还是 NFS 需要在几个地方的编译时间选项里设置。 通常的错误源是为文件名指定了错误的协议:TFTP 通常从服务器里的一个单一目录传送所有文件,并需要相对这个目录的文件名。 NFS 需要的是绝对文件路径。 介于启动程序和内核之间的可能的部分需要被初始化并执行。 在这部分有几个重要的变量: PXE 会装入 &man.pxeboot.8;——它是 &os; 第三阶段装载器的修改版。 &man.loader.8; 会获得许多参数用于系统启动, 并在传送控制之前把它们留在内核环境里。 在这种情况下,使用 GENERIC 内核就可能了。 Etherboot 会做很少的准备直接装载内核。 您要使用指定的选项建立 (build) 内核。 PXEEtherboot 工作得一样的好。 不过, 因为一般情况下内核希望 &man.loader.8; 做了更多的事情, PXE 是推荐的方法。 如果您的 BIOS 和网卡都支持 PXE, 就应该使用它。 最后,机子需要访问它的文件系统。 NFS 使用在所有的情况下。 查看 &man.diskless.8; 手册页。 安装说明 配置使用<application>ISC DHCP</application> DHCP 无盘操作 ISC DHCP 服务器可以回应 BOOTP 和 DHCP 的请求。 ISC DHCP 3.0 并不属于基本系统。首先您需要安装 net/isc-dhcp3-server port 或相应的 一旦安装了 ISC DHCP, 还需要一个配置文件才能运行 (通常名叫 /usr/local/etc/dhcpd.conf)。 这里有个注释过的例子,里边主机 margaux 使用 Etherboot, 而主机corbieres 使用 PXE default-lease-time 600; max-lease-time 7200; authoritative; option domain-name "example.com"; option domain-name-servers 192.168.4.1; option routers 192.168.4.1; subnet 192.168.4.0 netmask 255.255.255.0 { use-host-decl-names on; option subnet-mask 255.255.255.0; option broadcast-address 192.168.4.255; host margaux { hardware ethernet 01:23:45:67:89:ab; fixed-address margaux.example.com; next-server 192.168.4.4; filename "/data/misc/kernel.diskless"; option root-path "192.168.4.4:/data/misc/diskless"; } host corbieres { hardware ethernet 00:02:b3:27:62:df; fixed-address corbieres.example.com; next-server 192.168.4.4; filename "pxeboot"; option root-path "192.168.4.4:/data/misc/diskless"; } } 这个选项告诉 dhcpd 发送host 里声明的用于无盘主机的主机名的值。 另外可能会增加一个 option host-name margauxhost 声明里。 next-server 正式指定 TFTPNFS 服务用于载入装载器或内核文件 (默认使用的是相同的主机作为DHCP 服务器)。 filename 正式定义这样的文件——etherbootPXE 为执行下一步将装载它。 根据使用的传输方式,它必须要指定。 Etherboot 可以被编译来使用 NFSTFTP。 &os; port 默认配置了NFSPXE 使用 TFTP, 这就是为什么在这里使用相对文件名 (这可能依赖于 TFTP 服务器配置,不过会相当典型)。 同样,PXE 会装载 pxeboot, 而不是内核。另外有几个很有意思的可能,如从 &os; CD-ROM 的 /boot 目录装载 pxeboot (因为 &man.pxeboot.8; 能够装载 GENERIC 内核,这就使得可以使用 PXE 从远程的 CD-ROM 里启动)。 root-path 选项定义到根 (root) 文件系统的路径,通常是 NFS 符号。当使用 PXE 时,只要您不启用内核里的 BOOTP 选项,可以不管主机的IP。NFS 服务器然后就如同 TFTP 一样。 配置使用BOOTP BOOTP 无盘操作 这里紧跟的是一个等效的 bootpd 配置 (减少到一个客户端)。这个可以在 /etc/bootptab 里找到。 请注意:为了使用BOOTP,etherboot 必须使用非默认选项 NO_DHCP_SUPPORT 来进行编译,而且 PXE 需要 DHCPbootpd 的唯一可见的好处是它存在于基本系统中。 .def100:\ :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\ :sm=255.255.255.0:\ :ds=192.168.4.1:\ :gw=192.168.4.1:\ :hd="/tftpboot":\ :bf="/kernel.diskless":\ :rp="192.168.4.4:/data/misc/diskless": margaux:ha=0123456789ab:tc=.def100 使用<application>Etherboot</application>准备启动程序 Etherboot Etherboot 的网站 包含有更多的文档 ——主要瞄准的是 Linux 系统,但无疑包含有有用的信息。 如下列出的是关于在 FreeBSD 系统里使用 Etherboot 首先您必须安装net/etherboot 包或 port。 您可以改变 Etherboot 的配置 (如使用 TFTP 来代替 NFS), 方法是修改 Config 文件——在 Etherboot 源目录里。 对于我们的设置,我们要使用一张启动软盘。 对于其它的方法(PROM,或 &ms-dos;程序), 请参考 Etherboot 文档。 想要使用启动软盘,先插入一张软盘到安装有 Etherboot 的机器的驱动器里, 然后把当前路径改到 src 目录——在 Etherboot 树下, 接着输入: &prompt.root; gmake bin32/devicetype.fd0 devicetype 依赖于无盘工作站上的以太网卡的类型。 参考在同一个目录下的 NIC 文件确认正确的 devicetype 使用<acronym>PXE</acronym>启动 默认地,&man.pxeboot.8; 装载器通过 NFS 装载内核。它可以编译来使用 TFTP——通过在文件 /etc/make.conf 里指定 LOADER_TFTP_SUPPORT 选项来代替。 请参见 /usr/share/examples/etc/make.conf 里的注释 了解如何配置。 除此之外还有两个未说明的 make.conf 选项——它可能对于设置一系列控制台无盘机器会有用: BOOT_PXELDR_PROBE_KEYBOARDBOOT_PXELDR_ALWAYS_SERIAL 当机器启动里,要使用 PXE, 通常需要选择 Boot from network 选项——在 BIOS 设置里, 或者在 PC 初始化的时候输入一个功能键 (function key)。 配置 <acronym>TFTP</acronym> 和 <acronym>NFS</acronym> 服务器 TFTP 无盘操作 NFS 无盘操作 如果您正在使用 PXEEtherboot——配置使用了 TFTP,那么您需要在文件服务器上启用 tftpd 建立一个目录——从那里 tftpd 可以提供文件服务,如 /tftpboot 把这一行加入到 /etc/inetd.conf里: tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot 好像有一些版本的 PXE 需要 TCP 版本的 TFTP。 在这种情况下,加入第二行,使用 stream tcp 来代替 dgram udp inetd 重读其配置文件。 要正确执行这个命令, 在 /etc/rc.conf 文件中必须加入 &prompt.root; /etc/rc.d/inetd restart 您可把 tftpboot 目录放到服务器上的什何地方。 确定这个位置设置在 inetd.confdhcpd.conf 里。 在所有的情况下,您都需要启用 NFS, 并且 NFS 服务器上导出相应的文件系统。 把这一行加入到/etc/rc.conf里: nfs_server_enable="YES" 通过往 /etc/exports 里加入下面几行(调整载入点列, 并且使用无盘工作站的名字替换 margaux corbieres), 导出文件系统——无盘根目录存在于此: /data/misc -alldirs -ro margaux corbieres mountd 重读它的配置文件。如果您真的需要启用第一步的 /etc/rc.confNFS, 您可能就要重启系统了。 &prompt.root; /etc/rc.d/mountd restart 建立无盘内核 无盘操作 内核配置 如果您在使用 Etherboot, 您需要为无盘客户端建立内核配置文件, 使用如下选项(除了常使用的外): options BOOTP # Use BOOTP to obtain IP address/hostname options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info 您可能也想使用 BOOTP_NFSV3BOOT_COMPATBOOTP_WIRED_TO (参考 NOTES 文件)。 这些名字具有历史性,并且有些有些误导, 因为它们实际上启用了内核里 (它可能强制限制 BOOTP 或 DHCP 的使用),与 DHCP 和 BOOTP 的无关的应用。 编译内核(参考), 然后将它复制到 dhcpd.conf 里指定的地方。 当使用 PXE 里, 使用以上选项建立内核并不做严格要求(尽管建议这样做)。 启用它们会在内核启动时引起更多的 DHCP 提及过的请求,带来的小小的风险是在有些特殊情况下新值和由 &man.pxeboot.8; 取回的值之间的不一致性。 使用它们的好处是主机名会被附带设置。否则, 您就需要使用其它的方法来设置主机名,如在客户端指定的 rc.conf 文件里。 为了使带有 Etherboot 的内核可引导,就需要把设备提示 (device hint) 编译进去。通常要在配置文件(查看 NOTES 配置注释文件) 里设置下列选项: hints "GENERIC.hints" 准备根(root)文件系统 根文件系统 无盘操作 您需要为无盘工作站建立根文件系统, 它就是 dhcpd.conf 里的 root-path 所指定的目录。 使用 <command>make world</command> 来复制根文件系统 这种方法可以迅速安装一个彻底干净的系统 (不仅仅是根文件系统) 到 DESTDIR。 您要做的就是简单地执行下面的脚本: #!/bin/sh export DESTDIR=/data/misc/diskless mkdir -p ${DESTDIR} cd /usr/src; make buildworld && make buildkernel cd /usr/src/etc; make distribution 一旦完成,您可能需要定制 /etc/rc.conf/etc/fstab——根据您的需要放到 DESTDIR里。 配置 swap(交换) 如果需要,位于服务器上的交换文件可以通过 NFS 来访问。 <acronym>NFS</acronym> 交换区 内核并不支持在引导时启用 NFS 交换区。 交换区必须通过启动脚本启用, 其过程是挂接一个可写的文件系统, 并在其上创建并启用交换文件。 要建立尺寸合适的交换文件, 可以这样做: &prompt.root; dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000 要启用它,您须要把下面几行加到 rc.conf里: swapfile=/path/to/swapfile 杂项问题 运行时 <filename>/usr</filename> 是只读在 无盘操作 只读的 /usr 如果无盘工作站是配置来支持 X, 那么您就必须调整 XDM 配置文件,因为它默认把错误信息写到 /usr 使用非 FreeBSD 服务器 当用作根文件系统的服务器运行的是不 FreeBSD,您须要在 FreeBSD 机器上建立根文件系统, 然后把它复制到它的目的地,使用的命令可以是 tarcpio 在这种情况下,有时对于 /dev 里的一些特殊的文件会有问题,原因就是不同的 最大/最小整数大小。 一种解决的方法就是从非 FreeBSD 服务里导出一个目录, 并把它载入 FreeBSD 到机子上, 并使用 &man.devfs.5; 来为用户透明地分派设备节点。
ISDN ISDN 关于 ISDN 技术和硬件的一个好的资源是Dan Kegel 的 ISDN 主页 一个快速简单的到 ISDN 的路线图如下: 如果您住在欧洲,您可能要查看一下 ISDN 卡部分。 如果您正计划首要地使用 ISDN 基于拨号非专用线路连接到带有提供商的互联网, 您可能要了解一下终端适配器。如果您更改提供商的话, 这会给您带来最大的灵活性、最小的麻烦。 如果您连接了两个局域网 (LAN),或使用了专用的 ISDN 连线连接到互联网,您可能要考虑选择单独的路由器/网桥。 在决定选择哪一种方案的时候,价格是个很关键的因素。 下面列有从不算贵到最贵的选择: Hellmuth Michaelis 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
ISDN 卡 ISDN FreeBSD 的 ISDN 工具通过被动卡 (passive card) 仅支持 DSS1/Q.931(或 Euro-ISDN) 标准。 此外也支持一些 active card, 它们的固件也支持其它信号协议, 这其中包括最先得到支持的 Primary Rate (PRI) ISDN卡。 isdn4bsd 软件允许连接到其它 ISDN 路由器,使用的是原始的 HDLC 上的 IP 或利用同步 PPP:使用带有 isppp (一个修改过的 &man.sppp.4; 驱动程序)的 PPP 内核,或使用用户区 (userland) &man.ppp.8;。通过使用 userland &man.ppp.8;,两个或更多 ISDN 的 B 通道联结变得可能。 除了许多如 300 波特 (Baud) 的软 modem 一样的工具外, 还可以实现电话应答机应用。 在 FreeBSD 里,正有更多的 PC ISDN 卡被支持; 报告显示在整个欧洲及世界的其它许多地区可以成功使用。 被支持的主动型 ISDN 卡主要是带有 Infineon (以前的 Siemens) ISAC/HSCX/IPAC ISDN 芯片组,另外还有带有 Cologne (只有 ISA 总线) 芯片的 ISDN 卡、带有 Winbond W6692 芯片的 PCI 卡、一部分带有 Tiger300/320/ISAC 芯片组的卡以及带有一些商家专有的芯片组的卡 (如 AVM Fritz!Card PCI V.1.0 和 the AVM Fritz!Card PnP)。 当前积极的支持的 ISDN 卡有 AVM B1 (ISA 和 PCI) BRI 卡和 AVM T1 PCI PRI 卡。 关于 isdn4bsd 的文档,请查看 FreeBSD 系统里的 /usr/share/examples/isdn/ 目录或查看 isdn4bsd的主页, 那里也有提示、勘误表以及更多的文档 (如 isdn4bsd手册)。 要是您有兴趣增加对不同 ISDN 协议的支持,对当前还不支持的 ISDN PC 卡的支持或想增强 isdn4bsd 的性能,请联系 &a.hm;。 对于安装、配置以及 isdn4bsd 故障排除的问题,可以利用 &a.isdn.name; 邮件列表。
ISDN 终端适配器 终端适配器 (TA) 对于 ISDN 就好比 modem 对于常规电话线。 modem 许多 TA 使用标准的 Hayes modem AT 命令集,并且可以降级来代替 modem。 TA 基本的运作同 modem 一样,不同之处是连接和整个速度更比老 modem 更快。同 modem 的安装一样,您也需要配置 PPP。确认您的串口速度已足够高。 PPP 使用 TA 连接互联网提供商的主要好处是您可以做动态的 PPP。 由于 IP 地址空间变得越来越紧张,许多提供商都不愿再提供静态 IP。许多的独立的路由器是不支持动态 IP 分配的。 TA 完全依赖于您在运行的 PPP 进程, 以完成它们的功能和稳定的连接。这可以让您在 FreeBSD 机子里轻易地从使用 modem 升级到 ISDN,要是您已经安装了 PPP 的话。只是,在您使用 PPP 程序时所体验到任何问题同时也存在。 如果您想要最大的稳定性,请使用 PPP 内核选项,而不要使用 userland PPP。 下面的 TA 就可以同 FreeBSD 一起工作: Motorola BitSurfer 和 Bitsurfer Pro Adtran 大部分其它的 TA 也可能工作,TA 提供商试图让他们的产品可以接受大部分的标准 modem AT 命令集。 对于外置 TA 的实际问题是:象 modem 要一样,您机子需要有一个好的串行卡。 想要更深入地理解串行设备以及异步和同步串口这间的不同点, 您就要读读 FreeBSD 串行硬件教程了。 TA 将标准的 PC 串口 (同步的) 限制到了 115.2 Kbs,即使您有 128 Kbs 的连接。 想要完全利用 ISDN 有能力达到的 128 Kbs,您就需要把 TA 移到同步串行卡上。 当心被骗去买一个内置的 TA 以及自认为可以避免同步/异步问题。内置的 TA 只是简单地将一张标准 PC 串口芯片内建在里边。 所做的这些只是让您省去买另一根串行线以及省去寻找另一个空的插孔。 带有 TA 的同步卡至少和一个独立的路由器同一样快地, 而且仅使用一个简单的 386 FreeBSD 盒驱动它。 选择同步卡/TA 还是独立的路由器,是个要高度谨慎的问题。 在邮件列表里有些相关的讨论。我们建议您去搜索一下关于完整讨论的记录 单独的 ISDN 桥/路由器 ISDN 单独的 桥/路由器 ISDN 桥或路由器根本就没有指定要 FreeBSD 或其它任何的操作系统。更多完整的关于路由和桥接技术的描述, 请参考网络指南的书籍。 这部分的内容里,路由器和桥接这两个词汇将会交替地使用。 随着 ISDN 路由器/桥的价格下滑,对它们的选择也会变得越来越流行。 ISDN 路由器是一个小盒子,可以直接地接入您的本地以太网, 并且自我管理到其它桥/路由器的连接。它有个内建的软件用于与通信——通过 PPP 和其它流行的协议。 路由器有比标准 TA 更快的吞吐量,因为它会使用完全同步的 ISDN 连接。 使用 ISDN 路由器和桥的主要问题是两个生产商之间的协同性仍存在问题。 如果您计划连接到互联网提供商,您应该跟他们进行交涉。 如果您计划连接两个局域网网段,如您的家庭网和办公网, 这将是最简单最低维护的解决方案。因为您买的设备是用于连接两边的, 可以保证这种连接一定会成功。 例如连接到家里的计算机,或者是办公网里的一个分支连接到办公主网, 那么下面的设置就可能用到: 办公室局部或家庭网 10 base 2 网络使用基于总线拓扑的 10 base 2 以太网 (瘦网(thinnet))。如果有必要,用网线连接路由器和 AUI/10BT 收发器。 ---Sun workstation | ---FreeBSD box | ---Windows 95 | Stand-alone router | ISDN BRI line 10 Base 2 Ethernet 如果您的家里或办公室支部里只有一台计算机, 您可以使用一根交叉的双绞线直接连接那台独立路由器。 主办公室或其它网络 10 base T 网络使用的是星形拓扑的 10 base T 以太网(双绞线)。 -------Novell Server | H | | ---Sun | | | U ---FreeBSD | | | ---Windows 95 | B | |___---Stand-alone router | ISDN BRI line ISDN Network Diagram 大部分路由器/网桥有一大好处就是,它们允许您在 同一 时间,有两个 分开独立的 PPP 连接到两个分开的点上。这点在许多的 TA 上是不支持的, 除非带有两个串口的特定模式(通常都很贵)。请不要把它与通道连接、MPP 等相混淆。 这是个非常有用的功能,例如,如果在您的办公室里您有个专有的 ISDN 连接,而且您想接入到里边,但休想让另一根 ISDN 线也能工作。 办公室里的路由器能够管理专有的B通道连接到互联网 (64 Kbps) 以及使用另一个通道 B 来完成单独的数据连接。 第二个 B 通道可以用于拨进、拨出或动态与第一个B通道进行连接 (MPP等),以获取更大宽带。 IPX/SPX 以太网桥也允许您传输的不仅仅是 IP 通信。您也可以发送 IPX/SPX 或其它任何您所使用的协议。
Chern Lee 作者: 译者:
delphij@FreeBSD.org.cn
网络地址转换 概要 natd FreeBSD 的网络地址转换服务, 通常也被叫做 &man.natd.8;, 是一个能够接收连入的未处理 IP 包, 将源地址修改为本级地址然后重新将这些包注入到发出 IP 包流中。 &man.natd.8; 同时修改源地址和端口, 当接收到响应数据时,它作逆向转换以便把数据发回原先的请求者。 Internet 连接共享 NAT NAT 最常见的用途是为人们所熟知的 Internet 连接共享。 安装 随着 IPv4 的 IP 地址空间的日益枯竭, 以及使用如 DSL 和电缆等高速连接的用户的逐渐增多, 越来越多的人开始需要 Internet 连接共享这样的解决方案。 由于能够将许多计算机通过一个对外的 IP 地址进行接入, &man.natd.8; 成为了一个理想的选择。 更为常见的情况, 一个用户通过电缆或者 DSL 线路 接入,并拥有一个 IP 地址,同时,希望通过这台接入 Internet 的计算机来为 LAN 上更多的计算机提供接入服务。 为了完成这一任务, 接入 Internet 的 FreeBSD 机器必须扮演网关的角色。 这台网关必须有两块网卡 — 一块用于连接 Internet 路由器, 另一块用来连接 LAN。 所有 LAN 上的机器通过 Hub 或交换机进行连接。 有多种方法能够通过 &os; 网关将 LAN 接入 Internet。 这个例子只介绍了有至少两块网卡的网关。 _______ __________ ________ | | | | | | | Hub |-----| Client B |-----| Router |----- Internet |_______| |__________| |________| | ____|_____ | | | Client A | |__________| Network Layout 上述配置被广泛地用于共享 Internet 连接。 LAN 中的一台机器连接到 Internet 中。 其余的计算机则通过那台 网关 机来连接 Internet。 内核 配置 配置 下面这些选项必须放到内核配置文件中: options IPFIREWALL options IPDIVERT 此外,下列是一些可选的选项: options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_VERBOSE 这些配置必须放到 /etc/rc.conf 中: gateway_enable="YES" firewall_enable="YES" firewall_type="OPEN" natd_enable="YES" natd_interface="fxp0" natd_flags="" 将机器配置为网关。 执行 sysctl net.inet.ip.forwarding=1 效果相同。 在启动时启用 /etc/rc.firewall 中的防火墙规则。 指定一个预定义的允许所有包进入的防火墙规则集。 参见 /etc/rc.firewall 以了解其他类型的规则集。 指定通过哪个网络接口转发包 (接入 Internet 的那一个)。 其他希望在启动时传递给 &man.natd.8; 的参数。 /etc/rc.conf 中加入上述选项将在系统启动时运行 natd -interface fxp0。 这一工作也可以手工完成。 当有太多选项要传递时,也可以使用一个 &man.natd.8; 的配置文件来完成。这种情况下,这个配置文件必须通过在 /etc/rc.conf 里增加下面内容来定义: natd_flags="-f /etc/natd.conf" /etc/natd.conf 文件会包含一个配置选项列表, 每行一个。在紧跟部分的例子里将使用下面的文件: redirect_port tcp 192.168.0.2:6667 6667 redirect_port tcp 192.168.0.3:80 80 关于配置文件的更多信息,参考 &man.natd.8; 手册页中关于 选项那一部分。 在LAN后面的每一台机子和接口应该被分配私有地址空间(由RFC 1918定义) 里的 IP 地址,并且默认网关设成 natd 机子的内连 IP 地址。 例如:客户端 AB 在 LAN 后面,IP 地址是 192.168.0.2192.168.0.3,同时 natd 机子的 LAN 接口上的 IP 地址是 192.168.0.1。客户端 AB 的默认网关必须要设成 natd 机子的 IP——192.168.0.1natd 机子外连,或互联网接口不需要为了 &man.natd.8; 而做任何特别的修改就可工作。 端口重定向 使用 &man.natd.8; 的缺点就是 LAN 客户不能从互联网访问。LAN 上的客户可以进行到外面的连接,而不能接收进来的连接。如果想在 LAN 的客户端机子上运行互联网服务,这就会有问题。 对此的一种简单方法是在 natd 机子上重定向选定的互联网端口到 LAN 客户端。 例如:在客户端 A 上运行 IRC 服务,而在客户端 B 上运行 web 服务。 想要正确的工作,在端口 6667 (IRC) 和 80 (web) 上接收到的连接就必须重定向到相应的机子上。 需要使用适当的选项传送给 &man.natd.8;。语法如下: -redirect_port proto targetIP:targetPORT[-targetPORT] [aliasIP:]aliasPORT[-aliasPORT] [remoteIP[:remotePORT[-remotePORT]]] 在上面的例子中,参数应该是: -redirect_port tcp 192.168.0.2:6667 6667 -redirect_port tcp 192.168.0.3:80 80 这就会重定向适当的 tcp 端口到 LAN 上的客户端机子。 参数可以用来指出端口范围来代替单个端口。例如, tcp 192.168.0.2:2000-3000 2000-3000 就会把所有在端口 2000 到 3000 上接收到的连接重定向到主机 A 上的端口 2000 到 3000。 当直接运行 &man.natd.8; 时,就可以使用这些选项, 把它们放到 /etc/rc.conf 里的 natd_flags="" 选项上, 或通过一个配置文件进行传送。 想要更多配置选项,请参考 &man.natd.8;。 地址重定向 地址重定向 如果有几个 IP 地址提供,那么地址重定向就会很有用, 然而他们必须在一个机子上。使用它,&man.natd.8; 就可以分配给每一个 LAN 客户端它们自己的外部 IP 地址。&man.natd.8; 然后会使用适当的处部 IP 地址重写从 LAN 客户端外出的数据包, 以及重定向所有进来的数据包——一定的 IP 地址回到特定的 LAN 客户端。这也叫做静态 NAT。例如,IP 地址 128.1.1.1128.1.1.2128.1.1.3 属于 natd 网关机子。 128.1.1.1 可以用来作 natd 网关机子的外连 IP 地址,而 128.1.1.2128.1.1.3 用来转发回 LAN 客户端 AB 语法如下: -redirect_address localIP publicIP localIP LAN 客户端的内部 IP 地址。 publicIP 相应 LAN 客户端的外部 IP 地址。 在这个例子里,参数是: -redirect_address 192.168.0.2 128.1.1.2 -redirect_address 192.168.0.3 128.1.1.3 一样,这些参数也是放在 /etc/rc.conf 里的 natd_flags="" 选项上, 或通过一个配置文件传送给它。使用地址重定向, 就没有必要用端口重定向了,因为所有在某个 IP 地址上收到的数据都被重定向了。 natd 机子上的外部 IP 地址必须激活并且别名到 (aliased) 外连接口。要这做就看看 &man.rc.conf.5;。
并口电缆 IP (PLIP) PLIP 并口电缆 IP PLIP PLIP 允许我们在两个并口间运行 TCP/IP。 在使用笔记本电脑, 或没有网卡的计算机时, 这会非常有用。 这一节中, 我们将讨论: 制作用于并口的 (laplink) 线缆。 使用 PLIP 连接两台计算机。 制作并口电缆。 您可以在许多计算机供应店里买到并口电缆。 如果买不到, 或者希望自行制作, 则可以参阅下面的表格, 它介绍了如何利用普通的打印机并口电缆来改制: 用于网络连接的并口电缆接线方式A-name A 端 B 端 描述 Post/BitDATA0 -ERROR 2 15 15 2 数据 0/0x01 1/0x08DATA1 +SLCT 3 13 13 3 数据 0/0x02 1/0x10DATA2 +PE 4 12 12 4 数据 0/0x04 1/0x20DATA3 -ACK 5 10 10 5 脉冲 (Strobe) 0/0x08 1/0x40DATA4 BUSY 6 11 11 6 数据 0/0x10 1/0x80GND 18-25 18-25 GND -
设置 PLIP 首先,您需要一根 laplink 线。然后, 确认两台计算机的内核都有对 &man.lpt.4; 驱动程序的支持: &prompt.root; grep lp /var/run/dmesg.boot lpt0: <Printer> on ppbus0 lpt0: Interrupt-driven port 并口必须是一个中断驱动的端口, 您应在 /boot/device.hints 文件中配置: hint.ppc.0.at="isa" hint.ppc.0.irq="7" 然后检查内核配置文件中是否有一行 device plip 或加载了 plip.ko 内核模块。 这两种情况下, 在使用 &man.ifconfig.8; 命令时都会显示并口对应的网络接口, 类似这样: &prompt.root; ifconfig plip0 plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 用 laplink 线接通两台计算机的并口。 在两边以 root 身份配置通讯参数。 例如, 如果你希望将 host1 通过另一台机器 host2 连接: host1 <-----> host2 IP Address 10.0.0.1 10.0.0.2 配置 host1 上的网络接口,照此做: &prompt.root; ifconfig plip0 10.0.0.1 10.0.0.2 配置 host2 上的网络接口,照此做: &prompt.root; ifconfig plip0 10.0.0.2 10.0.0.1 您现在应该有个工作的连接了。想要更详细的信息, 请阅读 &man.lp.4; 和 &man.lpt.4; 手册页。 您还应该增加两个主机到 /etc/hosts 127.0.0.1 localhost.my.domain localhost 10.0.0.1 host1.my.domain host1 10.0.0.2 host2.my.domain 要确认连接是否工作,可以到每一台机子上,然后 ping 另外一台。例如,在 host1 上: &prompt.root; ifconfig plip0 plip0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.1 --> 10.0.0.2 netmask 0xff000000 &prompt.root; netstat -r Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire host2 host1 UH 0 0 plip0 &prompt.root; ping -c 4 host2 PING host2 (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=2.774 ms 64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.530 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=255 time=2.556 ms 64 bytes from 10.0.0.2: icmp_seq=3 ttl=255 time=2.714 ms --- host2 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms
Aaron Kaplan 原始作者: Tom Rhodes 重新组织和增加: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
Brad Davis Extended by
IPv6 IPv6 (也被称作 IPng 下一代 IP) 是众所周知的 IP 协议 (也叫 IPv4) 的新版本。 和其他现代的 *BSD 系统一样, FreeBSD 包含了 KAME 的 IPv6 参考实现。 因此, 您的 FreeBSD 系统包含了尝试 IPv6 所需要的所有工具。 这一节主要集中讨论如何配置和使用 IPv6。 在 1990 年代早期, 人们开始担心可用的 IPv4 地址空间在不断地缩小。 随着 Internet 的爆炸式发展, 主要的两个担心是: 用尽所有的地址。 当然现在这个问题已经不再那样尖锐, 因为 RFC1918 私有地址空间 (10.0.0.0/8172.16.0.0/12, 以及 192.168.0.0/16) 和网络地址转换 (NAT) 技术已经被广泛采用。 路由表条目变得太大。这点今天仍然是焦点。 IPv6 解决这些和其它许多的问题: 128 位地址空间。换句话,理论上有 340,282,366,920,938,463,463,374,607,431,768,211,456 个地址可以使用。这意味着在我们的星球上每平方米大约有 6.67 * 10^27 个 IPv6 地址。 路由器仅在它们的路由表里存放网络地址集, 这就减少路由表的平均空间到 8192 个条目。 IPv6 还有其它许多有用的功能,如: 地址自动配置 (RFC2462) Anycast (任意播) 地址(一对多) 强制的多播地址 IPsec (IP 安全) 简单的头结构 移动的 (Mobile) IP IPv6 到 IPv4 的转换机制 要更多信息,请查看: IPv6 概观,在 playground.sun.com KAME.net 关于 IPv6 地址的背景知识 有几种不同类型的 IPv6 地址:Unicast,Anycast 和 Multicast。 Unicast 地址是为人们所熟知的地址。一个被发送到 unicast 地址的包实际上会到达属于这个地址的接口。 Anycast 地址语义上与 unicast 地址没有差别, 只是它们强调一组接口。指定为 anycast 地址的包会到达最近的 (以路由为单位) 接口。Anycast 地址可能只被路由器使用。 Multicast 地址标识一组接口。指定为 multicast 地址的包会到达属于 multicast 组的所有的接口。 IPv4 广播地址 (通常为 xxx.xxx.xxx.255) 由 IPv6 的 multicast 地址来表示。 保留的 IPv6 地址 IPv6 地址 预定长度 (bits) 描述 备注 :: 128 bits 未指定 类似 IPv4 中的 0.0.0.0 ::1 128 bits 环回地址 类似 IPv4 中的 127.0.0.1 ::00:xx:xx:xx:xx 96 bits 嵌入的 IPv4 低 32 bits 是 IPv4 地址。这也称作 IPv4 兼容 IPv6 地址 ::ff:xx:xx:xx:xx 96 bits IPv4 影射的 IPv6 地址 低的 32 bits 是 IPv4 地址。 用于那些不支持 IPv6 的主机。 fe80:: - feb:: 10 bits 链路环回 类似 IPv4 的环回地址。 fec0:: - fef:: 10 bits 站点环回   ff:: 8 bits 多播   001 (base 2) 3 bits 全球多播 所有的全球多播地址都指定到这个地址池中。前三个二进制位是 001
IPv6 地址的读法 规范形式被描述为:x:x:x:x:x:x:x:x, 每一个x就是一个 16 位的 16 进制值。当然, 每个十六进制块以三个0开始头的也可以省略。如 FEBC:A574:382B:23C1:AA49:4592:4EFE:9982 通常一个地址会有很长的子串全部为零, 因此每个地址的这种子串常被简写为::。 例如:fe80::1 对应的规范形式是 fe80:0000:0000:0000:0000:0000:0000:0001 第三种形式是以众所周知的用点.作为分隔符的十进制 IPv4 形式,写出最后 32 Bit 的部分。例如 2002::10.0.0.1 对应的十进制正规表达方式是 2002:0000:0000:0000:0000:0000:0a00:0001 它也相当于写成 2002::a00:1. 到现在,读者应该能理解下面的内容了: &prompt.root; ifconfig rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255 inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1 ether 00:00:21:03:08:e1 media: Ethernet autoselect (100baseTX ) status: active fe80::200:21ff:fe03:8e1%rl0 是一个自动配置的链路环回地址。它作为自动配置的一部分由 MAC 生成。 关于 IPv6 地址的结构的更多信息,请参看 RFC3513 进行连接 目前,有四种方式可以连接到其它 IPv6 主机和网络: 咨询你的互联网服务提供商是否提供 IPv6。 SixXS 向全球范围提供通道。 使用 6-to-4 通道 (RFC3068) 如果您使用的是拨号连接, 则可以使用 net/freenet6 port。 IPv6 世界里的 DNS 对于 IPv6 有两种类型的 DNS 记录:IETF 已经宣布 A6 是过时标准;现行的标准是 AAAA 记录。 使用AAAA记录是很简单的。通过增加下面内容, 给您的主机分配置您刚才接收到的新的 IPv6 地址: MYHOSTNAME AAAA MYIPv6ADDR 到您的主域 DNS 文件里,就可以完成。要是您自已没有 DNS 域服务,您可以询问您的 DNS 提供商。目前的 bind 版本 (version 8.3 与 9) 和 dns/djbdns(含IPv6补丁) 支持 AAAA 记录。 在 <filename>/etc/rc.conf</filename> 中进行所需的修改 IPv6 客户机设置 这些设置将帮助您把一台您 LAN 上的机器配置为一台客户机, 而不是路由器。 要让 &man.rtsol.8; 在启动时自动配置您的网卡, 只需添加: ipv6_enable="YES" 要自动地静态指定 IP 地址, 例如 2001:471:1f11:251:290:27ff:fee0:2093, 到 fxp0 上, 则写上: ipv6_ifconfig_fxp0="2001:471:1f11:251:290:27ff:fee0:2093" 要指定 2001:471:1f11:251::1 作为默认路由, 需要在 /etc/rc.conf 中加入: ipv6_defaultrouter="2001:471:1f11:251::1" IPv6 路由器/网关配置 这将帮助您从隧道提供商那里取得必要的资料, 并将这些资料转化为在重启时能够保持住的设置。 要在启动时恢复您的隧道, 需要在 /etc/rc.conf 中增加: 列出要配置的通用隧道接口, 例如 gif0 gif_interfaces="gif0" 配置该接口使用本地端地址 MY_IPv4_ADDR 和远程端地址 REMOTE_IPv4_ADDR gifconfig_gif0="MY_IPv4_ADDR REMOTE_IPv4_ADDR" 应用分配给您用于 IPv6 隧道远端的 IPv6 地址, 需要增加: ipv6_ifconfig_gif0="MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR" 此后十设置 IPv6 的默认路由。 这是 IPv6 隧道的另一端: ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR" IPv6 隧道配置 如果服务器将您的网络通过 IPv6 路由到世界的其他角落, 您需要在 /etc/rc.conf 中添加下面的配置: ipv6_gateway_enable="YES" 路由宣告和主机自动配置 这节将帮助您配置 &man.rtadvd.8; 来宣示默认的 IPv6 路由。 要启用 &man.rtadvd.8; 您需要在 /etc/rc.conf 中添加: rtadvd_enable="YES" 指定由哪个网络接口来完成 IPv6 路由请求非常重要。 举例来说, 让 &man.rtadvd.8; 使用 fxp0 rtadvd_interfaces="fxp0" 接下来我们需要创建配置文件, /etc/rtadvd.conf。 示例如下: fxp0:\ :addrs#1:addr="2001:471:1f11:246::":prefixlen#64:tc=ether: fxp0 改为您打算使用的接口名。 接下来, 将 2001:471:1f11:246:: 改为分配给您的地址前缀。 如果您拥有专用的 /64 子网, 则不需要修改其他设置。 反之, 您需要把 prefixlen# 改为正确的值。
Harti Brandt 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
异步传输模式 (ATM) 配置 classical IP over ATM (PVCs) Classical IP over ATM (CLIP) 是一种最简单的使用带 IP 的 ATM 的方法。 这种方法可以用在交换式连接 (SVC) 和永久连接 (PVC) 上。这部分描述的就是配置基于 PVC 的网络。 完全互连的配置 第一种使用PVC来设置 CLIP 的方式就是通过专用的 PVC 让网络里的每一台机子都互连在一起。 尽管这样配置起来很简单,但对于数量更多一点的机子来说就有些不切实际了。 例如我们有四台机子在网络里,每一台都使用一张 ATM 适配器卡连接到 ATM 网络。第一步就是规划 IP 地址和机子间的 ATM 连接。我们使用下面的: 主机 IP 地址 hostA 192.168.173.1 hostB 192.168.173.2 hostC 192.168.173.3 hostD 192.168.173.4 为了建造完全交错的网络,我们需要在第一对机子间有一个 ATM 连接: 机器 VPI.VCI 对 hostA - hostB 0.100 hostA - hostC 0.101 hostA - hostD 0.102 hostB - hostC 0.103 hostB - hostD 0.104 hostC - hostD 0.105 在每一个连接端 VPI 和 VCI 的值都可能会不同, 只是为了简单起见,我们假定它们是一样的。 下一步我们需要配置每一个主机上的 ATM 接口: hostA&prompt.root; ifconfig hatm0 192.168.173.1 up hostB&prompt.root; ifconfig hatm0 192.168.173.2 up hostC&prompt.root; ifconfig hatm0 192.168.173.3 up hostD&prompt.root; ifconfig hatm0 192.168.173.4 up 假定所有主机上的 ATM 接口都是 hatm0。 现在 PVC 需要配置到 hostA 上 (我们假定它们都已经配置在了 ATM 交换机上,至于怎么做的, 您就需要参考一下该交换机的手册了)。 hostA&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 100 llc/snap ubr hostA&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 101 llc/snap ubr hostA&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 102 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 100 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 103 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 104 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 101 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 103 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 105 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 102 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 104 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 105 llc/snap ubr 当然,除 UBR 外其它的通信协定也可让 ATM 适配器支持这些。 此种情况下,通信协定的名字要跟人通信参数后边。工具 &man.atmconfig.8; 的帮助可以这样得到: &prompt.root; atmconfig help natm add 或者在 &man.atmconfig.8; 手册页里得到。 相同的配置也可以通过 /etc/rc.conf 来完成。对于 hostA,看起来就象这样: network_interfaces="lo0 hatm0" ifconfig_hatm0="inet 192.168.173.1 up" natm_static_routes="hostB hostC hostD" route_hostB="192.168.173.2 hatm0 0 100 llc/snap ubr" route_hostC="192.168.173.3 hatm0 0 101 llc/snap ubr" route_hostD="192.168.173.4 hatm0 0 102 llc/snap ubr" 所有 CLIP 路由的当前状态可以使用如下命令获得: hostA&prompt.root; atmconfig natm show
Tom Rhodes 原作 Common Access Redundancy Protocol (CARP, 共用地址冗余协议) CARP Common Access Redundancy Protocol, 共用地址冗余协议 Common Access Redundancy Protocol, 或简称 CARP 能够使多台主机共享同一 IP 地址。 在某些配置中, 这样做可以提高可用性, 或实现负载均衡。 下面的例子中, 这些主机也可以同时使用其他的不同的 IP 地址。 要启用 CARP 支持, 必须在 &os; 内核配置中增加下列选项, 并重新联编内核: device carp 这样就可以使用 CARP 功能了, 一些具体的参数, 可以通过一系列 sysctl OID 来调整。 OID 描述 net.inet.carp.allow 接受进来的 CARP 包。 默认启用。 net.inet.carp.preempt 当主机中有一个 CARP 网络接口失去响应时, 这个选项将停止这台主机上所有的 CARP 接口。 默认禁用。 net.inet.carp.log 当值为 0 表示禁止记录所有日志。 值为 1 表示记录损坏的 CARP 包。任何大于 1 表示记录 CARP 网络接口的状态变化。默认值为 1 net.inet.carp.arpbalance 使用 ARP 均衡本地网络流量。 默认禁用。 net.inet.carp.suppress_preempt 此只读 OID 显示抑制抢占的状态。 如果一个接口上的连接失去响应, 则抢占会被抑制。 当这个变量的值为 0 时,表示抢占未被抑制。 任何问题都会使 OID 递增。 CARP 设备可以通过 ifconfig 命令来创建。 &prompt.root; ifconfig carp0 create 在真实环境中, 这些接口需要一个称作 VHID 的标识编号。 这个 VHID 或 Virtual Host Identification (虚拟主机标识) 用于在网络上区分主机。 使用 CARP 来改善服务的可用性 (CARP) 如前面提到的那样, CARP 的作用之一是改善服务的可用性。 这个例子中, 将为三台主机提供故障转移服务, 这三台服务器各自有独立的 IP 地址, 并提供完全一样的 web 内容。 三台机器以 DNS 轮询的方式提供服务。 用于故障转移的机器有两个 CARP 接口, 分别配置另外两台服务器的 IP 地址。 当有服务器发生故障时, 这台机器会自动得到故障机的 IP 地址。 这样以来, 用户就完全感觉不到发生了故障。 故障转移的服务器提供的内容和服务, 应与其为之提供热备份的服务器一致。 两台机器的配置, 除了主机名和 VHID 之外应完全一致。 在我们的例子中, 这两台机器的主机名分别是 hosta.example.orghostb.example.org。 首先, 需要将 CARP 配置加入到 rc.conf。 对于 hosta.example.org 而言, rc.conf 文件中应包含下列配置: hostname="hosta.example.org" ifconfig_fxp0="inet 192.168.1.3 netmask 255.255.255.0" cloned_interfaces="carp0" ifconfig_carp0="vhid 1 pass testpass 192.168.1.50/24" hostb.example.org 上, 对应的 rc.conf 配置则是: hostname="hostb.example.org" ifconfig_fxp0="inet 192.168.1.4 netmask 255.255.255.0" cloned_interfaces="carp0" ifconfig_carp0="vhid 2 pass testpass 192.168.1.51/24" 在两台机器上由 ifconfig 选项指定的密码必须是一致的, 这一点非常重要。 carp 设备只会监听和接受来自持有正确密码的机器的公告。 此外, 不同虚拟主机的 VHID 必须不同。 第三台机器, provider.example.org 需要进行配置, 以便在另外两台机器出现问题时接管。 这台机器需要两个 carp 设备, 分别处理两个机器。 对应的 rc.conf 配置类似下面这样: hostname="provider.example.org" ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0" cloned_interfaces="carp0 carp1" ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24" ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24" 配置两个 carp 设备, 能够让 provider.example.org 在两台机器中的任何一个停止响应时, 立即接管其 IP 地址。 默认的 &os; 内核 可能 启用了主机间抢占。 如果是这样的话, provider.example.org 可能在正式的内容服务器恢复时不释放 IP 地址。 此时, 管理员必须手工强制 IP 回到原来内容服务器。 具体做法是在 provider.example.org 上使用下面的命令: &prompt.root; ifconfig carp0 down && ifconfig carp0 up 这个操作需要在与出现问题的主机对应的那个 carp 接口上进行。 现在您已经完成了 CARP 的配置, 并可以开始测试了。 测试过程中, 可以随时重启或切断两台机器的网络。 如欲了解更多细节, 请参见 &man.carp.4; 联机手册。
diff --git a/zh_CN.GB2312/books/handbook/config/chapter.sgml b/zh_CN.GB2312/books/handbook/config/chapter.sgml index 5ca17967fc..ceb84618e0 100644 --- a/zh_CN.GB2312/books/handbook/config/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/config/chapter.sgml @@ -1,2892 +1,2882 @@ Chern Lee 原作: Mike Smith 这份文档基于一份教程, 其作者是 Matt Dillon 此外, 也参考了 tuning(7), 其作者是 设置和调整 概述 系统配置 系统优化 使用 &os; 的一个重要问题是系统配置。 正确地配置系统能充分地减少以后维护和升级系统所需的工作量。 这章将解释一些 &os; 的配置过程,包括一些可以调整的 &os; 系统的一些参数。 读完本章, 您将了解: 如何有效地利用文件系统和交换分区。 rc.conf 的基本设置以及 /usr/local/etc/rc.d 启动体系。 如何设置和测试网卡。 如何在您的网络设备上配置虚拟主机。 如何使用 /etc 下的各配置文件。 如何通过 sysctl 变量来对 &os; 系统进行调优。 怎样调整磁盘性能和修改内核限制。 在阅读本章之前,您应该了解: 了解 &unix; 和 &os; 的基础知识 ()。 熟悉内核配置编译的基础知识 ()。 初步配置 分区规划 分区规划 /etc /var /usr 基本分区 当使用 &man.bsdlabel.8; 或者 &man.sysinstall.8; 来分割您的文件系统的时候, 要记住硬盘驱动器外磁道传输数据要比从内磁道传输数据快。 因此应该将小的和经常访问的文件系统放在驱动器靠外的位置, 一些大的分区比如 /usr 应该放在比较靠里的位置。 以类似这样的顺序建立分区是一个不错的主意:root,swap, /var/usr /var 的大小能反映您的机器使用情况。 它用来存储邮件,日志文件和打印队列缓存, 特别是邮箱和日志文件可能会达到无法预料的大小, 这主要取决于在您的系统上有多少用户和您的日志文件可以保存多长时间。 一般大多数用户不需要一个 G 以上的空间,但要记住 /var/tmp 应该足够大来以便存储一些 packages。 /usr 分区存储很多用来系统运行所需要的文件例如 &man.ports.7; (建议这样做) 和源代码 (可选的)。安装的时候这两项都是可选的。 这个分区至少要保留两个 G 的可用空间。 当选择分区大小的时候,记住保留一些空间。 用完了一个分区的空间而在另一个分区上还有很多, 可能会导致出现一些错误。 一些用户会发现 &man.sysinstall.8; 的 Auto-defaults 自动分区有时会分配给 /var/ 较小的分区空间。 分区应该精确一些并且大一些。 交换分区 交换分区分配 交换分区 一般来讲,交换分区应该大约是系统内存 (RAM) 的两倍。 例如,如果机器有 128M 内存,交换文件应该是 256M。 较小内存的系统可以通过多一点地交换分区来提升性能。 不建议小于 256 兆的交换分区,并且扩充您的内存应该被考虑一下。 当交换分区最少是主内存的两倍的时候,内核的 VM (虚拟内存) 页面调度算法可以将性能调整到最好。如果您给机器添加更多内存, 配置太小的交换分区会导致 VM 页面扫描的代码效率低下。 在使用多块SCSI磁盘(或者不同控制器上的IDE磁盘)的大系统上, 建议在每个驱动器上建立交换分区(直到四个驱动器)。 交换分区应该大约一样大小。内核可以使用任意大小, 但内部数据结构则是最大交换分区的 4 倍。保持交换分区同样的大小, 可以允许内核最佳地调度交换空间来访问磁盘。 即使不太使用,分配大的交换分区也是好的, 在被迫重启之前它可以让您更容易的从一个失败的程序中恢复过来。 为什么要分区? 一些用户认为一个单独的大分区将会很好, 但是有很多原因会证明为什么这是个坏主意。首先, 每个分区有不同的分区特性,因此分开可以让文件系统调整它们。 例如,根系统和 /usr 一般只是读取,写入很少。 很多读写频繁的被放在 /var/var/tmp中。 适当的划分一个系统, 在其中使用较小的分区, 这样, 那些以写为主的分区将不会比以读为主的分区付出更高的代价。 将以写为主的分区放在靠近磁盘的边缘, 例如放在实际的大硬盘的前面代替放在分区表的后面,将会提高您需要的分区的 I/O 性能。现在可能也需要在比较大的分区上有很好的 I/O 性能, 把他们移动到磁盘外围不会带来多大的性能提升,反而把 /var 移到外面会有很好的效果。最后涉及到安全问题。 一个主要是只读的小的、整洁的根分区可以提高从一个严重的系统崩溃中恢复过来的机会。 核心配置 rc 文件 rc.conf 系统的配置信息主要位于 /etc/rc.conf。 这个文件包含了配置信息很大的一部分,主要在系统启动的时候来配置系统, 这个名字直接说明了这点;它也是 rc* 文件的配置信息。 系统管理员应该在 rc.conf 文件中建立记录来覆盖 /etc/defaults/rc.conf 中的默认设置。 这个默认文件不应该被逐字的复制到 /etc —— 它包含的是默认值而不是一个例子。 所有特定的改变应该在 rc.conf 中。 在集群应用中,为了降低管理成本, 可以应用多种策略把涉及全站范围的设置从特定于系统的设置中分离出来。 建议的方法是将全站范围的设置放在另一个文件中,例如 /etc/rc.conf.site, 并且把它包含进然后把这个文件包括进只包含系统指定信息的 /etc/rc.conf 由于 rc.conf 可以被 &man.sh.1; 阅读,所以达到这个目的很简单,例如: rc.conf: . /etc/rc.conf.site hostname="node15.example.com" network_interfaces="fxp0 lo0" ifconfig_fxp0="inet 10.1.1.1" rc.conf.site: defaultrouter="10.1.1.254" saver="daemon" blanktime="100" rc.conf.site 文件可以使用 rsync 或类似程序分发给各个系统, 同时各系统的 rc.conf 文件仍保持独立。 使用 &man.sysinstall.8; 或者 make world 来升级系统不会覆盖 rc.conf 文件, 所以系统配置信息不会丢失。 应用程序配置 典型的,被安装的应用程序有他自己的配置文件、语法等等。 从基本系统中分开他们是很重要的以至于他们可以容易的被 package 管理工具定位和管理 /usr/local/etc 一般来说,这些文件被安装在 /usr/local/etc。这个例子中, 一个应用程序有很多配置文件并且创建了一个子目录来存放他们。 通常,当一个 port 或者 package 被安装的时候, 配置文件示例也同样被安装了。它们通常用 .default 的后缀来标识。如果不存在这个应用程序的配置文件, 它们会通过复制 .default 文件来创建。 例如,看一下这个目下的内容 /usr/local/etc/apache -rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf -rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default -rw-r--r-- 1 root wheel 12205 May 20 1998 magic -rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default -rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf -rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default 文件大小显示了只有 srm.conf 改变了。以后 Apache 的升级就不会改变这个文件。 Tom Rhodes Contributed by 启动服务 服务 许多用户会选择使用 Ports Collection 来在 &os; 上安装第三方软件。 很多情况下这可能需要进行一些配置以便让这些软件能够在系统初始化的过程中启动。 服务, 例如 mail/postfixwww/apache13 就是这些需要在系统初始化时启动的软件包中的两个典型代表。 这一节解释了启动第三方软件所需要的步骤。 &os; 包含的大多数服务,例如 &man.cron.8;, 就是通过系统启动脚本启动的。 这些脚本也许会有些不同, 这取决于 &os; 版本。 但是不管怎样, 需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。 rc.d 出现之前, 应用程序会把一个简单的启动脚本放到 /usr/local/etc/rc.d 目录中, 这个目录中的脚本会被系统初始化脚本读取。 尽管很多人已经花费了相当多的时间来把旧的配置方式融入到新系统中, 仍然有许多第三方软件需要把脚本放到上面提到的目录中。 是否使用 rc.d 会对这些脚本的执行带来一些变化。 在 &os; 5.1 之前采用的是旧式的配置, 当然, 绝大多数情况下, 新式的脚本也会工作的很好。 每个脚本都应该遵守 &os; 版本所需求的一些规定: - 每个脚本必须在文件名最后添加一个 .sh - 的扩展名,并且这个脚本能被系统执行。 - 后者可以通过 chmod 命令把权限设置为 - 755来实现。 + 每个脚本必须是能够被系统执行,通常可以使用 + chmod 命令设置成 555 权限。 它还应该能接受 start 选项来启动程序并且接受 stop 选项来结束程序。 一个简单的脚本看起来可能会像这样: #!/bin/sh echo -n ' utility' case "$1" in start) /usr/local/bin/utility ;; stop) kill -9 `cat /var/run/utility.pid` ;; *) echo "Usage: `basename $0` {start|stop}" >&2 exit 64 ;; esac exit 0 这个脚本提供了 stopstart 两个选项, 用以操作 utility 可以用如下方法来启动: - &prompt.root; /usr/local/etc/rc.d/utility.sh start + &prompt.root; /usr/local/etc/rc.d/utility start 现在不是所有第三方软件都需要在 rc.conf 中进行如此的配置, 不过几乎每天都有新的 port 被修改来采用这种配置方法。 您应在安装的最后阶段查看所显示的信息, 以了解某个具体的应用是否需要这样的配置。 某些第三方软件会提供启动脚本, 以便与 rc.d 配合使用; 这些内容将在下一节介绍。 扩展应用程序配置 现在 &os; 提供了 rc.d, 这使得对应用软件的启动进行配置变得更加方便, 并提供了更多的其他功能。 例如, 使用在 rc.d 一节中所介绍的关键字, 应用程序就可以设置在某些其他服务, 例如 DNS 之后启动; 除此之外, 还可以通过 rc.conf 来指定一些额外的启动参数, 而不再需要将它们硬编码到启动脚本中。 基本的启动脚本如下所示: #!/bin/sh # # PROVIDE: utility # REQUIRE: DAEMON # KEYWORD: shutdown # # DO NOT CHANGE THESE DEFAULT VALUES HERE # SET THEM IN THE /etc/rc.conf FILE # utility_enable=${utility_enable-"NO"} utility_flags=${utility_flags-""} utility_pidfile=${utility_pidfile-"/var/run/utility.pid"} . /etc/rc.subr name="utility" rcvar=`set_rcvar` command="/usr/local/sbin/utility" load_rc_config $name pidfile="${utility_pidfile}" start_cmd="echo \"Starting ${name}.\"; /usr/bin/nice -5 ${command} ${utility_flags} ${command_args}" run_rc_command "$1" 这个脚本将保证 utility 能够在 daemon 服务之后启动。 它同时也提供了设置和跟踪 PID, 也就是进程 ID 文件的方法。 可以在 /etc/rc.conf 中加入: utility_enable="YES" 这个方法也使得命令行参数、包含 /etc/rc.subr 中所提供的功能, 兼容 &man.rcorder.8; 工具并提供更简单的通过 rc.conf 文件来配置的方法。 用服务来启动服务 其他服务, 例如 POP3 服务器, IMAP, 等等, 也可以通过 &man.inetd.8; 来启动。 这一过程包括从 Ports Collection 安装相应的应用程序, 并把配置加入到 /etc/inetd.conf 文件, 或去掉当前配置中的某些注释。 如何使用和配置 inetdinetd 一节中进行了更为深入的阐述。 一些情况下, 通过 &man.cron.8; 来启动系统服务也是一种可行的选择。 这种方法有很多好处, 因为 cron 会以 crontab 的文件属主身份执行那些进程。 这使得普通用户也能够执行他们的应用。 cron 工具提供了一个独有的功能, 以 @reboot 来指定时间。 这样的设置将在 &man.cron.8; 启动时运行, 通常这也是系统初始化的时候。 Tom Rhodes Contributed by 配置 <command>cron</command> cron 配置 &os; 最有用的软件包(utilities)中的一个是 &man.cron.8;。 cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。 cron 程序使用两种不同类型的配置文件, 即系统 crontab 和用户 crontabs。 两种格式的唯一区别是第六个字段。 在系统 crontab 中,第六个字段是用于执行命令的用户名。 这给予了系统 crontab 以任意用户身份执行命令的能力。 在用户 crontab 中, 第六个字段是要执行的命令, 所有的命令都会以这个用户自己的身份执行; 这是一项重要的安全功能。 同其他用户一样, root 用户也可以有自己的 crontab。 它不同于 /etc/crontab (也就是系统 crontab)。 由于有系统 crontab 的存在, 通常并不需要给 root 建立单独的用户 crontab。 让我们来看一下 /etc/crontab 文件: # /etc/crontab - root's crontab for &os; # # $&os;: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $ # # SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log # # #minute hour mday month wday who command # # */5 * * * * root /usr/libexec/atrun 像大多数 &os; 配置文件一样,# 字符是注释。 这样, 就可以编写注释来说明要执行什么操作, 以及这样做的原因。 需要注意的是, 注释应该另起一行, 而不能跟命令放在同一行上, 否则它们会被看成命令的一部分。 这个文件中的空行会被忽略。 首先应该定义环境变量。等号 (=) 字符用来定义任何环境变量,像这个例子用到了 SHELLPATHHOME 变量。如果 shell 行被忽略掉,cron 将会用默认值 sh。如果 变量被忽略, 那么就没有默认值并且需要指定文件绝对位置。如果 被忽略,cron 将用用执行者的 home 目录。 这一行定义了七个字段。它们是 minutehourmdaymonthwdaywhocommand。 它们差不多已经说明了各自的用处。Minute 是命令要运行时的分钟,Hour 跟 minute 差不多,只是用小时来表示。Mday 是每个月的天。Month 跟 hour 还有 minute 都差不多,用月份来表示。wday 字段表示星期几。 所有这些字段的值必须是数字并且用24小时制来表示。who 字段是特别的,并且只在 /etc/crontab 文件中存在。 这个字段指定了命令应该以哪个用户的身份来运行。当一个用户添加了他(她)的 crontab 文件的时候,他们就会没有这个字段选项。最后,是 command 字段。这是最后的一个字段, 所以自然就是它指定要运行的程序。 最后一行定义了上面所说的值。注意这里我们有一个 */5 列表,紧跟着是一些 * 字符。* 字符代表开始到最后, 也可以被解释成 每次。所以,根据这行, 显然表明了无论在何时每隔 5 分钟以 root 身份来运行 atrun 命令。查看 &man.atrun.8; 手册页以获得 atrun 的更多信息。 命令可以有任意多个传递给它们的标志。无论怎样, 扩展到多行的命令应该用反斜线(\)来续行。 这是每个 crontab 文件的基本设置, 虽然它们有一个不同。第六行我们指定的用户名只存在于系统 /etc/crontab 文件。这个字段在普通用户的 crontab 文件中应该被忽略。 安装 Crontab 绝对不要用这种方法来编辑/安装系统 crontab。 您需要做的只是使用自己喜欢的编辑器: cron 程序会注意到文件发生了变化, 并立即开始使用新的版本。参见 这个 FAQ 项目 以了解进一步的情况。 要安装刚写好的用户 crontab, 首先使用最习惯的编辑器来创建一个符合要求格式的文件,然后用 crontab 程序来完成。最常见的用法是: &prompt.user; crontab crontab-file 在前面的例子中, crontab-file 是一个事先写好的 crontab 还有一个选项用来列出安装的 crontab 文件: 只要传递 选项给 crontab 然后看一下输出。 用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用 crontab -e 选项也是可以的。 它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候, 它会自动的用 crontab 来安装这个文件。 如果您稍后想要彻底删除自己的用户 crontab 可以使用 crontab 选项。 Tom Rhodes Contributed by 在 &os; 中使用 rc 在 2002 年, &os; 整合了来自 NetBSD 的 rc.d 系统, 并通过它来完成系统的初始化工作。 用户要注意在 /etc/rc.d 目录下的文件。 这里面的许多文件是用来管理基础服务的, 它们可以通过 , 以及 选项来控制。 举例来说, &man.sshd.8; 可以通过下面的命令来重启: &prompt.root; /etc/rc.d/sshd restart 对其它服务的操作与此类似。 当然, 这些服务通常是在启动时根据 &man.rc.conf.5; 自动启动的。 例如, 要配置使系统启动时启动网络地址转换服务, 可以简单地通过在 /etc/rc.conf 中加入如下设置来完成: natd_enable="YES" 如果 行已经存在, 只要简单的把 改成 即可。 rc 脚本在下次重新启动的时候会自动的装载所需要的服务, 像下面所描述的那样。 由于 rc.d 系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的 /etc/rc.conf 变量,标准的 选项将会执行他们的动作。例如 sshd restart 命令只在 /etc/rc.conf 中的 sshd_enable 设置成 的时候工作。不管是否在 /etc/rc.conf 中设置了,要 或者 一个服务,命令前可以加上一个one前缀。例如要不顾当前 /etc/rc.conf 的设置重新启动 sshd,执行下面的命令: &prompt.root; /etc/rc.d/sshd onerestart 用选项 可以简单来的检查 /etc/rc.conf 中用适当的 rc.d 脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查 sshd 是否真的在 /etc/rc.conf 中被启动了: &prompt.root; /etc/rc.d/sshd rcvar # sshd $sshd_enable=YES 第二行 (# sshd) 是从 sshd 命令中输出的,而不是 root 控制台。 为了确定一个服务是否真的在运行,可以用 选项。例如验证 sshd 是否真的启动了: &prompt.root; /etc/rc.d/sshd status sshd is running as pid 433. 有些时候也可以 服务。 这一操作实际上是向服务发送一个信号, 来强制其重新加载配置。 多数情况下, 发给服务的会是 SIGHUP 信号。 并非所有服务都支持这一功能。 rc.d 系统不仅用于网络服务, 它也为系统初始化中的多数过程提供支持。 比如 bgfsck 文件, 当它被执行时, 将会给出下述信息: Starting background file system checks in 60 seconds. 这个文件用做后台文件系统检查,系统初始化的时候完成。 很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于 RPC 的服务启动可能在 rpcbind 服务启动之前失败。 要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。 程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。 下面的字句必须被包含在所有的启动脚本文件里, (他们都是 &man.rc.subr.8; 用来 enable 启动脚本必需的): PROVIDE: 指定此文件所提供的服务的名字。 以下的字句可以被包含在启动文件的顶部。严格来说他们不是必需的, 但作为对于 &man.rcorder.8; 有一定的提示作用: REQUIRE: 列出此服务启动之前所需要的其他服务。 此脚本提供的服务会在指定的那些服务 之后 启动。 BEFORE: 列出依赖此服务的其他服务。 此脚本提供的服务将在指定的那些服务 之前 启动。 通过在启动脚本中仔细设定这些关键字, 系统管理员可以很有条理的控制脚本的启动顺序, 进而避免使用像其他 &unix; 操作系统那样混乱的 runlevels 更多关于 rc.d 系统的信息, 可以在 &man.rc.8; 和 &man.rc.subr.8; 联机手册中找到。 如果您有意撰写自己的 rc.d 脚本, 或对现有的脚本进行一些改进, 也可以参考 这篇文章 Marc Fonvieille Contributed by 设置网卡 网卡 配置 现在我们不可想象一台计算机没有网络连接的情况。 添加和配置一块网卡是任何 &os; 系统管理员的一项基本任务。 查找正确的驱动程序 网卡 驱动程序 在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI 还是 ISA 网卡。&os; 支持很多种 PCI 和 ISA 网卡。 可以查看您的版本硬件兼容性列表以确定您的网卡被支持。 确认系统能够支持您的网卡之后, 您还需要为它选择合适的驱动程序。 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 将为您提供所支持的一些网卡和芯片组的信息。 如果您怀疑驱动程序是否使所要找的那一个, 请参考驱动程序的联机手册。 联机手册将提供关于所支持的硬件更详细的信息, 甚至还包括可能发生的问题。 如果您的网卡很常见的话, 大多数时候您不需要为驱动浪费精力。 常用的网卡在 GENERIC 内核中已经支持了, 所以您的网卡在启动时就会显示出来,像是: dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38 000ff irq 15 at device 11.0 on pci0 dc0: Ethernet address: 00:a0:cc:da:da:da miibus0: <MII bus> on dc0 ukphy0: <Generic IEEE 802.3u media interface> on miibus0 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30 000ff irq 11 at device 12.0 on pci0 dc1: Ethernet address: 00:a0:cc:da:da:db miibus1: <MII bus> on dc1 ukphy1: <Generic IEEE 802.3u media interface> on miibus1 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto 在这个例子中,我们看到有两块使用 &man.dc.4; 驱动的网卡在系统中。 如果您的网卡没有出现在 GENERIC 中, 则需要手工加载合适的驱动程序。 要完成这项工作可以使用下面两种方法之一: 最简单的办法是用 &man.kldload.8; 加载网卡对应的内核模块。 除此之外, 通过在 /boot/loader.conf 文件中加入适当的设置, 也可以让系统在引导时自动加载这些模块。 不过, 并不是所有的网卡都能够通过这种方法提供支持; ISA 网卡是比较典型的例子。 另外, 您也可以将网卡的支持静态联编进内核。 察看 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 以及驱动程序的联机手册以了解需要在您的内核配置文件中加一些什么。 要了解关于重新编译内核的进一步细节, 请参见 。 如果您的卡在引导时可以被内核 (GENERIC) 识别, 您应该不需要编译新的内核。 使用 &windows; NDIS 驱动程序 NDIS NDISulator &windows; 驱动程序 Microsoft Windows Microsoft Windows device drivers (设备驱动) KLD (kernel loadable object) 不幸的是, 许多厂商由于认为驱动程序会涉及许多敏感的商业机密, 至今仍不愿意将把驱动程序作为开放源代码形式发布列入他们的时间表。 因此, &os; 和其他操作系统的开发者就只剩下了两种选择: 要么经历长时间的痛苦过程来对驱动进行逆向工程, 要么使用现存的为 µsoft.windows; 平台提供的预编译版本的驱动程序。 包括参与 &os; 开发的绝大多数开发人员, 都选择了后一种方法。 得益于 Bill Paul (wpaul) 的工作, 从 &os; 5.3-RELEASE 开始, 已经可以 直接地 支持 网络驱动接口标准 (NDIS, Network Driver Interface Specification) 了。 &os; NDISulator (也被称为 Project Evil) 可以支持二进制形式的 &windows; 驱动程序, 并让它相信正在运行的是 &windows;。 由于 &man.ndis.4; 驱动使用的是用于 &windows; 的二进制形式的驱动, 因此它只能在 &i386; 和 amd64 系统上使用。 &man.ndis.4; 驱动在设计时主要提供了 PCI、 CardBus 和 PCMCIA 设备的支持, 而 USB 设备目前则没有提供支持。 要使用 NDISulator, 您需要三件东西: 内核的源代码 二进制形式的 &windowsxp; 驱动程序 (扩展名为 .SYS) &windowsxp; 驱动程序配置文件 (扩展名为 .INF) 您需要找到用于您的卡的这些文件。 一般而言, 这些文件可以在随卡附送的 CD 或制造商的网站上找到。 在下面的例子中, 我们用 W32DRIVER.SYSW32DRIVER.INF 来表示这些文件。 不能在 &os;/amd64 上使用 &windows;/i386 驱动程序。 必须使用 &windows;/amd64 驱动才能在其上正常工作。 接下来的步骤是将二进制形式的驱动程序组装成内核模块。 要完成这一任务, 需要以 root 用户的身份执行 &man.ndisgen.8;: &prompt.root; ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS &man.ndisgen.8; 是一个交互式的程序, 它会提示您输入所需的一些其他的额外信息; 这些工作完成之后, 它会在当前目录生成一个内核模块文件, 这个文件可以通过下述命令来加载: &prompt.root; kldload ./W32DRIVER.ko 除了刚刚生成的内核模块之外, 还必须加载 ndis.koif_ndis.ko 这两个内核模块, 在您加载需要 &man.ndis.4; 的模块时, 通常系统会自动完成这一操作。 如果希望手工加载它们, 则可以使用下列命令: &prompt.root; kldload ndis &prompt.root; kldload if_ndis 第一个命令会加载 NDIS 袖珍端口驱动封装模块, 而第二条命令则加载实际的网络接口。 现在请查看 &man.dmesg.8; 来了解是否发生了错误。 如果一切正常, 您会看到类似下面的输出: ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1 ndis0: NDIS API version: 5.0 ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5 ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps 这之后, 就可以像使用其它网络接口 (例如 dc0) 一样来使用 ndis0 设备了。 与任何其它模块一样, 您也可以配置系统, 令其在启动时自动加载 NDIS 模块。 首先, 将生成的模块 W32DRIVER.ko 复制到 /boot/modules 目录中。 接下来, 在 /boot/loader.conf 中加入: W32DRIVER_load="YES" 配置网卡 网卡 配置 现在正确的网卡驱动程序已经装载,那么就应该配置它了。 跟其他配置一样,网卡可以在安装时用 sysinstall 来配置。 要显示您系统上的网络接口的配置,输入下列命令: &prompt.user; ifconfig dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255 ether 00:a0:cc:da:da:da media: Ethernet autoselect (100baseTX <full-duplex>) status: active dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255 ether 00:a0:cc:da:da:db media: Ethernet 10baseT/UTP status: no carrier lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask 0xff000000 tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500 老版本的 &os; 可能需要在 &man.ifconfig.8; 后面接 选项,需要了解更多的 &man.ifconfig.8; 语法请查阅使用手册。注意所有关于 IPv6 (inet6 等等) 的记录在这个例子里都被忽略了。 在这个例子中,显示出了下列设备: dc0: 第一个以太网接口 dc1: 第二个以太网接口 lp0: 并行端口网络接口 lo0: 回环设备 tun0: ppp使用的隧道设备 &os; 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如 sis2 是系统中使用 &man.sis.4; 驱动的第三块网卡。 在这个例子中,dc0 设备启用了。主要表现在: UP 表示这块网卡已经配置完成准备工作。 这块网卡有一个 Internet (inet) 地址 (这个例子中是 192.168.1.3)。 它有一个有效的子网掩码 (netmask0xffffff00 等同于 255.255.255.0)。 它有一个有效的广播地址 (这个例子中是 192.168.1.255)。 网卡的 MAC (ether) 地址是 00:a0:cc:da:da:da 物理传输媒介模式处于自动选择状态 (media: Ethernet autoselect (100baseTX <full-duplex>))。我们看到 dc1 被配置成运行在 10baseT/UTP 模式下。 要了解驱动媒介类型的更多信息, 请查阅它们的使用手册。 连接状态 (status)是 active,也就是说连接信号被检测到了。对于 dc1,我们看到 status: no carrier。 这通常是网线没有插好。 如果 &man.ifconfig.8; 的输出显示了类似于: dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 ether 00:a0:cc:da:da:da 的信息,那么就是还没有配置网卡。 要配置网卡,您需要 root 权限。 网卡配置可以通过使用 &man.ifconfig.8; 命令行方式来完成, 但是这样每次启动都要做一遍。放置网卡配置信息的文件是 /etc/rc.conf 用您自己喜欢的编辑器打开 /etc/rc.conf。 并且您需要为每一块系统中存在的网卡添加一行, 在我们的例子中,添加如下几行: ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0" ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP" 用自己正确的设备名和地址来替换例子中的 dc0dc1 等内容。您应该应该查阅网卡驱动和 &man.ifconfig.8; 的手册页来了解各选项,也要查看一下 &man.rc.conf.5; 帮助页来了解 /etc/rc.conf 的语法。 如果在安装的时候配置了网络,关于网卡的一些行可能已经存在了。 所以在添加新行前仔细检查一下 /etc/rc.conf 您也可能需要编辑 /etc/hosts 来添加局域网中不同的机器名称和 IP 地址,如果它们不存在,查看 &man.hosts.5; 帮助和 /usr/share/examples/etc/hosts 以获得更多信息。 测试和调试 /etc/rc.conf 做了必要的修改之后应该重启系统以应用对接口的修改, 并且确认系统重启后没有任何配置错误。 系统重启后就应该测试网络接口了。 测试以太网卡 网卡 测试 为了确认网卡被正确的配置了,在这里我们要做两件事情。首先, ping 自己的网络接口,接着 ping 局域网内的其他机器。 首先测试本地接口: &prompt.user; ping -c5 192.168.1.3 PING 192.168.1.3 (192.168.1.3): 56 data bytes 64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms 64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms 64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms 64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms 64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms --- 192.168.1.3 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms 现在我们应该 ping 局域网内的其他机器: &prompt.user; ping -c5 192.168.1.2 PING 192.168.1.2 (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms 64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms --- 192.168.1.2 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms 您如果您设置了 /etc/hosts 文件,也可以用机器名来替换 192.168.1.2 调试 网卡 故障排除 调试硬件和软件配置一直是一件头痛的事情, 从最简单的开始可以减轻一些痛苦。 例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗? 是否使用了被 &os; 支持的网卡? 在发送错误报告之前您应该查看一下硬件说明, 升级 &os; 到最新的 STABLE 版本, 看一下邮件列表或者在 Internet 上搜索一下。 如果网卡工作了, 但性能低下,应该好好阅读一下 &man.tuning.7; 联机手册。 您也可以检查一下网络配置, 不正确的设置会导致慢速的网络连接。 一些用户可能会在一些网卡上经历一到两次 device timeouts, 这通常是正常现象。 如果经常这样甚至引起麻烦, 则应确定一下它跟其他设备没有冲突。 仔细检查网线连接, 或者换一块网卡。 有时用户会看到少量 watchdog timeout 错误。 这种情况要做的第一件事就是检查线缆连接。 一些网卡需要支持总线控制的 PCI 插槽。 在一些老的主板上,只有一个 PCI 插槽支持 (一般是 slot 0)。 检查网卡和主板说明书来确定是不是这个问题。 No route to host 通常发生在如果系统不能发送一个路由到目的主机的包的时候。 这在没有指定默认路由或者网线没有插上时会发生。 检查 netstat -rn 的输出并确认有一个有效的路由能到达相应的主机。 如果没有,请查阅 ping: sendto: Permission denied 错误信息经常由防火墙的配置错误引起。 如果 ipfw 在内核中启用了但是没有定义规则, 那么默认的规则就是拒绝所有通讯,甚至 ping 请求! 查阅 以了解更多信息。 有时网卡性能低下或者低于平均水平, 这种情况最好把传输媒介模式从 autoselect 改变为正确的传输介质模式。 这通常对大多数硬件有用, 但可能不会解决所有人的问题。 接着,检查所有网络设置,并且阅读 &man.tuning.7; 手册页。 虚拟主机 虚拟主机 IP 别名 &os; 的一个很普通的用途是虚拟主机站点, 一个服务器虚拟成很多服务器一样提供网络服务。 这通过在一个接口上绑定多个网络地址来实现。 一个特定的网络接口有一个真实的地址, 也可能有一些别名地址。这些别名通常用 /etc/rc.conf 中的记录来添加。 一个 fxp0 的别名记录类似于: ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx" 记住别名记录必须从 alias0 开始并且按顺序递增(例如 _alias1_alias2)。 配置程序将会停止在第一个缺少的数字的地方。 计算别名的子网掩码是很重要的,幸运的是它很简单。 对于一个接口来说,必须有一个描述子网掩码的地址。 任何在这个网段下的地址必须有一个全是 1 的子网掩码(通常表示为 255.255.255.2550xffffffff 举例来说, 假设使用 fxp0 连接到两个网络, 分别是 10.1.1.0, 其子网掩码为 255.255.255.0, 以及 202.0.75.16, 其子网掩码为 255.255.255.240。 我们希望从 10.1.1.110.1.1.5 以及从 202.0.75.17202.0.75.20 的地址能够互相访问。 如前所述, 只有两个网段中的第一个地址 (本例中, 10.0.1.1202.0.75.17) 应使用真实的子网掩码; 其余的 (10.1.1.210.1.1.5 以及 202.0.75.18202.0.75.20) 则必须配置为使用 255.255.255.255 作为子网掩码。 下面是根据上述描述所进行的 /etc/rc.conf 配置: ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0" ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255" ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255" ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255" ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255" ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240" ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255" ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255" ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255" 配置文件 <filename>/etc</filename> 布局 在配置信息中有很多的目录,这些包括: /etc 一般的系统配置信息。这儿的数据是与特定系统相关的。 /etc/defaults 系统配置文件的默认版本。 /etc/mail 额外的 &man.sendmail.8; 配置信息,其他 MTA 配置文件。 /etc/ppp 用于用户级和内核级 ppp 程序的配置。 /etc/namedb &man.named.8; 数据的默认位置。通常 named.conf 和区域文件存放在这里。 /usr/local/etc 被安装的应用程序配置文件。可以参考每个应用程序的子目录。 /usr/local/etc/rc.d 被安装程序的 启动/停止 脚本。 /var/db 特定系统自动产生的数据库文件,像 package 数据库,位置数据库等等。 主机名 主机名 DNS <filename>/etc/resolv.conf</filename> resolv.conf /etc/resolv.conf 指示了 &os; 如何访问域名系统(DNS)。 resolv.conf 中最常见的记录是: nameserver 按顺序要查询的名字服务器的 IP 地址,最多三个。 search 搜索机器名的列表。这通常由本地机器名的域决定。 domain 本地域名。 一个典型的 resolv.conf 文件: search example.com nameserver 147.11.1.11 nameserver 147.11.100.30 只能使用一个 searchdomain 选项。 如果您在使用 DHCP,&man.dhclient.8; 经常使用从 DHCP 服务器接受来的信息重写 resolv.conf <filename>/etc/hosts</filename> 主机 /etc/hosts 是 Internet 早期使用的一个简单文本数据库。 它结合 DNS 和 NIS 提供名字到 IP 地址的映射。 通过局域网连接的机器可以用这个简单的命名方案来替代设置一个 &man.named.8; 服务器。另外,/etc/hosts 也可以提供一个 Internet 名称的本地纪录以减轻需要从外部查询带来的负担。 # $&os;$ # # Host Database # This file should contain the addresses and aliases # for local hosts that share this file. # In the presence of the domain name service or NIS, this file may # not be consulted at all; see /etc/nsswitch.conf for the resolution order. # # ::1 localhost localhost.my.domain myname.my.domain 127.0.0.1 localhost localhost.my.domain myname.my.domain # # Imaginary network. #10.0.0.2 myname.my.domain myname #10.0.0.3 myfriend.my.domain myfriend # # According to RFC 1918, you can use the following IP networks for # private nets which will never be connected to the Internet: # # 10.0.0.0 - 10.255.255.255 # 172.16.0.0 - 172.31.255.255 # 192.168.0.0 - 192.168.255.255 # # In case you want to be able to connect to the Internet, you need # real official assigned numbers. PLEASE PLEASE PLEASE do not try # to invent your own network numbers but instead get one from your # network provider (if any) or from the Internet Registry (ftp to # rs.internic.net, directory `/templates'). # /etc/hosts 用简单的格式: [Internet address] [official hostname] [alias1] [alias2] ... 例如: 10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2 参考 &man.hosts.5; 以获得更多信息。 日志文件配置 日志文件 <filename>syslog.conf</filename> syslog.conf syslog.conf 是 &man.syslogd.8; 程序的配置文件。 它指出了的 syslog 哪种信息类型被存储在特定的日志文件中。 # $&os;$ # # Spaces ARE valid field separators in this file. However, # other *nix-like systems still insist on using tabs as field # separators. If you are sharing this file between systems, you # may want to use only tabs as field separators here. # Consult the syslog.conf(5) manual page. *.err;kern.debug;auth.notice;mail.crit /dev/console *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages security.* /var/log/security mail.info /var/log/maillog lpr.info /var/log/lpd-errs cron.* /var/log/cron *.err root *.notice;news.err root *.alert root *.emerg * # uncomment this to log all writes to /dev/console to /var/log/console.log #console.info /var/log/console.log # uncomment this to enable logging of all log messages to /var/log/all.log #*.* /var/log/all.log # uncomment this to enable logging to a remote log host named loghost #*.* @loghost # uncomment these if you're running inn # news.crit /var/log/news/news.crit # news.err /var/log/news/news.err # news.notice /var/log/news/news.notice !startslip *.* /var/log/slip.log !ppp *.* /var/log/ppp.log 参考 &man.syslog.conf.5; 手册页以获得更多信息 <filename>newsyslog.conf</filename> newsyslog.conf newsyslog.conf 是一个通常用 &man.cron.8; 计划运行的 &man.newsyslog.8; 程序的配置文件。 &man.newsyslog.8; 指出了什么时候日志文件需要打包或者重新整理。 比如 logfile 被移动到 logfile.0logfile.0 被移动到 logfile.1 等等。另外,日志文件可以用 &man.gzip.1; 来压缩,它们是这样的命名格式: logfile.0.gzlogfile.1.gz 等等。 newsyslog.conf 指出了哪个日志文件要被管理,要保留多少和它们什么时候被创建。 日志文件可以在它们达到一定大小或者在特定的日期被重新整理。 # configuration file for newsyslog # $&os;$ # # filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num] /var/log/cron 600 3 100 * Z /var/log/amd.log 644 7 100 * Z /var/log/kerberos.log 644 7 100 * Z /var/log/lpd-errs 644 7 100 * Z /var/log/maillog 644 7 * @T00 Z /var/log/sendmail.st 644 10 * 168 B /var/log/messages 644 5 100 * Z /var/log/all.log 600 7 * @T00 Z /var/log/slip.log 600 3 100 * Z /var/log/ppp.log 600 3 100 * Z /var/log/security 600 10 100 * Z /var/log/wtmp 644 3 * @01T05 B /var/log/daily.log 640 7 * @T00 Z /var/log/weekly.log 640 5 1 $W6D0 Z /var/log/monthly.log 640 12 * $M1D0 Z /var/log/console.log 640 5 100 * Z 参考 &man.newsyslog.8; 手册页以获得更多信息。 <filename>sysctl.conf</filename> sysctl.conf sysctl sysctl.confrc.conf 这两个文件的风格很接近。 其中的配置均为 变量=值 这样的形式。 在这个文件中配置的值, 均会在系统进入多用户模式之后进行实际的修改操作。 需要注意的是, 并不是所有的变量都能够在多用户模式下修改。 如果希望关闭对收到致命的信号退出的进程进行记录, 并阻止普通用户看到其他用户的进程, 可以在 sysctl.conf 中进行下列配置: # 不记录由于致命信号导致的进程退出 (例如信号 11,访问越界) kern.logsigexit=0 # 阻止用户看到以其他用户 UID 身份执行的进程。 security.bsd.see_other_uids=0 用 sysctl 进行调整 sysctl 调整 以 sysctl &man.sysctl.8; 是一个允许您改变正在运行中的 &os; 系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用 &man.sysctl.8; 可以读取设置超过五百个系统变量。 基于这点,&man.sysctl.8; 提供两个功能:读取和修改系统设置。 查看所有可读变量: &prompt.user; sysctl -a 读一个指定的变量,例如 kern.maxproc &prompt.user; sysctl kern.maxproc kern.maxproc: 1044 要设置一个指定的变量,直接用 variable=value 这样的语法: &prompt.root; sysctl kern.maxfiles=5000 kern.maxfiles: 2088 -> 5000 sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示'yes',用 0 来表示'no')。 如果你想在每次机器启动时自动设置某些变量, 可将它们加入到文件 /etc/sysctl.conf 之中。更多信息,请参阅手册页 &man.sysctl.conf.5; 及 Tom Rhodes Contributed by 只读的 &man.sysctl.8; 有时可能会需要修改某些只读的 &man.sysctl.8; 的值。 尽管有时不得不这样做, 但只有通过(重新)启动才能达到这样的目的。 例如一些膝上型电脑的 &man.cardbus.4; 设备不会探测内存范围,并且产生看似于这样的错误: cbb0: Could not map register memory device_probe_and_attach: cbb0 attach returned 12 像上面的错误通常需要修改一些只读的 &man.sysctl.8; 默认设置。要实现这点,用户可以在本地的 /boot/loader.conf.local 里面放一个 &man.sysctl.8; OIDs。那些设置定位在 /boot/defaults/loader.conf 文件中。 修复上面的问题用户需要在刚才所说的文件中设置 。现在 &man.cardbus.4; 就会正常的工作了。 调整磁盘 Sysctl 变量 <varname>vfs.vmiodirenable</varname> vfs.vmiodirenable vfs.vmiodirenable sysctl 变量可以设置成0(关)或者1(开);默认是1。 这个变量控制目录是否被系统缓存。大多数目录是小的, 在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。当这个变量设置为关闭 (0) 时, 缓存器仅仅缓存固定数量的目录,即使您有很大的内存。 而将其开启 (设置为1) 时, 则允许缓存器用 VM 页面缓存来缓存这些目录,让所有可用内存来缓存目录。 不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。 我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。 这些服务包括 web 缓存,大容量邮件系统和新闻系统。 尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。 但还是应该检验一下。 <varname>vfs.write_behind</varname> vfs.write_behind vfs.write_behind sysctl 变量默认是 1 (打开)。 它告诉文件系统簇被收集满的时候把内容写进介质, 典型的是在写入大的连续的文件时。 主要的想法是, 如果可能对 I/O 性能会产生负面影响时, 应尽量避免让缓冲缓存被未同步缓冲区充满。 然而它可能降低处理速度并且在某些情况下您可能想要关闭它。 <varname>vfs.hirunningspace</varname> vfs.hirunningspace vfs.hirunningspace sysctl 变量决定了在任何给定情况下, 有多少写 I/O 被排进队列以给系统的磁盘控制器。 默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成 4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。 不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。 sysctl 中还有许多与 buffer cache 和 VM页面 cache 有关的值, 一般不推荐修改它们。 虚拟内存系统已经能够很好地进行自动调整了。 <varname>vm.swap_idle_enabled</varname> vm.swap_idle_enabled vm.swap_idle_enabled sysctl 变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。 这些系统注重在空闲的内存中间产生连续压力的处理。通过 vm.swap_idle_threshold1vm.swap_idle_threshold2 打开这个特性并且调整交换滞后 (在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页 (pageout)算法更快。这给出页守护进程带来了帮助。 除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存, 因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果, 但是在大的系统上它已经做了合适的页面调度这个选项允许 VM 系统容易的让全部的进程进出内存。 <varname>hw.ata.wc</varname> hw.ata.wc &os; 4.3 中默认将 IDE 的写缓存关掉了。 这会降低到 IDE 磁盘用于写入操作的带宽, 但我们认为这有助于避免硬盘厂商所引入的, 可能引致严重的数据不一致问题。 这类问题实际上是由于 IDE 硬盘就写操作完成这件事的不诚实导致的。 当启用了 IDE 写入缓存时, IDE 硬盘驱动器不但不会按顺序将数据写到盘上, 而且当磁盘承受重载时, 它甚至会自作主张地对推迟某些块的实际写操作。 这样一来, 在系统发生崩溃或掉电时, 就会导致严重的文件系统损坏。 基于这些考虑, 我们将 &os; 的默认配置改成了更为安全的禁用 IDE 写入缓存。 然而不幸的是, 这样做导致了性能的大幅降低, 因此在后来的发行版中这个配置又改为默认启用了。 您可以通过观察 hw.ata.wc sysctl 变量, 来确认您的系统中所采用的默认值。 如果 IDE 写缓存被禁用, 您可以通过将内核变量设置为 1 来启用它。 这一操作必须在启动时通过 boot loader 来完成。 在内核启动之后尝试这么做是没有任何作用的。 要了解更多的信息,请查阅 &man.ata.4;。 <literal>SCSI_DELAY</literal> (<varname>kern.cam.scsi_delay</varname>) kern.cam.scsi_delay kernel options SCSI_DELAY SCSI_DELAY 内核配置会缩短系统启动时间。 默认值在系统启动过程中有 15 秒的迟延时间, 这是一个足够多且可靠的值。把它减少到 5 通常也能工作(特别是现代的驱动器)。新一些的 &os; (5.0 或更高版本) 应该用启动时刻可调整 kern.cam.scsi_delay。 这个可调整的和内核配置选项接受的值是 毫秒 不是 Soft Updates Soft Updates tunefs &man.tunefs.8; 程序能够用来很好的调整文件系统。 这个程序有很多不同的选项,但是现在只介绍 Soft Updates 的打开和关闭,这样做: &prompt.root; tunefs -n enable /filesystem &prompt.root; tunefs -n disable /filesystem 在文件系统被挂载之后不能用 &man.tunefs.8; 来修改。打开 Soft Updates 的最佳时机是在单用户模式下任何分区被被挂载前。 Soft Updates 极大地改善了元数据修改的性能, 主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用 Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates 保证了崩溃后的文件系统完整性,但是很可能有几秒钟 (甚至一分钟!) 之前的数据没有写到物理磁盘。如果您的系统崩溃了您可能会丢失很多工作。 第二,SoftUpdates 推迟文件系统块的释放时间。如果在文件系统 (例如根文件系统)快满了的情况下对系统进行大规模的升级比如 make installworld, 可能会引起磁盘空间不足从而造成升级失败。 Soft Updates 的详细资料 Soft Updates 详细资料 有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。 (Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据) 从前,默认方法是同步更新这些元数据(meta-data)。 如果一个目录改变了,系统在真正写到磁盘之前一直等待。 文件数据缓存(文件内容)在这之后以非同步形式写入。 这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data) 一直处于完整状态。文件要不就被完整的创建要不根本就不创建。 如果崩溃时找不到文件的数据块,&man.fsck.8; 可以找到并且依靠把文件大小设置为 0 来修复文件系统。 另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如 rm -r 命令,依次触及目录下的所有文件, 但是每个目录的改变(删除一个文件)都要同步写入磁盘。 这包含它自己更新目录,inode 表和可能对文件分散的块的更新。 同样问题出现大的文件操作上(比如 tar -x)。 第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的 mount -o async 默认的方法。所有元数据更新也是通过缓存。 也就是它们会混合在文件内容数据更新中。 这个方法的优点是不需要等待每个元数据更新都写到磁盘上, 所以所有引起元数据更新大的操作比同步方式更快。同样, 这个方法也是清楚且简单的,所以代码中的漏洞风险很小。 缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败 (例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。 系统再启动时没有机会检查文件系统的状态;inode 表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用 fsck 命令来清理(因为磁盘上没有所需要的信息)。 如果文件系统修复后损坏了,唯一的选择是使用 &man.newfs.8; 并且从备份中恢复它。 这个问题通常的解决办法是使用 dirty region logging 或者 journaling 尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。 这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。 过后他们将会被移动到正确的位置。因为纪录区很小, 磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。 另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次 (一次写到纪录区域,一次写到正确的区域)。正常情况下, 悲观的性能可能会发生。从另一方面来讲, 崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。 Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates 解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘 (有序的元数据更新)。这样的结果是,在繁重的元数据操作中, 如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。 所以所有的目录操作在写进磁盘的时候首先在内存中执行 (数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。 如果系统崩溃了这将导致一个固定的 日志回朔: 所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在 30 到 60 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后, 唯一的资源分配错误是一个实际是空闲的资源的资源被标记为使用。 &man.fsck.8; 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用 mount -f 强制挂上的文件系统的错误状态是安全的。 为了释放可能没有使用的资源,&man.fsck.8; 需要在过后的时间运行。一个主意是用 后台 fsck:系统启动的时候只有一个文件系统的 快照 被记录下来。fsck 可以在过后运行。所有文件系统可以在有错误的时候被挂接, 所以系统可以在多用户模式下启动。接着,后台 fsck 可以在所有文件系统需要的时候启动来释放可能没有使用的资源。 (尽管这样,不用 Soft Updates 的文件系统依然需要通常的 fsck。) 它的优点是元数据操作几乎跟非同步一样快 (也就是比需要两次元数据写操作的 logging 更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险) 和高的内存使用量。另外它有些特点需要知道。崩溃之后, 文件系统状态会落后一些。同步的方法用 fsck 后在一些地方可能产生一些零字节的文件, 这些文件在用 Soft Updates 文件系统之后不会存在, 因为元数据和文件内容根本没有写进磁盘(可能发生在运行 rm 之后)。这可能在文件系统上安装大量数据时候引发问题, 没有足够的剩余空间来两次存储所有文件。 调整内核限制 调整 内核限制 文件/进程限制 <varname>kern.maxfiles</varname> kern.maxfiles kern.maxfiles 可以根据系统的需要适当增减。 这个变量用于指定在系统中允许的文件描述符的最大数量。 当文件描述符表满的时候, file: table is full 会在系统消息缓冲区中反复出现, 您可以使用 dmesg 命令来观察这一现象。 每个打开的文件、 套接字和管道, 都会占用一个文件描述符。 在大型生产服务器上, 可能会轻易地用掉数千个文件描述符, 具体用量取决于服务的类型和并行启动的服务数量。 在早期版本的 &os; 中, kern.maxfiles 的默认值, 是根据您内核配置文件中的 选项计算的。 kern.maxfiles 这个数值, 会随 成比例地增减。 当编译定制的内核时, 按照您系统的用途来修改这个值是个好主意。 这个数字同时还决定内核的许多预设的限制值。 有时, 尽管并不会真的有 256 个用户同时连接一台生产服务器, 但对于高负载的 web 服务器而言, 却可能需要与之类似的资源。 - 从 FreeBSD 4.5 开始, kern.maxusers + 变量 kern.maxusers 会在系统启动时, 根据可用内存的尺寸进行计算, 在内核开始运行之后, 可以通过只读的 kern.maxusers sysctl 变量值来进行观察。 有些情况下, 可能会希望使用更大或更小一些的 kern.maxusers, 它可以以加载器变量的形式进行配置; 类似 64、 128 和 256 这样的值都并不罕见。 我们不推荐使用超过 256 的值, 除非您需要巨量的文件描述符; 根据 kern.maxusers 推算默认值的那些变量, 一般都可以在引导甚至运行时通过 /boot/loader.conf (请参见 &man.loader.conf.5; 联机手册或 /boot/defaults/loader.conf 文件来获得相关的指导) - 或这篇文档的其余部分所介绍的方式来调整。 而在 - FreeBSD 4.4 之前的版本, 则只能通过内核的 &man.config.8; - 选项 来加以调整。 + 或这篇文档的其余部分所介绍的方式来调整。 在较早的版本中, 如果您明确地将 maxusers 设置为 0, 则系统会自动地根据硬件配置来确定这个值。 自动调整算法会将 maxusers 设置为与主存的数量一样, 或者取其下限 32 或上限 384。 。 在 &os; 5.X 和更高版本中, maxusers 如果不指定的话, 就会取默认值 0。 如果希望自行管理 maxusers, 则应配置一个不低于 4 的值, 特别是使用 X Window System 或编译软件的时候。 这样做的原因是, maxusers 所决定的一个最为重要的表的尺寸会影响最大进程数, 这个数值将是 20 + 16 * maxusers。 因此如果将 maxusers 设置为 1, 您就只能同时运行 36 个进程, 这还包括了 18 个左右的系统引导时启动的进程, 以及 15 个左右的, 在您启动 X Window System 时所引发的进程。 即使是简单的任务, 如阅读联机手册, 也需要启动多至九个的进程, 用以过滤、 解压缩, 并显示它。 将 maxusers 设为 64 将允许您同时执行最多 1044 个进程, 这几乎足以满足任何需要了。 不过, 如果您看在启动其它程序, 或运行用以支持大量用户的服务 (例如 ftp.FreeBSD.org) 时, 看到令人担忧的 proc table full 错误, 就应该提高这一数值, 并重新联编内核。 maxusers不能 限制实际能够登录到您系统上来的用户的数量。 它的主要作用是根据您可能支持的用户数量来为一系列系统数据表设置合理的尺寸, - 以便提供支持他们所需运行的进程资源。 而 能够 - 限制并发远程以及 X 终端窗口数量的变量则是 pseudo-device pty - 16。 对于 &os; 5.X, 您不再需要为这一数字而担心, - 因为 &man.pty.4; 驱动已经是 - 自动复制的 了; 您只需在配置文件中指定 - device pty 即可。 + 以便提供支持他们所需运行的进程资源。 <varname>kern.ipc.somaxconn</varname> kern.ipc.somaxconn kern.ipc.somaxconn sysctl 变量 限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。 大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 &man.sendmail.8; 或者 Apache), 常常在它们的配置文件中有设置队列大小的选项。 大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。 网络限制 NMBCLUSTERS 内核配置选项指出了系统可用的网络Mbuf的数量。 一个高流量的服务器使用一个小数目的网络缓存会影响 &os; 的性能。 每个 cluster 可能需要2K内存,所以一个1024的值需要在内核中给网络缓存保留2M内存。 可以用简单的方法计算出来需要多少网络缓存。 如果您有一个同时发生1000个以上连接的web服务器, 并且每个连接用掉16K接收和发送缓存, 就需要大概32M网络缓存来确保web服务器的工作。 一个好的简单计算方法是乘以2,所以2x32Mb/2Kb=64MB/2kb=32768。 我们建议在有大量内存的机器上把这个值设置在4096到32768之间。 没有必要把它设置成任意太高的值,它会在启动时引起崩溃。 &man.netstat.1; 的 选项可以用来观察网络cluster使用情况。 kern.ipc.nmbclusters 可以用来在启动时刻调节这个。 仅仅在旧版本的 &os; 需要使用 NMBCLUSTERS &man.config.8; 选项。 经常使用 &man.sendfile.2; 系统调用的繁忙的服务器, 有必要通过 NSFBUFS 内核选项或者在 /boot/loader.conf (查看 &man.loader.8; 以获得更多细节) 中设置它的值来调节 &man.sendfile.2; 缓存数量。 这个参数需要调节的普通原因是在进程中看到 sfbufa 状态。sysctl kern.ipc.nsfbufs 变量在内核配置变量中是只读的。 这个参数是由 kern.maxusers 决定的,然而它可能有必要因此而调整。 即使一个套接字被标记成非阻塞,在这个非阻塞的套接字上呼叫 &man.sendfile.2; 可能导致 &man.sendfile.2; 呼叫阻塞直到有足够的 struct sf_buf 可用。 <varname>net.inet.ip.portrange.*</varname> net.inet.ip.portrange.* net.inet.ip.portrange.* sysctl 变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。 这里有三个范围:一个低端范围,一个默认范围和一个高端范围。 大多数网络程序分别使用由 net.inet.ip.portrange.firstnet.inet.ip.portrange.last 控制的从 1024 到 5000 的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口, 这经常发生在运行一个高负荷 web 代理服务器的时候。 这个端口范围不是用来限制主要的例如 web 服务器进入连接或者有固定端口例如邮件传递对外连接的。 有时您可能用完了端口,那就建议适当的增加 net.inet.ip.portrange.last1000020000 或者 30000 可能是适当的值。 更改端口范围的时候也要考虑到防火墙。 一些防火墙会阻止端口的大部分范围 (通常是低范围的端口)并且用高端口进行对外连接(—)。 基于这个问题建议不要把 net.inet.ip.portrange.first 设的太小。 TCP 带宽迟延(Bandwidth Delay Product) 限制 TCP 带宽延迟积 net.inet.tcp.inflight.enable 限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。 它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。 系统将尝试计算每一个连接的带宽延迟积, 并将排队的数据量限制在恰好能保持最优吞吐量的水平上。 这一特性在您的服务器同时向使用普通调制解调器, 千兆以太网, 乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要, 特别是当您同时使用滑动窗缩放, 或使用了大的发送窗口的时候。 如果启用了这个选项, 您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试), 对于生产环境而言, 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。 然而, 需要注意的是, 这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。 这个限制特性减少了在路由和交换包队列的堵塞数据数量, 也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、 交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。但是,注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。 调整 net.inet.tcp.inflight.stab 推荐的。 这个参数的默认值是 20, 表示把 2 个最大包加入到带宽延迟积窗口的计算中。 额外的窗口似的算法更为稳定, 并改善对于多变网络环境的相应能力, 但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。 对于这些情形, 您可能会希望把这个参数减少到 15, 10, 或 5; 并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说, 3500) 来得到希望的效果。 减少这些参数的值, 只应作为最后不得已时的手段来使用。 虚拟内存 <varname>kern.maxvnodes</varname> vnode 是对文件或目录的一种内部表达。 因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。 一般而言, 这是由操作系统自行完成的, 也不需要加以修改。 但在某些时候磁盘 I/O 会成为瓶颈, 而系统的 vnode 不足, 则这一配置应被增加。 此时需要考虑是非活跃和空闲内存的数量。 要查看当前在用的 vnode 数量: &prompt.root; sysctl vfs.numvnodes vfs.numvnodes: 91349 要查看最大可用的 vnode 数量: &prompt.root; sysctl kern.maxvnodes kern.maxvnodes: 100000 如果当前的 vnode 用量接近最大值, 则将 kern.maxvnodes 值增大 1,000 可能是个好主意。 您应继续查看 vfs.numvnodes 的数值, 如果它再次攀升到接近最大值的程度, 仍需继续提高 kern.maxvnodes。 在 &man.top.1; 中显示的内存用量应有显著变化, 更多内存会处于活跃 (active) 状态。 添加交换空间 不管您计划得如何好,有时候系统并不像您所期待的那样运行。 如果您发现需要更多的交换空间,添加它很简单。 有三种方法增加交换空间:添加一块新的硬盘驱动器、通过 NFS 使用交换空间和在一个现有的分区上创建一个交换文件。 要了解关于如何加密交换区, 相关配置, 以及为什么要这样做, 请参阅手册的 在新的硬盘驱动器上使用交换空间 这是添加交换空间最好的方法, 当然为了达到这个目的需要添加一块硬盘。 毕竟您总是可以使用另一块磁盘。如果能这么做, 重新阅读一下手册中关于交换空间的 来了解如何最优地安排交换空间。 通过 NFS 交换 除非没有可以用作交换空间的本地硬盘时, 否则不推荐您使用 NFS 来作为交换空间使用。 NFS 交换会受到可用网络带宽限制并且增加 NFS 服务器的负担。 交换文件 您可以创建一个指定大小的文件用来当作交换文件。 在我们的例子中我们将会使用叫做 /usr/swap0 的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。 在 &os; 中创建交换文件 确认您的内核配置包含虚拟磁盘(Memory disk)驱动 (&man.md.4;)。它在 GENERIC 内核中是默认的。 device md # Memory "disks" 创建一个交换文件(/usr/swap0): &prompt.root; dd if=/dev/zero of=/usr/swap0 bs=1024k count=64 赋予它(/usr/swap0)一个适当的权限: &prompt.root; chmod 0600 /usr/swap0 /etc/rc.conf 中启用交换文件: swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired. 通过重新启动机器或下面的命令使交换文件立刻生效: &prompt.root; mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0 Hiten Pandya Written by Tom Rhodes 电源和资源管理 BIOS 接口管理,例如可插拔 BIOS (PNPBIOS)或者高级电源管理(APM) 等等。电源和资源管理是现代操作系统的关键组成部分。 例如您可能当系统温度过高的时候让您的操作系统能监视到 (并且可能提醒您)。 以有效的方式利用硬件资源是非常重要的。 在引入 ACPI 之前, 管理电源使用和系统散热对操作系统是很困难的。 硬件由 BIOS 进行管理, 因而用户对电源管理配置的控制和查看都比较困难。 一些系统通过 高级电源管理 (APM) 提供了有限的配置能力。 电源和资源管理是现代操作系统的一个关键组件。 例如, 您可能希望操作系统监视系统的一些限制, 例如系统的温度是否超出了预期的增长速度 (并在需要时发出警告)。 在 &os; 使用手册的这一章节,我们将提供 ACPI 全面的信息。 参考资料会在末尾给出。 什么是 ACPI? ACPI APM 高级配置和电源接口 (ACPI) 是一个业界标准的硬件资源和电源管理接口 (因此而得名) 。它是 操作系统控制的配置和电源管理(Operating System-directed configuration and Power Management),也就是说, 它给操作系统(OS)提供了更多的控制和弹性。 在引入 ACPI 之前, 现代操作系统使得目前即插即用接口的局限性更加 凸现 出来。 ACPIAPM(高级电源管理) 的直接继承者。 高级电源管理 (APM) 的缺点 高级电源管理 (APM) 是一种基于系统目前的活动控制其电源使用的机制。 APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。 在 OS 中的 APM 驱动作为中介来访问 APM 软件接口, 从而实现对电源使用的管理。 在 2000 年或更早的时期生产的计算机系统, 仍需要使用 APM。 APM 有四个主要的问题。 首先, 电源管理是通过 (制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。 例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值, 当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度, 而不会征求 OS 的同意。 第二, APM 逻辑是嵌入 BIOS 的, 因此它是在 OS 的控制之外运转的。 这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS 才能够解决某些问题; 而这是一个很危险的操作, 因为它可能使系统进入一个无法恢复的状态。 第三, APM 是一种制造商专属的技术, 也就是说有很多第三方的 (重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有, 也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM BIOS 没有为实现复杂的电源策略提供足够的余地, 也无法实现能够非常适合具体机器的策略。 即插即用 BIOS (PNPBIOS) 在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术, 因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法 接口 &os; APM 驱动在 &man.apm.4; 手册页中有描述。 配置 <acronym>ACPI</acronym> 默认情况下, acpi.ko 驱动, 会在系统引导时由 &man.loader.8; 加载, 而 不应 直接联编进内核。 这样做的原因是模块操作起来更方便, 例如, 无需重新联编内核就可以切换到另一个 acpi.ko 版本。 这样可以让测试变得更简单一些。 另一个原因是, 许多时候在启动已经启动之后再启动 ACPI 可能会有些问题。 如果您遇到了问题, 可以全面禁用 ACPI。 这个驱动不应, 目前也无法卸载, 因为系统总线通过它与许多不同的硬件进行交互。 ACPI 可以通过在 /boot/loader.conf 中配置或在 &man.loader.8; 提示符处配置 hint.acpi.0.disabled="1" 来禁用。 ACPIAPM 不能共存, 相反, 它们应分开使用。 后加载的驱动如果发现系统中已经执行了其中的一个, 便会停止执行。 ACPI 可以用来让系统进入休眠模式, 方法是使用 &man.acpiconf.8; 的 参数, 加上一个 1-5 的数字。 多数用户会希望使用 13 (挂起到 RAM)。 而 5 则会让系统执行与下列命令效果类似的软关机: &prompt.root; halt -p 除此之外, 还有一些通过 &man.sysctl.8; 提供的选项。 请参见联机手册 &man.acpi.4; 和 &man.acpiconf.8; 以获得更多信息。 Nate Lawson 撰写人: Peter Schultz 协力: Tom Rhodes 使用和调试 &os; <acronym>ACPI</acronym> ACPI problems ACPI 是一种全新的发现设备、 管理电源使用、 以及提供过去由 BIOS 管理的访问不同硬件的标准化方法。 让 ACPI 在各种系统上都能正确使用的工作一直在进行, 但许多主板的 ACPI 机器语言 (AML) 字节代码中的 bug, &os; 的内核中子系统设计的不完善, 以及 &intel; ACPI-CA 解释器中的 bug 仍然不时会出现。 这份文档期望能够帮助您协助 &os; ACPI 的维护人员来找到您所观察到的问题的根源, 并通过调试找到其解决方法。 感谢您阅读这份文档, 我们也希望能够解决您的系统上的问题。 提交调试信息 在提交问题之前, 请确认您已经在运行最新的 BIOS 版本, 此外, 也包括嵌入式控制器的固件版本。 如果您希望提交一个问题, 请确保将下述信息发到 freebsd-acpi@FreeBSD.org: 问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。 另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。 boot -v 之后得到的 &man.dmesg.8; 输出, 以及任何在重现 bug 时出现的错误信息。 在禁用了 ACPI 之后的 boot -v 的 &man.dmesg.8; 输出, 如果您发现禁用 ACPI 能够帮助消除问题。 来自 sysctl hw.acpi的输出。 这也是找到您的系统所提供的功能的一种好办法。 能够得到您的 ACPI Source Language (ASL) 的 URL不要ASL 直接发到邮件列表中, 因为它们可能非常大。 为了得到 ASL 您可以运行这个命令: &prompt.root; acpidump -dt > name-system.asl (把 name 改为您的登录名, 并把 system 改为您的硬件制造商及其型号。 例如: njl-FooCo6000.asl) 许多开发者也会订阅 &a.current; 但还是请发到 &a.acpi.name; 这样它会被更多人看到。 请耐心等待, 因为我们都有全职的其他工作。 如果您的 bug 不是显而易见的, 我们可能会要求您通过 &man.send-pr.1; 来提交一个 PR。 在输入 PR 时,请将同样的信息包含进去。 这将帮助我们来追踪和解决问题。 不要在给 &a.acpi.name; 写信之前发送 PR 因为我们把它当作已知文体的备忘录而不是报告机制。 您的问题很可能已经被其他人报告过了。 背景 ACPI ACPI 存在于采用 ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。 完整的标准具有大量的各式功能, 包括 CPU 性能管理、 电源控制、 温度监控、 电池系统、 嵌入式控制器以及总线枚举。 绝大多数系统实现比完整标准的功能要少一些。 例如, 桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。 笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。 符合 ACPI 的系统中有许多组件。 BIOS 和芯片组制造商提供一些固定的表 (例如, FADT) 在存储器中, 以提供类似 APIC 映射 (用于 SMP)、 配置寄存器、 以及简单的配置值等等。 另外, 一个字节代码 (bytecode) 表 (系统区别描述表 DSDT) 则提供了通过树状命名空间来指定设备及其功能的方法。 ACPI 驱动必须要处理固定表, 实现字节码解释器, 并修改驱动程序和内核, 以接受来自 ACPI 子系统的信息。 对于 &os;, &intel; 提供了一个解释器 (ACPI-CA), 它在 Linux 和 NetBSD 也可以使用。 ACPI-CA 源代码可以在 src/sys/contrib/dev/acpica 找到。 用于在 &os; 中允许 ACPI-CA 正确运转的代码则在 src/sys/dev/acpica/Osd。 最后, 用于实现 ACPI 设备的驱动可以在 src/sys/dev/acpica 找到。 常见问题 ACPI problems 要让 ACPI 正常工作, 它的每一部分都必须工作正常。 下面是一些常见的问题, 按照出新的频繁程度排序, 并给出了一些绕过或修正它们的方法。 鼠标问题 某些时候, 唤醒操作会导致鼠标不再正常工作。 已知的绕过这一问题的方法, 是在 /boot/loader.conf 文件中添加 hint.psm.0.flags="0x3000" 设置。 如果这样做不能解决问题, 请考虑按前面介绍的方法提交问题报告。 休眠/唤醒 ACPI 提供了三种休眠到 RAM (STR) 的状态, S1-S3, 以及一个休眠到磁盘的状态 (STD), 称作 S4S5软关机 同时也是系统接好电源但没有开机时的正常状态。 S4 实际上可以用两种不同的方法来实现。 S4BIOS 是一种由 BIOS 辅助的挂起到磁盘方法, 而 S4OS 则是完全由操作系统实现的。 可以使用 sysctl hw.acpi 来查看与休眠有关的项目。 这里是我的 Thinkpad 上得到的结果。 hw.acpi.supported_sleep_state: S3 S4 S5 hw.acpi.s4bios: 0 这表示我可以使用 acpiconf -s 来测试 S3S4OS, 以及 S5。 如果 是一 (1), 则可以使用 S4BIOS 来代替 S4 OS 当测试休眠/唤醒时, 从 S1 开始, 如果它被支持的话。 这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。 没有人实现 S2 但如果您有它的支持, 则应该和 S1 类似。 下一件值得尝试的是 S3。 这是最深的 STR 状态, 并需要一系列驱动的支持才能够正常地重新初始化您的硬件。 如果您在唤醒系统时遇到问题, 请不要吝惜发邮件给 &a.acpi.name; 邮件列表, 尽管不要指望问题一定会很快解决, 因为有许多驱动程序/硬件需要进行更多的测试和改进。 为了帮助隔离问题, 请在内核中删去尽可能多的驱动。 如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。 通常预编译的驱动程序如 nvidia.ko、 X11 显示驱动, 以及 USB 的问题最多, 而以太网卡的驱动则通常工作的很好。 如果您能够通过加载和卸载驱动使系统正常工作, 您可以通过将适当的命令放到 /etc/rc.suspend/etc/rc.resume 来将这个过程自动化。 在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。 另外您还可以将 设置为零 (0), 如果您的显示在唤醒之后显得很混乱。 此外您还可以尝试更长或更短的 值看看是否有所助益。 另一件值得一试的事情是使用一个比较新的包含 ACPI 支持的 Linux 发行版来试试看他们的 休眠/唤醒 功能是否在同样的硬件上能够正常工作。 如果在 Linux 下正常, 则很可能是 &os; 驱动程序的问题, 而隔离问题并找到存在问题的驱动有助于解决它。 需要注意的是 ACPI 的维护人员通常并不维护其他驱动 (例如 声音、 ATA, 等等) 因此如果最终发现是驱动的问题最好还是发到 &a.current.name; 邮件列表并发给驱动程序的维护者。 如果您喜欢冒险, 则可以加一些 &man.printf.3; 到有问题的驱动中, 以找到它的恢复功能发生问题的位置。 最后, 试试看禁用 ACPI 并代之以启用 APM。 如果 休眠/唤醒 能够在 APM 下正常工作, 使用 APM 可能会更好, 特别是对于较老的硬件 (2000年以前)。 硬件制造商需要一些时间来让老硬件的 ACPI 工作正常, 而 ACPI 的问题十之八九是 BIOS 中的毛病引发的。 系统停止响应 (暂时或永久性地) 中断风暴 绝大多数系统停止响应是由于未能及时响应中断或发生了中断风暴导致的。 芯片组有很多问题最终会溯源到 BIOS 如何在引导系统之前配置中断, APIC (MADT) 表的正确性, 以及 系统控制中断 (SCI) 如何路由。 通过察看 vmstat -i 的输出中包括 acpi0 的那一行可以区分中断风暴和未能及时响应中断。 如果每秒计数器增长的速度多于一两个, 则您是遇到了中断风暴。 如果系统停止了响应, 您可以尝试停止内核并进入 DDB (在控制台上按 CTRL ALTESC) 并输入 show interrupts APIC 禁用 处理中断问题的救命稻草是尝试禁用 APIC 支持, 这是通过在 loader.conf 中加入 hint.apic.0.disabled="1" 完成的。 崩溃 崩溃对于 ACPI 是比较罕见的情况, 如果发现, 我们将会非常重视并很快修复它。 您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话) 的操作并获取一份调用堆栈。 请启用 并设置串行控制台 (参见 ) 或配置一个 &man.dump.8; 分区。 您将在 DDB 中通过 得到调用堆栈。 如果您只能用手抄的方法记录它, 一定要记下头五 (5) 行和最后五 (5) 行。 然后, 尝试通过在启动时禁用 ACPI 来隔离故障。 如果这样做能够正常工作, 请通过设置 的那组数值来隔离具体是哪个 ACPI 子系统的问题。 请参见 &man.acpi.4; 联机手册中给出的那些例子。 系统在休眠或关机之后又启动了 首先请尝试在 &man.loader.conf.5; 中设置 0。 这将让 ACPI 不再在关机过程中禁用一些事件。 基于同样的原因, 一些系统需要把这个值设置为 1 (这是默认值)。 这通常能够修复在休眠或关机时立即再次启动的问题。 其他问题 如果您有 ACPI 的其他问题 (同 docking station 协同工作、 无法检测设备, 等等), 请把描述发给邮件列表; 不过, 这些问题也有可能和 ACPI 中尚未完成的部分有关, 它们可能需要时间才能被实现。 请给点耐心, 并准备测试我们可能会发给您的补丁。 <acronym>ASL</acronym>、<command>acpidump</command>, 以及 <acronym>IASL</acronym> ACPI ASL 最常见的问题是 BIOS 制造商提供的不正确 (甚至完全错误的!) 字节代码。 这通常会以类似下面这样的内核消息显示在控制台上: ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\ (Node 0xc3f6d160), AE_NOT_FOUND 许多时候, 您可以通过将 BIOS 升级到最新版本来解决此类问题。 绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常, 则从 AML 开始查找问题将是一条捷径。 字节代码, 或常说的 AML, 是从一种叫做 ASL 的语言写成的源代码进行编译得到的结果。 AML 一般存放在 DSDT 表中。 要得到您系统的 ASL, 需要使用 &man.acpidump.8;。 需要同时指定 (显示固定标的内容) 和 (将 AML 反编译成 ASL) 两个选项。 请参见 如何提交调试信息 一节了解如何使用它。 最方便的初步检查是尝试重新编译 ASL 来看看是否有错误。 通常可以忽略这一过程中产生的警告, 但错误一般就都是 bug, 它们通常就是导致 ACPI 无法正常工作的原因。 要重新编译您的 ASL, 可以使用下面的命令: &prompt.root; iasl your.asl 修复 <acronym>ASL</acronym> ACPI ASL 我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用 ACPI。 然而, 目前我们仍然在开发绕过 BIOS 制造商常见错误的方法。 µsoft; 解释器 (acpi.sysacpiec.sys) 并不会严格地检查是否遵守了标准, 因此许多只在 &windows; 中测试 ACPIBIOS 制造商很可能永远不会修正他们的 ASL。 我们希望不断地找出并用文档说明 µsoft; 的解释器到底允许那些不标准的行为, 并在 &os; 进行对应的修改使它能够正常工作而不需要用户修正 ASL。 作为一项临时缓解问题的方法, 并帮助我们确认其行为, 您可以手工修正 ASL。 如果这样能够解决问题, 请把新旧 ASL 的 &man.diff.1; 发给我们, 这样我们就有可能绕过 ACPI-CA 中的错误行为, 从而不再需要您来手工修正。 ACPI error messages 下面是一些常见的错误信息, 它们的原因, 以及如何修正。 _OS dependencies (_OS 依赖) 某些 AML 假定世界是由不同版本的 &windows; 组成的。 您可以让 &os; 声称自己是任意 OS 来看一看是否能够修正问题。 比较简单的办法是设置 ="Windows 2001" 到 /boot/loader.conf 中, 或使用您在 ASL 中找到的其他字符串。 Missing Return statements (缺少返回语句) 一些方法可能没按照标准要求的那样显式地返回值。 尽管 ACPI-CA 无法处理它, 但 &os; 提供了一个绕过它并允许其暗含地返回值的方法。 您也可以增加一个显式的 Return 语句, 如果您知道那里需要返回一个值的话。 要强制 iasl 编译 ASL, 需要使用 标志。 替换默认的 <acronym>AML</acronym> 在定制 your.asl 之后, 您可以通过下面的命令编译它: &prompt.root; iasl your.asl 可以使用 标志来强制创建 AML, 即使在编译过程中发生了错误。 请注意某些错误 (例如, 缺少 Return 语句) 会自动被解释器忽略掉。 DSDT.amliasl 命令的默认输出文件名。 可以加载它来取代您 BIOS 中存在问题的副本 (它仍然存在于闪存中), 其方法是按下面的说明编辑 /boot/loader.conf acpi_dsdt_load="YES" acpi_dsdt_name="/boot/DSDT.aml" 一定要把您的 DSDT.aml 复制到 /boot 目录中。 从 <acronym>ACPI</acronym> 中获取调试输出信息 ACPI 问题 ACPI 调试 ACPI 驱动程序提供了非常灵活的调试机制。 这允许您指定一组子系统, 以及所需要的详细信息。 需要调试的子系统可以按 layers(层) 来指定, 并分为 ACPI-CA 组件 (ACPI_ALL_COMPONENTS) 和 ACPI 硬件支持 (ACPI_ALL_DRIVERS)。 调试输出的详细程度可以通过 level(详细度) 来指定, 其范围是 ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。 level 是一个位掩码因此可以一次设置多个选项, 中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出, 如果它太长以至于冲掉了控制台消息缓冲的话。 不同的层和输出详细度的完整列表可以在 &man.acpi.4; 联机手册中找到。 调试输出默认并不开启。 要起用它, 您需要在内核设置中添加 options ACPI_DEBUG, 如果您的内核中编入了 ACPI 的话。 您还可以在 /etc/make.conf 中加入 ACPI_DEBUG=1 来在全局起用它。 如果它只是模块, 您可以用下面的方法来重新编译 acpi.ko &prompt.root; cd /sys/modules/acpi/acpi && make clean && make ACPI_DEBUG=1 安装 acpi.ko/boot/kernel and add your 并把所需的详细度和层在 loader.conf 中指定。 这个例子将启用所有 ACPI-CA 组件以及所有 ACPI 硬件驱动 (CPULID, 等等) 的消息。 只输出错误信息, 也就是最低的详细度。 debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS" debug.acpi.level="ACPI_LV_ERROR" 如果您需要的信息是由某个特定的事件触发的 (比如说, 休眠之后的唤醒), 您可以不修改 loader.conf 而转而使用 sysctl 来在启动和为那个事件准备系统之后再指定层和详细度。 这些 sysctl 的名字和 loader.conf 中的一致。 参考文献 关于 ACPI 的更多信息可以从下面这些地方找到: The &a.acpi; ACPI 邮件列表存档 旧的 ACPI 邮件列表存档 The ACPI 2.0 标准 &os; 手册页: &man.acpi.4;, &man.acpi.thermal.4;, &man.acpidump.8;, &man.iasl.8;, &man.acpidb.8; DSDT 调试资源. (使用 Compaq 作为例子但通常情况下都很有用。) diff --git a/zh_CN.GB2312/books/handbook/desktop/chapter.sgml b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml index 65746b4fb1..f6b1527f18 100644 --- a/zh_CN.GB2312/books/handbook/desktop/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml @@ -1,1059 +1,1040 @@ Christophe Juniet Contributed by 桌面应用 概述 FreeBSD 可以运行种类繁多的桌面应用程序, 这包括像浏览器和字处理这样的软件。 绝大多数这样的程序都可以通过 package 来安装, 或者从 Ports Collection 自动地构建。 许多新用户希望能够在它们的系统中找到这样的应用程序。 这一章将向您展示如何轻松地使用 package 或者 Ports Collection 中安装这样的软件。 需要注意的是从 ports 安装意味着要编译源码。 根据编译的 ports 和电脑速度的不同, 这可能需要花费相当长的时间。 若是您觉得编译源码太过耗时的话, 绝大多数 ports 也有预编译的版本可供安装。 因为 FreeBSD 提供的二进制兼容 Linux 的特性, 许多原本为 Linux 开发的程序都可以直接用在您的桌面。 在安装任何的 Linux 应用程序之前, 强烈的推荐您阅读 。 当您在寻找特定的 ports 时, 可以使用 &man.whereis.1;。 一般来说, 许多利用 Linux 二进制兼容特性的 ports 都以linux-开头。 在下面的介绍中,都假设安装 Linux 应用程序前已经开启了 Linux 二进制兼容功能。 本章涵盖以下种类应用程序: 浏览器 (例如 MozillaOperaFirefoxKonqueror) 办公、图象处理 (例如 KOfficeAbiWordGIMPOpenOffice.org) 文档查看 (例如 &acrobat.reader;gvXpdfGQview) 财务 (例如 GnuCashGnumericAbacus) 阅读这章之前,您应该: 知道如何安装额外的第三方软件()。 知道如何安装 Linux 软件()。 想要获得更多的有关多媒体环境的信息,请阅读 。如果您想要建立和使用电子邮件, 请参考 浏览器 浏览器 web FreeBSD并没有预先安装特定的浏览器。然而,在 ports 的目录 www 有许多浏览器可以安装。如果您没有时间一一编译它们 (有些时候这可能需要花费相当长的时间) 大部分都有 package 可用。 KDEGNOME 已经提供 HTML 浏览器。 请参考得到更多完整的有关设定这些桌面环境的信息。 如果您要找小型的浏览器, 可以试试看 www/dillowww/linkswww/w3m 这一节涉及如下程序: 程序名称 资源需求 安装时间 主要依赖 Mozilla 大量时间和空间 Gtk+ Opera 轻松 同时有可用的 FreeBSD 和 Linux 版本。 Linux 版本需要使用 Linux 二进制兼容模块和 linux-openmotif Firefox 中等 Gtk+ Konqueror 中等 需要 KDE Mozilla Mozilla Mozilla 是一个完全移植到 FreeBSD 上的现代化的、 稳定的浏览器。 它拥有非常合乎标准的 HTML 支持, 它也能处理邮件和阅读新闻组。 假如您打算做一个自己的主页的话,它甚至提供一个 HTML 编辑器。 &netscape; 的使用者可能觉得它和 Communicator 非常相似, 两者有些部分实际上是相通的。 在 CPU 速度低于 233MHz 或者内存少于 64MB 的老式电脑上,Mozilla 会占用相当多资源而难以使用。您也许可以试试 Opera 浏览器,本章稍后将会介绍它。 也许基于某种原因,您不能或者不想编译 Mozilla,FreeBSD GNOME 团队已经为您制作好了 package。只需要通过网络安装它: &prompt.root; pkg_add -r mozilla 如果没 package 可用,而您又有足够的时间和磁盘空间,您可以获取 Mozilla 的源码来编译并安装它到您的系统上。 执行以下指令既可: &prompt.root; cd /usr/ports/www/mozilla &prompt.root; make install clean Mozilla 需要 root 权限执行 chrom 注册来确定正确的初始化。另外, 如果您想要一些额外的插件比如象 mouse gestures,您也必须以 root 权限执行 Mozilla 以便正确的安装。 一旦您完成了 Mozilla 安装,您就再也不需要 root 权限了。您可以用如下方式执行 Mozilla &prompt.user; mozilla 也可以用如下方式直接运行电子邮件和新闻阅读器: &prompt.user; mozilla -mail Firefox Firefox Firefox 是基于 Mozilla 代码系的下一代浏览器。 Mozilla 是一个完整的应用程序套件, 包含了浏览器、 邮件客户端、 聊天客户端等等。 而 Firefox 则只是一个浏览器, 这使得它体积更小并且执行速度更快。 您可以通过输入下面的命令来安装预编译的包: &prompt.root; pkg_add -r firefox 如果您喜欢从源代码编译, 则可以使用 Ports 套件来完成这项工作: &prompt.root; cd /usr/ports/www/firefox &prompt.root; make install clean Firefox、 Mozilla 与 &java; 插件 在这一节和下一节中, 我们均假定您已经安装了 FirefoxMozilla &os; 基金会拥有来自 Sun Microsystems 的关于发布针对 &os; 的预编译版本的 Java 运行环境 (&jre;) 和 Java 开发包 (&jdk;) 的授权。 用于 &os; 的预编译版本可以在 &os; 基金会 网站上找到。 要为 FirefoxMozilla 添加 &java; 支持, 您必须首先安装 java/javavmwrapper port。 接下来, 从 下载 Diablo &jre; 软件包, 并使用 &man.pkg.add.1; 来安装它。 启动浏览器, 并在地址栏中输入 about:plugins 然后按 Enter。 浏览器将给出一个页面, 其中会显示已经安装的插件, 您应在这个列表中找到 &java; 插件。 如果不是这样的话, 则需要以 root 身份执行下列命令: &prompt.root; ln -s /usr/local/diablo-jre1.5.0/plugin/i386/ns7/libjavaplugin_oji.so \ /usr/local/lib/browser_plugins/ 然后重新启动浏览器。 Firefox、 Mozilla 与 ¯omedia; &flash; 插件 ¯omedia; &flash; 插件并没有直接提供其 &os; 版本。 不过, 我们有一个软件层 (wrapper) 可以用来运行 Linux 版本的插件。 这个 wrapper 也支持 &adobe; &acrobat;、 RealPlayer 和很多其他插件。 - 应安装 www/linuxpluginwrapper - port, 这个 port 需要依赖一个很大的 port, - emulators/linux_base。 - 请按照 port 在安装过程中所给出的提示对您的 - /etc/libmap.conf 进行正确的配置! - 示范的配置可以在 - /usr/local/share/examples/linuxpluginwrapper/ - 目录找到。 + 应安装 www/nspluginwrapper + port, 这个 port 需要依赖一个很大的 port + emulators/linux_base 下一步是安装 www/linux-flashplugin7 port。 - 一旦装好了这个插件, 就可以打开浏览器, 并在地址栏中输入 - about:plugins 然后按下 - Enter。 这将显示目前可用的插件列表。 - - 如果您没有在这个列表中看到 &flash; 插件, - 则多数情况下这是由于缺少一个符号链接导致的。 - 您需要以 root, - 身份执行下面的命令: - - &prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/libflashplayer.so \ - /usr/local/lib/browser_plugins/ -&prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/flashplayer.xpt \ - /usr/local/lib/browser_plugins/ + 一旦装好了这个插件,需要用户运行一下 + nspluginwrapper 命令: - 重新启动浏览器之后, - 插件就应该会在前面提到的那个列表中有所体现了。 - - - linuxpluginwrapper 只能在 - &i386; 架构上运行。 - + &prompt.user; nspluginwrapper -v -a -i + 然后就可以打开浏览器, 并在地址栏中输入 + about:plugins 然后按下 + Enter。 这将显示目前可用的插件列表。 Opera Opera Opera 是一个功能齐全, 并符合标准的浏览器。 它还提供了内建的邮件和新闻阅读器、 IRC 客户端, RSS/Atom feed 阅读器以及更多功能。 除此之外, Opera 是一个比较轻量的浏览器, 其速度很快。 它提供了两种不同的版本: native FreeBSD 版本, 以及通过 Linux 模拟运行的版本。 要使用 Opera 的 FreeBSD 版本来浏览网页,安装以下的 package: &prompt.root; pkg_add -r opera 有些 FTP 站点没有所有版本的 package, 但仍然可以通过 Ports 套件来安装 Opera &prompt.root; cd /usr/ports/www/opera &prompt.root; make install clean 要安装 Linux 版本的 Opera,将上面例子中的 opera 替换为 linux-opera。Linux 版本在某些情况下非常有用,象是使用只有 Linux 版本的插件,例如 Adobe &acrobat.reader;。就其它方面来说, FreeBSD 和 Linux 版本的功能是完全一样的。 Konqueror Konqueror KonquerorKDE 的一部分,不过也可以通过安装 x11/kdebase3 在非 KDE 环境下使用。 Konqueror 不止是一个浏览器, 也是一个文件管理器和多媒体播放器。 也有种类丰富的插件能够配合 Konqueror 一起使用, 您可以通过 misc/konq-plugins 来安装它们。 Konqueror 也支持 &flash;; 关于如何获得用于 Konqueror&flash; 支持的 How To 文档 可以在 找到。 办公、图象处理 当需要进行办公或者进行图象处理时, 新用户通常都会找一些好用的办公套件或者字处理软件。 尽管目前有一些 桌面环境, 如 KDE 已经提供了办公套件, 但目前这还没有一定之规。 无论您使用那种桌面环境, FreeBSD 都能提供您需要的软件。 这节涉及如下程序: 软件名称 资源需求 安装时间 主要依赖 KOffice KDE AbiWord Gtk+GNOME The Gimp Gtk+ OpenOffice.org &jdk; 1.4Mozilla KOffice KOffice 办公套件 KOffice KDE 社区提供了一套办公套件, 它能用在桌面环境。它包含四个标准的组件,这些组件可以在其它办公套件中找到。 KWord 是字处理程序、 KSpread 是电子表格程序、 KPresenter 是演示文档制作管理程序、 Kontour是矢量绘图软件。 安装最新的 KOffice 之前,先确定您是否安装了最新版的 KDE 使用 package 来安装 KOffice,安装细节如下: &prompt.root; pkg_add -r koffice 如果没有可用的 package,您可以使用 Ports Collection 安装。 安装 KDE3KOffice 版本,如下: &prompt.root; cd /usr/ports/editors/koffice-kde3 &prompt.root; make install clean AbiWord AbiWord AbiWord 是一个免费的字处理程序,它看起来和 µsoft; Word 的感觉很相似。 它适合用来打印文件、信函、报告、备忘录等等, 它非常快且包含许多特性,并且非常容易使用。 AbiWord 可以导入或输出很多文件格式, 包括一些象 µsoft; .doc 这类专有格式的文件。 AbiWord 也有 package 的安装方式。您可以用以下方法安装: &prompt.root; pkg_add -r abiword 如果没有可用的 package,它也可以从 Ports Collection 编译。ports collection 应该是最新的。它的安装方式如下: &prompt.root; cd /usr/ports/editors/abiword &prompt.root; make install clean GIMP GIMP 对图象的编辑或者加工, GIMP 是一个非常精通图象处理的软件。 它可以被用来当作简单的绘图程序或者一个专业的照片处理套件。 它支持大量的插件和具有脚本界面的特性。 GIMP 可以读写众多的文件格式, 支持扫描仪和手写板。 您可以用下列命令安装: &prompt.root; pkg_add -r gimp 如果您在 FTP 站点没有找到这个 package,您也可以使用 Ports Collection 的方法安装。ports 的 graphics 目录也包含有 Gimp 手册。 以下是安装它们的方法: &prompt.root; cd /usr/ports/graphics/gimp &prompt.root; make install clean &prompt.root; cd /usr/ports/graphics/gimp-manual-pdf &prompt.root; make install clean Ports 中的 graphics 目录也有开发中的 GIMP 版本 graphics/gimp-devel。 HTML 版本的 Gimp 手册 可以在 graphics/gimp-manual-html 找到。 OpenOffice.org OpenOffice.org 办公套件 OpenOffice.org OpenOffice.org 包括一套完整的办公套件: 字处理程序、 电子表格程序、 演示文档管理程序和绘图程序。 它和其它的办公套件的特征非常相似,它可以导入输出不同的流行的文件格式。 它支持许多种语言 — 国际化已经渗透到了其界面、 拼写检查和字典等各个层面。 OpenOffice.org 的字处理程序使用 XML 文件格式使它增加了可移植性和灵活性。 电子表格程序支持宏语言和使用外来的数据库界面。 OpenOffice.org 已经可以平稳的运行在 &windows;、&solaris;、Linux、FreeBSD 和 &macos; X 等各种操作系统下。 更多的有关 OpenOffice.org 的信息可以在 OpenOffice.org 网页 找到。 对于特定的 FreeBSD 版本的信息,您可以在直接在 FreeBSD OpenOffice 移植团队的页面下载。 安装 OpenOffice.org 方法如下: &prompt.root; pkg_add -r openoffice.org 如果您正在使用 &os; 的 -RELEASE 版本, 一般来说这样做是没问题的。 如果不是这样, 您就可能需要看一看 &os; OpenOffice.org 移植小组的网站, 并使用 &man.pkg.add.1; 从那里下载并安装合适的软件包。 最新的发布版本和开发版本都可以在那里找到。 装好 package 之后, 您只需输入下面的命令就能运行 OpenOffice.org 了: &prompt.user; openoffice.org 在第一次运行时, 将询问您一些问题, 并在您的主目录中建立一个 .openoffice.org2 目录。 如果没有可用的 OpenOffice.org package,您仍旧可以选择编译 port。然而, 您必须记住它的要求以及大量的磁盘空间和相当长的时间编译。 &prompt.root; cd /usr/ports/editors/openoffice.org-2 &prompt.root; make install clean 如果希望联编一套进行过本地化的版本, 将前述命令行改为: &prompt.root; make LOCALIZED_LANG=your_language install clean 您需要将 your_language 改为正确的 ISO-代码。 所支持的语言代码可以在 files/Makefile.localized 文件中找到, 这个文件位于 port 的目录。 一旦完成上述操作, 就可以通过下面的命令来运行 OpenOffice.org 了: &prompt.user; openoffice.org 文档查看器 &unix; 系统出现以来, 一些新的文档格式开始流行起来; 它们所需要的标准查看器可能不一定在系统内。 本节中, 我们将了解如何安装它们。 这节涵盖如下应用程序: 软件名称 资源需求 安装时间 主要依赖 &acrobat.reader; Linux二进制兼容 gv Xaw3d Xpdf FreeType GQview Gtk+GNOME &acrobat.reader; Acrobat Reader PDF 查看器 现在许多文档都用 PDF 格式, 根据轻便小巧文档格式的定义。一个被建议使用的查看器是 &acrobat.reader;,由 Adobe 所发行的 Linux 版本。因为 FreeBSD 能够运行 Linux 二进制文件, 所以它也可以用在 FreeBSD 中。 要从 Ports collection 安装 &acrobat.reader; 7, 只需: &prompt.root; cd /usr/ports/print/acroread7 &prompt.root; make install clean 由于授权的限制, 我们不提供预编译的版本。 gv gv PDF 查看器 PostScript 查看器 gv 是 &postscript; 和 PDF 文件格式查看器。它源自 ghostview 因为使用 Xaw3d 函数库让它看起来更美观。 它很快而且界面很干净。gv 有很多特性比如象纸张大小、刻度或者抗锯齿。 大部分操作都可以只用键盘或鼠标完成。 安装 gv package,如下: &prompt.root; pkg_add -r gv 如果您无法获取预编译的包, 则可以使用 Ports collection: &prompt.root; cd /usr/ports/print/gv &prompt.root; make install clean Xpdf Xpdf PDF 查看器 如果您想要一个小型的 FreeBSD PDF 查看器, Xpdf 是一个小巧并且高效的查看器。 它只需要很少的资源而且非常稳定。它使用标准的 X 字体并且不需要 &motif; 或者其它的 X 工具包。 安装 Xpdf package,使用如下命令: &prompt.root; pkg_add -r xpdf 如果 package 不可用或者您宁愿使用 Ports Collection,如下: &prompt.root; cd /usr/ports/graphics/xpdf &prompt.root; make install clean 一旦安装完成,您就可以启动 Xpdf 并且使用鼠标右键来使用菜单。 GQview GQview GQview 是一个图片管理器。 您可以单击鼠标来观看一个文件、开启一个外部编辑器、 使用预览和更多的功能。它也有幻灯片播放模式和一些基本的文件操作。 您可以管理采集的图片并且很容易找到重复的。 GQview 可以全屏幕观看并且支持国际化。 如果您想要安装 GQview package,如下: &prompt.root; pkg_add -r gqview 如果您没有可用的 package 或者您宁愿使用 Ports Collection,如下: &prompt.root; cd /usr/ports/graphics/gqview &prompt.root; make install clean 财务 假如,基于任何的理由,您想要在 FreeBSD Desktop 管理您个人的财政,有一些强大并且易于使用的软件可以被您选择安装。 它们中的一些与流行的文件格式兼容象 QuickenExcel 文件。 本节涵盖如下程序: 软件名称 资源需求 安装时间 主要依赖 GnuCash GNOME Gnumeric GNOME Abacus Tcl/Tk KMyMoney KDE GnuCash GnuCash GnuCashGNOME 的一部分,GNOME 致力于为最终用户提供用户友好且功能强大的软件。使用 GnuCash,您可以关注您的收入和开支、您的银行帐户, 或者您的股票。它的界面特性看起来非常的专业。 GnuCash 提供一个智能化的注册、帐户分级系统、 很多键盘快捷方式和自动完成方式。它能分开一个单个的处理到几个详细的部分。 GnuCash 能导入和合并 Quicken QIF 文件格式。 它也支持大部分的国际日期和流行的格式。 在您的系统中安装 GnuCash 所需的命令如下: &prompt.root; pkg_add -r gnucash 如果 package 不可用,您可以使用 Ports Collection 安装: &prompt.root; cd /usr/ports/finance/gnucash &prompt.root; make install clean Gnumeric Gnumeric 电子表格 Gnumeric Gnumeric 是一个电子表格程序, GNOME 桌面环境的一部分。 它以通过元素格式和许多片断的自动填充系统来方便的自动猜测用户输入而著称。 它能导入一些流行的文件格式,比如象 ExcelLotus 1-2-3Quattro ProGnumeric 凭借 math/guppi 支持图表。 它有大量的嵌入函数和允许所有通常比如象、数字、货币、日期、 时间等等的一些单元格式。 以 package 方式安装 Gnumeric 的方法如下: &prompt.root; pkg_add -r gnumeric 如果 package 不可用,您可以使用 Ports Collection 安装: &prompt.root; cd /usr/ports/math/gnumeric &prompt.root; make install clean Abacus Abacus spreadsheet Abacus Abacus 是一个小巧易用的电子表格程序。 它包含许多嵌入函数在一些领域如统计学、财务和数学方面很有帮助。 它能导入和输出 Excel 文件格式。 Abacus 可以产生 &postscript; 输出。 以 package 的方式安装 Abacus 的方法如下: &prompt.root; pkg_add -r abacus 如果 package 不可用,您可以使用 Ports Collection 安装: &prompt.root; cd /usr/ports/deskutils/abacus &prompt.root; make install clean KMyMoney KMyMoney spreadsheet KMyMoney KMyMoney 是一个 KDE环境下的个人财务管理软件。 KMyMoney 旨在提供并融合各种商业财务管理软件所有的重要特性。 它也同样注重易用性和特有的复式记帐功能。 KMyMoney 能从标准的 Quicken Interchange Format (QIF) 文件导入数据, 追踪投资,处理多种货币并能提供一个财务报告。 另有可用的插件支持导入 OFX 格式的数据。 以 package 的方式安装 KMyMoney 的方法如下: &prompt.root; pkg_add -r kmymoney2 如果 package 不可用,您可以使用 Ports Collection 安装: &prompt.root; cd /usr/ports/finance/kmymoney2 &prompt.root; make install clean 总结 尽管 FreeBSD 由于其高性能和可靠性而获得了许多 ISP 的信赖, 但它也完全可以用于桌面环境。 拥有数以千计的 packagesports 能够帮您迅速建立完美的桌面环境。 下面是本章涉及到的所有的软件的简要回顾: 软件名称 Package 名称 Ports 名称 Mozilla mozilla www/mozilla Opera opera www/opera Firefox firefox www/firefox KOffice koffice-kde3 editors/koffice-kde3 AbiWord abiword editors/abiword The GIMP gimp graphics/gimp OpenOffice.org openoffice editors/openoffice-1.1 &acrobat.reader; acroread print/acroread7 gv gv print/gv Xpdf xpdf graphics/xpdf GQview gqview graphics/gqview GnuCash gnucash finance/gnucash Gnumeric gnumeric math/gnumeric Abacus abacus deskutils/abacus diff --git a/zh_CN.GB2312/books/handbook/eresources/chapter.sgml b/zh_CN.GB2312/books/handbook/eresources/chapter.sgml index c7e5005d32..2381e4515e 100644 --- a/zh_CN.GB2312/books/handbook/eresources/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/eresources/chapter.sgml @@ -1,1610 +1,1648 @@ Internet上的资源 发展迅猛的FreeBSD使得现有的印刷、平面媒体跟不上它的发展进度! 而电子版的也许是最好的,通常是唯一一个可以跟上最新发展方向的。FreeBSD来自于志愿者的成果, 用户社区通常也扮演着是“技术支持部门”的角色。通过电子邮件和USENET新闻组可以很快的找到他们。 以下列出了尽量多的联系FreeBSD用户社区的方式。如果您发现有其他的资源没有被包括在这儿, 请告诉&a.doc;,以便将它们加入到这里。 邮件列表 虽然大部分的FreeBSD开发人员都会阅读USENET, 如果您只将问题发表在 comp.unix.bsd.freebsd.* 其中之一的讨论组上, 我们也不能保证我们永远可以及时了解您的问题。如果您将问题发到适当的邮件列表上, 您不但可以同时让FreeBSD研发人员和其他的读者看到, 通常也可以得到一个较好的(至少会比较快)的回应。 本文的最后给出了各个不同的邮件列表的使用规则。 在订阅其中任何一个列表之前,请先阅读使用条文。 现在订阅这些邮件列表的人每天都会收到上百封关于FreeBSD的信件。 设立列表的使用条文有助于维护讨论质量。否则这些讨论计划的列表将失去其意义。 如果你想要尝试发送一封邮件到 &os; 邮件列表,你可以把邮件发往 &a.test.name;。 请不要往其他的列表发送测试邮件。 如果不知道哪个邮件列表适合于发送您的问题, 请参见 如何从 FreeBSD-questions 邮件列表中更快地得到答案 在列表中发送任何问题之前, 请首先学习使用邮件列表的最佳方式, 例如如何通过阅读 邮件列表常见问题回答集 (FAQ) 文档, 来避免经常重复的讨论。 全部的邮件列表记录都可以在FreeBSD World Wide Web服务器上找到。此服务器提供了很棒的关键词搜寻功能,可让您找到FAQ的解答。 而在邮件列表上提问之前,请先搜寻是否已有答案。 列表摘要 一般性的列表: 以下的列表都是一般性的, 而且可以自由地加入,鼓励大家加入他们: 目录 用途 &a.cvsall.name; FreeBSD源代码的变动 &a.advocacy.name; FreeBSD鼓吹者 &a.announce.name; 重要的事件和里程碑 &a.arch.name; 架构和设计的讨论 &a.bugbusters.name; 与FreeBSD问题报告数据库和有关工具维护相关的讨论 &a.bugs.name; 报告FreeBSD的Bug &a.chat.name; 和技术无关的FreeBSD讨论区 &a.current.name; 讨论使用 &os.current; 有关的一些问题 &a.isp.name; ISP使用FreeBSD的讨论 &a.jobs.name; 与FreeBSD有关的工作机会 &a.policy.name; FreeBSD核心团队方针讨论。低流量并且只读的 &a.questions.name; 用户问题和技术支持 &a.security-notifications.name; 安全通知 &a.stable.name; 讨论使用 &os.stable; 有关的一些问题 &a.test.name; 在真正发送一个邮件到邮件列表之前可以先发送到这里测试 技术性的邮件列表: 以下的邮件列表是用来讨论技术性问题的。 在加入订阅及讨论之前请务必认真阅读每个列表主题,因为他们讨论的内容都是严格地被限制着的。 目录 用途 &a.acpi.name; ACPI 和电源管理的开发 &a.afs.name; 将 AFS 移植到 FreeBSD &a.aic7xxx.name; 为 &adaptec; AIC 7xxx 开发驱动 &a.alpha.name; 将 FreeBSD 移植到 Alpha 工作站 &a.amd64.name; 将 FreeBSD 移植到 AMD64 系统 &a.apache.name; 关于与 Apache 有关的 ports 的讨论 &a.arm.name; 将 FreeBSD 移植到 &arm; 处理器 &a.atm.name; 在 FreeBSD 上使用 ATM 网络 &a.audit.name; 源代码审核 &a.binup.name; 二进制更新系统的设计和开发 &a.bluetooth.name; 在 FreeBSD 上使用 &bluetooth; 技术 &a.cluster.name; 在集群环境中使用 FreeBSD &a.cvsweb.name; CVSweb 维护 &a.database.name; 讨论 FreeBSD 下开发和使用数据库 &a.doc.name; 创建 FreeBSD 相关文档 &a.drivers.name; 为 &os; 撰写驱动 &a.eclipse.name; &os; 上的 Eclipse IDE、工具、 富客户应用, 以及 ports 的用户讨论。 &a.embedded.name; 在嵌入式应用中使用 FreeBSD &a.eol.name; 关于与 FreeBSD 有关, 但已不再为 FreeBSD Project 所维护的软件的互助支持。 &a.emulation.name; 在 FreeBSD 上模拟其它系统, 如 Linux/&ms-dos;/&windows; &a.firewire.name; FreeBSD 的 &firewire; (iLink, IEEE 1394) 技术讨论 &a.fs.name; 文件系统 &a.geom.name; 针对 GEOM 的讨论和实现 &a.gnome.name; 移植 GNOMEGNOME应用程序 &a.hackers.name; 一般性的技术讨论 &a.hardware.name; 一般性的支持 FreeBSD 的硬件的讨论 &a.i18n.name; FreeBSD 的国际化 &a.ia32.name; 在 IA-32 (&intel; x86) 平台上运行 FreeBSD &a.ia64.name; 将 FreeBSD 移植到 &intel; 即将推出的 IA64 系统 &a.ipfw.name; 关于 IP 防火墙代码再设计的技术性讨论 &a.isdn.name; ISDN开发人员 &a.jail.name; 关于 &man.jail.8; 机制的讨论 &a.java.name; &java; 开发人员以及移植 &jdk;s 到 FreeBSD 的人们 &a.kde.name; 移植 KDEKDE 应用程序 &a.lfs.name; 移植 LFS 到FreeBSD上 &a.libh.name; 第二代的安装和 package 系统 &a.mips.name; 移植 FreeBSD 到 &mips; &a.mobile.name; 关于便携式计算机的讨论 &a.mozilla.name; 移植 Mozilla 到 FreeBSD 上 &a.multimedia.name; 多媒体应用程序 &a.newbus.name; 技术讨论关于总线架构 &a.net.name; 网络子系统和 TCP/IP 源代码的讨论 &a.openoffice.name; 移植 OpenOffice.org&staroffice; 到 FreeBSD 上 &a.performance.name; 高性能、负载下安装后的性能调整问题 &a.perl.name; 许多与 perl 相关的 ports 的维护 &a.pf.name; 关于 packet filter 防火墙系统的讨论 &a.platforms.name; 关于向非 &intel; 架构的平台上移植的讨论 &a.ports.name; 关于 Ports Collection 的讨论 &a.ports-bugs.name; ports bugs/PRs讨论 &a.ppc.name; 移植 FreeBSD 到 &powerpc; &a.proliant.name; 关于 FreeBSD 在 HP ProLiant 服务器平台上的技术讨论 &a.python.name; FreeBSD 专属的 Python 问题 &a.qa.name; 质量保证(QA)讨论, 通常在未发布之前 &a.rc.name; 关于 rc.d 系统及其开发的讨论 &a.realtime.name; FreeBSD 实时扩展的开发 + + &a.ruby.name; + 关于 FreeBSD 上 Ruby 的讨论 + + &a.scsi.name; SCSI 子系统 &a.security.name; 系统安全 &a.small.name; 在嵌入式系统上使用 FreeBSD (已过时; 请使用 &a.embedded.name; 代替) &a.smp.name; 有关对称多处理器的设计讨论 &a.sparc.name; 移植 FreeBSD 到 &sparc; 系统 &a.standards.name; 让 FreeBSD 顺应 C99 以及 &posix; 标准 &a.sun4v.name; 将 FreeBSD 移植到基于 &ultrasparc; T1 的系统上 &a.threads.name; 线程 &a.testing.name; FreeBSD 性能和稳定性测试 &a.tokenring.name; 在 FreeBSD 中支持 Token Ring &a.usb.name; 关于 &os; 的 USB 支持的讨论 + + &a.virtualization.name; + 讨论各种 &os; 支持的虚拟化技术 + + &a.vuxml.name; 关于 VuXML 的问题讨论 &a.x11.name; 维护和支持在 FreeBSD 上运行的 X11 限制订阅的列表: 以下的列表是针对某些特定的读者而设的, 而且并不适合被当成是一般公开讨论区。您最好在某一技术讨论区参与讨论后再选择订阅这些 限制订阅的邮件列表,因为这样您可以了解到在这些讨论区发言所需要的礼仪。 目录 用途 &a.hubs.name; 运行镜象站点的成员(支持基本服务) &a.usergroups.name; 用户组调整 &a.vendors.name; 商家在发布之前的调整 &a.www.name; www.FreeBSD.org的维护 分类列表: 所有以上的列表在一个分类格式里面是可利用的。 一旦订阅了一个列表,您可以在您的账号选项里面设置您的分类选项。 CVS列表: 以下的邮件是给对FreeBSD源代码的变更记录有兴趣的人看的, 而且它们是只读的邮件列表,您不能发Email给他们。 列表 源位置 描述 &a.cvsall.name; /usr/(CVSROOT|doc|ports|projects|src) 所有对源代码的改变纪录 (其他 CVS commit 列表的超集) &a.cvs-doc.name; /usr/(doc|www) 所有对 doc 和 www 源代码的改变记录 &a.cvs-ports.name; /usr/ports 所有对 ports 源代码的改变记录 &a.cvs-projects.name; /usr/projects 所有对 projects 源代码的改变记录 &a.cvs-src.name; /usr/src 所有对 src 源代码的改变记录 如何订阅 订阅一个列表,点击上面的列表名字或到 &a.mailman.lists.link; 并点击进入您感兴趣的列表,这个列表的页面包含了所必需的订阅操作指南。 其实您只需发送邮件到 列表名@FreeBSD.org。 它将被再次转发到全世界的这个邮件列表的成员。 点击上面的 URL,在列表的底部可以从订阅的列表中退出。 也可以发送一个电子邮件到 列表名-unsubscribe@FreeBSD.org 来退订。 此外,我们要求您必须保持在技术性的邮件列表中只是讨论技术。 如果您只是对一些重要的公告感兴趣,建议您加入 &a.announce;, 它的通信量比较低。 列表规章 所有 FreeBSD 的邮件列表都有同样的基本规则, 所有人必须按照规则来做。 违反这些规则时, FreeBSD Postmaster postmaster@FreeBSD.org 会在前两次发送警告, 如果第三次违反, FreeBSD Postmaster 将从所有 FreeBSD 的邮件列表中删除这样的人, 并过滤来自发信人之后的所有邮件。 我们很遗憾必须要遵守这样的规则, 但今天的互联网是一个很混乱的环境, 它上面的很多约束机制, 都相当脆弱。 具体规则: 任何发表的主题都应当附合基本的列表概况。例如,如果列表是有关技术问题的, 那您发表的文章包含技术讨论。不要把不相关的讨论放在一起。 对于没有主题的自由形式的讨论,可以使用 FreeBSD-chat freebsd-chat@FreeBSD.org 不要将同一个问题发送到超过两个的邮件列表上,当有一个清晰和明显的必须要 发表到两个列表的要求时,也只能是两个。对于大多数的列表,已经有相当多的订户了, 除了一些比较深奥的问题(如-stable & -scsi) ,没有必要同时将一个问题发到多个列表上。 如果一个信息以这种方式(多个邮件列表在Cc行出现)被发送给您, 那Cc行在把它再发送出去之前也将被整理。 无论谁是最初发表者,都会导致您自己的交叉发送。 不容许进行人身攻击和亵渎(在前后的争论中),包括用户和开发人员。 应当遵守最起码的网络礼节,象需要征得同意才可以引用或张贴私人邮件等。 然而,也有非常少的情况下,这样的内容会符合列表规章, 因此,它会在最初给予警告(或禁止)。 严格的禁止非FreeBSD相关产品或服务的广告,一旦发现将马上取缔。 单独的列表规章: &a.acpi.name; ACPI和电源管理开发 &a.afs.name; Andrew文件系统 这个列表是用来讨论porting和从CMU/Transarc使用AFS。 &a.announce.name; 重要事件/里程碑 这是一个发布FreeBSD重大事件的邮件列表。这包括有关snapshots和其他版本的公告, 新的FreeBSD的性能的公告,还可以用于指派志愿者等等。这个列表比较小。 &a.arch.name; 架构和设计讨论 这个列表是讨论FreeBSD的架构。本质上应保证内容的纯技术性。例如主题是: 如何重新创建系统使其同时有几个自己构造的系统运行。 需要什么才能修复VFS来使Heidemann层工作。 我们怎么改变设备驱动程序接口以便能够在多种总线和体系结构上使用同样的驱动程序。 如何写一个网络驱动。 &a.audit.name; 源代码审核计划 这个是针对FreeBSD源代码审核计划的邮件列表, 虽然这最初是针对安全方面代码修正的讨论,现在它已经扩展到任何代码修正的讨论。 这个列表涉及补丁方面的问题比较多,可能普通的FreeBSD用户对此不感兴趣。 不与一个特定的代码修正相关的安全讨论将放在freebsd-security中。相反的, 所有的开发人员都被鼓励把他们的补丁发到这儿来, 特别是如果他们发现有一个错误可能会影响系统的完整性时。 &a.binup.name; FreeBSD二进制升级计划 这个列表主要是讨论二进制升级binup系统。 设计问题,执行细节,补丁,错误报告,状态报告,特性要求, 提交日志,和所有其他与 binup相关的东西都可以。 &a.bluetooth.name; FreeBSD 上的 &bluetooth; 这是一个 FreeBSD 的 &bluetooth; 用户聚集的讨论区。 这里欢迎关于设计问题、 实现细节、 补丁、 问题报告、 开发进度报告, 功能需求以及其他与 &bluetooth; 相关的讨论。 &a.bugbusters.name; 同等问题报告处理结果 这个列表的目的是作为一个调整和讨论论坛来服务于Bug列表的成员,Bugbuster列表成员 和其他任何的对PR数据库真正的有兴趣的成员。这个列表不是为了讨论关于Bug细节,补丁或PRs。 &a.bugs.name; Bug报告 这是一个报告FreeBSD的Bug的邮件列表。可以随时通过 &man.send-pr.1; 命令或WEB页面来提交Bug。 &a.chat.name; 与FreeBSD社区相关的非技术性项目 这个列表超出了其他有关非技术、社会信息的内容。 包括谈论Jordan看起来是否像一个机敏的侦探,是否句首的字母要大写, 谁喝了很多咖啡, 哪儿的啤酒酿造的最好,谁在他们的地下室里酿造了啤酒等等。对于偶然宣布重大的事件 (例如:将要举行的聚会,婚礼,生日,新工作等等)也能使用这种技术列表,除上述列举之外 任何事情都可以发布在-chat列表上。 &a.core.name; FreeBSD核心团队 这是一个只供核心成员内部使用的邮件列表,只有当一个与FreeBSD相关的严重的事情需要裁决或严格审核时, 才能发送消息到这个邮件列表。 &a.current.name; 关于使用&os.current;版的讨论 这是一个针对&os.current;用户的邮件列表。 它包括一些可能影响用户的新特性的警告,使用FreeBSD-current的一些指导。 任何运行CURRENT的人必须同意这个列表,这是一个纯技术的邮件列表。 &a.cvsweb.name; FreeBSD CVSweb计划 关于FreeBSD-CVSweb的使用,开发和维护的技术性讨论。 &a.doc.name; 文档计划 这个邮件列表是与FreeBSD创建的文档的出版和计划的讨论。 这个邮件列表的成员都会提交到The FreeBSD Documentation Project。 它是一个开放的列表,可以自由地加入和做贡献! &a.drivers.name; 为 &os; 撰写设备驱动 这是关于 &os; 上的设备驱动的技术论坛。 它主要供编写设备驱动的开发人员提出关于如何使用 &os; 内核提供的 API 来编写设备驱动程序的问题。 &a.eclipse.name; &os; 上的 Eclipse IDE、工具、 富客户应用, 以及 ports 的用户讨论。 这个邮件列表的目的, 是为在 &os; 平台上选择、 安装、 使用、 开发和维护 Eclipse IDE、 工具、 富客户应用的用户, 提供互助式支持, 以及为将 Eclipse IDE 和插件移植到 &os; 环境中提供帮助。 另一个目的是建立一个在 Eclipse 社区和 &os; 社区之间的交流管道, 以达到互惠互利。 尽管这个列表主要关注的是 Eclipse 用户的诉求, 它也为使用 Eclipse 框架开发 &os; 专用的应用提供了论坛。 &a.embedded.name; 在嵌入式应用中使用 FreeBSD 这个列表讨论关于在嵌入式系统中如何使用 FreeBSD 的话题。 这是一个技术性的邮件列表, 其主要内容是技术讨论。 针对这一邮件列表, 我们将嵌入式系统定义为那些不作为桌面系统、 只完成某些单一任务的计算设备。 这些实例包括路由器交换机和 PBX 这样的网络设备、 远程测量设备、 PDA、 PoS 系统,等等。 &a.emulation.name; 模拟其他系统, 例如 Linux/&ms-dos;/&windows; 这是一个讨论关于如何在 &os; 上运行为其他操作系统所撰写的程序的论坛。 &a.eol.name; 关于与 FreeBSD 有关, 但已不再为 FreeBSD Project 所维护的软件的互助支持。 这个邮件列表主要用于那些有兴趣提供或使用针对已不再为 FreeBSD Project 官方所支持 (例如, 以安全更新或补丁的形式) 的 FreeBSD 相关软件的用户或公司讨论。 &a.firewire.name; &firewire; (iLink, IEEE 1394) 这个邮件列表是关于FreeBSD子系统&firewire; (aka IEEE 1394 aka iLink)的设计和执行。相关特定的主题包括标准,总线设计和他们的协议, 适配器板/卡/芯片设置,及他们的正确的代码的结构和实施。 &a.fs.name; 文件系统 关于FreeBSD文件系统的讨论。这是一个纯技术的邮件列表。 &a.geom.name; GEOM 针对GEOM和相关执行的讨论。这是一个纯技术的邮件列表。 &a.gnome.name; GNOME 讨论关于在FreeBSD系统上的GNOME桌面环境 这是一个纯技术的邮件列表。 &a.ipfw.name; IP防火墙 这是关于在FreeBSD里重新设计IP防火墙代码的技术讨论论坛。 &a.ia64.name; 移植FreeBSD到IA64 这是一个有关将FreeBSD移植到&intel; IA64架构上的技术讨论列表, 讨论一些相关的问题与解决方案。也欢迎对这些问题感兴趣的个别讨论者。 &a.isdn.name; ISDN通信 这是一个FreeBSD支持的ISDN系统开发的邮件列表。 &a.java.name; &java;开发 这是一个讨论&java; 应用开发和 &jdk;s的porting与维护的邮件列表。 &a.jobs.name; 工作的提供和寻找 这个论坛是针对与 &os; 相关的雇佣信息和个人简历, 比如: 如果您想找一个与 &os; 相关的工作或有一个工作需要 &os; 这是一个让您来广告的好地方。 这 是对一般性雇佣问题的邮件列表, 对这个问题已经有了足够多的论坛。 注意这个列表,像其他的 FreeBSD.org 邮件列表一样是会分发给全世界的订阅者的。 因此,您需要明白关于位置和地域问题,确定之间是容易联系和可合作的。 Email最好应该使用 —纯文本格式,不过基本的PDF,HTML和 很少其他的能被更多读者接受的格式也是可以的。µsoft; Word (.doc) 格式是被邮件列表服务器拒绝的。 &a.kde.name; KDE 讨论关于在FreeBSD系统上使用KDE。 这是一个纯技术的邮件列表。 &a.hackers.name; 技术讨论 这是一个与FreeBSD相关的技术讨论论坛,是一个主要的技术性邮件列表。 他是针对个别的工作在FreeBSD上的人来提出问题或讨论相关的解决方案, 也欢迎对这些问题感兴趣的个别的讨论者。这是一个纯技术的邮件列表。 &a.hardware.name; FreeBSD硬件的普通讨论 有关FreeBSD运行的硬件类型的普通讨论,包括是否该买的一些问题和建议。 &a.hubs.name; 镜象站点 人们运行FreeBSD的镜象站点的公告和讨论。 &a.isp.name; ISP供应商问题 这是一个讨论使用FreeBSD的ISP供应商的邮件列表。这是一个纯技术的邮件列表。 &a.openoffice.name; OpenOffice.org 关于OpenOffice.org&staroffice;. 的移植和维护。 &a.performance.name; 讨论关于调整及高速运行FreeBSD 这个邮件列表提供了一个为黑客,管理员和有关的团体去讨论与FreeBSD性能相关的主题的空间。 可以在这里进行讨论的包括在任意高负载下,体验版下或者是有限制的条件下安装FreeBSD。 非常鼓励自愿地为了改进FreeBSD性能的相关团体去订阅这个列表。 这是个高技术含量的列表理论上说适合有丰富经验的FreeBSD用户,黑客,或对FreeBSD的速度、性能 、升级感兴趣的管理员。这不是一个问答式的列表,关于这些应该去读相关文档,但他是 一个可以投稿的地方,或者了解关于待解决的与性能相关的主题。 &a.pf.name; 关于 packet filter 防火墙系统的问题和讨论 关于 FreeBSD 环境下 packet filter (pf) 防火墙系统的讨论。 这里欢迎技术讨论, 以及一般的应用问题。 此外, 这里也是讨论 ALTQ QoS 框架的合适场所。 &a.platforms.name; 移植到非 &intel; 平台上 跨平台的 FreeBSD 问题, 关于非 &intel; FreeBSD 移植版本的讨论和提议。 这是一个纯技术性的邮件列表, 其讨论内容严格限制为技术。 &a.policy.name; 核心团队策略的决定 这是一个很小的只读的有关核心团队策略决定的邮件列表。 &a.ports.name; ports的讨论 关于FreeBSD的ports collection (/usr/ports)的讨论, ports的基础构造和调整过的ports结构。这是一个纯技术的邮件列表。 &a.ports-bugs.name; ports bugs的讨论 讨论关于FreeBSD的ports collection (/usr/ports),问题报告 ports建议,或者ports的修正。这是一个纯技术的邮件列表。 &a.proliant.name; 关于 FreeBSD 在 HP ProLiant 服务器平台上的技术讨论 这个邮件列表用来讨论在 HP ProLiant 服务器上使用 FreeBSD, 包括讨论 ProLiant 专用的驱动、 管理软件、 配置工具, 以及 BIOS 更新等。 同样地, 这里也是讨论 hpasmd、 hpasmcli, 以及 hpacucli 模块的主要场所。 &a.python.name; FreeBSD 上的 Python 这是一个讨论关于如何在 FreeBSD 上改善 Python 支持的邮件列表。 这是一个纯技术的邮件列表。 它是为那些移植 Python、 其第三方模块, 以及 Zope 相关软件到 FreeBSD 上的人准备的。 这里也欢迎参与技术讨论的人。 &a.questions.name; 用户问题 这是一个有关FreeBSD问题的邮件列表。您不应当发送how to 问题给技术列表,除非您认为这个问题是非常可爱的技术问题。 + + &a.ruby.name; + + + 有关 FreeBSD 上 Ruby + 的讨论 + + 这是一个讨论关于 Ruby 在 FreeBSD 上支持的邮件列表。 + 这是一个纯技术的邮件列表。它是为那些移植 Ruby、第三方库以及 + 各种 framework 准备的。 + + 这里也欢迎参与技术讨论的人。 + + + &a.scsi.name; SCSI子系统 这是一个讨论FreeBSD的SCSI子系统的邮件列表。这是一个纯技术的列表。 &a.security.name; 安全问题 FreeBSD的计算机安全问题(DES,Kerberos,已知的安全漏洞和修复等)。 这是一个纯技术的邮件列表。注意:这不是一个问和答的列表,但是同时给出 问题和答案到FAQ是欢迎的。 &a.security-notifications.name; 安全通知 FreeBSD安全问题和修复的通知。这不是一个讨论列表,讨论的列表应当是FreeBSD-security &a.small.name; 在嵌入式应用程序中使用FreeBSD 这个列表讨论了与极小的和嵌入的FreeBSD安装的讨论主题。 这是一个纯技术的列表。 这一列表已被 &a.embedded.name; 代替。 &a.stable.name; 讨论关于&os.stable;版的使用 这是一个&os.stable;用户的邮件列表。它包括-STABLE的新特性可能会影响用户的警告。 任何运行STABLE的人应当经常关注这个列表。这是一个纯技术的列表。 &a.standards.name; C99 & POSIX一致 这是关于FreeBSD顺应C99和POSIX标准的技术讨论论坛。 &a.usb.name; 讨论 &os; 的 USB 支持 这个邮件列表是关于 &os; 上的 USB 支持的技术性讨论。 &a.usergroups.name; 用户组调整列表 这个邮件列表为协调从各地的使用群体到彼此相互讨论问题和 从核心团队中指定个人。这个邮件列表应被限制到大纲和协调用户组 计划的范围之内。 &a.vendors.name; 商家 讨论FreeBSD计划和FreeBSD软硬件商家的协调。 + + &a.virtualization.name; + + + 讨论各种 &os; + 支持的虚拟化技术 + + 讨论 &os; 所支持的各种虚拟化技术的邮件列表。 + 在注重实现基本功能,加入新特性的同时, + 也为用户提供了一个寻求帮助和讨论他们的使用经验的场所。 + + + 过滤邮件列表 &os;邮件列表是使用了多种过滤方法去消除垃圾邮件、病毒和其他没用的电子邮件。 这部分所描述的并不包括所有常用的保护邮件列表的消除方法。 邮件列表只包含一些允许的附件类型。所有在列表中有MIME类型的附件的电子邮件在 邮件列表中被转发之前将被过滤掉。 application/octet-stream application/pdf application/pgp-signature application/x-pkcs7-signature message/rfc822 multipart/alternative multipart/related multipart/signed text/html text/plain text/x-diff text/x-patch 一些邮件列表可以允许附件为其他MIME类型,但是以上列出的 应该被多数的邮件列表所采用。 如果一个电子邮件包含HTML和纯文本形式,HTML的形式将被删除。 如果一个电子邮件内容只是HTML形式,他将被转换为纯文本格式。 Usenet新闻组 除了FreeBSD两个特殊的新闻组,还有很多讨论FreeBSD或与FreeBSD用户相关的其他讨论组。 一些新闻组的关键词搜索档案是可以使用的, 有什么问题可以与Warren Toomey wkt@cs.adfa.edu.au联系。 BSD特殊的新闻组 comp.unix.bsd.freebsd.announce comp.unix.bsd.freebsd.misc de.comp.os.unix.bsd (德语) fr.comp.os.bsd (法语) it.comp.os.freebsd (意大利语) tw.bbs.comp.386bsd (繁体中文) Internet上其他的&unix;新闻组 comp.unix comp.unix.questions comp.unix.admin comp.unix.programmer comp.unix.shell comp.unix.user-friendly comp.security.unix comp.sources.unix comp.unix.advocacy comp.unix.misc comp.bugs.4bsd comp.bugs.4bsd.ucb-fixes comp.unix.bsd X Window系统 comp.windows.x.i386unix comp.windows.x comp.windows.x.apps comp.windows.x.announce comp.windows.x.intrinsics comp.windows.x.motif comp.windows.x.pex comp.emulators.ms-windows.wine World Wide Web服务器 &chap.eresources.www.inc; Email地址 下面的用户组提供了与FreeBSD相关的邮件地址。如果他被滥用的话, 这个列表的管理员有收回的权利。 工具 用户组 管理员 ukug.uk.FreeBSD.org Forwarding only freebsd-users@uk.FreeBSD.org Lee Johnston lee@uk.FreeBSD.org Shell账号 下面的用户组为积极支持FreeBSD的人们提供了shell账号。如果他被滥用的话, 这个列表的管理员有撤销的权利。 主机 访问 工具 管理员 dogma.freebsd-uk.eu.org Telnet/FTP/SSH Email, Web space, Anonymous FTP Lee Johnston lee@uk.FreeBSD.org diff --git a/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml b/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml index ae52cdb4ff..211edbaa4e 100644 --- a/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml @@ -1,2990 +1,3078 @@ Joseph J. Barbish Contributed by Brad Davis Converted to SGML and updated by 防火墙 防火墙 安全 防火墙 入门 防火墙的存在, 使得过滤出入系统的数据流成为可能。 防火墙可以使用一组或多组 规则 (rules), 来检查出入您的网络连接的数据包, 并决定允许或阻止它们通过。 这些规则通常可以检查数据包的某个或某些特征, 这些特征包括, 但不必限于协议类型、 来源或目的主机地址, 以及来源或目的端口。 防火墙可以大幅度地改善主机或网络的安全。 它可以用来完成下面的任务: 保护和隔离应用程序、 服务程序, 以及您内部网络上的机器, 不受那些来自公共的 Internet 网络上您所不希望的数据流量的干扰。 限制或禁止从内部网访问公共的 Internet 上的服务。 支持网络地址转换 (NAT), 它使得您的内部网络能够使用私有的 IP 地址, 并分享一条通往公共的 Internet 的连接 (使用一个 IP 地址, 或者一组公网地址)。 读完这章, 您将了解: 如何正确地定义包过滤规则。 &os; 中内建的集中防火墙之间的差异。 如何使用和配置 OpenBSD 的 PF 防火墙。 如何使用和配置 IPFILTER 如何使用和配置 IPFW 阅读这章之前, 您需要: 理解基本的 &os; 和 Internet 概念。 防火墙的概念 防火墙/primary> 规则集 建立防火墙规则集的基本方法有两种: 包容式的排斥式的。 排斥式的防火墙, 允许除了禁止的那些数据之外的所有网络流量通过。 包容式的防火墙正好相反。 后者只允许符合规则的流量通过, 而其他所有的流量都被阻止。 包容式防火墙一般说来要比排斥式防火墙安全, 因为他们显著地降低了由于允许不希望的网络流量通过所带来的风险。 如果使用了 带状态功能的防火墙 (stateful firewall), 则安全机制可以进一步地细化。 带状态功能的防火墙能够记录通过防火墙的连接, 进而只允许与现有连接匹配的连接, 或创建新的连接。 带状态功能的防火墙的缺点, 则是在很短时间内有大量的连接请求时, 它们可能会受到拒绝服务 (DoS) 攻击。 绝大多数防火墙都提供了同时启用两种防火墙的能力, 以便为站点提供更好的保护。 防火墙软件包 &os; 的基本系统内建了三种不同的防火墙软件包。 它们是 IPFILTER (也被称作 IPF)、 IPFIREWALL (也被称作 IPFW), 以及 OpenBSD 的 PacketFilter (也被称为 PF)。 &os; 也提供了两个内建的、 用于流量整形 (基本上是控制带宽占用) 的软件包: &man.altq.4; 和 &man.dummynet.4;。 Dummynet 在过去一直和 IPFW 紧密集成, 而 ALTQ 则需要配合 PF 使用。 IPFILTER 对于流量整形可以使用 IPFILTER 的 NAT 和过滤功能以及 IPFW 的 &man.dummynet.4; 配合, 或者 使用 PFALTQ 的组合。 IPFW, 以及 PF 都是用规则来控制是否允许数据包出入您的系统, 虽然它们采取了不同的实现方法和规则语法。 &os; 包含多个内建的防火墙软件包的原因在于, 不同的人会有不同的需求和偏好。 任何一个防火墙软件包都很难说是最好的。 作者倾向于使用 IPFILTER, 因为它提供的状态式规则, 在 NAT 的环境中要简单许多, 而且它内建了 ftp 代理, 这简化了使用外部 FTP 服务时所需的配置。 由于所有的防火墙都基于检查所选定的包控制字段来实现功能, 撰写防火墙规则集时, 就必须了解 TCP/IP 是如何工作的, 以及包的控制字段在正常会话交互中的作用。 您可以在这个网站找到一份很好的解释文档: . + + + + John + Ferrell + Revised and updated by + + + + + OpenBSD Packet Filter (PF) 和 <acronym>ALTQ</acronym> 防火墙 PF 2003 年 7 月, OpenBSD 的防火墙, 也就是常说的 PF 被成功地移植到了 &os; 上, 并可以通过 &os; Ports Collection 来安装了; 第一个将 PF 集成到基本系统中的版本是 2004 年 11 月发行的 &os; 5.3。 PF 是一个完整的提供了大量功能的防火墙软件, 并提供了可选的 ALTQ (交错队列, Alternate Queuing) 功能。 ALTQ 提供了服务品质 - (QoS) 带宽整形功能, - 这个功能能够以基于过滤规则的方式来保障不同服务的带宽。 - OpenBSD Project 在维护 PF 用户指南方面已经做了非常卓越的工作, - 因此我们不打算在这本使用手册中进行更进一步的阐述, - 以避免不必要的重复劳动。 + (QoS) 带宽整形功能。 + + OpenBSD 项目非常杰出的维护着一份 + PF FAQ。 + 就其本身而言,这一节注重于 &os; 的 PF + 和提供一些关于使用方面的一般常识。更详细的使用信息请参阅 + PF FAQ - 更多的详细信息, 可以在 &os; 版本的 PF 网站上找到: 更多的详细信息, 可以在 &os; 版本的 + PF 网站上找到: - 启用 PF - - PF 作为 &os; 5.3 和更高版本基本系统安装的一部分, - 作为一个可以动态加载的模块出现。 如果在 rc.conf 中配置了 - pf_enable="YES" 则系统会自动加载对应的内核模块。 - 可加载内核模块在构建时启用了 &man.pflog.4;。 + 使用 PF 可装载的内核模块 + + 从 &os; 5.3;开始,PF + 作为一个单独的运行时可装载的模块被收录进基本的安装系统。 + 在 &man.rc.conf.5; 加入如下的语句能让系统能够动态装载 PF + 内核模块,pf_enable="YES"。 + 然而如果系统无法找到一份 PF + 防火墙规则的配置文件,PF 模块则不会被加载。 + 配置文件默认的位置在 /etc/pf.conf。 + 如果你的 PF 规则存放在其他的位置, + 那么就需要在 /etc/rc.conf + 配置文件中加入以下语句 + pf_rules="/path/pf.rules" + 来指定一份。 - - 这个模块假定 options - INETdevice bpf 是存在的。 - 除非编译时指定了 - NOINET6 (对 &os; 6.0-RELEASE 之前的版本) 或 - NO_INET6 (对更新一些的版本) (例如在 - &man.make.conf.5; 中定义) 它还需要 options INET6 - - - 一旦加载了这个内核模块, 或者将 PF 支持静态联编进内核, - 就可以随时通过 pfctl 来启用或禁用 - pf 了。 + + 从 &os; 7.0 开始,作为例子的存放在 + /etc/ 的 + pf.conf 被移动到了/usr/share/examples/pf/。 + &os; 7.0 以前的版本,默认仍有一份 + /etc/pf.conf + - 下面的例子展示了如何启用 - pf + PF 模块也能从命令行手工加载: - &prompt.root; pfctl -e + &prompt.root; kldload pf.ko - pfctl 命令提供了一种与 - pf 防火墙交互的方法。 要了解进一步的信息, - 参考 &man.pfctl.8; 联机手册是一个不错的办法。 + 可装载的摸块默认由 &man.pflog.4; 提供日志记录。 + 如果你需要 PF 其他的特性, + 你可能需要把 PF 编译进内核。 - 内核选项 + PF 内核选项 内核选项 device pf 内核选项 device pflog 内核选项 device pfsync - 将下面这些选项加入到 &os; 内核的编译配置文件中并不是启用 - PF 的强制性要求。 这里列出它们主要是为了介绍一些背景信息。 - 将 PF 编译到内核中之后, 就不再需要使用可加载内核模块了。 - - 如何在内核编译配置中加入对于 PF 选项的例子可以在内核源代码中的 - /usr/src/sys/conf/NOTES 这个文件中找到。 - 这里列举如下: + 虽然你不必亲自把对 PF 的支持编译进 &os; + 内核,但是有时你仍然需要这么做来使用到 PF + 的某些没有被收录进可装载模块的高级特性,比如 &man.pfsync.4; + 伪设备用来发送某些改变到PF 状态表。 + 它能配合 &man.carp.4; 使用 PF 建立支持故障转移的防火墙。 + 更多有关 CARP 的详细信息可以参阅 + 第 29 章。 + + The PF kernel options can be found in + /usr/src/sys/conf/NOTES and are reproduced + below: + 有关 PF 的内核选项可以在 + /usr/src/sys/conf/NOTES 中找到, + 以下也略有阐述: device pf device pflog device pfsync - device pf 用于启用 - Packet Filter 防火墙的支持。 + device pf 选项用于启用 + Packet Filter 防火墙的支持 + (&man.pf.4;)。 device pflog 启用可选的 &man.pflog.4; 伪网络设备, 用以通过 &man.bpf.4; 描述符来记录流量。 &man.pflogd.8; 服务可以用来存储信息, 并把它们以日志形式记录到磁盘上。 - device pfsync 启用可选的 - &man.pfsync.4; 伪网络设备, 用以监视 - 状态变更。 由于这不是那个可加载内核模块的一部分, - 因此如果需要使用它, 就必须自行编译定制的内核了。 - - 这些设置只有在您使用它们构建和安装新内核之后才会生效。 + device pfsync 选项启用可选的 + &man.pfsync.4; 支持,这是用于监视 状态变更 + 的伪网络设备。 可用的 rc.conf 选项 - 您需要在 /etc/rc.conf - 中添加如下配置, 以便在启动时激活 PF: + The following &man.rc.conf.5; statements configure + PF and &man.pflog.4; at boot: + 以下 &man.rc.conf.5; 中的语句用于启动时配置 + PF 和 &man.pflog.4; pf_enable="YES" # 启用 PF (如果需要的话, 自动加载内核模块) pf_rules="/etc/pf.conf" # pf 使用的规则定义文件 pf_flags="" # 启动时传递给 pfctl 的其他选项 pflog_enable="YES" # 启动 pflogd(8) pflog_logfile="/var/log/pflog" # pflogd 用于记录日志的文件名 pflog_flags="" # 启动时传递给 pflogd 的其他选项 如果您的防火墙后面有一个 LAN, 而且需要通过它来转发 LAN 上的包, 或进行 NAT, - 还必须同时启用下述选项: + 还需要同时启用下述选项: gateway_enable="YES" # 启用为 LAN 网关 + + 建立过滤规则 + + PF 会从 &man.pf.conf.5; + (默认为 /etc/pf.conf) + 文件中读取配置规则, 并根据那里的规则修改、丢弃或让数据包通过。 + 默认安装的 &os; 已经提供了一些简单的例子放在 + /usr/share/examples/pf/ 目录下。 + 请参阅 PF FAQ + 获取完整的 PF 规则信息。 + + + 在浏览 PF FAQ 时, + 请时刻注意不同版本的 &os; 使用了不同版本的 PF: + + + + &os; 5.X — + PF 相当于 OpenBSD 3.5 + + + + &os; 6.X — + PF 相当于 OpenBSD 3.7 + + + + &os; 7.X — + PF 相当于 OpenBSD 4.1 + + + + + &a.pf; 是一个提有关配置使用 PF + 防火墙问题的好地方。请在提问之前查阅邮件列表的归档! + + + + 使用 PF + + 使用 &man.pfctl.8; 可以控制 PF。 + 以下是一些实用的命令 + (请查阅 &man.pfctl.8; 获得全部可用的选项): + + + + + + 命令 + 作用 + + + + + + pfctl + 启用 PF + + + + pfctl + 禁用 PF + + + + pfctl all /etc/pf.conf + 清楚所有规则 (nat, filter, state, table, 等等。) + 并读取 /etc/pf.conf + + + + pfctl [ rules | nat | state ] + 列出 filter 规则, nat 规则, + 或状态表 + + + + pfctl /etc/pf.conf + 检查 /etc/pf.conf + 中的错误,但不装载相关的规则 + + + + + + 启用 <acronym>ALTQ</acronym> - ALTQ 只有在作为编译选项加入到 &os; 内核时, - 才能使用。 ALTQ 目前还不是所有的可用网卡驱动都能够支持的。 - 请参见 &man.altq.4; 联机手册了解您正使用的 &os; 版本中的驱动支持情况。 - 下面这些选项将启用 ALTQ 以及一些附加的功能。 + ALTQ 只有在作为编译选项加入到 &os; + 内核时才能使用。ALTQ + 目前还不是所有的可用网卡驱动都能够支持的。 + 请参见 &man.altq.4; 联机手册了解您正使用的 &os; + 版本中的驱动支持情况。 + + 下面这些选项将启用 ALTQ + 以及一些附加的功能: options ALTQ options ALTQ_CBQ # 基于分类的排列 (CBQ) options ALTQ_RED # 随机先期检测 (RED) options ALTQ_RIO # 对进入和发出的包进行 RED options ALTQ_HFSC # 带等级的包调度器 (HFSC) options ALTQ_PRIQ # 按优先级的排列 (PRIQ) options ALTQ_NOPCC # 在联编 SMP 内核时必须使用,禁止读时钟 options ALTQ 将启用 ALTQ 框架的支持。 options ALTQ_CBQ 用于启用基于分类的队列 (CBQ) 支持。 CBQ 允许您将连接分成不同的类别, 或者说, 队列, 以便在规则中为它们指定不同的优先级。 options ALTQ_RED 将启用随机预检测 (RED)。 RED 是一种用于防止网络拥塞的技术。 RED 度量队列的长度, 并将其与队列的最大和最小长度阈值进行比较。 如果队列过长, 则新的包将被丢弃。 如名所示, RED 从不同的连接中随机地丢弃数据包。 options ALTQ_RIO 将启用出入的随机预检测。 options ALTQ_HFSC 启用层次式公平服务平滑包调度器。 要了解关于 HFSC 进一步的信息, 请参见 options ALTQ_PRIQ 启用优先队列 (PRIQ)。 PRIQ 首先允许高优先级队列中的包通过。 options ALTQ_NOPCC 启用 ALTQSMP 支持。 如果是 SMP 系统, 则必须使用它。 - - - 建立过滤规则 - - Packet Filter 会从 - &man.pf.conf.5; 文件中读取配置规则, 并根据那里的规则修改、 - 丢弃或让数据包通过。 默认安装的 &os; - 已经提供了一个默认的、 包含一些有用例子和注释的 - /etc/pf.conf - - 尽管 &os; 提供了自己的 /etc/pf.conf, - 但这个文件和 OpenBSD 中的语法是一样的。 OpenBSD - 开发团队提供了一个非常好的配置 pf - 资源, 它可以在 - 找到。 - - - 在浏览 pf 用户手册时, 请时刻注意, - 在 &os; 中所包含的 pf 的版本和 OpenBSD 中是不一样的。 在 &os; 5.X 中 - pf 相当于 OpenBSD 3.5 中的版本, - 而 &os; 6.X 中则相当于 OpenBSD 3.7。 - - - 关于 pf 的配置和使用问题, - 可以在 &a.pf; 提出。 当然, 在提出问题之前, - 别忘了查阅邮件列表的存档。 - IPFILTER (IPF) 防火墙 防火墙 IPFILTER 这一节的内容正在撰写中。 其内容可能不总是十分准确。 IPFILTER 的作者是 Darren Reed。 IPFILTER 是独立于操作系统的: 它是一个开放源代码的应用, 并且已经被移植到了 &os;、 NetBSD、 OpenBSD、 SunOS、 HP/UX, 以及 Solaris 操作系统上。 IPFILTER 的支持和维护都相当活跃, 并且有规律地发布更新版本。 IPFILTER 提供了内核模式的防火墙和 NAT 机制, 这些机制可以通过用户模式运行的接口程序进行监视和控制。 防火墙规则可以使用 &man.ipf.8; 工具来动态地设置和删除。 NAT 规则可以通过 &man.ipnat.1; 工具来维护。 &man.ipfstat.8; 工具则可以用来显示 IPFILTER 内核部分的统计数据。 最后, 使用 &man.ipmon.8; 程序可以把 IPFILTER 的动作记录到系统日志文件中。 IPF 最初是使用一组 以最后匹配的规则为准 的策略来实现的, 这种方式只能支持无状态的规则。 随着时代的进步, IPF 被逐渐增强, 并加入了 quick 选项, 以及支持状态的 keep state 选项, 这使得规则处理逻辑变得更富有现代气息。 IPF 的官方文档介绍了传统的规则编写方法和文件处理逻辑。 新增的功能只是作为一些附加的选项出现, 如果能完全理解这些功能, 则对于建立更安全的防火墙就很有好处。 这一节中主要是针对 quick 选项, 以及支持状态的 keep state 选项的介绍。 这是包容式防火墙规则集最基本的编写要素。 包容式防火墙只允许与规则匹配的包通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 要获得关于传统规则处理方式的详细信息, 请参考: 以及 IPF FAQ 可以在 找到。 除此之外, 您还可以在 找到开放源代码的 IPFilter 的邮件列表存档, 并进行搜索。 启用 IPF IPFILTER 启用 IPF 作为 &os; 基本安装的一部分, 以一个独立的内核模块的形式提供。 如果在 rc.conf 中配置了 ipfilter_enable="YES", 系统就会自动地动态加载 IPF 内核模块。 这个内核模块在创建时启用了日志支持, 并加入了 default pass all 选项。 如果只是需要把默认的规则设置为 block all 的话, 并不需要把 IPF 编译到内核中。 可以简单地通过把这条规则加入自己的规则集来达到同样的目的。 内核选项 内核选项 IPFILTER 内核选项 IPFILTER_LOG 内核选项 IPFILTER_DEFAULT_BLOCK IPFILTER 内核选项 下面这些 &os; 内核编译选项并不是启用 IPF 所必需的。 这里只是作为背景知识来加以阐述。 如果将 IPF 编入了内核, 则对应的内核模块将不被使用。 关于 IPF 选项语句的内核编译配置的例子, 可以在内核源代码中的 /usr/src/sys/conf/NOTES 找到。 此处列举如下: options IPFILTER options IPFILTER_LOG options IPFILTER_DEFAULT_BLOCK options IPFILTER 用于启用 IPFILTER 防火墙的支持。 options IPFILTER_LOG 用于启用 IPF 的日志支持, 所有匹配了包含 log 的规则的包, 都会被记录到 ipl 这个包记录伪—设备中。 options IPFILTER_DEFAULT_BLOCK 将改变防火墙的默认动作, 进而, 所有不匹配防火墙的 pass 规则的包都会被阻止。 这些选项只有在您重新编译并安装内核之后才会生效。 可用的 rc.conf 选项 要在启动时激活 IPF, 您需要在 /etc/rc.conf 中增加下面的设置: ipfilter_enable="YES" # 启动 ipf 防火墙 ipfilter_rules="/etc/ipf.rules" # 将被加载的规则定义, 这是一个文本文件 ipmon_enable="YES" # 启动 IP 监视日志 ipmon_flags="-Ds" # D = 作为服务程序启动 # s = 使用 syslog 记录 # v = 记录 tcp 窗口大小、 ack 和顺序号(seq) # n = 将 IP 和端口映射为名字 如果您的 LAN 在防火墙后面, 并且使用了保留的私有 IP 地址范围, 那就需要增加下面的一些选项来启用 NAT 功能: gateway_enable="YES" # 启用作为 LAN 网关的功能 ipnat_enable="YES" # 启动 ipnat 功能 ipnat_rules="/etc/ipnat.rules" # 用于 ipnat 的规则定义文件 IPF ipf ipf 命令可以用来加载您自己的规则文件。 一般情况下, 您可以建立一个包括您自定义的规则的文件, 并使用这个命令来替换掉正在运行的防火墙中的内部规则: &prompt.root; ipf -Fa -f /etc/ipf.rules 表示清除所有的内部规则表。 用于指定将要被读取的规则定义文件。 这个功能使得您能够修改自定义的规则文件, 通过运行上面的 IPF 命令, 可以将正在运行的防火墙刷新为使用全新的规则集, 而不需要重新启动系统。 这对于测试新的规则来说就很方便, 因为您可以任意执行上面的命令。 请参考 &man.ipf.8; 联机手册以了解这个命令提供的其它选项。 &man.ipf.8; 命令假定规则文件是一个标准的文本文件。 它不能处理使用符号代换的脚本。 也确实有办法利用脚本的非常强大的符号替换能力来构建 IPF 规则。 要了解进一步的细节, 请参考 IPFSTAT ipfstat IPFILTER 统计 默认情况下, &man.ipfstat.8; 会获取并显示所有的累积统计, 这些统计是防火墙启动以来用户定义的规则匹配的出入流量, 您可以通过使用 ipf -Z 命令来将这些计数器清零。 请参见 &man.ipfstat.8; 联机手册以了解进一步的细节。 默认的 &man.ipfstat.8; 命令输出类似于下面的样子: input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0 output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0 input packets logged: blocked 99286 passed 0 output packets logged: blocked 0 passed 0 packets logged: input 0 output 0 log failures: input 3898 output 0 fragment state(in): kept 0 lost 0 fragment state(out): kept 0 lost 0 packet state(in): kept 169364 lost 0 packet state(out): kept 431395 lost 0 ICMP replies: 0 TCP RSTs sent: 0 Result cache hits(in): 1215208 (out): 1098963 IN Pullups succeeded: 2 failed: 0 OUT Pullups succeeded: 0 failed: 0 Fastroute successes: 0 failures: 0 TCP cksum fails(in): 0 (out): 0 Packet log flags set: (0) 如果使用了 (进入流量) 或者 (输出流量), 它就只获取并显示内核中所安装的对应过滤器规则的统计数据。 ipfstat -in 以规则号的形式显示进入的内部规则表。 ipfstat -on 以规则号的形式显示流出的内部规则表。 输出和下面的类似: @1 pass out on xl0 from any to any @2 block out on dc0 from any to any @3 pass out quick on dc0 proto tcp/udp from any to any keep state ipfstat -ih 显示内部规则表中的进入流量, 每一个匹配规则前面会同时显示匹配的次数。 ipfstat -oh 显示内部规则表中的流出流量, 每一个匹配规则前面会同时显示匹配的次数。 输出和下面的类似: 2451423 pass out on xl0 from any to any 354727 block out on dc0 from any to any 430918 pass out quick on dc0 proto tcp/udp from any to any keep state ipfstat 命令的一个重要的功能可以通过指定 参数来使用, 它会以类似 &man.top.1; 的显示 &os; 正运行的进程表的方式来显示统计数据。 当您的防火墙正在受到攻击的时候, 这个功能让您得以识别、 试验, 并查看攻击的数据包。 这个选项提还提供了实时选择希望监视的目的或源 IP、 端口或协议的能力。 请参见 &man.ipfstat.8; 联机手册以了解详细信息。 IPMON ipmon IPFILTER 记录日志 为了使 ipmon 能够正确工作, 必须打开 IPFILTER_LOG 这个内核选项。 这个命令提供了两种不同的使用模式。 内建模式是默认的模式, 如果您不指定 参数, 就会采用这种模式。 服务模式是持续地通过系统日志来记录的工作模式, 这样, 您就可以通过查看日志来了解过去曾经发生过的事情。 这种模式是 &os; 和 IPFILTER 配合工作的模式。 由于在 &os; 中提供了一个内建的系统日志自动轮转功能, 因此, 使用 syslogd 比默认的将日志信息记录到一个普通文件要好。 在默认的 rc.conf 文件中, 您会看到一个 ipmon_flags 语句, 指定了 标志: ipmon_flags="-Ds" # D = 作为服务程序启动 # s = 使用 syslog 记录 # v = 记录 tcp 窗口大小、 ack 和顺序号(seq) # n = 将 IP 和端口映射为名字 记录日志的好处是很明显的。 它提供了在事后重新审查相关信息, 例如哪些包被丢弃, 以及这些包的来源地址等等。 这将为查找攻击者提供非常有用的第一手资料。 即使启用了日志机制, IPF 仍然不会对其规则进行任何日志记录工作。 防火墙管理员可以决定规则集中的哪些应记录日志, 并在这些规则上加入 log 关键字。 一般来说, 只应记录拒绝性的规则。 作为惯例, 通常会有一条默认的、拒绝所有网络流量的规则, 并指定 log 关键字, 作为您的规则集的最后一条。 这样, 您就能够看到所有没有匹配任何规则的数据包。 IPMON 的日志 Syslogd 使用特殊的方法对日志数据进行分类。 它使用称为 facilitylevel 的组。 以 模式运行的 IPMON 采用 security 作为 facility 名。 所有由 IPMON 记录的数据都会进入 security。 如果需要, 可以用下列 levels 来进一步区分数据: LOG_INFO - 使用 "log" 关键字指定的通过或阻止动作 LOG_NOTICE - 同时记录通过的那些数据包 LOG_WARNING - 同时记录阻止的数据包 LOG_ERR - 进一步记录含不完整的包头的数据包 要设置 IPFILTER 来将所有的数据记录到 /var/log/ipfilter.log, 需要首先建立这个文件。 下面的命令可以完成这个工作: &prompt.root; touch /var/log/ipfilter.log syslog 功能可以通过在 /etc/syslog.conf 文件中的语句来定义。 syslog.conf 提供了相当多的用以控制 syslog 如何处理类似 IPF 这样的用用程序所产生的系统消息的方法。 您需要将下列语句加到 /etc/syslog.conf security.* /var/log/ipfilter.log 这里的 security.* 表示把所有的相关日志信息写到指定的文件中。 要让 /etc/syslog.conf 中的修改立即生效, 您可以重新启动计算机, 或者通过执行 /etc/rc.d/syslogd reload 来让它重新读取 /etc/syslog.conf 不要忘了修改 /etc/newsyslog.conf 来让您刚创建的日志进行轮转。 记录消息的格式 ipmon 生成的消息由空格分隔的数据字段组成。 所有的消息都包含的字段是: 接到数据包的日期。 接到数据包的时间。 其格式为 HH:MM:SS.F, 分别是小时、 分钟、 秒, 以及分秒 (这个数字可能有许多位)。 处理数据包的网络接口名字, 例如 dc0 组和规则的编号, 例如 @0:17 可以通过 ipfstat -in 来查看这些信息。 动作: p 表示通过, b 表示阻止, S 表示包头不全, n 表示没有匹配任何规则, L 表示 log 规则。 显示这些标志的顺序是: S, p, b, n, L。 大写的 P 或 B 表示记录包的原因是某个全局的日志配置, 而不是某个特定的规则。 地址。 这实际上包括三部分: 源地址和端口 (以逗号分开), 一个 -> 符号, 以及目的地址和端口。 209.53.17.22,80 -> 198.73.220.17,1722. PR, 后跟协议名称或编号, 例如, PR tcp。 len, 后跟包头的长度, 以及包的总长度, 例如 len 20 40。 对于 TCP 包, 则还会包括一个附加的字段, 由一个连字号开始, 之后是表示所设置的标志的一个字母。 请参见 &man.ipmon.8; 联机手册, 以了解这些字母所对应的标志。 对于 ICMP 包, 则在最后会有两个字段。 前一个总是 ICMP, 而后一个则是 ICMP 消息和子消息的类型, 中间以斜线分靠, 例如 ICMP 3/3 表示端口不可达消息。 构建采用符号替换的规则脚本 一些有经验的 IPF 会创建包含规则的文件, 并把它编写成能够与符号替换脚本兼容的方式。 这样做最大的好处是, 它能够让您只修改符号名字所代表的值, 而在脚本执行时直接替换掉所有的名符。 作为脚本, 您可以使用符号替换来把那些经常使用的值直接用于多个规则。 下面我们将给出一个例子。 这个脚本所使用的语法与 sh、 csh, 以及 tcsh 脚本。 符号替换的前缀字段是美元符号: $ 符号字段不使用 $ 前缀。 希望替换符号字段的值, 必须使用双引号 (") 括起来。 您的规则文件的开头类似这样: ############# IPF 规则脚本的开头 ######################## oif="dc0" # 外网接口的名字 odns="192.0.2.11" # ISP 的 DNS 服务器 IP 地址 myip="192.0.2.7" # 来自 ISP 的静态 IP 地址 ks="keep state" fks="flags S keep state" # 可以使用这个脚本来建立 /etc/ipf.rules 文件, # 也可以 "直接地" 运行它。 # # 请删除两个注释号之一。 # # 1) 保留下面一行, 则创建 /etc/ipf.rules: #cat > /etc/ipf.rules << EOF # # 2) 保留下面一行, 则 "直接地" 运行脚本: /sbin/ipf -Fa -f - << EOF # 允许发出到我的 ISP 的域名服务器的访问 pass out quick on $oif proto tcp from any to $odns port = 53 $fks pass out quick on $oif proto udp from any to $odns port = 53 $ks # 允许发出未加密的 www 访问请求 pass out quick on $oif proto tcp from $myip to any port = 80 $fks # 允许发出使用 TLS SSL 加密的 https www 访问请求 pass out quick on $oif proto tcp from $myip to any port = 443 $fks EOF ################## IPF 规则脚本的结束 ######################## 这就是所需的全部内容。 这个规则本身并不重要, 它们主要是用于体现如何使用符号代换字段, 以及如何完成值的替换。 如果上面的例子的名字是 /etc/ipf.rules.script, 就可以通过输入下面的命令来重新加载规则: &prompt.root; sh /etc/ipf.rules.script 在规则文件中嵌入符号有一个问题: IPF 无法识别符号替换, 因此它不能直接地读取这样的脚本。 这个脚本可以使用下面两种方法之一来使用: 去掉 cat 之前的注释, 并注释掉 /sbin/ipf 开头的那一行。 像其他配置一样, 将 ipfilter_enable="YES" 放到 /etc/rc.conf 文件中, 并在此后立刻执行脚本, 以创建或更新 /etc/ipf.rules 通过把 ipfilter_enable="NO" (这是默认值) 加到 /etc/rc.conf 中, 来禁止系统启动脚本开启 IPFILTER。 /usr/local/etc/rc.d/ 启动目录中增加一个类似下面的脚本。 应该给它起一个显而易见的名字, 例如 ipf.loadrules.sh。 请注意, .sh 扩展名是必需的。 #!/bin/sh sh /etc/ipf.rules.script 脚本文件必须设置为属于 root, 并且属主可读、 可写、 可执行。 &prompt.root; chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh 这样, 在系统启动时, 就会自动加载您的 IPF 规则了。 IPF 规则集 规则集是指一组编写好的依据包的值决策允许通过或阻止 ipf 规则。 包的双向交换组成了一个会话交互。 防火墙规则集对同一个包会进行两次处理, 第一次是它从公网的 Internet 主机到达的时候, 第二次是它离开并返回初始的 Internet 公网主机的时候。 每一个 TCP/IP 服务 (例如 telnet, www, 邮件等等) 是由协议预先定义的源或目的 IP 地址, 以及源或目的端口。 这是最基本的一些可以为防火墙规则所利用的, 判别是否允许服务通过的标准。 IPFILTER 规则处理顺序 IPF 最初被写成使用一组称作 以最后匹配的规则为准 的处理逻辑, 且只能处理无状态的规则。 随着时代的发展, IPF 进行了改进, 并提供了 quick 选项, 以及一个有状态的 keep state 选项。 后者使处理逻辑迅速地跟上了时代的步伐。 这一节中提供的一些指导, 是基于使用包含 quick 选项和有状态的 keep state 选项来进行阐述的。 这些是编写包容式防火墙规则集的基本要素。 包容式防火墙只允许与规则匹配的服务通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 当对防火墙规则进行操作时, 应该 谨慎行事。 某些配置可能会 将您反锁在 服务器外面。 安全起见, 您可以考虑在第一次进行防火墙配置时在本地控制台上, 而不是远程, 例如通过 ssh 来进行。 规则语法 IPFILTER 规则语法 这里给出的规则语法已经简化到只处理那些新式的带状态规则, 并且都是 第一个匹配的规则获胜 逻辑的。 要了解完整的传统规则语法描述, 请参见 &man.ipf.8; 联机手册。 # 字符开头的内容会被认为是注释。 这些注释可以出现在一行规则的末尾, 或者独占一行。 空行会被忽略。 规则由关键字组成。 这些关键字必须以一定的顺序, 从左到右出现在一行上。 接下来的文字中关键字将使用粗体表示。 某些关键字可能提供了子选项, 这些子选项本身可能也是关键字, 而且可能会提供更多的子选项。 下面的文字中, 每种语法都使用粗体的小节标题呈现, 并介绍了其上下文。 ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG STATEFUL ACTION = block | pass IN-OUT = in | out OPTIONS = log | quick | on 网络接口的名字 SELECTION = proto 协议名称 | 源/目的 IP | port = 端口号 | flags 标志值 PROTO = tcp/udp | udp | tcp | icmp SRC_ADD,DST_ADDR = all | from 对象 to 对象 OBJECT = IP地址 | any PORT_NUM = port 端口号 TCP_FLAG = S STATEFUL = keep state ACTION (动作) 动作对表示匹配规则的包应采取什么动作。 每一个规则 必须 包含一个动作。 可以使用下面两种动作之一: block 表示如果规则与包匹配, 则丢弃包。 pass 表示如果规则与包匹配, 则允许包通过防火墙。 IN-OUT 每个过滤器规则都必须明确地指定是流入还是流出的规则。 下一个关键字必须要么是 in, 要么是 out, 否则将无法通过语法检查。 in 表示规则应被应用于刚刚从 Internet 公网上收到的数据包。 out 表示规则应被应用于即将发出到 Internet 的数据包。 OPTIONS 这些选项必须按下面指定的顺序出现。 log 表示包头应被写入到 ipl 日志 (如前面 LOGGING 小节所介绍的那样), 如果它与规则匹配的话。 quick 表示如果给出的参数与包匹配, 则以这个规则为准, 这使得能够 "短路" 掉后面的规则。 这个选项对于使用新式的处理逻辑是必需的。 on 表示将网络接口的名称作为筛选参数的一部分。 接口的名字会在 &man.ifconfig.8; 的输出中显示。 使用这个选项, 则规则只会应用到某一个网络接口上的出入数据包上。 要配置新式的处理逻辑, 必须使用这个选项。 当记录包时, 包的头会被写入到 IPL 包日志伪设备中。 紧跟 log 关键字, 可以使用下面几个修饰符 (按照下列顺序): body 表示应同时记录包的前 128 字节的内容。 first 如果 log 关键字和 keep state 选项同时使用, 则这个选项只在第一个包上触发, 这样就不用记录每一个 keep state 包信息了。 SELECTION 这一节所介绍的关键字可以用于所检察的包的属性。 有一个关键字主题, 以及一组子选项关键字, 您必须从他们中选择一个。 以下是一些通用的属性, 它们必须按下面的顺序使用: PROTO proto 是一个主题关键字, 它必须与某个相关的子选项关键字配合使用。 这个值的作用是匹配某个特定的协议。 要使用新式的规则处理逻辑, 就必须使用这个选项。 tcp/udp | udp | tcp | icmp 或其他在 /etc/protocols 中定义的协议。 特殊的协议关键字 tcp/udp 可以用于匹配 TCPUDP 包, 引入这个关键字的作用是是避免大量的重复规则的麻烦。 SRC_ADDR/DST_ADDR 使用 all 关键词, 基本上相当于 from any to any 在没有配合其他关键字的情形。 from src to dst: from 和 to 关键字主要是用来匹配 IP 地址。 所有的规则都必须同时给出源和目的两个参数。 any 是一个可以用于匹配任意 IP 地址的特殊关键字。 例如, 您可以使用 from any to anyfrom 0.0.0.0/0 to anyfrom any to 0.0.0.0/0from 0.0.0.0 to any 以及 from any to 0.0.0.0 IP 地址可以按句点分隔的 IP 地址/掩码长度 的方式来指定, 也可以只指定一个句点分隔的 IP 地址。 如果无法使用子网掩码来表示 IP 的话, 表达地址就会很麻烦。 请参见下面的网页了解如何撰写掩码长度: PORT 如果为源或目的指定了匹配端口, 规则就只能应用于 TCPUDP 包了。 当编写端口比较规则时, 可以指定 /etc/services 中所定义的名字, 也可以直接用端口号来指定。 如果端口号出现在源对象一侧, 则被认为是源端口号; 反之, 则被认为是目的端口号。 要使用新式的规则处理逻辑, 就必须与 to 对象配合使用这个选项。 使用的例子: from any to any port = 80 端口的比较是以数字的形式进行的, 可以使用比较算符来指定, 也可以指定一个范围。 port "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge". 要指定端口范围, 可以使用 "<>" | "><"。 在源和目的匹配参数之后, 需要使用下面两个参数, 才能够使用新式的规则处理逻辑。 <acronym>TCP</acronym>_FLAG 标志只对 TCP 过滤使用。 这些字母用来表达 TCP 包头的标志。 新式的规则处理逻辑使用 flags S 参数来识别 tcp 会话开始的请求。 STATEFUL keep state 表示如果有一个包与规则匹配, 则其筛选参数应激活有状态的过滤机制。 如果使用新式的处理逻辑, 则这个选项是必需的。 有状态过滤 IPFILTER 有状态过滤 有状态过滤将网络流量当作一种双向的包交换来处理。 如果激活它, keep-state 会动态地为每一个相关的包在双向会话交互过程中产生内部规则。 它能够确认发起者和包的目的地之间的会话是有效的双向包交换过程的一部分。 如果包与这些规则不符, 则将自动地拒绝。 状态保持也使得 ICMP 包能够与 TCP 或 UDP 会话相关。 因此, 如果您在浏览网站时收到允许的状态保持规则匹配的 ICMP 类型 3 代码 4 响应, 则这些响应会被自动地允许进入。 所有 IPF 能够处理的包, 都可以作为某种活跃会话的一部分, 即使它是另一种协议的, 也会被允许进入。 所发生的事情是: 将要通过联入公网的网络接口发出的包, 首先会经过动态状态表的检查。 如果包与会话中预期的下一个包匹配, 则防火墙就会允许包通过, 而会话的交互流信息也会在动态状态表中进行更新, 而其他的包, 则将使用发出规则集来检查。 发到联入 Internet 公网的包, 也会首先经过动态规则表的检查。 如果与会话中预期的下一个包匹配, 则防火墙就允许它通过, 并更新动态状态表。 其他包仍会使用进入规则集进行检查。 当会话结束时, 对应的项会在动态状态表中删除。 有状态过滤使得您能够集中于阻止/允许新的会话。 一旦新会话被允许通过, 则所有后续的包就都被自动地允许通过, 而伪造的包则被自动地拒绝。 如果新的会话被阻止, 则后续的包也都不会被允许通过。 有状态过滤从技术角度而言, 在阻止目前攻击者常用的洪水式攻击来说, 具有更好的抗御能力。 包容式规则集的例子 下面的规则集是如何编写非常安全的包容式防火墙规则集的一个范例。 包容式防火墙只让允许的服务通过, 而所有其他的访问都会被默认地拒绝。 所有的防火墙都有至少两个接口对应的默认规则, 从而使防火墙能够正常工作。 所有的类 &unix; 系统, 包括 &os; 都使用 lo0 和 IP 地址 127.0.0.1 用于操作系统中内部的通讯。 防火墙规则必须允许这些包无阻碍地通过。 接入 Internet 公网的网络接口, 是放置规则并允许将访问请求发到 Internet 以及接收响应的地方。 这有可能是用户模式的 PPP tun0 接口, 如果您的网卡同 DSL 或电缆调制解调器相联的话。 如果有至少一个网卡与防火墙后的内网 LAN 相联, 这些网络接口就应该有一个规则来允许来自这些 LAN 接口的包无阻碍地通过。 一般说来, 规则应被组织为三个主要的小节: 所有允许自由通过的接口规则, 发到公网接口的规则, 以及进入公网接口的规则。 每一个公网接口规则中, 经常会匹配到的规则应该放置在尽可能靠前的位置。 而最后一个规则应该是阻止包通过, 并记录它们。 下面防火墙规则集中, Outbound 部分是一些使用 'pass' 的规则, 这些规则指定了允许访问的公网 Internet 服务, 并且指定了 'quick'、 'on'、 'proto'、 'port', 以及 'keep state' 这些选项。 'proto tcp' 规则还指定了 'flag' 这个选项, 这样会话的第一个包将出发状态机制。 接下来的 Inbound 一节, 则首先阻止所有不希望的数据包。 这样做有两个原因, 其一是被阻止的包可能会被后面的规则允许, 从而并不妨碍获得授权的服务正常工作; 其二是这避免了那些不常见的包由于匹配到最后一条规则而触发日志, 规则集中的最后一条规则是阻止并记录所有的包, 通过这样的记录, 就比较容易找到攻击系统的人, 并为采取法律措施收集证据。 需要注意的另一件事情是, 如果收到了不希望的数据包, 则这些包会被丢弃, 而不是给出什么响应。 这样做的好处是, 攻击者无法了解包是否已经被您的系统收到。 攻击者所能了解到的信息越少, 攻陷您的系统所需要花费的时间也就越长。 我们在这里记录的连入的 'nmap OS 指纹' 探测企图, 一般来说正是攻击者所做的第一件事。 如果您看到了 'log first' 规则的日志, 就应该用 ipfstat -hio 命令来看看那个规则被匹配的次数, 以便了解系统是否正在或曾被攻击。 如果记录的包的端口号并不是您所知道的, 可以在 /etc/services 了解端口号通常的用途。 参考下面的网页, 了解木马使用的端口: 下面是我在自己的系统中使用的完整的, 非常安全的 '包容式' 防火墙规则集。 直接使用这个规则集不会给您造成问题, 您所要做的只是注释掉那些您不需要的服务。 如果在日志中发现了希望阻止的记录, 只需在 inbound 小节中增加一条阻止规则集可。 您必须将每一个规则中的 dc0 替换为您系统上接入 Internet 的网络接口名称, 例如, 用户环境下的 PPP 应该是 tun0 /etc/ipf.rules 中加入下面的内容: ################################################################# # No restrictions on Inside LAN Interface for private network # Not needed unless you have LAN ################################################################# #pass out quick on xl0 all #pass in quick on xl0 all ################################################################# # No restrictions on Loopback Interface ################################################################# pass in quick on lo0 all pass out quick on lo0 all ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network # or from this gateway server destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # xxx must be the IP address of your ISP's DNS. # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state pass out quick on dc0 proto udp from any to xxx port = 53 keep state # Allow out access to my ISP's DHCP server for cable or DSL networks. # This rule is not needed for 'user ppp' type connection to the # public Internet, so you can delete this whole group. # Use the following rule and check log for IP address. # Then put IP address in commented out rule & delete first rule pass out log quick on dc0 proto udp from any to any port = 67 keep state #pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state # Allow out non-secure standard www function pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state # Allow out secure www function https over TLS SSL pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state # Allow out send & get email function pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state # Allow out Time pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state # Allow out nntp news pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state # Allow out gateway & LAN users non-secure FTP ( both passive & active modes) # This function uses the IPNAT built in FTP proxy function coded in # the nat rules file to make this single rule function correctly. # If you want to use the pkg_add command to install application packages # on your gateway system you need this rule. pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state # Allow out non-secure Telnet pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state # Allow out FBSD CVSUP function pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state # Allow out ping to public Internet pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state # Allow out whois for LAN PC to public Internet pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state # Block and log only the first occurrence of everything # else that's trying to get out. # This rule enforces the block all by default logic. block out log first quick on dc0 all ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Block all inbound traffic from non-routable or reserved address spaces block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP block in quick on dc0 from 127.0.0.0/8 to any #loopback block in quick on dc0 from 0.0.0.0/8 to any #loopback block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast ##### Block a bunch of different nasty things. ############ # That I do not want to see in the log # Block frags block in quick on dc0 all with frags # Block short tcp packets block in quick on dc0 proto tcp all with short # block source routed packets block in quick on dc0 all with opt lsrr block in quick on dc0 all with opt ssrr # Block nmap OS fingerprint attempts # Log first occurrence of these so I can get their IP address block in log first quick on dc0 proto tcp from any to any flags FUP # Block anything with special options block in quick on dc0 all with ipopts # Block public pings block in quick on dc0 proto icmp all icmp-type 8 # Block ident block in quick on dc0 proto tcp from any to any port = 113 # Block all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 block in log first quick on dc0 proto tcp/udp from any to any port = 137 block in log first quick on dc0 proto tcp/udp from any to any port = 138 block in log first quick on dc0 proto tcp/udp from any to any port = 139 block in log first quick on dc0 proto tcp/udp from any to any port = 81 # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP's DHCP server as it's the only # authorized source to send this packet type. Only necessary for # cable or DSL configurations. This rule is not needed for # 'user ppp' type connection to the public Internet. # This is the same IP address you captured and # used in the outbound section. pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state # Allow in standard www function because I have apache server pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID/PW passed over public Internet as clear text. # Delete this sample group if you do not have telnet server enabled. #pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state # Allow in secure FTP, Telnet, and SCP from public Internet # This function is using SSH (secure shell) pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state # Block and log only first occurrence of all remaining traffic # coming into the firewall. The logging of only the first # occurrence stops a .denial of service. attack targeted # at filling up your log file space. # This rule enforces the block all by default logic. block in log first quick on dc0 all ################### End of rules file ##################################### <acronym>NAT</acronym> NAT IP 伪装 NAT 网络地址转换 NAT NAT 是 网络地址转换(Network Address Translation) 的缩写。 对于那些熟悉 &linux; 的人来说, 这个概念叫做 IP 伪装 (Masquerading); NAT 和 IP 伪装是完全一样的概念。 由 IPF 的 NAT 提供的一项功能是, 将防火墙后的本地局域网 (LAN) 共享一个 ISP 提供的 IP 地址来接入 Internet 公网。 有些人可能会问, 为什么需要这么做。 一般而言, ISP 会为非商业用户提供动态的 IP 地址。 动态地址意味着每次登录到 ISP 都有可能得到不同的 IP 地址, 无论是采用电话拨号登录, 或使用 cable 以及 DSL 调制解调器的方式。 这个 IP 是您与 Internet 公网交互时使用的身份。 现在考虑家中有五台 PC 需要访问 Internet 的情形。 您可能需要向 ISP 为每一台 PC 所使用的独立的 Internet 账号付费, 并且拥有五根电话线。 有了 NAT, 您就只需要一个 ISP 账号, 然后将另外四台 PC 的网卡通过交换机连接起来, 并通过运行 &os; 系统的那台机器作为网关连接出去。 NAT 会自动地将每一台 PC 在内网的 LAN IP 地址, 在离开防火墙时转换为公网的 IP 地址。 此外, 当数据包返回时, 也将进行逆向的转换。 NAT 通常是在没有向 ISP 请求许可, 或事先知会的情况下进行的, 因而如果被发现, 有时可能会成为 ISP 撤销您的账号的一个借口。 商业用户一般来说会购买昂贵得多的 Internet 线路, 通常会获得一组长期有效的静态 IP 地址块。 ISP 一般会希望并同意商业用户在他们的内网中使用 NAT 在 IP 地址空间中, 有一些特殊的范围是保留供经过 NAT 的内网 LAN IP 地址使用的。 根据 RFC 1918, 您可以使用下面这些 IP 范围用于内网, 它们不会在 Internet 公网上路由: 起始 IP 10.0.0.0 - 结束 IP 10.255.255.255 起始 IP 172.16.0.0 - 结束 IP 172.31.255.255 起始 IP 192.168.0.0 - 结束 IP 192.168.255.255 IP<acronym>NAT</acronym> NAT 以及 IPFILTER ipnat NAT 规则是通过 ipnat 命令加载的。 默认情况下, NAT 规则会保存在 /etc/ipnat.rules 文件中。 请参见 &man.ipnat.1; 了解更多的详情。 如果在 NAT 已经启动之后想要修改 NAT 规则, 可以修改保存 NAT 规则的那个文件, 然后在执行 ipnat 命令时加上 参数, 以删除在用的 NAT 内部规则表, 以及所有地址翻译表中已有的项。 要重新加载 NAT 规则, 可以使用类似下面的命令: &prompt.root; ipnat -CF -f /etc/ipnat.rules 如果想要看看您系统上 NAT 的统计信息, 可以用下面的命令: &prompt.root; ipnat -s 要列出当前的 NAT 表的映射关系, 使用下面的命令: &prompt.root; ipnat -l 要显示详细的信息并显示与规则处理和当前的规则/表项: &prompt.root; ipnat -v IP<acronym>NAT</acronym> 规则 NAT 规则非常的灵活, 能够适应商业用户和家庭用户的各种不同的需求。 这里所介绍的规则语法已经被简化, 以适应非商用环境中的一般情况。 完整的规则语法描述, 请参考 &man.ipnat.5; 联机手册中的介绍。 NAT 规则的写法与下面的例子类似: map IF LAN_IP_RANGE -> PUBLIC_ADDRESS 关键词 map 出现在规则的最前面。 IF 替换为对外的网络接口名。 LAN_IP_RANGE 是内网中的客户机使用的地址范围。 通常情况下, 这应该是类似 192.168.1.0/24 的地址。 PUBLIC_ADDRESS 既可以是外网的 IP 地址, 也可以是 0/32 这个特殊的关键字, 它表示分配到 IF 上的所有地址。 <acronym>NAT</acronym> 的工作原理 当包从 LAN 到达防火墙, 而目的地址是公网地址时, 它首先会通过 outbound 过滤规则。 接下来, NAT 会得到包, 并按自顶向下的顺序处理规则, 而第一个匹配的规则将生效。 NAT 接下来会根据包对应的接口名字和源 IP 地址检查所有的规则。 如果包和某个 NAT 规则匹配, 则会检查包的 [源 IP 地址, 例如, 内网的 IP 地址] 是否在 NAT 规则中箭头左侧指定的 IP 地址范围匹配。 如果匹配, 则包的原地址将被根据用 0/32 关键字指定的 IP 地址重写。 NAT 将向它的内部 NAT 表发送此地址, 这样, 当包从 Internet 公网中返回时, 就能够把地址映射回原先的内网 IP 地址, 并在随后使用过滤器规则来处理。 启用 IP<acronym>NAT</acronym> 要启用 IPNAT, 只需在 /etc/rc.conf 中加入下面一些语句。 使机器能够在不同的网络接口之间进行包的转发, 需要: gateway_enable="YES" 每次开机时自动启动 IPNAT ipnat_enable="YES" 指定 IPNAT 规则集文件: ipnat_rules="/etc/ipnat.rules" 大型 LAN 中的 <acronym>NAT</acronym> 对于在一个 LAN 中有大量 PC, 以及包含多个 LAN 的情形, 把所有的内网 IP 地址都映射到同一个公网 IP 上会导致资源不够的问题, 因为同一个端口可能在许多做了 NAT 的 LAN PC 上被多次使用, 并导致碰撞。 有两种方法来缓解这个难题。 指定使用哪些端口 普通的 NAT 规则类似于: map dc0 192.168.1.0/24 -> 0/32 上面的规则中, 包的源端口在包通过 IPNAT 时时不会发生变化的。 通过使用 portmap 关键字, 您可以要求 IPNAT 只使用一定范围内的端口地址。 比如说, 下面的规则将让 IPNAT 把源端口改为指定范围内的端口: map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000 使用 auto 关键字可以让配置变得更简单一些, 它会要求 IPNAT 自动地检测可用的端口并使用: map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto 使用公网地址池 对很大的 LAN 而言, 总有一天会达到这样一个临界值, 此时的 LAN 地址已经多到了无法只用一个公网地址表现的程度。 如果有可用的一块公网 IP 地址, 则可以将这些地址作为一个 地址池 来使用, 让 IPNAT 来从这些公网 IP 地址中挑选用于发包的地址, 并将其为这些包创建映射关系。 例如, 如果将下面这个把所有包都映射到同一公网 IP 地址的规则: map dc0 192.168.1.0/24 -> 204.134.75.1 稍作修改, 就可以用子网掩码来表达 IP 地址范围: map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0 或者用 CIDR 记法来指定的一组地址了: map dc0 192.168.1.0/24 -> 204.134.75.0/24 端口重定向 非常流行的一种做法是, 将 web 服务器、 邮件服务器、 数据库服务器以及 DNS 分别放到 LAN 上的不同的 PC 上。 这种情况下, 来自这些服务器的网络流量仍然应该被 NAT, 但必须有办法把进入的流量发到对应的局域网的 PC 上。 IPNAT 提供了 NAT 重定向机制来解决这个问题。 考虑下面的情况, 您的 web 服务器的 LAN 地址是 10.0.10.25, 而您的唯一的公网 IP 地址是 20.20.20.5, 则可以编写这样的规则: rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80 或者: rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80 另外, 也可以让 LAN 地址 10.0.10.33 上运行的 LAN DNS 服务器来处理公网上的 DNS 请求: rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp FTP 和 <acronym>NAT</acronym> FTP 是一个在 Internet 如今天这样为人所熟知之前就已经出现的恐龙, 那时, 研究机构和大学是通过租用的线路连到一起的, 而 FTP 则被用于在科研人员之间共享大文件。 那时, 数据的安全性并不是需要考虑的事情。 若干年之后, FTP 协议则被埋进了正在形成中的 Internet 骨干, 而它使用明文来交换用户名和口令的缺点, 并没有随着新出现的一些安全需求而得到改变。 FTP 提供了两种不同的风格, 即主动模式和被动模式。 两者的区别在于数据通道的建立方式。 被动模式相对而言要更加安全, 因为数据通道是由发起 ftp 会话的一方建立的。 关于 FTP 以及它所提供的不同模式, 在 进行了很好的阐述。 IP<acronym>NAT</acronym> 规则 IPNAT 提供了一个内建的 FTP 代理选项, 它可以在 NAT map 规则中指定。 它能够监视所有外发的 FTP 主动或被动模式的会话开始请求, 并动态地创建临时性的过滤器规则, 只打开用于数据通道的端口号。 这样, 就消除了 FTP 一般会给防火墙带来的, 需要大范围地打开高端口所可能带来的安全隐患。 下面的规则可以处理来自内网的 FTP 访问: map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp 这个规则能够处理来自网关的 FTP 访问: map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp 这个则处理所有来自内网的非 FTP 网络流量: map dc0 10.0.10.0/29 -> 0/32 FTP map 规则应该在普通的 map 规则之前出现。 所有的包会从最上面的第一个规则开始进行检查。 匹配的顺序是网卡名称, 内网源 IP 地址, 以及它是否是 FTP 包。 如果所有这些规则都匹配成功, 则 FTP 代理将建立一个临时的过滤规则, 以便让 FTP 会话的数据包能够正常出入, 同时对这些包进行 NAT。 所有的 LAN 数据包, 如果没有匹配第一条规则, 则会继续尝试匹配下面的规则, 并最终被 NAT IP<acronym>NAT</acronym> FTP 过滤规则 如果使用了 NAT FTP 代理, 则只需要为 FTP 创建一个规则。 如果没有使用 FTP 代理, 则需要下面三个规则: # Allow out LAN PC client FTP to public Internet # Active and passive modes pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state # Allow out passive mode data channel high order port numbers pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state # Active mode let data channel in from FTP server pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state IPFW 防火墙 IPFW 这一节的内容正在撰写中。 其内容可能不总是十分准确。 IPFIREWALL (IPFW) 是一个由 &os; 发起的防火墙应用软件, 它由 &os; 的志愿者成员编写和维护。 它使用了传统的无状态规则和规则编写方式, 以期达到简单状态逻辑所期望的目标。 标准的 &os; 安装中, IPFW 所给出的规则集样例 (可以在 /etc/rc.firewall 中找到) 非常简单, 建议不要不加修改地直接使用。 该样例中没有使用状态过滤, 而该功能在大部分的配置中都是非常有用的, 因此这一节并不以系统自带的样例作为基础。 IPFW 的无状态规则语法, 是由一种提供复杂的选择能力的技术支持的, 这种技术远远超出了一般的防火墙安装人员的知识水平。 IPFW 是为满足专业用户, 以及掌握先进技术的电脑爱好者们对于高级的包选择需求而设计的。 要完全释放 IPFW 的规则所拥有的强大能力, 需要对不同的协议的细节有深入的了解, 并根据它们独特的包头信息来编写规则。 这一级别的详细阐述超出了这本手册的范围。 IPFW 由七个部分组成, 其主要组件是内核的防火墙过滤规则处理器, 及其集成的数据包记帐工具、 日志工具、 用以触发 NAT 工具的 'divert' (转发) 规则、 高级特殊用途工具、 dummynet 流量整形机制, 'fwd rule' 转发工具, 桥接工具, 以及 ipstealth 工具。 启用 IPFW IPFW 启用 IPFW 是基本的 &os; 安装的一部分, 以单独的可加载内核模块的形式提供。 如果在 rc.conf 中加入 firewall_enable="YES" 语句, 就会自动地加载对应的内核模块。 除非您打算使用由它提供的 NAT 功能, 一般情况下并不需要把 IPFW 编进 &os; 的内核。 如果将 firewall_enable="YES" 加入到 rc.conf 中并重新启动系统, 则下列信息将在启动过程中, 以高亮的白色显示出来: ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled 可加载内核模块在编译时加入了记录日志的能力。 要启用日志功能, 并配置详细日志记录的限制, 需要在 /etc/sysctl.conf 中加入一些配置。 这些设置将在重新启动之后生效: net.inet.ip.fw.verbose=1 net.inet.ip.fw.verbose_limit=5 内核选项 内核选项 IPFIREWALL 内核选项 IPFIREWALL_VERBOSE 内核选项 IPFIREWALL_VERBOSE_LIMIT IPFW 内核选项 把下列选项在编译 &os; 内核时就加入, 并不是启用 IPFW 所必需的, 除非您需要使用 NAT 功能。 这里只是将这些选项作为背景知识来介绍。 options IPFIREWALL 这个选项将 IPFW 作为内核的一部分来启用。 options IPFIREWALL_VERBOSE 这个选项将启用记录通过 IPFW 的匹配了包含 'log' 关键字规则的每一个包的功能。 options IPFIREWALL_VERBOSE_LIMIT=5 以每项的方式, 限制通过 &man.syslogd.8; 记录的包的个数。 如果在比较恶劣的环境下记录防火墙的活动可能会需要这个选项。 它能够避免潜在的针对 syslog 的洪水式拒绝服务攻击。 内核选项 IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_DEFAULT_TO_ACCEPT 这个选项默认地允许所有的包通过防火墙, 如果您是第一次配置防火墙, 使用这个选项将是一个不错的主意。 options IPV6FIREWALL options IPV6FIREWALL_VERBOSE options IPV6FIREWALL_VERBOSE_LIMIT options IPV6FIREWALL_DEFAULT_TO_ACCEPT 这些选项与 IPv4 的对应选项功能一样, 它们是针对 IPv6 的。 如果不使用 IPv6, 则不带任何规则的 IPV6FIREWALL 将阻止所有的 IPv6 包。 内核选项 IPDIVERT options IPDIVERT 这一选项启用 NAT 功能。 如果内核选项中没有加入 IPFIREWALL_DEFAULT_TO_ACCEPT, 或将您的防火墙设置配置为允许所有的进入包, 则所有发到本机或发出的包都会被阻止。 <filename>/etc/rc.conf</filename> Options 启用防火墙: firewall_enable="YES" 要选择由 &os; 提供的几种防火墙类型中的一种来作为默认配置, 您需要阅读 /etc/rc.firewall 文件并选出合适的类型, 然后在 /etc/rc.conf 中加入类似下面的配置: firewall_type="open" 您还可以指定下列配置规则之一: open — 允许所有流量通过。 client — 只保护本机。 simple — 保护整个网络。 closed — 完全禁止除回环设备之外的全部 IP 流量。 UNKNOWN — 禁止加载防火墙规则。 filename — 到防火墙规则文件的绝对路径。 有两种加载自定义 ipfw 防火墙规则的方法。 其一是将变量 firewall_type 设为包含不带 &man.ipfw.8; 命令行选项的 防火墙规则 文件的完整路径。 下面是一个简单的规则集例子: add block in all add block out all 除此之外, 也可以将 firewall_script 变量设为包含 ipfw 命令的可执行脚本, 这样这个脚本会在启动时自动执行。 与前面规则集文件等价的规则脚本如下: #!/bin/sh ipfw -q flush ipfw add block in all ipfw add block out all 如果 firewall_type 设为 clientsimple, 则还应查看在 /etc/rc.firewall 中的默认规则, 以确认它们与所在机器的配置相一致。 此外, 请注意这一章中的例子均假定 firewall_script/etc/ipfw.rules 启用日志: firewall_logging="YES" 设置 firewall_logging 的唯一作用是, 系统将把 net.inet.ip.fw.verbose sysctl 变量置为 1 (参见 )。 并没有能够设置日志限制的 rc.conf 变量, 不过这种限制可以通过设置某些 sysctl 变量来完成, 可以手工进行操作, 也可以写到 /etc/sysctl.conf 文件中: net.inet.ip.fw.verbose_limit=5 如果您的计算机是作为网关使用的, 也就是它通过 &man.natd.8; 提供网络地址翻译 (NAT), 请参见 以了解需要在 /etc/rc.conf 中配置的选项。 IPFW 命令 ipfw ipfw 命令是在防火墙运行时, 用于在其内部规则表中手工逐条添加或删除防火墙规则的标准工具。 这一方法的问题在于, 一旦您的关闭计算机或停机, 则所有增加或删除或修改的规则也就丢掉了。 把所有的规则都写到一个文件中, 并在启动时使用这个文件来加载规则, 或一次大批量地替换防火墙规则, 那么推荐使用这里介绍的方法。 ipfw 的另一个非常实用的功能是将所有正在运行的防火墙规则显示出来。 IPFW 的记账机制会为每一个规则动态地创建计数器, 用以记录与它们匹配的包的数量。 在测试规则的过程中, 列出规则及其计数器是了解它们是否工作正常的重要手段。 按顺序列出所有的规则: &prompt.root; ipfw list 列出所有的规则, 同时给出最后一次匹配的时间戳: &prompt.root; ipfw -t list 列出所有的记账信息、 匹配规则的包的数量, 以及规则本身。 第一列是规则的编号, 随后是发出包匹配的数量, 进入包的匹配数量, 最后是规则本身。 &prompt.root; ipfw -a list 列出所有的动态规则和静态规则: &prompt.root; ipfw -d list 同时显示已过期的动态规则: &prompt.root; ipfw -d -e list 将计数器清零: &prompt.root; ipfw zero 只把规则号为 NUM 的计数器清零: &prompt.root; ipfw zero NUM IPFW 规则集 规则集是一组根据包中选择的数值使用 allow 或 deny 写出的 ipfw 规则。 在两个主机之前的双向包交换组成了一次会话交互。 防火墙规则集, 会对同一个包处理两次: 第一次是包从公网上到达防火墙时, 而第二次则是包返回 Internet 公网上的主机时。 每一个 TCP/IP 服务 (例如 telnet, www, mail, 等等), 都有事先定义好的协议, 以及一个端口号。 这可以作为建立允许或阻止规则时的基本选择依据。 IPFW 规则处理顺序 当有数据包进入防火墙时, 会从规则集里的第一个规则开始进行比较, 并自顶向下地进行匹配。 当包与某个选择规则参数相匹配时, 将会执行规则所定义的动作, 并停止规则集搜索。 这种策略, 通常也被称作 最先匹配者获胜 的搜索方法。 如果没有任何与包相匹配的规则, 那么它就会根据强制的 ipfw 默认规则, 也就是 65535 号规则截获。 一般情况下这个规则是阻止包, 而且不给出任何回应。 如果规则定义的动作是 countskiptotee 规则的话, 搜索会继续。 这里所介绍的规则, 都是使用了那些包含状态功能的, 也就是 'keep state'、 'limit'、 'in'/'out'、 或者 'via' 选项的规则。 这是编写包容式防火墙规则集所需的基本框架。 包容式防火墙只允许与规则匹配的包通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 在操作防火墙规则时应谨慎行事, 如果操作不当, 有可能将自己反锁在外面。 规则语法 IPFW 规则语法 这里所介绍的规则语法已经经过了简化, 只包括了建立标准的包容式防火墙规则集所必需的那些。 要了解完整的规则语法说明, 请参见 &man.ipfw.8; 联机手册。 规则是由关键字组成的: 这些关键字必须以特定的顺序从左到右书写。 下面的介绍中, 关键字使用粗体表示。 某些关键字还包括了子选项, 这些子选项本身可能也是关键字, 有些还可以包含更多的子选项。 # 用于表示开始一段注释。 它可以出现在一个规则的后面, 也可以独占一行。 空行会被忽略。 CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL CMD 每一个新的规则都应以 add 作为前缀, 它表示将规则加入内部表。 RULE_NUMBER 每一个规则都必须包含一个规则编号。 ACTION 每一个规则可以与下列的动作之一相关联, 所指定的动作将在进入的数据包与规则所指定的选择标准相匹配时执行。 allow | accept | pass | permit 这些关键字都表示允许匹配规则的包通过防火墙, 并停止继续搜索规则。 check-state 根据动态规则表检查数据包。 如果匹配, 则执行规则所指定的动作, 亦即生成动态规则; 否则, 转移到下一个规则。 check-state 规则没有选择标准。 如果规则集中没有 check-state 规则, 则会在第一个 keep-state 或 limit 规则处, 对动态规则表实施检查。 deny | drop 这两个关键字都表示丢弃匹配规则的包。 同时, 停止继续搜索规则。 LOGGING log or logamount 当数据包与带 log 关键字的规则匹配时, 将通过名为 SECURITY 的 facility 来把消息记录到 syslogd。 只有在记录的次数没有超过 logamount 参数所指定的次数时, 才会记录日志。 如果没有指定 logamount, 则会以 sysctl 变量 net.inet.ip.fw.verbose_limit 所指定的限制为准。 如果将这两种限制值之一指定为零, 则表示不作限制。 万一达到了限制数, 可以通过将规则的日志计数或包计数清零来重新启用日志, 请参见 ipfw reset log 命令来了解细节。 日志是在所有其他匹配条件都验证成功之后, 在针对包实施最终动作 (accept, deny) 之前进行的。 您可以自行决定哪些规则应启用日志。 SELECTION 这一节所介绍的关键字主要用来描述检查包的哪些属性, 用以判断包是否与规则相匹配。 下面是一些通用的用于匹配包特征的属性, 它们必须按顺序使用: udp | tcp | icmp 也可以指定在 /etc/protocols 中所定义的协议。 这个值定义的是匹配的协议, 在规则中必须指定它。 from src to dst from 和 to 关键字用于匹配 IP 地址。 规则中必须同时指定源和目的两个参数。 如果需要匹配任意 IP 地址, 可以使用特殊关键字 any。 还有一个特殊关键字, 即 me, 用于匹配您的 &os; 系统上所有网络接口上所配置的 IP 地址, 它可以用于表达网络上的其他计算机到防火墙 (也就是本机), 例如 'from me to any' 或 'from any to me' 或 'from 0.0.0.0/0 to any' 或 'from any to 0.0.0.0/0' 或 'from 0.0.0.0 to any' 或 'from any to 0.0.0.0' 以及 'from me to 0.0.0.0'。 IP 地址可以通过 带点的 IP 地址/掩码长度, 或者一个带点的 IP 地址的形式来指定。 这是编写规则时所必需的。 如果不清楚如何写掩码长度, 请参见 port number 这个参数主要用于那些支持端口号的协议 (例如 TCP 和 UDP)。 如果要通过端口号匹配某个协议, 就必须指定这个参数。 此外, 也可以通过服务的名字 (根据 /etc/services) 来指定服务, 这样会比使用数字指定端口号直观一些。 in | out 相应地, 匹配进入和发出的包。 这里的 in 和 out 都是关键字, 在编写匹配规则时, 必需作为其他条件的一部分来使用。 via IF 根据指定的网络接口的名称精确地匹配进出的包。 这里的 via 关键字将使得接口名称成为匹配过程的一部分。 setup 要匹配 TCP 会话的发起请求, 就必须使用它。 keep-state 这是一个必须使用的关键字。 在发生匹配时, 防火墙将创建一个动态规则, 其默认行为是, 匹配使用同一协议的、从源到目的 IP/端口 的双向网络流量。 limit {src-addr | src-port | dst-addr | dst-port} 防火墙只允许匹配规则时, 与指定的参数相同的 N 个连接。 可以指定至少一个源或目的地址及端口。 'limit' 和 'keep-state' 不能在同一规则中同时使用。 'limit' 提供了与 'keep-state' 相同的功能, 并增加了一些独有的能力。 状态规则选项 IPFW 带状态过滤 有状态过滤将网络流量当作一种双向的包交换来处理。 它提供了一种额外的检查能力, 用以检测会话中的包是否来自最初的发送者, 并在遵循双向包交换的规则进行会话。 如果包与这些规则不符, 则将自动地拒绝它们。 'check-state' 用来识别在 IPFW 规则集中的包是否符合动态规则机制的规则。 如果匹配, 则允许包通过, 此时防火墙将创建一个新的动态规则来匹配双向交换中的下一个包。 如果不匹配, 则将继续尝试规则集中的下一个规则。 动态规则机制在 SYN-flood 攻击下是脆弱的, 因为这种情况会产生大量的动态规则, 从而耗尽资源。 为了抵抗这种攻击, 从 &os; 中加入了一个叫做 limit 的新选项。 这个选项可以用来限制符合规则的会话允许的并发连接数。 如果动态规则表中的规则数超过限制, 则包将被丢弃。 记录防火墙消息 IPFW 记录日志 记录日志的好处是显而易见的: 它提供了在事后检查所发生的状况的方法, 例如哪些包被丢弃了, 这些包的来源和目的地, 从而为您提供找到攻击者所需的证据。 即使启用了日志机制, IPFW 也不会自行生成任何规则的日志。 防火墙管理员需要指定规则集中的哪些规则应该记录日志, 并在这些规则上增加 log 动作。 一般来说, 只有 deny 规则应记录日志, 例如对于进入的 ICMP ping 的 deny 规则。 另外, 复制默认的 ipfw 终极 deny 规则, 并加入 log 动作来作为您的规则集的最后一条规则也是很常见的用法。 这样, 您就能看到没有匹配任何一条规则的那些数据包。 日志是一把双刃剑, 如果不谨慎地加以利用, 则可能会陷入过多的日志数据中, 并导致磁盘被日志塞满。 将磁盘填满是 DoS 攻击最为老套的手法之一。 由于日志除了会写入磁盘之外, 还会输出到 root 的控制台屏幕上, 因此有过多的日志信息是很让人恼火的事情。 IPFIREWALL_VERBOSE_LIMIT=5 内核选项将限制同一个规则发到系统日志程序 syslogd 的连续消息的数量。 当内核启用了这个选项时, 某一特定规则所产生的连续消息的数量将封顶为这个数字。 一般来说, 没有办法从连续 200 条一模一样的日志信息中获取更多有用的信息。 举例来说, 如果同一个规则产生了 5 次消息并被记录到 syslogd, 余下的相同的消息将被计数, 并像下面这样发给 syslogd: last message repeated 45 times 所有记录的数据包包消息, 默认情况下会最终写到 /var/log/security 文件中, 后者在 /etc/syslog.conf 文件里进行了定义。 编写规则脚本 绝大多数有经验的 IPFW 用户会创建一个包含规则的文件, 并且, 按能够以脚本形式运行的方式来书写。 这样做最大的一个好处是, 可以大批量地刷新防火墙规则, 而无须重新启动系统就能够激活它们。 这种方法在测试新规则时会非常方便, 因为同一过程在需要时可以多次执行。 作为脚本, 您可以使用符号替换来撰写那些经常需要使用的值, 并用同一个符号在多个规则中反复地表达它。 下面将给出一个例子。 这个脚本使用的语法同 'sh'、 'csh' 以及 'tcsh' 脚本兼容。 符号替换字段使用美元符号 $ 作为前缀。 符号字段本身并不使用 $ 前缀。 符号替换字段的值必须使用 "双引号" 括起来。 可以使用类似下面的规则文件: ############### start of example ipfw rules script ############# # ipfw -q -f flush # Delete all rules # Set defaults oif="tun0" # out interface odns="192.0.2.11" # ISP's DNS server IP address cmd="ipfw -q add " # build rule prefix ks="keep-state" # just too lazy to key this each time $cmd 00500 check-state $cmd 00502 deny all from any to any frag $cmd 00501 deny tcp from any to any established $cmd 00600 allow tcp from any to any 80 out via $oif setup $ks $cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks $cmd 00611 allow udp from any to $odns 53 out via $oif $ks ################### End of example ipfw rules script ############ 这就是所要做的全部事情了。 例子中的规则并不重要, 它们主要是用来表示如何使用符号替换。 如果把上面的例子保存到 /etc/ipfw.rules 文件中, 您就可以通过输入下面的命令来加载它。 &prompt.root; sh /etc/ipfw.rules /etc/ipfw.rules 这个文件可以放到任何位置, 也可以命名为随便什么别的名字。 也可以手工执行下面的命令来达到类似的目的: &prompt.root; ipfw -q -f flush &prompt.root; ipfw -q add check-state &prompt.root; ipfw -q add deny all from any to any frag &prompt.root; ipfw -q add deny tcp from any to any established &prompt.root; ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state &prompt.root; ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state &prompt.root; ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state 带状态规则集 以下的这组非-NAT 规则集, 是如何编写非常安全的 '包容式' 防火墙的一个例子。 包容式防火墙只允许匹配了 pass 规则的包通过, 而默认阻止所有的其他数据包。 必须有至少两个网络接口, 并且在其上配置了规则才能使防火墙正常工作。 所有类 &unix; 操作系统, 也包括 &os;, 都设计为允许使用网络接口 lo0 和 IP 地址 127.0.0.1 来完成操作系统内部的通讯。 防火墙必须包含一组规则, 使这些数据包能够无障碍地收发。 接入 Internet 公网的那个网络接口上, 应该配置授权和访问控制, 来限制对外的访问, 以及来自 Internet 公网的访问。 这个接口很可能是您的 ppp 接口, 例如 tun0, 或者您接在 DSL 或电缆 modem 上的网卡。 如果有至少一个网卡接入了防火墙后的内网 LAN, 则必须为这些接口配置规则, 以便让这些接口之间的包能够顺畅地通过。 所有的规则应被组织为三个部分, 所有应无阻碍地通过的规则, 公网的发出规则, 以及公网的接收规则。 公网接口相关的规则的顺序, 应该是最经常用到的放在尽可能靠前的位置, 而最后一个规则, 则应该是阻止那个接口在那一方向上的包。 发出部分的规则只包含一些 'allow' 规则, 允许选定的那些唯一区分协议的端口号所指定的协议通过, 以允许访问 Internet 公网上的这些服务。 所有的规则中都指定了 proto, port, in/out, via 以及 keep state 这些选项。 'proto tcp' 规则同时指定 'setup' 选项, 来区分开始协议会话的包, 以触发将包放入 keep state 规则表中的动作。 接收部分则首先阻止所有不希望的包, 在这里有两个目的。 首先是, 这些包被禁止掉之后, 就不会由于匹配了后面的某个规则而被允许。 其次, 明确地禁止这些包, 就不会再在日志中记录它们而形成干扰。 防火墙的最后一条规则是阻止并记录所有包, 这样, 您就可以留下用于起诉攻击您的系统的人的有用记录。 另一件需要注意的事情是, 不希望的数据包一般来说不会有任何响应, 这些数据包会被丢弃并消失。 这样, 攻击者也就无法了解他的数据包是否到达了您的系统。 而攻击者了解的信息越少, 它们攻陷系统所需的时间也就越长。 当记录的包使用的端口号不是您所熟悉的那些时, 可以看一看 /etc/services/ 或到 并查找一下端口号, 以了解其用途。 另外, 您也可以在这个网页上了解常见木马所使用的端口: 包容式规则集的例子 下面是一个非-NAT 的规则集, 它是一个完整的包容式规则集。 使用它作为您的规则集不会有什么问题。 只需把那些不需要的服务对应的 pass 规则注释掉就可以了。 如果您在日志中看到消息, 而且不想再看到它们, 只需在接收部分增加一个一个 deny 规则。 您可能需要把 'dc0' 改为接入公网的接口的名字。 对于使用用户态 ppp 的用户而言, 应该是 'tun0'。 您可以看出这些规则中的模式。 所有请求 Internet 公网上服务的会话开始包, 都使用了 keep-state。 所有来自 Internet 的授权服务请求, 都采用了 limit 选项来防止洪水式攻击。 所有的规则都使用了 in 或者 out 来说明方向。 所有的规则都使用了 via 接口名来指定应该匹配通过哪一个接口的包。 这些规则都应放到 /etc/ipfw.rules ################ Start of IPFW rules file ############################### # Flush out the list before we begin. ipfw -q -f flush # Set rules command prefix cmd="ipfw -q add" pif="dc0" # public interface name of NIC # facing the public Internet ################################################################# # No restrictions on Inside LAN Interface for private network # Not needed unless you have LAN. # Change xl0 to your LAN NIC interface name ################################################################# #$cmd 00005 allow all from any to any via xl0 ################################################################# # No restrictions on Loopback Interface ################################################################# $cmd 00010 allow all from any to any via lo0 ################################################################# # Allow the packet through if it has previous been added to the # the "dynamic" rules table by a allow keep-state statement. ################################################################# $cmd 00015 check-state ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network or from this gateway server # destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # x.x.x.x must be the IP address of your ISP.s DNS # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file $cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state $cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state # Allow out access to my ISP's DHCP server for cable/DSL configurations. # This rule is not needed for .user ppp. connection to the public Internet. # so you can delete this whole group. # Use the following rule and check log for IP address. # Then put IP address in commented out rule & delete first rule $cmd 00120 allow log udp from any to any 67 out via $pif keep-state #$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state # Allow out non-secure standard www function $cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state # Allow out secure www function https over TLS SSL $cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state # Allow out send & get email function $cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state $cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state # Allow out FBSD (make install & CVSUP) functions # Basically give user root "GOD" privileges. $cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root # Allow out ping $cmd 00250 allow icmp from any to any out via $pif keep-state # Allow out Time $cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state # Allow out nntp news (i.e. news groups) $cmd 00270 allow tcp from any to any 119 out via $pif setup keep-state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) $cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state # Allow out whois $cmd 00290 allow tcp from any to any 43 out via $pif setup keep-state # deny and log everything else that.s trying to get out. # This rule enforces the block all by default logic. $cmd 00299 deny log all from any to any out via $pif ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Deny all inbound traffic from non-routable reserved address spaces $cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect $cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Deny public pings $cmd 00310 deny icmp from any to any in via $pif # Deny ident $cmd 00315 deny tcp from any to any 113 in via $pif # Deny all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 $cmd 00320 deny tcp from any to any 137 in via $pif $cmd 00321 deny tcp from any to any 138 in via $pif $cmd 00322 deny tcp from any to any 139 in via $pif $cmd 00323 deny tcp from any to any 81 in via $pif # Deny any late arriving packets $cmd 00330 deny all from any to any frag in via $pif # Deny ACK packets that did not match the dynamic rule table $cmd 00332 deny tcp from any to any established in via $pif # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP.s DHCP server as it.s the only # authorized source to send this packet type. # Only necessary for cable or DSL configurations. # This rule is not needed for .user ppp. type connection to # the public Internet. This is the same IP address you captured # and used in the outbound section. #$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state # Allow in standard www function because I have apache server $cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2 # Allow in secure FTP, Telnet, and SCP from public Internet $cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2 # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID & PW are passed over public # Internet as clear text. # Delete this sample group if you do not have telnet server enabled. $cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2 # Reject & Log all incoming connections from the outside $cmd 00499 deny log all from any to any in via $pif # Everything else is denied by default # deny and log all packets that fell through to see what they are $cmd 00999 deny log all from any to any ################ End of IPFW rules file ############################### 一个 <acronym>NAT</acronym> 和带状态规则集的例子 NAT 以及 IPFW 要使用 IPFW 的 NAT 功能, 还需要进行一些额外的配置。 除了其他 IPFIREWALL 语句之外, 还需要在内核编译配置中加上 'option IPDIVERT' 语句。 /etc/rc.conf 中, 除了普通的 IPFW 配置之外, 还需要加入: natd_enable="YES" # Enable NATD function natd_interface="rl0" # interface name of public Internet NIC natd_flags="-dynamic -m" # -m = preserve port numbers if possible 将带状态规则与转发 natd 规则 (网络地址转换) 会使规则集的编写变得非常复杂。 check-state 的位置, 以及 'divert natd' 规则将变得非常关键。 这样一来, 就不再有简单的顺序处理逻辑流程了。 提供了一种新的动作类型, 称为 'skipto'。 要使用 skipto 命令, 就必须给每一个规则进行编号, 以确定 skipto 规则号是您希望跳转到的位置。 下面给出了一些未加注释的例子来说明如何编写这样的规则, 用以帮助您理解包处理规则集的处理顺序。 处理流程从规则文件最上边的第一个规则开始处理, 并自顶向下地尝试每一个规则, 直到找到匹配的规则, 且数据包从防火墙中放出为止。 请注意规则号 100 101, 450, 500, 以及 510 的位置非常重要。 这些规则控制发出和接收的包的地址转换过程, 这样它们在 keep-state 动态表中的对应项中就能够与内网的 LAN IP 地址关联。 另一个需要注意的是, 所有的 allow 和 deny 规则都指定了包的方向 (也就是 outbound 或 inbound) 以及网络接口。 最后, 请注意所有发出的会话请求都会请求 skipto rule 500 以完成网络地址转换。 下面以 LAN 用户使用 web 浏览器访问一个 web 页面为例。 Web 页面使用 80 来完成通讯。 当包进入防火墙时, 规则 100 并不匹配, 因为它是发出而不是收到的包。 它能够通过规则 101, 因为这是第一个包, 因而它还没有进入动态状态保持表。 包最终到达规则 125, 并匹配该规则。 最终, 它会通过接入 Internet 公网的网卡发出。 这之前, 包的源地址仍然是内网 IP 地址。 一旦匹配这个规则, 就会触发两个动作。 keep-state 选项会把这个规则发到 keep-state 动态规则表中, 并执行所指定的动作。 动作是发到规则表中的信息的一部分。 在这个例子中, 这个动作是 "skipto rule 500"。 规则 500 NAT 包的 IP 地址, 并将其发出。 请务必牢记, 这一步非常重要。 接下来, 数据包将到达目的地, 之后返回并从规则集的第一条规则开始处理。 这一次, 它将与规则 100 匹配, 其目的 IP 地址将被映射回对应的内网 LAN IP 地址。 其后, 它会被 check-state 规则处理, 进而在暨存会话表中找到对应项, 并发到 LAN。 数据包接下来发到了内网 LAN PC 上, 而后者则会发送从远程服务器请求下一段数据的新数据包。 这个包会再次由 check-state 规则检查, 并找到发出的表项, 并执行其关联的动作, 即 'skipto 500'。 包跳转到规则 500 并被 NAT 后发出。 在接收一侧, 已经存在的会话的数据包, 会被 check-state 规则自动地处理, 并放到转发 natd 规则。 我们需要解决的问题是, 阻止所有的坏数据包, 而只允许授权的服务。 例如在防火墙上运行了 Apache 服务, 而我们希望人们在访问 Internet 公网的同时, 也能够访问本地的 web 站点。 新的接入开始请求包将匹配规则 100, 而 IP 地址则为防火墙所在的服务器而映射到了 LAN IP。 此后, 包会匹配所有我们希望检查的那些令人生厌的东西, 并最终匹配规则 425。 一旦发生匹配, 会发生两件事。 数据包会被发到 keep-state 动态表, 但此时, 所有来自那个源 IP 的会话请求的数量会被限制为 2。 这一做法能够挫败针对指定端口上服务的 DoS 攻击。 动作同时指定了包应被发到 LAN 上。 包返回时, check-state 规则会识别出包属于某一已经存在的会话交互, 并直接把它发到规则 500 做 NAT, 并发到发出接口。 示范规则集 #1: #!/bin/sh cmd="ipfw -q add" skip="skipto 500" pif=rl0 ks="keep-state" good_tcpo="22,25,37,43,53,80,443,110,119" ipfw -q -f flush $cmd 002 allow all from any to any via xl0 # exclude LAN traffic $cmd 003 allow all from any to any via lo0 # exclude loopback traffic $cmd 100 divert natd ip from any to any in via $pif $cmd 101 check-state # Authorized outbound packets $cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks $cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks $cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks $cmd 130 $skip icmp from any to any out via $pif $ks $cmd 135 $skip udp from any to any 123 out via $pif $ks # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster $cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Authorized inbound packets $cmd 400 allow udp from xx.70.207.54 to any 68 in $ks $cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1 $cmd 450 deny log ip from any to any # This is skipto location for outbound stateful rules $cmd 500 divert natd ip from any to any out via $pif $cmd 510 allow ip from any to any ######################## end of rules ################## 下面的这个规则集基本上和上面一样, 但使用了易于读懂的编写方式, 并给出了相当多的注解, 以帮助经验较少的 IPFW 规则编写者更好地理解这些规则到底在做什么。 示范规则集 #2: #!/bin/sh ################ Start of IPFW rules file ############################### # Flush out the list before we begin. ipfw -q -f flush # Set rules command prefix cmd="ipfw -q add" skip="skipto 800" pif="rl0" # public interface name of NIC # facing the public Internet ################################################################# # No restrictions on Inside LAN Interface for private network # Change xl0 to your LAN NIC interface name ################################################################# $cmd 005 allow all from any to any via xl0 ################################################################# # No restrictions on Loopback Interface ################################################################# $cmd 010 allow all from any to any via lo0 ################################################################# # check if packet is inbound and nat address if it is ################################################################# $cmd 014 divert natd ip from any to any in via $pif ################################################################# # Allow the packet through if it has previous been added to the # the "dynamic" rules table by a allow keep-state statement. ################################################################# $cmd 015 check-state ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network or from this gateway server # destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # x.x.x.x must be the IP address of your ISP's DNS # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file $cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state # Allow out access to my ISP's DHCP server for cable/DSL configurations. $cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep-state # Allow out non-secure standard www function $cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state # Allow out secure www function https over TLS SSL $cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state # Allow out send & get email function $cmd 060 $skip tcp from any to any 25 out via $pif setup keep-state $cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state # Allow out FreeBSD (make install & CVSUP) functions # Basically give user root "GOD" privileges. $cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root # Allow out ping $cmd 080 $skip icmp from any to any out via $pif keep-state # Allow out Time $cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state # Allow out nntp news (i.e. news groups) $cmd 100 $skip tcp from any to any 119 out via $pif setup keep-state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) $cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state # Allow out whois $cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state # Allow ntp time server $cmd 130 $skip udp from any to any 123 out via $pif keep-state ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster $cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Deny ident $cmd 315 deny tcp from any to any 113 in via $pif # Deny all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 $cmd 320 deny tcp from any to any 137 in via $pif $cmd 321 deny tcp from any to any 138 in via $pif $cmd 322 deny tcp from any to any 139 in via $pif $cmd 323 deny tcp from any to any 81 in via $pif # Deny any late arriving packets $cmd 330 deny all from any to any frag in via $pif # Deny ACK packets that did not match the dynamic rule table $cmd 332 deny tcp from any to any established in via $pif # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP's DHCP server as it's the only # authorized source to send this packet type. # Only necessary for cable or DSL configurations. # This rule is not needed for 'user ppp' type connection to # the public Internet. This is the same IP address you captured # and used in the outbound section. $cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep-state # Allow in standard www function because I have Apache server $cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2 # Allow in secure FTP, Telnet, and SCP from public Internet $cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2 # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID & PW are passed over public # Internet as clear text. # Delete this sample group if you do not have telnet server enabled. $cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2 # Reject & Log all unauthorized incoming connections from the public Internet $cmd 400 deny log all from any to any in via $pif # Reject & Log all unauthorized out going connections to the public Internet $cmd 450 deny log all from any to any out via $pif # This is skipto location for outbound stateful rules $cmd 800 divert natd ip from any to any out via $pif $cmd 801 allow ip from any to any # Everything else is denied by default # deny and log all packets that fell through to see what they are $cmd 999 deny log all from any to any ################ End of IPFW rules file ############################### diff --git a/zh_CN.GB2312/books/handbook/install/chapter.sgml b/zh_CN.GB2312/books/handbook/install/chapter.sgml index bec8e396b3..f967048324 100644 --- a/zh_CN.GB2312/books/handbook/install/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/install/chapter.sgml @@ -1,4488 +1,4471 @@ Jim Mock 结构、组织重整, 部分重写 Randy Pratt sysinstall 操作流程、屏幕抓图以及一般性文件 安装 FreeBSD 概述 installation FreeBSD 提供了一个以文字为主,简单好用的安装程序,叫做 sysinstall 。这是 FreeBSD 默认使用的安装程序; 厂商如果想,也可以提供适合自己需要的安装程序。本章说明如何使用 sysinstall 来安装 FreeBSD。 学习完本章之后,您将会知道: 如何制作 FreeBSD 安装磁盘 FreeBSD如何参照及分割您的硬盘 如何启动 sysinstall. 在执行 sysinstall 时您将要回答的问题、 问题代表什么意义,以及该如何回答它们。 在阅读本章之前,您应该: 阅读您要安装的 FreeBSD 版本所附的硬件支持列表以确定您的硬件有没有被支持。 一般来说,此安装说明是针对 &i386; (PC 兼容机) 体系结构的电脑。如果有其它体系结构(如Alpha)的安装说明, 我们将一并列出。虽然本文档经常保持更新, 但有可能与您安装版本上所带的说明文档有些许出入。 在这里建议您使用本说明文章作为一般性的安装指导参考手册。 硬件需求 最小配置 安装 &os; 所需的最小硬件配置, 随 &os; 版本和硬件架构不同而有所不同。 关于安装所需的最低硬件配置信息, 可以在 &os; 网站的 发行版信息 部分中的 安装说明书 中找到。在接下来的几节中, 给出了这些信息的一些总结。随您安装 &os; 的方式不同, 可能需要使用软驱或为 &os; 支持的 CDROM 驱动器, 有时候也可能需要的是一块网卡。 这将在 中进行介绍。 &os;/&arch.i386; 和 &os;/&arch.pc98; &os;/&arch.i386; 和 &os;/&arch.pc98; 版本, 都需要 486 或更高的处理器,以及至少 24 MB 的 RAM。 您需要至少 150 MB 的空闲硬盘空间, 才能完成最小的安装配置。 对于老旧的硬件而言, 多数时候, 装配更多的 RAM 和腾出更多的硬盘空间, 要比使用更快的处理器更有用。 &os;/&arch.alpha; Alpha 要安装 &os;/&arch.alpha;, 您使用的必须是某种受支持的平台 (参见 ) 而且 &os; 必须独占一个硬盘。目前 &os; 还无法与其它操作系统共享磁盘。 这个磁盘必须接在 SRM 固件支持的 SCSI 控制器上,或者如果您机器上的 SRM 支持从 IDE 硬盘启动,则应装到 IDE 硬盘上。 ARC Alpha BIOS SRM 此外您还需要用于您的平台 SRM 控制台固件。有时,可以在 AlphaBIOS (或 ARC) 固件和 SRM 之间切换。如果没有, 则需要从制造商网站上下载并安装新的固件。 对于 Alpha 的支持, 从 &os; 7.0 版本开始已经不再提供。 &os; 6.X 系列发行版, 是最后一批支持这种硬件平台的版本。 &os;/&arch.amd64; 有两类处理器同时能够支持运行 &os;/&arch.amd64;。 第一种是 AMD64 处理器, 包括 &amd.athlon;64、 &amd.athlon;64-FX、 &amd.opteron; 以及更高级别的处理器。 能够使用 &os;/&arch.amd64; 的另一种处理器是包含了采用 &intel; EM64T 架构支持的处理器。 这类处理器包括 &intel; &core; 2 Duo、 Quad、 以及 Extreme 系列处理器, 以及 &intel; &xeon; 3000、 5000、 和 7000 系列处理器。 如果您的计算机使用 nVidia nForce3 Pro-150, 则 必须 使用 BIOS 配置, 禁用 IO APIC。 如果您没有找到这样的选项, 可能就只能转而禁用 ACPI 了。 Pro-150 芯片组存在一个 bug, 目前我们还没有找到绕过这一问题的方法。 &os;/&arch.sparc64; 要安装 &os;/&arch.sparc64;, 必须使用它支持的平台 (参见 )。 &os;/&arch.sparc64; 需要独占一块磁盘。 目前还没有办法与其它操作系统共享一块磁盘。 支持的硬件 支持的硬件列表, 会作为 &os; 发行版本的 &os; 兼容硬件说明提供。 这个文档通常可以在 CDROM 或 FTP 安装文件的顶级目录找到, 它的名字是 HARDWARE.TXT, 此外, 在 sysinstall 的 documentation 菜单也可以找到。它针对特定的硬件架构列出了 &os; 已知支持的硬件。 不同发行版本和架构上的硬件支持列表,可以在 &os; 网站的 发行版信息 页面上找到。 安装前的准备工作 列出您电脑的硬件清单 在安装 FreeBSD 之前,您应该试着将您电脑中的硬件清单列出来。 FreeBSD 安装程序会将这些硬件(磁盘、网卡、光驱等等) 以及型号及制造厂商列出来。FreeBSD 也会尝试为这些设备找出最适当的 IRQ 及 IO 端口的设定。但是因为 PC 的硬件种类实在太过复杂, 这个步骤不一定总是能成功。这时, 您就可能需要手动更改有问题的设备的设定值。 如果您已经安装了其它的操作系统,如 &windows; 或 Linux, 那么您可以先由这些系统所提供的工具来查看您的设备设定值是怎么分配的。 如果您真的没办法确定某些接口卡用什么设定值,那么您可以检查看看, 说不定它的设定已经标示在卡上。常用的 IRQ 号码为 3、5 以及 7; IO 端口的值通常以 16 进制位表示,例如 Ox330。 我们建议您在安装 FreeBSD 之前把这些信息打印或记录下来,做成表格 的样子也许会比较有帮助,例如: 硬件设备清单 设备名 IRQ IO 端口号 备注 第一块硬盘 N/A N/A 40 GB,Seagate 制造,第一个 IDE 接口主设备 CDROM N/A N/A 第一个 IDE 接口从设备 第二块硬盘 N/A N/A 20 GB,IBM 制造, 第二个 IDE 接口主设备 第一个 IDE 控制器 14 0x1f0 网卡 N/A N/A &intel; 10/100 Modem N/A N/A &tm.3com; 56K faxmodem,位于 COM1 口
在清楚地了解了您计算机的配置之后, 需要检查它是否符合您希望安装的 &os; 版本的硬件需求。
备份您的数据 如果您的电脑上面存有重要的数据资料, 那么在安装 FreeBSD 前请确定您已经将这些资料备份了, 并且先测试这些备份文档是否有问题。FreeBSD 安装程序在要写入任何资料到您的硬盘前都会先提醒您确认, 一旦您确定要写入,那么以后就没有反悔的机会。 决定要将 FreeBSD 安装到哪里 如果您想让 FreeBSD 使用整个硬盘,那么请直接跳到下一节。 但是,如果您想让 FreeBSD 跟您已有的系统并存, 那么您必须对您数据存在硬盘的分布方式有深入的了解, 以及其所造成的影响。 &os;/&arch.i386; 体系结构的硬盘分配方式 一个 PC 硬盘可以被细分为许多块。 这些块被称为 partitions (分区)。 由于 &os; 内部也有分区的概念,如此命名很容易导致混淆, 因此我们在 &os; 中,将其称为磁盘 slice,或简称为 slices。 例如, FreeBSD 提供的用于操作 PC 磁盘分区的工具 fdisk 就将其称为 slice 而不是 partition。 由于设计的原因, 每个硬盘仅支持四个分区; 这些分区叫做 主分区(Primary partion)。 为了突破这个限制以便能使用更多的分区,就有了新的分区类型,叫做 扩展分区(Extended partition)。 一个硬盘可以拥有一个扩展分区。在扩展分区里可以建立许多个所谓的 逻辑分区(Logical partitions) 每个分区都有其独立的 分区号(partition ID), 用以区分每个分区的数据类型。FreeBSD 分区的分区号为 165 一般而言,每种操作系统都会有自己独特的方式来区别分区。 例如 DOS 及其之后的 &windows;, 会分配给每个主分区及逻辑分区一个 驱动器字符, 从 C: 开始。 FreeBSD 必须安装在主分区。FreeBSD 可以在这个分区上面存放系统数据或是您建立的任何文件。 然而,如果您有多个硬盘,您也可以在这些硬盘上(全部或部分)建立 FreeBSD 分区。在您安装 FreeBSD 的时候,必须要有一个分区可以给 FreeBSD 使用。 这个分区可以是尚未规划的分区, 或是已经存在且存有数据但您不再需要的分区。 如果您已经用完了您硬盘上的所有分区, 那么您必须使用其它操作系统所提供的工具 (如 DOS 或 &windows; 下的 fdisk) 来腾出一个分区给 FreeBSD 使用。 如果您的某个分区有多余的空间,您可以使用它。 但是使用前您需要先整理一下这些分区。 FreeBSD 最小安装需要约 100 MB 的空间,但是这仅是 非常 基本的安装, 几乎没有剩下多少空间可以建立您自己的文件。一个较理想的最小安装是 250 MB,不含图形界面;或是 350 MB 以上,包含图形界面。 如果您还需要安装其它的第三方厂商的套件, 那么将需要更多的硬盘空间。 您可以使用商业软件,例如 &partitionmagic; (硬盘分区魔术师) 或类似 GParted 这样的免费工具来调整分区尺寸,为 FreeBSD 腾出空间。 FreeBSD 光盘的 tools 目录包含两个免费的工具也可以完成这个工作: FIPS 以及 PResizer,它们的文档可以在同一目录中找到。 FIPSPResizer, 和 &partitionmagic; 能够改变 FAT16 以及 FAT32 分区的大小 — 它们可以在 &ms-dos; 以及 &windows; ME 系统中使用。 这些工具的说明文件可以在同一个目录下面找到。 &partitionmagic;GParted 都能改变 NTFS 分区的尺寸。 GParted 在许多 Live CD Linux 发行版, 如 SystemRescueCD 中均有提供。 目前已经有报告显示改变 µsoft; Vista 分区尺寸时会出现问题。 在进行此类操作时, 建议您准备一张 Vista 安装 CDROM。如同其他的磁盘维护操作一样, 强烈建议您事先进行备份。 不当的使用这些工具可能会删掉您硬盘上的数据资料! 在使用这些工具前确定您有最近的、没问题的备份数据。 使用已存在的分区 假设您只有一个 4GB 的硬盘,而且已经装了 &windows; 然后您将这个硬盘分成两个分区 C:D:,每个分区大小为 2 GB。在 C: 分区上存放有 1 GB 的数据、 D:分区上存放 0.5 GB 的数据。 这意味着您的盘上有两个分区,一个驱动器符号是一个分区 (如 c:、d:)。 您可以把所有存放在 D: 分区上的数据复制到 C: 分区, 这样就空出了一个分区(d:)给 FreeBSD 使用。 缩减已现在的分区 假设您只有一个 4 GB 的硬盘,而且已经装了 &windows;。 您在安装 &windows; 的时候把 4 GB 都给了 C: 分区,并且已经使用了 1.5 GB 的空间。您想将剩余空间中的 2 GB 给 FreeBSD 使用。 为了安装 FreeBSD,您必须从下面两种方式中选择一种: 备份 &windows; 的数据资料,然后重新安装 &windows;, 并给 &windows; 分配 2 GB 的空间。 使用上面提及的 &partitionmagic; 来整理或切割您的分区。 Alpha 体系结构的硬盘分配方式 Alpha 在 Alpha 上,您必须使用一整颗硬盘给 FreeBSD, 没有办法在同一个硬盘上跟其它操作系统共存。 根据不同的 Alpha 机器,您的硬盘可以是 SCSI 或 IDE 硬盘, 只要您的机器可以从这些硬盘开机就可以。 按照 Digital/Compaq 使用手册书写的惯例, 所有 SRM 输入的部分都用大写表示。 注意,SRM 大小写有别。 要想得知您硬盘的名称以及型号, 可以在 SRM console 提示符下使用 SHOW DEVICE 命令: >>>SHOW DEVICE dka0.0.0.4.0 DKA0 TOSHIBA CD-ROM XM-57 3476 dkc0.0.0.1009.0 DKC0 RZ1BB-BS 0658 dkc100.1.0.1009.0 DKC100 SEAGATE ST34501W 0015 dva0.0.0.0.1 DVA0 ewa0.0.0.3.0 EWA0 00-00-F8-75-6D-01 pkc0.7.0.1009.0 PKC0 SCSI Bus ID 7 5.27 pqa0.0.0.4.0 PQA0 PCI EIDE pqb0.0.1.4.0 PQB0 PCI EIDE 此范例使用 Digital Personal Workstation 433au 并且显示出此机器联接有三个硬盘。第一个是 CDROM,叫做 DKA0;另外两个是两个硬盘,分别叫做 DKC0DKC100 硬盘名称中有 DKx 字样的是 SCSI 硬盘。 例如 DKA100 表示是一个 SCSI 设备, 其 SCSI ID 为 1,位于第一个 SCSI 接口 (A)。 DKC300 表示一个 SCSI 硬盘, SCSI ID 为 3,位于第三个 SCSI 接口 (C)。设备名称 PKx 表示 SCSI 控制卡。由以上 SHOW DEVICE 指令的输出结果看来, SCSI 光盘也被视为是 SCSI 硬盘的一种。 IDE 硬盘的名称类似 DQx,而 PQx 则表示相对应的硬盘控制器。 收集您的网络配置相关资料 如果您想通过网络(FTP 或是 NFS)安装 FreeBSD, 那么您就必须知道您的网络配置信息。在安装 FreeBSD 的过程中将会提示您输入这些资料,以顺利完成安装过程。 使用以太网或电缆/DSL Modem 如果您通过局域网或是要通过网卡使用电缆/DSL 上网, 那么您必须准备下面的信息: IP 地址。 默认网关 IP 地址。 主机名称。 DNS 服务器的 IP 地址。 子网掩码。 如果您不知道这些信息, 您可以询问系统管理员或是您的网络服务提供者。 他们可能会说这些信息会由 DHCP 自动分配;如果这样的话,请记住这一点就可以了。 使用 Modem 连接 如果您由 ISP 提供的拨号服务上网,您仍然可以通过它安装 FreeBSD,只是会需要很长的时间。 您必须知道: 拨号到 ISP 的电话号码。 您的 modem 是连接到哪个 COM 端口。 您拨号到 ISP 所用的账号和密码。 检查 FreeBSD 发行勘误 虽然我们尽力确保每个 FreeBSD 发行版本的稳定性, 但偶尔也会有一些错误进入发行版。极少数情况下, 这些问题甚至可能会影响安装。 当发现和修正问题之后,它们会列在 FreeBSD 网站中的 FreeBSD 发行勘误 中。 在您安装之前,应该首先看一看这份勘误表,以了解可能存在的问题。 关于所有释出版本的信息,包括勘误表,可以在 FreeBSD 网站发行版信息 一节中找到。 准备安装介质 FreeBSD 可以通过下面任何一种安装介质进行安装: 安装介质 CDROM 或 DVD 在同一计算机上的 DOS 分区 SCSI 或 QIC 磁带 软盘 网络 通过防火墙的一个 FTP 站点,或使用 HTTP 代理。 NFS 服务器 一个指定的并行或串行接口 如果您购买了 FreeBSD 的 CD 或 DVD,那么您可以直接进入下一节 如果您还没有 FreeBSD 的安装文件,您应该回到 一节, 它介绍了如何准备所需要的安装介质。之后,您就可以回到这一节, 并从 继续。 准备引导介质 FreeBSD 的安装过程开始于将您的电脑开机进入 FreeBSD 安装环境 — -并非在其它的操作系统上运行一个程序。 计算机通常使用安装在硬盘上的操作系统进行引导, 也可以配置成使用一张bootable(可引导)的软盘进行启动。 大多数现代计算机都可以从光驱进行引导系统。 如果您有 FreeBSD 的安装光盘或 DVD(或者是您购买的, 或者是您自己准备的。)并且您的计算机可以从光驱进行启动 (通常在 BIOS 中会有 Boot Order 或类似的选项可以设置),那么您就可以跳过此小节。 因为 FreeBSD 光盘及 DVD 光盘都是可以引导的, 用它们开机您不用做什么特别的准备。 一般来说,要建立安装盘(软盘)请依照下列步骤: 获取开机软盘映像文件 开机软盘映像文件可以在您的安装介质的 floppies/ 目录下找到, 另外您也可以从下述网站的 floppies 目录下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/<架构名>/<版本>-RELEASE/floppies/. 将 <架构名><版本> 替换为您使用的计算机体系结构和希望安装的版本号。 例如,用于安装 &i386; 上的 &os;/&arch.i386; &rel.current;-RELEASE 的文件的地址, 应该是 软盘映像文件的扩展名是 .flp。 在 floppies/ 目录中包括了许多不同的映像文件, 随您安装的 FreeBSD 版本, 某些时候也随硬件的不同, 您需要使用的映像文件可能会有所不同。 您通常会需要四张软盘, 即 boot.flpkern1.flpkern2.flp, 以及 kern3.flp。 请查阅同一目录下的 README.TXT 文件以了解关于这些映像文件的最新信息。 您的 FTP 程序必须使用 二进制模式 来下载这些映 像文件。有些浏览器只会用 text (或ASCII ) 模式来传输数据, 用这些浏览器下载的映像文件做成的软盘将无法正常开机。 准备软盘 您必须为您下载的每一个映像文件准备一张软盘。 并且请避免使用到坏掉的软盘。 最简单的方式就是您先将这些软盘格式化, 不要相信所谓的已格式化的软盘。在 &windows; 下的格式化程序不会告诉您出现多少坏块, 它只是简单的标记它们为 bad 并且忽略它们。 根据建议您应该使用全新的软盘来存放安装程序。 如果您在安装 FreeBSD 的过程中造成当机、 冻结或是其它怪异现象,第一个要怀疑的就是引导软盘。 请用其它的软盘制作映像文件再试试看。 将映像文件写入软盘中 .flp 文件 并非 一般的文件,您不能直接将它们复制到软盘上。 事实上它是一张包含完整磁盘内容的映像文件。这表示您 不能 简单的使用 DOS 的 copy 命令将文件写到软盘上, 而必须使用特别的工具程序将映像文件直接写到软盘中。 DOS 如果您使用 &ms-dos; 或 &windows; 操作系统来制作引导盘, 那么您可以使用我们提供的 fdimage 程序来将映像文件写到软盘中。 如果您使用的是光盘,假设光盘的驱动器符号为 E:,那么请执行下面的命令: E:\> tools\fdimage floppies\boot.flp A: 重复上述命令以完成每个 .flp 文件的写入, 每换一个映像文件都必须更换软盘; 制作好的软盘请注明是使用哪个映像文件做的。 如果您的映像文件存放在不同的地方,请自行修改上面的指令指向您存放 .flp 文件的地方。要是您没有 FreeBSD 光盘, 您可以到 FreeBSD 的 FTP 站点 tools目录 中下载。 如果您在 &unix; 系统上制作软盘(例如其它 FreeBSD 机器), 您可以使用 &man.dd.1; 命令来将映像文件写到软盘中。 如果您用 FreeBSD,可以执行下面的命令: &prompt.root; dd if=boot.flp of=/dev/fd0 在 FreeBSD 中,/dev/fd0 指的是第一个软驱(即 A: 驱动器); /dev/fd1B: 驱动器,依此类推。其它的 &unix; 系统可能会用不同的的名称, 这时您就要查阅该系统的说明文件。 您现在可以安装 FreeBSD 了
开始安装 默认情况下, 安装过程并不会改变任何您硬盘中的数据, 除非您看到下面的讯息: Last Chance: Are you SURE you want continue the installation? If you're running this on a disk with data you wish to save then WE STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding! We can take no responsibility for lost disk contents! 在看到这最后的警告讯息前您都可以随时离开, 安装程序界面不会变更您的硬盘。如果您发现有任何设定错误, 这时您可以直接将电源关掉而不会造成任何伤害。 开机启动 引导 &i386; 系统 从电脑尚未开机开始说起 将电脑电源打开。刚开始的时候它应该会显示进入系统设置菜单或 BIOS 要按哪个键,常见的是 F2F10Del Alt S 。不论是要按哪个键,请按它进入 BIOS 设置画面。 有时您的计算机可能会显示一个图形画面,典型的做法是按 Esc 将关掉这个图形画面, 以使您能够看到必要的设置信息。 找到设置开机顺序的选项,它的标记为 Boot Order 通常会列出一些设备让您选择,例如:FloppyCDROMFirst Hard Disk 等等。 如果您要用软盘安装,请确定选到 floppy disk; 如果您要用光盘安装,请选择 CDROM。为了避免疑惑, 请参考您的主板说明手册。 储存设定并离开,系统应该会重新启动。 如果您用软盘安装,请将在 一节中制作好的第一张引导盘,里面包含kern.flp boot.flp 文件的那张盘, 放入软盘驱动器中。 如果您是从光盘安装, 那么开机后请将 FreeBSD 光盘放入光驱中。 如果您开机后如往常一样并没有从软盘或光盘引导,请检查: 是不是软盘或光盘太晚放入面错失开机引导时间。 如果是, 请将它们放入后重新开机。 BIOS 设定不对,请重新检查 BIOS 的设定。 您的 BIOS 不支持从这些安装介质引导。 FreeBSD 即将启动。如果您是从光盘引导, 您会见到类似下面的画面: Booting from CD-Rom... CD Loader 1.2 Building the boot loader arguments Looking up /BOOT/LOADER... Found Relocating the loader and the BTX Starting the BTX loader BTX loader 1.00 BTX version is 1.01 Console: internal video/keyboard BIOS CD is cd0 BIOS drive C: is disk0 BIOS drive D: is disk1 BIOS 639kB/261120kB available memory FreeBSD/i386 bootstrap loader, Revision 1.1 Loading /boot/defaults/loader.conf /boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d] \ 如果您从软盘启动, 则应看到类似下面的画面: Booting from Floppy... Uncompressing ... done BTX loader 1.00 BTX version is 1.01 Console: internal video/keyboard BIOS drive A: is disk0 BIOS drive C: is disk1 BIOS 639kB/261120kB available memory FreeBSD/i386 bootstrap loader, Revision 1.1 Loading /boot/defaults/loader.conf /kernel text=0x277391 data=0x3268c+0x332a8 | Insert disk labelled "Kernel floppy 1" and press any key... 请根据提示将 boot.flp 软盘取出, 插入 kern1.flp 这张盘, 然后按 Enter。 您只需从第一张软盘启动, 然后再需要时根据提示插入其他软盘就可以了。 不论是从软盘或光盘引导, 接下来都会进入 &os; 引导加载器菜单:
&os; Boot Loader Menu
您可以等待十秒, 或按 Enter
引导 Alpha 系统 Alpha 从电脑尚未打开电源开始。 打开电脑电源并等待屏幕上出现开机提示信息。 如您需要制作用于安装的软盘,请参考 , 将其中一张制作为第一片引导盘,其中包含 boot.flp。将这张软盘插进软驱, 并输入下列命令,以便从软盘启动 (请视实际情况修改命令中的软驱盘符): >>>BOOT DVA0 -FLAGS '' -FILE '' 如果您要从光盘引导, 请将光盘放入光驱中然后输入下列命令开始安装 (请视情况修改命令中的光驱盘符): >>>BOOT DKA0 -FLAGS '' -FILE '' 然后 FreeBSD 就会启动。如果您从软盘引导, 到某个阶段您会看到下面的信息: Insert disk labelled "Kernel floppy 1" and press any key... 此时应按照提示取出 boot.flp 软盘, 换上 kern1.flp 软盘, 然后按 Enter 键。 不论从软盘或光盘引导,您都会看到下面这段信息: Hit [Enter] to boot immediately, or any other key for command prompt. Booting [kernel] in 9 seconds... _ 您可以等待 10 秒或是按 Enter 跳过。 之后就会进入内核设定菜单。 引导 &sparc64; 多数 &sparc64; 系统均配置为从硬盘自动引导。 如果希望安装 &os;,就需要从网络或 CDROM 启动了, 这需要首先进入 PROM (OpenFirmware)。 要完成这项工作,首先需要重启系统,并等待出现引导消息。 具体的信息取决于您使用的型号,不过它应该会是类似下面这样: Sun Blade 100 (UltraSPARC-IIe), Keyboard Present Copyright 1998-2001 Sun Microsystems, Inc. All rights reserved. OpenBoot 4.2, 128 MB memory installed, Serial #51090132. Ethernet address 0:3:ba:b:92:d4, Host ID: 830b92d4. 如果您的系统此时开始了从硬盘引导的过程,则需要按下 L1A StopA , 或者在串口控制台上发送 BREAK (例如, 在 &man.tip.1; 或 &man.cu.1; 中是 ~#) 以便进入 PROM 提示符。 它应该是类似下面这样: ok ok {0} 这是在只有一颗 CPU 的系统上的提示。 这是用于 SMP 系统的选项, 这里的数字, 是系统中可用的 CPU 数量。 这时, 将 CDROM 插入驱动器, 并在 PROM 提示符后面, 输入 boot cdrom
查看设备探测的结果 前面屏幕显示的最后几百行字会存在缓冲区中以便您查阅。 要浏览缓冲区,您可以按下 Scroll Lock 键, 这会开启画面的卷动功能。然后您就可以使用方向键或 PageUpPageDown 键来上下翻阅。 再按一次 Scroll Lock 键将停止画面卷动。 在您浏览的时候会看到类似 的画面。 真正的结果依照您的电脑装置而有所不同。
典型的设备探测结果 avail memory = 253050880 (247120K bytes) Preloaded elf kernel "kernel" at 0xc0817000. Preloaded mfs_root "/mfsroot" at 0xc0817084. md0: Preloaded image </mfsroot> 4423680 bytes at 0xc03ddcd4 md1: Malloc disk Using $PIR table, 4 entries at 0xc00fde60 npx0: <math processor> on motherboard npx0: INT 16 interface pcib0: <Host to PCI bridge> on motherboard pci0: <PCI bus> on pcib0 pcib1:<VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0 pci1: <PCI bus> on pcib1 pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11 isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0 isa0: <iSA bus> on isab0 atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0 ata0: at 0x1f0 irq 14 on atapci0 ata1: at 0x170 irq 15 on atapci0 uhci0 <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci 0 usb0: <VIA 83572 USB controller> on uhci0 usb0: USB revision 1.0 uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr1 uhub0: 2 ports with 2 removable, self powered pci0: <unknown card> (vendor=0x1106, dev=0x3040) at 7.3 dc0: <ADMtek AN985 10/100BaseTX> port 0xe800-0xe8ff mem 0xdb000000-0xeb0003ff ir q 11 at device 8.0 on pci0 dc0: Ethernet address: 00:04:5a:74:6b:b5 miibus0: <MII bus> on dc0 ukphy0: <Generic IEEE 802.3u media interface> on miibus0 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xec00-0xec1f irq 9 at device 10. 0 on pci0 ed0 address 52:54:05:de:73:1b, type NE2000 (16 bit) isa0: too many dependant configs (8) isa0: unexpected small tag 14 orm0: <Option ROM> at iomem 0xc0000-0xc7fff on isa0 fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq2 on isa0 fdc0: FIFO enabled, 8 bytes threshold fd0: <1440-KB 3.5” drive> on fdc0 drive 0 atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0 atkbd0: <AT Keyboard> flags 0x1 irq1 on atkbdc0 kbd0 at atkbd0 psm0: <PS/2 Mouse> irq 12 on atkbdc0 psm0: model Generic PS/@ mouse, device ID 0 vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0 sc0: <System console> at flags 0x100 on isa0 sc0: VGA <16 virtual consoles, flags=0x300> sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0 sio0: type 16550A sio1 at port 0x2f8-0x2ff irq 3 on isa0 sio1: type 16550A ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 pppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode ppc0: FIFO with 16/16/15 bytes threshold plip0: <PLIP network interface> on ppbus0 ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master UDMA33 acd0: CD-RW <LITE-ON LTR-1210B> at ata1-slave PIO4 Mounting root from ufs:/dev/md0c /stand/sysinstall running as init on vty0
请仔细检查探测结果以确定 FreeBSD 找到所有您期望出现的设备。 如果系统没有找到设备, 则不会将其列出。 定制内核 能够让您为系统添加默认的 GENERIC 内核所不支持的设备, 如声卡等。 在 &os; 6.2 和更高版本中, 在探测完系统设备之后, 将显示 。 请使用光标键来选择国家或地区。 接着按 Enter, 系统将自动设置地区及键盘映射。 您也可以很容易地退出 sysinstall 程序并从头来过。
选择国家及地区菜单
选择离开 Sysinstall
在主界面使用方向键选择 Exit Install 您会看到 如下的信息: User Confirmation Requested Are you sure you wish to exit? The system will reboot (be sure to remove any floppies/CDs/DVDs from the drives). [ Yes ] No 如果 CDROM 还留在光驱里,而且选择了 &gui.yes;, 则安装程序将重新启动。 如果您是从软盘启动, 则在重启系统之前, 需要将 boot.flp 软盘取出。
介绍 Sysinstall sysinstall 是 FreeBSD 项目所提供的安装程序。它以 console(控制台)为主, 分为多个菜单及画面让您配置及控制安装过程。 sysinstall 菜单画面由方向键、 EnterTabSpace, 以及其它按键所控制。在主画面的 Usage 菜单有这些按键的说明。 要查看这些说明,请将光标移到 Usage 项目,然后 [Select] 按键被选择, ,然后按下 Enter 键。 安装画面的使用说明会显示出来,阅读完毕请按 Enter 键回到主画面。
选取 Sysinstall 主菜单的 Usage 项目
选择 Documentation(说明文件) 菜单 用方向键从主菜单选择 Doc 条目然后按 Enter键。
选择说明文件菜单
这将会进入说明文件菜单。
Sysinstall 说明文件菜单
阅读这些说明文件很重要。 要阅读一篇文章,请用方向键选取要阅读的文章然后按 Enter 键。阅读中再按一下 Enter 就会回到说明文件画面。 若要回到主菜单,用方向键选择 Exit 然后按下 Enter 键。
选择键盘对应(Keymap)菜单 如果要改变键盘按键的对应方式, 请在主菜单选取 Keymap 然后按 Enter 键。一般情况下不改变此项, 除非您使用了非标准键盘或非美国键盘。
Sysinstall 主菜单
您可以使用上下键移动到您想使用的键盘对应方式, 然后按下 Space 键以选取它;再按 Space 键可以取消选取。当您完成后, 请选择 &gui.ok; 然后按 Enter 键。 这一屏幕只显示出部分列表。选择 &gui.cancel; 按 Tab 键将使用默认的键盘对应, 并返回到主菜单
Sysinstall 键盘对应菜单
安装选项设置画面 选择 Options 然后按 Enter 键。
Sysinstall 主菜单
Sysinstall 选项设置
预设值通常可以适用于大部分的使用者,您并不需要改变它们。 版本名称要根据安装的版本进行变化。 目前选择项目的描述会在屏幕下方以蓝底白字显示。 注意其中有一个项目是 Use Defaults(使用默认值) 您可以由此项将所有的设定还原为预设值。 可以按下 F1 来阅读各选项的说明。 Q 键可以回到主画面。
开始进行标准安装 Standard(标准) 安装适用于那些 &unix; 或 FreeBSD 的初级使用者。用方向键选择 Standard 然后按 Enter 键可开始进入标准安装。
开始进行标准安装
分配磁盘空间 您的第一个工作就是要分配 FreeBSD 用的硬盘空间以便 sysinstall 先做好一些准备。 为了完成这个工作,您必须先对 FreeBSD 如何找到磁盘信息做一个了解。 BIOS 磁盘编号 当您在系统上安装配置 FreeBSD 之前, 有一个重要的事情一定要注意,尤其是当您有多个硬盘的时候。 DOS Microsoft Windows 在 pc 架构,当您跑像 &ms-dos; 或 µsoft.windows; 这种跟 BIOS 相关的操作系统的时候,BIOS 有能力改变正常的磁盘顺序, 然后这些操作系统会跟着 BIOS 做改变。这让使用者不一定非要有所谓的 primary master 硬盘开机。 许多人发现最简单而便宜备份系统的方式就是再去买一块一模一样的硬盘, 然后定期将数据从第一块硬盘复制到第二个硬盘,使用 GhostXCOPY。所以,当第一个硬盘死了, 或者是被病毒破坏,或者有坏轨道, 他们可以调整 BIOS 中的开机顺序而直接用第二块硬盘开机。 就像交换硬盘的数据线,但是无需打开机箱。 SCSI BIOS 比较昂贵,配有 SCSI 控制卡的系统通常可以延伸 BIOS 的功能来让 SCSI 设备 (可达七个) 达到类似改变顺序的功能。 习惯于使用这种方式的使用者可能会感到惊讶, 因为在 FreeBSD 中并非如此。FreeBSD 不会参考 BIOS, 而且也不知道所谓的 BIOS 逻辑磁盘对应 是怎么回事。这会让人感觉很疑惑, 明明就是一样的硬盘而且资料也完全从另一块复制过来的, 结果却没办法像以前那样用。 当使用 FreeBSD 以前,请将 BIOS 中的硬盘开机顺序调回正常的顺序, 并且以后不要再改变。 如果一定要交换硬盘顺序, 那请用硬件的方式, 打开机箱并调整调线。 范例:Bill 和 Fred 的安装历险 Bill 替 Fred 把旧的 Wintel 的机器装上了 FreeBSD。 他装了一台 SCSI 硬盘,ID 是 0,然后把 FreeBSD 装在上面。 Fred 开始使用他新的 FreeBSD 系统;但是过了几天, 他发现这旧的 SCSI硬盘发生了许多小问题。之后, 他就跟 Bill 说起这件事。 又过了几天,Bill 决定是该解决问题的时候了, 所以他从后面房间的硬盘 收藏 中找出了一个一模一样的硬盘,并且经过表面测试后显示这块硬盘没有问题。 因此,Bill 将它的 ID 调成 4,然后安装到 Fred 的机器, 并且将资料从磁盘 0 复制到磁盘 4。现在新硬盘装好了, 而且看起来好像一切正常;所以,Bill 认为现在应该可以开始用它了。 Bill 于是到 SCSI BIOS 中设定 SCSI ID 4 为开机盘,用磁盘 4 重新开机后,一切跑得很顺利。 继续用了几天后,Bill 跟 Fred 决定要来玩点新的: 该将 FreeBSD 升级了。Bill 将 ID 0 的硬盘移除 (因为有问题) 并且又从收藏区中拿了一块一样的硬盘来。然后他用 Fred 神奇的网络 FTP 磁盘将新版的 FreeBSD 安装在这块硬盘上; 安装过程没什么问题发生。 Fred 用了这新版本几天后,觉得它很适合用在工程部门… 是时候将以前放在旧系统的工作资料复制过来了。 因此, Fred 将 ID4 的 SCSI 硬盘 (里面有放着旧系统中复制过来的最新资料) mount 起来,结果竟然发现在 ID4 的硬盘上, 他以前的所有资料都不见了! 资料跑到哪里去了呢? 当初 Bill 将 ID0 硬盘的资料复制到 ID4 的时候, ID4 即成为一个 新的副本。 而当他调 SCSI BIOS 设定 ID4 为开机盘,想让系统从 ID4 开机, 这其实只是他自己笨,因为大部分的系统可以直接调 BIOS 而改变开机顺序, 但是 FreeBSD 却会把开机顺序还原成正常的模式,因此,Fred 的 FreeBSD 还是从原来那块 ID0 的硬盘开机的。所有的资料都还在那块硬盘上, 而不是在想象之中的 ID4 硬盘。 幸运的是, 在我们发现这件事的时候那些资料都还在, 我们将这些资料从最早的那块 ID0 硬盘取出来并交还给 Fred, 而 Bill 也由此了解到计算机计数是从 0 开始的。 虽然我们这里的例子使用 SCSI 硬盘, 但是相同的概念也可以套用在 IDE 硬盘上。 使用 FDisk 创建分区 如果不再做改变,数据将会写进硬盘。如果您犯了一个错误想重新开始, 请选择 sysinstall 安装程序的退出按钮(exit)。或按 U 键来 Undo 操作。 如果您的操作没有结果, 您总可以重新启动您的计算机来达到您的目的。 当您在 sysinstall 主菜单选择使用标准安装后,您会看到下面的信息: Message In the next menu, you will need to set up a DOS-style ("fdisk") partitioning scheme for your hard disk. If you simply wish to devote all disk space to FreeBSD (overwriting anything else that might be on the disk(s) selected) then use the (A)ll command to select the default partitioning scheme followed by a (Q)uit. If you wish to allocate only free space to FreeBSD, move to a partition marked "unused" and use the (C)reate command. [ OK ] [ Press enter or space ] 如屏幕指示,按 Enter 键, 然后您就会看到一个列表列出所有在探测设备的时候找到的硬盘。 范例显示的是有找到两个 IDE 硬盘的情形,这两个硬盘分别为 ad0ad2
选择要分区的硬盘
您可能正在奇怪,为什么 ad1 没有列出来? 为什么遗失了呢? 试想,如果您有两个 IDE 硬盘,一个是在第一个 Primary master, 一个是 Secondary master,这样会发生什么事呢? 如果 FreeBSD 依照找到的顺序来为他们命名,如 ad0ad1 那么就不会有什么问题。 但是,现在问题来了。如果您现在想在 primary slave 加装第三个硬盘, 那么这个硬盘的名称就会是 ad1,之前的 ad1 就会变成 ad2。 这会造成什么问题呢?因为设备的名称 (如 ad1s1a)是用来寻找文件系统的, 因此您可能会发现,突然,您有些文件系统从此无法正确地显示出来, 必须修改 FreeBSD 配置文件(译注:/etc/fstab)才可以正确显示。 为了解决这些问题,在配置内核的时候可以叫 FreeBSD 直接用 IDE 设备所在的位置来命名,而不是依据找到的顺序。使用这种方式的话, 在 secondary master 的 IDE 设备就 永远是 ad2,即使您的系统中没有 ad0ad1 也不受影响。 此为 FreeBSD 内核的默认值,这也是为什么上面的画面只显示 ad0ad2 的原因。 画面上这台机器的两颗硬盘是装在 primary 及 secondary 的 master 上面; 并没有任何一个硬盘安装在 slave 插槽上。 您应该选择您想安装 FreeBSD 的硬盘,然后按下 &gui.ok;。之后 FDisk 就会开始,您会看到类似 的画面。 FDisk 的显示画面分为三个部分。 第一部分是画面上最上面两行,显示的是目前所选择的硬盘的信息。 包含它的 FreeBSD 名称、硬盘分布以及硬盘的总容量。 第二部分显示的是目前选择的硬盘上有哪些分区, 每个分区的开始及结束位置、所占容量、FreeBSD 名称、 它们的描述以及类别(sub-type)。此范例显示有两个未使用的小分区, 还有一个大的 FAT 分区, (很可能是 &ms-dos; 或 &windows; 的 C: ), 以及一个扩展分区(在 &ms-dos; 或 &windows; 里面还可以包含逻辑分区)。 第三个部分显示 FDisk 中可用的命令。
典型的尚未编辑前的 Fdisk 分区表
接下来要做的事跟您要怎么给您的硬盘分区有关。 如果您要让 FreeBSD 使用整个硬盘(稍后您确认要 sysinstall 继续安装后会删除所有这个硬盘上的资料),那么您就可以按 A 键(Use Entire Disk ) 目前已有的分区都会被删除,取而代之的是一个小的,标示为 unused 的分区,以及一个大的 FreeBSD 分区。之后, 请用方向键将光标移到这个 FreeBSD 分区,然后按 S 以将此分区标记为启动分区。 您会看到类似 的画面。注意,在 Flags 栏中的 A 记号表示此分区是 激活 的, 因而启动将从此分区进行。 要删除现有的分区以便为 FreeBSD 腾出空间, 您可以将光标移动到要删除的分区后按 D 键。 然后就可按 C 键, 并在弹出的对话框中输入将要创建的分区的大小。 输入合适的大小后按 Enter 键。 一般而言, 这个对话框中的初始值是可以分配给该分区的最大值。 它可能是最大的邻接分区或未分配的整个硬盘大小。 如果您已经建立好给 FreeBSD 的分区 (使用像 &partitionmagic;类似的工具), 那么您可以按下 C 键来建立一个新的分区。同样的, 会有对话框询问您要建立的分区的大小。
Fdisk 分区使用整个硬盘
完成后,按 Q 键。您的变更会存在 sysinstall 中, 但是还不会真正写入您的硬盘。
安装多重引导 在这步骤您可以选择要不要安装一个多重引导管理器。 一般而言,如果碰到下列的情形, 您应该选择要安装多重引导管理程序。 您有一个以上的硬盘,并且 FreeBSD 并不是安装在第一个硬盘上。 除了 FreeBSD,您还有其它的操作系统安装在同一块硬盘上, 所以您需要在开机的时候选择要进入哪一个系统。 如果您在这台机器上只安装一个 FreeBSD 操作系统, 并且安装在第一个硬盘, 那么选择 Standard 安装就可以了。如果您已经使用了一个第三方的多重引导程序, 那么请选择 None 选择好配置后请按 Enter
Sysinstall 多重引导管理程序
按下 F1 键所显示的在线说明中有讨论一些操作系统共存可能发生的问题。
在其它硬盘上创建分区 如果您的系统上有一个以上的硬盘, 在选择完多重引导管理程序后会再回到选择硬盘的画面。 如果您要将 FreeBSD 安装在多个硬盘上,那么您可以在这里选择其它的硬盘, 然后重复使用 FDisk 来建立分区。 如果您想让 FreeBSD 来管理其它的硬盘, 那么两个硬盘都必须安装 FreeBSD 的多重引导管理程序。
离开选择硬盘画面
Tab 键可以在您最后选择的硬盘、 &gui.ok; 以及 &gui.cancel; 之间进行切换。 Tab 键将光标移动到 &gui.ok; 然后按 Enter 键继续安装过程。
使用 <application>bsdlabel</application> 创建分区 您现在必须在刚刚建立好的 slice 中规划一些 label。 请注意,每个 label 的代号是 ah,另外,习惯上 bcd 是有特殊用途的,不应该随意变动。 某些应用程序可以利用一些特殊的分区而达到较好的效果, 尤其是分区分散在不同的硬盘的时候。但是,现在您是第一次安装FreeBSD, 所以不需要去烦恼如何分割您的硬盘。最重要的是, 装好FreeBSD然后学习如何使用它。当您对FreeBSD有相当程度的熟悉后, 您可以随时重新安装FreeBSD,然后改变您分区的方式。 下面的范例中有四个分区 — 一个是磁盘交换分区,另外三个是文件系统。 为第一个硬盘分区 分区 文件系统 大小 描述 a / 512 MB 这是一个根文件系统(root filesystem)。 任何其它的文件系统都会 挂在根目录(译注:用根目录比较亲切) 下面。 512 MB 对于此目录来说是合理的大小, 因为您往后并不会在这里存放太多的数据; 在安装 FreeBSD 后会用掉约 128 MB 的根目录空间。 剩下的空间是用来存放临时文件用的,同时, 您也应该预留一些空间,因为以后的FreeBSD版本可能会需要较多的 /(根目录)空间。 b N/A 2-3 x RAM b 分区为系统磁盘交换分区 (swap space)。选择正确的交换空间大小可是一门学问唷。 一般来说,交换空间的大小应该是您系统上内存(RAM) 大小的2到3倍。 交换空间至少要有 64 MB。因此, 如果您的电脑上的 RAM 比 32 MB 小, 请将交换空间大小设为 64 MB。 如果您有一个以上的硬盘, 您可以在每个硬盘上都配置交换分区。FreeBSD 会利用每个硬盘上的交换空间,这样做能够提高 swap 的性能。 如果是这种情形, 先算出您总共需要的交换空间大小 (如128 MB),然后除以您拥有的硬盘数目(如2块), 算出的结果就是每个硬盘上要配置的交换空间的大小。 在这个例子中, 每个硬盘的交换空间为 64 MB。 e /var 256 MB 至 1024 MB /var 目录会存放不同长度的文件、 日志以及其它管理用途的文件。大部分这些文件都是 FreeBSD 每天在运行的时候会读取或是写入的。 当这些文件放在另外的文件系统(译注:即/var) 可以避免影响到其它目录下面类似的文件存取机制。 f /usr 剩下的硬盘空间 (至少 2 GB) 您所有的其它的文件通常都会存在/usr 目录以及其子目录下面。
上面例子中的数值仅限于有经验的用户使用。 通常我们鼓励用户使用 &os; 分区编辑器中一个叫做 Auto Defaults的自动分区布局功能。 如果您要将FreeBSD安装在一个以上的硬盘, 那么您必须在您配置的其它分区上再建立分区。 最简单的方式就是在每个硬盘上建立两个分区,一个是交换分区, 一个是文件系统分区。 为其它磁盘分区 分区 文件系统 大小 描述 b N/A 见描述 之前提过,交换分区是可以跨硬盘的。但是,即使 a 分区没有使用,习惯上还是会把交换分区放在 b 分区上。 e /diskn 剩下的硬盘空间 剩下的空间是一个大的分区,最简单的做法是将之规划为 a分区而不是e分区。然而, 习惯上a分区是保留给根目录 (/) 用的。您不一定要遵守这个习惯,但是 sysinstall 会, 所以照着它做会使您的安装比较清爽、干净。 您可以将这些文件系统挂在任何地方,本范例建议将它们挂在 /diskn 目录,n 依据每个硬盘而有所不同, 但是,您喜欢的话也可将它们挂在别的地方。
分区的配置完成后,您可以用sysinstall. 来建立它们了。您会看到下面的信息: Message Now, you need to create BSD partitions inside of the fdisk partition(s) just created. If you have a reasonable amount of disk space (200MB or more) and don't have any special requirements, simply use the (A)uto command to allocate space automatically. If you have more specific needs or just don't care for the layout chosen by (A)uto, press F1 for more information on manual layout. [ OK ] [ Press enter or space ] 按下 Enter 键开始FreeBSD分区表编辑器,称做 Disklabel 显示您第一次执行 Disklabel的画面。 画面分为三个区域。 前几行显示的是您正在编辑的硬盘以及您正在建立的 slice 位于哪个分区上。(在这里,Disklabel 使用的是 分区名称 而不是 slice 名)。 此画面也会显示 slice 还有多少空间可以使用;亦即,有多余的空间, 但是尚未指派分区。 画面中间区域显示已建立的区区,每个分区的文件系统名称、 所占的大小以及一些关于建立这些文件系统的参数选项。 下方的第三区显示在 Disklabel 中可用的按键。
Sysinstall Disklabel 编辑器
Disklabel 您可以自动配置分区以及给它们预设的大小。 这些默认的分区是由内部的分区尺寸算法根据磁盘的大小计算出的。 您可以按 A键使用此功能。您会看到类似 的画面。根据您硬盘的大小, 自动分配所配置的大小不一定合适。但是没有关系, 您并不一定要使用预设的大小。 默认情况下会给/tmp 目录一个独立分区,而不是附属在 / 之下。 这样可以避免将一些临时文件放到根目录中(译注: 可能会用完根目录空间)。
Sysinstall Disklabel 编辑器-使用自动配置
如果您不想使用默认的分区布局, 则需要用方向键移动光标并选中第一个分区, 然后按 D 来删除它。 重复这一过程直到删除了所有推荐的分区。 要建立第一个分区 (a,作为 / — 根文件系统), 请确认您已经在屏幕顶部选中了正确的 slice, 然后按 C。 接下来将出现一个对话框, 要求您输入新分区的尺寸 (如 所示)。 您可以输入以块为单位的尺寸,或以 M 表示MB、 G 结尾表示GB, 或者 C 表示柱面数的方式来表达尺寸。 - 从 FreeBSD 5.X 开始, 用户可以: - 使用 Custom Newfs - (Z) 选项来选择 - UFS2 (在 &os; 5.1 和更高版本中的默认值)。 - 用 Auto Defaults 来创建, - 然后用 Custom Newfs 选项, - 或在创建文件系统时指定 。 - 如果您使用了 Custom Newfs选项, - 不要忘记增加 来启用 SoftUpdates! -
根目录使用空间
如果使用此处显示的默认尺寸, 则会创建一个占满整个 slice 空余空间的 partition。如果希望使用前面例子中描述的 partition 尺寸, 则应按 Backspace 键删除这些数字, 并输入 512M, 如 所示。 然后, 按下 &gui.ok;。
编辑要分区大小
输入完大小后接着问您要建立的分区是文件系统还是交换空间,如 所示。第一个分区是文件系统, 所以确认选择 FS后按Enter 键。
选择根分区类型
最后,因为您要建立的是一个文件系统,所以必须告诉 Disklabel 这个文件系统要挂接在什么地方,如 所示。根文件系统的挂接点 /, 所以请输入 /,然后按 Enter键。
选择根挂接点
刚刚制作好的分区会显示在画面上。 您应该重复上述的动作以建立其它的分区。当建立交换空间的时候, 系统不会问您要将它挂接在哪里,因为交换空间是不用挂在系统上的。 当您在建立最后一个分区/usr的时候, 您可以直接使用默认的大小,即所有此分区剩余的空间。 您最终的 FreeBSD DiskLabel 编辑器画面会类似 , 实际数字按您的选择而有所不同。 按下 Q 键完成分区的建立。
Sysinstall Disklabel 编辑器
选择要安装的软件包 选择要安装的软件包 安装哪些软件包在很大程度上取决于系统将被用来做什么, 以及有多少可用的磁盘空间。内建的选项包括了运行所需要的最小系统, 到把所有软件包全都装上的常用配置。&unix; 或 FreeBSD 新手通常直接选择一个设定好的软件包就可以了, 而有经验的使用者则可以考虑自己订制安装哪些软件包。 按下 F1 可以看到有关软件包的更多选项信息, 以及它们都包含了哪些软件,之后,可以按 Enter 回到软件包选择画面。 如果您想要使用图形界面, 则必须选择软件包名称开头是 X 的那些软件包。 对于 X 服务器的配置, 以及选择默认的桌面管理器这样的工作必须在 &os; 安装完成之后才能作。 关于配置 X 服务器的更多资料可以在 找到。 默认安装的 X11 版本是 &xorg; 如果需要定制内核, 您还需要选择包含源代码的那个选项。 要了解为什么应该编译和构建新的内核, 请参见 显然, 包含所有组件的系统是最万能的。 如果磁盘空间足够, 用光标键选择 中的 All 并按 Enter。 如果担心磁盘空间不够的话, 则选择最合适的选项。 不要担心选择的是否是最合适的, 因为其他软件包可以在安装完毕后再加入进来。
选择软件包
安装ports软件包 当选择完您想要安装的部分后,接着会询问您要不要安装FreeBSD Ports 软件包;Ports软件包可以让您简单方便地安装软件包。Ports本身并不包含编辑 软件所需要的程序源代码,而是一个包含自动下载、编辑以及安装的文档集合。 一章讨论如何使用Ports. 安装程序并不会检查您是否有足够的硬盘空间, 在选择这一项之前请先确定您有足够的硬盘空间。 目前 FreeBSD &rel.current; 版本中, FreeBSD Ports Collection 大约占用 &ports.size; 大小的硬盘空间。 对于近期的版本您可能需要更多一些空间来安装他们。 User Confirmation Requested Would you like to install the FreeBSD Ports Collection? This will give you ready access to over &os.numports; ported software packages, at a cost of around &ports.size; of disk space when "clean" and possibly much more than that if a lot of the distribution tarballs are loaded (unless you have the extra CDs from a FreeBSD CD/DVD distribution available and can mount it on /cdrom, in which case this is far less of a problem). The Ports Collection is a very valuable resource and well worth having on your /usr partition, so it is advisable to say Yes to this option. For more information on the Ports Collection & the latest ports, visit: http://www.FreeBSD.org/ports [ Yes ] No 选择 &gui.yes; 将会安装 Ports Collection, 而选择 &gui.no; 则将跳过它。 选好后按 Enter 继续。 此后, 选择安装的软件包的屏幕将再次出现。
确认您要安装的软件包
如果对您的选择感到满意,请选择Exit 退出,确保&gui.ok; 被高亮显示,然后按Enter 继续。
选择您要使用的安装介质 如果要从 CDROM 或 DVD安装,使用方向键将光标移到 Install from a FreeBSD CD/DVD。确认 &gui.ok; 被选取,然后按 Enter 开始安装程序。 如果要使用其它的方式安装, 请选择适当的安装介质然后按照屏幕指示进行安装。 F1 可以显示安装介质的在线说明。按一下 Enter 可返回选择安装介质画面。
选择安装介质
FTP安装模式 installation network FTP 使用FTP安装,有三种方式:主动式(active)FTP、被动式(passive)FTP 或是透过HTTP代理服务器。 主动式FTP: 从FTP服务器安装 这个选项将会使所有的FTP传输使用 Active模式。 这将无法通过防火墙,但是可以使用在那些比较早期, 不支持被动模式的FTP站。如果您的连接在使用被动(默认值) 模式卡住了,请换主动模式看看! 被动模式FTP:通过防火墙从FTP服务器安装 FTP passive mode 此选项会让 sysinstall 使用 Passive模式来安装。这使得使用者可以穿过 不允许用非固定TCP PORTS连入的防火墙。 FTP 透过 HTTP 代理服务器: 透过HTTP代理服务器, 由 FTP 服务器安装 FTP via a HTTP proxy 此选项会让 sysinstall 通过HTTP协议 (像浏览器一样)连到proxy服务器。 proxy服务器会解释送出的请求,然后通知FTP服务器。 因为通过HTTP协议,所以可以穿过防火墙。 要用这种方式,您必须指定proxy服务器的地址。 对于一个 FTP 代理服务器而言, 通常在使用者登入名称中加入您要登入的服务器的用户名, 加在 @ 符号后面。然后代理服务器就会 假装 成一个真的服务器。例如,假设您要从 ftp.FreeBSD.org 安装,通过 FTP 代理服务器 foo.example.com, 使用1234端口。 在这种情况下,您可以到 options 菜单,将 FTP username 设为 ftp@ftp.FreeBSD.org,密码设为您的电子邮件地址。 安装介质部分,指定FTP (或是被动式 FTP,如果代理服务器支持的话) 以及URL为 ftp://foo.example.com:1234/pub/FreeBSD 因为ftp.FreeBSD.org/pub/FreeBSD 目录会被抓取到 foo.example.com之下,您就可以从 这台 机器 (会从 ftp.FreeBSD.org 抓取文件) 安装。
安装确认 到此为止,可以开始进行安装了, 这也是您避免更动到您的硬盘的最后机会。 User Confirmation Requested Last Chance! Are you SURE you want to continue the installation? If you're running this on a disk with data you wish to save then WE STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding! We can take no responsibility for lost disk contents! [ Yes ] No 选择 &gui.yes; 然后按下 Enter 确认安装 安装所需的时间会根据您所选择的软件、 安装介质以及您电脑的速度而有所不同。 在安装的过程中会有一些信息来显示目前的进度。 当您看到下面的信息表示已经安装完成了: Message Congratulations! You now have FreeBSD installed on your system. We will now move on to the final configuration questions. For any option you do not wish to configure, simply select No. If you wish to re-enter this utility after the system is up, you may do so by typing: /usr/sbin/sysinstall. [ OK ] [ Press enter or space ] 按下 Enter 以进行安装后的配置。 选择 &gui.no; 然后按 Enter 会取消安装,不会对您的系统造成更动。您会看到下面的信息: Message Installation complete with some errors. You may wish to scroll through the debugging messages on VTY1 with the scroll-lock feature. You can also choose "No" at the next prompt and go back into the installation menus to retry whichever operations have failed. [ OK ] 产生这个信息是因为什么东西也没有安装,按下 Enter 后会离开安装程序回到主安装界面。从主安装界面可以退出安装程序。 安装后的配置 安装成功后, 就可以进行进一步的配置了。 引导新安装的 FreeBSD 系统之后, 使用 - sysinstall (/stand/sysinstall - 如果您使用的是 &os; 5.2 之前的版本), 并选择 + sysinstall 并选择 Configure 配置网卡 如果您之前配置用 PPP 通过 FTP 安装,那么这个画面将不会出现; 正像所说的那样,您可以稍后再做配置。 如果想更多的了解网卡或将FreeBSD配置为网关或路由器,请参考 Advanced Networking 的相关文章。 User Confirmation Requested Would you like to configure any Ethernet or SLIP/PPP network devices? [ Yes ] No 如果要配置网卡,请选择 &gui.yes; 然后按 Enter。 否则请选择 &gui.no; 继续。
选择网卡设备
用方向键选择您要配置的网卡接口,然后按Enter User Confirmation Requested Do you want to try IPv6 configuration of the interface? Yes [ No ] 目录私人区域网络IP协议IPv4已经足够,所以选择 &gui.no; 然后按 Enter 如果想试试新的IP通信协议 IPv6 , 使用 RA 服务,请选择 &gui.yes; 然后按 Enter。 寻找 RA 服务器将会花费几秒的时间。 User Confirmation Requested Do you want to try DHCP configuration of the interface? Yes [ No ] 如果您不需要 DHCP (Dynamic Host Configuration Protocol 动态主机配置协议) ,选择 &gui.no; 然后按Enter 选择 &gui.yes; 会执行dhclient, 如果成功,它会自动将网络配置信息填上。更多的信息请参考 下面的网络配置显示了怎样把以太网设备配置成区域网络网关的角色。
配置 ed0接口
使用Tab 键可以在各个栏目之间进行切换,请输入适当 的信息: Host(机器名称) 完整的机器名称,例如本例中的 k6-2.example.com Domain(域名) 您机器所在的域名称,如本例的 example.com IPv4 Gateway(IPv4网关) 输入将数据包传送到远端网络的机器IP地址。 只有当机器是网络上的一个节点时才要输入。 如果这台机器要作为您局域网的网关, 请将此处设为空白。IPv4网关, 也被称作默认网关或默认路由器。 域名服务器 本地网络中的域名服务器的IP地址。 本例中假设机器所在的网络中没有域名服务器, 所以填入的是ISP提供的域名服务器地址 (208.163.10.2。) IPv4 地址 本机所使用的IP地址。本例为 192.168.0.1 子网掩码 在这个局域网中所使用的地址块是 192.168.0.0 - 192.168.0.255, 对应的子网掩码是 255.255.255.0 ifconfig 额外参数设定 任何ifconfig命令跟网卡接口有关的参数。 本范例中没有。 使用 Tab 键选择 &gui.ok;然后按 Enter键。 User Confirmation Requested Would you like to Bring Up the ed0 interface right now? [ Yes ] No 选择 &gui.yes; 然后按 Enter 将会将机器的网卡转为启用状态。 机器下次启动的时候即可使用。
配置网关 User Confirmation Requested Do you want this machine to function as a network gateway? [ Yes ] No 如果这台机器要作为本地网络和其它机器之间传送数据包的网关,请选择 &gui.yes; 然后按 Enter。 如果这台机器只是网络上的普通节点,请选择 &gui.no; 并按 Enter 继续。 配置网络服务 User Confirmation Requested Do you want to configure inetd and the network services that it provides? Yes [ No ] 如果选择 &gui.no;, 许多网络服务,如 telnetd 将不会启用。 这样, 远端用户将无法 telnet 进入这台机器。 本机上的用户还是可以 telnet到远端机器的。 这些服务可以在安装完成后修改/etc/inetd.conf 配置文件来启用它们。请参阅 以获得更多的信息。 如果您想现在就配置这些网络服务,请选择 &gui.yes;, 然后会看到下面的信息: User Confirmation Requested The Internet Super Server (inetd) allows a number of simple Internet services to be enabled, including finger, ftp and telnetd. Enabling these services may increase risk of security problems by increasing the exposure of your system. With this in mind, do you wish to enable inetd? [ Yes ] No 选择 &gui.yes; 继续。 User Confirmation Requested inetd(8) relies on its configuration file, /etc/inetd.conf, to determine which of its Internet services will be available. The default FreeBSD inetd.conf(5) leaves all services disabled by default, so they must be specifically enabled in the configuration file before they will function, even once inetd(8) is enabled. Note that services for IPv6 must be separately enabled from IPv4 services. Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to use the current settings. [ Yes ] No 选择 &gui.yes; 将允许您添加网络服务 (或将相应网络服务每行开头的 # 除掉即可。)
编辑 <filename>inetd.conf</filename>配置文件
在加入您想启用的服务后,按下 Esc键会出现一个 对话框可以让您离开以及保存修改。
启用 SSH 登录 SSH sshd User Confirmation Requested Would you like to enable SSH login? Yes [ No ] 选择 &gui.yes; 便会启用 &man.sshd.8;, 也就是 OpenSSH 服务程序。 它能够让您以安全的方式从远程访问机器。 如欲了解关于 OpenSSH 的进一步详情, 请参见 匿名 FTP FTP anonymous User Confirmation Requested Do you want to have anonymous FTP access to this machine? Yes [ No ] 不允许匿名 FTP访问 选择默认的 &gui.no; 并按下 Enter 键将仍然可以让在这台机器上有账号的用户访问 FTP。 允许匿名 FTP访问 如果您选择允许匿名 FTP 存取, 那么网络中任何人都可以使用FTP来访问您的机器。 在启用匿名访问之前应该考虑网络的安全问题。 如果要知道更多有关网络安全的信息, 请参阅 要启用FTP匿名访问,用方向键选择 &gui.yes; 并按 Enter键。 系统会给出进一步的确认信息: User Confirmation Requested Anonymous FTP permits un-authenticated users to connect to the system FTP server, if FTP service is enabled. Anonymous users are restricted to a specific subset of the file system, and the default configuration provides a drop-box incoming directory to which uploads are permitted. You must separately enable both inetd(8), and enable ftpd(8) in inetd.conf(5) for FTP services to be available. If you did not do so earlier, you will have the opportunity to enable inetd(8) again later. If you want the server to be read-only you should leave the upload directory option empty and add the -r command-line option to ftpd(8) in inetd.conf(5) Do you wish to continue configuring anonymous FTP? [ Yes ] No 这些信息会告诉您 FTP 服务还需要在 /etc/inetd.conf 中启用。 假如您希望允许匿名 FTP 连接, 请参见 。 选择 &gui.yes; 并按 Enter 继续; 系统将给出下列信息:
默认的匿名 FTP 配置
使用 Tab 在不同的信息字段之间切换, 并填写必要的信息: UID 用于分配给匿名 FTP 用户的用户 ID。 所有上传的文件的属主都将是这个 ID。 Group 匿名 FTP 用户所在的组。 Comment 用于在 /etc/passwd 中描述该用户的说明性信息。 FTP Root Directory 可供匿名 FTP 用户使用的文件所在的根目录。 Upload Subdirectory 匿名 FTP 用户上传的文件的存放位置。 默认的 FTP 根目录将放在 /var 目录下。 如果您的 /var 目录空间不足以应付您的FTP需求, 您可以将FTP的根目录改为 /usr 目录下的 /usr/ftp 目录。 当您对一切配置都满意后,请按 Enter 键继续。 User Confirmation Requested Create a welcome message file for anonymous FTP users? [ Yes ] No 如果您选择 &gui.yes; 并按下 Enter键, 系统会自动打开文本编辑器让您编辑FTP的欢迎信息。
编辑FTP欢迎信息
此文本编辑器叫做 ee。 按照指示修改信息文本或是稍后再用您喜爱的文本编辑器来修改。 请记住画面下方显示的文件位置。 Esc 将弹出一个默认为 a) leave editor的对话框。按 Enter 退出并继续。再次按 Enter 将保存修改。
配置网络文件系统 网络文件系统 (NFS) 可以让您可以在网络上共享您的文件。 一台机器可以配置成NFS服务器、客户端或两者并存。请参考 以获得更多的信息。 NFS 服务器 User Confirmation Requested Do you want to configure this machine as an NFS server? Yes [ No ] 如果您不想安装网络文件系统,请选择 &gui.no; 然后按 Enter键。 如果您选择 &gui.yes; 将会出现一个对话框提醒您必须先建立一个 exports 文件。 Message Operating as an NFS server means that you must first configure an /etc/exports file to indicate which hosts are allowed certain kinds of access to your local filesystems. Press [Enter] now to invoke an editor on /etc/exports [ OK ] Enter 键继续。系统会启动文本编辑器让您编辑 exports 文件。
编辑 <filename>exports</filename>文件
按照指示加入真实输出的文件目录或是稍后用您喜爱的编辑器自行编辑。 请记下画面下方显示的文件名称及位置。 按下 Esc 键会出现一具对话框,默认选项是 a) leave editor。按下 Enter 离开并继续。
NFS 客户端 NFS 客户端允许您的机器访问NFS服务器。 User Confirmation Requested Do you want to configure this machine as an NFS client? Yes [ No ] 按照您的需要,选择 &gui.yes; 或 &gui.no; 然后按 Enter
配置系统终端 系统提供了几个选项可以让您配置终端的表现方式。 User Confirmation Requested Would you like to customize your system console settings? [ Yes ] No 要查阅及配置这些选项,请选择 &gui.yes; 并按Enter
系统终端配置选项
最常用的选项就是屏幕保护程序了。使用方向键将光标移动到 Saver 然后按 Enter
屏幕保护程序选项
选择您想使用的屏幕保护程序,然后按 Enter。 之后回到系统终端配置画面。 默认开启屏幕保护程序的时间是300秒。如果要更改此时间,请再次选择 Saver 。然后选择 Timeout 并按 Enter键。系统会弹出一个对话框如下:
屏幕保护时间设置
您可以直接改变这个值,然后选 &gui.ok;并按 Enter 键回到系统终端配置画面。
退出系统终端配置
选择 Exit 然后按下 Enter 键会回到安装后的配置画面。
配置时区 配置您机器的时区可以让系统自动校正任何区域时间的变更, 并且在执行一些跟时区相关的程序时不会出错。 例子中假设此台机器位于美国东部的时区。 请参考您所在的地理位置来配置。 User Confirmation Requested Would you like to set this machine's time zone now? [ Yes ] No 选择 &gui.yes; 并按下 Enter键以配置时区。 User Confirmation Requested Is this machine's CMOS clock set to UTC? If it is set to local time or you don't know, please choose NO here! Yes [ No ] 这里按照您机器时间的配置,选择 &gui.yes; 或 &gui.no; 然后按 Enter
选择您所处的地理区域
请选择适当的区域然后按 Enter
选择您所在的国家
选择您所在的国家然后按 Enter
选择您所在的时区
选择您所在的时区然后按 Enter Confirmation Does the abbreviation 'EDT' look reasonable? [ Yes ] No 检查一下时区的缩写是否正确,如果没错,请按 Enter 返回系统安装后的配置画面。
Linux 兼容性 User Confirmation Requested Would you like to enable Linux binary compatibility? [ Yes ] No 选择 &gui.yes; 并按下Enter 键, 将允许您在FreeBSD中执行Linux的软件。安装程序会安装一些为了跟 Linux 兼容的软件包。 如果您是通过FTP安装,那么您必须连到网络上。 有时候FTP站并不会包含所有的安装软件包(例如Linux兼容软件包); 不过,稍后您还可以再安装这个项目。 配置鼠标 此选项可以让您在终端上使用三键鼠标剪贴文字。 如果您用的鼠标是两个按钮,请参考手册 &man.moused.8;; 以取得有关模拟三键鼠标的信息。范例中使用的鼠标不是USB接口。 (例如ps/2或com接口的鼠标): User Confirmation Requested Does this system have a PS/2, serial, or bus mouse? [ Yes ] No 如果您使用的是 PS/2、 串口或 Bus 鼠标,请选择 &gui.yes;, 如果是 USB 鼠标, 则应选择 &gui.no; 并按 Enter
选择鼠标类型
使用方向键选择 Type 然后按 Enter
设置鼠标协议
在这个例子中使用的类型是ps/2鼠标,所以可以使用默认的 Auto(自动) 。 您可以用方向键选择合适的项目,确定选择了 &gui.ok; 后按 Enter 键离开此画面。
配置鼠标端口
选择 Port 然后按 Enter
配置鼠标端口
假设这台机器用的是ps/2鼠标,您可以采用默认的 PS/2 选项。请选择适当的项目然后按 Enter
启动鼠标服务进程
选择Enable然后按 Enter 来启动和测试鼠标。
测试鼠标功能
鼠标指针可以在屏幕上移动,指明鼠标服务已经正常启用。那么请选择 &gui.yes; 按 Enter键。否则鼠标没 有配置成功 — 选择 &gui.no; 并尝试不同的配置 选项。 选择 Exit 并按 Enter 退回到系统安装完成后的配置画面。
安装预编译的软件包 (package) Package 是事先编译好的二进制文件, 因此, 这是安装软件的一种便捷的方式。 在这里作为例子我们将给出安装一个 package 所需的过程。 如果需要, 还可以在这一阶段加入其他 package。 安装完成之后, sysinstall 依然可以用来安装其他 package。 User Confirmation Requested The FreeBSD package collection is a collection of hundreds of ready-to-run applications, from text editors to games to WEB servers and more. Would you like to browse the collection now? [ Yes ] No 选择 &gui.yes; 并按 Enter 将进入 package 选择界面:
选择 Package 类别
在任何时候, 只有当前安装介质上存在的 package 才可以安装。 如果选择了 All 或某个特定的分类, 则系统会列出全部可用的 package。 用光标键移动光棒选中需要的 package, 并按 Enter 系统会显示可供选择的 package:
选择 Package
如图所示, 我们选择了 bash shell。 您可以根据需要使用 Space 键来勾选选定的 package。 在屏幕左下角会给出 package 的简短说明。 反复按下 Tab 键, 可以在最后选中的 package、 &gui.ok; 和 &gui.cancel; 之间来回切换。 当您把需要的 package 都标记为安装之后, 按一下 Tab 切换到 &gui.ok;, 随后按下 Enter 就可以回到 package 选择菜单了。 左右方向键可以用于在 &gui.ok; 和 &gui.cancel; 之间进行切换。 这种方法也可以用来选择 &gui.ok;, 随后按下 Enter 也可以回到 package 选择菜单。
安装预编译软件包
使用 Tab 和左右方向键选择 [ Install ] 并按 Enter。 接下来需要确认将要安装的预编译包:
确认将要安装的预编译包
选择 &gui.ok; 并按下 Enter 就可以开始预编译包的安装了。在这个过程中您会看到安装的相关信息, 直到安装完成为止。请留意观察是否有错误信息出现。 在完成预编译包的安装之后, 就进入了最后的配置阶段。 如果您没有选择任何预编译包, 并希望直接进入最后的配置阶段, 则可以选择 Install 来跳过。
添加用户和组 在安装系统的过程中, 您应添加至少一个用户, 以避免直接以 root 用户的身份登录。 用以保存其用户数据的根分区通常很小, 因此用 root 身份运行程序可能将其迅速填满。 下面的提示信息介绍了这样做可能带来的更大隐患: User Confirmation Requested Would you like to add any initial user accounts to the system? Adding at least one account for yourself at this stage is suggested since working as the "root" user is dangerous (it is easy to do things which adversely affect the entire system). [ Yes ] No 选择 &gui.yes; 并按 Enter 即可开始创建用户的过程。
选择用户
用箭头键来选择 User 然后按 Enter
添加用户信息
下面的描述信息会出现在屏幕的下方,可以使用 Tab 键来切换不同的项目,以便输入相关信息: Login ID 新用户的登录名(强制性必须写) UID 这个用户的ID编号(如果不写,系统自动添加) Group 这个用户的登录组名(如果不写,系统自动添加) Password 这个用户的密码(键入这个需要很仔细!) Full name 用户的全名(解释、备注) Member groups 这个用户所在的组 Home directory 用户的主目录(如果不写,系统自动添加) Login shell 用户登录的shell(默认是/bin/sh)。 你可以将登录 shell 由 /bin/sh 改为 /usr/local/bin/bash, 以便使用事先以 package 形式安装的 bash shell。不要使用一个不存在的或您不能登录的shell。 最通用的shell是使用 BSD-world 的 C shell, 可以通过指定/bin/tcsh来修改。 用户也可以被添加到 wheel 组中成了一个超级用户,从而拥有 root 权限。 当您感觉满意时,键入 &gui.ok; 键, 用户和组管理菜单将会重新出现。
退出用户和组管理
如果有其他的需要, 此时还可以添加其他的组。 此外, 还可以通过 - sysinstall (在 &os; 5.2 以前的版本中是 - /stand/sysinstall) 在安装完成之后添加它们。 + sysinstall 在安装完成之后添加它们。 当您完成添加用户的时候,选择Exit 然后键入Enter 继续下面的安装。
设置 <username>root</username> 密码 Message Now you must set the system manager's password. This is the password you'll use to log in as "root". [ OK ] [ Press enter or space ] 键入 Enter 来设置 root 密码。 密码必须正确地输入两次。 毋庸讳言, 您需要选择一个不容易忘记的口令。 请注意您输入的口令不会回显, 也不会显示星号。 New password: Retype new password : 密码成功键入后,安装将继续。 退出安装 如果您需要设置 其他网络设备, 或需要完成其他的配置工作, 可以在此时或者事后通过 sysinstall - (对于 &os; 5.2 之前的版本是 /stand/sysinstall) 来进行配置。 User Confirmation Requested Visit the general configuration menu for a chance to set any last options? Yes [ No ] 选择 &gui.no; 然后键入 Enter 返回到主安装菜单。
退出安装
选择 [X Exit Install] 然后键入 Enter。您可能需要确认是否真的退出安装: User Confirmation Requested Are you sure you wish to exit? The system will reboot (be sure to remove any floppies/CDs/DVDs from the drives). [ Yes ] No 选择 &gui.yes; 取出软盘。CDROM 驱动器将被锁定, 直到机器重新启动。CDROM 解锁后就可以取出光盘了。 此后系统将重新启动, 因此请留意是否会出现一些错误信息。 进一步的细节, 请参见
Tom Rhodes 原作 配置其他网络服务 如果之前缺少这一领域的经验, 那么配置网络服务对于新手而言, 很可能会是一件很有挑战的事情。 网络, 包括 Internet, 对于包括 &os; 在内的所有现代操作系统而言都至关重要。 因此, 首先对 &os; 提供的丰富的网络性能加以了解会很有帮助。 在安装过程中了解这些知识, 能够确保用户更好地理解他们可以用到的各种服务。 网络服务是一些可以接收来自网络上任何地方的人所提交的输入信息的程序。 人们一直都在努力确保这些程序不会做任何 有害的 事情。 不幸的是, 程序员们并不是十全十美的完人,因此,网络服务程序中的漏洞, 便有可能被攻击者利用来做一些坏事。因而, 只启用那些您知道自己需要的服务就很重要了。如果存在疑问, 那么就最好不要在您发现需要它之前启动任何网络服务。 您可以事后通过再次运行 sysinstall 或直接手工配置 /etc/rc.conf 来随时启用这些服务。 选择 Networking 选项将下显示一个类似下面的菜单:
网络配置之上层配置
第一个选项, Interfaces, 已经在前面的 中做过配置, 因此现在可以略过它。 选择 AMD 选项, 将添加对于 BSD 自动挂接程序的支持。 这个程序通常会和 NFS 协议 (详情参见下文) 配合使用,以便自动挂载远程文件系统。 启用它不需要在此时进行特殊的额外配置。 下一行是 AMD Flags 的参数选项。 选择它之后,会弹出一个让您选择 AMD 参数的子菜单。 菜单中包含一系列的选项: -a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map 选项用来设置默认的挂接位置,这里使用的是 /.amd_mnt目录。 指定默认的 日志 文件; 但是,当使用 syslogd 时,所有在日之中记录的活动, 都会发送到系统日志服务去。 /host 用来挂接远程主机上输出的文件系统,而 /net 目录则用来挂接从特定 IP 地址输出的文件系统。 /etc/amd.map 文件定义了用于 AMD 的默认输出选项。 FTP anonymous (匿名) Anon FTP 允许匿名 FTP 访问。 选中这个选项, 可以使这台机器成为一台匿名 FTP 服务器。 要注意启用这个选项的安全风险。 系统将使用另外的菜单来说明安全风险和进一步的配置。 Gateway 选项可以使将本机配置成为一台以前我们介绍过的网关。 如果您在安装过程中不小心选中了 Gateway, 也可以在这里用这个选项来取消。 Inetd 选项用来配置或完全禁用前面讨论过的 &man.inetd.8; 服务程序。 Mail 用来配置系统默认的 MTA 或邮件传输代理。 选择这个选项将出现下面的菜单:
选择默认的 MTA
这里给您提供了一个安装MTA 并将其配置为默认值的机会。MTA 是一种能够将邮件头递给本系统或互联网上的用户的邮件服务。 选择 Sendmail 将会安装十分流行的 sendmail 服务, 这也是 &os; 的默认配置。Sendmail local 选项表示将 sendmail 设为默认的 MTA,但禁止其从 Internet 上接收邮件的能力。 此外还有一些其他选项,PostfixEximSendmail 的功能类似。 它们两者也可以投递邮件; 不过, 有些用户会喜欢使用它们代替 sendmail MTA 选择 MTA 或决定不挑选 MTA 之后, 网络配置菜单的下一项将是 NFS client NFS client 客户端可以使系统通过 NFS 与服务器进行通信。 NFS 服务器通过 NFS 协议可以使其它在网络上的机器来访问自己的文件系统。 如果这台机器要作为一台独立的服务器,这个选项可以保留不选。 如果启用它, 您在之后还需要进行更多的其他配置; 请参见 以了解关于配置客户机和服务器的进一步详情。 接下来的 NFS server 选项, 可以让您将本机系统配置为 NFS 服务器。 这会自动将启动 RPC 远程过程调用的信息写入配置文件。 RPC 是一种在多个主机和程序之间进行连接组织的机制。 下一项是 Ntpdate 选项, 它能够处理时间同步。 当选择它后, 会出现一个像下面所似的菜单:
Ntpdate 配置
从这个菜单选择一个离您最近的服务器。 选择较近的服务器,有助于提高时间同步的精度, 因为较远的服务器的连接延迟可能会比较大。 下一个选项是 PCNFSD。 这个选项将安装第三方软件包 net/pcnfsd。 它可以用来为无法自行提供 NFS 认证服务的操作系统, 如微软的 &ms-dos; 提供服务。 滚屏到下一页看一下其它选项:
网络配置之下层配置
&man.rpcbind.8;, &man.rpc.statd.8; 和 &man.rpc.lockd.8; 这三个程序是用来提供远程过程调用 (RPC) 服务的。 rpcbind 程序管理 NFS 服务器和客户端的通信, 这是 NFS 正确工作的必要前提。rpc.statd 程序可以和其它主机上 rpc.statd 程序交互, 以提供状态监控。这些状态报告默认情况下会保存到 /var/db/statd.status 文件中。 最后的一项是 rpc.lockd 选项, 如果启用,则将提供文件上锁服务。通常将它和 rpc.statd 联用, 以监视哪些主机会请求对文件执行上锁操作, 以及这种操作的频繁程度。 尽管后两项功能对于调试非常有用, 但它们并不是 NFS 服务器和客户端正常运行所必需的。 下一个项目是Routed,这是一个路由程序。 &man.routed.8; 程序管理网络路由表,发现多播路由, 并且支持在网络上与它物理相连的主机来复制它的路由表的请求。 它被广泛地应用在本地网络中并扮演着网关的角色。 当选择它后,一个子菜单会来询问您这个程序的默认位置。 默认的位置已经被定义过, 您可以选择 Enter 键, 也可以按下其它的键。 这时会出来另一个菜单来询问您传递给 routed程序的参数。 默认的是 参数。 接下来是 Rwhod 选项, 选中它会启用 &man.rwhod.8; 程序在系统初时化的时候。 rwhod程序通过网络周期性的广播系统 信息或以客户的身份来收集这些信息。 更多的信息可以查看 &man.ruptime.1; 和 &man.rwho.1; 手册页。 倒数第二个选项是&man.sshd.8; 程序。它可以通过使用 OpenSSH 来提供安全的shell服务, 我们推荐通过使用它来使用 telnetFTP 服务。 sshd 服务通过使用加密技术来创建从一台机器到另一台机器的安全连接。 最后有一个 TCP 扩展选项。 这可以用来扩展在 RFC 1323 和 RFC 1644 里定义的 TCP 功能。当许多主机以高速连接本机时,可能会引起某些连接被丢弃。 我们不推荐使用这个选项, 但是当使用独立的主机时可以从它上面得到一些好处。 现在您已经配置完成了网络服务, 您可以滚动屏幕到顶部选择 X Exit 项, 退出进入下一个配置部分, 或简单地选择两次 X Exit 之后选择 [X Exit Install] 来退出 sysinstall
&os; 的启动过程 &os;/&arch.i386; 的启动过程 如果启动正常,您将看到在屏幕上有很多信息滚动, 最后您会看到登录命令行。您可以通过键入 Scroll-Lock和使用 PgUpPgDn来查看信息,再键入 Scroll-Lock 回到命令行。 记录信息可能不会显示(缓冲区的限制)。您可以通过键入 dmesg 来查看。 使用您在安装过程中设置的用户名/密码来登录。(例子中使用 rpratt)。除非必须的时候请不要用 root 用户登录。 典型的启动信息:(忽略版本信息) Copyright (c) 1992-2002 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. Timecounter "i8254" frequency 1193182 Hz CPU: AMD-K6(tm) 3D processor (300.68-MHz 586-class CPU) Origin = "AuthenticAMD" Id = 0x580 Stepping = 0 Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX> AMD Features=0x80000800<SYSCALL,3DNow!> real memory = 268435456 (262144K bytes) config> di sn0 config> di lnc0 config> di le0 config> di ie0 config> di fe0 config> di cs0 config> di bt0 config> di aic0 config> di aha0 config> di adv0 config> q avail memory = 256311296 (250304K bytes) Preloaded elf kernel "kernel" at 0xc0491000. Preloaded userconfig_script "/boot/kernel.conf" at 0xc049109c. md0: Malloc disk Using $PIR table, 4 entries at 0xc00fde60 npx0: <math processor> on motherboard npx0: INT 16 interface pcib0: <Host to PCI bridge> on motherboard pci0: <PCI bus> on pcib0 pcib1: <VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0 pci1: <PCI bus> on pcib1 pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11 isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0 isa0: <ISA bus> on isab0 atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0 ata0: at 0x1f0 irq 14 on atapci0 ata1: at 0x170 irq 15 on atapci0 uhci0: <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci0 usb0: <VIA 83C572 USB controller> on uhci0 usb0: USB revision 1.0 uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub0: 2 ports with 2 removable, self powered chip1: <VIA 82C586B ACPI interface> at device 7.3 on pci0 ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xe800-0xe81f irq 9 at device 10.0 on pci0 ed0: address 52:54:05:de:73:1b, type NE2000 (16 bit) isa0: too many dependant configs (8) isa0: unexpected small tag 14 fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0 fdc0: FIFO enabled, 8 bytes threshold fd0: <1440-KB 3.5" drive> on fdc0 drive 0 atkbdc0: <keyboard controller (i8042)> at port 0x60-0x64 on isa0 atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0 kbd0 at atkbd0 psm0: <PS/2 Mouse> irq 12 on atkbdc0 psm0: model Generic PS/2 mouse, device ID 0 vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0 sc0: <System console> at flags 0x1 on isa0 sc0: VGA <16 virtual consoles, flags=0x300> sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0 sio0: type 16550A sio1 at port 0x2f8-0x2ff irq 3 on isa0 sio1: type 16550A ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode ppc0: FIFO with 16/16/15 bytes threshold ppbus0: IEEE1284 device found /NIBBLE Probing for PnP devices on ppbus0: plip0: <PLIP network interface> on ppbus0 lpt0: <Printer> on ppbus0 lpt0: Interrupt-driven port ppi0: <Parallel I/O> on ppbus0 ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master using UDMA33 ad2: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata1-master using UDMA33 acd0: CDROM <DELTA OTC-H101/ST3 F/W by OIPD> at ata0-slave using PIO4 Mounting root from ufs:/dev/ad0s1a swapon: adding /dev/ad0s1b as swap device Automatic boot in progress... /dev/ad0s1a: FILESYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1a: clean, 48752 free (552 frags, 6025 blocks, 0.9% fragmentation) /dev/ad0s1f: FILESYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1f: clean, 128997 free (21 frags, 16122 blocks, 0.0% fragmentation) /dev/ad0s1g: FILESYSTEM CLEAN; SKIPPING CHECKS /dev/ad0s1g: clean, 3036299 free (43175 frags, 374073 blocks, 1.3% fragmentation) /dev/ad0s1e: filesystem CLEAN; SKIPPING CHECKS /dev/ad0s1e: clean, 128193 free (17 frags, 16022 blocks, 0.0% fragmentation) Doing initial network setup: hostname. ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::5054::5ff::fede:731b%ed0 prefixlen 64 tentative scopeid 0x1 ether 52:54:05:de:73:1b lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8 inet6 ::1 prefixlen 128 inet 127.0.0.1 netmask 0xff000000 Additional routing options: IP gateway=YES TCP keepalive=YES routing daemons:. additional daemons: syslogd. Doing additional network setup:. Starting final network daemons: creating ssh RSA host key Generating public/private rsa1 key pair. Your identification has been saved in /etc/ssh/ssh_host_key. Your public key has been saved in /etc/ssh/ssh_host_key.pub. The key fingerprint is: cd:76:89:16:69:0e:d0:6e:f8:66:d0:07:26:3c:7e:2d root@k6-2.example.com creating ssh DSA host key Generating public/private dsa key pair. Your identification has been saved in /etc/ssh/ssh_host_dsa_key. Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub. The key fingerprint is: f9:a1:a9:47:c4:ad:f9:8d:52:b8:b8:ff:8c:ad:2d:e6 root@k6-2.example.com. setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib /usr/local/lib a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout starting standard daemons: inetd cron sshd usbd sendmail. Initial rc.i386 initialization:. rc.i386 configuring syscons: blank_time screensaver moused. Additional ABI support: linux. Local package initialization:. Additional TCP options:. FreeBSD/i386 (k6-2.example.com) (ttyv0) login: rpratt Password: 生成 RSA 和 DSA密钥在比较慢的机器上可能要花很长时间。这只是一个 新安装后的首次启动,以后的启动会变得更快一点。 如果已经完成 X 服务器的配置, 且指定了默认的桌面窗口管理器, 就可以在命令行键入 startx 来启动它了。 &os;/&arch.alpha; 的启动过程 Alpha 一旦安装完成,您就可以键入下面的命令来启动FreeBSD: >>>BOOT DKC0 这是从指定的固定硬件进行引导。如果要使 FreeBSD 下次能够自动启动, 使用下面的命令: >>> SET BOOT_OSFLAGS A >>> SET BOOT_FILE '' >>> SET BOOTDEF_DEV DKC0 >>> SET AUTO_ACTION BOOT 启动信息跟启动 &i386;机器时差不多。(但不完全一样) FreeBSD 关机 正确的关闭操作系统是很重要的。不要仅仅关闭电源。 首先,您需要成为一个超级用户,通过键入 su 命令来实现。然后输入 root 密码。这需要用户是 wheel 组的一名成员。然后, 以root键入 shutdown -h now命令。 The operating system has halted. Please press any key to reboot. 当shutdown命令发出后,屏幕上出现 Please press any key to reboot 信息时,您就可以安全的关闭计算机了。如果按下任意一个键, 计算机将重新启动。 您也能够使用 Ctrl Alt Del 组合键来重新启动计算机,但是不推荐使用这个操作。
常见问题 安装 常见问题 下面将介绍一些在安装过程中常见的问题,像如何报告发生的问题, 如何双重启动 FreeBSD 和 &ms-dos; 或 &windows;。 当您遇到错误时,应该怎么做? 由于 PC 结构的限制, 硬件检测不可能 100% 地可靠, 但是有些问题是您可以自己解决的。 首先检查一下您使用的 &os; 版本的 硬件兼容说明 文档看看您使用的是否是被支持的硬件。 如果您使用的硬件是系统支持的,但仍然遇到了死机或其他问题, 则需要联编 定制的内核。 这能够支持默认的 GENERIC 内核所不支持的设备。 在引导盘上的内核假定绝大多数的硬件,均为按出厂设置的方式配置了 IRQ、 IO 地址和 DMA 通道。 如果您的硬件重新进行了配置, 则可能需要编辑内核配置, 并重新编译内核, 以便告诉 &os; 到哪里去查找设备。 除此之外,也可能遇到这种情况吗,即探测某种并不存在的设备时, 会干扰到其他设备的检测并使其失败。 这种情况吗下应禁止驱动程序检测可能导致冲突的设备。 有些安装问题可以借助更新硬件的程序来解决,特别是主板的 BIOS 。 大部分的主板制造商都会提供网站给用户下载新的 BIOS 以及提供如何更新的说明。 也有许多制造商强烈建议,除非必要否则不要轻易更新 BIOS 。因为更新的过程 可能 会发生问题,进而损害 BIOS 芯片。 使用 &ms-dos; 和 &windows; 文件系统 目前, &os; 尚不支持通过 Double Space™ 程序压缩的文件系统。 因此,如果希望 &os; 访问数据, 则应首先解压缩这些文件系统。 这项工作,可以通过位于 Start> Programs > System Tools 菜单的 Compression Agent 来完成。 &os; 可以支持基于 &ms-dos; 的文件系统 (有时被称为 FAT 文件系统)。 &man.mount.msdosfs.8; 命令能够把这样的文件系统挂接到现有的目录结构中, 并允许访问 FAT 文件系统上的内容。 通常我们并不直接使用 &man.mount.msdosfs.8; 程序,它一般会在 /etc/fstab 中的某一行被调用或者被 &man.mount.8; 工具并配合适当的参数来调用。 /etc/fstab中一个典型的例子: /dev/ad0sN /dos msdosfs rw 0 0 /dos 目录必须事先存在。 更多关于 /etc/fstab 的细节, 请参阅 &man.fstab.5;。 一个使用 &man.mount.8; 挂载 &ms-dos; 文件系统的例子: &prompt.root; mount -t msdosfs /dev/ad0s1 /mnt 在此例子中, &ms-dos; 文件系统位于主硬盘的第一个分区。 您的情况可能与引不同,查看命令 dmesgmount 的输出。 它们应该可以让您得到足够的分区信息。 &os; 可能使用和其他操作系统不同计数方法来标记磁盘 slices, 特别需要指出的是, &ms-dos; 的扩展分区通常会比 &ms-dos; 主分区被标记为更高的数值。 可以使用 &man.fdisk.8; 工具来帮助测定哪些 slices 属于 &os; 哪些是属于其他的操作系统。 NTFS 分区也可以通过类似 &man.mount.ntfs.8; 命令挂接在FreeBSD上。 排除故障时的常见问题和解决方法 我的系统在引导到探测硬件时发生了死机、 安装过程中行为异常, 或没有检测到软驱。 - &os; 5.0 和更高版本在启动过程中广泛使用了 i386、 + &os; 在启动过程中广泛使用了 i386、 amd64 及 ia64 平台提供的 ACPI 服务来检测系统配置。 不幸的是, 在 ACPI 驱动和主板 BIOS 中存在一些 bug。 如果遇到这种情况, 可以在系统引导时禁用 ACPI, 其方法是在第三阶段引导加载器时使用 hint hint.acpi.0.disabled set hint.acpi.0.disabled="1" 这一设置会在系统重启之后失效,因此,如果需要的话,您应在 /boot/loader.conf 文件中增加 hint.acpi.0.disabled="1"。 关于引导加载器的进一步详情, 请参见 在硬盘安装 &os; 之后的首次启动时, 内核加载并检测了硬件, 但给出下列消息并停止运行: changing root device to ad1s1a panic: cannot mount root 这是怎么回事? 我该怎么做? 另外引导帮助信息里提到的 bios_drive:interface(unit,partition)kernel_name 是什么? 系统在处理引导盘非系统中的第一块盘时有一个由来已久的问题。 BIOS 采用的编号方式有时和 &os; 不一致, 而设法将其变为一样则很难正确地实现。 因而, 在发生这种情况时,&os; 可能会需要一些帮助才能找到磁盘。有两种常见的情况, 在这些情况下您都需要手工告诉 &os; 根文件系统模块的位置。 这是通过告诉引导加载器 BIOS 磁盘编号、磁盘类型以及 &os; 中的该种磁盘的编号来实现的。 第一种情况是有两块 IDE 硬盘, 分别配置为对应 IDE 总线上的主 (master) 设备, 并希望 &os; 从第二块硬盘上启动。 BIOS 将两块硬盘识别为磁盘 0 和磁盘 1, 而 &os; 则将其分别叫做 ad0ad2 &os; 位于 BIOS 磁盘 1, 其类型是 ad 而 &os; 磁盘编号则是 2, 因此, 您应输入: 1:ad(2,a)kernel 注意, 如果您的主总线上有从设备, 则这一配置是不必要的 (因为这样配置是错的)。 第二种情况是从 SCSI 磁盘启动,但系统中安装了一个或多个 IDE 硬盘。这时,&os; 磁盘编号会比 BIOS 磁盘编号小。如果您有两块 IDE 硬盘, 以及一块 SCSI 硬盘,则 SCSI 硬盘将会是 BIOS 磁盘 2, 类型为 da 而 &os; 磁盘编号是 0, 因此, 您应输入: 2:da(0,a)kernel 来告诉 &os; 您希望从 BIOS 磁盘 2 引导, 而它是系统中的第一块 SCSI 硬盘。 假如只有一块 IDE 硬盘, 则应以 1: 代替。 一旦您确定了应选用的正确配置, 就可以用标准的文本编辑器把它写到 /boot.config 文件中了。 除非另行指定, &os; 将使用这个文件的内容, 作为对 boot: 提示的默认回应。 在硬盘安装 &os; 之后的首次启动时, Boot Manager 只是给出了 F? 的菜单提示, 但并不继续引导过程。 在您安装 &os; 进行到分区编辑器时所设置的磁盘尺寸信息不对。 请回到分区编辑器并指定正确的磁盘尺寸。 这种情况必须重新安装 &os;。 如果您无法确定在您机器上的正确尺寸信息,可以用一个小技巧: 在磁盘开始的地方安装一个小的 DOS 分区, 并在其后安装 &os;。 安装程序能够看到这个 DOS 分区, 并利用它推测磁盘的尺寸信息, 这通常会有所帮助。 下面的技巧不再推荐使用, 在这里仅供参考:
如果您正准备建立只运行 &os; 的服务器或工作站, 而无需考虑 (之后) 与 DOS、 Linux 或其他操作系统的兼容性, 也可以使用整个硬盘 (分区编辑器中的 A), 选择 &os; 独占整个硬盘每一个扇区的非标准选项。 这会扫除关于磁盘尺寸的一切烦恼, 但会限制您以后运行 &os; 以外的其他操作系统的能力。
系统找到了 &man.ed.4; 网卡, 但总是报设备超时 (device timeout) 错误。 您的网卡可能使用了与 /boot/device.hints 文件中指定的 IRQ 不同的中断请求号。 &man.ed.4; 驱动默认情况下并不支持 配置 (在 DOS 中使用 EZSETUP 配置的值), 但如果您在网卡的 hints 中指定 -1, 便会使用软配置。 您应使用网卡的跳线进行硬配置 (根据需要修改内核设置) 或通过 hint hint.ed.0.irq="-1" 将 IRQ 指定为 -1。 这会告诉内核使用软配置。 另一个可能是您的网卡使用 IRQ 9, 这会与 IRQ 2 共用同一中断请求线, 同时也是导致问题的一个常见原因 (特别是 VGA 卡使用 IRQ 2 的时候!)。 您应尽量避免使用 IRQ 2 或 9。
Valentino Vaschetto Contributed by 高级安装指南 这节主要描述在一些特殊情况下如何安装FreeBSD。 在一个没有显示器或键盘的系统上安装FreeBSD installation headless (serial console) serial console 这种类型的安装叫做 headless install(无关安装), 因您正要安装FreeBSD的机器不是没带显示器,就是没有显卡。 您可能会问那怎么安装? 可以使用一个串行控制台。 串行控制台基本上是使用另外一台机器来充当主显示设备和键盘。 要这样做,只要执行下面的步骤:创建安装软件,请看 一节说明。 按下面的步骤,修改这些软盘用来引导进入一个串行控制台: 通过启动软盘来引导进入一个串行控制台 mount 如果您想用软盘,FreeBSD将进入它通常的安装模式。 我们要把 FreeBSD 引导进入串行控制台,需要这样做, 您必须使用 &man.mount.8;命令在FreeBSD系统上挂接 boot.flp 的那个软盘。 &prompt.root; mount /dev/fd0 /mnt 现在您已经挂上了软盘, 需要进入 /mnt 目录: &prompt.root; cd /mnt 这儿是您必须设置软盘引导进入串行控制台的地方。 您必须制作一个包含 /boot/loader -h 这行的叫做 boot.config 的文件。 所有这些是为了给引导程序一个标记以引导进入串行控制台。 &prompt.root; echo "/boot/loader -h" > boot.config 现在您已经正确配置好了软盘,您必须使用 &man.umount.8; 命令卸下软盘。 &prompt.root; cd / &prompt.root; umount /mnt 现在您可以从软盘驱动器中取出软盘了。 连接您的 Null-modem 线 null modem cable 您现在需要一根 null modem线 来连接两台机器。只要连接两台机器的串口。 普通的串行线是不行的, 您需要使用一根null modem的线, 因为它在一些十字交叉口有金属线。 开始启动安装 现在开始启动安装。把 boot.flp 的那张软盘插入软盘驱动器,然后开启电源。 连接您的无头机器 cu 现在您已经通过&man.cu.1;连接到了那台机器。 &prompt.root; cu -l /dev/cuad0 - 在 &os; 5.X 上, 应使用 - /dev/cuaa0 代替例子中的 - /dev/cuad0 就这样! 您已经能够通过您的 cu session 对话来控制那台 无头机器了。 它将要求您把 kern1.flp 的那张软盘插入驱动器, 然后它将提示选择使用哪种终端。 只要选择 FreeBSD 的彩色控制台, 然后继续您的安装。 准备您自己的安装介质 为了避免重复 FreeBSD disc 在这里指 FreeBSD CDROM or DVD 那即意味着您要购买或自己制做。 有好几个原因需要您创建自己的FreeBSD安装介质。 这可能是物理介质,如磁带,使用 sysinstall 程序找到的安装文件, FTP 站点或 &ms-dos;分区。 例如: 您有许多机器连接到本地网络,使用一个FreeBSD光盘。 您要使用FreeBSD来创建一个本地FTP站点, 然后使用这个FTP站点来代替连接到Internet。 您有一张 FreeBSD 光盘, FreeBSD 不支持您的 CD/DVD 驱动器, 但 &ms-dos;/&windows; 支持。 您要复制安装文件到一个DOS分区, 然后使用这些文件进行安装。 您要安装的计算机没有 CD/DVD驱动器和网卡,但您可以连接一个 Laplink-style 串口或并口线缆到那台计算机。 您要通过一个磁带机来安装FreeBSD. 创建一张安装光盘 FreeBSD 的每个发行版本都为每一支持的平台提供至少两张 CDROM 映像 (ISO images)。如果您有刻录机, 这些映像文件可以被(burned) 成FreeBSD的安装光盘。 如果没有刻录机,而上网带宽却很便宜,它也是一种很好的安装方式。 下载正确的 ISO 映像文件 每个版本的ISO映像文件都可以从 ftp://ftp.FreeBSD.org/pub/FreeBSD/ISO-IMAGES-架构名/版本 或最近的镜像站点下载。选择合适的 架构版本 目录中包含下面一些映像文件: - FreeBSD 5.<replaceable>X</replaceable> 和 6.<replaceable>X</replaceable> ISO 映像文件名和含意 + FreeBSD 6.<replaceable>X</replaceable> 和 7.<replaceable>X</replaceable> ISO 映像文件名和含意 文件名 包含内容 版本-RELEASE-架构-bootonly.iso 引导 FreeBSD 内核并启动安装界面所需的全部数据。 安装文件可以从 FTP 或其他安装源获得。 版本-RELEASE-架构名-disc1.iso 安装 FreeBSD 所需的全部文件, 以及一份用于与 sysinstall 中的 Repair(修复) 机制联用的 现场文件系统 版本-RELEASE-架构名-disc2.iso - &os; 文档 (在 &os; 6.2 之前) 以及这张光盘能装下的、 - 尽可能多的第三方软件包。 + 尽可能多的第三方软件包。 version-RELEASE-arch-docs.iso - &os; 文档 (&os; 6.2 和之后的版本)。 + &os; 文档。
必须 下载 bootonly ISO 镜像 (如果有的话) 或第一张光盘的镜像之一。 不需要两个都下载, 因为第一张光盘包括了 bootonly ISO 的全部内容。 如果访问 Internet 的价格便宜, 建议使用 bootonly ISO。 这样您可以安装 &os;, 并从网上通过 ports/packages 系统 (参见 ) 根据需要下载和安装第三方软件包。 如果您正打算安装 &os; 并同时选择一些第三方软件包, 则可以下载第一张光盘的镜像文件。 其它的映像盘也是很有用的,但不是必须的, 尤其是在您有高速的网络连接时。
刻录 CDs 您必须把这些映像文件刻录成光盘。 如果您在其它的FreeBSD系统上完成此项工作,请看 得到更多的信息,(特别是 如果您在其它的系统平台上执行,您需要相应的刻录软件。 映像文件使用的是标准的ISO格式,必须被您的刻录软件所支持。
如果有兴趣制作一张定制的 FreeBSD 版本, 请参考 Release Engineering Article
为 FreeBSD 安装盘建立局域网 FTP 站点 installation network FTP FreeBSD 光盘的布局和 FTP 站点相同。 这样, 建立局域网 FTP 站点来用于网络上的其它计算机安装 FreeBSD, 就十分的容易。 在要作为FTP站点的那台FreeBSD机器上, 确定FreeBSD磁盘放入光驱中并将它挂在 /cdrom 目录中。 &prompt.root; mount /cdrom /etc/passwd 文件中建立一个可匿名访问 FTP 服务器的账号。 您可以利用 &man.vipw.8; 命令编辑 /etc/passwd 文件, 加入下面这一行叙述: ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent 确定在 /etc/inetd.conf 配置文件中开启了FTP服务。 任何本地网络中的机器在安装 FreeBSD 选择安装介质时就可以选择透过 FTP 站点,然后选取 Other 后输入 ftp:// 本地FTP服务器 即可以透过本地的FTP站点来安装FreeBSD。 如果用作 FTP 客户端的引导介质 (通常是软盘) 与本地局域网的 FTP 站点上的版本不一致, sysinstall 会不允许您完成安装。 如果您使用的版本差距不很大, 并且希望绕过这一判断, 则应进入 Options 菜单, 并将安装包的名字改为 any 此方式最好使用在有防火墙保护的内部网络。 如果要将此FTP服务公开给外面的网际网络(非本地用户), 您的电脑必须承担被侵入或其它的风险。 我们强烈建议您要有完善的安全机制才这样做。 创建安装软盘 installation floppies 如果您从软盘安装(我们推荐那样做), 或者是由于不支持硬件或者更简单的理由是因为您坚持要使用软盘安装。 您必须准备几张软盘。 至少这些软盘必须是 1.44 MB 的,用来容纳所有在 base (基本系统) 目录下的文件。如果您在 DOS 操作系统下准备就 必须 使用 &ms-dos; 的 FORMAT 命令来格式化软盘。 如果您使用的是 &windows; 操作系统, 在资源管理器中就可以完成这个工作 (用右键单击 A: 驱动器,并选择 Format)。 不要 指望厂家的预先格式化! 最好还是亲自进行格式化。 过去用户报告的很多问题都是由于不正确地使用格式化设备所造成的, 所以我们需要在这里着重提一下。 如果您在另外一台FreeBSD的机器上做了启动盘的话, 进行格式化是一个不错的主意。 虽然您不需要把每张盘都做成DOS文件系统。您也可以使用 bsdlabelnewfs 命令来创建一个UFS文件系统,具体操作按下面的顺序进行: &prompt.root; fdformat -f 1440 fd0.1440 &prompt.root; bsdlabel -w fd0.1440 floppy3 &prompt.root; newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0 然后您就可以像其它的文件系统一样挂上和写入这些磁盘。 格式化这些磁盘后,您必须把文件复制到磁盘中。 这些发行文件被分割成刚好可存进五张 1.44 MB 软盘。 检查您所有的磁盘, 找出所有可能适合的文件。 直到您找到所有需要的配置并且将它们以这种方式安置。 第一个配置都应该有一个子目录在磁盘上, 例如: a:\base\base.aaa:\base\base.ab, 等等。 base.inf 文件, 也应放在 base 的第一张盘上, 因为安装程序需要读取这个文件, 以了解在获得发布包时需要下载多少文件。 一旦您进入选择安装介质的屏幕, 选择 Floppy 将会看到后面的提示符。 从 &ms-dos; 分区安装 installation from MS-DOS 如果从 &ms-dos; 分区安装, 您需要将发布文件复制到该分区根目录下的 freebsd 目录中。 例如: c:\freebsd。 您必须复制一部分 CDROM 或 FTP 上的目录结构, 因此, 如果您从光盘进行复制, 建议使用 DOS 的 xcopy 命令。 下面是准备进行 FreeBSD 最小系统安装的例子: C:\> md c:\freebsd C:\> xcopy e:\bin c:\freebsd\bin\ /s C:\> xcopy e:\manpages c:\freebsd\manpages\ /s 假设 C: 盘是您的空闲空间, E: 盘是您挂接的 CDROM。 如果您没有光盘驱动器,您可以从以下网站下载发行包。ftp.FreeBSD.org. 每一个发行包都在一个目录中,例如 base 发行包可以在 &rel.current;/base/ 目录中找到。 对很多发行包来说,如果您希望从 &ms-dos;分区安装的话 (您有足够的空间),安装 c:\freebsd — 下的每个文件-这个 BIN 发行包只是最低限度的要求。 创建一个安装磁带 installation from QIC/SCSI Tape 从磁带安装也许是最简单的方式, 比在线使用 FTP 安装或使用 CDROM 还快。安装的程序假设是简单地被压缩在磁带上。 在您得到所有配置文件后,简单地解开它们,用下面的命令: &prompt.root; cd /freebsd/distdir &prompt.root; tar cvf /dev/rwt0 dist1 ... dist2 在您安装的时候,您要确定留有足够的空间给临时目录(允许您选择) 来容纳磁带安装时 全部 的内容。由于不是随机访问 磁带的,所以这种安装方法需要很多临时空间。 开始安装时,在从软盘启动 之前, 磁带机必须已经放在驱动设备中。否则, 安装过程中可能会找不到它。 通过网络安装 installation (安装) network (网络) serial (串口, SLIP 或 PPP) installation (安装) network (网络) parallel (并口, PLIP) installation (安装) network (网络) Ethernet (以太网) 可用的网络安装类型有三种。 以太网 (标准的以太网控制器)、 串口 (SLIP 或 PPP) 以及 并口 (PLIP (laplink 线缆))。 如果希望以最迅速的方式完成网络安装, 那么以太网适配器当然就是首选! FreeBSD 支持绝大多数常见 PC 以太网卡; 系统能够支持的网卡 (以及所需的配置) 可以在 FreeBSD 发行版附带的硬件兼容说明中找到。 如果您使用的是系统支持的 PCMCIA 以太网卡, 在为笔记本加电 之前 之前一定要把它插好! 很不幸, FreeBSD 目前并不支持在安装过程中热插 PCMCIA 卡。 此外, 您还需要知道自己的 IP 地址、 网络类型对应的子网掩码, 以及机器名。 如果您正通过 PPP 连接安装而没有固定的静态 IP, 不用怕, 这个 IP 地址会由您的 ISP 自动分配。 您的系统管理员会告诉您进行网络配置所需的信息。 如果您需要通过名字而不是 IP 地址来访问其他主机, 则还需要配置一个域名服务器, 可能还需要一个网关地址 (在使用 PPP 时, 这个地址是服务提供商的 IP 地址)。 如果您希望通过 HTTP 代理服务器来完成 FTP 安装, 还需要知道代理服务器的地址。 如果您不知道这些信息, 则应在进行这种安装 之前 向系统管理员或 ISP 询问。 SLIP 支持是相当原始的,并且被限制在主要对hard-wired 的连接, 就像一台膝上型计算机与另一台计算机间的串行线。 现在的SLIP的安装还没有提供拨号功能,这个连接应该是 hard-wired; 用PPP工具提供的这种便利性应该首先尽可能被用于 SLIP 设备。 如果您使用一个 MODEM,那您就只有 PPP 这一种选择了。在您安装的过程中, 要确定您能很容易地获得完整且快速的关于您服务提供商的信息。 如果您使用 PAP 或 CHAP 方式连接到您的 ISP, (换句话说,如果您不使用脚本在&windows;中连接到您的ISP), 那么您需要在 ppp 提示符下输入 dial 命令。否则,当 PPP 连接者只提供一种最简单的终端模拟器,您必须知道如何使用针对 MODEM 的 AT commands拨号到您的 ISP。 想知道更深入的信息可以参考 使用手册中的用户级PPP那节 以及 FAQ 。 如果您有一些问题,可以使用 set log local ... 命令将日志显示在屏幕上。 您也可以通过并口电缆连接到另外一台FreeBSD (2.0或以后的版本)机器上进行安装,您可以考虑使用 laplink 并口电缆进行安装。通过并口安装要比通过串口 (最高 50 kbytes/sec)安装快得多。 通过NFS安装之前 installation network NFS NFS 安装方式是非常方便的。只需要简单地将 FreeBSD 文件复制到一台服务器上,然后在安装时选择NFS介质。 如果这个服务器要 特权端口 才能支持 (如SUN的工作站),您需要在安装前在 Options 菜单中设置 NFS Secure 如果你使用了一块低质量的以太网卡比较糟糕, 速度很慢,则应考虑 NFS Slow的选项。 为了达到NFS安装的目的,这个服务器必须支持 subdir 加载。 例如,如果您的 FreeBSD &rel.current; 目录存在: ziggy:/usr/archive/stuff/FreeBSD,然后 ziggy 将必须允许直接挂上 /usr/archive/stuff/FreeBSD,而不仅仅是 /usr/usr/archive/stuff 在 FreeBSD的 /etc/exports 配置文件中, 是由 选项来控制的。其它 NFS 服务器也许有不同的方式。如果您从服务器得到 permission denied 这个信息, 可能是因为您没有正确的启用它。
diff --git a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml index 2873a085ac..8a441b1f5b 100644 --- a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml @@ -1,1318 +1,1317 @@ Jim Mock Updated and restructured by Jake Hamby Originally contributed by 配置FreeBSD的内核 概述 内核 建立一个定制的内核 内核是 &os; 操作系统的核心。 它负责管理内存、 执行安全控制、 网络、 磁盘访问等等。 尽管 &os; 可以动态修改的现在已经越来越多, 但有时您还是需要重新配置和编译您的内核。 读完这章,您将了解: 为什么需要建立定制的内核。 如何编写内核配置文件,或修改已存在的配置文件。 如何使用内核配置文件创建和联编新的内核。 如何安装新内核。 如何处理出现的问题。 这一章给出的命令应该以 root 身份执行, 否则可能会不成功。 为什么需要建立定制的内核? 过去, &os; 采用称作 单片式 的内核。 这句话的意思是说内核是一个大的程序, 支持固定的设备, 如果您希望改变内核的行为则必须编译一个新的, 并重新启动计算机来引导它。 今天, &os; 已经迅速地转移到了一个新的模型, 其重要特征是内核功能可以由能够根据需要动态加载和卸载的模块来提供。 这使得内核能够迅速地适应硬件的调整 (例如笔记本电脑的 PCMCIA), 或为内核增加在最初编译它时所不具备的新的功能。 这一模式成为模块化内核。 尽管如此, 一些功能仍然需要静态地连编进内核。 一些情况是因为这些功能于内核的结合十分紧密, 而不可能将它们做成可以动态加载的。 另一种情况是因为没有人有时间来编写实现那个功能的可以动态加载的内核模块。 建造定制的内核是几乎每一个 BSD 用户所必须经历的一关。 尽管这项工作可能比较耗时, 但它能够为使用 &os; 系统带来很多好处。 与必须支持大量各式硬件的 GENERIC 内核不同, 定制的内核可以只包含对于 您的 PC 硬件的支持。 这有很多好处, 例如: 更快地启动。 因为内核只需要检测您系统上的硬件, 启动时所花费的时间将大大缩短。 使用更少的内存。 定制的内核通常会比 GENERIC 内核使用更少的内存, 由于内核必须时刻处于物理内存中, 因此这就显得更加重要。 基于这样的原因, 对于内存较小的系统来说, 定制内核将发挥更大的作用。 支持更多的硬件。 定制的内核允许您增加类似声卡这样的 GENERIC 内核没有提供内建支持的硬件。 Tom Rhodes 作者 发现系统硬件 在尝试配置内核以前,比较明智的做法是先获得一份机器硬件的清单。 当 &os; 并不是主操作系统时,通过查看当前操作系统的配置可以很容易的 创建一份机器硬件的配置清单。举例来说, µsoft; 的 设备管理器 里通常含有关于已安装硬件的重要信息。 设备管理器 位于控制面板。 某些版本的 µsoft.windows; 有一个 系统 图标会指明 设备管理器 的位置。 如果机器上并不存在其他的操作系统, 系统管理员只能手动寻找这些信息了。其中的一个方法是使用 &man.dmesg.8; 工具以及 &man.man.1; 命令。&os; 上大多数的驱动程序都有一份手册页(manual page)列出了所支持的硬件, 在系统启动的时候,被发现的硬件也会被列出。举例来说, 下面的这几行表示 psm 驱动找到了一个鼠标: psm0: <PS/2 Mouse> irq 12 on atkbdc0 psm0: [GIANT-LOCKED] psm0: [ITHREAD] psm0: model Generic PS/2 mouse, device ID 0 这个驱动需要被包含在客户制定的内核配置文件里, 或着使用 &man.loader.conf.5; 加载。 有时,dmesg 里只会显示来自系统消息的数据, 而不是系统启动时的检测信息。在这样的情况下,你可以查看文件 /var/run/dmesg.boot 另一个查找硬件信息的方法是使用 &man.pciconf.8; 工具, 它能提供更详细的输出,比如: ath0@pci0:3:0:0: class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00 vendor = 'Atheros Communications Inc.' device = 'AR5212 Atheros AR5212 802.11abg wireless' class = network subclass = ethernet 这个片断取自于 pciconf 命令的输出,显示 ath 驱动找到了一个无线以太网设备。输入命令 man ath 就能查阅有关 &man.ath.4; 的手册页(manual page)了。 还可以传给 &man.man.1; 命令 选项, 同样能获得有用的信息。例如: &prompt.root; man -k Atheros 能得到一份包含特定词语的手册页(manual page): ath(4) - Atheros IEEE 802.11 wireless network driver ath_hal(4) - Atheros Hardware Access Layer (HAL) 手头备有一份硬件的配置清单, 那么编译制定内核的过程就显得不那么困难了。 建立并安装一个定制的内核 内核 建立/安装 首先对内核构建目录做一个快速的浏览。 这里所提到的所有目录都在 /usr/src/sys 目录中; 也可以通过 /sys 来访问它。 这里的众多子目录包含了内核的不同部分, 但对我们所要完成的任务最重要的目录是 arch/conf, 您将在这里编辑定制的内核配置; 以及 compile, 编译过程中的文件将放置在这里。 arch 表示 i386alphaamd64ia64powerpcsparc64, 或 pc98 (在日本比较流行的另一种 PC 硬件开发分支)。 在特定硬件架构目录中的文件只和特定的硬件有关; 而其余代码则是与机器无关的, 则所有已经或将要移植并运行 &os; 的平台上都共享这些代码。 文件目录是按照逻辑组织的, 所支持的硬件设备、 文件系统, 以及可选的组件通常都在它们自己的目录中。 这一章提供的例子假定您使用 i386 架构的计算机。 如果您的情况不是这样, 只需对目录名作相应的调整即可。 如果您的系统中 没有 /usr/src/sys 这样一个目录, 则说明没有安装内核源代码。 安装它最简单的方法是通过以 root 身份运行 sysinstall, 选择 Configure, 然后是 Distributionssrc, 选中其中的 basesys。 如果您不喜欢 sysinstall 并且有一张 官方的 &os; CDROM, 也可以使用下列命令, 从命令行来安装源代码: &prompt.root; mount /cdrom &prompt.root; mkdir -p /usr/src/sys &prompt.root; ln -s /usr/src/sys /sys &prompt.root; cat /cdrom/src/ssys.[a-d]* | tar -xzvf - &prompt.root; cat /cdrom/src/sbase.[a-d]* | tar -xzvf - 接下来, 进入 arch/conf 目录下面, 复制 GENERIC 配置文件, 并给这个文件起一个容易辨认的名称, 它就是您的内核名称。例如: &prompt.root; cd /usr/src/sys/i386/conf &prompt.root; cp GENERIC MYKERNEL 通常,这个名称是大写的,如果您正维护着多台不同硬件的&os;机器, 以您机器的域名来命名是非常好的主意。我们把它命名为 MYKERNEL就是这个原因。 将您的内核配置文件直接保存在 /usr/src 可能不是一个好主意。 如果您遇到问题, 删掉 /usr/src 并重新开始很可能是一个诱人的选择。 一旦开始做这件事, 您可能几秒钟之后才会意识到您同时会删除定制的内核配置文件。 另外, 也不要直接编辑 GENERIC, 因为下次您 更新代码 时它会被覆盖, 而您的修改也就随之丢失了。 您也可以考虑把内核配置文件放到别的地方, 然后再到 i386 目录中创建一个指向它的符号链接。 例如: &prompt.root; cd /usr/src/sys/i386/conf &prompt.root; mkdir /root/kernels &prompt.root; cp GENERIC /root/kernels/MYKERNEL &prompt.root; ln -s /root/kernels/MYKERNEL 必须以 root 身份执行这些和接下来命令, 否则就会得到 permission denied 的错误提示。 现在就可以用您喜欢的文本编辑器来编辑 MYKERNEL 了。 如果您刚刚开始使用 FreeBSD, 唯一可用的编辑器很可能是 vi, 它的使用比较复杂, 限于篇幅, 这里不予介绍, 您可以在 参考书目 一章中找到很多相关书籍。 不过, &os; 也提供了一个更好用的编辑器, 它叫做 ee, 对于新手来说, 这很可能是一个不错的选择。 您可以修改配置文件中的注释以反映您的配置, 或其他与 GENERIC 不同的地方。 SunOS 如果您在&sunos;或者其他BSD系统下定制过内核,那这个文件中的绝大部分将对您非常熟悉。 如果您使用的是诸如DOS这样的系统,那GENERIC配置文件看起来就非常困难, 所以在下面的 配置文件章节将慢慢地、仔细地进行介绍。 如果您和 &os; project 进行了 代码同步, 则一定要在进行任何更新之前查看 /usr/src/UPDATING。 这个文件中描述了更新过的代码中出现的重大问题或需要注意的地方。 /usr/src/UPDATING 总是和您的 &os; 源代码对应, 因此能够提供比手册更具时效性的新内容。 现在应该编译内核的源代码了。 联编内核 进入 /usr/src 目录: &prompt.root; cd /usr/src 编译内核: &prompt.root; make buildkernel KERNCONF=MYKERNEL 安装新内核: &prompt.root; make installkernel KERNCONF=MYKERNEL 使用这种方法联编内核时, 需要安装完整的 &os; 源代码。 默认情况下, 在联编您所定制的内核时, 全部 内核模块也会同时参与构建。 如果您希望更快地升级内核, 或者只希望联编您所需要的模块, 则应在联编之前编辑 /etc/make.conf MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs 这个变量的内容是所希望构建的模块列表。 WITHOUT_MODULES = linux acpi sound/sound sound/driver/ds1 ntfs 这个变量的内容是在联编过程中将不被编译的模块列表。 如果希望了解更多与构建内核有关的变量, 请参见 &man.make.conf.5; 联机手册。 /boot/kernel.old 新内核将会被复制到 /boot/kernel 目录中成为 /boot/kernel/kernel 而旧的则被移到 /boot/kernel.old/kernel。 现在关闭系统, 然后用新的内核启动计算机。 如果出现问题, 后面的一些 故障排除方法 将帮您摆脱困境。 如果您的内核 无法启动, 请参考那一节。 其他与启动过程相关的文件, 如 &man.loader.8; 及其配置, 则放在 /boot。 第三方或定制的模块也可以放在 /boot/kernel, 不过应该注意保持模块和内核的同步时很重要的, 否则会导致不稳定和错误。 Joel Dahl Updated for &os; 6.X by 配置文件 内核 NOTES NOTES 内核 配置文件 配置文件的格式是非常简单的。 每一行都包括一个关键词, 以及一个或多个参数。 实际上, 绝大多数行都只包括一个参数。 在 # 之后的内容会被认为是注释而忽略掉。 接下来几节, 将以 GENERIC 中的顺序介绍所有关键字。 如果需要与平台有关的选项和设备的详细列表, 请参考与 GENERIC 文件在同一个目录中的那个 NOTES, 而平台无关的选项, 则可以在 /usr/src/sys/conf/NOTES 找到。 如果您需要一份包含所有选项的文件, 例如用于测试目的, 则应以 root 身份执行下列命令: &prompt.root; cd /usr/src/sys/i386/conf && make LINT 内核 配置文件 下面是一个 GENERIC 内核配置文件的例子, 它包括了一些需要解释的注释。 这个例子应该和您复制的 /usr/src/sys/i386/conf/GENERIC 非常接近。 内核选项 机器 machine i386 这是机器的架构, 他只能是 alpha, amd64, i386, ia64, pc98, powerpc, 或 sparc64 中的一种。 内核选项 cpu cpu I486_CPU cpu I586_CPU cpu I686_CPU 上面的选项指定了您系统中所使用的 CPU 类型。 您可以使用多个 CPU 类型 (例如, 您不确定是应该指定 I586_CPUI686_CPU)。 然而对于定制的内核, 最好能够只指定您使用的那种 CPU。 如果您对于自己使用的 CPU 类型没有把握, 可以通过查看 /var/run/dmesg.boot 中的启动信息来了解。 内核选项 ident ident GENERIC 这是内核的名字。 您应该取一个自己的名字, 例如取名叫 MYKERNEL, 如果您一直在按照前面的说明做的话。 您放在 ident 后面的字符串在启动内核时会显示出来, 因此如果希望能够容易区分常用的内核和刚刚定制的内核, 就应该采取不同的名字 (例如, 您想定制一个试验性的内核)。 #To statically compile in device wiring instead of /boot/device.hints #hints "GENERIC.hints" # Default places to look for devices. &man.device.hints.5; 可以用来配置设备驱动选项。 在启动的时候 &man.loader.8; 将会检查缺省位置 /boot/devicehints。 使用 hints 选项您就可以把这些 hints 静态编译进内核。 这样就没有必要在 /boot下创建devicehints makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols 一般的 &os; 联编过程, 在所联编的内核指定了 选项时, 由于此选项将传递给 &man.gcc.1; 表示加入调试信息, 因此会将调试符号也包含进来。 options SCHED_4BSD # 4BSD scheduler 这是 &os; 传统上使用的默认系统调度器。 请保留此选项。 options PREEMPTION # Enable kernel thread preemption 允许内核线程根据优先级的抢占调度。 这有助于改善交互性, 并可以让中断线程更早地执行, 而无须等待。 options INET # InterNETworking 网络支持,即使您不打算连网,也请保留它,大部分的程序至少需要回环网络(就是和本机进行网络连接),所以强烈要求保留它。 options INET6 # IPv6 communications protocols 这将打开IPv6连接协议。 options FFS # Berkeley Fast Filesystem 这是最基本的硬盘文件系统,如果打算从本地硬盘启动,请保留它。 options SOFTUPDATES # Enable FFS Soft Updates support 这个选项会启用内核中的 Soft Updates 支持, 它会显著地提高磁盘的写入速度。 尽管这项功能是由内核直接提供的, 但仍然需要在每个磁盘上启用它。 请检查 &man.mount.8; 的输出, 以了解您系统中的磁盘上是否已经启用了 Soft Updates。 如果没有看到 soft-updates 选项, 则需要使用 &man.tunefs.8; (对于暨存系统) 或 &man.newfs.8; (对于新系统) 命令来激活它。 options UFS_ACL # Support for access control lists 这个选项将启用内核中的访问控制表的支持。 这依赖于扩展属性以及 UFS2, 以及在 中所介绍的那些特性。 ACL 默认是启用的, 并且如果已经在文件系统上使用了这一特性, 就不应再关掉它, 因为这会去掉文件的访问控制表, 并以不可预期的方式改变受保护的文件的访问方式。 options UFS_DIRHASH # Improve performance on big directories 通过使用额外的内存,这个选项可以加速在大目录上的磁盘操作。 您应该在大型服务器和频繁使用的工作站上打开这个选项,而在磁盘操作不是很重要的 小型系统上关闭它,比如防火墙。 options MD_ROOT # MD is a potential root device 这个选项将打开以基于内存的虚拟磁盘作为根设备的支持。 内核选项 NFS 内核选项 NFS_ROOT options NFSCLIENT # Network Filesystem Client options NFSSERVER # Network Filesystem Server options NFS_ROOT # NFS usable as /, requires NFSCLIENT 网络文件系统。 如果您不打算通过 TCP/IP 挂接 &unix; 文件服务器的分区, 就可以注释掉它。 内核选项 MSDOSFS options MSDOSFS # MSDOS Filesystem &ms-dos; 文件系统。 只要您不打算在启动时挂接由 DOS 格式化的硬盘分区, 就可以把它注释掉。 如前面所介绍的那样, 在您第一次挂接 DOS 分区时, 内核会自动加载需要的模块。 此外, emulators/mtools 软件提供了一个很方便的功能, 通过它您可以直接访问 DOS 软盘而无需挂接或卸下它们 (而且也完全不需要 MSDOSFS)。 options CD9660 # ISO 9660 Filesystem 用于 CDROM 的 ISO 9660 文件系统。 如果没有 CDROM 驱动器或很少挂接光盘数据 (因为在首次使用数据 CD 时会自动加载), 就可以把它注释掉。 音乐 CD 并不需要这个选项。 options PROCFS # Process filesystem (requires PSEUDOFS) 进程文件系统。 这是一个挂接在 /proc 的一个 假扮的 文件系统, 其作用是允许类似 &man.ps.1; 这样的程序给出正在运行的进程的进一步信息。 多数情况下, 并不需要使用 PROCFS, 因为绝大多数调试和监控工具, 已经进行了一系列修改, 使之不再依赖 PROCFS: 默认安装的系统中并不会挂接这一文件系统。 options PSEUDOFS # Pseudo-filesystem framework 在 6.X 内核中, 如果希望使用 PROCFS, 就必须加入 PSEUDOFS 的支持。 options GEOM_GPT # GUID Partition Tables. 这个选项提供了在磁盘上使用大量的分区的能力。 options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!] 使系统兼容4.3BSD。不要去掉这一行,不然有些程序将无法正常运行。 options COMPAT_FREEBSD4 # Compatible with &os;4 为了支持在旧版本的&os;下编译的程序,该选项在&os; 5.X &i386;和Alpha systems下需要打开。 最好在所有的&i386;和Alpha systems下打开这个选项,因为可能要运行老应用程序。 在5.X才开始支持的平台,比如ia64和&sparc64;,就不需要这个选项。 options COMPAT_FREEBSD5 # Compatible with &os;5 对于 &os; 6.X 和更高版本而言, 如果希望在其上运行为 &os; 5.X 版本联编的、 用到 &os; 5.X 系统调用接口的程序, 则需要使用这个选项。 options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI 这将让内核在探测每个 SCSI 设备之前等待 5 秒。 如果您只有 IDE 硬盘驱动器, 就可以不管它, 反之您可能会希望尝试降低这个数值以加速启动过程。 当然, 如果您这么做之后 &os; 在识别您的 SCSI 设备时遇到问题, 则您还需要再把它改回去。 options KTRACE # ktrace(1) support 这个选项打开内核进程跟踪,在调试时很有用。 options SYSVSHM # SYSV-style shared memory 提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸, 不少绘图相关程序会自动使用SHM来提供额外的速度。如果您要使用X Window,您最好加入这个选项。 options SYSVMSG # SYSV-style message queues 支持 System V 消息。 这只会在内核中增加数百字节的空间占用。 options SYSVSEM # SYSV-style semaphores 支持System V 信号量, 不常用到, 但只在kernel中占用几百个字节的空间。 &man.ipcs.1; 命令的 选项可以显示出任何用到这些 System V 机制的进程。 options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions 在 1993 年 &posix; 添加的实时扩展。 在 Ports Collection 中某些应用程序会用到这些 (比如&staroffice;)。 options KBD_INSTALL_CDEV # install a CDEV entry in /dev 这个选项是在 /dev下建立键盘设备节点必需的。 options ADAPTIVE_GIANT # Giant mutex is adaptive. 内核全局锁 (Giant) 是一种互斥机制 (休眠互斥体) 的名字, 它用于保护许多内核资源。 现在, 这已经成为了一种无法接受的性能瓶颈, 它已经被越来越多地使用保护单个资源的锁代替。 ADAPTIVE_GIANT 选项将使得内核全局锁作为一种自适应自旋锁。 这意味着, 当有线程希望锁住内核全局锁互斥体, 但互斥体已经被另一个 CPU 上的线程锁住的时候, 它将继续运行, 直到那个线程释放锁为止。 一般情况下, 另一个线程将进入休眠状态并等待下一次调度。 如果您不确定是否应该这样做的话, 一般应该打开它。 请注意在 &os; 8.0-CURRENT 及以后的版本,所有的互斥体默认都是自适应的, 除非在编译时使用 NO_ADAPTIVE_MUTEXES 选项, 明确的指定为非自适应。因此,内核全局锁(Giant)目前默认也是自适应的, 而且 ADAPTIVE_GIANT 选项已经从内核配置文件中移出。 内核选项 SMP device apic # I/O APIC apic 设备将启用使用 I/O APIC 作为中断发送设备的能力。 apic 设备可以被 UP 和 SMP 内核使用, 但 SMP 内核必须使用它。 要支持多处理器, 还需要加上 options SMP The apic device exists only on the i386 architecture, this configuration line should not be used on other architectures. device eisa 如果您的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。 device pci 如果您的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。 # Floppy drives device fdc 这是软驱控制器。 # ATA and ATAPI devices device ata 这个驱动器支持所有ATA和ATAPI设备。您只要在内核中加入device ata选项, 就可以让内核支持现代计算机上的所有PCI ATA/ATAPI设备。 device atadisk # ATA disk drives 这个是使用 ATAPI 硬盘驱动器时必须加入的选项。 device ataraid # ATA RAID drives 这个选项需要 device ata, 它用于 ATA RAID 驱动。 device atapicd # ATAPI CDROM drives 这个是ATAPI CDROM驱动器所必须的。 device atapifd # ATAPI floppy drives 这个是ATAPI 软盘驱动器所必须的。 device atapist # ATAPI tape drives 这个是ATAPI 磁带机驱动器所必须的. options ATA_STATIC_ID # Static device numbering 这指定对控制器使用其静态的编号; 如果没有这个选项, 则会动态地分配设备的编号。 # SCSI Controllers device ahb # EISA AHA1742 family device ahc # AHA2940 and onboard AIC7xxx devices options AHC_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~128k to driver. device ahd # AHA39320/29320 and onboard AIC79xx devices options AHD_REG_PRETTY_PRINT # Print register bitfields in debug # output. Adds ~215k to driver. device amd # AMD 53C974 (Teckram DC-390(T)) device isp # Qlogic family #device ispfw # Firmware for QLogic HBAs- normally a module device mpt # LSI-Logic MPT-Fusion #device ncr # NCR/Symbios Logic device sym # NCR/Symbios Logic (newer chipsets + those of `ncr') device trm # Tekram DC395U/UW/F DC315U adapters device adv # Advansys SCSI adapters device adw # Advansys wide SCSI adapters device aha # Adaptec 154x SCSI adapters device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60. device bt # Buslogic/Mylex MultiMaster SCSI adapters device ncv # NCR 53C500 device nsp # Workbit Ninja SCSI-3 device stg # TMC 18C30/18C50 SCSI控制器。可以注释掉您系统中没有的设备。 如果您只有IDE设备,您可以把这些一起删掉。 *_REG_PRETTY_PRINT 这样的配置, 则是对应驱动程序的调试选项。 # SCSI peripherals device scbus # SCSI bus (required for SCSI) device ch # SCSI media changers device da # Direct Access (disks) device sa # Sequential Access (tape etc) device cd # CD device pass # Passthrough device (direct SCSI access) device ses # SCSI Environmental Services (and SAF-TE) SSCSI外围设备。也可以像上面一样操作。 目前系统提供的 USB &man.umass.4; 以及少量其它驱动使用了 SCSI 子系统, 尽管它们并不是真的 SCSI 设备。 因此, 如果在内核配置使用了这类驱动程序, 请务必不要删除 SCSI 支持。 # RAID controllers interfaced to the SCSI subsystem device amr # AMI MegaRAID device arcmsr # Areca SATA II RAID device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID device ciss # Compaq Smart RAID 5* device dpt # DPT Smartcache III, IV - See NOTES for options device hptmv # Highpoint RocketRAID 182x device rr232x # Highpoint RocketRAID 232x device iir # Intel Integrated RAID device ips # IBM (Adaptec) ServeRAID device mly # Mylex AcceleRAID/eXtremeRAID device twa # 3ware 9000 series PATA/SATA RAID # RAID controllers device aac # Adaptec FSA RAID device aacp # SCSI passthrough for aac (requires CAM) device ida # Compaq Smart RAID device mfi # LSI MegaRAID SAS device mlx # Mylex DAC960 family device pst # Promise Supertrak SX6000 device twe # 3ware ATA RAID 支持RAID控制器。如果您没有这些,可以把它们注释掉或是删掉。 # atkbdc0 controls both the keyboard and the PS/2 mouse device atkbdc # AT keyboard controller 键盘控制器(atkbdc)提供AT键盘输入以及PS/2指针设备的I/O服务。 键盘驱动程序(atkbd)与PS/2鼠标驱动程序(psm)需要这个控制器,所以不要删除它。 device atkbd # AT keyboard atkbd驱动程序,与atkbdc控制器一起使用, 提供连接到AT键盘控制器的AT 84键盘与AT加强型键盘的访问服务。 device psm # PS/2 mouse 如果您的鼠标连接到PS/2鼠标端口,就使用这个设备驱动程序。 device kbdmux # keyboard multiplexer 针对键盘多路选择器的基本支持。 如果您不打算使用多个键盘, 则可以放心地删除这一行。 device vga # VGA video card driver 显卡驱动。 device splash # Splash screen and screen saver support 启动时的 splash 画面! 屏幕保护程序也需要这一选项。 # syscons is the default console driver, resembling an SCO console device sc sc 是默认的控制台驱动程序, 类似 SCO 控制台。 由于绝大部分全屏幕程序都通过类似 termcap 这样的终端数据库函数库赖访问控制台, 因此无论您使用这个或与 VT220 兼容的 vt 都没有什么关系。 如果您在运行这种控制台时使用全屏幕程序时发生问题, 请在登录之后将 TERM 变量设置为 scoansi # Enable this for the pcvt (VT220 compatible) console driver #device vt #options XSERVER # support for X server on a vt console #options FAT_CURSOR # start with block cursor 这是一个兼容 VT220 的控制台驱动, 它同时能够向下兼容 VT100/102。 在同 sc 硬件不兼容的一些笔记本上它能够运行的很好。 当然, 登录系统时请把 TERM 变量设置为 vt100vt220。 此驱动在连接网络上大量不同的机器时也被证明非常有用, 因为此时 termcapterminfo 通常没有可用的 sc 设备 — 而 vt100 则几乎每种平台都支持。 device agp 如果您的机器使用 AGP 卡, 请把上面一行加入配置。 这将启用 AGP, 以及某些卡上的 AGP GART 支持。 APM # 电源管理支持 (参见 NOTES 了解更多选项) #device apm - 高级电源管理支持。 对笔记本有用, - 不过在 &os; 5.X 和更高版本中的 + 高级电源管理支持。对笔记本有用,不过在 GENERIC 里默认禁用。 # 增加 i8254 的 挂起/恢复 支持。 device pmtimer 用于电源管理事件, 例如 APM 和 ACPI 的时钟设备驱动。 # PCCARD (PCMCIA) support # PCMCIA and cardbus bridge support device cbb # cardbus (yenta) bridge device pccard # PC Card (16-bit) bus device cardbus # CardBus (32-bit) bus PCMCIA支持。如果您使用膝上型计算机,您需要这个。 # Serial (COM) ports device sio # 8250, 16[45]50 based serial ports 这些串口在 &ms-dos;/&windows; 的世界中称为 COM 口。 如果使用内置式的调制解调器, 并占用 COM4 而您另有一个串口在 COM2, 则必须把调制解调器的 IRQ 改为 2 (由于晦涩的技术原因, IRQ2 = IRQ 9) 才能够在 &os; 中访问它。 如果有多口的串口卡, 请参考 &man.sio.4; 以了解需要在 /boot/device.hints 中进行的设置。 某些显卡 (特别是基于 S3 芯片的卡) 使用形如 0x*2e8 的 IO 地址, 而许多廉价的串口卡不能够正确地对 16-位 IO 地址空间进行解码, 因此它们会产生冲突, 并造成 COM4 实际上无法使用。 每一个串口都需要有一个唯一的 IRQ (除非您使用支持中断分享的串口卡), 因此默认的 COM3COM4 IRQ 是不能使用的。 # Parallel port device ppc ISA-bus并行接口。 device ppbus # Parallel port bus (required) 提供并行总线的支持。 device lpt # Printer 提供并口打印机的支持。 要使用并口打印机,就必须同时加入上面三行设置。 device plip # TCP/IP over parallel 这是针对并行网络接口的驱动器。 device ppi # Parallel port interface device 普通用途的I/O (geek port) + IEEE1284 I/O. #device vpo # Requires scbus and da zip drive 这是针对Iomega Zip驱动器的。它要求scbusda的支持。 最好的执行效果是工作在EPP 1.9模式。 #device puc 如果您有由 &man.puc.4; 支持的 串行或并行 PCI 卡, 则应去掉这一行的注释。 # PCI Ethernet NICs. device de # DEC/Intel DC21x4x (Tulip) device em # Intel PRO/1000 adapter Gigabit Ethernet Card device ixgb # Intel PRO/10GbE Ethernet Card device txp # 3Com 3cR990 (Typhoon) device vx # 3Com 3c590, 3c595 (Vortex) 多种PCI网卡驱动器。注释或删除您系统中没有的设备. # PCI Ethernet NICs that use the common MII bus controller code. # NOTE: Be sure to keep the 'device miibus' line in order to use these NICs! device miibus # MII bus support MII总线支持对于一些PCI 10/100 Ethernet NIC来说是必需的。 device bce # Broadcom BCM5706/BCM5708 Gigabit Ethernet device bfe # Broadcom BCM440x 10/100 Ethernet device bge # Broadcom BCM570xx Gigabit Ethernet device dc # DEC/Intel 21143 and various workalikes device fxp # Intel EtherExpress PRO/100B (82557, 82558) device lge # Level 1 LXT1001 gigabit ethernet device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet device nge # NatSemi DP83820 gigabit ethernet device nve # nVidia nForce MCP on-board Ethernet Networking device pcn # AMD Am79C97x PCI 10/100 (precedence over 'lnc') device re # RealTek 8139C+/8169/8169S/8110S device rl # RealTek 8129/8139 device sf # Adaptec AIC-6915 (Starfire) device sis # Silicon Integrated Systems SiS 900/SiS 7016 device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet device ste # Sundance ST201 (D-Link DFE-550TX) device stge # Sundance/Tamarack TC9021 gigabit Ethernet device ti # Alteon Networks Tigon I/II gigabit Ethernet device tl # Texas Instruments ThunderLAN device tx # SMC EtherPower II (83c170 EPIC) device vge # VIA VT612x gigabit ethernet device vr # VIA Rhine, Rhine II device wb # Winbond W89C840F device xl # 3Com 3c90x (Boomerang, Cyclone) 使用MII总线控制器代码的驱动器。 # ISA Ethernet NICs. pccard NICs included. device cs # Crystal Semiconductor CS89x0 NIC # 'device ed' requires 'device miibus' device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards device ex # Intel EtherExpress Pro/10 and Pro/10+ device ep # Etherlink III based cards device fe # Fujitsu MB8696x based cards device ie # EtherExpress 8/16, 3C507, StarLAN 10 etc. device lnc # NE2100, NE32-VL Lance Ethernet cards device sn # SMC's 9000 series of Ethernet chips device xe # Xircom pccard Ethernet # ISA devices that use the old ISA shims #device le ISA 以太网卡驱动。 参见 /usr/src/sys/i386/conf/NOTES 以了解关于哪个驱动程序能够驱动您的网卡的细节。 # Wireless NIC cards device wlan # 802.11 support 通用 802.11 支持。 这行配置是无线网络所必需的。 device wlan_wep # 802.11 WEP support device wlan_ccmp # 802.11 CCMP support device wlan_tkip # 802.11 TKIP support 针对 802.11 设备的加密支持。 如果希望使用加密和 802.11i 安全协议, 就需要这些配置行。 device an # Aironet 4500/4800 802.11 wireless NICs. device ath # Atheros pci/cardbus NIC's device ath_hal # Atheros HAL (Hardware Access Layer) device ath_rate_sample # SampleRate tx rate control for ath device awi # BayStack 660 and others device ral # Ralink Technology RT2500 wireless NICs. device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs. #device wl # Older non 802.11 Wavelan wireless NIC. 用以支持多种无线网卡。 # Pseudo devices device loop # Network loopback 这是 TCP/IP 的通用回环设备。 如果您 telnet 或 FTP 到 localhost (也就是 127.0.0.1) 则将通过这个设备回到本机。 这个设备是 必需的 device random # Entropy device Cryptographically secure random number generator. device ether # Ethernet support ether 只有在使用以太网卡时才需要。 它包含了通用的以太网协议代码。 device sl # Kernel SLIP sl 用以提供 SLIP 支持。 目前它几乎已经完全被 PPP 取代了, 因为后者更容易配置, 而且更适合调制解调器之间的连接, 并提供了更强大的功能。 device ppp # Kernel PPP 这一选项用以提供内核级的 PPP 支持, 用于拨号连接。 也有以用户模式运行的 PPP 实现, 使用 tun 并提供包括按需拨号在内的更为灵活的功能。 device tun # Packet tunnel. 它会被用户模式的 PPP 软件用到。 参考本书的 PPP 以了解更多的细节。 device pty # Pseudo-ttys (telnet etc) 这是一个 pseudo-terminal 或模拟登入端口。 它用来接收连入的 telnet 以及 rlogin 会话、 xterm, 以及一些其它程序如 Emacs 等。 device md # Memory disks 内存盘伪设备。 device gif # IPv6 and IPv4 tunneling 它实现了在 IPv4 上的 IPv6 隧道、 IPv6 上的 IPv4 隧道、 IPv4 上的 IPv4 隧道、 以及IPv6 上的 IPv6隧道。 gif 设备是 自动克隆 的, 它会根据需要自动创建设备节点。 device faith # IPv6-to-IPv4 relaying (translation) 这个伪设备能捕捉发给它的数据包,并把它们转发给 IPv4/IPv6 翻译服务程序。 # The `bpf' device enables the Berkeley Packet Filter. # Be aware of the administrative consequences of enabling this! # Note that 'bpf' is required for DHCP. device bpf # Berkeley packet filter 这是 Berkeley 包过滤器。这个伪设备允许网络接口被置于混杂模式, 从而,截获广播网 (例如,以太网) 上的每一个数据包。 截获的数据报可以保存到磁盘上,也可以使用 &man.tcpdump.1; 程序来分析。 &man.bpf.4; 设备也被用于 &man.dhclient.8; 来获取默认路由器(网关)的 IP 地址。如果使用DHCP,就不要注释掉这行。 # USB support device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface device ehci # EHCI PCI->USB interface (USB 2.0) device usb # USB Bus (required) #device udbp # USB Double Bulk Pipe devices device ugen # Generic device uhid # Human Interface Devices device ukbd # Keyboard device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da device ums # Mouse device ural # Ralink Technology RT2500USB wireless NICs device urio # Diamond Rio 500 MP3 player device uscanner # Scanners # USB Ethernet, requires mii device aue # ADMtek USB Ethernet device axe # ASIX Electronics USB Ethernet device cdce # Generic USB over Ethernet device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet 支持各类 USB 设备。 # FireWire support device firewire # FireWire bus code device sbp # SCSI over FireWire (Requires scbus and da) device fwe # Ethernet over FireWire (non-standard!) 支持各类火线设备。 要了解 &os; 所支持的设备的其他情况, 请参考 /usr/src/sys/i386/conf/NOTES 大内存支持(<acronym>PAE</acronym>) 物理地址扩展 (PAE) 大内存 大内存配置的机器需要超过4GB的虚拟地址。 因为4GB的限制,Intel在&pentium;及后续的CPUs上增加了36位物理地址的支持。 物理地址扩展 (PAE) 是 &intel; &pentium; Pro和后续的 CPU 提供的一种允许将内存地址扩展到 64GB 的功能, &os; 的所有最新版本均支持此功能, 并通过 选项来启用这个能力。 因为Intel架构的限制, 高于或低于 4GB 都没有什么区别, 超过 4GB 的内存分配只是简单地添加到可用内存池中。 为了让内核支持PAE,只要增加下面这一行到配置文件: options PAE PAE在&os;里面现在只能支持 &intel; IA-32处理器。 同时,还应该注意,&os;的PAE支持没有经过广泛的测试, 和其他稳定的特性相比只能当作是beta版。 PAE在&os;下有如下的一些限制: 进程不能接触大于4GB的VM空间。 KLD 模块不能加载到一个打开了PAE支持的内核里面, 这是因为内核模块和内核的建立框架不一样。 没有使用 &man.bus.dma.9; 接口的设备驱动程序在打开了 PAE 支持的内核中会导致数据损坏。 因为这个原因, PAE 内核配置文件 会把所有在打开了 PAE 的内核上不能工作的驱动程序排除在外。 一些系统打开了探测系统内存资源使用能力的功能,因为打开了 PAE支持,这些功能可能会被覆盖掉。 其中一个例子就是内核参数,它是控制 内核能使用的最大vnodes数目的,建议重新调整它及其他类似参数到合适的值。 为了避免KVA的消耗,很有必要增加系统的内核虚拟地址, 或者减少很耗系统资源的内核选项的总量(看上面)。选项 可以用来增加KVA空间。 为了稳定和高性能,建议查看&man.tuning.7;手册页。&man.pae.4;手册页包含 &os;'sPAE支持的最新信息。 如果出现问题怎么办 在定制一个内核时,可能会出现四种问题。它们是: config失败: 如果 &man.config.8; 在给出您的内核描述时失败, 则可能在某些地方引入了一处小的错误。 幸运的是, &man.config.8; 会显示出它遇到问题的行号, 这样您就能够迅速地定位错误。 例如, 如果您看到: config: line 17: syntax error 可以通过与 GENERIC 或其他参考资料对比, 来确定这里的关键词是否拼写正确。 make失败: 如果 make 命令失败, 它通常表示内核描述中发生了 &man.config.8; 无法找出的的错误。 同样地, 仔细检查您的配置, 如果仍然不能解决问题, 发一封邮件到 &a.questions; 并附上您的内核配置, 则问题应该很快就能解决。 内核无法启动: 如果您的内核无法启动, 或不识别您的设备, 千万别慌! 非常幸运的是, &os; 有一个很好的机制帮助您从不兼容的内核恢复。 在 &os; 启动加载器那里简单地选择一下要启动的内核就可以了。 当系统在引导菜单的 10 秒倒计时时进入它, 方法是选择 Escape to a loader prompt 选项, 其编号为 6。 输入 unload kernel, 然后输入 boot /boot/kernel.old/kernel, 或者其他任何一个可以正确引导的内核即可。 当重新配置内核时, 保持一个已经证明能够正常启动的内核永远是一个好习惯。 当使用好的内核启动之后您可以检查配置文件并重新尝试编译它。 比较有用的资源是 /var/log/messages 文件, 它会记录每次成功启动所产生的所有内核消息。 此外, &man.dmesg.8; 命令也会显示这次启动时产生的内核消息。 如果在编译内核时遇到麻烦, 请务必保留一个 GENERIC 或已知可用的其他内核, 并命名为别的名字以免在下次启动时被覆盖。 不要依赖 kernel.old 因为在安装新内核时, kernel.old 会被上次安装的那个可能不正常的内核覆盖掉。 另外, 尽快把可用的内核挪到 /boot/kernel 否则类似 &man.ps.1; 这样的命令可能无法正常工作。 为了完成这一点, 需要修改目录的名字: &prompt.root; mv /boot/kernel /boot/kernel.bad &prompt.root; mv /boot/kernel.good /boot/kernel 内核工作,但是&man.ps.1;根本不工作: 如果您安装了一个与系统中内建工具版本不同的内核, 例如在 -STABLE 系统上安装了 -CURRENT 的内核, 许多用于检查系统状态的工具如 &man.ps.1; 和 &man.vmstat.8; 都将无法正常使用。 您应该 重新编译一个和内核版本一致的系统。 这也是为什么一般不鼓励使用与系统其他部分版本不同的内核的一个主要原因。 diff --git a/zh_CN.GB2312/books/handbook/mac/chapter.sgml b/zh_CN.GB2312/books/handbook/mac/chapter.sgml index e98789652c..5646a8769d 100644 --- a/zh_CN.GB2312/books/handbook/mac/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mac/chapter.sgml @@ -1,1780 +1,1777 @@ Tom Rhodes 原作 强制访问控制 概要 MAC 强制访问控制 MAC &os; 5.X 在 &posix;.1e 草案的基础上引入了 TrustedBSD 项目提供的新的安全性扩展。 新安全机制中最重要的两个, 是文件系统访问控制列表 (ACL) 和强制访问控制 (MAC) 机制。 强制访问控制允许加载新的访问控制模块, 并借此实施新的安全策略, 其中一部分为一个很小的系统子集提供保护并加强特定的服务, 其他的则对所有的主体和客体提供全面的标签式安全保护。 定义中有关强制的部分源于如下事实, 控制的实现由管理员和系统作出, 而不像自主访问控制 (DAC, &os; 中的标准文件以及 System V IPC 权限) 那样是按照用户意愿进行的。 本章将集中讲述强制访问控制框架 (MAC 框架) 以及一套用以实施多种安全策略的插件式的安全策略模块。 阅读本章之后, 您将了解: 目前 &os; 中具有哪些 MAC 安全策略模块, 以及与之相关的机制。 MAC 安全策略模块将实施何种策略, 以及标签式与非标签式策略之间的差异。 如何高效地配置系统令使其使用 MAC 框架。 如何配置 MAC 框架所提供的不同的安全策略模块。 如何用 MAC 框架构建更为安全的环境, 并举例说明。 如何测试 MAC 配置以确保正确构建了框架。 阅读本章之前, 您应该: 了解 &unix; 和 &os; 的基础 ()。 熟悉内核配置/编译 () 的基础。 对安全及其如何与 &os; 相配合有些了解; ()。 对本章信息的不当使用可能导致丧失系统访问权, 激怒用户, 或者无法访问 X11 提供的特性。 更重要的是, MAC 不能用于彻底保护一个系统。 MAC 框架仅用于增强现有安全策略; 如果没有健全的安全条例以及定期的安全检查, 系统将永远不会绝对安全。 此外还需要注意的是, 本章中所包含的例子仅仅是例子。 我们并不建议在一个生产用系统上进行这些特别的设置。 实施各种安全策略模块需要谨慎的考虑与测试, 因为那些并不完全理解所有机制如何工作的人, 可能会发现需要对整个系统中很多的文件或目录进行重新配置。 未涉及的内容 本章涵盖了与 MAC 框架有关的诸多方面的安全问题; 而新的 MAC 安全策略模块的开发成果则不会涉及。 MAC 框架中所包含的一部分安全策略模块, 具有一些用于测试及新模块开发的特定属性, 其中包括 &man.mac.test.4;、 &man.mac.stub.4; 以及 &man.mac.none.4;。 关于这些安全策略模块及其提供的众多机制的详细信息,请参阅联机手册中的内容。 本章出现的重要术语 在阅读本章之前, 有些关键术语需要解释, 希望能藉此扫清可能出现的疑惑, 并避免在文中对新术语、 新信息进行生硬的介绍。 区间(compartment): (译注: 区间 这一术语, 在一些文献中也称做类别 (category)。 此外, 在其它一些翻译文献中, 该术语也翻译为 象限。) 指一组被划分或隔离的程序和数据, 其中, 用户被明确地赋予了访问特定系统组件的权限。 同时, 区间也能够表达分组, 例如工作组、 部门、 项目, 或话题。 可以通过使用区间来实施 need-to-know 安全策略。 高水位线(high water mark): 高水位线策略是一种允许提高安全级别, 以期访问更高级别的信息的安全策略。 在多数情况下, 当进程结束时, 又会回到原先的安全级别。 目前, &os; MAC 框架尚未提供这样的策略, 在这里介绍其定义主要是希望给您一个完整的概念。 完整性(integrity): 作为一个关键概念, 完整性是数据可信性的一种程度。 若数据的完整性提高, 则数据的可信性相应提高。 标签(label): 标签是一种可应用于文件、 目录或系统其他客体的安全属性, 它也可以被认为是一种机密性印鉴。 当一个文件被施以标签时, 其标签会描述这一文件的安全参数, 并只允许拥有相似安全性设置的文件、 用户、 资源等访问该文件。 标签值的涵义及解释取决于相应的策略配置: 某些策略会将标签当作对某一客体的完整性和保密性的表述, 而其它一些策略则会用标签保存访问规则。 程度(level): 对某种安全属性加强或削弱的设定。 若程度增加, 其安全性也相应增加。 低水位线(low water mark): 低水位线策略允许降低安全级别, 以访问安全性较差的信息。 多数情况下, 在进程结束时, 又会回到原先的安全级别。 目前在 &os; 中唯一实现这一安全策略的是 &man.mac.lomac.4;。 多重标签(multilabel): 属性是一个文件系统选项。 该选项可在单用户模式下通过 &man.tunefs.8; 程序进行设置。 可以在引导时使用的 &man.fstab.5; 文件中, 也可在创建新文件系统时进行配置。 该选项将允许管理员对不同客体施以不同的 MAC 标签。 该选项仅适用于支持标签的安全策略模块。 客体(object): 客体或系统客体是一种实体, 信息随 主体 的导向在客体内部流动。 客体包括目录、 文件、 区段、 显示器、 键盘、 存储器、 磁存储器、 打印机及其它数据存储/转移设备。 基本上, 客体就是指数据容器或系统资源。 对 客体 的访问实际上意味着对数据的访问。 策略(policy): 一套用以规定如何达成目标的规则。 策略 一般用以描述如何对特定客体进行操作。 本章将在安全策略的范畴内讨论策略, 一套用以控制数据和信息流并规定其访问者的规则,就是其中一例。 敏感性(sensitivity): 通常在讨论 MLS 时使用。 敏感性程度曾被用来描述数据应该有何等的重要或机密。 若敏感性程度增加, 则保密的重要性或数据的机密性相应增强。 单一标签(single label): 整个文件系统使用一个标签对数据流实施访问控制, 叫做单一标签。 当文件系统使用此设置时, 即无论何时当 选项未被设定时, 所有文件都将遵守相同标签设定。 主体(subject): 主体就是引起信息在两个 客体 间流动的任意活动实体, 比如用户, 用户进程(译注:原文为 processor), 系统进程等。 在 &os; 中, 主体几乎总是代表用户活跃在某一进程中的一个线程。 关于 MAC 的说明 在掌握了所有新术语之后, 我们从整体上来考虑 MAC 是如何加强系统安全性的。 MAC 框架提供的众多安全策略模块可以用来保护网络及文件系统, 也可以禁止用户访问某些特定的端口、 套接字及其它客体。 将策略模块组合在一起以构建一个拥有多层次安全性的环境, 也许是其最佳的使用方式, 这可以通过一次性加载多个安全策略模块来实现。 在多层次安全环境中, 多重策略模块可以有效地控制安全性, 这一点与强化型 (hardening) 策略, 即那种通常只强化系统中用于特定目的的元素的策略是不同的。 相比之下, 多重策略的唯一不足是需要系统管理员先期设置好参数, 如多重文件系统安全标志、 每一位用户的网络访问权限等等。 与采用框架方式实现的长期效果相比, 这些不足之处是微不足道的。 例如, 让系统具有为特定配置挑选必需的策略的能力, 有助于降低性能开销。 而减少对无用策略的支持, 不仅可以提高系统的整体性能, 而且提供了更灵活的选择空间。 好的实施方案中应该考虑到整体的安全性要求, 并有效地利用框架所提供的众多安全策略模块。 这样一个使用 MAC 特性的系统, 至少要保证不允许用户任意更改安全属性; 所有的用户实用工具、 程序以及脚本, 必须在所选安全策略模块提供的访问规则的约束下工作; 并且系统管理员应掌握 MAC 访问规则的一切控制权。 细心选择正确的安全策略模块是系统管理员专有的职责。 某些环境也许需要限制网络的访问控制权, 在这种情况下, 使用 &man.mac.portacl.4;、 &man.mac.ifoff.4; 乃至 &man.mac.biba.4; 安全策略模块都会是不错的开始; 在其他情况下, 系统客体也许需要严格的机密性, 像 &man.mac.bsdextended.4; 和 &man.mac.mls.4; 这样的安全策略模块就是为此而设。 对安全策略模块的决定可依据网络配置进行, 也许只有特定的用户才应该被允许使用由 &man.ssh.1; 提供的程序以访问网络或互联网, &man.mac.portacl.4; 安全策略模块应该成为这种情况下的选择。 但对文件系统又该作些什么呢? 是由特定的用户或群组来确定某些目录的访问权限, 抑或是将特定客体设为保密以限制用户或组件访问特定文件? 在文件系统的例子中, 也许访问客体的权限对某些用户是保密的, 但对其他则不是。 比如, 一个庞大的开发团队, 也许会被分成许多由几人组成的小组, A 项目中的开发人员可能不被允许访问 B 项目开发人员创作的客体, 但同时他们还需要访问由 C 项目开发人员创作的客体, 这正符合上述情形。 使用由 MAC 框架提供的不同策略, 用户就可以被分成这种小组, 然后被赋予适当区域的访问权, 由此, 我们就不用担心信息泄漏的问题了。 因此, 每一种安全策略模块都有其处理系统整体安全问题的独特方法。 对安全策略模块的选择应在对安全策略深思熟虑的基础之上进行。 很多情况下, 整体安全策略需要重新修正并在系统上实施。 理解 MAC 框架提供的不同安全策略模块会帮助管理员就其面临的情形选择最佳的策略模块。 &os; 的默认内核并不包含 MAC 框架选项, 因此, 在尝试使用本章中的例子或信息之前, 您应该添加以下内核选项: options MAC 此外, 内核还需要重新编译并且重新安装。 尽管有关 MAC 的许多联机手册中都声明它们可以被编译到内核中, 但对这些策略模块的使用仍可能导致锁死系统的网络及其他功能。 使用 MAC 就像使用防火墙一样, 因此必须要小心防止将系统完全锁死。 在使用 MAC 时, 应该考虑是否能够回退到之前的配置, 在远程进行配置更应加倍小心。 理解 MAC 标签 MAC 标签是一种安全属性, 它可以被应用于整个系统中的主体和客体。 配置标签时, 用户必须能够确切理解其所进行的操作。 客体所具有的属性取决于被加载的策略模块, 不同策略模块解释其属性的方式也差别很大。 由于缺乏理解或无法了解其间联系而导致的配置不当, 会引起意想不到的, 也许是不愿看到的系统异常。 客体上的安全标签是由安全策略模块决定的安全访问控制的一部分。 在某些策略模块中, 标签本身所包含的所有信息足以使其作出决策, 而在其它一些安全策略模块中, 标签则可能被作为一个庞大规则体系的一部分进行处理。 举例来说, 在文件上设定 biba/low 标签, 意味着此标签隶属 Biba 策略模块, 其值为 low 某些在 &os; 中支持标签特性的策略会提供三个预定义的标签, 分别是 low、 high 及 equal 标签。 尽管这些标签在不同安全策略模块中会对访问控制采取不同措施, 但有一点是可以肯定的, 那就是 low 标签表示最低限度的设定, equal 标签会将主体或客体设定为被禁用的或不受影响的, high 标签则会应用 Biba 及 MLS 安全策略模块中允许的最高级别的设定。 在单一标签文件系统的环境中, 同一客体上只会应用一个标签, 于是, 一套访问权限将被应用于整个系统, 这也是很多环境所全部需要的。 另一些应用场景中, 我们需要将多重标签应用于文件系统的客体或主体, 如此一来, 就需要使用 &man.tunefs.8; 的 选项。 在使用 Biba 和 MLS 时可以配置数值标签, 以标示分级控制中的层级程度。 数值的程度可以用来划分或将信息按组分类, 从而只允许同程度或更高程度的组对其进行访问。 多数情况下, 管理员将仅对整个文件系统设定单一标签。 等一下, 这看起来很像 DAC! 但我认为 MAC 确实只将控制权赋予了管理员。 此句话依然是正确的。 在某种程度上, root 是实施控制的用户, 他配置安全策略模块以使用户们被分配到适当的类别/访问 levels 中。 唉, 很多安全策略模块同样可以限制 root 用户。 对于客体的基本控制可能会下放给群组, 但 root 用户随时可以废除或更改这些设定。 这就是如 Biba 及 MLS 这样一些安全策略模块所包含的 hierarchal/clearance 模型。 配置标签 实际上, 有关标签式安全策略模块配置的各种问题都是用基础系统组件实现的。 这些命令为客体和主体配置以及配置的实施和验证提供了一个简便的接口。 所有的配置都应该通过 &man.setfmac.8; 及 &man.setpmac.8; 组件实施。 setfmac 命令是用来对系统客体设置 MAC 标签的, 而 setpmac 则是用来对系统主体设置标签的。 例如: &prompt.root; setfmac biba/high test 若以上命令不发生错误则会直接返回命令提示符, 只有当发生错误时, 这些命令才会给出提示, 这和 &man.chmod.1; 和 &man.chown.8; 命令类似。 某些情况下, 以上命令产生的错误可能是 Permission denied, 一般在受限客体上设置或修改设置时会产生此错误。 其它情况也能导致不同的执行失败。 例如, 文件可能并不隶属于尝试重标签该文件的用户, 客体可能不存在或着是只读的。 文件的某一属性、 进程的某一属性或新的自定义标签值的某一属性, 将使强制式策略不允许进程重标签文件。 例如: 低完整性的用户试图修改高完整性文件的标签, 或者低完整性的用户试图将低完整性文件的标签改为高完整性标签。 系统管理员可使用以下命令解决此问题: &prompt.root; setfmac biba/high test Permission denied &prompt.root; setpmac biba/low setfmac biba/high test &prompt.root; getfmac test test: biba/high 如上所示, 通过 setpmac 对被调用的进程赋予不同的标签, 以覆盖安全策略模块的设置。 getpmac 组件通常用于当前运行的进程, 如 sendmail: 尽管其使用进程编号来替代命令, 其逻辑是相同的。 如果用户试图对其无法访问的文件进行操作, 根据所加载的安全策略模块的规则, 函数 mac_set_link 将会给出 Operation not permitted 的错误提示。 一般标签类型 &man.mac.biba.4;、 &man.mac.mls.4; 及 &man.mac.lomac.4; 策略模块提供了设定简单标签的功能, 其值应该是 high、 equal 及 low 之一。 以下是对这些标签功能的简单描述: low 标签被认为是主体或客体所具有的最低层次的标签设定。 对主体或客体采用此设定, 将阻止其访问标签为 high 的客体或主体。 equal 标签只能被用于不希望受策略控制的客体上。 high 标签对客体或主体采用可能的最高设定。 至于每个策略模块, 每种设定都会产生不同的信息流指令。 阅读联机手册中相关的章节将进一步阐明这些一般标签配置的特点。 标签高级配置 如下所示, 用于 比较方式:区间+区间 (comparison:compartment+compartment) 的标签等级数: biba/10:2+3+6(5:2+3-20:2+3+4+5+6) 其含义为: Biba 策略标签/等级 10区间 2、 3及6: (等级5 ...) 本例中, 第一个等级将被认为是 有效区间有效等级, 第二个等级是低级等级, 最后一个则是高级等级。 大多数配置中并不使用这些设置, 实际上, 它们是为更高级的配置准备的。 当把它们应用在系统客体上时, 则只有当前的等级/区间, 因为它们反映可以实施访问控制的系统中可用的范围, 以及网络接口。 等级和区间, 可以用来在一对主体和客体之间建立一种称为 支配 (dominance) 的关系, 这种关系可能是主体支配客体, 客体支配主体, 互不支配或互相支配。 互相支配 这种情况会在两个标签相等时发生。 由于 Biba 的信息流特性, 您可以设置一系列区间, need to know, 这可能发生于项目之间, 而客体也由其对应的区间。 用户可以使用 susetpmac 来将他们的权限进一步细分, 以便在没有限制的区间里访问客体。 用户和标签设置 用户本身也需要设置标签, 以使其文件和进程能够正确地与系统上定义的安全策略互动, 这是通过使用登录分级在文件 login.conf 中配置的。 每个使用标签的策略模块都会进行用户分级设定。 以下是一个使用所有策略模块的例子: default:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\ :path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:\ :manpath=/usr/share/man /usr/local/man:\ :nologin=/usr/sbin/nologin:\ :cputime=1h30m:\ :datasize=8M:\ :vmemoryuse=100M:\ :stacksize=2M:\ :memorylocked=4M:\ :memoryuse=8M:\ :filesize=8M:\ :coredumpsize=8M:\ :openfiles=24:\ :maxproc=32:\ :priority=0:\ :requirehome:\ :passwordtime=91d:\ :umask=022:\ :ignoretime@:\ :label=partition/13,mls/5,biba/10(5-15),lomac/10[2]: label 选项用以设定用户分级默认标签, 该标签将由 MAC 执行。 用户绝不会被允许更改该值, 因此其从用户的观点看不是可选的。 当然, 在真实情况的配置中, 管理员不会希望启用所有策略模块。 我们建议您在实施以上配置之前阅读本章的其余部分。 用户也许会在首次登录后更改其标签, 尽管如此, 这仅仅是策略的主观局限性。 上面的例子告诉 Biba 策略, 进程的最小完整性是为5, 最大完整性为15, 默认且有效的标签为10。 进程将以10的完整性运行直至其决定更改标签, 这可能是由于用户使用了 setpmac 命令 (该操作将在登录时被 Biba 限制在一定用户范围之内)。 在所有情况下, 修改 login.conf 之后, 都必须使用 cap_mkdb 重编译登录分级 capability 数据库, 这在接下来的例子和讨论中就会有所体现。 很多站点可能拥有数目可观的用户需要不同的用户分级, 注意到这点是大有裨益的。 深入来说就是需要事先做好计划, 因为管理起来可能十分困难。 在 &os 以后的版本中, 将包含一种将用户映射到标签的新方式, 尽管如此, 这也要到 &os; 5.3 之后的某个时间才能实现。 网络接口和标签设定 也可以在网络接口上配置标签, 以控制进出网络的数据流。 在所有情况下, 策略都会以适应客体的方式运作。 例如, 在 biba 中设置为高的用户, 就不能访问标记为低的网络接口。 可以作为 ifconfig 的参数用于设置网络接口的 MAC 标签。 例如: &prompt.root; ifconfig bge0 maclabel biba/equal 将在 &man.bge.4; 接口上设置 biba/equalMAC 标签。 当使用类似 biba/high(low-high) 这样的标签时, 整个标签应使用引号括起来; 否则将发生错误。 每一个支持标签的策略模块都提供了用于在网络接口上禁用该 MAC 标签的系统控制变量。 将标签设置为 的效果与此类似。 请参见 sysctl 的输出、 策略模块的联机手册, 或本章接下来的内容, 以了解更进一步的详情。 用单一标签还是多重标签? 默认情况下, 系统采用的是 选项。 但这对管理员意味着什么呢? 两种策略之间存在很多的不同之处, 它们在系统安全模型的灵活性方面, 提供了不同的选择。 只允许在每个主体或客体上使用一个标签, 如 biba/high。 这降低了管理的开销, 但也同时降低了支持标签的策略的灵活性。 许多管理员可能更希望在安全策略中使用 选项允许每一个主体或客体拥有各自独立的 MAC 标签, 起作用与标准的、 只允许整个分区上使用一个的 选项类似。 标签选项只有对实现了标签功能的那些策略, 如 Biba、 Lomac、 MLS 以及 SEBSD 才有意义。 很多情况下是不需要设置 的。 考虑下列情形和安全模型: 使用了 MAC 以及许多混合策略的 &os; web-服务器。 这台机器上的整个系统中只需要一个标签, 即 biba/high。 此处的文件系统并不需要 选项, 因为有效的 label 只有一个。 因为这台机器将作为 Web 服务器使用, 因此应该以 biba/low 运行 Web 服务, 以杜绝向上写。 Biba 策略以及它如何运作将在稍后予以讨论, 因此, 如果您感觉前面的说明难以理解的话, 请继续阅读下面的内容, 再回来阅读这些内容就会有较为清晰的认识了。 服务器可以使用设置为 biba/low 的单独的分区, 用于保持其运行环境的状态。 这个例子中还省略了许多内容, 例如, 如何为数据配置访问限制、 参数配置和用户的设置; 它只是为前述的内容提供一个简单的例子。 如果打算使用非标签式策略, 就不需要 选项了。 这些策略包括 seeotheruidsportaclpartition 另一个需要注意的事情是, 在分区上使用 并建立基于 可能会提高系统管理的开销, 因为文件系统中的所有客体都需要指定标签。 这包括对目录、文件, 甚至设备节点。 接下来的命令将在需要使用多个标签的文件系统上设置 。 这一操作只能在单用户模式下完成: &prompt.root; tunefs -l enable / 交换区不需要如此配置。 某些用户可能会在根分区上配置 标志时遇到困难。 如果发生这样的情况, 请复查本章的 规划安全配置 在实施新技术时, 首先进行规划都是非常好的习惯。 在这段时间, 管理员一般都应 进行全面的考察, 这至少应包括下列因素: 方案实施的必要条件; 方案实施的目标; 就实施 MAC 而言, 这包括: 如何在目标系统上对信息和资源进行分类。 需要限制哪类信息或资源的访问, 以及应采用何种限制。 需要使用哪些 MAC 模块来完成这些目标。 尽管重新配置并修改系统资源和安全配置是可行的, 但查找整个系统并修复暨存的文件和用户帐号并不是一件轻而易举的事情。 规划有助于完成无问题且有效的可信系统实施。 事先 对采用 MAC 的可信系统, 以及其配置做试运行十分有益, 因为这对实施的成败至关重要。 草率散漫地配置 MAC 通常是导致失败的祸根。 不同的环境可能会有不同的需求。 建立多层次而完备的安全配置, 可以减少系统正式运转之后所需要的微调。 同样地, 接下来的章节将介绍管理员能够使用的各种不同的模块; 描述它们的使用和配置; 除此之外还有一些关于它们最适合的情景的介绍。 例如, web 服务器可能希望使用 &man.mac.biba.4; 和 &man.mac.bsdextended.4; 策略, 而其他情况下, 例如一台机器上只有少量的本地用户时, &man.mac.partition.4; 则是不错的选择。 模块配置 MAC 框架中的每个模块, 都可以像前述那样连编入内核, 或作为运行时内核模块加载。 推荐的用法, 是通过在 /boot/loader.conf 加入适当的设置, 以便在系统启动时的初始化操作过程中加载这些模块。 接下来的一些小节, 将讨论许多 MAC 模块, 并简单介绍它们的功能。 此外, 这一章还将介绍一些具体环境中的用例。 某些模块支持一种称为标签 (labeling) 的用法, 它可以通过使用类似 允许做这个而不允许做那个 的标签来实现访问控制。 标签配置文件可以控制允许的文件访问方式、 网络通讯, 以及许多其他权限。 在前一节中, 我们已经展示了文件系统中如何通过 标志来启用基于文件或分区的访问控制的方法。 单标签配置在整个系统中只强制一个标签的限制, 这也是 tunefs 选项为什么是 的原因。 MAC seeotheruids 模块 MAC 其他 UID 可见策略 模块名: mac_seeotheruids.ko 对应的内核配置: options MAC_SEEOTHERUIDS 引导选项: mac_seeotheruids_load="YES" &man.mac.seeotheruids.4; 模块模仿并扩展了 security.bsd.see_other_uidssecurity.bsd.see_other_gids sysctl 变量。 这一模块并不需要预先配置标签, 它能够透明地与其他模块协同工作。 加载模块之后, 下列 sysctl 变量可以用来控制其功能: security.mac.seeotheruids.enabled 将启用模块的功能, 并使用默认的配置。 这些默认设置将阻止用户看到其他用户的进程和 socket。 security.mac.seeotheruids.specificgid_enabled 将允许特定的组从这一策略中和面。 要将某些组排除在这一策略之外, 可以用 security.mac.seeotheruids.specificgid=XXX sysctl 变量。 前述例子中, XXX 应替换为希望不受限的组 ID 的数值形式。 security.mac.seeotheruids.primarygroup_enabled 可以用来将特定的主要组排除在策略之外。 使用这一变量时, 不能同时设置 security.mac.seeotheruids.specificgid_enabled MAC bsdextended 模块 MAC 文件系统防火墙策略 模块名: mac_bsdextended.ko 对应的内核配置: options MAC_BSDEXTENDED 引导选项: mac_bsdextended_load="YES" &man.mac.bsdextended.4; 模块能够强制文件系统防火墙策略。 这一模块的策略提供了标准文件系统权限模型的一种扩展, 使得管理员能够建立一种类似防火墙的规则集, 以文件系统层次结构中的保护文件、 实用程序,以及目录。 在尝试访问文件系统客体时, 会遍历规则表, 直至找到匹配的规则, 或到达表尾。 这一行为可以通过修改 &man.sysctl.8; 参数, security.mac.bsdextended.firstmatch_enabled 来进行设置。 与 &os; 中的其他防火墙设置类似, 也可以建一个文件来配置访问控制策略, 并通过 &man.rc.conf.5; 变量的配置在系统引导时加载它。 规则表可以通过工具 &man.ugidfw.8; 工具来输入, 其语法类似 &man.ipfw.8;。 此外还可以通过使用 &man.libugidfw.3; 库来开发其他的工具。 当使用这一模块模块时应极其小心; 不正确的使用将导致文件系统的某些部分无法访问。 例子 在加载了 &man.mac.bsdextended.4; 模块之后, 下列命令可以用来列出当前的规则配置: &prompt.root; ugidfw list 0 slots, 0 rules 如希望的那样, 目前还没有定义任何规则。 这意味着一切都还可以访问。 要创建一个阻止所有用户, 而保持 root 不受影响的规则, 只需运行下面的命令: &prompt.root; ugidfw add subject not uid root new object not uid root mode n 在 &os; 5.3 之前的版本中, add 参数并不存在。 此时应使用 set 来代替它。 请参见下面的命令例子。 这本身可能是一个很糟糕的主意, 因为它会阻止所有用户执行哪怕最简单的命令, 例如 ls。 更富于爱心的规则可能是: &prompt.root; ugidfw set 2 subject uid user1 object uid user2 mode n &prompt.root; ugidfw set 3 subject uid user1 object gid user2 mode n 这将阻止任何 user1user2 的主目录的全部访问, 包括目录列表。 user1 可以用 代替。 这将同样的强制访问控制实施在所有用户, 而不是单个用户上。 root 用户不会受到这些变动的影响。 我们已经给出了 &man.mac.bsdextended.4; 模块如何帮助加强文件系统的大致介绍。 要了解更进一步的信息, 请参见 &man.mac.bsdextended.4; 和 &man.ugidfw.8; 联机手册。 MAC ifoff 模块 MAC 接口屏蔽策略 模块名: mac_ifoff.ko 对应的内核配置: options MAC_IFOFF 引导选项: mac_ifoff_load="YES" &man.mac.ifoff.4; 模块完全是为了立即禁止网络接口, 以及阻止在系统初启时启用网络接口而设计的。 它不需要再系统中配置任何标签, 也不依赖于其他 MAC 模块。 绝大多数特性都可以通过调整下面的 sysctl 来加以控制。 security.mac.ifoff.lo_enabled 表示 启用/禁用 环回接口 (&man.lo.4;) 上的全部流量。 security.mac.ifoff.bpfrecv_enabled 表示 启用/禁用 伯克利包过滤器 (&man.bpf.4;) 接口上的全部流量。 security.mac.ifoff.other_enabled 将在所有其他接口 启用/禁用 网络。 最为常用的 &man.mac.ifoff.4; 用法之一是在不允许引导过程中出现网络流量的环境中监视网络。 另一个建议的用法是撰写一个使用 security/aide 的脚本, 以便自动地在受保护的目录中发现新的或修改过的文件时切断网络。 MAC portacl 模块 MAC 端口访问控制表策略 模块名: mac_portacl.ko 对应的内核配置: MAC_PORTACL 引导选项: mac_portacl_load="YES" &man.mac.portacl.4; 模块可以用来通过一系列 sysctl 变量来限制绑定本地的 TCPUDP 端口。 本质上 &man.mac.portacl.4; 使得 非-root 用户能够绑定到它所指定的特权端口, 也就是那些编号小于 1024 的端口。 在加载之后, 这个模块将在所有的 socket 上启用 MAC 策略。 可以调整下列一些配置: security.mac.portacl.enabled 将完全 - 启用/禁用 策略。 由于一个 - bug, security.mac.portacl.enabled - sysctl 变量在 - &os; 5.2.1 和更早版本上并不起作用。 + 启用/禁用 策略。 security.mac.portacl.port_high 将设置为 &man.mac.portacl.4; 所保护的最高端口号。 security.mac.portacl.suser_exempt 如果设置为非零值, 表示将 root 用户排除在策略之外。 security.mac.portacl.rules 将指定实际的 mac_portacl 策略; 请参见下文。 实际的 mac_portacl 策略, 是在 security.mac.portacl.rules sysctl 所指定的一个下列形式的字符串: rule[,rule,...] 其中可以给出任意多个规则。 每一个规则的形式都是: idtype:id:protocol:port。 这里的 idtype 参数可以是 uidgid, 分别表示将 id 参数解释为用户 id 或组 id。 protocol 参数可以用来确定希望应用到 TCPUDP 协议上, 方法是把这一参数设置为 tcpudp。 最后的 port 参数则给出了所指定的用户或组能够绑定的端口号。 由于规则集会直接由内核加以解释, 因此只能以数字形式表示用户 ID、 组 ID, 以及端口等参数。 换言之, 您不能使用用户、 组, 或端口服务的名字来指定它们。 默认情况下, 在 类-&unix; 系统中, 编号小于 1024 的端口只能为特权进程使用或绑定, 也就是那些以 root 身份运行的进程。 为了让 &man.mac.portacl.4; 能够允许非特权进程绑定低于 1024 的端口, 就必须首先禁用标准的 &unix; 限制。 这可以通过把 &man.sysctl.8; 变量 net.inet.ip.portrange.reservedlownet.inet.ip.portrange.reservedhigh 设置为 0 来实现。 请参见下面的例子, 或 &man.mac.portacl.4; 联机手册中的说明, 以了解进一步的信息。 例子 下面的例子更好地展示了前面讨论的内容: &prompt.root; sysctl security.mac.portacl.port_high=1023 &prompt.root; sysctl net.inet.ip.portrange.reservedlow=0 net.inet.ip.portrange.reservedhigh=0 首先我们需要设置使 &man.mac.portacl.4; 管理标准的特权端口, 并禁用普通的 &unix; 绑定限制。 &prompt.root; sysctl security.mac.portacl.suser_exempt=1 您的 root 用户不应因此策略而失去特权, 因此请把 security.mac.portacl.suser_exempt 设置为一个非零的值。 现在您已经成功地配置了 &man.mac.portacl.4; 模块, 并使其默认与 类-&unix; 系统一样运行了。 &prompt.root; sysctl security.mac.portacl.rules=uid:80:tcp:80 允许 UID 为 80 的用户 (正常情况下, 应该是 www 用户) 绑定到 80 端口。 这样 www 用户就能够运行 web 服务器, 而不需要使用 root 权限了。 &prompt.root; sysctl security.mac.portacl.rules=uid:1001:tcp:110,uid:1001:tcp:995 允许 UID 为 1001 的用户绑定 TCP 端口 110 (pop3) 和 995 (pop3s)。 这样用户就能够启动接受来发到 110 和 995 的连接请求的服务了。 MAC partition (分区) 模块 MAC 进程分区策略 模块名: mac_partition.ko 对应的内核配置: options MAC_PARTITION 引导选项: mac_partition_load="YES" &man.mac.partition.4; 策略将把进程基于其 MAC 标签放到特定的 partitions (分区) 中。 这是一种特殊类型的 &man.jail.8;, 但对两者进行比较意义不大。 这个模块应加到 &man.loader.conf.5; 文件中, 以便在启动过程中启用这些规则。 绝大多数这一策略的配置是通过 &man.setpmac.8; 工具来完成的, 它将在后面介绍。 这个策略可以使用下面的 sysctl security.mac.partition.enabled 将启用强制的 MAC 进程 partitions。 当启用了这个规则时, 用户将只能看到他们自己的, 以及其他与他们同处一个 partition 的进程, 而不能使用能够越过 partition 的工具。 例如, insecure class 中的用户, 就无法使用 top 命令, 以及其他需要产生新进程的工具。 要设置或删除 partition 标签中的工具, 需要使用 setpmac &prompt.root; setpmac partition/13 top 这将把 top 命令加入到 insecure class 中的用户的标签集。 注意, 所有由 insecure class 中的用户产生的进程, 仍然会留在 partition/13 标签中。 例子 下面的命令将显示 partition 标签以及进程列表: &prompt.root; ps Zax 接下来的这个命令将允许察看其他用户的进程 partition 标签, 以及那个用户正在运行的进程: &prompt.root; ps -ZU trhodes 除非加载了 &man.mac.seeotheruids.4; 策略, 否则用户就看不到 root 的标签。 非常手工化的实现, 可能会在 /etc/rc.conf 中禁用所有的服务, 并用脚本来按不同的标签来启动它们。 下面的几个策略支持基于所给出的三种标签的完整性设定。 这些选项, 连同它们的限制, 在模块的联机手册中进行了进一步介绍。 MAC 多级 (Multi-Level) 安全模块 MAC 多级 (Multi-Level) 安全策略 模块名: mac_mls.ko 对应的内核配置: options MAC_MLS 引导选项: mac_mls_load="YES" &man.mac.mls.4; 策略, 通过严格控制信息流向来控制系统中主体和客体的访问。 MLS 环境中, 许可 (clearance) 级别会在每一个主体或客体标签上进行设置, 连同对应的区间。 由于这些透明度或敏感度可以有六千多个层次, 因此为每一个主体或客体进行配置将是一件让任何系统管理员都感到头疼的任务。 所幸的是, 这个策略中已经包含了三个 立即可用的 标签。 这些标签是 mls/lowmls/equal 以及 mls/high。 由于这些标签已经在联机手册中进行了介绍, 这里只给出简要的说明: mls/low 标签包含了最低配置, 从而允许其他客体支配它。 任何标记为 mls/low 的客体将是地透明度的, 从而不允许访问更高级别的信息。 此外, 这个标签也阻止拥有较高透明度的客体向其写入或传递信息。 mls/equal 标签应放到不希望使用这一策略的客体上。 mls/high 标签是允许的最高级别透明度。 指定了这个标签的客体将支配系统中的其他客体; 但是, 它们将不允许向较低级别的客体泄露信息。 MLS 提供了: 提供了一些非层次分类的层次安全模型; 固定规则: 不允许向上读, 不允许向下写 (主体可以读取同级或较低级别的客体, 但不能读取高级别的。 类似地, 主体可以向同级或较高级写, 而不能向下写); 保密 (防止不适当的数据透露); 系统设计的基础要点, 是在多个敏感级别之间并行地处理数据 (而不泄露秘密的和机密的信息)。 下列 sysctl 可以用来配置特殊服务和接口: security.mac.mls.enabled 用来启用/禁用 MLS 策略。 security.mac.mls.ptys_equal 将所有的 &man.pty.4; 设备标记为 mls/equal security.mac.mls.revocation_enabled 可以用来在标签转为较低 grade 时撤销客体访问权。 security.mac.mls.max_compartments 可以用来设置客体的最大区间层次; 基本上, 这也就是系统中所允许的最大区间数。 要管理 MLS 标签, 可以使用 &man.setfmac.8; 命令。 要在客体上指定标签, 需要使用下面的命令: &prompt.root; setfmac mls/5 test 下述命令用于取得文件 test 上的 MLS 标签: &prompt.root; getfmac test 以上是对于 MLS 策略提供功能的概要。 另一种做法是在 /etc 中建立一个主策略文件, 并在其中指定 MLS 策略信息, 作为 setfmac 命令的输入。 这种方法, 将在其他策略之后进行介绍。 规划托管敏感性 通过使用多级安全策略模块, 管理员可以规划如何控制敏感信息的流向。 默认情况下, 由于其默认的禁止向上读以及向下写的性质, 系统会默认将所有客体置于较低的状态。 这样, 所有的客体都可以访问, 而管理员则可以在配置阶段慢慢地进行提高信息的敏感度这样的修改。 除了前面介绍的三种基本标签选项之外, 管理员还可以根据需要将用户和用户组进行分组, 以阻止它们之间的信息流。 一些人们比较熟悉的信息限界词汇, 如 机密秘密, 以及 绝密 可以方便您理解这一概念。 管理员也可以简单地根据项目级别建不同的分组。 无论采用何种分类方法, 在实施限制性的策略之前, 都必须首先想好如何进行规划。 这个安全策略模块最典型的用例是电子商务的 web 服务器, 其上的文件服务保存公司的重要信息以及金融机构的情况。 对于只有两三个用户的个人工作站而言, 则可能不甚适用。 MAC Biba 模块 MAC Biba 完整性策略 模块名: mac_biba.ko 对应的内核配置: options MAC_BIBA 引导选项: mac_biba_load="YES" &man.mac.biba.4; 模块将加载 MAC Biba 策略。 这个策略与 MLS 策略非常类似, 只是信息流的规则有些相反的地方。 通俗地说, 这就是防止敏感信息向下传播, 而 MLS 策略则是防止敏感信息的向上传播; 因而, 这一节的许多内容都可以同时应用于两种策略。 在 Biba 环境中, integrity (完整性) 标签, 将设置在每一个主体或客体上。 这些标签是按照层次级别建立的。 如果客体或主体的级别被提升, 其完整性也随之提升。 被支持的标签是 biba/lowbiba/equal 以及 biba/high; 解释如下: biba/low 标签是客体或主体所能拥有的最低完整性级别。 在客体或主体上设置它, 将阻止其在更高级别客体或主体对其进行的写操作, 虽然读仍被允许。 biba/equal 标签只应在那些希望排除在策略之外的客体上设置。 biba/high 允许向较低标签的客体上写, 但不允许读那些客体。 推荐在那些可能影响整个系统完整性的客体上设置这个标签。 Biba 提供了: 层次式的完整性级别, 并提供了一组非层次式的完整性分类; 固定规则: 不允许向上写, 不允许向下读 (与 MLS 相反)。 主体可以在它自己和较低的级别写, 但不能向更高级别实施写操作。 类似地, 主体也可以读在其自己的, 或更高级别的客体, 但不能读取较低级别的客体; 完整性 (防止对数据进行不正确的修改); 完整性级别 (而不是 MLS 的敏感度级别)。 下列 sysctl 可以用于维护 Biba 策略。 security.mac.biba.enabled 可以用来在机器上启用/禁用是否实施 Biba 策略。 security.mac.biba.ptys_equal 可以用来在 &man.pty.4; 设备上禁用 Biba 策略。 security.mac.biba.revocation_enabled 将在支配主体发生变化时强制撤销对客体的访问权。 要操作系统客体上的 Biba 策略, 需要使用 setfmacgetfmac 命令: &prompt.root; setfmac biba/low test &prompt.root; getfmac test test: biba/low 规划托管完整性 与敏感性不同, 完整性是要确保不受信方不能对信息进行篡改。 这包括了在主体和客体之间传递的信息。 这能够确保用户只能修改甚至访问需要他们的信息。 &man.mac.biba.4; 安全策略模块允许管理员指定用户能够看到和执行的文件和程序, 并确保这些文件能够为系统及用户或用户组所信任, 而免受其他威胁。 在最初的规划阶段, 管理员必须做好将用户分成不同的等级、 级别和区域的准备。 在启动前后, 包括数据以及程序和使用工具在内的客体, 用户都会无法访问。 一旦启用了这个策略模块, 系统将默认使用高级别的标签, 而划分用户级别和等级的工作则交由管理员来进行配置。 与前面介绍的级别限界不同, 好的规划方法可能还包括 topic。 例如, 只允许开发人员修改代码库、 使用源代码编译器, 以及其他开发工具, 而其他用户则分入其他类别, 如测试人员、 设计人员, 以及普通用户, 这些用户可能只拥有读这些资料的权限。 通过其自然的安全控制, 完整性级别较低的主体, 就会无法向完整性级别高的主体进行写操作; 而完整性级别较高的主体, 也不能观察或读较低完整性级别的客体。 通过将客体的标签设为最低级, 可以阻止所有主体对其进行的访问操作。 这一安全策略模块预期的应用场合包括受限的 web 服务器、 开发和测试机, 以及源代码库。 而对于个人终端、 作为路由器的计算机, 以及网络防火墙而言, 它的用处就不大了。 MAC LOMAC 模块 MAC LOMAC 模块名: mac_lomac.ko 对应的内核配置: options MAC_LOMAC 引导选项: mac_lomac_load="YES" MAC Biba 策略不同, &man.mac.lomac.4; 策略只允许在降低了完整性级别之后, 才允许在不破坏完整性规则的前提下访问较低完整性级别的客体。 MAC 版本的 Low-watermark 完整性策略不应与较早的 &man.lomac.4; 实现相混淆, 除了使用浮动的标签来支持主体通过辅助级别区间降级之外, 其工作方式与 Biba 大体相似。 这一次要的区间以 [auxgrade] 的形式出现。 当指定包含辅助级别的 lomac 策略时, 其形式应类似于: lomac/10[2] 这里数字二 (2) 就是辅助级别。 MAC LOMAC 策略依赖于系统客体上存在普适的标签, 这样就允许主体从较低完整性级别的客体读取, 并对主体的标签降级, 以防止其在之后写高完整性级别的客体。 这就是前面讨论的 [auxgrade] 选项, 因此这个策略能够提供更大的兼容性, 而所需要的初始配置也要比 Biba 少。 例子 与 Biba 和 MLS 策略类似; setfmacsetpmac 工具可以用来在系统客体上放置标签: &prompt.root; setfmac /usr/home/trhodes lomac/high[low] &prompt.root; getfmac /usr/home/trhodes lomac/high[low] 注意, 这里的辅助级别是 low, 这一特性只由 MAC LOMAC 策略提供。 MAC Jail 中的 Nagios MAC Jail 中的 Nagios 下面给出了通过多种 MAC 模块, 并正确地配置策略来实现安全环境的例子。 这只是一个测试, 因此不应被看作四海一家的解决之道。 仅仅实现一个策略, 而忽略它不能解决任何问题, 并可能在生产环境中产生灾难性的后果。 在开始这些操作之前, 必须在每一个文件系统上设置 multilabel 选项, 这些操作在这一章开始的部分进行了介绍。 不完成这些操作, 将导致错误的结果。 首先, 请确认已经安装了 net-mngt/nagios-pluginsnet-mngt/nagios, 和 www/apache13 这些 ports, 并对其进行了配置, 且运转正常。 创建一个 insecure (不安全) 用户 Class 首先是在 /etc/login.conf 文件中加入一个新的用户 class: insecure:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\ :path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin :manpath=/usr/share/man /usr/local/man:\ :nologin=/usr/sbin/nologin:\ :cputime=1h30m:\ :datasize=8M:\ :vmemoryuse=100M:\ :stacksize=2M:\ :memorylocked=4M:\ :memoryuse=8M:\ :filesize=8M:\ :coredumpsize=8M:\ :openfiles=24:\ :maxproc=32:\ :priority=0:\ :requirehome:\ :passwordtime=91d:\ :umask=022:\ :ignoretime@:\ :label=biba/10(10-10): 并在 default 用户 class 中加入: :label=biba/high: 一旦完成上述操作, 就需要运行下面的命令来重建数据库: &prompt.root; cap_mkdb /etc/login.conf 引导配置 现在暂时还不要重新启动, 我们还需要在 /boot/loader.conf 中增加下面几行, 以便让模块随系统初始化一同加载: mac_biba_load="YES" mac_seeotheruids_load="YES" 配置用户 使用下面的命令将 root 设为属于默认的 class: &prompt.root; pw usermod root -L default 所有非 root 或系统的用户, 现在需要一个登录 class。 登录 class 是必须的, 否则这些用户将被禁止使用类似 &man.vi.1; 这样的命令。 下面的 sh 脚本应能完成这个工作: &prompt.root; for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \ /etc/passwd`; do pw usermod $x -L default; done; nagioswww 这两个用户归入不安全 class: &prompt.root; pw usermod nagios -L insecure &prompt.root; pw usermod www -L insecure 创建上下文文件 接下来需要创建一个上下文文件; 您可以把下面的实例放到 /etc/policy.contexts 中。 # This is the default BIBA policy for this system. # System: /var/run biba/equal /var/run/* biba/equal /dev biba/equal /dev/* biba/equal /var biba/equal /var/spool biba/equal /var/spool/* biba/equal /var/log biba/equal /var/log/* biba/equal /tmp biba/equal /tmp/* biba/equal /var/tmp biba/equal /var/tmp/* biba/equal /var/spool/mqueue biba/equal /var/spool/clientmqueue biba/equal # For Nagios: /usr/local/etc/nagios /usr/local/etc/nagios/* biba/10 /var/spool/nagios biba/10 /var/spool/nagios/* biba/10 # For apache /usr/local/etc/apache biba/10 /usr/local/etc/apache/* biba/10 这个策略通过在信息流上设置限制来强化安全。 在这个配置中, 包括 root 和其他用户在内的用户, 都不允许访问 Nagios。 作为 Nagios 一部分的配置文件和进程, 都是完全独立的, 也称为 jailed。 接下来可以用下面的命令将其读入系统: &prompt.root; setfsmac -ef /etc/policy.contexts / &prompt.root; setfsmac -ef /etc/policy.contexts / 随环境不同前述的文件系统布局可能会有所不同; 不过无论如何, 都只能在一个文件系统上运行它。 /etc/mac.conf 文件中的 main 小节需要进行下面的修改: default_labels file ?biba default_labels ifnet ?biba default_labels process ?biba default_labels socket ?biba 启用网络 /boot/loader.conf 中增加下列内容: security.mac.biba.trust_all_interfaces=1 将下述内容加入 rc.conf 中的网络接口配置。 如果主 Internet 配置是通过 DHCP 完成的, 则需要在每次系统启动之后手工执行类似的配置: maclabel biba/equal 测试配置 MAC Configuration Testing (MAC 配置测试) 首先要确认 web 服务以及 Nagios 不会随系统的初始化和重启过程而自动启动。 在此之前, 请在此确认 root 用户不能访问 Nagios 配置目录中的任何文件 如果 root 能够在 /var/spool/nagios 中运行 &man.ls.1;, 则表示配置有误。 如果配置正确的话, 您会收到一条 permission denied 错误信息。 如果一切正常, NagiosApache, 以及 Sendmail 就可以按照适应安全策略的方式启动了。 下面的命令将完成此工作: &prompt.root; cd /etc/mail && make stop && \ setpmac biba/equal make start && setpmac biba/10\(10-10\) apachectl start && \ setpmac biba/10\(10-10\) /usr/local/etc/rc.d/nagios.sh forcestart 再次检查是否一切正常。 如果不是的话, 请检查日志文件和错误信息。 此外, 还可以用 &man.sysctl.8; 来临时禁用 &man.mac.biba.4; 安全策略模块的强制措施, 并象之前那样进行配置和启动服务。 root 用户可以放心大胆地修改安全强制措施, 并编辑配置文件。 下面的命令可以对安全策略进行降级, 并启动一个新的 shell: &prompt.root; setpmac biba/10 csh 要阻止这种情况发生, 就需要配置 &man.login.conf.5; 中许可的命令范围了。 如果 &man.setpmac.8; 尝试执行超越许可范围的命令, 则会返回一个错误, 而不是执行命令。 在这个例子中, 可以把 root 设为 biba/high(high-high) User Lock Down 这个例子针对的是一个相对较小的存储系统, 其用户数少于五十。 用户能够在其上登录, 除了存储数据之外, 还可以访问一些其他资源。 在这个场景中, &man.mac.bsdextended.4; 可以与 &man.mac.seeotheruids.4; 并存, 以达到禁止访问非授权资源, 同时隐藏其他用户的进程的目的。 首先, 在 /boot/loader.conf 中加入: mac_seeotheruids_enabled="YES" 随后, 可以通过下述 rc.conf 变量来启用 &man.mac.bsdextended.4; 安全策略模块: ugidfw_enable="YES" 默认规则保存在 /etc/rc.bsdextended 中, 并在系统初始化时加载; 但是, 其中的默认项可能需要进行一些改动。 因为这台机器只为获得了授权的用户提供服务, 因此除了最后两项之外, 其它内容都应保持注释的状态。 这两项规则将默认强制加载属于用户的系统客体。 在这台机器上添加需要的用户并重新启动。 出于测试的目的, 请在两个控制台上分别以不同的用户身份登录。 运行 ps aux 命令来看看是否能看到其他用户的进程。 此外, 在其他用户的主目录中运行 &man.ls.1; 命令, 如果配置正确, 则这个命令会失败。 不要尝试以 root 用户的身份进行测试, 除非您已经修改了特定的 sysctl 来阻止超级用户的访问。 在添加新用户时, 他们的 &man.mac.bsdextended.4 规则不会自动出现在规则集表中。 要迅速更新规则集, 只需简单地使用 &man.kldunload.8; 和 &man.kldload.8; 工具来卸载并重新加载安全策略模块。 MAC 框架的故障排除 MAC 故障排除 在开发过程中, 有一些用户报告了正常配置下出现的问题。 其中的一些问题如下所示: 无法在 <filename>/</filename> 上启用 <option>multilabel</option> 选项 标志在根 (/) 分区上没有保持启用状态! 看起来每五十个用户中就有一个遇到这样的问题, 当然, 在我们的初始配置过程中也出现过这样的问题。 更进一步的观察使得我相信这个所谓的 bug 是由于文档中不确切的描述, 或对其产生的误解造成的。 无论它是因为什么引发的, 下面的步骤应该能够解决此问题: 编辑 /etc/fstab 并将根分区设置为 , 表示只读。 重新启动并进入单用户模式。 / 上运行 tunefs 重新启动并进入正常的模式。 运行 mount / 并把 /etc/fstab 中的 改回 , 然后再次重新启动。 再次检查来自 mount 的输出, 已确认根文件系统上正确地设置了 在 <acronym>MAC</acronym> 之后无法启动 X11 了 在使用 MAC 建立安全的环境之后, 就无法启动 X 了! 这可能是由于 MAC partition 策略, 或者对某个 MAC 标签策略进行了错误的配置导致的。 要调试这个问题, 请尝试: 检查错误信息; 如果用户是在 insecure class 中, 则 partition 策略就可能导致问题。 尝试将用户的 class 重新改为 default class, 并使用 cap_mkdb 命令重建数据库。 如果这无法解决问题, 则进入第二步。 仔细检查标签策略。 确认针对有问题的用户的策略是正确的, 特别是 X11 应用, 以及 /dev 项。 如果这些都无法解决问题, 将出错消息和对您的环境的描述, 发送到 TrustedBSD 网站上的 TrustedBSD 讨论邮件列表, 或者 &a.questions; 邮件列表。 Error: &man..secure.path.3; cannot stat <filename>.login_conf</filename> 当我试图从 root 切换到其同中的其他用户时, 出现了错误提示 _secure_path: unable to state .login_conf 这个提示通常在用户拥有高于它将要成为的那个用户的 标签设定时出现。 例如, 如果系统上的一个用户 joe 拥有默认的 标签, 而 root 用户拥有 , 它也就不能查看 joe 的主目录, 无论 root 是否使用了 su 来成为 joe。 这种情况下, Biba 完整性模型, 就不会允许 root 查看在较低完整性级别中的客体。 <username>root</username> 用户名被破坏了! 在普通模式, 甚至是单用户模式中, root 不被识别。 whoami 命令返回了 0 (零) 而 su 则提示 who are you?。 到底发生了什么? 标签策略被禁用可能会导致这样的问题, 无论是通过 &man.sysctl.8; 或是卸载了策略模块。 如果打算禁用策略, 或者临时禁用它, 则登录性能数据库需要重新配置, 在其中删除 选项。 仔细检查 login.conf 以确保所有的 选项都已经删除, 然后使用 cap_mkdb 命令来重建数据库。 这种情况也可能在通过策略来限制访问 master.passwd 文件或对应的那个数据库时发生。 这主要是由于管理员修改受某一 label 限制的文件, 而与系统级的通用策略发生了冲突。 这时, 用户信息将由系统直接读取, 而在文件继承了新的 label 之后则会拒绝访问。 此时, 只需使用 &man.sysctl.8; 禁用这一策略, 一切就会恢复正常了。 diff --git a/zh_CN.GB2312/books/handbook/mail/chapter.sgml b/zh_CN.GB2312/books/handbook/mail/chapter.sgml index 4727d16731..b1bac93447 100644 --- a/zh_CN.GB2312/books/handbook/mail/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mail/chapter.sgml @@ -1,2122 +1,2043 @@ 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 以及之后的版本中, - 存在着十分显著的不同。 因此, 用于禁用它的方法, - 也就有许多不同之处。 - 如果您打算禁用 sendmail 的邮件发出服务, 保持系统中有一个替代它的、 可用的邮件递送系统就非常重要。 如果您不这样做的话, 类似 &man.periodic.8; 这样的系统功能就无法如预期的那样, 通过邮件来传送其执行结果。 您系统中的许多部分可能都假定有可用的 sendmail-兼容 系统。 如果这些应用程序继续使用 sendmail 的执行文件来发送邮件, 而您又禁用了它, 则邮件将进入 sendmail 的非活跃 (inactive) 队列, 而永远不会被送达。 - - 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, 包括邮件的发出服务, - 您就必须将 - - sendmail_enable="NONE" - - 写在 /etc/rc.conf 中。 - - 如果您只是希望禁用 - sendmail 的接信服务, - 则应将 - - sendmail_enable="NO" - - 写到 /etc/rc.conf 中。 - 不过, 即使禁用了接信服务, 本地的送信仍将正常工作。 关于 - sendmail 的启动选项的更多信息, - 可以在 &man.rc.sendmail.8; 联机手册中找到。 - - - - FreeBSD 5.0-STABLE 和更高版本 - 要彻底禁用包括邮件送出服务在内的所有 sendmail 功能, 必须将 sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" 写入 /etc/rc.conf 如果只是想要停止 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 + 可以向 /etc/rc.conf + 中加入配置项使新的 MTA 在系统启动时运行, + 下面是一个 postfix 的例子: - 您也可以手工停止正在系统运行的服务。 - - - - - FreeBSD 4.5-STABLE 版本 2002/4/11 以后 - (包括 4.6-RELEASE 及后续版本) - - 在 FreeBSD 较后来的版本, - 您可以使用上面的方法或者在 /etc/rc.conf - 文件做如下设置 - - mta_start_script="filename" - - filename 是您想要在引导时执行的 - MTA 脚本文件的名字。 - + &prompt.root; echo 'postfix_enable=YES' >> /etc/rc.conf + 这样 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/share/sendmail/cf 下找到。 cf 目录中的 README 文件是关于 &man.m4.1; 配置的基本的介绍。 最好的支持 UUCP 传送的方法是使用 mailertable 的特点。建立一个资料库让 sendmail 可以使用它自己的路由决策。 首先,您必须建立您自己的 .mc 文件。 /usr/share/sendmail/cf/cf 目录包含一些例子。 假定您已经命名自己的文件叫做 foo.mc, 您要做的只是把它转换成一个有效的 sendmail.cf &prompt.root; cd /etc/mail &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, 包括邮件发出服务在内。 请参见 以了解进一步的细节。 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-sasl2。 这个 port 位于 security/cyrus-sasl2security/cyrus-sasl2 port 支持很多可以在编译时指定的可选项。 由于我们要使用 SMTP 身份验证, 因此要确认没有禁用 选项。 安装完 security/cyrus-sasl2 之后, 编辑 /usr/local/lib/sasl2/Sendmail.conf (如果不存在则建立一个) 并在其中增加下列配置: pwcheck_method: saslauthd 接下来, 安装 security/cyrus-sasl2-saslauthd, 编辑 /etc/rc.conf 并加入下列配置: saslauthd_enable="YES" 最后启用 saslauthd 服务: &prompt.root; /usr/local/etc/rc.d/saslauthd start 这个服务将充当 sendmail 使用 FreeBSD 的 passwd 数据库来完成身份验证时的代理人角色。 这避免了为每个需要使用 SMTP 身份验证的用户建立对应的用户名和口令的麻烦, 也确保了登录与邮件的口令一致。 现在编辑 /etc/make.conf 文件,添加如下行: SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2 这些配置将告诉系统在联编 sendmail 时使用适当的配置选项来在编译过程中连入 cyrus-sasl2. 在重新编译 sendmail 之前, 请确认已经安装了 cyrus-sasl2 重新编译 sendmail 运行如下命令: &prompt.root; cd /usr/src/lib/libsmutil &prompt.root; make cleandir && make obj && make &prompt.root; cd /usr/src/lib/libsm &prompt.root; make cleandir && make obj && make &prompt.root; cd /usr/src/usr.sbin/sendmail &prompt.root; make cleandir && make obj && make && 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 这些选项配置有不同的方法,对于 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 中的信息。 如欲了解更多的信息, 请参看 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 变量或配置 EDITOR 环境变量。 请参见 以了解配置 mutt 的进一步信息。 要撰写新邮件, 需要首先按 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。 要查看邮件索引, 应按 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 每 600 秒轮询一次: &prompt.user; fetchmail -d 600 更多关于 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 e19803f1bc..d897698207 100644 --- a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml @@ -1,3205 +1,3186 @@ 获取 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: -
-
-
FreeBSD Mall, Inc. 3623 Sanford Street Concord, CA 94520-1405 USA Phone: +1 925 240-6652 Fax: +1 925 674-0821 Email: info@freebsdmall.com WWW:
Dr. Hinner EDV St. Augustinus-Str. 10 D-81825 München Germany Phone: (089) 428 419 WWW:
Ikarios 22-24 rue Voltaire 92000 Nanterre France WWW:
JMC Software Ireland Phone: 353 1 6291282 WWW:
- -
- 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: + 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: + 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:
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 (rsh, pserver, ssh, ssh/2022) 日本: :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs (使用 cvs login 并在提示输入口令时输入 anoncvs.) 台湾地区: :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs (pserver (使用 cvs login 并在提示输入口令时, 输入任意口令。), ssh (无口令)) SSH2 HostKey: 1024 e8:3b:29:7b:ca:9f:ac:e9:45:cb:c8:17:ae:9b:eb:55 /etc/ssh/ssh_host_dsa_key.pub 美国: freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs (仅 ssh - 无口令) SSH HostKey: 1024 a1:e7:46:de:fb:56:ef:05:bc:73:aa:91:09:da:f7:f4 root@sanmateo.ecn.purdue.edu SSH2 HostKey: 1024 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65 ssh_host_dsa_key.pub USA: anoncvs@anoncvs1.FreeBSD.org:/home/ncvs (仅限 ssh2 - 无口令) SSH2 HostKey: 2048 53:1f:15:a3:72:5c:43:f6:44:0e:6a:e9:bb:f8:01:62 /etc/ssh/ssh_host_dsa_key.pub 因为 CVS 实际上允许 检出 曾经存在的 (或者,某种情况下将会存在) 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.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login >在提示符处,输入任意密码 password. &prompt.user; cvs co ls 通过 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. 检出 6-STABLE 分支中的 &man.ls.1; 版本: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入任意密码 password。 &prompt.user; cvs co -rRELENG_6 ls 创建 &man.ls.1; 的变化列表(用标准的 diff) &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入任意密码 password。 &prompt.user; cvs rdiff -u -rRELENG_5_3_0_RELEASE -rRELENG_5_4_0_RELEASE ls 找出可以使用的其它的模块名: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入任意密码 password。 &prompt.user; cvs co modules &prompt.user; more modules/modules 其他资源 下面附加的资源可能对学习 CVS 有帮助: CVS 指南 来自 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 您喂给 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 既快又有更好的灵活性。 csup 是用 C 语言对 CVSup 软件的重写。 它最大的好处是, 这个程序更快一些, 并且也不需要依赖于 Modula-3 语言, 因此也就不需要安装后者。 另外, 如果您使用 &os; 6.2 或更新版本, 就可以直接使用, 因为它成为了基本系统的一部分。 较早的 &os; 版本的基本系统中并不包含 &man.csup.1;, 但可以通过 net/csup port 或预编译包来安装。 不过需要注意的是, csup 工具并不支持 CVS 模式。 如果您希望对代码库做完整的镜像, 则还是需要使用 CVSup。 假如您决定使用 csup, 则可以跳过安装 CVSup 这一步, 并在文章中余下部分提到的 CVSup 改为 csup 安装 安装 CVSup 最简单的方式就是使用 FreeBSD packages collection 中预编译的 net/cvsup 包。 如果您想从源代码构建 CVSup, 您可以使用 net/cvsup port。但是预先警告一下: net/cvsup port 依赖于 Modula-3 系统,会花费相当的时间和磁盘空间来下载编译。 如果想在没有安装 &xfree86;&xorg; 的计算机, 例如服务器上使用 CVSup, 则只能使用不包含 CVSup GUInet/cvsup-without-gui 如果希望在 &os; 6.1 或更早版本中安装 csup, 则可以从 FreeBSD 的 packages collection 中安装预编译的 net/csup 包; 如果希望自行从源代码编译 csup, 也可以用 net/csup port 来安装。 CVSup 配置 CVSup 的操作被一个叫做 supfile 的配置文件所控制。 在目录 /usr/share/examples/cvsup/ 下面有一些示例的 supfiles supfile 中的信息解答了 CVSup 下面的几个问题: 您想接收 哪些文件? 您想要它们的 哪个版本? 您想从哪里 获取它们? 您想把它们 放在您自己机器的什么地方? 您想把 您的状态文件放在哪? 在下面的章节里,我们通过依次回答这些问题来创建一个典型的 supfile 文件。首先,我们描述一下 supfile 的整体构成。 supfile 是个文本文件。注释用 # 开头,至行尾有效。 空行和只包含注释的行会被忽略。 每个保留行描述一批用户希望接收的文件。 每行以 collection, 由服务器端定义的合理的文件分组,的名字开头。 collection 的名字告诉服务器您想要的文件。 collection 名字结束或者有更多的字段,用空格分隔。 这些字段回答了上面列出的问题。 字段类型有两种:标记字段和值字段。 标记字段由独立的关键字组成,比如, delete 或者 compress。值字段也用关键字开头, 关键字后面跟 = 和第二个词而没有空格。 例如,release=cvs 是一个值字段。 一个典型的 supfile 往往接收多于一个的 collection。创建 supfile 的一种方式是明确的为每一个 collection 指定相关的字段。然而,这样使得 supfile 的行变得特别长,很不方便, 因为 supfile 中的所有 collection 的大部分 字段都是相同的。 CVSup 提供了一个默认机制来避免 这些问题。用特定的伪 collection 名 *default 开头的行可以被用来设置标记和值为 supfile 中随后的 collection 中的默认值。 默认值可以通过为这个 collection 自身指定不同的值来对单个的 collection 覆盖设置, 也可以在 mid-supfile 中通过附加的 *default 行改变或扩充。 知道了这些,我们现在就可以开始创建一个 用于接收和升级 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/hu_* doc/it_* doc/ja_* doc/mn_* 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-im release=cvs 即时消息软件。 ports-net-mgmt release=cvs 网管软件。 ports-net-p2p release=cvs 对等网 (peer to peer network) 应用。 ports-news release=cvs USENET 新闻软件。 ports-palm release=cvs Palm 系列软件支持。 ports-polish release=cvs 波兰语支持。 ports-ports-mgmt release=cvs 用于管理 ports 和预编译包的工具。 ports-portuguese release=cvs 葡萄牙语支持。 ports-print release=cvs 打印软件。 ports-russian release=cvs 俄语支持。 ports-science release=cvs 科学计算。 ports-security release=cvs 安全工具。 ports-shells release=cvs 命令行 shell。 ports-sysutils release=cvs 系统实用工具。 ports-textproc release=cvs 文本处理工具(不 包含桌面出版)。 ports-ukrainian release=cvs 乌克兰语支持。 ports-vietnamese release=cvs 越南语支持。 ports-www release=cvs 万维网(WWW)相关软件。 ports-x11 release=cvs 支持 X window 系统的 ports。 ports-x11-clocks release=cvs X11 时钟。 ports-x11-drivers release=cvs X11 驱动程序。 ports-x11-fm release=cvs X11 文件管理器。 ports-x11-fonts release=cvs X11 字体和字体工具。 ports-x11-toolkits release=cvs X11 工具包。 ports-x11-servers release=cvs X11 服务器。 ports-x11-themes release=cvs X11 主题。 ports-x11-wm release=cvs X11 窗口管理器。 projects-all release=cvs FreeBSD 内部项目的代码库。 src-all release=cvs FreeBSD 主代码,包含密码系统的代码。 src-base release=cvs /usr/src 顶层的各式各样的文件。 src-bin release=cvs 但用户模式下可能用到的用户工具 (/usr/src/bin)。 src-cddl release=cvs 采用了 CDDL 授权的实用工具和函数库 (/usr/src/cddl)。 src-contrib release=cvs 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-rescue release=cvs 用于紧急修复的静态联编的程序; 请参见 &man.rescue.8; (/usr/src/rescue)。 src-sbin release=cvs 但用户模式的系统工具 (/usr/src/sbin)。 src-secure release=cvs 密码相关库和命令 (/usr/src/secure)。 src-share release=cvs 跨多个平台的共享的文件 (/usr/src/share)。 src-sys release=cvs 内核 (/usr/src/sys)。 src-sys-crypto release=cvs 内核密码系统代码 (/usr/src/sys/crypto)。 src-tools release=cvs 维护 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 主页 多数与 FreeBSD 有关的 CVSup 讨论会在 &a.hackers; 进行。 这个软件的新版本会在那里和 &a.announce; 公布。 如果对于 CVSup 有任何问题, 或希望提交 bug 报告, 请参阅 CVSup FAQ CVSup 站点 FreeBSD 的 CVSup 服务器运行于 下列站点: &chap.mirrors.cvsup.inc; 使用 Portsnap 介绍 Portsnap 是一套用以安全地分发 &os; ports 套件的系统。 每隔大约一个小时, 就会生成一份 ports 的最新 快照, 它会被打包并进行数字签名。 这些文件接下来将通过 HTTP 来分发。 CVSup 类似, Portsnap 采用 拉 (pull) 的模式来进行更新: 经过打包并签名的 ports tree 被放在 web 服务器上, 被动地等待用户请求它们。 用户需要手工运行 &man.portsnap.8; 来下载更新, 或者设置 &man.cron.8; 任务来自动地进行更新。 由于一些技术原因, Portsnap 并不自动地直接更新位于 /usr/ports/ 目录中的 实际的 ports tree; 事实上, 默认情况下它只操作位于 /var/db/portsnap/ 的压缩的 ports tree 副本, 而这个副本则用于更新实际的 ports tree。 如果 Portsnap 是通过 &os; Ports Collection 安装的, 则这份压缩快照的默认位置则是 /usr/local/portsnap/ 而非 /var/db/portsnap/ 安装 在 &os; 6.0 和更新版本上, Portsnap 已经成为 &os; 基本系统的一部分。 在较早版本的 &os; 中, 它可经由 ports-mgmt/portsnap port 来安装。 Portsnap 的配置 Portsnap 的操作, 是通过 /etc/portsnap.conf 配置文件来控制的。 对于多数用户来说, 默认的配置文件已经可用了; 要了解进一步的细节, 则应参考 &man.portsnap.conf.5; 联机手册。 假如 Portsnap 是通过 &os; Ports Collection 安装的, 则它将使用配置文件 /usr/local/etc/portsnap.conf 而非 /etc/portsnap.conf。 这个文件并不随 port 的安装自动创建, 但我们提供了一个示例的配置文件; 将其复制到合适的位置, 然后运行下面的命令: &prompt.root; cd /usr/local/etc && cp portsnap.conf.sample portsnap.conf 首次运行 <application>Portsnap</application> 在首次运行 &man.portsnap.8; 时, 它需要将整个 ports tree 的压缩快照下载到 /var/db/portsnap/ (或者, 如果 Portsnap 是通过 Ports Collection 安装的, 则是 /usr/local/portsnap/)。 在 2006 年初, 其下载尺寸大约是 41 MB。 &prompt.root; portsnap fetch 一旦下载了压缩的快照, 就可以将它释放成为位于 /usr/ports/ 中的 实际的 ports tree 了。 即时之前那个目录中已经有了一份 ports tree 也需要这样做 (例如, 通过使用 CVSup), 因为这个操作, 将为后续的 portsnap 决定更新 ports tree 的哪一部份提供基础。 &prompt.root; portsnap extract 默认安装时, 并不会自动创建 /usr/ports 这个目录。 如果您使用 &os; 6.0-RELEASE, 在首次使用 portsnap 之前应手工创建这个目录。 在更高版本的 &os; 和 Portsnap 中, 这个操作会由 portsnap 命令自动完成。 更新 Ports Tree 在首次下载压缩的 ports tree 快照, 并将其释放到 /usr/ports/ 之后, 更新 ports tree 包含下面两步: fetch(下载) 对于压缩快照的更新, 并使用它们来 update(更新) 实际的 ports tree。 这两步可以通过一个 portsnap 命令来完成: &prompt.root; portsnap fetch update 较早版本的 portsnap 并不支持这种写法。 如果不能用的话, 试试看下面的: &prompt.root; portsnap fetch &prompt.root; portsnap update 通过 cron 来运行 Portsnap 为了避免对于 Portsnap 服务器的 快闪 式访问, portsnap fetch 不支持作为 &man.cron.8; 任务来运行。 与此相反, 提供了一个特殊的 portsnap cron 命令, 它在开始下载更新之前会随机等待最多 3600 秒。 此外, 强烈建议不要将 portsnap update 作为 cron 任务来运行, 因为它可能给正在同时进行的 port 安装带来大问题。 不过, 更新 ports 的 INDEX 文件一般并无大碍, 这可以通过 portsnap 参数来实现 (显然, 如果 portsnap -I update 是通过 cron 来运行的, 在之后还需要执行不带 portsnap update 来更新 ports tree 余下的部分。) 可以在 /etc/crontab 中加入下列设置, 以便让 portsnap 更新其压缩快照, 以及位于 /usr/ports/ 中的 INDEX 文件, 并在有 port 过期时发出邮件通知: 0 3 * * * root portsnap -I cron update && pkg_version -vIL= 如果系统时钟没有设置为使用本地时区, 请将 3 改为一介于 0 和 23 的随机值, 以便让 Portsnap 服务器的负载更为平均。 某些较早版本的 portsnap, 并不支持在一次调用 portsnap 时使用多个命令 (例如, cron update)。 如果这样不行, 请将 portsnap -I cron update 改为 portsnap cron && portsnap -I update CVS 标签 当使用 cvs 或者 CVSup 获取和升级源代码的时候,必须指定一个修订标签。 修订标签代表 &os; 开发的一个特定分支, 或者一个特定的时间点。第一种叫做 分支标签,第二种叫做 版本标签 分支标签 所有这些,除了 HEAD (这个总是 合法标签)以外,只适用于 src/ 树。ports/doc/,和 www/ 树没有分支。 HEAD 主线的符号名,或者说 FreeBSD-CURRENT。 当没有指定修订版本的时候也是默认的。 CVSup 里,这个标签通过 一个 . 来反映出来(不是标点,而是一个 . 字符)。 在 CVS 里,当没有修订标签指定时这是默认的。 在一台 STABLE 机器上检出或者升级到 CURRENT 源代码 通常不是 一个好主意,除非这是您的本意。 RELENG_7 这是 FreeBSD-7.X 的开发分支, 也被称作 FreeBSD 7-STABLE。 RELENG_7_0 FreeBSD-7.0 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_6 这是 FreeBSD-6.X 的开发分支, 也被称作 FreeBSD 6-STABLE。 RELENG_6_3 FreeBSD-6.3 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_6_2 FreeBSD-6.2 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_6_1 FreeBSD-6.1 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_6_0 FreeBSD-6.0 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_5 这是 FreeBSD-5.X 的开发分支, 也被称作 FreeBSD 5-STABLE。 RELENG_5_5 FreeBSD-5.5 安全分支。 只被安全公告和其它重要更新使用。 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_7_0_0_RELEASE FreeBSD 7.0 RELENG_6_3_0_RELEASE FreeBSD 6.3 RELENG_6_2_0_RELEASE FreeBSD 6.2 RELENG_6_1_0_RELEASE FreeBSD 6.1 RELENG_6_0_0_RELEASE FreeBSD 6.0 RELENG_5_5_0_RELEASE FreeBSD 5.5 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://ftp.tw.FreeBSD.org/ rsync://ftp2.tw.FreeBSD.org/ rsync://ftp6.tw.FreeBSD.org/ 可用的 collection: FreeBSD: 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/ports/chapter.sgml b/zh_CN.GB2312/books/handbook/ports/chapter.sgml index 3e65e2340f..b25e429626 100644 --- a/zh_CN.GB2312/books/handbook/ports/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/ports/chapter.sgml @@ -1,1382 +1,1381 @@ 安装应用程序: Packages 和 Ports 概述 ports packages FreeBSD 将许多系统工具捆绑作为基本系统的一部分。 然而, 要完成实际的工作, 可能还需要安装更多的第三方应用。 FreeBSD 提供了两种补充的技术, 用以在您的系统中安装第三方软件: FreeBSD Ports 套件 (用于从源代码安装), 以及 packages (用以从预编译的二进制版本安装)。 这两种方法都可以用于从本地介质, 或从网上直接安装您喜欢的应用程序的最新版本。 读完这章,您将了解到: 如何安装第三方的二进制软件包。 如何使用 ports 套件从源代码构建第三方软件。 如何删除先前安装的软件包。 如何改动Ports Collection里面的一些参数,定制软件使用。 如何找到您需要的软件包。 如何升级您的应用软件。 软件安装预览 如果您以前使用过 &unix; 系统,那典型的第三方软件安装的步骤是像下面描述的: 下载这个软件,软件的发行版可能是源代码格式,或是一个二进制包。 解开软件(其中代表性的是用 &man.compress.1;, &man.gzip.1;, 或 &man.bzip2.1; 压缩过的tar包)。 阅读相关文档,了解如何安装。 (多半一个文件名是INSTALLREADME, 或在doc/ 目录下的一些文档) 如果软件是以源代码形式发布的,那就需要编译它。可能需要编辑一个 Makefile文件, 或运行 configure脚本,和其他的一些工作。 测试和安装软件。 如果一切顺利的话,就这么简单。如果您在安装一个软件包时发生一些错误, 您可能需要编辑一下它的代码,以使它能正常工作。 您可以继续使用 传统的方式安装软件。 然而, FreeBSD 提供了两种技术: packages 和 ports。 就在写这篇文章的时候, 已经有超过 &os.numports; 个第三方的应用程序可以使用了。 对于任意一个应用程序包,是一个可以下载的FreeBSD package文件。这个 FreeBSD package包含了编译好的的副本, 还有一些配置文件或文档。 一个下载的包文件可以用 FreeBSD 的包管理命令来操作, 例如 &man.pkg.add.1;,&man.pkg.delete.1;, &man.pkg.info.1; 等等。 可以使用一个简单的命令安装一个新的应用程序。 一个FreeBSD的port是一个可以自动从源代码编译成应用程序的文件集合。 记住,如果您自己来编译的话,需要执行很多步的操作 (解压, 补丁, 编译, 安装)。 这些整理 port 的文件集合包含了系统需要完成这个工作的必需信息。 您可以运行一些简单的命令, 那些源代码就可以自动地下载, 解开, 打补丁, 编译, 直至安装完成。 实际上,ports 系统也能做出被 pkg_add 的程序包和不久就要讲到的其他包管理命令来安装的软件包。 Packages 和 ports 是互相 依赖 的。 假设您想安装一个依赖于已经安装的特定库的应用程序。 应用程序和那个库都已经应用于 FreeBSD ports 和 packages。 如果您使用 命令或 ports 系统来添加应用程序, 两个都必须注意库是否被安装, 如果没有, 它会自动先安装库。 这里给出的两种技术是很相似的,您可能会奇怪为什么 FreeBSD 会弄出这两种技术。 其实, packages 和 ports 都有它们自己的长处, 使用哪一种完全取决于您自己的喜好。 Package Benefits 一个压缩的 package 通常要比一个压缩的包含源代码的应用程序小得多。 package 不需要进行额外的编译。 对于大型应用程序如 MozillaKDEGNOME 来说这显得尤为重要, 特别是在您的系统资源比较差的情况下。 package不需要您知道如何在FreeBSD上编译软件的详细过程。 Ports Benefits package 在编译时通常使用比较保守的选项, 这是为了保证它们能够运行在大多数的系统上。 通过从 port 安装, 您可以细微调整编译选项来产生适合于处理器的代码 (针对于 Pentium 4 或 AMD 的 Athlon CPU)。 一些软件包已经把与它们相关的能做和不能做的事情的选项都编译进去了。 例如, Apache 可能就配置了很多的选项。 从 port 中安装时, 您不一定要接受默认的选项, 可以自己来设置。 在一些例子中,一个软件有不同的配置存在多个package。 例如, Ghostscript存在 ghostscript package 和 ghostscript-nox11 package两个配置package, 这取决于您是否安装了X11服务器。 这样的调整对package是可能的, 但如果一个应用程序有超过一个或两个不同的编译时间选项时, 就不行了。 一些软件的许可条件禁止采用二进制形式发行。 它们必须带上源代码。 一些人不信任二进制发行形式。 至少有了源代码, (理论上) 可以亲自阅读它,寻找潜在的问题。 如果您要自己对软件打补丁,您就需要有源代码。 一些人喜欢整天围着源代码转, 所以他们喜欢亲自阅读源代码, 修改源代码等等。 保持更新 ports, 订阅邮件列表 &a.ports; 和递交错误报告 &a.ports-bugs;。 安装任何应用程序之前, 应首先检查 上是否有关于您所安装的应用程序的安全问题报告。 您也可以安装 ports-mgmt/portaudit, 它能够自动地检查已经安装的应用程序的漏洞; 此外, 在您安装程序之前它也会首先检查是否存在已知的漏洞。 另外, 您也可以使用 portaudit -F -a 这个命令在安装了某个软件包之后作出检查。 这章的其余部分将介绍在 FreeBSD 上如何使用 packages 和 ports 来安装和管理第三方软件。 寻找您要的应用程序 在您安装任何应用程序之前,需要知道您需要什么,那个应用程序叫什么。 FreeBSD中可用的应用程序正在不断地增长着。幸运的是, 有许多方法可以找到您所需要的程序: FreeBSD站点上有一个可以搜索到的当前所有可用的应用程序列表,在 http://www.FreeBSD.org/ports/。 - 它分很多种类,您既可以通过程序的名称来搜索, - 也可以在分类中列出所有可用的应用程序 (如果您知道名字), + 它分很多种类,您既可以通过程序的名称来搜索(如果您知道名字), 也可以在分类中列出所有可用的应用程序。 FreshPorts Dan Langille 维护着网站 FreshPorts,在 。 FreshPort时刻 追踪 着在 ports 中应用程序的变化。当有任何程序被升级时,他们就会发 email 提醒您。 FreshMeat 如果您不知道您想要的应用程序的名字,可以通过 () 网站来查找, 如果找到了应用程序, 您可以回 FreeBSD 的主站去看一下这个应用程序是否已经被 port 进去了。 如果您知道一个port的准确名字, 但需要知道在哪个类别里面能找到它,您可以使用 &man.whereis.1; 这个命令。简单地输入 whereis filefile 就是您想安装的程序名字。 如果系统找到了它, 您将被告知在它在哪里, 例如: &prompt.root; whereis lsof lsof: /usr/ports/sysutils/lsof 结果告诉我们这个命令lsof (一个系统配置程序)可以在 /usr/ports/sysutils/lsof目录中找到。 你可以使用简单的 &man.echo.1; 语句来查找某个 port 是否存在于 ports 树中。 例如: &prompt.root; echo /usr/ports/*/*lsof* /usr/ports/sysutils/lsof Note that this will return any matched files downloaded into the /usr/ports/distfiles directory. 请注意这条命令将会返回下载到 /usr/ports/distfiles 目录中所有符合条件的文件。 还有另外的一个寻找您需要的port的方法--是用ports collecton 内嵌的搜索机制。要使用这个搜索, 您需要先到 /usr/ports目录下面。 在那个目录里面, 运行make search name=program-nameprogram-name 就是您想寻找的程序名字。 举个例子, 如果您想找 lsof &prompt.root; cd /usr/ports &prompt.root; make search name=lsof Port: lsof-4.56.4 Path: /usr/ports/sysutils/lsof Info: Lists information about open files (similar to fstat(1)) Maint: obrien@FreeBSD.org Index: sysutils B-deps: R-deps: 在输出的内容里面您要特别注意包含 Path: 的这行将告诉您在哪里可以找到这个 port。 如果要安装此 port, 那其他输出的信息不是必须的, 但是还是显示输出了。 为了更深入的搜索,您还可以用 make search key=stringstring就是您想搜索的部分内容。 它将搜索port的名字、 注释, 描述和从属关系, 如果您不知道您想搜索的程序名字, 可以利用它搜索一些关键主题来找到您需要的。 上面说的这些方法, 搜索的关键字没有大小写区分的。 搜索 LSOF的结果将和搜索lsof的结果一样。 Chern Lee Contributed by 使用Packages系统 一个package的安装 packages installing pkg_add 您可以用 &man.pkg.add.1; 这个命令从本地文件或网络上的服务器来安装一个 FreeBSD 软件包。 在本地手动下载一个package,并安装它 &prompt.root; ftp -a ftp2.FreeBSD.org Connected to ftp2.FreeBSD.org. 220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready. 331 Guest login ok, send your email address as password. 230- 230- This machine is in Vienna, VA, USA, hosted by Verio. 230- Questions? E-mail freebsd@vienna.verio.net. 230- 230- 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /pub/FreeBSD/ports/packages/sysutils/ 250 CWD command successful. ftp> get lsof-4.56.4.tgz local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz 200 PORT command successful. 150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes). 100% |**************************************************| 92375 00:00 ETA 226 Transfer complete. 92375 bytes received in 5.60 seconds (16.11 KB/s) ftp> exit &prompt.root; pkg_add lsof-4.56.4.tgz 如果您没有本地package的安装盘 (如 FreeBSD CD-ROM), 可以执行 &man.pkg.add.1; 命令并加上 选项。 这将迫使程序自动决定目标文件的正确格式和版本, 然后自动从一个 FTP 站点寻找和安装 package。 pkg_add &prompt.root; pkg_add -r lsof 上面的例子将下载正确的package, 而不需要用户的干预就可以安装。 如果您想指定 FreeBSD package 的镜像站点, 替换主站点, 就必须相应地设置 PACKAGESITE 这个环境变量, 覆盖原来的设置。 &man.pkg.add.1; 使用 &man.fetch.3; 下载文件, 可以使用多种环境变量, 包含 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您使用 FTP/HTTP 代理或在防火墙后面, 您可能需要设置这些环境变量。 详细的列表请参考 &man.fetch.3;。上述例子中用 lsof 替代了 lsof-4.56.4。 当使用远程安装 Package 的时候软件名字不需要包含版本号。 &man.pkg.add.1; 将自动的找到这个软件最新的版本。 如果您使用 &os.current; 或 &os.stable;版本的FreeBSD, &man.pkg.add.1; 将下载您的应用软件的最新版本。 如果您使用 -RELEASE 版本的 FreeBSD, 它将会获得与您的版本相应的软件包版本。 您可以通过修改环境变量 PACKAGESITE 来改变这一行为。 例如, 如果您运行 &os; 5.4-RELEASE 系统, 默认情况下 &man.pkg.add.1; 将尝试从 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5.4-release/Latest/ 下载预编译的软件包。 如果您希望强制 &man.pkg.add.1; 下载 &os; 5-STABLE 的软件包, 则可以将 PACKAGESITE 设置为 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest/ 软件包采用 .tgz.tbz 两种格式。您可以在 下面或从 FreeBSD 的发行光盘找到, 它在每一个 4CD 的 FreeBSD 发行版的 /packages目录中。 软件包的设计规划与 /usr/ports 树一致。 每个分类都有自己的目录, 所有的软件包可以在目录 All中找到。 软件包系统的目录结构与ports的设计规划一致; 它们共同构成了整个 package/port。 软件包的管理 packages managing &man.pkg.info.1; 是用于列出已安装的所有软件包列表和描述的程序。 pkg_info &prompt.root; pkg_info cvsup-16.1 A general network file distribution system optimized for CV docbook-1.2 Meta-port for the different versions of the DocBook DTD ... &man.pkg.version.1;是一个用来统计所有安装的软件包版本的工具。 它可以用来比较本地 package 的版本与 ports 目录中的当前版本是否一致。 pkg_version &prompt.root; pkg_version cvsup = docbook = ... 在第二列的符号指出了安装版本的相关时间和本地ports目录树中可用的版本。 符号 含义 = 在本地ports树中与已安装的软件包版本相匹配。 < 已安装的版本要比在ports树中的版本旧。 >已安装的版本要比在ports树中的版本新 (本地的port树可能没有更新)。 ? 已安装的软件包无法在ports索引中找到。 (可能发生这种事情,举个例子, 您早先安装的一个 port 从 port 树中移出或改名了) *软件包有很多版本。 !已安装的软件包在索引中存有记录, 但是由于某些原因 pkg_version 无法比较已安装的软件包与索引中相对应的版本号。 删除一个软件包 pkg_delete packages deleting 要删除先前安装的软件package,只要使用&man.pkg.delete.1; 工具。 &prompt.root; pkg_delete xchat-1.7.1 需要注意的是, &man.pkg.delete.1; 需要提供完整的包名; 如果您只是指定了类似 xchat 而不是 xchat-1.7.1 这样的名字, 则它将拒绝执行操作。 不过, 您可以使用 &man.pkg.version.1; 来了解安装的 package 的版本。 除此之外, 也可以使用通配符: &prompt.root; pkg_delete xchat\* 这时, 所有名字以 xchat 开头的 package 都会被删掉。 其它 所有已安装的 package 信息都保存在 /var/db/pkg 目录下。 安装文件的列表和每个 package 的内容和描述都能在这个目录的相关文件中找到。 使用Ports Collection 下面的几个小节中, 给出了关于如何使用 Ports 套件来在您的系统中安装或卸载程序的介绍。 关于可用的 make targets 以及环境变量的介绍, 可以在 &man.ports.7; 中找到。 获得Ports Collection 在您能使用 ports 之前, 您必须先获得 Ports Collection — 本质上是 /usr/ports 目录下的一堆 Makefile、 补丁和描述文件。 在您安装 FreeBSD 系统的时候, sysinstall 会询问您是否需要安装 Ports Collection。 如果您选择 no, 那您可以用下面的指令来安装 Ports Collection: CVSup 方法 保持您本地 Ports 套件最新的一种快捷的方法, 是使用 CVSup 协议来进行更新。 如果您希望了解更多关于 CVSup 的细节, 请参见 使用 CVSup。 在 &os; 系统里对 CVSup 的实现叫作 csup。 它首次出现在 &os; 6.2中。 对于旧版本的 &os; 用户而言可以通过 port/package 安装 net/csup 在首次运行 csup 之前, 务必确认 /usr/ports 是空的! 如果您之前已经用其他地方安装了一份 Ports 套件, 则 csup 可能不会自动删除已经在上游服务器上删除掉的补丁文件。 运行 csup: &prompt.root; csup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile cvsup.FreeBSD.org 改为离您较近的 CVSup 服务器。 请参见 CVSup 镜像 () 中的镜像站点完整列表。 有时可能希望使用自己的 ports-supfile, 比如说, 不想每次都通过命令行来指定所使用的 CVSup 服务器。 这种情况下, 需要以 root 身份将 /usr/share/examples/cvsup/ports-supfile 复制到新的位置, 例如 /root 或您的主目录。 编辑 ports-supfile CHANGE_THIS.FreeBSD.org 修改成离您较近的 CVSup 服务器。 可以参考 CVSup 镜像 () 中的镜像站点完整列表。 接下来按如下的方式运行 csup &prompt.root; csup -L 2 /root/ports-supfile 此后运行 &man.csup.1; 命令将下载最近所进行的改动, 并将它们应用到您的 Ports Collection 上, 不过这一过程并不重新联编您系统上的 ports。 Portsnap 方式 Portsnap 是另一种用于发布 Ports 套件的方法。 它最早从 &os; 6.0 开始引入。 在较早的系统中, 您可以通过 ports-mgmt/portsnap package 来安装它: &prompt.root; pkg_add -r portsnap 请参见 使用 Portsnap 以了解关于全部 Portsnap 功能的详细描述。 如果您使用 &os; 6.1-RELEASE, 或通过 port 或 package 安装了较新版本的 Portsnap 的话, 可以直接跳过这一步。 /usr/ports 将在首次使用 &man.portsnap.8; 命令时自动创建。 而如果您使用的是较早期版本的 Portsnap, 就只能手工创建空的 /usr/ports 目录了。 &prompt.root; mkdir /usr/ports 下载压缩的 Ports 套件快照到 /var/db/portsnap。 您可以根据需要在这之后关闭 Internet 连接。 &prompt.root; portsnap fetch 假如您是首次运行 Portsnap, 则需要将快照释放到 /usr/ports &prompt.root; portsnap extract 如果您已经有装好的 /usr/ports 而您只想更新, 则应执行下面的命令: &prompt.root; portsnap update Sysinstall 方式 这种方法需要使用 sysinstall 从安装介质上安装 Ports 套件。 注意, 安装的将是发布发行版时的旧版 Ports 套件。 如果您能访问 Internet, 应使用前面介绍的方法之一。 root 身份运行 sysinstall (对 &os; 5.2 之前的版本, 应执行 /stand/sysinstall): &prompt.root; sysinstall 用光标向下选择 Configure, 并按 Enter 向下并选择 Distributions, 按 Enter 选择 ports, 并按 Space 选择 Exit, 并按 Enter 选择所希望的安装介质, 例如 CDROM、 FTP, 等等。 选择 Exit 并按 Enter X 退出 sysinstall 安装 Ports ports 安装 当提到 Ports Collection 时, 第一个要说明的就是何谓 skeleton。 简单地说, port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含: 一个 MakefileMakefile 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。 一个 distinfo 文件。这个文件包括这些信息: 这些文件用来对下载后的文件校验和进行检查 (使用 &man.md5.1; 和 &man.sha256.1;), 来确保在下载过程中文件没有被破坏。 一个 files 目录。 这个目录包括在 FreeBSD 系统上编译和安装程序需要用到的补丁。 这些补丁基本上都是些小文件, 指出特定文件作了哪些修正。 它们都是纯文本的的格式,基本上是这样的 删除第 10 行将第 26 行改为这样 ..., 补丁文件也被称作 diffs, 他们由 &man.diff.1; 程序生成。 这个目录也包含了在编译 port 时要用到的其它文件。 一个 pkg-descr 文件。 这是一个提供更多细节,有软件的多行描述。 一个 pkg-plist 文件。 这是即将被安装的所有文件的列表。它告诉 ports 系统在卸载时需要删除哪些文件。 一些ports还有些其它的文件, 例如 pkg-message。 ports 系统在一些特殊情况下会用到这些文件。 如果您想知道这些文件更多的细节以及 ports 的概要, 请参阅 FreeBSD Porter's Handbook port里面包含着如何编译源代码的指令, 但不包含真正的源代码。 您可以在网上或 CD-ROM 上获得源代码。 源代码可能被开发者发布成任何格式。 一般来说应该是一个被 tar 和 gzip 过的文件, 或者是被一些其他的工具压缩或未压缩的文件。 ports中这个程序源代码标示文件叫 distfile, 安装 &os; port的方法还不止这两种。 您必须使用 root 用户登录后安装 ports。 在安装任何 port 之前, 应该首先确保已经更新到了最新的 Ports Collection, 并检查 中是否有与那个 port 有关的安全问题。 在安装应用程序之前, 可以使用 portaudit 来自动地检查是否存在已知的安全问题。 这个工具同样可以在 Ports Collection (ports-mgmt/portaudit) 中找到。 在安装新的 port 之前, 可以考虑先运行一下 portaudit -F 来抓取最新的漏洞数据库。 在每天的周期性系统安全检察时, 数据库会被自动更新, 并且会在这之后实施安全审计。 欲了解进一步的情况,请参阅 &man.portaudit.1; 和 &man.periodic.8;。 Ports 套件假定您有可用的 Internet 连接。 如果您没有, 则需要将 distfile 手工放到 /usr/ports/distfiles 中。 要开始操作, 首先进入要安装 port 的目录: &prompt.root; cd /usr/ports/sysutils/lsof 一旦进入了 lsof 的目录,您将会看到这个port的结构。 下一步就是 make,或说 联编 这个 port。 只需在命令行简单地输入 make 命令就可轻松完成这一工作。 做好之后,您可以看到下面的信息: &prompt.root; make >> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/. >> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/. ===> Extracting for lsof-4.57 ... [extraction output snipped] ... >> Checksum OK for lsof_4.57D.freebsd.tar.gz. ===> Patching for lsof-4.57 ===> Applying FreeBSD patches for lsof-4.57 ===> Configuring for lsof-4.57 ... [configure output snipped] ... ===> Building for lsof-4.57 ... [compilation output snipped] ... &prompt.root; 注意,一旦编译完成,您就会回到命令行。 下一步安装 port, 要安装它只需要在 make 命令后跟上一个单词 install 即可: &prompt.root; make install ===> Installing for lsof-4.57 ... [installation output snipped] ... ===> Generating temporary packing list ===> Compressing manual pages for lsof-4.57 ===> Registering installation for lsof-4.57 ===> SECURITY NOTE: This port has installed the following binaries which execute with increased privileges. &prompt.root; 一旦您返回到提示符,您就可以运行您刚刚安装的程序了。因为 lsof 是一个赋予特殊权限的程序, 因此显示了一个安全警告。 在编译和安装 ports 的时候, 您应该留意任何出现的警告。 删除工作目录是个好主意, 这个目录中包含了全部在编译过程中用到的临时文件。 这些文件不仅会占用宝贵的磁盘空间, 而且可能会给升级新版本的 port 时带来麻烦。 &prompt.root; make clean ===> Cleaning for lsof-4.57 &prompt.root; 使用 make install clean 可以一步完成 makemake installmake clean 这三个分开的步骤的工作。 一些 shell 会缓存环境变量 PATH 中指定的目录里的可执行文件, 以加速查找它们的速度。 如果您使用的是这类 shell, 在安装 port 之后可能需要执行 rehash 命令, 然后才能运行新安装的那些命令。 这个命令可以在类似 tcsh 的 shell 中使用。 对于类似 sh 的 shell, 对应的命令是 hash -r。 请参见您的 shell 的文档以了解进一步的情况。 某些第三方 DVD-ROM 产品, 如 FreeBSD Mall 的 FreeBSD Toolkit 中包含了 distfiles。 这些文件可以与 Ports 套件配合使用。 将 DVD-ROM 挂接到 /cdrom。 如果您使用不同的挂接点, 则应设置 make 变量 CD_MOUNTPTS。 如果盘上有需要的 distfiles, 则会自动使用。 请注意, 少数 ports 并不允许通过 CD-ROM 发行。 这可能是由于下载之前需要填写注册表格, 或者不允许再次发布, 或者有一些其它原因。 如果您希望安装在 CD-ROM 上没有的 port, 就需要在线操作了。 ports 系统使用 &man.fetch.1; 去下载文件, 它有很多可以设置的环境变量, 其中包括 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您在防火墙之后,或使用 FTP/HTTP代理, 您就可能需要设置它们。 完整的说明请看 &man.fetch.3;。 当使用者不是所有时间都能连接上网络, 则可以利用 make fetch。 您只要在顶层目录 (/usr/ports) 下运行这个命令, 所有需要的文件都将被下载。 这个命令也同样可以在下级类别目录中使用, 例如: /usr/ports/net。 注意, 如果一个port有一些依赖的库或其他 port, 它将 下载这些依赖的 port 的 distfile 文件, 如果您想获取所有依赖的 port 的所有 distfile, 请用 fetch-recursive 命令代替 fetch命令。 您可以在一个类别或在顶级目录编译所有的 port, 或者使用上述提到的 make fetch命令。 这样是非常危险的, 因为有一些port不能并存。 或者有另一种可能, 一些port会安装两个不同的文件, 但是却是相同的文件名。 在一些罕见的例子中, 用户可能需要在除了 MASTER_SITES 以外的一个站点(本地已经下载下来的文件)去获得一个文件包。 您可以用以下命令不使用 MASTER_SITES: &prompt.root; cd /usr/ports/directory &prompt.root; make MASTER_SITE_OVERRIDE= \ ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch 在这个例子中,我们把 MASTER_SITES这个选项改为了 ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ 一些 port 允许 (或甚至要求) 您指定编译选项来 启用/禁用 应用程序中非必需的功能, 一些安全选项, 以及其他可以订制的内容。 具有代表性的包括 www/mozillasecurity/gpgme、 以及 mail/sylpheed-claws。 如果存在这样的选项, 通常会在编译时给出提示。 改变默认的 Ports 目录 有时, 使用不同的工作临时目录和目标目录可能很有用 (甚至是必要的)。 可以用 WRKDIRPREFIXPREFIX 这两个变量来改变默认的目录。 例如: &prompt.root; make WRKDIRPREFIX=/usr/home/example/ports install 将在 /usr/home/example/ports 中编译 port 并把所有的文件安装到 /usr/local &prompt.root; make PREFIX=/usr/home/example/local install 将在 /usr/ports 编译它并安装到 /usr/home/example/local 当然, &prompt.root; make WRKDIRPREFIX=../ports PREFIX=../local install 将包含两种设置 (没有办法在这一页把它写完, 但您应该已经知道怎么回事了)。 另外, 这些变量也可以作为环境变量来设置。 请参考您的 shell 的联机手册上关于如何设置环境变量的说明。 处理 <command>imake</command> 一些 port 使用 imake (这是 X Window 系统的一部分) 不能正常地配合 PREFIX, 它们会坚持把文件安装到 /usr/X11R6 下面。 类似地, 一些 Perl port 会忽略 PREFIX 并把文件安装到 Perl 的目录中。 让这些 port 尊重 PREFIX 是困难甚至是不可能的事情。 重新配置 Ports 当你在编译某些 ports 的时候,可能会弹出一个基于 ncurses 的菜单来让你来选择一些编译选项。 通常用户都希望能够在一个 port 被编译安装了以后还能再次访问这份菜单以添加删除或修改这些选项。 实际上有很多方法来做这件事情。 一个方法进入那个 port 的目录后键入 make config, 之后便会再次显示出菜单和已选择的项目。 另一个方法是用 make showconfig, 这会给你显示出所有的配置选项。还有一个方法是执行 make rmconfig, 这将删除所有已选择的项目。 有关这些选项更详细的内容请参阅 &man.ports.7;。 卸载已经安装的 Ports ports 卸载 现在您已经了解了如何安装 ports, 并希望进一步了解如何卸载, 特别是在错误地安装了某个 port 之后。我们将卸载前面例子 (假如您没有注意的话, 是 lsof) 中安装的 port。 Ports 可以同 packages 以完全相同的方式 (在 Packages 一节 中进行了介绍) 卸载, 方法是使用 &man.pkg.delete.1; 命令: &prompt.root; pkg_delete lsof-4.57 升级 Ports ports 升级 首先, 使用 &man.pkg.version.1; 命令来列出 Ports Collection 中提供了更新版本的那些 port: &prompt.root; pkg_version -v <filename>/usr/ports/UPDATING</filename> 在您更新了 Ports 套件之后, 在升级 port 之前, 应查看 /usr/ports/UPDATING。 这个文件中介绍了在升级时用户应注意的问题, 以及一些可能需要进行的操作。 这可能包括更改文件格式、 配置文件位置的变动, 以及与先前版本的兼容性等等。 如果 UPDATING 与本书中介绍的内容不同, 请以 UPDATING 为准。 使用 Portupgrade 来更新 Ports portupgrade portupgrade 工具是设计来简化升级已安装的 port 的操作的。 它通过 ports-mgmt/portupgrade port 来提供。 您可以像其它 port 那样, 使用 make install clean 命令来安装它: &prompt.root; cd /usr/ports/ports-mgmt/portupgrade &prompt.root; make install clean 使用 pkgdb -F 命令来扫描已安装的 port 的列表, 并修正其所报告的不一致。 在每次升级之前, 有规律地执行它是个好主意。 运行 portupgrade -a 时, portupgrade 将开始并升级系统中所安装的所有过时的 ports。 如果您希望在每个升级操作时得到确认, 应指定 参数。 &prompt.root; portupgrade -ai 如果您只希望升级某个特定的应用程序, 而非全部可用的 port, 应使用 portupgrade pkgname。 如果 portupgrade 应首先升级指定应用程序的话, 则应指定 参数。 &prompt.root; portupgrade -R firefox 要使用预编译的 package 而不是 ports 来进行安装, 需要指定 。 如果指定了这个选项, portupgrade 会搜索 PKG_PATH 中指定的本地目录, 如果没有找到, 则从远程站点下载。 如果本地没有找到, 而且远程站点也没有成功地下载预编译包, 则 portupgrade 将使用 ports。 要禁止使用 port, 可以指定 &prompt.root; portupgrade -PP gnome2 如果只想下载 distfiles (或者, 如果指定了 的话, 是 packages) 而不想构建或安装任何东西, 可以使用 。 要了解更多细节, 请参考 &man.portupgrade.1;。 使用 Portmanager 来升级 Ports portmanager Portmanager 是另一个用以简化已安装 port 升级操作的工具。 它可以通过 ports-mgmt/portmanager port 安装: &prompt.root; cd /usr/ports/ports-mgmt/portmanager &prompt.root; make install clean 可以通过这个简单的命令来升级所有已安装的 port: &prompt.root; portmanager -u 如果希望 Portmanager 在进行每步操作之前都给出提示, 应使用 参数。 Portmanager 也可以用来在系统中安装新的 ports。 与通常的 make install clean 命令不同,它会在联编和安装您所选择的 port 之前升级所有依赖包。 &prompt.root; portmanager x11/gnome2 如果关于所选 port 的依赖有任何问题, 可以用 Portmanager 来以正确的顺序重新构建它们。 完成之后, 有问题的 port 也将被重新构建。 &prompt.root; portmanager graphics/gimp -f 要了解更多信息, 请参见 &man.portmanager.1;。 使用 Portmaster 升级 Ports portmaster Portmaster 是另外一个用来升级已安装的 ports 的工具。 Portmaster 被设计成尽可能使用 基本 系统中能找到的工具 (它不依赖于其他的 ports) 和 /var/db/pkg/ 中的信息来检测出需要升级的 ports。你可以在 ports-mgmt/portmaster 找到它: &prompt.root; cd /usr/ports/ports-mgmt/portmaster &prompt.root; make install clean Portmaster groups ports into four categories: Portmaster 把 ports 分成4类: Root ports (不依赖其他的 ports,也不被依赖) Trunk ports (不依赖其他的 ports,但是被其他的 ports 依赖) Branch ports (依赖于其他的 ports,同时也被依赖) Leaf ports (依赖于其他的 ports,但不被依赖) 你可以使用 选项列出所有已安装的 ports 和查找存在更新的 ports: &prompt.root; portmaster -L ===>>> Root ports (No dependencies, not depended on) ===>>> ispell-3.2.06_18 ===>>> screen-4.0.3 ===>>> New version available: screen-4.0.3_1 ===>>> tcpflow-0.21_1 ===>>> 7 root ports ... ===>>> Branch ports (Have dependencies, are depended on) ===>>> apache-2.2.3 ===>>> New version available: apache-2.2.8 ... ===>>> Leaf ports (Have dependencies, not depended on) ===>>> automake-1.9.6_2 ===>>> bash-3.1.17 ===>>> New version available: bash-3.2.33 ... ===>>> 32 leaf ports ===>>> 137 total installed ports ===>>> 83 have new versions available 可以使用这个简单的命令升级所有已安装的 ports: &prompt.root; portmaster -a Portmaster 默认在删除一个现有的 port 前会做一个备份包。如果新的版本能够被成功安装, Portmaster 将删除备份。 使用 Portmaster 便不会自动删除备份。加上 选项之后 Portmaster 将进入互动模式, 在升级每个 port 以前提示你给予确认。 如果你在升级的过程中发现了错误,你可以使用 选项升级/重新编译所有的 ports: &prompt.root; portmaster -af 同样你也可以使用 Portmaster 往系统里安装新的 ports,升级所有的依赖关系之后并安装新的 port:&prompt.root; portmaster shells/bash 更多的详细信息请参阅 &man.portmaster.8; Ports 和磁盘空间 ports disk-space 使用 Ports 套件会最终用完磁盘空间。 在通过 ports 联编和安装软件之后,您应记得清理临时的 work 目录, 其方法是使用 make clean 命令。 您可以使用下面的命令来清理整个 Ports 套件: &prompt.root; portsclean -C 随着时间的推移, 您可能会在 distfiles 目录中积累下大量源代码文件。 您可以手工删除这些文件, 也可以使用下面的命令来删除所有 port 都不引用的文件: &prompt.root; portsclean -D 除此之外, 也可以用下列命令删去目前安装的 port 没有使用的源码包文件: &prompt.root; portsclean -DD 这个 portsclean 工具是 portupgrade 套件的一部分。 不要忘记删除那些已经安装, 但已不再使用的 ports。 用于自动完成这种工作的一个好工具是 ports-mgmt/pkg_cutleaves port。 安装之后还要做点什么? 通常,您通过port安装完一个软件后,可以阅读它带的一些文档(如果它包含文档的话), 或需要编辑它的配置文件,来确保这个软件的运行, 或在机器启动的时候启动(如果它是一个服务的话),等等。 对于不同的软件有着不同的配置步骤。不管怎样, 如果您装好了一个软件,但是不知道下一步怎么办的时候, 这些小技巧可能可以帮助您: 使用 &man.pkg.info.1; 命令,它能找到安装了哪些文件,以及装在哪里。 举个例子,如果您安装了 FooPackage version 1.0.0, 那么这个命令 &prompt.root; pkg_info -L foopackage-1.0.0 | less 将显示这个软件包安装的所有文件,您要特别注意在man/目录里面的文件, 它们可能是手册,etc/目录里面的配置文件,以及 doc/目录下面更多的文档。 如果您不确定已经安装好的软件版本,您可以使用这样的命令 &prompt.root; pkg_info | grep -i foopackage 它将会找到所有已安装的软件包名字中包含foopackage 的软件包。 对于其他的查找, 您只需要在命令行中替换 foopackage 一旦一些软件手册已被您确认安装,您可以使用 &man.man.1; 查看它。 同样的,如果有的话,您还可以完整的查看一遍配置文件的示例,以及任何额外的文档。 如果应用软件有网站, 您还可以从网站上找到文档,常见问题的解答,或其他更多。 如果您不知道它们的网站地址,请使用下面的命令 &prompt.root; pkg_info foopackage-1.0.0 一个 WWW: 行, 如果它存在, 它将提供一个这个应用程序的网站URL. Ports 如果需要在服务器启动时运行(就像互联网服务器), 它通常会把一个脚本的样例放入 /usr/local/etc/rc.d 目录。为了保证正确性, 您可以查看这个脚本, 并编辑或更改这个脚本的名字。 详情请看启动服务。 如何处理坏掉的 Ports 如果您发现某个 port 无法正常工作, 有几件事值得尝试, 包括: 问题报告数据库 中查找是否有尚未提交的修正。 如果有, 可以使用所提议的修正。 要求 port 的监护人 (maintainer) 提供帮助。 输入 make maintainer 或阅读 Makefile 查找监护人的电子邮件地址。 请记得把 port 的名字和版本写在邮件里 (Makefile 中的 $FreeBSD:这一行) 并把错误输出的头几行发给 maintainer。 某些 ports 并非一个人维护, 而是写了一个 邮件列表。 许多, 但并非所有 port, 使用类似 freebsd-listname@FreeBSD.org 这样的地址。 请在提出问题时考虑这一点。 特别地, 由 freebsd-ports@FreeBSD.org 监护的 port, 实际上并没有人维护。 订阅这个邮件列表的人们会感谢您提供的修正和支持。 我们一直都需要更多志愿者! 如果您没有得到回应, 则可以使用 &man.send-pr.1; 来提交问题报告 (请参见 如何撰写 FreeBSD 问题报告)。 修正它! Porter 手册 中提供了关于 Ports 基础设施的详细信息, 通过了解这些内容, 您就能修正偶然坏掉的 port, 或甚至提交自己的 port 了! 从较近的 FTP 站点下载一个编译好的安装包。 中央的 package collection 在 ftp.FreeBSD.orgpackages 目录中, 但 在此之前 一定记得先看看 本地镜像 上是否已经有了! 通常情况下这些安装包都可以直接使用, 而且应该比自行编译快一些。 安装过程本身可以通过 &man.pkg.add.1; 来完成。 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 e3830ceaa6..5d0ae2e593 100644 --- a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml @@ -1,2914 +1,2908 @@ Jim Mock Restructured, reorganized, and updated by PPP 和 SLIP 概述 PPP SLIP FreeBSD 有很多方法可以将计算机与计算机连接起来。 通过使用拨号 modem 来建立网络或 Internet 连接, 或允许其他人通过您的机器来连上网络, 这些都要求使用 PPP 或 SLIP。 这章将详细介绍设置这些基于 modem 的通信服务的方法。 读完这一章, 您将了解: 如何设置用户级 PPP。 如何设置内核级 PPP。 如何设置 PPPoE (PPP over Ethernet)。 如何设置 PPPoA (PPP over ATM)。 如何配置和安装 SLIP 客户端和服务器。 PPP 用户级 PPP PPP 内核级 PPP PPP PPPoE 在阅读这章之前, 您应: 熟悉基本的网络术语。 理解拨号连接和 PPP、 SLIP 的基础知识。 您可能想知道用户级 PPP 与内核级 PPP 之间的不同之处。 回答很简单: 用户级 PPP 处理用户级的输入和输出数据, 而不是内核级。 在内核与用户区之间复制数据的花费要大一些, 但它能提供具有更多特性的PPP实现。 用户级PPP使用 tun 设备与外界通信而内核级 PPP 使用 ppp 设备。 除非需要与其它 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 前提条件 本章假定您具备如下条件: ISP PPP 您有一个 ISP 提供的用于连接使用 PPP 的帐号。 您需要一个连接到您的系统, 并做了正确配置的 modem 或其它设备, 使您能连接到 ISP。 ISP 的拨号号码。 PAP CHAP UNIX login name password?/primary> 您的登录名称和密码 (可能是一般的 UNIX 风格的登录名和密码对, 也可能是 PAP 或 CHAP 登录名和密码对。) nameserver 一个或多个域名服务器 IP 地址。 通常, 您会从ISP处得到两个这样的IP地址。 如果您至少得到了一个, 就可以在文件 ppp.conf 中加入 enable dns 命令使 ppp 设置域名服务。 这个功能取决于 ISP 对支持 DNS 协商的具体实现。 下面的信息由您的 ISP 提供, 但不是必需的: ISP的网关IP地址。 网关是您准备连接, 并设为 默认路由 的主机。 如果您没有这个信息, 您可以虚构一个, 在连接时 ISP 的 PPP 服务器会自动告诉您正确的值。 这个虚构的 IP 地址在 ppp 中记做 HISADDR 准备使用的子网掩码。 如果ISP没有提供, 一般使用 255.255.255.255 是没有问题的。 static IP address (静态 IP 地址) 如果 ISP 提供了静态的IP地址和主机名, 可以输入它们。 反之, 则应让对方主机指定它认为合适的 IP 地址。 如果您不知道这些信息, 请与您的 ISP 联系。 在这节中, 所有作为例子展示的配置文件中都有行号。 这些行号只是为了使解释和讨论变得方便, 在真实的文件中并不存在。 此外, 在必要时应使用 Tab 和空格来进行缩进。 <application>PPP</application>自动化配置 PPP configuration ppppppd(PPP的内核级实现) 都使用/etc/ppp目录中的配置文件。 用户级 PPP 的例子可以在 /usr/share/examples/ppp/ 中找到。 配置ppp要求根据您的需要编辑几个文件。 编辑哪几个文件取决于您的 IP 是静态分配还是动态分配的。 PPP和静态IP地址 PPP with 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/cuad0 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/cuad0(或者 &os; 5.X 下 - /dev/cuaa0) + 标明modem要连接的端口号。 + COM1 对应的设备是 + /dev/cuad0COM2 - 对应的则是 /dev/cuad1(或者 - /dev/cuaa1)。 + 对应的则是 /dev/cuad1 行 5: 设置连接的速度。 如果 115200 有问题, 试试 38400。 行 6 & 7: PPP user 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 设置接口地址。 您需要用 ISP 提供给您的 IP 地址替换字符串 x.x.x.x, 用 ISP 的网关 IP 地址 (即您要连接的主机) 替换字符串 y.y.y.y。 如果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地址 PPP with 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 行 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项以获取细节化的例子。 接收拨入 PPP receiving incoming calls 当要配置 ppp接受来自LAN上的 拨入时, 您需要决定是否将包转给LAN。 如果是的话, 您就必须从 LAN 子网中给对方分配一个IP, 需要在文件 /etc/ppp/ppp.conf 中使用命令 enable proxy。 您还应该确定文件 /etc/rc.conf 中包含以下内容: gateway_enable="YES" 使用哪个getty? 配置 FreeBSD 的拨号服务 描述了如何用 &man.getty.8; 来启动拨号服务。 除了 getty 之外还有 mgetty, 它是 getty 的智能版本, 是按照拨号线的思想设计的。 使用 mgetty 的好处是它能积极地与 modem 进行 会话, 这就意味着如果在/etc/ttys中的端口被关闭, 您的moderm就不会回应拨入。 较新版本的 mgetty (从 0.99beta 起) 也支持自动检测 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/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的 符号链接。 例如, 如果您希望为三个拨号用户, fredsam, 和 mary 路由 /24 CIDR 的网络, 则需要键入以下内容: &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 文件的内容, 您必须为每个静态拨号用户添加一个项。 我们继续以 fredsam 以及 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.0/24 网络的路由。 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 文件中给出用户名/口令, 或者使用以下选项, 来通过 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 都会被接受。 行 15: 如果您使用的是 PAP 或 CHAP, 一般来说 ISP 就不会要求您登录服务器了。 这时, 就必须禁用 set login 设置。 即时改变您的<command>ppp</command> 配置 与后台运行的ppp程序进行对话是可能的, 前提是设置了一个合适的诊断端口。 做到这一点, 需要把下面的行加入到您的配置中: set server /var/run/ppp-tun%d DiagnosticPassword 0177 这行告诉 PPP在指定的&unix;域socket中侦听, 当用户连接时需要给出指定的密码。 %dtun设备号替换。 一旦启用了socket, 就可以在脚本中调用程序&man.pppctl.8;来处理正在运行的 的PPP。 使用PPP网络地址翻译 PPP NAT 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 或者完全不信任外来的请求 nat deny_incoming yes 最后的系统配置 PPPconfiguration 现在您已配置了ppp, 但在真正工作之前还有一些事情要做。 即修改 /etc/rc.conf 从上依次往下看, 确认已经正确地配置了 hostname=, 例如: 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 PPP kernel PPP 在开始设置内核级PPP时, 需要确信pppd已经被定位在/usr/sbin 中 且存在/etc/ppp目录。 pppd能在两种模式下工作: 作为一个 客户 — 您要通过PPP串行线或modem线把您的机器连接到互联网上。 PPP server 作为服务器 —计算机已经位于网络上, 且被用于通过PPP与其它计算机连接。 两种情况您都需要设立一个选项文件, (/etc/ppp/options 或者是 ~/.ppprc 如果您的计算机有多个用户使用PPP)。 您还需要一些modem/serial软件(comms/kermit就很适合), 使您能够拨号并与远程主机建立连接。 Trev Roydhouse Based on information provided by 使用<command>pppd</command>作为客户端 PPP client 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 pgrep -l pppd pid=`pgrep pppd` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi pgrep -l kermit pid=`pgrep kermit` 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=`pgrep pppd` if [ X${pid} != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill -TERM ${pid} fi pgrep -l kermit pid=`pgrep kermit` 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=`pgrep pppd` 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/cuad1 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 ATDTphone.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 pgrep -l pppd pid=`pgrep pppd` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi pgrep -l kermit pid=`pgrep kermit` 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 pgrep -l pppd pid=`pgrep pppd` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi pgrep -l kermit pid=`pgrep kermit` 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 下面的 Kermit 脚本 (/etc/ppp/kermit.ans) 能够启用/禁用您 modem 的自动应答模式。 其内容类似下面这样: 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> 连接故障排除 PPP troubleshooting 本节将讲述通过modem连接使用PPP时可能出现的问题。 例如, 您可能需要确切地知道您拨入的系统会出现一个怎样的命令行提示符。 有些 ISP 会提供 ssword提示符, 而其它的可能会出现 password; 如果没有根据情况的不同相应地编写 ppp 脚本, 登录就会失败。 诊断 ppp 最常用的方法是手动进行连接。 以下的信息会一步一步地带您完成手动连接。 检查设备节点 如果您的内核是经过重新配置的, 那么就需要检查sio设备。 如果没有配置过内核, 就没什么可担心的了。 只要查看 dmesg的输出以找到modem设备: &prompt.root; dmesg | grep sio 您应该找到与 sio 设备有关的输出。 这些就是我们需要的 COM 端口。 如果您的 modem 按照标准串行端口工作, 您就会在 sio1COM2 上找到它。 如果 modem 设备连接在 sio1 接口 (在 DOS 中称为COM2), - 那么您的 modem 将会是 /dev/cuad1 - (或者 &os;nbsp;5.X 下的 - /dev/cuaa1)。 + 那么您的 modem 将会是 /dev/cuad1 手动连接 通过手动控制ppp来连接Internet 是诊断连接及获知ISP处理PPP客户端方式的一个快速, 简单的方法。 让我们从PPP 命令行开始, 在所有的例子中我们使用 example 表示运行 PPP 服务的主机名。 键入ppp 命令打开 ppp &prompt.root; ppp 现在我们已经打开了ppp ppp ON example> set device /dev/cuad1 设置modem设备, 在本例子中是 - cuad1 (或者 &os; 5.X 下的 - /dev/cuaa1)。 + cuad1ppp 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/cuad1 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) PPP over Ethernet PPPoE PPP, over Ethernet (以太网上的 PPP) 本节将介绍如何建立基于以太网的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), 其作者为 L. Mamakos、 K. Lidl、 J. Evarts、 D. Carrel、 D. Simone 以及 R. Wheeler)。 而是使用不同的数据包格式作为以太网的框架。 请向 3Com 抱怨, 如果您认为它应该遵守 PPPoE 的规范。 为了让FreeBSD能够与这个设备通信, 必须设置sysctl。 通过更改/etc/sysctl.conf, 这一步可以在启动时自动完成: net.graph.nonstandard_pppoe=1 或者, 也可以直接执行下面的命令: &prompt.root; sysctl net.graph.nonstandard_pppoe=1 很不幸,由于这是系统全局设置, 无法同时与正常的PPP客户端(或服务器) 和&tm.3com;HomeConnect ADSL Modem通信。 使用 ATM 上的 <application>PPP</application> (PPPoA) PPP over ATM PPPoA 基于ATM的PPP 以下将介绍如何设置基于ATM的PPP(PPPoA)。 PPPoA是欧洲DSL提供商的普遍选择。 使用 Alcatel &speedtouch;USB 的 PPPoA 针对这一设备的 PPPoA 支持, 在 FreeBSD 中是作为 port 提供的, 因为其固件使用了 阿尔卡特许可协议, 因而不能与 FreeBSD 的基本系统一起免费地再发布。 使用 Ports 套件 可以非常方便地安装 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 您在 DSL 服务提供商那里的用户名 您帐户的口令。 由于您必须将帐号密码以明文的方式放入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 机器使用 SLIP 的方法。 对于动态主机名分配 (您的地址会随每次拨号而不同), 您可能需要稍复杂一些的设置。 首先, 您需要确认调制解调器所连接的串口。 许多人会设置一个符号连接, 例如 /dev/modem, 用以指向实际的设备名, - /dev/cuadN (或在 &os; 5.X 下是 - /dev/cuaaN)。 这样您就可以对实际的设备名进行抽象, + /dev/cuadN。 + 这样您就可以对实际的设备名进行抽象, 以备调制解调器换到其他串口时方便调整之用。 不然, 在系统中修改一大堆 /etc 下的文件以及 .kermrc 将是非常麻烦的事情! - /dev/cuad0 (或 &os; 5.X - 下的 /dev/cuaa0) 对应 + /dev/cuad0 对应 COM1, 而 cuad1 - (或 /dev/cuaa1) 则对应 - COM2, 等等。 + 则对应 COM2, 等等。 确保您的内核文件包含以下内容: device sl 这包含在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全名代替。 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连接 SLIP connecting 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服务器 SLIP server 本文提供了在 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 此外还假定您已经配置好了您的调制解调器以及相应的系统文件, 以允许通过调制解调器进行登录。 如果您还没有为此配置好系统, 请参见 以了解关于如何进行拨号服务的配置。 您可能也会想看一看 &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.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 在记录什么, 以及这些内容将被记在哪里)。 内核配置 kernel configuration SLIP &os; 的默认内核 (GENERIC) 提供了 SLIP (&man.sl.4;) 支持; 使用定制的内核时, 您必须把下面的设置加入到配置文件: device sl 默认情况下, 您的 &os; 计算机不会转发包。 如果您希望将 FreeBSD SLIP 服务器作为路由器使用, 就需要修改 /etc/rc.conf 文件, 并加入一项将 gateway_enable 变量设为 的设制。 接下来需要重新启动以便使新设置生效。 请参见 以了解如何配置 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> /etc/sliphome/slip.hosts里的每行包含至少四个元素, 元素之间由空格隔开: SLIP用户的登录ID SLIP连接的本地地址(指SLIP服务器) SLIP连接的远程地址 网络掩网 本地和远程地址可以是主机名 (通过文件/etc/hosts或者域名服务解析为IP地址, 这取决于文件/etc/nsswitch.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地址作为回应。 Ethernet (以太网) MAC address (MAC 地址) 当使用以上的例子时, 一定要将 以太网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将无法执行它。 <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 如果使用了 代理 ARP, 则可能希望 /etc/sliphome/slip.logout 在用户注销时自动为 SLIP 客户端删除 ARP 项: #!/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 将删除由 代理 ARP slip.login 在 SLIP 客户程序登录时所生成的 ARP 项。 再次强调: 建立 /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; 上提供了进一步的详情)。 这一节内容主要是为了确保与仍在使用旧版软件的用户兼容而保留。 另一种避免静态路由所造成的头疼的方法, 是在您的 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/printing/chapter.sgml b/zh_CN.GB2312/books/handbook/printing/chapter.sgml index 8c9f71f0c0..2dee297f03 100644 --- a/zh_CN.GB2312/books/handbook/printing/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/printing/chapter.sgml @@ -1,4646 +1,4647 @@ Sean Kelly Contributed by Jim Mock Restructured and updated by 打印 概述 LPD spooling system printing FreeBSD 可以支持众多种类的打印机, 从最古老的针式打印机到最新的激光打印机以及它们之间所有类型的打印机。 您可以使运行的应用程序产生高质量的打印输出。 FreeBSD 也可以被设置成一个网络上的打印服务器。 它可以从包括 FreeBSD、 &windows; 及 &macos; 在内的多种其他计算机上接收打印任务。 FreeBSD 将保证任务在某时被打印, 并且可以把哪台机器, 哪位用户打印的最多记录在统计表中, 生成 横幅 页, 显示哪份打印输出的是哪位用户的等等。 在读完这章后,您将知道: 怎样配置FreeBSD后台打印。 怎样安装打印过滤器来对特殊的打印任务做特殊的处理, 包括把传来的文档转换成打印机能理解的格式。 怎样在打印输出上开启报头或者横幅页功能。 怎样打印到连接在其他计算机上的打印机。 怎样打印到直接连接在网络上的打印机。 怎样控制打印机的限制, 包括限制打印任务的大小和阻止某些用户打印。 怎样记录打印机统计表和使用情况。 怎样解决打印故障。 在读这章之前, 您应该: 知道怎样配置并安装新内核 ()。 介绍 为了在 FreeBSD 中使用打印机, 需要首先配置好伯克利行式打印机后台打印系统即 LPD。 它是 FreeBSD 的标准打印控制系统。 这章介绍 LPD 后台打印系统, 在接下来将简称为 LPD, 并且将指导您完成其配置。 如果您已经熟悉了 LPD 或者其他后台打印系统, 则可以跳到 设置后台打印系统 这部分。 LPD 完全控制一台计算机上的打印机。 它负责许多的事情: 它控制本地和连接在网络上其他计算机上打印机的访问。 print jobs 它允许用户提交要打印的文件; 这些通常被认为是任务 它为每个打印机维护一个 队列 来防止多个用户在同一时刻访问一台打印机。 它可以打印报头(也叫做banner或者 burst页使用户可以轻松的从一堆打印输出中找到它们打印的任务。 它来设置连接在串口上的打印机的通讯参数。 它能通过网络将任务发送到另外一台计算机的 LPD后台打印队列中。 它可以根据不同种类的打印机语言和打印机的性能运行特殊的过滤器来格式化任务。 它记录打印机的使用情况。 通过配置文件 (/etc/printcap)和提供的特殊过滤程序, 您可以使LPD 系统在众多种类的打印机硬件上完成上面全部的或者一些子集的功能。 为什么要用后台打印 如果您是系统唯一的用户, 您可能会奇怪为什么要在您不需要访问控制, 报头页或者打印机使用统计时为后台打印费心。 它可以设置成允许直接访问打印机, 但您还是应该使用后台打印, 因为: LPD在后台打印任务; 您不用被迫等待数据被完全副本到打印机的时间。 &tex; LPD可以可以方便的通过过滤器给任务加上日期/ 时间的页眉或者把一种特殊的文件格式 (比如&tex; DVI 文件) 转换成一种打印机可以理解的格式。 您不必去手动做这些步骤。 许多提供打印功能的免费和商业程序想要和您计算机上的的后台打印系统通讯。 通过设置后台打印系统, 您将更轻松的支持其他以后要添加的或者现有的软件。 基本设置 要想在 LPD后台打印系统上使用打印机, 您需要设置打印机硬件和 LPD软件。 这个 文档描述了这两级设置: 参见简单打印机 设置来了解怎样连接一个打印机, 告诉 LPD怎样与 它通讯, 并且打印纯文本到 打印机。 参见 高级打印机设置 来了解怎样打印多种 特殊格式的文件, 怎样打印报头页, 怎样通过网络 打印, 怎样控制打印机的访问权限, 并且学会为打印 作业记帐统计。 简单打印机设置 这部分讲解怎样配置打印机硬件和 LPD使之与打印机配合。 讲解的基础知识有: 硬件 设置部分将讲解怎样把一台打印机连接到 您计算机的一个端口上。 软件 设置部分将讲解怎样配置 LPD后台打印的配置 文件 (/etc/printcap)。 如果您正在设置一台通过网络协议 接收数据来打印而不是通过串口或者并口的打印机, 参见 使用网络数据流界面的打印机。 尽管这部分叫简单打印机 设置, 但还是相当复杂的。 使打印机 配合 LPD 后台打印系统在计算机上正常运转是最难的 部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐, 是相当简单的。 硬件设置 这部分讲述了打印机连接到计算机的多种 途径。 主要讨论了多种接口和 连接线, 还有允许 FreeBSD 与打印机通讯所需的 内核配置。 如果您已经连接好了您的打印机而且已经 用它在另外一个操作系统下成功的打印, 您 或许可以跳到这个部分软件设置。 端口和连接电缆 现在所出售的在 PC 上使用的打印机通常至少有 以下三种接口中的一个: printers serial 串口, 也叫 RS-232 或者 COM 口, 使用您计算机上的串口来发送数据到打印机。 串口在计算机上已经非常普遍, 而且电缆也非常容易买到且容易制作。 串口有时需要特殊的电缆, 而且可能需要您去配置稍微有点儿复杂的通讯选项。 大多数 PC 的串口的最高传输速度只有 115200 bps, 这使得打印很大的图像需要的时间很长。 printers parallel 并口 使用计算机上的并口来发送数据到打印机。 并口在计算机上也已经非常普遍, 而且速度高于 RS-232 串口。 电缆非常容易买到, 但很难手工制作。 并口通常没有通讯选项, 这使得配置它相当简单。 centronics parallel printers 并口按打印机上的接头来命名也叫做 Centronics接口。 printers USB USB 接口, 即通用串行总线, 可以达到比并口和串口高很多的速度。 其电缆既简单又便宜。 USB 用来打印比串口和并口更有优势, 但 &unix; 系统不能很好的支持它。 避免这个问题的方法就是购买一台 像大多数打印机一样的既有 USB 接口又有并口的 打印机。 一般来说并口只提供单向通讯 (计算机到打印机), 而串口和 USB 则可以提供双向通讯。 新的并口 (EPP 和 ECP) 及打印机在使用了 IEEE-1284 标准的电缆之后, 可以在FreeBSD下双向通讯。 PostScript 与打印机通过并口双向通讯通常由这两种方法中的一种来完成。 第一个方法是使用为 FreeBSD 编写的可以通过打印机使用的语言与打印机通讯的驱动程序。 这通常用在喷墨打印机上, 且可以用来报告剩余墨水多少和其他状态信息。 第二种方法使用在支持 &postscript; 的打印机上。 &postscript; 任务事实上由程序发送给打印机; 但它并不进行打印而是直接将结果返回给计算机。 &postscript; 也采取双向通讯来将打印中的问题报告给计算机, 比如 &postscript; 程序中的错误或者打印机卡纸。 这些信息对于用户来说也许是非常有价值的。 此外, 最好的在支持 &postscript; 的打印机上记帐的方法需要双向通讯: 询问打印机打印总页数 (打印机从出厂一共打印过多少页), 然后发送用户的任务, 之后再次查询总打印页数。 将打印前后得到的两个值相减就可以得到该用户要付多少纸钱。 并口 用并口连接打印机需要用 Centronics 电缆把打印机与计算机连接起来。 具体说明指导在打印机, 计算机的说明书上应该有, 或者干脆两个上面都有。 记住您用的计算机上的哪个并口。 第一个并口在 FreeBSD 上叫 /dev/ppc0; 第二个叫 /dev/ppc1, 依此类推。 打印机设备也用同样的方法命名: /dev/lpt0 是接在第一个并口上的打印机, 依此类推。 串口 用串口连接打印机需要用 合适的串口电缆把打印机与计算机连接起来。 具体 说明指导应该在打印机, 计算机的说明书上有, 或者 同样干脆两个上面都有。 如果您不确定什么样儿的电缆才是 合适的串口 电缆 , 您可以尝试以下几种不同的 电缆: 调制解调器 电缆每一端的 每一根引脚都直接连接到另一端 相应的引脚 上。 这种电缆也叫做 DTE-to-DCE 电缆。 null-modem cable 非调制解调器电缆上每一端的有些引脚 是与另一端相应引脚直接连接的, 而有一些则是交叉连接的 (比如, 发送数据引脚连接到 接收数据引脚 ), 还有一些引脚直接在电缆连接头儿内 短接。 这种电缆也叫做 DTE-to-DTE 电缆。 一些特殊的打印机需要的串口打印机 电缆, 是一种和非调制解调器电缆类似的电缆, 只是一些信号还是送到了另一端, 而 不是直接在连接头儿内短路。 baud rate parity flow control protocol 当然, 您还得为打印机设置通讯参数。 一般是通过打印机面板上的按钮或者 DIP 开关进行设置。 在计算机和打印机上都选择它们所支持的最高 波特 (每秒多少比特, 有时也叫 波特率) 的传输速率。 选择7或者8个数据位; 选择不校验, 偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量控制协议: 无, XON/XOFF (也叫做 in-band软件) 流量控制。 记住您的软件配置中的参数也要设成上面的数值。 软件设置 这部分描述了要使用FreeBSD系统中的 LPD 后台打印系统进行打印所需的软件设置。 包括这几个步骤: 在需要的时候配置内核来允许您连接 打印机的端口; 配置内核 部分会告诉您 需要做什么。 如果您使用并口, 则需要设置一下 并口的通讯模式; 设置 并口通讯模式 部分会告诉您具体的 细节。 测试操作系统是否能够发送数据到打印机。 检测打印机 联机状况 部分会告诉您要怎样 做。 LPD 设置与打印机匹配的参数则 通过修改 /etc/printcap 这个文件来完成。 这章后面 的部分将讲解如何来完成设置。 配置内核 操作系统的内核为了使某些特殊设备工作需要重新 编译。 打印机所用的串口、 并口就属于那些特殊设备。 因此, 可能需要 添加对串口或并口的支持, 如果内核并没有配置它们的话。 要想知道您现在使用的内核是否支持串口, 输入: &prompt.root; grep sioN /var/run/dmesg.boot 其中 N 是串口的 编号, 从0开始。 如果您看到 类似下面的输出: sio2 at port 0x3e8-0x3ef irq 5 on isa sio2: type 16550A 则说明您现在使用的内核支持串口。 要想知道您现在使用的内核是否支持并口, 输入: &prompt.root; grep ppcN /var/run/dmesg.boot 其中 N 是并口的 编号, 同样从0开始。 如果得到类似 下面的输出: ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode ppc0: FIFO with 16/16/8 bytes threshold 那么您现在使用的内核支持并口。 您可能必须为了使操作系统支持您打印机需要的串口或 并口而 重新配置内核。 要增加对串口的支持, 参见 内核配置这部分。 要增加对并口的支持, 除了参见 上面提到的那部分之外, 还要 参见下面的 部分。 设置并口的通讯模式 在使用并口时, 您可以选择 让 FreeBSD 用中断方式还是轮询方式来 与打印机通讯。 在 FreeBSD 上, 通用的打印机驱动 (&man.lpt.4;) 使用 &man.ppbus.4; 系统, 它利用 &man.ppc.4; 驱动来控制端口芯片。 中断 方式是 GENERIC 核心的默认方式。 在这种方式下, 操作系统占用一条中断请求线来检测打印机是否已经做好接收数据的准备。 轮询 方式是操作系统反复不断的询问打印机是否做好接收数据的准备。 当它返回就绪时, 核心开始发送下面要发送的数据。 中断方式速度通常会快一些, 但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机 不能正常的工作在中断模式下, 是由于一些定时问题 (还没正确的理解) 造成的。 这些打印机需要使用轮询方式。 您应该使用 任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以 工作, 但在中断模式下会慢的要命。 您可以用以下两种方法设定通讯模式: 通过 配置内核或者使用 &man.lptcontrol.8; 这个程序。 要通过配置内核的方法设置 通讯模式: 修改内核配置文件。 找到 一个叫 ppc0 的记录。 如果您想要设置的是 第二个并口, 那么用 ppc1 代替。 使用第三个并口的时候用 ppc2 代替, 依此类推。 如果您希望使用中断驱动模式, 则应编辑下面的配置: hint.ppc.0.irq="N" 它在 /boot/device.hints 这个文件中, 其中 N 用正确的中断 编号代替。 同时, 核心配置文件也必须 包括 &man.ppc.4; 的驱动: device ppc 如果您想要使用轮询方式, 只需要把 /boot/device.hints 这个文件中的下面这行删除掉: hint.ppc.0.irq="N" 在 FreeBSD 下, 有时上面的方法并不能使并口工作在轮询方式。 大多数情况是由于 &man.acpi.4; 驱动造成的, 它可以自动侦测到设备并将其挂载到系统上, 但也因此, 它控制着打印机端口的访问模式. 您需要检查 &man.acpi.4; 的配置来解决这个问题。 保存文件。 然后配置, 建立, 并安装刚配置的内核, 最后重新启动。 参见 内核配置 这章来获得更多细节。 使用 &man.lptcontrol.8; 设置通讯模式 输入: &prompt.root; lptcontrol -i -d /dev/lptN lptN 设置成中断方式。 输入: &prompt.root; lptcontrol -p -d /dev/lptN lptN 设置成轮询方式。 您可以把这些命令加入到 /etc/rc.local 这个文件中, 这样每次启动系统 时都会设置成您想要的方式。 参见 &man.lptcontrol.8; 来获得 更多信息。 检测打印机的通讯 在设置后台打印系统之前, 您应该确保您的计算机可以把数据 发送到打印机上。 分别独立调试打印机的通讯和后台打印系统会更简单。 我们为了测试打印机,将发送一些文本给它。 一个叫 &man.lptest.1; 的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的 字符: 它在每行打出 可以打印的 96 个 ASCII 字符。 PostScript 当我们使用的是一台 &postscript; ( 或者以其他语言为基础的 ) 打印机, 那么 需要更仔细的检测。 一段小小的 &postscript; 程序足以完成检测的任务, 比如下面这段程序: %!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Is this thing working?) show showpage 可以把上面这段 &postscript; 代码写进一个文件里, 并且像下面部分的例子里那样 使用。 PCL 上面的小程序是针对 &postscript; 而不是惠普的 PCL 写的。 由于 PCL 拥有许多其他打印机没有的强大功能, 比如它支持在打印纯文本的同时夹带特殊的命令, 而 &postscript; 则不能直接打印纯文本, 所以需要对这类打印机语言进行特殊的处理。 检测并口打印机 printers parallel 这部分内容将指导您怎样检测 FreeBSD 是否可以与一台已经连接在并口上的打印机通讯。 要测试并口上的打印机: 用 &man.su.1; 命令转换到 root 用户。 发送数据到打印机。 如果打印机可以直接打印纯文本, 可以用 &man.lptest.1;。 输入: &prompt.root; lptest > /dev/lptN 其中 N 是并口的编号, 从0开始。 如果打印机支持 &postscript; 或其他打印机语言, 可以发送一段小程序到打印机。 输入: &prompt.root; cat > /dev/lptN 然后, 一行一行地 输入 输入这段程序。 因为在按下 换行 或者 回车 之后, 这一行就不能再修改了。 当您输入完这段程序之后, 按 CONTROL+D, 或者其他表示文件结束的键。 另外一种办法, 您可以把这段程序写在一个文件里, 并输入: &prompt.root; cat file > /dev/lptN 其中 file 是包含这您要发给打印机程序的文件名。 之后, 您应该看到打印出了一些东西。 如果打印出的东西看起来并不正确, 请不要着急; 我们将在后面指导您如何解决这类问题。 检测串口打印机 printers serial 这部分将告诉您如何检测 FreeBSD 是否可以与连接在串口上的打印机通讯。 要测试连接在串口上的打印机: 通过 &man.su.1; 命令转为 root 用户。 修改 /etc/remote 这个文件。 增加下面这些内容: printer:dv=/dev/port:br#bps-rate:pa=parity bits-per-second serial port parity 其中 port 是串口的设备节点 (ttyd0ttyd1, 等等), bps-rate 是与打印机通讯时使用的速率, 而 parity 是通讯时打印机要求的校验方法 (应该是 evenoddnone, 或 zero 之一)。 这儿有一个串口打印机的例子, 它连接在第三个串口上, 速度为 19200   波特, 不进行校验: printer:dv=/dev/ttyd2:br#19200:pa=none 用 &man.tip.1; 连接打印机。 输入: &prompt.root; tip printer 如果没能成功, 则要再次修改 /etc/remote 这个文件, 并且试试用 /dev/cuaaN 代替 /dev/ttydN 发送数据到打印机。 如果打印机可以直接打印纯文本, 则用 &man.lptest.1;。 输入: &prompt.user; $lptest 如果打印机支持 &postscript; 或者其他 打印机语言, 则发送一段小程序到 打印机。 一行一行的输入程序, 必须 非常仔细 因为像退格 或者其他编辑键也许对打印机来说有它的 意义。 您同样也需要按一个特殊的 文件结束键, 让打印机知道它已经 接收了整个程序。 对于 &postscript; 打印机, 按 CONTROL+D 或者, 您同样也可以把程序存储在一个文件里 并输入: &prompt.user; >file 其中 file 是 包含要发送程序的文件名。 在 &man.tip.1; 发送这个文件之后, 按代表 文件结束的键。 您应该看到打印出了一些东西。 如果它们看起来并不正确也不要着急; 我们将在稍后的章节中介绍如何解决这类问题。 启用后台打印: 文件 <filename>/etc/printcap</filename> 目前, 您的打印机应该已经连好了线, 系统内核也为与打印机联机而重新配置好 (如果需要的话), 而且您也已经可以发送一些简单的数据到打印机。 现在, 我们要配置 LPD 来使其控制您的打印机。 配置 LPD 要修改 /etc/printcap 这个文件。 由于 LPD 后台打印系统在每次使用后台打印的时候, 都会读取这个文件, 因此对这个文件的修改会立即生效。 printers capabilities &man.printcap.5; 这个文件的格式很简单。 您可以用您最喜欢的文本编辑器来修改 /etc/printcap 这个文件。 这种格式和其他的像 /usr/share/misc/termcap/etc/remote 这类文件是一样的。 要得到关于这种格式的详尽信息, 请参阅联机手册 &man.cgetent.3;。 简单的后台打印配置包括下面的几步: 给打印机起一个名字 (记忆和使用的别名), 然后把它们写进文件 /etc/printcap; 参见 如何为打印机命名 这章来得到更多的关于起名的帮助。 header pages 通过增加 sh 项关掉报头页 (它默认是启用的); 参见 如何禁用报头页 部分来得到更多信息。 建立一个后台打印队列的目录, 并且通过 sd 项目指定它的位置; 您可参见 创建后台打印队列目录 一节了解更多信息。 /dev 下设置打印机设备节点, 并且在写在 /etc/printcap 文件中 lp 项目里; 参见 识别打印机设备 这部分可以得到更多信息。 此外, 如果打印机连接在串口上, 通讯参数的设置需要写在 ms# 项中。 这些参数在 配置后台打印通讯参数 这在前面已经讨论过。 安装纯文本过滤器; 详情请参见 安装文本过滤器 小节。 用 &man.lpr.1; 命令来测试设置。 想得到更多信息可以参见 测试 和 故障排除 部分。 使用打印机语言的打印机, 如 &postscript; 打印机, 通常是不能直接打印纯文本的。 前面提到, 并且将在后面继续进行介绍的简单的设置方法, 均假定您正在安装这种只能打印它能识别的文件格式的打印机。 用户通常会希望直接在系统提供的打印机上打印纯文本。 采用 LPD 接口的程序也通常是这样设计的。 如果您正在安装这样一台打印机, 并且希望它不仅能打印使用它支持的打印机语言的任务 而且 还能打印纯文本的任务的话, 那么强烈建议您在上面提到的简单设置的步骤上增加一步: 安装从自动纯文本到 &postscript; (或者其他打印机语言) 的转换程序。 更多的细节, 请参见 在 &postscript; 打印机上打印纯文本。 打印机的命名 第一步 (简单) 就是给打印机起一个名字。 您是按功能起名字还是干脆起个古怪的名字都没有关系, 因为您可以给打印机设置许多的别名。 /etc/printcap 里至少有一个打印机必须指定, 别名是 lp。 这是默认的打印机名。 如果用户既没有 PRINTER 环境变量, 也没有在任何 LPD 命令的命令行中指定打印机名, 则 lp 将是默认要使用的打印机。 还有, 我们通常把最后一个别名设置成能完全描述打印机的名字, 包括厂家和型号。 一旦您选好了名字或者一些别名, 把它们放进文件 /etc/printcap 里。 打印机的名字应该从最左边的一列写起。 用竖杠来隔开每个别名, 并且在最后一个别名后面加上一个冒号。 在下面的例子中, 我们从一个基本的 /etc/printcap 开始, 它只定义了两台打印机 (一台 Diablo 630 行式打印机和一台 Panasonic KX-P4455 &postscript; 激光打印机 ): # # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4: 在这个例子中, 第一台打印机被命名为 rattan 并且设置了 linediablo, lp, 和 Diablo 630 Line Printer 这几个别名。 因为它被设置了 lp 这个别名, 所以它是默认打印机。 第二台 被命名为 bamboo, 并且设置了 psPS, Spanasonic, 和 Panasonic KX-P4455 PostScript v51.4 这几个别名。 不打印报头页 printing header pages LPD 后台打印系统默认 会为每个任务打印 报头页。 报头页 包含了发送这个任务的用户, 发送这个任务的计算机, 任务的名字, 并用大字母打出。 但不幸的是, 所有这些额外的文本, 都会给在对打印机进行最初的配置时排除故障带来困难, 所以我们将先不打印报头页。 要暂停打印报头页, 为打印机的记录增加 sh 标记, 在 /etc/printcap 文件中。 这儿有一个 /etc/printcap 文件中使用 sh 的例子: # # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh: 注意我们的正确格式: 第一行从最左边一列开始, 而后的每一行用 TAB 缩进一次。 一行写不下需要换行时, 在换行前打一个反斜杠。 建立后台打印队列目录 printer spool print jobs 下一步设置就是要建立一个 后台打印队列目录, 也就是在打印任务最终完成之前用于存放这些任务的目录, 这个目录中也会存放后台打印系统用到的其他一些文件。 由于后台打印队列目录的变量本质, 通常 把这些目录安排在 /var/spool 下。 您也没有必要去 备份后台打印队列目录里的内容。 重新建立它们只要简单的使用 &man.mkdir.1; 命令。 通常, 我们习惯将目录名起成和 打印机一样的名字, 像下面 这样: &prompt.root; mkdir /var/spool/printer-name 然而, 如果您有很多网络打印机, 您可能想要把这些后台打印的队列目录目录放在一个单独的专为使用 LPD 打印而准备的目录里。 我们将用我们的两台打印机 rattanbamboo 作为例子: &prompt.root; mkdir /var/spool/lpd &prompt.root; mkdir /var/spool/lpd/rattan &prompt.root; mkdir /var/spool/lpd/bamboo 如果担心用户任务的保密性, 可能会希望保护相应的后台打印队列目录, 使之不能被其他用户访问。 后台打印的队列目录的属主应该是 daemon 用户, 而 daemon 用户和 daemon 组拥有读写和搜索的权限,但其他用户没有。 接下来用我们的两台打印机作为例子: &prompt.root; chown daemon:daemon /var/spool/lpd/rattan &prompt.root; chown daemon:daemon /var/spool/lpd/bamboo &prompt.root; chmod 770 /var/spool/lpd/rattan &prompt.root; chmod 770 /var/spool/lpd/bamboo 最后, 您需要通过/etc/printcap 文件告诉 LPD 这些目录。 您可以用 sd 标记来指定后台打印队列目录的路径: # # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo: 注意打印机的名字要从第 1 列开始, 其他记录每行都要用 TAB 键缩进一次, 写不开需要换行在最后加上反斜杠。 如果您没用 sd 标记指定后台打印队列目录, 后台打印系统会将 /var/spool/lpd 目录作为默认目录。 识别打印机设备 在 端口与对应的设备项 章节中, 我们确定了使用 /dev 目录中的哪个节点来让 FreeBSD 与打印机 通讯。 现在, 我们来告诉 LPD 这个 信息。 当后台打印系统有任务需要打印, 它 将为过滤程序(负责传送数据到打印机)打开 指定的设备。 lp 标记在 /etc/printcap 里列出 /dev 下的设备节点。 在我们的例子中, 假设打印机 rattan 在第一个并口上, 打印机 bamboo 在第六个串口上; 下面是 要对 /etc/printcap 文件里增加的内容 : # # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5: 如果您没在您的 /etc/printcap 文件中 用 lp 标记指定设备节点, LPD 将默认使用 /dev/lp/dev/lp 目前在 FreeBSD 中不存在。 如果您正在安装的打印机是连接在 并口上的, 请跳到 安装文本 过滤器 这章。 如果不是的话, 还是最好按下面介绍的 步骤做。 配置后台打印通讯参数 printers serial 对于连在串口上的打印机, LPD 可以为发送数据到打印机的过滤程序设置好波特率, 校验, 和其他串口通讯参数 。 这是有利的, 因为: 它可以让您只需简单的修改 /etc/printcap 就能尝试不同的通讯 参数; 您并不需要去重新编译过滤器 程序。 它使得后台打印系统可以在 多台有不同串口通讯设置的打印机上使用 相同的过滤器程序。 下面这个 /etc/printcap 中 用 lp 标记来控制列出设备的 串口通讯参数 : br#bps-rate 设置设备的通讯速度为 bps-rate, 这里 bps-rate 可以为 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, or 115200 比特每秒。 ms#stty-mode 设置已打开的中端设备的选项 。 &man.stty.1; 将详细 讲述可用的选项。 LPD 打开 用 lp 指定的设备时, 它会 将设备的特性设置成在 ms# 标记后指定的那样。 特别是 parenb, paroddcs5, cs6cs7, cs8cstopb, crtscts, 和 ixon 这些模式, 它们在 &man.stty.1; 手册中有详细说明。 我们举个例子来添加我们连在第6个串口上的 打印机。 我们将设波特为38400。 至于模式, 我们将用 -parenb 设置成不校验, 用 cs8 设置成8位字符, 用 clocal 设置成不要调制解调器控制, 用 crtscts 设置成硬件流量控制: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts: 安装文本过滤器 printing filters 我们现在准备告诉 LPD 使用什么文本过滤器 给打印机发送任务。 文本过滤器, 也叫 输入过滤器, 是一个 在 LPD 有一个任务要发给 打印机时运行的程序。 当 LPD 为打印机运行文本过滤器时, 它设置过滤器的 标准输入为要发给打印机的任务, 而标准输出为 用 lp 标记指定的打印机 。 过滤器先从标准输入读取 任务, 为打印机进行一些转换 , 并将结果写到标准输出, 这些结果 将被打印。 想得到更多关于文本过滤器的信息, 见 过滤器 这节。 对于简单的打印机设置, 文本过滤器可以仅仅是一段 执行 /bin/cat 的 shell 脚本来 发送任务到打印机。 FreeBSD 还提供了一个叫做 lpf 的过滤器, 它可以处理退格和下划线来 使那些可能不能很好处理这类字符流的打印机正常工作。 而且, 当然, 您可以用任何其他的 您想用的过滤程序。 lpf 过滤器在 lpf: 一个文本 过滤器 这节将有详细描述。 首先, 我们来写一段叫做 /usr/local/libexec/if-simple 的简单 shell 脚本作为文本过滤器。 用您熟悉的文本编辑器将下面的内容放进 这个文件: #!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. /bin/cat && exit 0 exit 2 使这个文件可以被执行: &prompt.root; chmod 555 /usr/local/libexec/if-simple 然后用 if 标记在 /etc/printcap 里告诉 LPD 使用这个脚本。 我们将仍然为 一直作为例子的这两台打印机在 /etc/printcap 里增加这个标记: # # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ - :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ + :sh:sd=/var/spool/lpd/rattan:\ + :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:\ :if=/usr/local/libexec/if-simple: if-simple 脚本的副本可以在 /usr/share/examples/printing 目录中找到。 开启 <application>LPD</application> &man.lpd.8; 在 /etc/rc 中被运行, 它是否被运行由 lpd_enable 这个变量控制。 这个 变量默认是 NO。 如果您还没有修改 , 那么增加这行: lpd_enable="YES" /etc/rc.conf 文件当中, 然后既可以重启您的 机器, 也可以直接运行 &man.lpd.8;。 &prompt.root; lpd 测试 现在已经基本完成了 LPD 的基本设置。 但不幸的是, 还不是庆祝的时候, 因为我们还需要测试设置并且修正所有的 问题。 要测试设置, 尝试打印一些东西。 要 用 LPD 系统打印, 您可以 使用 &man.lpr.1; 命令, 它可以提交一个任务来打印。 - 您可以联合使用 &man.lpr.1; 和 the &man.lptest.1; + 您可以联合使用 &man.lpr.1; 和 &man.lptest.1; 程序, 在 检查打印机 通讯 这节介绍怎样生成一些测试文本。 要测试简单 LPD 设置: 输入: &prompt.root; lptest 20 5 | lpr -Pprinter-name 其中 printer-name 是 在 /etc/printcap 中指定的打印机的一个名字 ( 或者一个别名) 。 要测试默认 打印机, 输入 &man.lpr.1; 不带任何 选项。 同样, 如果您正在测试一台使用 &postscript; 的打印机, 发送一个 &postscript; 程序到打印机而不是 使用 &man.lptest.1;。 您可以把程序放在一个 文件里, 然后输入: lpr file 对于一台 &postscript; 打印机, 您应该得到那段程序的 结果。 而如果您使用的 &man.lptest.1;, 则您得到的 结果应该看起来像下面这样: !"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 $%&'()*+,-./01234567 %&'()*+,-./012345678 要更进一步的测试打印机, 尝试下载一些大的 程序 (为基于特定语言的打印机 ) 或者运行 &man.lptest.1; 并使用不同的参数。 比如, lptest 80 60 将生成 60 行 每行 80 个字符。 如果打印机不能工作, 参考 故障排除 这节。 高级设置 这部分将描述用来打印特别格式文件, 页眉, 通过网络打印, 以及对打印机使用限制和 记帐。 过滤器 printing filters 尽管 LPD 处理网络协议, 任务排队, 访问控制, 和打印的其他方面, 但大部分 实际 工作还是由 过滤器。 过滤器是 一种与打印机通讯并且处理设备依赖和特殊需要的 程序。 在简单打印机设置这节里, 我们安装了一个纯文本过滤器 — 一个应该可以用在大多数 打印机上的极简单的过滤器 ( 安装 文本过滤器)。 然而, 为了进行格式转换, 打印 记帐, 适应特殊的打印机, 等等, 您需要明白过滤器是怎样工作的。 在根本上过滤器负责处理这些方面。 但坏消息是大多数时候 必须自己提供过滤器。 好消息 是很多过滤器通常都已经有了; 当没有的时候, 它们 通常也是很好写的。 FreeBSD 也提供了一个过滤器, /usr/libexec/lpr/lpf, 可以让大多数可以打印纯文本的 打印机工作。 ( 它处理文件里的退格和 跳格, 并且进行记帐, 但这基本就是它所有能做的了。 ) 这里还有几个过滤器和过滤器组件在 FreeBSD Ports Collection 里。 这是在这节里您将找到的内容: 过滤器是如何工作的 小节中将介绍在打印过程中过滤器的作用。 如果希望了解在 LPD 使用过滤器时, 在 幕后 发生的事情, 便应阅读这一小节。 了解这些知识能够帮助您在为打印机安装过滤器时更快地排查可能会遇到的各种问题。 LPD 假定任何打印机在默认状态下均能打印纯文本内容。 对于不能直接打印纯文本的 &postscript; 打印机 (以及其他基于打印语言的打印机) 而言这会带来问题。 在 在 &postscript; 打印机上使用纯文本任务 这节中将会介绍如何解决这个问题的方法。 如果您使用 &postscript; 打印机, 就应阅读这节内容。 &postscript; 对于许多程序来说都是一个非常受欢迎的输出格式。 一些人甚至直接写 &postscript; 代码。 但不幸的是, &postscript; 打印机非常昂贵。 模拟 &postscript; 在 非 &postscript; 打印机上 这节将告诉您怎样进一步修改 打印机的文本过滤器, 使得一台 非 &postscript; 打印机接受 并打印 &postscript; 数据。 如果 您没有 &postscript; 打印机, 那么您应该阅读这个小节。 转换过滤器 这节讲述了一个自动把指定格式文件, 比如图像或排版数据, 转换成您打印机可以理解的格式的方法。 在阅读了这节之后, 您就应该可以配置打印机, 让用户可以用 lpr -t 来打印 troff 数据、 用 lpr -d 来打印 &tex; DVI 数据, 或用 lpr -v 来打印光栅图像数据等工作了。 建议您阅读这节。 输出 过滤器 这节讲述了这个不是经常使用的 LPD: 的功能-输出过滤器。 除非您要打印页眉 (见 页眉 这节 ), 您或许可以完全跳过这节。 lpf: 一个文本 过滤器 描述了 lpf, 一个 FreeBSD 自带的相当 完整而又简单的文本过滤器, 可以使用在行式打印机 (和那些担当行式打印机功能的激光 打印机 ) 上。 如果 您需要一个快速的方法来让打印机统计打印纯文本的工作量 , 或者您有一台遇到退格字符就冒烟的打印机 , 您应该考虑 lpf 您可以在 /usr/share/examples/printing 目录中找到下面将提到的那些脚本的副本。 过滤器是怎样工作的 前面说过, 过滤器是一个被 LPD 启动, 用来处理与打印机通讯过程中设备依赖的部分 的可执行程序。 LPD 想要打印 一个任务中的文件, 它启动一个过滤器 程序。 它把要打印的文件设置成过滤器的标准输入, 标准输出设置成打印机, 并且把错误信息定向到 错误日志文件 (在 lf 标识里指定, 默认在 /etc/printcap, 或者 /dev/console 文件里 )。 troff 过滤器被 LPD 启动, 并且 过滤器的参数依赖于 /etc/printcap 文件中所列出的和 用户为任务用 &man.lpr.1; 命令所指定的。 例如, 如果用户输入 lpr -tLPD 会 启动 troff 过滤器, 即在 目标打印机的 tf 标签里所列出的过滤器。 如果用户想要打印纯文本, 它将会启动 if ***过滤器 ( 这是通常的情况: 参见 输出过滤器 来得到 细节 )。 /etc/printcap 文件中, 您可以指定三种过滤器: The 文本过滤器 , 在 LPD 文档中也叫做 输入过滤器 , 处理 常规的文本打印。 可以把它想象成默认过滤器。 LPD 假定每台打印机默认情况下都可以打印纯文本, 而文本过滤器的任务就是来搞定退格、 跳格, 或者其他在某种打印机上容易错误的特殊字符。 如果您所在的环境对打印机的使用情况进行记帐, 那么文本过滤器必须也对打印的页数进行统计, 通常是根据打印的行数和打印机在每页上能打印的行数进行计算得出。 文本过滤器的启动命令为: filter-name -c -w width -l length -i indent -n login -h host acct-file 这里 当任务用 lpr -l 这个命令提交时出现 width 这里取您在 /etc/printcap 文件中指定的 pw (页 宽) 标签的值, 默认为 132。 length 这里取您的 pl (页 长) 标签的值, 默认为 66 indent 这里是来自 lpr -i 命令的总缩进量, 默认为 0 login 这里是正在打印文件的用户名 host 这里是提交打印任务的主机名 acct-file 这里是来自 af 变量中指定的用于记帐的文件名。 printing filters 转换过滤器 的功能是, 将特定格式的文件转换成打印机能够识别并打印的格式。 例如, ditroff 格式的排版数据就是无法直接打印的, 但您可以安装一个转换过滤器来将 ditroff 文件转换成一种打印机可以识别和打印的形式。 请参见 转换过滤器 这一节来了解更多细节。 如果您需要对打印进行记帐, 那么转换过滤器也必须完成记帐工作。 转换过虑器的启动命令为: filter-name -x pixel-width -y pixel-height -n login -h host acct-file 这其中 pixel-width 的值来自 px 标签 (默认为 0), 而 pixel-height 的值来自 py 标签 (默认为 0)。 输出过滤器 仅在没有文本过滤器时, 或者报头页被打开时使用。 就我们的经验而言, 输出过滤器是很少用到的. 在 输出过滤器 这节中会介绍它们。 启动输出过滤器的命令行只有两个参数: filter-name -w width -l length 它们的作用与文本过滤器的 参数是一样的。 过滤器也应该在 退出 时给出下面的几种退出状态: exit 0 过滤器已经成功的打印了文件. exit 1 过滤器打印失败了, 但希望 LPD 试着再打印一次。 如果过滤器返回了这个状态, LPD 将重新启动过滤器。 exit 2 过滤器打印失败并且不希望 LPD 重试。 这种情况下 LPD 会放弃这个文件。 文本过滤器随 FreeBSD 一起发布, 文件名为 /usr/libexec/lpr/lpf, 它利用页宽和页长参数来决定何时发送送纸指令, 并提供位打印记帐的方法。 它使用登录名、 主机名, 和记帐文件参数来生成记帐记录。 如果您想购买过滤器, 要注意它是否是与 LPD 兼容。 如果兼容的话, 则它们必须支持前面提到的那些参数。 如果您打算编写普通的过滤器程序, 则同样需要使之支持前面那些参数和退出状态码。 在 &postscript; 打印机上打印纯文本任务 print jobs 如果您是您的计算机和 &postscript; (或其他语言的) 打印机的唯一用户, 而且您不打算发送纯文本到打印机, 并因此不打算从应用程序程序直接将纯文本发到打印机的话, 就完全不需要再关心这节的内容了。 但是, 如果打印机同时需要接收 &postscript; 和纯文本的任务, 就需要对打印机进行设置了。 要完成这项工作, 我们需要一个文本过滤器来检测到达的任务是纯文本的还是 &postscript; 格式的。 所有 &postscript; 的任务必须以 %! (其他打印机语言请参见打印机的文档) 开头。 如果任务的头两个字符是这两个, 就代表这是 &postscript; 格式的, 并且可以直接略过任务剩余的部分。 如果任务开头的两个字符不是这两个, 那么过滤器将把文本转换成 &postscript; 并打印结果。 我们怎样去做? printers serial 如果你有一台串口打印机, 一个好办法就是安装 lprpslprps 是一个可以与打印机进行双向通信 &postscript; 打印机过滤器。 它用打印机传来的详细信息来更新打印机的状态文件, 所以用户和管理员可以准确的看到打印机处在什么样的状态 (比如 缺墨 或者 卡纸)。 但更重要的是, 它包含了一个叫做 psif 的程序, 它可以检测接收到的文件是否是纯文本的, 并且将使用 textps 命令 ( 也是由 lprps 提供的程序) 转换文本到 &postscript;。 然后它会用 lprps 将任务发送到打印机。 lprps 可以在 FreeBSD Ports Collection (详见 The Ports Collection) 中找到。 你可以根据页面的尺寸选择安装 print/lprps-a4print/lprps-letter。 在安装了 lprps 之后, 只需指定 psif 这个程序的路径, 这也是包含在 lprps 中的一个程序。 如果您已经用 ports 安装好了 lprps, 将下面的内容添加到 /etc/printcap 文件中 &postscript; 打印机的记录部分中: :if=/usr/local/libexec/psif: 同时还需要指定 rw 标签来告诉 LPD 使用读-写模式打开打印机。 如果您有一台并口的 &postscript; 打印机 (因此不能与打印机进行 lprps 需要的双向通信), 可以使用下面这段 shell 脚本来充当文本过滤器: #!/bin/sh # # psif - Print PostScript or plain text on a PostScript printer # Script version; NOT the version that comes with lprps # Installed in /usr/local/libexec/psif # IFS="" read -r first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # PostScript job, print it. # echo "$first_line" && cat && printf "\004" && exit 0 exit 2 else # # Plain text, convert it, then print it. # ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0 exit 2 fi 在上面的脚本中, textps 命令是一个独立安装的程序用来将纯文本转换成 &postscript;。 您可以使用任何您喜欢的文本到 &postscript; 转换程序。 FreeBSD Ports Collection (详见 Ports Collection) 中包含了一个功能非常完整的文本到 &postscript; 的转换程序, 它叫做 a2ps 模拟 &postscript; 在非 &postscript; 打印机上 PostScript emulating Ghostscript &postscript; 是高质量排版和打印 事实上的 标准。 而 &postscript; 也是一个 昂贵 的标准。 幸好, Aladdin 开发了一个和 &postscript; 类似的叫做 Ghostscript 的程序可以用在 FreeBSD 上。 Ghostscript 可以读取大多数 &postscript; 的文件并处理其中的页面交给多种设备,包括许多品牌的非 &postscript; 打印机。 通过安装 Ghostscript 并使用一个特殊的文本过滤器,则可以使一台非 &postscript; 打印机用起来就像真的 &postscript; 打印机一样。 Ghostscript 被收录在 FreeBSD Ports Collection 中,有许多可用的版本, 比较常用的版本是 print/ghostscript-gpl 要模拟 &postscript;, 文本过滤器要检测是否要打印一个 &postscript; 文件。 如果不是, 那么过滤器将直接将文件发送到打印机; 否则, 它会用 Ghostscript 先将文件转换成打印机可以理解的格式。 这里有一个例子: 下面的脚本是一个针对 Hewlett Packard DeskJet 500 打印机的文本过滤器。 对于其他打印机, 替换 gs (Ghostscript) 命令中的 参数就可以了。 (输入 gs -h 来获得当前安装的 Ghostscript 所支持的设备列表。) #!/bin/sh # # ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500 # Installed in /usr/local/libexec/ifhp # # Treat LF as CR+LF (to avoid the "staircase effect" on HP/PCL # printers): # printf "\033&k2G" || exit 2 # # Read first two characters of the file # IFS="" read -r first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # It is PostScript; use Ghostscript to scan-convert and print it. # /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \ -sOutputFile=- - && exit 0 else # # Plain text or HP/PCL, so just print it directly; print a form feed # at the end to eject the last page. # echo "$first_line" && cat && printf "\033&l0H" && exit 0 fi exit 2 最后, 需要告知 LPD 所使用的过滤器, 通过 if 标签完成: :if=/usr/local/libexec/ifhp: 您可以输入 lpr plain.textlpr whatever.ps, 它们都应该可以成功打印。 转换过滤器 在完成了 打印机简单设置 这节中所描述的内容之后, 头一件事 恐怕就是为你喜爱的格式的文件安装转换过滤器了 (除了纯 ASCII 文本)。 为什么安装转换过滤器? &tex; printing DVI files 转换过滤器使打印众多格式的文件变得很容易。 比如, 假设我们大量使用 &tex; 排版系统, 并且有一台 &postscript; 打印机。 每次从 &tex; 生成一个 DVI 文件, 我们都不能直接打印它直到我们将 DVI 文件转换成 &postscript;。 转换的命令应该是下面的样子: &prompt.user; dvips seaweed-analysis.dvi &prompt.user; lpr seaweed-analysis.ps 通过安装 DVI 文件的转换过滤器, 我们可以跳过每次手动转换这一步, 而让 LPD 来完成这个步骤。 现在, 每次要打印 DVI 文件, 我们只需要一步就可以打印它: &prompt.user; lpr -d seaweed-analysis.dvi 我们要 LPD 转换 DVI 文件是通过指定 选项完成的。 格式和转换 选项 这一节列出了所有的转换选项。 对于每种想要打印机支持的转换, 首先要安装 转换过滤器 然后在 /etc/printcap 中指定它的路径。 在简单打印设置中, 转换过滤器类似于文本过滤器 (详见 安装文本过滤器 ) 不同的是它不是用来打印纯文本, 而是将一个文件转换成打印机能够理解的格式。 我应该安装哪个转换过滤器? 您应该安装您希望使用的转换过滤器。 如果要打印很多 DVI 数据, 就需要 DVI 转换过滤器; 如果有大量的 troff 数据, 就应该安装 troff 过滤器。 下面的表格总结了可以与 LPD配合 工作的过滤器, 以及它们在 /etc/printcap文件中的变量名, 还有如何在 lpr命令中调用它们: 文件类型 /etc/printcap文件中的变量名 lpr命令中调用使用的参数 cifplot cf DVI df plot gf ditroff nf FORTRAN text rf troff tf raster vf plain text if none, , or 在例子中, lpr -d就是指 打印机需要在/etc/printcap文件中 df变量所指的过滤器。 FORTRAN 不管别人怎么说, 像 FORTRAN 的文本 和 plot 这些格式已经基本不用了。 所以在您的机器上, 就可以安装其他的过滤器来替换这些参数原有的意义。 例如, 假设想要能直接打印 Printerleaf 文件 (由 Interleaf desktop publishing 程序生成), 而且不打算打印 plot 文件, 就可以安装一个 Printerleaf 转换过滤器并且用 gf 变量指定它。 然后就可以告诉您的用户使用 lpr -g 就可以 打印 Printerleaf 文件。 安装转换过滤器 以为安装的转换过滤器不是 FreeBSD 基本系统的一部分, 所以它们可能是在 /usr/local 目录下。 通常目录 /usr/local/libexec 是保存它们的地方, 因为它们通常是通过 LPD 运行的; 普通用户应该并不需要直接运行它们。 要启用一个转换过滤器, 只需要在 /etc/printcap 文件中为目标打印机中合适的变量赋上过滤器所在的路径。 在接下来的例子当中, 我们将为 一台叫做 bamboo 的打印机添加一个转换过滤器。 下面是这个例子的 /etc/printcap 文件, 其中使用新变量 df 来为打印机 bamboo 设置转换过滤器: # # /etc/printcap for host rose - added df filter for bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: 这里的 DVI 过滤器是一段 shell 脚本, 名字叫做 /usr/local/libexec/psdf。 下面是它的代码: #!/bin/sh # # psdf - DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@" 这段脚本以过滤器模式运行 dvips (参数 ) 并从标准输入读取要打印的任务。 然后运行 &postscript; 文本过滤器 lprps (详见 在 &postscript; 打印机上打印纯文本任务 这一节), 并且带着 LPD 传给脚本的全部参数。 lprps 工具将利用这些参数来为打印进行记帐。 更多转换过滤器应用实例 因为安装转换过滤器的步骤并不是固定的, 所以这节介绍了一些可行的例子。 在以后的安装配置过程中可以以这些例子为参考。 甚至如果合适的话, 可以完全照搬过去。 这段例子中的脚本是一个 Hewlett Packard LaserJet III-Si 打印机的光栅格式数据 (实际上也就是 GIF 文件): #!/bin/sh # # hpvf - Convert GIF files into HP/PCL, then print # Installed in /usr/local/libexec/hpvf PATH=/usr/X11R6/bin:$PATH; export PATH giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \ && exit 0 \ || exit 2 它的工作原理就是将 GIF 文件转换成 portable anymap, 再转换成 portable graymap, 然后再转换成 portable bitmap, 最后再转换成 LaserJet/PCL- 兼容的数据。 下面是为打印机配置上上述过滤器的 /etc/printcap 文件: # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf: 下面的脚本是一个在名叫 bamboo 的这台 &postscript; 打印机上打印用 groff 排版软件生成的 troff 数据的打印过滤器: #!/bin/sh # # pstf - Convert groff's troff data into PS, then print. # Installed in /usr/local/libexec/pstf # exec grops | /usr/local/libexec/lprps "$@" 上面这段脚本还是用 lprps 来与打印机进行通讯。 如果打印机是接在并口上的, 那么就应该使用下面的这段脚本: #!/bin/sh # # pstf - Convert groff's troff data into PS, then print. # Installed in /usr/local/libexec/pstf # exec grops 这里是我们要启用过滤器需要在 /etc/printcap 里增加的内容: :tf=/usr/local/libexec/pstf: 下面的例子也许会让许多 FORTRAN 老手羞愧。 它是一个 FORTRAN- 文本 的过滤器, 能在任意一台 可以打印纯文本的打印机上使用。 我们将为打印机 teak 安装这个过滤器: #!/bin/sh # # hprf - FORTRAN text filter for LaserJet 3si: # Installed in /usr/local/libexec/hprf # printf "\033&k2G" && fpr && printf "\033&l0H" && exit 0 exit 2 然后我们要在 /etc/printcap 中为打印机能够 teak 启用这个过滤器添加下面的内容: :rf=/usr/local/libexec/hprf: 最后, 再给出一个有些复杂的例子。 我们将给以前介绍过的 teak 这台激光打印机添加一个 DVI 过滤器。 首先, 最容易的部分: 更新 /etc/printcap 加入 DVI 过滤器的路径: :df=/usr/local/libexec/hpdf: 现在, 该困难的部分了: 编写过滤器。 为了实现过滤器, 我们需要一个 DVI-到-LaserJet/PCL 转换程序。 FreeBSD Ports Collection (详见 Ports Collection 这一节) 中有一个: print/dvi2xx。 安装这个 port 就会得到我们需要的程序, dvilj2p , 它可以将 DVI 数据转换成 LaserJet IIp, LaserJet III, 和 LaserJet 2000 兼容的数据。 dvilj2p 工具使得过滤器 hpdf 变得十分复杂, 因为 dvilj2p 不能读取标准输入。 它需要从文件中读取数据。 更糟糕的是, 这个文件的名字必须以 .dvi 结尾。 所以使用 /dev/fd/0 作为标准输入是有问题的。 我们可以通过连接 (符号连接) 来解决这个问题。 连接一个临时的文件名 (一个以 .dvi 结尾的文件名) 到 /dev/fd/0, 从而强制 dvilj2p 从标准输入读取。 现在迎面而来的是另外一个问题, 我们不能使用 /tmp 存放临时连接。 符号连接是被用户和组 bin 拥有的。 而过滤器则是以 daemon 用户运行的。 并且 /tmp 目录设置了 sticky 位。 所以过滤器只能建立符号连接, 但它不能在用完之后清除掉这些连接。 因为它们属于不同的用户。 所以过滤器将在当前工作目录下建立符号连接, 即后台打印队列目录 (用变量 sd/etc/printcap 中指定)。 这是一个非常好的让过滤器完成它工作的地方, 特别还是因为 (有时) 这个目录比起 /tmp 来有更多的可用磁盘空间。 最后, 给出过滤器的代码: #!/bin/sh # # hpdf - Print DVI data on HP/PCL printer # Installed in /usr/local/libexec/hpdf PATH=/usr/local/bin:$PATH; export PATH # # Define a function to clean up our temporary files. These exist # in the current directory, which will be the spooling directory # for the printer. # cleanup() { rm -f hpdf$$.dvi } # # Define a function to handle fatal errors: print the given message # and exit 2. Exiting with 2 tells LPD to do not try to reprint the # job. # fatal() { echo "$@" 1>&2 cleanup exit 2 } # # If user removes the job, LPD will send SIGINT, so trap SIGINT # (and a few other signals) to clean up after ourselves. # trap cleanup 1 2 15 # # Make sure we are not colliding with any existing files. # cleanup # # Link the DVI input file to standard input (the file to print). # ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0" # # Make LF = CR+LF # printf "\033&k2G" || fatal "Cannot initialize printer" # # Convert and print. Return value from dvilj2p does not seem to be # reliable, so we ignore it. # dvilj2p -M1 -q -e- dfhp$$.dvi # # Clean up and exit # cleanup exit 0 自动转换: 一种替代转换过滤器的方法 以上这些转换过滤器基本上建成了您的打印环境, 但也有不足就是必须由用户来指定 (在 &man.lpr.1; 命令行中) 要使用哪一个过滤器。 如果您的用户不是对计算机很在行, 那么选用过滤器将是一件麻烦的事情。 更糟的是, 当过滤器设定的不正确时, 过滤器被用在了不它对应类型的文件上, 打印机也许会喷出上百张纸。 比只安装转换过滤器更好的方法, 就是让文本过滤器 (因为它是默认的过滤器) 来检测要打印文件的类型, 然后自动运行正确的转换过滤器。 像 file 这样的工具可以给我们一定的帮助。 当然, 要区分开 有些 文件的类型还是有困难的 — 但是, 当然, 您可以仅为它们提供转换过滤器。 apsfilter printing filters apsfilter FreeBSD 的 Ports 套件提供了一个可以自动进行转换的文本过滤器, 名字叫做 apsfilter (print/apsfilter)。 它可以检测纯文本、 &postscript;、 DVI 以及几乎任何格式的文件, 并在执行相应的转换之后完成打印工作。 输出过滤器 LPD 后台打印系统还支持一种我们还没有讨论过的过滤器: 输出过滤器。 输出过滤器只是用来打印纯文本的, 类似于文本过滤器, 但简化了许多地方。 如果您正在使用输出过滤器而不是文本过滤器, 那么: LPD 为整个任务启动一个输出过滤器, 而不是为任务中的每个文件都启动一次。 LPD 不会提供任务中文件开始和结束的信息给输出过滤器。 LPD 不会提供用户名或者主机名给过滤器, 所以它是无法做打印记帐的。 事实上它只有两个参数: 过滤器-名字 -w宽度 -l长度 宽度 来自于 pw 变量, 而 length 来自于 pl 变量, 这些值都是实际问题中给打印机设置的。 不要让输出过滤器的简化所耽误。 如果想要输出过滤器完成让任务中的每个文件都重新开始一页打印是 不可能 的。 请使用文本过滤器 (也叫输入过滤器); 详见 安装文本过滤器。 此外, 实际上, 输出过滤器 更复杂 , 它要检查发给它的字节流中是否有特殊的标志字符, 并且给自己发送信号来代替 LPD 的。 可是, 如果打算要报头页或者需要发送控制字符或者其他的初始化字符串来完成打印报头页, 那么输出过滤器则是 必需的。 (但是它也是 无用的 如果打算对打印的用户计费, 因为 LPD 不会给输出过滤器任何用户或者主机的信息。) 在一台单个的打印机上, LPD 同时允许输出过滤器、 文本过滤器和其他的过滤器。 在某些情况下, LPD 将仅会启动输出过滤器来打印报头页 (详见 报头页)。 然后 LPD 会要求输出过滤器 自己停止运行 , 它发送给过滤器两个字节: ASCII 031跟着一个 ASCII 001。 当输出过滤器看见这两个字节 (031, 001), 它应该通过发送 SIGSTOP 信号来停止自己的运行。 当 LPD 已经运行好了其他的过滤器, 它会通过给输出过滤器发送 SIGCONT 信号来让输出过滤器重新运行。 如果仅有一个输出过滤器而 没有 文本过滤器, 并且 LPD 正在处理一个纯文本任务, LPD 会使用输出过滤器来完成这个任务。 像以前运行一样, 输出过滤器会按顺序打印任务中的文件, 而不会插入送纸或其他进纸的命令, 但这也许并 不是 您想要的结果。 在大多数情况下, 您还是需要一个文本过滤器。 lpf 这个我们前面介绍过的文本过滤器程序, 也可以用来做输出过滤器。 如果需要使用快速且混乱的输出过滤器, 但又不想写字节检测和信号发送代码, 那么试试 lpflpf 也可以包含在一个 shell 脚本中来处理任何打印机可能需要的初始化代码。 <command>lpf</command>: 一个文本过滤器 /usr/libexec/lpr/lpf 这个程序包含在 FreeBSD 的二进制程序中, 它是一个文本过滤器 (输入过滤器)。 它可以缩排输出 (用 lpr -i 命令提交的任务), 可以打印控制字符禁止断页 用 lpr -l 提交的任务), 可以调整任务中退格和制表符打印的位置, 还可以对打印进行记帐。 它同样可以像输出过滤器一样工作。 lpf 适用于很多打印环境。 尽管它本身没有向打印机发送初始化代码的功能, 但写一个 shell 脚本来完成所需的初始化并执行 lpf 是很容易的。 page accounting accounting printer 为了让 lpf 可以正确的进行打印记帐, 那么需要 /etc/printcap 中的 pwpl 变量都填入正确的值。 它用这些值来测定一页能打印多少文本, 并计算出任务有多少页。 想得到更多关于打印记帐的信息, 请参见 对打印机使用进行记帐。 报头页 如果您有 很多 用户, 他们正在使用各式各样的打印机, 那么您或许要考虑一下把 报头页 当作无可避免之灾祸了。 banner pages header pages header pages 报头页, 也叫 banner 或者 burst 页, 可以用来辨别打印出的文件是谁打印的。 它们通常用大号的粗体字母打印出来, 也可能用装饰线围绕四周, 所以在一堆打印出的文件中, 突出的显示了这个文件属于哪个用户的哪个任务。 这可以让用户快速的找到他们的任务。 而报头页一个明显的缺点就是, 在每个任务中都要有一张或者几张纸作为报头页印出来, 可是它们的有用的地方只发挥几分钟的作用, 最后它们会被放进回收站或者扔进垃圾堆。 (注意报头页只是一个任务一个, 而不是任务中的每个文件都有一个, 所以可能对纸张还不算很浪费。) LPD 系统可以自动为您的打印提供报头页, 如果 您的打印机可以直接打印纯文本。 如果您的打印机是一台 &postscript; 打印机, 您将需要一个外部的程序来生成报头页; 详见 在 &postscript; 打印机上打印报头页。 打开报头页 简单打印设置 这节, 我们通过在 /etc/printcap 文件中指定 sh (禁止报头页) 来把报头页功能关掉了。 要重新为打印机开启报头页功能, 只需要删除掉 sh 听起来很容易, 不是么? 是的。 您 可能 不得不让输出过滤器来给打印机发送初始化字符串。 下面是一个用在 Hewlett Packard PCL-兼容打印机上的输出过滤器的例子: #!/bin/sh # # hpof - Output filter for Hewlett Packard PCL-compatible printers # Installed in /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf of 变量指定输出过滤器的路径。 参见 输出过滤器 这一节来得到更多信息。 下面是一个为我们以前介绍的叫做 teak 的打印机配置的 /etc/printcap 文件; 在配置当中我们开启了报头页并且加入了上述的打印过滤器: # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf:\ :of=/usr/local/libexec/hpof: 现在, 当用户再发任务给打印机 teak 的时候, 每个任务都会有一个报头页。 如果用户想要花时间来寻找他们自己打印的文件, 那么他们可以通过 lpr -h 命令来提交任务; 参考 报头页选项 这一节来得到更多关于 &man.lpr.1; 的选项。 LPD 在报头页之后发出一个换纸字符。 如果您的打印机使用一个不同的字符或者字符串当作退纸指令, 在 /etc/printcap 中用 ff 变量指定即可。 控制报头页 通过启用报头页, LPD 将生成出一个 长报头, 一整页的大字母, 标着用户, 主机和任务名。 下面是一个例子 (kelly 从主机 rose 打印了一个叫做 outline 的任务): k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y k k e e l l y yy k k eeee lll lll yyy y y y y yyyy ll t l i t l oooo u u ttttt l ii n nnn eeee o o u u t l i nn n e e o o u u t l i n n eeeeee o o u u t l i n n e o o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995 LPD 会附加一个换页符在这段文本之后, 所以任务会在新的一页上开始 (除非设置了 sf (禁止换纸) 在 /etc/printcap 文件里目标打印机的记录中)。 如果您喜欢, LPD 可以生成一个 短报头; 指定 sb (短 banner) 在文件 /etc/printcap 中。 报头页就会看起来像下面这样: rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995 同样是默认的, LPD 也是先打印报头页, 然后才是任务。 要想反过来, 在 /etc/printcap 中指定 hl (最后报头)。 为带报头页的任务记帐 使用 LPD 内置的报头页会在进行打印记帐的时候产生一种特殊情况: 报头页肯定是 免费 的。 为什么? 因为输出过滤器是仅有的一个在打印报头页时能进行记帐的外部程序, 但却没有提供给它任何 用户或者主机 的信息或者记帐文件, 所以它无法知道谁应该为打印机的使用付费。 如果仅仅是 增加一页 给文本过滤器或者其他过滤器 (它们有用户和主机的信息) 是不够的, 因为 用户可以用 lpr -h 命令跳过报头页。 他还是需要为自己并没有打印的报头页付钱。 基本上, lpr -h 是明知用户的首选, 但也不能强制让别人使用它。 让每个过滤器生成自己的报头页 (因此可以为它们计费) 是 仍然不够的。 如果用户想要用 lpr -h 命令禁止报头页, 它们将仍然印出报头页并且为它们付费。 因为 LPD 不会把 这个参数传给任何过滤器。 这样, 您该怎么办呢? 您可以: 认可 LPD 的这个问题, 并且免费提供报头页打印。 安装一个替代 LPD 的软件, 比如 LPRng。 参考 替换标准的后台打印软件 来得到更多关于可以替代 LPD 的软件的信息。 写一个 聪明的 输出过滤器。 通常, 输出过滤器不应该去完成除了初始化打印机或者进行一些简单字符转换以外的任何事情。 它适合完成报头页和纯文本任务 (当没有文本 (输入) 过滤器时)。 但是, 如果有文本过滤器为纯文本任务服务, 那么 LPD 将仅为打印报头页启动输出过滤器。 而且, 这个输出过滤器可以理解报头页里 LPD 生成的信息, 然后决定哪位用户和主机应该为报头页付费。 这种方法仅有的问题是输出过滤器仍然不知道应该使用什么记帐文件 (af 变量的内容并没有被传递过来), 但是如果您有一个众所周知的记帐文件, 就可以直接把文件名写进输出过滤器。 为了简化解释报头的步骤, 我们定义 sh (短报头) 变量在 /etc/printcap 文件中。 但这些还是太麻烦了, 而且用户也更喜欢让他们免费打印报头页的慷慨的系统管理员。 在 &postscript; 打印机上打印报头页 像上面描述的那样,LPD 可以生成一个纯文本的报头页来适应多种打印机。 当然, &postscript; 不能直接打印纯文本, 所以 LPD 没什么用—或者说大多时候是这样。 一个显而易见的方法来得到报头页就是让每个转换过滤器和文本过滤器都来生成报头页。 这些过滤器应该用用户名和主机的参数来生成一个相对应的报头页。 这种方法的缺点就是用户总是打印出报头页, 无论他们是否用 lpr -h 命令来提交的任务。 让我们来深入深入的研究一下这个方法。 下面的脚本输入三个参数 (用户登录名, 主机名, 和任务名) 然后生成一个简单的 &postscript; 报头页: #!/bin/sh # # make-ps-header - make a PostScript header page on stdout # Installed in /usr/local/libexec/make-ps-header # # # These are PostScript units (72 to the inch). Modify for A4 or # whatever size paper you are using: # page_width=612 page_height=792 border=72 # # Check arguments # if [ $# -ne 3 ]; then echo "Usage: `basename $0` <user> <host> <job>" 1>&2 exit 1 fi # # Save these, mostly for readability in the PostScript, below. # user=$1 host=$2 job=$3 date=`date` # # Send the PostScript code to stdout. # exec cat <<EOF %!PS % % Make sure we do not interfere with user's job that will follow % save % % Make a thick, unpleasant border around the edge of the paper. % $border $border moveto $page_width $border 2 mul sub 0 rlineto 0 $page_height $border 2 mul sub rlineto currentscreen 3 -1 roll pop 100 3 1 roll setscreen $border 2 mul $page_width sub 0 rlineto closepath 0.8 setgray 10 setlinewidth stroke 0 setgray % % Display user's login name, nice and large and prominent % /Helvetica-Bold findfont 64 scalefont setfont $page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto ($user) show % % Now show the boring particulars % /Helvetica findfont 14 scalefont setfont /y 200 def [ (Job:) (Host:) (Date:) ] { 200 y moveto show /y y 18 sub def } forall /Helvetica-Bold findfont 14 scalefont setfont /y 200 def [ ($job) ($host) ($date) ] { 270 y moveto show /y y 18 sub def } forall % % That is it % restore showpage EOF 现在, 每个转换过滤器和文本过滤器都能调用这段脚本来生成报头页, 然后打印用户的任务。 下面是我们早些时候在这个文档中提到的 DVI 转换过滤器, 被修改之后来生成一个报头页: #!/bin/sh # # psdf - DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # orig_args="$@" fail() { echo "$@" 1>&2 exit 2 } while getopts "x:y:n:h:" option; do case $option in x|y) ;; # Ignore n) login=$OPTARG ;; h) host=$OPTARG ;; *) echo "LPD started `basename $0` wrong." 1>&2 exit 2 ;; esac done [ "$login" ] || fail "No login name" [ "$host" ] || fail "No host name" ( /usr/local/libexec/make-ps-header $login $host "DVI File" /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args 过滤器是怎样解释参数列表来决定用户名和主机名的。 解释的方法对于其他转换过滤器来说也是一样的。 尽管文本过滤器需要输入的参数有些小的不同, (参见 过滤器是怎样工作的)。 像我们以前提到的那样, 上面的配置, 尽管相当简单, 关掉了 禁止报头页 的选项 ( 选项) 在 lpr 中。 如果用户想要保护树木 (或者是几便士, 如果你对打印报头页收费的话), 它还不能完成这件事情, 因为每个过滤器都要为每个任务打印一个报头页。 要允许用户对于每个任务都可以关闭报头页, 您需要使用在 为报头页记帐 这节中介绍的那种技巧: 写一个输出过滤器来解释 LPD- 生成的报头页并且生成一个 &postscript; 的版本。 如果用户用 lpr -h 命令提交任务, 那么 LPD 将不会生成报头页, 并且输出过滤器也不会生成报头页。 否则, 输出过滤器将从 LPD 读取文本, 然后发送适当的报头页的 &postscript; 编码给打印机。 如果您有的是一台连在串口上的 &postscript; 打印机, 您可以使用 lprps 里的一个输出过滤器, psof , 它可以完成上述任务。 但注意 psof 不对报头页计费。 网络打印 printers network network printing FreeBSD 支持网络打印: 发送任务给远程打印机。 网络打印通常指两种不同的方式: 访问一台连接在远程主机上的打印机。 在一台主机上安装一台常规的串口或并口打印机。 然后, 设置 LPD 来通过网络访问其他主机上的打印机。 具体见 安装在远程主机上的打印机 这节。 访问一台直接连接在网络上的打印机。 打印机另有一个网络接口 (或者替代常规的串口或者并口)。 这样的打印机可能像下面这样工作: 它或许可以理解 LPD 的协议, 并且甚至可以接收远程主机发来的任务排进队列。 这样, 它就像一个普通的主机运行着 LPD 一样。 做在 安装在远程主机上的打印机 里介绍的步骤, 可以设置好这样的打印机。 它或许支持网络数据流。 这样, 把打印机 在一台网络上的主机上, 由这台主机负责安排任务并发送任务到打印机。 参见 带网络数据流接口的打印机 这节来得到更多安装这类打印机的建议。 安装在远程主机上的打印机 LPD 后台打印系统内建了对给其他也运行着 LPD (或者是与 LPD 兼容的) 的主机发送任务的功能。 这个功能使您可以在一台主机上安装打印机, 并让它可以在其他主机上访问。 这个功能同样适用在那些有网络接口并且可以理解 LPD 协议的打印机上。 要开启这种远程打印的功能, 首先在一台主机上安装打印机, 就是 打印服务器, 可以使用在 简单打印机设置 这节中简单设置的方法。 高级的设置可以参考 高级打印机设置 这节中你需要的部分。 一定要测试一下打印机, 看看它是不是所有您开启的 LPD 的功能都正常工作。 此外还需要确认 本地主机 允许使用 远程主机 上的 LPD 服务 (参见 限制远程打印机任务)。 printers network network printing 如果您正在使用一台带网络接口并与 LPD 兼容的打印机, 那么我们那下面讨论中的 打印服务器 就是打印机本身, 而 打印机名 就是您为打印机配置的名字。 参考随打印机和/或者打印机-网络接口供给的文档。 如果您正使用惠普的 Laserjet, 则打印机名 text 将自动地为您完成 LF 到 CRLF 的转换, 因而也就不需要 hpif 脚本了。 然后, 在另外一台你想要访问打印机的主机上的 /etc/printcap 文件中加入它们的记录, 像下面这样: 可以随意给这个记录起名字。 简单起见, 您可以给打印服务器使用相同的名字或者别名。 保留 lp 变量为空, (:lp=:)。 建立一个后台打印队列目录, 并用 sd 变量指明其位置。 LPD 将把任务提交给打印服务器之前, 会把这些任务保存在这里。 rm 变量中放入打印服务器的名字。 rp 中放入打印服务器上打印机的名字。 就是这样。 不需要列出转换过滤器, 页面大小, 或者其他的一些东西在 /etc/printcap 文件中。 这有一个例子。 主机 rose 有两台打印机, bamboorattan。 我们要让主机 orchid 的用户可以使用这两台打印机。 下面是 /etc/printcap 文件, 用在主机 orchid (详见 开启报头页) 上的。 文件中已经有了打印机 teak 的记录; 我们在主机 rose 上增加了两台打印机: # # /etc/printcap for host orchid - added (remote) printers on rose # # # teak is local; it is connected directly to orchid: # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: # # rattan is connected to rose; send jobs for rattan to rose: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: # # bamboo is connected to rose as well: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo: 然后, 我们只需要在主机 orchid 上建立一个后台打印队列目录: &prompt.root; mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo &prompt.root; chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo &prompt.root; chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo 现在, 主机 orchid 上的用户可以打印到 rattanbamboo 了。 如果, 比如, 一个用户在主机 orchid 上输入了: &prompt.user; lpr -P bamboo -d sushi-review.dvi LPD 系统在主机 orchid 上会复制这个任务到后台打印队列目录 /var/spool/lpd/bamboo 并且记下这是一个 DVI 任务。 当主机 rose 上的打印机 bamboo 的后台打印队列目录有空间的时, 这两个 LPD 系统将会传输这个文件到主机 rose 上。 文件将排在主机 rose - 的队列中知道最终被打印出来。 它将被从 DVI 转换成 + 的队列中直到最终被打印出来。 它将被从 DVI 转换成 &postscript; (因为 bamboo 是一台 &postscript; 打印机) 在主机 rose 带有网络数据流接口的打印机 通常, 当您为打印机购买了一块网卡, 可以得到两个版本: 一个是模拟后台打印 (贵一些的版本), 或者一个只发送数据给打印机就像在使用串口或者并口一样 (便宜一些的版本)。 这节讲述如何使用这个便宜一些的版本。 要得到贵一些版本的更多信息, 参见前面章节 安装在远程主机上的打印机。 /etc/printcap 文件的格式让您指定使用哪个串口或并口, 并且还要指定 (如果您正在使用串口), 使用多快的波特, 是否使用流量控制, 为制表符延迟, 转换换行, 等等。 但是没有一种方法指定一个连接到一台正在监听 TCP/IP 的或者其他网络接口的打印机。 要发送数据到网络打印机, 就需要开发一个通讯程序, 它可以被文本或者转换过滤器调用。 下面是一些例子: 脚本 netprint 将标准输入的所有数据发送到一个连在网络上的打印机。 我们将打印机的名字作为第一个参数, 端口号跟在后面作为第二个参数, 传给 netprint。 注意它只支持单向通讯 (FreeBSD 到打印机); 很多网络打印机支持双向通讯, 并且这是您可能利用到的 (得到打印机状态, 进行打印记帐, 等等的时候。)。 #!/usr/bin/perl # # netprint - Text filter for printer attached to network # Installed in /usr/local/libexec/netprint # $#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>"; $printer_host = $ARGV[0]; $printer_port = $ARGV[1]; require 'sys/socket.ph'; ($ignore, $ignore, $protocol) = getprotobyname('tcp'); ($ignore, $ignore, $ignore, $ignore, $address) = gethostbyname($printer_host); $sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address); socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol) || die "Can't create TCP/IP stream socket: $!"; connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!"; while (<STDIN>) { print PRINTER; } exit 0; 然后我们就可以在多种过滤器里使用这个脚本了。 加入我们有一台 Diablo 750-N 行式打印机联在网络上。 打印机在 5100 端口上接收要打印的数据。 打印机的主机名是 scrivener。 这里是为这个打印机写的文本过滤器: #!/bin/sh # # diablo-if-net - Text filter for Diablo printer `scrivener' listening # on port 5100. Installed in /usr/local/libexec/diablo-if-net # exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100 限制打印机的使用 printers restricting access to 这节将讲述关于限制打印机使用的问题。 LPD 系统让您可以控制谁可以访问打印机, 无论本地或是远程的, 是否他们可以打印机多份副本, 任务可以有多大, 以及打印队列的尺寸等。 限制多份副本 LPD 系统能够简化用户在打印多份副本时的工作。 用户可以用 lpr -#5 (举例) 来提交打印任务, 则会将任务中每个文件都打印五份副本。 这是不是一件很棒的事情呢。 如果您感觉多份副本会对打印机造成不必要的磨损和损耗, 您可以屏蔽掉 &man.lpr.1; 的 选项, 这可以通过在 /etc/printcap 文件中增加 sc 变量来完成。 当用户用 选项提交任务时, 他们将看到: lpr: multiple copies are not allowed 注意当为一台远程打印机进行设置时 (参见 安装在远程主机上的打印机 这一节) 您还需要同时在远程主机的 /etc/printcap 文件中 增加sc 变量, 否则用户还是可以从其他主机上提交使用多份副本的任务。 下面是一个例子。 这个是 /etc/printcap 文件在主机 rose 上。 打印机 rattan 非常轻闲, 所以我们将允许多份副本, 但是激光打印机 bamboo 则有些忙, 所以我们禁止多份副本, 通过增加 sc 变量: # # /etc/printcap for host rose - restrict multiple copies on bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: 现在, 我们还需要增机 sc 变量在主机 orchid/etc/printcap 文件中 (顺便我们也禁止打印机 teak 多份打印) : # # /etc/printcap for host orchid - no multiple copies for local # printer teak or remote printer bamboo teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc: 通过使用 sc 变量, 我们阻止了 lpr -# 命令的使用, 但仍然没有禁止用户多次运行 &man.lpr.1; , 或者多次提交任务中同样的文件, 像下面这样: &prompt.user; lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign 这里有很多种方法可以阻止这种行为 (包括忽略它), 并且是免费的。 限制对打印机的访问 您可以控制谁可以打印到哪台打印机通过 &unix; 的组机制和文件 /etc/printcap 中的 rg 变量。 只要把可以访问打印机的用户放进适当的组中, 然后在 rg 变量中写上组的名字。 如果这组以外的用户 (包括 root) 试图打印到被限制的打印机,将会得到这样的提示: lpr: Not a member of the restricted group 像使用 sc (禁止多份副本) 变量一样, 您需要指定 rg 在远程同样对打印机有访问限制的主机上, 如果您感觉合适的话 (参考 安装在远程主机上的打印机 这一节)。 比如, 我们将让任何人都可以访问打印机 rattan, 但只有在 artists 组中的人可以使用打印机 bamboo。 这里是类似的主机 rose 上的 /etc/printcap 文件: # # /etc/printcap for host rose - restricted group for bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: Let us leave the other example /etc/printcap file (for the host orchid) alone. Of course, anyone on orchid can print to bamboo. It might be the case that we only allow certain logins on orchid anyway, and want them to have access to the printer. Or not. 这里每台仅能有一个限制的组。 控制提交的任务大小 print jobs 如果您有很多用户访问打印机, 可能需要对用户可以提交的文件尺寸设置一个上限。 毕竟, 文件系统中后台打印队列目录的空间是有限的, 您需要保证这里有空间来存放其他用户的任务。 print jobs controlling LPD 允许通过使用 mx 变量来限制任务中文件的最大字节数, 方法是指定单位为块的 BUFSIZ 数, 每块表示 1024 字节。 如果在这个变量的值是 0, 则表示不进行限制; 不过, 如果不指定 mx 变量的话, 则会使用默认值 1000 块。 这个限制是对于任务中 文件 的, 而 不是 任务总共的大小。 LPD 不会拒绝比限制大小大的文件。 但它是将限制大小以内的部分排入队列, 并且打印出来的只有这些。 剩下的部分将被丢弃。 这个行为是否正确还需讨论。 让我们来为例子打印机 rattanbamboo 增加限制。 由于那些 artists 的 &postscript; 文件可能会很大, 我们将限制大小为 5 兆字节。 我们将不对纯文本行式打印机做限制: # # /etc/printcap for host rose # # # No limit on job size: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:mx#0:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: # # Limit of five megabytes: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: 同样, 限制只对本地用户起作用。 如果设置了允许远程用户使用您的打印机, 远程用户将不会受到这些限制。 您也需要指定 mx 变量在远程主机的 /etc/printcap 文件中。 参见 安装在远程主机上的打印机 这一节来得到更多有关远程打印的信息。 除此之外, 还有另一种限制远程任务大小的方法; 参见 限制远程打印机任务。 限制远程打印机任务 LPD 后台打印系统提供了多种方法来限制从远程主机提交的任务: 主机限制 您可以控制本地 LPD 接收哪台远程主机发来的请求, 通过 /etc/hosts.equiv 文件和 /etc/hosts.lpd 文件。 LPD 查看是否到来的任务请求来自被这两个文件中列出的主机。 如果没有, LPD 会拒绝这个请求。 这些文件的格式非常简单: 每行一个主机名。 注意 /etc/hosts.equiv 文件也被 &man.ruserok.3; 协议使用, 并影响着 &man.rsh.1; and &man.rcp.1; 等程序, 所以要小心。 举个例子, 下面是 /etc/hosts.lpd 文件在主机 rose 上: orchid violet madrigal.fishbaum.de 意思是主机 rose 将接收来自 orchidviolet, 和 madrigal.fishbaum.de 的请求。 如果任何其他的主机试图访问主机 roseLPD, 任务将被拒绝。 大小限制 您可以控制后台打印队列目录需要保留多少空间。 建立一个叫做 minfree 的文件在后台打印队列目录下为本地打印机。 在这个文件中插入一个数字来代表多少磁盘块数 (512 字节) 的剩余空间来接收远程任务。 这让您可以保证远程用户不会填满您的文件系统。 您也可以用它来给本地用户一个优先: 他们可以在磁盘剩余空间低于 minfree 文件中的指定值后仍然可以提交任务。 比如, 让我们增加一个 minfree 文件为打印机 bamboo。 我们检查 /etc/printcap 文件来找到这个打印机的后台打印队列目录; 这里是打印机 bamboo 的记录: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: 后台打印队列目录在 sd 变量中给出。 我们设置 3 兆字节 (6144 磁盘块) 为文件系统上必须存在的总共剩余空间, 让 LPD 可以接受远程任务: &prompt.root; echo 6144 > /var/spool/lpd/bamboo/minfree 用户限制 您可以控制哪些远程用户可以打印到本地打印机, 通过指定 rs 变量在 /etc/printcap 文件中。 当 rs 出现在一个本地打印机的记录中时, LPD 将接收来自远程主机 在本地有同样登录名的用户提交的任务。 否则, LPD 会拒绝这个任务。 这个功能在一个 (比如) 有许多部门共享一个网络的环境中特别有用, 并且有些用户可以越过部门的边界。 通过为他们在您的系统上建立帐号, 他们可以他们自己的部门的系统里使用您的打印机。 如果 允许他们您的打印机, 而不是您的计算机资源, 您可以给他们 象征 帐户, 不带主目录并且设置一个没用的 shell , 比如 /usr/bin/false 对打印机使用记帐 accounting printer 当然, 你需要对打印付费。 为什么不? 纸张和墨水都需要花钱的。 并且这里还有维护的费用 — 打印机是由很多部件组装成的, 并且零件会坏掉。 您可以检查您的打印机, 使用形式, 和维护费用来得出每页 (或者每尺, 每米, 或者每什么) 的费用。 现在, 您怎样启动打印记帐呢? 好了, 坏消息是 LPD 后台打印系统在这个部分没有提供很多帮助。 记帐是一个对使用的打印机的种类, 打印的格式, 和 您的 在对打印机的使用计费的需求依赖性很高的。 要实现记帐, 您必须更改打印机的文本过滤器 (对纯文本任务记费) 和转换过滤器 (对其他格式的文件计费), 要统计页数或者查询打印了多少页的话。 您不可以通过使用简单的输出过滤器来逃脱计费, 因为它不能进行记帐。 参见 过滤器 这节。 通常, 有两种方法来进行记帐: 定期记帐 是更常用的方法, 可能因为它更简单。 无论合适何人打印一个任务, 过滤器都将记录用户名, 主机名, 和打印的页数到一个记帐文件。 每个月, 学期, 年, 或者任何您想设定的时间段, 收集这些不同打印机上的记帐文件, 按用户对打印的页数进行结算, 并对使用进行付费。 然后删掉所有记录文件, 开始一个新的计费周期。 实时记帐 不太常用, 可能因为它比较难。 这种方法让过滤器对用户的打印进行实时的记帐。 像磁盘配额, 记帐是实时的。 您可以组织用户打印当他们的帐户超额的时候, 并且可能提供一种方法让用户检查并调整他们的 打印配额。 但这个方法需要一些数据库代码来跟踪用户和他们的配额。 LPD 后台打印系统对两种方法都支持且很简单: 所以您需要提供过滤器 (大多数时候), 还要提供记帐代码。 但这好的方面是: 您可以有非常灵活的记帐方法。 比如, 您可以选择使用阶段记帐还是实时记帐。 您可以选择记录哪些信息: 用户名, 主机名, 任务类型, 打印页数, 使用了多少平方尺的纸, 任务打印了多长时间, 等等。 您可以通过修改过滤器来存储这些信息。 快速并且混乱的打印记帐 FreeBSD 包含两个可以让您立刻可以建立起简单的阶段记帐的程序。 它们是文本过滤器 lpf, 在 lpf: 一个文本过滤器 这节中描述, 和 &man.pac.8;, 一个收集并统计打印机记帐文件中记录的程序。 像在前面章节提到的过滤器一样 (过滤器), LPD 启动文本或者转换过滤器并在过滤器命令行里带上记帐文件的名字。 过滤器可以使用这个参数知道该往哪写记帐记录。 这个文件的名字来自于 af 变量在 /etc/printcap 文件里, 并且如果没有指定绝对路径, 则默认是相对于后台打印队列目录的。 LPD 启动 lpf 带着页宽和页长的参数 (通过 pwpl 变量)。 lpf 使用这些参数来判定将使用多少张纸。 在文件发送到打印机之后, 它就会在记帐文件中写入记录。 记录像下面这个样子: 2.00 rose:andy 3.00 rose:kelly 3.00 orchid:mary 5.00 orchid:mary 2.00 orchid:zhang 您应该让每个打印机都使用一个独立的记帐文件, 像 lpf 就没有内建文件锁逻辑, 这样两个 lpf 可能会发生彼此记录混合的情况, 如果它们同时要在同一个文件写入内容的时候。 一个最简单的保证每个打印机都使用一个独立的记帐文件的方法就是将 af=acct 写在 /etc/printcap 文件中。 然后, 每个打印机的记帐文件都会在这台打印机的后台打印队列目录中, 文件的名字叫做 acct 当您准备对用户的打印进行收费时, 运行 &man.pac.8; 程序。 只要转换到要收集信息的这台打印机的后台打印队列目录, 然后输入 pac。 您将会得到一个美元计费的摘要像下面这样: Login pages/feet runs price orchid:kelly 5.00 1 $ 0.10 orchid:mary 31.00 3 $ 0.62 orchid:zhang 9.00 1 $ 0.18 rose:andy 2.00 1 $ 0.04 rose:kelly 177.00 104 $ 3.54 rose:mary 87.00 32 $ 1.74 rose:root 26.00 12 $ 0.52 total 337.00 154 $ 6.74 这些是 &man.pac.8; 需要的参数: 哪台 打印机 要结帐。 这个选项仅在用 af 变量在 /etc/printcap 文件中指定了绝对路径的情况下起作用。 以金额来排序输出来代替以用户名字字母排序。 忽略记帐文件中的主机名。 带上这个选项, 用户 smith 在主机 alpha 上与同样的用户 smith 在主机 gamma 上一样。 不带这个选项的话, 他们则是不同的用户。 使用 price 作为每页或每尺美元的单价来替代 pc 变量指定的单价在 /etc/printcap 文件中, 或者两分 (默认)。 price 可以用一个浮点数来指定。 反向排序。 建立一个记帐摘要文件, 并且截短记帐文件。 名字 只打印指定 名字 用户的记帐信息。 在 &man.pac.8; 默认产生的摘要中, 可以看到在不同主机上的每个用户打印了多少页。 如果在您这里, 主机不考虑 (因为用户可以使用任何主机), 运行 pac -m, 来得到下面的摘要: Login pages/feet runs price andy 2.00 1 $ 0.04 kelly 182.00 105 $ 3.64 mary 118.00 35 $ 2.36 root 26.00 12 $ 0.52 zhang 9.00 1 $ 0.18 total 337.00 154 $ 6.74 要以美元计算应付钱数, &man.pac.8; 指定 pc 变量在 /etc/printcap 文件中 (默认是 200, 或者 2 分每页). 这个参数的单位是百分之一分, 在这个变量中指定每页或者每尺的价格。 您可以覆盖这个值当运行 &man.pac.8; 带着参数 的时候。 参数 的单位是美元, 而不是百分之一分。 例如, &prompt.root; pac -p1.50 设定每页的价格是 1 美元 5 美分。 您可以通过这个选项来达到目标利润。 最终, 运行 pac -s 将存储这些信息在一个记帐文件里, 文件名和打印机帐户的名字相同, 但是带着 _sum 的后缀。 然后截短记帐文件。 当您再次运行 &man.pac.8; 的时候, 它再次读取记帐文件来得到初始的总计, 然后在记帐文件中增加信息。 怎样对打印的页数进行计数? 为了进行远程的精确记帐, 需要判断一个任务将会消耗多少张纸。 这是打印记帐问题的关键。 对于纯文本任务, 这个问题不是太难解决: 对任务中的行数进行计数然后与打印机支持的每页行数进行比较。 别忘了也对添印的行, 或者很长的逻辑上的一行但在打印机上会折成两行的这类进行记帐。 文本过滤器 lpf (在 lpf:一个文本过滤器 这节中介绍) 会在记帐时考虑这些问题。 如果正在编写一个可以进行记帐的文本过滤器, 您可能需要查看 lpf 的源代码。 怎样处理其他格式的文件? 好, 对于 DVI- 到 -LaserJet 或者 DVI- 到 -&postscript; 转换, 可以让您的过滤器输出诊断信息, 关于 dvilj 或者 dvips 命令, 并且看到多少页被转换了。 您也许可以对于其他类型的文件和转换程序进行类似操作。 但是这些方法的弱点就是事实上打印机并不是打印了所有的页。 比如, 卡纸, 缺墨, 或者炸掉了 — 但用户还是要为没有打印的部分付钱。 您该怎样做? 只有一条 肯定 的方法来进行 精确 的记帐。 购买一台可以告诉您它使用了多少纸的打印机, 并且将它连接到串口或者网络上。 几乎所有 &postscript; 打印机都支持这个小功能。 其他制造厂或其他型号也可以有这个功能 (比如 Imagen 激光网络打印机)。 为这些打印机更改过滤器使它在打印完每个任务之后接收纸张用量, 并 基于这个值进行记帐。 不需要计算行数, 也不需要容易出错的文件检查。 当然, 您也总是可以大方的使打印免费。 使用打印机 printers usage 这节将讲述如何使用在 FreeBSD 下设置好的打印机。 下面是一个用户级命令的总览: &man.lpr.1; 打印任务 &man.lpq.1; 检查打印队列 &man.lprm.1; 从打印机的队列中移除任务 还有一个管理命令, &man.lpc.8;, 在 管理打印机 一节中有所介绍, 它可以用于控制打印机及其队列。 &man.lpr.1;, &man.lprm.1;, and &man.lpq.1; 这三个命令都接受 选项来指定对哪个打印机 / 队列进行操作, 在 /etc/printcap 文件中列出的打印机。 这允许您提交, 删除, 并检查任务在多个打印机上。 如果您不使用 选项, 那么这些命令会使用在 环境变量 PRINTER 中指定的打印机。 最终, 如果您也没有 PRINTER 这个环境变量, 这些命令的默认值是叫做 lp 的这台打印机。 从此以后, 术语 默认打印机 就是指 PRINTER 环境变量中指定的这台, 或者叫做 lp 的这一台当没有环境变量 PRINTER 的时候。 打印任务 要打印文件, 输入: &prompt.user; lpr filename ... printing 这个命令会打印所有列出的文件到默认打印机。 如果没有列出文件, &man.lpr.1; 会从标准输入读取打印数据。 比如, 这个命令打印一些重要的系统文件: &prompt.user; lpr /etc/host.conf /etc/hosts.equiv 要选择一个指定的打印机, 输入: &prompt.user; lpr -P printer-name filename ... 这个例子打印一个当前目录的长长的列表到叫做 rattan 的这台打印机: &prompt.user; ls -l | lpr -P rattan 因为没有为 &man.lpr.1; 命令列出文件, lpr 从标准输入读入数据, 在这里是 ls -l 命令的输出。 &man.lpr.1; 命令同样可以接受多种控制格式的选项, 应用文件转换, 生成多份副本, 等等。 要得到更多信息, 参考 打印选项 这节。 检查任务 print jobs 当使用 &man.lpr.1; 进行打印时, 您希望打印的所有数据被放在一起打包成了一个 打印任务, 它被发送到 LPD 后台打印系统。 每台打印机都有一个任务队列, 并且您的任务在队列中等待其他用户的其他任务打印。 打印机按照先来先印的规则打印这些任务。 要显示默认打印机的队列, 输入 &man.lpq.1;。 要指定打印机, 使用 选项。 例如, 命令 &prompt.user; lpq -P bamboo 会显示打印机 bamboo 的队列。 下面是命令 lpq 输出的一个例子: bamboo is ready and printing Rank Owner Job Files Total Size active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes 2nd kelly 10 (standard input) 1635 bytes 3rd mary 11 ... 78519 bytes 这里显示了队列中有三个任务在 bamboo 中。 第一个任务, 用户 kelly 提交的, 标识 任务编号 9。 每个要打印的任务都会获得一个不同的任务编号。 大多时候可以忽略这个任务编号, 但在您需要取消任务时会用到这个号码; 参考 移除任务 这节得到更多信息。 编号为 9 的任务包含了两个文件; 在 &man.lpr.1; 命令行中指定的多个文件被看作是一个单个的任务。 它是当前激活的任务 (注意这个词 激活Rank 这列下面), 意思是打印机当前正在打印那个任务。 第二个任务包含了标准输入传给 &man.lpr.1; 命令的数据。 第三个任务来自用户 mary; , 它是一个比较大的任务。 她要打印的文件的路径名太长了, 所以 &man.lpq.1; 命令只显示了三个点。 &man.lpq.1; 输出的头一行也很有用: 它告诉我们打印机正在做什么 (或者至少是 LPD 认为打印机应该正在做的)。 &man.lpq.1; 命令同样支持 选项来生成一个详细的长列表。 下面是一个 lpq -l 命令的例子: waiting for bamboo to become ready (offline ?) kelly: 1st [job 009rose] /etc/host.conf 73 bytes /etc/hosts.equiv 15 bytes kelly: 2nd [job 010rose] (standard input) 1635 bytes mary: 3rd [job 011rose] /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes 移除任务 如果您对一个打印任务改变了主意, 可以用 &man.lprm.1; 将任务从队列中删除。 通常, 您甚至可以用 &man.lprm.1; 命令来移除一个当前激活的任务, 但是任务的一部分或者所有还是可能打印出来。 要从默认打印机中移除一个任务, 首先使用 &man.lpq.1; 找到任务编号。 然后输入: &prompt.user; lprm job-number 要从指定打印机中删除任务, 增加 选项。 下面的命令会删除编号为 10 的任务从 bamboo 这台打印机: &prompt.user; lprm -P bamboo 10 &man.lprm.1; 命令有一些快捷方式: lprm - 删除所有属于您的任务 (默认打印机的)。 lprm user 删除所有属于用户 user 的任务 (默认打印机的)。 超级用户可以删除用户的任务; 您只可以删除自己的任务。 lprm 命令行中不带任务编号, 任务名, 或者 选项, &man.lprm.1; 会删除默认打印机上当前激活的任务, 如果它属于你。 超级用户可以删除任务激活的任务。 使用参数 和上面的快捷方式来用指定打印机替代默认打印机。 例如, 下面的命令会删除当前用户在打印机 rattan 队列中的所有任务: &prompt.user; lprm -P rattan - 如果您正工作在一个网络环境中, &man.lprm.1; 将只允许在提交任务的主机上删除任务, 甚至是同一台打印机也可以在其他主机上使用时。 下面的命令证明了这个: &prompt.user; lpr -P rattan myfile &prompt.user; rlogin orchid &prompt.user; lpq -P rattan Rank Owner Job Files Total Size active seeyan 12 ... 49123 bytes 2nd kelly 13 myfile 12 bytes &prompt.user; lprm -P rattan 13 rose: Permission denied &prompt.user; logout &prompt.user; lprm -P rattan 13 dfA013rose dequeued cfA013rose dequeued 超越纯文本:打印选项 &man.lpr.1; 支持许多控制文本格式的参数, 转换图形和其他格式文件, 生成多份副本, 处理任务, 等等。 这一节将描述这些选项。 格式与转换选项 下面的 &man.lpr.1; 参数控制任务中文件的格式。 使用这些参数, 如果任务不含纯文本, 或者您想让纯文本通过 &man.pr.1; 格式化。 &tex; 例如, 下面的命令打印一个 DVI 文件 (来自 &tex; 排版系统) 文件名为 fish-report.dvi 到打印 bamboo &prompt.user; lpr -P bamboo -d fish-report.dvi 这些选项应用到任务中的每个文件, 所以您不能混合 (说) DVI 和 ditroff 文件在同一个任务中。 替代的方法是, 用独立的任务提交这些文件, 使用不同的转换选项给不同的任务。 所有这些选项除了 都需要转换过滤器安装给目标打印机。 例如, 选项需要 DVI 转换过滤器。 参考 转换过滤器 这节得到更多细节。 打印 cifplot 文件。 打印 DVI 文件。 打印 FORTRAN 文本文件。 打印 plot 数据。 缩进 number 列; 如果没有指定 number, 则缩进 8 列。 这个选项仅可以工作在某些过滤器上。 不要在选项 和数字之间加入空格。 打印文字数据, 包括控制字符。 打印 ditroff (无设备依赖 troff) 数据。 -p 打印之前用 &man.pr.1; 格式化纯文本。 参考 &man.pr.1; 得到更多信息。 使用 title 在 &man.pr.1; 上来替代文件名。 这个选项仅在使用 选项时起作用。 打印 troff 数据。 打印 raster 数据。 下面是一个例子: 这个命令打印了一个很好的 &man.ls.1; 联机手册到默认打印机: &prompt.user; zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t &man.zcat.1; 命令解压缩 &man.ls.1; 的手册并且将内容传给 &man.troff.1; 命令, 它将格式化这些内容并且生成 GNU troff 输出给 &man.lpr.1; , 它提交任务到 LPD 后台打印。 因为使用了 选项为 &man.lpr.1; , 后台打印将会转换 GNU troff 输出到默认打印机可以理解的格式当任务被打印时。 任务处理选项 下面的 &man.lpr.1; 选项告诉 LPD 对任务特殊处理: -# copies 生成 copies 个副本给任务中的每个文件, 替代每个文件一份副本。 管理员可以禁止这个选项来减少打印机的浪费和鼓励复印机的使用。 参考 限制多份副本。 这个例子打印三份副本的文件 parser.c 跟着三份副本的文件 parser.h 到默认打印机: &prompt.user; lpr -#3 parser.c parser.h -m 打印完成后发信。 使用这个选项, LPD 系统将会发送邮件到您的帐户, 当它完成了处理您的任务后。 在信中, 它将会告诉您任务是否成功完成或者出现了错误, 并且 (通常) 指明是什么错误。 -s 不要复制文件到后台打印队列目录, 要使用符号连接。 如果您正在打印一个很大的任务, 您可能需要这个选项。 它节省后台打印队列目录的空间 (您的任务可能使后台打印队列目录所在的文件系统剩余空间超出)。 它同样也节省了时间, 因为 LPD 将不会副本任务的每个字节到后台打印队列目录。 这也有一个缺点: 因为 LPD 将直接指向源文件, 您不能修改或者删除它们直到它们被打印出来。 如果您打印到一台远程打印机, LPD 将最终将文件从本地主机副本到远程主机上, 所以选项 只能节省本地后台打印队列目录的空间, 而不是远程的。 虽然如此, 但它还是很有用。 -r 移除任务中的文件在它们被复制到后台打印队列目录之后, 或者在用 选项打印它们之后。 谨慎使用这个选项! 报头页选项 这些 &man.lpr.1; 的选项调整了通常出现在任务报头页上的文本。 如果报头页被跳过了在目标打印机上, 这些选项将不会起作用。 参考 报头页 得到更多关于设置报头页的信息。 -C text 替换报头页上的主机名为 text。 主机名通常都是提交任务的主机名称。 -J text 替换报头页上的任务名为 text。 任务名通常是任务中头一个文件的名字, 或者 stdin 如果您正在打印标准输入。 -h 不打印任何报头页。 在某些地点, 这个选项可能无效, 与报头页的产生方法有关。 参考 报头页 得到详细信息。 管理打印机 作为一个打印机的管理者, 您必须要安装, 设置, 并且测试它们。 使用 &man.lpc.8; 命令, 您可以与打印机以更多的方式交流。 用 &man.lpc.8; , 您可以 启动或停止打印机 启用或禁止它们的队列 重新安排每个队列中的任务。 首先, 一个关于术语的解释: 如果一个打印机被 停止 了, 它将不会打印它队列中的任何东西。 但用户还是可以提交任务, 它们会在队列中等待直到打印机被 启动 或者队列被清空。 如果一个队列被 禁止, 没有用户 (除了 root) 可以提交任务到打印机。 一个 启用 的队列允许任务被提交。 一个打印机可以被 启动 但它的队列被禁止, 在这种情况下打印机将打印队列中的任务, 直到队列为空。 通常, 您必须有 root 权限来使用 &man.lpc.8; 命令。 普通用户可以使用 &man.lpc.8; 命令来获得打印机状态并且重启一台挂了的打印机。 这里是一个关于 &man.lpc.8; 命令的摘要。 大部分命令带着一个 printer-name 参数来知道要对哪台打印机操作。 您可以用 all 填在 printer-name 的位置来代表所有在 /etc/printcap 文件中列出的打印机。 abort printer-name 取消当前任务并停止打印机。 用户仍然可以提交任务, 如果队列还是启用的。 clean printer-name 从打印机的后台打印队列目录移除旧的文件。 有时, 组成任务的文件没有被 LPD 正确的删除, 特别是在打印中出现错误或者管理活动比较多的时候。 这个命令查找不属于后台打印队列目录的文件并删除它们。 disable printer-name 禁止新任务入队。 如果打印机正在工作, 它将会继续打印队列中剩余的任务。 超级用户 (root) 总是可以提交任务, 甚至提交到一个禁止的队列。 这个命令在测试一台新打印机或者安装过滤器时非常有用: 禁止队列并提交以 root 提交任务。 其他用户将不能提交任务直到您完成了测试并用命令 enable 重新启用了队列的时候。 down printer-name message 打印机下线。 等于 disable 命令后跟一个 stop 命令。 message 将作为打印机状态, 当用户使用 &man.lpq.1; 或者 lpc status 命令查看打印机队列状态的时候显示出来。 enable printer-name 为打印机开启队列。 用户可以提交任务到打印机但是在打印机启动之前不会打印出任何东西。 help command-name 打印关于 command-name 命令的帮助。 不带 command-name, 则打印可用命令的摘要。 restart printer-name 启动打印机。 普通用户可以使用这个命令, 当一些特别的环境导致 LPD 锁死时, 但他们不能启用一台使用 stop 或者 down 命令停用的打印机。 restart 命令等同于 abort 后跟着一个 start start printer-name 启用打印机。 打印机将开始打印队列中的任务。 stop printer-name 停止打印机。 打印机将完成当前任务并且将不再打印队列中的任务任务。 尽管打印机被停用, 但用户仍然可以提交任务到一个开启的队列。 topq printer-name job-or-username 重新以 printer-name 安排队列, 通过将列出的 job 编号或者指定的所属 username 的任务放在队列的最前面。 对于这个命令, 您不可以使用 all 当作 printer-name up printer-name 打印机上线; 相对于 down 命令。 等同于 start 后跟着一个 enable 命令。 &man.lpc.8; 的命令行接受上面的命令。 如果您不输入任何命令, &man.lpc.8; 则进入一个交互模式, 在这里您可以输入命令直到输入 exitquit, 或者文件结束符。 替换标准后台打印 如果您已经通读过了这个手册, 那么到现在您应该已经了解了关于 FreeBSD 包含的后台打印系统 LPD 的一切。 您可能发现了它很多的缺点, 它们很自然的让您提出这样的问题: 这里还有什么后台打印系统吗 (并且可以工作在 FreeBSD 上) ? LPRng LPRng LPRng, 它的意思是 LPR: 下一代, 是一个完全重写的 PLP。 Patrick Powell 和 Justin Mason (PLP 维护的主要负责人) 合作完成了 LPRngLPRng 的主站是 CUPS CUPS CUPS, 通用 UNIX 打印系统, 提供了一个轻便的打印层给 &unix;-基础的操作系统。 它是由 Easy Software Products 开发的, 并且成为了 &unix; 供应商和用户的标准打印解决方案。 CUPS 使用 Internet 打印协议 (IPP) 作为管理打印任务和队列的基础。 行式打印机守护程序 (LPD) 服务器消息块 (SMB), 和 AppSocket (a.k.a. JetDirect) 协议的部分功能也被支持。 CUPS 增加了基于浏览网络打印机和 PostScript 打印机描述 (PPD) 的打印选项来支持 &unix; 下的真实打印。 CUPS 的主站是 疑难问题 在使用 &man.lptest.1; 进行简单的测试之后, 您可能得到了下面的结果, 而不是正确的结果: 过了一会儿, 它工作了; 或者, 它没有退出一整张纸。 打印机进行了打印, 但在这之前它呆了一段而且什么都没做。 事实上, 您可能需要按一下打印机上的 打印剩余 或者 送纸 按钮来让结果出现。 如果这是问题所在, 打印机可能在等待, 看看在打印之前, 您的任务是否还有更多的数据。 要修正这个问题, 您可以让文本过滤器发送一个送纸字符 (或者其他需要的) 到打印机。 这通常足够让打印机立即打印出内部缓存内剩余的文本。 它同样可以用来确保每个任务的结尾都占用一整张纸, 这样下一个任务才不会在前一个任务最后一张纸的中间开始。 接下来的 shell 脚本 /usr/local/libexec/if-simple 的脚本打印了一个送纸符在它发送任务到打印机之后: #!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. # Writes a form feed character (\f) after printing job. /bin/cat && printf "\f" && exit 0 exit 2 它的输出产生了 楼梯效果 您可能在纸上得到下面这些: !"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 MS-DOS OS/2 ASCII 您也成为了 楼梯效果 的受害者, 这是由对新行的标志字符的解释不一致造成的。 &unix; 风格的操作系统使用一个单个字符: ASCII 码 10, 即换行 (LF)。 &ms-dos;, &os2;, 和其他的系统使用一对儿字符, ASCII 码 10 ASCII 码 13 (回车 CR)。 许多打印机使用 &ms-dos; 的习惯来代表新行。 当您在 FreeBSD 上打印时, 您的文本仅用了换行字符。 打印机, 打印机看到换行字符后, 走一行纸, 但还光标位置还是在这张纸上要打印的下一个字符处。 这就是回车的作用: 将下一个要打印的字符的位置移到纸张的左边缘。 这里是 FreeBSD 想要打印机做的: 打印机收到 CR 打印机打印 CR 打印机收到 LF 打印机打印 CR + LF 下面有几种完成这个的办法: 使用打印机的配置开关或者控制面板来更改它对这些字符的解释。 查看打印机的手册来找到怎样更改。 如果您引导您的系统到其他除了 FreeBSD 之外的操作系统, 您可能不得不 重新配置 打印机使用 这个操作系统对 CR 和 LF 字符的解释。 您可能更喜欢下面这另一种解决方案。 让 FreeBSD 的串口驱动自动转换 LF 到 CR+LF。 当然, 这 仅仅 工作在串口打印机上。 要开启这个功能, 定义 ms# 变量并 设置 onlcr 模式在 /etc/printcap 文件中相应打印机处。 发送一个 转义码 到打印机来让它临时对 LF 字符做不同的处理。 参考您的打印机手册来了解您的打印机支持哪些转义码。 当您找到合适的转义码, 修改文本过滤器让其先发送这个转义码, 然后再发送打印任务。 PCL 这里是一个为懂得 Hewlett-Packard PCL 转义码的打印机编写的文本过滤器。 这个过滤器使得打印机将 LF 作为一个 LF 和一个 CR 来对待; 然后它发送任务; 最后发送一个送纸符弹出任务的最后一张纸。 它应该可以在几乎所有 Hewlett Packard 打印机上工作。 #!/bin/sh # # hpif - Simple text input filter for lpd for HP-PCL based printers # Installed in /usr/local/libexec/hpif # # Simply copies stdin to stdout. Ignores all filter arguments. # Tells printer to treat LF as CR+LF. Ejects the page when done. printf "\033&k2G" && cat && printf "\033&l0H" && exit 0 exit 2 下面是一个 /etc/printcap 文件的例子在叫做 orchid 的主机上。 它只有一台打印机连接在第一个并口上, 一台 Hewlett Packard LaserJet 3Si 名字叫做 teak。 它使用上面那段脚本作为文本过滤器: # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif: 行行覆盖。 打印机从来不进纸换行。 所有的文本都打印在头一行文本的上面。 这个问题是 相反 于楼梯效果, 像上面描述的那样, 并且更少见。 一些地方, LF 这个 FreeBSD 用来结束一行的字符被作为 CR 这个将打印位置返回到纸的左边的字符对待。 而没有向下走纸一行。 使用打印机的配置开关或者控制面板来强制对 LF 和 CR 进行下面的转换: 打印机收到 打印机打印 CR CR LF CR + LF 打印丢掉字符。 当打印时, 每行里打印机都丢掉一些字符没有打。 这个问题可能随着打印的进行越发严重, 丢掉越来越多的字符。 这个问题是由打印机跟不上计算机通过串口发送数据的速度造成的 (这个问题应该不会发生在并口打印机上)。 有两种方法能克服这个问题: 如果打印机支持 XON/XOFF 流量控制, 那就让 FreeBSD 使用它, 通过加入 ixon 模式在 ms# 变量里。 如果打印机支持载波流量控制, 指定 crtscts 模式在 ms# 变量里。 并且要确定连接打印机和计算机的线是支持载波流量控制的。 它打印出垃圾。 打印机打印出的东西看起来是一些随机的字符, 而不是想要打印的东西。 这通常意味着另一种串口打印机通讯参数设置不正确的错误。 复查 br 变量中设定的波特, 和 ms# 中的校验设置; 确定打印机也在使用和 /etc/printcap 文件中相同的设置。 没有反应。 如果没有反应, 问题就可能出在 FreeBSD 而不是硬件上了。 增加日志文件 (lf) 变量到 /etc/printcap 文件里出现问题的打印机的记录处。 比如, 下面是打印机 rattan 的记录, 使用了 lf 变量: rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple:\ :lf=/var/log/rattan.log 然后, 再次打印。 检查日志文件 (在我们的例子当中, 是 /var/log/rattan.log 这个文件) 来看是否有错误信息出现。 根据出现的信息, 试着来修正问题。 如果您没有指定 lf 变量, LPD 会使用 /dev/console 作为默认值。 diff --git a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml index b946172743..50b6adff2e 100644 --- a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml @@ -1,2576 +1,2544 @@ 串口通讯 概述 串口通讯 &unix; 一直都是支持串口通讯的。事实上, 早期的 &unix; 系统就是利用串口线来输入和输出数据的。 那时常见的 终端 包括一个每秒10个字符的串口打印机和键盘, 现在这些已经发生了很大的变化。 这章将介绍一些利用 FreeBSD 进行串口通讯的方法。 读完这章,您将了解到: 如何通过终端连接到您的FreeBSD系统。 如何使用modem拨号到远程主机。 如何允许远程用户通过modem登录到您的系统。 如何从串口控制台引导您的系统。 阅读这章之前,您应当了解: 如何配置和安装一个新的内核 ()。 理解 &unix; 的权限和进程 ()。 准备您打算在 FreeBSD 中使用的串口设备 (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 电缆会直接传送某些信号, 如 Signal Ground (信号地), 但对其他信号进行交换。 例如, Transmitted Data (数据发送) 引脚是连到另一端 Received Data (数据接收) 引脚的。 也可以自行制作 null-modem 电缆给终端使用 (例如, 为了品质的要求)。 下面的表格展示了 RS-232C 信号, 以及 DB-25 连接器上的引脚。 注意, 标准也要求一根直通引脚 1 到引脚 1 的 保护地 (Protective Ground) 线, 但这通常都被省掉。 某些终端在只有引脚 2、 3 和 7 的时候, 就已经能够正常使用了, 而其他一些, 则需要下面例子中所展示的不同的配置。 DB-25 to DB-25 Null-Modem Cable 信号 引脚 # 引脚 # 信号 SG 7 连接到 7 SG TD 2 连接到 3 RD RD 3 连接到 2 TD RTS 4 连接到 5 CTS CTS 5 连接到 4 RTS DTR 20 连接到 6 DSR DTR 20 连接到 8 DCD DSR 6 连接到 20 DTR DCD 8 连接到 20 DTR
这里还有两种目前比较流行的其他接线方式。 DB-9 到 DB-9 Null-Modem 电缆 信号 引脚 # 引脚 # 信号 RD 2 接到 3 TD TD 3 接到 2 RD DTR 4 接到 6 DSR DTR 4 接到 1 DCD SG 5 接到 5 SG DSR 6 接到 4 DTR DCD 1 接到 4 DTR RTS 7 接到 8 CTS CTS 8 接到 7 RTS
DB-9 到 DB-25 Null-Modem 电缆 信号 引脚 # 引脚 # 信号 RD 2 DB-9 到 DB-25 Null-Modem 电缆 2 TD TD 3 接到 3 RD DTR 4 接到 6 DSR DTR 4 接到 8 DCD SG 5 接到 7 SG DSR 6 接到 20 DTR DCD 1 接到 20 DTR RTS 7 接到 5 CTS CTS 8 接到 4 RTS
当某一段连接器上的一个引脚需要连接到对端的一对引脚时, 通常是将那一对引脚使用一短线连接, 而使用长线接到另一端的那个引脚。 上面的设计似乎更为流行。 在其他变种中 (在 RS-232 Made Easy 这本书中进行了详细介绍) 则是 SG 接 SG, TD 接 RD、 RTS 和 CTS 接 DCD、 DTR 接 DSR, 反之亦然。
标准RS-232C线缆 RS-232C cables 标准的串口电缆会直接传送所有 RS-232C 信号。 也就是说, 一头的 Transmitted Data 引脚, 会直接接到另一头的 Transmitted Data 引脚。 这包括将调制解调器接到您的 FreeBSD 系统上的那种电缆, 同样也适用于某些型号的终端。
端口 串口是FreeBSD主机与终端传输数据的设备。 这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。 端口的种类 有好几种串口。 在采购或制作线缆之前, 您应确认它能够适合您的终端以及 FreeBSD 系统。 绝大多数终端都提供 DB-25 端口。 个人计算机, 也包括运行 FreeBSD 的 PC 机, 通常会有 DB-25 或 DB-9 口。 如果您的 PC 上有多插口串口卡, 则可能有 RJ-12 或 RJ-45 口。 请参见您硬件的文档以了解所用接口的规格。 此外, 您也可以通过观察外观来了解所用的端口。 端口名称Port Names 在FreeBSD中,您可以通过 /dev 目录中的一个记录来访问每个串口。有两种不同的记录: 呼入端口被命名为/dev/ttydN, 这里 N 是端口号,从零开始。 通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测 (DCD) 信号来工作。 呼出端口被命名为 /dev/cuadN。 您通常不使用呼出端口作为终端, 只使用modem。 如果串口线或终端不支持载波检测数据传输, 您可以使用呼出端口。 - - 在 &os; 5.X 和更早版本中, 呼出端口的名字是 - /dev/cuaaN 如果您已经连接一个终端到第一个串口 (在 &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 如果内核未能认出所有的串口, 可能需要通过修改 /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/cuadN (呼出) 设备来访问的。 此外, FreeBSD 也提供了初始化设备 - (在 &os; 6.X 上是 - /dev/ttydN.init 以及 - /dev/cuadN.init, - 而在 &os; 5.X 上则是 - /dev/ttyidN 和 - /dev/cuaiaN) 以及锁设备 - (在 &os; 6.X 上是 - /dev/ttydN.lock 和 - /dev/cuadN.lock, - 而在 &os; 5.X 上则是 - /dev/ttyldN 和 - /dev/cualaN)。 + (/dev/ttydN.init 和 + /dev/cuadN.init) + 以及锁设备 + (/dev/ttydN.lock 和 + /dev/cuadN.lock)。 初始化设备用于在打开端口时初始化其通讯参数, 例如使用 RTS/CTS 信号进行流控制的调制解调器的 crtscts。 锁设备则用于在端口上提供一个锁标志, 防止用户或程序改变特定的参数; 请参见 &man.termios.4;、 &man.sio.4;, 以及 &man.stty.1; 的联机手册, 以了解关于终端配置、 锁和初始化设备, 以及配置终端参数的详细信息。 串口配置 ttyd cuad ttydN (或 cuadN) 设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时, 它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置: &prompt.root; stty -a -f /dev/ttyd1 当您修改了这个设备的设置,这个设置会生效,除非设备被关闭。 当它被重新打开时,它将回到默认设置。 要修改默认设置,您可以打开和调整 初始状态 设备的设置。例如, 要为ttyd5 打开 模式,8位通讯和默认的 流控制, 输入: &prompt.root; stty -f /dev/ttyd5.init clocal cs8 ixon ixoff rc files rc.serial 串口设备的系统级初始化, 是由 /etc/rc.d/serial 来控制的。 这个文件会影响串口设备的默认设置。 为了防止应用程序修改某些设置, 应修改 lock state(锁状态) 设备。 例如, 要把 ttyd5 的速率锁定为 57600 bps, 输入: &prompt.root; stty -f /dev/ttyd5.lock 57600 现在,一个打开ttyd5 和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地, 您需要确定初始状态,然后用root帐户锁定状态设备的写入功能。 很显然,您应该只让 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 系统上来同时完成一些文本界面的工作。 在 &os; 的基本系统中至少有两个能用于进行串口连接的工具: &man.cu.1; 和 &man.tip.1;。 如果要从运行 &os; 的计算机上通过串口连接到另一系统, 可以使用: &prompt.root; cu -l 串口设备 此处 串口设备 表示您计算机上某个串口对应的设备名。 - 在 &os; 6.0 之前的版本中, 这些设备的名字是 - /dev/cuaaN, - 而在 6.0 和更新一些的版本中, 则是 - /dev/cuadN + /dev/cuadN此处的 N 表示串口的编号。 请注意在 &os; 中设备的编号是从零而非一开始的 (这一点与另一些系统, 如基于 &ms-dos; 的系统不同)。 因此, 在基于 &ms-dos; 系统中的 COM1 在 &os; 中通常叫做 /dev/cuad0 其他一些人可能喜欢使用另一些来自 Ports 套件的程序。 Ports 中提供了几个与 &man.cu.1; 和 &man.tip.1; 类似的工具, 例如 comms/minicom 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,那您将需要适当的电缆线。 一个标准的串口线应当足够长以至普通的信号能够连接上: 信号名称 缩写 全名 RD 收到数据 (Received Data) TD 传出数据 (Transmitted Data) DTR 数据终端就绪 (Data Terminal Ready) DSR 数据集就绪 (Data Set Ready) DCD 数据载波检测 (Data Carrier Detect) (RS-232 的收到线路信号检测器) SG 信号地 (Signal Ground) RTS 要求发送数据 (Request to Send) CTS 允许对方发送数据 (Clear to Send)
FreeBSD 对速度超过 2400 bps 的情形需要通过 RTSCTS 信号来完成流控制, 通过 CD 信号来检测呼叫响应和挂机, 并通过 DTR 信号来在会话结束时对调制解调器进行复位。 某些电缆在连接时没有提供全部需要的信号, 这会给您带来问题, 例如在挂断时登录会话不消失, 这就有可能是电缆的问题。 与其它类 &unix; 操作系统类似, FreeBSD 使用硬件信号来检测呼叫响应, 以及在挂断时挂断并复位调制解调器。 FreeBSD 避免发送命令给调制解调器, 或监视其状态。 如果您熟悉通过调制解调器来连接基于 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。 配置文件 如果希望允许拨入您的 FreeBSD 系统, 在 /etc 目录中有三个系统配置文件需要您关注。 其一是 /etc/gettytab, 其中包含用于 /usr/libexec/getty 服务的配置信息。 其二是 /etc/ttys, 它的作用是告诉 /sbin/init 哪些 tty 设备上应该运行 getty。 最后, 关于端口的初始化命令, 应放到 /etc/rc.d/serial 脚本中。 关于在 &unix; 上配置拨入调制解调器有两种主要的流派。 一种是将本地计算机到调制解调器的 RS-232 接口配置为固定速率。 这样做的好处是, 远程用户总能立即见到系统的登录提示符, 而其缺点则是, 系统并不知道用户真实的数据速率是多少, 因而, 类似 Emacs 这样的程序, 也就无法调整它们绘制屏幕的方式, 以便为慢速连接改善响应时间。 另一种流派将调制解调器的 RS-232 接口速率配置为随远程用户的连接速率变化。 例如, 对 V.32bis (14.4 Kbps) 连接, 调制解调器会让自己的 RS-232 接口以 19.2 Kbps 的速率运行, 而 2400 bps 连接, 则会使调制解调器的 RS-232 接口以 2400 bps 的速率运行。 由于 getty 并不能识别具体的调制解调器的连接速率反馈信息, 因此, getty 会以初始速度给出一个 login: 提示, 并检查用户的响应字符。 如果用户看到乱码, 则他们应知道此时应按下 Enter 键, 直到看到可以辨认的提示符为止。 如果数据速率不匹配, 则 getty 会将用户输入的任何信息均视为 乱码, 并尝试以下一种速率来再次给出 login: 提示符。 这一过程可能需要令人作呕地重复下去, 不过一般而言, 用户只要敲一两下键盘就能看到正确的提示符了。 显然, 这种登录过程看起来不如前面所介绍的 锁定速率 方法那样简单明了, 但使用低速连接的用户, 却可以在运行全屏幕程序时得到更好的交互响应。 这一节将尽可能公平地介绍关于配置的信息, 但更着力于介绍调制解调器速率随连接速率变化的配置方法。 <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.d/serial</filename> rc files rc.serial 高速调制解调器, 如使用 V.32、 V.32bis, 以及 V.34 的那些, 需要使用硬件 (RTS/CTS) 流控制。 您可以在 /etc/rc.d/serial 中增加 stty 命令来在 FreeBSD 内核中, 为调制解调器设置硬件流控制标志。 例如, 在 1 号串口 (COM2) 拨入和拨出设备上配置 termios 标志 crtscts, 可以通过在 /etc/rc.d/serial 增加下面的设置来实现: # Serial port initial configuration stty -f /dev/ttyd1.init crtscts stty -f /dev/cuad1.init crtscts Modem 设置 如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中, 您将必须使用一个终端程序来设置参数 (比如 &ms-dos; 下的 Telix 或者 FreeBSD 下的 tip)。 使用同样的通讯速度来连接 modem 作为初始速度 getty 将使用和配置 modem 的非易失性 RAM 来适应这些要求: 连接时宣告 CD 操作时宣告 DTR; DTR 消失时挂断线路并复位调制解调器 CTS 传输数据流控制 禁用 XON/XOFF 流控制 RTS 接收数据流控制 宁静模式 (无返回码) 无命令回显 请阅读您 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到计算机 的传输率。 在一个 &usrobotics; &sportster; 14400 外置 modem 上, 这些命令将锁定 modem 到计算机 的传输率: ATZ AT&B1&W 匹配速度的配置 对于一个变速的配置, 您需要配置 modem 调节它的串口传输率匹配接收的传输率。 在一个 &usrobotics; &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 项。 举例而言, 如果您的调制解调器挂在第一个串口, 即 /dev/cuad0 上, 则应添加下面这行: cuad0:dv=/dev/cuad0:br#19200:pa=none 此处应使用您的 modem 所支持的最高 br bps 速率。 接下来, 输入 tip cuad0 就可以连到 modem 上了。 此外, 也可以 root 身份执行 cu 命令: &prompt.root; cu -lline -sspeed line 是串口 (例如 /dev/cuad0) 而 speed 则是速率 (如 57600)。 当您输入完 AT 之后, 按 ~. 即可退出。 现在pn <literal>@</literal>标记不能工作? 在电话号码中的 @ 标记告诉计算机在 /etc/phones 文件中查找一个电话号码。 但 @ 标记也是一个在像 /etc/remote 这样的可用文件中的特殊字符。 用一个反斜线符号退出: pn=\@ 我如何在命令行拨电话号码? 在您的 /etc/remote 文件中通常放着一个叫做 generic 的记录。 例如: tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuad0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuad0: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/cuad1: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/cuad2:br#38400:at=hayes:du:pa=none:pn=5551234: 将让您键入 tip paintip muffin 连接到主机 painmuffin, 和 tip deep13 连接到终端服务器。 <command>tip</command>能为每个站点试用多个线路吗? 经常有一个问题, 一个大学有几个modem线路, 几千个学生设法使用它们。 /etc/remote 中为您的大学添加一个记录, 然后为 pn 功能使用 @ 标记: big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuad3: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=^^ ^^ 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 和控制终端。 要在串口控制台上显示所有的引导信息, 需要以超级用户的身份执行下面的命令: &prompt.root; echo 'console="comconsole"' >> /boot/loader.conf 编辑 /etc/ttys 并把 ttyd0off 改为 ondialup 改为 vt100。 否则通过串口控制台上将不会提示输入口令, 从而导致潜在的安全漏洞。 重新启动并观察是否生效。 如果需要不同的配置, 更进一步的配置讨论可以在 找到。 串口控制台的设置 准备一根串口线缆。 null-modem cable 您需要使用一个 null-modem 的线缆或标准的串口线和一个 null-modem 适配器。 请参考 中有关串口线的讨论。 拔掉键盘。 绝大多数的PC在开机检测的时候会检测到键盘, 如果没有检测到键盘, 则会出现错误。 一些机器会提示缺少键盘, 就不会继续引导系统。 如果您的计算机出现错误, 但仍能继续启动, 您可以不必理它。 如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS 来避免它。 请参考您的主板的使用说明了解更多细节。 在 BIOS 中将键盘设为 Not installed (未安装)。 现在您仍然无法使用键盘。 这样做只是告诉 BIOS 在启动时不要探测键盘。 您的 BIOS 不应抱怨键盘不存在。 即使这一标志设置为 Not installed 时, 只要把键盘插上, 它就仍可使用。 如果系统有 PS/2 鼠标, 如果幸运的话, 您也可以象键盘一样把它拔下来, 这是因为 PS/2 鼠标与键盘的一些硬件是共享的, 您的鼠标插上去, 系统会认为键盘仍在那儿。 插一个哑 (dumb) 终端到COM1:(sio0)。 如果您没有哑终端, 可以使用一个比较老的带有一个 modem 程序的PC/XT机器, 或在其他 &unix; 机器上的串口。 如果您没有 COM1: (sio0), 去找一个。 这时, 您就不能只能选择 COM1:来启动系统。 如果您已经在另一台设备上使用 COM1, 您必须临时删除那个设备, 然后安装一个新的系统引导块和内核。 确信您的内核配置文件已经为 COM1: (sio0) 设置了适当的标记: 有关的标记是: 0x10 启用控制台支持。 如果没有设置它, 则其他的控制台标记都会被忽略。 现在, 绝大多数的设置都有控制台的支持。 这个标记的第一个就是首选的。 这个单独选项是不能确保串口适用于控制台的, 设置下面的标记或加上下面描述的 选项, 和这个放在一起。 0x20 无论是否使用了下面将要讨论的 选项, 都强制这个单元作为控制台 (除非使用了更高优先级的控制台)。 标志 0x20 必须与 一起使用。 0x40 预留这个单元 (配合 0x10) 并让它不能用于普通的使用。 您不应在希望作为控制台的串口单元上设置这个标志。 这一标志是为内核远程调试准备的。 参见 开发者手册 以了解关于远程调试更进一步的情况。 例如: 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 继续启动进程。 如果您要使用串口控制台, 但您没有看到命令行, 那可能设置有问题。 这时, 输入 然后按 EnterReturn 来告诉引导块 (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了, 就可以回去检查一下是什么出了问题。 启动引导器加载完后, 您将进入启动进程的第三步, 您仍然可以在启动引导器通过设定您喜欢的环境来切换内部控制台和串口控制台。 参考 摘要 这是几个在这章要讨论的几个设置和选择的控制台的摘要。 例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 中的选项 引导块执行时所用的控制台 引导加载器执行时所用的控制台 内核所用的控制台 内部 内部 串口 串口 串口 串口 串口和内部 内部 串口 串口和内部 串口 串口 , 有键盘 内部 内部 串口 , 没有键盘 串口和内部 串口 串口 串口控制台的提示 设置更高的串口速度 在默认配置中, 串口的设置是: 速率 9600 波特、 8 数据位、 无奇偶校验位、 1 停止位。 如果您希望修改默认的控制台速率, 可以采用下列几种方法之一: BOOT_COMCONSOLE_SPEED 配置为希望的速率, 并重新编译引导块。 请参见 以了解如何联编和安装新的引导块。 如果串口控制台已配置为使用 以外的其它方式引导, 或者内核使用的速率与引导块不同, 则必需在内核配置文件中加入下述设置, 并重新联编新内核: options CONSPEED=19200 使用内核引导选项 . 这个命令行选项可以加到 /boot.config 中。 请参见联机手册 &man.boot.8; 以获得如何在 /boot.config 中增加选项, 以及其它的可用选项。 在您的 /boot/loader.conf 文件中启用 comconsole_speed 选项。 使用这个选项时,您还需要在 /boot/loader.conf 中配置 consoleboot_serial, 以及 boot_multicons。 下面是一个利用 comconsole_speed 改变串口控制台速率的例子: boot_multicons="YES" boot_serial="YES" comconsole_speed="115200" console="comconsole,vidconsole" - - - &os; 在 6.1-RELEASE 之前的版本并不支持 - 以及 /boot/loader.conf - 的 comconsole_speed 选项, - 如果您使用的是较早的 &os; 版本, 就只能重新编译引导块了。 - 使用 <devicename>sio0</devicename> 以外的串口 作为控制台 使用串口而不是 sio0 作为控制台需要做一些重编译。 如果您无论如何都要使用另一个串口, 重新编译引导块, 启动引导器和内核。 取得内核源代码 (参考 )。 编辑 /etc/make.conf 文件, 然后设置 BOOT_COMCONSOLE_PORT作为您要使用 (0x3f80x2f8、 0x3E8 或 0x2E8) 端口的地址。 只有 sio0sio3 (COM1COM4) 都可以使用; 但多口串口卡将不会工作。 不需要任何中断设置。 创建一个定制的内核配置文件, 在您要使用的串口添加合适的标记。 例如, 如果要将 sio1 (COM2) 作为控制台: device sio1 at isa? port IO_COM2 flags 0x10 irq 3 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.bsdlabel.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中写入下面这行: + /boot/loader.ronf中写入下面这行: set console="comconsole" 无论前一节中的引导块如何配置, 这个设置都会生效。 - 您最好把上面一行放在文件的第一行, - 以便尽早地在启动时看到串口控制台的启动信息。 + 您最好把上面一行放在 + /boot/loader.conf + 文件的第一行,以便尽早地在启动时看到串口控制台的启动信息。 同样地,您可以指定内部控制台为: 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 + 控制台可以在 + /boot/loader.conf.local 或者是在 + /boot/loader.conf 中指定。 看看 &man.loader.conf.5; 的联机手册了解更多信息。 目前, 引导块尚不提供与引导加载器的 选项等价的选项, 另外, 它也不能根据是否有键盘存在自动决定选择使用内部控制台还是串口控制台。 使用串口而不是<devicename>sio0</devicename>作为控制台 要使用一个串口而不是 sio0 作为串口控制台 需要重新编译启动引导器。下面的步骤跟 描述的相似。 警告 这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。 不幸的是, 绝大多数系统没有键盘可以让您启动, 而没有显示设备就不让您启动。 使用 AMI BIOS 的机器可以通过在 CMOS 中将 graphics adapter 项设为 Not installed 来在启动时不要求显示适配器。 然而, 许多机器并不支持这个选项, 如果您的系统没有显示硬件就拒绝启动。 对于这些机器, 即使您没有显示器, 也必须在机器上插上显示适配器。 建议您试试采用 AMI BIOS 的机器。
diff --git a/zh_CN.GB2312/books/handbook/vinum/chapter.sgml b/zh_CN.GB2312/books/handbook/vinum/chapter.sgml index f569b03a48..a4ca33c091 100644 --- a/zh_CN.GB2312/books/handbook/vinum/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/vinum/chapter.sgml @@ -1,1265 +1,1210 @@ Greg Lehey 原作 Vinum 卷管理程序 概述 无论您有什么样的磁盘,总会有一些潜在问题: 它们可能容量太小。 它们可能速度太慢。 它们可能也太不可靠。 针对这些问题, 人们提出并实现了许多不同的解决方案。 为了应对这些问题, 一些用户采用了多个, 有时甚至是冗余的磁盘这类方法。 除了支持许多种不同的硬件 RAID 控制器之外, FreeBSD 的基本系统中包括了 Vinum 卷管理器, 它是一个用以实现虚拟磁盘驱动器的块设备。 Vinum 是一种称为 卷管理器, 或者说用于解决前面这三种问题的虚拟磁盘驱动程序。 Vinum 能够提供比传统磁盘系统更好的灵活性、 性能和可靠性, 并实现了能够单独或配合使用 RAID-0、 RAID-1 和 RAID-5 模型。 这一章对传统磁盘存储的潜在问题进行了简要说明,并介绍了 Vinum 卷管理器。 从 FreeBSD 5 开始, 对 Vinum 进行了重写, 以便使其符合 GEOM 架构 (), 同时保留其原有的设计创意、 术语, 以及保存在磁盘上的元数据格式。 这一重写的版本称为 gvinum (表示 GEOM vinum)。 接下来的文字中 Vinum 是一个抽象的名字, 通常并不具体指某一特定的实现。 新版本中所有的指令都应通过 gvinum 命令来操作, 而对应的内核模块的名字, 也由 vinum.ko 改为了 geom_vinum.ko, 而在 /dev/vinum 中的所有设备节点, 也改为放到了 /dev/gvinum。 从 FreeBSD 6 开始, 旧版的 Vinum 实现已不再提供。 磁盘容量太小 Vinum RAID software 磁盘越大,存储的数据也就越多。您经常会发现您需要 一个比您可使用的磁盘大得多的文件系统。 无可否认,这个问题 已经没有十年前那样严峻了,但它仍然存在。通过创建一个在许多 磁盘上存储数据的抽象设备,一些系统可以解决这个问题。 访问瓶颈 现代系统经常需要用一个高度并发的方式来访问数据。 例如,巨大的FTP 或HTTP 服务器可以支持数以千计的并发会话, 可以有多个连到外部世界的100 Mbit/s , 这远远地超过了绝大多数磁盘的数据传输速率。 当前的磁盘驱动器最高可以以70 MB/s的速度传输数据, 但这个值在一个有许多不受约束的进程访问一个驱动器的环境中变得并不重要, 它们可能只完成了这些值的一小部分。这样一种情况下,从磁盘子 系统的角度来看问题就更加有趣:重要的参数是在子系统上的负 荷,换句话说是传输占用了驱动器多少时间。 在任何磁盘传输中, 驱动器必须先寻道, 等待磁头访问第一个扇区, 然后执行传输. 这些动作看起来可能很细小: 我们不会感有任何中断。 假设传输10 kB数据, : 现在的高性能磁盘平均寻道时间是3.5ms。 最快的驱动器可以旋转在15,000 rpm,, 所以平均寻址时间为2ms. 在70 MB/s的速度传输时, 数据的传输时间大约150 μs, 几乎无法和寻址时间相比. 在这样一种情况下, 高效的传输也会降低到 1 MB/s 显然传输的快慢依赖与所传输数据的大小。 对于这个瓶颈的一般和明显的解决方法是采用 多个磁盘:而不是只使用一个大磁盘, 它使用几个比较小的磁盘联合起来形成一个大的磁盘. 每个磁盘都可以独立地进行传输数据,所以通过使用多个磁盘 大大提高了数据吞吐量。 当然,所要求的吞吐量的提高要比磁盘的数量小得多。 尽管每个驱动器并行传输数据,但没有办法确保请求能够平均 分配到每个驱动器上。不可避免一个驱动器的负载可能比另一个要高得多。 磁盘的串连 Vinum 串连 磁盘的负载平衡很大程度依赖于驱动器上数据的共享方式. 在下面的讨论中, 将磁盘存储想象成一个巨大的数据扇区,像一本书的页 那样用编号来设定地址. 最明显的方法是把虚拟磁盘分成许多连续的扇区组, 每个扇区大小就是独立的磁盘大小,用这种方法来存储数据, 就像把一本厚厚的书分成很多小的章节。 这个方法叫做 串联 它有一个优点就是磁盘不需要有任何特定的大小关系。 当访问到的虚拟磁盘根据它的地址空间来分布的时候, 它能工作得很好。 当访问集中在一个比较小的区域的时候,性能的提高没有显著的改进。 举例说明了用串联组织的方式来分配存储单元的顺序。
串联组织
条带盘 Vinum 条带 RAID 另外一种影射方法是把地址空间分布在比较小的容量相同的磁盘上, 从而能够在不同的设备上存储它们。例如,前256 个扇区可能存储在第一 个磁盘上,接着的256 个扇区存储在另一个磁盘上等等。 写满最后一个磁 盘后,进程会重复以前的工作,直到所有的磁盘被写满。这个影射叫做 分段(striping) 或者 RAID-0 RAID 代表廉价冗余磁盘阵列 (Redundant Array of Inexpensive Disks) 提供各种容错机制, 但后面这个术语可能会有些让人误解:它不提供冗余功能。 . 分段要求很精确地寻址,通过多个磁盘进行数据传输的时候,它 可能会引起额外的I/O 负载,但它也可能提供更多的连续负载。 显示了用分段形式分配的存储单元的顺序。
分段组织
数据的完整性 现时磁盘的最后一个问题是它们不太可靠。 虽然磁盘驱动器的可靠性在过去几年有了很大的提高, 但它们仍然是服务器中最容易损坏的核心组件。 当它们发生故障的时候, 结果可能是灾难性的: 替换坏的磁盘驱动器并恢复数据可能要花费几天时间。 磁盘镜像 Vinum 镜像 RAID-1 解决这个问题的传统方法是建立 镜象, 在不同的物理硬件上对数据做两个副本。 根据 RAID 级别出现的时间顺序, 这个技术也被叫做 RAID 级别1 或者 RAID-1。 任何写到卷的数据也会被写到镜象上, 所以可以从任何一个副本读取数据, 如果其中有一个出现故障, 数据也还可以从其他驱动器上访问到。 镜象有两个问题: 价格. 它需要两倍的存储容量。 性能影响。 写入操作必须在两个驱动器上执行,所以它们 花费两倍的带宽。读取数据并不会影响性能: 它们甚至看起来会更快。 RAID-5 一个可选的方案采用 奇偶校验 的方式, 用以实现 RAID 2、 3、 4 和 5。 这其中, RAID-5 是我们最感兴趣的。 在 Vinum 的实现中, 这是一个条带组织结构的变体, 其中, 每一个条带中都以一个专用的块, 来保存其它块的奇偶校验值。 这样, RAID-5 plex 除了在每个块中都包含了一个奇偶校验块之外, 实现 RAID-5 时也就和普通的条带 plex 一样了。 作为 RAID-5 的一项要求, 奇偶校验块在每一个条带中的顺序都是不同的。 数据块的编号, 决定了它的相对块号。
RAID-5 的组织
与镜像相比, RAID-5 最显著的优势在于只需使用少得多的存储空间。 读取类似于条带式存储的组织, 但写入会慢得多, 大约仅相当于读性能的 25%。 如果一个驱动器失效, 则阵列仍然可以在降级的模式运行: 读取来自正常的驱动器数据的操作照常进行, 但读取失效的驱动器的数据, 则来自于余下驱动器上相关的计算结果。
Vinum 目标 为了解决这些问题,Vinum 提出了一个四层的目标结构: 最显著的目标是虚拟磁盘, 叫做 卷(volume). 卷本质上与一个UNIX 磁盘 驱动器有同样的属性,虽然它们是有些不太一样。它们没有大小的限制。 卷下面是 plexes, 每一个表示卷的所有地址空间。在层次结构中的这个水平能够提供 冗余功能。可以把plex 想象成用一个镜象排列的方式组织起来的 独立磁盘,每个都包含同样的数据。 由于Vinum 存在于UNIX 磁盘存储框架中,所以它也可能 使用UNIX 分区作为多个磁盘plex 的组成部分, 但事实上这并不可靠:UNIX 磁盘只能有有限数量的分区。 取而代之,Vinum 把一个简单的UNIX 分区 (the drive) 分解成叫做subdisks的相邻区域, 它可以使用这个 来为plex 建立块。 Subdisks 位于 Vinum 驱动器上, 当前的UNIX 分区。Vinum 驱动器可以包含很多的subdisks。 除了驱动器开始的一小块区域用来存储配置和描述信息以外,整个 驱动器都可以用于存储数据。 下面的章节描述了这些目标提供了Vinum 所要求的功能的方法。 卷的大小要求 在Vinum的配置中,Plex可以把多个subdisk 分布在所有的驱动上。 结果, 每个独立的驱动器的大小都不会限制plex 的大小,从而不会限制卷的大小 多余的数据存储 Vinum 通过给一个卷连上多个plex 来完成镜象的功能。 每个plex 是一个在一个卷中的数据的描述。一个卷可以包含一个 到八个plex。 虽然一个plex 描述了一个卷的所有数据,, 但可能描述的部分被物理地丢失了。可能是设计的问题 (没有为plex 部分定义一个subdisk)也可能是意外的故障 (由于驱动器的故障导致)。只要至少有一个plex 能够为 卷的完全地址范围提供数据,卷就能够正常工作。 性能问题 Vinum 在plex 水平既执行串联也执行分段: 一个串连的plex轮流使用 每个subdisk 的地址空间。 一个 分段的plex 在每个subdisk 上 划分数据. Subdisk 必须是大小一样的,为了从一个连接的plex 中 区分开它,必须至少有两个subdisk。 哪种plex 组织更有效? FreeBSD &rel.current提供的Vinum 版本能实现两种plex: 串联的plex 更加灵活:它们可以包含任何数量的subdisk, subdisk 也可能有不同的长度。Plex 可以通过添加额外的subdisk 来得到扩展。 与分段 plex 不同, 它们需要的 CPU 时钟更少, 尽管 CPU 上的负载差异是不可测量的。 另一方面,它们的负载可能不平衡,一个磁盘可能负载很重, 而其他的可能很空闲。 分段(RAID-0) plexes 的最大优点是 它们减少了负载不平衡的情况: 通过选择一个最合适大小的分段 (大约是256 kB), 您甚至可以在各个组成的驱动器上降低负载 . 这种方法的缺点是在subdisk 上受到非常复杂的编码限制 : 它们必须是同样大小, 通过添加新的subdisk 来扩展一个plex 是非常复杂的,以至Vinum 当前没有实现它. Vinum 利用一个额外 的,代价不高的限制:一个分段的plex 必须有至少两个subdisk, 否则, 它就无法区分连接的 plex 了。 总结一下每个plex 组织 的优点和缺点. Vinum Plex组织图 Plex 类型 最少subdisks 可否添加subdisks 尺寸相同 应用 串联 1 可以 不必须 带有很大弹性和适中性能的大数据量存储。 分段 2 不可以 必须 大量并发访问时,具有较高性能。
一些例子 Vinum 维护着一个描述本系统中对象的 配置数据库。 开始时, 用户可以在 &man.gvinum.8; 工具来从若干配置文件生成配置数据库。 Vinum 在其控制的每个磁盘分区 (在 Vinum 中称为 device) 上都保存配置数据库的副本。 这一数据库在每次状态变化时均会更新, 因而重启每个 Vinum 对象时, 都能够恢复其状态。 配置文件 配置文件描述了独立的 Vinum.一个简单卷的定义可能是这样的: drive a device /dev/da3h volume myvol plex org concat sd length 512m drive a 这个文件描述了四个Vinum 目标: drive 行描述了一个磁盘分区(驱动器) 和与下面的硬件相关的它的位置。它给出了一个符号名 a. 这个与设备名称分开的符号名允许 磁盘从一个位置移动到另一个位置而不会搞混。 volume 行描述了一个卷。 唯一的必须属性是名称,在这个例子中是 myvol. plex 行定义了一个plex。 唯一需要的参数是组织,在这个例子中是 concat. 没有名称是必然的: 系统自动通过添加suffix .px 来从卷名称产生一个名字,这里的x 是在卷中的plex 的编号。而这个plex 将被 叫做myvol.p0 sd 行描述了一个subdisk。 最小的说明是存储subdisk 的驱动器名称,和subdisk 的长度。 对于plex,没有名称也是必然的:系统自动通过添加 suffix .sx 来分配源自plex 的名称,这里 x是plex 中subdisk 的编号。 Vinum 给这个subdisk 命名为myvol.p0.s0 处理完这个文件后, &man.gvinum.8; 会产生下面的输出: &prompt.root; gvinum -> create config1 Configuration summary Drives: 1 (4 configured) Volumes: 1 (4 configured) Plexes: 1 (8 configured) Subdisks: 1 (16 configured) D a State: up Device /dev/da3h Avail: 2061/2573 MB (80%) V myvol State: up Plexes: 1 Size: 512 MB P myvol.p0 C State: up Subdisks: 1 Size: 512 MB S myvol.p0.s0 State: up PO: 0 B Size: 512 MB 这些输出内容展示了 &man.gvinum.8; 的简要列表格式。 在 中用图形展示了这个配置。
一个简单的Vinum 卷
下面这个图显示了一个由按顺序排列的subdisk 组成的plex。 在这个小小的例子中,卷包含一个plex,plex 包含一个subdisk。 这个卷本身和普通的磁盘分区相比并没有什么特别的优越性, 它包含了一个 plex, 因此不是冗余的。 这个 plex 中包括了一个子磁盘, 因此这和从磁盘分区分配存储没什么两样。 接下来的几节, 将介绍一些更有用的配置方法。
提高容错性: 镜像 卷的容错性可以通过镜像来提高。 在配置镜像卷时, 确保 plex 分布在不同的驱动器上十分重要, 这样一个驱动器坏掉时, 就不会同时影响两个 plex。 下面的配置将映射卷: drive b device /dev/da4h volume mirror plex org concat sd length 512m drive a plex org concat sd length 512m drive b 上面的例子中, 并不需要再次指定驱动器 a, 因为 Vinum 监控所有其配置数据库的对象。 完成定义之后, 配置如下所示: Drives: 2 (4 configured) Volumes: 2 (4 configured) Plexes: 3 (8 configured) Subdisks: 3 (16 configured) D a State: up Device /dev/da3h Avail: 1549/2573 MB (60%) D b State: up Device /dev/da4h Avail: 2061/2573 MB (80%) V myvol State: up Plexes: 1 Size: 512 MB V mirror State: up Plexes: 2 Size: 512 MB P myvol.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB S myvol.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB 以图形方式展示了其结构。
镜像 Vinum 卷
这个例子中, 每一个 plex 包含了完整的 512 MB 地址空间。 在前面的例子中, plex 则只包括一个子盘。
优化性能 前面例子中的镜像卷要比没有镜像的卷具有更好的容灾能力, 但它的性能要差一些: 每一次写入卷时, 需要同时写到两个驱动器上, 因而也就需要更大的磁盘访问带宽。 如果希望非常好的性能, 则需要另外一种方式: 不做镜像, 而将数据分成条带放到尽可能多的、不同的磁盘上。 下面给出了一个跨越四个磁盘驱动器的 plex 卷: drive c device /dev/da5h drive d device /dev/da6h volume stripe plex org striped 512k sd length 128m drive a sd length 128m drive b sd length 128m drive c sd length 128m drive d 和之前类似, 并不需要定义 Vinum 已经知道的驱动器。 在完成定义之后, 将得到如下配置: Drives: 4 (4 configured) Volumes: 3 (4 configured) Plexes: 4 (8 configured) Subdisks: 7 (16 configured) D a State: up Device /dev/da3h Avail: 1421/2573 MB (55%) D b State: up Device /dev/da4h Avail: 1933/2573 MB (75%) D c State: up Device /dev/da5h Avail: 2445/2573 MB (95%) D d State: up Device /dev/da6h Avail: 2445/2573 MB (95%) V myvol State: up Plexes: 1 Size: 512 MB V mirror State: up Plexes: 2 Size: 512 MB V striped State: up Plexes: 1 Size: 512 MB P myvol.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p0 C State: up Subdisks: 1 Size: 512 MB P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB P striped.p1 State: up Subdisks: 1 Size: 512 MB S myvol.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p0.s0 State: up PO: 0 B Size: 512 MB S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB S striped.p0.s0 State: up PO: 0 B Size: 128 MB S striped.p0.s1 State: up PO: 512 kB Size: 128 MB S striped.p0.s2 State: up PO: 1024 kB Size: 128 MB S striped.p0.s3 State: up PO: 1536 kB Size: 128 MB
条带化的 Vinum 卷
这个卷在 中给出。 条带的阴影部分, 表示在 plex 地址空间中的位置: 颜色最浅的在最前面, 而最深的在最后。
高性能容在 如果硬件足够多, 也能够构建比标准 &unix; 分区同时提高了容灾性和性能的卷。 典型的配置文件类似: volume raid10 plex org striped 512k sd length 102480k drive a sd length 102480k drive b sd length 102480k drive c sd length 102480k drive d sd length 102480k drive e plex org striped 512k sd length 102480k drive c sd length 102480k drive d sd length 102480k drive e sd length 102480k drive a sd length 102480k drive b 第二个 plex 中的子盘和第一个 plex 中的错开了两个驱动器: 这能够帮助确保即使同时访问两个驱动器, 写操作也不会同时发生在同一个盘上。 给出了该卷的结构。
镜像并条带化的 Vinum 卷
对象命名 如前面所描述的那样, Vinum 会给 plex 和子盘指定默认的名字, 而这些名字也是可以定制的。 不推荐修改默认的名字: 使用允许给对象任意命名的 VERITAS 卷管理器的经验证明, 这一灵活性并没有带来太多的好处, 相反, 它很容易导致对象的混淆。 名字中可以包括任何非空白的字符, 但一般来说, 建议只使用字母、 数字和下划线。 卷、 plex, 以及子盘的名字, 可以包含最多 64 个字符, 而驱动器的名字, 则最长可以使用 32 个字符。 Vinum 对象会在 /dev/gvinum 之下生成设备节点。 前述的配置将使 Vinum 创建以下设备节点: 这些内容仅适用于旧式的 Vinum 实现。 控制设备 /dev/vinum/control/dev/vinum/controld, 分别由 &man.gvinum.8; 和 Vinum 服务使用。 每个卷对应的设备项。 这些是 Vinum 使用的主要设备。 因此, 前述配置包括下列设备: /dev/gvinum/myvol/dev/gvinum/mirror/dev/gvinum/striped/dev/gvinum/raid5 以及 /dev/gvinum/raid10 这些内容仅适用于旧式的 Vinum 实现。 一个包含每个驱动器对应设备的 /dev/vinum/drive 目录。 这些项事实上是指向对应磁盘节点的符号连接。 所有卷的直接项都存放在 /dev/gvinum/ 中。 目录 /dev/gvinum/plex, 以及 /dev/gvinum/sd 中相应地存放了每个 plex 以及子盘的设备节点。 例如, 考虑下面的配置文件: drive drive1 device /dev/sd1h drive drive2 device /dev/sd2h drive drive3 device /dev/sd3h drive drive4 device /dev/sd4h volume s64 setupstate plex org striped 64k sd length 100m drive drive1 sd length 100m drive drive2 sd length 100m drive drive3 sd length 100m drive drive4 处理这个文件之后, &man.gvinum.8; 将在 /dev/gvinum 中建立下面的结构: drwxr-xr-x 2 root wheel 512 Apr 13 16:46 plex crwxr-xr-- 1 root wheel 91, 2 Apr 13 16:46 s64 drwxr-xr-x 2 root wheel 512 Apr 13 16:46 sd /dev/vinum/plex: total 0 crwxr-xr-- 1 root wheel 25, 0x10000002 Apr 13 16:46 s64.p0 /dev/vinum/sd: total 0 crwxr-xr-- 1 root wheel 91, 0x20000002 Apr 13 16:46 s64.p0.s0 crwxr-xr-- 1 root wheel 91, 0x20100002 Apr 13 16:46 s64.p0.s1 crwxr-xr-- 1 root wheel 91, 0x20200002 Apr 13 16:46 s64.p0.s2 crwxr-xr-- 1 root wheel 91, 0x20300002 Apr 13 16:46 s64.p0.s3 虽然 plex 和子盘一般并不推荐指定名字, 但还是必须给 Vinum 驱动器命名。 这样, 当把驱动器转移到不同的地方时, 它仍然能够被自动地识别出来。 驱动器名最长可以包含 32 个字符。 创建文件系统 对于系统而言, 卷和磁盘是一样的。 唯一的例外是, 与 &unix; 驱动器不同, Vinum 并不对卷进行分区, 因而它也就不包含分区表。 这要求修改某些磁盘工具, 特别是 &man.newfs.8;, 它会试图将 Vinum 卷名当作分区标识。 例如, 磁盘驱动器的名字可能是 /dev/ad0a/dev/da2h。 这些名字分别表达在第一个 (0) IDE (ad) 磁盘上的第一个分区 (a), 以及第三个 (2) SCSI 磁盘 (da) 上的第八个分区 (h)。 而相比而言, Vinum 卷可能叫做 /dev/gvinum/concat, 这个名字和分区名没有什么关系。 一般而言, &man.newfs.8; 会试图解释磁盘的名字, 如果它无法理解这个名字, 则会给出错误提示。 例如: &prompt.root; newfs /dev/gvinum/concat newfs: /dev/gvinum/concat: can't figure out file system partition 要在这个卷上创建文件系统, 则需要使用 &man.newfs.8;: &prompt.root; newfs /dev/gvinum/concat 对于 &os; 5.0 之前的版本, &man.newfs.8; 还需要指定一个 -v 参数, 而且其设备命名方式也是旧式的: &prompt.root; newfs -v /dev/vinum/concat 配置 Vinum GENERIC 内核中, 并不包含 Vinum。 可以编译一个定制的包含 Vinum 的内核, 然而并不推荐这样做。 启动 Vinum 的标准方法, 是使用内核模块 (kld)。 甚至不需要使用 &man.kldload.8; 来启动 Vinum: 在启动 &man.gvinum.8; 时, 它会检查这一模块是否已经加载, 如果没有, 则会自动地加载它。 启动 Vinum 将配置信息, 采用与配置文件一样的形式来存放到磁盘分区上。 当从配置数据库中读取时, Vinum 会识别一系列在配置文件中不可用的关键字。 例如, 磁盘配置文件可能包含下面的文字: volume myvol state up volume bigraid state down plex name myvol.p0 state up org concat vol myvol plex name myvol.p1 state up org concat vol myvol plex name myvol.p2 state init org striped 512b vol myvol plex name bigraid.p0 state initializing org raid5 512b vol bigraid sd name myvol.p0.s0 drive a plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 0b sd name myvol.p0.s1 drive b plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 1048576b sd name myvol.p1.s0 drive c plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 0b sd name myvol.p1.s1 drive d plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 1048576b sd name myvol.p2.s0 drive a plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 0b sd name myvol.p2.s1 drive b plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 524288b sd name myvol.p2.s2 drive c plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1048576b sd name myvol.p2.s3 drive d plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1572864b sd name bigraid.p0.s0 drive a plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 0b sd name bigraid.p0.s1 drive b plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 4194304b sd name bigraid.p0.s2 drive c plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 8388608b sd name bigraid.p0.s3 drive d plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 12582912b sd name bigraid.p0.s4 drive e plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 16777216b 这里最明显的区别是, 指定了配置的位置信息、名称 (这些在配置文件中还是可用的, 但不鼓励用户自行指定) 以及状态信息 (这是用户不能指定的)。 Vinum 并不在配置信息中保存关于驱动器的信息: 它会扫描已经配置的磁盘驱动器上包含 Vinum 标识的分区。 这使得 Vinum 能够在 &unix; 驱动器被指定了不同的 ID 时也能够正确识别它们。 自动启动 这些内容仅适用于旧式的 Vinum 实现。 在 Gvinum 内核模块加载时, 总会执行自动启动操作。 要在引导系统时自动启动 Vinum, 需要在 /etc/rc.conf 中加入下面的配置: start_vinum="YES" # set to YES to start vinum 如果您的系统中没有 /etc/rc.conf, 创建一个并加入这些设置就可以了。 这样, 系统就会在启动时自动加载 Vinum 的 kld, 并启动配置中所提到的所有对象。 这是在挂接文件系统之前进行的, 因此, &man.fsck.8; 和挂接文件系统都能够自动地在 Vinum 卷上进行。 当使用 vinum start 命令来启动 Vinum 时, Vinum 会从某一个 Vinum 驱动器中读取配置数据库。 正常情况下, 每个驱动器上都包含了同样的配置数据库副本, 因此从哪个驱动器上读取是无所谓的。 但是, 在系统崩溃之后, Vinum 就必须检测哪一个驱动器上的配置数据库是最新的, 并从上面读取配置。 如果需要, 它会更新其它驱动器上的配置。 使用 Vinum 作为根文件系统 如果文件系统使用完全镜像的 Vinum 配置, 有时也会希望根文件系统也作了镜像。 这种配置要比镜像其它文件系统麻烦一些, 因为: 根文件系统在引导过程中很早的时候就必须处于可用状态, 因此 Vinum 的基础设施在这一时刻就应该可用了。 包含根文件系统的卷, 同时也保存了系统的引导程序和内核, 因此它们必须能够被宿主系统的内建工具 (例如 PC 机的 BIOS) 识别, 而通常是没办法让它们了解 Vinum 的细节的。 下面几节中, 术语 根卷 标识包含根文件系统的 Vinum 卷。 把这个卷命名为 "root" 可能是个不错的主意, 不过从技术上说, 并不严格地要求这样做。 不过, 接下来的命令例子都使用这个名字。 及早启动 Vinum 以适应对根文件系统的要求 有许多关于它的尺度: Vinum 必须在启动时可以被内核使用。 因此, 在 中所介绍的方法, 也就无法适应这一任务的需要了。 在接下来的配置中, 也 不能 设置 start_vinum 参数。 第一种方法是通过将 Vinum 静态联编到内核中来实现, 这样, 它就在任何时候都可用了, 虽然一般并不需要这样。 另一种方法是通过 /boot/loader () 来尽早加载 vinum 内核模块, 这一操作发生在内核加载之前。 这可以通过将下面的配置: geom_vinum_load="YES" 加入到 /boot/loader.conf 文件中来实现。 Gvinum 而言, 所有的启动过程都是在内核模块加载时自动进行的, 因此上面的操作, 也就是所要进行的全部工作了。 下面的文字介绍的是旧式的 Vinum 系统, 保留它们的主要是为了方便那些使用旧版系统的用户。 Vinum 必须尽早初始化, 因为需要由它来提供根文件系统的卷。 默认情况下, Vinum 的内核部分并不主动地查找可能包含 Vinum 卷信息的驱动器, 而会等待管理员 (或者某个启动脚本) 来执行 vinum start 命令。 - 下面介绍的是 FreeBSD 5.X 和更高版本所需的配置。 对于 - FreeBSD 4.X 的配置方法与此不同, 在 中有所描述。 + 下面介绍的是 FreeBSD 所需的配置。 通过将下面的配置: vinum.autostart="YES" 加入 /boot/loader.conf, Vinum 将在内核部分初始化的过程中, 自动地扫描所有的驱动器以查找 Vinum 信息。 需要说明的是, 并不需要指定内核到什么地方去找根文件系统。 /boot/loader 会在 /etc/fstab 中查找根文件系统的设备名, 并将这一信息转交给内核。 当需要挂接根文件系统时, 内核会根据设备名来知道它由哪个驱动提供, 并将其转译为内部设备 ID (major/minor 编号)。 让基于 Vinum 的卷在引导时可以访问 因为目前的 FreeBSD 引导程序只有 7.5 KB 的代码, 并且已经承担了从 UFS 文件系统中读取文件 (例如 /boot/loader) 的重任, 因此完全没有办法再让它去分析 Vinum 配置数据中的 Vinum 结构, 并找到引导卷本身的信息。 因此, 需要一些技巧来为引导代码提供标准的 "a" 分区, 而它则包含了根文件系统。 要让这些得以实现, 根卷需要满足下面的条件: 根卷不能是条带卷或 RAID-5 卷。 根卷 plex 不能包含连接的子盘。 需要说明的是, 使用多个 plex, 每个 plex 都复制一份根文件系统的副本, 是需要而且是可行的。 然而, 引导过程只能使用这些副本中的一个来引导系统, 直到内核最终自行挂接根文件系统为止。 这些 plex 中的每个子盘, 在这之后会有它们自己的 "a" 分区, 以表达每一个可以引导的设备。 每一个 "a" 分区, 尽管并不需要和其它包含根卷的 plex 处于各自驱动器的同一位置。 但是, 这样创建 Vinum 卷使得镜像卷相互对称, 从而能够避免了混淆。 为了创建每一个根卷的 "a" 分区, 需要完成下面的操作: 使用下面的命令来了解根卷成员子盘的位置 (从设备开始的偏移量) 和尺寸: &prompt.root; gvinum l -rv root 需要注意的是, Vinum 偏移量和尺寸的单位是字节。 它们必须是 512 的整数倍, 才能得到 bsdlabel 命令所需的块号。 在每一个根卷成员设备上, 执行命令: &prompt.root; bsdlabel -e devname 这其中, 对于没有 slice (也就是 fdisk) 表的磁盘, devname 必须是磁盘的名字 (例如 da0), 或者是 slice 的名字 (例如 ad0s1)。 如果设备上已经有了 "a" 分区 (比如说, 包含 Vinum 之前的根文件系统), 则应改为其它的名字, 以便继续访问 (如果需要的话), 但它并不会继续用于启动系统。 注意, 活动的分区 (类似正挂接的根文件系统) 不能被改名, 因此, 要完成这项工作, 必须从 Fixit 盘启动, 或者分两步操作, 并 (在镜像情形中) 首先操作那些非引导盘。 然后, 设备上 Vinum 分区的偏移 (如果有的话) 必须加到这个设备上根卷对应的子盘上。 其结果值, 将成为新的 "a" 分区的 "offset" 值。 这个分区的 "size" 值, 可以根据前面的配置计算得出。 "fstype" 应该是 4.2BSD"fsize""bsize", 以及 "cpg" 值, 则应与文件系统的实际情况匹配, 尽管在配置 Vinum 时并不重要。 这样, 新的 "a" 分区, 将创建并覆盖这一设备上的 Vinum 分区的范围。 注意, bsdlabel 只有在 Vinum 分区的 fstype 被标记为 "vinum" 时, 才允许这样做。 这就成了! 所有的 "a" 分区现在都已存在, 而且是根卷的一份副本。 强烈建议您再次验证其结果, 方法是: &prompt.root; fsck -n /dev/devnamea 务必注意, 所有包含控制信息的文件, 都必须放到 Vinum 卷上的根文件系统。 在启动新的 Vinum 根卷时, 它们可能和实际在用的根文件系统不匹配。 因此, /etc/fstab/boot/loader.conf 这两个文件需要特别地注意。 在下次重启时, 引导程序需要从新的基于 Vinum 的根文件系统中获取适当的控制信息, 并据此工作。 在内核初始化过程的结尾部分, 在所有的设备都被宣示之后, 如果显示了下面的信息, 则表示配置成功: Mounting root from ufs:/dev/gvinum/root 基于 Vinum 的根文件系统的配置范例 在 Vinum 根卷配置好之后, gvinum l -rv root 的输出可能类似下面的样子: ... Subdisk root.p0.s0: Size: 125829120 bytes (120 MB) State: up Plex root.p0 at offset 0 (0 B) Drive disk0 (/dev/da0h) at offset 135680 (132 kB) Subdisk root.p1.s0: Size: 125829120 bytes (120 MB) State: up Plex root.p1 at offset 0 (0 B) Drive disk1 (/dev/da1h) at offset 135680 (132 kB) 需要注意的值是 135680, 也就是偏移量 (相对于 /dev/da0h 分区)。 这相当于 bsdlabel 记法中的 265 个 512-字节的磁盘块。 类似地, 根卷的尺寸是 245760 个 512-字节的磁盘块。 /dev/da1h 中, 包含了根卷的第二个副本, 采用了同样的配置。 这些设备的 bsdlabel 类似下面的样子: ... 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 245760 281 4.2BSD 2048 16384 0 # (Cyl. 0*- 15*) c: 71771688 0 unused 0 0 # (Cyl. 0 - 4467*) h: 71771672 16 vinum # (Cyl. 0*- 4467*) 可以看到, 伪装的 "a" 分区的 "size" 参数和前面的一样, 而 "offset" 参数则是 Vinum 分区 "h", 以及设备中这一分区 (或 slice) 的偏移量之和。 这是一种典型的配置, 它能够避免在 中介绍的问题。 此外, 我们也看到整个 "a" 分区完全处于设备上包含了 Vinum 数据的 "h" 分区之中。 注意, 在上面的配置中, 整个设备都是 Vinum 专用的, 而且没有留下 Vinum 之前的根分区, 因为它永久性地成为了新建的 Vinum 配置中的一个子盘。 故障排除 如果遇到了问题, 则需要从中恢复的办法。 下面列出了一些常见的缺陷, 及其解决方法。 系统的引导程序加载了, 但无法启动 如果由于某种原因系统不再继续启动, 引导程序可以在 10-秒 倒计时的时候, 按 space 键来停止。 加载器变量 (例如 vinum.autostart) 可以通过使用 show 命令来查看, 并使用 setunset 命令来设置。 如果遇到的问题是由于 Vinum 的内核模块没有列入预加载的列表, 而没有正确加载, 则简单使用 load geom_vinum 会有所帮助。 此后, 可以使用 boot -as 来继续启动过程。 选项 会要求内核询问所挂接的根文件系统 (), 并使引导过程在单用户模式停止 (), 此时根文件系统是以只读方式挂接的。 这样, 即使只挂接了多 plex 卷中的一个 plex, 也不会引致 plex 之间数据不一致的问题。 当提示输入要挂接的根文件系统时, 可以输入任何一个包含根文件系统的设备。 如果正确地配置了 /etc/fstab, 则默认的应该是类似 ufs:/dev/gvinum/root。 一般可以使用类似 ufs:da0d 这样的设备来代替它, 因为它通常包括了 Vinum 之前的根文件系统。 需要注意的是, 如果在这里输入了 "a" 分区, 则它可能表达的实际上是 Vinum 根设备的一个子盘, 而在镜像式配置中, 这只会挂接镜像的根设备中的一个。 如果之后将这个文件系统以读写方式挂接, 则需要从 Vinum 根卷中删去其他的 plex, 否则这些卷中可能会包含不一致的数据。 只加载了主引导程序 如果 /boot/loader 加载失败, 而主引导程序加载正常 (在启动时, 屏幕最左边一列有一个旋转的线), 则可以尝试在此时中断主引导程序的过程, 方法是按 space 键。 这将在引导的第二阶段暂停, 具体可以参见 。 此时, 可以尝试从另一个分区, 例如原先包含根文件系统, 并不再叫作 "a" 的那个分区, 启动。 无法启动, 引导程序发生 panic 这种情况一般是由于 Vinum 安装过程中破坏了引导程序造成的。 不幸的是, Vinum 目前只在分区开始的地方保留了 4 KB 的空间, 之后就开始写 Vinum 头信息了。 然而, 目前第一阶段和第二阶段的引导程序, 加上 bsdlabel 嵌入的内容则需要 8 KB。 因此, 如果 Vinum 分区从偏移量 0 开始, 而这个 slice 或磁盘能够启动, 则 Vinum 的安装将毁掉引导程序。 类似地, 如果从上述情形中恢复, 例如, 从 Fixit 盘启动, 并通过 bsdlabel -B 按照 中介绍的方法来恢复引导程序, 则引导程序会覆盖掉 Vinum 头, 这样 Vinum 也就找不到它的磁盘了。 尽管这并不会真的毁掉 Vinum 的配置数据, 或者 Vinum 卷上的数据, 并且可以通过输入一模一样的 Vinum 配置数据来恢复, 但从这种状况中完全恢复是非常困难的。 要真正解决问题, 必须将整个 Vinum 分区向后移动至少 4 KB, 以便使 Vinum 头和系统的引导程序不再冲突。 - - - 与 FreeBSD 4.X 的区别 - - 在 FreeBSD 4.X 中, 由于缺少那些让 Vinum - 自动扫描所有磁盘所需的内部函数, 而检测根设备的内部 ID - 的代码不够智能, 以至于无法自动处理类似 - /dev/vinum/root 这样的名字。 - 因此, 会有一些小差异。 - - 必须明确地告诉 Vinum 要扫描哪些磁盘, 方法是在 - /boot/loader.conf 中加入: - - vinum.drives="/dev/da0 /dev/da1" - - 所有可能包含 Vinum 数据的盘在这里都应提及。 基本原则是, - 宁多毋缺。 此外, 也无需明确指定 slice - 或分区, 因为 - Vinum 在指定的驱动器上的所有 slice 和分区上扫描 Vinum 头。 - - 由于用以分析根文件系统名字, 并产生设备 ID - (major/minor 编号) 的程序, 只能够处理 传统的 - 类似 /dev/ad0s1a 这样的设备名, - 因此它们不可能处理类似 - /dev/vinum/root 这样的根卷名。 因此, - Vinum 本身需要预先配置内核的一些内部参数, - 以便在初始化时能够保持根设备的 ID。 这可以通过加载器变量 - vinum.root 来配置, 对应的 - /boot/loader.conf 设置是: - - vinum.root="root" - - 现在, 当内核初始化过程尝试找到要挂接的 root 设备时, - 它将能看到是否已经有某个内核模块预先初始化了所需要的内核参数。 - 这种情况下, 并且 - 所指定的根设备和来自加载器的根设备 - (也就是我们的 "vinum" ) 的 major 编号相符, - 则就是用预先分配的设备 ID, 而不是自己去找一个。 - 这样, 在通常的自动启动过程中, 它就能够继续挂接 Vinum - 根卷来作为根文件系统了。 - - 但是, 当指定了 boot -a - 来要求在启动时手工选择根设备时, - 仍然是无法自动地分析 Vinum 卷名的。 如果输入的设备名与 Vinum - 设备不匹配, 则 major - 编号的不匹配会使这个过程采用普通的分析过程, 这样, 输入 - ufs:da0d 就能够正常工作了。 - 注意, 一旦这个过程失败, 则再输入 ufs:vinum/root - 将不能正常工作, 因为它无法再被解析了。 唯一的解决办法是, - 重新启动并从头开始 (在 - askroot 提示处, 可以省略 - /dev/。) -