OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

OpenBSD文档与常见问题

1 - OpenBSD介绍

● 1.1 - 什么是OpenBSD?

● 1.2 - OpenBSD支持哪些平台?

● 1.3 - OpenBSD真的免费吗?

● 1.4 - 为什么我要使用OpenBSD?

● 1.5 - 我如何支持OpenBSD?

● 1.6 - 谁维护OpenBSD?

● 1.7 - 什么时候发布OpenBSD的新版本?

● 1.8 - OpenBSD都包含什么?

● 1.9 - OpenBSD4.5有什么新特征?

● 1.10 - 我能将OpenBSD用做桌面系统吗?

● 1.11 - 为什么(或不)包含作品X?

2 - OpenBSD其它信息

● 2.1 - 网页

● 2.2 - 邮件列表

● 2.3 - 用户手册

● 2.4 - 报告问题

3 - 开始OpenBSD之旅

● 3.1 - 购买OpenBSD CD

● 3.2 - 购买OpenBSD T恤

● 3.3 - OpenBSD有ISO文件下载吗?

● 3.4 - 通过FTP,HTTP或AFS下载

● 3.5 - 选择硬件

● 3.6 - OpenBSD第一次安装在什么"系统"上合适?

4 - OpenBSD 4.5 安装指南

http://www.9971.us/OpenBSD4.5/c/index.html(第 1/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

● 4.1 - OpenBSD安装过程概要

● 4.2 - 安装前的检查清单

● 4.3 - 制作OpenBSD安装介质

● 4.4 - 启动OpenBSD安装介质

● 4.5 - 进行安装

● 4.6 - 需要安装哪些文件?

● 4.7 - 安装OpenBSD需要多大空间?

● 4.8 - OpenBSD多启动

● 4.9 - 完成安装后发送dmesg

● 4.10 - 安装后增加系统组件

● 4.11 - "bsd.rd"是什么?

● 4.12 - 常见安装问题

● 4.13 - 定制安装过程

● 4.14 - 怎样安装多个相似系统的工作?

● 4.15 - 如何获得dmesg(8)来报告安装问题?

5 - 从源代码构建系统

● 5.1 - OpenBSD的版本类型

● 5.2 - 为什么我需要从源代码构建系统?

● 5.3 - 从源代码构建OpenBSD

● 5.4 - 构建一个发行版

● 5.5 - 构建X

● 5.6 - 为什么需要定制内核?

● 5.7 - 构建一个定制内核

● 5.8 - 启动配置

● 5.9 - 使用config(8)修改您的内核

● 5.10 - 在启动期间获得更详细的输出

● 5.11 - 编译和构建的常见问题

6 - 网络

● 6.1 - 继续之前

● 6.2 - 初始化网络

● 6.3 - 如何使用OpenBSD的包过滤和防火墙?

● 6.4 - 动态主机配置协议(DHCP)

● 6.5 - 点对点协议(PPP)

● 6.6 - 调整网络参数

http://www.9971.us/OpenBSD4.5/c/index.html(第 2/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

● 6.7 - 使用NFS

● 6.9 - 用OpenBSD建立网桥

● 6.10 - 我如何使用PXE启动?

● 6.11 - 通用地址冗余协议(CARP)

● 6.12 - 使用OpenNTPD

● 6.13 - 我可以选择哪些无线设备?

● 6.14 - 如何配置等价多路径路由?

7 - 键盘与显示控制

● 7.1 - 如何重新映射键盘(wscons)

● 7.2 - 在 OpenBSD 的控制台中支持鼠标吗?

● 7.3 - 如何在用户退出后清空控制台?

● 7.4 - 访问控制台屏幕缓存(amd64,i386,某些Alpha)

● 7.5 - 如何切换控制台(amd64,i386,Zaurus,某些Alpha)?

● 7.6 - 如何使用80x50的控制台(amd64,i386,某些Alpha)?

● 7.7 - 如何使用串行控制台?

● 7.8 - 如何让控制台黑屏(wscons)?

● 7.9 - 我在登录时输入的全部字符都是大写!

8 - 常见问题

● 8.1 - 我忘记了root密码.....怎么办?!

● 8.2 - 不能启动X,出现了许多错误信息

● 8.3 - 我能在OpenBSD中使用语言"L"吗?

● 8.8 - 如果在启动的时候没有接上软驱,我能使用软盘吗?

● 8.9 - OpenBSD的启动引导器(仅i386和amd64)

● 8.10 - 在OpenBSD中使用S/Key

● 8.12 - OpenBSD支持SMP吗?

● 8.13 - 当我使用tty设备时出现了I/O错误

● 8.14 - 在OpenBSD中可以使用哪些浏览器?

● 8.15 - 如何使用mg编辑器?

● 8.16 - Ksh不使用我的.profile!

● 8.17 - 为什么我修改后的文件/etc/motd被重写了?

● 8.20 - X中的抗锯齿技术与TrueType字体

● 8.21 - OpenBSD 支持日志文件系统吗?

● 8.22 - 反向DNS查询,或者为什么我登录需要如此长的时间?

● 8.23 - 为什么OpenBSD的网页不遵守HTML4/XHTML标准?

http://www.9971.us/OpenBSD4.5/c/index.html(第 3/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

● 8.24 - 为什么我的时钟偏离了二十几秒?

● 8.25 - 为什么我的时钟偏离了几个小时?

9 - 转到 OpenBSD

● 9.1 - 对其它类Unix操作系统用户的提示

● 9.2 - 双启动Linux和OpenBSD

● 9.3 - 将您的Linux(或者其它第六版样式)密码文件转换成BSD格式

● 9.4 - 在OpenBSD中运行Linux程序包

● 9.5 - 在OpenBSD中访问Linux文件

10 - 系统管理

● 10.1 - 为什么我想su到root时说我在错误的组中

● 10.2 - 如何复制文件系统?

● 10.3 - 我怎样让程序随系统启动?(概述rc(8))

● 10.4 - 为什么OpenBSD拒绝远程用户的转发请求?

● 10.5 - 我已经设置了POP服务器,但我访问POP时怎么会有错误信息?

● 10.6 - 为什么Sendmail忽略/etc/hosts?

● 10.7 - 使用SSL(8)配置安全的HTTP服务器

● 10.8 - 我使用vi(1)修改了/etc/passwd,为什么不起作用?

● 10.9 - 如何增加或者删除用户?

● 10.10 - 如何创建只能访问ftp的账号?

● 10.11 - 配置用户的磁盘限额

● 10.12 - 配置 KerberosV 客户端和服务器

● 10.13 - 配置匿名FTP服务器

● 10.14 - 在ftpd(8)中限制用户只能访问自己的文件。

● 10.15 - 在OpenBSD中安装补丁。

● 10.16 - 告诉我chroot(2)的Apachee?

● 10.17 - 我可以更改root的shell吗?

● 10.18 - 我用 ksh还能做什么?

● 10.19 - 目录服务,YP

11 - X Window 系统

● 11.1 - 介绍X

● 11.2 - 配置X

● 11.3 - 在amd64和i386上配置X

http://www.9971.us/OpenBSD4.5/c/index.html(第 4/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

● 11.4 - 启动X

● 11.5 - 定制 X

12 - 硬件和特定平台问题

● 12.1 - 常规硬件说明

● 12.2 - DEC Alpha

● 12.3 - AMD 64

● 12.4 - ARM-based appliances

● 12.5 - HP 9000 series 300,400

● 12.6 - HP Precision Architecture (PA-RISC)

● 12.7 - i386

● 12.8 - Landisk

● 12.9 - Luna88k

● 12.10 - Mac68k

● 12.11 - MacPPC

● 12.12 - MVME68k

● 12.13 - MVME88k

● 12.14 - SGI

● 12.15 - SPARC

● 12.16 - UltraSPARC

● 12.17 - DEC VAX

● 12.18 - Sharp Zaurus

13 - 多媒体

● 13.1 - 我怎样配置音频设备?

● 13.2 - 播放不同格式的音频文件

● 13.3 - 我在OpenBSD上怎样播放CD?

● 13.4 - 我能用OpenBSD录音吗?

● 13.5 - 音频设备有问题,我该怎么办?

● 13.6 - 我如何使用MIDI工具?

● 13.7 - 请告诉我什么是Ogg Vorbis和MP3编码?

● 13.8 - 如何在OpenBSD中播放DVD视频?

● 13.9 - 如何刻录CD和DVD?

● 13.10 - 但我想使用格式FOO的媒体文件

● 13.11 - 我能在OpenBSD中播放播放流媒体吗?

● 13.12 - 我的浏览器可以使用Java插件吗?(仅i386/amd64)

http://www.9971.us/OpenBSD4.5/c/index.html(第 5/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

● 13.13 - 我的浏览器可以使用Flash插件吗?(仅i386)

14 - 配置磁盘

● 14.1 - 使用OpenBSD的disklabel(8)

● 14.2 - 使用OpenBSD的fdisk(8)

● 14.3 - 在OpenBSD中增加磁盘

● 14.4 - 如何使用交换文件

● 14.5 -

● 14.6 - OpenBSD/i386如何启动?

● 14.7 - 在OpenBSD中使用大磁盘有哪些问题?

● 14.8 - 安装引导块-i386/amd64特定

● 14.9 - 准备应对灾难:用磁带备份和恢复

● 14.10 - 在OpenBSD中挂接磁盘镜像文件

● 14.11 - 帮帮忙! 我遇到了IDE DMA错误!

● 14.13 - OpenBSD的RAID

● 14.14 - 为什么df(1)告诉我磁盘使用率超过100%?

● 14.15 - 在删除disklabel之后恢复分区

● 14.16 - 我能访问非FFS文件系统中的数据吗?

● 14.17 - 我能在OpenBSD中使用闪存吗?

● 14.18 - 优化磁盘性能

● 14.19 - 为什么不用异步挂载?

15 - OpenBSD的packages和ports系统

● 15.1 - 介绍

● 15.2 - 管理Package

● 15.3 - 设置ports

● 15.4 - FAQ

● 15.5 - 报告问题

● 15.6 - 帮助我们

PF 用户指南

● 基本配置 ❍ 开始

❍ 列表和宏

❍ 表

http://www.9971.us/OpenBSD4.5/c/index.html(第 6/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

❍ 包过滤

❍ 网络地址转换

❍ 端口重定向(Port Forwarding)

❍ 创建规则的捷径

● 高级配置 ❍ 运行时选项

❍ 净化(包的标准化)

❍ 锚

❍ 数据包的列队与优先

❍ 地址池与负载均衡

❍ 包标记(过滤策略)

● 附属议题 ❍ 记录日志

❍ 性能

❍ FTP问题

❍ Authpf:认证网关的User Shell

❍ 使用CARP和pfsync构建冗余防火墙

● 规则实例 ❍ 为家庭或小型办公环境搭建防火墙

常见问题

● 常见安装问题

● 我怎样升级系统?

● 包过滤

● 我应该使用Port还是Package?

● 如何配置多启动系统?

● 无线网络

最新更新

● 安装时没有软驱和光驱 -- 新

● 怎样处理交换? -- 修订

● 选择硬件 -- 修订

● OpenBSD第一次安装在什么"系统"上合适? -- 新

http://www.9971.us/OpenBSD4.5/c/index.html(第 7/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ非官方中文版 OpenBSD FAQ Chinese Version

● 定制 X - 新

● 使用闪存作为引导设备 - 新

● 升级指南 - 新 4.5

The FAQ maintainers are Nick Holland and Steven Mestdagh. Additional contributors to the FAQ include Joel Knight, Eric Jackson, Wim Vandeputte and Chris Cappuccio.

For information about and assisting in the translation of this FAQ and the rest of the OpenBSD website, see the translation page.

Questions and comments regarding the FAQ may be directed to faq@.org. General questions about OpenBSD should be directed to the appropriate mail list.

OpenBSD FAQ Copyright © 1998-2009 OpenBSD $OpenBSD:index.html,v 1.301 2009/02/05 21:20:55 sthen Exp $ "If you don't find it in the index, look very carefully through the entire catalogue." Sears, Roebuck, and Co., Consumer's Guide, 1897

http://www.9971.us/OpenBSD4.5/c/index.html(第 8/8 页)2009-5-3 23:00:44 OpenBSD 4.5 FAQ中文版 第一章 - OpenBSD介绍

[索引] [第二章 - 其它 OpenBSD信息]

1 - OpenBSD介绍

目录

● 1.1 - 什么是OpenBSD?

● 1.2 - OpenBSD支持哪些平台?

● 1.3 - OpenBSD真的免费吗?

● 1.4 - 为什么我要使用OpenBSD?

● 1.5 - 我如何支持OpenBSD?

● 1.6 - 谁维护OpenBSD?

● 1.7 - 什么时候发布OpenBSD的新版本?

● 1.8 - OpenBSD都包含什么?

● 1.9 - OpenBSD4.5有什么新特征?

● 1.10 - 我能用OpenBSD做桌面系统吗?

● 1.11 - 为什么(或不)包含作品X?

1.1 - 什么是 OpenBSD?

OpenBSD项目提供了一个免费, 多平台, 基于4.4BSD的类Unix操作系统。我们的目标注重于正确, 安 全, 标准和可移植。OpenBSD支持包括SVR4(Solaris), FreeBSD, , BSDI, SunOS和HPUX等大部分 二进制的模拟。

本FAQ只针对OpenBSD的最新版本4.5进行讨论。

1.2 - OpenBSD支持哪些平台?

OpenBSD 4.5 可以运行在这些平台上:

http://www.9971.us/OpenBSD4.5/c/faq1.html(第 1/7 页)2009-5-3 23:00:52 OpenBSD 4.5 FAQ中文版 第一章 - OpenBSD介绍

● alpha - 仅FTP

● amd64 - 提供CD

● armish - 仅FTP

● hp300 - 仅FTP

● hppa - 仅FTP

● i386 - 提供CD

● landisk - 仅FTP

● mac68k - 仅FTP

● macppc - 提供CD

● mvme68k - 仅FTP

● mvme88k - 仅FTP

● sgi - 仅FTP

● socppc - 仅FTP

● sparc - 仅FTP

● sparc64 - 提供CD

● vax - 仅FTP

● zaurus - 仅FTP

这里提供CD是指该平台提供了官方的CD套件包含一系列软件包。包含基本系统的其它平台CD 镜像文件也可以下载到。

更多可运行OpenBSD的平台信息在这里可以查询到。

人们经常问道为什么我们支持如此众多的"古怪"平台, 简短的回答是:"因为我们想"。如果那些充分 掌握电脑技术的人(某种程度上讲这里的"充分"是指真正"充分"掌握电脑技术的人!)希望在某种平 台上运行和维护OpenBSD, 那么我们会支持这种做法, 因为保持OpenBSD可以在多平台上运行实际 上是很有好处的:当OpenBSD在一个新的平台运行时可以帮助我们检验程序的代码缺陷和可移植性 是否可靠, OpenBSD可以在32位或64位处理器及大型机或微型机上运行, 这些平台囊括了很多不同 的设计体系, 所以OpenBSD支持这些"古怪"平台对我们提高代码质量以便更好的支持"大众"平台是 很有帮助的。

1.3 - OpenBSD真的免费吗?

OpenBSD是完全意义上的免费, 二进制代码是免费的, 原代码是免费的, 所有的OpenBSD的相关项 目是完全免费的, 您可以完全免费得在OpenBSD上开发您自己的有偿产品, 包括免费使用OpenBSD 的源程序, 无论您是商业目的或者是个人的用途。OpenBSD的软件使用许可不像老的BSD版本包含 任何隐含的许可限制, 它是完全意义上的免费, OpenBSD的正式发行版里不包含有任何使用限制的 软件, 您是OpenBSD的最终用户, 您可以任意使用, 改编, 二次开发, 并可免费地将开发应用于您的商 业产品。

http://www.9971.us/OpenBSD4.5/c/faq1.html(第 2/7 页)2009-5-3 23:00:52 OpenBSD 4.5 FAQ中文版 第一章 - OpenBSD介绍

人们有时候会问:我们会不会对将我们的免费的程序代码放进商业产品中感觉很烦恼, 答案是, 我们 更愿意我们的高质量代码被广泛采用, 而不是让用户采用糟糕代码的商业软件来解决那些已经被 解决的问题。例如, 就像SSH协议, 如果OpenSSH代码附加了某些限制, SSH协议就不会被人们如此 广泛地采用。

当然这并不意味着我们反对大家提供的经济或硬件方面的援助, 事实上, 那些在自己的产品上采用 OpenBSD代码的商业公司即使提供任何形式的一点点援助也会令我们不胜感激。

更多公共许可方面的信息, 请参阅:OpenBSD Copyright Policy.

OpenBSD项目耗费了维护人员自己大量的资金才得以维持。这里面包括编写程序花费的时间, 方 方面面所需的设备, 用户下载OpenBSD所需的网络资源, 以及回答用户问题及处理错误报告所需的 时间等。OpenBSD的开发者并非无忧无虑的有钱人, 如果您能贡献一点点时间, 设备, 资金, 就可能 给OpenBSD带来极大的改观。

1.4 - 为什么我要使用OpenBSD?

通常新用户想知道OpenBSD是否会优于其它的类Unix操作系统, 这个问题在很大程度上是无法回 答的, 并且是一个永无休止的辩论话题。不要, 在任何情况下, 在邮件列表中问这个问题。

下面是为什么我们认为OpenBSD是一个有用的操作系统的一些理由。OpenBSD是否适合您, 只有 您自己能回答自己!

● OpenBSD能运行在许多不同的硬件平台上。

● 通过从未间断地、广泛地对OpenBSD全部源代码的安全审查, 很多安全专家认为OpenBSD 是最安全的类UNIX操作系统。

● OpenBSD是免费提供源代码的全功能的类Unix操作系统。 ● OpenBSD整合了最尖端的安全技术, 适用于防火墙和分布式环境下的私有网络服务。

● 来自不同领域的新技术推动OpenBSD持续发展, 为全球社区上的程序员和最终用户提供了 采用最新的技术进行开发的机会。 ● OpenBSD力求最小化系统定制和调整的工作量, 对绝大多数用户来说OpenBSD可以直接运 行在他们的计算机上提供服务。用户极少真正需要调整和定制, 我们尽力劝阻用户自行优 化和调整系统。

1.5 - 我如何支持OpenBSD?

我们非常感谢那些对OpenBSD项目赞助的个人或组织。他们的公示名单在捐赠页面。

OpenBSD需要来自用户社区的长期的不同类型的支持。如果您认为OpenBSD很好, 我们强烈鼓励 您通过某种方式为OpenBSD做贡献。假如下列建议没有适合您的, 您可以发送邮件到

http://www.9971.us/OpenBSD4.5/c/faq1.html(第 3/7 页)2009-5-3 23:00:52 OpenBSD 4.5 FAQ中文版 第一章 - OpenBSD介绍 [email protected]

● 购买OpenBSD CD。 CD包含了当前发行版的所有内容, 而且可以在许多平台上启动。CD可 以为OpenBSD项目创收, 并且通过邮寄方式可以缓解网络下载方式给OpenBSD服务器带来 的带宽占用, 这个并不昂贵的3-CD套装包含了所有的OpenBSD源码, 提醒一下, 也许您的朋 友们会到您这里来拷贝一份的! ● 捐款。 OpenBSD项目需要长期的捐款以维持设备, 网络带宽和CD出版发行的大量费用, 出 版CD是需要OpenBSD开发者团队前期投入并且现款一次性支付的, 这些前期费用并不能担 保一定可以盈利甚至回本。请给[email protected]发邮件商量怎样捐款, 即使是每人 少量的捐助也可能给我们带来极大改善。 ● 捐赠设备或部件。 OpenBSD项目长期需要普通的或者特别的设备, 比如像IDE或SCSI硬盘, 各种不同类型的内存是长期需要的。其它类型的设备或零件, 例如计算机和主板等, 请您先 发邮件至[email protected] 确认目前需要后再安排邮寄。 ● 贡献您的时间和技术。 那些愿意参与操作系统编写的程序员我们永远欢迎, 如果您不是也 没有关系, 您可以用别的方式为我们提供帮助, 例如到邮件列表 mailing 里帮助解答新手的问 题。 ● 通过向 [email protected] 提交新的FAQ材料以便帮助我们维护更新文档。联系您当地的一个 用户组并且吸引您的朋友们喜爱OpenBSD, 用OpenBSD完成一件您老板安排的工作, 如果您 是一位学生, 和您的教授谈谈用OpenBSD当作计算机科学或者工程课程的学习工具, 还有很 多您没有尝试的方式也可以"帮助"我们OpenBSD项目:不要在"哪种操作系统好"这样的无谓 的争论战中浪费您的时间了, 它不但没有帮助OpenBSD项目吸引新用户, 相反却在破坏 OpenBSD开发团队与其它开发团队之间的重要友情。

1.6 - 谁维护OpenBSD?

OpenBSD的维护是通过居住在世界世界各地的不同国家的开发者团队进行维护的, 由加拿大的 Theo de Raadt进行工作的分工调配。

1.7 - 什么时候发布OpenBSD的新版本?

OpenBSD开发团队每6个月推出一个新版本, 日期是每年的5月和11月, 更详细的开发周期情况可以 看这里。

1.8 - OpenBSD都包含什么?

OpenBSD是一个包含了一定数量的第三方软件的发行版本, 包括:

● X.org 7.4, X Window环境, 已经进行了安全修补。通过 x*.tgz二进制编码包的方式进行安装, 详细请参阅安装组件。

● GCC GCC 版本2.95.3 and 3.3.5 GNU C Compiler。OpenBSD开发团队已经增加了Propolice堆

http://www.9971.us/OpenBSD4.5/c/faq1.html(第 4/7 页)2009-5-3 23:00:52 OpenBSD 4.5 FAQ中文版 第一章 - OpenBSD介绍

栈保护技术, 默认安装并运行, 在整个OpenBSD用户岛中使用, 而且它被作为OpenBSD的一个 默认编译器, 包含在安装模块comp45.tgz中, 详见OpenBSD4.5安装指南。

● Perl 5.10.0, Perl 5.8.8, 已经被OpenBSD开发团队进行了改进和安全修补。

● Apache 1.3 经过OpenBSD开发团队改进并经过安全处理的Apache 1.3 web服务器, OpenBSD增 加了默认的chrooting, 对浏览者收回特权并在其它安全方面进行了改进, 同时包含了mod_ssl 和DSO支持。 ● OpenSSL 0.9.8j, OpenBSD团队进行了改进和安全修补。

1.15 文字排版处理。

● Sendmail 8.14.3 邮件服务器, 包含libmilter。

● BIND 9.4.2-P2 (额外的安全修补)DNS服务器, OpenBSD开发团队进行了多项改进, 包括将使 用者限制在特定的目录内及其他一些方面的安全改进。 ● Lynx 2.8.5rel.4 文字浏览器. 增加了HTTPS安全浏览支持, OpenBSD开发团队进行了额外的程 序安全修补。 ● v1.7, 使一般用户进行一些管理员权限的操作。

● Ncurses 5.2

● KAME IPv6

● Heimdal 0.7.2 进行了安全修补。

● Arla 0.35.7

● Binutils 2.15 进行了安全修补。

● gdb 6.3 进行了安全修补。

● OpenSSH 5.2

● OpenNTPD 执行安全简单的时间协议。

● OpenBGPD and OpenOSPFD 路由应用。

正如您所见到的, OpenBSD开发团队经常修补第三方软件(团队特色)以便提供更好的安全性或提高 代码质量。有些时候, 用户可能觉得我们修改的软件在使用上与修改前没有差别, 而另外一些时 候, 用户可以感觉到我们修改的软件在使用上的与原版本明显的差别, 使用户对OpenBSD的安全性 留下了深刻的印象, 他们明白当盲目追求一个软件的高版本时很有可能得到的是不安全的系统。

当然除上面的一些软件外, 其他的应用程序您还可以从还OpenBSD的packages and ports系统中获 得。

1.9 - OpenBSD 4.5有什么新特征?

OpenBSD从4.4升级到4.5的所有新特征可以在这里找到, 并且可以集中在OpenBSD 4.5 资料页面上 获得。无论如何这里有一些对那些熟知老版本用户新特征:

● Mutli-adapter X is broken While X can be run with multiple heads on ONE video card, the ability to use multiple video cards on one system was broken "upstream" by the X.org team.

http://www.9971.us/OpenBSD4.5/c/faq1.html(第 5/7 页)2009-5-3 23:00:52 OpenBSD 4.5 FAQ中文版 第一章 - OpenBSD介绍

● New Perl 5.10.0 Along with this being a major Perl upgrade, a number of modules that used to be separate packages are now included with OpenBSD. Those packages will be removed as part of the upgrade process.

● xcompmgr(1) has beren moved from ports to xbase45. If you have it installed as a package, it will be removed as part of the upgrade process.

1.10 - 我能用OpenBSD做桌面系统吗?

这个问题经常以同样的方式提出——提问者没有解释其"桌面"的含义, 唯一能够回答这个问题的就 是您自己, 因为答案取决于您的需要和期望是什么。

尽管将OpenBSD做为一个"服务器"操作系统口碑很好, 但是它也完全能够并已经被作为桌面使用。 很多"桌面"应用程序可以在packages and ports里面找到, 正如对所有操作系统的判定一样, 但问题是 用您用OpenBSD作为桌面您自己满意吗?这个问题您必须为自己回答。值得一提的是在笔记本应 用方面OpenBSD已经做了大量的开发工作。

1.11 - 为什么(或不)包含作品X?

人们经常会问道为什么一款特定的软件有或者没有包含在OpenBSD的发行版里, 答案基于两点:开 发者的意愿和软件是否兼容OpenBSD项目的目标。一款第三方的软件没有进入OpenBSD的发行版 里的原因往往是因为它太"整洁"了——它必须"自由"使用, 分发或者按照我们的标准进行修改。一 款软件必须是稳定的安全的——一个高版本号并不意味是更好的产品。

通常使用许可是最大的问题:我们想让OpenBSD保持它的可用性——即世界上的任何地方的任何人 可以因为任何目的使用OpenBSD发行版。

另外一个主要的考虑因素是开发者的意愿, 一款软件的是否被添加到OpenBSD的发行版内开发者 们有最终决定权。只因为一款软件"好"并不意味着OpenBSD项目希望投入精力去维护它, 或为分享 其他人的热心就把它包含在OpenBSD的发行版里。

关于第三方软件的常见问题:

● 周所周知Sendmail "不太安全", 为什么却包含在发行版内 ?! Sendmail在安全方面的确有不完美的纪录, 但是无论如何Sendmail的作者和维护团队总是非 常谦卑虚心地接受别人在安全方面的提议, 并重写程序代码以使它更加安全(认真, 执着, 负 责的态度, 令人肃然起敬)。根据最近的安全方面的统计结果:Sendmail并不逊于另一款号 称"更安全"的邮件服务器软件。 ● 为什么发行版里不包含 Postfix? 软件许可不自由, 所以不再考虑范围内。 ● 为什么不包含qmail或者djbdns? 两者全非多数unix用户"期望"选择的mail或DNS应用软件。

http://www.9971.us/OpenBSD4.5/c/faq1.html(第 6/7 页)2009-5-3 23:00:52 OpenBSD 4.5 FAQ中文版 第一章 - OpenBSD介绍

● 为什么包含Apache?很多人不需要的它! 因为开发者想要这样。 ● 为什么不包含新版本的Apache? 新版本Apache的软件使用许可不能被接受。 ● 为什么不能用bzip2代替gzip? 性能恐怖, 好处不多。低端计算机吃不消, 像m68k或VAX这样的平台接受不了。 ● 为什么包含在基本安装不包含一个图形或curses(3)安装界面? 这里面有一系列的原因, 包括为了把OpenBSD的安装系统启动文件压缩到一张软盘里, 事实 上要求安装软件可以应用在任何平台上, 无论配置多么低, 实际情况是:对于安装过两三次 OpenBSD的大多用户来说, OpenBSD是最简捷同时也是安装速度最快操作系统, 多数开发人 员和用户更钟情于目前安装包的快速, 高效, 简单的安装方式, 而非追求目前某些操作系统那 样具有华丽漂亮的安装程序。

在很多时候, 这些话题在mail lists里鸡一嘴鸭一嘴地纠缠在令人痛苦的细节上, 如果您想了解更多的 信息请参看文档。

当然了, 如果您希望使用这些软件, 而且这样的使用并不违反它的软件使用许可, 没人拦着您(但我 们总不能自由地把它加入发行版里, 是吧?)。不管怎么说, 您的需求也许会改变——您不会去开发 一套不能销售, 分发, 或者不挣钱的"功能强大的应用程序", 仅仅因为它里面包含了不能自由使用的 软件。

[索引] [第二章 - 其它OpenBSD信息]

[email protected] $OpenBSD: faq1.html, v 1.106 2008/11/12 02:54:37 nick Exp $

http://www.9971.us/OpenBSD4.5/c/faq1.html(第 7/7 页)2009-5-3 23:00:52 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

[索引] [第一章 - OpenBSD介绍] [第三章 - 开始OpenBSD之旅]

2 - OpenBSD其它信息

目录

● 2.1 - 网页

● 2.2 - 邮件列表

● 2.3 - 用户手册

● 2.4 - 报告错误

2.1 - Internet上的网页 http://www.OpenBSD.org OpenBSD项目官方网站, 官方网站上有一系列有价值的资料、涉及OpenBSD项目的方 方面面。

OpenBSD Journal 一个收集各种性质的用户维护文档的网站, 经常讨论一些官方FAQ或者其它文档不包含的内 容。

OpenBSDsupport.org 一个收集各种性质的用户维护文档的网站, 经常讨论一些官方FAQ或者其它文档不包含 的内容。

许多用户建立了关于OpenBSD的网站或网页, 因为所有信息全分布在Internet上, 所以一个好的搜索引擎可以使 您的生活更加轻松, 最后永远记住一点:千万不要在您的计算机上输入您不知道含义的命令。

2.2 - 邮件列表

OpenBSD项目维护着几个热门的邮件列表, 用户应该订阅并关注他们, 订阅邮件列表很简单, 给 [email protected]发一封邮件, 这个电子邮件地址会自动地提供定于服务。在邮件信息中您应该用单 独的一行给出订阅命令, 以便让服务器明白您要订阅那些内容, 例如:

subscribe announce

邮件列表处理器会回复您一封邮件让您确认, 确认方式有几种, 并且包含了一个邮件列表服务器的list server主 页信息, 这样可以确认是您可以得到您所订阅的内容, 也能避免您收到垃圾邮件, 您仅需要确认订阅或者发一

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 1/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

封邮件给[email protected], 无论哪种方法订阅全很方便。您会看见有时限的三组身份识别号码, 就像 这样 A56D-70D4-52C3, 目的是再一次确认是的确是您订阅了我们的邮件列表。

一旦您确认了您的订阅, 您会被马上加入邮件列表, 并且邮件列表服务器会通知您:您已经被成功的加入了。

取消订阅邮件列表您也仅仅需要再次给[email protected].发一封信, 内容包括:

unsubscribe announce

如果您订阅邮件列表时还有什么困难请封一封信给[email protected] 在邮件中写明"help", 这样您会得 到一封回信, 仔细阅读里面的内容会对您的邮件列表设置有帮助。

您也可以通过http://lists.openbsd.org网站进行邮件列表的订阅维护。

OpenBSD 一些受欢迎的邮件列表清单:

● announce - 重要公告, 这是个很少更新的邮件列表。 ● security-announce - 安全方面的公告, 这是个很少更新的邮件列表。 ● misc - 这里包含了常见的问题和答案, 是最活跃的邮件列表, 大多数问题的答案可以在这里找到。 ● bugs - 发现程序漏洞并讨论。 ● source-changes - 自动列出CVS源代码树的变化, 每当一个开发者提交了一个对源代码的修改, CVS就会 在这个列表上提供一个修改内容的摘要。 ● ports - 讨论OpenBSD Ports树。 ● ports-changes - 自动列出ports树的更新内容。 ● advocacy - 讨论如何推广OpenBSD, 以及那些不适合misc的内容。

在您提问之前, 请查阅一下用户交流区misc 或其它版面的以往文章, 有些问题对您来说可能是第一次碰到, 但 是它可能在这里已经被问过很多次了, 也许上周就在版面上出现过几次, 您可以试想一下再次在同样的地方提 同样的老问题可能会使回答者不愉快, 所以请先仔细浏览以往的文章, 也许您马上就找到答案了。如果包含硬 件方面的问题, 始终需要dmesg(8)!

其它邮件列表指南及更多的信息, 请参阅mailing lists page。

一个非官方的邮件列表或许更能引起Unix或者OpenBSD新手的兴趣OpenBSD Newbies。

2.3 - 用户手册

OpenBSD用户手册包含了大量的文档及对具体程序足够详尽的描述。为使用户手册更新及时并准确无误, OpenBSD团队一直付出大量的努力, OpenBSD用户手册上文件在任何时候都具有权威性。

您需要先安装man44.tgz和misc44.Tgz, 才可以在本地阅览用户手册和其他文档, 如何安装请详见系统组件。

这里有一份对新手来说很有用的部分用户手册清单:

我们开始

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 2/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

● afterboot(8) - 完成系统安装并首次启动后需要做的事情。

● help(1) - 无论是新手老手help对您全很重要。

● hier(7) - 设置文件系统。

● man(1) - 在线显示用户手册。

● intro(1) - 介绍常规命令, 同时请参阅:intro(2), intro(3), intro(4)(说明:intro(4)是特殊平台), intro(5), intro (6), intro(7), intro(8)及intro(9).

● adduser(8) - 添加新用户命令。

● vipw(8) - 编辑master密码文件。

● disklabel(8) - 读取和更改磁盘分区。

● reboot, halt(8) - 重新启动或停止系统。

● shutdown(8) - 在给定时间内关机。

● dmesg(8) - 重新显示内核启动信息。

● sudo(8) - 不以root身份登陆系统, 但是通过sudo执行root权限命令.

(1) - 类似emacs的文本处理器

为高级用户

● boot(8) - 系统崩溃时如何启动内核。

● boot_config(8) - 启动时如何更改内核配置。

● gcc_local(1) - OpenBSD特别修补过的 gcc(1)

● ifconfig(8) - 配置网络接口参数。

● login.conf(5) - 登陆类型设置文件。

● netstat(1) - 显示网络状态。

● release(8) - 建立一个OpenBSD行版。

● sendbug(1) - 报告错误。

● style(9) - OpenBSD 内核源程序定制指南。

(8) - 获取或设定内核状态。

您可以在http://www.openbsd.org/cgi-bin/man.cgi找到所有的OpenBSD用户手册, 同样如果您安装了man44.tgz这 个文件您在本地计算机上也可以浏览。

一般来讲, 如果知道命令的名称您可以通过运行"man command"查询到此命令的用户手册-也就是这个命令的 详细说明。例如"man vi"将显示关于vi编辑器的一些详细使用参数。如果您不清楚确切的命令名称, 或者用户 手册上找不到您需要的命令, 您可以通过运行" something" 或者 "man -k something", 这里的"something" 就是一个接近您要找的命令的意思的词, 也许用户手册会给出您想要的命令, 例如:

# apropos "time zone" tzfile (5) - time zone information zdump (8) - time zone dumper zic (8) - time zone compiler

附加的数字指出了用户手册所在的章节数(也可以理解为段落), 有时您会发现同一个命令的不同解释内容在

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 3/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

不同的章节上, 例如:假如您想知道"cron"命令的具体用法, 如果您知道了您所需要的"cron"命令的具体章节数, 您可以用命令 " man n cron "直接去那个章节阅读您所需要的内容。

# man -k cron cron (8) - clock crontab (1) - maintain crontab files for individual users crontab (5) - tables for driving cron # man 5 crontab

除了UNIX用户手册外, 还有一个可定制文档格式的程序包(包含在misc44.tgz程序包内). 它位于/usr/share/doc目 录. 您可以在适当的目录内通过"make"命令为每个文档设定格式。psd(Programmer's Supplementary Documents) 子目录是程序员辅助文档。smm(System Manager's Manual)子目录里面是系统管理者用户手册。usd( User's Supplementary Documents)子目录是Unix用户辅助文档。 您可以在上面的三个子目录中运行"make"命 令, 或者您也可以"make"某一章节或一部分段落。

一些子目录内是空的.默认情况下的输出的是PostScript格式, 因为更适合于打印, PostScript 输出格式实际很大 ——您会发现文件字节数增大了250-300%。如果您不打算打印或显示这种格式, 您完全可以将文档输出成在 终端上的显示格式。每个文档目录内的文档全可以用make(1)命令输出为ASCII码的纯文本格式(使用'paper. txt"参数), 例如:

# cd /usr/share/doc/usd/04.csh # make paper.txt # more paper.txt

提醒一下您在这些子目录中创建文档时系统可能要求您具有超级用户权限, 而且您在输入make clean命令后您 以前"make"生成的文档会被删除。具体请参看/usr/share/doc/README文档, 更多关于创建文档的说明在/usr/ share/doc/目录中可以找到。

UNIX用户手册通常情况下比可打印文档的内容更新更可靠, 但是有时可打印文档对相关应用程序的解释更详 尽。 对多数人来讲自己拥有一份硬拷贝的用户手册是十分有益的。在这里我们介绍一下怎样打印一份用户 手册的拷贝。

怎样显示一个用户手册的原始文档(例如一个以数字结尾的文档, 像tcpdump.8等)?

您可以通过src树找到它们。在src树中的用户手册是无格式的原始文档, 通过使用CVS, 它们会被更新。如果您 想看这些页面, 很简单:

# -Tascii - | more

我如何才可以得到一个无格式或者控制符的用户手册原始文档?

这样会帮您直接获得一份简单的无格式及无打印控制符的文档:

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 4/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

# man | col -b

我如何得到一份可打印的PostScript格式用户手册?

说明一下"# nroff -Tps -mandoc > outfile.psNote"所指的必须是用户手册原始文档(很可能是以数字结 尾的文件名, 如:tcpdump.8)。PostScript版的用户手册看起来很好, 他们可以打印出来, 或者用某程序如gv (GhostView)在屏幕上浏览。GhostView 可以在packages collection中找到。用下面的nroff(1)命令选项来得到 PostScript格式的OpenBSD系统用户手册:

# nroff -Tps -mandoc > outfile.ps

我怎样得到压缩格式的用户手册?

对那些通过编译系统源码构建自己系统的人来讲, 有一系列选项可以指定如何创建他们的用户手册, 首先在重 新构建系统前创建/etc/mk.conf这个文件是十分有必要的, 这个特别的选项可以帮助您生成压缩格式的用户手 册文档以便节省磁盘空间, 而且这种压缩格式的文档可以通过man命令正常显示出来。在文件mk.conf里加入 一个选项:

MANZ=yes

除了可以生成纯文本ASCII码格式的用户手册文档外, 另一个有用的选项可以让系统产生PostScript格式的用户 手册文档, 您仅需在/etc/mk.conf里加入一个选项:

MANPS=yes

请参看mk.conf(5)以获得更多的信息。

什么是info文档?

OpenBSD的一些文档是由info文档构成的, 具有代表性的就是在 /usr/share/info下的文件, 如:"as.Info", "g77.info", "gcc.info"等等。他们全是GNU 提供的软件的说明文档, 这里的多数GNU的说明文档比OpenBSD用户手册上的 以前GNU提供的说明文档更新, 您可以通过info(1)命令查看这些GNU提供软件的说明文档, 例如, 您想了解 GNU提供的编译器gcc(1)的说明文档, 输入命令:

# info gcc

系统会显示gcc.info文档的内容, 您用过info命令后, 您将会更加喜爱我们的用户手册!

我怎样才能让XTerm终端显示彩色的用户手册?

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 5/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息 (1)终端默认的配置文件并不能显示彩色的用户手册, 如果想要得到彩色输出您必须把 /etc/X11/app- defaults/XTerm-color拷贝到您的根目录, 并把它的名字改成.Xdefaults。仔细点!!!您不要随便修改这个". Xdefaults"文件的当前设定, 您的XTerm终端可以彩色显示的所有设定选项全在这个文件里了。不过不管怎样 您要确保下面这三个选项没有被注释掉这个文件才能起作用:

!*VT100*colorULMode: on !*VT100*underLine: off !*VT100*colorBDMode: on

这个文件的其它部分的不同设定可以让您选择颜色, 有关用户手册的彩色显示选项是:

*VT100*colorUL: yellow *VT100*colorBD: white

天呢, 设置成这种的颜色搭配的用户手册实在是有点恐怖, 所以如果您想个性化一下用户手册的显示也许可以 将colorUL设置成red(红), 把colorBD设置成magenta(洋红)?两一个选择是xman(1), 它可以在X11下浏览用户手 册。您可以在用户手册上找到更多的关于xterm和xman的知识。

我怎样写自己的用户手册?

如果您想为自己所编写的程序写自己的用户手册, 可以看mdoc.samples(7)和mdoc(7)。

2.4 - 报告错误

提交任何错误报告以前, 请您确认您真的发现了错误。也许您不知道在OpenBSD中这样的问题已经解决了, 或 者您在用户手册及主页上没有找到答案, 抑或您忘了在邮件列表(通常用[email protected])上寻求帮助。如 果您是初次使用OpenBSD, 老实说: 实际您发现的可能不是一个真的未知的程序错误。同样, 请注意有缺陷的 硬件设备会导致程序出现莫名其妙的问题, 有时看起来像是程序本身的错误, 所以在您确认发现一个程序"错 误"之前请先确认您的硬件系统当前工作正常。最后递交任何错误报告前请先认真浏览http://www.OpenBSD. org/report.html.页面。

最后递交任何错误报告前请先认真浏览http://www.openbsd.org/report.html页面。

提交真正的程序错误报告是最终用户一个最重要的职责, 诊断大多数程序错误需要发现者提供尽量详细的情 况。OpenBSD开发人员经常通过email收到这样的错误报告, 就像:

From: [email protected] To: [email protected] Subject: HELP!!!

I have a PC and it won't boot!!!!! It's a 486!!!!!

值得庆幸的是大多数人理解为什么这样的邮件会被立刻删除。所有的错误报告必须包含详尽的信息, 上面例

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 6/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

子中如果Joe User真的希望别人帮助来解决这个"问题", 那应该提供更多的情况...... , 像这样:

From: [email protected] To: [email protected] Subject: 3.3-beta panics on a SPARCStation2

OpenBSD 3.2 installed from an official CD-ROM installed and ran fine on this machine.

After doing a clean install of 3.3-beta from an FTP mirror, I find the system randomly panics after a period of use, and predictably and quickly when starting X.

This is the dmesg output:

OpenBSD 3.3-beta (GENERIC) #9: Mon Mar 17 12:37:18 MST 2003 [email protected]:/usr/src/sys/arch/sparc/compile/GENERIC real mem = 67002368 avail mem = 59125760 using 200 buffers containing 3346432 bytes of memory bootpath: /sbus@1, f8000000/esp@0, 800000/sd@1, 0 mainbus0 (root): SUNW, Sun 4/75 cpu0 at mainbus0: CY7C601 @ 40 MHz, TMS390C602A FPU; cache chip bug - trap page uncached cpu0: 64K byte write-through, 32 bytes/line, hw flush cache enabled memreg0 at mainbus0 ioaddr 0xf4000000 clock0 at mainbus0 ioaddr 0xf2000000: mk48t02 (eeprom) timer0 at mainbus0 ioaddr 0xf3000000 delay constant 17 auxreg0 at mainbus0 ioaddr 0xf7400003 zs0 at mainbus0 ioaddr 0xf1000000 pri 12, softpri 6 zstty0 at zs0 channel 0 (console i/o) zstty1 at zs0 channel 1 zs1 at mainbus0 ioaddr 0xf0000000 pri 12, softpri 6 zskbd0 at zs1 channel 0: reset timeout zskbd0: no keyboard zstty2 at zs1 channel 1: mouse audioamd0 at mainbus0 ioaddr 0xf7201000 pri 13, softpri 4 audio0 at audioamd0 sbus0 at mainbus0 ioaddr 0xf8000000: clock = 20 MHz dma0 at sbus0 slot 0 offset 0x400000: rev 1+ esp0 at sbus0 slot 0 offset 0x800000 pri 3: ESP100A, 25MHz, SCSI ID 7 scsibus0 at esp0: 8 targets sd0 at scsibus0 targ 1 lun 0: SCSI2 0/direct fixed sd0: 411MB, 1476 cyl, 9 head, 63 sec, 512 bytes/sec, 843284 sec total sd1 at scsibus0 targ 3 lun 0: SCSI2 0/direct fixed sd1: 2006MB, 8188 cyl, 3 head, 167 sec, 512 bytes/sec, 4110000 sec total le0 at sbus0 slot 0 offset 0xc00000 pri 5: address 08:00:20:13:10:b9

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 7/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

le0: 16 receive buffers, 4 transmit buffers cgsix0 at sbus0 slot 1 offset 0x0: SUNW, 501-2325, 1152x900, rev 11 wsdisplay0 at cgsix0 wsdisplay0: screen 0 added (std, sun emulation) fdc0 at mainbus0 ioaddr 0xf7200000 pri 11, softpri 4: chip 82072 fd0 at fdc0 drive 0: 1.44MB 80 cyl, 2 head, 18 sec root on sd0a rootdev=0x700 rrootdev=0x1100 rawdev=0x1102

This is the panic I got when attempting to start X:

panic: pool_get(mclpl): free list modified: magic=78746572; page 0xfaa93000; item addr 0xfaa93000 Stopped at Debugger+0x4: jmpl [%o7 + 0x8], %g0 RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! ddb> trace pool_get(0xfaa93000, 0x22, 0x0, 0x1000, 0x102, 0x0) at pool_get+0x2c0 sosend(0x16, 0xf828d800, 0x0, 0xf83b0900, 0x0, 0x0) at sosend+0x608 soo_write(0xfac0bf50, 0xfac0bf70, 0xfac9be28, 0xfab93190, 0xf8078f24, 0x0) at soo_write+0x18 dofilewritev(0x0, 0xc, 0xfac0bf50, 0xf7fff198, 0x1, 0xfac0bf70) at dofilewritev+0x12c sys_writev(0xfac87508, 0xfac9bf28, 0xfac9bf20, 0xf80765c8, 0x1000, 0xfac0bf70) at sys_writev+0x50 syscall(0x79, 0xfac9bfb0, 0x0, 0x154, 0xfcffffff, 0xf829dea0) at syscall+0x220 slowtrap(0xc, 0xf7fff198, 0x1, 0x154, 0x1, 0xfac87508) at slowtrap+0x1d8 ddb> ps PID PPID PGRP UID S FLAGS WAIT COMMAND 27765 8819 29550 0 3 0x86 netio xconsole 1668 29550 29550 0 3 0x4086 poll 15447 29550 29550 0 3 0x44186 poll xterm 8819 29550 29550 35 3 0x4186 poll xconsole 1238 29550 29550 0 3 0x4086 poll xclock 29550 25616 29550 0 3 0x4086 pause sh 1024 25523 25523 0 3 0x40184 netio XFree86 *25523 25616 25523 35 2 0x44104 XFree86 25616 30876 30876 0 3 0x4086 wait xinit 30876 16977 30876 0 3 0x4086 pause sh 16977 1 16977 0 3 0x4086 ttyin csh 5360 1 5360 0 3 0x84 select cron 14701 1 14701 0 3 0x40184 select sendmail 12617 1 12617 0 3 0x84 select sshd 27515 1 27515 0 3 0x184 select inetd 1904 1 1904 0 2 0x84 syslogd 9125 1 9125 0 3 0x84 poll dhclient 7 0 0 0 3 0x100204 crypto_wa crypto

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 8/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

6 0 0 0 3 0x100204 aiodoned aiodoned 5 0 0 0 3 0x100204 syncer update 4 0 0 0 3 0x100204 cleaner cleaner 3 0 0 0 3 0x100204 reaper reaper 2 0 0 0 3 0x100204 pgdaemon pagedaemon 1 0 1 0 3 0x4084 wait init 0 -1 0 0 3 0x80204 scheduler swapper

Thank you!

关于如何书写和递交错误报告的更多内容请参阅report.html。如何错误与您的硬件或硬件配置有关, 您应该提 供您硬件的详尽信息, dmesg(8)提供了对硬件的详细描述, 通常情况下这些描述已经足够开发者判断问题所在 了。对出现问题时情况的详尽描述也是必须的。 您会注意到上面dmesg(8)提供了对硬件的详细描述, 这些文 字解释了为什么聪明的用户知道他们的硬件并没有问题, (译者注:根据上面第二封电子的内容, 因为运行 OpenBSD3.2一切正常, 情况仅出现在安装3.3beta后运行X时), 什么导致了程序的崩溃(启动X), 并且输入调试命 令"ps"和"trace"。在这种情况下聪明的用户会将这些信息通过串口控制台输出到文件中;如果您不知道如何操 作, 那您只有用纸和笔把这些信息记录下来了。(这是一个真实的案例, 上面的第二封邮件中详尽的错误报告, 帮助OpenBSD开发者修正了OpenBSD3.3beta版在Sun4c系统中的一个程序错误。)

如果聪明的用户想用正在运行的OpenBSD系统提交一个错误报告的话, 那么就会使用sendbug(1)发送错误报告 给GNATS问题跟踪系统。很明显如果您的系统无法启动您就不能用sendbug(1)工作。但是您可以使用时您应 该尽量用它, 另外发生问题时详细的情况说明, 您的OpenBSD系统的详细配置以及错误在哪种情况下重复发生 等等这些信息也是必不可少的。使用sendbug(1)命令要求您的系统可以在因特网上发送电子邮件。说明 错误 报告服务器启用了spamd(8)(反垃圾邮件技术), 所以可能邮件可能会半小时后才可能被服务器接收到, 所以请 您保持耐心。

当您使用sendbug提交了一份错误报告后, 您会收到一封关于此报告目前状态的通知。开发人员也许会与您联 系, 并让您提供更多的情况, 或者给您提供一个补丁程序进行测试。您也可以自己访问OpenBSD的邮件列表 [email protected], 查询这个错误修补的进展情况, 如何订阅邮件列表请参阅mailing list page或在Bug Tracking System错误跟踪系统)的数据库中查询它的状况。

为开发人员提供的更多有用信息

这里有一些额外的小建议:

没有保存崩溃时的"Panic message"? 某些情形时, 您可能比没有记录下系统出问题时的第一手系统信息及出问题的原因。因为这个系统信息十分 重要, 所以您想要提交它, 那么好吧, 您可以在ddb>状态下用"show panic"命令像这样:

ddb> show panic 0: kernel: page fault trap, code=0 ddb>

在这个案列中, 崩溃信息是"Kernel: page fault trap, code=0"

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 9/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第二章 - OpenBSD其他信息

多处理器系统的特别说明: 您应该"trace"您的每一个处理器并将结果全写在报告里:

ddb{0}> trace pool_get(d05e7c20, 0, dab19ef8, d0169414, 80) at pool_get+0x226 fxp_add_rfabuf(d0a62000, d3c12b00, dab19f10, dab19f10) at fxp_add_rfabuf+0xa5 fxp_intr(d0a62000) at fxp_intr+0x1e7 Xintr_ioapic0() at Xintr_ioapic0+0x6d --- interrupt --- idle_loop+0x21: ddb{0}> machine ddb 1 Stopped at Debugger+0x4: leave ddb{1}> trace Debugger(d0319e28, d05ff5a0, dab1bee8, d031cc6e, d0a61800) at Debugger+0x4 i386_ipi_db(d0a61800, d05ff5a0, dab1bef8, d01eb997) at i386_ipi_db+0xb i386_ipi_handler(b0, d05f0058, dab10010, d01d0010, dab10010) at i386_ipi_handler+0x 4a Xintripi() at Xintripi+0x47 --- interrupt --- i386_softintlock(0, 58, dab10010, dab10010, d01e0010) at i386_softintlock+0x37 Xintrltimer() at Xintrltimer+0x47 --- interrupt --- idle_loop+0x21: ddb{1}>

对机器的每一个处理器, 在每个"machine ddb x"后重复使用trace命令。

[索引] [第一章 - OpenBSD介绍] [第三章 - 开始OpenBSD之旅]

[email protected] $OpenBSD: faq2.html, v 1.96 2009/01/30 22:25:57 sthen Exp $

http://www.9971.us/OpenBSD4.5/c/faq2.html(第 10/10 页)2009-5-3 23:01:19 OpenBSD 4.5 FAQ中文版 第三章 - 开始OpenBSD之旅

[索引] [第二章 - 其它OpenBSD信息] [第四章 - 安装指南]

3 - 开始OpenBSD之旅

目录

● 3.1 - 买一套OpenBSD CD

● 3.2 - 购买OpenBSD T恤

● 3.3 - OpenBSD提供ISO镜像文件下载吗?

● 3.4 - 通过FTP, HTTP或者AFS下载

● 3.5 - 选择硬件

● 3.6 - OpenBSD第一次安装在什么"系统"上合适?

3.1 - 买一套OpenBSD套装

支付一套OpenBSD CD 套装通常是最好的开端, 关于如何购买请参阅: OpenBSD订购页面。

您有很多理由购买一套OpenBSD CD:

● CD 套装销售是OpenBSD开发的主要经济来源。 ● 开发一套支持多平台的操作系统需要在设备方面进行长期的投资的支持。 ● 您的购买支持了OpenBSD今后持续的发展。 ● 这套OpenBSD套装包含了可执行二进制代码(和源程序)支持多数流行的平台。 ● 这套CD可以在许多平台上启动, 并且可以用于引导未预安装任何操作系统的计算机上。 ● 这套CD可以应付大多数的安装引导任务, 您甚至可以用它来安装一个正在开发中的快照 版。 ● 从CD安装比网络安装快速方便!并且可以节省OpenBSD服务器的资源占用, 最大程度上延长 了OpenBSD服务器的寿命。 ● OpenBSD CD套装通常带有一些非常精致的小帖饰, 您的系统拥有这些小帖饰将更加完美, 获取这些小帖饰的唯一渠道获是您购买OpenBSD的CD套装或者您捐赠硬件。 ● OpenBSD CD套装里包含了一系列常用的流行的第三方软件包packages, 这套CD包含了全套 的OpenBSD的程序和资料及开发环境, 您不必连上因特网四处搜寻了, 它们全在这些CD套装

http://www.9971.us/OpenBSD4.5/c/faq3.html(第 1/4 页)2009-5-3 23:01:23 OpenBSD 4.5 FAQ中文版 第三章 - 开始OpenBSD之旅

里了。

如果您安装一个OpenBSD的发行版, 您应该用OpenBSD官方的发行这套CD。

3.2 - 购买OpenBSD T恤

不错, 我们提供OpenBSD的个性纪念T恤衫, 关于如何购买请参阅OpenBSD T-shirts page, 希望您喜 欢:)

3.3 - OpenBSD提供ISO镜像文件下载吗?

从OpenBSD4.2开始, 我们选择了一些平台提供ISO镜像文件下载, 的确是这样的!

使用alpha, amd64, hppa, i386, macppc, sparc and sparc64平台的用户现在现在可以下载对应版本的安 装盘ISO镜像文件, 您可以用刻录软件将镜像文件制作成一张安装光盘。用它在这些平台上安装 OpenBSD。

需要说明的是这些ISO镜像文件并不等同于官方的发行版official CD套装, 这些ISO文件仅仅适用一 种平台, 并不包含已经经过编译的二进制软件包packages, 小帖饰, 或者随官方CD发行的艺术品。

OpenBSD项目并不提供发行版的CD镜像进行下载, 原因很简单, 我们希望人们购买OpenBSD的套 装来支持OpenBSD项目的持续发展。官方发行CD的版权归Theo de Raadt所有。Theo不允许其他人 再版发行OpenBSD官方发行版上的图像, 为了鼓励您购买OpenBSD的官方发行版CD套装, 我们提 供的CD套装里包含了一些额外的礼物让您觉得惊喜(包括一些艺术品, 小帖饰等)

需要指出的是仅有官方发行版CD的设计是有版权的, OpenBSD本身是免费的, 也没有其它因素阻 碍人们从FTP上下载OpenBSD并制作他们自己的CD。

OpenBSD开发者在一些平台上为那些想得到一张CD启动盘的人们准备了启动光盘镜像文件cd44. iso, 这个镜像文件很小, 只有几兆, 它仅包含了启动和安装文件, 并允许您通过OpenBSD的FTP服务 器完成剩下的安装任务。

3.4 - 通过FTP, HTTP或AFS下载OpenBSD

因特网上有众多的FTP, HTTP镜像服务器提供了OpenBSD发行版及快照版的下载, 也有的采用了 AFS方式, 您需要寻找距离您比较近速度快的服务器。在您下载之前您可以利用ping(8)和traceroute (8)确认哪个OpenBSD镜像站点离您最近, 速度最快。当然了如果您购买的OpenBSD官方发行版, 那 么安装速度比无论哪个镜像站点的速度全要快。有效的FTP, HTTP, AFS, RSYNC镜像站点可以在 OpenBSD镜像站点上找到。

http://www.9971.us/OpenBSD4.5/c/faq3.html(第 2/4 页)2009-5-3 23:01:23 OpenBSD 4.5 FAQ中文版 第三章 - 开始OpenBSD之旅

OpenBSD FTP page.

3.5 - 选择硬件

选择合适的硬件来运行您的OpenBSD系统是很重要的, 因为它意味着您可否成功。

如果您正打算购买一台新PC, 不管是买散件组装还是购买整机, 您首先需要确保的是您购买的是可 靠的部件, 在PC行业这并非易事。残次品、不稳定或不兼容的部件经常会导致OpenBSD运行性能 低下甚至崩溃。我们给您的最好的建议是小心一些, 购买那些知名和经过权威机构检验的品牌, 有 时高价格意味着更好的品质, 而有时它也可能就是昂贵而已。

一些重要的原则可以帮助您选择一个高性能的系统;

● 根据程序挑选硬件: 让您的硬件适合您的应用程序永远比让应用程序设计适应硬件好, 因为 您必须用程序工作。 ● 鉴别您的系统瓶颈: 如果您的应用程序受限于磁盘I/O, 就别多花钱追求最高端的CPU;如果 您的系统受限于网速, 放弃高速硬盘;如果瓶颈是128kbps的DSL线路, 那其它部件就别浪费 了。 ● 使用简单的系统: 简单系统出现的问题往往容易解决, 复杂的系统并非总出问题, 可一旦有问 题您就要花很长的时间解决。 ● 使用您了解的硬件, 或在把新硬件部署在生产环境前学习它们的知识: 无论新硬件有什么技 术上的优势, 在您不熟悉它之前(它怎样才能正常工作, 什么情况下可能出现问题)就委托它 完成重要任务是极不明智的。 ● 使用多块硬盘:买几块小硬盘而非一块大硬盘, 尽管这意味着要多花些钱。在几块磁盘上分 配数据负荷可以减少每块磁盘上的数据读些时间。并且使用RAID技术会使您的系统将更稳 定和具有更快的数据存取速度。 ● 将大块数据分割成小块: 很多人在设计系统时会犯一个错误, 就是把大量的数据存放在磁盘 上一个巨大的数据块中, 这通常是一个失败的设计, 一般情况下您会发现将您的数据分割成 易于管理的一些小型数据块更好, 这样做有很多优点, 两个最重要的是您现在仅需购买小容 量硬盘, 当您今后需要时可以轻松地增加更多的硬盘(您永远估计不出今后可能的需求, 没人 有这本事), 还有就是等到以后价格看起来真的已经很低了, 并且性能也已经提升了再买也许 更好。 ● 不选用廉价的网卡: OpenBSD支持大量的廉价网卡, 这些网卡在家庭、低吞吐量的企业和研 究机构中工作得很好, 但是如果您希望您的服务器具有高吞吐量和高稳定性, 您最好买一块 高质量的网卡。遗憾的是, 一些名牌网卡并不比廉价网卡好多少, 并且一些潜质非常好的网 卡并没有提供准确地文档可用来为其写出最佳的驱动程序。1000M网卡因为有更大的缓存, 所以即便用在低速网络也比10M或100M网卡有更好的性能。

3.6 - OpenBSD第一次安装在什么"系统"上合适?

与其它现代大多数操作系统相比, 虽然OpenBSD在一台小的、旧的和低性能的机器上就能运行得

http://www.9971.us/OpenBSD4.5/c/faq3.html(第 3/4 页)2009-5-3 23:01:24 OpenBSD 4.5 FAQ中文版 第三章 - 开始OpenBSD之旅 很好, 但是如果您刚开始接触OpenBSD, 在一台性能很低的计算机上运行它可能会令您沮丧。下面 这些指南仅是建议性的, 实际OpenBSD可以运行在比下列条件更简陋的设备上, 不过这对初学者来 说并不合适。

● 平台: 使用一个您熟悉的平台。当您学习一个新的操作系统时, 如果同时也需要学习一个新 平台那将是非常糟糕的。 我们这里假设您使用i386平台, 因为它可能是大多数人熟悉的平 台。 ● 处理器: 100MHz Pentium 或更好的处理器。没错, OpenBSD也可以运行在一个25MHz的 80486上, 但是如果您真想学习一个新的操作系统, 当您做试验、有问题或重新加载程序时您 肯定不想使用一台非常慢机器。 如果您的处理器主频低于100MHz, 您的第一个遇到的麻烦 就是通过SSH登陆这台计算机将花费很长的时间, 如果您想运行 X , 您的处理器主频可能至 少需要200MHz以上。实际 X 一旦启动可以运行在主频更低的处理器上, 但是引导和启动 X 会花相当长的时间。 ● 64M 内存或更多: 如果要运行 X , 至少需要128M内存。 ● 硬盘: 使用一块1G的硬盘您可以轻松安装一个简单的系统, 诸如:防火墙、DNS服务器、或其 它类似的系统。如果您想从源代码重新构建系统, 您可能需要4G的硬盘, 如果您还想重新构 建 X , 您需要6G或更大的硬盘。刚开始推荐使用IDE硬盘。如果您有一块大得多的硬盘, 您 不必在最初分区时占用全部空间——如果您的系统仅需要8G空间, 您在一个80G的硬盘上留 下72G空间未划分这很正常。 ● 网卡: 使用一个PCI网卡, 尽管您可能跃跃欲试您老式的ISA网卡, 但等等, 您可能已经忘记怎 样正确的配置它了。如果您打算在计算机上安装多块网卡, 记住在合上机箱盖之前先把网 卡背面上的MAC地址记录下来。 ● 多系统启动: 如果您第一次安装OpenBSD, 别指望能与其它OS多系统启动, 正确设置多系统 启动是一个很难的步骤, 您在进行这个工作之前需要很好地了解它包含的所有操作系统, 很 显然您第一次安装OpenBSD时并不符合这个条件。很可能您会因误操作删除系统上的所有 数据, 所以您最好使用一台专用的电脑进行首次OpenBSD安装, 至少是一块专用的硬盘。 ● 笔记本: 尽管在很多笔记本电脑上OpenBSD运行得很好, 但有时它们并非最容易配置的系统, 所以如果您初次安装OpenBSD, 笔记本电脑并非最佳之选。然而, 一旦您喜欢上了OpenBSD, 一台笔记本电脑将是非常有用的工具。 ● 新硬件: 有时OpenBSD不支持最新、最高端的硬件, 所以作为您的第一个OpenBSD系统, 我们 推荐您使用一台稍微旧一些的电脑。

很显然, 您的系统配置好一些更利于OpenBSD的运行。 一些最新的程序完全有能力充分使用您的 处理器和内存。

[索引] [第二章 - 其它OpenBSD信息] [第四章 - 安装指南]

[email protected] $OpenBSD: faq3.html, v 1.60 2008/10/31 16:52:29 nick Exp $

http://www.9971.us/OpenBSD4.5/c/faq3.html(第 4/4 页)2009-5-3 23:01:24 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

[索引] [第三章 - 开始OpenBSD之旅] [第五章 - 从源代码构建系统]

4 - OpenBSD 4.5 安装指南

目录

● 4.1 - OpenBSD系统安装步骤概述

● 4.2 - 安装前的信息检查

● 4.3 - 制作可启动的OpenBSD安装介质

❍ 4.3.1 - Unix里制作启动软盘

❍ 4.3.2 - Windows或者DOS里制作启动软盘

❍ 4.3.3 - 制作一张可启动CD

● 4.4 - 启动OpenBSD安装介质

● 4.5 - 执行安装

❍ 4.5.1 - 开始安装

❍ 4.5.2 - 建立磁盘分区

❍ 4.5.3 - 设置主机名称

❍ 4.5.4 - 配置网络

❍ 4.5.5 - 选择安装介质

❍ 4.5.6 - 选择组件

❍ 4.5.7 - 完成安装

● 4.6 - 安装需要哪些组件?

● 4.7 - OpenBSD安装需要多少磁盘空间?

● 4.8 - 设置多重启动OpenBSD/i386

● 4.9 - 完成安装后给[email protected]发送您的dmesg信息

● 4.10 - 安装后添加程序

● 4.11 - 什么是'bsd.rd'?

● 4.12 - 常规的安装问题

❍ 4.12.1 - 我的Compaq机仅识别出16M内存

❍ 4.12.2 - 我的i386安装后不能启动

❍ 4.12.3 - 我的老爷机已经启动了, 但是卡在了ssh-keygen这个步骤

❍ 4.12.4 - 我在安装时得到信息"Failed to change directory"

❍ 4.12.5 - 我的分区乱七八糟或是空的!

❍ 4.12.6 - 我的机器上没有软驱和光驱

● 4.13 - 定制化安装过程

● 4.14 - 我怎样部署一些相似的系统?

● 4.15 - 我怎样获取dmesg(8)信息并反馈?

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 1/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南 4.1 - OpenBSD 安装步骤概述

OpenBSD有一个充满活力适应性很强的基于字符的安装程序, 并且可以把它存放在一张软盘里。很多平台全使用一个 类似的安装程序;但不管怎么说它们在细节方面存在差异。在所有情况下您绝对应该阅读相关平台的INSTALL文档, 它 在CD-ROM或FTP站点上的相关平台目录内(例如:i386/INSTALL.I386, mac68k/INSTALL.Mac68k或者sparc/INSTALL. Sparc)

OpenBSD安装程序使用了带有多种功能及安装脚本的特殊安装内核, 先把安装内核加载到内存中建立的一块虚拟磁盘 上, 安装内核启动后操作系统将释放安装介质内的tar(1) (.tgz)格式的压缩文件到硬盘。可以用几种方式可以启动安装内 核:

● 软盘: OpenBSD提供的软盘镜像文件可以被用来制作一张安装软盘, 它可用其它Unix-like系统, 或者在Windows系 统制作安装软盘。 这些软盘镜像的文件名是floppy45.fs, OpenBSD提供几种各种平台的各种软盘镜像。 ● CD-ROM: 在一些平台上提供了提供了两种CD启动镜像文件, 其中cd45.iso镜像文件是仅用来启动, 而镜像文件 install45.iso则可以用来启动并完成安装 。 ● 已存在分区: 您也可以在已经安装了系统OpenBSD电脑上从硬盘启动, 将安装内核加载到内存上的虚拟磁盘 RAM disk中, 用来执行升级或者重新安装系统。

● 通过网络启动:一些平台支持从网络上启动(如用PXE 或其它的网络启动模式)。

● 将一个分区镜像写入磁盘(miniroot): 您也可以把现有的文件系统镜像写入一个的磁盘分区内, 并用这个新分区启 动。 ● 通过磁带启动:一些平台支持从磁带启动, 关于启动磁带的制作方法参看 INSTALL.platform 文件的具体说明。

并非每种平台全支持所有的启动方式:

● alpha: 软盘, 光盘, 网络, 将软盘镜像写入硬盘。

● amd64: 软盘, 光盘, 网络。

● armish: 每种机型不同。

● hp300: 光盘, 网络。

● hppa: 网络。

● i386: 软盘, 光盘, 网络。

● landisk: miniroot(参看前面), 从另一台计算机安装系统。

● mac68k: 用Mac OS上的启动工具, 具体请参看 INSTALL.mac68k。

● macppc: 光盘, 网络。

● mvme68k: 网络, 磁带。

● mvme88k: 网络, 磁带。

● sparc: 软盘, 光盘, 网络, 磁带, 文件系统镜像写入一个交换分区。

● sparc64: 软盘 (仅U1/U2), 光盘, 网络, 磁带, 文件系统镜像写入一个交换分区。

● vax: 软盘, 网络。

● zaurus: 从linux分区启动bsd.rd文件, 具体请参看INSTALL.zaurus。

所有的平台也可以使用bsd.rd来进行重新安装系统或升级。

一旦安装内核被加载后, 您可以选择从哪里复制 系统安装组件, 再次声明一下, 不是每种平台都支持所有的安装方式。

● CD-ROM: 当然了, 我们推荐您使用OpenBSD的官方CD套装, 但您也可以使用install45.iso或者您自己制作一个您 自己的。 ● FTP: 您可以挑选任何一个OpenBSD的FTP镜像站点, 或者您本地的拥有OpenBSD组件包的FTP站点。 ● HTTP: 您可以挑选任何一个OpenBSD的HTTP镜像站点 , 或者您本地的拥有OpenBSD组件包的HTTP站点。

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 2/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

● Local disk partition: 很多时候, 您可以通过将安装组件包存放在在本地的另一个磁盘分区上, 并从那个磁盘分区进 行本地安装。例如:在i386系统您可以从一个FAT分区上进行安装, 或者您从一个符合ISO9660, Rock Ridge或 Joliet 格式的光盘上安装系统。在某些情况下您可能先需要手工挂载这些文件系统以便使用。 ● NFS:一些平台支持使用NFS 挂载安装组件。 ● Tape: 一些平台支持从磁带上读取OpenBSD的安装组件包。 关于如何制作支持安装启动的磁带请参看INSTALL. platform文档。

4.2 - 预安装清单

在您开始进行安装之前, 您起码应该考虑到安装过程中可能被问到的问题, 别不提前准备到时候措手不及。这里提醒您 至少应该知道一些信息:

● 机器型号 ● 已有或可能添加的硬件 ❍ 到您的生产商主页上查询并效验您机器的兼容性列表 ❍ 如果是老式的的ISA接口的计算机, 请检查您的设置并确认符合OpenBSD的要求 ● 您将使用哪种方式安装系统(CD-ROM, FTP等) ● 如果您需要安装一个重要的补丁程序, 您用哪种方式进行系统更新? ❍ 如果需要在本地完成更新, 您需要有充分的空间用来存放更新了的系统源码树, 并对系统源码树进行编译

❍ 否则, 您需要通过另一台计算机为您的发行版创建补丁。

● 怎样分配磁盘空间 ❍ 现存数据是否需要备份到其它地方? ❍ 是否OpenBSD可以与其它操作系统共享一台计算机?怎样让两个系统全可以启动?您需要安装启动管理器 "boot manager"吗? ❍ 是否全部硬盘空间只给OpenBSD使用, 或者您需要保留一个现有的磁盘分区/操作系统(或者留一块空间为 今后备用)? ❍ 您希望如何细分OpenBSD的分区? ● 如果您不用DHCP方式获取您的IP地址, 您如何设定网络: ❍ 主机名称 ❍ 您的域名服务器及它们的IP地址 ❍ 每块网卡的IP地址及子网掩码 ❍ 网关的IP地址 ● 您准备运行"X Window"系统吗?

4.3 - 制作可启动的OpenBSD安装介质

我们以 i386和 sparc平台为例。 i386 平台有六个不同的安装镜像供您选择:

● floppy45.fs (适用于台式机)支持数量众多的PCI及ISA网卡, 支持IDE和简单的SCSI适配器以及部分PCMCIA接口设 备。多数用户可以选择这个软盘镜像文件用来启动和安装系统OpenBSD系统。 ● floppyB45.fs (适用于服务器)支持数量众多的RAID控制器, 和一些常规的SCSI适配器.但是镜像里删除了许多的标 准的SCSI适配器的和众多的EISA, ISA网卡的驱动。 ● floppyC45.fs (笔记本电脑) 支持许多笔记本电脑的CardBus 和PCMCIA装置。 ● cd45.iso 这是一个符合ISO9660标准的ISO光盘镜像文件, 您可以用它在绝大多数的CD-ROM或是DVD-ROM刻录 机上制作出可以启动的光盘, 并可以应该在任何平台上, 这张镜像包含了所有的驱动程序, 如果您的机器可以从 光驱启动, 通常推荐这个镜像文件。 ● cdemu45.iso 这也是一个符合ISO9660标准的ISO镜像文件, 但它是采用了模拟软驱的方法, 模拟了一张2.88M软驱 镜像文件。这是按照少量特殊用户的需要打造的, 通常大多数人使用cd45.iso这个镜像文件就可以了, 只有在cd45.

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 3/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

iso这个文件不起作用时我们才推荐您使用cdemu45.iso这个镜像文件。 ● install45.iso 符合ISO9660标准的镜像文件, 包含了所有的安装文件。这个镜像制作出来的光盘可以独立的完成 OpenBSD的安装任务。

对了, 可能有这样一种情形就是您既需要一张支持您的SCSI适配器的镜像文件又需要另一个支持您网卡的镜像文件那 该用哪个好呢?幸运的是这种事情不常发生, 通常已经被解决了。 sparc平台有四个不同的安装镜像供您选择:

● floppy45.fs: 支持从软盘启动安装系统 。 ● cd45.iso 一个光盘镜像文件 , 可以用来制作您自己的光盘。 ● miniroot45.fs 可以被写入交换分区并启动。 ● install45.iso符合ISO9660标准的镜像文件, 可用来制作安装启动光盘。

4.3.1 - Unix里制作启动软盘

在Unix里格式化一张软盘软盘使用命令fdformat(1), 它可以格式化软盘并发现坏扇区。

# fdformat /dev/rfd0c Format 1440K floppy `/dev/rfd0c'? (y/n): y Processing VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV done.

如果您格式化时终端显示像上面的例子这样, 恭喜您, 您的软盘已经格式化完毕了;如果您看见的不全是"V", 那么这张软 盘恐怕已经有坏块了, 您应该更换一张新软盘。 说明:有些Unix-like系统的格式化软盘命令不尽相同, 请参阅您的操作系统的说明文档一确认输入正确的命令。 一旦您格式化好了一张软盘, 就可以把镜像文件写在这张软盘上了, 您可以用dd(1)命令。下面是用dd命令的一个例子:

# dd if=floppy45.fs of=/dev/rfd0c bs=32k

一旦镜像文件被写入软盘, 用cmp(1)命令检查软盘和镜像文件是否一致, 如果相同您会终端上看见其余的显示。

# cmp /dev/rfd0c floppy45.fs

4.3.2 - 在Windows or DOS里制作启动软盘

这一小节将教您如果在windows或dos里制作启动软盘, 您可以从任何FTP镜像站点的tools 目录中找到我们提到的软件, 如果您有OpenBSD发行套装, 这些工具在第一张光盘内。 为了在微软的windows或DOS里制作启动软盘, 请先执行微软自带的格式化操作来格式化软盘。 将镜像文件写入软盘您可以使用rawrite, fdimage或者ntrw, 注意rawrite 在Windows NT, 2000 or XP下无法工作。

使用rawrite:

C:\> rawrite RaWrite 1.2 - Write disk file to raw floppy diskette Enter source file name: floppy45.fs Enter destination drive: a

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 4/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

Please insert a formatted diskette into drive A: and press -ENTER- : Enter

使用 fdimage:

C:\> fdimage -q floppy45.fs a:

使用 ntrw:

C:\> ntrw floppy45.fs a: 3.5", 1.44MB, 512 bytes/sector bufsize is 9216 1474560 bytes written

4.3.3 - 制作一张可启动CD

您可以用cd45.iso或者install45.iso这两个镜像文件中的一个制作可启动的安装CD盘。具体您用何种软件制作光盘, 看您 自己了。

OpenBSD 里的一些工具:

● mkhybrid(8)

● cdrecord, part of the cdrtools collection in the OpenBSD的Packages和Ports系统。

● cdio(1)'s "track at once" (tao) recording option.

4.4 - 启动OpenBSD安装介质

启动 i386/amd64

在i386或amd64平台上启动由镜像文件制作的介质(软盘或光盘)对很多人来说并不陌生, 如果您用软盘把它插到软驱里 重新启动系统就可以了, 安装镜像将被引导, 另外请注意在您的计算机的BIOS里设置成先从软盘引导;如果您想从光盘 启动, 也别忘了在BIOS里设置成先从光盘引导。有些老主板的BIOS不能选择从光盘引导, 别担心, 即使您用软盘引导一 样可以从光盘进行安装。 您也可以从一个已经存在的OpenBSD分区中用bsd.rd 来引导, 或者通过网络用PXE boot process.

启动 sparc/sparc64

说明:在sparc64平台上, 只有SBus(Ultra 1, Ultra 2)可以从软盘启动。

把写入OpenBSD安装镜像的软盘放入软驱内, 然后用下列命令从软盘启动系统:

ok boot floppy

从光驱启动, 把OpenBSD光盘放入光驱中, 如果您的SUN机器只有一个光驱, 那您只需要在启动提示符下输入'boot cdrom':

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 5/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

ok boot cdrom

当然, 这仅在新命令模式提示符下有效, 如果您处于老命令模式(一个向右的箭头)可以输入"n", 先进入新命令模式。(如 果您使用的是老式的sparc就像pre-sun4c, 您可能没有新命令模式.这时您就需要自己试试了)。如果您有多个光驱, 您必 须从正确的那个光驱启动, 您可以通过在新命令模式下"probe-scsi"

ok probe-scsi Target 0 Unit 0 Disk QUANTUM LIGHTNING 365S Target 1 Unit 0 Removable Disk QUANTUM EMPIRE_1080S Target 3 Unit 0 Removable Disk Joe's CD-ROM

指出到底您要从哪个CD-ROM启动, 留意一下target number。

ok boot /sbus/esp/sd@X, 0

4.5 - 执行安装

4.5.1 - 开始安装

无论怎样您已经了解了启动的含义, 让我们先启动系统吧, 在启动的过程中安装内核和用于安装OpenBSD系统的文件被 加载到内存中。在启动中遇到的最常见问题是一个损坏的软盘或驱动器队列错误(drive alignment problem), 软盘里几乎 装满了文件--无论哪里有一个坏块就会导致出现问题。

OpenBSD安装过程中, 您可以随时键入"Ctrl+C"中断正在进行的安装, 需要重新安装系统时只需在shell中键入"install"就可 以了, 而不必重新启动系统。 如果您启动成功, 您会看到很多的滚屏信息, 很多是蓝底白字格式的文字, 这些信息就是dmesg, 内核告诉您它在哪里发 现了哪些设备。您不用着急把这些信息记下来, 因为有一份拷贝存放在 /var/run/dmesg.boot。

然后, 您会看到下面的信息:

root on rd0a swap on rd0b dump on rd0b erase ^?, werase ^W, kill ^U, intr ^C, status ^T (I)nstall, (U)pgrade or (S)hell?i

到这里, 我们的第一个问题来了, 多数情况下会您会看见有这三个选项显示:

● Install(安装): 将OpenBSD安装在您的电脑上, 会删除掉电脑上的一切文件。注意可能安装程序不会对某些分区进 行格式化, 如 /home, 而其它的都将被重写。 ● Upgrade(升级): 在这台计算机上安装更新的程序包install files , 但是不会修改原有的配置文件, 用户数据或其它程 序。没有磁盘被格式化, /etc或/var目录不会被重写, 一些重要说明: ❍ 这里没有etc45.tgz 这个组件包的选项, 升级完成后您只能手动 manually merge将etc45.tgz组件中的改动加入 到您的系统中, 然后它们才可以完全起作用。这一步非常关键, 您一定要做, 否则您的某些关键服务(比如 (4))将无法启动。

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 6/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

❍ 升级仅在相邻版本间才有效, 跨越版本的升级是不支持的。对OpenBSD4.5版本而言, 只支持从4.4升级到 4.5, 如果您打算升级一个老版本, 请先升级到它的新一级版本, 或者您的版本太老了已经不提供支持了, 请 您考虑重新安装一个新系统。 更多的关于升级的信息请参阅 OpenBSD 升级指南 4.5。

● Shell(进入控制台):有些时候, 您需要修补或维护您的系统, 这时不想或不能正常启动的系统内核, 这个选项可以使 您维护系统, 安装光盘或软盘里有一系列这样的重要工具。

有时, 您看不见进行升级的"Upgrade" 选项。 在系统检修时, 不可能直接升级; 必须重新进行安装。

在这个例子中我们讨论一下install(全新安装), 但是Upgrade(升级)也是类似的:

Welcome to the OpenBSD/i386 4.5 install program.

This program will help you install OpenBSD. At any prompt except password prompts you can escape to a shell by typing '!'. Default answers are shown in []'s and are selected by pressing RETURN. At any time you can exit this program by pressing Control-C, but exiting during an install can leave your system in an inconsistent state.

Terminal type: [vt220] Enter kbd(8) mapping? ('L' for list) [none] Enter

多数情况时选择默认的终端就好了, 但是如果您使用serial console, 您不能选默认值, 应该选择适当的终端。

如果您没有选择一个键盘编码, 系统会假设您使用的是US格式键盘。

IS YOUR DATA BACKED UP? As with anything that modifies disk contents, this program can cause SIGNIFICANT data loss.

It is often helpful to have the installation notes handy. For complex disk configurations, relevant disk hardware manuals and a calculator are useful.

Proceed with install? [no] y

这里问您是不是继续安装系统, 如果这里您选择默认的"[no]"系统将中断安装, 并且把您带到shell界面。

安装说明可以参考CD, FTP上的INSTALL.plat文件, 其中plat是指您的平台类型, 例如i386。

4.5.2 - 建立磁盘分区

重要说明: 那些拥有大硬盘的用户 (这里指在您原来计算机的配置基础上安装了更大硬盘的用户) 进行下一步之前请先 阅读这一小节。 在OpenBSD中设置磁盘分区会因计算机平台的不同而略有差异, 对i386, amd64, macppc, zaurus和armish, , 建立磁盘分区 分两个阶段, 首先用fdisk命令分出OpenBSD 在硬盘上使用的片(slice), 然后用disklabel 将这个"片"再分成OpenBSD的不同 分区。

有些用户可能对这里用的术语很迷惑, 因为我们两次用的分区 "partition" 这个词, 但是含义不同, 这没错, 这是OpenBSD

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 7/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

分区中两个不同的层次, 首先第一层分区指的是不同操作系统之间的磁盘使用划分, 划出一块磁盘空间由OpenBSD单独 使用(译者注:比如OpenBSD, windows, Linux...... 在一块硬盘上), 第二层分区是将第一层分区再用disklabel划分成OpenBSD 不同的文件系统。dos或Wndows的用户可以在分区表内看见第一个分区, 第二层分区仅有OpenBSD或那些可以直接读 取OpenBSD分区的操作系统才可以看得到。

Cool! Let's get to it.

You will now initialize the disk(s) that OpenBSD will use. To enable all available security features you should configure the disk(s) to allow the creation of separate filesystems for /, /tmp, /var, /usr, and /home.

Available disks are: wd0. Which one is the root disk? (or done) [wd0] Enter root disk是指系统从这块磁盘上启动, 一般交换分区也放在这个盘上, IDE硬盘被显示为wd0, wd1...... , SCSI硬盘和RAID设 备被显示为 sd0, sd1...., OpenBSD认出的所有磁盘全会在这里显示出来--如果您的磁盘没有显示出来, 可能是不支持或者 硬件配置错误。

Do you want to use *all* of wd0 for OpenBSD? [no] Enter

如果您选"yes", 整个硬盘将会分派给OpenBSD。这会将标准的MBR和分区表(Master Boot Record and partition table)写入 硬盘 —— 只有一个分区, 同时也是启动分区, 占用了整个硬盘, 类型是OpenBSD, 这种分区方式是安装OpenBSD系统时 用的最多的一种;不管怎么说有些系统您不能这样做, 如:很多Compaq系统、很多笔记本电脑、一些Dell和其它系统, 它 们在硬盘上划分了一个"maintenance" 或者"Suspend to Disk"分区, 如果您想保留那些分区, 请不要选择"yes", 相反如果您是 用一块新硬盘安装OpenBSD系统, 可能您会选择"yes", 或者使用fdisk的update选项也可能会选择"yes", 这样您可以得到一 个标准的MBR和分区表。

为了举例方便:我们假设磁盘上已经有了一个windows 2000操作系统的分区, 我们要在上面画分出一块OpenBSD, 所以我 们使用默认选项"no", 系统会带我们进入fdisk(8)界面, 有关fdisk的更多信息请参看fdisk(8)。

说明: 如果你在 "Do you want to use *all* of wd0 for OpenBSD?" 是的回答是"Y", 或者您所用的平台不用fdisk (例如, sparc64), 您不会看见下面的画面, 可能直接跳转到creating a disklabel。

You will now create a single MBR partition to contain your OpenBSD data. This partition must have an id of 'A6'; must *NOT* overlap other partitions; and must be marked as the only active partition.

The 'manual' command describes all the fdisk commands in detail.

Disk: wd0 geometry: 2434/255/63 [39102336 Sectors] Offset: 0 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------*0: 0B 0 1 1 - 195 254 63 [ 63: 3148677 ] Win95 FAT-32 1: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused 2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused 3: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused Enter 'help' for information

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 8/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

fdisk: 1> help help Command help list manual Show entire OpenBSD for fdisk reinit Re-initialize loaded MBR (to defaults) setpid Set the identifier of a given table entry disk Edit current drive stats edit Edit given table entry flag Flag given table entry as bootable update Update machine code in loaded MBR select Select extended partition table entry MBR swap Swap two partition entries print Print loaded MBR partition table write Write loaded MBR to disk exit Exit edit of current MBR, without saving changes quit Quit edit of current MBR, saving current changes abort Abort program without saving current changes fdisk: 1>

一些命令很有必要在这里详细解释一下:

● r 或 reinit: 清除现存的磁盘分区表, 用整个磁盘安装一个大的OpenBSD分区, 并将其标记为激活, 设置OpenBSD的 MBR code, 等同于在"Do you want to use *all* of wd0 for OpenBSD?"时回答"yes", 您准备把一块新硬盘完全给 OpenBSD使用时也许会这样做。 ● p 或 print: 显示当前分区表的扇区内容, "p m"以兆字节显示, "p g"以吉字节显示。 ● e 或 edit: 编辑或修改分区表。 ● f 或 flag: 把一个分区标记为激活, 系统将从这个分区启动。 ● u 或 update: 用OpenBSD boot code更新MBR , 有点像"reinit", 只是不改变现有分区表。 ● exit 和 quit: 小心使用, 像有些人把这两个命令的意思搞颠倒了。

这里再强调一遍, 分区时的一个错误可能会导致您重要数据的丢失。如果您将进行分区操作的的磁盘上有重要数据, 您 应该在其它的磁盘上先练练手再说, 还有, 别忘了先备份您的数据。

我们的磁盘上有一个1.5G的 windows 2000的分区(采用的是FAT文件系统), 从上面显示的信息我们可以看到Windows分 区已经占用了磁盘的前195个柱面, 因此, 我们可以把剩下的分配给OpenBSD, 从第196个柱面开始, 因为Windows 2000的 起始扇区是63, 它的大小是3148677, 通过两者相加您可以计算出OpenBSD的起始扇区是3148740。

您可以用柱面/头/扇区(Cylinder/Heads/Sectors)的分区布局来规划您的磁盘或仅用raw扇区, 哪种更简单, 取决于您的用 途;这个例子中我们对已存在分区的磁盘进行处理, 使用CHS格式似乎更容易些。如果您划分的是这块硬盘的第一个分 区, 用raw扇区更简单。

fdisk: 1> e 1 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------1: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused Partition id ('0' to disable) [0 - FF]: [0] (? for help) a6 Do you wish to edit in CHS mode? [n] y BIOS Starting cylinder [0 - 2433]: [0] 196 BIOS Starting head [0 - 254]: [0] Enter BIOS Starting sector [1 - 63]: [0] 1 BIOS Ending cylinder [0 - 2433]: [0] 2433

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 9/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

BIOS Ending head [0 - 254]: [0] 254 BIOS Ending sector [1 - 63]: [0] 63 fdisk:*1> p Disk: wd0 geometry: 2434/255/63 [39102336 Sectors] Offset: 0 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------*0: 0B 0 1 1 - 195 254 63 [ 63: 3148677 ] Win95 FAT-32 1: A6 196 0 1 - 2433 254 63 [ 3148740: 35953470 ] OpenBSD 2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused 3: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused fdisk:*1> p m Disk: wd0 geometry: 2434/255/63 [19093 Megabytes] Offset: 0 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------*0: 0B 0 1 1 - 195 254 63 [ 63: 1537M] Win95 FAT-32 1: A6 196 0 1 - 2433 254 63 [ 3148740: 17555M] OpenBSD 2: 00 0 0 0 - 0 0 0 [ 0: 0M] unused 3: 00 0 0 0 - 0 0 0 [ 0: 0M] unused fdisk:*1>

在使用fdisk作为分区工具的平台上有一点十分重要, 也就是不要把第一个分区放在磁盘的第一个磁道上, 在上面的例子 里第一个分区是从第63个扇区开始的。具体从哪里开始不同的计算机之间还有不同的磁盘系统之间是有差别的。如果 一个OpenBSD分区产生时偏移量是0, 这个分区表的后面就会被分区引导记录分区引导记录覆盖。这个系统可能还可以 启动, 但是它将很难维护, 这种做法是不被推荐或支持的。注意那里的提示符已经改变了, 多了一个星号(*), 那是提醒您 还没有保存, 我们输入"p m"后能看到我们没有改变windows分区, 我们顺利地把剩余的空间分配给了OpenBSD, 而且分区 间没有重叠, 到目前为止我们干的还不错。

我们还需要作的就是把这个OpenBSD的分区标记为active, 这样下次计算机就会启动OpenBSD了:

fdisk:*1> f 1 Partition 1 marked active. fdisk:*1> p Disk: wd0 geometry: 2434/255/63 [39102336 Sectors] Offset: 0 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------0: 0B 0 1 1 - 195 254 63 [ 63: 3148677 ] Win95 FAT-32 *1: A6 196 0 1 - 2433 254 63 [ 3148740: 35953470 ] OpenBSD 2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused 3: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused fdisk:*1>

现在我们可以保存了:

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 10/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

fdisk:*1> w Writing MBR at offset 0. wd0: no disk label fdisk: 1> q

译者注:注意一下:这里把分区一设置为活动分区, 这样, 您的计算机启动时就会直接启动OpenBSD, 但是您的Windows就 启动不起来了, 若您还需要启动Windows, 就需要参照后面的多安装这一节内容, 假使您现在已经用了这个命令, 也没关 系, OpenBSD重启后, 用fdisk把分区0重新设置成活动的, 这样Windows就能启动起来了。

建立 disklabel

接下来我们通过disklabel(8)来划分OpenBSD分区(文件系统), 关于使用disklabel(8) 更详尽的信息请参阅FAQ 14, disklabel。

Here is the partition information you chose:

Disk: wd0 geometry: 2586/240/63 [39100320 Sectors] Offset: 0 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------0: 0B 0 1 1 - 202 239 63 [ 63: 3069297 ] Win95 FAT-32 *1: A6 203 0 1 - 2585 239 63 [ 3069360: 36030960 ] OpenBSD 2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused 3: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused

You will now create an OpenBSD disklabel inside the OpenBSD MBR partition. The disklabel defines how OpenBSD splits up the MBR partition into OpenBSD partitions in which filesystems and swap space are created.

The offsets used in the disklabel are ABSOLUTE, i.e. relative to the start of the disk, NOT the start of the OpenBSD MBR partition.

# Inside MBR partition 1: type A6 start 3148740 size 35953470 Treating sectors 3148740-39102210 as the OpenBSD portion of the disk. You can use the 'b' command to change this.

Initial label editor (enter '?' for help at any prompt) > ? Available commands: ? [command] - show help n [part] - set mount point a [part] - add partition p [unit] - print partitions b - set OpenBSD boundaries q - quit & save changes c [part] - change partition size r - display free space D - reset label to default s [path] - save label to file d [part] - delete partition u - undo last change e - edit drive parameters w - write label to disk g [d | u] - [d]isk or [u]ser geometry X - toggle expert mode l [unit] - print disk label header x - exit & lose changes M - disklabel(8) man page z - delete all partitions

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 11/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

m [part] - modify partition

Suffixes can be used to indicate units other than sectors: 'b' (bytes), 'k' (kilobytes), 'm' (megabytes), 'g' (gigabytes) 'c' (cylinders), '%' (% of total disk), '&' (% of free space). Values in non-sector units are truncated to the nearest cylinder boundary. >

同样, 这里一些命令我们需要详细解释一下:

● p - 在屏幕上显示(打印)disklabel分区, 并且您可以在其后面加上修饰字符k, m或者g使其以千字节, 兆字节或吉字 节的格式显示其结果。 ● D -清除现存disklabel分区, 安装一个仅仅适合于当前OpenBSD分区的默认disklabel分区。硬盘上原先已经有 disklabel分区, 但是后来又重建了分区并改变了分区大小, 原先的disklabel并不会消失, 这样会引起混乱, 这时候用 这个命令就很有用了。 ● m - 修改一个现有disklabel分区, 别高估了这个选项的功能. 虽然它也许可以更改disklabel分区的大小, 但是它不能 改变驱动器上的文件系统类型, 如果您想丢失大量资料的话那么使用这个命令来并期望它可以魔幻般地调整现 有分区的大小是个不错的办法。不管怎样这个选项和growfs(8)可以用来增大一个分区。

在您的硬盘上划分Slice空间是很重要的事情, 像"我应该怎样给我的系统分区"这样的问题, 答案是:"看您想干什么了", 不 同应用肯定是不同的, 这里没有一个标准答案。如果您不确定怎样给您的系统分区, 看这个文档。

在这个系统我们给了OpenBSD 17G多的磁盘空间做分区, 这是块很大的空间, 我们一般不用这么多, 但是为了方便的做 讲解所以我们特意把分区作的大一点。这样我们无论怎样会有几百M的剩余空间, 而不是几个KB, 那太小了。

在根磁盘上您必须建立第一个分区'a'做为根文件系统(/), 如果没有根文件系统(/)安装程序无法继续进行, 一般您也需要 一个交换分区(swap), 'b', 但是如果您确信系统有永远不会用光的物理内存, 您也可以不安装它。如果根磁盘(root disk) 上存在'b'分区的话, 系统会自动用它作交换分区。如果交换分区位于其它的磁盘上, 那就必须把它手工添加到/etc/fstab 文件中。

稍加考虑一下, 我们按照不同的文件系统功用分别为它们建立分区(/, /tmp, /var, /usr, /home), 还有一个交换分区:

● wd0a: / (root) - 150M. 不要太小了。 ● wd0b: (swap) - 300M. ● wd0d: /tmp - 120M. /tmp 是用来编译一些软件的, 120M空间在多数情况下应该差不多。 ● wd0e: /var - 80M. 如果您准备用计算机做web或mail服务器的话, 这个分区就要大很多了, 但是本例不是。 ● wd0g: /usr - 6G. 6G. 我们希望这个分区能有足够的空间来存放用户的应用软件, 如果需要的话还能在这里进行源 代码升级或者重新编译系统。 Ports树也会被放在这里并会占用250M的空间。如果有人想在这里通过ports方式 编译源代码生成许多应用程序用而不是使用我们已经编译好的packages包, 那您需要更大的空间。

● wd0h: /home - 4G, 用于大量的用户文件的存放。

现在您已经添加了以上分区, 但是还有6G多空间没有使用! 没有被利用的空间不会造成什么问题, 而且它还能为我们以 后扩大现有分区. 需要更多的 /tmp ? 没问题, 在剩余空间中建立一个新的分区, 用newfs(8)将它格式化, 然后修改一下/etc/ fstab 将新分区挂载到/tmp上。

> p m # size offset fstype [fsize bsize cpg] OpenBSD area: 1537.5M-19092.9M; size: 17555.4M; free: 17555.4M c: 19092.9M 0.0M unused 0 0

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 12/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

i: 1498.7M 0.0M MSDOS > a a offset: [3148740] Enter size: [35953470] 150m Rounding to cylinder: 321300 FS type: [4.2BSD] Enter mount point: [none] / > a b offset: [3470040] Enter size: [35632170] 300m Rounding to cylinder: 626535 FS type: [swap] Enter > a d offset: [4096575] Enter size: [35005635] 120m Rounding to cylinder: 257040 FS type: [4.2BSD] Enter mount point: [none] /tmp > a e offset: [4353615] Enter size: [34748595] 80m Rounding to cylinder: 176715 FS type: [4.2BSD] Enter mount point: [none] /var > a g offset: [4530330] Enter size: [34571880] 6g Rounding to cylinder: 12594960 FS type: [4.2BSD] Enter mount point: [none] /usr > a h offset: [17125290] Enter size: [21976920] 4g Rounding to nearest cylinder: 8401995 FS type: [4.2BSD] Enter mount point: [none] /home > p m OpenBSD area: 1537.5M-19092.9M; size: 17555.4M; free: 6628.4M # size offset fstype [fsize bsize cpg] a: 156.9M 1537.5M 4.2BSD 2048 16384 1 # / b: 305.9M 1694.4M swap c: 19092.9M 0.0M unused 0 0 d: 125.5M 2000.3M 4.2BSD 2048 16384 1 # /tmp e: 86.3M 2125.8M 4.2BSD 2048 16384 1 # /var g: 6149.9M 2212.1M 4.2BSD 2048 16384 1 # /usr h: 4102.5M 8362.0M 4.2BSD 2048 16384 1 # /home i: 1537.4M 0.0M MSDOS > q Write new label?: [y] Enter

您会注意到C分区被忽略了, 这个分区就是您的整个硬盘;不要企图去修改它, 您也会发现一块不是我们定义的 i 分区, 这 就是早就存在的Windows 2000分区, 分区没有被分配到特定的字母——除了a (/), b (swap)和c(整块硬盘), 剩余的分区(一

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 13/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

直到字母 p), 您全可以使用。

配置您的挂载点及格式化您的文件系统

现在就是对您的挂载点的最后配置了, 如果您已经用disklabel(8)配置了您的挂载点, 这个步骤仅仅是验证您的选择;否 则, 现在就指定它们。

Mount point for wd0d (131584 KBytes)? (or 'none' or 'done') [/tmp] Enter Mount point for wd0e (90624 KBytes)? (or 'none' or 'done') [/var] Enter Mount point for wd0g (6656 MBytes)? (or 'none' or 'done') [/usr] Enter Mount point for wd0h (4096 MBytes)? (or 'none' or 'done') [/home] Enter Mount point for wd0d (131584 KBytes)? (or 'none' or 'done') [/tmp] done No more disks to initialize.

OpenBSD filesystems: wd0a / wd0d /tmp wd0e /var wd0g /usr wd0h /home

The next step *DESTROYS* all existing data on these partitions! Are you really sure that you're ready to proceed? [no] y newfs: reduced number of fragments per cylinder group from 20080 to 19992 to enl arge last cylinder group /dev/rwd0a: 156.9MB in 321300 sectors of 512 bytes 5 cylinder groups of 39.05MB, 2499 blocks, 5120 inodes each newfs: reduced number of fragments per cylinder group from 16064 to 15992 to enl arge last cylinder group /dev/rwd0d: 125.5MB in 257040 sectors of 512 bytes 5 cylinder groups of 31.23MB, 1999 blocks, 4096 inodes each newfs: reduced number of fragments per cylinder group from 11040 to 10992 to enl arge last cylinder group /dev/rwd0e: 86.3MB in 176712 sectors of 512 bytes 5 cylinder groups of 21.47MB, 1374 blocks, 2816 inodes each /dev/rwd0g: 6149.9MB in 12594960 sectors of 512 bytes 31 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each /dev/rwd0h: 4102.5MB in 8401992 sectors of 512 bytes 21 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each /dev/wd0a on /mnt type ffs (rw, asynchronous, local, ctime=Tue Oct 21 00:36:28 2 008) /dev/wd0h on /mnt/home type ffs (rw, asynchronous, local, nodev, nosuid, ctime=T ue Oct 21 00:36:28 2008) /dev/wd0d on /mnt/tmp type ffs (rw, asynchronous, local, nodev, nosuid, ctime=Tu e Oct 21 00:36:28 2008) /dev/wd0g on /mnt/usr type ffs (rw, asynchronous, local, nodev, ctime=Tue Oct 21 00:36:28 2008) /dev/wd0e on /mnt/var type ffs (rw, asynchronous, local, nodev, nosuid, ctime=Tu e Oct 21 00:36:28 2008)

您可能奇怪为什么安装程序又问您挂载点在哪里, 实际这是为了让您有机会修改在指定disklabel时的错误或重复, 比如,

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 14/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

安装程序会自动删除任何配置disklabel时重复的挂载点, disklabel程序允许您输入重复的挂载点, 但是它一定会在退出后 检查一下。重复的挂载点被删除后会造成分区失去挂载点, 如果您想用它的话还要再分配新的挂载点。

注意 "Are you really sure that you are ready to proceed?"的默认回答是"no", 所以您要回答"yes"它才会继续安装过程并格式化 分区, 如果您回答no, 您就会进入shell, 但是您输入install就能再次进入安装, 或者重启您的机器也行。

到这里所有的文件系统都将会被格式化。根据磁盘的空间大小和速度, 这个过程可能需要一段时间。

4.5.3 - 设置系统主机名

现在您必须设置主机名, 主机名和DNS域名(下面指定), 会被存放在/etc/myname, 正常启动时通过这个文件会设置系统 的主机名, 如果您不设置系统的域名, 系统会使用默认的'my.domain'。

现在就设置这个名字很重要, 因为当安装后第一次启动生成系统密钥时会被用到. 不论网络有没有被配置好, 密钥都会 生成。

System hostname (short form, e.g. 'foo'): 9971

4.5.4 - 配置网络

现在就该配置网络了, 如果您想通过FTP或NFS进行安装时您现在必须配置它, 网络需要以您输入的信息为基础, 这里就 是一个安装过程中的配置网络的例子, 在的例子中我们会将fxp0网卡连接到一个cable modem上并使用DHCP自动分配IP 地址;另外一块网卡则连接内部网络上, 配置静态IP地址。

Configure the network? [yes] Enter Available interfaces are: fxp0 xl0. Which one do you wish to initialize? (or 'done') [fxp0] xl0 Symbolic (host) name for xl0? [puffy] Enter The media options for xl0 are currently media: Ethernet autoselect (100baseTX full-duplex) Do you want to change the media options? [no] Enter IPv4 address for xl0? (or 'dhcp') 192.168.1.254 Netmask? [255.255.255.0] Enter IPv6 address for xl0? (or 'rtsol' or 'none') [none] Enter Available interfaces are: fxp0. Which one do you wish to initialize? (or 'done') [fxp0] Enter Symbolic (host) name for fxp0? [puffy] Enter The media options for fxp0 are currently media: Ethernet autoselect (10baseT half-duplex) Do you want to change the media options? [no] Enter IPv4 address for fxp0? (or 'none' or 'dhcp') dhcp Issuing hostname-associated DHCP request for fxp0. DHCPDISCOVER on fxp0 to 255.255.255.255 port 67 interval 1 DHCPOFFER from 73.34.136.1 DHCPREQUEST on fxp0 to 255.255.255.255 port 67 DHCPACK from 73.34.136.1 bound to 69.241.244.76 -- renewal in 1800 seconds. IPv6 address for fxp0? (or 'rtsol' or 'none') [none] Enter No more interfaces to initialize.

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 15/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

DNS domain name? (e.g. 'bar.com') [my.domain] 9971.us DNS nameserver? (IP address or 'none') [68.87.77.130 68.87.72.130 68.87.75.194] Enter Use the nameserver now? [yes] Enter Default route? (IP address, 'dhcp' or 'none') [dhcp] Enter Edit hosts with ed? [no] Enter Do you want to do any manual network configuration? [no] Enter

注意: 在每次安装过程中只有一个网卡可以轻松地使用DHCP进行配置, 如果您企图用DHCP配置更多的网卡会发生错 误。您只能在安装后手工配置其余的网卡。

现在, 我们为root帐号设定密码:

Password for root account? (will not echo) pAssWOrd Password for root account? (again) pAssWOrd

给您的root帐号设定一个安全的密码, 其它帐号只能在安装完成并重新启动以后设定。关于设定密码的详细说明请看 passwd(1):

新密码至少是6位的, 并且不要完全按照字母顺序, 长度不能超过128位 , 最好在密码中使用大小写字母, 数字和元字符 (meta-characters)。

4.5.5 - 选择安装介质

网络建立好之后, 安装脚本会给您一个手工调整配置的机会。

接下来, 您要选择您的安装介质. 选项见下:

Let's install the sets! Location of sets? (cd disk ftp http or 'done') [cd] Enter Available CD-ROMs are: cd0.

在这里我们用 CD-ROM 进行安装, 所有被系统识别为CD-ROM的设备列表被显示出来, 大多数人只有一个, 如果您有很 多个, 那就选正确的那个。

注意: 不是任何平台都支持所有的安装选项。本例中, OpenBSD/i386平台不支持NFS方式的安装, 因而列表中没有显 示。

Available CD-ROMs are: cd0. Which one contains the install media? (or 'done') [cd0] Enter Pathname to the sets? (or 'done') [4.5/i386] Enter

这里, 系统问您安装文件在哪里, 官方安装盘在 4.5/i386/ , 如果您有install45.iso镜像文件制作的光盘也一样在那个目录 里。

4.5.6 - 选择组件

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 16/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

现在该选择安装的组件了, 在下一小节有对这些组件的描述. 安装程序会将找到的组件列出来, 您只需选择要哪些组 件。非X的组件被默认选中;也许有高级用户需要限制组件的数量来运行OpenBSD系统, 那只要选base45.tgz, etc45.tgz和 bsd。多数人或许选择用默认方式安装系统或选择用全部组件安装系统, 下面这个例子就是选择了全部组件。

Select sets by entering a set name, a file name pattern or 'all'. De-select sets by prepending a '-' to the set name, file name pattern or 'all'. Selected sets are labeled '[x]'.

[X] bsd [X] bsd.rd [ ] bsd.mp [X] base45.tgz [X] etc45.tgz [X] misc45.tgz [X] comp45.tgz [X] man45.tgz [X] game45.tgz [ ] xbase45.tgz [ ] xetc45.tgz [ ] xshare45.tgz [ ] xfont45.tgz [ ] xserv45.tgz Set name? (or 'done') [bsd.mp] all

[X] bsd [X] bsd.rd [X] bsd.mp [X] base45.tgz [X] etc45.tgz [X] misc45.tgz [X] comp45.tgz [X] man45.tgz [X] game45.tgz [X] xbase45.tgz [X] xetc45.tgz [X] xshare45.tgz [X] xfont45.tgz [X] xserv45.tgz

如果您不想跟着我们教程走, 您在这里可以玩儿点小花活, 例如: "-x" 会移除所有 X 组件。 在这个例子中, 我们选择了所 有的组件。尽管系统不需要选择所有的组件就可以运行, 我们还是推荐默认安装方式或者选择所有的套件。关于选择 组件的更多细节请参看这里。

一旦您成功选定了您要的的组件, 您会看到提示问您要不要解压并安装这些组件.一条进程栏会告诉您进程还有多少时 间. 时间的长短取决于您安装OpenBSD那台机器的性能, 安装哪些组件, 安装介质的速度如何. 这个过程从几分钟到几小 时不等。

Set name? (or 'done') [done] Enter Ready to install sets? [yes] Enter

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 17/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

Getting bsd ... 100% |**************************************************| 6700 KB 00:03 Getting bsd.rd ... 100% |**************************************************| 5404 KB 00:01 Getting bsd.mp ... 100% |**************************************************| 6750 KB 00:02 Getting base45.tgz ... 100% |**************************************************| 42904 KB 00:27 Getting etc45.tgz ... 100% |**************************************************| 631 KB 00:00 Getting misc45.tgz ... 100% |**************************************************| 2866 KB 00:02 Getting comp45.tgz ... 100% |**************************************************| 78575 KB 00:43 Getting man45.tgz ... 100% |**************************************************| 7552 KB 00:07 Getting game45.tgz ... 100% |**************************************************| 2552 KB 00:01 Getting xbase45.tgz ... 100% |**************************************************| 9486 KB 00:05 Getting xetc45.tgz ... 100% |**************************************************| 75434 00:00 Getting xshare45.tgz ... 100% |**************************************************| 2672 KB 00:05 Getting xfont45.tgz ... 100% |**************************************************| 34747 KB 00:16 Getting xserv45.tgz ... 100% |**************************************************| 19816 KB 00:10 Location of sets? (cd disk ftp http or 'done') [done] Enter

在这里如果您愿意您也可以从其它源添加想要的额外的组件(包括定制程序包) , 如果已经包含了所有您需要的组件了, 那就选择'done'。

4.5.7 - 完成安装

下面您会被问到一些有关设定您刚装好的系统的问题.首先是sshd(8)要不要在系统启动的时候启用. 通常您希望sshd随 系统运行, 但是您有时可能不想这样, 如果您的应用软件对于sshd(8)没有依赖, 在理论上不运行它还会带来一点点安

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 18/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

全。

Start sshd(8) by default? [yes] y

如果以后您又改变主意了, 想运行sshd了, 没关系, 编辑/etc/rc.conf.local或/etc/rc.conf。(建议修改前者, 原因读者以后会明 白。)

您也会选择是否要在启动时运行OpenNTPD, OpenNTPD会让您的计算机时钟保持同步的程序, 多数人选默认就可以 了。

Start ntpd(8) by default? [no] yes NTP server? (hostname or 'default') [default] Enter

如果您有一个本地的时间服务器, 您可以在这里指定它, 如果您选择"default", OpenNTPD将会使用pool.ntp.org, 它是一个 巨大的可自由访问的时间服务器的集合。(如果以后您又改变主意了, 修改/etc/rc.conf.local和/或 /etc/ntpd.conf)文件。

在某些平台上, 您现在会被问到是否在这个系统上运行X, 如果您回答'Y', /etc/sysctl.conf 就会被添加一行machdep. allowaperture=1或者 machdep.allowaperture=2, 1或2根据您使用的平台, 在有些平台上这个问题不会被问到。如果您不准 备运行X, 或者是不确定, 回答"NO"。如果您以后需要运行X, 修改/etc/sysctl.conf。因为现在的显示卡上的图形引擎可以 不受处理器的控制而被用于随意更改内存所以禁用xf86(4)会带给您一些安全优势。

Do you expect to run the ? [no] y

接下来, 您会被问到这台计算机是否用一个串口的控制台, 而不是一个标准的显示器和键盘. 如果您选"yes"并回答其它 几个简单的问题, /etc/boot.conf and /etc/ttys会被修改, 多数人在这里选择"no"。

Change the default console to com0? [no] Enter

下面就是填写一下时区. 这取决于您的机器的所在地, 这里或许会有数个等同的适用的答案。下面这个例子中, 我们选 择US/Eastern, 当然您同样也选择EST5EDT或者US/Michigan和其它地方, 输入"?"会指导您作出选择。

Saving configuration files...... done. Generating initial host.random file ...... done. What timezone are you in? ('?' for list) [Canada/Mountain] ? Africa/ Chile/ GB-Eire Israel NZ-CHAT UCT America/ Cuba GMT Jamaica Navajo US/ Antarctica/ EET GMT+0 Japan PRC UTC Arctic/ EST GMT-0 Kwajalein PST8PDT Universal Asia/ EST5EDT GMT0 Libya Pacific/ W-SU Atlantic/ Egypt Greenwich MET Poland WET Australia/ Eire HST MST Portugal Zulu Brazil/ Etc/ Hongkong MST7MDT ROC posix/ CET Europe/ Iceland Mexico/ ROK posixrules CST6CDT Factory Indian/ Mideast/ Singapore right/ Canada/ GB Iran NZ Turkey zone.tab What timezone are you in? ('?' for list) [Canada/Mountain] US

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 19/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

What sub-timezone of 'US' are you in? ('?' for list) ? Alaska Central Hawaii Mountain Samoa Aleutian East-Indiana Indiana-Starke Pacific Arizona Eastern Michigan Pacific-New Select a sub-timezone of 'US' ('?' for list): Eastern Setting local timezone to 'US/Eastern'...done.

如果您不确定精确的时间, 您可能会希望读一下这里。

最后一步就是为系统建立 /dev 目录(在一些机器上可能会比较耗时间, 特别是当您的内存比较小的时候), 并且安装启动 引导块。

Making all device nodes...done. Installing boot block... boot: /mnt/boot proto: /usr/mdec/biosboot device: /dev/rwd0c /usr/mdec/biosboot: entry point 0 proto bootblock size 512 /mnt/boot is 3 blocks x 16384 bytes fs block shift 2; part offset 3148740; inode block 24, offset 1832 using MBR partition 1: type 166 (0xa6) offset 3148740 (0x300bc4) done.

CONGRATULATIONS! Your OpenBSD install has been successfully completed! To boot the new system, enter halt at the command prompt. Once the system has halted, reset the machine and boot from the disk. # halt syncing disks... done The has halted. Please press any key to reboot.

至此OpenBSD安装完毕, 但是您第一次启动前还......

重新启动前

到目前为止您的系统已经安装完毕并可以重新启动和配置服务了, 但做这些之前, 如果聪明的话应该先去看勘误表, 检 查是否有什么程序错误会影响到您。

还有一个技巧是在第一次启动前的配置:

# /mnt/usr/sbin/chroot /mnt

这个命令将会将装载点装载到设定位置, 像正常的新系统重启动一样。您现在可以做一些基本的系统配置, 比如添加用 户, 更改装载点等。

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 20/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

重新启动后

在您的安装完成后, 您首先需要做的事情就是阅读afterboot(8)。

您也许觉得以下链接也很有用

● 在OpenBSD中添加用户

● 初始化网络设置

● 用户手册中的流行/有用的命令

● OpenBSD网页上的用户手册

● 使用Packages和Ports系统安装软件

最后还有一件事...

OpenBSD开发小组希望您发送一份您的dmesg, 所有的开发人员, 还有所有的用户, 都会感激您的。

4.6 - 安装时需要哪些文件?

一次完整的OpenBSD安装可以分解成一系列单独组件的安装, 不是每种应用全需要所有的组件包。这里有一个对每个 组件包的概述:

● bsd - 这个是内核, 必需的 ● bsd.mp - 多处理器(SMP)内核(只有一些平台有) ● bsd.rd - RAM disk kernel

● base45.tgz - 包含了基本的OpenBSD 系统, 必需的 ● etc45.tgz - 包含了/etc 下的所有文件, 必需的 ● comp45.tgz - 包含了编译器和它的工具, 头文件和库文件, 推荐 ● man45.tgz - 包含了用户手册, 推荐 ● misc45.tgz - 包含了misc info, setup文档 ● game45.tgz - OpenBSD下的游戏 ● xbase45.tgz - 包含了X11的基本文件 ● xetc45.tgz - 包含了/etc/X11和/etc/fonts配置文件 ● xfont45.tgz - 包含了X11的字体服务器和字体 ● xserv45.tgz - 包含了X11的X服务器 ● xshare45.tgz - 包含了X的用户手册, 本地设定, includes等 etc45.tgz 和xetc45.tgz组件升级时不能选用, 只有安装时才用得到, 因为只有这样您的个人设定才不会丢失, 升级时您只能 通过手动升级您的/etc, /dev/和/var目录。

即使您没打算运行X, 一些第三方的package里的软件也需要您的系统中已经安装了xbase45.tgz里的图形库文件, 这些软件 仅需要安装X相关组件里xbase45.tgz组件就可以了, 其余的X组件不需要安装。

4.7 - 安装OpenBSD系统需要多少磁盘空间?

很显然, 这个问题的答案会因为你系统不同的用途有很多的差异。但是不管怎样说, 下列数字作为起点吧:

(root) 60MB /usr 500MB (no X) or 660MB (with X)

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 21/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

/var 25MB /tmp 50MB swap 32MB

这里列出的是安装一个完整系统的最小推荐值, 这些数值允许您在家庭应用中运行一个可以连接互联网的OpenBSD系 统, 而且磁盘空间还略有富余, 但是没有考虑其它功能。

无论如何, 下面这些内容您脑子里要有印象:

● 这些全是最小值, 现在硬盘相对以前来说已经很便宜了, 尝试将您的系统压缩到最小也省不了几个钱。对一些特 殊应用, 上面的值还能小, 但是具体是多少只有您自己尝试了。 ● 这些数字不包含ports树。 ● 如果您打算安装很多第三方软件, 把您的 /usr分区 设定的大一些, 当然, 具体多大看您的实际应用了。 ● 如果您的系统需要处理大量的邮件或网页, 那么您的 /var 目录就应该足够大, 因为邮件默认保存在 /var/mail 目录, 网页默认保存在 /var/www 目录。您也可以把它们放在其它单独的分区上。 ● 多用户系统会产生大量的log文件, 它们在 /var/log 目录内, 您应该让您的 /var 分区大一点, 或单独分出一个 log 分 区。 ● 如果您打算从源代码编译内核及系统, 您必须给您的 /usr 分区分配更多空间, 4G就不错。

● 编译一些来自ports的软件源代码时会在您的 /usr 及 /tmp 分区占用很大的空间, 这也是另一个原因为什么我们建 议安装预编译的packages来代替port安装方式。

● /tmp 分区是被用来编译ports树及其余事情的, 所以具体要多大空间取决于您如何使用, 50M对多数人来说是够了, 但是如果您要编译大型软件, 也许需要100M或更多。 ● 在您根磁盘上的 "b" 分区自动成为您的交换分区。很多人墨守陈规将这个交换的大小设定成系统内存的2倍, 这 是无稽之谈。在一个现代的系统上是存在频繁的交换, 多数人更希望他们的系统永远不要产生交换。您永远不 会希望您的系统出现"内存+交换(swap)分区"被用光的情况, 但实际情况是您的机器大部分时间拥有足够的内存, 根本不需要把数据存放到 swap 分区上。如果您用一个闪存盘安装系统, 您恐怕根本就不想要 swap 分区, 您仅需 要将 swap 分区的大小设置成适合自己的数值, 如果小了也没有关系, 您再加一个 swap 分区在 /etc/fstab 或在以后 用交换到一个文件。

● Swap 和 /var 分区被用作计算机崩溃时的转储内存信息。如果您考虑这个因素, 您的交换分区(/swap)是应该比内 存稍微大一点。一旦重新启动savecore(8)将把 /swap 分区的内容写入 /var/crash 下的一个文件, 如果这对您很重要 您的, 您的 /var 分区必须要有足够的空间容纳这些内存转储(dump)文件。不过, 哥们, 清醒一点吧, 不会有哪个头 上长包的开发人员会看您的1G多的dump文件的, 如果您自己没打算在您的计算机上分析崩溃原因, 这个因素也 没有必要考虑了。 ● 至少有些编辑器使用 /var/tmp 做草稿空间, 因此通常情况下 /var 分区要比您编辑的最大文件要大一些, 如果您计 划编辑500M的一些文件, 那您的 /var 分区或 /var/tmp 分区应该比您的计划更大一点。

为什么用单独的分区, 而不是把所有东西全塞进1个或2分区?这里有几个原因:

● 安全: 您可以标记一些分区的属性为'nosuid'、'nodev'、'noexec'、'readonly'等, 通过以上的描述您可以在安装的过 程中制定分区的类型。 ● 稳定 :一个用户或"莽撞"的程序如果有写权限, 就能使分区充满垃圾数据, 让重要程序运行在不同的分区, 可以降 低对系统的危害。 ● 速度 :一个文件系统被频繁地写入数据会产生磁盘碎片(幸运的是OpenBSD采用的ffs文件系统并不会产生大量的 碎片)。 ● 完整性 :如果一个分区(filesystem)因为某种原因崩溃了, 其它的分区仍然完好无损。 ● 容量 :许多计算机对内核所在区域有大小的限制。有些限制得很小(老的486机器上只有504M), 有的2G, 8G, 或在 i386机器上128G不等。因为内核可能在 root 分区的任何位置上, 所以整个 root 分区的大小有限制。更多的信息 参看Disk Setup, 除非您清楚您的计算机允许"/"分区更大一些, 否则不要超过2G。

分区时一些额外的考虑事项:

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 22/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

● 作为第一次尝试如果您仅想安装一个系统进行试验, 只建个大的"/"和swap这两个分区是最简单方法, 直到您知道 需要多大, 当然, 这样的做法会牺牲一些OpenBSD默认的安全性, 因为我们建议把 / , /tmp , /var , /usr 和 /home 放在 不同的分区里. 不过您也不会把第一次用于试验的OpenBSD用于重要的工作环境。 ● 系统可能遭受来自外界的攻击, 应设立单独的 /var 分区(甚至把 /var/log 单独放置)以存放日志。 ● 最好单独设置 /home 分区是一个好办法, 您想试试新发行的OpenBSD吗? 没问题, 您可以安装一个新的系统, 其它 的分区会被删除, 但是安装程序不会修改 /home 分区的内容。不过安装新系统前别忘了保存一份原来的系统配 置。 ● 有时为了系统更快地运行需要删除大量的无用文件, 如果您恰好用一个独立分区存放这些文件, 重新建立或格式 化这个分区比您手工删除它们方便的多。例如您从源码构建新内核时在 /usr/obj 目录下产生的文件。

● 当您需要重建系统时, 系统源码全会被放到 /usr/src 这个目录里, 如果您没有为 /usr/src 建立一个独立的分区, 那么 您要确保 /usr 分区足够大。 ● 一个常被大家忽略的事情是:不要在建立磁盘分区时把所有的磁盘空间全用光, 保留一些空间是十分明智的, 如果 您的一个分区不太够了, 您可以从未分配的空间上指派一个新的分区, 复制一个已经存在的分区到新分区, 然后 修改 /etc/fstab 指向这个新分区, remount, 现在您又有新空间了。否则您就满世界找20G以下的硬盘吧, 估计够 呛, :) ● 如果您想尝试一下以官方要求的最小空间分区, 您会发现以后升级系统的时候您的噩梦真的开始了。 ● 如果您分配了一个硕大的分区, 别忘了用fsck(8)检查文件系统时每G文件系统需要消耗1M的内存, 并且消耗您大 量的时间, 这在一些老旧的或者配置很低的系统上简直是灾难。(请您也参考这一小节)。

● 如果用户对 /var/www(也就是, 您的个人主页)具有写权限, 您应该把它放到一个独立的分区, 这样您可以使用 quotas限制用户对该分区的使用, 而且即使您这个分区空间告急, 其它的分区也不会受影响。

● 建议您再安装一个/altroot分区, 如同daily(8).中描述的那样。这样您就有了 / 分区(根分区)的每天的备份, 当根分 区发生意外时, 您还额外有一个的内核(kernel)以及 /etc下的配置文件的备份。很明显, /altroot分区至少应该和 / 分区一样大。如果您有第二块磁盘, 无论是用软件的raid(4)还是定期使用 dump(8)/restore(8)进行复制, 并把其它 需要的内容拷过去, 在第一块磁盘被拿掉之后第二块磁盘仍然可以启动。

4.8 - 设置多重启动 OpenBSD/i386

多重启动是指在一台计算机中存在几种操作系统, 而且您可以选择启动哪个。这可不是什么雕虫小技, 如果您误操作会 删除磁盘上的大量数据。对OpenBSD新手而言, 我们强烈建议您用一台专用电脑, 并在一块空硬盘上进行操作试验, 等 您完全熟悉操作后再应用在您的关键设备上。 FAQ 14 上有更多关于OpenBSD启动过程的信息。

只有四个主MBR分区中的一个可以用来启动OpenBSD(例如, 在扩展分区上不行)。

设定活动分区

通常这是最容易被忽视的, 但有时它是多重启动最有效的方法. 不管您正在用什么操作系统, 只要把下次要启动的操作 系统所在的分区设为活动分区, 那么下次启动时它就能默认启动了. 每个的操作系统全有一个程序可以设定活动分区; OpenBSD用的是fdisk(8), Windows 9x和DOS和其它一些操作系统下也是用名字相似的程序. 如果您的计算机关机或者重 启全需要很长时间, 这个方法还是很诱人的--您设定启动分区, 并重启, 然后到旁边喝杯咖啡, 回来的时候您要的系统已 经启动了——不用等什么魔法时刻来选择进入哪个OS。

从软盘启动

如果您的多平台计算机上OpenBSD系统不常用(或者您不想让其他用户发觉机器的变化), 那就用标准的OpenBSD安装 软盘, 在软件盘上添加一个文件 /etc/boot.conf(别忘了, 您需要在软盘上先建立一个/etc目录才行), 在/etc/boot.conf里添加 如下内容:

boot hd0a:/bsd

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 23/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

这是让系统从驱动器"0"的OpenBSD所在的分区"a"启动, 内核文件是 /bsd。说明一下您也可以从系统的其它分区启动, 比 如这样:"boot hd2a:/bsd", 就可以从第三个驱动器启动了。启动OpenBSD时插入软盘引导就行了;启动其它操作系统时先 把软盘退出来, 再重新启动。

本例中, boot(8)程序是从软盘加载的, 并寻找读入/etc/boot.conf. 然后"boot hd0a:/bsd"语句告诉boot程序去哪里加载内 核----在这里是BIOS里的第一块硬盘hd0。记住, 只有一个很小的文件/boot是被从软盘里读取出来, 系统还是会从硬盘 中加载整个内核的, 所以用软盘启动只比从硬盘上直接启动多花了五秒钟。

Windows NT/2000/XP NTLDR

如果要多重启动OpenBSD和Windows NT/2000/XP, 您需要使用 NTLDR这个工具, NTLDR是NT的启动加载程序(boot loader). 要让OpenBSD和NT在一起多重启动, 您需要一份 OpenBSD Partition Boot Record (PBR)的拷贝. 运行installboot之 后, 您用dd(1)将其复制到一个文件:

# dd if=/dev/rsd0a of=openbsd.pbr bs=512 count=1

说明:现在正好提醒您一下, 在这里照搬照抄地输入您自己不知道的命令那绝对是一个馊主意。如果直接使用, 这一行并 不能应用在大多数计算机里。这留给读者自己去更改成适合自己计算机的命令。

(译者注:非scsi硬盘用 dd if=/dev/rwd0a of=openbsd.pbr bs=512 count=1)

现在启动NT并且把OpenBSD.pbr拷贝到c:\, 在c\:boot.ini这个文件的结尾加上这句:

c:\openbsd.pbr="OpenBSD"

当您重新启动后, 您应该可以在NT loader菜单里选择从OpenBSD启动。更多关于NTLDR的知识在NTLDR Hacking Guide 可以找到。

在Windows XP上您也能用GUI(图形化)编辑器更改启动信息;请查看XP Boot.ini HOWTO。

有很多程序可以替您做这件事, 例如BootPart, 这个程序可以运行在NT/2000/XP, 并且可以获取OpenBSD PBR, 并把它拷 贝至NT/2000/XP的分区, 并自动加入c:\boot.ini

说明: Windows NT/2000/XP boot loader只能启动装在主硬盘(master)的操作系统, 您不能用它来启动装在从硬盘(slave)的 OpenBSD。

其它的多重启动软件

OpenBSD用户还成功的运行了其它的多重启动软件包括:GAG, OS-BS, The Ranish Partition Manager及GRUB。

OpenBSD and Linux (i386)

请参阅 INSTALL.linux, 关于怎样让OpenBSD与Linux共存那里写得极其详细了。

时区问题

OpenBSD设定计算机的时间为UCT(世界标准时间, Universal Coordinated Time), 而其它的一些操作系统允许把计算机主

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 24/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

板上的实时时钟设定为当地时间。很显然, 如果一台计算机上有两个这样的系统, 就上会有一些小问题。双方间必须有 一方去适应对方, 更多的关于这方面的信息, 请参考FAQ 8 - Why is my clock off by several hours?

4.9 - 完成安装后给[email protected]发送您的dmesg信息

我们在这里提醒您, 对开发者来说知道哪些平台上运行OpenBSD正常, 或者哪些平台运行得不太理想是十分重要的。

在这里引用一段/usr/src/etc/root/root.mail的内容: 如果您想确保OpenBSD在您的计算机上运行地更好, 请帮我们一个忙 (当您配置好您的邮 件系统后!)输入一些信息, 像这样:

# dmesg | mail -s "Sony VAIO 505R laptop, apm works OK" [email protected]

那样的话, 我们可以知道用户的计算机配置, 向您看见的那样, 在标题或正文里面提供一 点点计算机的硬件信息对我们 的帮助更大, 我们会根据您提供的信息在以后新的发行版上 完善我们的驱动程序(请用我们提供的标准内核做测试而不 要用您自己定制的内核, 除非 您无法用标准内核启动, 如果您有一个多处理器的计算机, 如果您等把 GENERIC.MP 和 GENERIC全发给我们, 我们将十分荣幸), 驱动程序运行信息可以帮助我们修改一些现有 驱动程序, 谢谢您!

请确认您发送信息的邮箱地址可以接收邮件, 以便让开发人员可以与您联系, 他们有时会指导您进行测试, 修改以帮助 您调整系统。您不必非从使用OpenBSD的那台计算机发送email, 如果那台计算机无法收取email, 您只要:

$ dmesg | mail [email protected]

然后再从您的邮箱里把这封信转发给

[email protected]

当然, 这里所说的"[email protected]"请使用您自己的邮箱地址。

说明

● 请只发送标准内核的dmesgs.定制内核中一些驱动被移除了, 所以对我们没用。 ● 如果多处理器内核GENERIC.MP在您的多处理器系统上运行正常, 开发者很需要包含GENERIC kernel和 GENERIC.MP kernel 的dmesgs信息, 这对我们很有帮助。请把两个信息分别发给我们。 ● 错误报告服务器启用了spamd(反垃圾邮件技术), 可能您的邮件不会马上到达服务器, 所以可能邮件可能会半小时 后或一小时后才可能被服务器接收到, 所以请您保持耐心。

上面的方法很简单, 但是如果您不打算在OpenBSD上配置电子邮件, 您也应该将您的dmesg发送给开发者, 可以简单的将 dmesg输出到一个文本文件:

$ dmesg > ~/dmesg.txt

然后将这个文件用(FTP/scp/floppydisk/carrier-pigeon/...) 等方式发给您可以正常使用电子邮件的计算机. 因为您发来的 dmesg是系统自动处理的, 所以无论是用邮件客户端或邮件服务器发送, 请检查下列选项:

● 配置您的电子邮件客户端, 用纯文本的方式发送, 不要用HTML格式。 ● 关掉所有自动换行的功能, 许多邮件客户端默认配置成在72列自动换行(邮件列表规范)。 ● 确认您的电子邮件客户端不会再次对邮件进行"文本流"处理。

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 25/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

● 不要把dmesg输出文件作为附件发送, 把这些信息放入邮件正文。

4.10 - 安装后添加程序

"哦, 不好!我在安装时忘了选择一个系统组件了!"

有时, 直到安装后您才意识到您确实需要comp45.tgz组件 (也许是其它组件), 但当时的确是没想起来, 这里有个好消息告 诉您----安装后有两种方法可以添加组件:

用升级的方法

用您的安装介质启动(无论CD或软盘), 然后选择upgrade(可别选Install). 在列表中选择您第一次安装系统时忘了选择的 系统组件, 然后选择安装介质, 剩下的就是升级程序帮您干了。

用 tar(1)----解压缩组件

系统组件实际上就是被压缩的tar文件, 您可以把它们在根目录下释放:

# cd / # tar xzvphf comp45.tgz

别忘了在解压缩时使用"p"参数, 以便完整保留原始文件的使用权限!

一个常见的错误是, 想用pkg_add(1)把遗漏的组件安装到系统中, 别那样做, 那可不行。pkg_add(1)是一个第三方软件包 管理工具 , 是用来安装第三方软件的, 它只能处理第三方软件包的tar文件, 处理不了安装组件这类的tar文件。

如果您用tar(1)第一次安装完xbsse组件, 在重新启动前, 必须先用ldconfig(8)对共享库缓存文件进行升级, 把所有的X库加 到缓存文件中:

# ldconfig -m /usr/X11R6/lib

或者, 您可以重新启动系统, 而这项工作会被rc(8))启动脚本自动完成。

4.11 - 'bsd.rd'是什么? bsd.rd 是一个内存磁盘内核。这个文件非常有用, 很多开发者将它妥善地保存在系统的根目录。称其为"内存磁盘内 核"是形容内核挂载的根文件系统在内存磁盘中而不是不在物理磁盘中, 启动bsd.rd后, 必要的系统工具被储存在内核中, 并且在一个基于内存的文件系统中运行。bsd.rd还包含了一系列得心应手的工具以便让您进行系统维护和安装。在有 些平台上, bsd.rd是首选的安装方法——您把bsd.rd放到一个已经存在的文件系统内, 启动它, 并且用它进行安装。在大 多数平台上, 如果您有一个正在运行的老版本的OpenBSD, 您可以"ftp"一个新版本的bsd.rd, 从bsd.rd启动, 并安装一个新 版本的OpenBSD而不需要任何可移动介质(软盘, 光盘)来安装。

这有一个i386上用从bsd.rd启动的例子:

Using Drive: 0 Partition: 3 reading boot.....

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 26/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

probing: pc0 com0 com1 apm mem[639k 255M a20=on] disk: fd0 hd0+ >> OpenBSD/i386 BOOT 3.02 boot> boot hd0a:/bsd.rd . . . normal boot to install . . .

像上面例子中显示的那样, 您会进入安装程序, 但您也可以中断安装, 进入shell去维护您的系统。

一个从bsd.rd的启动通用法则就是在您的平台上无论用什么方法把启动内核从/bsd, 变成bsd.rd。

4.12 - 常见的安装问题

4.12.1 - 我的Compaq仅识别出16M内存

有些Compaq系统存在一个的问题, 这些机器的内存无法被 OpenBSD second stage boot loader 正确地识别出全部内存, 刚 开始OpenBSD可能只识别和使用了16M, 这个问题可通过建立或修改 /etc/boot.conf文件修正, 或在OpenBSD引导前 在"boot>"提示符下输入命令, 假设您的计算机是64M内存, 而OpenBSD仅检测出16M, 那命令应该是:

machine mem +0x3000000@0x1000000

意思是48M (0x3000000)加上16M (0x1000000)内存. 于此相同, 如果您的计算机也存在这样的问题, 首先插入软盘/光盘引 导, 在出现提示符"boot>"时输入上面的命令, 然后重新启动系统, 并在/etc/boot.conf里添加上这句话, 这样以后启动时您 的内存就全部识别了。

也有人反映有些这类计算机升级ROM后就没事了

4.12.2 - 我的i386安装后不能启动

您的安装过程很顺利, 但是第一次启动时发现OpenBSD启动不了。这个现象一般是:

● Fdisk(8)没有设置活动分区分. 修改方法, 用软盘或其它介质重新启动计算机, 并把一个分区设定成活动的(可启 动), 看这里和这里。

● 磁盘上无有效的引导记录.如果您在安装OpenBSD系统时, "Use entire disk for OpenBSD?"这个问题选择了"yes", 或 用了fdisk的 "reinit" 选项, OpenBSD引导记录已经被写到了磁盘的主引导扇区; 否则这个硬盘上原有的引导记录还 没有被改写。 如果安装OpenBSD前您的主引导扇区上就没有其它引导记录存在, 这时就有问题了。(译者注:原来 系统已经启动不了了, 您又不让OpenBSD把引导记录写上去, 所以硬盘上就没有引导记录, 肯定无法启动了)一个 解决的办法, 从安装盘启动, 中断进入shell并调用 fdisk(8) 重新写入主引导记录, 用这个命令:

# fdisk -u wd0

● 说明:"update"选项在fdisk的交换式("-e")模式下将不会写入使磁盘具有启动功能的签名字节(signature bytes) ● 在一些极其偶然的场合, 在安装引导记录的第二阶段有些步骤可能会出错, 更详尽的论述看这里。

4.12.3 - 我的老爷机已经启动了, 但是卡在了ssh-keygen 这个步骤

据此情况您的计算机运行正常, 仅仅是在产生ssh key的过程慢一点而已。一台SPARCStation2或Macintosh Quadra可能花 费几个小时才能生成这三个ssh-keygen(1)。您只能等待, 只有您初次安装OpenBSD时才需要生成ssh-keygen(1), 安装后正

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 27/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

常使用就没有这个问题了。

说明从OpenBSD3.8版本开始key文件尺寸增加了, 所以比以前的版本需要花费更多的时间生成key文件。如果您的机器 配置很低, 可以在另外一台高性能的机器上生成key, 然后将它们放到site45.tgz文件里, 在安装时和其它系统组件一并安 装。

4.12.4 -安装时系统提示我"Failed to change directory"

当您想通过ftp方式安装一个尚在-beta阶段的OpenBSD快照版时, 您可能会看到像这样的信息:

Display the list of known ftp servers? [no] yes Getting the list from 192.128.5.191 (ftp.openbsd.org)... FAILED Failed to change directory. Server IP address or hostname?

这在安装预发行版时是一个正常的现象, 因为ftp程序会到主ftp服务器上寻找该版本的系统组件, 但实际上这些组件还没 有被放到那里, 一般情况时下一个正式版发行时FTP上才会有新版本的安装组件。

您只需查阅一下FTP镜像列表, 然后出现提示时手工输入您选的FTP的域名或IP地址。

说明:如果您是从CD-ROM上安装发行版OpenBSD不会出现这样的提示。

4.12.5 - 我的磁盘分区乱七八糟或是空的!

偶尔一个用户会发现他的系统工作正常, 但是 fdisk(8) wd0时, 发现分区表是空白的(或者有时乱七八糟)。这在i386或 amd64平台上通常是用fdisk安装分区时只偏移了0个扇区, 而正确的应是建立第一个分区时应跳过第一条磁道(每种平台 的偏移量不尽相同, 有的没有偏移), 这时系统启动用PBR而不是MBR。

嗯, 当然这样配置也可以使用, 但是给维护时带来了麻烦, 我们应该修正它, 只能重新进行文件系统的分区了。(如果您确 实知道怎么做, 您应该仅重新写一下您的disklable和MBR, 这样您只损失了第一个分区的数据。)

4.12.6 - 我的机器上没有软驱和光驱

有时用户想在明显没有安装OpenBSD途径的计算机上使用OpenBSD, 这里给您一些在这类系统上的安装OpenBSD的提 示和技巧。

● 网络启动, 使用 PXE (i386 或 amd64) 或者 diskless(8) (其它平台)。

● 如果你的计算机可以从外置的光驱或软驱启动, 使用其中的一种。 ● USB闪存盘或硬盘, 前提还是你的计算机可以用它们启动。像 FAQ 14 里描述的那样——在另一台计算机上准备 好这个设备。用它们启动, 但是选择bsd.rd内核, 然后正常安装。你最好将系统组件预先拷贝在闪存盘上。 ● 最坏的情况是, 上述条件你都不具备, 你可以将要安装OpenBSD的目标计算机里面的硬盘取出来, 用一个合适的 适配器接到一台"正常的"计算机上, 安装OpenBSD, 然后将这块磁盘再安装回目标电脑, OpenBSD将在目标电脑上 很好地启动, 尽管你可能需要重新设置网络。

任何时候都不要忘记, 那台计算机上原来就存在着操作系统, 通常的系统设计会考虑在那台计算机上重新安装操作系 统。你知道怎么重新安装原来的操作系统就可能知道怎样装OpenBSD。

4.13 - 定制化安装过程

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 28/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南 siteXX.tgz 文件

OpenBSD的安装/升级脚本允许添加一个用户自定义的"siteXX.tgz"组件, 这里的XX表示发行版的版本号(比如:45代表 OpenBSD4.5).这个siteXX.tgz组件和其它系统组件一样, 是一个经过gzip压缩的包含释放路径的tar包, 并且和其它系统组 件一样可以使用tar的xzphf参数进行释放。这个用户自定义组件是在其它系统组件安装完成后最后一个安装。 (译者注:tar 的作用是将多个文件归档(打包)成一个文件。tar打包后的文件大小没有变化, 打包后可以方便拷贝到其它地 方。tar在打包的时候可以维护目录结构和文件属性等信息, 因此当从打包文件(.tar 文件)解开之后会得到和压缩之前完 全相同的目录结构;Gzip 的设计目的是"压缩", 它将一个文件压缩成扩展名为".gz"的压缩格式文件。Gzip 是用于压缩单 个文件的压缩工具。所以, 当需要压缩传输一个文件夹的文件的时候, 先用 tar 打包, 然后用 gzip 压缩。这也体现了 UNIX 的设计思想:每个工具各尽其职, 用各种小工具的搭配取得大的效果。)

这个用户自定义组件允许用户添加自己的组件或者"矫正"正常的安装组件(译者注:这是为什么要放在最后面安装的原 因, 这样才可以覆盖前面安装默认组件时的设置), 这样就可以让用户自定义或升级系统。 您也可以安装一个包含特定主机名的自定义组件, 像这样siteXX-.tgz, 例如:"siteXX-9971.tgz", 这是为了每台计 算机全可以进行用户自定义的安装, 升级系统及系统灾难恢复。

这里有一些使用siteXX.tgz的例子:

● 在您第一次安装系统后, 安装一个包含了您所有修改文件的siteXX.tgz组件, 在重新安装过程中, 您的所有更改会被 复制到您的新系统中。 ● 在每台计算机上安装包含所有改动目录的一个及自己特定机型的siteXX.tgz组件(例如不同的显卡⋯⋯..), 下次重 新安装系统时选择自己那台的定制组件。 ● 可以简单的把这个定制组件siteXX.tgz与系统组件结合在一起进行进行安装, 这样不必每次安装系统后还要重新 设定。—— 例如: 把 /etc/skel、/etc/pf.conf、/var/www/conf/httpd.conf、/etc/rc.conf.local 等目录下的文件打包压缩 成siteXX.tgz。 install.site/upgrade.site 脚本

做为安装或升级的最后一个步骤, 脚本会在新系统的root目录下寻找install.site或者upgrade.site这两个文件。根据安装或 更新的的进程, 脚本在root目录里运行, 并且被系统chroot在这个环境里。记住, 升级是在已经安装的系统上进行的, 所以 您的目标系统已经被挂载到 /mnt 下。不管怎样, 因为chroot的原因, 您脚本可以像运行在正常的系统的 "/" 下的那样编 写。因为这个脚本是在所有组件被安装后运行的, 所以这时它几乎可以运行系统的全部功能(尽管是在单用户模式下)

说明: upgrade.site在升级前放到root目录里或者直接放在siteXX.tgz这个自定义组件里, install.site必须放在siteXX.tgz这个自 定义组件里

这个脚本可以同来干很多事情:

● 删除安装或升级时产生的不您需要的文件。 ● 删除/升级/安装 那些您想在系统中运行的packages

● 您准备对系统"大展身手"之前, 最好马上做一个备份或存档 。

● 用 rdate(8)设定系统时间。

提供siteXX.tgz结合install.site和upgrade.site就是为了让您可以"随心所欲"的定制自己的系统, 否则您自己将不得不自制系 统自己的系统安装组件。

说明:如果您要通过一个http服务器安装系统, 您必须在http服务器下安装目录的index.txt文件里加上您的site*.tgz, 以便安

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 29/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

装系统时可以选择它们。ftp或其它安装方式不需要这样做。

4.14 - 我怎样部署一些相似的系统?

这里提供了一些工具以便您部署一系列相似的OpenBSD系统。 siteXX.tgz 和 install/upgrade.site files

看上一小节 的内容。.

使用dump(8)恢复

在多数平台, 您的安装介质(软盘, CD, ⋯⋯。)上包含了系统恢复程序 restore(8), 它可以被用来恢复dump(8)产生的一个 备份, 因而, 您可以从一个floppy, CD, 或者bsd.rd文件启动, 然后 fdisk, disklabel 和 restore 恢复保存在其它地方的配置, 并 在系统上安装引导块 boot blocks. 更多细节请看这里。

磁盘镜像

遗憾的是, 没有一个磁盘镜像软件真正可以识别OpenBSD所采用的FFS文件系统, 并制作一个仅包含所有文档所在空间 的磁盘镜像。大多数磁盘镜像软件只把OpenBSD的分区当作"普通"的文件, 并只能为整个磁盘做一个磁盘镜像, 一般情 况下也能满足一些要求, 但这个文件包含了大量的无用空间——一个10G的/home分区需要10G的磁盘镜像文件, 即使目 录里一个文件也没有。您可以把这个镜像文件安装到一个更大的磁盘上, 但您无法直接使用这个磁盘的其余部分, 并且 您无法将这个镜像安装在小的磁盘上。

如果您可以考虑一下, 您会发现dd命令可以帮您做一些事情, 允许您用扇区到的复制方式把一块硬盘的内容拷贝到另一 块上, 这可以完成一些商业软件的功能而您则不必花钱。

4.15 - 我怎样得到dmesg(8)信息并反馈?

报告问题时至关重要的是要包含一个系统完整的dmesg(8)信息。可是, 当您需要报告一个问题时通常是计算机运行不正 常, 或者无法安装, 所以您可能无法进入磁盘, 没有网络或其它资源以使您获得dmesg发送到适当的mail list(邮件列表)。 但是还有其它的方法:

● 软盘:安装软盘和光盘上有足够的工具可以让您拷贝到您的dmesg, 您可以把dmesg拷贝到一张MSDOS格式的软盘 上, 用来在另一台计算机上读出来。把一张已经格式化了的MS-DOS格式的软盘放到您的软驱里, 运行下面的命 令:

# mount -t msdos /dev/fd0a /mnt # dmesg >/mnt/dmesg.txt # umount /mnt

● 如果您有第二台OpenBSD系统, 您也可以把工作不正常那台的dmesg写入一个OpenBSD格式的软盘——通常您手 里的OpenBSD安装盘上就有足够的空间可以放入dmesg文件。这种情况下, 上面的命令不用"-t msdos"参数。 ● 串口控制台:利用一个串口控制台捕捉问题计算机上信息并输出到另一台电脑通常是捕捉诊断信息的最佳途径 ——特别是当问题计算机启动后立即状态异常的情况, 同样第二台计算机也需要合适的串口电缆(通常是一根直

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 30/31 页)2009-5-3 23:01:34 OpenBSD4.5 FAQ中文版 第四章 - OpenBSD 4.5 安装指南

接电缆连接线)及终端模拟器程序以便可以把屏幕内容捕捉到文件。

如何建立串口控制台的详细说明在elsewhere in the FAQ; 为捕捉安装日志, 下面的命令在i386系统中使用:

当出现boot引导提示符出现时输入:

boot> set tty com0

这是通知OpenBSD用第一个串口(在pc文档里也经常被称为COM1或者COMA)做为串口控制台, 默认波特率是 9600。

Sparc/Sparc64

这些机器在启动时没有键盘将自动使用一个串口控制台。即使您安装了键盘和监视器也同样可以在出现"OK"提 示符时用以下命令强制系统使用串口控制台。

ok setenv input-device ttya ok setenv output-device ttya ok reset

● FTP:在一些情况, 假设您第一次设定网络正确, 您可以使用安装盘上的ftp(1)客户端把dmesg发送到一个本地的FTP 服务器上, 这样也可以得到dmesg文件。

[索引] [第三章 - 开始OpenBSD之旅] [第五章 - 从源代码构建系统]

[email protected] $OpenBSD: faq4.html, v 1.274 2009/02/27 03:45:58 nick Exp $

http://www.9971.us/OpenBSD4.5/c/faq4.html(第 31/31 页)2009-5-3 23:01:34 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

[索引] [第四章 - 安装指南] [第六章 - 网络]

5 - 从源码构建系统

目录

● 5.1 - OpenBSD不同版本的类型

● 5.2 - 为什么我需要从源代码构建系统?

● 5.3 - 从源码构建系统

❍ 5.3.1 - 纵览

❍ 5.3.2 - 安装或升级到最新的二进制文件

❍ 5.3.3 - 获取相关源代码

❍ 5.3.4 - 构建内核

❍ 5.3.5 - 构建用户岛

● 5.4 - 构建一个发行版

● 5.5 - 构建X

● 5.6 - 我为什么需要一个定制内核?

● 5.7 - 构建一个定制的内核

● 5.8 - 启动时配置

● 5.9 - 用config改变您的内核

● 5.10 - 启动时获得更为详尽的输出信息

● 5.11 - 常见的错误, 编译和构建时的一些问题和技巧

❍ 5.11.1 - 构建过程停止并显示 "Signal 11" 错误

❍ 5.11.2 - "make build"时因 "cannot open output file snake: is a directory"导致失败

❍ 5.11.3 - 我禁止了IPv6后计算机不工作了!

❍ 5.11.4 - 糟糕!我忘记先建立 /usr/obj 目录了!

❍ 5.11.5 - 技巧: 把/usr/obj设置成单独的分区

❍ 5.11.6 - 我怎样才能不构建源代码树上的某个部件?

❍ 5.11.7 - 我从哪里可以学到构建过程的更多知识?

❍ 5.11.8 - 我没有在FTP上找到任何快照版, 它们在哪里?

❍ 5.11.9 - 我怎样安装新版本的编译器(gcc)?

❍ 5.11.10 -什么是更新/etc, /var和/dev的最好方法?

❍ 5.11.11 - 有没有简单的方法改变所有的文件层次?

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 1/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

❍ 5.11.12 - 我能交叉编译吗?为什么不行?

5.1 - OpenBSD不同版本的类型

有三款不同"类型"的OpenBSD版本:

● -发行版 -release: 每隔6个月OpenBSD会推出新的CD版本。 ● -稳定版 -stable: 在发行版基础上加上经过深思熟虑的安全性和稳定性方面的补丁。 ● -当前版 -current: 包含开发者目前刚开发出来的最新程序和功能, 最终会成为下一个发型版。

Graphically, the development of these flavors looks something like this:

,------o------o----X 4.2 Stable | . . | . ,------o------o----X 4.3 Stable | . | . . | . | . ,----o------o--> 4.4 Stable | . | . | . . | . | . | . ,-----o--> 4.5 Stable | . | . | . | . | . | . | . | . -->4.2Rel----->4.3Rel----->4.4Rel----->4.5Rel----> Current

Time --->

-Current -当前版 拥有充满活力的OpenBSD社区最新的开发成果, 并在最终形成下一个发行版—— OpenBSD开发社区每6个月发布一个新的发行版, 到时当前版就变成了新的发行版, 源代码树不再更 改, 每个发行版永远不会变化;它们被制作成CD发行或放在FTP服务器上。

-Stable-稳定版 基于发行板, 而且是OpenBSD开发路线上该版本的一个分支, 当一个非常重要的安全 补丁发布时, 它会被融入稳定版这个分支;基于这个原因, 稳定版也被认为是"保养"分支。在上面的 插图里, 竖线表示发行版经过更新安全补丁形成稳定版。您也会注意到上面的例子中4.2稳定版用一 些"."连到了4.4发行版, 4.3稳定版也经过一串"."的路线连接到4.5的发行版上——这条线代表的意思是 OpenBSD开发团队仅对当前的发行版及前两个版本提供支持和维护(支持旧版本要花费资源和时间 的, 虽然我们在技术上可以继续提供对旧版本的支持, 但是我们更愿意把资源和时间集中利用在给用 户提供需要的新功能上。从发行版到稳定版的编译过程设计的非常简单(比如4.5的发行版更新到4.5 的稳定版)。

稳定版 是发行版加上在勘误表上公布的安全补丁。稳定版的功能与同版本号的发行版是一样的。 如果用户手册必须变动, 它可能也不会被加入到稳定版中, 换句话说新的设备驱动程序和新特征不会

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 2/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 加入到(上个)稳定版中。

有必要在这里说明:稳定版中"稳定"这个词并非暗示当前版是不可靠的, 相反, 当前版是对系统不断修 改和进化的;反而稳定版的操作及API将不会变化, 这样您就不会因为有新特色就去再熟悉系统和更 改您的任何配置, 或者因为使用新程序给系统带来任何不可预料的问题。

事实上, 我们希望OpenBSD不断改进, 目标就是让当前版更可靠, 更安全, 当然还有比稳定版有更多的 新特色。坦率地讲最好的OpenBSD版本是当前版。

警告:因为当前版在不断发展中。它的代码每分钟都可能在更改, 并且有充足的理由可以认为更改中 的系统代码要在一段时间内经过几次调整才可以变成正式的源代码。虽然开发者非常努力的工作 以确保整个系统顺利编译并没有大的纰漏, 但完全有可能您得到的一份当前系统代码不能编译成功, 不过也可能5分钟以后它已经被修正了。还有可能您会遇到设备检修日或者开发者正在更新主要系 统时, 那意味着您无法下载源码。如果您对这些可能发生的事情没有心理准备, 建议您还是不要使用 当前版的OpenBSD。

多数用户更应该运行稳定版或发行版。尽管如此, 很多人在生产环境中运行当前版, 这样的做法对确 定当前版是否存在漏洞和测试其新特征是至关重要的。可是如果您不知道怎样描述, 诊断, 和解决一 个问题, 那就不要告诉您自己(或其他人)您正在通过"使用当前版"来帮助OpenBSD项目。像这样的报 告——"它不工作了"并不是一个有意义的 错误报告" 。"最近的pciide driver程序的修改与我的 Slugchip-based IDE 网卡不兼容。并和系统的⋯⋯"这样的错误报告可能会更有意义。

有时很多"普通"用户也甘愿"冒险"使用当前版的OpenBSD, 最可能的原因是这些用户的一些硬件在发 行版上没有提供支持(所以, 稳定版上也未提供), 还有一种可能是用户希望尝试当前版的新特征。这 种情况下用户或者使用当前版或者不使用他们的硬件。这样看起来当前版也没有那么令人敬而远 之是吧, 不管怎样, 大家总不能只把希望寄托在等着开发者来帮您。

快照版

在两个正式发行版推出之间, 您也可以通过FTP镜像站点得到快照版, 顾名思义, 无论是什么代码, 代 码作者会在第一时间把源代码放到特定平台上的快照代码树中, 请记住, 在某些平台上快照版有可能 会经过数天的时间才会完成并分发。我们不承诺快照版的软件功能完整甚至不承诺您可以安装 它。通常是一个需要测试的变更导致产生了新的快照, 一些平台快照每天都在构建, 另外一些平台则 没有这样频繁。如果您想运行当前办版, 一个最近的快照版几乎包含了所有您需要的东西, 并且如果 您要通过源代码构建当前版, 在此之前您必须先升级到快照版。

有时人们会问有没有可能通过什么途径得到一份完全准确的快照版源代码以便用户自己构建一个 快照版。答案是不行, 第一, 这样做没有明显的益处, 第二, 构建快照版要看是否有需求, 是否时间允 许, 是否当时可以抽出人手。有些比较快的平台, 可能一天释放出几个版本的快照, 而一些比较慢的 平台可能会花上一周或更长的时间构建一个快照版。如果每个快照出现后全给出源代码那是很不 现实的。第三, 快照经常包含一些具有实验性质的代码, 这些代码并未进入代码树。

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 3/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 Upgrade vs. Update

您会经常看到"Upgrading(升级)"或"Updating(更新)"OpenBSD的说法, 虽然这两个词的意思很接近, 但 是用在OpenBSD中还是有一些区别的。

Upgrading(升级) 是一个安装OpenBSD新版本的过程, 升级后的版本拥有新功能。例如, 从4.4升级到 4.5, 或从6月12号的快照升级到6月20号的快照。升级的特点是, 您必须考虑是升级到当前版还是运行 升级的OpenBSD(根据升级指南按新版本的要求调整系统)。 Updating(更新) 在不改变原有系统的基本功能和二进制兼容性的状况下打补丁的过程。它的特点是 通过安装补丁程序(下载单独的补丁源代码并编译, 安装)或者按照稳定版制作流程将系统更新为同 版本号的OpenBSD稳定版分支的过程。当您更新系统时, 系统从发行版更新为稳定版, 例如:4.4发行 版变成版本号相同的4.4的稳定版。这个更新过程是"无痛苦"的, 例如, 您不必更改 /etc 目录下的文件 和其它系统配置。

例如, 您原来从CD安装一个了OpenBSD 4.3发行版的, 然后用少量的时间将系统更新成OpenBSD 4.3 的稳定版, 等OpenBSD 4.4新的版本发行后, 再用OpenBSD 4.4发行版的CD将它升级为OpenBSD 4.4的 发行版, 再用少量的时间将它更新成OpenBSD 4.4稳定版, 然后升级为4.5的发行版。

保持同步

把OpenBSD理解成一个体系完整的操作系统是非常重要的, 它不是由一个内核加上很多的应用程序 (译者注:应该是指像linux的各种发行版本), 您必须确保您的内核, "用户岛"(支持的应用和文件)及 ports 树都是同步的, 否则就会有麻烦。从另一个角度说(因为人们总是在这里犯错), 您不能在一个月 前的老系统上运行最新的ports树的或者重新编译一个当前版的内核并希望它可以与发行版的用户岛 一起工作。没错它意味着如果您想运行今天刚被加进ports上新程序您必须升级您的系统。非常抱 歉, 但这里不得不重复, OpenBSD的资源很有限。

还有一个也需要明白的是OpenBSD仅支持一个方向上的升级:从老版本升级到新版本, 和从稳定版升 级到当前版。例如:您正在使用4.4.的当前版, 但是觉得它不太安全, 想让系统变成4.4的稳定版——这 样做是不行的。这个您自己决定, 如果您用非官方的方式"升级"后系统出现问题, 开发团队也无能为 力。 这也就是说, 您在决定是否升级到当前版之前一定要深思熟虑。

5.2 - 为什么我需要从源代码构建系统?

实际上, 您非常可能不需要从源代码编译系统。

一些为什么不从源代码编译系统的原因:

● 我们不对通过用户自己编译源码而升级系统的方式提供支持。 ● 您编译自己的系统不会带来性能上的改善。 ● 更改编译器选项可能对系统造成破坏而不是有所改进。

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 4/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

一些您可能希望或必须从源代码编译系统的原因:

● 测试或开发新特征。 ● 编译系统对计算机来讲是一个繁重的工作, 当您想确认您自己组装或刚到手的新机器的是否 真正拥有很好的性能表现时, 编译系统是一个的办法。 ● 您希望把系统更新成稳定版分支。

● 您想为某些特殊应用制作一个定制化程度很高的OpenBSD系统。

OpenBSD团队一直在推出各种平台上基于当前版的非常正规的快照版, 快照版包含了当前版的所有 功能, 如果您想运行当前版, 也许快照版是个不错的选择。

最普遍的从源代码构建系统的原因是想把系统更新成稳定版, 这是唯一被支持的将发行版更新成稳 定版的方式。

5.3 - 从源码构建系统

5.3.1 - 构建过程纵览

从源码构建OpenBSD系统包括下面几个步骤:

● 升级到最新的二进制文件。

● 获取适合的源码。

● 创建新内核并从它启动。

● 建立"用户岛"("make build")。

一些用户可能希望执行两个另外的步骤, 取决于他们想构建什么样的系统或是否安装了"X":

● 构建一个发行版。

● 构建 X。

5.3.2 - 安装或升级到最新的二进制文件

从源代码构建系统的第一个步骤就是确保您安装了最新的二进制文件。从下面的表格里找出您的 位置, 目标及应该安装或升级到哪种二进制文件: You are at Goal Binary upgrade to then ... New Old -release Newest release Done! release -release -stable Newest release Fetch & build -stable Old -stable -stable Newest release Fetch & build -stable

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 5/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

-release -current Latest Snapshot (optional) Fetch & build -current Old - -current Latest Snapshot (optional) Fetch & build -current current

我们推荐您在安装时选择"升级"选项来进行二进制文件的安装。如果不行, 您也可以参考这里的方 法解压二进制文件。无论如何, 您必须完整地升级, 即使升级会对用户或/etc目录造成影响。

5.3.3 - 获取相关的源代码

OpenBSD的源代码是用CVS系统进行控制管理的, 而cvs(1)是用来从您想得到的源上拖一份拷贝到您 本地计算机。这个过程可以通过一个AnonCVS服务器完成, (AnonCVS 服务器是一台OpenBSD专用 的, 保存了OpenBSD项目所有资源的公共CVS仓库);也可以用CVSup从您维护的本地CVS仓库完成, 或者用CVSync软件包, 它在packages里面提供。 CVSup也可以被用做"校验"模式, 不过我们不在这里 讨论。如果您要在多台计算机上维护源代码树, 您可能发现用CVSup或者CVSync在本地建立并维护 CVS仓库是一个不错的选择。

当您选定AnonCVS服务器后, 您必须"校验"(获取)源代码树, 然后您可以运行"update"维护您的源代码 树, 也就是把升级文件拖到本地代码树中。

CVS(1)命令有很多参数, 一些参数是校验和更新本地代码树必需的, 其他的参数可能破坏您本地的代 码树, 参照并理解这里的说明是很重要的。

升级成 -当前版 本例中我们假设使用一台被称为[email protected]:/cvs的公用AnonCVS服务器, 我们同样 假设您使用sh(1)作为您的shell, 如果您使用了一个不同的shell, 您需要调整这里的部分命令。

获取一个当前版的CVS src树, 您可以用下面的命令:

# cd /usr # export [email protected]:/cvs # cvs -d$CVSROOT checkout -P src

一旦您有了源代码树, 您稍后可以更新它:

# cd /usr/src # export [email protected]:/cvs # cvs -d$CVSROOT up -Pd

更新成 -稳定版

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 6/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

如果您想获取稳定版分支, 那您需要在check out里使用修饰符"-r":

# cd /usr # export [email protected]:/cvs # cvs -d$CVSROOT checkout -rOPENBSD_4_5 -P src

它将从OpenBSD_4_4分支把src树拖下来, OpenBSD_4_4分支也被称作"补丁分支"或"稳定版"。您更新 源代码也一样:

# cd /usr/src # export [email protected]:/cvs # cvs -d$CVSROOT up -rOPENBSD_4_5 -Pd

事实上CVS足够体贴地在获取文件系统时粘了一个"标签", 您不用输入上面命令的"- rOPENBSD_4_4"这部分, CVS将一直记着"-rOPENBSD_4_4"这些内容, 除非您明确的清除它们或使 用"-A" 选项更新标签。可是, 也许在CVS命令行里多提供一些参数比少提供一些参数好。

这里仅仅对"src" 树进行了同步, 您还需对""树及"ports"树做同样的步骤。所有的OpenBSD组 件必须保持同步, 您所用到的所有的树应该同时校验和更新。您可以用一条命令命令语句同时校验 这些树(以稳定版为例):

# export [email protected]:/cvs # cd /usr # cvs -d$CVSROOT checkout -rOPENBSD_4_5 -P src ports xenocara

然而, 更新过程必须在各自的目录中逐项完成。

在这点上无论您是想更新成稳定版或者升级为当前版您必须有一个有效的源代码树。这个过程要 求您非常仔细, 可能您本想把代码树更新为稳定版却因参数不对升级成当前版了。请仔细对比以上 命令的差别, 以免更新或升级时搞颠倒了。

预先装入src.tar.gz, sys.tar.gz树

虽然您可以通过AnonCVS服务器下载整个代码树, 然而, 如果您先从OpenBSD发行版CD或FTP服务

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 7/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 器上将代码树预装载到您的本地计算机上, 将大大节省您的带宽和时间, 特别是您想将发行版更新为 稳定版时, 稳定版的源代码树只在发行版的基础上对少量文件进行了更改。

把源代码树从CD光盘上解压到 /usr/src 目录里(假设CD已经被挂载到 /mnt):

# cd /usr/src; tar xzf /mnt/src.tar.gz # cd /usr; tar xzf /mnt/xenocara.tar.gz # cd /usr; tar xzf /mnt/ports.tar.gz

原代码树也可以通过FTP服务器下载, 它在ftp上被分割成了两个文件, 这样做对那些只想用其中某一 个文件进行更新或升级的用户来说的可以明显地减少下载时间。这两个文件分别是sys.tar.gz(它包含 了用来产生内核的文件)和src.tar.gz(包含了除ports树及X11的源代码外的其它"用户岛"应用程序)。通 常情况下, 无论怎样您都需要安装这两个文件。 我们假设您已经把src.tar.gz 和 sys.tar.gz这两个文件 拷贝到了/usr目录下:

# cd /usr/src # tar xzf ../sys.tar.gz # tar xzf ../src.tar.gz # cd /usr # tar xzf xenocara.tar.gz # tar xzf ports.tar.gz

并非所有的人需要全部解压缩这些系统创建组件, 但是因为所有系统组件必须进行同步, 您通常情况 下需要在本地磁盘中预先装入这些系统组件。

通常的CVS建议 如前文所述, 一些选项确保了OpenBSD可以得到正确的src树。上面的"-P"选项就是 其中之一:它删除那些空目录。源代码树经过多年的演变, 很多目录被建立或者删除了, 但有时某个 空的老目录可能会和一个当前使用的新文件同名。没有使用"-P"参数您刚刚校验的源代码可能无法 编译成功。

还有在"update"命令更新时使用的"-d"选项——它重新创建在初次checkout时加入的目录。要想成功 更新您必须使用"-Pd"选项。 有经验的CVS用户可能对我们例子中指定并使用的CVSROOT产生疑 问, 因为它应该包含CVS服务器的具体的地址, 这时正确的, 用户有足够的时间用自己需要的服务器 修改默认的"[email protected]:/cvs", 很多人建议在例子中总是指定一个明确 的CVS仓库。值得注意的是, 当CVS(1)可以直接使用CVSROOT环境变量时因为前提条件是它的其 余其余参数是不变的。 还有一个好方法是在您的主目录下建立一个 .cvsrc文件, 制定某些默认的选 项。这里有一个 .cvsrc文件的例子: example.cvsrc文件:

$ more ~/.cvsrc cvs -q [email protected]:/cvs

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 8/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 diff -up update -Pd checkout -P

此文件让cvs使用指定的AnonCVS服务器——[email protected]:/cvs , 隐藏所有一般不需要 的屏幕信息("-q" 是 "quiet", 安静的), "cvs up"命令默认使用 "-Pd"选项, "cvs diff" 因为"-u"选项默认提 供"unified diffs", 还有 "cvs checkout" 将使用"-P"选项。虽然这很方便, 但是如果您忘记了要先建立这个 文件, 或者说您在没有这个文件的计算机上运行用简化的命令, 那将出问题。

因为源代码树是主要是由大量小尺寸文件构成的, 开启所在分区的soft updates通常可以提高计算机 的性能。

5.3.4 - 构建内核

我们这里假设您需要构建一个标准内核(GENERIC或GENERIC.MP)。一般情况下这正是您需要的, 不要在自己尚未精通怎样构建标准内核时去考虑构建自己的定制内核。

很明显内核对计算机硬件部分有很强的依赖性。内核源代码位于 /usr/src/sys 目录。 一部分 OpenBSD内核源代码可以应用在所有平台上, 其余的则只能使用在特定的处理器或构架上。如果您 看了 /usr/src/sys/arch/ 目录, 您可能会有一些迷惑——例如, 那里分别有 mac68k, m68k and mvme68k 目 录。这是因为, 虽然mvme68k and mac68k 系统全使用同样的处理器, 但这三种构架却有很大的差异, 它们需要不同的内核 (计算机构架的设计比处理器的设计要复杂得多!)。无论如何它们的部分内核 是通用的, 这些部分保存在m68k 的目录下。如果您想为这三种计算机建立一个基于m68k构架简单 内核, 使用m68k目录下的内核源代码不会产生任何问题。如果您想构建专用的内核您就需要使用"专 用"构架目录, 例如mvme68k目录。

内核构建基于内核配置文件, 它位于/usr/src/sys/arch//conf目录内。内核构建包含使用 config(8)程序生成内核文件并把它写入一个内核编译目录这两个过程, 生成的内核文件为/usr/src/sys/ arch//compile/。 在这个例子中我们假设您使用i386平台:

# cd /usr/src/sys/arch/i386/conf # config GENERIC # cd ../compile/GENERIC # make clean && make depend && make [...lots of output...] # make install

用您的平台名称替换第一行的"i386" 。用 machine(1) 命令可以告诉您您机器的平台名称, 如果想编译 一个通用内核第一行用命令"cd /usr/src/sys/arch/`machine`/conf" 。

这时, 重新启动您的机器以便激活新内核。注意下一个步骤要求在新内核启动后进行, 如果您遵照上

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 9/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 面的建议升级到最新的快照版, 那么是否需要重新启动就无关紧要了。因为应用编程接口发生了变 化, 而旧内核将无法运行新的程序, 但是新内核通常支持旧的程序。

变更的上述过程:源代码只读

有些时候, 您可能希望确保您的 /usr/src/sys 目录(源代码所在目录)不被改动。这可以通过下面的命 令完成:

$ cd /somewhere $ cp /usr/src/sys/arch/i386/conf/GENERIC . $ config -s /usr/src/sys -b . GENERIC $ make clean && make depend && make

注意:编译内核并不需要是root身份, 但是安装新内核必须用root身份。

5.3.5 - 构建用户岛

OpenBSD使用了一个特殊的步骤。在其他操作系统上您很熟悉的操作步骤似乎多数在OpenBSD上 全无法使用, 如果您问为什么别人还会嘲笑您。

● 清空 /usr/obj 目录并且重建符号链接:

# rm -rf /usr/obj/* # cd /usr/src # make obj

注意使用 /usr/obj 目录是强制性的。 如果您没有做这步就开始往下进行了, 那您的src树将很 糟糕。

● 确保所有相关目录已经被建立了。

# cd /usr/src/etc && env DESTDIR=/ make distrib-dirs

● 构建用户岛:

# cd /usr/src # make build

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 10/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 这个步骤编译和并按适当的顺序安装了所有的"用户岛"应用。这是一个相当耗时的步骤—— 一台非常快的计算机也许可以在一个小时内完成, 一台很慢的计算机可能会花上几天的时 间。当这个步骤完成时您的计算机就有了编译过的新二进制文件。 ● 如果构建-当前版:更新 /dev 和 /etc, 变化请参阅current.html。如果升级(先参阅upgrade process) 后想更新成稳定版, 或者安装相应的starting binary, 那这一步不需要做。

5.4 - 构建一个发行版

什么是发行版及为什么我要制作一个自己的发行版?

一个发行版包含了完整的系统创建组件, 它可以被用来在其他的计算机上创建OpenBSD系统。如果 您只在一台计算机中运行OpenBSD, 那您不必制作一张发行版, 如上所述构建过程中您需要完成所有 必要的工作。这里举一个例子, 您可以在最快的计算机上构建一个稳定版, 然后用它制作一个自己的 发行版, 用自制的发行版来安装您办公室的其它计算机。

制作发行版的过程用到了上面构建用户岛时在 /usr/obj 目录下产生的二进制文件, 所以您必须先完 成"用户岛"的构建并且保证/usr/obj目录文件完好无损才可以制作发行版, 一个可能会产生的问题:如 果您为了提升性能用一个memory disk做为 /usr/obj目录, 那您不能在构建用户岛和制作发行版之间启 动!制作发行版的过程需要两个工作目录, 我们称它们为DESTDIR 和 RELEASEDIR。所有原先 OpenBSD发行版所带组件将会按原有的目录结构拷贝进DESTDIR目录中, 然后它们会被tar打包进 DESTDIR and RELEASEDIR.目录, 当制作过程完成时完整的OpenBSD发行版会保存在RELEASEDIR目 录中。制作过程中会使用 /mnt这个位置, 所以在制作发行版过程中其他的操作不能占用/mnt。为了 举例方便, 我们假设DESTDIR 的位置是/usr/dest, 而RELEASEDIR在/usr/rel目录。

这个发行版包含了一系列原版OpenBSD没有的程序, crunch 和 crunchgen可以把许多单独的二进制文 件组合成一个可执行文件, 系统创建(Set up)时可以调出这个可执行文件中所需二进制文件, 这也是 怎样把一系列独立的程序压缩进软盘或其他创建介质里的内存盘内核的方法。必须在制作您的发 型版以前先完成这些程序的构建。这些程序仅需要构建和安装一次, 但因为人们经常忘记这一步骤, 而且这些程序构建过程很快, 所以有些人选择把构建这些程序的命令包含在一个制作发型版在脚本 里, 也就是在每次构建发行版时全重新构建一遍。

注意:对当前版和即将发布的4.5版来讲crunch 和 crunchgen 包含在基本系统内, 请跳过下面单独构建 (separate build )这一步骤。

您必须拥有root的权限才可以制作一个自己的发型版。

构建一个发行版

首先, 如果这是第一次在这台计算机上制作发行版, 先构建crunch 和crunchgen:

# cd /usr/src/distrib/crunch && make obj depend all install

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 11/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

现在, 我们定义我们的DESTDIR 和 RELEASEDIR 环境变量:

# export DESTDIR=/usr/dest # export RELEASEDIR=/usr/rel

我们现在清空DESTDIR 并创建所需目录:

# test -d ${DESTDIR} && mv ${DESTDIR} ${DESTDIR}.old && rm -rf ${DESTDIR}.old &

# mkdir -p ${DESTDIR} ${RELEASEDIR}

RELEASEDIR目录是否清空并不您影响制作发行版, 但是如果发行版内的文件或文件名称发生了变 化, 将不会覆盖原来的旧文件, 如此一来您的制作的发行版可能含有没用的文件, 所以您应该在构建 发行版以前也将这个目录清空。

我们现在来制作发行版:

# cd /usr/src/etc # make release

发行版制作完毕后, 您最好再检查一下, 确保tar压缩文件和DESTDIR目录里的文件匹配, 执行这个命 令后屏幕输出的内容应该很少。

# cd /usr/src/distrib/sets # sh checkflist

您现在已经制作并检查了RELEASEDIR目录下发行版的组件文件, 这些文件现在可以被用来在其他 的计算机上创建或升级OpenBSD系统了。

制作发行版的权威指南在release(8).

说明:如果您希望通过HTTP方式发布您的发型版, 让其他计算机通过执行脚本的方式创建或升级系 统, 您需要在发行版内增加一个"index.txt" 文件, 它要包含您自制发行版的所有系统创建组件的名 单。

# /bin/ls -1 >index.txt

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 12/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

5.5 - 构建 X (Xenocara)

从X.org v7开始X改变为"模块化构造"系统, 把x.org源代码树分成了300个左右的独立程序包。

考虑到OpenBSD用户的方便性, 一个被称作Xenocara的"变化构建"系统被发展出来。这个系统把X "变回了" 一个大的源代码树, 它的构建过程只需要一个步骤。另一个长处, X的构建过程更像今后新 版本的OpenBSD构建过程, 而非老版本。官方的X构建说明在/usr/xenocara/README这个文件和 release(8)里。

获得源代码

一般来讲xenocara树的位置在/usr/xenocara , 源代码被以xenocara模式存在CVS中。所以校验步骤是:

$ cd /usr $ cvs [email protected]:/cvs checkout -P xenocara

构建 Xenocara

构建OpenBSD支持的标准xenocara树不需要任何额外的工具。

# cd /usr/xenocara # rm -rf /usr/xobj/* # make bootstrap # make obj # make build

如果您希望自行修改源代码构建自己风格的X, 您可能需要一些packages, 详情请参阅/usr/xenocara/ README文件。

制作一个发行版

制作X的发行版和制作OpenBSD的发行版过程类似, 先定义两个目录DESTDIR and RELEASEDIR, 目 的和上面制作OpenBSD发行版是一样的。您可以把X的RELEASEDIR和OpenBSD的RELEASEDIR放 在同一个目录里, 但是DESTDIR会在这个步骤中被删除和重新建立。如果您操作得很仔细, 不会有什 么问题, 不过您用另一个目录做DESTDIR也许会"安全"一些。

这个例子中, 我们使用/usr/dest 作为DESTDIR , /usr/rel 作为RELEASEDIR , 注意, 您进行这步时确保您 上面的步骤已经完成了。

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 13/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

# export DESTDIR=/usr/dest # export RELEASEDIR=/usr/rel # test -d ${DESTDIR} && mv ${DESTDIR} ${DESTDIR}- && rm -rf ${DESTDIR}- &

# mkdir -p ${DESTDIR} ${RELEASEDIR} # make release

等这个过程结束了, 您就有了一套自己的X发行版, 它在$RELEASEDIR这个目录里。

5.6 - 我为什么需要一个定制内核?

事实上, 您也许不需要。

所谓的定制内核是指更改OpenBSD标准内核配置文件GENERIC而构建的系统内核。一个定制内核 可以基于-release, -stable或-current的源代码, 只要修改任何一个GENERIC内核配置文件。OpenBSD开 发团队仅对您编译标准内核提供支持, 但不提供对编译用户定制内核的技术支持。

标准的OpenBSD内核配置(GENERIC)被设计成适合大多数用户。很多用户尝试通过修改标准内核 配置来提升系统性能, 因而搞坏了他们的系统。还有一些人相信只有通过定制系统内核才能使系统 运行最佳, 对OpenBSD来说这是错的。只有经验和知识最丰富的用户在处理一些最苛求的应用时才 应该考虑一个定制的内核或系统。

一些为什么您需要一个定制内核的原因:

● 您的确清楚自己正在做什么, 并且您想把OpenBSD"塞"进一台内存很小, 您不需要要软驱和光 驱的计算机。 ● 您的确清楚自己正在做什么, 并且希望删除默认选项或者添加默认未启用的选项(并且有充分 的理由这样做)。 ● 您的确清楚自己正在做什么, 并且希望启用实验性的选项。 ● 您的确清楚自己正在做什么, 并且需要一个标准内核未提供的特殊功能, 而且不会在出问题后 去问:为什么我的OpenBSD不工作了?我的系统哪里出问题了?

一些为什么您不需要一个定制内核的原因:

● 通常情况下您不需要。 ● 您不会得到一个更快的系统。 ● 您可能会让系统减少一些可靠性。 ● 开发团队不会提供技术支持。 ● 您不希望重大安全补丁发布之前, 再给自己系统添点漏洞。 ● 您把系统搞得一团糟时其他用户和开发人员会取笑您。 ● 定制内核往往更容易破坏系统而非改善系统性能。

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 14/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

一个用户常犯的错误是在内核配置文件中删除设备驱动, 这样做也许会提高您机器的启动速度, 但是 一旦硬件出现问题这种做法加大了系统恢复的难度。虽然删除设备驱动可以构建一个小一点的系 统内核, 但实际上并没有给系统带来任何显而易见的速度提升。删除调试和错误校验的确可以提升 一小部分系统性能, 然而一旦系统出现问题您不能找出原因。

再强调一次, 开发者通常不理睬定制内核的系统漏洞报告, 除非这个系统漏洞也会出现在标准内核的 OpenBSD系统上。可别说我没提醒您哦。

5.7 - 构建一个定制的内核

我们这里假设您已经读了上一小节, 而且确实想自寻烦恼;另外还假设您的某个愿望无论是通过 (Boot time configuration (UKC>)或者 config(8)ing a GENERIC kernel配置标准内核全不能满足。—— 如果上面两个假设全不成立, 说实话, 您还是应该踏踏实实地使用标准内核编译系统。

默认情况下在是通过位于/usr/src/sys/arch//conf/目录下的配置文件控制系统内核生成。所有 的平台的目录里全有一个文件, GENERIC, 它是该平台下OpenBSD的标准内核配置文件。目录里也 可能有一些特殊目的的内核配置文件, 例如专为小内存计算机设计的内核配置文件, 或者专门为无盘 工作站设计的。通过config(8)您可以处理内核配置文件, config(8)在../compile下创建并填充一个汇编 目录, 典型的安装过程在/usr/src/sys/arch//compile/下进行, config(8)也生成一个Makefile和其余成功构 建内核的所需文件。

您可以在内核配置文件中添加选项从而定制您自己的内核。通过这个文件您可以保留或删除内核 支持的设备。这里有很多选项帮助您定制内核。我们在这里仅讨论一些最常用的选项, 您可以查询 用户手册中关于options(4)的详细说明, 它罗列出了全部的内核配置选项, 因为用户手册会随时间变 化, 请您确保您的用户手册上的OpenBSD版本和您将配置的内核相匹配。您也可以参考自己计算机 所属平台内核配置文件的范例。

除非您有很充分的理由, 否则不要添加, 删除或修改原有的内核配置选项! 也不要编辑GENERIC内 核配置文件!! GENERIC是OpenBSD团队唯一提供技术支持的内核配置文件, 在/usr/src/sys/arch/ /conf/GENERIC和/usr/src/sys/conf/GENERIC这两个文件全是OpenBSD开发团队分发的(不要 编辑它们)。当您使用定制内核的系统出现问题, 您往往会被告知避免此问题的方法是使用标准内 核。并非所有的选项全可以与其余的选项彼此兼容, 许多选项是保证系统正常工作所必须的。您不 能保证您的定制内核可以成功编译, 也不能保证您定制的内核编译成功就可以正常使用了。

您可以在下列文件中参阅自己所属平台的内核配置文件:

● alpha Kernel Configuration Files

● i386 Kernel Configuration Files

● macppc Kernel Configuration Files

● sparc Kernel Configuration Files

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 15/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

● sparc64 Kernel Configuration Files

● vax Kernel Configuration Files

● hppa Kernel Configuration Files

● Other Arch's

仔细看这些文件您会发现靠近开始的位置有这样的一行, 像:

include "../../../conf/GENERIC"

这说明这个内核配置文件包含了其它各平台通用的选项。在您编译内核前务必仔细审查文件sys/ conf/GENERIC.

在内核配置文件里内核配置选项的格式如下:

option name

option name=value

例如, 增加一个debug(调试)选项, 您可以像这样加上一行:

option DEBUG

OpenBSD内核将配置选项编译成预处理指令, 因此如果您添加了DEBUG选项, 编译程序将把- DDEBUG选项的源码编译进系统内核, 选取此项等同于使用#define DEBUG 命令列选项。

有些时候, 您也许想在"src/sys/conf/GENERIC"文件里关闭一些已经定义的选项, 最好的方式是建立一 个拷贝, 在拷贝上进行删除选项的修改工作。例如您非常想关闭系统的调试工具debugger(不推荐这 样做), 您可以增加一行, 像这样:

rmoption DDB

默认的内核配置文件src/sys/conf/GENERIC开启了DDB选项, 您可以通过rmoption选项关闭它。

再次强调, 请参阅options(4) 以便获取更多的关于个选项的详细信息。另外需要说明的是许多选项有 其相关的用户手册——永远记住在您对内核配置文件添加和删除任何选项前详细阅读这些资料中

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 16/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

的细节。

构建一个定制内核

这个例子中, 我们修改内核配置文件让内核支持boca(4)ISA多串口卡。因为这种卡的驱动与其他驱动 冲突所以标准内核是不支持的。另一个通常需要定制内核的原因是计算机使用了RAIDframe(磁盘阵 列), 因为其驱动过大没有被加入到标准内核中。这里有两种制作定制内核的方法::一种是把 GENERIC做一个拷贝, 并编辑拷贝的文件;另外一种是建立一个"包装"文件, 它里面"包含了"标准的 内核配置文件和一些您自己需要的选项。这个例子中我们的包装文件像这样:

include "arch/i386/conf/GENERIC"

boca0 at isa? port 0x100 irq 10 # BOCA 8-port serial cards pccom* at boca? slave ?

上面的语句意思是包含了标准的内核配置文件, 下面的两句摘自标准内核配置文件里关于boca(4)卡 的选项, 并按照需要调整了IRQ, 标准配置文件里这个选项是关闭的(加#号注释掉的)。这样做的好处 是用包装文件避免对标准内核进行修改, 并且可以增加对一些设备支持(后两行), 但是包裹文件不能 删除原有驱动(虽然通常情况下, 删除原有驱动是个坏主意。)

另一个产生定制内核文件的方法是将标准内核文件拷贝一份, 在这个不同名的拷贝文件上根据自己 的需要进行修改, 这样做的缺点是标准内核得不到及时的更新, 更新全在拷贝文件里, 您不得不重新 制作您的配置文件。 无论两种之中哪种方法, 当您用config定制内核内核配置文件后, 参考上面5.34 构建内核的方法构建 您的定制内核。全部关于制作定制内核的说明在config(8)用户手册上。

5.8 - 启动时配置

某些时候重新启动系统, 您会发现内核找到了您配置的硬件设备, 但是存在IRQ错误, 而您却需要这 些设备正常工作。这种情况下您不需要立刻重新构建内核, 只要使用OpenBSD的启动时内核配置这 一功能。它可以在这次启动时修正内核的错误, 但是当您每次重新启动还需要做同样的配置才可以 修正错误, 所以这种办法只是暂时的修正内核错误, 而您还是应该用config(8)重新修改您的内核。您 的定制内核肯定需要option BOOT_CONFIG这个启动时配置选项, 这个选项已经包含在标准内核配 置文件里了。这个文件的绝大部分说明在boot_config(8).的用户手册里。

您在启动时使用-c选项就可以进入用户内核配置或UKC。

boot> boot hd0a:/bsd -c

无论您想启动哪种内核, 在启动时使用-c选项可以让您进入UKC提示符状态, 这里您可以对内核执行

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 17/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 命令, 让它改变或删除指定设备的加载或者加载新设备。

这里提供了一些常用的UKC下的命令:

● add device - 用一个设备驱动添加另一个新设备 ● change devno | device - device- 修改一个或多个设备 ● disable devno | device - device- 禁用一个或多个设备 ● enable devno | device - 启用一个或多个设备 ● find devno | device - 寻找一个或多个设备 ● help - 命令的概要帮助信息 ● list - 列出所有已识别的设备 ● exit/quit - 继续启动 ● show [attr [val]] - 显示那些具有指定值属性的设备

一旦您完成了对内核的配置工作, 您应该使用quit或exit命令让计算机继续启动。启动后这些更改将 永久保存在您的内核映像里(译者注:内核映像储存着内核的代码和数据), 就像5.9 –用config改变您 的内核这一小节里描述的那样。

5.9 - 用config改变您的内核

使用config(8的 -e 和 -u 选项对您有很有帮助, 它可以极大的节省编译定制内核的时间。-e 选项可以 让您在启动时进入UKC或在启动后运行的系统上进行内核配置。这些更改会在下次启动后生效。 - u 选项可以在本次启动中测试内核更改的效果, 这里就是指您先用boot -c 进入UKC修改内核配置(并 应用 –u), 然后启动您的系统, 在启动过程中查看应用的内核修改是否满足您的要求。

从下面的例子中您可以看到ep* 设备失效了。为了安全起见您应该使用 -o 选项, 这样config可以把更 改的内核写入一个指定的文件。例如: config -e -o bsd.new /bsd 将把更改后的内核写入bsd.new文件, 这个例子中使用 -o 选项, 因此内核的更改没有成功, 也就是说没有写回内核的二进制文件。更多错 误, 警告信息请参看config(8)的用户手册。

$ sudo config -e /bsd OpenBSD 4.4 (GENERIC) #1021: Tue Aug 12 17:16:55 MDT 2008 [email protected]:/usr/src/sys/arch/i386/compile/GENERIC warning: no output file specified Enter 'help' for information ukc> ? help Command help list add dev Add a device base 8|10|16 Base on large numbers change devno|dev Change device disable attr val|devno|dev Disable device enable attr val|devno|dev Enable device

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 18/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

find devno|dev Find device list List configuration lines count # of lines per page show [attr [val]] Show attribute exit Exit, without saving changes quit Quit, saving current changes timezone [mins [dst]] Show/change timezone nmbclust [number] Show/change NMBCLUSTERS cachepct [number] Show/change BUFCACHEPERCENT nkmempg [number] Show/change NKMEMPAGES shmseg [number] Show/change SHMSEG shmmaxpgs [number] Show/change SHMMAXPGS ukc> list 0 audio* at sb0|sb*|gus0|pas0|sp0|ess*|wss0|wss*|ym*|eap*|eso*|sv*|neo*|cmpci* |clcs*|clct*|auich*|autri*|auvia*|fms*|uaudio*|maestro*|esa*|yds*|emu* flags 0x0 1 midi* at sb0|sb*|opl*|opl*|opl*|opl*|ym*|mpu*|autri* flags 0x0 2 nsphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr* |ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|e p*|ep* phy -1 flags 0x0 3 nsphyter* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*| vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep *|ep*|ep* phy -1 flags 0x0 4 qsphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr* |ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|e p*|ep* phy -1 flags 0x0 5 inphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr* |ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|e p*|ep* phy -1 flags 0x0 6 iophy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr* |ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|e p*|ep* phy -1 flags 0x0 7 eephy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr* |ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|e p*|ep* phy -1 flags 0x0 8 exphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr* |ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|e p*|ep* phy -1 flags 0x0 [...snip...] ukc> disable ep 93 ep0 disabled 94 ep* disabled 95 ep* disabled 261 ep0 disabled 262 ep0 disabled http://www.9971.us/OpenBSD4.5/c/faq5.html(第 19/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 263 ep* disabled 264 ep* disabled 323 ep* disabled ukc> quit not forced

上面的例子中, 所有的ep*设备被内核禁用, 并且内核也不会检测ep*设备。某些情况下您在启动时通 过boot -c进入UKC, 您需要永久地将这些改动的内核写到一个输出文件, 为了达到这个目的, 您应该 使用 -u 选项。下面这个例子, 计算机启动后进入UKC, 并且禁用wi(4)设备。因为仅仅使用boot –c并 不能永久地改变内核, 所以这些改动的内核必须写入一个文件, 这里我们将通过boot –c后修改的内 核写入一个内核的二进制文件bsd.new。

$ sudo config -e -u -o bsd.new /bsd OpenBSD 4.4 (GENERIC) #1021: Tue Aug 12 17:16:55 MDT 2008 [email protected]:/usr/src/sys/arch/i386/compile/GENERIC Processing history... 105 wi* disabled 106 wi* disabled Enter 'help' for information ukc> quit

5.10 - 启动时获得更为详尽的输出信息

在启动时得到更加详尽的系统输出信息对出问题后的调试工作是很有意义的。假设您使用软盘无 法进入系统而需要得到更多的系统信息, 很简单, 在启动时进入"boot>"提示符后, 使用boot –c进入 UKC>, 然后:

UKC> verbose autoconf verbose enabled UKC> quit

现在您在启动时会有极为详细的系统输出信息。

5.11 - 常见的错误, 编译和构建时的一些问题和技巧

大多数情况下, 构建过程错误是因为操作时没有在规定的目录内进行操作。偶尔从最新的快照版构 建当前版也会出错, 但在构建发行版或稳定版时用户操作失误才是导致错误的最重要原因。

常见的错误如下:

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 20/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

● 没有从一个相应的二进制文件开始, 或武断地认为一周前的快照版已经是最新的了。

● 用错误的分支进行校验。

● 没有严格遵照 从源码构建系统的要求。

● 尝试定制或最优化您的操作系统。

这里还有一些您可能碰到的情况:

5.11.1 - 构建过程停止并显示 "Signal 11" 错误

在计算机上从源码构建OpenBSD或应用程序与其他任务相比艰巨的多, 计算机硬件的开销要高很多, 此时可能CPU, 内存, 硬盘全处在长时间满负荷工作的状态。因此, 如果您的硬件状态异常, 多数情况 可能出现在构建过程中。Signal 11是典型的硬件错误导致的, 通常是内存引起的, 但也有可能是CPU, 主板或者系统散热导致的。您的系统需要在非常稳定的状态, 否则无法进行程序的编译工作。有时 您可能发现修理或更换部件后会导致错误, 这些错误可以在今后采用其他方法得到确认。如果您有 一个硬件您很想在OpenBSD使用, 但是它导致系统错误, 您可以尝试一下快照版或发行版。更多的关 于Sig11的信息参看Sig11 FAQ。

5.11.2 - "make build"时因 "cannot open output file snake: is a directory"导致失败

这个信息包含了两个错误:

● 您没有获取或更新适合您的CVS树。 当您进行CVS校验时这步时, 您必须使用 "-P" 选项, 当您 通过CVS更新您的源代码树时, 您必须使用"-Pd" 选项, 您可以参看前面的文章。这些选项确保 了OpenBSD的发展, 他们删除了多余的目录并创建源代码更新或升级所需的新目录。 ● 您在构建系统前没有正确的创建obj目录。 构建源代码树时没有/usr/obj这个目录是不行的。

当您获取和构建您的源代码树时, 应该按照参照相关的说明进行。

5.11.3 - 我禁止了IPv6后计算机不工作了!

是吧, 请不要修改基本系统中您不清楚其真正含义的选项, 一个小地方的修改可能会给整个系统带来 巨大的灾难, 请在重新读一遍这里。

5.11.4 - 糟糕!我忘记先建立 /usr/obj 目录了!

您应该在"make build"前先进行"make obj", 现在构建过程会停止, 并且大量的目标文件会散落在/usr/ src目录内, 这太糟糕了。如果您想避免重新获取您的src tree, 您可以尝试下面的命令清除所有的obj 文件:

# cd /usr/src

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 21/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 # find . -type l -name obj | xargs rm # make cleandir # rm -rf /usr/obj/* # make obj

5.11.5 - 把/usr/obj放在单独的分区

如果您经常构建系统, 您可能会发现把/usr/obj 放到一个自己独立的文件系统内会比较快, 这种方法 的优点是简单, 而且它比"rm -rf /usr/obj/*"速度更快:

# umount /usr/obj # newfs YourObjPartition # mount /usr/obj

(译者注:newfs命令用来构造一个新的UFS文件系统)

然后运行 "rm -rf /usr/obj/*".

5.11.6 - 我怎样才能不构建源代码树上的某个部件?

有些时候您可能希望不构建源代码树上的某些部件, 通常是因为您已经安装了第三方软件包中某些 软件作为这个部件的替代品, 或者您不管什么原因想得到一个更"小"的发行版。这可以通过在/etc/ mk.conf里加入SKIPDIR 选项来实现。

说明:这样可能导致系统的崩溃。而且OpenBSD开发团队不对这种做法提供技术支持。

5.11.7 - 我从哪里可以学到构建过程的更多知识?

这里有一些资源:

● release(8)

● afterboot(8)

● mk.conf(5)

● /usr/src/Makefile

● Patch Branches (-stable)

● (for X) /usr/X11R6/README on your installed system

5.11.8 - 我没有在FTP上找到快照版, 它们在哪里?

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 22/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 快照版如果长时间放在那里可能被删除(也许是不再适用了), 或者是临近新发行版的发布期。

5.11.9 - 我怎样安装新版本的编译器(gcc)?

您只需要安装最新的快照版。

OpenBSD现在在代码树中提供两种编译器, gcc v3.3.5应用于大多数平台, 但在有些平台上也只提供 gcc v2.95.3, 那些平台还没有更换也许永远不会更换了, 原因是gcc3缺乏支持及它的性能不佳。

这两个编译器分属源代码树中的不同部分:

● gcc3: /usr/src//usr.bin/gcc ● gcc2: /usr/src/gnu/egcs/gcc

因为升级一个编译器有点像有鸡还是先有蛋的困惑, 更换成代码树中的编译器需要有一点额外的专 注。您不得不构建这个编译器两次——第一次从新的源代码上编译出新的编译器软件, 但是它是被 用旧编译器编译出来的, 第二部把它完全创建成新的编译器, 您应该按照以下几步来操作:

如果您的平台使用的是gcc 2.95.3:

# rm -r /usr/obj/gnu/egcs/gcc/* # cd /usr/src/gnu/egcs/gcc

- 或者 -

如果您的平台使用的是uses gcc 3.3.5:

# rm -r /usr/obj/gnu/usr.bin/gcc/* # cd /usr/src/gnu/usr.bin/gcc

通用的步骤(适用于v3.3.5 或 v2.95.3)

# make -f Makefile.bsd-wrapper clean # make -f Makefile.bsd-wrapper obj # make -f Makefile.bsd-wrapper depend # make -f Makefile.bsd-wrapper # make -f Makefile.bsd-wrapper install # make -f Makefile.bsd-wrapper clean # make -f Makefile.bsd-wrapper depend

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 23/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统 # make -f Makefile.bsd-wrapper # make -f Makefile.bsd-wrapper install

然后运行make build。

5.11.10 - 什么是更新/etc, /var和/dev的最好方法?

作为一条原则, OpenBSD源代码树并不会自动更改 /etc 目录下的文件。这意味着永远由系统管理员 决定是否需要更改这些文件。即使是升级也不例外。更新这些目录里的文件第一个步骤是测定系 统源代码的变化, 第二个步骤是手动再申请获得这些新的源代码。

例如, 要看源代码树中文件最近的变化, 用:

# cd /usr/src/etc # ls -lt |more

看任何OpenBSD发行版之间 /etc目录下文件的变化, 您可以用CVS命令, 例如您想知道4.3和4.4之间的 变化, 这样做:

# cd /usr/src/etc # cvs diff -u -rOPENBSD_4_3 -rOPENBSD_4_4

看4.4和当前版("HEAD", 到头了)之间的文件变化, 用:

# cd /usr/src/etc # cvs diff -u -rOPENBSD_4_4 -rHEAD

/dev/MAKEDEV脚本并不会做为make build过程的一个部分而自动被更新, 然而它是做为升级二进制 文件的一部分安装的。作为一般规则, 把它拷贝到待升级的计算机上并运行它是一个好主意:

# cd /dev # cp /usr/src/etc/etc.`machine`/MAKEDEV ./ # ./MAKEDEV all

一旦校验了源代码的变化, 再申请并将它们拖到您的本地代码树, 保存您以前的配置文件。

两个发行版之间的 /etc目录的值得关注的变化是:

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 24/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第五章 - 从源码构建系统

● /etc/protocols目录和 /etc/services目录的增加部分 ● 新的 (参看 /etc/sysctl.conf 文件) ● 更改默认的cron 工作。参看 /etc/daily目录 /etc/weekly目录, /etc/monthly目录, 和 /etc/security目 录 ● 所有的rc脚本, 包括netstart ● D设备变化, 如前所述 ● 文件层次的变化, 看/etc/mtree目录, 详参下一小节

● 新的用户 (/etc/passwd) 和新的组(/etc/group)

总而言之, 这些变化请参阅upgrade45.html(升级到4.5发行版)或者current.html(升级到当前版)。

5.11.11 - 有没有简单的方法改变所有的文件层次?

随着时间的流逝, 代码树中一些文件和目录被加进去, 而另一些则被从文件层次hierarchy中删除。同 样文件从属信息作为文件系统的一部分也在变化。一个简单的方法可以用mtree(8)确保您的文件层 次已经更新。 首先获取最新的源代码, 然后进行下面步骤:

# cd /usr/src/etc/mtree # install -c -o root -g wheel -m 600 special /etc/mtree # install -c -o root -g wheel -m 444 4.4BSD.dist /etc/mtree # mtree -qdef /etc/mtree/4.4BSD.dist -p / -u

您的文件层次现在已经更新了。

5.11.12 - 我能交叉编译吗?为什么不行?

交叉编译工具存在于系统中, 被开发者用来将编译的程序提交到其他平台。然而, 这些工具并不是万 能的灵丹妙药。

当开发人员将程序提交到一个新的平台, 第一个最大的挑战就是native-build, 从源码构建系统无论对 OS或机器都是非常繁重的任务, 而且可以非常好的测试系统的稳定性和兼容性。基于此点, OpenBSD的所有构建工作全在该平台本身进行, 也就是所说的本地构建, 未经本地构建, 就很难确保 在不同的平台上可以稳定地运行, 而非仅为了能启动系统。

[索引] [第四章 - 安装指南] [第六章 - 网络]

[email protected] $OpenBSD: faq5.html, v 1.168 2008/11/30 11:01:26 tobias Exp $

http://www.9971.us/OpenBSD4.5/c/faq5.html(第 25/25 页)2009-5-3 23:01:41 OpenBSD 4.5 FAQ中文版 第六章 - 网络

[索引] [第五章 - 从源码构建系统] [第七章 - 键盘与显示控制]

6 - 网络

目录

● 6.1 - 在深入之前

● 6.2 - 网络配置

❍ 6.2.1 - 探测和建立您的网络接口

❍ 6.2.2 - 默认网关

❍ 6.2.3 - DNS 解析

❍ 6.2.4 - 主机名

❍ 6.2.5 - 启用新设定

❍ 6.2.6 - 检查路由

❍ 6.2.7 - 将您的OpenBSD主机设置成一个转发网关

❍ 6.2.8 - 为网络接口设置别名

● 6.3 - 我怎样用OpenBSD作包过滤和防火墙?

● 6.4 - 动态主机配置协议(DHCP)

❍ 6.4.1 - DHCP 客户端

❍ 6.4.2 - DHCP 服务器

● 6.5 - 点对点协议

● 6.6 - 调整网络参数

● 6.7 - 使用NFS

● 6.9 - 用OpenBSD建立网桥

● 6.10 - 我怎样用PXE启动?

● 6.11 - 通用地址冗余协议(CARP)

● 6.12 - 使用 OpenNTPD

● 6.13 - 我可以使用哪些无线设备?

● 6.14 - 如何配置等价多路径路由?

6.1 - 在深入之前

如果您已经读过或者哪怕是仅仅部分理解了内核配置和创建及ifconfig(8)和netstat(1)的用户手册, 那么也会对您阅读理解本章的大部 分内容会有所帮助。

如果您是一个网络管理员, 而且您正在建立路由协议, 如果您正使用OpenBSD系统作为一个路由器, 如果您需要更深入的了解IP网 络, 那么您真的很需要阅读理解IP地址, 这是是一篇极好的文章。它包含了建立IP网络所需的基础知识, 特别是您管理一个以上的网 络时。

如果您管理着诸如web服务器、ftp服务器、mail服务器, 您会从reading the RFC上受益匪浅, 多数情况下可能您没无法阅读全部这些文 章。找几篇您感兴趣的, 或与您工作环境相关的来阅读, RFC详细说明了Internet上很多(数千)种协议的标准及它们应该如何工作 的。

6.2 - 网络配置

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 1/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

通常OpenBSD在安装过程中对网络进行了初次配置, 而且很容易让您明白它正在做什么和它如何做。所有的网络配置以纯文本方式 存放在 /etc 目录下。

6.2.1 - 识别和建立您的网络接口

在OpenBSD中接口被指定为网卡的类型而非连接类型, 您可以在启动过程中看到您的网卡被初始化, 或者启动后用dmesg(8)命令。 您还可以使用ifconfig(8)命令来查看您的网络接口。例如, 这里有一个Intel Fast Ethernet网卡的dmesg输出, OpenBSD使用的设备名是 fxp:

fxp0 at pci0 dev 10 function 0 "Intel 82557" rev 0x0c: irq 5, address 00:02:b3:2b:10:f7 inphy0 at fxp0 phy 1: i82555 10/100 media interface, rev. 4

如果您不清楚自己硬件的的设备名, 请参阅您平台下的支持硬件列表。您会发现很多常用网卡以及他们在OpenBSD里使用的设备 名。用设备名符号(如fxp)和一个内核分配的数字组合出了您的设备名(如fxp0)。这个数字分配基于不同的标准, 取决于卡和其它详 细系统信息。 一些卡的数字代表了它们被总线探测出的顺序, 其它可能是基于硬件资源设置或网卡的MAC地址。

您可以使用ifconfig(8)命令查看那些已经被识别的接口, 下面的命令将显示系统中全部的网络接口, 这里的输出显示仅有一个物理以 太接口fxp(4) 。

$ ifconfig lo0: flags=8049 mtu 33224 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5 lo1: flags=8008 mtu 33224 fxp0: flags=8843 mtu 1500 address: 00:04:ac:dd:39:6a media: Ethernet autoselect (100baseTX full-duplex) status: active inet 10.0.0.38 netmask 0xffffff00 broadcast 10.0.0.255 inet6 fe80::204:acff:fedd:396a%fxp0 prefixlen 64 scopeid 0x1 pflog0: flags=0<> mtu 33224 pfsync0: flags=0<> mtu 2020 sl0: flags=c010 mtu 296 sl1: flags=c010 mtu 296 ppp0: flags=8010 mtu 1500 ppp1: flags=8010 mtu 1500 tun0: flags=10 mtu 3000 tun1: flags=10 mtu 3000 enc0: flags=0<> mtu 1536 bridge0: flags=0<> mtu 1500 bridge1: flags=0<> mtu 1500 vlan0: flags=0<> mtu 1500 address: 00:00:00:00:00:00 vlan1: flags=0<> mtu 1500 address: 00:00:00:00:00:00 gre0: flags=9010 mtu 1450 carp0: flags=0<> mtu 1500 carp1: flags=0<> mtu 1500 gif0: flags=8010 mtu 1280 gif1: flags=8010 mtu 1280 gif2: flags=8010 mtu 1280 gif3: flags=8010 mtu 1280

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 2/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

您可以看见ifconfig(8)给出了很多(包括fxp0在内的)网卡的详细信息。上面的例子中网卡已经配置成功, 很明显, 因为在fxp0上已经配 置了IP网络, 因此可以看到"inet 10.0.0.38 netmask 0xffffff00 broadcast 10.0.0.255"。 同样, UP 和 RUNNING 标记也已经被设置了。

最后, 您会发现默认启用了很多其它的网络接口。那是为不同功能设置的虚拟接口, 下面的用户手册详细的解释了这些虚拟接口:

● lo - 回送接口

● pflog - 包过滤信息接口

● sl - 串行线路网络接口

● ppp - 点到点协议

● tun - 隧道网络接口

● enc - 封装接口

● bridge - 以太网桥接口

● vlan - IEEE 802.1Q 封装接口

● gre - GRE/MobileIP 封装接口

● gif - 通用 IPv4/IPv6 隧道接口

● carp - 通用地址冗余协议接口

接口在启动时被配置, 配置通过设置文件/etc/hostname.if(5) , 其中if会被您的接口的全名所代替, 如上面的例子:/etc/hostname.fxp0。

设置这个文件很简单:

address_family address netmask broadcast [other options]

更多关于此文件格式的详细资料在hostname.if(5)的用户手册上. 您需要阅读它以便获取自己的相应的配置。

一个典型的IPv4接口配置文件像这样:

$ cat /etc/hostname.fxp0 inet 10.0.0.38 255.255.255.0 NONE

这个例子中, 我们定义了一个IPv4(inet)地址, IP地址是10.0.0.38, 子网掩码是 255.255.255.0 及 没指定广播地址 (本例中系统会默认指定 10.0.0.255做为广播地址)。

您还可以为以太网指定介质类型, 比方说, 如果您想强制使用100baseTX全双工模式。

inet 10.0.0.38 255.255.255.0 NONE media 100baseTX mediaopt full-duplex

(当然, 您不应强制设置成全双工模式, 除非在双方全设定成此模式的前提下!否则会被拒绝。多数情况下应根据您的设备情况将它 设置成10base-T或半双工模式)

或者您打算用一个特殊的标记指定一个接口, 但Hostname文件的格式不会有很大变化!

$ cat /etc/hostname.vlan0 inet 172.21.0.31 255.255.255.0 NONE vlan 2 vlandev fxp1

6.2.2 - 默认网关

把您网关的IP地址写入文件/etc/mygate中, 这样计算机在启动时自动将网关设置成您提供的IP地址。这个文件只包含了一行内容, 也 就是您计算机网关的IP地址:

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 3/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

10.0.0.1

您在这里可以使用一个域名(字符表示), 但是请注意:您不能假设在默认网关配置完成之前域名解析已经全部配置了, 甚至这个域名 可能是无法解析的, 换句话说, 这里最好使用一个IP地址或者您预先在/etc/hosts文件里进行设置。

6.2.3 - DNS 解析

DNS解析由文件/etc/resolv.conf控制。例如:

search example.com nameserver 125.2.3.4 nameserver 125.2.3.5 lookup file bind

这个例子中, 您主机的默认域名是example.com, 有两个DNS服务器分别为:125.2.3.4 和 125.2.3.5, 最后一行"lookup file bind"的意思是指 只有在/etc/hosts文件没有指定时才使用这里的nameserver进行解析, 也就是/etc/hosts文件的优先级高于/etc/resolv.conf文件。

在许多Unix(还有很多的non-Unix)系统里全存在一个/etc/hosts文件, 它被用来指定那些不包含(或者不希望让它包含, 可以使用/etc/ hosts)在正式DNS服务器内的解析地址。

如果您使用DHCP(Dynamic Host Configuration Protocol, 动态主机配置协议), 您需要阅读6.4 - DHCP并注意 resolv.conf.tail(5)。

6.2.4 - 主机名

每台UNIX计算机都有一个名字, 在OpenBSD里使用实体域名"Fully Qualified Domain Name" (FQDN), 比如这台计算机名 是"OpenBSD", 所在域是"9971.us", 那么这台计算机的实体域名就是Openbsd.9971.com, 您可以在/etc/myname用一行表示:

OpenBSD.9971.us

6.2.5 - 启用新设定

这里您可以重新启动计算机或运行/etc/netstart 脚本。您只需键入(需root身份):

# sh /etc/netstart writing to routing socket: File exists add net 127: gateway 127.0.0.1: File exists writing to routing socket: File exists add net 224.0.0.0: gateway 127.0.0.1: File exists

注意这里产生了一些错误信息。通过运行脚本您重新设定了已存在的网络参数, 同样, 一些路由已经存在于内核的路由表上。到这 里您的新设定应该开始起作用了。再强调一下, 您可以通过ifconfig(8)检查您的网络接口设定以确保新设定是准确无误的。

虽然您在OpenBSD上您可以重新设定全部的网络参数而不必重新启动计算机就可以启用新设定, 但我们还是强烈建议您在修改了重 要的配置后重新启动您的计算机, 原因是启动时和计算机正常运行时环境还是略有不同的, 例如:如果您在文件上用符号名称指定了 DNS服务器, 您会发现您新设定的DNS服务器如您所愿地正常工作, 但是当您重新启动后可能会发现外部DNS服务器可能无法使用, 所以那次的配置是有问题的。

6.2.6 - 检查路由

您可以用 netstat(1) 或 route(8) 检查路由。如果您有路由错误, 您可能需要使用route(8)的 –n 参数, 这样可以打印出IP地址而不做 DNS查询和显示主机名。下面的例子分别用这两个程序查询您的路由表:

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 4/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

$ netstat -rn Routing tables

Internet: Destination Gateway Flags Refs Use Mtu Interface default 10.0.0.1 UGS 0 86 - fxp0 127/8 127.0.0.1 UGRS 0 0 - lo0 127.0.0.1 127.0.0.1 UH 0 0 - lo0 10.0.0/24 link#1 UC 0 0 - fxp0 10.0.0.1 aa:0:4:0:81:d UHL 1 0 - fxp0 10.0.0.38 127.0.0.1 UGHS 0 0 - lo0 224/4 127.0.0.1 URS 0 0 - lo0

Encap: Source Port Destination Port Proto SA(Address/SPI/Proto)

$ route show Routing tables

Internet: Destination Gateway Flags default 10.0.0.1 UG 127.0.0.0 LOCALHOST UG localhost LOCALHOST UH 10.0.0.0 link#1 U 10.0.0.1 aa:0:4:0:81:d UH 10.0.0.38 LOCALHOST UGH BASE-ADDRESS.MCA LOCALHOST U

6.2.7 - 将您的OpenBSD主机设置成一个转发网关

这小节主要讲述把OpenBSD系统设置成一个网关(也被称为路由器)的基础知识。如果您用一台连接在Internet上的OpenBSD主机做 路由器, 我们推荐您也阅读下一节中的关于设置包过滤的说明, 以便阻止潜在的恶意通讯。另外, 由于新的网络用户日益增加使网络 服务商所能提供的IPv4地址严重不足, 所以您也许想学习一些网络地址转换的的知识以便节省您有限的IP空间。

OpenBSD的标准内核已经内嵌了IP转发功能, 但是这个功能默认是关闭的, 您可以用sysctl(8)工具启用IP转发功能(注意:必须用root启 用它):

# sysctl net.inet.ip.forwarding=1 net.inet.ip.forwarding: 0 -> 1

用sysctl(8)命令可以不必重新启动计算机而直接启用IP转发功能, 可是, 一旦您重新启动计算机, 这个功能就失效了。如果要让系统默 认启用IP转发功能, 您需要编辑/etc/sysctl.conf文件, 加上一行:

net.inet.ip.forwarding=1

(译者注:为方便您理解, 以上段落调整了原文的部分顺序。)

现在修改两边其它主机上的路由。有很多方法可以把OpenBSD主机设置成一个路由器, 比如利用OpenBSD自己的OpenBGPD, 或 routed(8), mrtd, zebra及quagga.等软件, OpenBSD支持ports树中的zebra, quagga, 和 mrtd这些第三方软件包, 而routed做为系统组件已经 嵌入在系统内了。OpenBSD支持T1, HSSI, ATM, FDDI, Ethernet和serial (PPP/SLIP)这几种网络接口。

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 5/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

6.2.8 - 为网络接口设置别名

(译者注:网络接口别名(network interface aliasing)又称为IP别名(IP aliasing)或逻辑接口(logical interface), 设置网络接口别名可以在一个 网络接口上配置(绑定)多个IP地址。 虚拟主机能够在一台计算机上使用单网卡运行多个 Web 服务器。)

OpenBSD为接口的别名设置提供了一种简单的机制, 您只需编辑/etc/hostname.这个文件。/etc/netstart(8) 脚本在启动时读取/etc/ hostname.文件, /etc/netstart(8)是rc startup hierarchy的一部分。例如, 我们假设用户在网络192.168.0.0上有一个接口dc0, 其它的重要 信息:

● IP for dc0 is 192.168.0.2 ● NETMASK is 255.255.255.0

这里有一些关于别名的旁注。在OpenBSD里您只使用接口名, 第一个别名和第二个别名之间并无差别。与其它操作系统不同, OpenBSD不把它们称为dc0:0和dc0:1。如果您用ifconfig指定或增加一个IP别名, 不能只在命令行输入"ifconfig int"而要输入"ifconfig int alias", 您可以使用"ifconfig int delete"来删除别名。

假设您用同一个子网内的多个IP地址设置IP别名, 您的每个IP别名的子网掩码要设置成255.255.255.255, 它们不必按照接口上第一个IP 地址的子网掩码进行设置, 本例中, 网络接口dc0原来已经设置为IP:192.168.0.2, 子网掩码: 255.255.255.0, 我们编辑 /etc/hostname.dc0 文 件, 给接口dc0添加两个IP别名:

# cat /etc/hostname.dc0 inet 192.168.0.2 255.255.255.0 NONE media 100baseTX inet alias 192.168.0.3 255.255.255.255 inet alias 192.168.0.4 255.255.255.255

一旦您修改了/etc/hostname.dc0 文件, 您需要重新启动以便让它生效。当然您也可以用ifconfig(8)命令手动添加IP别名, 如:添加第一个 IP别名, 您可以使用下面的命令:

# ifconfig dc0 inet alias 192.168.0.3 netmask 255.255.255.255

(再强调一下, 推荐您重新启动系统, 以确保您的修改后所有结果如您所愿!)

要看这些IP别名您应该用命令:

$ ifconfig -A dc0: flags=8863 media: Ethernet manual inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 inet 192.168.0.3 netmask 0xffffffff broadcast 192.168.0.3

6.3 - 我怎样用OpenBSD作包过滤和防火墙?

Packet Filter(从这里开始我们称之为PF)是OpenBSD社区开发的具有过滤IP通讯和提供网络地址转换功能的系统。PF也能规范和调节 网络通讯、提供网络带宽控制、设置传输的优先权限;PF还可以作为强大、灵活的防火墙。关于PF的详细描述参见 PF用户手册。

6.4 - 动态主机配置协议(DHCP)

动态主机配置协议用来"自动"配置接口。OpenBSD可以作为DHCP服务器(配置其它计算机的接口), 或者作为DHCP客户端(被其它 计算机配置), 而且某些时候OpenBSD可以同时两者兼顾。

6.4.1 - DHCP 客户端

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 6/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

DHCP客户端dhclient(8)包含在OpenBSD中, 如果您想让接口自动获取IP地址, 您可以修改/etc/hostname.xl0, (我这里这里假设您的网 络接口是xl0。实际上您的网络接口可能是ep0 、fxp0或其它什么接口名。)您仅需要把‘DHCP’写入hostname文件中:

# echo dhcp > /etc/hostname.xl0

这样就让OpenBSD在启动时自动启用DHCP客户端, OpenBSD会从DHCP服务器那里获得IP地址、默认网关及DNS服务器。

如果您想从命令行启用DHCP客户端, 先要确认/etc/dhclient.conf 这个文件存在, 然后:

# dhclient fxp0

这里的fxp0是指您想要用它接收DHCP服务器信息的网络接口。

无论您采用哪种方式启动DHCP客户端, 您都可以通过编辑/etc/dhclient.conf文件, 这样您可以让DHCP服务器的按您的要求更新DNS 信息, 首先您需要将'request'那一行前面的注释符去掉(这些是DHCP客户端的默认设置, 去掉注释符才可以应用您自己的设置.)

request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, host-name, lpr-servers, ntp- servers;

然后删除domain-name-servers. 当然, 您也也许想删除hostname或其它的什么。

通过改变dhclient.conf(5) 文件里的选项您告诉DHCP客户端怎样建立您的resolv.conf(5)文件。DHCP客户端将会从DHCP上重新获取 新的内容并修改原有的内容。因此您可能会因自己修改resolv.conf而丢失部分DNS信息。

这里有两个机制可以有效的防止上述情况的发生:

● OPTION MODIFIERS (default, supersede, prepend及append) 允许您更改任何dhclient.conf(5)中的选项。

● resolv.conf.tail(5) 允许您通过dhclient(8)产生resolv.conf(5)时添加任何选项。

这个例子是您使用DHCP, 但是您想通过dhclient(8)给resolv.conf(5)附加"lookup file bind"功能。dhclient.conf里并没有这样的选项, 所以 您需要使用resolv.conf.tail来添加进去。

# echo "lookup file bind" > /etc/resolv.conf.tail

现在您的resolv.conf(5) 文件的最后应该已经加进了"lookup file bind" 的内容。

nameserver 192.168.1.1 nameserver 192.168.1.2 lookup file bind

6.4.2 - DHCP 服务器

如果您想用OpenBSD作为一个DHCP服务器, 参dhcpd(8), 编辑文件/etc/rc.conf.local文件, 使其包含一行内容: dhcpd_flags="interface"

这里的interface用您想要监听的网络端口替代, 例如:

# echo 'dhcpd_flags="xl1 xl2 xl3"' >>/etc/rc.conf.local

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 7/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

然后, 编辑/etc/dhcpd.conf文件 , 这些选项的含义是不言而喻的。

option domain-name "9971.us"; option domain-name-servers 192.168.1.3, 192.168.1.5;

subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.1;

range 192.168.1.32 192.168.1.127; }

这会告诉您的DHCP客户端:添加到DNS的请求域是"9971.us"(所以, 如果用户键入’telnet openbsd’, 那么DHCP服务器会把这些请求 发送到openbsd.9971.us上)。它会把它们指向DNS服务器192.168.1.3和192.168.1.5。安装OpenBSD并使用以太接口的计算机如果处于 同一网络内, 它们的IP范围在192.168.1.0/24, DHCP服务器会在192.168.1.32至192.168.1.127范围内给计算机分配一个IP地址。计算机的 默认网关会被设置为192.168.1.1。

如果您想从命令行启用dhcpd(8), 编辑完/etc/dhcpd.conf文件, 键入:

# dhcpd fxp0

在键入‘touch /var/db/dhcpd.leases’命令前您需要先建立一个dhcpd.leases的空白文件。如果您重新启动计算机OpenBSD启动脚本会 根据需要自动建立这个文件, 但是因为您是手动启用dhcpd(8), 所以您必须先手动建立这个文件。Fxp0是一个您想启用DHCP服务的 接口。

如果您想为Window计算机提供DHCP服务, 您可能需要给客户提供一个'WINS' 服务器的地址。您只需把下面这行添加到/etc/dhcpd. conf文件中:

option netbios-name-servers 192.168.92.55;

(这里的 192.168.92.55 是您的Windows 或 Samba 服务器的IP地址。) 您的DHCP客户端所需要的更加详尽的信息在dhcp-options(5)。

6.5 - PPP

点到点协议(PPP)通常是用来通过拨号调试解调器与您的ISP建立一个连接。OpenBSD提供两个方法实现这个目的:

● pppd(8) - 内核级PPP daemon

● ppp(8) - 用户级PPP daemon ppp 和 pppd 采用不同的方式实现同样的功能。pppd调用内核ppp(4)驱动进行工作, 与之相反ppp在用户级与tun(4)一同工作。这份 文档仅涉及用户级PPP, 因为它的调试模式更简单, 兼容性更好。进行下一步之前, 您需要了解一些关于您ISP的简单信息, 下面有一 份清单:

● 您ISP的拨号号码 ● 您的DNS服务器 ● 您的用户名和密码 ● 您的网关

上面这些有的您不必非要清楚, 但是如果您知道会对您设置ppp有所帮助。 用户级PPP采用/etc/ppp/ppp.conf文件进行配置。在/etc/ ppp 目录下有很多帮助文件, 它们提供了在很多不同的条件下配置PPP的方案。您应该去浏览一下。

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 8/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

为PPP(8) 做初始化设置

初始化设置用户级的PPP进程您需要编辑/etc/ppp/ppp.conf 文件。这个文件默认并不存在, 但是您可以编辑/etc/ppp/ppp.conf.sample 这个文件把它另存为您自己的ppp.conf文件。在这里我们做一个最简单、多数用户适用的初始化过程。下面是一个很简单的ppp. conf文件, 它仅包含了默认的部分核心内容。

default: set log Phase Chat LCP IPCP CCP tun command set device /dev/cua01 set speed 115200 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"

在"default:"标签下的一小段是每次启动程序时的运行内容。这里我们设置显示所有的关键信息, 用"set log"设置了登录时的显示级别, 它可以修改:请参考ppp(8) 以获取更多的关于登录显示级别方面的信息;用"set device"设置我们的硬件设备——调试解调器;在这个例 子中我们的调制解调器连接在com 2端口上, 所以您可以看出如果连接在com 1端口上应该用参数/dev/cua00 ; "set speed"设置拨号的连 接速度;"set dial"设置拨号参数, 这里我们可以调整拨号的持续时间timeout time。

下面我们进行下一步, 设置发送给ISP的特定的信息。我们在"default:"标签下再添加一个标签, 这个标签您可以随便起个名字——最 简单的是使用您ISP的名称。我们在这里用myisp:因为标签下面的内容与ISP有关。内容我们输入我们全部连接所需要的信息:

myisp: set phone 1234567 set login "ABORT NO\\sCARRIER TIMEOUT 5 ogin:--ogin: ppp word: ppp" set timeout 120 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 add default HISADDR enable dns

这里我们设置了ISP的基本信息。第一项"set phone"设置了ISP的拨号号码, "set login"这行设置了登录选项, 设置" timeout 5", 意思是如 果拨号5秒钟后还没有信号就放弃本次拨号再重新拨号。如果拨号成功程序会等待ISP发入的"login:", 并发出您的用户名和密码。

这个例子中我们的Username = ppp 和 Password = ppp. 用户名和密码实际上由ISP提供, 读者设置时请自行调整。"set timeout" 设置了 全部拨号过程的持续时间为120秒。 "set ifaddr" 这行有点棘手, 这里我们将在这里展开说明。

set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0

上面这行设置时我们遵循"set ifaddr [myaddr[/nn] [hisaddr[/nn] [netmask [triggeraddr]]]]"的格式。第一个IP是指我们想要得到的IP地 址, 如果您拥有一个静态的IP地址, 您可以把它设置在这, 本例中我们使用 /0 , 意思是不需要匹配特定的IP地址, 可以接受分配的任何 IP地址。第二个IP地址是我们期望对方的IP地址, 如果您知道您可以在这里指定它, 本例中我们对方如何分配IP的, 所以这里还是 用/0 , 让他放告诉我们。第三个选项是我们的子网掩码, 这里设置成255.255.255.0。如果triggeraddr被指定了, 它通常被放在我们想要 的IP地址那个位置进行初次IPCP协商。不管怎么说myaddr那里只接受真正的IP地址, This is useful when negotiating with some PPP implementations that will not assign an IP number unless their peer requests ``0.0.0.0''.

下面的选项用"add default HISADDR"将我们的默认路由设到对方的IP, 这项设定是有"粘"性的, 意思是如果对方IP发生了变化, 我们的 路由地址也随对方新地址同时更新。用"enable dns"我们告诉我们的ISP验证我们的DNS服务器地址。如果您运行一个本地的DNS服 务器就不要设置此项, 因为PPP会简单的根据自身应用在/etc/resolv.conf.里输入一些DNS服务器。

很多ISP现在采用CHAP 或者 PAP认证替代传统的登录方式, 如果您的ISP是这样, 我们配置要做一些调整:

myisp: set phone 1234567 set authname ppp

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 9/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

set authkey ppp set login set timeout 120 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 add default HISADDR enable dns

上面的例子中, 您不必指定采用CHAP 还是 PAP的认证方式, 程序会自动协商, "set login"只设定了采用用户名和密码的登录方式。

使用 PPP(8)

现在我们已经设定好了ppp.conf 文件, 我们可以开始连接我们的ISP了, 这里详细说明一下使用PPP过程中的一些常用参数:

● ppp -auto myisp - 这个参数将运行ppp, 配置您的接口并连接上您的ISP, 然后转入后台运行。 ● ppp -ddial myisp - 这个和 –auto参数相似, 但是, 如果掉线了, 它可以重新连接。

如果上面的方法失败了, 您可以无参数运行/usr/sbin/ppp ——它将以交互模式运行PPP, 手动输入所有设定值, 这样可以检查错误或其 它问题。建立初始化上面的设置后, PPP将把日志写入/var/log/ppp.log。这个日志文件想用户手册一样详细, 包含了很多有用的信 息。 ppp(8)其它

在某些情况下, 您可能希望在连接或挂断后马上执行某些命令。这里的您可以创建/etc/ppp/ppp.linkup 和 /etc/ppp/ppp.linkdown.这两 个文件, 正好可以应付这种情况。这两个配置文件的例子看下面:

● ppp.linkup

● ppp.linkdown ppp(8) 变化

目前许多的ISP提供比传统拨号方式更快的xDSL服务, 这里包括ADSL和SDSL。虽然没有物理上的拨号过程发生, 但是连接方式依然 是基于PPP(Point to Point Protocol-点到点协议), 例如:

● PPPoE ● PPPoA ● PPTP

PPPoE/PPPoA

PPPoE——The Point to Point Protocol over Ethernet, 意思是基于以太网的点对点协议, 采用的是通过以太网框架发送PPP数据包的方 法。PPPoA——The Point to Point Protocol over ATM, 基于ATM网的点对点协议, 运行于ATM网络中, 英国和比利时采用这种网络。

通常这意味着您可以用一个普通的以太网卡和基于以太网的DSL modem与您的ISP建立连接(反之就用一个USB接口的modem)。

如果您有一个支持PPPoE/PPPoA协议的modem, 您可以直接在modem上直接配置连接。如果您的modem采用桥接模式, 数据经过 modem, 到达一台上面有PPPoE软件的计算机上(见下),

OpenBSD上主要的PPPoE/PPPoA软件是pppoe(8), 它是一个用户级的应用程序(和我们上面讨论的ppp(8)很相似)。内核级的PPPoE软 件是pppoe(4), 它已经被被嵌入到OpenBSD系统内了。

PPTP

The Point to Point Tunneling Protocol(PPTP)——点到点隧道协议是Microsoft的私有协议。一个pptp客户端可以通过pppd(8)连接上虚 拟专用网络。pptp软件必须先通过packages或ports安装。更多的关于pptp的信息可以参看随pptp软件同时安装的pptp用户手册。

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 10/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

6.6 - 调整网络参数

OpenBSD系统的一个目标就是让它能够正好适用于我们的绝大多数用户。删除您不明白的组件或功能以求极致地优化系统往往会 取得与此相反的效果——让您的系统崩溃。您应该保持系统的默认设置, 除非您发现系统真的存在问题。

只有很少的人需要调节网络参数!

6.6.1 - 我该如何调整内核以获取更更多的retries 和更长的TCP会话时间?

通常考虑到路由或连接可能出现的问题您应该保持默认设置。当然, 如果为了使内核更有效, 连接双方需要使用类似的设定值。

调整内核您可以使用sysctl来增大以下的数值:

net.inet.tcp.keepinittime net.inet.tcp.keepidle net.inet.tcp.keepintvl

使用sysctl –a您可以看到目前的设定参数。您可以改变这些选项的设定值比如: sysctl net.inet.tcp.keepidle=28800

6.6.2 - 我怎样开启定向广播?

通常您并不希望这样做, 当您用OpenBSD计算机做路由器时, 如果您开启定向广播会允许网络上的任何人向您所在网络的广播地址 发送数据包。

有些使用实例说明在一些封闭的网络环境里, 特别是当您使用老的NetBIOS协议时, 开启定向广播还是很有用途的。如果您需要开启 定向广播, 还是用sysctl命令: sysctl net.inet.ip.directed-broadcast=1

这样就可以打开定向广播功能了, 如果您想知道为什么定向广播的默认是关闭的, 请参阅拒绝服务式攻击smurf attacks。

6.6.3 - 我不想让内核随机分配端口时占用某一特定端口

这也是使用sysctl(8)来实现, 从sysctl(8): 设置一份保留的TCP端口清单以便内核动态分配端口时避开这些端口。这样可以防止内核随 机分配端口时占用某些特定程序(或服务)使用的端口。您可以用"sysctl net.inet.tcp.baddynamic"设置保留端口, 如果有多个保留端口, 要将这些端口用逗号或空格分开:

# sysctl net.inet.tcp.baddynamic=749, 750, 751, 760, 761, 871

(译者注:将749, 750, 751, 760, 761, 871设置成保留端口, 内核动态分配端口时将不会占用这些端口。)

也可以从当前保留端口中添加或删除指定端口:

# sysctl net.inet.tcp.baddynamic=+748 # sysctl net.inet.tcp.baddynamic=-871

6.6.4 - 我怎样在高请求数和高吞吐量时提高网络性能?

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 11/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

如果发现您的系统与互联网之间高速传输大量数据时性能急剧下降, 您可以通过调整下列sysctl设置得到一些改善:

net.inet.tcp.recvspace net.inet.tcp.sendspace

例如把默认值16384调整成65536。注意, 这种调整的方式效果很有限。除非您真发现计算机性能急剧下降, 否则请不要修改这些数 值。

6.7 - 简易设置NFS

NFS是Network File System缩写, 中文意思是网络文件系统, 是通过网络共享一个文件系统。在您建立自己的NFS服务器前请阅读下面 的一些文档:

● nfsd(8)

● mountd(8)

● exports(5)

这一小节将讨论如何简易设定NFS。这个例子详述了局域网环境下客户端怎样连接到NFS, 这里不涉及NFS的安全问题, 我们这里假 设您已经在Internet接口处设置了包过滤或其它防火墙, 如果您允许从Internet上登录您的NFS, 并且您的NFS上有重要数据, 我们强烈 推荐您聘请一个网络安全专家, 否则其他人可能窥探您的NFS通信, 还有可能伪装成您允许的IP地址进入您的NFS主机。目前有一些 攻击方法可能对NFS产生危害, 但是通过合理的配置IP安全协议可以有效的防止这类攻击。

建立一个NFS 服务器

下列这些服务必须已经在系统中启用并已经启动了:

● portmap(8)

● mountd(8)

● nfsd(8)

在OppenBSD中这些服务默认是关闭的。将下列几行加入rc.conf.local(8)中以启用它们:

portmap=YES nfs_server=YES

接下来是配置客户端可以挂载哪些目录。

这个例子中我们NFS服务器的IP地址为10.0.0.1, 这个服务器仅对子网内的客户端提供服务。所有这些设置在/etc/exports文件中, 这个 文件列出了NFS可以使用哪些目录, 以及谁有权限访问它们。/etc/exports文件有很多选项, 您最好先阅读exports(5) 的用户手册。我们 这里建立一个exports文件:

# # NFS exports Database # See exports(5) for more information. Be very careful, misconfiguration # of this file can result in your filesystems being readable by the world. /work -alldirs -ro -network=10.0.0 -mask=255.255.255.0

这里指定NFS使用本地 /work目录, -alldirs 选项指定客户端可以挂载 /work目录及其子目录。例如, 有一个子目录/work/Monday, 客户 端可以把/work作为根目录挂载, 也可以把/work/Monday做为根目录挂载。-ro 选项指定客户端的访问权限为只读。最后两个参数是 指定只有那些位于10.0.0.0网段、子网掩码是255.255.255.0的客户端才可以挂载这些目录。这对那些可以被不同网络访问的服务器来 说很重要。

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 12/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

另一个重要的安全注意事项:不要只设置NFS的使用目录而不建立一个登录客户端清单, 如果没有设置一个登录客户端清单那就意味 着任何可以连接到NFS服务器的人都可以访问它上面的文件。

现在您可以启动您的NFS服务器了。您可以重新启动计算机或者手动启用NFS服务。

# /usr/sbin/portmap # echo -n >/var/db/mountdtab # /sbin/mountd # /sbin/nfsd -tun 4

最后一行"/sbin/nfsd -tun 4"中传递给nfsd的这些蓝色选项分别代表着三个含义:启用TCP (-t) 和 UDP (-u)连接, -n 4表示运行4个nfsd进 程。这个进程数表示可以同时登录的用户数量。

您现在可以从客户端挂载NFS服务器的目录了。

请记住:如果您在NFS服务器运行时更改了NFS使用目录, 您要让"mount"(挂载程序)知道您的更改, 使用下面的命令以便挂载新目 录。

# kill -HUP `cat /var/run/mountd.pid`

挂载NFS目录

NFS服务器上不用启用额外的服务或守护进程, 客户端可以直接挂载NFS目录, 像挂载其它目录一样。

NFS目录应该通过mount_nfs(8)命令挂载, 这里我们把主机10.0.0.1的目录 /work挂载到本地目录 /mnt上, 输入以下命令(注意:这里您也 可以使用域名, mount命令可以解析域名)

# mount -t nfs 10.0.0.1:/work /mnt

如果想在启动时挂载, 在/etc/fstab里面加上如下内容:

10.0.0.1:/work /mnt nfs rw 0 0

这一行命令后面加上的"0 0"是非常重要的, 因为它可以避免您的计算机在启动时fsck(检查和修复) NFS服务器的目录, 还有其它的安 全选项, 例如noexec、nodev和 nosuid也应该适当地使用, 例如:

10.0.0.1:/work /mnt nfs rw, nodev, nosuid 0 0

这里的参数表示, 客户端不能通过NFS服务器上的设备或setuid程序修改服务器的安全措施。如果客户端不需要运行服务器上的程 序, 您可以在上面的语句中加入noexec 选项。

如果您在客户端上以root的身份访问挂载的NFS目录, NFS服务器将自动把您在服务器上的身份降为用户名"nobody"和组"nobody", 从 安全角度考虑这点是非常重要的。例如:NFS服务器上有一个"99.71"文件, 它的权限如下所示:

-rw------1 root wheel 0 Dec 31 03:00 99.71

(译者注:文件99.71的权限设定成仅有root用户可以读写这个文件。)

如果"99.71"这个文件在NFS服务器的共享目录内, 客户端上的root用户要访问这个文件时, 服务器会拒绝来自客户端的访问要求。因 为当客户端上的root用户企图登录服务器时, 在服务器上他的身份已经降到了"nobody", 因为在服务器上"nobody"无权读取这个文件,

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 13/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

所以被服务器拒绝了。

您可以通过exports(5)设置客户端root用户登录服务器后的权限。

查看NFS的统计信息

确认NFS服务器是否工作正常可以查看是否所有的进程已经在RPC上进行了注册, 使用rpcinfo(8)命令:

$ rpcinfo -p 10.0.0.1 program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100005 1 udp 633 mountd 100005 3 udp 633 mountd 100005 1 tcp 916 mountd 100005 3 tcp 916 mountd 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs

除了一般用rpcinfo(8).查询外, 还有一些命令可以让您查看NFS服务器正在发生什么, 一个是showmount(8), 它可以让您查询当前那些 目录被挂载, 谁挂载了这些目录。您也可以使用nfsstat(1) 命令, 它可以提供更详细的统计信息。showmount(8)命令的使用格式是, / usr/bin/showmount -a host. 例如:

$ /usr/bin/showmount -a 10.0.0.1 All mount points on 10.0.0.1: 10.0.0.37:/work

这个输出信息显示位于10.0.0.37的客户端上的用户挂载了10.0.0.1服务器上的/work目录。

6.9 - 用OpenBSD建立网桥

网桥负责连接两个或多个独立的网络, 不像路由器, 数据包"无形"地通过网桥——理论上, 由网桥连接的两个不同网段看起来更像是 分布在网桥两侧的同一网段的不同节点, 网桥仅传送那些必须从一个网段传输到另一个网段的数据, 它为减少复合网络的流量提供 了一个简单的方法并且也允许不同网段间的节点之间在需要时传输数据。

注意因为网桥的这个"无形"特点, 网桥中的一个接口可能有也可能没有它自己的IP地址, 如果它有IP地址, 这个接口就有两种工作模 式, 一种是作为网桥的一部分, 另外一种是一个正常的独立的网卡。如果两块网卡都没有IP地址, 网桥就允许数据通过, 但不会向外 部发送数据(网桥的一个功能)。

一个应用网桥的例子

我的一个计算机架上摆了很多的老式计算机, 它们全没有安装10BASE-TX网卡, 但它们全有一个AUI或AAUI接口, 收发器的连接方式 仅限于同轴电缆。在这个架子的上一台计算机是基于OpenBSD的终端服务器, 它总是开机并且连接着高速网络。增加一块有同轴电 缆接口的网卡就可以把它做为连接同轴电缆网络的网桥。

现在这台计算机上有两块网卡, Intel EtherExpress/100 (fxp0) 、3c590-Combo card (ep0)——用来连接同轴电缆端口。 fxp0用来连接我 其余网络, 因此它有一个IP地址;ep0是桥接专用, 所以没有IP地址。我访问同轴电缆网络内的计算机就像它们在我的其余网络内一 样。那么, 我们要怎样做呢?

文件hostname.fxp0里包含了fxp0网卡的配置信息, 这台计算机是通过DHCP分配IP地址的, 所以这的文件看起来像这样:

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 14/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

$ cat /etc/hostname.fxp0 dhcp NONE NONE NONE

上面这个文件很平常。 ep0卡有一些不同, 也许您可以猜出来:

$ cat /etc/hostname.ep0 up media 10base2

这里我们通知系统使用ifconfig(8)激活这块网卡并把它设置成10BASE-2 (coax)。不用为这块网卡指定IP地址或类似的其它信息, 关于 ep卡选项的更多细节, 请参看其man page.

现在我们建立网桥。网桥的通过一个已经存在的文件, 名字有点像bridgename.bridge0。这里的例子是我的实际环境下的:

$ cat /etc/bridgename.bridge0 add fxp0 add ep0 up

文件的意思是建立一个由两块网卡fxp0 和 ep0组成网桥, 并激活它。上面的网卡顺序有规矩吗?没有, 记住一个桥是非常对称的—— 数据包在双向流通。

好了! 重新启动, 您现在已经拥有一个正常运行的网桥了。

网桥过滤

即使是像这样简单的网桥也能实现过滤以便控制通过网桥的数据包。如您所愿, Packet Filter可以限制哪些数据可以通过您的网桥。

别忘了网桥的特点, 两个接口通过同样的数据流, 所以您只需过滤一个接口的数据流。您默认的"Pass all"语句可能像这样:

pass in on ep0 all pass out on ep0 all pass in on fxp0 all pass out on fxp0 all

现在, 比如说我希望过滤对老机器的网络数据包的冲击, 我只想让保留Web和SSH通讯。这个例子中我们要放行所有进出ep0的数据 包, 但是过滤通过fxp0的数据。用reply参数处理回应信息:

# Pass all traffic through ep0 pass in quick on ep0 all pass out quick on ep0 all

# Block fxp0 traffic block in on fxp0 all block out on fxp0 all

pass in quick on fxp0 proto tcp from any to any port {22, 80} \ flags S/SA keep state

注意在这里只允许做为网桥的计算机或它"后"面的节点与老机器之间的HTTP和SSH通讯, 除此以外限制任何通讯。还有就是限制了

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 15/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

通讯是用的接口。

监控已经建立的网桥使用brconfig(8)命令, 这个命令也可用来重新启动后建立一个网桥。

网桥的技巧

● 强烈推荐您只在一个接口上做过滤。当然如果您确信您做法是有道理的, 您可以对网桥上的两个接口全做过滤。 ● 通过使用brconfig(8) 的blocknonip 选项或者设置bridgename.bridge0, 您可以过滤无IP地址(像IPX 或者 NETBEUI)的通讯。但是 您需要清楚网桥可提供所有协议的通讯, 并非只限于IP协议。 ● 网桥要求网卡工作在"混杂模式"——也就是说网卡监听所有数据通讯, 而不是只监听直接抵达网卡接口的通讯。这给CPU和 总线带来的比较大的负载。一些网卡在在这种模式下无法正常工作, 比如TI ThunderLAN chip (tl(4))就不行。

(译者注:又来罗嗦了, 熟悉网卡工作模式的读者请"过滤" 掉这段。 这里简要说明一下网卡的工作模式: 以太网是一种总线型的网络, 从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的 CSMA/ CD 协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。网卡主要的工作是完成对 于总线当前状态的探测, 确定是否进行数据的传送, 判断每个物理数据帧目的地是否为本站地址, 如果不匹配, 则说明不是发 送到本站的而将它丢弃。如果是的话, 接收该数据帧, 进行物理数据帧的 CRC 校验, 然后将数据帧提交给LLC 子层。 网卡具有如下的几种工作模式: 1)广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧, 工作在广播模式的网卡接收广播帧。 2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收, 而组外主机却接收不 到。但是, 如果将网卡设置为多播传送模式, 它可以接收所有的多播传送帧, 而不论它是不是组内成员。 3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。 4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧, 信包捕获程序就是在这种模式下运行 的。 网卡的缺省工作模式包含广播模式和直接模式, 即它只接收广播帧和发给自己的帧。如果采用混杂模式, 一个站点的网卡将 接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。 )

6.10 - 我怎样用PXE启动? (i386, amd64)

预启动执行环境(Preboot Execution Environment)也称PXE, 是一种通过网络启动计算机的方法。这种技术最先由Intel开发出来, 但是 目前大多数网卡和计算机生产商已经支持这种技术了。注意, 有几种不同的网络启动协议, PXE相对来讲是比较新的技术, 传统上 PXE启动是通过网卡或计算机主板上的ROM(只读存储器)完成的, 但是软盘因为可以包含不同的内容也同样允许PXE启动。很多老 网卡的ROM支持网络启动, 但是不支持PXE;OpenBSD/i386 或 amd64目前不支持使用这些老网卡从网络启动。

网络启动如何工作?

首先要清楚在i386 和 amd64平台上OpenBSD是怎样启动的。在开始启动前, 这台计算机上的网卡通过网络广播(发出)一个DHCP请 求, DHCP服务器将分派一个合适的IP地址, 并提供一个tftp(1)服务器上文件名, 以便这台计算机下载并执行。这个文件负责余下的启 动过程。对OpenBSD来说, 这个文件是pxeboot, 它取代了标准的标准的启动文件boot(8)。pxeboot(8)现在就可以从那台tftp(1)服务器 引导并运行一个内核(例如bsd 或者 bsd.rd)。

我该怎样做?

首先显而易见您必须有一个支持PXE启动的计算机或网卡, 有些文档说现代的所有网卡和计算机全具备PXE能力, 但是确实不是这样 ——许多廉价系统不包含PXE ROMS或者使用老的网络启动协议。另外您还需要正确的设置 DHCP和TFTP 服务器。

我们假设由一台OpenBSD计算机提供启动文件(不是必须这样)。您的DHCP服务器的dhcpd.conf文件需要有下面这行:

filename "pxeboot";

需要DHCP服务器提供那个文件给待启动的计算机, 例如:

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 16/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

shared-network LOCAL-NET { option domain-name "example.com"; option domain-name-servers 192.168.1.3, 192.168.1.5;

subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.1; filename "pxeboot"; range 192.168.1.32 192.168.1.127; default-lease-time 86400; max-lease-time 90000; } }

您也需要启用tftpd(8)服务. 它一般通过inetd(8).来执行。 OpenBSD默认情况下在inetd.conf 文件里已经为您准备好了一行:

#tftp dgram udp wait root /usr/libexec/tftpd tftpd -s /tftpboot

这里您只需去掉"#"并且发给inetd(8)一个 -HUP 指令让它重新调入 /etc/inetd.conf 配置文件。tftpd(8) 服务器将文件存在在一个特定 的目录, 这个例子中我们使用的是/tftpboot。很显然您需要先建立这个目录并拷入启动所需文件, 一般来说PXE启动只需很少的文件:

● pxeboot, PXE启动引导器(它的与硬盘启动时的boot作用一样)。

● bsd.rd, 安装内核, 也可以是bsd, 也可以是一个定制内核。

● /etc/boot.conf, 启动配置文件。

注意/etc/boot.conf 文件仅在您需要使用PXE启动其它操作系统时才用得上。还有可能基本就不需要 (例如您想使用串口控制台)。 您应该先用tftp(1)客户端测试您的tftpd(8)服务器以确保这些文件可以正常下载。

当您的DHCP和TFTP服务器正常运行时, 您要先启用系统或网卡上的PXE功能, 请参看您系统的相关文档。一旦您设置完毕, 您可以 看见类似下面的信息:

Intel UNDI, PXE-2.0 (build 067) Copyright (C) 1997, 1998 Intel Corporation

For Realtek RTL 8139(X) PCI Fast Ethernet Controller v1.00 (990420)

DHCP MAC ADDR: 00 E0 C5 C8 CF E1 CLIENT IP: 192.168.1.76 MASK: 255.255.255.0 DHCP IP: 192.168.1.252 GATEWAY IP: 192.168.1.1 probing: pc0 com0 com1 apm pxe![2.1] mem[540k 28m a20=on] disk: hd0* net: mac 00:e0:c5:c8:cf:e1, ip 192.168.1.76, server 192.168.1.252 >> OpenBSD/i386 PXEBOOT 1.00 boot>

这时您看见了一个标准的OpenBSD启动提示符"boot>" , 您只需在它后面简单的输入"bsd.rd" , 您就能从TFTP服务器上获得这个bsd.rd 文件 。

>> OpenBSD/i386 PXEBOOT 2.03 boot> bsd.rd booting tftp:bsd.rd: 4375152+733120 [58+122112+105468]=0x516d04 entry point at 0x100120

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 17/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved.

Copyright (c) 1995-2008 OpenBSD. All rights reserved. http://www.OpenBSD.org

OpenBSD 4.5 (RAMDISK_CD) #1112: Sat Feb 28 15:06:26 MST 2009

现在bsd.rd安装内核就将启动了。

我能用PXE启动其它的内核吗?

没问题, OpenBSD 包含这些工具, PXE启动的主要目的是安装一个新的操作系统。

6.11 - 通用地址冗余协议(CARP)

6.11.1 - 什么是通用地址冗余协议及其如何工作?

CARP是一个通过在多台计算机中产生一个虚拟网络接口来帮助系统完成冗余的工具, 所以如果有计算机宕机其余的立刻上来顶替, 而且/或者在一定程度上均分了系统负载。CARP是一种改进了的虚拟路由冗余协议(VRRP)标准。因为VRRP有可能与Cisco的部分 专利有重叠, 所以被认为不是完全免费的。此后CARP继续独立发展, 有关CARP的起源以及围绕VRRP的法律问题, 请参阅自行参阅 相关文档。

为了避免法律纷争, Ryan McBride在Michael Shalayeff、 Marco Pfatschbacher 和Markus Friedl的帮助下, 重新设计了CARP, 使它与原来相 比有了根本上的不同。CARP的密码系统进行了重大的改进, 但这只是它许多改进中的一小部分。

它是如何工作的: CARP采用组播协议。它用多台物理计算机组成一个或多个虚拟的服务地址。在这些计算机中由一台计算机作为 主力计算机接受和发送的所有数据信息, 其它的计算机充当热备份。无论物理计算机的IP和MAC地址是什么, 发送给CARP的数据包 得到的回馈全是CARP的虚拟地址提供数据信息。

在设定的时间间隔内, 主力机公告它工作在112号因特网IP协议上。如果A机脱机, 其它在CARP组内的计算机就开始公告。公告最频 繁的那台热备份计算机这时就升级为新的主力机, 当原来的主力机恢复后, 这台新的主力机就又变回了默认的热备份计算机。热备 份计算机可以在需要的时候升级为新的主力机这点是很重要的(例如一台计算机是很快的Sun Fire V120, 其余的是比较慢的 SPARCstation IPCs), 您可以这样配置它们。

CARP需要高冗余度和最少量的容错, 如果系统硬件没有发生容错那么系统就有能力处理诸如某人不慎踢掉了电源线或者系统管理 员在错误的窗口输入了重新启动命令。CARP在处理诸如安装补丁、不间断服务而重新启动计算机、以及测试软件或硬件升级时也 很得心应手——如果主力机有问题时热备份就先顶上来直至主力机被修复。

(译者注: 这段实在是搞得我头大, 无论自己的理解或是英文网站上查询的fault tolerance(容错)或fault-tolerant的含义还是中文网站上对容错的 解释, 更多是指一种包容错误的能力, 但这个解释在原文里就不通顺了。后来查询了一个英文网站, 才知道fault tolerance(容错)还有另 外一个意思——系统或部件崩溃前的错误数量。所以上面的容错请读者理解为错误(系统可以包容的), 但愿我没有误解作者的意 思, 欢迎大家指正。 以下是原文: While highly redundant and fault-tolerant hardware minimizes the need for CARP, it doesn't erase it. There's no hardware fault tolerance that's capable of helping if someone knocks out a power cord, or if your system administrator types reboot in the wrong window. CARP also makes it easier to make the patch and reboot cycle transparent to users, and easier to test a software or hardware upgrade--if it doesn't work, you can fall back to your spare until fixed. 以下是字典查询的解释: fault tolerance architecture1. The ability of a system or component to continue normal operation despite the presence of hardware or software faults. This often involves some degree of redundancy.2. The number of faults a system or component can withstand before normal operation is impaired.(1995-04-06) )

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 18/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

然而CARP也有不足之处。CARP的设计确实要求这组计算机处于同一个物理子网内并且有固定的IP地址, 尽管carp设备的说明中并 未对物理接口的IP地址有更多的要求。同样那些需要与服务器有固定连接的服务(例如SSH或IRC)将不能直接地传输到其它的计算 机——虽然在这个例子中, CARP可以最小化服务器的停机时间。CARP自己并不同步应用之间的数据, 有两个"渠道"都可以完成这 项任务:(4)(提供冗余过滤);在计算机间手动复制数据可以用rsync, 或者随便使用什么顺手的工具。

6.11.2 - 配置

有两个命令可以控制CARP:sysctl(8)和ifconfig(8)。我们先看sysctl的:

第一, sysctl的net.inet.carp.allow 选项, 定义了是否让主机处理所有的CARP 信息包, 显而易见, 这是使用CARP 必需的。默认开启。

第二, net.inet.carp.arpbalance 选项的用途是负载均衡, 默认关闭。if this feature is enabled, CARP source-hashes the originating IP of a request. The hash is then used to select a virtual host from the available pool to handle the request. This is disabled by default.

第三, net.inet.carp.log 选项记录CARP 错误., 默认开启。

第四, net.inet.carp.preempt 选项开启后将在CARP计算机中自然选择。最适合(这里指公告最频繁的)的计算机将成为主力机。默认关 闭, 也就是说热备份计算机不(再)尝试成为主力机。

所有这些sysctl设置请参阅 sysctl(3).

剩余的CARP配置通过ifconfig(8来完成。CVRP的专用命令advbase 和 advskew, advskew用来设置公告间隔时间, 公式(以秒计)为 advskew/256+ advbase。advbase可以减少网络流量或设置更长的主力机"潜伏"时间(直至备份机来顶替它);advskew设置哪台热备份计 算机轮换时优先成为主力机(这是必需的)。

接下来, pass设定密码, vhid设定CARP虚拟机的群组编号, 虽然虚拟机群组共享一个IP地址, 但您仍然需要为每个群组设定唯一的编 号。CARP最多可以有255群组。

最后, carp设备指定一个物理接口作为该群组指定的使用接口, 默认情况下该群组位于同一子网内的任何网络接口全可以做为该群组 的指定使用接口。

我们这里使用这些选项做一个简单的配置, 假设我们公司部署两台相同配置的Web服务器rachael (192.168.0.5) 和 pris (192.168.0.6)用 来取代一个位于192.168.0.7的老系统, 先从rachael开始, 命令是:

rachael# ifconfig carp0 create rachael# ifconfig carp0 vhid 1 pass tyrell carpdev fxp0 \ 192.168.0.7 netmask 255.255.255.0

产生carp0接口并把它的群组编号设为1, 它的密码是tyrell, IP地址是192.168.0.7子网掩码是255.255.255.0。指定fxp0为该群组指定使用 接口。您建立一个/etc/hostname.carp0文件, 有了它您只要重新启动计算机就可让设定永久生效, 文件像这样: inet 192.168.0.7 255.255.255.0 192.168.0.255 vhid 1 pass tyrell carpdev fxp0

注意这行里指定了广播地址、vhid(群组编号)和密码。人们往往因为没有做这个步骤而产生错误, 因为CARP运行需要这个文件。 pris进行同样的操作, 一台计算机必须指定为主力机, 它的网络接口才可成为群组使用接口(这里假设没有指定优先成为主力机的计 算机;如果您指定了优先计算机就不用这样做了)。

但是pris的操作并不能像rachael那样从头开始, 因为Rachael 已经占用了192.168.0.7。那您怎样处理呢?幸运的是CARP可以处理这种情 况, 您不用提供一个真实的IP地址, 只需用`carpdev' keyword(carp设备的关键字, 这里指carp0)指定CARP的使用接口。所有计算机使用 一个IP地址显得更整齐——这样让监视和访问变得更简单。

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 19/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

我们再增加一点难度, 我们让rachael 优先充当主力机。这里有几个原因:硬件上的差别, 或只是偏见——例如:如果rachael计算机不能 成为主力机的话, 肯定这里面有问题", 或众所周知的默认主机没有执行分析或邮寄的脚本。(译者注:这是作者杜撰的理由。读者不 必深究。)

我们在rachael上继续操作, 编辑/etc/sysctl.conf文件, 使它永久生效。

rachael# sysctl net.inet.carp.preempt=1

在pris上我们也要输入一些内容:

pris# ifconfig carp0 advskew 100

(译者注:advskew是用来设定公告时间间隔的, 见上面描述。)

这里稍微延迟了一下pris的公告时间, 意思是如果有可能rachael 将优先成为主力机。

这里注意一下, 如果您在CARP的计算机上使用了PF, 您必须在所有与CARP有关的网络接口上允许carp协议通讯, 例如在PF的配置文 件里加入像这样的一行:

pass on fxp0 proto carp keep state

6.11.3 - 负载均衡

就在几个月以后, 我们公司(上小节提到的)发展到要求仅用一个内部web服务器实现负载管理, 怎么办好? CARP能帮助您。我们正好 尝试一下负载均衡。我们在rachael上建立一个新的CARP接口和组:

rachael# ifconfig carp1 create rachael# ifconfig carp1 vhid 2 advskew 100 pass bryant carpdev fxp0 192.168.0.7 netmask 255.255.255.0

在pris那里, 我们同样要建立新的组和接口, 然后设定"preempt" sysctl:

pris# ifconfig carp1 create pris# ifconfig carp1 vhid 2 pass bryant carpdev fxp0 192.168.0.7 netmask 255.255.255.0 pris# sysctl net.inet.carp.preempt=1

现在我们有使用同一个IP地址的两个CARP组, 而且每个组都度特定的主机有倾向性, 也就是说更倾向于rachael充当主力机, 而pris则 用来充当备份机。

现在我们仅需要在两台计算机中使用sysctl启动负载均衡, 就像我们前面讨论的那样:

# sysctl net.inet.carp.arpbalance=1

虽然这些例子仅是对两台计算机集群进行了负载均衡, 但是此方法同样适用于多台计算机的环境。请注意, 这不是您期望的两台机 器各承担50%的负载的完美方案——CARP使用一个原始IP地址的哈希来判断由那台主机处理请求, 而不是机器的负载。

6.11.4 - 更多关于CARP的信息

● carp(4)

● ifconfig(8)

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 20/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

● sysctl(8)

● sysctl(3)

● Firewall Failover with pfsync and CARP by Ryan McBride

6.12 - OpenNTPD

精确的时间对很多计算机程序来说十分重要, 很多人发现5美金的手表比2000美金的计算机的时间更精确。除了知道时间外, 精确的 时间对同步计算机也很重要。有段时间ntp.org 提供了一个网络时间协议(RFC1305, RFC2030)应用程序, 您可以通过ports得到它, 它被 用来通过Internet同步您计算机的时钟。不过它不是一个平常的程序, 它的代码不易审查, 并且在运行时需要占用大量的内存。总之, 对某些人来说它担当了重要的角色, 但是它还远远不能解决所有人的问题。

OpenNTPD就是为了在某些方面解决这些问题的做的一个尝试, 提供一个方便管理的、安全的和简单的NTD兼容方式来使您计算机 拥有精确的时间。控制OpenBSD的ntpd(8)的是通过文件/etc/ntpd.conf配置的, 它很简单, 您很快就能上手。 pool.ntp.org服务器是一个虚拟的世界时间服务器集群。ntpd(8)可以使您的计算机时钟逐渐缓慢地与pool.ntp.org服务器上的标准时 间同步, 您只需通过rc.conf.local文件就可以激活ntpd(8), 一旦您的计算机时钟被精确设置, ntpd 将使它保持高度精确, 然而如果您的 计算机时钟误差大于几分钟, 我们强烈推荐您在最初把它调整成尽量精确的时间, 因为误差很大的时钟往往要花上几天或几周的时 间才可以成功同步。您最初可以用ntpd(8) "-s"选项或其它什么方法精确设置您的计算机时钟。

6.12.1 - "但是OpenNTPD 不如ntp.org 上的服务器精确!"

这也有可能。那不是OpenNTPD的设计目标, OpenNTPD必须是免费、简单、可靠、安全的。如果您更在意微秒级的精密度而不是 OpenNTPD长处, 随便您去用ntp.org的ntpd好喽, 您可以在ports树和package里找到它。我们目前没有计划用花哨的新功能把 OpenNTPD"肿"起来。

6.12.2 - "有人宣称OpenNTPD 是 '有害的'!"

有些人还没有明白OpenNTPD的设计目标——用一个简单、安全、方便管理的方式精确您的计算机时钟。如果时间精确很重要, 许 多用户报告OpenNTPD比 ntp.org的ntpd更好用;如果安全很重要, OpenNTPD的代码更易读(因而更便于审核), 并且代码中调用的是 OpenBSD"自己"的函数, 如:strlcpy, 而不是portable function像strcpy, 还有在开始写代码时已经考虑了安全, 而不是"用户使用以后才考 虑安全";如果让更多的人同步时间是有意义的, 对绝大多数人来说OpenNTPD更容易使用。如果这是"有害"的, 我们完全认同这种"有 害"。

有一些应用软件与ntp.org的ntpd搭配更适合;然而, 对绝大多数用户来说OpenNTPD已经绰绰有余了。

OpenNTPD 的维护人员对这个宣称的更完整的回应可以在这里读到。

6.12.3 - 为什么我其余的计算机不能与OpenNTPD同步? ntpd(8)默认并不监听任何地址。所以如果想把它当成server使用, 您需要在/etc/ntpd.conf文件中把"#listen on *"这行前面的注释符去掉 并且重新启动ntpd(8)服务。当然了, 如果您不想监听所有可能的地址或接口, 而是一个指定的IP地址, 您就用那个IP地址替换"*"。

当您开启ntpd(8)的监听功能后, 也许还有其它计算机无法同步!一个刚运行的ntpd(8)服务(例如:您刚修改完ntpd.conf, 并重新启动了 ntpd)拒绝为其它客户端提供时间信息, 直到它首次把自己的时间调整成合理的稳定状态, 当ntpd(8)认为自己的时间信息稳定后, 它 会在/var/log/daemon文件里发布一个信息"clock now synced"。即使ntpd(8)刚开始运行时计算机时钟十分精确, 它也会继续用10分钟 左右确保自己同步, 还有在开始时如果时钟偏差很大, 同步过程可能会用几天或几周。

6.13 - 我可以选择哪些无线网络设置?

OpenBSD支持一系列无线芯片集:

● acx(4) TI ACX100/ACX111. (NFF) (AP)

● an(4) Aironet Communications 4500/4800.

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 21/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

● ath(4) driver for Atheros 802.11a/b/g. (AP)

● atu(4) Atmel AT76C50x USB 802.11b

● atw(4) ADMtek ADM8211.

● awi(4) AMD 802.11 PCnet Mobile.

● bwi(4) Broadcom AirForce 802.11b/g

● cnwi(4) Xircom CreditCard Netwave

● ipw(4) Intel PRO/Wireless 2100 802.11b. (NFF)

● iwi(4) Intel PRO/Wireless 2200BG/2225BG/2915ABG 802.11a/b/g. (NFF)

● iwn(4) Intel WiFi Link 4965/5100/5300 802.11a/b/g/Draft-N wireless.

● malo(4) Marvell Libertas 802.11b/g

● pgt(4) Conexant/Intersil Prism GT Full-MAC 802.11a/b/g

● ral(4) and ural(4) [USB] Ralink Technology RT25x0 802.11a/b/g. (AP)

● ray(4) Raytheon Raylink/WebGear Aviator 802.11FH

● rtw(4) Realtek 8180 802.11b. (AP)

● rum(4) Ralink Technology RT2501USB. (AP)

● run(4) Ralink Technology USB 802.11a/b/g/Draft-N

● uath(4) Atheros USB 802.11a/b/g

● upgt(4) Conexant/Intersil PrismGT SoftMAC USB 802.11b/g

● wi(4) Prism2/2.5/3. (AP)

● wpi(4) Intel PRO/Wireless 3945ABG. (NFF)

● zyd(4) ZyDAS ZD1211/ZD1211B USB 802.11b/g

(AP) 说明这块无线网卡可以作为一个无线接入点。 (NFF)说明芯片需要一个并非免费的固件, 这个固件不能包含在OpenBSD中。

基于这些芯片的适配器也像这些适配器一样把OpenBSD连接到现有的无线网络上, 配置这些适配器使用标准的ifconfig(8)(更详尽的 细节请参看用户手册)命令。这些网卡中有一些也可以成为您防火墙的一部分工作在"基于主机的接入点"模式下。

注意为了使用某些网卡您需要得到这些网卡的固件文件, 这些固件文件由于制造商拒绝免费再发行, 所以无法包含在OpenBSD里面, 如果可能, 用户手册列出了以上链接和制造商联系信息, 您可以联系制造商的相关人员, 让他们明白您对此事的感受, 或者告诉他们 您已经买了什么什么品牌的网卡替代了他们的产品。

用基于OpenBSD的防火墙提供无线接入点时另一个可考虑的选择是采用一块通用的网卡及一个外部的无线网桥接入点。这可使您 更加方便地将天线布置在最佳位置而非直接处于防火墙之后。

6.14 - 如何配置等价多路径路由?

等价多路径路由是指在同一个网络内的路由表上存在多个路由, 就像默认路由0.0.0.0/0这样的。当内核进行路由查找时决定从哪里 把数据包发送到那个网络, 它可以从等价路由中任意挑选一个。在多数情况下多路径路由被用来提供冗余的出站连接, 例如冗余的 Internet连接。 route(8)命令用来添加/修改/删除 路由表中的路由。-mpath 选项被用来添加多路径路由。

# route add -mpath default 10.130.128.1 # route add -mpath default 10.132.0.1

校验路由:

# netstat -rnf inet | grep default default 10.130.128.1 UGS 2 134 - fxp1 default 10.132.0.1 UGS 0 172 - fxp2

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 22/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第六章 - 网络

这个例子中我们能看见一个默认路由指向了IP地址为10.130.128.1的fxp1接口, 另一个指向了10.132.0.1的fxp2接口。

因为mygate(5)文件还不支持多路径默认路由, 上面的命令应该加入到fxp1和fxp2接口hostname.if(5)文件的底部。然后再把/etc/mygate 文件删除。

/etc/hostname.fxp1 !route add -mpath default 10.130.128.1 /etc/hostname.fxp2 !route add -mpath default 10.132.0.1

最后, 别忘了通过启用sysctl的相关选项来启用多路径路由。

# sysctl net.inet.ip.multipath=1 # sysctl net.inet6.ip6.multipath=1

确认您已经编辑了sysctl.conf(5)以便这些更改永久生效。

现在您可以使用traceroute命令试试不同的地址。内核将平衡经过每个多路径路由的流量。

# traceroute -n 154.11.0.4 traceroute to 154.11.0.4 (154.11.0.4), 64 hops max, 60 byte packets 1 10.130.128.1 19.337 ms 18.194 ms 18.849 ms 2 154.11.95.170 17.642 ms 18.176 ms 17.731 ms 3 154.11.5.33 110.486 ms 19.478 ms 100.949 ms 4 154.11.0.4 32.772 ms 33.534 ms 32.835 ms

# traceroute -n 154.11.0.5 traceroute to 154.11.0.5 (154.11.0.5), 64 hops max, 60 byte packets 1 10.132.0.1 14.175 ms 14.503 ms 14.58 ms 2 154.11.95.38 13.664 ms 13.962 ms 13.445 ms 3 208.38.16.151 13.964 ms 13.347 ms 13.788 ms 4 154.11.0.5 30.177 ms 30.95 ms 30.593 ms

更多关于怎样选择路由的信息请参看 RFC2992, "Analysis of an Equal-Cost Multi-Path Algorithm".

值得注意的是如果一个多路径路由使用的接口有故障(例如, 丢包), 内核仍然会根据这个多路径路由的指向尝试往那个接口上发送 数据包, 这些数据包肯定不能抵达目的地并会消失得无影无踪。所以这里我们强烈推荐使用ifstated(8)检查出有问题的接口的, 并据 此调整路由表。

[索引] [第五章 - 从源码构建系统] [第七章 - 键盘与显示控制]

[email protected] $OpenBSD: faq6.html, v 1.272 2009/01/30 22:25:57 sthen Exp $

http://www.9971.us/OpenBSD4.5/c/faq6.html(第 23/23 页)2009-5-3 23:01:50 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制

[索引] [第六章 - 网络] [第八章 - 常见问题]

7 - 键盘和显示控制

目录

● 7.1 - 我如何重新映射键盘?(wscons)

● 7.2 - OpenBSD能支持控制台鼠标吗?

● 7.3 - 我怎样在每次用户登出后自动清空控制台?

● 7.4 - 访问控制台的屏幕回滚缓存器。(amd64, i386, 一些Alpha)

● 7.5 - 我怎样切换控制台? (amd64, i386, Zaurus, some Alpha)

● 7.6 - 我怎样将控制台分辨率调整为80x50? (amd64, i386, some Alpha)

● 7.7 - 我怎样使用一个串口控制台?

● 7.8 - 我怎样让控制台黑屏? (wscons)

● 7.9 - 我登陆时输入的全是大写字母!

7.1 - 我如何重新映射键盘? (wscons) ports中可以使用wscons(4)控制台驱动器的平台: alpha, amd64, hppa, i386, mac68k, macppc, sparc, sparc64, vax及zaurus。 有了wscons(4)控制台, 大多数选项可以用wsconsctl(8)命令控制。例如, 您想 用wsconsctl(8)改变键盘布局, 执行如下指令:

# wsconsctl -w keyboard.encoding=uk

下一个例子我们将"Control L"映射到"Caps Lock" 上:

# wsconsctl -w keyboard.map+="keysym Caps_Lock = Control_L""

7.2 - OpenBSD能支持控制台鼠标吗?

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 1/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制

对alpha, amd64和i386平台来说, OpenBSD提供了wsmoused(8), 一个FreeBSD上moused(8)的port, 您可 以通过在rc.conf(8)里加上适当的命令让它在系统启动时自动加载。

7.3 - 我怎样在用户每次登出后自动清空控制台

为了达到此目的, 您需要在/etc/gettytab(5)里加入一行, 改变当前选项:

P|Pc|Pc console:\ :np:sp#9600:

在末尾增加一行 ":cl=\E[H\E[2J:" , 看起来像这样:

P|Pc|Pc console:\ :np:sp#9600:\ :cl=\E[H\E[2J:

7.4 - 访问控制台的屏幕回滚缓存器 (amd64, i386, some Alpha)

在某些平台上, OpenBSD提供了一个控制台屏幕回滚缓存器。它允许您查已经滚过的屏幕内容。 您只需简单的使用组合键[SHIFT]+[PGUP] 和 [SHIFT]+[PGDN]就可以在缓存器内翻看已经滚过 的屏幕信息。

默认的屏幕回滚缓存器或者允许屏幕回滚的页数是8, 这是vga(4)驱动的一个功能, 所以没有VGA显 卡的计算机将不具备屏幕回滚的功能(很多Alpha计算机使用的是TGA显卡)。

因为容量的限制, 安装内核并未提供屏幕回滚功能。Switching consoles可以清空回滚缓存器。

7.5 - 我怎样切换控制台? (amd64, i386, Zaurus, some Alpha)

在amd64, i386 和 安装vga(4)卡的Alpha系统上OpenBSD默认提供6个虚拟终端, 从/dev/ttyC0 一直到 / dev/ttyC5。ttyC4是为X Window 系统预留的, 剩下的5个是字符控制台。您可以使用[CTRL]+[ALT] +[F1], [CTRL]+[ALT]+[F2], [CTRL]+[ALT]+[F3], [CTRL]+[ALT]+[F4] 和 [CTRL]+[ALT]+[F6]在它 们之间切换。

X环境使用ttyC4, 切换快捷键是[CTRL]+[ALT]+[F5].。当您使用X时, [CTRL]+[ALT]+[Fn] 键可以带 您回字符界面;重新[CTRL]+[ALT]+[F5]将会再次进入图形环境。

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 2/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制

如果您希望有比默认更多的控制台, 使用wsconscfg(8)命令来添加屏幕ttyC6, ttyC7 或更多的。例如:

wsconscfg -t 80x25 6

将为ttyC6产生虚拟终端, 使用[CTRL]+[ALT]+[F7]可以进入。如果您想在下次启动后又更多的控 制台, 不要忘了在您的rc.local(8)上添加命令。

注意除非您在/etc/ttys(5)里把新增加的虚拟控制台设置成"on"或者您重新启动计算机, 或者您用kill (1)发送给init(8)一个HUP指令, 否则您的新控制台将看不到"login:" 提示符。

在Zaurus平台, 默认有两个虚拟控制台(/dev/ttyC0 和 /dev/ttyC1), 进入控制台使用 [ALT] +[CALENDAR] and [ALT]+[ADDRESS] ([ALT] 键时左侧的[CTRL] 键右边第二个按键)。

7.6 - 我怎样把控制台的分辨率调整为80x50? (amd64, i386, some Alpha) amd64, i386, 和 VGA Alpha用户通常是一个25行80字符的屏幕显示, 然而许多VGA显卡有能力显 示更高的字符分辨率——50行80字符。

首先, 必须用wsfontload(8)命令将支持更高分辨率字符显示所需的字体装入系统。标准的80x25字符 界面使用8x16像素的字体, 如果要把行数增大倍我们需要8x8像素的字体。

然后我们必须用virtual console命令删除和重新建立一个我们想要的更高分辨率的virtual console(虚 拟控制台)。

您在rc.local(8) 文件内加入如下的几行, 下次启动后将自动生效:

wsfontload -h 8 -e ibm /usr/share/misc/pcvtfonts/vt220l.808 wsconscfg -dF 5 wsconscfg -t 80x50 5

当对您的系统进行更改时, 推荐您花一些时间读一下有关的用户手册以便明白命令的作用。

第一行装入8x8字体, 第二行删除控制台5(使用[CTRL]+[ALT]+[F6]进入), 第三行创建一个新分辨率 50x80的控制台。当您完成这些设置时您会发现您的主终端和其它默认终端的屏幕分辨率是80x25 的模式, 但是新创建的控制台5(使用[CTRL]+[ALT]+[F6]进入)已经是80x50的分辨率了。

记住 [CTRL]+[ALT]+[F1] 是屏幕 0 (ttyC0). 如果您需要更改其它的屏幕分辨率, 简单地对更改分辨 率的屏幕应用上述过程, 就可以将其的分辨率更改为80x50

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 3/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制 您需要避免更改屏幕4(ttyC4, [CTRL]+[ALT]+[F5])的分辨率, 因为它是给X预留的图形屏幕。同样 您也无法修改主控制台(也就是ttyC0)的分辨率。

正如您所料, 所有这些命令必须用root的身份输入, 或者用sudo(8)(更好)。

注意: 并非所有的图形卡上这样设置全可以成功。不幸的是并非所有的图形卡全支持80x50字符终 端所需调用的字体。在这种情况下, 您可以考虑运行X。

7.7 - 我怎样使用一个串口控制台?

有很多原因可能让您在OpenBSD上使用串口控制台

● 记录控制台输出(对于文件)。 ● 远程管理。 ● 方便管理大量的机器。 ● 提供机器上的dmesg 信息, 这个信息采用其余方式很难得到。 ● 如果系统崩溃可以提供一个准确的"trace" 和 "ps"输出以便开发者有机会解决这个错误。

OpenBSD在大多数平台上支持串口控制台, 然而各平台间的细节有较大差异。

注意使用串口控制台并不是一个平常的工作——您经常需要准备不常用的缆线, 并且机器间的接 口也不标准, 在一些场合同样的机型也可能有不同的端口。我们这里假设您清楚如何选择合适的 缆线以连接您的计算机与串口终端。一个完整的串行端口的指南超出了本文讨论的范围, 我们仅 给出一个提示:两端端口可以成功匹配并不意味着它可以正常工作。

更改/etc/ttys

在OpenBSD上启用串口控制台要执行两个步骤。首先您必须让OpenBSD把您的串行接口当成一个 控制台并处在单用户模式下, 这个步骤各平台差别很大。第二您必须使串行端口被用来作为一个 交互式终端, 以便多用户模式下用户可以登录。这个步骤各平台之间相似, 我们将在这里详细描 述。

终端会话由/etc/ttys文件控制。OpenBSD在设备上给您一个"login:"提示符之前, 它必须在/etc/ttys文 件内被启用, 做完这些工作后, 串行接口将代替终端进行其它工作。在平台上通常有一个键盘和屏 幕作为控制台, 串行终端通常是默认被禁止的。这个例子中我们还是假设使用i386平台, 您必须编 辑这句:

tty00 "/usr/libexec/getty std.9600" unknown off

让它看起来像:

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 4/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制

tty00 "/usr/libexec/getty std.9600" vt220 on secure

这里, tty0是串行端口, 我们把它当作一个终端。vt220(其它可能的选项包括 vt100, xterm等)是匹配您 终端的termcap(5)入口, on 表示为串行端口激活getty , 所以会出现 "login:"提示符, "secure"允许root登 录这个控制台(这里可能是也可能不是您所希望的), 而9600是终端的波特率。如果您在这里把波特 率设成您硬件所能支持的最大值往往会产生问题而非有更好的效果。多数系统有一个"默认"的速 度(被启动光盘和(或)启动引导器的默认支持的通常是9600), 请您在这里保持默认值, 除非您有真正 的修改原因。

注意您在使用控制台安装系统时不要做这一步, 因为系统此时正运行在单用户模式下, 不必为登录 使用getty。

在某些平台和某些配置下如果只能使用串口控制台, 您必须让系统进入单用户模式才可以才可以 做这些更改。 amd64 和 i386

为了让启动程序把串行端口当作一个控制台, 您需要编辑文件/etc/boot.conf, 包含这行:

set tty com0

使用第一个串行端口作为您的控制台。默认的波特率是9600bps, 这个值可以在/etc/boot.conf文件内 stty参数的那行修改。这个文件在您的启动硬盘上, 也可以放在安装软盘内, 或者您可以在某次(或 第一次)使用串口控制台从OpenBSD second-stage boot loader启动时当出现boot>提示符时键入命 令。 amd64 和 i386 说明:

● OpenBSD的串行端口编号从tty00 开始, DOS/Windows 从COM1 开始标识它们, 记住tty02 是 COM3, 不是 COM2 ● 有些系统允许在没有显卡的计算机上进行操作, 但绝不是所有系统全可以——许多系统此 时会认为不具备条件。有些机器会因为仅仅没有检测到键盘而拒绝工作。 ● 有些系统可以在BIOS里设置一个选项将所有的键盘和屏幕的活动重定向到一个串行端口, 这样计算机就完全可以通过串行端口进行维修。您的计算机也许不同——当使用这项功能 时, 有的BIOS会绝对从串行端口装入引导, 所以将不会从内核引导。有的BIOS里有一个选 项"Continue Console Redirection after POST" (Power On Self Test), 这个选项应该关闭, 这样启动 引导器和内核才能通过串行端口工作。很不幸, 并非多数计算机全可以使用串行端口控制 台。 ● 不像其它的平台, PC兼容机设计时没有考虑从串口控制台运行程序。即使有这个功能的PC 机也仅把它当作一个BIOS里的选项——而且一旦配置搞乱时您会发现系统又开始搜寻标准 的监视器和键盘。通常情况下amd64和i386计算机有问题时您应该准备好监视器和键盘。

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 5/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制

● 您需要按照上面的操作编辑/etc/ttys。

SPARC 和 UltraSPARC

这些机器设计时已经考虑了完全用串口控制台进行维护, 你只需简单地拔下键盘, 就可以运行串口 了。

SPARC 和 UltraSPARC 说明

● SPARC上的串口标记为 ttya, ttyb, etc. ● 不像一些其它平台, 不需要更改 /etc/ttys 就可以使用串口控制台。 ● SPARC/UltraSPARC系统将串口控制台的中断信号理解为一个 STOP-A 命令, 将系统回切到 外部提示符, 并同时停止所有的应用程序和操作系统。 这在你需要时是很方便的, 但遗憾的 是一些串口终端在关闭时和一些RS-232设备开关设备会向计算机发送一些类似暂停的信号, 会导致机器停止工作。请在用在生产环境前先进性测试。 ● 如果你的系统带有键盘和监视器, 你仍然可以通过在OK提示符下键入下列命令强制用串口 终端替代它们:

ok setenv input-device ttya ok setenv output-device ttya ok reset

如果键盘和监视器(ttyC0)在 /etc/ttys (上面)里还是启用状态, 你可以在X里继续使用它们。

MacPPC

MacPPC机器可以通过OpenFirmware配置串口终端, 使用下面的命令:

ok setenv output-device scca ok setenv input-device scca ok reset-all

将你的串口终端设置到 57600bps, 8N1.

MacPPC 说明

● 很遗憾, 串口终端在多数MacPPC上不能直接使用, 尽管这些机器上确实带有串口硬件, 但是 无法从外部访问机器。幸运的是, 一些公司提供了一些附加设备可以让这个通讯端口作为 串口终端(或其它用途)使用。用呢喜欢的搜索引擎查一下 "Macintosh internal serial port"。

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 6/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制

● 你必须在 /etc/ttys 内将你的tty00改设为 on 并且像上面详细描述的那样用57600替代9600的默 认速度, 这样就可以在启动到多用户模式前进入单用户模式, 然后串口终端就可以工作了。

Mac68k

串口终端可在 Booter 程序中选择, 在 "Options" 的下拉菜单里, 选择 "Serial Ports"。检查 "Serial Console" 按钮, 再选择Modem或Printer端口。你需要一根Macintosh的调制解调器或打印机电缆线来 连接Mac的串行端口。如果你想将这些设置为默认选项, 直接在 Booter 程序中保存你修改的选 项。

Mac68k Notes

● 调制解调器端口是tty00, 打印机端口是tty01。 ● 除非被调用否则Mac68k不会开启串行端口, 所以你的外部设备在OpenBSD启动过程开始前 不会显示任何信号。(译者理解:是否需要连上串口终端后再启动一次?) ● 你不许如上所述启用通信端口(tty00 或者tty01)。

7.8 - 我怎样让控制台黑屏? (wscons)

当您没有在使用X时如果想在一段非活动状态后关闭监视器, 您可以改变下面的wscons(4)变量:

● display.vblank 设置为on将禁用垂直同步脉冲, 它将使很多监视器进入一种"节能"模式。这种 模式的屏幕恢复需要的时间比较长, 但是减少监视器的能量消耗和产生的热量。如果设置 为off, 看着是黑屏状态, 但是监视器还在正常的接收水平和垂直脉冲, 所以需要时屏幕马上可 以恢复。 ● display.screen_off 指定关闭的时限, 以千分之一秒为单位。例如60000表示一分钟后关闭。 ● display.kbdact 指定键盘被激活后立刻开启监视器, 通常这个功能比较受欢迎。 ● display.outact 指定如果有屏幕输出立刻开启监视器。

您可以在命令行使用wsconsctl(8)命令来设置这些变量:

# wsconsctl -w display.screen_off=60000 display.screen_off -> 60000

或者可以在/etc/wsconsctl.conf文件中设置, 这样可以在系统下次启动后永久生效:

display.vblank=on # enable vertical sync blank display.screen_off=600000 # set screen blank timeout to 10 minutes display.kbdact=on # Restore screen on keyboard input

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 7/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第七章 - 键盘与显示控制 display.outact=off # Restore screen on display outpu

> 无论display.kbdact 或 display.outact, 任何一个设置为on, blanker就会被激活。

7.9 - 我登陆时输入的全是大写字母!

实际上这是一个特色, 不是程序错误。 事实上所有的Unix命令和用户名全是用小写字母。然而, 有 些非常老的终端只能显示大写字母, 所以如果没这个特色, 他们很难使用Unix。在一个工作区如果 您输入您的名字时全使用大写字母, getty(8)将假设您的终端无法显示小写字母, 然后在屏幕上用大 写字母显示您的名字, 并把您键入的内容视为实际上全应该是小写字母, 如果您使用密码是大小写 混合的或大写的, 这时就会出问题。(系统会认为您键入的是小写字母, 而与实际的密码不匹配。) 在login提示符下键入CTRL-D将会终止getty(8), 然后init(8)会重新调入一个新的, 这个新的getty(8)可 以正常分辨大小写。 [索引] [第六章 - 网络] [第八章 - 常见问题]

[email protected] $OpenBSD: faq7.html, v 1.78 2008/03/01 11:31:08 steven Exp $

http://www.9971.us/OpenBSD4.5/c/faq7.html(第 8/8 页)2009-5-3 23:01:53 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

[索引] [第七章 - 键盘与显示控制] [第九章 - 转到OpenBSD]

8 - 常见问题

目录

● 8.1 - 我忘记root密码了, 我现在该怎么办?

● 8.2 - X 无法启动, 显示许多错误信息

● 8.3 - 我能在OpenBSD上使用"L"语言吗?

● 8.4 - 什么是ports树?

● 8.5 - 什么是packages(软件包)?

● 8.6 - 我可以用Ports 或Packages上的软件吗?

● 8.8 - 如果在启动时没有接上软驱我还能使用它吗?

● 8.9 - OpenBSD的启动引导器 (i386, amd64 specific)

● 8.10 - 在OpenBSD系统上使用S/Key

● 8.12 - OpenBSD支持SMP吗?

● 8.13 - 有时我使用tty设备时出现I/O错误

● 8.14 - OpenBSD中可以使用哪些浏览器?

● 8.15 - 如何使用mg编辑器?

● 8.16 - ksh(1) 看起来不读取我的.profile!

● 8.17 - 为什么我修改后的/etc/motd又被重写了?

● 8.18 - 为什么www.OpenBSD.org运行在Solaris上?

● 8.20 - X中的抗锯齿与TrueType字体

● 8.21 - OpenBSD支持日志文件系统吗?

● 8.22 - 反向dns, 或为什什么我登陆需要这样长的时间?

● 8.23 - 为什么OpenBSD网页不遵循HTML4/XHTML标准?

● 8.24 - 为什么我的时钟误差了20多秒?

● 8.25 - 为什么我的时钟误差了几个小时?

8.1 - 我忘记root密码了, 我现在该怎么办?

重新获得root的基本步骤是启动至单用户模式, 挂载有关分区(/ 和 /usr), 运行passwd(1)命令修改root密码, 然 后重新启动您就可以正常登录了。

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 1/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

详细过程:

● 启动至单用户模式. 这个步骤各平台之间略有不同。 拿amd64和i386平台来说, 启动时在系统引导的 第二阶段会停顿几秒钟以便给您一个机会为内核提供启动参数, 显示的就像这样:

probing: pc0 com0 com1 apm mem[636k 190M a20=on] disk: fd0 hd0+ >> OpenBSD/i386 BOOT 3.02 boot>

这时键入"boot -s"将使系统启动至单用户模式:

boot> boot -s

其它大多数平台通过boot ROM.将参数传递给内核。

当然了, 做这个步骤之前您的问题是先将系统关闭(后重新启动), 大多数情况下您可以通过 按"reset"按钮或电源按钮关闭系统, 当然您不会希望这两个按钮仍无法关闭系统, 别太担心OpenBSD 有很强的生命力。

● 挂载分区。 无论"/" 还是 /usr 全需要挂载成可读写的分区。我们这里假定它们位于不同的分区(因为 它们应该在不同的分区内), 输入下面的命令: (译者注:读者可以将这里提到的分区理解为文件系统或 目录, 这在Unix里挂载"分区"、挂载"文件系统"和挂载"目录"都是一个意思, 您可以把"分区"、"文件系 统"理解为是对目录的不同叫法而已。)

# fsck -p / && mount -uw / # fsck -p /usr && mount /usr

● 运行passwd(1)来修改root密码。因为您已经有了root的身份(用单用户模式登录的), 所以您不用提供 当前root的密码就可以修改root密码了。 ● 登录至多用户模式。 您可以输入"CTRL-D"让系统继续按正常模式启动或直接输入reboot(8)命令直 接重新启动系统。

如果这不是一台个人使用的计算机, 您可能需要通过sudo(8)命令让一些人(信任的)可以运行root权限的命 令。

"等一下, 这也太容易了!但这看起来好像不是很安全!" 如果任何攻击者可以物理地接触您的系统, 无论是OS 或计算机, 那他已经获胜了, 还有一些方法可以让使用者登录至单用户模式时必须输入密码(详细请参看ttys (5)), 或者在i386/amd64去除系统启动时的停顿(详细请参看boot.conf), 但是这里特别提醒您一下, 您的这类 小技俩可以被轻松破解(例如从软盘或光盘启动, 然后编辑或替换password文件), 当然您也可以尝试禁止从 软盘或光盘启动或采取其它方式保护您的密码文件, 但是这样的话人家仍然可以从您的计算机上拆下硬 盘。设置这些管理障碍并非真正意义上的安全, 如果您不能防止别人物理接触您的系统, 那您实际上就没

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 2/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

有什么安全可言。

说明:许多"远程管理"系统提供了很多等同于用户可以物理接触系统的功能, 这一点您应该考虑到。如果攻 击者通过一个办法能使用控制台就不能说您的系统是安全的, 攻击者可以插入一个虚拟软盘然后强制重新 启动计算机, 这就好像他们可以物理接触您的系统一样, "远程管理"系统看起来并非像OpenBSD系统那样安 全⋯⋯

8.2 - X无法启动, 显示许多错误信息

X 错误的一个常见原因就是sysctl(8)的选项machdep.allowaperture, OpenBSD上这个选项默认是关闭的, 这也 许是您的问题所在。

您应该编辑 /etc/sysctl.conf 并设置machdep.allowaperture=2(或 1, 根据您的平台), 它允许X下次启动后访问 xf86(4)的aperture驱动, 如果您最初在安装OpenBSD时, 当系统问您"您是否需要运行X系统"的时回答了"y", OpenBSD会自动开启这个选项。

在alpha, amd64, i386, macppc 和 sparc64 平台上OpenBSD需要激活aperture驱动以便访问视频板。其它的平台 使用一个安全的方法来处理显示系统, 并不需要这样(或它们的内核中没有)。如果您并不打算在您的系统 上运行X, 我们建议您不启用aperture驱动。

更多关于如何使用X的信息, 在系统的 /usr/X11R6/README文件上有详细描述。

8.3 - 我能在OpenBSD上使用"L" 语言吗?

您会发现常用的程序设计语言已经包含在基本系统内(这里指在baseXX.tgz 和 compXX.tgzxitong 系统组件 内), 或者包含在packages and ports system内。这里建议您在系统创建时选择安装包含您所需语言的组件或 软件包, 而不是从源码创建。对一些编译器来说, 从源码构建需要占用大量的系统资源, 而且通常情况下您 并不需要这样做, 除非您有特殊的要求或没有相关的软件包可供直接安装。

下面是不同语言的编译器一览表, 您可以寻找您需要的语言并可以查询它们是否有问题或使用限制。其中 一些程序设计语言仅能在某些平台上应用, 您也可以在ports树下运行"make serch key=⋯⋯"命令得到 查询结 果, 您可以注意在哪些"平台"上可以运行, 或者也可以检查port的Makefile目录。如果是后一种情况, 查找包 含ONLY_FOR_ARCHS, NOT_FOR_ARCHS, BROKEN, 等的行。

说明:为了便于使用, 此表按字母顺序排列, 不按语言种类划分。并非所有可在OpenBSD上使用的语言全列 在表中, 如果您发现表中有任何错误和问题, 别客气, 告诉我们。

Language Where? Notes Awk base44.tgz, awk(1) lang/gawk GNU awk

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 3/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

C, C++ comp44.tgz, gcc(1) The C/C++ compilers in the base system have been audited and they have several security enhancements (e.g. ProPolice) enabled by default. Please see gcc-local(1) for details. They will also emit warnings when using unsafe functions such as sprintf (), strcpy(), strcat(), tmpnam(), etc. Note that most platforms use gcc 3.3.5, but some still use 2.95.3. C, C++ lang/gcc These compilers have not gone through the security audit and do not contain security enhancements like those in the base system. The compilers are renamed egcc, eg++, etc. to avoid confusion with their counterparts in the base system. Caml lang/ocaml Objective Caml COBOL lang/open-cobol Erlang lang/erlang Fortran comp44.tgz, g77(1) Only Fortran 77 support. lang/gcc Fortran 95 is also supported by egfortran in gcc 4.0 and above. This new compiler is available as a subpackage (g95) of gcc. Haskell lang/ghc lang/nhc98 Java devel/jdk Sun JDK - no packages available; see build instructions below. lang/classpath essential core class libraries for Java lang/kaffe lang/jikes Fast compiler, works well. This needs a "run-time jar", the bytecode version of all the standard API. devel/eclipse Large IDE; works with Sun JDK Lisp lang/clisp Lua lang/lua Additional Lua libraries and auxiliary utilities are available in the ports tree. Perl base44.tgz, perl(1) Many Perl modules are available in the ports tree, so search there first before installing modules from CPAN. PHP www/php4 Plenty of subpackages are available for different PHP modules. www/php5 Prolog lang/swi-prolog SWI-Prolog environment. Python lang/python Other ports are using Python 2.5 by default. Ruby lang/ruby Scheme lang/chicken lang/scheme48 lang/scm shells/scsh

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 4/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

Smalltalk lang/squeak Tcl lang/tcl

构建Sun JDK

因为Sun的限制性SCSL许可, OpenBSD 不能包含它的JDK的二进制包。这就意味着您不得不从ports树构建 它, 注意这个构建过程需要占用大量的内存。

JDK树位于ports树的devel/jdk子目录。您可以选择不同的版本, 每个版本位于自己的子目录内。当您输入 make命令后, 您会看到一条信息要求您手工从Sun的网站上获取源代码, 您需要预先在Sun的网站上注册并 同意他们的使用许可才有可能下载他们的源代码, 这也是为什么ports框架不能自动下载源代码的原因。

一旦您下载了分发的文件和补丁包, 把它们拷贝到/usr/ports/distfiles目录下, 而且您需要在您的系统上安装 X, 然后开始在ports的子目录内构建它。

JDK需要运行一个Java 2编译器作为辅助程序来构建, 为了满足这个要求, 从OpenBSD 4.0开始, ports中的JDK 1.5采用了kaffe, 它允许JDK 1.5分别运行在i386或amd64平台上, 并大大节省了的构建时间。

老版本的JDK仍需要一个Linux版本的JDK。OpenBSD仅提供i386平台上的Linux模拟, 所以老版本的JDK仅可 以在i386平台上构建, ports框架会安装所需文件并设置kern.emul.linux=1。更多的信息, 请参看用户手册 compat_linux(8)的有关部分, 还有 FAQ 9 – 在OpenBSD上运行Linux二进制文件。 注意Linux模拟仅在构建 JDK时需要, 它可以帮助构建一个OpenBSD系统本地的JDK, OpenBSD的JDK并不需要运行在Linux模拟环境 下。

经过N小时后, 构建过程结束了, 您接下来做make install来安装JDK。

如果在运行中出现错误提示, 诸如 "Could not reserve enough space for object heap", 尝试通过使用shell内置的 ulimit命令(使用 –d参数)放宽对程序的内存使用限制。

其它开发工具

还有许多其它的开发工具包含在基本系统或作为packages和ports中。我们这里仅举几个例子:

● Unix shells: ksh 和 csh 包含在基本系统内, 很多其它的shell (例如zsh, tcsh)在ports的shells子目录内。 ● lint(1): 一个C程序校验工具, 它在openbsd 3.9版本以前就进行了充分的改进, 也提供Linted版本的系统 库文件。 ● "make" utilities: 基本系统已经包含了传统的BSDmake(1)程序, 而且Ports树中也包含了编译某些程序所 必需的其它类型的make工具。 ● 图形工具: 很多流行的图形工具包(例如: GTK+, Tk, Qt, wxWidgets, ...) 已经提供了OpenBSD的版本, 您 可以在ports的x11子目录下找到。 ● 版本控制系统: OpenBSD项目在基本系统内使用GNU CVS, 而且ports里也包含了一些其它的工具。 请参看新的OpenCVS看看有什么新工具。

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 5/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题 8.4 - 什么是ports 树?

请参看 FAQ 15, 应用ports 。

8.5 - 什么是packages?

请参看 FAQ 15, 软件包管理 。

8.6 - 我可以用Ports 或Packages上的软件吗?

请参看 FAQ 15.

8.8 - 如果在启动时没有接上软驱我还能使用它吗?

您需要在设定fdc(4)上设置0x20特征位以便将内核设置成即使在硬件扫描时没有发现软驱也认为软驱已经 连接在系统上了。这通过用User Kernel Config 或 config(8) 改变您的内核来实现。

# config -e -f /bsd OpenBSD 4.5 (GENERIC) #1749: Sat Feb 28 14:51:18 MST 2009 [email protected]:/usr/src/sys/arch/i386/compile/GENERIC Enter 'help' for information ukc> change fd* 254 fd* at fdc0 drive -1 flags 0x0 change [n] y drive [-1] ? ENTER flags [0] ? 0x20 254 fd* changed 254 fd* at fdc0 drive -1 flags 0x20 ukc> q Saving modified kernel. #

8.9 - OpenBSD 启动引导器 (i386, amd64 specific)

当您启动您的OpenBSD系统时, 会注意到boot提示符;

boot>

对多数人来说, 这时您不必做任何事情, 如果您不在这里输入命令系统将自动启动, 但有时系统出现错误或 因为需要特殊的功能, 您早晚会用到。开始前, 您应该从头阅读boot(8)的用户手册, 这里我将回顾一下引导

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 6/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

过程最常用的命令。

开始时, 如果没有命令输入, 启动程序将自动尝试启动 /bsd, 如果失败了, 启动程序将尝试启动 /obsd, 如果又 失败了, 启动程序将再尝试 /bsd.old 。您也可以通过手动输入一个指定的内核:

boot> boot hd0a:/bsd

这将启动位于BIOS识别出的第一块硬盘上的"a"分区上的名为bsd的内核文件。 或

boot> b /bsd

这里有一份您可以使用的OpenBSD内核启动时的参数清单:

● -a : 这个参数允许您启动内核后指定另一个根设备(root device)。 ● -c :允许您输入配置的启动时间, 详参Boot Time Config这一小节。

● -s : 启动至单用户模式。 ● -d : 这个选项用来将内核转储到ddb. 您要先在内核中构建DDB。

这些参数的输入格式是f: boot [ image [-acds]]

更详尽的说明在 boot(8)'s man page.

8.10 - S/Key

S/Key是一个"一次性密码认证系统"。S/Key对那些数据传输过程中不能使用加密通道保护其认证凭据的人 来说很有用处, 这里所指的加密通道是像以ssh(1)方式建立的连接。

警告: 一次性密码认证系统仅保护认证信息, 它不能防止网络上的窃听者获取你的私人信息, 此外, 如果如果 你要访问一个加密的系统A, 我们建议您从一个可信的系统B对A进行访问, 这样做的目的是确保没有人可以 通过记录你的键盘击键或捕捉、伪造你的终端上的输入输出信息进入系统A。

S/Key系统将用户输入的加密短语通过安全的哈希算法生成一个一次性序列密码以应对来自服务器的询 问。这个系统安全的前提是用户的加密短语没有通过网络进行传输。因次必须通过一个安全通道进行用 户加密短语的初始化或更改, 例如通过 ssh(1)或控制台。

OpenBSD的S/Key系统运行时可以采用不同算法的单向哈希函数:

● md4

● md5

● sha1

● rmd160.

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 7/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

建立 S/Key - 第一步

首先必须保证存在一个 /etc/skey 目录。如果你没有这个目录, 用超级用户的身份创建它, 简单地键入如下命 令就可以了:

# skeyinit -E

一旦该目录存在, 就可以初始化你的 S/Key 了。你必须使用 skeyinit(1) 初始化你的 S/Key, 因为 skeyinit(1) 会 问你 S/Key 的加密短语, 所以你必须如上所述通过一个安全通道运行它! skeyinit(1)程序也会提醒你这样 做。运行skeyinit(1)时, 首先要求你输入password, 这个password就是你登陆系统所用的密码。一旦你的密码 被认可, 接下来要求你输入 S/Key 的加密短语——secret passphrase, 这个secret passphrase不是你的系统登陆密 码。你的加密短语至少要含有10个字符。我们建议你使用包含几个单词的容易记忆的短语作为加密短语, 下面是一个添加用户的例子:

$ skeyinit Reminder - Only use this method if you are directly connected or have an encrypted channel. If you are using telnet, exit with no password and use skeyinit -s. Password: <---这里输入你的系统登陆密码 [Adding ericj with md5] Enter new secret passphrase: <---这里输入你的加密短语 Again secret passphrase: <---这里再次输入你的加密短语

ID ericj skey is otp-md5 100 oshi45820 Next login password: HAUL BUS JAKE DING HOT HOG

这里特别重要的一行是 ID ericj skey is otp-md5 100 oshi45820 。它给用户提供了很多的信息。 下面是这一小 段各部分的含义及其重要性:

● otp-md5 - 这说明使用哪种单向哈希生成你的一次性密码(otp)。 ● 100 - 这是你的序列号。这个序列号从100到1递减, 一旦序列号已经递减为1, 必须通过运行skeyinit(1) 来重新产生另一个加密短语。 ● oshi45820 - 这是 key.

但是这里更重要的是你的一次性密码。你的一次性密码包含6个短英语单词, 它们和空格组合在一起就是 你的一次性密码。 这个skeyinit输出的一次性密码不能用来登陆(这里有关于第一个一次性密码使用的论 述, 请参看 skeyinit(1)). 为了成功登陆, 一个一次性密码必须与登陆过程中 skey(1) 的计算值一致, 下一小节 将告诉你怎样做。

实战 S/Key 登陆

现在skey已经初始化, 你就准备登陆了。 这里有一个例子是使用 S/Key 登陆的过程。要使用 S/Key 登陆清 在你的用户名后面加上 :skey 。

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 8/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

$ ftp localhost Connected to localhost. 220 oshibana.shin.ms FTP server (Version 6.5/OpenBSD) ready. Name (localhost:ericj): ericj:skey 331- otp-md5 96 oshi45820 331 S/Key Password: <--这里输入 S/Key的password 230- OpenBSD 4.4 (GENERIC) #1021: Tue Aug 12 17:16:55 MDT 2008 230- 230- Welcome to OpenBSD: The proactively secure Unix-like operating system. 230- 230- Please use the sendbug(1) utility to report bugs in the system. 230- Before reporting a bug, please try to reproduce it with the latest 230- version of the code. With bug reports, please try to ensure that 230- enough information to reproduce the problem is enclosed, and if a 230- known fix for it exists, include that as well. 230- 230 User ericj logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> quit 221 Goodbye.

注意我在我的用户名后面加上了":skey", 这是告诉ftpd我想使用 S/Key 认证登陆。有时读者可能已经注意到 了我的序列号变成了 otp-md5 96 oshi45820 , 这是因为到目前为止我已经用 S/Key 登陆过几次了。 但是你怎 样产生你自己的一次性密码呢? 是这样, 为了计算你的一次性密码, 你需要知道你正在使用的序列号和你的 key 。 可能像你现在想的, 你怎么能记得正在使用序列号是多少呢?

实际上当你登陆时, 登陆过程在屏幕显示里包含了一行有用的信息, 你可以用它当场在另一台可信的计算 机上通过一个安全通道生成一个一次性密码, 你只需拷贝这行并粘贴到shell的命令行中:

otp-md5 96 oshi45820

当你输入完你的加密短语后, 你的一次性密码会被打印在屏幕上, 然后以可以拷贝-粘贴到 S/Key Password 提示符那里去登陆。 并非仅使用 otp-md5 一种哈希类型, skey(1) 命令也交替使用其它哈希类型。

如果你已经登入并且想为下一次登陆生成一个新的一次性密码, 请使用 skeyinfo(1), 它会告诉你下次登陆需 要使用什么。例如这里, 我为自己将来登陆生成另一个一次性密码。 (记住, 我是通过一个安全通道进行这 些操作的)。

$ skeyinfo 95 oshi45820

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 9/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

一个更好的方法是使用 skeyinfo -v, 它可以合适地生成一个命令以便在shell中运行, 例如:

$ skeyinfo -v otp-md5 95 oshi45820

所以, 生成下一个S/Key的一次性密码最简单的方法是只要:

$ skeyinfo -v Reminder - Do not use this program while logged in via telnet. Enter secret passphrase: <--这里输入加密短语 NOOK CHUB HOYT SAC DOLE FUME

注意上面的小点。(译者注:键盘左上角的波浪线那个键)

我可以确认你们中的很多人没有条件总使用加密连接或信任的本地计算机来生成这些密码, 然而用不安全 的连接产生这些密码是不可行的, 所以怎样才能一次创建多个'一次性密码'呢? 你可以将你需要产生的密码 数量提供给 skey(1) , 然后这些密码会打印在屏幕上, 这样你就可以随便带这他们去哪里了。

$ otp-md5 -n 5 95 oshi45820 Reminder - Do not use this program while logged in via telnet. Enter secret passphrase: <--这里输入加密短语 91: SHIM SET LEST HANS SMUG BOOT 92: SUE ARTY YAW SEED KURD BAND 93: JOEY SOOT PHI KYLE CURT REEK 94: WIRE BOGY MESS JUDE RUNT ADD 95: NOOK CHUB HOYT SAC DOLE FUME

这里注意一下, 尽管面顺序输出的, 但是密码的顺序是自下而上的, 因为是从100到1倒着数的。

在ssh(1)和telnet(1)中使用S/Key

在ssh(1)和telnet(1)中使用S/Key 和在FTP中使用很相似——你只需在你的用户名后面附加上":skey", 例如:

$ ssh -l ericj:skey localhost otp-md5 98 oshi45821 S/Key Password: SCAN OLGA BING PUB REEL COCA Last login: Thu Apr 7 12:21:48 on ttyp1 from 156.63.248.77 OpenBSD 4.4 (GENERIC) #1021: Tue Aug 12 17:16:55 MDT 2008

Welcome to OpenBSD: The proactively secure Unix-like operating system.

Please use the sendbug(1) utility to report bugs in the system.

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 10/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

Before reporting a bug, please try to reproduce it with the latest version of the code. With bug reports, please try to ensure that enough information to reproduce the problem is enclosed, and if a known fix for it exists, include that as well.

You have mail. $

8.12 - OpenBSD支持SMP吗? (均衡多个处理器)

OpenBSD在OpenBSD/i386, OpenBSD/amd64, OpenBSD/mvme88k, 及OpenBSD/sparc64 (包含 UltraSPARC T1 处理器) 平台上支持SMP。

您可以在安装系统时选择一个单独的内核"bsd.mp", 我们建议您在用它做系统默认内核(改名为bsd)前先测 试一下用它可否启动。

我们期待将来可以在更多的平台上提供对SMP的支持, 在多数其余平台上OpenBSD可以运行SMP, 但只有一 个处理器起作用。一个例外就是SPARC平台--OpenBSD/sparc必须移除额外的MBus模块系统才能启动。

8.13 - 有时我使用tty设备时出现I/O错误。

You need to use /dev/cuaXX for connections initiated from the OpenBSD system, the /dev/ttyXX devices are intended only for terminal or dial-in usage. While it was possible to use the tty devices in the past, the OpenBSD kernel is no longer compatible with this usage.

From cua(4):

For hardware terminal ports, dial-out is supported through matching device nodes called calling units. For instance, the terminal called /dev/tty03 would have a matching calling unit called /dev/cua03. These two devices are normally differentiated by creating the calling unit device node with a minor number 128 greater than the dial-in device node. Whereas the dial-in device (the tty) normally requires a hardware signal to indicate to the system that it is active, the dial-out device (the cua) does not, and hence can communicate unimpeded with a device such as a modem. This means that a process like getty(8) will wait on a dial-in device until a connection is established. Meanwhile, a dial-out connection can be established on the dial-out device (for the very same hardware terminal port) without disturbing anything else on the system. The getty(8) process does not even notice that anything is happening on the terminal port. If a connecting call comes in after the dial-out connection has finished, the getty(8) process will deal with it properly, without having noticed the intervening dial-out action.

8.14 - OpenBSD中可以使用哪些浏览器?

基本系统内包含了一个基于文本的浏览器Lynx, 它支持ssl。其它的浏览器包含在ports tree中(排名不分先 后):

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 11/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

图形(X)浏览器

● Konqueror 是KDE 桌面环境的一个部件。

● Konqueror-embedded (konq-e) Konqueror, 仅需要KDE的库文件而非所有KDE系统。

● Links+ 另一款快速小巧的图像浏览器。(也可以提供文本模式)

● Firefox 和 SeaMonkey 功能的浏览器。Firefox仅是基于Mozilla的一款浏览器, 而SeaMonkey包含了很多 一般浏览器没有的特点(如邮件客户端, IRC客户端等), 它们在很多平台上全可以使用。 ● Minimo, 一个为手持系统设计的轻量级Firefox浏览器。

● Opera 商业浏览器, 仅运行在i386平台上(需要linux模拟)。

● Amaya W3C的浏览器和编辑器。

● Kazehakase, 一个轻量级的浏览器, 可以使用WebKit或Gecko的渲染引擎。

● Midori, Xfce项目的一个基于WebKit的浏览器。

控制台(字符模式)浏览器

● elinks 有丰富的功能, 可以渲染框架和表格, 可高度定制。

● w3m 支持框架和表格 (也提供图形模式)。

● links 支持表格。

您可以在packages collection中找到这些浏览器, 安装ports树后, 如上所述的浏览器位于/usr/ports/www/目 录。其中大部分已经预编译并可以在FTP servers和CD-ROM上获得。大部分图形浏览器的程序代码很长, 需要花费很久的时间下载及编译, 我们强烈建议使用已经编译好的packages。

8.15 - 如何使用mg编辑器?

Mg是一个包含在OpenBSD内的Emacs风格微型文字编辑器, 微型意思就是它很小巧(Emacs很庞大!), 请阅读 包含在mg(1)源代码中的用户手册及演示。

注意因为mg是一个小的类Emacs工具, 它仅具有类似Emacs17的文本编辑功能, 而没有Emacs的其它功能。 (例如:邮件和其它新特性, 以及Lisp, C++, Lex, Awk, Java模式等)

8.16 - ksh(1) 看起来不读取我的.profile!

有两个原因可能使ksh(1)忽略用户的.profile文件:

● .profile文件不属于该用户, 您可以通过修改username

# chown username ~username/.profile

● 您在X环境下使用ksh(1)

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 12/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

在xterm(1)下, ksh(1)的argv[0]没有用破折号("-")做前缀, 如果以破折号("-")做argv[0]的前缀 csh(1) 和 ksh(1) 会去解释自己的登录文件。(对csh(1)来说登录时总是先解释文件 .login 及文件 .cshrc ;对 ksh (1) 来说更为明显, 因为仅有一个启动脚本文件 .profile , 所以除非shell是login shell否则用户的这个脚 本将被忽略。)

解决这个问题, 在您的home directory目录内的 .Xdefaults 文件里加上一行"XTerm*loginShell: true"。注 意, .Xdefaults 文件默认是不存在的, 您需要手动建立它。

$ echo "XTerm*loginShell: true" >> ~/.Xdefaults

您在其它计算机上不必一定要这样做, 因为如果您已经安装了X Window, 那么默认设置就是这样 的。OpenBSD顺应X.org的做法。

8.17 - 为什么我修改后的/etc/motd又被重写了?

/etc/motd文件在系统每次启动时会被自动重新编辑, 除了第一个空行及有关系统内核版本的信息予以保留 外, 其它信息一概被替换掉。如果您想编辑这个文件, 请确保将您输入的内容放在这个空行下面, 这样可以避 免每次系统启动 /etc/rc 编辑 /etc/motd文件时自动删除您输入的内容。

(译者注:如果您不想让系统显示内核版本信息, 就把 /etc/rc 文件内的以下内容注释掉:

# mg /etc/rc

把下面部分全部注释掉系统就不会每次启动重新修改motd信息了,

# patch /etc/motd if [ ! -f /etc/motd ]; then install -c -o root -g wheel -m 664 /dev/null /etc/motd fi T=`mktemp /tmp/_motd.XXXXXXXXXX if [ $? -eq 0 ]; then sysctl -n kern.version | sed 1q >; $T echo "" >;>; $T sed '1, /^$/d' < /etc/motd >;>; $T cmp -s $T /etc/motd || cp $T /etc/motd rm -f $T fi

这样您就可以随心所欲地编辑自己的motd信息了。)

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 13/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

8.18 - 为什么www.OpenBSD.org运行在Solaris上?

尽管没有开发者认为这有什么特别的关联性, 但是这个问题在邮件列表上被反复问及, 在这里我们做个答 复:www.openbsd.org和OpenBSD的主要ftp站点放在加拿大艾博塔大学的一台SUN服务器上, 所有这些服务 器隶属于一个大型的SUN系统, 这个SUN系统有巨大的储存空间和带宽。目前OpenBSD的使用的这台服务 器允许我们使用这些带宽, 这就是为什么主力站点存放在这里的原因。很多OpenBSD的镜像站点运行在 OpenBSD系统上, 但是这些站点全不能确保提供如此大的带宽, 所以开放团队决定把主力站点放在艾博塔 大学的SUN服务器上。

(译者注:这看来又是一个历史问题了, 我在复制英文网页的时候还有这一段, 但是目前的OpenBSD网站上已 经没有这一段了, 查了一下netcraft, 似乎从09年1月开始OpenBSD已经使用了自己的平台, 目前的OS 是"NetBSD/OpenBSD", web服务器是apache, 但是为了让读者了解一些OpenBSD的历史, 我保留这段文字, 当 初FAQ出现以上文字也就是说在邮件列表上这个问题已经被有意或无意地提问过无数次了。)

8.20 - X中的抗锯齿与TrueType字体

请看这里。

8.21 - OpenBSD支持日志文件系统吗?

不, OpenBSD不支持日志文件系统。我们用一个被称为Soft Updates的不同机制达到类似的效果。请参阅 FAQ 14 - Soft Updates。

8.22 - 反向dns或为什么我登陆需要这样长的时间?

许多OpenBSD的新用户有过这样的经历, 就是启用ssh, ftp, 或telnet等服务时, 登录时间往往延迟了两分钟, 同 样这种情况也发生在使用一个代理, 例如FTP代理, 或者通过工作站上的sendmail往外发送邮件时。

这些通常全是反向DNS的问题, dns提供域名服务, dns将域名比如"www.openbsd.org"转换成数字格式的IP地 址, dns的还有一项功能就是将IP地址转换回域名, 这称作"反向dns"。

为了提供更好的记录, OpenBSD对所有连接系统的计算机用多种方式进行反向dns查询, 这些方式包括ssh, ftp, telnet, sendmail 或 ftp-proxy 等。很遗憾, 有些情况下这些发起连接的计算机并没有提供正确的反向dns条 目。

一个这样的例子:

用户搭建一个OpenBSD系统作为家庭局域网的防火墙和网关, 用NAT方式使所有的内部计算机使用一个外 部IP地址, 内部计算机还可能用这个OpenBSD系统作为出站邮件中继。内网计算机按照安装指南进行配置, 似乎一切全井井有条, 但只有一件事例外——无论何时内部计算机以任何方式连接OpenBSD主机都要延误 2分钟才能连上。

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 14/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

到底发生什么事情了:

在一个网关的NAT后面的工作站只有一个未注册的(内网)地址192.168.1.35, 工作站用户通过网关使用ssh, ssh客户端让用户输入用户名和密码, 然后把它们发给网关。网关使用反向DNS寻找192.168.1.35以便确定是 谁连接它, 问题是192.168.0.0网段是属于内网的IP地址, 所以正常配置的DNS服务器知道这些地址并不存在, 这种情况下, 有的DNS服务器会很快返回一条错误信息, 获得信息后OpenBSD假定无法获得此IP地址的更多 信息(译者注:这里指反向DNS, 也就是通过IP的获得所属域名), 并且马上放弃这种尝试并允许用户登陆。但 是还有一些DNS服务器不会反馈任何信息, 这种情况下您就会发现您的计算机只能等着OpenBSD反复尝试 进行反向DNS解析, 直至询问超时(两分钟)才会允许用户登陆。所以这种情况下有些ftp代理和ftp客户端会 因为设置的尝试时间小于OpenBSD的反向DNS的尝试时间(两分钟), 所以看起来ftp代理无法正常工作。

这看起来很烦人, 幸好, 这个问题不难解决。

通过 /etc/hosts 进行修改:

最简单的解决办法是在内部网的所有工作站上建立 /etc/hosts 文件, 并且确保让 /etc/resolv.conf 文件 用"lookup file bind"指定先从本地的/etc/hosts文件进行寻找解析结果, 如果/etc/hosts没有指定, 就再用 /etc/ resolv.conf 文件中的指定的"nameserver" 进行解析。

您的 /etc/hosts 文件看起来像这样:

::1 localhost.in.example.org localhost 127.0.0.1 localhost.in.example.org localhost 192.168.1.1 gw.in.example.org gw 192.168.1.20 scrappy.in.example.org scrappy 192.168.1.35 shadow.in.example.org shadow

您的 resolv.conf 文件看起来像这样:

search in.example.org nameserver 24.2.68.33 nameserver 24.2.68.34 lookup file bind

还有一种情况是用户可能会说"我是使用DHCP自动分配内网的IP地址, 我怎么处理 /etc/hosts 文件?" , 简单 得很, 实际您只需将DHCP服务器可能分配的动态IP地址和静态设备全放到 /etc/hosts 文件里就好了:

::1 localhost.in.example.org localhost 127.0.0.1 localhost.in.example.org localhost 192.168.1.1 gw.in.example.org gw 192.168.1.20 scrappy.in.example.org scrappy 192.168.1.35 shadow.in.example.org shadow

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 15/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题

192.168.1.100 d100.in.example.org d100 192.168.1.101 d101.in.example.org d101 192.168.1.102 d102.in.example.org d102 [... snip ...] 192.168.1.198 d198.in.example.org d198 192.168.1.199 d199.in.example.org d199

上面这个例子中, 我假设您的DHCP服务器自动分配的IP段是从192.168.1.100到192.168.1.199, 并且在文件的 头部加上了定义的静态设备IP。

如果您的路由器使用DHCP进IP地址分配, 您还会发现一个问题—— dhclient 每次租约到期时将会自动删除/ etc/resolv.conf 文件中的"lookup file bind"这行。这可以通过把"lookup file bind"这行放进 /etc/resolv.conf.tail 这 个文件来解决。

通过使用本地DNS服务器来进行修正

这个讨论超出了本文的范围, 但是基本的技巧就是您安装一个自己喜欢的DNS服务器, 设置它进行所有局 域网内的正向和反向DNS解析, 并且让您局域网内的计算机(包括路由器)使用它作为DNS服务器。

8.23 - 为什么OpenBSD网页不遵循HTML4/XHTML标准?

我们精心地设计了当前的网页风格, 使它可以适应从4.0以后版本的绝大多数浏览器。如果在老的浏览器上 不能正确浏览这些HTML4或者XHTML标准的网页, 那么我们不准备将网页修改成严格遵循HTML4或者 XHTML标准的样式, 因为这并非是我们优先考虑的内容;我们欢迎新技术, 但是建议您把精力用于完善代 码或使原来的网页锦上添花, 而不是让已经存在的网页去适应什么新标准。

8.24 - 为什么我的时钟误差了20多秒?

当您使用rdate(8)来同步NTP服务器时会发现您的时间与本地时间有20多秒的误差。

导致这种情况的原因是UTC(协调世界时, 基于天文观察)时间和TAI(国际原子时间, 基于原子钟)时间之间 的差异。为了补偿地球自转的变化, UTC加入了闰秒, 但是TAI无法调整, 正是加入的闰秒导致了这一差 异。如果需要了解更多的信息请在互联网上搜寻"leap seconds UTC TAI"

解决这个问题很简单, 在绝大多数国家您如果用 rdate(8) 加上 "-c" 参数并使用 /usr/share/zoneinfo/right/ 下的 一个时区将会得到标准时间。例如, 您在德国, 您可以使用如下命令:

# cd /etc && ln -sf /usr/share/zoneinfo/right/CET localtime # rdate -ncv ptbtime1.ptb.de

如果在其他国家, 请自行调整。

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 16/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第八章 - 常见问题 8.25 - 为什么我的时钟误差了几个小时?

默认情况下, OpenBSD假设您的时钟是是与UTC(协调世界时)同步的而非本地时间, 如果您的计算机上安装 了多个操作系统可能会引起一些问题。

许多其它的操作系统也可以按照这样配置以避免引起问题。

如果您无法将计算机时钟设定成UTC, 您可以用config(8)修改OpenBSD的时间模式, 例如, 让OpenBSD使用 US/Eastern(美国东部标准时间, 比UTC晚5小时, 也就是300分钟):

# config -ef /bsd OpenBSD 4.4 (GENERIC) #1021: Tue Aug 12 17:16:55 MDT 2008 [email protected]:/usr/src/sys/arch/i386/compile/GENERIC Enter 'help' for information ukc> timezone 300 timezone = 300, dst = 0 ukc> quit Saving modified kernel.

更详尽的信息请参看options(4)中选项 "TIMEZONE=value"。

一般情况下, 安装时已经设定了时区, 如果您需要更改时区, 您可以在 /usr/share/zoneinfo 文件里创建一个适 当的符号链。例如:将新的本地时间设定为EST5EDT:

# ln -fs /usr/share/zoneinfo/EST5EDT /etc/localtime

也可以参考:

● date(1)

● "为什么我的时钟误差了20多秒?"

● OpenBSD的NTPD

[索引] [第七章 - 键盘与显示控制] [第九章 - 转到OpenBSD]

[email protected] $OpenBSD: faq8.html, v 1.211 2009/02/05 21:20:55 sthen Exp $

http://www.9971.us/OpenBSD4.5/c/faq8.html(第 17/17 页)2009-5-3 23:02:00 OpenBSD 4.5 FAQ中文版 第九章 - 转到 OpenBSD

[索引] [第八章 - 常见问题] [第十章 - 系统管理]

9 - 转到OpenBSD

目录

● 9.1 - 对其它类Unix操作系统用户的提示

● 9.2 - 双启动Linux和OpenBSD

● 9.3 - 将您的Linux(或者其它第六版样式)密码文件转换成BSD格式

● 9.4 - 在OpenBSD中运行Linux程序包

● 9.5 - 在OpenBSD中访问Linux文件

Linux用户可以参看 http://sites.inka.de/mips/unix/bsdlinux.html 以获得更多的信息

9.1 - 对其它类Unix操作系统用户的提示

因为OpenBSD是非常传统的类Unix操作系统, 所以对使用过其它类Unix系统的用户来说将显得很 亲切, 但是它们之间存在着明显的不同。对OpenBSD的新用户来说必须看他的经验: 如果您的Unix 知识仅限于使用过不同版本的Linux系统, 您可能会感觉OpenBSD有点"陌生", 放心, 对先接触 OpenBSD的用户来说Linux对他们也同样很陌生, 您必须承认"标准"和您的经验是有差异的。

如果您学习Unix初期阅读了一些Unix的优秀书籍, 理解了"Unix哲学"并且在某个特定平台上扩展了 您的知识, 您会发现OpenBSD是非常纯正和熟悉的Unix系统。如果您是用一种"说一套做另一套"的 过程学习的Unix, 或者只读了类似"31.4小时精通PinkBeenie v8.3"后就认为自己已经掌握了Unix, 您 很可能觉得OpenBSD与想象的不一样。

OpenBSD与其它很多操作系统的一点不同就是它的帮助文档, OpenBSD的开发者为系统的用户手 册而自豪, OpenBSD中最权威的文档不是这篇FAQ, 也不是第三方独立的维护文档或者什么"HOW TO"之类的文档——用户手册才是OpenBSD问当中最具权威性的文档。当系统发生任何变化时开 发者都会立刻更新用户手册、公布源代码, 这个更新过程没有任何拖延, 顺延或需要等什么人编译 后。组合成系统的每个程序、工具、驱动、配置文件等几乎全有自己的用户手册, 它们使用户可 以在手册上找到问题的答案而非在邮件列表上寻求帮助。

http://www.9971.us/OpenBSD4.5/c/faq9.html(第 1/5 页)2009-5-3 23:02:04 OpenBSD 4.5 FAQ中文版 第九章 - 转到 OpenBSD

这里列出了OpenBSD与其它类Unix系统的一些常见区别:

● OpenBSD是一款非常纯正的"BSD风格"的Unix系统, 它是4.4BSD版本的一个分支, 而Linux和 SCO Unix则是属于"System V"风格的系统。一些类Unix操作系统(包含一些Linnx发行版)混 合了许多"System V"和BSD的特性, 一个通常容易引起混乱的就是启动脚本, OpenBSD是采用 传统BSD4.4风格的rc(8)。

● OpenBSD是一个完整的系统, 系统各组件必须保持同步。它不是一个各部分可单独升级 的"内核加上工具"的系统。如果您的组件(内核、用户工具、应用程序)不同步会导致系统 错误。 ● 因为很多应用并没有被编译和运行在基本系统内, 所以OpenBSD有一个ports树系统使用户 可以方便的获取代码、经过OpenBSD的修正、安装依赖包、进行编译、并用一个标准的易 维护的方式进行安装或卸载。OpenBSD的port团队提供并鼓励用户使用预编译的packages而 非由用户自己进行ports的编译。 ● OpenBSD使用CVS纪录源代码的变化。OpenBSD首创了匿名CVS, 它允许任何人在任何时间 提取任何版本(从2.0版到当前, 以及它们之间个版本的所有文件)的完整源代码, 您甚至可以 获得在数小时前更新的代码, 同样您也可以简单方便地使用web interface to CVS。

● OpenBSD预定每6个月通过CD及FTP发布官方的新版本, 各平台的快照版根据当前发展代码 不定期发布。我们的目标是在任何时间源代码都可以在系统上正确编译和正常使用。源代 码树偶尔会出现一些错误, 但是这些错误会被迅速更正而不会继续保留在那里。 ● OpenBSD包含了一些强劲的加密算法, 这些算法在一些国家不能包含在操作系统内(译者注: 比如在美国规定含有这些加密算法的操作系统不允许出口到一些国家)。 ● OpenBSD经历了严苛和持续的安全审核以确保代码的质量(因此, 安全) 。 ● OpenBSD的内核是 /bsd. ● 硬盘命名通常采用 /dev/wd (IDE硬盘) 或 /dev/sd (SCSI或模拟scsi的硬盘). ● Linux 下无参数的 /sbin/route 会给出所有可用的路由状况, 但在OpenBSD下您需要使用 "show" 参数, 或者使用 netstat -r 。

● OpenBSD不支持像 ReiserFS、IBM的JFS、或者SGI的XFS那样的日志文件系统, 相反我们使用 非常强劲的Unix快速文件系统(FFS)的Soft Updates功能来确保系统的性能和稳定。

● OpenBSD自己拥有包过滤系统(PF), 而非使用第三方的ipfw, ipchains, netfilter, iptables, 或者ipf, 这意味着网络地址转换(大家知道Linux中需要使用IP-Masquerading)、排队及过滤可以由 OpenBSD自己的pfctl(8)、pf(4)以及pf.conf(5)来实现, 更多配制信息介绍请参看PF用户指 南。

● 网络接口地址储存在文件 /etc/hostname. (例如, /etc/hostname.dc0 是一个使用 dc(4) 驱动的网卡)中. 它也可以包含一个域名 (通过 /etc/hosts 指定) 以替代一个IP地址。

● 机器名包含在文件 /etc/myname 中。

● 默认网关在文件 /etc/mygate 中。

● OpenBSD的默认使用的shell是 /bin/ksh, 也就是pdksh, the Public Domain Korn shell. 其它可使 用的shell还包含csh和sh. Shells诸如bash和tcsh可以通过packages或ports安装。如果您熟悉 bash, 我们鼓励在安装bash前使用 ksh(1)——多数人喜欢使用 bash。

● 密码管理有别于其它的类Unix系统。密码实际储存在master.passwd(5)文件中, 仅有root可以

http://www.9971.us/OpenBSD4.5/c/faq9.html(第 2/5 页)2009-5-3 23:02:04 OpenBSD 4.5 FAQ中文版 第九章 - 转到 OpenBSD 读取。它只能通过vipw程序来修改。

● 设备不是通过类型而是以驱动来命名。例如:没有eth*设备, 而是以ne0命名NE2000以太网卡, 以xl0命名3Com Etherlink XL或者Fast Etherlink XL Ethernet等。所有这些设备的命名可以在用 户手册的第四章找到, 所以如果要找3c905的驱动, 您可以运行"man 4 xl"。

● OpenBSD/i386, amd64还有一些其它平台有"两层"分区, 第一层分区使用fdisk, 大多数使用IBM 兼容机的用户熟悉这个BIOS可见分区。第二层分区使用disklabel, 这是传统BSD分区。 OpenBSD在一块硬盘上可以使用15个disklabel分区, 这使OpenBSD可以与其它的操作系统共 存于一块硬盘, 这也包括其他类Unix系统, OpenBSD必须使用四个主分区中的一个。 ● 其它的操作系统鼓励用户修改系统内核, 而我们鼓励用户使用经过严格测试提供的标准系 统内核GENERIC, 用户"定制"或"优化"系统往往可能破坏系统的稳定性, 我们也不对这种做 法提供技术上的支持。 ● OpenBSD项目十分重视应用程序的使用许可和安全性, 因为这个原因一些软件的新版本不 能整合在系统内。我们永远不会因为考虑更高版本的软件而放弃安全和自由使用的原则。

9.2 - Linux和OpenBSD双启动

没错! 完全可能!

请参看 INSTALL.linux.

9.3 - 将您的Linux(或者其它第六版样式)密码文件转换成BSD格式

首先, 必须确认您的Linux密码是否是经过shadow, 如果是, 您需要安装packages or ports里的John the Ripper, 用它的自带的unshadow工具将您的密码和shadow文件组合成一个 Sixth Edition-style文件。

使用您的Linux密码文件, 我们这里暂且称之为linux_passwd, 您需要用 awk(1) 在field 4于7之间加 入 ::0:0 。

# cat linux_passwd | awk -F : '{printf("%s:%s:%s:%s::0:0:%s:%s:%s\n", \ > $1, $2, $3, $4, $5, $6, $7); }' > new_passwd

这里您需要编辑您的新密码文件, 删除已经在OpenBSD密码文件中提供了的或和OpenBSD系统有 冲突的root或其他系统选项(所有的), 并确保这个linux密码文件中的username和user IDs不会与 OpenBSD的系统的 /etc/passwd文件有重复, 最好的方式是新建一个/etc/passwd文件:

# cat new_passwd >> /etc/master.passwd # pwd_mkdb -p /etc/master.passwd

http://www.9971.us/OpenBSD4.5/c/faq9.html(第 3/5 页)2009-5-3 23:02:04 OpenBSD 4.5 FAQ中文版 第九章 - 转到 OpenBSD 最后是需要用 pwd_mkdb 重新建立 /etc/spwd.db 和 /etc/pwd.db 文件。它还产生一个第六版样式的 密码文件(减去加密的密码)/etc/passwd供程序使用。OpenBSD使用强壮的blowfish方式进行加密, 它 不同于任何使用第六版样式加密的系统。任何用户只需键入'passwd'就可以用这种加密方式更改密 码, 您输入的新密码将采用默认方式加密(除非您修改了 /etc/login.conf 文件, 否则, 一般是用blowfish 算法)。还有, 作为root, 您也可以用运行passwd username 。

9.4 - 在OpenBSD中运行Linux程序包

如果在编译内核时开启了 COMPAT_LINUX 选项, 并且运行时设置了 sysctl kern.emul.linux 您就可 以运行Linux二进制软件包。如果您使用一个标准内核(您应该使用它)COMPAT_LINUX 选项默认 就是开启的, 您只需:

# sysctl kern.emul.linux=1

如果想每次系统启动后自动开启这个选项您需要去掉/etc/sysctl.conf文件中的下行前面的 "#" (注释 符):

# kern.emul.linux=1 # enable running Linux binarie

修改后像这样

kern.emul.linux=1 # enable running Linux binarie

重新启动系统后就可以生效了

如果您需要运行非静态链接的Linux程序包(大多数), 您需要参考用户手册中有关 compat_linux(8) 的说明。

安装所需Linux libraries的最简单的办法就是从FTP上获得并安装fedora/base package。想了解更多 packages和ports的知识清参阅FAQ 15 - OpenBSD的packages和ports系统, 安装如上所述的软件包您需 要运行:

# export PKG_PATH=ftp://your.ftp.mirror/pub/OpenBSD/4.5/packages/i386/ # pkg_add -i fedora_base

注意:pkg_add(1)在安装软件时会自动执行sysctl将kern.emul.linux设置成正确值, 然而它不修改 /etc/ sysctl.conf 文件, 所以如果您需要默认启动Linux模拟, 您必须自己将 /etc/sysctl.conf 里的 kern.emul.

http://www.9971.us/OpenBSD4.5/c/faq9.html(第 4/5 页)2009-5-3 23:02:04 OpenBSD 4.5 FAQ中文版 第九章 - 转到 OpenBSD linux 设置成1。

9.5 - 在OpenBSD中访问Linux文件

OpenBSD 支持 EXT2FS 文件系统。更多信息请参阅FAQ 14.

[索引] [第八章 - 常见问题] [第十章 - 系统管理]

[email protected] $OpenBSD: faq9.html, v 1.91 2008/10/31 16:52:30 nick Exp $

http://www.9971.us/OpenBSD4.5/c/faq9.html(第 5/5 页)2009-5-3 23:02:04 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

[索引] [第九章 - 转到OpenBSD] [第十一章 - X Window 系统]

10 - 系统管理

目录

● 10.1 - 为什么我想su到root时说我在错误的组中。

● 10.2 - 如何复制文件系统?

● 10.3 - 我怎样让程序随系统启动?(概述rc(8))。

● 10.4 - 为什么OpenBSD拒绝远程用户的转发请求?

● 10.5 - 我已经设置了POP服务器, 但我访问POP时怎么会有错误信息?

● 10.6 - 为什么Sendmail忽略/etc/hosts?

● 10.7 - 使用SSL(8)配置安全的HTTP服务器。

● 10.8 - 我使用vi(1)修改了/etc/passwd, 为什么不起作用?

● 10.9 - 如何增加或者删除用户?

● 10.10 - 如何创建只能访问ftp的账号?

● 10.11 - 配置用户的磁盘限额。

● 10.12 - 配置 KerberosV 客户端和服务器

● 10.13 - 配置匿名FTP服务器

● 10.14 - 在ftpd(8)中限制用户只能访问自己的目录。

● 10.15 - 在OpenBSD中安装补丁。

● 10.16 - 告诉我chroot(2)的Apachee?

● 10.17 - 我可以更改root的shell吗?

● 10.18 - 我用 ksh还能做什么?

● 10.19 - 目录服务

❍ 10.19.1 - 可以提供那种目录服务?

❍ 10.19.2 - YP安全注意事项

❍ 10.19.3 - 建立一个YP服务器

❍ 10.19.4 - 建立一个YP客户端

10.1 - 为什么我想su到root时说我在错误的组中?

已经存在的用户必须手动添加到 "wheel"组中, 这是因为安全的原因, 您应该谨慎地赋予某个用户这项权限。在OpenBSD 中wheel组的成员可以使用su(1)命令变成root, 而非wheel 组的用户无法使用su命令, 这里有一个例子, 修改/etc/wheel文件 就可以将用户9971添加到"wheel"组。

如果您使用adduser(8)新添加一个用户, 您可以在系统询问"Invite user into other groups:"时将这个用户添加到wheel组, 系统 会修改您的/etc/group文件, 看起来就像这样:

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 1/23 页)2009-5-3 23:02:13 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

wheel:*:0:root, 9971

如果您仅想给用户有限的root权限但不想将他加入"wheel"组, 请使用 sudo(8) 命令。

10.2 - 如何复制文件系统?

复制文件系统使用 dump(8) 和 restore(8) 命令, 例如复制目录 SRC 下的所有文件到目录 DST:

# cd /SRC; dump 0f - . | (cd /DST; restore -rf - )

设计dump是为了给您提供丰富的备份功能, 如果您只想复制一个目录或它的一部分的使用 tar(1) 可能会快一些。这个 命令您可能很熟悉:

# cd /SRC; tar cf - . | (cd /DST; tar xpf - )

10.3 - 我怎样让程序随系统启动?(概述rc(8))

OpenBSD使用 rc(8) 模式控制启动, 它是用一系列关键文件来控制启动过程。

● /etc/rc - 主脚本。不应该修改。 ● /etc/rc.conf - 配制主脚本 /etc/rc 使用的程序, 用来确认可以那些程序随系统启动。 ● /etc/rc.conf.local - 用来修改您在 /etc/rc.conf 中程序的设置, 这样您无需修改 /etc/rc.conf 就可以很方便地进行系统 升级。 ● /etc/netstart - 用来初始化网络的脚本。不应修改。 ● /etc/rc.local - 本地管理员使用的脚本。 它用来存在特定的新后台程序或主机。 ● /etc/rc.securelevel - 这个脚本指定那些必须在系统安全级别更改前运行的命令。 参看 init(8)

● /etc/rc.shutdown - 关机脚本。您可以把关机前需要执行的程序或命令放在这个脚本里面。 参看 rc.shutdown(8) rc(8)怎样工作?

系统管理员的需配置的主要文件集中在 /etc/rc.conf (或者 /etc/rc.conf.local ), /etc/rc.local 和 /etc/rc.shutdown 想了解 rc(8) 的工作模式, 看下面:

系统内核启动后, 开始执行 /etc/rc :

● 检查文件系统。 ● 先从/etc/rc.conf读取变量的设置, 然后读取 /etc/rc.conf.local 的设置。rc.conf.local 会覆盖 rc.conf 的指定值。 ● 挂载文件系统。 ● 清除 /tmp 目录并保留所有编辑过的文件。 ● 通过 /etc/netstart 配制网络 ❍ 配制网络接口。 ❍ 配制主机名, 域名等。 ● 启动系统后台程序。 ● 检查并执行其余变量(quotas, savecore, etc) ● 参照 /etc/rc.local 运行本地后台程序。

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 2/23 页)2009-5-3 23:02:13 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

运行OpenBSD自带的后台程序及服务

大多数系统自带的程序或服务可以通过修改 /etc/rc.conf 配置文件随系统启动。我们先看一下 /etc/rc.conf 文件。您会看 到像这行:

ftpd_flags=NO # for non-inetd use: ftpd_flags="-D"

您会看到ftpd没有随系统启动(至少不是通过rc(8)启动的, 更多的信息请参看 Anonymous FTP FAQ。)。所有行的后面全 有一个注释告诉您如何正确运行这些后台程序或服务。但是这并非说您必须使用这些注释的参数来运行程序或服务, 您可以参照这些后台程序或服务的用户手册, 用您需要的模式运行它们。例如, http(8)有一些附属的参数:

httpd_flags=NO # for normal use: "" (or "-DSSL" after reading ssl(8))

显然您看见了您可以不需要加任何参数来运行http(8), 也就是设置成: " httpd_flags=""" 。但是如果您想启用ssl支持(参考 SSL 用户手册或者 ssl(8) )您就要像这样:"httpd_flags="-DSSL""设定http的启动方式。

一个好建议是永远不要改动 /etc/rc.conf 文件, 而应该创建一个 /etc/rc.conf.local 文件, 将您在 /etc/rc.conf 文件里的需要改 动的程序设定复制到这个文件里进行修改。这样会使今后的升级过程更加顺利——所有的用户设定全在一个文件里。

启动和配置本地后台程序

对那些拟通过packages或别的途径安装的用户程序包来说, 您需要使用 /etc/rc.local 文件, 例如, 我安装一个了程序位于 / usr/local/sbin/daemonx 目录。我想让它随系统启动。需要在 /etc/rc.local 文件里加入一些内容, 想这样:

if [ -x /usr/local/sbin/daemonx ]; then echo -n ' daemonx'; /usr/local/sbin/daemonx fi

(如果这个程序没有随系统启动, 别忘了在命令行后面加上"&"。)

现在开始, 这个程序daemonx会随系统启动。您也许会看到一些错误提示, 如果没有错误, 程序启动后系统会显示一行内 容像这样:

Starting local daemons: daemonx. rc.shutdown

/etc/rc.shutdown 是一个关机脚本。把您需要在关机前需要运行的任务全放在这个脚本里。如果您有apm, 您也可以使用 "powerdown=YES"命令, 它等同于 "shutdown -p"命令。

10.4 为什么OpenBSD拒绝远程用户的转发请求?

试试这样:

# grep relay-domains /etc/mail/sendmail.cf

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 3/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

屏幕输出可能像这样:

FR-o /etc/mail/relay-domain

如果没有这个文件, 您需要创建它。 您需要在这个文件中按下面的语法设定发送邮件的远程主机:

.domain.com #允许转发的主机域名domain.com。 sub.domain.com #允许转发的主机子域名sub.domain.com, 以及所有允许转发的属于domain.com的子域。 10.2 #在IP段10.2.*.*允许所有转发。

别忘记发送 'HangUP'信号给sendmail (这个信号可以让大多数后台运行的程序重新读取它们的配置文件):

# kill -HUP `head -1 /var/run/sendmail.pid`

更多信息请参看

● http://www.sendmail.org/~ca/email/relayingdenied.html

● http://www.sendmail.org/tips/relaying.php

● http://www.sendmail.org/antispam/

10.5 - 我已经设置了POP服务器, 但我访问POP时怎么会有错误信息?

多数引起POP出问题的原因是临时文件和锁定文件。如果您的POP服务器发送了一条错误信息:

-ERR Couldn't open temporary file, do you own it?

尝试这样设定一下您的许可权限:

permission in /var drwxrwxr-x 2 bin mail 512 May 26 20:08 mail

permissions in /var/mail -rw------1 username username 0 May 26 20:08 username

另外需要检查的是用户是否具有自己的 /var/mail 文件的所有权。 您可能会说当然是这种情况了(例如 /var/mail/joe 的所 有者应该是joe), 但是如果没有正确的设定就会引起这样的问题!

当然, 开启邮件用户组对 /var/mail 的写权限可能会引起一些未知的含混的安全问题。如果您不开起就不会出问题吗?实 际上也会有安全问题!(特别是您有一个引人注目的网站、ISP等.....), 您可以从ports树中选择几种POP服务程序, 您也可以 使用OpenBSD系统默认安装时已经带的popa3d, 或者您保留您POP的错误设定(像dot locking), 或者您改变您的锁定目录 (尽管这些锁定仅对POP程序有效。)

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 4/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

说明: OpenBSD并不存在一个"mail"用户组, 如果您需要可以在 /etc/group 文件中创建它。加上一行像这样:

mail:*:6:

回答的很充分了吧。

10.6 - 为什么Sendmail忽略/etc/hosts?

默认情况下, Sendmail使用DNS进行域名解析而不是使用 /etc/hosts 文件。 您可以通过修改 /etc/mail/service.switch 文件进 行设定。

如果您想让sendmail优先使用 /etc/hosts 文件进行域名解析, 您需要创建一个 /etc/mail/service.switch 文件, 让它包含下面的 一行:

hosts files dns

如果您只想让sendmail使用hosts 文件查询, 这样写:

hosts files

发给sendmail 一个HUP信号:

kill -HUP `head -1 /var/run/sendmail.pid`

这些设定就会起作用了。

10.7 - 使用SSL(8)配置安全的HTTP服务器

OpenBSD提供了一个SSL功能的httpd以及RSA库。为了使用httpd(8) 您必须先先创建证书。它会保存在/etc/ssl/ 下的相应 关键字/etc/ssl/private/目录里。下面的步骤摘自ssl(8)的用户手册, 更多的信息请直接参考手册。本FAQ仅涉及了如何为 web服务器生成一个RSA证书, 如何生成DSA证书请参考ssl(8)的用户手册。

首先, 您需要创建您的server key并使用OpenSSL进行认证:

# openssl genrsa -out /etc/ssl/private/server.key 1024

或者, 您想让这个key有一个加密短语, 您需要在服务启动时输入

# openssl genrsa -des3 -out /etc/ssl/private/server.key 1024

下面用来生成证书的签发请求以便获得认证机构(CA)签署的证书, 用如下命令:

# openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 5/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

这个server.csr文件可以提交给那些可以颁发key的认证权威机构。例如, CA就是一个Thawte认证机构, 您可以在http:// www.thawte.com/上找到。

如果您无法获得key, 或者您想自己进行认证, 您可以是用下面的命令:

# openssl x509 -req -days 365 -in /etc/ssl/private/server.csr \ -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

如果存在/etc/ssl/server.crt 和 /etc/ssl/private/server.key 这两个文件, 您就可以让httpd(8)使用 -DSSL 标签 (请参看 section about rc(8) ), 别忘了打开您的机器的443端口。

10.8 - 我使用vi(1)修改了/etc/passwd, 为什么不起作用?

如果您直接修改 /etc/passwd 文件, 您的修改不会生效。OpenBSD用pwd_mkdb(8)动态的生成/etc/passwd 密码文件。 OpenBSD的密码文件是 /etc/master.passwd 。参考pwd_mkdb(8),

FILES /etc/master.passwd current password file /etc/passwd a 6th Edition-style password file /etc/pwd.db insecure password database file /etc/pwd.db.tmp temporary file /etc/spwd.db secure password database file /etc/spwd.db.tmp temporary file

传统的Unix中, 任何使用该系统的人都可以接触诸如/etc/passwd等密码文件(而这正是破解程序的首要攻击目标)。从 BSD4.4开始引入了master.passwd文件, 这个文件采用一种扩展格式(提供了超越/etc/passwd密码文件的加密选项), 并且只 有root用户可以读取。为了更快地存取数据, 库文件通常通过读取/etc/pwd.db 和 /etc/spwd.db调用这个数据。

OpenBSD的确提供了一个工具 vipw(8) 来修改您的密码文件, 它用vi(您也可以通过定义per $EDITOR来选择您喜欢的编 辑器)来编辑 /etc/master.passwd 文件。当您每次编辑完成后, vipw 会重新生成 /etc/passwd、/etc/pwd.db 和 /etc/spwd.db 文 件。Vipw还负责锁定这些密码文件, 所以如果任何人想同时修改这些文件, 他们将会被拒绝访问。

10.9 - 如何增加或者删除用户?

OpenBSD提供两个工具可以轻松地为系统添加用户:

● adduser(8)

● user(8)

您也可以使用vipw(8)来手动添加用户, 但是操作起来很麻烦。

在OpenBSD中最简单的添加用户方法是使用adduser(8) 脚本。您可以通过编辑 /etc/adduser.conf 文件配制 adduser(8) 脚 本, adduser(8) 可以一致性检验 /etc/passwd、/etc/group 和shell数据库, 它将生成用户的通行证和 $HOME 目录, 甚至可以 发送一条欢迎信息给用户, 本例中我们为系统添加一个测试用户testuser, 他/她的 $HOME 目录为 /home/testuser , 属于 guest组, 并且使用的shell是 /bin/ksh 。

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 6/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

# adduser Use option ``-silent'' if you don't want to see all warnings and questions.

Reading /etc/shells Reading /etc/login.conf Check /etc/master.passwd Check /etc/group

Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username []: testuser Enter full name []: Test FAQ User Enter shell csh ksh nologin sh [sh]: ksh Uid [1002]: Enter Login group testuser [testuser]: guest Login group is ``guest''. Invite testuser into other groups: guest no [no]: no Login class auth-defaults auth-ftp-defaults daemon default staff [default]: Enter Enter password []: Type password, then Enter Enter password again []: Type password, then Enter Name: testuser Password: **** Fullname: Test FAQ User Uid: 1002 Gid: 31 (guest) Groups: guest Login Class: default HOME: /home/testuser Shell: /bin/ksh OK? (y/n) [y]: y Added user ``testuser'' Copy files from /etc/skel to /home/testuser Add another user? (y/n) [y]: n Goodbye!

删除用户您应使用rmuser(8)命令, 它可以删除该用户的所有文档。 它会删除该用户所有的crontab(1)条目、$HOME 目 录(如果它属于该用户)、该用户的邮件。 当然它也会删除该用户的 /etc/passwd 和 /etc/group 条目。下面的例子我们删 除上例中新添加的用户。注意系统会提示您输入用户名, 还有是否删除该用户的home目录。

# rmuser Enter login name for user to remove: testuser Matching password entry:

testuser:$2a$07$ZWnBOsbqMJ.ducQBfsTKUe3PL97Ve1AHWJ0A4uLamniLNXLeYrEie:1002 :31::0:0:Test FAQ User:/home/testuser:/bin/ksh

Is this the entry you wish to remove? y Remove user's home directory (/home/testuser)? y Updating password file, updating databases, done. Updating group file: done.

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 7/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

Removing user's home directory (/home/testuser): done.

使用user(8)系列命令添加用户

这些命令没有像adduser(8)命令那样使用脚本可以提供许多交互式输入。

全套命令有:

● group(8)

● groupadd(8)

● groupdel(8)

● groupinfo(8)

● groupmod(8)

● user(8)

● useradd(8)

● userdel(8)

● userinfo(8)

● usermod(8)

实际添加用户 user(8)并非采用交互方式添加用户, 最简单有效的添加用户方法是使用adduser(8)命令。 实际使用的命令 /usr/sbin/user 仅是所有 /usr/sbin/user* 命令的一个前缀命令。所以, 添加用户时您可以使用 user add 或者 useradd, 您随便选择使用哪一 个全有同样的功效。

在这个例子中, 我们添加一个与上例中具有相同特性的用户。 如果您在添加用户前熟悉了默认设定, useradd(8)还是方便 得多。这些设定在文件 /etc/usermgmt.conf 里, 您可以用下面的方法显示它们:

$ user add -D group users base_dir /home skel_dir /etc/skel shell /bin/csh inactive 0 expire Null (unset) range 1000..60000

除非您用命令行进行更改否则上面的这些默认设定值将赋予新用。例如在这个例子中, 我们想把这用户设定在guest组 而不是users组。 还有一个需要处理的就是在命令行手动设置密码, 这是一个经过加密处理的的密码, 所以您必须先用 encrypt(1)命令创建它, 例如: OpenBSDd的默认加密密码是经过6次海豚算法生成的, 下面的例子为useradd(8)产生一个经 过加密的密码。

$ encrypt -p -b 6 Enter string: $2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2. uRJZXUkOghbieIvSWXVJRzlq

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 8/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

现在我么已经有了加密的密码, 我们为用户添加这个密码。

# user add -p '$2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq' -u 1002 \ -s /bin/ksh -c "Test FAQ User" -m -g guest testuser

说明: 别忘了为密码字串加上 ' ' (单引号), 而不是 " " (双引号), 因为shell会在发送给user(8)之前要先解释它。 如果您要创 建用户的home目录和将 /etc/skel 下的文件复制过去需要使用 -m 选项。

可以使用下面的命令检查用户是否被正确地添加了:

$ ls -la /home total 14 drwxr-xr-x 5 root wheel 512 May 12 14:29 . drwxr-xr-x 15 root wheel 512 Apr 25 20:52 .. drwxr-xr-x 24 9971 wheel 2560 May 12 13:38 9971 drwxr-xr-x 2 testuser guest 512 May 12 14:28 testuser $ id testuser uid=1002(testuser) gid=31(guest) groups=31(guest) $ finger testuser Login: testuser Name: Test FAQ User Directory: /home/testuser Shell: /bin/ksh Last login Sat Apr 22 16:05 (EDT) on ttyC2 No Mail. No Plan.

除了这些命令, user(8)还提供了自己的查看用户信息用命令 userinfo(8)。

$ userinfo testuser login testuser passwd * uid 1002 groups guest change Wed Dec 31 19:00:00 1999 class gecos Test FAQ User dir /home/testuser shell /bin/ksh expire Wed Dec 31 19:00:00 1999

删除用户

使用user(8)系列命令中的userdel(8), 即使您没有使用过也会觉得很简单。 例如删除上例中的用户:

# userdel -r testuser

如果您希望同时删除用户的home目录这里必须使用 -r 选项。 如果您只想锁定用户帐号但不删除任何用户文件, 那么这 里就不用 -r 选项而使用 -p 选项。

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 9/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

10.10 - 如何创建只能访问ftp的账号 (非匿名账号!)?

有几种方法, 但是最常用的方法是把诸如 "/usr/bin/false" 加入到 "/etc/shells"中, 然后您把ftp用户的shell设置成 "/usr/bin/ false", 他们可以使用ftp功能但不能用交互式的方式登陆系统。您您可能还需要将他们限制在自己的home目录内以限制 对其余的目录的访问。

10.11 - 配置用户的磁盘限额

磁盘限额用来限制用户在硬盘上占用的空间。在您的硬盘较小时这个功能很有用。可以对用户或组进行限制。

配制磁盘限额首先您需要确认Kernel Configuration里有"option QUOTA", 标准内核里已经包含了这个选项。然后您需要 在/etc/fstab里做标注以便启用磁盘限额功能。您需要使用关键字userquota 和 groupquota为每个需要限制的分区作磁盘 限额标注。默认情况在限制分区的根目录下会产生quota.user 和 quota.group这两个文件, 它们保存了该分区的磁盘限额 信息。您也可以通过修改/etc/fstab的参数设定以其它文件作为作为磁盘限额配置文件, 例如 "userquota=/var/quotas/quota. user"。下面的例子中/etc/fstab启用了一个分区的磁盘限额, 但是磁盘限额配置文件不在默认的位置:

/dev/wd0a / ffs rw, userquota=/var/quotas/quota.user 1 1

现在我们使用edquota(8)命令设定用户的磁盘限额, 简单的用法就是 "edquota "。如果默认编辑器没有被修改 edquota(8)会使用vi(1)来编辑磁盘限额。例如:

# edquota 9971

您的屏幕输出像这样:

Quotas for user 9971: /: KBytes in use: 62, limits (soft = 0, hard = 0) inodes in use: 25, limits (soft = 0, hard = 0)

要进行限制, 编辑它, 比如:

Quotas for user 9971: /: KBytes in use: 62, limits (soft = 1000, hard = 1050) inodes in use: 25, limits (soft = 0, hard = 0)

注意限额配置以1K为单位。这个例子中我们设定softlimit为1000k, hardlimit为1050k。这里softlimit的意思是:当用户占用 的磁盘空间超过这个设定值系统会在一个宽限期内给出警告信息直至用户占用的磁盘空间小于softlimit的设定值, 宽限 期可以使用edquota(8)的 -t 选项进行设定。一旦超过了宽限期系统会按用户的hardlimit来处理softlimit, 这会导致用户的 分配磁盘无法继续使用。

现在磁盘限额已经设定, 您需要起用它。使用quotaon(8)命令:

# quotaon -a

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 10/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

它将通过/etc/fstab启用分区的磁盘配额选项。现在我们已经启用了磁盘限额, 您可以通过quota(1)命令查看磁盘限额情 况。使用命令"quota " 可以查看该用户的磁盘限额情况。如果您没有对quota添加参数, 它会提供您的磁盘限额统 计。例如:

# quota 9971

屏幕输出像这样:

Disk quotas for user 9971 (uid 1001): Filesystem blocks quota limit grace files quota limit grace / 62 1000 1050 27 0 0

默认情况下 /etc/fstab 设定的磁盘限额会在系统启动时生效。如果您想关闭它使用;

# quotaoff -aa

10.12 - 配置 KerberosV 客户端和服务器

KerberosV作为系统组件已经预安装在OpenBSD系统内。

想了解更多有关KerberosV的信息, 键入如下命令:

# info heimdal

10.13 - 配置匿名FTP服务器

匿名FTP允许用户通过FTP协议匿名访问您计算机上的文件。这里概述怎样建立匿名服务器和设定、日志等。

添加FTP账号

首先, 您需要在系统上添加一个ftp账号, 这个帐号没有有效的密码。我们设定登陆后的目录为 /home/ftp , 您也可以放到 任何您喜欢的地方。当使用匿名FTP服务时, FTP程序将会将用户ftp限定在他的home目录里, 请参阅ftpd(8) 和 chroot(2) 的用户手册。这个例子中我们用adduser(8)命令添加用户ftp, 我们也需要将/usr/bin/false 加入到 /etc/shells 中, 用户ftp的登 陆属性会被设置为/usr/bin/false , 也就是不允许他登陆系统, 尽管用户ftp有一个空密码。您只需:

# echo /usr/bin/false >> /etc/shells

然后我们来添加用户ftp了:

# adduser Use option ``-silent'' if you don't want to see all warnings and questions.

Reading /etc/shells

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 11/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

Reading /etc/login.conf Check /etc/master.passwd Check /etc/group

Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username []: ftp Enter full name []: anonymous ftp Enter shell csh false ksh nologin sh tcsh zsh [sh]: false Uid [1002]: Enter Login group ftp [ftp]: Enter Login group is ``ftp''. Invite ftp into other groups: guest no [no]: no Login class auth-defaults auth-ftp-defaults daemon default staff [default]: Enter Enter password []: Enter Set the password so that user cannot logon? (y/n) [n]: y

Name: ftp Password: **** Fullname: anonymous ftp Uid: 1002 Gid: 1002 (ftp) Groups: ftp Login Class: default HOME: /home/ftp Shell: /usr/bin/false OK? (y/n) [y]: y Added user ``ftp'' Copy files from /etc/skel to /home/ftp Add another user? (y/n) [y]: n Goodbye!

建立目录

建立用户ftp时我们已经为它设置了自己的根目录/home/ftp, 但是对匿名FTP来说我们还要更改一些设置, 再提醒一下您 应该参看ftpd(8)的用户手册。

您不需要建立 /home/ftp/usr 或者 /home/ftp/bin 目录。

● /home/ftp - 这是FTP的主目录。它应该属于root, 权限是555。 ● /home/ftp/etc - 这是可选项, 不推荐, 因为它仅为本机的用户提供服务, 如果您希望您的FTP目录看起来像本机用户 可以真正访问计算机上的文件, 您需要复制/etc/pwd.db 和 /etc/groupas 文件到这个目录下。这个目录的权限应该 是511, 并且这两个文件的权限应该是444, 它们用来提供用户的名字而非数字, pwd.db里并没有储存真正的用户密 码, 密码全储存在spwd.db文件内, 所以别把sped.db文件复制过来。 ● /home/ftp/pub - 这是一个标准目录, 用来存放您的共享的文件, 这个目录的权限也应该设置成555。

注意, 所有的目录全应该属于''root''. 您设置后的目录清单应该像这样。

# pwd /home

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 12/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

# ls -laR ftp total 5 dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 . drwxr-xr-x 7 root wheel 512 Jul 6 10:58 .. dr-x--x--x 2 root ftp 512 Jul 6 11:34 etc dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 pub

ftp/etc: total 43 dr-x--x--x 2 root ftp 512 Jul 6 11:34 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 .. -r--r--r-- 1 root ftp 316 Jul 6 11:34 group -r--r--r-- 1 root ftp 40960 Jul 6 11:34 pwd.db

ftp/pub: total 2 dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 ..

启动服务和登陆

您可以选择用inetd(8) 或从 rc 脚本启动FTP服务器. 本例使用inetd.conf文件启动FTP。首先我们必须熟悉一下ftpd的参 数。在 /etc/inetd.conf 中默认的FTP设定如下:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US

这里ftpd的默认启动参数是 -US, 它将登陆信息记录在/var/log/ftpd, 并发连接数记录在/var/run/utmp。您使用who(1)命令 查看连接数。可能因为一些原因, 您不想让本机用户登陆而只运行一个匿名FTP, 这样您就需要使用 -A 选项。下面的一 行仅允许匿名登陆。它还是使用了 -ll 选项, 目的是在syslog内纪录每一次连接的信息, 命令get, retrieve等ftp命令的使用情 况。

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -llUSA

注意: 如果您的FTP服务器流量很大, 您不应该使用inetd.conf启动FTP服务器, 最好的方法是注视掉inetd.conf中的ftpd语 句, 而使用rc.conf.local文件中的 ftpd_flag设置, 并添加上-D选项, 这样FTP服务器会以后台方式运行在系统上, 比从inetd启 动节省很多资源。下面是从rc.conf.local启动FTP服务器的例子:

ftpd_flags="-DllUSA" # for non-inetd use: ftpd_flags="-D"

当然, 如果您已经设置了用/etc/inetd.conf 启动FTP服务器, 您需要注视掉/etc/inetd.conf内的FTP服务器设定, 并让inetd重新 读取自己的配置文件。

其他相关文件

● /etc/ftpwelcome - 为用户首次访问FTP时显示的欢迎信息。

● /etc/motd - 登陆成功后显示的信息。

● .message - 可以在任何一个目录中放置一个.message文件, 用户首次进入此目录时会显示这个文件的内容。

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 13/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理 10.14 - 在ftpd(8)中限制用户只能访问自己的目录

默认情况下, 用户登陆后可以访问系统的任何目录, 一些情况下我们不希望这样, 我们可以将用户限制(chroot)在自己的 目录内。

如果您只允许被chrooted(仅能访问自己的目录)的用户登陆, 需要使用ftpd(8)的-A 选项。

如果您想对这些用户友善一些也很简单, 请参阅 login capability infrastructure 和 ftpd(8)。

添加用户时将 Login class 设置成 ftp-chroot , 系统就会自动chroot这个用户。另外您可以把用户名添加到/etc/ftpchroot里 从而chroot这些用户。这两个方法中的任何一个全可以chroot用户。

10.15 - 在OpenBSD中安装补丁

即使是OpenBSD也同样存在bug, 一些bug导致系统可靠性问题(例如, 一些问题会导致系统丧失一些功能), 另一些bug则 使系统产生安全漏洞(其他人可以"使用"您的电脑)。当发现一个危险的bug后, 开发者会修改当前版的源代码树, 会发行 针对所支持的各种版本的补丁文件。这些补丁文件在罗列在勘误表上, 有的补丁可能是针对所有平台的, 有的则是针对 一个或几个平台但不是所有平台。

注意, 这些补丁程序不会为系统添加新功能, 并且仅在系统发现重大的安全或可靠性漏洞必须马上修补时才会发布补丁 (并非针对所有的系统, 取决于补丁的目的)。

有三种方式用补丁代码更新您的系统:

● 将您的系统升级到 -current. 所有的已知漏洞全在当前版-current源代码上进行了更正, 使用最新的快照版是一个好 的捷径。 然而, 并非所有的人全适合运行-current 版。 ● 将您的系统更新到 -stable. 获取补丁程序, 更新源代码树, 使用适当的稳定版本, 重新编译系统内核及用户文件。如 果您的带宽较小, 效验所有源代码需要花费很长的时间, 而且重新编译所有源代码同样花费大量的时间, 但总体上 这是最简单的方式。 ● 获取补丁, 编译, 安装补丁. 我们下面的例子中会采用这种方式. 尽管这个方式仅需要很小的带宽, 也不需要花费大 量的时间通过CVS效验、更新整个代码树及也不需要编译、安装新内核, 但是莫俄些时候这种方式是最难的, 因 为每个系统情况不同, 没有人知道会发生什么, 有时您仅下载、编译、安装一个程序就可以了, 有时可能因为一个 库文件, 您不得不重新下载、更新、编译整个源代码树。

在强调一下, 第三种方法并非总是最简单的, 认真考虑一下是否更新到-stable (也称为"补丁") 分支的OpenBSD. 如果您掌 握要领也可以混合使用这些方式, 但是新用户往往选择其中的一个方式, 并总是使用它。

勘误表上的补丁不同于CVS树是怎么回事?

所有勘误表上列出的补丁直接对应CVS上的特定版本。与CVS树对应的补丁也许您的系统并不需要。这点很重要;如 果您安装了一个快照版, 在安装完成后效验您的源代码并且安装一个公布的补丁, 您可能发现无法应用补丁程序, 因为源 代码已经变化了。

应用补丁。

OpenBSD系统的补丁发放采用"Unifed diffs"形式, 它们是字符各式的源代码。补丁不采用二进制格式发放。这意味着您 如果要应用补丁必须有发行版的源代码文件。通常您可以得到这些文件。如果您购买了官方的CDROM, 这些源代码文 件在第三张CD上, 您也可以通过FTP服务器下载这些源代码文件。这里假设您已经效验了源代码树。

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 14/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

我们下面这个例子将对OpenBSD 3.6应用patch 001, 处理磁带机st(4)驱动问题, 没有这个补丁从备份中恢复系统是相当困 难的。 使用磁带机的用户需要这个补丁, 然而如果您不使用磁带机就不需要安装这个补丁。我们看看应用补丁的过程:

# more 001_st.patch Apply by doing: cd /usr/src patch -p0 < 001_st.patch

Rebuild your kernel.

Index: sys/scsi/st.c ======RCS file: /cvs/src/sys/scsi/st.c, v retrieving revision 1.41 retrieving revision 1.41.2.1 diff -u -p -r1.41 -r1.41.2.1 --- sys/scsi/st.c 1 Aug 2004 23:01:06 -0000 1.41 +++ sys/scsi/st.c 2 Nov 2004 01:05:50 -0000 1.41.2.1 @@ -1815, 7 +1815, 7 @@ st_interpret_sense(xs) u_int8_t skey = sense->flags & SSD_KEY; int32_t info;

- if (((sense->flags & SDEV_OPEN) == 0) || + if (((sc_link->flags & SDEV_OPEN) == 0) || (serr != 0x70 && serr != 0x71)) return (EJUSTRETURN); /* let the generic code handle it */

如您所见, 补丁文件的头部包含了应用补丁的简单介绍。我们假设您已经将补丁复制到了 /usr/src 目录, 这种情况下, 后 续步骤是:

# cd /usr/src # patch -p0 < 001_st.patch Hmm... Looks like a unified diff to me... The text leading up to this was: ------|Apply by doing: | cd /usr/src | patch -p0 < 001_st.patch | |Rebuild your kernel. | |Index: sys/scsi/st.c |======|RCS file: /cvs/src/sys/scsi/st.c, v |retrieving revision 1.41 |retrieving revision 1.41.2.1 |diff -u -p -r1.41 -r1.41.2.1 |--- sys/scsi/st.c 1 Aug 2004 23:01:06 -0000 1.41 |+++ sys/scsi/st.c 2 Nov 2004 01:05:50 -0000 1.41.2.1 ------

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 15/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

Patching file sys/scsi/st.c using Plan A... Hunk #1 succeeded at 1815. <-- 注意这条信息! done

请注意上面的"Hunk #1 succeeded" 信息. 它说明补丁应用成功。许多补丁比这个复杂得多, 会包含很多的hunks 和文件, 这种情况下您需要确认所有文件的hunk全是succeeded(成功)的, 如果不是则说明您的源代码有问题, 您没有仔细参照使 用说明进行操作, 或者您的补丁是有缺陷的。 补丁对"空格"很敏感, ——您在浏览器上拷贝和粘贴时可能会把tab字符带 进补丁文件里, 或者改变了文件中的空格, 这种情况会导致补丁无法应用。

如果应用补丁成功, 这是您可以正常地构建系统内核, 安装新内核并重新启动系统。

并非所有的补丁全对内核进行了修改, 有些时候您只需重新编译单独的程序;另一些时候您可能需要重新编译所有静 态链接到该补丁程序的库文件。请参照补丁头部的说明进行, 如果您不确定只能编译整个源代码。

通常情况下如果补丁不是针对您的系统, 您可以不安装。例如, 您没有磁带机, 您就不需安装上面的补丁。然而, 补丁认 为自己是"按顺序"安装的 -- 很有可能后面的补丁依赖于前面的一个补丁。 请注意这一点, 如果您选择了其中的一个补 丁, 自己也不清楚是否需要安装其余的补丁, 那请按顺序全部安装这些补丁。

10.16 - 告诉我chroot(2)的Apachee?

在OpenBSD里, Apache httpd(8) 服务器默认已经被chroot(2)ed。 大大提高了系统的安全性能, 如果您没有做好准备, 这可 是一个很严重的安全问题。

什么是chroot?

一个被chroot(2)的程序会被锁定在一个特定的目录内, 而不能进入其余目录, 并且这个特定的目录就是这个程序 的"/"(root)根目录。在这种情况下httpd(8)首先启动、打开自己的log文件、绑定在它的TCP端口(尽管还没有开始接收数 据)、读取它的配置文件、然后放弃权力把自己锁定在 /var/www 目录内、最后开始接受请求。这意味着所有Apache的 服务文件及使用的文件必须全在 /var/www 目录内。在OpenBSD中Apache的用户是www, 用户www只能访问 /var/www 目 录内的文件, 并且这个目录内的所有文件对用户www 来说全是只读的。这样对安全有极大的帮助——这是Apache的一 个严重的安全问题, 可能破坏仅限于一个"只读"的 /var/www 目录, 并且没有其余的资源会因此受到牵连。

这对管理员来说意味着什么?

直截了当地说, 多数其它操作系统默认并没有chroot Apache, 如果用户没有进行设定, 许多应用程序和系统配置并没有工 作在chroot的环境中。此外, 不要忘记安全和方便常常是一对矛盾的目标, 在OpenBSD上运行Apache不会因为考虑功能 性或"方便性"而忽视安全。

● 以往的文件系统布局: 经历过数次从OpenBSD系统升级后可能会有web文件在用户的目录内, 它们在chroot环境下 显然不能正常工作, 因为httpd(8)不能访问 /home 目录。管理员也许会发现/var/www目录太小, 不能容纳所有的 web文件。您的选择可能是重新规划web目录或放弃使用chroot(2)功能, 您当然可以在用户目录中使用符号链 (Symbolic links)指向 /var/www 子目录, 但是您不能在 /var/www 目录内使用链接指向其余的地方——chroot功能会 禁止您这样做。注意如果您想让用户使用chroot(2)的FTP 访问, 也不会成功, 因为FTP chroot同样会禁止用户访问 这符号链指向的外部目标。解决这个问题的一个办法是不要将 /home 目录设定为这些用户的 home 目录, 您可以 把这些用户的 home 目录设定为 /var/www/users。符号链可以完全在chroot环境下使用, 但这是相对的, 不是绝对

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 16/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

的。 ● 日志轮替: 实现日志轮替一般先重新命名旧文件, 然后给http(8)发送一个SIGUSR1信号, 它让Apache关闭老的日志 文件打开一个新的。但这时是不可能的, 因为一旦http(8)放弃了权限就无法打开并写入一个新的日志文件。http (8)必须先被停止然后再被重新启动, 有时候停止所有子进程会花上数秒, 所有子进程停止运行后http(8)才可能被 重新启动, 下面的方法可以进行日志轮替:

# apachectl stop 重新命名您的日志文件...... # apachectl start ; sleep 10 ; apachectl start

是的, 最后一行是想立即启动Apache, 如果失败了它会等待几秒钟, 然后继续尝试。 没错, 这意味着每次进行日志 轮替时您的web服务器会失效几秒钟。 对, 这的确让人烦闷, 任何让http(8)在chroot后重新打开文件的行为全可能 破坏chroot的重要作用!还有一些其它的办法, 包括登陆到一个pipe(2), 并在另一端的pipe(2上使用外部日志轮替。

● 现有的 Apache 模块: 所有的Apache模块几乎全可以加载, 但是有些可能在chroot(2)环境中无法正常工作, 并且 在"apachectl restart"时很多模块会有问题, 并造成一个错误导致http(8)退出。

● 现有的 CGIs: 多数不能正常的工作, 它们可能需要 /var/www 外的程序或苦文件, 有些可通过重新编译成静态链接 进行修正(不再需要外部目录的库文件), 大多数可以通过将需要的外部文件复制到 /var/www 目录解决这个问题, 尽管这个工作不简单并且还需要对程序有一定的了解。 ● 文件系统的挂载选项: 默认情况下, OpenBSD的 /var 分区挂载时选项设定为nosuid 和 nodev。如果您想在chroot环 境中使用一个程序, 您可能需要改变这些选项。 当然, 可能即使您不用chroot功能也同样需要改变这些选项才能 使程序正常运行。 ● 域名解析: httpd(8)在chroot环境中不能使用系统的 /etc/hosts 或 /etc/resolv.conf 文件。因此, 如果您有程序需要域名 解析, 您必须将/var/www/etc/hosts 和或者或 /var/www/etc/resolv.conf 复制到chroot环境中, 注意有些程序需要 "localhost"解析来工作。

有些情况下您可以通过修改程序或配置文件使它可以工作在chroot环境中, 而另一些情况下您不得不在/etc/rc.conf中为 httpd(8)加上 -u 选项关闭chroot功能。 chroot软件wwwcount的例子

这是让一个程序在chroot环境下工作的例子, 我们选择wwwcount, 这是一个简单的网页计数器, 可以通过packages获得。 wwwcount是一个很有用的程序, 这个程序并未非为chroot进行了专门的设计, 默认情况下不能工作在chroot环境下。

首先, 我们安装 wwwcount package。我们配置并测试它, 发现它不能正常工作在chroot环境中, Apache显示一条信 息"Internal Server Error", 首先我们先停止Apache, 再以 -u 选项重新启动它, 这样做的目的是确认wwwcount不能正常工作 的原因是chroot而非其它的系统配置原因。

# apachectl stop /usr/sbin/apachectl stop: httpd stopped # httpd -u

完成上述步骤后, 我们发现计数器工作正常, 至少说明了是在我们改变了一个目录的所有权后Apache (和CGIs——现在 可以正常运行了) 可以将所持内容写入一些文件。由此我们可以推断出是chroot引起wwwcount无法正常工作, 所以我们 接下来停止并重新以默认的chroot方式启动Apache:

# apachectl stop /usr/sbin/apachectl stop: httpd stopped

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 17/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

# httpd

一个比较好的假设是 wwwcount 需要使用一些没放在chroot环境中的库和其它文件。我们使用ldd(1)命令找出CGI所依 赖的动态目标文件:

# cd /var/www/cgi-bin/ # ldd Count.cgi Count.cgi: Start End Type Ref Name 00000000 00000000 exe 1 Count.cgi 03791000 237ca000 rlib 1 /usr/lib/libc.so.30.3 03db4000 03db4000 rtld 1 /usr/libexec/ld.so

好了, 这正是问题所在, 有两个需要的文件没有在chroot(2)环境中。所以我们把它们拷贝过来:

# mkdir -p /var/www/usr/lib /var/www/usr/libexec # cp /usr/lib/libc.so.30.3 /var/www/usr/lib # cp /usr/libexec/ld.so /var/www/usr/libexec

让我们再试试这个计数器程序。

不错, 至少程序已经可以运行了, 但是直接给出了一条错误信息: "Unable to open config file for reading", 看来我们的工作还 需要完善。配置文件正常情况下应该在 /var/www/wwwcount/conf, 但是chroot环境下它似乎应该在 /wwwcount/conf , 我们 可以选择重新修改并编译程序让它在可以运行的地方工作, 或者我们移动一下它的数据库文件, 因为我们是从package安 装的, 所以我们还是只移动数据库文件好了。为了使程序在chroot或非chroot环境下全可以工作, 我们使用一个符号链:

# mkdir -p /var/www/var/www # d /var/www/var/wwwc # ln -s ../../wwwcount wwwcount

请注意这个符号链是为工作在chroot环境下加上的。我们再测试一下, 结果又发现了新问题, 现在wwwcount抱怨说找不 到 "strip image"文件, 它需要用这些文件显示信息。经过搜寻我们发现这些 "strip image"文件位于 /usr/local/lib/wwwcount , 所以我们同样再将这些文件拷贝过来。

# tar cf - /usr/local/lib/wwwcount | (cd /var/www; tar xpf - )

我们再试试... 终于它可以正常工作了!

请注意, 这里我们仅拷贝了哪些wwwcount运行必需的文件。通常情况下您应该把最少的文件拷贝进chroot环境中。(译 者注:这句话的意思是如果程序可以正常工作不拷贝最好, 否则尽量少拷贝, 实在没办法再...... , 应该是考虑了安全方面的 因素。)

我应该使用chroot功能吗?

上例中的wwwcount程序很简单, 但我们还是遇到了各种问题。

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 18/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

并非所有程序全可以或者应该运行在chroot环境中。

在这里chroot的目的是保证web server的安全, chroot 仅仅是实现这个目的的一种工具而已, chroot本身并不是目的。请记 住, chroot的Apache服务器的安全前提是您没有运行其它不明程序, 没有改变任何文件, 没有其他用户可以改动系统;如 果这些前提不成立, 您的系统无论是chroot与否都不安全。 chroot有的程序很简单, 这样做还有意义;但是其余的很复杂, 要么不值得花费精力chroot它们, 要么需要将很多系统文 件拷贝进chroot环境, 实际上这样做已经没有chroot的意义了, 例如, OpenWebMail需要在mail目录进行读写操作, 这个目 录也是用户的home目录, 而且必须允许任何用户读写这个目录OpenMail才能正常工作, 如果要强行将它塞进chroot环境 内是毫无意义的, 最后相当于您禁用了chroot的全部安全功能。即使是一个像上面wwwcount那样简单的程序, 它也需要 对磁盘进行写操作(纪录其统计次数), 也已经丧失了一部分chroot的安全特性。

将任何需要root权限运行的程序放进chroot环境内是毫无意义的, 因为作为root可以轻松摆脱chroot的束缚。

别忘记, 如果您费了九牛二虎之力才把一个程序塞进chroot环境, 那您就别像平时一样没事就upgrade或update一下您的系 统, 因为这样的折腾不仅不会使您的系统更容易维护, 而且可能导致chroot功能失效, 使系统的安全性能降低。

10.17 - 我可以更改root的shell吗?

有时候人们会说永远不要改变root的shell, 尽管这在OpenBSD中并没有理由不这样做。

OpenBSD中root的默认shell是 ksh。

传统的Unix原则上仅让root使用静态编译的shell, 因为系统进入单用户模式时, 非root分区不会被挂载并且动态连接的 shell不能读取/usr分区下的库文件。这对OpenBSD来说不是什么大问题, 因为进入单用户模式时系统会询问您使用哪种 shell, 并且默认就是sh。OpenBSD系统内三个标准shell(csh, sh 和 ksh)全是静态连接的, 它们全能正常工作在单用户模式 下。

10.18 - 我用ksh还能做什么?

OpenBSD中, ksh 就是 pdksh, the Public Domain Korn Shell, 和sh一样全是二进制的。

更喜欢在Linux下使用 bash 的用户会觉得 ksh 很熟悉, Ksh(1)提供了多数 bash 的通用功能, 包括tab完成、命令行编辑、箭 头键浏览历史纪录以及CTRL-A/CTRL-E 光标跳到命令行首尾等。如果还有其它的 bash 功能吸引您, 您可以通过 packages或ports来安装。

通过设定 PS1 变量您可以方便地修改 ksh 的命令行提示符的内容, 让它显示更多的信息而不是默认的 "$ "。例如, 在 /etc/ profile 文件内加入下面这行:

export PS1='$PWD $ '

提示符会变成如下的样子:

>/home/nick $

请参阅文件 /etc/ksh.kshrc, 它包含了很多特性和范例, 您也许可以打造一个自己的 .profile 风格。

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 19/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

OpenBSD中 ksh(1) 为基本提示符PS1增加了一些"特殊的字符" , 就像在bash中使用的那些。例如

\e - 插入一个ASCII码的转义字符。 \h - 主机名称, 减域名。 \H - 主机完整名称, 包含域名。 \n - 插入一行新字符。 \t - 当前时间, 24小时格式, 小时:分钟:秒。 \u - 当前用户名。 \w - 当前工作目录. $HOME 简化为 `~'。 \W - 当前工作目录的 basename 。 \$ - root显示 "#" , 非root显示 "$" 。

(还有很多特殊的字符!请参阅 ksh(1) 的用户手册以获得更多信息, 还需要注意双引号内的 "$" 字符具有特殊的含义, 请小 心使用。)

有人也许喜欢用下面这样的的提示符:

export PS1="\n\u@\H\n\w \\$ "

提供了十分详细的信息, 但是只有一些您用得到。

10.19 - 目录服务

OpenBSD可以在包含用户凭据、组信息、或其它网络相关的数据库中作为服务器或客户端。

10.19.1 - 可以提供哪种目录服务?

当然你可以在OpenBSD里面使用各式各样的目录服务, 但是只有YP可以直接访问使用诸如 getpwent(3), getgrent(3), gethostbyname(3) 等标准C库文件, 因此, 如果你的数据包存在一个 YP 数据库内, 例如系统用户鉴别, 你不需要事先将将它 拷贝到本地的配置文件如 master.passwd(5) 就可以直接使用它。

YP是一个兼容NISNIS (Network Information System网络信息系统)的目录服务。 请参阅 yp(8) 的用户手册以便对它有总体 的了解。 需要注意的是, 以西操作系统包含的目录服务具有相似的名称, 但是但是它们全与OpenBSD系统不兼容, 例如 NIS+。

如果要使用YP以外的目录服务, 你不是需要在本地设置配置文件就是需要将YP作为目录的前台服务。 例如, 你可以使 用 sysutils或者login_ldap构架的port, 但同时你必须运行 ypldap(8) 进程。

对一些应用程序来说, 你可以简单地使用 cron(8), scp(1) 在一组计算机内同步一小部分配置文件或者用rsync(可以通过 ports安装)构建一个简单强劲的稳定数据库。

10.19.2 - YP安全注意事项

由于兼容性的原因, 默认情况下YP执行时所有OpenBSD内置的安全特性全是关闭的。 即使这些安全特性全部开启, NIS 协议也存在两个固有的不安全因素: 包括敏感的密码哈希值在内的所有数据全是以不加密的方式在网络中传送, 并且客 户端和服务器都不能彼此进行可靠的验证。

因此, 在建立一个YP服务器前, 你需要考虑一下在你的环境中是否允许这些不安全因素。 特别是潜在的攻击可能直接访 问你的网络时使用YP并不合适。 任何一台可以连接到YP通讯传送所在网段的计算机如果root密码泄漏, 可能导致非法

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 20/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

用户连接到你的YP域并重新获得所需数据。 在某些情况下, 通过SSL或IPSec通道传送YP数据可能是一个不错的选择, 或 者你应该考虑结合YP与kerberos(8)认证的组合。

10.19.3 - 建立一个YP服务器

一个YP服务器在一个"域"内为一组客户端提供服务。 你首先需要选择一个域名称; 它可以是任意的字符串但必须不能 和DNS域名有任何关联。 随机选择一个名称例如"Eepoo5vi"可以稍微提高一点安全, 尽管作用不明显。 当你需要维护几 个不同的YP域时, 最好用有意义的名称命名域例如"sales", "marketing" 和 "research" 以免因命名含义不清造成管理混乱。 还需要注意的是一些版本的SunOS需要使用主机的域名, 所以在这样主机所在的网络内选择域名称可能会受到限制。

1. 使用 domainname(1) 工具可以设定域名 , 并将这个域名写入文件 defaultdomain(5) 内以便让系统启动时自动对其 设置。

echo "puffynet" > /etc/defaultdomain domainname `cat /etc/defaultdomain`

2. 确定在哪里储存原始文件以生成YP映射, 默认位置 /etc 并不合适: 通常, 你不需要将所有的帐号的组保存在服务器 或所有的客户端主机上, 尤其是不能提供root帐号, 将root的密码哈希保存在可靠的地方对提高系统的安全性很重 要。 改变源目录会造成的唯一不便就是你不能用user(8)和group(8)工具添加、删除、修改YP域内的用户和组, 而 只能用一个文本编辑器编辑配置文件来完成这些操作。

要定义定义源目录, 编辑文件 /var/yp/Makefile.yp 来更改里面的 DIR 变量, 例如

DIR=/etc/yp/src/puffynet

如果所有的客户端全运行的是OpenBSD或者FreeBSD, 通过设置 UNSECURE="" in /var/yp/Makefile.yp 在密码映射 中排除加密的密码。

在系统安装时一个备份的原始Makefile.yp模板保存在 /var/yp/Makefile.yp.dist , 如果你想恢复到一个普通配置时可 以使用它。 3. 创建原目录并用配置文件设置它你需要参阅 Makefile.yp(8) 以便学习哪种YP映射需要哪种源文件, 每个配置文件 的格式请参考 passwd(5), group(5), hosts(5) 等, 并请参考 /etc 中的例子。 4. 初始化 YP 服务器使用交互式命令

ypinit -m

这时还不需要指定从属服务器。 你可以稍后运行 ypinit(8) 加上 -u 选项来增加从属服务器。 每个域应该至少建 立一个从属服务器, 这样即使主服务器宕机或无法连通也可以有效的避免服务中断, 特别是当客户端程序试图访 问YP映射时可能发生无限期阻塞(等待)直到其获得请求的数据。 因此, YP服务中断会使客户机完全无法使用直 到YP服务器恢复正常。

注意运行 ypinit -m 后对 /var/yp/Makefile.yp 的修改不会起作用, 因为 ypinit -m 将模板拷贝到 /var/yp/`domainname`/ Makefile 文件, 尽管多数位于/var/yp/`domainname`的数据库文件可以用这个新的 Makefile 简单重建, 但有一个例外: 文件 ypservers.db, 它列出了此域内主服务器和所有从属服务器, 它是直接由 ypinit -m 创建, 并且只能通过 ypinit -u 进行修改。 所以要特别小心, 不要损坏此文件, 否则你需要手动使用makedbm(8)重新产生它, 或者重新运行 ypinit -m 再安装server。 5. YP 使用 rpc(3) (远程程序调用) 来与客户端通话, 因此必须启用 portmap(8), 启用portmap需要编辑 rc.conf.local(8) 然后设置 portmap=YES。 这样会在下次系统启动后启动 portmapper 。 你也可以不重新启动系统手动启用它:

echo "portmap=YES" >> /etc/rc.conf.local

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 21/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

portmap

6. 考虑使用YP服务器进程的 securenet(5) 或者 ypserv.acl(5) 的安全特性时请注意, 这两者都只提供了基于IP的访问控 制, 因此, 它们只能在潜在的攻击者不能物理接触传送YP数据的网段才能提供安全保障, 而且攻击者不能拥有任何 可连接到该网段的计算机的root密码。 7. 最后, 启动 YP 服务器进程:

ypserv

只要 /var/yp/`domainname` 存在, YP 服务器将在下次系统启动后启动。 8. 测试新服务器, 可以将其作为自己的客户端, 参照下一小节第一部分的说明。 如果不想让服务器使用它自己的映 射你可以在测试后使用如下命令禁用客户端部分:

pkill ypbind rm -rf /var/yp/binding

9. 如果你允许用户在客户端上更改他们的密码, 你必须启用 yppasswdd(8):

echo 'yppasswdd_flags="-d /etc/yp/src/puffynet"' >> /etc/rc.conf.local rpc.yppasswdd

如果你想将原始目录保留在默认的 /etc, 仅需使用 yppasswdd_flags="". 10. 记住每次你通过YP映射改变一个文件的源时你都需要重新生成你的YP映射。

cd /var/yp make

10.19.4 - 建立一个YP客户端

建立一个YP客户端包括两个不同的步骤。 首先, 你必须先运行YP客户端进程, 将你的客户端主机绑定到一台YP服务器 上。 完全按照下列步骤将允许你从YP服务器重新获得数据, 但是这个数据还不能被系统使用:

1. 像在服务器上一样, 你必须设置域名称并且启用 portmapper:

echo "puffynet" > /etc/defaultdomain domainname `cat /etc/defaultdomain` echo "portmap=YES" >> /etc/rc.conf.local portmap

2. 推荐的做法是在配置文件 /etc/yp/`domainname` 内提供一个YP服务器的清单, 否则YP客户端会会使用网络广播来 查询自己域内的YP服务器。 明确地指定服务器既可以使服务更可靠还可以减少被攻击的可能性。 如果你没有 设置从属服务器, 仅需将服务器的host name写入 /etc/yp/`domainname`. 3. YP客户端进程是 ypbind(8). 要手动启动它需要建立目录 /var/yp/binding, 这样下次启动后YP客户端会自动启动。

ypbind

4. 如果一切进展顺利你就可以使用 ypcat(1) 向YP服务器查询并看到你的passwd映射被返回。

ypcat passwd bob:*:5001:5000:Bob Nuggets:/home/bob:/usr/local/bin/zsh

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 22/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十章 - 系统管理

...

还有一些可用的YP设置调试工具, 例如 ypmatch(1) 和 yptest(8).

配置YP客户端的第二个步骤包括为不同系统编辑特定的YP映射配置文件。 并非所有的服务器都提供操作系统支持的 标准映射, 一些服务器还提供额外的非标准映射, 这并非要强迫你使用这些非标准映射, 客户端管理员可自己选择应该使 用哪些映射或者因何使用这些映射。

Makefile.yp(8).里包含了一个标准映射的清单和其标准用法。 通常的使用情况包括:

● 如果你想包含YP域内的所有用户帐号, 附加YP标记到主密码文件并且重建密码数据库:

echo '+:*::::::::' >> /etc/master.passwd pwd_mkdb /etc/master.passwd

有关选择包含或排除用户帐号的细节请参阅 passwd(5)。要测试是否正常包含了帐号可以使用 id(1) 工具。

● 如果你想包含YP服务器内所有的组, 附加默认的YP标记到组文件:

echo '+:*::' >> /etc/group

有关包含组的详细信息请参阅 group(5).

● 如果你通过YP分配hostname, 你现在应该复习一下 resolv.conf(5) 并且检查一下域名服务查询顺序是否正确。 多数 用户需要像下面的这一行:

lookup file yp bind

[索引] [第九章 - 转到OpenBSD] [第十一章 - X Window 系统]

[email protected] $OpenBSD: faq10.html, v 1.140 2008/11/12 02:59:41 nick Exp $

http://www.9971.us/OpenBSD4.5/c/faq10.html(第 23/23 页)2009-5-3 23:02:14 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

[索引]第十章 - 系统管理] [第十二章 - 硬件和特定平台问题]

11 - X Window 系统

目录

● 11.1 - 介绍 X

● 11.2 - 配置 X

● 11.3 - 在amd64 和 i386上配置X

● 11.4 - 启动 X

● 11.5 - 定制 X

11.1 - 介绍 X

X Window系统(有时简称为"X", 其余时间被错误地称为"X Windows")是一个提供给OpenBSD和其它 类Unix系统的图形服务环境。然而, 就X本身来说仅提供了有限的功能:其中一个也是必需的 是"Window 管理器", 用来提供一个用户接口。很多有"个性"的人感觉X就是Window 管理器而不是X 本身。OpenBSD配送一个免费版本的 fvwm(1) Windos管理器的, 可能您喜欢使用packages中的一些其 它版本的Window 管理器, 搜索关键字 "window manager"可以得到许多 "window manager"。

X是一个被设计为"客户端-服务器"结构的协议, 但有时这个术语容易让人迷惑。在屏幕上输出图形 的计算机是"X Server"(服务器), 直接指挥X server让它在自己的屏幕上显示内容的是"X Client"(客户 端), 尽管它可能是数据中心的一台非常强劲的计算机。这种模型可以用于让具有巨型的、处理器密 集型的应用程序(X clients)运行在一台非常强劲的计算机上, 用X server运行在您桌面上一个小型的、 低性能的计算机上作为用户界面。

有可能让X clients运行在一个没有任何图形支持的系统上。例如, 一个人可能在mvme88k运行一个应 用 ( X client) , 而显示则输出到一台 alpha's 的图形显示器上 (X server)。因为X是一个定义明确的, 跨 平台的协议, 它甚至有可能在一个(比如)Solaris平台上运行而用一台OpenBSD的机器显示。

X的客户端和服务器还可以运行在用一台计算机上, 并且我们假设本章的的大部分内容就是这种情 况。

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 1/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

11.1.1 - 我需要多少台计算机才能运行X?

X本身是一个很巨型的程序, 如果您需要定期启动和关闭X, 一台快速的计算机更合适。然而在最现 代的计算机上一旦X开始运行它的性能还是很好的。要让一些平台具有良好的显示性能, 即使仅是 显示字符, 可能您也想在这些平台上运行X, 这样的平台像 sparc 和 sparc64被设计成使用图形界面, 而 它们在控制台使用字符界面时性能低得可怜。

据说, 运行X的要点是运行X应用程序。有些X的应用程序很精巧, 其它的则看起来几乎可以用尽您能 提供的所有处理器和内存。当然, 也有用户就喜欢使用X来提供大量的xterm(1), 这在最现代的硬件 上完全没有问题。

11.1.2 - 如果没有X我能某些显示图形吗?

这里假设您说的不是ASCII graphics, 显示图形需要某种帧缓冲控制台驱动, 一些操作系统提供这个驱 动, 当时当前的OpenBSD没有提供它, 开发人员对此也无兴趣。

11.2 - 配置 X

在各种平台上配置X有很大的区别。总的来说, 一个已经安装OpenBSD的系统在 /usr/X11R6/ README 里有该平台和其它平台的安装指南。

有几个平台需要 xf86(4) X aperture 驱动, 它可以提供X servers所需的访问内存、VGA显卡I/O端口和 PCI配置寄存器的功能。这个驱动必须在使用前激活。要么在安装过程中回答下列问题时选择 "yes"

Do you expect to run the X window System [no]yes

要么在 /etc/sysctl.conf 文件中将machdep.allowaperture设置为适合您平台的非0数值, 并且重新启动计 算机(在启动完成后sysctl因为安全原因不能被修改)。这个设定牵扯安全问题, 所以如果您不需要配 置 X 就不要改动它。

(译者注:上段的原文在下面, 我怀疑括号内的内容为笔误, 其中的after是否应该改为until;欢迎指 正!) or by changing the value of machdep.allowaperture to the appropriate non-zero value in /etc/sysctl.conf for your platform, and rebooting the machine (this sysctl cannot be changed after boot has been completed for security reasons). There are security implications to this, so do not do this if you do not need it.

11.2.1 - alpha

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 2/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统 /usr/X11R6/README 文件是针对alpha平台的。

设置 /etc/sysctl.conf 文件内的 machdep.allowaperture=1

支持TGA和VGA显卡, 不需要设置更多参数。

11.2.2 - amd64

/usr/X11R6/README 是针对amd64平台的说明文件。

设置/etc/sysctl.conf 文件内的 machdep.allowaperture=2

在amd64平台上X的自动配置就非常理想, 多数情况下不需要更多的设置。如果还需要其它设置请使 用下面的 X -configure 步骤。

11.2.3 - armish

没有X servers, 只有 X clients.

11.2.4 - hp300

/usr/X11R6/README 是hp300的说明。

11.2.5 - hppa

没有 X server, 仅有 X clients.

11.2.6 - i386

/usr/X11R6/README 是i386平台的说明。

在 /etc/sysctl.conf 中设置 machdep.allowaperture=2

在i386平台上因为有令人难以置信的众多各种各样的视频卡、鼠标、键盘及其它硬件设备, 所以在 i386系统上运行X是令人兴奋的, 兴奋到我们需要分成单独一小节进行描述。

幸运的是, 事情并非总是看起来那样坏——多数情况下, 只需输入 "startx" 命令 X 就可以工作了。这 种情况下, 您的硬件已经经过了检测和性能查询, 并且X也会正常的工作。

11.2.7 - landisk

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 3/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

没有 X servers, 仅有 X clients.

11.2.8 - luna88k

没有 X servers, 仅有 X clients.

11.2.9 - mac68k

没有 X servers, 仅有 X clients.

11.2.10 - macppc

/usr/X11R6/README 是macppc的说明。

在 /etc/sysctl.conf 中设定 machdep.allowaperture=2

被支持的Macintosh PPC 系统可以以两种方式运行:"加速模式"和"帧缓冲"(非加速模式)

在"帧缓冲"模式时, 系统将以每像素8 bits的方式运行, 并且由Macintosh环境控制视频分辨率, 所以您 可能想在磁盘上保留一小部分MacOS section用来调整设定。这种模式的优点是肯定可以正常工作, 但有时也可能令人沮丧(例如, 改变分辨率需要启动MACOS)。

如果您的Macintosh有一个基于ATI的视频系统, 它就可以在加速模式下运行 X server, 它提供了更好 的性能以及更丰富的OpenBSD环境控制。某些具有NVIDIA显卡的macppc系统也可以采用加速模 式。README文件详细叙述了怎样配置加速驱动, 您可以从它的示例文件着手。

虽然README文件里详细叙述了在X中使用Apple单键鼠标, 不过除非您使用一台笔记本电脑, 我们 建议您还是买一个现在的三键USB鼠标。

11.2.11 - mvme68k

没有 X servers, 仅 X clients.

11.2.12 - mvme88k

没有 X servers, 仅 X clients.

11.2.13 - sgi

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 4/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统 没有 X servers, 仅 X clients.

11.2.14 - sparc

/usr/X11R6/README 是sparc的说明。

如果仅是单纯地运行在帧缓冲模式, 不需要任何配置。如果您需要multi-headed配置, 请参阅上面的 说明文件。

分辨率在启动OpenBSD前由固件控制。

11.2.15 - sparc64

/usr/X11R6/README 是sparc64的说明。.

这款机型有不同的型号, 您需要确认您的系统总线(PCI 或 SBus)、鼠标的接口 (zstty, com, 或 USB/ PS2)以及显卡的种类。从README中的示例文件xorg.conf着手, 然后根据您的实际情况进行调整。 被指望示例文件不用修改就可以应用在您的机器上!

11.2.16 - vax

/usr/X11R6/README 是vax的说明。

X server目前仅能工作在一台具有lcg(4) 或 lcspx(4) 帧缓冲功能的VAXstation 4000型计算机上。

11.2.17 - zaurus

/usr/X11R6/README 是zaurus的说明.

不用配置 X 就可以工作。

11.3 - 在 amd64 和 i386上配置 X

在amd64 和 i386平台上因为有大量不同的硬件使配置X的过程很"棘手"。

11.3.1 - 配置 X.Org

X.Org在可用性方面有重大的改进。很多情况下即使没有 /etc/X11/xorg.conf 文件它也可以正常的工

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 5/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

作。但不总是这样, 有时后您需要配置一下它才可以正常工作, 不管怎么说, 有两个程序可以半自动 的为X.Org的 i386 X server产生一个配置文件。遗憾的是这两个程序全不能保证产生可用的 xorg.conf 文件。

● Xorg(1) 运行在"X -configure"模式下, 它会装载所有可能的显卡驱动型号, 探测其它硬件并基于 其发现的硬件写出一个xorg.conf文件, 有时这个文件可以正常工作, 有时不行。但是尽管不能 正常工作, 相对白手起家式配置来说它毕竟是一个好的开端。 ● xorgconfig 另一个程序, 采用交互式生成xorg.conf文件, 是一个基于纯字符的应用程序。

除了上面的两个程序, 这里还有一个配置 X 的历史悠久方法就是用您喜欢的搜索引擎在互联网上寻 找已经解决了同样问题的那个人, 虽然这个方法不赖, 但我们就不在这里着重说明了。

11.3.2 - 我们的示例计算机

为了示范创建X, 我们使用一台旧的赛扬400MHz系统, 它有一个AGP的视频插槽, 视频显示卡式一个 老的AGP卡, 从dmesg可以看:

vga1 at pci1 dev 0 function 0 "3DFX Interactive Banshee" rev 0x03

这块显卡以前属于高端显卡, 有16M RAM, 但是现在已经不被最新的"主流"操作系统支持了。系统采 用的监视器是一台Sony Multiscan G400 19" CRT监视器, 它可以很好的运行在1280x1024的分辨率上, 具有非常好的刷新率及24bit的颜色质量。

首先, 安装OpenBSD与X后(并且确认内核已经激活了aperture驱动), 我们来看一下X.Org的自动检测 和配置过程, 最终, 也许我们会成功。我们现在登陆系统并用 startx(1) 命令启动X, 屏幕会先黑一会 儿, 然后进入"checkerboard"背景, 出现"X"光标, 最后是xtrem窗口。

它可以正常工作!

或多或少, X系统的功能完全正常, 只是看起来没有丝毫没有利用监视器的能力, 因为它运行在一个 较低的分辨率下(640x480), 我们希望它可以在更高的分辨率下工作, 事实上这已经好多了, 但这意味 着无论如何我们需要自己调整我们的xorg.conf文件。

我们开始先使用"X -configure"命令生成一个xorg.conf文件, 您需要以root的身份进行如下操作:

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 6/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

# X -configure [...] Your xorg.conf file is /root/xorg.conf.new

To test the server, run 'X -config /root/xorg.conf.new'

顺便说一下, 这个屏幕输出信息很严谨——虽然生成的文件位于默认的当前目录下, 但是屏幕信息 还是用绝对路径描述了xorg.conf文件的位置。如果不使用绝对路径可能会导致在 X(7) 无法找到这 个新配置文件, 也就意味着 X(7) 会默默地采用系统默认的配置文件, 而不会理睬您刚生成的配置文 件, 这会拖延您解决问题的进度, 这点请相信我们。

我们按照屏幕提示操作, 看看会发生什么:

# X -config /root/xorg.conf.new

现在, 咦?我们看见了一个全黑的屏幕, 刚开始配置居然就如此"顺利"......

这种情况下我们正好讨论一下怎样退出X, 按优先顺序排列:

● CTRL-ALT-Backspace: 这个功能十分有用, 它会让X和所有与之相关的X程序马上终止。当然 在目前的配置阶段也没有任何X的应用程序运行, 所以这不是一个问题(事实上, 目前阶段用此 方法是退出X的最佳方案。) ● 用SSH方式登陆进这台计算机, 然后 "pkill Xorg", 它可以终止 X 进程, 而且还可以将您带回一个 可用的控制台。 ● 用SSH方式登陆进这台计算机 然后重新启动它。 ● 按下计算机的Reset或power开关, 有些时候事情会变得真的非常糟糕。是这样的, 在您准备在 机器上部署重要应用前调整好X是很必要的。有时候, 一个有问题的配置文件会导致整个系 统停止工作, 这各时候您只有通过强行按下计算机的Reset或power开关才能解决这个问题。

我们还挺幸运, CTRL-ALT-Backspace 就终止了X, 现在我们又回到了命令行提示符。所以现在我们要 看一下可否处理这个错误, 首先, 我们应该看一下X是怎样工作的, 它记录在 /var/log/Xorg.0.log 文件 内。本例中, log文件显示一切工作正常, 没有明显的错误(以"(EE)" 开头的行表示有错误)。

现在是了解您硬件的时候了, 反正您迟早要这样做。将这台计算机接上一台不同的监视器, 结果还 是黑屏并在屏幕上显示了一条信息"Sync. Out of Range"(超出同步范围).所以, 很显然, 目前X的配置无 法工作在这台监视器上, 而且可能不适合所有的监视器, 如果X选择的显示模式超出了显卡的显示范 围(请记住, X 仅仅是通过查看显示卡上的芯片组和判断显卡的潜在能力来设定显示模式的, 但是它 不能像制造商那样了解所有细节)。错误的配置在不同的监视器上会导致不同的结果, 有的监视器会 用可能的方式显示, 有的则会进入节电模式, 有的会产生可怕的噪点, 有的会产生一些有用的提示信 息, 但是我们使用的这台监视器似乎不是上述任何一种的情况, 产生的信息似乎对以后在这台监视

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 7/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统 器上初始化X没有一点作用。

通过查看生成的 xorg.conf.new 文件, 我们看到:

Section "Monitor" #DisplaySize 370 270 # mm Identifier "Monitor0" VendorName "SNY" ModelName "SONY CPD-G400" ### Comment all HorizSync and VertSync values to use DDC: HorizSync 30.0 - 107.0 VertRefresh 48.0 - 120.0 Option "DPMS" EndSection

作为测试, 我们尝试一下DDC("Data Display Channel"数据显示通道, 通过这种方式监视器可以告诉计 算机和显卡它的显示能力), 看看会发生什么。这次我们看见了X的网状图案以及移动的光标, 正像 我们调用X时期待的那样(我们再用CTRL-ALT-Backspace关闭X)。这次虽然分辨率很低, 但是好歹可 以工作了, 所以我们可以确认是刷新率和分辨率的问题。我们将文件中"HorizSync" 和 "VertRefresh"这两行的内容复原, 因为我们已经通过在一些互联网上的搜索确认了这台监视器的规 格。

我们强制Xorg使用一个指定的分辨率, 再看看我们的运气如何。在xorg.conf文件中的 "Screen" 这一小 段, 我们加上了用黄色字体显示的两行, 如下所示:

Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 1 EndSubSection SubSection "Display" Viewport 0 0 Depth 4 EndSubSection SubSection "Display" Viewport 0 0 Depth 8 EndSubSection

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 8/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

SubSection "Display" Viewport 0 0 Depth 15 EndSubSection SubSection "Display" Viewport 0 0 Depth 16 EndSubSection SubSection "Display" Viewport 0 0 Depth 24 Modes "1280x1024" EndSubSection EndSection

新加的两行告诉X我们想使用24位的显示深度, 并且使用1280x1024的分辨率。因为在24位深度上没 有其它的分辨率可选, 系统会强制使用这个分辨率。

我们测试上面的配置, 然后...... 成功了!系统在高分辨看起来很完美。注意我们目前所有的期待 就是一个网格图案(它看起来相当好, 具体多好要看您的监视器质量和LCD的校准程度, 被称为"root weave")和一个可移动的光标, 目前阶段我们暂且不考虑 X 的功能问题。

现在, 我们来安装这个xorg配置文件, 看看运行X时它到底工作地多好.

# cp xorg.conf.new /etc/X11/xorg.conf

我们使用常规的startx(1)命令启动 X, 它可以工作!

校验我们希望的分辨率和颜色深度和刷新速率也许是一个很好的工作。我们可以使用 xrandr(1) 和 xdpyinfo(1) 命令, 除了其它信息, xdpyinfo(1) 告诉我们:

[...] screen #0: print screen: no dimensions: 1280x1024 pixels (433x347 millimeters) resolution: 75x75 dots per inch depths (7): 24, 1, 4, 8, 15, 16, 32 root window id: 0x44 depth of root window: 24 planes [...]

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 9/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

所以, 我们确认X运行在分辨率1280x1024以及24位深度下。 xrandr(4) 告诉我们:

SZ: Pixels Physical Refresh *0 1280 x 1024 ( 433mm x 347mm ) *85 75 60 1 1280 x 960 ( 433mm x 347mm ) 85 60 [...]

系统运行在85Hz的刷新速率上, 这个刷新速率对多数用户来说很舒适。

11.3.3 - 如果没这样"简单"怎么办?

有时, 一些因素难以协调一致, 这里有一些提示:

● 阅读您 X server 的用户手册。在我们的例子中, 查看 /var/log/Xorg.0.log 文件, 我们可以发现 X 用 TDFX 作为驱动, 所以需要参阅 tdfx(4) 的用户手册。 您会发现里面有配置显卡的各种技 巧、限制、选项等。因各种驱动的差别很大, 您不要以前阅读过别的用户手册就不用再看您 目前显卡的用户手册了。 ● 试试不同的监视器。通过上例我们可以发现, 不同的监视器提供不同的线索, 有的未必准 确。 ● 尝试vesa(4) X 驱动。这绝对是为性能考虑的最后选择。但是它可以运行在大多数显示卡上, 包括那些没有"更合适"的 X server 驱动的情况。 ● 是用一个不同的硬件。如果您还可以选择别的显卡, 就试试别的。

11.4 - 启动 X

有两个常用的启动 X 的方法:

11.4.1 - 根据需要:

以正常方式登陆控制台, 需要时键入startx(1)。

11.4.2 - 直接启动至 X:

这需要使用X显示管理器xdm(1), xdm(1)以root的身份启动, 通常通过rc, 并且提供一个login提示符。 用户登陆成功后, 它为用户启动一个 X 会话。如果或当 X 会话终止后(包括按下了 CTRL-ALT- Backspace键), xdm(1)会退回, 提示用户重新登陆。基于这个原因, 除非您的 X 工作的很好, 或者您的 计算机变得难于管理了, 否则不用使用 /etc/rc.conf.local 启动 xdm(1) ! (情况最糟糕时:例如忘记了密

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 10/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统 码, 启动至单用户模式, 编辑您的xdm_flags那行并保存在 /etc/rc.conf.local 文件。)

有些平台需要禁用控制台getty(8) 才可以使用 xdm(1)。

11.5 - 定制 X

11.5.1 - 介绍

OpenBSD默认的X环境是具有全部功能的, 但是你可能希望定制它。你可能希望改变背景图案或颜 色, 或者你可能希望改变Window管理器(这个程序可以设定X环境绝大多数参数), 或者更改你的随X 启动的应用程序。

OpenBSD中的默认window管理器是 fvwm(1)。Fvwm是一个优秀的、通用的window管理器, 但它绝非 你唯一的选择;OpenBSD并非仅包含了Fvwm(请看 (1) 和 (1))。另外你还可以在 packages 中 找到大量的widnow管理器。

就像 系统启动脚本, X也通过一个程序设置用户环境, 更确切地说是几个程序, 具体用哪个取决于你 想怎样启动X , 理解X的启动原理可以帮助你按自己的设想定制X。

说明, 你可以将X定制为系统级或用户级, 最好方法是不要更改系统默认设置, 将X定制为用户级别, 因为用户的脚本储存在用户自己的目录里, 这样你可以在升级系统时减少文件的合并数量。X的系 统级默认配置在 /etc/X11 里, 来自安装组件 xetcXX.tgz, 升级过程不会重新安装这个组件, 所以如果你 更改了你的系统设置, 升级过程不会覆盖改动的部分, 但是你可能需要将这些改动应用于新版本的 相应文件中。

11.5.2 - 用startx(1)启动X startx(1) 在自己的目录内寻找 .xinitrc 文件, 这个文件通常是一个shell脚本, 无论你希望启动多少X"客 户端"(使用X的应用程序)都可以用这个shell脚本进行设定。这个shell脚本执行完毕后, X服务器也随 即关闭。通常情况下, 通过这个脚本启动的大多数程序在后台运行, 尽管最后一个应该在前台运行 (例如:window管理器), 当最后一个程序退出后, 脚本也执行完毕, X也随即关闭。

最简单的情况, 你可以只输入window管理器的名字就可以调用它:

cwm

或许你想发挥一下自己的想象力:

xconsole -geometry -0+0 -fn 5x7 & oclock -geometry 75x75-0-0 & xsetroot -solid grey & cwm

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 11/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

这样会启动 xconsole(1) , xconsole(1) 提供了一个内核发送给控制台所有文本的拷贝(现在掩盖在图形 下面), 一个模拟的时钟, oclock(1), 并且在调用 cwm(1) 之前把背景设置成一个灰色实体。注意带 "&" 字符时仅有window管理器不在后台运行, 也就是说直到 cwm(1)退出时X才会退出。

如果用户的目录内没有 .xinitrc 这个文件, 系统会使用 /etc/X11/xinit/xinitrc 这个文件。你可以参照它 设置你自己的 .xinitrc 脚本。

11.5.3 - 用xdm(1)启动 xdm(1) 通常由 系统启动脚本 启动, 但是出于测试的目的(推荐, 除非你知道怎样正确地配置X!), 可以 用root的身份运行它。 xdm(1) 还有很多我们这里不讨论的其它功能, 但我们的目的是用 xdm 提供一个用户登录屏幕, 以校 验用户名和密码, 然后向用户提供X环境。当X关闭时, xdm会重新启动自己, 这就是为什么你要在使 用xdm或设置其随系统启动前确保已经正确地配置了X, 否则你可能无法控制你的机器。

当 xdm(1) 启动后, 它会运行 /etc/X11/xdm/Xsession 检查是否用户目录中存在一个 .xsession 文件, 所 以, 如果你想改变你的默认window管理器, 只需简单地在.xsession 里调用它 (或是什么别的)。在强调 一下, 你想在X中运行的任何程序(例如, 可能是三个 xterm(1)) 全可以放在这里, 但是所有放在这里的 程序应该全是在后台运行的, 除了window管理器, 同样还要强调的是当windos管理器退出时X会话就 终止了, 这时, xdm(1)将重新启动X, 然后把你带回一个登录屏幕。

11.5.4 - 尝试一个新的window管理器

你可以在不改变任何默认配置的前提下通过调用一个指定的window管理器来载入X, 像这样:

$ startx /usr/local/bin/

一些window管理器(包括 cwm(1) 和 fvwm(1))可以在运行时被更换为其它的window管理器, 这种更换 不用重新启动X或你的应用程序。 新的window管理器将取代那个旧的, 退出新管理器并终止X后, 系 统不会回到你原先使用的window管理器。 使用fvwm(1)时你可以通过左键点击背景 ("root window") 来启动一个不同的window管理器, 选择 "(Re)Start", 然后选择你喜欢的window管理器(然而, 注意你需 要将你选择的window管理器添加到 .fvwmrc 文件 (系统级配置默认在 /usr/X11R6/lib/X11/fvwm/. fvwmrc))。 cwm(1) 里通过键入Ctrl-Alt-w来调用其它的window管理器, 然后输入你想切换的管理器 的名称。

一旦你找到了自己喜欢的window管理器, 你可以下个上面描述的那样将它作为最终程序设置在启动 脚本里。

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 12/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十一章 - X Window 系统

[索引]第十章 - 系统管理] [第十二章 - 硬件和特定平台问题]

[email protected] $OpenBSD: faq11.html, v 1.76 2008/11/12 02:59:41 nick Exp $

http://www.9971.us/OpenBSD4.5/c/faq11.html(第 13/13 页)2009-5-3 23:02:22 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

[索引] [第十一章 - X Window 系统] [第十三章 - 多媒体]

12 - 硬件和特定平台问题

目录

● 12.1 - 常规硬件说明

❍ 12.1.1 - PCI

❍ 12.1.2 - ISA

❍ 12.1.3 - 一个设备被 "识别"了, 但是dmesg里显示"not configured"

❍ 12.1.4 - 列表上说"支持"的卡, 但是它无法驱动!

❍ 12.1.5 - 支持软件调制解调器吗?

❍ 12.1.6 - 我的Adaptec RAID支持(aac)出什么问题了?

❍ 12.1.7 - 我的ami(4)卡只支持一个逻辑磁盘!

● 12.2 - DEC Alpha

● 12.3 - AMD 64

❍ 12.3.1 - 我能在我的Intel P4上运行OpenBSD/amd64吗?

❍ 12.3.2 - 我能在OpenBSD/amd64上运行i386的二进制文件吗?

❍ 12.3.3 - OpenBSD/amd64可以在支持的支持的处理器上平稳运行吗?

● 12.4 - 基于ARM的应用程序

● 12.5 - HP 9000 系列 300, 400

● 12.6 - HP Precision 构架(PA-RISC)

● 12.7 - i386

❍ 12.7.1 - ISA 网卡

❍ 12.7.2 - OpenBSD 在我的80386/80386SX/80486SX系统上无法运行

❍ 12.7.3 - dmesg显示多个设备共享一个中断

❍ 12.7.4 - 我的键盘/鼠标被锁住了(或无法正常工作)!

❍ 12.7.5 - 我的Soekris性能很差

❍ 12.7.6 - 我在使用CF设备时系统显示"missing interrupt"错误

● 12.8 - Landisk

● 12.9 - Luna88k

● 12.10 - Mac68k

● 12.11 - MacPPC

❍ 12.11.1 - 我的 bm(4) 网络适配器不工作!

● 12.12 - MVME68k

● 12.13 - MVME88k

● 12.14 - SGI

● 12.15 - SPARC

● 12.16 - UltraSPARC

❍ 12.16.1 - 我的UltraSPARC不能从软盘镜像启动

❍ 12.16.2 - 我在用disklabel分区时系统显示"partition extends past end of unit"

● 12.17 - DEC VAX

❍ 12.17.1 - 我可以使用SIMH VAX模拟器吗?

● 12.18 - Sharp Zaurus

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 1/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

❍ 12.18.1 - USB设备工作不正常

12.1 - 常规硬件说明

12.1.1 - PCI 设备

● 系统会自动配置PCI设备——计算机或操作系统会根据设备需求提供资源。 ● 在PCI总线上可以共享中断。特别是在i386系统上共享中断比单独占用中断性能更好。 ● 有几种不同的PCI总线标准。偶尔您会发现某些PCI2.2标准的卡无法工作在PCI2.1的系统上。还有就是许多主板上的 桥接卡(例如多接口网卡)在老系统上无法正常工作。 ● PCI总线支持两种电气规范, 3.3v 和 5v。 以3.3v信号工作的PCI卡蚀刻了第二个引脚。大部分计算机上使用5v信号的 PCI卡。 Soekris单板机(Net45x1 和 Net4801)通常仅支持3.3v的信号。

12.1.2 - ISA 设备

● ISA设备不能共享资源, 并且在通常情况下必须手动配置以避免和系统中的其余设备产生冲突。 ● 一些ISA设备属于即插即用式(isapnp(4))——如果您有问题, 效验一下它们在 dmesg(8)里的配置。ISAPnP 并非总能很好 地工作。 ● 通常情况下, 如果您可以选择, 这里建议您尽量选用PCI卡而非ISA卡, ISA卡不仅配置很困难而且对系统性能有负面的 影响。

12.1.3 - 一个设备被 "识别"了, 但是dmesg里显示"not configured"

简而言之, 这说明您的内核不支持此设备, 所以您无法使用它。

PCI和很多其它类型的设备可以提供鉴别信息以便操作系统可以识别和支持。识别这个设备很简单, 但是为它提供支持有时 很困难。 下面是dmesg里两个"not configured"设备的例子:

... vendor "Intel", unknown product 0x5201 (class network subclass ethernet, rev 0x03) at pci2 dev 9 function 1 not configured ... "Intel EE Pro 100" rev 0x03 at pci2 dev 10 function 0 not configured ...

第一个设备(一块网卡) 有生产厂家标识但没有准确地型号。 第二块网卡是开发人员为其添加了鉴别文件标识。不管哪种情 况, 这些网卡都无法工作, 被标记为"not configured", 意思就是这些卡没有驱动程序。

如果我的设备没有驱动怎么办?

● 如果您不使用这个设备您可以不用理会这些"not configured"信息, 这些设备不会对系统产生影响。 还有一些有"特殊用 途"的设备是特意不做配置以便计算机的BIOS可以处理它们。 ● 有些情况下这个设备可能是已被支持设备的一个变种, 这种情况下开发者可以相对简单地为其提供驱动支持;此外, 这个设备可能是完全不支持的芯片组或属于上例中的情况, 这种情况下如果没有完整的说明文档将无法为其写新的驱 动程序, 我们欢迎您自己来写一个新的驱动程序。 ● 可能您使用的安装内核并未包含次这个设备的驱动程序, 可能您换一张完整的安装盘就可以了。这种情况经常发生在 使用流行的SCSI的用户身上, 他们在误读了i386平台上的注释后, 为配置SCSI卡尝试了所有的不支持的软盘镜像, 可偏 偏没有选择支持的那个。 ● 如果您使用了一个修改过的内核, 您可能已经删除了目前想使用的新设备的驱动。通常情况下在内核中删除设备是一 个糟糕的想法, 这也是其中一个原因。

● 在您报告有一个"not configured"的设备前, 确认您已经尝试了最新的snapshot, 因为您新驱动可能已经加在里面了, 并且

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 2/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

查看一下邮件列表看这个问题是否已经被讨论过了。不管怎么说, 请记住, 如果你是用一个老版本的OpenBSD, 你需要 升级你的系统才可能获得新的驱动程序。

12.1.4 - 列表上说"支持"我的卡, 但是它无法使用!

很遗憾, 很多生产厂家为了销售在产品上标称了型号, 但产品实际并没有达到该型号的技术标准。因此, 你可能购买了一款与 某平台下设备支持列表中同名或同型号的设备, 但实际上它与支持列表中的设备完全是不同的, 可能无法在OpenBSD下工 作。例如, 很多早期的无线网卡基于Prism2芯片组, 使用(wi(4)) 驱动程序, 但是, 当后来出现更廉价的芯片组后, 许多生产商在他们的产品上使用了不开放驱动源代码的新的廉价芯片组, 但 是并没有改变他们的产品型号。计算机设备里远非仅无线网卡存在这种现象。

12.1.5 - 支持软件调制解调器(WinModems)吗?

WinModem是一种廉价的调制解调器, 它依赖处理器来完成"真正"调制解调器应处理的工作, 因为存在各种各样不兼容或无说 明文档的WinModem芯片, 所以OpenBSD目前或今后都不支持WinModems。

12.1.6 - 我的Adaptec RAID支持(aac)出什么问题了?

Adaptec公司已拒绝提供其FSA-based (aac(4)) RAID控制器有效和精确的文档, 因为这些控制器看起来总是出现问题, 所以这个 文档对我们提供一个有效的驱动是很关键的。因原驱动很不可靠, 所以已经在标准内核GENERIC中已经删除了。

我自己可以编译支持aac(4)的内核, 对吧?

当然, 但是您不明白前面说的"不可靠"的含义吗? 这不是指一次"试验"的特例, 而是说这个驱动程序是一个众所周知有缺陷的 驱动。也许它可能在某些硬件上使用, 但是我们不推荐您把自己的数据赌在它身上。

12.1.7 - 我的ami(4)卡只支持一个逻辑磁盘!

这是一个已知的ami(4)的bug, 你如果在某些控制器上使用一个以上的逻辑磁盘可能会造成数据损坏, 当你的计算机里有这些 控制器时, OpenBSD将会限制你只能使用一个逻辑磁盘, 所以在你的dmesg里会产生像这样的一条信息:

ami0: FW A.04.03, BIOS vA.04.03, 4MB RAM ami0: 3 channels, 16 targets, 2 logical drives ami0: firmware buggy, limiting access to first logical disk scsibus0 at ami0: 1 targets

12.2 - DEC Alpha

[无]

12.3 - AMD 64

12.3.1 - 我能在我的Intel P4上运行OpenBSD/amd64吗?

对很多最近的处理器来说, 答案是"可以"。遗憾的是, 要搞清哪些类型的Intel处理器支持或不支持amd64指令集是困难的。自 己尝试一下可否正常工作是比较简单的办法。

12.3.2 - 我能在OpenBSD/amd64上运行i386的二进制文件吗?

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 3/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

不行。

OpenBSD/amd64 是一个完全与 OpenBSD/i386 分离的平台, 因此, 不提供二进制的兼容性, 开发者对跨平台的二进制兼容也没 有多大兴趣。

注意 OpenBSD/amd64 和 OpenBSD/i386 的boot loaders会引导各自的内核, 然而, 当你用"另一种"平台重新安装系统时, 它必须 做一个完全的"擦除和重新安装"操作——留下的"前一个"平台安装的二进制文件可能会让你觉得讨厌。

12.3.3 - OpenBSD/amd64可以在支持的处理器上平稳运行吗?

并非总是。

这里有一些用户更愿意选择使用OpenBSD/i386而不是OpenBSD/amd64的原因, 尽管他们的硬件支持amd64的指令:

● 需要i386的二进制文件(或其它的OS)的兼容性。 ● 需要运行一些非"原生64 bit"应用程序。 ● 需要能把磁盘挪到另一台不支持64位的计算机上使用。 ● 在一些应用程序或平台上OpenBSD/i386的表现可能超越OpenBSD/amd64。只有很有的人曾经遇到此类情况, 我们一直 努力尽可能最多地消除此类问题。

12.4 - 基于ARM的应用程序

[没有]

12.5 - HP300

[没有]

12.6 - HPPA

[没有]

12.7 - i386

12.7.1 - ISA 网卡

因为OpenBSD在老机器上运行的很好, 所以用户可能会在OpenBSD系统上使用ISA网卡。相比PCI, 使用ISA硬件需要更多的硬 件知识和配置。通常你不能就把这块卡插入计算机内就希望它可以神奇的工作了。在很多机器里, 如果你的ISA设备不是工 作在即插即用模式, 你必须在BIOS里面为它预留资源。

3Com 3C509B ep(4)

这是一款表现极佳的ISA网卡, 由ep (4)驱动支持。'B' 版本和非 'B' 版本可以从卡的标识上区别也可以从卡上的"主"芯片加以 区别 ( 'B' 版本边上的主芯片厚度大约是2.5cm, 而老版本则是2.0cm), 在加载一个或两个网卡的系统上提供了良好的性能。 3C509B 芯片配置为PNP模式, 遗憾的是它并不遵守标准, 并且导致了OpenBSD的isapnp(4) 支持上出现问题。 这个适配器先以 非PNP设备加载, 然后再使用PNP模式, 这导致在dmesg里面有一个额外的网卡输出信息。这种情况可能可以正常工作, 也可能 引起其它的问题。我们在这里强烈推荐不使用PNP模式并且在配置前用3Com 基于DOS的配置工具手动配制成非冲突的设 定。 ep(4) 驱动将在任何硬件组合的情况下启动这块卡而不会与系统中的其余设备冲突。

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 4/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

如果你的系统上游多块3C509卡, 推荐您在卡脊上标注上该卡的MAC地址, 然后用dmesg鉴别它们。

注意3C509, 3C905和3C590经常混淆。3C509是一块10Mbps的ISA卡, 3C905和3C590是PCI卡。

NE2000

最初的NE2000网卡是20世纪80年代中期由Novell公司开发出来的。从那以后, 很多生产商生产的网卡取很相似, 一般被称为 NE2000兼容卡或克隆卡。这些兼容卡的性能有很大的区别。有些老的NE2000兼容卡性能非常好, 而很多目前的NE2000兼容 卡性能却很差。在OpenBSD里通过 ne(4) 支持NE2000兼容卡。

如果打开ISAPNP模式, OpenBSD可以很好的驱动具有ISAPNP功能的NE2000兼容卡, 其它的卡将不得不采用跳线或或基于 DOS的配置工具。很遗憾, 因为最初的NE2000网卡没有软件配置或ISAPNP支持, 因为没有标准——你需要使用随卡附带的原 始驱动程序, 这往往不好找了。

在哦OpenBSD的标准内核GENERIC里包含了ne(4) 驱动, 它支持三款ISA NE2000网卡的配置:

ne0: port 0x240 irq 9 ne1: port 0x300 irq 10 ne2: port 0x280 irq 9

如果这些设定不能让你的卡工作, 你可以用 用户内核配置(UKC) 或通过 构建定制内核 来调整设定。

注意: ne(4) 驱动 "很笨" -- 只探测 I/O 端口, 如果上述任何I/O地址被探测到, ne(4)将假设该网卡使用上面相应的irq值。 dmesg (8) 并不能反映ISA ne(4)驱动的该网卡的真实IRQ, 如果这并非你网卡的设定的实际IRQ, 你的网卡将不会正常工作。

还有一些非ISA网卡使用 ne(4) 驱动 —— 例如:PCI 和 PCMCIA 的ne(4)卡, 上面的注意事项与这些卡无关, 因为这些设备将会 自动配置。

12.7.2 - OpenBSD 在我的80386/80386SX/80486SX系统上无法运行!

80386SX/DX

对 80386DX 和 80386SX 处理器的支持从OpenBSD 4.2开始已经放弃了。另外因限于80386芯片, 这些系统已经太慢并且没有足 够的内存和所需的FPU来运行OpenBSD了。

80486SX

80486SX 芯片原来是一个"廉价"版本的80486, 它缺乏OpenBSD所需的硬件浮点支持(就像80386)。幸运的是所有的80486DX芯 片全没问题, 并且对大多数老系统来说升级也很简单。

80486DX 和更新一些的芯片组可以很好地运行OpenBSD。

12.7.3 - dmesg显示多个设备共享一个中断(IRQ)!

这完全可以接受, 事实上, 甚至希望PCI设备这样, 这是PCI总线的一个设计特点。有些人可能会说共享中断请求(IRQs)不好, 然而, 他们若非混淆了PCI总线和ISA总线的情况(ISA设备不允许共享IRQ), 就是依据已经过时的使用硬件或软件的错误经 验。

ISA 设备不能共享IRQ, 如果你发现你的ISA设备共享了IRQ, 你必须纠正这个错误。

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 5/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

12.7.4 - 我的键盘/鼠标被锁住了(或像疯了似的)!

这种情况经常发生在使用一个 "切换盒" (有时被称为 "KVM 切换器") 将多台计算机连接到一个键盘(K), 一台监视器(V), 和一 个鼠标(M)上。 你可以尝试使用不同品牌和设计的KVM切换器, 但是OpenBSD似乎比其他操作系统对鼠标切换更敏感。这个 问题通常只是因为切换鼠标造成的, 解决方法也很简单: 不在计算机上连接鼠标。如果您需要使用鼠标, 一个最简单的解决方 法是"每台计算机使用一个鼠标", 仅切换键盘和监视器。 你也许发现了使用一个 PS/2 Mouse 连接 USB 端口适配器 (这样 OpenBSD会认为是一个USB鼠标) 将会解决这个问题。如果您只是想从控制台访问计算机, 你可能希望考虑使用一个串口控 制台替换原方案。

12.7.5 - 我的Soekris性能很差

Soekris计算机如此好——低功耗, 、小巧、物美价廉的PC级系统, 以致许多OpenBSD用户都很喜欢它。但是, 别忘了它的处理 器、网卡和系统上的其它设备全是为了考虑低功耗而非性能来选择的。尽管它可以舒服地运行很多的应用程序, 但它并非高 性能的计算机。

12.7.6 - 我在使用CF设备时系统显示"missing interrupt"错误

在一些 CF 系统中, 例如早期的Soekris 4801系统和一些 CF 适配器, DMA支持并没有正确地运行, 所以你可能看见如下信息:

pciide0:0:0: bus-master DMA error: missing interrupt, status=0x20

这时, 你需要在 wd(4) 驱动中禁用DMA以避免此问题。这可以通过使用 ukc 安装, 然后用 config(8) 使其永久生效:

ukc> change wd 42 wd* at wdc*|pciide* channel -1 flags 0x0 change [n] y channel [-1] ? flags [0] ? 0x0ff0 42 wd* changed 42 wd* at wdc*|pciide* channel -1 flags 0xff0 ukc> quit

12.8 - Landisk

[没有]

12.9 - Luna88k

[没有]

12.10 - Mac68k

[没有]

12.11 - MacPPC

12.11.1 - 我的 bm(4) 网络适配器不工作!

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 6/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

一些MacPPC系统(包括早期的iMacs)使用的 BMAC 芯片由 bm 驱动提供支持, 但是在这些系统上会出问题。推荐您的系统这 种情况下使用一个 usb 网卡。

12.12 - MVME68k

[没有]

12.13 - MVME88k

[没有]

12.14 - SGI

[没有]

12.15 - SPARC

[没有]

12.16 - UltraSPARC (sparc64)

12.16.1 - 我的UltraSPARC不能从软盘镜像启动

只有 Ultra 1/1e 和 Ultra 2 可以从软盘上启动任何操作系统。请您使用 CD-ROM, Miniroot, 或 network boot 替代软盘安装。

12.16.2 - 我在用disklabel分区时系统显示"partition extends past end of unit"

在 sparc 和 sparc64 系统上, 当单独的disklabel条目大于8G时, BSD的disklabel无法描述一个大于8GB的磁盘几何。

您每次运行 disklabel(8) 时, 它会检查disklabel条目是否与它认为正确的驱动器几何有冲突, 并且因为它看见了截断的几何, 所 以它发出警告并阻止您编辑8G空间之外的条目, 这时除非你告诉它使用真正的磁盘几何。你可以使用disklabel(8)命令行编辑 器的 'g'命令告诉它——"[d]isk geometry":

# disklabel -E wd0 # Inside MBR partition 3: type A6 start 63 size 17912412 [...] Initial label editor (enter '?' for help at any prompt) > g [d]isk, [b]ios, or [u]ser geometry: [d] d > w > q

你还会看到警告信息, 但你可以按自己的想法配置和使用磁盘。 一个妥善的解决的方案必须兼容目前已经使用的系统, 加上 兼容Solaris运行在8G以上的磁盘上, 这个方案还在探讨阶段。

12.17 - DEC VAX

12.17.1 - 我可以使用SIMH VAX模拟器吗?

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 7/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十二章 - 硬件和特定平台问题

可以!

SIMH VAX 模拟器可以用来有效地模拟一个真实的VAX。相关资料请参看 OpenBSD/vax on SIMH。

12.18 - Sharp Zaurus

12.18.1 - USB设备工作不正常

Zaurus对USB端口的支持非常有限, 所以许多USB设备直接连在它上面将无法工作。 你需要使用一个USB集线器来运行这些 设备。

[索引] [第十一章 - X Window 系统] [第十三章 - 多媒体]

[email protected] $OpenBSD: faq12.html, v 1.96 2009/01/30 22:25:57 sthen Exp $

http://www.9971.us/OpenBSD4.5/c/faq12.html(第 8/8 页)2009-5-3 23:02:26 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

[索引] [第十二章 - 硬件与特定平台问题] [第十四章 - 配置磁盘]

13 - 多媒体

目录

● 13.1 - 我怎样配置音频设备?

● 13.2 - 播放不同格式的音频文件

● 13.3 - 我在OpenBSD上怎样播放CD?

● 13.4 - 我能用OpenBSD录音吗?

● 13.5 - 音频设备有问题, 我该怎么办?

● 13.6 - 我如何使用MIDI工具?

● 13.7 - 请告诉我什么是Ogg Vorbis和MP3编码?

● 13.8 - 如何在OpenBSD中播放DVD视频?

● 13.9 - 如何刻录CD和DVD?

❍ 13.9.1 - 简介和基本设置

❍ 13.9.2 - 刻录CD

❍ 13.9.3 - 刻录DVD

● 13.10 - 但我想使用FOO格式的媒体文件

● 13.11 - 我能在OpenBSD中播放播放流媒体吗?

● 13.12 - 我的浏览器可以使用Java插件吗?(仅i386/amd64)

● 13.13 - 我的浏览器可以使用Flash插件吗?(仅i386)

13.1 - 我怎样配置音频设备?

OpenBSD中有关音频的设备位于 /dev/audio, /dev/sound, /dev/audioctl 和 /dev/mixer。想了解有关音频驱动层的综述请参阅用户手册audio (4)。

所有支持的音频驱动已经包含在GENERIC内核中, 所以不需要额外的配置或安装驱动, 想要找出您的音频芯片的的选项, 您必须先知道您 的音频芯片类型。被支持的芯片组也许可以在您的平台的硬件兼容页找到。如果您已经开始运行OpenBSD了, 您可以从dmesg(8)命令的 输出信息上寻找声卡驱动, 然后阅读它的用户手册获得更多的信息, 比如:可使用的选项还有关于驱动的其他细节。下面的例子是一个 dmesg输出的声卡芯片的内容:

auich0 at pci0 dev 31 function 5 "Intel 82801BA AC97" rev 0x04: irq 10, ICH2 AC97 ac97: codec id 0x41445360 (Analog Devices AD1885) ac97: codec features headphone, Analog Devices Phat Stereo audio0 at auich0

OpenBSD简要地提供了两个工具用来监视和配置音频设备。 audioctl(1) 用来处理声音参数, 诸如编码、采样率和声道等, 而 mixerctl(1) 用 来混合参数, 例如, 声道来源、水平增益和静音。

下面使用命令 audioctl(1) 来显示一个音频设备的默认处理参数。

$ audioctl -f /dev/audio ...

注意这里的 -f /dev/audio 使用的很明确。打开/dev/audio使这个音频设备按我们的要求重置为默认参数。

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 1/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体 audioctl(1) 还可以有效的探测音频设备的能力。例如, 要看这个音频设备是否支持常用的采样率, 您可以简单地尝试各种播放速率:

$ audioctl play.rate=48000 play.rate: -> 48000 $ audioctl play.rate=44100 play.rate: -> 44100 $ audioctl play.rate=22050 audioctl: set failed: Invalid argument $ audioctl play.rate=8000 audioctl: set failed: Invalid argument $

这个设备支持48000 和 44100 Hz 的播放速率, 不支持 22050 或 8000的。 注意如果一个采样率不支持, 系统并非总会返回一个错误信息, 有时 候它会返回一个非您所要的采样率, 详见下图:

$ audioctl play.rate=48000 play.rate: -> 48000 $ audioctl play.rate=44100 play.rate: -> 48000 $ audioctl play.rate=22050 play.rate: -> 48000 $ audioctl play.rate=8000 play.rate: -> 48000 $

这个设备仅支持48000 Hz 的播放速度。

通常声卡多少具备一些简单的混音功能。不带参数地运行 mixerctl(1)将会列出这个设备的混音控制和当前的设定。

$ mixerctl ...

有些设备只有很少的控制, 有些则有100种或更多的控制。注意, 并非每个音频芯片的所有选项都能输出到外面来。例如, 有可能列出音频 选项多于声卡或主板能接受的选项。

有一些选项是很多设备通用的:

● outputs.master 控制输出的播放音量 ● inputs.dac 播放一个音频文件时控制来自DAC (digital to analog converter, 数模转换器)的音量 ● record.source 录音时控制什么合成进ADC (analog to digital converter, 模数转换器) ● record.volume 或 record.record 控制ADC的输入音量

每个音频设备的控制选项的命名可能是不同的。例如, 有些音频设备可能没有上面列出的outputs.master选项, 而有一个outputs.outputs选 项, 两者的功能是一样的。通常这些控制有一个有含义的命名, 但有时您也需要简单的测试一下不同命名选项的实际效果。

有些设备使用所谓的EAPD, 代表External Amplifier Power Down(外置功率放大器关闭功能), 这实际就是另一个开关。它可能会被认为 是"节能", 因为"power down"通常用来表示power saving(节能), 这种类型的控制通常在笔记本电脑上可以找到。有时您需要打开名字中带 eapd或extamp的选项获得一个输出信号。(译者注:以便确认这些选项的真实含义)

这里有一个通用的mixerctl命令用法的简单例子, 将左右声道的音量设置成200, 但您会出错。

$ mixerctl outputs.master=200, 200 outputs.master: 255, 255 -> 207, 207

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 2/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

注意这里数值变成207了, 它的原因是这个设备具有一个AC'97编解码器, 它只具有5bit音量控制, 也就是只有32种可能的音量。其它音频设 备可能有不同的控制精度。

关闭主声道的静音功能, 您需要这样:

$ mixerctl outputs.master.mute=off outputs.master.mute: on -> off

要让更改在每次启动后生效, 编辑 /etc/mixerctl.conf 文件, 例如:

$ cat /etc/mixerctl.conf outputs.master=200, 200 outputs.master.mute=off outputs.headphones=160, 160 outputs.headphones.mute=off

13.2 - 播放不同格式的音频文件

数字化音频

无损音频格式 (AU, PCM, WAV, FLAC, TTA)

一些无损音频格式不需要第三方软件提供它们的非压缩数字样本的字节块就可以播放, 这些格式包括Sun的声音格式(AU), raw PCM文件 (headerless, 不包含头部信息的), 和RIFF WAV.

OpenBSD自带一个aucat(1)程序可以录制和播放未经压缩的音频。下面的例子是播放一个WAV文件:

$ aucat -i filename.wav aucat(1) 加上-i选项可以支持无头部信息的音频以及WAV文件格式。aucat也可以播放Sun的8KHz单声道mulaw音频文件, 这个格式是Sun的 常见的编码格式。 aucat还能将未压缩的音频格式文件直接传送给音频设备来直接播放它。为此, 您需要知道该音频文件的主要参数:编码类型、声道数量、 采样率、采样精度。如果您不知道, 您可以用file(1)工具获得这些参数:

$ file music.au music.au: Sun/NeXT audio data: 16-bit linear PCM, stereo, 44100 Hz

$ file music.wav music.wav: Microsoft RIFF, WAVE audio data, 16 bit, stereo 44100 Hz

现在剩下需要了解的就是这些示例文件使用的是小端字节序及采用线性量化。您可以通过使用hexdump(1)阅读头部信息判断出来。如果 您使用的是一个headerless(raw)文件, 那事先就无法知道参数。参照 audioctl(1) 的使用说明设置下列参数:

play.encoding=slinear_le play.rate=44100 play.channels=2 play.precision=16

接下来, 将声音文件发送到音频设备:

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 3/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

$ cat music.au > /dev/sound

如果您的设定正确, 就会听到预期的声音。

注意:如果您希望保留audioctl设定的参数, 记住, 永远使用 /dev/sound, 而不是 /dev/audio 。

您也可以使用其它的工具, 例如packages或ports里面的 audio/waveplay , 当然, 流行的软件像XMMS, 除了可以播放其它音频文件外也可以播 放这些无损音频文件。

除上面提到的格式外, 还有一些采用无损压缩的音频格式, 例如, Free Lossless Audio Codec(免费无损音频编码, FLAC)和TTA。FLAC程序已 经被移植到OpenBSD上了, 您可能在package和ports的 audio/flac目录下找到。

有损压缩格式 (Ogg Vorbis, MP3, WMA, AAC)

有损压缩的方法经常被应用于音频或其他媒体文件。它的思路是在压缩过程中丢弃大量数据, 但是压缩后的文件在播放时仍具备足够好 的效果。它的优点是提供了极高的压缩比从, 而降低了所需的磁盘空间及网络带宽。

有个很好的例子就是自由、开放、非专利的 Ogg Vorbis 格式。播放Ogg Vorbis文件您可以使用ogg123工具, 它已经打包进在 audio/vorbis- tools package中.例如:

$ ogg123 music.ogg Audio Device: Sun audio driver output Playing: music.ogg Ogg Vorbis stream: 2 channel, 44100 Hz Time: 00:02.95 [02:21.45] of 02:24.40 (133.1 kbps) Output Buffer 87.5%

当然, 许多其它的音频播放软件也有 Ogg Vorbis 插件。

另一个例子是非常著名的 MP3(MPEG-1 Audio Layer 3) 编码, 然而它有共享许可和专利问题。许多工具可以播放 MP3 文件, 您只需阅览 packages and ports系统那章有关音频的小节, 然后从里面随便找一个您喜欢的工具就可以了。

那微软专用格式Windows Media Audio (WMA)呢?这种格式的文件您可以通过x11/mplayer播放, mplayer使用 FFmpeg 框架。

一篇非常好的Wikipedia上的文章可以让您更深入了解各种音频文件格式:Audio file formats。

合成声音

MIDI

Musical Instrument Digital Interface (乐器数字接口, MIDI) 协议, 是由 MIDI devices 进行处理的。如果您没有一个 MIDI 合成器, 但您想播放 一个标准的 MIDI 文件(SMF), 您可以用软件渲染 MIDI 数据, 产生音频文件. 默认情况下, port树里的 audio/timidity 可渲染 MIDI 文件并在 音频设备上播放它们。

$ timidity file.mid

MOD

一个Soundtrack module 是一个以有序序列混合音频采样二进制格式, 它可以用非常好的音质播放相当长的数字音乐。

用XMMS软件播放MOD文件可能是在OpenBSD上最简单的办法, 您可以从ports树和packages上找到这个软件。您需要为XMMS安装 - mikmod子程序包以便让它使用MikMod音色库, MikMod音色库支持MOD, S3M, IT 和 XM 模块格式。

您也可以在packages and ports collection那一章的audio小节中发现一系列"trackers", 像tracker, soundtracker, 利用这些trackers您不但可以播 放, 还可以生成您自己的模块。然而请注意, ports树中的工具并非支持所有的tracker的格式, 我们永远欢迎您向ports提交一些您自己喜欢

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 4/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

的tracker格式的软件。

13.3 - 我在OpenBSD上怎样播放CD?

通过让CD驱动器播放CD然后发送模拟声音到声卡, 或者从音频文件中读取数据然后通过PCI接口发送数字采样到声卡这两种方式全可以 播放C。

如果要用CD-ROM驱动器模拟输出的方式播放一张音频CD, 您可以

● 使用耳机输出插孔, 通常它在驱动器的前面。 ● 连接计算机后面声卡的音频输出端口。 也就是数据(SCSI/IDE)和电源线路接口旁边的那个接口。

一个不错的命令行工具被称为 cdio(1), 它包含在基本的系统内。 如果您不加任何参数, 它将进入交互模式。如果您想马上播放, 只需键入 命令

$ cdio play

它默认会从第一个CD-ROM驱动器播放, 也就是CD0。注意用户要使用cdio命令必须有访问CD-ROM驱动器权限 (例如 /dev/rcd0c). 因为 这个设备默认仅允许root或者操作组成员访问, 为方便起见您可以调整 /etc/group 里面的group这行将特定用户加入操作组, 或者如果您也 可以根据需求更改这个设备的相关访问权限。

注意您必须unmute混合器的CD输入。 就像输出一样, 每个系统的实际输入名称有很大的区别, 但是您可以使用像这样的命令:

$ mixerctl inputs.cd.mute=off

还有一种可能是在您的CD驱动器和音频设备之间没有模拟音频连接, 这种情况下您可以用cdio的cdplay命令通过PCI总线将CD音频数据 发送到声卡。

$ cdio cdplay

如果您喜欢一个漂亮的GUI, 在packages和ports中有大量基于X11的CD播放器。您仅需在音频相关小节中找一个。

13.4 - 我能用OpenBSD录音吗?

可以, 大多数设备支持录音功能, OpenBSD自带的 aucat(1) 可以提供此功能。

$ aucat -o file.wav

上面的命令将录制一个WAV格式的声音文件。按下[CTRL]-C 可以终止录音。 这个文件采用16-bit、44.1Hz 立体声采样, 您也可以用其它 的采样格式、采样率和声道数。详细请参阅用户手册。

用aucat回放录制的声音文件:

$ aucat -i file.wav

如果录制过程看起来正常, 但是回放没有声音或有问题, 那混合器可能需要进行一些设置, 确认您使用了正确的设备进行了录制, 并且关闭 了声源的静音功能。 您可以用 mixerctl(1) 设置需要的参数, 例如:

inputs.mic.mute=off inputs.mic.preamp=on inputs.mic.source=mic0

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 5/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

record.source=mic record.volume=255, 255 record.volume.mute=off record.mic=255 record.mic.mute=off

这些是针对从麦克风录制的设置, 已经开启了预防大, 否则可能在某些系统上录制的音量会很低。但是开启了预防大也可能导致在某些系 统上音量过大。

13.5 - 音频设备有问题, 我该怎么办?

播放音频时如果听不到声音, 有可能是混合器控制设置得过低或没有关闭静音功能。 参阅这一小段 13.1 - 我怎样配置音频设备 以配置您 的混合器。在报告程序错误前先关闭(unmute)所有的输入输出的静音功能。

如果声音失真, 那可能是您的声卡仅支持一种或有限的几种采样率, 参阅这一小段 13.1 - 我怎样配置音频设备 来确认您的音频设备支持什 么样的参数设定。

如果您的音频设备仅支持少量的采样率, 请在packages或ports中选择相关的应用程序按相关的采样律进行播放。它们可以让您用不同的采 样率进行播放音频文件。例如 x11/mplayer有一个"-srate"开关可以指定输出一个您期望的采样率, 您可以设定为您的音频设备支持的采样 率。 KDE的artsd及一些游戏也有同样的选项。请阅读这些音频程序的说明文档以确认它是否支持重采样率。

重采样率可以通过aucat来实现., 例如:

$ mpg321 -s file.mp3 | aucat -r 22050 -i -

上面的命令使用mpg321和aucat命令已22050Hz的重采样率播放MP3音频文件。

如果您还有问题, 下面有些事情您需要考虑:

● 有些老的ISA卡有特殊的怪癖: ❍ 有些需要配置一个不同的 I/O 地址和 IRQ 值以避免与其它硬件冲突。 您可以在 User Kernel Configuration (UKC) 中简单的尝 试不同的组合。 ❍ 还有一种可能是您采用的是一个并非最合适的声卡驱动, 如果您是用另一个声卡驱动可能会有更好的效果。 如果鉴别驱动 是否合适并非一件简单的事情, 但是您可以仔细查看您的 dmesg(8) 输出, 查看里面有关音频驱动的附属内容, 如果里面有(或 尝试)一个以上的声卡驱动, 您要使用User Kernel Configuration (UKC)每次仅测试其中一个驱动是否有效(将其余的先禁用), 用这样的方式测试每个驱动, 找出最佳的选择。 ● 找出更多关于您音频设备的技术资料。 使用这些资料或从internet上搜寻它的一些特性。对ac97(4)和azalia(4)设备来说, 需要寻找控 制器和编码的相关资料全需要。 他们可以帮助您找出问题的根源。

如果您确认您的设备没故障, 但是它就是不能正常工作, 那现在正是做一下调试的时候。下面这些步骤检测是否DAC可以处理数据。

$ cat > /dev/audio < /dev/zero & [1] 9926 $ audioctl play.{seek, samples, errors} play.seek=48000 play.samples=3312000 play.errors=0 $ audioctl play.{seek, samples, errors} play.seek=57600 play.samples=7065600 play.errors=0 $ audioctl play.{seek, samples, errors} play.seek=48000 play.samples=9379200 play.errors=0 $ kill %1

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 6/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

$ fg %1 cat > /dev/audio < /dev/zero Terminated

这里我们可以看到我们每次检查时处理的数据计数play.samples全在增长, 也看见了play.seek表示音频设备具有足够的缓存, 同时play.error也总是0, 表示没有数据被丢弃。

这里注意即使您在测试时插入一个话筒您也不会听到任何声音, 因为这个测试仅向设备不断发送数据0, 它对当前所有默认 编码来说是无声的。

因此我们知道音频设备可以处理数据, 再次检查混合器是一个不错的想法, 确认是否所有的输入输出全关闭了静音功能并且 设置了一个合适的水平。

如果这时您还有问题, 那就需要您发送一份 错误报告 了, 除了正常错误报告所需资料(诸如全部的dmesg和发生错误时详细情 况)外, 您还需要包括一个默认的mixerctl -v输出以及上述测试DAC过程的输出信息。

13.6 - 我如何使用MIDI工具?

乐器数字接口(MIDI)协议提供了一个标准和有效的手段以电子数据表现音乐演奏信息。 一个MIDI数据仅包含了合成器演 奏音频所需的信息, 而不是音频。更多信息请参阅Tutorial on MIDI and Music Synthesis

播放MIDI数据, 一个合成器必须连接到计算机的MIDI端口, 录制 MIDI 数据必须有一个MIDI工具(例如, 一个MIDI 键盘). 有 些声卡包含了内嵌的MIDI合成器, 它附在MIDI端口上。高段的MIDI工具可能包含了多个部件 (合成器、键盘、控制面 板...), 它们在OpenBSD里显示为多个MIDI端口。

当您运行一个OpenBSD系统时, 可以在dmesg(8)输出内找到MIDI端口, 例如:

midi0 at pcppi0: umidi0 at uhub2 port 2 configuration 1 interface 0 "Roland Roland XV-2020" rev 1.10/1.00 addr 2 midi1 at umidi0: umidi1 at uhub1 port 2 configuration 1 interface 1 "Evolution Electronics Ltd. USB Keystation 61es" rev 1.00/1.25 addr 3 midi2 at umidi1:

它显示了三个MIDI端口, 分别对应于:

● /dev/rmidi0 - 话筒 ● /dev/rmidi1 - USB连接的合成器 ● /dev/rmidi2 - a MIDI 主键盘

测试您的MIDI键盘, 您可以使用hexdump(1)工具来显示您在它上面播放的MIDI数据:

$ hexdump -e '1/1 "%02x\n"'

键盘的输出可以连接到合成器的输入, 用如下命令:

$ cat -u /dev/rmidi1 >/dev/rmidi2

现在您可以在合成器上听见您在键盘上的弹奏。 实际上您弹奏的音乐是捕捉自 /dev/rmidi1 然后实时发送至 /dev/rmidi2 。 更多的信息请参看 midi(4) 的用户手册。

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 7/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

播放标准MIDI文件的主要工具是 midiplay(1)。通过合成器播放一个标准的 MIDI 文件, 很简单:

$ midiplay -d 1 file.mid

注意我们使用参数 1 来指定的MIDI设备(也就是 /dev/rmidi1) , 因为默认情况下 0 号设备已经被使用了。

如果您要录制 MIDI 文件, 您可以使用捆绑在audio/midish port中的smfrec 工具, 例如:

$ smfrec -d /dev/rmidi1 -i /dev/rmidi2 file.mid

将会录制键盘(/dev/rmidi2)正在演奏的内容并实时发送给合成器(/dev/rmidi1), 所以您可以听到您正在弹奏的内容。 更复杂 的操作像编辑、路径、混合、转换MIDI数据的工作可以用绑定在audio/midish port中的rmidish工具来实现。

13.7 - 请告诉我什么是Ogg Vorbis和MP3编码?

这些格式已经在前面 播放不同格式的音频文件 中提到过了。这小节我们将简要介绍此类文件的编码。 如果您又兴趣学习 如何进行压缩编码, 更多的信息请参阅Wikipedia中有关 Vorbis 和 MP3 的文章。

Ogg Vorbis

可以使用oggenc 工具可以将 raw, WAV 或者 AIFF 格式压缩成 Ogg Vorbis 格式, 它包含在package的audio/vorbis-tools , 您可以 通过OpenBSD的packages和ports系统获得。

假设您刚把您喜欢的专辑从CD上提取出来, 您想把这些提取的 WAV 文件压缩成大致192 kbps的采样率, 您可以像这样运行 命令:

$ oggenc *.wav -b 192

完成时会在当前目录下生成一些列 .ogg 文件。oggenc的用户手册上有更多编码参数的说明和更详尽的例子。

MPEG-1 Audio Layer 3 (MP3)

如果您想将这些文件编码成 MP3 格式, 您可以使用 "Lame ain't an MP3 encoder" (LAME), 它是一个学习 MP3 编码的教育软 件。 Lame已经包含在OpenBSD的ports树中。注意因为MP3的专利您在官方的发行版里找不到这个软件。

下面的例子将一个WAV文件编码成192 kbps的MP3文件:

$ lame -b 192 track01.wav track01.mp3

更多的选项和说明请参阅Lame附带的说明文档。

13.8 - 如何在OpenBSD中播放DVD视频?

OpenBSD支持标准的ISO 9660文件系统的DVD光盘, 这种文件系统也用于CD-ROMs, 并且从OpenBSD 3.8开始, 也支持一些 DVD上使用的Universal Disk Format (UDF)文件系统格式。然而, 几乎所有DVD-Video 和 DVD-ROM磁盘采用的全是UDF bridge格式, 它结合了DVD MicroUDF(采用UDF 1.02的子集)和ISO 9660文件系统的特点, 主要是考虑了向后的兼容性。

因为多数计算机有一个DVD-ROM驱动器并使用软件进行解码, 所以您至少使用一个350-MHz Pentium II或性能相当的CPU 才可能流畅地播放。

一些流行的媒体播放器已经为OpenBSD提供了ports, 例如: ogle, mplayer, xine 和 kaffeine。因为这些软件可能需要进一步的设 置, 所以请阅这些软件包的安装说明。有了这些工具就可以在DVD播放时直接访问原始设备, 当然您也可以用mount_cd9660 http://www.9971.us/OpenBSD4.5/c/faq13.html(第 8/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

(8)先mount一个DVD, 然后在这个或其它的已经挂载的文件系统上播放这些文件。

说明:

● 几乎所有您买的DVD全使用了防拷贝的内容干扰系统(CSS)。要播放这些加密的DVD您可以使用packages或ports中的 libdvd库。 ● 您的DVD可能有一个区域代码。但是在计算机上播放这类DVD一般不会有问题的。

13.9 - 如何刻录CD和DVD?

13.9.1 - 介绍和基本设置

您首先要确认您的刻录机已经被内核识别并配置了。OpenBSD支持多数SCSI设备, IDE/ATAPI 和 USB设备可以通过SCSI模 拟进行支持, 您能很快的在您的 dmesg(8) 输出信息上找到, 您只需要找以 "CD" 开头的那些行, 例如:

cd0 at scsibus0 targ 0 lun 0: SCSI0 5/cdrom removable cd1 at scsibus1 targ 4 lun 0: SCSI2 5/cdrom removable

但是cdrecord -scanbus命令无效!

是的, 与使用上述命令的OS不同, OpenBSD使用了不同的命名空间。就像上面已经提过的, 所有的已配置设备全可以在dmesg 输出文件中找到。您需要的信息也在那里。

Error: mount_cd9660: /dev/cd2c on /mnt/cdrom: No such file or directory

默认情况下, OpenBSD安装程序仅提供两个CD设备节点, cd0和cd1。要使用您的cd2设备, 您必须为它创建所需的设备节点。 我们推荐使用 MAKEDEV(8) (根据您的平台) 脚本来创建您的设备节点:

# cd /dev # ./MAKEDEV cd2

下面的内容, 我们几乎全是通过裸设备(raw character device)访问CD/DVD刻录机, 而非块设备(block device)

(译者注:块设备传输数据可以使用缓存以提高I/O传送速度, 数据缓存在内存中的buffer, 直到存满, 然后开始向磁盘些数据; 裸设备每次仅传送少量的数据, 数据直接传送到磁盘, 而不使用系统I/O缓存。 )

检查 CD/DVD 刻录机操作

我们推荐检查您的CD/DVD刻录机是否工作正常。这个例子中我们使用USB 2.0接口的DVD刻录机:

cd2 at scsibus2 targ 1 lun 0: SCSI0 5/cdrom removable

想要使用它先将一张已经刻录好的CD/DVD放进去并挂载, 如果您喜欢, 您还可以测试一下从CD/DVD上拷贝文件到硬盘的 传输速率, 使用time(1)命令可以帮助您。

如果这时什么事情不对头或者您得到了一些错误信息, 明知的话您需要先修复错误, 不要先着急刻录您的CD/DVD。

我现在想刻录一张CD! 可以开始了吗?

在您开始前, 请记住这些非常好的忠告:

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 9/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

● 在您刻录CD时不要进行大量的磁盘读写操作, 这样会减少 CD/DVD 刻录机的吞吐量数据。如果这个吞吐量数据长时 间小于刻录机所需数量, 它的缓存就会耗尽, 这种现象被称为"缓冲区欠载"。 ● 在刻录时避免震动, 因为震动可能会导致激光束偏离它的轨道, 可能导致磁盘错误。 ● 并非所有的DVD刻录机可以支持任何格式, 看下面。

13.9.2 - 刻录CD

刻录一张数据CD-ROM

首先您需要为CD-ROM创建一个ISO 9660文件系统, 您需要使用基本系统包含的 mkhybrid(8) 工具, 或者package中的mkisofs工 具, mkisofs在刻录目录树很多的CD时会更好些。西面这个例子中我们使用mkhybrid, 它和mkisofs的用法类似。

作为例子, 我们假设需要将OpenBSD内核源代码存成一个ISO 9660镜像:

$ mkhybrid -R -o sys.iso /usr/src/sys

Using ALTQ_RMC.000;1 for /usr/src/sys//altq_rmclass_debug.h (altq_rmclass.h) ... Using IEEE8021.00H;1 for /usr/src/sys/net80211/ieee80211_amrr.c (ieee80211.c) 10.89% done, estimate finish Sat Nov 3 08:01:23 2007 21.78% done, estimate finish Sat Nov 3 08:01:28 2007 ... 87.12% done, estimate finish Sat Nov 3 08:01:31 2007 98.01% done, estimate finish Sat Nov 3 08:01:32 2007 Total translation table size: 0 Total rockridge attributes bytes: 896209 Total directory bytes: 2586624 Path table size(bytes): 11886 Max brk space used 0 45919 extents written (89 Mb)

这里的 -R 选项告诉 mkhybrid 在ISO 9660 镜像里产生Rock Ridge扩展。产生Rock Ridge交换协议以便在ISO 9660文件系统内提 供POSIX文件系统语义的支持, 诸如长文件名、文件所有者、权限、文件链接、软链接、设备节点、更深的文件层次(支持8 层子目录)等。

同样如果您想让您CD-ROM上的长文件名文件在Windows或DOS内可读, 您应该增加 -J 标记(参数)以便在ISO 9660镜像里包 含Joliet扩展。

创建完文件系统, 您可以通过挂载这个ISO 9660 镜像 来校验它。如果没有错误, 您现在就可以准备刻录到CD-R(W)上了。最 简单的方法是使用 cdio(1) 工具。

如果您使用可复写光盘例如CD-RW, 您需要在刻录前先清空它。

# cdio -f cd1c blank

您现在就可以将上面例子中产生的光盘镜像刻录在一张空的CD-R(W)上了, 您可以用类似这样的命令:

# cdio -f cd1c tao sys.iso

我们用上面的选项指定cdio使用第二个CD-ROM驱动器做为CD刻录机。

要校验这张CD-ROM是否正确无误, 您可以先挂载它然后检查是否所有数据全在那里。挂载这个文件系统, 您应该为这个 CD-ROM驱动器使用块设备, 这个例子中我们仍然是用这台CD刻录机:

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 10/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

# mount /dev/cd1c /mnt/cdrom

制作音频CD

刻录音频CD, 您可以再次使用 cdio(1) 工具并加上 tao -a 选项。

例如, 我想为我的音乐CD制作一个备份拷贝。这个过程包含两个步骤:

1. 获得原始CD的音轨, 例如:

# cdio -f cd1c cdrip

这个命令将从第二个光驱内的音频CD上的提取一系列WAV文件到您的磁盘。 2. 将音轨文件写入一张空白CD。例如:

# cdio -f cd1c tao -a *.wav

13.9.3 - 刻录DVD

您在刻录自己的DVD前有些重要的事情您必须提前了解。

重要说明:

● 如果您想真正全面了解DVD, 我建议您把非常广泛地阅读一下 DVD FAQ 文档作为一个起点。

● 这一小节仅仅是有偿有限的测试, 而且我们肯定没有尝试每种媒体格式和刻录组合。 尽管如此, 我们还是把尝试过的 或听说过的制作各种格式DVD的好的经验在这里您分享一下, 同时欢迎您与我们分享您在DVD制作过程中的成功或 失败。

不同的DVD格式

有一些列不同的DVD格式。广泛使用的是DVD-R, DVD-RW, DVD+R 和 DVD+RW(R代表可以写一次, RW代表可以复写数 千次)。这是几个差异很大的标准。

还有一个非常不同的格式是 DVD-RAM, 它主要被发展作为数据存储, 可以使用先进的数据包写入功能, 这一功能允许 DVD- RAM 像一种光学磁盘那样被使用。但是 DVD-RAM 并不被推荐使用于视频用途, 因为写入的视频格式与常用的DVD播放机 不兼容。

一个重要的事情是您使用的媒体适合您的DVD刻录机, 但是如果您想让它兼容于其它的DVD播放机, 那处处要小心谨慎, 并 确保您阅读了DVD FAQ的这一小节。

DVD 刻录速度

可能有必要在这里说明一下DVD的速度表示不同于CD-ROM的速度表示。 下表提供了一个概述:

DVD 读/写速度 传输速率(MB/s) 等效于CD-R(W) 读/写速度 1x 1.32 9x 2x 2.64 18x 4x 5.28 36x 8x 10.57 72x

您可以从上表中看出来, 传输速率是相当高的, 然后您需要检查一下是否您的总线(SCSI, (E)IDE/ATAPI, USB)可以处理这个 数据吞吐量。尤其是老的USB 1.0和1.1接口工作在一个很低的传输速率上, 最大的传输速率分别是1.5 Mbit/s 和 12 Mbit/s, 这 意味着USB 1.0的最大吞吐量是178.8 kByte/s, 而USB 1.1的最大吞吐量是1.43 MB/s。USB 2.0则快很多:480 Mbit/s 或 57.2 MB/s 。 http://www.9971.us/OpenBSD4.5/c/faq13.html(第 11/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

通常情况下SCSI 和 (E)IDE 或ATAPI buses的传输速率全很好。

刻录 DVD

基本上和刻录CD-R(W)很相似。但是使用的软件不相同。刻录DVD最好的工具是sysutils/dvd+rw-tools里的 growisof 。 这个 工具可以将一个ISO 9660镜像写入DVD介质。dvd+rw-tools支持所有recordable的DVD格式。

如果您想得到DVD刻录机中光盘的更多信息(例如, 您遗失了光盘盒上的标签, 或者像我一样就是认不出来了), 您可以使用 dvd+rw-mediainfo工具。

刻录DVD有两个选择:

● 预先将您数据预处理成ISO 9660格式, 并在磁盘上保存为此各式的镜像文件;然后将镜像文件写入DVD。 ● 将您的数据转换成ISO 9660格式并立即写入DVD。

我先用包含在 /cvs 目录下的CVS模块 (src, XF4, ports 和 www) 生成一个ISO 9660镜像。我使用下面的命令, 这个命令很像上面 生成CD-ROM 镜像的命令。

$ mkisofs -R -o cvs.iso /cvs

如果一切顺利, 挂载这个镜像检查ISO 9660文件系统。 将这个镜像文件(约2G)写入一张空白的DVD光盘, 这里可以用:

# growisofs -dvd-compat -Z /dev/rcd2c=cvs.iso Executing 'builtin_dd if=cvs.iso of=/dev/rcd2c obs=32k seek=0' /dev/rcd2c: pre-formatting blank DVD+RW... /dev/rcd2c: "Current Write Speed" is 4.1x1385KBps. 23822336/1545832448 ( 1.5%) @3.9x, remaining 5:19 42172416/1545832448 ( 2.7%) @3.9x, remaining 5:20 60522496/1545832448 ( 3.9%) @3.9x, remaining 4:54 ... 1504706560/1545832448 (97.3%) @3.9x, remaining 0:07 1523318784/1545832448 (98.5%) @3.9x, remaining 0:04 1541898240/1545832448 (99.7%) @3.9x, remaining 0:00 /dev/rcd2c: flushing cache /dev/rcd2c: writing lead-out /dev/rcd2c: reloading tray

这个 -Z 选项告诉growisofs对设备写入一个初始会话, 我这里的是写入cd2。这个 -dvd-compat 选项是关闭光盘, 它的意思是不 允许写入更多的会话。这将更好的兼容视频DVD播放器和一些老式的DVD-ROM光驱。

注意 growisofs 是怎样指定写入速度的, 这个例子中是3.9x的DVD速度, 正如dvd+rw-mediainfo显示的那样, 它是由DVD光盘和 刻录机的能力确定的。

如果您的磁盘空间不足, 不用在磁盘上写入一个ISO 9660镜像文件, 您可以将您的数据直接写入磁盘。我们先预演一下, 模拟 建立这个文件系统。

# growisofs -dry-run -Z /dev/rcd2c -R /cvs

如果这个过程成功, 我们仅需要去掉 -dry-run 选项并开始刻录DVD。

# growisofs -Z /dev/rcd2c -R /cvs

也可以使用 -M 选项在一个已有数据的DVD上追加数据, -M 参数的作用是将一个新的会话合并到已有的数据的DVD上:

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 12/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

# growisofs -M /dev/rcd2c -R /mydata

更多关于 growisofs 的信息, 请浏览它的用户手册。

当刻录完成时, 挂载它并确认是否所有数据已经写入。

为什么我不能以我希望的速度刻录?

您看到的输出信息可能与上例中不同, 也许看着像这样:

4784128/1545832448 ( 0.3%) @0.7x, remaining 26:50 7929856/1545832448 ( 0.5%) @0.7x, remaining 29:05 14123008/1545832448 ( 0.9%) @0.7x, remaining 27:06 ...

是很慢的速度。它说明不知什么原因您没有从刻录机使用的计算机总线上获得足够的吞吐量。上例中, DVD刻录机通过 USB接口连接到计算机上, 刻录机使用USB 2.0的 ehci(4) 驱动未能正确的初始化, 我们一如既往地欢迎您提供程序补丁和测试 结果。这里DVD刻录机退回至较慢的USB1.1的接口速度, 因此导致吞吐量的降低。事实上, 即使是USB1.1的接口速度限制为 12 Mbit/s, 差不多是1.43 MB/s或1.08x的DVD速度, 为减少缓冲区欠载的危险, 这个DVD刻录机将速度将低于最大值。

13.10 - 但我想使用FOO格式的媒体文件

不同音频格式之间的转换

我们假设想要从 FAQ 13 - 音频录制 将处理录制的声音。录制的声音保存为raw格式。这样在转换时很有好处。因为raw格式 不包含头文件并且可以设定成各种所需的参数。

一个音频转换工具是audio/sox, 可以从packages或ports上得到。sox支持AIFF, AU, MP3, Ogg Vorbis, RIFF WAV 以及 raw 格式, 还有其它一些奇特的格式。下例中我们将录音转换为RIFF WAV格式:

$ sox -U -c 1 -r 8000 -b myvoice.raw myvoice.wav

注意这里的指定参数对应录音时的指定参数。这仅是一个例子, 有更多的与音频相关的库文件和软件可用于音频转换。

说明:不推荐有损压缩格式之间的格式转换。例如, MP3和Vorbis在编码时丢弃了不同的原始声音波形。因此当您将MP3格式 转换为Ogg Vorbis格式时您可能会得到比原始的MP3文件更差的音质。

不同视频格式间的转换

了解下面视频格式之间的区别很重要

● 容器文件格式 - 最典型的例子是 MP4, OGG, MPEG, MOV, AVI, ASF。 ● 视频编码 - 例如 MPEG-1, MPEG-2, MPEG-4 兼容编码 (像Xvid和DivX), FFmpeg, WMV, ... - 请参阅 Wikipedia 上有关视 频编码的文章 以获得更多的信息。

目前在OpenBSD中MPEG和AVI的容器文件格式已经非常成熟了。但是ports中还没有工具可用来制作流媒体格式的MP4.

两个最常用的工具是multimedia/transcode 和 mencoder (x11/mplayer的一部分), 它们全可以调用graphics/ffmpeg的 libavcodec 库 文件以便产生极好的输出质量。当然您也可以直接使用 ffmpeg 。您还可以使用multimedia/xvidcore下的Xvid编码器。

这些软件包的说明文档可以在各自的用户手册或 /usr/local/share/doc 里找到, 它们包含了很多实例, 所以我们强烈推荐您阅读 这些文档。

13.11 - 我能在OpenBSD中播放播放流媒体吗?

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 13/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

是的, 在一些平台上完全可以正常的播放大多数音频或视频的流媒体文件, 但是还有一部分流媒体文件无法播放。

这里并非意味着在任何平台上都可以播放所有格式的流媒体文件。您可能先需要了解有关流媒体知识。一个虽有些过时但 很好的参考是 O'Reilly book 出版的Designing Web Audio中chapter about streaming media。

首先需要明白的是有一系列流媒体协议。流媒体协议定义了流媒体怎样在通过网络传输。这些协议可以有效的在互联网上 实时传送音/视频。大多数流媒体协议是应用协议(工作在internet的第7层), 它可以使用UDP或TCP(第四层)传输协议。 User Datagram Protocol(UDP, 用户数据报协议)非常适合这种类型的应用, 因为它不会重新发送数据也没有其余的开销。一些有专 利的专用协议也被开发出来, 例如微软的MMS, Real的RTSP.正如我们将看到的那样, HTTP(使用TCP)有时也同样使用, 尽管 它不像UDP, RTSP和MMS那样可以提供一个稳定比特率。

接下来, 我们讨论一下流媒体的格式, 它是如何组织音/视频数据使它们可以被播放的, 最广泛使用的流媒体格式是MP3, Real Audio(RA, RM)和Windows Media(ASF), 这些全包含专利技术。偶尔您也会遇到开放的Ogg Vorbis流媒体。

作为例子, 我将分几步解释怎样在网络上收听比利时国家广播电台。OpenBSD中因为没有浏览器嵌入式插件, 所以收听这些 新闻报道并非通常简单地点击一下鼠标就马上可以了。

● 确定流媒体协议和格式。 通常网站会告诉您在哪里可以访问他们的流媒体。这个例子中, 我是根据站点的"Listen live"链接, 然后它告诉我不支 持我的操作系统, 但是非常友善地提示我即使不使用它们的嵌入式flash播放器也可以用收听它们的MP3流媒体。另外 还显示了一系列比利时国家广播电台的链接, 我在下面的操作中会用到, 注意我在后面使用了一个具有JavaScript功能 的浏览器。 ● 找出精确的网址。 很多网站链接指向一个包含图元文件或播放列表(如M3U, ASX, RAM)的容器。这个容器包含了流媒体的实际存放位 置, 您只需保存这个文件, 然后从它里面获得流媒体文件的实际URL。 本例中, 它是

$ ftp http://internetradio.vrt.be/dab/hoeluisteren/pc/help/gebruiksvoorwaarden/stream_11.m3U $ cat stream_11.m3U http://mp3.streampower.be/radio1-mid.mp3 http://mp3.streampower.be/radio1-low.mp3 http://mp3.streampower.be/radio1-high.mp3

看起来我还可以选择低、中、高不同质量的流媒体。有些网站可以含有一些JavaScript代码来产生流媒体的URL.这种 情况下, 最好的秘诀就是分析HTML源文件及它所参考的scripts, 以便找出流媒体文件的真实地址。 ● 播放流媒体文件, 您最好的选择可能就是 x11/mplayer, 您可以从ports和packages得到它。它可以支持绝大多数流媒体 协议和格式, 它可以在amd64, i386, powerpc 和 sparc64 平台上工作。但是您也可以选择:ogg123 , 位于 audio/vorbis-tools (播放Ogg Vorbis流), audio/mpg123 位于 audio/mpg321 (播放MP3流), XMMS 位于 audio/xmms 和 Videolan Client 位于 x11/vlc。 继续举例:

$ mplayer http://mp3.streampower.be/radio1-mid.mp3

● 可选项, 您可能想在 .profile文件内加上一个别名, 这样可以稍微简单一点:

alias radio1='mplayer http://mp3.streampower.be/radio1-mid.mp3'

Windows Media(asf)流媒体通常也可以播放, 尽管它的数据必须通过 graphics/win32-codecs port提供支持, 这个win32-codecs只 能运行在i386平台(用'pkg_info win32-codecs' 命令会告诉您包含的codecs)。一些Real的音频流可以在i386平台上通过mplayer 配合graphics/win32-codecs 和 emulators/fedora/base 这两个port来进行播放。(参考邮件列表上的这个思路)

13.12 - 我的浏览器可以使用Java插件吗?(仅i386/amd64)

Java 插件是Java开发工具包(JDK)的一部分。因为许可证的原因, OpenBSD无法向用户直接提供编译好的JDK二进制 packages 。这意味着您需要自己从ports里编译它。更多关于构建JDK的信息可以在FAQ 8 - 编程语言内找到。 一旦您完成了 JDK的构建, 您就可以完全安装JDK程序包或者只安装Java执行环境(JRE, 也称作Java虚拟机), 这个虚拟机是一个子安装包, 并 且包含了浏览器插件。

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 14/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十三章 - 多媒体

在安装时, 会提示安装 Firefox 或 Seamonkey的浏览器Java插件, 根据解释创建符号链接, 然后在浏览器地址栏里键入 "about: plugins"您就看见Java插件了。

对KDE的Konqueror浏览器来说, 或者Java的二进制文件必须包含在您的PATH, 或者在菜单中配置它的绝对路径——menu Settings -> Configure Konqueror -> Java & JavaScript。默认情况下, Java二进制文件位于/usr/local/jre-version/bin/ 或 /usr/local/jdk- version/bin/ 目录内, 取决于您安装的是JRE还是JDK。

说明: 我们对Java支持的测试仅限于Firefox, Seamonkey 以及 Konqueror 浏览器。如果您在其它不同的浏览器上可以正常的工 作, 请告诉我们。

13.13 - 我的浏览器可以使用Flash插件吗?(仅i386)

Flash插件是Adobe公司以二进制格式发放的, Adobe并未提供OpenBSD本地的flash 插件, 但是提供了一个linux插件, 您可以在 linux模拟环境下使用它。这个插件仅在i386平台下有效。

继续之前, 您应该先阅读一下兼容linux(8)中有关Linux模拟的说明以及FAQ 9 - 在OpenBSD中运行Linux程序包。

如果您已经熟悉了这些, 并且您还未安装任何所需文件, 那您只需简单地添加fedora package。我们假设您已经设置了 PKG_PATH 环境变量 (参阅FAQ 15),

# pkg_add -i fedora_base

这个命令会自动设定 kern.emul.linux=1, 但并非永远更改了这个设定值。 如果您需要默认执行Linux模拟, 您需要在 /etc/sysctl. conf 文件里指定, 在 FAQ 9 - 在OpenBSD中运行Linux程序包 里有解释。

另一个您应该知道的是Linux共享库和模块不能在OpenBSD下运行, 所以您同时需要一个Linux的浏览器。

还有一个候选的Opera浏览器, 也可以从ports上得到, 我们没有为它再分发package, 因为Opera的使用许可在再分发问题上模 棱两可。但是安装port也花不了多少时间, 因为Opera提供了二进制文件。安装完Opera后您可以轻松地从ports树里安装Flash 插件。

# cd /usr/ports/www/opera # make install # cd /usr/ports/www/opera-flashplugin # make install

说明: 只执行最后一步就可以了, 然后ports会自动安装依赖包。分了读者清楚起见, 我们在这里分成了几步加以解释。

如果您遵照上面的说明进行了操作, 当您在浏览器地址栏输入 "about:plugins", Flash插件就会被列出来。

[索引] [第十二章 - 硬件与特定平台问题] [第十四章 - 配置磁盘]

[email protected] $OpenBSD: faq13.html, v 1.126 2009/01/25 18:09:49 jasper Exp $

http://www.9971.us/OpenBSD4.5/c/faq13.html(第 15/15 页)2009-5-3 23:02:49 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

[索引] [第十三章 - 多媒体] [第十五章 - Packages 和 Ports]

14 - 配置磁盘

目录

● 14.1 - 使用OpenBSD的disklabel(8)

● 14.2 - 使用OpenBSD的fdisk(8)

● 14.3 - 在OpenBSD中增加磁盘

● 14.4 - 如何处理交换

● 14.5 - Soft Updates

● 14.6 - OpenBSD/i386如何启动?

● 14.7 - 在OpenBSD中使用大磁盘有哪些问题?

● 14.8 - 安装引导块-i386/amd64特定

● 14.9 - 准备应对灾难:用磁带备份和恢复

● 14.10 - 在OpenBSD中挂接磁盘镜像文件

● 14.11 - 帮帮忙! 我遇到了IDE DMA错误!

● 14.13 - OpenBSD的RAID

● 14.14 - 为什么df(1)告诉我磁盘使用率超过100%?

● 14.15 - 在删除disklabel之后恢复分区

● 14.16 - 我能访问非FFS文件系统中的数据吗?

❍ 14.16.1 - 我的disklabel里没有那个分区! 我应该怎么办?

● 14.17 - 我能在OpenBSD中使用闪存吗?

● 14.18 - 优化磁盘性能

● 14.19 - 为什么不用异步挂载?

14.1 - 使用OpenBSD的disklabel(8)

什么是disklabel(8)?

首先, 请先阅读 disklabel(8) 用户手册。

在不同平台上进行OpenBSD分区细节上稍有差异。对i386, amd64, macppc, zaurus 和 armish 来说, 磁盘分区分为两个步 骤, 首先OpenBSD用fdisk(8)划分出一块磁盘空间供自己使用, 然后再用disklabel(8)将这块空间细分成不同的OpenBSD分 区。

所有的OpenBSD平台全使用disklabel(8)来管理OpenBSD分区, 而OpenBSD平台也使用fdisk把所有的disklabel(8)分区放到 一个fdisk分区上。

标签包含了您磁盘的特定信息, 像您的硬盘布局和上面文件系统的信息, 也包含了这块硬盘的信息, 例如转速、交错存

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 1/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

取等。由于历史原因, 这些信息经常是错的, 不过不要担心, disklabel能够通过引导程序访问磁盘, 并且可以知道这个磁 盘上文件系统的位置。更多关于disklabel的信息请阅读disklabel(5)的用户手册。

在一些平台上, disklabel破除计算机体系对磁盘分区的限制, 例如在i386平台上您只可以有4个基本分区, 但是使用 disklabel(8), 您可以把所有的OpenBSD分区(例如:'swap', '/', '/usr', '/var'等)放在一个基本分区内。这样您就可以保留另外 的3个基本分区给其它的操作系统使用。

在OpenBSD安装时使用disklabel(8)

OpenBSD安装中的一个主要任务是构建您的磁盘标签(labels)。安装过程中您用disklabel(8)来创建不同的分区。作为安 装过程的一部分, 您可以使用disklabel(8)定义您的挂载点, 但您还可以在后续安装过程或安装完成后改变这个挂载点。

不能说哪种磁盘分区的方法是最"合理"的, 但也存在很多错误的分区方式。您进行磁盘分区前请先阅读关于磁盘分区 和分区大小的讨论。

下面是在安装过程中使用disklabel(8)的一个实例, 请参看安装指南那一章的设置磁盘的内容。

安装后使用disklabel(8)

安装后, 通常使用disklabel(8)的原因是想检查您的磁盘分区设定。下面的命令将显示您目前的磁盘分区情况, 不要改动 它:

# disklabel wd0 <<-- 这里的wd0是您的磁盘设备名, 您可以改成自己需要的 # Inside MBR partition 3: type A6 start 63 size 29880837 # /dev/rwd0c: type: ESDI disk: ESDI/IDE disk label: Maxtor 51536H2 flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 16383 total sectors: 29888820 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0

16 partitions: # size offset fstype [fsize bsize cpg] a: 614817 63 4.2BSD 2048 16384 328 # Cyl 0*- 609 b: 409248 614880 swap # Cyl 610 - 1015 c: 29888820 0 unused 0 0 # Cyl 0 - 29651* d: 6291936 1024128 4.2BSD 2048 16384 328 # Cyl 1016 - 7257 e: 409248 7316064 4.2BSD 2048 16384 328 # Cyl 7258 - 7663

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 2/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

f: 1024128 9822960 4.2BSD 2048 16384 328 # Cyl 9745 - 10760 h: 2097648 7725312 4.2BSD 2048 16384 328 # Cyl 7664 - 9744

注意怎么此时只分配了部分磁盘空间, Disklabel提供两种不同的方式编辑磁盘分区, 一种是内建的命令行式编辑器(就像 安装OpenBSD时用到了), 还有一个全屏幕编辑器, 如vi(1)。您可能会觉得命令行方式简单一些, 因为它能指导您逐步完 成分区工作并提供帮助信息.但是全屏幕编辑器方式也肯定会用不上。

我们来为上面的系统添加分区。

警告:分区时的任何误操作都可能导致您的重要数据丢失, 请在使用disklabel前先备份您的重要数据!

我们这里将使用内建的命令行式编辑器, 您可以通过使用disklabel(8)+ "-E"参数的方式调用它。

# disklabel -E wd0 ... > a k offset: [10847088]Enter size: [19033812] 2g Rounding to nearest cylinder: 4194288 FS type: [4.2BSD] Enter > p m device: /dev/rwd0c type: ESDI disk: ESDI/IDE disk label: Maxtor 51536H2 bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 16383 total bytes: 14594.2M free bytes: 7245.9M rpm: 3600

16 partitions: # size offset fstype [fsize bsize cpg] a: 300.2M 0.0M 4.2BSD 2048 16384 328 # Cyl 0*- 609 b: 199.8M 300.2M swap # Cyl 610 - 1015 c: 14594.2M 0.0M unused 0 0 # Cyl 0 - 29651* d: 3072.2M 500.1M 4.2BSD 2048 16384 328 # Cyl 1016 - 7257 e: 199.8M 3572.3M 4.2BSD 2048 16384 328 # Cyl 7258 - 7663 f: 500.1M 4796.4M 4.2BSD 2048 16384 328 # Cyl 9745 - 10760 h: 1024.2M 3772.1M 4.2BSD 2048 16384 328 # Cyl 7664 - 9744 k: 2048.0M 5296.4M 4.2BSD 2048 16384 16 # Cyl 10761 - 14921 > q Write new label?: [y]

在这个例子中, disklabel很人性化地帮助我们计算了分区起始偏移量。在很多情况下disklabel可以自动完成这个工作, 但 是如果分区有"错误"时(例如:您删除了一个分区, 或者您想自虐一下), 您就需要坐下来拿一张纸和铅笔自己计算出合适 的偏移量。注意disklabel(8)计算的偏移量更权威一些, 极有可能您的计算是错误的, 仔细一点, 在您输入数值前请先搞

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 3/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

清楚这些数字的含义。

在绝大多数OpenBSD平台上您可以有16个分区 (一些特殊的平台可能只能有8个分区). 每个系统必须包含一个 'c' 分区, 它覆盖了整个OpenBSD分区, 它的 "fstype" (文件系统类型)是 "unused" , 如果您的不是这样, 那它肯定被改动过, "D" 选项 (参看下面)可以帮助您修正这个问题。除非要访问raw扇区否则不要使用 "c" 分区, 不要尝试在 "c" 分区上建立文件系 统, 在根磁盘上 "a" 分区是留给 "/" 分区专用的, "b" 分区是留给swap(交换)分区专用的, 但是只有根磁盘上的 "a" 、 "b" 分 区具有此特性, 您的其它磁盘可以使用除 "c" 外的所有其它15个分区作为文件系统。

Disklabel 的技巧和提示

● 获得帮助: 在disklabel命令行模式下, 键入"?" 将显示一个可用命令清单, "M"会显示disklabel的用户手册。 ● 重新设定成默认值: 在一些情况下, 您可能希望重新进行分区并删除所有的现存分区。 "D" 命令可以帮助您将磁 盘label成最初的状态, 就好像硬盘上从未存在过分区。 ● 复制磁盘分区: 有时候您希望将一块磁盘上的分区复制到另一块磁盘上, 但并非正合适(例如您想让两块不同大 小的磁盘都有一个同样的分区)。使用disklabel(8)的 "-e" (全屏幕编辑器)模式来获得源硬盘上的分区, 然后将其粘 贴到新硬盘上, 删除新硬盘上的源硬盘的'c'分区, 保存, 这样您就在不改变新硬盘基本参数的情况下复制了源硬 盘的磁盘布局。 ● (sparc/sparc64) 不要把swap放在磁盘非常靠近开始的位置上。 ● (i386, amd64) 不要使用第一条磁道: 在一些平台上, 一条准则就是您使用disklabel(8)和fdisk(8)时不应该占用第一 条逻辑磁道。 这条准则有时会和另一条准则"分区从第63号扇区开始"相矛盾, 但是后者仅在您的硬盘每磁道包 含63个扇区的情况下才正确(译者注:扇区编号从0开始)。您不要假设硬盘每条磁道就是包含63个扇区, 这并非永 远正确, disklabel会告诉您每条磁道包含的扇区数量。许多其它的平台允许OpenBSD的分区从0扇区开始。 ● 硬盘没有disklabel: 如果一块硬盘上目前没有一个OpenBSD的分区, 但有一个其它的文件系统(例如, 磁盘上预先 有一个FAT32的文件系统), OpenBSD内核会先在内存中"创建"一个, 这个在内存中"创建"的OpenBSD分区是硬盘 上正式的OpenBSD分区的基础, 但是如果先在硬盘上创建并保存了一个OpenBSD分区, 然后再添加一个非 OpenBSD操作系统, 这时这个OpenBSD分区不会自动更新, 如果您想要在这台计算机可以访问新的操作系统您必 须自己调整。 更详尽的信息请参阅下面。

● "q" 与 "x": 因为历史原因, 当您使用disklabel的命令行模式时, "q" 是保存更改并退出disklabel程序, 而 "x" 则是不保 存更改的内容仅退出disklabel程序。但是至今仍有很多人使用时混淆这两个含义相反的命令。尽管使用 "x" 会快 速安静地退出, 但是如果您使用"q" 命令时, disklabel(8)在保存前会有一个警告信息。

14.2 - 使用OpenBSD的fdisk(8)

确保您阅读了fdisk(8) 用户手册。 fdisk(8)在一些平台(i386, amd64, macppc, zaurus 和 armish)上被用来产生一个可被boot ROM识别的分区, 这个分区用来 存放OpenBSD的disklabel分区。其它平台不需要或不使用fdisk(8)。fdisk(8)还可用来控制影响计算机上所有操作系统的 主引导纪录(MBR)。不像其它操作系统上类fdisk命令, OpenBSD上的fdisk认为您自己知道您在干什么, 并且在很大程度 上允许您利用它强大的功能根据需求进行磁盘分区。同样它也可能允许您的误操作, 所以使用时谨慎一些。

一般, 在一块磁盘上只需建立一个OpenBSD的fdisk分区, 然后再使用disklabel将这个fdisk分区划分成OpenBSD的文件系 统分区。

如果仅想用fdisk查看您的分区表, 用:

# fdisk sd0

它会产生一个如下的输出:

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 4/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

Disk: sd0 geometry: 553/255/63 [8883945 Sectors] Offset: 0 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------*0: A6 3 0 1 - 552 254 63 [ 48195: 8835750 ] OpenBSD 1: 12 0 1 1 - 2 254 63 [ 63: 48132 ] Compaq Diag. 2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused 3: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused

本例中我们看的是第一块SCSI硬盘的fdisk输出, 我们可以看到OpenBSD的分区(A6)和其容量。* 表示这个OpenBSD分区 被设定为启动分区。

上例中我们只是查看了信息, 怎样编辑分区表呢? 要编辑分区表我们要使用 -e 选项, 它可以提供一个命令行提示符下的 fdisk交互式操作。

# fdisk -e wd0 Enter 'help' for information fdisk: 1> help help Command help list manual Show entire OpenBSD man page for fdisk reinit Re-initialize loaded MBR (to defaults) setpid Set the identifier of a given table entry disk Edit current drive stats edit Edit given table entry flag Flag given table entry as bootable update Update machine code in loaded MBR select Select extended partition table entry MBR swap Swap two partition entries print Print loaded MBR partition table write Write loaded MBR to disk exit Exit edit of current MBR, without saving changes quit Quit edit of current MBR, saving current changes abort Abort program without saving current changes fdisk: 1>

上面提供了一个使用 -e 选项后的可用命令列表。

● help 显示交互模式下可以使用的fdisk命令。 ● reinit 初始化选择的硬盘, 内存中的启动块。这是将整个磁盘分配给OpenBSD分区的快捷的方法, 更新启动代码, 让系统为安装OpenBSD做好准备(仅仅是为OpenBSD)。 ● disk 显示fdisk探测的磁盘几何。如果您需要您可以修改它。 ● setpid 更改分区表中的分区标识符。当您想重新分配现有的OpenBSD系统分区时此命令是特别有用。 ● edit 在内存中编辑当前启动块中给定表项的副本。您既可以编辑BISO几何模式, 也可以编辑扇区的偏移量和大 小。 ● flag 指定启动分区。仅可指定一个启动分区。如果您想指定一个扩展分区为启动分区, 您需要指定它为启动分 区。(OpenBSD仅能从基本分区启动, 但是您可以把任何分区设定为启动分区。) ● update 在内存中当前选择启动块拷贝里更新机器代码。 ● select 选择当前启动块中的扩展分区表项目指向的启动块并载入内存。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 5/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

● swap 交换两个MBR项目, 这样您可以重新排列MBR。 ● print 将选择的当前启动块和它的主引导记录在内存中的拷贝打印到终端上。 ● write 将启动块在内存中的拷贝写入磁盘。执行此操作时会要求您进行确认。 ● exit 退出当前fdisk操作层, 无论是退到先前选择的启动块在内存中的拷贝或没有选择直接退出程序, 不保存修改 结果。 ● quit 退出当前fdisk操作层, 无论是退到先前选择的启动块在内存中的拷贝或没有选择直接退出程序, 保存修改结 果。 ● abort 退出程序, 不保存当前更改。 fdisk 技巧和提示

● fdisk(8) 提供编辑分区的功能, 无论是原始扇区还是柱面/头/扇区的格式。提供这两个选择是为了同一个目的 ——有些工作用其中一种方式更容易, 而另一些则需用另一种方式。别在一棵树上吊死。 ● 一块完全空白的磁盘需要在上面写入主引导记录的启动代码才能启动, 您可以用 "reinit" 或者 "update"选项来完 成这个工作。如果不成功, 即使没有一块可启动磁盘, 您也可以用fdisk写入一个有效的分区表。无论什么原因, 如果您无法确认原始的启动代码是否有效, 您都可以更新它。 ● 如果您的系统有"维护"或"诊断"分区, 我们建议您保留它(们), 或者在安装OpenBSD之前创建它(们)。 ● 因为历史原因, "q" 保存更改并退出disklabel程序, 而 "x" 则是不保存更改的内容仅退出disklabel程序。 但是至今仍 有很多人使用时混淆这两个含义相反的命令。 在您保存更改前fdisk(8)不会警告, 所以请谨慎使用。

14.3 - 在OpenBSD中增加磁盘

如果您的系统已经正常安装完毕, 一旦您想为系统增加磁盘, 您需要使用 fdisk(8) (仅i386) 和 disklabel(8) 来设定 OpenBSD的磁盘。

对i386用户来说, 首先需要使用fdisk, 其它平台可忽略这一步。下例中我们为系统增加第三块SCSI磁盘。

# fdisk -i sd

这将会为了OpenBSD专用而初始化这块磁盘的"真正"分区表, 接下来您需要为建立一个disklabel。这里读者可能有些迷 惑。

# disklabel -e sd2 (screen goes blank, your $EDITOR comes up) type: SCSI ...bla... sectors/track: 63 total sectors: 6185088 ...bla... 16 partitions: # size offset fstype [fsize bsize cpg] c: 6185088 0 unused 0 0 # (Cyl. 0 - 6135) d: 1405080 63 4.2BSD 1024 8192 16 # (Cyl. 0*- 1393*) e: 4779945 1405143 4.2BSD 1024 8192 16 # (Cyl. 1393*- 6135)

首先, 忽略 'c' 分区, 它应该永远在那里, 因为这个分区是留给像disklabel这类的程序操作的!OpenBSD的文件系统是 4.2BSD, total sectors(总扇区数)代表了磁盘的大小, 也就是说这块磁盘的容量是3G, 在工厂计算的3G实际上只有3000兆。 所以6185088/3000=2061 扇区/兆(用 bc(1)), 所以确定disklabel各分区a, d, e, f, g, ... 的大小, 仅需要用X*2061就能得到X兆的

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 6/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

分区空间。您第一个新分区的偏移地址应该和每条磁道上的扇区数相同, 我们这里是63个扇区/磁道, 所以第一个分区 的偏移地址是63, 而后面每个分区的偏移地址是前面所有分区的大小与偏移量之和。(这里"c"分区除外, 因为其代表整 个OpenBSD占用的分区)

(译者注:说明一下, "the offset for partition" 我翻译成"分区偏移地址", 也就是该分区的实际起始位置——该分区的起始扇 区号, 而"the offset of partition"我翻译成"分区的偏移量"。前文已经说过, i386不能占用第一条磁道(0磁道), 因为扇区编号 从0开始, 第一条磁道上包含了0号~62号扇区, 所以新分区只能从第二条磁道上的63号扇区开始, 所以第一个分区的偏 移地址是第63号扇区, 而所有分区的偏移量全是63。如果读者难以理解请自行参照原文, 同时欢迎指正!)

或者, 如果您想在新磁盘上只建立一个分区, 假设您想用整个硬盘做为web的存储或home目录或其它什么用途, 只需用 所有扇区数减去第一条磁道的扇区数, 6185088-63 = 6185025, 您的分区是

d: 6185025 63 4.2BSD 1024 8192 16

如果所有上面这些看起来太复杂了, 您也可以使用 disklabel -E 命令使用和您安装系统时同样的分区模式! 那种情况下, 您只需输入"96M"指定"96 megabytes"的分区, 或96G指定一个96 gigs。

上面已经进行很多操作了, 但是没结束, 最后, 您还需要用newfs(8)命令在这块新磁盘上建立文件系统

# newfs sd2d

或者不管OpenBSD磁盘数字方案给您新磁盘起个什么名字(请查阅dmesg(8)的输出文件看OpenBSD是怎样命名您的磁 盘的。)

现在我们要决定将这个新分区挂载到哪里, 假设您想把它挂载到 /u, 首先创建 /u 目录, 然后挂载这个新分区。

# mount /dev/sd2d /u

最后把它加入到

/dev/sd2d /u ffs rw 1 1

怎样做您才能迁移一个已经存在的目录? 您应该挂载这个新硬盘到/mnt, 然后用cpio -pdum将/usr/local 拷贝到 /mnt 目 录, 编辑/etc/fstab(5)文件可以看见 /usr/local partition 现在是 /dev/sd2d (您刚格式化的分区)。 例如:

/dev/sd2d /usr/local ffs rw 1 1

用boot -s启动至单用户模式, 将现有的 /usr/local 目录移动到 /usr/local-backup (或者如果您觉得自己有福气, 删除它) 并 建立一个空目录 /usr/local。然后重新启动系统, 瞧, 这些文件还在那里!

14.4 - 如何处理交换

14.4.1 - 关于交换

以前有各种矛盾的规则告诉计算机管理员应该给他们的计算机配置多大的分区。可问题是一般情况下只有少量的"通

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 7/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

用" 应用程序。

很多类型的系统甚至不需要交换, 例如, 正常运行的防火墙就不需要交换。带有flash存储的计算机通常不需要交换。尽 管在很多情况下分配分配一个不大的交换分区对系统并没有损害, 但是如果你的防火墙是基于flash的, 你会受益(稍微) 于不指派一个交换分区; 很多磁盘有足够的空间指派一个小的交换分区。

有各种有关优化交换分区的技巧 (在磁盘的什么位置上, 设置在单独的磁盘上等。), 但是当你发现你在优化交换遇到问 题时, 也许你只是需要更多的内存。通常情况下, 最优化的交换方式是不设置它。

在OpenBSD中使用 swapctl(8) 程序管理交换, 它可以添加、删除、列出以及优先排列交换设备和文件。

14.4.2 - 交换到一个分区

在OpenBSD中, 启动磁盘的 'b' 分区自动设置为默认的交换分区。无需对其进行配置。如果你不希望在启动磁盘上交 换, 就不要定义"b"分区。如果你希望在别的分区或磁盘上交换, 你可以在 /etc/fstab 里进行定义, 像这样:

/dev/sd3b none swap sw 0 0 /dev/sd3d none swap sw 0 0

14.4.3 - 交换到一个文件

(注意: 如果你因为看到了 "virtual memory exhausted"错误想交换到一个文件, 你应该先用 csh的 unlimit(1) 或 sh的 ulimit (1) 放宽对每个程序的限制)

有时, 你最初设想的分区大小有问题, 你不得不增加额外的交换空间, 偶然地紧急情况(as in, "Geez, at the rate it is burning swap, we'll be wedged in five minutes"). 如果你处于这种情况下, 在一个存在的文件系统上添加一块交换空间作为一个文 件可以快速地解决。

这个文件不能在一个启用了SoftUpdate的分区上(默认情况下分区的SoftUpdate并未开启)。 开始时, 您可以用swapctl(8) 工具看一下当前有多少交换空间以及您使用了多少。您可以用这样的命令:

$ swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0

这个命令将显示当前使用的交换空间和其统计。上例中仅有一个命名为"swap_device"的设备用于交换, 这是一个在磁 盘上预先定义的用于交换的空间。(使用disklabel的查看命令查阅 b 分区)正如上例中您所看到的情况, 此时这个设备并 未被充分使用, 但是为了告诉用户如何操作, 我们假设需要额外增加32M的交换空间。

将一个文件设置为交换设备的第一个步骤就是先创建这个文件, 最好的办法是使用 dd(1) 工具创建它。这里有一个例 子就是创建一个 /var/swap 文件, 它的大小是32M:

$ sudo dd if=/dev/zero of=/var/swap bs=1k count=32768 32768+0 records in 32768+0 records out 33554432 bytes transferred in 20 secs (1677721 bytes/sec)

上步完成后, 我们可以开启这个设备的交换功能, 使用如下命令:

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 8/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

$ sudo swapctl -a /var/swap

现在我们查看一下它是否已经被正确地添加到交换设备的清单里了。

$ swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0 /var/swap 65536 0 65536 0% 0 Total 131056 8 131048 0%

现在您可以看见这个设备已经设置成功并且已经开始工作了, 您需要在 /etc/fstab 文件内添加一行以便在下次启动后系 统配置这个设备。如果您没有添加这行, 下次启动后则系统不会配置这个交换设备

$ cat /etc/fstab

/dev/wd0a / ffs rw 1 1

/var/swap /var/swap swap sw 0 0

(说明:如果您因为得到了"virtual memory exhausted"这样的错误信息而期待交换一个文件, 您应该首先用csh的 unlimit(1) 或 sh的ulimit(1) 来尝试提高预处理的限制。)

尽管定制内核也可以完成这个任务, 但交换到一个文件并非一定需要一个定制构建的内核, 本faq将告诉您如何在这两 种情况下怎样增加交换空间。

交换到一个文件。

交换到一个文件是得到额外交换空间的最简单最快速的途径。这个文件不能在一个启用了SoftUpdate的分区上(默认情 况下分区的SoftUpdate并未开启)。开始时, 您可以用swapctl(8) 工具看一下当前有多少交换空间以及您使用了多少。您 可以用这样的命令:

$ swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0

这个命令将显示当前使用的交换空间和其统计。上例中仅有一个命名为"swap_device"的设备用于交换, 这是一个在磁 盘上预先定义的用于交换的空间。(使用disklabel的查看命令查阅 b 分区)正如上例中您所看到的情况, 此时这个设备并 未被充分使用, 但是为了告诉用户如何操作, 我们假设需要额外增加32M的交换空间。

将一个文件设置为交换设备的第一个步骤就是先创建这个文件, 最好的办法是使用 dd(1) 工具创建它。这里有一个例 子就是创建一个 /var/swap 文件, 它的大小是32M:

$ sudo dd if=/dev/zero of=/var/swap bs=1k count=32768 32768+0 records in 32768+0 records out

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 9/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

33554432 bytes transferred in 20 secs (1677721 bytes/sec)

上步完成后, 我们可以开启这个设备的交换功能, 使用如下命令:

$ sudo chmod 600 /var/swap $ sudo swapctl -a /var/swap

现在我们查看一下它是否已经被正确地添加到交换设备的清单里了。

$ swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0 /var/swap 65536 0 65536 0% 0 Total 131056 8 131048 0%

现在您可以看见这个设备已经设置成功并且已经开始工作了, 您需要在 /etc/fstab 文件内添加一行以便在下次启动后系 统配置这个设备。如果您没有添加这行, 下次启动后则系统不会配置这个交换设备

$ cat /etc/fstab /dev/wd0a / ffs rw 1 1 /var/swap /var/swap swap sw 0 0

下面保留的是此FAQ修改前的内容———1..

通过一个vnode设备进行交换

这是增加更多交换空间的更永久性的解决方案。要永久地使用一个文件进行交换, 首先定制一个带有vnd0c做为交换空 间的内核。如果您用wd0a作为您的根文件系统。那么wd0b就是以前的交换分区, 将下面的内容应用到内核配置文件上 (如果您有什么疑问请参阅编译新内核的相关内容):

config bsd root on wd0a swap on wd0b and vnd0c dumps on wd0b

做完上面这步, 这个用于交换的文件就可以被创建了。您还应该做与上例同样的步骤。

$ sudo dd if=/dev/zero of=/var/swap bs=1k count=32768 32768+0 records in

32768+0 records out

33554432 bytes transferred in 20 secs (1677721 bytes/sec)

现在您的文件已经就位了, 您需要将它加入 /etc/fstab 。 下面是一个范例, 这个设备作为交换随系统启动。

$ cat /etc/fstab

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 10/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

/dev/wd0a / ffs rw 1 1 /dev/vnd0c none swap sw 0 0

这时您的计算机需要重新启动以便应用内核的更改。重新启动后就是就是配置这个设备进行交换了。您要使用 vnconfig(8)。

$ sudo vnconfig -c -v vnd0 /var/swap

vnd0: 33554432 bytes on /var/swap

现在进行最后一步, 开启此设备的交换功能。我们还和上面的例子一样使用swapctl(8), 接着我们将检查它是否被正确 地添加进交换设备列表中了。

$ sudo swapctl -a /dev/vnd0c $ swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0 /dev/vnd0c 65536 0 65536 0% 0 Total 131056 8 131048 0%

14.5 - Soft Updates

Soft Update是由 Greg Ganger and Yale Patt 提出的想法, 并由 Kirk McKusick 在FreeBSD上进行了发展。SoftUpdates在buffer cache操作时强制采用一个部分按顺序的方式, 这样就允许从FFS代码中删除对目录项执行同步写操作的请求。因此, 在 磁盘写操作时的性能表现有很高的提升。

要在分区上启用soft update功能, 必须在挂载分区使用mount-time选项。当您用 mount(8) 工具挂载分区时, 您可以指定 在这个分区上启用soft updates功能。下例中是一个 /etc/fstab(5) 的条目, 我们希望在这个条目中指定一个 sd0a 分区在挂 载时启用soft update功能。

/dev/sd0a / ffs rw, softdep 1 1

注意, 对sparc用户: 不要在sun4 或 sun4c计算机上启用这个功能, 这类构 架仅支持非常有限的内核内存并且无法使用这 个功能, 然而soft update在s un4m计算机上工作的很好。

14.6 - OpenBSD/i386如何启动?

OpenBSD/i386的启动过程并非是区区小事, 并且清楚他是如果工作的是 很有用的, 它可以帮助您在系统出现问题时进 行排查。这里列出了启动过程 中的四个关键点:

1. 主引导记录(MBR): 主引导记录是在硬盘上第一个物理 扇区(512 bytes)。它包含了基本分区表和加载分区引导记 录(PBR)的一小 段程序代码。这里请注意, 在某些环境中提到的"MBR"是仅指磁盘上第一扇区的代码部分, 而不 是包含了第一扇区的全部内容(还包含分区表)。理解"初始化MBR"是十分重要的——在OpenBSD的中这个术语 的含义是指重写所有的MBR扇区, 而不是像某些操作系统那样仅仅重新写入程序代码。您很少需要初始化MBR, 相反您可能会在命令行经常用到fdisk(8)的"-u"选项 (例如:"fdisk -u wd0")。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 11/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

尽管OpenBSD包含一个MBR, 但是您不一定非要使用它, 因为几乎所有的MBR全可以启动OpenBSD。控制MBR 的是 fdisk(8) 工具, 它既可以编辑分区表也可以在磁盘上安装MBR程序代码。

OpenBSD's MBR会显示如下信息:

Using drive 0, partition 3

这表明从drive0的partition 3加载PBR。 除了这些明显的信息, 他还在后面显示了一个句号 ("."), 它表示这台 计算 机可以使用LBA转换来启动, 如果这台计算机不能使用LBA转换, 上面的句号将会被分号(";")取代, 表明使用CHS 转换:

Using Drive 0, Partition 3;

注意:这个句号或分号表明这是一个"新"的OpenBSD MBR, 这个特性从OpenBSD 3.5开始引入。 2. 分区引导记录(PBR): 分区引导记录也称为 PBR 或 biosboot(8) (来自其保存的代码名称), 它是在磁盘上OpenBSD 分区的第一个物理扇区, 加载PBR是OpenBSD的 "第一阶段 boot loader"。它是被MBR程序加载的, PBR的任务是加 载OpenBSD "boot loader"的第二阶段 boot(8)。和MBR一样, PBR也是一个非常小的区域, 它包含了代码和数据的, 仅有512 bytes。 它不能放入一个文件系统可识别的完整的应用程序, 所以它仅用来定位磁盘上的 /boot目录, 在安 装的系统时可被BIOS访问的 /boot目录的位置被编码到PBR代码。

PBR是被程序 installboot(8) 安装的, 这篇文章后面会对installboot(8)有更详尽的描述, PBR会显示如下信息:

Loading...

当每一个文件系统拒绝其加载时就会在屏幕上输出一个句号。和MBR一样, PBR 也可以表明它是使用LBA或 CHS模式转换, 如果它使用CHS转换加载, 会显示一个 分号:

Loading;...

3.5以前的版本biosboot(8)显示的信息是 "reading boot..."。 3. Boot Loader的第二阶段, /boot: /boot被PBR加载, 它的任务是通过计算的BIOS访问OpenBSD的文件系统并定位和 加载实际使用的内核。 boot(8)还向内核传递不同的选项和信息。

boot(8) 是一个交互式的程序, 它被加载后会尝试定位并读取 /etc/boot.conf 文件, 如果这个文件存在(默认安装并 不生成这个文件), 除非 /etc/boot.conf 文件有其它指令, 否则boot会执行它的所有命令, 然后给用户一个提示符:

probing: pc0 com0 com1 apm mem[636k 190M a20=on] disk: fd0 hd0+ >> OpenBSD/i386 BOOT 3.02 boot>

它在 "boot>"提示符这里会默认等待用户5秒钟, 以便让用户给它其它指令, 如果用户在超时前未提供指令, 它 才 会执行默认操作: 从计算机的第一个磁盘内的root分区加载内核bsd。boot loader的第二阶段是通过BIOS(因为目 前OpenBSD的内核尚未加载)探(检)测系统硬件 。上面您可以看见它寻找和发现了一些东西: ❍ pc0 - 代表i386系统的标准的键盘和视频显示。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 12/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

❍ com0, com1 - 两个串口。 ❍ apm - BIOS高级电源管理功能。 ❍ 636k 190M - BIOS发现的常规内存数量(636K)和扩展内存数量 (190M)。(译者注:关于常规内存和扩展内存 看这里。)

❍ fd0 hd0+ - BIOS发现的磁盘设备, 本例中, 一个软盘驱动器和 一个硬盘。 这个"hd0" 后面的 '+' 号是BIOS告诉 /boot 这块磁盘可以通过LBA寻 址方式访问。当您执行首次安装时, 您有时可 能会看见硬盘 后面有一个'*'——它表示这块硬盘上没有有效的OpenBSD标签。 4. 内核: /bsd: 启动过程的目标就是将OpenBSD内核 加载进RAM并正确地运行。一旦内核被加载, OpenBSD就可以 不用再通过BIOS而直接 访问硬件了。

所以, 最开始的启动过程可能看起来像这样:

Using drive 0, partition 3. <- MBR Loading.... <- PBR probing: pc0 com0 com1 apm mem[636k 190M a20=on] <- /boot disk: fd0 hd0+ >> OpenBSD/i386 BOOT 3.02 boot> booting hd0a:/bsd 4464500+838332 [58+204240+181750]=0x56cfd0 entry point at 0x100120

[ using 386464 bytes of bsd ELF symbol table ] Copyright (c) 1982, 1986, 1989, 1991, 1993 <- Kernel The Regents of the University of California. All rights reserved. Copyright (c) 1995-2008 OpenBSD. All rights reserved. http://www.OpenBSD.org

OpenBSD 4.5 (GENERIC) #1749: Sat Feb 28 14:51:18 MST 2009 [email protected]:/usr/src/sys/arch/i386/compile/GENERIC ...

可能的错误

● 损坏的/无效的/不兼容的 MBR: 通常, 一个用过的硬盘上有某种MBR代码, 但是如果是新硬盘或者从一个不同平 台移 过来的硬盘, 还有就是您在安装过程中回答"Use entire disk?"这个问题时没有选择"Yes", 以上这些硬盘可能 没 有有效的MBR, 这种情况下即使这些硬盘的分区表是有效的也无法启动。

您可以使用fdisk程序在您的硬盘上安装OpenBSD的MBR。用您的安装介质启动, 选择 "Shell"得到一个命令行提 示符:

# fdisk -u wd0

您也可以用fdisk给硬盘安装一个指定的MBR:

# fdisk -u -f /usr/mdec/mbr wd0

这个命令将把 /usr/mdec/mbr 文件安装为您系统的MBR。这个特定的文件 在标准安装中作为OpenBSD的标准 MBR内嵌于fdisk, 但是您也可以在这里指定任何其 它的MBR。 ● PBR内 /boot 位置无效的: 当installboot(8)安装分区引导记录时, 它将 /boot 的inode的区块号和 偏移量写入PBR, 因

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 13/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

此, 删除后更换 /boot 而没有重新运行installboot(8) 将会导致您的系统无法启动, 因为PBR会 从已经写入的inode 的指定位置进行引导, 而此时这个位置已经不再是启动第二阶段 boot loader的所在位置了! 因为 /boot 是通过 BIOS调用被读取, 所以旧 版本(OpenBSD 3.5以前版本的)的PBR对BIOS的磁盘转换模式很敏感, 如果您改变了 磁 盘的几何(例如将磁盘从一台使用CHS转换的计算机上移到一台使用LBA转换的计算 机上, 或者甚至是在您的 BIOS上更改了转换方式), 看起来似乎BIOS到了一 个不同的位置(实际是原先的数据移动到不同的数字块上了), 所以您必须先运行 installboot(8)系统才可能重新启动。新(OpenBSD3.5及以后)版本的PBR对转换模式 的改变要 宽容得多。

因为PBR很小, 它的能提供错误信息非常有限, 甚至在某种程度上说晦涩难懂, 多数的 信息像这样:

● ERR R -- 当BIOS尝试读取磁盘上的一个数据块时返回的错误信息, 通 常情况下这个信息是告诉您:您的磁盘不可 读。 ● ERR M -- 从第二阶段boot loader的头文件里读到了一个无效的 magic(5)数字, 通常这条信息的意思是:BIOS读取 的位置并非/boot, 通常意味着没有正确运行installboot(8), 还有可能就是 /boot 文件被改变了, 或者您的BIOS不能 读取一块大硬盘。

其它错误信息的详细解释在biosboot(8)用户手册里。

有关 i386 启动过程更详尽的信息, 看:

● boot_i386(8)

● http://www.ata-atapi.com/hiw.htm Hale Landis' "How it Works" documents.

14.7 - 在OpenBSD中使用大磁盘有哪些问题?

OpenBSD支持 FFS 和 FFS2 (也被称为 UFS 和 UFS2)文件系统。4.3以前版本采用 FFS文件系统, 从4.3版本开始采用FFS2 文件系统。在讨论每个文件系统的限制之 前, 我们先看一些更常见的硬件系统的限制。

当然, 文件系统的能力和特定硬件的能力是两回事。一个新的250G的IDE硬盘可能用在一个老的(最大仅识别137G的 BIOS)接口上会出问题, 一些非常老式的SCSI适配器在连接新硬盘时会有一些问题, 当您将一块新容量的硬盘接到一台 很老的计算机上时, 它的BIOS可能会停止响应。您需要考虑自己硬件的能力。

分区大小和位置的限制

非常遗憾, 在OS被装入内存以后才能完全发挥OS所有的功能, 在此之前启动过 程仅能利用(这也是限制所在)系统的启 动只读存储器。

因为这个原因, 全部 /bsd 文件必须位于启动只读存储器可寻址的范围内, 这 意味着在一些老的i386系统上root分区必须 完全位于前面的504M, 但是新一些的 计算机可能限制为2G, 8G, 32G, 128G或更多。值得提醒的是许多相对较新支持 128G以上硬盘的计算机实际上也有启动分区必须在前面128G的限制。您可以让这 些系统使用大硬盘, 但是您的驱动分 区必须在启动只读存储器所支持的范围内。

注意有可能您在一台旧的486电脑上安装了一个40G的硬盘, 并且将它做为一个大 分区装入OpenBSD, 您觉得自己已经 成功地突破了上面所说的限制, 然而, 这些讨厌 的限制可能会神不知鬼不觉地又回到您的身边:

● 您将系统安装在一个40G的 / 分区上。它看起来工作很正常, 因为基本的OS和其所有文件(包含 /bsd)全在分区最 前面的504M范围内。 ● 您使用这个系统, 最终系统所包含的文件总大小超过了504M。 ● 您升级系统, 构建自己的内核, 不管怎样您要拷贝新 /bsd 覆盖旧的。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 14/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

● 您重新启动。 ● 您在启动时看到了一个诸如"ERR M"或其它问题的信息。

为什么呢?因为当您使用新的 /bsd 文件"覆盖"老文件时, 实际系统并不是在原来的位置上重写了旧文件, 而是将新文件 部署在磁盘上的一个新位置, 可能这个位置正好在BIOS支持的504M以外, 重新启动后因为驱动引导器(boot loder)无法 找到 /bsd 文件, 所以系统挂起。

要想让OpenBSD启动, 启动引导器(biosboot(8)和i386/amd64中的 /boot文件)和内核(/bsd文件)必须位于启动只读存储器 所支持并力所能及的范围内。安全的运行规则很简单:

整个的root分区必须在计算机的BIOS(或启动只读存储器)可寻址的范围内。

一些非i386用户可能会觉得他们不存在此问题, 然而大多数平台全有启动只读存储器对磁盘的某种使用限制。请您自 行找出自己平台的这些限制, 尽管这可能有些难度。

这就是为什么您应该在硬盘上建立不同的分区, 而不应该把您的系统安装在一个大分区内。 fsck(8)所需的时间和内存

另一个大文件系统需要考虑的是当系统崩溃或断电后fsck(8)文件系统所需的时间和内存。不要奢望一个120G的硬盘装 在仅有32M内存的系统可以在崩溃后成功地进行fsck(8), 一条粗略的准则是如果要成功运行fsck, 每1G磁盘空间至少需 要1M内存。虽然这种情况下可以使用交换, 但是系统性能会急剧下降, 除极其特殊的情况外这种性能下降是令人无法 忍受的。

如果文件系统容量过大, fsck磁盘的时间就会变成一个问题, 但是您只需fsck那些已被分配用来挂载文件系统的空间, 所 以这也是不要将大磁盘所有的空间都分配给系统的另一个原因。保持文件系统以只读方式挂接或不挂接可以让您踢 掉电源线后不必fsck它们。

别忘了, 如果您的系统有多块磁盘, 一旦系统崩溃需要同时fsck全部硬盘, 所以这会比fsck单块硬盘需要更多的内存。

当您在1T的硬盘上采用默认的碎片或数据块大小时, 因OpenBSD系统的限制, 需要1G的内存才能运行fsck。大的碎片和 (或者或)大的数据块可以减少inodes的数量, 并且允许更大的文件系统。

FFS 和 FFS2

使用FFS时, OpenBSD最大支持的单独文件系统为231-1, 或者说2, 147, 483, 647个扇区, 因为每个扇区是512个字节, 所以这 是一个远小于1T的数值。FFS2就可以提供大得多的文件系统, 一般在远没有没有到FFS2文件系统的极限时已经超出了 其它系统限制的范围。

启动或安装内核仅支持FFS文件系统, 不支持FFS2, 所以关键的系统分区(/, /usr, /var, /tmp)不应该采用FFS2文件系统, 还 有就是可能出现严重维护问题的分区也应避免采用FFS2文件系统(这些分区通常没有理由分配的过大)。基于这个原 因, 非常大的分区应该是"非系统"分区, 例如, /home, /var/www/, /bigarray等分区。

升级系统前, 您需要将所有的FFS2分区标记为"noauto, 以避免被安装内核(安装内核不识别FFS2分区)错误处理。

注意并非所有的控制器和驱动都支持大硬盘, 例如, ami(4)仅支持最大2TB的逻辑卷, 还有很多尚未完成测试, 例如, 在写 这篇文章时, 还没有大于1TB的IDE或SATA硬盘的驱动可用于测试, 所以我们目前不能说所有事情全不会出问题。

14.8 - 安装引导块-i386/amd64特定

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 15/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

现代版本的OpenBSD(3.5及以后)有一个强劲的启动引导器, 与老版本相比, 磁盘几何对新的启动引导器来说更加无关紧 要, 然而, 新启动引导器对 /boot 文件在磁盘上的位置却很敏感。如果您做了什么导致boot(8)移动到一个磁盘上的新位 置(实际上是一个新的inode), 您就"破坏"了您的系统——阻碍它正确的引导。为了修复您的引导块以便系统可以正常 启动, 您只需将启动软盘放在驱动器内(或启动光盘)并在出现boot提示符时键入"b hd0a:/bsd", 这样可以强制它从第一块 硬盘(而不是软盘)启动。您的系统会正常启动的。现在您需要基于/boot文件的位置重新用 installboot(8) 程序安装第一 阶段启动引导器(biosboot(8))。

我们的例子假设您的启动磁盘是sd0(IDE硬盘应该是wd0等):

# cd /usr/mdec; ./installboot /boot biosboot sd0

如果需要一个新版本的引导块, 您需要自己编译它们, 很简单:

# cd /sys/arch/i386/stand/ # make && make install # cd /usr/mdec; cp ./boot /boot # ./installboot /boot biosboot sd0 (或您自己的设备号)

14.9 - 准备应对灾难:用磁带备份和恢复

介绍:

如果您计划在一台可能被称为生产型服务器的计算机上运行OpenBSD, 在您的硬盘可能出现问题前有某种形式的备份 是很明智的。

这个介绍将帮助您使用OpenBSD自带的标准 dump(8) 或 restore(8) 工具进行这项工作, 一个更高级的备份工具被称为 "Amanda", 也可以通过 packages 得到, 它可以将多台服务器备份到一个磁带机上。多数环境下 dump(8) 或 restore(8) 工 具已经足够了, 但是如果您需要备份多台服务器, Amanda值得您研究一番。

本例中需要配置的设备包含SCSI硬盘和磁带机。生产环境中更推荐使用SCSI硬盘而非IDE硬盘是因为它们处理坏块的 方式不同。这并不是说如果您使用IDE硬盘或其它的磁带机本文档对您就没有用处了, 而是您的设备名称可能会稍微 有些差异, 例如在IDE环境中sd0a可能换成wd0a。

备份到磁带:

备份到磁带您需要知道您的文件系统挂载到哪里。您可以在shell提示符下使用 mount(8) 命令来确定您的文件系统是 怎样挂载的。您应该获得类似的输出信息:

# mount /dev/sd0a on / type ffs (local) /dev/sd0h on /usr type ffs (local)

本例中, root (/) 文件系统实际位于sd0a, 这说明 / 在0号SCSI硬盘的a分区上。/usr 文件系统位于sd0h, 也就是在0号SCSI硬 盘h分区上。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 16/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

另一个更复杂的挂载表也许是这样的:

# mount /dev/sd0a on / type ffs (local) /dev/sd0d on /var type ffs (local) /dev/sd0e on /home type ffs (local) /dev/sd0h on /usr type ffs (local)

这个更复杂的例子中, root (/) 文件系统位于sd0a. /var 文件系统位于sd0d, /home 文件系统位于sd0e 还有 /usr 位于 sd0h。

为了备份您的系统您要告诉dump您需要备份分区的名称, 下面的命令是备份上面列出的那个较简单的挂载表中的分 区:

# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h # mt -f /dev/rst0 rewind

对那个比较复杂的挂载表, 您可以使用类似的命令:

# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0d # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0e # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h # mt -f /dev/rst0 rewind

您可以复习一下 dump(8) 的用户手册以精确地掌握每个命令行的作用, 这里简要解释一下上面使用的参数:

● 0 - 执行一个0级dump, 获得所有。 ● a - 尝试自动检测磁带长度。 ● u - 更新文件 /etc/dumpdates 到最后一次执行备份时指定的位置。 ● f - 使用哪种磁带设备 (本例中是 /dev/nrst0 )

最后是备份哪些分区(/dev/rsd0a等) mt(1) 命令用于设备倒带结束时, 更多的选项请复习mt的用户手册(像弹出)。

如果您不确定您的磁带设备名称, 请使用dmesg定位它。例如磁带设备的条目看起来像这样:

st0 at scsibus0 targ 5 lun 0:

您可能已经注意到了当备份时磁带机用"nrst0"名称替代了dmesg里面我们看到的"st0"的名称。当您用nrst0的名称访问st0 时, 您访问的实际上是同一台物理磁带机, 但是等于告诉磁带机不要在工作结束时倒带, 并且是以原始模式进行访问。 如果要将多个文件系统备份到单一的磁带上, 您需要确保您使用的是不倒带的设备, 如果您使用的是倒带的设备(rst0) 来备份多个文件系统, 早晚后面的备份的文件系统会覆盖前面已经备份的文件系统。您可以在dump的用户手册上发现 更详尽的描述。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 17/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

如果您想写一个叫"backup"的脚本, 它可能看起来像这样:

echo " Starting Full Backup..." /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a /sbin/dump -0au -f /dev/nrst0 /dev/rsd0d /sbin/dump -0au -f /dev/nrst0 /dev/rsd0e /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h echo echo -n " Rewinding Drive, Please wait..." mt -f /dev/rst0 rewind echo "Done." echo

如果您希望夜间定时备份, 可以用 cron(8) 来自动运行您的备份脚本。

同样将每个文件系统需要多大的空间记录下来(写在一张纸上)也是很有用处的。您可以使用 "df -h" 来测定当前正在使 用的各个分区占用多少空间, 这在硬盘发生故障或需要在一个新的硬盘上重新创建您的分区表是很方便的。

还原数据还可以帮助您减少磁盘碎片。确保可以备份所有的数据的最好方式是重新启动计算机并进入单用户模式。 文件系统不需要挂载就可备份。但重新启动至单用户模式时别忘记用可读/写的方式挂载根分区(/), 否则您的当您的 dump尝试写出dumpdate时会失败。当出现boot>提示符时键入"bsd -s"就可以进入单用户模式。

校验一个备份磁带的内容:

当您第一次完成文件系统备份时, 简单测试一下您的磁带以确保您所需备份的数据已经被写入是一个好想法, 您可以用 下例给备份磁带上的文件编目录:

# /sbin/restore -tvs 1 -f /dev/rst0

这条命令会列出备份磁带上存储的第一个分区 1 上的文件列表。根据上面的例子, 分区 1 应该是您的 根(/)文件系统。

要查看磁带上第二个分区的内容并输出到一个文件, 您可以使用类似下面的命令:

# /sbin/restore -tvs 2 -f /dev/rst0 > /home/me/list.txt

如果您的挂载表如前所述是一个简单的挂载表, 分区 2 应该是 /usr, 如果您的挂载表更复杂, 分区 2 可能是 /var 或其它的 文件系统。这里的系列号取决于该文件系统写入磁带的顺序。

从磁带还原:

当您的硬盘完全损坏了时下面例子中的情况对您会有用处。在这个例子中您想从磁带上还原一个单独的文件, 请复习 一下restore的用户手册注意一下交换模式下的指令。

如果您完全准备妥当, 换一个硬盘并还原您备份的数据是一个很快的过程。标准的OpenBSD 安装/启动 软盘已经包含 了所需的还原工具, 同时分区和新硬盘启动所需的二进制文件也包含在里面。多数情况下您只需这张软盘和最近的备 份磁带就可以将备份数据还原并运行它。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 18/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

更换掉损坏的硬盘后, 还原系统的基本步骤如下:

● 从安装软盘启动, 在菜单处选择shell。设置好写保护并将您最近的备份磁带插入磁带机内。 ● 使用fdisk(8) 命令在新硬盘上创建一个基本的OpenBSD分区。例如:

# fdisk -e sd0

更多信息请参看fdisk FAQ。

● 用disklabel命令在您刚用fdisk创建的OpenBSD基本分区上创建OpenBSD分区表, 例如:

# disklabel -E sd0

(别忘了交换分区swap, 更详尽的信息请参看disklabel FAQ)

● 用newfs命令在您上步刚创建的各个OpenBSD分区上建立干净的文件系统, 例如:

# newfs /dev/rsd0a # newfs /dev/rsd0h

● 将刚准备好的根(/)文件系统挂载到 /mnt, 例如:

# mount /dev/sd0a /mnt

● 进入您挂载的那个根文件系统, 然后开始还原。例如:

# cd /mnt # restore -rs 1 -f /dev/rst0

● 用下面的命令将MBR写入新硬盘使其可启动, 例如:

# fdisk -i sd0

● 除了向硬盘写入一个新的MBR, 您还要安装启动块以便它可以启动, 下面是一个简单的例子:

# cp /usr/mdec/boot /mnt/boot # /usr/mdec/installboot -v /mnt/boot /usr/mdec/biosboot sd0

● 您硬盘的新根文件系统已经准备好了, 接下来您可以用它启动并继续还原剩下的文件系统, 因为此时您的操作系 统不完整, 所以您需要进入单用户模式来还原。在shell提示符下运行如下命令, 卸掉挂载的文件系统并停止系统 运行:

# umount /mnt

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 19/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

# halt

● 取出安装软盘并重新启动计算机, 在 boot> 提示符下, 运行如下命令:

boot> bsd -s

bsd -s命令会使计算机进入单用户模式, 此模式仅需要根(/)文件系统。 ● 我们假设您上面的操作步骤全正确无误, 并且没有出现其它问题, 您现在应该看加一个让您输入shell或键入return 的提示, 您只需回车使用sh。接下来您用可读写模式(而非仅是只读模式)挂载根分区。运行下面的命令:

# mount -u -w /

● 一旦您用可读写模式挂载了根分区, 就可以继续还原剩下的文件系统了。例如: (简单的挂载表)

# mount /dev/sd0h /usr; cd /usr; restore -rs 2 -f /dev/rst0

(复杂的挂载表)

# mount /dev/sd0d /var; cd /var; restore -rs 2 -f /dev/rst0 # mount /dev/sd0e /home; cd /home; restore -rs 3 -f /dev/rst0 # mount /dev/sd0h /usr; cd /usr; restore -rs 4 -f /dev/rst0

您可以使用 "restore rvsf" 替代仅有 rsf 的选项以便在还原过程中查看从备份设备中提取的文件名称。

● 最后当您将所有的文件系统恢复到硬盘后, 重新启动至多用户模式。如果一切顺利您的系统将恢复到您最近的 磁带备份时的状态, 又可以使用了。

14.10 - 在OpenBSD中挂接磁盘镜像文件

在OpenBSD中挂载一个磁盘镜像文件(ISO 镜像, 用dd命令生成的磁盘镜像等)您必须配置一个 vnd(4) 设备。例如, 您的 一个ISO镜像文件在 /tmp/ISO.image, 您需要参照如下步骤来挂载。

# vnconfig svnd0 /tmp/ISO.image # mount -t cd9660 /dev/svnd0c /mnt

注意, 因为这是一个用于CD和DVD的ISO-9660镜像, 您挂载时必须指定它的类型为cd9660。没错任何镜像类型全需要 指定, 例如, 您想挂载一个Linux磁盘镜像文件, 您就需要将它的类型指定为ext2fs。

挂载这个镜像文件用如下命令。

# umount /mnt # vnconfig -u svnd0

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 20/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

更多的信息请参考 vnconfig(8) 的用户手册。

14.11 - 帮帮忙! 我遇到了IDE DMA错误! pciide(4)支持DMA IDE传输, 但pciide(4)在很多硬件组合环境中不可靠, 就在最近那些宣称支持IDE DMA传输的大多 数"主流"操作系统默认并没有打开这项功能, 这就是因为不可靠的硬件。现在许多这些计算机使用OpenBSD系统。

OpenBSD尽力尝试使用它能配置的最高的DMA模式。这样做在某些配置条件下可能会导致传输能力恶化, 原因就是有 瑕疵的主板芯片组、驱动程序以及(或或者)电缆上的噪声。幸运的是, Ultra-DMA模式通过一个循环冗余校验(CRC)检 测数据传输恶化以保证数据传输。当Ultra-DMA的CRC失败时, OpenBSD会打印一条错误信息并再次尝试操作。

wd2a: aborted command, interface CRC error reading fsbn 64 of 64-79 (wd2 bn 127; cn 0 tn 2 sn 1), retrying

经过一定次数的失败后, OpenBSD会将传输模式降为一个较慢的(希望更可靠)Ultra-DMA模式。如果已经降为Ultra- DMA模式0了, 则驱动降级为PIO模式。

低质量或损坏的线缆常常会导致UDMA错误。如果您看到许多DMA错误或者比正常情况下低很多的DMA性能那么通 常值得怀疑的是线缆出问题了。同样将一个CD-ROM和一个硬盘放在同一个通道内也是一个坏主意。

如果您更换了电缆仍不能解决问题并且通过OpenBSD也不成功地降级, 或者这个过程导致硬盘更卡了, 或者控制台或 log文件里有大量的警告信息, 那么您可能希望强制系统使用一个低水平的DMA或系统默认的UDMA模式, 您可以通过 使用 UKC 或 config(8) 命令修改 wd(4) 设备的标记来完成这一工作。

14.13 - OpenBSD的RAID

RAID(廉价冗余磁盘阵列)提供了一个使用多个磁盘以获得比单一磁盘更好的性能、容量及/或冗余的机会。然而关于 RAID的优缺点的完整讨论超出了本文范围。我们仅罗列一些重点:

● RAID和备份毫无关系。 ● RAID并不会消除停机时间。

如果这些事您头一次听说, 这可不是您探索RAID的好起点。

选择软件

OpenBSD包含了RAIDframe, 一个软件RAID解决方案。有关文档可在下列地方找到:

● Disk Optimization, RAID

● RAIDframe Homepage

● man page for raidctl(8)

● man page for raid(4)

OpenBSD可以通过RIADframe的 "Autoconfiguration" 选项直接为根分区做镜像。

OpenBSD 3.7稳定版或更高的版本也将 ccd(4) 驱动的镜像功能做位一个特性。这个系统特性已经被内置于GENERIC内 核中并且在某些平台(amd64, hppa, hppa64, i386)上也包含在bsd.rd内核中, 所以使用它很简单, 尽管就重建阵列来说它还

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 21/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

有一定的局限性, 请参阅:

● ccd(4) man page

● ccdconfig(8) man page

选择硬件

许多OpenBSD平台支持各种各样的硬件RAID产品。每个平台不同, 要找支持的RAID硬件可以看 这里。

另一个许多平台可选择的方案就是将许多磁盘绑定在一起作为一块单独的IDE或SCSI硬盘, 然后接入一个标准的IDE或 SCSI适配器。这些设备几乎可以运行在所有的支持IDE或SCSI的平台上。

下面列出了一些该类产品的制造商:

● Arco

● Accusys

● Maxtronic

● Infortrend

(注意:这些仅仅是OpenBSD用户报告的他们正在使用的产品——这并非意味着我们对这些产品有任何认可, 而且这份 清单也不详尽。)

非选项

一个在邮件列表中经常被问到的问题是 "OpenBSD支持廉价的IDE 或 SATA RAID 控制器(诸如Highpoint, Promise 或者 Adaptec HostRAID chips)吗 ?", 答案是"不支持"。这些卡或者芯片组并非真正的硬件RAID控制器, 而仅仅是通过BIOS协 助启动的软件RAID。因为OpenBSD 已经提供了与硬件无关的软件RAID方式, 所以没有必要让OpenBSD的开发人员再 为这些卡提供特殊的支持。

几乎所有的板载SATA 或 IDE "RAID" 控制器全是这种基于软件的RAID设计, 通常情况下这些控制器被当作SATA 或 IDE 控制器, 并且在标准的 IDE 驱动程序 (pciide(4))下工作良好, 但是不是像OpenBSD下的硬件RAID控制器那样工作 的。

14.14 - 为什么df(1)告诉我磁盘使用率超过100%?

用户有时会吃惊地发现他们的可用磁盘空间是负数或一个文件系统的使用率超过了100%, 就像用 df(1)显示的那样。

当用newfs(8)创建一个新的文件系统时, 占用了一些普通用户不能使用的系统保留空间。当您意外地将数据它拷入该的 文件系统时它提供了一定的容错率, 这样可以将您的磁盘碎片保持在最低水平。

默认情况下磁盘还有5%的余量, 所以如果root用户小心地向这个磁盘拷贝数据, 您会发现系统使用了105%的磁盘空 间。

如果5%的余量对您来说不合适, 您可以通过 tunefs(8) 命令修改这一数值。

14.15 - 在删除disklabel之后恢复分区

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 22/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

如果您的分区表损坏了, 您可以通过各种途径尝试进行修复。

首先是恐慌, 反正您经常这样, 索性就先恐慌完好了。 只是别作愚蠢的事情, 不要在您的计算机前面恐慌, 然后放松下 来, 想想下面这些步骤可否帮助您摆脱困境。

每个磁盘的disklabel的作为日常的系统维护保存在 /var/backups 下, 这里假设您的 /var 分区还在, 您可以简单地阅读一下 输出文件, 并将它们放回到disklabel中。

如果您找不到 /var 分区了, 有两个选择:尽量地修复磁盘找回分区, 或者尽量地修复磁盘拷贝出您的数据。根据发生的 具体情况做出选择(如果硬盘要坏了优先抢救数据, 如果只是误操作, 您只恢复分区就可以了。)

第一个您需要的工具就是 scan_ffs(8) (注意这里有一个下划线, 不是"scanffs")。scan_ffs(8)将会彻底审查一块磁盘, 并且尝 试并寻找分区, 并告诉您它发现的关于这些分区的信息。您可以使用这些信息来重建您的disklabel。如果您只希望 /var 恢复原状, 您只需为 /var 重新建立分区, 然后用备份覆盖它并从备份向分区添加其它的项目。 disklabel(8) 即能更新disklabel使内核可以识别, 也可以将卷标(label)写入磁盘(disk)。所以即使磁盘上有一块区域包含的 disklabel不可读, 您也可以 mount(8) 它直到下次启动。

14.16 - 我能访问非FFS文件系统中的数据吗?

是的, 其它的文件系统包含:ext2 (Linux), ISO9660 和 UDF (CD-ROM, DVD 介质), FAT (MS-DOS 和 Windows), NFS, NTFS (Windows), AmigaDOS。它们中一些是有限制的, 例如支持只读。注意不支持FreeBSD的UFS2文件系统。

我们将提供一个怎样在OpenBSD中使用这些文件系统的概览。要使用一个文件系统必须先挂载它。更多关于挂载的 选项请参阅 mount(8) 的用户手册和您将要挂载的系统使用的命令, 例如: mount_msdos, mount_ext2fs, ...

首先您需要知道您的文件系统位于哪个设备上, 它可能是您的第一块硬盘, wd0或sd0, 但它也可能没那样明显。所有您 系统上被识别和配置的设备全可以用 dmesg(1) 命令输出成:一个设备名称, 后面跟着这个设备的描述。例如我的第一个 CD-ROM驱动器被识别如下:

cd0 at scsibus0 targ 0 lun 0: SCSI0 5/cdrom removable

将所有有效的磁盘列成一个名称更短的清单, 您可以使用 sysctl(8) 命令

# sysctl hw.disknames

它会显示您系统目前知道的所有磁盘, 例如:

hw.disknames=cd0, cd1, wd0, fd0, cd2

到这一步, 是搞定在这个设备上有哪些分区以及哪个分区上是您想访问的文件系统的时候了。因此, 我们用 disklabel(8) 检测这个设备。disklabel包含了一个分区的清单, 最多可以有16个分区。分区 c 永远代表整个设备。分区a-b和d-p被 OpenBSD使用。分区i-p可以自动被分配成其它操作系统的文件系统, 这个例子中我们将查看我硬盘上的disklabel, 它包 含了一系列不同的文件系统。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 23/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

注意: 在这台计算机上的OpenBSD是在其它操作系统后面安装的, 并且安装disklabel时不但包含了OpenBSD的自己的分 区也包含已经在此计算机上安装的其它文件系统。然而如果您先安装了OpenBSD的disklabel, 再安装其它的文件系统, 您需要以后手动添加或更改这些文件系统。这种情况在 这小节 有说明。

# disklabel wd0 # using MBR partition 2: type A6 off 20338290 (0x1365672) size 29318625 (0x1bf5de1) # /dev/rwd0c: type: ESDI disk: ESDI/IDE disk label: ST340016A flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 16383 total sectors: 78165360 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0

16 partitions: # size offset fstype [fsize bsize cpg] a: 408366 20338290 4.2BSD 2048 16384 16 # Cyl 20176*- 20581 b: 1638000 20746656 swap # Cyl 20582 - 22206 c: 78165360 0 unused 0 0 # Cyl 0 - 77544 d: 4194288 22384656 4.2BSD 2048 16384 16 # Cyl 22207 - 26367 e: 409248 26578944 4.2BSD 2048 16384 16 # Cyl 26368 - 26773 f: 10486224 26988192 4.2BSD 2048 16384 16 # Cyl 26774 - 37176 g: 12182499 37474416 4.2BSD 2048 16384 16 # Cyl 37177 - 49262* i: 64197 63 unknown # Cyl 0*- 63* j: 20274030 64260 unknown # Cyl 63*- 20176* k: 1975932 49656978 MSDOS # Cyl 49262*- 51223* l: 3919797 51632973 unknown # Cyl 51223*- 55111* m: 2939832 55552833 ext2fs # Cyl 55111*- 58028* n: 5879727 58492728 ext2fs # Cyl 58028*- 63861* o: 13783707 64372518 ext2fs # Cyl 63861*- 77535*

正如您所见, 上面的输出中首先列出了所有的OpenBSD分区。下面的是一些ext2分区和一个MSDOS分区, 同时还有一些 不可识别的分区。在i386和amd64系统上, 您通常可以使用 fdisk(8) 工具看到更多的信息。为了满足那些有好奇心的读 者, 我在这里解释一下: 分区 i 是一个电脑商家建立的维护分区, 分区 j 是一个NTFS分区, 而分区 l 是Linux的交换分区。

一旦您检测到您要使用的是哪一个分区, 您就可以进行最后一个步骤了:挂载包含这些您想访问的文件系统的分区。标 准的GENERIC内核支持多数文件系统:您只需看一下内核配置文件, 它位于 /usr/src/sys/arch//conf 目录。然而, 有 些文件系统则不然, 例如对NTFS的支持是实验性的, 所以未包含在标准的内核GENERIC里。如果您想使用未被 GENERIC支持的文件系统, 您需要构建一个定制的内核。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 24/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

当我们获得了如上所述的所需信息后, 现在是挂载文件系统的时间了。我们假设存在一个目录 /mnt/otherfs , 我们将把 它作为一个挂载点来挂载所需的文件系统。在这个例子中我们将挂载位于分区 m 的ext2文件系统:

# mount -t ext2fs /dev/wd0m /mnt/others

如果您要经常使用这个文件系统, 您可以在 /etc/fstab 里加入一行以便节省您一些时间, 例如像这样:

/dev/wd0m /mnt/otherfs ext2fs rw, noauto, nodev, nosuid 0 0

注意上面第五和第六小段上的0, 它们意味着我们不需要openBSD来dump和用fsck检查这个文件系统。通常情况下, 这 些操作您希望由该文件系统的宿主操作系统来处理。

14.16.1 - 我的disklabel里没有那个分区!我应该怎么办?

如果您在OpenBSD安装后在您爹系统上安装了其它的文件系统(这中情况经常是增加了一个新操作系统), disklabel将维 持现状, 它并不会自动升级去包含新的文件系统分区。如果您想使用这些新的文件系统, 您需要用 disklabel(8) 手动添加 更改这些分区。

作为例子, 我们手动更改一个已经存在的ext2分区:我们使用Linux的fdisk程序把分区'o'(请参看上面的disklabel输出)的大 小减少为1G, 我们可以很容易地知道它的起始位置(offset:64372518)和大小(13783707)。注意这些数值是扇区编号, 而且 使用扇区编号(而非M或其它测量单位)是读取这些信息更精确和最安全的途径。

改变之前, 我们先用OpenBSD的 fdisk(8) 工具查看一下这个分区, 结果像这样(此处仅提供与该分区有关的输出):

# fdisk wd0 . . . Offset: 64372455 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ] ------0: 83 4007 1 1 - 4864 254 63 [ 64372518: 13783707 ] Linux files* . . .

如您所见, 这个分区的起始位置和大小是正确的, 正好与disklabel先前探测的一样。(不要对偏移地址("Offset")的确切含 义感到迷惑:它也是用来指出这个包含了ext2分区的扩展分区的起始位置的。)

从Linux改变了分区的大小后, 看起来像这样:

# fdisk wd0 . . . Offset: 64372455 Signature: 0xAA55 Starting Ending LBA Info: #: id C H S - C H S [ start: size ]

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 25/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

------0: 83 4007 1 1 - 4137 254 63 [ 64372518: 2104452 ] Linux files* . . .

现在需要用disklabel(8)进行更改。例如, 您可以运行命令disklabel -e wd0, 它将调用一个被EDITOR环境变量指定的编辑 器(默认情况下是vi)。在编辑器中更改disklabel的

最后一行来匹配新的分区大小:

o: 2104452 64372518 ext2fs

结束后将disklabel保存在磁盘上。现在disklabel又被更新了, 您有可以像以前一样的挂载所需分区了。

如果您是添加了一个新分区, 调整步骤与此类似。

14.17 - 我能在OpenBSD中使用闪存吗?

14.17.1 - 将闪存当成一个轻便的存储设备

一般情况下, 您将闪存插入计算机后它应该被识别出来, 很快内核就会在控制台上输出一系列信息。例如, 我插上我的 USB闪存设备, 在我的控制台上就看见了如下显示:

umass0 at uhub1 port 1 configuration 1 interface 0 umass0: LEXR PLUG DRIVE LEXR PLUG DRIVE, rev 1.10/0.01, addr 2 umass0: using SCSI over Bulk-Only scsibus2 at umass0: 2 targets sd0 at scsibus2 targ 1 lun 0: SCSI2 0/direct removable sd0: 123MB, 123 cyl, 64 head, 32 sec, 512 bytes/sec, 251904 sec total

这些信息说明 umass(4) (USB mass storage)驱动被加载到闪存设备上, 并且它使用的是SCSI系统。最后两行是很重要的: 它们说明了闪存设备被加载到哪个设备节点上, 以及所有的储存容量是多少。如果您不知何故没有这些行, 您以后还能 用 dmesg(1) 命令看到它们。这个报告的中CHS磁盘几何模式是虚构的, 因为闪存一般被系统当作常规的SCSI磁盘。

我们将讨论下面两种情形。

这是一个新或者空的设备并且它仅在OpenBSD下使用

您需要在闪存上初始化一个disklabel, 并至少建立一个分区。请阅读 使用OpenBSD的disklabel 和 disklabel(8) 的用户手册 疑惑的更详尽的信息。

这个例子中, 我仅创建一个分区 a , 并置入FFS文件系统:

# newfs sd0a Warning: inode blocks/cyl group (125) >= data blocks (62) in last cylinder group. This implies 1984 sector(s) cannot be allocated.

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 26/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

/dev/rsd0a: 249856 sectors in 122 cylinders of 64 tracks, 32 sectors 122.0MB in 1 cyl groups (122 c/g, 122.00MB/g, 15488 i/g) super-block backups (for fsck -b #) at: 32,

我们将在闪存上创建的 a 分区挂载到 /mnt/flashmem 。如果这个挂载点不存在请先创建它。

# mkdir /mnt/flashmem # mount /dev/sd0a /mnt/flashmem

这是别人的闪存盘, 您只是用它来交换数据

很有可能那个人不使用OpenBSD, 所以闪存盘上是其它的文件系统。所以我们要先确定闪存盘上采用的是哪种分区, 就 像 FAQ 14 - 其它文件系统 描述的那样。

# disklabel sd0 # /dev/rsd0c: type: SCSI disk: SCSI disk label: DIGITAL FILM flags: bytes/sector: 512 sectors/track: 32 tracks/cylinder: 64 sectors/cylinder: 2048 cylinders: 123 total sectors: 251904 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0

16 partitions: # size offset fstype [fsize bsize cpg] c: 251904 0 unused 0 0 # Cyl 0 - 122 i: 250592 32 MSDOS # Cyl 0*- 122*

如您所见的上面disklabel的输出, 只有一个分区 i, 包含了一个Windows计算机上创建的FAT文件系统。通常 c 分区表示 所有的磁盘空间。

我们将这个 i 分区的文件系统挂载到 /mnt/flashmem.

# mount -t msdos /dev/sd0i /mnt/flashmem

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 27/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

现在您就可以像其它磁盘一样的使用它了。

警告: 您应该永远在拔掉闪存盘前unmount这个文件系统。如果您不这样做, 这个文件系统会处在一个混乱的状态, 这 种状态可能会导致数据损坏。

从您的计算机上拔掉闪存盘。内核同样会在控制台上输出提示信息:

umass0: at uhub1 port 1 (addr 2) disconnected sd0 detached scsibus2 detached umass0 detached

14.17.2 - 闪存盘做为可启动存储器

闪存盘同样可以做为各种形式的OpenBSD的启动盘。您可以把它当作USB设备(如果您的计算机支持从USB闪存盘启 动, 并非所有的计算机全能这样。), 或把它当作Non-USB设备(例如像CF)带一个IDE或SATA适配器。(Non-USB设备连 接一个USB适配器会被当作USB设备)。某些情况下您可以同时用两种方式使用闪存盘(从USB适配器上引导, 但在IDE 适配器上使用它)。

闪存盘连接到USB接口将会被视为是一个 sd(4) 的类SCSI设备。当它连接到IDE适配器上会被当作一个 wd(4) 设备。

当闪存盘连接到IDE适配器上时, 它可以从任何支持IDE启动的系统上启动。从某种程度上说系统将这个闪存盘看作一 个IDE磁盘。您只需简单地进行一下硬件设置, 就可以像通常情况下一样将OpenBSD安装在闪存盘上。

从USB设备启动, 您的系统必须没有其它硬件干扰并具备从USB设备启动的能力。注意如果您打算制作一个便携的可 启动USB设备, 这个USB设备会被当成是SCSI磁盘, 通常是sd0, 然而如果您的系统上已经有了类SCSI设备, 他可能是一个 不同的标识符, 这将使在不同的系统上使用这个闪存盘变得很复杂, 因为您不得不更新/etc/fstab。

一些说明:

● 速度: 通常情况下, 闪存设备比硬盘慢很多, 特别是对其进行写操作时。使用 soft updates 将会有很大改善, 因为将 使用mount的"noatime"选项。 ● "写疲劳": 已经有很多关于单独的闪存单元损坏前可重写次数的报道。实际上, 闪存盘损坏有很多可能性, 写疲劳 恰恰是其中之一。现代的闪存设备需要校验写入的数据, 一旦出现写入坏快, 将自动将坏快的地址重映射到剩余 的好的扇区。用户使用的多数闪存设备不必担心"写疲劳"。如果您没有使用一些"聪明的"花招来避免对闪存进 行写操作, 而是像正常情况下那样读写, 您会发现您的停机时间会更多。 ● 可靠性: 因为闪存盘没有运动部件以致很多人假设它理所应当地比硬盘更稳定。那些认为从使用硬盘转到使用 闪存盘数据就可以避免数据丢失和磁盘损坏的想法可能是很不明智的。根据用户的报告闪存盘存在相当大的质 量差异, 所以相对传统硬盘来说闪存盘仅具有安静、低功耗等特性, 但并非是一个永远用不坏的储存介质。 ● 制作一个可启动的USB闪存盘: 尽管只能在支持USB启动的计算机使用USB闪存盘来启动系统, 但是您可以在任 何支持USB设备的计算机上制作您的可启动USB闪存盘。当然, 可启动USB闪存盘制作完成后仅能在支持USB启 动的计算机上进行测试。 ● 从IDE接口到USB接口: 因为闪存盘可以通过IDE或USB两种适配器进行读写操作, 您可以使用闪存盘通过IDE适 配器启动一台计算机, 也可以在另一台计算机上通过USB接口维护这个闪存盘。(或反之) ● OpenBSD与其它OS的分区共享一个闪存盘: OpenBSD将闪存盘视为普通的磁盘, 所以您可以用 fdisk(8) 对一个闪 存盘进行分区, 就像您在任何硬盘上一样。您可以将OpenBSD的文件系统放在一个分区上, 其余的分区则留给其 他的文件系统, 例如, FAT32。然而并非所有的OS全将闪存盘视为普通磁盘, 至少Windows操作系统就是这样, 它 仅允许在闪存盘开始位置建立分区, 尽管Windows不干涉已经存在的分区, 但是也不提供闪存盘的分区工具, 所 以, 如果您想制作一个可启动OpenBSD的闪存盘, 同时也希望它可用于FAT32的操作系统, 您应该想这样做:

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 28/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

1. 使用OpenBSD的fdisk工具对闪存盘进行分区, 在闪存盘的开始处划分出一个准备给Windows使用的分区, 然后将后面的空间划分成一个OpenBSD分区。 2. 想往常一样在OpenBSD的分区上安装OpenBSD系统, 别忘了激活OpenBSD分区。 3. 格式化其它分区。在Windows上格式化前面的widnows分区。 注意:如果第二个分区的类型选择得合适, 就可以让OpenBSD访问这个闪存盘上的所有分区。所以如果您使用 Windows在FAT32分区上存放了一些MP3文件, 当您从OpenBSD分区启动后仍然可以播放这些文件。

14.18 - 优化磁盘性能

磁盘性能是衡量计算机整体速度的重要因素, 当计算机处于多用户使用环境时(所有类型的用户、从可以交互式登录的 用户到使用文件或web服务器的一般用户)磁盘性能变得越来越重要, 存储数据需要持续的关注, 尤其是您的硬盘空间不 足或磁盘快要坏掉时。OpenBSD提供几种方案来提升您的磁盘速度和容错能力。

● CCD - 连接磁盘驱动器。

● RAID

● Soft Updates

● Size of the namei() cache

14.18.1 - CCD

第一个选择是使用ccd(4), 连接磁盘驱动器。它允许您将几个分区合成一个虚拟磁盘(因而, 您可以让几个磁盘看起来像 一块磁盘)。这个概念类似于许多商业的Unix版本中使用的 LVM (逻辑卷管理)。

如果您运行的是标准内核, ccd 已经启用了(标准内核位于 /usr/src/sys/conf/GENERIC)。如果您是使用自己的定制内核, 您至少需要在您的内核配置文件中包含类似下面这行:

pseudo-device ccd 4 # concatenated disk devices

上面是提供了4个 ccd 设备(虚拟磁盘)的例子, 现在您需要根据自己的实际情况判断将哪些分区划分给ccd。用disklabel 将这些分区的类型设置成 'ccd'。在一些平台上disklabel不让您这样做, 这种情况下您可以将这些分区的类型设置 成'ffs'。

如果您使用ccd通过数据分割提升磁盘性能, 请注意了, 您不会获得最佳的磁盘性能, 除非您使用一些相同型号的磁盘并 在这些磁盘上进行同样的disklabel设置。

编辑 /etc/ccd.conf 像这样: (关于配置ccd的更多信息请参看 ccdconfig(8))

# Configuration file for concatenated disk devices # # ccd ileave flags component devices ccd0 16 none /dev/sd2e /dev/sd3e

为了修改生效, 运行

# ccdconfig -C

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 29/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

只要 /etc/ccd.conf 文件存在, ccd 会在启动后自动配置自己。现在, 您有一个新的磁盘, ccd0, 它由 /dev/sd2e 和 /dev/sd3e 组成。您可以在这个新磁盘上正常的使用disklabel命令建立分区。再次强调一下, 不要将 'c' 分区作为一个可使用的真 实分区。 确认您的有效分区的起始处在第一条磁道外。

14.18.2 - RAID

另一个解决方案是raid(4), 您可以使用 raidctl(8) 来配置您的raid设备。 OpenBSD的RAID是基于 Greg Oster 的 NetBSD port 中的 CMU RAIDframe 软件。OpenBSD支持RAID 0, 1, 4, 和 5 。 raid和ccd同样, 必须内核提供支持。但与ccd不不同的是默认内核GENERIC并不支持RAID, 所以您必须加入下面这行然 后重新编译您的内核(提供RAID支持会使i386内核增加500K左右的大小)。

pseudo-device raid 4 # RAIDframe disk device

请阅读 raid(4) 和 raidctl(8) 的用户手册以获得全部细节。那里提供了丰富的选项和可能的配置, 并且有详细的解释, 这 些不属于本文档的范围。

14.18.3 - Soft updates

另一个可以提升您系统速度的工具是softupdates。在传统的BSD文件系统中一个最慢的操作就是更新metainfo(它发生 在当您创建或删除文件或目录时)。Softupdates 尝试在内存中更新metainfo, 而不是每一个及所有的metainfo全在硬盘上 更新。Soft updates的另一个作用是让磁盘上的metainfo永远保持完整, 尽管有时候metainfo没有及时更新, 因此, 当系统 崩溃时不需要启动后进行 fsck(8) , 而仅是一个后台版本的fsck在内存中更新metainfo(按softupdates的方式)。这意味着一 台服务器的启动将快很多, 因为您不必等fsck!(OpenBSD还没有这个特性), 您可以到 Softupdates FAQ 上了解更多有关 Softupdates的细节。

14.18.4 - namei() cache的大小 name-to-inode 转换(也被称为 namei())缓存用来控制到 inode(5) 的路径名的转换速度。大的namei()缓存值会被诸如 (1) 这样的工具忽略, 一个获得缓存值的合理方式是用sysctl(8)检查系统当前计算的数值(sysctl(8)调用参数"kern. maxvnodes"), 然后增加这个数值直到namei()缓存的命中率提高或者确定继续增加namei()缓存对系统已无本质性的作用 时。这个数值被确定后, 您可以通过 sysctl.conf(5) 设定它随系统启动。

14.19 - 为什么不用异步挂载?

问题: "我用"mount -u -o async /", 想使用我的一个package(我用它来不停地touch几百次)。 为什么不允许异步挂载或将 异步挂载设定成默认值呢(因为其它的unixen就是这样的)? 它是不是更简单, 因此, 是一个提升某些应用程序性能的更安 全的方式?"

回答: "异步挂载确实比同步挂载快, 但是它同时降低了安全性。如果断电了会发生什么? 或者一个硬件出问题了? 不能 因为追求速度牺牲系统的稳定性和可靠性。请查阅 mount(8) 的用户手册。"

async 所有的文件系统输入输出全采用异方式。这是一个危险的设置, 因为它不能确保磁盘上文件系统结构的一 致性, 您不应该使用这 个设置, 除非您准备重新安装您的文件系统或您的系统崩溃了。 这个设定一般用于加速restore(8), 它的速度可以提升为原来的 两倍。

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 30/31 页)2009-5-3 23:03:00 OpenBSD 4.5 FAQ中文版 第十四章 - 配置磁盘

另一方面, 如果您在处理那些临时数据, 例如可以在系统崩溃后从头再来的, 您可以设置让这些数据使用单独的异步挂 载分区以获得速度, 再强调一次, 这样做 仅在如果 发生了什么问题后您不在意这个异步挂载分区的全部数据丢失时才 可行。基于此原因, mfs(8) 分区是采用异步挂载的, 因为反正它们在重新启动后会被擦除和重新建立。

[索引] [第十三章 - 多媒体] [第十五章 - Packages 和 Ports]

[email protected] $OpenBSD: faq14.html, v 1.183 2009/02/26 08:38:53 sobrado Exp $

http://www.9971.us/OpenBSD4.5/c/faq14.html(第 31/31 页)2009-5-3 23:03:00 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

[ 索引] [第14章 - 配置磁盘]

15 - OpenBSD的packages和ports系统

目录

● 15.1 - 介绍

● 15.2 - Package管理

❍ 15.2.1 - 它是如何工作的?

❍ 15.2.2 - 让事情变简单: PKG_PATH

❍ 15.2.3 - 寻找软件包

❍ 15.2.4 - 安装新软件包

❍ 15.2.5 - 列出已经安装的软件包

❍ 15.2.6 - 更新安装的软件包

❍ 15.2.7 - 删除已经安装的软件包

❍ 15.2.8 - 不完整的软件包的安装或删除

● 15.3 - 使用ports

❍ 15.3.1 - 它是怎样工作的?

❍ 15.3.2 - 获取ports树

❍ 15.3.3 - 配置ports系统

❍ 15.3.4 - 搜索 ports 树

❍ 15.3.5 - 简易的安装:一个简单的例子

❍ 15.3.6 - 构建完成后进行清理

❍ 15.3.7 - 卸载一个 port的软件包

❍ 15.3.8 - 使用各种类型的port及subpackages

● 15.4 - FAQ

❍ 15.4.1 - 我看见大量错误信息, 看起来这个port就不能工作

❍ 15.4.2 - 怎么没有我最喜欢软件的最新版本!

❍ 15.4.3 - 为什么没有我最喜欢的软件的package?

❍ 15.4.4 - 为什么没有我最喜欢的软件的port?

❍ 15.4.5 - 为什么我最喜欢的软件没有包含在基本系统内?

❍ 15.4.6 - 我应该用哪个: packages 还是 ports?

❍ 15.4.7 - 怎样将ports调整成最佳性能?

❍ 15.4.8 - 我几周前提交了一个新port(或者一个更新), 为什么现在还没有审核?

● 15.5 - 报告问题

● 15.6 - 帮助我们

15.1 - 介绍

有大量可能被人需要运行于OpenBSD系统上的第三方程序。要让这些软件容易安装和管理并遵循OpenBSD的策略和目的, 这些第三方 软件被移植到OpenBSD上, 这种移植的努力包含了很多不同的工作, 例如:让软件使用标准的OpenBSD目录布局(例如:配置文件放到/etc 目录下), 符合OpenBSD的共享库规范, 尽可能的让软件更安全等。

移植的努力是以让软件成为准备安装的二进制packages为最终结果, 使用packages系统的目的是清楚哪些软件被安装了, 以便软件可以 在任何时间轻松地被更新或删除。这样可以确保没有任何不需要的文件被保留下来, 用户可以保证他们的系统是清洁的, packages系统

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 1/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

也帮助用户确保不会因为误操作删除有用的数据而使程序丧失功能。另一个好处是用户很少需要从源代码编译程序, 因为packages已 经是被编译过的并可以随时使用在一个OpenBSD系统上。在几分钟内, 可以下载大量的packages并安装到系统上, 一切全步入正轨。 packages和ports树并非完全像openBSD系统一样通过了严格的安全认证, 虽然我们力图尽可能地提高packages的质量, 但因为人力资源 的不足, 我们仍不能完全确保这些packages具有与系统一样的性能和安全性。

15.2 - Package管理

15.2.1 - 它是如何工作的?

软件包是一些最常用的第三方软件经过预编译产生的二进制文件。用户可以国通一些工具对软件包进行轻松的管理, 这些工具通常也 被称为pkg* tools:

● pkg_add(1) - 一个用来安装和升级软件包的工具。

● pkg_delete(1) - 一个用来删除已经安装的软件包的工具。

● pkg_info(1) - 一个用来显示软件包信息的工具。

● pkg_create(1) - 一个用来产生软件包的工具。

为了正常运行, 一个程序X可能会需要系统安装程序Y和Z, 程序Y和Z称为程序X的依赖包, 依次, Y可能需要其他的程序P和Q, 而Z可能需 要程序R, 这样就形成了一个完整的依赖关系树。

软件包看起来像简单的.tgz压缩包, 基本上就是这样, 但是他们有一个至关紧要的区别:软件包里有一些额外的包装信息。这些包装信息 可以被pkg_add(1)用于不同的目的:

● 不同的检查:是否这些软件包已经被安装过了?是否与其他的已经安装的软件包或文件名冲突? ● 依赖包如果尚未在系统内安装, pkg_add(1)将会在安装软件包之前先自动获取并安装它的依赖包。 ● 所有软件包的有关信息全被储存在一个文献中心, 默认情况下在/var/db/pkg/目录, 除其他功能外, 尤其可以防止依赖包在软件包 被删除前就先被删除。这可以确保软件不会被粗心的用户意外地破坏。

15.2.2 - 让事情变简单: PKG_PATH

您可以用PKG_PATH环境变量让事情真正变的简单。把它指向您喜欢的地方, 然后pkg_add(1)将会在那里自动搜寻您指定的任何软件 包, 而且可以自动获取并安装所需的依赖包。一个可能获得软件包的位置清单在下一小节给出。

例 1: 从您的CDROM上获取, 假设您已经把它挂载到了/mnt/cdrom目录上

$ export PKG_PATH=/mnt/cdrom/4.5/packages/`machine -a`/

例 2: 从附近的FTP mirror获取。

$ export PKG_PATH=ftp://your.ftp.mirror/pub/OpenBSD/4.5/packages/`machine -a`/

(译者注:注意上面的命令里machine -a是用"` "符号(左上角的波浪号"~"那个键, 但可不是"~"符号)圈注的而不是引号"’"或"~", 还有就 是一定要注意这里的OpenBSD的大小写, 如果您输错了, pkg_add时将会找不到该文件或目录。如果还找不到,用你的平台名称,如i386等 直接替代,注意这时是实际的目录名称,就不用加这个"`"号了,这样写export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.5/ packages/i386/)

通常的一个好办法是在~/.profile文件里加入类似上面例子中的一行。因为您可以以冒号分开不同的PATH参数从而指定多个不同地 点。在OpenBSD 4.4以前, PKG_PATH参数后的任何一个path全需要用斜杠(/)结束。这样即使您用":"分开各个URL地址pkg_add也可以 区分它们。如果第一个输入的PKG_PATH地址无效, pkg_add会尝试使用下一个地址, 直到找到软件包。如果所有地址全失败, 则会产 生一个错误信息。

注意上面那行使用的machine(1), 这里会自动替换成您自己的"应用平台"(译者注:也就是不用输入i386或amd64⋯⋯, 服务器会自动识别,

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 2/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

不过我没有成功过,我还是直接用平台名称), 一般情况下是您的平台名称, 但非总是这样, 当然了如果您使用的是快照版, 把这里 的"4.5"替换成"snapshots"。

15.2.3 - 寻找软件包

在多数平台上提供了数量众多的预编译软件包, 您只需到下列几个地方查找您的软件包:

● 官方发行的CD-ROMs中的一张CD盘, 这些CD-ROMs 上只包含了常用平台的软件包, 它们是可以免费再发行的。

● 在 FTP mirror servers的 /pub/OpenBSD/4.5/packages目录。 在FTP上不同的构架提供了不同的软件包。

● OpenBSD网站上开列出的软件包清单 ❍ Packages for OpenBSD 4.5

❍ Packages for OpenBSD 4.4

❍ Packages for OpenBSD 4.3

❍ Packages for OpenBSD 4.2

如果您的计算机上有ports树, 您可以用 搜寻ports树的方法找到您所需要的软件包。

您会注意到一些特定的软件包提供几个不同的变种, 严格意义上应该称他们为不同类型的版本。其它是同一应用的不同小块, 这些单 独的小块可能可以分别安装, 它们被称为子程序包, 这在应用类型和子程序包说的更详细, 但是类型版本基本上意味着它们配置了不同 的选项。当前许多软件包有不同类型的版本, 例如:有些类型支持的数据库不同, 有些类型仅支持非X系统, 或有些类型在网络上增加了 对SSL和IPv6的支持。每个软件包的类型版本在其名字后面有一个不同的后缀, 更多关于软件包的命名请参考packages-specs(7)。

注意: FTP上并不能完全提供可能的软件包!一些软件包不能运行在所有的平台上, 一些软件包因为使用许可的原因不能通过FTP或CD- ROM进行分发, 可能还有很多组合的软件包可以运行在OpenBSD上, 但是因为OpenBSD开发人力资源不足, 无法加入ports或packages树 中, 如果您需要的组合软件包没有提供, 您就不得不自己动手从源码构建port, 更多的关于信息请参阅ports小节的这篇文档应用类型和 子程序包.

15.2.4 - 安装新软件包

安装软件包使用工具 pkg_add(1) 。如果您设置了 PKG_PATH 环境变量, 完成了准备工作。您只需用pkg_add(1)加上软件包的名称就 可以, 看下面的简单例子:

$ sudo pkg_add -v screen-4.0.3p1 parsing screen-4.0.3p1 installed /etc/screenrc from /usr/local/share/examples/screen/screenrc | 71% screen-4.0.3p1: complete

在这个例子中-v 标签被用来让安装程序提供更多的信息, 这个选项有利于进行调试工作, 并且用在这里我们可以方便地洞察pkg_add (1)工具正在干一些什么工作。注意上面显示的提示信息etc/screenrc, 设定更多的–v 参数将得到更为详尽的输出信息。

(译者注:例如我们安装vsftpd-2.0.5.tgz软件包, 下面给出了三种命令, 1.不带-v, 2.带一个-v, 3.带两个-v #pkg_add vsftpd-2.0.5 这个只显示安装过程进度 #pkg_add –v vsftpd-2.0.5 同上, 并增加了发现的库文件和配置文件位置 #pkg_add –v –v vsftpd-2.0.5 同上, 并增加了文件解压的位置和产生的新目录 总之, -v参数越多, 屏幕输出的信息越多。我在这里试过10个–v标签, 但发现和两个没有区别, 读者有兴趣自己试试看, 也许其他软件包 会略有差异。)

使用pkg_add(1)的交互模式

从OpenBSD 3.9开始pkg_add(1)提供了交互模式, 交互模式可以通过-i 参数进行调用, 使用-i参数后在pkg_add将在自己不能做出决定时 会向您提出问题。例如, 您不知道软件包具体的版本号, 您可以这样:

$ sudo pkg_add -i screen Ambiguous: screen could be screen-4.0.3p1 screen-4.0.3p1-shm screen-4.0.3p1-static

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 3/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

Choose one package 0: 1: screen-4.0.3p1 2: screen-4.0.3p1-shm 3: screen-4.0.3p1-static Your choice: 1 screen-4.0.3p1: complete

对一些软件包来说, 安装过程提供了一些额外的关于配置和在OpenBSD上运行的信息, 因为这些信息很重要, 所以您能否看见这些信息 取决于您是否使用了–v参数。请参考下面的例子:

$ sudo pkg_add ghostscript-fonts-8.11 ghostscript-fonts-8.11: complete You may wish to update your font path for /usr/local/share/ghostscript/fonts --- ghostscript-fonts-8.11 ------To install these fonts for X11, just make sure that the fontpath lists the 75dpi or 100dpi bitmap fonts before the ghostscript fonts, \ and make sure you have the string ":unscaled" appended to the bitmap font's fontpath. This way, the bitmap fonts will be used if they match, and the Type 1 versions will be used if the font needs to be scaled. Below is the relevant section from a typical xorg.conf file. FontPath "/usr/X11R6/lib/X11/fonts/misc/" FontPath "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled" FontPath "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled" FontPath "/usr/local/lib/X11/fonts/ghostscript/" FontPath "/usr/X11R6/lib/X11/fonts/Type1/"

现在我们继续看一个有依赖包的软件包安装过程:

$ sudo pkg_add -v tin-1.8.2p0 parsing tin-1.8.2p0 Dependencies for tin-1.6.2 resolve to: gettext-0.14.6, libutf8-0.8, pcre-6.4p1, \ libiconv-1.9.2p3 (todo: libiconv-1.9.2p3, gettext-0.14.6, pcre-6.4p1, libutf8-0.8) tin-1.8.2p0:parsing libiconv-1.9.2p3 tin-1.8.2p0:libiconv-1.9.2p3: complete tin-1.8.2p0:parsing gettext-0.14.6 Dependencies for gettext-0.14.6 resolve to: expat-2.0.0, libiconv-1.9.2p3 (todo: expat-2.0.0) tin-1.8.2p0:parsing expat-2.0.0 tin-1.8.2p0:expat-2.0.0: complete tin-1.8.2p0:gettext-0.14.6: complete tin-1.8.2p0:parsing pcre-6.4p1 tin-1.8.2p0:pcre-6.4p1: complete tin-1.8.2p0:parsing libutf8-0.8 tin-1.8.2p0:libutf8-0.8: complete tin-1.8.2p0: complete

这里再强调一下, -v 标签可以让您看见安装程序正在做什么, 我们研究一下上面的信息会发现依赖包被发现并在该软件包之前安装。 您在信息中部可以发现gettext 软件包已经被安装了, 它依赖于libiconv软件包, 所以在gettext软件包安装前, pkg_add检查gettext的安装信 息并校验是否libiconv 软件包已经被安装了。

这行可以包括多个软件包的名字, 软件包会随着它的依赖包一并安装。

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 4/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

如果您因为某些原因不想用PKG_PATH环境变量, 您也可以在命令行上指定软件包的具体位置, 这个具体位置可以是本地路径也可以 是FTP, HTTP或SCP上的路径, 我们下面的这个例子是通过FTP安装的:

$ sudo pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/4.5/packages/`machine -a`/screen-4.0.3p1.tgz screen-4.0.3p1: complete

这个例子中我们没有使用-v标签, 所以安装过程仅显示必要的信息。还有我们在这里加上了软件包的后缀名.tgz, 您也像前面的例子那 样不加后缀, 因为pkg_add工具会为您自动添加。

注意: 并非所有的平台全提供了同样的软件包, 某些ports可能并不适合某些平台, 并且一些平台的性能限制了从其他平台为其创建的软 件包的个数。

为了安全起见, 如果您正在重新安装一个已安装并删除过的软件包(或它的老版本), pkg_add(1)不会用已经更改(更新)的配置文件覆盖 老的配置文件, 而是通知您(然而仅在您使用-v参数时):

$ sudo pkg_add -v screen-4.0.3p1 parsing screen-4.0.3p1 The existing file /etc/screenrc has NOT been changed** | 71% It does NOT match the sample file /usr/local/share/examples/screen/screenrc You may wish to update it manually screen-4.0.3p1: complete

有些时候您可能会遇见一个错误信息, 像下面这个例子:

$ sudo pkg_add xv-3.10ap4 xv-3.10ap4:jpeg-6bp3: complete xv-3.10ap4:png-1.2.14p0: complete xv-3.10ap4:tiff-3.8.2p0: complete Can't install xv-3.10ap4: lib not found X11.9.0 Even by looking in the dependency tree: tiff-3.8.2p0, jpeg-6bp3, png-1.2.14p0 Maybe it's in a dependent package, but not tagged with @lib ? (check with pkg_info -K -L) If you are still running 3.6 packages, update them

这个例子是pkg_add安装依赖包时突然停止安装xv软件包, 这是从OpenBSD3.7开始提供的另一个安全防范措施, 软件包信息包含了所需 的系统或第三方的库文件, 如果缺少一个库文件, 软件包将停止安装, 因为即使安装完成该软件也不能提供所需功能。

为了解决这个冲突, 您必须手动寻找所需的库文件, 检查下面几项:

● 您可能已经安装了老版本的软件包:系统内提供的是老的库文件, 这种情况您需要升级这些软件包。 ● 您的系统可能不完善:您在创建系统时没有安装包含该库文件的所需的组件, 您仅需要 添加所需系统组件 。

● 您的系统已经不维护了:您仅有所需库文件的老版本, 从安装介质启动(详参FAQ 4), 选择(U)pgrade全部升级您的系统。

15.2.5 - 列出已经安装的软件包

您可以通过 pkg_info(1)工具列出已经安装的软件包。

$ pkg_info aterm-0.4.2p1 color vt102 terminal emulator with transparency support bzip2-1.0.4 block-sorting file compressor, unencumbered expat-2.0.0 XML 1.0 parser written in C fluxbox-0.9.15.1p0 window manager based on the original code

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 5/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

gettext-0.14.6 GNU gettext imlib2-1.3.0 image manipulation library jpeg-6bp3 IJG's JPEG compression utilities libiconv-1.9.2p3 character set conversion library libltdl-1.5.22p1 GNU libtool system independent dlopen wrapper libungif-4.1.4p0 tools and library routines for working with GIF images libutf8-0.8 provides UTF-8 locale support mutt-1.4.2.2i tty-based e-mail client pcre-6.4p1 perl-compatible regular expression library png-1.2.14p0 library for manipulating PNG images screen-4.0.3p1 multi-screen window manager tcsh-6.14.00p1 extended C-shell with many useful features tiff-3.8.2p0 tools and library routines for working with TIFF images tin-1.8.2p0 threaded NNTP and spool based UseNet newsreader

当给出一个已安装的软件包名字时(或给出一个软件包所在位置), pkg_info(1)会提供此软件包更为详尽的信息。

15.2.6 - 更新安装的软件包

从OpenBSD 3.7开始pkg_add(1)已经可以使用-r参数(= 取代)更新软件包了, OpenBSD3.8为pkg_add(1)提供了-u 参数, 一直到OpenBSD3.9 才提供了真正意义上的软件包升级机制。

我们假设您在从OpenBSD4.4升级到OpenBSD4.5之前安装了一个老版本的unzip软件包, 现在您可以轻松地升级到新的4.5版本的软件包:

$ sudo pkg_add -u unzip unzip-5.52p0 (extracting): complete unzip-5.52 (deleting): complete unzip-5.52p0 (installing): complete Clean shared items: complete

如果一个软件包有依赖包(也就是安装该软件包所需的软件), 它们也会被核查并更新, 如果在pkg_add –u后面不添加任何软件包名称, 那么pkg_add将更新所有系统已经安装的软件包。

注意: -u 参数依赖PKG_PATH 环境变量, 如果您没有设置它, pkg_add(1)将无法找到更新的软件包 。

从OpenBSD 4.2开始允许为PKG_PATH提供多个地址, 但是这不意味着PKG_PATH会尝试所有的地址, 它在找到第一个合适的地址后就 不会再尝试其余的地址。

如果您有一个老的软件包的配置文件, 并且您修改过它, 那么在升级时这个文件不会被改动, 不管怎样您可以通过使用-c参数让 pkg_add(1)用新的默认配置文件强制覆盖它。.

15.2.7 - 删除已经安装的软件包

删除一个软件包只需要将pkg_info(1) (参看上一小节 列出已经安装的软件包 )列出的软件包名称放到pkg_delete(1) 工具后面就可以删 除这个软件包了。下面的例子中我们将删除screen软件包。注意, 有时您删除一个软件包时, 有一些额外的项目pkg_delete工具并不会 为您删除它们, 您需要使用-v参数以便获得更多的输出信息。

$ sudo pkg_delete screen screen-4.0.3p1: complete Clean shared items: complete

注意: 通常您不需要指定软件包的版本号和类型名称, 因为pkg_delete会自己查找出软件包的全名, 只有在是使用简略名称pkg_delete无

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 6/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

法判断哪一个是您需要删除的软件包时您才需要输入软件包的全名。

为了安全起见, 如果您已经修改了软件包中的配置文件, pkg_delete将不会删除这些配置文件, 而是提醒您, 就像下面的例子:

$ sudo pkg_delete screen screen-4.0.3p1: complete Clean shared items: complete --- screen-4.0.3p1 ------You should also remove /etc/screenrc (which was modified)

注意, 这里您不必输入软件版本, 另外信息显示您修改了某些文件, 所以pkg_delete不会删除它们, 您需要手工进行删除。

如果您想在删除软件包的同时自动删除这些修改过的配置文件, 您只需要加上-c 参数就可以了。

15.2.8 - 不完整的软件包的安装或删除

在某些偶然的情况下, 您没有完整的添加或删除软件包, 可能因为与其它文件冲突, 没有完全安装的软件包通常会在软件包的名称前加 上"partial-"前缀, 例如, 这样的情况可能发生在安装过程中您使用CTRL+C中断了安装:

$ sudo pkg_add screen-4.0.3p1 screen-4.0.3p1: complete 7% Adjusting md5 for /usr/local/info/screen.info-3 from 49fb3fe1cc3a3b0057518459811b6dac to 3b9c7811244fb9f8d83bb27d3a0f60d8 /usr/sbin/pkg_add: Installation of screen-4.0.3p1 failed , partial installation recorded as partial-screen-4.0.3p1

对您来说删除未完全安装的软件包并修正导致安装失败的因素永远是最好的方案, 当您未完全安装软件包时通常会有一个提示告诉您 您的系统并不干净, 但是也有可能是从源码安装时与其它软件混在一起了。

15.3 - 使用ports

如前所述, 软件包是通过port树编译的。这一小节我们将解释ports树是如何工作的, 什么时候您应该使用ports树, 以及如何使用它们。

重要提示: ports树是只适合高级用户。我们鼓励每个人都使用预编译的二进制软件包(packages)。不要在邮件列表上提一些初级问题, 诸如:"我怎样才能让ports树上的软件运行?"。如果您有关于ports树的问题, 我们先假设您已经阅读了用户手册和FAQ, 也就是意味着您 已经可以自己解决这些问题了。

15.3.1 - 它是怎样工作的?

Ports树是一个最初借用FreeBSD的概念, 是一组Makefiles的集合。Makefiles是用来控制每个第三方软件

● 从哪里及怎样获得源代码, ● 还需要哪些依赖包, ● 怎样修改源代码(如果必须), ● 怎样配置和构建它, ● 怎样测试它(可选), ● 怎样安装它。

除了Makefile外, 每个port至少还包含下列内容:

● 一个 PLIST 或 打包清单, 它包含了从源码构建应用程序并产生封装软件包的指令, ● 一个 DESCR 或 一份应用程序的描述, ● 一个 distfile, 包含了发行文件的校验和大小。

所有这些信息全保留在的目录/usr/ports结构下, 这个目录包含了三个特殊的子目录:

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 7/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

● distfiles/ - 这个目录用在存放ports系统下载的软件发行组件。 ● infrastructure/ - 这是ports的主要目录, 包含了所有的脚本和makefiles。 ● packages/ - 这个目录存放所有由ports系统构建的二进制软件包。

其他的子目录分属不同的应用种类, 也就是当前ports的子目录。复杂的ports也许会有更深的目录层次, 例如, 它们可能有一个核心部分 和一系列扩展, 或者一个稳定版和快照版。每个port目录都包含一个包含了打包清单和描述文件的pkg 子目录, 也可能有patches或files 子目录, 它们分别用来存放补丁文件和附加的文件 。

当用户在某个port的子目录里运行make(1)时系统会递归地查询(遍历)它的依赖关系树, 检查这个port的依赖包是否已经被安装了, 并构 建和安装任何缺少的依赖包, 然后构建用户所需的port。所有的构建过程全在该port产生的工作目录中进行, 这个目录可能是该port主 目录下的任何子目录, 这个目录可能是前缀为"w-"的目录, 或者如果您已经设定了WRKOBJDIR变量(请参看配置ports系统), 这个目录就 在WRKOBJDIR目录的子目录中。

注意: ports永远不会直接安装在您的系统上!它使用一个虚拟的安装目录, 只是把所有安装需要的文件全被放在这个目录里, 然后将它 们打包成一个package文件(二进制软件包, 就像我们前面提到的那样, 这个package文件储存在这个ports的packages子目录里)。安装一个 port的真正含义就是:产生一个二进制软件包, 然后安装这个软件包!

有关ports系统更多的信息您可以在下面的用户手册上找到:

● ports(7) - 描述了不同的port安装过程(根据不同的make目标), 各类型版本和子文件包的使用, 及一些其他选项。

● bsd.port.mk(5) -更深入阐述了所有make过程, 变量及虚拟(安装目录)框架等。

15.3.2 - 获取ports树

继续之前, 您必须阅读关于不要混淆不同类型的 OpenBSD 系统和 ports 树。一旦您确定使用什么类型的ports, 您可以从相应的途径获 得它, 下表列出了不同ports树的获取途径。"x"表示有效的获取途径;"-"表示无效的途径。

Source Form Flavor -release -stable snapshots -current CD-ROM .tar.gz x - - - FTP mirrors .tar.gz x - x - AnonCVS cvs checkout x x - x

在CD-ROM和FTP镜像上查找ports.tar.gz这个文件, 您需要在/usr目录下untar这个文件, 会产生一个/usr/ports目录及其子目录。例如:

$ cd /tmp $ ftp ftp://ftp.openbsd.org/pub/OpenBSD/4.5/ports.tar.gz $ cd /usr $ sudo tar xzf /tmp/ports.tar.gz

FTP镜像上每天都从当前版的ports树上生成快照版的ports树。您可以在/pub/OpenBSD/snapshots/目录下找到快照版的ports树(ports.tar. gz文件), 注意您需要安装一个快照版的OpenBSD系统才可以使用它。一定要确保您的ports树和您的OpenBSD系统同步!

更多关于通过AnonCVS 获得ports树的方法请参阅AnonCVS page , 它上面包含了一个有效的服务器列表及一些实例。

15.3.3 - 配置ports系统

说明: 这一小节介绍了从ports系统构建应用软件的全局设置。您可以跳过这一节, 但在后面的例子中要求您以root身份执行很多make 操作。

因为OpenBSD项目并无足够的人手仔细审核所有ports树中的软件, 所以您自己在配置ports系统时可以做一些安全防护措施。Ports体系 既允许普通用户构建软件, 也允许他们执行一些root权限的步骤。如虚拟目录和安装软件包, 不管怎样说, 因为您使用port时拥有root的

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 8/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

权限, 但是即使您编译, 安装的的是一个恶意软件, ports系统并不能发现和保护您。

● 您可以设置 sudo(8) 使ports系统具有构建和安装时所需的超级用户权限, 您只需让/etc/mk.conf文件包含下面这行:

SUDO=/usr/bin/sudo

● 您可以修改potrs树的所有权以便您可以用一般用户的身份在那里进行写操作。这时这个一般用户已经被加入到了wsrc组, 并且 允许对下面子目录的进行写操作。

# chgrp -R wsrc /usr/ports # find /usr/ports -type d -exec chmod g+w {} \;

● 您可以通过在/etc/mk.conf 中加入如下的一行来让ports树使用 systrace(1):

USE_SYSTRACE=Yes

这行的目的是强制构建过程仅在允许的目录中进行, 并禁止在非法的地方写入数据。因此极大程度上减小了对系统的危害性, 注意, 使用systrace(1)会增加20%的程序构建时间。

单独隔离出在构建过程中需要进行写操作的目录就可以让整个ports目录在使用过程中处于一个只读的状态:

● WRKOBJDIR 变量指定哪个目录作为ports的工作目录。 ● DISTDIR 变量指定哪个目录用来存放程序的发行文件。 ● PACKAGE_REPOSITORY变量指定发行文件生成的package的存放位置。

例如, 您可以将下面几行加入/etc/mk.conf

WRKOBJDIR=/usr/obj/ports DISTDIR=/usr/distfiles PACKAGE_REPOSITORY=/usr/packages

如果您愿意, 您也可以将这些目录的所有人设定成您的本地用户和组。这样ports系统可以以一般用户身份创建子目录。

15.3.4 - 搜索 ports 树

一旦您的系统内有了ports树, 您可以方便地查找程序。只需使用make search 加上程序关键字"key"就可以了, 见下例:

$ cd /usr/ports $ make search key=rsnapshot Port: rsnapshot-1.2.9 Path: net/rsnapshot Info: remote filesystem snapshot utility Maint: Sigfred Haversen Index: net L-deps: B-deps: :net/rsync R-deps: :net/rsync Archs: any

搜索的结果较详细地显示了port的信息:port的名称, port所在位置, port的简单描述, port涉及的关键字, library/build/runtime的依赖体及 port可应用构架。

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 9/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

这个机制还是很基本的, 只是在ports的检索文件上运行awk(1)。从OpenBSD 4.0开始有了一个叫"sqlports"的port, 可以使用SQL进行细致 的检索, 它是一个SQL的小型数据库, 只是主要用来产生port体系的各种数据格式。Sqlports包含了用来生成ports数据库的脚本, 它可以 提供不同格式的ports数据库。

您只需pkg_add(1)加载sqlports软件包, 这里, 我们先启动sqlite3:

$ sqlite3 /usr/local/share/sqlports SQLite version 3.3.12 Enter ".help" for instructions sqlite> SELECT FULLPKGNAME, COMMENT FROM Ports WHERE COMMENT LIKE '%statistics%'; Guppi-0.40.3p1|GNOME-based plot program with statistics capabilities mailgraph-1.12|a RRDtool frontend for Postfix statistics R-2.4.1|clone of S, a powerful math/statistics/graphics language py-probstat-0.912p0|probability and statistics utilities for Python darkstat-3.0.540p1|network statistics gatherer with graphs pfstat-2.2p0|packet filter statistics visualization tcpstat-1.4|report network interface statistics wmwave-0.4p2| dockapp to display wavelan statistics diffstat-1.43p0|accumulates and displays statistics from a diff file sqlite>

上面仅是一个基本的搜索, 如果您使用SQL可以搜索到您想找的任何东西, 包括依赖体, 配置文件, 共享库等。

15.3.5 - 简易的安装: 一个简单的例子

为了便于读者理解, 我们安装一个简单的port——rsnapshot, 这个应用程序有一个依赖包是rsync。

$ cd /usr/ports/net/rsnapshot $ make install ===> Checking files for rsnapshot-1.2.9 >> rsnapshot-1.2.9.tar.gz doesn't seem to exist on this system. >> Fetch http://www.rsnapshot.org/downloads/rsnapshot-1.2.9.tar.gz. 100% |**************************************************| 173 KB 00:02 >> Size matches for /usr/ports/distfiles/rsnapshot-1.2.9.tar.gz >> Checksum OK for rsnapshot-1.2.9.tar.gz. (sha1) ===> rsnapshot-1.2.9 depends on: rsync-2.6.9 - not found ===> Verifying install for rsync-2.6.9 in net/rsync ===> Checking files for rsync-2.6.9 >> rsync-2.6.9.tar.gz doesn't seem to exist on this system. >> Fetch ftp://ftp.samba.org/pub/rsync/old-versions/rsync-2.6.9.tar.gz. 100% |**************************************************| 792 KB 00:31 >> Size matches for /usr/ports/distfiles/rsync-2.6.9.tar.gz >> Checksum OK for rsync-2.6.9.tar.gz. (sha1) ===> Verifying specs: c ===> found c.40.3 ===> Extracting for rsync-2.6.9 ===> Patching for rsync-2.6.9 ===> Configuring for rsync-2.6.9 [...snip...] ===> Building for rsync-2.6.9 [...snip...] ===> Faking installation for rsync-2.6.9 [...snip...] ===> Building package for rsync-2.6.9 Link to /usr/ports/packages/i386/ftp/rsync-2.6.9.tgz Link to /usr/ports/packages/i386/cdrom/rsync-2.6.9.tgz

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 10/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

===> Installing rsync-2.6.9 from /usr/ports/packages/i386/all/rsync-2.6.9.tgz rsync-2.6.9: complete ===> Returning to build of rsnapshot-1.2.9 ===> rsnapshot-1.2.9 depends on: rsync-2.6.9 - found ===> Extracting for rsnapshot-1.2.9 ===> Patching for rsnapshot-1.2.9 ===> Configuring for rsnapshot-1.2.9 [...snip...] ===> Building for rsnapshot-1.2.9 [...snip...] ===> Faking installation for rsnapshot-1.2.9 [...snip...] ===> Building package for rsnapshot-1.2.9 Link to /usr/ports/packages/i386/ftp/rsnapshot-1.2.9.tgz Link to /usr/ports/packages/i386/cdrom/rsnapshot-1.2.9.tgz ===> rsnapshot-1.2.9 depends on: rsync-2.6.9 - found ===> Installing rsnapshot-1.2.9 from /usr/ports/packages/i386/all/rsnapshot-1.2.9.tgz rsnapshot-1.2.9: complete

如您所见, port系统自动做了很多事情。它会先下载源代码, 解压, 并给源程序打补丁, 配置, 构建(编译)源代码, 安装到一个虚拟目录, 根 据打包清单产生一个package(程序包), 然后将这个程序包安装在您的系统上(通常安装在 /usr/local/ 目录下)。并且ports系统可以递归地 自动安装程序包的所有依赖包。注意上面的"===> Verifying install for ..." 和 "===> Returning to build of ..."之间的这些行(译者注:为方便 查阅已经标记为蓝色), 说明ports系统遍历了整个依赖关系树。

如果您已经在计算机上安装了一个软件的以往版本, 您只需使用make update替代make install, 它将让pkg_add工具调用 -r参数。

说明: 大的应用需要很多的系统资源, 这方面最好的例证就是GCC 4.0 或 Java 2 Software Development Kit。当您构建一个port时如果看到 类似"out of memory"的错误提示, 通常是以下原因之一:

● 您的设置的构建(编译)环境过于严格(安全), 调整一下ksh的ulimit或csh的limit就可以了, 如果还不行, 就用root登录或使用sudo(8) 加上-c参数来限制登录级别编译程序源码(更多关于登录级别的信息请参阅login.conf(5)。

● 您的内存不够。

15.3.6 - 构建完成后进行清理

您或许想在生成和安装软件包后清理port工作目录。

$ make clean ===> Cleaning for rsnapshot-1.2.9

另外您可以用下面的命令清理所以依赖包的工作目录:

$ make clean=depends ===> Cleaning for rsync-2.6.9 ===> Cleaning for rsnapshot-1.2.9

如果您想删除程序的源代码用下面的命令:

$ make clean=dist ===> Cleaning for rsnapshot-1.2.9 ===> Dist cleaning for rsnapshot-1.2.9

有时您可能编译了一个port的不同类型版本, 想一次性清理所有类型版本的目录:

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 11/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

$ make clean=flavors

下面的命令可以在构建软件包后自动清除上面所提目录:

$ make package BULK=Yes

15.3.7 - 卸载一个port的软件包

卸载一个port很简单:

$ make uninstall ===> Deinstalling for rsnapshot-1.2.9 rsnapshot-1.2.9: complete Clean shared items: complete

这将调用pkg_delete命令删除系统中相应的软件包, 您也可以先卸载再重新安装一个port的软件包, 用下面的命令:

$ make reinstall ===> Cleaning for rsnapshot-1.2.9 /usr/sbin/pkg_delete rsnapshot-1.2.9 rsnapshot-1.2.9: complete Clean shared items: complete ===> Installing rsnapshot-1.2.9 from /usr/ports/packages/i386/all/rsnapshot-1.2.9.tgz rsnapshot-1.2.9: complete

如果您想删除您刚构建的文件包, 用下面的命令:

$ make clean=packages ===> Cleaning for rsnapshot-1.2.9 rm -f /usr/ports/packages/i386/all/rsnapshot-1.2.9.tgz

15.3.8 - 使用各种类型的port及subpackages

请务必阅读ports(7)用户手册, 它提纲携领地阐述了这个议题。出于不同的目的我们采用两种方式进行程序打包。

第一种方式是根据程序的不同特征用途, 这里特征是指一系列指定的编译选项, 例如"no_x11"选项编译出的软件包仅能应用在没有安装 X的系统上, 有些shell具有静态(static)特征, 它就需要一个静态链接版本的软件包, 为适合不同图形工具包而制作的特性软件包。其余的 例子还有:支持不同的数据库类型, 不同的网络连接类型(SSL, IPv6...... ), 不同的页面尺寸等等。

小结: 很有可能您正在找的软件包刚好没有您需要的类型, 这种情况下您需要自己确认所需的port并自行构建一个软件包。

通常情况下同一个port的不同类型的源代码分别在各自的目录里, 编译过程生成的各类软件包也会采用特征名称以避免混淆。您可以 进入该port的子目录输入如下命令:

$ make show=FLAVORS

您也可以看到该port的 DESCR 文件, 它说明了有哪些可用类型。

第二种方式是分包. 如果port逻辑上可以拆分, 程序员也许会决定将程序分装成不同的子程序包, 您会看到有的程序分成客户端和服务 器两部分。有时也会看见大量的文档被打包成一个独立的子程序包, 因为它们会占据相当多的磁盘空间。额外的功能如果需要大量的

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 12/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

依赖体也会被单独打包处理。程序员也要确定那个子程序包是主要的子程序包, 这个子程序包会设置成默认安装, 其它还有例如随程 序发行的扩展测试套件, 为不同功用定制的不同子程序包等等。 小结: 有些port被分成了几个程序包, 您安装时仅需要安装主要的子程 序包。

列出一个port内不同的程序包使用如下命令:

$ make show=PACKAGES make install 命令只安装主程序模块, 如果您想安装所有模块使用如下命令:

$ make install-all

列出程序所有的模块, 使用如下命令:

$ make show=MULTI_PACKAGES

也有可能您只想安装一个port的部分子程序包, 经过一系列校验后会, 进程会调用pkg_add(1)来安装您想要的系程序包。

$ env SUBPACKAGE="-server" make install

注意: 分包的安装方式只能处理程序包, 它不会在构建前对修改任何配置选项, 如果您需要不同配置的安装包请自行选择不同类型的安 装包。

15.4 - FAQ

15.4.1 -我看见大量错误信息, 看起来这个port根本无法安装。

这种情况很像您使用了不同类型的系统和ports树

Sorry?

● 请阅读OpenBSD's Flavors:的所有细节: -release, -stable, 和 -current, 下面是一个小结, 但是请一定要阅读前面的文章搞清楚您到底 要使用什么版本类型。 ❍ Release: 在发行CD上。

❍ Stable: 发行版基础上增加了安全性和可靠性。

❍ Current: OpenBSD的最新开发版。

● 不要check out一个–current版 ports树, 然后希望可以在-release版或者–stable版运行。这是最常见的错误之一, 如果这种情况下 您请求别人的帮助会激怒这些人。如果您使用当前版的系统您只能使用当前版的ports树。没错, 这绝对意味着新的port将不能 安装在"老"系统上——即使这个"老"系统几周前曾经是当前版。记住如果您的系统安装了X11, 您的系统也只能跟进相应的分 支! ● 因为稳定版并不增添新功能, 所以它可以应用发行版的packages 和 ports, 没有必要因为几个额外的补丁就更新您所有的 packages。

另一个常见的错误是没有安装X11, 即使您想编译的port并不依赖于X11, 但可能它的依赖体或模块需要X11的头文件或库文件, 如果您 在未安装x11的系统上安装ports, 我们将无法提供技术支持, 所以如果您坚持这样做您只有自行解决所遇问题。然而很多ports并不提 供"no_x11"特征版本, 这些版本才适合未安装X11的系统。

在OpenBSD 4.2时, 很多软件包使用libexpat, 即使它们没有图形功能但是仍需要安装系统组件xbase42.tgz 。 这个问题在OpenBSD 4.3时 得到了修正, libexpat 已经包含在系统基本组件base43.tgz文件里内。 因此, libexpat不再依赖任何 X 组件。更详细的说明请参看 升级指 南。

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 13/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

15.4.2 - 怎么没有我最喜欢软件的最新版本!

如果您使用稳定版的OpenBSD, 您会发现任何软件包都不提供更新, 它们的更新版会出现在下一个发行版, 或者可能因为安全问题而必 须对该port进行升级, 这时更新的port和相关软件才会出现在稳定版的分支中。

警告: 不要混用不同版本类型的Ports和OpenBSD!

如果您这样做迟早(事实上很可能很快)会让您焦头烂额, 请参阅各种各样的错误!

嗨, 但是我已经全跟进到当前版了!

Port收集是一个志愿项目, 有时这个项目因为开发者人力不足, 不能将每个软件全更新成最新版, 开发者只能尽量多地挑选那些他们感 兴趣和环境允许的条件下进行软件测试, 您的捐赠 可以让很多平台上的这种现象得到改善。

有些port落后于主流更新进度正是因为如此。有的程序可能在五月份已经有了新版本, 但是port树上收集的只是它一月份的老版本, 这 通常是有意而为之, 通常可能是新版本运行在OpenBSD上存在某些问题维护者正在尽力解决, 或者新版本的运行情况干脆不如老版本: OpenBSD的目标可能与其他主流开发项目不同, 有时这可能导致软件包的设计, 特色, 执行等不符合OpenBSD开发者的目标 。更新被 推迟也可能是该软件的更内容并非至关重要。

如果您真是需要一个新版本的port, 您应该要求这个port的维护人员对它进行更新(看下面)您可以知道谁具体维护它)。如果您可以在 这方面帮助我们那更好。

15.4.3 - 为什么没有我最喜欢的软件的package?

这有几种可能的原因:

● OpenBSD发布的 CD-ROMs因为容量的限制无法提供所有平台的所有软件, 所以仅有最常用的软件才会包含在CD上, 另外有些 软件只能在自由的再次分发, 所以也无法包含在CD里面, 如果您不能在CD上找到您需要的软件包, 试试FTP。 ● 有的软件不能以二进制的形式分发, 还有的是因为版权限制不能再次分发。如果您的软件属于上面的情况您可以自行下载port, 然后从源码编译它们。 ● 很显然, 总被遗忘的是:就没有 您最喜欢软件的port , 您可以通过搜索ports树来确认, 如果确实没有您喜欢的软件的二进制包, 那 么我们欢迎您帮助我们。

15.4.4 - 为什么port里没有我最喜欢的软件?

收集ports是一个志愿工程, 现行的port发展仅靠有限的几个人, 并且是在他们的空余时间, 这些人通常只是更新自己使用和感 兴趣的port。您可以提供帮助考虑一下制作您自己的port。 这里有一些有用的文档:制作一个OpenBSD的Port, 阅读它, 然后 再读一遍。 特别是管理您的port那部分内容。然后小心地进行测试并逐步完成。如果最后成功了, 提交到邮件列表 [email protected]。如果您运气好会有一些反馈信息及其他人的测试结果。如果测试成功, 您的port可能会被加入port 树。

15.4.5 - 为什么我最喜欢的软件没有包含在基本系统内?

因为OpenBSD应该是一个小巧的独立的类UNIX操作系统, 关于系统包含什么我们需要画一条分界线。通常, 一个程序被包含在系 统内需要:

● 这个程序必须有极高的设计水准, 它必须深蕴OpenBSD的理念。 ● 这个程序的使用许可必须不能包含过于严格的限制, 而且要与OpenBSD的使用许可保持一致。 ● 这个程序的体积不能过大, 必须在基本系统所能接受的范围内。

对这个问题更详细的回答也可以在FAQ 1里找到。

15.4.6 - 我应该用哪个: packages 还是 ports?

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 14/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

通常, 我们强烈推荐您使用packages而不是从ports自己构建一个应用程序。我们使用port的最终目的是提供packages, 而不 是ports本身。

从源码构建一个大的程序并非易事, 并非只是编译程序源代码, 用来编译源代码的工具本身也需要从源代码编译。很遗憾, OpenBSD, 这些编译工具, 需要编译的程序全处于一个动态的发展状态, 让它们能在一起协调工作是一个极大的挑战, 即使某次 可以成功, 但是可能第二天它们中的一个进行了一些修正就会导致问题重现。每隔六个月OpenBSD推出一个新发行版, 测试每个 平台上的每个port可否编译这项工作也已完成。但是在这六个月的发展周期内, 一些ports很可能会有变化。 除了让各部分协调 一致的工作外, 从源码编译某些应用程序所需的时间和资源也是一个问题。一个普遍的例子就是CVSup, 它是一个跟踪OpenBSD 源代码树的工具。在一个网速较快性能强劲的计算机上只需要10秒钟左右——这里指下载和解压缩单个779KB的文件包;与此相 反, 还在这台计算机上如果从源代码构建CVSup将是一个繁重的任务, 需要很多工具以及一步一步地引导编译器完成编译工作, 耗时长达半个小时。其它的应用程序例如Mozilla或KDE 可能花费数小时并且占用大量的硬盘空间和内存及交换分区空间来构 建。当一个已经被编译完的程序在您的CD-ROM 或 FTP mirror 上等着被使用, 为什么还要花这样多的时间和精力去重新编译 它呢?

当然, 某些情况下使用ports比packages更适合:

● 发行许可限制OpenBSD用packages的形式发行这个软件。 ● 您希望修改或调试这个软件或想学习它的源代码。 ● 您需要的port类型OpenBSD ports团队并没有提供。 ● 您需要修改目录结构(也就是修改前缀或配置文件目录)。

然而对大多数用户和大多数应用程序而言, 直接使用packages更简单, 对一个OpenBSD系统来说直接安装packages的方法更简 洁明了的也是被推荐的方式。

15.4.7 - 怎样将ports调整成最佳性能?

OpenBSD力求稳定和安全, 就像我们只支持标准的GENERIC内核一样, ports团队要确保ports可以正常稳定的工作。如果您想 自己尝试编译器内的所有参数, 那是您自己的事情, 当您尝试开启一些隐含的参数以使port编译后的程序运行的更快, 请不要在 port的邮件列表上问诸如:"为什么它无法通过编译?"这样的问题。所有的这些调整对99%的用户来讲没有必要, 对您, 对其他用 户, 同样也对阅读您的问题的开发人员来说更像是浪费时间, 而实际上它是一个不应该被提出的问题。

15.4.8 我几周前提交了一个新port(或者一个更新), 为什么现在还没有审核?

Ports团队的资源非常有限, 他们没有能及时审核您提交的程序, 这可能多少有点让您觉得心灰意冷, 别在意这种情况, 保管好 您的port并发送更新, 最终会有人处理它们的, 这要看这些团队成员是否有空余的时间可以审核您的port。当成员的兴趣转移到 您的ports上时也会审核的, 如果他们还记得这回事。 15.5 - 报告问题

如果您在使用一个port时遇到了困难, 请发一封邮件给port的维护者, 来看一下谁具体维护这个port, 例如这样:

$ cd /usr/ports/archivers/unzip $ make show=MAINTAINER

而如果没有维护者或者您无法联系上维护者, 请给[email protected]发一封信, 请勿使用邮件列表[email protected]提问 有关port的问题。

任何情况下需提供:

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 15/16 页)2009-5-3 23:03:08 OpenBSD4.5 FAQ中文版 第十五章 - OpenBSD的packages和ports系统

● 您的OpenBSD版本类型及应用的补丁。用sysctl –n kern.version命令查看内核版本。 ● 您ports的版本:如果/usr/ports/CVS/Tag 这个文件存在, 请提供它, 如果这个文件不存在, 那么您正在使用的当前版 的ports树。 ● 一个对问题完整详尽的描述:不要害怕提供所有细节, 说明出现问题前您的所有操作步骤。这个问题是反复出现吗?您提供的 细节越多就越有可能获得帮助。

对没有正确构建的ports来说, 提供一份完整的构建过程描述是十分必要的, 您可以使用portslogger脚本, 它位于/usr/ ports/infrastructure/build, 下面是运行portslogger的一个实例:

$ mkdir ~/portslogs $ cd /usr/ports/archivers/unzip $ make clean install 2>&1 | /usr/ports/infrastructure/build/portslogger ~/portslogs

做完这个步骤, 系统会在~/portslogs目录下生成一个日志文件, 还是那句话请不要使用任何特殊的选项编译Ports, 例如修 改/etc/mk.conf。

您还可以:

● 用script(1)生成一个完整的构建过程描述。另外别删除配置信息。 ● 附上您的pkg_info(1)信息, 即使可能和它没有关系。 ● 如果出现gcc(1) 内部编译器错误请给gcc邮件列表发送一份错误报告, 并至少提供一份gcc -save-temps生成文档, 如 果您遵循他们的回复, 会节省大量的时间。 15.6 - 帮助我们

您可以从很多途径对我们提供帮助, 下面的列表提供了具体的方法, 由易至难:

● 报告错误用您的经历。 ● 您可以系统的测试ports并回复程序问题或者提供改进的方法。您仅需阅读Port Testing Guide. ● 测试在ports邮件列表上的ports更新 ● 发送一个ports的更新或补丁给ports维护人员, 如果这个port没有维护人就发到ports的邮件列表上。除非您的补丁或更 新会浪费开发者的时间而不是节约他们的时间, 否则大家全会感谢您的。 ● 如果您乐于助人并想掌握所有制作ports的方法, 您可以尝试自己制作ports, Building an OpenBSD Port给您提供 了一个良好的开端。

注意: 您必须使用当前版才能制作一个新port或者更新一个port, 因为当前版是在不断发展中, 所以, 通常情况下当前版并非 所有人期望使用的, 您要先确认自己心甘情愿使用当前版。

[ 索引] [第14章 - 配置磁盘]

[email protected] $OpenBSD: faq15.html, v 1.54 2008/11/12 22:27:21 steven Exp $

http://www.9971.us/OpenBSD4.5/c/faq15.html(第 16/16 页)2009-5-3 23:03:08 PF: The OpenBSD Packet Filter中文非官方版

[向上至FAQ] [下一小节: 开始]

PF: The OpenBSD Packet Filter

目录

● 基本配置 ❍ 开始

❍ 列表和宏

❍ 表格

❍ 包过滤

❍ 网络地址转换

❍ 重新定向网络通讯(端口转发)

❍ 定义规则的捷径

● 高级配置 ❍ 运行选项

❍ 净化(数据包标准化)

❍ 锚

❍ 数据包的排队和优先

❍ 地址池和负载均衡

❍ 数据包标记 (过滤策略)

● 附加议题 ❍ 纪录

❍ 性能

❍ FTP问题

❍ Authpf: 认证网关的用户shell

❍ 用CARP和pfsync实现防火墙冗余

● 规则集实例 ❍ 为家庭或小型办公环境搭建防火墙

Packet Filter (包过滤, 从现在开始我们称其为PF) 是OpenBSD开发的一套系统,它的功能是过滤 TCP/IP通讯和进行网络地址转换。 PF也可以保持TCP/IP通讯正常化、调整TCP/IP通讯、提供带

http://www.9971.us/OpenBSD4.5/c/pf/index.html(第 1/2 页)2009-5-3 23:03:43 PF: The OpenBSD Packet Filter中文非官方版 宽控制、建立数据包优先策略等功能。从OpenBSD 3.0开始,PF已经成为OpenBSD标准内核 GENERIC的一部分。此前的OpenBSD发行版使用一个不同的防火墙和网络地址转换软件包,目前 OpenBSD已经不再对它提供支持了。

PF最初由Daniel Hartmeier开发,目前由Daniel和OpenBSD团队的其他成员共同维护和发展。

这套文档仅对在OpenBSD上运行PF系统作了一般性的介绍,即便此文档涉及了所有PF的主要特 性,它也不能替代用户手册,这篇文档只是对用户手册的补充。此外这套文档也提供了 PDF 格 式。

想完全和深入地了解PF的功能, 请阅读 pf(4) 用户手册。

为了呼应此FAQ的其它章节,这套文档的重点针对OpenBSD 4.4 的用户。因为PF一直在持续的发 展完善,所以在OpenBSD的4.4发行版和当前版之间PF已经有了变化和提高,所以会不同于 OpenBSD4.4及以前的版本提供的PF,所以我们建议读者根据自己目前使用的OpenBSD版本,参阅 相关的PF版本用户手册。

[向上至FAQ] [下一小节: 开始]

[email protected] $OpenBSD: index.html, v 1.42 2009/01/07 21:59:18 steven Exp $

http://www.9971.us/OpenBSD4.5/c/pf/index.html(第 2/2 页)2009-5-3 23:03:43 PF: The OpenBSD Packet Filter中文非官方版 Example: Firewall for Home or Small Office

[上一小节:使用CARP和pfsync构建冗余防火墙] [总目录]

PF: 例子: 为家庭和小型办公环境搭建防火墙

目录

● 环境

❍ 网络

❍ 目标

❍ 准备

● 规则集

❍ 宏

❍ 选项

❍ 锚

❍ 网络地址转换

❍ 重定向

❍ 过滤规则

● 完整的规则集

环境

本例中, PF运行在OpenBSD计算机上作为一个小型的家庭或办公环境网络的防火墙和NAT网关。 整体目标是为内部网络提供Internet访问及有限地允许来自Internet访问防火墙主机, 并且让内部的 web服务器为Internet提供服务。这篇文章将提供一个完成此功能所需的完整规则集。

网络

建立的网络环境像这样:

[ COMP1 ] [ COMP3 ] | |

http://www.9971.us/OpenBSD4.5/c/pf/example1.html(第 1/7 页)2009-5-3 23:03:48 PF: The OpenBSD Packet Filter中文非官方版 Example: Firewall for Home or Small Office ---+------+-----+------xl0 [ OpenBSD ] fxp0 ------( Internet ) | [ COMP2 ]

内部网络上有一些计算机; 上面的图表仅显示了3台, 但实际数量并非如此。 除了COMP3还提供还 运行一个小型的web服务器, 这些计算机是标准的工作站, 平时用来上网冲浪、收发电子邮件、聊 天等。这些内部计算机使用192.168.0.0/255.255.255.0网段。

运行OpenBSD防火墙的是一台Celeron 300计算机, 带有两块网卡: 一块 3com 3c905B (xl0) 和一块 Intel EtherExpress Pro/100 (fxp0)。防火墙通过一根网线连接到Internet上并且使用NAT将这个连接共 享给内部网络。 外部接口上的IP地址是因特网提供商(ISP)动态分配的。

目标

目标是:

● 为每台内部计算机提供不受限制的Internet访问。 ● 使用一个"默认拒绝"过滤规则集。 ● 允许下列来自Internet的进站通讯到防火墙: ❍ SSH (TCP port 22): 这用来从外部维护防火墙计算机。 ❍ Auth/Ident (TCP port 113): 有些服务使用的, 例如SMTP 和 IRC。 ❍ ICMP Echo Requests: ping(8).使用的IMCP数据包。

● 重定向访问端口80的TCP的连接(这些连接要访问web服务器)到计算机COMP3。同时也允 许这些通讯通过防火墙访问COMP3。 ● 记录外部接口的日志。 ● 默认, 向被阻止数据包的发送者回应一条TCP RST或者ICMP Unreachable信息。 ● 力所能及地简化规则集并使它易于维护。

准备

这篇文章假设OpenBSD主机已经完全被配置为一个路由器, 包括验证IP网络设置, Internet连通性, 并且将 sysctl(3) 的变量 net.inet.ip.forwarding 和/或 net.inet6.ip6.forwarding 设定为 "1"。 你也必须用 pfctl(8) 或在 /etc/rc.conf.local 内设置适当的变量启动了PF。

规则集

我们下面将逐步完成规则集, 实现上述目标。

http://www.9971.us/OpenBSD4.5/c/pf/example1.html(第 2/7 页)2009-5-3 23:03:48 PF: The OpenBSD Packet Filter中文非官方版 Example: Firewall for Home or Small Office

下面定义的宏使维护和阅读这个规则集更简单:

ext_if="fxp0" int_if="xl0"

tcp_services="{ 22, 113 }" icmp_types="echoreq"

comp3="192.168.0.3"

前面两行定义了将要进行过滤的网络接口。这里通过定义它们, 如果我们必须将这个系统移到另 一台有不同硬件的计算机上, 我们可以仅修改这两行, 而其它的规则组还可以使用。第三第四行列 出了需要对Internet开放提供服务的TCP端口号(SSH 和 ident/auth)和允许通过防火墙的ICMP类型 数据包。最后一行定义了COMP3的IP地址。

注意: 如果Internet连接需要 PPPoE, 则过滤和NAT将转到tun0接口上, 而非在fxp0上。

选项

下面两行设置了阻止过滤规则的默认的回应动作并设定了在外部接口上的记录日志:

set block-policy return set loginterface $ext_if

每个Unix系统全有"loopback"(还回) 接口。它是一个虚拟的网络接口, 应用程序用此接口在系统内 部相同交流。OpenBSD的回环接口是 lo(4)。惯例是不在此接口上进行过滤, 使用 set skip 可以完成 这项工作。

set skip on lo

注意, 我们这里略过了对所有lo接口组的过滤, 这样的话, 我们以后应该增加别的回环接口呢, 我们 不必为在规则中修改这部分内容担心。

净化

没有理由不对进站通讯净化, 这也是推荐的, 只用简单的一行:

http://www.9971.us/OpenBSD4.5/c/pf/example1.html(第 3/7 页)2009-5-3 23:03:48 PF: The OpenBSD Packet Filter中文非官方版 Example: Firewall for Home or Small Office scrub in

网络地址转换

下面的规则可以为整个内部网络做NAT:

nat on $ext_if from !($ext_if) to any -> ($ext_if)

在本例中"!($ext_if)" 可以简单地用"$int_if"代替, 但是如果你增加了多个内部接口, 你需要增加额外 的NAT规则, 反之, 如果使用这个结构(译者注:不修改原来的语法结构, 还是用!($ext_if)), NAT会处 理所有保护的接口。

因为外部接口的IP地址是动态指派的, 圆括号告诉PF注意它里面的转换接口的IP地址变化。(译者 注:如前所述, PF会根据变化及时更新自己的规则)

因为我们想运行FTP代理, 我们也把NAT anchor 放进去:

nat-anchor "ftp-proxy/*"

重定向

第一个重定向规则是为 ftp-proxy(8) 设置的, 这样本地网络的FTP客户端就可以连接到Internet上的 FTP服务器。

rdr-anchor "ftp-proxy/*"

rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021

注意:这条规则仅能适用于到端口21的FTP连接。如果一台FTP服务器设定的是其它的通讯端口, 那 么应该使用一个列表指定的目标端口, 例如: from any to any port { 21, 2121 }。

最后的一条重定向规则捕获任何来自Internet去往防火墙TCP 80端口的连接。那些合法地访问这个 端口的连接请求是想访问内部网络的web服务器, 这些连接请求应该重定向到COMP3:

rdr on $ext_if proto tcp from any to any port 80 -> $comp3

http://www.9971.us/OpenBSD4.5/c/pf/example1.html(第 4/7 页)2009-5-3 23:03:48 PF: The OpenBSD Packet Filter中文非官方版 Example: Firewall for Home or Small Office 过滤规则

最开始一默认拒绝:

block in

这里, 所有的进站连接请求将被阻止, 即使是来自内部网络。后面的规则为实现上面的目标会开放 防火墙上的所需端口, 同时也开放所需的虚拟接口。

别忘了, PF可以在一个接口上阻止进站或出站的通讯, 你可以轻松地指定PF在一个方向上过滤通信 (进站或出站), 而不是让进站通讯的通讯直进直出。本例中, 我们选择过滤进站通讯, 但是一旦通讯 被允许进入一个接口, 我们并未打算阻止其离开, 所以我们定义了下面的规则:

pass out keep state

我们需要为ftp-proxy(8)提供一个锚:

anchor "ftp-proxy/*"

它可以很好地 阻止欺骗地址:

antispoof quick for { lo $int_if }

现在打开从Internet上访问网络服务所需的端口。 首先, 要允许通讯到防火墙本身:

pass in on $ext_if inet proto tcp from any to ($ext_if) \ port $tcp_services flags S/SA keep state

用宏 $tcp_services 指定网络端口, 它的优点是当你想添加新的服务时仅需简单地编辑这个宏并重新 载入过滤规则。通过建立一个宏 $udp_services 和添加一条过滤规则也可以开放UDP服务, 和上面 相似, 指定为 proto udp。

除了增加一条rdr规则将访问web服务器的通讯转发到COMP3, 我们也必须允许这个通讯通过防火 墙:

pass in on $ext_if inet proto tcp from any to $comp3 port 80 \

http://www.9971.us/OpenBSD4.5/c/pf/example1.html(第 5/7 页)2009-5-3 23:03:48 PF: The OpenBSD Packet Filter中文非官方版 Example: Firewall for Home or Small Office flags S/SA synproxy state

为了提高一点点儿安全, 我们将利用 握手代理 进一步保护web服务器。

ICMP通讯需要放行:

pass in inet proto icmp all icmp-type $icmp_types keep state

和宏 $tcp_services 相似, 也可以简单地通过编辑宏 $icmp_types 来定义允许抵达防火墙的ICMP数据 包类型。注意这条规则应用于所有网络接口。

现在必须放行内部网络的进出通讯, 我们这里假设内部网用户知道他们在干什么和不会惹麻烦, 这 可能不符合实际情况;多数环境需要一个限制更严格的规则集。

pass in quick on $int_if

TCP, UDP, 和 ICMP 通讯被允许通过防火墙去往Internet, 因为前面定义了"pass out keep state" 这行。 状态信息被保持了, 所以回程数据包可以通过防火墙。

完整的规则集

# macros ext_if="fxp0" int_if="xl0"

tcp_services="{ 22, 113 }" icmp_types="echoreq"

comp3="192.168.0.3"

# options set block-policy return set loginterface $ext_if

set skip on lo

# scrub scrub in

# nat/rdr

http://www.9971.us/OpenBSD4.5/c/pf/example1.html(第 6/7 页)2009-5-3 23:03:48 PF: The OpenBSD Packet Filter中文非官方版 Example: Firewall for Home or Small Office

nat on $ext_if from !($ext_if) -> ($ext_if:0) nat-anchor "ftp-proxy/*" rdr-anchor "ftp-proxy/*"

rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021 rdr on $ext_if proto tcp from any to any port 80 -> $comp3

# filter rules block in

pass out keep state

anchor "ftp-proxy/*" antispoof quick for { lo $int_if }

pass in on $ext_if inet proto tcp from any to ($ext_if) \ port $tcp_services flags S/SA keep state

pass in on $ext_if inet proto tcp from any to $comp3 port 80 \ flags S/SA synproxy state

pass in inet proto icmp all icmp-type $icmp_types keep state

pass in quick on $int_if

[上一小节:使用CARP和pfsync构建冗余防火墙] [总目录]

[email protected] $OpenBSD: example1.html, v 1.37 2009/01/25 18:09:49 jasper Exp $

http://www.9971.us/OpenBSD4.5/c/pf/example1.html(第 7/7 页)2009-5-3 23:03:48 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync

[上一小节: Authpf: 认证网关的User Shell] [总目录] [下一小节: 为家庭或小型办公环境搭建防火墙]

PF: 使用 CARP 和 pfsync 构建冗余防火墙

目录

● CARP介绍

● CARP操作

● CARP配置

● CARP范例

● pfsync介绍

● pfsync操作

● pfsync配置

● pfsync范例

● 结合CARP和pfsync完成故障切换和冗余

● 操作问题

❍ 启动时配置CARP和pfsync

❍ 强制切换主力机

❍ 规则集技巧

● 其它参考

CARP介绍

CARP是通用地址冗余协议。它的主要目的是允许位于用以网段的多台主机共享一个IP地址。相 对于 虚拟路由冗余协议(VRRP) 和 热备份路由协议(HSRP) 来说, CARP是一个安全、自由的替代 品。

CARP是通过允许位于同一网段的一组住主机共享一个IP地址, 这个组被称为"冗余组"。冗余组成 员间共享一个被分派的IP地址。在组内一台主机被指定为"主力机", 而其余的作为"热备份"。主力 机平时"持有"共享IP地址的;它应答所有外来的通讯或ARP请求。一台主机可以同时属于几个冗余 组。

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 1/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync CARP常用来构建一组冗余的防火墙。冗余组配置了虚拟IP作为客户端计算机的默认网关, 一旦主 力机失效或未连线, 这个IP将移到一台备份的防火墙上, 服务将继续而不会受影响。

CARP 支持 IPv4 和 IPv6.

CARP操作

主力机对本地网络发送定期的公告所以备份机知道它仍在正常工作。如果备份机在一个设定的时 间间隔内没有收到公告, 那么它们其中一台会接替主力机的工作(advbase及advskew值设置的最低的 那台)。

有可能在同一网段存在多个CARP组, CARP的公告包含了虚拟主机ID, 可以让组成员分辨出公告属 于哪个冗余组。

为了防止此网段内的恶意用户发送虚假的CARP公告, 每个组可以被指一个密码, 每个发到该组的 CARP数据包会采用SHA1 HMAC加密算法进行保护。

因为CARP采用它自己的协议, 所以需要在过滤规则里添加明确放行规则:

pass out on $carp_dev proto carp keep state

$carp_dev 是CARP通讯经过的物理接口。

CARP配置

每个carp(4) 虚拟网络接口表示一个冗余组。 CARP也使用 ifconfig(8) 来配置。

ifconfig carpN create

ifconfig carpN vhid vhid [pass password] [carpdev carpdev] \

[advbase advbase] [advskew advskew] [state state] ipaddress \

netmask mask carpN carp(4) 虚拟接口的名称, 这里的 N 是一个整数, 它表示这个虚拟接口的接口号(例如

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 2/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync carp10)。 vhid 虚拟主机ID。这是一个唯一的号码, 用它来区分这个冗余组与网络上的其它节点。有效值 从1到255。 password 认证密码。用来与同组的CARP主机通讯。组内所有成员的认证密码吗必须一致。 carpdev 这个可选项指定了一个属于此冗余组的物理网络接口。 默认情况下, CARP会在同一网段上 寻找一个物理接口提供给carp(4)接口前, 尝试指定使用哪个接口。 advbase 这个可选参数指定了向冗余组内成员公告的频率, 以秒为单位。默认值是1秒, 有效值从1到 255。 advskew 这个可选参数指定了发送CARP公告的误差(延迟)。 利用 advskew, 可以选择CARP主力机。 这个数值越大, 则越不可能被选为主力机。默认值是0, 有效值从0到254。 state 强制一个carp(4)接口进入特定的状态。有效的状态是init, backup, 和 master。 ipaddress 这是分配给冗余组的共享IP地址。这个IP地址不是必须和物理接口(如果存在)处于同一个 子网内。然而, 组内的所有主机这个地址必须相同。 mask 共享IP的子网掩码。

CARP的更多行为可以通过 sysctl(8) 来控制。 net.inet.carp.allow 是或否允许CARP进站数据包。默认值是1 (是). net.inet.carp.preempt 允许主机在一个更容易抢占主力机位置的冗余组(更好的advbase和advskew)。另外, 如果一 个接口出现故障这个选项会在所有的接口上启用故障切换。 如果一个启用CARP的物理接 口出现故障, CARP将把所有其它启用CARP的接口的advskew调整为240, 其实, 就是切换成自 己。这个选项默认是0(未启用)。 net.inet.carp.log 记录损坏的CARP数据包。默认是0 (未启用)。 net.inet.carp.arpbalance 在多个冗余组主机间通讯负载均衡。默认是0 (未启用)。参参阅 carp(4) 以获得更多的信 息。

CARP范例

这里有一个CARP配置的例子:

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 3/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync

# sysctl -w net.inet.carp.allow=1 # ifconfig carp1 create # ifconfig carp1 vhid 1 pass mekmitasdigoat carpdev em0 \ advskew 100 10.0.0.1 netmask 255.255.255.0

它完成了如下设置:

● 启用接收CARP数据包 (这是默认设置)。 ● 创建一个carp(4)接口carp1。 ● 为虚拟主机#1配置carp1, 启用一个密码, 将em0设置为属于这个组的接口, 将这台主机设置为 热备份, 因为 advskew 设置成了100 (当然, 这里假设主力机的 advskew 值小于100)。指派给这 个组的共享IP是10.0.0.1/255.255.255.0.

在carp1上运行ifconfig来显示这个接口的状态。

ifconfig carp1 carp1: flags=8802 mtu 1500 carp: BACKUP carpdev em0 vhid 1 advbase 1 advskew 100 groups: carp inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255 pfsync介绍 pfsync(4) 网络接口显示 pf(4) 状态表的确切变化。通过使用 tcpdump(8) 监视这个设备, 状态表的变 化可以实时显示。 此外, pfsync(4)接口能将这些状态变化信息发到这个网络外面的其它节点上, 上 面运行的PF能将这些变化并入自己的状态表内。同样, pfsync(4)也能监听网络上的进站信息。 pfsync操作

默认情况下, pfsync(4)不在网络上发送和接收状态表更新; 然而, 更新仍可在本机计算机上使用 tcpdump(8)监视更新。

当pfsync(4)设置好并在网络上发送和接收更新, 默认行为是在本地网络上组播更新, 所有更新的发 送不需要认证。通常的最优方法有下面两种:

1. 用一根交叉电缆背靠背的连接两个交换更新的节点, 并用那个接口作为同步设备syncdev(看

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 4/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync 下面)。 2. 用ifconfig(8)的syncpeer选项(看下面)以便将信息直接单播至对方, 然后在两台主机间配置 ipsec(4) 以保护pfsync(4)的通讯。

当在网络上发送和接收更新时, pfsync的数据包应该被主规则集放行:

pass on $sync_if proto pfsync

$sync_if 应该是 pfsync(4) 通讯采用的物理接口。 pfsync配置

因为pfsync(4)是一个虚拟网络接口, 所以用 ifconfig(8) 配置:

ifconfig pfsyncN syncdev syncdev [syncpeer syncpeer] pfsyncN pfsync(4)接口的名。使用GENERIC内核时pfsync0默认存在。 syncdev 用来发出 pfsync 更新的物理接口名。 syncpeer 这个可选项指定了与之交换 pfsync 更新的对方主机IP地址。默认情况下, 在本地网络上 pfsync更新是组播。这个选项调整组播的行为, 将其取代为用单播直接将更新发送到指定的 syncpeer 。 pfsync范例

这是一个配置 pfsync 的例子:

# ifconfig pfsync0 syncdev em1

这是在em1接口上启用pfsync。出站更新将在网络上组播, 允许任何运行pfsync的主机接收它们。

结合CARP和pfsync完成故障切换

通过结合CARP和pfsync的功能, 一组两台以上的防火墙能被用来创建一个高可用性、完全冗余的 防火墙集群。

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 5/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync

CARP: 负责从一个防火墙到另一个防火墙的故障切换。 pfsync: 负责在所有防火墙之间同步状态表。在故障切换时, 通讯通过经新的主力防火墙而不停 顿。

一个例子, 两个防火墙, fw1 和 fw2。

+----| WAN/Internet |----+ | | em2| |em2 +-----+ +-----+ | fw1 |-em1------em1-| fw2 | +-----+ +-----+ em0| |em0 | | ---+------Shared LAN------+---

这两个防火墙用一根交叉线背靠背连接在em1。全通过em0连接到LAN;通过em2连接到WAN/ Internet。 IP地址如下:

● fw1 em0: 172.16.0.1 ● fw1 em1: 10.10.10.1 ● fw1 em2: 192.0.2.1 ● fw2 em0: 172.16.0.2 ● fw2 em1: 10.10.10.2 ● fw2 em2: 192.0.2.2 ● LAN shared IP: 172.16.0.100 ● WAN/Internet shared IP: 192.0.2.100

网络策略是fw1是首选的主力机。

配置 fw1:

! enable preemption and group interface failover # sysctl -w net.inet.carp.preempt=1

! configure pfsync # ifconfig em1 10.10.10.1 netmask 255.255.255.0 # ifconfig pfsync0 syncdev em1 # ifconfig pfsync0 up

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 6/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync

! configure CARP on the LAN side # ifconfig carp1 create # ifconfig carp1 vhid 1 carpdev em0 pass lanpasswd \ 172.16.0.100 netmask 255.255.255.0

! configure CARP on the WAN/Internet side # ifconfig carp2 create # ifconfig carp2 vhid 2 carpdev em2 pass netpasswd \ 192.0.2.100 netmask 255.255.255.0

配置 fw2:

! enable preemption and group interface failover # sysctl -w net.inet.carp.preempt=1

! configure pfsync # ifconfig em1 10.10.10.2 netmask 255.255.255.0 # ifconfig pfsync0 syncdev em1 # ifconfig pfsync0 up

! configure CARP on the LAN side # ifconfig carp1 create # ifconfig carp1 vhid 1 carpdev em0 pass lanpasswd \ advskew 128 172.16.0.100 netmask 255.255.255.0

! configure CARP on the WAN/Internet side # ifconfig carp2 create # ifconfig carp2 vhid 2 carpdev em2 pass netpasswd \ advskew 128 192.0.2.100 netmask 255.255.255.0

操作问题

一些使用 CARP/pfsync 时常见的操作问题。

启动时配置CARP和pfsync

因为 carp(4) 和 pfsync(4) 全是网络接口类型, 可以通过创建一个 hostname.if(5) 文件以便在启动时配 置它们。 netstart 启动脚本可以完成创建接口和配置接口的工作。

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 7/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync 例如:

/etc/hostname.carp1 inet 172.16.0.100 255.255.255.0 172.16.0.255 vhid 1 carpdev em0 \ pass lanpasswd

/etc/hostname.pfsync0 up syncdev em1

强制切换主力机

这可能发生在故障切换或有目的的降级主力机节点。 例如包括为了维护关闭主力机或者发现并处 理一个问题。这里的目的是在用户丝毫没有察觉的情况下, 平稳地完成切换。

切换到一个指定的CARP组, 关闭主力节点上的carp(4)接口, 将导致主力机公告:自己带有一个"无限 大"的dvbase和advskew。备份机(们)将看见这个公告并立即担任主力机的角色。

# ifconfig carp1 down

也可以将主力机的advskew值增大到高于备份机的advskew值。这将导致切换但仍允许主力机参与 到CARP组中。

另一个故障切换的方法是调整CARP的demotion counter。 demotion counter用来衡量一台备机成为 主机的"预备"情况如何, 例如一台启动中的主机不太可能成为CARP主力机, 只能等到所有接口已经 配置完毕、所有网络进程已经启动等。 那些公告大demotion值的主机成为主力机的机会更小。 demotion counter储存在属于CARP接口的每个接口组中。默认情况下, 所有的CARP接口全是属 于"carp"接口组的成员。可以用 ifconfig(8) 查看目前的demotion counter数值:

# ifconfig -g carp carp: carp demote count 0

这个例子中显示了与"carp"接口组相关的counter。当一个CARP主机在网络上公告自己时, 它得到 所有接口组的demotion counters总和, 它将这个总和作为自己的demotion值公告。

现在假设下面的例子, 两个防火墙运行CARP带有如下的CARP接口:

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 8/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync

● carp1 -- 财务 ● carp2 -- 普通职员 ● carp3 -- Internet ● carp4 -- DMZ

目标是故障切换时, 仅将carp1和carp2组切换到第二个防火墙上。

首先, 将它们全部指派到一个新的接口组, 本例中被称为"internal":

# ifconfig carp1 group internal # ifconfig carp2 group internal # ifconfig internal carp1: flags=8843 mtu 1500 carp: MASTER carpdev em0 vhid 1 advbase 1 advskew 100 groups: carp internal inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255 carp2: flags=8843 mtu 1500 carp: MASTER carpdev em1 vhid 2 advbase 1 advskew 100 groups: carp internal inet 10.0.1.1 netmask 0xffffff00 broadcast 10.0.1.255

现在用 ifconfig(8) 增大 "internal" 组的demotion counter:

# ifconfig -g internal internal: carp demote count 0 # ifconfig -g internal carpdemote 50 # ifconfig -g internal internal: carp demote count 50

这个防火墙在carp1和carp2上被平稳地切换为防火墙集群内的其它防火墙, 但是这个防火墙还是 carp3和carp4的主力机。如果那个其它的防火墙开始公告自己有一个高于50的demotion值, 或者完 全停止公告, 那么这个防火墙会重新担当carp1和carp2的主力防火墙。

如果则合格防火墙不能返回主力位置, 做相反的变化:

# ifconfig -g internal -carpdemote 50 # ifconfig -g internal internal: carp demote count 0

网络进程诸如 OpenBGPD 和 sasyncd(8) 利用demotion counter来确保确保这个防火墙没有变成主力 机, 直到建立了BGP会话和IPsec SAs已经被同步。

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 9/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Firewall Redundancy with CARP and pfsync 规则集技巧

过滤物理接口. 至于和PF有关的, 网络通讯来自物理接口, 并非CARP虚拟接口(例如, carp0), 所以, 参 照词条编写规则。别忘了在PF规则中一个接口名可以使用物理接口名也可以使用这个接口被分配 的IP地址, 例如:下面的规则是正确的:

pass in on fxp0 inet proto tcp from any to carp0 port 22

但是如果用carp0替换fxp0就不会如你所愿正常工作了。

别忘记 放行carp协议和pfsync协议!

其它参考

请参阅这里的其它资源你获得更多的知识:

● carp(4)

● pfsync(4)

● ifconfig(8)

● hostname.if(5)

● pf.conf(5)

● ifstated(8)

● ifstated.conf(5)

[上一小节: Authpf: 认证网关的User Shell] [总目录] [下一小节: 为家庭或小型办公环境搭建防火墙]

[email protected] $OpenBSD: carp.html, v 1.22 2008/11/12 02:53:32 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/carp.html(第 10/10 页)2009-5-3 23:03:59 PF: The OpenBSD Packet Filter中文非官方版 Authpf: User Shell for Authenticating Gateways

[上一小节: FTP问题] [总目录] [下一小节: 使用 CARP 和 pfsync 构建冗余防火墙]

PF: Authpf: 认证网关的用户Shell

目录

● 介绍

● 配置

❍ 启用Authpf

❍ 将Authpf链接进主规则集

❍ 配置载入规则

❍ 访问控制列表

❍ 显示登入信息

❍ 指定Authpf做为用户的Shell

● 建立authpf的登录分类

● Seeing Who is Logged In

● Example

介绍

Authpf(8) 是一个认证网关的用户shell。一个认证网关就像一个一般网络上的网关(也被称作路由 器), 除了用户必须先经过网关的认证, 网关才会允许通讯通过。当用户的shell设置成 /usr/sbin/ authpf (例如, 代替原来的 ksh(1), csh(1), 等) 用户登录使用SSH, authpf 将作出必要的修改以激活 pf (4) 规则集, 这样用户的通信就可以通过过滤规则和/或使用NAT或重定向转换。一旦用户退出或者 他们的会话断开, authpf 将删除所有为用户载入的规则并移除所有用户开启的连接状态。因此, 只 有在用户在其SSH会话开启时才有能力通过网关通讯。

Authpf载入用户的过滤/NAT规则到唯一的锚点。这个锚的命名采用组合用户的Unix用户名和 authpf的进程ID号的格式"username(PID)"。每个用户的锚储存在authpf锚内, authpf锚依次被锚定在 主规则内。"完全合格的锚路径"就变成了:

main_ruleset/authpf/username(PID)

http://www.9971.us/OpenBSD4.5/c/pf/authpf.html(第 1/7 页)2009-5-3 23:04:04 PF: The OpenBSD Packet Filter中文非官方版 Authpf: User Shell for Authenticating Gateways

可以为每个客户或基于全局配置authpf载入的规则。

使用authpf的例子包括:

● 要求用户在访问Internet前先进行认证。 ● 允许特定的用户 —— 像系统管理员 -- 访问受限的网络。 ● 仅允许已知的用户访问网络的其余部分或者从一个无线网段访问Internet。 ● 允许员工从家里、路上等公司网络上的资源。办公室外的用户不仅要能访问公司的网络, 还能被重定向到指定的资源 (例如, 他们自己的桌面), 这基于对用户名的认证。 ● 在设置诸如库文件或其它带有互联网通道的地方, PF可以被配置成允许guest用户进行有限 的Internet访问。 Authpf可以提供给注册用户的全功能访问的权限。

Authpf通过 syslogd(8)在每个认证成功的用户登录或退出时记录他们的用户名和IP地址。有了这些 信息, 管理员可以了解什么人在何时登录了系统以及使用户对其网络通讯负责。

配置

配置authpf的所需的基本步骤罗列如下。想了解完整的authpf的配置请参阅 authpf用户手册。

启用Authpf

如果没有提供 /etc/authpf/authpf.conf 文件Authpf是不会运行的, 即使有是空文件(零尺寸)也不行, 这 个文件必须提供(有内容)否则authpf会在用户认证成功后马上退出。

下列的配置指令可以放进 authpf.conf:

● anchor=name - 使用指定的 锚 name 替代"authpf"。

● table=name - 使用指定的 表格 name 替代 "authpf_users"。

将Authpf链接进主规则集

通过使用锚规则可以将Authpf链接进主规则集:

nat-anchor "authpf/*" rdr-anchor "authpf/*" binat-anchor "authpf/*" anchor "authpf/*"

http://www.9971.us/OpenBSD4.5/c/pf/authpf.html(第 2/7 页)2009-5-3 23:04:04 PF: The OpenBSD Packet Filter中文非官方版 Authpf: User Shell for Authenticating Gateways 无论上面的锚规则放在规则集的什么位置, PF评估到它时将从主规则集里跳转出来评估authpf规 则。上面的4个锚规则没有必要全进行设置; 例如, 如果没有设置 authpf 载入任何nat规则, 则这条 nat-anchor 规则可以省略。

配置载入规则

Authpf 从一个或两个文件中载入自己的规则:

● /etc/authpf/users/$USER/authpf.rules ● /etc/authpf/authpf.rules

第一条规则仅在用户$USER (这里用用户名替代登录时才会被载入), 这个单用户规则配置的作用是 当一个特定的用户 —— 例如一个系统管理员 —— 需要一组与默认规则集不同的规则。 第二个文 件包含了默认规则, 载入默认规则是针对所有没有自己的authpf.rules文件的用户, 如果用户的特定 文件存在, 它将取代默认文件。至少上面的文件要有一个存在, 否则authpf不会运行。

过滤和转换规则有相同的语法, 就像在其它PF规则集里一样, 但是有一个例外: Authpf 允许使用两 个预定义的宏:

● $user_ip - 登录用户的IP地址 ● $user_id - 登录用户的用户名

推荐做法是只对认证成功的用户经网关并被规则允许的通讯使用 $user_ip 宏。

除了 $user_ip 宏, authpf 还能利用 authpf_users 表格(如果它存在) 来存储所有被认证用户的IP地址。 请确认在使用这个表格前它已经被定义了:

table persist pass in on $ext_if proto tcp from \ to port smtp flags S/SA keep state

这个表格只能在规则集里使用, 应该应用于所有已认证用户。

访问控制列表

可以禁止用户使用authpf, 方法是通过在 /etc/authpf/banned/ 目录里创建一个文件, 并以被禁止用户 的username命名这个文件。authpf断开他们前会把这个文件的内容显示给这个用户。这提供了一条 捷径告诉这个用户为什么他们不能访问以及联系谁可以恢复他们的访问权限。(译者理解:禁止多 个用户就建立多个文件;这里的"他们"可能是使用同一用户名的几个人, 或者是不同的用户名的多 个用户。)

http://www.9971.us/OpenBSD4.5/c/pf/authpf.html(第 3/7 页)2009-5-3 23:04:04 PF: The OpenBSD Packet Filter中文非官方版 Authpf: User Shell for Authenticating Gateways

反过来, 也可以仅允许指定的用户访问, 方法是将他们的用户名添加到 /etc/authpf/authpf.allow 文 件。如果 /etc/authpf/authpf.allow 这个文件不存在, 或者这个文件里有一个 "*", 则只要用户没有被明 确地禁止登录, authpf将允许任何通过SSH成功登陆的用户访问。

如果authpf无法确定是否允许或拒绝一个用户名, 它会打印一条简短的信息, 然后断开与该用户的 连接。 一个用户名如果同时出现在 /etc/authpf/banned/ 和 /etc/authpf/authpf.allow 内, 后者的设定将 被废除, 也就是这个用户将被拒绝。

显示登入信息

如果一个用户被authpf认证成功, 它会打印一条问候信息告知用户已认证成功。

Hello charlie. You are authenticated from host "64.59.56.140"

你也可以为这个显示做一些补充, 将补充的信息放在 /etc/authpf/authpf.message 文件里, 这个文件的 内容将在默认欢迎信息后显示。

指定Authpf做为用户的Shell

为了让authpf正常工作, 它必须被指定为登入用户的shell, 当用户通过了 sshd(8) 的认证后, authpf将 作为这个用户的shell。它会检查是否这个用户被允许使用authpf, 从相关文件中载入规则集等。

可以通过两种方式将authpf指定为用户的shell:

1. 使用 chsh(1), vipw(8), useradd(8), usermod(8)等手动对每个客户进行指定。 2. 将一些用户指派到同一个登录分类中, 然后在 /etc/login.conf 里更改这个登录分类的shell选 项。

建立authpf的登录分类

启用了authpf的系统上有普通用户帐号和authpf用户帐号, 为所有authpf用户设置一个单独的登录分 类是有益处的, 这样可以针对这些用户进行全局调控并且可以为普通用户和authpf用户设置不同的 策略。下面是一些策略的例子:

● shell - 指定一个用户的登录shell。不管在 passwd(5) 数据库内定义的用户shell是什么, 强制用 户使用authpf。 ● welcome - 指定用户登入后显示哪一个 motd(5) 文件。这可用来显示仅与authpf用户相关的 信息。

http://www.9971.us/OpenBSD4.5/c/pf/authpf.html(第 4/7 页)2009-5-3 23:04:04 PF: The OpenBSD Packet Filter中文非官方版 Authpf: User Shell for Authenticating Gateways 登录分类在 login.conf(5) 文件中创建。 OpenBSD自定义了一个authpf登录分类:

authpf:\ :welcome=/etc/motd.authpf:\ :shell=/usr/sbin/authpf:\ :tc=default:

通过编辑用户的 passwd(5) 数据库选项中的分类区域可以为用户指定一个登录分类, 一个方法是用 chsh(1) 命令来完成。

查看登录用户

一旦一个用户登入了系统并且authpf已经调整了PF规则, authpf将把自己的进程名称换成该用户的 用户名和IP地址:

# ps -ax | grep authpf

23664 p0 Is+ 0:00.11 -authpf: [email protected] (authpf)

用户charlie从位于192.168.1.3的机器上登入。通过向authpf进程发送一个SIGTERM信号可以将该用 户踢出, Authpf也会删除为此用户载入的规则集并中断所有此用户打开的状态化连接。

# kill -TERM 236644

例子

本例中Authpf被使用在OpenBSD网关上来认证一个大型校园网上的无线网络的用户。一旦用户认 证成功, 这里假设他们不在禁止名单上, 他们就被允许使用SSH浏览站点(包括安全站点)以及访问 任何校园DNS服务器。

这里的 /etc/authpf/authpf.rules 文件包含了如下内容:

wifi_if = "wi0"

pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \ https } flags S/SA keep state

http://www.9971.us/OpenBSD4.5/c/pf/authpf.html(第 5/7 页)2009-5-3 23:04:04 PF: The OpenBSD Packet Filter中文非官方版 Authpf: User Shell for Authenticating Gateways

管理员查理需要能访问校园的SMTP和POP3服务器以及上网冲浪和使用SSH, 为此将在 /etc/authpf/ users/charlie/authpf.rules 文件里设置如下规则:

wifi_if = "wi0" smtp_server = "10.0.1.50" pop3_server = "10.0.1.51"

pass in quick on $wifi_if proto tcp from $user_ip to $smtp_server \ port smtp flags S/SA keep state pass in quick on $wifi_if proto tcp from $user_ip to $pop3_server \ port pop3 flags S/SA keep state pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \ https } flags S/SA keep state

主规则集位于 /etc/pf.conf , 进行了如下设置:

# macros wifi_if = "wi0" ext_if = "fxp0" dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

table persist

scrub in all

# filter block drop all

pass out quick on $ext_if inet proto tcp from \ { $wifi_if:network, $ext_if } flags S/SA modulate state pass out quick on $ext_if inet proto { udp, icmp } from \ { $wifi_if:network, $ext_if } keep state

pass in quick on $wifi_if inet proto tcp from $wifi_if:network to $wifi_if \ port ssh flags S/SA keep state

pass in quick on $wifi_if inet proto { tcp, udp } from \ to $dns_servers port domain keep state anchor "authpf/*" in on $wifi_if

http://www.9971.us/OpenBSD4.5/c/pf/authpf.html(第 6/7 页)2009-5-3 23:04:04 PF: The OpenBSD Packet Filter中文非官方版 Authpf: User Shell for Authenticating Gateways 这个规则集很简单, 完成了下面的工作:

● 拒绝所有(默认拒绝)。 ● 在外部接口上放行来自无线网络及网关自己的出站 TCP, UDP, 和 ICMP 通讯。 ● 放行所有自无线网络至网关的SSH通讯。这条规则是允许用户登录的, 必须设置。 ● 放行所有自认证用户至校园DNS服务器的进站DNS请求。 ● 为无线网络上的进站通讯创建锚点 "authpf"。

这个主规则集的思路是禁止所有并尽可能地减少通讯量。通讯可以自由地去往外部接口, 但是会 被默认拒绝策略阻挡在无线接口的入口上。一旦用户得到认证, 他们的通讯将被允许进入无线网 接口并可以通过网关到达网络的其它部分。规则里贯穿使用了quick 关键字以便当一个新连接通 过网关时PF不必逐条评估每个命名的规则。

[上一小节: FTP问题] [总目录] [下一小节: 使用 CARP 和 pfsync 构建冗余防火墙]

[email protected] $OpenBSD: authpf.html, v 1.24 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/authpf.html(第 7/7 页)2009-5-3 23:04:04 PF: The OpenBSD Packet Filter中文非官方版 Issues with FTP

[上一小节: 性能] [总目录] [下一小节: Authpf: 认证网关的用户shell]

PF: FTP问题

目录

● FTP的模式

● 在防火墙后的FTP客户端

● PF"自保护"FTP服务器

● FTP服务器通过外部的PF防火墙运行NAT来保护

● 更多关于FTP的信息

● 代理TFTP

FTP的模式

FTP是一种协议, 它可以追溯到当互联网还是一个小的、友好的计算机的集合, 并且这个集合中的 每个人相互熟识。那个时候过滤或严格的安全是没有必要的。 FTP不是为过滤、通过防火墙、或 者工作在NAT下设计的。

你可以用两种模式使用FTP: 被动与主动。通常, 选择主动或被动模式是由谁通过防火墙有困难来 决定的。实际上, 为了满足不同用户你的服务器不得不支持这两种方式。

对主动模式的FTP来说, 当一个用户连接到一台远程的FTP服务器并请求信息或一个文件, FTP服务 器会创建一个新的与客户端的连接来传送请求的数据, 这个连接被称为数据连接。为了开始传送, FTP客户端随机选择一个端口来接收这个数据连接, FTP客户端将选择的端口号发送给FTP服务器 并在这个端口上监听进站连接, 然后FTP服务器就发起一个到客户端选择端口的连接并开始传送数 据。如果用户在NAT网关的后面想访问FTP服务器会存在一个问题, 这是因为NAT的工作机制导致 的, FTP服务器通过连接NAT网关的外部地址及端口建立了数据连接, 作为网关的机器会收到这些 数据, 但是因为这些数据并未被映射到它的状态表上, 所以它会丢弃这些数据而不是将它们传送到 客户端。

对于被动模式的FTP来说(OpenBSD ftp(1) 客户端的默认模式), 客户端请求服务器随机挑选一个服 务器的端口作为数据连接来监听, 服务器告诉客户端它已经选择了自己的哪个端口, 然后客户端连

http://www.9971.us/OpenBSD4.5/c/pf/ftp.html(第 1/5 页)2009-5-3 23:04:09 PF: The OpenBSD Packet Filter中文非官方版 Issues with FTP

接到那个端口上传送数据。遗憾的是, 这种方式并非总是可能或令人满意, 因为位于服务器前的防 火墙可能会阻止来自客户端的进站数据连接。 OpenBSD的 ftp(1)默认使用被动模式; 要强制使用主 动模式的FTP, 就要在连接时使用 -A 标记, 或者在"ftp>"提示符下输入命令 "passive off" 来设定关闭 被动模式。

在防火墙后的FTP客户端

如上所述, FTP通过NAT或防火墙时工作的不太好。

PF提供了一个解决的办法, 就是通过一台FTP代理服务器将FTP通讯重新定向。它是通过PF的锚系 统在PF上添加适当的放行规则并在完成时删除它们, 这样可以让FTP代理服务器充当一个引导员角 色来 "指引" FTP通讯通过NAT网关或防火墙。PF使用的FTP代理是 ftp-proxy(8)。

要激活它, 将类似下面的内容添加到 pf.conf 文件中的NAT部分:

nat-anchor "ftp-proxy/*" rdr-anchor "ftp-proxy/*" rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \ port 8021

前面两行是一对锚, 它们被ftp代理用来根据需要在运行时添加规则以管理你的FTP通讯。最后一行 是将FTP从你的客户端重定向到ftp代理程序ftp-proxy(8)上, 它监听你机器的8021端口。

你还需要在规则部分添加一个锚:

anchor "ftp-proxy/*"

我们显然希望现在就在OpenBSD的机器上启动并运行代理服务器, 这需要将下面这行添加到 /etc/ rc.conf.local:

ftpproxy_flags=""

这样不用重新启动系统就可以通过root激活并启用ftp代理程序。 ftp代理在端口8021上监听, 上面rdr语句也是将FTP通讯发送到这个端口上。

启用主动模式连接, 你需要 ftp-proxy(8) 加上 '-r' 参数(为了如此你必须在运行老代理时采用 "-u root")。

http://www.9971.us/OpenBSD4.5/c/pf/ftp.html(第 2/5 页)2009-5-3 23:04:09 PF: The OpenBSD Packet Filter中文非官方版 Issues with FTP

PF"自保护"FTP服务器

这种情况下, PF自己运行在一台FTP服务器上, 而不是运行在作为专用防火墙的计算机上。处理被 动的FTP连接时, FTP将为进站数据随机选择一个高端TCP端口。默认情况下, OpenBSD本地FTP服 务器 ftpd(8) 随机选择端口的范围是49152到65535。很显然, 端口21(FTP控制端口)和这些高端端口 必须在过滤规则上设置为放行:

pass in on $ext_if proto tcp from any to any port 21 keep state pass in on $ext_if proto tcp from any to any port > 49151 \ keep state

注意, 如果你希望, 你可以大幅度缩小高端端口的范围。对于OpenBSD的 ftpd(8) 程序而言, 设定范 围使用 sysctl(8) 的变量 net.inet.ip.porthifirst 和 net.inet.ip.porthilast。

FTP服务器通过外部的PF防火墙运行NAT来保护

这种情况下, 防火墙除了不能封闭所需的端口外, 还必须将通讯重定向到FTP服务器上。我们还要 依靠FTP代理ftp-proxy(8)来完成此任务。 ftp-proxy(8)的运行模式可将所有FTP连接转发到特定的服务器, 主要是通过监听防火墙的21端口以 及将所有连接转发到后端的服务器上。

编辑 /etc/rc.conf.local 并添加如下内容:

ftpproxy_flags="-R 10.10.10.1 -p 21 -b 192.168.0.1"

这里 10.10.10.1 实际FTP服务器的IP地址, 21 是我们希望 ftp-proxy(8) 监听的端口, 而192.168.0.1是防 火墙的IP地址, 我们想将代理绑定在上面。

现在对 pf.conf 规则:

ext_ip = "192.168.0.1" ftp_ip = "10.10.10.1"

nat-anchor "ftp-proxy/*" nat on $ext_if inet from $int_if -> ($ext_if)

http://www.9971.us/OpenBSD4.5/c/pf/ftp.html(第 3/5 页)2009-5-3 23:04:09 PF: The OpenBSD Packet Filter中文非官方版 Issues with FTP rdr-anchor "ftp-proxy/*"

pass in on $ext_if inet proto tcp to $ext_ip port 21 \ flags S/SA keep state pass out on $int_if inet proto tcp to $ftp_ip port 21 \ user proxy flags S/SA keep state anchor "ftp-proxy/*"

这里我们允许到外部接口端口21的进站连接, 同时也允许与之相应的到FTP服务器的出站连接。这 里的 "user proxy" 加上出站规则确保了只有 ftp-proxy(8) 发起的连接才被允许。

注意如果你既想让 ftp-proxy(8) 保护FTP服务器, 又想防火墙后的客户端连接到外面的FTP服务器, 那么两个例子中的 ftp-proxy 全需要。

更多有关FTP的信息

更多有关FTP过滤及FTP通常是如何工作的请参阅这份白皮书:

● FTP Reviewed

代理TFTP

普通文件数传协议 (TFTP) 通过防火墙时收到的限制和FTP一样。幸运的是, PF提供了一个TFTP助 手, 就是 tftp-proxy(8). tftp-proxy(8) 的设置和 ftp-proxy(8) 的设置大同小异, 可参看上面的 在防火墙后的FTP客户端 部 分。

nat on $ext_if from $int_if -> ($ext_if) rdr-anchor "tftp-proxy/*" rdr on $int_if proto udp from $int_if to port tftp -> \ 127.0.0.1 port 6969

anchor "tftp-proxy/*"

上面的规则允许TFTP从内部网络出站到外部网络的TFTP服务器。

最后一步是在 inetd.conf(5) 里启用tftp-proxy一边它可以监听同上面rdr规则指定的相同端口, 这个例

http://www.9971.us/OpenBSD4.5/c/pf/ftp.html(第 4/5 页)2009-5-3 23:04:09 PF: The OpenBSD Packet Filter中文非官方版 Issues with FTP 子中是 6969 。

127.0.0.1:6969 dgram udp wait root /usr/libexec/tftp-proxy tftp-proxy

不像 ftp-proxy(8), tftp-proxy(8) 需要依赖inetd。

[上一小节: 性能] [总目录] [下一小节: Authpf: 认证网关的用户shell]

[email protected] $OpenBSD: ftp.html, v 1.27 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/ftp.html(第 5/5 页)2009-5-3 23:04:09 PF: The OpenBSD Packet Filter中文非官方版 Performance

[上一小节: 记录] [总目录] [下一小节: FTP问题]

PF: 性能

"PF能处理多大的带宽?" "我需要多少计算机处理我的Internet连接?"

无法简单地回答这些问题。对一些应用来说, 一台486/66带两块好的ISA网卡可以过滤和转换大约 5Mbps流量, 但对另一些应用来说一台快很多的计算机和更加高效的PCI网卡可能也不够。 真正的 问题不是每秒能处理多少字节的流量, 而是使用每秒能处理多少个数据包以及规则集的复杂程 度。

PF 的性能由一些因素决定:

● 每秒的数据包数量 —— 1500字节的数据包和只有1字节数据包所需的处理次数几乎是一样 的。每秒多少个数据包意味着每秒多少次状态表和, 假设没有匹配, 过滤规则一刻不停地被 评估, 意味着对系统性能的有效需求。 ● 你系统总线的性能 —— ISA总线最大带宽为 8MB/sec, 并且当处理器访问它时, 它不得不把自 己的有效速度降到80286的8MHz, 不管你的处理器多快。PCI总线有好的多有效带宽和兼容 性。 ● 网卡的效率 —— 一些网卡就是比其它的高效, 基于Realtek 8139 ( rl(4))的卡较差, 而基于Intel 21143 (dc(4))的很好。为了追求最高的性能, 请考虑千兆以太网卡, 即使不是连接到千兆网络 上, 因为千兆网卡有更多的缓存。 ● 规则集的复杂性和设计 —— 规则集越复杂越慢。越多的数据包被keep state和quick规则过滤 性能越好。需要评估的规则行数越多性能越差。 ● 勉强的影响因素:CPU和内存 —— 因为PF是基于内核的程序, 它不使用交换空间, 因此, 如果 你有足够的内存它就可以运行, 如果内存少, 会导致 pool(9) 耗尽性能变差。也不需要大量的 内存—— 32MB 可提供约30, 000个状态, 对小型办公环境和家庭应用来说这是很大的数量 了。多数用户会发现一台"再利用" 的计算机足以应付PF系统—— 如果设定好网卡和规则 集, 一台300MHz的系统就可以迅速传送大量的数据包。

多处理器可以提高性能吗?

PF只用一个处理器, 所以多处理器(或多核)不能改善PF的性能。然而, 在某些环境下因为中断处理 的差别, 用SMP版本的OpenBSD(bsd.mp替代bsd)将获得更好的性能。多数情况下使用bsd.mp 将降

http://www.9971.us/OpenBSD4.5/c/pf/perf.html(第 1/2 页)2009-5-3 23:04:11 PF: The OpenBSD Packet Filter中文非官方版 Performance 低PF的性能。如果你发现性能上有问题, 可以试验一下, 别太费心, 一般情况下不会出现奇迹。

有没有基准?

人们经常询问PF的基准。唯一有效的基准就是在你的环境下你的系统性能。一个没有复制你环境 的基准并不能适当地帮助你设计自己的防火墙。最好的做法是自己制定自己基准, 在与防火墙实 际使用相同或尽可能接近的网络条件下使用相同的硬件进行测试调整。

PF运行在一些非常大型、高流量的应用上, 并且开发者是PF的"超级用户", 还有, 就是它会为你做得 很完美。

[上一小节: 记录] [总目录] [下一小节: FTP问题]

[email protected] $OpenBSD: perf.html, v 1.23 2008/12/04 22:15:02 steven Exp $

http://www.9971.us/OpenBSD4.5/c/pf/perf.html(第 2/2 页)2009-5-3 23:04:11 PF: The OpenBSD Packet Filter中文非官方版 Logging

[上一小节: 数据包标记] [总目录] [下一小节: 性能]

PF: 记录

目录

● 介绍

● 记录数据包

● 阅读日志文件

● 过滤日志输出

● 通过Syslog记录数据包

介绍

当一个数据包被PF记录时, 一份数据包头的拷贝被发送到 pflog(4) 接口, 同时还有一些额外的信息, 像数 据包经过的接口, PF采取的动作(放行或禁止), 等。pflog(4) 接口允许用户空间的应用程序从内核接收PF 的记录数据。如果系统启动时启用了PF, 守护进程 pflogd(8) 就会启动。默认 pflogd(8) 监听 pflog0 接口 并将所有记录的数据写到日志文件 /var/log/pflog 中。

记录数据包

为了记录通过PF的数据包, 必须在 NAT/rdr 和 filter 规则里使用 log 关键字。 注意PF只能记录那些自己 放行或禁止的数据包;你不能指定一条规则仅记录数据包。 log 关键字将使所有匹配此规则的数据包被记录。这种情形下如果这条规则产生了状态, 仅有看见的第 一个数据包(导致产生状态的数据包)会被记录。

可以提供给 log 关键字的选项是: all 将使所有的匹配数据包, 而非仅有初始化数据包被记录。对产生状态的规则很有用。 to pflogN 将所有的匹配数据包记录到指定的 pflog(4) 接口。例如, 当使用 spamlogd(8) 时, PF将所有的SMTP 通讯记录到专用的 pflog(4) 接口。守护进程 spamlogd(8) 被告知监听哪个接口。这可以使PF的主

http://www.9971.us/OpenBSD4.5/c/pf/logging.html(第 1/5 页)2009-5-3 23:04:15 PF: The OpenBSD Packet Filter中文非官方版 Logging

日志文件里没有SMTP通讯的记录而且它们也没有必要被记录在主日志里。 使用 ifconfig(8) 来建 立 pflog(4) 接口, 默认的记录接口 pflog0 是自动创建的。 user 将UNIX的user-id和group-id拥有的套接字, 数据包的sourced from/destined to(无论具体位置)与常 规的记录信息一同记录下来。

选项在 log 关键字的后面的圆括号内给出;多个选项可以用逗号或空格分开。

pass in log (all, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state

阅读日志文件 pflogd写入的日志文件是二进制格式, 不能使用文本编辑器阅读。想阅读日志必须使用Tcpdump。

查看日志文件:

# tcpdump -n -e -ttt -r /var/log/pflog

注意, 用tcpdump(8)看pflog文件时并不是实时显示的。要完成一个记录数据包的实时日志显示必须使 用 pflog0 接口:

# tcpdump -n -e -ttt -i pflog0

注意: 当试验日志时, 要特别小心tcpdump的详细协议解码(通过在命令行里增加 -v 选项)。Tcpdump的协 议解码器并没有完美的安全历史。 至少在理论上, 通过日志设备记录的部分数据包信息可能发起一个 延时的攻击。 推荐的标准做法是在进行试验前将日志文件从防火墙所在机器移出来。

另一个需要注意的是安全地访问日志文件。默认情况下, pflogd 把数据包的96个字节记录在日志文件 里, 访问日志文件就能访问数据包的部分敏感信息(像 telnet(1) 或 ftp(1) 的用户名和密码等).

过滤输出日志

因为pflogd记录采用tcpdump二进制格式, 当查看这些记录时可以使用tcpdump的全部功能。例如, 例如 只查看匹配一个特定端口的数据包:

# tcpdump -n -e -ttt -r /var/log/pflog port 80

http://www.9971.us/OpenBSD4.5/c/pf/logging.html(第 2/5 页)2009-5-3 23:04:15 PF: The OpenBSD Packet Filter中文非官方版 Logging

可以通过指定到特定主机和端口的数据包得到更精确的结果:

# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3

同样, 这种思路也可以用在从pflog0接口读取:

# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

注意, 这并不影响数据包被记录到pflogd的日志文件; 上面的命令仅显示正在被记录的数据包。

除了使用标准的 tcpdump(8) 过滤规则, 为了阅读pflogd的输出tcpdump过滤语言代码已经进行的扩展:

● ip - 地址族是IPv4。 ● ip6 - 地址族是IPv6。 ● on int - 数据包经过接口int。 ● ifname int - 同上。 ● ruleset name - 数据包匹配的规则集/锚。

● rulenum num - 数据包匹配的过滤规则号码 num。 ● action act - 对数据包执行的动作。可能的动作是 pass 和 block。 ● reason res - 执行动作的原因。可能的原因是match, bad-offset, fragment, short, normalize, memory, bad-timestamp, congestion, ip-option, proto-cksum, state-mismatch, state-insert, state-limit, src-limit, 和 synproxy。 ● inbound - 数据包进站。 ● outbound - 数据包出站。

例如:

# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0

这将实时显示在wi0接口上被阻止的进站数据包的记录。

通过Syslog记录数据包

在许多情况下, 我们希望有ASCII格式的防火墙日志和/或把它们发送到一个远程日志服务器。所有这些 可以通过用一个小的 shell 脚本, OpenBSD配置文件的一些小改动, 以及守护进程 syslogd(8) 来完成。 Syslogd以ASCII格式记录并可以发送到一个远程日志服务器上。

http://www.9971.us/OpenBSD4.5/c/pf/logging.html(第 3/5 页)2009-5-3 23:04:15 PF: The OpenBSD Packet Filter中文非官方版 Logging

创建下列脚本:

/etc/pflogrotate

#!/bin/sh PFLOG=/var/log/pflog FILE=/var/log/pflog5min.$(date "+%Y%m%d%H%M") kill -ALRM $(cat /var/run/pflogd.pid) if [ -r $PFLOG ] && [ $(stat -f %z $PFLOG) -gt 24 ]; then mv $PFLOG $FILE kill -HUP $(cat /var/run/pflogd.pid) tcpdump -n -e -ttt -r $FILE | logger -t pf -p local0.info rm $FILE fi

编辑 root 的 定时任务cron job:

# crontab -u root -e

加上下面的两行:

# rotate pf log file every 5 minutes 0-59/5 * * * * /bin/sh /etc/pflogrotate

将下面这行加到/etc/syslog.conf:

local0.info /var/log/pflog.txt

如果你还想记录到一个远程日志服务器上, 加上这行:

local0.info @syslogger

确定主机 syslogger 已经在 hosts(5) 文件中被定义过了。

创建文件 /var/log/pflog.txt 以允许syslog记录到那个文件, 并赋予它和pflog文件同样的权限。

http://www.9971.us/OpenBSD4.5/c/pf/logging.html(第 4/5 页)2009-5-3 23:04:15 PF: The OpenBSD Packet Filter中文非官方版 Logging

# touch /var/log/pflog.txt # chmod 600 /var/log/pflog.txt

重新启动syslogd以使其应用新配置:

# kill -HUP $(cat /var/run/syslog.pid)

所有记录的数据包现在被发送到 /var/log/pflog.txt。如果增加了第二行(译者注:这里应该是指 "local0.info @syslogger" 这行), 它们也会被发送到远程的日志主机 syslogger 上。

脚本 /etc/pflogrotate 现在运行, 然后删除 /var/log/pflog, 所以通过 newsyslog(8) 对pflog进行归档转储也就 不再有必要了, 应禁用。 然而, 因为 /var/log/pflog.txt 代替/var/log/pflog 存贮记录的日志, 所以对 /var/log/ pflog.txt 的归档转储应该被激活。像这样更改 /etc/newsyslog.conf:

#/var/log/pflog 600 3 250 * ZB /var/run/pflogd.pid <------禁用对pflog的归档转储 /var/log/pflog.txt 600 7 * 24 <------启用对pflog.txt的归档转储

PF将日志以ASCII格式记录到 /var/log/pflog.txt 文件。如果在 /etc/syslog.conf 内也做了这样的配置, 日志 也将被记录到一台远程的日志服务器上。记录不会马上开始, 当开始记录后约5-6分钟 (定时任务间隔) 被记录的数据包才会出现在日志文件中。

[上一小节: 数据包标记] [总目录] [下一小节: 性能]

[email protected] $OpenBSD: logging.html, v 1.36 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/logging.html(第 5/5 页)2009-5-3 23:04:15 PF: The OpenBSD Packet Filter中文非官方版 Packet Tagging (Policy Filtering)

[上一小节: 地址池和负载均衡] [总目录] [下一小节: 记录]

PF: 数据包标记 (过滤策略)

目录

● 介绍

● 给数据包设定标记

● 检查已贴标记

● 过滤策略

● 标记以太帧

介绍

包标记是一种给数据包贴上内部标识符以便以后可以在过滤和转换规则标准中应用的一种方法。 经过标记, 有可能做这样的事情, 例如在接口间建立信任以及确认是否数据包经过转换规则处理。 它还可以使过滤方式从基于规则的过滤变成基于策略的过滤。

给数据包设定标记

给数据包添加标记要使用 tag 关键字:

pass in on $int_if all tag INTERNAL_NET keep state

这条规则将给所有匹配上述规则的数据包贴上INTERNAL_NET标记。

标记也可以通过 宏 指派。例如:

name = "INTERNAL_NET" pass in on $int_if all tag $name keep state

http://www.9971.us/OpenBSD4.5/c/pf/tagging.html(第 1/5 页)2009-5-3 23:04:17 PF: The OpenBSD Packet Filter中文非官方版 Packet Tagging (Policy Filtering)

同样也可以使用一组预定义的宏。

● $if - 接口 ● $srcaddr - 源IP地址 ● $dstaddr - 目标IP地址 ● $srcport - 源端口 ● $dstport - 目标端口 ● $proto - 协议 ● $nr - 规则号

这些宏将在规则集载入时被扩展, 而不是运行时才扩展。

标记数据包遵循如下规则:

● 标记是"粘"的。一旦匹配的规则给一个数据包"贴"上了标记, 则这个标记永远不会被删除, 除 非被其它的标记替代。 ● 因为标记的"粘性", 即使最后一条匹配的规则没有使用tag关键字, 数据包上仍然有标记。 ● 一个数据包只能有一个标记。 ● 标记是 内部 的鉴别符。标记不会被发到外面。 ● 标记名称最多可用63个字符。OpenBSD 4.0和以前版本的标记名称长度只有15个字符。

使用下面的规则集举例。

(1) pass in on $int_if tag INT_NET keep state (2) pass in quick on $int_if proto tcp to port 80 tag \ INT_NET_HTTP keep state (3) pass in quick on $int_if from 192.168.1.5 keep state

● $int_if上进站数据包将被"贴"上INT_NET标记。#1 ● $int_if上进站并去往端口80的TCP数据包首先被规则#1贴上INT_NET标记, 这个INT_NET标 记随后被会规则#2替换为INT_NET_HTTP标记。#2 ● 从192.168.1.5到$int_if的进站数据包的标记有两种可能。 如果这是去往端口80的TCP数据包, 它将匹配规则#2, 并被贴上INT_NET_HTTP标记。否则这个数据包将匹配规则#3, 但是也会 被贴上INT_NET标记, 因为这个数据包也匹配规则#1, 贴上的INT_NET标记不会被移除除非 一条后面的规则指定了一个新的标记(这就是所谓的标记的 "粘性")。

除了使用过滤规则可以给数据包贴标记外, nat、rdr及binat等转换规则也可以使用 tag 关键字给数 据包贴标记。

检查已贴标记

http://www.9971.us/OpenBSD4.5/c/pf/tagging.html(第 2/5 页)2009-5-3 23:04:17 PF: The OpenBSD Packet Filter中文非官方版 Packet Tagging (Policy Filtering)

要检查先前的已贴标记要使用 tagged 关键字:

pass out on $ext_if tagged INT_NET keep state

从$ext_if的出站数据包必须已经贴上了INT_NET标记才能匹配上面的规则。相反地匹配也可以通 过使用 ! 操作符实现:

pass out on $ext_if ! tagged WIFI_NET keep state

转换规则(nat/rdr/binat) 也可以使用 tagged 关键字匹配数据包。

过滤策略

过滤策略使用不同的方法写过滤规则。策略定义了什么类型的通讯匹配什么规则后被放行或阻 止, 然后数据包基于传统的标准源/目标IP地址/端口、协议等按照策略分为不同的类型。例如, 检 查下面的防火墙策略:

● 允许从内部LAN(LAN_INET)到Internet的通讯 并且必须已经被转换(LAN_INET_NAT) ● 允许从内部LAN到DMZ(LAN_DMZ)的通讯 ● 允许从Internet到位于DMZ的服务器(INET_DMZ)的通讯 ● 允许将来自Internet的通讯重定向到 (8) (SPAMD)

● 禁止所有其它的通讯

注意策略是如何覆盖所有通过防火墙的通讯的。圆括号内是用于策略的标记。

需要编写过滤及转换规则以便按策略分类数据包。

rdr on $ext_if proto tcp from to port smtp \ tag SPAMD -> 127.0.0.1 port 8025 nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)

block all pass in on $int_if from $int_net tag LAN_INET keep state pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state

现在设置定义策略的规则。

pass in quick on $ext_if tagged SPAMD keep state

http://www.9971.us/OpenBSD4.5/c/pf/tagging.html(第 3/5 页)2009-5-3 23:04:17 PF: The OpenBSD Packet Filter中文非官方版 Packet Tagging (Policy Filtering)

pass out quick on $ext_if tagged LAN_INET_NAT keep state pass out quick on $dmz_if tagged LAN_DMZ keep state pass out quick on $dmz_if tagged INET_DMZ keep state

现在建立了完整的规则集, 修改分类规则的这类变动, 例如, 如果DMZ区增加了一台 POP3/SMTP 服 务器, 就需要为POP3和SMTP通讯增加分类规则, 像这样:

mail_server = "192.168.0.10" ...

pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \ tag INET_DMZ keep state

Email通讯现在作为 INET_DMZ 策略项的一部分会被放行。

完整的规则集:

# macros int_if = "dc0" dmz_if = "dc1" ext_if = "ep0" int_net = "10.0.0.0/24" dmz_net = "192.168.0.0/24" www_server = "192.168.0.5" mail_server = "192.168.0.10"

table persist file "/etc/spammers"

# classification -- classify packets based on the defined firewall # policy. rdr on $ext_if proto tcp from to port smtp \ tag SPAMD -> 127.0.0.1 port 8025 nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)

block all pass in on $int_if from $int_net tag LAN_INET keep state pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \

http://www.9971.us/OpenBSD4.5/c/pf/tagging.html(第 4/5 页)2009-5-3 23:04:17 PF: The OpenBSD Packet Filter中文非官方版 Packet Tagging (Policy Filtering) tag INET_DMZ keep state

# policy enforcement -- pass/block based on the defined firewall policy. pass in quick on $ext_if tagged SPAMD keep state pass out quick on $ext_if tagged LAN_INET_NAT keep state pass out quick on $dmz_if tagged LAN_DMZ keep state pass out quick on $dmz_if tagged INET_DMZ keep state

标记以太帧

如果做标记/过滤的这台计算机也担当一个 bridge(4),贴标记可以在以太级别进行。 通过使用tag 关键字产生 bridge(4) 过滤规则, PF可以使过滤基于源或目的的MAC地址。用 brconfig(8) 命令产生 Bridge(4)规则,例如:

# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \ tag USER1

然后在pf.conf里:

pass in on fxp0 tagged USER1

[上一小节: 地址池和负载均衡] [总目录] [下一小节: 记录]

[email protected] $OpenBSD: tagging.html, v 1.18 2007/05/07 01:27:19 joel Exp $

http://www.9971.us/OpenBSD4.5/c/pf/tagging.html(第 5/5 页)2009-5-3 23:04:17 PF: The OpenBSD Packet Filter中文非官方版 Address Pools and Load Balancing

[上一小节: 数据包的列队和优先] [总目录] [下一小节: 数据包标记]

PF: 地址池和负载均衡

目录

● 介绍

● NAT地址池

● 进站连接的负载均衡

● 出站通讯的负载均衡

❍ 规则集实例

介绍

地址池是系统提供给一组用户共享的两个或多个地址。一个地址池可以作为 rdr 规则的重定向地 址、也可以作为 nat 规则的转换地址、及route-to, reply-to, and dup-to 过滤 选项的目标地址。

有四种使用地址池的方法:

● bitmask - 将地址池的高位地址嫁接到被修改地址(NAT规则的源地址, rdr规则的目标地址) 上。例如: 如果地址池是192.0.2.1/24 而被修改的地址是10.0.0.50, 那么得到的地址就是 192.0.2.50;如果地址池是192.0.2.1/25而被修改的地址是10.0.0.130, 那么得到的地址就是 192.0.2.2。 ● random - 从地址池中随机选择一个地址。 ● source-hash - 使用一个源地址的哈希来确定使用地址池中的哪个地址。这种方法确保了一 个给定的源地址总是映射到相同的池地址上。提供给哈希算法的key可以在 source-hash 关 键字后以16进制格式或一个字串随意指定。默认情况下, 当每次规则集被载入时 pfctl(8) 会 产生一个随机的key。 ● round-robin - 依次循环使用地址池内的地址。这是默认的方法, 当使用表格指定地址池时只 能使用此方法。

除了round-robin方法, 地址池必须用一个 CIDR 网段表示。round-robin方法接受用一个列表或表格

http://www.9971.us/OpenBSD4.5/c/pf/pools.html(第 1/5 页)2009-5-3 23:04:21 PF: The OpenBSD Packet Filter中文非官方版 Address Pools and Load Balancing 表示的多个地址。 sticky-address 选项可以与 random 和 round-robin 类型的地址池一同使用, 这样可以确保一个特定的 源地址总是被映射到同一个转发地址上。

NAT 地址池

一个地址池可以作为 nat

规则中的转发地址。多个连接的源地址将基于选择的上述方法被转换成地址池中的一个地址。这 在PF为一个非常大型的网络做NAT时很有用。因为每个转换地址容纳的被NAT的连接数是有限 的, 增加额外的转换地址可以让NAT网关按比例为更多用户提供服务。(译者注:注意, 此处的"按比 例"对应上句的"有限"。)

这个例子中用一个包含两个地址的地址池转换出站数据包。PF用round-robin方法依次循环地为每 个出站连接转换地址。

nat on $ext_if inet from any to any -> { 192.0.2.5, 192.0.2.10 }

这种方法的一个缺点是来自同一个内部地址的延续性连接并非总是被转换到同一个的转换地址 上。这种情况可能导致冲突, 例如, 当web站点跟踪登录用户的IP地址时, 解决的方法是使用 source- hash方法, 这样每个内部地址总是被转换为同一个转换地址。为了完成这个目的, 地址池必须是一 个CIDR网段。

nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash nat规则使用地址池 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) 作为出站数据包的转换地址。 因为使用了 source-hash关键字, 每个内部地址将总是被转换成同一个转换地址。

进站连接的负载均衡

地址池也可以用来完成进站连接的负载均衡。例如, 进站的web服务器连接可以被分配到一组服务 器:

web_servers = "{ 10.0.0.10, 10.0.0.11, 10.0.0.13 }"

rdr on $ext_if proto tcp from any to any port 80 -> $web_servers \ round-robin sticky-address

http://www.9971.us/OpenBSD4.5/c/pf/pools.html(第 2/5 页)2009-5-3 23:04:21 PF: The OpenBSD Packet Filter中文非官方版 Address Pools and Load Balancing

延续性的连接将被以round-robin方式重定向到这组服务器, 同时来自同一地址的连接总被分配到 固定的同一台服务器。只要连接还保持着状态, 这种 "粘性连接"将一直存在。一旦状态结束, 粘性 连接也不存在了, 这时来自那台主机的更多的连接将按依次循环(round robin)的方式被重新定向到 下一台服务器上。

出站通讯的负载均衡

当一个固有的多路径路由协议(像 BGP4) 不可用时, 地址池和 route-to 过滤选项结合使用可以平衡 两个以上的Internet链接的负载。通过使用 route-to 和一个 round-robin 型地址池, 出站连接可以被 均匀地分配到多个出站路径中。

完成这个工作还需要的一条额外信息是每个Internet连接相邻路由器的IP地址。这是用来提供给 route-to 选项以控制出站数据包的目的地。

下面的例子均衡两个Internet连接的出站通讯:

lan_net = "192.168.0.0/24" int_if = "dc0" ext_if1 = "fxp0" ext_if2 = "fxp1" ext_gw1 = "68.146.224.1" ext_gw2 = "142.59.76.1"

pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ from $lan_net to any keep state route-to选项被用来将(从web服务器$lan_net)进入内部接口($int_if)的通讯路由到均衡(round-robin) 的网关(ext_gw1和ext_gw2)上并指定了出站网络接口(ext_if1和ext_if2)。注意:route-to选项必须使用 在每条用来均衡通讯的过滤规则中。回程数据包将被路由回出站使用的同一个外部接口(这由ISP 完成) 并被正常地路由回内部网络。

为了确保源地址属于 $ext_if1 的数据包总是被路由到 $ext_gw1 (对 $ext_if2 和 $ext_gw2 也一样) , 下 面的两行应该包含在规则集中:

pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 \ to any pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 \ to any

http://www.9971.us/OpenBSD4.5/c/pf/pools.html(第 3/5 页)2009-5-3 23:04:21 PF: The OpenBSD Packet Filter中文非官方版 Address Pools and Load Balancing

最终, NAT 也能被用在每个出站接口上:

nat on $ext_if1 from $lan_net to any -> ($ext_if1) nat on $ext_if2 from $lan_net to any -> ($ext_if2)

一个完整的出站通讯负载均衡的实例可能像这样:

lan_net = "192.168.0.0/24" int_if = "dc0" ext_if1 = "fxp0" ext_if2 = "fxp1" ext_gw1 = "68.146.224.1" ext_gw2 = "142.59.76.1"

# nat outgoing connections on each internet interface nat on $ext_if1 from $lan_net to any -> ($ext_if1) nat on $ext_if2 from $lan_net to any -> ($ext_if2)

# default deny block in from any to any block out from any to any

# pass all outgoing packets on internal interface pass out on $int_if from any to $lan_net # pass in quick any packets destined for the gateway itself pass in quick on $int_if from $lan_net to $int_if # load balance outgoing tcp traffic from internal network. pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto tcp from $lan_net to any flags S/SA modulate state # load balance outgoing udp and icmp traffic from internal network pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto { udp, icmp } from $lan_net to any keep state

# general "pass out" rules for external interfaces pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state pass out on $ext_if1 proto { udp, icmp } from any to any keep state pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state pass out on $ext_if2 proto { udp, icmp } from any to any keep state

http://www.9971.us/OpenBSD4.5/c/pf/pools.html(第 4/5 页)2009-5-3 23:04:21 PF: The OpenBSD Packet Filter中文非官方版 Address Pools and Load Balancing

# route packets from any IPs on $ext_if1 to $ext_gw1 and the same for # $ext_if2 and $ext_gw2 pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any block in on fxp0 from to any

[上一小节: 数据包的列队和优先] [总目录] [下一小节: 数据包标记]

[email protected] $OpenBSD: pools.html, v 1.22 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/pools.html(第 5/5 页)2009-5-3 23:04:21 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization

[上一小节: 锚] [总目录] [下一小节: 地址池和负载平衡]

PF: 数据包的列队和优先

目录

● 列队

● 调度器

❍ 分类列队

❍ 优先列队

❍ 随机早期检测

❍ 显式拥塞通告

● 列队配置

● 为队列分配通讯

● Example #1: 小型, 家用网络

● Example #2: 公司网络

列队

为某物列队就是在它们等候处理时按顺序储存。在一个计算机网络中, 当数据包从某台主机发出 后, 它们进入一个等待操作系统处理的队列, 然后操作系统决定处理哪一个队列和其中的哪些数据 包应该被处理。操作系统选择处理数据包的顺序可能影响网络性能。例如, 用户正在运行两个网 络应用程序: SSH 和 FTP, 理想的情况是 SSH 数据包在FTP数据包之前处理, 这是因为考虑了SSH的 时间敏感特性;当在SSH客户端输入一个key时, 客户端希望马上得到一个回应, 而一个FTP传输被延 迟了额外的几秒钟却几乎不会令人难以忍受和引起注意。但是如果路由器在处理SSH连接前需要 处理大量的FTP数据包会怎样呢? SSH连接的数据包将会滞留在队列中(或者如果因队列没有足够 的空间容纳所有的数据包, 路由器会将SSH数据包丢弃), 而SSH会话或因此滞后或变慢。通过调整 队列策略, 可将网络带宽在不同的应用程序、用户和计算机间公正合理地分享。

注意列队仅对出站方向的数据包有效, 因为一旦一个进站数据包数据包抵达一个接口时, 让它列队 已经太晚了——它刚抵达收到它的接口时已经消耗了网络带宽。唯一解决的办法是在邻近的路由 上启用列队, 或者如果收到此数据包的主机是是一台路由器, 那么在数据包出路由器的内部接口上

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 1/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization 启用列队功能。

调度器

调度器决定处理哪些队列及以处理顺序。默认情况下, OpenBSD使用一个先入先出(FIFO)的调度 器。一个FIFO队列就像一个超市收款台的付款队列——根据队列顺序依次处理, 当一个新的数据 包到达时会被加到队列的最后。如果队列满了, 这里就像超市停止营业了, 新来的数据包将被遗 弃, 这就是所谓的"去尾"。

OpenBSD支持两个额外的调度器:

● 分类列队 ● 优先列队

分类列队

分类列队(CBQ)一种列队法则, 它将网络带宽分配给多个队列或类型。每个队列分配的带宽是基于 源/目标地址、端口号、协议等。当一个队列的父系队列的带宽未充分使用时, 这个队列就可以从 其父系队列借用带宽。队列也有优先级, 含有交互式数据的队列(例如SSH)可以在包含大量数据的 队列(例如FTP)前面处理。

CBQ列队是按级别划分的。最高级别是root队列, root队列定义了全部的有效带宽, 子队列产生在 root队列下, 每个子队列分配了一部分root队列的带宽。例如, 队列可用如下方式定义:

Root Queue (2Mbps) Queue A (1Mbps) Queue B (500Kbps) Queue C (500Kbps)

这个例子中, 总带宽设定为2M/秒(Mbps), 然后带宽被分配给三个子队列。

可以通过在队列中定义新队列而扩展队列的级别, 这样可以在不同的用户和类之间平等地分配带 宽, 以避免某些协议掠夺其它协议的带宽, 定义一个这样的队列:

Root Queue (2Mbps) UserA (1Mbps) ssh (50Kbps) bulk (950Kbps) UserB (1Mbps) audio (250Kbps) bulk (750Kbps)

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 2/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization http (100Kbps) other (650Kbps)

注意分配给每个级别各队列的带宽总和不能多于分配给其父系队列的带宽。

如果一个队列的父系队列有闲置的带宽, 该队列可以向其父系队列借用, 这是因为这些闲置带宽无 法被父系队列的其它子队列利用, 建立一个像这样的队列应该:

Root Queue (2Mbps) UserA (1Mbps) ssh (100Kbps) ftp (900Kbps, borrow) UserB (1Mbps)

如果ftp队列要超过900K的流量而UserA队列的流量不足1Mbps(因为ssh队列没有完全使用分配给它 的100Kbps带宽), 那么ftp队列将向临时UserA借用带宽。这样的方案使ftp队列在过载时可以使用更 多的带宽;但是一旦ssh队列的负荷增加, FTP队列必须归还临时借用的带宽。

CBQ给每个队列指派一个优先级别。如果两个队列同为一个父队列的子队列(换句话说, 如果两个 队列在级别分支的同一层次上), 在网络拥塞时先处理优先级别高的那个队列。 如果两个队列的级 别一样则采用轮询方式, 例如:

Root Queue (2Mbps) UserA (1Mbps, priority 1) ssh (100Kbps, priority 5) ftp (900Kbps, priority 3) UserB (1Mbps, priority 1)

CBQ将对UserA和UserB这两个队列采用轮询方式—— 不会照顾任何一个队列。当UserA队列被处 理时, CBQ也会处理其子队列。本例中, ssh队列有更高的优先级所以在网络拥塞时会优先于ftp队列 使用带宽。注意为什么ssh和ftp没有与UserA和UserB比较优先级呢, 这是因为它们不在一个层次分 支上。

要了解CBQ理论更多细节请看 References on CBQ.

优先列队

优先列队(PRIQ)

将对个队列分配个一个网络接口, 同时每个队列被赋予一个优先级别。高优先级别队列永远在低 优先级别队列的前面处理。如果两个或更多的队列的优先级别相同, 则这些队列按轮询方式处

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 3/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization 理。

PRIQ的列队结构是无层次的T——你不能在队列中再定义队列。先定义root队列, 它被设置成占用 所有带宽, 然后在root下定义子队列, 看看下面的例子:

Root Queue (2Mbps) Queue A (priority 1) Queue B (priority 2) Queue C (priority 3) root队列和其子队列被定义为可以使用2Mbps带宽, 先处理优先级别最高的队列 (最大的 priority 值), 一旦这个队列的所有数据包被处理完毕, 或者这个队列被发现已经空了, PRIQ 将转到剩下优先 级别最高的队列。在一个队列中, 处理数据包采用先入先出(FIFO)的顺序。

非常重要的一点是当你采用PRIQ时, 你必须非常小心地设计你的队列, 因为PRIQ永远只先处理高 优先级别的队列, 有可能出现这样的情况, 高级别的队列持续接收恒定流量的数据包可能会造成低 级别队列的数据包对延迟或丢弃。

随机早期检测

随机早期检测(RED)是一个避免拥塞的算法。它的工作是确保队列未排满, 从而避免了网络拥塞。 它通过不断地计算队列的平均长度(大小)并将其与极限值进行对比, 一个是上限;一个是下限。如 果队列的平均大小低于下限就不会丢弃任何数据包;如果平均值高于上限则所有的新抵达的数据包 将被丢弃。如果平均值介于上下限之间, 则数据包是否被丢弃基于一个平均队列长度的概率计 算。换句话说, 当平均队列长度逼近上限时, 越来越多的数据包会被丢弃。当丢弃数据包时RED随 机选择丢弃哪个连接的数据包。占用大量带宽的那些连接的数据包最有可能被丢弃。

RED十分有用, 因为它避免了所谓"全局同步"的情形, 并且它可以应付激增的通讯。全局同步是指 同时丢弃几个连接的数据包造成总吞吐量损失的情况, 例如, 当路由器上有10个FTP连接时发生了 拥塞, 然后, 所有(或大多数)连接的数据包被丢弃(就像FIFO队列), 总吞吐量将骤然下降。这不是一 个理想的状态, 因为它导致所有的FTP连接的吞吐量下降, 并且这意味着网络的最大潜能没有被充 分利用。 RED采用随机丢弃某个连接的数据包而不是丢弃所有连接的数据包的方式, 这样就避免 了"全局同步"现象。占用大量带宽的那些连接的数据包最有可能先被丢弃。 这种情形下, 高带宽 占用的连接将被节流, 拥塞被避免, 而突发的吞吐量骤降情况也不会出现。另外, RED 还可应付激 增的通讯, 因为它在队列被这些新来的数据包充满前已经开始丢弃数据包了。

RED应该仅用于那些对网络拥塞提示有反应能力的传送协议。多数情况下这意味着RED应该应用 在TCP通讯队列, 而非UDP或者ICMP通讯协议。

关于RED理论的更多知识, 请参阅 References on RED。

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 4/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization 显式拥塞通告

显式拥塞通告(ECN)与RED一同工作可以将链路上的任何拥塞通告给两个主机。它是通过启用 RED在(返回的)数据包头部设置一个标志而非扔掉这个数据包。假设发送数据包的主机支持ECN, 它就能读取这个标志并从而节流它的网络通讯量。

更多有关ECN的信息, 请参阅 RFC 3168.

列队配置

从OpenBSD 3.0开始 交错队列 (ALTQ)的列队方式已经成为基本系统的一部分。从OpenBSD 3.3开 始ALTQ被并入PF内。OpenBSD中的ALTQ支持分类列队(CBQ)和优先列队(PRIQ)调度器, 同时它 也支持随机早期检测(RED)和赛事拥塞通告(ECN)。

因为ALTQ已经并入PF, 所以列队功能必须启用PF, 怎样启用PF可以在开始里找到。

列队是在 pf.conf 里进行配置。有两种指令用来配置列队:

● altq on - 在一个接口上启用列队, 定义使用哪个调度器, 然后产生root队列 ● queue - 定义一个子队列的属性 altq指令的语法是:

altq on interface scheduler bandwidth bw qlimit qlim \ tbrsize size queue { queue_list }

● interface - 在此网络接口上激活列队。 ● scheduler - 使用的列队调度器。有效值是cbq 和 priq。一个接口每次只能激活一个在调度 器。 ● bw - 调度器可用总带宽。这可指定为一个绝对值加上后缀 b, Kb, Mb, 和 Gb 分别表示 比特, k, M, 和 G/秒, 或用一个接口带宽的百分比。 ● qlim - 一个队列可容纳数据包的最大值。这个参数是可选项, 默认是50。 ● size - 令牌桶调整器的大小, 以bytes为单位。如果没有指定, 这个大小取决于接口带宽。 ● queue_list - root队列下生成一个子队列列表。

例如:

altq on fxp0 cbq bandwidth 2Mb queue { std, ssh, ftp }

这在接口fxp0上启用CBQ。总有效带宽设置为2Mbps, 定义了三个子队列: std, ssh, 和 ftp。

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 5/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization queue 指令的语法为:

queue name [on interface] bandwidth bw [priority pri] [qlimit qlim] \ scheduler ( sched_options ) { queue_list }

● name - 队列名。 这个队列名必须与altq定义的 queue_list.项内的一个名字匹配。对cbq来说, 这个队列名也可以匹配以前的队列指令的 queue_list 选项中的一个名字。队列名不能超过15 个字符。 ● interface - 启用列队功能的网络接口。这是可选项, 如未指定将在所有接口上启用列队功 能。 ● bw - 可用于队列的总有效带宽。 这可指定为一个绝对值加上后缀 b, Kb, Mb, 和 Gb 分别表 示 比特, k, M, 和 G/秒, 或用一个接口带宽的百分比。这个参数仅在使用cbq调度器时才能 用。若未指定, 默认值为父系队列的100%带宽。 ● pri - 这个队列的优先级别。对cbq来说, 优先级别的从0到7, 而对priq是从0到15。级别0是最 低优先级。若未指定, 使用默认值1。 ● qlim - 一个队列可容纳数据包的最大值。若未指定, 使用默认值50。 ● scheduler - 使用的调度器, 不是cbq就是priq, 必须与root队列一致。 ● sched_options - 更多的控制调度器行为选项: ❍ default - 定义一个默认队列, 所有不匹配其它队列的数据包将在这个队列里列队, 一点 也没错, 一个默认队列是必需的。 ❍ red - 在这个队列上启用随机早期检测(RED)。 ❍ rio - 以IN/OUT模式启用RED。这种模式下, RED将维持多个队列平均长度和多个极 限值, 每个IP服务质量级别(QoS)对应一个。 ❍ ecn - 在这个队列上启用显式拥塞通告(ECN)。Ecn意味着red。 ❍ borrow - 这个队列可以向其父系队列借用带宽。这个选项只能在使用cbq调度器时才 能指定。 ● queue_list - root队列下生成一个子队列列表。 一个 queue_list选项只能在使用cbq调度器时才 能定义。

继续上面的例子:

queue std bandwidth 50% cbq(default) queue ssh bandwidth 25% { ssh_login, ssh_bulk } queue ssh_login bandwidth 25% priority 4 cbq(ecn) queue ssh_bulk bandwidth 75% cbq(ecn) queue ftp bandwidth 500Kb priority 3 cbq(borrow red)

这里设置了先前定义的子队列的参数。std队列分配了50%的root队列带宽(或者说 1Mbps)并且被设 置成默认队列。ssh队列分配了root队列25%的带宽(500kb), 而且它还包含了两个子队列 :ssh_login和 ssh_bulk。ssh_login的优先级高于ssh_bulk并且启用了ECN。ftp队列被分配了500Kbps的带宽并且优 先级别为3, 它还可以在可能时时借用带宽并且启用了RED。

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 6/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization

注意: 每个子队列单独指定其带宽, PF会给予队列100%的父系队列带宽。这种情形下, 规则载入后 可能会产生一个错误, 因为如果有一个队列占用了100%的带宽, 就没有剩余的带宽可以分配, 也就 不能定义同级别的其它队列。

为队列分配通讯

为队列分配通讯, 要在PF的 过滤规则 里配合使用queue关键字。例如, 一组过滤规则包含一行如下 内容:

pass out on fxp0 from any to any port 22

可以通过queue关键字将匹配这条规则的数据包分配到指定的队列:

pass out on fxp0 from any to any port 22 queue ssh

当queue关键字与block指令一同使用时, 结果任何TCP RST或者ICMP不可抵达数据包全被分配到指 定的队列。

注意:除了可以在altq里用指令定义这个队列外, 还可以在接口上定义:

altq on fxp0 cbq bandwidth 2Mb queue { std, ftp } queue std bandwidth 500Kb cbq(default) queue ftp bandwidth 1.5Mb

pass in on dc0 from any to any port 21 queue ftp

队列在fxp0上被启用, 但是指定却发生在dc0上。 如果接口fxp的出站数据包匹配这条pass规则, 它们 将在ftp队列里列队。这种类型的列队在路由器上十分有用。

通常queue关键字仅给定一个队列名, 但是如果指定了第二个队列名, 这个队列将被用于低延迟服务 类型(ToS)的数据包和TCP ACK这类无数据有效负荷的数据包。在使用SSH是发现的一个很好的例 子, SSH登录会话会被设定成低延迟服务类型而SCP和SFTP会话则不会。PF能利用这个信息, 将属 于登录连接的数据包安排在一个不同的队列里与非登录数据包分, 这对优先处理登录连接的数据 包再处理文件传输数据包很有用处。

pass out on fxp0 from any to any port 22 queue(ssh_bulk, ssh_login)

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 7/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization

这是将属于SSH登录连接的数据包分配给ssh_login队列, 并把属于SCP或SFTP的数据包分配给 ssh_bulk队列。SSH 登录连接的数据包会在SCP和SFTP连接前面处理, 因为lssh_login队列有更高的 优先权。

在一个非对称连接中将TCP ACK数据包分配到一个高优先级队列是很有用的, 非对称连接是指不 同的上传下载带宽, 例如ADSL线路。当使用ADSL线路时, 如果上传通道被占满而此时开始一个下 载时, 下载速度会很慢, 这是因为想通过上传通道将TCP ACK数据包发出去时发生了网络拥塞。实 验证明为了到达最好的效果, 上传队列的带宽应该设置得比上传最大带宽小一些, 例如一个ADSL 线路有640Kbps的最大上传速度, 将root队列的上传带宽值设为600Kb会有更好的性能。反复试验可 以得出最佳的带宽设定。

当在含有keep state的规则里使用queue 关键字时:

pass in on fxp0 proto tcp from any to any port 22 flags S/SA \ keep state queue ssh

PF将把这个队列记录为状态表项, 所以出站的回程数据包到fxp0接口时可以匹配这个状态化连接, 并最终进入ssh队列。注意:尽管queue关键字用在了进站通讯过滤规则里, 但它的目的是为相应的出 站通讯指定一个队列;上面的规则不为进站通讯列队。

例 #1: 小型, 家用网络

[ Alice ] [ Charlie ] | | ADSL ---+-----+------+------dc0 [ OpenBSD ] fxp0 ------( Internet ) | [ Bob ]

这个例子中, OpenBSD被用来担当小型家庭网络的Internet网关并带有三个工作站。这个网关承担 包过滤和网络地址转换的工作。Internet连接是通过一条ADSL线路, 下载2Mbps, 上传640Kbps。

这个网络的队列策略:

● 保留 80Kbps 下载带宽给Bob, 这样他可以玩他的在线游戏而不会被Alice或Charlie的下载延 迟。允许Bob在带宽空闲时使用多于80Kbps的带宽。 ● 交互式的SSH和即时信息通讯将比普通通讯有更高的优先级。 ● DNS查询和回应是第二最高优先级。 ● 出站的TCP ACK数据包将比其他出站通讯有更高的优先级。

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 8/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization

下面是适合这个网络策略的规则集。注意这里仅显示了用以完成上述策略的pf.conf指令;未显示 nat, rdr, options 等。

# enable queueing on the external interface to control traffic going to # the Internet. use the priq scheduler to control only priorities. set # the bandwidth to 610Kbps to get the best performance out of the TCP # ACK queue.

altq on fxp0 priq bandwidth 610Kb queue { std_out, ssh_im_out, dns_out, \ tcp_ack_out }

# define the parameters for the child queues. # std_out - the standard queue. any filter rule below that does not # explicitly specify a queue will have its traffic added # to this queue. # ssh_im_out - interactive SSH and various instant message traffic. # dns_out - DNS queries. # tcp_ack_out - TCP ACK packets with no data payload.

queue std_out priq(default) queue ssh_im_out priority 4 priq(red) queue dns_out priority 5 queue tcp_ack_out priority 6

# enable queueing on the internal interface to control traffic coming in # from the Internet. use the cbq scheduler to control bandwidth. max # bandwidth is 2Mbps.

altq on dc0 cbq bandwidth 2Mb queue { std_in, ssh_im_in, dns_in, bob_in }

# define the parameters for the child queues. # std_in - the standard queue. any filter rule below that does not # explicitly specify a queue will have its traffic added # to this queue. # ssh_im_in - interactive SSH and various instant message traffic. # dns_in - DNS replies. # bob_in - bandwidth reserved for Bob's workstation. allow him to # borrow.

queue std_in bandwidth 1.6Mb cbq(default) queue ssh_im_in bandwidth 200Kb priority 4 queue dns_in bandwidth 120Kb priority 5

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 9/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization queue bob_in bandwidth 80Kb cbq(borrow)

# ... in the filtering section of pf.conf ...

alice = "192.168.0.2" bob = "192.168.0.3" charlie = "192.168.0.4" local_net = "192.168.0.0/24" ssh_ports = "{ 22 2022 }" im_ports = "{ 1863 5190 5222 }"

# filter rules for fxp0 inbound block in on fxp0 all

# filter rules for fxp0 outbound block out on fxp0 all pass out on fxp0 inet proto tcp from (fxp0) to any flags S/SA \ keep state queue(std_out, tcp_ack_out) pass out on fxp0 inet proto { udp icmp } from (fxp0) to any keep state pass out on fxp0 inet proto { tcp udp } from (fxp0) to any port domain \ keep state queue dns_out pass out on fxp0 inet proto tcp from (fxp0) to any port $ssh_ports \ flags S/SA keep state queue(std_out, ssh_im_out) pass out on fxp0 inet proto tcp from (fxp0) to any port $im_ports \ flags S/SA keep state queue(ssh_im_out, tcp_ack_out)

# filter rules for dc0 inbound block in on dc0 all pass in on dc0 from $local_net

# filter rules for dc0 outbound block out on dc0 all pass out on dc0 from any to $local_net pass out on dc0 proto { tcp udp } from any port domain to $local_net \ queue dns_in pass out on dc0 proto tcp from any port $ssh_ports to $local_net \ queue(std_in, ssh_im_in) pass out on dc0 proto tcp from any port $im_ports to $local_net \ queue ssh_im_in pass out on dc0 from any to $bob queue bob_in

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 10/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization 例 #2: 公司网络

( IT Dept ) [ Boss's PC ] | | T1 --+----+-----+------dc0 [ OpenBSD ] fxp0 ------( Internet ) | fxp1 [ COMP1 ] [ WWW ] / | / --+------'

这个例子中, OpenBSD主机担当公司网络的防火墙。 公司在DMZ网段运行了一台WWW服务器, 客 户可以通过FTP软件将自己的站点传送到这台服务器上。IT部门有自己的子网并连接到主要网络, 而老板有一台PC用来收发邮件和网上冲浪。通过一条T1线路连接到Internet上, 上行下载速度全 1.5Mbps。 所有其它网段使用高速以太网(100Mbps)。

网络管理员决定使用如下策略:

● 限制WWW服务器和Internet之间任何方向的连接速度大于500Kbps的通讯 ❍ 分配250Kbps给HTTP通讯。 ❍ 分配250Kbps给"其它"通讯(例如, 非HTTP通讯)。 ❍ 允许任何队列借用带宽, 最高至500Kbps。 ❍ 给予WWW服务器和Internet之间的HTTP通讯比WWW服务器和Internet之间的其它通 讯(例如ftp上传)更高的优先级别。 ● WWW服务器和内部网络之间的通讯可以完全使用网络提供的100Mbps带宽。 ● 保留500Kbps带宽给IT部分是他们可以及时地下载最新软件更新。如果有带宽空闲允许他们 使用500Kbps以上的带宽。 ● 老板的PC到Internet间的通讯比其它通讯有更高的上传下载优先级。

下面是适合这个网络策略的规则集。注意这里仅显示了用以完成上述策略的pf.conf指令;未显示 nat, rdr, options 等。

# enable queueing on the external interface to queue packets going out # to the Internet. use the cbq scheduler so that the bandwidth use of # each queue can be controlled. the max outgoing bandwidth is 1.5Mbps.

altq on fxp0 cbq bandwidth 1.5Mb queue { std_ext, www_ext, boss_ext }

# define the parameters for the child queues. # std_ext - the standard queue. also the default queue for

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 11/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization # outgoing traffic on fxp0. # www_ext - container queue for WWW server queues. limit to # 500Kbps. # www_ext_http - http traffic from the WWW server; higher priority. # www_ext_misc - all non-http traffic from the WWW server. # boss_ext - traffic coming from the boss's computer.

queue std_ext bandwidth 500Kb cbq(default borrow) queue www_ext bandwidth 500Kb { www_ext_http, www_ext_misc } queue www_ext_http bandwidth 50% priority 3 cbq(red borrow) queue www_ext_misc bandwidth 50% priority 1 cbq(borrow) queue boss_ext bandwidth 500Kb priority 3 cbq(borrow)

# enable queueing on the internal interface to control traffic coming # from the Internet or the DMZ. use the cbq scheduler to control the # bandwidth of each queue. bandwidth on this interface is set to the # maximum. traffic coming from the DMZ will be able to use all of this # bandwidth while traffic coming from the Internet will be limited to # 1.0Mbps (because 0.5Mbps (500Kbps) is being allocated to fxp1).

altq on dc0 cbq bandwidth 100% queue { net_int, www_int }

# define the parameters for the child queues. # net_int - container queue for traffic from the Internet. bandwidth # is 1.0Mbps. # std_int - the standard queue. also the default queue for outgoing # traffic on dc0. # it_int - traffic to the IT Dept network; reserve them 500Kbps. # boss_int - traffic to the boss's PC; assign a higher priority. # www_int - traffic from the WWW server in the DMZ; full speed.

queue net_int bandwidth 1.0Mb { std_int, it_int, boss_int } queue std_int bandwidth 250Kb cbq(default borrow) queue it_int bandwidth 500Kb cbq(borrow) queue boss_int bandwidth 250Kb priority 3 cbq(borrow) queue www_int bandwidth 99Mb cbq(red borrow)

# enable queueing on the DMZ interface to control traffic destined for # the WWW server. cbq will be used on this interface since detailed # control of bandwidth is necessary. bandwidth on this interface is set # to the maximum. traffic from the internal network will be able to use # all of this bandwidth while traffic from the Internet will be limited # to 500Kbps.

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 12/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization

altq on fxp1 cbq bandwidth 100% queue { internal_dmz, net_dmz }

# define the parameters for the child queues. # internal_dmz - traffic from the internal network. # net_dmz - container queue for traffic from the Internet. # net_dmz_http - http traffic; higher priority. # net_dmz_misc - all non-http traffic. this is also the default queue.

queue internal_dmz bandwidth 99Mb cbq(borrow) queue net_dmz bandwidth 500Kb { net_dmz_http, net_dmz_misc } queue net_dmz_http bandwidth 50% priority 3 cbq(red borrow) queue net_dmz_misc bandwidth 50% priority 1 cbq(default borrow)

# ... in the filtering section of pf.conf ...

main_net = "192.168.0.0/24" it_net = "192.168.1.0/24" int_nets = "{ 192.168.0.0/24, 192.168.1.0/24 }" dmz_net = "10.0.0.0/24"

boss = "192.168.0.200" wwwserv = "10.0.0.100"

# default deny block on { fxp0, fxp1, dc0 } all

# filter rules for fxp0 inbound pass in on fxp0 proto tcp from any to $wwwserv port { 21, \ > 49151 } flags S/SA keep state queue www_ext_misc pass in on fxp0 proto tcp from any to $wwwserv port 80 \ flags S/SA keep state queue www_ext_http

# filter rules for fxp0 outbound pass out on fxp0 from $int_nets to any keep state pass out on fxp0 from $boss to any keep state queue boss_ext

# filter rules for dc0 inbound pass in on dc0 from $int_nets to any keep state pass in on dc0 from $it_net to any queue it_int pass in on dc0 from $boss to any queue boss_int pass in on dc0 proto tcp from $int_nets to $wwwserv port { 21, 80, \

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 13/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Packet Queueing and Prioritization > 49151 } flags S/SA keep state queue www_int

# filter rules for dc0 outbound pass out on dc0 from dc0 to $int_nets

# filter rules for fxp1 inbound pass in on fxp1 proto { tcp, udp } from $wwwserv to any port 53 \ keep state

# filter rules for fxp1 outbound pass out on fxp1 proto tcp from any to $wwwserv port { 21, \ > 49151 } flags S/SA keep state queue net_dmz_misc pass out on fxp1 proto tcp from any to $wwwserv port 80 \ flags S/SA keep state queue net_dmz_http pass out on fxp1 proto tcp from $int_nets to $wwwserv port { 80, \ 21, > 49151 } flags S/SA keep state queue internal_dmz

[上一小节: 锚] [总目录] [下一小节: 地址池和负载平衡]

[email protected] $OpenBSD: queueing.html, v 1.36 2009/01/25 18:09:49 jasper Exp $

http://www.9971.us/OpenBSD4.5/c/pf/queueing.html(第 14/14 页)2009-5-3 23:04:26 PF: The OpenBSD Packet Filter中文非官方版 Anchors

[上一小节: 净化 (数据包正常化)] [总目录] [下一小节: 数据包的排队和优先]

PF: 锚

目录

● 介绍

● 锚

● 锚选项

● 处理锚

介绍

除了主规则集, PF还可以评估子规则集。因为子规则集可以在运行时通过pfctl(8)处理。它们提供 了一个动态修改运行规则集的简便方法。事实上一个表格用来保存一组动态的地址列表, 一个子 规则集用来保存一组动态的过滤规则, nat, rdr, 和 binat 规则。

子规则集通过使用锚附加到主规则集上。 锚规则有四种类型:

● anchor name - 评估锚 name 里的所有 过滤 规则

● binat-anchor name - 评估锚 name 里的所有 binat 规则

● nat-anchor name - 评估锚 name 里的所有 nat 规则

● rdr-anchor name - 评估锚 name 里的所有 rdr 规则

锚可以被嵌套, 它考虑到将子规则集链接到一起。锚规则将在载入它们的锚上被评估。例如, 位于 主规则里的锚规则将产生锚定点, 将主规则作为它们的父系规则, 而从带有装载锚命令的文件载入 的锚规则将产生锚点, 将那个锚作为其父系锚。

一个锚是一个过滤和/或转换规则、表格、其它已被命名的锚的集合, 当PF遇到主规则内的一条锚 规则时, 它将评估包含在锚点内的规则, 就像评估主规则里的规则一样;然后将继续处理主规则,

http://www.9971.us/OpenBSD4.5/c/pf/anchors.html(第 1/5 页)2009-5-3 23:04:29 PF: The OpenBSD Packet Filter中文非官方版 Anchors

除非数据包匹配一条使用quick选项的过滤规则, 或者锚里的一条转换规则包含了最终的匹配并将 放弃评估锚和主规则集两者里的所有规则。

例如:

ext_if = "fxp0" block on $ext_if all pass out on $ext_if all keep state anchor goodguys

这个规则集在fxp0上设定了一个双向默认拒绝策略, 然后将完全放行外出的通讯并保持状态, 一个 名为goodguys的锚规则被创建。宏可以通过三种方法嵌入规则:

● 使用一个载入规则 ● 使用 pfctl(8)

● 指定内插在主规则集里的规则

载入规则使pfctl从一个文本文件中读取规则并插入一个指定的锚, 载入规则必须在锚规则之后。例 如:

anchor goodguys load anchor goodguys from "/etc/anchor-goodguys-ssh"

用pfctl为一个锚增加规则, 可以使用如下类型的命令:

# echo "pass in proto tcp from 192.0.2.3 to any port 22" | pfctl -a goodguys -f -

规则也可以被保存在一个文本文件中, 然后从这个文本文件载入:

# cat >> /etc/anchor-goodguys-www pass in proto tcp from 192.0.2.3 to any port 80 pass in proto tcp from 192.0.2.4 to any port { 80 443 }

# pfctl -a goodguys -f /etc/anchor-goodguys-www

要直接从主规则里载入规则, 可以将锚规则封装在一个大括号内:

http://www.9971.us/OpenBSD4.5/c/pf/anchors.html(第 2/5 页)2009-5-3 23:04:29 PF: The OpenBSD Packet Filter中文非官方版 Anchors

anchor "goodguys" {

pass in proto tcp from 192.168.2.3 to port 22

}

内联锚里也可以包含更多的锚。

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" { #<----内联锚

anchor { #<---内嵌锚

pass in proto tcp from 192.0.2.3 to port 80

}

pass in proto tcp from $allow to port 22 #<---在内联锚内使用的宏$allow

(译者注:这里最外层的锚inline anchor翻译成内联锚, 内联锚内的嵌套的锚nested anchor翻译成内 嵌锚, 子锚)

里面含有内嵌锚的名字变成了可选项。注意上例中的嵌套的锚(内嵌锚)怎么没有名字, 也请注意 宏 $allow 产生于锚外(主规则集中)而怎么能使用在锚内。

在一个锚内可以使用相同的语法和选项载入过滤或转换规则, 就像从主规则集里载入它们一样, 然 而, 除非你使用的是内联锚, 否则任何在内嵌锚内使用的 宏 必须在内嵌锚内被定义;因为父系规则 定义的宏在内嵌锚内不可见。

因为锚可以被嵌套, 所以可以指定评估一个特定锚内的所有子锚:

anchor "spam/*"

这条语法让将每个子锚的每条规则附加到锚 spam 上进行评估。所有的子锚将按照字母顺序被评 估, 但不递归遗传, 子锚永远只在定义它们的锚内被评估。

http://www.9971.us/OpenBSD4.5/c/pf/anchors.html(第 3/5 页)2009-5-3 23:04:29 PF: The OpenBSD Packet Filter中文非官方版 Anchors

每个锚和主规则集一样, 与其它的规则集分别存在。对一个规则集进行的操作, 例如清除规则, 一 点也不影响其它的。另外在主规则集里删除一个锚点并没有删除这个锚或这个锚上附件的任何子 锚。 要删除一个锚必须使用 pfctl(8) 将其从所有规则中清除, 而且这个锚中没有任何子锚。

锚选项

锚规则

锚规则可随意指定接口、协议、源/目标地址、标志等, 和过滤规则的语法相同。如果这些信息给 定后, 锚规则仅处理那些匹配自己的数据包, 例如:

ext_if = "fxp0"

block on $ext_if all pass out on $ext_if all keep state anchor ssh in on $ext_if proto tcp from any to any port 22

锚ssh里的规则仅评估那些从接口fxp0进入去往端口22的TCP数据包。将规则添加到锚上像这样:

# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh -f -

所以, 即便过滤规则没有指定一个接口、协议或端口, 因为锚规则的定义, 192.0.2.10也将是被允许使 用ssh连接的唯一主机。

相同的语法同样可以应用于内联锚。

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" in proto tcp { anchor proto tcp to port 80 { pass from 192.0.2.3 } anchor proto tcp to port 22 { pass from $allow } }

http://www.9971.us/OpenBSD4.5/c/pf/anchors.html(第 4/5 页)2009-5-3 23:04:29 PF: The OpenBSD Packet Filter中文非官方版 Anchors 处理锚

可以通过pfctl处理锚。它能被用来在一个锚内添加或删除规则而无需重新载入主规则集。

列出锚ssh的的所有规则:

# pfctl -a ssh -s rules

删除锚ssh的所有规则:

# pfctl -a ssh -F rules

完整的命令清单请参阅 pfctl(8).

[上一小节: 净化 (数据包正常化)] [总目录] [下一小节: 数据包的排队和优先]

[email protected] $OpenBSD: anchors.html, v 1.25 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/anchors.html(第 5/5 页)2009-5-3 23:04:30 PF: The OpenBSD Packet Filter中文非官方版 Scrub (Packet Normalization)

[上一小节: 运行选项] [总目录] [下一小节:锚]

PF: 净化(数据包标准化)

目录

● 介绍

● 选项

介绍

"净化"是数据包标准化, 这样最终接收方可以确切知道此数据包的含义。净化命令也可以重组破碎 的数据包, 使一些操作系统避免某些形式的攻击, 和丢弃带有无效标志组合的TCP数据包。 净化命 令的一个简单的形式是:

scrub in all

这将在净化所有的接口上进入数据包。

一个不在某接口上进行净化的原因是用户想通过PF访问NFS, 某些非OpenBSD平台发送(和期待)奇 怪的数据包——设置了"do not fragment"位的分片数据包, 这些数据包被净化规则(完全地)拒绝。另 一个原因是某些多人游戏在PF启用scrub后会出现连接问题。除了这些有点极端的案例, 这里强烈 推荐净化所有的数据包。 scrub命令的语法与filtering语法很相似, 这使它可以准确地选择数据包进行净化。scrub前面没有关 键字可以用来指定哪些数据包不被净化, 就像nat规则, 第一条匹配的规则是胜者。

更多净化的原则和概念可以在 Network Intrusion Detection: Evasion, Traffic Normalization, and End-to- End Protocol Semantics 找到。

选项

http://www.9971.us/OpenBSD4.5/c/pf/scrub.html(第 1/3 页)2009-5-3 23:04:32 PF: The OpenBSD Packet Filter中文非官方版 Scrub (Packet Normalization)

Scrub有下列选项: no-df 清除IP数据包头里的 don't fragment 位。大家知道一些操作系统会产生设定了don't fragment 位的分片数据包, 特别是NFS。除非指定了 no-df选项, 否则Scrub会丢弃这些数据包。因为某 些操作系统产生的 don't fragment 数据包的IP头标识区域是0, 推荐 no-df 和 random-id 选项一 同使用。 random-id 用随机值替换数据包的IP标识区域以调整操作系统的预设值。这个规则仅应用于自由重组 后不分片的数据包。 min-ttl num 强制将IP数据包头部的生存时间(TTL)设置为一个最小值。 max-mss num 强制将TCP数据包头部的最大数据片长度(MSS)设置成一个最大值。 fragment reassemble 缓存进入的数据包碎片, 并在通过过滤引擎前将这些碎片重组成一个完整的数据包。优点 是过滤引擎只处理完整的数据包而忽略碎片;缺点是缓存数据包碎片增大了内存占用。当没 有指定frament选项时这是默认行为。这也与NAT一同工作时唯一的fragment选项。 fragment crop 丢弃重复的碎片并修剪重叠的碎片。不像fragment reassemble, 使用这个选项时不缓存碎片, 而是处理后直接传递。(译者注:原文这里是一到达就直接传送。) fragment drop-ovl 与fragment crop相似, 除了所有重复、重叠的碎片同其它更多的通信碎片一样会被丢弃。 reassemble tcp TCP连接状态标准化。当使用scrub reassemble tcp 时, 不需要指定一个方向(入/出)。可执行 下列标准化: ❍ 连接双方全不允许减少它们的IP TTL值。这样做是为了抵御攻击者发送一个数据包 到达防火墙后影响为连接保持的状态信息, 以至于数据包未到达目的地前就过期了。 这个连接的所有数据包的TTL值全升到了最高值。 ❍ 将TCP数据包头里的RFC1323时间戳调整为一个随机值。这可以防止一个偷窥者推断 出主机运行时间或猜出NAT网关后有多少台主机。

例子:

scrub in on fxp0 all fragment reassemble min-ttl 15 max-mss 1400 scrub in on fxp0 all no-df scrub on fxp0 all reassemble tcp

[上一小节: 运行选项] [总目录] [下一小节:锚]

http://www.9971.us/OpenBSD4.5/c/pf/scrub.html(第 2/3 页)2009-5-3 23:04:32 PF: The OpenBSD Packet Filter中文非官方版 Scrub (Packet Normalization)

[email protected] $OpenBSD: scrub.html, v 1.15 2008/07/30 10:35:44 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/scrub.html(第 3/3 页)2009-5-3 23:04:32 PF: The OpenBSD Packet Filter中文非官方版 Runtime Options

[上一小节: 定义规则的捷径] [总目录] [下一小节: 净化(数据包标准化)]

PF: 运行选项

选项用来控制PF的操作。在 pf.conf 中用 set 指定选项。

注意: OpenBSD 3.7及以后版本, 运行选项的表现有所变化。以前, 一旦运行选项被设定, 它不会把自 己重置为默认值, 即使规则集被重新载入。从OpenBSD 3.7开始, 只要载入一个规则集, 这些运行选 项会在PF分析规则前被重置为默认值。因此如果在规则集中先设定然后删除一个选项, 如果再重 新载入规则集, 这些选项会被重置为其默认值。 set block-policy 选项 设置指定了block动作的过滤规则的默认行为。

❍ drop - 数据包被默默丢弃。 ❍ return - 一个 TCP RST 数据包被返回给被阻止的 TCP 数据包, 一个 ICMP 不可到达数 据包返回给其它所有。 注意 特别的过滤规则可以修改默认的反应, 默认是drop. set debug option 设置pf的调试级别。 ❍ none - 不显示调试信息。 ❍ urgent - 仅显示严重错误的调试信息。 ❍ misc - 显示多种错误的调试信息 (例如, 查看数据包正常化/净化的情况和状态产生失 败的情况)。 ❍ loud - 显示常规情况下的调试信息(例如, 查看被动操作系统指纹识别的情况)。 默认是 urgent. set fingerprints file 设置从哪个文件载入操作系统指纹。如果使用 被动操作系统指纹识别 , 默认文件是 /etc/pf. os 。 set limit option value 设定PF工作时的各种限制。 ❍ frags - 内存池中用来进行数据包重组(净化规则)的最大项目数。默认是5000。

❍ src-nodes - 内存池中用来跟踪源IP(由 sticky-address 和 source-track 选项产生)的最带项 目数。默认是10000。

http://www.9971.us/OpenBSD4.5/c/pf/options.html(第 1/3 页)2009-5-3 23:04:34 PF: The OpenBSD Packet Filter中文非官方版 Runtime Options

❍ states - 内存池中用于状态表(指定保持状态的过滤规则)的最大项目数)。最大是 10000. ❍ tables - 可产生的最大 表格 数。默认是1000。

❍ table-entries - 储存在所有表格中的最大地址数。 默认是200000. 如果系统物理内存低 于100MB, 默认是100000。 set loginterface interface 设置PF要统计(例如:进/出站字节数和通过/阻塞的数据包)的接口。一次仅能对一个网络接 口进行统计。 Note that the match, bad-offset, etc., counters and the state table counters are recorded regardless of whether loginterface is set or not. To turn this option off, set it to none. The default is none. set optimization option 为下列网络环境最优化PF: ❍ normal - 适合于几乎所有网络。 ❍ high-latency - 高延迟网络, 例如卫星连接。 ❍ aggressive - 积极主动地终止状态表内的连接。在防火墙忙碌时可以显著地降低内存 占用, 但也可能存在过早地断开闲置连接的风险。 ❍ conservative - 极端保守的设置。避免了断开闲置连接, 但会占用大量的内存和少量处 理器资源。 默认是 normal. set ruleset-optimization option 控制PF规则集以便最优化操作。 ❍ none - 完全禁用最优化。 ❍ basic - 启用下列规则集以实现最优化: 1. 删除完全相同的规则。 2. 删除那些是其它规则子集的规则。 3. 如果效果更好, 就将多个规则合并进一个表格。 4. 重新排列规则以提高评估性能。 ❍ profile - 将当前载入的规则集作为一个回馈档案以适应实际网络通讯中qucik规则的排 序。 从OpenBSD 4.2开始, 默认是basic. 请参阅 pf.conf(5) 以获得更全面的描述。 set skip on interface PF不对 interface 上的通讯做任何处理。 这对不需要过滤、标准化、排队等的环回接口 (loopback interfaces)很有用处 。这个选项可以iduoci使用。默认情况下这个选项是关闭的。 set state-policy option 设定PF保持状态时的行为。这个行为可以在每条规则上更改。请参阅 保持状态。

❍ if-bound - 把状态绑定在产生它们的接口上。如果通讯匹配一个状态表项, 但并非由 记录的接口通过, 那么这样的匹配也会被拒绝。这个数据包然后必须再去匹配一个过

http://www.9971.us/OpenBSD4.5/c/pf/options.html(第 2/3 页)2009-5-3 23:04:34 PF: The OpenBSD Packet Filter中文非官方版 Runtime Options 滤规则或(译者注:如果没有匹配的规则将)被丢弃或拒绝。 ❍ floating - 状态可以匹配在任何接口上。只要数据包匹配一个状态项并且与此状态产 生时的原来的数据包的进出方向一致, 则不管这个数据包从哪个接口通过, 全会被放 行。 默认是floating. set timeout option value 设定不同的时间间隔(以秒为单位). ❍ interval - 出现数据包碎片到转台被终止的时间间隔。默认是10。 ❍ frag - 未重组的碎片将在此时间后将终止。默认是30。 ❍ src.track - 在最后一个状态终止后在内存中保留一个源跟踪项目的时间。默认是0(不 保留)。

例子:

set timeout interval 10 set timeout frag 30 set limit { frags 5000, states 2500 } set optimization high-latency set block-policy return set loginterface dc0 set fingerprints "/etc/pf.os.test" set skip on lo0 set state-policy if-bound

[上一小节: 定义规则的捷径] [总目录] [下一小节: 净化(数据包标准化)]

[email protected] $OpenBSD: options.html, v 1.20 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/options.html(第 3/3 页)2009-5-3 23:04:34 PF: The OpenBSD Packet Filter中文非官方版 Shortcuts For Creating Rulesets

[上一小节: 重定向(端口转发)] [总目录] [下一小节: 运行选项]

PF: 定义规则的捷径

目录

● 介绍

● 使用宏

● 使用列表

● PF语法

❍ 精简关键字

❍ 简化Return

❍ 关键字

介绍

PF提供了许多方法可以让规则集简化, 一些好的范例是通过使用宏和列表, 另外规则集的语言或语 法也提供了一些捷径使创建规则集更简单。 依据惯例, 规则集越简单就越容易理解和维护。

使用宏

宏很有用处, 因为它们为硬编码地址、端口号、接口名称等提供了一个 替代方案。一台服务器的 IP地址变了吗?没关系, 只需要更新宏;不需要把 时间浪费在调整规则上, 这些规则你已经花了你不 少的时间和精力并已经 调整到最理想的状态了。

在PF规则集里有一个惯例是为每一个网络接口定义一个宏。如果一块网卡 需要替换为使用不同驱 动的另一块, 例如用一块Intel的网卡换掉原来的3 Com的, 宏可以被更新但过滤功能没有变化。另 一个好处是多台机器安装同一个规则集, 不同的机器可能有不同的网卡, 但利用宏定义网络接口可 以使规则集的修改工作量降至最低。用宏定义规则集中的变量也是一种惯例, 例如:端口号、IP地 址和接口名称等。

http://www.9971.us/OpenBSD4.5/c/pf/shortcuts.html(第 1/6 页)2009-5-3 23:04:37 PF: The OpenBSD Packet Filter中文非官方版 Shortcuts For Creating Rulesets # define macros for each network interface IntIF = "dc0" ExtIF = "fxp0" DmzIF = "fxp1"

另一个惯例是用宏定义IP地址或网段。这在IP地址变化时可极大地减少规则集的维护工作量。

# define our networks IntNet = "192.168.0.0/24" ExtAdd = "24.65.13.4" DmzNet = "10.0.0.0/24"

如果内部网络不断膨胀或重新编号到一个不同的IP段, 更新一下宏就可以了:

IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"

一旦规则集被重新载入, 一切全和从前一样。

使用列表

我们来看一组比较好的规则, 它用来处理 RFC 1918 定义的内部地址, 这些地址不能在Interenet上游 荡, 否则会有麻烦:

block in quick on tl0 inet from 127.0.0.0/8 to any block in quick on tl0 inet from 192.168.0.0/16 to any block in quick on tl0 inet from 172.16.0.0/12 to any block in quick on tl0 inet from 10.0.0.0/8 to any block out quick on tl0 inet from any to 127.0.0.0/8 block out quick on tl0 inet from any to 192.168.0.0/16 block out quick on tl0 inet from any to 172.16.0.0/12 block out quick on tl0 inet from any to 10.0.0.0/8

现在看一下下面这个简化的:

block in quick on tl0 inet from { 127.0.0.0/8, 192.168.0.0/16, \ 172.16.0.0/12, 10.0.0.0/8 } to any block out quick on tl0 inet from any to { 127.0.0.0/8, \

http://www.9971.us/OpenBSD4.5/c/pf/shortcuts.html(第 2/6 页)2009-5-3 23:04:37 PF: The OpenBSD Packet Filter中文非官方版 Shortcuts For Creating Rulesets 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }

规则集从8行减少到2行。 当宏和列表结合使用时就更简化了:

NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \ 10.0.0.0/8 }"

ExtIF = "tl0" block in quick on $ExtIF from $NoRouteIPs to any block out quick on $ExtIF from any to $NoRouteIPs

注意宏和列表简化了 pf.conf 文件, 但是这些行实际上会被 pfctl(8) 扩展为下面的多条规则:

block in quick on tl0 inet from 127.0.0.0/8 to any block in quick on tl0 inet from 192.168.0.0/16 to any block in quick on tl0 inet from 172.16.0.0/12 to any block in quick on tl0 inet from 10.0.0.0/8 to any block out quick on tl0 inet from any to 10.0.0.0/8 block out quick on tl0 inet from any to 172.16.0.0/12 block out quick on tl0 inet from any to 192.168.0.0/16 block out quick on tl0 inet from any to 127.0.0.0/8

如你所见, PF扩展仅减少了 pf.conf 文件的编写及维护工作量, 但实际上并未简化 pf(4) 的规则处理 过程。

宏的应用范围并非仅限于地址或端口; 它们在PF规则文件中随处可见:

pre = "pass in quick on ep0 inet proto tcp from " post = "to any port { 80, 6667 } keep state"

# David's classroom $pre 21.14.24.80 $post

# Nick's home $pre 24.2.74.79 $post $pre 24.2.74.178 $post

扩展为:

http://www.9971.us/OpenBSD4.5/c/pf/shortcuts.html(第 3/6 页)2009-5-3 23:04:37 PF: The OpenBSD Packet Filter中文非官方版 Shortcuts For Creating Rulesets

pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \ port = 80 keep state pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \ port = 6667 keep state pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \ port = 80 keep state pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \ port = 6667 keep state pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \ port = 80 keep state pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \ port = 6667 keep state

PF语法

PF的语法顺序很灵活, 允许定义一个轻灵的规则集。 PF能推断出确定的关键字, 这意味着这些关键 字无需在规则里明确地规定;并且PF对关键字顺序要求的也不严格, 因此不必去记忆严格的语法。

精简关键字

定义一个“默认拒绝”的策略使用了两行规则:

block in all block out all

上面的规则可精简为:

block all

如果没有指定方向, PF会假设这条规则应用在双方向的数据包上。

同样, "from any to any" 和 "all" 等字句也可以在规则中省略, 例如:

block in on rl0 all pass in quick log on rl0 proto tcp from any to any port 22 keep state

http://www.9971.us/OpenBSD4.5/c/pf/shortcuts.html(第 4/6 页)2009-5-3 23:04:37 PF: The OpenBSD Packet Filter中文非官方版 Shortcuts For Creating Rulesets 可以简化为:

block in on rl0 pass in quick log on rl0 proto tcp to port 22 keep state

第一行在rl0上禁止从anywhere到anywhere的所有进入的数据包, 而第二行在rl0端口22上放行所有进 入的TCP通讯。

简化Return

用来阻止数据包和带有TCP RST或ICMP不可到达回复的规则集可能像这样:

block in all block return-rst in proto tcp all block return-icmp in proto udp all block out all block return-rst out proto tcp all block return-icmp out proto udp all

这些内容可以简化为:

block return

当PF看到 return 关键字时, 它能根据被阻止的数据包的协议巧妙地发送适当的回应, 或者不回应。

关键字排序

多数情况下可以灵活地组织关键字的顺序。例如, 一条规则:

pass in log quick on rl0 proto tcp to port 22 \ flags S/SA keep state queue ssh label ssh

也可以这样写:

pass in quick log on rl0 proto tcp to port 22 \ queue ssh keep state label ssh flags S/SA

http://www.9971.us/OpenBSD4.5/c/pf/shortcuts.html(第 5/6 页)2009-5-3 23:04:37 PF: The OpenBSD Packet Filter中文非官方版 Shortcuts For Creating Rulesets 另外, 类似的变化也没问题。

[上一小节: 重定向(端口转发)] [总目录] [下一小节: 运行选项]

[email protected] $OpenBSD: shortcuts.html, v 1.22 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/shortcuts.html(第 6/6 页)2009-5-3 23:04:37 PF:The OpenBSD Packet Filter中文非官方版 Traffic Redirection (Port Forwarding)

[上一小节: 网络地址转换] [总目录] [下一小节: 定义规则的捷径]

PF: 重定向(端口转发)

目录

● 介绍

● 重定向和包过滤

● 安全隐患

● 重定向与反射

❍ 水平分割DNS

❍ 将服务器移至独立的本地网络

❍ TCP代理

❍ RDR和NAT组合

介绍

当你在办公室中运行NAT时, 你可以让内部所有的机器连接到Internet上, 但是如果外部需要访问 NAT网关后的一台机器怎么办呢?这就需要设置重定向了。重定向允许将进站通讯发至NAT网关 后面的机器。

我们看一个例子:

rdr on tl0 proto tcp from any to any port 80 -> 192.168.1.20

这行将访问TCP端口80(web服务器)的通讯重定向到内部网络的一台机器192.168.1.20上。这样, 尽 管192.168.1.20在网关后面, 而且还在你的内部网络上, 但仍然可以从外部访问它。

上面rdr这行中的 from any to any 这部分很有用, 如果你知道需要访问web服务器的地址或子网, 你可 以在这里进行限制:

http://www.9971.us/OpenBSD4.5/c/pf/rdr.html(第 1/6 页)2009-5-3 23:04:40 PF:The OpenBSD Packet Filter中文非官方版 Traffic Redirection (Port Forwarding) rdr on tl0 proto tcp from 27.146.49.0/24 to any port 80 -> \ 192.168.1.20

这条规则限制了仅能从指定的子网访问。注意, 这意味着你可以将来自不同区域的外部主机(的通 讯)重定向到网关后不同的机器上, 这很有用。例如, 你可以让内部用户从远程站点通过网关上相同 的IP地址和端口访问他们自己的计算机, 当然, 前提同样是您知道用户在远程站点上的IP地址:

rdr on tl0 proto tcp from 27.146.49.14 to any port 80 -> \ 192.168.1.20 rdr on tl0 proto tcp from 16.114.4.89 to any port 80 -> \ 192.168.1.22 rdr on tl0 proto tcp from 24.2.74.178 to any port 80 -> \ 192.168.1.23

重定向规则内同时可以使用端口范围:

rdr on tl0 proto tcp from any to any port 5000:5500 -> \ <--- #1 192.168.1.20 rdr on tl0 proto tcp from any to any port 5000:5500 -> \ <--- #2 192.168.1.20 port 6000 rdr on tl0 proto tcp from any to any port 5000:5500 -> \ <--- #3 192.168.1.20 port 7000:*

这个例子是将5000到5500(包含)端口重新定向到192.168.1.20上。在规则 #1 里, 端口5000被重定向到 5000, 5001到5001...... 。在规则 #2 里, 范围内所有端口被重定向到端口6000, 而规则e #3 里, 端口5000 被重定向到7000, 5001到7001 ......

重定向和包过滤

注意:转换后的数据包必须还途径过滤引擎, 并且根据预先定义的过滤规则判断允许或禁止其通 过。

这条规则唯一的例外是在rdr规则里使用了pass 关键字, 这种情况下, 被重定向的数据包可全部通过 过滤引擎;过滤规则将不审查这些数据包, 这是避免为每个重定向规则添加过滤规则的一条捷径。 你可以想象一下, 与普通的rdr规则(不包含 pass 关键字)相关的过滤规则带有keep state关键字, 然而, 如果你想启用更多指定的过滤选项, 例如synproxy, modulate state等, 你还必须使用一条 pass 规则, 因 为这些选项在重定向规则内不适用。

还需要注意的是, 因为转换发生在过滤前, 过滤引擎看到的是经转换的数据包, 因为数据包被看到

http://www.9971.us/OpenBSD4.5/c/pf/rdr.html(第 2/6 页)2009-5-3 23:04:40 PF:The OpenBSD Packet Filter中文非官方版 Traffic Redirection (Port Forwarding) 时目的地址和/或端口已经被修改为rdr规则指定的重定向地址或端口。想象一下这种情形:

● 192.0.2.1 - Internet上的主机 ● 24.65.1.13 - OpenBSD路由器的外部地址 ● 192.168.1.5 - web服务器的内部地址

重定向规则:

rdr on tl0 proto tcp from 192.0.2.1 to 24.65.1.13 port 80 \ -> 192.168.1.5 port 8000

未经rdr规则处理的数据包:

● 源地址: 192.0.2.1 ● 源端口: 4028 (操作系统随机选择) ● 目的地址: 24.65.1.13 ● 目的端口: 80

经rdr规则处理后的数据包:

● 源地址: 192.0.2.1 ● 源端口: 4028 ● 目的地址: 192.168.1.5 ● 目的端口: 8000

因为过滤引擎看到数据包时转换已经发生了, 所以过滤引擎看到的是下面的IP数据包。

安全隐患

重定向肯定存在安全隐患, 这等于在防火墙上穿了一个洞允许外部通讯进入内部, 被保护的网络存 在潜在的安全威胁。如果通讯被重定向到一个内部的web服务器, 并且服务器程序或上面的CGI脚 本的一个弱点被发现, 那么这台机器可能遭受来自Internet的入侵威胁。入侵者可以从它进入内部 网络, 因为防火墙允许以这种方式访问内部网络。

通过将把外部访问的机器严格地限制在隔离的网络上可以最小化这种风险。这个隔离的网络经常 被称为非军事化区(DMZ)或者私有服务网络(PSN), 仔细地审查过滤内部网络与隔离区域间的来往 通讯, 这样即使这台web服务器被攻陷, 受影响的区域也仅限于DMZ/PSN网络。

重定向与反射

http://www.9971.us/OpenBSD4.5/c/pf/rdr.html(第 3/6 页)2009-5-3 23:04:40 PF:The OpenBSD Packet Filter中文非官方版 Traffic Redirection (Port Forwarding) 通常, 重定向规则被用于将来自Internet的进站连接转发到一台有私有地址的本地网络服务器上, 像 这样:

server = 192.168.1.40

rdr on $ext_if proto tcp from any to $ext_if port 80 -> $server \ port 80

当你从LAN上客户端测试这个重定向规则时, 你会发现它不能工作。原因是重定向规则仅应用于 流经指定接口的数据包(在上例中是$ext_if, 外部接口), 然而, 位于LAN的主机连接到防火墙的外部 地址并不意味着数据包真的流经它的外部接口, 防火墙上的TCP/IP堆栈将进站数据包的目的地址 与自己的地址及别名进行比较并察觉到要连接到它自己, 所以它马上将这些数据包改道至内部接 口。 这样的数据包不会物理上真正地通过外部接口, 并且堆栈任何情况下也不会这样处理内部至 内部数据包。因此, PF永远不会在外部接口上看见这些数据包, 重定向规则指定的外部接口也不会 起作用。

增加第二条针对内部网卡的重定向规则也不能达到期望的效果。当本地的客户端连接防火墙的外 部地址时, 完成TCP握手的初始化数据包通过内部接口到达防火墙。重定向规则确实起作用了, 并 且目的地址被替换为内部服务器的, 这些数据包被转发回来经过内部接口抵达内部服务器。但是 源地址并没有被转换, 也就是说还是本地客户端的地址, 所以服务器将回复直接发送到内部客户 端, 防火墙永远看不到这些回复和没有机会进行反向转换, 而这个客户端由从未期望的源地址收到 了一个回复, 所以它就直接将这个回复丢弃了, 最终TCP握手失败了, 并且不能建立任何连接。

很明显, 我们还是希望内部的客户端可以像外部的客户端一样连接到内部的服务器。这有几种解 决的方法:

水平分割DNS

配置DNS服务器对来自本地和外部的客户端区别应询是有可能的, 这样在域名解析过程中本地客 户端将得到内部服务器的地址, 它们就会直接连接到本地服务器上, 而防火墙一点也不会干涉。因 为数据包不必通过防火墙, 所以这减少了本地的通讯量。

将服务器移至单独的本地网络

在防火墙上里另外再增加一个网络接口, 并且将服务器从客户端所在网络迁移到一个专门的网络 (DMZ), 就像对外部客户端一样允许对内部客户端的连接进行重定向。使用单独的网络有几个优 点, 包括通过将服务器和本地其余主机隔离开以提高安全性, 即便服务器总是面临威胁甚至被攻陷 (本例中可以从Internet直接接触它), 它也不能直接访问本地的其余主机, 因为所有的连接必须经过 防火墙。

TCP代理

http://www.9971.us/OpenBSD4.5/c/pf/rdr.html(第 4/6 页)2009-5-3 23:04:40 PF:The OpenBSD Packet Filter中文非官方版 Traffic Redirection (Port Forwarding)

可以在服务器上建立一个普通的TCP代理, 监听被转发到的端口或者将连到内部接口的连接重定 向到它监听的端口, 当一个内部客户端连接到防火墙时, 代理承担这个连接, 再建立一个到内部防 火墙的连接, 并且在这两个连接间转发数据。

简单的代理可以使用 inetd(8) 和 nc(1)建立。下面 /etc/inetd.conf 的项目在产生一个监听套接字并绑 定在loopback地址(127.0.0.1) 和端口5000上。连接被转发到192.168.1.10的80端口上。

127.0.0.1:5000 stream tcp nowait nobody /usr/bin/nc nc -w \ 20 192.168.1.10 80

The following redirection rule forwards port 80 on the internal interface to the proxy:

rdr on $int_if proto tcp from $int_net to $ext_if port 80 -> \ 127.0.0.1 port 5000

RDR和NAT组合

在内部接口上附加一条NAT规则, 上面描述的源地址转换中的缺陷将得到修正。

rdr on $int_if proto tcp from $int_net to $ext_if port 80 -> \ $server

no nat on $int_if proto tcp from $int_if to $int_net nat on $int_if proto tcp from $int_net to $server port 80 -> \ $int_if

这将导致来自客户端的初始化数据包转发回内部接口时被再次转换, 用防火墙内部地址替换客户 端的源地址。内部服务器将回复防火墙, 防火墙转发给内部客户端时将反转NAT和RDR的地址。 这个结构相当的复杂, 因为它为每个反射连接产生两个单独的状态, 必须小心防止NAT规则应用在 其它的通讯上, 例如来自外部主机的连接(通过其它的重定向)或防火墙本身。注意上面的rdr规则 会导致TCP/IP堆栈看到带有内部网络目的地址到达内部接口的数据包。

通常情况下, 应该用前面所提方法替代此方法。

[上一小节: 网络地址转换] [总目录] [下一小节: 定义规则的捷径]

http://www.9971.us/OpenBSD4.5/c/pf/rdr.html(第 5/6 页)2009-5-3 23:04:40 PF:The OpenBSD Packet Filter中文非官方版 Traffic Redirection (Port Forwarding)

[email protected] $OpenBSD: rdr.html, v 1.27 2007/05/06 18:59:54 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/rdr.html(第 6/6 页)2009-5-3 23:04:40 PF:The OpenBSD Packet Filter中文非官方版 Network Address Translation (NAT)

[上一小节: 包过滤] [总目录] [下一小节: 重新定向网络通讯(端口转发)]

PF: 网络地址转换(NAT)

目录

● 介绍

● NAT怎样工作

● NAT和包过滤

● IP转发

● 配置NAT

● 双向映射(1:1映射)

● 例外的转换规则

● 检查NAT状态

介绍

网络地址转换(NAT)是将一(或多)个网络整体映射到一个IP地址的方法。当Internet服务提供商提供给 你的IP地址数量少于需访问Internet的主机数量时NAT是必须的。NAT的描述请参看 RFC 1631的"The IP Network Address Translator (NAT)."

NAT允许你使用保留的地址段, 在 RFC 1918, "Address Allocation for Private Internets."对其进行了典型性 地描述。你的内部网络可以使用下列的一个或多个网络地址段:

10.0.0.0/8 (10.0.0.0 - 10.255.255.255) 172.16.0.0/12 (172.16.0.0 - 172.31.255.255) 192.168.0.0/16 (192.168.0.0 - 192.168.255.255)

OpenBSD系统要进行NAT至少需要两个网络适配器, 一个连接Internet, 另一个连接内部网络。 NAT将 转换来自内部网络的请求, 所以看起来它们似乎都来自你的OpenBSD NAT系统。

NAT怎样工作

http://www.9971.us/OpenBSD4.5/c/pf/nat.html(第 1/7 页)2009-5-3 23:04:43 PF:The OpenBSD Packet Filter中文非官方版 Network Address Translation (NAT) 当一个内部网络的客户端与Internet上的一台计算机通讯时, 它发送IP数据包到那台计算机。这些数据 包包含了所有抵达所需的地址信息。NAT会参与修改这些信息:

● 源地址 (例如, 192.168.1.35) ● 源TCP或UDP端口(例如, 2132)

当数据包流经NAT网关时将会被修改, 所以对外它们看起来像是发自NAT网关的数据包。NAT网关 会将这些变化记录在自己的状态表中以便它可以 a)对回应的数据包逆向操作(还原)和 b) 确保返回的 数据包不被防火墙阻止。例如, 可能产生如下的变化:

● 源地址: 替换为网关的外部地址(例如, 24.5.0.5) ● 源端口: 替换为随机指定的网关未使用端口(例如, 53136)

无论内部的机器和外部的主机都不知道这些转换步骤。对内部主机来说, NAT系统只是一个Internet 网关;对Internet上的主机来说, 这些数据包看起来直接来自NAT系统; 它们甚至无法察觉存在一个这样 的内部工作站。

当Internet主机回应内网机器的数据包时, 这些回应数据包会被冠以NAT网关的外部IP地址(24.5.0.5)和 转换端口(53136)。NAT网关会搜索状态表, 确认这些回应的数据包是否匹配一个已经建立的连接。状 态表内基于IP地址和端口的匹配项会告诉PF这些数据包属于位于192.168.1.35的内部机器发起的连接, PF将会对回应的数据包进行逆向修改操作, 并将修改后的回应数据包转发给内部机器。

ICMP数据包的转换过程类似上面的操作, 但是不修改源端口。

NAT和包过滤

注意: 转换后的数据包必须还途径过滤引擎, 并且根据预先定义的过滤规则判断允许或禁止其通过。 唯一的例外是在NAT规则里使用了pass 关键字, 这将使被NAT的数据包不经检查而直接通过过滤引 擎。

还需要知道的是, 因为转换发生在过滤之前, 过滤引擎看见的是带有转换地址和端口的被转换的数据 包, 这在 NAT怎样工作.里有相关的描述。

IP转发

因为NAT总是用于路由器和网关, 所有可能必须在OpenBSD机器上启用IP转发以便让数据可以在网络 接口间传送, 使用sysctl机制启用IP转发:

# sysctl net.inet.ip.forwarding=1 # sysctl net.inet6.ip6.forwarding=1 (如果使用 IPv6)

http://www.9971.us/OpenBSD4.5/c/pf/nat.html(第 2/7 页)2009-5-3 23:04:43 PF:The OpenBSD Packet Filter中文非官方版 Network Address Translation (NAT) 要使这些变化永久生效, 将下面的两行加入 /etc/sysctl.conf:

net.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1

这两行在默认安装时已经有了, 不过是被注释的(最前面有#)。删除#并保存文件, 重新启动后IP转发据 生效了。

配置NAT

通常 pf.conf 文件里的NAT规则看起来像这样: nat [pass] [log] on interface [af] from src_addr [port src_port] to \ dst_addr [port dst_port] -> ext_addr [pool_type] [static-port] nat 开始启用NAT规则的关键字。 pass 导致被转换的数据包全部旁通于过滤规则。(不受过滤规则限制) log 通过 pflogd(8).记录匹配的数据包。通常仅记录第一个匹配的数据包。如果要记录所有匹配的 数据包使用 log (all). interface 被转换数据包流经的网络接口名称或组。 af 地址族, inet表示IPv4;inet6表示IPv6。PF通常基于源/目标地址有能力检测这个参数。 src_addr 数据包将被转换的源(内部)地址。这个源地址可以被指定为: ❍ 一个IPv4或IPv6地址。 ❍ 一个 CIDR 网段。

❍ 当规则集被载入后, 一个可以通过DNS解析的有效的域名。所有解析出的IP地址将在规 则中取代这个域名。 ❍ 一个网络接口或组的名称。 载入规则后所有分派给此接口的IP地址会取代规则中的网 络接口或组的名称。 ❍ 一个网络接口加上 /子网掩码 (例如, /24)。 所有此接口上的IP地址与子网掩码组合成一 个CIDR网段, 此地址段会替换规则中的网络接口/子网掩码。 ❍ 一个带有如下任何一个修饰符得网络接口名称: ■ :network - 代替CIDR网段(例如, 192.168.0.0/24) ■ :broadcast - 代替网络广播地址(例如, 192.168.0.255) ■ :peer - 代替点到点链接中对方的IP地址 另外, :0 修饰符可以附加到一个接口名称或上面任何修饰符的后面, 它指示PF将规 则中的名称替换为IP地址时不包含别名的IP地址。这些修饰符也可以应用在括号

http://www.9971.us/OpenBSD4.5/c/pf/nat.html(第 3/7 页)2009-5-3 23:04:43 PF:The OpenBSD Packet Filter中文非官方版 Network Address Translation (NAT) 内的接口上。 例子: fxp0:network:0 ❍ 一个表格。

❍ 任何上面的规则加上了否定修饰符 ! ("not") 修饰符。 ❍ 使用一个 列表 表示的一组地址。

❍ 关键字 any 代表所有地址。 src_port 分别代表第四层包头的源端口。端口可以指定为: ❍ 一个1到65535之间的数字 ❍ 一个 /etc/services 内指定的有效的服务名称

❍ 用 列表 表示的一组端口

❍ 一个范围: ■ != (不等于) ■ < (小于) ■ > (大于) ■ <= (小于等于) ■ >= (大于等于) ■ >< (范围内) ■ <> (范围外) 最后这两个是二元运算符(带有两个参数) 并且这两个参数不包含在范围 内。 ■ : (包含在范围内) 也是二元运算符, 但是两个参数包含在范围内。 port 选项不经常用在nat规则里, 因为不管使用那个端口, 最终目的是NAT所有通讯。 dst_addr 被转换数据包的目的地址。目的地址的指定方法同源地址。 dst_port 包含在数据包头第四层目的端口, 指定方法同源端口。 ext_addr NAT网关上的外部(转换)地址, 数据包将被转换为此地址。外部地址可以被指定为: ❍ 一个IPv4或IPv6地址。 ❍ 一个 CIDR 网段。

❍ 当规则集被载入后, 一个可以通过DNS解析的有效的域名。所有解析出的IP地址将在规 则中取代这个域名。 ❍ 外部网络接口的名称。 载入规则后所有分派给此接口的IP地址会取代规则中的网络接 口或组的名称。 ❍ 在括号()内的外部网络接口名称。 这将告诉PF当次网络接口的IP地址变化时更新规 则。这在外部接口通过DHCP或拨号获得IP地址的情况下非常有用, 因为这样不用在每 次IP地址变化时重新载入规则。 ❍ 一个带有以下修饰符之一的网络接口名称: ■ :network - 代替CIDR网段(例如, 192.168.0.0/24) ■ :peer - 代替点到点链接中对方的IP地址 另外, :0 修饰符可以附加到一个接口名称或上面任何修饰符的后面, 它指示PF将规 则中的名称替换为IP地址时不包含别名的IP地址。 这些修饰符也可以应用在括号 内的接口上。 例子: fxp0:network:0

http://www.9971.us/OpenBSD4.5/c/pf/nat.html(第 4/7 页)2009-5-3 23:04:43 PF:The OpenBSD Packet Filter中文非官方版 Network Address Translation (NAT)

❍ 使用一个 列表 表示的一组地址。. pool_type 指定用于转换的 地址池 类型。 static-port 告诉PF不转换TCP和UDP数据包的源端口。

通常使用的NAT规则的基本格式也许像这样:

nat on tl0 from 192.168.1.0/24 to any -> 24.5.0.5

这条规则是说在tl0接口上执行NAT, 也就是将所有来自192.168.1.0/24网段的数据包的IP地址转换成 24.5.0.5。

虽然上面的格式没错, 但是这不是推荐的格式, 这样维护起来很困难, 因为任何外部或内部网络的数字 变化都需要重新修改这条规则。请读者可以和下面更易于维护的这行规则比较一下(tl0 是外部接口, dc0 是内部接口):

nat on tl0 from dc0:network to any -> tl0

这行的优势相当明显: 你可以改变任何接口的IP地址而无需更改规则。

当像上面这样将转换地址指定为一个接口名称时, 这个IP地址在载入 pf.conf 文件时已经确定了, 不是 在运行的时候。如果你使用DHCP配置你的外部接口, 这可能是个问题, 如果你被分配的IP地址变化 了, NAT会继续向老的IP地址转换出站数据包, 这会导致出站连接失效。要解决这个问题, 你可以通过 给此接口名称加上括号的方式告诉PF自动更新转换地址:

nat on tl0 from dc0:network to any -> (tl0)

这种方法在转换IPv4和IPv6这两种地址时全有效。

双向映射(1:1映射)

一个双向映射可以通过 binat 规则建立。一个 binat 规则在内部IP地址和外部IP地址之间建立一个一对 一的映射。这是有益处的, 例如:用自己的外部IP地址在Internet上提供一个web服务器, Internet到外部 地址的连接将被转换为内部地址并且来自web服务器的连接(例如DNS请求)将被转换为外部地址, 在 使用 binat 规则时TCP和UDP端口从不会被更改, 就像使用NAT规则时一样。(译者:没理解, 难道是web 服务器在NAT规则里不能修改端口?)

例子:

http://www.9971.us/OpenBSD4.5/c/pf/nat.html(第 5/7 页)2009-5-3 23:04:43 PF:The OpenBSD Packet Filter中文非官方版 Network Address Translation (NAT)

web_serv_int = "192.168.1.100" web_serv_ext = "24.5.0.6"

binat on tl0 from $web_serv_int to any -> $web_serv_ext

例外的转换规则

在转换规则里使用 no 关键字可以设置例外的情况, 例如, 上面的例子改成像这样:

no nat on tl0 from 192.168.1.208 to any nat on tl0 from 192.168.1.0/24 to any -> 24.2.74.79

那么除了192.168.1.208, 整个192.168.1.0/24网段上的数据包(的IP地址)全转换成了外部地址24.2.74.79。

注意第一条规则胜利了(权限高); 如果有一条带 no 关键字的规则, 则数据包不会被转换。 no 关键字 同样可以用于 binat 和 rdr 规则。

检查NAT状态 Status

要查看正在运行的NAT转换可以使用 pfctl(8) 工具加上 -s 状态选项。这个选项将列出所有当前的 NAT会话:

# pfctl -s state fxp0 TCP 192.168.1.35:2132 -> 24.5.0.5:53136 -> 65.42.33.245:22 TIME_WAIT:TIME_WAIT fxp0 UDP 192.168.1.35:2491 -> 24.5.0.5:60527 -> 24.2.68.33:53 MULTIPLE:SINGLE

解释 (仅首行): fxp0 表示状态被绑定的接口, 如果状态是 浮动的 会出现self字句。

TCP 连接使用的协议。

192.168.1.35:2132 这个IP地址(192.168.1.35)是机器在内网上的IP地址, 源端口为2132。IP头中这个地址将被替换 掉。

http://www.9971.us/OpenBSD4.5/c/pf/nat.html(第 6/7 页)2009-5-3 23:04:43 PF:The OpenBSD Packet Filter中文非官方版 Network Address Translation (NAT) 24.5.0.5:53136 IP地址(24.5.0.5)和端口(53136)是网关的地址和端口, 所有的内部数据包的IP地址和端口将全被 转换为此IP和端口。

65.42.33.245:22 这个IP地址(65.42.33.245)和端口(22)是内部机器要访问的。

TIME_WAIT:TIME_WAIT 这表示PF认为此TCP连接应处于的状态。

[上一小节: 包过滤] [总目录] [下一小节: 重新定向网络通讯(端口转发)]

[email protected] $OpenBSD: nat.html, v 1.29 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/nat.html(第 7/7 页)2009-5-3 23:04:43 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

[上一小节: 表格] [总目录] [小下一节: 网络地址转换]

PF: 包过滤

目录

● 介绍

● 规则语法

● 默认拒绝

● 允许通讯

● quick关键字

● 保持状态

● 为UDP保持状态

● 状态化跟踪选项

● TCP标志

● TCP SYN代理

● 阻塞欺骗数据包

● 单播反向路径转发

● 被动的操作系统指纹识别

● IP选项

● 过滤规则集实例

介绍

当数据包经过一个网络接口时PF会有选择地允许或禁止。 pf(4) 在检查数据包时使用的标准是基于OSI模型的 第三层 (IPv4 及 IPv6) 和第四层 (TCP, UDP, ICMP 及 ICMPv6)的包头。最常使用的标准是源和目标的地址、源 和目标的端口、协议。

过滤规则指定了数据包必须匹配和最终执行的标准, 当发现一个匹配项时遵照规则执行阻塞或放行。过滤规 则以从前至后的顺序进行评估, 最后一条匹配的规则将是"胜者", 除非数据包匹配了一条包含quick关键字的规 则, 此时这个数据包被评估为在最终动作前可以违反所有的过滤规则。如果在过滤规则集前面有一个隐含的 pass all, 这就意味着如果一个数据包没有匹配任何规则那他将会被允许通过。

(译者注:1.如果前后规则有冲突会按照后面的规则执行。 2.带quick关键字的规则有最高权限, 会被立刻执行。)

规则语法

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 1/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

通常, 过滤规则非常简单的语法是:

action [direction] [log] [quick] [on interface] [af] [proto protocol] \ [from src_addr [port src_port]] [to dst_addr [port dst_port]] \ [flags tcp_flags] [state] action 对匹配数据包执行的动作, pass或block 。pass动作允许数据包回到内核做进一步处理, 而block动作则基 于 block-policy 的设定, 默认的动作可以设定为block drop 或 block return 。 direction 在一个接口上数据包传送的方向, in或out 。 log 指定通过 pflogd(8).记录数据包, 如果规则产生了状态则仅纪录状态的建立。要记录所有的数据包使用 log (all). quick 如果一个数据包匹配了一条指定了quick关键字的规则, 那么这条规则被认为是最后一条匹配的规则, 并 会立即按此规则对数据包执行指定的动作。 interface 数据包经过的网络接口名称或组。 可以使用 ifconfig(8) 命令将网络接口添加到任意的组中。内核也会 自动产生几个组: ❍ egress组, 包括了包含默认路由的网络接口。 ❍ 克隆接口的接口家族组。例如: ppp或carp. 这使所有匹配规则的数据包可以分别通过ppp或carp接口。 af 数据包的地址族(address family), 也就是对应IPv4的inet, 或者对应IPv6的inet6。 通常PF可以通过源和/或 目标的地址确定此参数类型。 protocol 数据包的第4层协议: ❍ tcp ❍ udp ❍ icmp ❍ icmp6 ❍ 一个 /etc/protocols 定义的有效的协议名称。

❍ 0-255之间的一个协议编号 ❍ 通过列表定义的一组协议。 src_addr, dst_addr

分别代表IP报头的源和目标地址。地址可以指定为: ❍ 一个单独的IPv4 或 IPv6 地址。 ❍ 一个 CIDR 网段。

❍ 一个完全合法域名, 它必须在载入规则时能够被DNS解析, 解析出的IP地址会取代规则中的域 名。 ❍ 一个网络接口或组的名称。 所有分派给此接口的IP地址会取代规则中的网络接口或组的名称。 ❍ 一个网络接口加上 /子网掩码 (例如, /24)。 所有此接口上的IP地址与子网掩码组合成一个CIDR 网段, 此地址段会替换规则中的网络接口/子网掩码。 ❍ 一个( )内的网络接口或组的名称。它告诉PF如果此接口或组的IP地址发生变化时需要更新规

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 2/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

则。有些网络接口是通过DHCP或拨号获得IP地址的, 这种方式对它们很有效, 因为当其IP地址变 化时不用重新加载规则集。 ❍ 一个带有如下任何一个修饰符得网络接口名称: ■ :network - 代替CIDR网段(例如, 192.168.0.0/24) <---24表示前三个数字相同, 也就是在 192.168.0.1到192.168.0.254的范围内 ■ :broadcast - 代替网络广播地址(例如, 192.168.0.255) ■ :peer - 代替点到点链接中对方的IP地址 另外, :0 修饰符可以附加到一个接口名称或上面任何修饰符的后面, 它指示PF将规则中的 名称替换为IP地址时不包含别名的IP地址。 这些修饰符也可以应用在括号内的接口上。 例子: fxp0:network:0 ❍ 一个表格。

❍ 关键字 urpf-failed 应用于源地址, 它指示PF通过uRPF检查执行此规则。

❍ 任何上面的规则加上了否定修饰符 ! ("not") 修饰符。 ❍ 使用一个 列表 表示的一组地址。

❍ 关键字 any 代表所有地址。 ❍ 关键字 all 是 from any to any 的缩写。 src_port, dst_port 分别代表第四层包头的源和目的端口。端口可以指定为: ❍ 一个1到65535之间的数字 ❍ 一个 /etc/services 内指定的有效的服务名称 <---例如:www 代表web服务的80端口, ftp 代表ftp服务 的21端口 ❍ 用 列表 表示的一组端口

❍ 一个范围: ■ != (不等于) ■ < (小于) ■ > (大于) ■ <= (小于等于) ■ >= (大于等于) ■ >< (范围内) ■ <> (范围外) 最后这两个是二元运算符(带有两个参数) 并且这两个参数不包含在范围内。 ■ : (包含在范围内) 也是二元运算符, 但是两个参数包含在范围内。 tcp_flags 指定使用proto tcp(tcp协议)时TCP头必须设定的标志。标志设定像这样 flags check/mask. 例如: flags S/SA - 指示PF只检查 S 和 A (SYN 和 ACK) 标志, 并且只有在SYN标志为"on"时才匹配。在OpenBSD 4.1和以后 的版本中默认的标志 S/SA 被应用于所有的TCP过滤规则中。 state 指定是否在数据包匹配规则时保持状态信息。 ❍ keep state - 作用于 TCP, UDP 和 ICMP。在OpenBSD 4.1和以后的版本中, 这是所有过滤规则的默 认选项。 ❍ modulate state - 仅作用于TCP。 PF将为所有匹配这一规则的数据包产生强壮的初始化序号 (ISNs)。 ❍ synproxy state - 代理进入的TCP连接以保护服务器免受TCP SYN 洪水式攻击。这个选项包含了 keep state和modulate state的功能。

默认拒绝

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 3/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

建立一个防火墙时, 推荐的常规做法是采用"默认拒绝"的方式。也就是, 先拒绝一切, 而后有选择地放行特定的 通讯。 这种方式之所以被推荐是因为它慎之又慎并且也可以更简单地定义一个规则集。

要建立一个默认拒绝的过滤策略, 最前面的两条过滤规则应该是:

block in all block out all

这将阻止所有的通讯。

允许通讯

通讯必须被确认通过防火墙, 否则将会被默认拒绝规则丢弃。 这时数据包规则诸如 源/目标的端口、源/目标 的地址、以及协议就该一展身手了。无论何时, 一旦允许通讯通过防火墙, 相应规则应定义得尽可能地严厉, 这是为了保证希望的通讯、并且只有希望的通讯才可以通过防火墙。

一些例子:

# Pass traffic in on dc0 from the local network, 192.168.0.0/24, # to the OpenBSD machine's IP address 192.168.0.1. Also, pass the # return traffic out on dc0. pass in on dc0 from 192.168.0.0/24 to 192.168.0.1 pass out on dc0 from 192.168.0.1 to 192.168.0.0/24

# Pass TCP traffic in on fxp0 to the web server running on the # OpenBSD machine. The interface name, fxp0, is used as the # destination address so that packets will only match this rule if # they're destined for the OpenBSD machine. pass in on fxp0 proto tcp from any to fxp0 port www quick关键字

像前面指出的那样, 每个数据包被规则集从上到下顺序评估。 默认情况下, 数据包被标志为可通行, 但是任一 规则全可以修改它, 甚至可以在最后一条规则前面反复修改几次。最后一条匹配的规则是"胜者"。但这里有一 个例外: 如果在一条匹配的过滤规则中包含quick选项, 就会使PF放弃处理其余的匹配规则而直接执行这条规则 的动作。我么看两个例子:

错误的例子:

block in on fxp0 proto tcp from any to any port ssh pass in all

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 4/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

这种情况下, block 那行可能被评估过了, 但是永远不会起作用, 因为它后面的一行是放行所有进入的通讯。.

较好的例子:

block in quick on fxp0 proto tcp from any to any port ssh pass in all

这与第一个例子略有不同。 因为有quick选项, 所以如果一个数据包匹配了block那行, 它将会被马上阻止, 并且 忽略其余的所有相匹配的规则集。

状态保持

PF的一个重要功能就是"保持状态"或"状态化检查"。 状态化检查是指PF的跟踪状态或一个网络连接过程的能 力。 通过将每个连接的信息储存在一个状态表中, PF有能力快速测定一个通过防火墙的数据包是否属于一个 已经建立的连接。如果这个数据包属于已经建立的连接, 就不经规则集检查而直接被允许通过防火墙。

保持状态有很多优点, 包括简化规则集和提供更好的数据包过滤性能。 PF有能力将任何方向的数据包与状态 表中的项目匹配, 这意味着不需要编写一个回程通讯的规则, 并且因为数据包匹配状态化连接不需要经过规则 集的检查, 所以PF处理这类数据包的时间显著减少。

当一条规则导致了状态, 第一个匹配此规则的数据包将在发送者和接收者之间建立一个"状态", 现在不仅是由 发送者到接收者的数据包因为匹配这个状态项而被防火墙放行, 就连从接收者至发送者的答复数据包(回程 通讯)也会被直接放行。

从OpenBSD 4.1开始, 任何过滤规则在一个数据包匹配它时会自动产生一个状态项, 先前的OpenBSD版本中过 滤规则不得不明确地使用 keep state 选项。

OpenBSD 4.1及以后版本的例子:

pass out on fxp0 proto tcp from any to any

OpenBSD 4.0及以前版本的例子:

pass out on fxp0 proto tcp from any to any keep state

这些规则允许在fxp0接口上的任何出站TCP通讯以及回复通讯通过防火墙。 保持状态是一个非常好的特性, 使 用它可以显著的提高你防火墙的性能, 因为状态查询比用规则集检验数据包快得多。 modulate state 选项的作用就像 keep state, 除了它仅能应用于TCP数据包。 使用 modulate state选项时, 出站连接 的ISN(初始化序号)是随机的, 这对保护某些选择ISN有困难的操作系统的初始化连接是十分有用的, 从 OpenBSD 3.5开始, modulate state 选项可以应用于指定了非TCP协议的规则。

为出站的TCP, UDP和ICMP数据包保持状态并调整TCP初始化序号:

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 5/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

pass out on fxp0 proto { tcp, udp, icmp } from any \ to any modulate state

保持状态的另一个优点是相应的ICMP通讯会被防火墙放行。例如, 一个通过防火墙的TCP连接被跟踪了状态, 这时一个与此TCP连接相关的ICMP source-quench信息抵达, PF会将这个信息和相关的状态项匹配, 并放行。 (译者注:ICMP source-quench是一种Internet控制信息协议, 这个信息要求发送者减少发送给路由器或主机的信 息, 在路由器和主机没有足够的缓存空间处理请求时会产生这种信息, 也可能是路由器或主机的缓存已接近限 定值。想了解更多的Internet控制信息协议, 请参阅这里)

状态项的范围可以被state-policy runtime选项全局控制, 也可通过一个基于状态选项关键字if-bound, group- bound 和 floating 的规则来控制。这里的每一个规则关键字与state-policy选项具有同等的作用。例如:

pass out on fxp0 proto { tcp, udp, icmp } from any \

to any modulate state (if-bound)

这条规则指示为了数据包匹配状态项, 这些数据包必须通过fxp0接口进行传送。

注意 nat, binat, 和 rdr 规则会为匹配的连接隐含地产生状态直至连接完全通过防火墙规则集。

为UDP保持状态

有人也许听说过"没人能为UDP产生状态, 因为UDP是一个无状态协议!", 尽管一个UDP会话没有任何状态(有 明确的通讯起点和终点)的概念是对的, 但它对PF为UDP会话产生状态的能力没有任何影响。当遇到没有"开 始"和"结束"数据包的协议时, PF仅简单地检查一个匹配的数据包已通过的时间, 如果超过时限, 状态就会被清 除。这个时限在 pf.conf 文件内用 timeout values 选项 进行设置。

状态化跟踪选项

可以用以下几种指定的选项控制过滤规则产生的状态项的动作: max number 限制此规则可以产生状态项的最大值。如果达到了此最大值, 这条规则将无法为数据包产生状态直至 已经存在的状态数降到最大值以下。 no state 防止规则自动产生一个状态项。 source-track 这个选项对每个源IP地址产生的状态数量进行跟踪, 它有两种格式: ❍ source-track rule - 此规则可以产生状态的最大数量受max-src-nodes 和 max-src-states 选项限制。只 有此规则仅限制自己产生的状态项数目。

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 6/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

❍ source-track global - 这个选项用来限制所有规则产生的状态数量。每个规则可以指定不同的 max- src-nodes 和 max-src-states 选项, 然而每个规则产生的状态项都会被计入状态项总数内。 被跟踪的全局IP地址总数可以通过 src-nodes runtime option 进行控制。 max-src-nodes number 当使用 source-track 选项后, max-src-nodes 会限制可同时产生状态的源IP地址数量, 这个选项仅能与 source-track规则一同使用。 max-src-states number 当使用 source-track 选项后, max-src-states 会限制每个源IP地址可同时产生状态项的数量。这个限制范 围(例如, 仅该规则产生的状态或者所有使用source-track的规则产生的状态)依赖于 source-track 选项的 设定。

选项在括号内进行指定并紧跟一个state关键字(例如:keep state, modulate state, or synproxy state).如果有多个选项 就以逗号分开。在OpenBSD 4.1和以后版本中 keep state 选项变成了所有过滤规则隐含的默认选项, 尽管如此, 当指定状态化选项时, 它仍然必须带有一个state关键字。

例子:

pass in on $ext_if proto tcp to $web_server \ port www keep state \ (max 200, source-track rule, max-src-nodes 100, max-src-states 3)

上面的规则定义了下面的动作:

● 限制这条规则最多产生200个状态。 ● 启用源跟踪;限制产生的状态, 但仅限制基于此规则产生的状态 ● 限制可同时产生状态的最大节点数为100 ● 限制每个源IP地址最多可同时产生三个状态

可以在状态化的TCP连接中单独插入一组限制以完成三次握手。 max-src-conn number 限制一台主机用来完成三次握手的最大TCP连接数 max-src-conn-rate number / interval 在一个时间间隔内限制的最大新连接的数量。

上面两个选项会自动调用 source-track 规则选项并且不适用于 source-track global选项。

因为这些限制仅能用于TCP连接完成三次握手的过程, 还有更多的措施可以用来对付那些恶意的IP地址。 overload

将一个恶意主机的IP地址加入以此命名的表格o flush [global] 清除源地址产生的匹配此规则的其它所有状态。如果你指定了global(全局) , 将会删除这个源IP地址的 所有状态, 不管是由哪个规则产生的。

例子:

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 7/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

table persist block in quick from

pass in on $ext_if proto tcp to $web_server \ port www flags S/SA keep state \ (max-src-conn 100, max-src-conn-rate 15/5, overload flush)

上面的规则产生如下的结果:

● 限制每个源的最大连接数为100 ● 每5秒最多可以有15个连接 ● 将所有违反此限制主机的IP地址存入表格内 ● 对任何不良的IP地址来说, 原来由此规则产生的状态都会被清除。(译者:实际上不仅是匹配此规则的状 态, 而是已经禁止接入了, quick有最高权限。)

TCP 标志

用标志匹配TCP数据包经常被用来过滤企图打开一个新连接的TCP数据包。下面列出了TCP的标志以及其含 义:

● F : FIN - Finish; 完成; 会话结束 ● S : SYN - Synchronize; 同步, 请求开始对话 ● R : RST - Reset; 重新设定, 丢弃一个连接 ● P : PUSH - Push; 推, 数据包被马上发送 ● A : ACK - 确认 ● U : URG - 紧急 ● E : ECE - 显式拥塞通告显示 ● W : CWR - 拥塞窗口减少

要让PF在评估一条规则时检查TCP标志要采用下面带有flags关键字的语法:

flags check/mask flags any

这里的 mask 部分告诉PF只检查指定的标志而 check 部分指定标志的头部必须是"on"的数据包才可用来匹配。 使用any关键字来指定允许数据包头部使用任何组合的标志。

pass in on fxp0 proto tcp from any to any port ssh flags S/SA

上面的规则放行SYN标志的TCP通讯, 同时仅看SYN和ACK标志。一个带有SYN和ECE标志的数据包会匹配上 面的规则, 而一个带有SYN和ACK标志或仅有ACK标志的数据包则不匹配。

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 8/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

在OpenBSD 4.1和以后的版本中, 应用于TCP规则的默认标志为 flags S/SA , 加上OpenBSD 4.1默认的规则里的 keep state选项, 可以看出下面两行的作用是相同的:

pass out on fxp0 proto tcp all flags S/SA keep state pass out on fxp0 proto tcp all

每条规则将匹配带有SYN标志而ACK标志为0的数据包, 并且为每个匹配的数据包产生一个状态项。默认的标 志可以像上面描述的那样通过使用flags选项进行修改。

在OpenBSD 4.0和更早的版本中没有为任何规则设置默认的标志。每条规则不得不指定使用何种标志去匹配, 而且还要明确地使用keep state选项。

pass out on fxp0 proto tcp all flags S/SA keep state

你应该小心地使用标志 —— 明白你正在做什么和为什么这样做, 并且谨慎地处理别人的建议, 因为很多这样 的建议很糟糕。有人曾经这样建议过"仅为设置了SYN标志而非其它标志"的数据包产生状态, 这样的规则最终 变成了这样:

. . . flags S/FSRPAUEW bad idea!!

这个理论是, 仅在TCP会话开始时产生状态, 并且这个会话应该以一个SYN标志开始, 而非其它。 可问题是一 些站点开始使用ECN标志, 而且任何使用ECN的站点如果想与你建立连接都会被这条规则拒绝。一个好得多 的建议是不指定任何标志, 并且让PF对你的规则应用默认标志。如果你真需要自己指定标志, 那么这种组合是 安全的:

. . . flags S/SAFR

这是经过实践检验的和安全的, 如果通讯已经进行了净化, 它也没必须检查FIN和RST。净化会导致PF丢弃所 有包含非法TCP标志组合(如:SYN 和 RST)的进站数据包, 并且规格化潜在的不明确组合(像:SYN 和 FIN)。

TCP SYN代理

通常, 当客户端初始化一个到服务器的TCP连接时, PF会放行两个终点间的握手数据包, 然而PF有能力代理握 手过程, PF会先完成与客户端握手在发起一个与服务器的握手, 然后放行两端的数据包。这种做法的好处是在 客户端完成握手过程前没有数据包发送给服务器, 它避免了欺骗式的TCP SYN floods对服务器造成的威胁, 因 为伪造的客户端不能完成握手。

启用TCP SYN 代理是通过在过滤规则中使用 synproxy state 关键字完成的, 例如:

pass in on $ext_if proto tcp from any to $web_server port www \

flags S/SA synproxy state

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 9/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

这条规则指示PF代理到web服务器的TCP连接。

因为synproxy state的工作方式包含了与keep state 和 modulate state同样的功能。

如果PF工作在 bridge(4) 模式时, SYN代理无法工作。

阻塞欺骗数据包

地址“欺骗”是恶意用户伪造源IP地址传送数据包, 这是为了隐藏他们真实的IP地址或冒充网络上的另一个节 点。一旦用户被欺骗, 他们可以在不暴露自己真实的IP地址的情况下发起网络攻击或者获得只有授权的IP地址 可以访问的服务。

PF通过 antispoof 关键字提供一些保护以抵御地址欺骗:

antispoof [log] [quick] for interface [af] log 指定使用 pflogd(8) 记录匹配的数据包。 quick 如果一个数据包匹配了这条规则, PF会参照“胜者”规则并停止评估后面的规则集。 interface 这个网络接口将激活欺骗保护。也可以是一个接口的列表。 af 激活欺骗保护的地址, 可以是inet表示IPv4 或者inet6表示IPv6。

例子:

antispoof for fxp0 inet

当一个规则集被加载后, 任何出现的 antispoof 关键字被扩展成两条过滤规则。假设网络接口fxp0有一个IP地 址 10.0.0.1和子网掩码255.255.255.0(例如是一个 /24), 上面的过滤规则将扩展成:

block in on ! fxp0 inet from 10.0.0.0/24 to any block in inet from 10.0.0.1 to any

这些规则完成两件事:

● 拒绝所有来自10.0.0.0/24网络的通讯, 这将阻止通过fxp0进入的数据包, 因为10.0.0.0/24网络在fxp0接口上, 所以来自那个网段的数据包被阻止, 不应该在任何其它接口上看到。 ● 阻止来自10.0.0.1的所有进站通讯, 也就是fxp0上的IP地址。主机绝不会使用外部接口给自己发送数据 包, 所以任何带有属于这台主机的源地址的数据包全会被当成恶意的。

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 10/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

注意: antispoof 规则扩展的过滤规则也会阻止通过loopback接口发送给本地的数据包。最佳方法是跳过 loopback接口过滤, 但应用antispoof规则时这就成了一种必要:

set skip on lo0

antispoof for fxp0 inet

使用antispoof应该仅限于被分配了IP地址的接口, 如果在没有IP地址的接口上应用antispoof, 规则集会变成像这 样:

block drop in on ! fxp0 inet all block drop in inet all

这些规则存在阻止所有接口上的所有进站通讯的风险。

单播反向路径转发

从OpenBSD 4.0开始, PF提供了一个单播反向路径转发(uRPF)功能。当一个数据包通过uRPF检查时, 这个数据 包的源IP地址被从路由表中查出。如果在路由表项目里找到的出站接口就是该数据包进站使用的接口, 那么 该数据包就通过了URPF检查, 如果接口不相同, 就说明该数据包可能使用了伪造的IP地址。

可以在规则里使用 urpf-failed 关键字对数据包进行uRPF检查:

block in quick from urpf-failed label uRPF

注意uRPF检查仅在对称路由环境中才有意义。 uRPF 提供与 antispoof 规则相同的功能。

被动的操作系统指纹识别

被动OS指纹识别(OSFP)是一种被动地探测远程主机操作系统的一种方法, 它基于那台主机的TCP SYN数据包 的某些特征。这些信息可以在过滤规则里做为标准。

PF通过比较TCP SYN数据包和指纹文件来判断远程主机的操作系统类型, 默认的指纹文件是 /etc/pf.os 。 一旦 PF被启用, 当前的指纹列表可以通过下列命令查看:

# pfctl -s osfp

在一个过滤规则里, 可以通过OS类型、版本、子类型、补丁级别指定一个指纹。所有这些项目可以用上面的

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 11/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

命令列出, 过滤规则里可以使用 os 关键字指定一个指纹:

pass in on $ext_if from any os OpenBSD keep state block in on $ext_if from any os "Windows 2000" block in on $ext_if from any os "Linux 2.4 ts" block in on $ext_if from any os unknown

特殊的操作系统类型 unknown 匹配系统未知操作系统。

注意 以下几条:

● 操作系统指纹识别偶尔会出错, 原因是对方使用伪造的或经过技术处理的数据包, 这些数据包让他们的 本来的操作系统看起来像是另一个。 ● 对操作系统的某些修改和patchlevels可能改变堆栈行为并导致它不匹配本属于它的指纹文件或匹配其它 指纹。 ● OSFP仅对TCP SYN数据包进行分析;它不能分析其它的协议或已经建立的连接。

IP选项

默认情况下, PF阻止带有IP选项集的数据包, 这可能使像nmap这样的"操作系统指纹识别程序"更难工作。如果 你有一个程序需要放行诸如组播或IGMP这样的数据包, 你可以用 allow-opts 说明:

pass in quick on fxp0 all allow-opts

过滤规则集实例

下面是一个规则集的例子。这台计算机作为一个小型内部网络和Internet之间的一个防火墙。只有下面这些过 滤规则;这个例子里不包含 queueing, nat, rdr 等规则。

ext_if = "fxp0" int_if = "dc0" lan_net = "192.168.0.0/24"

# table containing all IP addresses assigned to the firewall table const { self }

# don't filter on the loopback interface set skip on lo0

# scrub incoming packets scrub in all

# setup a default deny policy block all

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 12/13 页)2009-5-3 23:04:48 PF:The OpenBSD Packet Filter中文非官方版 Packet Filtering

# activate spoofing protection for all interfaces block in quick from urpf-failed

# only allow ssh connections from the local network if it's from the # trusted computer, 192.168.0.15. use "block return" so that a TCP RST is # sent to close blocked connections right away. use "quick" so that this # rule is not overridden by the "pass" rules below. block return in quick on $int_if proto tcp from ! 192.168.0.15 \ to $int_if port ssh

# pass all traffic to and from the local network. # these rules will create state entries due to the default # "keep state" option which will automatically be applied. pass in on $int_if from $lan_net to any pass out on $int_if from any to $lan_net

# pass tcp, udp, and icmp out on the external (Internet) interface. # tcp connections will be modulated, udp/icmp will be tracked # statefully. pass out on $ext_if proto { tcp udp icmp } all modulate state

# allow ssh connections in on the external interface as long as they're # NOT destined for the firewall (i.e., they're destined for a machine on # the local network). log the initial packet so that we can later tell # who is trying to connect. use the tcp syn proxy to proxy the connection. # the default flags "S/SA" will automatically be applied to the rule by # PF. pass in log on $ext_if proto tcp from any to ! \ port ssh synproxy state

[上一小节: 表格] [总目录] [小下一节: 网络地址转换]

[email protected] $OpenBSD: filter.html, v 1.50 2009/01/25 18:09:49 jasper Exp $

http://www.9971.us/OpenBSD4.5/c/pf/filter.html(第 13/13 页)2009-5-3 23:04:48 The OpenBSD Packet Filter中文非官方版 表格

[上一小节: 列表和宏] [总目录] [下一小节: 包过滤]

PF: 表格

目录

● 介绍

● 配置

● 用pfctl调控

● 指定地址

● 地址匹配

介绍

一个表格被用来指定一组 IPv4 和/或 IPv6 地址。查询一个表格比查询几个列表快很多并且消耗更 少的内存及处理器时间。基于这个原因, 表格是保存大量地址的理想方案, 当你查询一个包含50, 000个地址的表格时仅比查询包含50个地址的表格稍微多用一点时间。表格可以用于下列途径:

● 过滤, 净化, NAT, 和 重定向 规则中的源和/或目的地址。

● NAT 规则中的转换地址。

● 重定向 规则中的重定向地址。

● 过滤规则route-to, reply-to, 和dup-to 选项的目的地址。

表格可以在 pf.conf 中或通过使用 pfctl(8) 创建。

配置

在pf.conf中, 使用table指令创建表格。 每个表格全可以指定为下面的这些属性:

● const - 如果没有指定这个属性, 可在任何时候用 pfctl(8) 增加或删除表格内的地址, 甚至可以 在 securelevel(7) 为2或更高的系统上操作; 如果设定了这各属性, 则一旦创建了表格, 则表格

http://www.9971.us/OpenBSD4.5/c/pf/tables.html(第 1/4 页)2009-5-3 23:04:51 The OpenBSD Packet Filter中文非官方版 表格 内容不能改变。 ● persist - 如果没有设定这个属性, 当执行最后一个引用它的规则后, 内核会在内存中删除这个 表格 ; 如果设定了这个属性, 即使没有规则引用这个表格, 内核仍会把它保存在内存中。

例子:

table { 192.0.2.0/24 } table const { 192.168.0.0/16, 172.16.0.0/12, \ 10.0.0.0/8 } table persist

block in on fxp0 from { , } to any pass in on fxp0 from to any

地址可以使用否定(或 "not") 修饰符来指定, 例如:

table { 192.0.2.0/24, !192.0.2.5 } goodguys表格将包含所有 192.0.2.0/24 网络内的地址, 除了192.0.2.5。

注意, 表格名总是在< > 符号内。

表格也可以放置在一个包含了一系列IP地址和网络地址的文本文件中:

table persist file "/etc/spammers"

block in on fxp0 from to any

这个 /etc/spammers 文件包含了一系列将被阻止的IP地址和/或 CIDR 网络地址, 一个地址用一行。 所有以 # 开头的行会被认为是注释并忽略。

用pfctl调控

表格可以在运行中使用 pfctl(8) 进行操控。例如, 为上面创建的 表格增加一些项目:

# pfctl -t spammers -T add 218.70.0.0/16

http://www.9971.us/OpenBSD4.5/c/pf/tables.html(第 2/4 页)2009-5-3 23:04:51 The OpenBSD Packet Filter中文非官方版 表格 如果这个 表格不存在, 上面的命令也会创建它。要列出一个表格内的地址:

# pfctl -t spammers -T show

-v 变量可以与 -Tshow 一同使用, 它用来显示每个表格项目的统计。从表格中删除一个地址:

# pfctl -t spammers -T delete 218.70.0.0/16

使用pfctl调控表格的更多信息请参阅 pfctl(8) 用户手册。

指定地址

除了用IP地址进行指定外, 主机也可以通过它们的主机名来进行指定。当主机名被解析成一个IP地 址后, 所有的IPv4 和 IPv6地址全被置入这个表格内。也可以通过一个有效的接口名或self关键字将 IP地址加入到一个表格中, 那么这个表格就会 分别包含那个接口或机器(包含loopback地址在内)的 所有IP地址。

一个限制是当你在表格中指定 0.0.0.0/0 和 0/0 这样的地址时是无法工作的, 你可以直接写出这个地 址或者使用一个宏。

地址匹配

在一个表格中检查一个地址时将会返回一个最贴近的匹配项。它允许产生像这样的表格:

table { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }

block in on dc0 all pass in on dc0 from to any

只有来自与表格相匹配的那些地址的数据包才可以通过 dc0 进入:

● 172.16.50.5 - 最贴近的匹配项是 172.16.0.0/16; 数据包与表格相匹配, 允许通过 ● 172.16.1.25 - 最贴近的匹配项是 !172.16.1.0/24; 数据包与表格中的一个项目相匹配, 但是这是 一个否定项(使用"!"修饰符); 所以数据包与表格不匹配, 被阻止 ● 172.16.1.100 - 完全匹配 172.16.1.100这一项; 数据包与表格相匹配, 允许通过 ● 10.1.4.55 - 与表格不匹配, 被阻止。

http://www.9971.us/OpenBSD4.5/c/pf/tables.html(第 3/4 页)2009-5-3 23:04:51 The OpenBSD Packet Filter中文非官方版 表格 [上一小节: 列表和宏] [总目录] [下一小节: 包过滤]

[email protected] $OpenBSD: tables.html, v 1.24 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/tables.html(第 4/4 页)2009-5-3 23:04:51 The OpenBSD Packet Filter中文非官方版 列表和宏

[上一小节: 开始] [总目录] [下一小节: 表格]

PF: 列表和宏

目录

● 列表

● 宏

列表

列表允许在一个规则里描述多个同类项。例如, 多个协议、端口号、地址等, 这样就不必为每个需 要阻止的IP地址单独写一条过滤规则, 你可以为列表中的所有的IP地址写一条规则。列表定义是将 所有同类项写入{ }中。

当 pfctl(8) 载入规则集内的列表时, 它会为列表中的同类项产生多条规则, 每条规则对应列表中的一 个同类项。例如:

block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any

会展开为:

block out on fxp0 from 192.168.0.1 to any block out on fxp0 from 10.5.32.6 to any

一条规则里可以指定多种列表, 并且这些列表并非仅限于过滤规则:

rdr on fxp0 proto tcp from any to any port { 22 80 } -> \

192.168.0.6

http://www.9971.us/OpenBSD4.5/c/pf/macros.html(第 1/3 页)2009-5-3 23:04:53 The OpenBSD Packet Filter中文非官方版 列表和宏

block out on fxp0 proto { tcp udp } from { 192.168.0.1, \ 10.5.32.6 } to any port { ssh telnet }

注意列表中同类项之间的逗号是可选项。(译者注:也可以用空格)

列表也可以嵌套:

trusted = "{ 192.168.1.2 192.168.5.36 }" pass in inet proto tcp from { 10.10.0.0/24 $trusted } to port 22

当心像下面这样的语法结构, 我们姑且称之为 "否定列表", 这是一个常见的错误:

pass in on fxp0 from { 10.0.0.0/8, !10.1.2.3 }

尽管通常使用这个列表的本意可能是指"除了10.1.2.3, 允许从外部到10.0.0.0/8范围内的任何地址的 通讯", 但是这条规则会展开为:

pass in on fxp0 from 10.0.0.0/8 pass in on fxp0 from !10.1.2.3

结果就是允许外部到内部任何地址的通讯。这里应该用一个 table 代替它来进行描述。

宏是用户定义的变量, 它可以包含IP地址、端口号和接口名称等。 宏可以降低PF规则集的复杂程 度并且使规则集更易维护。

宏的名称必须以字母开头, 名称里面可以包含字母、数字和下划线。 宏的名称不能使用保留字符, 诸如 pass, out, queue等。

ext_if = "fxp0"

block in on $ext_if from any to any

这里定义了一个名为 ext_if 的宏, 当一个宏被定义后, 引用时要在其名称前面加上$字符。

http://www.9971.us/OpenBSD4.5/c/pf/macros.html(第 2/3 页)2009-5-3 23:04:53 The OpenBSD Packet Filter中文非官方版 列表和宏

宏也可以展开为列表, 比如:

friends = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"

宏可以被递归定义。 因此宏不能在引号内展开, 必须使用下面的语法:

host1 = "192.168.1.1" host2 = "192.168.1.2" all_hosts = "{" $host1 $host2 "}"

宏 $all_hosts 现在展开成 192.168.1.1, 192.168.1.2 。

[上一小节: 开始] [总目录] [下一小节: 表格]

[email protected] $OpenBSD: macros.html, v 1.23 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/macros.html(第 3/3 页)2009-5-3 23:04:53 PF: Getting Started

[总目录] [下一节: 列表和宏]

PF: 开始

目录

● 激活

● 配置

● 控制

激活

如果你想激活PF并让它在启动时读取自己的配置文件, 就需要把下面这行

pf=YES

添加到文件 /etc/rc.conf.local 中。

重新启动系统以便使其生效。

你也可以通过 pfctl(8) 程序激活或停止PF。

# pfctl -e # pfctl -d

上面给出的两条命令分别是启用和禁用PF。注意这里只是启用和禁用, 实际PF并不会自动加载规 则集。无论是PF启动前或启动后, 规则集必须单独加载。

配置

http://www.9971.us/OpenBSD4.5/c/pf/config.html(第 1/3 页)2009-5-3 23:04:55 PF: Getting Started PF启动时默认读取的配置文件是 /etc/pf.conf , 因为这是由rc 脚本载入的, 注意尽管 /etc/pf.conf 作为 默认设定并被系统的rc脚本载入, 但它只是一个纯文本格式文件, 被 pfctl(8) 载入并解释, 然后再插 入 pf(4)中。对某些应用程序来说, 可以在启动后载入其它的规则集, 同所有设计优异的Unix应用程 序一样, PF也提供了极好的灵活性。 pf.conf 文件有七种语法结构部件:

● Macros: 宏—— 用户定义的储存IP地址、接口名称等的变量。

● Tables: 表格—— 一种可储存一组'IP地址列表'的结构。

● Options: 选项—— 各种各样的选项用来控制PF运行。

● Scrub: 净化—— 重新来自网络的处理数据包, 使它们正常化并对其进行碎片整理。

● Queueing: 排队—— 提供带宽控制和数据包优先策略。

● Translation: 转换—— 控制网络地址转换和 数据包重定向。

● Filter Rules: 过滤规则—— 允许对通过任何网络接口的数据包进行过滤或阻止。

尽管对某一特定应用程序来说并非需要所有的部件, 但是除了宏和表格, 每个部件应该按上面的顺 序出现在配置文件中。

空行会被忽略, 以 # 开头的行会被认为是注释。

控制

启动后, 可以通过 pfctl(8) 程序管理 PF 的运行。下面是一些命令范例:

# pfctl -f /etc/pf.conf 载入 pf.conf 文件 # pfctl -nf /etc/pf.conf 从语法上分析 pf.conf 文件, 但不载入 # pfctl -Nf /etc/pf.conf 仅载入 pf.conf 文件中的 NAT 规则 # pfctl -Rf /etc/pf.conf 仅载入 pf.conf 文件中的过滤规则

# pfctl -sn 显示当前的 NAT 规则 # pfctl -sr 显示当前的过滤规则 # pfctl -ss 显示当前的状态表 # pfctl -si 先是过滤状态和计数 # pfctl -sa 显示所有可显示信息

完整的命令列表请参阅 pfctl(8) 用户手册。

http://www.9971.us/OpenBSD4.5/c/pf/config.html(第 2/3 页)2009-5-3 23:04:55 PF: Getting Started

[总目录] [下一节: 列表和宏]

[email protected] $OpenBSD: config.html, v 1.25 2008/10/31 16:49:34 nick Exp $

http://www.9971.us/OpenBSD4.5/c/pf/config.html(第 3/3 页)2009-5-3 23:04:55