FreeBSD 使用手册

The FreeBSD Documentation Project

FreeBSD 中文计划

  欢迎使用 FreeBSD! 本手册适用于安装 FreeBSD 6.3-RELEASEFreeBSD 7.0-RELEASE 以及它们的日常使用。 这个手册目前由很多人 持续地 维护。 其中的内容需要不断地更新。 如果您有兴趣参加这个项目,请发邮件到 FreeBSD 文档计划邮件列表。此文档最新的英文原始版本可以从 FreeBSD Web站点 上获得 (这本手册的较早期版本可以在 http://docs.FreeBSD.org/doc/ 找到), 由 FreeBSD 中文计划 维护的最新译本可以在 FreeBSD 中文计划 快照 Web 站点FreeBSD 中文计划 文档快照 处获得, 这一译本会不断向主站同步。 此外, 您也可以从 FreeBSD 的 FTP 服务器 或众多的 镜像站点 得到这份文档的各种其他格式以及压缩形式的版本。 如果您更希望得到一份印刷版本的手册, 可以从 FreeBSD Mall 购买。 您还可以 搜索手册

重要: 本文中许可证的非官方中文翻译仅供参考, 不作为判定任何责任的依据。如与英文原文有出入,则以英文原文为准。

在满足下列许可条件的前提下, 允许再分发或以源代码 (SGML DocBook) 或 “编译” (SGML, HTML, PDF, PostScript, RTF 等) 的经过修改或未修改的形式:

  1. 再分发源代码 (SGML DocBook) 必须不加修改的保留上述版权告示、 本条件清单和下述弃权书作为该文件的最先若干行。

  2. 再分发编译的形式 (转换为其它DTD、 PDF、 PostScript、 RTF 或其它形式), 必须将上述版权告示、本条件清单和下述弃权书复制到与分发品一同提供的文件, 以及其它材料中。

重要: 本文档由 FREEBSD DOCUMENTATION PROJECT “按现状条件” 提供, 并在此明示不提供任何明示或暗示的保障, 包括但不限于对商业适销性、 对特定目的的适用性的暗示保障。 任何情况下, FREEBSD DOCUMENTATION PROJECT 均不对任何直接、 间接、 偶然、 特殊、 惩罚性的, 或必然的损失 (包括但不限于替代商品或服务的采购、 使用、 数据或利益的损失或营业中断) 负责, 无论是如何导致的并以任何有责任逻辑的, 无论是否是在本文档使用以外以任何方式产生的契约、 严格责任或是民事侵权行为(包括疏忽或其它)中的, 即使已被告知发生该损失的可能性。

Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code (SGML DocBook) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.

  2. Redistributions in compiled form (transformed to other DTDs, converted to PDF, PostScript, RTF and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

重要: THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

FreeBSD 是 FreeBSD基金会的注册商标

3Com 和 HomeConnect 是 3Com Corporation 的注册商标。

3ware 和 Escalade 是 3ware Inc 的注册商标。

ARM 是 ARM Limited. 的注册商标。

Adaptec 是 Adaptec, Inc. 的注册商标。

Adobe, Acrobat, Acrobat Reader, 以及 PostScript 是 Adobe Systems Incorporated 在美国和/或其他国家的商标或注册商标。

Apple, AirPort, FireWire, Mac, Macintosh, Mac OS, Quicktime, 以及 TrueType 是 Apple Computer, Inc. 在美国以及其他国家的注册商标。

Corel 和 WordPerfect 是 Corel Corporation 和/或其子公司 在加拿大、美国和/或其他国家的注册商标。

Sound Blaster 是 Creative Technology Ltd. 在美国和/或其他国家的注册商标。

CVSup 是 John D. Polstra 的注册商标。

Heidelberg、 Helvetica、 Palatino 以及 Times Roman 是 Heidelberger Druckmaschinen AG 在美国和其他国家的商标或注册商标。

IBM、 AIX、 EtherJet、 Netfinity、 OS/2、 PowerPC、 PS/2、 S/390 以及 ThinkPad 是国际商用机器公司在美国和其他国家的注册商标或商标。

IEEE, POSIX, 和 802 是 Institute of Electrical and Electronics Engineers, Inc. 在美国的注册商标。

Intel, Celeron, EtherExpress, i386, i486, Itanium, Pentium, 和 Xeon 是 Intel Corporation 及其分支机构在美国和其他国家的商标或注册商标。

Intuit 和 Quicken 是 Intuit Inc., 或其子公司在美国和其他国家的商标或注册商标。

Linux 是 Linus Torvalds 的注册商标。

LSI Logic, AcceleRAID, eXtremeRAID, MegaRAID 和 Mylex 是 LSI Logic Corp 的商标或注册商标。

M-Systems 和 DiskOnChip 是 M-Systems Flash Disk Pioneers, Ltd. 的商标或注册商标。

Macromedia, Flash, 以及 Shockwave Macromedia, Inc. 在美国和/或其他国家的商标或注册商标。

Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media, 和 Windows NT 是 Microsoft Corporation 在美国和/或其他国家的商标或注册商标。

Netscape 以及 Netscape Navigator 是 Netscape Communications Corporation 在美国和其他国家的注册商标。

GateD 和 NextHop 是 NextHop 在美国和其他国家的商标或注册商标。

Motif, OSF/1, 和 UNIX 是 The Open Group 在美国和其他国家的注册商标; IT DialTone 和 The Open Group 是其商标。

Oracle 是 Oracle Corporation 的注册商标。

PowerQuest 和 PartitionMagic 是 PowerQuest Corporation 在美国和/或其他国家的注册商标。

RealNetworks, RealPlayer, 和 RealAudio 是 RealNetworks, Inc. 的注册商标。

Red Hat, RPM, 是 Red Hat, Inc. 在美国和其他国家的注册商标。

SAP, R/3, 和 mySAP 是 SAP AG 在德国以及许多其他国家的商标或注册商标。

Sun、 Sun Microsystems、 Java、 Java Virtual Machine、 JavaServer Pages、 JDK、 JRE、 JSP、 JVM、 Netra、 Solaris、 StarOffice、 Sun Blade、 Sun Enterprise、 Sun Fire、 SunOS 以及 Ultra 是 Sun Microsystems, Inc. 在美国和其他国家的商标或注册商标。

Symantec 和 Ghost 是 Symantec Corporation 在美国和其他国家的注册商标。

MATLAB 是 The MathWorks, Inc. 的注册商标。

SpeedTouch 是 Thomson 的商标。

U.S. Robotics 和 Sportster 是 U.S. Robotics Corporation 的注册商标。

VMware 是 VMware, Inc. 的商标

Waterloo Maple 和 Maple 是 Waterloo Maple Inc 的商标或注册商标

Mathematica 是 Wolfram Research, Inc 的注册商标。

XFree86 是 The XFree86 Project, Inc 的商标。.

Ogg Vorbis 和 Xiph.Org 是 Xiph.Org 的商标。

许多制造商和经销商使用一些称为商标的图案或文字设计来彰显自己的产品。 本文档中出现的, 为 FreeBSD Project 所知晓的商标,后面将以 '™' 或 '®' 符号来标注。


目录
前言
第I部分. 起步
第1章 介绍
1.1 概述
1.2 欢迎来到 FreeBSD 的世界!
1.3 关于 FreeBSD 项目
第2章 安装 FreeBSD
2.1 概述
2.2 硬件需求
2.3 安装前的准备工作
2.4 开始安装
2.5 介绍 Sysinstall
2.6 分配磁盘空间
2.7 选择要安装的软件包
2.8 选择您要使用的安装介质
2.9 安装确认
2.10 安装后的配置
2.11 常见问题
2.12 高级安装指南
2.13 准备您自己的安装介质
第3章 UNIX 基础
3.1 概述
3.2 虚拟控制台和终端
3.3 权限
3.4 目录架构
3.5 磁盘组织
3.6 文件系统的挂接和卸下
3.7 进程
3.8 守护进程,信号和杀死进程
3.9 Shells
3.10 文本编辑器
3.11 设备和设备节点
3.12 二进制文件格式
3.13 取得更多的资讯
第4章 安装应用程序: Packages 和 Ports
4.1 概述
4.2 软件安装预览
4.3 寻找您要的应用程序
4.4 使用Packages系统
4.5 使用Ports Collection
4.6 安装之后还要做点什么?
4.7 如何处理坏掉的 Ports
第5章 X Window 系统
5.1 概述
5.2 理解 X
5.3 安装 X11
5.4 配置 X11
5.5 在 X11 中使用字体
5.6 X 显示管理器
5.7 桌面环境
第II部分. 常见的任务
第6章 桌面应用
6.1 概述
6.2 浏览器
6.3 办公、图象处理
6.4 文档查看器
6.5 财务
6.6 总结
第7章 多媒体
7.1 概述
7.2 安装声卡
7.3 MP3音频
7.4 视频回放
7.5 安装电视卡
7.6 图象扫描仪
第8章 配置FreeBSD的内核
8.1 概述
8.2 为什么需要建立定制的内核?
8.3 发现系统硬件
8.4 建立并安装一个定制的内核
8.5 配置文件
8.6 如果出现问题怎么办
第9章 打印
9.1 概述
9.2 介绍
9.3 基本设置
9.4 高级设置
9.5 使用打印机
9.6 替换标准后台打印
9.7 疑难问题
第10章 Linux二进制兼容模式
10.1 概述
10.2 安装
10.3 安装Mathematica®
10.4 安装Maple
10.5 安装MATLAB®
10.6 安装Oracle®
10.7 安装SAP® R/3®
10.8 高级主题
第III部分. 系统管理
第11章 设置和调整
11.1 概述
11.2 初步配置
11.3 核心配置
11.4 应用程序配置
11.5 启动服务
11.6 配置 cron
11.7 在 FreeBSD 中使用 rc
11.8 设置网卡
11.9 虚拟主机
11.10 配置文件
11.11 用 sysctl 进行调整
11.12 调整磁盘
11.13 调整内核限制
11.14 添加交换空间
11.15 电源和资源管理
11.16 使用和调试 FreeBSD ACPI
第12章 FreeBSD 引导过程
12.1 概述
12.2 引导问题
12.3 引导管理器和各引导阶段
12.4 内核在引导时的交互
12.5 Device Hints
12.6 Init:进程控制及初始化
12.7 关机 (shutdown) 过程
第13章 用户和基本的帐户管理
13.1 概述
13.2 介绍
13.3 超级用户帐户
13.4 系统帐户
13.5 用户帐户
13.6 修改帐户
13.7 限制用户使用系统资源
13.8
第14章 安全
14.1 概述
14.2 介绍
14.3 确保 FreeBSD 的安全
14.4 DES、 Blowfish、 MD5, 以及 Crypt
14.5 一次性口令
14.6 TCP Wrappers
14.7 KerberosIV
14.8 Kerberos5
14.9 OpenSSL
14.10 IPsec 上的 VPN
14.11 OpenSSH
14.12 文件系统访问控制表
14.13 监视第三方安全问题
14.14 FreeBSD 安全公告
14.15 进程记帐
第15章 Jails
15.1 概述
15.2 与 Jail 相关的一些术语
15.3 介绍
15.4 建立和控制 jail
15.5 微调和管理
15.6 Jail 的应用
第16章 强制访问控制
16.1 概要
16.2 本章出现的重要术语
16.3 关于 MAC 的说明
16.4 理解 MAC 标签
16.5 规划安全配置
16.6 模块配置
16.7 MAC bsdextended 模块
16.8 MAC ifoff 模块
16.9 MAC portacl 模块
16.10 MAC partition (分区) 模块
16.11 MAC 多级 (Multi-Level) 安全模块
16.12 MAC Biba 模块
16.13 MAC LOMAC 模块
16.14 MAC Jail 中的 Nagios
16.15 User Lock Down
16.16 MAC 框架的故障排除
第17章 安全事件审计
17.1 概述
17.2 本章中的一些关键术语
17.3 安装审计支持
17.4 对审计进行配置
17.5 管理审计子系统
第18章 存储
18.1 概述
18.2 设备命名
18.3 添加磁盘
18.4 RAID
18.5 USB 存储设备
18.6 创建和使用光学介质(CD)
18.7 创建和使用光学介质(DVD)
18.8 创建和使用软盘
18.9 用磁带机备份
18.10 用软盘备份
18.11 备份策略
18.12 备份程序
18.13 网络、内存和 和以及映像文件为介质的虚拟文件系统
18.14 文件系统快照
18.15 文件系统配额
18.16 加密磁盘分区
18.17 对交换区进行加密
第19章 GEOM: 模块化磁盘变换框架
19.1 概述
19.2 GEOM 介绍
19.3 RAID0 - 条带
19.4 RAID1 - 镜像
19.5 GEOM Gate 网络设备
19.6 为磁盘设备添加卷标
19.7 通过 GEOM 实现 UFS 日志
第20章 Vinum 卷管理程序
20.1 概述
20.2 磁盘容量太小
20.3 访问瓶颈
20.4 数据的完整性
20.5 Vinum 目标
20.6 一些例子
20.7 对象命名
20.8 配置 Vinum
20.9 使用 Vinum 作为根文件系统
第21章 虚拟化
21.1 概述
21.2 作为客户 OS 的 FreeBSD
21.3 作为宿主 OS 的 FreeBSD
第22章 本地化-I18N/L10N使用和设置
22.1 概述
22.2 基础知识
22.3 使用本地化语言
22.4 编译I18N程序
22.5 本地化FreeBSD
第23章 最前沿
23.1 概述
23.2 FreeBSD-CURRENT 和 FreeBSD-STABLE 的对比
23.3 同步您的源码
23.4 重新编译 “world”
23.5 跟踪多台机器
第IV部分. 网络通讯
第24章 串口通讯
24.1 概述
24.2 介绍
24.3 终端
24.4 拨入服务
24.5 拨出设备
24.6 设置串口控制台
第25章 PPP 和 SLIP
25.1 概述
25.2 使用用户级 PPP
25.3 使用内核级PPP
25.4 PPP 连接故障排除
25.5 使用基于以太网的PPP(PPPoE)
25.6 使用 ATM 上的 PPP (PPPoA)
25.7 使用SLIP
第26章 电子邮件
26.1 概述
26.2 使用电子邮件
26.3 sendmail 配置
26.4 改变您的邮件传输代理程序
26.5 疑难解答
26.6 高级主题
26.7 SMTP 与 UUCP
26.8 只发送邮件的配置
26.9 拨号连接时使用邮件传送
26.10 SMTP 验证
26.11 邮件用户代理
26.12 使用 fetchmail
26.13 使用 procmail
第27章 网络服务器
27.1 概要
27.2 inetd “超级服务器”
27.3 网络文件系统(NFS)
27.4 网络信息服务 (NIS/YP)
27.5 网络自动配置 (DHCP)
27.6 域名系统 (DNS)
27.7 Apache HTTP 服务器
27.8 文件传输协议 (FTP)
27.9 Microsoft Windows 客户机提供文件和打印服务 (Samba)
27.10 通过 NTP 进行时钟同步
第28章 防火墙
28.1 入门
28.2 防火墙的概念
28.3 防火墙软件包
28.4 OpenBSD Packet Filter (PF) 和 ALTQ
28.5 IPFILTER (IPF) 防火墙
28.6 IPFW
第29章 高级网络
29.1 概述
29.2 网关和路由
29.3 无线网络
29.4 蓝牙
29.5 桥接
29.6 链路聚合与故障转移
29.7 无盘操作
29.8 ISDN
29.9 网络地址转换
29.10 并口电缆 IP (PLIP)
29.11 IPv6
29.12 异步传输模式 (ATM)
29.13 Common Access Redundancy Protocol (CARP, 共用地址冗余协议)
第V部分. 附录
附录A. 获取 FreeBSD
A.1 CDROM 和 DVD 发行商
A.2 FTP 站点
A.3 匿名 CVS
A.4 使用 CTM
A.5 使用 CVSup
A.6 使用 Portsnap
A.7 CVS 标签
A.8 AFS 站点
A.9 rsync 站点
附录B. 参考文献
B.1 关于 FreeBSD 的专业书籍与杂志
B.2 用户指南
B.3 管理员指南
B.4 开发指南
B.5 操作系统原理
B.6 信息安全方面的参考文献
B.7 硬件参考
B.8 UNIX 历史
B.9 各种期刊
附录C. Internet上的资源
C.1 邮件列表
C.2 Usenet新闻组
C.3 World Wide Web服务器
C.4 Email地址
C.5 Shell账号
附录D. PGP公钥
D.1 官员
D.2 核心团队成员
D.3 开发者
FreeBSD 术语表
Colophon
表格清单
表2-1. 硬件设备清单
表2-2. 为第一个硬盘分区
表2-3. 为其它磁盘分区
表2-4. FreeBSD 5.X 和 6.X ISO 映像文件名和含意
表3-1. 磁盘设备的代码
表18-1. 物理磁盘命名规则
表20-1. Vinum Plex组织图
表24-1. DB-25 to DB-25 Null-Modem Cable
表24-2. DB-9 到 DB-9 Null-Modem 电缆
表24-3. DB-9 到 DB-25 Null-Modem 电缆
表24-4. 信号名称
表29-1. 用于网络连接的并口电缆接线方式
表29-2. 保留的 IPv6 地址
插图清单
图2-1. FreeBSD Boot Loader Menu
图2-2. 典型的设备探测结果
图2-3. 选择国家及地区菜单
图2-4. 选择离开 Sysinstall
图2-5. 选取 Sysinstall 主菜单的 Usage 项目
图2-6. 选择说明文件菜单
图2-7. Sysinstall 说明文件菜单
图2-8. Sysinstall 主菜单
图2-9. Sysinstall 键盘对应菜单
图2-10. Sysinstall 主菜单
图2-11. Sysinstall 选项设置
图2-12. 开始进行标准安装
图2-13. 选择要分区的硬盘
图2-14. 典型的尚未编辑前的 Fdisk 分区表
图2-15. Fdisk 分区使用整个硬盘
图2-16. Sysinstall 多重引导管理程序
图2-17. 离开选择硬盘画面
图2-18. Sysinstall Disklabel 编辑器
图2-19. Sysinstall Disklabel 编辑器-使用自动配置
图2-20. 根目录使用空间
图2-21. 编辑要分区大小
图2-22. 选择根分区类型
图2-23. 选择根挂接点
图2-24. Sysinstall Disklabel 编辑器
图2-25. 选择软件包
图2-26. 确认您要安装的软件包
图2-27. 选择安装介质
图2-28. 选择网卡设备
图2-29. 配置 ed0接口
图2-30. 编辑 inetd.conf配置文件
图2-31. 默认的匿名 FTP 配置
图2-32. 编辑FTP欢迎信息
图2-33. 编辑 exports文件
图2-34. 系统终端配置选项
图2-35. 屏幕保护程序选项
图2-36. 屏幕保护时间设置
图2-37. 退出系统终端配置
图2-38. 选择您所处的地理区域
图2-39. 选择您所在的国家
图2-40. 选择您所在的时区
图2-41. 选择鼠标类型
图2-42. 设置鼠标协议
图2-43. 配置鼠标端口
图2-44. 配置鼠标端口
图2-45. 启动鼠标服务进程
图2-46. 测试鼠标功能
图2-47. 选择 Package 类别
图2-48. 选择 Package
图2-49. 安装预编译软件包
图2-50. 确认将要安装的预编译包
图2-51. 选择用户
图2-52. 添加用户信息
图2-53. 退出用户和组管理
图2-54. 退出安装
图2-55. 网络配置之上层配置
图2-56. 选择默认的 MTA
图2-57. Ntpdate 配置
图2-58. 网络配置之下层配置
图20-1. 串联组织
图20-2. 分段组织
图20-3. RAID-5 的组织
图20-4. 一个简单的Vinum 卷
图20-5. 镜像 Vinum 卷
图20-6. 条带化的 Vinum 卷
图20-7. 镜像并条带化的 Vinum 卷
范例清单
例2-1. 使用已存在的分区
例2-2. 缩减已现在的分区
例3-1. 样例磁盘, Slice, 和 Partition 它们的命名
例3-2. 一个磁盘的布局
例4-1. 在本地手动下载一个package,并安装它
例11-1. 在 FreeBSD 中创建交换文件
例12-1. boot0 截屏
例12-2. boot2 的屏幕输出
例12-3. /etc/ttys 文件中的不安全控制台
例13-1. 在 FreeBSD 中添加一个新用户
例13-2. 删除用户 交互模式下的帐户删除
例13-3. 以超级用户交互执行 chpass 命令
例13-4. 以普通用户交互执行 chpass 命令
例13-5. 改变您的口令
例13-6. 改变其他用户的口令同超级用户的一样
例13-7. 使用pw(8)添加一个组
例13-8. 使用 pw(8) 设置组的成员列表
例13-9. 使用 pw(8) 为组添加新的成员
例13-10. 使用id(1)来决定组成员
例14-1. 使用 SSH 为 SMTP 创建安全隧道
例18-1. 通过 ssh 使用 dump
例18-2. 通过设置 ssh 环境变量 RSH 使用 dump
例18-3. 一个建立启动磁盘的 shell 脚本例子:
例18-4. 使用 mdconfig 挂载已经存在的映像文件
例18-5. 使用 mdconfig 将映像文件作为文件系统挂载
例18-6. 使用 mdmfs 命令配置和挂载一个映像文件为文件系统
例18-7. mdconfig 创建新的内存盘设备
例18-8. 使用 mdmfs 来新建内存介质文件系统
例24-1. /etc/ttys 中增加终端记录
例26-1. 配置 sendmail 的访问许可数据库
例26-2. 邮件别名
例26-3. 虚拟域邮件映射的例子
例27-1. 重新加载 inetd 配置文件
例27-2. 通过 amd 来挂接导出的文件系统
例27-3. 安装 Django,Apache2, mod_python3,和 PostgreSQL
例27-4. Django/mod_python 有关 Apache 部分的配置
例29-1. 与 Cisco 交换机配合完成 LACP 链路聚合
例29-2. 故障转移模式
例29-3. 办公室局部或家庭网
例29-4. 主办公室或其它网络
例A-1. 从 -CURRENT 检出些东西 (ls(1)):
例A-2. 通过 SSH 检出整个 src/ 代码树:
例A-3. 检出 6-STABLE 分支中的 ls(1) 版本:
例A-4. 创建 ls(1) 的变化列表(用标准的 diff)
例A-5. 找出可以使用的其它的模块名:

前言

预期的读者

作为 FreeBSD 的新用户,您将会在本手册第一部分找到 FreeBSD 的安装方法,同时逐渐引入概念和习俗来加强 UNIX® 基础。 阅读这部分只需要您有探索的精神和接受新概念的能力。

读完这些之后,手册中很漫长的第二部分是 FreeBSD 中系统管理员感兴趣的所有主题的全面参考。 在阅读这些章节的内容时所需要的背景知识都注释在每一章节的大纲里面, 如果需要,可在阅读前进行预习。

要获得附加的信息来源列表,请查阅 附录 B

相对于第二版的改动

您目前看到的这本手册的第三版是 FreeBSD 文档计划的成员历时两年完成的顶峰之作。 第三版包含了如下的的主要变动:

相对于第一版的改变

本手册的第二版是 FreeBSD 文档计划的成员历时两年完成的顶峰之作。 第二版包含了如下的的主要变动:

本手册的组织

这本手册分成了三个逻辑清晰的部分。第一部分 起步 涵盖了 FreeBSD 的安装和基本使用方法。 读者可根据自己的情况按顺序或者跳过一些熟悉的主题来阅读。第二部分 常用操作 涵盖了 FreeBSD 常用的功能, 这部分可以不按顺序阅读。每个部分由一个简明的大纲开始, 这个大纲描述本章节涵盖的内容和读者应该已经知道的知识。 这主要是让读者可以更好的选择感兴趣的章节阅读。第三部分 系统管理 涵盖了 FreeBSD 高级用户所感兴趣的广泛的话题。 第四部分 网络通讯 包括了网络和服务的话题, 而第五部分则是资源信息的附录。

第 1 章, 介绍

向新用户介绍 FreeBSD。它描述了 FreeBSD 计划的历史、目标和开发模式。

第 2 章,安装

本章将会带领用户完成安装过程。一些高级安装主题, 例如如何通过串行控制台安装,也涵盖在内。

第 3 章UNIX 基础

本章涵盖了 FreeBSD 操作系统基础命令和功能。 如果熟悉 Linux 或者其他类 UNIX 操作系统,则可以跳过这章。

第 4 章,安装应用程序

本章涵盖如何用 FreeBSD 的 “Ports Collection” 和标准二进制软件包来安装第三方软件。

第 5 章,X Window 系统

本章概要地描述了 X Window System 系统并详细地介绍了如何在 FreeBSD 上使用它。 此外他也描述了常用的桌面环境, 例如 KDEGNOME

第 6 章,桌面应用

列出了一些常用的桌面应用程序,比如 web 浏览器和办公套件, 描述了在 FreeBSD 上如何安装它们。

第 7 章,多媒体

展示了如何为您的系统设置声卡和视频回放支持。 也描述了一些简单的音频和视频应用程序。

第 8 章,配置 FreeBSD 内核

解释了为什么需要配置一个新内核并提供了配置、 编译、安装自定义内核的详细说明。

第 9 章,打印

描绘了 FreeBSD 上打印机管理, 包括横幅页、打印统计,还有初始的设置。

第 10 章Linux 二进制兼容

描述了 FreeBSD 的 Linux 兼容特性。 也提供了许多流行的 Linux 应用程序的详细的安装说明, 比如 OracleSAP R/3,还有 Mathematica®

第 11 章,配置和调整

本章描述了管理员调整 FreeBSD 系统以优化性能时可能用到的一些参数。 也描述了 FreeBSD 中的各种配置文件以及它们所在的位置。

第 12 章,启动过程

本章描述 FreeBSD 的启动过程并且解释了如何用配置选项来控制这个过程。

第 13 章,用户和基本帐号管理

本章描述了如何创建和操作用户帐号, 同样也论述了设置用户资源限制和其他账号管理任务的方法。

第 14 章, 安全

描述了保证 FreeBSD 系统安全可以使用的许多工具, 这包括 Kerberos, IPsec 以及 OpenSSH。

第 15 章, Jail

介绍了 jail 框架, 以及 jail 相对于 FreeBSD 中传统的 chroot 支持的改进。

第 16 章, 强制访问控制

解释了何谓强制访问控制 (MAC) 以及如何利用这一机制来加强 FreeBSD 系统的安全。

第 17 章, 安全事件审计

介绍了 FreeBSD 事件审计是什么, 以及如何安装、 配置它, 并检查或监视审计记帐信息。

第 18 章,存储

本章描述了怎样用 FreeBSD 来管理存储介质和文件系统,包括物理磁盘、RAID 阵列、光学和磁带媒体、后备存储磁盘以及网络文件系统。

第 19 章, GEOM

介绍了 FreeBSD 中的 GEOM 框架是什么, 以及如何配置它所支持的各级 RAID。

第 20 章, Vinum

本章描述了怎样使用逻辑卷管理器 Vinum。它提供了设备无关的逻辑磁盘和软件 RAID-0、RAID-1 以及 RAID-5。

第 21 章, 虚拟化

介绍了虚拟化系统提供的功能, 以及如何配合 FreeBSD 使用它们。

第 22 章,本地化

本章描述了如何在 FreeBSD 上使用非英语语言。它涵盖了系统和应用程序级的本地化。

第 23 章, 最前沿

介绍了 FreeBSD-STABLE、 FreeBSD-CURRENT 以及 FreeBSD 发行版本之间的差异。 描述了一般用户如何紧跟开发过程并从中受益。

第 24 章,串行通信

本章解释了如何连接终端和调制解调器到 FreeBSD 系统,包括拨入和拨出连接。

第 25 章,PPP 和 SLIP

本章描述了如何用 FreeBSD 通过使用 PPP,SLIP 或者基于以太网的 PPP(PPPoE)来连接远程系统。

第 26 章, 电子邮件

本章解释了一个 email 服务器的不同组成部分并且简单讨论了关于最流行的 mail 服务器软件 sendmail 的配置。

第 27 章, 网络服务

提供了详细的指引和示范配置文件以说明如何将一台 FreeBSD 机器作为网络文件系统服务器, 域名服务器, 网络信息服务器或时间同步服务器来使用的方法。

第 28 章, 防火墙

解释了基于软件的防火墙的原理, 并提供了关于配置 FreeBSD 上的几种防火墙的详细说明。

第 29 章, 高级网络应用

描述了许多关于网络的主题,包括如何在您的局域网中共享 Internet 连接, 高级路由话题, 无线网络, Bluetooth, ATM, IPv6以及许多高级话题。

附录 A,获取 FreeBSD

列出了获得 FreeBSD 安装 CDROM 或 DVDROM 的不同资源,也提供了允许您自由下载 FreeBSD 的不同 Internet 站点。

附录 B,参考书目

由于本手册触及到了很多不同的主题,因而可能引发您想要获取更多详细的讲解。 参考书目列出了很多写作这本书时参考的好书。

附录 C,Internet 上的资源

讲述了很多对 FreeBSD 用户有用的能够提出问题并进行技术交流的关于 FreeBSD 的论坛。

附录 D,PGP 秘钥

列出了一些 FreeBSD 开发者的 PGP 签名。

本书中使用的一些约定

为了使本书保持一致性和易读性特做了以下约定:

排版约定

斜体

斜体 字用来表示文件名、URLs、强调文字和术语的主流用法。

等宽

等宽 字体用来表示错误信息、 命令、 环境变量、 port 的名字、 主机名、 用户名、 组名、 设备名、 变量名, 以及代码片断。

粗体

粗体 字用来表示应用程序、命令和关键字。

用户输入

按键用粗体来突出于其他文本。 组合键意味着字用‘+’连接时,同时的按下它们,例如:

Ctrl+Alt+Del

表示您应该同时按下 CtrlAltDel 键。

按顺序依次键入的关键字通常是用逗号隔开,例如:

Ctrl+X, Ctrl+S

这意味着用户应该同时按CtrlX,然后同时按 CtrlS

示例

E:\> 开头的例子代表一个 MS-DOS® 命令。除非另有说明,这些命令都可以在一个现代的 Microsoft Windows “命令行”窗口环境被执行。

E:\> tools\fdimage floppies\kern.flp A:

# 开头的例子代表必须以 FreeBSD 超级用户身份执行的命令。您可以用 root 身份登录来输入这些命令,或者以普通账号登录然后用 su(1) 来获得超级用户权限。

# dd if=kern.flp of=/dev/fd0

% 开头的例子代表命令应该被普通账号执行。 除非另有说明, 在设置环境变量和使用的其他 shell 命令均为 C-shell 语法。

% top

致谢

您所看到的这本书是全球几百人努力的结果。 无论他们只是纠正一些错误或提交完整的章节,所有的贡献都是非常有用的。

一些公司通过提供资金让作者专注于文档开发、提供出版资金等等方式来支持文档开发。 其中,BSDi (后并入Wind River Systems) 资助 FreeBSD 文档计划成员来专职改善这本书直到 2000 年三月第一个印刷版 (ISBN 1-57176-241-8) 的出版。Wind River Systems 同时资助其他作者来对输出结构做很多改进和给文章添加一些附加章节。 这项工作结束于 2001 年 11 月印刷第二版 (ISBN 1-57176-303-1)。在 2003-2004 两年中,FreeBSD Mall, 向为改进这本手册以使其第三版印刷版本能够出版的志愿者支付了报酬。

第I部分. 起步

手册的以下章节主要是针对刚开始使用 FreeBSD 的用户及管理员:

  • FreeBSD 入门。

  • 安装过程向导。

  • 教您 UNIX 基本知识和基本原理。

  • 展示如何在 FreeBSD 上安装大量的第三方应用程序。

  • 介绍使用 X,UNIX 窗口系统,以及为一些生产环境配置桌面环境的细节。

我们尝试用最少的页数来保持前言的索引,以至于可以用最少翻页次数将该手册从头至尾读过。

目录
第1章 介绍
第2章 安装 FreeBSD
第3章 UNIX 基础
第4章 安装应用程序: Packages 和 Ports
第5章 X Window 系统

第1章  介绍

Restructured, reorganized, and parts rewritten by Jim Mock.

1.1 概述

  非常感谢您对 FreeBSD 感兴趣! 下面的章节涵盖了 FreeBSD 项目的各个方面, 比如它的历史、目标、开发模式,等等。

  阅读完这章,您将了解:

  • FreeBSD 与其它计算机操作系统的关系。

  • FreeBSD 项目的历史。

  • FreeBSD 项目的目标。

  • FreeBSD 开放源代码开发模式的基础。

  • 当然还有:“FreeBSD” 这个名称的由来。


1.2 欢迎来到 FreeBSD 的世界!

  FreeBSD 是一个支持 Intel (x86 和 Itanium®),AMD64,Alpha™,Sun UltraSPARC® 计算机的基于 4.4BSD-Lite 的操作系统。 到其他体系结构的移植也在进行中。 您也可以阅读 FreeBSD 的历史, 或者最新的发行版本。 如果您有意捐助(代码, 硬件,基金),请看为 FreeBSD 提供帮助这篇文章。


1.2.1 FreeBSD 能做些什么?

  FreeBSD有许多非凡的特性。其中一些是:

  • 抢占式多任务与动态优先级调整确保在应用程序和用户之间平滑公正的分享计算机资源, 即使工作在最大的负载之下。

  • 多用户设备 使得许多用户能够同时使用同一 FreeBSD 系统做各种事情。 比如, 像打印机和磁带驱动器这样的系统外设, 可以完全地在系统或者网络上的所有用户之间共享, 可以对用户或者用户组进行个别的资源限制, 以保护临界系统资源不被滥用。

  • 符合业界标准的强大 TCP/IP 网络 支持, 例如 SCTP、 DHCP、 NFS、 NIS、 PPP, SLIP, IPsec 以及 IPv6。 这意味着您的 FreeBSD 主机可以很容易地和其他系统互联, 也可以作为企业的服务器,提供重要的功能, 比如 NFS(远程文件访问)以及 email 服务, 或将您的组织接入 Internet 并提供 WWW,FTP,路由和防火墙(安全)服务。

  • 内存保护确保应用程序(或者用户)不会相互干扰。 一个应用程序崩溃不会以任何方式影响其他程序。

  • FreeBSD 是一个 32 位操作系统 (在 Alpha,Itanium,AMD64,和 UltraSPARC 上是64 位), 并且从开始就是如此设计的。

  • 业界标准的 X Window 系统 (X11R7)为便宜的常见 VGA 显示卡和监视器提供了一个图形化的用户界面(GUI), 并且完全开放代码。

  • 和许多 Linux,SCO,SVR4,BSDI 和 NetBSD 程序的二进制代码兼容性

  • 数以千计的 ready-to-run 应用程序可以从 FreeBSD portspackages 套件中找到。 您可以顺利地从这里找到, 何须搜索网络?

  • 可以在 Internet 上找到成千上万其它 easy-to-port 的应用程序。 FreeBSD 和大多数流行的商业 UNIX 代码级兼容, 因此大多数应用程序不需要或者只要很少的改动就可以编译。

  • 页式请求虚拟内存和“集成的 VM/buffer 缓存”设计有效地满足了应用程序巨大的内存需求并依然保持其他用户的交互式响应。

  • SMP 提供对多处理器的支持。

  • 内建了完整的 CC++Fortran 开发工具。 许多附加的用于高级研究和开发的程序语言, 也可以在通过 ports 和 packages 套件获得。

  • 完整的系统源代码意味着您对您环境的最大程度的控制。 当您拥有了一个真正的开放系统时, 为什么还要受困于私有的解决方案, 任商业公司摆布呢?

  • 丰富的在线文档

  • 不仅如此!

  FreeBSD 基于加州大学伯克利分校计算机系统研究组(CSRG)发布的 4.4BSD-Lite, 继承了 BSD 系统开发的优良传统。 除了 CSRG 优秀的工作之外, FreeBSD 项目花费了非常多的时间来优化调整系统, 使其在真实负载情况下拥有最好的性能和可靠性。 在现今, 许多商业巨人正为给 PC 操作系统增加新功能、 提升和改善其可靠性, 以便在其上展开激烈竞争的同时, FreeBSD 现在 已经能够提供所有这一切了!

  FreeBSD 可以提供的应用事实上仅局限于您的想象力。 从软件开发到工厂自动化,从存货控制到遥远的人造卫星天线方位控制, 如果商业的 UNIX 产品可以做到,那么就非常有可能您也可以用 FreeBSD 来做! FreeBSD 也极大地受益于全世界的研究中心和大学开发的数以千计的高质量的应用程序, 这些程序通常只需要很少的花费甚至免费。 可用的商业应用程序, 每天也都在大量地增加。

  因为 FreeBSD 自身的源代码是完全公开的, 所以对于特定的应用程序或项目,可以对系统进行最大限度的定制。 这对于大多数主流的商业生产商的操作系统来说几乎是不可能的。 以下是当前人们应用 FreeBSD 的某些程序的例子:

  • Internet 服务:FreeBSD 内建的强大的 TCP/IP 网络使它得以成为各种 Internet 服务的理想平台,比如:

    • FTP 服务器

    • World Wide Web 服务器(标准的或者安全的 [SSL])

    • IPv4 and IPv6 路由

    • 防火墙和 NAT(“IP 伪装”) 网关

    • 电子邮件服务器

    • USENET 新闻组和电子布告栏系统

    • 还有许多...

    使用 FreeBSD, 您可以容易地从便宜的 386 类 PC 起步,并随着您的企业成长,一路升级到带有 RAID 存储的四路 Xeon 服务器。

  • 教育:您是一名计算机科学或者相关工程领域的学生吗? 学习操作系统,计算机体系结构和网络没有比在 FreeBSD 可提供的体验下动手实践更好的办法了。许多可自由使用的 CAD、数学和图形设计包也使它对于那些主要兴趣是在计算机上完成其他工作的人非常有帮助。

  • 研究:有完整的系统源代码, FreeBSD 对于操作系统研究以及其他计算机科学分支都是一个极好的平台。 FreeBSD 可自由获得的本性, 同样可以使处在不同地方的开发团队在开放的论坛上讨论问题、 交流想法与合作开发成为可能, 且不必担心特别的版权协定或者限制。

  • 网络:需要一个新的路由器? 一台域名服务器 (DNS)? 一个隔离您的内部网络的防火墙? FreeBSD 可以容易的把丢弃在角落不用的 386 或者 486 PC 变成一台完善的带包过滤能力的高级路由器。

  • X Window 工作站: FreeBSD 是廉价 X 终端的一种绝佳解决方案, 您可以选择使用免费的 X11 服务器。 与 X 终端不同,如果需要的话 FreeBSD 能够在本地直接运行程序, 因而减少了中央服务器的负担。 FreeBSD 甚至能够在 “无盘” 环境下启动, 这使得终端更为便宜和易于管理。

  • 软件开发: 基本的 FreeBSD 系统带有包括著名的 GNU C/C++ 编译器和调试工具在内的一整套开发工具。

  FreeBSD 可以通过 CDROM、DVD, 以及匿名 FTP 以源代码和二进制方式获得。请查看附录 A 了解获取 FreeBSD 的更多细节。


1.2.2 谁在使用 FreeBSD?

  FreeBSD 已被用来支持 Internet 上一些最大的站点, 包括:

  等等许多。


1.3 关于 FreeBSD 项目

  下面的章节提供了项目的一些背景信息, 包括简要的历史、项目目标、以及项目开发模式。


1.3.1 FreeBSD 的简要历史

Contributed by Jordan Hubbard.

  FreeBSD 项目起源于 1993 年早期, 部分作为 “Unofficial 386BSD Patchkit” 的副产物,patchkit 的最后 3 个协调维护人是:Nate Williams,Rod Grimes 和我。

  我们最初的目标是做出一份 386BSD 的测试版以修正一些 Patchkit 机制无法解决的错误(bug)。 很多人可能还记得早期的项目名称叫做 “386BSD 0.5” 或者 “386BSD Interim” 就是这个原因。

  386BSD 是 Bill Jolitz 的操作系统, 到那时已被严重地忽视了一年之久。 由于 Patchkit 在过去的每一天里都在急剧膨胀, 使得对其进行消化吸收变得越来越困难, 因此我们一致同意应该做些事情并决定通过提供这个临时的 “cleanup” 版本来帮助 Bill。 然而,Bill 却在事先没有指出这个项目应该如何开展下去的情况下, 突然决定退出这个项目,最终这个计划只好被迫停止。

  没过多久, 我们认为即便没有 Bill 的支持, 项目仍有保留的价值, 因此,我们采用了 David Greenman 的意见,给其命名为 “FreeBSD”。在和当时的几个用户商量后, 我们提出了最初的目标, 而这件事明朗化后, 这个项目就走上了正轨,甚至可能成为现实。 为了拓展 FreeBSD 的发行渠道,我抱着试试看的心态, 联系了光盘商 Walnut Creek CDROM, 以便那些上网不方便的用户得到 FreeBSD。 Walnut Creek CDROM 不仅支持发行 FreeBSD 光盘版的想法, 还为这个计划提供了所需的计算机和高速网络接入。 在那时, 若没有 Walnut Creek CDROM 对一个完全未知的项目的空前信任, FreeBSD 不太可能像它今天这样,影响如此深远,发展如此快速。

  第一个 CDROM (以及在整个互联网范围内发行的) 发行版本是 FreeBSD 1.0,于 1993 年 10 月发布。这个版本基于 U.C. Berkeley 的 4.3BSD-Lite(“Net/2”)磁带, 也有许多组件是 386BSD 和自由软件基金会提供的。 对于第一次发行,这算是相当成功了。 在 1994 年 5 月,我们发布了更加成功的 FreeBSD 1.1 版。

  然而此后不久,发生了一些意外的情况。 Novell 和 U.C. Berkeley 决定就 Berkeley Net/2 磁带的归属权问题打的那场马拉松式的官司达成和解。 判决的结果是, U.C. Berkeley 承认 Net/2 很大一部分代码是“侵占来的” 且这些代码归 Novell 公司所拥有。这些代码是 Novell 不久前从 AT&T 买来的。 Berkeley 得到了来自 Novell 的 “祝福”: 4.4BSD-Lite 发行后,将不认为是侵权, 且要求现存的 Net/2 的用户更换新版。 这也包括 FreeBSD,我们的项目被要求在 1994 年 6 月底停止发行基于 Net/2 的产品。在此协议允许的时间内, 本项目被允许发行最后一版,也就是 FreeBSD 1.1.5.1。

  于是 FreeBSD 开始艰苦的从全新的而且不完整的 4.4BSD-Lite 中重新整合自己。“Lite” 版本是不完整的, 因为 Berkeley 的 CSRG 已经删除了大量的构建可启动运行的系统所需要的代码 (因为各种各样的版权问题),事实上 4.4 的 Intel port 是非常不完整的。 直到 1994 年 11 月项目才完成这个转换,这个时候才把 FreeBSD 2.0 通过网络和 CDROM(在 12 月)发布出来。 尽管系统很多地方还很粗糙,这个版本还是取得了重大的成功, 接下来在 1995 年 6 月发布了更强大和容易安装的 FreeBSD 2.0.5 版本。

  我们于 1996 年 8 月发布了 FreeBSD 2.1.5 版本, 它在 ISP 和商业团体中非常流行。 随后, 2.1-STABLE 分支的另一个版本应运而生,它就是 FreeBSD 2.1.7.1,在 1997 年 2 月发布并停止了 2.1-STABLE 的主流开发。现在,它处于维护状态, 仅仅提供安全性的增强和其他严重的错误修补的维护(RELENG_2_1_0)。

  FreeBSD 2.2 版作为 RELENG_2_2 分支,于 1996 年 11 月从开发主线 (“-CURRENT”)分出来。 它的第一个完整版(2.2.1)于 1997 年 4 月发布出来。 97 年夏秋之间,顺着 2.2 分支的更进一步的版本在开发。 其最后一版(2.2.8)于 1998 年 11 月发布出来。 第一个官方的 3.0 版本出现在 1998 年 10 月, 意味着 2.2 分支结束的开始。

  1999 年 1 月 20 日又出现了新的分支,就是 4.0-CURRENT 和 3.X-STABLE 分支。从 3.X-STABLE 起,3.1 在 1999 年 2 月 15 日发行,3.2 在1999 年 5 月 15 日,3.3 在 1999 年 9 月 16 日,3.4 在 1999 年 12 月 20 日,3.5 在 2000 年 6 月 24 日,接下来几天后发布了很少的修补升级至 3.5.1,加入了对 Kerberos 安全性方面的修补。 这是 3.X 分支最后一个发行版本。

  随后在 2000 年 3 月 13 日出现了一个新的分支, 也就是 4.X-STABLE。 这之后发布了许多的发行版本: 4.0-RELEASE 于 2000 年 3月发布, 而最后的 4.11-RELEASE 则是在 2005 年 1 月发布的。

  期待已久的 5.0-RELEASE 于 2003 年 1 月 19 日正式发布。 这是将近三年的开发的巅峰之作, 同时也标志了 FreeBSD 在先进的多处理器和应用程序线程支持的巨大成就, 并引入了对于 UltraSPARCia64 平台的支持。 之后于 2003 年 6 月发布了 5.1。 最后一个从 -CURRENT 分支的 5.X 版本是 5.2.1-RELEASE, 它在 2004 年 2 月正式发布。

  RELENG_5 于 2004 年 8 月正式创建, 紧随其后的是 5.3-RELEASE, 它是 5-STABLE 分支的标志性发行版。 最新的 6.3-RELEASE 是在 Jan 2008 发布的。 RELENG_5 分支不会有后续的发行版了。

  其后在 2005 年 7 月又建立了 RELENG_6 分支。 而 6.X 分支上的第一个版本, 即 6.0-RELEASE, 则是在 2005 年 11 月发布的。 最新的 7.0-RELEASE 发布于 Feb 2008。 我们还将继续从 RELENG_6 发布新的版本。

  目前, 中长期的开发项目继续在 7.X-CURRENT (主干, trunk) 分支中进行, 而 6.X 的 CDROM (当然, 也包括网络) 快照版本可以在 快照服务器 找到。


1.3.2 FreeBSD 项目目标

Contributed by Jordan Hubbard.

  FreeBSD 项目的目标是无附加条件地提供能够用于任何目的的软件。 我们中的许多人对代码 (以及项目本身) 都有非常大的投入, 因此当然不介意偶尔有一些资金上的补偿, 但我们并没打算坚决地要求得到这类资助。 我们认为我们的首要 “使命” 是为任何人提供代码, 不管他们打算用这些代码做什么, 因为这样代码将能够被更广泛地使用, 从而最大限度地发挥其价值。 我认为这是自由软件最基本的, 同时也是为我们所倡导的一个目标。

  我们源代码树中, 以 GNU 公共许可证 (GPL) 或者 GNU 函数库公共许可证 (LGPL) 发布的那些代码带有少许的附加限制, 还好只是强制性的要求开放代码而不是别的。 由于使用 GPL 的软件在商业用途上会增加若干复杂性, 因此,如果可以选择的话, 我们更偏好使用限制相对更宽松的 BSD 版权来发布软件。


1.3.3 FreeBSD 开发模式

撰写者 Satoshi Asami.

  FreeBSD 的开发是一个非常开放且有有伸缩性的过程, 就像从我们的 贡献者列表里看到的,它是完全由来自全世界的数以百计的贡献者发展起来的。 FreeBSD 的开发基础结构允许数以百计的开发者通过互联网协同工作。 我们也经常关注着那些对我们的计划感兴趣的新开发者和新的创意, 那些有兴趣更进一步参与项目的人只需要在 FreeBSD 技术讨论邮件列表 联系我们。 FreeBSD 公告邮件列表 对那些希望了解我们工作所涉及到哪些领域的人也是有用的。

  无论是独立地工作或者封闭式的团队工作, 了解FreeBSD计划和它的开发过程都是有益的:

CVS 代码库

FreeBSD 的中央源代码树是由 CVS (并行版本控制系统)来维护的。CVS 是一个与 FreeBSD 捆绑的可自由获得的源代码控制工具。 主 CVS 代码库放置在美国加利福尼亚州圣克拉拉的一台机器上, 它被复制到全世界的大量镜像站上。CVS 中包括了 -CURRENT-STABLE 树, 它同样可以很容易地复制到您的机器上。 请查阅 同步您的源代码树这一章节来了解更多信息。

committer 列表

committer 是那些对 CVS 树有权限的人, 他们被授权修改 FreeBSD 的源代码 (术语 “committer” 来自于 cvs(1)commit 命令,这个命令用来把新的修改提交给 CVS 代码库)。提交修正的最好方法是使用 send-pr(1) 命令。如果您发现在系统中出现了一些问题的话, 您也可以通过邮件将它们发送至 FreeBSD committer 的邮件列表。

FreeBSD 核心团队

如果把 FreeBSD 项目看作一家公司,那么 FreeBSD 核心团队就相当于董事会。 核心团队的主要任务是提出总体上的发展计划,然后确定一个正确的方向。 邀请那些富有献身精神和可靠的开发者加入到 committer 队伍中来也是核心团队的工作之一, 这些新的成员将作为新核心团队成员和其他人一起继续前进。 当前的核心团队是 2006 年 7 月从 committer 中选举产生的。选举每两年一次。

一些核心团队的成员还负责特定的责任范围, 也就是说他们必须尽力确保某个子系统能工作正常。 FreeBSD 开发者的完整列表和他们的责任范围,请参见 贡献者列表

注意: 核心团队的大部分成员加入 FreeBSD 开发的时候都是志愿的, 并没有从项目中获得任何财政上的资助, 所以“承诺”不应该被理解为“支持保证”。 前面所述“董事会”的类推并不十分准确, 或许更好的说法是,他们是一群愿意放弃他们的生活, 投身于 FreeBSD 项目而非选择其个人更好的生活的人!

外围贡献者

事实上,最大的开发团队正是为我们提供反馈和错误修补的用户自己。 FreeBSD 的非集中式的开发者保持联系的主要方式就是预订 FreeBSD 技术讨论邮件列表,很多事情在那里讨论。查看附录 C了解众多 FreeBSD 邮件列表的更多信息。

FreeBSD 贡献者列表 很长并在不断增长, 为什么不加入它来为 FreeBSD 做贡献呢?

提供代码不是为这个计划做贡献的唯一方式; 有一个更完整的需要做的事情的列表,可以参见 FreeBSD 项目网站

  总的来说,我们的开发模式好像是一组没有拘束的同心圆。 这种集中式的开发模式,主要是考虑到用户的方便, 同时让他们能很容易地维护同一份软件, 而不会把潜在的贡献者排除在外! 我们的目标是提供一个包含有大量具有一致性 应用程序的稳定的操作系统, 以利于用户的安装和使用,── 这种模式在完成目标的过程中工作得非常有效。

  我们对于那些想要加入,成为FreeBSD开发者的期待是: 具有如同当前其他人一样的投入,来确保持续的成功!


1.3.4 最新的 FreeBSD 发行版本

  FreeBSD 是一个免费使用且带有完整源代码的基于 4.4BSD-Lite 的系统, 它广泛运行于 Intel i386™、i486™、Pentium®、 Pentium Pro、 Celeron®、 Pentium II、 Pentium III、 Pentium 4(或者兼容系统)、 Xeon™、DEC Alpha 和 Sun UltraSPARC 的计算机系统上。 它主要以 加州大学伯克利分校 的 CSRG 研究小组的软件为基础,并加入了 NetBSD、OpenBSD、386BSD 以及来自 自由软件基金会 的一些东西。

  自从 1994 年末我们的 FreeBSD 2.0 发行以来, FreeBSD 的性能,可定制性,稳定性都有了令人注目的提高。 最大的变化是通过 整合虚拟内存/文件系统 中的高速缓存改进的虚拟内存系统, 它不仅提升了性能,而且减少了 FreeBSD 对内存的需要, 使得 5 MB 内存成为可接受的最小配置。 其他的改进包括完整的 NIS 客户端和服务器端的支持, 事务式 TCP 协议支持,按需拨号的 PPP,集成的 DHCP 支持,改进的 SCSI 子系统, ISDN 的支持,ATM,FDDI,快速 Gigabit 以太网(1000 Mbit)支持, 提升了最新的 Adaptec 控制器的支持和修补了很多的错误。

  除了最基本的系统软件,FreeBSD 还提供了一个拥有成千上万广受欢迎的程序组成的软件的 Ports Collection。 到本书付印时,已有超过 18,000 个 ports (ports 包括从 http(WWW) 服务器到游戏、程序设计语言、编辑器以及您能想到的几乎所有的东西)。 完整的 Ports Collection 大约需要 440 MB 的存储空间。所有的只提供对原始代码的 “修正”。这使得我们能够容易地更新软件, 而且减少了老旧的 1.0 Ports Collection 对硬盘空间的浪费。 要编译一个 port,您只要切换到您想要安装的程序的目录, 输入 make install,然后让系统去做剩下的事情。 您要编译的每一个程序完整的原始代码可以从 CDROM 或本地 FTP 获得,所以您只需要编译您想要软件的足够的磁盘空间。 几乎大多数的软件都提供了事先编译好的 “package” 以方便安装,对于那些不希望从源代码编译他们自己的 ports 的人只要使用一个简单的命令 (pkg_add)就可以安装。 有关 package 和 ports 的更多信息可以在第 4 章中找到。

  您可以在最近的 FreeBSD 主机的 /usr/share/doc 目录下找到许多有用的文件来帮助您安装及使用 FreeBSD。 您也可以用一个 HTML 浏览器来查阅本地安装的手册, 使用下面的 URL:

  您也可以查看在 http://www.FreeBSD.org/ 的主站上的副本。


第2章  安装 FreeBSD

结构、组织重整, 部分重写 Jim Mock. sysinstall 操作流程、屏幕抓图以及一般性文件Randy Pratt.

2.1 概述

  FreeBSD 提供了一个以文字为主,简单好用的安装程序,叫做 sysinstall 。这是 FreeBSD 默认使用的安装程序; 厂商如果想,也可以提供适合自己需要的安装程序。本章说明如何使用 sysinstall 来安装 FreeBSD。

  学习完本章之后,您将会知道:

  • 如何制作 FreeBSD 安装磁盘

  • FreeBSD如何参照及分割您的硬盘

  • 如何启动 sysinstall.

  • 在执行 sysinstall 时您将要回答的问题、 问题代表什么意义,以及该如何回答它们。

  在阅读本章之前,您应该:

  • 阅读您要安装的 FreeBSD 版本所附的硬件支持列表以确定您的硬件有没有被支持。

注意: 一般来说,此安装说明是针对 i386 (“PC 兼容机”) 体系结构的电脑。如果有其它体系结构(如Alpha)的安装说明, 我们将一并列出。虽然本文档经常保持更新, 但有可能与您安装版本上所带的说明文档有些许出入。 在这里建议您使用本说明文章作为一般性的安装指导参考手册。


2.2 硬件需求

2.2.1 最小配置

  安装 FreeBSD 所需的最小硬件配置, 随 FreeBSD 版本和硬件架构不同而有所不同。

  关于安装所需的最低硬件配置信息, 可以在 FreeBSD 网站的 发行版信息 部分中的 安装说明书 中找到。在接下来的几节中, 给出了这些信息的一些总结。随您安装 FreeBSD 的方式不同, 可能需要使用软驱或为 FreeBSD 支持的 CDROM 驱动器, 有时候也可能需要的是一块网卡。 这将在 第 2.3.7 节 中进行介绍。


2.2.1.1 FreeBSD/i386 和 FreeBSD/pc98

  FreeBSD/i386 和 FreeBSD/pc98 版本, 都需要 486 或更高的处理器,以及至少 24 MB 的 RAM。 您需要至少 150 MB 的空闲硬盘空间, 才能完成最小的安装配置。

注意: 对于老旧的硬件而言, 多数时候, 装配更多的 RAM 和腾出更多的硬盘空间, 要比使用更快的处理器更有用。


2.2.1.2 FreeBSD/alpha

  要安装 FreeBSD/alpha, 您使用的必须是某种受支持的平台 (参见 第 2.2.2 节) 而且 FreeBSD 必须独占一个硬盘。目前 FreeBSD 还无法与其它操作系统共享磁盘。 这个磁盘必须接在 SRM 固件支持的 SCSI 控制器上,或者如果您机器上的 SRM 支持从 IDE 硬盘启动,则应装到 IDE 硬盘上。

  此外您还需要用于您的平台 SRM 控制台固件。有时,可以在 AlphaBIOS (或 ARC) 固件和 SRM 之间切换。如果没有, 则需要从制造商网站上下载并安装新的固件。

注意: 对于 Alpha 的支持, 从 FreeBSD 7.0 版本开始已经不再提供。 FreeBSD 6.X 系列发行版, 是最后一批支持这种硬件平台的版本。


2.2.1.3 FreeBSD/amd64

  有两类处理器同时能够支持运行 FreeBSD/amd64。 第一种是 AMD64 处理器, 包括 AMD Athlon™64、 AMD Athlon64-FX、 AMD Opteron™ 以及更高级别的处理器。

  能够使用 FreeBSD/amd64 的另一种处理器是包含了采用 Intel® EM64T 架构支持的处理器。 这类处理器包括 Intel Core™ 2 Duo、 Quad、 以及 Extreme 系列处理器, 以及 Intel Xeon 3000、 5000、 和 7000 系列处理器。

  如果您的计算机使用 nVidia nForce3 Pro-150, 则 必须 使用 BIOS 配置, 禁用 IO APIC。 如果您没有找到这样的选项, 可能就只能转而禁用 ACPI 了。 Pro-150 芯片组存在一个 bug, 目前我们还没有找到绕过这一问题的方法。


2.2.1.4 FreeBSD/sparc64

  要安装 FreeBSD/sparc64, 必须使用它支持的平台 (参见 第 2.2.2 节)。

  FreeBSD/sparc64 需要独占一块磁盘。 目前还没有办法与其它操作系统共享一块磁盘。


2.2.2 支持的硬件

  支持的硬件列表, 会作为 FreeBSD 发行版本的 FreeBSD 兼容硬件说明提供。 这个文档通常可以在 CDROM 或 FTP 安装文件的顶级目录找到, 它的名字是 HARDWARE.TXT, 此外, 在 sysinstall 的 documentation 菜单也可以找到。它针对特定的硬件架构列出了 FreeBSD 已知支持的硬件。 不同发行版本和架构上的硬件支持列表,可以在 FreeBSD 网站的 发行版信息 页面上找到。


2.3 安装前的准备工作

2.3.1 列出您电脑的硬件清单

  在安装 FreeBSD 之前,您应该试着将您电脑中的硬件清单列出来。 FreeBSD 安装程序会将这些硬件(磁盘、网卡、光驱等等) 以及型号及制造厂商列出来。FreeBSD 也会尝试为这些设备找出最适当的 IRQ 及 IO 端口的设定。但是因为 PC 的硬件种类实在太过复杂, 这个步骤不一定总是能成功。这时, 您就可能需要手动更改有问题的设备的设定值。

  如果您已经安装了其它的操作系统,如 Windows 或 Linux, 那么您可以先由这些系统所提供的工具来查看您的设备设定值是怎么分配的。 如果您真的没办法确定某些接口卡用什么设定值,那么您可以检查看看, 说不定它的设定已经标示在卡上。常用的 IRQ 号码为 3、5 以及 7; IO 端口的值通常以 16 进制位表示,例如 Ox330。

  我们建议您在安装 FreeBSD 之前把这些信息打印或记录下来,做成表格 的样子也许会比较有帮助,例如:

表 2-1. 硬件设备清单

设备名 IRQ IO 端口号 备注
第一块硬盘 N/A N/A 40 GB,Seagate 制造,第一个 IDE 接口主设备
CDROM N/A N/A 第一个 IDE 接口从设备
第二块硬盘 N/A N/A 20 GB,IBM 制造, 第二个 IDE 接口主设备
第一个 IDE 控制器 14 0x1f0  
网卡 N/A N/A Intel 10/100
Modem N/A N/A 3Com® 56K faxmodem,位于 COM1 口
...      

  在清楚地了解了您计算机的配置之后, 需要检查它是否符合您希望安装的 FreeBSD 版本的硬件需求。


2.3.2 备份您的数据

  如果您的电脑上面存有重要的数据资料, 那么在安装 FreeBSD 前请确定您已经将这些资料备份了, 并且先测试这些备份文档是否有问题。FreeBSD 安装程序在要写入任何资料到您的硬盘前都会先提醒您确认, 一旦您确定要写入,那么以后就没有反悔的机会。


2.3.3 决定要将 FreeBSD 安装到哪里

  如果您想让 FreeBSD 使用整个硬盘,那么请直接跳到下一节。

  但是,如果您想让 FreeBSD 跟您已有的系统并存, 那么您必须对您数据存在硬盘的分布方式有深入的了解, 以及其所造成的影响。


2.3.3.1 FreeBSD/i386 体系结构的硬盘分配方式

  一个 PC 硬盘可以被细分为许多块。 这些块被称为 partitions (分区)。 由于 FreeBSD 内部也有分区的概念,如此命名很容易导致混淆, 因此我们在 FreeBSD 中,将其称为磁盘 slice,或简称为 slices。 例如, FreeBSD 提供的用于操作 PC 磁盘分区的工具 fdisk 就将其称为 slice 而不是 partition。 由于设计的原因, 每个硬盘仅支持四个分区; 这些分区叫做 主分区(Primary partion)。 为了突破这个限制以便能使用更多的分区,就有了新的分区类型,叫做 扩展分区(Extended partition)。 一个硬盘可以拥有一个扩展分区。在扩展分区里可以建立许多个所谓的 逻辑分区(Logical partitions)

  每个分区都有其独立的 分区号(partition ID), 用以区分每个分区的数据类型。FreeBSD 分区的分区号为 165

  一般而言,每种操作系统都会有自己独特的方式来区别分区。 例如 DOS 及其之后的 Windows, 会分配给每个主分区及逻辑分区一个 驱动器字符, 从 C: 开始。

  FreeBSD 必须安装在主分区。FreeBSD 可以在这个分区上面存放系统数据或是您建立的任何文件。 然而,如果您有多个硬盘,您也可以在这些硬盘上(全部或部分)建立 FreeBSD 分区。在您安装 FreeBSD 的时候,必须要有一个分区可以给 FreeBSD 使用。 这个分区可以是尚未规划的分区, 或是已经存在且存有数据但您不再需要的分区。

  如果您已经用完了您硬盘上的所有分区, 那么您必须使用其它操作系统所提供的工具 (如 DOS 或 Windows 下的 fdisk) 来腾出一个分区给 FreeBSD 使用。

  如果您的某个分区有多余的空间,您可以使用它。 但是使用前您需要先整理一下这些分区。

  FreeBSD 最小安装需要约 100 MB 的空间,但是这仅是 非常 基本的安装, 几乎没有剩下多少空间可以建立您自己的文件。一个较理想的最小安装是 250 MB,不含图形界面;或是 350 MB 以上,包含图形界面。 如果您还需要安装其它的第三方厂商的套件, 那么将需要更多的硬盘空间。

  您可以使用商业软件,例如 PartitionMagic® (硬盘分区魔术师) 或类似 GParted 这样的免费工具来调整分区尺寸,为 FreeBSD 腾出空间。 FreeBSD 光盘的 tools 目录包含两个免费的工具也可以完成这个工作: FIPS 以及 PResizer,它们的文档可以在同一目录中找到。 FIPSPResizer, 和 PartitionMagic 能够改变 FAT16 以及 FAT32 分区的大小 ── 它们可以在 MS-DOS 以及 Windows ME 系统中使用。 这些工具的说明文件可以在同一个目录下面找到。 PartitionMagicGParted 都能改变 NTFS 分区的尺寸。 GParted 在许多 Live CD Linux 发行版, 如 SystemRescueCD 中均有提供。

  目前已经有报告显示改变 Microsoft Vista 分区尺寸时会出现问题。 在进行此类操作时, 建议您准备一张 Vista 安装 CDROM。如同其他的磁盘维护操作一样, 强烈建议您事先进行备份。

警告: 不当的使用这些工具可能会删掉您硬盘上的数据资料! 在使用这些工具前确定您有最近的、没问题的备份数据。

例 2-1. 使用已存在的分区

假设您只有一个 4GB 的硬盘,而且已经装了 Windows 然后您将这个硬盘分成两个分区 C:D:,每个分区大小为 2 GB。在 C: 分区上存放有 1 GB 的数据、 D:分区上存放 0.5 GB 的数据。

这意味着您的盘上有两个分区,一个驱动器符号是一个分区 (如 c:、d:)。 您可以把所有存放在 D: 分区上的数据复制到 C: 分区, 这样就空出了一个分区(d:)给 FreeBSD 使用。

例 2-2. 缩减已现在的分区

假设您只有一个 4 GB 的硬盘,而且已经装了 Windows。 您在安装 Windows 的时候把 4 GB 都给了 C: 分区,并且已经使用了 1.5 GB 的空间。您想将剩余空间中的 2 GB 给 FreeBSD 使用。

为了安装 FreeBSD,您必须从下面两种方式中选择一种:

  1. 备份 Windows 的数据资料,然后重新安装 Windows, 并给 Windows 分配 2 GB 的空间。

  2. 使用上面提及的 PartitionMagic 来整理或切割您的分区。


2.3.3.2 Alpha 体系结构的硬盘分配方式

  在 Alpha 上,您必须使用一整颗硬盘给 FreeBSD, 没有办法在同一个硬盘上跟其它操作系统共存。 根据不同的 Alpha 机器,您的硬盘可以是 SCSI 或 IDE 硬盘, 只要您的机器可以从这些硬盘开机就可以。

  按照 Digital/Compaq 使用手册书写的惯例, 所有 SRM 输入的部分都用大写表示。 注意,SRM 大小写有别。

  要想得知您硬盘的名称以及型号, 可以在 SRM console 提示符下使用 SHOW DEVICE 命令:

>>>SHOW DEVICE
dka0.0.0.4.0               DKA0           TOSHIBA CD-ROM XM-57  3476
dkc0.0.0.1009.0            DKC0                       RZ1BB-BS  0658
dkc100.1.0.1009.0          DKC100             SEAGATE ST34501W  0015
dva0.0.0.0.1               DVA0
ewa0.0.0.3.0               EWA0              00-00-F8-75-6D-01
pkc0.7.0.1009.0            PKC0                  SCSI Bus ID 7  5.27
pqa0.0.0.4.0               PQA0                       PCI EIDE
pqb0.0.1.4.0               PQB0                       PCI EIDE

  此范例使用 Digital Personal Workstation 433au 并且显示出此机器联接有三个硬盘。第一个是 CDROM,叫做 DKA0;另外两个是两个硬盘,分别叫做 DKC0DKC100

  硬盘名称中有 DKx 字样的是 SCSI 硬盘。 例如 DKA100 表示是一个 SCSI 设备, 其 SCSI ID 为 1,位于第一个 SCSI 接口 (A)。 DKC300 表示一个 SCSI 硬盘, SCSI ID 为 3,位于第三个 SCSI 接口 (C)。设备名称 PKx 表示 SCSI 控制卡。由以上 SHOW DEVICE 指令的输出结果看来, SCSI 光盘也被视为是 SCSI 硬盘的一种。

  IDE 硬盘的名称类似 DQx,而 PQx 则表示相对应的硬盘控制器。


2.3.4 收集您的网络配置相关资料

  如果您想通过网络(FTP 或是 NFS)安装 FreeBSD, 那么您就必须知道您的网络配置信息。在安装 FreeBSD 的过程中将会提示您输入这些资料,以顺利完成安装过程。


2.3.4.1 使用以太网或电缆/DSL Modem

  如果您通过局域网或是要通过网卡使用电缆/DSL 上网, 那么您必须准备下面的信息:

  1. IP 地址。

  2. 默认网关 IP 地址。

  3. 主机名称。

  4. DNS 服务器的 IP 地址。

  5. 子网掩码。

  如果您不知道这些信息, 您可以询问系统管理员或是您的网络服务提供者。 他们可能会说这些信息会由 DHCP 自动分配;如果这样的话,请记住这一点就可以了。


2.3.4.2 使用 Modem 连接

  如果您由 ISP 提供的拨号服务上网,您仍然可以通过它安装 FreeBSD,只是会需要很长的时间。

  您必须知道:

  1. 拨号到 ISP 的电话号码。

  2. 您的 modem 是连接到哪个 COM 端口。

  3. 您拨号到 ISP 所用的账号和密码。


2.3.5 检查 FreeBSD 发行勘误

  虽然我们尽力确保每个 FreeBSD 发行版本的稳定性, 但偶尔也会有一些错误进入发行版。极少数情况下, 这些问题甚至可能会影响安装。 当发现和修正问题之后,它们会列在 FreeBSD 网站中的 FreeBSD 发行勘误 中。 在您安装之前,应该首先看一看这份勘误表,以了解可能存在的问题。

  关于所有释出版本的信息,包括勘误表,可以在 FreeBSD 网站发行版信息 一节中找到。


2.3.6 准备安装介质

  FreeBSD 可以通过下面任何一种安装介质进行安装:

安装介质

  • CDROM 或 DVD

  • 在同一计算机上的 DOS 分区

  • SCSI 或 QIC 磁带

  • 软盘

网络

  • 通过防火墙的一个 FTP 站点,或使用 HTTP 代理。

  • NFS 服务器

  • 一个指定的并行或串行接口

  如果您购买了 FreeBSD 的 CD 或 DVD,那么您可以直接进入下一节 第 2.3.7 节

  如果您还没有 FreeBSD 的安装文件,您应该回到 第 2.13 节 一节, 它介绍了如何准备所需要的安装介质。之后,您就可以回到这一节, 并从 第 2.3.7 节 继续。


2.3.7 准备引导介质

  FreeBSD 的安装过程开始于将您的电脑开机进入 FreeBSD 安装环境 ── -并非在其它的操作系统上运行一个程序。 计算机通常使用安装在硬盘上的操作系统进行引导, 也可以配置成使用一张“bootable(可引导)”的软盘进行启动。 大多数现代计算机都可以从光驱进行引导系统。

提示: 如果您有 FreeBSD 的安装光盘或 DVD(或者是您购买的, 或者是您自己准备的。)并且您的计算机可以从光驱进行启动 (通常在 BIOS 中会有 “Boot Order” 或类似的选项可以设置),那么您就可以跳过此小节。 因为 FreeBSD 光盘及 DVD 光盘都是可以引导的, 用它们开机您不用做什么特别的准备。

  一般来说,要建立安装盘(软盘)请依照下列步骤:

  1. 获取开机软盘映像文件

    开机软盘映像文件可以在您的安装介质的 floppies/ 目录下找到, 另外您也可以从下述网站的 floppies 目录下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/<架构名>/<版本>-RELEASE/floppies/. 将 <架构名><版本> 替换为您使用的计算机体系结构和希望安装的版本号。 例如,用于安装 i386 上的 FreeBSD/i386 7.0-RELEASE 的文件的地址, 应该是 ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/7.0-RELEASE/floppies/

    软盘映像文件的扩展名是 .flp。 在 floppies/ 目录中包括了许多不同的映像文件, 随您安装的 FreeBSD 版本, 某些时候也随硬件的不同, 您需要使用的映像文件可能会有所不同。 您通常会需要四张软盘, 即 boot.flpkern1.flpkern2.flp, 以及 kern3.flp。 请查阅同一目录下的 README.TXT 文件以了解关于这些映像文件的最新信息。

    重要: 您的 FTP 程序必须使用 二进制模式 来下载这些映 像文件。有些浏览器只会用 text (或ASCII ) 模式来传输数据, 用这些浏览器下载的映像文件做成的软盘将无法正常开机。

  2. 准备软盘

    您必须为您下载的每一个映像文件准备一张软盘。 并且请避免使用到坏掉的软盘。 最简单的方式就是您先将这些软盘格式化, 不要相信所谓的已格式化的软盘。在 Windows 下的格式化程序不会告诉您出现多少坏块, 它只是简单的标记它们为 “bad” 并且忽略它们。 根据建议您应该使用全新的软盘来存放安装程序。

    重要: 如果您在安装 FreeBSD 的过程中造成当机、 冻结或是其它怪异现象,第一个要怀疑的就是引导软盘。 请用其它的软盘制作映像文件再试试看。

  3. 将映像文件写入软盘中

    .flp 文件 并非 一般的文件,您不能直接将它们复制到软盘上。 事实上它是一张包含完整磁盘内容的映像文件。这表示您 不能 简单的使用 DOS 的 copy 命令将文件写到软盘上, 而必须使用特别的工具程序将映像文件直接写到软盘中。

    如果您使用 MS-DOSWindows 操作系统来制作引导盘, 那么您可以使用我们提供的 fdimage 程序来将映像文件写到软盘中。

    如果您使用的是光盘,假设光盘的驱动器符号为 E:,那么请执行下面的命令:

    E:\> tools\fdimage floppies\boot.flp A:
    

    重复上述命令以完成每个 .flp 文件的写入, 每换一个映像文件都必须更换软盘; 制作好的软盘请注明是使用哪个映像文件做的。 如果您的映像文件存放在不同的地方,请自行修改上面的指令指向您存放 .flp 文件的地方。要是您没有 FreeBSD 光盘, 您可以到 FreeBSD 的 FTP 站点 tools目录 中下载。

    如果您在 UNIX 系统上制作软盘(例如其它 FreeBSD 机器), 您可以使用 dd(1) 命令来将映像文件写到软盘中。 如果您用 FreeBSD,可以执行下面的命令:

    # dd if=boot.flp of=/dev/fd0
    

    在 FreeBSD 中,/dev/fd0 指的是第一个软驱(即 A: 驱动器); /dev/fd1B: 驱动器,依此类推。其它的 UNIX 系统可能会用不同的的名称, 这时您就要查阅该系统的说明文件。

  您现在可以安装 FreeBSD 了


2.4 开始安装

重要: 默认情况下, 安装过程并不会改变任何您硬盘中的数据, 除非您看到下面的讯息:

Last Chance: Are you SURE you want continue the installation?

If you're running this on a disk with data you wish to save then WE
STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!

We can take no responsibility for lost disk contents!

在看到这最后的警告讯息前您都可以随时离开, 安装程序界面不会变更您的硬盘。如果您发现有任何设定错误, 这时您可以直接将电源关掉而不会造成任何伤害。


2.4.1 开机启动

2.4.1.1 引导 i386™ 系统

  1. 从电脑尚未开机开始说起

  2. 将电脑电源打开。刚开始的时候它应该会显示进入系统设置菜单或 BIOS 要按哪个键,常见的是 F2F10DelAlt+S。不论是要按哪个键,请按它进入 BIOS 设置画面。 有时您的计算机可能会显示一个图形画面,典型的做法是按 Esc 将关掉这个图形画面, 以使您能够看到必要的设置信息。

  3. 找到设置开机顺序的选项,它的标记为 “Boot Order” 通常会列出一些设备让您选择,例如:FloppyCDROMFirst Hard Disk 等等。

    如果您要用软盘安装,请确定选到 floppy disk; 如果您要用光盘安装,请选择 CDROM。为了避免疑惑, 请参考您的主板说明手册。

    储存设定并离开,系统应该会重新启动。

  4. 如果您用软盘安装,请将在 第 2.3.7 节 一节中制作好的第一张引导盘,里面包含kern.flp boot.flp 文件的那张盘, 放入软盘驱动器中。

    如果您是从光盘安装, 那么开机后请将 FreeBSD 光盘放入光驱中。

    如果您开机后如往常一样并没有从软盘或光盘引导,请检查:

    1. 是不是软盘或光盘太晚放入面错失开机引导时间。 如果是, 请将它们放入后重新开机。

    2. BIOS 设定不对,请重新检查 BIOS 的设定。

    3. 您的 BIOS 不支持从这些安装介质引导。

  5. FreeBSD 即将启动。如果您是从光盘引导, 您会见到类似下面的画面:

    Booting from CD-Rom...
    CD Loader 1.2
    
    Building the boot loader arguments
    Looking up /BOOT/LOADER... Found
    Relocating the loader and the BTX
    Starting the BTX loader
    
    BTX loader 1.00 BTX version is 1.01
    Console: internal video/keyboard
    BIOS CD is cd0
    BIOS drive C: is disk0
    BIOS drive D: is disk1
    BIOS 639kB/261120kB available memory
    
    FreeBSD/i386 bootstrap loader, Revision 1.1
    
    Loading /boot/defaults/loader.conf
    /boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d]
    \
    

    如果您从软盘启动, 则应看到类似下面的画面:

    Booting from Floppy...
    Uncompressing ... done
    
    BTX loader 1.00  BTX version is 1.01
    Console: internal video/keyboard
    BIOS drive A: is disk0
    BIOS drive C: is disk1
    BIOS 639kB/261120kB available memory
    
    FreeBSD/i386 bootstrap loader, Revision 1.1
    
    Loading /boot/defaults/loader.conf
    /kernel text=0x277391 data=0x3268c+0x332a8 |
    
    Insert disk labelled "Kernel floppy 1" and press any key...
    

    请根据提示将 boot.flp 软盘取出, 插入 kern1.flp 这张盘, 然后按 Enter。 您只需从第一张软盘启动, 然后再需要时根据提示插入其他软盘就可以了。

  6. 不论是从软盘或光盘引导, 接下来都会进入 FreeBSD 引导加载器菜单:

    图 2-1. FreeBSD Boot Loader Menu

    您可以等待十秒, 或按 Enter


2.4.1.2 引导 Alpha 系统

  1. 从电脑尚未打开电源开始。

  2. 打开电脑电源并等待屏幕上出现开机提示信息。

  3. 如您需要制作用于安装的软盘,请参考 第 2.3.7 节, 将其中一张制作为第一片引导盘,其中包含 boot.flp。将这张软盘插进软驱, 并输入下列命令,以便从软盘启动 (请视实际情况修改命令中的软驱盘符):

    >>>BOOT DVA0 -FLAGS '' -FILE ''
    

    如果您要从光盘引导, 请将光盘放入光驱中然后输入下列命令开始安装 (请视情况修改命令中的光驱盘符):

    >>>BOOT DKA0 -FLAGS '' -FILE ''
    
  4. 然后 FreeBSD 就会启动。如果您从软盘引导, 到某个阶段您会看到下面的信息:

    Insert disk labelled "Kernel floppy 1" and press any key...
    

    此时应按照提示取出 boot.flp 软盘, 换上 kern1.flp 软盘, 然后按 Enter 键。

  5. 不论从软盘或光盘引导,您都会看到下面这段信息:

    Hit [Enter] to boot immediately, or any other key for command prompt.
    Booting [kernel] in 9 seconds... _
    

    您可以等待 10 秒或是按 Enter 跳过。 之后就会进入内核设定菜单。


2.4.1.3 引导 Sparc64®

  多数 Sparc64® 系统均配置为从硬盘自动引导。 如果希望安装 FreeBSD,就需要从网络或 CDROM 启动了, 这需要首先进入 PROM (OpenFirmware)。

  要完成这项工作,首先需要重启系统,并等待出现引导消息。 具体的信息取决于您使用的型号,不过它应该会是类似下面这样:

Sun Blade 100 (UltraSPARC-IIe), Keyboard Present
Copyright 1998-2001 Sun Microsystems, Inc.  All rights reserved.
OpenBoot 4.2, 128 MB memory installed, Serial #51090132.
Ethernet address 0:3:ba:b:92:d4, Host ID: 830b92d4.

  如果您的系统此时开始了从硬盘引导的过程,则需要按下 L1+AStop+A, 或者在串口控制台上发送 BREAK (例如, 在 tip(1)cu(1) 中是 ~#) 以便进入 PROM 提示符。 它应该是类似下面这样:

ok         (1)
ok {0}     (2)
(1)
这是在只有一颗 CPU 的系统上的提示。
(2)
这是用于 SMP 系统的选项, 这里的数字, 是系统中可用的 CPU 数量。

  这时, 将 CDROM 插入驱动器, 并在 PROM 提示符后面, 输入 boot cdrom


2.4.2 查看设备探测的结果

  前面屏幕显示的最后几百行字会存在缓冲区中以便您查阅。

  要浏览缓冲区,您可以按下 Scroll Lock 键, 这会开启画面的卷动功能。然后您就可以使用方向键或 PageUpPageDown 键来上下翻阅。 再按一次 Scroll Lock 键将停止画面卷动。

  在您浏览的时候会看到类似 图 2-2的画面。 真正的结果依照您的电脑装置而有所不同。

图 2-2. 典型的设备探测结果

avail memory = 253050880 (247120K bytes)
Preloaded elf kernel "kernel" at 0xc0817000.
Preloaded mfs_root "/mfsroot" at 0xc0817084.
md0: Preloaded image </mfsroot> 4423680 bytes at 0xc03ddcd4

md1: Malloc disk
Using $PIR table, 4 entries at 0xc00fde60
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
pcib1:<VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
isa0: <iSA bus> on isab0
atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0 <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci
0
usb0: <VIA 83572 USB controller> on uhci0
usb0: USB revision 1.0
uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr1
uhub0: 2 ports with 2 removable, self powered
pci0: <unknown card> (vendor=0x1106, dev=0x3040) at 7.3
dc0: <ADMtek AN985 10/100BaseTX> port 0xe800-0xe8ff mem 0xdb000000-0xeb0003ff ir
q 11 at device 8.0 on pci0
dc0: Ethernet address: 00:04:5a:74:6b:b5
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xec00-0xec1f irq 9 at device 10.
0 on pci0
ed0 address 52:54:05:de:73:1b, type NE2000 (16 bit)
isa0: too many dependant configs (8)
isa0: unexpected small tag 14
orm0: <Option ROM> at iomem 0xc0000-0xc7fff on isa0
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5'' drive> on fdc0 drive 0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model Generic PS/@ mouse, device ID 0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
pppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/15 bytes threshold
plip0: <PLIP network interface> on ppbus0
ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master UDMA33
acd0: CD-RW <LITE-ON LTR-1210B> at ata1-slave PIO4
Mounting root from ufs:/dev/md0c
/stand/sysinstall running as init on vty0

  请仔细检查探测结果以确定 FreeBSD 找到所有您期望出现的设备。 如果系统没有找到设备, 则不会将其列出。 定制内核 能够让您为系统添加默认的 GENERIC 内核所不支持的设备, 如声卡等。

  在 FreeBSD 6.2 和更高版本中, 在探测完系统设备之后, 将显示 图 2-3。 请使用光标键来选择国家或地区。 接着按 Enter, 系统将自动设置地区及键盘映射。 您也可以很容易地退出 sysinstall 程序并从头来过。

图 2-3. 选择国家及地区菜单

图 2-4. 选择离开 Sysinstall

  在主界面使用方向键选择 Exit Install 您会看到 如下的信息:

                      User Confirmation Requested 
         Are you sure you wish to exit? The system will reboot 
           (be sure to remove any floppies/CDs/DVDs from the drives).

                            [ Yes ]    No

  如果 CDROM 还留在光驱里,而且选择了 [ Yes ], 则安装程序将重新启动。

  如果您是从软盘启动, 则在重启系统之前, 需要将 boot.flp 软盘取出。


2.5 介绍 Sysinstall

  sysinstall 是 FreeBSD 项目所提供的安装程序。它以 console(控制台)为主, 分为多个菜单及画面让您配置及控制安装过程。

  sysinstall 菜单画面由方向键、 EnterTabSpace, 以及其它按键所控制。在主画面的 Usage 菜单有这些按键的说明。

  要查看这些说明,请将光标移到 Usage 项目,然后 [Select] 按键被选择, 图 2-5,然后按下 Enter 键。

  安装画面的使用说明会显示出来,阅读完毕请按 Enter 键回到主画面。

图 2-5. 选取 Sysinstall 主菜单的 Usage 项目


2.5.1 选择 Documentation(说明文件) 菜单

  用方向键从主菜单选择 Doc 条目然后按 Enter键。

图 2-6. 选择说明文件菜单

  这将会进入说明文件菜单。

图 2-7. Sysinstall 说明文件菜单

  阅读这些说明文件很重要。

  要阅读一篇文章,请用方向键选取要阅读的文章然后按 Enter 键。阅读中再按一下 Enter 就会回到说明文件画面。

  若要回到主菜单,用方向键选择 Exit 然后按下 Enter 键。


2.5.2 选择键盘对应(Keymap)菜单

  如果要改变键盘按键的对应方式, 请在主菜单选取 Keymap 然后按 Enter 键。一般情况下不改变此项, 除非您使用了非标准键盘或非美国键盘。

图 2-8. Sysinstall 主菜单

  您可以使用上下键移动到您想使用的键盘对应方式, 然后按下 Space 键以选取它;再按 Space 键可以取消选取。当您完成后, 请选择 [ OK ] 然后按 Enter 键。

  这一屏幕只显示出部分列表。选择 [ Cancel ]Tab 键将使用默认的键盘对应, 并返回到主菜单

图 2-9. Sysinstall 键盘对应菜单


2.5.3 安装选项设置画面

  选择 Options 然后按 Enter 键。

图 2-10. Sysinstall 主菜单

图 2-11. Sysinstall 选项设置

  预设值通常可以适用于大部分的使用者,您并不需要改变它们。 版本名称要根据安装的版本进行变化。

  目前选择项目的描述会在屏幕下方以蓝底白字显示。 注意其中有一个项目是 Use Defaults(使用默认值) 您可以由此项将所有的设定还原为预设值。

  可以按下 F1 来阅读各选项的说明。

  按 Q 键可以回到主画面。


2.5.4 开始进行标准安装

  Standard(标准) 安装适用于那些 UNIX 或 FreeBSD 的初级使用者。用方向键选择 Standard 然后按 Enter 键可开始进入标准安装。

图 2-12. 开始进行标准安装


2.6 分配磁盘空间

  您的第一个工作就是要分配 FreeBSD 用的硬盘空间以便 sysinstall 先做好一些准备。 为了完成这个工作,您必须先对 FreeBSD 如何找到磁盘信息做一个了解。


2.6.1 BIOS 磁盘编号

  当您在系统上安装配置 FreeBSD 之前, 有一个重要的事情一定要注意,尤其是当您有多个硬盘的时候。

  在 pc 架构,当您跑像 MS-DOSMicrosoft Windows 这种跟 BIOS 相关的操作系统的时候,BIOS 有能力改变正常的磁盘顺序, 然后这些操作系统会跟着 BIOS 做改变。这让使用者不一定非要有所谓的 “primary master” 硬盘开机。 许多人发现最简单而便宜备份系统的方式就是再去买一块一模一样的硬盘, 然后定期将数据从第一块硬盘复制到第二个硬盘,使用 Ghost®XCOPY。所以,当第一个硬盘死了, 或者是被病毒破坏,或者有坏轨道, 他们可以调整 BIOS 中的开机顺序而直接用第二块硬盘开机。 就像交换硬盘的数据线,但是无需打开机箱。

  比较昂贵,配有 SCSI 控制卡的系统通常可以延伸 BIOS 的功能来让 SCSI 设备 (可达七个) 达到类似改变顺序的功能。

  习惯于使用这种方式的使用者可能会感到惊讶, 因为在 FreeBSD 中并非如此。FreeBSD 不会参考 BIOS, 而且也不知道所谓的 “BIOS 逻辑磁盘对应” 是怎么回事。这会让人感觉很疑惑, 明明就是一样的硬盘而且资料也完全从另一块复制过来的, 结果却没办法像以前那样用。

  当使用 FreeBSD 以前,请将 BIOS 中的硬盘开机顺序调回正常的顺序, 并且以后不要再改变。 如果一定要交换硬盘顺序, 那请用硬件的方式, 打开机箱并调整调线。


2.6.2 使用 FDisk 创建分区

注意: 如果不再做改变,数据将会写进硬盘。如果您犯了一个错误想重新开始, 请选择 sysinstall 安装程序的退出按钮(exit)。或按 U 键来 Undo 操作。 如果您的操作没有结果, 您总可以重新启动您的计算机来达到您的目的。

  当您在 sysinstall 主菜单选择使用标准安装后,您会看到下面的信息:

                                 Message
 In the next menu, you will need to set up a DOS-style ("fdisk")
 partitioning scheme for your hard disk. If you simply wish to devote
 all disk space to FreeBSD (overwriting anything else that might be on
 the disk(s) selected) then use the (A)ll command to select the default
 partitioning scheme followed by a (Q)uit. If you wish to allocate only
 free space to FreeBSD, move to a partition marked "unused" and use the
 (C)reate command.
                                [  OK  ]

                      [ Press enter or space ]

  如屏幕指示,按 Enter 键, 然后您就会看到一个列表列出所有在探测设备的时候找到的硬盘。 图 2-13 范例显示的是有找到两个 IDE 硬盘的情形,这两个硬盘分别为 ad0ad2

图 2-13. 选择要分区的硬盘

  您可能正在奇怪,为什么 ad1 没有列出来? 为什么遗失了呢?

  试想,如果您有两个 IDE 硬盘,一个是在第一个 Primary master, 一个是 Secondary master,这样会发生什么事呢? 如果 FreeBSD 依照找到的顺序来为他们命名,如 ad0ad1 那么就不会有什么问题。

  但是,现在问题来了。如果您现在想在 primary slave 加装第三个硬盘, 那么这个硬盘的名称就会是 ad1,之前的 ad1 就会变成 ad2。 这会造成什么问题呢?因为设备的名称 (如 ad1s1a)是用来寻找文件系统的, 因此您可能会发现,突然,您有些文件系统从此无法正确地显示出来, 必须修改 FreeBSD 配置文件(译注:/etc/fstab)才可以正确显示。

  为了解决这些问题,在配置内核的时候可以叫 FreeBSD 直接用 IDE 设备所在的位置来命名,而不是依据找到的顺序。使用这种方式的话, 在 secondary master 的 IDE 设备就 永远是 ad2,即使您的系统中没有 ad0ad1 也不受影响。

  此为 FreeBSD 内核的默认值,这也是为什么上面的画面只显示 ad0ad2 的原因。 画面上这台机器的两颗硬盘是装在 primary 及 secondary 的 master 上面; 并没有任何一个硬盘安装在 slave 插槽上。

  您应该选择您想安装 FreeBSD 的硬盘,然后按下 [ OK ]。之后 FDisk 就会开始,您会看到类似 图 2-14的画面。

  FDisk 的显示画面分为三个部分。

  第一部分是画面上最上面两行,显示的是目前所选择的硬盘的信息。 包含它的 FreeBSD 名称、硬盘分布以及硬盘的总容量。

  第二部分显示的是目前选择的硬盘上有哪些分区, 每个分区的开始及结束位置、所占容量、FreeBSD 名称、 它们的描述以及类别(sub-type)。此范例显示有两个未使用的小分区, 还有一个大的 FAT 分区, (很可能是 MS-DOSWindowsC: ), 以及一个扩展分区(在 MS-DOSWindows 里面还可以包含逻辑分区)。

  第三个部分显示 FDisk 中可用的命令。

图 2-14. 典型的尚未编辑前的 Fdisk 分区表

  接下来要做的事跟您要怎么给您的硬盘分区有关。

  如果您要让 FreeBSD 使用整个硬盘(稍后您确认要 sysinstall 继续安装后会删除所有这个硬盘上的资料),那么您就可以按 A 键(Use Entire Disk ) 目前已有的分区都会被删除,取而代之的是一个小的,标示为 unused 的分区,以及一个大的 FreeBSD 分区。之后, 请用方向键将光标移到这个 FreeBSD 分区,然后按 S 以将此分区标记为启动分区。 您会看到类似 图 2-15 的画面。注意,在 Flags 栏中的 A 记号表示此分区是 激活 的, 因而启动将从此分区进行。

  要删除现有的分区以便为 FreeBSD 腾出空间, 您可以将光标移动到要删除的分区后按 D 键。 然后就可按 C 键, 并在弹出的对话框中输入将要创建的分区的大小。 输入合适的大小后按 Enter 键。 一般而言, 这个对话框中的初始值是可以分配给该分区的最大值。 它可能是最大的邻接分区或未分配的整个硬盘大小。

  如果您已经建立好给 FreeBSD 的分区 (使用像 PartitionMagic类似的工具), 那么您可以按下 C 键来建立一个新的分区。同样的, 会有对话框询问您要建立的分区的大小。

图 2-15. Fdisk 分区使用整个硬盘

  完成后,按 Q 键。您的变更会存在 sysinstall 中, 但是还不会真正写入您的硬盘。


2.6.3 安装多重引导

  在这步骤您可以选择要不要安装一个多重引导管理器。 一般而言,如果碰到下列的情形, 您应该选择要安装多重引导管理程序。

  • 您有一个以上的硬盘,并且 FreeBSD 并不是安装在第一个硬盘上。

  • 除了 FreeBSD,您还有其它的操作系统安装在同一块硬盘上, 所以您需要在开机的时候选择要进入哪一个系统。

  如果您在这台机器上只安装一个 FreeBSD 操作系统, 并且安装在第一个硬盘, 那么选择 Standard 安装就可以了。如果您已经使用了一个第三方的多重引导程序, 那么请选择 None

  选择好配置后请按 Enter

图 2-16. Sysinstall 多重引导管理程序

  按下 F1 键所显示的在线说明中有讨论一些操作系统共存可能发生的问题。


2.6.4 在其它硬盘上创建分区

  如果您的系统上有一个以上的硬盘, 在选择完多重引导管理程序后会再回到选择硬盘的画面。 如果您要将 FreeBSD 安装在多个硬盘上,那么您可以在这里选择其它的硬盘, 然后重复使用 FDisk 来建立分区。

重要: 如果您想让 FreeBSD 来管理其它的硬盘, 那么两个硬盘都必须安装 FreeBSD 的多重引导管理程序。

图 2-17. 离开选择硬盘画面

  Tab 键可以在您最后选择的硬盘、 [ OK ] 以及 [ Cancel ] 之间进行切换。

  用 Tab 键将光标移动到 [ OK ] 然后按 Enter 键继续安装过程。


2.6.5 使用 bsdlabel 创建分区

  您现在必须在刚刚建立好的 slice 中规划一些 label。 请注意,每个 label 的代号是 ah,另外,习惯上 bcd 是有特殊用途的,不应该随意变动。

  某些应用程序可以利用一些特殊的分区而达到较好的效果, 尤其是分区分散在不同的硬盘的时候。但是,现在您是第一次安装FreeBSD, 所以不需要去烦恼如何分割您的硬盘。最重要的是, 装好FreeBSD然后学习如何使用它。当您对FreeBSD有相当程度的熟悉后, 您可以随时重新安装FreeBSD,然后改变您分区的方式。

  下面的范例中有四个分区 ── 一个是磁盘交换分区,另外三个是文件系统。

表 2-2. 为第一个硬盘分区

分区 文件系统 大小 描述
a / 512 MB 这是一个根文件系统(root filesystem)。 任何其它的文件系统都会 挂在根目录(译注:用根目录比较亲切) 下面。 512 MB 对于此目录来说是合理的大小, 因为您往后并不会在这里存放太多的数据; 在安装 FreeBSD 后会用掉约 128 MB 的根目录空间。 剩下的空间是用来存放临时文件用的,同时, 您也应该预留一些空间,因为以后的FreeBSD版本可能会需要较多的 /(根目录)空间。
b N/A 2-3 x RAM

b 分区为系统磁盘交换分区 (swap space)。选择正确的交换空间大小可是一门学问唷。 一般来说,交换空间的大小应该是您系统上内存(RAM) 大小的2到3倍。 交换空间至少要有 64 MB。因此, 如果您的电脑上的 RAM 比 32 MB 小, 请将交换空间大小设为 64 MB。

如果您有一个以上的硬盘, 您可以在每个硬盘上都配置交换分区。FreeBSD 会利用每个硬盘上的交换空间,这样做能够提高 swap 的性能。 如果是这种情形, 先算出您总共需要的交换空间大小 (如128 MB),然后除以您拥有的硬盘数目(如2块), 算出的结果就是每个硬盘上要配置的交换空间的大小。 在这个例子中, 每个硬盘的交换空间为 64 MB。

e /var 256 MB 至 1024 MB /var 目录会存放不同长度的文件、 日志以及其它管理用途的文件。大部分这些文件都是 FreeBSD 每天在运行的时候会读取或是写入的。 当这些文件放在另外的文件系统(译注:即/var) 可以避免影响到其它目录下面类似的文件存取机制。
f /usr 剩下的硬盘空间 (至少 2 GB) 您所有的其它的文件通常都会存在/usr 目录以及其子目录下面。

警告: 上面例子中的数值仅限于有经验的用户使用。 通常我们鼓励用户使用 FreeBSD 分区编辑器中一个叫做 Auto Defaults的自动分区布局功能。

  如果您要将FreeBSD安装在一个以上的硬盘, 那么您必须在您配置的其它分区上再建立分区。 最简单的方式就是在每个硬盘上建立两个分区,一个是交换分区, 一个是文件系统分区。

表 2-3. 为其它磁盘分区

分区 文件系统 大小 描述
b N/A 见描述 之前提过,交换分区是可以跨硬盘的。但是,即使 a 分区没有使用,习惯上还是会把交换分区放在 b 分区上。
e /diskn 剩下的硬盘空间 剩下的空间是一个大的分区,最简单的做法是将之规划为 a分区而不是e分区。然而, 习惯上a分区是保留给根目录 (/) 用的。您不一定要遵守这个习惯,但是 sysinstall 会, 所以照着它做会使您的安装比较清爽、干净。 您可以将这些文件系统挂在任何地方,本范例建议将它们挂在 /diskn 目录,n 依据每个硬盘而有所不同, 但是,您喜欢的话也可将它们挂在别的地方。

  分区的配置完成后,您可以用sysinstall. 来建立它们了。您会看到下面的信息:

                                 Message
 Now, you need to create BSD partitions inside of the fdisk
 partition(s) just created. If you have a reasonable amount of disk
 space (200MB or more) and don't have any special requirements, simply
 use the (A)uto command to allocate space automatically. If you have
 more specific needs or just don't care for the layout chosen by
 (A)uto, press F1 for more information on manual layout.

                                [  OK  ]
                          [ Press enter or space ]

  按下 Enter 键开始FreeBSD分区表编辑器,称做 Disklabel

  图 2-18 显示您第一次执行 Disklabel的画面。 画面分为三个区域。

  前几行显示的是您正在编辑的硬盘以及您正在建立的 slice 位于哪个分区上。(在这里,Disklabel 使用的是 分区名称 而不是 slice 名)。 此画面也会显示 slice 还有多少空间可以使用;亦即,有多余的空间, 但是尚未指派分区。

  画面中间区域显示已建立的区区,每个分区的文件系统名称、 所占的大小以及一些关于建立这些文件系统的参数选项。

  下方的第三区显示在 Disklabel 中可用的按键。

图 2-18. Sysinstall Disklabel 编辑器

  Disklabel 您可以自动配置分区以及给它们预设的大小。 这些默认的分区是由内部的分区尺寸算法根据磁盘的大小计算出的。 您可以按 A键使用此功能。您会看到类似 图 2-19的画面。根据您硬盘的大小, 自动分配所配置的大小不一定合适。但是没有关系, 您并不一定要使用预设的大小。

注意: 默认情况下会给/tmp 目录一个独立分区,而不是附属在 / 之下。 这样可以避免将一些临时文件放到根目录中(译注: 可能会用完根目录空间)。

图 2-19. Sysinstall Disklabel 编辑器-使用自动配置

  如果您不想使用默认的分区布局, 则需要用方向键移动光标并选中第一个分区, 然后按 D 来删除它。 重复这一过程直到删除了所有推荐的分区。

  要建立第一个分区 (a,作为 / ── 根文件系统), 请确认您已经在屏幕顶部选中了正确的 slice, 然后按 C。 接下来将出现一个对话框, 要求您输入新分区的尺寸 (如 图 2-20 所示)。 您可以输入以块为单位的尺寸,或以 M 表示MB、 G 结尾表示GB, 或者 C 表示柱面数的方式来表达尺寸。

注意: 从 FreeBSD 5.X 开始, 用户可以: 使用 Custom Newfs (Z) 选项来选择 UFS2 (在 FreeBSD 5.1 和更高版本中的默认值)。 用 Auto Defaults 来创建, 然后用 Custom Newfs 选项, 或在创建文件系统时指定 -O 2。 如果您使用了 Custom Newfs选项, 不要忘记增加 -U 来启用 SoftUpdates!

图 2-20. 根目录使用空间

  如果使用此处显示的默认尺寸, 则会创建一个占满整个 slice 空余空间的 partition。如果希望使用前面例子中描述的 partition 尺寸, 则应按 Backspace 键删除这些数字, 并输入 512M, 如 图 2-21 所示。 然后, 按下 [ OK ]

图 2-21. 编辑要分区大小

  输入完大小后接着问您要建立的分区是文件系统还是交换空间,如 图 2-22所示。第一个分区是文件系统, 所以确认选择 FS后按Enter 键。

图 2-22. 选择根分区类型

  最后,因为您要建立的是一个文件系统,所以必须告诉 Disklabel 这个文件系统要挂接在什么地方,如 图 2-23所示。根文件系统的挂接点 /, 所以请输入 /,然后按 Enter键。

图 2-23. 选择根挂接点

  刚刚制作好的分区会显示在画面上。 您应该重复上述的动作以建立其它的分区。当建立交换空间的时候, 系统不会问您要将它挂接在哪里,因为交换空间是不用挂在系统上的。 当您在建立最后一个分区/usr的时候, 您可以直接使用默认的大小,即所有此分区剩余的空间。

  您最终的 FreeBSD DiskLabel 编辑器画面会类似 图 2-24, 实际数字按您的选择而有所不同。 按下 Q 键完成分区的建立。

图 2-24. Sysinstall Disklabel 编辑器


2.7 选择要安装的软件包

2.7.1 选择要安装的软件包

  安装哪些软件包在很大程度上取决于系统将被用来做什么, 以及有多少可用的磁盘空间。内建的选项包括了运行所需要的最小系统, 到把所有软件包全都装上的常用配置。UNIX 或 FreeBSD 新手通常直接选择一个设定好的软件包就可以了, 而有经验的使用者则可以考虑自己订制安装哪些软件包。

  按下 F1 可以看到有关软件包的更多选项信息, 以及它们都包含了哪些软件,之后,可以按 Enter 回到软件包选择画面。

  如果您想要使用图形界面, 则必须选择软件包名称开头是 X 的那些软件包。 对于 X 服务器的配置, 以及选择默认的桌面管理器这样的工作必须在 FreeBSD 安装完成之后才能作。 关于配置 X 服务器的更多资料可以在 第 5 章 找到。

  默认安装的 X11 版本是 Xorg

  如果需要定制内核, 您还需要选择包含源代码的那个选项。 要了解为什么应该编译和构建新的内核, 请参见 第 8 章

  显然, 包含所有组件的系统是最万能的。 如果磁盘空间足够, 用光标键选择 图 2-25 中的 All 并按 Enter。 如果担心磁盘空间不够的话, 则选择最合适的选项。 不要担心选择的是否是最合适的, 因为其他软件包可以在安装完毕后再加入进来。

图 2-25. 选择软件包


2.7.2 安装ports软件包

  当选择完您想要安装的部分后,接着会询问您要不要安装FreeBSD Ports 软件包;Ports软件包可以让您简单方便地安装软件包。Ports本身并不包含编辑 软件所需要的程序源代码,而是一个包含自动下载、编辑以及安装的文档集合。 第 4 章 一章讨论如何使用Ports.

  安装程序并不会检查您是否有足够的硬盘空间, 在选择这一项之前请先确定您有足够的硬盘空间。 目前 FreeBSD 7.0 版本中, FreeBSD Ports Collection 大约占用 440 MB 大小的硬盘空间。 对于近期的版本您可能需要更多一些空间来安装他们。

                         User Confirmation Requested
 Would you like to install the FreeBSD Ports Collection?

 This will give you ready access to over 18,000 ported software packages,
 at a cost of around 440 MB of disk space when "clean" and possibly much
 more than that if a lot of the distribution tarballs are loaded
 (unless you have the extra CDs from a FreeBSD CD/DVD distribution
 available and can mount it on /cdrom, in which case this is far less
 of a problem).

 The Ports Collection is a very valuable resource and well worth having
 on your /usr partition, so it is advisable to say Yes to this option. 

 For more information on the Ports Collection & the latest ports,
 visit: 
     http://www.FreeBSD.org/ports  

                              [ Yes ]     No

  选择 [ Yes ] 将会安装 Ports Collection, 而选择 [ No ] 则将跳过它。 选好后按 Enter 继续。 此后, 选择安装的软件包的屏幕将再次出现。

图 2-26. 确认您要安装的软件包

  如果对您的选择感到满意,请选择Exit 退出,确保[ OK ] 被高亮显示,然后按Enter 继续。


2.8 选择您要使用的安装介质

  如果要从 CDROM 或 DVD安装,使用方向键将光标移到 Install from a FreeBSD CD/DVD。确认 [ OK ] 被选取,然后按 Enter 开始安装程序。

  如果要使用其它的方式安装, 请选择适当的安装介质然后按照屏幕指示进行安装。

  按 F1 可以显示安装介质的在线说明。按一下 Enter 可返回选择安装介质画面。

图 2-27. 选择安装介质

FTP安装模式: 使用FTP安装,有三种方式:主动式(active)FTP、被动式(passive)FTP 或是透过HTTP代理服务器。

主动式FTP: 从FTP服务器安装

这个选项将会使所有的FTP传输使用 “Active”模式。 这将无法通过防火墙,但是可以使用在那些比较早期, 不支持被动模式的FTP站。如果您的连接在使用被动(默认值) 模式卡住了,请换主动模式看看!

被动模式FTP:通过防火墙从FTP服务器安装

此选项会让 sysinstall 使用 “Passive”模式来安装。这使得使用者可以穿过 不允许用非固定TCP PORTS连入的防火墙。

FTP 透过 HTTP 代理服务器: 透过HTTP代理服务器, 由 FTP 服务器安装

此选项会让 sysinstall 通过HTTP协议 (像浏览器一样)连到proxy服务器。 proxy服务器会解释送出的请求,然后通知FTP服务器。 因为通过HTTP协议,所以可以穿过防火墙。 要用这种方式,您必须指定proxy服务器的地址。

对于一个 FTP 代理服务器而言, 通常在使用者登入名称中加入您要登入的服务器的用户名, 加在 “@” 符号后面。然后代理服务器就会 “假装” 成一个真的服务器。例如,假设您要从 ftp.FreeBSD.org 安装,通过 FTP 代理服务器 foo.example.com, 使用1234端口。

在这种情况下,您可以到 options 菜单,将 FTP username 设为 [email protected],密码设为您的电子邮件地址。 安装介质部分,指定FTP (或是被动式 FTP,如果代理服务器支持的话) 以及URL为 ftp://foo.example.com:1234/pub/FreeBSD

因为ftp.FreeBSD.org/pub/FreeBSD 目录会被抓取到 foo.example.com之下,您就可以从 这台 机器 (会从 ftp.FreeBSD.org 抓取文件) 安装。


2.9 安装确认

  到此为止,可以开始进行安装了, 这也是您避免更动到您的硬盘的最后机会。

                       User Confirmation Requested
 Last Chance! Are you SURE you want to continue the installation?

 If you're running this on a disk with data you wish to save then WE
 STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!

 We can take no responsibility for lost disk contents!

                             [ Yes ]    No

  选择 [ Yes ] 然后按下 Enter 确认安装

  安装所需的时间会根据您所选择的软件、 安装介质以及您电脑的速度而有所不同。 在安装的过程中会有一些信息来显示目前的进度。

  当您看到下面的信息表示已经安装完成了:

                               Message

Congratulations! You now have FreeBSD installed on your system.

We will now move on to the final configuration questions.
For any option you do not wish to configure, simply select No.

If you wish to re-enter this utility after the system is up, you may
do so by typing: /usr/sbin/sysinstall.  

                                 [ OK ]

                      [  Press enter or space  ]

  按下 Enter 以进行安装后的配置。

  选择 [ No ] 然后按 Enter 会取消安装,不会对您的系统造成更动。您会看到下面的信息:

                                Message
Installation complete with some errors.  You may wish to scroll
through the debugging messages on VTY1 with the scroll-lock feature.
You can also choose "No" at the next prompt and go back into the
installation menus to retry whichever operations have failed.

                                 [ OK ]

  产生这个信息是因为什么东西也没有安装,按下 Enter 后会离开安装程序回到主安装界面。从主安装界面可以退出安装程序。


2.10 安装后的配置

  安装成功后, 就可以进行进一步的配置了。 引导新安装的 FreeBSD 系统之后, 使用 sysinstall (/stand/sysinstall 如果您使用的是 FreeBSD 5.2 之前的版本), 并选择 Configure


2.10.1 配置网卡

  如果您之前配置用 PPP 通过 FTP 安装,那么这个画面将不会出现; 正像所说的那样,您可以稍后再做配置。

  如果想更多的了解网卡或将FreeBSD配置为网关或路由器,请参考 Advanced Networking 的相关文章。

                      User Confirmation Requested
   Would you like to configure any Ethernet or SLIP/PPP network devices?

                             [ Yes ]   No

  如果要配置网卡,请选择 [ Yes ] 然后按 Enter。 否则请选择 [ No ] 继续。

图 2-28. 选择网卡设备

  用方向键选择您要配置的网卡接口,然后按Enter

                      User Confirmation Requested
       Do you want to try IPv6 configuration of the interface?

                              Yes   [ No ]

  目录私人区域网络IP协议IPv4已经足够,所以选择 [ No ] 然后按 Enter

  如果想试试新的IP通信协议 IPv6 , 使用 RA 服务,请选择 [ Yes ] 然后按 Enter。 寻找 RA 服务器将会花费几秒的时间。

                             User Confirmation Requested
        Do you want to try DHCP configuration of the interface?

                              Yes   [ No ]

  如果您不需要 DHCP (Dynamic Host Configuration Protocol 动态主机配置协议) ,选择 [ No ] 然后按Enter

  选择 [ Yes ] 会执行dhclient, 如果成功,它会自动将网络配置信息填上。更多的信息请参考 第 27.5 节

  下面的网络配置显示了怎样把以太网设备配置成区域网络网关的角色。

图 2-29. 配置 ed0接口

  使用Tab 键可以在各个栏目之间进行切换,请输入适当 的信息:

Host(机器名称)

完整的机器名称,例如本例中的 k6-2.example.com

Domain(域名)

您机器所在的域名称,如本例的 example.com

IPv4 Gateway(IPv4网关)

输入将数据包传送到远端网络的机器IP地址。 只有当机器是网络上的一个节点时才要输入。 如果这台机器要作为您局域网的网关, 请将此处设为空白。IPv4网关, 也被称作默认网关或默认路由器。

域名服务器

本地网络中的域名服务器的IP地址。 本例中假设机器所在的网络中没有域名服务器, 所以填入的是ISP提供的域名服务器地址 (208.163.10.2。)

IPv4 地址

本机所使用的IP地址。本例为 192.168.0.1

子网掩码

在这个局域网中所使用的地址块是 192.168.0.0 - 192.168.0.255, 对应的子网掩码是 255.255.255.0

ifconfig 额外参数设定

任何ifconfig命令跟网卡接口有关的参数。 本范例中没有。

  使用 Tab 键选择 [ OK ]然后按 Enter键。

                      User Confirmation Requested
        Would you like to Bring Up the ed0 interface right now?

                             [ Yes ]   No

  选择 [ Yes ] 然后按 Enter 将会将机器的网卡转为启用状态。 机器下次启动的时候即可使用。


2.10.2 配置网关

                       User Confirmation Requested
       Do you want this machine to function as a network gateway?

                              [ Yes ]    No

  如果这台机器要作为本地网络和其它机器之间传送数据包的网关,请选择 [ Yes ] 然后按 Enter。 如果这台机器只是网络上的普通节点,请选择 [ No ] 并按 Enter 继续。


2.10.3 配置网络服务

                      User Confirmation Requested
Do you want to configure inetd and the network services that it provides?

                               Yes   [ No ]

  如果选择 [ No ], 许多网络服务,如 telnetd 将不会启用。 这样, 远端用户将无法 telnet 进入这台机器。 本机上的用户还是可以 telnet到远端机器的。

  这些服务可以在安装完成后修改/etc/inetd.conf 配置文件来启用它们。请参阅 第 27.2.1 节 以获得更多的信息。

  如果您想现在就配置这些网络服务,请选择 [ Yes ], 然后会看到下面的信息:

                      User Confirmation Requested
The Internet Super Server (inetd) allows a number of simple Internet
services to be enabled, including finger, ftp and telnetd.  Enabling
these services may increase risk of security problems by increasing
the exposure of your system.

With this in mind, do you wish to enable inetd?

                             [ Yes ]   No

  选择 [ Yes ] 继续。

                      User Confirmation Requested
inetd(8) relies on its configuration file, /etc/inetd.conf, to determine
which of its Internet services will be available.  The default FreeBSD
inetd.conf(5) leaves all services disabled by default, so they must be
specifically enabled in the configuration file before they will
function, even once inetd(8) is enabled.  Note that services for
IPv6 must be separately enabled from IPv4 services.

Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to
use the current settings.

                             [ Yes ]   No

  选择 [ Yes ] 将允许您添加网络服务 (或将相应网络服务每行开头的 # 除掉即可。)

图 2-30. 编辑 inetd.conf配置文件

  在加入您想启用的服务后,按下 Esc键会出现一个 对话框可以让您离开以及保存修改。


2.10.4 启用 SSH 登录

                      User Confirmation Requested
                  Would you like to enable SSH login?
                           Yes        [  No  ]

  选择 [ Yes ] 便会启用 sshd(8), 也就是 OpenSSH 服务程序。 它能够让您以安全的方式从远程访问机器。 如欲了解关于 OpenSSH 的进一步详情, 请参见 第 14.11 节


2.10.5 匿名 FTP

                      User Confirmation Requested
 Do you want to have anonymous FTP access to this machine?

                              Yes    [ No ]

2.10.5.1 不允许匿名 FTP访问

  选择默认的 [ No ] 并按下 Enter 键将仍然可以让在这台机器上有账号的用户访问 FTP。


2.10.5.2 允许匿名 FTP访问

  如果您选择允许匿名 FTP 存取, 那么网络中任何人都可以使用FTP来访问您的机器。 在启用匿名访问之前应该考虑网络的安全问题。 如果要知道更多有关网络安全的信息, 请参阅 第 14 章

  要启用FTP匿名访问,用方向键选择 [ Yes ] 并按 Enter键。 系统会给出进一步的确认信息:

                       User Confirmation Requested
 Anonymous FTP permits un-authenticated users to connect to the system
 FTP server, if FTP service is enabled.  Anonymous users are
 restricted to a specific subset of the file system, and the default
 configuration provides a drop-box incoming directory to which uploads
 are permitted.  You must separately enable both inetd(8), and enable
 ftpd(8) in inetd.conf(5) for FTP services to be available.  If you
 did not do so earlier, you will have the opportunity to enable inetd(8)
 again later.

 If you want the server to be read-only you should leave the upload
 directory option empty and add the -r command-line option to ftpd(8)
 in inetd.conf(5)

 Do you wish to continue configuring anonymous FTP?

                          [ Yes ]         No

  这些信息会告诉您 FTP 服务还需要在 /etc/inetd.conf 中启用。 假如您希望允许匿名 FTP 连接, 请参见 第 2.10.3 节。 选择 [ Yes ] 并按 Enter 继续; 系统将给出下列信息:

图 2-31. 默认的匿名 FTP 配置

  使用 Tab 在不同的信息字段之间切换, 并填写必要的信息:

UID

用于分配给匿名 FTP 用户的用户 ID。 所有上传的文件的属主都将是这个 ID。

Group

匿名 FTP 用户所在的组。

Comment

用于在 /etc/passwd 中描述该用户的说明性信息。

FTP Root Directory

可供匿名 FTP 用户使用的文件所在的根目录。

Upload Subdirectory

匿名 FTP 用户上传的文件的存放位置。

  默认的 FTP 根目录将放在 /var 目录下。 如果您的 /var 目录空间不足以应付您的FTP需求, 您可以将FTP的根目录改为 /usr 目录下的 /usr/ftp 目录。

  当您对一切配置都满意后,请按 Enter 键继续。

                          User Confirmation Requested
         Create a welcome message file for anonymous FTP users?

                              [ Yes ]    No

  如果您选择 [ Yes ] 并按下 Enter键, 系统会自动打开文本编辑器让您编辑FTP的欢迎信息。

图 2-32. 编辑FTP欢迎信息

  此文本编辑器叫做 ee。 按照指示修改信息文本或是稍后再用您喜爱的文本编辑器来修改。 请记住画面下方显示的文件位置。

  按 Esc 将弹出一个默认为 a) leave editor的对话框。按 Enter 退出并继续。再次按 Enter 将保存修改。


2.10.6 配置网络文件系统

  网络文件系统 (NFS) 可以让您可以在网络上共享您的文件。 一台机器可以配置成NFS服务器、客户端或两者并存。请参考 第 27.3 节 以获得更多的信息。


2.10.6.1 NFS 服务器

                       User Confirmation Requested
 Do you want to configure this machine as an NFS server?

                              Yes    [ No ]

  如果您不想安装网络文件系统,请选择 [ No ] 然后按 Enter键。

  如果您选择 [ Yes ] 将会出现一个对话框提醒您必须先建立一个 exports 文件。

                               Message
Operating as an NFS server means that you must first configure an
/etc/exports file to indicate which hosts are allowed certain kinds of
access to your local filesystems.
Press [Enter] now to invoke an editor on /etc/exports
                               [ OK ]

  按 Enter 键继续。系统会启动文本编辑器让您编辑 exports 文件。

图 2-33. 编辑 exports文件

  按照指示加入真实输出的文件目录或是稍后用您喜爱的编辑器自行编辑。 请记下画面下方显示的文件名称及位置。

  按下 Esc 键会出现一具对话框,默认选项是 a) leave editor。按下 Enter 离开并继续。


2.10.6.2 NFS 客户端

   NFS 客户端允许您的机器访问NFS服务器。

                       User Confirmation Requested
 Do you want to configure this machine as an NFS client?

                              Yes   [ No ]

  按照您的需要,选择 [ Yes ][ No ] 然后按 Enter


2.10.7 配置系统终端

  系统提供了几个选项可以让您配置终端的表现方式。

                      User Confirmation Requested
       Would you like to customize your system console settings?

                              [ Yes ]  No

  要查阅及配置这些选项,请选择 [ Yes ] 并按Enter

图 2-34. 系统终端配置选项

  最常用的选项就是屏幕保护程序了。使用方向键将光标移动到 Saver 然后按 Enter

图 2-35. 屏幕保护程序选项

  选择您想使用的屏幕保护程序,然后按 Enter。 之后回到系统终端配置画面。

  默认开启屏幕保护程序的时间是300秒。如果要更改此时间,请再次选择 Saver 。然后选择 Timeout 并按 Enter键。系统会弹出一个对话框如下:

图 2-36. 屏幕保护时间设置

  您可以直接改变这个值,然后选 [ OK ]并按 Enter 键回到系统终端配置画面。

图 2-37. 退出系统终端配置

  选择 Exit 然后按下 Enter 键会回到安装后的配置画面。


2.10.8 配置时区

  配置您机器的时区可以让系统自动校正任何区域时间的变更, 并且在执行一些跟时区相关的程序时不会出错。

  例子中假设此台机器位于美国东部的时区。 请参考您所在的地理位置来配置。

                      User Confirmation Requested
          Would you like to set this machine's time zone now?

                            [ Yes ]   No

  选择 [ Yes ] 并按下 Enter键以配置时区。

                       User Confirmation Requested
 Is this machine's CMOS clock set to UTC? If it is set to local time
 or you don't know, please choose NO here!

                              Yes   [ No ]

  这里按照您机器时间的配置,选择 [ Yes ][ No ] 然后按 Enter

图 2-38. 选择您所处的地理区域

  请选择适当的区域然后按 Enter

图 2-39. 选择您所在的国家

  选择您所在的国家然后按 Enter

图 2-40. 选择您所在的时区

  选择您所在的时区然后按 Enter

                            Confirmation
            Does the abbreviation 'EDT' look reasonable?

                            [ Yes ]   No

  检查一下时区的缩写是否正确,如果没错,请按 Enter 返回系统安装后的配置画面。


2.10.9 Linux 兼容性

                      User Confirmation Requested
          Would you like to enable Linux binary compatibility?

                            [ Yes ]   No

  选择 [ Yes ] 并按下Enter 键, 将允许您在FreeBSD中执行Linux的软件。安装程序会安装一些为了跟 Linux 兼容的软件包。

  如果您是通过FTP安装,那么您必须连到网络上。 有时候FTP站并不会包含所有的安装软件包(例如Linux兼容软件包); 不过,稍后您还可以再安装这个项目。


2.10.10 配置鼠标

  此选项可以让您在终端上使用三键鼠标剪贴文字。 如果您用的鼠标是两个按钮,请参考手册 moused(8); 以取得有关模拟三键鼠标的信息。范例中使用的鼠标不是USB接口。 (例如ps/2或com接口的鼠标):

                      User Confirmation Requested 
         Does this system have a PS/2, serial, or bus mouse?

                            [ Yes ]    No

  如果您使用的是 PS/2、 串口或 Bus 鼠标,请选择 [ Yes ], 如果是 USB 鼠标, 则应选择 [ No ] 并按 Enter

图 2-41. 选择鼠标类型

  使用方向键选择 Type 然后按 Enter

图 2-42. 设置鼠标协议

  在这个例子中使用的类型是ps/2鼠标,所以可以使用默认的 Auto(自动) 。 您可以用方向键选择合适的项目,确定选择了 [ OK ] 后按 Enter 键离开此画面。

图 2-43. 配置鼠标端口

  选择 Port 然后按 Enter

图 2-44. 配置鼠标端口

  假设这台机器用的是ps/2鼠标,您可以采用默认的 PS/2 选项。请选择适当的项目然后按 Enter

图 2-45. 启动鼠标服务进程

  选择Enable然后按 Enter 来启动和测试鼠标。

图 2-46. 测试鼠标功能

  鼠标指针可以在屏幕上移动,指明鼠标服务已经正常启用。那么请选择 [ Yes ]Enter键。否则鼠标没 有配置成功 ── 选择 [ No ] 并尝试不同的配置 选项。

  选择 Exit 并按 Enter 退回到系统安装完成后的配置画面。


2.10.11 安装预编译的软件包 (package)

  Package 是事先编译好的二进制文件, 因此, 这是安装软件的一种便捷的方式。

  在这里作为例子我们将给出安装一个 package 所需的过程。 如果需要, 还可以在这一阶段加入其他 package。 安装完成之后, sysinstall 依然可以用来安装其他 package。

                     User Confirmation Requested
 The FreeBSD package collection is a collection of hundreds of
 ready-to-run applications, from text editors to games to WEB servers
 and more. Would you like to browse the collection now? 

                            [ Yes ]   No

  选择 [ Yes ] 并按 Enter 将进入 package 选择界面:

图 2-47. 选择 Package 类别

  在任何时候, 只有当前安装介质上存在的 package 才可以安装。

  如果选择了 All 或某个特定的分类, 则系统会列出全部可用的 package。 用光标键移动光棒选中需要的 package, 并按 Enter

  系统会显示可供选择的 package:

图 2-48. 选择 Package

  如图所示, 我们选择了 bash shell。 您可以根据需要使用 Space 键来勾选选定的 package。 在屏幕左下角会给出 package 的简短说明。

  反复按下 Tab 键, 可以在最后选中的 package、 [ OK ][ Cancel ] 之间来回切换。

  当您把需要的 package 都标记为安装之后, 按一下 Tab 切换到 [ OK ], 随后按下 Enter 就可以回到 package 选择菜单了。

  左右方向键可以用于在 [ OK ][ Cancel ] 之间进行切换。 这种方法也可以用来选择 [ OK ], 随后按下 Enter 也可以回到 package 选择菜单。

图 2-49. 安装预编译软件包

  使用 Tab 和左右方向键选择 [ Install ] 并按 Enter。 接下来需要确认将要安装的预编译包:

图 2-50. 确认将要安装的预编译包

  选择 [ OK ] 并按下 Enter 就可以开始预编译包的安装了。在这个过程中您会看到安装的相关信息, 直到安装完成为止。请留意观察是否有错误信息出现。

  在完成预编译包的安装之后, 就进入了最后的配置阶段。 如果您没有选择任何预编译包, 并希望直接进入最后的配置阶段, 则可以选择 Install 来跳过。


2.10.12 添加用户和组

  在安装系统的过程中, 您应添加至少一个用户, 以避免直接以 root 用户的身份登录。 用以保存其用户数据的根分区通常很小, 因此用 root 身份运行程序可能将其迅速填满。 下面的提示信息介绍了这样做可能带来的更大隐患:

                     User Confirmation Requested
 Would you like to add any initial user accounts to the system? Adding
 at least one account for yourself at this stage is suggested since
 working as the "root" user is dangerous (it is easy to do things which
 adversely affect the entire system). 

                            [ Yes ]   No

  选择 [ Yes ] 并按 Enter 即可开始创建用户的过程。

图 2-51. 选择用户

  用箭头键来选择 User 然后按 Enter

图 2-52. 添加用户信息

  下面的描述信息会出现在屏幕的下方,可以使用 Tab 键来切换不同的项目,以便输入相关信息:

Login ID

新用户的登录名(强制性必须写)

UID

这个用户的ID编号(如果不写,系统自动添加)

Group

这个用户的登录组名(如果不写,系统自动添加)

Password

这个用户的密码(键入这个需要很仔细!)

Full name

用户的全名(解释、备注)

Member groups

这个用户所在的组

Home directory

用户的主目录(如果不写,系统自动添加)

Login shell

用户登录的shell(默认是/bin/sh)。

  你可以将登录 shell 由 /bin/sh 改为 /usr/local/bin/bash, 以便使用事先以 package 形式安装的 bash shell。不要使用一个不存在的或您不能登录的shell。 最通用的shell是使用 BSD-world 的 C shell, 可以通过指定/bin/tcsh来修改。

  用户也可以被添加到 wheel 组中成了一个超级用户,从而拥有 root 权限。

  当您感觉满意时,键入 [ OK ] 键, 用户和组管理菜单将会重新出现。

图 2-53. 退出用户和组管理

  如果有其他的需要, 此时还可以添加其他的组。 此外, 还可以通过 sysinstall (在 FreeBSD 5.2 以前的版本中是 /stand/sysinstall) 在安装完成之后添加它们。

  当您完成添加用户的时候,选择Exit 然后键入Enter 继续下面的安装。


2.10.13 设置 root 密码

                        Message
 Now you must set the system manager's password.
 This is the password you'll use to log in as "root".

                         [ OK ]

               [ Press enter or space ]

  键入 Enter 来设置 root 密码。

  密码必须正确地输入两次。 毋庸讳言, 您需要选择一个不容易忘记的口令。 请注意您输入的口令不会回显, 也不会显示星号。

New password:
Retype new password :

  密码成功键入后,安装将继续。


2.10.14 退出安装

  如果您需要设置 其他网络设备, 或需要完成其他的配置工作, 可以在此时或者事后通过 sysinstall (对于 FreeBSD 5.2 之前的版本是 /stand/sysinstall) 来进行配置。

                     User Confirmation Requested
 Visit the general configuration menu for a chance to set any last
 options?

                              Yes   [ No ]

  选择 [ No ] 然后键入 Enter 返回到主安装菜单。

图 2-54. 退出安装

  选择 [X Exit Install] 然后键入 Enter。您可能需要确认是否真的退出安装:

                     User Confirmation Requested
 Are you sure you wish to exit? The system will reboot (be sure to  
 remove any floppies/CDs/DVDs from the drives).

                            [ Yes ]   No

  选择 [ Yes ] 取出软盘。CDROM 驱动器将被锁定, 直到机器重新启动。CDROM 解锁后就可以取出光盘了。

  此后系统将重新启动, 因此请留意是否会出现一些错误信息。 进一步的细节, 请参见 第 2.10.16 节


2.10.15 配置其他网络服务

原作 Tom Rhodes.

  如果之前缺少这一领域的经验, 那么配置网络服务对于新手而言, 很可能会是一件很有挑战的事情。 网络, 包括 Internet, 对于包括 FreeBSD 在内的所有现代操作系统而言都至关重要。 因此, 首先对 FreeBSD 提供的丰富的网络性能加以了解会很有帮助。 在安装过程中了解这些知识, 能够确保用户更好地理解他们可以用到的各种服务。

  网络服务是一些可以接收来自网络上任何地方的人所提交的输入信息的程序。 人们一直都在努力确保这些程序不会做任何 “有害的” 事情。 不幸的是, 程序员们并不是十全十美的完人,因此,网络服务程序中的漏洞, 便有可能被攻击者利用来做一些坏事。因而, 只启用那些您知道自己需要的服务就很重要了。如果存在疑问, 那么就最好不要在您发现需要它之前启动任何网络服务。 您可以事后通过再次运行 sysinstall 或直接手工配置 /etc/rc.conf 来随时启用这些服务。

  选择 Networking 选项将下显示一个类似下面的菜单:

图 2-55. 网络配置之上层配置

  第一个选项, Interfaces, 已经在前面的 第 2.10.1 节 中做过配置, 因此现在可以略过它。

  选择 AMD 选项, 将添加对于 BSD 自动挂接程序的支持。 这个程序通常会和 NFS 协议 (详情参见下文) 配合使用,以便自动挂载远程文件系统。 启用它不需要在此时进行特殊的额外配置。

  下一行是 AMD Flags 的参数选项。 选择它之后,会弹出一个让您选择 AMD 参数的子菜单。 菜单中包含一系列的选项:

-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map

  -a 选项用来设置默认的挂接位置,这里使用的是 /.amd_mnt目录。-l 指定默认的 日志 文件; 但是,当使用 syslogd 时,所有在日之中记录的活动, 都会发送到系统日志服务去。 /host 用来挂接远程主机上输出的文件系统,而 /net 目录则用来挂接从特定 IP 地址输出的文件系统。 /etc/amd.map 文件定义了用于 AMD 的默认输出选项。

  Anon FTP 允许匿名 FTP 访问。 选中这个选项, 可以使这台机器成为一台匿名 FTP 服务器。 要注意启用这个选项的安全风险。 系统将使用另外的菜单来说明安全风险和进一步的配置。

  Gateway 选项可以使将本机配置成为一台以前我们介绍过的网关。 如果您在安装过程中不小心选中了 Gateway, 也可以在这里用这个选项来取消。

  Inetd 选项用来配置或完全禁用前面讨论过的 inetd(8) 服务程序。

  Mail 用来配置系统默认的 MTA 或邮件传输代理。 选择这个选项将出现下面的菜单:

图 2-56. 选择默认的 MTA

  这里给您提供了一个安装MTA 并将其配置为默认值的机会。MTA 是一种能够将邮件头递给本系统或互联网上的用户的邮件服务。

  选择 Sendmail 将会安装十分流行的 sendmail 服务, 这也是 FreeBSD 的默认配置。Sendmail local 选项表示将 sendmail 设为默认的 MTA,但禁止其从 Internet 上接收邮件的能力。 此外还有一些其他选项,PostfixEximSendmail 的功能类似。 它们两者也可以投递邮件; 不过, 有些用户会喜欢使用它们代替 sendmail MTA

  选择 MTA 或决定不挑选 MTA 之后, 网络配置菜单的下一项将是 NFS client

  NFS client 客户端可以使系统通过 NFS 与服务器进行通信。 NFS 服务器通过 NFS 协议可以使其它在网络上的机器来访问自己的文件系统。 如果这台机器要作为一台独立的服务器,这个选项可以保留不选。 如果启用它, 您在之后还需要进行更多的其他配置; 请参见 第 27.3 节 以了解关于配置客户机和服务器的进一步详情。

  接下来的 NFS server 选项, 可以让您将本机系统配置为 NFS 服务器。 这会自动将启动 RPC 远程过程调用的信息写入配置文件。 RPC 是一种在多个主机和程序之间进行连接组织的机制。

  下一项是 Ntpdate 选项, 它能够处理时间同步。 当选择它后, 会出现一个像下面所似的菜单:

图 2-57. Ntpdate 配置

  从这个菜单选择一个离您最近的服务器。 选择较近的服务器,有助于提高时间同步的精度, 因为较远的服务器的连接延迟可能会比较大。

  下一个选项是 PCNFSD。 这个选项将安装第三方软件包 net/pcnfsd。 它可以用来为无法自行提供 NFS 认证服务的操作系统, 如微软的 MS-DOS 提供服务。

  滚屏到下一页看一下其它选项:

图 2-58. 网络配置之下层配置

  rpcbind(8)rpc.statd(8)rpc.lockd(8) 这三个程序是用来提供远程过程调用 (RPC) 服务的。 rpcbind 程序管理 NFS 服务器和客户端的通信, 这是 NFS 正确工作的必要前提。rpc.statd 程序可以和其它主机上 rpc.statd 程序交互, 以提供状态监控。这些状态报告默认情况下会保存到 /var/db/statd.status 文件中。 最后的一项是 rpc.lockd 选项, 如果启用,则将提供文件上锁服务。通常将它和 rpc.statd 联用, 以监视哪些主机会请求对文件执行上锁操作, 以及这种操作的频繁程度。 尽管后两项功能对于调试非常有用, 但它们并不是 NFS 服务器和客户端正常运行所必需的。

  下一个项目是Routed,这是一个路由程序。 routed(8) 程序管理网络路由表,发现多播路由, 并且支持在网络上与它物理相连的主机来复制它的路由表的请求。 它被广泛地应用在本地网络中并扮演着网关的角色。 当选择它后,一个子菜单会来询问您这个程序的默认位置。 默认的位置已经被定义过, 您可以选择 Enter 键, 也可以按下其它的键。 这时会出来另一个菜单来询问您传递给 routed程序的参数。 默认的是 -q 参数。

  接下来是 Rwhod 选项, 选中它会启用 rwhod(8) 程序在系统初时化的时候。 rwhod程序通过网络周期性的广播系统 信息或以“客户”的身份来收集这些信息。 更多的信息可以查看 ruptime(1)rwho(1) 手册页。

  倒数第二个选项是sshd(8) 程序。它可以通过使用 OpenSSH 来提供安全的shell服务, 我们推荐通过使用它来使用 telnetFTP 服务。 sshd 服务通过使用加密技术来创建从一台机器到另一台机器的安全连接。

  最后有一个 TCP 扩展选项。 这可以用来扩展在 RFC 1323 和 RFC 1644 里定义的 TCP 功能。当许多主机以高速连接本机时,可能会引起某些连接被丢弃。 我们不推荐使用这个选项, 但是当使用独立的主机时可以从它上面得到一些好处。

  现在您已经配置完成了网络服务, 您可以滚动屏幕到顶部选择 X Exit 项, 退出进入下一个配置部分, 或简单地选择两次 X Exit 之后选择 [X Exit Install] 来退出 sysinstall


2.10.16 FreeBSD 的启动过程

2.10.16.1 FreeBSD/i386 的启动过程

  如果启动正常,您将看到在屏幕上有很多信息滚动, 最后您会看到登录命令行。您可以通过键入 Scroll-Lock和使用 PgUpPgDn来查看信息,再键入 Scroll-Lock 回到命令行。

  记录信息可能不会显示(缓冲区的限制)。您可以通过键入 dmesg 来查看。

  使用您在安装过程中设置的用户名/密码来登录。(例子中使用 rpratt)。除非必须的时候请不要用 root 用户登录。

  典型的启动信息:(忽略版本信息)

Copyright (c) 1992-2002 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.

Timecounter "i8254"  frequency 1193182 Hz
CPU: AMD-K6(tm) 3D processor (300.68-MHz 586-class CPU)
  Origin = "AuthenticAMD"  Id = 0x580  Stepping = 0
  Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX>
  AMD Features=0x80000800<SYSCALL,3DNow!>
real memory  = 268435456 (262144K bytes)
config> di sn0
config> di lnc0
config> di le0
config> di ie0
config> di fe0
config> di cs0
config> di bt0
config> di aic0
config> di aha0
config> di adv0
config> q
avail memory = 256311296 (250304K bytes)
Preloaded elf kernel "kernel" at 0xc0491000.
Preloaded userconfig_script "/boot/kernel.conf" at 0xc049109c.
md0: Malloc disk
Using $PIR table, 4 entries at 0xc00fde60
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
pcib1: <VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0: <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci0
usb0: <VIA 83C572 USB controller> on uhci0
usb0: USB revision 1.0
uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
chip1: <VIA 82C586B ACPI interface> at device 7.3 on pci0
ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xe800-0xe81f irq 9 at
device 10.0 on pci0
ed0: address 52:54:05:de:73:1b, type NE2000 (16 bit)
isa0: too many dependant configs (8)
isa0: unexpected small tag 14
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <keyboard controller (i8042)> at port 0x60-0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model Generic PS/2 mouse, device ID 0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x1 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/15 bytes threshold
ppbus0: IEEE1284 device found /NIBBLE
Probing for PnP devices on ppbus0:
plip0: <PLIP network interface> on ppbus0
lpt0: <Printer> on ppbus0
lpt0: Interrupt-driven port
ppi0: <Parallel I/O> on ppbus0
ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master using UDMA33
ad2: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata1-master using UDMA33
acd0: CDROM <DELTA OTC-H101/ST3 F/W by OIPD> at ata0-slave using PIO4
Mounting root from ufs:/dev/ad0s1a
swapon: adding /dev/ad0s1b as swap device
Automatic boot in progress...
/dev/ad0s1a: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1a: clean, 48752 free (552 frags, 6025 blocks, 0.9% fragmentation)
/dev/ad0s1f: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1f: clean, 128997 free (21 frags, 16122 blocks, 0.0% fragmentation)
/dev/ad0s1g: FILESYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1g: clean, 3036299 free (43175 frags, 374073 blocks, 1.3% fragmentation)
/dev/ad0s1e: filesystem CLEAN; SKIPPING CHECKS
/dev/ad0s1e: clean, 128193 free (17 frags, 16022 blocks, 0.0% fragmentation)
Doing initial network setup: hostname.
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
        inet6 fe80::5054::5ff::fede:731b%ed0 prefixlen 64 tentative scopeid 0x1
        ether 52:54:05:de:73:1b
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
Additional routing options: IP gateway=YES TCP keepalive=YES
routing daemons:.
additional daemons: syslogd.
Doing additional network setup:.
Starting final network daemons: creating ssh RSA host key
Generating public/private rsa1 key pair.
Your identification has been saved in /etc/ssh/ssh_host_key.
Your public key has been saved in /etc/ssh/ssh_host_key.pub.
The key fingerprint is:
cd:76:89:16:69:0e:d0:6e:f8:66:d0:07:26:3c:7e:2d [email protected]
 creating ssh DSA host key
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
f9:a1:a9:47:c4:ad:f9:8d:52:b8:b8:ff:8c:ad:2d:e6 [email protected]
setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib
/usr/local/lib
a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout
starting standard daemons: inetd cron sshd usbd sendmail.
Initial rc.i386 initialization:.
rc.i386 configuring syscons: blank_time screensaver moused.
Additional ABI support: linux.
Local package initialization:.
Additional TCP options:.

FreeBSD/i386 (k6-2.example.com) (ttyv0)

login: rpratt
Password:

  生成 RSA 和 DSA密钥在比较慢的机器上可能要花很长时间。这只是一个 新安装后的首次启动,以后的启动会变得更快一点。

  如果已经完成 X 服务器的配置, 且指定了默认的桌面窗口管理器, 就可以在命令行键入 startx 来启动它了。


2.10.16.2 FreeBSD/alpha 的启动过程

  一旦安装完成,您就可以键入下面的命令来启动FreeBSD:

>>>BOOT DKC0

  这是从指定的固定硬件进行引导。如果要使 FreeBSD 下次能够自动启动, 使用下面的命令:

>>> SET BOOT_OSFLAGS A
>>> SET BOOT_FILE ''
>>> SET BOOTDEF_DEV DKC0
>>> SET AUTO_ACTION BOOT

  启动信息跟启动 i386机器时差不多。(但不完全一样)


2.10.17 FreeBSD 关机

  正确的关闭操作系统是很重要的。不要仅仅关闭电源。 首先,您需要成为一个超级用户,通过键入 su 命令来实现。然后输入 root 密码。这需要用户是 wheel 组的一名成员。然后, 以root键入 shutdown -h now命令。

The operating system has halted.
Please press any key to reboot.

  当shutdown命令发出后,屏幕上出现 “Please press any key to reboot” 信息时,您就可以安全的关闭计算机了。如果按下任意一个键, 计算机将重新启动。

  您也能够使用 Ctrl+Alt+Del 组合键来重新启动计算机,但是不推荐使用这个操作。


2.11 常见问题

  下面将介绍一些在安装过程中常见的问题,像如何报告发生的问题, 如何双重启动 FreeBSD 和 MS-DOSWindows


2.11.1 当您遇到错误时,应该怎么做?

  由于 PC 结构的限制, 硬件检测不可能 100% 地可靠, 但是有些问题是您可以自己解决的。

  首先检查一下您使用的 FreeBSD 版本的 硬件兼容说明 文档看看您使用的是否是被支持的硬件。

  如果您使用的硬件是系统支持的,但仍然遇到了死机或其他问题, 则需要联编 定制的内核。 这能够支持默认的 GENERIC 内核所不支持的设备。 在引导盘上的内核假定绝大多数的硬件,均为按出厂设置的方式配置了 IRQ、 IO 地址和 DMA 通道。 如果您的硬件重新进行了配置, 则可能需要编辑内核配置, 并重新编译内核, 以便告诉 FreeBSD 到哪里去查找设备。

  除此之外,也可能遇到这种情况吗,即探测某种并不存在的设备时, 会干扰到其他设备的检测并使其失败。 这种情况吗下应禁止驱动程序检测可能导致冲突的设备。

注意: 有些安装问题可以借助更新硬件的程序来解决,特别是主板的 BIOS 。 大部分的主板制造商都会提供网站给用户下载新的 BIOS 以及提供如何更新的说明。

也有许多制造商强烈建议,除非必要否则不要轻易更新 BIOS 。因为更新的过程 可能 会发生问题,进而损害 BIOS 芯片。


2.11.2 使用 MS-DOS® 和 Windows® 文件系统

  目前, FreeBSD 尚不支持通过 Double Space™ 程序压缩的文件系统。 因此,如果希望 FreeBSD 访问数据, 则应首先解压缩这些文件系统。 这项工作,可以通过位于 Start> Programs > System Tools 菜单的 Compression Agent 来完成。

  FreeBSD 可以支持基于 MS-DOS 的文件系统 (有时被称为 FAT 文件系统)。 mount_msdosfs(8) 命令能够把这样的文件系统挂接到现有的目录结构中, 并允许访问 FAT 文件系统上的内容。 通常我们并不直接使用 mount_msdosfs(8) 程序,它一般会在 /etc/fstab 中的某一行被调用或者被 mount(8) 工具并配合适当的参数来调用。

  /etc/fstab中一个典型的例子:

/dev/ad0sN  /dos  msdosfs rw  0    0

注意: /dos 目录必须事先存在。 更多关于 /etc/fstab 的细节, 请参阅 fstab(5)

  一个使用 mount(8) 挂载 MS-DOS 文件系统的例子:

# mount -t msdosfs /dev/ad0s1 /mnt

  在此例子中, MS-DOS 文件系统位于主硬盘的第一个分区。 您的情况可能与引不同,查看命令 dmesgmount 的输出。 它们应该可以让您得到足够的分区信息。

注意: FreeBSD 可能使用和其他操作系统不同计数方法来标记磁盘 slices, 特别需要指出的是, MS-DOS 的扩展分区通常会比 MS-DOS 主分区被标记为更高的数值。 可以使用 fdisk(8) 工具来帮助测定哪些 slices 属于 FreeBSD 哪些是属于其他的操作系统。

  NTFS 分区也可以通过类似 mount_ntfs(8) 命令挂接在FreeBSD上。


2.11.3 排除故障时的常见问题和解决方法

2.11.3.1. 我的系统在引导到探测硬件时发生了死机、 安装过程中行为异常, 或没有检测到软驱。
2.11.3.2. 在硬盘安装 FreeBSD 之后的首次启动时, 内核加载并检测了硬件, 但给出下列消息并停止运行:
2.11.3.3. 在硬盘安装 FreeBSD 之后的首次启动时, Boot Manager 只是给出了 F? 的菜单提示, 但并不继续引导过程。
2.11.3.4. 系统找到了 ed(4) 网卡, 但总是报设备超时 (device timeout) 错误。

2.11.3.1. 我的系统在引导到探测硬件时发生了死机、 安装过程中行为异常, 或没有检测到软驱。

FreeBSD 5.0 和更高版本在启动过程中广泛使用了 i386、 amd64 及 ia64 平台提供的 ACPI 服务来检测系统配置。 不幸的是, 在 ACPI 驱动和主板 BIOS 中存在一些 bug。 如果遇到这种情况, 可以在系统引导时禁用 ACPI, 其方法是在第三阶段引导加载器时使用 hint hint.acpi.0.disabled

set hint.acpi.0.disabled="1"

这一设置会在系统重启之后失效,因此,如果需要的话,您应在 /boot/loader.conf 文件中增加 hint.acpi.0.disabled="1"。 关于引导加载器的进一步详情, 请参见 第 12.1 节

2.11.3.2. 在硬盘安装 FreeBSD 之后的首次启动时, 内核加载并检测了硬件, 但给出下列消息并停止运行:

changing root device to ad1s1a panic: cannot mount root

这是怎么回事? 我该怎么做?

另外引导帮助信息里提到的 bios_drive:interface(unit,partition)kernel_name 是什么?

系统在处理引导盘非系统中的第一块盘时有一个由来已久的问题。 BIOS 采用的编号方式有时和 FreeBSD 不一致, 而设法将其变为一样则很难正确地实现。

因而, 在发生这种情况时,FreeBSD 可能会需要一些帮助才能找到磁盘。有两种常见的情况, 在这些情况下您都需要手工告诉 FreeBSD 根文件系统模块的位置。 这是通过告诉引导加载器 BIOS 磁盘编号、磁盘类型以及 FreeBSD 中的该种磁盘的编号来实现的。

第一种情况是有两块 IDE 硬盘, 分别配置为对应 IDE 总线上的主 (master) 设备, 并希望 FreeBSD 从第二块硬盘上启动。 BIOS 将两块硬盘识别为磁盘 0 和磁盘 1, 而 FreeBSD 则将其分别叫做 ad0ad2

FreeBSD 位于 BIOS 磁盘 1, 其类型是 ad 而 FreeBSD 磁盘编号则是 2, 因此, 您应输入:

1:ad(2,a)kernel

注意, 如果您的主总线上有从设备, 则这一配置是不必要的 (因为这样配置是错的)。

第二种情况是从 SCSI 磁盘启动,但系统中安装了一个或多个 IDE 硬盘。这时,FreeBSD 磁盘编号会比 BIOS 磁盘编号小。如果您有两块 IDE 硬盘, 以及一块 SCSI 硬盘,则 SCSI 硬盘将会是 BIOS 磁盘 2, 类型为 da 而 FreeBSD 磁盘编号是 0, 因此, 您应输入:

2:da(0,a)kernel

来告诉 FreeBSD 您希望从 BIOS 磁盘 2 引导, 而它是系统中的第一块 SCSI 硬盘。 假如只有一块 IDE 硬盘, 则应以 1: 代替。

一旦您确定了应选用的正确配置, 就可以用标准的文本编辑器把它写到 /boot.config 文件中了。 除非另行指定, FreeBSD 将使用这个文件的内容, 作为对 boot: 提示的默认回应。

2.11.3.3. 在硬盘安装 FreeBSD 之后的首次启动时, Boot Manager 只是给出了 F? 的菜单提示, 但并不继续引导过程。

在您安装 FreeBSD 进行到分区编辑器时所设置的磁盘尺寸信息不对。 请回到分区编辑器并指定正确的磁盘尺寸。 这种情况必须重新安装 FreeBSD。

如果您无法确定在您机器上的正确尺寸信息,可以用一个小技巧: 在磁盘开始的地方安装一个小的 DOS 分区, 并在其后安装 FreeBSD。 安装程序能够看到这个 DOS 分区, 并利用它推测磁盘的尺寸信息, 这通常会有所帮助。

下面的技巧不再推荐使用, 在这里仅供参考:

如果您正准备建立只运行 FreeBSD 的服务器或工作站, 而无需考虑 (之后) 与 DOS、 Linux 或其他操作系统的兼容性, 也可以使用整个硬盘 (分区编辑器中的 A), 选择 FreeBSD 独占整个硬盘每一个扇区的非标准选项。 这会扫除关于磁盘尺寸的一切烦恼, 但会限制您以后运行 FreeBSD 以外的其他操作系统的能力。

2.11.3.4. 系统找到了 ed(4) 网卡, 但总是报设备超时 (device timeout) 错误。

您的网卡可能使用了与 /boot/device.hints 文件中指定的 IRQ 不同的中断请求号。 ed(4) 驱动默认情况下并不支持 “软” 配置 (在 DOS 中使用 EZSETUP 配置的值), 但如果您在网卡的 hints 中指定 -1, 便会使用软配置。

您应使用网卡的跳线进行硬配置 (根据需要修改内核设置) 或通过 hint hint.ed.0.irq="-1" 将 IRQ 指定为 -1。 这会告诉内核使用软配置。

另一个可能是您的网卡使用 IRQ 9, 这会与 IRQ 2 共用同一中断请求线, 同时也是导致问题的一个常见原因 (特别是 VGA 卡使用 IRQ 2 的时候!)。 您应尽量避免使用 IRQ 2 或 9。


2.12 高级安装指南

Contributed by Valentino Vaschetto.

  这节主要描述在一些特殊情况下如何安装FreeBSD。


2.12.1 在一个没有显示器或键盘的系统上安装FreeBSD

  这种类型的安装叫做 “headless install(无关安装)”, 因您正要安装FreeBSD的机器不是没带显示器,就是没有显卡。 您可能会问那怎么安装? 可以使用一个串行控制台。 串行控制台基本上是使用另外一台机器来充当主显示设备和键盘。 要这样做,只要执行下面的步骤:创建安装软件,请看 第 2.3.7 节一节说明。

  按下面的步骤,修改这些软盘用来引导进入一个串行控制台:

  1. 通过启动软盘来引导进入一个串行控制台

    如果您想用软盘,FreeBSD将进入它通常的安装模式。 我们要把 FreeBSD 引导进入串行控制台,需要这样做, 您必须使用 mount(8)命令在FreeBSD系统上挂接 boot.flp 的那个软盘。

    # mount /dev/fd0 /mnt
    

    现在您已经挂上了软盘, 需要进入 /mnt 目录:

    # cd /mnt
    

    这儿是您必须设置软盘引导进入串行控制台的地方。 您必须制作一个包含 /boot/loader -h 这行的叫做 boot.config 的文件。 所有这些是为了给引导程序一个标记以引导进入串行控制台。

    # echo "/boot/loader -h" > boot.config
    

    现在您已经正确配置好了软盘,您必须使用 umount(8) 命令卸下软盘。

    # cd /
    # umount /mnt
    

    现在您可以从软盘驱动器中取出软盘了。

  2. 连接您的 Null-modem 线

    您现在需要一根 null modem线 来连接两台机器。只要连接两台机器的串口。 普通的串行线是不行的, 您需要使用一根null modem的线, 因为它在一些十字交叉口有金属线。

  3. 开始启动安装

    现在开始启动安装。把 boot.flp 的那张软盘插入软盘驱动器,然后开启电源。

  4. 连接您的无头机器

    现在您已经通过cu(1)连接到了那台机器。

    # cu -l /dev/cuad0
    

    在 FreeBSD 5.X 上, 应使用 /dev/cuaa0 代替例子中的 /dev/cuad0

  就这样! 您已经能够通过您的 cu session 对话来控制那台 “无头”机器了。 它将要求您把 kern1.flp 的那张软盘插入驱动器, 然后它将提示选择使用哪种终端。 只要选择 FreeBSD 的彩色控制台, 然后继续您的安装。


2.13 准备您自己的安装介质

注意: 为了避免重复 “FreeBSD disc” 在这里指 FreeBSD CDROM or DVD 那即意味着您要购买或自己制做。

  有好几个原因需要您创建自己的FreeBSD安装介质。 这可能是物理介质,如磁带,使用 sysinstall 程序找到的安装文件, FTP 站点或 MS-DOS分区。

  例如:

  • 您有许多机器连接到本地网络,使用一个FreeBSD光盘。 您要使用FreeBSD来创建一个本地FTP站点, 然后使用这个FTP站点来代替连接到Internet。

  • 您有一张 FreeBSD 光盘, FreeBSD 不支持您的 CD/DVD 驱动器, 但 MS-DOS/Windows 支持。 您要复制安装文件到一个DOS分区, 然后使用这些文件进行安装。

  • 您要安装的计算机没有 CD/DVD驱动器和网卡,但您可以连接一个 “Laplink-style” 串口或并口线缆到那台计算机。

  • 您要通过一个磁带机来安装FreeBSD.


2.13.1 创建一张安装光盘

  FreeBSD 的每个发行版本都为每一支持的平台提供至少两张 CDROM 映像 (“ISO images”)。如果您有刻录机, 这些映像文件可以被(“burned”) 成FreeBSD的安装光盘。 如果没有刻录机,而上网带宽却很便宜,它也是一种很好的安装方式。

  1. 下载正确的 ISO 映像文件

    每个版本的ISO映像文件都可以从 ftp://ftp.FreeBSD.org/pub/FreeBSD/ISO-IMAGES-架构名/版本 或最近的镜像站点下载。选择合适的 架构版本

    目录中包含下面一些映像文件:

    表 2-4. FreeBSD 5.X 和 6.X ISO 映像文件名和含意

    文件名 包含内容
    版本-RELEASE-架构-bootonly.iso 引导 FreeBSD 内核并启动安装界面所需的全部数据。 安装文件可以从 FTP 或其他安装源获得。
    版本-RELEASE-架构名-disc1.iso 安装 FreeBSD 所需的全部文件, 以及一份用于与 sysinstall 中的 “Repair”(修复) 机制联用的 “现场文件系统”。
    版本-RELEASE-架构名-disc2.iso FreeBSD 文档 (在 FreeBSD 6.2 之前) 以及这张光盘能装下的、 尽可能多的第三方软件包。
    version-RELEASE-arch-docs.iso FreeBSD 文档 (FreeBSD 6.2 和之后的版本)。

    必须 下载 bootonly ISO 镜像 (如果有的话) 或第一张光盘的镜像之一。 不需要两个都下载, 因为第一张光盘包括了 bootonly ISO 的全部内容。

    如果访问 Internet 的价格便宜, 建议使用 bootonly ISO。 这样您可以安装 FreeBSD, 并从网上通过 ports/packages 系统 (参见 第 4 章) 根据需要下载和安装第三方软件包。

    如果您正打算安装 FreeBSD 并同时选择一些第三方软件包, 则可以下载第一张光盘的镜像文件。

    其它的映像盘也是很有用的,但不是必须的, 尤其是在您有高速的网络连接时。

  2. 刻录 CDs

    您必须把这些映像文件刻录成光盘。 如果您在其它的FreeBSD系统上完成此项工作,请看 第 18.6 节 得到更多的信息,(特别是 第 18.6.3 节第 18.6.4 节

    如果您在其它的系统平台上执行,您需要相应的刻录软件。 映像文件使用的是标准的ISO格式,必须被您的刻录软件所支持。

注意: 如果有兴趣制作一张定制的 FreeBSD 版本, 请参考 Release Engineering Article


2.13.2 为 FreeBSD 安装盘建立局域网 FTP 站点

  FreeBSD 光盘的布局和 FTP 站点相同。 这样, 建立局域网 FTP 站点来用于网络上的其它计算机安装 FreeBSD, 就十分的容易。

  1. 在要作为FTP站点的那台FreeBSD机器上, 确定FreeBSD磁盘放入光驱中并将它挂在 /cdrom 目录中。

    # mount /cdrom
    
  2. /etc/passwd 文件中建立一个可匿名访问 FTP 服务器的账号。 您可以利用 vipw(8) 命令编辑 /etc/passwd 文件, 加入下面这一行叙述:

    ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent
    
  3. 确定在 /etc/inetd.conf 配置文件中开启了FTP服务。

  任何本地网络中的机器在安装 FreeBSD 选择安装介质时就可以选择透过 FTP 站点,然后选取 “Other” 后输入 ftp://本地FTP服务器 即可以透过本地的FTP站点来安装FreeBSD。

注意: 如果用作 FTP 客户端的引导介质 (通常是软盘) 与本地局域网的 FTP 站点上的版本不一致, sysinstall 会不允许您完成安装。 如果您使用的版本差距不很大, 并且希望绕过这一判断, 则应进入 Options 菜单, 并将安装包的名字改为 any

警告: 此方式最好使用在有防火墙保护的内部网络。 如果要将此FTP服务公开给外面的网际网络(非本地用户), 您的电脑必须承担被侵入或其它的风险。 我们强烈建议您要有完善的安全机制才这样做。


2.13.3 创建安装软盘

  如果您从软盘安装(我们推荐那样做), 或者是由于不支持硬件或者更简单的理由是因为您坚持要使用软盘安装。 您必须准备几张软盘。

  至少这些软盘必须是 1.44 MB 的,用来容纳所有在 base (基本系统) 目录下的文件。如果您在 DOS 操作系统下准备就 必须 使用 MS-DOSFORMAT 命令来格式化软盘。 如果您使用的是 Windows 操作系统, 在资源管理器中就可以完成这个工作 (用右键单击 A: 驱动器,并选择 “Format”)。

  不要 指望厂家的预先格式化! 最好还是亲自进行格式化。 过去用户报告的很多问题都是由于不正确地使用格式化设备所造成的, 所以我们需要在这里着重提一下。

  如果您在另外一台FreeBSD的机器上做了启动盘的话, 进行格式化是一个不错的主意。 虽然您不需要把每张盘都做成DOS文件系统。您也可以使用 bsdlabelnewfs 命令来创建一个UFS文件系统,具体操作按下面的顺序进行:

# fdformat -f 1440 fd0.1440
# bsdlabel -w fd0.1440 floppy3
# newfs -t 2 -u 18 -l 1 -i 65536 /dev/fd0

  然后您就可以像其它的文件系统一样挂上和写入这些磁盘。

  格式化这些磁盘后,您必须把文件复制到磁盘中。 这些发行文件被分割成刚好可存进五张 1.44 MB 软盘。 检查您所有的磁盘, 找出所有可能适合的文件。 直到您找到所有需要的配置并且将它们以这种方式安置。 第一个配置都应该有一个子目录在磁盘上, 例如: a:\base\base.aaa:\base\base.ab, 等等。

重要: base.inf 文件, 也应放在 base 的第一张盘上, 因为安装程序需要读取这个文件, 以了解在获得发布包时需要下载多少文件。

  一旦您进入选择安装介质的屏幕, 选择 Floppy 将会看到后面的提示符。


2.13.4 从 MS-DOS 分区安装

  如果从 MS-DOS 分区安装, 您需要将发布文件复制到该分区根目录下的 freebsd 目录中。 例如: c:\freebsd。 您必须复制一部分 CDROM 或 FTP 上的目录结构, 因此, 如果您从光盘进行复制, 建议使用 DOS 的 xcopy 命令。 下面是准备进行 FreeBSD 最小系统安装的例子:

C:\> md c:\freebsd
C:\> xcopy e:\bin c:\freebsd\bin\ /s
C:\> xcopy e:\manpages c:\freebsd\manpages\ /s

  假设 C: 盘是您的空闲空间, E: 盘是您挂接的 CDROM。

  如果您没有光盘驱动器,您可以从以下网站下载发行包。ftp.FreeBSD.org. 每一个发行包都在一个目录中,例如 base 发行包可以在 7.0/base/ 目录中找到。

  对很多发行包来说,如果您希望从 MS-DOS分区安装的话 (您有足够的空间),安装 c:\freebsd ── 下的每个文件-这个 BIN 发行包只是最低限度的要求。


2.13.5 创建一个安装磁带

  从磁带安装也许是最简单的方式, 比在线使用 FTP 安装或使用 CDROM 还快。安装的程序假设是简单地被压缩在磁带上。 在您得到所有配置文件后,简单地解开它们,用下面的命令:

# cd /freebsd/distdir
# tar cvf /dev/rwt0 dist1 ... dist2

  在您安装的时候,您要确定留有足够的空间给临时目录(允许您选择) 来容纳磁带安装时 全部 的内容。由于不是随机访问 磁带的,所以这种安装方法需要很多临时空间。

注意: 开始安装时,在从软盘启动 之前, 磁带机必须已经放在驱动设备中。否则, 安装过程中可能会找不到它。


2.13.6 通过网络安装

  可用的网络安装类型有三种。 以太网 (标准的以太网控制器)、 串口 (SLIP 或 PPP) 以及 并口 (PLIP (laplink 线缆))。

  如果希望以最迅速的方式完成网络安装, 那么以太网适配器当然就是首选! FreeBSD 支持绝大多数常见 PC 以太网卡; 系统能够支持的网卡 (以及所需的配置) 可以在 FreeBSD 发行版附带的硬件兼容说明中找到。 如果您使用的是系统支持的 PCMCIA 以太网卡, 在为笔记本加电 之前 之前一定要把它插好! 很不幸, FreeBSD 目前并不支持在安装过程中热插 PCMCIA 卡。

  此外, 您还需要知道自己的 IP 地址、 网络类型对应的子网掩码, 以及机器名。 如果您正通过 PPP 连接安装而没有固定的静态 IP, 不用怕, 这个 IP 地址会由您的 ISP 自动分配。 您的系统管理员会告诉您进行网络配置所需的信息。 如果您需要通过名字而不是 IP 地址来访问其他主机, 则还需要配置一个域名服务器, 可能还需要一个网关地址 (在使用 PPP 时, 这个地址是服务提供商的 IP 地址)。 如果您希望通过 HTTP 代理服务器来完成 FTP 安装, 还需要知道代理服务器的地址。 如果您不知道这些信息, 则应在进行这种安装 之前 向系统管理员或 ISP 询问。

   SLIP 支持是相当原始的,并且被限制在主要对hard-wired 的连接, 就像一台膝上型计算机与另一台计算机间的串行线。 现在的SLIP的安装还没有提供拨号功能,这个连接应该是 hard-wired; 用PPP工具提供的这种便利性应该首先尽可能被用于 SLIP 设备。

  如果您使用一个 MODEM,那您就只有 PPP 这一种选择了。在您安装的过程中, 要确定您能很容易地获得完整且快速的关于您服务提供商的信息。

  如果您使用 PAP 或 CHAP 方式连接到您的 ISP, (换句话说,如果您不使用脚本在Windows中连接到您的ISP), 那么您需要在 ppp 提示符下输入 dial 命令。否则,当 PPP 连接者只提供一种最简单的终端模拟器,您必须知道如何使用针对 MODEM 的 “AT commands”拨号到您的 ISP。 想知道更深入的信息可以参考 使用手册中的用户级PPP那节 以及 FAQ 。 如果您有一些问题,可以使用 set log local ... 命令将日志显示在屏幕上。

  您也可以通过并口电缆连接到另外一台FreeBSD (2.0或以后的版本)机器上进行安装,您可以考虑使用 “laplink” 并口电缆进行安装。通过并口安装要比通过串口 (最高 50 kbytes/sec)安装快得多。


2.13.6.1 通过NFS安装之前

  NFS 安装方式是非常方便的。只需要简单地将 FreeBSD 文件复制到一台服务器上,然后在安装时选择NFS介质。

  如果这个服务器要 “特权端口” 才能支持 (如SUN的工作站),您需要在安装前在 Options 菜单中设置 NFS Secure

  如果你使用了一块低质量的以太网卡比较糟糕, 速度很慢,则应考虑 NFS Slow的选项。

  为了达到NFS安装的目的,这个服务器必须支持 subdir 加载。 例如,如果您的 FreeBSD 7.0 目录存在: ziggy:/usr/archive/stuff/FreeBSD,然后 ziggy 将必须允许直接挂上 /usr/archive/stuff/FreeBSD,而不仅仅是 /usr/usr/archive/stuff

  在 FreeBSD的 /etc/exports 配置文件中, 是由 -alldirs 选项来控制的。其它 NFS 服务器也许有不同的方式。如果您从服务器得到 “permission denied” 这个信息, 可能是因为您没有正确的启用它。


第3章  UNIX 基础

Rewritten by Chris Shumway.

3.1 概述

  下列章节的命令和功能适用于FreeBSD操作系统。 同时这里许多内容和一些 类-UNIX 操作系统相关。 假如您已经熟悉这些内容可跳过不阅读。 假如您是FreeBSD新手, 那您应该认真详细地从头到尾读一遍这些章节。

  读取这些内容,您将了解:

  • 怎样在FreeBSD使用 “虚拟控制台”。

  • UNIX 中文件权限如何运作, 以及理解 FreeBSD 中的文件标志。

  • FreeBSD 默认文件系统的架构。

  • FreeBSD磁盘架构。

  • 怎样挂接或卸下文件系统。

  • 什么是进程、守护进程、信号。

  • 什么是shell,应当怎样去改变登录进入的默认环境。

  • 怎样使用基本的文本编辑器。

  • 什么是设备,什么是设备节点。

  • FreeBSD 下,使用的是什么可执行文件格式。

  • 怎样使用 man 手册并取得更多资讯。


3.2 虚拟控制台和终端

  可以用多种不同的方式使用 FreeBSD, 在文本终端输入命令是其中之一。 通过使用这种方式, 您可以容易地使用 FreeBSD 来获得 UNIX 操作系统的灵活而强大的功能。 这一节将介绍 “终端” 和 “控制台”, 以及如何在 FreeBSD 中使用它们。


3.2.1 控制台

  假如您没有设置 FreeBSD 在启动期间开启图形登录界面, 那么系统将在引导和启动脚本正确运行完成后,给您一个登录的提示。 您会看到类似这样的界面:

Additional ABI support:.
Local package initialization:.
Additional TCP options:.

Fri Sep 20 13:01:06 EEST 2002

FreeBSD/i386 (pc3.example.org) (ttyv0)

login:

  这些信息可能和您的系统稍微有点不同,但不会有很大差别。 最后两行是我们感兴趣的, 理解这一行:

FreeBSD/i386 (pc3.example.org) (ttyv0)

  这一行是您刚才启动的系统信息其中一块, 您所看到的是一个“FreeBSD”控制台, 运行在一个Intel或兼容的x86体系架构上面[1]。 这台计算机的名字 (每台 UNIX 计算机都有自己的名字) 叫 pc3.example.org, 就是现在这个系统控制台──这个 ttyv0 终端的样子。

  在最后,最后一行一直保持这样:

login:

  这里, 您将可以输入用户名 “username” 并登录到 FreeBSD 系统中。 接下来的一节, 将介绍如何登录系统。


3.2.2 进入FreeBSD

  FreeBSD是一个多用户多任务的系统, 换句话来说就是一个系统中可以容纳许多不同的用户, 而这些用户都可以同时在这台机器中运行大量的程序。

  每一个多用户系统都必须在某方面去区分 “user”, 在 FreeBSD 里 (以及 类-UNIX 操作系统), 完成这方面工作是有必要的, 因而, 每位使用者在运行程序之前都必须首先 “登录”, 而每位用户都有与之对应的用户名 (“username”) 和密码 (“password”)。 FreeBSD 会在用户进入之前作出询问这两项信息。

  当 FreeBSD 引导并运行完启动脚本之后, [2], 它会给出一个提示, 并要求输入有效的用户名:

login:

  举个例子更容易理解,我们假设您的用户名叫 john。 在提示符下输入 john 并按 Enter, 此时您应该看到这个提示 “password”:

login: john
Password:

  现在输入 john的密码并按下 Enter。 输入密码时是 不回显的! 不必为此担心, 这样做是出于安全考虑。

  假如您输入的密码是正确的, 这时你应该已进入 FreeBSD, 并可以开始尝试可用的命令了。

  您应该看见 MOTD 或者出现一个命令提示符 (#$% 字符). 这表明您已成功登录进入FreeBSD。


3.2.3 多个控制台

  在一个控制台运行 UNIX 命令虽说很好, 但 FreeBSD 具有一次运行 多个程序的能力。 仅使用一个控制台只会浪费 FreeBSD 同时运行多任务的能力。 而 “虚拟控制台” 在这方面发挥强大的功能。

  FreeBSD 能配置出满足您不同需求的虚拟控制台, 在键盘上您用一组键就能从各个虚拟控制台之间切换。 各个控制台有自己的传输通道, 当您在各个控制台切换时 FreeBSD 会切换到合适的键盘传输通道和显示器传输通道。

  FreeBSD 各个控制台之间可利用特殊组键切换并保留原有控制台 [3],您可这样做: Alt-F1Alt-F2, 一直到 Alt-F8 在FreeBSD里切换到其中一个虚拟控制台。

  同样地, 您正在从其中某个控制台切换到另一个控制台的时候, FreeBSD 会保存正在使用和恢复将要使用屏幕传输通道。 这种结果形成一种 “错觉”, 您拥有许多“虚拟”屏幕和键盘可以输入很多的命令。 这些程序需要在一个虚拟控制台不能停止运行而又不需要观察它, 它继续运行而您可以切换到其他的虚拟控制台。


3.2.4 /etc/ttys文件

  FreeBSD 虚拟控制台的默认配置为8个,但并不是硬性设置, 您可以很容易设置虚拟控制台的个数增多或减少。 虚拟控制台的的编号和设置在 /etc/ttys 文件里。

  您可以使用 /etc/ttys 文件在 FreeBSD 下配置虚拟控制台。 文件里每一未加注释的行都能设置一个终端或虚拟控制台 (当行里含有 # 这个字符时不能使用) 。 FreeBSD 默认配置是配置出9个虚拟控制台而只能启动8个, 以下这些行是 ttyv 一起启动:

# name  getty                           type    status          comments
#
ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv3   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv4   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv5   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv6   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv7   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure

  如果要了解这个文件中每一列的详细介绍, 以及虚拟控制台上所能使用的配置, 请参考联机手册 ttys(5)


3.2.5 单用户模式的控制台

  关于 “单用户模式” 详细介绍在 第 12.6.2 节 这里可以找到。 当您运行单用户模式时只能使用一个控制台, 没有多个虚拟控制台可使用。 单用户模式的控制台同也可以在 /etc/ttys 文件设置, 可在这行找到要启动的控制台

# name  getty                           type    status          comments
#
# If console is marked "insecure", then init will ask for the root password
# when going to single-user mode.
console none                            unknown off secure

注意: 这个 console 已经注释掉, 您可编辑这行把 secure 改为 insecure。 这样, 当用单用户进入 FreeBSD 时, 它仍然要求提供 root 用户的密码。

在把这个选项改为 insecure 的时候一定要小心, 如果您忘记了 root用户的密码, 进入单用户会有点麻烦。 尽管仍然能进入单用户模式, 但如果您不熟悉它就会非常令人头疼。


3.2.6 改变控制台的显示模式

  FreeBSD 控制台默认的显示模式可以被调整为 1024x768, 1280x1024, 或者任何你的显卡芯片和显示器所支持的其他尺寸。 要使用一个不同的显示模式, 你必须首先重新编译内核并包含以下2个选项:

options VESA
options SC_PIXEL_MODE

  在内核用这2个选项编译完成后,你就可以使用 vidcontrol(1) 工具来测定你的硬件支持何种显示模式了。 以 root 身份在控制台键入以下命令来获得一份所支持的显示模式列表。

# vidcontrol -i mode

  这个命令的输出是一份你的硬件所支持的显示模式列表。 你可以在以 root 身份在控制台上键入 vidcontrol(1) 命令来改变显示模式:

# vidcontrol MODE_279

  如果你对于新的显示模式满意,那么可以把它加入到 /etc/rc.conf 使机器在每次启动的时候都能生效, 我们使用了上一个例子中的模式:

allscreens_flags="MODE_279"

3.3 权限

  FreeBSD,是 BSD UNIX 的延续, 并基于几个关键的 UNIX 观念。 从一开始就多处提到 FreeBSD 是一个多用户的操作系统, 它能分别处理几个同时工作的用户所分配的毫无关联任务。 并负责为每位用户的硬件设备、 外设、 内存和 CPU 处理时间作出合理安排。

  因为系统有能力支持多用户, 在每一方面系统都会作出谁能读、 写和执行的资源权力限制。 这点权限以三个八位元的方式储存着, 一个是表示文件所属者, 一个是表示文件所属群组, 一个是表示其他人。 这些数字以下列方式表示:

数值 权限 目录列表
0 不能读,不能写,不能执行 ---
1 不能读,不能写,可执行 --x
2 不能读,可写,不能执行 -w-
3 不能读,可写,可执行 -wx
4 可读,不能写,不能执行 r--
5 可读,不能写,可执行 r-x
6 可读,可写,不能执行 rw-
7 可读,可写,可执行 rwx

  使用命令的 -l (ls(1)) 参数可以显示出文件的所属者、 所属组和其他人等属性。 请看以下的例子:

% ls -l
total 530
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
-rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
...

  使用 ls -l 在每行的开始出现了:

-rw-r--r--

  从左边起的第一个字,告诉我们这个文件是一怎样的文件: 普通文件?目录?特殊设备?socket?或是设备文件? 在这个例子, - 表示一个普通文件。 接下来三个字是 rw- 是文件拥有者的权限。 再接下来的三个字是 r-- 是文件所属群组的权限。 最後三个字是 r-- 是其他人的权限。 以这一个文件为例,他的权限设定是拥有者可以读写这个文件、群组可以读取、 其他使用者也能读取这个文件。 根据上面的表格, 用数字表示这个文件其三部分的权限应该是 644

  这样很好,但系统怎样对设备进行权限控制的? 事实上 FreeBSD 将大部份硬件设备当作一个文件看待, 用程序能打开、读取、写入数据就如其他的文件一样。 而设备文件放在 /dev 目录。

  目录也视为一种文件,也有读取、写入、执行的权限。 但目录的执行权限意义并不与普通文件相同, 实际上执行权限是进入权限。 当一个目录是被标示可以执行的时, 表示可以进入它, 或者换言之, 利用 “cd” (改变当前目录) 进入它。 此外, 这也表示有权进入目录的用户, 可以访问其下的已知名字的文件 (当然目录下的文件也受到访问限制)。

  详细方面,想读取一个目录的列表就必须设为可读权限, 同时想删除一个已知的文件,就必须把目录下这个文件设为可写 执行权限。

  还有更多权限设定, 但是他们大多用在特殊状况下如一个setuid的执行文件和粘贴性目录, 如果想要得知有关文件权限和如何设定的更多资讯,请看手册chmod(1)


3.3.1 权限的符号化表示

Contributed by Tom Rhodes.

  权限符号,某些时候就是指符号表达式, 使用八进制的字符给目录或文件分配权限。 权限符号的使用语法是 (谁) (作用) (权限)。 看看下列数值的在那些地方所起什么样的作用:

选项 字母 介绍
(谁) u 用户
(谁) g 所属群体
(谁) o 其他人
(谁) a 所有人 (“全部”)
(作用) + 增加权限
(作用) - 减少权限
(作用) = 确定权限
(权限) r 可读
(权限) w 可写
(权限) x 执行
(权限) t 粘贴位
(权限) s 设置 UID 或 GID

  这些数值 chmod(1) 以习惯标定的。 举个例子,用以下命令阻止其他人访问 FILE文件:

% chmod go= FILE

  如果需要对文件一次进行多项变动, 则可用逗号分开, 在下面的例子中, 将去掉 FILE 文件的群体和 “全体其他用户” 可写权限, 并为所有人增加可执行权限:

% chmod go-w,a+x FILE

3.3.2 FreeBSD 文件标志

Contributed by Tom Rhodes.

  在前面所介绍的文件权限的基础之上, FreeBSD 还支持使用 “文件标志”。 这些标志为文件提供了进一步的安全控制机制, 但这些控制并不适用于目录。

  这些文件标志提供了针对文件的进一步控制, 帮助确保即使是 root 用户也无法删除或修改文件。

  文件标志可以通过使用 chflags(1) 工具来修改, 其用户界面很简单。 例如, 要在文件 file1 上应用系统禁删标志, 应使用下述命令:

# chflags sunlink file1

  要禁用系统禁删标志, 只需在前述命令中的 sunlink 标志前加 “no”。 例如:

# chflags nosunlink file1

  要显示文件上的标志, 应使用命令 ls(1)-lo 参数:

# ls -lo file1

  输出结果应类似于:

-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

  许多标志只可以由 root 用户来增加, 而另一些, 则可以由文件的所有者来增加。 建议管理员仔细阅读 chflags(1)chflags(2) 联机手册, 以对其加深理解。


3.4 目录架构

  理解 FreeBSD 的目录层次结构对于建立对系统整体的理解十分重要的基础。 其中, 最重要的概念是根目录, “/”。 这个目录是系统引导时挂接的第一个目录, 它包含了用以准备多用户操作所需的操作系统基础组件。 根目录中也包含了用于在启动时转换到多用户模式之前挂接其他文件系统所需的挂接点。

  挂接点 (mount point) 是新增的文件系统在接入现有系统时的起点位置 (通常是根目录)。 在 第 3.5 节 对此进行了详细的阐述。 标准的挂接点包括 /usr/var/tmp/mnt, 以及 /cdrom。 这些目录通常会在 /etc/fstab 文件中提及。 /etc/fstab 是一张包含系统中各个文件系统及挂接点的表。 在 /etc/fstab 中的绝大多数文件系统都会在启动时由 rc(8) 脚本自动挂接, 除非特别指定了 noauto 选项。 更多细节请参考 第 3.6.1 节

  您可以通过 hier(7) 来了解完整的文件系统层次说明。 现在, 让我们先来看一看绝大多数的常见的目录以供参考。

  

目录 介绍
/ 文件系统的根目录。
/bin/ 在单个用户和多用户环境下的基本工具目录。
/boot/ 在操作系统在启动加载期间所用的程序和配置。
/boot/defaults/ 默认每步引导启动的配置内容,请查阅loader.conf(5)
/dev/ 设备节点,请查阅 intro(4)
/etc/ 系统启动的配置和脚本。
/etc/defaults/ 系统默认的启动配置和脚本,请参考 rc(8)
/etc/mail/ 关系到邮件系统运作的配置, 请参考 sendmail(8)
/etc/namedb/ named 配置文件,请参考 named(8)
/etc/periodic/ 每天、每星期和每月周期性地运行的脚本, 请通过 cron(8)查阅 periodic(8)
/etc/ppp/ ppp配置文件,请查阅ppp(8)
/mnt/ 由管理员习惯使用挂接点的临时空目录。
/proc/ 运行中的文件系统,请参阅 procfs(5)mount_procfs(8)
/rescue/ 用于紧急恢复的一组静态联编的程序; 参见 rescue(8)
/root/ root用户的Home(主)目录。
/sbin/ 在单个用户和多用户环境下的存放系统程序和管理所需的基本实用目录。
/tmp/ 临时文件。 /tmp 目录中的内容, 一般不会在系统重新启动之后保留。 通常会将基于内存的文件系统挂在 /tmp 上。 这一工作可以用一系列 tmpmfs 相关的 rc.conf(5) 变量来自动完成。 (或者, 也可以在 /etc/fstab 增加对应项; 参见 mdmfs(8))。
/usr/ 存放大多数用户的应用软件。
/usr/bin/ 存放实用命令,程序设计工具,和应用软件。
/usr/include/ 存放标准 C include 文件.
/usr/lib/ 存放库文件。
/usr/libdata/ 存放各种实用工具的数据文件。
/usr/libexec/ 存放系统实用或后台程序 (从另外的程序启动执行)。
/usr/local/ 存放本地执行文件, 库文件等等, 同时也是 FreeBSD ports 安装的默认安装目录。 /usr/local/usr 中的目录布局大体相同, 请查阅 hier(7)。 但 man 目录例外, 它们是直接放在 /usr/local 而不是 /usr/local/share 下的, 而 ports 说明文档在 share/doc/port
/usr/obj/ 通过联编 /usr/src 得到的目标文件。
/usr/ports 存放 FreeBSD 的 Ports Collection (可选)。
/usr/sbin/ 存放系统后台程序 和 系统工具 (由用户执行)。
/usr/share/ 存放架构独立的文件。
/usr/src/ 存放 BSD 或者本地源码文件。
/usr/X11R6/ 存放 X11R6 可执行文件、 库文件、 配置文件等的目录(可选)。
/var/ 多用途日志、 临时或短期存放的, 以及打印假脱机系统文件。 有时会将基于内存的文件系统挂在 /var 上。 这一工作可以通过在 rc.conf(5) 中设置一系列 varmfs 变量 (或在 /etc/fstab 中加入一行配置; 参见 mdmfs(8)) 来完成。
/var/log/ 存放各种的系统记录文件。
/var/mail/ 存放用户mailbox(一种邮件存放格式)文件。
/var/spool/ 各种打印机和邮件系统spooling(回环)的目录。
/var/tmp/ 临时文件。 这些文件在系统重新启动时通常会保留, 除非 /var 是一个内存中的文件系统。
/var/yp NIS 映射。



3.5 磁盘组织

  FreeBSD 查找文件的最小单位是文件名。 而文件名区分大小写,这就意味着 readme.txtREADME.TXT 是两个不相同的文件。 FreeBSD 不凭文件扩展名 (.txt) 去识别这个文件是 程序、 文档, 或是其他格式的数据。

  各种文件存放在目录里。 一个目录可以为空, 也可以含有多个的文件。一个目录同样可以包含其他的目录, 允许您在一个目录里建立多个不同层次的目录。 这将帮助您轻松地组织您的数据。

  文件或目录是由文件名或目录名,加上斜线符号 /, 再根据需要在目录名后面加上其他目录的名称。 如果您有一个名为 foo 的目录, 它包含另一个目录 bar, 后者包括一个叫 readme.txt 的文件, 则全名, 或者说到文件的 路径 就是 foo/bar/readme.txt

  在文件系统里目录和文件的作用是存储数据。 每一个文件系统都有且只有一个顶级目录 根目录, 这个根目录则可以容纳其他目录。

  您也许在其他的一些操作系统碰到类似这里的情况, 当然也有不同的情况。 举些例子, MS-DOS 是用 \ 分隔文件名或目录名, 而 Mac OS® 则使用:

  FreeBSD在路径方面不使用驱动器名符号或驱动器名称, 在FreeBSD里您不能这样使用: c:/foo/bar/readme.txt

  为了代替(驱动器名符号), 一个文件系统会指定 根 文件系统, 根文件系统的根目录是 /。 其他每一个文件系统 挂接在根文件系统下。 无论有多少磁盘在FreeBSD 系统里, 每个磁盘都会以目录的方式加上。

  假设您有三个文件系统, 名为 ABC。 每个文件系统有一个根目录, 而各自含有两个其他的目录, 名为 A1, A2 ( B1, B2C1, C2)。

  看看 A 这个根文件系统。 假如您用 ls 命令来查看这个目录您会见到两个子目录: A1A2。 这个目录树是这个样子:

  一个文件系统必须挂到另一个文件系统的某一目录, 所以现在假设把 B 文件系统挂到 A1目录, 那 B 根目录因此代替 了 A1,而显示出 B 目录(的内容):

  无论B1B2 目录在那里而延伸出来的路径必须为 /A1/B1/A1/B2。 而在 /A1 里原有的文件会临时隐藏。 想这些文件再出现把 B 从 A 挂接释放

  所有在B1B2 目录里的文件都可以通过 /A1/B1/A1/B2 访问。而在 /A1 中原有的文件会被临时隐藏,直到 B 从 A 上被卸载 (unmout) 为止。

  把 B 挂接在 A2 那图表的样子就是这样子:

  这个路径分别是 /A2/B1/A2/B2

  文件系统能把顶部挂接在另一个文件系统上。 继续这个例子, 把 C 文件系统挂接在 B 文件系统里的 B1 目录, 排列如下:

  或者把 C 文件系统挂接在 A 文件系统里的A1目录:

  假如您熟悉 MS-DOS 并知道 join 命令, 尽管不相同,其实功能是相似的。

  这方面不是普通知识而且涉及到您自己所关心的, 当您安装FreeBSD并在以后添加新磁盘时, 您必须知到该如何新建文件系统和挂接上。

  (FreeBSD系统)它有一个主要的根文件系统, 不需要另外新建立, 但当需要手工处理时,这是一个有用的知识。

多个文件系统的益处

  • 不同的文件系统可用不同的 挂接参数。 举些例子, 仔细想一下, 根文件系统能用只读的方式挂接上, 防止不经意删除或编辑到一个危险的文件。 把各用户能写入的文件系统分开, 像/home这样, 由另外的文件系统分别用 nosuid 参数挂接,这个参数防止 suid/guid 在执行这个文件系统中的文件时生效, 从而缓解了一些安全问题。

  • FreeBSD 能根据一个文件系统使用的情况自动优化 这个文件系统上的文件布局。 所以对一个存储了大量小文件并会被频繁写入文件系统的优化与一个存储了少量大文件的优化是不同的。 而在一个大的单一文件系统上则无法体现这样的优化。

  • FreeBSD 的文件系统能够在断电时尽可能避免损失。 然而, 在关键点时的电源失效仍然可能会破坏文件系统的结构。 将您的文件系统分成多个有助于分散风险, 并方便备份和恢复。

单一文件系统的益处

  • 文件系统是固定大小的。 当安装FreeBSD时新建一个文件系统并设定一个大小, 您会在稍后发觉到必须去建一个大的分区。 如果配置不当, 则需要备份、 重新创建文件系统, 然后再恢复数据。

    重要: FreeBSD 提供了 growfs(8) 命令。 这使得能够实时地调整文件系统的大小, 因而不再受其限制。

  文件系统是和分区一一对应的。 这里的分区和常用的术语分区 (例如, MS-DOS 分区) 的意思并不一样, 这是由于 FreeBSD 的 UNIX 传统造成的。 每一个分区使用一个从 ah 的字母来表示。 每个分区只能包含一个文件系统, 这意味着文件系统通常可以由它们在文件系统目录结构中的挂接点, 或对应的分区字母来表示。

  FreeBSD 的 交换分区 也需要使用磁盘空间。 交换分区是给 FreeBSD 作 虚拟内存 使用的, 这样能令您的计算机有更多的内存可使用, 当FreeBSD在运行而内存不够的时候, 它会把其他一些可转移的数据转移到交换分区, 空出内存的位置以供使用。

  某些 partitions 的用途是确定的。

分区 约定
a 通常指定为根文件系统
b 通常指定为交换分区
c 通常它和所在的 slice 大小相同。 c 分区上工作时必定会影响到事整个 slice (举个例子,坏块扫描器)。 您通常不愿意在这个partition建立文件系统。
d 分区 d 曾经有特殊的含义, 不过这种意义在现时的系统上已不再适用, 因此 d 可以和任何其它普通的分区一样使用了。

  每一个包含了文件系统的分区被保存在 FreeBSD 称为 slice 的部分上。 Slice 是一个 FreeBSD 术语, 通常被叫做分区, 再次强调, 这是由于 FreeBSD 的 UNIX 背景。 Slices 有其编号, 从1到4。

  Slice 编号在设备名后面, 并有一个 s 前缀, 从 1 开始。 因此 “da0s1” 是第一个 SCSI 驱动器的第一个 slice。 每个磁盘上只能有四个物理的 slices, 但您可以在物理 slice 中使用适当的类型来创建逻辑 slice。 这些扩展 slice 编号从 5 开始, 因此 “ad0s5” 是第一个 IDE 磁盘中的第一个 扩展 slice。 文件系统所使用的设备应该占满 slice。

  Slices, “专用指定” 物理驱动器, 和其他驱动器都包含 partitions, 那几个的 partitions 都是用字母从 ah 来标定的, 而这些字母都在驱动器名字之后,所以 “da0a” 是指首个da设备的 a partition, 而那个就是 “专项指定”。 “ad1s3e” 是指IDE磁盘上第三个slice的第五个partition。

  最终,每个磁盘都被系统识别。 一个磁盘名字是用磁盘类型代码和编号来标识的, 它不像slices,磁盘的编号是由0开始的。 对应代码请看这里所列出的表 3-1

  当在 FreeBSD 中指定 partition 名字时, 必须同时包含这个分区的 slice 和磁盘的名字; 类似地, 在指定 slice 时, 也应该给出包含该 slice 的磁盘名字。 可这样列出: 磁盘名称,s,slice 编号,和partition标定字母。 例子请看 例 3-1

  例 3-2 这里显示了一个磁盘的布局,有更清楚的帮助。

  在安装FreeBSD时,您首先要配置好磁盘slices, 然后在FreeBSD使用的slice上建立partitions。 并在每个partition上建立一个文件系统(或交换分区), 和指定文件系统的挂接位置。

表 3-1. 磁盘设备的代码

代码 说明
ad ATAPI (IDE) 磁盘
da SCSI 直接存取磁盘
acd ATAPI (IDE) 光驱
cd SCSI 光驱
fd 软驱

例 3-1. 样例磁盘, Slice, 和 Partition 它们的命名

命名 说明
ad0s1a 在首个IDE磁盘(ad0)上的 第一个slice (s1)里的 第一个partition (a)。
da1s2e 在第二个SCSI磁盘(da1)上的 第二个slice(s2)里的 第五个partition(e)。

例 3-2. 一个磁盘的布局

从在系统里的首个IDE磁盘图表可以显示出FreeBSD的见解。 假设磁盘大小为4 GB,它里面包含了两个2 GB 大小的slices (但在MS-DOS叫partitions)。 首个slice是一个MS-DOS磁盘叫C:, 而第二个slice是FreeBSD配置好的slice。 FreeBSD配置好的slice有三个partitions和另一个交换分区。

这三个partitions各自控制一个文件系统。 partitiona 用于根文件系统, partitione 用于 /var 目录层, partitionf 用于 /usr 目录层。


3.6 文件系统的挂接和卸下

   这种文件系统就像一棵树那样用/确立根部, 是比较理想的文件系统。 而/dev/usr 和其他目录就是根目录的分枝, 另外这些目录可以再分枝,例如/usr/local

  应该考虑给某些目录一些空间从而分散文件系统。 /var 之下包含目录 log/,目录spool/, 和不同类型的临时文件,很可能把它塞满。 把什么都塞进根文件系统不是一个好主意, 好的做法是应该把 /var/分离出去。

  另一个要考虑的是,给物理设备或虚拟磁盘这些自带空间的文件系统确定目录结构树。 例如 网络文件系统 或光驱的挂接。


3.6.1 fstab 文件

  在 引导过程 期间, 自动挂上/etc/fstab所列出的文件系统。 (除非他们注明为noauto 选项)。

   /etc/fstab 文件包含的各行的列表格式如下:

device       /mount-point fstype     options      dumpfreq     passno
device

设备名称(设备必须存在), 说明在 第 18.2 节.

mount-point

目录 (目录必须存在), 用在那个挂接上的文件系统上。

fstype

文件系统类型,请通过mount(8)查阅。 默认的FreeBSD文件系统类型是ufs

options

设为可读写文件系统的rw选项, 或设为只读文件系统的ro选项, 或其他一些选项,可随意选一个。 一个常用的选项 noauto 用在不需在引导过程期间挂接的文件系统。 其他的选项在 mount(8) 手册里列出。

dumpfreq

dump(8) 使用这项去决定那个文件系统必须移贮。 假如缺少这项,默认的数值为0。

passno

这一项决定文件系统的检查顺序, 文件系统想跳过检查应将passno设为0。 根文件系统(那个是在每方面开始之前必须检查的) 应该将它的 passno 设为1, 其他文件系统的 passno 必须把数值设到大于1。假如多个文件系统的passno的值相同, 那么 fsck(8) 在允许的情况下将尝试并行地去检查文件系统。

  请参阅 fstab(5) 联机手册, 以获得关于 /etc/fstab 文件格式, 以及其中所包含的选项的进一步信息。


3.6.2 mount 命令

  这个 mount(8) 命令是挂接文件系统的基本运用。

  使用最多的基本格式:

# mount device mountpoint

  它的选项非常多,而mount(8) 手册同样提及, 但常用的都在这里:

挂接的各种选项

-a

挂接/etc/fstab里所有列出的文件系统。 除非标记为 “noauto” 或作了排除在外的 -t 类型标记,或者在这之前已挂上。

-d

除了实际上系统调用以外,可以完成任何事情,这个选项是和 -v参数一起连在一块使用,可以决定mount(8)所做的事情。

-f

强制去挂接一个未知的文件系统(会有危险), 或当把一个文件系统挂接状态由可读写降为只读时,强制撤消可写通道。

-r

以只读方式挂接文件系统。 这和在指定了 -o 选项配合 ro (对于 FreeBSD 5.2 之前的版本来说, 则是 rdonly) 参数的效果是一样的。

-t fstype

根据给出的文件系统类型挂接文件系统, 假如给于-a选项,仅挂接这个类型的文件系统。

“ufs” 是默认的文件系统类型。

-u

在文件系统上修改挂接选项。

-v

版本模式。

-w

以可读写方式挂接文件系统。

  The -o 选项采用一个逗号分开以下多个选项:

noexec

不允许文件系统上的二进制程序执行。这也是一个有用的安全选项。

nosuid

不允许文件系统上的 setuid 或 setgid 标记生效。这也是一个有用的安全选项。


3.6.3 umount 命令

  umount(8) 命令同样采用一个参数、一个挂接点、一个设备名。 或采用-a选项,又或采用-A选项。

  所有格式都可采用 -f 去强行卸下, 或采用-v 用那适当的版本。 但警告,采用 -f并不是一个好主意, 强行卸下文件系统可能损坏计算机或破坏文件系统上的数据。

  -a-A 会卸下所有已挂接的文件系, 可能通过-t后面列出的文件系统进行修改, 但无论如何,-A都不会尝试去卸下根文件系统。


3.7 进程

  FreeBSD 是一个多任务操作系统。 这就意味着好像一次可以运行一个以上的程序。 每个占用一定时间运行的程序就叫 进程 (process)。 你运行的每一个命令会至少启动一个新进程,还有很多一直运行着的系统进程, 用以维持系统的正常运作。

  每个进程用来标识的一个编号就叫 进程 ID, 或叫 PID。 而且,就像文件那样,每个进程也有所属用户和所属群体。 所属用户和所属群体使用在这方面:确定这个进程可以打开那些文件和那些设备, 从而在初期使用文件的权限。 多数的进程都有一个父进程, 而进程是依靠父进程来启动的。 例如,假如您把命令输入到shell里那shell是一个进程,而您运行的各个命令同样是进程, 那么,shell就是您各个运行进程的父进程。 而这方面有一个例外的进程就叫init(8)init始终是首个进程,,所以他的PID始终是1, 而init在FreeBSD起动时由内核自动启动。

  在系统上,有两个命令对进程观察非常有用:ps(1)top(1)。 这个ps命令作用是观察当前运行进程的状态, 显示他们的PID,使用了多少内存,它们启动的命令行。 而top命令则是显示所有运行进程,并在以秒计的短时内更新数据。 您能交互式的观察您计算机的工作。

  默认情况下, ps仅显示出您自己所运行的命令。 例如:

% ps
  PID  TT  STAT      TIME COMMAND
  298  p0  Ss     0:01.10 tcsh
 7078  p0  S      2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
37393  p0  I      0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
48630  p0  S      2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
48730  p0  IW     0:00.00 (dns helper) (navigator-linux-)
72210  p0  R+     0:00.00 ps
  390  p1  Is     0:01.14 tcsh
 7059  p2  Is+    1:36.18 /usr/local/bin/mutt -y
 6688  p3  IWs    0:00.00 tcsh
10735  p4  IWs    0:00.00 tcsh
20256  p5  IWs    0:00.00 tcsh
  262  v0  IWs    0:00.00 -tcsh (tcsh)
  270  v0  IW+    0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
  280  v0  IW+    0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
  284  v0  IW     0:00.00 /bin/sh /home/nik/.xinitrc
  285  v0  S      0:38.45 /usr/X11R6/bin/sawfish

  在这个例子里您可看到,从 ps(1) 输出的每一列是有规律的。 PID 就是进程ID,这个较早前已讨论过了。 PID号的分配由 1一直上升直到99999, 当您运行到超过限制时,这些编号会回转分配 (仍在使用中的 PID 不会分配给其他进程)。 TT这一列显示了程序运行所在的终端, 目前可以安全地忽略。 STAT 显示程序的状态,也可以安全地被忽略。 TIME是程序在CPU处理时间──运行的时间量, 并不是指您程序启动到现在的所用的时间。 许多程序碰巧遇到某方面在他们之前要花费大量CPU处理时间时,他们就必须等候。 最后, COMMAND 是运行程序时使所用的命令行。

  ps(1)支持使用各种选项去改变显示出来的内容, 最有用的一个就是auxwwa选项显示出所有运行进程的内容, 而不仅仅是您的进程。 u选项显示出进程所归属的用户名字以及内存使用, x 选项显示出后台进程。 而 ww 选项表示为 ps(1) 把每个进程的整个命令行全部显示完, 而不是由于命令行过长就把它从屏幕上截去。

  下面和从top(1)输出是类似的,一个示例式对话就象这样子:

% top
last pid: 72257;  load averages:  0.13,  0.09,  0.03    up 0+13:38:33  22:39:10
47 processes:  1 running, 46 sleeping
CPU states: 12.6% user,  0.0% nice,  7.8% system,  0.0% interrupt, 79.7% idle
Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
Swap: 256M Total, 38M Used, 217M Free, 15% Inuse

  PID USERNAME PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU COMMAND
72257 nik       28   0  1960K  1044K RUN      0:00 14.86%  1.42% top
 7078 nik        2   0 15280K 10960K select   2:54  0.88%  0.88% xemacs-21.1.14
  281 nik        2   0 18636K  7112K select   5:36  0.73%  0.73% XF86_SVGA
  296 nik        2   0  3240K  1644K select   0:12  0.05%  0.05% xterm
48630 nik        2   0 29816K  9148K select   3:18  0.00%  0.00% navigator-linu
  175 root       2   0   924K   252K select   1:41  0.00%  0.00% syslogd
 7059 nik        2   0  7260K  4644K poll     1:38  0.00%  0.00% mutt
...

  这个输出分成两部份。 前面部份(起始前五行) 显示了:运行于最后进程的PID、 系统负载均衡 (那个是指系统繁忙时的调节方式)、 系统正常运行时间 ( 指从启动算起所用的时间) 和当前时间。 前面部份另外的图表 涉及:多少进程在运行(这个情况是47), 多少内存和多少交换分区在使用, 和在不同CPU状态里系统消耗多少时间。

  在那下面一连串的纵列和从ps(1)输出的的内存是相似的。 如以前ps(1)一样,您能见到:PID、用户名、CPU处理时间合计、运行的命令。 top(1)默认是显示您的进程所用内存空间的合计。 内存空间这里分成两列,一列为总体大小,另一列是必须请求驻留大小是多少内存──总体大小。 而驻留大小实际上是瞬间使用的多少。 在以上那个例子,您会看到那Netscape®总计需要30 MB内存, 但实际只用了9 MB。

  top(1) 每两秒自动刷新一次,您可以用s改变刷新的秒数。


3.8 守护进程,信号和杀死进程

  当您运行一个编辑器时它是很容易控制的,告诉它去加载文件它就加载。 您之所以能这样做,是因为编辑器提供这样便利去这样做,和因为有编辑器去附上的终端。 一些程序在运行中不需要连续的用户输入,一有机会就从终端里分离到后台去。 例如,一个web系统整天都在作web请求的响应,他不需要您输入任何东西就能完成, 这个类别的另一个例子就是把email的传送。

  我们把那些程序叫 守护进程。 守护神是希腊神话中的一些人物,非正非邪,他们是些守护小精灵, 大体上为人类作出贡献。 许多类似web服务或mail服务的系统对于今天仍有用途, 这就是为什么在那么长的时间里,BSD的吉祥物保持为一双鞋加一把钢叉的守护神模样。

  守护进程的程序命名通常在最后加一个 “d”。 BIND 是伯克利互联网域名服务 (而实际执行的程序名称则是 named), Apache web系统的程序就叫 httpd, 在行式打印机上的打印守护进程就是 lpd。 这只是一种惯例,不是标准或硬性规定。 例如,为Sendmail而应用的主要mail守护进程就叫sendmail, 却不叫maild,这和您推测的一样。

  有时可能会需要与守护进程进行通讯。 而 信号 则是其中的一种通讯机制。 可以发送信号给守护进程 (或相关的另一些进程) 来与它进行通信, 不同的信号都有自己的数字编号──其中一些有特殊的含义, 其它的则可以被应用程序自己进行解释, 而一般来说, 应用程序的文档会告诉哪些信号会被如何处理。 您只能给所属于您的进程发信号,假如您给其他人的进程发信号, 进程就会用kill(1)kill(2)权限进行拒绝。 当然,root 用户会例外,它能把各种信号发送给每个进程。

  在某些情况下,FreeBSD也会向应用软件发送信号。 假如一个应用软件含有恶意写入并试图去访问内存,那是不可想象的,FreeBSD会向那个进程发送 段式违规 信号 (SIGSEGV)。 假如一个应用软件使用alarm(3)系统去进行周期性调用闹钟功能,每当达到时间时, FreeBSD会向应用软件发送闹钟信号(SIGALRM)。

  有两个信号可以停止进程:SIGTERMSIGKILLSIGTERM比较友好,进程能捕捉这个信号, 根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。 在某些情况下, 假如进程正在进行作业而且不能中断,那么进程可以忽略这个 SIGTERM信号。

  对于SIGKILL信号,进程是不能忽略的。 这是一个 '“我不管您在做什么,立刻停止”'的信号。 假如您发送SIGKILL信号给进程, FreeBSD就将进程停止在那里。[4].

  您可能会去使用 SIGHUPSIGUSR1SIGUSR2信号。 这都是些通用的信号,各种应用程序都可以应用 在各方面的信号发送。

  假如您改变了web系统的配置文件──并想web系统去重读它的配置, 您可以停止然后再启动httpd。但这样做web系统会导致一个短暂 的中断周期,那样是不受欢迎的。几乎所有的守护进程在编写时,都会指定对SIGHUP 信号进行响应从而重读配置文件。 所以, 最好的方法, 就不是杀死并重启 httpd, 而是发一个 SIGHUP 信号给它。 因为在这方面没有一个标准,不同的守护进程有不同的用法,所以不了解时应读一下守护进程的文档。

  发送信号可用kill(1) 命令, 请参考kill(1)所列出的例子。

发送一个信号给进程

这个例子显示了怎样去发一个信号给inetd(8)inetd配置文件是/etc/inetd.conf, 如果想inetd 去重读文件系统的话,可以给它发一个SIGHUP 信号。

  1. 寻找您要发送信号的进程ID,可以用ps(1)grep(1)来完成。 grep(1)命令被用在搜索输出方面,搜索您指定的字符串。 这命令是由普通用户来执行的,而inetd(8)root用户运行的, 所以必须给ps(1)带上ax选项。

    % ps -ax | grep inetd
      198  ??  IWs    0:00.00 inetd -wW
    

    得出 inetd(8) PID号是198。 有时 grep inetd 命令也出现在输出中, 这是因为在这方面 ps(1) 也是寻找列表中运行进程。

  2. 使用 kill(1) 去发送信号。 因为 inetd(8) 是由 root启动的, 您必须使用 su(1) 去 变为 root 用户。

    % su
    Password:
    # /bin/kill -s HUP 198
    

    和大多数 UNIX 命令一样, kill(1) 如果完成了任务, 就不会给出任何消息。 假如您发送信号给一个不属于您的进程, 您会看到 “kill: PID: Operation not permitted”. 假如输错了PID号,把信号发送到其他进程,那是坏事。 或者您侥幸,把信号发送到不存在的进程, 您会看见 “kill: PID: No such process”.

    为什么使用 /bin/kill?: 许多shell提供了内建 kill 命令, 这样, shell就能直接发送信号,而不是运行 /bin/kill。 这点非常有用, 但不同shell有不同的语法来指定发送信号的名字, 与其试图把它们学完倒不如简单地直接使用 /bin/kill ...

  发送其他的信号也很相似, 只要在命令行替换 TERMKILL 就行了。

重要: 在系统上随意杀死进程是个坏主意,特别是init(8), 它的进程ID是1,它非常特殊。可以运行 /bin/kill -s KILL 1 命令来让系统迅速关机。 当您按下 Return (回车)键之前, 一定要 详细检查您运行 kill(1) 时所指定的参数。


3.9 Shells

  在FreeBSD里,每日有一大堆工作是在命令行的界面完成的,那就叫做shell。 一个shell的主要功能就是从输入取得命令然后去执行他。 许多的shell同样能帮我们完成内建的每日功能,例如:文件管理、文件寻找、命令行编辑、 宏指令和环境变量。FreeBSD内含了一些shell,例如:sh、Bourne Shell、 tcsh和改良过的C-shell。 另外也有些shell也可在FreeBSD的Ports得到,例如:zshbash

  您想使用哪一种shell取决于您的喜好, 假如您是C程序设计师,您可能选择一个C-like shell例如tcsh。 假如您是从Linux过来的或是一个命令行的新手,您可能会试一下bash。 这一点告诉我们每一个shell都有各自的特性,可能适用于您的工作环境,也可能不适用于您的工作环境。

  每个shell都有一个共通点就是文件名补全。 输入命令或文件名的前几个字,然后按Tab键,就能靠shell的自动补全功能得出 命令或文件名。这里有一个例子,假设您有两个文件叫 foobarfoo.bar,而您想删除 foo.bar, 可这样在键盘上输入 rm fo[Tab].[Tab]

  那么shell就会输出 rm foo[BEEP].bar

  这个[BEEP] 是这控制台铃声, 那个是告诉我们它不能完成文件名补全,因为有多个文件名符合。 foobarfoo.bar 都是以 fo开头, 它只可以补全到 foo。 输入 .并再按一次 Tab,shell才把其余的文件名全部显示出来。

  另一个特点就是shell利用环境变量运行。环境变量是贮存在shell环境空间上相对应的键和可变值, 这个空间能够补程序从shell里读出,而且包含了许多程序的配置。 这个一个常用环境变量列和其含义的列表:

变量 说明
USER 当前登录进入的用户名。
PATH 搜索程序路径,以两点的冒号分隔开。
DISPLAY 假如有这个变量的话,就是X11显示器的网络名称。
SHELL 当前所用的shell。
TERM 用户终端的名字,通常用在确定终端的能力。
TERMCAP 各种终端功能所用终端分离编码的基本数据项目。
OSTYPE 操作系统类型,默认是FreeBSD。
MACHTYPE 是指系统上运行的CPU体系结构。
EDITOR 用户首选的文本编辑器。
PAGER 用户首选的文本页面调度程序 。
MANPATH 搜索联机手册路径,以两点的冒号分隔开。

  不同的shell设置环境变量也不相同。举个例子, 在如tcshcsh这样的C-Style shell, 您必须使用setenv去设置环境变量。 而在如shbash这样的Bourne shell, 您必须使用export去设置当前环境变量。 再举个例子,要去设置或改变EDITOR环境变量, 在cshtcsh下将EDITOR设为 /usr/local/bin/emacs:

% setenv EDITOR /usr/local/bin/emacs

  而在Bourne shell下,则是:

% export EDITOR="/usr/local/bin/emacs"

  您也可以在命令行上加一个$字符在变量之前从而取得环境变量。 举个例子,用echo $TERM 就会显示出$TERM的设定值, 其实就是shell取得$TERM并传给echo来显示的。

  shell里有许多特别的字符代表着特别的资料,我们把叫做meta-characters。 最常用的就是*字符,它可代表文件名的任何字符。 这些特别字符应用到文件名全域方面。假如,输入 echo *和输入 ls的效果是相同的,其实就是 shell 取得了全部符合 *的文件名,并传给 echo 在命令行下显示出来。

  为了防止shell去分析这些特别字符, 我们可在它之前加一个 \字符去说明它只是普通字符。 echo $TERM就会显示出您的终端情况, 而 echo \$TERM 就会显示出 $TERM 这几个字。


3.9.1 改变您用的Shell

  改变您的Shell的最简单方法是使用 chsh 命令。 执行 chsh 将根据您设定的EDITOR 环境变量进入到那个编辑器,假如没有设定,就会进入vi编辑器。 请改变“Shell:”这行对应值。

  您可使用chsh-s选项, 这样就能设置您的shell却又不用编辑器。假如您想把shell改为bash 可用下面的技巧。

% chsh -s /usr/local/bin/bash

注意: 您使用的shells必须/etc/shells 文件里列出。 假如您从 ports里装一个shell, 那就不用做这步了。 假如您手工装一个shell,那就要手工添加进去。

举个例了子,假如您手工把 bash装到 /usr/local/bin里,您还要进行这一步:

# echo "/usr/local/bin/bash" >> /etc/shells

然后运行chsh


3.10 文本编辑器

  FreeBSD 的很多配置都可以通过编辑文本文件来完成。 因此, 最好能熟悉某种文本编辑器。 FreeBSD 基本系统中提供了一些, 您也可以从 Ports Collection 安装其它编辑器。

  最容易学的而又简单的编辑器是 ee编辑器, 是个标准的简易编辑器。 要启动 ee,首先就要在命令行输入 ee filenamefilename 是一个要编辑的文件名。 例如,要编辑 /etc/rc.conf就要输入 ee /etc/rc.conf,在 ee的控制内, 编辑器所有功能的操作方法都显示在最上方。 这个^ 字符代表 键盘上的Ctrl 键, 所以^e 就是 Ctrl+e组合键。 假如想离开ee, 按Esc键,就可选择离开编辑器。 当您修改了内容的时候,编辑器会提示您保存。

  FreeBSD本身也带许可多有强大功能的文本编辑器, 例如 vi。还有其他在FreeBSD Ports里几种, 像 emacsvim。 这些编辑器有着强大的功能,但同时学习起来比较复杂。 不管怎样,假如您从事文字编辑方面的工作, 学习如vimemacs 这些有强大功能的编辑器用法, 在长时间工作里会帮您节省不少的时间。


3.11 设备和设备节点

  在一个系统里,硬件描述通常用法就是一个设备对应一个术语,包括磁盘、打印机、显卡和键盘。 当 FreeBSD 启动过程中,大多数的设备都能探测到并显示出来, 您也可以查阅/var/run/dmesg.boot, 引导时所有信息都在里面。

  例如, acd0 就是 首个 IDE 光盘设备, 而 kbd0 则代表键盘。

  在UNIX操作系统里,大多数设备存在的特殊访问文件就是叫做设备节点, 他们都定位在/dev目录里。


3.11.1 建立设备节点

  当在系统中添加新设备或将附加设备的支持编译进内核之后, 都必须为其建立设备节点。


3.11.1.1 DEVFS (DEVice 文件系统)

   这个设备文件系统, 或叫 DEVFS, 为内核的设备命名在整体文件系统命名里提供通道, 并不是建立或更改设备节点, DEVFS只是为您的特别文件系统进行维护。

  请参见 devfs(5) 联机手册以了解更多细节。


3.12 二进制文件格式

  要理解为什么 FreeBSD 使用 elf(5) 格式, 您必须首先了解一些 UNIX 系统中的 三种 “主要” 可执行文件格式的有关知识:

  • a.out(5)

    是最古老和“经典的” UNIX 目标文件格式, 这种格式在其文件的开始处有一个短小而又紧凑的首部, 该首部带有一个魔幻数字,用来标识具体的格式(更多详情参见a.out(5))。 这种格式包含3个要装载入内存的段:.text, .data, 和 .bss,以及 一个符号表和一个字符串表。

  • COFF

    SVR3目标文件格式。其文件头现在包括一个区段表(section table), 因此除了.text,.data,和.bss区段以外,您还可以包含其它的区段。

  • elf(5)

    COFF 的后继, 其特点是可以有多个区段, 并可以使用32位或64位的值。 它有一个主要的缺点: ELF 在其设计时假设每个系统体系结构只有一种 ABI。 这种假设事实上相当错误, 甚至在商业化的SYSV世界中都是错误的 (它们至少有三种ABI: SVR4, Solaris, SCO)。

    FreeBSD试图在某种程度上解决这个问题,它提供一个工具,可以 对一个已知的ELF可执行文件 标识它所遵从的ABI的信息。 更多这方面的知识可以参见手册页brandelf(1)

  FreeBSD从“经典”阵营中来,因此使用了a.out(5)格式, 众多BSD版本的发行(直到3.X分支的开始)也证明了这种格式的有效性。 虽然在那以前的某段时间,在FreeBSD系统上创建和运行ELF格式 的二进制可执行文件(和内核)也是可能的,但FreeBSD一开始并不积极“进步” 到使用ELF作为其缺省的格式。为什么?噢,当Linux阵营完成了 转换到ELF格式的痛苦历程后,却发现并不足以由此而放弃 a.out可执行文件格式,因为正是由于它们不灵活的, 基于跳转表的共享库机制,使得销售商和开发者们构建共享库非常困难。 直到已有的ELF工具提供了一种解决共享库问题的办法, 并被普遍认为是“前进方向”以后,迁徙的代价在FreeBSD界才被接受, 并由此完成了迁徙。FreeBSD的共享库机制其基础更类似于Sun SunOS™的共享库机制, 并且正因为此,其易用性很好。

  那么,为什么会有这么多不同的格式呢?

  回溯到蒙昧和黑暗的过去,那时只有简单的硬件。这种简单的硬件支撑了一个简单 和小型的系统。在这样的简单系统上(PDP-11)a.out格式 足以胜任表达二进制文件的任务。当人们将UNIX从这种简单的系统中移植出来的时候, a.out格式被保留了下来,因为对于早期将UNIX移植到 Motorola 68k,VAXen等系统来说,它还是足够可用的。

  然后,一些聪明的硬件工程师认为,如果可以让软件完成一些简单的聪明操作, 那么他们就可以在硬件设计中减少若干门电路,并可以让CPU核心运行得更快。 当a.out格式用于这种新型的硬件系统时(现在我们叫它 RISC),显得并不合适。因此,人们设计了许多新的格式 以便在这样的硬件系统上能获得比简单的a.out格式更优越 的性能。诸如COFFECOFF,还有其它 一些晦涩难懂的格式正是在这个阶段被发明出来的,人们也研究了这些格式的局限性, 慢慢地最终落实到ELF格式。

  同时,程序的大小变得越来越大,磁盘空间(以及物理内存)相对来说却仍然较小, 因此共享库的概念便产生了。VM系统也变得越来越复杂了。当所有这些进步都建立在 a.out格式的基础上的时候,它的可用性随着每个新特性 的产生就受到了严重考验。并且,人们还希望可以在运行时动态装载某些东西,或者 在初始化代码运行以后可以丢弃部分程序代码,以便节约主存储器和交换区。编程语言 也变得越来越复杂,人们希望可以在main()函数执行之前自动执行某些代码。为了实现 所有这些功能,人们对a.out格式作了很多改动(hack), 他们在某个阶段里基本也是可行的。随着时间的推移,a.out格式 不得不增加大量的代码和复杂度来满足这些需求。虽然ELF格式 解决了许多这样的问题,但是从一个可用的系统迁移到另一个系统却是痛苦的。因此 直到继续保留a.out格式的代价比迁移到ELF格式 的代价还大的时候,人们才会最终转换到ELF格式。

  然而,随着时间的推移,FreeBSD系统本身的编译工具(特别是汇编器和装载器) 赖以派生的编译工具,其发展却形成了两个平行的分支。FreeBSD这个分支增加了共享库, 并修改了一些错误。而原先编写了这些工具的GNU人则重写了这些工具,并对交叉编译提供了 更简化的支持,还随意插入了不同格式的支持,等等。虽然很多人希望创建针对FreeBSD的 交叉编译器,但他们却并未如愿以偿,因为FreeBSD的asld的源代码更为老旧,所以无法完成这个任务。 新的GNU工具链(binutils)则确实支持交叉编译,ELF 格式,共享库,C++扩展,等等。并且,由于很多供应商都发布ELF格式的 二进制文件,因而让FreeBSD能够运行它们将是一个很好的事情。

  ELF格式比a.out格式开销要大些,同时也 允许基础系统有更好的扩展性。ELF格式的有关工具有着更好的维护, 并且提供交叉编译支持,这对许多人来说是很重要的。ELF格式可能会稍微 慢一些,但很难测量出来。另外,在这两者之间,有许多细节也是不同的,比如它们映射页面的方式, 处理初始化代码的方式,等等。所有这些都不太重要,但这也确实是不同之处。在将来的适当时候, GENERIC内核将不再支持a.out格式,并且, 当不再需要运行遗留的a.out格式程序时,内核也将不再提供对其的支持。


3.13 取得更多的资讯

3.13.1 联机手册

  最详细的使用说明文档莫过于 FreeBSD 里的联机手册了。 几乎每一个程序都会附上一份简短说明, 以介绍这个程序的的基本功能以及参数的用法。 我们能通过 man 命令来阅读这些说明, 而使用 man 命令却是简单的事情:

% man command

  command 就是您要了解的命令命称。 举个例子,想了解 ls 命令就输入:

% man ls

  这些在线手册分下列章节:

  1. 用户命令。

  2. 系统调用以及错误代码。

  3. C 库文件里的函数说明。

  4. 设备驱动程序。

  5. 文件格式。

  6. 游戏以及其他娱乐。

  7. 各种资讯。

  8. 系统维护以及命令。

  9. 内核开发情况。

  在某些情况下,同样的主题也会出现在在线手册的不同章节。 举个例子,系统里有chmod这个用户命令,而又有个 chmod() 系统调用。 在这种情形下,您应当向 man 命令指定需要的内容:

% man 1 chmod

  这样就会显示出手册里的用户 chmod 命令。 传统上,我们在写入文档时把特定详细参考内容在在线手册括号里注明。 所以 chmod(1) 是指 chmod 用户命令, 而 chmod(2) 是指系统调用。

  如果您已经知道命令的名字,只是不知道要怎样使用的话,那就比较好办。 但您连名字都不知道呢?这个时候您就可以利用 man 的搜寻功能, 它会在手册的介绍部份找寻您要搜寻的关键字,它的选项是 -k

% man -k mail

  当您使用这个命令的时候,man会把介绍里含有“mail”关键字 的命令列出来,实际上这和apropos命令的功能是相同的。

  有时您会看到/usr/bin 下有许多命令但不知他们的用途, 您只需这样做:

% cd /usr/bin
% man -f *

  或者这样做

% cd /usr/bin
% whatis *

  两个命令是一样的。


3.13.2 GNU Info 文件

  FreeBSD许多应用软件以及实用工具来自Free软件基金会(FSF)。 作为手册的扩充,这些程序提供了一种更具有活力的超文档说明info, 您可用info命令来阅读他们。 假如您装上emacs,也能利用emacs 的info模式来阅读。

  使用 info(1) 这个命令只需简单地输入:

% info

  想得到简单介绍, 请按 h。 想快速得到的命令说明, 请按 ?


第4章  安装应用程序: Packages 和 Ports

4.1 概述

  FreeBSD 将许多系统工具捆绑作为基本系统的一部分。 然而, 要完成实际的工作, 可能还需要安装更多的第三方应用。 FreeBSD 提供了两种补充的技术, 用以在您的系统中安装第三方软件: FreeBSD Ports 套件 (用于从源代码安装), 以及 packages (用以从预编译的二进制版本安装)。 这两种方法都可以用于从本地介质, 或从网上直接安装您喜欢的应用程序的最新版本。

  读完这章,您将了解到:

  • 如何安装第三方的二进制软件包。

  • 如何使用 ports 套件从源代码构建第三方软件。

  • 如何删除先前安装的软件包。

  • 如何改动Ports Collection里面的一些参数,定制软件使用。

  • 如何找到您需要的软件包。

  • 如何升级您的应用软件。


4.2 软件安装预览

  如果您以前使用过 UNIX 系统,那典型的第三方软件安装的步骤是像下面描述的:

  1. 下载这个软件,软件的发行版可能是源代码格式,或是一个二进制包。

  2. 解开软件(其中代表性的是用 compress(1), gzip(1), 或 bzip2(1) 压缩过的tar包)。

  3. 阅读相关文档,了解如何安装。 (多半一个文件名是INSTALLREADME, 或在doc/ 目录下的一些文档)

  4. 如果软件是以源代码形式发布的,那就需要编译它。可能需要编辑一个 Makefile文件, 或运行 configure脚本,和其他的一些工作。

  5. 测试和安装软件。

  如果一切顺利的话,就这么简单。如果您在安装一个软件包时发生一些错误, 您可能需要编辑一下它的代码,以使它能正常工作。

  您可以继续使用 “传统的”方式安装软件。 然而, FreeBSD 提供了两种技术: packages 和 ports。 就在写这篇文章的时候, 已经有超过 18,000 个第三方的应用程序可以使用了。

  对于任意一个应用程序包,是一个可以下载的FreeBSD package文件。这个 FreeBSD package包含了编译好的的副本, 还有一些配置文件或文档。 一个下载的包文件可以用 FreeBSD 的包管理命令来操作, 例如 pkg_add(1)pkg_delete(1), pkg_info(1) 等等。 可以使用一个简单的命令安装一个新的应用程序。

  一个FreeBSD的port是一个可以自动从源代码编译成应用程序的文件集合。

  记住,如果您自己来编译的话,需要执行很多步的操作 (解压, 补丁, 编译, 安装)。 这些整理 port 的文件集合包含了系统需要完成这个工作的必需信息。 您可以运行一些简单的命令, 那些源代码就可以自动地下载, 解开, 打补丁, 编译, 直至安装完成。

  实际上,ports 系统也能做出被 pkg_add 的程序包和不久就要讲到的其他包管理命令来安装的软件包。

  Packages 和 ports 是互相 依赖 的。 假设您想安装一个依赖于已经安装的特定库的应用程序。 应用程序和那个库都已经应用于 FreeBSD ports 和 packages。 如果您使用 命令或 ports 系统来添加应用程序, 两个都必须注意库是否被安装, 如果没有, 它会自动先安装库。

  这里给出的两种技术是很相似的,您可能会奇怪为什么 FreeBSD 会弄出这两种技术。 其实, packages 和 ports 都有它们自己的长处, 使用哪一种完全取决于您自己的喜好。

Package Benefits

  • 一个压缩的 package 通常要比一个压缩的包含源代码的应用程序小得多。

  • package 不需要进行额外的编译。 对于大型应用程序如 MozillaKDEGNOME 来说这显得尤为重要, 特别是在您的系统资源比较差的情况下。

  • package不需要您知道如何在FreeBSD上编译软件的详细过程。

Ports Benefits

  • package 在编译时通常使用比较保守的选项, 这是为了保证它们能够运行在大多数的系统上。 通过从 port 安装, 您可以细微调整编译选项来产生适合于处理器的代码 (针对于 Pentium 4 或 AMD 的 Athlon CPU)。

  • 一些软件包已经把与它们相关的能做和不能做的事情的选项都编译进去了。 例如, Apache 可能就配置了很多的选项。 从 port 中安装时, 您不一定要接受默认的选项, 可以自己来设置。

    在一些例子中,一个软件有不同的配置存在多个package。 例如, Ghostscript存在 ghostscript package 和 ghostscript-nox11 package两个配置package, 这取决于您是否安装了X11服务器。 这样的调整对package是可能的, 但如果一个应用程序有超过一个或两个不同的编译时间选项时, 就不行了。

  • 一些软件的许可条件禁止采用二进制形式发行。 它们必须带上源代码。

  • 一些人不信任二进制发行形式。 至少有了源代码, (理论上) 可以亲自阅读它,寻找潜在的问题。

  • 如果您要自己对软件打补丁,您就需要有源代码。

  • 一些人喜欢整天围着源代码转, 所以他们喜欢亲自阅读源代码, 修改源代码等等。

  保持更新 ports, 订阅邮件列表 FreeBSD ports 邮件列表 和递交错误报告 FreeBSD ports bugs 邮件列表

警告: 安装任何应用程序之前, 应首先检查 http://vuxml.freebsd.org/ 上是否有关于您所安装的应用程序的安全问题报告。

您也可以安装 ports-mgmt/portaudit, 它能够自动地检查已经安装的应用程序的漏洞; 此外, 在您安装程序之前它也会首先检查是否存在已知的漏洞。 另外, 您也可以使用 portaudit -F -a 这个命令在安装了某个软件包之后作出检查。

  这章的其余部分将介绍在 FreeBSD 上如何使用 packages 和 ports 来安装和管理第三方软件。


4.3 寻找您要的应用程序

  在您安装任何应用程序之前,需要知道您需要什么,那个应用程序叫什么。

  FreeBSD中可用的应用程序正在不断地增长着。幸运的是, 有许多方法可以找到您所需要的程序:

  • FreeBSD站点上有一个可以搜索到的当前所有可用的应用程序列表,在 http://www.FreeBSD.org/ports/。 它分很多种类,您既可以通过程序的名称来搜索, 也可以在分类中列出所有可用的应用程序 (如果您知道名字), 也可以在分类中列出所有可用的应用程序。

  • Dan Langille 维护着网站 FreshPorts,在 http://www.FreshPorts.org/。 FreshPort时刻 “追踪” 着在 ports 中应用程序的变化。当有任何程序被升级时,他们就会发 email 提醒您。

  • 如果您不知道您想要的应用程序的名字,可以通过 (http://www.freshmeat.net/) 网站来查找, 如果找到了应用程序, 您可以回 FreeBSD 的主站去看一下这个应用程序是否已经被 port 进去了。

  • 如果您知道一个port的准确名字, 但需要知道在哪个类别里面能找到它,您可以使用 whereis(1) 这个命令。简单地输入 whereis filefile 就是您想安装的程序名字。 如果系统找到了它, 您将被告知在它在哪里, 例如:

    # whereis lsof
    lsof: /usr/ports/sysutils/lsof
    

    结果告诉我们这个命令lsof (一个系统配置程序)可以在 /usr/ports/sysutils/lsof目录中找到。

  • 你可以使用简单的 echo(1) 语句来查找某个 port 是否存在于 ports 树中。 例如:

    # echo /usr/ports/*/*lsof*
    /usr/ports/sysutils/lsof
    

    Note that this will return any matched files downloaded into the /usr/ports/distfiles directory.

    请注意这条命令将会返回下载到 /usr/ports/distfiles 目录中所有符合条件的文件。

  • 还有另外的一个寻找您需要的port的方法--是用ports collecton 内嵌的搜索机制。要使用这个搜索, 您需要先到 /usr/ports目录下面。 在那个目录里面, 运行make search name=program-nameprogram-name 就是您想寻找的程序名字。 举个例子, 如果您想找 lsof

    # cd /usr/ports
    # 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:  [email protected]
    Index:  sysutils
    B-deps: 
    R-deps:
    

    在输出的内容里面您要特别注意包含 “Path:” 的这行将告诉您在哪里可以找到这个 port。 如果要安装此 port, 那其他输出的信息不是必须的, 但是还是显示输出了。

    为了更深入的搜索,您还可以用 make search key=stringstring就是您想搜索的部分内容。 它将搜索port的名字、 注释, 描述和从属关系, 如果您不知道您想搜索的程序名字, 可以利用它搜索一些关键主题来找到您需要的。

    上面说的这些方法, 搜索的关键字没有大小写区分的。 搜索 “LSOF”的结果将和搜索“lsof”的结果一样。


4.4 使用Packages系统

Contributed by Chern Lee.

4.4.1 一个package的安装

  您可以用 pkg_add(1) 这个命令从本地文件或网络上的服务器来安装一个 FreeBSD 软件包。

例 4-1. 在本地手动下载一个package,并安装它

# 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 [email protected]
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
# pkg_add lsof-4.56.4.tgz

  如果您没有本地package的安装盘 (如 FreeBSD CD-ROM), 可以执行 pkg_add(1) 命令并加上 -r 选项。 这将迫使程序自动决定目标文件的正确格式和版本, 然后自动从一个 FTP 站点寻找和安装 package。

# pkg_add -r lsof

  上面的例子将下载正确的package, 而不需要用户的干预就可以安装。 如果您想指定 FreeBSD package 的镜像站点, 替换主站点, 就必须相应地设置 PACKAGESITE 这个环境变量, 覆盖原来的设置。 pkg_add(1) 使用 fetch(3) 下载文件, 可以使用多种环境变量, 包含 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您使用 FTP/HTTP 代理或在防火墙后面, 您可能需要设置这些环境变量。 详细的列表请参考 fetch(3)。上述例子中用 lsof 替代了 lsof-4.56.4。 当使用远程安装 Package 的时候软件名字不需要包含版本号。 pkg_add(1) 将自动的找到这个软件最新的版本。

注意: 如果您使用 FreeBSD-CURRENT 或 FreeBSD-STABLE版本的FreeBSD, pkg_add(1) 将下载您的应用软件的最新版本。 如果您使用 -RELEASE 版本的 FreeBSD, 它将会获得与您的版本相应的软件包版本。 您可以通过修改环境变量 PACKAGESITE 来改变这一行为。 例如, 如果您运行 FreeBSD 5.4-RELEASE 系统, 默认情况下 pkg_add(1) 将尝试从 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5.4-release/Latest/ 下载预编译的软件包。 如果您希望强制 pkg_add(1) 下载 FreeBSD 5-STABLE 的软件包, 则可以将 PACKAGESITE 设置为 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest/

  软件包采用 .tgz.tbz 两种格式。您可以在 ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/ 下面或从 FreeBSD 的发行光盘找到, 它在每一个 4CD 的 FreeBSD 发行版的 /packages目录中。 软件包的设计规划与 /usr/ports 树一致。 每个分类都有自己的目录, 所有的软件包可以在目录 All中找到。

  软件包系统的目录结构与ports的设计规划一致; 它们共同构成了整个 package/port。


4.4.2 软件包的管理

  pkg_info(1) 是用于列出已安装的所有软件包列表和描述的程序。

# 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
...

  pkg_version(1)是一个用来统计所有安装的软件包版本的工具。 它可以用来比较本地 package 的版本与 ports 目录中的当前版本是否一致。

# pkg_version
cvsup                       =
docbook                     =
...

  在第二列的符号指出了安装版本的相关时间和本地ports目录树中可用的版本。

符号 含义
= 在本地ports树中与已安装的软件包版本相匹配。
< 已安装的版本要比在ports树中的版本旧。
> 已安装的版本要比在ports树中的版本新 (本地的port树可能没有更新)。
? 已安装的软件包无法在ports索引中找到。 (可能发生这种事情,举个例子, 您早先安装的一个 port 从 port 树中移出或改名了)
* 软件包有很多版本。
! 已安装的软件包在索引中存有记录, 但是由于某些原因 pkg_version 无法比较已安装的软件包与索引中相对应的版本号。

4.4.3 删除一个软件包

  要删除先前安装的软件package,只要使用pkg_delete(1) 工具。

# pkg_delete xchat-1.7.1

  需要注意的是, pkg_delete(1) 需要提供完整的包名; 如果您只是指定了类似 xchat 而不是 xchat-1.7.1 这样的名字, 则它将拒绝执行操作。 不过, 您可以使用 pkg_version(1) 来了解安装的 package 的版本。 除此之外, 也可以使用通配符:

# pkg_delete xchat\*

  这时, 所有名字以 xchat 开头的 package 都会被删掉。


4.4.4 其它

  所有已安装的 package 信息都保存在 /var/db/pkg 目录下。 安装文件的列表和每个 package 的内容和描述都能在这个目录的相关文件中找到。


4.5 使用Ports Collection

  下面的几个小节中, 给出了关于如何使用 Ports 套件来在您的系统中安装或卸载程序的介绍。 关于可用的 make targets 以及环境变量的介绍, 可以在 ports(7) 中找到。


4.5.1 获得Ports Collection

  在您能使用 ports 之前, 您必须先获得 Ports Collection ── 本质上是 /usr/ports 目录下的一堆 Makefile、 补丁和描述文件。

  在您安装 FreeBSD 系统的时候, sysinstall 会询问您是否需要安装 Ports Collection。 如果您选择 no, 那您可以用下面的指令来安装 Ports Collection:

CVSup 方法

保持您本地 Ports 套件最新的一种快捷的方法, 是使用 CVSup 协议来进行更新。 如果您希望了解更多关于 CVSup 的细节, 请参见 使用 CVSup

注意: 在 FreeBSD 系统里对 CVSup 的实现叫作 csup。 它首次出现在 FreeBSD 6.2中。 对于旧版本的 FreeBSD 用户而言可以通过 port/package 安装 net/csup

在首次运行 csup 之前, 务必确认 /usr/ports 是空的! 如果您之前已经用其他地方安装了一份 Ports 套件, 则 csup 可能不会自动删除已经在上游服务器上删除掉的补丁文件。

  1. 运行 csup:

    # csup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
    

    cvsup.FreeBSD.org 改为离您较近的 CVSup 服务器。 请参见 CVSup 镜像 (第 A.5.7 节) 中的镜像站点完整列表。

    注意: 有时可能希望使用自己的 ports-supfile, 比如说, 不想每次都通过命令行来指定所使用的 CVSup 服务器。

    1. 这种情况下, 需要以 root 身份将 /usr/share/examples/cvsup/ports-supfile 复制到新的位置, 例如 /root 或您的主目录。

    2. 编辑 ports-supfile

    3. CHANGE_THIS.FreeBSD.org 修改成离您较近的 CVSup 服务器。 可以参考 CVSup 镜像 (第 A.5.7 节) 中的镜像站点完整列表。

    4. 接下来按如下的方式运行 csup

      # csup -L 2 /root/ports-supfile
      
  2. 此后运行 csup(1) 命令将下载最近所进行的改动, 并将它们应用到您的 Ports Collection 上, 不过这一过程并不重新联编您系统上的 ports。

Portsnap 方式

Portsnap 是另一种用于发布 Ports 套件的方法。 它最早从 FreeBSD 6.0 开始引入。 在较早的系统中, 您可以通过 ports-mgmt/portsnap package 来安装它:

# pkg_add -r portsnap

请参见 使用 Portsnap 以了解关于全部 Portsnap 功能的详细描述。

  1. 如果您使用 FreeBSD 6.1-RELEASE, 或通过 port 或 package 安装了较新版本的 Portsnap 的话, 可以直接跳过这一步。 /usr/ports 将在首次使用 portsnap(8) 命令时自动创建。 而如果您使用的是较早期版本的 Portsnap, 就只能手工创建空的 /usr/ports 目录了。

    # mkdir /usr/ports
    
  2. 下载压缩的 Ports 套件快照到 /var/db/portsnap。 您可以根据需要在这之后关闭 Internet 连接。

    # portsnap fetch
    
  3. 假如您是首次运行 Portsnap, 则需要将快照释放到 /usr/ports

    # portsnap extract
    

    如果您已经有装好的 /usr/ports 而您只想更新, 则应执行下面的命令:

    # portsnap update
    

Sysinstall 方式

这种方法需要使用 sysinstall 从安装介质上安装 Ports 套件。 注意, 安装的将是发布发行版时的旧版 Ports 套件。 如果您能访问 Internet, 应使用前面介绍的方法之一。

  1. root 身份运行 sysinstall (对 FreeBSD 5.2 之前的版本, 应执行 /stand/sysinstall):

    # sysinstall
    
  2. 用光标向下选择 Configure, 并按 Enter

  3. 向下并选择 Distributions, 按 Enter

  4. 选择 ports, 并按 Space

  5. 选择 Exit, 并按 Enter

  6. 选择所希望的安装介质, 例如 CDROM、 FTP, 等等。

  7. 选择 Exit 并按 Enter

  8. X 退出 sysinstall


4.5.2 安装 Ports

  当提到 Ports Collection 时, 第一个要说明的就是何谓 “skeleton”。 简单地说, port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含:

  • 一个 MakefileMakefile 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。

  • 一个 distinfo 文件。这个文件包括这些信息: 这些文件用来对下载后的文件校验和进行检查 (使用 md5(1)sha256(1)), 来确保在下载过程中文件没有被破坏。

  • 一个 files 目录。 这个目录包括在 FreeBSD 系统上编译和安装程序需要用到的补丁。 这些补丁基本上都是些小文件, 指出特定文件作了哪些修正。 它们都是纯文本的的格式,基本上是这样的 “删除第 10 行” 或 “将第 26 行改为这样 ...”, 补丁文件也被称作 “diffs”, 他们由 diff(1) 程序生成。

    这个目录也包含了在编译 port 时要用到的其它文件。

  • 一个 pkg-descr 文件。 这是一个提供更多细节,有软件的多行描述。

  • 一个 pkg-plist 文件。 这是即将被安装的所有文件的列表。它告诉 ports 系统在卸载时需要删除哪些文件。

  一些ports还有些其它的文件, 例如 pkg-message。 ports 系统在一些特殊情况下会用到这些文件。 如果您想知道这些文件更多的细节以及 ports 的概要, 请参阅 FreeBSD Porter's Handbook

  port里面包含着如何编译源代码的指令, 但不包含真正的源代码。 您可以在网上或 CD-ROM 上获得源代码。 源代码可能被开发者发布成任何格式。 一般来说应该是一个被 tar 和 gzip 过的文件, 或者是被一些其他的工具压缩或未压缩的文件。 ports中这个程序源代码标示文件叫 “distfile”, 安装 FreeBSD port的方法还不止这两种。

注意: 您必须使用 root 用户登录后安装 ports。

警告: 在安装任何 port 之前, 应该首先确保已经更新到了最新的 Ports Collection, 并检查 http://vuxml.freebsd.org/ 中是否有与那个 port 有关的安全问题。

在安装应用程序之前, 可以使用 portaudit 来自动地检查是否存在已知的安全问题。 这个工具同样可以在 Ports Collection (ports-mgmt/portaudit) 中找到。 在安装新的 port 之前, 可以考虑先运行一下 portaudit -F 来抓取最新的漏洞数据库。 在每天的周期性系统安全检察时, 数据库会被自动更新, 并且会在这之后实施安全审计。 欲了解进一步的情况,请参阅 portaudit(1)periodic(8)

  Ports 套件假定您有可用的 Internet 连接。 如果您没有, 则需要将 distfile 手工放到 /usr/ports/distfiles 中。

  要开始操作, 首先进入要安装 port 的目录:

# cd /usr/ports/sysutils/lsof

  一旦进入了 lsof 的目录,您将会看到这个port的结构。 下一步就是 make,或说 “联编” 这个 port。 只需在命令行简单地输入 make 命令就可轻松完成这一工作。 做好之后,您可以看到下面的信息:

# 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]
...
#

  注意,一旦编译完成,您就会回到命令行。 下一步安装 port, 要安装它只需要在 make 命令后跟上一个单词 install 即可:

# 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.
#

  一旦您返回到提示符,您就可以运行您刚刚安装的程序了。因为 lsof 是一个赋予特殊权限的程序, 因此显示了一个安全警告。 在编译和安装 ports 的时候, 您应该留意任何出现的警告。

  删除工作目录是个好主意, 这个目录中包含了全部在编译过程中用到的临时文件。 这些文件不仅会占用宝贵的磁盘空间, 而且可能会给升级新版本的 port 时带来麻烦。

# make clean
===>  Cleaning for lsof-4.57
#

注意: 使用 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 系统使用 fetch(1) 去下载文件, 它有很多可以设置的环境变量, 其中包括 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您在防火墙之后,或使用 FTP/HTTP代理, 您就可能需要设置它们。 完整的说明请看 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:

# cd /usr/ports/directory
# 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。 如果存在这样的选项, 通常会在编译时给出提示。


4.5.2.1 改变默认的 Ports 目录

  有时, 使用不同的工作临时目录和目标目录可能很有用 (甚至是必要的)。 可以用 WRKDIRPREFIXPREFIX 这两个变量来改变默认的目录。 例如:

# make WRKDIRPREFIX=/usr/home/example/ports install

  将在 /usr/home/example/ports 中编译 port 并把所有的文件安装到 /usr/local

# make PREFIX=/usr/home/example/local install

  将在 /usr/ports 编译它并安装到 /usr/home/example/local

  当然,

# make WRKDIRPREFIX=../ports PREFIX=../local install

  将包含两种设置 (没有办法在这一页把它写完, 但您应该已经知道怎么回事了)。

  另外, 这些变量也可以作为环境变量来设置。 请参考您的 shell 的联机手册上关于如何设置环境变量的说明。


4.5.2.2 处理 imake

  一些 port 使用 imake (这是 X Window 系统的一部分) 不能正常地配合 PREFIX, 它们会坚持把文件安装到 /usr/X11R6 下面。 类似地, 一些 Perl port 会忽略 PREFIX 并把文件安装到 Perl 的目录中。 让这些 port 尊重 PREFIX 是困难甚至是不可能的事情。


4.5.2.3 重新配置 Ports

  当你在编译某些 ports 的时候,可能会弹出一个基于 ncurses 的菜单来让你来选择一些编译选项。 通常用户都希望能够在一个 port 被编译安装了以后还能再次访问这份菜单以添加删除或修改这些选项。 实际上有很多方法来做这件事情。 一个方法进入那个 port 的目录后键入 make config, 之后便会再次显示出菜单和已选择的项目。 另一个方法是用 make showconfig, 这会给你显示出所有的配置选项。还有一个方法是执行 make rmconfig, 这将删除所有已选择的项目。 有关这些选项更详细的内容请参阅 ports(7)


4.5.3 卸载已经安装的 Ports

  现在您已经了解了如何安装 ports, 并希望进一步了解如何卸载, 特别是在错误地安装了某个 port 之后。我们将卸载前面例子 (假如您没有注意的话, 是 lsof) 中安装的 port。 Ports 可以同 packages 以完全相同的方式 (在 Packages 一节 中进行了介绍) 卸载, 方法是使用 pkg_delete(1) 命令:

# pkg_delete lsof-4.57

4.5.4 升级 Ports

  首先, 使用 pkg_version(1) 命令来列出 Ports Collection 中提供了更新版本的那些 port:

# pkg_version -v

4.5.4.1 /usr/ports/UPDATING

  在您更新了 Ports 套件之后, 在升级 port 之前, 应查看 /usr/ports/UPDATING。 这个文件中介绍了在升级时用户应注意的问题, 以及一些可能需要进行的操作。 这可能包括更改文件格式、 配置文件位置的变动, 以及与先前版本的兼容性等等。

  如果 UPDATING 与本书中介绍的内容不同, 请以 UPDATING 为准。


4.5.4.2 使用 Portupgrade 来更新 Ports

  portupgrade 工具是设计来简化升级已安装的 port 的操作的。 它通过 ports-mgmt/portupgrade port 来提供。 您可以像其它 port 那样, 使用 make install clean 命令来安装它:

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

  使用 pkgdb -F 命令来扫描已安装的 port 的列表, 并修正其所报告的不一致。 在每次升级之前, 有规律地执行它是个好主意。

  运行 portupgrade -a 时, portupgrade 将开始并升级系统中所安装的所有过时的 ports。 如果您希望在每个升级操作时得到确认, 应指定 -i 参数。

# portupgrade -ai

  如果您只希望升级某个特定的应用程序, 而非全部可用的 port, 应使用 portupgrade pkgname。 如果 portupgrade 应首先升级指定应用程序的话, 则应指定 -R 参数。

# portupgrade -R firefox

  要使用预编译的 package 而不是 ports 来进行安装, 需要指定 -P。 如果指定了这个选项, portupgrade 会搜索 PKG_PATH 中指定的本地目录, 如果没有找到, 则从远程站点下载。 如果本地没有找到, 而且远程站点也没有成功地下载预编译包, 则 portupgrade 将使用 ports。 要禁止使用 port, 可以指定 -PP

# portupgrade -PP gnome2

  如果只想下载 distfiles (或者, 如果指定了 -P 的话, 是 packages) 而不想构建或安装任何东西, 可以使用 -F。 要了解更多细节, 请参考 portupgrade(1)


4.5.4.3 使用 Portmanager 来升级 Ports

  Portmanager 是另一个用以简化已安装 port 升级操作的工具。 它可以通过 ports-mgmt/portmanager port 安装:

# cd /usr/ports/ports-mgmt/portmanager
# make install clean

  可以通过这个简单的命令来升级所有已安装的 port:

# portmanager -u

  如果希望 Portmanager 在进行每步操作之前都给出提示, 应使用 -ui 参数。 Portmanager 也可以用来在系统中安装新的 ports。 与通常的 make install clean 命令不同,它会在联编和安装您所选择的 port 之前升级所有依赖包。

# portmanager x11/gnome2

  如果关于所选 port 的依赖有任何问题, 可以用 Portmanager 来以正确的顺序重新构建它们。 完成之后, 有问题的 port 也将被重新构建。

# portmanager graphics/gimp -f

  要了解更多信息, 请参见 portmanager(1)


4.5.4.4 使用 Portmaster 升级 Ports

  Portmaster 是另外一个用来升级已安装的 ports 的工具。 Portmaster 被设计成尽可能使用 “基本” 系统中能找到的工具 (它不依赖于其他的 ports) 和 /var/db/pkg/ 中的信息来检测出需要升级的 ports。你可以在 ports-mgmt/portmaster 找到它:

# cd /usr/ports/ports-mgmt/portmaster
# make install clean

  Portmaster groups ports into four categories:

  Portmaster 把 ports 分成4类:

  • Root ports (不依赖其他的 ports,也不被依赖)

  • Trunk ports (不依赖其他的 ports,但是被其他的 ports 依赖)

  • Branch ports (依赖于其他的 ports,同时也被依赖)

  • Leaf ports (依赖于其他的 ports,但不被依赖)

  你可以使用 -L 选项列出所有已安装的 ports 和查找存在更新的 ports:

# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
        ===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache-2.2.3
        ===>>> New version available: apache-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
        ===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports

===>>> 137 total installed ports
        ===>>> 83 have new versions available

  可以使用这个简单的命令升级所有已安装的 ports:

# portmaster -a

注意: Portmaster 默认在删除一个现有的 port 前会做一个备份包。如果新的版本能够被成功安装, Portmaster 将删除备份。 使用 -bPortmaster 便不会自动删除备份。加上 -i 选项之后 Portmaster 将进入互动模式, 在升级每个 port 以前提示你给予确认。

  如果你在升级的过程中发现了错误,你可以使用 -f 选项升级/重新编译所有的 ports:

# portmaster -af

  同样你也可以使用 Portmaster 往系统里安装新的 ports,升级所有的依赖关系之后并安装新的 port:

# portmaster shells/bash

  更多的详细信息请参阅 portmaster(8)


4.5.5 Ports 和磁盘空间

  使用 Ports 套件会最终用完磁盘空间。 在通过 ports 联编和安装软件之后,您应记得清理临时的 work 目录, 其方法是使用 make clean 命令。 您可以使用下面的命令来清理整个 Ports 套件:

# portsclean -C

  随着时间的推移, 您可能会在 distfiles 目录中积累下大量源代码文件。 您可以手工删除这些文件, 也可以使用下面的命令来删除所有 port 都不引用的文件:

# portsclean -D

  除此之外, 也可以用下列命令删去目前安装的 port 没有使用的源码包文件:

# portsclean -DD

注意: 这个 portsclean 工具是 portupgrade 套件的一部分。

  不要忘记删除那些已经安装, 但已不再使用的 ports。 用于自动完成这种工作的一个好工具是 ports-mgmt/pkg_cutleaves port。


4.6 安装之后还要做点什么?

  通常,您通过port安装完一个软件后,可以阅读它带的一些文档(如果它包含文档的话), 或需要编辑它的配置文件,来确保这个软件的运行, 或在机器启动的时候启动(如果它是一个服务的话),等等。

  对于不同的软件有着不同的配置步骤。不管怎样, 如果您装好了一个软件,但是不知道下一步怎么办的时候, 这些小技巧可能可以帮助您:

  • 使用 pkg_info(1) 命令,它能找到安装了哪些文件,以及装在哪里。 举个例子,如果您安装了 FooPackage version 1.0.0, 那么这个命令

    # pkg_info -L foopackage-1.0.0 | less
    

    将显示这个软件包安装的所有文件,您要特别注意在man/目录里面的文件, 它们可能是手册,etc/目录里面的配置文件,以及 doc/目录下面更多的文档。

    如果您不确定已经安装好的软件版本,您可以使用这样的命令

    # pkg_info | grep -i foopackage
    

    它将会找到所有已安装的软件包名字中包含foopackage 的软件包。 对于其他的查找, 您只需要在命令行中替换 foopackage

  • 一旦一些软件手册已被您确认安装,您可以使用 man(1) 查看它。 同样的,如果有的话,您还可以完整的查看一遍配置文件的示例,以及任何额外的文档。

  • 如果应用软件有网站, 您还可以从网站上找到文档,常见问题的解答,或其他更多。 如果您不知道它们的网站地址,请使用下面的命令

    # pkg_info foopackage-1.0.0
    

    一个 WWW: 行, 如果它存在, 它将提供一个这个应用程序的网站URL.

  • Ports 如果需要在服务器启动时运行(就像互联网服务器), 它通常会把一个脚本的样例放入 /usr/local/etc/rc.d 目录。为了保证正确性, 您可以查看这个脚本, 并编辑或更改这个脚本的名字。 详情请看启动服务


4.7 如何处理坏掉的 Ports

  如果您发现某个 port 无法正常工作, 有几件事值得尝试, 包括:

  1. 问题报告数据库 中查找是否有尚未提交的修正。 如果有, 可以使用所提议的修正。

  2. 要求 port 的监护人 (maintainer) 提供帮助。 输入 make maintainer 或阅读 Makefile 查找监护人的电子邮件地址。 请记得把 port 的名字和版本写在邮件里 (Makefile 中的 $FreeBSD:这一行) 并把错误输出的头几行发给 maintainer。

    注意: 某些 ports 并非一个人维护, 而是写了一个 邮件列表。 许多, 但并非所有 port, 使用类似 这样的地址。 请在提出问题时考虑这一点。

    特别地, 由 监护的 port, 实际上并没有人维护。 订阅这个邮件列表的人们会感谢您提供的修正和支持。 我们一直都需要更多志愿者!

    如果您没有得到回应, 则可以使用 send-pr(1) 来提交问题报告 (请参见 如何撰写 FreeBSD 问题报告)。

  3. 修正它! Porter 手册 中提供了关于 “Ports” 基础设施的详细信息, 通过了解这些内容, 您就能修正偶然坏掉的 port, 或甚至提交自己的 port 了!

  4. 从较近的 FTP 站点下载一个编译好的安装包。 “中央的” package collection 在 ftp.FreeBSD.orgpackages 目录中, 但 在此之前 一定记得先看看 本地镜像 上是否已经有了! 通常情况下这些安装包都可以直接使用, 而且应该比自行编译快一些。 安装过程本身可以通过 pkg_add(1) 来完成。


第5章  X Window 系统

根据 X.Org 的 X11 服务修改此文档 Ken Tom 和 Marc Fonvieille.

5.1 概述

  FreeBSD 使用 X11 来为用户提供功能强大的图形用户界面。 X11 是一种可以免费使用的 X 视窗系统, 其实现包括 XorgXFree86 (以及一些其他这里没有讨论的软件包)。 FreeBSD 在包括 FreeBSD 5.2.1-RELEASE 在内的版本之前, 都默认安装 XFree86, 一种由 XFree86 Project, Inc. 发布的 X11 服务。 从 FreeBSD 5.3-RELEASE 开始, 默认并且为官方支持的 X11 变成了 Xorg, 它是由 X.Org 基金会开发的 X11 服务, 采用与 FreeBSD 类似的授权。 此外, 也有一些用于 FreeBSD 的商业 X 服务器。

  这章将介绍 X11 的安装和配置, 并着重强调 Xorg 的 7.3 版。 如欲了解关于 XFree86 的详细信息 (在较早的 FreeBSD 版本中, XFree86 是默认的 X11 软件包) 或较早版本的 Xorg, 则可以访问存档的旧版 FreeBSD 使用手册, 其网址为 http://docs.FreeBSD.org/doc/

  欲了解 X11 所支持的显示卡等硬件, 请访问 Xorg 网站。

  在阅读完这一章后,您将会了解:

  • X 视窗系统的不同组件,它们是如何协同工作的。

  • 如何安装和配置 X11。

  • 如何安装和使用不同的窗口管理器。

  • 如何在 X11 中使用 TrueType® 字体。

  • 如何为您的系统设置图形登录 (XDM)。

  在阅读这一章之前,您应该:

  • 知道如何安装额外的第三方应用程序(第 4 章)。


5.2 理解 X

  对于那些熟悉其他图形环境,比如 Microsoft Windows 或者 Mac OS 的用户来说,第一次使用 X 可能会感觉很惊讶。

  通常您并不需要深入了解各种 X 组件的作用以及它们之间的相互影响, 不过, 了解一些关于它们的基础知识, 有助于更好地利用 X 的强大功能。


5.2.1 为什么要使用 X?

  X 不是第一个为 UNIX 而开发的视窗系统, 但它是最流行的。 X 的原始开发团队在开发 X 之前就已经在另外一个视窗系统上工作了。 那个系统的名字叫做 “W” (就是 “Window”)。X 只是罗马字母中 W 后面 的一个。

  X 可以被叫做 “X”, “X Window 系统”, “X11”, 等等。把 X11 称做 “X Windows” 可能会冒犯某些人; 查看 X(7) 可以了解更多的信息。


5.2.2 X 客户机/服务器模型

  X 一开始就是针对网络而设计的,所以 采用了 “client-server” 模型。在 X 模型中, “X server” 运行在有键盘,显示器,鼠标的计算机上。 服务器用来管理显示信息,处理来自键盘和鼠标的输入信息, 并与其他输入输出设备交互 (比如作为输入设备的 “tablet”, 或者作为输出设备的投影仪)。 每一个 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 不一定都要运行在同一种操作系统上, 它们甚至无需在同一种类型的计算机上运行。 在 Microsoft Windows 或 Apple 公司的 Mac OS 上运行 X server 也是可以的, 在它们上面也有很多免费的和商业化的应用程序。


5.2.3 窗口管理器

  X 的设计哲学很像 UNIX 的设计哲学, “tools, not policy”。这就意味着 X 不会试图去规定任务应该如何 去完成,而是,只给用户提供一些工具,至于决定如何使用这些工具是用户自己的 事情。

  这套哲学扩展了 X,它不会规定窗口在屏幕上应该是什么样子,要如何移动鼠标, 应该用什么键来切换窗体 (比如, Alt+Tab按键,在 Microsoft 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” 的焦点策略。 这是 Microsoft Windows 使用的典型焦点策略,也就是您在一个窗口上点击 一下鼠标,这个窗口就处于当前可用的状态。

X 不支持一些特殊的焦点策略。确切地说,窗口管理器控制着在什么时候哪个窗口 拥有焦点。不同的窗口管理器支持不同的焦点方案。它们都支持点击即获得焦点, 而且它们中的大多数都支持好几种方案。

最流行的焦点策略:

focus-follows-mouse

鼠标指示器下面的窗口就是获得焦点的窗口。 这个窗口不一定位于其他所有窗口之上。 通过将鼠标移到另一个窗口就可以改变焦点, 而不需要在它上面点击。

sloppy-focus

这种方式是对 focus-follows-mouse 策略的一个小小扩展。对于 focus-follows-mouse, 如果您把鼠标移到了根窗口(或桌面背景)上, 则所有的其它窗口都会失去焦点, 而相关的全部键盘输入也会丢失。 如果选择了 sloppy-focus, 则只有当指针进入新窗口时, 窗口焦点才会发生变化, 而当退出当前窗口时是不会变化的。

click-to-focus

当前窗口由鼠标点击来选择。窗口被“突出显示” , 出现在所有其他窗口的前面。即使指针被移向了另一个窗口,所有的键盘输入 仍会被这个窗口接收。

许多窗口管理器支持其他的策略,与这些相比又有些变化。您可以看具体 窗口管理器的文档。


5.2.4 窗口部件

  提供工具而非策略的 X 方法使得在每个应用程序屏幕上看到的窗口部件得到了 大大的扩展。

  “Widget” 只是针对用户接口中所有列举项目的一个术语,它 可以用某种方法来点击或操作;如按钮,复选框,单选按钮,图标,列表框等等。 Microsoft Windows 把这些叫做“控件”。

  Microsoft Windows 和苹果公司的 Mac OS 都有一个严格的窗口部件策略。 应用程序开发者被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。 对于 X,它并不要求一个特殊的图形风格或一套相结合的窗口部件集。

  这样的结果是您不能期望 X 应用程序只拥有一个普通的所见即所得的界面。 有很多的流行的窗口部件集设置,包括来自于 MIT 的 Athena, Motif® (模仿 Microsoft Windows 的窗口风格, 所有部件都具有斜边和3种灰色度), OpenLook, 等等。

  如今, 绝大多数比较新的 X 应用程序采用一组新式的窗口设计, 这包括 KDE 所使用的 Qt, 以及 GNOME 所使用的 GTK+。 在这样一种窗口系统下,UNIX 桌面的一些所见即所得特性作了一些收敛, 以使初学者感到更容易一些。


5.3 安装 X11

  Xorg 是 FreeBSD 上的默认 X11 实现。 Xorg 是由 X.Org 基金会发行的开放源代码 X Window 系统实现中的 X 服务。 Xorg 基于 XFree86 4.4RC2 和 X11R6.6 的代码。 从 FreeBSD Ports 套件可以安装 Xorg 的 7.3 版本。

  如果需要从 Ports Collection 编译和安装 Xorg

# cd /usr/ports/x11/xorg
# make install clean

注意: 要完整地编译 Xorg 则需要至少 4 GB 的剩余磁盘空间。

  另外 X11 也可以直接从 package 来安装。 我们提供了可以与 pkg_add(1) 工具配合使用的 X11 安装包。 如果从远程下载和安装, 在使用 pkg_add(1) 时请不要指定版本号。 pkg_add(1) 会自动地下载最新版本的安装包。

  想要从 package 安装 Xorg, 简单地输入下面的命令:

# pkg_add -r xorg

注意: 上面的例子介绍了如何安装完整的 X11 软件包, 包括服务器端,客户端,字体等等。 此外, 也有一些单独的 X11 的 ports 和 packages.

  这一章余下的部分将会讲解如何配置 X11, 以及如何设置一个高效的桌面环境。


5.4 配置 X11

Contributed by Christopher Shumway.

5.4.1 开始之前

  在配置 X11 之前, 您需要了解所安装的系统的下列信息:

  • 显示器规格

  • 显示卡的芯片类型

  • 显示卡的显存容量

  显示器的规格被 X11 用来决定显示的分辨率和刷新率。 这些规格通常可以从显示器所带的文档中, 以及制造商的网站找到。 需要知道两个数字范围: 垂直刷新率和水平刷新率。

  显示卡的芯片类型将决定 X11 使用什么模块来驱动图形硬件。 尽管系统能自动检测出绝大多数的硬件, 但事先了解在自动检测出错的时候还是很有用处的。

  显示卡的显存大小决定了系统支持的分辨率和颜色深度。 了解这些限制非常重要。


5.4.2 配置 X11

  对于 Xorg 7.3 这个版本, 可以不需要任何的配置文件就能运行,在提示符下键如下命令:

% startx

  如果这个命令并不能启动 X11, 也许是默认的配置文件不适合你机器的配置, 这时候就需要手工配置 X11 了。 配置 X11 需要几步, 第一步是以超级用户的身份建立初始的配置文件:

# Xorg -configure

  这会在 /root 中生成一个叫做 xorg.conf.new 的配置文件 (无论您使用 su(1) 或直接登录, 都会改变默认的 $HOME 目录变量)。 X11 程序将尝试探测系统中的图形硬件,并将探测到的硬件信息写入配置文件, 以便加载正确的驱动程序。

  下一步是测试现存的配置文件, 以确认 Xorg 能够同系统上的图形设备正常工作。 要完成这个任务,只需:

# Xorg -config xorg.conf.new

  如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功的。 要退出测试, 只要同时按下 Ctrl+Alt+Backspace

注意: 如果鼠标工作不正常, 则需要先配置它。 参见 FreeBSD 安装一章中的 第 2.10.10 节

  接下来是调整 xorg.conf.new 配置文件并作测试。 用文本编辑器如 emacs(1)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 (能源之星) 功能。 xset(1) 程序可以控制超时时间, 并强制待机、挂起或关机。 如果希望启用显示器的 DPMS 功能, 则需要把下面的设置添加到 monitor 节中:

        Option       "DPMS"

  关闭 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 关键字描述了要运行的默认色深。 这可以通过 Xorg(1)-depth 命令行开关来替代配置文件中的设置。 Modes 关键字描述了给定颜色深度下屏幕的分辨率。 需要说明的是, 目标系统的图形硬件只支持由 VESA 定义的标准模式。 前面的例子中, 默认色深是使用 24位色。 在采用这个色深时, 允许的分辨率是 1024x768。

  最后就是将配置文件存盘, 并使用前面介绍的测试模式测试一下。

注意: 在发现并解决问题的过程中, 包含了与 X11 服务器相关的各个设备的信息的 X11 日志文件会为您发现和排除问题有所帮助。 Xorg 日志的文件名是 /var/log/Xorg.0.log 这样的格式。 实际的日志文件名可能是 Xorg.0.logXorg.8.log 等等。

  如果一切准备妥当, 就可以把配置文件放到公共的目录中了。 您可以在 Xorg(1) 里面找到具体位置。 这个位置通常是 /etc/X11/xorg.conf/usr/local/etc/X11/xorg.conf

# cp xorg.conf.new /etc/X11/xorg.conf

  现在已经完成了 X11 的配置全过程。 Xorg 可以通过 startx(1) 工具来启动。 除此之外, X11 服务器也可以用 xdm(1) 来启动。

注意: 有一个图形配置工具 xorgcfg(1), 会随 X11 软件包一同安装。 它可以通过选择合适的驱动和设置交互式地定义配置。 这个程序可以从控制台通过命令 xorgcfg -textmode 来直接启动。 欲了解详情, 请参考 xorgcfg(1) 的联机手册。

另外还有一个叫做 xorgconfig(1) 的文本界面配置工具 这是一个控制台工具, 对用户而言不太友好, 但也正因它使用的是纯文本界面, 因此当其他工具无法工作时, 您仍可使用这个工具。


5.4.3 高级配置主题

5.4.3.1 配置 Intel® i810 显示芯片组

  配置Intel i810芯片组的显示卡需要有针对 X11 的能够用来驱动显示卡的 agpgart AGP程序接口。 请参见 agp(4) 驱动程序的联机手册了解更多细节。

  这也适用于其他的图形卡硬件配置。 注意如果系统没有将 agp(4) 驱动程序编译进内核,尝试用 kldload(8) 加载模块是无效的。 这个驱动程序必须编译进内核或者使用 /boot/loader.conf 在启动时加载进入内核。


5.4.3.2 添加宽屏平板显示器

  这一节假定您了解一些关于高级配置的知识。 如果使用前面的标准配置工具不能产生可用的配置, 则在日志文件中提供的信息应该足以修正配置使其正确工作。 如果需要的话, 您应使用一个文本编辑器来完成这项工作。

  目前的宽屏 (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 就可以在您的宽屏显示器上启动了。


5.5 在 X11 中使用字体

供稿Murray Stokely.

5.5.1 Type1 字体

  X11 使用的默认字体不是很理想。 大型的字体显得参差不齐,看起来很不专业, 并且, 在 Netscape 中, 小字体简直无法看清。 有好几种免费、 高质量的字体可以很方便地用在 X11 中。 例如,URW字体集合 (x11-fonts/urwfonts) 就包括了高质量的 标准 type1 字体 (Times Roman®, Helvetica®、 Palatino® 和其他一些)。 在 Freefont 集合中 (x11-fonts/freefonts) 也包括更多的字体, 但它们中的绝大部分使用在图形软件中,如 Gimp,在屏幕字体中使用并不完美。另外, 只要花很少的功夫,可以将 XFree86 配置成能使用 TrueType 字体:请参见后面的 TrueType 字体一节

  要安装上面的Type1字体,您只需要运行下面的命令:

# cd /usr/ports/x11-fonts/urwfonts
# make install clean

  freefont 或其他的字库和上面所说的大体类似。 为了让 X 服务器能够检测到这些字体, 需要在 X 服务器的配置文件 (/etc/X11/xorg.conf) 中增加下面的配置:

FontPath "/usr/local/lib/X11/fonts/URW/"

  或者,也可以在命令行运行:

% xset fp+ /usr/local/lib/X11/fonts/URW
% xset fp rehash

  这样会起作用,但是当 X 会话结束后就会丢失, 除非它被添加到启动文件 (~/.xinitrc 中, 针对一个寻常的 startx 会话,或者当您通过一个类似 XDM 的图形登录管理器登录时添加到 ~/.xsession 中)。 第三种方法是使用新的 /usr/local/etc/fonts/local.conf 文件: 查看 anti-aliasing 章节。


5.5.2 TrueType® 字体

  Xorg 已经内建了对 TrueType 字体的支持。有两个不同的模块能够启用这个功能。 在这个例子中使用 freetype 这个模块,因为它与其他的字体描绘后端 是兼容的。要启用 freetype 模块,只需要将下面这行添加到 /etc/X11/xorg.conf 文件的 "Module" 部分。

Load "freetype"

  现在,为 TrueType 字体创建一个目录 (比如, /usr/local/lib/X11/fonts/TrueType) 然后把所有的 TrueType 字体复制到这个目录。记住您不能直接从 Macintosh® 计算机中提取 TrueType 字体; 能被 X11 使用的必须是 UNIX/MS-DOS/Windows 格式的。 一旦您已经将这些文件复制到了这个目录, 就可以用 ttmkfdir 来创建 fonts.dir 文件, 以便让X字体引擎知道您已经安装了这些新文件。 ttmkfdir 可以在 FreeBSD Ports 套件中的 x11-fonts/ttmkfdir 中找到。

# cd /usr/local/lib/X11/fonts/TrueType
# ttmkfdir -o fonts.dir

  现在把 TrueType 字体目录添加到字体路径中。 这和上面 Type1 字体的步骤是一样的, 那就是,使用

% xset fp+ /usr/local/lib/X11/fonts/TrueType
% xset fp rehash

  或者把 FontPath 这行加到 xorg.conf 文件中。

  就是这样。现在 Netscape, Gimp, StarOffice 和其他所有的 X 应用程序 应该可以认出安装的 TrueType 字体。一些很小的字体(如在 Web 页面上高分辨率显示的文本) 和一些很大的字体(在 StarOffice 下) 现在看起来已经很好了。


5.5.3 Anti-Aliased 字体

Updated by Joe Marcus Clarke.

  X11 从 XFree86 4.0.2 开始支持字体的反走样。 但是, 字体配置在 XFree86 4.3.0 之前是非常繁琐的。 从 XFree86 4.3.0 开始, 对于所有支持 Xft 的应用程序, 所有放到 X11 /usr/local/lib/X11/fonts/~/.fonts/ 中的字体都自动地被加入反走样支持。 并不是所有的应用程序都支持 Xft, 但已经有相当多的程序提供 Xft 支持了。 支持 Xft 的应用程序包括 Qt 2.3 以及更高版本 (用以开发 KDE 桌面的工具包)、 GTK+ 2.0 和更高版本 (用于开发 GNOME 桌面的工具包), 以及 Mozilla 1.2 和更高版本。

  要控制哪些字体是 anti-aliased,或者配置 anti-aliased 特性, 创建(或者编辑,如果文件已经存在的话)文件 /usr/local/etc/fonts/local.conf。Xft 字体系统的几个 高级特性都可以使用这个文件来调节; 这一部分只描述几种最简单的情况。要了解更多的细节,请查看 fonts-conf(5).

  这个文件一定是 XML 格式的。注意确保所有的标签都完全的关闭掉。 这个文件以一个很普通的 XML 头开始, 后跟一个 DOCTYPE 定义, 接下来是 <fontconfig> 标签:

      <?xml version="1.0"?>
      <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
      <fontconfig>
   

  像前面所做的那样,在 /usr/local/lib/X11/fonts/~/.fonts/ 目录下的所有字体已经可以被支持 Xft 的 应用程序使用了。如果您想添加这两个目录以外的其他路径, 简单的添加下面这行到 /usr/local/etc/fonts/local.conf文件中:

<dir>/path/to/my/fonts</dir>

  添加了新的字体,尤其是添加了新的字体目录后, 您应该运行下面的命令重建字体缓存:

# 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>

  用 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/local/etc/fonts/local.conf 文件, 如果这个文件不存在的话。 反之, port 将创建 /usr/local/etc/fonts/local.conf-vera 文件。 将其内容合并到 /usr/local/etc/fonts/local.conf 中, 则 Bitstream 字体将自动地代替默认的 X11 Serif, Sans Serif, 以及单倍距字体。

  最后,用户可以通过他们个人的 .fonts.conf 文件来添加自己的设定。 要完成此项工作, 用户只需简单地创建 ~/.fonts.conf 并添加相关配置。 此文件也必须是 XML 格式的。

  最后:对于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: 试验一下看看那个更好。

  在下次启动 X server 时, 反锯齿 (anti-aliasing) 功能就启用了。 不过, 应用程序必须了解如何使用它, 才能因此而受益。 目前 Qt 工具包已经对其提供了全面支持, 因此整个 KDE 环境都能使用反锯齿字体。 GTK+ 和 GNOME 也可以通过 “Font” capplet 来使用反锯齿功能 (进一步细节请参见 第 5.7.1.3 节)。 默认情况下, Mozilla 1.2 及更高版本有能力自动使用反锯齿。 要禁用这一特性, 则需要使用指定 -DWITHOUT_XFT 并重新联编 Mozilla


5.6 X 显示管理器

Contributed by Seth Kingsley.

5.6.1 概要

  X 显示管理器(XDM) 是一个X视窗系统用于进行登录会话管理的可选项。 这个可以应用于多种情况下,包括小 “X Terminals”, 桌面,大网络显示服务器。既然 X 视窗系统不受网络和协议的限制, 那对于通过网络连接起来的运行 X 客户端和服务器端的不同机器, 就会有很多的可配置项。 XDM 提供了一个选择要连接到哪个显示服务器的图形接口, 只要键入如登录用户名和密码这样的验证信息。

  您也可以把 XDM 想象成与 getty(8) 工具一样(see 第 24.3.2 节 for details)。为用户提供了同样功能。它可以完成系统的登录任务, 然后为用户运行一个会话管理器 (通常是一个 X 视窗管理器)。接下来 XDM 就等待这个程序退出,发出信号用户已经登录完成,应当退出屏幕。 这时, XDM 就可以为下一个登录用户显示登录和可选择屏幕。


5.6.2 使用 XDM

  XDM 精灵程序在 /usr/local/bin/xdm 中。您可以在任何时候 用 root 来运行这个程序, 在本地机器上,它将启动管理X的画面。如果要 XDM 每次机器一启动就开始运行, 一个简单的办法是在 /etc/ttys 中加入一个记录。 有关这个文件的更多的格式和使用方法,可以看看 第 24.3.2.1 节。在默认的 /etc/ttys 文件中用于运行 XDM 守护程序的一行是这样的:

ttyv8   "/usr/local/bin/xdm -nodaemon"  xterm   off secure

  默认情况下,这个记录是关闭的,要启用它, 您需要把第5部分的 off 改为 on 然后按照 第 24.3.2.2 节 的指导 重新启动 init(8)。第一部分,这个程序将管理的终端名称是 ttyv8。这意味着 XDM 将运行在第9个虚拟终端上。


5.6.3 配置 XDM

  XDM 的配置目录是在 /usr/local/lib/X11/xdm中。在这个目录中, 您会看到几个用来改变 XDM 行为和外观的文件。您会找到这些文件:

文件 描述
Xaccess 客户端授权规则。
Xresources 默认的X资源值。
Xservers 远程和本地显示管理列表。
Xsession 用于登录的默认的会话脚本。
Xsetup_* 登录之前用于加载应用程序的脚本。
xdm-config 运行在这台机器上的所有显示的全局配置。
xdm-errors 服务器程序产生的错误。
xdm-pid 当前运行的 XDM 的进程 ID。

  当 XDM 运行时, 在这个目录中有几个脚本和程序可以用来设置桌面。 这些文件中的每一个的用法都将被简要地描述。 这些文件的更详细的语法和用法在 xdm(1) 中将有详细描述。

  默认的配置是一个矩形的登录窗口,上面有机器的名称, “Login:” 和 “Password:”。如果您想设计您自己个性化的 XDM 屏幕,这是一个很好的起点。


5.6.3.1 Xaccess

  用以连接由 XDM 所控制的显示设备的协议, 叫做 X 显示管理器连接协议 (XDMCP)。 这个文件是一组用以控制来自远程计算机的 XDMCP 连接的规则。 除非您修改 xdm-config 使其接受远程连接, 否则其内容将被忽略。 默认情况下, 它不允许来自任何客户端的连接。


5.6.3.2 Xresources

  这是一个默认的用来显示选项和登录屏幕的应用程序文件。 您可以在这个文件中对登录程序的外观进行定制。 其格式与 X11 文档中描述的默认应用程序文件是一样的。


5.6.3.3 Xservers

  这是一个选择者应当提供的作为可选的远程显示列表。


5.6.3.4 Xsession

  这是一个用户登录后针对 XDM 的默认会话脚本。通常,在 ~/.xsession 中每个用户将有一个可定制的会话脚本。


5.6.3.5 Xsetup_*

  在显示选择者或登录接口之前,这些将被自动运行。 这是一个每个显示都要用到的脚本,叫做 Xsetup_, 后面会跟一个本地显示的数字(比如 Xsetup_0)。典型的,这些脚本将在后台 (如 xconsole)运行一个或两个程序。


5.6.3.6 xdm-config

  此文件以应用程序默认值的形式, 提供了在安装时所使用的普适的显示设置。


5.6.3.7 xdm-errors

  这个文件包含了 XDM 正设法运行的的 X 服务器 的输出。 如果 XDM 正设法运行的显示由于某种原因被挂起, 那这是一个寻找错误信息的好地方。 这些信息会在每一个会话的基础上被写到用户的 ~/.xsession-errors 文件中。


5.6.4 运行一个网络显示服务器

  对于其他客户端来说, 如果希望它们能连接到显示服务器,您就必须编辑访问控制规则, 并启用连接侦听。 默认情况下, 这些都预设为比较保守的值。 要让 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 文件中的实例, 并参考 xdm(1) 的联机手册, 以了解进一步的细节。


5.6.5 替换 XDM

  有几个替换默认 XDM程序的方案。 其中之一是 上一节已经描述过的kdm (与 KDE捆绑在一起)。 kdm 提供了许多视觉上的改进和局部的修饰, 同样能让用户在启动时能选择他们喜欢的窗口管理器。


5.7 桌面环境

Contributed by Valentino Vaschetto.

  这节描述了 FreeBSD 上用于 X 的不同桌面环境。 “桌面环境” 可能仅仅是一个简单的窗口管理器, 也可能是一个像 KDE 或者 GNOME这样的完整桌面应用程序套件。


5.7.1 GNOME

5.7.1.1 有关 GNOME

  GNOME 是一个用户界面友好的桌面环境, 能够使用户很容易地使用和配置他们的计算机。 GNOME 包括一个面板(用来启动应用程序和显示状态), 一个桌面(存放数据和应用程序的地方), 一套标准的桌面工具和应用程序, 和一套与其他人相互协同工作的协议集。 其他操作系统的用户在使用 GNOME提供的强大的图形驱动环境时会觉得很好。 更多的关于 FreeBSD 上 GNOME 的信息 可以在 FreeBSD GNOME Project 的网站上找到。 此外, 这个网站也提供了相当详尽的关于安装、 配置和管理 GNOME 的常见问题解答 (FAQ)。


5.7.1.2 安装 GNOME

  这个软件可以很容易地通过预编译包或 Ports 套件来安装:

  要从网络安装GNOME, 只要键入:

# pkg_add -r gnome2

  从源代码编译GNOME,可以使用 ports树:

# cd /usr/ports/x11/gnome2
# make install clean

  一旦装好了 GNOME, 就必须告诉 X server 启动 GNOME 而不是默认的窗口管理器。

  最简单的启动 GNOME 的方法是使用 GDM, GNOME 显示管理器。 随 GNOME 桌面一同安装的 GDM (但默认是禁用的), 可以通过在 /etc/rc.conf 中加入 gdm_enable="YES" 来启用。 这样在重新启动的时候, GNOME 就会在登录时自动启动 ── 除此之外不需要进一步设置了。

  GNOME 也可以通过适当地配置名为 .xinitrc 的文件来启动。 如果已经有了自定义的 .xinitrc, 将启动当前窗口管理器的那一行改为启动 /usr/local/bin/gnome-session 就可以了。 如果还没有, 那么只需简单地:

% echo "/usr/local/bin/gnome-session" > ~/.xinitrc

  接下来输入 startxGNOME 桌面环境就启动了。

注意: 如果之前使用了一些旧式的显示管理器, 例如 XDM, 则这样做是没用的。 此时应建立一个可执行的 .xsession 文件, 其中包含同样的命令。 要完成这项工作, 需要用 /usr/local/bin/gnome-session 取代现有的窗口管理器:

% echo "#!/bin/sh" > ~/.xsession
% echo "/usr/local/bin/gnome-session" >> ~/.xsession
% chmod +x ~/.xsession

  还有一种做法, 是配置显示管理器, 以便在登录时提示您选择窗口管理器; 在 KDE 细节 环节中介绍了关于如何为 kdmKDE 的显示管理器)进行这样的配置。


5.7.1.3 在GNOME上使用Anti-aliased字体

  X11 通过“RENDER”扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 配置 anti-aliasing 在 第 5.5.3 节描述。所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序->桌面首选项->字体,然后选上 最佳形状最佳对比度,或者 像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为 1


5.7.2 KDE


5.7.2.1 有关 KDE

  KDE 是一个容易使用的现代桌面环境。 KDE 有很多很好的特性:

  • 一个美丽的现代的桌面。

  • 一个集合了完美网络环境的桌面。

  • 一个集成的帮助系统,能够方便、高效地帮助您使用 KDE 桌面和它的应用程序。

  • 所有的KDE应用程序具有一致的所见即所得界面。

  • 标准的菜单和工具栏,键盘布局,颜色配置等。

  • 国际化:KDE 可以使用超过40种语言。

  • 集中化、 统一的对话框驱动的桌面配置

  • 许多有用的 KDE应用程序。

  KDE 附带了一个名为 Konqueror 的 web 浏览器, 它是其他运行于 UNIX 系统上的 web 浏览器的一个强大的竞争对手。 要了解关于 KDE 的更多详情, 可以访问 KDE 网站。 与 FreeBSD 相关的 KDE 信息和资源, 可以在 FreeBSD 上的 KDE 团队 的网站找到。


5.7.2.2 安装 KDE

  与 GNOME 和其他桌面环境类似, 这个软件可以很容易地通过预编译包或 Ports 套件来安装:

  要从网络安装 KDE 只需要:

# pkg_add -r kde

  pkg_add(1) 就会自动的下载最新版本的应用程序。

  要从源代码编译 KDE, 可以使用 ports 树:

# cd /usr/ports/x11/kde3
# make install clean

  KDE 安装完成后, X server必须被告知启动这个应用程序以代替默认的窗口管理器。 这可以通过编辑 .xinitrc 文件来完成:

% echo "exec startkde" > ~/.xinitrc

  现在,无论您什么时候用 startx进入 X 视窗系统, KDE 就将成为您的桌面环境。

  如果使用一个像 XDM这样的显示管理器, 那配置文件可能有点不同。需要编辑一个 .xsession 文件,有关 kdm 的用法会在这章的后面介绍。


5.7.3 有关 KDE 的更多细节

  现在 KDE 已经被安装在系统中了。 通过帮助页面或点击多个菜单可以发现很多东西。 WindowsMac® 用户会有回到家的感觉。

  有关 KDE 的最好的参考资料是 它的在线文档。KDE 拥有它自己的 web 浏览器 Konqueror, 还有很多其他的应用程序和丰富文档。 这节的余下部分将讨论一些很难用走马观花的方法来学习的技术项目。


5.7.3.1 KDE 显示管理器

  如果在同一系统上有多个用户, 则管理员通常会希望使用图形化的登录界面。 前面已经提到, 使用 XDM 可以完成这项工作。 不过, KDE 本身也提供了另一个选择, 即 kdm, 它的外观更富吸引力, 而且提供了更多的登录选项。 值得一提的是, 用户还能通过菜单很容易地选择希望使用的桌面环境 (KDEGNOME 或其它)。

  要启用 kdm, 需要修改 /etc/ttys 中的 ttyv8 项。 将其改为类似下面的样子:

ttyv8 "/usr/local/bin/kdm -nodaemon" xterm on secure

5.7.4 XFce

5.7.4.1 有关XFce

  XFce是以被GNOME 使用的 GTK+ 工具包为基础的桌面环境, 但是更加轻巧,适合于那些需要一个易于使用和配置并且简单而高效的桌面的人。 看起来,它非常像使用在商业UNIX系统上的 CDE环境。 XFce的主要特性有下面这些:

  • 一个简单,易于使用的桌面。

  • 完全通过鼠标的拖动和按键来控制等。

  • CDE 相似的主面板,菜单,applets和应用launchers。

  • 集成的窗口管理器,文件管理器,声音管理器, GNOME 应用模块等等。

  • 可配置界面的主题。(因为它使用GTK+)

  • 快速,轻便,高效:对于比较老的/旧的机器或带有很少内存的机器仍然很理想。

  更多有关XFce 的信息可以参考XFce 网站


5.7.4.2 安装XFce

  有一个二进制的XFce 软件包存在(在写作的时候)。要安装的话,执行下面的命令:

# pkg_add -r xfce4

  另外,要从源代码建立,使用Ports Collection:

# cd /usr/ports/x11-wm/xfce4
# make install clean

  现在,要告诉X服务器在下次X启动时执行 XFce。 只要执行下面的命令:

% echo "/usr/local/bin/startxfce4" > ~/.xinitrc

  接下来就是启动 X, XFce将成为您的桌面。 与以前一样,如果使用像 XDM 这样的显示管理器,需要创建一个 .xsession文件,就像有关 GNOME 的那节描述的, 使用/usr/local/bin/startxfce4 命令,或者,配置显示管理器允许在启动时选择一个桌面, 就像有关kdm的那节描述的。

第II部分. 常见的任务

前面已经介绍了必要的基础知识, 手册的这一部分将讨论 FreeBSD 的一些最常用的功能。 这些章节包括:

  • 向您介绍流行和实用的桌面应用程序: 浏览器、产品工具、文档察看程序,等等。

  • 向您介绍一系列可以在 FreeBSD 上使用的多媒体工具。

  • 介绍构建定制的 FreeBSD 内核以启用附加功能的方法。

  • 详细介绍包括桌面和网络打印机在内的打印系统设置。

  • 向您展示如何在 FreeBSD 上运行 Linux 应用程序。

某些章节希望您首先阅读过其他部分,在这些章的开头部分也会给出类似的提示。

目录
第6章 桌面应用
第7章 多媒体
第8章 配置FreeBSD的内核
第9章 打印
第10章 Linux二进制兼容模式

第6章  桌面应用

Contributed by Christophe Juniet.

6.1 概述

  FreeBSD 可以运行种类繁多的桌面应用程序, 这包括像浏览器和字处理这样的软件。 绝大多数这样的程序都可以通过 package 来安装, 或者从 Ports Collection 自动地构建。 许多新用户希望能够在它们的系统中找到这样的应用程序。 这一章将向您展示如何轻松地使用 package 或者 Ports Collection 中安装这样的软件。

  需要注意的是从 ports 安装意味着要编译源码。 根据编译的 ports 和电脑速度的不同, 这可能需要花费相当长的时间。 若是您觉得编译源码太过耗时的话, 绝大多数 ports 也有预编译的版本可供安装。

  因为 FreeBSD 提供的二进制兼容 Linux 的特性, 许多原本为 Linux 开发的程序都可以直接用在您的桌面。 在安装任何的 Linux 应用程序之前, 强烈的推荐您阅读 第 10 章。 当您在寻找特定的 ports 时, 可以使用 whereis(1)。 一般来说, 许多利用 Linux 二进制兼容特性的 ports 都以“linux-”开头。 在下面的介绍中,都假设安装 Linux 应用程序前已经开启了 Linux 二进制兼容功能。

  本章涵盖以下种类应用程序:

  • 浏览器 (例如 MozillaOperaFirefoxKonqueror)

  • 办公、图象处理 (例如 KOfficeAbiWordGIMPOpenOffice.org)

  • 文档查看 (例如 Acrobat Reader®gvXpdfGQview)

  • 财务 (例如 GnuCashGnumericAbacus)

  阅读这章之前,您应该:

  • 知道如何安装额外的第三方软件(第 4 章)。

  • 知道如何安装 Linux 软件(第 10 章)。

  想要获得更多的有关多媒体环境的信息,请阅读 第 7 章。如果您想要建立和使用电子邮件, 请参考第 26 章


6.2 浏览器

  FreeBSD并没有预先安装特定的浏览器。然而,在 ports 的目录 www 有许多浏览器可以安装。如果您没有时间一一编译它们 (有些时候这可能需要花费相当长的时间) 大部分都有 package 可用。

  KDEGNOME 已经提供 HTML 浏览器。 请参考第 5.7 节得到更多完整的有关设定这些桌面环境的信息。

  如果您要找小型的浏览器, 可以试试看 www/dillowww/linkswww/w3m

  这一节涉及如下程序:

程序名称 资源需求 安装时间 主要依赖
Mozilla 大量时间和空间 Gtk+
Opera 轻松 同时有可用的 FreeBSD 和 Linux 版本。 Linux 版本需要使用 Linux 二进制兼容模块和 linux-openmotif
Firefox 中等 Gtk+
Konqueror 中等 需要 KDE

6.2.1 Mozilla

  Mozilla 是一个完全移植到 FreeBSD 上的现代化的、 稳定的浏览器。 它拥有非常合乎标准的 HTML 支持, 它也能处理邮件和阅读新闻组。 假如您打算做一个自己的主页的话,它甚至提供一个 HTML 编辑器。 Netscape 的使用者可能觉得它和 Communicator 非常相似, 两者有些部分实际上是相通的。

  在 CPU 速度低于 233MHz 或者内存少于 64MB 的老式电脑上,Mozilla 会占用相当多资源而难以使用。您也许可以试试 Opera 浏览器,本章稍后将会介绍它。

  也许基于某种原因,您不能或者不想编译 Mozilla,FreeBSD GNOME 团队已经为您制作好了 package。只需要通过网络安装它:

# pkg_add -r mozilla

  如果没 package 可用,而您又有足够的时间和磁盘空间,您可以获取 Mozilla 的源码来编译并安装它到您的系统上。 执行以下指令既可:

# cd /usr/ports/www/mozilla
# make install clean

  Mozilla 需要 root 权限执行 chrom 注册来确定正确的初始化。另外, 如果您想要一些额外的插件比如象 mouse gestures,您也必须以 root 权限执行 Mozilla 以便正确的安装。

  一旦您完成了 Mozilla 安装,您就再也不需要 root 权限了。您可以用如下方式执行 Mozilla

% mozilla

  也可以用如下方式直接运行电子邮件和新闻阅读器:

% mozilla -mail

6.2.2 Firefox

  Firefox 是基于 Mozilla 代码系的下一代浏览器。 Mozilla 是一个完整的应用程序套件, 包含了浏览器、 邮件客户端、 聊天客户端等等。 而 Firefox 则只是一个浏览器, 这使得它体积更小并且执行速度更快。

  您可以通过输入下面的命令来安装预编译的包:

# pkg_add -r firefox

  如果您喜欢从源代码编译, 则可以使用 Ports 套件来完成这项工作:

# cd /usr/ports/www/firefox
# make install clean

6.2.3 Firefox、 Mozilla 与 Java™ 插件

注意: 在这一节和下一节中, 我们均假定您已经安装了 FirefoxMozilla

  FreeBSD 基金会拥有来自 Sun Microsystems 的关于发布针对 FreeBSD 的预编译版本的 Java 运行环境 (JRE™) 和 Java 开发包 (JDK™) 的授权。 用于 FreeBSD 的预编译版本可以在 FreeBSD 基金会 网站上找到。

  要为 FirefoxMozilla 添加 Java™ 支持, 您必须首先安装 java/javavmwrapper port。 接下来, 从 http://www.freebsdfoundation.org/downloads/java.shtml 下载 Diablo JRE 软件包, 并使用 pkg_add(1) 来安装它。

  启动浏览器, 并在地址栏中输入 about:plugins 然后按 Enter。 浏览器将给出一个页面, 其中会显示已经安装的插件, 您应在这个列表中找到 Java 插件。 如果不是这样的话, 则需要以 root 身份执行下列命令:

# ln -s /usr/local/diablo-jre1.5.0/plugin/i386/ns7/libjavaplugin_oji.so \
  /usr/local/lib/browser_plugins/

  然后重新启动浏览器。


6.2.4 Firefox、 Mozilla 与 Macromedia® Flash™ 插件

  Macromedia® Flash™ 插件并没有直接提供其 FreeBSD 版本。 不过, 我们有一个软件层 (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, 身份执行下面的命令:

# ln -s /usr/local/lib/npapi/linux-flashplugin/libflashplayer.so \
  /usr/local/lib/browser_plugins/
# ln -s /usr/local/lib/npapi/linux-flashplugin/flashplayer.xpt \
  /usr/local/lib/browser_plugins/

  重新启动浏览器之后, 插件就应该会在前面提到的那个列表中有所体现了。

注意: linuxpluginwrapper 只能在 i386 架构上运行。


6.2.5 Opera

  Opera 是一个功能齐全, 并符合标准的浏览器。 它还提供了内建的邮件和新闻阅读器、 IRC 客户端, RSS/Atom feed 阅读器以及更多功能。 除此之外, Opera 是一个比较轻量的浏览器, 其速度很快。 它提供了两种不同的版本: “native” FreeBSD 版本, 以及通过 Linux 模拟运行的版本。

  要使用 Opera 的 FreeBSD 版本来浏览网页,安装以下的 package:

# pkg_add -r opera

  有些 FTP 站点没有所有版本的 package, 但仍然可以通过 Ports 套件来安装 Opera

# cd /usr/ports/www/opera
# make install clean

  要安装 Linux 版本的 Opera,将上面例子中的 opera 替换为 linux-opera。Linux 版本在某些情况下非常有用,象是使用只有 Linux 版本的插件,例如 Adobe Acrobat Reader。就其它方面来说, FreeBSD 和 Linux 版本的功能是完全一样的。


6.2.6 Konqueror

  KonquerorKDE 的一部分,不过也可以通过安装 x11/kdebase3 在非 KDE 环境下使用。 Konqueror 不止是一个浏览器, 也是一个文件管理器和多媒体播放器。

  也有种类丰富的插件能够配合 Konqueror 一起使用, 您可以通过 misc/konq-plugins 来安装它们。

  Konqueror 也支持 Flash; 关于如何获得用于 KonquerorFlash 支持的 “How To” 文档 可以在 http://freebsd.kde.org/howto.php 找到。


6.3 办公、图象处理

  当需要进行办公或者进行图象处理时, 新用户通常都会找一些好用的办公套件或者字处理软件。 尽管目前有一些 桌面环境, 如 KDE 已经提供了办公套件, 但目前这还没有一定之规。 无论您使用那种桌面环境, FreeBSD 都能提供您需要的软件。

  这节涉及如下程序:

软件名称 资源需求 安装时间 主要依赖
KOffice KDE
AbiWord Gtk+GNOME
The Gimp Gtk+
OpenOffice.org JDK 1.4Mozilla

6.3.1 KOffice

  KDE 社区提供了一套办公套件, 它能用在桌面环境。它包含四个标准的组件,这些组件可以在其它办公套件中找到。 KWord 是字处理程序、 KSpread 是电子表格程序、 KPresenter 是演示文档制作管理程序、 Kontour是矢量绘图软件。

  安装最新的 KOffice 之前,先确定您是否安装了最新版的 KDE

  使用 package 来安装 KOffice,安装细节如下:

# pkg_add -r koffice

  如果没有可用的 package,您可以使用 Ports Collection 安装。 安装 KDE3KOffice 版本,如下:

# cd /usr/ports/editors/koffice-kde3
# make install clean

6.3.2 AbiWord

  AbiWord 是一个免费的字处理程序,它看起来和 Microsoft Word 的感觉很相似。 它适合用来打印文件、信函、报告、备忘录等等, 它非常快且包含许多特性,并且非常容易使用。

  AbiWord 可以导入或输出很多文件格式, 包括一些象 Microsoft .doc 这类专有格式的文件。

  AbiWord 也有 package 的安装方式。您可以用以下方法安装:

# pkg_add -r abiword

  如果没有可用的 package,它也可以从 Ports Collection 编译。ports collection 应该是最新的。它的安装方式如下:

# cd /usr/ports/editors/abiword
# make install clean

6.3.3 GIMP

  对图象的编辑或者加工, GIMP 是一个非常精通图象处理的软件。 它可以被用来当作简单的绘图程序或者一个专业的照片处理套件。 它支持大量的插件和具有脚本界面的特性。 GIMP 可以读写众多的文件格式, 支持扫描仪和手写板。

  您可以用下列命令安装:

# pkg_add -r gimp

  如果您在 FTP 站点没有找到这个 package,您也可以使用 Ports Collection 的方法安装。ports 的 graphics 目录也包含有 Gimp 手册。 以下是安装它们的方法:

# cd /usr/ports/graphics/gimp
# make install clean
# cd /usr/ports/graphics/gimp-manual-pdf
# make install clean

注意: Ports 中的 graphics 目录也有开发中的 GIMP 版本 graphics/gimp-devel。 HTML 版本的 Gimp 手册 可以在 graphics/gimp-manual-html 找到。


6.3.4 OpenOffice.org

  OpenOffice.org 包括一套完整的办公套件: 字处理程序、 电子表格程序、 演示文档管理程序和绘图程序。 它和其它的办公套件的特征非常相似,它可以导入输出不同的流行的文件格式。 它支持许多种语言 ── 国际化已经渗透到了其界面、 拼写检查和字典等各个层面。

  OpenOffice.org 的字处理程序使用 XML 文件格式使它增加了可移植性和灵活性。 电子表格程序支持宏语言和使用外来的数据库界面。 OpenOffice.org 已经可以平稳的运行在 WindowsSolaris™、Linux、FreeBSD 和 Mac OS X 等各种操作系统下。 更多的有关 OpenOffice.org 的信息可以在 OpenOffice.org 网页 找到。 对于特定的 FreeBSD 版本的信息,您可以在直接在 FreeBSD OpenOffice 移植团队的页面下载。

  安装 OpenOffice.org 方法如下:

# pkg_add -r openoffice.org

注意: 如果您正在使用 FreeBSD 的 -RELEASE 版本, 一般来说这样做是没问题的。 如果不是这样, 您就可能需要看一看 FreeBSD OpenOffice.org 移植小组的网站, 并使用 pkg_add(1) 从那里下载并安装合适的软件包。 最新的发布版本和开发版本都可以在那里找到。

  装好 package 之后, 您只需输入下面的命令就能运行 OpenOffice.org 了:

% openoffice.org

注意: 在第一次运行时, 将询问您一些问题, 并在您的主目录中建立一个 .openoffice.org2 目录。

  如果没有可用的 OpenOffice.org package,您仍旧可以选择编译 port。然而, 您必须记住它的要求以及大量的磁盘空间和相当长的时间编译。

# cd /usr/ports/editors/openoffice.org-2
# make install clean

注意: 如果希望联编一套进行过本地化的版本, 将前述命令行改为:

# make LOCALIZED_LANG=your_language install clean

您需要将 your_language 改为正确的 ISO-代码。 所支持的语言代码可以在 files/Makefile.localized 文件中找到, 这个文件位于 port 的目录。

  一旦完成上述操作, 就可以通过下面的命令来运行 OpenOffice.org 了:

% openoffice.org

6.4 文档查看器

  UNIX 系统出现以来, 一些新的文档格式开始流行起来; 它们所需要的标准查看器可能不一定在系统内。 本节中, 我们将了解如何安装它们。

  这节涵盖如下应用程序:

软件名称 资源需求 安装时间 主要依赖
Acrobat Reader Linux二进制兼容
gv Xaw3d
Xpdf FreeType
GQview Gtk+GNOME

6.4.1 Acrobat Reader®

  现在许多文档都用 PDF 格式, 根据“轻便小巧文档格式”的定义。一个被建议使用的查看器是 Acrobat Reader,由 Adobe 所发行的 Linux 版本。因为 FreeBSD 能够运行 Linux 二进制文件, 所以它也可以用在 FreeBSD 中。

  要从 Ports collection 安装 Acrobat Reader 7, 只需:

# cd /usr/ports/print/acroread7
# make install clean

  由于授权的限制, 我们不提供预编译的版本。


6.4.2 gv

  gvPostScript® 和 PDF 文件格式查看器。它源自 ghostview 因为使用 Xaw3d 函数库让它看起来更美观。 它很快而且界面很干净。gv 有很多特性比如象纸张大小、刻度或者抗锯齿。 大部分操作都可以只用键盘或鼠标完成。

  安装 gv package,如下:

# pkg_add -r gv

  如果您无法获取预编译的包, 则可以使用 Ports collection:

# cd /usr/ports/print/gv
# make install clean

6.4.3 Xpdf

  如果您想要一个小型的 FreeBSD PDF 查看器, Xpdf 是一个小巧并且高效的查看器。 它只需要很少的资源而且非常稳定。它使用标准的 X 字体并且不需要 Motif 或者其它的 X 工具包。

  安装 Xpdf package,使用如下命令:

# pkg_add -r xpdf

  如果 package 不可用或者您宁愿使用 Ports Collection,如下:

# cd /usr/ports/graphics/xpdf
# make install clean

  一旦安装完成,您就可以启动 Xpdf 并且使用鼠标右键来使用菜单。


6.4.4 GQview

  GQview 是一个图片管理器。 您可以单击鼠标来观看一个文件、开启一个外部编辑器、 使用预览和更多的功能。它也有幻灯片播放模式和一些基本的文件操作。 您可以管理采集的图片并且很容易找到重复的。 GQview 可以全屏幕观看并且支持国际化。

  如果您想要安装 GQview package,如下:

# pkg_add -r gqview

  如果您没有可用的 package 或者您宁愿使用 Ports Collection,如下:

# cd /usr/ports/graphics/gqview
# make install clean

6.5 财务

  假如,基于任何的理由,您想要在 FreeBSD Desktop 管理您个人的财政,有一些强大并且易于使用的软件可以被您选择安装。 它们中的一些与流行的文件格式兼容象 Quicken®Excel 文件。

  本节涵盖如下程序:

软件名称 资源需求 安装时间 主要依赖
GnuCash GNOME
Gnumeric GNOME
Abacus Tcl/Tk
KMyMoney KDE

6.5.1 GnuCash

  GnuCashGNOME 的一部分,GNOME 致力于为最终用户提供用户友好且功能强大的软件。使用 GnuCash,您可以关注您的收入和开支、您的银行帐户, 或者您的股票。它的界面特性看起来非常的专业。

  GnuCash 提供一个智能化的注册、帐户分级系统、 很多键盘快捷方式和自动完成方式。它能分开一个单个的处理到几个详细的部分。 GnuCash 能导入和合并 Quicken QIF 文件格式。 它也支持大部分的国际日期和流行的格式。

  在您的系统中安装 GnuCash 所需的命令如下:

# pkg_add -r gnucash

  如果 package 不可用,您可以使用 Ports Collection 安装:

# cd /usr/ports/finance/gnucash
# make install clean

6.5.2 Gnumeric

  Gnumeric 是一个电子表格程序, GNOME 桌面环境的一部分。 它以通过元素格式和许多片断的自动填充系统来方便的自动“猜测”用户输入而著称。 它能导入一些流行的文件格式,比如象 ExcelLotus 1-2-3Quattro ProGnumeric 凭借 math/guppi 支持图表。 它有大量的嵌入函数和允许所有通常比如象、数字、货币、日期、 时间等等的一些单元格式。

  以 package 方式安装 Gnumeric 的方法如下:

# pkg_add -r gnumeric

  如果 package 不可用,您可以使用 Ports Collection 安装:

# cd /usr/ports/math/gnumeric
# make install clean

6.5.3 Abacus

  Abacus 是一个小巧易用的电子表格程序。 它包含许多嵌入函数在一些领域如统计学、财务和数学方面很有帮助。 它能导入和输出 Excel 文件格式。 Abacus 可以产生 PostScript 输出。

  以 package 的方式安装 Abacus 的方法如下:

# pkg_add -r abacus

  如果 package 不可用,您可以使用 Ports Collection 安装:

# cd /usr/ports/deskutils/abacus
# make install clean

6.5.4 KMyMoney

  KMyMoney 是一个 KDE环境下的个人财务管理软件。 KMyMoney 旨在提供并融合各种商业财务管理软件所有的重要特性。 它也同样注重易用性和特有的复式记帐功能。 KMyMoney 能从标准的 Quicken Interchange Format (QIF) 文件导入数据, 追踪投资,处理多种货币并能提供一个财务报告。 另有可用的插件支持导入 OFX 格式的数据。

  以 package 的方式安装 KMyMoney 的方法如下:

# pkg_add -r kmymoney2

  如果 package 不可用,您可以使用 Ports Collection 安装:

# cd /usr/ports/finance/kmymoney2
# make install clean

6.6 总结

  尽管 FreeBSD 由于其高性能和可靠性而获得了许多 ISP 的信赖, 但它也完全可以用于桌面环境。 拥有数以千计的 packagesports 能够帮您迅速建立完美的桌面环境。

  下面是本章涉及到的所有的软件的简要回顾:

软件名称 Package 名称 Ports 名称
Mozilla mozilla www/mozilla
Opera opera www/opera
Firefox firefox www/firefox
KOffice koffice-kde3 editors/koffice-kde3
AbiWord abiword editors/abiword
The GIMP gimp graphics/gimp
OpenOffice.org openoffice editors/openoffice-1.1
Acrobat Reader acroread print/acroread7
gv gv print/gv
Xpdf xpdf graphics/xpdf
GQview gqview graphics/gqview
GnuCash gnucash finance/gnucash
Gnumeric gnumeric math/gnumeric
Abacus abacus deskutils/abacus

第7章  多媒体

编辑: Ross Lippert. 中文翻译: 张 雪平.

7.1 概述

  FreeBSD 广泛地支持各种声卡, 让您可以从容地享受来自您的计算机的高保真输出。 这包括了录制和播放 MPEG Audio Layer 3 (MP3)、 WAV、 以及 Ogg Vorbis 等许多种格式声音的能力。 FreeBSD 同时也包括了许多的应用程序,让您可以录音、 增加声音效果以及控制附加的MIDI设备。

  要是乐于动手, FreeBSD 也能支持播放一般的视频文件和 DVD。 对各种视频媒体进行编码、 转换和播放的应用程序比起处理声音的应用程序略少一些。 例如, 在撰写这章时, FreeBSD Ports Collection 中还没有类似 audio/sox 那样好的重编码工具能够用来在不同的格式之间转换。 不过, 这个领域的软件研发进展是很快的。

  本章将介绍配置声卡的必要步骤。 X11 的安装和配置 (第 5 章) 里已经考虑到了您显卡的问题, 但要想有更好的播放效果, 仍需要调整一些东西。

  读了本章后,您将知道:

  • 如何配置系统识别声卡。

  • 测试声卡是否正常工作的方法。

  • 如何排除声卡安装中的问题。

  • 如何播放和编码MP3以及其它格式的音频。

  • X 服务器如何支持视频。

  • 哪些好的视频播放/压缩“ports”。

  • 如何播放 DVD、 .mpg 以及 .avi 文件。

  • 如何从 CD 和 DVD 中提取文件。

  • 怎样配置电视卡。

  • 如何配置图像扫描仪。

  在读本章这前,您应该:

  • 知道如何配置、安装一个新的内核 (第 8 章)

警告:mount(8) 命令去装载CD光盘,至少会产生一个错误, 更糟的情况下会产生 kernel panic。 这种媒体所用的编码与通常的ISO文件系统是不同的。


7.2 安装声卡

贡献者 Moses Moore. Enhanced for FreeBSD 5.X by Marc Fonvieille.

7.2.1 配置系统

  在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。 FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 硬件兼容说明 中支持的音频设备列表看看是否支持您的声卡, 硬件兼容说明也会说明支持您声卡的是哪个驱动程序。

  要使用声卡, 就应装载正确的驱动程序。完成的方式有两种: 最简单的是使用命令 kldload(8) 来装载一个内核模块,在命令行输入

# kldload snd_emu10k1

  或者在文件 /boot/loader.conf 里加入一行,内容如下

snd_emu10k1_load="YES"

  上边实例用于 Creative SoundBlaster® Live! 声卡。 其它可装载的模块列在文件 /boot/defaults/loader.conf 里边。 如果不知道应该使用哪个驱动, 您可以尝试加载 snd_driver module:

# kldload snd_driver

  这是个 meta 驱动,一次加载了最常见的设备驱动。 这会提高搜索正确驱动的速度。也可以通过 /boot/loader.conf 工具来加载所有的声卡驱动。

  如果希望在加载了 snd_driver meta 驱动之后了解到底选择了哪种声卡, 可以通过使用 cat /dev/sndstat 来查询 /dev/sndstat 文件。

  另外,您也可以把支持您声卡的代码静态地编译到内核里去。 下一节就采用这种方式支持硬件给出提示。 关于重新编译内核,请参考 第 8 章


7.2.1.1 定制内核使其支持声卡

  要做的第一件事情就是添加通用音频框架驱动 sound(4) 到内核中, 您需要添加下面这行到内核配置文件中:

device sound

  接下来就是加入对我们所用声卡的支持了。 首先需要确定我们的声卡需要使用哪一个驱动。 您可以参考 硬件兼容列表 所列出的音频设备, 以确定您声卡的驱动。 例如, Creative SoundBlaster Live! 声卡由 snd_emu10k1(4) 驱动来支持。 要添加它, 需要在内核编译配置文件中加入下面一行:

device snd_emu10k1

  一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的具体写法, 也可以在 /usr/src/sys/conf/NOTES 文件中找到。

  非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息 (IRQ、 I/O 端口, 等等), 这一点与其他不支持即插即用的 ISA 卡类似。 这项工作可以通过 /boot/device.hints 文件来完成。 系统启动时, loader(8) 将读取这个文件, 并将其中的配置传给内核。 例如, 旧式的 Creative SoundBlaster 16 ISA 非即插即用卡需要使用 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 文件中所使用的语法, 在 sound(4) 联机手册中以及所用的具体声卡驱动的联机手册中, 会进行进一步的讲解。

  上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 snd_sbc(4) 联机手册了解更多信息。


7.2.2 测试声卡

  用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中 (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 文件来查询:

# 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 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 常见问题列在 第 7.2.2.1 节 一节。

  如果一切正常,您现在应该拥有一个多功能声卡了。 如果您的 CD-ROM 或者 DVD-ROM 驱动器的音频输出线已经与声卡连在一起, 您可以把 CD 放入驱动器并用 cdcontrol(1) 来播放:

% cdcontrol -f /dev/acd0 play 1

  许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。

  另一种快速测试声卡的方法, 是将数据发送到 /dev/dsp, 像这样做:

% cat filename > /dev/dsp

  这里 filename 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。

  声卡混音级别可以通过 mixer(8) 命令更改。 更多细节可以在 mixer(8) 联机手册中找到。


7.2.2.1 常见问题

错误信息 解决方法
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 提供的声卡支持经常是造成麻烦的祸根。


7.2.3 利用多个声源

贡献者Munish Chopra.

  同时有多个声源的声音在播放, 这是完全可能的, 例如当 esound 或者 artsd 不支持与其它程序共享音频设备时。

  FreeBSD 可以通过 虚拟声道(Virtual Sound Channels) 来达到这样的效果, 它可以用 sysctl(8) 来启用。 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。

  使用两条sysctl命令来设置虚拟声道的数目。 如果您是 root 用户, 执行下面的操作:

# sysctl hw.snd.pcm0.vchans=4
# sysctl hw.snd.maxautovchans=4

  上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。hw.snd.pcm0.vchanspcm0 的虚拟声道数,一当链接上一个设备它就可配置了。 hw.snd.maxautovchans 是分配给新的音频设备的虚拟声道数, 此时这个设备要用 kldload(8) 来链接。 因为 pcm 模块可以独立装载许多硬件驱动程序, 因此 hw.snd.maxautovchans 也就可以存储分配给以后链接到的设备的虚拟声道数。

注意: 您不能在使用某个设备的时候改变其虚拟通道数。 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。

  如果不使用 devfs(5), 就必须把应用程序指向 /dev/dsp0.x, 其中 x 为0到3, 因为在上面的例子里 hw.snd.pcm.0.vchans 被设为了4。 在使用 devfs(5) 的系统中, 当应用程序请求 /dev/dsp0 时, 系统会自动为其分配一个而无需额外干预。


7.2.4 如何设置混音器通道值

这一节的作者是 Josef El-Rayes.

  不同的混音通道的默认音量是硬编码进 pcm(4) 驱动程序的。 同时, 也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如:

hint.pcm.0.vol="50"

  这将在 pcm(4) 模块加载时, 将通道音量设置为默认的 50。


7.3 MP3音频

贡献者Chern Lee.

  MP3 (MPEG Layer 3 Audio)达到过CD音质的效果,FreeBSD工作站没理由会缺少这样的好东东。


7.3.1 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 文件, 如下所示:

# 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 设备。


7.3.2 抓取CD音轨

  在对CD或CD音轨编码成MP3之前, CD上的音频数据应先抓到硬盘里。 这个可以通过复制原始的CDDA(CD数字音频)数据成为波形(WAV)文件。

  工具 cdda2wavsysutils/cdrtools 套件的一部份,可用来从CD中获取音频及其相关信息。

  把CD放到光驱里,下面的命令可以完成 (作为 root用户) 把整张 CD 分割成单个 (每个音轨) 的WAV文件:/para>

# cdda2wav -D 0,1,0 -B


  cdda2wav 支持 ATAPI (IDE)光驱。 从IDE光驱中抓取音轨, 需要用设备名称代替SCSI的单元号。 例如, 想从 IDE 光驱中抓取第7道音轨:

# cdda2wav -D /dev/acd0 -t 7

  参数 -D 0,1,0 表示 SCSI 设备 0,1,0, 与命令 cdrecord -scanbus 的输出相对应。

  抓取单轨,要使用选项 -t,如下所示:

# cdda2wav -D 0,1,0 -t 7

  这个实例用于抓取第七个音轨。要抓取一定范围的音轨,如从1到7:

# cdda2wav -D 0,1,0 -t 1+7

  利用dd(1)也可以从ATAPI光驱中抓取音轨,从 第 18.6.5 节 可以了解更多。


7.3.3 MP3 编码

  现今,可选的MP3编码器是 lameLame 可以从ports树里的 audio/lame 处找到。

  利用抓取的WAV文件,下边的命令就可以把 audio01.wav 转换成 audio01.mp3

# 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 占用更多的磁盘空间--但音质会更高。选项 -h 控制 “高品质但低速度 (higher quality but a little slower)” 模式的开关。 选项 --t 表示把 ID3 标签--通常包含了歌曲的信息, 植入到MP3文件里。 其它的编码选项可以查询 lame 的联机手册。


7.3.4 MP3 解码

  要把MP3歌曲刻录成音乐CD,就需要把它转换成非压缩的波形(WAV)格式。 XMMSmpg123 都支持把MP3输出成非压缩格式文件。

  在 XMMS 中输出到磁盘:

  1. 启动 XMMS.

  2. 在窗口里右击鼠标,弹出 XMMS 菜单。

  3. 选项(Options) 里选择 设定(Preference)

  4. 改变输出插件成 “写磁盘插件(Disk Writer Plugin)”。

  5. 配置(Configure)

  6. 输入或选择一个目录用于存放解压的文件。

  7. 象平常一样,把MP3文件装入到 XMMS 里边, 把音量调节到100%并且关掉EQ设定。

  8. 按一下 播放(Play) ── XMMS 如同在播放mp3一样,只是听不到声音。 实际上是在播放mp3到一个文件里。

  9. 要想再听MP3歌曲,记得把默认的输出插件设回原来的值。

  用 mpg123 进行标准输出:

  1. 执行 mpg123 -s audio01.mp3 > audio01.pcm

   XMMS 输出的文件是波形(WAV)格式, 而 mpg123 则把MP3转换成无压缩的PCM 音频数据。两种格式都支持用 cdrecord 刻录成音乐CD。 使用 burncd(8) 您就必须使用无压缩的PCM。 如果选择波形格式, 就要注意在每道开始时的一小点杂音, 这段声音是波形文件的头部份。 可以使用工具 SoX 来轻松去除。 SoX 可从 audio/sox port 或包(package)中安装得到:

% sox -t wav -r 44100 -s -w -c 2 track.wav track.raw

  阅读 第 18.6 节 这部份可以了解到更多在 FreeBSD 里刻盘的信息。


7.4 视频回放

贡献者Ross Lippert.

  视频回放是个很新并且迅速发展中的应用领域。 一定要有耐心,因为不是所有的事情都象处音频那么顺利。

  在开始之前,您要了解显卡的类型以及它所用的芯片的类型。 尽管 XorgXFree86 支持大量的显卡, 但能达到好的回放效果的却寥寥无几。 在X11运行时,您可以使用命令 xdpyinfo(1) 获得使用您的显卡的X服务器所支持的扩展列表。

  为了评估各种播放器和设置,您需要有一小段用作测试的MPEG文件。 由于一些DVD播放器会默认地在 /dev/dvd 里去找DVD文件, 因此, 您会发现建立符号链接到恰当的设备会很有用:

# ln -sf /dev/acd0 /dev/dvd
# ln -sf /dev/acd0 /dev/rdvd

  注意:由于 devfs(5) 本身的原因, 像这样手工建立的链接在重启后将不会存在。 想要无论什么时候您启动系统都能自动建立符号链接, 那就把下边这行加到 /etc/devfs.conf 里边:

link acd0 dvd
link acd0 rdvd

  另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。

  为了改善 X11 界面使用共享内存的能力, 建议提高一些 sysctl(8) 变量的值:

kern.ipc.shmmax=67108864
kern.ipc.shmall=32768

7.4.1 测定视频的性能

  在X11下有几种可以显示图像的方式。 到底哪个能工作很大程度上依赖于硬件。 首先, 下边描述的每一种方法在不同的硬件上都会有不同的品质。 其次, 在X11里的图像显示近来引起普遍的关注, 随着 XorgXFree86 的每一个版本, 都会有很大的突破。

  常见图像接口列表:

  1. X11: 一般性的使用共享内存的X11输出。

  2. XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。

  3. SDL: 简单直接媒体层。

  4. DGA: 直接图片存取。

  5. SVGAlib: 低层次掌控图片层。


7.4.1.1 XVideo

  XorgXFree86 4.X 有种扩展叫做 XVideo (或称Xvideo, Xv, xv), 它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。 即使在低端的计算机 (例如我的PIII 400 Mhz膝上电脑), 这个扩展也提供了很好的播放质量。

  要了解这一扩展是否在正常工作, 使用 xvinfo 命令:

% 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, 则只是说明您的显示器在满足刷新图像的计算要求上存在更大的困难。 尽管显卡和处理器很重要,您仍然会有个不错的显示效果。 此外, 您也可以参考我们提供的文献, 在 第 7.4.3 节 中有所介绍。


7.4.1.2 简单直接媒体层

  简单直接媒体层(SDL),原意是做为 Microsoft Windows、BeOS 以及 UNIX 之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL 层可以在低层访问硬件, 有时这样做就比 X11 接口层更为高效。

  关于 SDL, 可以参考 devel/sdl12


7.4.1.3 直接图形存取

  直接图形存取 (Direct Graphics Access) 是一种 X11 扩展, 通过它, 应用程序能够绕过 X 服务, 并直接修改画面缓存 (framebuffer)。 由于它依赖一种底层的内存映射来实现其功能, 因此使用它的程序必须以 root 身份来执行。

  DGA 扩展可以通过 dga(1) 来完成测试和性能测量。 运行 dga 时, 它将随按键改变现实的颜色。 按 q 退出这个程序。


7.4.2 Ports 和 包(Packages) 对视频的解决

  这部份主要讨论在 FreeBSD Ports 集中提供的可用于视频回放的软件。 视频回放在软件发展中是个很活跃的领域, 并且各种不同程序的功能可能与这里的描述不尽相同。

  首先要弄清楚的重要一点是在 FreeBSD 上使用的视频程序其发展与在 Linux 里使用的是一样的。 大部份程序都还处在β阶段。使用 FreeBSD 的包可能面对的问题:

  1. 一个应用程序不能播放其它程序制作的文件。

  2. 一个应用程序不能播放其自已制作的文件。

  3. 不同机上的同样的程序,各自重新建立(rebuild)了一次, 播放同一个文件结果也会有不同。

  4. 一个看起来没什么的过滤器, 如图像尺寸的调整, 也有可能因为一个调整例程的问题变得很不象样。

  5. 应用程序频繁地留下垃圾(dumps core)。

  6. 没有随 port 一起安装的文档可以在网上或者 port 的 work 目录中找到。

  这些程序中许多也体现了 “Linux主义”。即, 有些问题来自于(程序)使用的标准库存在于Linux的发行版中, 或者有些是 Linux 内核的功能, 而该程序的作者事先所假定了的是 Linux内核。这些问题并不总是被 port 编护人员注意到或处理过, 这也就可能导致如下问题:

  1. 使用/proc/cpuinfo去检测处理器的特性。

  2. 滥用线程可能导致一个程序悬挂完成,而不是完全中止。

  3. 软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。

  现在,这些程序的开发人员也已同 port 的维护人员进行了联合, 以减少制作port时出错。


7.4.2.1 MPlayer

  MPlayer 是近来开发的同时也正迅速发展着的一个视频播放器。 MPlayer 团队的目标是在 Linux 和其它 UNIX 系统中的速度和机动性能。 在团队的创始人实在受不了当时可用的播放器的性能时, 这个计划就开始了。 有人也许会说图形接口已经成为新型设计的牺牲品。 但是一旦您习惯了命令行选项和按键控制方式,它就能表现得很好。


7.4.2.1.1 创建MPlayer

  MPlayer 可以从 multimedia/mplayer 找到。 MPlayer 在联编过程中会进行许多硬件检测, 而得到的可执行文件因此将无法移植到其他系统中使用。 因此, 从 ports 完成联编而不是安装预编译的包就很重要。 另外, 在 make 命令行还可以指定许多选项, 在 Makefile 中有所描述, 接下来我们开始联编:

# cd /usr/ports/multimedia/mplayer
# 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 的文档。


7.4.2.1.2 使用MPlayer

  任何 MPlayer 用户必须在其用户主目录下建立一个叫 .mplayer 的子目录。 输入下边的内容来建立这个必须的子目录:

% cd /usr/ports/multimedia/mplayer
% make install-user

  在 mplayer 的手册里列出了它的命令选项。 HTML文档里有更为详细的信息。 这部份里, 我们只是描述了很少的常见应用。

  要播放一个文件,如 testfile.avi, 可以通过各种视频接口当中的某一个去设置 -vo 选项:

% mplayer -vo xv testfile.avi
% mplayer -vo sdl testfile.avi
% mplayer -vo x11 testfile.avi
# mplayer -vo dga testfile.avi
# mplayer -vo 'sdl:dga' testfile.avi

  所有这些选项都是值得一试的, 因为它们的性能依赖很多因素,并且都与硬件密切相关。

  要播放 DVD, 需要把 testfile.avi 改为 dvd://N -dvd-device DEVICE。 这里 N 是要播放的节目编号, 而 DEVICE 则是 DVD-ROM 的设备节点。 例如, 要播放 /dev/dvd 的第三个节目:

# mplayer -vo xv dvd://3 -dvd-device /dev/dvd

注意: 可以在编译 MPlayer 时, 通过 WITH_DVD_DEVICE 来指定默认的 DVD 设备。 系统内定的默认设备是 /dev/acd0。 更多细节, 请参考 port 的 Makefile

  要停止、暂停、前进等等,可以参考设定的按键---这些可以通过 mplayer -h 得到或查看手册。

  另外,回放的重要选项是:用于全屏模式的 -fs -zoom 和起辅助完成作用的-framedrop

  为了让 mplayer 的命令行不是太长,使用者可以通过建立一个文件 .mplayer/config 来设定如下默认选项:

vo=xv
fs=yes
zoom=yes

  最后,mplayer 可以把DVD题目(title)抓取成为 .vob 文件。为了从DVD中导出第二个题目,请输入:

# mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd

  输出文件 out.vob 将是 MPEG 并且可以被这部份描述的其它 “包” 利用。


7.4.2.1.3 mencoder

  在使用 mencoder 之前, 首先熟悉其 HTML 文档中所介绍的选项是一个不错的主意。 它提供了联机手册, 但如果没有 HTML 文档则帮助不大。 有无数种方法来提高视频品质、 降低比特率、 修改格式, 而这些技巧可能会影响性能。 下面是几个例子, 第一个是简单地复制:

% mencoder input.avi -oac copy -ovc copy -o output.avi

  不正确的命令选项组合可能使生成的文件不能被 mplayer 播放。因此,如果您只是想抓取文件, 一定在 mplayer 里使用 “-dumpfile”。

  转换 input.avi 成为带有MPEG3音频编码 (要求 audio/lame ) 的MPEG4编码:

% mencoder input.avi -oac mp3lame -lameopts br=192 \
     -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi

  这样就产生了可被 mplayerxine播放的输出。

  input.avi 可以换成 dvd://1 -dvd-device /dev/dvd 并以 root 的身份来执行, 以重新对 DVD 节目进行编码。 由于您第一次做这样的工作时很可能会对结果不太满意, 建议您首先把节目复制成文件, 然后对它进行操作。


7.4.2.2 xine视频播放器

  xine 视频播放器是一个关注范围很广的项目, 它不仅看准多合一的视频解决, 而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。 发行有 “包” 和port版本-- multimedia/xine

  xine 播放器仍然很粗糙, 但这很显然与好开头无关。实际上 xine 要求你有快速的 CPU 和快速的显卡来运行,或者需要支持 XVideo 扩展。 图形界面(GUI)可以使用,但很勉强。

  到写这章时,还没有可用于播放CSS编码的DVD文件的输入模块随同 xine 一起发行。 第三方的建造(builds)里内建有这样的模块, 但都不属于FreeBSD Ports 集。

  与MPlayer 相比, xine 为用户考虑得更多, 但同时,对用户来说也少了很多有条理的控制方式。 xine 播放器在XVideo接口上做得不错。

  默认情况下,播放器 xine 启动的时候会使用图形界面。那么就可以使用菜单打开指定的文件:

% xine

  另外,没有图形界面也可以使用如下命令立即打开播放文件:

% xine -g -p mymovie.avi

7.4.2.3 使用transcode

  transcode 这个软件并不是播放器, 而是一系列用于对视频和音频文件进行重新编码的工具。 通过使用 transcode, 就可以拥有使用带 stdin/stdout 接口的命令行工具来合并视频文件, 以及修复坏损文件的能力。

  在联编 multimedia/transcode port 时可以指定大量选项, 我们建议使用下面的命令行来构建 transcode

# 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):

% transcode -i input.avi -V --export_prof vcd-pal -o output_vcd
% 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 以了解更多信息和例子。


7.4.3 进一步了解

  FreeBSD里不同的视频软件包正迅速发展中。 很可能在不久的将来,这里所谈到的问题都将得到解决。 同时,有些人想超越FreeBSD的音/像(A/V)能力, 那他们就不得不从一些FAQ和指南里学知识, 并使用一些不同的应用程序。 这里就给这些读者指出一些补充信息。

   MPlayer 文档 是很技术性的。 这些文档可以给那些希望获得关于UNIX视频高级技术的人们提供参考。 MPlayer 邮件列表很不喜欢没耐心阅读文档的人, 如果您发现什么问题想报告给他们,请首先RTFM。

  xine HOWTO 里边有一章是关于提高性能的,对所有的播放器都很适应。

  最后是一些很有前途的程序,读者可以试一下:


7.5 安装电视卡

原创: Josef El-Rayes. 改编:Marc Fonvieille.

7.5.1 介绍

  电视卡可以让您在您的计算机里观看到无线或有线电视。 许多卡是通过RCA或S-video输入接收复合视频, 而且有些卡还带有调频广播接收器。

  FreeBSD 通过bktr(4)驱动程序,提供了对基于PCI的电视卡的支持, 要求这些卡使用的是Brooktree Bt848/849/878/879 或 Conexant CN-878/Fusion 878a视频采集芯片。 您还要确保这个板上带的有被支持的调谐器, 参考bktr(4)手册查看所支持的调谐器列表。


7.5.2 增加驱动程序

  要使用您的卡,您就要装载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.

  当然,这些信息可能因您的硬件不同而有所区别。 但是您应该能检查那个调制器是否被正确检测到了, 可能要忽略一些检测到的同sysctl(8) MIB(管理系统库)和内核配置文件选项一起的参数。 例如,如果您想强制使用Philips(飞利浦) SECAM制式的调谐器 , 您就应把下列行加到内核配置文件里:

options OVERRIDE_TUNER=6

  或者,您直接使用sysctl(8)

# sysctl hw.bt848.tuner=6

  请参见 bktr(4) 手册和 /usr/src/sys/conf/NOTES 文件, 以了解更多详细关于可用选项的资料。


7.5.3 有用的应用程序

  要使用您的电视卡,您需要安装下列应用程序之一:

  • multimedia/fxtv 提供 “窗口电视(TV-in-a-window)” 功能和图像/声音/图像采集功能。

  • multimedia/xawtv 也是一款电视应用程序,功能同 fxtv 一样。

  • misc/alevt 解码和显示Videotext/Teletext。

  • audio/xmradio, 一款用于一些电视卡的调频电台调谐器的程序。

  • audio/wmtune, 一款用于电台调谐器的便捷的桌面程序。

  更多的程序在FreeBSD Ports Collection(Ports 集)里。


7.5.4 问题解决

  如果您的电视卡遇到了什么问题, 您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被bktr(4) 驱动程序支持,并且是不是使用了正确的配置选项。 想得到更多支持和关于您的电视卡的各种问题, 您可以接触和使用freebsd-multimedia 邮件列表的压缩包。


7.6 图象扫描仪

撰写人 Marc Fonvieille.

7.6.1 介绍

  在 FreeBSD 中, 访问扫描仪的能力, 是通过 SANE (Scanner Access Now Easy) API 提供的。 SANE 也会使用一些 FreeBSD 设备驱动来访问扫描仪硬件。

  FreeBSD 支持 SCSI 和 USB 扫描仪。 在做任何配置之前请确保您的扫描仪被 SANE 支持。 SANE 有一个 支持的设备 列表, 可以为您提供有关扫描仪的支持情况和状态的信息。 uscanner(4) 手册页也提供了一个支持的 USB 扫描仪列表。


7.6.2 内核配置

  上面提到 SCSI 和 USB 接口都是支持的。 取决于您的扫描仪接口, 需要不同的设备驱动程序。


7.6.2.1 USB 接口

  默认的 GENERIC 内核包含了支持 USB 扫描仪需要的设备驱动。 如果您决定使用一个定制的内核, 确保下面在您的内核配置文件中存在下面这些行:

device usb
device uhci
device ohci
device uscanner

  取决于您主板上的 USB 芯片, 您只需要 device uhci 或者 device ohci 中的一种,但是两个都在 内核配置文件中是没有害处的。

  如果您不想重新编译内核而且您的内核也不是 GENERIC 的, 您可以用 kldload(8) 命令直接加载 uscanner(4) 设备驱动模块:

# kldload uscanner

  要在每次系统启动的时候加载这个模块, 添加下面这行到 /boot/loader.conf 中:

uscanner_load="YES"

  在使用正确的内核重启系统, 或加载了所需的内核模块之后, 就可以将您的 USB 扫描仪接到计算机上了。 在系统消息缓冲中, (dmesg(8)) 应该会出现一行表示检测到您的扫描仪的信息:

uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2

  这表明我们的扫描仪正在使用 /dev/uscanner0 设备节点。


7.6.2.2 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

  如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 camcontrol(8) 命令执行一次 SCSI 总线扫描:

# 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 设备列表里:

# 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 设备的更多细节, 可查看 scsi(4)camcontrol(8) 手册页。


7.6.3 SANE 配置

  SANE 系统分为两部分: 后端 (graphics/sane-backends) 和前端 (graphics/sane-frontends)。 后端部分提供到扫描仪自身的访问。 SANE支持设备列表详细说明了哪一个后端可以支持您的图象扫描仪。 如果您想使用您的设备,就必须为您的扫描仪选定正确的后端。 前端部分提供图形化的扫描界面 (xscanimage)。

  要做的第一步就是安装 graphics/sane-backends port 或者 package。然后,使用 sane-find-scanner 命令来检查 SANE 系统做的扫描仪检测:

# sane-find-scanner -q
found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3

  输出显示了扫描仪的接口类型和扫描仪连接到系统上的设备节点。 生产厂家和产品型号可能没有显示,不过不重要。

注意: 一些 USB 扫描仪需要您加载固件,后端的手册页中有这方面的解释。 您也应该阅读 sane-find-scanner(1) sane(7) 手册页。

  现在我们需要检查扫描仪是否可以被扫描前端识别。 默认情况下, SANE 后端自带一个叫做 scanimage(1) 的命令行工具。 这个命令允许您列出设备以及从命令行执行图片扫描。 -L 选项用来列出扫描仪设备:

# scanimage -L
device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner

  如果没有输出任何信息, 或提示没有识别到扫描仪, 则说明 scanimage(1) 无法识别它。 如果发生这种情况, 您就需要修改扫描仪支持后端的配置文件, 并定义所使用的扫描设备。 /usr/local/etc/sane.d/ 目录中包含了所有的后端配置文件。 这类识别问题经常会在某些 USB 扫描仪上发生。

  例如, 对于在 第 7.6.2.1 节 中所使用的 USB 扫描仪, sane-find-scanner 会给出下面的信息:

# sane-find-scanner -q
found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0

  扫描仪被正确的探测到了,它使用 USB 接口,连接在 /dev/uscanner0 设备节点上。 我们现在可以检查看看扫描仪是否被正确的识别:

# 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

  请确保阅读后端配置文件提供的注释以及后端手册页了解更多细节, 并使用正确的语法。我们现在可以检验扫描仪是否被识别到了:

# scanimage -L
device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner

  我们的 USB 扫描仪被识别到了。 此时如果商标和型号与扫描仪的实际情况不符, 并不会带来太大的麻烦。 您需要关注的是 `epson:/dev/uscanner0' 字段, 这个给了我们正确地后端名称和正确的设备节点。

  一旦 scanimage -L 命令可以看到扫描仪, 配置就完成了。设备现在准备好等待扫描了。

   scanimage(1) 允许我们从命令行执行图片扫描, 相比之下使用图形用户界面来执行图片扫描会更好。 SANE 提供了一个简单但实用的图形界面: xscanimage (graphics/sane-frontends)。

  Xsane (graphics/xsane)是另一个流行的图形扫描前端。 这个前端提供了一些高级特性, 比如多样的扫描模式(photocopy,fax,等。), 色彩校正,批量扫描,等等。这两个程序都可以作为 GIMP 的插件使用。


7.6.4 授权其他用户访问扫描仪

  前面所有的操作都是用 root 权限来完成的。 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/uscanner0,这个节点属于 operator 组。将用户 joe 添加到 operator 组会允许他使用扫描仪:

# pw groupmod operator -m joe

  要了解更多细节, 请阅读 pw(8) 联机手册。 此外, 还需要为 /dev/uscanner0 设备节点设置正确的写入权限 (0660 或 0664), 因为默认情况下, operator 组只能读这个设备节点。 这项工作可以通过在 /etc/devfs.rules 文件中添加如下设置来自东完成:

[system=5]
add path uscanner0 mode 660

  随后您还需要在 /etc/rc.conf 中添加下面的内容并重新启动:

devfs_system_ruleset="system"

  关于这些配置的进一步细节请参考联机手册 devfs(8)

注意: 当然, 考虑安全的原因, 在您将用户添加到任何组, 尤其是 operator 组时, 都应三思而后行。


第8章  配置FreeBSD的内核

Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.

8.1 概述

  内核是 FreeBSD 操作系统的核心。 它负责管理内存、 执行安全控制、 网络、 磁盘访问等等。 尽管 FreeBSD 可以动态修改的现在已经越来越多, 但有时您还是需要重新配置和编译您的内核。

  读完这章,您将了解:

  • 为什么需要建立定制的内核。

  • 如何编写内核配置文件,或修改已存在的配置文件。

  • 如何使用内核配置文件创建和联编新的内核。

  • 如何安装新内核。

  • 如何处理出现的问题。

  这一章给出的命令应该以 root 身份执行, 否则可能会不成功。


8.2 为什么需要建立定制的内核?

  过去, FreeBSD 采用称作 “单片式” 的内核。 这句话的意思是说内核是一个大的程序, 支持固定的设备, 如果您希望改变内核的行为则必须编译一个新的, 并重新启动计算机来引导它。

  今天, FreeBSD 已经迅速地转移到了一个新的模型, 其重要特征是内核功能可以由能够根据需要动态加载和卸载的模块来提供。 这使得内核能够迅速地适应硬件的调整 (例如笔记本电脑的 PCMCIA), 或为内核增加在最初编译它时所不具备的新的功能。 这一模式成为模块化内核。

  尽管如此, 一些功能仍然需要静态地连编进内核。 一些情况是因为这些功能于内核的结合十分紧密, 而不可能将它们做成可以动态加载的。 另一种情况是因为没有人有时间来编写实现那个功能的可以动态加载的内核模块。

  建造定制的内核是几乎每一个 BSD 用户所必须经历的一关。 尽管这项工作可能比较耗时, 但它能够为使用 FreeBSD 系统带来很多好处。 与必须支持大量各式硬件的 GENERIC 内核不同, 定制的内核可以只包含对于 您的 PC 硬件的支持。 这有很多好处, 例如:

  • 更快地启动。 因为内核只需要检测您系统上的硬件, 启动时所花费的时间将大大缩短。

  • 使用更少的内存。 定制的内核通常会比 GENERIC 内核使用更少的内存, 由于内核必须时刻处于物理内存中, 因此这就显得更加重要。 基于这样的原因, 对于内存较小的系统来说, 定制内核将发挥更大的作用。

  • 支持更多的硬件。 定制的内核允许您增加类似声卡这样的 GENERIC 内核没有提供内建支持的硬件。


8.3 发现系统硬件

作者 Tom Rhodes.

  在尝试配置内核以前,比较明智的做法是先获得一份机器硬件的清单。 当 FreeBSD 并不是主操作系统时,通过查看当前操作系统的配置可以很容易的 创建一份机器硬件的配置清单。举例来说, Microsoft设备管理器 里通常含有关于已安装硬件的重要信息。 设备管理器 位于控制面板。

注意: 某些版本的 Microsoft Windows 有一个 系统 图标会指明 设备管理器 的位置。

  如果机器上并不存在其他的操作系统, 系统管理员只能手动寻找这些信息了。其中的一个方法是使用 dmesg(8) 工具以及 man(1) 命令。FreeBSD 上大多数的驱动程序都有一份手册页(manual page)列出了所支持的硬件, 在系统启动的时候,被发现的硬件也会被列出。举例来说, 下面的这几行表示 psm 驱动找到了一个鼠标:

psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: [ITHREAD]
psm0: model Generic PS/2 mouse, device ID 0

  这个驱动需要被包含在客户制定的内核配置文件里, 或着使用 loader.conf(5) 加载。

  有时,dmesg 里只会显示来自系统消息的数据, 而不是系统启动时的检测信息。在这样的情况下,你可以查看文件 /var/run/dmesg.boot

  另一个查找硬件信息的方法是使用 pciconf(8) 工具, 它能提供更详细的输出,比如:

[email protected]:3:0:0:        class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
    vendor     = 'Atheros Communications Inc.'
    device     = 'AR5212 Atheros AR5212 802.11abg wireless'
    class      = network
    subclass   = ethernet

  这个片断取自于 pciconf -lv 命令的输出,显示 ath 驱动找到了一个无线以太网设备。输入命令 man ath 就能查阅有关 ath(4) 的手册页(manual page)了。

  还可以传给 man(1) 命令 -k 选项, 同样能获得有用的信息。例如:

# man -k Atheros

  能得到一份包含特定词语的手册页(manual page):

ath(4)                   - Atheros IEEE 802.11 wireless network driver
ath_hal(4)               - Atheros Hardware Access Layer (HAL)

  手头备有一份硬件的配置清单, 那么编译制定内核的过程就显得不那么困难了。


8.4 建立并安装一个定制的内核

  首先对内核构建目录做一个快速的浏览。 这里所提到的所有目录都在 /usr/src/sys 目录中; 也可以通过 /sys 来访问它。 这里的众多子目录包含了内核的不同部分, 但对我们所要完成的任务最重要的目录是 arch/conf, 您将在这里编辑定制的内核配置; 以及 compile, 编译过程中的文件将放置在这里。 arch 表示 i386alphaamd64ia64powerpcsparc64, 或 pc98 (在日本比较流行的另一种 PC 硬件开发分支)。 在特定硬件架构目录中的文件只和特定的硬件有关; 而其余代码则是与机器无关的, 则所有已经或将要移植并运行 FreeBSD 的平台上都共享这些代码。 文件目录是按照逻辑组织的, 所支持的硬件设备、 文件系统, 以及可选的组件通常都在它们自己的目录中。

  这一章提供的例子假定您使用 i386 架构的计算机。 如果您的情况不是这样, 只需对目录名作相应的调整即可。

注意: 如果您的系统中 没有 /usr/src/sys 这样一个目录, 则说明没有安装内核源代码。 安装它最简单的方法是通过以 root 身份运行 sysinstall, 选择 Configure, 然后是 Distributionssrc, 选中其中的 basesys。 如果您不喜欢 sysinstall 并且有一张 “官方的” FreeBSD CDROM, 也可以使用下列命令, 从命令行来安装源代码:

# mount /cdrom
# mkdir -p /usr/src/sys
# ln -s /usr/src/sys /sys
# cat /cdrom/src/ssys.[a-d]* | tar -xzvf -
# cat /cdrom/src/sbase.[a-d]* | tar -xzvf -

  接下来, 进入 arch/conf 目录下面, 复制 GENERIC 配置文件, 并给这个文件起一个容易辨认的名称, 它就是您的内核名称。例如:

# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL

  通常,这个名称是大写的,如果您正维护着多台不同硬件的FreeBSD机器, 以您机器的域名来命名是非常好的主意。我们把它命名为MYKERNEL就是这个原因。

提示: 将您的内核配置文件直接保存在 /usr/src 可能不是一个好主意。 如果您遇到问题, 删掉 /usr/src 并重新开始很可能是一个诱人的选择。 一旦开始做这件事, 您可能几秒钟之后才会意识到您同时会删除定制的内核配置文件。 另外, 也不要直接编辑 GENERIC, 因为下次您 更新代码 时它会被覆盖, 而您的修改也就随之丢失了。

您也可以考虑把内核配置文件放到别的地方, 然后再到 i386 目录中创建一个指向它的符号链接。

例如:

# cd /usr/src/sys/i386/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/MYKERNEL   
# ln -s /root/kernels/MYKERNEL

注意: 必须以 root 身份执行这些和接下来命令, 否则就会得到 permission denied 的错误提示。

  现在就可以用您喜欢的文本编辑器来编辑 MYKERNEL 了。 如果您刚刚开始使用 FreeBSD, 唯一可用的编辑器很可能是 vi, 它的使用比较复杂, 限于篇幅, 这里不予介绍, 您可以在 参考书目 一章中找到很多相关书籍。 不过, FreeBSD 也提供了一个更好用的编辑器, 它叫做 ee, 对于新手来说, 这很可能是一个不错的选择。 您可以修改配置文件中的注释以反映您的配置, 或其他与 GENERIC 不同的地方。

  如果您在SunOS或者其他BSD系统下定制过内核,那这个文件中的绝大部分将对您非常熟悉。 如果您使用的是诸如DOS这样的系统,那GENERIC配置文件看起来就非常困难, 所以在下面的 配置文件章节将慢慢地、仔细地进行介绍。

注意: 如果您和 FreeBSD project 进行了 代码同步, 则一定要在进行任何更新之前查看 /usr/src/UPDATING。 这个文件中描述了更新过的代码中出现的重大问题或需要注意的地方。 /usr/src/UPDATING 总是和您的 FreeBSD 源代码对应, 因此能够提供比手册更具时效性的新内容。

  现在应该编译内核的源代码了。

联编内核

  1. 进入 /usr/src 目录:

    # cd /usr/src
    
  2. 编译内核:

    # make buildkernel KERNCONF=MYKERNEL
    
  3. 安装新内核:

    # make installkernel KERNCONF=MYKERNEL
    

注意: 使用这种方法联编内核时, 需要安装完整的 FreeBSD 源代码。

提示: 默认情况下, 在联编您所定制的内核时, 全部 内核模块也会同时参与构建。 如果您希望更快地升级内核, 或者只希望联编您所需要的模块, 则应在联编之前编辑 /etc/make.conf

MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs

这个变量的内容是所希望构建的模块列表。

WITHOUT_MODULES = linux acpi sound/sound sound/driver/ds1 ntfs

这个变量的内容是在联编过程中将不被编译的模块列表。 如果希望了解更多与构建内核有关的变量, 请参见 make.conf(5) 联机手册。

  新内核将会被复制到 /boot/kernel 目录中成为 /boot/kernel/kernel 而旧的则被移到 /boot/kernel.old/kernel。 现在关闭系统, 然后用新的内核启动计算机。 如果出现问题, 后面的一些 故障排除方法 将帮您摆脱困境。 如果您的内核 无法启动, 请参考那一节。

注意: 其他与启动过程相关的文件, 如 loader(8) 及其配置, 则放在 /boot。 第三方或定制的模块也可以放在 /boot/kernel, 不过应该注意保持模块和内核的同步时很重要的, 否则会导致不稳定和错误。


8.5 配置文件

Updated for FreeBSD 6.X by Joel Dahl.

  配置文件的格式是非常简单的。 每一行都包括一个关键词, 以及一个或多个参数。 实际上, 绝大多数行都只包括一个参数。 在 # 之后的内容会被认为是注释而忽略掉。 接下来几节, 将以 GENERIC 中的顺序介绍所有关键字。 如果需要与平台有关的选项和设备的详细列表, 请参考与 GENERIC 文件在同一个目录中的那个 NOTES, 而平台无关的选项, 则可以在 /usr/src/sys/conf/NOTES 找到。

注意: 如果您需要一份包含所有选项的文件, 例如用于测试目的, 则应以 root 身份执行下列命令:

# cd /usr/src/sys/i386/conf && make LINT

  下面是一个 GENERIC 内核配置文件的例子, 它包括了一些需要解释的注释。 这个例子应该和您复制的 /usr/src/sys/i386/conf/GENERIC 非常接近。

machine        i386

  这是机器的架构, 他只能是 alpha, amd64, i386, ia64, pc98, powerpc, 或 sparc64 中的一种。

cpu          I486_CPU
cpu          I586_CPU
cpu          I686_CPU

  上面的选项指定了您系统中所使用的 CPU 类型。 您可以使用多个 CPU 类型 (例如, 您不确定是应该指定 I586_CPUI686_CPU)。 然而对于定制的内核, 最好能够只指定您使用的那种 CPU。 如果您对于自己使用的 CPU 类型没有把握, 可以通过查看 /var/run/dmesg.boot 中的启动信息来了解。

ident          GENERIC

  这是内核的名字。 您应该取一个自己的名字, 例如取名叫 MYKERNEL, 如果您一直在按照前面的说明做的话。 您放在 ident 后面的字符串在启动内核时会显示出来, 因此如果希望能够容易区分常用的内核和刚刚定制的内核, 就应该采取不同的名字 (例如, 您想定制一个试验性的内核)。

#To statically compile in device wiring instead of /boot/device.hints
#hints          "GENERIC.hints"         # Default places to look for devices.

   device.hints(5) 可以用来配置设备驱动选项。 在启动的时候 loader(8) 将会检查缺省位置 /boot/devicehints。 使用 hints 选项您就可以把这些 hints 静态编译进内核。 这样就没有必要在 /boot下创建devicehints

makeoptions     DEBUG=-g          # Build kernel with gdb(1) debug symbols

  一般的 FreeBSD 联编过程, 在所联编的内核指定了 -g 选项时, 由于此选项将传递给 gcc(1) 表示加入调试信息, 因此会将调试符号也包含进来。

options          SCHED_4BSD         # 4BSD scheduler

  这是 FreeBSD 传统上使用的默认系统调度器。 请保留此选项。

options          PREEMPTION         # Enable kernel thread preemption

  允许内核线程根据优先级的抢占调度。 这有助于改善交互性, 并可以让中断线程更早地执行, 而无须等待。

options          INET              # InterNETworking

  网络支持,即使您不打算连网,也请保留它,大部分的程序至少需要回环网络(就是和本机进行网络连接),所以强烈要求保留它。

options          INET6             # IPv6 communications protocols

  这将打开IPv6连接协议。

options          FFS               # Berkeley Fast Filesystem

  这是最基本的硬盘文件系统,如果打算从本地硬盘启动,请保留它。

options          SOFTUPDATES       # Enable FFS Soft Updates support

  这个选项会启用内核中的 Soft Updates 支持, 它会显著地提高磁盘的写入速度。 尽管这项功能是由内核直接提供的, 但仍然需要在每个磁盘上启用它。 请检查 mount(8) 的输出, 以了解您系统中的磁盘上是否已经启用了 Soft Updates。 如果没有看到 soft-updates 选项, 则需要使用 tunefs(8) (对于暨存系统) 或 newfs(8) (对于新系统) 命令来激活它。

options          UFS_ACL           # Support for access control lists

  这个选项将启用内核中的访问控制表的支持。 这依赖于扩展属性以及 UFS2, 以及在 第 14.12 节 中所介绍的那些特性。 ACL 默认是启用的, 并且如果已经在文件系统上使用了这一特性, 就不应再关掉它, 因为这会去掉文件的访问控制表, 并以不可预期的方式改变受保护的文件的访问方式。

options          UFS_DIRHASH       # Improve performance on big directories

  通过使用额外的内存,这个选项可以加速在大目录上的磁盘操作。 您应该在大型服务器和频繁使用的工作站上打开这个选项,而在磁盘操作不是很重要的 小型系统上关闭它,比如防火墙。

options          MD_ROOT           # MD is a potential root device

  这个选项将打开以基于内存的虚拟磁盘作为根设备的支持。

options          NFSCLIENT         # Network Filesystem Client
options          NFSSERVER         # Network Filesystem Server
options          NFS_ROOT          # NFS usable as /, requires NFSCLIENT

  网络文件系统。 如果您不打算通过 TCP/IP 挂接 UNIX 文件服务器的分区, 就可以注释掉它。

options          MSDOSFS           # MSDOS Filesystem

  MS-DOS 文件系统。 只要您不打算在启动时挂接由 DOS 格式化的硬盘分区, 就可以把它注释掉。 如前面所介绍的那样, 在您第一次挂接 DOS 分区时, 内核会自动加载需要的模块。 此外, emulators/mtools 软件提供了一个很方便的功能, 通过它您可以直接访问 DOS 软盘而无需挂接或卸下它们 (而且也完全不需要 MSDOSFS)。

options          CD9660            # ISO 9660 Filesystem

  用于 CDROM 的 ISO 9660 文件系统。 如果没有 CDROM 驱动器或很少挂接光盘数据 (因为在首次使用数据 CD 时会自动加载), 就可以把它注释掉。 音乐 CD 并不需要这个选项。

options          PROCFS            # Process filesystem (requires PSEUDOFS)

  进程文件系统。 这是一个挂接在 /proc 的一个 “假扮的” 文件系统, 其作用是允许类似 ps(1) 这样的程序给出正在运行的进程的进一步信息。 多数情况下, 并不需要使用 PROCFS, 因为绝大多数调试和监控工具, 已经进行了一系列修改, 使之不再依赖 PROCFS: 默认安装的系统中并不会挂接这一文件系统。

options          PSEUDOFS          # Pseudo-filesystem framework

  在 6.X 内核中, 如果希望使用 PROCFS, 就必须加入 PSEUDOFS 的支持。

options          GEOM_GPT          # GUID Partition Tables.

  这个选项提供了在磁盘上使用大量的分区的能力。

options          COMPAT_43         # Compatible with BSD 4.3 [KEEP THIS!]

  使系统兼容4.3BSD。不要去掉这一行,不然有些程序将无法正常运行。

options          COMPAT_FREEBSD4   # Compatible with FreeBSD4

  为了支持在旧版本的FreeBSD下编译的程序,该选项在FreeBSD 5.X i386和Alpha systems下需要打开。 最好在所有的i386和Alpha systems下打开这个选项,因为可能要运行老应用程序。 在5.X才开始支持的平台,比如ia64和Sparc64,就不需要这个选项。

options          COMPAT_FREEBSD5   # Compatible with FreeBSD5

  对于 FreeBSD 6.X 和更高版本而言, 如果希望在其上运行为 FreeBSD 5.X 版本联编的、 用到 FreeBSD 5.X 系统调用接口的程序, 则需要使用这个选项。

options          SCSI_DELAY=5000  # Delay (in ms) before probing SCSI

  这将让内核在探测每个 SCSI 设备之前等待 5 秒。 如果您只有 IDE 硬盘驱动器, 就可以不管它, 反之您可能会希望尝试降低这个数值以加速启动过程。 当然, 如果您这么做之后 FreeBSD 在识别您的 SCSI 设备时遇到问题, 则您还需要再把它改回去。

options          KTRACE            # ktrace(1) support

  这个选项打开内核进程跟踪,在调试时很有用。

options          SYSVSHM           # SYSV-style shared memory

  提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸, 不少绘图相关程序会自动使用SHM来提供额外的速度。如果您要使用X Window,您最好加入这个选项。

options          SYSVMSG           # SYSV-style message queues

  支持 System V 消息。 这只会在内核中增加数百字节的空间占用。

options          SYSVSEM           # SYSV-style semaphores

  支持System V 信号量, 不常用到, 但只在kernel中占用几百个字节的空间。

注意: ipcs(1) 命令的 -p 选项可以显示出任何用到这些 System V 机制的进程。

options         _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions

  在 1993 年 POSIX® 添加的实时扩展。 在 Ports Collection 中某些应用程序会用到这些 (比如StarOffice)。

options          KBD_INSTALL_CDEV  # install a CDEV entry in /dev

  这个选项是在 /dev下建立键盘设备节点必需的。

options          ADAPTIVE_GIANT    # Giant mutex is adaptive.

  内核全局锁 (Giant) 是一种互斥机制 (休眠互斥体) 的名字, 它用于保护许多内核资源。 现在, 这已经成为了一种无法接受的性能瓶颈, 它已经被越来越多地使用保护单个资源的锁代替。 ADAPTIVE_GIANT 选项将使得内核全局锁作为一种自适应自旋锁。 这意味着, 当有线程希望锁住内核全局锁互斥体, 但互斥体已经被另一个 CPU 上的线程锁住的时候, 它将继续运行, 直到那个线程释放锁为止。 一般情况下, 另一个线程将进入休眠状态并等待下一次调度。 如果您不确定是否应该这样做的话, 一般应该打开它。

注意: 请注意在 FreeBSD 8.0-CURRENT 及以后的版本,所有的互斥体默认都是自适应的, 除非在编译时使用 NO_ADAPTIVE_MUTEXES 选项, 明确的指定为非自适应。因此,内核全局锁(Giant)目前默认也是自适应的, 而且 ADAPTIVE_GIANT 选项已经从内核配置文件中移出。

device          apic               # I/O APIC

  apic 设备将启用使用 I/O APIC 作为中断发送设备的能力。 apic 设备可以被 UP 和 SMP 内核使用, 但 SMP 内核必须使用它。 要支持多处理器, 还需要加上 options SMP

注意: The apic device exists only on the i386 architecture, this configuration line should not be used on other architectures.

device          eisa

  如果您的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。

device          pci

  如果您的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。

# Floppy drives
device          fdc

  这是软驱控制器。

# ATA and ATAPI devices
device          ata

  这个驱动器支持所有ATA和ATAPI设备。您只要在内核中加入device ata选项, 就可以让内核支持现代计算机上的所有PCI ATA/ATAPI设备。

device          atadisk                 # ATA disk drives

  这个是使用 ATAPI 硬盘驱动器时必须加入的选项。

device          ataraid                 # ATA RAID drives

  这个选项需要 device ata, 它用于 ATA RAID 驱动。


device          atapicd                 # ATAPI CDROM drives

  这个是ATAPI CDROM驱动器所必须的。

device          atapifd                 # ATAPI floppy drives

  这个是ATAPI 软盘驱动器所必须的。

device          atapist                 # ATAPI tape drives

  这个是ATAPI 磁带机驱动器所必须的.

options         ATA_STATIC_ID           # Static device numbering

  这指定对控制器使用其静态的编号; 如果没有这个选项, 则会动态地分配设备的编号。

# SCSI Controllers
device          ahb        # EISA AHA1742 family
device          ahc        # AHA2940 and onboard AIC7xxx devices
options         AHC_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~128k to driver.
device          ahd        # AHA39320/29320 and onboard AIC79xx devices
options         AHD_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~215k to driver.
device          amd        # AMD 53C974 (Teckram DC-390(T))
device          isp        # Qlogic family
#device         ispfw      # Firmware for QLogic HBAs- normally a module
device          mpt        # LSI-Logic MPT-Fusion
#device         ncr        # NCR/Symbios Logic
device          sym        # NCR/Symbios Logic (newer chipsets + those of `ncr')
device          trm        # Tekram DC395U/UW/F DC315U adapters

device          adv        # Advansys SCSI adapters
device          adw        # Advansys wide SCSI adapters
device          aha        # Adaptec 154x SCSI adapters
device          aic        # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
device          bt         # Buslogic/Mylex MultiMaster SCSI adapters

device          ncv        # NCR 53C500
device          nsp        # Workbit Ninja SCSI-3
device          stg        # TMC 18C30/18C50

  SCSI控制器。可以注释掉您系统中没有的设备。 如果您只有IDE设备,您可以把这些一起删掉。 *_REG_PRETTY_PRINT 这样的配置, 则是对应驱动程序的调试选项。

# SCSI peripherals
device          scbus      # SCSI bus (required for SCSI)
device          ch         # SCSI media changers
device          da         # Direct Access (disks)
device          sa         # Sequential Access (tape etc)
device          cd         # CD
device          pass       # Passthrough device (direct SCSI access)
device          ses        # SCSI Environmental Services (and SAF-TE)

  SSCSI外围设备。也可以像上面一样操作。

注意: 目前系统提供的 USB umass(4) 以及少量其它驱动使用了 SCSI 子系统, 尽管它们并不是真的 SCSI 设备。 因此, 如果在内核配置使用了这类驱动程序, 请务必不要删除 SCSI 支持。

# RAID controllers interfaced to the SCSI subsystem
device          amr        # AMI MegaRAID
device          arcmsr     # Areca SATA II RAID
device          asr        # DPT SmartRAID V, VI and Adaptec SCSI RAID
device          ciss       # Compaq Smart RAID 5*
device          dpt        # DPT Smartcache III, IV - See NOTES for options
device          hptmv      # Highpoint RocketRAID 182x
device          rr232x     # Highpoint RocketRAID 232x
device          iir        # Intel Integrated RAID
device          ips        # IBM (Adaptec) ServeRAID
device          mly        # Mylex AcceleRAID/eXtremeRAID
device          twa        # 3ware 9000 series PATA/SATA RAID

# RAID controllers
device          aac        # Adaptec FSA RAID
device          aacp       # SCSI passthrough for aac (requires CAM)
device          ida        # Compaq Smart RAID
device          mfi        # LSI MegaRAID SAS
device          mlx        # Mylex DAC960 family
device          pst        # Promise Supertrak SX6000
device          twe        # 3ware ATA RAID

  支持RAID控制器。如果您没有这些,可以把它们注释掉或是删掉。

# atkbdc0 controls both the keyboard and the PS/2 mouse
device          atkbdc     # AT keyboard controller

  键盘控制器(atkbdc)提供AT键盘输入以及PS/2指针设备的I/O服务。 键盘驱动程序(atkbd)与PS/2鼠标驱动程序(psm)需要这个控制器,所以不要删除它。

device          atkbd      # AT keyboard

  atkbd驱动程序,与atkbdc控制器一起使用, 提供连接到AT键盘控制器的AT 84键盘与AT加强型键盘的访问服务。

device          psm        # PS/2 mouse

  如果您的鼠标连接到PS/2鼠标端口,就使用这个设备驱动程序。

device          kbdmux        # keyboard multiplexer

  针对键盘多路选择器的基本支持。 如果您不打算使用多个键盘, 则可以放心地删除这一行。

device          vga        # VGA video card driver

  显卡驱动。

device          splash     # Splash screen and screen saver support

  启动时的 splash 画面! 屏幕保护程序也需要这一选项。

# syscons is the default console driver, resembling an SCO console
device          sc

  sc 是默认的控制台驱动程序, 类似 SCO 控制台。 由于绝大部分全屏幕程序都通过类似 termcap 这样的终端数据库函数库赖访问控制台, 因此无论您使用这个或与 VT220 兼容的 vt 都没有什么关系。 如果您在运行这种控制台时使用全屏幕程序时发生问题, 请在登录之后将 TERM 变量设置为 scoansi

# Enable this for the pcvt (VT220 compatible) console driver
#device          vt
#options         XSERVER          # support for X server on a vt console
#options         FAT_CURSOR       # start with block cursor

  这是一个兼容 VT220 的控制台驱动, 它同时能够向下兼容 VT100/102。 在同 sc 硬件不兼容的一些笔记本上它能够运行的很好。 当然, 登录系统时请把 TERM 变量设置为 vt100vt220。 此驱动在连接网络上大量不同的机器时也被证明非常有用, 因为此时 termcapterminfo 通常没有可用的 sc 设备 ── 而 vt100 则几乎每种平台都支持。

device          agp

  如果您的机器使用 AGP 卡, 请把上面一行加入配置。 这将启用 AGP, 以及某些卡上的 AGP GART 支持。

# 电源管理支持 (参见 NOTES 了解更多选项)
#device          apm

  高级电源管理支持。 对笔记本有用, 不过在 FreeBSD 5.X 和更高版本中的 GENERIC 里默认禁用。

# 增加 i8254 的 挂起/恢复 支持。
device           pmtimer

  用于电源管理事件, 例如 APM 和 ACPI 的时钟设备驱动。

# PCCARD (PCMCIA) support
# PCMCIA and cardbus bridge support
device          cbb               # cardbus (yenta) bridge
device          pccard            # PC Card (16-bit) bus
device          cardbus           # CardBus (32-bit) bus

  PCMCIA支持。如果您使用膝上型计算机,您需要这个。

# Serial (COM) ports
device          sio               # 8250, 16[45]50 based serial ports

  这些串口在 MS-DOS/Windows 的世界中称为 COM 口。

注意: 如果使用内置式的调制解调器, 并占用 COM4 而您另有一个串口在 COM2, 则必须把调制解调器的 IRQ 改为 2 (由于晦涩的技术原因, IRQ2 = IRQ 9) 才能够在 FreeBSD 中访问它。 如果有多口的串口卡, 请参考 sio(4) 以了解需要在 /boot/device.hints 中进行的设置。 某些显卡 (特别是基于 S3 芯片的卡) 使用形如 0x*2e8 的 IO 地址, 而许多廉价的串口卡不能够正确地对 16-位 IO 地址空间进行解码, 因此它们会产生冲突, 并造成 COM4 实际上无法使用。

每一个串口都需要有一个唯一的 IRQ (除非您使用支持中断分享的串口卡), 因此默认的 COM3COM4 IRQ 是不能使用的。

# Parallel port
device          ppc

  ISA-bus并行接口。

device          ppbus      # Parallel port bus (required)

  提供并行总线的支持。

device          lpt        # Printer

  提供并口打印机的支持。

注意: 要使用并口打印机,就必须同时加入上面三行设置。

device          plip       # TCP/IP over parallel

  这是针对并行网络接口的驱动器。

device          ppi        # Parallel port interface device

  普通用途的I/O (“geek port”) + IEEE1284 I/O.

#device         vpo        # Requires scbus and da

  这是针对Iomega Zip驱动器的。它要求scbusda的支持。 最好的执行效果是工作在EPP 1.9模式。

#device         puc

  如果您有由 puc(4) 支持的 “哑” 串行或并行 PCI 卡, 则应去掉这一行的注释。

# PCI Ethernet NICs.
device          de         # DEC/Intel DC21x4x (“Tulip”)
device          em         # Intel PRO/1000 adapter Gigabit Ethernet Card
device          ixgb       # Intel PRO/10GbE Ethernet Card
device          txp        # 3Com 3cR990 (“Typhoon”)
device          vx         # 3Com 3c590, 3c595 (“Vortex”)

  多种PCI网卡驱动器。注释或删除您系统中没有的设备.

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device          miibus     # MII bus support

  MII总线支持对于一些PCI 10/100 Ethernet NIC来说是必需的。

device          bce        # Broadcom BCM5706/BCM5708 Gigabit Ethernet
device          bfe        # Broadcom BCM440x 10/100 Ethernet
device          bge        # Broadcom BCM570xx Gigabit Ethernet
device          dc         # DEC/Intel 21143 and various workalikes
device          fxp        # Intel EtherExpress PRO/100B (82557, 82558)
device          lge        # Level 1 LXT1001 gigabit ethernet
device          msk        # Marvell/SysKonnect Yukon II Gigabit Ethernet
device          nge        # NatSemi DP83820 gigabit ethernet
device          nve        # nVidia nForce MCP on-board Ethernet Networking
device          pcn        # AMD Am79C97x PCI 10/100 (precedence over 'lnc')
device          re         # RealTek 8139C+/8169/8169S/8110S
device          rl         # RealTek 8129/8139
device          sf         # Adaptec AIC-6915 (“Starfire”)
device          sis        # Silicon Integrated Systems SiS 900/SiS 7016
device          sk         # SysKonnect SK-984x & SK-982x gigabit Ethernet
device          ste        # Sundance ST201 (D-Link DFE-550TX)
device          stge       # Sundance/Tamarack TC9021 gigabit Ethernet
device          ti         # Alteon Networks Tigon I/II gigabit Ethernet
device          tl         # Texas Instruments ThunderLAN
device          tx         # SMC EtherPower II (83c170 “EPIC”)
device          vge        # VIA VT612x gigabit ethernet
device          vr         # VIA Rhine, Rhine II
device          wb         # Winbond W89C840F
device          xl         # 3Com 3c90x (“Boomerang”, “Cyclone”)

  使用MII总线控制器代码的驱动器。

# ISA Ethernet NICs.  pccard NICs included.
device          cs         # Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
device          ed         # NE[12]000, SMC Ultra, 3c503, DS8390 cards
device          ex         # Intel EtherExpress Pro/10 and Pro/10+
device          ep         # Etherlink III based cards
device          fe         # Fujitsu MB8696x based cards
device          ie         # EtherExpress 8/16, 3C507, StarLAN 10 etc.
device          lnc        # NE2100, NE32-VL Lance Ethernet cards
device          sn         # SMC's 9000 series of Ethernet chips
device          xe         # Xircom pccard Ethernet

# ISA devices that use the old ISA shims
#device         le

  ISA 以太网卡驱动。 参见 /usr/src/sys/i386/conf/NOTES 以了解关于哪个驱动程序能够驱动您的网卡的细节。

# Wireless NIC cards
device          wlan            # 802.11 support

  通用 802.11 支持。 这行配置是无线网络所必需的。

device          wlan_wep        # 802.11 WEP support
device          wlan_ccmp       # 802.11 CCMP support
device          wlan_tkip       # 802.11 TKIP support

  针对 802.11 设备的加密支持。 如果希望使用加密和 802.11i 安全协议, 就需要这些配置行。

device          an         # Aironet 4500/4800 802.11 wireless NICs.
device          ath             # Atheros pci/cardbus NIC's
device          ath_hal         # Atheros HAL (Hardware Access Layer)
device          ath_rate_sample # SampleRate tx rate control for ath
device          awi        # BayStack 660 and others
device          ral        # Ralink Technology RT2500 wireless NICs.
device          wi         # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device         wl         # Older non 802.11 Wavelan wireless NIC.

  用以支持多种无线网卡。

# Pseudo devices
device   loop          # Network loopback

  这是 TCP/IP 的通用回环设备。 如果您 telnet 或 FTP 到 localhost (也就是 127.0.0.1) 则将通过这个设备回到本机。 这个设备是 必需的

device   random        # Entropy device

  Cryptographically secure random number generator.

device   ether         # Ethernet support

  ether 只有在使用以太网卡时才需要。 它包含了通用的以太网协议代码。

device   sl            # Kernel SLIP

  sl 用以提供 SLIP 支持。 目前它几乎已经完全被 PPP 取代了, 因为后者更容易配置, 而且更适合调制解调器之间的连接, 并提供了更强大的功能。

device   ppp           # Kernel PPP

  这一选项用以提供内核级的 PPP 支持, 用于拨号连接。 也有以用户模式运行的 PPP 实现, 使用 tun 并提供包括按需拨号在内的更为灵活的功能。

device   tun           # Packet tunnel.

  它会被用户模式的 PPP 软件用到。 参考本书的 PPP 以了解更多的细节。


device   pty           # Pseudo-ttys (telnet etc)

  这是一个 “pseudo-terminal” 或模拟登入端口。 它用来接收连入的 telnet 以及 rlogin 会话、 xterm, 以及一些其它程序如 Emacs 等。

device   md            # Memory “disks”

  内存盘伪设备。

device   gif           # IPv6 and IPv4 tunneling

  它实现了在 IPv4 上的 IPv6 隧道、 IPv6 上的 IPv4 隧道、 IPv4 上的 IPv4 隧道、 以及IPv6 上的 IPv6隧道。 gif 设备是 “自动克隆” 的, 它会根据需要自动创建设备节点。

device   faith         # IPv6-to-IPv4 relaying (translation)

  这个伪设备能捕捉发给它的数据包,并把它们转发给 IPv4/IPv6 翻译服务程序。

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device   bpf           # Berkeley packet filter

  这是 Berkeley 包过滤器。这个伪设备允许网络接口被置于混杂模式, 从而,截获广播网 (例如,以太网) 上的每一个数据包。 截获的数据报可以保存到磁盘上,也可以使用 tcpdump(1) 程序来分析。

注意: bpf(4) 设备也被用于 dhclient(8) 来获取默认路由器(网关)的 IP 地址。如果使用DHCP,就不要注释掉这行。

# USB support
device          uhci          # UHCI PCI->USB interface
device          ohci          # OHCI PCI->USB interface
device          ehci          # EHCI PCI->USB interface (USB 2.0)
device          usb           # USB Bus (required)
#device         udbp          # USB Double Bulk Pipe devices
device          ugen          # Generic
device          uhid          # “Human Interface Devices”
device          ukbd          # Keyboard
device          ulpt          # Printer
device          umass         # Disks/Mass storage - Requires scbus and da
device          ums           # Mouse
device          ural          # Ralink Technology RT2500USB wireless NICs
device          urio          # Diamond Rio 500 MP3 player
device          uscanner      # Scanners
# USB Ethernet, requires mii
device          aue           # ADMtek USB Ethernet
device          axe           # ASIX Electronics USB Ethernet
device          cdce          # Generic USB over Ethernet
device          cue           # CATC USB Ethernet
device          kue           # Kawasaki LSI USB Ethernet
device          rue           # RealTek RTL8150 USB Ethernet

  支持各类 USB 设备。

# FireWire support
device          firewire      # FireWire bus code
device          sbp           # SCSI over FireWire (Requires scbus and da)
device          fwe           # Ethernet over FireWire (non-standard!)

  支持各类火线设备。

  要了解 FreeBSD 所支持的设备的其他情况, 请参考 /usr/src/sys/i386/conf/NOTES


8.5.1 大内存支持(PAE)

  大内存配置的机器需要超过4GB的虚拟地址。 因为4GB的限制,Intel在Pentium及后续的CPUs上增加了36位物理地址的支持。

  物理地址扩展 (PAE) 是 Intel Pentium Pro和后续的 CPU 提供的一种允许将内存地址扩展到 64GB 的功能, FreeBSD 的所有最新版本均支持此功能, 并通过 PAE 选项来启用这个能力。 因为Intel架构的限制, 高于或低于 4GB 都没有什么区别, 超过 4GB 的内存分配只是简单地添加到可用内存池中。

  为了让内核支持PAE,只要增加下面这一行到配置文件:

options            PAE

注意: PAE在FreeBSD里面现在只能支持 Intel IA-32处理器。 同时,还应该注意,FreeBSD的PAE支持没有经过广泛的测试, 和其他稳定的特性相比只能当作是beta版。

  PAE在FreeBSD下有如下的一些限制:

  • 进程不能接触大于4GB的VM空间。

  • KLD 模块不能加载到一个打开了PAE支持的内核里面, 这是因为内核模块和内核的建立框架不一样。

  • 没有使用 bus_dma(9) 接口的设备驱动程序在打开了 PAE 支持的内核中会导致数据损坏。 因为这个原因, PAE 内核配置文件 会把所有在打开了 PAE 的内核上不能工作的驱动程序排除在外。

  • 一些系统打开了探测系统内存资源使用能力的功能,因为打开了 PAE支持,这些功能可能会被覆盖掉。 其中一个例子就是内核参数kern.maxvnodes,它是控制 内核能使用的最大vnodes数目的,建议重新调整它及其他类似参数到合适的值。

  • 为了避免KVA的消耗,很有必要增加系统的内核虚拟地址, 或者减少很耗系统资源的内核选项的总量(看上面)。KVA_PAGES选项 可以用来增加KVA空间。

  为了稳定和高性能,建议查看tuning(7)手册页。pae(4)手册页包含 FreeBSD'sPAE支持的最新信息。


8.6 如果出现问题怎么办

  在定制一个内核时,可能会出现四种问题。它们是:

config失败:

如果 config(8) 在给出您的内核描述时失败, 则可能在某些地方引入了一处小的错误。 幸运的是, config(8) 会显示出它遇到问题的行号, 这样您就能够迅速地定位错误。 例如, 如果您看到:

config: line 17: syntax error

可以通过与 GENERIC 或其他参考资料对比, 来确定这里的关键词是否拼写正确。

make失败:

如果 make 命令失败, 它通常表示内核描述中发生了 config(8) 无法找出的的错误。 同样地, 仔细检查您的配置, 如果仍然不能解决问题, 发一封邮件到 FreeBSD 一般问题邮件列表 并附上您的内核配置, 则问题应该很快就能解决。

内核无法启动:

如果您的内核无法启动, 或不识别您的设备, 千万别慌! 非常幸运的是, FreeBSD 有一个很好的机制帮助您从不兼容的内核恢复。 在 FreeBSD 启动加载器那里简单地选择一下要启动的内核就可以了。 当系统在引导菜单的 10 秒倒计时时进入它, 方法是选择 “Escape to a loader prompt” 选项, 其编号为 6。 输入 unload kernel, 然后输入 boot /boot/kernel.old/kernel, 或者其他任何一个可以正确引导的内核即可。 当重新配置内核时, 保持一个已经证明能够正常启动的内核永远是一个好习惯。

当使用好的内核启动之后您可以检查配置文件并重新尝试编译它。 比较有用的资源是 /var/log/messages 文件, 它会记录每次成功启动所产生的所有内核消息。 此外, dmesg(8) 命令也会显示这次启动时产生的内核消息。

注意: 如果在编译内核时遇到麻烦, 请务必保留一个 GENERIC 或已知可用的其他内核, 并命名为别的名字以免在下次启动时被覆盖。 不要依赖 kernel.old 因为在安装新内核时, kernel.old 会被上次安装的那个可能不正常的内核覆盖掉。 另外, 尽快把可用的内核挪到 /boot/kernel 否则类似 ps(1) 这样的命令可能无法正常工作。 为了完成这一点, 需要修改目录的名字:

# mv /boot/kernel /boot/kernel.bad
# mv /boot/kernel.good /boot/kernel
内核工作,但是ps(1)根本不工作:

如果您安装了一个与系统中内建工具版本不同的内核, 例如在 -STABLE 系统上安装了 -CURRENT 的内核, 许多用于检查系统状态的工具如 ps(1)vmstat(8) 都将无法正常使用。 您应该 重新编译一个和内核版本一致的系统。 这也是为什么一般不鼓励使用与系统其他部分版本不同的内核的一个主要原因。


第9章  打印

Contributed by Sean Kelly. Restructured and updated by Jim Mock.

9.1 概述

  FreeBSD 可以支持众多种类的打印机, 从最古老的针式打印机到最新的激光打印机以及它们之间所有类型的打印机。 您可以使运行的应用程序产生高质量的打印输出。

  FreeBSD 也可以被设置成一个网络上的打印服务器。 它可以从包括 FreeBSD、 WindowsMac OS 在内的多种其他计算机上接收打印任务。 FreeBSD 将保证任务在某时被打印, 并且可以把哪台机器, 哪位用户打印的最多记录在统计表中, 生成 “横幅” 页, 显示哪份打印输出的是哪位用户的等等。

  在读完这章后,您将知道:

  • 怎样配置FreeBSD后台打印。

  • 怎样安装打印过滤器来对特殊的打印任务做特殊的处理, 包括把传来的文档转换成打印机能理解的格式。

  • 怎样在打印输出上开启报头或者横幅页功能。

  • 怎样打印到连接在其他计算机上的打印机。

  • 怎样打印到直接连接在网络上的打印机。

  • 怎样控制打印机的限制, 包括限制打印任务的大小和阻止某些用户打印。

  • 怎样记录打印机统计表和使用情况。

  • 怎样解决打印故障。

  在读这章之前, 您应该:

  • 知道怎样配置并安装新内核 (第 8 章)。


9.2 介绍

  为了在 FreeBSD 中使用打印机, 需要首先配置好伯克利行式打印机后台打印系统即 LPD。 它是 FreeBSD 的标准打印控制系统。 这章介绍 LPD 后台打印系统, 在接下来将简称为 LPD, 并且将指导您完成其配置。

  如果您已经熟悉了 LPD 或者其他后台打印系统, 则可以跳到 设置后台打印系统 这部分。

  LPD 完全控制一台计算机上的打印机。 它负责许多的事情:

  • 它控制本地和连接在网络上其他计算机上打印机的访问。

  • 它允许用户提交要打印的文件; 这些通常被认为是任务

  • 它为每个打印机维护一个 队列 来防止多个用户在同一时刻访问一台打印机。

  • 它可以打印报头(也叫做banner或者burst页使用户可以轻松的从一堆打印输出中找到它们打印的任务。

  • 它来设置连接在串口上的打印机的通讯参数。

  • 它能通过网络将任务发送到另外一台计算机的 LPD后台打印队列中。

  • 它可以根据不同种类的打印机语言和打印机的性能运行特殊的过滤器来格式化任务。

  • 它记录打印机的使用情况。

  通过配置文件 (/etc/printcap)和提供的特殊过滤程序, 您可以使LPD 系统在众多种类的打印机硬件上完成上面全部的或者一些子集的功能。


9.2.1 为什么要用后台打印

  如果您是系统唯一的用户, 您可能会奇怪为什么要在您不需要访问控制, 报头页或者打印机使用统计时为后台打印费心。 它可以设置成允许直接访问打印机, 但您还是应该使用后台打印, 因为:

  • LPD在后台打印任务; 您不用被迫等待数据被完全副本到打印机的时间。

  • LPD可以可以方便的通过过滤器给任务加上日期/ 时间的页眉或者把一种特殊的文件格式 (比如TeX DVI 文件) 转换成一种打印机可以理解的格式。 您不必去手动做这些步骤。

  • 许多提供打印功能的免费和商业程序想要和您计算机上的的后台打印系统通讯。 通过设置后台打印系统, 您将更轻松的支持其他以后要添加的或者现有的软件。


9.3 基本设置

  要想在 LPD后台打印系统上使用打印机, 您需要设置打印机硬件和 LPD软件。 这个 文档描述了这两级设置:

  • 参见简单打印机 设置来了解怎样连接一个打印机, 告诉 LPD怎样与 它通讯, 并且打印纯文本到 打印机。

  • 参见 高级打印机设置 来了解怎样打印多种 特殊格式的文件, 怎样打印报头页, 怎样通过网络 打印, 怎样控制打印机的访问权限, 并且学会为打印 作业记帐统计。


9.3.1 简单打印机设置

  这部分讲解怎样配置打印机硬件和 LPD使之与打印机配合。 讲解的基础知识有:

  • 硬件 设置部分将讲解怎样把一台打印机连接到 您计算机的一个端口上。

  • 软件 设置部分将讲解怎样配置 LPD后台打印的配置 文件 (/etc/printcap)。

  如果您正在设置一台通过网络协议 接收数据来打印而不是通过串口或者并口的打印机, 参见 使用网络数据流界面的打印机

  尽管这部分叫“简单打印机 设置”, 但还是相当复杂的。 使打印机 配合 LPD 后台打印系统在计算机上正常运转是最难的 部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐, 是相当简单的。


9.3.1.1 硬件设置

  这部分讲述了打印机连接到计算机的多种 途径。 主要讨论了多种接口和 连接线, 还有允许 FreeBSD 与打印机通讯所需的 内核配置。

  如果您已经连接好了您的打印机而且已经 用它在另外一个操作系统下成功的打印, 您 或许可以跳到这个部分软件设置


9.3.1.1.1 端口和连接电缆

  现在所出售的在 PC 上使用的打印机通常至少有 以下三种接口中的一个:

  • 串口, 也叫 RS-232 或者 COM 口, 使用您计算机上的串口来发送数据到打印机。 串口在计算机上已经非常普遍, 而且电缆也非常容易买到且容易制作。 串口有时需要特殊的电缆, 而且可能需要您去配置稍微有点儿复杂的通讯选项。 大多数 PC 的串口的最高传输速度只有 115200 bps, 这使得打印很大的图像需要的时间很长。

  • 并口 使用计算机上的并口来发送数据到打印机。 并口在计算机上也已经非常普遍, 而且速度高于 RS-232 串口。 电缆非常容易买到, 但很难手工制作。 并口通常没有通讯选项, 这使得配置它相当简单。

    并口按打印机上的接头来命名也叫做 “Centronics”接口。

  • USB 接口, 即通用串行总线, 可以达到比并口和串口高很多的速度。 其电缆既简单又便宜。 USB 用来打印比串口和并口更有优势, 但 UNIX 系统不能很好的支持它。 避免这个问题的方法就是购买一台 像大多数打印机一样的既有 USB 接口又有并口的 打印机。

  一般来说并口只提供单向通讯 (计算机到打印机), 而串口和 USB 则可以提供双向通讯。 新的并口 (EPP 和 ECP) 及打印机在使用了 IEEE-1284 标准的电缆之后, 可以在FreeBSD下双向通讯。

  与打印机通过并口双向通讯通常由这两种方法中的一种来完成。 第一个方法是使用为 FreeBSD 编写的可以通过打印机使用的语言与打印机通讯的驱动程序。 这通常用在喷墨打印机上, 且可以用来报告剩余墨水多少和其他状态信息。 第二种方法使用在支持 PostScript 的打印机上。

  PostScript 任务事实上由程序发送给打印机; 但它并不进行打印而是直接将结果返回给计算机。 PostScript 也采取双向通讯来将打印中的问题报告给计算机, 比如 PostScript 程序中的错误或者打印机卡纸。 这些信息对于用户来说也许是非常有价值的。 此外, 最好的在支持 PostScript 的打印机上记帐的方法需要双向通讯: 询问打印机打印总页数 (打印机从出厂一共打印过多少页), 然后发送用户的任务, 之后再次查询总打印页数。 将打印前后得到的两个值相减就可以得到该用户要付多少纸钱。


9.3.1.1.2 并口

  用并口连接打印机需要用 Centronics 电缆把打印机与计算机连接起来。 具体说明指导在打印机, 计算机的说明书上应该有, 或者干脆两个上面都有。

  记住您用的计算机上的哪个并口。 第一个并口在 FreeBSD 上叫 /dev/ppc0; 第二个叫 /dev/ppc1, 依此类推。 打印机设备也用同样的方法命名: /dev/lpt0 是接在第一个并口上的打印机, 依此类推。


9.3.1.1.3 串口

  用串口连接打印机需要用 合适的串口电缆把打印机与计算机连接起来。 具体 说明指导应该在打印机, 计算机的说明书上有, 或者 同样干脆两个上面都有。

  如果您不确定什么样儿的电缆才是 “ 合适的串口 电缆 ” , 您可以尝试以下几种不同的 电缆:

  • 调制解调器 电缆每一端的 每一根引脚都直接连接到另一端 相应的引脚 上。 这种电缆也叫做 “DTE-to-DCE” 电缆。

  • 非调制解调器电缆上每一端的有些引脚 是与另一端相应引脚直接连接的, 而有一些则是交叉连接的 (比如, 发送数据引脚连接到 接收数据引脚 ), 还有一些引脚直接在电缆连接头儿内 短接。 这种电缆也叫做 “DTE-to-DTE” 电缆。

  • 一些特殊的打印机需要的串口打印机 电缆, 是一种和非调制解调器电缆类似的电缆, 只是一些信号还是送到了另一端, 而 不是直接在连接头儿内短路。

  当然, 您还得为打印机设置通讯参数。 一般是通过打印机面板上的按钮或者 DIP 开关进行设置。 在计算机和打印机上都选择它们所支持的最高 波特 (每秒多少比特, 有时也叫 波特率) 的传输速率。 选择7或者8个数据位; 选择不校验, 偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量控制协议: 无, XON/XOFF (也叫做 “in-band” 或 “软件”) 流量控制。 记住您的软件配置中的参数也要设成上面的数值。


9.3.1.2 软件设置

  这部分描述了要使用FreeBSD系统中的 LPD 后台打印系统进行打印所需的软件设置。

  包括这几个步骤:

  1. 在需要的时候配置内核来允许您连接 打印机的端口; 配置内核 部分会告诉您 需要做什么。

  2. 如果您使用并口, 则需要设置一下 并口的通讯模式; 设置 并口通讯模式 部分会告诉您具体的 细节。

  3. 测试操作系统是否能够发送数据到打印机。 检测打印机 联机状况 部分会告诉您要怎样 做。

  4. LPD 设置与打印机匹配的参数则 通过修改 /etc/printcap 这个文件来完成。 这章后面 的部分将讲解如何来完成设置。


9.3.1.2.1 配置内核

  操作系统的内核为了使某些特殊设备工作需要重新 编译。 打印机所用的串口、 并口就属于那些特殊设备。 因此, 可能需要 添加对串口或并口的支持, 如果内核并没有配置它们的话。

  要想知道您现在使用的内核是否支持串口, 输入:

# grep sioN /var/run/dmesg.boot

  其中 N 是串口的 编号, 从0开始。 如果您看到 类似下面的输出:

sio2 at port 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A

  则说明您现在使用的内核支持串口。

  要想知道您现在使用的内核是否支持并口, 输入:

# grep ppcN /var/run/dmesg.boot

  其中 N 是并口的 编号, 同样从0开始。 如果得到类似 下面的输出:

ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/8 bytes threshold

  那么您现在使用的内核支持并口。

  您可能必须为了使操作系统支持您打印机需要的串口或 并口而 重新配置内核。

  要增加对串口的支持, 参见 内核配置这部分。 要增加对并口的支持, 除了参见 上面提到的那部分之外, 还要 参见下面的 部分。


9.3.1.3 设置并口的通讯模式

  在使用并口时, 您可以选择 让 FreeBSD 用中断方式还是轮询方式来 与打印机通讯。 在 FreeBSD 上, 通用的打印机驱动 (lpt(4)) 使用 ppbus(4) 系统, 它利用 ppc(4) 驱动来控制端口芯片。

  • 中断 方式是 GENERIC 核心的默认方式。 在这种方式下, 操作系统占用一条中断请求线来检测打印机是否已经做好接收数据的准备。

  • 轮询 方式是操作系统反复不断的询问打印机是否做好接收数据的准备。 当它返回就绪时, 核心开始发送下面要发送的数据。

  中断方式速度通常会快一些, 但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机 不能正常的工作在中断模式下, 是由于一些定时问题 (还没正确的理解) 造成的。 这些打印机需要使用轮询方式。 您应该使用 任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以 工作, 但在中断模式下会慢的要命。

  您可以用以下两种方法设定通讯模式: 通过 配置内核或者使用 lptcontrol(8) 这个程序。

  要通过配置内核的方法设置 通讯模式:

  1. 修改内核配置文件。 找到 一个叫 ppc0 的记录。 如果您想要设置的是 第二个并口, 那么用 ppc1 代替。 使用第三个并口的时候用 ppc2 代替, 依此类推。

    • 如果您希望使用中断驱动模式, 则应编辑下面的配置:

      hint.ppc.0.irq="N"
      

      它在 /boot/device.hints 这个文件中, 其中 N 用正确的中断 编号代替。 同时, 核心配置文件也必须 包括 ppc(4) 的驱动:

      device ppc
      
    • 如果您想要使用轮询方式, 只需要把 /boot/device.hints 这个文件中的下面这行删除掉:

      hint.ppc.0.irq="N"
      

      在 FreeBSD 下, 有时上面的方法并不能使并口工作在轮询方式。 大多数情况是由于 acpi(4) 驱动造成的, 它可以自动侦测到设备并将其挂载到系统上, 但也因此, 它控制着打印机端口的访问模式. 您需要检查 acpi(4) 的配置来解决这个问题。

  2. 保存文件。 然后配置, 建立, 并安装刚配置的内核, 最后重新启动。 参见 内核配置 这章来获得更多细节。

  使用 lptcontrol(8) 设置通讯模式

  1. 输入:

    # lptcontrol -i -d /dev/lptN
    

    lptN 设置成中断方式。

  2. 输入:

    # lptcontrol -p -d /dev/lptN
    

    lptN 设置成轮询方式。

  您可以把这些命令加入到 /etc/rc.local 这个文件中, 这样每次启动系统 时都会设置成您想要的方式。 参见 lptcontrol(8) 来获得 更多信息。


9.3.1.4 检测打印机的通讯

  在设置后台打印系统之前, 您应该确保您的计算机可以把数据 发送到打印机上。 分别独立调试打印机的通讯和后台打印系统会更简单。

  我们为了测试打印机,将发送一些文本给它。 一个叫 lptest(1) 的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的 字符: 它在每行打出 可以打印的 96 个 ASCII 字符。

  当我们使用的是一台 PostScript ( 或者以其他语言为基础的 ) 打印机, 那么 需要更仔细的检测。 一段小小的 PostScript 程序足以完成检测的任务, 比如下面这段程序:

%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto /Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage

  可以把上面这段 PostScript 代码写进一个文件里, 并且像下面部分的例子里那样 使用。

注意: 上面的小程序是针对 PostScript 而不是惠普的 PCL 写的。 由于 PCL 拥有许多其他打印机没有的强大功能, 比如它支持在打印纯文本的同时夹带特殊的命令, 而 PostScript 则不能直接打印纯文本, 所以需要对这类打印机语言进行特殊的处理。


9.3.1.4.1 检测并口打印机

  这部分内容将指导您怎样检测 FreeBSD 是否可以与一台已经连接在并口上的打印机通讯。

  要测试并口上的打印机:

  1. su(1) 命令转换到 root 用户。

  2. 发送数据到打印机。

    • 如果打印机可以直接打印纯文本, 可以用 lptest(1)。 输入:

      # lptest > /dev/lptN
      

      其中 N 是并口的编号, 从0开始。

    • 如果打印机支持 PostScript 或其他打印机语言, 可以发送一段小程序到打印机。 输入:

      # cat > /dev/lptN
      

      然后, 一行一行地 输入 输入这段程序。 因为在按下 换行 或者 回车 之后, 这一行就不能再修改了。 当您输入完这段程序之后, 按 CONTROL+D, 或者其他表示文件结束的键。

      另外一种办法, 您可以把这段程序写在一个文件里, 并输入:

      # cat file > /dev/lptN
      

      其中 file 是包含这您要发给打印机程序的文件名。

  之后, 您应该看到打印出了一些东西。 如果打印出的东西看起来并不正确, 请不要着急; 我们将在后面指导您如何解决这类问题。


9.3.1.4.2 检测串口打印机

  这部分将告诉您如何检测 FreeBSD 是否可以与连接在串口上的打印机通讯。

  要测试连接在串口上的打印机:

  1. 通过 su(1) 命令转为 root 用户。

  2. 修改 /etc/remote 这个文件。 增加下面这些内容:

    printer:dv=/dev/port:br#bps-rate:pa=parity
    

    其中 port 是串口的设备节点 (ttyd0ttyd1, 等等), bps-rate 是与打印机通讯时使用的速率, 而 parity 是通讯时打印机要求的校验方法 (应该是 evenoddnone, 或 zero 之一)。

    这儿有一个串口打印机的例子, 它连接在第三个串口上, 速度为 19200   波特, 不进行校验:

    printer:dv=/dev/ttyd2:br#19200:pa=none
    
  3. tip(1) 连接打印机。 输入:

    # tip printer
    

    如果没能成功, 则要再次修改 /etc/remote 这个文件, 并且试试用 /dev/cuaaN 代替 /dev/ttydN

  4. 发送数据到打印机。

    • 如果打印机可以直接打印纯文本, 则用 lptest(1)。 输入:

      % $lptest
      
    • 如果打印机支持 PostScript 或者其他 打印机语言, 则发送一段小程序到 打印机。 一行一行的输入程序, 必须 非常仔细 因为像退格 或者其他编辑键也许对打印机来说有它的 意义。 您同样也需要按一个特殊的 文件结束键, 让打印机知道它已经 接收了整个程序。 对于 PostScript 打印机, 按 CONTROL+D

      或者, 您同样也可以把程序存储在一个文件里 并输入:

      % >file
      

      其中 file 是 包含要发送程序的文件名。 在 tip(1) 发送这个文件之后, 按代表 文件结束的键。

  您应该看到打印出了一些东西。 如果它们看起来并不正确也不要着急; 我们将在稍后的章节中介绍如何解决这类问题。


9.3.1.5 启用后台打印: 文件 /etc/printcap

  目前, 您的打印机应该已经连好了线, 系统内核也为与打印机联机而重新配置好 (如果需要的话), 而且您也已经可以发送一些简单的数据到打印机。 现在, 我们要配置 LPD 来使其控制您的打印机。

  配置 LPD 要修改 /etc/printcap 这个文件。 由于 LPD 后台打印系统在每次使用后台打印的时候, 都会读取这个文件, 因此对这个文件的修改会立即生效。

  printcap(5) 这个文件的格式很简单。 您可以用您最喜欢的文本编辑器来修改 /etc/printcap 这个文件。 这种格式和其他的像 /usr/share/misc/termcap/etc/remote 这类文件是一样的。 要得到关于这种格式的详尽信息, 请参阅联机手册 cgetent(3)

  简单的后台打印配置包括下面的几步:

  1. 给打印机起一个名字 (记忆和使用的别名), 然后把它们写进文件 /etc/printcap; 参见 如何为打印机命名 这章来得到更多的关于起名的帮助。

  2. 通过增加 sh 项关掉报头页 (它默认是启用的); 参见 如何禁用报头页 部分来得到更多信息。

  3. 建立一个后台打印队列的目录, 并且通过 sd 项目指定它的位置; 您可参见 创建后台打印队列目录 一节了解更多信息。

  4. /dev 下设置打印机设备节点, 并且在写在 /etc/printcap 文件中 lp 项目里; 参见 识别打印机设备 这部分可以得到更多信息。 此外, 如果打印机连接在串口上, 通讯参数的设置需要写在 ms# 项中。 这些参数在 配置后台打印通讯参数 这在前面已经讨论过。

  5. 安装纯文本过滤器; 详情请参见 安装文本过滤器 小节。

  6. lpr(1) 命令来测试设置。 想得到更多信息可以参见 测试故障排除 部分。

注意: 使用打印机语言的打印机, 如 PostScript 打印机, 通常是不能直接打印纯文本的。 前面提到, 并且将在后面继续进行介绍的简单的设置方法, 均假定您正在安装这种只能打印它能识别的文件格式的打印机。

  用户通常会希望直接在系统提供的打印机上打印纯文本。 采用 LPD 接口的程序也通常是这样设计的。 如果您正在安装这样一台打印机, 并且希望它不仅能打印使用它支持的打印机语言的任务 而且 还能打印纯文本的任务的话, 那么强烈建议您在上面提到的简单设置的步骤上增加一步: 安装从自动纯文本到 PostScript (或者其他打印机语言) 的转换程序。 更多的细节, 请参见 PostScript 打印机上打印纯文本


9.3.1.5.1 打印机的命名

  第一步 (简单) 就是给打印机起一个名字。 您是按功能起名字还是干脆起个古怪的名字都没有关系, 因为您可以给打印机设置许多的别名。

  在 /etc/printcap 里至少有一个打印机必须指定, 别名是 lp。 这是默认的打印机名。 如果用户既没有 PRINTER 环境变量, 也没有在任何 LPD 命令的命令行中指定打印机名, 则 lp 将是默认要使用的打印机。

  还有, 我们通常把最后一个别名设置成能完全描述打印机的名字, 包括厂家和型号。

  一旦您选好了名字或者一些别名, 把它们放进文件 /etc/printcap 里。 打印机的名字应该从最左边的一列写起。 用竖杠来隔开每个别名, 并且在最后一个别名后面加上一个冒号。

  在下面的例子中, 我们从一个基本的 /etc/printcap 开始, 它只定义了两台打印机 (一台 Diablo 630 行式打印机和一台 Panasonic KX-P4455 PostScript 激光打印机 ):

#
#  /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:

  在这个例子中, 第一台打印机被命名为 rattan 并且设置了 linediablo, lp, 和 Diablo 630 Line Printer 这几个别名。 因为它被设置了 lp 这个别名, 所以它是默认打印机。 第二台 被命名为 bamboo, 并且设置了 psPS, Spanasonic, 和 Panasonic KX-P4455 PostScript v51.4 这几个别名。


9.3.1.5.2 不打印报头页

  LPD 后台打印系统默认 会为每个任务打印 报头页。 报头页 包含了发送这个任务的用户, 发送这个任务的计算机, 任务的名字, 并用大字母打出。 但不幸的是, 所有这些额外的文本, 都会给在对打印机进行最初的配置时排除故障带来困难, 所以我们将先不打印报头页。

  要暂停打印报头页, 为打印机的记录增加 sh 标记, 在 /etc/printcap 文件中。 这儿有一个 /etc/printcap 文件中使用 sh 的例子:

#
#  /etc/printcap for host rose - no header pages anywhere
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:

  注意我们的正确格式: 第一行从最左边一列开始, 而后的每一行用 TAB 缩进一次。 一行写不下需要换行时, 在换行前打一个反斜杠。


9.3.1.5.3 建立后台打印队列目录

  下一步设置就是要建立一个 后台打印队列目录, 也就是在打印任务最终完成之前用于存放这些任务的目录, 这个目录中也会存放后台打印系统用到的其他一些文件。

  由于后台打印队列目录的变量本质, 通常 把这些目录安排在 /var/spool 下。 您也没有必要去 备份后台打印队列目录里的内容。 重新建立它们只要简单的使用 mkdir(1) 命令。

  通常, 我们习惯将目录名起成和 打印机一样的名字, 像下面 这样:

# mkdir /var/spool/printer-name

  然而, 如果您有很多网络打印机, 您可能想要把这些后台打印的队列目录目录放在一个单独的专为使用 LPD 打印而准备的目录里。 我们将用我们的两台打印机 rattanbamboo 作为例子:

# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/rattan
# mkdir /var/spool/lpd/bamboo

注意: 如果担心用户任务的保密性, 可能会希望保护相应的后台打印队列目录, 使之不能被其他用户访问。 后台打印的队列目录的属主应该是 daemon 用户, 而 daemon 用户和 daemon 组拥有读写和搜索的权限,但其他用户没有。 接下来用我们的两台打印机作为例子:

# chown daemon:daemon /var/spool/lpd/rattan
# chown daemon:daemon /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan
# chmod 770 /var/spool/lpd/bamboo

  最后, 您需要通过/etc/printcap 文件告诉 LPD 这些目录。 您可以用 sd 标记来指定后台打印队列目录的路径:

#
#  /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:

  注意打印机的名字要从第 1 列开始, 其他记录每行都要用 TAB 键缩进一次, 写不开需要换行在最后加上反斜杠。

  如果您没用 sd 标记指定后台打印队列目录, 后台打印系统会将 /var/spool/lpd 目录作为默认目录。


9.3.1.5.4 识别打印机设备

  在 端口与对应的设备项 章节中, 我们确定了使用 /dev 目录中的哪个节点来让 FreeBSD 与打印机 通讯。 现在, 我们来告诉 LPD 这个 信息。 当后台打印系统有任务需要打印, 它 将为过滤程序(负责传送数据到打印机)打开 指定的设备。

  用 lp 标记在 /etc/printcap 里列出 /dev 下的设备节点。

  在我们的例子中, 假设打印机 rattan 在第一个并口上, 打印机 bamboo 在第六个串口上; 下面是 要对 /etc/printcap 文件里增加的内容 :

#
#  /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyd5:

  如果您没在您的 /etc/printcap 文件中 用 lp 标记指定设备节点, LPD 将默认使用 /dev/lp/dev/lp 目前在 FreeBSD 中不存在。

  如果您正在安装的打印机是连接在 并口上的, 请跳到 安装文本 过滤器 这章。 如果不是的话, 还是最好按下面介绍的 步骤做。


9.3.1.5.5 配置后台打印通讯参数

  对于连在串口上的打印机, LPD 可以为发送数据到打印机的过滤程序设置好波特率, 校验, 和其他串口通讯参数 。 这是有利的, 因为:

  • 它可以让您只需简单的修改 /etc/printcap 就能尝试不同的通讯 参数; 您并不需要去重新编译过滤器 程序。

  • 它使得后台打印系统可以在 多台有不同串口通讯设置的打印机上使用 相同的过滤器程序。

  下面这个 /etc/printcap 中 用 lp 标记来控制列出设备的 串口通讯参数 :

br#bps-rate

设置设备的通讯速度为 bps-rate, 这里 bps-rate 可以为 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, or 115200 比特每秒。

ms#stty-mode

设置已打开的中端设备的选项 。 stty(1) 将详细 讲述可用的选项。

  当 LPD 打开 用 lp 指定的设备时, 它会 将设备的特性设置成在 ms# 标记后指定的那样。 特别是 parenb, paroddcs5, cs6cs7, cs8cstopb, crtscts, 和 ixon 这些模式, 它们在 stty(1) 手册中有详细说明。

  我们举个例子来添加我们连在第6个串口上的 打印机。 我们将设波特为38400。 至于模式, 我们将用 -parenb 设置成不校验, 用 cs8 设置成8位字符, 用 clocal 设置成不要调制解调器控制, 用 crtscts 设置成硬件流量控制:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:

9.3.1.5.6 安装文本过滤器

  我们现在准备告诉 LPD 使用什么文本过滤器 给打印机发送任务。 文本过滤器, 也叫 输入过滤器, 是一个 在 LPD 有一个任务要发给 打印机时运行的程序。 当 LPD 为打印机运行文本过滤器时, 它设置过滤器的 标准输入为要发给打印机的任务, 而标准输出为 用 lp 标记指定的打印机 。 过滤器先从标准输入读取 任务, 为打印机进行一些转换 , 并将结果写到标准输出, 这些结果 将被打印。 想得到更多关于文本过滤器的信息, 见 过滤器 这节。

  对于简单的打印机设置, 文本过滤器可以仅仅是一段 执行 /bin/cat 的 shell 脚本来 发送任务到打印机。 FreeBSD 还提供了一个叫做 lpf 的过滤器, 它可以处理退格和下划线来 使那些可能不能很好处理这类字符流的打印机正常工作。 而且, 当然, 您可以用任何其他的 您想用的过滤程序。 lpf 过滤器在 lpf: 一个文本 过滤器 这节将有详细描述。

  首先, 我们来写一段叫做 /usr/local/libexec/if-simple 的简单 shell 脚本作为文本过滤器。 用您熟悉的文本编辑器将下面的内容放进 这个文件:

#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout.  Ignores all filter arguments.

/bin/cat && exit 0
exit 2

  使这个文件可以被执行:

# chmod 555 /usr/local/libexec/if-simple

  然后用 if 标记在 /etc/printcap 里告诉 LPD 使用这个脚本。 我们将仍然为 一直作为例子的这两台打印机在 /etc/printcap 里增加这个标记:

#
#  /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:\
        :if=/usr/local/libexec/if-simple:

注意: if-simple 脚本的副本可以在 /usr/share/examples/printing 目录中找到。


9.3.1.5.7 开启 LPD

  lpd(8)/etc/rc 中被运行, 它是否被运行由 lpd_enable 这个变量控制。 这个 变量默认是 NO。 如果您还没有修改 , 那么增加这行:

lpd_enable="YES"

  到 /etc/rc.conf 文件当中, 然后既可以重启您的 机器, 也可以直接运行 lpd(8)

# lpd

9.3.1.5.8 测试

  现在已经基本完成了 LPD 的基本设置。 但不幸的是, 还不是庆祝的时候, 因为我们还需要测试设置并且修正所有的 问题。 要测试设置, 尝试打印一些东西。 要 用 LPD 系统打印, 您可以 使用 lpr(1) 命令, 它可以提交一个任务来打印。

  您可以联合使用 lpr(1) 和 the lptest(1) 程序, 在 检查打印机 通讯 这节介绍怎样生成一些测试文本。

  要测试简单 LPD 设置:

  输入:

# lptest 20 5 | lpr -Pprinter-name

  其中 printer-name 是 在 /etc/printcap 中指定的打印机的一个名字 ( 或者一个别名) 。 要测试默认 打印机, 输入 lpr(1) 不带任何 -P 选项。 同样, 如果您正在测试一台使用 PostScript 的打印机, 发送一个 PostScript 程序到打印机而不是 使用 lptest(1)。 您可以把程序放在一个 文件里, 然后输入: lpr file

  对于一台 PostScript 打印机, 您应该得到那段程序的 结果。 而如果您使用的 lptest(1), 则您得到的 结果应该看起来像下面这样:

!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678

  要更进一步的测试打印机, 尝试下载一些大的 程序 (为基于特定语言的打印机 ) 或者运行 lptest(1) 并使用不同的参数。 比如, lptest 80 60 将生成 60 行 每行 80 个字符。

  如果打印机不能工作, 参考 故障排除 这节。


9.4 高级设置

  这部分将描述用来打印特别格式文件, 页眉, 通过网络打印, 以及对打印机使用限制和 记帐。


9.4.1 过滤器

  尽管 LPD 处理网络协议, 任务排队, 访问控制, 和打印的其他方面, 但大部分 实际 工作还是由 过滤器。 过滤器是 一种与打印机通讯并且处理设备依赖和特殊需要的 程序。 在简单打印机设置这节里, 我们安装了一个纯文本过滤器 ── 一个应该可以用在大多数 打印机上的极简单的过滤器 ( 安装 文本过滤器)。

  然而, 为了进行格式转换, 打印 记帐, 适应特殊的打印机, 等等, 您需要明白过滤器是怎样工作的。 在根本上过滤器负责处理这些方面。 但坏消息是大多数时候 必须自己提供过滤器。 好消息 是很多过滤器通常都已经有了; 当没有的时候, 它们 通常也是很好写的。

  FreeBSD 也提供了一个过滤器, /usr/libexec/lpr/lpf, 可以让大多数可以打印纯文本的 打印机工作。 ( 它处理文件里的退格和 跳格, 并且进行记帐, 但这基本就是它所有能做的了。 ) 这里还有几个过滤器和过滤器组件在 FreeBSD Ports Collection 里。

  这是在这节里您将找到的内容:

  • 过滤器是如何工作的 小节中将介绍在打印过程中过滤器的作用。 如果希望了解在 LPD 使用过滤器时, 在 “幕后” 发生的事情, 便应阅读这一小节。 了解这些知识能够帮助您在为打印机安装过滤器时更快地排查可能会遇到的各种问题。

  • LPD 假定任何打印机在默认状态下均能打印纯文本内容。 对于不能直接打印纯文本的 PostScript 打印机 (以及其他基于打印语言的打印机) 而言这会带来问题。 在 PostScript 打印机上使用纯文本任务 这节中将会介绍如何解决这个问题的方法。 如果您使用 PostScript 打印机, 就应阅读这节内容。

  • PostScript 对于许多程序来说都是一个非常受欢迎的输出格式。 一些人甚至直接写 PostScript 代码。 但不幸的是, PostScript 打印机非常昂贵。 模拟 PostScript 在 非 PostScript 打印机上 这节将告诉您怎样进一步修改 打印机的文本过滤器, 使得一台 PostScript 打印机接受 并打印 PostScript 数据。 如果 您没有 PostScript 打印机, 那么您应该阅读这个小节。

  • 转换过滤器 这节讲述了一个自动把指定格式文件, 比如图像或排版数据, 转换成您打印机可以理解的格式的方法。 在阅读了这节之后, 您就应该可以配置打印机, 让用户可以用 lpr -t 来打印 troff 数据、 用 lpr -d 来打印 TeX DVI 数据, 或用 lpr -v 来打印光栅图像数据等工作了。 建议您阅读这节。

  • 输出 过滤器 这节讲述了这个不是经常使用的 LPD: 的功能-输出过滤器。 除非您要打印页眉 (见 页眉 这节 ), 您或许可以完全跳过这节。

  • lpf: 一个文本 过滤器 描述了 lpf, 一个 FreeBSD 自带的相当 完整而又简单的文本过滤器, 可以使用在行式打印机 (和那些担当行式打印机功能的激光 打印机 ) 上。 如果 您需要一个快速的方法来让打印机统计打印纯文本的工作量 , 或者您有一台遇到退格字符就冒烟的打印机 , 您应该考虑 lpf

注意: 您可以在 /usr/share/examples/printing 目录中找到下面将提到的那些脚本的副本。


9.4.1.1 过滤器是怎样工作的

  前面说过, 过滤器是一个被 LPD 启动, 用来处理与打印机通讯过程中设备依赖的部分 的可执行程序。

  当 LPD 想要打印 一个任务中的文件, 它启动一个过滤器 程序。 它把要打印的文件设置成过滤器的标准输入, 标准输出设置成打印机, 并且把错误信息定向到 错误日志文件 (在 lf 标识里指定, 默认在 /etc/printcap, 或者 /dev/console 文件里 )。

  过滤器被 LPD 启动, 并且 过滤器的参数依赖于 /etc/printcap 文件中所列出的和 用户为任务用 lpr(1) 命令所指定的。 例如, 如果用户输入 lpr -tLPD 会 启动 troff 过滤器, 即在 目标打印机的 tf 标签里所列出的过滤器。 如果用户想要打印纯文本, 它将会启动 if ***过滤器 ( 这是通常的情况: 参见 输出过滤器 来得到 细节 )。

  在 /etc/printcap 文件中, 您可以指定三种过滤器:

  • The 文本过滤器 , 在 LPD 文档中也叫做 输入过滤器 , 处理 常规的文本打印。 可以把它想象成默认过滤器。 LPD 假定每台打印机默认情况下都可以打印纯文本, 而文本过滤器的任务就是来搞定退格、 跳格, 或者其他在某种打印机上容易错误的特殊字符。 如果您所在的环境对打印机的使用情况进行记帐, 那么文本过滤器必须也对打印的页数进行统计, 通常是根据打印的行数和打印机在每页上能打印的行数进行计算得出。 文本过滤器的启动命令为:

    filter-name [-c] -w width -l length -i indent -n login -h host acct-file

    这里

    -c

    当任务用 lpr -l 这个命令提交时出现

    width

    这里取您在 /etc/printcap 文件中指定的 pw (页 宽) 标签的值, 默认为 132。

    length

    这里取您的 pl (页 长) 标签的值, 默认为 66

    indent

    这里是来自 lpr -i 命令的总缩进量, 默认为 0

    login

    这里是正在打印文件的用户名

    host

    这里是提交打印任务的主机名

    acct-file

    这里是来自 af 变量中指定的用于记帐的文件名。

  • 转换过滤器 的功能是, 将特定格式的文件转换成打印机能够识别并打印的格式。 例如, ditroff 格式的排版数据就是无法直接打印的, 但您可以安装一个转换过滤器来将 ditroff 文件转换成一种打印机可以识别和打印的形式。 请参见 转换过滤器 这一节来了解更多细节。 如果您需要对打印进行记帐, 那么转换过滤器也必须完成记帐工作。 转换过虑器的启动命令为:

    filter-name -x pixel-width -y pixel-height -n login -h host acct-file

    这其中 pixel-width 的值来自 px 标签 (默认为 0), 而 pixel-height 的值来自 py 标签 (默认为 0)。

  • 输出过滤器 仅在没有文本过滤器时, 或者报头页被打开时使用。 就我们的经验而言, 输出过滤器是很少用到的. 在 输出过滤器 这节中会介绍它们。 启动输出过滤器的命令行只有两个参数:

    filter-name -w width -l length

    它们的作用与文本过滤器的 -w-l 参数是一样的。

  过滤器也应该在 退出 时给出下面的几种退出状态:

exit 0

过滤器已经成功的打印了文件.

exit 1

过滤器打印失败了, 但希望 LPD 试着再打印一次。 如果过滤器返回了这个状态, LPD 将重新启动过滤器。

exit 2

过滤器打印失败并且不希望 LPD 重试。 这种情况下 LPD 会放弃这个文件。

  文本过滤器随 FreeBSD 一起发布, 文件名为 /usr/libexec/lpr/lpf, 它利用页宽和页长参数来决定何时发送送纸指令, 并提供位打印记帐的方法。 它使用登录名、 主机名, 和记帐文件参数来生成记帐记录。

  如果您想购买过滤器, 要注意它是否是与 LPD 兼容。 如果兼容的话, 则它们必须支持前面提到的那些参数。 如果您打算编写普通的过滤器程序, 则同样需要使之支持前面那些参数和退出状态码。


9.4.1.2 在 PostScript® 打印机上打印纯文本任务

  如果您是您的计算机和 PostScript (或其他语言的) 打印机的唯一用户, 而且您不打算发送纯文本到打印机, 并因此不打算从应用程序程序直接将纯文本发到打印机的话, 就完全不需要再关心这节的内容了。

  但是, 如果打印机同时需要接收 PostScript 和纯文本的任务, 就需要对打印机进行设置了。 要完成这项工作, 我们需要一个文本过滤器来检测到达的任务是纯文本的还是 PostScript 格式的。 所有 PostScript 的任务必须以 %! (其他打印机语言请参见打印机的文档) 开头。 如果任务的头两个字符是这两个, 就代表这是 PostScript 格式的, 并且可以直接略过任务剩余的部分。 如果任务开头的两个字符不是这两个, 那么过滤器将把文本转换成 PostScript 并打印结果。

  我们怎样去做?

  如果你有一台串口打印机, 一个好办法就是安装 lprpslprps 是一个可以与打印机进行双向通信 PostScript 打印机过滤器。 它用打印机传来的详细信息来更新打印机的状态文件, 所以用户和管理员可以准确的看到打印机处在什么样的状态 (比如 “缺墨” 或者 “卡纸”)。 但更重要的是, 它包含了一个叫做 psif 的程序, 它可以检测接收到的文件是否是纯文本的, 并且将使用 textps 命令 ( 也是由 lprps 提供的程序) 转换文本到 PostScript。 然后它会用 lprps 将任务发送到打印机。

  lprps 可以在 FreeBSD Ports Collection (详见 The Ports Collection) 中找到。 你可以根据页面的尺寸选择安装 print/lprps-a4print/lprps-letter。 在安装了 lprps 之后, 只需指定 psif 这个程序的路径, 这也是包含在 lprps 中的一个程序。 如果您已经用 ports 安装好了 lprps, 将下面的内容添加到 /etc/printcap 文件中 PostScript 打印机的记录部分中:

:if=/usr/local/libexec/psif:

  同时还需要指定 rw 标签来告诉 LPD 使用读-写模式打开打印机。

  如果您有一台并口的 PostScript 打印机 (因此不能与打印机进行 lprps 需要的双向通信), 可以使用下面这段 shell 脚本来充当文本过滤器:

#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#  Script version; NOT the version that comes with lprps
#  Installed in /usr/local/libexec/psif
#

IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  PostScript job, print it.
    #
    echo "$first_line" && cat && printf "\004" && exit 0
    exit 2
else
    #
    #  Plain text, convert it, then print it.
    #
    ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
    exit 2
fi

  在上面的脚本中, textps 命令是一个独立安装的程序用来将纯文本转换成 PostScript。 您可以使用任何您喜欢的文本到 PostScript 转换程序。 FreeBSD Ports Collection (详见 Ports Collection) 中包含了一个功能非常完整的文本到 PostScript 的转换程序, 它叫做 a2ps


9.4.1.3 模拟 PostScript 在非 PostScript 打印机上

  PostScript 是高质量排版和打印 事实上的 标准。 而 PostScript 也是一个 昂贵 的标准。 幸好, Aladdin 开发了一个和 PostScript 类似的叫做 Ghostscript 的程序可以用在 FreeBSD 上。 Ghostscript 可以读取大多数 PostScript 的文件并处理其中的页面交给多种设备,包括许多品牌的非 PostScript 打印机。 通过安装 Ghostscript 并使用一个特殊的文本过滤器,则可以使一台非 PostScript 打印机用起来就像真的 PostScript 打印机一样。

  Ghostscript 被收录在 FreeBSD Ports Collection 中,有许多可用的版本, 比较常用的版本是 print/ghostscript-gpl

  要模拟 PostScript, 文本过滤器要检测是否要打印一个 PostScript 文件。 如果不是, 那么过滤器将直接将文件发送到打印机; 否则, 它会用 Ghostscript 先将文件转换成打印机可以理解的格式。

  这里有一个例子: 下面的脚本是一个针对 Hewlett Packard DeskJet 500 打印机的文本过滤器。 对于其他打印机, 替换 gs (Ghostscript) 命令中的 -sDEVICE 参数就可以了。 (输入 gs -h 来获得当前安装的 Ghostscript 所支持的设备列表。)

#!/bin/sh
#
#  ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
#  Installed in /usr/local/libexec/ifhp

#
#  Treat LF as CR+LF (to avoid the "staircase effect" on HP/PCL
#  printers):
#
printf "\033&k2G" || exit 2

#
#  Read first two characters of the file
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  It is PostScript; use Ghostscript to scan-convert and print it.
    #
    /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
      -sOutputFile=- - && exit 0
else
    #
    #  Plain text or HP/PCL, so just print it directly; print a form feed
    #  at the end to eject the last page.
    #
    echo "$first_line" && cat && printf "\033&l0H" &&
exit 0
fi

exit 2

  最后, 需要告知 LPD 所使用的过滤器, 通过 if 标签完成:

:if=/usr/local/libexec/ifhp:

  您可以输入 lpr plain.textlpr whatever.ps, 它们都应该可以成功打印。


9.4.1.4 转换过滤器

  在完成了 打印机简单设置 这节中所描述的内容之后, 头一件事 恐怕就是为你喜爱的格式的文件安装转换过滤器了 (除了纯 ASCII 文本)。


9.4.1.4.1 为什么安装转换过滤器?

  转换过滤器使打印众多格式的文件变得很容易。 比如, 假设我们大量使用 TeX 排版系统, 并且有一台 PostScript 打印机。 每次从 TeX 生成一个 DVI 文件, 我们都不能直接打印它直到我们将 DVI 文件转换成 PostScript。 转换的命令应该是下面的样子:

% dvips seaweed-analysis.dvi
% lpr seaweed-analysis.ps

  通过安装 DVI 文件的转换过滤器, 我们可以跳过每次手动转换这一步, 而让 LPD 来完成这个步骤。 现在, 每次要打印 DVI 文件, 我们只需要一步就可以打印它:

% lpr -d seaweed-analysis.dvi

  我们要 LPD 转换 DVI 文件是通过指定 -d 选项完成的。 格式和转换 选项 这一节列出了所有的转换选项。

  对于每种想要打印机支持的转换, 首先要安装 转换过滤器 然后在 /etc/printcap 中指定它的路径。 在简单打印设置中, 转换过滤器类似于文本过滤器 (详见 安装文本过滤器 ) 不同的是它不是用来打印纯文本, 而是将一个文件转换成打印机能够理解的格式。


9.4.1.4.2 我应该安装哪个转换过滤器?

  您应该安装您希望使用的转换过滤器。 如果要打印很多 DVI 数据, 就需要 DVI 转换过滤器; 如果有大量的 troff 数据, 就应该安装 troff 过滤器。

  下面的表格总结了可以与 LPD配合 工作的过滤器, 以及它们在 /etc/printcap文件中的变量名, 还有如何在 lpr命令中调用它们:

文件类型 /etc/printcap文件中的变量名 lpr命令中调用使用的参数
cifplot cf -c
DVI df -d
plot gf -g
ditroff nf -n
FORTRAN text rf -f
troff tf -f
raster vf -v
plain text if none, -p, or -l

  在例子中, lpr -d就是指 打印机需要在/etc/printcap文件中 df变量所指的过滤器。

  不管别人怎么说, 像 FORTRAN 的文本 和 plot 这些格式已经基本不用了。 所以在您的机器上, 就可以安装其他的过滤器来替换这些参数原有的意义。 例如, 假设想要能直接打印 Printerleaf 文件 (由 Interleaf desktop publishing 程序生成), 而且不打算打印 plot 文件, 就可以安装一个 Printerleaf 转换过滤器并且用 gf 变量指定它。 然后就可以告诉您的用户使用 lpr -g 就可以 “打印 Printerleaf 文件。”


9.4.1.4.3 安装转换过滤器

  以为安装的转换过滤器不是 FreeBSD 基本系统的一部分, 所以它们可能是在 /usr/local 目录下。 通常目录 /usr/local/libexec 是保存它们的地方, 因为它们通常是通过 LPD 运行的; 普通用户应该并不需要直接运行它们。

  要启用一个转换过滤器, 只需要在 /etc/printcap 文件中为目标打印机中合适的变量赋上过滤器所在的路径。

  在接下来的例子当中, 我们将为 一台叫做 bamboo 的打印机添加一个转换过滤器。 下面是这个例子的 /etc/printcap 文件, 其中使用新变量 df 来为打印机 bamboo 设置转换过滤器:

#
#  /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

  这里的 DVI 过滤器是一段 shell 脚本, 名字叫做 /usr/local/libexec/psdf。 下面是它的代码:

#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"

  这段脚本以过滤器模式运行 dvips (参数 -f ) 并从标准输入读取要打印的任务。 然后运行 PostScript 文本过滤器 lprps (详见 PostScript 打印机上打印纯文本任务 这一节), 并且带着 LPD 传给脚本的全部参数。 lprps 工具将利用这些参数来为打印进行记帐。


9.4.1.4.4 更多转换过滤器应用实例

  因为安装转换过滤器的步骤并不是固定的, 所以这节介绍了一些可行的例子。 在以后的安装配置过程中可以以这些例子为参考。 甚至如果合适的话, 可以完全照搬过去。

  这段例子中的脚本是一个 Hewlett Packard LaserJet III-Si 打印机的光栅格式数据 (实际上也就是 GIF 文件):

#!/bin/sh
#
#  hpvf - Convert GIF files into HP/PCL, then print
#  Installed in /usr/local/libexec/hpvf
                  
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
    && exit 0 \
    || exit 2

  它的工作原理就是将 GIF 文件转换成 portable anymap, 再转换成 portable graymap, 然后再转换成 portable bitmap, 最后再转换成 LaserJet/PCL- 兼容的数据。

  下面是为打印机配置上上述过滤器的 /etc/printcap 文件:

#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:

  下面的脚本是一个在名叫 bamboo 的这台 PostScript 打印机上打印用 groff 排版软件生成的 troff 数据的打印过滤器:

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"

  上面这段脚本还是用 lprps 来与打印机进行通讯。 如果打印机是接在并口上的, 那么就应该使用下面的这段脚本:

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops

  这里是我们要启用过滤器需要在 /etc/printcap 里增加的内容:

:tf=/usr/local/libexec/pstf:

  下面的例子也许会让许多 FORTRAN 老手羞愧。 它是一个 FORTRAN- 文本 的过滤器, 能在任意一台 可以打印纯文本的打印机上使用。 我们将为打印机 teak 安装这个过滤器:

#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#

printf "\033&k2G" && fpr && printf "\033&l0H" &&
 exit 0
exit 2

  然后我们要在 /etc/printcap 中为打印机能够 teak 启用这个过滤器添加下面的内容:

:rf=/usr/local/libexec/hprf:

  最后, 再给出一个有些复杂的例子。 我们将给以前介绍过的 teak 这台激光打印机添加一个 DVI 过滤器。 首先, 最容易的部分: 更新 /etc/printcap 加入 DVI 过滤器的路径:

:df=/usr/local/libexec/hpdf:

  现在, 该困难的部分了: 编写过滤器。 为了实现过滤器, 我们需要一个 DVI-到-LaserJet/PCL 转换程序。 FreeBSD Ports Collection (详见 Ports Collection 这一节) 中有一个: print/dvi2xx。 安装这个 port 就会得到我们需要的程序, dvilj2p , 它可以将 DVI 数据转换成 LaserJet IIp, LaserJet III, 和 LaserJet 2000 兼容的数据。

  dvilj2p 工具使得过滤器 hpdf 变得十分复杂, 因为 dvilj2p 不能读取标准输入。 它需要从文件中读取数据。 更糟糕的是, 这个文件的名字必须以 .dvi 结尾。 所以使用 /dev/fd/0 作为标准输入是有问题的。 我们可以通过连接 (符号连接) 来解决这个问题。 连接一个临时的文件名 (一个以 .dvi 结尾的文件名) 到 /dev/fd/0, 从而强制 dvilj2p 从标准输入读取。

  现在迎面而来的是另外一个问题, 我们不能使用 /tmp 存放临时连接。 符号连接是被用户和组 bin 拥有的。 而过滤器则是以 daemon 用户运行的。 并且 /tmp 目录设置了 sticky 位。 所以过滤器只能建立符号连接, 但它不能在用完之后清除掉这些连接。 因为它们属于不同的用户。

  所以过滤器将在当前工作目录下建立符号连接, 即后台打印队列目录 (用变量 sd/etc/printcap 中指定)。 这是一个非常好的让过滤器完成它工作的地方, 特别还是因为 (有时) 这个目录比起 /tmp 来有更多的可用磁盘空间。

  最后, 给出过滤器的代码:

#!/bin/sh
#
#  hpdf - Print DVI data on HP/PCL printer
#  Installed in /usr/local/libexec/hpdf

PATH=/usr/local/bin:$PATH; export PATH

#
#  Define a function to clean up our temporary files.  These exist
#  in the current directory, which will be the spooling directory
#  for the printer.
#
cleanup() {
   rm -f hpdf$$.dvi
}

#
#  Define a function to handle fatal errors: print the given message
#  and exit 2.  Exiting with 2 tells LPD to do not try to reprint the
#  job.
#
fatal() {
    echo "$@" 1>&2
    cleanup
    exit 2
}

#
#  If user removes the job, LPD will send SIGINT, so trap SIGINT
#  (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15 

#
#  Make sure we are not colliding with any existing files.
#
cleanup

#
#  Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"

#
#  Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"

# 
#  Convert and print.  Return value from dvilj2p does not seem to be
#  reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi

#
#  Clean up and exit
#
cleanup
exit 0

9.4.1.4.5 自动转换: 一种替代转换过滤器的方法

  以上这些转换过滤器基本上建成了您的打印环境, 但也有不足就是必须由用户来指定 (在 lpr(1) 命令行中) 要使用哪一个过滤器。 如果您的用户不是对计算机很在行, 那么选用过滤器将是一件麻烦的事情。 更糟的是, 当过滤器设定的不正确时, 过滤器被用在了不它对应类型的文件上, 打印机也许会喷出上百张纸。

  比只安装转换过滤器更好的方法, 就是让文本过滤器 (因为它是默认的过滤器) 来检测要打印文件的类型, 然后自动运行正确的转换过滤器。 像 file 这样的工具可以给我们一定的帮助。 当然, 要区分开 有些 文件的类型还是有困难的 ── 但是, 当然, 您可以仅为它们提供转换过滤器。

  FreeBSD 的 Ports 套件提供了一个可以自动进行转换的文本过滤器, 名字叫做 apsfilter (print/apsfilter)。 它可以检测纯文本、 PostScript、 DVI 以及几乎任何格式的文件, 并在执行相应的转换之后完成打印工作。


9.4.1.5 输出过滤器

  LPD 后台打印系统还支持一种我们还没有讨论过的过滤器: 输出过滤器。 输出过滤器只是用来打印纯文本的, 类似于文本过滤器, 但简化了许多地方。 如果您正在使用输出过滤器而不是文本过滤器, 那么:

  • LPD 为整个任务启动一个输出过滤器, 而不是为任务中的每个文件都启动一次。

  • LPD 不会提供任务中文件开始和结束的信息给输出过滤器。

  • LPD 不会提供用户名或者主机名给过滤器, 所以它是无法做打印记帐的。 事实上它只有两个参数:

    过滤器-名字 -w宽度 -l长度

    宽度 来自于 pw 变量, 而 length 来自于 pl 变量, 这些值都是实际问题中给打印机设置的。

  不要让输出过滤器的简化所耽误。 如果想要输出过滤器完成让任务中的每个文件都重新开始一页打印是 不可能 的。 请使用文本过滤器 (也叫输入过滤器); 详见 安装文本过滤器。 此外, 实际上, 输出过滤器 更复杂 , 它要检查发给它的字节流中是否有特殊的标志字符, 并且给自己发送信号来代替 LPD 的。

  可是, 如果打算要报头页或者需要发送控制字符或者其他的初始化字符串来完成打印报头页, 那么输出过滤器则是 必需的。 (但是它也是 无用的 如果打算对打印的用户计费, 因为 LPD 不会给输出过滤器任何用户或者主机的信息。)

  在一台单个的打印机上, LPD 同时允许输出过滤器、 文本过滤器和其他的过滤器。 在某些情况下, LPD 将仅会启动输出过滤器来打印报头页 (详见 报头页)。 然后 LPD 会要求输出过滤器 自己停止运行 , 它发送给过滤器两个字节: ASCII 031跟着一个 ASCII 001。 当输出过滤器看见这两个字节 (031, 001), 它应该通过发送 SIGSTOP 信号来停止自己的运行。 当 LPD 已经运行好了其他的过滤器, 它会通过给输出过滤器发送 SIGCONT 信号来让输出过滤器重新运行。

  如果仅有一个输出过滤器而 没有 文本过滤器, 并且 LPD 正在处理一个纯文本任务, LPD 会使用输出过滤器来完成这个任务。 像以前运行一样, 输出过滤器会按顺序打印任务中的文件, 而不会插入送纸或其他进纸的命令, 但这也许并 不是 您想要的结果。 在大多数情况下, 您还是需要一个文本过滤器。

  lpf 这个我们前面介绍过的文本过滤器程序, 也可以用来做输出过滤器。 如果需要使用快速且混乱的输出过滤器, 但又不想写字节检测和信号发送代码, 那么试试 lpflpf 也可以包含在一个 shell 脚本中来处理任何打印机可能需要的初始化代码。


9.4.1.6 lpf: 一个文本过滤器

  /usr/libexec/lpr/lpf 这个程序包含在 FreeBSD 的二进制程序中, 它是一个文本过滤器 (输入过滤器)。 它可以缩排输出 (用 lpr -i 命令提交的任务), 可以打印控制字符禁止断页 用 lpr -l 提交的任务), 可以调整任务中退格和制表符打印的位置, 还可以对打印进行记帐。 它同样可以像输出过滤器一样工作。

  lpf 适用于很多打印环境。 尽管它本身没有向打印机发送初始化代码的功能, 但写一个 shell 脚本来完成所需的初始化并执行 lpf 是很容易的。

  为了让 lpf 可以正确的进行打印记帐, 那么需要 /etc/printcap 中的 pwpl 变量都填入正确的值。 它用这些值来测定一页能打印多少文本, 并计算出任务有多少页。 想得到更多关于打印记帐的信息, 请参见 对打印机使用进行记帐


9.4.2 报头页

  如果您有 很多 用户, 他们正在使用各式各样的打印机, 那么您或许要考虑一下把 报头页 当作无可避免之灾祸了。

  报头页, 也叫 banner 或者 burst 页, 可以用来辨别打印出的文件是谁打印的。 它们通常用大号的粗体字母打印出来, 也可能用装饰线围绕四周, 所以在一堆打印出的文件中, 突出的显示了这个文件属于哪个用户的哪个任务。 这可以让用户快速的找到他们的任务。 而报头页一个明显的缺点就是, 在每个任务中都要有一张或者几张纸作为报头页印出来, 可是它们的有用的地方只发挥几分钟的作用, 最后它们会被放进回收站或者扔进垃圾堆。 (注意报头页只是一个任务一个, 而不是任务中的每个文件都有一个, 所以可能对纸张还不算很浪费。)

  LPD 系统可以自动为您的打印提供报头页, 如果 您的打印机可以直接打印纯文本。 如果您的打印机是一台 PostScript 打印机, 您将需要一个外部的程序来生成报头页; 详见 PostScript 打印机上打印报头页


9.4.2.1 打开报头页

  在 简单打印设置 这节, 我们通过在 /etc/printcap 文件中指定 sh (“禁止报头页”) 来把报头页功能关掉了。 要重新为打印机开启报头页功能, 只需要删除掉 sh

  听起来很容易, 不是么?

  是的。 您 可能 不得不让输出过滤器来给打印机发送初始化字符串。 下面是一个用在 Hewlett Packard PCL-兼容打印机上的输出过滤器的例子:

#!/bin/sh
#
#  hpof - Output filter for Hewlett Packard PCL-compatible printers
#  Installed in /usr/local/libexec/hpof

printf "\033&k2G" || exit 2
exec /usr/libexec/lpr/lpf

  用 of 变量指定输出过滤器的路径。 参见 输出过滤器 这一节来得到更多信息。

  下面是一个为我们以前介绍的叫做 teak 的打印机配置的 /etc/printcap 文件; 在配置当中我们开启了报头页并且加入了上述的打印过滤器:

#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:\
        :of=/usr/local/libexec/hpof:

  现在, 当用户再发任务给打印机 teak 的时候, 每个任务都会有一个报头页。 如果用户想要花时间来寻找他们自己打印的文件, 那么他们可以通过 lpr -h 命令来提交任务; 参考 报头页选项 这一节来得到更多关于 lpr(1) 的选项。

注意: LPD 在报头页之后发出一个换纸字符。 如果您的打印机使用一个不同的字符或者字符串当作退纸指令, 在 /etc/printcap 中用 ff 变量指定即可。


9.4.2.2 控制报头页

  通过启用报头页, LPD 将生成出一个 长报头, 一整页的大字母, 标着用户, 主机和任务名。 下面是一个例子 (kelly 从主机 rose 打印了一个叫做 “outline” 的任务):

      k                   ll       ll
      k                    l        l
      k                    l        l
      k   k     eeee       l        l     y    y
      k  k     e    e      l        l     y    y
      k k      eeeeee      l        l     y    y
      kk k     e           l        l     y    y
      k   k    e    e      l        l     y   yy
      k    k    eeee      lll      lll     yyy y
                                               y
                                          y    y
                                           yyyy


                                   ll
                          t         l        i
                          t         l
       oooo    u    u   ttttt       l       ii     n nnn     eeee
      o    o   u    u     t         l        i     nn   n   e    e
      o    o   u    u     t         l        i     n    n   eeeeee
      o    o   u    u     t         l        i     n    n   e
      o    o   u   uu     t  t      l        i     n    n   e    e
       oooo     uuu u      tt      lll      iii    n    n    eeee









      r rrr     oooo     ssss     eeee
      rr   r   o    o   s    s   e    e
      r        o    o    ss      eeeeee
      r        o    o      ss    e
      r        o    o   s    s   e    e
      r         oooo     ssss     eeee







                                              Job:  outline
                                              Date: Sun Sep 17 11:04:58 1995

  LPD 会附加一个换页符在这段文本之后, 所以任务会在新的一页上开始 (除非设置了 sf (禁止换纸) 在 /etc/printcap 文件里目标打印机的记录中)。

  如果您喜欢, LPD 可以生成一个 短报头; 指定 sb (短 banner) 在文件 /etc/printcap 中。 报头页就会看起来像下面这样:

rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995

  同样是默认的, LPD 也是先打印报头页, 然后才是任务。 要想反过来, 在 /etc/printcap 中指定 hl (最后报头)。


9.4.2.3 为带报头页的任务记帐

  使用 LPD 内置的报头页会在进行打印记帐的时候产生一种特殊情况: 报头页肯定是 免费 的。

  为什么?

  因为输出过滤器是仅有的一个在打印报头页时能进行记帐的外部程序, 但却没有提供给它任何 用户或者主机 的信息或者记帐文件, 所以它无法知道谁应该为打印机的使用付费。 如果仅仅是 “增加一页” 给文本过滤器或者其他过滤器 (它们有用户和主机的信息) 是不够的, 因为 用户可以用 lpr -h 命令跳过报头页。 他还是需要为自己并没有打印的报头页付钱。 基本上, lpr -h 是明知用户的首选, 但也不能强制让别人使用它。

  让每个过滤器生成自己的报头页 (因此可以为它们计费) 是 仍然不够的。 如果用户想要用 lpr -h 命令禁止报头页, 它们将仍然印出报头页并且为它们付费。 因为 LPD 不会把 -h 这个参数传给任何过滤器。

  这样, 您该怎么办呢?

  您可以:

  • 认可 LPD 的这个问题, 并且免费提供报头页打印。

  • 安装一个替代 LPD 的软件, 比如 LPRng。 参考 替换标准的后台打印软件 来得到更多关于可以替代 LPD 的软件的信息。

  • 写一个 聪明的 输出过滤器。 通常, 输出过滤器不应该去完成除了初始化打印机或者进行一些简单字符转换以外的任何事情。 它适合完成报头页和纯文本任务 (当没有文本 (输入) 过滤器时)。 但是, 如果有文本过滤器为纯文本任务服务, 那么 LPD 将仅为打印报头页启动输出过滤器。 而且, 这个输出过滤器可以理解报头页里 LPD 生成的信息, 然后决定哪位用户和主机应该为报头页付费。 这种方法仅有的问题是输出过滤器仍然不知道应该使用什么记帐文件 (af 变量的内容并没有被传递过来), 但是如果您有一个众所周知的记帐文件, 就可以直接把文件名写进输出过滤器。 为了简化解释报头的步骤, 我们定义 sh (短报头) 变量在 /etc/printcap 文件中。 但这些还是太麻烦了, 而且用户也更喜欢让他们免费打印报头页的慷慨的系统管理员。


9.4.2.4 在 PostScript 打印机上打印报头页

  像上面描述的那样,LPD 可以生成一个纯文本的报头页来适应多种打印机。 当然, PostScript 不能直接打印纯文本, 所以 LPD 没什么用──或者说大多时候是这样。

  一个显而易见的方法来得到报头页就是让每个转换过滤器和文本过滤器都来生成报头页。 这些过滤器应该用用户名和主机的参数来生成一个相对应的报头页。 这种方法的缺点就是用户总是打印出报头页, 无论他们是否用 lpr -h 命令来提交的任务。

  让我们来深入深入的研究一下这个方法。 下面的脚本输入三个参数 (用户登录名, 主机名, 和任务名) 然后生成一个简单的 PostScript 报头页:

#!/bin/sh
#
#  make-ps-header - make a PostScript header page on stdout
#  Installed in /usr/local/libexec/make-ps-header
#

#
#  These are PostScript units (72 to the inch).  Modify for A4 or
#  whatever size paper you are using:
#
page_width=612
page_height=792
border=72

#
#  Check arguments
#
if [ $# -ne 3 ]; then
    echo "Usage: `basename $0` <user> <host> <job>" 1>&2
    exit 1
fi

#
#  Save these, mostly for readability in the PostScript, below.
#
user=$1
host=$2
job=$3
date=`date`

#
#  Send the PostScript code to stdout.
#
exec cat <<EOF
%!PS

%
%  Make sure we do not interfere with user's job that will follow
%
save

%
%  Make a thick, unpleasant border around the edge of the paper.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray

%
%  Display user's login name, nice and large and prominent
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show

%
%  Now show the boring particulars
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
200 y moveto show /y y 18 sub def }
forall

/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
        270 y moveto show /y y 18 sub def
} forall

%
% That is it
%
restore
showpage
EOF

  现在, 每个转换过滤器和文本过滤器都能调用这段脚本来生成报头页, 然后打印用户的任务。 下面是我们早些时候在这个文档中提到的 DVI 转换过滤器, 被修改之后来生成一个报头页:

#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
#  Invoked by lpd when user runs lpr -d
#
                
orig_args="$@"

fail() {
    echo "$@" 1>&2
    exit 2
}

while getopts "x:y:n:h:" option; do
    case $option in
        x|y)  ;; # Ignore
        n)    login=$OPTARG ;;
        h)    host=$OPTARG ;;
        *)    echo "LPD started `basename $0` wrong." 1>&2
              exit 2
              ;;
    esac
done

[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"

( /usr/local/libexec/make-ps-header $login $host "DVI File"
  /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args

  过滤器是怎样解释参数列表来决定用户名和主机名的。 解释的方法对于其他转换过滤器来说也是一样的。 尽管文本过滤器需要输入的参数有些小的不同, (参见 过滤器是怎样工作的)。

  像我们以前提到的那样, 上面的配置, 尽管相当简单, 关掉了 “禁止报头页” 的选项 (-h 选项) 在 lpr 中。 如果用户想要保护树木 (或者是几便士, 如果你对打印报头页收费的话), 它还不能完成这件事情, 因为每个过滤器都要为每个任务打印一个报头页。

  要允许用户对于每个任务都可以关闭报头页, 您需要使用在 为报头页记帐 这节中介绍的那种技巧: 写一个输出过滤器来解释 LPD- 生成的报头页并且生成一个 PostScript 的版本。 如果用户用 lpr -h 命令提交任务, 那么 LPD 将不会生成报头页, 并且输出过滤器也不会生成报头页。 否则, 输出过滤器将从 LPD 读取文本, 然后发送适当的报头页的 PostScript 编码给打印机。

  如果您有的是一台连在串口上的 PostScript 打印机, 您可以使用 lprps 里的一个输出过滤器, psof , 它可以完成上述任务。 但注意 psof 不对报头页计费。


9.4.3 网络打印

  FreeBSD 支持网络打印: 发送任务给远程打印机。 网络打印通常指两种不同的方式:

  • 访问一台连接在远程主机上的打印机。 在一台主机上安装一台常规的串口或并口打印机。 然后, 设置 LPD 来通过网络访问其他主机上的打印机。 具体见 安装在远程主机上的打印机 这节。

  • 访问一台直接连接在网络上的打印机。 打印机另有一个网络接口 (或者替代常规的串口或者并口)。 这样的打印机可能像下面这样工作:

    • 它或许可以理解 LPD 的协议, 并且甚至可以接收远程主机发来的任务排进队列。 这样, 它就像一个普通的主机运行着 LPD 一样。 做在 安装在远程主机上的打印机 里介绍的步骤, 可以设置好这样的打印机。

    • 它或许支持网络数据流。 这样, 把打印机 “接” 在一台网络上的主机上, 由这台主机负责安排任务并发送任务到打印机。 参见 带网络数据流接口的打印机 这节来得到更多安装这类打印机的建议。


9.4.3.1 安装在远程主机上的打印机

  LPD 后台打印系统内建了对给其他也运行着 LPD (或者是与 LPD 兼容的) 的主机发送任务的功能。 这个功能使您可以在一台主机上安装打印机, 并让它可以在其他主机上访问。 这个功能同样适用在那些有网络接口并且可以理解 LPD 协议的打印机上。

  要开启这种远程打印的功能, 首先在一台主机上安装打印机, 就是 打印服务器, 可以使用在 简单打印机设置 这节中简单设置的方法。 高级的设置可以参考 高级打印机设置 这节中你需要的部分。 一定要测试一下打印机, 看看它是不是所有您开启的 LPD 的功能都正常工作。 此外还需要确认 本地主机 允许使用 远程主机 上的 LPD 服务 (参见 限制远程打印机任务)。

  如果您正在使用一台带网络接口并与 LPD 兼容的打印机, 那么我们那下面讨论中的 打印服务器 就是打印机本身, 而 打印机名 就是您为打印机配置的名字。 参考随打印机和/或者打印机-网络接口供给的文档。

提示: 如果您正使用惠普的 Laserjet, 则打印机名 text 将自动地为您完成 LF 到 CRLF 的转换, 因而也就不需要 hpif 脚本了。

  然后, 在另外一台你想要访问打印机的主机上的 /etc/printcap 文件中加入它们的记录, 像下面这样:

  1. 可以随意给这个记录起名字。 简单起见, 您可以给打印服务器使用相同的名字或者别名。

  2. 保留 lp 变量为空, (:lp=:)。

  3. 建立一个后台打印队列目录, 并用 sd 变量指明其位置。 LPD 将把任务提交给打印服务器之前, 会把这些任务保存在这里。

  4. rm 变量中放入打印服务器的名字。

  5. rp 中放入打印服务器上打印机的名字。

  就是这样。 不需要列出转换过滤器, 页面大小, 或者其他的一些东西在 /etc/printcap 文件中。

  这有一个例子。 主机 rose 有两台打印机, bamboorattan。 我们要让主机 orchid 的用户可以使用这两台打印机。 下面是 /etc/printcap 文件, 用在主机 orchid (详见 开启报头页) 上的。 文件中已经有了打印机 teak 的记录; 我们在主机 rose 上增加了两台打印机:

#
#  /etc/printcap for host orchid - added (remote) printers on rose
#

#
#  teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

#
#  rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

#
#  bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:

  然后, 我们只需要在主机 orchid 上建立一个后台打印队列目录:

# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo

  现在, 主机 orchid 上的用户可以打印到 rattanbamboo 了。 如果, 比如, 一个用户在主机 orchid 上输入了:

% lpr -P bamboo -d sushi-review.dvi

  LPD 系统在主机 orchid 上会复制这个任务到后台打印队列目录 /var/spool/lpd/bamboo 并且记下这是一个 DVI 任务。 当主机 rose 上的打印机 bamboo 的后台打印队列目录有空间的时, 这两个 LPD 系统将会传输这个文件到主机 rose 上。 文件将排在主机 rose 的队列中知道最终被打印出来。 它将被从 DVI 转换成 PostScript (因为 bamboo 是一台 PostScript 打印机) 在主机 rose


9.4.3.2 带有网络数据流接口的打印机

  通常, 当您为打印机购买了一块网卡, 可以得到两个版本: 一个是模拟后台打印 (贵一些的版本), 或者一个只发送数据给打印机就像在使用串口或者并口一样 (便宜一些的版本)。 这节讲述如何使用这个便宜一些的版本。 要得到贵一些版本的更多信息, 参见前面章节 安装在远程主机上的打印机

  /etc/printcap 文件的格式让您指定使用哪个串口或并口, 并且还要指定 (如果您正在使用串口), 使用多快的波特, 是否使用流量控制, 为制表符延迟, 转换换行, 等等。 但是没有一种方法指定一个连接到一台正在监听 TCP/IP 的或者其他网络接口的打印机。

  要发送数据到网络打印机, 就需要开发一个通讯程序, 它可以被文本或者转换过滤器调用。 下面是一些例子: 脚本 netprint 将标准输入的所有数据发送到一个连在网络上的打印机。 我们将打印机的名字作为第一个参数, 端口号跟在后面作为第二个参数, 传给 netprint。 注意它只支持单向通讯 (FreeBSD 到打印机); 很多网络打印机支持双向通讯, 并且这是您可能利用到的 (得到打印机状态, 进行打印记帐, 等等的时候。)。

#!/usr/bin/perl
#
#  netprint - Text filter for printer attached to network
#  Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";

$printer_host = $ARGV[0];
$printer_port = $ARGV[1];

require 'sys/socket.ph';

($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
    = gethostbyname($printer_host);

$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
    || die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;

  然后我们就可以在多种过滤器里使用这个脚本了。 加入我们有一台 Diablo 750-N 行式打印机联在网络上。 打印机在 5100 端口上接收要打印的数据。 打印机的主机名是 scrivener。 这里是为这个打印机写的文本过滤器:

#!/bin/sh
#
#  diablo-if-net - Text filter for Diablo printer `scrivener' listening
#  on port 5100.   Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100

9.4.4 限制打印机的使用

  这节将讲述关于限制打印机使用的问题。 LPD 系统让您可以控制谁可以访问打印机, 无论本地或是远程的, 是否他们可以打印机多份副本, 任务可以有多大, 以及打印队列的尺寸等。


9.4.4.1 限制多份副本

  LPD 系统能够简化用户在打印多份副本时的工作。 用户可以用 lpr -#5 (举例) 来提交打印任务, 则会将任务中每个文件都打印五份副本。 这是不是一件很棒的事情呢。

  如果您感觉多份副本会对打印机造成不必要的磨损和损耗, 您可以屏蔽掉 lpr(1)-# 选项, 这可以通过在 /etc/printcap 文件中增加 sc 变量来完成。 当用户用 -# 选项提交任务时, 他们将看到:

lpr: multiple copies are not allowed

  注意当为一台远程打印机进行设置时 (参见 安装在远程主机上的打印机 这一节) 您还需要同时在远程主机的 /etc/printcap 文件中 增加sc 变量, 否则用户还是可以从其他主机上提交使用多份副本的任务。

  下面是一个例子。 这个是 /etc/printcap 文件在主机 rose 上。 打印机 rattan 非常轻闲, 所以我们将允许多份副本, 但是激光打印机 bamboo 则有些忙, 所以我们禁止多份副本, 通过增加 sc 变量:

#
#  /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

  现在, 我们还需要增机 sc 变量在主机 orchid/etc/printcap 文件中 (顺便我们也禁止打印机 teak 多份打印) :

#
#  /etc/printcap for host orchid - no multiple copies for local
#  printer teak or remote printer bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:

  通过使用 sc 变量, 我们阻止了 lpr -# 命令的使用, 但仍然没有禁止用户多次运行 lpr(1) , 或者多次提交任务中同样的文件, 像下面这样:

% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign

  这里有很多种方法可以阻止这种行为 (包括忽略它), 并且是免费的。


9.4.4.2 限制对打印机的访问

  您可以控制谁可以打印到哪台打印机通过 UNIX 的组机制和文件 /etc/printcap 中的 rg 变量。 只要把可以访问打印机的用户放进适当的组中, 然后在 rg 变量中写上组的名字。

  非这组的用户 (包括 root) 将会得到这样的提示: “lpr: Not a member of the restricted group” 如果他们试图打印到被限制的打印机。

  像使用 sc (禁止多份副本) 变量一样, 您需要指定 rg 在远程同样对打印机有访问限制的主机上, 如果您感觉合适的话 (参考 安装在远程主机上的打印机 这一节)。

  比如, 我们将让任何人都可以访问打印机 rattan, 但只有在 artists 组中的人可以使用打印机 bamboo。 这里是类似的主机 rose 上的 /etc/printcap 文件:

#
#  /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

  Let us leave the other example /etc/printcap file (for the host orchid) alone. Of course, anyone on orchid can print to bamboo. It might be the case that we only allow certain logins on orchid anyway, and want them to have access to the printer. Or not.

注意: 这里每台仅能有一个限制的组。


9.4.4.3 控制提交的任务大小

  如果您有很多用户访问打印机, 可能需要对用户可以提交的文件尺寸设置一个上限。 毕竟, 文件系统中后台打印队列目录的空间是有限的, 您需要保证这里有空间来存放其他用户的任务。

  LPD 允许通过使用 mx 变量来限制任务中文件的最大字节数, 方法是指定单位为块的 BUFSIZ 数, 每块表示 1024 字节。 如果在这个变量的值是 0, 则表示不进行限制; 不过, 如果不指定 mx 变量的话, 则会使用默认值 1000 块。

注意: 这个限制是对于任务中 文件 的, 而 不是 任务总共的大小。

  LPD 不会拒绝比限制大小大的文件。 但它是将限制大小以内的部分排入队列, 并且打印出来的只有这些。 剩下的部分将被丢弃。 这个行为是否正确还需讨论。

  让我们来为例子打印机 rattanbamboo 增加限制。 由于那些 artistsPostScript 文件可能会很大, 我们将限制大小为 5 兆字节。 我们将不对纯文本行式打印机做限制:

#
#  /etc/printcap for host rose
#

#
#  No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:mx#0:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

#
#  Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

  同样, 限制只对本地用户起作用。 如果设置了允许远程用户使用您的打印机, 远程用户将不会受到这些限制。 您也需要指定 mx 变量在远程主机的 /etc/printcap 文件中。 参见 安装在远程主机上的打印机 这一节来得到更多有关远程打印的信息。

  除此之外, 还有另一种限制远程任务大小的方法; 参见 限制远程打印机任务


9.4.4.4 限制远程打印机任务

  LPD 后台打印系统提供了多种方法来限制从远程主机提交的任务:

主机限制

您可以控制本地 LPD 接收哪台远程主机发来的请求, 通过 /etc/hosts.equiv 文件和 /etc/hosts.lpd 文件。 LPD 查看是否到来的任务请求来自被这两个文件中列出的主机。 如果没有, LPD 会拒绝这个请求。

这些文件的格式非常简单: 每行一个主机名。 注意 /etc/hosts.equiv 文件也被 ruserok(3) 协议使用, 并影响着 rsh(1) and rcp(1) 等程序, 所以要小心。

举个例子, 下面是 /etc/hosts.lpd 文件在主机 rose 上:

orchid
violet
madrigal.fishbaum.de

意思是主机 rose 将接收来自 orchidviolet, 和 madrigal.fishbaum.de 的请求。 如果任何其他的主机试图访问主机 roseLPD, 任务将被拒绝。

大小限制

您可以控制后台打印队列目录需要保留多少空间。 建立一个叫做 minfree 的文件在后台打印队列目录下为本地打印机。 在这个文件中插入一个数字来代表多少磁盘块数 (512 字节) 的剩余空间来接收远程任务。

这让您可以保证远程用户不会填满您的文件系统。 您也可以用它来给本地用户一个优先: 他们可以在磁盘剩余空间低于 minfree 文件中的指定值后仍然可以提交任务。

比如, 让我们增加一个 minfree 文件为打印机 bamboo。 我们检查 /etc/printcap 文件来找到这个打印机的后台打印队列目录; 这里是打印机 bamboo 的记录:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

后台打印队列目录在 sd 变量中给出。 我们设置 3 兆字节 (6144 磁盘块) 为文件系统上必须存在的总共剩余空间, 让 LPD 可以接受远程任务:

# echo 6144 > /var/spool/lpd/bamboo/minfree
             
用户限制

您可以控制哪些远程用户可以打印到本地打印机, 通过指定 rs 变量在 /etc/printcap 文件中。 当 rs 出现在一个本地打印机的记录中时, LPD 将接收来自远程主机 在本地有同样登录名的用户提交的任务。 否则, LPD 会拒绝这个任务。

这个功能在一个 (比如) 有许多部门共享一个网络的环境中特别有用, 并且有些用户可以越过部门的边界。 通过为他们在您的系统上建立帐号, 他们可以他们自己的部门的系统里使用您的打印机。 如果 允许他们您的打印机, 而不是您的计算机资源, 您可以给他们 “象征” 帐户, 不带主目录并且设置一个没用的 shell , 比如 /usr/bin/false


9.4.5 对打印机使用记帐

  当然, 你需要对打印付费。 为什么不? 纸张和墨水都需要花钱的。 并且这里还有维护的费用 ── 打印机是由很多部件组装成的, 并且零件会坏掉。 您可以检查您的打印机, 使用形式, 和维护费用来得出每页 (或者每尺, 每米, 或者每什么) 的费用。 现在, 您怎样启动打印记帐呢?

  好了, 坏消息是 LPD 后台打印系统在这个部分没有提供很多帮助。 记帐是一个对使用的打印机的种类, 打印的格式, 和 您的 在对打印机的使用计费的需求依赖性很高的。

  要实现记帐, 您必须更改打印机的文本过滤器 (对纯文本任务记费) 和转换过滤器 (对其他格式的文件计费), 要统计页数或者查询打印了多少页的话。 您不可以通过使用简单的输出过滤器来逃脱计费, 因为它不能进行记帐。 参见 过滤器 这节。

  通常, 有两种方法来进行记帐:

  • 定期记帐 是更常用的方法, 可能因为它更简单。 无论合适何人打印一个任务, 过滤器都将记录用户名, 主机名, 和打印的页数到一个记帐文件。 每个月, 学期, 年, 或者任何您想设定的时间段, 收集这些不同打印机上的记帐文件, 按用户对打印的页数进行结算, 并对使用进行付费。 然后删掉所有记录文件, 开始一个新的计费周期。

  • 实时记帐 不太常用, 可能因为它比较难。 这种方法让过滤器对用户的打印进行实时的记帐。 像磁盘配额, 记帐是实时的。 您可以组织用户打印当他们的帐户超额的时候, 并且可能提供一种方法让用户检查并调整他们的 “打印配额。” 但这个方法需要一些数据库代码来跟踪用户和他们的配额。

  LPD 后台打印系统对两种方法都支持且很简单: 所以您需要提供过滤器 (大多数时候), 还要提供记帐代码。 但这好的方面是: 您可以有非常灵活的记帐方法。 比如, 您可以选择使用阶段记帐还是实时记帐。 您可以选择记录哪些信息: 用户名, 主机名, 任务类型, 打印页数, 使用了多少平方尺的纸, 任务打印了多长时间, 等等。 您可以通过修改过滤器来存储这些信息。


9.4.5.1 快速并且混乱的打印记帐

  FreeBSD 包含两个可以让您立刻可以建立起简单的阶段记帐的程序。 它们是文本过滤器 lpf, 在 lpf: 一个文本过滤器 这节中描述, 和 pac(8), 一个收集并统计打印机记帐文件中记录的程序。

  像在前面章节提到的过滤器一样 (过滤器), LPD 启动文本或者转换过滤器并在过滤器命令行里带上记帐文件的名字。 过滤器可以使用这个参数知道该往哪写记帐记录。 这个文件的名字来自于 af 变量在 /etc/printcap 文件里, 并且如果没有指定绝对路径, 则默认是相对于后台打印队列目录的。

  LPD 启动 lpf 带着页宽和页长的参数 (通过 pwpl 变量)。 lpf 使用这些参数来判定将使用多少张纸。 在文件发送到打印机之后, 它就会在记帐文件中写入记录。 记录像下面这个样子:

2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang

  您应该让每个打印机都使用一个独立的记帐文件, 像 lpf 就没有内建文件锁逻辑, 这样两个 lpf 可能会发生彼此记录混合的情况, 如果它们同时要在同一个文件写入内容的时候。 一个最简单的保证每个打印机都使用一个独立的记帐文件的方法就是将 af=acct 写在 /etc/printcap 文件中。 然后, 每个打印机的记帐文件都会在这台打印机的后台打印队列目录中, 文件的名字叫做 acct

  当您准备对用户的打印进行收费时, 运行 pac(8) 程序。 只要转换到要收集信息的这台打印机的后台打印队列目录, 然后输入 pac。 您将会得到一个美元计费的摘要像下面这样:

  Login               pages/feet   runs    price
orchid:kelly                5.00    1   $  0.10
orchid:mary                31.00    3   $  0.62
orchid:zhang                9.00    1   $  0.18
rose:andy                   2.00    1   $  0.04
rose:kelly                177.00  104   $  3.54
rose:mary                  87.00   32   $  1.74
rose:root                  26.00   12   $  0.52

total                     337.00  154   $  6.74

  这些是 pac(8) 需要的参数:

-P打印机

哪台 打印机 要结帐。 这个选项仅在用 af 变量在 /etc/printcap 文件中指定了绝对路径的情况下起作用。

-c

以金额来排序输出来代替以用户名字字母排序。

-m

忽略记帐文件中的主机名。 带上这个选项, 用户 smith 在主机 alpha 上与同样的用户 smith 在主机 gamma 上一样。 不带这个选项的话, 他们则是不同的用户。

-p单价

使用 price 作为每页或每尺美元的单价来替代 pc 变量指定的单价在 /etc/printcap 文件中, 或者两分 (默认)。 price 可以用一个浮点数来指定。

-r

反向排序。

-s

建立一个记帐摘要文件, 并且截短记帐文件。

名字 ...

只打印指定 名字 用户的记帐信息。

  在 pac(8) 默认产生的摘要中, 可以看到在不同主机上的每个用户打印了多少页。 如果在您这里, 主机不考虑 (因为用户可以使用任何主机), 运行 pac -m, 来得到下面的摘要:

  Login               pages/feet   runs    price
andy                        2.00    1   $  0.04
kelly                     182.00  105   $  3.64
mary                      118.00   35   $  2.36
root                       26.00   12   $  0.52
zhang                       9.00    1   $  0.18

total                     337.00  154   $  6.74

  要以美元计算应付钱数, pac(8) 指定 pc 变量在 /etc/printcap 文件中 (默认是 200, 或者 2 分每页). 这个参数的单位是百分之一分, 在这个变量中指定每页或者每尺的价格。 您可以覆盖这个值当运行 pac(8) 带着参数 -p 的时候。 参数 -p 的单位是美元, 而不是百分之一分。 例如,

# pac -p1.50

  设定每页的价格是 1 美元 5 美分。 您可以通过这个选项来达到目标利润。

  最终, 运行 pac -s 将存储这些信息在一个记帐文件里, 文件名和打印机帐户的名字相同, 但是带着 _sum 的后缀。 然后截短记帐文件。 当您再次运行 pac(8) 的时候, 它再次读取记帐文件来得到初始的总计, 然后在记帐文件中增加信息。


9.4.5.2 怎样对打印的页数进行计数?

  为了进行远程的精确记帐, 需要判断一个任务将会消耗多少张纸。 这是打印记帐问题的关键。

  对于纯文本任务, 这个问题不是太难解决: 对任务中的行数进行计数然后与打印机支持的每页行数进行比较。 别忘了也对添印的行, 或者很长的逻辑上的一行但在打印机上会折成两行的这类进行记帐。

  文本过滤器 lpf (在 lpf:一个文本过滤器 这节中介绍) 会在记帐时考虑这些问题。 如果正在编写一个可以进行记帐的文本过滤器, 您可能需要查看 lpf 的源代码。

  怎样处理其他格式的文件?

  好, 对于 DVI- 到 -LaserJet 或者 DVI- 到 -PostScript 转换, 可以让您的过滤器输出诊断信息, 关于 dvilj 或者 dvips 命令, 并且看到多少页被转换了。 您也许可以对于其他类型的文件和转换程序进行类似操作。

  但是这些方法的弱点就是事实上打印机并不是打印了所有的页。 比如, 卡纸, 缺墨, 或者炸掉了 ── 但用户还是要为没有打印的部分付钱。

  您该怎样做?

  只有一条 肯定 的方法来进行 精确 的记帐。 购买一台可以告诉您它使用了多少纸的打印机, 并且将它连接到串口或者网络上。 几乎所有 PostScript 打印机都支持这个小功能。 其他制造厂或其他型号也可以有这个功能 (比如 Imagen 激光网络打印机)。 为这些打印机更改过滤器使它在打印完每个任务之后接收纸张用量, 并 基于这个值进行记帐。 不需要计算行数, 也不需要容易出错的文件检查。

  当然, 您也总是可以大方的使打印免费。


9.5 使用打印机

  这节将讲述如何使用在 FreeBSD 下设置好的打印机。 下面是一个用户级命令的总览:

lpr(1)

打印任务

lpq(1)

检查打印队列

lprm(1)

从打印机的队列中移除任务

  还有一个管理命令, lpc(8), 在 管理打印机 一节中有所介绍, 它可以用于控制打印机及其队列。

   lpr(1), lprm(1), and lpq(1) 这三个命令都接受 -P printer-name 选项来指定对哪个打印机 / 队列进行操作, 在 /etc/printcap 文件中列出的打印机。 这允许您提交, 删除, 并检查任务在多个打印机上。 如果您不使用 -P 选项, 那么这些命令会使用在 环境变量 PRINTER 中指定的打印机。 最终, 如果您也没有 PRINTER 这个环境变量, 这些命令的默认值是叫做 lp 的这台打印机。

  从此以后, 术语 默认打印机 就是指 PRINTER 环境变量中指定的这台, 或者叫做 lp 的这一台当没有环境变量 PRINTER 的时候。


9.5.1 打印任务

  要打印文件, 输入:

% lpr filename ...

  这个命令会打印所有列出的文件到默认打印机。 如果没有列出文件, lpr(1) 会从标准输入读取打印数据。 比如, 这个命令打印一些重要的系统文件:

% lpr /etc/host.conf /etc/hosts.equiv

  要选择一个指定的打印机, 输入:

% lpr -P printer-name filename ...

  这个例子打印一个当前目录的长长的列表到叫做 rattan 的这台打印机:

% ls -l | lpr -P rattan

  因为没有为 lpr(1) 命令列出文件, lpr 从标准输入读入数据, 在这里是 ls -l 命令的输出。

   lpr(1) 命令同样可以接受多种控制格式的选项, 应用文件转换, 生成多份副本, 等等。 要得到更多信息, 参考 打印选项 这节。


9.5.2 检查任务

  当使用 lpr(1) 进行打印时, 您希望打印的所有数据被放在一起打包成了一个 “打印任务”, 它被发送到 LPD 后台打印系统。 每台打印机都有一个任务队列, 并且您的任务在队列中等待其他用户的其他任务打印。 打印机按照先来先印的规则打印这些任务。

  要显示默认打印机的队列, 输入 lpq(1)。 要指定打印机, 使用 -P 选项。 例如, 命令

% lpq -P bamboo
会显示打印机 bamboo 的队列。 下面是命令 lpq 输出的一个例子:

bamboo is ready and printing
Rank   Owner    Job  Files                              Total Size
active kelly    9    /etc/host.conf, /etc/hosts.equiv   88 bytes
2nd    kelly    10   (standard input)                   1635 bytes
3rd    mary     11   ...                                78519 bytes

  这里显示了队列中有三个任务在 bamboo 中。 第一个任务, 用户 kelly 提交的, 标识 “任务编号” 9。 每个要打印的任务都会获得一个不同的任务编号。 大多时候可以忽略这个任务编号, 但在您需要取消任务时会用到这个号码; 参考 移除任务 这节得到更多信息。

  编号为 9 的任务包含了两个文件; 在 lpr(1) 命令行中指定的多个文件被看作是一个单个的任务。 它是当前激活的任务 (注意这个词 激活 在 “Rank” 这列下面), 意思是打印机当前正在打印那个任务。 第二个任务包含了标准输入传给 lpr(1) 命令的数据。 第三个任务来自用户 mary; , 它是一个比较大的任务。 她要打印的文件的路径名太长了, 所以 lpq(1) 命令只显示了三个点。

   lpq(1) 输出的头一行也很有用: 它告诉我们打印机正在做什么 (或者至少是 LPD 认为打印机应该正在做的)。

   lpq(1) 命令同样支持 -l 选项来生成一个详细的长列表。 下面是一个 lpq -l 命令的例子:

waiting for bamboo to become ready (offline ?)
kelly: 1st               [job 009rose]
       /etc/host.conf                    73 bytes
       /etc/hosts.equiv                  15 bytes

kelly: 2nd               [job 010rose]
       (standard input)                  1635 bytes

mary: 3rd                                [job 011rose]
      /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes

9.5.3 移除任务

  如果您对一个打印任务改变了主意, 可以用 lprm(1) 将任务从队列中删除。 通常, 您甚至可以用 lprm(1) 命令来移除一个当前激活的任务, 但是任务的一部分或者所有还是可能打印出来。

  要从默认打印机中移除一个任务, 首先使用 lpq(1) 找到任务编号。 然后输入:

% lprm job-number

  要从指定打印机中删除任务, 增加 -P 选项。 下面的命令会删除编号为 10 的任务从 bamboo 这台打印机:

% lprm -P bamboo 10

   lprm(1) 命令有一些快捷方式:

lprm -

删除所有属于您的任务 (默认打印机的)。

lprm user

删除所有属于用户 user 的任务 (默认打印机的)。 超级用户可以删除用户的任务; 您只可以删除自己的任务。

lprm

命令行中不带任务编号, 任务名, 或者 - 选项, lprm(1) 会删除默认打印机上当前激活的任务, 如果它属于你。 超级用户可以删除任务激活的任务。

  使用参数 -P 和上面的快捷方式来用指定打印机替代默认打印机。 例如, 下面的命令会删除当前用户在打印机 rattan 队列中的所有任务:

% lprm -P rattan -

注意: 如果您正工作在一个网络环境中, lprm(1) 将只允许在提交任务的主机上删除任务, 甚至是同一台打印机也可以在其他主机上使用时。 下面的命令证明了这个:

% lpr -P rattan myfile
% rlogin orchid
% lpq -P rattan
Rank   Owner      Job  Files                          Total Size
active seeyan     12    ...                           49123 bytes
2nd    kelly      13   myfile                         12 bytes
% lprm -P rattan 13
rose: Permission denied
% logout
% lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued
   

9.5.4 超越纯文本:打印选项

   lpr(1) 支持许多控制文本格式的参数, 转换图形和其他格式文件, 生成多份副本, 处理任务, 等等。 这一节将描述这些选项。


9.5.4.1 格式与转换选项

  下面的 lpr(1) 参数控制任务中文件的格式。 使用这些参数, 如果任务不含纯文本, 或者您想让纯文本通过 pr(1) 格式化。

  例如, 下面的命令打印一个 DVI 文件 (来自 TeX 排版系统) 文件名为 fish-report.dvi 到打印 bamboo

% lpr -P bamboo -d fish-report.dvi

  这些选项应用到任务中的每个文件, 所以您不能混合 (说) DVI 和 ditroff 文件在同一个任务中。 替代的方法是, 用独立的任务提交这些文件, 使用不同的转换选项给不同的任务。

注意: 所有这些选项除了 -p-T 都需要转换过滤器安装给目标打印机。 例如, -d 选项需要 DVI 转换过滤器。 参考 转换过滤器 这节得到更多细节。

-c

打印 cifplot 文件。

-d

打印 DVI 文件。

-f

打印 FORTRAN 文本文件。

-g

打印 plot 数据。

-i number

缩进 number 列; 如果没有指定 number, 则缩进 8 列。 这个选项仅可以工作在某些过滤器上。

注意: 不要在选项 -i 和数字之间加入空格。

-l

打印文字数据, 包括控制字符。

-n

打印 ditroff (无设备依赖 troff) 数据。

-p

打印之前用 pr(1) 格式化纯文本。 参考 pr(1) 得到更多信息。

-T title

使用 titlepr(1) 上来替代文件名。 这个选项仅在使用 -p 选项时起作用。

-t

打印 troff 数据。

-v

打印 raster 数据。

  下面是一个例子: 这个命令打印了一个很好的 ls(1) 联机手册到默认打印机:

% zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t

   zcat(1) 命令解压缩 ls(1) 的手册并且将内容传给 troff(1) 命令, 它将格式化这些内容并且生成 GNU troff 输出给 lpr(1) , 它提交任务到 LPD 后台打印。 因为使用了 -t 选项为 lpr(1) , 后台打印将会转换 GNU troff 输出到默认打印机可以理解的格式当任务被打印时。


9.5.4.2 任务处理选项

  下面的 lpr(1) 选项告诉 LPD 对任务特殊处理:

-# copies

生成 copies 个副本给任务中的每个文件, 替代每个文件一份副本。 管理员可以禁止这个选项来减少打印机的浪费和鼓励复印机的使用。 参考 限制多份副本

这个例子打印三份副本的文件 parser.c 跟着三份副本的文件 parser.h 到默认打印机:

% lpr -#3 parser.c parser.h
-m

打印完成后发信。 使用这个选项, LPD 系统将会发送邮件到您的帐户, 当它完成了处理您的任务后。 在信中, 它将会告诉您任务是否成功完成或者出现了错误, 并且 (通常) 指明是什么错误。

-s

不要复制文件到后台打印队列目录, 要使用符号连接。

如果您正在打印一个很大的任务, 您可能需要这个选项。 它节省后台打印队列目录的空间 (您的任务可能使后台打印队列目录所在的文件系统剩余空间超出)。 它同样也节省了时间, 因为 LPD 将不会副本任务的每个字节到后台打印队列目录。

这也有一个缺点: 因为 LPD 将直接指向源文件, 您不能修改或者删除它们直到它们被打印出来。

注意: 如果您打印到一台远程打印机, LPD 将最终将文件从本地主机副本到远程主机上, 所以选项 -s 只能节省本地后台打印队列目录的空间, 而不是远程的。 虽然如此, 但它还是很有用。

-r

移除任务中的文件在它们被复制到后台打印队列目录之后, 或者在用 -s 选项打印它们之后。 谨慎使用这个选项!


9.5.4.3 报头页选项

  这些 lpr(1) 的选项调整了通常出现在任务报头页上的文本。 如果报头页被跳过了在目标打印机上, 这些选项将不会起作用。 参考 报头页 得到更多关于设置报头页的信息。

-C text

替换报头页上的主机名为 text。 主机名通常都是提交任务的主机名称。

-J text

替换报头页上的任务名为 text。 任务名通常是任务中头一个文件的名字, 或者 stdin 如果您正在打印标准输入。

-h

不打印任何报头页。

注意: 在某些地点, 这个选项可能无效, 与报头页的产生方法有关。 参考 报头页 得到详细信息。


9.5.5 管理打印机

  作为一个打印机的管理者, 您必须要安装, 设置, 并且测试它们。 使用 lpc(8) 命令, 您可以与打印机以更多的方式交流。 用 lpc(8) , 您可以

  • 启动或停止打印机

  • 启用或禁止它们的队列

  • 重新安排每个队列中的任务。

  首先, 一个关于术语的解释: 如果一个打印机被 停止 了, 它将不会打印它队列中的任何东西。 但用户还是可以提交任务, 它们会在队列中等待直到打印机被 启动 或者队列被清空。

  如果一个队列被 禁止, 没有用户 (除了 root) 可以提交任务到打印机。 一个 启用 的队列允许任务被提交。 一个打印机可以被 启动 但它的队列被禁止, 在这种情况下打印机将打印队列中的任务, 直到队列为空。

  通常, 您必须有 root 权限来使用 lpc(8) 命令。 普通用户可以使用 lpc(8) 命令来获得打印机状态并且重启一台挂了的打印机。

  这里是一个关于 lpc(8) 命令的摘要。 大部分命令带着一个 printer-name 参数来知道要对哪台打印机操作。 您可以用 all 填在 printer-name 的位置来代表所有在 /etc/printcap 文件中列出的打印机。

abort printer-name

取消当前任务并停止打印机。 用户仍然可以提交任务, 如果队列还是启用的。

clean printer-name

从打印机的后台打印队列目录移除旧的文件。 有时, 组成任务的文件没有被 LPD 正确的删除, 特别是在打印中出现错误或者管理活动比较多的时候。 这个命令查找不属于后台打印队列目录的文件并删除它们。

disable printer-name

禁止新任务入队。 如果打印机正在工作, 它将会继续打印队列中剩余的任务。 超级用户 (root) 总是可以提交任务, 甚至提交到一个禁止的队列。

这个命令在测试一台新打印机或者安装过滤器时非常有用: 禁止队列并提交以 root 提交任务。 其他用户将不能提交任务直到您完成了测试并用命令 enable 重新启用了队列的时候。

down printer-name message

打印机下线。 等于 disable 命令后跟一个 stop 命令。 message 将作为打印机状态, 当用户使用 lpq(1) 或者 lpc status 命令查看打印机队列状态的时候显示出来。

enable printer-name

为打印机开启队列。 用户可以提交任务到打印机但是在打印机启动之前不会打印出任何东西。

help command-name

打印关于 command-name 命令的帮助。 不带 command-name, 则打印可用命令的摘要。

restart printer-name

启动打印机。 普通用户可以使用这个命令, 当一些特别的环境导致 LPD 锁死时, 但他们不能启用一台使用 stop 或者 down 命令停用的打印机。 restart 命令等同于 abort 后跟着一个 start

start printer-name

启用打印机。 打印机将开始打印队列中的任务。

stop printer-name

停止打印机。 打印机将完成当前任务并且将不再打印队列中的任务任务。 尽管打印机被停用, 但用户仍然可以提交任务到一个开启的队列。

topq printer-name job-or-username

重新以 printer-name 安排队列, 通过将列出的 job 编号或者指定的所属 username 的任务放在队列的最前面。 对于这个命令, 您不可以使用 all 当作 printer-name

up printer-name

打印机上线; 相对于 down 命令。 等同于 start 后跟着一个 enable 命令。

  lpc(8) 的命令行接受上面的命令。 如果您不输入任何命令, lpc(8) 则进入一个交互模式, 在这里您可以输入命令直到输入 exitquit, 或者文件结束符。


9.6 替换标准后台打印

  如果您已经通读过了这个手册, 那么到现在您应该已经了解了关于 FreeBSD 包含的后台打印系统 LPD 的一切。 您可能发现了它很多的缺点, 它们很自然的让您提出这样的问题: “这里还有什么后台打印系统吗 (并且可以工作在 FreeBSD 上) ?”

LPRng

LPRng, 它的意思是 “LPR: 下一代”, 是一个完全重写的 PLP。 Patrick Powell 和 Justin Mason (PLP 维护的主要负责人) 合作完成了 LPRngLPRng 的主站是 http://www.lprng.org/

CUPS

CUPS, 通用 UNIX 打印系统, 提供了一个轻便的打印层给 UNIX-基础的操作系统。 它是由 Easy Software Products 开发的, 并且成为了 UNIX 供应商和用户的标准打印解决方案。

CUPS 使用 Internet 打印协议 (IPP) 作为管理打印任务和队列的基础。 行式打印机守护程序 (LPD) 服务器消息块 (SMB), 和 AppSocket (a.k.a. JetDirect) 协议的部分功能也被支持。 CUPS 增加了基于浏览网络打印机和 PostScript 打印机描述 (PPD) 的打印选项来支持 UNIX 下的真实打印。

CUPS 的主站是 http://www.cups.org/


9.7 疑难问题

  在使用 lptest(1) 进行简单的测试之后, 您可能得到了下面的结果, 而不是正确的结果:

过了一会儿, 它工作了; 或者, 它没有退出一整张纸。

打印机进行了打印, 但在这之前它呆了一段而且什么都没做。 事实上, 您可能需要按一下打印机上的 打印剩余 或者 送纸 按钮来让结果出现。

如果这是问题所在, 打印机可能在等待, 看看在打印之前, 您的任务是否还有更多的数据。 要修正这个问题, 您可以让文本过滤器发送一个送纸字符 (或者其他需要的) 到打印机。 这通常足够让打印机立即打印出内部缓存内剩余的文本。 它同样可以用来确保每个任务的结尾都占用一整张纸, 这样下一个任务才不会在前一个任务最后一张纸的中间开始。

接下来的 shell 脚本 /usr/local/libexec/if-simple 的脚本打印了一个送纸符在它发送任务到打印机之后:

#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout.  Ignores all filter arguments.
# Writes a form feed character (\f) after printing job.

/bin/cat && printf "\f" && exit 0
exit 2
它的输出产生了 “楼梯效果”。

您可能在纸上得到下面这些:

!"#$%&'()*+,-./01234
                "#$%&'()*+,-./012345
                                 #$%&'()*+,-./0123456

您也成为了 楼梯效果 的受害者, 这是由对新行的标志字符的解释不一致造成的。 UNIX 风格的操作系统使用一个单个字符: ASCII 码 10, 即换行 (LF)。 MS-DOSOS/2®, 和其他的系统使用一对儿字符, ASCII 码 10 ASCII 码 13 (回车 CR)。 许多打印机使用 MS-DOS 的习惯来代表新行。

当您在 FreeBSD 上打印时, 您的文本仅用了换行字符。 打印机, 打印机看到换行字符后, 走一行纸, 但还光标位置还是在这张纸上要打印的下一个字符处。 这就是回车的作用: 将下一个要打印的字符的位置移到纸张的左边缘。

这里是 FreeBSD 想要打印机做的:

打印机收到 CR 打印机打印 CR
打印机收到 LF 打印机打印 CR + LF

下面有几种完成这个的办法:

  • 使用打印机的配置开关或者控制面板来更改它对这些字符的解释。 查看打印机的手册来找到怎样更改。

    注意: 如果您引导您的系统到其他除了 FreeBSD 之外的操作系统, 您可能不得不 重新配置 打印机使用 这个操作系统对 CR 和 LF 字符的解释。 您可能更喜欢下面这另一种解决方案。

  • 让 FreeBSD 的串口驱动自动转换 LF 到 CR+LF。 当然, 这 仅仅 工作在串口打印机上。 要开启这个功能, 定义 ms# 变量并 设置 onlcr 模式在 /etc/printcap 文件中相应打印机处。

  • 发送一个 转义码 到打印机来让它临时对 LF 字符做不同的处理。 参考您的打印机手册来了解您的打印机支持哪些转义码。 当您找到合适的转义码, 修改文本过滤器让其先发送这个转义码, 然后再发送打印任务。

    这里是一个为懂得 Hewlett-Packard PCL 转义码的打印机编写的文本过滤器。 这个过滤器使得打印机将 LF 作为一个 LF 和一个 CR 来对待; 然后它发送任务; 最后发送一个送纸符弹出任务的最后一张纸。 它应该可以在几乎所有 Hewlett Packard 打印机上工作。

    #!/bin/sh
    #
    # hpif - Simple text input filter for lpd for HP-PCL based printers
    # Installed in /usr/local/libexec/hpif
    #
    # Simply copies stdin to stdout.  Ignores all filter arguments.
    # Tells printer to treat LF as CR+LF.  Ejects the page when done.
    
    printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
    exit 2
    

    下面是一个 /etc/printcap 文件的例子在叫做 orchid 的主机上。 它只有一台打印机连接在第一个并口上, 一台 Hewlett Packard LaserJet 3Si 名字叫做 teak。 它使用上面那段脚本作为文本过滤器:

    #
    #  /etc/printcap for host orchid
    #
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
            :if=/usr/local/libexec/hpif:
    
行行覆盖。

打印机从来不进纸换行。 所有的文本都打印在头一行文本的上面。

这个问题是 “相反” 于楼梯效果, 像上面描述的那样, 并且更少见。 一些地方, LF 这个 FreeBSD 用来结束一行的字符被作为 CR 这个将打印位置返回到纸的左边的字符对待。 而没有向下走纸一行。

使用打印机的配置开关或者控制面板来强制对 LF 和 CR 进行下面的转换:

打印机收到 打印机打印
CR CR
LF CR + LF
打印丢掉字符。

当打印时, 每行里打印机都丢掉一些字符没有打。 这个问题可能随着打印的进行越发严重, 丢掉越来越多的字符。

这个问题是由打印机跟不上计算机通过串口发送数据的速度造成的 (这个问题应该不会发生在并口打印机上)。 有两种方法能克服这个问题:

  • 如果打印机支持 XON/XOFF 流量控制, 那就让 FreeBSD 使用它, 通过加入 ixon 模式在 ms# 变量里。

  • 如果打印机支持载波流量控制, 指定 crtscts 模式在 ms# 变量里。 并且要确定连接打印机和计算机的线是支持载波流量控制的。

它打印出垃圾。

打印机打印出的东西看起来是一些随机的字符, 而不是想要打印的东西。

这通常意味着另一种串口打印机通讯参数设置不正确的错误。 复查 br 变量中设定的波特, 和 ms# 中的校验设置; 确定打印机也在使用和 /etc/printcap 文件中相同的设置。

没有反应。

如果没有反应, 问题就可能出在 FreeBSD 而不是硬件上了。 增加日志文件 (lf) 变量到 /etc/printcap 文件里出现问题的打印机的记录处。 比如, 下面是打印机 rattan 的记录, 使用了 lf 变量:

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:\
        :lf=/var/log/rattan.log

然后, 再次打印。 检查日志文件 (在我们的例子当中, 是 /var/log/rattan.log 这个文件) 来看是否有错误信息出现。 根据出现的信息, 试着来修正问题。

如果您没有指定 lf 变量, LPD 会使用 /dev/console 作为默认值。


第10章  Linux二进制兼容模式

Restructured and parts updated by Jim Mock. Originally contributed by Brian N. Handy 和 Rich Murphey.

10.1 概述

  FreeBSD 提供了与其他几种类 UNIX 操作系统, 包括 Linux, 的兼容性。 现在您可能会问, 为什么 FreeBSD 需要能够运行 Linux 的可执行文件? 答案很简单。 许多公司和开发人员只为 Linux 开发程序, 因为这是目前计算机世界 “最热门” 的技术。 这使得我们 FreeBSD 用户不得不去劝说这些公司和开发人员提供他们应用程序可以直接在 FreeBSD 上运行的版本。 问题是, 许多这样的公司并不真的知道到底提供了 FreeBSD 版本之后能带来多少用户, 因此许多仍然只开发 Linux 的版本。 这时 FreeBSD 用户能做什么呢? 答案就是使用 FreeBSD 所提供的 Linux 二进制兼容性。

  简而言之, 这种兼容性能够让 FreeBSD 用户不加修改地直接运行大约 90% 的 Linux 应用程序。 这包括类似 StarOffice, Linux 版本的 NetscapeAdobe AcrobatRealPlayer®VMwareOracleWordPerfect®DoomQuake, 等等。 此外, 也有人说, 某些情况下, 在 FreeBSD 上面运行的 Linux 程序的性能, 甚至好于直接在 Linux 上面运行。

  然而, 仍然有一些只有 Linux 才有的操作系统特性在 FreeBSD 上并不被支持。 如果 Linux 程序过分地使用只能在 i386 上使用的特性, 例如启用虚拟 8086 模式, 则也有可能无法在 FreeBSD 上运行。

  读完这章,您将了解到:

  • 如何在您的系统中启用Linux兼容模式。

  • 如何安装额外的Linux共享库。

  • 如何在FreeBSD上安装Linux应用程序。

  • 在FreeBSD上,Linux兼容模式的执行细节。

  阅读这章之前,您应该知道:

  • 如何安装第三方软件(第 4 章)。


10.2 安装

  默认情况下, 并不开启 Linux 二进制兼容支持。 启用这一功能最简单的方法是载入 linux KLD 模块 (“Kernel LoaDable object”)。 以 root 的身份, 键入下列命令即可:

# kldload linux

  如果希望 Linux 兼容支持在系统初始化过程中自动启用, 则应在 /etc/rc.conf 中增加:

linux_enable="YES"

  kldstat(8)可以用来检查KLD模块是否加载:

% kldstat
Id Refs Address    Size     Name
 1    2 0xc0100000 16bdb8   kernel
 7    1 0xc24db000 d000     linux.ko

  如果您不想或者无法将Linux KLD加载,您就需要在内核中静态链接进Linux二进制兼容模式。您必须在 您的内核配置文件里面加入options COMPAT_LINUX,然后按照第 8 章重新编译内核。


10.2.1 安装Linux运行时库

  有两种方法来安装Linux运行时库,要么使用linux_base port, 要么手动安装。


10.2.1.1 通过使用 linux_base Port 来安装

  这是最容易的安装方法,只需要像安装其他port一样从 Ports Collection来安装:

# cd /usr/ports/emulators/linux_base-fc4
# make install distclean

   您现在应当是工作在Linux兼容模式下了。一些程序可能会提示系统库的版本不正确。通常,这不是问题。

注意: 有多个版本的emulators/linux_base port,针对不同的版本的Linux。 您应该选择最接近Linux应用程序需要的那个版本来安装。


10.2.1.2 手动安装

  如果您没有安装 Ports Collection,您也可以通过手动来安装Linux运行时库。 您将需要这些程序依赖的Linux共享库,而且您需要创建一个“shadow root” 目录/compat/linux,任何要被Linux程序打开的共享库都首先在这个目录里面查找。 所以,如果一个Linux程序加载了,例如,/lib/libc.so,FreeBSD 会首先尝试打开 /compat/linux/lib/libc.so,如果不存在,它将尝试打开/lib/libc.so。 共享库应该安装在/compat/linux/lib而不是Linux ld.so报告的其他路径。

  通常,您需要寻找Linux程序依赖的共享库。 此后, 你的系统上就会有一组 Linux 共享库, 这组共享库足以用来运行新安装的 Linux 二进制程序。


10.2.1.3 如何安装额外的共享库

  如果您安装了linux_base port,但是您的 您的应用程序仍会报告丢失共享库的信息?您如何知道Linux程序需要哪个共享库? 基本上,有两种可能性(接下来的指令需要root权限):

  如果您有可以访问的Linux系统, 看看应用程序需要什么共享库, 把它们复制到您的FreeBSD系统。看下面的例子:

我们假设您通过FTP得到Linux程序Doom, 并把它放在您能访问的Linux系统上。然后您可以通过ldd linuxdoom来检查需要哪些共享库, 就像这样:

% ldd linuxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

您需要得到上面输出的右列的所有文件,并把它们复制到 /compat/linux, 第一列的名字用符号连接指向它们。这样您的FreeBSD系统上就有了这些文件:

/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

注意: 如果您已经有了一个与ldd 输出的第一列的主修订号相匹配的Linux共享库, 您就已经完成了工作, 而不需要把右列命名的文件复制到您的系统上了。 如果有一个新的版本, 那无论如何都要复制一个共享库。 您可以删掉旧的, 您只要做一个符号连接到新的版本。 所以,如果有这些库在您的系统上:

/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27

如果您根据ldd输出的发现需要一个更新版本的库:

libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29

如果结尾的数字只有一到两个版本过期,那也不要担心复制 /lib/libc.so.4.6.29, 因为程序在稍微旧一些的版本上也能很好地工作。 然而,如果喜欢的话,您可以替换libc.so,变成这样:

/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

注意: 符号链接机制 仅仅是 Linux 程序需要的。 FreeBSD 的运行时连接器会自己寻找匹配的主修订号,您不需要为此担心。


10.2.2 安装Linux ELF程序

  ELF格式的程序需要一步额外的步骤“标记”。如果您尝试运行没有标记的ELF程序, 您会得到像下面这样的错误信息:

% ./my-linux-elf-binary
ELF binary type not known
Abort

  为了帮助FreeBSD内核分辨FreeBSD ELF程序和Linux程序,要使用brandelf(1)工具:

% brandelf -t Linux my-linux-elf-binary

  GNU工具现在会自动把适当的标记信息放到ELF程序中,您以后遇到这个问题的机会越来越少。


10.2.3 配置主机名解析器

  如果DNS不能正常工作或是您得到下列信息:

resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword

  您就需要配置/compat/linux/etc/host.conf文件,此文件包含:

order hosts, bind
multi on

  order这一行指出/etc/hosts先被搜索再接着搜索DNS。 如果/compat/linux/etc/host.conf没有被安装,Linux程序会读取FreeBSD的 /etc/host.conf然后提示不兼容的FreeBSD语法。 如果您没有使用/etc/resolv.conf 文件设置DNS,应该删除bind


10.3 安装Mathematica®

Updated for Mathematica 5.X by Boris Hollas.

  这份文档介绍了如何在 FreeBSD 系统中安装 Linux 版本的 Mathematica 5.X

  Linux 版本的 MathematicaMathematica for Students 可以直接从 Wolfram 的 http://www.wolfram.com/ 订购。


10.3.1 运行 Mathematica 安装程序

  首先您应告诉 FreeBSD Mathematica 的 Linux 可执行文件需要使用 Linux ABI。 达到这一目的最简单的办法, 是将未加标志的可执行文件的默认 ELF 标记为 Linux, 输入下面的命令:

# sysctl kern.fallback_elf_brand=3

  这回让 FreeBSD 假定所有未加标志的 ELF 可执行文件, 都应使用 Linux ABI, 这样就可以直接从 CDROM 执行安装程序了。

  接下来, 需要将 MathInstaller 复制到硬盘上:

# mount /cdrom
# cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/

  在这个文件的第一行中, 将 /bin/sh 改为 /compat/linux/bin/sh。 这样就能确保安装程序是使用 Linux 版本的 sh(1) 来运行的。 接下来, 使用文本编辑器或下面的脚本, 把所有的 Linux) 替换为 FreeBSD)。 由于 Mathematica 安装程序会调用 uname -s 来检测操作系统, 这样做能够让它视 FreeBSD 为一种 类-Linux 操作系统。 现在执行 MathInstaller 就能安装 Mathematica 了。


10.3.2 修改 Mathematica 执行文件

  在安装 Mathematica 的过程中所创建的脚本, 必须首先进行适当的修改才能使用。 如果您选择将 /usr/local/bin 作为 Mathematica 可执行文件的安装路径, 则可以在这个目录中找到一些到名为 mathmathematicaMathematica, 以及 MathKernel 的文件的符号连接。 您可以使用文本编辑器, 或者下面的 shell 脚本来将这些文件中的 Linux) 改为 FreeBSD)

#!/bin/sh
cd /usr/local/bin
for i in math mathematica Mathematica MathKernel
  do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp
  sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i
  rm $i.tmp
  chmod a+x $i
done

10.3.3 获得您的Mathematica 密码

  在首次启动 Mathematica 时, 您将被问及一个密码。 如果您还未从 Wolfram 获得密码, 则安装目录中的 mathinfo 可以帮助您获得 “machine ID” (计算机 ID)。 这个计算机 ID 取决于您第一块以太网卡的 MAC 地址, 以确保您不在多台机器上运行 Mathematica

  在通过电子邮件、 电话或传真向 Wolfram 注册时, 您需要向他们提供 “machine ID”, 探后它们会给您一个与之对应的由一组数字组成的密码。


10.3.4 通过网络来运行Mathematica

  Mathematica 使用一些特殊的字体来显示字符, 与现在使用的标准字体不一样(integrals, sums, Greek letters,等等)。 X协议要求将这些字体安装在 本地。 这意味着您需要从Mathematica的CDROM里面复制这些字体并安装到本地。 这些字体一般在CDROM的/cdrom/Unix/Files/SystemFiles/Fonts里面, 或本地硬盘的/usr/local/mathematica/SystemFiles/Fonts。 实际的字体在Type1X子目录。有很多种方法来使用它们。

  第一种方法是把字体复制到一个已存在的目录/usr/X11R6/lib/X11/fonts。 这需要编辑fonts.dir文件。添加字体名字进去,并改变第一行的字体数目。 另外,您也需要在复制字体的目录下执行 mkfontdir(1)

  第二种方法是复制到 /usr/X11R6/lib/X11/fonts 目录:

# cd /usr/X11R6/lib/X11/fonts
# mkdir X
# mkdir MathType1
# cd /cdrom/Unix/Files/SystemFiles/Fonts
# cp X/* /usr/X11R6/lib/X11/fonts/X
# cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1
# cd /usr/X11R6/lib/X11/fonts/X
# mkfontdir
# cd ../MathType1
# mkfontdir

  现在,添加新的字体目录到您的字体目录:

# xset fp+ /usr/X11R6/lib/X11/fonts/X
# xset fp+ /usr/X11R6/lib/X11/fonts/MathType1
# xset fp rehash

  如果您正使用 Xorg 服务器, 则可以通过修改 xorg.conf 文件来自动加载它们。

注意: 对于 XFree86 服务器, 配置文件的名字是 XF86Config

  如果您没有一个叫/usr/X11R6/lib/X11/fonts/Type1的目录, 您可以把MathType1改成Type1


10.4 安装Maple

Contributed by Aaron Kaplan. Thanks to Robert Getschmann.

  Maple是一个类似于Mathematica的商业数学软件。 您可以从http://www.maplesoft.com/买到这个软件并注册得到一个使用许可。 要在FreeBSD上安装这个软件,请按照下面的步骤:

  1. 从软件的发行包执行INSTALL shell脚本。当进入安装程序的提示符时, 选择“RedHat” 选项。典型的安装目录是/usr/local/maple

  2. 如果您不这样做,可以从Maple Waterloo Software (http://register.maplesoft.com/) 为 Maple 订购一个授权许可。 然后把它复制到 /usr/local/maple/license/license.dat

  3. 通过运行Maple中的INSTALL_LIC安装shell脚本来 安装FLEXlm许可管理器。 指定许可服务器为您的机器名。

  4. 像下面这样Patch您的/usr/local/maple/bin/maple.system.type 文件:

       ----- snip ------------------
    *** maple.system.type.orig      Sun Jul  8 16:35:33 2001
    --- maple.system.type   Sun Jul  8 16:35:51 2001
    ***************
    *** 72,77 ****
    --- 72,78 ----
              # the IBM RS/6000 AIX case
              MAPLE_BIN="bin.IBM_RISC_UNIX"
              ;;
    +     "FreeBSD"|\
          "Linux")
              # the Linux/x86 case
            # We have two Linux implementations, one for Red Hat and
       ----- snip end of patch -----
    

    请注意"FreeBSD"|\后面没有空格。

    这个补丁指示Maple把“FreeBSD”识别为一种Linux系统。 bin/maple shell脚本调用bin/maple.system.type 脚本执行uname -a来查找操作系统名,根据操作系统名,就知道该使用哪个程序。

  5. 启动许可服务器。

    下面的脚本,安装成/usr/local/etc/rc.d/lmgrd.sh, 是很方便的启动lmgrd的方法:

       ----- snip ------------
    
    #! /bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
    PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
    export PATH
    
    LICENSE_FILE=/usr/local/maple/license/license.dat
    LOG=/var/log/lmgrd.log
    
    case "$1" in
    start)
        lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2
        echo -n " lmgrd"
        ;;
    stop)
        lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2
        ;;
    *)
        echo "Usage: `basename $0` {start|stop}" 1>&2
        exit 64
        ;;
    esac
    
    exit 0
       ----- snip ------------
    
  6. 开始测试Maple

    % cd /usr/local/maple/bin
    % ./xmaple
    

    您应该成功启动起来了。记得写信告诉Maplesoft您想要一个本地FreeBSD版本!


10.4.1 一些缺陷

  • FLEXlm许可管理器可能是一个使用比较困难的工具。 关于它的额外的文档可以在http://www.globetrotter.com/找到。

  • lmgrd对许可文件非常挑剔,有一点问题就会core dump。 正确的许可文件看起来像下面这样:

    # =======================================================
    # License File for UNIX Installations ("Pointer File")
    # =======================================================
    SERVER chillig ANY
    #USE_SERVER
    VENDOR maplelmg
    
    FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
             PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
             ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
             SN=XXXXXXXXX
    

    注意: 序列号被'X'代替了。 chillig是主机名。

    只要不修改“FEATURE”行,编辑后一般都能工作。


10.5 安装MATLAB®

Contributed by Dan Pelleg.

  这一节描述在一个 FreeBSD 上安装Linux版本的MATLAB® version 6.5。 它工作的很好,除了Java Virtual Machine例外(参考 第 10.5.3 节)。

  Linux版本的MATLAB可以从MathWorkshttp://www.mathworks.com订购。请确定您也得到了许可文件或安装说明。 等您成功后,让他们知道您想要一个本地FreeBSD版本。


10.5.1 安装MATLAB

  请按照下面的步骤安装MATLAB

  1. root身份插入安装CD并挂载上。 推荐使用安装脚本,为了启动安装脚本,键入:

    # /compat/linux/bin/sh /cdrom/install
    

    提示: 安装程序是图形的。如果您得到不能打开显示的错误,可以键入 setenv HOME ~USERUSER是您su(1)成的用户。

  2. 当问MATLAB的根目录时,键入: /compat/linux/usr/local/matlab

    提示: 为了下面的安装过程更方便,在shell提示符下键入 set MATLAB=/compat/linux/usr/local/matlab

  3. 根据获得MATLAB许可时的指示来编辑许可文件。

    提示: 您可以用您喜欢的编辑器提前准备这个文件, 并在安装程序要您编辑它之前复制到 $MATLAB/license.dat

  4. 完成安装过程

  到这里,您的MATLAB安装已经完成了。 接下来的步骤是让它和您的FreeBSD 系统“胶合”在一起。


10.5.2 许可管理器的启动

  1. 为许可管理器建立符号链接的脚本:

    # ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW
    # ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW
    
  2. 建立启动文件/usr/local/etc/rc.d/flexlm.sh。 下面的例子是一个$MATLAB/etc/rc.lm.glnx86的修改版本。 变化的是文件的位置,和模拟Linux下许可管理器的启动。

    #!/bin/sh
    case "$1" in
      start)
            if [ -f /usr/local/etc/lmboot_TMW ]; then
                  /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u username && echo 'MATLAB_lmgrd'
            fi
            ;;
      stop)
        if [ -f /usr/local/etc/lmdown_TMW ]; then
                /compat/linux/bin/sh /usr/local/etc/lmdown_TMW  > /dev/null 2>&1
        fi
            ;;
      *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
    esac
    
    exit 0
    

    重要: 必须使脚本文件可执行:

    # chmod +x /usr/local/etc/rc.d/flexlm.sh
    

    您也必须替换username为机器上的一个用户(不要是root)。

  3. 用命令启动许可管理器:

    # /usr/local/etc/rc.d/flexlm.sh start
    

10.5.3 链接Java运行时环境

  改变Java运行时环境(JRE),链接到一个可以工作的版本:

# cd $MATLAB/sys/java/jre/glnx86/
# unlink jre; ln -s ./jre1.1.8 ./jre

10.5.4 创建MATLAB启动脚本

  1. 把下面的启动脚本放到/usr/local/bin/matlab

    #!/bin/sh
    /compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"
    
  2. 然后输入命令chmod +x /usr/local/bin/matlab

提示: 依赖于您的emulators/linux_base版本, 您在运行这个脚本时可能会出错,为了避免错误,编辑/compat/linux/usr/local/matlab/bin/matlab, 把这行:

if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then

(在13.0.1版本是在第410行)改成:

if test -L $newbase; then

10.5.5 Creating a MATLAB Shutdown Script

  The following is needed to solve a problem with MATLAB not exiting correctly.

  1. Create a file $MATLAB/toolbox/local/finish.m, and in it put the single line:

    ! $MATLAB/bin/finish.sh
    

    注意: The $MATLAB is literal.

    提示: In the same directory, you will find the files finishsav.m and finishdlg.m, which let you save your workspace before quitting. If you use either of them, insert the line above immediately after the save command.

  2. Create a file $MATLAB/bin/finish.sh, which will contain the following:

    #!/usr/compat/linux/bin/sh
    (sleep 5; killall -1 matlab_helper) &
    exit 0
    
  3. Make the file executable:

    # chmod +x $MATLAB/bin/finish.sh
    

10.5.6 使用MATLAB

  现在您已经可以键入 matlab 并开始使用它了。


10.6 安装Oracle®

Contributed by Marcel Moolenaar.

10.6.1 前言

  这节描述在FreeBSD上安装Linux版的Oracle 8.0.5Oracle 8.0.5.1 Enterprise Edition


10.6.2 安装Linux环境

  确信您已经从 Ports Collection 安装了 emulators/linux_basedevel/linux_devtools。 如果在使用这些 port 时遇到困难, 您可能就不得不从 package, 或使用较早版本的 Ports Collection 来安装。

  如果要运行智能代理, 您还需要安装 Red Hat Tcl 软件包: tcl-8.0.3-20.i386.rpm。 用于安装官方的 RPM (archivers/rpm) 软件包的命令是:

# rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package

  的安装通常不会出错。


10.6.3 创建Oracle环境

  安装Oracle之前,您需要设置正确的环境。 这节只描述了在FreeBSD下安装Linux版本Oracle需要特别注意的地方。 不像在Oracle安装指南中所描述的那样。


10.6.3.1 调整内核

  正如Oracle安装指南描述的那样,您需要设置共享内存的最大值。 不要在FreeBSD下使用SHMMAXSHMMAX 只是用来计算SHMMAXPGSPGSIZE的。 因此要使用SHMMAXPGS。所有其他要使用的选项可以参考指南,例如:

options SHMMAXPGS=10000
options SHMMNI=100
options SHMSEG=10
options SEMMNS=200
options SEMMNI=70
options SEMMSL=61

  设置这些选项来适应 Oracle的使用。

  当然,确信您的内核配置文件中有下面这些选项:

options SYSVSHM #SysV shared memory
options SYSVSEM #SysV semaphores
options SYSVMSG #SysV interprocess communication

10.6.3.2 Oracle帐号

  创建一个oracle帐号,正如您创建其他帐号一样。 oracle 帐号特殊的地方是您需要给它一个Linux shell。 添加/compat/linux/bin/bash/etc/shells, 然后设置oracle帐号的shell为/compat/linux/bin/bash


10.6.3.3 环境

  除了普通的Oracle变量外, 比如ORACLE_HOMEORACLE_SID,您还必须设置下面的环境变量:

变量
LD_LIBRARY_PATH $ORACLE_HOME/lib
CLASSPATH $ORACLE_HOME/jdbc/lib/classes111.zip
PATH /compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin

  建议在.profile里面设置所有的环境变量。一个完整的例子是:

ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORACLE_SID=ORCL; export ORACLE_SID
ORACLE_TERM=386x; export ORACLE_TERM
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH
PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
export PATH

10.6.4 安装Oracle

  由于 Linux 模拟器的一处小小的差异, 您必须在 /var/tmp 中创建一个名为 .oracle 的目录才能够启动安装程序。 需要把它设置为属于 oracle 用户。 接下来, 您就可以毫无问题地安装 Oracle 了。 如果您遇到问题, 请首先检查 Oracle 软件包和/或配置文件!安装完 Oracle 之后, 使用下面两节中所说的补丁。

  一个比较常见的问题是 TCP 协议适配器安装不正确。 其结果是将无法进行任何的 TCP 侦听。 下面的操作将帮助解决此问题:

# cd $ORACLE_HOME/network/lib
# make -f ins_network.mk ntcontab.o
# cd $ORACLE_HOME/lib
# ar r libnetwork.a ntcontab.o
# cd $ORACLE_HOME/network/lib
# make -f ins_network.mk install

  不要忘记了再运行一下root.sh


10.6.4.1 修补root.sh

  从CD安装Oracle时,一些工作需要在root下执行, 这些工作都被记录在一个叫root.sh的脚本里面。这个脚本被写在orainst目录。 为了使用root.sh来正确定位chown或在Linux本地shell下执行脚本, 应该对它进行修补。

*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
--- orainst/root.sh Mon Dec 28 15:58:53 1998
***************
*** 31,37 ****
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/bin/chown
#
# Define variables to be used in this script
--- 31,37 ----
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/usr/sbin/chown
#
# Define variables to be used in this script

  当您不从CD安装Oracle时, 您可以从源代码来修补root.sh。 它叫做rthd.sh,定位在源代码树的orainst目录。


10.6.4.2 修补genclntsh

  genclntsh脚本用来创建一个简单的共享客户端库。在建立demos时被使用。 完成补丁后就注释掉了下面的PATH变量:

*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
--- bin/genclntsh Tue Dec 22 15:36:49 1998
***************
*** 32,38 ****
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst
--- 32,38 ----
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst

10.6.5 运行Oracle

  如果您已经按上面的指示去操作,您应该可以像在Linux下运行Oracle了。


10.7 安装SAP® R/3®

Contributed by Holger Kipp. Original version converted to SGML by Valentino Vaschetto.

  在FreeBSD上安装的SAP系统不会被SAP 支持团队── 所支持——他们只支持某些特定的平台。


10.7.1 前言

  这篇文章描述了在FreeBSD系统上安装一个带有Oracle Database for Linux的SAP R/3 System,包括 FreeBSD的安装和Oracle的安装。 下面将描述两个不同的配置:

  • 在FreeBSD 4.3-STABLE上安装带有Oracle 8.0.5SAP R/3 4.6B (IDES)

  • 在FreeBSD 4.5-STABLE上安装带有Oracle 8.1.7SAP R/3 4.6C

  虽然这篇文章深入地描述了许多重要的安装步骤,但它不能取代OracleSAP R/3的安装指南。

  请参考SAP R/3 Linux edition自带的文档和 Oracle的特殊问题。


10.7.2 软件

  下面的CD-ROMs被用作SAP的安装:


10.7.2.1 SAP R/3 4.6B, Oracle 8.0.5

名称 号码 描述
KERNEL 51009113 SAP Kernel Oracle / Installation / AIX, Linux, Solaris
RDBMS 51007558 Oracle / RDBMS 8.0.5.X / Linux
EXPORT1 51010208 IDES / DB-Export / Disc 1 of 6
EXPORT2 51010209 IDES / DB-Export / Disc 2 of 6
EXPORT3 51010210 IDES / DB-Export / Disc 3 of 6
EXPORT4 51010211 IDES / DB-Export / Disc 4 of 6
EXPORT5 51010212 IDES / DB-Export / Disc 5 of 6
EXPORT6 51010213 IDES / DB-Export / Disc 6 of 6

  此外,我们使用Oracle 8 Server (Linux版本的8.0.5预览版,Linux内核是2.0.33)和 FreeBSD 4.3-STABLE。


10.7.2.2 SAP R/3 4.6C SR2, Oracle 8.1.7

名称 号码 描述
KERNEL 51014004 SAP Kernel Oracle / SAP Kernel Version 4.6D / DEC, Linux
RDBMS 51012930 Oracle 8.1.7/ RDBMS / Linux
EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 1 of 4
EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 2 of 4
EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 3 of 4
EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 4 of 4
LANG1 51013954 Release 4.6C SR2 / Language / DE, EN, FR / Disc 1 of 3

  依赖于您要安装的语言,可能需要额外的语言CDs。 这儿我们只使用DE和EN,所以只需要第一张语言CD。 还要注意的是所有EXPORT CDs的号码是一样的。 其他3张语言CDs的号码也一样(这和4.6B IDES release CD的号码不同)。


10.7.3 SAP Notes

  安装使用SAP R/3之前,请先看看下面的注释:


10.7.3.1 SAP R/3 4.6B, Oracle 8.0.5

号码 标题
0171356 SAP Software on Linux: Essential Comments
0201147 INST: 4.6C R/3 Inst. on UNIX - Oracle
0373203 Update / Migration Oracle 8.0.5 --> 8.0.6/8.1.6 LINUX
0072984 Release of Digital UNIX 4.0B for Oracle
0130581 R3SETUP step DIPGNTAB terminates
0144978 Your system has not been installed correctly
0162266 Questions and tips for R3SETUP on Windows NT / W2K

10.7.3.2 SAP R/3 4.6C, Oracle 8.1.7

号码 标题
0015023 Initializing table TCPDB (RSXP0004) (EBCDIC)
0045619 R/3 with several languages or typefaces
0171356 SAP Software on Linux: Essential Comments
0195603 RedHat 6.1 Enterprise version: Known problems
0212876 The new archiving tool SAPCAR
0300900 Linux: Released DELL Hardware
0377187 RedHat 6.2: important remarks
0387074 INST: R/3 4.6C SR2 Installation on UNIX
0387077 INST: R/3 4.6C SR2 Inst. on UNIX - Oracle
0387078 SAP Software on UNIX: OS Dependencies 4.6C SR2

10.7.4 硬件要求

  下面的设备配置对SAP R/3 System来说已经足够了。如果 用于生产用途,就需要更强的配置:

组件 4.6B 4.6C
处理器 2 x 800MHz Pentium III 2 x 800MHz Pentium III
内存 1GB ECC 2GB ECC
Hard Disk Space 50-60GB (IDES) 50-60GB (IDES)

  用于生产使用,就需要使用带大缓存的Xeon处理器,和高速大容量磁盘(SCSI, RAID hardware controller),以及USV 和ECC-RAM内存。 配置IDES System前需要大量的硬盘空间,因为安装时将创建27 GB的数据库文件。 这些空间用于系统和数据的初始化也是足够的。


10.7.4.1 SAP R/3 4.6B, Oracle 8.0.5

  对于这个安装,我的硬件配置如下:带2个800 MHz Pentium III处理器的主板, Adaptec® 29160 Ultra160 SCSI适配器(能够访问40/80 GB DLT磁带机和CDROM), Mylex® AcceleRAID™ (2个通道, firmware 6.00-1-00 with 32 MB RAM)。 Mylex RAID controller被挂上2个17 GB(mirrored)硬盘和4个36 GB硬盘(RAID level 5)。


10.7.4.2 SAP R/3 4.6C, Oracle 8.1.7

  对于这个安装,配置是DellPowerEdge™ 2500,带2个1000 MHz Pentium III处理器的 主板(256 kB Cache), 2 GB PC133 ECC SDRAM, PERC/3 DC PCI RAID Controller with 128 MB,和一个EIDE DVD-ROM驱动器。RAID controller被挂上2个18 GB硬盘(mirrored) 和4个36 GB硬盘(RAID level 5)。


10.7.5 安装FreeBSD

  首先需要安装 FreeBSD。 有很多方法来完成这个工作。 要了解进一步的情况请参考 第 2.13 节


10.7.5.1 磁盘划分

  为了简单,对SAP R/3 46BSAP R/3 46C SR2的安装使用相同的磁盘划分。只是设备名换了,因为是安装在不同的硬件上 (/dev/da/dev/amr, 所以如果是使用AMI MegaRAID®,我们能看到 /dev/amr0s1a 代替了 /dev/da0s1a):

文件系统 尺寸(1k-blocks) 尺寸(GB) 挂载点
/dev/da0s1a 1.016.303 1 /
/dev/da0s1b   6 swap
/dev/da0s1e 2.032.623 2 /var
/dev/da0s1f 8.205.339 8 /usr
/dev/da1s1e 45.734.361 45 /compat/linux/oracle
/dev/da1s1f 2.032.623 2 /compat/linux/sapmnt
/dev/da1s1g 2.032.623 2 /compat/linux/usr/sap

  预先用Mylex 或PERC/3 RAID 软件配置和初始化这两个逻辑驱动器。 改变BIOS的引导顺序来启动软件。

  请注意这里的磁盘划分和SAP推荐的是不一样的,SAP建议把 Oracle子目录(及其他子目录)分离开来, 我决定只简单的创建几个子目录。


10.7.5.2 make world和建立新内核

  下载最新的-STABLE源代码,配置完内核配置文件后重建系统和新内核。 这儿当然要包括 SAP R/3Oracle需要的内核参数


10.7.6 安装Linux环境

10.7.6.1 安装Linux基本系统

  首先linux_base port需要安装(以root身份):

# cd /usr/ports/emulators/linux_base
# make install distclean

10.7.6.2 安装Linux开发环境

  如果您想根据第 10.6 节在FreeBSD上安装 Oracle

# cd /usr/ports/devel/linux_devtools
# make install distclean

  Linux开发环境只是安装给SAP R/3 46B IDES的,如果Oracle DB不是在这个 FreeBSD系统上重新链接,它就不需要了。


10.7.6.3 安装必需的RPMs

  为了启动R3SETUP程序, PAM支持是必需的。 第一次安装SAP到FreeBSD 4.3-STABLE时我们先安装了 PAM的所有依赖包再安装PAM包,它可以工作。对于SAP R/3 4.6C SR2我们 直接安装PAM RPM也可以工作,所以依赖包不是必需的:

# rpm -i --ignoreos --nodeps --root /compat/linux --dbpath /var/lib/rpm \
pam-0.68-7.i386.rpm

  要让Oracle 8.0.5运行智能代理, 我们需要安装RedHat Tcl包tcl-8.0.5-30.i386.rpm (否则重新链接Oracle不能工作)。 重新链接Oracle时还有其他要注意的地方, 但那是Oracle Linux的问题,不是FreeBSD的问题。


10.7.6.4 其它一些注意的地方

  添加 linprocfs/etc/fstab 是个好主意。 要了解进一步的细节, 请参考 linprocfs(5) 联机手册。 另一个是设置 kern.fallback_elf_brand=3, 这可以通过 /etc/sysctl.conf 文件来完成。


10.7.7 创建SAP R/3环境

10.7.7.1 创建必需的文件系统和挂载点

  对简单的安装,创建下面的文件系统就够了:

mount point size in GB
/compat/linux/oracle 45 GB
/compat/linux/sapmnt 2 GB
/compat/linux/usr/sap 2 GB

  创建一些链接也是必要的,否则SAP安装程序在检查创建的链接时 会报错:

# ln -s /compat/linux/oracle /oracle
# ln -s /compat/linux/sapmnt /sapmnt
# ln -s /compat/linux/usr/sap /usr/sap

  安装时可能出现的错误(对于PRD系统和SAP R/3 4.6C SR2 的安装):

INFO 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:200
    Checking existence of symbolic link /usr/sap/PRD/SYS/exe/dbg to
    /sapmnt/PRD/exe. Creating if it does not exist...

WARNING 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:400
    Link /usr/sap/PRD/SYS/exe/dbg exists but it points to file
    /compat/linux/sapmnt/PRD/exe instead of /sapmnt/PRD/exe. The
    program cannot go on as long as this link exists at this
    location. Move the link to another location.

ERROR 2002-03-19 16:45:36 R3LINKS_IND_IND Ins_SetupLinks:0
    can not setup link '/usr/sap/PRD/SYS/exe/dbg' with content
    '/sapmnt/PRD/exe'

10.7.7.2 创建用户和目录

  SAP R/3需要两个用户和3个组。 用户名依赖于包含3个字母的SAP系统ID(SID)。一些SIDs 被SAP保留(例如SAPNIX)。 完成的列表参考SAP文档。对于IDES的安装,我们使用IDS, 对于4.6C SR2安装,使用PRD。 这样我们定义了下面的几个组:

组ID 组名 描述
100 dba Data Base Administrator
101 sapsys SAP System
102 oper Data Base Operator

  对于默认的Oracle安装,只有dba组被使用。 和oper组一样,我们也可以使用dba组 (更详细的信息参考OracleSAP文档)。

  我们也需要下面的用户

用户ID 用户名 普通名称 附加组 描述
1000 idsadm/prdadm sidadm sapsys oper SAP Administrator
1002 oraids/oraprd orasid dba oper Oracle Administrator

  使用adduser(8)添加用户要求“SAP Administrator”有下面的记录 (请注意shell和home目录):

Name: sidadm
Password: ******
Fullname: SAP Administrator SID
Uid: 1000
Gid: 101 (sapsys)
Class:
Groups: sapsys dba
HOME: /home/sidadm
Shell: bash  (/compat/linux/bin/bash)

  对于“Oracle Administrator”:

Name: orasid
Password: ******
Fullname: Oracle Administrator SID
Uid: 1002
Gid: 100 (dba)
Class:
Groups: dba
HOME: /oracle/sid
Shell: bash  (/compat/linux/bin/bash)

  在您使用组dbaoper的情况下您也应该包括 oper


10.7.7.3 创建目录

  这些目录通常建立在不同的文件系统上。这完全依赖于您的需求。 我们选择把它们建立在同一个目录:

  首先我们将设置一些目录的所有者和权限(以root身份设置):

# chmod 775 /oracle
# chmod 777 /sapmnt
# chown root:dba /oracle
# chown sidadm:sapsys /compat/linux/usr/sap
# chmod 775 /compat/linux/usr/sap

  然后我们以orasid身份创建目录, 这些目录将成为/oracle/SID的子目录:

# su - orasid
# cd /oracle/SID
# mkdir mirrlogA mirrlogB origlogA origlogB
# mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6
# mkdir saparch sapreorg
# exit

  对于Oracle 8.1.7的安装,需要一些额外的目录:

# su - orasid
# cd /oracle
# mkdir 805_32
# mkdir client stage
# mkdir client/80x_32
# mkdir stage/817_32
# cd /oracle/SID
# mkdir 817_32

注意: 目录client/80x_32必须是这个名字,不要用其他数字或字母来替换x

  第三步我们要以sidadm身份创建目录:

# su - sidadm
# cd /usr/sap
# mkdir SID
# mkdir trans
# exit

10.7.7.4 /etc/services中的条目

  SAP R/3/etc/services里面需要一些条目, 这些不会在安装过程中被正确设置,请添加下面的条目:

sapdp00    3200/tcp # SAP Dispatcher.      3200 + Instance-Number
sapgw00  3300/tcp # SAP Gateway.         3300 + Instance-Number
sapsp00  3400/tcp #                      3400 + Instance-Number
sapms00  3500/tcp #                      3500 + Instance-Number
sapmsSID 3600/tcp # SAP Message Server.  3600 + Instance-Number
sapgw00s   4800/tcp # SAP Secure Gateway   4800 + Instance-Number

10.7.7.5 必要的本地化

  SAP至少要求两个本地化设置,它不是RedHat的默认安装。 SAP提供从他们的FTP服务器下载必需的RPMs(只有您是OSS的客户才能访问)。 看注解0171356查找您需要的RPMs列表。

  也可以只创建适当的链接(例如从de_DEen_US), 但是我们不推荐在生产系统上这样做(尽管它让IDES system工作的没有一点问题)。 下面的本地化设置是必需的:

de_DE.ISO-8859-1
en_US.ISO-8859-1

  像这样创建链接

# cd /compat/linux/usr/share/locale
# ln -s de_DE de_DE.ISO-8859-1
# ln -s en_US en_US.ISO-8859-1

  如果他们不出现,在安装时可能会有问题。如果忽略这些问题(通过设置CENTRDB.R3S文件 里面的STATUSOK),不费一番周折, 您就别想登录进SAP系统。


10.7.7.6 内核调整

  SAP R/3 需要许多资源。我因此添加了下面的参数在我的内核配置文件中:

# Set these for memory pigs (SAP and Oracle):
options MAXDSIZ="(1024*1024*1024)"
options DFLDSIZ="(1024*1024*1024)"
# System V options needed.
options SYSVSHM #SYSV-style shared memory
options SHMMAXPGS=262144 #max amount of shared mem. pages
#options SHMMAXPGS=393216 #use this for the 46C inst.parameters
options SHMMNI=256 #max number of shared memory ident if.
options SHMSEG=100 #max shared mem.segs per process
options SYSVMSG #SYSV-style message queues
options MSGSEG=32767 #max num. of mes.segments in system
options MSGSSZ=32 #size of msg-seg. MUST be power of 2
options MSGMNB=65535 #max char. per message queue
options MSGTQL=2046 #max amount of msgs in system
options SYSVSEM #SYSV-style semaphores
options SEMMNU=256 #number of semaphore UNDO structures
options SEMMNS=1024 #number of semaphores in system
options SEMMNI=520 #number of semaphore identifiers
options SEMUME=100       #number of UNDO keys

  这篇文档中指定的最小值是来自SAP。 没有针对Linux的描述, 看看HP-UX的相关介绍了解更多信息。 安装4.6C SR2需要更多的内存, 共享内存比 SAPOracle 需要的还多, 所以尽量为共享内存选一个大值。

注意:i386 上 的 FreeBSD 默认配置中, 应将 MAXDSIZDFLDSIZ 设置为 1 GB。否则, 会出现类似 “ORA-27102: out of memory”和 “Linux Error: 12: Cannot allocate memory” 这样的奇怪的错误。


10.7.8 安装SAP R/3

10.7.8.1 准备SAP CDROMs

  在安装过程中,有许多 CDROM 要被挂上和卸下。建议您有多个CDROM驱动器, 您可以把它们都挂上。我决定复制 CDROM 的内容到相应的目录:

/oracle/SID/sapreorg/cd-name

  对于4.6B/IDES的安装,cd-nameKERNELRDBMSEXPORT1EXPORT2EXPORT3, EXPORT4, EXPORT5EXPORT6中的一个,对于4.6C SR2的安装,是 KERNELRDBMSDISK1DISK2DISK3DISK4LANG中的一个。 所有挂载上的CDs里面的文件名都应该是大写, 否则要用-g选项来挂载。所以使用下面的命令:

# mount_cd9660 -g /dev/cd0a /mnt
# cp -R /mnt/* /oracle/SID/sapreorg/cd-name
# umount /mnt

10.7.8.2 运行安装脚本

  首先您需要准备一个install目录:

# cd /oracle/SID/sapreorg
# mkdir install
# cd install

  然后运行安装脚本,他会复制所有相关的文件到install目录:

# /oracle/SID/sapreorg/KERNEL/UNIX/INSTTOOL.SH

  由于这是一个完全定制化的SAP R/3演示系统的IDES安装(4.6B), 我们有6个而不仅仅是3个EXPORT CDs。 基于这点,安装模板CENTRDB.R3S是用来安装一个标准的中央环境 (R/3和数据库),而不是IDES中央环境, 所以从EXPORT1目录复制相应的CENTRDB.R3S, 否则R3SETUP只要求3个EXPORT CDs。

  新的SAP 4.6C SR2发行版带有4张EXPORT CDs。 控制安装步骤的参数文件是CENTRAL.R3S。 和早期发行版不同,它没有分开的中央环境的安装模板。

  安装完后,使用hostname命令得到SAP需要的主机名, 不需要完整的域名。 所以为orasidsidadm 直接设置主机名,或设置别名alias hostname='hostname -s'。 可以在.profile.login里面为这两个用户设置。


10.7.8.3 启动R3SETUP 4.6B

  确定LD_LIBRARY_PATH设置正确:

# export LD_LIBRARY_PATH=/oracle/IDS/lib:/sapmnt/IDS/exe:/oracle/805_32/lib

  从安装目录以root身份启动R3SETUP

# cd /oracle/IDS/sapreorg/install
# ./R3SETUP -f CENTRDB.R3S

  这个脚本会问一些问题(括号里面是缺省值,后面是实际输入):

问题 缺省值 输入
Enter SAP System ID [C11] IDSEnter
Enter SAP Instance Number [00] Enter
Enter SAPMOUNT Directory [/sapmnt] Enter
Enter name of SAP central host [troubadix.domain.de] Enter
Enter name of SAP db host [troubadix] Enter
Select character set [1] (WE8DEC) Enter
Enter Oracle server version (1) Oracle 8.0.5, (2) Oracle 8.0.6, (3) Oracle 8.1.5, (4) Oracle 8.1.6   1Enter
Extract Oracle Client archive [1] (Yes, extract) Enter
Enter path to KERNEL CD [/sapcd] /oracle/IDS/sapreorg/KERNEL
Enter path to RDBMS CD [/sapcd] /oracle/IDS/sapreorg/RDBMS
Enter path to EXPORT1 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT1
Directory to copy EXPORT1 CD [/oracle/IDS/sapreorg/CD4_DIR] Enter
Enter path to EXPORT2 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT2
Directory to copy EXPORT2 CD [/oracle/IDS/sapreorg/CD5_DIR] Enter
Enter path to EXPORT3 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT3
Directory to copy EXPORT3 CD [/oracle/IDS/sapreorg/CD6_DIR] Enter
Enter path to EXPORT4 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT4
Directory to copy EXPORT4 CD [/oracle/IDS/sapreorg/CD7_DIR] Enter
Enter path to EXPORT5 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT5
Directory to copy EXPORT5 CD [/oracle/IDS/sapreorg/CD8_DIR] Enter
Enter path to EXPORT6 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT6
Directory to copy EXPORT6 CD [/oracle/IDS/sapreorg/CD9_DIR] Enter
Enter amount of RAM for SAP + DB   850Enter (in Megabytes)
Service Entry Message Server [3600] Enter
Enter Group-ID of sapsys [101] Enter
Enter Group-ID of oper [102] Enter
Enter Group-ID of dba [100] Enter
Enter User-ID of sidadm [1000] Enter
Enter User-ID of orasid [1002] Enter
Number of parallel procs [2] Enter

  如果没有把CD复制到不同的位置,那么SAP安装程序就不能 找到需要的CD(通过CD上的LABEL.ASC来辨别), 它会要求您挂上CD,或键入加载路径。

  CENTRDB.R3S不可能是自由出错的, 它再次请求EXPORT4 CD,但是正确的值是6_LOCATI ON,然后7_LOCATION 等,所以您可以键入正确的值。

  处理下面提到的问题,一样东西都要直接通过Oracle数据库软件安装的地方。


10.7.8.4 Start R3SETUP 4.6C SR2

  确定LD_LIBRARY_PATH设置正确。 这和带Oracle 8.0.5的4.6B的安装是不同的:

# export LD_LIBRARY_PATH=/sapmnt/PRD/exe:/oracle/PRD/817_32/lib

  以root身份从安装目录启动R3SETUP

# cd /oracle/PRD/sapreorg/install
# ./R3SETUP -f CENTRAL.R3S

  这个脚本会问一些问题(括号里面是缺省值,后面是实际输入):

问题 缺省值 输入
Enter SAP System ID [C11] PRDEnter
Enter SAP Instance Number [00] Enter
Enter SAPMOUNT Directory [/sapmnt] Enter
Enter name of SAP central host [majestix] Enter
Enter Database System ID [PRD] PRDEnter
Enter name of SAP db host [majestix] Enter
Select character set [1] (WE8DEC) Enter
Enter Oracle server version (2) Oracle 8.1.7   2Enter
Extract Oracle Client archive [1] (Yes, extract) Enter
Enter path to KERNEL CD [/sapcd] /oracle/PRD/sapreorg/KERNEL
Enter amount of RAM for SAP + DB 2044 1800Enter (in Megabytes)
Service Entry Message Server [3600] Enter
Enter Group-ID of sapsys [100] Enter
Enter Group-ID of oper [101] Enter
Enter Group-ID of dba [102] Enter
Enter User-ID of oraprd [1002] Enter
Enter User-ID of prdadm [1000] Enter
LDAP support   3Enter (no support)
Installation step completed [1] (continue) Enter
Choose installation service [1] (DB inst,file) Enter

  到目前为止, 安装阶段只在创建用户时给出了一个错误OSUSERDBSID_IND_ORA(创建 用户orasid)和 OSUSERSIDADM_IND_ORA(创建用户sidadm)。

  处理下面提到的问题,一样东西都要直接通过Oracle数据库软件安装的地方。


10.7.9 安装Oracle 8.0.5

  请看相应的SAP注释和 Oracle的关于Linux的Readme 以及Oracle DB可能出现的问题。不是所有的问题都和不兼容库有关。

  关于Oracle更多的安装信息,请参考安装Oracle


10.7.9.1 用orainst安装Oracle 8.0.5

  如果Oracle 8.0.5要被使用,一些其他的库需要被成功地重新链接, 因为Oracle 8.0.5是与一个老的glibc连接的(Redhat 6.0), 但RedHat 6.1已经使用了一个新的glibc。所以您必须安装下面额外的软件包来保证链接正常:

  • compat-libs-5.2-2.i386.rpm

  • compat-glibc-5.2-2.0.7.2.i386.rpm

  • compat-egcs-5.2-1.0.3a.1.i386.rpm

  • compat-egcs-c++-5.2-1.0.3a.1.i386.rpm

  • compat-binutils-5.2-2.9.1.0.23.1.i386.rpm

  更多的信息,看相应的SAP注释和OracleReadme。 如果这不是选项,您可以使用最初的程序,或使用与最初的Redhat系统重链接的程序。

  要编译智能代理,必须安装RedHat Tcl包。如果您不能得到 tcl-8.0.3-20.i386.rpm,一个更新的 tcl-8.0.5-30.i386.rpm也可以用。

  除了重新链接,安装是直截了当的:

# su - oraids
# export TERM=xterm
# export ORACLE_TERM=xterm
# export ORACLE_HOME=/oracle/IDS
# cd $ORACLE_HOME/orainst_sap
# ./orainst

  用Enter来确认所有的屏幕直到安装完成,除了您必须取消 Oracle On-Line Text Viewer选项,因为当前Linux下不可用。 Oracle会要求用i386-glibc20-linux-gcc重新链接来 代替gccegcs或者i386-redhat-linux-gcc

  由于时间紧迫,我决定使用Oracle 8.0.5 PreProduction版本。


10.7.9.2 安装Oracle 8.0.5 Pre-production Release for Linux (Kernel 2.0.33)

  个安装很容易。挂上CD,启动安装程序。它就会要求Oraclehome目录的定位, 然后复制那里所有的程序。我不删除先前安装的RDBMS。

  然后,Oracle数据库就可以毫无问题地运行了。


10.7.10 安装Oracle 8.1.7 Linux压缩包

  把 oracle81732.tgz 复制到您要安装的目录, 然后解压到/oracle/SID/817_32/


10.7.11 继续SAP R/3安装

  首先检查用户idsamd (sidadm)和 oraids(orasid)的环境变量。 他们现在都有使用主机名的.profile.login.cshrc文件。在这个例子中,系统的主机名是没有限制的名称, 您必须在所有三个文件中改变hostname为hostname -s。


10.7.11.1 加载数据库

  然后,可以重新启动或继续R3SETUPR3SETUP就使用R3load 创建表空间加载数据(对46B IDES,从EXPORT1到EXPORT6,对46C从DISK1到DISK4)。

  数据加载完后(可能需要一些时间),需要创建一些口令。对于测试安装,可以使用缺省口令:

问题 输入
Enter Password for sapr3 sapEnter
Confirum Password for sapr3 sapEnter
Enter Password for sys change_on_installEnter
Confirm Password for sys change_on_installEnter
Enter Password for system managerEnter
Confirm Password for system managerEnter

  到目前为止,我们只在安装4.6B的过程中dipgntab出现了几个问题。


10.7.11.2 监听

  像下面这样用orasid用户启动 Oracle

% umask 0; lsnrctl start

  另外您可能得到ORA-12546错误,因为sockets没有正确的权限。 看SAP注释072984。


10.7.11.3 更新MNLS表

  如果您打算倒入non-Latin-1 languages到SAP系统, 您必须更新表的多语言支持。这在SAP OSS注释15023和45619有描述。否则, 您可以在安装SAP的时候忽略这个问题。

注意: 如果您不需要MNLS,还是需要检查表TCPDB和初始化工作是否做了。 更多信息参考SAP注释0015023和0045619。


10.7.12 快速安装步骤

10.7.12.1 需要SAP R/3许可密钥

  您不得不要SAP R/3许可密钥。这是必需的, 因为临时许可只能用4个星期。 首先得到硬件的密匙。以用idsadm登入, 然后调用saplicense

# /sapmnt/IDS/exe/saplicense -get

  不带参数调用saplicense会给出一系列选项。 要安装上面的许可密钥,可以这样:

# /sapmnt/IDS/exe/saplicense -install

  您要输入下面的值:

SAP SYSTEM ID   = SID, 3 chars
CUSTOMER KEY    = hardware key, 11 chars
INSTALLATION NO = installation, 10 digits
EXPIRATION DATE = yyyymmdd, usually "99991231"
LICENSE KEY     = license key, 24 chars

10.7.12.2 创建用户

  在客户机000中创建一个用户(有些工作需用客户机000来完成,但与用户sap*ddic有些不同)。 作为一个用户名,我通常选择wartung (或英语中的service)。 配置文件需要sap_newsap_all。对于额外的安全的默认用户口令应当被改变(这包括用户sap*ddic)。


10.7.12.3 配置传送系统,配置,操作模式等

  在客户端000,用户不同于ddicsap*,做下面的工作:

任务 处理
Configure Transport System, e.g. as Stand-Alone Transport Domain Entity STMS
Create / Edit Profile for System RZ10
Maintain Operation Modes and Instances RZ04

  些和所有其他的快速安装步骤在SAP安装指南里面有描述。


10.7.12.4 编辑initsid.sapinitIDS.sap

  文件/oracle/IDS/dbs/initIDS.sap 包含了SAP备份配置。 这儿是使用的磁带机的大小,压缩的类型。要使用sapdba / brbackup来得到这些。 我们可以改变下面的值:

compress = hardware
archive_function = copy_delete_save
cpio_flags = "-ov --format=newc --block-size=128 --quiet"
cpio_in_flags = "-iuv --block-size=128 --quiet"
tape_size = 38000M
tape_address = /dev/nsa0
tape_address_rew = /dev/sa0

  解释

  compress:我使用的磁带机是HP DLT1,它支持硬件压缩。

  archive_function: 这个定义了保存Oracle文件日志的默认行为:新的日志文件被保存到磁带机上, 保存的日志文件会被再次保存然后再删除。如果您需要恢复数据库, 而其中一个磁带机已经损坏了,这可以防止出现麻烦。

  cpio_flags:缺省使用-B来设置块大小为 5120 Bytes。对于DLT-Tapes,HP建议至少32 K,所以我们使用--block-size=128 设置64 K。 --format=newc是必需的,因为我的inode数目超过了65535。 最后一个选项--quiet是必需的,否则brbackup会在用 cpio来输出的时候报错。

  cpio_in_flags: 这个标志从磁带机加载回数据。格式是自动验证的。

  tape_size: 通常给出了磁带机的存储容量。出于安全原因,这个值要比实际的值要小一些。

  tape_address:被cpio使用的非rewindable的设备。

  tape_address_rew:被cpio使用的非rewindable的设备。


10.7.12.5 安装后的配置

  下面的SAP参数应该在安装以后调整(例子是IDES 46B, 1 GB内存):

名称
ztta/roll_extension 250000000
abap/heap_area_dia 300000000
abap/heap_area_nondia 400000000
em/initial_size_MB 256
em/blocksize_kB 1024
ipc/shm_psize_40 70000000

  SAP注释0013026:

名称
ztta/dynpro_area 2500000

  SAP注释0157246:

Name Value
rdisp/ROLL_MAXFS 16000
rdisp/PG_MAXFS 30000

注意: 根据上面的参数,在使用1 GB内存的系统上,可以像下面这样找到内存消耗:

Mem: 547M Active, 305M Inact, 109M Wired, 40M Cache, 112M Buf, 3492K Free

10.7.13 安装过程出现的问题

10.7.13.1 修复一个问题后重起R3SETUP

  如果出现问题R3SETUP会停止。如果您找到相关的日志文件并修复了问题。 您需要再次重起R3SETUP,对于R3SETUP报的最后一个错误可以使用 REPEAT选项。

  要重起R3SETUP,只要使用相应的R3S文件重起:

# ./R3SETUP -f CENTRDB.R3S

  for 4.6B, or with

# ./R3SETUP -f CENTRAL.R3S

  对4.6C,不管有没有错误都使用CENTRAL.R3SDATABASE.R3S

注意: 在某些阶段,R3SETUP假设database和SAP 进程都启动了。但是如果发生错误使得database没有启动,您就必须手动启动database和SAP。 修复错误后,还需要再次重起R3SETUP

也不要忘记再次重起Oracle监听。


10.7.13.2 OSUSERSIDADM_IND_ORA during R3SETUP

  如果在这阶段R3SETUP报错,编辑R3SETUP使用的模板文件 (CENTRDB.R3S (4.6B)或者CENTRAL.R3S或者DATABASER3S (4.6C))。定位到[OSUSERSIDADM_IND_ORA]或者搜索STATUS=ERROR条目 然后像下面这样编辑它:

HOME=/home/sidadm (was empty)
STATUS=OK (had status ERROR)
       

  然后重起R3SETUP


10.7.13.3 OSUSERDBSID_IND_ORA during R3SETUP

  R3SETUP也可能在这个阶段报错。修正方法和上面的OSUSERSIDADM_IND_ORA一样。 编辑下面的值:

STATUS=OK

  重起R3SETUP


10.7.13.4 Oracle安装找不到“oraview.vrf文件

  开始安装之前没有取消Oracle On-Line Text Viewer 既然这个选项当前没有用于Linux,这在安装时是需要标记的,在Oracle 安装中取消它,然后重新安装。


10.7.13.5 “TEXTENV_INVALID” during R3SETUP, RFC or SAPgui Start

  如果这个错误还出现,正确的本地化可能已经丢了。 SAP注释0171356列出了必须的RPMs (比如saplocales-1.0-3, saposcheck-1.0-1 for RedHat 6.1)。 在这个例子中,您忽略了所有相关的错误, STATUSERROROK然后重起 R3SETUPSAP系统不会被正确地配置, 您就不能用一个SAPgui连接到系统。 设法使用一个旧的Linux sapgui连接会得到下面的信息:

Sat May 5 14:23:14 2001
*** ERROR => no valid userarea given [trgmsgo. 0401]
Sat May 5 14:23:22 2001
*** ERROR => ERROR NR 24 occured [trgmsgi. 0410]
*** ERROR => Error when generating text environment. [trgmsgi. 0435]
*** ERROR => function failed [trgmsgi. 0447]
*** ERROR => no socket operation allowed [trxio.c 3363]
Speicherzugriffsfehler

  这个问题归咎于SAP R/3不能正确地本地化,也不能自己正确地配置。 要能够连接到SAP, 需要在 DEFAULT.PFL(看注释0043288) 文件中添加下面的记录:

abap/set_etct_env_at_new_mode = 0
install/collate/active = 0
rscp/TCP0B = TCP0B

  重起SAP系统。现在,您可以连接到系统, 即使您指定的国家语言不能正常工作。设置完国家后,这些记录会从DEFAULT.PFL文件 删除。然后重新启动SAP系统。


10.7.13.6 ORA-00001

  这个错误只会在FreeBSD 4.5上安装Oracle 8.1.7 的时候出现。因为Oracledatabase不能自己正确初始化。 在系统上保留semaphores和shared memory。 然后再次启动数据库会出现ORA-00001错误。

  用ipcs -a找到再用ipcrm去掉。


10.7.13.7 ORA-00445 (后台进程PMON没有启动)

  这个错误发生在Oracle 8.1.7上。 如果没有用prdadm用户启动startsap脚本 (例如startsap_majestix_00)会报这个错误。

  一种可能的解决方法是用oraprd用户使用svrmgrl

% svrmgrl
SVRMGR> connect internal;
SVRMGR> startup;
SVRMGR> exit

10.7.13.8 ORA-12546(用正确的权限启动监听)

  以oraids用户启动Oracle监听:

# umask 0; lsnrctl start

  如果您得到ORA-12546错误,没有权限连接到sockets。 请看SAP注释0072984。


10.7.13.9 ORA-27102 (Out of Memory)

  这个错误发生在使用MAXDSIZDFLDSIZ大于 1 GB(1024x1024x1024)。 我们一般得到错误“Linux Error 12: Cannot allocate memory”。


10.7.13.10 [DIPGNTAB_IND_IND] during R3SETUP

  基本上, 参见 SAP 注释 0130581 (R3SETUP 步骤中的 DIPGNTAB 终止)。 在 IDES-专用安装的时候, 因为某些原因安装过程没有使用正确的 SAP 系统名 “IDS”, 而是用空串 ""代替。 这会导致一些访问目录的小问题, 因为路径是动态使用 SID来创建的 (这里是IDS)。 所以用下面的方法代替:

/usr/sap/IDS/SYS/...
/usr/sap/IDS/DVMGS00

  下面的路径被使用

/usr/sap//SYS/...
/usr/sap/D00

  为了继续安装,我们创建了一个附加的目录:

# pwd
/compat/linux/usr/sap
# ls -l
total 4
drwxr-xr-x 3  idsadm sapsys 512 May 5 11:20 D00
drwxr-x--x 5  idsadm sapsys 512 May 5 11:35 IDS
lrwxr-xr-x 1  root   sapsys 7 May 5 11:35 SYS -> IDS/SYS
drwxrwxr-x 2  idsadm sapsys 512 May 5 13:00 tmp
drwxrwxr-x 11 idsadm sapsys 512 May 4 14:20 trans

  我们也发现在SAP注释(0029227和0008401)里面描述了这个行为。 我们没有在SAP 4.6C安装里面遭遇这些问题。


10.7.13.11 [RFCRSWBOINI_IND_IND] during R3SETUP

  安装SAP 4.6C时,这个错误是前面发生过的一个错误的 结果。所以,您不得不查看相应的日志文件并修复错误。

  如果查看完日志文件后这个错误确实存在(看SAP注释),您可以设置STATUSERROROKCENTRDB.R3S文件里面) 然后重起R3SETUP。安装完后,您必须从事务SE38执行 RSWBOINS。关于RFCRSWBOINIRFCRADDBDIF的更多信息 查看SAP注释0162266。


10.7.13.12 [RFCRADDBDIF_IND_IND] during R3SETUP

  通过查看日志文件确定这个错误,它不是由于前面的问题导致的。

  如果您确定已经应用了SAP注释0162266,就只要设置 STATUSERROROKCENTRDB.R3S文件里面)。然后重起R3SETUP。 安装完后,您必须从事务SE38执行RADDBDIF


10.7.13.13 sigaction sig31: File size limit exceeded

  这个错误在启动SAP进程disp+work时出现。 如果用startsap脚本启动SAP, 就会启动子进程,并由它启动后面所有的其他SAP进程。 所以脚本本身不会注意到有错误发生。

  为了检查SAP进程是否正确启动,可以用 ps ax | grep SID查看进程的状态。 您会得到所有OracleSAP进程列表。 如果看起来有些进程没有启动,或者您不能正确连接到SAP系统。 查看相应的日志文件,可以在 /usr/sap/SID/DVEBMGSnr/work/ 下找到, 一般查看 dev_msdev_disp 文件。

  如果OracleSAP的共享内存总量超过了 内核配置文件定义的大小就会出现signal 31错误,并且不能解析大的内存地址:

# larger value for 46C production systems:
options SHMMAXPGS=393216
# smaller value sufficient for 46B:
#options SHMMAXPGS=262144

10.7.13.14 启动saposcol失败

  使用saposcol (version 4.6D)会出现一些问题。 SAP系统使用saposcol收集系统性能数据。 这个程序不是必需的。所以这些问题可以看作是小问题。 老版本(4.6B)可以工作,但是不能收集所有的性能数据(很多调用只返回0,像CPU使用率)。


10.8 高级主题

  如果您对Linux兼容模式是如何工作的感到好奇,这节正是您所需要的。 下面的绝大部分内容是由 Terry Lambert (Message ID: <[email protected]>)发表在邮件列表FreeBSD 闲聊邮件列表上的内容组成的。


10.8.1 它是如何工作的?

  FreeBSD有一个“可执行类加载器”。它主要是嵌入了execve(2)系统调用。

  碰巧的是FreeBSD有一个引导器(loader)的列表,而不是一个简单的返回一个 符号 #!的引导器!

  从历史上来讲,只有UNIX平台的引导器会检查魔术(magic)数 (通常是文件的前4个或8个字节)是否是二进制的, 如果是,就调用二进制引导程序。

  如果它不是二进制类型的execve(2)调用就会返回一个错误,shell就试图用shell命令执行它。

  缺省是使用“当前设定的shell”。

  随后,进行了一些hack, sh(1)开始检查前两个字符,如果它们是:\n, 那它就调用csh(1)(我们相信是SCO最先做这个hack的)。

  FreeBSD现在所做的是用一个普通的#!引导器仔细检查引导器的列表, 然后由解释程序一个接一个地解释,返回给/bin/sh

  为了支持Linux ABI,FreeBSD就把魔术数看作为一个二进制ELF程序。( 这样一来,它就使得在FreeBSD, Solaris,Linux和其他任何操作系统之间只要使用ELF格式就都可以顺利运行)。

  ELF引导器会寻找一个专门的标记, 它是在ELF映像中的一个注释部分,但在SVR4/Solaris的ELF中没有。

  为了执行Linux程序,它们必须被打上Linux类型的标记; 使用brandelf(1)

# brandelf -t Linux file

  做完之后,ELF引导器就会看到文件上的Linux的标记。

  当ELF引导器看到Linux的标记, 引导器就会在proc结构中替换一个指示器。 所有的系统调用就会通过这个指示器来索引(在一个传统的 UNIX系统中, 这就是sysent[]结构队列,包含系统调用)。 此外,为了解决由于信号杂乱所造成的陷阱向量的问题,会造成线程的剧增, 需要切断其他(或较小的)由Linux内核模块产生的修正。

  Linux系统调用向量包含一个sysent[]记录的列表, 它的地址位于内核模块之中。

  当一个系统调用被Linux程序调用时,有缺陷的代码会把系统调用功能的指示器从proc结构中解除, 然后获得Linux,而不是FreeBSD,系统调用入口点。

  另外,Linux模式动态地reroots查找;这和启动文件系统的union 选项是等效的(即时不是unionfs文件系统)。 首先会试图在/compat/linux/original-path 目录查找文件,如果失败了,就会在/original-path 目录下查找。这使得需要其它程序的程序可以运行(例如,Linux工具链都可以在Linux ABI的支持下工作)。 也就是说Linux程序可以加载和执行FreeBSD程序,如果当前没有相应的Linux程序, 那您可以在/compat/linux目录树中放置一个uname(1),来确保Linux程序不提示它们不能运行在Linux上。

  在FreeBSD内核中有一个Linux内核;由内核提供的能够提供所有服务的各种潜在功能 在FreeBSD系统调用表记录和Linux系统调用表记录之间是一样的: 文件系统操作,虚拟内存操作,信号发送,System V IPC,...等等。 唯一的不同是FreeBSD会得到FreeBSD的胶合功能, 而Linux程序会得到Linux的胶合功能 (大部分老的操作系统只有它们自己的胶合函数, 函数地址在静态全局变量sysent[]结构数据里面, 而不是动态的初始化到进程的proc结构)。

  哪一个是FreeBSD自己的ABI呢?这无关紧要。基本上, 唯一的不同是FreeBSD的胶合功能是被静态连接到内核, 而Linux的胶合功能可能是被静态连接到内核, 也可能它们通过一个内核模块来访问。

  有一个真正的模拟器吗?没有,它只不过是一个ABI执行机制,不是一个模拟器。

  为什么有时它被叫做“Linux模拟器”? 只是为了更容易地卖出FreeBSD罢了! 实际上,历史上从来没有描述这样一种执行机制的名字,FreeBSD并不是真正地运行Linux程序,如果您不编译进代码, 或加载一个模块。 就需要有一个名字来描述这样一种加载功能--因此就想出了“Linux模拟器”这样一个名字。

第III部分. 系统管理

FreeBSD 手册中其余章节的内容都是关于系统管理。每一章节都从描述开始,由浅入深。

这些章节被设计成很多相对完整的部分,如果您需要了解某部分内容,直接阅读这部分内容即可,无需按照顺序,也不用在您使用 FreeBSD 的时候需要先读一遍。

目录
第11章 设置和调整
第12章 FreeBSD 引导过程
第13章 用户和基本的帐户管理
第14章 安全
第15章 Jails
第16章 强制访问控制
第17章 安全事件审计
第18章 存储
第19章 GEOM: 模块化磁盘变换框架
第20章 Vinum 卷管理程序
第21章 虚拟化
第22章 本地化-I18N/L10N使用和设置
第23章 最前沿

第11章  设置和调整

原作: Chern Lee. 这份文档基于一份教程, 其作者是 Mike Smith. 此外, 也参考了 tuning(7), 其作者是 Matt Dillon.

11.1 概述

  使用 FreeBSD 的一个重要问题是系统配置。 正确地配置系统能充分地减少以后维护和升级系统所需的工作量。 这章将解释一些 FreeBSD 的配置过程,包括一些可以调整的 FreeBSD 系统的一些参数。

  读完本章, 您将了解:

  • 如何有效地利用文件系统和交换分区。

  • rc.conf 的基本设置以及 /usr/local/etc/rc.d 启动体系。

  • 如何设置和测试网卡。

  • 如何在您的网络设备上配置虚拟主机。

  • 如何使用 /etc 下的各配置文件。

  • 如何通过 sysctl 变量来对 FreeBSD 系统进行调优。

  • 怎样调整磁盘性能和修改内核限制。

  在阅读本章之前,您应该了解:

  • 了解 UNIX 和 FreeBSD 的基础知识 (第 3 章)。

  • 熟悉内核配置编译的基础知识 (第 8 章)。


11.2 初步配置

11.2.1 分区规划


11.2.1.1 基本分区

  当使用 bsdlabel(8) 或者 sysinstall(8) 来分割您的文件系统的时候, 要记住硬盘驱动器外磁道传输数据要比从内磁道传输数据快。 因此应该将小的和经常访问的文件系统放在驱动器靠外的位置, 一些大的分区比如 /usr 应该放在比较靠里的位置。 以类似这样的顺序建立分区是一个不错的主意:root,swap, /var/usr

  /var 的大小能反映您的机器使用情况。 它用来存储邮件,日志文件和打印队列缓存, 特别是邮箱和日志文件可能会达到无法预料的大小, 这主要取决于在您的系统上有多少用户和您的日志文件可以保存多长时间。 一般大多数用户不需要一个 G 以上的空间,但要记住 /var/tmp 应该足够大来以便存储一些 packages。

  /usr 分区存储很多用来系统运行所需要的文件例如 ports(7) (建议这样做) 和源代码 (可选的)。安装的时候这两项都是可选的。 这个分区至少要保留两个 G 的可用空间。

  当选择分区大小的时候,记住保留一些空间。 用完了一个分区的空间而在另一个分区上还有很多, 可能会导致出现一些错误。

注意: 一些用户会发现 sysinstall(8)Auto-defaults 自动分区有时会分配给 /var/ 较小的分区空间。 分区应该精确一些并且大一些。


11.2.1.2 交换分区

  一般来讲,交换分区应该大约是系统内存 (RAM) 的两倍。 例如,如果机器有 128M 内存,交换文件应该是 256M。 较小内存的系统可以通过多一点地交换分区来提升性能。 不建议小于 256 兆的交换分区,并且扩充您的内存应该被考虑一下。 当交换分区最少是主内存的两倍的时候,内核的 VM (虚拟内存) 页面调度算法可以将性能调整到最好。如果您给机器添加更多内存, 配置太小的交换分区会导致 VM 页面扫描的代码效率低下。

  在使用多块SCSI磁盘(或者不同控制器上的IDE磁盘)的大系统上, 建议在每个驱动器上建立交换分区(直到四个驱动器)。 交换分区应该大约一样大小。内核可以使用任意大小, 但内部数据结构则是最大交换分区的 4 倍。保持交换分区同样的大小, 可以允许内核最佳地调度交换空间来访问磁盘。 即使不太使用,分配大的交换分区也是好的, 在被迫重启之前它可以让您更容易的从一个失败的程序中恢复过来。


11.2.1.3 为什么要分区?

  一些用户认为一个单独的大分区将会很好, 但是有很多原因会证明为什么这是个坏主意。首先, 每个分区有不同的分区特性,因此分开可以让文件系统调整它们。 例如,根系统和 /usr 一般只是读取,写入很少。 很多读写频繁的被放在 /var/var/tmp中。

  适当的划分一个系统, 在其中使用较小的分区, 这样, 那些以写为主的分区将不会比以读为主的分区付出更高的代价。 将以写为主的分区放在靠近磁盘的边缘, 例如放在实际的大硬盘的前面代替放在分区表的后面,将会提高您需要的分区的 I/O 性能。现在可能也需要在比较大的分区上有很好的 I/O 性能, 把他们移动到磁盘外围不会带来多大的性能提升,反而把 /var 移到外面会有很好的效果。最后涉及到安全问题。 一个主要是只读的小的、整洁的根分区可以提高从一个严重的系统崩溃中恢复过来的机会。


11.3 核心配置

  系统的配置信息主要位于 /etc/rc.conf。 这个文件包含了配置信息很大的一部分,主要在系统启动的时候来配置系统, 这个名字直接说明了这点;它也是 rc* 文件的配置信息。

  系统管理员应该在 rc.conf 文件中建立记录来覆盖 /etc/defaults/rc.conf 中的默认设置。 这个默认文件不应该被逐字的复制到 /etc —— 它包含的是默认值而不是一个例子。 所有特定的改变应该在 rc.conf 中。

  在集群应用中,为了降低管理成本, 可以应用多种策略把涉及全站范围的设置从特定于系统的设置中分离出来。 建议的方法是将全站范围的设置放在另一个文件中,例如 /etc/rc.conf.site, 并且把它包含进然后把这个文件包括进只包含系统指定信息的 /etc/rc.conf

  由于 rc.conf 可以被 sh(1) 阅读,所以达到这个目的很简单,例如:

  • rc.conf:

       . /etc/rc.conf.site
        hostname="node15.example.com"
        network_interfaces="fxp0 lo0"
        ifconfig_fxp0="inet 10.1.1.1"
    
  • rc.conf.site:

       defaultrouter="10.1.1.254"
        saver="daemon"
        blanktime="100"
    

  rc.conf.site 文件可以使用 rsync 或类似程序分发给各个系统, 同时各系统的 rc.conf 文件仍保持独立。

  使用 sysinstall(8) 或者 make world 来升级系统不会覆盖 rc.conf 文件, 所以系统配置信息不会丢失。


11.4 应用程序配置

  典型的,被安装的应用程序有他自己的配置文件、语法等等。 从基本系统中分开他们是很重要的以至于他们可以容易的被 package 管理工具定位和管理

  一般来说,这些文件被安装在 /usr/local/etc。这个例子中, 一个应用程序有很多配置文件并且创建了一个子目录来存放他们。

  通常,当一个 port 或者 package 被安装的时候, 配置文件示例也同样被安装了。它们通常用 .default 的后缀来标识。如果不存在这个应用程序的配置文件, 它们会通过复制 .default 文件来创建。

  例如,看一下这个目下的内容 /usr/local/etc/apache

-rw-r--r--  1 root  wheel   2184 May 20  1998 access.conf
-rw-r--r--  1 root  wheel   2184 May 20  1998 access.conf.default
-rw-r--r--  1 root  wheel   9555 May 20  1998 httpd.conf
-rw-r--r--  1 root  wheel   9555 May 20  1998 httpd.conf.default
-rw-r--r--  1 root  wheel  12205 May 20  1998 magic
-rw-r--r--  1 root  wheel  12205 May 20  1998 magic.default
-rw-r--r--  1 root  wheel   2700 May 20  1998 mime.types
-rw-r--r--  1 root  wheel   2700 May 20  1998 mime.types.default
-rw-r--r--  1 root  wheel   7980 May 20  1998 srm.conf
-rw-r--r--  1 root  wheel   7933 May 20  1998 srm.conf.default

  文件大小显示了只有 srm.conf 改变了。以后 Apache 的升级就不会改变这个文件。


11.5 启动服务

Contributed by Tom Rhodes.

  许多用户会选择使用 Ports Collection 来在 FreeBSD 上安装第三方软件。 很多情况下这可能需要进行一些配置以便让这些软件能够在系统初始化的过程中启动。 服务, 例如 mail/postfixwww/apache13 就是这些需要在系统初始化时启动的软件包中的两个典型代表。 这一节解释了启动第三方软件所需要的步骤。

  FreeBSD 包含的大多数服务,例如 cron(8), 就是通过系统启动脚本启动的。 这些脚本也许会有些不同, 这取决于 FreeBSD 版本。 但是不管怎样, 需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。

  在 rc.d 出现之前, 应用程序会把一个简单的启动脚本放到 /usr/local/etc/rc.d 目录中, 这个目录中的脚本会被系统初始化脚本读取。

  尽管很多人已经花费了相当多的时间来把旧的配置方式融入到新系统中, 仍然有许多第三方软件需要把脚本放到上面提到的目录中。 是否使用 rc.d 会对这些脚本的执行带来一些变化。 在 FreeBSD 5.1 之前采用的是旧式的配置, 当然, 绝大多数情况下, 新式的脚本也会工作的很好。

  每个脚本都应该遵守 FreeBSD 版本所需求的一些规定: 每个脚本必须在文件名最后添加一个 .sh 的扩展名,并且这个脚本能被系统执行。 后者可以通过 chmod 命令把权限设置为 755来实现。 它还应该能接受 start 选项来启动程序并且接受 stop 选项来结束程序。

  一个简单的脚本看起来可能会像这样:

#!/bin/sh
echo -n ' utility'

case "$1" in
start)
        /usr/local/bin/utility
        ;;
stop)
        kill -9 `cat /var/run/utility.pid`
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

exit 0

  这个脚本提供了 stopstart 两个选项, 用以操作 utility

  可以用如下方法来启动:

# /usr/local/etc/rc.d/utility.sh start

  现在不是所有第三方软件都需要在 rc.conf 中进行如此的配置, 不过几乎每天都有新的 port 被修改来采用这种配置方法。 您应在安装的最后阶段查看所显示的信息, 以了解某个具体的应用是否需要这样的配置。 某些第三方软件会提供启动脚本, 以便与 rc.d 配合使用; 这些内容将在下一节介绍。


11.5.1 扩展应用程序配置

  现在 FreeBSD 提供了 rc.d, 这使得对应用软件的启动进行配置变得更加方便, 并提供了更多的其他功能。 例如, 使用在 rc.d 一节中所介绍的关键字, 应用程序就可以设置在某些其他服务, 例如 DNS 之后启动; 除此之外, 还可以通过 rc.conf 来指定一些额外的启动参数, 而不再需要将它们硬编码到启动脚本中。 基本的启动脚本如下所示:

#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# KEYWORD: shutdown

#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
utility_enable=${utility_enable-"NO"}
utility_flags=${utility_flags-""}
utility_pidfile=${utility_pidfile-"/var/run/utility.pid"}

. /etc/rc.subr

name="utility"
rcvar=`set_rcvar`
command="/usr/local/sbin/utility"

load_rc_config $name

pidfile="${utility_pidfile}"

start_cmd="echo \"Starting ${name}.\"; /usr/bin/nice -5 ${command} ${utility_flags} ${command_args}"

run_rc_command "$1"

  这个脚本将保证 utility 能够在 daemon 服务之后启动。 它同时也提供了设置和跟踪 PID, 也就是进程 ID 文件的方法。

  可以在 /etc/rc.conf 中加入:

utility_enable="YES"

  这个方法也使得命令行参数、包含 /etc/rc.subr 中所提供的功能, 兼容 rcorder(8) 工具并提供更简单的通过 rc.conf 文件来配置的方法。


11.5.2 用服务来启动服务

  其他服务, 例如 POP3 服务器, IMAP, 等等, 也可以通过 inetd(8) 来启动。 这一过程包括从 Ports Collection 安装相应的应用程序, 并把配置加入到 /etc/inetd.conf 文件, 或去掉当前配置中的某些注释。 如何使用和配置 inetdinetd 一节中进行了更为深入的阐述。

  一些情况下, 通过 cron(8) 来启动系统服务也是一种可行的选择。 这种方法有很多好处, 因为 cron 会以 crontab 的文件属主身份执行那些进程。 这使得普通用户也能够执行他们的应用。

  cron 工具提供了一个独有的功能, 以 @reboot 来指定时间。 这样的设置将在 cron(8) 启动时运行, 通常这也是系统初始化的时候。


11.6 配置 cron

Contributed by Tom Rhodes.

  FreeBSD 最有用的软件包(utilities)中的一个是 cron(8)cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。

  cron 程序使用两种不同类型的配置文件, 即系统 crontab 和用户 crontabs。 两种格式的唯一区别是第六个字段。 在系统 crontab 中,第六个字段是用于执行命令的用户名。 这给予了系统 crontab 以任意用户身份执行命令的能力。 在用户 crontab 中, 第六个字段是要执行的命令, 所有的命令都会以这个用户自己的身份执行; 这是一项重要的安全功能。

注意: 同其他用户一样, root 用户也可以有自己的 crontab。 它不同于 /etc/crontab (也就是系统 crontab)。 由于有系统 crontab 的存在, 通常并不需要给 root 建立单独的用户 crontab。

  让我们来看一下 /etc/crontab 文件:

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
# (1)
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin (2)
HOME=/var/log
#
#
#minute hour    mday    month   wday    who command (3)
#
#
*/5 *   *   *   *   root    /usr/libexec/atrun (4)
(1)
像大多数 FreeBSD 配置文件一样,# 字符是注释。 这样, 就可以编写注释来说明要执行什么操作, 以及这样做的原因。 需要注意的是, 注释应该另起一行, 而不能跟命令放在同一行上, 否则它们会被看成命令的一部分。 这个文件中的空行会被忽略。
(2)
首先应该定义环境变量。等号 (=) 字符用来定义任何环境变量,像这个例子用到了 SHELLPATHHOME 变量。如果 shell 行被忽略掉,cron 将会用默认值 sh。如果 PATH 变量被忽略, 那么就没有默认值并且需要指定文件绝对位置。如果 HOME 被忽略,cron 将用用执行者的 home 目录。
(3)
这一行定义了七个字段。它们是 minutehourmdaymonthwdaywhocommand。 它们差不多已经说明了各自的用处。Minute 是命令要运行时的分钟,Hour 跟 minute 差不多,只是用小时来表示。Mday 是每个月的天。Month 跟 hour 还有 minute 都差不多,用月份来表示。wday 字段表示星期几。 所有这些字段的值必须是数字并且用24小时制来表示。“who” 字段是特别的,并且只在 /etc/crontab 文件中存在。 这个字段指定了命令应该以哪个用户的身份来运行。当一个用户添加了他(她)的 crontab 文件的时候,他们就会没有这个字段选项。最后,是 command 字段。这是最后的一个字段, 所以自然就是它指定要运行的程序。
(4)
最后一行定义了上面所说的值。注意这里我们有一个 */5 列表,紧跟着是一些 * 字符。* 字符代表“开始到最后”, 也可以被解释成 每次。所以,根据这行, 显然表明了无论在何时每隔 5 分钟以 root 身份来运行 atrun 命令。查看 atrun(8) 手册页以获得 atrun 的更多信息。

命令可以有任意多个传递给它们的标志。无论怎样, 扩展到多行的命令应该用反斜线(“\”)来续行。

  这是每个 crontab 文件的基本设置, 虽然它们有一个不同。第六行我们指定的用户名只存在于系统 /etc/crontab 文件。这个字段在普通用户的 crontab 文件中应该被忽略。


11.6.1 安装 Crontab

重要: 绝对不要用这种方法来编辑/安装系统 crontab。 您需要做的只是使用自己喜欢的编辑器: cron 程序会注意到文件发生了变化, 并立即开始使用新的版本。参见 这个 FAQ 项目 以了解进一步的情况。

  要安装刚写好的用户 crontab, 首先使用最习惯的编辑器来创建一个符合要求格式的文件,然后用 crontab 程序来完成。最常见的用法是:

% crontab crontab-file

  在前面的例子中, crontab-file 是一个事先写好的 crontab

  还有一个选项用来列出安装的 crontab 文件: 只要传递 -l 选项给 crontab 然后看一下输出。

  用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用 crontab -e 选项也是可以的。 它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候, 它会自动的用 crontab 来安装这个文件。

  如果您稍后想要彻底删除自己的用户 crontab 可以使用 crontab-r 选项。


11.7 在 FreeBSD 中使用 rc

Contributed by Tom Rhodes.

  在 2002 年, FreeBSD 整合了来自 NetBSD 的 rc.d 系统, 并通过它来完成系统的初始化工作。 用户要注意在 /etc/rc.d 目录下的文件。 这里面的许多文件是用来管理基础服务的, 它们可以通过 startstop, 以及 restart 选项来控制。 举例来说, sshd(8) 可以通过下面的命令来重启:

# /etc/rc.d/sshd restart

  对其它服务的操作与此类似。 当然, 这些服务通常是在启动时根据 rc.conf(5) 自动启动的。 例如, 要配置使系统启动时启动网络地址转换服务, 可以简单地通过在 /etc/rc.conf 中加入如下设置来完成:

natd_enable="YES"

  如果 natd_enable="NO" 行已经存在, 只要简单的把 NO 改成 YES 即可。 rc 脚本在下次重新启动的时候会自动的装载所需要的服务, 像下面所描述的那样。

  由于 rc.d 系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的 /etc/rc.conf 变量,标准的 startstoprestart 选项将会执行他们的动作。例如 sshd restart 命令只在 /etc/rc.conf 中的 sshd_enable 设置成 YES 的时候工作。不管是否在 /etc/rc.conf 中设置了,要 startstop 或者 restart 一个服务,命令前可以加上一个“one”前缀。例如要不顾当前 /etc/rc.conf 的设置重新启动 sshd,执行下面的命令:

# /etc/rc.d/sshd onerestart

  用选项 rcvar 可以简单来的检查 /etc/rc.conf 中用适当的 rc.d 脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查 sshd 是否真的在 /etc/rc.conf 中被启动了:

# /etc/rc.d/sshd rcvar
# sshd
$sshd_enable=YES

注意: 第二行 (# sshd) 是从 sshd 命令中输出的,而不是 root 控制台。

  为了确定一个服务是否真的在运行,可以用 status 选项。例如验证 sshd 是否真的启动了:

# /etc/rc.d/sshd status
sshd is running as pid 433.

  有些时候也可以 reload 服务。 这一操作实际上是向服务发送一个信号, 来强制其重新加载配置。 多数情况下, 发给服务的会是 SIGHUP 信号。 并非所有服务都支持这一功能。

  rc.d 系统不仅用于网络服务, 它也为系统初始化中的多数过程提供支持。 比如 bgfsck 文件, 当它被执行时, 将会给出下述信息:

Starting background file system checks in 60 seconds.

  这个文件用做后台文件系统检查,系统初始化的时候完成。

  很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于 RPC 的服务启动可能在 rpcbind 服务启动之前失败。 要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。 程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。

  下面的字句必须被包含在所有的启动脚本文件里, (他们都是 rc.subr(8) 用来 “enable” 启动脚本必需的):

  • PROVIDE: 指定此文件所提供的服务的名字。

  以下的字句可以被包含在启动文件的顶部。严格来说他们不是必需的, 但作为对于 rcorder(8) 有一定的提示作用:

  • REQUIRE: 列出此服务启动之前所需要的其他服务。 此脚本提供的服务会在指定的那些服务 之后 启动。

  • BEFORE: 列出依赖此服务的其他服务。 此脚本提供的服务将在指定的那些服务 之前 启动。

  通过在启动脚本中仔细设定这些关键字, 系统管理员可以很有条理的控制脚本的启动顺序, 进而避免使用像其他 UNIX 操作系统那样混乱的 “runlevels”。

  更多关于 rc.d 系统的信息, 可以在 rc(8)rc.subr(8) 联机手册中找到。 如果您有意撰写自己的 rc.d 脚本, 或对现有的脚本进行一些改进, 也可以参考 这篇文章


11.8 设置网卡

Contributed by Marc Fonvieille.

  现在我们不可想象一台计算机没有网络连接的情况。 添加和配置一块网卡是任何 FreeBSD 系统管理员的一项基本任务。


11.8.1 查找正确的驱动程序

  在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI 还是 ISA 网卡。FreeBSD 支持很多种 PCI 和 ISA 网卡。 可以查看您的版本硬件兼容性列表以确定您的网卡被支持。

  确认系统能够支持您的网卡之后, 您还需要为它选择合适的驱动程序。 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 将为您提供所支持的一些网卡和芯片组的信息。 如果您怀疑驱动程序是否使所要找的那一个, 请参考驱动程序的联机手册。 联机手册将提供关于所支持的硬件更详细的信息, 甚至还包括可能发生的问题。

  如果您的网卡很常见的话, 大多数时候您不需要为驱动浪费精力。 常用的网卡在 GENERIC 内核中已经支持了, 所以您的网卡在启动时就会显示出来,像是:

dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
dc0: Ethernet address: 00:a0:cc:da:da:da
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
dc1: Ethernet address: 00:a0:cc:da:da:db
miibus1: <MII bus> on dc1
ukphy1: <Generic IEEE 802.3u media interface> on miibus1
ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto

  在这个例子中,我们看到有两块使用 dc(4) 驱动的网卡在系统中。

  如果您的网卡没有出现在 GENERIC 中, 则需要手工加载合适的驱动程序。 要完成这项工作可以使用下面两种方法之一:

  • 最简单的办法是用 kldload(8) 加载网卡对应的内核模块。 除此之外, 通过在 /boot/loader.conf 文件中加入适当的设置, 也可以让系统在引导时自动加载这些模块。 不过, 并不是所有的网卡都能够通过这种方法提供支持; ISA 网卡是比较典型的例子。

  • 另外, 您也可以将网卡的支持静态联编进内核。 察看 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 以及驱动程序的联机手册以了解需要在您的内核配置文件中加一些什么。 要了解关于重新编译内核的进一步细节, 请参见 第 8 章。 如果您的卡在引导时可以被内核 (GENERIC) 识别, 您应该不需要编译新的内核。


11.8.1.1 使用 Windows NDIS 驱动程序

  不幸的是, 许多厂商由于认为驱动程序会涉及许多敏感的商业机密, 至今仍不愿意将把驱动程序作为开放源代码形式发布列入他们的时间表。 因此, FreeBSD 和其他操作系统的开发者就只剩下了两种选择: 要么经历长时间的痛苦过程来对驱动进行逆向工程, 要么使用现存的为 Microsoft Windows 平台提供的预编译版本的驱动程序。 包括参与 FreeBSD 开发的绝大多数开发人员, 都选择了后一种方法。

  得益于 Bill Paul (wpaul) 的工作, 从 FreeBSD 5.3-RELEASE 开始, 已经可以 “直接地” 支持 网络驱动接口标准 (NDIS, Network Driver Interface Specification) 了。 FreeBSD NDISulator (也被称为 Project Evil) 可以支持二进制形式的 Windows 驱动程序, 并让它相信正在运行的是 Windows。 由于 ndis(4) 驱动使用的是用于 Windows 的二进制形式的驱动, 因此它只能在 i386 和 amd64 系统上使用。

注意: ndis(4) 驱动在设计时主要提供了 PCI、 CardBus 和 PCMCIA 设备的支持, 而 USB 设备目前则没有提供支持。

  要使用 NDISulator, 您需要三件东西:

  1. 内核的源代码

  2. 二进制形式的 Windows XP 驱动程序 (扩展名为 .SYS)

  3. Windows XP 驱动程序配置文件 (扩展名为 .INF)

  您需要找到用于您的卡的这些文件。 一般而言, 这些文件可以在随卡附送的 CD 或制造商的网站上找到。 在下面的例子中, 我们用 W32DRIVER.SYSW32DRIVER.INF 来表示这些文件。

注意: 不能在 FreeBSD/amd64 上使用 Windows/i386 驱动程序。 必须使用 Windows/amd64 驱动才能在其上正常工作。

  接下来的步骤是将二进制形式的驱动程序组装成内核模块。 要完成这一任务, 需要以 root 用户的身份执行 ndisgen(8)

# ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS

  ndisgen(8) 是一个交互式的程序, 它会提示您输入所需的一些其他的额外信息; 这些工作完成之后, 它会在当前目录生成一个内核模块文件, 这个文件可以通过下述命令来加载:

# kldload ./W32DRIVER.ko

  除了刚刚生成的内核模块之外, 还必须加载 ndis.koif_ndis.ko 这两个内核模块, 在您加载需要 ndis(4) 的模块时, 通常系统会自动完成这一操作。 如果希望手工加载它们, 则可以使用下列命令:

# kldload ndis
# kldload if_ndis

  第一个命令会加载 NDIS 袖珍端口驱动封装模块, 而第二条命令则加载实际的网络接口。

  现在请查看 dmesg(8) 来了解是否发生了错误。 如果一切正常, 您会看到类似下面的输出:

ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps

  这之后, 就可以像使用其它网络接口 (例如 dc0) 一样来使用 ndis0 设备了。

  与任何其它模块一样, 您也可以配置系统, 令其在启动时自动加载 NDIS 模块。 首先, 将生成的模块 W32DRIVER.ko 复制到 /boot/modules 目录中。 接下来, 在 /boot/loader.conf 中加入:

W32DRIVER_load="YES"

11.8.2 配置网卡

  现在正确的网卡驱动程序已经装载,那么就应该配置它了。 跟其他配置一样,网卡可以在安装时用 sysinstall 来配置。

  要显示您系统上的网络接口的配置,输入下列命令:

% ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:a0:cc:da:da:da
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
        ether 00:a0:cc:da:da:db
        media: Ethernet 10baseT/UTP
        status: no carrier
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500

注意: 老版本的 FreeBSD 可能需要在 ifconfig(8) 后面接 -a 选项,需要了解更多的 ifconfig(8) 语法请查阅使用手册。注意所有关于 IPv6 (inet6 等等) 的记录在这个例子里都被忽略了。

  在这个例子中,显示出了下列设备:

  • dc0: 第一个以太网接口

  • dc1: 第二个以太网接口

  • lp0: 并行端口网络接口

  • lo0: 回环设备

  • tun0: ppp使用的隧道设备

   FreeBSD 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如 sis2 是系统中使用 sis(4) 驱动的第三块网卡。

  在这个例子中,dc0 设备启用了。主要表现在:

  1. UP 表示这块网卡已经配置完成准备工作。

  2. 这块网卡有一个 Internet (inet) 地址 (这个例子中是 192.168.1.3)。

  3. 它有一个有效的子网掩码 (netmask0xffffff00 等同于 255.255.255.0)。

  4. 它有一个有效的广播地址 (这个例子中是 192.168.1.255)。

  5. 网卡的 MAC (ether) 地址是 00:a0:cc:da:da:da

  6. 物理传输媒介模式处于自动选择状态 (media: Ethernet autoselect (100baseTX <full-duplex>))。我们看到 dc1 被配置成运行在 10baseT/UTP 模式下。 要了解驱动媒介类型的更多信息, 请查阅它们的使用手册。

  7. 连接状态 (status)是 active,也就是说连接信号被检测到了。对于 dc1,我们看到 status: no carrier。 这通常是网线没有插好。

  如果 ifconfig(8) 的输出显示了类似于:

dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
            ether 00:a0:cc:da:da:da

  的信息,那么就是还没有配置网卡。

  要配置网卡,您需要 root 权限。 网卡配置可以通过使用 ifconfig(8) 命令行方式来完成, 但是这样每次启动都要做一遍。放置网卡配置信息的文件是 /etc/rc.conf

  用您自己喜欢的编辑器打开 /etc/rc.conf。 并且您需要为每一块系统中存在的网卡添加一行, 在我们的例子中,添加如下几行:

ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"

  用自己正确的设备名和地址来替换例子中的 dc0dc1 等内容。您应该应该查阅网卡驱动和 ifconfig(8) 的手册页来了解各选项,也要查看一下 rc.conf(5) 帮助页来了解 /etc/rc.conf 的语法。

   如果在安装的时候配置了网络,关于网卡的一些行可能已经存在了。 所以在添加新行前仔细检查一下 /etc/rc.conf

   您也可能需要编辑 /etc/hosts 来添加局域网中不同的机器名称和 IP 地址,如果它们不存在,查看 hosts(5) 帮助和 /usr/share/examples/etc/hosts 以获得更多信息。


11.8.3 测试和调试

  对 /etc/rc.conf 做了必要的修改之后应该重启系统以应用对接口的修改, 并且确认系统重启后没有任何配置错误。

  系统重启后就应该测试网络接口了。


11.8.3.1 测试以太网卡

  为了确认网卡被正确的配置了,在这里我们要做两件事情。首先, ping 自己的网络接口,接着 ping 局域网内的其他机器。

  首先测试本地接口:

% ping -c5 192.168.1.3
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms

--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms

  现在我们应该 ping 局域网内的其他机器:

% ping -c5 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms

  您如果您设置了 /etc/hosts 文件,也可以用机器名来替换 192.168.1.2


11.8.3.2 调试

  调试硬件和软件配置一直是一件头痛的事情, 从最简单的开始可以减轻一些痛苦。 例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗? 是否使用了被 FreeBSD 支持的网卡? 在发送错误报告之前您应该查看一下硬件说明, 升级 FreeBSD 到最新的 STABLE 版本, 看一下邮件列表或者在 Internet 上搜索一下。

  如果网卡工作了, 但性能低下,应该好好阅读一下 tuning(7) 联机手册。 您也可以检查一下网络配置, 不正确的设置会导致慢速的网络连接。

  一些用户可能会在一些网卡上经历一到两次 “device timeouts”, 这通常是正常现象。 如果经常这样甚至引起麻烦, 则应确定一下它跟其他设备没有冲突。 仔细检查网线连接, 或者换一块网卡。

  有时用户会看到少量 “watchdog timeout” 错误。 这种情况要做的第一件事就是检查线缆连接。 一些网卡需要支持总线控制的 PCI 插槽。 在一些老的主板上,只有一个 PCI 插槽支持 (一般是 slot 0)。 检查网卡和主板说明书来确定是不是这个问题。

  “No route to host” 通常发生在如果系统不能发送一个路由到目的主机的包的时候。 这在没有指定默认路由或者网线没有插上时会发生。 检查 netstat -rn 的输出并确认有一个有效的路由能到达相应的主机。 如果没有,请查阅 第 29 章

  “ping: sendto: Permission denied” 错误信息经常由防火墙的配置错误引起。 如果 ipfw 在内核中启用了但是没有定义规则, 那么默认的规则就是拒绝所有通讯,甚至 ping 请求! 查阅 第 28 章 以了解更多信息。

  有时网卡性能低下或者低于平均水平, 这种情况最好把传输媒介模式从 autoselect 改变为正确的传输介质模式。 这通常对大多数硬件有用, 但可能不会解决所有人的问题。 接着,检查所有网络设置,并且阅读 tuning(7) 手册页。


11.9 虚拟主机

   FreeBSD 的一个很普通的用途是虚拟主机站点, 一个服务器虚拟成很多服务器一样提供网络服务。 这通过在一个接口上绑定多个网络地址来实现。

  一个特定的网络接口有一个“真实”的地址, 也可能有一些“别名”地址。这些别名通常用 /etc/rc.conf 中的记录来添加。

  一个 fxp0 的别名记录类似于:

ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"

   记住别名记录必须从 alias0 开始并且按顺序递增(例如 _alias1_alias2)。 配置程序将会停止在第一个缺少的数字的地方。

   计算别名的子网掩码是很重要的,幸运的是它很简单。 对于一个接口来说,必须有一个描述子网掩码的地址。 任何在这个网段下的地址必须有一个全是 1 的子网掩码(通常表示为 255.255.255.2550xffffffff

  举例来说, 假设使用 fxp0 连接到两个网络, 分别是 10.1.1.0, 其子网掩码为 255.255.255.0, 以及 202.0.75.16, 其子网掩码为 255.255.255.240。 我们希望从 10.1.1.110.1.1.5 以及从 202.0.75.17202.0.75.20 的地址能够互相访问。 如前所述, 只有两个网段中的第一个地址 (本例中, 10.0.1.1202.0.75.17) 应使用真实的子网掩码; 其余的 (10.1.1.210.1.1.5 以及 202.0.75.18202.0.75.20) 则必须配置为使用 255.255.255.255 作为子网掩码。

  下面是根据上述描述所进行的 /etc/rc.conf 配置:

ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"

11.10 配置文件

11.10.1 /etc 布局

  在配置信息中有很多的目录,这些包括:

/etc 一般的系统配置信息。这儿的数据是与特定系统相关的。
/etc/defaults 系统配置文件的默认版本。
/etc/mail 额外的 sendmail(8) 配置信息,其他 MTA 配置文件。
/etc/ppp 用于用户级和内核级 ppp 程序的配置。
/etc/namedb named(8) 数据的默认位置。通常 named.conf 和区域文件存放在这里。
/usr/local/etc 被安装的应用程序配置文件。可以参考每个应用程序的子目录。
/usr/local/etc/rc.d 被安装程序的 启动/停止 脚本。
/var/db 特定系统自动产生的数据库文件,像 package 数据库,位置数据库等等。

11.10.2 主机名


11.10.2.1 /etc/resolv.conf

  /etc/resolv.conf 指示了 FreeBSD 如何访问域名系统(DNS)。

  resolv.conf 中最常见的记录是:

nameserver 按顺序要查询的名字服务器的 IP 地址,最多三个。
search 搜索机器名的列表。这通常由本地机器名的域决定。
domain 本地域名。

  一个典型的 resolv.conf 文件:

search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30

注意: 只能使用一个 searchdomain 选项。

  如果您在使用 DHCP,dhclient(8) 经常使用从 DHCP 服务器接受来的信息重写 resolv.conf


11.10.2.2 /etc/hosts

  /etc/hosts 是 Internet 早期使用的一个简单文本数据库。 它结合 DNS 和 NIS 提供名字到 IP 地址的映射。 通过局域网连接的机器可以用这个简单的命名方案来替代设置一个 named(8) 服务器。另外,/etc/hosts 也可以提供一个 Internet 名称的本地纪录以减轻需要从外部查询带来的负担。

# $FreeBSD$
#
# Host Database
# This file should contain the addresses and aliases
# for local hosts that share this file.
# In the presence of the domain name service or NIS, this file may
# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
#
#
::1                     localhost localhost.my.domain myname.my.domain
127.0.0.1               localhost localhost.my.domain myname.my.domain

#
# Imaginary network.
#10.0.0.2               myname.my.domain myname
#10.0.0.3               myfriend.my.domain myfriend
#
# According to RFC 1918, you can use the following IP networks for
# private nets which will never be connected to the Internet:
#
#       10.0.0.0        -   10.255.255.255
#       172.16.0.0      -   172.31.255.255
#       192.168.0.0     -   192.168.255.255
#
# In case you want to be able to connect to the Internet, you need
# real official assigned numbers.  PLEASE PLEASE PLEASE do not try
# to invent your own network numbers but instead get one from your
# network provider (if any) or from the Internet Registry (ftp to
# rs.internic.net, directory `/templates').
#

  /etc/hosts 用简单的格式:

[Internet address] [official hostname] [alias1] [alias2] ...

  例如:

10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2

  参考 hosts(5) 以获得更多信息。


11.10.3 日志文件配置


11.10.3.1 syslog.conf

  syslog.confsyslogd(8) 程序的配置文件。 它指出了的 syslog 哪种信息类型被存储在特定的日志文件中。

# $FreeBSD$
#
#       Spaces ARE valid field separators in this file. However,
#       other *nix-like systems still insist on using tabs as field
#       separators. If you are sharing this file between systems, you
#       may want to use only tabs as field separators here.
#       Consult the syslog.conf(5) manual page.
*.err;kern.debug;auth.notice;mail.crit          /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
security.*                                      /var/log/security
mail.info                                       /var/log/maillog
lpr.info                                        /var/log/lpd-errs
cron.*                                          /var/log/cron
*.err                                           root
*.notice;news.err                               root
*.alert                                         root
*.emerg                                         *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info                                   /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
#*.*                                            /var/log/all.log
# uncomment this to enable logging to a remote log host named loghost
#*.*                                            @loghost
# uncomment these if you're running inn
# news.crit                                     /var/log/news/news.crit
# news.err                                      /var/log/news/news.err
# news.notice                                   /var/log/news/news.notice
!startslip
*.*                                             /var/log/slip.log
!ppp
*.*                                             /var/log/ppp.log

  参考 syslog.conf(5) 手册页以获得更多信息


11.10.3.2 newsyslog.conf

  newsyslog.conf 是一个通常用 cron(8) 计划运行的 newsyslog(8) 程序的配置文件。 newsyslog(8) 指出了什么时候日志文件需要打包或者重新整理。 比如 logfile 被移动到 logfile.0logfile.0 被移动到 logfile.1 等等。另外,日志文件可以用 gzip(1) 来压缩,它们是这样的命名格式: logfile.0.gzlogfile.1.gz 等等。

  newsyslog.conf 指出了哪个日志文件要被管理,要保留多少和它们什么时候被创建。 日志文件可以在它们达到一定大小或者在特定的日期被重新整理。

# configuration file for newsyslog
# $FreeBSD$
#
# filename          [owner:group]    mode count size when [ZB] [/pid_file] [sig_num]
/var/log/cron                           600  3     100  *     Z
/var/log/amd.log                        644  7     100  *     Z
/var/log/kerberos.log                   644  7     100  *     Z
/var/log/lpd-errs                       644  7     100  *     Z
/var/log/maillog                        644  7     *    @T00  Z
/var/log/sendmail.st                    644  10    *    168   B
/var/log/messages                       644  5     100  *     Z
/var/log/all.log                        600  7     *    @T00  Z
/var/log/slip.log                       600  3     100  *     Z
/var/log/ppp.log                        600  3     100  *     Z
/var/log/security                       600  10    100  *     Z
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/daily.log                      640  7     *    @T00  Z
/var/log/weekly.log                     640  5     1    $W6D0 Z
/var/log/monthly.log                    640  12    *    $M1D0 Z
/var/log/console.log                    640  5     100  *     Z

  参考 newsyslog(8) 手册页以获得更多信息。


11.10.4 sysctl.conf

  sysctl.confrc.conf 这两个文件的风格很接近。 其中的配置均为 变量=值 这样的形式。 在这个文件中配置的值, 均会在系统进入多用户模式之后进行实际的修改操作。 需要注意的是, 并不是所有的变量都能够在多用户模式下修改。

  如果希望关闭对收到致命的信号退出的进程进行记录, 并阻止普通用户看到其他用户的进程, 可以在 sysctl.conf 中进行下列配置:

# 不记录由于致命信号导致的进程退出 (例如信号 11,访问越界)
kern.logsigexit=0

# 阻止用户看到以其他用户 UID 身份执行的进程。
security.bsd.see_other_uids=0

11.11 用 sysctl 进行调整

  sysctl(8) 是一个允许您改变正在运行中的 FreeBSD 系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用 sysctl(8) 可以读取设置超过五百个系统变量。

  基于这点,sysctl(8) 提供两个功能:读取和修改系统设置。

  查看所有可读变量:

% sysctl -a

  读一个指定的变量,例如 kern.maxproc

% sysctl kern.maxproc
kern.maxproc: 1044

  要设置一个指定的变量,直接用 variable=value 这样的语法:

# sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000

  sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示'yes',用 0 来表示'no')。

  如果你想在每次机器启动时自动设置某些变量, 可将它们加入到文件 /etc/sysctl.conf 之中。更多信息,请参阅手册页 sysctl.conf(5)第 11.10.4 节


11.11.1 只读的 sysctl(8)

Contributed by Tom Rhodes.

  有时可能会需要修改某些只读的 sysctl(8) 的值。 尽管有时不得不这样做, 但只有通过(重新)启动才能达到这样的目的。

  例如一些膝上型电脑的 cardbus(4) 设备不会探测内存范围,并且产生看似于这样的错误:

cbb0: Could not map register memory
device_probe_and_attach: cbb0 attach returned 12

  像上面的错误通常需要修改一些只读的 sysctl(8) 默认设置。要实现这点,用户可以在本地的 /boot/loader.conf.local 里面放一个 sysctl(8) “OIDs”。那些设置定位在 /boot/defaults/loader.conf 文件中。

  修复上面的问题用户需要在刚才所说的文件中设置 hw.pci.allow_unsupported_io_range=1。现在 cardbus(4) 就会正常的工作了。


11.12 调整磁盘

11.12.1 Sysctl 变量

11.12.1.1 vfs.vmiodirenable

  vfs.vmiodirenable sysctl 变量可以设置成0(关)或者1(开);默认是1。 这个变量控制目录是否被系统缓存。大多数目录是小的, 在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。当这个变量设置为关闭 (0) 时, 缓存器仅仅缓存固定数量的目录,即使您有很大的内存。 而将其开启 (设置为1) 时, 则允许缓存器用 VM 页面缓存来缓存这些目录,让所有可用内存来缓存目录。 不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。 我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。 这些服务包括 web 缓存,大容量邮件系统和新闻系统。 尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。 但还是应该检验一下。


11.12.1.2 vfs.write_behind

  vfs.write_behind sysctl 变量默认是 1 (打开)。 它告诉文件系统簇被收集满的时候把内容写进介质, 典型的是在写入大的连续的文件时。 主要的想法是, 如果可能对 I/O 性能会产生负面影响时, 应尽量避免让缓冲缓存被未同步缓冲区充满。 然而它可能降低处理速度并且在某些情况下您可能想要关闭它。


11.12.1.3 vfs.hirunningspace

  vfs.hirunningspace sysctl 变量决定了在任何给定情况下, 有多少写 I/O 被排进队列以给系统的磁盘控制器。 默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成 4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。 不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。

  sysctl 中还有许多与 buffer cache 和 VM页面 cache 有关的值, 一般不推荐修改它们。 虚拟内存系统已经能够很好地进行自动调整了。


11.12.1.4 vm.swap_idle_enabled

  vm.swap_idle_enabled sysctl 变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。 这些系统注重在空闲的内存中间产生连续压力的处理。通过 vm.swap_idle_threshold1vm.swap_idle_threshold2 打开这个特性并且调整交换滞后 (在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页 (pageout)算法更快。这给出页守护进程带来了帮助。 除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存, 因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果, 但是在大的系统上它已经做了合适的页面调度这个选项允许 VM 系统容易的让全部的进程进出内存。


11.12.1.5 hw.ata.wc

  FreeBSD 4.3 中默认将 IDE 的写缓存关掉了。 这会降低到 IDE 磁盘用于写入操作的带宽, 但我们认为这有助于避免硬盘厂商所引入的, 可能引致严重的数据不一致问题。 这类问题实际上是由于 IDE 硬盘就写操作完成这件事的不诚实导致的。 当启用了 IDE 写入缓存时, IDE 硬盘驱动器不但不会按顺序将数据写到盘上, 而且当磁盘承受重载时, 它甚至会自作主张地对推迟某些块的实际写操作。 这样一来, 在系统发生崩溃或掉电时, 就会导致严重的文件系统损坏。 基于这些考虑, 我们将 FreeBSD 的默认配置改成了更为安全的禁用 IDE 写入缓存。 然而不幸的是, 这样做导致了性能的大幅降低, 因此在后来的发行版中这个配置又改为默认启用了。 您可以通过观察 hw.ata.wc sysctl 变量, 来确认您的系统中所采用的默认值。 如果 IDE 写缓存被禁用, 您可以通过将内核变量设置为 1 来启用它。 这一操作必须在启动时通过 boot loader 来完成。 在内核启动之后尝试这么做是没有任何作用的。

  要了解更多的信息,请查阅 ata(4)


11.12.1.6 SCSI_DELAY (kern.cam.scsi_delay)

  SCSI_DELAY 内核配置会缩短系统启动时间。 默认值在系统启动过程中有 15 秒的迟延时间, 这是一个足够多且可靠的值。把它减少到 5 通常也能工作(特别是现代的驱动器)。新一些的 FreeBSD (5.0 或更高版本) 应该用启动时刻可调整 kern.cam.scsi_delay。 这个可调整的和内核配置选项接受的值是 毫秒 不是


11.12.2 Soft Updates

  tunefs(8) 程序能够用来很好的调整文件系统。 这个程序有很多不同的选项,但是现在只介绍 Soft Updates 的打开和关闭,这样做:

# tunefs -n enable /filesystem
# tunefs -n disable /filesystem

  在文件系统被挂载之后不能用 tunefs(8) 来修改。打开 Soft Updates 的最佳时机是在单用户模式下任何分区被被挂载前。

   Soft Updates 极大地改善了元数据修改的性能, 主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用 Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates 保证了崩溃后的文件系统完整性,但是很可能有几秒钟 (甚至一分钟!) 之前的数据没有写到物理磁盘。如果您的系统崩溃了您可能会丢失很多工作。 第二,SoftUpdates 推迟文件系统块的释放时间。如果在文件系统 (例如根文件系统)快满了的情况下对系统进行大规模的升级比如 make installworld, 可能会引起磁盘空间不足从而造成升级失败。


11.12.2.1 Soft Updates 的详细资料

   有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。 (Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据)

   从前,默认方法是同步更新这些元数据(meta-data)。 如果一个目录改变了,系统在真正写到磁盘之前一直等待。 文件数据缓存(文件内容)在这之后以非同步形式写入。 这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data) 一直处于完整状态。文件要不就被完整的创建要不根本就不创建。 如果崩溃时找不到文件的数据块,fsck(8) 可以找到并且依靠把文件大小设置为 0 来修复文件系统。 另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如 rm -r 命令,依次触及目录下的所有文件, 但是每个目录的改变(删除一个文件)都要同步写入磁盘。 这包含它自己更新目录,inode 表和可能对文件分散的块的更新。 同样问题出现大的文件操作上(比如 tar -x)。

   第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的 mount -o async 默认的方法。所有元数据更新也是通过缓存。 也就是它们会混合在文件内容数据更新中。 这个方法的优点是不需要等待每个元数据更新都写到磁盘上, 所以所有引起元数据更新大的操作比同步方式更快。同样, 这个方法也是清楚且简单的,所以代码中的漏洞风险很小。 缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败 (例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。 系统再启动时没有机会检查文件系统的状态;inode 表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用 fsck 命令来清理(因为磁盘上没有所需要的信息)。 如果文件系统修复后损坏了,唯一的选择是使用 newfs(8) 并且从备份中恢复它。

   这个问题通常的解决办法是使用 dirty region logging 或者 journaling 尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。 这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。 过后他们将会被移动到正确的位置。因为纪录区很小, 磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。 另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次 (一次写到纪录区域,一次写到正确的区域)。正常情况下, 悲观的性能可能会发生。从另一方面来讲, 崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。

  Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates 解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘 (“有序的元数据更新”)。这样的结果是,在繁重的元数据操作中, 如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。 所以所有的目录操作在写进磁盘的时候首先在内存中执行 (数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。 如果系统崩溃了这将导致一个固定的 “日志回朔”: 所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在 30 到 60 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后, 唯一的资源分配错误是一个实际是“空闲”的资源的资源被标记为“使用”。 fsck(8) 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用 mount -f 强制挂上的文件系统的错误状态是安全的。 为了释放可能没有使用的资源,fsck(8) 需要在过后的时间运行。一个主意是用 后台 fsck:系统启动的时候只有一个文件系统的 快照 被记录下来。fsck 可以在过后运行。所有文件系统可以在“有错误”的时候被挂接, 所以系统可以在多用户模式下启动。接着,后台 fsck 可以在所有文件系统需要的时候启动来释放可能没有使用的资源。 (尽管这样,不用 Soft Updates 的文件系统依然需要通常的 fsck。)

   它的优点是元数据操作几乎跟非同步一样快 (也就是比需要两次元数据写操作的 logging 更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险) 和高的内存使用量。另外它有些特点需要知道。崩溃之后, 文件系统状态会“落后”一些。同步的方法用 fsck 后在一些地方可能产生一些零字节的文件, 这些文件在用 Soft Updates 文件系统之后不会存在, 因为元数据和文件内容根本没有写进磁盘(可能发生在运行 rm 之后)。这可能在文件系统上安装大量数据时候引发问题, 没有足够的剩余空间来两次存储所有文件。


11.13 调整内核限制


11.13.1 文件/进程限制

11.13.1.1 kern.maxfiles

  kern.maxfiles 可以根据系统的需要适当增减。 这个变量用于指定在系统中允许的文件描述符的最大数量。 当文件描述符表满的时候, “file: table is full” 会在系统消息缓冲区中反复出现, 您可以使用 dmesg 命令来观察这一现象。

  每个打开的文件、 套接字和管道, 都会占用一个文件描述符。 在大型生产服务器上, 可能会轻易地用掉数千个文件描述符, 具体用量取决于服务的类型和并行启动的服务数量。

  在早期版本的 FreeBSD 中, kern.maxfiles 的默认值, 是根据您内核配置文件中的 maxusers 选项计算的。 kern.maxfiles 这个数值, 会随 maxusers 成比例地增减。 当编译定制的内核时, 按照您系统的用途来修改这个值是个好主意。 这个数字同时还决定内核的许多预设的限制值。 有时, 尽管并不会真的有 256 个用户同时连接一台生产服务器, 但对于高负载的 web 服务器而言, 却可能需要与之类似的资源。

  从 FreeBSD 4.5 开始, kern.maxusers 会在系统启动时, 根据可用内存的尺寸进行计算, 在内核开始运行之后, 可以通过只读的 kern.maxusers sysctl 变量值来进行观察。 有些情况下, 可能会希望使用更大或更小一些的 kern.maxusers, 它可以以加载器变量的形式进行配置; 类似 64、 128 和 256 这样的值都并不罕见。 我们不推荐使用超过 256 的值, 除非您需要巨量的文件描述符; 根据 kern.maxusers 推算默认值的那些变量, 一般都可以在引导甚至运行时通过 /boot/loader.conf (请参见 loader.conf(5) 联机手册或 /boot/defaults/loader.conf 文件来获得相关的指导) 或这篇文档的其余部分所介绍的方式来调整。 而在 FreeBSD 4.4 之前的版本, 则只能通过内核的 config(8) 选项 maxusers 来加以调整。

  在较早的版本中, 如果您明确地将 maxusers 设置为 0, 则系统会自动地根据硬件配置来确定这个值。[5]。 在 FreeBSD 5.X 和更高版本中, maxusers 如果不指定的话, 就会取默认值 0。 如果希望自行管理 maxusers, 则应配置一个不低于 4 的值, 特别是使用 X Window System 或编译软件的时候。 这样做的原因是, maxusers 所决定的一个最为重要的表的尺寸会影响最大进程数, 这个数值将是 20 + 16 * maxusers。 因此如果将 maxusers 设置为 1, 您就只能同时运行 36 个进程, 这还包括了 18 个左右的系统引导时启动的进程, 以及 15 个左右的, 在您启动 X Window System 时所引发的进程。 即使是简单的任务, 如阅读联机手册, 也需要启动多至九个的进程, 用以过滤、 解压缩, 并显示它。 将 maxusers 设为 64 将允许您同时执行最多 1044 个进程, 这几乎足以满足任何需要了。 不过, 如果您看在启动其它程序, 或运行用以支持大量用户的服务 (例如 ftp.FreeBSD.org) 时, 看到令人担忧的 proc table full 错误, 就应该提高这一数值, 并重新联编内核。

注意: maxusers不能 限制实际能够登录到您系统上来的用户的数量。 它的主要作用是根据您可能支持的用户数量来为一系列系统数据表设置合理的尺寸, 以便提供支持他们所需运行的进程资源。 而 能够 限制并发远程以及 X 终端窗口数量的变量则是 pseudo-device pty 16。 对于 FreeBSD 5.X, 您不再需要为这一数字而担心, 因为 pty(4) 驱动已经是 “自动复制的” 了; 您只需在配置文件中指定 device pty 即可。


11.13.1.2 kern.ipc.somaxconn

  kern.ipc.somaxconn sysctl 变量 限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。 大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 sendmail(8) 或者 Apache), 常常在它们的配置文件中有设置队列大小的选项。 大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。


11.13.2 网络限制

  NMBCLUSTERS 内核配置选项指出了系统可用的网络Mbuf的数量。 一个高流量的服务器使用一个小数目的网络缓存会影响 FreeBSD 的性能。 每个 cluster 可能需要2K内存,所以一个1024的值需要在内核中给网络缓存保留2M内存。 可以用简单的方法计算出来需要多少网络缓存。 如果您有一个同时发生1000个以上连接的web服务器, 并且每个连接用掉16K接收和发送缓存, 就需要大概32M网络缓存来确保web服务器的工作。 一个好的简单计算方法是乘以2,所以2x32Mb/2Kb=64MB/2kb=32768。 我们建议在有大量内存的机器上把这个值设置在4096到32768之间。 没有必要把它设置成任意太高的值,它会在启动时引起崩溃。 netstat(1)-m 选项可以用来观察网络cluster使用情况。

  kern.ipc.nmbclusters 可以用来在启动时刻调节这个。 仅仅在旧版本的 FreeBSD 需要使用 NMBCLUSTERS config(8) 选项。

  经常使用 sendfile(2) 系统调用的繁忙的服务器, 有必要通过 NSFBUFS 内核选项或者在 /boot/loader.conf (查看 loader(8) 以获得更多细节) 中设置它的值来调节 sendfile(2) 缓存数量。 这个参数需要调节的普通原因是在进程中看到 sfbufa 状态。sysctl kern.ipc.nsfbufs 变量在内核配置变量中是只读的。 这个参数是由 kern.maxusers 决定的,然而它可能有必要因此而调整。

重要: 即使一个套接字被标记成非阻塞,在这个非阻塞的套接字上呼叫 sendfile(2) 可能导致 sendfile(2) 呼叫阻塞直到有足够的 struct sf_buf 可用。


11.13.2.1 net.inet.ip.portrange.*

  net.inet.ip.portrange.* sysctl 变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。 这里有三个范围:一个低端范围,一个默认范围和一个高端范围。 大多数网络程序分别使用由 net.inet.ip.portrange.firstnet.inet.ip.portrange.last 控制的从 1024 到 5000 的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口, 这经常发生在运行一个高负荷 web 代理服务器的时候。 这个端口范围不是用来限制主要的例如 web 服务器进入连接或者有固定端口例如邮件传递对外连接的。 有时您可能用完了端口,那就建议适当的增加 net.inet.ip.portrange.last1000020000 或者 30000 可能是适当的值。 更改端口范围的时候也要考虑到防火墙。 一些防火墙会阻止端口的大部分范围 (通常是低范围的端口)并且用高端口进行对外连接(──)。 基于这个问题建议不要把 net.inet.ip.portrange.first 设的太小。


11.13.2.2 TCP 带宽迟延(Bandwidth Delay Product)

  限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。 它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。 系统将尝试计算每一个连接的带宽延迟积, 并将排队的数据量限制在恰好能保持最优吞吐量的水平上。

  这一特性在您的服务器同时向使用普通调制解调器, 千兆以太网, 乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要, 特别是当您同时使用滑动窗缩放, 或使用了大的发送窗口的时候。 如果启用了这个选项, 您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试), 对于生产环境而言, 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。 然而, 需要注意的是, 这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。 这个限制特性减少了在路由和交换包队列的堵塞数据数量, 也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、 交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。但是,注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。

  调整 net.inet.tcp.inflight.stab 推荐的。 这个参数的默认值是 20, 表示把 2 个最大包加入到带宽延迟积窗口的计算中。 额外的窗口似的算法更为稳定, 并改善对于多变网络环境的相应能力, 但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。 对于这些情形, 您可能会希望把这个参数减少到 15, 10, 或 5; 并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说, 3500) 来得到希望的效果。 减少这些参数的值, 只应作为最后不得已时的手段来使用。


11.13.3 虚拟内存

11.13.3.1 kern.maxvnodes

  vnode 是对文件或目录的一种内部表达。 因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。 一般而言, 这是由操作系统自行完成的, 也不需要加以修改。 但在某些时候磁盘 I/O 会成为瓶颈, 而系统的 vnode 不足, 则这一配置应被增加。 此时需要考虑是非活跃和空闲内存的数量。

  要查看当前在用的 vnode 数量:

# sysctl vfs.numvnodes
vfs.numvnodes: 91349

  要查看最大可用的 vnode 数量:

# sysctl kern.maxvnodes
kern.maxvnodes: 100000

  如果当前的 vnode 用量接近最大值, 则将 kern.maxvnodes 值增大 1,000 可能是个好主意。 您应继续查看 vfs.numvnodes 的数值, 如果它再次攀升到接近最大值的程度, 仍需继续提高 kern.maxvnodes。 在 top(1) 中显示的内存用量应有显著变化, 更多内存会处于活跃 (active) 状态。


11.14 添加交换空间

   不管您计划得如何好,有时候系统并不像您所期待的那样运行。 如果您发现需要更多的交换空间,添加它很简单。 有三种方法增加交换空间:添加一块新的硬盘驱动器、通过 NFS 使用交换空间和在一个现有的分区上创建一个交换文件。

  要了解关于如何加密交换区, 相关配置, 以及为什么要这样做, 请参阅手册的 第 18.17 节


11.14.1 在新的硬盘驱动器上使用交换空间

  这是添加交换空间最好的方法, 当然为了达到这个目的需要添加一块硬盘。 毕竟您总是可以使用另一块磁盘。如果能这么做, 重新阅读一下手册中关于交换空间的 第 11.2 节 来了解如何最优地安排交换空间。


11.14.2 通过 NFS 交换

  除非没有可以用作交换空间的本地硬盘时, 否则不推荐您使用 NFS 来作为交换空间使用。 NFS 交换会受到可用网络带宽限制并且增加 NFS 服务器的负担。


11.14.3 交换文件

   您可以创建一个指定大小的文件用来当作交换文件。 在我们的例子中我们将会使用叫做 /usr/swap0 的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。

例 11-1. 在 FreeBSD 中创建交换文件

  1. 确认您的内核配置包含虚拟磁盘(Memory disk)驱动 (md(4))。它在 GENERIC 内核中是默认的。

    device   md   # Memory "disks"
    
  2. 创建一个交换文件(/usr/swap0):

    # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
    
  3. 赋予它(/usr/swap0)一个适当的权限:

    # chmod 0600 /usr/swap0
    
  4. /etc/rc.conf 中启用交换文件:

    swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
    
  5. 通过重新启动机器或下面的命令使交换文件立刻生效:

    # mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0
    

11.15 电源和资源管理

Written by Hiten Pandya 和 Tom Rhodes.

   BIOS 接口管理,例如可插拔 BIOS (PNPBIOS)或者高级电源管理(APM) 等等。电源和资源管理是现代操作系统的关键组成部分。 例如您可能当系统温度过高的时候让您的操作系统能监视到 (并且可能提醒您)。

  以有效的方式利用硬件资源是非常重要的。 在引入 ACPI 之前, 管理电源使用和系统散热对操作系统是很困难的。 硬件由 BIOS 进行管理, 因而用户对电源管理配置的控制和查看都比较困难。 一些系统通过 高级电源管理 (APM) 提供了有限的配置能力。 电源和资源管理是现代操作系统的一个关键组件。 例如, 您可能希望操作系统监视系统的一些限制, 例如系统的温度是否超出了预期的增长速度 (并在需要时发出警告)。

  在 FreeBSD 使用手册的这一章节,我们将提供 ACPI 全面的信息。 参考资料会在末尾给出。


11.15.1 什么是 ACPI?

  高级配置和电源接口 (ACPI) 是一个业界标准的硬件资源和电源管理接口 (因此而得名) 。它是 操作系统控制的配置和电源管理(Operating System-directed configuration and Power Management),也就是说, 它给操作系统(OS)提供了更多的控制和弹性。 在引入 ACPI 之前, 现代操作系统使得目前即插即用接口的局限性更加 “凸现” 出来。 ACPIAPM(高级电源管理) 的直接继承者。


11.15.2 高级电源管理 (APM) 的缺点

  高级电源管理 (APM) 是一种基于系统目前的活动控制其电源使用的机制。 APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。 在 OS 中的 APM 驱动作为中介来访问 APM 软件接口, 从而实现对电源使用的管理。 在 2000 年或更早的时期生产的计算机系统, 仍需要使用 APM。

  APM 有四个主要的问题。 首先, 电源管理是通过 (制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。 例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值, 当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度, 而不会征求 OS 的同意。 第二, APM 逻辑是嵌入 BIOS 的, 因此它是在 OS 的控制之外运转的。 这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS 才能够解决某些问题; 而这是一个很危险的操作, 因为它可能使系统进入一个无法恢复的状态。 第三, APM 是一种制造商专属的技术, 也就是说有很多第三方的 (重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有, 也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM BIOS 没有为实现复杂的电源策略提供足够的余地, 也无法实现能够非常适合具体机器的策略。

  即插即用 BIOS (PNPBIOS) 在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术, 因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法 “接口”。

  FreeBSD APM 驱动在 apm(4) 手册页中有描述。


11.15.3 配置 ACPI

  默认情况下, acpi.ko 驱动, 会在系统引导时由 loader(8) 加载, 而 不应 直接联编进内核。 这样做的原因是模块操作起来更方便, 例如, 无需重新联编内核就可以切换到另一个 acpi.ko 版本。 这样可以让测试变得更简单一些。 另一个原因是, 许多时候在启动已经启动之后再启动 ACPI 可能会有些问题。 如果您遇到了问题, 可以全面禁用 ACPI。 这个驱动不应, 目前也无法卸载, 因为系统总线通过它与许多不同的硬件进行交互。 ACPI 可以通过在 /boot/loader.conf 中配置或在 loader(8) 提示符处配置 hint.acpi.0.disabled="1" 来禁用。

注意: ACPIAPM 不能共存, 相反, 它们应分开使用。 后加载的驱动如果发现系统中已经执行了其中的一个, 便会停止执行。

  ACPI 可以用来让系统进入休眠模式, 方法是使用 acpiconf(8)-s 参数, 加上一个 1-5 的数字。 多数用户会希望使用 13 (挂起到 RAM)。 而 5 则会让系统执行与下列命令效果类似的软关机:

# halt -p

  除此之外, 还有一些通过 sysctl(8) 提供的选项。 请参见联机手册 acpi(4) acpiconf(8) 以获得更多信息。


11.16 使用和调试 FreeBSD ACPI

撰写人:Nate Lawson. 协力:Peter Schultz 和 Tom Rhodes.

  ACPI 是一种全新的发现设备、 管理电源使用、 以及提供过去由 BIOS 管理的访问不同硬件的标准化方法。 让 ACPI 在各种系统上都能正确使用的工作一直在进行, 但许多主板的 ACPI 机器语言 (AML) 字节代码中的 bug, FreeBSD 的内核中子系统设计的不完善, 以及 Intel ACPI-CA 解释器中的 bug 仍然不时会出现。

  这份文档期望能够帮助您协助 FreeBSD ACPI 的维护人员来找到您所观察到的问题的根源, 并通过调试找到其解决方法。 感谢您阅读这份文档, 我们也希望能够解决您的系统上的问题。


11.16.1 提交调试信息

注意: 在提交问题之前, 请确认您已经在运行最新的 BIOS 版本, 此外, 也包括嵌入式控制器的固件版本。

  如果您希望提交一个问题, 请确保将下述信息发到 [email protected]:

  • 问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。 另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。

  • 在 “boot -v” 之后得到的 dmesg(8) 输出, 以及任何在重现 bug 时出现的错误信息。

  • 在禁用了 ACPI 之后的 “boot -v” 的 dmesg(8) 输出, 如果您发现禁用 ACPI 能够帮助消除问题。

  • 来自 sysctl hw.acpi的输出。 这也是找到您的系统所提供的功能的一种好办法。

  • 能够得到您的 ACPI Source Language (ASL) 的 URL不要ASL 直接发到邮件列表中, 因为它们可能非常大。 为了得到 ASL 您可以运行这个命令:

    # acpidump -dt > name-system.asl
    

    (把 name 改为您的登录名, 并把 system 改为您的硬件制造商及其型号。 例如: njl-FooCo6000.asl)

  许多开发者也会订阅 FreeBSD-CURRENT 邮件列表 但还是请发到 freebsd-acpi 这样它会被更多人看到。 请耐心等待, 因为我们都有全职的其他工作。 如果您的 bug 不是显而易见的, 我们可能会要求您通过 send-pr(1) 来提交一个 PR。 在输入 PR 时,请将同样的信息包含进去。 这将帮助我们来追踪和解决问题。 不要在给 freebsd-acpi 写信之前发送 PR 因为我们把它当作已知文体的备忘录而不是报告机制。 您的问题很可能已经被其他人报告过了。


11.16.2 背景

  ACPI 存在于采用 ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。 完整的标准具有大量的各式功能, 包括 CPU 性能管理、 电源控制、 温度监控、 电池系统、 嵌入式控制器以及总线枚举。 绝大多数系统实现比完整标准的功能要少一些。 例如, 桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。 笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。

  符合 ACPI 的系统中有许多组件。 BIOS 和芯片组制造商提供一些固定的表 (例如, FADT) 在存储器中, 以提供类似 APIC 映射 (用于 SMP)、 配置寄存器、 以及简单的配置值等等。 另外, 一个字节代码 (bytecode) 表 (系统区别描述表 DSDT) 则提供了通过树状命名空间来指定设备及其功能的方法。

  ACPI 驱动必须要处理固定表, 实现字节码解释器, 并修改驱动程序和内核, 以接受来自 ACPI 子系统的信息。 对于 FreeBSD, Intel 提供了一个解释器 (ACPI-CA), 它在 Linux 和 NetBSD 也可以使用。 ACPI-CA 源代码可以在 src/sys/contrib/dev/acpica 找到。 用于在 FreeBSD 中允许 ACPI-CA 正确运转的代码则在 src/sys/dev/acpica/Osd。 最后, 用于实现 ACPI 设备的驱动可以在 src/sys/dev/acpica 找到。


11.16.3 常见问题

  要让 ACPI 正常工作, 它的每一部分都必须工作正常。 下面是一些常见的问题, 按照出新的频繁程度排序, 并给出了一些绕过或修正它们的方法。


11.16.3.1 鼠标问题

  某些时候, 唤醒操作会导致鼠标不再正常工作。 已知的绕过这一问题的方法, 是在 /boot/loader.conf 文件中添加 hint.psm.0.flags="0x3000" 设置。 如果这样做不能解决问题, 请考虑按前面介绍的方法提交问题报告。


11.16.3.2 休眠/唤醒

  ACPI 提供了三种休眠到 RAM (STR) 的状态, S1-S3, 以及一个休眠到磁盘的状态 (STD), 称作 S4S5 是 “软关机” 同时也是系统接好电源但没有开机时的正常状态。 S4 实际上可以用两种不同的方法来实现。 S4BIOS 是一种由 BIOS 辅助的挂起到磁盘方法, 而 S4OS 则是完全由操作系统实现的。

  可以使用 sysctl hw.acpi 来查看与休眠有关的项目。 这里是我的 Thinkpad 上得到的结果。

hw.acpi.supported_sleep_state: S3 S4 S5
hw.acpi.s4bios: 0

  这表示我可以使用 acpiconf -s 来测试 S3S4OS, 以及 S5。 如果 s4bios 是一 (1), 则可以使用 S4BIOS 来代替 S4 OS

  当测试休眠/唤醒时, 从 S1 开始, 如果它被支持的话。 这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。 没有人实现 S2 但如果您有它的支持, 则应该和 S1 类似。 下一件值得尝试的是 S3。 这是最深的 STR 状态, 并需要一系列驱动的支持才能够正常地重新初始化您的硬件。 如果您在唤醒系统时遇到问题, 请不要吝惜发邮件给 freebsd-acpi 邮件列表, 尽管不要指望问题一定会很快解决, 因为有许多驱动程序/硬件需要进行更多的测试和改进。

  为了帮助隔离问题, 请在内核中删去尽可能多的驱动。 如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。 通常预编译的驱动程序如 nvidia.ko、 X11 显示驱动, 以及 USB 的问题最多, 而以太网卡的驱动则通常工作的很好。 如果您能够通过加载和卸载驱动使系统正常工作, 您可以通过将适当的命令放到 /etc/rc.suspend/etc/rc.resume 来将这个过程自动化。 在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。 另外您还可以将 hw.acpi.reset_video 设置为零 (0), 如果您的显示在唤醒之后显得很混乱。 此外您还可以尝试更长或更短的 hw.acpi.sleep_delay 值看看是否有所助益。

  另一件值得一试的事情是使用一个比较新的包含 ACPI 支持的 Linux 发行版来试试看他们的 休眠/唤醒 功能是否在同样的硬件上能够正常工作。 如果在 Linux 下正常, 则很可能是 FreeBSD 驱动程序的问题, 而隔离问题并找到存在问题的驱动有助于解决它。 需要注意的是 ACPI 的维护人员通常并不维护其他驱动 (例如 声音、 ATA, 等等) 因此如果最终发现是驱动的问题最好还是发到 freebsd-current 邮件列表并发给驱动程序的维护者。 如果您喜欢冒险, 则可以加一些 printf(3) 到有问题的驱动中, 以找到它的恢复功能发生问题的位置。

  最后, 试试看禁用 ACPI 并代之以启用 APM。 如果 休眠/唤醒 能够在 APM 下正常工作, 使用 APM 可能会更好, 特别是对于较老的硬件 (2000年以前)。 硬件制造商需要一些时间来让老硬件的 ACPI 工作正常, 而 ACPI 的问题十之八九是 BIOS 中的毛病引发的。


11.16.3.3 系统停止响应 (暂时或永久性地)

  绝大多数系统停止响应是由于未能及时响应中断或发生了中断风暴导致的。 芯片组有很多问题最终会溯源到 BIOS 如何在引导系统之前配置中断, APIC (MADT) 表的正确性, 以及 系统控制中断 (SCI) 如何路由。

  通过察看 vmstat -i 的输出中包括 acpi0 的那一行可以区分中断风暴和未能及时响应中断。 如果每秒计数器增长的速度多于一两个, 则您是遇到了中断风暴。 如果系统停止了响应, 您可以尝试停止内核并进入 DDB (在控制台上按 CTRL+ALT+ESC) 并输入 show interrupts

  处理中断问题的救命稻草是尝试禁用 APIC 支持, 这是通过在 loader.conf 中加入 hint.apic.0.disabled="1" 完成的。


11.16.3.4 崩溃

  崩溃对于 ACPI 是比较罕见的情况, 如果发现, 我们将会非常重视并很快修复它。 您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话) 的操作并获取一份调用堆栈。 请启用 options DDB 并设置串行控制台 (参见 第 24.6.5.3 节) 或配置一个 dump(8) 分区。 您将在 DDB 中通过 tr 得到调用堆栈。 如果您只能用手抄的方法记录它, 一定要记下头五 (5) 行和最后五 (5) 行。

  然后, 尝试通过在启动时禁用 ACPI 来隔离故障。 如果这样做能够正常工作, 请通过设置 debug.acpi.disable 的那组数值来隔离具体是哪个 ACPI 子系统的问题。 请参见 acpi(4) 联机手册中给出的那些例子。


11.16.3.5 系统在休眠或关机之后又启动了

  首先请尝试在 loader.conf(5) 中设置 hw.acpi.disable_on_poweroff=“0”。 这将让 ACPI 不再在关机过程中禁用一些事件。 基于同样的原因, 一些系统需要把这个值设置为 “1” (这是默认值)。 这通常能够修复在休眠或关机时立即再次启动的问题。


11.16.3.6 其他问题

  如果您有 ACPI 的其他问题 (同 docking station 协同工作、 无法检测设备, 等等), 请把描述发给邮件列表; 不过, 这些问题也有可能和 ACPI 中尚未完成的部分有关, 它们可能需要时间才能被实现。 请给点耐心, 并准备测试我们可能会发给您的补丁。


11.16.4 ASLacpidump, 以及 IASL

  最常见的问题是 BIOS 制造商提供的不正确 (甚至完全错误的!) 字节代码。 这通常会以类似下面这样的内核消息显示在控制台上:

ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
(Node 0xc3f6d160), AE_NOT_FOUND

  许多时候, 您可以通过将 BIOS 升级到最新版本来解决此类问题。 绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常, 则从 AML 开始查找问题将是一条捷径。 字节代码, 或常说的 AML, 是从一种叫做 ASL 的语言写成的源代码进行编译得到的结果。 AML 一般存放在 DSDT 表中。 要得到您系统的 ASL, 需要使用 acpidump(8)。 需要同时指定 -t (显示固定标的内容) 和 -d (将 AML 反编译成 ASL) 两个选项。 请参见 如何提交调试信息 一节了解如何使用它。

  最方便的初步检查是尝试重新编译 ASL 来看看是否有错误。 通常可以忽略这一过程中产生的警告, 但错误一般就都是 bug, 它们通常就是导致 ACPI 无法正常工作的原因。 要重新编译您的 ASL, 可以使用下面的命令:

# iasl your.asl

11.16.5 修复 ASL

  我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用 ACPI。 然而, 目前我们仍然在开发绕过 BIOS 制造商常见错误的方法。 Microsoft 解释器 (acpi.sysacpiec.sys) 并不会严格地检查是否遵守了标准, 因此许多只在 Windows 中测试 ACPIBIOS 制造商很可能永远不会修正他们的 ASL。 我们希望不断地找出并用文档说明 Microsoft 的解释器到底允许那些不标准的行为, 并在 FreeBSD 进行对应的修改使它能够正常工作而不需要用户修正 ASL。 作为一项临时缓解问题的方法, 并帮助我们确认其行为, 您可以手工修正 ASL。 如果这样能够解决问题, 请把新旧 ASLdiff(1) 发给我们, 这样我们就有可能绕过 ACPI-CA 中的错误行为, 从而不再需要您来手工修正。

  下面是一些常见的错误信息, 它们的原因, 以及如何修正。


11.16.5.1 _OS dependencies (_OS 依赖)

  某些 AML 假定世界是由不同版本的 Windows 组成的。 您可以让 FreeBSD 声称自己是任意 OS 来看一看是否能够修正问题。 比较简单的办法是设置 hw.acpi.osname="Windows 2001" 到 /boot/loader.conf 中, 或使用您在 ASL 中找到的其他字符串。


11.16.5.2 Missing Return statements (缺少返回语句)

  一些方法可能没按照标准要求的那样显式地返回值。 尽管 ACPI-CA 无法处理它, 但 FreeBSD 提供了一个绕过它并允许其暗含地返回值的方法。 您也可以增加一个显式的 Return 语句, 如果您知道那里需要返回一个值的话。 要强制 iasl 编译 ASL, 需要使用 -f 标志。


11.16.5.3 替换默认的 AML

  在定制 your.asl 之后, 您可以通过下面的命令编译它:

# iasl your.asl

  可以使用 -f 标志来强制创建 AML, 即使在编译过程中发生了错误。 请注意某些错误 (例如, 缺少 Return 语句) 会自动被解释器忽略掉。

  DSDT.amliasl 命令的默认输出文件名。 可以加载它来取代您 BIOS 中存在问题的副本 (它仍然存在于闪存中), 其方法是按下面的说明编辑 /boot/loader.conf

acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/DSDT.aml"

  一定要把您的 DSDT.aml 复制到 /boot 目录中。


11.16.6 从 ACPI 中获取调试输出信息

  ACPI 驱动程序提供了非常灵活的调试机制。 这允许您指定一组子系统, 以及所需要的详细信息。 需要调试的子系统可以按 “layers(层)” 来指定, 并分为 ACPI-CA 组件 (ACPI_ALL_COMPONENTS) 和 ACPI 硬件支持 (ACPI_ALL_DRIVERS)。 调试输出的详细程度可以通过 “level(详细度)” 来指定, 其范围是 ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。 “level” 是一个位掩码因此可以一次设置多个选项, 中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出, 如果它太长以至于冲掉了控制台消息缓冲的话。 不同的层和输出详细度的完整列表可以在 acpi(4) 联机手册中找到。

  调试输出默认并不开启。 要起用它, 您需要在内核设置中添加 options ACPI_DEBUG, 如果您的内核中编入了 ACPI 的话。 您还可以在 /etc/make.conf 中加入 ACPI_DEBUG=1 来在全局起用它。 如果它只是模块, 您可以用下面的方法来重新编译 acpi.ko

# cd /sys/modules/acpi/acpi
&& make clean &&
make ACPI_DEBUG=1

  安装 acpi.ko/boot/kernel and add your 并把所需的详细度和层在 loader.conf 中指定。 这个例子将启用所有 ACPI-CA 组件以及所有 ACPI 硬件驱动 (CPULID, 等等) 的消息。 只输出错误信息, 也就是最低的详细度。

debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
debug.acpi.level="ACPI_LV_ERROR"

  如果您需要的信息是由某个特定的事件触发的 (比如说, 休眠之后的唤醒), 您可以不修改 loader.conf 而转而使用 sysctl 来在启动和为那个事件准备系统之后再指定层和详细度。 这些 sysctl 的名字和 loader.conf 中的一致。


11.16.7 参考文献

  关于 ACPI 的更多信息可以从下面这些地方找到:


第12章  FreeBSD 引导过程

12.1 概述

  启动电脑以及加载操作系统的过程被称为“引导过程”, 或者简称为“引导”。 FreeBSD 的引导过程给用户自定义启动提供了很大的伸缩性, 您可以选择启动不同的操作系统,或者是同一系统的不同版本及内核。

  本章将详细介绍您能在 FreeBSD 引导过程中设置的配置选项。 这包括了引导内核、探测设备并启动 init(8) 等等之前所发生的所有事情。 这些事项一般发生在文本由白变灰时。

  读完这章您将会知道:

  • FreeBSD 引导系统里的各项组件, 以及它们之间的交互方式.

  • 在 FreeBSD 引导时给各组件配置选项以控制引导过程。

  • device.hints(5)的基本知识。

只适用于x86: 本章只描述了运行于 Intel x86 体系之上的 FreeBSD 的引导过程。


12.2 引导问题

  启动电脑及启动和引导操作系统构成了一个有趣的两难境地。 按照定义在操作系统被启动之前计算机是无法完成任何任务的,包括运行磁盘上的程序。 如果计算机在没有操作系统的情况下不能运行来自于磁盘上的程序而操作系统又是放在磁盘上的, 那操作系统是如何启动的呢?

  在 Munchausen男爵历险记 (The Adventures of Baron Munchausen) 这本书中有一个和这个过程类似的故事, 一个人掉到了下水管道里, 然后靠着拉自己的靴襻 (bootstrap) 克服重重困难爬了出来。 在早期文献中, 多以术语 bootstrap 来指代操作系统的加载机制, 如今它逐渐被简写为 “booting”。

  在 x86 硬件体系中,基本输入/输出系统 (BIOS) 负责加载操作系统, 为了做到这一点,BIOS 在磁盘上寻找主引导记录 (MBR),而 MBR 必须在放置的磁盘的特定位置。BIOS 有足够的能力来读入和运行 MBR, 且假使地认为 MBR 能完成加载操作系统的剩余任务, MBR可能需要BIOS的帮助。

  在MBR中的代码通常被提为引导管理器, 尤其是与用户交互的那类。这一类引导器通常有更多代码位于磁盘第一 轨道或在操作系统的文件系统中。 (引导管理器有时也被称为boot loader, 但是FreeBSD对后面的引导阶段才使用这个术语。) 流行的引导管理器包括boot0(亦称Boot Easy,标准的 FreeBSD 引导管理器)、 GrubGAG,以及 LILO。 (只有boot0能装得进MBR。)

  如果您只安装了一个操作系统,那么一个标准的 MBR 就足够了。 这个 MBR 先在磁盘上搜索可引导的(亦称“活动的”)分区, 然后运行分区上的代码以加载操作系统的其它部分。 MBR由fdisk(8)安装,是一个缺省的MBR。相关文件为 /boot/mbr

  如果您在磁盘上安装了多个操作系统那么您可以安装一个不同的 引导管理器,它能显示一张操作系统的列表,您能从中选择启动哪个。 这样的两种引导器将在下一小节中讨论。

  启动系统的剩余部分被分为三个阶段。第一阶段由 MBR 执行,它只是使计算机进入特定的状态然后执行第二阶段。 第二阶段稍微干得多一些。第三阶段完成加载操作系统的任务。 工作被分为三个阶段是因为 PC 标准对第一第二阶段执行的程序的大小有所限制。 把这些任务连在一起使得 FreeBSD 可以提供更大伸缩性的加载器 (loader)。

  然后内核启动,它开始探测设备并初始化它们。 一旦内核引导进程完成任务,内核将控制权交给用户进程 init(8), 它确认磁盘是否处于可用状态。init(8) 然后开始用户级资源配置: 加载文件系统启动网卡,及粗略地启动所有 FreeBSD 系统加载时经常运行的进程。


12.3 引导管理器和各引导阶段


12.3.1 The Boot Manager

  在MBR或引导管理器中的代码有时被提为引导过程的 阶段0。这一小节便是前面提到引导器中的两种: boot0LILO

boot0引导管理器:. 由 FreeBSD 的安装程序以及 boot0cfg(8) 所安装的 MBR, 默认基于 /boot/boot0。 (程序boot0非常简单, 由于在MBR中的程序只能有446字节长, 分区表和MBR末端的0x55AA标识也要挤占一些空间。) 如果你已经安装boot0 并且有多个操作系统在你的硬盘上, 那么你如果您安装了 FreeBSD MBR 而且安装了多个操作系统, 则会在系统启动时看到类似下面的提示:

例 12-1. boot0 截屏

F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1

Default: F2

  目前已经知道一些其它操作系统,特别是 Windows , 会以自己的 MBR 覆盖现有 MBR。 如果发生了这种事情, 或者您想用 FreeBSD 的 MBR 覆盖现有的 MBR,您可以使用以下的命令:

# fdisk -B -b /boot/boot0 device

  device 是要写入 MBR 的设备名,比如 ad0 代表第一个 IDE 磁盘,ad2 代表第二个 IDE 控制器上的第一个 IDE 磁盘, da0 代表第一个 SCSI 磁盘,等等。 抑或,如果你需要一个自行配置的MBR,请使用boot0cfg(8)

The LILO Boot Manager: 要想安装这个引导管理器并也用来引导FreeBSD, 首先启动Linux,并将以下选项加入到已有的配置文件 /etc/lilo.conf

other=/dev/hdXY
table=/dev/hdX
loader=/boot/chain.b
label=FreeBSD

  在上面的内容里,使用Linux的标示符指定了FreeBSD的主分区和驱动器, 将X替换为Linux驱动器字母, 将Y替换为Linux主分区号。 如果您使用的是 SCSI 驱动器,您需要将 /dev/hd 改成 /dev/sd, 这里再次使用了 XY 的语法。 如果您安装的两个系统在同一驱动器上,loader=/boot/chain.b 选项可以去掉。现在您可以执行 /sbin/lilo -v 使修改生效;应检查屏幕上的消息确认修改。


12.3.2 第一阶段,/boot/boot1,和第二阶段, /boot/boot2

  概念上,第一,第二阶段同属于一个程序,处于磁盘的相同区域。但由于空间限制, 它们被分为两部分。可是您总是会一起安装它们。它们由安装器或 bsdlabel(见下文)复制自被组合而成的 /boot/boot

  它们位于文件系统外,引导分区的第一轨道,从第一扇区开始。在这里boot0,或者任何其它引导管理器, 期望找到一个程序运行,继续引导进程。 所使用的扇区数可由/boot/boot的大小确定。

  boot1 非常简单,因为它再多也只能有 512 字节, 只能识别储存着分区信息的 bsdlabel, 及寻找执行 boot2

  boot2 稍微有点加强,能够理解 FreeBSD 的文件系统以便于寻找里面的文件, 能提供选择内核和加载器的简单界面。

  因为 loader 有着更强的功能, 提供了一套易于使用的引导配置,boot2 一般都执行 loader, 但以前它的任务是直接运行内核。

例 12-2. boot2 的屏幕输出

>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:

  如果您要更改已安装的 boot1boot2,请使用命令 bsdlabel(8)

# bsdlabel -B diskslice

  diskslice 是用于引导的磁盘和分区, 比如 ad0s1 代表第一个 IDE 磁盘上的第一个分区。

dangerously dedicated: 如果您在 bsdlabel(8) 命令中只使用了磁盘名,比如 ad0,就会破坏磁盘上的所有分区。 这当然不是您所希望的,所以在按下 回车 之前 一定要对命令进行多次确认。


12.3.3 第三阶段,/boot/loader

  加载器 (loader) 是三个阶段中的最后阶段, 且是放置在文件系统之中的,一般是文件 /boot/loader

  loader 被作为一种友好的配置方式,使用了一组内建且易用的命令集。 这些命令由一个强大的多的解释器支持构建,其本身带有复杂得多的命令集。


12.3.3.1 Loader 程序流程

  初始时,loader 会探测控制台和磁盘,识别是从哪块盘引导的。 它会根据这些信息设置变量, 启动解释器以接受通过脚本或交互方式传来的用户命令。

  loader 然后会读取并运行 /boot/loader.rc, 默认地读取 /boot/defaults/loader.conf 以设置可靠的默认变量,读取 /boot/loader.conf 对这些变量作本地修改。loader.rc 依据这些变量进行动作,加载任何被选择的模块和内核。

  最后,默认地,loader 会停留 10 秒等待按键, 若没有发生中断,就开始引导内核。如果被中断,用户会得到一个命令行提示符, 在这里用户得更改变量、卸载所有模块、加载模块、最后引导 或重新引导。


12.3.3.2 Loader 内建的命令

  这些是最常用的 loader 命令.对所有可用命令的解释请参见 loader(8)

autobootseconds

在给定的时间内如果没有中断发生就引导内核。它显示一个倒数计时, 默认的时间范围是 10 秒。

boot [-options] [kernelname]

立即按照给定的选项 (如果有的话) 和内核名 (如果是内核的) 引导内核。

boot-conf

基于变量对各种模块进行自动配置 (和引导内核时发生的一样)。 您只须记住要先使用 unload 命令, 然后修改一些变量,比如 kernel

help [topic]

显示从文件 /boot/loader.help 读取的帮助信息。如果给定的主题是 index, 那么列出来的是所有可用的主题。

include filename ...

通过给定的文件名处理文件。文件被读入,然后被一行一行地解释。 任何错误都会立即中止 include 命令。

load [-t type] filename

加载内核、内核模块,或者是给定类型的文件 (通过给定的文件名)。 任何在文件名后面的参数都会被传给文件。

ls [-l] [path]

显示给定路径或者是根目录 (如果路径没有指定) 下面的文件列表。 如果指定了 -l 选项,文件大小也会显示。

lsdev [-v]

列出所有可以加载模块的设备。 如果指定了-v 选项,会显示出更多的细节。

lsmod [-v]

显示已被加载的模块。如果指明了 -v 选项, 会显示更多的细节。

more filename

显示指定的文件,每隔 LINES 停顿一次。

reboot

立即重启系统。

set variable, set variable=value

设置 loader 的环境变量。

unload

移除所有已被加载的模块。


12.3.3.3 Loader 示例

  这里有一些实际中 loader 用法的示例

  • 只是简单的引导默认内核,不同的是进入单用户模式:

    boot -s
    
  • 卸载默认内核和模块,然后加载旧的 (或者其它) 的内核:

    unload
    load kernel.old
    

    您可以使用被称为通用内核的 kernel.GENERIC, 或者您以前安装的内核 kernel.old (当您升级或配置了您自己的内核等时候)。

    注意: 使用以下命令加载常用的模块和另一个内核:

    unload
    set kernel="kernel.old"
    boot-conf
    
  • 加载内核配置脚本:

    load -t userconfig_script /boot/kernel.conf
    

12.4 内核在引导时的交互

  一旦内核被 loader (一般情况下) 或者 boot2 (越过 loader) 加载, 它将检查引导标志,如果有的话,就会进行必要的动作调整。


12.4.1 内核引导标志

  这里是一些常用的引导标志:

-a

在内核初始化时,询问作为根加载的设备。

-C

从 CDROM 引导。

-c

运行 UserConfig (引导时的内核配置器)

-s

引导进入单用户模式

-v

在内核引导过程中显示更有的信息

注意: 还有更多的引导标志,阅读 boot(8) 以获取有关它们的信息。


12.5 Device Hints

Contributed by Tom Rhodes.

注意: 这是 FreeBSD 5.0 及其以后版本的组件, 不存在于早前的版本中。

  在初始化系统启动时,loader(8) 会读取 device.hints(5) 文件。这个文件以变量的形式储存着内核引导信息, 有时被称为 “device hints”。 设备驱动程序用“device hints” 对设备进行配置。

  Device hints 也可以在 第三阶段的boot loader 的命令行提示符中指定。变量可以用 set 命令添加,unset 命令删除, show 命令查看。在文件 /boot/device.hints 设置的变量亦可以在这里被覆盖。键入 boot loader 中的变量不是永久性的,在下次启动时就会被忘记。

  一旦系统引导成功,kenv(1) 命令可以用来清楚所有的变量。

  文件 /boot/device.hints 的语法是一行一个变量, 使用“#”作为注释标记。 每行是按照如下方式组织的:

hint.driver.unit.keyword="value"

  第三阶段 boot loader 的语法是:

set hint.driver.unit.keyword=value

  driver 是设备驱动程序名,unit 是设备驱动程序单位名,keyword 是 hint 关键字。 关键字可以由以下选项组成:

  • at:指明设备所绑定的总线

  • port:指明所使用 I/O 的起始地址。

  • irq:指明所使用的中断请求号。

  • drq:指明 DMA channel 号。

  • maddr:指明设备占用的物理内存地址。

  • flags:给设备设置各种标志位。

  • disabled:如果设成 1, 设备被禁用。

  设备驱动程序能够接受更多的 hints,推荐您参看它们的联机手册。参看 device.hints(5)kenv(1)loader.conf(5)loader(8) 联机手册以获取更多的信息。


12.6 Init:进程控制及初始化

  一旦内核完成引导,它就把控制权交给了用户进程 init(8),它放置在 /sbin/init, 或者 init_path 变量指定的程序路径中。 这个变量是在 loader 里面设置的。


12.6.1 自动重启过程

  自动重启过程会确认系统中可用的文件系统处于健康的状态。 如果不是, 而且使用 fsck(8) 也无法修复这些问题, init(8) 会进入 单用户模式 以便系统管理员直接修正这些问题。


12.6.2 单用户模式

  此模式可以通过 自动重启过程 或者通过带有 -s 选项的用户引导或通过在 loader 里设置 boot_single 变量等多种方式来达到。

  也可以在多用户模式下调动无重启 (-r) 选项和停机 (-h) 选项的 shutdown(8) 命令来进入单用户模式。

  如果系统 控制台 在文件 /etc/ttys 中被设置为 不安全(insecure), 在初始化单用户模式前会出现要求输入 root 密码的命令行提示符。

例 12-3. 在 /etc/ttys 文件中的不安全控制台

# name  getty                           type    status          comments
#
# If console is marked "insecure", then init will ask for the root password # when going to single-user mode.
console none                            unknown off insecure

注意: 把控制台设置成 不安全 (insecure) 使只知道 root 密码的人才能进入单用户模式, 因为您认为控制台在物理上是不安全的。因此如果您考虑到安全性, 请选择 不安全 (insecure),而非 安全 (secure)


12.6.3 多用户模式

  如果 init(8) 发现您的文件系统一切正常,又或者用户在单用户模式完成了工作, 系统就会进入多用户模式,开始系统的资源配置。


12.6.3.1 资源配置 (rc)

  资源配置分别从文件 /etc/defaults/rc.conf/etc/rc.conf 中读取默认配置和细节配置, 然后加载在文件 /etc/fstab 中提及的文件系统、 启动网络服务、启动各种系统守护进程,最后启动本地安装包的启动脚本。

  rc(8) 联机手册是关于资源配置的很好的参考。


12.7 关机 (shutdown) 过程

  由命令 shutdown(8) 的发起的关机过程中, init(8) 会试着运行 /etc/rc.shutdown 脚本, 给所有进程发送 TERM 信号, 最后给不按时停止的进程发送 KILL 信号。

  在支持电源管理的平台上关闭 FreeBSD 系统的电源, 只要简单地使用命令 shutdown -p now 即可。 此外, 可以用命令 shutdown -r now 来重启 FreeBSD。 要执行 shutdown(8) 您必须是 root 用户或 operator 组的成员。 也可以使用 halt(8)reboot(8) 命令来关闭系统, 请参看它们的联机手册以获得更多的信息。

注意: 电源管理需要支持, 这要求内核支持 acpi(4) 或以模块形式加载它。


第13章  用户和基本的帐户管理

Contributed by Neil Blakey-Milner.

13.1 概述

  FreeBSD允许多个用户同时使用计算机. 当然,这些用户中不是很多人同时坐在同一台计算机前. [6],而是其他用户可以通过网络来使用同一台计算机以完成他们的工作.要使用系统,每个人都应该有一个帐户.

  读完这章,您将了解到:

  • 在一个FreeBSD系统上不同用户帐户之间的区别.

  • 如何添加用户帐户.

  • 如何删除用户帐户.

  • 如何改变帐户细节,如用户的全名,或首选的shell.

  • 如何在每个帐户基础上设置限制,来控制像内存,CPU时钟这样的资源.

  • 如何使用组来使帐户管理更容易.

  在阅读这章之前,您应当了解:

  • 了解UNIX和FreeBSD的基础知识 (第 3 章).


13.2 介绍

  所有访问系统的用户都是通过帐户完成的,所以用户和帐户管理是FreeBSD系统不可或缺的重要部分.

  每个FreeBSD系统的帐户都有一些和它相对应的信息去验证它.

用户名

用户名在login: 提示符的后面键入。 用户名