diff --git a/zh_CN.GB2312/books/handbook/desktop/chapter.sgml b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml index 05f95fb83c..dc76bb10bb 100644 --- a/zh_CN.GB2312/books/handbook/desktop/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/desktop/chapter.sgml @@ -1,1021 +1,1013 @@ Christophe Juniet Contributed by 桌面应用 概述 FreeBSD 可以运行种类繁多的桌面应用程序, 这包括像浏览器和字处理这样的软件。 绝大多数这样的程序都可以通过 package 来安装, 或者从 Ports Collection 自动地构建。 许多新用户希望能够在它们的系统中找到这样的应用程序。 这一章将向您展示如何轻松地使用 package 或者 Ports Collection 中安装这样的软件。 需要注意的是从 ports 安装意味着要编译源码。 根据编译的 ports 和电脑速度的不同, 这可能需要花费相当长的时间。 若是您觉得编译源码太过耗时的话, 绝大多数 ports 也有预编译的版本可供安装。 因为 FreeBSD 提供的二进制兼容 Linux 的特性, 许多原本为 Linux 开发的程序都可以直接用在您的桌面。 在安装任何的 Linux 应用程序之前, 强烈的推荐您阅读 。 当您在寻找特定的 ports 时, 可以使用 &man.whereis.1;。 一般来说, 许多利用 Linux 二进制兼容特性的 ports 都以linux-开头。 在下面的介绍中,都假设安装 Linux 应用程序前已经开启了 Linux 二进制兼容功能。 本章涵盖以下种类应用程序: 浏览器 (例如 MozillaOperaFirefoxKonqueror) 办公、图象处理 (例如 KOfficeAbiWordGIMPOpenOffice.org) 文档查看 (例如 &acrobat.reader;gvXpdfGQview) 财务 (例如 GnuCashGnumericAbacus) 阅读这章之前,您应该: 知道如何安装额外的第三方软件()。 知道如何安装 Linux 软件()。 想要获得更多的有关多媒体环境的信息,请阅读 。如果您想要建立和使用电子邮件, 请参考 浏览器 浏览器 web FreeBSD并没有预先安装特定的浏览器。然而,在 ports 的目录 www 有许多浏览器可以安装。如果您没有时间一一编译它们 (有些时候这可能需要花费相当长的时间) 大部分都有 package 可用。 KDEGNOME 已经提供 HTML 浏览器。 请参考得到更多完整的有关设定这些桌面环境的信息。 如果您要找小型的浏览器, 可以试试看 www/dillowww/linkswww/w3m 这一节涉及如下程序: 程序名称 资源需求 安装时间 主要依赖 Mozilla 大量时间和空间 Gtk+ Opera 轻松 同时有可用的 FreeBSD 和 Linux 版本。 Linux 版本需要使用 Linux 二进制兼容模块和 linux-openmotif Firefox 中等 Gtk+ Konqueror 中等 需要 KDE Mozilla Mozilla Mozilla 是一个完全移植到 FreeBSD 上的现代化的、 稳定的浏览器。 它拥有非常合乎标准的 HTML 支持, 它也能处理邮件和阅读新闻组。 假如您打算做一个自己的主页的话,它甚至提供一个 HTML 编辑器。 &netscape; 的使用者可能觉得它和 Communicator 非常相似, 两者有些部分实际上是相通的。 在 CPU 速度低于 233MHz 或者内存少于 64MB 的老式电脑上,Mozilla 会占用相当多资源而难以使用。您也许可以试试 Opera 浏览器,本章稍后将会介绍它。 也许基于某种原因,您不能或者不想编译 Mozilla,FreeBSD GNOME 团队已经为您制作好了 package。只需要通过网络安装它: &prompt.root; pkg_add -r mozilla 如果没 package 可用,而您又有足够的时间和磁盘空间,您可以获取 Mozilla 的源码来编译并安装它到您的系统上。 执行以下指令既可: &prompt.root; cd /usr/ports/www/mozilla &prompt.root; make install clean Mozilla 需要 root 权限执行 chrom 注册来确定正确的初始化。另外, 如果您想要一些额外的插件比如象 mouse gestures,您也必须以 root 权限执行 Mozilla 以便正确的安装。 一旦您完成了 Mozilla 安装,您就再也不需要 root 权限了。您可以用如下方式执行 Mozilla &prompt.user; mozilla 也可以用如下方式直接运行电子邮件和新闻阅读器: &prompt.user; mozilla -mail Firefox Firefox Firefox 是基于 Mozilla 代码系的下一代浏览器。 Mozilla 是一个完整的应用程序套件, 包含了浏览器、 邮件客户端、 聊天客户端等等。 而 Firefox 则只是一个浏览器, 这使得它体积更小并且执行速度更快。 您可以通过输入下面的命令来安装预编译的包: &prompt.root; pkg_add -r firefox 如果您喜欢从源代码编译, 则可以使用 Ports 套件来完成这项工作: &prompt.root; cd /usr/ports/www/firefox &prompt.root; make install clean Firefox、 Mozilla 与 &java; 插件 在这一节和下一节中, 我们均假定您已经安装了 FirefoxMozilla &os; 基金会拥有来自 Sun Microsystems 的关于发布针对 &os; 的预编译版本的 Java 运行环境 (&jre;) 和 Java 开发包 (&jdk;) 的授权。 用于 &os; 的预编译版本可以在 &os; 基金会 网站上找到。 要为 FirefoxMozilla 添加 &java; 支持, 您必须首先安装 java/javavmwrapper port。 接下来, 从 下载 Diablo &jre; 软件包, 并使用 &man.pkg.add.1; 来安装它。 启动浏览器, 并在地址栏中输入 about:plugins 然后按 Enter。 浏览器将给出一个页面, 其中会显示已经安装的插件, 您应在这个列表中找到 &java; 插件。 如果不是这样的话, 则需要以 root 身份执行下列命令: &prompt.root; ln -s /usr/local/diablo-jre1.5.0/plugin/i386/ns7/libjavaplugin_oji.so \ /usr/local/lib/browser_plugins/ 然后重新启动浏览器。 Firefox、 Mozilla 与 ¯omedia; &flash; 插件 ¯omedia; &flash; 插件并没有直接提供其 &os; 版本。 不过, 我们有一个软件层 (wrapper) 可以用来运行 Linux 版本的插件。 这个 wrapper 也支持 &adobe; &acrobat;、 RealPlayer 和很多其他插件。 应安装 www/linuxpluginwrapper port, 这个 port 需要依赖一个很大的 port, emulators/linux_base。 请按照 port 在安装过程中所给出的提示对您的 /etc/libmap.conf 进行正确的配置! 示范的配置可以在 /usr/local/share/examples/linuxpluginwrapper/ 目录找到。 下一步是安装 www/linux-flashplugin7 port。 一旦装好了这个插件, 就可以打开浏览器, 并在地址栏中输入 about:plugins 然后按下 Enter。 这将显示目前可用的插件列表。 如果您没有在这个列表中看到 &flash; 插件, 则多数情况下这是由于缺少一个符号链接导致的。 您需要以 root, 身份执行下面的命令: &prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/libflashplayer.so \ /usr/local/lib/browser_plugins/ &prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/flashplayer.xpt \ /usr/local/lib/browser_plugins/ 重新启动浏览器之后, 插件就应该会在前面提到的那个列表中有所体现了。 linuxpluginwrapper 只能在 &i386; 架构上运行。 Opera Opera Opera 是一个功能齐全, 并符合标准的浏览器。 它还提供了内建的邮件和新闻阅读器、 IRC 客户端, RSS/Atom feed 阅读器以及更多功能。 除此之外, Opera 是一个比较轻量的浏览器, 其速度很快。 它提供了两种不同的版本: native FreeBSD 版本, 以及通过 Linux 模拟运行的版本。 要使用 Opera 的 FreeBSD 版本来浏览网页,安装以下的 package: &prompt.root; pkg_add -r opera 有些 FTP 站点没有所有版本的 package, 您也可以通过 Ports Collection 来安装: &prompt.root; cd /usr/ports/www/opera &prompt.root; make install clean 要安装 Linux 版本的 Opera,将上面例子中的 opera 替换为 linux-opera。Linux 版本在某些情况下非常有用,象是使用只有 Linux 版本的插件,例如 Adobe &acrobat.reader;。不然的话在其它方面, FreeBSD 和 Linux 版本是完全一样的。 Konqueror Konqueror KonquerorKDE 的一部分,不过也可以通过安装 x11/kdebase3 在非 KDE 环境下使用。 Konqueror 不止是一个浏览器, 也是一个文件管理器和多媒体播放器。 Konqueror 也带有丰富的插件, 可以在 misc/konq-plugins 下面找到。 Konqueror 也支持 &flash;, 可以在 找到一个 How To。 办公、图象处理 当需要进行办公或者进行图象处理时, 新用户通常都会找一些好用的办公套件或者字处理软件。目前有一些桌面环境比如象 KDE 已经提供了办公套件。 FreeBSD 提供所有的要求,桌面环境也不例外。 这节涉及如下程序: 软件名称 资源需求 安装时间 主要依赖 KOffice KDE AbiWord Gtk+GNOME The Gimp Gtk+ OpenOffice.org &jdk; 1.4Mozilla KOffice KOffice 办公套件 KOffice KDE 社区提供了一套办公套件, 它能用在桌面环境。它包含四个标准的组件,这些组件可以在其它办公套件中找到。 KWord 是字处理程序、 KSpread 是电子表格程序、 KPresenter 是演示文档制作管理程序、 Kontour是矢量绘图软件。 安装最新的 KOffice 之前,先确定您是否安装了最新版的 KDE 使用 package 来安装 KOffice,安装细节如下: &prompt.root; pkg_add -r koffice 如果没有可用的 package,您可以使用 Ports Collection 安装。 安装 KDE3KOffice 版本,如下: &prompt.root; cd /usr/ports/editors/koffice-kde3 &prompt.root; make install clean AbiWord AbiWord AbiWord 是一个免费的字处理程序,它看起来和 µsoft; Word 的感觉很相似。 它适合用来打印文件、信函、报告、备忘录等等, 它非常快且包含许多特性,并且非常容易使用。 AbiWord 可以导入或输出很多文件格式, 包括一些象 Microsoft.doc 格式的文件。 AbiWord 也有 package 的安装方式。您可以用以下方法安装: &prompt.root; pkg_add -r abiword 如果没有可用的 package,它也可以从 Ports Collection 编译。ports collection 应该是最新的。它的安装方式如下: &prompt.root; cd /usr/ports/editors/abiword &prompt.root; make install clean GIMP GIMP 对图象的编辑或者加工, GIMP 是一个非常精通图象处理的软件。 它可以被用来当作简单的绘图程序或者一个专业的照片处理套件。 它支持大量的插件和具有脚本界面的特性。 GIMP 可以读写众多的文件格式, 支持扫描仪和手写板。 您可以用下列命令安装: &prompt.root; pkg_add -r gimp 如果您在 FTP 站点没有找到这个 package,您也可以使用 Ports Collection 的方法安装。ports 的 graphics 目录也包含有 Gimp 手册。 以下是安装它们的方法: &prompt.root; cd /usr/ports/graphics/gimp &prompt.root; make install clean &prompt.root; cd /usr/ports/graphics/gimp-manual-pdf &prompt.root; make install clean Ports 中的 graphics 目录也有开发中的 GIMP 版本 graphics/gimp-devel。 HTML 版本的 Gimp 手册 可以在 graphics/gimp-manual-html 找到。 OpenOffice.org OpenOffice.org 办公套件 OpenOffice.org OpenOffice.org 包括一套完整的办公套件: 一个字处理程序、一个电子表格程序、一个演示文档管理程序和一个绘图程序。 它和其它的办公套件的特征非常相似,它可以导入输出不同的流行的文件格式。 它包括一些不同的语言界面、拼写检查和字典。 OpenOffice.org 的字处理程序使用 XML 文件格式使它增加了可移植性和灵活性。电子表格程序支持宏语言和使用外来的数据库界面。 OpenOffice.org 已经可以平稳的运行在 &windows;、&solaris;、Linux、FreeBSD 和 &macos; X 等各种操作系统下。更多的有关 OpenOffice.org 的信息您可以在 OpenOffice.org 网页找到。 对于特定的 FreeBSD 版本的信息,您可以在直接在 FreeBSD OpenOffice 移植团队的页面下载。 安装 OpenOffice.org 方法如下: &prompt.root; pkg_add -r openoffice.org 如果您正在使用 &os; 的 -RELEASE 版本, 一般来说这样做是没问题的。 如果不是这样, 您就可能需要看一看 &os; OpenOffice.org 移植小组的网站, 并使用 &man.pkg.add.1; 从那里下载并安装合适的软件包。 最新的发布版本和开发版本都可以在那里找到。 装好 package 之后, 您只需输入下面的命令就能运行 OpenOffice.org 了: &prompt.user; openoffice.org 在第一次运行时, 将询问您一些问题, 并在您的主目录中建立一个 .openoffice.org2 目录。 如果没有可用的 OpenOffice.org package,您仍旧可以选择编译 port。然而, 您必须记住它的要求以及大量的磁盘空间和相当长的时间编译。 &prompt.root; cd /usr/ports/editors/openoffice.org-2 &prompt.root; make install clean 如果希望联编一套进行过本地化的版本, 将前述命令行改为: &prompt.root; make LOCALIZED_LANG=your_language install clean 您需要将 your_language 改为正确的 ISO-代码。 所支持的语言代码可以在 files/Makefile.localized 文件中找到, 这个文件位于 port 的目录。 一旦完成上述操作, 就可以通过下面的命令来运行 OpenOffice.org 了: &prompt.user; openoffice.org 文档查看器 一些新的文档格式近来得到流行。它们所需要的标准查看器可能不一定在系统内。 在本节我们将了解如何安装它们。 这节涵盖如下应用程序: 软件名称 资源需求 安装时间 主要依赖 &acrobat.reader; Linux二进制兼容 gv Xaw3d Xpdf FreeType GQview Gtk+GNOME &acrobat.reader; Acrobat Reader PDF 查看器 现在许多文档都用 PDF 格式, 根据轻便小巧文档格式的定义。一个被建议使用的查看器是 &acrobat.reader;,由 Adobe 所发行的 Linux 版本。因为 FreeBSD 能够运行 Linux 二进制文件, 所以它也可以用在 FreeBSD 中。 要从 Ports collection 安装 &acrobat.reader; 7, 只需: &prompt.root; cd /usr/ports/print/acroread7 &prompt.root; make install clean 由于授权的限制, 我们不提供预编译的版本。 gv gv PDF 查看器 PostScript 查看器 gv 是 &postscript; 和 PDF 文件格式查看器。它源自 ghostview 因为使用 Xaw3d 函数库让它看起来更美观。 它很快而且界面很干净。gv 有很多特性比如象纸张大小、刻度或者抗锯齿。 大部分操作都可以用键盘或鼠标完成。 安装 gv package,如下: &prompt.root; pkg_add -r gv 如果您无法获取预编译的包, 则可以使用 Ports collection: &prompt.root; cd /usr/ports/print/gv &prompt.root; make install clean Xpdf Xpdf PDF 查看器 如果您想要一个小型的 FreeBSD PDF 查看器, Xpdf 是一个小巧并且高效的查看器。 它只需要很少的资源而且非常稳定。它使用标准的 X 字体并且不需要 &motif; 或者其它的 X 工具包。 安装 Xpdf package,使用如下命令: &prompt.root; pkg_add -r xpdf 如果 package 不可用或者您宁愿使用 Ports Collection,如下: &prompt.root; cd /usr/ports/graphics/xpdf &prompt.root; make install clean 一旦安装完成,您就可以启动 Xpdf 并且使用鼠标右键来使用菜单。 GQview GQview GQview 是一个图片管理器。 您可以单击鼠标来观看一个文件、开启一个外部编辑器、 使用预览和更多的功能。它也有幻灯片播放模式和一些基本的文件操作。 您可以管理采集的图片并且很容易找到重复的。 GQview 可以全屏幕观看并且支持国际化。 如果您想要安装 GQview package,如下: &prompt.root; pkg_add -r gqview 如果您没有可用的 package 或者您宁愿使用 Ports Collection,如下: &prompt.root; cd /usr/ports/graphics/gqview &prompt.root; make install clean 财务 假如,基于任何的理由,您想要在 FreeBSD Desktop 管理您个人的财政,有一些强大并且易于使用的软件可以被您选择安装。 它们中的一些与流行的文件格式兼容象 QuickenExcel 文件。 本节涵盖如下软件: 软件名称 资源需求 安装时间 主要依赖 GnuCash GNOME Gnumeric GNOME Abacus Tcl/Tk GnuCash GnuCash GnuCashGNOME 的一部分,GNOME 致力于为最终用户提供用户友好且功能强大的软件。使用 GnuCash,您可以关注您的收入和开支、您的银行帐户, 或者您的股票。它的界面特性看起来非常的专业。 GnuCash 提供一个智能化的注册、帐户分级系统、 很多键盘快捷方式和自动完成方式。它能分开一个单个的处理到几个详细的部分。 GnuCash 能导入和合并 Quicken QIF 文件格式。 它也支持大部分的国际日期和流行的格式。 安装 GnuCash 到您的系统,如下: &prompt.root; pkg_add -r gnucash 如果 package 不可用,您可以使用 Ports Collection 安装: &prompt.root; cd /usr/ports/finance/gnucash &prompt.root; make install clean Gnumeric Gnumeric 电子表格 Gnumeric Gnumeric 是一个电子表格程序, GNOME 桌面环境的一部分。 它以通过元素格式和许多片断的自动填充系统来方便的自动猜测用户输入而著称。 它能导入一些流行的文件格式,比如象 ExcelLotus 1-2-3Quattro ProGnumeric 凭借 math/guppi 支持图表。 它有大量的嵌入函数和允许所有通常比如象、数字、货币、日期、 时间等等的一些单元格式。 安装 Gnumeric package,如下: &prompt.root; pkg_add -r gnumeric 如果 package 不可用,您可以使用 Ports Collection 安装: &prompt.root; cd /usr/ports/math/gnumeric &prompt.root; make install clean Abacus Abacus spreadsheet Abacus Abacus 是一个小巧易用的电子表格程序。 它包含许多嵌入函数在一些领域如统计学、财务和数学方面很有帮助。 它能导入和输出 Excel 文件格式。 Abacus 可以产生 &postscript; 输出。 安装 Abacus package,如下: &prompt.root; pkg_add -r abacus 如果 package 不可用,您可以使用 Ports Collection 安装: &prompt.root; cd /usr/ports/deskutils/abacus &prompt.root; make install clean 总结 - 当 FreeBSD 因为它的效能和稳定而在 ISP 之间流行时, - 它也可以完全应用在桌面环境。拥有数以千计的 - packages 或者 - ports, - 您可以为您的需要建立完美的桌面环境。 - - 一旦您完成了您的桌面环境的安装,您可能想要进一步了解 - misc/instant-workstation。 - meta-port 允许您为一个工作站建立一个定制的 ports 设置。您可以编辑 - /usr/ports/misc/instant-workstation/Makefile 定制它。 - 接着是缺省添加和删除 ports 的语法,和使用通常的步骤建立它。 - 最后,您将能建立一个适合您自己桌面的大的 package - 并在您的其它的工作站上安装它! - - 下面是本章涉及到的所有的软件的快速回顾: + 尽管 FreeBSD 由于其高性能和可靠性而获得了许多 ISP 的信赖, + 但它也完全可以用于桌面环境。 拥有数以千计的 + packages 和 + ports + 能够帮您迅速建立完美的桌面环境。 + + 下面是本章涉及到的所有的软件的简要回顾: 软件名称 Package 名称 Ports 名称 Mozilla mozilla www/mozilla Opera opera www/opera Firefox firefox www/firefox KOffice koffice-kde3 editors/koffice-kde3 AbiWord abiword editors/abiword The GIMP gimp graphics/gimp OpenOffice.org openoffice editors/openoffice-1.1 &acrobat.reader; acroread print/acroread7 gv gv print/gv Xpdf xpdf graphics/xpdf GQview gqview graphics/gqview GnuCash gnucash finance/gnucash Gnumeric gnumeric math/gnumeric Abacus abacus deskutils/abacus diff --git a/zh_CN.GB2312/books/handbook/l10n/chapter.sgml b/zh_CN.GB2312/books/handbook/l10n/chapter.sgml index 78534b6427..edaf6069e5 100644 --- a/zh_CN.GB2312/books/handbook/l10n/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/l10n/chapter.sgml @@ -1,849 +1,849 @@ Andrey Chernov Contributed by Michael C. Wu Rewritten by 本地化-I18N/L10N使用和设置 概述 FreeBSD是一个由分布于全世界的用户和贡献者支持的项目。 这章将讨论FreeBSD的国际化和本地化的问题,允许非英语用户也能使用FreeBSD很好地工作。 在系统和应用水平上,主要是通过执行i18N标准来实现的,所以这里我们将为读者提供详细的介绍。 读完这一章,您将了解到: 不同的语言和地域是如何在现代操作系统上进行编码的。 如何为您的登入shell设置本地化。 如何配置您的控制台为非英语语言。 languages. 如何使用不同的语言来有效地使用X Windows。 在哪里可以找到更多有关开发符合i18N标准的应用程序的信息。 阅读这章之前,您应当了解: 怎样安装额外的第三方程序()。 基础知识 I18N/L10N 是什么? 国际化 本地化 本地化 开发人员把internationalization简写成I18N,中间的数字是前后两个字母间的字母个数。 L10N依据localization 使用同样的命名规则。 I18N/L10N方法、协议和应用结合在一起,允许用户使用他们自己所选择的语言。 I18N应用程序使用I18N工具来编程。它允许开发人员写一个简单的文件, 就可以将显示的菜单和文本翻译成本地语言。我们非常鼓励程序员遵循这种规则。 为什么要使用I18N/L10N? I18N/L10N标准能够很好地支持您查看、输入或处理非英语语言。 I18N支持哪些语言? I18N和L10N不是FreeBSD特有的。当前,它能支持世界上绝大部分主力语言, 包括但不限于:中文,德文,日文,朝鲜文,法文,俄文,越南文等等。 使用本地化语言 I18N不是FreeBSD特有的,它是一个规则。我们鼓励您帮助FreeBSD完善这一规则。 locale 本地化设置需要具备三个条件:语言代码 (Language Code)、 国家代码 (Country Code) 和编码(Encoding)。 本地名字可以用下面这些部分来构造: 语言代码_国家代码.编码 语言和国家代码 语言代码 国家代码 为了用特殊的语言来对FreeBSD系统进行本地化(或其他类&unix;系统), 用户必须要知道相应的国家和语言代码(国家代码告诉应用程序使用哪一种语言规范)。 此外,WEB浏览器,SMTP/POP服务器,web服务器等都是以这个为基础的。下面就是一个国家和语言代码的例子: 语言/国家代码 描述 en_US 美国英语 ru_RU 俄语 zh_CN 简体中文 编码 编码 ASCII 一些语言不使用 ASCII 编码,它们使用8-位, 宽或多字节的字符, 更多的信息请参考 &man.multibyte.3;。 比较老的应用程序可能会无法识别它们, 并误认为是控制字符。 比较新的应用程序通常会认出 8-位字符。 随实现的不同, 用户可能不得不将宽或多字节字符支持编入应用程序, 或进行一些额外的配置, 才能够正常使用它们。 要输入和处理宽或多字节字符, FreeBSD Ports Collection 已经为每种语言提供了不同的程序。 请参考各个 FreeBSD Port 中的 I18N 文档。 特别需要指出的是, 用户可能需要查看应用程序的文档, 以确定如何正确地配置它, 或需要为 configure/Makefile/编译器 指定什么样的参数。 记住下面这些: 特定语言的简单C字符集 (参见 &man.multibyte.3;),例如 ISO8859-1, ISO8859-15, KOI8-R, CP437。 宽字节或多字节编码,如EUC, Big5。 您可以在IANA Registry检查一下现行的字符集列表。 与此不同的是, &os; 使用与 X11-兼容的本地编码模式。 I18N应用程序 在FreeBSD Ports和Package系统里面,I18N应用程序已经使用I18N 来命名。然而它们不是总支持需要的语言。 本地化设置 通常只要在登入shell里面设置LANG为本地化, 一般通过设置用户的 ~/.login_conf 或用户shell的启动文件(~/.profile~/.bashrc, ~/.cshrc)。没有必要设置 LC_CTYPELC_CTIME。 更多的信息请参考特定语言的FreeBSD文档。 您应当在您的配置文件中设置下面两个变量: POSIX LANG 为&posix;设置本地化语言功能。 MIME MM_CHARSET应用程序的MIME字符集。 这包括用户的shell配置,特定的应用配置和X11配置。 设置本地化的方法 本地化 登入分类 有两种方法来设置本地化,接下来都会描述。 第一种 (推荐) 就是在 登入分类里面指定环境变量。 第二种方法是把环境变量加到shell的启动文件里面。 登入分类方法 这种方法允许把本地化名称和MIME字符集的环境变量赋给可能的shell, 而不是加到每个特定shell的启动文件里面。 用户级设置 Level Setup 允许普通用户自己完成这个设置,而管理员级设置需要超级用户权限。 用户级设置 这有一个设置用户根目录文件.login_conf的小例子, 它为上述两个变量设置了Latin-1编码。 me:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1: 繁体中文BIG-5编码 这是一个为.login_conf设置繁体中文的BIG-5编码的例子。应该设置下面的大部分变量, 因为很多软件都没有为中文,日文和韩文设置正确的本地化变量。 #Users who do not wish to use monetary units or time formats #of Taiwan can manually change each variable me:\ :lang=zh_TW.Big5:\ :lc_all=zh_TW.Big:\ :lc_collate=zh_TW.Big5:\ :lc_ctype=zh_TW.Big5:\ :lc_messages=zh_TW.Big5:\ :lc_monetary=zh_TW.Big5:\ :lc_numeric=zh_TW.Big5:\ :lc_time=zh_TW.Big5:\ :charset=big5:\ :xmodifiers="@im=xcin": #Setting the XIM Input Server 更多的信息参考管理员级设置和&man.login.conf.5; 管理员级设置 检查用户的登入分类在 /etc/login.conf里面是否设置了正确的语言。主要确定下面的几个设置: language_name:accounts_title:\ :charset=MIME_charset:\ :lang=locale_name:\ :tc=default: 再次使用前面的Latin-1编码的例子: german:German Users Accounts:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1:\ :tc=default: - 在修改用户的登入类型之前, 您应执行下面的命令 + 在修改用户的登入类型之前, 应首先执行下面的命令: &prompt.root; cap_mkdb /etc/login.conf 以便使在 /etc/login.conf 中新增的配置生效。 使用 &man.vipw.8; 改变登入类型。 vipw 使用vipw添加新用户,看起来像下面这样: user:password:1111:11:language:0:0:User Name:/home/user:/bin/sh 用&man.adduser.8;改变登入类型。 adduser 登入分类 adduser添加新用户看起来像下面这样: /etc/adduser.conf里面设置defaultclass = 语言。应该记住,您必须为使用其它语言的所有用户设置 缺省类别。 每一次使用&man.adduser.8;的时候,一个特定语言的可选择性回答会像下面这样给出: Enter login class: default []: 如果您打算给每一个用户使用另外一种语言,您应该这样: &prompt.root; adduser -class language 使用&man.pw.8;改变登入类型。 pw 如果您使用&man.pw.8;来添加新用户,应该这样使用: &prompt.root; pw useradd user_name -L language Shell启动文件方法 不推荐使用这种方法,因为它需要给每一个可能的shell程序一个不同的启动文件。 应该用登入分类方法来代替这种方法。 MIME locale 为了设置本地化名称和MIME字符集,只要在/etc/profile/etc/csh.login启动文件里面设置这两个变量。下面我们使用德语做例子: /etc/profile里面: LANG=de_DE.ISO8859-1; export LANG MM_CHARSET=ISO-8859-1; export MM_CHARSET 或在/etc/csh.login里面: setenv LANG de_DE.ISO8859-1 setenv MM_CHARSET ISO-8859-1 另外,您可以把上面的设置添加到/usr/share/skel/dot.profile (和前面的/etc/profile一样),或者/usr/share/skel/dot.login (和前面的/etc/csh.login一样)。 对于X11: $HOME/.xinitrc里面: LANG=de_DE.ISO8859-1; export LANG 或者: setenv LANG de_DE.ISO8859-1 依赖您的shell(看上面)。 控制台设置 对于所有的简单C字符集,在/etc/rc.conf中用正在讨论的语言设置正确的控制台字符: font8x16=font_name font8x14=font_name font8x8=font_name 这儿的font_name来自于/usr/share/syscons/fonts目录, 不带.fnt后缀。 sysinstall keymap screenmap 您还需要确定正确地为您的 C 字符集配置了 keymap 和 screenmap, 这一工作可以通过 sysinstall (在 &os; 5.2 之前的版本是 /stand/sysinstall) 来完成。。 进入 sysinstall 之后, 选择 ConfigureConsole。 此外, 您也可以将下面的设置加入 /etc/rc.conf scrnmap=screenmap_name keymap=keymap_name keychange="fkey_number sequence" 这儿的screenmap_name是来自/usr/share/syscons/scrnmaps目录, 不带.scm后缀。 一个带影射字体的屏幕布局通常被作为一个工作区, 用来在VGA适配器字体矩阵上扩展8位到9位。 如果屏幕字体是使用一个8位的排列,要移动这些字母离开这些区域。 如果您在/etc/rc.conf里面启用了moused daemon: moused_enable="YES" 那么需要在下一段检查鼠标指针信息。 moused 默认情况下, &man.syscons.4;驱动程序的鼠标指针在字符集中占用0xd0-0xd3的范围。 如果您的语言使用这个范围,您必须把指针范围移出这个范围。 要绕过这个问题, 需要在 /etc/rc.conf 中加入: mousechar_start=3 这里, keymap_name 来自于 /usr/share/syscons/keymaps 目录, 但去掉了 .kbd 后缀。 如果不确定应该使用哪一个键盘布局, 则可以使用 &man.kbdmap.1; 来测试, 而无需反复重启。 通常, keychange 是设定功能键时, 匹配选定的终端类型来说是必需的, 因为功能键序列无法在键盘布局中定义。 此外您还应该检查并确认在 /etc/ttys 中已经为所有的 ttyv* 项配置了正确的终端类型。 目前, 相关的默认定义是: 字符集设置 终端类型 ISO8859-1 or ISO8859-15 cons25l1 ISO8859-2 cons25l2 ISO8859-7 cons25l7 KOI8-R cons25r KOI8-U cons25u CP437 (VGA default) cons25 US-ASCII cons25w 对于多字节字符语言,可以您的在 /usr/ports/language 目录中使用正确的FreeBSD port。一些port以控制台出现, 而系统把它作为串行vtty终端,因此, 必须为 X11 和伪串行控制台准备足够的vtty终端。 下面是在控制台中使用其他语言的应用程序的部分列表: 语言 特定区域 Traditional Chinese (BIG-5) chinese/big5con Japanese japanese/kon2-16dot or japanese/mule-freewnn Korean korean/han X11设置 虽然X11不是FreeBSD计划的一部分, 但我们已经为FreeBSD用户包含了一些信息。 具体细节可以参考&xorg; Web 站点 或是您使用的 X11 Server 的网站。 ~/.Xresources里面,您可以适当调整特定应用程序的I18N设置(如字体,菜单等)。 显示字体 X11 True Type 字体服务器 安装 &xorg; 服务器 (x11-servers/xorg-server) 或 &xfree86; 服务器 (x11-servers/XFree86-4-Server), 然后安装对应语言的 &truetype; 字体。 请设置正确的地区信息, 这将让您能够在菜单和其它地方看到所选择的语言。 输入非英语字符 X11输入方法(XIM) X11输入方法(XIM)协议是所有X11客户端的一个新标准。 所有将作为XIM客户端来写的X11应用程序从XIM输入服务器输入。 不同的语言有几种XIM服务器可用。 打印机设置 一些简单的C字符集通常是用硬编码来编码进打印机的。更宽或多位的字符集需要特定的设置, 我们推荐使用apsfilter。您也可以使用特定语言转换器把文档转换为 &postscript;或PDF格式。 内核和文件系统 FreeBSD 的快速文件系统 (FFS) 是完全支持 8-位 字符的, 因此它可以被用于任何简单的 C 字符集 (参见 &man.multibyte.3;), 但在文件系统中不会保存字符集的名字; 也就是说, 它不加修改地保存 8-位信息, 而并不知道如何编码。 正式说来, FFS 目前还不支持任何形式的宽或多字节字符集。 不过, 某些宽或多字符集提供了独立的针对 FFS 的补丁来帮助启用关于它们的支持。 目前这些要么是无法移植的, 要么过于粗糙, 因此我们不打算把它们加入到源代码中。 请参考相关语言的 Web 站点, 以了解关于这些补丁的进一步情况。 DOS Unicode FreeBSD &ms-dos;已经能够配置成用在&ms-dos;上,Unicode字符集和可选的FreeBSD文件系统字符集的更多信息, 请参考 &man.mount.msdosfs.8; 联机手册。 编译I18N程序 许多FreeBSD Ports已经支持I18N了。他们中的一些都用-I18N作标记。 这些和其他很多程序已经内建I18N的支持,不需要考虑其他的事项了。 MySQL 然而一些像MySQL这样的应用程序需要重新配置字符集,可在 Makefile里面设置,或者直接把参数传递给configure 本地化FreeBSD Andrey Chernov Originally contributed by 俄语(KOI8-R编码) 本地化 俄语 关于KOI8-R编码的更多信息请查阅KOI8-R参考(Russian Net Character Set) 本地设置 把下面的行加入到您的~/.login_conf文件: me:My Account:\ :charset=KOI8-R:\ :lang=ru_RU.KOI8-R: 参看前面的设置本地化的例子。 控制台设置 把下面一行加到 /etc/rc.conf mousechar_start=3 并在 /etc/rc.conf 里面增加如下设置: keymap="ru.koi8-r" scrnmap="koi8-r2cp866" font8x16="cp866b-8x16" font8x14="cp866-8x14" font8x8="cp866-8x8" 对于/etc/ttys里面的ttyv*记录,要使用 cons25r作为终端类型。 参看前面的设置控制台的例子。 打印机设置 打印机 既然绝大多数带俄语字符的打印机遵循CP866的标准, 那么需要一个针对KOI8-R到CP866转换的特定输出过滤器。这样的一个过滤器默认的安装在 /usr/libexec/lpr/ru/koi2alt。 一个支持俄语的打印机的/etc/printcap记录看起来是这样的: lp|Russian local line printer:\ :sh:of=/usr/libexec/lpr/ru/koi2alt:\ :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs: 更多信息参考&man.printcap.5;手册页。 &ms-dos;文件系统和俄语文件名 下面的例子是在挂上&ms-dos; 文件系统后,启用对俄语文件名支持的&man.fstab.5;记录: /dev/ad0s2 /dos/c msdos rw,-Wkoi2dos,-Lru_RU.KOI8-R 0 0 选项 用于选择地区名称, 而 则用于设置字符转换表。 要使用 选项, 则一定要首先挂接 /usr, 然后再挂接 &ms-dos; 分区, 因为转换表是放在 /usr/libdata/msdosfs 的。 要了解进一步的细节, 请参考 &man.mount.msdosfs.8; 联机手册。 X11设置 首先请进行前面介绍的 非-X 的本地化设置。 如果您正使用 &xorg;, 请安装 x11-fonts/xorg-fonts-cyrillic package。 检查您 /etc/X11/xorg.conf 文件中的 "Files" 小节。 下面的行, 应加到任何其它 FontPath 项之前: FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/misc" FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/75dpi" FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/100dpi" 如果希望使用高分辨率的现实模式, 则应把 100 dpi 的配置行放在 75 dpi 前面。 请查看 ports 中的其它西里尔字体。 要激活俄语键盘, 需要在 xorg.conf 文件的 "Keyboard" 小节中加入下列内容: Option "XkbLayout" "us,ru" Option "XkbOptions" "grp:toggle" 要确信XkbDisable 已经关闭 (注释掉) 了。 RUS/LAT的切换用CapsLock。老的CapsLock功能可以通过 ShiftCapsLock 来模拟(只有在LAT模式的时候)。 使用 grp:caps_toggle 时, RUS/LAT 切换键将是 右 Alt, 而使用 grp:ctrl_shift_toggle 则表示切换键是 CtrlShift。 旧的 CapsLock 功能仍可通过 ShiftCapsLock (只对 LAT 模式有效)。 对于 grp:toggle 而言 RUS/LAT 开关则是 Right Alt。 由于不明原因, grp:caps_toggle&xorg; 中无法使用。 如果您的键盘上有 &windows; 键, 但发现 RUS 模式下, 某些非字母键映射不正常, 则应在您的 xorg.conf 文件中加入下面这行: Option "XkbVariant" ",winkeys" 俄语的 XKB 键盘可能并不为某些不具备本地化功能的应用程序所支持。 本地化程序最低限度应在程序启动时调用 XtSetLanguageProc (NULL, NULL, NULL); 函数。 参见 KOI8-R for X Window 以获得关于对 X11 应用进行本地化的指导。 设置繁体中文 本地化 繁体中文 FreeBSD-Taiwan计划有一个使用很多中文ports的中文化指南在 。 目前, FreeBSD 中文化指南 的维护人员是 沈俊兴 statue@freebsd.sinica.edu.tw 沈俊兴 statue@freebsd.sinica.edu.tw 利用 FreeBSD-Taiwan 的 zh-L10N-tut建立了 Chinese FreeBSD Collection (CFC)。 相关的 packages 和脚本等可以在 找到。 德语本地化(适合所有的ISO 8859-1语言) 本地化 德语 Slaven Rezic eserte at cs.tu-berlin.de 写了一个在FreeBSD机器下如何使用日尔曼语言的德语指南。 可以在下找到。 日语和韩语本地化 本地化 日语 本地化 韩语 日语本地化请参考,韩语参考 非英语的FreeBSD文档 一些FreeBSD的贡献者已经将部分FreeBSD文档翻译成了其他语言。 可以通过主站 或者 /usr/share/doc 查到。 diff --git a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml index 9794516c40..4faa095a0c 100644 --- a/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mirrors/chapter.sgml @@ -1,3088 +1,3111 @@ 获取 FreeBSD CDROM 和 DVD 发行商 零售盒装产品 可以从下面几个零售商那里买到 FreeBSD 的盒装产品(FreeBSD CD, 附加软件,印刷文档):
CompUSA WWW:
Frys Electronics WWW:
CD 和 DVD 光盘 FreeBSD CD 和 DVD 光盘可以从许多在线零售商那里买到:
BSD Mall by Daemon News PO Box 161 Nauvoo, IL 62354 USA Phone: +1 866 273-6255 Fax: +1 217 453-9956 Email: sales@bsdmall.com WWW:
BSD-Systems Email: info@bsd-systems.co.uk WWW:
FreeBSD Mall, Inc. 3623 Sanford Street Concord, CA 94520-1405 USA Phone: +1 925 674-0783 Fax: +1 925 674-0821 Email: info@freebsdmall.com WWW:
Dr. Hinner EDV St. Augustinus-Str. 10 D-81825 München Germany Phone: (089) 428 419 WWW:
Ikarios 22-24 rue Voltaire 92000 Nanterre France WWW:
JMC Software Ireland Phone: 353 1 6291282 WWW:
Linux CD Mall Private Bag MBE N348 Auckland 1030 New Zealand Phone: +64 21 866529 WWW:
The Linux Emporium Hilliard House, Lester Way Wallingford OX10 9TA United Kingdom Phone: +44 1491 837010 Fax: +44 1491 837016 WWW:
Linux+ DVD Magazine Lewartowskiego 6 Warsaw 00-190 Poland Phone: +48 22 860 18 18 Email: editors@lpmagazine.org WWW:
Linux System Labs Australia 21 Ray Drive Balwyn North VIC - 3104 Australia Phone: +61 3 9857 5918 Fax: +61 3 9857 8974 WWW:
LinuxCenter.Ru Galernaya Street, 55 Saint-Petersburg 190000 Russia Phone: +7-812-3125208 Email: info@linuxcenter.ru WWW:
发行人 如果您是销售商并且想销售 FreeBSD CDROM 产品, 请和发行人联系:
Cylogistics 809B Cuesta Dr., #2149 Mountain View, CA 94040 USA Phone: +1 650 694-4949 Fax: +1 650 694-4953 Email: sales@cylogistics.com WWW:
Ingram Micro 1600 E. St. Andrew Place Santa Ana, CA 92705-4926 USA Phone: 1 (800) 456-8000 WWW:
Kudzu, LLC 7375 Washington Ave. S. Edina, MN 55439 USA Phone: +1 952 947-0822 Fax: +1 952 947-0876 Email: sales@kudzuenterprises.com
LinuxCenter.Ru Galernaya Street, 55 Saint-Petersburg 190000 Russia Phone: +7-812-3125208 Email: info@linuxcenter.ru WWW:
Navarre Corp 7400 49th Ave South New Hope, MN 55428 USA Phone: +1 763 535-8333 Fax: +1 763 535-0341 WWW:
FTP 站点 官方的 FreeBSD 源代码可以从遍布全球的镜像站点 通过匿名 FTP 下载。 站点 有着良好的网络连接并且允许大量的并发连接, 但是 您或许更想找一个 更近的 镜像站点 (特别是当您想进行某种形式的镜像的时候)。 FreeBSD 镜像 站点数据库要比使用手册中的镜像列表更加精确, 因为它从 DNS 中获取信息而不依赖于静态的主机列表。 FreeBSD 可以从下面这些镜像站点通过匿名 FTP 下载。如果您选择了通过匿名 FTP 获取 FreeBSD, 请尽量使用离您比较近的站点。被列为 主镜像站点 的镜像站点一般都有完整的 FreeBSD 文件 (针对每种体系结构的所有当前可用的版本), 您或许从您所在的国家或地区的站点下载会得到更快的下载速度。 每个站点提供了最流行的体系结构的最近的版本而有可能不提供完整的 FreeBSD 存档。所有的站点都提供匿名 FTP 访问而有些站点也提供其他的访问方式。对每个站点可用的访问方式 在其主机名后有所说明。 &chap.mirrors.ftp.inc; 匿名 CVS <anchor id="anoncvs-intro">概述 CVS 匿名 匿名 CVS(或人们常说的 anoncvs)是由和 FreeBSD 附带的 CVS 实用工具提供的用于和远程的 CVS 代码库同步的一种特性。 尤其是, 它允许 FreeBSD 用户不需要特殊的权限对任何一台 FreeBSD 项目的官方 anoncvs 服务器执行只读的 CVS 操作。 要使用它,简单的设置 CVSROOT 环境变量指向适当的 anoncvs 服务器, 输入 cvs login 命令 并提供广为人知的密码anoncvs,然后使用 &man.cvs.1; 命令像访问任何本地仓库一样来访问它。 cvs login 命令把用来登录 CVS 服务器的密码储存在您的 HOME 目录中一个叫 .cvspass 的文件里。 如果这个文件不存在, 第一次使用 cvs login 的时候可能会出错。 请创建一个空的 .cvspass 文件,然后试试重新登录。 也可以这么说 CVSup 和 anoncvs 服务本质上提供了同样的功能,但是有各种各样 不同的场合可以影响用户对同步方式的选择。简单来说, CVSup 在网络资源利用方面 更加有效,而且是到目前为止在两者之中技术上更成熟的 除了成本方面。要使用 CVSup,在下载任何东西之前 必须首先安装配置特定的客户端, 而且只能用于下载相当大块的 CVSup 称作 collections 相比之下,anoncvs 可以通过 CVS 模块名来从单个文件里检出任何东西并赋给特定的程序 (比如 ls 或者 grep)。 当然,anoncvs 也只适用于对 CVS 仓库的只读操作,所以如果您是想用和 FreeBSD 项目共享的仓库提供本地开发的话, CVSup 几乎是您唯一的选择。 <anchor id="anoncvs-usage">使用匿名 CVS 配置 &man.cvs.1; 使用匿名 CVS 仓库可以简单的设定 CVSROOT 环境变量指向 FreeBSD 项目的 anoncvs 服务器之一。到此书写作为止, 下面的服务器都是可用的: 奥地利: :pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs (使用 cvs login 然后在提示输入口令时输入任意口令。) 法国: :pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs (pserver (口令是 anoncvs), ssh (没有口令)) 德国: :pserver:anoncvs@anoncvs.de.FreeBSD.org:/home/ncvs (Use cvs login and enter the password anoncvs when prompted.) 德国: :pserver:anoncvs@anoncvs2.de.FreeBSD.org:/home/ncvs (rsh, pserver, ssh, ssh/2022) 日本: :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs (Use cvs login and enter the password anoncvs when prompted.) 美国: freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs (仅 ssh - 无口令) SSH HostKey: 1024 a1:e7:46:de:fb:56:ef:05:bc:73:aa:91:09:da:f7:f4 root@sanmateo.ecn.purdue.edu SSH2 HostKey: 1024 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65 ssh_host_dsa_key.pub USA: anoncvs@anoncvs1.FreeBSD.org:/home/ncvs (仅 ssh - 无口令) SSH HostKey: 1024 8b:c4:6f:9a:7e:65:8a:eb:50:50:29:7c:a1:47:03:bc root@ender.liquidneon.com SSH2 HostKey: 2048 4d:59:19:7b:ea:9b:76:0b:ca:ee:da:26:e2:3a:83:b8 ssh_host_dsa_key.pub 因为 CVS 实际上允许 检出 曾经存在的 (或者,某种情况下将会存在) FreeBSD 源代码的任意版本, 您需要熟悉 &man.cvs.1; 的版本 () 参数, 以及在 FreeBSD 代码库中可用的值。 有两种标签,修订标签和分支标签。 修订标签特指一个特定的修订版本。含义始终是不变的。 分支标签,另一方面, 指代给定时间给定开发分支的最新修订, 因为分支标签不涉及特定的修订版本, 它明天所代表的含义就可能和今天的不同。 包括了用户可能感兴趣的 修订标签。 另外,这里面没有一个可以用于 Ports Collection, 因为它没有多个修订版本。 当您指定一个分支标签,您通常会得到那个开发分支的文件的最新版本。 如果您希望得到一些旧的版本,您可以用 标记制定一个日期。 察看 &man.cvs.1; 手册页了解更多细节。 示例 在这之前强烈建议您通读 &man.cvs.1; 的手册页, 这里有一些简单的例子来展示如何使用匿名 CVS: 从 -CURRENT 检出些东西 (&man.ls.1;): &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co ls 通过 SSH 检出整个 <filename>src/</filename> 代码树: &prompt.user; cvs -d freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs co src The authenticity of host 'anoncvs.freebsd.org (128.46.156.46)' can't be established. DSA key fingerprint is 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'anoncvs.freebsd.org' (DSA) to the list of known hosts. 检出 6-STABLE 分支中的 &man.ls.1; 版本: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs。 &prompt.user; cvs co -rRELENG_6 ls 创建 &man.ls.1; 的变化列表(用标准的 diff) &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs。 &prompt.user; cvs rdiff -u -rRELENG_5_3_0_RELEASE -rRELENG_5_4_0_RELEASE ls 找出可以使用的其它的模块名: &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs &prompt.user; cvs login 在提示符处,输入密码 anoncvs. &prompt.user; cvs co modules &prompt.user; more modules/modules 其他资源 下面附加的资源可能对学习 CVS 有帮助: CVS 指南 来自 Cal Poly。 CVS 主页, CVS 开发和支持社区。 CVSweb 是 FreeBSD 项目的 CVS web 界面。 使用 CTM CTM CTM 是保持远程目录树和中央服务器目录树同步的一种方法。 它被开发用于 FreeBSD 的源代码树,虽然其他人随着时间推移会发现它可以用于其他目的。 当前几乎没有,也或者只有很少的文档讲述创建 deltas 的步骤, 所以如果您希望使用 CTM 去做其它事情, 请联系 &a.ctm-users.name; 邮件列表了解更多信息。 为什么我该使用 <application>CTM</application>? CTM 会给您一份 FreeBSD 源代码树的本地副本。 代码树有很多的 flavors 可用。不管您是希望跟踪完整的 CVS 树还是只是一个分支, CTM 都会给您提供信息。 如果您是 FreeBSD 上的一个活跃的开发者,但是缺乏或者不存在 TCP/IP 连接,或者只是希望把变化自动发送给您, CTM 就是适合您的。对于最积极的分支 您将会每天获得三个以上的 deltas。 然而,您应该考虑通过邮件来自动发送。 升级的大小总是保证尽可能的小。 通常小于 5K,也偶然(十分之一可能)会有 10-50K,也不时地有个大的 100K+ 甚至更大的。 您也需要让自己了解直接和开发代码而不是预发行版本打交道的各种警告。这种情况会很显著, 如果您选择了 current 代码的话。强烈建议您阅读和 FreeBSD 保持同步。 使用 <application>CTM</application> 我需要做什么? 您需要两样东西:CTM 程序,还有初始的 deltas 来 feed it(达到 current 级别)。 CTM 程序从版本 2.0 发布以来 已经是 FreeBSD 的一部分了,如果您安装了源代码副本的话, 它位于 /usr/src/usr.sbin/ctm 您喂给 CTMdeltas 可以有两种方式,FTP 或者 email。 如果您有普通的访问 Internet 的 FTP 权限, 那么下面的 FTP 站点支持访问 CTM 或者看看这一小节镜像。 FTP 访问相关的目录并取得 README 文件,从那里开始。 如果您希望通过 email 得到您的 deltas: 订阅一个 CTM 分发列表。 &a.ctm-cvs-cur.name; 支持完整的 CVS 树。 &a.ctm-src-cur.name; 支持最新的开发分支。 &a.ctm-src-4.name; 支持 4.X 发行分支, 等等。。(如果您不知道如何订阅邮件列表, 点击上面的列表名或者到 &a.mailman.lists.link; 点击您希望订阅的列表。 列表页包含了所有必要的订阅指导。) 当您开始接收到您邮件中的 CTM 升级时,您可以使用 ctm_rmail 程序来解压并应用它们。 事实上如果您想要让进程以全自动的形式运行的话,您可以通过在 /etc/aliases 中设置直接使用 ctm_rmail 程序。 查看 ctm_rmail 手册页了解更多细节。 不管您使用什么方法得到 CTM deltas,您都应该订阅 &a.ctm-announce.name; 邮件列表。 以后会有单独的地方提交有关 CTM 系统的操作的公告。 点击上面的邮件列表名并按照指示订阅邮件列表。 第一次使用 <application>CTM</application> 在您开始使用 CTM delta 之前,您需要获得一个起始点。 首先您应该确定您已经有了什么。每个人都可以从一个目录开始。 您必须用一个初始的 空的 delta 来开始您的 CTM 支持树。曾经为了您的便利这些 起始 deltas 被有意的通过 CD 来发行, 然而现在已经不这样做了。 因为代码树有数十兆字节,您应该更喜欢从手头上已经有的东西开始。如果您有一张 -RELEASE CD 光盘,您可以从里面复制或者解压缩一份初始代码出来。 这会节省非常多的数据传输量。 您会发现这些初始的 deltas 名字的数字后面都有个 X (比如 src-cur.3210XEmpty.gz)。 后面加一个 X 的设计符合您的初始 seed 的由来。 Empty 是一个空目录。通常一个基本的从 Empty 开始的转换由 100 个 deltas 构成。顺便说一下,他们都很大!70 到 80 兆字节的 gzip 压缩的数据对于 XEmpty deltas 是很平常的。 一旦您已经选定了一个基本的 delta 开始,您就需要比这个数高的所有的 delta。 在您的日常生活中使用 <application>CTM</application> 要应用 deltas,简单的键入: &prompt.root; cd /where/ever/you/want/the/stuff &prompt.root; ctm -v -v /where/you/store/your/deltas/src-xxx.* CTM 能够理解被 gzip 压缩的 deltas,所以您不需要先 gunzip 他们,这可以节省磁盘空间。 除非觉得整个过程非常可靠, CTM 不会涉及到您的代码树的。您也可以使用 标记来校验 delta, 这样 CTM 就不会涉及代码树; 它会只校验 delta 的完整性看看是否可以安全的用于您的当前代码树。 CTM 还有其他的一些参数, 查看手册页或者源代码了解更多信息。 这真的就是全部的事情了。每次得到一个新的 delta,就通过 CTM 运行它来保证您的代码是最新的。 如果这些 deltas 很难重新下载的话不要删除它们。 有些东西坏掉的时候您会想到保留它们的。 即使您只有软盘,也请考虑使用 fdwrite 来做一份副本。 维持您本地的变动 作为一名开发者喜欢实验,改动代码树中的文件。 CTM 用一种受限的方式支持本地修改:再检查文件 foo 存在之前,首先查找 foo.ctm。如果这个文件存在, CTM 会对它操作而不是 foo 这种行为给我们提供了一种简单的方式来维持本地的改动: 只要复制您计划修改的文件并用 .ctm 的后缀重新命名。 然后就可以自由的修改代码了,CTM 会更新 .ctm 文件到最新版本。 其他有趣的 <application>CTM</application> 选项 正确的找出哪些将被更新 您可以确定变动列表, CTM 可以做到,在您的代码库上使用 CTM 选项。 这很有用如果您想要保存改动的日志, pre- 或者 post- 用各种风格处理修改的文件的纪录, 或者仅仅是想感受一下孩子般的疯狂。 在升级前制作备份 有时您可能想备份将要被 CTM 升级所改动的所有文件。 指定 选项会导致 CTM 备份将要被给定的 CTM delta 改动的所有文件到 backup-file 限定受升级影响的文件 有时您可能对限定一个给定的 CTM 升级的范围感兴趣,也有可能想知道怎样从一列 deltas 中解压缩一部分文件。 您可以通过使用 选项指定过滤规则表达式来控制 CTM 即将对之操作的文件列表。 例如,要从您保存的CTM deltas 集里解压缩出一个最新的 lib/libc/Makefile 文件,运行这个命令: &prompt.root; cd /where/ever/you/want/to/extract/it/ &prompt.root; ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.* 对于每一个在 CTM delta 中指定的文件, 选项按照命令行给定的顺序应用。 文件只有在所有的 被应用之后标记为合格之后 才能被 CTM 操作。 <application>CTM</application> 未来的计划 其中几项: CTM 中使用一些认证方式, 这样来允许察觉冒充的 CTM 补丁。 整理 CTM 的选项, 它们变得杂乱而违反直觉了。 杂项 也有一系列的 ports collection 的 deltas,但是人们对它的兴致还没有那么高。 CTM 镜像 CTM/FreeBSD 可以在下面的镜像站点通过匿名 FTP 下载。如果您选择通过匿名 FTP 获取 CTM, 请试着使用一个离您较近的站点。 如果有问题,请联系 &a.ctm-users.name; 邮件列表。 加利福尼亚州,海湾地区,官方源代码 南非,旧的 deltas 的备份服务器 中国台湾 如果您在您附近找不到镜像或者镜像不完整, 试着使用搜索引擎比如 alltheweb. 使用 CVSup 概述 CVSup 是一个用于从远程服务器主机上的主 CVS 仓库发布和升级源代码树的软件包。 FreeBSD 的源代码维护在加利福尼亚州一台主开发服务器的 CVS 仓库里。 有了 CVSup,FreeBSD 用户可以很容易的保持他们自己的源代码树更新。 CVSup 使用所谓的升级 pull 模式。在 pull 模式下,客户端在需要的时候向服务器端请求更新。 服务器被动的等待客户端的升级请求。 因此所有的升级都是客户端发起的。 服务器决不会发送未请求的升级。用户必须手动运行 CVSup 客户端获取更新, 或者设置一个 cron 作业来让它以固定的规律自动运行。 术语 CVSup用大写字母写正是表示, 代表了完整的软件包。 它的主要组件是运行在每个用户机器上的客户端 cvsup, 和运行在每个 FreeBSD 镜像站点上的服务器端 cvsupd 当您阅读 FreeBSD 文档和邮件列表时,您可能会看见 supSupCVSup 的前身,有着相似的目的。 CVSup 使用很多和 sup 相同的方式, 而且, 它还是用使用和 sup 的兼容的配置文件。 Sup 已经不再被 FreeBSD 项目使用了, 因为 CVSup 既快又有更好的灵活性。 + + + csup 是用 C 语言对 + CVSup 软件的重写。 它最大的好处是, + 这个程序更快一些, 并且也不需要依赖于 + Modula-3 语言, 因此也就不需要安装后者。 另外, 如果您使用 &os; 6.2 + 或更新版本, 就可以直接使用, 因为它成为了基本系统的一部分。 + 较早的 &os; 版本的基本系统中并不包含 &man.csup.1;, 但可以通过 + net/csup port 或预编译包来安装。 + 不过需要注意的是, csup 工具并不支持 CVS 模式。 + 如果您希望对代码库做完整的镜像, 则还是需要使用 + CVSup。 假如您决定使用 + csup, 则可以跳过安装 CVSup + 这一步, 并在文章中余下部分提到的 CVSup 改为 + csup + 安装 安装 CVSup 最简单的方式就是使用 FreeBSD packages collection 中预编译的 net/cvsup 包。 如果您想从源代码构建 CVSup, 您可以使用 net/cvsup port。但是预先警告一下: net/cvsup port 依赖于 Modula-3 系统,会花费相当的时间和磁盘空间来下载编译。 如果想在没有安装 &xfree86;&xorg; 的计算机, 例如服务器上使用 CVSup, 则只能使用不包含 CVSup GUInet/cvsup-without-gui + + 如果希望在 &os; 6.1 或更早版本中安装 csup, + 则可以从 FreeBSD 的 packages collection 中安装预编译的 + net/csup 包; 如果希望自行从源代码编译 + csup, + 也可以用 net/csup + port 来安装。 CVSup 配置 CVSup 的操作被一个叫做 supfile 的配置文件所控制。 在目录 /usr/share/examples/cvsup/ 下面有一些示例的 supfiles supfile 中的信息解答了 CVSup 下面的几个问题: 您想接收 哪些文件? 您想要它们的 哪个版本? 您想从哪里 获取它们? 您想把它们 放在您自己机器的什么地方? 您想把 您的状态文件放在哪? 在下面的章节里,我们通过依次回答这些问题来创建一个典型的 supfile 文件。首先,我们描述一下 supfile 的整体构成。 supfile 是个文本文件。注释用 # 开头,至行尾有效。 空行和只包含注释的行会被忽略。 每个保留行描述一批用户希望接收的文件。 每行以 collection, 由服务器端定义的合理的文件分组,的名字开头。 collection 的名字告诉服务器您想要的文件。 collection 名字结束或者有更多的字段,用空格分隔。 这些字段回答了上面列出的问题。 字段类型有两种:标记字段和值字段。 标记字段由独立的关键字组成,比如, delete 或者 compress。值字段也用关键字开头, 关键字后面跟 = 和第二个词而没有空格。 例如,release=cvs 是一个值字段。 一个典型的 supfile 往往接收多于一个的 collection。创建 supfile 的一种方式是明确的为每一个 collection 指定相关的字段。然而,这样使得 supfile 的行变得特别长,很不方便, 因为 supfile 中的所有 collection 的大部分 字段都是相同的。 CVSup 提供了一个默认机制来避免 这些问题。用特定的伪 collection 名 *default 开头的行可以被用来设置标记和值为 supfile 中随后的 collection 中的默认值。 默认值可以通过为这个 collection 自身指定不同的值来对单个的 collection 覆盖设置, 也可以在 mid-supfile 中通过附加的 *default 行改变或扩充。 知道了这些,我们现在就可以开始创建一个 用于接收和升级 FreeBSD-CURRENT 主源代码树的 supfile 文件了。 您想接收哪些文件? 通过 CVSup 可用的文件组织成叫做 collections 的名称组。 这些可用的 collection 在 随后的章节 中描述。 在这个例子里, 我们希望接收 FreeBSD 系统的完整的主代码树。 有一个单独的大的 collection src-all 让我们完成这个。 创建我们的 supfile 的第一步, 我们简单的列出这些 collection,每个一行(在这个例子里, 只有一行): src-all 您想要他们的 哪个版本? 通过 CVSup,您实际上可以接收 曾经存在的源代码的任何版本。 这是有可能的,因为 cvsupd 服务器直接通过 CVS 仓库工作,那包含了所有的版本。您可以 用 tag= 值字段 指定一个您想要的版本。 仔细的正确指定任何 tag= 字段。有一些 tag 只对特定的 collection 文件合法。 如果您指定了一个不正确的或者 拼写错误的 tag,CVSup 会删除您可能不想删除的文件。 特别地,对 ports-* collection 使用 tag=. tag= 字段在仓库中表示为一个符号标签。 有两种标签,修订标签和分支标签。 修订标签代表一个特定的修订版本。 它的含义是一成不变的。 分支标签,另一方面,代表给定开发线上给定时间的最新修订。 因为分支标签不代表一个特定的修订版本, 它明天的含义就可能和今天的有所不同。 包含了用户可能感兴趣的分支标签。 当在 CVSup 的配置文件中指定标签的时候,必须用 tag= 开头 (RELENG_4 会变成 tag=RELENG_4)。 记住只有 tag=. 可以用于 Ports Collection。 注意像看到的那样正确的输入标签名。 CVSup 不能辨别合法和不合法标签。 如果您拼写错了标签名, CVSup 会像您指定了一个没有任何文件的合法标签一样工作, 那会删除您已经存在的代码。 当您指定一个分支标签的时候,您通常会收到开发线上文件的最新版本。 如果您希望接收一些过时的版本,您可以通过用 值字段指定一个日期来做到。 &man.cvsup.1; 手册页解释了如何来做。 对于我们的示例来说,我们希望接收 FreeBSD-CURRENT。 我们在我们的 supfile 的开头添加这行: *default tag=. 有一个重要的特例, 如果您既没指定 tag= 字段也没指定 date= 字段的情况。这种情况下, 您会收到直接来自于服务器 CVS 仓库的真实的 RCS 文件, 而不是某一特定版本。 开发人员一般喜欢这种操作模式。 通过在他们的系统上维护一份仓库自身的副本, 他们可以浏览修订历史以及检查文件过去的版本。 然而,这个好处是以大量的磁盘空间为代价的。 您想从哪里获取他们? 我们使用 host= 字段来告诉 cvsup 从哪里获取更新。 任何一个 CVSup 镜像站点都可以, 虽然您应该选择一个离您比较近的站点。 在这个例子里我们将使用一个虚拟的 FreeBSD 发布站点, cvsup99.FreeBSD.org *default host=cvsup99.FreeBSD.org 您需要在运行 CVSup 之前把这个改成一个实际存在的站点。 在任何 cvsup 运行的特定时刻, 您都可以在命令行上使用 选项来覆盖主机设置。 您想把它们放在 您自己机器的什么地方? prefix= 字段告诉 cvsup 把接收的文件放在哪里。 在这个例子里,我们把源代码文件直接放进我们的主源代码树, /usr/srcsrc 目录已经隐含在我们选择接收的 collection 里了, 所以正确的写法是: *default prefix=/usr cvsup 在哪里维护它的状态文件? CVSup 客户端在被叫做 base 的目录里维护了几个状态文件。 这些文件帮助 CVSup 更有效的工作, 通过跟踪您已经接收到哪些更新的方式。 我们将使用标准的 base 目录, /var/db *default base=/var/db 如果您的 base 目录还不存在,现在最好创建它。 如果 base 目录不存在,cvsup 客户端会拒绝工作。 其他的 supfile 设置: supfile 中有一些其他选项需要介绍一下: *default release=cvs delete use-rel-suffix compress release=cvs 显示服务器应该从 FreeBSD 的主 CVS 仓库中获取信息。 事实上总是这样的,但是也有可能会超出这个讨论的范围。 deleteCVSup 权限删除文件。 您应该总是指定这个,这样 CVSup 可以保证您的源代码树完全更新。CVSup 很小心的只删除那些不再依赖的文件。 您拥有的任何额外的文件会被严格的保留。 use-rel-suffix 是 ... 不可思议的。 如果您真的想了解它,查看 &man.cvsup.1; 手册页。 否则,就指定而不用担心这个。 compress 启用 gzip 风格的信道压缩。 如果您的网络连接是 T1 或者更快, 您可能不想使用压缩。 否则,它非常有帮助。 把它们放在一起: 这是我们的示例的完整 supfile 文件: *default tag=. *default host=cvsup99.FreeBSD.org *default prefix=/usr *default base=/var/db *default release=cvs delete use-rel-suffix compress src-all <filename>refuse</filename> 文件 像上面提到的,CVSup 使用一种 pull 方法。基本上,这意味着您要连接到 CVSup 服务器,服务器说, 这有些您能下载的东西 ...,然后您的客户端反应好,我要这个, 这个,这个,还有这个。在默认的配置中, CVSup 客户端会取回您在配置文件中选定的 collection 和标签的每个文件。 然而,并不总是您想要的, 尤其是您在同步 docports,或者 www 树 — 大部分人都不能阅读四种或者五种 语言,因此他们不需要下载特定语言的文件。 如果您在 CVSup Ports Collection,您 可以通过单独指定每个 collection 来避免这个 (比如,ports-astrologyports-biology,等等取代简单的说明 ports-all)。然而,因为 docwww 树没有特定语言的 collection,您必须 使用 CVSup 许多极好的特性之一: refuse 文件。 refuse 文件本质上是告诉 CVSup 它不应该从 collection 中取得某些文件;换句话说,它告诉客户端 拒绝 来自服务器的特定的文件。 refuse 文件可以在 base/sup/ 中找到(或者,如果您没有,应该创建一个)。 base 在您的 supfile 中定义; 默认情况下,base 就是 /var/db, 这意味着默认的 refuse 文件就是 /var/db/sup/refuse refuse 文件的格式很简单; 它仅仅包含您不希望下载的文件和目录名。 例如,如果您除了英语和德语之外不会讲其他语言, 而且也不打算阅读德文的文档翻译版本, 则可以把下面这些放在您的 refuse 文件里: doc/bn_* doc/da_* doc/de_* doc/el_* doc/es_* doc/fr_* doc/it_* doc/ja_* doc/nl_* doc/no_* doc/pl_* doc/pt_* doc/ru_* doc/sr_* doc/tr_* doc/zh_* 等等其他语言(您可以通过浏览 FreeBSD CVS 仓库找到完整的列表)。 有这个非常有用的特性,那些慢速连接或者要为他们的 Internet 连接按时付费的用户就可以节省宝贵的时间因为他们不再需要 下载那些从来不用的文件。要了解 refuse 文件的更多信息以及其它 CVSup 的优雅的特性,请浏览它的 手册页。 运行 <application>CVSup</application> 您现在准备尝试升级了。命令很简单: &prompt.root; cvsup supfile supfile 的位置当然就是您刚刚创建的 supfile 文件名啦。 如果您在 X11 下面运行,cvsup 会显示一个有一些可以做平常事情的按钮的 GUI 窗口。 按 go 按钮,然后看着它运行。 在这个例子里您将要升级您目前的 /usr/src 树,您将需要 用 root 来运行程序,这样 cvsup 有需要的权限来更新您的文件。 刚刚创建了您的配置文件,又从来没有使用过这个程序, 紧张不安是可以理解的。有一个简单的方法不改变您当前的文件 来做一次试验性的运行。只要在方便的地方创建一个 空目录,并在命令行上作为一个额外的参数说明: &prompt.root; mkdir /var/tmp/dest &prompt.root; cvsup supfile /var/tmp/dest 您指定的目录会作为所有文件更新的目的路径。 CVSup 会检查您在 /usr/src 中的文件,但是不会修改或 删除。任何文件更新都会被放到 /var/tmp/dest/usr/src 里了。 在这种方式下运行 CVSup 也会把它的 base 目录状态文件保持原样。这些文件的新版本 会被写到指定的目录。 因为您有 /usr/src 目录的读权限,所以执行这种试验性的运行 甚至不需要使用 root 用户。 如果您没有运行 X11 或者不喜欢 GUI, 当您运行 cvsup 的时候需要在命令行添加 两个选项: &prompt.root; cvsup -g -L 2 supfile 告诉 CVSup 不要使用 GUI。如果您 没在运行 X11 这个是自动的,否则您必须指定它。 告诉 CVSup 输出所有正在升级的文件的细节。 有三个等级可以选择,从 。默认是 0,意味着除了错误消息 什么都不输出。 还有许多其它的选项可用。想要一个简短的列表, 输入 cvsup -H。要查看更详细的描述, 请查看手册页。 一旦您对升级工作的方式满意了,您就 可以使用 &man.cron.8; 来安排规则的运行 CVSup。 很显然的,您不应该让 CVSup 通过 &man.cron.8; 运行的时候使用它的 GUI。 <application>CVSup</application> 文件 collection CVSup 可用的文件 collection 是分级组织的。 有几个大的 collection,然后它们有分成更小的子 collection。接收一个大的 collection 等同于 接收它的每一个子 collection。 collection 的等级关系在下面列表中通过缩进的使用 反映出来。 最常用的 collection 是 src-all,和 ports-all。其它的 collection 只被有着特定 目的的小部分人使用, 有些站点可能不全部支持。 cvs-all release=cvs FreeBSD 主 CVS 仓库,包含 密码系统的代码。 distrib release=cvs FreeBSD 发行版本和镜像相关的 文件。 doc-all release=cvs FreeBSD 使用手册和其它文档的源代码。 其中不包含 FreeBSD web 站点的文件。 ports-all release=cvs FreeBSD Ports Collection。 如果您不想升级全部的 ports-all(整个 ports 树), 而只是使用下面列出的一个子集, 请确保您总是升级了 ports-base 子 collection! 无论何时在 ports 构建下层构造有所改变的时候都会通过 ports-base 表现出来,事实上某些 改变会很快的被实际的 ports 使用,因此,如果您只升级了 实际的 ports 而他们使用了一些新的特性, 就有极大的可能编译会因一些神秘的错误信息而失败。 这种情况下非常快速的要做的事情 就是确保您的 ports-base 子 collection 更新到 最新。 要自行构建 ports/INDEX, 您 必须 接受 ports-all (完整的 ports tree)。 在部分 ports tree 上构建 ports/INDEX 是不被支持的。 请参见 FAQ ports-accessibility release=cvs 用以帮助残疾用户的软件。 ports-arabic release=cvs 阿拉伯语支持。 ports-archivers release=cvs 存档工具。 ports-astro release=cvs 天文相关的 ports。 ports-audio release=cvs 声音支持。 ports-base release=cvs Ports Collection 构建下部构造 - 位于 /usr/portsMk/Tools/ 子目录的 各种各样的文件。 请查看 重要警告:您应该 总是更新这个 子 collection,无论您更新 FreeBSD Ports Collection 的任何部分的时候! ports-benchmarks release=cvs 基准。 ports-biology release=cvs 生物学。 ports-cad release=cvs 计算机辅助设计工具。 ports-chinese release=cvs 中文语言支持。 ports-comms release=cvs 通信软件。 ports-converters release=cvs 字符编码转换。 ports-databases release=cvs 数据库 ports-deskutils release=cvs 计算机发明前常出现在桌面上的东西。 ports-devel release=cvs 开发工具。 ports-dns release=cvs DNS 相关软件。 ports-editors release=cvs 编辑器 ports-emulators release=cvs 其它操作系统的模拟器 ports-finance release=cvs 货币,金融相关应用程序。 ports-ftp release=cvs FTP 客户端和服务器端工具。 ports-games release=cvs 游戏 ports-german release=cvs 德语支持。 ports-graphics release=cvs 图形图像工具。 ports-hebrew release=cvs 希伯来语支持。 ports-hungarian release=cvs 匈牙利语言支持。 ports-irc release=cvs Internet 多线交谈(IRC)工具。 ports-japanese release=cvs 日语支持。 ports-java release=cvs &java; 工具。 ports-korean release=cvs 韩国语言支持。 ports-lang release=cvs 编程语言。 ports-mail release=cvs 邮件软件。 ports-math release=cvs 数值计算软件。 ports-mbone release=cvs MBone 应用程序。 ports-misc release=cvs 杂样工具。 ports-multimedia release=cvs 多媒体软件。 ports-net release=cvs 网络软件。 ports-net-im release=cvs 即时消息软件。 ports-net-mgmt release=cvs 网管软件。 ports-net-p2p release=cvs 对等网 (peer to peer network) 应用。 ports-news release=cvs USENET 新闻软件。 ports-palm release=cvs Palm 系列软件支持。 ports-polish release=cvs 波兰语支持。 ports-ports-mgmt release=cvs 用于管理 ports 和预编译包的工具。 ports-portuguese release=cvs 葡萄牙语支持。 ports-print release=cvs 打印软件。 ports-russian release=cvs 俄语支持。 ports-science release=cvs 科学计算。 ports-security release=cvs 安全工具。 ports-shells release=cvs 命令行 shell。 ports-sysutils release=cvs 系统实用工具。 ports-textproc release=cvs 文本处理工具(不 包含桌面出版)。 ports-ukrainian release=cvs 乌克兰语支持。 ports-vietnamese release=cvs 越南语支持。 ports-www release=cvs 万维网(WWW)相关软件。 ports-x11 release=cvs 支持 X window 系统的 ports。 ports-x11-clocks release=cvs X11 时钟。 ports-x11-fm release=cvs X11 文件管理器。 ports-x11-fonts release=cvs X11 字体和字体工具。 ports-x11-toolkits release=cvs X11 工具包。 ports-x11-servers release=cvs X11 服务器。 ports-x11-themes release=cvs X11 主题。 ports-x11-wm release=cvs X11 窗口管理器。 projects-all release=cvs FreeBSD 内部项目的代码库。 src-all release=cvs FreeBSD 主代码,包含密码系统的代码。 src-base release=cvs /usr/src 顶层的各式各样的文件。 src-bin release=cvs 但用户模式下可能用到的用户工具 (/usr/src/bin)。 src-contrib release=cvs FreeBSD 项目之外的工具和库,通常在 FreeBSD 中不作修改 (/usr/src/contrib)。 src-crypto release=cvs FreeBSD 项目之外的 密码系统工具和库,通常在 FreeBSD 中不作修改 (/usr/src/crypto)。 src-eBones release=cvs Kerberos 和 DES (/usr/src/eBones)。 没有在当前的 FreeBSD 发行中使用。 src-etc release=cvs 系统配置文件 (/usr/src/etc)。 src-games release=cvs 游戏 (/usr/src/games)。 src-gnu release=cvs GNU 公共许可协议的工具 (/usr/src/gnu)。 src-include release=cvs 头文件 (/usr/src/include)。 src-kerberos5 release=cvs Kerberos5 安全包 (/usr/src/kerberos5)。 src-kerberosIV release=cvs KerberosIV 安全包 (/usr/src/kerberosIV)。 src-lib release=cvs 库 (/usr/src/lib)。 src-libexec release=cvs 通常被其它程序调用的系统程序 (/usr/src/libexec)。 src-release release=cvs 生成 FreeBSD 版本必需的文件 (/usr/src/release)。 src-sbin release=cvs 但用户模式的系统工具 (/usr/src/sbin)。 src-secure release=cvs 密码相关库和命令 (/usr/src/secure)。 src-share release=cvs 跨多个平台的共享的文件 (/usr/src/share)。 src-sys release=cvs 内核 (/usr/src/sys)。 src-sys-crypto release=cvs 内核密码系统代码 (/usr/src/sys/crypto)。 src-tools release=cvs 维护 FreeBSD 的各种各样的工具 (/usr/src/tools)。 src-usrbin release=cvs 用户工具 (/usr/src/usr.bin)。 src-usrsbin release=cvs 系统工具 (/usr/src/usr.sbin)。 www release=cvs FreeBSD WWW 站点的源代码。 distrib release=self CVSup 服务器的 配置文件。用于 CVSup 镜像站点。 gnats release=current GNATS bug 跟踪数据库。 mail-archive release=current FreeBSD 邮件列表存档。 www release=current 预处理过的 FreeBSD WWW 站点文件(不是源文件)。 用于 WWW 镜像站点。 更多信息 CVSup FAQ 和关于 CVSup 的其它信息,请查看 CVSup 主页 大多数 CVSup 的和 FreeBSD 相关的讨论都在 &a.hackers;。软件的新版本在那发布, 还有 &a.announce;。 问题和 bug 报告应该发给 程序作者 cvsup-bugs@polstra.com CVSup 站点 FreeBSD 的 CVSup 服务器运行于 下列站点: &chap.mirrors.cvsup.inc; 使用 Portsnap 介绍 Portsnap 是一套用以安全地分发 &os; ports 套件的系统。 每隔大约一个小时, 就会生成一份 ports 的最新 快照, 它会被打包并进行数字签名。 这些文件接下来将通过 HTTP 来分发。 CVSup 类似, Portsnap 采用 拉 (pull) 的模式来进行更新: 经过打包并签名的 ports tree 被放在 web 服务器上, 被动地等待用户请求它们。 用户需要手工运行 &man.portsnap.8; 来下载更新, 或者设置 &man.cron.8; 任务来自动地进行更新。 由于一些技术原因, Portsnap 并不自动地直接更新位于 /usr/ports/ 目录中的 实际的 ports tree; 事实上, 默认情况下它只操作位于 /var/db/portsnap/ 的压缩的 ports tree 副本, 而这个副本则用于更新实际的 ports tree。 如果 Portsnap 是通过 &os; Ports Collection 安装的, 则这份压缩快照的默认位置则是 /usr/local/portsnap/ 而非 /var/db/portsnap/ 安装 在 &os; 6.0 和更新版本上, Portsnap 已经成为 &os; 基本系统的一部分。 在较早版本的 &os; 中, - 它可经由 sysutils/portsnap + 它可经由 ports-mgmt/portsnap port 来安装。 Portsnap 的配置 Portsnap 的操作, 是通过 /etc/portsnap.conf 配置文件来控制的。 对于多数用户来说, 默认的配置文件已经可用了; 要了解进一步的细节, 则应参考 &man.portsnap.conf.5; 联机手册。 假如 Portsnap 是通过 &os; Ports Collection 安装的, 则它将使用配置文件 /usr/local/etc/portsnap.conf 而非 /etc/portsnap.conf。 这个文件并不随 port 的安装自动创建, 但我们提供了一个示例的配置文件; 将其复制到合适的位置, 然后运行下面的命令: &prompt.root; cd /usr/local/etc && cp portsnap.conf.sample portsnap.conf 首次运行 <application>Portsnap</application> 在首次运行 &man.portsnap.8; 时, 它需要将整个 ports tree 的压缩快照下载到 /var/db/portsnap/ (或者, 如果 Portsnap 是通过 Ports Collection 安装的, 则是 /usr/local/portsnap/)。 在 2006 年初, 其下载尺寸大约是 41 MB。 &prompt.root; portsnap fetch 一旦下载了压缩的快照, 就可以将它释放成为位于 /usr/ports/ 中的 实际的 ports tree 了。 即时之前那个目录中已经有了一份 ports tree 也需要这样做 (例如, 通过使用 CVSup), 因为这个操作, 将为后续的 portsnap 决定更新 ports tree 的哪一部份提供基础。 &prompt.root; portsnap extract 默认安装时, 并不会自动创建 /usr/ports 这个目录。 如果您使用 &os; 6.0-RELEASE, 在首次使用 portsnap 之前应手工创建这个目录。 在更高版本的 &os; 和 Portsnap 中, 这个操作会由 portsnap 命令自动完成。 更新 Ports Tree 在首次下载压缩的 ports tree 快照, 并将其释放到 /usr/ports/ 之后, 更新 ports tree 包含下面两步: fetch(下载) 对于压缩快照的更新, 并使用它们来 update(更新) 实际的 ports tree。 这两步可以通过一个 portsnap 命令来完成: &prompt.root; portsnap fetch update 较早版本的 portsnap 并不支持这种写法。 如果不能用的话, 试试看下面的: &prompt.root; portsnap fetch &prompt.root; portsnap update 通过 cron 来运行 Portsnap 为了避免对于 Portsnap 服务器的 快闪 式访问, portsnap fetch 不支持作为 &man.cron.8; 任务来运行。 与此相反, 提供了一个特殊的 portsnap cron 命令, 它在开始下载更新之前会随机等待最多 3600 秒。 此外, 强烈建议不要将 portsnap update 作为 cron 任务来运行, 因为它可能给正在同时进行的 port 安装带来大问题。 不过, 更新 ports 的 INDEX 文件一般并无大碍, 这可以通过 portsnap 参数来实现 (显然, 如果 portsnap -I update 是通过 cron 来运行的, 在之后还需要执行不带 portsnap update 来更新 ports tree 余下的部分。) 可以在 /etc/crontab 中加入下列设置, 以便让 portsnap 更新其压缩快照, 以及位于 /usr/ports/ 中的 INDEX 文件, 并在有 port 过期时发出邮件通知: 0 3 * * * root portsnap -I cron update && pkg_version -vIL= 如果系统时钟没有设置为使用本地时区, 请将 3 改为一介于 0 和 23 的随机值, 以便让 Portsnap 服务器的负载更为平均。 某些较早版本的 portsnap, 并不支持在一次调用 portsnap 时使用多个命令 (例如, cron update)。 如果这样不行, 请将 portsnap -I cron update 改为 portsnap cron && portsnap -I update CVS 标签 当使用 cvs 或者 CVSup 获取和升级源代码的时候,必须指定一个修订标签。 修订标签代表 &os; 开发的一个特定分支, 或者一个特定的时间点。第一种叫做 分支标签,第二种叫做 版本标签 分支标签 所有这些,除了 HEAD (这个总是 合法标签)以外,只适用于 src/ 树。ports/doc/,和 www/ 树没有分支。 HEAD 主线的符号名,或者说 FreeBSD-CURRENT。 当没有指定修订版本的时候也是默认的。 CVSup 里,这个标签通过 一个 . 来反映出来(不是标点,而是一个 . 字符)。 在 CVS 里,当没有修订标签指定时这是默认的。 在一台 STABLE 机器上检出或者升级到 CURRENT 源代码 通常不是 一个好主意,除非这是您的本意。 RELENG_6 这是 FreeBSD-6.X 的开发分支, 也被称作 FreeBSD 6-STABLE。 RELENG_6_2 FreeBSD-6.2 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_6_1 FreeBSD-6.1 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_6_0 FreeBSD-6.0 的发行版分支, 只用于安全公告, 以及其他重要更新。 RELENG_5 这是 FreeBSD-5.X 的开发分支, 也被称作 FreeBSD 5-STABLE。 RELENG_5_5 FreeBSD-5.5 安全分支。 只被安全公告和其它重要更新使用。 RELENG_5_4 FreeBSD-5.4 安全分支。 只被安全公告和其它重要更新使用。 RELENG_5_3 FreeBSD-5.3 安全分支。 只被安全公告和其它重要更新使用。 RELENG_5_2 针对 FreeBSD-5.2 和 FreeBSD-5.2.1 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_5_1 针对 FreeBSD-5.1 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_5_0 针对 FreeBSD-5.0 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4 FreeBSD-4.X 开发线,也被叫做 FreeBSD-STABLE。 RELENG_4_11 FreeBSD-4.11 发行版, 只被安全公告和其它重要更新使用。 RELENG_4_10 针对 FreeBSD-4.10 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_9 针对 FreeBSD-4.9 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_8 针对 FreeBSD-4.8 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_7 针对 FreeBSD-4.7 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_6 针对 FreeBSD-4.6 和 FreeBSD-4.6.2 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_5 针对 FreeBSD-4.5 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_4 针对 FreeBSD-4.4 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_4_3 针对 FreeBSD-4.3 的发行版本分支,只做 安全咨询和其它紧急的修正。 RELENG_3 FreeBSD-3.X 的开发线,也被叫做 3.X-STABLE。 RELENG_2_2 FreeBSD-2.2.X 的开发线,也被叫做 2.2-STABLE。这个分支过于陈旧了。 版本标签 当一个特定的 &os; 版本发行时, 这些标签代表了一个指定的时间点。发布工程进程在 Release Engineering InformationRelease Process 文档中被详细描述。 src 树使用以 RELENG_ 开头的标签。 portsdoc 树使用以 RELEASE 开头的标签。 最后, www 树上不会有任何特定发行版的标签。 RELENG_6_2_0_RELEASE FreeBSD 6.2 RELENG_6_1_0_RELEASE FreeBSD 6.1 RELENG_6_0_0_RELEASE FreeBSD 6.0 RELENG_5_5_0_RELEASE FreeBSD 5.5 RELENG_5_4_0_RELEASE FreeBSD 5.4 RELENG_4_11_0_RELEASE FreeBSD 4.11 RELENG_5_3_0_RELEASE FreeBSD 5.3 RELENG_4_10_0_RELEASE FreeBSD 4.10 RELENG_5_2_1_RELEASE FreeBSD 5.2.1 RELENG_5_2_0_RELEASE FreeBSD 5.2 RELENG_4_9_0_RELEASE FreeBSD 4.9 RELENG_5_1_0_RELEASE FreeBSD 5.1 RELENG_4_8_0_RELEASE FreeBSD 4.8 RELENG_5_0_0_RELEASE FreeBSD 5.0 RELENG_4_7_0_RELEASE FreeBSD 4.7 RELENG_4_6_2_RELEASE FreeBSD 4.6.2 RELENG_4_6_1_RELEASE FreeBSD 4.6.1 RELENG_4_6_0_RELEASE FreeBSD 4.6 RELENG_4_5_0_RELEASE FreeBSD 4.5 RELENG_4_4_0_RELEASE FreeBSD 4.4 RELENG_4_3_0_RELEASE FreeBSD 4.3 RELENG_4_2_0_RELEASE FreeBSD 4.2 RELENG_4_1_1_RELEASE FreeBSD 4.1.1 RELENG_4_1_0_RELEASE FreeBSD 4.1 RELENG_4_0_0_RELEASE FreeBSD 4.0 RELENG_3_5_0_RELEASE FreeBSD-3.5 RELENG_3_4_0_RELEASE FreeBSD-3.4 RELENG_3_3_0_RELEASE FreeBSD-3.3 RELENG_3_2_0_RELEASE FreeBSD-3.2 RELENG_3_1_0_RELEASE FreeBSD-3.1 RELENG_3_0_0_RELEASE FreeBSD-3.0 RELENG_2_2_8_RELEASE FreeBSD-2.2.8 RELENG_2_2_7_RELEASE FreeBSD-2.2.7 RELENG_2_2_6_RELEASE FreeBSD-2.2.6 RELENG_2_2_5_RELEASE FreeBSD-2.2.5 RELENG_2_2_2_RELEASE FreeBSD-2.2.2 RELENG_2_2_1_RELEASE FreeBSD-2.2.1 RELENG_2_2_0_RELEASE FreeBSD-2.2.0 AFS 站点 FreeBSD 的 AFS 服务器运行于下面的站点: 瑞典 文件的路径是: /afs/stacken.kth.se/ftp/pub/FreeBSD/ stacken.kth.se # Stacken Computer Club, KTH, Sweden 130.237.234.43 #hot.stacken.kth.se 130.237.237.230 #fishburger.stacken.kth.se 130.237.234.3 #milko.stacken.kth.se 维护者 ftp@stacken.kth.se rsync 站点 下面的站点让 FreeBSD 可以通过 rsync 协议下载。 rsync 实用程序和 &man.rcp.1; 的工作方式很相像, 但是有更多的选项,使用 rsync 远程更新协议只传输 两份文件的不同之处, 因此能够大幅度的提高网络同步速率。 如果您是 FreeBSD FTP 服务器或者 CVS 仓库的镜像站点, 这一点非常有用。 rsync 套件可以工作在许多种 操作系统上,在 FreeBSD 上,查看 net/rsync port 或者使用 package。 捷克共和国 rsync://ftp.cz.FreeBSD.org/ 可用的 collection: ftp:FreeBSD FTP 服务器的 部分镜像。 FreeBSD:FreeBSD FTP 服务器的 完整镜像。 德国 rsync://grappa.unix-ag.uni-kl.de/ 可用的 collection: freebsd-cvs:完整的 FreeBSD CVS 仓库。 这台服务器也镜像 NetBSD 和 OpenBSD 项目, 还有其他的一些项目的 CVS 仓库。 荷兰 rsync://ftp.nl.FreeBSD.org/ 可用的 collection: vol/4/freebsd-core: 对于 FreeBSD FTP 服务器的完整镜像。 英国 rsync://rsync.mirror.ac.uk/ 可用的 collection: ftp.FreeBSD.org: FreeBSD FTP 服务器 的完整镜像。 美国 rsync://ftp-master.FreeBSD.org/ 服务器只供 FreeBSD 主镜像站点使用。 可用的 collection: FreeBSD:FreeBSD FTP 服务器的主要存档。 acl:FreeBSD 主 ACL 列表。 rsync://ftp13.FreeBSD.org/ 可用的 collection: FreeBSD:FreeBSD FTP 服务器的完整 镜像。
diff --git a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml index 07fb9a4edb..35ec90f037 100644 --- a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml @@ -1,1557 +1,1556 @@ Ross Lippert 编辑: 雪平 中文翻译: 多媒体 概述 FreeBSD 广泛地支持各种声卡, 让您可以从容地享受来自您的计算机的高保真输出。 这包括了录制和播放 MPEG Audio Layer 3 (MP3)、 WAV、 以及 Ogg Vorbis 等许多种格式声音的能力。 FreeBSD 同时也包括了许多的应用程序,让您可以录音、 增加声音效果以及控制附加的MIDI设备。 要是乐于动手, FreeBSD 也能支持播放一般的视频文件和 DVD。 对各种视频媒体进行编码、 转换和播放的应用程序比起处理声音的应用程序略少一些。 例如, 在撰写这章时, FreeBSD Ports Collection 中还没有类似 audio/sox 那样好的重编码工具能够用来在不同的格式之间转换。 不过, 这个领域的软件研发进展是很快的。 本章将介绍配置声卡的必要步骤。 X11 的安装和配置 () 里已经考虑到了您显卡的问题, 但要想有更好的播放效果, 仍需要调整一些东西。 读了本章后,您将知道: 如何配置系统识别声卡。 运用样本程序去测试声卡工作的方法。 如何排除声卡安装中的问题。 如何播放和编码MP3以及其它格式的音频。 X 服务器如何支持视频。 哪些好的视频播放/压缩ports 如何播放 DVD、 .mpg 以及 .avi 文件。 如何从CD和DVD中提取文件。 怎样配置电视卡。 如何配置图像扫描仪。 在读本章这前,您应该: 知道如何配置、安装一个新的内核 () 用&man.mount.8; 命令去装载CD光盘,至少会产生一个错误, 更糟的情况下会产生 kernel panic。 这种媒体所用的编码与通常的ISO文件系统是不同的。 Moses Moore 贡献者 Marc Fonvieille Enhanced for &os; 5.X by 安装声卡 配置系统 PCI ISA 声卡 在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。 FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 Hardware Notes 中支持的音频设备列表看看是否支持您的声卡。 这份文档也只论及支持您的声卡的驱动程序。 内核 配置 要使用声卡, 就应装载正确的驱动程序。完成的方式有两种: 最简单的是使用命令 &man.kldload.8; 来装载一个内核模块,在命令行输入 &prompt.root; kldload snd_emu10k1 或者在文件 /boot/loader.conf 里加入一行,内容如下 snd_emu10k1_load="YES" 上边实例用于 Creative &soundblaster; Live! 声卡。 其它可装载的模块列在文件/boot/defaults/loader.conf里边。 如果不知道应该使用哪个驱动, 您可以尝试加载 snd_driver module: &prompt.root; kldload snd_driver 这是个 meta 驱动,一次加载了最常见的设备驱动。 这会提高搜索正确驱动的速度。也可以通过 /boot/loader.conf 工具来加载所有的声卡驱动。 如果希望在加载了 snd_driver meta 驱动之后了解到底选择了哪种声卡, 可以通过使用 cat /dev/sndstat 来查询 /dev/sndstat 文件。 另外,您也可以把支持您声卡的代码静态地编译到内核里去。 下一节就采用这种方式支持硬件给出提示。 关于重新编译内核,请参考 定制内核使其支持声卡 要做的第一件事情就是添加通用音频驱动 &man.sound.4; 到内核中,您需要添加下面这行到内核配置文件中: device sound 接下来就是加入对我们所用声卡的支持了。 首先需要确定我们的声卡需要使用哪一个驱动。 您可以参考 硬件兼容列表 所列出的音频设备, 以确定您声卡的驱动。 例如, Creative &soundblaster; Live! 声卡由 &man.snd.emu10k1.4; 驱动来支持。 要添加它, 需要在内核编译配置文件中加入下面一行: device snd_emu10k1 一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的写法, 也可以在 /usr/src/sys/conf/NOTES 文件。 非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息 (IRQ、 I/O 端口, 等等)。 这项工作可以通过 /boot/device.hints 文件来完成。 系统启动时, &man.loader.8; 将读取这个文件, 并将其中的配置传给内核。 例如, 旧式的 Creative &soundblaster; 16 ISA 非即插即用卡需要使用 &man.snd.sbc.4; 驱动并配合 snd_sb16(4)。 您可以在内核编译配置文件中增加如下配置: device snd_sbc device snd_sb16 还有下面这些到 /boot/device.hints中: hint.sbc.0.at="isa" hint.sbc.0.port="0x220" hint.sbc.0.irq="5" hint.sbc.0.drq="1" hint.sbc.0.flags="0x15" 这样,声卡使用 0x220 I/O 端口和 IRQ 5 /boot/device.hints - 文件的写法会在声卡驱动的联机手册中描述。 - 在 &os; 4.X 上, 这些配置只能直接写进内核配置文件中。 + 文件的写法会在声卡驱动的联机手册中描述。 上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 &man.snd.sbc.4; 联机手册了解更多信息。 测试声卡 用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中 (&man.dmesg.8;),就像这样: pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0 pcm0: [GIANT-LOCKED] pcm0: <Cirrus Logic CS4205 AC97 Codec> 声卡的状态可以通过 /dev/sndstat 文件来查询: &prompt.root; cat /dev/sndstat FreeBSD Audio Driver (newpcm) Installed devices: pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384 kld snd_ich (1p/2r/0v channels duplex default) 您系统的输出可能与此不同。如果没有看到 pcm 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 常见问题列在一节。 如果一切正常,您现在应该拥有一个多功能声卡了。 如果您的 CD-ROM 或者 DVD-ROM 驱动器适当的与声卡相关联, 您可以把 CD 放入驱动器并用 &man.cdcontrol.1; 来播放: &prompt.user; cdcontrol -f /dev/acd0 play 1 许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。一个快速的测试声卡正在发送数据到 /dev/dsp 的方式,像这样做: &prompt.user; cat filename > /dev/dsp 这里 filename 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。 声卡混音级别可以通过 &man.mixer.8; 命令更改。 更多细节可以在 &man.mixer.8; 联机手册中找到。 常见问题 设备节点 I/O 端口 IRQ DSP 错误信息 解决方法 unsupported subdevice XX 一个或多个设备节点没有正确地建立。重复上面的步骤。 sb_dspwr(XX) timed out I/O端口没有设置正确。 bad irq XX IRQ设置不正确。确信设定的IRQ和声卡的IRQ是一样的。 xxx: gus pcm not attached, out of memory 没有足够的内存空间供设置使用。 xxx: can't open /dev/dsp! 使用命令 fstat | grep dsp 进行检查是否有其它的程序打开了设备。 值得注意的是 esoundKDE 提供的声卡支持经常是造成麻烦的祸根。 Munish Chopra 贡献者 利用多个声源 同时有多个声源的声音在播放, 这是完全可能的, 例如当 esound 或者 artsd 不支持与其它程序共享音频设备时。 FreeBSD可以通过 虚拟声道(Virtual Sound Channels) 来达到, 具体设置用工具 &man.sysctl.8; 来完成。 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。 使用两条sysctl命令来设置虚拟声道的数目。 如果您是 root 用户, 执行下面的操作: &prompt.root; sysctl hw.snd.pcm0.vchans=4 &prompt.root; sysctl hw.snd.maxautovchans=4 上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。hw.snd.pcm0.vchanspcm0的虚拟声道数,一当链接上一个设备它就可配置了。 hw.snd.maxautovchans是分配给新的音频设备的虚拟声道数, 此时这个设备要用 &man.kldload.8; 来链接。 因为 pcm 模块可以独立装载许多硬件驱动程序, 因此 hw.snd.maxautovchans 也就可以存储分配给以后链接到的设备的虚拟声道数。 您不能在使用某个设备的时候改变其虚拟通道数。 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。 如果不使用 &man.devfs.5;, 就必须把应用程序指向 /dev/dsp0.x, 这里x 为0到3, 因为在上面的例子里 hw.snd.pcm.0.vchans 被设为了4。 在使用&man.devfs.5;的系统里,上边那些会自动分配给用户。 Josef El-Rayes 这一节的作者是 如何设置混音器通道值 不同的混音通道的默认音量是硬编码进 &man.pcm.4; 驱动程序的。 同时,也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如: hint.pcm.0.vol="100" 这将在 &man.pcm.4; 模块加载时, 将通道音量设置为默认的 100。 Chern Lee 贡献者 MP3音频 MP3 (MPEG Layer 3 Audio)达到过CD音质的效果,FreeBSD工作站没理由会缺少这样的好东东。 MP3播放器 目前为止, 最为流行的 X11 MP3 播放器是 XMMS (X 多媒体系统)。 Winamp 的肤面可以直接用于 XMMS, 因为它的 GUI 几乎和 Nullsoft 的 Winamp 完全一样。 另外, XMMS 也提供了内建的插件支持。 XMMS 可以通过 multimedia/xmms port 或 package 来安装。 XMMS 的界面很直观, 它提供了播放列表、 图形化均衡器等等。 如果您熟悉 Winamp, 就会感觉 XMMS 很容易使用。 audio/mpg123 port 提供了一个命令行界面的 MP3 播放器。 mpg123 可以在执行时通过命令行指定声音设备和要播放的 MP3 文件, 如下所示: &prompt.root; mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3 High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3. Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp. Uses code from various people. See 'README' for more! THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! Playing MPEG stream from Foobar-GreatestHits.mp3 ... MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo /dev/dsp1.0 应该换成您的系统上的 dsp 设备。 抓取CD音轨 在对CD或CD音轨编码成MP3之前, CD上的音频数据应先抓到硬盘里。 这个可以通过复制原始的CDDA(CD数字音频)数据成为波形(WAV)文件。 工具 cdda2wavsysutils/cdrtools 套件的一部份,可用来从CD中获取音频及其相关信息。 把CD放到光驱里,下面的命令可以完成 (作为 root用户) 把整张 CD 分割成单个 (每个音轨) 的WAV文件:/para> &prompt.root; cdda2wav -D 0,1,0 -B cdda2wav 支持 ATAPI (IDE)光驱。 从IDE光驱中抓取音轨, 需要用设备名称代替SCSI的单元号。 例如, 想从 IDE 光驱中抓取第7道音轨: - &prompt.root; cdda2wav -D /dev/acd0a -t 7 + &prompt.root; cdda2wav -D /dev/acd0 -t 7 参数 表示 SCSI 设备 0,1,0, 与命令 cdrecord -scanbus的输出相对应。 抓取单轨,要使用选项,如下所示: &prompt.root; cdda2wav -D 0,1,0 -t 7 这个实例用于抓取第七个音轨。要抓取一定范围的音轨,如从1到7: &prompt.root; cdda2wav -D 0,1,0 -t 1+7 利用&man.dd.1;也可以从ATAPI光驱中抓取音轨,从 可以了解更多。 MP3 编码 现今,可选的MP3编码器是lameLame可以从ports树里的 audio/lame 处找到。 利用抓取的WAV文件,下边的命令就可以把 audio01.wav 转换成audio01.mp3 &prompt.root; lame -h -b 128 \ --tt "Foo Song Title" \ --ta "FooBar Artist" \ --tl "FooBar Album" \ --ty "2001" \ --tc "Ripped and encoded by Foo" \ --tg "Genre" \ audio01.wav audio01.mp3 128 kbits 是标准的MP3位率(bitrate)。 许多人可能喜欢更高的品质例如 160 或 192。 更高的位率, 会使 MP3 占用更多的磁盘空间--但音质会更高。选项 控制 高品质但低速度 (higher quality but a little slower) 模式的开关。 选项 表示把 ID3 标签--通常包含了歌曲的信息, 植入到MP3文件里。 其它的编码选项可以查询 lame 的联机手册。 MP3 解码 要把MP3歌曲刻录成音乐CD,就需要把它转换成非压缩的波形(WAV)格式。 XMMSmpg123 都支持把MP3输出成非压缩格式文件。 XMMS中输出到磁盘: 启动 XMMS. 在窗口里右击鼠标,弹出XMMS菜单。 选项(Options)里选择设定(Preference) 改变输出插件成写磁盘插件(Disk Writer Plugin) 配置(Configure) 输入或选择一个目录用于存放解压的文件。 象平常一样,把MP3文件装入到XMMS里边, 把音量调节到100%并且关掉EQ设定。 按一下播放(Play)XMMS 如同在播放mp3一样,只是听不到声音。 实际上是在播放mp3到一个文件里。 要想再听MP3歌曲,记得把默认的输出插件设回原来的值。 mpg123进行标准输出: 执行 mpg123 -s audio01.mp3 > audio01.pcm XMMS输出的文件是波形(WAV)格式, 而mpg123 则把MP3转换成无压缩的PCM 音频数据。两种格式都支持用 cdrecord 刻录成音乐CD。 使用 &man.burncd.8; 您就必须使用无压缩的PCM。 如果选择波形格式, 就要注意在每道开始时的一小点杂音, 这段声音是波形文件的头部份。 可以使用工具 SoX 来轻松去除。 SoX 可从 audio/sox port 或包(package)中安装得到: &prompt.user; sox -t wav -r 44100 -s -w -c 2 track.wav track.raw 阅读 这部份可以了解到更多在 FreeBSD 里刻盘的信息。 Ross Lippert 贡献者 视频回放 视频回放是个很新并且迅速发展中的应用领域。 一定要有耐心,因为不是所有的事情都象处音频那么顺利。 在开始之前,您要了解显卡的类型以及它所用的芯片的类型。 尽管 &xorg;&xfree86; 支持大量的显卡, 但能达到好的回放效果的却寥寥无几。 在X11运行时,您可以使用命令 &man.xdpyinfo.1; 获得使用您的显卡的X服务器所支持的扩展列表。 为了评估各种播放器和设置,您需要有一小段用作测试的MPEG文件。 由于一些DVD播放器会默认地在 /dev/dvd 里去找DVD文件, 因此, 您会发样建立符号链接到恰当的设备会很有用: &prompt.root; ln -sf /dev/acd0 /dev/dvd &prompt.root; ln -sf /dev/acd0 /dev/rdvd 注意:由于&man.devfs.5;本身的原因, 像这样手工建立的链接在重启后将不会存在。 想要无论什么时候您启动系统都能自动建立符号链接, 那就把下边这行加到 /etc/devfs.conf 里边: link acd0 dvd link acd0 rdvd 另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。 为了改善 X11 界面使用共享内存的能力, 建议提高一些 &man.sysctl.8; 变量的值: kern.ipc.shmmax=67108864 kern.ipc.shmall=32768 测定视频的性能 XVideo SDL DGA 在X11下有几种可以显示图像的方式。 到底哪个能工作很大程序上依赖于硬件。 首先, 下边描述的每一种方法在不同的硬件上都会有不同的品质。 其次, 在X11里的图像显示近来引起普遍的关注, 随着 &xorg;&xfree86; 的每一个版本, 都会有很大的突破。 常见图像接口列表: X11: 一般性的使用共享内存的X11输出。 XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。 SDL: 简单直接媒体层。 DGA: 直接图片存取。 SVGAlib: 低层次掌控图片层。 XVideo &xorg;&xfree86; 4.X 有种扩展叫做XVideo (或称Xvideo, Xv, xv), 它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。 即使在低端的计算机 (例如我的PIII 400 Mhz膝上电脑), 这个扩展也提供了很好的播放质量。 要了解这一扩展是否在正常工作, 使用 xvinfo 命令: &prompt.user; xvinfo 如果显示结果如下,那您的显卡就支持XVideo: X-Video Extension version 2.2 screen #0 Adaptor #0: "Savage Streams Engine" number of ports: 1 port base: 43 operations supported: PutImage supported visuals: depth 16, visualID 0x22 depth 16, visualID 0x23 number of attributes: 5 "XV_COLORKEY" (range 0 to 16777215) client settable attribute client gettable attribute (current value is 2110) "XV_BRIGHTNESS" (range -128 to 127) client settable attribute client gettable attribute (current value is 0) "XV_CONTRAST" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_SATURATION" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_HUE" (range -180 to 180) client settable attribute client gettable attribute (current value is 0) maximum XvImage size: 1024 x 1024 Number of image formats: 7 id: 0x32595559 (YUY2) guid: 59555932-0000-0010-8000-00aa00389b71 bits per pixel: 16 number of planes: 1 type: YUV (packed) id: 0x32315659 (YV12) guid: 59563132-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x30323449 (I420) guid: 49343230-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x36315652 (RV16) guid: 52563135-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x3e0, 0x7c00 id: 0x35315652 (RV15) guid: 52563136-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x7e0, 0xf800 id: 0x31313259 (Y211) guid: 59323131-0000-0010-8000-00aa00389b71 bits per pixel: 6 number of planes: 3 type: YUV (packed) id: 0x0 guid: 00000000-0000-0000-0000-000000000000 bits per pixel: 0 number of planes: 0 type: RGB (packed) depth: 1 red, green, blue masks: 0x0, 0x0, 0x0 同时注意:列出来的格式(YUV2, YUV12, 等等) 并不总是随着 XVdieo的每一次执行而存在。没有它们可能或迷惑有些人。 如果结果看起来是这样: X-Video Extension version 2.2 screen #0 no adaptors present 那么您的显卡可以就不支持XVideo功能。 如果您的卡不支持XVideo, 则只是说明您的显示器在满足刷新图像的计算要求上存在更大的困难。 尽管显卡和处理器很重要,您仍然会有个不错的显示效果。 此外, 您也可以参考我们提供的文献, 在 中有所介绍。 简单直接媒体层 简单直接媒体层(SDL),原意是做为 µsoft.windows;、BeOS 以及 &unix; 之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL 层可以在低层访问硬件, 有时这样做就比 X11 接口层更为高效。 关于 SDL, 可以参考 devel/sdl12 直接图形存取 直接图形存取 (Direct Graphics Access) 是一种 X11 扩展, 通过它, 应用程序能够绕过 X 服务, 并直接修改画面缓存 (framebuffer)。 由于它依赖一种底层的内存映射来实现其功能, 因此使用它的程序必须以 root 身份来执行。 DGA 扩展可以通过 &man.dga.1; 来完成测试和性能测量。 运行 dga 时, 它将随按键改变现实的颜色。 按 q 退出这个程序。 Ports 和 包(Packages) 对视频的解决 视频 ports 视频 包 这部份主要讨论在 FreeBSD Ports 集中提供的可用于视频回放的软件。 视频回放在软件发展中是个很活跃的领域, 并且各种不同程序的功能可能与这里的描述不尽相同。 首先要弄清楚的重要一点是在 FreeBSD 上使用的视频程序其发展与在 Linux 里使用的是一样的。 大部份程序都还处在β阶段。使用 FreeBSD 的包可能面对的问题: 一个应用程序不能播放其它程序制作的文件。 一个应用程序不能播放其自已制作的文件。 不同机上的同样的程序,各自重新建立(rebuild)了一次, 播放同一个文件结果也会有不同。 一个看起来没什么的过滤器, 如图像尺寸的调整, 也有可能因为一个调整例程的问题变得很不象样。 应用程序频繁地留下垃圾(dumps core)。 没有随 port 一起安装的文档可以在网上或者 port 的 work 目录中找到。 这些程序中许多也体现了 Linux主义。即, 有些问题来自于(程序)使用的标准库存在于Linux的发行版中, 或者有些是 Linux 内核的功能, 而该程序的作者事先所假定了的是 Linux内核。这些问题并不总是被 port 编护人员注意到或处理过, 这也就可能导致如下问题: 使用/proc/cpuinfo去检测处理器的特性。 滥用线程可能导致一个程序悬挂完成,而不是完全中止。 软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。 现在,这些程序的开发人员也已同 port 的维护人员进行了联合, 以减少制作port时出错。 MPlayer MPlayer 是近来开发的同时也正迅速发展着的一个视频播放器。 MPlayer 团队的目标是在 Linux 和其它 UNIX 系统中的速度和机动性能。 在团队的创始人实在受不了当时可用的播放器的性能时, 这个计划就开始了。 有人也许会说图形接口已经成为新型设计的牺牲品。 但是一但您习惯了命令行选项和按键控制方式,它就能表现得很好。 创建MPlayer MPlayer making MPlayer 可以从 multimedia/mplayer 找到。 MPlayer 在联编过程中会进行许多硬件检测, 而得到的可执行文件因此将无法移植到其他系统中使用。 因此, 从 ports 完成联编而不是安装预编译的包就很重要。 另外, 在 make 命令行还可以指定许多选项, 在 Makefile 中有所描述, 接下来我们开始联编: &prompt.root; cd /usr/ports/multimedia/mplayer &prompt.root; make N - O - T - E Take a careful look into the Makefile in order to learn how to tune mplayer towards you personal preferences! For example, make WITH_GTK1 builds MPlayer with GTK1-GUI support. If you want to use the GUI, you can either install /usr/ports/multimedia/mplayer-skins or download official skin collections from http://www.mplayerhq.hu/homepage/dload.html 默认的 port 选项对于绝大多数用户来来说是够用了。 不过, 如果您需要 XviD 编解码器, 则必须指定 WITH_XVID 这个命令行选项。 默认的 DVD 设备也可以用 WITH_DVD_DEVICE 选项来定义, 其默认值是 /dev/acd0 撰写这一章的时候, MPlayer port 的联编过程包括了 HTML 文档和两个可执行文件, mplayermencoder, 后者是一个视频再编码工具。 MPlayer 的 HTML 文档提供了丰富的内容。 如果读者发现本章中缺少关于视频硬件的一些信息, 则 MPlayer 的文档将是十分详尽的补充。 如果您正在找关于 &unix; 中的视频支持的资料, 您绝对应该花一些时间来阅读 MPlayer 的文档。 使用MPlayer MPlayer 使用 任何 MPlayer 用户必须在主目录下建立一个叫 .mplayer 的子目录。 输入下边的内容来建立这个必须的子目录: &prompt.user; cd /usr/ports/multimedia/mplayer &prompt.user; make install-user mplayer的手册里列出了它的命令选项。 HTML文档里有更为详细的信息。 这部份里, 我们只是描述了很少的常见应用。 要播放一个文件,如 testfile.avi, 可以通过各种视频接口当中的某一个去设置 选项: &prompt.user; mplayer -vo xv testfile.avi &prompt.user; mplayer -vo sdl testfile.avi &prompt.user; mplayer -vo x11 testfile.avi &prompt.root; mplayer -vo dga testfile.avi &prompt.root; mplayer -vo 'sdl:dga' testfile.avi 所有这些选项都是值得一试的, 因为它们的性能依赖很多因素,并且都与硬件密切相关。 要播放 DVD, 需要把 testfile.avi 改为 。 这里 N 是要播放的节目编号, 而 DEVICE 则是 DVD-ROM 的设备节点。 例如, 要播放 /dev/dvd 的第三个节目: &prompt.root; mplayer -vo xv dvd://3 -dvd-device /dev/dvd 可以在编译 MPlayer 时, 通过 WITH_DVD_DEVICE 来指定默认的 DVD 设备。 系统内定的默认设备是 /dev/acd0。 更多细节, 请参考 port 的 Makefile 要停止、暂停、前进等等,可以参考设定的按键---这些可以通过 mplayer -h 得到或查看手册。 另外,回放的重要选项是:用于全屏模式的 和起辅助完成作用的 为了让 mplayer 的命令行不是太长,使用者可以通过建立一个文件 .mplayer/config 来设定如下默认选项: vo=xv fs=yes zoom=yes 最后,mplayer可以把DVD题目(title)抓取成为 .vob文件。为了从DVD中导出第二个题目,请输入: &prompt.root; mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd 输出文件 out.vob 将是 MPEG 并且可以被这部份描述的其它利用。 mencoder mencoder 在使用 mencoder 之前, 首先熟悉其 HTML 文档中所介绍的选项是一个不错的主意。 它提供了联机手册, 但如果没有 HTML 文档则帮助不大。 有无数种方法来提高视频品质、 降低比特率、 修改格式, 而这些技巧可能会影响性能。 下面是几个例子, 第一个是简单地复制: &prompt.user; mencoder input.avi -oac copy -ovc copy -o output.avi 不正确的命令选项组合可能使生成的文件不能被mplayer播放。因此,如果您只是想抓取文件,一定在mplayer里使用 转换input.avi成为带有MPEG3音频编码 (要求audio/lame )的MPEG4编码: &prompt.user; mencoder input.avi -oac mp3lame -lameopts br=192 \ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi 这样就产生了可被mplayerxine播放的输出。 input.avi 可以换成 并以 root 的身份来执行, 以重新对 DVD 节目进行编码。 由于您第一次做这样的工作时很可能会对结果不太满意, 建议您首先把节目复制成文件, 然后对它进行操作。 xine视频播放器 xine视频播放器是一个关注范围很广的项目,它不仅看准多合一的视频解决,而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。发行有和port版本-- multimedia/xine xine播放器仍然很粗糙,但这很显然与好开头无关。实际上xine 即需要一个快速的带有快速显卡的CPU,也支持XVideo的扩展。图形界面(GUI)可以使用,但很勉强。 到写这章时,还没有可用于播放CSS编码的DVD文件的输入模块随同 xine一起发行。 第三方的建造(builds)里内建有这样的模块, 但都不属于FreeBSD Ports 集。 MPlayer相比,xine 为用户考虑得更多,但同时,对用户来说也少了很多有条理的控制方式。xine 播放器在XVideo接口上做得不错。 默认情况下,播放器xine启动的时后会使用图形界面。那么就可以使用菜单打开指定的文件: &prompt.user; xine 另外,没有图形界面也可以使用如下命令立即打开播放文件: &prompt.user; xine -g -p mymovie.avi 使用transcode transcode 这个软件并不是播放器, 而是一系列用于对视频和音频文件进行重新编码的工具。 通过使用 transcode, 就可以拥有使用带 stdin/stdout 接口的命令行工具来合并视频文件, 以及修复坏损文件的能力。 在联编 multimedia/transcode port 时可以指定大量选项, 我们建议使用下面的命令行来构建 transcode &prompt.root; make WITH_OPTIMIZED_CFLAGS=yes WITH_LIBA52=yes WITH_LAME=yes WITH_OGG=yes \ WITH_MJPEG=yes -DWITH_XVID=yes 对于多数用户而言, 前述配置已经足够了。 为了说明 transcode 的功能, 下面的例子展示了如何将 DivX 转换为 PAL MPEG-1 文件 (PAL VCD): &prompt.user; transcode -i input.avi -V --export_prof vcd-pal -o output_vcd &prompt.user; mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa 生成的 MPEG 文件, output_vcd.mpg, 可以通过 MPlayer 来播放。 您甚至可以直接将这个文件烧录到 CD-R 介质上来创建 Video CD, 如果希望这样做的话, 需要安装 multimedia/vcdimagersysutils/cdrdao 这两个程序。 transcode 提供了联机手册, 但您仍应参考 transcode wiki 以了解更多信息和例子。 进一步了解 FreeBSD里不同的视频软件包正迅速发展中。很可能在不久的将来,这里所谈到的问题都将得到解决。同时,有些人想超越FreeBSD的声/像(A/V)能力,那他们就不得不从一些FAQ和指南里学知识,并使用一些不同的应用程序。这里就给这些读者指出一些补充信息。 MPlayer 文档是很技术性的。这些文档可以给那些希望获得关于&unix;视频高级技术的人们提供参考。MPlayer邮件列表很不喜欢没耐心阅读文档的人,如果您发现什么问题想报告给他们,请首先RTFM。 xine HOWTO里边有一章是关于提高性能的,对所有的播放器都很适应。 最后是一些很有前途的程序,读者可以试一下: Avifile,它就是 multimedia/avifile port。 Ogle 它就是 multimedia/ogle port。 Xtheater multimedia/dvdauthor,一个制作 DVD 节目的源码开放包。 Josef El-Rayes 原创: Marc Fonvieille 改编: 安装电视卡 电视卡 介绍 电视卡可以让您在您的计算机里观看到无线或有线电视。许多卡是通过RCA或S-video输入接收复合视频,而且有些卡还带有调频广播接收器。 &os; 通过&man.bktr.4;驱动程序,提供了对基于PCI的电视卡的支持,要求这些卡使用的是Brooktree Bt848/849/878/879 或 Conexant CN-878/Fusion 878a视频采集芯片。您还要确保这个板上带的有被支持的调谐器,参考&man.bktr.4;手册查看所支持的调谐器列表。 增加驱动程序 要使用您的卡,您就要装载&man.bktr.4;驱动程序。这个可以通过往/boot/loader.conf里边添加下边一行来实现。象这样: bktr_load="YES" 另外,您也可以静态地这个支持编译到内核里去,要是这样的话,就把下边几行加到内核配置里去: device bktr device iicbus device iicbb device smbus 这些附加的设备驱动程序是必须的,因为卡的各组成部分是能过一根I2C总线相互连接在一起的。然后建立安装新的内核。 一旦这个支持被加到了您的系统里,您须要重启系统。在启动过程中,您的电视卡应该显示为up(启动),象这样: bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0 iicbb0: <I2C bit-banging driver> on bti2c0 iicbus0: <Philips I2C bus> on iicbb0 master-only iicbus1: <Philips I2C bus> on iicbb0 master-only smbus0: <System Management Bus> on bti2c0 bktr0: Pinnacle/Miro TV, Philips SECAM tuner. 当然,这些信息可能因您的硬件不同而有所区别。但是您应该能检查那个调制器是否被正确检测到了,可能要忽略一些检测到的同&man.sysctl.8; MIB(管理系统库)和内核配置文件选项一起的参数。例如,如果您想强制使用Philips(飞利浦) SECAM制式的调谐器 ,您就应把下列行加到内核配置文件里: options OVERRIDE_TUNER=6 或者,您直接使用&man.sysctl.8;: &prompt.root; sysctl hw.bt848.tuner=6 请参见 &man.bktr.4; 手册和 /usr/src/sys/conf/NOTES 文件, 以了解更多详细关于可用选项的资料。 有用的应用程序 要使用您的电视卡,您需要安装下列应用程序之一: multimedia/fxtv提供窗口电视(TV-in-a-window)功能和图像/声音/图像采集功能。 multimedia/xawtv也是一款电视应用程序,功能同fxtv一样。 misc/alevt解码和显示Videotext/Teletext。 audio/xmradio,一款用于一些电视卡的调频电台调谐器的程序。 audio/wmtune,一款用于电台调谐器的便捷的桌面程序。 更多的程序在&os; Ports Collection(Ports 集)里。 问题解决 如果您的电视卡遇到了什么问题,您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被&man.bktr.4;驱动程序支持,并且是不是使用了正确的配置选项。想得到更多支持和关于您的电视卡的各种问题,您可以接触和使用&a.multimedia.name; 邮件列表的压缩包。 Marc Fonvieille 撰写人 图象扫描仪 图象扫描仪 介绍 像任何其他的现代操作系统一样,&os; 可以使用图像扫描仪。 对扫描仪的标准的访问是通过 &os; Ports Collection 中的 SANE (Scanner Access Now Easy) API 提供的。 SANE 也会使用一些 &os; 设备驱动来访问扫描仪硬件。 &os; 支持 SCSI 和 USB 扫描仪。 在做任何配置之前请确保您的扫描仪被 SANE 支持。 SANE 有一个 支持的设备列表, 可以为您提供有关扫描仪的支持情况和状态的信息。 &man.uscanner.4; 手册页也提供了一个支持的 USB 扫描仪列表。 内核配置 上面提到 SCSI 和 USB 接口都是支持的。 取决于您的扫描仪接口, 需要不同的设备驱动程序。 USB 接口 默认的 GENERIC 内核包含了支持 USB 扫描仪需要的设备驱动。 如果您决定使用一个定制的内核, 确保下面在您的内核配置文件中存在下面这些行: device usb device uhci device ohci device uscanner 取决于您主板上的 USB 芯片, 您只需要 device uhci 或者 device ohci 中的一种,但是两个都在 内核配置文件中是没有害处的。 如果您不想重新编译内核而且您的内核也不是 GENERIC 的, 您可以用 &man.kldload.8; 命令直接加载 &man.uscanner.4; 设备驱动模块: &prompt.root; kldload uscanner 要在每次系统启动的时候加载这个模块, 添加下面这行到 /boot/loader.conf 中: uscanner_load="YES" 在用正确的内核重新启动后, 或者在加载了需要的模块之后,插上您的 USB 扫描仪。 扫描仪会出现在您的系统消息缓存 (&man.dmesg.8;)中,就像这样: uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2 这表明我们的扫描仪正在使用 /dev/uscanner0 设备节点。 SCSI 接口 如果您的扫描仪是 SCSI 接口的, 重要的是要知道您使用哪种 SCSI 控制器。 取决于所使用的 SCSI 芯片, 您需要调整内核配置文件。 GENERIC 的内核支持最常用的 SCSI 控制器。 请阅读 NOTES 文件并在您的内核配置文件中添加正确的行。 除了 SCSI 适配器驱动之外, 您还需要在内核配置文件中增加下述配置: device scbus device pass 一旦完全编译好您的内核, 您就可以在启动时的系统消息缓冲中看到这些设备: pass2 at aic0 bus 0 target 2 lun 0 pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device pass2: 3.300MB/s transfers 如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 &man.camcontrol.8; 命令执行一次 SCSI 总线扫描: &prompt.root; camcontrol rescan all Re-scan of bus 0 was successful Re-scan of bus 1 was successful Re-scan of bus 2 was successful Re-scan of bus 3 was successful 然后扫描仪就会出现在 SCSI 设备列表里: &prompt.root; camcontrol devlist <IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0) <IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1) <AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3) <PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0) 有关 SCSI 设备的更多细节,可以查看 &man.scsi.4; 和 &man.camcontrol.8; 手册页。 SANE 配置 SANE 系统分为两部分: 后端(graphics/sane-backends) 和前端(graphics/sane-frontends)。 后端部分提供到扫描仪自身的访问。 SANE 支持设备列表详细说明了哪一个后端可以支持您的图象扫描仪。 如果您想使用您的设备,就必须为您的扫描仪选定正确的后端。 前端部分提供图形化的扫描界面 (xscanimage)。 要做的第一件事就是安装 graphics/sane-backends port 或者 package。然后,使用 sane-find-scanner 命令来检查 SANE 系统做的扫描仪检测: &prompt.root; sane-find-scanner -q found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3 输出显示了扫描仪的接口类型和扫描仪连接到系统上的设备节点。 生产厂家和产品型号可能没有显示,不过不重要。 一些 USB 扫描仪需要您加载固件,后端的手册页中有这方面的解释。 您也应该阅读 &man.sane-find-scanner.1; 和 &man.sane.7; 手册页。 现在我们需要检查扫描仪是否可以被扫描前端识别。 默认情况下, SANE 后端自带一个叫做 &man.scanimage.1; 的命令行工具。 这个命令允许您列出设备以及从命令行执行图片扫描。 选项用来列出扫描仪设备: &prompt.root; scanimage -L device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner 如果没有输出任何信息, 或提示没有识别到扫描仪, 则说明 &man.scanimage.1; 无法识别它。 如果发生这种情况, 您就需要修改扫描仪支持后端的配置文件, 并定义所使用的扫描设备。 /usr/local/etc/sane.d/ 目录中包含了所有的后端配置文件。 这类识别问题经常会在某些 USB 扫描仪上发生。 例如, 对于在 中所使用的 USB 扫描仪, sane-find-scanner 会给出下面的信息: &prompt.root; sane-find-scanner -q found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0 扫描仪被正确的探测到了,它使用 USB 接口,连接在 /dev/uscanner0 设备节点上。 我们现在可以检查看看扫描仪是否被正确的识别: &prompt.root; scanimage -L No scanners were identified. If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate). Please read the documentation which came with this software (README, FAQ, manpages). 既然扫描仪没有被识别,我们就需要编辑 /usr/local/etc/sane.d/epson.conf 文件。所用的扫描仪型号是 &epson.perfection; 1650, 这样我们知道扫描仪应使用 epson 后端。确保阅读后端配置文件中的帮助注释。 改动非常简单:注释掉导致您的扫描仪使用错误接口的所有行 (在我们这种情况下,我们将注释掉从 scsi 开始的所有行,因为我们的扫描仪使用 USB 接口),然后在文件的结尾添加指定的接口和所用的设备节点。 这种情况下,我们添加下面这行: usb /dev/uscanner0 请确保阅读后端配置文件提供的注释以及后端手册页了解更多细节, 并使用正确的语法。我们现在可以检验扫描仪是否被识别到了: &prompt.root; scanimage -L device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner 我们的 USB 扫描仪被识别到了。如果商标和型号不匹配也不重要。 相关的关键一条是 `epson:/dev/uscanner0' 字段, 这个给了我们正确地后端名称和正确的设备节点。 一旦 scanimage -L 命令可以看到扫描仪, 配置就完成了。设备现在准备好等待扫描了。 &man.scanimage.1; 允许我们从命令行执行图片扫描, 相比之下使用图形用户界面来执行图片扫描会更好。 SANE 提供了一个简单但实用的图形界面: xscanimage (graphics/sane-frontends)。 Xsane (graphics/xsane)是另一个流行的图形扫描前端。 这个前端提供了一些高级特性, 比如多样的扫描模式(photocopy,fax,等。), 色彩校正,批量扫描,等等。这两个程序都可以作为 GIMP 的插件使用。 授予其他用户扫描权限 前面所有的操作都是用 root 权限来完成的。You may however, need 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/uscanner0,这个节点属于 operator 组。将用户 joe 添加到 operator 组会允许他使用扫描仪: &prompt.root; pw groupmod operator -m joe 要了解更多细节, 请阅读 &man.pw.8; 联机手册。 此外, 还需要为 /dev/uscanner0 设备节点设置正确的写入权限 (0660 或 0664), 因为默认情况下, operator 组只能读这个设备节点。 这项工作可以通过在 /etc/devfs.rules 文件中添加如下设置来自东完成: [system=5] add path uscanner0 mode 660 随后您还需要在 /etc/rc.conf 中添加下面的内容并重新启动: devfs_system_ruleset="system" 关于这些配置的进一步细节请参考联机手册 &man.devfs.8;。 当然, 考虑安全的原因, 在您将用户添加到任何组, 尤其是 operator 组时, 都应三思而后行。 diff --git a/zh_CN.GB2312/books/handbook/ports/chapter.sgml b/zh_CN.GB2312/books/handbook/ports/chapter.sgml index 67e99e4749..5c03681f45 100644 --- a/zh_CN.GB2312/books/handbook/ports/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/ports/chapter.sgml @@ -1,1245 +1,1255 @@ 安装应用程序: Packages 和 Ports 概述 ports packages FreeBSD 将许多系统工具捆绑作为基本系统的一部分。 然而, 要完成实际的工作, 可能还需要安装更多的第三方应用。 FreeBSD 提供了两种补充的技术, 用以在您的系统中安装第三方软件: FreeBSD Ports 套件 (用于从源代码安装), 以及 packages (用以从预编译的二进制版本安装)。 这两种方法都可以用于从本地介质, 或从网上直接安装您喜欢的应用程序的最新版本。 读完这章,您将了解到: 如何安装第三方的二进制软件包。 如何使用 ports 套件从源代码构建第三方软件。 如何删除先前安装的软件包。 如何改动Ports Collection里面的一些参数,定制软件使用。 如何找到您需要的软件包。 如何升级您的应用软件。 软件安装预览 如果您以前使用过 &unix; 系统,那典型的第三方软件安装的步骤是像下面描述的: 下载这个软件,软件的发行版可能是源代码格式,或是一个二进制包。 解开软件(其中代表性的是用 &man.compress.1;, &man.gzip.1;, 或 &man.bzip2.1; 压缩过的tar包)。 阅读相关文档,了解如何安装。 (多半一个文件名是INSTALLREADME, 或在doc/ 目录下的一些文档) 如果软件是以源代码形式发布的,那就需要编译它。可能需要编辑一个 Makefile文件, 或运行 configure脚本,和其他的一些工作。 测试和安装软件。 如果一切顺利的话,就这么简单。如果您在安装一个软件包时发生一些错误, 您可能需要编辑一下它的代码,以使它能正常工作。 您可以继续使用 传统的方式安装软件。 然而, FreeBSD 提供了两种技术: packages 和 ports。 就在写这篇文章的时候, 已经有超过 &os.numports; 个第三方的应用程序可以使用了。 对于任意一个应用程序包,是一个可以下载的FreeBSD package文件。这个 FreeBSD package包含了编译好的的副本, 还有一些配置文件或文档。 一个下载的包文件可以用 FreeBSD 的包管理命令来操作, 例如 &man.pkg.add.1;,&man.pkg.delete.1;, &man.pkg.info.1; 等等。 可以使用一个简单的命令安装一个新的应用程序。 一个FreeBSD的port是一个可以自动从源代码编译成应用程序的文件集合。 记住,如果您自己来编译的话,需要执行很多步的操作 (解压, 补丁, 编译, 安装)。 这些整理 port 的文件集合包含了系统需要完成这个工作的必需信息。 您可以运行一些简单的命令, 那些源代码就可以自动地下载, 解开, 打补丁, 编译, 直至安装完成。 实际上,ports 系统也能做出被 pkg_add 的程序包和不久就要讲到的其他包管理命令来安装的软件包。 Packages 和 ports 是互相 依赖 的。 假设您想安装一个依赖于已经安装的特定库的应用程序。 应用程序和那个库都已经应用于 FreeBSD ports 和 packages。 如果您使用 命令或 ports 系统来添加应用程序, 两个都必须注意库是否被安装, 如果没有, 它会自动先安装库。 这里给出的两种技术是很相似的,您可能会奇怪为什么 FreeBSD 会弄出这两种技术。 其实, packages 和 ports 都有它们自己的长处, 使用哪一种完全取决于您自己的喜好。 Package的优点 一个压缩的 package 通常要比一个压缩的包含源代码的应用程序小得多。 package 不需要进行额外的编译。 对于大型应用程序如 MozillaKDEGNOME 来说这显得尤为重要, 特别是在您的系统资源比较差的情况下。 package不需要您知道如何在FreeBSD上编译软件的详细过程。 Ports 的优点 package 在编译时通常使用比较保守的选项, 这是为了保证它们能够运行在大多数的系统上。 通过从 port 安装, 您可以细微调整编译选项来产生适合于处理器的代码 (针对于 Pentium IV 或 AMD 的 Athlon CPU)。 一些软件包已经把与它们相关的能做和不能做的事情的选项都编译进去了。 例如, Apache 可能就配置了很多的选项。 从 port 中安装时, 您不一定要接受默认的选项, 可以自己来设置。 在一些例子中,一个软件有不同的配置存在多个package。 例如, Ghostscript存在 ghostscript package 和 ghostscript-nox11 package两个配置package, 这取决于您是否安装了X11服务器。 这样的调整对package是可能的, 但如果一个应用程序有超过一个或两个不同的编译时间选项时, 就不行了。 一些软件的许可条件禁止采用二进制形式发行。 它们必须带上源代码。 一些人不信任二进制发行形式。 至少有了源代码, (理论上) 可以亲自阅读它,寻找潜在的问题。 如果您要自己对软件打补丁,您就需要有源代码。 一些人喜欢整天围着源代码转, 所以他们喜欢亲自阅读源代码, 修改源代码等等。 保持更新 ports, 订阅邮件列表 &a.ports; 和递交错误报告 &a.ports-bugs;。 安装任何应用程序之前, 应首先检查 上是否有关于您所安装的应用程序的安全问题报告。 您也可以安装 security/portaudit, + role="package">ports-mgmt/portaudit, 它能够自动地检查已经安装的应用程序的漏洞; 此外, 在您安装程序之前它也会首先检查是否存在已知的漏洞。 另外, 您也可以使用 portaudit -F -a 这个命令在安装了某个软件包之后作出检查。 这章的其余部分将介绍如何使用packages和ports来安装和管理第三方软件。 寻找您要的应用程序 在您安装任何应用程序之前,需要知道您需要什么,那个应用程序叫什么。 FreeBSD中可用的应用程序正在不断地增长着。幸运的是, 有许多方法可以找到您所需要的程序: FreeBSD站点上有一个可以搜索到的当前所有可用的应用程序列表,在 http://www.FreeBSD.org/ports/。 它分很多种类,您既可以通过程序的名称来搜索, 也可以在分类中列出所有可用的应用程序 (如果您知道名字), 也可以在分类中列出所有可用的应用程序。 FreshPorts Dan Langille 维护着网站 FreshPorts,在 。 FreshPort时刻 追踪 着在 ports 中应用程序的变化。当有任何程序被升级时,他们就会发 email 提醒您。 FreshMeat 如果您不知道您想要的应用程序的名字,可以通过 () 网站来查找, 如果找到了应用程序, 您可以回 FreeBSD 的主站去看一下这个应用程序是否已经被 port 进去了。 如果您知道一个port的准确名字, 但需要知道在哪个类别里面能找到它,您可以使用 &man.whereis.1; 这个命令。简单地输入 whereis filefile 就是您想安装的程序名字。 如果系统找到了它, 您将被告知在它在哪里, 例如: &prompt.root; whereis lsof lsof: /usr/ports/sysutils/lsof 结果告诉我们这个命令lsof (一个系统配置程序)可以在 /usr/ports/sysutils/lsof目录中找到。 还有另外的一个寻找您需要的port的方法--是用ports collecton 内嵌的搜索机制。要使用这个搜索, 您需要先到 /usr/ports目录下面。 在那个目录里面, 运行make search name=program-nameprogram-name 就是您想寻找的程序名字。 举个例子, 如果您想找 lsof &prompt.root; cd /usr/ports &prompt.root; make search name=lsof Port: lsof-4.56.4 Path: /usr/ports/sysutils/lsof Info: Lists information about open files (similar to fstat(1)) Maint: obrien@FreeBSD.org Index: sysutils B-deps: R-deps: 在输出的内容里面您要特别注意包含 Path: 的这行将告诉您在哪里可以找到这个 port。 如果要安装此 port, 那其他输出的信息不是必须的, 但是还是显示输出了。 为了更深入的搜索,您还可以用 make search key=stringstring就是您想搜索的部分内容。 它将搜索port的名字、 注释, 描述和从属关系, 如果您不知道您想搜索的程序名字, 可以利用它搜索一些关键主题来找到您需要的。 上面说的这些方法, 搜索的关键字没有大小写区分的。 搜索 LSOF的结果将和搜索lsof的结果一样。 Chern Lee Contributed by 使用Packages系统 一个package的安装 packages installing pkg_add 您可以用 &man.pkg.add.1; 这个命令从本地文件或网络上的服务器来安装一个 FreeBSD 软件包。 在本地手动下载一个package,并安装它 &prompt.root; ftp -a ftp2.FreeBSD.org Connected to ftp2.FreeBSD.org. 220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready. 331 Guest login ok, send your email address as password. 230- 230- This machine is in Vienna, VA, USA, hosted by Verio. 230- Questions? E-mail freebsd@vienna.verio.net. 230- 230- 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /pub/FreeBSD/ports/packages/sysutils/ 250 CWD command successful. ftp> get lsof-4.56.4.tgz local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz 200 PORT command successful. 150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes). 100% |**************************************************| 92375 00:00 ETA 226 Transfer complete. 92375 bytes received in 5.60 seconds (16.11 KB/s) ftp> exit &prompt.root; pkg_add lsof-4.56.4.tgz 如果您没有本地package的安装盘 (如 FreeBSD CD-ROM), 可以执行 &man.pkg.add.1; 命令并加上 选项。 这将迫使程序自动决定目标文件的正确格式和版本, 然后自动从一个 FTP 站点寻找和安装 package。 pkg_add &prompt.root; pkg_add -r lsof 上面的例子将下载正确的package, 而不需要用户的干预就可以安装。 如果您想指定 FreeBSD package 的镜像站点, 替换主站点, 就必须设置 PACKAGESITE 这个环境变量, 覆盖原来的设置。 &man.pkg.add.1; 使用 &man.fetch.3; 下载文件, 可以使用多种环境变量, 包含 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您使用 FTP/HTTP 代理或在防火墙后面, 您可能需要设置这些环境变量。 详细的列表请参考 &man.fetch.3;。上述例子中用 lsof 替代了 lsof-4.56.4。 当使用远程安装 Package 的时候软件名字不需要包含版本号。 &man.pkg.add.1; 将自动的找到这个软件最新的版本。 如果您使用 &os.current; 或 &os.stable;版本的FreeBSD, &man.pkg.add.1; 将下载您的应用软件的最新版本。 如果您使用 -RELEASE 版本的 FreeBSD, 它将会获得与您的版本相应的软件包版本。 您可以通过修改环境变量 PACKAGESITE 来改变这一行为。 例如, 如果您运行 &os; 5.4-RELEASE 系统, 默认情况下 &man.pkg.add.1; 将尝试从 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5.4-release/Latest/ 下载预编译的软件包。 如果您希望强制 &man.pkg.add.1; 下载 &os; 5-STABLE 的软件包, 则可以将 PACKAGESITE 设置为 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest/ 软件包采用 .tgz.tbz 两种格式。您可以在 下面或从 FreeBSD 的发行光盘找到, 它在每一个 4CD 的 FreeBSD 发行版的 /packages目录中。 软件包的设计规划与 /usr/ports 树一致。 每个分类都有自己的目录, 所有的软件包可以在目录 All中找到。 软件包系统的目录结构与ports的设计规划一致; 它们共同构成了整个 package/port。 软件包的管理 packages managing &man.pkg.info.1; 是用于列出已安装的所有软件包列表和描述的程序。 pkg_info &prompt.root; pkg_info cvsup-16.1 A general network file distribution system optimized for CV docbook-1.2 Meta-port for the different versions of the DocBook DTD ... &man.pkg.version.1;是一个用来统计所有安装的软件包版本的工具。 它可以用来比较本地 package 的版本与 ports 目录中的当前版本是否一致。 pkg_version &prompt.root; pkg_version cvsup = docbook = ... 在第二列的符号指出了安装版本的相关时间和本地ports目录树中可用的版本。 符号 含义 = 在本地ports树中与已安装的软件包版本相匹配。 < 已安装的版本要比在ports树中的版本旧。 >已安装的版本要比在ports树中的版本新 (本地的port树可能没有更新)。 ? 已安装的软件包无法在ports索引中找到。 (可能发生这种事情,举个例子, 您早先安装的一个 port 从 port 树中移出或改名了) *软件包有很多版本。 删除一个软件包 pkg_delete packages deleting 要删除先前安装的软件package,只要使用&man.pkg.delete.1; 工具。 &prompt.root; pkg_delete xchat-1.7.1 其它 所有已安装的 package 信息都保存在 /var/db/pkg 目录下。 安装文件的列表和每个 package 的内容和描述都能在这个目录的相关文件中找到。 使用Ports Collection 下面的几个小节中, 给出了关于如何使用 Ports 套件来在您的系统中安装或卸载程序的介绍。 关于可用的 make targets 以及环境变量的介绍, 可以在 &man.ports.7; 中找到。 获得Ports Collection 在您能使用 ports 之前, 您必须先获得 Ports Collection — 本质上是 /usr/ports 目录下的一堆 Makefile、 补丁和描述文件。 在您安装 FreeBSD 系统的时候, sysinstall 会询问您是否需要安装 Ports Collection。 如果您选择 no, 那您可以用下面的指令来安装 Ports Collection: CVSup 方法 保持您本地 Ports 套件最新的一种快捷的方法, 是使用 CVSup 来进行更新。 如果您希望了解更多关于 CVSup 的细节, 请参见 使用 CVSup。 + + csup 是用 C 语言对 CVSup 软件的重写, 在 &os; 6.2 + 和更高版本中, 作为系统的一部分提供。 您可以直接使用系统附带的 + csup 而跳过 #1 这一步, + 并将这份文档余下部分中的 + CVSup 命令改为 + csup。 对于较早版本而言, + 可以使用 net/csup + port 或预编译包来安装 csup + + 在首次运行 CVSup 之前, 务必确认 /usr/ports 是空的! 如果您之前已经用其他地方安装了一份 Ports 套件, 则 CVSup 可能不会自动删除已经在上游服务器上删除掉的补丁文件。 安装 net/cvsup-without-gui 软件包: &prompt.root; pkg_add -r cvsup-without-gui 请参见 如何安装 CVSup () 以了解更多细节。 运行 cvsup &prompt.root; cvsup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile cvsup.FreeBSD.org 改为离您较近的 CVSup 服务器。 请参见 CVSup 镜像 () 中的镜像站点完整列表。 有时可能希望使用自己的 ports-supfile, 比如说, 不想每次都通过命令行来指定所使用的 CVSup 服务器。 这种情况下, 需要以 root 身份将 /usr/share/examples/cvsup/ports-supfile 复制到新的位置, 例如 /root 或您的主目录。 编辑 ports-supfile CHANGE_THIS.FreeBSD.org 修改成离您较近的 CVSup 服务器。 可以参考 CVSup 镜像 () 中的镜像站点完整列表。 接下来按如下的方式运行 cvsup &prompt.root; cvsup -L 2 /root/ports-supfile 此后运行 &man.cvsup.1; 命令将下载最近所进行的改动, 并将它们应用到您的 Ports Collection 上, 不过这一过程并不重新联编您系统上的 ports。 Portsnap 方式 Portsnap 是另一种用于发布 Ports 套件的方法。 它最早从 &os; 6.0 开始引入。 在较早的系统中, 您可以通过 sysutils/portsnap package 来安装它: + role="package">ports-mgmt/portsnap package 来安装它: &prompt.root; pkg_add -r portsnap 请参见 使用 Portsnap 以了解关于全部 Portsnap 功能的详细描述。 如果您使用 &os; 6.1-RELEASE, 或通过 port 或 package 安装了较新版本的 Portsnap 的话, 可以直接跳过这一步。 /usr/ports 将在首次使用 &man.portsnap.8; 命令时自动创建。 而如果您使用的是较早期版本的 Portsnap, 就只能手工创建空的 /usr/ports 目录了。 &prompt.root; mkdir /usr/ports 下载压缩的 Ports 套件快照到 /var/db/portsnap。 您可以根据需要在这之后关闭 Internet 连接。 &prompt.root; portsnap fetch 假如您是首次运行 Portsnap, 则需要将快照释放到 /usr/ports &prompt.root; portsnap extract 如果您已经有装好的 /usr/ports 而您只想更新, 则应执行下面的命令: &prompt.root; portsnap update Sysinstall 方式 这种方法需要使用 sysinstall 从安装介质上安装 Ports 套件。 注意, 安装的将是发布发行版时的旧版 Ports 套件。 如果您能访问 Internet, 应使用前面介绍的方法之一。 root 身份运行 sysinstall (对 &os; 5.2 之前的版本, 应执行 /stand/sysinstall): &prompt.root; sysinstall 用光标向下选择 Configure, 并按 Enter 向下并选择 Distributions, 按 Enter 选择 ports, 并按 Space 选择 Exit, 并按 Enter 选择所希望的安装介质, 例如 CDROM、 FTP, 等等。 选择 Exit 并按 Enter X 退出 sysinstall 安装 Ports ports 安装 当提到 Ports Collection 时, 第一个要说明的就是何谓 skeleton。 简单地说, port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含: 一个 MakefileMakefile 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。 一个 distinfo 文件。这个文件包括这些信息: 这些文件用来对下载后的文件校验和进行检查, 使用 &man.md5.1; 来确保在下载过程中文件没有被破坏。 一个 files 目录。 这个目录包括在 FreeBSD 系统上编译和安装程序需要用到的补丁。 这些补丁基本上都是些小文件, 指出特定文件作了哪些修正。 它们都是纯文本的的格式,基本上是这样的 删除第 10 行将第 26 行改为这样 ..., 补丁文件也被称作 diffs, 他们由 &man.diff.1; 程序生成。 这个目录也包含了在编译 port 时要用到的其它文件。 一个 pkg-descr 文件。 这是一个提供更多细节,有软件的多行描述。 一个 pkg-plist 文件。 这是即将被安装的所有文件的列表。它告诉 ports 系统在卸载时需要删除哪些文件。 一些ports还有些其它的文件, 例如 pkg-message。 ports 系统在一些特殊情况下会用到这些文件。 如果您想知道这些文件更多的细节以及 ports 的概要, 请参阅 FreeBSD Porter's Handbook port里面包含着如何编译源代码的指令, 但不包含真正的源代码。 您可以在网上或 CD-ROM 上获得源代码。 源代码可能被开发者发布成任何格式。 一般来说应该是一个被 tar 和 gzip 过的文件, 或者是被一些其他的工具压缩或未压缩的文件。 ports中这个程序源代码标示文件叫 distfile, 安装 &os; port的方法还不止这两种。 您必须使用 root 用户登录后安装 ports。 在安装任何 port 之前, 应该首先确保已经更新到了最新的 Ports Collection, 并检查 中是否有与那个 port 有关的安全问题。 在安装应用程序之前, 可以使用 portaudit 来自动地检查是否存在已知的安全问题。 这个工具同样可以在 Ports Collection (security/portaudit) 中找到。 + role="package">ports-mgmt/portaudit) 中找到。 在安装新的 port 之前, 可以考虑先运行一下 portaudit -F 来抓取最新的漏洞数据库。 在每天的周期性系统安全检察时, 数据库会被自动更新, 并且会在这之后实施安全审计。 欲了解进一步的情况,请参阅 &man.portaudit.1; 和 &man.periodic.8;。 Ports 套件假定您有可用的 Internet 连接。 如果您没有, 则需要将 distfile 手工放到 /usr/ports/distfiles 中。 要开始操作, 首先进入要安装 port 的目录: &prompt.root; cd /usr/ports/sysutils/lsof 一旦进入了 lsof 的目录,您将会看到这个port的结构。 下一步就是 make,或说 联编 这个 port。 只需在命令行简单地输入 make 命令就可轻松完成这一工作。 做好之后,您可以看到下面的信息: &prompt.root; make >> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/. >> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/. ===> Extracting for lsof-4.57 ... [extraction output snipped] ... >> Checksum OK for lsof_4.57D.freebsd.tar.gz. ===> Patching for lsof-4.57 ===> Applying FreeBSD patches for lsof-4.57 ===> Configuring for lsof-4.57 ... [configure output snipped] ... ===> Building for lsof-4.57 ... [compilation output snipped] ... &prompt.root; 注意,一旦编译完成,您就会回到命令行。 下一步安装 port, 要安装它只需要在 make 命令后跟上一个单词 install 即可: &prompt.root; make install ===> Installing for lsof-4.57 ... [installation output snipped] ... ===> Generating temporary packing list ===> Compressing manual pages for lsof-4.57 ===> Registering installation for lsof-4.57 ===> SECURITY NOTE: This port has installed the following binaries which execute with increased privileges. &prompt.root; 一旦您返回到提示符,您就可以运行您刚刚安装的程序了。因为 lsof 是一个赋予特殊权限的程序, 因此显示了一个安全警告。 在编译和安装 ports 的时候, 您应该留意任何出现的警告。 删除工作目录是个好主意, 这个目录中包含了全部在编译过程中用到的临时文件。 这些文件不仅会占用宝贵的磁盘空间, 而且可能会给升级新版本的 port 时带来麻烦。 &prompt.root; make clean ===> Cleaning for lsof-4.57 &prompt.root; 使用 make install clean 可以一步完成 makemake installmake clean 这三个分开的步骤的工作。 一些 shell 会缓存环境变量 PATH 中指定的目录里的可执行文件, 以加速查找它们的速度。 如果您使用的是这类 shell, 在安装 port 之后可能需要执行 rehash 命令, 然后才能运行新安装的那些命令。 这个命令可以在类似 tcsh 的 shell 中使用。 对于类似 sh 的 shell, 对应的命令是 hash -r。 请参见您的 shell 的文档以了解进一步的情况。 某些第三方 DVD-ROM 产品, 如 FreeBSD Mall 的 FreeBSD Toolkit 中包含了 distfiles。 这些文件可以与 Ports 套件配合使用。 将 DVD-ROM 挂接到 /cdrom。 如果您使用不同的挂接点, 则应设置 make 变量 CD_MOUNTPTS。 如果盘上有需要的 distfiles, 则会自动使用。 请注意, 少数 ports 并不允许通过 CD-ROM 发行。 这可能是由于下载之前需要填写注册表格, 或者不允许再次发布, 或者有一些其它原因。 如果您希望安装在 CD-ROM 上没有的 port, 就需要在线操作了。 ports 系统使用 &man.fetch.1; 去下载文件, 它有很多可以设置的环境变量, 其中包括 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您在防火墙之后,或使用 FTP/HTTP代理, 您就可能需要设置它们。 完整的说明请看 &man.fetch.3;。 当使用者不是所有时间都能连接上网络, 则可以利用 make fetch。 您只要在顶层目录 (/usr/ports) 下运行这个命令, 所有需要的文件都将被下载。 这个命令也同样可以在下级类别目录中使用, 例如: /usr/ports/net。 注意, 如果一个port有一些依赖的库或其他 port, 它将 下载这些依赖的 port 的 distfile 文件, 如果您想获取所有依赖的 port 的所有 distfile, 请用 fetch-recursive 命令代替 fetch命令。 您可以在一个类别或在顶级目录编译所有的 port, 或者使用上述提到的 make fetch命令。 这样是非常危险的, 因为有一些port不能并存。 或者有另一种可能, 一些port会安装两个不同的文件, 但是却是相同的文件名。 在一些罕见的例子中, 用户可能需要在除了 MASTER_SITES 以外的一个站点(本地已经下载下来的文件)去获得一个文件包。 您可以用以下命令不使用 MASTER_SITES: &prompt.root; cd /usr/ports/directory &prompt.root; make MASTER_SITE_OVERRIDE= \ ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch 在这个例子中,我们把 MASTER_SITES这个选项改为了 ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ 一些 port 允许 (或甚至要求) 您指定编译选项来 启用/禁用 应用程序中非必需的功能, 一些安全选项, 以及其他可以订制的内容。 具有代表性的包括 www/mozillasecurity/gpgme、 以及 mail/sylpheed-claws。 如果存在这样的选项, 通常会在编译时给出提示。 改变默认的 Ports 目录 有时, 使用不同的工作临时目录和目标目录可能很有用 (甚至是必要的)。 可以用 WRKDIRPREFIXPREFIX 这两个变量来改变默认的目录。 例如: &prompt.root; make WRKDIRPREFIX=/usr/home/example/ports install 将把编译 /usr/home/example/ports 中的 port 并把所有的文件安装到 /usr/local &prompt.root; make PREFIX=/usr/home/example/local install 将在 /usr/ports 编译它并安装到 /usr/home/example/local 当然, &prompt.root; make WRKDIRPREFIX=../ports PREFIX=../local install 将包含两种设置 (没有办法在这一页把它写完, 但您应该已经知道怎么回事了)。 另外, 这些变量也可以作为环境变量来设置。 请参考您的 shell 的联机手册上关于如何设置环境变量的说明。 处理 <command>imake</command> 一些 port 使用 imake (这是 X Window 系统的一部分) 不能正常地配合 PREFIX, 它们会坚持把文件安装到 /usr/X11R6 下面。 类似地, 一些 Perl port 会忽略 PREFIX 并把文件安装到 Perl 的目录中。 让这些 port 尊重 PREFIX 是困难甚至是不可能的事情。 卸载已经安装的 Ports ports 卸载 现在您已经了解了如何安装 ports, 并希望进一步了解如何卸载, 特别是在安装了某个之后发现不合适的 port 时。 我们将卸载前面例子 (假如您没有注意的话, 是 lsof) 中安装的 port。 Ports 可以同 packages 以完全相同的方式 (在 Packages 一节 中进行了介绍) 卸载, 方法是使用 &man.pkg.delete.1; 命令: &prompt.root; pkg_delete lsof-4.57 升级 Ports ports 升级 首先, 使用 &man.pkg.version.1; 命令来列出 Ports Collection 中提供了更新版本的那些 port: &prompt.root; pkg_version -v <filename>/usr/ports/UPDATING</filename> 在您更新了 Ports 套件之后, 在升级 port 之前, 应查看 /usr/ports/UPDATING。 这个文件中介绍了在升级时用户应注意的问题, 以及一些可能需要进行的操作。 这可能包括更改文件格式、 配置文件位置的变动, 以及与先前版本的兼容性等等。 如果 UPDATING 与本书中介绍的内容不同, 请以 UPDATING 为准。 使用 Portupgrade 来更新 Ports portupgrade portupgrade 工具是设计来简化升级已安装的 port 的操作的。 它通过 sysutils/portupgrade port 来提供。 + role="package">ports-mgmt/portupgrade port 来提供。 您可以像其它 port 那样, 使用 make install clean 命令来安装它: - &prompt.root; cd /usr/ports/sysutils/portupgrade + &prompt.root; cd /usr/ports/ports-mgmt/portupgrade &prompt.root; make install clean 使用 pkgdb -F 命令来扫描已安装的 port 的列表, 并修正其所报告的不一致。 在每次升级之前, 有规律地执行它是个好主意。 运行 portupgrade -a 时, portupgrade 将开始并升级系统中所安装的所有过时的 ports。 如果您希望在每个升级操作时得到确认, 应指定 参数。 &prompt.root; portupgrade -ai 如果您只希望升级某个特定的应用程序, 而非全部可用的 port, 应使用 portupgrade pkgname。 如果 portupgrade 应首先升级指定应用程序的话, 则应指定 参数。 &prompt.root; portupgrade -R firefox 要使用预编译的 package 而不是 ports 来进行安装, 需要指定 。 如果指定了这个选项, portupgrade 会搜索 PKG_PATH 中指定的本地目录, 如果没有找到, 则从远程站点下载。 如果本地没有找到, 而且远程站点也没有成功地下载预编译包, 则 portupgrade 将使用 ports。 要禁止使用 port, 可以指定 &prompt.root; portupgrade -PR gnome2 如果只想下载 distfiles (或者, 如果指定了 的话, 是 packages) 而不想构建或安装任何东西, 可以使用 。 要了解更多细节, 请参考 &man.portupgrade.1;。 使用 Portmanager 来升级 Ports portmanager Portmanager 是另一个用以简化已安装 port 升级操作的工具。 它可以通过 - sysutils/portmanager port 安装: + ports-mgmt/portmanager port 安装: - &prompt.root; cd /usr/ports/sysutils/portmanager + &prompt.root; cd /usr/ports/ports-mgmt/portmanager &prompt.root; make install clean 可以通过这个简单的命令来升级所有已安装的 port: &prompt.root; portmanager -u 如果希望 Portmanager 在进行每步操作之前都给出提示, 应使用 参数。 Portmanager 也可以用来在系统中安装新的 ports。 与通常的 make install clean 命令不同, 它会在联编和安装您所选择的 port 之前升级所有依赖包。 &prompt.root; portmanager x11/gnome2 如果关于所选 port 的依赖有任何问题, 可以用 Portmanager 来以正确的顺序重新构建它们。 完成之后, 有问题的 port 也将被重新构建。 &prompt.root; portmanager graphics/gimp -f 要了解更多信息, 请参见 Portmanager 联机手册。 Ports 和磁盘空间 ports disk-space 使用 Ports 套件会最终用完磁盘空间。 在通过 ports 联编和安装软件之后, 您应记得清理临时的 work 目录, 其方法是使用 make clean 命令。 您可以使用下面的命令来清理整个 Ports 套件: &prompt.root; portsclean -C 随着时间的推移, 您可能会在 distfiles 目录中积累下大量源代码文件。 您可以手工删除这些文件, 也可以使用下面的命令来删除所有 port 都不引用的文件: &prompt.root; portsclean -D 除此之外, 也可以用下列命令删去目前安装的 port 没有使用的源码包文件: &prompt.root; portsclean -DD 这个 portsclean 工具是 portupgrade 套件的一部分。 不要忘记删除那些已经安装, 但已不再使用的 ports。 用于自动完成这种工作的一个好工具是 - sysutils/pkg_cutleaves port。 + ports-mgmt/pkg_cutleaves port。 - 安装之后的待办事宜 - + 安装之后还要做点什么? 通常,您通过port安装完一个软件后,可以阅读它带的一些文档(如果它包含文档的话), 或需要编辑它的配置文件,来确保这个软件的运行, 或在机器启动的时候启动(如果它是一个服务的话),等等。 对于不同的软件有着不同的配置步骤。不管怎样, 如果您装好了一个软件,但是不知道下一步怎么办的时候, 这些小技巧可能可以帮助您: 使用 &man.pkg.info.1; 命令,它能找到安装了哪些文件,以及装在哪里。 举个例子,如果您安装了 FooPackage version 1.0.0, 那么这个命令 &prompt.root; pkg_info -L foopackage-1.0.0 | less 将显示这个软件包安装的所有文件,您要特别注意在man/目录里面的文件, 它们可能是手册,etc/目录里面的配置文件,以及 doc/目录下面更多的文档。 如果您不确定已经安装好的软件版本,您可以使用这样的命令 &prompt.root; pkg_info | grep -i foopackage 它将会找到所有已安装的软件包名字中包含foopackage 的软件包。 对于其他的查找, 您只需要在命令行中替换 foopackage 一旦一些软件手册已被您确认安装,您可以使用 &man.man.1; 查看它。 同样的,如果有的话,您还可以完整的查看一遍配置文件的示例,以及任何额外的文档。 如果应用软件有网站, 您还可以从网站上找到文档,常见问题的解答,或其他更多。 如果您不知道它们的网站地址,请使用下面的命令 &prompt.root; pkg_info foopackage-1.0.0 一个 WWW: 行, 如果它存在, 它将提供一个这个应用程序的网站URL. Ports 如果需要在服务器启动时运行(就像互联网服务器), 它通常会把一个脚本的样例放入 /usr/local/etc/rc.d 目录。为了保证正确性, 您可以查看这个脚本, 并编辑或更改这个脚本的名字。 详情请看启动服务。 如何处理坏掉的 Ports 如果您发现某个 port 无法正常工作, 有几件事值得尝试, 包括: 问题报告数据库 中查找是否有尚未提交的修正。 如果有, 可以使用所提议的修正。 要求 port 的监护人 (maintainer) 提供帮助。 输入 make maintainer 或阅读 Makefile 查找监护人的电子邮件地址。 请记得把 port 的名字和版本写在邮件里 (Makefile 中的 $FreeBSD:这一行) 并把错误输出的头几行发给 maintainer。 某些 ports 并非一个人维护, 而是写了一个 邮件列表。 许多, 但并非所有 port, 使用类似 freebsd-listname@FreeBSD.org 这样的地址。 请在提出问题时考虑这一点。 特别地, 由 freebsd-ports@FreeBSD.org 监护的 port, 实际上并没有人维护。 订阅这个邮件列表的人们会感谢您提供的修正和支持。 我们一直都需要更多志愿者! 如果您没有得到回应, 则可以使用 &man.send-pr.1; 来提交问题报告 (请参见 如何撰写 FreeBSD 问题报告)。 修正它! Porter 手册 中提供了关于 Ports 基础设施的详细信息, 通过了解这些内容, 您就能修正偶然坏掉的 port, 或甚至提交自己的 port 了! 从较近的 FTP 站点下载一个编译好的安装包。 中央的 package collection 在 ftp.FreeBSD.orgpackages 目录中, 但 在此之前 一定记得先看看 本地镜像 上是否已经有了! 通常情况下这些安装包都可以直接使用, 而且应该比自行编译快一些。 安装过程本身可以通过 &man.pkg.add.1; 来完成。 diff --git a/zh_CN.GB2312/books/handbook/security/chapter.sgml b/zh_CN.GB2312/books/handbook/security/chapter.sgml index 430672e1ec..afbc92bf56 100644 --- a/zh_CN.GB2312/books/handbook/security/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/security/chapter.sgml @@ -1,4427 +1,4427 @@ Matthew Dillon 这一章的许多内容来自 security(7) 联机手册,其作者是 安全 security 概述 这一章将对系统安全的基本概念进行介绍, 除此之外, 还将介绍一些好的习惯, 以及 &os; 下的一些更深入的话题。 这章的许多内容对于一般的系统和 Internet 安全也适用。 如今, Internet 已经不再像以前那样是一个人人都愿意与您作好邻居的 友善 的地方。 让系统更加安全, 将保护您的数据、 智力财产、 时间, 以及其他很多东西不至于被入侵者或心存恶意的人所窃取。 &os; 提供了一系列工具和机制来保证您的系统和网络的完整及安全。 读完这章,您将了解: 基本的 &os; 系统安全概念。 &os; 中众多可用的密码学设施,例如 DESMD5 如何设置一次性口令验证机制。 如何配置 TCP Wrappers 以便与 inetd 配合使用。 如何在 &os; 5.0 以前的版本上设置 KerberosIV 如何在 &os; 上设置 Kerberos5 如何配置 IPsec 并在 &os;/&windows; 机器之间建构 VPN 如何配置并使用 OpenSSH,以及 &os; 的 SSH 执行方式。 系统 ACL 的概念,以及如何使用它们。 如何使用 Portaudit 工具来审核从 Ports Collection 安装的第三方软件包的安全性。 如何从 &os; 的安全公告中获得有用信息并采取相应措施。 对于进程记帐功能的感性认识, 并了解如何在 &os; 中启用它。 在开始阅读这章之前,您需要: 理解基本的 &os; 和 Internet 概念。 其他安全方面的话题, 则贯穿本书的始终。 例如, 强制性访问控制 (MAC) 在 中进行了介绍, 而 Internet 防火墙则在 中进行了讨论。 介绍 安全是系统管理员自始至终的基本要求。 由于所有的 BSD &unix; 多用户系统都提供了与生俱来的安全性, 因此建立和维护额外的安全机制, 确保用户的 诚实 可能也就是最需要系统管理员考虑的艰巨的工作了。 机器的安全性取决于您设置的安全设施, 而许多安全方面的考虑, 则会与人们使用计算机时的便利性相矛盾。 一般来说, &unix; 系统能够胜任数目众多进程并发地处理各类任务, 这其中的许多进程是以服务身份运行的 — 这意味着, 外部实体能够与它们互联并产生会话交互。 如今的桌面系统, 已经能够达到许多昔日的小型机甚至主机的性能, 而随着这些计算机的联网和在更大范围内完成互联, 安全也成为了一个日益严峻的课题。 系统的安全也应能够应付各种形式的攻击, 这也包括那些使系统崩溃, 或阻止其正常运转, 但并不试图窃取 root 帐号 (破译 root) 的攻击形式。 安全问题大体可分为以下几类: 拒绝服务攻击。 窃取其他用户的帐户。 通过可访问服务窃取root帐户。 通过用户帐户窃取root帐户。 建立后门。 DoS 攻击 拒绝服务攻击 (DoS) 安全 DoS 攻击 拒绝服务攻击 (DoS) 拒绝服务攻击 (DoS) 拒绝式服务攻击是侵占机器所需资源的一种行为。 通常, DoS 攻击采用暴力(brute-force)手段通过压倒性的流量来破坏服务器和网络栈, 以使机器崩溃或无法使用。 某些 DoS 攻击则利用在网络栈中的错误, 仅用一个简单的信息包就可以让机器崩溃, 这类情况通常只能通过给内核打补丁来修复。 在一些不利的条件下, 对服务器的攻击能够被修复, 只要适当地修改一下系统的选项来限制系统对服务器的负荷。 顽强的网络攻击是很难对付的。 例如,一个欺骗性信息包的攻击, 无法阻止入侵者切断您的系统与Internet的连接。 它不会使您的机器死掉,但它会把Internet连接占满。 security 窃取用户帐户 窃取用户帐户要比D.o.S.攻击更加普遍。 许多系统管理员仍然在他们的服务器上运行着基本的 telnetdrlogindrshdftpd 服务。 这些服务在默认情况下不会以加密连接来操作。 结果是如果您的系统有中等规模大小的用户群, 在通过远程登录的方式登录到您系统的用户中, 一些人的口令会被人窃取。 仔细的系统管理员会从那些成功登录系统的远程访问日志中寻找可疑的源地址。 通常必须假定,如果一个入侵者已经访问到了一个用户的帐户, 那么它就可能使自己成为 root。 然而, 事实是在一个安全和维护做得很好的系统中, 访问用户的帐户不一定会让入侵者成为 root。 这个差别是很重要的,因为没有成为 root 则入侵者通常是无法隐藏它的轨迹的, 而且, 如果走运的话, 除了让用户的文件乱掉和系统崩溃之外, 它不能做什么别的事情。 窃取用户帐户是很普遍的事情, 因为用户往往不会对系统管理员的警告采取措施。 security 后门 系统管理员必须牢牢记住,可能有许多潜在的方法会使他们机器上的 root 用户受到威胁。入侵者可能知道 root 的口令,而如果在以 root 权限运行的服务器上找到一个缺陷 (bug), 就可以通过网络连接到那台服务器上达到目的;另外, 一旦入侵者已经侵入了一个用户的帐户, 可以在自己的机器上运行一个 suid-root 程序来发现服务器的漏洞, 从而让他侵入到服务器并获取 root。 攻击者找到了入侵一台机器上 root 的途径之后, 他们就不再需要安装后门了。许多 root 漏洞被发现并修正之后, 入侵者会想尽办法去删除日志来消除自己的访问痕迹, 所以他们会安装后门。 后门能给入侵者提供一个简单的方法来重新获取访问系统的 root 权限, 但它也会给聪明的系统管理员一个检测入侵的简便方法。 让入侵者无法安装后门事实上对您的系统安全是有害的, 因为这样并不会修复那些侵入系统的入侵者所发现的新漏洞。 安全的管理方法应当使用像 洋葱皮 一样多层次的方法来实现, 这些措施可以按下面的方式进行分类: 确保 root 和维护人员帐户的安全。 确保 root – 以root用户权限运行的服务器和suid/sgid可执行程序的安全。 确保用户帐户的安全。 确保口令文件的安全。 确保内核中核心组件、直接访问设备和文件系统的安全。 快速检测系统中发生的不适当的变化。 做个偏执狂。 这一章的下一节将比较深入地讲述上面提到的每一个条目。 确保 &os; 的安全 security 确保 &os; 的安全 命令与协议 在这份文档中,我们使用 粗体 来表示应用程序, 并使用 单倍距 字体来表示命令。 这样的排版区分能够有效地区分类似 ssh 这样的概念, 因为它既可以表示命令,又可以表示协议。 接下来的几节中, 将介绍在这一章中 前一节 中所介绍的那些加强 &os; 系统安全性的手段。 确保 <username>root</username> 和维护人员帐户的安全 su 首先,如果您没有确保 root 帐户的安全, 就没必要先劳神确保用户帐户的安全了。绝大多数系统都会指派一个口令给 root 帐户。 我们的第一个假定是,口令 总是 不安全的。 这并不意味着您要把口令删掉。 口令通常对访问机器的控制台来说是必须的。 也就是说, 您应该避免允许在控制台以外的地方使用口令, 甚至包括使用 &man.su.1; 命令的情形。 例如,确信您的 pty 终端在 /etc/ttys 文件中被指定为 insecure (不安全),这将使直接通过 telnetrlogin 登录 root 会不被接受。 如果使用如 sshd 这样的其他登录服务, 也要确认直接登录 root 是关闭的。您可以通过编辑 /etc/ssh/sshd_config 文件来做到这一点,确信 PermitRootLogin 被设置成 NO。 考虑到每一种访问方法 — 如FTP这样的服务, 以免因为它们而导致安全性的损失。 直接登录 root 只有通过系统控制台才被允许。 wheel 当然, 作为一个系统管理员, 您应当获得 root身份, 因此, 我们开了一些后门来允许自己进入。 但这些后门只有在经过了额外的口令确认之后才能使用。 一种让 root 可访问的方法是增加适当的用户帐户到 wheel 组 (在 /etc/group 中)。wheel 组中的用户成员可以使用 su 命令来成为 root。 绝对不应该通过在口令项中进行设置来赋予维护人员天然的 wheel 组成员身份。 维护人员应被放置在 staff 组中,然后通过 /etc/group 文件加入到 wheel 组。事实上,只有那些需要以 root 身份进行操作的用户才需要放进 wheel 组中。 当然,也可以通过 某种其它的验证手段,例如 Kerberos,可以通过 root 帐户中的 .k5login 文件来允许执行 &man.ksu.1; 成为 root ,而不必把它们放进 wheel 组。 这可能是一种更好的解决方案, 因为 wheel 机制仍然可能导致入侵者获得 root ,如果他拿到了口令文件,并能够进入职员的帐户。 尽管有 wheel 比什么都没有要强一些, 但它并不是一种绝对安全的办法。 一种间接地提高员工帐号, 乃至 root 权限安全性的方法, 便是采用其他的登录访问方式, 并使用 星号 替代员工加密的口令。使用 &man.vipw.8; 命令, 可以把每一个加密的口令替换成一个 * 符。 这将更新 /etc/master.passwd 文件,以及 用户名/口令数据库,以禁用口令登录。 如下面的员工帐号 foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 应被改为: foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 这一更改将阻止一般的登录,因为加密的口令永远不会与 * 匹配。一旦这么做之后, 任何员工都必须使用其他的方式来完成登录,例如,使用 &man.kerberos.1; 或者通过 &man.ssh.1; 利用 公钥/密钥对 的方式来完成登录。当使用 Kerberos 这样的工具时,通常必须加强运行 Kerberos 的服务器,以及桌面工作站的安全性。当使用 公钥/密钥对以 ssh 登录时,通常必须加固用户 开始 登录的那台机器的安全 (通常这是他们的工作站)。 在这之上还可以增加一层安全性,即在使用 &man.ssh-keygen.1; 生成它的时候,使用口令来保护它们。 如果能够用 星号 替换掉所有员工的口令, 那么,这也就保证了他们只能通过您设置的安全的方法来登录。 这将迫使所有的员工使用安全的、经过加密的连接来完成他们的会话, 而这将使得入侵者通过监听网络通讯, 从某些不相关的、 不太安全的机器上窃取口令成为不可能。 另一种间接的安全机制则是, 从严格受限的机器向限制更宽松的机器上登录。 例如, 如果您的服务器运行了所有的服务,那么,工作站应该什么都不运行。 为了让工作站尽可能地安全,应该避免运行任何没有必要的服务, 甚至不运行任何服务。 另外, 也应该考虑使用带口令保护功能的屏幕保护程序。 毋庸置疑, 如果攻击者能够物理地接触您的工作站, 那么他就有能力破坏任何安全设施,这确实是我们需要考虑的一个问题,但同样地, 真正能够物理接触您的工作站或服务器并实施攻击的人在现实生活中并不常见, 绝大多数攻击来自于网络, 而攻击者往往无法物理地接触服务器或工作站。 KerberosIV 使用类似 Kerberos 这样的工具,也为我们提供了使用一个工具来禁用某个用户, 或修改他们的口令, 并在所有机器上立即生效的方法。 如果员工的帐号被窃取, 能够在所有的其他机器上生效的口令变更将很有意义。如果口令分散地保存在多个机器上, 一次修改 N 台机器上的口令很可能是一件痛苦的事情。 此外, Kerberos 还能够提供更多的限制,除了 Kerberos 令牌有很好的过期机制之外, 它还能够强制用户在某个特定的期限内修改口令(比如说,每月一次). 确保以root用户权限运行的服务器和suid/sgid可执行程序的安全 ntalk comsat finger sandboxes sshd telnetd rshd rlogind 谨慎的管理员只运行他们需要的服务, 不多, 不少。 要当心第三方的服务程序很可能有更多的问题。 例如, 运行旧版的 imapdpopper 无异于将 root 令牌拱手送给全世界的攻击者。 永远不要运行那些您没有仔细检查过的服务程序, 另外也要知道, 许多服务程序并不需要以 root 的身份运行。 例如, ntalkcomsat, 以及 finger 这些服务, 都能够以一种被称作 沙盒 的特殊用户的身份运行。 除非您已经解决掉了许多麻烦的问题, 否则沙盒就不是完美的, 但洋葱式安全规则仍然成立: 如果有人设法攻破了在沙盒中运行的程序, 那么在做更多坏事之前, 他们还必须想办法攻破沙盒本身的限制。 攻击者需要攻破的层次越多, 他们成功的可能性就越小。 过去, 破解 root 的漏洞几乎在所有以 root 身份运行的服务上都发现过, 包括那些基本的系统服务。 如果您的机器只打算向外界提供 sshd 登录, 而用户不会使用 telnetdrshd 甚至 rlogind 登录, 就应该毫不犹豫地关闭它们! &os; 现在默认在沙盒中运行 ntalkd, comsat, 以及 finger。此外, &man.named.8; 也可以这样运行。 /etc/defaults/rc.conf 中包括了如何如此运行 named 的方法,只是这些内容被注释掉了。 如何升级或安装系统将决定这些沙盒所使用的特殊用户是否被自动安装。 谨慎的系统管理员将根据需要研究并实现沙盒。 sendmail 此外,还有一些服务通常并不在沙盒中运行: sendmail, popper, imapd, ftpd, 以及一些其他的服务。当然,它们有一些替代品,但安装那些服务可能需要做更多额外的工作。 可能必须以 root 身份运行这些程序, 并通过其他机制来检测入侵。 系统中另一个比较大的 root 漏洞 是安装在其中的 suid-root 和 sgid 的可执行文件。绝大多数这类程序, 例如 rlogin, 被存放于 /bin, /sbin, /usr/bin, 或 /usr/sbin 中。 尽管并没有 100% 的安全保证,但系统默认的 suid 和 sgid 可执行文件通常是相对安全的。 当然,偶尔也会发现一些存在于这些可执行文件中的 root 漏洞。1998年,Xlib 中发现了一处 root 漏洞,这使得 xterm (通常是做了suid的) 变得可以入侵。 做得安全些, 总比出现问题再后悔要强。 因此,谨慎的管理员通常会限制 suid 可执行文件, 并保证只有员工帐号能够执行它们,或只开放给特定的用户组,甚至彻底干掉 (chmod 000) 任何 suid 可执行文件, 以至于没有人能够执行它们。没有显示设备的服务器通常不会需要 xterm 可执行文件。 sgid 可执行文件通常同样地危险。 一旦入侵者攻克了sgid-kmem,那么他就能够读取 /dev/kmem 并进而读取经过加密的口令文件, 从而窃取任何包含口令的帐号。另外,攻破了 kmem 的入侵者能够监视通过 pty 传送的按键序列,即使用户使用的是安全的登录方式。 攻破了 tty 组的用户则能够向几乎所有用户的 tty 写入数据。如果用户正在运行一个终端程序,或包含了键盘模拟功能的终端仿真程序, 那么,入侵者能够以那个用户的身份执行任何命令。 确保用户帐户的安全 用户帐号的安全通常是最难保证的。虽然您可以为您的员工设置严苛的登录限制, 并用 星号 替换掉他们的口令, 但您可能无法对普通的用户这么做。 如果有足够的决策权, 那么在保证用户帐号安全的斗争中或许会处于优势, 但如果不是这样, 您能做的只是警惕地监控这些帐号的异动。 让用户使用 ssh 或 Kerberos 可能会有更多的问题, 因为需要更多的管理和技术支持, 尽管如此, 与使用加密的口令文件相比, 这仍不失为一个好办法。 确保口令文件的安全 能够确保起作用的唯一一种方法, 是将口令文件中尽可能多的口令用星号代替, 并通过 ssh 或 Kerberos 来使用这些账号。 即使只有 root 用户能够读取加密过的口令文件 (/etc/spwd.db), 入侵者仍然可能设法读到它的内容, 即使他暂时还无法写入这个文件。 您的安全脚本应该经常检查并报告口令文件的异动 (参见后面的 检查文件完整性 一节)。 确保内核中内核设备、直接访问设备和文件系统的安全 如果攻击者已经拿到了 root 那么他就有能力作任何事情, 当然, 有一些事情是他们比较喜欢干的。 例如, 绝大多数现代的内核都包括一个内建的听包设备。 在 &os; 中,这个设备被称作 bpf 。攻击者通常会尝试在攻克的系统上运行它。 如果您不需要 bpf 设备提供的功能,那么,就不要把它编入内核。 sysctl 但即使已经关掉了 bpf 设备,您仍然需要担心 /dev/mem/dev/kmem 。 就事论事地说,攻击者仍然能够通过直接访问的方式写入磁盘设备。同样地, 还有一个被称作模块加载器, &man.kldload.8; 的机制,也会包含潜在的危险。 尝试入侵企业网络的入侵者会尝试在正在运行的内核上安装他自己的 bpf 设备,或其他听包设备。为了防止这些问题, 需要抬高内核安全级, 至少调整到 1。 可以通过对 kern.securelevel 执行 sysctl 来完成这个任务。 一旦把安全级调整到1, 对于直接访问设备的写入操作将被拒绝, 而特殊的 chflags 标记, 如 schg, 也将强制执行。 一定要在重要的启动执行文件、 目录和脚本文件上设置 schg 标记 — 不要漏过在安全级生效之前将被运行的任何文件。 这可能做得有些过火, 并将导致在较高安全级上运行时升级系统变得困难。 您也可以略微做些妥协, 即以较高的安全级运行, 但并不将系统文件和目录配置为 schg。 另一种可行的方法是把 //usr 以只读方式挂接。 请注意, 如果保护措施做的过分的严苛, 则可能导致入侵检测无法进行, 而这种检测是安全中十分重要的一环。 检查文件完整性: 可执行文件,配置文件和其他文件 当实施严格的限制时,往往会在使用的方便性上付出代价。例如,使用 chflags 来把 schg 标记 应用到 //usr 中的绝大多数文件上可能会起到反作用, 因为尽管它能够保护那些文件, 但同时也使入侵检测无法进行。 层次化安全的最后一层可能也是最重要的 — 检测。 如果无法检测出潜在的入侵行为, 那么安全的其他部分可能相对来讲意义可能就不那么大了 (或者,更糟糕的事情是, 那些措施会给您安全的假象)。 层次化安全最重要的功能是减缓入侵者, 而不是彻底不让他们入侵, 这样才可能当场抓住入侵者。 检测入侵的一种好办法是查找那些被修改、 删除或添加的文件。 检测文件修改的最佳方法是与某个 (通常是中央的) 受限访问的系统上的文件进行比对。 在一台严格限制访问的系统上撰写您的安全脚本通常不能够被入侵者察觉, 因此,这非常重要。为了最大限度地发挥这一策略的优势,通常会使用只读的 NFS, 或者设置 ssh 钥匙对以便为其他机器提供访问。除了网络交互之外, NFS可能是一种很难被察觉的方法 — 它允许您监控每一台客户机上的文件系统, 而这种监控几乎是无法察觉的。如果一台严格受限的服务器和客户机是通过交换机连接的, 那么 NFS 将是一种非常好的方式。 不过,如果那台监控服务器和客户机之间通过集线器 (Hub),或经过许多层的路由来连接,则这种方式就很不安全了, 此时,应考虑使用 ssh ,即使这可以在审计记录中查到。 一旦为这个受限的机器赋予了至少读取它应监控的客户系统的权限, 就应该为实际的监控撰写脚本。以 NFS 挂接为例,可以用类似 &man.find.1; 和 &man.md5.1; 这样的命令为基础来完成我们所需的工作。 最好能够每天对被控机的所有执行文件计算一遍 md5,同时,还应以更高的频率测试那些 /etc/usr/local/etc 中的控制文件。一旦发现了不匹配的情形,监控机应立即通知系统管理员。 好的安全脚本也应该检查在系统分区,如 //usr 中是否有新增或删除的可执行文件,以及不适宜的 suid 。 如果打算使用 ssh 来代替 NFS,那么撰写安全脚本将变得困难许多。 本质上,需要在脚本中使用 scp 在客户端复制文件, 另一方面,用于检查的执行文件 (例如 find) 也需要使用 scp 传到客户端,因为 ssh 客户程序很可能已经被攻陷。 总之,在一条不够安全的链路上 ssh 可能是必须的, 但也必须应付它所带来的难题。 安全脚本还应该检查用户以及职员成员的权限设置文件: .rhosts.shosts.ssh/authorized_keys 等等。 这些文件可能并非通过 MD5 来进行检查。 如果您的用户磁盘空间很大, 检查这种分区上面的文件可能非常耗时。 这种情况下, 采用标志来禁止使用 suid 可执行文件和设备在这些文件系统上出现将是一个好主意。 您可能会想看看 nodevnosuid 这两个选项 (参见 &man.mount.8;)。 尽管如此, 这些扫描仍然应该至少每周进行一次, 这样做的意义并不是检测有效的攻击, 而是检查攻击企图。 进程记帐 (参见 &man.accton.8;) 是一种相对成本较低的, 可以帮助您在被入侵后评估损失的机制。 对于找出入侵者是如何进入系统的这件事情来说, 它会非常的有所助益,特别是当入侵者什么文件都没有修改的情况下。 最后, 安全脚本应该处理日志文件, 而日志文件本身应该通过尽可能安全的方法生成 — 远程 syslog 可能非常有用。 入侵者会试图掩盖他们的踪迹, 而日志文件对于希望了解入侵发生时间的系统管理员来说则显得尤为重要。 保持日志文件的永久性记录的一种方法是在串口上运行系统控制台, 并在一台安全的机器上收集这些信息。 偏执 带点偏执不会带来伤害。作为一种惯例, 系统管理员在不影响使用的便利的前提下可以启用任何安全特性,此外, 在经过深思熟虑之后,也可以增加一些 确实会 让使用变得不那么方便的安全特性。 更重要的是,有安全意识的管理员应该学会混合不同的安全策略 — 如果您逐字逐句地按照这份文档来配置您的机器, 那无异于向那些同样能得到这份文档的攻击者透露了更多的信息。 拒绝服务攻击 拒绝服务 (DoS) 这一节将介绍拒绝服务攻击。 DoS 攻击通常是基于数据包的攻击, 尽管几乎没有任何办法来阻止大量的伪造数据包耗尽网络资源, 但通常可以通过一些手段来限制这类攻击的损害,使它们无法击垮服务器: 限制服务进程 fork。 限制 springboard 攻击 (ICMP 响应攻击, ping 广播,等等)。 使内核路由缓存过载。 一种比较常见的 DoS 攻击情形, 是通过攻击复制进程 (fork) 的服务, 使其产生大量子进程, 从而是其运行的机器耗尽内存、 文件描述符等资源, 直到服务器彻底死掉。 inetd (参见 &man.inetd.8;) 提供了许多选项来限制这类攻击。 需要注意的是, 尽管能够阻止一台机器彻底垮掉, 但通常无法防止服务本身被击垮。 请仔细阅读 inetd 的联机手册, 特别是它的 以及 这三个选项。 伪造 IP 攻击能够绕过 inetd 选项, 因此, 这些选项需要配合使用。 某些独立的服务器也有类似的限制参数。 例如, Sendmail 就提供了自己的 选项, 它通常比 Sendmail 的负载限制选项更为有效, 因为服务器负载的计算有滞后性。 您可以在启动 sendmail 时指定一个 MaxDaemonChildren 参数; 把它设的足够高以便承载您所需要的负荷, 当然, 不要高到足以让运行 Sendmail 的机器死掉。 此外, 以队列模式 () 运行 Sendmail 并把服务程序 (sendmail -bd) 和队列执行程序分别执行 (sendmail -q15m) 也是一个好主意。 如果您希望保证队列的实时性, 可以考虑使用更短的间隔, 例如 , 但同时也需要指定一个合理的子进程数, 也就是通过 MaxDaemonChildren 选项以免 那个 Sendmail 造成重叠的故障。 Syslogd 可以被直接地攻击,因此, 强烈建议只要可行,就在启动它的时候加上 参数, 其他情况下,则至少应该加上 对于基于连接的服务,例如 TCP Wrapper 的 reverse-identd, 都应该格外的小心, 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 TCP Wrapper 所提供的 reverse-ident 这样的功能。 此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要, 这些工作可以通过设置边界路由器来完成。 主要的想法, 是阻止来自您的 LAN 以外的访问, 这有助于避免 root 受到攻击。 尽可能配置排他式的防火墙, 例如, 用防火墙阻止所有的网络流量 除了 端口 A、B、 C、D,以及 M-Z。 通过采用这种方法, 您可以很容易地将低端口的访问阻止在外, 而又不难配置使防火墙放过那些明确需要开放的服务, 例如 named (如果您的机器准备作为域的主要解析服务器), ntalkdsendmail,以及其他可以从 Internet 访问的服务。 如果您尝试以其他方式配置防火墙 — 采用比较宽松的策略, 那么您将很有可能忘记 关掉 一两个服务, 或者在增加了一些服务之后忘记更新防火墙策略。 尽管如此, 仍然可以考虑允许让数据进入编号较高的那一部分端口, 这将保证那些需要这样特性的服务能够正常工作, 而又不影响低端口服务的安全性。 此外, 还应注意到 &os; 允许您来控制动态绑定的端口的范围, 即一系列 net.inet.ip.portrange 变量,通过 sysctl 来完成设置。 (sysctl -a | fgrep portrange)。 这使得您完成较复杂的防火墙策略变得易如反掌。 例如, 您可能希望普通的高段端口的起止范围是 4000 到 5000, 而更高范围则是 49152 到 65535, 随后在防火墙中阻止低于 4000 的所有端口 (当然, 除了那些特地为 Internet 访问而开设的端口)。 另一种常被称作 springboard 的攻击也是非常常见的 DoS 攻击 — 它通过使服务器产生其无法处理的响应来达到目的。 最常见的攻击就是 ICMP ping 广播攻击。 攻击者通过伪造 ping 包, 将其源 IP 设置为希望攻击的机器的 IP。 如果您的边界路由器没有进行禁止 ping 广播地址的设置, 则您的网络将最终陷于响应伪造的 ping 包之中, 特别是当攻击者同时使用了多个不同的网络时。 广播攻击能够产生超过 120 兆位的瞬时流量。 另一种常见的针对 ICMP 错误报告系统的 springboard 攻击, 通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源, 并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽内存来使得使得被攻击的服务器崩溃, 特别是当这些服务器无法足够快地完成 ICMP 响应的时候。 较新的内核可以通过调整 sysctl 变量 net.inet.icmp.icmplim 来限制这种攻击。 最后一类主要的 springboard 是针对某些 inetd 的内部服务, 例如 udp echo 服务进行的。 攻击者简单地伪造一个来自服务器 A 的 echo 口的 UDP 包, 然后将这个包发到 B 的 echo 口。 于是, 两台服务器将不停地将包弹给对方。 攻击者能够将两台服务器的这种服务都耗竭, 并且通过这种方式, 只需要很少的包就可以让 LAN 超载。 类似的问题对 chargen 口也是存在的。 好的系统管理员应该关闭这些 inetd 的测试服务。 伪造的包攻击也可以用来使内核的路由缓存过载。 请参考 net.inet.ip.rtexpirertminexpire, 以及 rtmaxcache sysctl 参数。 伪造的包可以用随机的源 IP 攻击, 使得内核在路由表中产生一个临时的缓存项, 它可以通过 netstat -rna | fgrep W3 看到。 这些路由通常需要 1600 秒才会过期。 如果内核发现路由表变得太大, 它会动态地降低 rtexpire 但以 rtminexpire 为限。 这引发了两个问题: 在访问量不大的服务器上, 内核对于突然袭击的反应不够快。 rtminexpire 的值没有低到让内核在此类攻击时活下去的程度。 如果您的服务器通过 T3 或更快的线路接入 Internet, 那么通过 &man.sysctl.8; 来手动地降低 rtexpirertminexpire 就非常必要。 当然,绝不要把它们设置为零 (除非您想让机器崩溃) 将这两个参数设置为 2 通常已经足以抵御这类攻击了。 Kerberos 和 SSH 的访问问题 ssh KerberosIV 如果您打算使用, 那么 Kerberos 和 ssh 都有一些需要解决的问题。 Kerberos 5 是一个很棒的验证协议, 但使用了它的 telnetrlogin 应用程序有一些 bug, 使得它们不适合处理二进制流。 而且, 除非使用了 选项, 否则默认情况下 Kerberos 并不加密会话。 ssh 在默认时加密所有的会话内容。 除了默认转发加密密钥之外, ssh 在所有的其他方面都做得很好。 这意味着如果您持有供您访问系统其他部分密钥的工作站作了很好的安全防护, 而您连到了一台不安全的机器上, 则您的密钥可能被别人获得。 尽管实际的密钥并没有被泄漏, 但由于 ssh 会在您登录的过程中启用一个转发端口, 如果攻击者拿到那台不安全的机器上的 root 那么他将能够利用那个端口来使用您的密钥, 从而访问您能够访问的那些机器。 我们建议您在使用 ssh 时配合 Kerberos 来完成工作人员的登录过程。 Ssh 在编译时可以加入 Kerberos 支持。 在减少了潜在地暴露 ssh 密钥的机会的同时, 它还能够通过 Kerberos 来保护口令。 Ssh 密钥只有在做过安全防护的机器上执行自动操作时才应使用 (这是 Kerberos 不适合的情形)。 此外,我们还建议您要么在 ssh 配置中关闭密钥转发, 要么在 authorized_keys 中增加 from=IP/DOMAIN 选项, 来限制这些密钥能够登录的来源机器。 Bill Swingle 部分重写、更新来自 DES,MD5,以及Crypt 安全 密码 crypt DES MD5 &unix; 系统上的每个用户都有一个与其帐户关联的口令。 很显然, 密码只需要被这个用户和操作系统知道。 为了保证口令的私密性, 采用了一种称为 单向散列 的方法来处理口令, 简单地说, 很容易从口令推算出散列值, 反之却很难。 其实, 刚才那句话可能并不十分确切: 因为操作系统本身并不 真的 知道您的口令。 它只知道口令 经过加密的形式。 获取口令对应 明文 的唯一办法是采用暴力在口令可能的区间内穷举。 不幸的是,当 &unix; 刚刚出现时,安全地加密口令的唯一方法基于DES, 数据加密标准 ( the Data Encryption Standard )。 于是这给那些非美国居民带来了问题, 因为 DES 的源代码在当时不能被出口到美国以外的地方, &os; 必须找到符合美国法律,但又要与其他那些使用 DES 的 &unix; 版本兼容的办法。 解决方案是把加密函数库分割为两个, 于是美国的用户可以安装并使用 DES 函数库, 而国际用户则使用另外一套库提供的一种可以出口的加密算法。 这就是 &os; 为什么使用 MD5 作为它的默认加密算法的原因。 MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。 识别您采用的加密算法 现在这个库支持 DES、 MD5 和 Blowfish 散列函数。默认情况下, &os; 使用 MD5 来加密口令。 可以很容易地识别 &os; 使用哪种加密方法。 检查 /etc/master.passwd 文件中的加密密码是一种方法。 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 $1$ 字符开始。 以 $2a$ 开始的口令是通过 Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征, 但他们要比 MD5 短, 并且以不包括 $ 在内的 64 个可显示字符来表示, 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。 新口令所使用的密码格式是由 /etc/login.conf 中的 passwd_format 来控制的, 可供选择的算法包括 des, md5blf。 请参考 &man.login.conf.5; 联机帮助以获得更进一步的详情。 一次性口令 一次性口令 安全 一次性口令 默认情况下, &os; 提供了 OPIE (One-time Passwords In Everything) 支持, 它默认使用 MD5 散列。 下面将介绍三种不同的口令。 第一种是您常用的 &unix; 风格或 Kerberos 口令; 我们在后面的章节中将称其为 &unix; 口令。 第二种是使用 OPIE 的 &man.opiekey.1; 程序生成, 并为 &man.opiepasswd.1; 以及登录提示所接受的一次性口令,我们称其为 一次性口令。 最后一类口令是您输入给 opiekey 程序 (有些时候是 opiepasswd 程序) 用以产生一次性口令的秘密口令,我们称其为 秘密口令 或通俗地简称为 口令 秘密口令和您的 &unix; 口令毫无关系, 尽管可以设置为相同的, 但不推荐这么做。 OPIE 秘密口令并不像旧式的 &unix; 口令那样只能限于8位以内在 &os; 中标准的登录口令最长不能超过 128 个字符。。 您想要用多长的口令都可以。 有六、七个词的短句是很常见的选择。 在绝大多数时候, OPIE 系统和 &unix; 口令系统完全相互独立地工作。 除了口令之外, 对于 OPIE 还有两组至关重要的数据。 其一被称作 种子key, 它包括两个字符和五个数字。 另一个被称作 迭代轮数, 这是一个 1 到 100 之间的数字。 OPIE 通过将种子加到秘密口令后面, 并执行迭代轮数那么多次的 MD4/MD5 散列运算来得到结果, 并将结果表示为 6 个短的英文单词。 这 6 个英文单词就是您的一次性口令。 验证系统 (主要是 PAM) 会记录上次使用的一次性口令, 如果用户提供的口令的散列值与上次一致, 则可以通过身份验证。 由于使用了单向的散列函数, 因此即使截获了上次使用的口令, 也没有办法恢复出下次将要使用的口令; 每次成功登录都将导致迭代轮数递减, 这样用户和登录程序将保持同步。 每当迭代轮数减少到 1 时, 都必须重新初始化 OPIE。 接下来将讨论和每个系统有关的三个程序。 opiekey 程序能够接收带迭代计数, 种子和秘密口令, 并生成一个一次性口令, 或一张包含连续的一组一次性口令的表格。 opiepasswd 程序用于初始化 OPIE, 并修改口令、 迭代次数、种子和一次性口令。 和 opieinfo 程序可以用于检查相应的验证数据文件 (/etc/opiekeys) 并显示执行命令的用户当前的迭代轮数和种子。 我们将介绍四种不同的操作。 在安全的连接上通过 opiepasswd 来第一次设置一次性口令, 或修改口令及种子。 第二类操作是在不安全的连接上使用 opiepasswd 辅以在安全连接上执行的 opiekey 来完成同样的工作。 第三类操作是在不安全的连接上使用 opiekey 来登录。 最后一类操作是采用 opiekey 来生成大批的密码, 以便抄下来或打印出来,在没有安全连接的地方使用。 安全连接的初始化 第一次初始化 OPIE 时, 可以使用 opiepasswd 命令: &prompt.user; opiepasswd -c [grimreaper] ~ $ opiepasswd -f -c Adding unfurl: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID unfurl OTP key is 499 to4268 MOS MALL GOAT ARM AVID COED Enter new secret pass phrase:Enter secret password: 提示之后, 应输入一个密码或口令字。 请留意, 这并不是您用于登录的口令, 它用于生成一次性的登录密钥。 ID 这一行给出了所需的参数: 您的登录名, 迭代轮数, 以及种子。 登录系统时, 它能够记住这些参数并呈现给您, 因此无需记忆它们。 最后一行给出了与您的秘密口令对应的、用于登录的一个一次性口令; 如果您立即重新登录, 则它将是您需要使用的那个口令。 不安全连接初始化 如果您需要通过一个不安全的连接来初始化, 则应首先在安全连接上执行过一次 opiekey; 您可能希望在可信的机器的 shell 提示符下完成。 此外还需要指定一个迭代轮数 (100 也许是一个较好的选择) 也可以选择一个自己的种子, 或让计算机随机生成一个。 在不安全的连接上 (当然是连到您希望初始化的机器上),使用 opiepasswd 命令: &prompt.user; opiepasswd Updating unfurl: You need the response from an OTP generator. Old secret pass phrase: otp-md5 498 to4268 ext Response: GAME GAG WELT OUT DOWN CHAT New secret pass phrase: otp-md5 499 to4269 Response: LINE PAP MILK NELL BUOY TROY ID mark OTP key is 499 gr4269 LINE PAP MILK NELL BUOY TROY 为了接受默认的种子, 按下 Return。 在输入访问口令之前, 到一个有安全连接的机器上, 并给它同样的参数: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT 现在回到不安全的连接, 并将生成的一次性口令粘贴到相应的应用程序中。 生成一个一次性密码 一旦初始化过 OPIE, 当您登录时将看到类似这样的提示: &prompt.user; telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <username> otp-md5 498 gr4269 ext Password: 另外, OPIE 提示有一个很有用的特性 (这里没有表现出来): 如果您在口令提示处按下 Return(回车) 系统将回显刚键入的口令, 您可以藉此看到自己所键入的内容。 如果试图手工键入一个一次性密码, 这会非常有用。 MS-DOS Windows MacOS 此时您需要生成一个一次性密码来回答这一提示。 这项工作必须在一个可信的系统上执行 opiekey 来完成。 (也可以找到 DOS、 &windows; 以及 &macos; 等操作系统上运行的版本)。 这个程序需要将迭代轮数和种子提供给它。 您可以从登录提示那里复制和粘贴它们。 在可信的系统上: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT 现在就可以用刚刚获得的一次性口令登录了。 产生多个一次性口令 有时,会需要到不能访问可信的机器或安全连接的地方。 这种情形下, 可以使用 opiekey 命令来一次生成许多一次性口令。 例如: &prompt.user; opiekey -n 5 30 zz99999 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: <secret password> 26: JOAN BORE FOSS DES NAY QUIT 27: LATE BIAS SLAY FOLK MUCH TRIG 28: SALT TIN ANTI LOON NEAL USE 29: RIO ODIN GO BYE FURY TIC 30: GREW JIVE SAN GIRD BOIL PHI 按顺序请求 5 个口令, 则指定了最后一个迭代轮数应该是多少。 注意这些口令将按与使用顺序相反的顺序来显示。 如果您比较偏执, 可以手工写下这些结果; 一般来说把它粘贴到 lpr 就可以了。 注意,每一行都显示迭代轮数及其对应的一次性的密码; 一些人建议用完一个就划掉一个。 限制使用 &unix; 口令 OPIE 可以对 &unix; 口令的使用进行基于 IP 的登录限制。 对应的文件是 /etc/opieaccess, 这个文件默认情况下就是存在的。 请参阅 &man.opieaccess.5; 以了解关于这个文件进一步的情况, 以及安全方面需要进行的一些考虑。 下面是一个示范的 opieaccess 文件: permit 192.168.0.0 255.255.0.0 这行允许指定 IP 地址的用户 (再次强调这种地址容易被伪造) 在任何时候使用 &unix; 口令登录。 如果 opieaccess 中没有匹配的规则, 则将默认拒绝任何非 OPIE 登录。 Tom Rhodes 作者: TCP Wrappers TCP Wrappers 每一个熟悉 &man.inetd.8; 都应该听说过 TCP Wrappers, 但几乎没有人对它在网络环境中的作用有全面的理解。 几乎每个人都会安装防火墙来处理网络连接, 然而虽然防火墙有非常广泛的用途, 它却不是万能的, 例如它无法处理类似向连接发起者发送一些文本这样的任务。 而 TCP 软件能够完成它以及更多的其他事情。 接下来的几段中将讨论许多 TCP Wrappers 提供的功能, 并且, 还给出了一些配置实例。 TCP Wrappers 软件扩展了 inetd 为受其控制的服务程序实施控制的能力。 通过使用这种方法, 它能够提供日志支持、 返回消息给联入的连接、 使得服务程序只接受内部连接, 等等。 尽管防火墙也能够完成其中的某些功能, 但这不仅增加了一层额外的保护, 也提供了防火墙无法提供的功能。 然而, 由 TCP Wrappers 提供的一些额外的安全功能, 不应被视为好的防火墙的替代品。 TCP Wrappers 应结合防火墙或其他安全加强设施一并使用, 为系统多提供一层安全防护。 由于这些配置是对于 inetd 的扩展, 因此, 读者应首先阅读 配置 inetd 这节。 尽管由 &man.inetd.8; 运行的程序并不是真正的 服务程序, 但传统上也把它们称为服务程序。 下面仍将使用这一术语。 初始配置 在 &os; 中使用 TCP Wrappers 的唯一要求是确保 inetd 在从 rc.conf 中启动时包含了 选项; 这是默认的设置。 当然, 还需要对 /etc/hosts.allow 进行适当的配置, 但 &man.syslogd.8; 在配置不当时会在系统日志中记录相关消息。 与其它的 TCP Wrappers 实现不同, 使用 hosts.deny 在这里被认为是不推荐和过时的做法。 所有的配置选项应放到 /etc/hosts.allow 中。 在最简单的配置中, 服务程序的连接策略是根据 /etc/hosts.allow 允许或阻止。 &os; 中的默认配置是允许一切发到由 inetd 所启动的服务的连接请求。 在基本配置之后将讨论更复杂的情况。 基本配置的形式通常是 服务 : 地址 : 动作。 这里 服务 是从 inetd 启动的服务程序的名字。 而 地址 可以是任何有效的主机名、 一个 IP 或由方括号 ([ ]) 括起来的 IPv6 地址。 动作字段可以使 allow 或 deny, 分别用于允许和禁止相应的访问。 在配置时您需要注意所有的配置都是按照第一个匹配的规则运转的, 这表示配置文件将按照顺序查找匹配规则, 而一旦找到匹配, 则搜索也就停止了。 另外也有许多其他选项, 这些将在后面介绍。 简单的配置行从上面这些描述之中可以很容易得出。 例如, 允许 POP3 连接通过 mail/qpopper 服务, 应把下面的行添加到 hosts.allow # This line is required for POP3 connections: qpopper : ALL : allow 增加这样之后, 需要重新启动 inetd。 可以通过使用 &man.kill.1; 命令来完成这项工作, 或使用 /etc/rc.d/inetdrestart parameter 参数。 高级配置 TCP Wrappers 也有一些高级的配置选项; 它们能够用来对如何处理连接实施更多的控制。 一些时候, 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。 其他情况下, 记录日志或者发送邮件给管理员可能更为适合。 另外, 一些服务可能只希望为本机提供。 这些需求都可以通过使用 通配符, 扩展字符以及外部命令来实现。 接下来的两节将介绍这些。 外部命令 假设由于发生了某种状况, 而导致连接应该被拒绝掉, 而将其原因发送给发起连接的人。 如何完成这样的任务呢? 这样的动作可以通过使用 选项来实现。 当发起了连接请求时, 将调用一个命令或脚本。 在 hosts.allow 文件中已经给出了一个例子: # The rest of the daemons are protected. ALL : ALL \ : severity auth.info \ : twist /bin/echo "You are not welcome to use %d from %h." 这个例子将把消息 You are not allowed to use daemon from hostname. 返回给访问先前没有配置过允许访问的服务客户。 对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说, 这样的配置非常有用。 请注意所有反馈信息 必须 被引号 " 包围; 这一规则是没有例外的。 如果攻击者向服务程序发送大量的连接请求, 则可能发动一次成功的拒绝服务攻击。 另一种可能是针对这种情况使用 。 类似 也暗含拒绝连接, 并可以用来执行外部命令或服务。 与 不同的是, 不会向连接发起者发送回应。 考虑下面的配置: # We do not allow connections from example.com: ALL : .example.com \ : spawn (/bin/echo %a from %h attempted to access %d >> \ /var/log/connections.log) \ : deny 这将拒绝来自 *.example.com 域的所有连接; 同时还将记录主机名, IP 地址, 以及对方所尝试连接的服务名字到 /var/log/connections.log 文件中。 除了前面已经介绍过的转义字符, 例如 %a 之外, 还有一些其它的转义符。 参考 &man.hosts.access.5; 联机手册可以获得完整的列表。 通配符选项 前面的例子都使用了 ALL。 其它选项能够将功能扩展到更远。 例如, ALL 可以被用来匹配每一个服务、 域,或 IP 地址。 另一些可用的通配符包括 PARANOID, 它可以用来匹配任何来自可能被伪造的 IP 地址的主机。 换言之, paranoid 可以被用来定义来自 IP 与其主机名不符的客户。 下面的例子将给您更多的感性认识: # Block possibly spoofed requests to sendmail: sendmail : PARANOID : deny 在这个例子中, 所有连接 sendmailIP 地址与其主机名不符的主机都将被拒绝。 如果服务器和客户机有一方的 DNS 配置不正确, 使用 PARANOID 可能会严重地削弱服务。 在设置之前, 管理员应该谨慎地考虑。 要了解关于通配符和他们的功能, 请参考 &man.hosts.access.5; 联机手册。 为了使设置能够生效, 应该首先把 hosts.allow 的第一行配置注释掉。 这节的开始部分已经说明了这一点。 Mark Murray 撰写者 Mark Dapoz 初稿 <application>KerberosIV</application> Kerberos 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。 象远程登录, 远程复制, 系统间的相互文件复制和其他完成高风险任务的服务将被变得相当安全和可控制。 下面将具体介绍如何配置随 &os; 发行的 Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。 安装 <application>KerberosIV</application> MIT KerberosIV 安装 Kerberos 是 &os; 的一项可选组件。 安装该软件最简单的办法就是 在使用 sysinstall 安装 &os; 时选择 krb4krb5。 这样将会安装 eBones (KerberosIV) 或 Heimdal (Kerberos5) 的 Kerberos 实现。 采用实现的原因是它们在美国/加拿大 以外的地区开发, 因此这些国家之外的人使用, 而不必受美国的加密代码出口管制的限制。 此外, 您可以从 security/krb5 得到 Kerberos 的 MIT 实现。 创建最初的数据库 这项工作只需要在 Kerberos 服务器上完成。 首先确认没有旧的 Kerberos 数据库存在。 您应该进入到 /etc/kerberosIV 目录中并检查下述文件是否已经存在: &prompt.root; cd /etc/kerberosIV &prompt.root; ls README krb.conf krb.realms 如果您发现了除此之外的其它文件 (例如 principal.*master_key) 已经存在, 请使用 kdb_destroy 命令来销毁旧的数据库, 或者, 如果 Kerberos 没有在运行,简单地删除掉那些多余的文件。 现在必须编辑 krb.confkrb.realms 文件来定义您的 Kerberos 领域。 在本例中, 这个领域将是 EXAMPLE.COM 而其服务器是 grunt.example.com。 我们编辑或创建如下的 krb.conf 文件: &prompt.root; cat krb.conf EXAMPLE.COM EXAMPLE.COM grunt.example.com admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov 在这个例子中, 除此之外的其它领域并不是必需的。 把他们在这里一并展示是为了演示如何让机器了解多个领域的存在。 简单起见, 在实际的配置中可以省略它们。 第一行命名了这个系统工作的领域。 其它行包含了领域/主机的记录。 每行的第一项是一个领域, 其后是在这个领域中充当 密钥分发中心 的主机名。 其后的 admin server 表示该主机同时还提供管理数据库服务。进一步的详细说明请参考 Kerberos 联机手册。 现在应该添加 grunt.example.comEXAMPLE.COM 领域, 同时追加一项以便将出现在 EXAMPLE.COM 领域中 .example.com 域的所有主机也加入进来。 krb.realms 这个文件需要按照下面的方法修改: &prompt.root; cat krb.realms grunt.example.com EXAMPLE.COM .example.com EXAMPLE.COM .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU 再次强调, 其它领域并不是必需的。 在这里只是要展示如何使用多个领域。 可以删掉它们以简化配置。 第一行将 指定的 系统置于所指名字的领域内。 这一行的其它部分则指明了特定子域内的主机应该默认属于哪个领域。 接下来我们就可以创建数据库了。 只有在 Kerberos 服务器上 (或密钥分发中心上) 才需要它。 可以通过 kdb_init 命令来完成这一步: &prompt.root; kdb_init Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master key: 现在我们应该保存密钥, 这样本机上运行的其他服务就能够了解这一变化。 用 kstash 命令来完成这一步: &prompt.root; kstash Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! 这一操作将把主口令保存到 /etc/kerberosIV/master_key 让一切运转起来 KerberosIV 初始配置 有两个主要的东西需要被添加到要用 Kerberos 来确保安全的 每一个 系统上。 它们的名字是 kpasswdrcmd。 这些程序允许另外系统改变 Kerberos 的密码, 在不同的系统上可能有不同的名字。 服务程序 kpasswdrcmd 使得其他系统能够修改 Kerberos 口令, 以及执行类似 &man.rcp.1;, &man.rlogin.1; 和 &man.rsh.1; 这样的命令。 我们添加下面这些记录: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: grunt <Not found>, Create [y] ? y Principal: passwd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: grunt <Not found>, Create [y] ? Principal: rcmd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 创建服务器文件 现在需要分析在每台机器上定义的服务的所有情况。 为了做到这一点, 可以使用 ext_srvtab 命令。 这将创建一个文件, 它需要被 通过安全的途径 复制或移动到每一个 Kerberos 客户端的 /etc 目录中。 在每一台服务器上都必须存在这个文件, 它对 Kerberos 的运行至关重要。 &prompt.root; ext_srvtab grunt Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'.... 现在,这个命令只产生一个临时文件,必须被重命名为 srvtab 以便所有的服务可以识别它。 用 &man.mv.1; 命令把它挪到原系统的这个位置: &prompt.root; mv grunt-new-srvtab srvtab 如果文件是针对客户系统的, 而且网络可能会不安全, 则应把 client-new-srvtab 复制到可移动的介质上, 并通过物理上安全的方式拿走。 将其改名为 srvtab 并放到客户机的 /etc/kerberosIV 目录中, 并赋予 mode 600: &prompt.root; mv grumble-new-srvtab srvtab &prompt.root; chmod 600 srvtab 复制数据库 现在添加一些用户记录到数据库。 首先为用户 jane 创建其对应的项。 使用 kdb_edit 命令来完成此项工作: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: <Not found>, Create [y] ? y Principal: jane, Instance: , kdc_key_ver: 1 New Password: <---- enter a secure password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 测试全部相关信息 首先必须启动 Kerberos 的服务程序。 这里需要指出, 如果您正确地修改了 /etc/rc.conf 则系统在启动时会自动完成这个工作。 只有在 Kerberos 服务器上才需要这么做。 Kerberos 客户程序将自动地从 /etc/kerberosIV 目录中的文件获取所需要的信息。 &prompt.root; kerberos & Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: EXAMPLE.COM &prompt.root; kadmind -n & KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE! 接下来应使用 kinit 命令来获取与我们刚刚创建的 ID jane 对应的 ticket: &prompt.user; kinit jane MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane" Password: 尝试使用 klist 列出句柄以了解是否真的拥有它们: &prompt.user; klist Ticket file: /tmp/tkt245 Principal: jane@EXAMPLE.COM Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM 现在可以试试看用 &man.passwd.1; 来修改口令, 以验证 kpasswd 服务程序是否能够从 Kerberos 数据库中获得需要的授权: &prompt.user; passwd realm EXAMPLE.COM Old password for jane: New Password for jane: Verifying password New Password for jane: Password changed. 授予 <command>su</command> 特权 Kerberos 使我们能够给予 每一个 需要使用 root 特权的用户使用他们自己 单独的 &man.su.1; 口令。 现在我们追加一个被授予 &man.su.1; 到 root 权限的 ID。 这件事是由与 root 相关联的一个 principal 实例来控制的。使用 kdb_edit 可以在 Kerberos 数据库中建立一个 jane.root 条目: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: root <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 New Password: <---- enter a SECURE password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short! Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 现在试试看获得相应的句柄, 以确认它已经正常工作了: &prompt.root; kinit jane.root MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane.root" Password: 接下来我们需要把用户添加到 root.klogin 文件里: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM 试试看 &man.su.1;: &prompt.user; su Password: 然后看看我们拥有哪些句柄: &prompt.root; klist Ticket file: /tmp/tkt_root_245 Principal: jane.root@EXAMPLE.COM Issued Expires Principal May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM 使用其它命令 在前文给出的例子中, 我们创建了一个称为 jane 的用户, 以及一个 root 实例。 此处的用户名和它的 principal 相同, 这是 Kerberos 默认的; 一个形如 <username>.root<principal>.<instance> 将允许 <username> 使用 &man.su.1; 成为 root, 只要所需的那些条目在 root home 目录中的 .klogin 中存在的话: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM 类似地, 如果用户的 home 目录中有这样的设置: &prompt.user; cat ~/.klogin jane@EXAMPLE.COM jack@EXAMPLE.COM 则表明在 EXAMPLE.COM 领域的经过身份验证的 jane 或者 jack (通过 kinit, 详情见前文) 能够使用 jane 的身份或系统 (grunt) 中的文件, 无论通过 &man.rlogin.1;, &man.rsh.1; 或是 &man.rcp.1;。 举例来说, jane 现在通过 Kerberos 登入了其它系统: &prompt.user; kinit MIT Project Athena (grunt.example.com) Password: &prompt.user; rlogin grunt Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 或者, 当 jack 登录到 jane 在同一台机器上的账号 (jane 按照前面所介绍的那样配置了 .klogin 文件, 而负责 Kerberos 的管理员, 则为 jack 的 principal 配置了一个空的 instance): &prompt.user; kinit &prompt.user; rlogin grunt -l jane MIT Project Athena (grunt.example.com) Password: Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 Tillman Hodgson 撰写者 Mark Murray 原文来自 <application>Kerberos5</application> 在 &os;-5.1 之后的每一个 &os; 版本都只包含 Kerberos5 支持了, 因而, Kerberos5 是它们所包含的唯一的 Kerberos 版本, 其配置在绝大多数方面和 KerberosIV 非常类似。 下述信息只适用于 &os;-5.0 之后版本中的 Kerberos5。 希望使用 KerberosIV 的用户可以安装 security/krb4 port。 Kerberos 是一组附加的网络系统/协议, 用以让用户通过一台安全服务器提供的服务来验证身份。 包括远程登录、远程复制、在系统间安全地复制文件, 以及其它高危险性的操作, 由于其存在而显著地提高了安全型并且更加可控。 Kerberos 可以理解为一种身份验证代理系统。 它也被描述为一种以受信第三方为主导的身份验证系统。 Kerberos 只提供一种功能 — 在网络上安全地完成用户的身份验证。 它并不提供授权功能 (也就是说用户能够做什么操作) 或审计功能 (记录用户作了什么操作)。 一旦客户和服务器都使用了 Kerberos 来证明各自的身份之后, 他们还可以加密全部的通讯以保证业务数据的私密性和完整性。 因此, 强烈建议将 Kerberos 同其它提供授权和审计服务的安全手段联用。 接下来的说明可以用来指导如何安装 &os; 所附带的 Kerberos。 不过, 您仍然需要参考相应的联机手册以获得完整的描述。 为了展示 Kerberos 的安装过程, 我们约定: DNS 域 (zone) 为 example.org。 Kerberos 领域是 EXAMPLE.ORG。 在安装 Kerberos 时请使用实际的域名即使您只是想在内部网上用一用。 这可以避免 DNS 问题并保证了同其它 Kerberos 之间的互操作性。 历史 Kerberos5 历史 Kerberos 最早由 MIT 作为解决网络安全问题的一个方案提出。 Kerberos 协议采用了强加密, 因此客户能够在不安全的网络上向服务器 (以及相反地) 验证自己的身份。 Kerberos 是网络验证协议名字, 同时也是用以表达实现了它的程序的形容词。 (例如 Kerberos telnet)。 目前最新的协议版本是 5,在 RFC 1510 中有所描述。 该协议有许多免费的实现, 这些实现涵盖了许多种不同的操作系统。 最初研制 Kerberos 的麻省理工学院 (MIT) 也仍然在继续开发他们的 Kerberos 软件包。 在 US 它被作为一种加密产品使用, 因而历史上曾经受到 US 出口管制。 MIT Kerberos 可以通过 port (security/krb5) 来安装和使用。 Heimdal Kerberos 是另一种第 5 版实现, 并且明确地在 US 之外的地区开发, 以避免出口管制 (因此在许多非商业的类 &unix; 系统中非常常用。 Heimdal Kerberos 软件包可以通过 port (security/heimdal) 安装, 最新的 &os; 的最小安装也会包含它。 为使尽可能多的读者从中受益, 这份说明以 &os; 附带的 Heimdal 软件包为准。 配置 Heimdal <acronym>KDC</acronym> Kerberos5 密钥分发中心 密钥分发中心 (KDC) 是 Kerberos 提供的集中式验证服务 — 它是签发 Kerberos tickets 的那台计算机。 KDCKerberos 领域中的其它机器看来是 受信的, 因此必须格外注意其安全性。 需要说明 Kerberos 服务器只需要非常少的计算资源, 尽管如此, 基于安全理由仍然推荐使用独占的机器来扮演 KDC 的角色。 要开始配置 KDC, 首先请确认您的 /etc/rc.conf 文件包含了作为一个 KDC 所需的设置 (您可能需要适当地调整路径以适应自己系统的情况): kerberos5_server_enable="YES" kadmind5_server_enable="YES" 接下来需要修改 Kerberos 的配置文件, /etc/krb5.conf [libdefaults] default_realm = EXAMPLE.ORG [realms] EXAMPLE.ORG = { kdc = kerberos.example.org admin_server = kerberos.example.org } [domain_realm] .example.org = EXAMPLE.ORG 请注意这个 /etc/krb5.conf 文件假定您的 KDC 有一个完整的主机名, 即 kerberos.example.org。 如果您的 KDC 主机名与它不同, 则应添加一条 CNAME (别名) 项到 zone 中去。 对于有正确地配置过的 BIND DNS 服务器的大型网络, 上述例子可以精简为: [libdefaults] default_realm = EXAMPLE.ORG 将下面的内容加入到 example.org zone 数据文件中: _kerberos._udp IN SRV 01 00 88 kerberos.example.org. _kerberos._tcp IN SRV 01 00 88 kerberos.example.org. _kpasswd._udp IN SRV 01 00 464 kerberos.example.org. _kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org. _kerberos IN TXT EXAMPLE.ORG 要让客户机能够找到 Kerberos 服务, 就 必须 首先配置完整或最小配置的 /etc/krb5.conf 并且 正确地配置 DNS 服务器。 接下来需要创建 Kerberos 数据库。 这个数据库包括了使用主密码加密的所有实体的密钥。 您并不需要记住这个密码, 它会保存在一个文件 (/var/heimdal/m-key) 中。 要创建主密钥, 需要执行 kstash 并输入一个口令。 主密钥一旦建立, 您就可以用 kadmin 程序的 -l 参数 (表示 local) 来初始化数据库了。 这个选项让 kadmin 直接地修改数据库文件而不是通过 kadmind 的网络服务。 这解决了在数据库创建之前连接它的鸡生蛋的问题。 进入 kadmin 提示符之后, 用 init 命令来创建领域的初始数据库。 最后, 仍然在 kadmin 中, 使用 add 命令来创建第一个 principal。 暂时使用全部的默认设置, 随后可以在任何时候使用 modify 命令来修改这些设置。 另外, 也可以用 ? 命令来了解可用的选项。 典型的数据库创建过程如下: &prompt.root; kstash Master key: xxxxxxxx Verifying password - Master key: xxxxxxxx &prompt.root; kadmin -l kadmin> init EXAMPLE.ORG Realm max ticket life [unlimited]: kadmin> add tillman Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: Password: xxxxxxxx Verifying password - Password: xxxxxxxx 现在是启动 KDC 服务的时候了。 运行 /etc/rc.d/kerberos start 以及 /etc/rc.d/kadmind start 来启动这些服务。 尽管此时还没有任何正在运行的 Kerberos 服务, 但您仍然可以通过获取并列出您刚刚创建的那个 principal (用户) 的 ticket 来验证 KDC 确实在正常工作, 使用 KDC 本身的功能: &prompt.user; kinit tillman tillman@EXAMPLE.ORG's Password: &prompt.user; klist Credentials cache: FILE:/tmp/krb5cc_500 Principal: tillman@EXAMPLE.ORG Issued Expires Principal Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG 完成所需的操作之后, 可以撤消这一 ticket: &prompt.user; k5destroy 为 <application>Kerberos</application> 启用 Heimdal 服务 Kerberos5 启用服务 首先我们需要一份 Kerberos 配置文件 /etc/krb5.conf 的副本。 只需简单地用安全的方式 (使用类似 &man.scp.1; 的网络工具, 或通过软盘) 复制 KDC 上的版本, 并覆盖掉客户机上的对应文件就可以了。 接下来需要一个 /etc/krb5.keytab 文件。 这是提供 Kerberos 服务的服务器和工作站的一个主要区别 — 服务器必须有 keytab 文件。 这个文件包括了服务器的主机密钥, 这使得 KDC 得以验证它们的身份。 此文件必须以安全的方式传到服务器上, 因为如果密钥被公之于众, 则安全也就毁于一旦。 也就是说, 通过明文的通道, 例如 FTP 是非常糟糕的想法。 一般来说, 您会希望使用 kadmin 程序来把 keytab 传到服务器上。 由于也需要使用 kadmin 来为主机建立 principal (KDC 一端的 krb5.keytab), 因此这并不复杂。 注意您必须已经获得了一个 ticket 而且这个 ticket 必须许可使用 kadmind.acl 中的 kadmin 接口。 请参考 Heimdal info 中的 Remote administration(远程管理) 一节 (info heimdal) 以了解如何设计访问控制表。 如果不希望启用远程的 kadmin 操作, 则可以简单地采用安全的方式连接 KDC (通过本机控制台, &man.ssh.1; 或 Kerberos &man.telnet.1;) 并使用 kadmin -l 在本地执行管理操作。 安装了 /etc/krb5.conf 文件之后, 您就可以使用 Kerberos 上的 kadmin 了。 add --random-key 命令可以用于添加主机 principal, 而 ext 命令则允许导出服务器的主机 principal 到它的 keytab 中。 例如: &prompt.root; kadmin kadmin> add --random-key host/myserver.example.org Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: kadmin> ext host/myserver.example.org kadmin> exit 注意 ext 命令 (这是 extract 的简写) 默认会把导出的密钥放到 /etc/krb5.keytab 中。 如果您由于没有在 KDC 上运行 kadmind (例如基于安全理由) 因而无法远程地使用 kadmin 您可以直接在 KDC 上添加主机 principal (host/myserver.EXAMPLE.ORG) 随后将其导出到一个临时文件中 (以免覆盖 KDC 上的 /etc/krb5.keytab), 方法是使用下面的命令: &prompt.root; kadmin kadmin> ext --keytab=/tmp/example.keytab host/myserver.example.org kadmin> exit 随后需要把 keytab 复制到服务器上 (例如使用 scp 或软盘)。 一定要指定一个不同于默认的 keytab 名字以免覆盖 KDC 上的 keytab。 到现在您的服务器已经可以同 KDC 通讯了 (因为已经配置了 krb5.conf 文件), 而且它还能够证明自己的身份 (由于配置了 krb5.keytab 文件)。 现在可以启用一些 Kerberos 服务。 在这个例子中, 我们将在 /etc/inetd.conf 中添加下面的行来启用 telnet 服务, 随后用 /etc/rc.d/inetd restart 重启 &man.inetd.8; 服务来使设置生效: telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user 关键的部分是 -a (表示验证) 类型设置为用户 (user)。 请参考 &man.telnetd.8; 联机手册以了解细节。 使用 Heimdal 来启用客户端 <application>Kerberos</application> Kerberos5 客户端配置 设置客户机是非常简单的。 在正确配置了 Kerberos 的网络中, 只需要将位于 /etc/krb5.conf 的配置文件进行一下设置就可以了。 这一步骤可以简单地通过安全的方式将文件从 KDC 复制到客户机上来完成。 尝试在客户机上执行 kinitklist, 以及 kdestroy 来测试获取、 显示并删除 刚刚为 principal 建立的 ticket 是否能够正常进行, 如果能, 则用其它的 Kerberos 应用程序来连接启用了 Kerberos 的服务。 如果应用程序不能正常工作而获取 ticket 正常, 则通常是服务本身, 而非客户机或 KDC 有问题。 在测试类似 telnet 的应用程序时, 应考虑使用抓包程序 (例如 &man.tcpdump.1;) 来确认您的口令没有以明文方式传输。 尝试使用 telnet-x 参数, 它将加密整个数据流 (类似 ssh)。 许多非核心的 Kerberos 客户应用程序也是默认安装的。 在 Hemidal 的 最小 安装理念下, telnet 是唯一一个采用了 Kerberos 的服务。 Heimdal port 则提供了一些默认不安装的客户应用程序, 例如启用了 Kerberos 版本的 ftprshrcprlogin 以及一些更不常用的程序。 MIT port 也包括了一整套 Kerberos 客户应用程序。 用户配置文件: <filename>.k5login</filename> 和 <filename>.k5users</filename> .k5login .k5users 在某个领域中的用户往往都有自己的 Kerberos principal (例如 tillman@EXAMPLE.ORG) 并映射到本机用户帐户 (例如本机上名为 tillman 的帐户)。 客户端应用程序, 如 telnet 通常并不需要用户名或 principal。 不过, 有时您可能会需要赋予某些没有匹配 Kerberos principal 的人使用本地用户帐户的权限。 例如 tillman@EXAMPLE.ORG 可能需要访问本地的 webdevelopers 用户帐号。 其它 principal 可能也会需要访问这个本地帐号。 用户 home 目录中的 .k5login.k5users 这两个文件可以配合 .hosts.rhosts 来有效地解决这个问题。 例如, 如果 .k5login 中有如下内容: tillman@example.org jdoe@example.org 并放到了本地用户 webdevelopers 的 home 目录中, 则列出的两个 principals 都可以使用那个帐号, 而无须共享口令。 建议您在开始实施之前首先阅读这些命令的联机帮助。 特别地, ksu 的联机手册包括了 .k5users 的相关内容。 <application>Kerberos</application> 提示、技巧和故障排除 Kerberos5 故障排除 当使用 Heimdal 或 MIT Kerberos ports 时, 需要确认 PATH 环境变量把 Kerberos 客户应用列在系统自带的版本之前。 同一领域内的所有计算机的时间设置是否同步? 如果不是的话, 则身份验证可能会失败。 描述了如何使用 NTP 来同步时钟。 MIT 和 Heimdal 能够很好地互操作。 一个例外是 kadmin, 因为这个协议没有被标准化。 如果您改变了主机名, 您还需要修改您的 host/ principal 并更新 keytab。 这一规律也适用于类似 Apache 的 www/mod_auth_kerb 所使用的 www/ principal 这样的特殊 keytab 项。 您的领域中的每一台主机必须在 DNS (或至少在 /etc/hosts 中) 可以解析 (同时包括正向和反向)。 CNAME 能够正常使用, 但必须有正确的对应 A 和 PTR 记录。 此时给出的错误信息可能很让人困惑: Kerberos5 refuses authentication because Read req failed: Key table entry not found 某些作为客户使用您的 KDC 的操作系统可能没有将 ksu 设置为 setuid root 的权限。 这意味着 ksu 将不能够正常工作, 从安全角度说这是一个不错的主意, 但可能令人烦恼。 这类问题并不是 KDC 的错误。 使用 MIT Kerberos 时, 如果希望允许一个 principal 拥有超过默认的十小时有效期的 ticket 则必须使用 kadmin 中的 modify_principal 来修改 principal 本身以及 krbtgt 的 maxlife(最大有效期)。 此后, principal 可以使用 kinit-l 参数来请求一个有更长有效期的 ticket。 如果在 KDC 上运行了听包程序, 并在工作站上执行 kinit, 您可能会注意到 TGT 是在 kinit 一开始执行的时候就发出了的 — 甚至在您输入口令之前! 关于这个现象的解释是 Kerberos 服务器可以无限制地收发 TGT (Ticket Granting Ticket) 给任何未经授权的请求; 但是, 每一个 TGT 都是使用用户的口令派生出来的密钥进行加密的。 因此, 当用户输入口令时它并不会发送给 KDC, 而是直接用于解密 kinit 所拿到的 TGT。 如果解密过程得到了一个包含合法的时间戳的有效 ticket, 则说明用户的 Kerberos 凭据有效。 这些凭据包含了一个会话密钥用以在随后建立 Kerberos 服务器的加密通讯, 传递由服务器自己的私钥加密的实际的 ticket-granting ticket。 这个第二层加密对于用户来说是看不到的, 但它使得 Kerberos 服务器能够验证每一个 TGT 的真实性。 如果需要有效期更长的 ticket (例如一周) 而且您使用 OpenSSH 连接保存您的 ticket 的机器, 请确认 sshd_config 中的 Kerberos 被设置为 no 否则在注销时会自动删除所有的 ticket。 切记主机的 principals 的 ticket 有效期一定要比用户的长。 如果您的用户 principal 的有效期是一周, 而所连接的主机的有效期是九个小时, 则缓存的主机 principal 将先行过期, 结果是 ticket 缓存无法正常工作。 当配置 krb5.dict 文件来防止使用特定的简单口令 (kadmind 的联机手册中简要介绍了它), 请切记只有指定了口令策略的 principals 才会使用它们。 krb5.dict 文件的格式很简单: 每个串占一行。 创建一个到 /usr/share/dict/words 的符号连接会很有用。 与 <acronym>MIT</acronym> port 的区别 MIT 和 Heimdal 主要的区别在于 kadmin 程序使用不同 (尽管等价) 的命令和协议。 如果您的 KDCMIT 的, 则其影响是不能使用 Heimdal 的 kadmin 程序来远程管理 KDC (或相反)。 完成同样工作的命令可能会有些许的不同。 推荐按照 MIT Kerberos 的网站 () 上的说明来操作。 请小心关于路径的问题, MIT port 会默认安装到 /usr/local/, 您因此可能会执行 普通的 系统应用程序而非 MIT, 如果您的 PATH 环境变量把 把系统目录放在前面的话。 如果使用 &os; 提供的 MIT security/krb5 port, 一定要仔细阅读 port 所安装的 /usr/local/share/doc/krb5/README.FreeBSD, 如果您想知道为什么通过 telnetdklogind 登录时会出现一些诡异的现象的话。 最重要地, incorrect permissions on cache file(缓存文件权限不正确) 行为需要使用 login.krb5 来进行验证, 才能够正确地修改转发凭据的属主。 除此之外, 还应修改 rc.conf 并加入下列配置: kerberos5_server="/usr/local/sbin/krb5kdc" kadmind5_server="/usr/local/sbin/kadmind" kerberos5_server_enable="YES" kadmind5_server_enable="YES" 这样做的原因是, MIT kerberos 会将可执行文件装到 /usr/local 之下。 缓解 <application>Kerberos</application> 的限制 Kerberos5 限制和不足 <application>Kerberos</application> 是一种 all-or-nothing 方式 在网络上启用的每个服务都必须进行修改以便让其能够配合 Kerberos 工作 (否则就只能使用其它方法来保护它们不受网络攻击的侵害), 如果不是这样, 则用户的凭据就有可能被窃取并再次使用。 一个例子是对所有的远程 shell (例如通过 rshtelnet) 启用了 Kerberos 但没有将使用明文验证的 POP3 邮件服务器 Kerberos化。 <application>Kerberos</application> 是为单用户工作站设计的 在多用户环境中 Kerberos 的安全性会被削弱。 这是因为它把 ticket 保存到 /tmp 目录中, 而这个目录可以被任何用户读取。 如果有用户与其它人同时共享一台计算机 (也就是 multi-user), 则这个用户的 ticket 就可能被其它用户窃取 (复制)。 可以通过使用 -c 文件名 这样的命令行选项, 或者(推荐的)改变 KRB5CCNAME 环境变量来避免这个问题, 但很少有人这么做。原则上, 将 ticket 保存到用户的 home 目录并简单地设置权限就能够缓解这个问题。 KDC 会成为单点崩溃故障点 根据设计, KDC 必须是安全的, 因为主密码数据库保存在它上面。 决不应该在 KDC上面运行其它服务, 而且还应确保它的物理安全。 由于 Kerberos 使用同一个密钥 (传说中的那个 密钥) 来加密所有的密码, 而将这个文件保存在 KDC, 因此其安全尤为重要 不过, 主密钥的泄露并没有想象中的那么可怕。 主密钥只用来加密 Kerberos 数据库以及产生随机数发生器的种子。 只要 KDC 是安全的, 即使攻击者拿到了主密钥也做不了什么。 另外, 如果 KDC 不可用 (例如由于拒绝服务攻击或网络故障) 则网络服务将由于验证服务无法进行而不能使用, 从而导致更大范围的拒绝服务攻击。 通过部署多个 KDC (一个主服务器, 配合一个或多个从服务器) 并采用经过仔细设计和实现的备用验证方式可以避免这种问题 (PAM 是一个不错的选择)。 <application>Kerberos</application> 的不足 Kerberos 允许用户、主机和服务之间进行相互认证。 但它并没有提供机制来向用户、主机或服务验证 KDC。 这意味着种过木马的程序,例如 kinit 有可能记录用户所有的用户名和密码。 尽管如此, 可以用类似 security/tripwire 这样的文件系统完整性检查工具来避免此类情况的发生。 相关资源和其它资料 Kerberos5 外部资源 The Kerberos FAQ Designing an Authentication System: a Dialog in Four Scenes RFC 1510, The Kerberos Network Authentication Service (V5) MIT Kerberos home page Heimdal Kerberos home page Tom Rhodes 作者 OpenSSL 安全 OpenSSL 许多用户可能并没有注意到 &os; 所附带的 OpenSSL 工具包的功能。 OpenSSL 提供了建立在普通的通讯层基础上的加密传输层; 这些功能为许多网络应用和服务程序所广泛使用。 OpenSSL 的一些常见用法包括加密邮件客户的身份验证过程, 基于 Web 的交易如信用卡等等。 许多 ports 如 www/apache13-ssl, 以及 mail/sylpheed-claws 等等都提供了编译进 OpenSSL 支持的方法。 绝大多数情况下 Ports Collection 会试图使用 security/openssl 除非明确地将 WITH_OPENSSL_BASE make 变量设置为 yes &os; 中附带的 OpenSSL 版本能够支持 安全套接字层 v2/v3 (SSLv2/SSLv3) 和 安全传输层 v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库使用。 尽管 OpenSSL 支持 IDEA 算法, 但由于美国专利, 它在默认情况下是不编译的。 如果想使用它, 请查阅相应的授权, 如果认为授权可以接受, 则可以在 make.conf 中设置 MAKE_IDEA 为应用软件提供证书是 OpenSSL 最为常用的功能之一。 证书是一种能够确保公司或个人有效身份不被伪造的凭据。 如果证书没有被众多 权威发证机构, 或 CA 中的某一个确认, 则会产生一个警告。 权威发证机构通常是一家公司, 例如 VeriSign, 它能够通过签署来证明个人或公司证书的有效性。 这个过程是需要付费的, 当然, 这不是使用证书的必要条件; 然而, 这样做会让那些比较偏执的用户感到轻松。 生成证书 OpenSSL 生成证书 为了生成证书, 需要使用下面的命令: &prompt.root; openssl req -new -nodes -out req.pem -keyout cert.pem Generating a 1024 bit RSA private key ................++++++ .......................................++++++ writing new private key to 'cert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:PA Locality Name (eg, city) []:Pittsburgh Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:Systems Administrator Common Name (eg, YOUR name) []:localhost.example.org Email Address []:trhodes@FreeBSD.org Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:SOME PASSWORD An optional company name []:Another Name 请注意, 在 Common Name 提示后面我们输入的是一个域名。 这个提示要求输入服务器的名字, 这个名字今后将用于完成验证过程; 如果在这里输入域名以外的内容, 那么证书也就失去其意义了。 您还可以指定一些其他的选项, 比如证书的有效期, 以及使用的加密算法等等。 这些选项的完整列表, 可以在 &man.openssl.1; 联机手册中找到。 在您执行前述命令的目录中将生成两个文件。 证书申请, 即 req.pem, 可以发给一家发证机构, 它将验证您输入的凭据的真实性, 并对申请进行签名, 再把证书返还给您。 第二个文件的名字将是 cert.pem, 它包含了证书的私钥, 应被全力保护; 如果它落入别人手中, 则可以被用来伪造您 (或您的服务器)。 如果不需要来自 CA 的签名, 也可以创建自行签名的证书。 首先, 需要生成 RSA 密钥: &prompt.root; openssl dsaparam -rand -genkey -out myRSA.key 1024 接下来, 生成 CA 密钥: &prompt.root; openssl gendsa -des3 -out myca.key myRSA.key 然后用这个密钥来创建证书: &prompt.root; openssl req -new -x509 -days 365 -key myca.key -out new.crt 上述步骤将在当前目录中生成两个新文件: 一个是权威发证机构的签名文件, myca.key; 另一个是证书本身, new.crt。 这些文件应该放到同一个目录中, 一般而言, 推荐放到 /etc, 并且只允许 root 读取。 建议把权限设置为 0700, 这可以通过 chmod 工具来完成。 使用证书的一个例子 那么有了这些文件可以做些什么呢? 一个比较典型的用法是用来加密 Sendmail MTA 的通讯连接。 这可以解决用户通过本地 MTA 发送邮件时使用明文进行身份验证的问题。 这个用法可能并不完美, 因为某些 MUA 会由于没有在本地安装证书而向用户发出警告。 请参考那些软件的说明了解关于安装证书的信息。 下面的设置应添加到本地的 .mc 文件 dnl SSL Options define(`confCACERT_PATH',`/etc/certs')dnl define(`confCACERT',`/etc/certs/new.crt')dnl define(`confSERVER_CERT',`/etc/certs/new.crt')dnl define(`confSERVER_KEY',`/etc/certs/myca.key')dnl define(`confTLS_SRV_OPTIONS', `V')dnl 这里, /etc/certs/ 是准备用来在本地保存证书和密钥的位置。 最后, 需要重新生成本地的 .cf 文件。 这一工作可以简单地通过在 /etc/mail 目录中执行 make install 来完成。 接下来, 可以使用 make restart 来重新启动 Sendmail 服务程序。 如果一切正常的话, 在 /var/log/maillog 中就不会出现错误提示, Sendmail 也应该出现在进程列表中。 做一个简单的测试, 使用 &man.telnet.1; 来连接邮件服务器: &prompt.root; telnet example.com 25 Trying 192.0.34.166... Connected to example.com. Escape character is '^]'. 220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT) ehlo example.com 250-example.com Hello example.com [192.0.34.166], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP quit 221 2.0.0 example.com closing connection Connection closed by foreign host. 如果输出中出现了 STARTTLS 则说明一切正常。 Nik Clayton
nik@FreeBSD.org
撰写者
IPsec IPsec 上的 VPN 使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 VPN。 Hiten M. Pandya
hmp@FreeBSD.org
撰写者
理解 IPsec 这一节将指导您完成架设 IPsec, 并在一个包含了 FreeBSD 和 µsoft.windows; 2000/XP 机器的网络中使用它来进行安全的通讯的全过程。 为了配置 IPsec, 您应当熟悉如何编译一个定制的内核的一些概念 (参见 )。 IPsec 是一种建立在 Internet 协议 (IP) 层之上的协议。 它能够让两个或更多主机以安全的方式来通讯 (并因此而得名)。 FreeBSD IPsec 网络协议栈 基于 KAME 的实现, 它支持两种协议族, IPv4 和 IPv6。 FreeBSD 包括了采用 硬件加速的 IPsec 协议栈, 也称作 Fast IPsec, 它来自 OpenBSD。 它能够通过 &man.crypto.4; 子系统来利用加密硬件 (只要可能) 优化 IPSec 的性能。 这个子系统是新的, 暂时还不支持 KAME 版本的 IPsec 的全部功能。 此外, 为了启用硬件加速的 IPsec, 必须把下面的选项加入到内核配置中: 内核选项 FAST_IPSEC options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) 需要注意的是, 目前还不能用 Fast IPsec 子系统完全替代 KAME 的 IPsec 实现。 请参见联机手册 &man.fast.ipsec.4; 以了解进一步的详情。 如果希望防火墙能够正确地跟踪到 &man.gif.4; 信道的状态, 您还需要在内核配置中启用 options IPSEC_FILTERGIF #filter ipsec packets from a tunnel IPsec ESP IPsec AH IPsec 包括了两个子协议: Encapsulated Security Payload (ESP), 保护 IP 包数据不被第三方介入, 通过使用对称加密算法 (例如 Blowfish、 3DES)。 Authentication Header (AH), 保护 IP 包头不被第三方介入和伪造, 通过计算校验和以及对 IP 包头的字段进行安全散列来实现。 随后是一个包含了散列值的附加头, 以便能够验证包。 ESPAH 可以根据环境的不同, 分别或者一同使用。 VPN 虚拟专用网 VPN IPsec 既可以用来直接加密主机之间的网络通讯 (也就是 传输模式); 也可以用来在两个子网之间建造 虚拟隧道 用于两个网络之间的安全通讯 (也就是 隧道模式)。 后一种更多的被称为是 虚拟专用网 (VPN)。 &man.ipsec.4; 联机手册提供了关于 FreeBSD 中 IPsec 子系统的详细信息。 要把 IPsec 支持放进内核, 应该在配置文件中加入下面的选项: 内核选项 IPSEC 内核选项 IPSEC_ESP options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/ IPSEC) 内核选项 IPSEC_DEBUG 如果需要 IPsec 的调试支持, 还应增加: options IPSEC_DEBUG #debug for IP security
问题 由于对如何建立 VPN 并不存在标准, 因此 VPN 可以采用许多种不同的技术来实现, 每种技术都有其长处和弱点。 这篇文章讲展现一个具体的应用情景, 并为它设计了适合的 VPN。 情景: 两个网络都接入了 Internet, 希望像一个网络那样工作 VPN 创建 现有条件如下: 至少有两个不同的站点 每个站点都使用内部的 IP 两个站点都通过运行 FreeBSD 的网关接入 Internet。 每个网络上的网关至少有一个公网的 IP 地址。 网络的内部地址可以是公网或私有的 IP 地址, 这并不是问题。 如果需要, 还可以在网关上运行 NAT。 两个网络上的 IP 地址 不冲突。 虽然理论上可以通过 VPN 和 NAT 连用来使这种情况能够正常工作, 但那毫无疑问将是管理的噩梦。 如果您发现您正打算连接两个内网使用同一私有 IP 地址范围的网络 (例如它们都使用 192.168.1.x), 则其中的一个必须修改网络地址。 网络的拓扑结构如下: 网络 #1 [ 内部主机 ] 私有网络,192.168.1.2-254 [ Win9x/NT/2K ] [ UNIX ] | | .---[fxp1]---. 私有 IP, 192.168.1.1 | FreeBSD | `---[fxp0]---' 公网 IP, A.B.C.D | | -=-=- Internet -=-=- | | .---[fxp0]---. 公网 IP, W.X.Y.Z | FreeBSD | `---[fxp1]---' 私有 IP, 192.168.2.1 | | 网络 #2 [ Internal Hosts ] [ Win9x/NT/2K ] 私有网络, 192.168.2.2-254 [ UNIX ] 请注意两个公网 IP 地址。 在这篇文章的其余部分我将用这些字母来表示它们。 在文章中看到这些字母的时候, 请把它们换成自己的公网 IP 地址。 另外, 在内部, 两个网关都是使用的 .1 的 IP地址, 而两个网络使用了不同的私有 IP 地址 (相应地, 192.168.1.x192.168.2.x)。 所有私有网络上的机器都被配置为使用 .1 这台机器作为它们的网关。 我们希望, 从网络的观点看, 每一个网络上的机器都应该能够像在直接连接到同一路由器上一样看到对方网络上的机器 -- 尽管可能比路由器略慢一些, 并且有时会有丢包的现象。 这意味着 (举例来说), 主机 192.168.1.20 应该能够运行 ping 192.168.2.34 并且这能够透明地工作。 &windows; 机器应该能够看到其他网络上的机器, 浏览文件共享, 等等, 就像在本地网络上一样。 而且这些事情必须是安全的, 也就是说两个网络之间的通讯必须加密。 在两个网络之间建立 VPN 可以分为几步。 这些步骤包括: 在两个网络之间, 通过 Internet 建立一个 虚拟的 网络连接。 使用类似 &man.ping.8; 这样的工作来验证它是否正常工作。 在两个网络之间应用安全策略以保证它们之间的通讯被透明地加密盒解密。 可以使用 &man.tcpdump.1; 或类似的工具来验证这一点。 在 FreeBSD 网关上配置其他软件, 让 &windows; 机器能够通过 VPN 看到另一个网络中的机器。 步骤 1: 建立并测试 <quote>虚拟的</quote> 网络连接 假设您目前已经登录到了网络 #1 的网关机上 (其公网 IP 地址是 A.B.C.D, 私网 IP 地址是 192.168.1.1), 则您可以执行 ping 192.168.2.1, 这是公网 IP 为 W.X.Y.Z 的私网地址。 需要做什么实现上述功能呢? 作为网关的机器需要知道如何能够到达 192.168.2.1。 换言之, 它需要一条通往 192.168.2.1 的路由。 私网 IP 地址, 例如 192.168.x 这样的地址是不应在 Internet 上面大量出现的。 于此相反, 发送到 192.168.2.1 的数据包将会封装到另外的包中。 这样的包对外展现的应该是来自 A.B.C.D, 并被发到 W.X.Y.Z 去。 这个过程称为 封装 一旦包到达了 W.X.Y.Z 就需要对其 拆封, 并传递给 192.168.2.1 可以把上述过程理解为在两个网络间建立了一个 隧道。 两个 隧道口 是 IP 地址 A.B.C.DW.X.Y.Z, 而隧道必须被告知哪些私有地址可以自由地在其中通过。 隧道被用来在公共的 Internet 上传递私有的 IP 数据。 在 FreeBSD 上, 隧道可以通过一般的网络接口, 或 gif 来建立。 您也许已经猜到了, 每一台网关机的 gif 接口需要配置四个 IP 地址; 两个是公网 IP 地址, 另两个则是私网 IP 地址。 对于 gif 设备的支持必须在两台网关机上编译进 &os; 内核。 可以通过添加下面的设置来达到目的: device gif 到两边的内核配置文件中, 并重新编译、 安装和启动它们。 配置隧道可以分为两步来完成。 首先隧道必须被告知外部的 (或公网的) IP 地址, 可以通过 &man.ifconfig.8; 来完成这步。 私网 IP 地址则必须使用 &man.ifconfig.8; 来配置。 在网络 #1 的网关机上可以通过下面的这些命令来配置隧道。 &prompt.root; ifconfig gif0 create &prompt.root; ifconfig gif0 tunnel A.B.C.D W.X.Y.Z &prompt.root; ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff 在另一台网关上也需要执行同样的命令, 但 IP 地址的顺序相反。 &prompt.root; ifconfig gif0 create &prompt.root; ifconfig gif0 tunnel W.X.Y.Z A.B.C.D &prompt.root; ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff 随后执行: ifconfig gif0 可以查看当前的配置情况。 例如, 在网络 #1 的网关上您应该能够看到: &prompt.root; ifconfig gif0 gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 tunnel inet A.B.C.D --> W.X.Y.Z inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff 如您所见, 虽然到已经在物理地址 A.B.C.DW.X.Y.Z 之间建立起来, 而允许通过隧道的地址则是 192.168.1.1192.168.2.1 这个范围。 这同时会在两边机器的路由表中加入一项, 可以通过 netstat -rn 来观察。 来自网络 #1的网关机的输出如下。 &prompt.root; netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire ... 192.168.2.1 192.168.1.1 UH 0 0 gif0 ... 正如 Flags 的值所显示的那样, 这是一个主机路由, 这意味着每一个网关都知道如何到达另一端的网关, 但它们现在还不知道如何到达对方的网络。 我们接下来立刻解决这个问题。 您很可能在两台机器上都在运行防火墙。 这需要作一些变动, 以便适应 VPN 的需要。 一般来说会希望两个网络相互传递数据包, 或者通过防火墙来隔离两边的危险。 如果您将防火墙配置为允许两边的网络传输通过, 则测试工作会简单不少。 随后您可以随时将限制变得更严格一些。 假如您在网关上使用 &man.ipfw.8; 则下面的命令 ipfw add 1 allow ip from any to any via gif0 将允许两端点的 VPN 数据通过, 而不影响其他防火墙策略。 很显然, 您需要在两个网关上都执行上述命令。 现在已经可以让两台机器相互 ping 了。 在 192.168.1.1 您应该能够正常执行 ping 192.168.2.1 并得到回应。 对于另一台网关来说也是一样。 然而, 到目前为止仍然还无法连上另一网络上的内部主机。 原因是路由 -- 尽管网关机知道如何到达对方那里, 但它们都不知道如何到达对方后面的网络。 要解决这个问题, 就必须在两边都添加一条静态路由。 可以在第一台网关上执行: route add 192.168.2.0 192.168.2.1 netmask 0xffffff00 这相当于是说 为了到达 192.168.2.0 子网的机器, 需要把包发给 192.168.2.1。 您需要在另一个网关上也执行类似的命令, 但使用 192.168.1.x 的地址。 来自一个网络上的 IP 访问现在能够抵达对面的网络了。 在两个网络之间建立 VPN 的过程已经完成了三分之二, 它现在已经是 虚拟的 网络, 然而它还不够专用。 您可以使用 &man.ping.8; 和 &man.tcpdump.1; 来进行测试, 并记录两边收发的数据包 tcpdump dst host 192.168.2.1 接下来登录到本机的另一个会话 ping 192.168.2.1 您将在输出中发现 16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply 如您所见, ICMP 消息在收发的过程中都没有加密。 如果使用了 参数来运行 &man.tcpdump.1;, 甚至可以得到包中的更多信息以及其中的数据。 很明显这是不能接受的。 下一节将讨论如何让两个网络之间的连接更安全, 这件事是通过对通讯实施加密来完成的。 小结: 在两边的内核中配置 device gif 编辑网关 #1 上的 /etc/rc.conf 并将下面的行添加进去 (根据需要改 IP )。 gif_interfaces="gif0" gifconfig_gif0="A.B.C.D W.X.Y.Z" ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff" static_routes="vpn" route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00" 在两台机器上编辑防火墙脚本 (/etc/rc.firewall, 或类似的名字) 在其中加入 ipfw add 1 allow ip from any to any via gif0 在网络 #2 的网关机上也对 /etc/rc.conf 做同样的修改, 注意把 IP 地址倒过来。 步骤 2: 对连接实施安全加固 为了加密连接通讯将用到 IPsec。 IPsec 提供了一种机制, 使得两台主机协商一个加密密钥, 并使用它加密之间的通讯。 在配置时有两个地方需要考虑。 必须有能够让两台主机协商所采用的加密方式的机制。 一旦双方确认了这机制, 则称他们之间建立了 安全关联 必须采用某种机制来指定哪些通讯需要加密。 很明显地, 通常并不需要所有的发出数据都被加密 -- 一般只需要加密在 VPN 上传输的那些数据。 这类决定哪些数据被加密的规则被称为 安全策略 安全关联和安全策略都是由内核来维护的, 并可以通过用户态的程序来修改。 在能够这样做之前, 首先需要配置内核来让它支持 IPsec 和安全载荷封装 (ESP) 协议。 配置下面的内核选项 内核选项 IPSEC options IPSEC options IPSEC_ESP 然后重新编译、 安装最后重新启动新的内核。 在继续进行设置之前, 您需要在两台网关上都进行同样的设置。 IKE 在建立安全关联时有两种选择。 一种方法是完全手工地在两台主机之间选择加密算法、 密钥等等, 另一种方法是使用实现了 Internet 密钥交换协议 (IKE) 的服务程序来帮您完成这些任务。 我们推荐后者。 不说别的, 它配置起来要容易得多。 IPsec security policies setkey 用 &man.setkey.8; 可以编辑和显示安全策略。 打个比方, setkey 之于内核的安全策略表, 就相当于 &man.route.8; 之于内核中的路由表。 setkey 还可以显示当前的安全关联, 这一点和 netstat -r 类似。 在 FreeBSD 上可供选择的用于管理安全关联的服务程序有很多。 这篇文章将介绍其中的一种, racoon —。 它可以从 &os; 的 Ports collection 中的 security/ipsec-tools 安装。 racoon racoon 软件, 必须在两台网关机上都运行。 需要配置 VPN 另一端的 IP, 以及一个密钥 (这个密钥可以任意选择, 但两个网关上的密钥必须一致)。 两端的服务程序将相互通讯, 并确认它们各自的身份 (使用刚刚配置的密钥) 然后服务程序将生成一个新的密钥, 并用它来加密 VPN 上的数据通讯。 它们定期地改变密钥, 因此即使供给者破解了一个密钥 (虽然这在理论上并不十分可行) 他也得不到什么 -- 破解密钥的时候, 已经产生一组新的密钥了。 racoon 的配置文件是存放在 ${PREFIX}/etc/racoon 目录中的。 在那里应该能够找到一个配置文件, 不需要修改太多的设置。 raccon 配置的另一部分, 也就是需要修改的内容, 是 预先配置的共享密钥 默认的 racoon 配置应该可以在 ${PREFIX}/etc/racoon/psk.txt 这个文件中找到。 需要强调的是, 这个密钥 并非 用于加密 VPN 连接的密钥, 他们只是密钥管理服务程序用以信任对方的一种凭据。 psk.txt 包含了需要打交道的每一个远程站点。 在本例中一共有两个站点, 每一个 psk.txt 都只有一行 (因为每个 VPN 接入点都只和一个端点连接)。 在网关机 #1 上应该是: W.X.Y.Z secret 这包括了远程站点的 公网 IP 地址, 空格, 以及提供秘密的字符串。 很明显不应使用 secret 作为实际的密钥 -- 通常的口令选择策略在这里也适用。 在网关 #2 上对应的配置是 A.B.C.D secret 也就是说, 对面端的公网 IP 地址, 以及同样的密钥。 psk.txt 的权限必须是 0600 (也就是说, 只有 root 能够读写) 否则 racoon 将不能运行。 两边的机器上都必须执行 racoon。 另外, 还需要增加一些防火墙规则来允许 IKE 通讯通过, 它是通过 UDP 在 ISAKMP (Internet 安全关联密钥管理协议) 端口上运行的协议。 再次强调, 这个规则应该在规则集尽可能早的位置出现。 ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp 一旦 racoon 开始运行, 就可以开始测试让网关进行相互的 ping 了。 此时连接还没有进行加密, 但 racoon 将在两个主机之间建立安全关联 -- 这可能需要一段时间, 对您来说, 具体的现象则是在 ping 命令开始响应之前会有短暂的延迟。 一旦安全关联建立之后, 就可以使用 &man.setkey.8; 来查看它了。 在两边的网关上执行 setkey -D 就可以看到安全关联的相关信息了。 现在只完成了一半的工作。 另一半是设置安全策略。 想要完成一个有判断力的安全策略, 首先要看我们已经完成的步骤。 接下来的讨论针对连接的两端。 您所发出的每一个 IP 包都包括一个包头, 其内容是和这个包有关的描述性数据。 包头包括了包的来源和目的的 IP 地址。 正如我们所了解的那样, 私有 IP 地址, 例如 192.168.x.y 这样的地址范围, 不应该出现在 Internet 的公网上。 于此相反, 他们必须首先封装到别的包中。 包的来源或目的如果是私有 IP 地址, 则必须替换成公网 IP 地址。 因此如果发出的包类似下面这样: .-------------------. | Src: 192.168.1.1 | | Dst: 192.168.2.1 | | <其他头信息 > | +-------------------+ | <包数据 > | `-------------------' 随后它将被封装进另一个包中, 像下面这样: .--------------------------. | Src: A.B.C.D | | Dst: W.X.Y.Z | | <附加头信息 > | +--------------------------+ | .----------------------. | | | Src: 192.168.1.1 | | | | Dst: 192.168.2.1 | | | | <附加头信息 > | | | +----------------------+ | | | <包数据 > | | | `----------------------' | `--------------------------' 封装过程是在 gif 设备上完成的。 如上图所示, 包现在有了外部的实际 IP 地址, 而原始的包则被封装到里面作为数据。 这个包将通过 Internet 传递。 很明显地, 我们希望 VPN 之间的通讯是加密的。 用于言来描述大致是: 如果包从 A.B.C.D 发出且其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。 如果包来自 W.X.Y.Z 且其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。 这已经很接近了, 但还不够正确。 如果这么做的话, 所有来自和发到 W.X.Y.Z 的包, 无论是否属于 VPN 通讯都会被加密。 这可能并不是您所希望的, 因此正确的安全策略应该是 如果包从 A.B.C.D 发出, 且封装了其他的包, 其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。 如果包来自 W.X.Y.Z, 且封装了其他的包, 其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。 一个很小, 但却必要的改动。 安全策略也是通过 &man.setkey.8; 设置的。 &man.setkey.8; 提供了一种用于配置策略的语言。 可以直接在 stdin 上输入策略, 或通过 选项来指定一个包含配置命令的文件。 网关 #1 上的配置 (其 IP 地址是 A.B.C.D) 强制将所有到 W.X.Y.Z 的通讯进行加密的配置是: spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 把这些命令放到一个文件 (例如 /etc/ipsec.conf) 然后执行 &prompt.root; setkey -f /etc/ipsec.conf 会告诉 &man.setkey.8; 我们希望把规则加入到安全策略数据库中。 命令的其它部分指定了什么样的包能够匹配这规则。 A.B.C.D/32W.X.Y.Z/32 是用于指定规则能够匹配的网络或主机的 IP 地址和掩码。 本例中, 希望应用到两个主机之间的通讯上。 则告诉内核这规则只应被用于封装其他包的那些数据包。 表示策略是针对发出的包的, 而 则表示需要对数据包进行加密。 第二行指定了如何加密。 是将要使用的协议, 而 则表示包应该进一步封装进一个 IPsec 包里面。 反复使用 A.B.C.DW.X.Y.Z 用来选择所用的安全关联 而最后的 则强制所有匹配这规则的包都被加密。 上面的规则只匹配了发出的包。 接下来需要配置类似的匹配进入包的规则。 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; 请注意本例中 代替了 并且 IP 地址的顺序也相反。 在另一个网关上 (其公网 IP 地址是 W.X.Y.Z) 也需要类似的规则。 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 最后是添加允许 ESP 和 IPENCAP 包进出的防火墙规则。 这些规则需要在两边分别设置。 ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D 由于规则的对称性, 因此可以在两台网关上使用同样的规则。 发出的包如下图所示: .------------------------------. --------------------------. | Src: A.B.C.D | | | Dst: W.X.Y.Z | | | <other header info> | | Encrypted +------------------------------+ | packet. | .--------------------------. | -------------. | contents | | Src: A.B.C.D | | | | are | | Dst: W.X.Y.Z | | | | completely | | <other header info> | | | |- secure | +--------------------------+ | | Encap'd | from third | | .----------------------. | | -. | packet | party | | | Src: 192.168.1.1 | | | | Original |- with real | snooping | | | Dst: 192.168.2.1 | | | | packet, | IP addr | | | | <other header info> | | | |- private | | | | +----------------------+ | | | IP addr | | | | | <packet data> | | | | | | | | `----------------------' | | -' | | | `--------------------------' | -------------' | `------------------------------' --------------------------' 当 VPN 数据被远端接到时, 它将首先被解密 (使用 racoon 协商得到的安全关联)。 然后它们将进入 gif 接口, 并在那里展开第二层, 直到只剩下最里层的包, 并将其转发到内网上。 可以通过与之前同样的 &man.ping.8; 命令来测试安全性。 首先登录到 A.B.C.D 网关上并执行: tcpdump dst host 192.168.2.1 在同一主机上登录另一会话, 执行 ping 192.168.2.1 此时的输出应该是: XXX tcpdump output 如您看到的, &man.tcpdump.1; 给出的将是 ESP 包。 假如您想查看它们的内容可以使用 option 选项, 您将 (显然地) 看到一些乱码, 因为传输过程实施了加密。 祝贺您。 您已经完成了两个远程站点之间的 VPN 的架设工作。 小结 将两边的内核配置加入: options IPSEC options IPSEC_ESP 安装 security/ipsec-tools。 编辑两台网关上的 ${PREFIX}/etc/racoon/psk.txt 并添加远程主机的 IP 和共享的密钥。 文件的权限应该是 0600。 将下面的设置加入两台主机的 /etc/rc.conf 中: ipsec_enable="YES" ipsec_file="/etc/ipsec.conf" 在两个网关上都建立 /etc/ipsec.conf 并添加必要的 spdadd。 在网关 #1 上是: spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; 在网关 #2 上则是: spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 添加防火墙规则以允许 IKE, ESP, 和 IPENCAP 通讯能够到达各自的主机: ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D 前面的两步应该足以让 VPN 运转起来了。 两个网络上的机器都应该能通过 IP 来访问对方, 而所有的通讯都被自动地进行加密。
Chern Lee 原著 OpenSSH OpenSSH 安全 OpenSSH OpenSSH 是一组用于安全地访问远程计算机的连接工具。 它可以作为 rloginrsh rcp 以及 telnet 的直接替代品使用。 更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。 OpenSSH 由 OpenBSD project 维护, 它基于 SSH v1.2.12 并包含了最新的错误修复和更新。 它同时兼容 SSH 协议的 1 和 2 两个版本。 使用 OpenSSH 的好处 通常,当使用 &man.telnet.1; 或 &man.rlogin.1; 时, 数据是以明码的形式发送的,并没有加密。 在客户机和服务器之间的网络上运行的听包程序可以在会话中偷窃到传输的用户名/密码和数据。 OpenSSH 提供了多种的身份验证和加密方法来防止这种情况的发生。 启用 sshd OpenSSH 启用 sshd 的启用是作为 &os; 安装中 Standard 安装过程中的一步来进行的。 要查看 sshd 是否已被启用, 请检查 rc.conf 文件中的: sshd_enable="YES" 这表示在下次系统启动时加载 OpenSSH 的服务程序 &man.sshd.8;。 此外, 也可以手动使用 &man.rc.8; 脚本 /etc/rc.d/sshd 来启动 OpenSSH /etc/rc.d/sshd start SSH 客户 OpenSSH 客户 &man.ssh.1; 的工作方式和 &man.rlogin.1; 非常类似。 &prompt.root; ssh user@example.com Host key not found from the list of known hosts. Are you sure you want to continue connecting (yes/no)? yes Host 'example.com' added to the list of known hosts. user@example.com's password: ******* 登录过程和使用 rlogintelnet 建立的会话非常类似。 在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。 只有在第一次连接时, 用户会被要求输入 yes。 之后的连接将会验证预先保存下来的密钥指纹。 如果保存的指纹与登录时接收到的不符, 则将会给出警告。 指纹保存在 ~/.ssh/known_hosts 中, 对于 SSH v2 指纹, 则是 ~/.ssh/known_hosts2 默认情况下, 较新版本的 OpenSSH 只接受 SSH v2 连接。 如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。 此外, 也可以通过命令行参数 来相应地强制使用版本 1 或 2。 保持客户端的版本 1 能力是为了考虑较早版本的兼容性。 安全复制 OpenSSH 安全复制 scp &man.scp.1; 命令和 &man.rcp.1;; 的用法类似, 它用于将文件复制到远程的机器上, 或复制过来, 区别是它是安全的。 &prompt.root; scp user@example.com:/COPYRIGHT COPYRIGHT user@example.com's password: ******* COPYRIGHT 100% |*****************************| 4735 00:00 &prompt.root; 由于先前的例子中已经保存了指纹, 使用 &man.scp.1; 时会自动地加以验证。 &man.scp.1; 使用的参数同 &man.cp.1; 类似。 第一个参数是一个或一组文件, 然后是复制的目标。 由于文件是通过 SSH 在网上传递的, 因此某些文件的名字需要写成 配置 OpenSSH 配置 针对 OpenSSH 服务程序和客户端的系统级配置文件在 /etc/ssh 目录中。 ssh_config 用于配置客户端的设定, 而 sshd_config 则用于配置服务器端。 另外 (默认是 /usr/sbin/sshd), 以及 这两个 rc.conf 选项提供了更多的配置选择。 ssh-keygen 用于取代口令的一种方法是使用 &man.ssh-keygen.1; 来生成 DSA 或 RSA 密钥对用于验证用户的身份: &prompt.user; ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/user/.ssh/id_dsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_dsa. Your public key has been saved in /home/user/.ssh/id_dsa.pub. The key fingerprint is: bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com &man.ssh-keygen.1; 会生成一个包含公私钥对用于验证身份。 私钥将保存到 ~/.ssh/id_dsa~/.ssh/id_rsa, 而公钥则被存放到 ~/.ssh/id_dsa.pub~/.ssh/id_rsa.pub, 文件名取决于您选择的 DSA 和 RSA 密钥类型。 公钥必须被存放到远程机器上的 ~/.ssh/authorized_keys 才能够使系统正确运转。 类似地, 第 1 版的 RSA 公钥应存放到 ~/.ssh/authorized_keys 这将允许从远程连接时以基于 SSH 密钥的验证来代替口令验证。 如果在 &man.ssh-keygen.1; 中使用了通行字, 则每次使用私钥时都需要输入它。 &man.ssh-agent.1; 能够缓解多次输入长通行字的压力, 并将在接下来的 予以详述。 选项和配置文件可能随 OpenSSH 的版本不同而不同; 为了避免出现问题, 您应参考 &man.ssh-keygen.1; 联机手册。 ssh-agent 和 ssh-add &man.ssh-agent.1; 和 &man.ssh-add.1; 这两个工具, 提供了一种将 SSH 秘钥加载到内存中以便使用, 而不必每次都输入通行字的方法。 &man.ssh-agent.1; 工具能够使用加载到其中的私钥来处理验证过程。 &man.ssh-agent.1; 应被用于启动另一个应用程序。 最基本的用法是, 使用它来启动 shell, 而高级一些的用法则是用它来启动窗口管理器。 要在 shell 中使用 &man.ssh-agent.1;, 首先应把 shell 作为参数来启动它。 随后, 应通过 &man.ssh-add.1; 并输入通行字, 来向它提供身份验证信息。 一旦这些步骤都做完了, 用户就应该能够 &man.ssh.1; 到任何一个安装了对应公钥的机器了。 例如: &prompt.user; ssh-agent csh &prompt.user; ssh-add Enter passphrase for /home/user/.ssh/id_dsa: Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa) &prompt.user; 要在 X11 中使用 &man.ssh-agent.1;, 调用 &man.ssh-agent.1; 的过程应置于 ~/.xinitrc 之中。 这将把 &man.ssh-agent.1; 服务提供给所有在 X11 中运行的程序。 下面是一个 ~/.xinitrc 文件的实例: exec ssh-agent startxfce4 这将启动 &man.ssh-agent.1;, 而后者将在每次 X11 启动时运行 XFCE。 作完这些之后就可以重启 X11 以便使修改生效。 随后您就可以运行 &man.ssh-add.1; 来加载全部 SSH 密钥了。 SSH 隧道 OpenSSH 隧道 OpenSSH 能够创建隧道以便用加密的会话来封装其他协议。 下面的命令告诉 &man.ssh.1; 为 telnet 创建一个隧道: &prompt.user; ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com &prompt.user; 上述 ssh 命令使用了下面这些选项: 强制 ssh 使用第2版的协议 (如果需要和较老的 SSH 一同工作请不要使用这个选项)。 表示不使用命令行, 或者说只使用隧道。 如果省略, ssh 将同时初始化会话。 强制 ssh 在后台执行。 表示产生一条 本地端口:远程主机:远程端口 形式的隧道。 远程 SSH 服务器。 SSH 隧道通过监听 localhost 上面指定端口来完成工作。 它将把本机主机/端口上接收到的连接通过 SSH 连接转发到远程主机/端口。 本例中, 位于 localhost5023 端口 被用于转发 localhost 的连接到远程主机的 23 端口。 由于 23telnet 使用的, 因此它将通过 SSH 隧道完成 telnet 会话。 这可以用来封装任意不安全的 TCP 协议, 例如 SMTP、 POP3、 FTP等等。 使用 SSH 为 SMTP 创建安全隧道 &prompt.user; ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com user@mailserver.example.com's password: ***** &prompt.user; telnet localhost 5025 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailserver.example.com ESMTP 这可以与 &man.ssh-keygen.1; 以及额外的用户帐号配合来建立一个更透明的 SSH 隧道环境。 密钥可以被用在需要输入口令的地方, 而且可以为不同的用户配置不同的隧道。 实用的 SSH 通道例子 加强 POP3 服务的安全 工作时, 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络, 或从您家到办公室的网络可能不, 或不完全可信。 基于这样的原因, 您需要以安全的方式来查看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接, 并通过这个连接来访问 POP3 服务: &prompt.user; ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com user@ssh-server.example.com's password: ****** 当这个通道连上时, 您可以把 POP3 请求发到 localhost 端口 2110。 这个连接将通过通道安全地转发到 mail.example.com 绕过严厉的防火墙 一些大脑长包的网络管理员会使用一些极端的防火墙策略, 不仅过滤进入的连接, 而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行 SSH 和网页浏览。 您可能希望访问一些其它的 (也许与工作无关的) 服务, 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐, 则您将无法访问它。 解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。 &prompt.user; ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org user@unfirewalled-system.example.org's password: ******* 现在您可以把客户程序指定到 localhost 的 8888 端口, 它将把请求转发给 music.example.com 的 8000 端口, 从而绕过防火墙。 允许用户登录 <varname>AllowUsers</varname> 选项 通常限制哪些用户能够登录, 以及从何处登录会是好主意。 采用 AllowUsers 选项能够方便地达到这一目的。 例如, 想要只允许 root 用户从 192.168.1.32 登录, 就可以在 /etc/ssh/sshd_config 文件中加入下述设置: AllowUsers root@192.168.1.32 要允许用户 admin 从任何地方登录, 则只需列出用户名: AllowUsers admin 可以在同一行指定多个用户, 例如: AllowUsers root@192.168.1.32 admin 列出需要登录机器的用户很重要; 否则他们将被锁在外面。 在完成对 /etc/ssh/sshd_config 的修改之后您必须告诉 &man.sshd.8; 重新加载其配置文件, 方法是执行: &prompt.root; /etc/rc.d/sshd reload 进一步的资料 OpenSSH &man.ssh.1; &man.scp.1; &man.ssh-keygen.1; &man.ssh-agent.1; &man.ssh-add.1; &man.ssh.config.5; &man.sshd.8; &man.sftp-server.8; &man.sshd.config.5; Tom Rhodes 作者 ACL 文件系统访问控制表 与文件系统在其他方面的加强, 如快照等一道, &os; 5.0 及更高版本提供了通过文件系统访问控制表 (ACL) 实现的安全机制。 访问控制表以高度兼容 (&posix;.1e) 的方式扩展了标准的 &unix; 权限模型。 这一特性使得管理员能够利用其优势设计更为复杂的安全模型。 如果想为 UFS 文件系统启用 ACL 支持, 则需要添加下列选项: options UFS_ACL 并重新编译内核。 如果没有将这个选项编译进内核, 则在挂接支持 ACL 的文件系统时将会收到警告。 这个选项在 GENERIC 内核中已经包含了。 ACL 依赖于在文件系统上启用扩展属性。 在新一代的 &unix; 文件系统, UFS2 中内建了这种支持。 UFS1 上配置扩展属性需要比 UFS2 更多的管理开销。 而且, 在 UFS2 上的扩展属性的性能也有极大的提高。 因此, 如果想要使用访问控制表, 推荐使用 UFS2 而不是 UFS1 ACL 可以在挂接时通过选项 来启动, 它可以加入 /etc/fstab。 另外, 也可以通过使用 &man.tunefs.8; 修改超级块中的 ACL 标记来持久性地设置自动的挂接属性。 一般而言, 后一种方法是推荐的做法, 其原因是: 挂接时的 ACL 标记无法被重挂接 (&man.mount.8; ) 改变, 只有完整地 &man.umount.8; 并做一次新的 &man.mount.8; 才能改变它。 这意味着 ACL 状态在系统启动之后就不可能在 root 文件系统上发生变化了。 另外也没有办法改变正在使用的文件系统的这个状态。 在超级块中的设置将使得文件系统总被以启用 ACL 的方式挂接, 即使在 fstab 中的对应项目没有作设置, 或设备顺序发生变化时也是如此。 这避免了不慎将文件系统以没有启用 ACL 的状态挂接, 从而避免没有强制 ACL 这样的安全问题。 可以修改 ACL 行为, 以允许在没有执行一次全新的 &man.mount.8; 的情况下启用它, 但我们认为, 不鼓励在未启用 ACL 时这么做是有必要的, 因为如果启用了 ACL, 然后关掉它, 然后在没有刷新扩展属性的情况下重新启用它是很容易造成问题的。 一般而言, 一旦启用了文件系统的 ACL 就不应该再关掉它, 因为此时的文件系统的保护措施可能和用户所期待的样子不再兼容, 而重新启用 ACL 将重新把先前的 ACL 附着到文件上, 而由于它们的权限发生了变化, 就很可能造成无法预期的行为。 在查看目录时, 启用了 ACL 的文件将在通常的属性后面显示 + (加号)。 例如: drwx------ 2 robert robert 512 Dec 27 11:54 private drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1 drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2 drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3 drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html 这里我们看到了 directory1directory2, 以及 directory3 目录使用了 ACL。 而 public_html 则没有。 使用 <acronym>ACL</acronym> 文件系统 ACL 可以使用 &man.getfacl.1; 工具来查看。 例如, 如果想查看 testACL 设置, 所用的命令是: &prompt.user; getfacl test #file: #owner:1001 #group:1001 user::rw- group::r-- other::r-- 要修改这个文件上的 ACL 设置, 则需要使用 &man.setfacl.1; 工具。 例如: &prompt.user; setfacl -k test 参数将把所有当前定义的 ACL 从文件或文件系统中删除。 一般来说应该使用 因为它会保持让 ACL 正常工作的那些项不变。 &prompt.user; setfacl -m u:trhodes:rwx,group:web:r--,o::--- test 在前面的命令中, -m 选项被用来修改默认的 ACL 项。由于已经被先前的命令 删除,因此没有预先定义的项,于是默认的选项被恢复,并附加上指定的选项。 请小心地检查,如果您加入了一个不存在的用户或组,那么将会在 stdout 得到一条 Invalid argument 的错误提示。 Tom Rhodes Contributed by Portaudit 监视第三方安全问题 过去几年中, 安全领域在如何处理漏洞的评估方面取得了长足的进步。 几乎每一个操作系统都越来越多地安装和配置了第三方工具, 而系统被入侵的威胁也随之增加。 漏洞的评估是安全的一个关键因素, 尽管 &os; 会发布基本系统的安全公告, 然而为每一个第三方工具都发布安全公告则超出了 &os; Project 的能力。 在这一前提下, 一种减轻第三方漏洞的威胁, 并警告管理员存在已知的安全问题的方法也就应运而生。 名为 Portaudit 的 &os; 附加工具能够帮助您达成这一目的。 - security/portaudit port + ports-mgmt/portaudit port 会下载一个数据库, 这一数据库是由 &os; Security Team 和 ports 开发人员维护的, 其中包含了已知的安全问题。 要开始使用 Portaudit, 需要首先从 Ports Collection 安装它: - &prompt.root; cd /usr/ports/security/portaudit && make install clean + &prompt.root; cd /usr/ports/ports-mgmt/portaudit && make install clean 在安装过程中, &man.periodic.8; 的配置文件将被修改, 以便让 Portaudit 能够在每天的安全审计过程中运行。 一定要保证发到 root 帐号的每日安全审计邮件确实有人在读。 除此之外不需要进行更多的配置了。 安装完成之后, 管理员可以通过下面的命令来更新数据库, 并查看目前安装的软件包中所存在的已知安全漏洞: &prompt.root; portaudit -Fda 由于每天执行 &man.periodic.8; 时都会自动更新数据库, 因此, 运行这条命令是可选的。 在这里只是作为例子给出。 在任何时候, 如果希望对通过 Ports Collection 安装的第三方软件工具进行审计, 管理员都可以使用下面的命令: &prompt.root; portaudit -a 针对存在漏洞的软件包, Portaudit 将生成类似下面的输出: Affected package: cups-base-1.1.22.0_1 Type of problem: cups-base -- HPGL buffer overflow vulnerability. Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> 1 problem(s) in your installed packages found. You are advised to update or deinstall the affected package(s) immediately. 通过访问上面给出的 URL, 管理员能够了解关于那个漏洞的进一步信息。 这些信息通常包括受到影响的 &os; Port 版本, 以及其他可能包含安全公告的网站。 简而言之, Portaudit 是一个强大的工具, 并能够配合 Portupgrade port 来非常有效地工作。 Tom Rhodes 作者 FreeBSD 安全公告 &os; 安全公告 像其它具有产品级品质的操作系统一样, &os; 会发布 安全公告。 通常这类公告会只有在在相应的发行版本已经正确地打过补丁之后发到安全邮件列表并在勘误中说明。 本节将介绍什么是安全公告, 如何理解它, 以及为系统打补丁的具体步骤。 安全公告看上去是什么样子? &os; 安全公告的样式类似下面的范例, 这一例子来自 &a.security-notifications.name; 邮件列表。 ============================================================================= &os;-SA-XX:XX.UTIL Security Advisory The &os; Project Topic: denial of service due to some problem Category: core Module: sys Announced: 2003-09-23 Credits: Person@EMAIL-ADDRESS Affects: All releases of &os; &os; 4-STABLE prior to the correction date Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE) 2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6) 2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15) 2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8) 2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18) 2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21) 2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33) 2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43) 2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39) CVE Name: CVE-XXXX-XXXX For general information regarding FreeBSD Security Advisories, including descriptions of the fields above, security branches, and the following sections, please visit http://www.FreeBSD.org/security/. I. Background II. Problem Description III. Impact IV. Workaround V. Solution VI. Correction details VII. References Topic(标题) 一栏说明了问题到底是什么。 它基本上是对所发现的安全问题及其所涉及的工具的描述。 Category (分类) 是指系统中受到影响的组件, 这一栏可能是 corecontrib, 或者 ports 之一。 core 分类表示安全弱点影响到了 &os; 操作系统的某个核心组件。 contrib 分类表示弱点存在于某个捐赠给 &os; Project 的软件, 例如 sendmail。 最后是 ports, 它表示该弱点影响了 Ports Collection 中的某个第三方软件。 Module(模块) 一栏给出了组件的具体位置, 例如 sys。 在这个例子中, 可以看到 sys 模块是存在问题的; 因此, 这个漏洞会影响某个在内核中的组件。 Announced(发布时间) 一栏反映了与安全公告有关的数据是什么时候公之于众的。 这说明安全团队已经证实问题确实存在, 而补丁已经写入了 &os; 的代码库。 Credits(作者) 一栏给出了注意到问题存在并报告它的个人或团体。 The Affects(影响范围) 一栏给出了 &os; 的那些版本存在这个漏洞。 对于内核来说, 检视受影响的文件上执行的 ident 输出可以帮助确认文件版本。 对于 ports, 版本号在 /var/db/pkg 里面的 port 的名字后面列出。 如果系统没有与 &os; CVS 代码库同步并每日构建, 它很可能是有问题的。 Corrected(修正时间) 一栏给出了发行版本中修正问题的具体日期、时间和时差。 在公共漏洞数据库 (Common Vulnerabilities Database) 系统中预留的, 用于查看漏洞的标识信息。 Background(技术背景) 一栏提供了受影响的组件的作用。 多数时候这一部分会说明为什么 &os; 中包含了它, 它的作用, 以及它的一些原理。 Problem Description(问题描述) 一栏深入阐述安全漏洞的技术细节。 这部分有时会包括有问题的代码相关的详细情况, 甚至是这个部件如何能够被恶意利用并打开漏洞的细节。 Impact(影响) 一栏描述了问题能够造成的影响类型。 例如, 可能导致拒绝服务攻击, 权限提升, 甚至导致得到超级用户的权限。 Workaround(应急方案) 一栏给出了系统管理员在暂时无法升级系统时可以采取的临时性对策。 这些原因可能包括时间限制, 网络资源的限制, 或其它因素。 不过无论如何, 安全不能够被轻视, 有问题的系统要么应该打补丁, 要么应该实施这种应急方案。 Solution(解决方案) 一栏提供了如何给有问题的系统打补丁的方法。 这是经过逐步测试和验证过的给系统打补丁并让其安全地工作的方法。 =Correction Details(修正细节) 一栏展示了针对 CVS 分支或某个发行版的修正特征。 同时也提供了每个分支上相关文件的版本号。 References(文献) 一栏通常会给出其它信息的来源。 这可能包括 URL, 书籍、 邮件列表以及新闻组。 Tom Rhodes Contributed by 进程记帐 进程记帐 进程记帐是一种管理员可以使用的跟踪系统资源使用情况的手段, 包括它们分配给了哪些用户、 提供系统监视手段, 并且可以精细到用户执行的每一个命令。 当然, 这种做法是兼有利弊的。 它的好处是, 查找入侵时可以迅速把范围缩小到攻击者进入的时刻; 而这样做的缺点, 则是记帐会产生大量的日志, 因而需要很多磁盘空间来存储它们。 这一节将带领管理员一步一步地配置基本的进程记帐。 启用并利用进程记帐 在使用进程记帐之前, 必须先启用它。 要完成这项工作, 需要运行下面的命令: &prompt.root; touch /var/account/acct &prompt.root; accton /var/account/acct &prompt.root; echo 'accounting_enable="YES"' >> /etc/rc.conf 一旦启用之后, 记帐就会开始跟踪 CPU 统计数据、 命令, 等等。 所有的记帐日志不是以可读的方式记录的, 要查看它们, 需要使用 &man.sa.8; 这个工具。 如果没有给出其他参数, 则 sa 将按用户, 以分钟为单位显示他们所使用的时间、 总共的 CPU 和用户时间, 以及平均的 I/O 操作数目, 等等。 要显示关于刚刚发出的命令的相关信息, 则应使用 &man.lastcomm.1; 工具。 lastcomm 可以用来显示在某一 &man.ttys.5; 上的用户信息, 例如: &prompt.root; lastcomm ls trhodes ttyp1 将会显示出所有已知的 trhodes 在 ttyp1 终端上执行 ls 的情况。 更多的可用选项在联机手册 &man.lastcomm.1;、 &man.acct.5; 和 &man.sa.8; 中有所介绍。
diff --git a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml index 389d3b4416..947cf769c7 100644 --- a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml @@ -1,2545 +1,2545 @@ 串口通讯 概述 串口通讯 &unix; 一直都是支持串口通讯的。事实上, 早期的 &unix; 系统就是利用串口线来输入和输出数据的。 那时常见的 终端 包括一个每秒10个字符的串口打印机和键盘, 现在这些已经发生了很大的变化。 这章将介绍一些利用 FreeBSD 进行串口通讯的方法。 读完这章,您将了解到: 如何通过终端连接到您的FreeBSD系统。 如何使用modem拨号到远程主机。 如何允许远程用户通过modem登录到您的系统。 如何从串口控制台引导您的系统。 阅读这章之前,您应当了解: 如何配置和安装一个新的内核 ()。 理解 &unix; 的权限和进程 ()。 准备您打算在 FreeBSD 中使用的串口设备 (modem 或多插口卡) 的技术参考手册。 介绍 术语 bits-per-second bps 每秒位— 数据的传输速度 DTE DTE 数据终端设备 — 如您的计算机 DCE DCE 数据通讯设备 — 如您的modem RS-232 RS-232C cables 用于硬件串口通讯的EIA标准 当讨论通讯数据速度的时候,这节不会使用术语 baud。Baud指电气标准传输率,它已经使用了很长时间, 而 bps (bits per second) 才是正确使用的术语 (至少它不会打扰那些爱争吵的家伙)。 线缆和端口 要将 modem 或终端与您的 FreeBSD 系统相连, 您的计算机需要一个串口, 以及用于连接串口设备所需的线缆。 如果您比较熟悉硬件及所需要的电缆, 则可以跳过这节。 线缆 串口线缆有许多不同的种类。 最常见的两种类型是 null-modem 线缆和标准 (直联) RS-232 线缆。 您的硬件说明书中会介绍应使用的线缆种类。 Null-modem线缆 null-modem cable null-modem 电缆会直接传送某些信号, 如 Signal Ground (信号地), 但对其他信号进行交换。 例如, Transmitted Data (数据发送) 引脚是连到另一端 Received Data (数据接收) 引脚的。 也可以自行制作 null-modem 电缆给终端使用 (例如, 为了品质的要求)。 下面的表格展示了 RS-232C 信号, 以及 DB-25 连接器上的引脚。 注意, 标准也要求一根直通引脚 1 到引脚 1 的 保护地 (Protective Ground) 线, 但这通常都被省掉。 某些终端在只有引脚 2、 3 和 7 的时候, 就已经能够正常使用了, 而其他一些, 则需要下面例子中所展示的不同的配置。 DB-25 to DB-25 Null-Modem Cable 信号 引脚 # 引脚 # 信号 SG 7 连接到 7 SG TD 2 连接到 3 RD RD 3 连接到 2 TD RTS 4 连接到 5 CTS CTS 5 连接到 4 RTS DTR 20 连接到 6 DSR DTR 20 连接到 8 DCD DSR 6 连接到 20 DTR DCD 8 连接到 20 DTR
这里还有两种目前比较流行的其他接线方式。 DB-9 到 DB-9 Null-Modem 电缆 信号 引脚 # 引脚 # 信号 RD 2 接到 3 TD TD 3 接到 2 RD DTR 4 接到 6 DSR DTR 4 接到 1 DCD SG 5 接到 5 SG DSR 6 接到 4 DTR DCD 1 接到 4 DTR RTS 7 接到 8 CTS CTS 8 接到 7 RTS
DB-9 到 DB-25 Null-Modem 电缆 信号 引脚 # 引脚 # 信号 RD 2 DB-9 到 DB-25 Null-Modem 电缆 2 TD TD 3 接到 3 RD DTR 4 接到 6 DSR DTR 4 接到 8 DCD SG 5 接到 7 SG DSR 6 接到 20 DTR DCD 1 接到 20 DTR RTS 7 接到 5 CTS CTS 8 接到 4 RTS
当某一段连接器上的一个引脚需要连接到对端的一对引脚时, 通常是将那一对引脚使用一短线连接, 而使用长线接到另一端的那个引脚。 上面的设计似乎更为流行。 在其他变种中 (在 RS-232 Made Easy 这本书中进行了详细介绍) 则是 SG 接 SG, TD 接 RD、 RTS 和 CTS 接 DCD、 DTR 接 DSR, 反之亦然。
标准RS-232C线缆 RS-232C cables 标准的串口电缆会直接传送所有 RS-232C 信号。 也就是说, 一头的 Transmitted Data 引脚, 会直接接到另一头的 Transmitted Data 引脚。 这包括将调制解调器接到您的 FreeBSD 系统上的那种电缆, 同样也适用于某些型号的终端。
端口 串口是FreeBSD主机与终端传输数据的设备。 这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。 端口的种类 有好几种串口。 在采购或制作线缆之前, 您应确认它能够适合您的终端以及 FreeBSD 系统。 绝大多数终端都提供 DB-25 端口。 个人计算机, 也包括运行 FreeBSD 的 PC 机, 通常会有 DB-25 或 DB-9 口。 如果您的 PC 上有多插口串口卡, 则可能有 RJ-12 或 RJ-45 口。 请参见您硬件的文档以了解所用接口的规格。 此外, 您也可以通过观察外观来了解所用的端口。 端口名称Port Names 在FreeBSD中,您可以通过 /dev 目录中的一个记录来访问每个串口。有两种不同的记录: 呼入端口被命名为/dev/ttydN, 这里 N 是端口号,从零开始。 通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测 (DCD) 信号来工作。 呼出端口被命名为 /dev/cuadN。 您通常不使用呼出端口作为终端, 只使用modem。 如果串口线或终端不支持载波检测数据传输, 您可以使用呼出端口。 在 &os; 5.X 和更早版本中, 呼出端口的名字是 /dev/cuaaN 如果您已经连接一个终端到第一个串口 (在 &ms-dos; 上是COM1), 则可以使用 /dev/ttyd0 来作为终端。 如果它是在第二个串口 (COM2), 那就是 /dev/ttyd1,等等。
内核配置 FreeBSD默认支持4个串口。 在&ms-dos;下,这些是 COM1COM2COM3, 和 COM4。 FreeBSD 目前支持 dumb 多口串口卡,如 BocaBoard 1008 和 2016, 以及许多 Digiboard 和 Stallion Technologies 制造的智能多接口卡。 不过, 默认的内核只会寻找标准的COM端口。 要看看您的内核是否支持您的串口,只要在内核启动时查看一下启动信息, 或使用 /sbin/dmesg 命令重新检测内核启动信息。 特别的,寻找以sio字符启动的信息。 如果想只察看包含 sio 一词的消息, 可以使用下面的命令: &prompt.root; /sbin/dmesg | grep 'sio' 例如,在一个带有4个串口的系统上,这些是串口特定的内核启动信息: sio0 at 0x3f8-0x3ff irq 4 on isa sio0: type 16550A sio1 at 0x2f8-0x2ff irq 3 on isa sio1: type 16550A sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A sio3 at 0x2e8-0x2ef irq 9 on isa sio3: type 16550A 如果内核未能认出所有的串口, 可能需要通过修改 /boot/device.hints 文件来进行一些配置。 此外, 也可以注释或完全删除掉您没有的设备。 请参见 &man.sio.4; 联机手册来了解关于串口, 以及多插口卡配置的进一步细节。 如果您正使用一个在不同版本的 FreeBSD 上的文件请务必小心, 因为设备参数和语法发生了变化。 这里端口 IO_COM1 代替了 0x3f8,端口 IO_COM2 代替了 0x2f8,端口 IO_COM3 代替了 0x3e8,端口 IO_COM4 代替了 0x2e8,这些都是各自端口相应的端口地址。 中断4,3,5,9都是经常用的中断。也要注意有些正常的串口可能 无法 在一些ISA总线的PC上共享中断 (多插口板卡有板载的电子设备,允许在板上所有 16550A 的设备共享一个或两个中断请求)。 设备特殊文件 在内核中, 大多数设备都是通过 设备特殊文件 来访问的, 这些文件一般位于 /dev 目录中。 sio 是通过 /dev/ttydN (呼入) 和 /dev/cuadN (呼出) 设备来访问的。 此外, FreeBSD 也提供了初始化设备 (在 &os; 6.X 上是 /dev/ttydN.init 以及 /dev/cuadN.init, 而在 &os; 5.X 上则是 /dev/ttyidN/dev/cuaiaN) 以及锁设备 (在 &os; 6.X 上是 /dev/ttydN.lock/dev/cuadN.lock, 而在 &os; 5.X 上则是 /dev/ttyldN/dev/cualaN)。 初始化设备用于在打开端口时初始化其通讯参数, 例如使用 RTS/CTS 信号进行流控制的调制解调器的 crtscts。 锁设备则用于在端口上提供一个锁标志, 防止用户或程序改变特定的参数; 请参见 &man.termios.4;、 &man.sio.4;, 以及 &man.stty.1; 的联机手册, 以了解关于终端配置、 锁和初始化设备, 以及配置终端参数的详细信息。 串口配置 ttyd cuad ttydN (或 cuadN) 设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时, 它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置: &prompt.root; stty -a -f /dev/ttyd1 当您修改了这个设备的设置,这个设置会生效,除非设备被关闭。 当它被重新打开时,它将回到默认设置。 要修改默认设置,您可以打开和调整 初始状态 设备的设置。例如, 要为ttyd5 打开 模式,8位通讯和默认的 流控制, 输入: &prompt.root; stty -f /dev/ttyd5.init clocal cs8 ixon ixoff rc files rc.serial 串口设备的系统级初始化, 是由 /etc/rc.d/serial 来控制的。 这个文件会影响串口设备的默认设置。 为了防止应用程序修改某些设置, 应修改 lock state(锁状态) 设备。 例如, 要把 ttyd5 的速率锁定为 57600 bps, 输入: &prompt.root; stty -f /dev/ttyd5.lock 57600 现在,一个打开ttyd5 和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地, 您需要确定初始状态,然后用root帐户锁定状态设备的写入功能。 很显然,您应该只让 root 用户可以初始化或锁定设备的状态。
Sean Kelly Contributed by 终端 终端 当您在计算机控制台或是在一个连接的网络上时, 终端提供了一个方便和低成本的访问 FreeBSD 系统的方法。 这节描述了如何在 FreeBSD 上使用终端。 终端的用法和类型 早期的 &unix; 系统没有控制台。 人们通过将终端连接到计算机的串口来登录和使用程序。 它很像用 modem 和一些终端软件来拨号进入一个远程的系统, 只能执行文本的工作。 今天的 PC 已经可以使用高质量的图形了, 但与今天的其他&unix;操作系统一样,建立一个登录会话的能力仍然存在。 通过使用一个终端连接到一个没有使用的串口, 您就能登录和运行任何文本程序或在 X 视窗系统中运行一个 xterm 窗口程序。 对于商业用户,您可以把任何终端连接到 FreeBSD 系统, 然后把它们放在员工的桌面上。 对于家庭用户,则可以使用一台比较老的 IBM PC 或 Macintosh 运行一个终端连接到一台运行 FreeBSD 的高性能机器上。 对于FreeBSD,有三种终端: 哑终端 充当终端的PC X 终端 下面一小节将描述每一种终端。 哑终端 哑终端需要专门的好几种硬件,让您通过串口线连接到计算机。 它们被叫做 是因为它们只能够用来显示, 发送和接收文本。 您不能在它上面运行任何程序。 有好几百种哑终端,包括Digital Equipment Corporation 的VT-100和Wyse的WY-75。只有几种可以在FreeBSD上工作。 一些高端的终端可以显示图形,但只有某些软件包可以使用这些高级特性。 哑终端被广泛用于那些不需要图形应用的工作中。 充当终端的PC 假如 哑终端 的功能仅限于显示、 发送和接收文本的话, 那么显然任何一台闲置的个人计算机, 都完全能够胜任哑终端的工作。 因此您需要的是合适的线缆, 以及一些在这台计算机上运行的 终端仿真 软件。 这种配置在家庭中应用十分广泛。 例如, 如果您的爱人正忙于在您的 FreeBSD 系统的控制台上工作时, 您就可以将一台功能稍弱的计算机挂在这个 FreeBSD 系统上来同时完成一些文本界面的工作。 在 &os; 的基本系统中至少有两个能用于进行串口连接的工具: &man.cu.1; 和 &man.tip.1;。 如果要从运行 &os; 的计算机上通过串口连接到另一系统, 可以使用: &prompt.root; cu -l 串口设备 此处 串口设备 表示您计算机上某个串口对应的设备名。 在 &os; 6.0 之前的版本中, 这些设备的名字是 /dev/cuaaN, 而在 6.0 和更新一些的版本中, 则是 /dev/cuadN 此处的 N 表示串口的编号。 请注意在 &os; 中设备的编号是从零而非一开始的 (这一点与另一些系统, 如基于 &ms-dos; 的系统不同)。 因此, 在基于 &ms-dos; 系统中的 COM1 在 &os; 中通常叫做 /dev/cuad0 其他一些人可能喜欢使用另一些来自 Ports 套件的程序。 Ports 中提供了几个与 &man.cu.1; 和 &man.tip.1; 类似的工具, 例如 comms/minicom X 终端 X终端是最复杂的终端系统。它们通常需要使用以太网来连接。 它们能显示任何X应用程序。 我们介绍X终端只是为了感兴趣。然而, 这章不会涉及X终端的安装,配置或使用。 配置 这节描述了您在一个终端上启用一个登录会话时, 需要在 FreeBSD 系统上进行的配置。 假设已经配置好了内核来支持串口, 就可以直接开始连接了。 中曾经提到, init 进程依赖于系统启动时所有的处理控制和初始化。 通过 init 来执行的一些任务将先读取 /etc/ttys文件, 然后在可用的终端上启用一个 getty 进程。 getty 进程可用来阅读一个登录名和启动 login程序。 然而,要为您的FreeBSD系统配置终端,您需要以 root 身份执行下面的步骤: 如果它不在那里, 您需要为串口在 /dev 目录下添加一行记录到 /etc/ttys 指定 /usr/libexec/getty 在端口上运行, 然后从 /etc/gettytab 文件指定适当的 getty 类型。 指定默认的终端类型。 设置端口为 on 确定端口是否为 secure 迫使init 重新读取 /etc/ttys文件。 作为可选的步骤,您可以通过在 /etc/gettytab 中建立一个记录,在第2步创建一个定制的 getty 类型来使用。这章不会介绍如何做。 您可以参考 &man.gettytab.5; 和 &man.getty.8; 的联机手册了解更多信息。 添加一个记录到<filename>/etc/ttys</filename> /etc/ttys文件列出了您 FreeBSD系统上允许登录的所有端口。 例如, 第一个虚拟控制台 ttyv0 在这个文件中有一个记录。 您可以使用这个记录登录进控制台。 这个文件也包含其他虚拟控制台的记录,串口,和伪 ttys 终端。 对于一个硬连线的终端, 只要列出串口的 /dev 记录而不需要 /dev 部分 (例如, /dev/ttyv0 可以被列为 ttyv0)。 默认的 FreeBSD 安装包括一个支持最初四个串口 ttyd0ttyd3/etc/ttys 文件。 如果您从那些端口中某一个使用终端,您不需要添加另一个记录。 在 <filename>/etc/ttys</filename> 中增加终端记录 假设我们连接两个终端给系统: 一个 Wyse-50 和一个老的运行 Procomm 终端软件模拟一个 VT-100 终端的286IBM PC。 在 /etc/ttys 文件中的相应的记录是这样的: ttyd1 "/usr/libexec/getty std.38400" wy50 on insecure ttyd5 "/usr/libexec/getty std.19200" vt100 on insecure 第一部分指定了终端指定文件的名称, 它可以在 /dev中找到。 第二部分是在这行执行的命令,通常是 &man.getty.8;。 getty 初始化然后打开一行,设置速度, 用户名的命令和执行登录程序。 getty 程序在它的命令行接收一个参数 (可选), getty 类型。 一个 getty 类型会在终端行描述一个特征, 像波特率和奇偶校验。 getty 程序从 /etc/gettytab 文件读取这些特征。 文件/etc/gettytab 包含了许多老的和新的终端行记录。 在很多例子中,启动文本 std 的记录将用硬连线终端来工作。 这些记录忽略了奇偶性。 这是一个从110到115200 bit/s的 std 记录。 当然,您可以添加您自己的记录到这个文件。 gettytab 的联机手册提供了更多的信息。 当在/etc/ttys中设置 getty 类型的时候, 确信在终端上的通讯设置匹配。 在我们的例子中, Wyse-50 不使用奇偶性, 用38400 bit/s 来连接。286 PC不使用奇偶性,用19200bit/s来连接。 第三部分是通常连接到那个tty行的终端类型。对于拨号端口, unknowndialup 通常被用在这个地方。 对于硬连线的终端,终端类型不会改变, 所以您可以从termcap数据库文件中放一个真正的终端类型。 在我们的例子中, Wyse-50 使用真正的终端类型, 而运行 Procomm 的286 PC将被设置成在VT-100上的模拟。 如果端口被启用,可以指定第四个部分。在第二部分, 把它放在这儿将执行初始化进程来启动程序 getty。如果您在这部分拖延, 将没有getty,在端口上因此就没有登录。 最后部分被用来指定端口是否安全。 标记一个安全的端口意味着您信任它允许用 root 帐户从那个端口登录。 不安全的端口不允许 root登录。 在一个不安全的端口上, 用户必须用无特权的帐户登录, 然后使用 su 或一个相似的机制来获得超级用户的权限。 重新读取<filename>/etc/ttys</filename>来强制<command>init</command> /etc/ttys文件做一个必要的修改后,您必须发送一个 SIGHUP 信号给初始化进程来迫使它重新读取配置文件,例如: &prompt.root; kill -HUP 1 init 总是系统运行时的第一个进程,因此它总是PID 1。 如果能够正确设置,所有的线缆都是适当的,终端将可以启用了, 然后一个 getty 进程将在每个终端运行, 您将在您的终端上看到登录命令行。 您的连接可能出现的问题 即使您小心翼翼地注意细节,您仍然可能会在设置终端时出错。 这有一个有关问题和解决办法的列表: 没有登录命令出现: 确定终端被嵌入和打开了。如果把一台个人计算机充当一个终端, 确信终端模拟软件运行在正确的串口上。 确信线缆被稳固地连接在终端和 FreeBSD 计算机上。 确信用了正确的电缆。 确定终端和 FreeBSD 的传输速度和奇偶设置已经一致了。 如果您有一个图像显示终端,确信对比度已经调节好了。 如果它是一个可打印的终端,确信纸张和墨水已经就绪了。 确定一个 getty 进程正在运行和服务终端。 例如, 可以用ps 命令得到运行 getty 程序的列表,键入: &prompt.root; ps -axww|grep getty 您将看到一个终端的记录。例如,下面的显示表明一个getty 正在第二个串口 ttyd1 运行, 正在 /etc/gettytab 中使用 std.38400 的记录: 22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyd1 如果没有 getty 进程运行, 确信您已经在/etc/ttys中启用了端口。 在修改完/etc/ttys文件后,记得运行 kill -HUP 1 如果 getty 进程确实在运行, 但终端上仍然没有显示出登录提示, 或者虽然显示了单缺不允许您输入, 您的终端或电缆可能不支持硬件握手。 请尝试将 /etc/ttys 中的 std.38400 改为 - 3wire.38400 并一定能够记得在改完 - /etc/ttys 之后 + 3wire.38400 (注意在改完 + /etc/ttys 之后要 kill -HUP 1)。 3wire 记录和 std 类似, 但忽略硬件握手。 您可能需要在使用 3wire 时减少波特率或启用软件流控制以避免缓冲区溢出。 出现一个 <quote>垃圾</quote> 而不是一个登录命令行 确信终端和 FreeBSD 使用相同的 bit/s 传输率和奇偶校验设置。 检查一下 getty 进程确信当前使用正确的 getty 类型。 如果没有, 编辑/etc/ttys然后运行kill -HUP 1 当键入密码时,字符两个两个出现 将终端 (或终端模拟软件) 从 半双工本地回显 换成 全双工 Guy Helmer Contributed by Sean Kelly Additions by 拨入服务 拨入服务 为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用 modem来拨号而不是终端。 外置vs.内置modem 外置modem看起来很容易拨号。 因为,外置 modem 可以通过储存在非易失性的RAM中的参数来配置, 它们通常提供指示器来显示重要的RS-232信号的状态。 不停闪光的信号灯能给用户留下比较深刻的印象, 而且指示器也可以用来查看modem是否正常地工作。 内置modem通常缺乏非易失性的RAM, 所以对它们的配置可能会限制在通过 DIP 开关来设置。 如果您的内置modem有指示灯,您也很难看得到。 Modem和线缆 modem 如果您使用一个外置的 modem,那您将需要适当的电缆线。 一个标准的串口线应当足够长以至普通的信号能够连接上: 信号名称 缩写 全名 RD 收到数据 (Received Data) TD 传出数据 (Transmitted Data) DTR 数据终端就绪 (Data Terminal Ready) DSR 数据集就绪 (Data Set Ready) DCD 数据载波检测 (Data Carrier Detect) (RS-232 的收到线路信号检测器) SG 信号地 (Signal Ground) RTS 要求发送数据 (Request to Send) CTS 允许对方发送数据 (Clear to Send)
FreeBSD 对速度超过 2400 bps 的情形需要通过 RTSCTS 信号来完成流控制, 通过 CD 信号来检测呼叫响应和挂机, 并通过 DTR 信号来在会话结束时对调制解调器进行复位。 某些电缆在连接时没有提供全部需要的信号, 这会给您带来问题, 例如在挂断时登录会话不消失, 这就有可能是电缆的问题。 与其它类 &unix; 操作系统类似, FreeBSD 使用硬件信号来检测呼叫响应, 以及在挂断时挂断并复位调制解调器。 FreeBSD 避免发送命令给调制解调器, 或监视其状态。 如果您熟悉通过调制解调器来连接基于 PC 的 BBS 系统, 这可能看起来有点难用。
串口的考虑 FreeBSD支持基于 NS8250, NS16450, NS16550 和 NS16550A 的EIA RS-232C通讯接口。 8250和16450设备有单字符缓冲。 16550设备提供了一个 16 个字符的缓冲, 可以提高更多的系统性能。 因为单字符缓冲设备比 16 个字符的缓冲需要更多的系统资源来工作, 所以基于16550A的接口卡可能更好。 如果系统没有活动的串口, 或有较大的负载, 16 字符缓冲的卡对于低错误率的通讯来说更好。 快速预览 getty 对于终端, init 会在每个配置串口上为每个拨入连接产生一个 getty 进程。 例如, 如果一个 modem 被附带在 /dev/ttyd0 中,用命令ps ax可以显示下面这些: 4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0 当用户拨上modem, 并使用它进行连接时, CD 线就会被 modem 认出。 内核注意到载波信号已经被检测到, 需要完成 getty 端口的打开。 getty 发送一个登录:在指定的初始线速度上的命令行。 Getty 会检查合法的字符是否被接收, 在典型的配置中, 如果发现 垃圾getty 就会设法调节线速度,直到它接收到合理的字符。 /usr/bin/login 用户在键入他/她的登录名称后, getty执行/usr/bin/login, 这会要求用户输入密码来完成登录, 然后启动用户的shell。 配置文件 如果希望允许拨入您的 FreeBSD 系统, 在 /etc 目录中有三个系统配置文件需要您关注。 其一是 /etc/gettytab, 其中包含用于 /usr/libexec/getty 服务的配置信息。 其二是 /etc/ttys, 它的作用是告诉 /sbin/init 哪些 tty 设备上应该运行 getty。 最后, 关于端口的初始化命令, 应放到 /etc/rc.d/serial 脚本中。 关于在 &unix; 上配置拨入调制解调器有两种主要的流派。 一种是将本地计算机到调制解调器的 RS-232 接口配置为固定速率。 这样做的好处是, 远程用户总能立即见到系统的登录提示符, 而其缺点则是, 系统并不知道用户真实的数据速率是多少, 因而, 类似 Emacs 这样的程序, 也就无法调整它们绘制屏幕的方式, 以便为慢速连接改善响应时间。 另一种流派将调制解调器的 RS-232 接口速率配置为随远程用户的连接速率变化。 例如, 对 V.32bis (14.4 Kbps) 连接, 调制解调器会让自己的 RS-232 接口以 19.2 Kbps 的速率运行, 而 2400 bps 连接, 则会使调制解调器的 RS-232 接口以 2400 bps 的速率运行。 由于 getty 并不能识别具体的调制解调器的连接速率反馈信息, 因此, getty 会以初始速度给出一个 login: 提示, 并检查用户的响应字符。 如果用户看到乱码, 则他们应知道此时应按下 Enter 键, 直到看到可以辨认的提示符为止。 如果数据速率不匹配, 则 getty 会将用户输入的任何信息均视为 乱码, 并尝试以下一种速率来再次给出 login: 提示符。 这一过程可能需要令人作呕地重复下去, 不过一般而言, 用户只要敲一两下键盘就能看到正确的提示符了。 显然, 这种登录过程看起来不如前面所介绍的 锁定速率 方法那样简单明了, 但使用低速连接的用户, 却可以在运行全屏幕程序时得到更好的交互响应。 这一节将尽可能公平地介绍关于配置的信息, 但更着力于介绍调制解调器速率随连接速率变化的配置方法。 <filename>/etc/gettytab</filename> /etc/gettytab /etc/gettytab是一个用来配置 getty 信息的 termcap 风格的文件。 请看看 gettytab 的联机手册了解完整的文件格式和功能列表。 锁定速度的配置 如果您把您的modem的数据通讯率锁定在一个特殊的速度上, 您不需要对 /etc/gettytab 文件作任何变化。 匹配速度的配置 您将需要在 /etc/gettytab 中设置一个记录来告诉 getty 您希望在 modem 上使用的速度。 如果您的 modem 的速率是 2400 bit/s, 则可以使用现有的 D2400 的记录。 # # Fast dialup terminals, 2400/1200/300 rotary (can start either way) # D2400|d2400|Fast-Dial-2400:\ :nx=D1200:tc=2400-baud: 3|D1200|Fast-Dial-1200:\ :nx=D300:tc=1200-baud: 5|D300|Fast-Dial-300:\ :nx=D2400:tc=300-baud: 如果您有一个更高速度的 modem, 必须在 /etc/gettytab 中添加一个记录。 下面是一个让您可以以最高 19.2 Kbit/s 的用在 14.4 Kbit/s的modem上的接口记录: # # Additions for a V.32bis Modem # um|V300|High Speed Modem at 300,8-bit:\ :nx=V19200:tc=std.300: un|V1200|High Speed Modem at 1200,8-bit:\ :nx=V300:tc=std.1200: uo|V2400|High Speed Modem at 2400,8-bit:\ :nx=V1200:tc=std.2400: up|V9600|High Speed Modem at 9600,8-bit:\ :nx=V2400:tc=std.9600: uq|V19200|High Speed Modem at 19200,8-bit:\ :nx=V9600:tc=std.19200: 这样做的结果是 8-数据位, 没有奇偶校验的连接。 上面使用19.2 Kbit/s的连接速度的例子,也可以使用 9600 bit/s (for V.32), 2400 bit/s, 1200 bit/s,300 bit/s, 直到 19.2 Kbit/s。 通讯率的调节使用 nx= (next table) 来实现。 每条线使用一个 tc= (table continuation) 的记录来加速对于一个特殊传输率的标准设置。 如果您有28.8 Kbit/s的modem,或您想使用它的 14.4Kbit/s 模式, 就需要使用一个更高的超过 19.2 Kbit/s 的通讯速度的 modem。 这是一个启动 57.6 Kbit/s 的 gettytab 记录的例子: # # Additions for a V.32bis or V.34 Modem # Starting at 57.6 Kbps # vm|VH300|Very High Speed Modem at 300,8-bit:\ :nx=VH57600:tc=std.300: vn|VH1200|Very High Speed Modem at 1200,8-bit:\ :nx=VH300:tc=std.1200: vo|VH2400|Very High Speed Modem at 2400,8-bit:\ :nx=VH1200:tc=std.2400: vp|VH9600|Very High Speed Modem at 9600,8-bit:\ :nx=VH2400:tc=std.9600: vq|VH57600|Very High Speed Modem at 57600,8-bit:\ :nx=VH9600:tc=std.57600: 如果您的 CPU 速度较低, 或系统的负荷很重, 而且没有 16550A 的串口,您可能会在57.6 Kbit/s 上得到 sio silo错误。 <filename>/etc/ttys</filename> /etc/ttys /etc/ttys文件的配置在 中介绍过。 配置 modem 是相似的, 但我们必须指定一个不同的终端类型。 锁定速度和匹配速度配置的通用格式是: ttyd0 "/usr/libexec/getty xxx" dialup on 上面的第一条是这个记录的设备特定文件 — ttyd0 表示 /dev/ttyd0 是这个 getty 将被监视的文件。 第二条 "/usr/libexec/getty xxx" 是将运行在设备上的进程 init。 第三条,dialup,是默认的终端类型。 第四个参数, on, 指出了线路是可操作的 init。 也可能会有第五个参数, secure, 但它将只被用作拥有物理安全的终端 (如系统终端)。 默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型, 以至用户可以定制它们的登录脚本来注意终端什么时候拨号, 和自动调节它们的终端类型。 然而, 作者发现它很容易在它的站点上指定 vt102 作为默认的终端类型, 因为用户刚才在它们的远程系统上使用的是VT102模拟器。 您对/etc/ttys作修改之后,您可以发送 init 进程给一个 HUP 信号来重读文件。您可以使用下面的命令来发送信号: &prompt.root; kill -HUP 1 如果这是您的第一次设置系统, 您可能要在发信号 init 之前等一下, 等到您的 modem 正确地配置并连接好。 锁定速度的配置 对于一个锁定速度的配置,您的 ttys 记录必须有一个为 getty 提供固定速度的记录。 对于一个速度被锁定在 19.2kbit/s 的 modem, ttys 记录是这样的: ttyd0 "/usr/libexec/getty std.19200" dialup on 如果您的 modem 被锁定在一个不同的数据速度, 为 std.speed 使用适当的速度来代替 std.19200。 确信您使用了一个在 /etc/gettytab 中列出的正确的类型。 匹配速度的设置 在一个匹配速度的设置中,您的 ttys 录需要参考在 /etc/gettytab 适当的起始 auto-baud 记录。 例如, 如果您为一个以 19.2 Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的 ttys 记录可能是这样的: ttyd0 "/usr/libexec/getty V19200" dialup on <filename>/etc/rc.d/serial</filename> rc files rc.serial 高速调制解调器, 如使用 V.32、 V.32bis, 以及 V.34 的那些, 需要使用硬件 (RTS/CTS) 流控制。 您可以在 /etc/rc.d/serial 中增加 stty 命令来在 FreeBSD 内核中, 为调制解调器设置硬件流控制标志。 例如, 在 1 号串口 (COM2) 拨入和拨出设备上配置 termios 标志 crtscts, 可以通过在 /etc/rc.d/serial 增加下面的设置来实现: # Serial port initial configuration stty -f /dev/ttyd1.init crtscts stty -f /dev/cuad1.init crtscts Modem 设置 如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中, 您将必须使用一个终端程序来设置参数。 使用同样的通讯速度来连接 modem 作为初始速度 getty 将使用和配置 modem 的非易失性RAM来适应这些要求: 连接时宣告 CD 操作时宣告 DTR; DTR 消失时挂断线路并复位调制解调器 CTS 传输数据流控制 禁用 XON/XOFF 流控制 RTS 接收数据流控制 宁静模式 (无返回码) 无命令回显 请阅读您 modem 的文档找到您需要用什么命令和 DIP 接口设置。 例如,要在一个 USRobotics Sportster 14400 的外置 modem 上设置上面的参数,可以用下面这些命令: ATZ AT&C1&D2&H1&I0&R2&W 您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用 V.42bis 和 MNP5 压缩。 外置 modem 也有一些用来设置的 DIP 开关, 也许您可以使用这些设置作为一个例子: Switch 1: UP — DTR Normal Switch 2: N/A (Verbal Result Codes/Numeric Result Codes) Switch 3: UP — Suppress Result Codes Switch 4: DOWN — No echo, offline commands Switch 5: UP — Auto Answer Switch 6: UP — Carrier Detect Normal Switch 7: UP — Load NVRAM Defaults Switch 8: N/A (Smart Mode/Dumb Mode) 在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当 getty 在 modem 处于命令模式并回显输入时错误地给出 login: 提示时可能造成的问题。 这样可能导致 getty 与 modem 之间产生更长的不必要交互。 锁定速度的配置 对于锁定速度的配置, 您需要配置 modem 来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。 在一个 USR Sportster 14400 外置 modem 上, 这些命令将锁定 modem到计算机 的传输率: ATZ AT&B1&W 匹配速度的配置 对于一个变速的配置, 您需要配置 modem 调节它的串口传输率匹配接收的传输率。 在一个 USR Sportster 14400 的外置 modem 上, 这些命令将锁定 modem 的错误修正传输率适合命令要求的速度, 但允许串口速度适应没有纠错的连接: ATZ AT&B2&W 检查modem的配置 大多数高速的modem提供了用来查看当前操作参数的命令。 在USR Sportster 14400外置modem上, 命令 ATI5 显示了存储在非易失性RAM中的设置。 要看看正确的 modem 操作参数, 可以使用命令 ATZ 然后是 ATI4 如果您有一个不同牌子的 modem, 检查 modem 的使用手册看看如何双重检查您的 modem 的配置参数。 问题解答 这儿是几个检查拨号modem的步骤。 检查FreeBSD系统 把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的 modem 有一个指示灯, 当登录时看看 modem 的 DTR 指示灯是否亮: 会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD 已经在适当的通讯端口启动了一个 getty 进程, 等待 modem 接收一个呼叫。 如果DTR指示灯不亮, 通过控制台登录到 FreeBSD系统,然后执行一个 ps ax 命令来看 FreeBSD 是否正在正确的端口运行 getty进程。 您将在进程显示中看到像这样的一行: 114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0 115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1 如果您看到是这样的: 114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0 modem 不接收呼叫, 这意味着 getty 已经在通讯端口打开了。 这可以指出线缆有问题或 modem 错误配置, 因为 getty 无法打开通讯端口。 如果您没有看到任何 getty 进程等待打开想要的 ttydN 端口, 在 /etc/ttys 中双击您的记录看看那儿是否有错误。 另外,检查日志文件 /var/log/messages 看看是否有一些来自 initgetty 的问题日志。 如果有任何信息, 仔细检查配置文件 /etc/ttys/etc/gettytab,还有相应的设备文件 /dev/ttydN, 是否有错误,丢失记录,或丢失了设备指定文件。 尝试接入Try Dialing In 设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。 如果您不能立刻得到一个命令行, 试试每隔一秒按一下 Enter。 如果您仍没有看到一个登录: 设法发送一个 BREAK。 如果您正使用一个高速的 modem 来拨号, 请在锁定拨号 modem 的接口速度后再试试。 如果您不能得到一个登录:prompt,再检查一下 /etc/gettytab,重复检查: /etc/ttys 中指定的初始可用的名称与 /etc/gettytab 的一个可用的相匹配。 每个 nx= 记录与另一个 gettytab 可用名称匹配。 每个 tc= 记录与另一个 gettytab可用名称相匹配。 如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem 能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem 的指示灯来确认 DTR 线连接正确。 如果您做了好几次,它仍然无法工作,打断一会,等会再试试。 如果还不能工作, 也许您应该发一封电子邮件给 &a.questions; 寻求帮助。
拨出设备 dial-out service 下面将让您的主机通过 modem 连接到另一台计算机上。 这只要适当地建立一个终端作为远程主机就可以。 这可以用来登录进一个BBS。 如果您用 PPP 有问题, 那这种连接可以用来从 Internet 上下载一个文件。 如果您必须 FTP 一些东西, 而 PPP 断了, 使用终端会话来 FTP 它们。 然后使用 zmodem 来把它们传输到您的机器上。 我的Stock Hayes Modem不被支持,我该怎么办? 事实上, 联机手册对于这个的描述已经过时了。 一个通用的 Hayes拨号已经内建其中。 只要在您的 /etc/remote 文件中使用 at=hayes Hayes 驱动不够 聪明 只能认出一些比较新的 modem 的高级特性 — 如 BUSYNO DIALTONE, 或 CONNECT 115200 的信息将被搞乱。 当您使用的时候, 您必须把这些信息关掉。(通过 ATX0&W)。 另外,拨号的延迟是 60 秒。 您的 modem 可能使用另外的时间或提示认为有其他的通讯问题。 试试 ATS7=45&W 注意: 实际上 tip 不支持所有的 Hayes modems。 解决方法是编辑 /usr/src/usr.bin/tip/tip 目录中的 tipconf.h 文件。很明显, 您需要它的源代码才能这样做。 把行#define HAYES 0 改为 #define HAYES 1。 然后 makemake install就可以了。 我如何输入这些 AT 命令? /etc/remote /etc/remote 文件中增加一个 direct 项。 举例而言, 如果您的调制解调器挂在第一个串口, 即 /dev/cuad0 上, 则应添加下面这行: cuad0:dv=/dev/cuad0:br#19200:pa=none 此处应使用您的 modem 所支持的最高 br bps 速率。 接下来, 输入 tip cuad0 就可以连到 modem 上了。 此外, 也可以 root 身份执行 cu 命令: &prompt.root; cu -lline -sspeed line 是串口 (例如 /dev/cuad0) 而 speed 则是速率 (如 57600)。 当您输入完 AT 之后, 按 ~. 即可退出。 现在pn <literal>@</literal>标记不能工作? 在电话号码中的 @ 标记告诉计算机在 /etc/phones 文件中查找一个电话号码。 但 @ 标记也是一个在像 /etc/remote 这样的可用文件中的特殊字符。 用一个反斜线符号退出: pn=\@ 我如何在命令行拨电话号码? 在您的 /etc/remote 文件中通常放着一个叫做 generic 的记录。 例如: tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuad0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuad0:br#57600:at=hayes:pa=none:du: 然后, 可以执行: &prompt.root; tip -115200 5551234 如果您更喜欢cu而不是tip,使用一个通用的cu记录: cu115200|Use cu to dial any number at 115200bps:\ :dv=/dev/cuad1:br#57600:at=hayes:pa=none:du: 然后键入: &prompt.root; cu 5551234 -s 115200 这么做时是否每次都需要重新输入 bps 速率? 添加一项 tip1200cu1200, 并将 bps 速率换成更合适的值。 tip 的默认值是1200  bps, 也就是为什么会有 tip1200 这条记录的原因。 虽然您并不需要使用 1200 bps。 我通过一个终端服务器访问了很多主机。 除非每次都要等到您连接到主机然后键入 CONNECT <host>, 否则使用 tipcm 功能。 例如, 在 /etc/remote 中的这些记录: pain|pain.deep13.com|Forrester's machine:\ :cm=CONNECT pain\n:tc=deep13: muffin|muffin.deep13.com|Frank's machine:\ :cm=CONNECT muffin\n:tc=deep13: deep13:Gizmonics Institute terminal server:\ :dv=/dev/cuad2:br#38400:at=hayes:du:pa=none:pn=5551234: 将让您键入 tip paintip muffin 连接到主机pain或muffin, 和 tip deep13 连接到终端服务器。 <command>tip</command>能为每个站点试用多个线路吗? 经常有一个问题, 一个大学有几个modem线路, 几千个学生设法使用它们。 /etc/remote 中为您的大学添加一个记录, 然后为 pn 功能使用 @ 标记: big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuad3:br#9600:at=courier:du:pa=none: 接着, 在 /etc/phones 中列出大学的电话号码: big-university 5551111 big-university 5551112 big-university 5551113 big-university 5551114 tip 将按顺序试用每一个,然后就停止。 如果想继续测试, 隔一段时间再运行 tip 为什么我必须键入 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 两次才能发出 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 一次? CtrlP是默认的强制字符,被用来告诉tip下一个字符是文字的数据。您可以用~s给任何其他的字符设置强制字符,这意思是设置一个变量 在新的一行键入 ~sforce=single-charsingle-char 是任何简单的字符。 如果您遗漏了 single-char, 那强制字符就是空字符, 这可以键入 Ctrl2 CtrlSpace 来完成。 更好的 single-char Shift Ctrl 6 , 这只用在一些终端服务器上。 通过在您的 $HOME/.tiprc 文件中指定下面这行, 就可以得到您想要的任何强制字符: force=<single-char> 突然我键入的每一样东西都变成了大写?? 您一定是键入了 Ctrl A , 即 tipraise character, 会临时地指定成坏掉的 caps-lock键。 使用上面的 ~s 来合理地设置各种 raisechar。 事实上, 如果您不想使用这些特性的话,您可以用同样的方法设置强制字符。 这儿有一个很好的示例 .tiprc 文件, 对 Emacs用户来说,需要经常按 Ctrl2 CtrlA force=^^ raisechar=^^ The ^^ is ShiftCtrl6 . 如何用 <command>tip</command> 做文件传输? 如果您正在与另一台 &unix; 系统对话, 您可以用 ~p(put) 和 ~t (take) 发送和接收文件。 这些命令可以在远程系统上运行 catecho 来接收和发送文件。 语法是这样的: ~p local-file remote-file ~t remote-file local-file 由于没有错误校验, 所以您需要使用其他协议, 如 zmodem。 我如何用<command>tip</command>运行zmodem? 要接收这些文件,可以在远程终端启动发送程序。然后,键入 ~C rz 在本地开始接收它们。 要发送文件, 可以在远程终端启动接收程序。 然后, 键入 ~C sz files 把它们发送到远程系统。 Kazutaka YOKOTA Contributed by Bill Paul Based on a document by 设置串口控制台 serial console 介绍 FreeBSD可以通过一个串口只使用一个哑 (dumb) 终端就可以启动一个系统。 这样一种配置只有两种人能使用: 希望在机器上安装 FreeBSD 的系统管理员, 他没有键盘或显示器, 还有就是要调试内核或设备驱动程序的开发人员。 就象 描述的, FreeBSD 采用一个三步的启动过程。 最先两步储存在 FreeBSD 启动磁盘的启动 slice 的启动代码块中。 引导块然后就被加载, 接着运行第三步启动引导器 (/boot/loader)。 为了设置串口控制台, 您必须配置启动代码块, 启动引导器代码和内核。 串口控制台的配置, 简明版 这一节假定您使用默认的配置, 只希望迅速地获得关于配置串口控制台的概览。 使用串口电缆连接 COM1 和控制终端。 要在串口控制台上显示所有的引导信息, 需要以超级用户的身份执行下面的命令: &prompt.root; echo 'console="comconsole"' >> /boot/loader.conf 编辑 /etc/ttys 并把 ttyd0off 改为 ondialup 改为 vt100。 否则通过串口控制台上将不会提示输入口令, 从而导致潜在的安全漏洞。 重新启动并观察是否生效。 如果需要不同的配置, 更进一步的配置讨论可以在 找到。 串口控制台的设置 准备一根串口线缆。 null-modem cable 您需要使用一个 null-modem 的线缆或标准的串口线和一个 null-modem 适配器。 请参考 中有关串口线的讨论。 拔掉键盘。 绝大多数的PC在开机检测的时候会检测到键盘, 如果没有检测到键盘, 则会出现错误。 一些机器会提示缺少键盘, 就不会继续引导系统。 如果您的计算机出现错误, 但仍能继续启动, 您可以不必理它。 如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS 来避免它。 请参考您的主板的使用说明了解更多细节。 在 BIOS 中将键盘设为 Not installed (未安装)。 现在您仍然无法使用键盘。 这样做只是告诉 BIOS 在启动时不要探测键盘。 您的 BIOS 不应抱怨键盘不存在。 即使这一标志设置为 Not installed 时, 只要把键盘插上, 它就仍可使用。 如果系统有 PS/2 鼠标, 如果幸运的话, 您也可以象键盘一样把它拔下来, 这是因为 PS/2 鼠标与键盘的一些硬件是共享的, 您的鼠标插上去, 系统会认为键盘仍在那儿。 插一个哑 (dumb) 终端到COM1:(sio0)。 如果您没有哑终端, 可以使用一个比较老的带有一个 modem 程序的PC/XT机器, 或在其他 &unix; 机器上的串口。 如果您没有 COM1: (sio0), 去找一个。 这时, 您就不能只能选择 COM1:来启动系统。 如果您已经在另一台设备上使用 COM1, 您必须临时删除那个设备, 然后安装一个新的系统引导块和内核。 确信您的内核配置文件已经为 COM1: (sio0) 设置了适当的标记: 有关的标记是: 0x10 启用控制台支持。 如果没有设置它, 则其他的控制台标记都会被忽略。 现在, 绝大多数的设置都有控制台的支持。 这个标记的第一个就是首选的。 这个单独选项是不能确保串口适用于控制台的, 设置下面的标记或加上下面描述的 选项, 和这个放在一起。 0x20 无论是否使用了下面将要讨论的 选项, 都强制这个单元作为控制台 (除非使用了更高优先级的控制台)。 标志 0x20 必须与 一起使用。 0x40 预留这个单元 (配合 0x10) 并让它不能用于普通的使用。 您不应在希望作为控制台的串口单元上设置这个标志。 这一标志是为内核远程调试准备的。 参见 开发者手册 以了解关于远程调试更进一步的情况。 例如: device sio0 at isa? port IO_COM1 flags 0x10 irq 4 看看 &man.sio.4; 的联机手册了解更多信息。 如果标记没有被设置, 您必须运行UserConfig或重新编译内核。 在启动磁盘的 a 分区的根目录创建 boot.config 文件。 这个文件将指导引导块代码如何启动系统。 为了激活串口控制台, 您必须有一个或多个下面的选项——如果您要多个选项, 在同一行必须都包含它们: 切换内部和串口控制台。 您使用这个来交换控制台设备。 例如, 如果您从内部控制台启动, 您可以使用 来直接使用启动引导器和内核来使用串口作为它的控制台设备。 另外, 如果您从串口启动, 您可以使用 来告诉启动引导器和内核使用显示设备作为控制台。 切换单一和双重控制台配置。 在单一配置中, 控制台将是本机的控制台 (显示设备) 或串口。 在双重控制台配置中, 显示设备和串口将同时成为控制台, 无论 的选项的情形。 然而, 双控制台配置只在引导块运行的过程中起作用。 一旦启动引导器获得控制, 由 选项指定的控制台将成为唯一的控制台。 在启动时,探测键盘。如果键盘找不到, 选项会自动设置。 由于当前版本引导块的空间限制, 选项只能探测扩展的键盘。 少于101键的键盘将无法被探测到。 如果您碰到这个情况, 您必须避免使用 选项。 目前还没有绕过这个问题的办法。 使用 选项来自动选择控制台, 或使用 选项来激活控制台。 您也可以使用boot联机文档中所描述的其他选项。 除了 选项, 所有选项将被传给启动引导器 (/boot/loader)。 启动引导器将通过检查 选项的状态来决定是显示设备成为控制台, 还是串口成为控制台。 这表示如果您指定 选项, 但在 /boot.config 中没有 选项, 您在启动代码块时使用串口作为控制台。 启动引导器将使用内部显示设备作为控制台。 启动机器 当您启动您的FreeBSD时,引导块将把 /boot.config 的内容发给控制台。例如: /boot.config: -P Keyboard: no 如果您把 放在 /boot.config 中并指出键盘存在或不存在, 那将只出现第二行。 这些信息会被定位到串口或内部控制台, 或两者同时, 这完全取决于 /boot.config 中的选项。 选项 送出消息的设备 none 内部控制台 串口控制台 串口控制台和内部控制台 串口控制台和内部控制台 , 有键盘 内部控制台 , 无键盘 串口控制台 出现上面信息后,在引导块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。 在通常情况下, 您不需要打断启动进程, 但为了确信设置是否正确, 您也可以这样做。 在控制台上按 Enter 以外的任意键就能打断启动进程。 引导块将进入命令行模式。 您将看到: >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/boot/loader boot: 检验上面出现的信息, 可能是串口, 或内部控制台, 或两个同时, 完全取决于您在 /boot.config 中的选项。 如果信息出现在正确的控制台, 按 Enter 继续启动进程。 如果您要使用串口控制台, 但您没有看到命令行, 那可能设置有问题。 这时, 输入 然后按 Enter/Return 来告诉引导块 (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了, 就可以回去检查一下是什么出了问题。 启动引导器加载完后, 您将进入启动进程的第三步, 您仍然可以在启动引导器通过设定您喜欢的环境来切换内部控制台和串口控制台。 参考 摘要 这是几个在这章要讨论的几个设置和选择的控制台的摘要。 例1: 您为 <devicename>sio0</devicename> 设置标记 0x10 device sio0 at isa? port IO_COM1 flags 0x10 irq 4 在 /boot.config 中的选项 引导块执行时所用的控制台 引导加载器执行时所用的控制台 内核所用的控制台 内部 内部 内部 串口 串口 串口 串口和内部 内部 内部 串口和内部 串口 串口 , 有键盘 内部 内部 内部 , 没有键盘 串口和内部 串口 串口 例2:您为sio0设置标记为0x30 device sio0 at isa? port IO_COM1 flags 0x30 irq 4 在 /boot.config 中的选项 引导块执行时所用的控制台 引导加载器执行时所用的控制台 内核所用的控制台 内部 内部 串口 串口 串口 串口 串口和内部 内部 串口 串口和内部 串口 串口 , 有键盘 内部 内部 串口 , 没有键盘 串口和内部 串口 串口 串口控制台的提示 设置更高的串口速度 在默认配置中, 串口的设置是: 速率 9600 波特、 8 数据位、 无奇偶校验位、 1 停止位。 如果您希望修改默认的控制台速率, 可以采用下列几种方法之一: BOOT_COMCONSOLE_SPEED 配置为希望的速率, 并重新编译引导块。 请参见 以了解如何联编和安装新的引导块。 如果串口控制台已配置为使用 以外的其它方式引导, 或者内核使用的速率与引导块不同, 则必需在内核配置文件中加入下述设置, 并重新联编新内核: options CONSPEED=19200 使用内核引导选项 . 这个命令行选项可以加到 /boot.config 中。 请参见联机手册 &man.boot.8; 以获得如何在 /boot.config 中增加选项, 以及其它的可用选项。 在您的 /boot/loader.conf 文件中启用 comconsole_speed 选项。 使用这个选项时,您还需要在 /boot/loader.conf 中配置 consoleboot_serial, 以及 boot_multicons。 下面是一个利用 comconsole_speed 改变串口控制台速率的例子: boot_multicons="YES" boot_serial="YES" comconsole_speed="115200" console="comconsole,vidconsole" &os; 在 6.1-RELEASE 之前的版本并不支持 以及 /boot/loader.confcomconsole_speed 选项, 如果您使用的是较早的 &os; 版本, 就只能重新编译引导块了。 使用 <devicename>sio0</devicename> 以外的串口 作为控制台 使用串口而不是 sio0 作为控制台需要做一些重编译。 如果您无论如何都要使用另一个串口, 重新编译引导块, 启动引导器和内核。 取得内核源代码 (参考 )。 编辑 /etc/make.conf 文件, 然后设置 BOOT_COMCONSOLE_PORT作为您要使用 (0x3f80x2f8、 0x3E8 或 0x2E8) 端口的地址。 只有 sio0sio3 (COM1COM4) 都可以使用; 但多口串口卡将不会工作。 不需要任何中断设置。 创建一个定制的内核配置文件, 在您要使用的串口添加合适的标记。 例如, 如果要将 sio1 (COM2) 作为控制台: device sio1 at isa? port IO_COM2 flags 0x10 irq 3 device sio1 at isa? port port IO_COM2 flags 0x30 irq 3 其他端口的控制台标记也不要设。 重新编译和安装引导块: &prompt.root; cd /sys/boot &prompt.root; make clean &prompt.root; make &prompt.root; make install 重建和安装内核。 用 &man.bsdlabel.8; 将引导块写到启动盘上,然后从新内核启动。 通过串口线进入DDB调试器 options BREAK_TO_DEBUGGER options DDB 在串口控制台上得到一个登录命令行 您可能希望通过串口线进入登录提示, 现在您可以看到启动信息, 通过串口控制台键入内核调试信息。可以这样做。 用一个编辑器打开 /etc/ttys 文件, 然后找到下面的行: ttyd0 "/usr/libexec/getty std.9600" unknown off secure ttyd1 "/usr/libexec/getty std.9600" unknown off secure ttyd2 "/usr/libexec/getty std.9600" unknown off secure ttyd3 "/usr/libexec/getty std.9600" unknown off secure ttyd0ttyd3 相当于 COM1COM4。 可以打开或关闭某个端口。 如果您已经改变了串口的速度, 还必须改掉标准的 9600 与当前的例如 19200 相匹配。 您也可以改变终端的类型从不知名的到您串口终端的真实类型。 编辑完这个文件, 您必须 kill -HUP 1 来使这个修改生效。 从启动引导器修改控制台 前面一节描述了如何通过调整引导块来设定串口控制台。 这节将讲到在启动引导器中通过键入一些命令和环境变量来指定控制台。 由于启动引导器会被启动进程的第三步所调用, 引导块以后, 在启动引导器中的设置将忽略在引导块中的设置。 配置串口控制台 您可以很容易地指定启动引导器和内核来使用串口控制台, 只需要在 /boot/loader.rc中写入下面这行: set console="comconsole" 无论前一节中的引导块如何配置, 这个设置都会生效。 您最好把上面一行放在文件的第一行, 以便尽早地在启动时看到串口控制台的启动信息。 同样地,您可以指定内部控制台为: set console="vidconsole" 如果您不设置启动引导环境变量控制台, 启动引导器和内核将使用在引导块时用 选项指定的控制台。 在 3.2 以及更新的版本中,您可以在 /boot/loader.conf.local/boot/loader.conf 中, 而不是在 /boot/loader.rc 指定控制台。 用这种方法, 您的 /boot/loader.rc 文件将是这样的: include /boot/loader.4th start 然后, 创建 /boot/loader.conf.local 并加入下面的行。 console=comconsole console=vidconsole 看看 &man.loader.conf.5; 的联机手册了解更多信息。 目前, 引导块尚不提供与引导加载器的 选项等价的选项, 另外, 它也不能根据是否有键盘存在自动决定选择使用内部控制台还是串口控制台。 使用串口而不是<devicename>sio0</devicename>作为控制台 要使用一个串口而不是 sio0 作为串口控制台 需要重新编译启动引导器。下面的步骤跟 描述的相似。 警告 这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。 不幸的是, 绝大多数系统没有键盘可以让您启动, 而没有显示设备就不让您启动。 使用 AMI BIOS 的机器可以通过在 CMOS 中将 graphics adapter 项设为 Not installed 来在启动时不要求显示适配器。 然而, 许多机器并不支持这个选项, 如果您的系统没有显示硬件就拒绝启动。 对于这些机器, 即使您没有显示器, 也必须在机器上插上显示适配器。 建议您试试采用 AMI BIOS 的机器。
diff --git a/zh_CN.GB2312/books/handbook/x11/chapter.sgml b/zh_CN.GB2312/books/handbook/x11/chapter.sgml index cb06ff3381..3a803b7031 100644 --- a/zh_CN.GB2312/books/handbook/x11/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/x11/chapter.sgml @@ -1,1482 +1,1482 @@ Ken Tom 根据 X.Org 的 X11 服务修改此文档 Marc Fonvieille X Window 系统 概述 FreeBSD 使用 X11 来为用户提供功能强大的图形用户界面。 X11 是一种开放源代码的 X Window 系统实现, 它包括 &xorg;&xfree86;。 &os; 在包括 &os; 5.2.1-RELEASE 在内的版本之前, 都默认安装 &xfree86;, 一种由 &xfree86; Project, Inc. 发布的 X11 服务。 从 &os; 5.3-RELEASE 开始, 默认并且为官方支持的 X11 变成了 &xorg;, 它是由 X.Org 基金会开发的 X11 服务, 采用与 &os; 类似的授权。 此外, 也有一些用于 &os; 的商业 X 服务器。 这章将介绍 X11 的安装和配置, 并着重强调 &xorg;。 如欲了解关于 &xfree86; 的详细信息 (在较早的 &os; 版本中, &xfree86; 是默认的 X11 软件包), 则可以访问存档的旧版 &os; 使用手册, 其网址为 欲了解 X11 所支持的显示卡等硬件, 请访问 &xorg; 网站。 在阅读完这一章后,您将会了解: X 视窗系统的不同组件,它们是如何协同工作的。 如何安装和配置 X11。 如何安装和使用不同的窗口管理器。 如何在 X11 中使用 &truetype; 字体。 如何为您的系统设置图形登录 (XDM)。 在阅读这一章之前,您应该: 知道如何安装额外的第三方应用程序()。 理解 X 对于那些熟悉其他图形环境,比如 µsoft.windows; 或者 &macos; 的用户来说,第一次使用 X 可能会感觉很惊讶。 通常您并不需要深入了解各种 X 组件的作用以及它们之间的相互影响, 不过, 了解一些关于它们的基础知识, 有助于更好地利用 X 的强大功能。 为什么要使用 X? X 不是第一个为 &unix; 而开发的视窗系统, 但它是最流行的。 X 的原始开发团队在开发 X 之前就已经在另外一个视窗系统上工作了。 那个系统的名字叫做 W (就是 Window)。X 只是罗马字母中 W 后面 的一个。 X 可以被叫做 X, X Window 系统, X11, 等等。把 X11 称做 X Windows 可能会冒犯某些人; 查看 &man.X.7; 可以了解更多的信息。 X 客户机/服务器模型 X 一开始就是针对网络而设计的,所以 采用了 client-server 模型。在 X 模型中, X server 运行在有键盘,显示器,鼠标的计算机上。 服务器用来管理显示信息,处理来自键盘和鼠标的输入等。 每一个 X 应用程序 (比如 XTerm, 或者 &netscape;) 就是一个 客户程序 (client)。 客户程序给服务器发送信息,如 请在这些坐标上画一个窗口, 而服务器则返回处理信息, 如 用户刚刚点击了 OK 按钮 如果您家或办公环境中只有一台使用 FreeBSD 的计算机, 就只能在同一台计算机上运行 X server 和 X client 了。 然而, 如果您有很多运行 FreeBSD 的机器, 您可以在您的桌面计算机上运行 X server, 而在比较高档的服务器上运行 X 应用程序。 在这样的环境中, X server 和 X client 之间的通信就可以通过网络来进行。 这可能会让一些人感到困惑, 因为 X 的术语和他们料想的有些不同。 他们以为 X server 是运行在功能强大的大型机上的,而 X client 是运行在他们桌面上的计算机上的。 记住,X server 是有键盘和显示器的那台计算机,而 X client 是那些显示窗口的程序。 Client 和 server 不一定都要运行在同一种操作系统上, 它们甚至无需在同一种类型的计算机上运行。 在 µsoft.windows; 或 Apple 公司的 &macos; 上运行 X server 也是可以的, 在它们上面也有很多免费的和商业化的应用程序。 窗口管理器 X 的设计哲学很像 &unix; 的设计哲学, tools, not policy。这就意味着 X 不会试图去规定任务应该如何 去完成,而是,只给用户提供一些工具,至于决定如何使用这些工具是用户自己的 事情。 这套哲学扩展了 X,它不会规定窗口在屏幕上应该是什么样子,要如何移动鼠标, 应该用什么键来切换窗体 (比如, Alt Tab 按键,在 µsoft.windows; 环境中的作用), 每个窗口的工具条应该 看起来像什么,他们是否应该有关闭按钮等等。 实际上,X 行使了一种叫做 窗口管理器的应用程序的职责。有很多这样的程序可用: AfterStep, Blackbox, ctwm, Enlightenment, fvwm, Sawfish, twm, Window Maker,等等。每一个窗口管理器 都提供了不同的界面和观感;其中一些还支持 虚拟桌面;有一些允许您可以定制一些键来管理您的桌面; 一些有开始 按钮,或者其他类似的设计;一些是 可定制主题的(themeable), 通过安装新的主题, 可以完全改变外观。 这些以及很多其他的窗口管理器, 都可以在 Ports Collection 的 x11-wm 分类目录里找到。 另外,KDEGNOME 桌面环境都有他们自己的窗口管理器 与桌面集成。 每个窗口管理器也有不同的配置机制;有些需要手工来写配置文件, 而另外一些则可以使用 GUI 工具来完成大部分的配置任务, 举例而言, (Sawfish) 就使用 Lisp 语言书写配置文件。 焦点策略 窗口管理器的另一个特性是鼠标的 focus policy。 每个窗口系统都需要有一个选择窗口的方法来接受键盘的输入信息,以及当前 哪个窗口处于可用状态。 您通常比较熟悉的是一个叫做 click-to-focus 的焦点策略。 这是 µsoft.windows; 使用的典型焦点策略,也就是您在一个窗口上点击 一下鼠标,这个窗口就处于当前可用的状态。 X 不支持一些特殊的焦点策略。确切地说,窗口管理器控制着在什么时候哪个窗口 拥有焦点。不同的窗口管理器支持不同的焦点方案。它们都支持点击即获得焦点, 而且它们中的大多数都支持好几种方案。 最流行的焦点策略: focus-follows-mouse 鼠标指示器下面的窗口就是获得焦点的窗口。 这个窗口不一定位于其他所有窗口之上。 通过将鼠标移到另一个窗口就可以改变焦点, 而不需要在它上面点击。 sloppy-focus 这种方式是对 focus-follows-mouse 策略的一个小小扩展。对于 focus-follows-mouse, 如果您把鼠标移到了根窗口(或桌面背景)上, 则所有的其它窗口都会失去焦点, 而相关的全部键盘输入也会丢失。 如果选择了 sloppy-focus, 则只有当指针进入新窗口时, 窗口焦点才会发生变化, 而当退出当前窗口时是不会变化的。 click-to-focus 当前窗口由鼠标点击来选择。窗口被突出显示 , 出现在所有其他窗口的前面。即使指针被移向了另一个窗口,所有的键盘输入 仍会被这个窗口接收。 许多窗口管理器支持其他的策略,与这些相比又有些变化。您可以看具体 窗口管理器的文档。 窗口部件 提供工具而非策略的 X 方法使得在每个应用程序屏幕上看到的窗口部件得到了 大大的扩展。 Widget 只是针对用户接口中所有列举项目的一个术语,它 可以用某种方法来点击或操作;如按钮,复选框,单选按钮,图标,列表框等等。 µsoft.windows; 把这些叫做控件 µsoft.windows; 和苹果公司的 &macos; 都有一个严格的窗口部件策略。 应用程序开发者被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。 对于 X,它并不要求一个特殊的图形风格或一套相结合的窗口部件集。 这样的结果是您不能期望 X 应用程序只拥有一个普通的所见即所得的界面。 有很多的流行的窗口部件集设置,包括来自于 MIT 的 Athena, &motif; (模仿 µsoft.windows; 的窗口风格, 所有部件都具有斜边和3种灰色度), OpenLook, 等等。 如今, 绝大多数比较新的 X 应用程序采用一组新式的窗口设计, 这包括 KDE 所使用的 Qt, 以及 GNOME 所使用的 GTK+。 在这样一种窗口系统下,&unix; 桌面的一些所见即所得特性作了一些收敛, 以使初学者感到更容易一些。 安装 X11 &xorg; 是 &os; 上的默认 X11 实现。 &xorg; 是由 X.Org 基金会发行的开放源代码 X Window 系统实现中的 X 服务。 &xorg; 基于 &xfree86 4.4RC2 和 X11R6.6 的代码。 从 &os; Ports 套件可以安装 &xorg; 的 &xorg.version; 版本。 如果需要从 Ports Collection 编译和安装 &xorg; &prompt.root; cd /usr/ports/x11/xorg &prompt.root; make install clean 要完整地编译 &xorg; 则需要至少 4 GB 的剩余磁盘空间。 另外 X11 也可以直接从 package 来安装。 我们提供了可以与 &man.pkg.add.1; 工具配合使用的 X11 安装包。 如果从远程下载和安装, 在使用 &man.pkg.add.1; 时请不要指定版本号。 &man.pkg.add.1; 会自动地下载最新版本的安装包。 想要从 package 安装 &xorg;, 简单地输入下面的命令: &prompt.root; pkg_add -r xorg 上面的例子介绍了如何安装完整的 X11 软件包, 包括服务器端,客户端,字体等等。 此外, 也有一些单独的 X11 的 ports 和 packages. 这一章余下的部分将会讲解如何配置 X11, 以及如何设置一个高效的桌面环境。 Christopher Shumway Contributed by 配置 X11 &xorg; X11 开始之前 在配置 X11 之前, 您需要了解所安装的系统的下列信息: 显示器规格 显示卡的芯片类型 显示卡的显存容量 水平刷新率 垂直刷新率 显示器的规格被 X11 用来决定显示的分辨率和刷新率。 这些规格通常可以从显示器所带的文档中, 以及制造商的网站找到。 需要知道两个数字范围: 垂直刷新率和水平刷新率。 显示卡的芯片类型将决定 X11 使用什么模块来驱动图形硬件。 尽管系统能自动检测出绝大多数的硬件, 但事先了解在自动检测出错的时候还是很有用处的。 显示卡的显存大小决定了系统支持的分辨率和颜色深度。 了解这些限制非常重要。 配置 X11 配置 X11 需要几步。 第一步是以超级用户的身份建立初始的配置文件: &prompt.root; Xorg -configure 这会在 /root 中生成一个叫做 xorg.conf.new 的配置文件 (无论您使用 &man.su.1; 或直接登录, 都会改变默认的 $HOME 目录变量)。 X11 程序将尝试探测系统中的图形硬件,并将探测到的硬件信息写入配置文件, 以便加载正确的驱动程序。 下一步是测试现存的配置文件, 以确认 &xorg; 能够同系统上的图形设备正常工作。 要完成这个任务,只需: &prompt.root; Xorg -config xorg.conf.new 如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功的。 要退出测试, 只要同时按下 Ctrl Alt Backspace 如果鼠标工作不正常, 则需要先配置它。 参见 &os; 安装一章中的 X11 调优 接下来是调整 xorg.conf.new 配置文件并作测试。 用文本编辑器如 &man.emacs.1; 或 &man.ee.1; 打开这个文件。 要做的第一件事是为当前系统的显示器设置刷新率。 这些值包括垂直和水平的同步频率。 把它们加到 xorg.conf.new"Monitor" 小节中: Section "Monitor" Identifier "Monitor0" VendorName "Monitor Vendor" ModelName "Monitor Model" HorizSync 30-107 VertRefresh 48-120 EndSection 在配置文件中也有可能没有 HorizSyncVertRefresh。 如果是这样的话, 就只能手动添加, 并在 HorizSyncVertRefresh 后面设置合适的数值了。 在上面的例子中, 给出了相应的显示器的参数。 X 能够使用显示器所支持的 DPMS (能源之星) 功能。 &man.xset.1; 程序可以控制超时时间, 并强制待机、挂起或关机。 如果希望启用显示器的 DPMS 功能, 则需要把下面的设置添加到 monitor 节中: Option "DPMS" xorg.conf 关闭 xorg.conf.new 之前还应该选择默认的分辨率和色深。 这是在 "Screen" 小节中定义的: Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 24 Modes "1024x768" EndSubSection EndSection DefaultDepth 关键字描述了要运行的默认色深。 这可以通过 &man.Xorg.1; 的 命令行开关来替代配置文件中的设置。 Modes 关键字描述了给定颜色深度下屏幕的分辨率。 需要说明的是, 目标系统的图形硬件只支持由 VESA 定义的标准模式。 前面的例子中, 默认色深是使用 24位色。 在采用这个色深时, 允许的分辨率是 1024x768。 最后就是将配置文件存盘, 并使用前面介绍的测试模式测试一下。 在发现并解决问题的过程中, 包含了与 X11 服务器相关的各个设备的信息的 X11 日志文件会为您发现和排除问题有所帮助。 &xorg; 日志的文件名是 /var/log/Xorg.0.log 这样的格式。 实际的日志文件名可能是 Xorg.0.logXorg.8.log 等等。 如果一切准备停当, 就可以把配置文件放到公共的目录中了。 您可以在 &man.Xorg.1; 里面找到具体位置。 这个位置通常是 /etc/X11/xorg.conf/usr/X11R6/etc/X11/xorg.conf &prompt.root; cp xorg.conf.new /etc/X11/xorg.conf 现在已经完成了 X11 的配置全过程。 &xorg; 可以通过 &man.startx.1; 工具来启动。 除此之外, X11 服务器也可以用 &man.xdm.1; 来启动。 有一个图形配置工具 &man.xorgcfg.1;, 会随 X11 软件包一同安装。 它可以通过选择合适的驱动和设置交互式地定义配置。 这个程序可以从控制台通过命令 xorgcfg -textmode 来直接启动。 欲了解详情, 请参考 &man.xorgcfg.1; 的联机手册。 另外还有一个叫做 &man.xorgconfig.1; 的文本界面配置工具 这是一个控制台工具, 对用户而言不太友好, 但也正因它使用的是纯文本界面, 因此当其他工具无法工作时, 您仍可使用这个工具。 高级配置主题 配置 &intel; i810 显示芯片组 Intel i810 显示芯片 配置Intel i810芯片组的显示卡需要有针对 X11 的能够用来驱动显示卡的 agpgart AGP程序接口。 请参见 &man.agp.4; 驱动程序的联机手册了解更多细节。 这也适用于其他的图形卡硬件配置。 注意如果系统没有将 &man.agp.4; 驱动程序编译进内核,尝试用 &man.kldload.8; 加载模块是无效的。 这个驱动程序必须编译进内核或者使用 /boot/loader.conf 在启动时加载进入内核。 添加宽屏平板显示器 widescreen flatpanel configuration 这一节假定您了解一些关于高级配置的知识。 如果使用前面的标准配置工具不能产生可用的配置, 则在日志文件中提供的信息应该足以修正配置使其正确工作。 如果需要的话, 您应使用一个文本编辑器来完成这项工作。 目前的宽屏 (WSXGA、 WSXGA+、 WUXGA、 WXGA、 WXGA+, 等等) 支持 16:10 和 10:9 或一些支持不大好的显示比例。 常见的一些 16:10 比例的分辨率包括: 2560x1600 1920x1200 1680x1050 1440x900 1280x800 有时, 也可以简单地把这些分辨率作为 Section "Screen" 中的 Mode 来进行配置, 类似下面这样: Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 24 Modes "1680x1050" EndSubSection EndSection &xorg; 能够自动地通过 I2C/DDC 信息来自动获取宽屏显示器的分辨率信息, 并处理显示器支持的频率和分辨率。 如果驱动程序没有对应的 ModeLines, 就需要给 &xorg; 一些提示了。 使用 /var/log/Xorg.0.log 能够提取足够的信息, 就可以写一个可用的 ModeLine 了。 这类信息如下所示: (II) MGA(0): Supported additional Video Mode: (II) MGA(0): clock: 146.2 MHz Image Size: 433 x 271 mm (II) MGA(0): h_active: 1680 h_sync: 1784 h_sync_end 1960 h_blank_end 2240 h_border: 0 (II) MGA(0): v_active: 1050 v_sync: 1053 v_sync_end 1059 v_blanking: 1089 v_border: 0 (II) MGA(0): Ranges: V min: 48 V max: 85 Hz, H min: 30 H max: 94 kHz, PixClock max 170 MHz 这些信息称做 EDID 信息。 从中建立 ModeLine 只是把这些数据重新排列顺序而已: ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings> 如此, 本例中的 Section "Monitor" 中的 ModeLine 应类似下面的形式: Section "Monitor" Identifier "Monitor1" VendorName "Bigname" ModelName "BestModel" ModeLine "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089 Option "DPMS" EndSection 经过简单的编辑步骤之后, X 就可以在您的宽屏显示器上启动了。 Murray Stokely 供稿 在 X11 中使用字体 Type1 字体 X11 使用的默认字体不是很理想。 大型的字体显得参差不齐,看起来很不专业, 并且, 在 &netscape; 中, 小字体简直无法看清。 有好几种免费、 高质量的字体可以很方便地用在 X11 中。 例如,URW字体集合 (x11-fonts/urwfonts) 就包括了高质量的 标准 type1 字体 (Times Roman, HelveticaPalatino 和其他一些)。 在 Freefont 集合中 (x11-fonts/freefonts) 也包括更多的字体, 但它们中的绝大部分使用在图形软件中,如 Gimp,在屏幕字体中使用并不完美。另外, 只要花很少的功夫,可以将 &xfree86; 配置成能使用 &truetype; 字体:请参见后面的 &truetype; 字体一节。 要安装上面的Type1字体,您只需要运行下面的命令: &prompt.root; cd /usr/ports/x11-fonts/urwfonts &prompt.root; make install clean freefont 或其他的字库和上面所说的大体类似。 为了让 X 服务器能够检测到这些字体, 需要在 X 服务器的配置文件 (/etc/X11/xorg.conf) 中增加下面的配置: FontPath "/usr/X11R6/lib/X11/fonts/URW/" 或者,也可以在命令行运行: &prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/URW &prompt.user; xset fp rehash 这样会起作用,但是当 X 会话结束后就会丢失, 除非它被添加到启动文件 (~/.xinitrc 中, 针对一个寻常的 startx 会话,或者当您通过一个类似 XDM 的图形登录管理器登录时添加到 ~/.xsession 中)。 第三种方法是使用新的 /usr/X11R6/etc/fonts/local.conf 文件: 查看 anti-aliasing 章节。 &truetype; 字体 TrueType 字体 fonts (字体) TrueType &xorg; 已经内建了对 &truetype; 字体的支持。有两个不同的模块能够启用这个功能。 在这个例子中使用 freetype 这个模块,因为它与其他的字体描绘后端 是兼容的。要启用 freetype 模块,只需要将下面这行添加到 /etc/X11/xorg.conf 文件的 "Module" 部分。 Load "freetype" 现在,为 &truetype; 字体创建一个目录 (比如, /usr/X11R6/lib/X11/fonts/TrueType) 然后把所有的 &truetype; 字体复制到这个目录。记住您不能直接从 &macintosh; 计算机中提取 &truetype; 字体; 能被 X11 使用的必须是 &unix;/&ms-dos;/&windows; 格式的。 一旦您已经将这些文件复制到了这个目录, 就可以用 ttmkfdir 来创建 fonts.dir 文件, 以便让X字体引擎知道您已经安装了这些新文件。 ttmkfdir 可以在 FreeBSD Ports Collection x11-fonts/ttmkfdir 中找到。 &prompt.root; cd /usr/X11R6/lib/X11/fonts/TrueType &prompt.root; ttmkfdir -o fonts.dir 现在把 &truetype; 字体目录添加到字体路径中。 这和上面 Type1 字体的步骤是一样的, 那就是,使用 &prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/TrueType &prompt.user; xset fp rehash 或者把 FontPath 这行加到 xorg.conf 文件中。 就是这样。现在 &netscape;, Gimp, &staroffice; 和其他所有的 X 应用程序 应该可以认出安装的 &truetype; 字体。一些很小的字体(如在 Web 页面上高分辨率显示的文本) 和一些很大的字体(在 &staroffice; 下) 现在看起来已经很好了。 Joe Marcus Clarke Updated by Anti-Aliased 字体 anti-aliased fonts fonts anti-aliased X11 从 &xfree86; 4.0.2 开始支持字体的反走样。 但是, 字体配置在 &xfree86; 4.3.0 之前是非常繁琐的。 从 &xfree86; 4.3.0 开始, 对于所有支持 Xft 的应用程序, 所有放到 X11 /usr/X11R6/lib/X11/fonts/~/.fonts/ 中的字体都自动地被加入反走样支持。 并不是所有的应用程序都支持 Xft, 但已经有相当多的程序提供 Xft 支持了。 支持 Xft 的应用程序包括 Qt 2.3 以及更高版本 (用以开发 KDE 桌面的工具包)、 GTK+ 2.0 和更高版本 (用于开发 GNOME 桌面的工具包), 以及 Mozilla 1.2 和更高版本。 要控制哪些字体是 anti-aliased,或者配置 anti-aliased 特性, 创建(或者编辑,如果文件已经存在的话)文件 /usr/X11R6/etc/fonts/local.conf。Xft 字体系统的几个 高级特性都可以使用这个文件来调节; 这一部分只描述几种最简单的情况。要了解更多的细节,请查看 &man.fonts-conf.5;. XML 这个文件一定是 XML 格式的。注意确保所有的标签都完全的关闭掉。 这个文件以一个很普通的 XML 头开始, 后跟一个 DOCTYPE 定义, 接下来是 <fontconfig> 标签: <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> 像前面所做的那样,在 /usr/X11R6/lib/X11/fonts/~/.fonts/ 目录下的所有字体已经可以被支持 Xft 的 应用程序使用了。如果您想添加这两个目录以外的其他路径, 简单的添加下面这行到 /usr/X11R6/etc/fonts/local.conf文件中: <dir>/path/to/my/fonts</dir> 添加了新的字体,尤其是添加了新的字体目录后, 您应该运行下面的命令重建字体缓存: &prompt.root; fc-cache -f Anti-aliasing 会让字体边缘有些模糊,这样增加了非常小的文本的可读性, 并从大文本字体中删除 锯齿。 但如果使用普通的文本, 则可能引起眼疲劳。 要禁止 14磅 以下字体的反走样, 需要增加如下配置: <match target="font"> <test name="size" compare="less"> <double>14</double> </test> <edit name="antialias" mode="assign"> <bool>false</bool> </edit> </match> <match target="font"> <test name="pixelsize" compare="less" qual="any"> <double>14</double> </test> <edit mode="assign" name="antialias"> <bool>false</bool> </edit> </match> fonts spacing 用 anti-aliasing 来间隔一些等宽字体也是不适当的。 这似乎是 KDE 的一个问题。 要修复这个问题需要确保每个字体之间的间距保持在100。 加入下面这些行: <match target="pattern" name="family"> <test qual="any" name="family"> <string>fixed</string> </test> <edit name="family" mode="assign"> <string>mono</string> </edit> </match> <match target="pattern" name="family"> <test qual="any" name="family"> <string>console</string> </test> <edit name="family" mode="assign"> <string>mono</string> </edit> </match> (这里把其他普通的修复的字体作为 "mono"),然后加入: <match target="pattern" name="family"> <test qual="any" name="family"> <string>mono</string> </test> <edit name="spacing" mode="assign"> <int>100</int> </edit> </match> 某些字体,比如 Helvetica,当 anti-aliased 的时候可能存在问题。 通常的表现为字体本身似乎被垂直的切成两半。 糟糕的时候,还可能导致应用程序比如 Mozilla 崩溃。 为了避免这样的现象,考虑添加下面几行到 local.conf文件里面: <match target="pattern" name="family"> <test qual="any" name="family"> <string>Helvetica</string> </test> <edit name="family" mode="assign"> <string>sans-serif</string> </edit> </match> 一旦您完成对 local.conf 文件的编辑,确保您使用了 </fontconfig> 标签来结束文件。 不这样做将会导致您的更改被忽略。 X11 默认的字库当使用反走样时会比较难看。 更好的字库可以在 x11-fonts/bitstream-vera port 中找到。 这个 port 会创建一个 /usr/X11R6/etc/fonts/local.conf 文件, 如果这个文件不存在的话。 反之, port 将创建 /usr/X11R6/etc/fonts/local.conf-vera 文件。 将其内容合并到 /usr/X11R6/etc/fonts/local.conf 中, 则 Bitstream 字体将自动地代替默认的 X11 Serif, Sans Serif, 以及单倍距字体。 最后,用户可以通过他们个人的 .fonts.conf 文件来添加自己的设定。 要完成此项工作, 用户只需简单地创建 ~/.fonts.conf 并添加相关配置。 此文件也必须是 XML 格式的。 LCD screen Fonts LCD screen 最后:对于LCD屏幕, 可能希望使用子像素的取样。 简单而言, 这是通过分别控制 (水平方向分开的) 红、绿、蓝 像素, 来改善水平分辨率; 这样做的效果一般会非常明显。 要启用它, 只需在 local.conf 文件的某个地方加入: <match target="font"> <test qual="all" name="rgba"> <const>unknown</const> </test> <edit name="rgba" mode="assign"> <const>rgb</const> </edit> </match> 随您显示器的种类不同, 可能需要把 rgb 改为 bgrvrgbvbgr: 试验一下看看那个更好。 Mozilla disabling anti-aliased fonts (禁用反锯齿字体) 在下次启动 X server 时, 反锯齿 (anti-aliasing) 功能就启用了。 不过, 应用程序必须了解如何使用它, 才能因此而受益。 目前 Qt 工具包已经对其提供了全面支持, 因此整个 KDE 环境都能使用反锯齿字体。 GTK+ 和 GNOME 也可以通过 Font capplet 来使用反锯齿功能 (进一步细节请参见 )。 默认情况下, Mozilla 1.2 及更高版本有能力自动使用反锯齿。 要禁用这一特性, 则需要使用指定 -DWITHOUT_XFT 并重新联编 Mozilla Seth Kingsley Contributed by X 显示管理器 概要 X Display Manager X 显示管理器(XDM) 是一个X视窗系统用于进行登录会话管理的可选项。 这个可以应用于多种情况下,包括小 X Terminals, 桌面,大网络显示服务器。既然 X 视窗系统不受网络和协议的限制, 那对于通过网络连接起来的运行 X 客户端和服务器端的不同机器, 就会有很多的可配置项。 XDM 提供了一个选择要连接到哪个显示服务器的图形接口, 只要键入如登录用户名和密码这样的验证信息。 您也可以把 XDM 想象成与 &man.getty.8 工具一样(see for details)。为用户提供了同样功能。它可以完成系统的登录任务, 然后为用户运行一个会话管理器 (通常是一个 X 视窗管理器)。接下来 XDM 就等待这个程序退出,发出信号用户已经登录完成,应当退出屏幕。 这时, XDM 就可以为下一个登录用户显示登录和可选择屏幕。 使用 XDM XDM 精灵程序在 /usr/X11R6/bin/xdm 中。您可以在任何时候 用 root 来运行这个程序, 在本地机器上,它将启动管理X的画面。如果要 XDM 每次机器一启动就开始运行, 一个简单的办法是在 /etc/ttys 中加入一个记录。 有关这个文件的更多的格式和使用方法,可以看看 。在默认的 /etc/ttys 文件中用于运行 XDM 守护程序的一行是这样的: ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure 默认情况下,这个记录是关闭的,要启用它, 您需要把第5部分的 off 改为 on 然后按照 的指导 重新启动 &man.init.8;。第一部分,这个程序将管理的终端名称是 ttyv8。这意味着 XDM 将运行在第9个虚拟终端上。 配置 XDM XDM 的配置目录是在 /usr/X11R6/lib/X11/xdm中。在这个目录中, 您会看到几个用来改变 XDM 行为和外观的文件。您会找到这些文件: 文件 描述 Xaccess 客户端授权规则。 Xresources 默认的X资源值。 Xservers 远程和本地显示管理列表。 Xsession 用于登录的默认的会话脚本。 Xsetup_* 登录之前用于加载应用程序的脚本。 xdm-config 运行在这台机器上的所有显示的全局配置。 xdm-errors 服务器程序产生的错误。 xdm-pid 当前运行的 XDM 的进程 ID。 XDM 运行时, 在这个目录中有几个脚本和程序可以用来设置桌面。 这些文件中的每一个的用法都将被简要地描述。 这些文件的更详细的语法和用法在 &man.xdm.1; 中将有详细描述。 默认的配置是一个矩形的登录窗口,上面有机器的名称, Login:Password:。如果您想设计您自己个性化的 XDM 屏幕,这是一个很好的起点。 Xaccess 用以连接由 XDM 所控制的显示设备的协议, 叫做 X 显示管理器连接协议 (XDMCP)。 这个文件是一组用以控制来自远程计算机的 XDMCP 连接的规则。 除非您修改 xdm-config 使其接受远程连接, 否则其内容将被忽略。 默认情况下, 它不允许来自任何客户端的连接。 Xresources 这是一个默认的用来显示选项和登录屏幕的应用程序文件。这 就是您能够定制登录程序的外观的地方。这个格式与 X11 文档中描述的默认应用 程序文件是一样的。 Xservers 这是一个选择者应当提供的作为可选的远程显示列表。 Xsession 这是一个用户登录后针对 XDM 的默认会话脚本。通常,在 ~/.xsession 中每个用户将有一个可定制的会话脚本。 Xsetup_* 在显示选择者或登录接口之前,这些将被自动运行。 这是一个每个显示都要用到的脚本,叫做 Xsetup_, 后面会跟一个本地显示的数字(比如 Xsetup_0)。典型的,这些脚本将在后台 (如 xconsole)运行一个或两个程序。 xdm-config 此文件以应用程序默认值的形式, 提供了在安装时所使用的普适的显示设置。 xdm-errors 这个文件包含了 XDM 正设法运行的的 X 服务器 的输出。 如果 XDM 正设法运行的显示由于某种原因被挂起, 那这是一个寻找错误信息的好地方。 这些信息会在每一个会话的基础上被写到用户的 ~/.xsession-errors 文件中。 运行一个网络显示服务器 对于其他客户端来说,为了连接到显示服务器,您将必须编辑访问控制规则, 然后启用连接侦听。默认的这些被设置成比较保守的值。 要让XDM能侦听连接,先要在 xdm-config 文件中注释掉一行: ! SECURITY: do not listen for XDMCP or Chooser requests ! Comment out this line if you want to manage X terminals with xdm DisplayManager.requestPort: 0 然后重新启动XDM。 记住默认应用程序文件的注释以! 字母开始,不是#。 您需要设置严格的访问控制。看看在 Xaccess文件中的实例记录,可以参考 &man.xdm.1; 的联机手册。 替换 XDM 有几个替换默认 XDM程序的方案。 其中之一是 上一节已经描述过的kdm (与 KDE捆绑在一起)。 kdm 提供了许多视觉上的改进和局部的修饰, 同样能让用户在启动时能选择他们喜欢的窗口管理器。 Valentino Vaschetto Contributed by 桌面环境 这节描述了 FreeBSD 上用于 X 的不同桌面环境。 桌面环境 可能仅仅是一个简单的窗口管理器, 也可能是一个像 KDE 或者 GNOME这样的完整桌面应用程序套件。 GNOME 有关 GNOME GNOME GNOME 是一个用户界面友好的桌面环境, 能够使用户很容易地使用和配置他们的计算机。 GNOME 包括一个面板(用来启动应用程序和显示状态), 一个桌面(存放数据和应用程序的地方), 一套标准的桌面工具和应用程序, 和一套与其他人相互协同工作的协议集。 其他操作系统的用户在使用 GNOME提供的强大的图形驱动环境时会觉得很好。 更多的关于 FreeBSD 上 GNOME 的信息 可以在 FreeBSD GNOME Project 的网站上找到。 此外, 这个网站也提供了相当详尽的关于安装、 配置和管理 GNOME 的常见问题解答 (FAQ)。 安装 GNOME 安装 GNOME的最简单的方法是 第 2 章描述的在FreeBSD安装过程中通过 Desktop Configuration菜单来进行。 它们也可以很容易地从一个package或Ports Collection安装: 要从网络安装GNOME, 只要键入: &prompt.root; pkg_add -r gnome2 从源代码编译GNOME,可以使用 ports树: &prompt.root; cd /usr/ports/x11/gnome2 &prompt.root; make install clean 一旦装好了 GNOME, 就必须告诉 X server 启动 GNOME 而不是默认的窗口管理器。 最简单的启动 GNOME 的方法是使用 GDM, GNOME 显示管理器。 随 GNOME 桌面一同安装的 GDM (但默认是禁用的), 可以通过在 /etc/rc.conf 中加入 gdm_enable="YES" 来启用。 这样在重新启动的时候, GNOME 就会在登录时自动启动 — 除此之外不需要进一步设置了。 GNOME 也可以通过适当地配置名为 .xinitrc 的文件来启动。 如果已经有了自定义的 .xinitrc, 将启动当前窗口管理器的那一行改为启动 - /usr/X11R6/bin/gnome-session 就可以了。 + /usr/local/bin/gnome-session 就可以了。 如果还没有, 那么只需简单地: - &prompt.user; echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc + &prompt.user; echo "/usr/local/bin/gnome-session" > ~/.xinitrc 接下来输入 startxGNOME 桌面环境就启动了。 如果之前使用了一些旧式的显示管理器, 例如 XDM, 则这样做是没用的。 此时应建立一个可执行的 .xsession 文件, 其中包含同样的命令。 要完成这项工作, 需要用 - /usr/X11R6/bin/gnome-session + /usr/local/bin/gnome-session 取代现有的窗口管理器: &prompt.user; echo "#!/bin/sh" > ~/.xsession -&prompt.user; echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession +&prompt.user; echo "/usr/local/bin/gnome-session" >> ~/.xsession &prompt.user; chmod +x ~/.xsession 还有一种做法, 是配置显示管理器, 以便在登录时提示您选择窗口管理器; 在 KDE 细节 环节中介绍了关于如何为 kdmKDE 的显示管理器)进行这样的配置。 在GNOME上使用Anti-aliased字体 GNOME anti-aliased fonts X11 通过RENDER扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 配置 anti-aliasing 在 描述。所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序 桌面首选项 字体,然后选上 最佳形状最佳对比度,或者 像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为 1 KDE KDE 有关 KDE KDE 是一个容易使用的现代桌面环境。 KDE 有很多很好的特性: 一个美丽的现代的桌面。 一个集合了完美网络环境的桌面。 一个集成的帮助系统,能够方便、高效地帮助您使用 KDE 桌面和它的应用程序。 所有的KDE应用程序具有一致的所见即所得界面。 标准的菜单和工具栏,键盘布局,颜色配置等。 国际化:KDE 可以使用超过40种语言。 集中的一致化的桌面驱动配置。 许多有用的 KDE应用程序。 KDE 附带了一个名为 Konqueror 的 web 浏览器, 它是其他运行于 &unix; 系统上的 web 浏览器的一个强大的竞争对手。 要了解关于 KDE 的更多详情, 可以访问 KDE 网站。 与 FreeBSD 相关的 KDE 信息和资源, 可以在 FreeBSD-KDE 团队 的网站找到。 安装 KDE GNOME 或其他桌面环境一样,安装 KDE 的最容易的方法是通过 第 2 章所描绘的 FreeBSD 安装过程的 Desktop Configuration 菜单来安装。 另外,它也可以很容易地从packages或Ports Collection安装: 要从网络安装 KDE 只需要: &prompt.root; pkg_add -r kde &man.pkg.add.1; 就会自动的下载最新版本的应用程序。 要从源代码编译 KDE, 可以使用 ports 树: &prompt.root; cd /usr/ports/x11/kde3 &prompt.root; make install clean KDE 安装完成后, X server必须被告知启动这个应用程序以代替默认的窗口管理器。 这可以通过编辑 .xinitrc 文件来完成: &prompt.user; echo "exec startkde" > ~/.xinitrc 现在,无论您什么时候用 startx进入 X 视窗系统, KDE 就将成为您的桌面环境。 如果使用一个像 XDM这样的显示管理器, 那配置文件可能有点不同。需要编辑一个 .xsession 文件,有关 kdm 的用法会在这章的后面介绍。 有关 KDE 的更多细节 现在 KDE 已经被安装在系统中了。 通过帮助页面或点击多个菜单可以发现很多东西。 &windows; 或 &mac; 用户会有回到家的感觉。 有关 KDE 的最好的参考资料是 它的在线文档。KDE 拥有它自己的 web 浏览器 Konqueror, 还有很多其他的应用程序和丰富文档。 这节的余下部分将讨论一些很难用走马观花的方法来学习的技术项目。 KDE 显示管理器 KDE display manager 如果在同一系统上有多个用户, 则管理员通常会希望使用图形化的登录界面。 前面已经提到, 使用 XDM 可以完成这项工作。 不过, KDE 本身也提供了另一个选择, 即 kdm, 它的外观更富吸引力, 而且提供了更多的登录选项。 值得一提的是, 用户还能通过菜单很容易地选择希望使用的桌面环境 (KDEGNOME 或其它)。 要启用 kdm, 需要修改 /etc/ttys 中的 ttyv8 项。 将其改为类似下面的样子: ttyv8 "/usr/local/bin/kdm -nodaemon" xterm on secure XFce 有关XFce XFce是以被GNOME 使用的 GTK+ 工具包为基础的桌面环境, 但是更加轻巧,适合于那些需要一个易于使用和配置并且简单而高效的桌面的人。 看起来,它非常像使用在商业&unix;系统上的 CDE环境。 XFce的主要特性有下面这些: 一个简单,易于使用的桌面。 完全通过鼠标的拖动和按键来控制等。 CDE 相似的主面板,菜单,applets和应用launchers。 集成的窗口管理器,文件管理器,声音管理器, GNOME应用模块,和其他一些。 可配置界面的主题。(因为它使用GTK+) 快速,轻便,高效:对于比较老的/旧的机器或带有很少内存的机器仍然很理想。 更多有关XFce 的信息可以参考XFce 网站 安装XFce 有一个二进制的XFce 软件包存在(在写作的时候)。要安装的话,执行下面的命令: &prompt.root; pkg_add -r xfce4 另外,要从源代码建立,使用Ports Collection: &prompt.root; cd /usr/ports/x11-wm/xfce4 &prompt.root; make install clean 现在,要告诉X服务器在下次X启动时执行 XFce。 只要执行下面的命令: - &prompt.user; echo "/usr/X11R6/bin/startxfce4" > ~/.xinitrc + &prompt.user; echo "/usr/local/bin/startxfce4" > ~/.xinitrc 接下来就是启动 X, XFce将成为您的桌面。 与以前一样,如果使用像 XDM 这样的显示管理器,需要创建一个 .xsession文件,就像有关 GNOME 的那节描述的, - 使用/usr/X11R6/bin/startxfce4 + 使用/usr/local/bin/startxfce4 命令,或者,配置显示管理器允许在启动时选择一个桌面, 就像有关kdm的那节描述的。