Home -- Michael's Blog :: Just Do IT -- Manuals

FreeBSD 使用手册

The FreeBSD Documentation Project

FreeBSD中文化项目

欢迎使用FreeBSD! 本手册适用于安装 FreeBSD 4.10-RELEASEFreeBSD 5.2.1-RELEASE 以及它们的日常使用。 这个手册目前由很多人持续地维护。其中的内容需要不断的添加和更新。 如果你有兴趣参加这个项目,请发邮件到FreeBSD documentation project 邮件列表。此文档最新的版本可以从 FreeBSD Web站点 上获得。 其他的各种格式和压缩的文档可以从FreeBSD 的 FTP 服务器 或下列其中的一个镜像站点下载获得。 如果你更希望得到一份印刷版本的手册,可以从 FreeBSD Mall购买. 你还可以 搜索手册

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 is a registered trademark of Wind River Systems, Inc. This is expected to change soon.

3Com and HomeConnect are registered trademarks of 3Com Corporation.

3ware and Escalade are registered trademarks of 3ware Inc.

ARM is a registered trademark of ARM Limited.

Adaptec is a registered trademark of Adaptec, Inc.

Adobe, Acrobat, Acrobat Reader, and PostScript are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries.

Apple, FireWire, Mac, Macintosh, Mac OS, Quicktime, and TrueType are trademarks of Apple Computer, Inc., registered in the United States and other countries.

Corel and WordPerfect are trademarks or registered trademarks of Corel Corporation and/or its subsidiaries in Canada, the United States and/or other countries.

Sound Blaster is a trademark of Creative Technology Ltd. in the United States and/or other countries.

CVSup is a registered trademark of John D. Polstra.

Heidelberg, Helvetica, Palatino, and Times Roman are either registered trademarks or trademarks of Heidelberger Druckmaschinen AG in the U.S. and other countries.

IBM, AIX, EtherJet, Netfinity, OS/2, PowerPC, PS/2, S/390, and ThinkPad are trademarks of International Business Machines Corporation in the United States, other countries, or both.

IEEE, POSIX, and 802 are registered trademarks of Institute of Electrical and Electronics Engineers, Inc. in the United States.

Intel, Celeron, EtherExpress, i386, i486, Itanium, Pentium, and Xeon are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

Intuit and Quicken are registered trademarks and/or registered service marks of Intuit Inc., or one of its subsidiaries, in the United States and other countries.

Linux is a registered trademark of Linus Torvalds.

LSI Logic, AcceleRAID, eXtremeRAID, MegaRAID and Mylex are trademarks or registered trademarks of LSI Logic Corp.

M-Systems and DiskOnChip are trademarks or registered trademarks of M-Systems Flash Disk Pioneers, Ltd.

Macromedia, Flash, and Shockwave are trademarks or registered trademarks of Macromedia, Inc. in the United States and/or other countries.

Microsoft, FrontPage, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media and Windows NT are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries.

Netscape and the Netscape Navigator are registered trademarks of Netscape Communications Corporation in the U.S. and other countries.

GateD and NextHop are registered and unregistered trademarks of NextHop in the U.S. and other countries.

Motif, OSF/1, and UNIX are registered trademarks and IT DialTone and The Open Group are trademarks of The Open Group in the United States and other countries.

Oracle is a registered trademark of Oracle Corporation.

PowerQuest and PartitionMagic are registered trademarks of PowerQuest Corporation in the United States and/or other countries.

RealNetworks, RealPlayer, and RealAudio are the registered trademarks of RealNetworks, Inc.

Red Hat, RPM, are trademarks or registered trademarks of Red Hat, Inc. in the United States and other countries.

SAP, R/3, and mySAP are trademarks or registered trademarks of SAP AG in Germany and in several other countries all over the world.

Sun, Sun Microsystems, Java, Java Virtual Machine, JavaServer Pages, JDK, JSP, JVM, Netra, Solaris, StarOffice, Sun Blade, Sun Enterprise, Sun Fire, SunOS, and Ultra are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries.

Symantec and Ghost are registered trademarks of Symantec Corporation in the United States and other countries.

MATLAB is a registered trademark of The MathWorks, Inc.

SpeedTouch is a trademark of Thomson

U.S. Robotics and Sportster are registered trademarks of U.S. Robotics Corporation.

VMware is a trademark of VMware, Inc.

Waterloo Maple and Maple are trademarks or registered trademarks of Waterloo Maple Inc.

Mathematica is a registered trademark of Wolfram Research, Inc.

XFree86 is a trademark of The XFree86 Project, Inc.

Ogg Vorbis and Xiph.Org are trademarks of Xiph.Org.

Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the ``™'' or the ``®'' symbol.


目录
前言
I. 起步
1. 介绍
1.1. 概述
1.2. 欢迎来到 FreeBSD 的世界!
1.3. 关于 FreeBSD 项目
2. 安装 FreeBSD
2.1. 概述
2.2. 安装前的准备工作
2.3. 开始安装
2.4. 介绍 Sysinstall
2.5. 分配磁盘空间
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. Post-installation Activities
4.7. Dealing with Broken Ports
5. X Window 系统
5.1. 概述
5.2. 理解 X
5.3. 安装 XFree86
5.4. XFree86 的配置
5.5. XFree86 中使用字体
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. Advanced Printer Setup
9.5. Using Printers
9.6. Alternatives to the Standard Spooler
9.7. Troubleshooting
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 5.X 下使用 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. MBR, 和引导阶段一,二,三
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. 个性化用户设置
13.9.
14. 安全
14.1. 概述
14.2. 介绍
14.3. 确保FreeBSD的安全
14.4. DES,MD5,以及Crypt
14.5. 一次性口令
14.6. KerberosIV
14.7. Kerberos5
14.8. Firewalls
14.9. OpenSSL
14.10. VPN over IPsec
14.11. OpenSSH
14.12. File System Access Control Lists
14.13. FreeBSD Security Advisories
15. Mandatory Access Control
15.1. Synopsis
15.2. Key Terms in this Chapter
15.3. Explanation of MAC
15.4. Understanding MAC Labels
15.5. Module Configuration
15.6. The MAC bsdextended Module
15.7. The MAC ifoff Module
15.8. The MAC portacl Module
15.9. MAC Policies with Labeling Features
15.10. The MAC partition Module
15.11. The MAC Multi-Level Security Module
15.12. The MAC Biba Module
15.13. The MAC LOMAC Module
15.14. Implementing a Secure Environment with MAC
15.15. Another Example: Using MAC to Constrain a Web Server
15.16. Troubleshooting the MAC Framework
16. 存储
16.1. 概述
16.2. 设备命名
16.3. 添加磁盘
16.4. RAID
16.5. USB 存储设备
16.6. 创建和使用光学介质 (CDs)
16.7. 创建和使用光学介质(DVD)
16.8. Creating and Using Floppy Disks
16.9. 用磁带机备份
16.10. 用软盘备份
16.11. 备份程序
16.12. Network, Memory, and File-Backed File Systems
16.13. File System Snapshots
16.14. 文件系统配额
16.15. 加密磁盘分区
17. Vinum 卷管理程序
17.1. 概述
17.2. 磁盘容量太小
17.3. 访问瓶颈
17.4. 数据的完整性
17.5. Vinum 目标
17.6. 一些例子
17.7. Object Naming
17.8. Configuring Vinum
17.9. Using Vinum for the Root Filesystem
18. 本地化-I18N/L10N使用和设置
18.1. 概述
18.2. 基础知识
18.3. 使用本地化语言
18.4. 编译I18N程序
18.5. 本地化FreeBSD
19. 最前沿
19.1. 概述
19.2. FreeBSD-CURRENT 和 FreeBSD-STABLE 的对比
19.3. 同步你的源码
19.4. 重新编译 ``world''
19.5. 跟踪多台机器
IV. 网络通讯
20. 串口通信
20.1. 概述
20.2. 介绍
20.3. 终端
20.4. 拨入服务
20.5. 拨出设备
20.6. 设置串行控制台
21. PPP 和 SLIP
21.1. 概述
21.2. 使用用户级PPP
21.3. 使用内核级PPP
21.4. Troubleshooting PPP Connections
21.5. 使用基于以太网的PPP(PPPoE)
21.6. Using PPP over ATM (PPPoA)
21.7. 使用SLIP
22. 电子邮件
22.1. 概述
22.2. 使用电子邮件
22.3. sendmail 配置
22.4. 改变你的邮件传输代理程序
22.5. 疑难解答
22.6. 高级主题
22.7. SMTP 与 UUCP
22.8. Setting up to send only
22.9. 拨号连接时使用邮件传送
22.10. SMTP 验证
22.11. Mail User Agents
22.12. Using fetchmail
22.13. Using procmail
23. Network Servers
23.1. 概要
23.2. inetd ``超级服务器''
23.3. 网络文件系统(NFS)
23.4. Network Information System (NIS/YP)
23.5. Automatic Network Configuration (DHCP)
23.6. Domain Name System (DNS)
23.7. Apache HTTP Server
23.8. File Transfer Protocol (FTP)
23.9. File and Print Services for Microsoft® Windows clients (Samba)
23.10. Clock Synchronization with NTP
24. 高级网络
24.1. 概述
24.2. 网关和路由
24.3. 无线网络
24.4. 蓝牙
24.5. 桥接
24.6. 无盘操作
24.7. ISDN
24.8. 网络地址转换
24.9. 平行线IP(PLIP)
24.10. IPv6
24.11. FreeBSD 5.X上的ATM
V. 附录
A. 获取 FreeBSD
A.1. CDROM 和 DVD 发行商
A.2. FTP 站点
A.3. 匿名 CVS
A.4. 使用 CTM
A.5. 使用 CVSup
A.6. CVS 标签
A.7. AFS 站点
A.8. 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. 开发者
Colophon
表格列表
2-1. 硬件设备清单
2-2. 为第一个硬盘分区
2-3. 为其它磁盘分区
2-4. 可能的安全等级
2-5. FreeBSD ISO映像文件名和含意
3-1. 磁盘设备的代码
16-1. 物理磁盘命名规则
17-1. Vinum Plex组织图
24-1. 为网络配平行线
24-2. 保留的IPv6地址
图形列表
2-1. 内核配置菜单
2-2. 配置内核可视化视觉接口
2-3. 展开驱动程序清单
2-4. 没有冲突的设备驱动程序状态画面
2-5. Sysinstall 主界面
2-6. 典型的设备探测结果
2-7. 选择离开Sysinstall
2-8. 选取Sysinstall主菜单的Usage项目
2-9. 选择说明文件菜单
2-10. Sysinstall说明文件菜单
2-11. Sysinstall 主菜单
2-12. Sysinstall 键盘对应菜单
2-13. Sysinstall 主菜单
2-14. Sysinstall 选项设置
2-15. 开始进行标准安装
2-16. 选择要分区的硬盘
2-17. 典型的尚未编辑前的Fdisk分区表
2-18. Fdisk 分区使用整个硬盘
2-19. Sysinstall 多重引导管理程序
2-20. 离开选择硬盘画面
2-21. Sysinstall Disklabel 编辑器
2-22. Sysinstall Disklabel 编辑器-使用自动配置
2-23. 根目录使用空间
2-24. 编辑要分区大小
2-25. 选择根分区类型
2-26. 选择根挂接点
2-27. Sysinstall Disklabel 编辑器
2-28. 选择软件包
2-29. 确认您要安装的软件包
2-30. 选择安装介质
2-31. 选择网卡设备
2-32. 配置 ed0接口
2-33. 编辑 inetd.conf配置文件
2-34. 默认的匿名FTP配置
2-35. 编辑FTP欢迎信息
2-36. 编辑 exports文件
2-37. 选择安全等级
2-38. 系统终端配置选项
2-39. 屏幕保护程序选项
2-40. 屏幕保护时间设置
2-41. 退出系统终端配置
2-42. 选择您所处的地理区域
2-43. 选择您所在的国家
2-44. 选择您所在的时区
2-45. 选择鼠标类型
2-46. 设置鼠标协议
2-47. 配置鼠标端口
2-48. 配置鼠标端口
2-49. 启动鼠标服务进程
2-50. 测试鼠标功能
2-51. Network Configuration Upper-level
2-52. 选择默认的 MTA
2-53. Ntpdate 配置
2-54. Network Configuration Lower-level
2-55. 选择配置方法菜单
2-56. 选择默认桌面
2-57. 选择软件所的种类
2-58. 选择软件包
2-59. 安装软件包
2-60. 确认安装的软件包
2-61. 选择用户
2-62. 添加用户信息
2-63. 退出用户和组管理
2-64. 退出安装
17-1. 串联组织
17-2. 分段组织
17-3. RAID-5 Organization
17-4. 一个简单的Vinum 卷
17-5. A Mirrored Vinum Volume
17-6. A Striped Vinum Volume
17-7. A Mirrored, Striped Vinum Volume
示例列表
2-1. 使用已存在的分区
2-2. 缩减已现在的分区
3-1. 样例磁盘, Slice, 和 Partition 它们的命名
3-2. 一个磁盘的布局
4-1. 在本地手动下载一个package,并安装它
11-1. 在 FreeBSD 4.X 上创建一个交换文件
11-2. 在 FreeBSD 5.X 上创建一个交换文件:
12-1. boot0 Screenshot
12-2. boot2的屏幕输出
12-3. /etc/ttys文件中的不安全控制台
13-1. 配置 adduser 和添加一个新用户,在FreeBSD 4.X版本
13-2. 添加一个新用户在FreeBSD 5.X版本
13-3. 删除用户 交互模式下的帐户删除
13-4. 以超级用户交互执行 chpass 命令
13-5. 以普通用户交互执行 chpass 命令
13-6. 改变你的口令
13-7. 改变其他用户的口令同超级用户的一样
13-8. 使用pw(8)添加一个组
13-9. 使用pw(8)在组中添加用户
13-10. 使用id(1)来决定组成员
14-1. Using SSH to Create a Secure Tunnel for SMTP
16-1. 通过 ssh 使用 dump
16-2. Using dump over ssh with RSH set
16-3. 一个建立启动磁盘的 shell 脚本例子:
16-4. Using vnconfig to Mount an Existing File System Image under FreeBSD 4.X
16-5. Creating a New File-Backed Disk with vnconfig
16-6. Using mdconfig to Mount an Existing File System Image under FreeBSD 5.X
16-7. Creating a New File-Backed Disk with mdconfig
16-8. Configure and Mount a File-Backed Disk with mdmfs
16-9. md Memory Disk under FreeBSD 4.X
16-10. Creating a New Memory-Based Disk with mdconfig
16-11. Creating a New Memory-Based Disk with mdmfs
20-1. 添加终端记录到/etc/ttys
22-1. 配置sendmail 访问数据库
22-2. 邮件别名
22-3. 虚拟域邮件映射的例子
23-1. inetd发送HangUP信号
23-2. Mounting an Export with amd
24-1. 办公室支部或家庭网
24-2. 主办公室或其它网络
A-1. 从 -CURRENT 检出些东西(ls(1)) 然后再删除:
A-2. 检出 ls(1) 在 3.X-STABLE 分支 中的版本:
A-3. 创建 ls(1) 的变化列表(用标准的 diff)
A-4. 找出可以使用的其它的模块名:

前言

Intended Audience

作为 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 系统并详细地介绍了如何在 FreeBSD 上使用 XFree86,也描述了通用的桌面环境,例如 KDEGNOME

第 6 章, Desktop Applications

Lists some common desktop applications, such as web browsers and productivity suites, and describes how to install them on FreeBSD.

第 7 章, Multimedia

Shows how to set up sound and video playback support for your system. Also describes some sample audio and video applications.

第 8 章, Configuring the FreeBSD Kernel

Explains why you might need to configure a new kernel and provides detailed instructions for configuring, building, and installing a custom kernel.

第 9 章, Printing

Describes managing printers on FreeBSD, including information about banner pages, printer accounting, and initial setup.

第 10 章, Linux Binary Compatibility

Describes the Linux compatibility features of FreeBSD. Also provides detailed installation instructions for many popular Linux applications such as Oracle, SAP R/3, and Mathematica®.

第 11 章,配置和调整

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

第 12 章,启动过程

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

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

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

第 14 章, 安全

本章描述为保证 FreeBSD 系统安全可以用到的不同工具,包括 Kerberos,IPsec,OpenSSH 和网络防火墙。

第 15 章, 强制访问控制

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

第 16 章,存储

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

第 17 章,Vinum

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

第 18 章,本地化

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

第 19 章, 最前沿

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

第 20 章,串行通信

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

第 21 章,PPP 和 SLIP

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

第 22 章, 电子邮件

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

第 23 章, 网络服务

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

第 24 章, 高级网络应用

描述了许多关于网络的主题,包括如何在您的局域网中共享 Internet 连接, 高级路由话题, 无线网络, 蓝牙, 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

% 开头的例子代表命令应该被普通账号执行。除非另有说明,C-shell 语法来设置环境变量和其他 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 商城有限公司, 向为改进这本手册以使其第三版印刷版本能够出版的志愿者支付了报酬。

I. 起步

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

  • FreeBSD入门。

  • 安装过程向导。

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

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

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

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


章 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 网络, 例如 SLIP,PPP,NFS,DHCP,还有 NIS。 这意味着您的 FreeBSD 主机可以很容易的和其他系统互操作, 也可以作为企业的服务器,提供重要的功能, 比如 NFS(远程文件访问)以及 email 服务或者将您的组织加入 Internet 提供 WWW,FTP,路由和防火墙(安全)服务。

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

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

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

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

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

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

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

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

  • CC++Fortran,和 Perl 开发工具的完整扩充。 许多附加的用于高级研究和开发的程序语言也可以在 ports 和 packages collection 中找到。

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

  • 丰富的在线文档

  • 还有非常多!

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])

    • 防火墙和 NAT(``IP 伪装'') 网关

    • 电子邮件服务器

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

    • 还有许多...

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

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

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

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

  • X Window 工作站:FreeBSD 是一个便宜的 X 终端解决方案的好的选择, 不管是使用可免费获得的 XFree86 服务器还是 Xi Graphics 提供的一个优秀的商业服务器。 不像 X 终端,如果需要的话 FreeBSD 允许许多程序在本地运行, 从而减少中央服务器的负担。 FreeBSD 甚至可以``无盘''启动, 让个人工作站更便宜而且容易管理。

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

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


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 分支的曙光,现在,采用了 ``current -stable 分支方法''。从那时迄今为止已经有了几个发行版本: 4.0-RELEASE 在 2000 年 3 月发布, 最近的 4.10-RELEASE 在 May 2004 发布。沿着 4.X-stable(RELENG_4)分支还会有几个后续版本,直到 2003 年。

期待已久的 5.0-RELEASE 在 2003 年 1 月 19 日发布。 它是将近三年工作的顶点,这个版本开始了 FreeBSD 对高级多处理器和应用程序线程的支持,并加入了对 UltraSPARCia64 平台的支持。这个版本接下来就是 2003 年 6 月发布的 5.1 版。除了许多新的特性,5.X 版本也包含了许多正在进行的系统结构方面的主要进展。然而,随着这些先进的机制, 带给系统极大数量的新的未经过广泛测试的代码。 因为这个原因,5.X 版本被看作是``新技术展示''版本,而 4.X 系列则作为``生产''版本。5.X 会被及时的公布为 stable 并开始着手下一个开发分支,6.0-CURRENT。

现在,对 5.X-CURRENT(trunk)分支的长期开发计划仍在继续着。 5.x 的 SNAPshot 版本 CDROM(当然,还有网络)一直作为工作进程在 the snapshot server 上制作。


1.3.2. FreeBSD 项目目标

Contributed by Jordan Hubbard.

FreeBSD 项目的目标是为那些不管出于什么目的, 不需要有任何限制的人提供软件。 我们中的许多人对代码(和计划)都有非常大的投入和研究, 当然也不介意一些资金上的补偿,不管是现在或者将来。 但是,我们确定不准备坚持这么做。 我们认为我们的首要``使命''是为任何人和新来者提供代码, 不管他们出于什么目的。以便代码能得到最大限度的利用, 带给使用者最大的好处。 我认为这是自由软件和我们的狂热支持者的一个最基本的目标。

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


1.3.3. FreeBSD 开发模式

撰写者 Satoshi Asami.

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

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

CVS 代码库

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

committer 列表

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

FreeBSD 核心团队

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

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

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

外围贡献者

事实上,最大的开发团队正是为我们提供反馈和错误修补的用户自己。 FreeBSD 的非集中式的开发者保持联系的主要方式就是预订 FreeBSD technical discussions 邮件列表,很多事情在那里讨论。查看附录 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 以及来自 自由软件基金会 的一些东西。

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

除了最基本的系统软件,FreeBSD 还提供了一个拥有成千上万广受欢迎的程序组成的软件的 ports collection。 到本书付印时,已有超过 10,500 个 ports (ports 包括从 http(WWW) 服务器到游戏、程序设计语言、编辑器以及您能想到的几乎所有的东西。 完整的 ports collection 大约需要 300 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也会尝试为这些设备找出最适当的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, on COM1
...      

2.2.2. 备份你的数据

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


2.2.3. 决定要将FreeBSD安装到哪里

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

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


2.2.3.1. i386™体系结构的硬盘分配方式

一个PC硬盘可以被细分为许多分散的区域。这些区域叫做 分区(partitions)。 由于设计的原因,每个硬盘仅 支持四个分区;这些分区叫做主分区(Primary partion)。 为了突破这个限制以便能使用更多的分区,就有了新的分区类型,叫做 扩展分区(Extended partition)。一个硬盘可以拥有一个扩展分区。在 扩展分区里可以建立许多个所谓的逻辑分区(Logical partitions)

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

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

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

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

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

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

您可以使用商业软件,例如PartitionMagic®(硬盘分区魔术师) 来建立给FreeBSD使用的空间。FreeBSD光盘的tools 目录包含两个免费的工具也可以完成这个工作:FIPS 以及 PResizer,它们的文档可以在同一目录中找到。FIPS, PResizer, 和PartitionMagic 能够改变FAT16 以及 FAT32分区大小-- 在MS-DOS方式下使用以及 Windows ME。这些工具的说明文件可以在同一个目录下面找到 PartitionMagic是唯一知道能改变NTFS 分区大小的应用软件。

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

例子 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.2.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.2.4. 收集你的网络配置相关资料

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


2.2.4.1. 使用以太网或电缆/DSL Modem

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

  1. IP 地址。

  2. 默认网关IP地址。

  3. 主机名称。

  4. DNS服务器的IP地址。

  5. 子网掩码。

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


2.2.4.2. 使用Modem连接

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

您必须知道:

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

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

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


2.2.5. 检查 FreeBSD 发行勘误

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

虽然我们尽力使得每个FreeBSD释出版本都很稳定,但是过程中仍然不免有时 会发现错误。在很罕见的情形下,这些错误会影响到安装过程。当我们发现这些 错误并且修正后,会将它们列在FreeBSD网站的 FreeBSD Errata(勘误表)中, 在您安装FreeBSD前应该 先看看勘误表中有没有什么问题会影响到您的安装。

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


2.2.6. 准备安装介质

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

安装介质

  • 光盘CDROM or DVD

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

  • SCSI or QIC 磁带

  • 软盘

网络

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

  • NFS 服务器

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

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

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


2.2.7. 准备引导介质

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

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

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

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

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

    软盘映像文件的扩展名为 .flp。在 floppies/ 目录下包含了许多不同的映像文件,根据您 要安装的FreeBSD版本有不同的映像文件;有时候不同的硬件也需要不同的映像 文件, 在大部分的情形下,您需要两个文件: kern.flpmfsroot.flp. 另处不同的系统可能需要额处的硬件 驱动程序。这些驱动程序在 drivers.flp 映像文件里 提供。查看同一目录下的 README.TXT 文件以获得最新 的软盘映像文件信息。

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

  2. 准备软盘

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

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

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

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

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

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

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

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

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

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

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

你现在可以安装FreeBSD了


2.3. 开始安装

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

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.3.1. 开机启动

2.3.1.1. 引导i386系统

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

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

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

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

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

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

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

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

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

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

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

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

    Verifying DMI Pool Data ........
    Boot from ATAPI CD-ROM :
     1. FD 2.88MB  System Type-(00)
    Uncompressing ... done
    
    BTX loader 1.00 BTX version is 1.01
    Console: internal video/keyboard
    BIOS drive A: is disk0
    BIOS drive B: is disk1
    BIOS drive C: is disk2
    BIOS drive D: is disk3
    BIOS 639kB/261120kB available memory
    
    FreeBSD/i386 bootstrap loader, Revision 0.8
    
    /kernel text=0x277391 data=0x3268c+0x332a8 |
    
    |
    Hit [Enter] to boot immediately, or any other key for command prompt.
    Booting [kernel] in 9 seconds... _
    

    如果您是从软盘引导,会看到类似下面的画画:

    Verifying DMI Pool Data ........
    
    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 0.8
    
    /kernel text=0x277391 data=0x3268c+0x332a8 |
    
    Please insert MFS root floppy and press enter:
    

    按照指示,将kern.flp 软盘取出,放入 mfsroot.flp 软盘,然后按Enter

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

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

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


2.3.1.2. 引导Alpha系统

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

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

  3. 如您需要准备安装软盘,请参考第 2.2.7 节 。 将用kern.flp做的引导盘放入软驱中然后输入下列命令 (请视实际情况修改命令中的软驱盘符):

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

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

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

    Please insert MFS root floppy and press enter:
    

    按照屏幕指示,将 kern.flp 软盘取出,换上 mfsroot.flp 然后按Enter键。

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

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

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


2.3.2. 配置内核

注: 从FreeBSD 5.0版以后, 用户配置已经不赞成使用新的 device.hints(5) 方法,更多的信息device.hints(5)请访问 第 12.5 节

内核 是操作系统最核心的部分。它负责很多工作,包括 存取系统上所有设备,如硬盘、网卡、声卡等等。每一个FreeBSD核心支持的设备都有其 相对应的驱动程序。这些驱动程序的名称由两个或三个字母级成,譬如: sa 表示SCSI存取驱动程序;sio 表示串口I/O驱动程序(管理COM端口)。

录内核启动的时候,每个驱动程序会检查系统中是否有它所支持的设备。如果找到 的话,这些驱动程序就会配置这些设备的状态以代核心使用。

上述设备的检查我们称做 device probing(设备探测). 但是很不幸地,这样做并不是完全安全的。因为有些硬件驱动程序没有办法想到共存, 有时找到这个设备却让另一个设备处在不稳定的状态。这是 PC 设计上的限制。

许多早期的称作ISA的设备--(相对于PCI设备而言)。ISA设备的规格需要将硬件的某些 数据写死在设备上,最具代表性的就是中断号(IRQ)以及IO端口号。这些设定值通常是通 过改变设备上的jumpers(跳线) ,或是使用由厂商提供的DOS工 具程序来改变。

这通常是问题的所在,因为这没办法让两个设备共同分享一个IRQ或是IO端口 地址。

新的设备都按照PCI规格设计,这些设备就没有上述限制;它们会参考BIOS 中的设定然后动态分配IRQ及IO端口地址。

如果您的系统中有任何ISA设备,那么在设置FreeBSD驱动程序的时候您就 必须指定这些设备的IRQ及IO地址。这也是我们在 第 2.2.1 节一节中希望您先准备一份设备清单的用意。

仍然很不幸地,预设给某些设备使用的IRQ会跟内存地址互相冲突。这是因为 有些ISA设备出厂的设定值就会跟其它的设备冲突。撇开这个不谈,FreeBSD驱动 程序通常都会根据各制造商设备的出厂设定值来设定,这也是为什么许多设备可 以在FreeBSD顺利驱动的原因。

在跑FreeBSD的时候根本不会有上冲突的问题,因为当两个设备互相冲突的 时候,其中一个设备将被停用(不论您用的是哪种操作系统)。

通常在第一次安装FreeBSD的时候才会有问题,因为内核希望尽是多包含一 些驱动程序,这样才能支持许多不同设备的配置。这意味着在找到的这些设备中 有可能设定值会互相冲突。FreeBSD在探测系统设备的时候会按照一的顺序,如 果您的某个设备在较后面探测到,但是跟前面找到的设备设定冲突,那么在安装 FreeBSD的时候,这个设备不一定能正确雇用。

因为如此,当您在安装FreeBSD前,可以先看看在系统内核中包含了哪些驱 动程序,如果您没有某些设备,则可以将它们的驱动程序删除或是在稍后您也 可以确认您有的设备的设定值有没有问题。

这听起来好像很复杂,但不全然如此。

图形 2-1 显示的是内核能设置的第一个配置菜单。 我们推荐您选择Start kernel configuration in full-screen visual mode 选项, 因为这对新手来说比较容易。

图形 2-1. 内核配置菜单

内核配置画面 (图图形 2-2) 被分成四个部分:

  1. 在``active(可用)''区域的展开式选择菜单分为四个群,例如 Storage(储存设备)Network(网络设备)。 每个设备会显示一个对应的说明、由二或三个字母组成的驱动程序名称以及驱动程序 所使用的IRQ和内存地址。另外,如果可用的驱动程序跟另一个可用的驱动程序有冲突, 它们的驱动程序名称之后会显示 CONF 字样。同时栏目标题也会 显示在可用的设备中总共有几个设备有冲突。

  2. 在Inactive(停用)区域的驱动程序仍然保留在内核中,但当内核启动的时候 并不会探测这些设备。这个区域的分组方式跟可用区一样。

  3. 第三区(信息显示区)显示的是目前所选择设备的细节项目设置,包括IRQ及 IO端口地址。

  4. 第四区告诉您这个画面的操作按键。

图形 2-2. 配置内核可视化视觉接口

在这个阶段,您总是会看到有冲突的设备被列出。请不要担心,因为这是正 常的;前面提到在安装的时候所有的设备都会被启用,而其中的某些设备就会跟 其它的设备产生冲突。

现在您必须逐一检查这些设备驱动程序,然后解决冲突的问题。

解决驱动程序冲突

  1. 按下 X键可以将所选择区域的驱动程序完全展开以方便您 检阅。您可以使用方向键在可用设备区前后移动。

    图形 2-3 显示按下 X键 后的结果。

    图形 2-3. 展开驱动程序清单

  2. 停用任何您没有的设备的驱动程序。要停用一个设备,用方向键移动将该 设备反白然后按下 Del键,则此设备驱动程序就会被移到 Inactive Drivers(停用设备区) 列表。

    如果您不小心将一个设备停用,那么请按Tab 切换到 Inactive Drivers 区, 选择被停用的设备,然后按下 Enter键将它移回可用设备区。

    警告请不要移除sc0。这个驱动程序是控制屏幕 用的,除非您是通过串行线进行安装,否则请不要移除它。

    警告如果您用的是USB键盘才可以停用 atkbd0 用一般 的键盘请保留此atkbd0设备驱动程序。

  3. 如果现在显示没有冲突,那么您可以跳过这一步骤。否则,剩下的冲突还是必 须解决。如果在信息显示区没有看到 ``allowed conflict(允许冲突)'', 那么您必须改变这边显示的IRQ及内存地址, 必须变更设备 上面的IRQ及内存地址。

    要改变设备驱动程序的IRQ及IO端口地址,选择要变更的驱动程序然后 按 Enter键。之后等光标移到第三区(信息显示区)时候您就 可以理发这些设置。您应该输入之前做硬件清单列表的时候所记录的IRQ及IO端 口地址。要完成更改请按 Q 键并回到可用设备区。

    如果您不确定该设定什么值,那么可以试试看 -1。 有些FreeBSD驱动程序在搜寻设备的时候可以安全找出设备的正确设定值;所以这里设置 -1 就是告诉这些驱动程序自行去尝试找出合适的设置。

    如果要直接在设备硬件上改变设定值,设定的方法每种设备都不大相同。有些 设备您必须将它从电脑中拆下来然后调整路线或是DIP开关;其它的可能厂商会提供DOS 工具软盘,里面有程序可以更改这些设定。不论是哪一种方式,您都应该参考设备所附 的使用手册。很明显地,改变这些设定值必须重新开机后才会生效,所以您必须重新进 入FreeBSD安装程序。

  4. 当所有的冲突都解决了以后,您会看到类似图形 2-4 的画面。

    图形 2-4. 没有冲突的设备驱动程序状态画面

    如您所见,可用设备列表变得干净多了,只列出您系统中有的设备。

    现在您可以储存所做的改变,然后进到下一个安装步骤。按 Q 键离开设备配置界面,您会看到下面的信息:

    Save these parameters before exiting? ([Y]es/[N]o/[C]ancel)
    

    回答 Y 保存配置到内存(安装完成后将后保存到磁盘)然后开始 探测设备。在设备探测完毕后,sysinstall 就会启动并且显 示它的主界面。(图形 2-5)。

    图形 2-5. Sysinstall 主界面


2.3.3. 查看设备探测的结果

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

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

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

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

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找到所有您期望出现的设备。如果设备没有 探测到,那么就不会列出。如果此设备需要设定IRQ以及IO端口地址,请您再确定 是否设定的正确。

如果你需要改变某些设备的设置,您可以很容易地退出 sysinstall 程序,然后从头重新来过。这也有助您熟悉这些过程。

图形 2-7. 选择离开Sysinstall

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

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

                            [ Yes ]    No

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

如果您是从软盘启动,那么重新开机前您必须将 mfsroot.flp 软盘取出再换上kern.flp 软盘。


2.4. 介绍 Sysinstall

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

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

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

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

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


2.4.1. 选择 Documentation(说明文件) 菜单

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

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

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

图形 2-10. Sysinstall说明文件菜单

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

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

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


2.4.2. 选择键盘对应(Keymap)菜单

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

图形 2-11. Sysinstall 主菜单

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

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

图形 2-12. Sysinstall 键盘对应菜单


2.4.3. 安装选项设置画面

选择 Options 然后按Enter键。

图形 2-13. Sysinstall 主菜单

图形 2-14. Sysinstall 选项设置

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

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

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

Q 键可以回到主画面。


2.4.4. 开始进行标准安装

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

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


2.5. 分配磁盘空间

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


2.5.1. BIOS 磁盘编号

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

在pc架构,当您跑像MS-DOSMicrosoft Windows这种跟BIOS相关的操作 系统的时候,BIOS有能力改变正常的磁盘顺序,然后这些操作系统会跟着BIOS做改变以。 这让使用者不一定非要有所谓的 ``primary master''硬盘开机。许多人发 现最简单而便宜备份系统的方式就是再去买一块一模一样的硬盘,然后定期将数据从第 一块硬盘复制到第二个硬盘,使用 Ghost®XCOPY。所以,当第一个硬盘死了,或者是被病毒破坏, 或者有坏轨道,他们可以调整BIOS中的开机顺序而直接用第二块硬盘开机。这跟将机壳 拆开,把第二块硬盘跟第一块硬盘对调(要调jumper)有同样的效果,差别就是不用拆壳; 因此,对有这方面需求的人而言,直接在BIOS中设定非常方便。

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

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

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


2.5.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-16 范例显示的是有找到两个IDE硬盘的情形,这两个硬盘分别为 ad0 and ad2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如果要删除已的分区以空出空间给FreeBSD,您可以将光标移动到要删除 的分区后按 D键。然后就可按 C键,会出现 对话框请您输入要创建的分区的大小。输入合适的大小后按 Enter 键。默认情况下,这个对话框中的值为您可以给这个分区分配的可能的最大值。 它可能是最大的邻接分区或未分配的整个硬盘大小。

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

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

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


2.5.3. 安装多重引导

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

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

  • 你可以在一个硬盘上,除了FreeBSD,您还有安装其它的操作系统;然后 您想要选择在开机的时候要进入哪个系统。

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

选择好配置后请按 Enter

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

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


2.5.4. 在其它硬盘上创建分区

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

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

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

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

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


2.5.5. 使用Disklabel 创建分区

您现在必须在刚刚建立好的分区中规划一些分区。请记住,每个分区代号是 ah, 并且分区 partitions b, c以及 d 为习惯使用的特殊分区,不应该随意变动。

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

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

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

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

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

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

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

如果您要将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-21 显示您第一次执行 Disklabel的画面。画面分为三个区域。

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

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

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

图形 2-21. Sysinstall Disklabel 编辑器

Disklabel 您可以自动配置分区以及给它们预设 的大小。您可以按 A键使用此功能。你会看到类似 图形 2-22的画面。根据您硬盘的大小,自动分配所配置 的大小不一定合适。但是没有关系,您并不一定要使用预设的大小。

注: 从 FreeBSD 4.5开始,自动配置会给/tmp 目录一个独立分区,而不是附属在 / 之下。这样可以 避免将一些临时文件放到根目录中(译注:可能会用完根目录空间)。

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

如果要删除自动配置的分区,然后想自行建立,您可以使用方向键移到第一 个分区,然后按D 键删除它。重复此动作直到删除所有自动配置 的分区。

要建立第一个分区(a, 挂接点为/ -- 根目录),先确定画现上方的硬盘slice有被选取(反蓝),然后按下 C 键。接着会出现一个对话框询问您要配置的分区大小(如 图形 2-23) 您可以输入要的block数量或是(译注:通常会)输入想使用的大小,然后后面另上 M 表示MB、G GB或是 C 表示(柱面)。

注: 从 FreeBSD 5.X版本开始,用户可以:选择 Custom Newfs 选项来使用UFS2 (Z) ,使用Auto Defaults 来创建 labels ,并使用 Custom Newfs选项来修改它们。 或是在创建时加上-O 2规则。如果你使用了Custom Newfs 标记不要忘了添加-U标记来升级它们。

图形 2-23. 根目录使用空间

显示在对话框中的默认大小是使用整个分区,您可以用 Backspace键删除这些数字然后按照上述方式输入您想要的 大小,如64M图形 2-24), 然后按[ OK ]

图形 2-24. 编辑要分区大小

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

图形 2-25. 选择根分区类型

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

图形 2-26. 选择根挂接点

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

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

图形 2-27. Sysinstall Disklabel 编辑器


2.6. 选择要安装的软件包

2.6.1. 选择要安装的软件包

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

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

如果您想要使用图形界面,您必须选择软件包名称开头是 X 的软件包。 XFree86 的配置以及选择其默认桌面管理 员必须等到安装完毕后再来做。

XFree86 的版本依赖于您正在安装的FreeBSD 的版本。如果您安装的是FreeBSD 4.6以前的版本,那么默认的情况下安装 XFree86 3.X 版本。如果您安装的 FreeBSD 4.6 以后的版本,那么默认情况下安装XFree86 4.X 版本。

您应该到XFree86 网站看看您的显卡有没有被您安装的FreeBSD所支持。您也可以选择不安装 图形界面,等安装完成后,再通过ports collection来安装和配置适合版本 的XFree86

如果您以后要自己编译内核,那么请您选择包含原始代码的软件包。如果您 想知道为什么要建立自订的内核或是如何建立自订的内核,请参考 第 8 章

很明显,安装容量最大的当然就是全部安装啦。如果您的硬盘够大,您 可以选择All (如图 图形 2-28 )然后按下 Enter。 如果您的硬盘空间有问题,那么请选择适合您情部的软件包。在安装完毕后, 您还是可以安装其它的软件。

图形 2-28. 选择软件包


2.6.2. 安装ports软件包

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

安装程序并不会检查您是否有足够的硬盘空间来放ports,所以,如果要安装 ports软件所,请先确定您有足够的硬盘空间。 FreeBSD 5.2.1版本 FreeBSD Ports Collection 大约占用 300 MB 大小的硬盘空间。您要为 这些版本设置大一点的值来安装它们。

                         User Confirmation Requested
 Would you like to install the FreeBSD ports collection?

 This will give you ready access to over 10,500 ported software packages,
 at a cost of around 300 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-29. 确认您要安装的软件包

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


2.7. 选择您要使用的安装介质

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

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

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

图形 2-30. 选择安装介质

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服务器的地址。

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

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

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


2.8. 安装确认

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

                       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: /stand/sysinstall .

                                 [ OK ]

                      [  Press enter to continue  ]

按下 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.9. 安装后的配置

如果安装成功,您将可以对一些基本的项目作安装后初步的配置。任何一项 配置在重新开机前都可以重新配置,系统会使用最后一次的配置值。重新开机后 如果再做配置,可以执行/stand/sysinstall 命令然后选择 Configure选项。


2.9.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-31. 选择网卡设备

用方向键选择您要配置的网卡接口,然后按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, 如果成功,它会自动将网络配置信息填上。更多的信息请参考 第 23.5 节

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

图形 2-32. 配置 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

子网掩码

本范例中的IP地址属于一个C类地址 (192.168.0.0 - 192.168.255.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.9.2. 配置网关

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

                              [ Yes ]    No

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


2.9.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 配置文件来启用它们。请参阅 第 23.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-33. 编辑 inetd.conf配置文件

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


2.9.4. 匿名 FTP

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

                              Yes    [ No ]

2.9.4.1. 不允许匿名 FTP访问

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


2.9.4.2. 允许匿名 FTP访问

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

要启用FTP匿名访问,用方向键选择 [ Yes ] 然后按 Enter键。您会看到下面(或类似)的画面:

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

F1 键可以查看在线帮助文档:

This screen allows you to configure the anonymous FTP user.

The following configuration values are editable:

UID:     The user ID you wish to assign to the anonymous FTP user.
         All files uploaded will be owned by this ID.

Group:   Which group you wish the anonymous FTP user to be in.

Comment: String describing this user in /etc/passwd


FTP Root Directory:

        Where files available for anonymous FTP will be kept.

Upload subdirectory:

        Where files uploaded by anonymous FTP users will go.

默认的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-35. 编辑FTP欢迎信息

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

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


2.9.5. 配置网络文件系统

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


2.9.5.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-36. 编辑 exports文件

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

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


2.9.5.2. NFS 客户端

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

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

                              Yes   [ No ]

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


2.9.6. 安全配置

``安全配置'' 中包含了一些可以通过启用或停用某些程序 来达到某些程序的安全性配置。安全配置越严格,则默认启动的程序就越少。 基本的原则是:除非必要,否则不要执行一些可有有无的程序。

请注意,安全文件的配置都是默认值,在安装完成后您可以随时通过 编辑 /etc/rc.conf配置文件来改变这些配置。 如果想得到更多的信息请参阅 rc.conf(5) 手册。

下表说明每一种安全等级的意义。每列所代表的是安全等级,每行所 代表的是程序或功能是启用还是停用。

表格 2-4. 可能的安全等级

  极/高度安全 中度安全
sendmail(8)
sshd(8)
portmap(8) 不一定 [a]
NFS server
securelevel(8) [b]
注:
a. 如果之前安装时配置机器为NFS客户端或服务器,则会启用些 项目。
b. 如果您选择的安全等级配置 securelevel 为 ``极度或高度'' 或 ``High'',请阅读init(8)手册并特别注意有关安全 等级意义的部分;否则稍后您可能会过到很大的困难!
                       User Confirmation Requested
 Do you want to select a default security profile for this host (select
 No for "medium" security)?

                            [ Yes ]    No

选择 [ No ] 并按 Enter 会将安全等级高为中度安全。

选择 [ Yes ] 并按 Enter将允许您选择不同程序的安全等级。

图形 2-37. 选择安全等级

F1 显示在线帮助;按Enter 键可以回到选择画面。

如果您没有什么特殊的等级需求,请用方向键选择 中度, 确定选择了 [ OK ] 然后按Enter

依据您选择的安全等级,会显示相对应的确认信息。

                                 Message

Moderate security settings have been selected.

Sendmail and SSHd have been enabled, securelevels are
disabled, and NFS server setting have been left intact.
PLEASE NOTE that this still does not save you from having
to properly secure your system in other ways or exercise
due diligence in your administration, this simply picks
a standard set of out-of-box defaults to start with.

To change any of these settings later, edit /etc/rc.conf

                                  [OK]
                                 Message

Extreme security settings have been selected.

Sendmail, SSHd, and NFS services have been disabled, and
securelevels have been enabled.
PLEASE NOTE that this still does not save you from having
to properly secure your system in other ways or exercise
due diligence in your administration, this simply picks
a more secure set of out-of-box defaults to start with.

To change any of these settings later, edit /etc/rc.conf

                                  [OK]

按下 Enter 继续安装后面的配置。

警告安全等级并非万能药!即使您选择极度安全,您还是必须时常阅读 第 C.1 节邮件列表中有关安全的部分、使用有效的密码以及平常就注意安全问题。 这里只是稍为配置一下常用的安全等级而已。


2.9.7. 配置系统终端

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

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

                              [ Yes ]  No

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

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

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

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

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

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

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

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

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

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


2.9.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-42. 选择您所处的地理区域

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

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

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

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

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

                            Confirmation
            Does the abbreviation 'EDT' look reasonable?

                            [ Yes ]   No

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


2.9.9. Linux 兼容性

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

                            [ Yes ]   No

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

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


2.9.10. 配置鼠标

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

                      User Confirmation Requested
         Does this system have a non-USB mouse attached to it?

                            [ Yes ]    No

如果您使用的不是USB鼠标,请选择 [ Yes ] ; 否则请选择 [ No ] 。然后按Enter

图形 2-45. 选择鼠标类型

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

图形 2-46. 设置鼠标协议

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

图形 2-47. 配置鼠标端口

选择 Port 然后按 Enter

图形 2-48. 配置鼠标端口

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

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

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

图形 2-50. 测试鼠标功能

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

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


2.9.11. 配置额外的网络服务

配置网络服务总是让那些新手敬畏,因为他们缺乏在这个领域应有的基础知识。 网络,包括因特网有许多关于现代操作系统包括 FreeBSD;的评论文章。这些文章对于 理解FreeBSD拥有的广泛的网络性能是非常有帮助的。在安装这些服务的过程中也能让 用户理解它们可用的各种服务。

网络服务是一些可以使在网络的任何人来访问你提供的服务的程序。有许多 努力想使这些程序不会有任何的 ``伤害''。不幸的是,这些程序并 不是十全十美的,黑客可能会撑握程序中的一些露洞来进行功击。只启用一些你 熟悉的和需要的服务十分重要。如果你存在一些疑虑或没有启用这些服务的必要 那么最好不要使用这些服务。你可以事后通过运行 sysinstall 程序或使用 /etc/rc.conf 配置文件来启用它们。

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

图形 2-51. Network Configuration Upper-level

第一个选项,Interfaces, 已经在前面 第 2.9.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 配置菜单可以使本机器成为一台以前我们提到过 的网关。如果你在安装过程中偶尔选中了它,也可以在这里选中这个选项来取消。

Inetd 选项用来配置或完全禁止我们在上面讨论的 inetd(8) 守护程序。

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

图形 2-52. 选择默认的 MTA

这里给你提供了一个安装默认MTA 的机会。 MTA 用来投递本系统上用户邮件到因特网去。

选择 Sendmail 将会安装 FreeBSD默认的 流行的的 sendmail 服务程序。 Sendmail local 选项用来设置sendmail 默认的MTA,也可以禁止它从Internet接收邮件的能力。 还有其它的一些选项如: PostfixExim 都类似于 Sendmail的角色。它们两者也可以投递邮件; 有些用户更喜欢选择使用SendmailMTA二者之一。

选择 MTA或不选择它之后,网络配置菜单的下一 个选项是 NFS client 客房端程序。

NFS client 客房端可以使系统通过 NFS 与服务器进行通信。 NFS 服务器通过NFS 协议可以使其它在网络上的机器来访问自己的文件系统。如果这台机器要作为一台 独立的服务器,这个选项可以保留不选。下面可能还有更多的配置,关于客户端和 服务器的配置请参阅第 23.3 节 一节。

接下来的 NFS 服务器选项,可以允许你把系统设备成 为一台NFS 服务器。这需要更多的信息来启动远程过程调 用( RPC)服务。 RPC用来连接调 用两台机器上的程序。

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

图形 2-53. Ntpdate 配置

从这个菜单选择一个离你最近的服务器。在你连接这台服务器时,除去 连接时的反应时间,时间同步最精确的服务器。

下一个选项是 PCNFSD 。这个选项将从安装包中 安装net/pcnfsd 软件。这个程序 能够为不能提供它们自己,例如微软的 MS-DOS 操作系统提供 NFS 的认证服务。

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

图形 2-54. Network Configuration Lower-level

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 功能。当许多主机以高速连接本机时,可 能会引起某些连接被丢弃。我们不推荐使用这个选项,但是当使用独立的主机 时可以从它上面得到一些好处。

现在你已经配置完成了网络服务,你可以滚动屏幕到顶部选择 Exit 项,退出进入下一个配置部分。


2.9.12. 配置 X Server

为了使用图形化用户界面,例如KDE, GNOME,或其它窗口管理程序,您必须 配置 X server 。

注: 为了以非root用户运行 XFree86 您必须安装 x11/wrapper 软件。在FreeBSD 4.7及以上 版本是默认安装的,但以前的版本要手工安装到系统中。

要知道您的显卡是否被支持,请参考 XFree86 网站。

                      User Confirmation Requested
        Would you like to configure your X server at this time?

                            [ Yes ]   No

警告您必须知道您的显示器及显卡的制造规格。如果配置有误,有可能造成设备 损毁。如果您手边没有这样的信息,请选择 [ No ] 并且等到您有这些信息后再执行 /stand/sysinstall程序,选择 Configure 下的 XFree86来配置。这时如果配置X server 不正确的话系统会出现锁死。建议在安装完毕后再配置X server。

如果您有显卡和显示器的信息,请选择 [ Yes ] 并按 Enter 来配置 X-server。

图形 2-55. 选择配置方法菜单

您可以通过许多方法来配置 X server。在认真读了所有的说明后, 请使用方向键来选择一种配置方式,并按Enter。 键确认。

xf86cfgxf86cfg -textmode 配置方法可能会使屏幕黑屏一会 过一会即会启动。要有耐心。

下面将介绍xf86config 配置工具。 根据系统硬件的不同,下面的信息可能会适当的发生变动:

                                Message
 You have configured and been running the mouse daemon.
 Choose "/dev/sysmouse" as the mouse port and "SysMouse" or
 "MouseSystems" as the mouse protocol in the X configuration utility.

                                 [ OK ]

                      [ Press enter to continue ]

这个信息指明,前面配置的鼠标驱动程序被检测到。按 Enter 键继续。

启动 xf86config 后会显示一个简单的说明:

This program will create a basic XF86Config file, based on menu selections you
make.

The XF86Config file usually resides in /usr/X11R6/etc/X11 or /etc/X11. A sample
XF86Config file is supplied with XFree86; it is configured for a standard
VGA card and monitor with 640x480 resolution. This program will ask for a
pathname when it is ready to write the file.

You can either take the sample XF86Config as a base and edit it for your
configuration, or let this program produce a base XF86Config file for your
configuration and fine-tune it.

Before continuing with this program, make sure you know what video card
you have, and preferably also the chipset it uses and the amount of video
memory on your video card. SuperProbe may be able to help with this.

Press enter to continue, or ctrl-c to abort.

Enter 将启动鼠标配置。请按照指示选择 ``Mouse Systems'' 作为鼠标协议, /dev/sysmouse 作为鼠标端口。下面的例子 向你说明的是使用一个 PS/2 鼠标:

First specify a mouse protocol type. Choose one from the following list:

 1.  Microsoft compatible (2-button protocol)
 2.  Mouse Systems (3-button protocol) & FreeBSD moused protocol
 3.  Bus Mouse
 4.  PS/2 Mouse
 5.  Logitech Mouse (serial, old type, Logitech protocol)
 6.  Logitech MouseMan (Microsoft compatible)
 7.  MM Series
 8.  MM HitTablet
 9.  Microsoft IntelliMouse

If you have a two-button mouse, it is most likely of type 1, and if you have
a three-button mouse, it can probably support both protocol 1 and 2. There are
two main varieties of the latter type: mice with a switch to select the
protocol, and mice that default to 1 and require a button to be held at
boot-time to select protocol 2. Some mice can be convinced to do 2 by sending
a special sequence to the serial port (see the ClearDTR/ClearRTS options).

Enter a protocol number: 2

You have selected a Mouse Systems protocol mouse. If your mouse is normally
in Microsoft-compatible mode, enabling the ClearDTR and ClearRTS options
may cause it to switch to Mouse Systems mode when the server starts.

Please answer the following question with either 'y' or 'n'.
Do you want to enable ClearDTR and ClearRTS? n

You have selected a three-button mouse protocol. It is recommended that you
do not enable Emulate3Buttons, unless the third button doesn't work.

Please answer the following question with either 'y' or 'n'.
Do you want to enable Emulate3Buttons? y

Now give the full device name that the mouse is connected to, for example
/dev/tty00. Just pressing enter will use the default, /dev/mouse.
On FreeBSD, the default is /dev/sysmouse.

Mouse device: /dev/sysmouse

下一个要配置的项目是键盘。在例子中使用的键盘一般是101-key 。你可以选择不 同的键盘类型或直接按 Enter 键来使用默认配置。

Please select one of the following keyboard types that is the better
description of your keyboard. If nothing really matches,
choose 1 (Generic 101-key PC)

  1  Generic 101-key PC
  2  Generic 102-key (Intl) PC
  3  Generic 104-key PC
  4  Generic 105-key (Intl) PC
  5  Dell 101-key PC
  6  Everex STEPnote
  7  Keytronic FlexPro
  8  Microsoft Natural
  9  Northgate OmniKey 101
 10  Winbook Model XP5
 11  Japanese 106-key
 12  PC-98xx Series
 13  Brazilian ABNT2
 14  HP Internet
 15  Logitech iTouch
 16  Logitech Cordless Desktop Pro
 17  Logitech Internet Keyboard
 18  Logitech Internet Navigator Keyboard
 19  Compaq Internet
 20  Microsoft Natural Pro
 21  Genius Comfy KB-16M
 22  IBM Rapid Access
 23  IBM Rapid Access II
 24  Chicony Internet Keyboard
 25  Dell Internet Keyboard

Enter a number to choose the keyboard.

1


Please select the layout corresponding to your keyboard


  1  U.S. English
  2  U.S. English w/ ISO9995-3
  3  U.S. English w/ deadkeys
  4  Albanian
  5  Arabic
  6  Armenian
  7  Azerbaidjani
  8  Belarusian
  9  Belgian
 10  Bengali
 11  Brazilian
 12  Bulgarian
 13  Burmese
 14  Canadian
 15  Croatian
 16  Czech
 17  Czech (qwerty)
 18  Danish

Enter a number to choose the country.
Press enter for the next page

1


Please enter a variant name for 'us' layout. Or just press enter
for default variant

us


Please answer the following question with either 'y' or 'n'.
Do you want to select additional XKB options (group switcher,
group indicator, etc.)? n

接下来,我们要配置显示器。不要超过你显示器的刷新频率,这样可以 会损坏你的显示器。如果你有疑问,请参考其它信息后再做配置。

Now we want to set the specifications of the monitor. The two critical
parameters are the vertical refresh rate, which is the rate at which the
whole screen is refreshed, and most importantly the horizontal sync rate,
which is the rate at which scanlines are displayed.

The valid range for horizontal sync and vertical sync should be documented
in the manual of your monitor. If in doubt, check the monitor database
/usr/X11R6/lib/X11/doc/Monitors to see if your monitor is there.

Press enter to continue, or ctrl-c to abort.



You must indicate the horizontal sync range of your monitor. You can either
select one of the predefined ranges below that correspond to industry-
standard monitor types, or give a specific range.

It is VERY IMPORTANT that you do not specify a monitor type with a horizontal
sync range that is beyond the capabilities of your monitor. If in doubt,
choose a conservative setting.

    hsync in kHz; monitor type with characteristic modes
 1  31.5; Standard VGA, 640x480 @ 60 Hz
 2  31.5 - 35.1; Super VGA, 800x600 @ 56 Hz
 3  31.5, 35.5; 8514 Compatible, 1024x768 @ 87 Hz interlaced (no 800x600)
 4  31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Hz interlaced, 800x600 @ 56 Hz
 5  31.5 - 37.9; Extended Super VGA, 800x600 @ 60 Hz, 640x480 @ 72 Hz
 6  31.5 - 48.5; Non-Interlaced SVGA, 1024x768 @ 60 Hz, 800x600 @ 72 Hz
 7  31.5 - 57.0; High Frequency SVGA, 1024x768 @ 70 Hz
 8  31.5 - 64.3; Monitor that can do 1280x1024 @ 60 Hz
 9  31.5 - 79.0; Monitor that can do 1280x1024 @ 74 Hz
10  31.5 - 82.0; Monitor that can do 1280x1024 @ 76 Hz
11  Enter your own horizontal sync range

Enter your choice (1-11): 6

You must indicate the vertical sync range of your monitor. You can either
select one of the predefined ranges below that correspond to industry-
standard monitor types, or give a specific range. For interlaced modes,
the number that counts is the high one (e.g. 87 Hz rather than 43 Hz).

 1  50-70
 2  50-90
 3  50-100
 4  40-150
 5  Enter your own vertical sync range

Enter your choice: 2

You must now enter a few identification/description strings, namely an
identifier, a vendor name, and a model name. Just pressing enter will fill
in default names.

The strings are free-form, spaces are allowed.
Enter an identifier for your monitor definition: Hitachi

下一个配置是从显卡的驱动列表里选择一个显卡驱动程序。如果忽略 当前列表中的选项,请直接按Enter 下一屏将会出现在屏幕上, 会显示下面的信息:

Now we must configure video card specific settings. At this point you can
choose to make a selection out of a database of video card definitions.
Because there can be variation in Ramdacs and clock generators even
between cards of the same model, it is not sensible to blindly copy
the settings (e.g. a Device section). For this reason, after you make a
selection, you will still be asked about the components of the card, with
the settings from the chosen database entry presented as a strong hint.

The database entries include information about the chipset, what driver to
run, the Ramdac and ClockChip, and comments that will be included in the
Device section. However, a lot of definitions only hint about what driver
to run (based on the chipset the card uses) and are untested.

If you can't find your card in the database, there's nothing to worry about.
You should only choose a database entry that is exactly the same model as
your card; choosing one that looks similar is just a bad idea (e.g. a
GemStone Snail 64 may be as different from a GemStone Snail 64+ in terms of
hardware as can be).

Do you want to look at the card database? y



288  Matrox Millennium G200 8MB                        mgag200
289  Matrox Millennium G200 SD 16MB                    mgag200
290  Matrox Millennium G200 SD 4MB                     mgag200
291  Matrox Millennium G200 SD 8MB                     mgag200
292  Matrox Millennium G400                            mgag400
293  Matrox Millennium II 16MB                         mga2164w
294  Matrox Millennium II 4MB                          mga2164w
295  Matrox Millennium II 8MB                          mga2164w
296  Matrox Mystique                                   mga1064sg
297  Matrox Mystique G200 16MB                         mgag200
298  Matrox Mystique G200 4MB                          mgag200
299  Matrox Mystique G200 8MB                          mgag200
300  Matrox Productiva G100 4MB                        mgag100
301  Matrox Productiva G100 8MB                        mgag100
302  MediaGX                                           mediagx
303  MediaVision Proaxcel 128                          ET6000
304  Mirage Z-128                                      ET6000
305  Miro CRYSTAL VRX                                  Verite 1000

Enter a number to choose the corresponding card definition.
Press enter for the next page, q to continue configuration.

288

Your selected card definition:

Identifier: Matrox Millennium G200 8MB
Chipset:    mgag200
Driver:     mga
Do NOT probe clocks or use any Clocks line.

Press enter to continue, or ctrl-c to abort.



Now you must give information about your video card. This will be used for
the "Device" section of your video card in XF86Config.

You must indicate how much video memory you have. It is probably a good
idea to use the same approximate amount as that detected by the server you
intend to use. If you encounter problems that are due to the used server
not supporting the amount memory you have (e.g. ATI Mach64 is limited to
1024K with the SVGA server), specify the maximum amount supported by the
server.

How much video memory do you have on your video card:

 1  256K
 2  512K
 3  1024K
 4  2048K
 5  4096K
 6  Other

Enter your choice: 6

Amount of video memory in Kbytes: 8192

You must now enter a few identification/description strings, namely an
identifier, a vendor name, and a model name. Just pressing enter will fill
in default names (possibly from a card definition).

Your card definition is Matrox Millennium G200 8MB.

The strings are free-form, spaces are allowed.
Enter an identifier for your video card definition:

接下来,设置显卡的分辨率。典型的使用范围是 640x480, 800x600, 和 1024x768,这些显卡的功能特性、分辨率的大小以眼睛的舒适为准。 当选择颜色深度时,可以选择你显卡支持最大模式。

For each depth, a list of modes (resolutions) is defined. The default
resolution that the server will start-up with will be the first listed
mode that can be supported by the monitor and card.
Currently it is set to:

"640x480" "800x600" "1024x768" "1280x1024" for 8-bit
"640x480" "800x600" "1024x768" "1280x1024" for 16-bit
"640x480" "800x600" "1024x768" "1280x1024" for 24-bit

Modes that cannot be supported due to monitor or clock constraints will
be automatically skipped by the server.

 1  Change the modes for 8-bit (256 colors)
 2  Change the modes for 16-bit (32K/64K colors)
 3  Change the modes for 24-bit (24-bit color)
 4  The modes are OK, continue.

Enter your choice: 2

Select modes from the following list:

 1  "640x400"
 2  "640x480"
 3  "800x600"
 4  "1024x768"
 5  "1280x1024"
 6  "320x200"
 7  "320x240"
 8  "400x300"
 9  "1152x864"
 a  "1600x1200"
 b  "1800x1400"
 c  "512x384"

Please type the digits corresponding to the modes that you want to select.
For example, 432 selects "1024x768" "800x600" "640x480", with a
default mode of 1024x768.

Which modes? 432

You can have a virtual screen (desktop), which is screen area that is larger
than the physical screen and which is panned by moving the mouse to the edge
of the screen. If you don't want virtual desktop at a certain resolution,
you cannot have modes listed that are larger. Each color depth can have a
differently-sized virtual screen

Please answer the following question with either 'y' or 'n'.
Do you want a virtual screen that is larger than the physical screen? n



For each depth, a list of modes (resolutions) is defined. The default
resolution that the server will start-up with will be the first listed
mode that can be supported by the monitor and card.
Currently it is set to:

"640x480" "800x600" "1024x768" "1280x1024" for 8-bit
"1024x768" "800x600" "640x480" for 16-bit
"640x480" "800x600" "1024x768" "1280x1024" for 24-bit

Modes that cannot be supported due to monitor or clock constraints will
be automatically skipped by the server.

 1  Change the modes for 8-bit (256 colors)
 2  Change the modes for 16-bit (32K/64K colors)
 3  Change the modes for 24-bit (24-bit color)
 4  The modes are OK, continue.

Enter your choice: 4



Please specify which color depth you want to use by default:

  1  1 bit (monochrome)
  2  4 bits (16 colors)
  3  8 bits (256 colors)
  4  16 bits (65536 colors)
  5  24 bits (16 million colors)

Enter a number to choose the default depth.

4

最后,要保存你的配置,确定输入 /etc/XF86Config 作为保存位置。

I am going to write the XF86Config file now. Make sure you don't accidently
overwrite a previously configured one.

Shall I write it to /etc/X11/XF86Config? y

如果你配置失败,你也可以尝试着按 [ Yes ] 来 重新再试一次,会显示下面的信息:

          User Confirmation Requested
The XFree86 configuration process seems to have
failed.  Would you like to try again?

             [ Yes ]         No

如果配置 XFree86时遇上困难,请选择 [ No ] 并按 Enter键继续 进行安装。安装完成后可以使用 xf86cfg -textmodexf86config 命令行配置程序来以 root 用户的身份进行配置。配置 XFree86 的另外一种方法 描述在 第 5 章。如果你选择不配置XFree86 那么下一个菜单将让你选择要安装的软件包。

默认情况下可以使用组合键 Ctrl+Alt+Backspace,在发生错误或在硬件损坏前退出 设置屏幕。

默认的显示模式可以使用X系统下的 Ctrl+Alt++Ctrl+Alt+-来改变。

一旦有了可以运行的 XFree86, 就可以使用 xvidtune 来调整显示的高度和宽度以及显示器的中心位置。

一些不适当的配置可能会损坏你的设备。如果在使用它们前存在疑虑,请不要 安装它们。可以使用监视器的控制工具来调整X窗口的显示。与文本显示模式不同 它更容易损坏设备。

在调整这些参数前,请阅读 xvidtune(1) 手册。

下面是一个配置 XFree86 的成功例子,它选择了 使用默认的桌面。


2.9.13. 选择默认的桌面

有许多窗口管理器可以使用。它们从基本的桌面环境到全部的桌面应用,是 一个大型的软件集。一些人可能只希望使用一些占用磁盘空间少,内存低的窗口 管理器;而另外一些人则更倾向于使用有便多特性的桌面环境。选择使用那种桌 面的最好的方法就是尝试着试用一些不同的桌面环境。这些桌面都可以在安装 完成后通过ports收集或包管理器来进行安装。

您可以选择一个流行的桌面配置成为默认的桌面,可以使您在安装完 成后立刻启动它。

图形 2-56. 选择默认桌面

使用箭头选择一个桌面,然后键入Enter键。选择的桌面将被 安装。


2.9.14. 安装软件包

这些软件包已经被预编译成二进制程序了,安装软件有一个很简单的方法。

为了说明问题,这里给您做了一个怎样来安装软件包的范例,额外的软件包 也可以在这时安装。您也可以在安装结束后使用 /stand/sysinstall 程序来安装软件包。

                     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 将会显示软件包选择屏幕。

图形 2-57. 选择软件所的种类

在任何时候只有安装介质上有的软件包才能被安装进系统。

如果选择All 那么所有的软件包将会被显示,您也 可以选择一个特殊的分类。使用箭头进行选择,然后键入 Enter

一个菜单将会显示这个分类中可用的所有软件包。

图形 2-58. 选择软件包

bash shell 被选中了。通过在加亮的软件 上键入Space 键,来选择您想要的软件所。每个选择的软件 包的简短描述都会显示在屏幕左下脚。

Tab 键选择 [ OK ][ Cancel ]

当您完成了安装标记之后,键入 Tab 键选择 [ OK ] 然后键入Enter 返回软件包选择菜单。

左右箭头键也可以用来选择 [ OK ][ Cancel ]。用这种方法也可以 用 [ OK ] 然后按 Enter 来返回软件包选择菜单。

图形 2-59. 安装软件包

使用 Tab 和箭头键来选择 [ Install ] 然后键入 Enter。您接着需要确定您要安装的软件包。

图形 2-60. 确认安装的软件包

选择 [ OK ] 然后键入Enter 键将开始软件的安装, 安装信息将会不断地出现。如果有一些错误信息,请作好记录。

安装完成之后,继续最后的配置。如果您不想安装任何软件包并退回到 最终配置屏幕,请选择Install


2.9.15. 添加用户/组

您至少要在安装过程中添加一个用户,以便于您能不用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-61. 选择用户

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

图形 2-62. 添加用户信息

下面的描述信息会出现在屏幕的下方,可以使用 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 中修改。 bash shell 是先前默认安装的shell。 不要使用一个不存在的或您不能登陆的shell。最通用的shell是使用 BSD-world 的 C shell,可以通过指定/bin/tcsh来修改。

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

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

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

因特殊需要的组也可以在此时进行添加,也可以在安装完成后使用 /stand/sysinstall 来完成。

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


2.9.16. 设置 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 to continue ]

键入 Enter 来设置 root 密码。

密码必须正确地输入两次。

Changing local password for root.
New password :
Retype new password :

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


2.9.17. 退出安装

如果您需要配置额外的网络设备或要做其它的配置,您可以在这时或以后 通过 /stand/sysinstall来安装。

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

                              Yes   [ No ]

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

图形 2-64. 退出安装

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

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

                            [ Yes ]   No

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

在系统重新启动的时候可能会见到出错信息。


2.9.18. FreeBSD的启动

2.9.18.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 root@k6-2.example.com
 creating ssh DSA host key
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
f9:a1:a9:47:c4:ad:f9:8d:52:b8:b8:ff:8c:ad:2d:e6 root@k6-2.example.com.
setting ELF ldconfig path: /usr/lib /usr/lib/compat /usr/X11R6/lib
/usr/local/lib
a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout
starting standard daemons: inetd cron sshd usbd sendmail.
Initial rc.i386 initialization:.
rc.i386 configuring syscons: blank_time screensaver moused.
Additional ABI support: linux.
Local package initialization:.
Additional TCP options:.

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

login: rpratt
Password:

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

如果 X 服务器已经配置好了,默认的桌面也选择好了,就可以在命令行键入 startx 来启动视察环境。


2.9.18.2. FreeBSD 在 Alpha机器上启动

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

>>>BOOT DKC0

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

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

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


2.9.19. 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.10. 支持的硬件

FreeBSD当前可以广泛运行在ISA、VLB、EISA、PCI总线的PC上,包括 Inter,AMD,Cyrix或 NexGen ``x86''系列的机器,还有一些 Compaq Alpha的机器。支持普通的 IDE 或 ESDI 驱动配置,各种SCSI控制器, PCMCIA卡,USB设备,网卡和其它网络串口设备。FreeBSD也支持IBM微通道 (MCA)的总线结构。

每个发行版都会提供一个FreeBSD支持的硬件列表。您可以在名字叫做 HARDWARE.TXT的文件中找到。它可以在CDROM或FTP发行组件 或sysinstall的文档菜单中找到。对于特定的架构,都 有相应的硬件支持列表。也可以在FreeBSD的网站 Release Information 找到更多的信息。


2.11. 常见问题

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


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

由于pc结构的限制,不可能100%的不出现问题,但是有些问题是你可以 自己解决的。

先检查你的硬件,确保你的硬件被支持。

如果您的硬件能够被扶持,但还是会出问题,那就重新启动计算机。当出现 内核配置信息的时候,重新配置一下硬件信息。因为绝大多数硬件的IRQ,淡IO地 址,DMA通道都有它们的生产商预先进行默认配置。如果你的硬件已经重新装配了, 就需要使用配置编辑器告诉FreeBSD到哪里去找相关信息。

如果某个设备配置好后,发现又有个设备出现错误。碰到这种情况,就当卸掉 这个设备的驱动程序。

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

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

警告不要在安装中把您必需的驱动程序卸掉,如您的监视器sc0 。如果安装中在修改守配置后,仍然会出现一些意想不到的情况,最好所配置文件恢复到原来 的样子。把它重新启动,再试一下。

在配置模式下,您可以:

  • 列出在内核中安装的设备驱动程序。

  • 禁用不适合您机器的设备驱动程序。

  • 通过驱动程序改变IRQ,DRQ和IO端口地址。

调整内核与您的硬件设置一致之后,键入 Q ,以新的设置 重新启动计算机。当FreeBSD安装完成之后,在配置模式下做的更改会一直存在,不需 要在每次启动计算机时再重新设置。即使如此,有可能您会想建立一个定制内核使您 的系统效率达到最好,可以看看以下的链接 custom kernel


2.11.2. 处理 MS-DOS® 分区存在的问题

许多FreeBSD的用户基于MicrosoftPC 上安装FreeBSD。以下是一些关于在这种系统中安装FreeBSD常会出现的问题。 FreeBSD 中有一个FIPS的应用程序。这个工具程序可以在 安装光盘的 tools 目录下找到或从FreeBSD 的镜像站点下载。

FIPS 允许你将现有的 MS-DOS 分区一分为二,保留原 原有的分区,让您安装到空出来的分区上。您首先要用 WindowsDisk DefragmenterNorton Disk Tools来对 MS-DOS 分区进行碎片整理。然后, 就可以重新启动把FIPS 。 看一下安装菜单,估计一下大概需要 多少安装空间。随后您就可以在新分区上重新引导安装 FreeBSD请查阅 Distributions 菜单上你的安装类型需要多少空间。

有一个由PowerQuest公司生产的非常有用的工具。从 http://www.powerquest.com网站上 可以得到PartitionMagic。这个工具的功能比 FIPS要强大。如果你经常要添加或删除操作系统,强烈建议 您使用它。当然,它很贵。如果您只是想安装 FreeBSD 的话, FIPS 就已足够了。


2.11.3. 使用 MS-DOSWindows® 文件系统

现在 FreeBSD 还不支持经过Double Space™ 应用程序压缩过的文件系统。因此其它的文件系统在被FreeBSD访问其数据之前必须先 解压缩。它可以通过运行位于 Start> Programs > System Tools menu中的 Compression Agent程序来实现。

FreeBSD可以支持基于 MS-DOS 的文件系统。这要求你使用带参数的 mount_msdos(8) 命令 (在 FreeBSD 5.X版本,相应的命令为 mount_msdosfs(8)) 最常使用的是:

# mount_msdos /dev/ad0s1 /mnt

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

注: MS-DOS 的扩展分区会被映射在 FreeBSD分区的末尾。换句话说,分区号要大于 FreeBSD 正在使用的分区号。例如,第一个 MS-DOS 分区可能位于 /dev/ad0s1,FreeBSD 分区可能位于 /dev/ad0s2,跟着是 MS-DOS 的扩展分区位于 /dev/ad0s3。这可能会使您感觉迷茫。

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


2.11.4. Alpha 用户的问题与解答

这节主要回答一些在Alpha系统上安装FreeBSD时经常问到的问题。

2.11.4.1. 我可以从 ARC 或 Alpha BIOS 控制台启动吗?
2.11.4.2. 求救,我没有空间了!我需要删除每一样东西吗?
2.11.4.3. 我可以挂上 Compaq Tru64 或 VMS 的文件系统吗?

2.11.4.1. 我可以从 ARC 或 Alpha BIOS 控制台启动吗?

不行。 FreeBSD,像Compaq Tru64 和 VMS,只能从SRM 控制台启动。

2.11.4.2. 求救,我没有空间了!我需要删除每一样东西吗?

不,这个时候不行。

2.11.4.3. 我可以挂上 Compaq Tru64 或 VMS 的文件系统吗?

不,这个时候不行。


2.12. 高级安装指南

Contributed by Valentino Vaschetto.

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


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

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

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

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

    如果您想用软盘,FreeBSD将进入它通常的安装模式。我们要把FreeBSD 引导进入串行控制台,需要这样做,您必须使用 mount(8)命令在FreeBSD系统 上挂一kern.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. 开始启动安装

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

  4. 连接你的无头机器

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

    # cu -l /dev/cuaa0
    

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


2.13. 准备你自己的安装介质

注: 为了避免重复 ``FreeBSD disk'' 在这里指 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-arch/version 或最近的镜像站点下载。选择合适的 arch version

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

    表格 2-5. FreeBSD ISO映像文件名和含意

    文件名 包含内容
    version-mini.iso 你安装 FreeBSD所需要的最基本的东西。
    version-disc1.iso 你安装 FreeBSD所需要的最基本的东西,和一些附加的第三方厂商的试用版软件包
    version-disc2.iso ``live filesystem'',它是用来在 sysinstall程序里用来 ``修复''系统 用的。里面包含 FreeBSD CVS 树的一个拷贝,还有许多附加的第三方厂商的试用 版软件包。

    必须 下载一个 mini-ISO 映像盘,或是disc one映像盘。 不要都下载下来,因为disc one 映像盘的内容包括了所有在 mini ISO映像盘中的内容。

    如果你的网络费用很低,你可以使用 mini ISO 映像。它可以让你完成安装 FreeBSD的任务,如果你还想安装其它的软件包,可以下载它们并使用 ports/packages 系统来安装。(详细请看第 4 章

    如果你想适当的在安装介质上安装一些第三方的软件包,那么你可以使用 disc one映像盘。

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

  2. 刻录 CDs

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

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


2.13.2. 使用FreeBSD磁盘作为本地端FTP站点

FreeBSD磁盘的配置跟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服务公开给外面的 网际网络(非本地用户),你的电脑必须承担被侵入或其它的风险。我们强烈建议你 要有完善的安全机制才这样做。


2.13.3. 创建安装软盘

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

至少这些软盘必须是 1.44 MB 或 1.2 MB 的,用来容纳所有在 bin (二进制软件包)目录下的文件。如果你在DOS操作系统 下准备就 MUST使用 MS-DOS下的 FORMAT 命令来格式化软盘。如果你使用的是 Windows操作系统,在文件浏览器中用右键 单击 A: 驱动器,并选择 ``Format''。

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

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

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

注: 如果使用 5.25"软盘的话,需要使用 fd0.1200floppy5 来格式化 1.2 MB 的磁盘空间。

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

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

一旦你进入选择安装介质的屏幕,选择 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 发行包可以在 5.2.1/base/目录中找到。

注: 在 4.X 和其它老版本的 FreeBSD the ``base''发行包被叫做 ``bin''. 如果你使用这些版本的话,请调整上例中的命令和URLS.

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


2.13.5. 创建一个安装磁带

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

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

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

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


2.13.6. 通过网络安装

有三种类型的网络安装方法。串口(SLIP或PPP),并口(PLIP),以太网 (标准的以太网控制器,包括PCMCIA)。

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

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

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

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

最后,通过网络安装最快的方法是利用以太网技术!FreeBSD支持绝大多数普通 的以太网卡。每个FreeBSD发行版都在硬件注释中提供支持的网卡的列表和需要的设置。 如果你要使用PCMCIA接口的以太网,在启动计算机 before, 确信已经把它插好了。目前,FreeBSD还不支持PCMCIA的热插拔。

通过网络安装,你可能需要知道IP地址,地址掩码,还有机器的名字。如果你 通过PPP进行安装,就不需要静态的IP地址,IP地址会由ISP给你自动指派。你的系统 管理员会告诉你通过网络安装的细节。如果你通过主机名而不是IP地址来访问其它主 机,需要有一个域名服务器或一个网关地址(如果你使用PPP进行安装,那它就你的 的ISP的IP地址)。如果你要通过一个HTTP的代理服务器进行FTP安装,需要一个代理 服务器地址。如果你不知道这些,在安装 before可以询问 你的系统管理员或你的ISP服务商。


2.13.6.1. 通过NFS安装之前

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

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

如果你的一台网卡比较糟糕,速度很慢,则应考虑NFS Slow的选项。

为了达到NFS安装的目的,这个服务器必须支持 subdir 加载。例如,如果你的 FreeBSD 5.2.1 目录存在: 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磁盘架构。

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

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

  • 什么是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) man手册。


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

注: 这个控制台已经注释掉, 你可编辑这行把安全 变为 不安全。假如你这么做,当用单用户进入FreeBSD时, 它仍然要求提供root 用户的密码。

请注意在这时他已变为 不安全的, 如果你忘记了 root用户的密码, 单用户导入有点麻烦。 它可能是静态不动的,但它允许用某用户导入程序。


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)?或是pseudo-file device? 在这个例子,-表示一个普通文件。 接下来三个字是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.4. 目录架构

目录层次是理解一个系统的重要基础, 最重要的莫过于它的根目录``/'', 这个目录在启动时就就挂上,它包含了启动时所需的基本系统。 这个根目录同样包含了你想挂上的每一个文件系统。

mount point(挂接点)是一个能让多加入的档案系统接上根目录文件系统的目录, 标准的mount point(挂接点)包含 /usr/var/mnt/cdrom。 这些目录通常被纪录在/etc/fstab文件。 /etc/fstab 文件是一个纪录系统上的多样文件系统和mount points(挂接点)的表格, /etc/fstab 文件会依据这一个脚本 rc(8)在开机的时候被 自动挂上, 除非加上noauto(非自动)这个选项。 请查阅手册fstab(5)以了解 /etc/fstab 所用的格式和他包含的选项。

您可以由 hier(7)得知 man page 提供了完整的目录架构的介绍。 现在,我们介绍一般目录以供参考。

目录 介绍
/ 文件系统的根目录。
/bin/ 在单个用户和多用户环境下的基本工具目录。
/boot/ 在操作系统在导入启动期间所用的程序和配置。
/boot/defaults/ 默认每步引导启动的配置内容,请查阅loader.conf(5)
/dev/ 设备接点,请查阅 intro(4)
/etc/ 系统启动的配置和脚本。
/etc/defaults/ 系统默认的启动配置和脚本,请查阅 rc(8)
/etc/mail/ 关系到mail(邮件)运作的配置, 请查阅类似的 sendmail(8)
/etc/namedb/ named 配置文件,请查阅named(8)
/etc/periodic/ 每天、每星期和每月周期性地运行的脚本, 请通过 cron(8)查阅 periodic(8)
/etc/ppp/ ppp配置文件,请查阅ppp(8)
/mnt/ 由管理员习惯使用mount point(挂接点)的临时空目录。
/proc/ 运行中的文件系统,请查阅see procfs(5)mount_procfs(8)
/root/ root用户的Home(主)目录。
/sbin/ 在单个用户和多用户环境下的存放系统程序和管理所需的基本实用目录。
/stand/ 持久独一无二的程序环境。
/tmp/ 存放临时文件,通常存放一些系统重启后不需要保护的 mfs(8) memory-based 文件系统。
/usr/ 存放大多数用户的应用软件。
/usr/bin/ 存放实用命令,程序设计工具,和应用软件。
/usr/include/ 存放标准 C include 文件.
/usr/lib/ 存放 libraries(库文件)。
/usr/libdata/ 存放各种实用工具的数据文件。
/usr/libexec/ 存放系统实用或后台程序 (从另外的程序启动执行)。
/usr/local/ 存放本地执行文件,库文件等等, 同时也是FreeBSD ports架构的目的地。 /usr/local/usr总体布置请查阅man.hier.7;。 man 目录例外, 他们直接放在 /usr/local下胜于放在 /usr/local/share下, 而 ports 说明文档在 share/doc/port
/usr/obj/ 基于/usr/src (结构)树的具体任务(结构)树的扩充。
/usr/ports 存放FreeBSD收集到的 ports (可选用)。
/usr/sbin/ 存放系统后台程序 和 系统工具 (由用户执行)。
/usr/share/ 存放独立结架构的文件。
/usr/src/ 存放BSD或者本地源码文件。
/usr/X11R6/ X11R6 执行, 库, 配置等分布的目录(可选用)。
/var/ 存放多用途记录、临时性、短期的和spool(回环)文件.
/var/log/ 存放各种的系统记录文件。
/var/mail/ 存放用户mailbox(一种邮件存放格式)文件。
/var/spool/ 各种打印机和邮件系统spooling(回环)的目录。
/var/tmp/ 存放系统重启前受控制的临时文件。
/var/yp NIS maps(一种网络文件系统的布局)。



3.5. 磁盘架构

FreeBSD使用最小单位的架构去查找文件。 而文件名区分大小写,这就意味着 readme.txtREADME.TXT 是两个不相同的文件。 FreeBSD不凭文件扩展名 (.txt)去识别这个文件是 程序、或是文档、或是其他格式的数据。

各种文件存放在目录里。 一个目录可以含有许许多多的文件, 允许含有其他的目录,同样允许你添加不同层次的目录在里面。 可以轻松地组织你的数据。

在(某些)目录或文件下搏接目录(文件)名,那在(某些)目录之后是一斜杠 :/。 跟随(下来)的其他目录都需要(这个斜杠)。 假如你有一个目录 foo, 它含有目录 bar, 而bar之下含有 readme.txt文件,那么他的全名或 path 就是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 挂接释放

B 挂接在 A2 那图表的样子就是这样子:

这个路径分别是 /A2/B1/A2/B2

文件系统能把顶部挂接上另一个(文件系统)。 继续这个例子, 把 C 文件系统挂接在B 文件系统里的B1目录, 排列如下:

或者把 C 文件系统挂接在A 文件系统里的A1目录:

假如你熟悉 MS-DOS并知到join 命令, 尽管不相同,其实是相似的。

这方面不是普通知识而且涉及到你自己所关心的, 当你安装FreeBSD并在以后添加新磁盘时,你必须知到该如何新建文件系统和挂接上。

(FreeBSD系统)它有一个主要的根文件系统, 不需要另外新建立, 但当需要手工处理时,这是一个有用的知识。

多样性文件系统的益处

  • 不同的文件系统可用不同的 挂接参数。 举些例子, 仔细想一下, 根文件系统能用只读的方的方式挂接上,防止不经意删除或编辑到一个危险的文件。 把各用户能写入的文件系统分开,像/home这样, 由另外的文件系统分别用 nosuid挂上,这个参数防止 suid/guid 位在执行时写入 到这文件系统时生效,使其更加安全。

  • FreeBSD对一个文件系统的文件布局自动优化,并依赖文件系统的使用习惯。 所以一个文件系统应有一个针对大量小型文件频繁写入的优化, 另外大型文件系统的优化也应落实。

  • FreeBSD的文件系统是非常周全的并尽量将损失减到最低。 但无论怎样,一个错误都会破坏文件系统的结构, 在适当时候提出数据并转移做好备份,在需要时能恢复数据。

统一文件系统的益处

  • 文件系统是固定大小的。 当安装FreeBSD时新建一个文件系统并设定一个specific大小, 你会在稍后发觉到必须去建一个大的partition。 设置不当这是不能完成的,它会重新建立文件系统的大小和修建数据。

    重要: FreeBSD 4.4 或更高的版本有growfs(8) 命令的特点, 当建立时文件系统排除这些限制,灵活地增加(到正确的)大小。

partitions作为文件系统是静态的。 分割期间通用的做法是不能含相同的目标 (举个例子, MS-DOS的分割), 因为这是由 FreeBSD的 UNIX 传统形成的。 每个 partition 由字母ah标定, 每个 partition 各自就是一个文件系统, 这就意味着这些文件系统可以挂接在某一文件系统的某一层次, 或者把说字母标定的partition包含在某一文件系统的某一层次其中。 (译者注:Slice是指磁盘的片,也就是主分区。partition是指一个Slice内的分区。)

FreeBSD的交换分区同样使用磁盘空间。 交换分区是给FreeBSD作虚拟内存使用的, 这样能令你的计算机有更多的内存可使用, 当FreeBSD在运行而内存不够的时候,它会把其他一些可转移的数据转移到交换分区, 空出内存的位置以供使用。

某些 partitions 的用途是确定的。

Partition(分区) 约定
a 通常指定为根文件系统
b 通常指定为交换分区
c 通常它和装载入的slice同一大小。 这样的用途当在c partition 上工作时必定会影响到事整个slice (举个例子,坏块扫描器)。 你通常不愿意在这个partition建立文件系统。
d Partition d 曾经有特殊的含义, 虽然(对我们来说)早已远离而去。 但直到今天,一些工具在 partition d上运行会发生古怪事情, 所以 sysinstall 通常不建立 partition d

每个 partition 是通过FreeBSD调用一个slice来储存的。 因为反复调用partitions而又基于UNIX背景,所以Slice 是FreeBSD的 term。 Slices是从1到 4编号的。

Slice的编号是紧跟设备名称之后,首个编号是1。 但在编号之前还要加上一个s, 所以首个SCSI磁盘和它的首个slice就是``da0s1''。 一个磁盘上只能分出四个物理slices,但你也可在适当类型的某个slice里建立逻辑分区。 在护展分区方面,编号从5开始。 所以首个IDE磁盘首个护展分区就是``ad0s5''。 文件系统利用这样的设计就可以整个slice使用。

Slices, ``专项指定'' 物理驱动器, 和其他驱动器都包含partitions, 那几个的partitions都是用字母 从 ah来标定的, 而这些字母都在驱动器名字之后,所以 ``da0a'' 是指首个da设备的 a partition, 而那个就是 ``专项指定''。 ``ad1s3e'' 是指IDE磁盘第三个slice的第五个partition。

最终,每个磁盘都被系统识别。 一个磁盘名字是用磁盘类型代码和编号来标识的, 它不像slices,磁盘的编号是由0开始的。 对应代码请看这里所列出的表格 3-1

当提供一个partition名字给FreeBSD时, slice 和 磁盘所必须有这个partition,还应当提供所partition所涉及 到的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

设备名称(设备必须存在), 说明在 第 16.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) 在充许的情况下将尝试并行地去检查文件系统。


3.6.2. mount 命令

这个 mount(8) 命令是挂接文件系统的基本运用。

使用最多的基本格式:

# mount device mountpoint

它的选项非常多,而mount(8) 手册同样提及, 但常用的都在这里:

挂接的各种选项

-a

挂接/etc/fstab里所有列出的文件系统。 除非标记为 ``noauto'' 或作了排除在外的 -t 类型标记,或者在这之前已挂上。

-d

除了实际上系统调用以外,可以完成任何事情,这个选项是和 -v参数一起连在一块使用,可以决定mount(8)所做的事情。

-f

强制去挂接一个未知的文件系统(会有危险), 或当把一个文件系统挂接状态由可读写降为只读时,强制撤消可写通道。

-r

以只读的方式挂上文件系。 使用-o 选项加rdonly是一样的。

-t fstype

根据给出的文件系统类型挂接文件系统, 假如给于-a选项,仅挂接这个类型的文件系统。

``ufs'' 是默认的文件系统类型。

-u

在文件系统上修改挂接选项。

-v

版本模式。

-w

以可读写方式挂接文件系统。

The -o 选项采用一个逗号分开以下多个选项:

nodev

拒绝把文件系统识别为特别的设备。这是一个有用的安全选项。

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, 当你运行到超过限制时,这些编号会回转分配。 TT这一列显示了程序运行所在的终端, 目前可以安全地忽略。 STAT 显示程序的状态,也可以安全地被忽略。 TIME是程序在CPU处理时间--运行的时间量, 并不是指你程序启动到现在的所用的时间。 许多程序碰巧遇到某方面在他们之前要花费大量CPU处理时间时,他们就必须等候。 Finally, COMMAND is the command line that was used to run the program.

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是伯克莱互联网络守护进程命名(and the actual program that executes is called named), Apacheweb系统的程序就叫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 搜索man手册路径,以两点的冒号分隔开。

不同的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

运行chsh 不加参数只编辑shell也会达到相同的效果。

注: 你使用的shells必须/etc/shells 文件里列出。 假如你从 ports里装一个shell, 那就不用做这步了。 假如你手工装一个shell,那就要手工添加进去。

举个例了子,假如你手工把 bash装到 /usr/local/bin里,你还要进行这一步:

# echo "/usr/local/bin/bash" >> /etc/shells

然后运行chsh


3.10. 文本编辑器

在FreeBSD里有许多的配置是依靠编辑文本文件来完成的, 正因为这样,最好就是去熟悉一种文本编辑器。 FreeBSD基本系统本身就自带有几种,还有许多已可在ports里得到。

最容易学的而又简单的编辑器是 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. MAKEDEV 脚本

当系统缺少DEVFS (涉及的是FreeBSD 5.0之前的版本), 建立设备节点可以使用MAKEDEV(8),就如下面显示的那样:

# cd /dev
# sh MAKEDEV ad1
   

这个是一个例子,在安装等二个IDE设备时去建立设备节点。


3.11.1.2. DEVFS (DEVice 文件系统)

这个设备文件系统, 或叫 DEVFS, 为内核的设备命名在整体文件系统命名里提供通道, 并不是建立或更改设备节点, DEVFS只是为你的特别文件系统进行维护。

更多的资料请查 devfs(5) 手册。

DEVFS在FreeBSD 5.0或更高的版本里是默认使用。


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. man手册

最详细的使用说明文档莫过于FreeBSD里的man手册了。几乎每一个程序都会附上 一份简短说明,以介绍这个程序的的基本功能以及参数的用法。 我们能通过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。 switch:

% 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 collection 和二进制软件包(package)。无论用哪种方式,您都可以从本地媒体(设备)或直接通过网络来安装您喜欢的最新版本的应用程序。

读完这章,您将了解到:

  • 如何安装第三方的二进制软件包。

  • 如何从ports collection安装第三方软件。

  • 如何删除先前安装的软件包。

  • 如何改动ports collection里面的一些参数,定制软件使用。

  • 如何找到您需要的软件包。

  • 如何升级您的ports。


4.2. 软件安装预览

如果您以前使用过 UNIX 系统,那典型的第三方软件安装的步骤是像下面描述的:

  1. 下载这个软件,软件的发行版可能是源代码格式,或是一个二进制包。

  2. 解开软件(其中代表性的是用 compress(1), gzip(1), 或 bzip2(1) 压缩过的tar包)。

  3. 阅读相关文档,了解如何安装。 (多半一个文件名是INSTALLREADME ,或在doc/ 目录下的一些文档)

  4. 如果软件是以源代码形式发布的,那就需要编译它。可能需要编辑一个 Makefile文件, 或运行 configure脚本,和其他的一些工作。

  5. 测试和安装软件。

如果一切顺利的话,就这么简单。如果您在安装一个软件包时发生一些错误,您可能需要编辑一下它的代码,以使它能正常工作。

S您可以继续使用 ``传统的''方式安装软件。然而,FreeBSD提供了两种技术:packages和ports。就在写这篇文章的时候,已经有超过10,500个第三方的应用程序可以使用了。

对于任意一个应用程序包,是一个可以下载的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的优点

  • 一个压缩的package通常要比一个压缩的包含源代码的应用程序小得多。

  • package不需要进行额外的编译。对于很大的应用程序如 MozillaKDEGNOME,这点很重要,特别是在您的系统资源比较差的情况下。

  • package不需要您知道如何在FreeBSD上编译软件的详细过程。

Ports 的优点

  • package在编译时通常使用比较保守的选项,因为他们保证可能运行在大多数的系统上。 通过从port安装,您可以细微调整编译选项来产生适合于处理器的代码(针对于Pentium IV或AMD的Athlon CPU)。

  • 一些软件包已经把与它们相关的能做和不能做的事情的选项都编译进去了。例如, Apache 可能就配置了很多的选项。您从port中建立软件,不一定要接受默认的选项,您可以自己来设置。

    在一些例子中,一个软件有不同的配置存在多个package。 例如, Ghostscript存在 ghostscript package 和 ghostscript-nox11 package两个配置package, 这取决于您是否安装了X11服务器。 这样的调整对package是可能的,但如果一个应用程序有超过一个或两个不同的编译时间选项时,就不行了。

  • T一些软件的许可条件禁止采用二进制形式发行。它们必须带上源代码。

  • 一些人不信任二进制发行形式。至少有了源代码,(理论上)可以亲自阅读它,寻找潜在的问题。

  • 如果您要自己对软件打补丁,您就需要有源代码。

  • 一些人喜欢整天围着源代码转,所以他们喜欢亲自阅读源代码,修改源代码等等。

保持更新ports,订阅邮件列表 FreeBSD ports 邮件列表 和递交错误报告 FreeBSD ports bugs 邮件列表

警告在安装任何应用程序之前,应该首先检查 http://vuxml.freebsd.org/ 上是否有与所安装的应用程序有关的安全问题报告。

另外,也可以安装 security/portaudit。 除了可以自动地检测所有已经安装的软件中是否有已知的安全漏洞之外, 在开始编译新的 port 之前它也会检查是否存在已知的问题。 另外,在安装了一些软件包之后,也可以使用 portaudit -F -a 来强制系统作一下检查。

这章的其余部分将介绍如何使用packages和ports来安装和管理第三方软件。


4.3. 寻找您要的应用程序

在您安装任何应用程序之前,需要知道您需要什么,那个应用程序叫什么。

FreeBSD中可用的应用程序正在不断地增长着。幸运的是,有许多方法可以找到您所需要的程序:

  • FreeBSD站点上拥有一个可以搜索到的当前所有可用的应用程序列表,在 http://www.FreeBSD.org/ports/. 它分很多种类,您既可以通过程序的�称来搜索,也可以在分类中列出所有可用的应用程序。 (如果您知道名字), 也可以在分类中列出所有可用的应用程序。

  • Dan Langille 维护着网站 FreshPorts,在 http://www.FreshPorts.org/。 FreshPort时刻``追踪''着在ports中应用程序的变化。当有任何程序被升级时,他们就会发email提醒您。

  • I如果您不知道您想要的应用程序的�字,可以通过 (http://www.freshmeat.net/) 网站来寻找,如果应用程序被找到了,您可以回FreeBSD的主站去看一下这个应用程序是否已经被port进去了。

  • 如果您知道一个port的准确名字If you know the exact name of the port,但是您需要知道在哪个类别里面找到它,您可以使用 whereis(1) 这个命令。简单的输入whereis file, file 就是您想安装的程序名字is the program you want to install. 如果在您的系统找到它,将被告知在他在哪里,就像下面:

    # whereis lsof
    lsof: /usr/ports/sysutils/lsof
    

    结果告诉我们这个命令lsof (一个系统配置程序)可以在 /usr/ports/sysutils/lsof目录中找到。

  • 还有另外的一个寻找您需要的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:  obrien@FreeBSD.org
    Index:  sysutils
    B-deps: 
    R-deps:
    

    在输出的内容里面您要特别注意包含``Path:''的这行, 这将告诉您在哪里可以找到这个port。如果要安装此port,那其他输出的信息不是必须的,但是还是显示输出了。

    为了更深入的搜索,您可以同样使用make search key=string , string就是您想搜索的部分内容。 它将搜索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 freebsd@vienna.verio.net.
230-
230-
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/FreeBSD/ports/packages/sysutils/
250 CWD command successful.
ftp> get lsof-4.56.4.tgz
local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz
200 PORT command successful.
150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes).
100% |**************************************************| 92375       00:00 ETA
226 Transfer complete.
92375 bytes received in 5.60 seconds (16.11 KB/s)
ftp> exit
# pkg_add lsof-4.56.4.tgz

如果您没有本地package的安装盘(如FreeBSD cdrom),可以执行 pkg_add(1) 命令并加上-r选项。这将迫使程序自动决定目标文件的正确格式和版本,然后自动从一个FTP站点寻找和安装package。

# pkg_add -r lsof

上面的例子将下载正确的package,而不需要用户的干预就可以安装。如果您想指定FreeBSD package的镜像站点,替换主站点,您必须新设置PACKAGESITE 这个环境变量,覆盖原来的设置. pkg_add(1) 使用 fetch(3) 下载文件,可以使用多种环境变量,包含 FTP_PASSIVE_MODE, FTP_PROXY, 和FTP_PASSWORD. 如果您使用FTP/HTTP 代理或在防火墙后面,您可能需要设置这些环境变量。详细的列表可以看 fetch(3) 。上述例子中用lsof替代了 lsof-4.56.4. 当使用远程安装 ackage的时候软件名字不需要包含版本号。 pkg_add(1) 将自动的找到这个软件最新的版本。

注: 如果您使用 FreeBSD-CURRENT 或 FreeBSD-STABLE版本的FreeBSD ,pkg_add(1) 将下载您的应用软件的最新版本。 如果您使用 -RELEASE 版本的FreeBSD, 它将会获得与您的版本相应的软件包版本。如果您更改了PACKAGESITE这个环境变量可能会发生不同的情况。

软件包采用 .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树中移出或改名了)
* 软件包有很多版本。

4.4.3. 删除一个软件包

要删除先前安装的软件package,只要使用pkg_delete(1) 工具。

# pkg_delete xchat-1.7.1

4.4.4. 其它

所有已安装的package信息都保存在/var/db/pkg 目录下。安装文件的列表和每个package的内容和描述都能在这个目录的相关文件中找到。


4.5. 使用Ports Collection

下面的章节提供了使用ports collection来安装或卸载程序的基本用法。


4.5.1. 获得Ports Collection

在您能使用ports之前, 您必须先获得ports collection--本质上是/usr/ports目录下的一堆 Makefiles,补丁, 和描述文件。

在您安装FreeBSD系统的时候,sysinstall会询问您是否需要安装ports collection. 如果您选择no,那您可以根据下面的指令来安装ports collection:

Sysinstall 方式

这种方式使用sysinstall再次手动安装ports collection。

  1. root用户, 运行 /stand/sysinstall命令,像下面显示的:

    # /stand/sysinstall
    
  2. 选择Configure, 按Enter

  3. 选择Distributions, 按 Enter

  4. 选择ports, 按Space

  5. 选择Exit, 按Enter

  6. 选择您的安装介质,就像CDROM,FTP,等等

  7. 选择Exit并按Enter

  8. X键退出sysinstall

您可以使用CVSup,这个程序让您获得和更新 ports collection 。CVSup需要使用 /usr/share/examples/cvsup/ports-supfile这个配置文件。 如果您想获得关于CVSup这个应用程序的更多信息,请看使用 CVSup (第 A.5 节) 和本文件。

CVSup 方法

使用CVSup获得 ports collection ,是一个非常快捷的方法。 如果您想保持您的 ports 树的最新状态,或学习更多关于CVSup的内容您可以阅读刚才提及的内容。

  1. 安装net/cvsup port。详情请参阅CVSup 安装 (第 A.5.2 节) 。

  2. root 用户,复制 /usr/share/examples/cvsup/ports-supfile 到一个新的地方,比如 /root 和您的家目录。

  3. 编辑 ports-supfile

  4. 修改 CHANGE_THIS.FreeBSD.org 到离您比较近的CVSup 服务器。请看 CVSup 镜像 (第 A.5.7 节) 服务器的完整列表。

  5. 运行 cvsup:

    # cvsup -g -L 2 /root/ports-supfile
    
  6. 运行这个命令之后将下载和应用所有变化的ports系统,除了在您的系统中重建ports系统。


4.5.2. 安装 Ports

当提到Ports collection时,第一个要说明的就是何谓“``skeleton''”。简单地说,一个port skeleton让一个程序在FreeBSD上简洁地编译并安装的所需文件的最小组合。每个port skeleton包含:

  • 一个 MakefileMakefile包括好几个部分,指出应用程序是如何编译和它将被安装在系统的哪个地方。

  • 一个 distinfo 文件。这个文件包括这些信息:这些文件用来对下载后的文件checksums,使用 md5(1) 来确保在下载过程中文件不会被破坏。

  • 一个files目录。这个目录包括在您的FreeBSD系统上编译和安装程序需要用到的补丁。这些补丁基本上都是些小文件,指出特定文件作了哪些修正。他们都是纯文本的的格式,基本上是这样的``Remove line 10'' 或``Change line 26 to this ...'',补丁文件使用了``diffs'',他们由 diff(1) 程序产生。

    这个目录也包含了在建立port时要用到的其它文件T。

  • 一个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 (security/portaudit) 中找到。 在安装新的 port 之前, 可以考虑先运行一下 portaudit -F 来抓取最新的漏洞数据库。 在每天的周期性系统安全检察时, 数据库会被自动更新, 并且会在这之后实施安全审计。 欲了解进一步的情况,请参阅 portaudit(1)periodic(8)


4.5.2.1. 从光盘安装 Ports

FreeBSD项目中官方的光盘文件不再包含distfiles。他们提供了许多更多的更好的使用编译好的软件包。如果您从 FreeBSD Mall 购买了像FreeBSD PowerPak这样的光盘产品,里面就包含了distfiles。下面的章节假设您已经有了一张FreeBSD的安装光盘。

把FreeBSD的光盘放入驱动器。Mount到/cdrom。(如果您使用了不同的 mount点,这个安装将不会工作。) 首先,改变目录到您要安装的port所在的目录:

# cd /usr/ports/sysutils/lsof

一旦进入了 lsof 的目录,您将会看到这个port的结构。下一步就是 make,或 ``build'',这个port。只需要在命令行简单地输入make命令。 做好之后,您可以看到下面的信息:

# make
>> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from file:/cdrom/ports/distfiles/.
===>  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的时候 ,您可能要留意任何出现的警告。

注: 你可以运行一个命令 make install 来替换 makemake install这两个分离的步骤。

注: 在一些shell中,为了对这些程序做快速查找的操作,它对环境变量PATH指定的目录中的可执行命令有缓存。对于在基本系统中的一部分shell(就像 tcsh),和在port中的一些shell(举个例子, shells/zsh),如果您使用了这些shell中的一个,你必须在安装完一个port后执行 rehash 命令, 这样新安装的程序才能使用。

注: 有一小部分的port由于许可协议的问题不允许包含在光盘内。可能是因为在下载前需要注册一些信息或不允许再发布,或者其他理由。如果您想安装的port不在光盘中,为此你将需要在线操作来安装 (请看 下一章节)。


4.5.2.2. 从互联网安装Port

作为最后一节, 本节假定您有一个可用的互联网连接。如果您没有,您需要察看上一章节从光盘安装, 或者手动放一份distfile到/usr/ports/distfiles

实际上从互联网安装port和从光盘安装差不多,不同的是从互联网下载distfile,而不是从光盘读取。

相关步骤是一样的:

# make install
>> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
Receiving lsof_4.57D.freebsd.tar.gz (439860 bytes): 100%
439860 bytes transferred in 18.0 seconds (23.90 kBps)
===>  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]
...
===>  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.
#

就像您看到的,唯一区别是有一行告知您系统正在从哪里获得port的distfiled的信息

ports系统使用 fetch(1) 去下载文件, 它有很多可以设置的环境变量,包含 FTP_PASSIVE_MODE, FTP_PROXY, and 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/

注: Some ports allow (or even require) you to provide build options which can enable/disable parts of the application which are unneeded, certain security options, and other customizations. A few which come to mind are www/mozilla, security/gpgme, and mail/sylpheed-claws. A message will be displayed when options such as these are available.


4.5.2.3. Overriding the Default Ports Directories

Sometimes it is useful (or mandatory) to use a different distfiles and ports directory. The PORTSDIR and PREFIX variables can override the default directories. For example:

# make PORTSDIR=/usr/home/example/ports install

will compile the port in /usr/home/example/ports and install everything under /usr/local.

# make PREFIX=/usr/home/example/local install

will compile it in /usr/ports and install it in /usr/home/example/local.

And of course,

# make PORTSDIR=../ports PREFIX=../local install

will combine the two (it is too long to completely write on this page, but it should give you the general idea).

Alternatively, these variables can also be set as part of your environment. Read the manual page for your shell for instructions on doing so.


4.5.2.4. Dealing with imake

Some ports that use imake (a part of the X Window System) do not work well with PREFIX, and will insist on installing under /usr/X11R6. Similarly, some Perl ports ignore PREFIX and install in the Perl tree. Making these ports respect PREFIX is a difficult or impossible job.


4.5.3. Removing Installed Ports

Now that you know how to install ports, you are probably wondering how to remove them, just in case you install one and later on decide that you installed the wrong port. We will remove our previous example (which was lsof for those of you not paying attention). As with installing ports, the first thing you must do is change to the port directory, /usr/ports/sysutils/lsof. After you change directories, you are ready to uninstall lsof. This is done with the make deinstall command:

# cd /usr/ports/sysutils/lsof
# make deinstall
===>  Deinstalling for lsof-4.57

That was easy enough. You have removed lsof from your system. If you would like to reinstall it, you can do so by running make reinstall from the /usr/ports/sysutils/lsof directory.

The make deinstall and make reinstall sequence does not work once you have run make clean. If you want to deinstall a port after cleaning, use pkg_delete(1) as discussed in the Packages section of the Handbook.


4.5.4. Ports and Disk Space

Using the ports collection can defiantly eat up your disk space. For this reason you should always remember to clean up the work directories using the make clean option. This will remove the work directory after a port has been built, and installed. You can also remove the tar files from the distfiles directory, and remove the installed ports when their use has delimited.

Some users choose to limit the port categories by placing an entry in the refuse file. This way when they run the CVSup application, it will not download the files in that category.


4.5.5. Upgrading Ports

注: Once you updated your ports collection, before attempting a port upgrade, you should check the /usr/ports/UPDATING file. This file describes various issues and additional steps users may encounter and need to perform when updating a port.

Keeping your ports up to date can be a tedious job. For instance, to upgrade a port you would go to the ports directory, build the port, deinstall the old port, install the new port, and then clean up after the build. Imagine doing that for five ports, tedious right? This was a large problem for system administrators to deal with, and now we have utilities which do this for us. For instance the sysutils/portupgrade utility will do everything for you! Just install it like you would any other port, using the make install clean command.

Now create a database with the pkgdb -F command. This will read the list of installed ports and create a database file in the /var/db/pkg directory. Now when you run portupgrade -a, it will read this and the ports INDEX file. Finally, portupgrade will begin to download, build, backup, install, and clean the ports which have been updated. portupgrade comes with a lot of options for different use cases, the most important ones will be presented below.

If you want to upgrade only a certain application, not the complete database, use portupgrade pkgname, include the flags -r if portupgrade should act on all those packages depending on the given package as well, and -R to act on all packages required by the given packages. To use packages instead of ports for installation, provide -P and to just fetch distfiles without building or installing anything, use -F. For further information see portupgrade(1).

注: It is important to regularly update the package database using pkgdb -F to fix inconsistencies, especially when portupgrade asks you to. Do not abort portupgrade while it is updating the package database, this will leave you an inconsistent database.

Other utilities exist which will do this, check out the ports/sysutils directory and see what you come up with.


4.6. Post-installation Activities

After installing a new application you will normally want to read any documentation it may have included, edit any configuration files that are required, ensure that the application starts at boot time (if it is a daemon), and so on.

The exact steps you need to take to configure each application will obviously be different. However, if you have just installed a new application and are wondering ``What now?'' these tips might help:

  • Use pkg_info(1) to find out which files were installed, and where. For example, if you have just installed FooPackage version 1.0.0, then this command

    # pkg_info -L foopackage-1.0.0 | less
    

    will show all the files installed by the package. Pay special attention to files in man/ directories, which will be manual pages, etc/ directories, which will be configuration files, and doc/, which will be more comprehensive documentation.

    If you are not sure which version of the application was just installed, a command like this

    # pkg_info | grep -i foopackage
    

    will find all the installed packages that have foopackage in the package name. Replace foopackage in your command line as necessary.

  • Once you have identified where the application's manual pages have been installed, review them using man(1). Similarly, look over the sample configuration files, and any additional documentation that may have been provided.

  • If the application has a web site, check it for additional documentation, frequently asked questions, and so forth. If you are not sure of the web site address it may be listed in the output from

    # pkg_info foopackage-1.0.0
    

    A WWW: line, if present, should provide a URL for the application's web site.

  • Ports that should start at boot (such as Internet servers) will usually install a sample script in /usr/local/etc/rc.d. You should review this script for correctness and edit or rename it if needed. See Starting Services for more information.


4.7. Dealing with Broken Ports

If you come across a port that does not work for you, there are a few things you can do, including:

  1. Fix it! The Porter's Handbook includes detailed information on the ``Ports'' infrastructure so that you can fix the occasional broken port or even submit your own!

  2. Gripe--by email only! Send email to the maintainer of the port first. Type make maintainer or read the Makefile to find the maintainer's email address. Remember to include the name and version of the port (send the $FreeBSD: line from the Makefile) and the output leading up to the error when you email the maintainer. If you do not get a response from the maintainer, you can use send-pr(1) to submit a bug report.

  3. Grab the package from an FTP site near you. The ``master'' package collection is on ftp.FreeBSD.org in the packages directory, but be sure to check your local mirror first! These are more likely to work than trying to compile from source and are a lot faster as well. Use the pkg_add(1) program to install the package on your system.


章 5. X Window 系统

5.1. 概述

FreeBSD 使用 XFree86 来为用户提供一个功能 强大的图形用户接口。XFree86 是一个开放源代码的 X Window 系统实现。这一章将介绍在 FreeBSD 系统上安装和 配置 XFree86。有关 XFree86 和它所支持的显示卡硬件的更多 信息,请查看 XFree86 网站。

在阅读完这一章后,您将会了解:

  • X 视窗系统的不同组件,它们是如何协同工作的。

  • 如何安装和配置 XFree86.

  • 如何安装和使用不同的窗口管理器。

  • 如何在 XFree86 中使用 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'' 运行在有键盘,显示器,鼠标的计算机上。 服务器用来管理显示信息,处理来自键盘和鼠标的输入等。 每一个 X 应用程序 (比如 XTerm, 或者 Netscape) 就是一个 ``client''。 一个 client 给服务器发送信息,如 ``Please draw a window at these coordinates'', 然后服务器就返回处理信息,如 ``The user just clicked on the OK button''。

如果您在只有一台计算机的家里或小型办公环境中使用 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 也是可以的,在它们上面也有很多免费的和商业化的应用程序。

在 FreeBSD 上使用的 X server 叫做 XFree86, 在遵循一个和 FreeBSD 的许可协议 相似的协议下可以免费使用。针对 FreeBSD 的商业化 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 的窗口风格),OpenLook, 和其他一些窗口部件集。

今天,绝大多数比较新的 X 应用程序将使用一个现代风格的窗口设计, 像 Qt, 用来设计 KDE, 或 GTK, 用来设计 GNOME。 在这样一种窗口系统下,UNIX 桌面的一些所见即所得特性作了一些收敛,以使 初学者感到更容易一些。


5.3. 安装 XFree86

在安装 XFree86 之前,您需要决定安装哪个版本。 XFree86 3.XXFree86 维护的一个分支。它非常稳定,而且支持很多的图形卡。然而,现在已经不对它进行更新了。 XFree86 4.X 是一个完全重新设计的分支,有很多新特性, 如更好的支持字体和 anti-aliasing。 不幸的是这个新的结构要求重新开发显示卡驱动程序,所以有些 3.X 支持的比较老的 显示卡 4.X 无法支持。因为这个分支所有新的显示卡的开发和支持已经完善, 所以现在 XFree86 4.X 是 FreeBSD 上 X Window 系统的 默认版本。

在安装过程中,FreeBSD 安装程序会提供给用户安装和配置 XFree86 4.X 的机会 (在第 2.9.12 节中讲过)。要安装运行 XFree86 3.X, 等到 FreeBSD 基本系统安装完成之后, 再安装 XFree86 3.X。例如,从 Ports Collection 编译安装 XFree86 3.X

# cd /usr/ports/x11/XFree86
# make all install clean

另外,XFree86 可以直接使用 XFree86 网站提供的 FreeBSD 二进 制包来安装.用 pkg_add(1) 工具来从二进制软件包来安装 XFree86 4.X也是可行的。当使用 pkg_add(1) 的远程下载特性时,必须去掉软件包的版本号。 pkg_add(1) 会自动下载 应用程序的最新版本。所以下载安装 XFree86 4.X 软件包,可以简单的输入:

# pkg_add -r XFree86

您也可以使用 Ports Collection 来安装 XFree86 4.X,您只需要输入 下面的命令:

# cd /usr/ports/x11/XFree86-4
# make install clean

注: 上面的例子将会安装完整的 XFree86 发行,包括服务器端,客户端,字体等等。 XFree86 4.X 不同部分的软件包和 Ports 也是可用的。

这一章余下的部分将会讲解如何配置 XFree86,和如何设置一个高效的桌面环境。


5.4. XFree86 的配置

Contributed by Christopher Shumway.

5.4.1. 开始之前

在配置 XFree86 4.X 之前, 您必须知道目标系统的下面一些信息:

  • 显示器规格

  • 显示卡的芯片类型

  • 显示卡的显存容量

显示器的规格可以被 XFree86 用来决定显示的分辨率和刷新率。 这些规格通常可以从显示器所带的文档中找到,也可以从生产商的网站找到。 需要知道两个数字范围:垂直刷新率和水平刷新率。

显示卡的芯片类型定义了 XFree86 使用什么驱动模块来驱动硬件。 对于绝大多数的硬件,都能被自动检测,但是在自动检测出错的时候了解 这些还是很有用处的。

显示卡的显存大小决定了目标系统的分辨率和颜色深度。这非常重要, 这样用户可以知道目标系统的限制。


5.4.2. 配置 XFree86 4.X

配置 XFree86 4.X 需要几步。 第一步是用 XFree86-configure 选项建立一个初始化的配置文件。 . 作为超级用户,简单的运行:

# XFree86 -configure

这会在 /root 目录下生成一个叫做 XF86Config.new 的大致的 XFree86 配置文件(事实上使用的目录是由隐含的 环境变量 $HOME 决定的,这取决于您得到超级用户权利的方式)。 XFree86 程序会试图检测 系统上的图形显示卡并写入配置文件以便在目标系统上探测硬件时能够加载正确的 驱动程序。

下一步将测试当前的配置以检验 XFree86 是否能在当前系统的显示设备上正常工作。要完成这个任务,只需要这样做:

# XFree86 -xf86config XF86Config.new

如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功 的。要退出测试,只要同时键入 Ctrl+Alt+Backspace

注: 如果鼠标不工作,请确保设备已经配置过。 请查看 第 2.9.10 节 FreeBSD 安装一章

下面,调整 XF86Config.new 配置文件以适应个人的口味。用文本编辑器 emacs(1)ee(1) 打开文件。要做的第一件事是为当前系统的显示器 添加频率。这些包括垂直和水平的刷新率。这些值可以被添加到 XF86Config.new 文件的 "Monitor" 部分:

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
        HorizSync    30-107
        VertRefresh  48-120
EndSection

HorizSyncVertRefresh 关键字可能不存在于配置文件中。 如果他们不存在,就需要添加他们,正确的水平同步刷新率添加在 HorizSync 关键字后面,垂直的同步刷新率添加在 VertRefresh 关键字后面。在上面的例子中 已经添加了。

X 允许可能的显示器使用 DPMS(能源之星) 特性。 xset(1) 程序控制超时时间可以强制待机,挂起或者关机。 如果您希望启用您的显示器的 DPMS 特性, 您必须将下面一行添加到 monitor 部分:

        Option       "DPMS"

XF86Config.new 配置文件被编辑器打开时,需要选择默认的分辨率和颜色深度, 这是通过 "Screen" 部分来定义的:

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultDepth 24
        SubSection "Display"
                Depth     24
                Modes     "1024x768"
        EndSubSection
EndSection

DefaultDepth 关键字描述了要运行的默认 颜色深度。这可以通过使用 XFree86(1)-bpp 选项来取代。 Modes 关键字 描述了给定颜色深度下屏幕的分辨率。 注意目标系统的图形硬件只支持 VESA 标准模式。 在上面的例子中,默认的颜色深度是24位色。在这个颜色深度下, 可以接受的分辨率是1024x768。

最后,用户可以写入配置文件,然后使用这个配置文件测试一下。 如果一切正常,那配置文件需要被安装在 XFree86(1) 能找得到的 地方。典型的比如 /etc/X11/XF86Config/usr/X11R6/etc/X11/XF86Config.

# cp XF86Config.new /etc/X11/XF86Config

一旦配置文件被放置在一个通用的位置,配置就完成了。为了用 startx(1) 启动 XFree86 4.X,需要安装 x11/wrapper port. XFree86 4.X 也可以用 xdm(1) 来启动。

注: 还有一个图形的配置工具, xf86cfg(1),是 XFree86 4.X 发行自带的。 它允许交互式的通过选择合适的驱动程序和设置来定义您的配置文件。 这个程序也可以在控制台下使用,使用命令 xf86cfg -textmode. 更多的细节,请查阅 xf86cfg(1) 手册页。


5.4.3. 高级配置主题

5.4.3.1. 配置 Intel® i810 显示芯片组

配置Intel i810芯片组的显示卡需要有针对 XFree86 的能够用来驱动显示卡的 agpgart AGP程序接口。 自从发行版本 4.8-RELEASE 和 5.0-RELEASE 发行以来 agp(4) 驱动程序就包含在 GENERIC 内核配置里面了。 在以前的发行版里,您必须要在您的内核配置文件里添加下面的一行:

device agp

然后重新编译一个新的内核。 或者,您可以在启动的时候使用 loader(8) 自动加载 agp.ko 内核模块。 简单的添加下面这行到 /boot/loader.conf 文件里:

agp_load="YES"

接下来,如果您正在运行 FreeBSD 4.X 或者更早的版本, 需要创建一个设备节点作为程序接口。 要创建 AGP 设备节点,在 /dev 下运行 MAKEDEV(8)

# cd /dev # sh MAKEDEV agpgart

注: FreeBSD 5.X 和以后的版本会使用 devfs(5) 来半透明的分配 设备节点,因此 MAKEDEV(8) 这一步是不必要的。

这也适用于其他的图形卡硬件配置。 注意如果系统没有将 agp(4) 驱动程序编译进内核,尝试用 kldload(8) 加载模块是无效的。 这个驱动程序必须编译进内核或者使用 /boot/loader.conf 在启动时加载进入内核。

如果您正在使用 XFree86 4.1.0 (或者以后的 版本) 并且出现了像 fbPictureInit 这样未解决的符号提示, 试着在 XFree86 配置文件里的 Driver "i810" 一行后面加入下面这行:

Option "NoDDC"

5.5. 在 XFree86 中使用字体

Contributed by Murray Stokely.

5.5.1. Type1 字体

XFree86 使用的默认字体不是很理想。 大型的字体显得参差不齐,看起来很不专业,在 Netscape 中,小字体也显得莫名颇�。 然而,有几个自由的,高质量的字体可以在 XFree86 中使用,version 3.X 或 version 4.X 都可以。例如,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 服务器这些字体的存在, 您需要在 XF86Config 文件中添加一行 (XFree86 版本3在 /etc/ 下 版本4在 /etc/X11/ 下):

FontPath "/usr/X11R6/lib/X11/fonts/URW/"

或者,也可以在命令行运行:

% xset fp+ /usr/X11R6/lib/X11/fonts/URW
% xset fp rehash

这样会起作用,但是当 X 会话结束后就会丢失, 除非它被添加到启动文件 (~/.xinitrc 中, 针对一个寻常的 startx 会话,或者当您通过一个类似 XDM 的图形登陆管理器登陆时添加到 ~/.xsession 中)。 第三种方法是使用新的 /usr/X11R6/etc/fonts/local.conf 文件: 查看 anti-aliasing 章节。


5.5.2. TrueType® 字体

XFree86 4.X 已经内建了对 TrueType 字体的支持。有两个不同的模块能够启用这个功能。 在这个例子中使用“freetype”这个模块,因为它与其他的字体描绘后端 是兼容的。要启用 freetype 模块,只需要将下面这行添加到 /etc/X11/XF86Config 文件的 "Module" 部分。

Load "freetype"

对于 XFree86 3.3.X,需要额外的 TrueType 字体服务器。 Xfstt 通常被用于这个目的。 要安装 Xfstt, 只要简单的安装 port x11-servers/Xfstt.

现在,为 TrueType 字体创建一个目录 (比如, /usr/X11R6/lib/X11/fonts/TrueType) 然后把所有的 TrueType 字体拷贝到这个目录。记住您不能直接从 Macintosh® 计算机中提取 TrueType 字体; 能被 XFree86 使用的必须是 UNIX/DOS/Windows 格式的。 一旦您已经拷贝了这些文件到这个目录,使用 ttmkfdir 来创建一个 fonts.dir 文件,以便让X字体引擎知道 您已经安装了这些新文件。 ttmkfdir 可以在 FreeBSD Ports Collection x11-fonts/ttmkfdir 中找到。

# cd /usr/X11R6/lib/X11/fonts/TrueType
# ttmkfdir > fonts.dir

现在把 TrueType 字体目录添加到字体路径中。 这和上面 Type1 字体的步骤是一样的, 那就是,使用

% xset fp+ /usr/X11R6/lib/X11/fonts/TrueType
% xset fp rehash

或者把 FontPath 行添加到 XF86Config 文件中。

就是这样。现在 Netscape, Gimp, StarOffice 和其他所有的 X 应用程序 应该可以认出安装的 TrueType 字体。一些很小的字体(如在 Web 页面上高分辨率显示的文本) 和一些很大的字体(在 StarOffice 下) 现在看起来已经很好了。


5.5.3. Anti-Aliased 字体

Updated for XFree86 4.3 by Joe Marcus Clarke.

XFree86 从 4.0.2 开始支持 Anti-aliased 字体。 然而,字体配置在 XFree86 4.3.0 之前是非常繁琐的。 从 4.3.0 版本开始,在 /usr/X11R6/lib/X11/fonts/~/.fonts/ 目录下的所有字体对支持 Xft 的应用程序 都可以自动的支持 anti-aliased。还不是所有的应用程序都支持 Xft,但是很多已经 有了 Xft 支持。 支持 Xft 的应用程序包括 Qt 2.3 以及更高版本(开发 KDE 桌面的工具包), Gtk+ 2.0 以及更高版本(开发 GNOME 桌面的工具包), 还有 Mozilla 1.2 以及更高版本。

要控制哪些字体是 anti-aliased,或者配置 anti-aliased 特性, 创建(或者编辑,如果文件已经存在的话)文件 /usr/X11R6/etc/fonts/local.conf。Xft 字体系统的几个 高级特性都可以使用这个文件来调节; 这一部分只描述几种最简单的情况。要了解更多的细节,请查看 fonts-conf(5).

这个文件一定是 XML 格式的。注意确保所有的标签都完全的关闭掉。 这个文件用一个 DOCTYPE 定义的普通的 XML 头开始, 然后是 <fontconfig> 标签:

      <?xml version="1.0"?>
      <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
      <fontconfig>
   

像前面所做的那样,在 /usr/X11R6/lib/X11/fonts/~/.fonts/ 目录下的所有字体已经可以被支持 Xft 的 应用程序使用了。如果您想添加这两个目录以外的其他路径, 简单的添加下面这行到 /usr/X11R6/etc/fonts/local.conf文件中:

<dir>/path/to/my/fonts</dir>

添加了新的字体,尤其是添加了新的字体目录后, 您应该运行下面的命令重建字体缓存:

# fc-cache -f

Anti-aliasing 会让字体边缘有些模糊,这样增加了非常小的文本的可读性, 然后从大文本字体中删除 ``staircases'' 但如果使用普通的文本,可能会引起眼疲劳。 要将字体大小范围控制在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> 标签来结束文件。 不这样做将会导致您的更改被忽略。

XFree86 默认的字体集当使用 anti-aliasing 时并不是很合适。一个更好的默认字体集合可以在 x11-fonts/bitstream-vera port 下面找到。如果 /usr/X11R6/etc/fonts/local.conf 文件不存在, 这个 port 将会安装它。如果文件已经存在了, 这个 port 将会创建 /usr/X11R6/etc/fonts/local.conf-vera 文件。把这个文件的内容合并进 /usr/X11R6/etc/fonts/local.conf, Bitstream 字体就会自动的取代默认的 XFree86 Serif,Sans Serif,和 Monospaced 字体。

最后,用户可以添加他们自己的设定通过他们个人的 .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 可能需要被更改为 bgr, vrgbvbgr:实验一下 看看那个更好。

Anti-aliasing 在您下次启动系统时就能用了。 然而,注意您的程序必须知道如何使用它。现在,Qt 工具包做到了, 所以整个 KDE 环境能够使用 anti-aliased 字体 (查看 KDE 上的 第 5.7.3.2 节 了解细节)。 Gtk+ 和 GNOME 也可以被编译为使用 anti-aliasing 通过 ``Font'' capplet (查看 第 5.7.1.3 节 了解细节)。默认情况下, Mozilla 1.2 以及更高版本都会自动的使用 anti-aliasing。要禁用它,使用 -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 第 20.3.2 节 for details)。为用户提供了同样功能。它可以完成系统的登陆任务, 然后为用户运行一个会话管理器 (通常是一个 X 视窗管理器)。接下来 XDM 就等待这个程序退出,发出信号用户已经登陆完成,应当退出屏幕。 这时, XDM 就可以为下一个登陆用户显示登陆和可选择屏幕。


5.6.2. 使用 XDM

XDM 精灵程序在 /usr/X11R6/bin/xdm 中。您可以在任何时候 用 root 来运行这个程序, 在本地机器上,它将启动管理X的画面。如果要 XDM 每次机器一启动就开始运行, 一个简单的办法是在 /etc/ttys 中加入一个记录。 有关这个文件的更多的格式和使用方法,可以看看 第 20.3.2.1 节。在默认的 /etc/ttys 文件中用于运行 XDM 守护程序的一行是这样的:

ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure

默认情况下,这个记录是关闭的,要启用它, 您需要把第5部分的 off 改为 on 然后按照 第 20.3.2.2 节 的指导 重新启动 init(8)。第一部分,这个程序将管理的终端名称是 ttyv8。这意味着 XDM 将运行在第9个虚拟终端上。


5.6.3. 配置 XDM

XDM 的配置目录是在 /usr/X11R6/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

这是一个默认的用来显示选项和登陆屏幕的应用程序文件。这 就是您能够定制登陆程序的外观的地方。这个格式与 XFree86 文档中描述的默认应用 程序文件是一样的。


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 server输出。如果一个 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的网页上找到。


5.7.1.2. 安装 GNOME

安装 GNOME的最简单的方法是 第 2.9.13 节 第 2 章描述的在FreeBSD安装过程中通过 ``Desktop Configuration''菜单来进行。 它们也可以很容易地从一个package或ports collection安装:

要从网络安装GNOME, 只要键入:

# pkg_add -r gnome2

从源代码编译GNOME,可以使用 ports树:

# cd /usr/ports/x11/gnome2 # make install clean

一旦GNOME被安装好, X Server必须被告知启动 GNOME以代替默认的窗口管理器。 如果在适当的位置已经定制好了文件.xinitrc, 简单地将启动当前窗口管理器的那行替换为 /usr/X11R6/bin/gnome-session。 如果对配置文件不想添加任何特殊改动,只需简单地键入:

% echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc

接着,键入startxGNOME桌面环境就启动了。

注: 如果已经使用了一个像 XDM这样的显示管理器,就不能这样做。 而是,用同样的命令创建一个可执行文件.xsession。 要这样做,需要先编辑文件,然后用 /usr/X11R6/bin/gnome-session替换已存在的窗口管理命令:

% echo "#!/bin/sh" > ~/.xsession % echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession % chmod +x ~/.xsession

另一个选项是在登陆时配置显示管理器允许您选择窗口管理器;有关 KDE 细节 会解释如何使用kdmKDE显示管理器来做。


5.7.1.3. 在GNOME上使用Anti-aliased字体

从 4.0.2 版本开始,XFree86 就通过他的``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 有一个以 KDE 的 ``KParts'' 技术为基础的办公套件。 它包括电子表格,幻灯片,日程管理和新闻等软件。 KDE 也包含一个与当前 UNIX 系统上其他Web浏览器相竞争的叫做 Konqueror 的浏览器。 systems. 关于 KDE 的更多信息可以在 KDE 网站上找到。 KDE 上关于 FreeBSD 的特定信息和资源,可以参考 FreeBSD-KDE team的网站。


5.7.2.2. 安装 KDE

GNOME 或其他桌面环境一样,安装 KDE 的最容易的方法是通过 第 2.9.13 节 第 2 章所描绘的 FreeBSD 安装过程的 ``Desktop Configuration'' 菜单来安装。 另外,它也可以很容易地从packages或ports collection安装:

要从网络安装 KDE 只需要:

# pkg_add -r kde

pkg_add(1) 就回自动的下在最新版本的应用程序。

要从源代码编译 KDE, 可以使用 port 树:

# 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或其他)。

首先,以 root 用户身份运行 KDE 控制面板,kcontrol。 通常情况下,以 root 身份运行 X 环境是很不安全的。 您应当以普通用户来使用窗口管理器, 打开一个终端窗口(例如 xterm 或者 KDEkonsole),用 su 来切换成 root(这个用户必须首先在 /etc/groupwheel 组里),然后再键入 kcontrol

点击左边标记 系统的图标,然后选择登陆管理器 。在右面,有几个配置选项, KDE 手册会解释的更加详细一些。 点击右边的会话。 点击新类型来添加几个窗口管理器或桌面环境。 这些只是标签,所以它们用 KDEGNOME要比用 startkde或者 gnome-session来得好。 也可以是failsafe

也可以用同样方法定制其他菜单,它们主要是起修饰和自我解释用的。 完成之后,键入Apply按钮,退出控制中心。

要确信kdm理解标签 (KDEGNOME等)的意思,需要编辑一些 xdm用的文件。

注:KDE 2.2中,这有些变化: kdm现在使用它自己的配置文件。 请看看KDE 2.2的文档。

在一个终端窗口,作为root用户,要编辑 /usr/X11R6/lib/X11/xdm/Xsession文件, 中间有一部分是这样的:

case $# in
1)
        case $1 in
        failsafe)
                exec xterm -geometry 80x24-0-0
                ;;
        esac
esac

需要在这部分加几行。 假定使用的标签是``KDE''和 ``GNOME'', 就像下面这样:

case $# in
1)
        case $1 in
        kde)
                exec /usr/local/bin/startkde
                ;;
        GNOME)
                exec /usr/X11R6/bin/gnome-session
                ;;
        failsafe)
                exec xterm -geometry 80x24-0-0
                ;;
        esac
esac

为了加上KDE 的登陆桌面背景, 需要在 /usr/X11R6/lib/X11/xdm/Xsetup_0中加入下面这行:

/usr/local/bin/kdmdesktop

现在,确信kdm/etc/ttys中列出来了,并且将被启动。 要这样做,只要跟着先前有关 XDM用法,用 /usr/X11R6/bin/xdm 程序的用法替换/usr/local/bin/kdm的用法就可以了。


5.7.3.2. Anti-aliased字体

从4.0.2版本开始, XFree86就可以通过它的 ``RENDER''扩展来支持anti-aliasing,从2.3版本开始, Qt (被KDE使用的工具包)也支持 这个扩展。在有关anti-aliasing X11字体的第 5.5.3 节节描述到了如何配置这些。 所以,对于现在的软件,anti-aliasing也可以用在 KDE桌面上。只需要到KDE 菜单,到 Preferences->Look and Feel->Fonts,然后点击 Use Anti-Aliasing for Fonts and Icons。 对于一个不是 KDE的一部分的Qt应用程序,环境变量 QT_XFT需要在启动程序前被设置成true


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/X11R6/bin/startxfce4" > ~/.xinitrc

接下来就是启动 X, XFce将成为您的桌面。 与以前一样,如果使用像 XDM 这样的显示管理器,需要创建一个 .xsession文件,就像有关 GNOME 的那节描述的, 使用/usr/X11R6/bin/startxfce4 命令,或者,配置显示管理器允许在启动时选择一个桌面, 就像有关kdm的那节描述的。

II. 常见的任务

前面已经介绍了必要的基础知识, 手册的这一部分将讨论 FreeBSD 的一些最常用的功能。 这些章节包括:

  • 向您介绍流行和实用的桌面应用程序: 浏览器、产品工具、文档察看程序,等等。

  • 向您介绍一系列可以在 FreeBSD 上使用的多媒体工具。

  • 介绍构建定制的 FreeBSD 内核以启用附加功能的方法。

  • 详细介绍包括桌面和网络打印机在内的打印系统设置。

  • 向您展示如何在 FreeBSD 上运行 Linux 应用程序。

某些章节希望您首先阅读过其他部分,在这些章的开头部分也会给出类似的提示。


章 6. 桌面应用

Contributed by Christophe Juniet.

6.1. 概述

FreeBSD能够运行相当多桌面应用程序, 象浏览器和字处理软件. 这些程序大部分都有package或者能从ports编译. 许多新用户希望在桌面上就可以找到这样的应用程序. 本章将介绍如何轻松的从package或ports安装一些常见的桌面应用程序.

需要注意的是从ports安装意味着要编译源码. 根据编译的ports和电脑速度的不同,这也许需要花费相当长的时间.若是你觉得编译源码太过于花费时间的话, 大部分的ports都有预先编译好的版本可以安装.

因为FreeBSD兼容Linux二进制的特性, 许多原本为Linux开发的程序都可以直接用在你的桌面. 在安装任何的Linux应用程序之前,强烈的推荐你阅读第 10 章. 当你在寻找特定的ports时,比如使用whereis(1)要记得许多利用Linux二进制兼容特性的ports都以``linux-''开头. 在下面的介绍中, 都假设安装Linux应用程序前已经开启了Linux二进制兼容功能.

本章涵盖以下种类应用程序:

  • 浏览器(例如Mozilla, Netscape, Opera, Firefox, Konqueror)

  • 办公,图象处理 (例如 KOffice, AbiWord, The GIMP, OpenOffice.org)

  • 文档查看(例如Acrobat Reader®, gv, Xpdf, GQview)

  • 财务 (例如 GnuCash, Gnumeric, Abacus)

阅读这章之前, 你应该:

  • 知道如何安装额外的第三方软件(第 4 章).

  • 知道如何安装Linux软件(第 10 章).

想要获得更多的有关多媒体环境的信息, 阅读 第 7 章. 如果你想要建立和使用电子邮件, 请参考第 22 章.


6.2. 浏览器

FreeBSD并没有预先安装特定的浏览器. 然而, 在ports的目录www有许多浏览器可以安装. 如果你没有时间一一编译它们(有些时候这可能需要花费相当长的时间) 大部分都有package可用.

KDEGNOME 已经提供HTML浏览器. 请参考第 5.7 节得到更多完整的有关设定这些桌面环境的信息.

如果你想要寻找小型的浏览器, 你可以在 www/dillo, www/links, 或 www/w3m试试看.

这一节涉及如下程序:

程序名称 资源需求 安装时间 主要依赖
Mozilla 大量时间和空间 Gtk+
Netscape 轻松 兼容Linux Binary
Opera 轻松 同时有可用的 FreeBSD 和 Linux 版本。 Linux版本需要使用 Linux 二进制兼容模块和 linux-openmotif
Firefox 中等 Gtk+
Konqueror 中等 需要 KDE

6.2.1. Mozilla

Mozilla 也许是FreeBSD桌面上最合适的浏览器了. 它新颖稳定, 且完整的移植到了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. Mozilla, Java™, 和 Macromedia® Flash

Contributed by Tom Rhodes.

安装Mozilla很简单, 但是安装Mozilla的额外支持比如象Java™和Macromedia® Flash™ 就会消耗很多时间和磁盘空间.

第一件事就是使用Mozilla下载要安装的文件. 让你的浏览器连接到http://www.sun.com/software/java2/download.html在他们的页面上建立一个帐户. 记得要保存用户名和密码,也许以后会用的着它. 下载j2sdk-1_3_1-src.tar.gz文件到/usr/ports/distfiles/位置,因为port不会自动的下载它. 这是因为许可证的限制. 然后从http://java.sun.com/webapps/download/Display?BundleId=7905下载``java 环境''. 它的文件名是j2sdk-1_3_1_08-linux-i586.bin比较大(大约是25MB!). 象前边一样, 这个文件必须放到/usr/ports/distfiles/. 最后下载``java patchkit''它在这里可以找到http://www.eyesbeyond.com/freebsddom/java/ 然后把它放在/usr/ports/distfiles/.

用标准的make install clean安装java/jdk13并且接着安装www/flashpluginwrapperport. 这个port需要emulators/linux_base这个庞大的port. 虽然有其它的Flash插件存在,然而他们对我来说却不能用.

如果Mozilla还没有安装,安装www/mozilla port.

现在用如下方式复制Flash插件:

# cp /usr/local/lib/flash/libflashplayer.so \
    /usr/X11R6/lib/browser_plugins/libflashplayer_linux.so
# cp /usr/local/lib/flash/ShockwaveFlash.class \
    /usr/X11R6/lib/browser_plugins/

把下面这些行加入到 Mozilla 启动脚本 /usr/X11R6/bin/mozilla的开头 (在 #!/bin/sh 之后)。

LD_PRELOAD=/usr/local/lib/libflashplayer.so.1
export LD_PRELOAD

这将会启用Flash插件.

现在只要如下启动Mozilla:

% mozilla &

并且从Help菜单选取About Plug-ins 选项,所有可用的插件列表就会出现. JavaShockwave® Flash 应该都会被列出.


6.2.3. Netscape®

ports collection里包含数个版本的Netscape浏览器. 因为FreeBSD 版本包含有一个严重的安全问题, 强烈建议不要安装它们. 作为替代, 使用最近的Linux 或者其它UNIX版本.

最新的稳定版的Netscape 浏览器是Netscape 7. 它可以从ports collection安装:

# cd /usr/ports/www/netscape7
# make install clean

在French, German, 和Japanese目录下,也有本地化过的版本.

注意不推荐你使用Netscape 4.x版本,因为它已经不适应当今的标准. 然而, Netscape 7.x和最新的版本只可以使用在i386平台.


6.2.4. Opera

Opera是一个快速,拥有许多特性, 和标准兼容的浏览器. 它有两个版本:``native''FreeBSD版本和一个可运行在Linux模拟器下的版本.对于每个操作系统, 它都有一个免费的但是有广告和一个没有广告但是必须向Opera web site付费的版本.

要使用Opera的FreeBSD版本来浏览网页,安装以下的package:

# pkg_add -r opera

有些FTP站点没有所有版本的package, 你也可以通过ports collection来安装:

# cd /usr/ports/www/opera # make install clean

要安装Linux版本的 Opera,将上面例子中的opera 替换为linux-opera. Linux版本在某些情况下非常有用,象是使用只有Linux版本的插件, 例如Adobe Acrobat Reader. 不然的话在其它方面, FreeBSD和Linux版本是完全一样的.


6.2.5. Firefox

Firefox is the next-generation browser based on the Mozilla codebase. Mozilla is a complete suite of applications, such as a browser, a mail client, a chat client and much more. Firefox is just a browser, which makes it smaller and faster.

Install the package by typing:

# pkg_add -r firefox

You can also use the ports collection if you prefer to compile from source code:

# cd /usr/ports/www/firefox
# make install clean

6.2.6. Konqueror

Konqueror is part of KDE but it can also be used outside of KDE by installing x11/kdebase3. Konqueror is much more than a browser, it is also a file manager and a multimedia viewer.

Konqueror also comes with a set of plugins, available in misc/konq-plugins.

Konqueror also supports Flash and a How To is available at http://freebsd.kde.org/howto.php.


6.3. 办公,图象处理

当需要进行办公,或者进行图象处理, 新用户通常都会找一些好用的办公套件或者字处理软件. 目前有一些桌面环境比如象 KDE已经提供了办公套件. FreeBSD提供所有的要求,桌面环境也不例外.

这节涉及如下程序:

软件名称 资源需求 安装时间 主要依赖
KOffice KDE
AbiWord Gtk+GNOME
The Gimp Gtk+
OpenOffice.org GCC 3.1, JDK™ 1.3, Mozilla

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 AbiWord2

如果没有可用的package,它也可以从ports collection编译. ports collection 应该是最新的. 它的安装方式如下:

# cd /usr/ports/editors/AbiWord2
# make install clean

6.3.3. The GIMP

对图象的编辑或者加工, The GIMP是一个非常精通图象处理的软件.它可以被用来当作简单的绘图程序或者一个专业的照片处理套件. 它支持大量的插件和具有脚本界面的特性. The GIMP可以读写众多的文件格式. 它支持扫描仪和手写板.

你可以用下列命令安装:

# pkg_add -r gimp

如果你在FTP站点没有找到这个package, 你也可以使用ports collection的方法安装. ports的 graphics 目录也包含有The Gimp 手册. 以下是安装它们的方法:

# cd /usr/ports/graphics/gimp1
# make install clean # cd /usr/ports/graphics/gimp-manual-pdf
# make install clean

注: ports中的 graphics 目录也有开发中的The GIMP版本 graphics/gimp-devel. The Gimp 手册的HTML和PostScript®版本在 graphics/gimp-manual-htmlgraphics/gimp-manual-ps.


6.3.4. OpenOffice.org

OpenOffice.org 包括一套完整的办公套件: 一个字处理程序, 一个电子表格程序, 一个演示文档管理程序,和一个绘图程序. 它和其它的办公套件的特征非常相似, 它可以导入输出不同的流行的文件格式. 它包括一些不同的语言界面, 拼写检查和字典.

OpenOffice.org的字处理程序使用XML文件格式使它增加了可移植性和灵活性. 电子表格程序支持宏语言和使用外来的数据库界面. OpenOffice.org已经可以平稳的运行在Windows, Solaris™, Linux, FreeBSD, 和 Mac OS X等各种操作系统下. 更多的有关OpenOffice.org的信息你可以在 OpenOffice网页找到. 对于特定的FreeBSD版本的信息, 你可以在直接在FreeBSD OpenOffice 版本移植小组的页面下载.

安装OpenOffice.org,方法如下 :

# pkg_add -r openoffice

一旦package被安装, 你必须运行setup程序并且选择一个标准的工作站设置.运行下面的命令来使用 OpenOffice.org:

% openoffice-setup

如果没有可用的OpenOffice.orgpackage, 你仍旧可以选择编译port. 然而, 你必须记住它的要求以及大量的磁盘空间和相当长的时间编译.

# cd /usr/ports/editors/openoffice
# make install clean

一旦这个完成, 运行 OpenOffice.orgsetup设置程序并且选择一个 标准的工作站设置 如下:

% cd /usr/ports/editors/openoffice
% make install-user

如果你想要使用一个本地化的版本, 有如下一些ports可用:


6.4. 文档查看器

一些新的文档格式近来得到流行.它们所需要的标准查看器可能不一定在系统内 . 在本节我们将了解如何安装它们.

这节涵盖如下应用程序:

软件名称 资源需求 安装时间 主要依赖
Acrobat Reader Linux二进制兼容
gv Xaw3d
Xpdf FreeType
GQview Gtk+GNOME

6.4.1. Acrobat Reader®

现在许多文档都用PDF格式, 根据``轻便小巧文档格式''的定义. 一个被建议使用的查看器是 Acrobat Reader, 由Adobe所发行的Linux版本. 因为FreeBSD能够运行Linux二进制文件, 所以它也可以用在FreeBSD中.

安装Acrobat Reader 5 package, 如下:

# pkg_add -r acroread5

通常, 如果package不可用或者你想要一个最新的版本, 你可以用ports collection来安装:

# cd /usr/ports/print/acroread5
# make install clean

注: Acrobat Reader 有几个不同的版本可用. 在写这个的同时它们已经有如下版本: print/acroread (version 3.0.2), print/acroread4 (version 4.0.5), 和 print/acroread5 (version 5.0.6). 它们不全是都有packag给你现在版本的FreeBSD使用. ports collection总是包含最新的版本.


6.4.2. gv

gvPostScript 和PDF文件格式查看器. 它源自ghostview 因为使用Xaw3d 函数库让它看起来更美观. 它很快而且界面很干净. gv 有很多特性比如象纸张大小, 刻度, 或者抗锯齿. 大部分操作都可以用键盘或鼠标完成.

安装gvpackage,如下:

# pkg_add -r gv

如果你没有可用的package, 你可以使用ports collection安装:

# cd /usr/ports/print/gv # make install clean

6.4.3. Xpdf

如果你想要一个小型的FreeBSD PDF查看器, Xpdf 是一个小巧并且高效的查看器. 它只需要很少的资源而且非常稳定. 它使用标准的X字体并且不需要Motif 或者其它的X toolkit.

安装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

6.5.1. GnuCash

GnuCashGNOME努力提供容易使用且功能强大的软件给最终用户的一个部分. 使用 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 桌面环境的一部分. It features convenient automatic ``guessing'' of user input according to the cell format and an autofill system for many sequences. 它能导入一些流行的文件格式比如象,Excel, Lotus 1-2-3, 或 Quattro Pro. Gnumeric 凭借math/guppi支持图表. 它有大量的嵌入函数和允许所有通常比如象,数字,货币,日期,时间等等的一些单元格式.

安装Gnumericpackage, 如下:

# pkg_add -r gnumeric

如果package不可用, 你可以使用ports collection安装:

# cd /usr/ports/math/gnumeric
# make install clean

6.5.3. Abacus

Abacus 是一个小巧易用的电子表格程序. 它包含许多嵌入函数在一些领域如,统计学,财务和数学方面很有帮助. 它能导入和输出Excel 文件格式. Abacus 可以产生PostScript 输出.

安装Abacuspackage, 如下:

# pkg_add -r abacus

如果package不可用,你可以使用ports collection安装:

# cd /usr/ports/deskutils/abacus
# make install clean

6.6. 总结

当FreeBSD因为它的效能和稳定而在ISP之间流行, 它也可以完全应用在桌面环境. 拥有数以千计的 packages 或者 ports, 你可以为你的需要建立完美的桌面环境.

一旦你完成了你的桌面环境的安装, 你可能想要进一步了解 misc/instant-workstation. ``meta-port'' 允许你为一个工作站建立一个定制的ports设置. 你可以编辑/usr/ports/misc/instant-workstation/Makefile定制它. 接着是缺省添加和删除ports的语法, 和使用通常的步骤建立它. 最后, 你将能建立一个适合你自己桌面的大的package和在你的其它的工作站上安装它!

下面是本章涉及到的所有的软件的快速回顾:

软件名称 Package名称 Ports名称
Mozilla mozilla www/mozilla
Netscape linux-netscape7 www/netscape7
Opera linux-opera www/linux-opera
Firefox firefox www/firefox
KOffice koffice-kde3 editors/koffice-kde3
AbiWord AbiWord-gnome editors/AbiWord
The GIMP gimp graphics/gimp1
OpenOffice.org openoffice editors/openoffice
Acrobat Reader acroread5 print/acroread5
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广泛地支持各种声卡,让你可以从容地欣赏来自你的计算机的高保真输出。包括了录制和播放MP3、WAV和Ogg Vorbis等许多种格式声音的能力。“FreeBSD Ports 集” 同时也包括了许多的应用程序,让你可以录音、增加声音效果以及控制附加的MIDI设备。

要是乐于动手,FreeBSD也能支持播放一般的视频文件和DVD文件。可以对各种视频媒体进行编码、转换和播放的应用程序的数目并不比处理声音的程序少。例如,到写这章这止,在“FreeBSD Ports 集”并没有一个好的再编码程序,象audio/sox一样,可以在两个编码格式这间进行转换。但是,在这个领域,软件的前景是快速变化不定的。

本单将描述配置声卡的几个关键的步骤。在XFree86 (第 5 章)的配置和安装安装里已经考虑到了你显卡的问题,但要想有更好的播放效果,这里要仍有一关键性的东西。

读了本章后,你将知道:

  • 如何配置系统识别声卡。

  • 运用样本程序去测试声卡工作的方法。

  • 如何排除声卡安装中的问题。

  • 如何播放和编码MP3以及其它格式的音频。

  • 视频是怎样被XFree86支持的。

  • 哪些好的视频播放/压缩“ports”。

  • 如何播放DVD、 .mpg.avi 文件。

  • 如何从CD和DVD中提取文件。

  • 怎样配置电视卡。

在读本章这前,你应该:

  • 知道如何配置、安装一个新的内核 (第 8 章)

在视频部份,假定已经安装了XFree86 4.X (x11/XFree86-4)。在XFree86 3.X下可能也工作,但本章所述的内容并没有在它上边测试。如果你发现这些内容在XFree86 3.X下也工作的话,敬请通知我们。

警告mount(8) 命令去装载CD光盘,至少会产生一个错误,更糟的会产生内核震荡(kernel panic)。这种媒体所用的编码与通常的ISO文件系统是不同的。


7.2. 安装声卡

贡献者 Moses Moore.

7.2.1. 选择正确的设备

在开始之前,你应该清楚声卡类型、所用的芯片以及它是PCI还是ISA卡。FreeBSD支持大量的PCI卡和ISA卡。如果你在下面的列表中没有找到你的声卡类型,那么你可以去pcm(4)看看。虽然下面的列表不全,不过也包括大部份最常见的声卡类型。

  • Crystal 4237, 4236, 4232, 4231

  • Yamaha OPL-SAx

  • OPTi931

  • Ensoniq AudioPCI 1370/1371

  • ESS Solo-1/1E

  • NeoMagic 256AV/ZX

  • SoundBlaster® Pro, 16, 32, AWE64, AWE128, Live

  • Creative ViBRA16

  • Advanced Asound 100, 110, and Logic ALS120

  • ES 1868, 1869, 1879, 1888

  • Gravis UltraSound

  • Aureal Vortex 1 or 2

要使用声卡,你就应装载正确的驱动程序。完成的方式有两种:最简单的是使用命令kldload(8)来装载一个内核模块,在命令行输入

# kldload snd_emu10k1.ko

或者在文件/boot/loader.conf里加入一行,内容如下

snd_emu10k1_load="YES"

上边实例用于Creative SoundBlaster Live!声卡。其它可装载的模块列在文件/boot/defaults/loader.conf里边。 如果不知道应该使用哪个驱动, 您可以尝试加载 snd_driver, 这是一个“元驱动”, 它会自动加载绝大多数常见的设备驱动, 这有助于帮您快速找到合适的驱动。

另外,你也可以把支持你声卡的代码静态地编译到内核里去。下面的部份就采用这种方式支持硬件给出提示。关于重新编译内核,请参考第 8 章


7.2.1.1. Creative, Advance, and ESS 声卡

如果你有上面的某一种声卡的话,就请增加:

device pcm

到内核配置文件里去。如果你的是即插即用的ISA卡,就请再加入:

device sbc

对于非即插即用的ISA卡,加入:

device pcm
device sbc0 at isa? port 0x220 irq 5 drq 1 flags 0x15

到内核配置文件里去。上面给出的设置都是默认的。你可能要改变IRQ或其它的设置来符合你的声卡。参看sbc(4)页面获取更多信息。

注: Sound Blaster Live声卡在FreeBSD 4.0以下没有补丁是不被支持的,而关于补丁本章并不涉及。因此如果你要用这种声卡的话,建议你升级系统到最新的稳定版(STABLE)。


7.2.1.2. Gravis UltraSound Cards

如果是即插即用的ISA卡,请增加:

device pcm
device gusc

到内核配置文件里去。如果是即插即用的ISA卡,就请增加:

device pcm
device gus0 at isa? port 0x220 irq 5 drq 1 flags 0x13

到内核配置文件里去。你可能要改变IRQ或其它的设置来符合你的声卡。参看gusc(4) 页面获取更多信息。


7.2.1.3. Crystal Sound Cards

对于Crystal声卡,请增加:

device pcm
device csa

到内核配置文件里去。


7.2.1.4. 一般性支持

如果是即插即用的ISA卡或PCI卡,请增加:

device pcm

到内核配置文件里去。如果是非即插即用的ISA卡并且又没有桥路驱动器(bridge driver)的话,就请增加:

device pcm0 at isa? irq 10 drq 1 flags 0x0

到内核配置文件里去。你可能要改变IRQ或其它的设置来符合你的声卡。


7.2.1.5. 集成声卡

一些集成声卡的计算机可能需要在内核配置文件中做如下设置:

options PNPBIOS

注: 如果你正在运行FreeBSD 5.0 或更新版本,那么就不需要PNPBIOS选项了。这个选项已经被移除,而其功能现在是一直是有效的。


7.2.2. 创建和测试设备结点

重启后,登入系统,检查文件/var/run/dmesg.boot中的设备,如下所示:

# grep pcm /var/run/dmesg.boot
pcm0: <SB16 DSP 4.11> on sbc0

输出结果可能与你的系统有所不同。如果没有pcm设备显示正常,则说明先前什么地方出了错。如果真的出了错,就请再回到内核配置文件中检查一下,确信是否选对了设备。一般性的问题列在第 7.2.2.1 节中。

注: 如果你用的是FreeBSD 5.0或更新,你可以放心略过剩下部份不看。这些版本都使用了devfs(5)来自动创建设备结点。

如果先前的命令返回pcm0,你必须以用户root运行下边的命令:

# cd /dev
# sh MAKEDEV snd0

如果先前的命令返回pcm1,执行上边同样的命令,记得把snd0换成snd1

注: 上边的命令不会创建 /dev/snd 设备!

MAKEDEV能创建一组设备结点,其中包括:

设备 描述
/dev/audio Sparc®兼容的音频设备
/dev/dsp 数字声音设备
/dev/dspW /dev/dsp一样,只是采样率是16位(bit)
/dev/midi 存取 Raw 和 midi 设备
/dev/mixer 控制端口混音设备
/dev/music 2阶音序接口
/dev/sequencer 音序设备
/dev/pss 可编程设备接口

如果一切顺利,你的声卡应该能发声了。如果你的CD-ROM或者DVD-ROM光驱连接到了声卡,你现在就可以放一张CD到光驱里使用cdcontrol(1)命令来播放了:

% cdcontrol -f /dev/acd0c play 1

程序各不相同,如audio/workman提供了很好的界面。或许你会想安装一个像audio/mpg123一样的程序来听MP3。


7.2.2.1. 常见问题

错误信息 解决方法
``unsupported subdevice XX''

一个或多个设备结点没有正确地建立。重复上面的步骤。

``sb_dspwr(XX) timed out''

I/O端口没有设置正确。

``bad irq XX''

IRQ设置不正确。确信设定的IRQ和声卡的IRQ是一样的。

``xxx: gus pcm not attached, out of memory''

没有足够的内存空间供设置使用。

``xxx: can't open /dev/dsp!''

使用命令fstat | grep dsp进行检查是否有其它的程序打开了设备。值得注意的是esoundKDE提供的声卡支持造成麻烦。


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/dsp0x,这里x为0到3,因为在上面的例子里hw.snd.pcm.0.vchans被设为了4。在使用devfs(5)的系统里,上边那些会自动分配给用户。


7.2.4. 如何设置混音器通道值

这一节的作者是 Josef El-Rayes.

不同的混音通道的默认音量是硬编码进 pcm(4) 驱动程序的。 同时,也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如:

hint.pcm.0.vol="100"

pcm(4) 加载时,这一设置将改变音量通道原本是100的默认值。

注: 只有 FreeBSD 5.3 和更高版本才支持这一功能。


7.3. MP3音频

贡献者Chern Lee.

MP3 (MPEG Layer 3 Audio)达到过CD音质的效果,FreeBSD工作站没理由会缺少这样的好东东。


7.3.1. MP3播放器

到目前为止,最为流行的XFree86 MP3 播放器是XMMS (X 多媒体系统)。Winamp肤面可以应用到XMMS上,因为它与Nullsoft's Winamp的GUI(图形界面)几乎是相同的。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/acd0a -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光驱中抓取音轨,从第 16.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 千位是标准的MP3位率(bitrate)。许多人可能喜欢更高的品质像160或192。更高的位率,会使MP3占用更多的磁盘空间--只是音质会更高。选项 -h 控制 ``高品质但低速度(higher quality but a little slower)'' 模式的开关。选项 --t 表示把 ID3 标签--通常包含了歌曲的信息 ,植入到MP3文件里。其它的编码选项可以查询lame的帮助页(man page)。


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(raw 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

阅读第 16.6 节 这部份可以了解到更多在FreeBSD里刻盘的信息。


7.4. 视频回放

贡献者Ross Lippert.

视频回放是个很新并且迅速发展中的应用领域。一定要有耐心,因为不是所有的事情都象处音频那么顺利。

在开始之前,你要了解显卡的类型以及它所用的芯片的类型。虽然XFree86 支持大量的显卡,但能达到好的回放效果的却寥寥无几。在X11运行时,你可以使用命令 xdpyinfo(1),获得使用你的显卡的X服务器(X server)所支持的扩展列表。

为了评估各种播放器和设置,你须要有一小段用作测试的MPEG文件。由于一些DVD播放器会默认地在 /dev/dvd里去找DVD文件,因此,你会发样建立符号链接到恰当的设备会很有用:

# ln -sf /dev/acd0c /dev/dvd
# ln -sf /dev/racd0c /dev/rdvd

在使用了devfs(5)的FreeBSD 5.X里, 有一个略微不同的推荐链接集:

# ln -sf /dev/acd0c /dev/dvd
# ln -sf /dev/acd0c /dev/rdvd

注意:由于devfs(5)本身的原因,象这样手工建立的链接在重启后将不会存在。想要无论什么时候你启动系统都能自动建立符号链接,那就把下边这行加到/etc/devfs.conf里边:

link acd0 dvd
link acd0 rdvd

另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。

一些未定的ports(ports discussed)要正确地建立(build)有赖于下列内核的选项设置。在试图建立之前,把这些选项增加到内核配置文件中去,建立新的内核,重启系统:

option CPU_ENABLE_SSE
option USER_LDT

注: option USER_LDT 在FreeBSD 5.X里并不存在。

为了增强用于共享内存的X11接口,推荐增加一些sysctl(8) 参数的值:

kern.ipc.shmmax=67108864
kern.ipc.shmall=32768

7.4.1. 测定视频的性能

在X11下有几种可以显示图像的方式。倒底哪个能工作很大程序上依赖于硬件。首先,下边描述的每一种方法在不同的硬件上都会有不同的品质。其次,在X11里的图像显示近来引起普遍的关注,随着 XFree86 的每一个版本,都会有很大的突破。

常见图像接口列表:

  1. X11: 一般性的使用共享内存的X11输出。

  2. XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。

  3. SDL: 简单直接媒体层。

  4. DGA: 直接图片存取。

  5. SVGAlib: 低层次掌控图片层。


7.4.1.1. XVideo

XFree86 4.X有种扩展叫做XVideo (或称Xvideo, Xv, xv) ,它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。即使在底端机器里(例如我的PIII 400 Mhz膝上电脑),这个扩展也提供了很好的播放质量。可惜的是支持这种功能的卡中找去找来就只有目前的几种:

  1. 3DFX Voodoo 3

  2. Intel i810 and i815

  3. 部份 S3 芯片组(such as Savage/IX and Savage/MX)

即使你的显卡不在其中,你也不要失望。XFree86 4.X 每一次出品都会增加新的xv能力 [5]. 要检查扩展功能是否在运行,可以使用命令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,则只是说明你的显示器在满足刷新图像的计算要求上存在更大的因难。尽管显卡和处理器很重要,你仍然会有个不错的显示效果。 You should probably read about ways of improving performance in the advanced reading 第 7.4.3 节.


7.4.1.2. 简单直接媒体层

简单直接媒体层(SDL),原意是做为Microsoft Windows, BeOS, 和 UNIX之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL层可以在低层访问硬件,有时这样做就比X11接口层更为高效。

关于SDL可以参考devel/sdl12


7.4.1.3. 直接图形存取

“直接图形存取”是XFree86的扩展,它允许一个程序迂回X server和直接改变帖缓冲(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内核。这些问题并不总是被prot编护人员注意到或处理过,这也就可能导致如下问题:

  1. 使用/proc/cpuinfo去检测处理器的特性。

  2. 滥用线程可能导致一个程序悬挂完成,而不是完全中止。

  3. 软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。

现在,这些程序的开发人员也已同port的维护人员进行了联合,以减少制作port(port-ing)时出错。


7.4.2.1. MPlayer

MPlayer是近来开发的同时也正迅速发展着的一个视频播放器。MPlayer团队的目标是在Linux和其它UNIX系统中的速度和机动性能。在团队的创始人实在受不了当时可用的播放器的性能时,这个计划就开始了。有人也许会说图形接口已经成为新型设计的牺牲品。但是一但你习惯了命令行选项和按键控制方式,它就能表现得很好。


7.4.2.1.1. 创建MPlayer

MPlayer存放在multimedia/mplayer中。在创建的过程中 MPlayer要完成很多的硬件检测,最后得到一个二进制文件,这个文件不能移支其它系统里使用。 因此,要从ports里边创建时,而不要使用“包”,这点很重要。另外,还有几个选项要在make的命令行里指定。在正式创建(build)之前,要说的就这些。

# cd /usr/ports/multimedia/mplayer
# make
You can enable additional compilation optimizations
by defining WITH_OPTIMIZED_CFLAGS
You can enable GTK GUI by defining WITH_GUI.
You can enable DVD support by defining WITH_DVD.
You can enable SVGALIB support by defining WITH_SVGALIB.
You can enable VORBIS sound support by defining WITH_VORBIS.
You can enable XAnim DLL support by defining WITH_XANIM.

如果你已经安装了x11-toolkits/gtk12,那么你就可以选用GUI了。否则,就不用这样做了。如果你想用MPlayer来播放DVD文件(很可能是CSS编码),你就必须在此处[6]的选项里选用“DVD支持”。一些可用的选项:

# make WITH_DVD=yes WITH_SVGALIB=yes

在写这章时,MPlayer port已会创建自已的HTML文档和一个可执行的mplayer。当然也可以创建一个编码器--mencoder,它是一个可以对视频再编码的工具。修改一下Make文件(Makefile)就可以得到。这在随后的port版本中是默认的。

MPlayer的HTML文档信息很丰富。如果你发现本章关于视频硬件和接口的信息还不全面的话,MPlayer的文档会是个充分的补充。你要认真地花上一定的时间去读读MPlayer的文档,如果你正找寻关于UNIX里支持视频的信息的话。


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 DEVICE(设备名),这里 N 指要播放的主题号,DEVICE 指的是的DVD光驱(DVD-ROM)的设备结点。例如:要从/dev/dvd播放主题3:

# mplayer -vo dga -dvd 3 /dev/dvd

要停止、暂停、前进等等,可以参考设定的按键---这些可以执行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 /dev/dvd

输出文件out.vob将是MPEG并且可以被这部份描述的其它“包”利用。


7.4.2.1.3. mencoder

如果你在创建选择MPlayer里选择安装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 /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不是一个播放器,而是一套再编码.avi.mpg 文件的工具。使用transcode,借助标准输入输出(stdin/stdout)流接口,利用命令行工具,可以合并视频文件、修复坏文件。

MPlayer一样, transcode是个实验性软件,必须通过portmultimedia/transcode来建立。make使用了大量的选项。我们推荐:

# make WITH_LIBMPEG2=yes

如果你计划安装multimedia/avifile,那么就把选项WITH_AVIFILE加到你的make命令行里,如下所示:

# make WITH_AVIFILE=yes WITH_LIBMPEG2=yes

这里有两个使用transcode进行可调整视频输出的转换实例。第一个把输出编码成openDIVX AVI文件,第二个是编码成更为小巧的MPEG格式。

% transcode -i input.vob -x vob -V -Z 320x240 \
-y opendivx -N 0x55 -o output.avi
% transcode -i input.vob -x vob -V -Z 320x240 \
-y mpeg -N 0x55 -o output.tmp
% tcmplex -o output.mpg -i output.tmp.m1v -p output.tmp.mpa -m 1

有个关于transcode的参考页,仅有很少的关于各种tc*(如 tcmplex)应用的文档,这也是安装了的。命令行选项 -h 有时也可以给出简单的使用格式的说明。

相比之下,transcodemencoder运行起来要慢许多,但它可以制作出更多可播放的文件。例如,用transcode创建的MPEG文件众所周知可以在Windows Media® Player 和 Apple's Quicktime®里播放。


7.4.3. 进一步了解

FreeBSD里不同的视频软件包正迅速发展中。很可能在不久的将来,这里所谈到的问题都将得到解决。同时,有些人想超越FreeBSD的声/像(A/V)能力,那他们就不得不从一些FAQ和指南里学知识,并使用一些不同的应用程序。这里就给这些读者指出一些补充信息。

The MPlayer 文档是很技术性的。这些文档可以给那些希望获得关于UNIX视频高级技术的人们提供参考。MPlayer邮件列表很不喜欢没耐心阅读文档的人,如果你发现什么问题,想报告给他们--RTFM的话。

The 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文件了解更多详细关于可用选项的资料。(如果你在FreeBSD 4.X下,就使用/usr/src/sys/i386/conf/LINT代替 /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 可以使用图像扫描仪。 对扫描仪的标准的访问是通过 FreeBSD Ports Collection 中的 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 设备节点。

注: 在 FreeBSD 4.X 上,USB 进程(usbd(8)) 必须运行来检测 USB 设备。要启用它, 添加 usbd_enable="YES" 到您的 /etc/rc.conf 文件中并重新启动。


7.6.2.2. SCSI 接口

如果您的扫描仪是 SCSI 接口的, 重要的是要知道您使用哪种 SCSI 控制器。 取决于所使用的 SCSI 芯片, 您需要调整内核配置文件。 GENERIC 的内核支持最常用的 SCSI 控制器。确保阅读 NOTES 文件(在 FreeBSD 4.x 下面是 LINT)并在您的内核配置文件中添加正确的行。 除了 SCSI 适配器驱动之外, 您还需要在内核配置文件中有如下行:

device scbus
device pass

一旦完全编译好您的内核, 您就可以在启动时的系统消息缓冲中看到这些设备:

pass2 at aic0 bus 0 target 2 lun 0
pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device
pass2: 3.300MB/s transfers

如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 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 权限来完成的。You may however, need 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/uscanner0,这个节点属于 operator 组。将用户 joe 添加到 operator 组会允许他使用扫描仪:

# pw groupmod operator -m joe

要了解更多细节请阅读 pw(8) 手册页。

注: 当然,考虑安全的因素,您在添加用户到任何组, 尤其是 operator 组的时候都应该三思而后行。


章 8. 配置FreeBSD的内核

Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.

8.1. 概述

内核是FreeBSD操作系统的核心。它用来管理内存,执行 安全控制,网络,磁盘访问等等。虽然现在FreeBSD可以更多地 进行动态配置,但有时你还是需要重新配置和编译你的内核。

读完这章,你将了解到:

  • 为什么需要建立一个定制的内核。

  • 如何写一个内核配置文件,或修改已存在的配置文件。

  • 如何使用内核配置文件创建和建立一个新的内核。

  • 如何安装一个新内核。

  • 如何在/dev中创建设备节点。

  • 如何出现问题怎么办。


8.2. 为什么需要建立一个定制的内核?

通常,FreeBSD有一个叫做``巨大''的内核。 这意味着内核是一个巨大的程序,支持一系列的设备, 如果你想要修改内核的行为,就必须重新编译一个新的内核, 然后用新内核启动系统。

今天,FreeBSD 已经将内核的功能分成了很多的模块, 可以动态地加载和卸载内核模块。这样就可以快速地调整 内核以支持新加入的设备(如在手提计算机中的PCMCIA卡), 或加入最初内核编译时没有加入的功能。通俗地来讲, 这种功能叫做KLDs.

虽然这样,作一些静态内核的配置也是必需的。有时, 由于有些功能与内核的联系非常紧密,所以它不能被动态地加载。 另外,有些人不太愿意为实现某些功能而写一个动态加载的 内核模块,编译一个静态内核可能更简单。

定制内核基本上是每一个UNIX用户必须经历的一关。这样做 将会对你的FreeBSD系统带来很多好处。不像 GENERIC内核, 它需要支持很广泛的硬件设备,而定制的内核将只支持机器的硬件设备, 这样会带来很多好处:

  • 快速启动。既然系统内核只检测你机器上的硬件,那它所花费的 启动时间将大大减少。

  • 较少的内存使用。一个定制的内核会比GENERIC内核使用较少的内存。 这一点非常重要,因为内核在处理时必须经常使用内存。所以,一个定制的 内核对于内存较少的机器来说是非常有用的。

  • 额外的硬件支持。一个定制的内核允许你加入像声卡之类设备的支持, 而这恰恰是GENERIC内核所做不到的。


8.3. 建立并安装一个定制的内核

首先,让我们先来看一下建立内核的目录。所有提到的目录都在 /usr/src/sys中,也可以通过/sys访问。 有许多子目录充当了内核的不同部分,但最重要的是arch/conf, 你可以在这儿配置内核,然后进行编译。这里的arch 可能是i386alpha或者pc98 (PC硬件发展分支的一种选择, 在日本很流行). 在一个特殊的架构目录中,所有的东西都只为这个架构服务的,其他部分的代码 是与所有平台共享的;注意一下这个目录的逻辑结构,所有支持的硬件驱动程序、 文件系统、参数选项,都放在各自的目录下。FreeBSD5.X和以上版本已经支持 sparc64, 和一些其他的还在发展的架构。

注: 如果在你的系统上没有/usr/src/sys这个目录, 那么内核源代码就没有被安装。最简单的方法是以root身份执行/stand/sysinstall, 选择Configure, 接着是Distributions, 下来src, 最后sys。 如果你已经有一张``官方''FreeBSD系统安装盘;并且你有权限使用 光驱,那么你也可以通过下面命令行来安装源代码:

# mount /cdrom
# mkdir -p /usr/src/sys
# ln -s /usr/src/sys /sys
# cat /cdrom/src/ssys.[a-d]* | tar -xzvf -

接下来, 切换到arch/conf 目录下面, 拷贝GENERIC配置文件,并给这个文件起一个容易辨认的名称, 它就是你的内核名称。例如:

# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL

通常,这个名称是大写的,如果你正维护着多台不同硬件的FreeBSD机器, 以你机器的域名来命名是非常好的主意。我们把它命名为MYKERNEL就是这个原因。

提示: 保存你的内核配置文件到目录/usr/src是个坏注意. 如果你正在体验系统,有可能你打算仅仅删掉/usr/src然后从新开始. 你这样做完5秒种后你才意识到你已经删掉了你定制的内核配置文件。 不要直接编辑GENERIC,因为在你下次更新你的源码树, 你所做的内核修改会被覆盖掉。

你可以把你的内核配置文件到某个地方,然后建立符号链接到i386目录。

例如:

# cd /usr/src/sys/i386/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/MYKERNEL   
# ln -s /root/kernels/MYKERNEL

注: 你必须以root帐号执行这些和接下来命令,否则你会得到permission denied errors。

现在,用你喜欢的编辑器编辑MYKERNEL 。 如果你刚刚开始,那唯一能用的编辑器可能就是vi, 它由于太复杂而不在这儿介绍了,但在参考书目中有许多书会介绍到它。 然而,FreeBSD中最容易的编辑器是ee,如果你是一个初学者, 它是一个非常好的选择。你可以很自由地改变注释行来反映你的配置情况, 或和GENERIC相比所做的变化。

如果你在SunOS或者其他BSD系统下定制过内核,那这个文件中的绝大部分将对你非常熟悉。 如果你使用的是诸如DOS这样的系统,那GENERIC配置文件看起来就非常困难, 所以在下面的 配置文件章节将慢慢地、仔细地进行介绍。

注: 要经常检查/usr/src/UPDATING, 在你执行任何更新步骤之前, 记得用最新发布的源代码同步你的源码树 在这个文件所有重要的更新事件都会记下来;/usr/src/UPDATING总是 符合你的FreeBSD源代码版本,而且总是比手册所说的信息更加精确。

你现在必须编译内核的源代码。你可能需要执行两种方法, 这依赖于你如何重新编译内核,和你正使用的FreeBSD的版本。

  • 如果你安装内核源代码,使用方法1。

  • 如果你运行的是FreeBSD4.0以前的版本的话,而且你升级到 FreeBSD 4.0或更高版本,只要使用方法1。

  • 如果你在没有升级源代码的情况下编译一个新内核(也许你只想为内核添加一个新的选项, 如IPFIREWALL),可以使用任何一种方法。

  • 如果你正在重建的内核是作为make world进程的一部分,需要使用方法2。

方法1. 用``传统''方法建立一个内核

  1. 运行config(8)来产生内核源代码。

    # /usr/sbin/config MYKERNEL
    
  2. 切换到建立内核的目录。

    # cd ../compile/MYKERNEL
    

    对于FreeBSD 版本低于5.0,用下面的代替:

    # cd ../../compile/MYKERNEL
    
  3. 编译内核。

    # make depend
    # make
    
  4. 安装新内核。

    # make install
    

方法2. 用``新的''方法建立一个内核

  1. 切换到/usr/src 目录。

    # cd /usr/src
    
  2. 编译内核。

    # make buildkernel KERNCONF=MYKERNEL
    
  3. 安装新内核。

    # make installkernel KERNCONF=MYKERNEL
    

注: 在FreeBSD 4.2老版本里面你必须用KERNEL= 来替换KERNCONF=。2001年2月2日以后生成的4.2-STABLE 就可以认出KERNCONF=

如果在上次成功的 buildworld-installworld 之后还没有通过任何方法升级过源码树 (也就是说没有运行 CVSupCTM,或用过 anoncvs),那么可以 config, make depend, make, make install

新内核将会被拷贝到 /kernel 而旧的内核被移到/kernel.old。 现在,关闭系统,然后重新用你的新内核启动系统,如果出现错误,这章后面有一些 故障的解决方法。 如果新内核不能引导,请务必读一下有关如何恢复的章节.

注: 对于FreeBSD5.0, 内核将连同他的模块安装在/boot/kernel,并且老 内核会被备份到/boot/kernel.old.和引导进程相关的其他文件比如 loader(8)以及配置文件也都安装到了/boot。 第3方的或者定制的内核模块被放在/boot/modules,用户应该意识到保持内核模块和 编译好的内核同步是非常重要的。内核模块和内核不同步将导致不稳定和错误。

注: 如果你已经添加了新的设备(比如声卡)并且你正在运行FreeBSD 4.X或者更老的版本 你将不得不在/dev添加这些设备节点。更多的信息, 请参考章节后面的 Making Device Nodes


8.4. 配置文件

内核配置文件的格式是很简单的,每一行包含了一个关键词与一个或多个参数, 而大多数的设置都只包含一个参数。#后面的文字是注释,会被忽略掉。 下面的每个小节,将依次介绍每个列在GENERIC中的参数, 虽然各相关主题(比如网络)的关键词会放在同一小节,但是这些关键词可能位于 GENERIC文件的很多地方。 透彻的选项列表和关于设备列表的更详细的解释出现在 LINT配置文件, 和GENERIC文件在同一个目录。 如果你不能确定某一行设定是否需要请先参考LINT文件。

注: 在FreeBSD5.X和更高的版本LINT将不存在。关于架构依赖的选项 请看NOTES。一些选项, 主要就是架构依赖的选项在/usr/src/sys/conf/NOTES 文件里面,当然了,在这里复习这些选项也是明智的。

下面是一个带有很多额外注释的GENERIC内核配置文件 的例子。这个例子与/usr/src/sys/i386/conf/GENERIC很相似。 有关内核配置的最详细的选项,请参看/usr/src/sys/i386/conf/LINT

#
# GENERIC -- Generic kernel configuration file for FreeBSD/i386
#
# For more information on this file, please read the handbook section on
# Kernel Configuration Files:
#
#    http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files. 
# If you are in doubt as to the purpose or necessity of a line, check first 
# in NOTES.
#
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.380 2003/03/29 13:36:41 mdodd Exp $

下面这个选项在每个中都要有:

machine        i386

这是机器的架构。它可能是i386, pc98, sparc64, alpha, ia64, amd64, 或者 powerpc

cpu          I486_CPU
cpu          I586_CPU
cpu          I686_CPU

面的选项指出了在你的系统中所用的CPU类型。你可以使用多个CPU类型(例如: 你不能确定使用的是I586_CPU还是I686_CPU), 然而,对于一个定制的内核,最好是只指定你所拥有的CPU类型。如果你不能确定CPU类型, 可以通过文件/var/run/dmesg.boot来看你的启动信息。

在FreeBSD的内核里面仍然支持I386_CPU,但是在-STABLE和 -CURRENT里面缺省已经被禁用了。这就意味着安装FreeBSD在386-class的cpu, 一般有下面几种情况:

  • 安装一个老的FreeBSD release并且按照第 8.3 节从源码重建系统.

  • 在一个新的机器上构建用户和内核程序,然后用已经编译好的/usr/obj下的文件 安装到386的机器上(详细情况看第 19.5 节)。

  • 用支持I386_CPU内核的FreeBSD的release光盘安装

这几种情况里面的第一种是最容易的,当是你需要很大的磁盘空间,而这在386-class机器上是很难找到的。

ident          GENERIC

这是一个内核的标识符。 你应该自己命名一个容易辨认的名称,比如MYKERNEL。 放在ident后的参数,将在你用这个内核启动时显示在屏幕上。 如果你同时设置了几个内核,采用不同的名称是个不错的主意。(例如,你想定制一个实验性质的内核)。

maxusers          n

这个 maxusers 选项设置了重要系统表的大小。 这个数值粗略地假设你的机器同时会有多少用户。

从FreeBSD 4.5开始,如果手动设置这个值为0系统将会自动赋值。[7]. 在FreeBSD 5.X里面,maxusers 如果没有定义,将缺省为 0。如果你使用的FreeBSD早于4.5, 或者你想自己设置这个值, 那么你至少要设置maxusers为4, 特别是你要执行X Window或是编译程序。 原因是maxusers值决定了系统同时可有多少个进程(process), 其算法是20 + 16 * maxusers,所以如果你设置maxusers为1, 则你的系统只能同时存在36个进程,包括18个(或更多)系统启动要占去的进程。 如果你执行了X Window,则又要用掉15个以上。甚至阅读一个man page也会使用九个进程来过滤、解压缩、然后显示文件。 设置maxusers到64将允许你有1044个进程,对任何人应该都是足够的。 当你执行程序时, 得到像是proc table full这样的错误信息, 或者你要建一个同时会有很多人来访问的网站(比如ftp.FreeBSD.org)时, 你就要增加这个设置的值,然后重新编译内核。

注: maxusers这个选项并限制可以登陆你系统的用户数目。 它只是系统中用户可以最多执行的程序个数。 有一个关键词的值则真的限制了可以同时 远程登入和X terminal windows的人数:pseudo-device pty 16。 在 FreeBSD 5.X 中,并不需要担心这个数目, 因为 pty(4) 驱动会 ``自动复制(auto-cloning)'', 此时需要在配置文件中使用 device pty

# Floating point support - do not disable.
device          npx0     at nexus? port IO_NPX irq 13

npx0是FreeBSD中浮点运算处理器的一个接口, 不论你用硬件的浮点运算处理器还是使用软件仿真,都需要这个设置。 这个设置不是可有可无的。

# Pseudo devices - the number indicates how many units to allocate.
device   loop          # Network loopback

这是TCP/IP的通用环回设备。 如果你 telnet 或 FTP 到 localhost (换言之,127.0.0.1) 则将通过这个设备回到本机。 这是 必需的。在 FreeBSD 4.X 中,必须使用 pseudo-device loop

接下来的那些项有一个或多个选项,关于每个选项的更多的信息参考下面注释。

#To statically compile in device wiring instead of /boot/device.hints
#hints          "GENERIC.hints"         #Default places to look for devices.

在FreeBSD 5.X和更新的版本里面,device.hints(5)被用来配置设备驱动选项。 在启动的时候loader(8)将会检查缺省位置/boot/devicehints。 使用hints选项你就可以把这些hints静态编译进内核。 这样就没有必要在/boot下创建devicehints

#makeoptions     DEBUG=-g          #Build kernel with gdb(1) debug symbols

FreeBSD的普通建立过程是不包含调试信息的,建立内核的时候,在连接内核之前大部分的调试符号都被去掉了, 这样能节省安装位置的磁盘空间。如果你打算建立-CURRENT分支的测试内核,或者在FreeBSD上开发自己的内核, 你应该去掉这一行的注释,这样就打开了-g选项,传给gcc(1)后,就可以保留内核的调试信息。 如果你正在使用``传统''方法建立自己的内核(更多的信息参考第 8.3 节), 也能通过给config(8)传递-g选项达到同样的效果。

options          MATH_EMULATE      #Support for x87 emulation

如果你的计算机上没有数学协处理器(386或者486SX),这一行允许内核模拟数学协处理器。 如果你有一个486DX,或者386或者486SX(使用387或487的芯片)或者更高的cpu(PentiumPentium II等), 你可以注释掉这一行。

注: 随FreeBSD带的普通数学协处理器模拟函数不是非常精确。 如果你没有数学协处理器,而又需要更精确的模拟,最好把这个选项改成使用GNU数学支持的GPL_MATH_EMULATE, 因为版权原因它没有被缺省的包含进来。

在FreeBSD 5.X里面, 数学模拟缺省是禁用的,因为使用不支持数学浮点的CPUs已经很少了。

options          INET          #InterNETworking

网络支持,即使你不打算连网,也请保留它,大部分的程序至少需要回环网络(就是和本机进行网络连接),所以强烈要求保留它。

options          INET6          #IPv6 communications protocols

这将打开IPv6连接协议。

options          FFS          #Berkeley Fast Filesystem
options          FFS_ROOT     #FFS usable as root device [keep this!]

这是最基本的硬盘文件系统,如果你打算从本地硬盘启动,请保留它。

注: 在FreeBSD 5.X里面,FFS_ROOT选项不再需要了。

options          UFS_ACL      #Support for access control lists

这个选项只出现在FreeBSD 5.X,使得内核支持权限控制列表。 这要依赖于扩展属性和UFS2选项, 这些特性在第 14.12 节有详细的描述。 ACLs缺省是打开的,并且如果已经使用在系统文件上, 就不应该关闭它。

options          UFS_DIRHASH  #Improve performance on big directories

通过使用额外的内存,这个选项可以加速在大目录上的磁盘操作。 你应该在大型服务器和频繁使用的工作站上打开这个选项,而在磁盘操作不是很重要的 小型系统上关闭它,比如防火墙。

options          SOFTUPDATES  #Enable FFS Soft Updates support

这个选项打开内核的Soft Updates,这将有助于加速写磁盘操作。 即使内核已经提供了这项功能,也必须给具体的磁盘打开此功能。 查看mount(8)输出,看是为给你的系统盘启用了Soft Updates。 如果你没有看到soft-updates 选项,那么你需要 通过使用tunefs(8)(对存在的文件系统)或者newfs(8)(对新文件系统)来激活它。

options          MFS          #Memory Filesystem
options          MD_ROOT      #MD is a potential root device

这是内存映射的文件系统, 提供RAM disk,以供需要快速访问的资料或是暂存资料用。 如果你分了很大的swap空间,使用这个选项可以给你不少好处。 把MFS分区挂到/tmp是一个相当好的想法,因为不少程序都会在此暂存资料。要把MFS RAM disk挂到/tmp, 可以把下面这一行加到/etc/fstab里面:

/dev/ad1s2b    /tmp mfs rw 0 0

现在你只需要启动系统,或者执行命令mount /tmp

注: 在FreeBSD 5.X里面,md(4)-backed UFS文件系统比MFS文件系统更有利于内存文件操作。 关于配置memory-backed文件系统的更多信息可以在手册页里面使用mdconfig(8)mdmfs(8)以及第 16.12 节。 总之,MFS选项已经不再支持了。

options          NFS          #Network Filesystem
options          NFS_ROOT     #NFS usable as root device, NFS required

网络文件系统。除非你打算通过TCP/IP挂上UNIX文件服务器的分区, 不然可以注释掉这个选项。

options          MSDOSFS      #MSDOS Filesystem

MS-DOS文件系统。除非你打算在启动的时候挂上DOS格式的硬盘分区,不然你可以安全的注释掉它。 如前所述,在你第一次挂上一个DOS分区时,内核将会自动加载模块来支持它。 此外,mtools是个相当不错的软件(可在ports里面找到),可以让你在访问DOS磁盘时, 不需要挂上或卸载软盘(而且也不需要MSDOSFS的支持)。

options          CD9660       #ISO 9660 Filesystem
options          CD9660_ROOT  #CD-ROM usable as root, CD9660 required

CD-ROM使用的ISO 9660文件系统。如果你没有光驱,或是很少用光驱, 可以注释掉这一行(内核会在第一次加载时动态的加载模块以支持它)。音乐CD则不会用到这个文件系统。

options          PROCFS       #Process filesystem

进程文件系统。这是一个``虚拟的''文件系统,挂在/proc下, 允许一些程序,像ps(1)来提供一些正在执行进程的信息。 在FreeBSD 5.X,大部分环境下是不需要PROCFS的,因为大部分调试和监视工具的运行已经不需要 PROCFS。此外,5.X-CURRENT的内核要使用PROCFS还必须启用PSEUDOFS 选项:

options          PSEUDOFS     #Pseudo-filesystem framework

PSEUDOFS在FreeBSD 4.X下没有。 不像FreeBSD 4.X,缺省时FreeBSD 5.X将不会挂上进程文件系统

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          SCSI_DELAY=15000    #Delay (in ms) before probing SCSI

这行设置告诉内核等待15秒钟,以供SCSI控制器扫描你计算机上的SCSI设备。如果你只有IDE硬盘,你 可以不理会这个设置,不然你可能会想要降低这个值,也许会降到五秒,以增加启动的速度。如果你发现降低后, FreeBSD无法正确辨认你的SCSI设备,那么你应该提高这个值,延长等待时间。

options          UCONSOLE            #Allow users to grab the console

允许用户找到控制台(console)信息,对X用户很有用。举例来说, 你可以输入xterm -C来打开一个控制台xterm, 这个窗口将显示任何write、talk等命令的信息, 以及你发出去的信息。当然,kernel产生的信息也会在这里出现。

注: 在FreeBSD 5.X里面,UCONSOLE不再需要。

options          USERCONFIG          #boot -c editor

这个选项允许你从启动菜单启动配置编辑器。

options          VISUAL_USERCONFIG   #visual boot -c editor

这个选项允许你从启动菜单启动可视配置编辑器。

注: 从FreeBSD5.0版本以后,USERCONFIG这个选项被推荐在新方法device.hints(5)里面使用。 更多的关于device.hints(5)的信息请查看第 12.5 节

options          KTRACE              #ktrace(1) support

这个选项打开内核进程跟踪,在调试时很有用。

options          SYSVSHM             #SYSV-style shared memory

提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸, 不少绘图相关程序会自动使用SHM来提供额外的速度。如果你要使用X Window,你最好加入这个选项。

options          SYSVSEM             #SYSV-style semaphores

支持System V semaphores,不常用到,只在kernel中占用几百个字节的空间。

options          SYSVMSG             #SYSV-style message queues

支持System V messages,一样的,只占用kernel几百字节的空间。

注: ipcs(1)命令可以显示出任何使用到上述三个System V功能的进程。

options    P1003_1B        #Posix P1003_1B real-time extensions
options     _KPOSIX_PRIORITY_SCHEDULING

在1993年POSIX®添加的实时扩展. 在ports collection中某些应用程序会用到这些 (比如StarOffice)。

注: 在FreeBSD 5.X,所有的这些功能都使用_KPOSIX_PRIORITY_SCHEDULING选项, P1003_1B选项将不再需要。

options        ICMP_BANDLIM        #Rate limit bad replies

这个选项启用ICMP的带宽限制的错误响应。使用这个选项可以帮助你保护你的机器免受拒绝式服务攻击。

注: 在FreeBSD 5.X,这个特性是缺省的,ICMP_BANDLIM选项不再需要了。

# To make an SMP kernel, the next two are needed
#options        SMP                     # Symmetric MultiProcessor Kernel
#options        APIC_IO                 # Symmetric (APIC) I/O

上面的两个选项是支持SMP的。

device          isa

所有FreeBSD 支持的PC都需要这行设置。 即使您的计算机中没有 ISA 槽,也不要删除这一行。 如果你使用IBM PS/2 (微信道架构)计算机,则FreeBSD只能提供有限的支持。 更多的信息请参考/usr/src/sys/i386/conf/LINT文件。

device          eisa

如果你的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。

device          pci

如果你的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。

device          agp

如果你有图形加速卡(AGP card),这个选项将打开图形加速支持。

# Floppy drives
device          fdc0        at isa? port IO_FD1 irq 6 drq 2
device          fd0         at fdc0 drive 0
device          fd1         at fdc0 drive 1

软盘控制器,fd0A:盘,fd1B:盘。

device          ata

这个驱动器支持所有ATA和ATAPI设备。你只要在内核中加入device ata选项, 就可以让内核支持现代计算机上的所有PCI ATA/ATAPI设备。

device          atadisk                 # ATA disk drives

这个是ATAPI 磁盘驱动器所必须的。


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

T这个可以静态分配控制器的编号(比如老的驱动器),也可以动态分配设备的编号。

# ATA and ATAPI devices
device          ata0        at isa? port IO_WD1 irq 14
device          ata1        at isa? port IO_WD2 irq 15

上面的选项用在比较老的,非PCI的系统中。

# SCSI Controllers
device          ahb        # EISA AHA1742 family
device          ahc        # AHA2940 and onboard AIC7xxx devices
device          amd        # AMD 53C974 (Teckram DC-390(T))
device          dpt        # DPT Smartcache - See LINT for options!
device          isp        # Qlogic family
device          ncr        # NCR/Symbios Logic
device          sym        # NCR/Symbios Logic (newer chipsets)

device          adv0       at isa?
device          adw
device          bt0        at isa?
device          aha0       at isa?
device          aic0       at isa?

SCSI控制器。可以注释掉你系统中没有的设备。如果你只有IDE设备,你可以把这些一起删掉。

# SCSI peripherals
device          scbus      # SCSI bus (required)
device          da         # Direct Access (disks)
device          sa         # Sequential Access (tape etc)
device          cd         # CD
device          pass       # Passthrough device (direct SCSI
access)

SSCSI外围设备。也可以像上面一样操作。

注: 目前系统提供的 USB umass(4) 驱动 (以及少量其它驱动) 使用了 SCSI 子系统, 尽管它们并不是真的 SCSI 设备。 因此, 如果在内核配置使用了这类驱动程序, 请务必不要删除 SCSI 支持。

# RAID controllers
device          ida        # Compaq Smart RAID
device          amr        # AMI MegaRAID
device          mlx        # Mylex DAC960 family

支持RAID控制器。如果你没有这些,可以把它们注释掉或是删掉。

# atkbdc0 controls both the keyboard and the PS/2 mouse
device          atkbdc0    at isa? port IO_KBD

键盘控制器(atkbdc)提供AT键盘输入以及PS/2指针设备的I/O服务。 键盘驱动程序(atkbd)与PS/2鼠标驱动程序(psm)需要这个控制器,所以不要删除它。

device          atkbd0     at atkbdc? irq 1

atkbd驱动程序,与atkbdc控制器一起使用, 提供连接到AT键盘控制器的AT 84键盘与AT加强型键盘的访问服务。

device          psm0       at atkbdc? irq 12

如果你的鼠标连接到PS/2鼠标端口,就使用这个设备驱动程序。

device          vga0        at isa?

显卡驱动。

# splash screen/screen saver
device          splash

启动时出现了 splash 画面!屏幕保护程序也需要它。 在 FreeBSD 4.X 中,应写作 pseudo-device splash

# syscons is the default console driver, resembling an SCO console
device          sc0          at isa?

sc0是默认的控制台驱动程序,绝大部分全屏幕程序都通过termcap 这类terminal database library来访问控制台,因此不论你用这个驱动程序 或是VT220兼容控制台驱动程序vt0,这中间并没有太大差别。 如果你登陆系统后,执行全屏幕程序时遇到问题,请将你的TERM设置成scoansi

# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
#device          vt0     at isa?
#options         XSERVER          # support for X server on a vt console
#options         FAT_CURSOR       # start with block cursor
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
#options         PCVT_SCANSET=2   # IBM keyboards are non-std

这是一个兼容VT220的控制台驱动程序,并向下兼容VT100/102。在部分与sc0相冲突的笔记本计算机上, 这个驱动程序运作良好。当然,当你登陆系统时,记得设置TERM参数为vt100或是vt220。 当连接到网络上许多计算机时,这个驱动程序也常是很有用的,这是因为许多的计算机上 的termcap或是terminfo并没有sc0 的资料��而vt100的资料几乎所有的平台上都支持。

# Power management support (see LINT for more options)
device          apm0     at nexus? disable flags 0x20  # Advanced Power Management

高级电源管理支持。使用在膝上型计算机上。

# PCCARD (PCMCIA) support
device          card
device          pcic0    at isa? irq 10 port 0x3e0 iomem 0xd0000
device          pcic1    at isa? irq 11 port 0x3e2 iomem 0xd4000 disable

PCMCIA支持。如果你使用膝上型计算机,你需要这个。

# Serial (COM) ports
device          sio0     at isa? port IO_COM1 flags 0x10 irq 4
device          sio1     at isa? port IO_COM2 irq 3
device          sio2     at isa? disable port IO_COM3 irq 5
device          sio3     at isa? disable port IO_COM4 irq 9

sio0到sio3可看作是MS-DOS/Windows系统中的COM1COM4

注: 如果你使用内置式的调制解调器,且占用COM4,而你的系统又有COM2, 则你必须修改调制解调器的IRQ为2(IRQ 2跟IRQ 9是一样的),这样FreeBSD才能正常使用调制解调器。 如果你有一个多口的串行卡,请看sio(4)的手册页。 部分显示卡(特别是使用S3芯片的卡),用到0x*2e8这个I/O地址,而一些便宜的串行卡, 没办法正确译码16位的I/O寻址空间,因此两张卡会冲突,导致COM4无法正常使用。

每个串行口都要有一个唯一的IRQ(除非你使用支持共享中断的多口卡),所以COM3COM4默认的IRQ将无法使用。

# Parallel port
device          ppc0    at isa? irq 7

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模式。

# PCI Ethernet NICs.
device          de         # DEC/Intel DC21x4x (``Tulip'')
device          fxp        # Intel EtherExpress PRO/100B (82557, 82558)
device          tx         # SMC 9432TX (83c170 ``EPIC'')
device          vx         # 3Com 3c590, 3c595 (``Vortex'')
device          wx         # Intel Gigabit Ethernet Card (``Wiseman'')

多种PCI网卡驱动器。注释或删除你系统中没有的设备.

# PCI Ethernet NICs that use the common MII bus controller code.
device          miibus     # MII bus support

MII总线支持对于一些PCI 10/100 Ethernet NIC来说是必需的。

device          dc         # DEC/Intel 21143 and various workalikes
device          rl         # RealTek 8129/8139
device          sf         # Adaptec AIC-6915 (``Starfire'')
device          sis        # Silicon Integrated Systems SiS 900/SiS 7016
device          ste        # Sundance ST201 (D-Link DFE-550TX)
device          tl         # Texas Instruments ThunderLAN
device          vr         # VIA Rhine, Rhine II
device          wb         # Winbond W89C840F
device          xl         # 3Com 3c90x (``Boomerang'', ``Cyclone'')

使用MII总线控制器代码的驱动器。

# ISA Ethernet NICs.
device          ed0    at isa? port 0x280 irq 10 iomem 0xd8000
device          ex
device          ep
# WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
# exists only as a PCMCIA device, so there is no ISA attachment needed
# and resources will always be dynamically assigned by the pccard code.
device          wi
# Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
# work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
# mode (the factory default). If you set the switches on your ISA
# card for a manually chosen I/O address and IRQ, you must specify
# those parameters here.
device          an
# The probe order of these is presently determined by i386/isa/isa_compat.c.
device          ie0    at isa? port 0x300 irq 10 iomem 0xd0000
device          fe0    at isa? port 0x300
device          le0    at isa? port 0x300 irq 5 iomem 0xd0000
device          lnc0   at isa? port 0x280 irq 10 drq 0
device          cs0    at isa? port 0x300
device          sn0    at isa? port 0x300 irq 10
# requires PCCARD (PCMCIA) support to be activated
#device         xe0    at isa?

ISA以太网驱动器。看看/usr/src/sys/i386/conf/LINT了解一下哪个卡被哪个驱动器支持。

device   ether         # Ethernet support

ether 只有在使用以太网卡时才需要。 它包含了通用的以太网协议代码。在 FreeBSD 4.X 中应写作 pseudo-device ether.

device   sl      1     # Kernel SLIP

sl 用于提供 SLIP 支持。 它已经几乎完全被 PPP 取代,因为后者更容易配置,更适合调制解调器之间的连接,而且功能更加强大。 sl 后面的 数字 用于指定支持同时开启多少个 SLIP 会话。 在 FreeBSD 4.X 中,应写作 pseudo-device sl.

device   ppp     1     # Kernel PPP

这一选项提供用于拨号的内核模式 PPP 支持。 另外,也有以用户模式运行的 PPP 实现,使用 tun, 它更加灵活,而且提供了更多的功能,如按需拨号等等。 ppp 后面的 数字 用于指定支持同时开启多少个 PPP 会话。 在 FreeBSD 4.X 中,应写作 pseudo-device ppp.

device   tun           # Packet tunnel.

这一选项会被用户模式的 PPP 软件用到。 tun 后面的 数目 用于指定允许的最大 PPP 连接数目。 具体细节, 请参考本书的 PPP 一节。 在 FreeBSD 4.X 上,请使用 pseudo-device tun


device   pty           # Pseudo-ttys (telnet etc)

这是 ``伪终端'' 或仿真的登入端口。 它会被进入的 telnet 以及 rlogin 会话, xterm,还有某些其它应用程序, 如 Emacs 用刀。在 FreeBSD 4.X 中, 则应使用 pseudo-device pty 数字pty 后面的 数字 用于指定要创建的 pty 数量。 如果需要比默认值16更多的 xterm 窗口会话, 以及远程登录, 请务必相应提高这个值, 其上限是 256。

device   md            # Memory ``disks''

Memory disk pseudo-devices. With FreeBSD 4.X use the line pseudo-device md.

device   gif     # IPv6 and IPv4 tunneling

这个设备实现了 IPv4 上的 IPv6 隧道、 IPv6 上的 IPv4 隧道、 IPv4 上的 IPv4 隧道, 以及IPv6 上的 IPv6隧道。 从 FreeBSD 4.4 开始, gif 设备拥有了 ``自动克隆'' 的功能, 因此只需使用 pseudo-device gif。 而更早的 FreeBSD 4.X 版本则需要手工指定一个数字,例如 pseudo-device gif 4

device   faith   # IPv6-to-IPv4 relaying (translation)

这个伪设备能捕捉发给它的数据包,并把它们转发给 IPv4/IPv6 翻译服务程序。在 FreeBSD 4.X 中,应写作 pseudo-device faith 1

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
device   bpf           # Berkeley packet filter

这是 Berkeley 包过滤器。这个伪设备允许网络接口被置于混杂模式, 从而,截获广播网 (例如,以太网) 上的每一个数据包。 截获的数据报可以保存到磁盘上,也可以使用 tcpdump(1) 程序来分析。 在 FreeBSD 4.X 中,应写作 pseudo-device bpf

注: bpf(4) 设备也被用于 dhclient(8) 来获取默认路由器(网关)的 IP 地址。如果使用DHCP,就不要注释掉这行。

# USB support
#device         uhci          # UHCI PCI->USB interface
#device         ohci          # OHCI PCI->USB interface
#device         usb           # USB Bus (required)
#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
# USB Ethernet, requires mii
#device         aue           # ADMtek USB ethernet
#device         cue           # CATC USB ethernet
#device         kue           # Kawasaki LSI USB ethernet

支持多种USB设备.

更多有关FreeBSD支持的设备请参考/usr/src/sys/i386/conf/LINT.


8.4.1. 大内存支持(PAE)

大内存配置的机器需要超过4GB的虚拟地址。 因为4GB的限制,Intel在Pentium及后续的CPUs上增加了36位物理地址的支持。

Intel Pentium Pro和后续的CPUs允许内存地址扩展到64GB.(PAE) FreeBSD通过PAE选项来支持这个能力。 在FreeBSD 4.X系列里面,4.9-RELEASE开始支持,FreeBSD 5.X系列里面,从5.1-RELEASE开始支持。 in the 4.X series of FreeBSD beginning with 4.9-RELEASE and in the 5.X series of FreeBSD beginning with 5.1-RELEASE。因为Intel架构的限制, 高于或低于4GB都没有什么区别,内存分配到大于4GB仅仅是增加了可利用的内存池。

为了让内核支持PAE,只要增加下面这一行到配置文件:

options            PAE

注: PAE在FreeBSD里面现在只能支持 Intel IA-32处理器。 同时,还应该注意,FreeBSD的PAE支持没有经过广泛的测试, 和其他稳定的特性相比只能当作是beta版。

PAE在FreeBSD下有如下的一些限制:

  • 进程不能接触大于4GB的VM空间。

  • KLD 模块不能加载到一个打开了PAE支持的内核里面, 这是因为内核模块和内核的建立框架不一样。

  • 没有使用bus_dma(9)界面的设备驱动程序在打开了PAE支持的内核里面 会导致数据腐化(corruption)。因为这个原因,FreeBSD 5.X的PAE内核配置文件 把所有在打开了PAE的内核上不能工作的驱动程序排除在外。

  • 一些系统打开了探测系统内存资源使用能力的功能,因为打开了 PAE支持,这些功能可能会被覆盖掉。 其中一个例子就是内核参数kern.maxvnodes,它是控制 内核能使用的最大vnodes数目的,建议重新调整它及其他类似参数到合适的值。

  • 为了避免KVA的消耗,很有必要增加系统的内核虚拟地址, 或者减少很耗系统资源的内核选项的总量(看上面)。KVA_PAGES选项 可以用来增加KVA空间。

为了稳定和高性能,建议查看tuning(7)手册页。pae(4)手册页包含 FreeBSD'sPAE支持的最新信息。


8.5. 创建设备节点

注: 如果你正在使用FreeBSD 5.0或者更新的版本,你可以略过这节。因为这些版本的系统使用devfs(5) 透明的为用户分配设备节点。

几乎内核中的每个设备在/dev目录都有对应的``节点''。 些节点看上去是些规则文件,但事实上是程序在使用对应的设备时,与内核联系的进入点。 当你一开始安装操作系统时,可执行的外壳脚本/dev/MAKEDEV就创建了几乎所有支持的设备。 然而,它并不是建立所有设备,所以当你加入对新设备的支持时,注意确信对应的节点在这个目录下。 如果不是,就加入它们。这儿是一个简单的例子:

假定在内核中加入了IDE CD-ROM的支持。可以这样加入:

device acd0

这意味着你应当在/dev目录下找一些以acd0为起点的入口, 通常后面有一个字母,像是以c,或者r开头,表示这是一个``raw''设备。 如果那些文件不在那儿,就必须改变到/dev目录然后键入:

# sh MAKEDEV acd0

这些脚本完成后,你要在/dev目录下确认有acd0cracd0c等几个入口,这表示程序已经正确执行。

以下是加入声卡节点的例子:

# sh MAKEDEV snd0

注: 当创建完诸如声卡这样的设备节点时,如果其他人有权访问你的机器, 可能有必要在/etc/fbtab文件中添加这些节点来保护系统安全。 更多的信息参考fbtab(5)

依上述的简单程序,建立任何不在GENERIC里的硬件设备节点

注: 所有的SCSI控制器都使用一样的设备节点,所以你无须重新建立节点。 另外,网卡与SLIP/PPP虚拟设备并没有任何设备节点,所以你不必担心怎么建立节点。


8.6. 如果出现问题怎么办

在定制一个内核时,可能会出现五种问题。它们是:

config失败:

当你在内核描述中看到config(8)命令失败, 可能在某个地方发生了一个小错误。幸运的是, config(8)会显示出错的那一行的行号,你可以用vi编辑器做修改。 例如,如果你看到:

config: line 17: syntax error

可以在vi中用命令模式输入17G来跳到17行。 比较GENERIC内核或其他参考资料,以确定你打对了关键字。

make失败:

如果make失败,通常会在你的内核描述中提示一个错误, 但config(8)并没有找出错误。 另外,查看一下你的配置信息,如果你仍然无法解决这个问题, 可以把你的内核配置信息发邮件到FreeBSD general questions 邮件列表,它将很快地被解决。

安装新内核失败:

如果内核编译没问题,但是安装失败(make install或者 make installkernel命令失败), 第一件是检查你的系统是否运行在安全级别1或者更高(参看init(8))。 内核安装试图从你的内核移除不可改变标志,并设置新的不可改变标志,如果安全级别是1 或者更高,这会阻止设置系统文件的不可改变标志。因此内核安装需要安全级别为0或者更低。

内核无法启动:

如果你的新内核无法启动,或无法识别你的硬件,不要担心, 幸运的是,BSD有一个解决复杂内核错误的很好机制。 你可以在系统启动进行10计数的时候按Enter以外的任何键, 接着键入unload命令,再键入boot kernel.old, 或者任何能正常启动的内核名字。当配置一个内核时,在手头保留一个能正常启动的内核是个好主意。

在用一个好的内核启动后,你可以检查一下配置文件,再设法重新建立一个内核。 一个有帮助的文件是/var/log/messages文件, 它记载了每个成功启动的所有内核信息。当然,dmesg(8)也会列出当前启动中的内核信息。

注: 你在编译内核时,确信保留着一个GENERIC或以其他名字命名的内核。 你不能仅依靠kernel.old,因为当你安装一个新内核时, kernel.old会被上一次安装的内核所覆盖。 所以,尽快将当前正常工作的kernel移到不能正常工作的内核, 可以用ps(1)命令查一下。``解开''编译安装内核文件的正确命令是:

# chflags noschg /kernel

如果你发现你不能这样做,你的系统的安全级别可能大于0了。在/etc/rc.conf里面编辑 kern_securelevel并把它设置为-1然后重启。 当你很满意这个内核的时候,你可以再把设置改回去。

另外,如果你要``锁住''内核或其他文件,以至它不能被移动或修改 ,可以用下面的命令:

# chflags schg /kernel

在FreeBSD 5.X里面, 内核安装后不再有不可改变标志,所以上面这些问题你将不会遇到。

内核工作,但是ps(1)根本不工作:

如果你在系统中安装了一个不同版本的内核,例如,在3.x系统中安装了4.x内核, 许多系统内建的命令像ps(1)vmstat(8)根本不工作。你必须重新编译libkvm库以及这些程序。 千万不要随意从其他系统拷贝不同版本的内核来使用。


章 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 上使用的打印机通常至少有 以下三种接口中的一个:

  • 串行接口, 也叫 RS232C, RS232D 或者 COM 口, 使用你计算机上的 串口来发送数据到打印机。 串行 接口在计算机上已经非常普遍, 而且电缆 也非常容易买到且容易制作。 串行 接口有时需要特殊的电缆, 而且可能需要 你去配置稍微有点儿复杂的通讯 选项。 大多数 PC 的串口的最高 传输速度只有 115200 bps, 这使得打印 很大的图像需要的时间很长。

  • 并行界面使用 计算机上的并口来发送数据到 打印机。 并行接口在计算机上也已经非常普遍 而且速度高于 RS232 串行界面。 电缆非常容易买到, 但很难手工 制作。 并行接口通常没有 通讯选项, 这使得 配置它相当简单。

    并口按打印机上的接头来命名也叫做 ``Centronics''接口 。

  • USB 接口, 即通用串行 总线, 可以达到比并口和串口 高很多的速度。 而电缆简单又便宜。 USB 用来打印比串口和并口 更有优势, 但是 UNIX 系统不能很好的支持它。 避免这个问题的方法就是购买一台 像大多数打印机一样的即有 USB 接口又有并口的 打印机。

一般来说并口只提供 单向通讯( 计算机到打印机), 而串口 和 USB 则可以提供双向通讯。 新的并口( EPP and ECP) 和打印机 在使用了 IEEE1284 标准的电缆之后, 可以在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. 在 /dev 中为端口添加 设备节点

注: FreeBSD 5.0 支持 devfs 这种在需要的时候自动添加设备节点 的文件系统。 如果你正在使用的 FreeBSD 开启了 devfs 文件系统, 那么你可以安全的跳过 这部分。

尽管内核可能已经支持通过串口或者并口 通讯, 但你还是需要一个软件接口 来使你系统上的程序通过它发送和接收 数据。 这也是 /dev 目录中那些设备节点的作用。

要在 /dev 中为端口添加 一个设备节点:

  1. 使用 su(1) 命令切换到 root 帐号。 在出现提示的时候输入 root 帐号的密码。

  2. 将当前目录改变到 /dev 目录:

    # cd /dev
    
  3. 输入:

    # ./MAKEDEV port
    

    其中 port 替换成 你需要添加端口的节点名。 当打印机连接在第一个并口上时, 替换成 lpt0 , 连接在第二个并口上时, 替换成 lpt1 , 依此类推; 当打印机连接在第一个串口上时, 替换成 ttyd0 , 连接在第二个串口上时, 替换成 ttyd1 , 依此类推。

  4. 输入:

    # ls -l port
    

    来检查设备节点是否正常建立。


9.3.1.3.1. 设置并口的通讯 模式

在使用并口时, 你可以选择 让 FreeBSD 用中断方式还是轮询方式来 与打印机通讯。 在 FreeBSD 4.X and 5.X 上, 通用的打印机驱动 (lpt(4)) 使用 ppbus(4) 系统, 它由 ppc(4) 驱动来控制端口芯片。

  • 中断 方式是 GENERIC 核心的默认方式。 在这种方式下, 操作系统占用一条中断请求线来检测什么时候 打印机做好接收数据的准备。

  • 轮询 方式是 操作系统反复不断的询问打印机是否做好 接收数据的准备。 当它返回准备好时, 核心开始发送 下面要发送的数据。

中断方式速度通常会快一些, 但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机 不能正常的工作在中断模式下, 是由于一些定时问题 (还没正确的理解) 造成的。 这些打印机需要使用轮询方式。 你应该使用 任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以 工作, 但在中断模式下会慢的要命。

你可以用以下两种方法设定通讯模式: 通过 配置内核或者使用 lptcontrol(8) 这个程序。

要通过配置内核的方法设置 通讯模式:

  1. 修改内核配置文件。 找到 一个叫 ppc0 的记录。 如果你想要设置的是 第二个并口, 那么用 ppc1 代替。 使用第三个并口的时候用 ppc2 代替, 依此类推。

    • 如果你想要使用中断方式, 在 FreeBSD 4.X 下的方法是指定一个 irq

      device ppc0 at isa? irq N
      

      其中 N 是计算机并口 的中断编号。

      在 FreeBSD 5.X 下, 修改下面这一行:

      hint.ppc.0.irq="N"
      

      它在 /boot/device.hints 这个文件中, 其中 N 用正确的中断 编号代替。 同时, 核心配置文件也必须 包括 ppc(4) 的驱动:

      device ppc
      
    • 如果你想要使用轮询方式, 则不用指定 irq

      在 FreeBSD 4.X 下, 在内核配置文件中使用下面 这行:

      device ppc0 at isa?
      

      在 FreeBSD 5.X 下, 只需要把 /boot/device.hints 这个文件中的下面这行 删除掉:

      hint.ppc.0.irq="N"
      

      在 FreeBSD 5.X 下, 有时上面的方法并不能使并口工作在轮询方式。 大多数 情况是由于 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.3.2. 检测打印机的通讯

在设置打印池系统之前, 你 应该确保你的计算机可以把数据 发送到打印机上。 分别独立调试打印机的通讯和打印池系统 会更简单。

我们为了测试打印机,将发送一些文本给它。 一个叫 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.3.2.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.3.2.2. 检测串行打印机

这部分将告诉你如何检测FreeBSD是否可以与 连接在串口上的打印机通讯。

要测试一个连接在串口上 的打印机:

  1. 通过 su(1) 命令转换成 root 用户。

  2. 修改 /etc/remote 这个文件。 增加 下面这些内容:

    printer:dv=/dev/port:br#bps-rate:pa=parity
    

    其中 port 是 串口的设备节点 (ttyd0, ttyd1, 等等。 ), bps-rate 是 与打印机通讯时使用的波特, parity 是通讯时打印机要求 的校验方法 (either even, odd, none, or 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.4. 开启打印池: 文件 /etc/printcap

目前, 你的打印机应该已经连好了线, 系统内核 也为与打印机联机而重新配置好 ( 如果需要的话 ), 而且你也 已经可以发送一些简单的数据到打印机。 现在, 我们要 配置 LPD 来使其控制你的 打印机。

配置 LPD 要修改 /etc/printcap 这个文件。 LPD 打印池系统 在每次打印池被使用的时候都会读取这个文件, 所以对这个文件 的修改会立即生效。

printcap(5) 这个文件的格式很简单。 你可以用你最喜欢的文本编辑器来修改 /etc/printcap 这个文件。 这种格式和其他的 像 /usr/share/misc/termcap/etc/remote 这类文件是一样的。 要得到完整的 关于这种格式的信息, 参见 cgetent(3)

简单的打印池配置包括下面的几 步:

  1. 为打印机起一个名字 ( 和一些方便的别名 ) , 然后把它们写进文件 /etc/printcap ; 参见 Naming the Printer 这章来得到更多的关于起名的帮助。

  2. 关掉报头页 ( 它默认是打开的 ), 通过 增加 sh 项目; 参见 Suppressing Header Pages 部分来得到更多信息。

  3. 建立一个打印池缓冲的目录, 并且通过 sd 项目指定它的位置; 参见 Making the Spooling Directory 部分来得到更多信息。

  4. /dev 下设置打印机设备 节点, 并且在写在 /etc/printcap 文件中 lp 项目里; 参见 识别打印机 设备 这部分得到更多信息。 还有, 如果打印机连接在 串口上, 设置通讯参数要写在 ms# 项目中。 这些参数在 配置打印池 通讯参数 这部分已经讨论过。

  5. 安装纯文本过滤器; 参见 安装文本 过滤器 这章来得到细节。

  6. lpr(1) 命令来测试设置。 想得到更多信息可以参见 测试 and 疑难问题解答 部分。

注: 基于打印机语言的打印机, 比如 PostScript 打印机, 不能直接打印纯文本。 简单的设置方法在上面 提到并且下面的部分也要讨论, 假如你正在 安装这样一台只能打印它明白的文件的 打印机。

用户总是希望他们能在任何一个安装在他们系统的打印机上打印 纯文本。 使用 LPD 接口的程序也通常这样 希望。 如果你正在安装这样一台打印机, 并且想要它能打印 基于它支持的打印机语言的任务 并且 还可以打印纯文本的任务, 那么强烈建议你在上面提到 的简单设置的步骤上增加一步: 安装一个 自动纯文本到 PostScript ( 或者其他打印机语言 ) 的 转化程序。 参见 PostScript 打印机上打印纯文本 将得到 更多有关信息。


9.3.1.4.1. Naming the Printer

The first (easy) step is to pick a name for your printer It really does not matter whether you choose functional or whimsical names since you can also provide a number of aliases for the printer.

At least one of the printers specified in the /etc/printcap should have the alias lp. This is the default printer's name. If users do not have the PRINTER environment variable nor specify a printer name on the command line of any of the LPD commands, then lp will be the default printer they get to use.

Also, it is common practice to make the last alias for a printer be a full description of the printer, including make and model.

Once you have picked a name and some common aliases, put them in the /etc/printcap file. The name of the printer should start in the leftmost column. Separate each alias with a vertical bar and put a colon after the last alias.

In the following example, we start with a skeletal /etc/printcap that defines two printers (a Diablo 630 line printer and a Panasonic KX-P4455 PostScript laser printer):

#
#  /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:

In this example, the first printer is named rattan and has as aliases line, diablo, lp, and Diablo 630 Line Printer. Since it has the alias lp, it is also the default printer. The second is named bamboo, and has as aliases ps, PS, S, panasonic, and Panasonic KX-P4455 PostScript v51.4.


9.3.1.4.2. Suppressing Header Pages

The LPD spooling system will by default print a header page for each job. The header page contains the user name who requested the job, the host from which the job came, and the name of the job, in nice large letters. Unfortunately, all this extra text gets in the way of debugging the simple printer setup, so we will suppress header pages.

To suppress header pages, add the sh capability to the entry for the printer in /etc/printcap. Here is an example /etc/printcap with sh added:

#
#  /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:

Note how we used the correct format: the first line starts in the leftmost column, and subsequent lines are indented with a single TAB. Every line in an entry except the last ends in a backslash character.


9.3.1.4.3. Making the Spooling Directory

The next step in the simple spooler setup is to make a spooling directory, a directory where print jobs reside until they are printed, and where a number of other spooler support files live.

Because of the variable nature of spooling directories, it is customary to put these directories under /var/spool. It is not necessary to backup the contents of spooling directories, either. Recreating them is as simple as running mkdir(1).

It is also customary to make the directory with a name that is identical to the name of the printer, as shown below:

# mkdir /var/spool/printer-name

However, if you have a lot of printers on your network, you might want to put the spooling directories under a single directory that you reserve just for printing with LPD. We will do this for our two example printers rattan and bamboo:

# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/rattan
# mkdir /var/spool/lpd/bamboo

注: If you are concerned about the privacy of jobs that users print, you might want to protect the spooling directory so it is not publicly accessible. Spooling directories should be owned and be readable, writable, and searchable by user daemon and group daemon, and no one else. We will do this for our example printers:

# 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

Finally, you need to tell LPD about these directories using the /etc/printcap file. You specify the pathname of the spooling directory with the sd capability:

#
#  /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:

Note that the name of the printer starts in the first column but all other entries describing the printer should be indented with a tab and each line escaped with a backslash.

If you do not specify a spooling directory with sd, the spooling system will use /var/spool/lpd as a default.


9.3.1.4.4. Identifying the Printer Device

In the Adding /dev Entries for the Ports section, we identified which entry in the /dev directory FreeBSD will use to communicate with the printer. Now, we tell LPD that information. When the spooling system has a job to print, it will open the specified device on behalf of the filter program (which is responsible for passing data to the printer).

List the /dev entry pathname in the /etc/printcap file using the lp capability.

In our running example, let us assume that rattan is on the first parallel port, and bamboo is on a sixth serial port; here are the additions to /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:

If you do not specify the lp capability for a printer in your /etc/printcap file, LPD uses /dev/lp as a default. /dev/lp currently does not exist in FreeBSD.

If the printer you are installing is connected to a parallel port, skip to the section entitled, Installing the Text Filter. Otherwise, be sure to follow the instructions in the next section.


9.3.1.4.5. Configuring Spooler Communication Parameters

For printers on serial ports, LPD can set up the bps rate, parity, and other serial communication parameters on behalf of the filter program that sends data to the printer. This is advantageous since:

  • It lets you try different communication parameters by simply editing the /etc/printcap file; you do not have to recompile the filter program.

  • It enables the spooling system to use the same filter program for multiple printers which may have different serial communication settings.

The following /etc/printcap capabilities control serial communication parameters of the device listed in the lp capability:

br#bps-rate

Sets the communications speed of the device to bps-rate, where bps-rate can be 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, or 115200 bits-per-second.

ms#stty-mode

Sets the options for the terminal device after opening the device. stty(1) explains the available options.

When LPD opens the device specified by the lp capability, it sets the characteristics of the device to those specified with the ms# capability. Of particular interest will be the parenb, parodd, cs5, cs6, cs7, cs8, cstopb, crtscts, and ixon modes, which are explained in the stty(1) manual page.

Let us add to our example printer on the sixth serial port. We will set the bps rate to 38400. For the mode, we will set no parity with -parenb, 8-bit characters with cs8, no modem control with clocal and hardware flow control with 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.4.6. Installing the Text Filter

We are now ready to tell LPD what text filter to use to send jobs to the printer. A text filter, also known as an input filter, is a program that LPD runs when it has a job to print. When LPD runs the text filter for a printer, it sets the filter's standard input to the job to print, and its standard output to the printer device specified with the lp capability. The filter is expected to read the job from standard input, perform any necessary translation for the printer, and write the results to standard output, which will get printed. For more information on the text filter, see the Filters section.

For our simple printer setup, the text filter can be a small shell script that just executes /bin/cat to send the job to the printer. FreeBSD comes with another filter called lpf that handles backspacing and underlining for printers that might not deal with such character streams well. And, of course, you can use any other filter program you want. The filter lpf is described in detail in section entitled lpf: a Text Filter.

First, let us make the shell script /usr/local/libexec/if-simple be a simple text filter. Put the following text into that file with your favorite text editor:

#!/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

Make the file executable:

# chmod 555 /usr/local/libexec/if-simple

And then tell LPD to use it by specifying it with the if capability in /etc/printcap. We will add it to the two printers we have so far in the example /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:

注: A copy of the if-simple script can be found in the /usr/share/examples/printing directory.


9.3.1.4.7. Turn on LPD

lpd(8) is run from /etc/rc, controlled by the lpd_enable variable. This variable defaults to NO. If you have not done so already, add the line:

lpd_enable="YES"

to /etc/rc.conf, and then either restart your machine, or just run lpd(8).

# lpd

9.3.1.4.8. Trying It Out

You have reached the end of the simple LPD setup. Unfortunately, congratulations are not quite yet in order, since we still have to test the setup and correct any problems. To test the setup, try printing something. To print with the LPD system, you use the command lpr(1), which submits a job for printing.

You can combine lpr(1) with the lptest(1) program, introduced in section Checking Printer Communications to generate some test text.

To test the simple LPD setup:

Type:

# lptest 20 5 | lpr -Pprinter-name

Where printer-name is a the name of a printer (or an alias) specified in /etc/printcap. To test the default printer, type lpr(1) without any -P argument. Again, if you are testing a printer that expects PostScript, send a PostScript program in that language instead of using lptest(1). You can do so by putting the program in a file and typing lpr file.

For a PostScript printer, you should get the results of the program. If you are using lptest(1), then your results should look like the following:

!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678

To further test the printer, try downloading larger programs (for language-based printers) or running lptest(1) with different arguments. For example, lptest 80 60 will produce 60 lines of 80 characters each.

If the printer did not work, see the Troubleshooting section.


9.4. Advanced Printer Setup

This section describes filters for printing specially formatted files, header pages, printing across networks, and restricting and accounting for printer usage.


9.4.1. Filters

Although LPD handles network protocols, queuing, access control, and other aspects of printing, most of the real work happens in the filters. Filters are programs that communicate with the printer and handle its device dependencies and special requirements. In the simple printer setup, we installed a plain text filter--an extremely simple one that should work with most printers (section Installing the Text Filter).

However, in order to take advantage of format conversion, printer accounting, specific printer quirks, and so on, you should understand how filters work. It will ultimately be the filter's responsibility to handle these aspects. And the bad news is that most of the time you have to provide filters yourself. The good news is that many are generally available; when they are not, they are usually easy to write.

Also, FreeBSD comes with one, /usr/libexec/lpr/lpf, that works with many printers that can print plain text. (It handles backspacing and tabs in the file, and does accounting, but that is about all it does.) There are also several filters and filter components in the FreeBSD Ports Collection.

Here is what you will find in this section:

  • Section How Filters Work, tries to give an overview of a filter's role in the printing process. You should read this section to get an understanding of what is happening ``under the hood'' when LPD uses filters. This knowledge could help you anticipate and debug problems you might encounter as you install more and more filters on each of your printers.

  • LPD expects every printer to be able to print plain text by default. This presents a problem for PostScript (or other language-based printers) which cannot directly print plain text. Section Accommodating Plain Text Jobs on PostScript Printers tells you what you should do to overcome this problem. You should read this section if you have a PostScript printer.

  • PostScript is a popular output format for many programs. Even some people (myself included) write PostScript code directly. But PostScript printers are expensive. Section Simulating PostScript on Non PostScript Printers tells how you can further modify a printer's text filter to accept and print PostScript data on a non PostScript printer. You should read this section if you do not have a PostScript printer.

  • Section Conversion Filters tells about a way you can automate the conversion of specific file formats, such as graphic or typesetting data, into formats your printer can understand. After reading this section, you should be able to set up your printers such that users can type lpr -t to print troff data, or lpr -d to print TeX DVI data, or lpr -v to print raster image data, and so forth. I recommend reading this section.

  • Section Output Filters tells all about a not often used feature of LPD: output filters. Unless you are printing header pages (see Header Pages), you can probably skip that section altogether.

  • Section lpf: a Text Filter describes lpf, a fairly complete if simple text filter for line printers (and laser printers that act like line printers) that comes with FreeBSD. If you need a quick way to get printer accounting working for plain text, or if you have a printer which emits smoke when it sees backspace characters, you should definitely consider lpf.

注: A copy of the various scripts described below can be found in the /usr/share/examples/printing directory.


9.4.1.1. How Filters Work

As mentioned before, a filter is an executable program started by LPD to handle the device-dependent part of communicating with the printer.

When LPD wants to print a file in a job, it starts a filter program. It sets the filter's standard input to the file to print, its standard output to the printer, and its standard error to the error logging file (specified in the lf capability in /etc/printcap, or /dev/console by default).

Which filter LPD starts and the filter's arguments depend on what is listed in the /etc/printcap file and what arguments the user specified for the job on the lpr(1) command line. For example, if the user typed lpr -t, LPD would start the troff filter, listed in the tf capability for the destination printer. If the user wanted to print plain text, it would start the if filter (this is mostly true: see Output Filters for details).

There are three kinds of filters you can specify in /etc/printcap:

  • The text filter, confusingly called the input filter in LPD documentation, handles regular text printing. Think of it as the default filter. LPD expects every printer to be able to print plain text by default, and it is the text filter's job to make sure backspaces, tabs, or other special characters do not confuse the printer. If you are in an environment where you have to account for printer usage, the text filter must also account for pages printed, usually by counting the number of lines printed and comparing that to the number of lines per page the printer supports. The text filter is started with the following argument list:

    filter-name [-c] -wwidth -llength -iindent -n login -h host acct-file

    where
    -c

    appears if the job is submitted with lpr -l

    width

    is the value from the pw (page width) capability specified in /etc/printcap, default 132

    length

    is the value from the pl (page length) capability, default 66

    indent

    is the amount of the indentation from lpr -i, default 0

    login

    is the account name of the user printing the file

    host

    is the host name from which the job was submitted

    acct-file

    is the name of the accounting file from the af capability.



  • A conversion filter converts a specific file format into one the printer can render onto paper. For example, ditroff typesetting data cannot be directly printed, but you can install a conversion filter for ditroff files to convert the ditroff data into a form the printer can digest and print. Section Conversion Filters tells all about them. Conversion filters also need to do accounting, if you need printer accounting. Conversion filters are started with the following arguments:

    filter-name -xpixel-width -ypixel-height -n login -h host acct-file

    where pixel-width is the value from the px capability (default 0) and pixel-height is the value from the py capability (default 0).

  • The output filter is used only if there is no text filter, or if header pages are enabled. In my experience, output filters are rarely used. Section Output Filters describe them. There are only two arguments to an output filter:

    filter-name -wwidth -llength

    which are identical to the text filters -w and -l arguments.

Filters should also exit with the following exit status:

exit 0

If the filter printed the file successfully.

exit 1

If the filter failed to print the file but wants LPD to try to print the file again. LPD will restart a filter if it exits with this status.

exit 2

If the filter failed to print the file and does not want LPD to try again. LPD will throw out the file.

The text filter that comes with the FreeBSD release, /usr/libexec/lpr/lpf, takes advantage of the page width and length arguments to determine when to send a form feed and how to account for printer usage. It uses the login, host, and accounting file arguments to make the accounting entries.

If you are shopping for filters, see if they are LPD-compatible. If they are, they must support the argument lists described above. If you plan on writing filters for general use, then have them support the same argument lists and exit codes.


9.4.1.2. Accommodating Plain Text Jobs on PostScript® Printers

If you are the only user of your computer and PostScript (or other language-based) printer, and you promise to never send plain text to your printer and to never use features of various programs that will want to send plain text to your printer, then you do not need to worry about this section at all.

But, if you would like to send both PostScript and plain text jobs to the printer, then you are urged to augment your printer setup. To do so, we have the text filter detect if the arriving job is plain text or PostScript. All PostScript jobs must start with %! (for other printer languages, see your printer documentation). If those are the first two characters in the job, we have PostScript, and can pass the rest of the job directly. If those are not the first two characters in the file, then the filter will convert the text into PostScript and print the result.

How do we do this?

If you have got a serial printer, a great way to do it is to install lprps. lprps is a PostScript printer filter which performs two-way communication with the printer. It updates the printer's status file with verbose information from the printer, so users and administrators can see exactly what the state of the printer is (such as ``toner low'' or ``paper jam''). But more importantly, it includes a program called psif which detects whether the incoming job is plain text and calls textps (another program that comes with lprps) to convert it to PostScript. It then uses lprps to send the job to the printer.

lprps is part of the FreeBSD Ports Collection (see The Ports Collection). You can fetch, build and install it yourself, of course. After installing lprps, just specify the pathname to the psif program that is part of lprps. If you installed lprps from the ports collection, use the following in the serial PostScript printer's entry in /etc/printcap:

:if=/usr/local/libexec/psif:

You should also specify the rw capability; that tells LPD to open the printer in read-write mode.

If you have a parallel PostScript printer (and therefore cannot use two-way communication with the printer, which lprps needs), you can use the following shell script as the text filter:

#!/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

In the above script, textps is a program we installed separately to convert plain text to PostScript. You can use any text-to-PostScript program you wish. The FreeBSD Ports Collection (see The Ports Collection) includes a full featured text-to-PostScript program called a2ps that you might want to investigate.


9.4.1.3. Simulating PostScript on Non PostScript Printers

PostScript is the de facto standard for high quality typesetting and printing. PostScript is, however, an expensive standard. Thankfully, Aladdin Enterprises has a free PostScript work-alike called Ghostscript that runs with FreeBSD. Ghostscript can read most PostScript files and can render their pages onto a variety of devices, including many brands of non-PostScript printers. By installing Ghostscript and using a special text filter for your printer, you can make your non PostScript printer act like a real PostScript printer.

Ghostscript is in the FreeBSD Ports Collection, if you would like to install it from there. You can fetch, build, and install it quite easily yourself, as well.

To simulate PostScript, we have the text filter detect if it is printing a PostScript file. If it is not, then the filter will pass the file directly to the printer; otherwise, it will use Ghostscript to first convert the file into a format the printer will understand.

Here is an example: the following script is a text filter for Hewlett Packard DeskJet 500 printers. For other printers, substitute the -sDEVICE argument to the gs (Ghostscript) command. (Type gs -h to get a list of devices the current installation of Ghostscript supports.)

#!/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

Finally, you need to notify LPD of the filter via the if capability:

:if=/usr/local/libexec/ifhp:

That is it. You can type lpr plain.text and lpr whatever.ps and both should print successfully.


9.4.1.4. Conversion Filters

After completing the simple setup described in Simple Printer Setup, the first thing you will probably want to do is install conversion filters for your favorite file formats (besides plain ASCII text).


9.4.1.4.1. Why Install Conversion Filters?

Conversion filters make printing various kinds of files easy. As an example, suppose we do a lot of work with the TeX typesetting system, and we have a PostScript printer. Every time we generate a DVI file from TeX, we cannot print it directly until we convert the DVI file into PostScript. The command sequence goes like this:

% dvips seaweed-analysis.dvi
% lpr seaweed-analysis.ps

By installing a conversion filter for DVI files, we can skip the hand conversion step each time by having LPD do it for us. Now, each time we get a DVI file, we are just one step away from printing it:

% lpr -d seaweed-analysis.dvi

We got LPD to do the DVI file conversion for us by specifying the -d option. Section Formatting and Conversion Options lists the conversion options.

For each of the conversion options you want a printer to support, install a conversion filter and specify its pathname in /etc/printcap. A conversion filter is like the text filter for the simple printer setup (see section Installing the Text Filter) except that instead of printing plain text, the filter converts the file into a format the printer can understand.


9.4.1.4.2. Which Conversions Filters Should I Install?

You should install the conversion filters you expect to use. If you print a lot of DVI data, then a DVI conversion filter is in order. If you have got plenty of troff to print out, then you probably want a troff filter.

The following table summarizes the filters that LPD works with, their capability entries for the /etc/printcap file, and how to invoke them with the lpr command:

File type /etc/printcap capability lpr option
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

In our example, using lpr -d means the printer needs a df capability in its entry in /etc/printcap.

Despite what others might contend, formats like FORTRAN text and plot are probably obsolete. At your site, you can give new meanings to these or any of the formatting options just by installing custom filters. For example, suppose you would like to directly print Printerleaf files (files from the Interleaf desktop publishing program), but will never print plot files. You could install a Printerleaf conversion filter under the gf capability and then educate your users that lpr -g mean ``print Printerleaf files.''


9.4.1.4.3. Installing Conversion Filters

Since conversion filters are programs you install outside of the base FreeBSD installation, they should probably go under /usr/local. The directory /usr/local/libexec is a popular location, since they are specialized programs that only LPD will run; regular users should not ever need to run them.

To enable a conversion filter, specify its pathname under the appropriate capability for the destination printer in /etc/printcap.

In our example, we will add the DVI conversion filter to the entry for the printer named bamboo. Here is the example /etc/printcap file again, with the new df capability for the printer 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:

The DVI filter is a shell script named /usr/local/libexec/psdf. Here is that script:

#!/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 "$@"

This script runs dvips in filter mode (the -f argument) on standard input, which is the job to print. It then starts the PostScript printer filter lprps (see section Accommodating Plain Text Jobs on PostScript Printers) with the arguments LPD passed to this script. lprps will use those arguments to account for the pages printed.


9.4.1.4.4. More Conversion Filter Examples

Since there is no fixed set of steps to install conversion filters, let me instead provide more examples. Use these as guidance to making your own filters. Use them directly, if appropriate.

This example script is a raster (well, GIF file, actually) conversion filter for a Hewlett Packard LaserJet III-Si printer:

#!/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

It works by converting the GIF file into a portable anymap, converting that into a portable graymap, converting that into a portable bitmap, and converting that into LaserJet/PCL-compatible data.

Here is the /etc/printcap file with an entry for a printer using the above filter:

#
#  /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:

The following script is a conversion filter for troff data from the groff typesetting system for the PostScript printer named bamboo:

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"

The above script makes use of lprps again to handle the communication with the printer. If the printer were on a parallel port, we would use this script instead:

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops

That is it. Here is the entry we need to add to /etc/printcap to enable the filter:

:tf=/usr/local/libexec/pstf:

Here is an example that might make old hands at FORTRAN blush. It is a FORTRAN-text filter for any printer that can directly print plain text. We will install it for the printer 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

And we will add this line to the /etc/printcap for the printer teak to enable this filter:

:rf=/usr/local/libexec/hprf:

Here is one final, somewhat complex example. We will add a DVI filter to the LaserJet printer teak introduced earlier. First, the easy part: updating /etc/printcap with the location of the DVI filter:

:df=/usr/local/libexec/hpdf:

Now, for the hard part: making the filter. For that, we need a DVI-to-LaserJet/PCL conversion program. The FreeBSD Ports Collection (see The Ports Collection) has one: dvi2xx is the name of the package. Installing this package gives us the program we need, dvilj2p, which converts DVI into LaserJet IIp, LaserJet III, and LaserJet 2000 compatible codes.

dvilj2p makes the filter hpdf quite complex since dvilj2p cannot read from standard input. It wants to work with a filename. What is worse, the filename has to end in .dvi so using /dev/fd/0 for standard input is problematic. We can get around that problem by linking (symbolically) a temporary file name (one that ends in .dvi) to /dev/fd/0, thereby forcing dvilj2p to read from standard input.

The only other fly in the ointment is the fact that we cannot use /tmp for the temporary link. Symbolic links are owned by user and group bin. The filter runs as user daemon. And the /tmp directory has the sticky bit set. The filter can create the link, but it will not be able clean up when done and remove it since the link will belong to a different user.

Instead, the filter will make the symbolic link in the current working directory, which is the spooling directory (specified by the sd capability in /etc/printcap). This is a perfect place for filters to do their work, especially since there is (sometimes) more free disk space in the spooling directory than under /tmp.

Here, finally, is the filter:

#!/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. Automated Conversion: an Alternative to Conversion Filters

All these conversion filters accomplish a lot for your printing environment, but at the cost forcing the user to specify (on the lpr(1) command line) which one to use. If your users are not particularly computer literate, having to specify a filter option will become annoying. What is worse, though, is that an incorrectly specified filter option may run a filter on the wrong type of file and cause your printer to spew out hundreds of sheets of paper.

Rather than install conversion filters at all, you might want to try having the text filter (since it is the default filter) detect the type of file it has been asked to print and then automatically run the right conversion filter. Tools such as file can be of help here. Of course, it will be hard to determine the differences between some file types--and, of course, you can still provide conversion filters just for them.

The FreeBSD Ports Collection has a text filter that performs automatic conversion called apsfilter. It can detect plain text, PostScript, and DVI files, run the proper conversions, and print.


9.4.1.5. Output Filters

The LPD spooling system supports one other type of filter that we have not yet explored: an output filter. An output filter is intended for printing plain text only, like the text filter, but with many simplifications. If you are using an output filter but no text filter, then:

  • LPD starts an output filter once for the entire job instead of once for each file in the job.

  • LPD does not make any provision to identify the start or the end of files within the job for the output filter.

  • LPD does not pass the user's login or host to the filter, so it is not intended to do accounting. In fact, it gets only two arguments:

    filter-name -wwidth -llength

    Where width is from the pw capability and length is from the pl capability for the printer in question.

Do not be seduced by an output filter's simplicity. If you would like each file in a job to start on a different page an output filter will not work. Use a text filter (also known as an input filter); see section Installing the Text Filter. Furthermore, an output filter is actually more complex in that it has to examine the byte stream being sent to it for special flag characters and must send signals to itself on behalf of LPD.

However, an output filter is necessary if you want header pages and need to send escape sequences or other initialization strings to be able to print the header page. (But it is also futile if you want to charge header pages to the requesting user's account, since LPD does not give any user or host information to the output filter.)

On a single printer, LPD allows both an output filter and text or other filters. In such cases, LPD will start the output filter to print the header page (see section Header Pages) only. LPD then expects the output filter to stop itself by sending two bytes to the filter: ASCII 031 followed by ASCII 001. When an output filter sees these two bytes (031, 001), it should stop by sending SIGSTOP to itself. When LPD's done running other filters, it will restart the output filter by sending SIGCONT to it.

If there is an output filter but no text filter and LPD is working on a plain text job, LPD uses the output filter to do the job. As stated before, the output filter will print each file of the job in sequence with no intervening form feeds or other paper advancement, and this is probably not what you want. In almost all cases, you need a text filter.

The program lpf, which we introduced earlier as a text filter, can also run as an output filter. If you need a quick-and-dirty output filter but do not want to write the byte detection and signal sending code, try lpf. You can also wrap lpf in a shell script to handle any initialization codes the printer might require.


9.4.1.6. lpf: a Text Filter

The program /usr/libexec/lpr/lpf that comes with FreeBSD binary distribution is a text filter (input filter) that can indent output (job submitted with lpr -i), allow literal characters to pass (job submitted with lpr -l), adjust the printing position for backspaces and tabs in the job, and account for pages printed. It can also act like an output filter.

lpf is suitable for many printing environments. And although it has no capability to send initialization sequences to a printer, it is easy to write a shell script to do the needed initialization and then execute lpf.

In order for lpf to do page accounting correctly, it needs correct values filled in for the pw and pl capabilities in the /etc/printcap file. It uses these values to determine how much text can fit on a page and how many pages were in a user's job. For more information on printer accounting, see Accounting for Printer Usage.


9.4.2. Header Pages

If you have lots of users, all of them using various printers, then you probably want to consider header pages as a necessary evil.

Header pages, also known as banner or burst pages identify to whom jobs belong after they are printed. They are usually printed in large, bold letters, perhaps with decorative borders, so that in a stack of printouts they stand out from the real documents that comprise users' jobs. They enable users to locate their jobs quickly. The obvious drawback to a header page is that it is yet one more sheet that has to be printed for every job, their ephemeral usefulness lasting not more than a few minutes, ultimately finding themselves in a recycling bin or rubbish heap. (Note that header pages go with each job, not each file in a job, so the paper waste might not be that bad.)

The LPD system can provide header pages automatically for your printouts if your printer can directly print plain text. If you have a PostScript printer, you will need an external program to generate the header page; see Header Pages on PostScript Printers.


9.4.2.1. Enabling Header Pages

In the Simple Printer Setup section, we turned off header pages by specifying sh (meaning ``suppress header'') in the /etc/printcap file. To enable header pages for a printer, just remove the sh capability.

Sounds too easy, right?

You are right. You might have to provide an output filter to send initialization strings to the printer. Here is an example output filter for Hewlett Packard PCL-compatible printers:

#!/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

Specify the path to the output filter in the of capability. See the Output Filters section for more information.

Here is an example /etc/printcap file for the printer teak that we introduced earlier; we enabled header pages and added the above output filter:

#
#  /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:

Now, when users print jobs to teak, they get a header page with each job. If users want to spend time searching for their printouts, they can suppress header pages by submitting the job with lpr -h; see the Header Page Options section for more lpr(1) options.

注: LPD prints a form feed character after the header page. If your printer uses a different character or sequence of characters to eject a page, specify them with the ff capability in /etc/printcap.


9.4.2.2. Controlling Header Pages

By enabling header pages, LPD will produce a long header, a full page of large letters identifying the user, host, and job. Here is an example (kelly printed the job named outline from host rose):

      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 appends a form feed after this text so the job starts on a new page (unless you have sf (suppress form feeds) in the destination printer's entry in /etc/printcap).

If you prefer, LPD can make a short header; specify sb (short banner) in the /etc/printcap file. The header page will look like this:

rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995

Also by default, LPD prints the header page first, then the job. To reverse that, specify hl (header last) in /etc/printcap.


9.4.2.3. Accounting for Header Pages

Using LPD's built-in header pages enforces a particular paradigm when it comes to printer accounting: header pages must be free of charge.

Why?

Because the output filter is the only external program that will have control when the header page is printed that could do accounting, and it is not provided with any user or host information or an accounting file, so it has no idea whom to charge for printer use. It is also not enough to just ``add one page'' to the text filter or any of the conversion filters (which do have user and host information) since users can suppress header pages with lpr -h. They could still be charged for header pages they did not print. Basically, lpr -h will be the preferred option of environmentally-minded users, but you cannot offer any incentive to use it.

It is still not enough to have each of the filters generate their own header pages (thereby being able to charge for them). If users wanted the option of suppressing the header pages with lpr -h, they will still get them and be charged for them since LPD does not pass any knowledge of the -h option to any of the filters.

So, what are your options?

You can:

  • Accept LPD's paradigm and make header pages free.

  • Install an alternative to LPD, such as LPRng. Section Alternatives to the Standard Spooler tells more about other spooling software you can substitute for LPD.

  • Write a smart output filter. Normally, an output filter is not meant to do anything more than initialize a printer or do some simple character conversion. It is suited for header pages and plain text jobs (when there is no text (input) filter). But, if there is a text filter for the plain text jobs, then LPD will start the output filter only for the header pages. And the output filter can parse the header page text that LPD generates to determine what user and host to charge for the header page. The only other problem with this method is that the output filter still does not know what accounting file to use (it is not passed the name of the file from the af capability), but if you have a well-known accounting file, you can hard-code that into the output filter. To facilitate the parsing step, use the sh (short header) capability in /etc/printcap. Then again, all that might be too much trouble, and users will certainly appreciate the more generous system administrator who makes header pages free.


9.4.2.4. Header Pages on PostScript Printers

As described above, LPD can generate a plain text header page suitable for many printers. Of course, PostScript cannot directly print plain text, so the header page feature of LPD is useless--or mostly so.

One obvious way to get header pages is to have every conversion filter and the text filter generate the header page. The filters should use the user and host arguments to generate a suitable header page. The drawback of this method is that users will always get a header page, even if they submit jobs with lpr -h.

Let us explore this method. The following script takes three arguments (user login name, host name, and job name) and makes a simple PostScript header page:

#!/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

Now, each of the conversion filters and the text filter can call this script to first generate the header page, and then print the user's job. Here is the DVI conversion filter from earlier in this document, modified to make a header page:

#!/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

Notice how the filter has to parse the argument list in order to determine the user and host name. The parsing for the other conversion filters is identical. The text filter takes a slightly different set of arguments, though (see section How Filters Work).

As we have mentioned before, the above scheme, though fairly simple, disables the ``suppress header page'' option (the -h option) to lpr. If users wanted to save a tree (or a few pennies, if you charge for header pages), they would not be able to do so, since every filter's going to print a header page with every job.

To allow users to shut off header pages on a per-job basis, you will need to use the trick introduced in section Accounting for Header Pages: write an output filter that parses the LPD-generated header page and produces a PostScript version. If the user submits the job with lpr -h, then LPD will not generate a header page, and neither will your output filter. Otherwise, your output filter will read the text from LPD and send the appropriate header page PostScript code to the printer.

If you have a PostScript printer on a serial line, you can make use of lprps, which comes with an output filter, psof, which does the above. Note that psof does not charge for header pages.


9.4.3. Networked Printing

FreeBSD supports networked printing: sending jobs to remote printers. Networked printing generally refers to two different things:

  • Accessing a printer attached to a remote host. You install a printer that has a conventional serial or parallel interface on one host. Then, you set up LPD to enable access to the printer from other hosts on the network. Section Printers Installed on Remote Hosts tells how to do this.

  • Accessing a printer attached directly to a network. The printer has a network interface in addition (or in place of) a more conventional serial or parallel interface. Such a printer might work as follows:

    • It might understand the LPD protocol and can even queue jobs from remote hosts. In this case, it acts just like a regular host running LPD. Follow the same procedure in section Printers Installed on Remote Hosts to set up such a printer.

    • It might support a data stream network connection. In this case, you ``attach'' the printer to one host on the network by making that host responsible for spooling jobs and sending them to the printer. Section Printers with Networked Data Stream Interfaces gives some suggestions on installing such printers.


9.4.3.1. Printers Installed on Remote Hosts

The LPD spooling system has built-in support for sending jobs to other hosts also running LPD (or are compatible with LPD). This feature enables you to install a printer on one host and make it accessible from other hosts. It also works with printers that have network interfaces that understand the LPD protocol.

To enable this kind of remote printing, first install a printer on one host, the printer host, using the simple printer setup described in the Simple Printer Setup section. Do any advanced setup in Advanced Printer Setup that you need. Make sure to test the printer and see if it works with the features of LPD you have enabled. Also ensure that the local host has authorization to use the LPD service in the remote host (see Restricting Jobs from Remote Printers).

If you are using a printer with a network interface that is compatible with LPD, then the printer host in the discussion below is the printer itself, and the printer name is the name you configured for the printer. See the documentation that accompanied your printer and/or printer-network interface.

提示: If you are using a Hewlett Packard Laserjet then the printer name text will automatically perform the LF to CRLF conversion for you, so you will not require the hpif script.

Then, on the other hosts you want to have access to the printer, make an entry in their /etc/printcap files with the following:

  1. Name the entry anything you want. For simplicity, though, you probably want to use the same name and aliases as on the printer host.

  2. Leave the lp capability blank, explicitly (:lp=:).

  3. Make a spooling directory and specify its location in the sd capability. LPD will store jobs here before they get sent to the printer host.

  4. Place the name of the printer host in the rm capability.

  5. Place the printer name on the printer host in the rp capability.

That is it. You do not need to list conversion filters, page dimensions, or anything else in the /etc/printcap file.

Here is an example. The host rose has two printers, bamboo and rattan. We will enable users on the host orchid to print to those printers. Here is the /etc/printcap file for orchid (back from section Enabling Header Pages). It already had the entry for the printer teak; we have added entries for the two printers on the host 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:

Then, we just need to make spooling directories on 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

Now, users on orchid can print to rattan and bamboo. If, for example, a user on orchid typed

% lpr -P bamboo -d sushi-review.dvi
the LPD system on orchid would copy the job to the spooling directory /var/spool/lpd/bamboo and note that it was a DVI job. As soon as the host rose has room in its bamboo spooling directory, the two LPDs would transfer the file to rose. The file would wait in rose's queue until it was finally printed. It would be converted from DVI to PostScript (since bamboo is a PostScript printer) on rose.


9.4.3.2. Printers with Networked Data Stream Interfaces

Often, when you buy a network interface card for a printer, you can get two versions: one which emulates a spooler (the more expensive version), or one which just lets you send data to it as if you were using a serial or parallel port (the cheaper version). This section tells how to use the cheaper version. For the more expensive one, see the previous section Printers Installed on Remote Hosts.

The format of the /etc/printcap file lets you specify what serial or parallel interface to use, and (if you are using a serial interface), what baud rate, whether to use flow control, delays for tabs, conversion of newlines, and more. But there is no way to specify a connection to a printer that is listening on a TCP/IP or other network port.

To send data to a networked printer, you need to develop a communications program that can be called by the text and conversion filters. Here is one such example: the script netprint takes all data on standard input and sends it to a network-attached printer. We specify the hostname of the printer as the first argument and the port number to which to connect as the second argument to netprint. Note that this supports one-way communication only (FreeBSD to printer); many network printers support two-way communication, and you might want to take advantage of that (to get printer status, perform accounting, etc.).

#!/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;

We can then use this script in various filters. Suppose we had a Diablo 750-N line printer connected to the network. The printer accepts data to print on port number 5100. The host name of the printer is scrivener. Here is the text filter for the printer:

#!/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. Restricting Printer Usage

This section gives information on restricting printer usage. The LPD system lets you control who can access a printer, both locally or remotely, whether they can print multiple copies, how large their jobs can be, and how large the printer queues can get.


9.4.4.1. Restricting Multiple Copies

The LPD system makes it easy for users to print multiple copies of a file. Users can print jobs with lpr -#5 (for example) and get five copies of each file in the job. Whether this is a good thing is up to you.

If you feel multiple copies cause unnecessary wear and tear on your printers, you can disable the -# option to lpr(1) by adding the sc capability to the /etc/printcap file. When users submit jobs with the -# option, they will see:

lpr: multiple copies are not allowed

Note that if you have set up access to a printer remotely (see section Printers Installed on Remote Hosts), you need the sc capability on the remote /etc/printcap files as well, or else users will still be able to submit multiple-copy jobs by using another host.

Here is an example. This is the /etc/printcap file for the host rose. The printer rattan is quite hearty, so we will allow multiple copies, but the laser printer bamboo is a bit more delicate, so we will disable multiple copies by adding the sc capability:

#
#  /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:

Now, we also need to add the sc capability on the host orchid's /etc/printcap (and while we are at it, let us disable multiple copies for the printer 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:

By using the sc capability, we prevent the use of lpr -#, but that still does not prevent users from running lpr(1) multiple times, or from submitting the same file multiple times in one job like this:

% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign

There are many ways to prevent this abuse (including ignoring it) which you are free to explore.


9.4.4.2. Restricting Access to Printers

You can control who can print to what printers by using the UNIX group mechanism and the rg capability in /etc/printcap. Just place the users you want to have access to a printer in a certain group, and then name that group in the rg capability.

Users outside the group (including root) will be greeted with ``lpr: Not a member of the restricted group'' if they try to print to the controlled printer.

As with the sc (suppress multiple copies) capability, you need to specify rg on remote hosts that also have access to your printers, if you feel it is appropriate (see section Printers Installed on Remote Hosts).

For example, we will let anyone access the printer rattan, but only those in group artists can use bamboo. Here is the familiar /etc/printcap for host rose:

#
#  /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.

注: There can be only one restricted group per printer.


9.4.4.3. Controlling Sizes of Jobs Submitted

If you have many users accessing the printers, you probably need to put an upper limit on the sizes of the files users can submit to print. After all, there is only so much free space on the filesystem that houses the spooling directories, and you also need to make sure there is room for the jobs of other users.

LPD enables you to limit the maximum byte size a file in a job can be with the mx capability. The units are in BUFSIZ blocks, which are 1024 bytes. If you put a zero for this capability, there will be no limit on file size; however, if no mx capability is specified, then a default limit of 1000 blocks will be used.

注: The limit applies to files in a job, and not the total job size.

LPD will not refuse a file that is larger than the limit you place on a printer. Instead, it will queue as much of the file up to the limit, which will then get printed. The rest will be discarded. Whether this is correct behavior is up for debate.

Let us add limits to our example printers rattan and bamboo. Since those artists' PostScript files tend to be large, we will limit them to five megabytes. We will put no limit on the plain text line printer:

#
#  /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:

Again, the limits apply to the local users only. If you have set up access to your printers remotely, remote users will not get those limits. You will need to specify the mx capability in the remote /etc/printcap files as well. See section Printers Installed on Remote Hosts for more information on remote printing.

There is another specialized way to limit job sizes from remote printers; see section Restricting Jobs from Remote Printers.


9.4.4.4. Restricting Jobs from Remote Printers

The LPD spooling system provides several ways to restrict print jobs submitted from remote hosts:

Host restrictions

You can control from which remote hosts a local LPD accepts requests with the files /etc/hosts.equiv and /etc/hosts.lpd. LPD checks to see if an incoming request is from a host listed in either one of these files. If not, LPD refuses the request.

The format of these files is simple: one host name per line. Note that the file /etc/hosts.equiv is also used by the ruserok(3) protocol, and affects programs like rsh(1) and rcp(1), so be careful.

For example, here is the /etc/hosts.lpd file on the host rose:

orchid
violet
madrigal.fishbaum.de

This means rose will accept requests from the hosts orchid, violet, and madrigal.fishbaum.de. If any other host tries to access rose's LPD, the job will be refused.

Size restrictions

You can control how much free space there needs to remain on the filesystem where a spooling directory resides. Make a file called minfree in the spooling directory for the local printer. Insert in that file a number representing how many disk blocks (512 bytes) of free space there has to be for a remote job to be accepted.

This lets you insure that remote users will not fill your filesystem. You can also use it to give a certain priority to local users: they will be able to queue jobs long after the free disk space has fallen below the amount specified in the minfree file.

For example, let us add a minfree file for the printer bamboo. We examine /etc/printcap to find the spooling directory for this printer; here is bamboo's entry:

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:

The spooling directory is given in the sd capability. We will make three megabytes (which is 6144 disk blocks) the amount of free disk space that must exist on the filesystem for LPD to accept remote jobs:

# echo 6144 > /var/spool/lpd/bamboo/minfree
             
User restrictions

You can control which remote users can print to local printers by specifying the rs capability in /etc/printcap. When rs appears in the entry for a locally-attached printer, LPD will accept jobs from remote hosts if the user submitting the job also has an account of the same login name on the local host. Otherwise, LPD refuses the job.

This capability is particularly useful in an environment where there are (for example) different departments sharing a network, and some users transcend departmental boundaries. By giving them accounts on your systems, they can use your printers from their own departmental systems. If you would rather allow them to use only your printers and not your computer resources, you can give them ``token'' accounts, with no home directory and a useless shell like /usr/bin/false.


9.4.5. Accounting for Printer Usage

So, you need to charge for printouts. And why not? Paper and ink cost money. And then there are maintenance costs--printers are loaded with moving parts and tend to break down. You have examined your printers, usage patterns, and maintenance fees and have come up with a per-page (or per-foot, per-meter, or per-whatever) cost. Now, how do you actually start accounting for printouts?

Well, the bad news is the LPD spooling system does not provide much help in this department. Accounting is highly dependent on the kind of printer in use, the formats being printed, and your requirements in charging for printer usage.

To implement accounting, you have to modify a printer's text filter (to charge for plain text jobs) and the conversion filters (to charge for other file formats), to count pages or query the printer for pages printed. You cannot get away with using the simple output filter, since it cannot do accounting. See section Filters.

Generally, there are two ways to do accounting:

  • Periodic accounting is the more common way, possibly because it is easier. Whenever someone prints a job, the filter logs the user, host, and number of pages to an accounting file. Every month, semester, year, or whatever time period you prefer, you collect the accounting files for the various printers, tally up the pages printed by users, and charge for usage. Then you truncate all the logging files, starting with a clean slate for the next period.

  • Timely accounting is less common, probably because it is more difficult. This method has the filters charge users for printouts as soon as they use the printers. Like disk quotas, the accounting is immediate. You can prevent users from printing when their account goes in the red, and might provide a way for users to check and adjust their ``print quotas.'' But this method requires some database code to track users and their quotas.

The LPD spooling system supports both methods easily: since you have to provide the filters (well, most of the time), you also have to provide the accounting code. But there is a bright side: you have enormous flexibility in your accounting methods. For example, you choose whether to use periodic or timely accounting. You choose what information to log: user names, host names, job types, pages printed, square footage of paper used, how long the job took to print, and so forth. And you do so by modifying the filters to save this information.


9.4.5.1. Quick and Dirty Printer Accounting

FreeBSD comes with two programs that can get you set up with simple periodic accounting right away. They are the text filter lpf, described in section lpf: a Text Filter, and pac(8), a program to gather and total entries from printer accounting files.

As mentioned in the section on filters (Filters), LPD starts the text and the conversion filters with the name of the accounting file to use on the filter command line. The filters can use this argument to know where to write an accounting file entry. The name of this file comes from the af capability in /etc/printcap, and if not specified as an absolute path, is relative to the spooling directory.

LPD starts lpf with page width and length arguments (from the pw and pl capabilities). lpf uses these arguments to determine how much paper will be used. After sending the file to the printer, it then writes an accounting entry in the accounting file. The entries look like this:

2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang

You should use a separate accounting file for each printer, as lpf has no file locking logic built into it, and two lpfs might corrupt each other's entries if they were to write to the same file at the same time. An easy way to insure a separate accounting file for each printer is to use af=acct in /etc/printcap. Then, each accounting file will be in the spooling directory for a printer, in a file named acct.

When you are ready to charge users for printouts, run the pac(8) program. Just change to the spooling directory for the printer you want to collect on and type pac. You will get a dollar-centric summary like the following:

  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

These are the arguments pac(8) expects:

-Pprinter

Which printer to summarize. This option works only if there is an absolute path in the af capability in /etc/printcap.

-c

Sort the output by cost instead of alphabetically by user name.

-m

Ignore host name in the accounting files. With this option, user smith on host alpha is the same user smith on host gamma. Without, they are different users.

-pprice

Compute charges with price dollars per page or per foot instead of the price from the pc capability in /etc/printcap, or two cents (the default). You can specify price as a floating point number.

-r

Reverse the sort order.

-s

Make an accounting summary file and truncate the accounting file.

name ...

Print accounting information for the given user names only.

In the default summary that pac(8) produces, you see the number of pages printed by each user from various hosts. If, at your site, host does not matter (because users can use any host), run pac -m, to produce the following summary:

  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

To compute the dollar amount due, pac(8) uses the pc capability in the /etc/printcap file (default of 200, or 2 cents per page). Specify, in hundredths of cents, the price per page or per foot you want to charge for printouts in this capability. You can override this value when you run pac(8) with the -p option. The units for the -p option are in dollars, though, not hundredths of cents. For example,

# pac -p1.50
makes each page cost one dollar and fifty cents. You can really rake in the profits by using this option.

Finally, running pac -s will save the summary information in a summary accounting file, which is named the same as the printer's accounting file, but with _sum appended to the name. It then truncates the accounting file. When you run pac(8) again, it rereads the summary file to get starting totals, then adds information from the regular accounting file.


9.4.5.2. How Can You Count Pages Printed?

In order to perform even remotely accurate accounting, you need to be able to determine how much paper a job uses. This is the essential problem of printer accounting.

For plain text jobs, the problem is not that hard to solve: you count how many lines are in a job and compare it to how many lines per page your printer supports. Do not forget to take into account backspaces in the file which overprint lines, or long logical lines that wrap onto one or more additional physical lines.

The text filter lpf (introduced in lpf: a Text Filter) takes into account these things when it does accounting. If you are writing a text filter which needs to do accounting, you might want to examine lpf's source code.

How do you handle other file formats, though?

Well, for DVI-to-LaserJet or DVI-to-PostScript conversion, you can have your filter parse the diagnostic output of dvilj or dvips and look to see how many pages were converted. You might be able to do similar things with other file formats and conversion programs.

But these methods suffer from the fact that the printer may not actually print all those pages. For example, it could jam, run out of toner, or explode--and the user would still get charged.

So, what can you do?

There is only one sure way to do accurate accounting. Get a printer that can tell you how much paper it uses, and attach it via a serial line or a network connection. Nearly all PostScript printers support this notion. Other makes and models do as well (networked Imagen laser printers, for example). Modify the filters for these printers to get the page usage after they print each job and have them log accounting information based on that value only. There is no line counting nor error-prone file examination required.

Of course, you can always be generous and make all printouts free.


9.5. Using Printers

This section tells you how to use printers you have set up with FreeBSD. Here is an overview of the user-level commands:

lpr(1)

Print jobs

lpq(1)

Check printer queues

lprm(1)

Remove jobs from a printer's queue

There is also an administrative command, lpc(8), described in the section Administering the LPD Spooler, used to control printers and their queues.

All three of the commands lpr(1), lprm(1), and lpq(1) accept an option -P printer-name to specify on which printer/queue to operate, as listed in the /etc/printcap file. This enables you to submit, remove, and check on jobs for various printers. If you do not use the -P option, then these commands use the printer specified in the PRINTER environment variable. Finally, if you do not have a PRINTER environment variable, these commands default to the printer named lp.

Hereafter, the terminology default printer means the printer named in the PRINTER environment variable, or the printer named lp when there is no PRINTER environment variable.


9.5.1. Printing Jobs

To print files, type:

% lpr filename ...

This prints each of the listed files to the default printer. If you list no files, lpr(1) reads data to print from standard input. For example, this command prints some important system files:

% lpr /etc/host.conf /etc/hosts.equiv

To select a specific printer, type:

% lpr -P printer-name filename ...

This example prints a long listing of the current directory to the printer named rattan:

% ls -l | lpr -P rattan

Because no files were listed for the lpr(1) command, lpr read the data to print from standard input, which was the output of the ls -l command.

The lpr(1) command can also accept a wide variety of options to control formatting, apply file conversions, generate multiple copies, and so forth. For more information, see the section Printing Options.


9.5.2. Checking Jobs

When you print with lpr(1), the data you wish to print is put together in a package called a ``print job'', which is sent to the LPD spooling system. Each printer has a queue of jobs, and your job waits in that queue along with other jobs from yourself and from other users. The printer prints those jobs in a first-come, first-served order.

To display the queue for the default printer, type lpq(1). For a specific printer, use the -P option. For example, the command

% lpq -P bamboo
shows the queue for the printer named bamboo. Here is an example of the output of the lpq command:

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

This shows three jobs in the queue for bamboo. The first job, submitted by user kelly, got assigned ``job number'' 9. Every job for a printer gets a unique job number. Most of the time you can ignore the job number, but you will need it if you want to cancel the job; see section Removing Jobs for details.

Job number nine consists of two files; multiple files given on the lpr(1) command line are treated as part of a single job. It is the currently active job (note the word active under the ``Rank'' column), which means the printer should be currently printing that job. The second job consists of data passed as the standard input to the lpr(1) command. The third job came from user mary; it is a much larger job. The pathname of the file she is trying to print is too long to fit, so the lpq(1) command just shows three dots.

The very first line of the output from lpq(1) is also useful: it tells what the printer is currently doing (or at least what LPD thinks the printer is doing).

The lpq(1) command also support a -l option to generate a detailed long listing. Here is an example of 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. Removing Jobs

If you change your mind about printing a job, you can remove the job from the queue with the lprm(1) command. Often, you can even use lprm(1) to remove an active job, but some or all of the job might still get printed.

To remove a job from the default printer, first use lpq(1) to find the job number. Then type:

% lprm job-number

To remove the job from a specific printer, add the -P option. The following command removes job number 10 from the queue for the printer bamboo:

% lprm -P bamboo 10

The lprm(1) command has a few shortcuts:

lprm -

Removes all jobs (for the default printer) belonging to you.

lprm user

Removes all jobs (for the default printer) belonging to user. The superuser can remove other users' jobs; you can remove only your own jobs.

lprm

With no job number, user name, or - appearing on the command line, lprm(1) removes the currently active job on the default printer, if it belongs to you. The superuser can remove any active job.

Just use the -P option with the above shortcuts to operate on a specific printer instead of the default. For example, the following command removes all jobs for the current user in the queue for the printer named rattan:

% lprm -P rattan -

注: If you are working in a networked environment, lprm(1) will let you remove jobs only from the host from which the jobs were submitted, even if the same printer is available from other hosts. The following command sequence demonstrates this:

% 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. Beyond Plain Text: Printing Options

The lpr(1) command supports a number of options that control formatting text, converting graphic and other file formats, producing multiple copies, handling of the job, and more. This section describes the options.


9.5.4.1. Formatting and Conversion Options

The following lpr(1) options control formatting of the files in the job. Use these options if the job does not contain plain text or if you want plain text formatted through the pr(1) utility.

For example, the following command prints a DVI file (from the TeX typesetting system) named fish-report.dvi to the printer named bamboo:

% lpr -P bamboo -d fish-report.dvi

These options apply to every file in the job, so you cannot mix (say) DVI and ditroff files together in a job. Instead, submit the files as separate jobs, using a different conversion option for each job.

注: All of these options except -p and -T require conversion filters installed for the destination printer. For example, the -d option requires the DVI conversion filter. Section Conversion Filters gives details.

-c

Print cifplot files.

-d

Print DVI files.

-f

Print FORTRAN text files.

-g

Print plot data.

-i number

Indent the output by number columns; if you omit number, indent by 8 columns. This option works only with certain conversion filters.

注: Do not put any space between the -i and the number.

-l

Print literal text data, including control characters.

-n

Print ditroff (device independent troff) data.

-p

Format plain text with pr(1) before printing. See pr(1) for more information.

-T title

Use title on the pr(1) header instead of the file name. This option has effect only when used with the -p option.

-t

Print troff data.

-v

Print raster data.

Here is an example: this command prints a nicely formatted version of the ls(1) manual page on the default printer:

% zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t

The zcat(1) command uncompresses the source of the ls(1) manual page and passes it to the troff(1) command, which formats that source and makes GNU troff output and passes it to lpr(1), which submits the job to the LPD spooler. Because we used the -t option to lpr(1), the spooler will convert the GNU troff output into a format the default printer can understand when it prints the job.


9.5.4.2. Job Handling Options

The following options to lpr(1) tell LPD to handle the job specially:

-# copies

Produce a number of copies of each file in the job instead of just one copy. An administrator may disable this option to reduce printer wear-and-tear and encourage photocopier usage. See section Restricting Multiple Copies.

This example prints three copies of parser.c followed by three copies of parser.h to the default printer:

% lpr -#3 parser.c parser.h
-m

Send mail after completing the print job. With this option, the LPD system will send mail to your account when it finishes handling your job. In its message, it will tell you if the job completed successfully or if there was an error, and (often) what the error was.

-s

Do not copy the files to the spooling directory, but make symbolic links to them instead.

If you are printing a large job, you probably want to use this option. It saves space in the spooling directory (your job might overflow the free space on the filesystem where the spooling directory resides). It saves time as well since LPD will not have to copy each and every byte of your job to the spooling directory.

There is a drawback, though: since LPD will refer to the original files directly, you cannot modify or remove them until they have been printed.

注: If you are printing to a remote printer, LPD will eventually have to copy files from the local host to the remote host, so the -s option will save space only on the local spooling directory, not the remote. It is still useful, though.

-r

Remove the files in the job after copying them to the spooling directory, or after printing them with the -s option. Be careful with this option!


9.5.4.3. Header Page Options

These options to lpr(1) adjust the text that normally appears on a job's header page. If header pages are suppressed for the destination printer, these options have no effect. See section Header Pages for information about setting up header pages.

-C text

Replace the hostname on the header page with text. The hostname is normally the name of the host from which the job was submitted.

-J text

Replace the job name on the header page with text. The job name is normally the name of the first file of the job, or stdin if you are printing standard input.

-h

Do not print any header page.

注: At some sites, this option may have no effect due to the way header pages are generated. See Header Pages for details.


9.5.5. Administering Printers

As an administrator for your printers, you have had to install, set up, and test them. Using the lpc(8) command, you can interact with your printers in yet more ways. With lpc(8), you can

  • Start and stop the printers

  • Enable and disable their queues

  • Rearrange the order of the jobs in each queue.

First, a note about terminology: if a printer is stopped, it will not print anything in its queue. Users can still submit jobs, which will wait in the queue until the printer is started or the queue is cleared.

If a queue is disabled, no user (except root) can submit jobs for the printer. An enabled queue allows jobs to be submitted. A printer can be started for a disabled queue, in which case it will continue to print jobs in the queue until the queue is empty.

In general, you have to have root privileges to use the lpc(8) command. Ordinary users can use the lpc(8) command to get printer status and to restart a hung printer only.

Here is a summary of the lpc(8) commands. Most of the commands take a printer-name argument to tell on which printer to operate. You can use all for the printer-name to mean all printers listed in /etc/printcap.

abort printer-name

Cancel the current job and stop the printer. Users can still submit jobs if the queue is enabled.

clean printer-name

Remove old files from the printer's spooling directory. Occasionally, the files that make up a job are not properly removed by LPD, particularly if there have been errors during printing or a lot of administrative activity. This command finds files that do not belong in the spooling directory and removes them.

disable printer-name

Disable queuing of new jobs. If the printer is running, it will continue to print any jobs remaining in the queue. The superuser (root) can always submit jobs, even to a disabled queue.

This command is useful while you are testing a new printer or filter installation: disable the queue and submit jobs as root. Other users will not be able to submit jobs until you complete your testing and re-enable the queue with the enable command.

down printer-name message

Take a printer down. Equivalent to disable followed by stop. The message appears as the printer's status whenever a user checks the printer's queue with lpq(1) or status with lpc status.

enable printer-name

Enable the queue for a printer. Users can submit jobs but the printer will not print anything until it is started.

help command-name

Print help on the command command-name. With no command-name, print a summary of the commands available.

restart printer-name

Start the printer. Ordinary users can use this command if some extraordinary circumstance hangs LPD, but they cannot start a printer stopped with either the stop or down commands. The restart command is equivalent to abort followed by start.

start printer-name

Start the printer. The printer will print jobs in its queue.

stop printer-name

Stop the printer. The printer will finish the current job and will not print anything else in its queue. Even though the printer is stopped, users can still submit jobs to an enabled queue.

topq printer-name job-or-username

Rearrange the queue for printer-name by placing the jobs with the listed job numbers or the jobs belonging to username at the top of the queue. For this command, you cannot use all as the printer-name.

up printer-name

Bring a printer up; the opposite of the down command. Equivalent to start followed by enable.

lpc(8) accepts the above commands on the command line. If you do not enter any commands, lpc(8) enters an interactive mode, where you can enter commands until you type exit, quit, or end-of-file.


9.6. Alternatives to the Standard Spooler

If you have been reading straight through this manual, by now you have learned just about everything there is to know about the LPD spooling system that comes with FreeBSD. You can probably appreciate many of its shortcomings, which naturally leads to the question: ``What other spooling systems are out there (and work with FreeBSD)?''

LPRng

LPRng, which purportedly means ``LPR: the Next Generation'' is a complete rewrite of PLP. Patrick Powell and Justin Mason (the principal maintainer of PLP) collaborated to make LPRng. The main site for LPRng is http://www.lprng.org/.

CUPS

CUPS, the Common UNIX Printing System, provides a portable printing layer for UNIX-based operating systems. It has been developed by Easy Software Products to promote a standard printing solution for all UNIX vendors and users.

CUPS uses the Internet Printing Protocol (IPP) as the basis for managing print jobs and queues. The Line Printer Daemon (LPD) Server Message Block (SMB), and AppSocket (a.k.a. JetDirect) protocols are also supported with reduced functionality. CUPS adds network printer browsing and PostScript Printer Description (PPD) based printing options to support real-world printing under UNIX.

The main site for CUPS is http://www.cups.org/.


9.7. Troubleshooting

After performing the simple test with lptest(1), you might have gotten one of the following results instead of the correct printout:

It worked, after awhile; or, it did not eject a full sheet.

The printer printed the above, but it sat for awhile and did nothing. In fact, you might have needed to press a PRINT REMAINING or FORM FEED button on the printer to get any results to appear.

If this is the case, the printer was probably waiting to see if there was any more data for your job before it printed anything. To fix this problem, you can have the text filter send a FORM FEED character (or whatever is necessary) to the printer. This is usually sufficient to have the printer immediately print any text remaining in its internal buffer. It is also useful to make sure each print job ends on a full sheet, so the next job does not start somewhere on the middle of the last page of the previous job.

The following replacement for the shell script /usr/local/libexec/if-simple prints a form feed after it sends the job to the printer:

#!/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
It produced the ``staircase effect.''

You got the following on paper:

!"#$%&'()*+,-./01234
                "#$%&'()*+,-./012345
                                 #$%&'()*+,-./0123456

You have become another victim of the staircase effect, caused by conflicting interpretations of what characters should indicate a new line. UNIX style operating systems use a single character: ASCII code 10, the line feed (LF). MS-DOS, OS/2®, and others uses a pair of characters, ASCII code 10 and ASCII code 13 (the carriage return or CR). Many printers use the MS-DOS convention for representing new-lines.

When you print with FreeBSD, your text used just the line feed character. The printer, upon seeing a line feed character, advanced the paper one line, but maintained the same horizontal position on the page for the next character to print. That is what the carriage return is for: to move the location of the next character to print to the left edge of the paper.

Here is what FreeBSD wants your printer to do:

Printer received CR Printer prints CR
Printer received LF Printer prints CR + LF

Here are some ways to achieve this:

  • Use the printer's configuration switches or control panel to alter its interpretation of these characters. Check your printer's manual to find out how to do this.

    注: If you boot your system into other operating systems besides FreeBSD, you may have to reconfigure the printer to use a an interpretation for CR and LF characters that those other operating systems use. You might prefer one of the other solutions, below.

  • Have FreeBSD's serial line driver automatically convert LF to CR+LF. Of course, this works with printers on serial ports only. To enable this feature, use the ms# capability and set the onlcr mode in the /etc/printcap file for the printer.

  • Send an escape code to the printer to have it temporarily treat LF characters differently. Consult your printer's manual for escape codes that your printer might support. When you find the proper escape code, modify the text filter to send the code first, then send the print job.

    Here is an example text filter for printers that understand the Hewlett-Packard PCL escape codes. This filter makes the printer treat LF characters as a LF and CR; then it sends the job; then it sends a form feed to eject the last page of the job. It should work with nearly all Hewlett Packard printers.

    #!/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
    

    Here is an example /etc/printcap from a host called orchid. It has a single printer attached to its first parallel port, a Hewlett Packard LaserJet 3Si named teak. It is using the above script as its text filter:

    #
    #  /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:
    
It overprinted each line.

The printer never advanced a line. All of the lines of text were printed on top of each other on one line.

This problem is the ``opposite'' of the staircase effect, described above, and is much rarer. Somewhere, the LF characters that FreeBSD uses to end a line are being treated as CR characters to return the print location to the left edge of the paper, but not also down a line.

Use the printer's configuration switches or control panel to enforce the following interpretation of LF and CR characters:

Printer receives Printer prints
CR CR
LF CR + LF
The printer lost characters.

While printing, the printer did not print a few characters in each line. The problem might have gotten worse as the printer ran, losing more and more characters.

The problem is that the printer cannot keep up with the speed at which the computer sends data over a serial line (this problem should not occur with printers on parallel ports). There are two ways to overcome the problem:

  • If the printer supports XON/XOFF flow control, have FreeBSD use it by specifying the ixon mode in the ms# capability.

  • If the printer supports carrier flow control, specify the crtscts mode in the ms# capability. Make sure the cable connecting the printer to the computer is correctly wired for carrier flow control.

It printed garbage.

The printer printed what appeared to be random garbage, but not the desired text.

This is usually another symptom of incorrect communications parameters with a serial printer. Double-check the bps rate in the br capability, and the parity setting in the ms# capability; make sure the printer is using the same settings as specified in the /etc/printcap file.

Nothing happened.

If nothing happened, the problem is probably within FreeBSD and not the hardware. Add the log file (lf) capability to the entry for the printer you are debugging in the /etc/printcap file. For example, here is the entry for rattan, with the lf capability:

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

Then, try printing again. Check the log file (in our example, /var/log/rattan.log) to see any error messages that might appear. Based on the messages you see, try to correct the problem.

If you do not specify a lf capability, LPD uses /dev/console as a default.


章 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用户应该做些什么呢? 这就是使用Linux二进制兼容性的原因。

简单来讲,这种兼容性允许FreeBSD用户能够不做任何修改就可以运行大约90%的Linux应用程序。 这些包括StarOffice, Linux版的NetscapeAdobe® Acrobat®RealPlayer® 5和7, VMwareOracleWordPerfect®Doom, Quake,和更多的其他程序。 据说在某些情况下,在FreeBSD上Linux程序的性能比它们在Linux上运行得还要好。

然而,一些具有Linux本身操作系统特性的程序就无法在FreeBSD上运行。 如果它们使用Linux的/proc文件系统(它与FreeBSD的/proc文件系统是不同的) 或如启用虚拟8086模式这样特定的 i386调用,那Linux的兼容模式就无法工作。

读完这章,你将了解到:

  • 如何在你的系统中启用Linux兼容模式。

  • 如何安装额外的Linux共享库。

  • 如何在FreeBSD上安装Linux应用程序。

  • 在FreeBSD上,Linux兼容模式的执行细节。

阅读这章之前,你应该知道:

  • 如何安装第三方软件(第 4 章)。


10.2. 安装

默认的Linux兼容模式没有被打开。启用这个功能的最容易的方法是调用linux KLD对象(“Kernel LoaDable object”)。你可以在命令行通过健入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
# 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 4.X by Murray Stokely. Merged with work by Bojan Bistrovic.

这节描述在FreeBSD系统上安装Linux版的Mathematica 4.X

Linux版Mathematica在FreeBSD下运行的很好,但是 由Wolfram打包的二进制程序需要标记才能让FreeBSD知道需要使用Linux ABI来执行它们。

Linux版的MathematicaMathematica for Students 可以从http://www.wolfram.com/直接定购。


10.3.1. 标记Linux程序

Linux程序可以在Wolfram发布的CDROM的Mathematica Unix目录中找到。 你必须将这个目录树拷贝到本地硬盘上,以便你能在运行安装程序之前用brandelf(1) 来标记Linux程序:

# mount /cdrom
# cp -rp /cdrom/Unix/ /localdir/
# brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/*
# brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/*
# brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/*
# brandelf -t Linux /localdir/Files/SystemFiles/Graphics/Binaries/Linux/*
# brandelf -t Linux /localdir/Files/SystemFiles/Converters/Binaries/Linux/*
# brandelf -t Linux /localdir/Files/SystemFiles/LicenseManager/Binaries/Linux/mathlm
# cd /localdir/Installers/Linux/
# ./MathInstaller

另外,你也可以简单地用下面的命令将默认的ELF标记成Linux:

# sysctl kern.fallback_elf_brand=3

这将让FreeBSD知道没有标记的ELF程序使用Linux ABI,所以你将可以直接从CDROM来运行安装程序。


10.3.2. 获得你的Mathematica 密码

在你运行Mathematica之前,你必须从Wolfram获得对应你的“机器ID”的密码。

一旦你安装了Linux运行时库,并把Mathematica解包开了, 你可以在安装目录通过运行mathinfo来获得你的“机器ID”。 这个机器ID是以你的第一块以太网卡的MAC地址为基础的。

# cd /localdir/Files/SystemFiles/Installation/Binaries/Linux
# mathinfo
disco.example.com 7115-70839-20412

当你用email,电话或者传真向Wolfram注册时,给他们你的“机器ID”,就会返回一个包含一组数字的密码。 当你第一次运行Mathematica时就需要得到的密码。


10.3.3. 通过网络来运行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

如果你正在使用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。如果运行这些ports有困难, 你可能不得不使用packages或老版本的ports collection。

如果你想运行智能代理,你还需要安Red Hat Tcl package: tcl-8.0.3-20.i386.rpm。安装这些包的命令是使用官方安装程序 RPM(ports里面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。有几种方法来装(FreeBSD 4.3通过FTP安装, FreeBSD 4.5直接从RELEASE CD安装)。 更多信息参考第 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需要的还多,所以尽量为共享内存选一个大值。

注: FreeBSD 4.5在i386上缺省应该设置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-specific安装的时候,因为某些原因 安装过程没有使用正确的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: <199906020108.SAA07001@usr09.primenet.com>)发表在邮件列表FreeBSD chat 邮件列表上的内容组成的。


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. 设置和调整

Written by Chern Lee. Based on a tutorial written by Mike Smith. Also based on tuning(7) written by 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. 基本分区

当使用 disklabel(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 中。

为了降低管理成本,有很多策略可以应用在成群的应用程序中来从系统指定的配置中分离site-wide配置。建议的方法是将site-wide配置放在另一个文件中,例如 /etc/rc.conf.site,并且把它包含进然后把这个文件包括进只包含系统指定信息的 /etc/rc.conf

由于 rc.conf 可以被 sh(1) 阅读,所以达到这个目的很简单,例如:

  • rc.conf:

       . 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. 启动服务

一个系统提供很多服务是很普通的。这些可以通过不同的方式启动,每种都有其各自的优势。

通过 port 或者 packages 安装的软件通常会放一个系统启动的时候调用 start 参数和系统关闭的时候调用 stop 参数的脚本在 /usr/local/etc/rc.d。这是我们建议的一种用或者期待用root身份启动系统服务的一种方法。这些脚本作为安装的 package 的一部分被注册,并且在删除 package 的时候被删除。

一个普通的启动脚本在 /usr/local/etc/rc.d,像这样:

#!/bin/sh
echo -n ' FooBar'

case "$1" in
start)
        /usr/local/bin/foobar
        ;;
stop)
        kill -9 `cat /var/run/foobar.pid`
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

exit 0
   

FreeBSD 的启动脚本在 /usr/local/etc/rc.d,它有以 .sh 结尾并且对 root 有执行权限。这些脚本在启动的时候用 start 选项被调用并且在系统关闭的时候调用 stop 来完成他们的任务。所以如果你想让上面的脚本示例在启动的时候运行,你应该在 /usr/local/etc/rc.d 中把他存成叫做 FooBar.sh 的名字并且确认他是可执行的。你可以像下面那样用 chmod(1) 让一个 shell 脚本成为可执行的脚本:

# chmod 755 FooBar.sh

当一个连接被一个适当的端口接收到的时候,一些服务会被 inetd(8) 调用。这对邮件处理服务来讲是很普通的(例如POP and IMAP 等等)。这些服务可以通过编辑 /etc/inetd.conf 来启用。可以在编辑的时候查看 inetd(8) 来了解这个文件的细节。

一些额外的系统服务也许不会隐藏在 /etc/rc.conf中。传统上他们使用在 /etc/rc.local 中的命令来调用。类似于在 FreeBSD 3.1 中没有默认的 /etc/rc.local;如果它被管理员创建,通常它也一样以一般的形式得到执行。注意 rc.local 通常被作为是最后一个访问的文件;如果启动服务有更好的地方,那就放在这里。

注: 不要将任何命令放在 /etc/rc.conf 中。要启动守护进程或者在启动的时候运行任何命令,应该在 /usr/local/etc/rc.d 中放一个脚本来代替它。

cron(8) 守护进程来启动系统服务也是可以的。这个方法有很多有利的方法,不仅是因为 cron(8)crontab 拥有者身份运行它们的,这些服务也可以用不是 root 身份的用户来启动和管理。

这利用了 cron(8) 的一个特性:时间规范可以用在系统启动后,cron(8) 启动时立刻就来运行程序的 @reboot 来替换。


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 中, 第六个字段是要执行的命令, 所有的命令都会以这个用户自己的身份执行; 这是一项重要的安全功能。

注: 用户 crontabs 允许每一个用户在不需要 root 特权的前提下调度自己的任务。 在用户的 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)
这一行定义了七个字段。它们是 minute, hourmdaymonthwdaywhocommand。它们差不多已经说明了各自的用处。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

In this example, crontab-file is the filename of a crontab that was previously created.

还有一个选项用来列出安装的 crontab 文件:只要传递 -l 选项给 crontab 然后看一下输出。

用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用 crontab -e 选项也是可以的。它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候,它会自动的用 crontab 来安装这个文件。

如果您稍后想要彻底删除自己的用户 crontab 可以使用 crontab-r 选项。


11.7. 在 FreeBSD 5.X 下使用 rc

Contributed by Tom Rhodes.

FreeBSD 最近整合了 NetBSD 的 rc.d 系统以完成系统初始化。用户要注意 /etc/rc.d 目录下的文件。这些文件中的很多都是可以接受 start, stoprestart 选项的基本服务。例如,sshd(8) 可以用下面的命令重启:

# /etc/rc.d/sshd restart

其它的服务跟这个过程相似。当然,在 rc.conf(5) 指定的服务通常可以自动启动。例如,让网络地址转换(NAT)守护进程在系统启动的时候启动可以简单的在 /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 中设置了,要 start, stop 或者 restart 一个服务,命令前可以加上一个 ``force'' 前缀。例如要不顾当前 /etc/rc.conf 的设置重新启动 sshd,执行下面的命令:

# /etc/rc.d/sshd forcerestart

用选项 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 信号。

rcNG 结构不仅仅是给网络服务提供的,它也给很多系统初始化提供服务。例如,处理 bgfsck 文件。当这个脚本执行的时候,它会输出下列信息:

Starting background file system checks in 60 seconds.

这个文件用做后台文件系统检查,系统初始化的时候完成。

很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于 RPC 的服务启动可能在 rpcbind 服务启动之前失败。要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。下面的字句可能会包含在每个启动脚本文件的前面:

  • PROVIDE: Specifies the services this file provides.

  • REQUIRE: Lists services which are required for this service. This file will run after the specified services.

  • BEFORE: Lists services which depend on this service. This file will run before the specified services.

  • KEYWORD: FreeBSD or NetBSD. This is used for *BSD dependent features.

通过这种方法,系统管理员可以容易的控制系统而不用像其他一些 UNIX 操作系统一样要用 ``runlevels'' 来控制。

FreeBSD5.X 的附加信息: rc.d 系统可以在 rc(8)rc.subr(8) 手册页中找到。


11.8. 设置网卡

Contributed by Marc Fonvieille.

现在我们不可想象一个计算机没有网络连接的情况。添加和配置一块网卡是任何 FreeBSD 系统管理员的一项基本任务。


11.8.1. 查找正确的驱动程序

在开始之前,你应该知道你的网卡类型,它用的芯片和它是 PCI 还是 ISA 网卡。FreeBSD 支持很多种 PCI 和 ISA 网卡。可以查看你的版本硬件兼容性列表以确定你的网卡被支持。

现在你已经确信你的网卡被支持了,你需要为这块网卡选择正确的驱动程序。/usr/src/sys/i386/conf/LINT 文件将会给你一些被支持的芯片/网卡驱动信息的列表。如果你对哪个是正确的驱动有疑问,阅读驱动的使用手册。手册会提供所支持硬件的更多信息和相关可能产生的问题。

如果你有一个普通的网卡,大多数时候你不需要为驱动浪费精力。常用的网卡在 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) 驱动的网卡在系统中。

为了使用网卡,需要装载正确的驱动程序。这可能通过两种途径来完成。最简单的方法是简单的用 kldload(8) 来装载一个驱动该网卡的内核模块。一个模块不是支持所有网卡驱动的(例如ISA 网卡用 ed(4) 来驱动)。另一种可选择的方法是你可以把支持你网卡的驱动静态的编译进内核。查看 /usr/src/sys/i386/conf/LINT 和手册中的驱动部分来了解把什么添加到你的内核配置文件中。可以查看 第 8 章 以获得更多的重新编译内核的信息。如果你的网卡在启动时被你的内核(GENERIC)检测到了,那么就没有必要建立一个新内核了。


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: The first Ethernet interface

  • dc1: The second Ethernet interface

  • lp0: The parallel port interface

  • lo0: The loopback device

  • tun0: The tunnel device used by 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. 调试

调试硬件和软件配置一直是一件头痛的事情,从最简单的开始可以减轻一些痛苦。例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗?是否使用了被 & os; 支持的网卡?在发送错误报告之前你应该查看一下硬件说明,升级 FreeBSD 到最新的 STABLE 版本,看一下邮件列表或者在 Internet 上搜索一下。

如果网卡工作了,但是性能底下,应该好好阅读一下 tuning(7) 帮助页。你也可以检查一下网络配置,一些不正确的设置会导致慢速的网络连接。

一些用户可能会在一些网卡上经历一到两次`` 设备超时(device timeouts)'',如果经常这样甚至引起麻烦,你要确定一下它跟其他设备没有冲突。仔细检查网线连接。可能这需要换一块网卡。

有时用户会看到少数的 ``监测者超时(watchdog timeout)'' 错误。这种情况要做的第一件事就是检查线缆连接。一些网卡需要支持总线控制的 PCI 插槽。在一些老的主板上,只有一个 PCI 插槽支持。(一般是 slot 0)。检查网卡和主板说明书来确定是不是这个问题。

``没有到主机的路由(No route to host)'' 的信息发生在如果系统不能发送一个路由到目的主机的包的时候。这在没有指定默认路由或者网线没有插上时会发生。检查 netstat -rn 的输出并确认有一个有效的路由能到达你要的主机。如果没有,请查阅 第 24 章

``ping: 发送到: 访问被拒绝(ping: sendto: Permission denied)'' 错误信息经常因为一个配置错误的防火墙引起。如果 ipfw 在内核中启用了但是没有定义规则,那么默认的规则就是拒绝所有通讯,甚至 ping 请求!查阅 第 14.8 节 以了解更多信息。

有时网卡性能底下或者低于平均水平,这种情况最好把传输媒介模式从 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 连接到两个网段,子网掩码是 255.255.255.010.1.1.0 和子网掩码是 255.255.255.240202.0.75.16。我们将要系统使用从 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

下面的记录会正确的设置这个适配器:

 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.conf 看起来很像 rc.conf。它用 variable=value 的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。

一个简单的例子举明了在 sysctl.conf 中关闭了重要的退出信号的日志并且让 Linux 程序知道他们其实运行在 FreeBSD 下面:

kern.logsigexit=0       # Do not log fatal signal exits (e.g. sig 11)
compat.linux.osname=FreeBSD
compat.linux.osrelease=4.3-STABLE

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')。

If you want to set automatically some variables each time the machine boots, add them to the /etc/sysctl.conf file. For more information see the sysctl.conf(5) manual page and the 第 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 性能的时候可以防止垃圾缓存把缓存占满(The idea is to avoid saturating the buffer cache with dirty buffers when it would not benefit I/O performance.)。然而它可能降低处理速度并且在某些情况下你可能想要关闭它。


11.12.1.3. vfs.hirunningspace

vfs.hirunningspace sysctl 变量决定了在任何场合多少写 I/O 被排进队列以给系统的磁盘控制器。默认值一般是足够的,但是对有很多磁盘的机器来说你可能需要把它设置成4M或5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。

sysctl 中还有许多与 buffer cache 和 VM页面 cache 有关的值, 一般不推荐修改它们。 从 FreeBSD 4.3 开始,虚拟内存系统已经能够很好地进行自动调整了。


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 的默认值改变成安全的模式。不幸的是结果是带来了很大的性能损失,所以我们在发行版之后把写缓存的默认值改成了 on。你应该注意 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 的最佳时机是在单用户模式下任何分区被被挂载前。

注: 像 FreeBSD 4.5,在文件系统创建时也可以打开 Soft Updates,通过 newfs(8)-U 选项。

Soft Updates 彻底的改善了数据描述(meta-data)的性能,主要是文件创建和删除,通过内存缓存。我们建议你在所有的文件系统上使用 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 可以根据系统的需求加大或者减小。这个变量指出了在系统上文件描述符的最大数量。当文件描述符表曼的时候,用 dmesg 命令可以看到 ``file: table is full'' 将会在系统信息缓存里反复的出现。

每个打开的文件、套接字、fifo 都使用一个描述符。一个大规模的服务器很容易使用上千个文件描述符,这取决于系统中同时运行着的服务的数量和类型。

kern.maxfile 的默认值以系统配置文件中的 MAXUSERS 选项来决定。kern.maxfilesMAXUSERS 的值成比例的增长。编译一个自定义内核的时候,按照你系统中用户的数量来设置这个值是个好主意。从这个数字可以确定内核很多先前定义的限制。即使一台机器不会真有256个用户同时连接,所需要的资源也可能跟一个高负荷的web服务器差不多。

注: 像是 FreeBSD 4.5,在你的内核配置中设置 MAXUSERS 为会通过系统中内存的数量来选择一个合适的值。


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.*

The net.inet.ip.portrange.* sysctl 变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。这里有三个范围:一个低端范围,一个默认范围和一个高端范围。大多数网络程序分别使用由 net.inet.ip.portrange.firstnet.inet.ip.portrange.last 控制的从1024到5000的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口,这经常发生在运行一个高负荷web代理服务器的时候。这个端口范围不是用来限制主要的例如web服务器进入连接或者有固定端口例如邮件传递对外连接的。有时你可能用完了端口,那就建议适当的增加 net.inet.ip.portrange.last10000, 20000 或者 30000 可能是适当的值。更改端口范围的时候也要考虑到防火墙。一些防火墙会阻止端口的大部分范围(通常是低范围的端口)并且用高端口进行对外连接(--)。基于这个问题建议把 net.inet.ip.portrange.first 设置的小一点。


11.13.2.2. TCP 带宽迟延(Bandwidth Delay Product)

The TCP Bandwidth Delay Product Limiting 类似于 NetBSD 的TCP/Vegas。它可以通过设置 net.inet.tcp.inflight_enable sysctl 变量为 1 来启动。系统将会为每个连接尝试带宽迟延并且限制发送到网络中的队列中的数据数量以维持适当的吞吐量。 similar to TCP/Vegas in NetBSD. It can be enabled by setting net.inet.tcp.inflight_enable sysctl variable to 1. The system will attempt to calculate the bandwidth delay product for each connection and limit the amount of data queued to the network to just the amount required to maintain optimum throughput.

如果你在使用调制解调器,千兆以太网或者高速的广域网连接(或者其他有高的带宽迟延的产品)提供数据服务,这个特性就会很有用。特别是你在使用窗口缩放或者配置一个大的发送窗口。如果启用了这个选项,童谣要确信设置 net.inet.tcp.inflight_debug0(关闭调试),对于生产用来说,设置 net.inet.tcp.inflight_min 至少为 6144 可能会受益。然而,注意设置一个高的最小值能有效的关闭依赖连接的带宽限制。这个限制特性减少了在路由和交换包队列的堵塞数据数量,也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。但是,注意这只影响到数据发送(上载/服务端)。对数据接收(下载)没有效果。

调整 net.inet.tcp.inflight_stab被建议的。这个参数的默认值是20,它代表两个最大的包被添加到带宽迟延窗口考虑。另外的窗口是稳定算法和改善改变条件时的应答所需要的,但是它也能导致通过慢速连接产生高的ping时间(虽然比你不用这个算法还慢)。这些情况下,你可能想试着把这个参数减小到15,10或者5;并且也可能需要减小 net.inet.tcp.inflight_min(例如3500)来达到效果。减少这些参数应该是最后的唯一手段。


11.14. 添加交换空间

不管你计划的如何好,有时候系统并不像你所期待的那样运行。如果你发现需要更多的交换空间,添加它很简单。有三种方法增加交换空间:添加一块新的硬盘驱动器、通过NFS使用交换空间和在一个现有的分区上创建一个交换文件。


11.14.1. 在新的硬盘驱动器上使用交换空间

这是添加交换空间最好的方法,当然为了达到这个目的需要添加一块硬盘。毕竟你总是可以使用另一块磁盘。如果能这么做,重新阅读一下手册中关于交换空间的 第 11.2 节 来了解如何最优地安排交换空间。


11.14.2. 通过 NFS 交换

通过 NFS 来交换只在你没有本地硬盘交换的时候被建议。在 FreeBSD 4.X 以前的版本中使用NFS交换速度很慢并且效率低下。4.0-RELEASE和更新的版本中他的速度和效率还是可以接受的。即使使用新版本的 FreeBSD,NFS 交换也会被可用的网络带宽限制并且增加 NFS 服务器的负担。


11.14.3. 交换文件

你可以创建一个指定大小的文件用来当作交换文件。在我们的例子中我们将会使用叫做 /usr/swap0 的 64MB 大小的文件。当然你也可以使用任何你所希望的名字。

例子 11-1. 在 FreeBSD 4.X 上创建一个交换文件

  1. 确认你的内核配置包含了 vnode 驱动。它不包含在最近版本的 GENERIC

    pseudo-device   vn 1   #Vnode driver (turns a file into a device)
    
  2. 创建一个 vn-device 设备:

    # cd /dev
    # sh MAKEDEV vn0
    
  3. 创建一个交换文件 (/usr/swap0):

    # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
    
  4. 赋予它(/usr/swap0)一个适当的权限:

    # chmod 0600 /usr/swap0
    
  5. /etc/rc.conf 中启用交换文件:

    swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
    
  6. 通过重新启动机器或下面的命令使交换文件立刻生效:

    # vnconfig -e /dev/vn0b /usr/swap0 swap
    

例子 11-2. 在 FreeBSD 5.X 上创建一个交换文件:

  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.

以有效的方式利用硬件资源是非常重要的。在提出 ACPI 之前,管理电源使用和系统散热对操作系统是很困难的。硬件被嵌入的 BIOS 接口管理,例如可插拔 BIOS (PNPBIOS)或者高级电源管理(APM)等等。电源和资源管理是现代操作系统的关键组成部分。例如你可能当系统温度过高的时候让你的操作系统能监视到(并且可能提醒你)。

在 FreeBSD 使用手册的这一章节,我们将提供 ACPI 全面的信息。参考资料会在末尾。ACPI 在FreeBSD 5.X及以上的操作系统中作为一个默认的内核模块被支持。对于 FreeBSD 4.9,ACPI 可以通过在内核配置文件中添加 device acpica 并且重新编译内核来启用。


11.15.1. 什么是 ACPI?

高级配置和电源接口(ACPI)是一个业界标准的硬件资源和电源管理接口(因此而得名)。它是 操作系统控制的配置和电源管理(Operating System-directed configuration and Power Management),也就是说,它给操作系统(OS)提供了更多的控制和弹性。现代操作系统``延伸''了当前即插即用接口(像是 FreeBSD4.X 中使用的 APM)的限制,在 ACPI 的介绍之前。ACPIAPM(高级电源管理)的直接继承者。


11.15.2. 高级电源管理(APM)的缺点

高级电源管理(APM) 基于它的行动简单的控制系统的电源使用。 APM BIOS 被(系统)厂商支持并且区分于硬件平台。操作系统的APM驱动有权使用一个允许电源级别管理的 APM 软件接口

APM 中有四个主要问题。首先,电源管理通过(不同的厂家)BIOS 来完成,并且操作系统没有任何关于它的知识。一个例子是,用户在 APM BIOS 中为硬盘设置空闲时间(idle-time)的值,BIOS 不经过操作系统同意将会让硬盘驱动器停止转动。第二,APM 的逻辑是嵌入在 BIOS 中的,它在操作系统之外工作。这意味着用户只能通过刷新新的 ROM 来修复问题;它是很危险的,并且如果失败了,它会让系统处于一个不可修复的状态。第三,APM 是一个区别于不同厂家的技术,这意味着有很多或者类似的错误在一个型号的BIOS中被发现,而在另外的地方却没有解决。最后但不是只剩下的就是 APM BIOS 没有足够的地方执行复杂的电源策略,或者它很好的适应了机器的用途(or one that can adapt very well to the purpose of the machine)。

即插即用 BIOS(PNPBIOS)在很多情况下不可靠。PNPBIOS 是 16位的技术,所以操作系统为了用PNPBIOS的``接口''方法不得不用16位模拟器。

FreeBSD APM 驱动在 apm(4) 手册页中有描述。


11.15.3. 配置 ACPI

acpi.ko 驱动默认的在启动时通过 loader(8) 被加载并且不应该被编译进内核。原因是这个模块跟系统很容易的工作在一起,比方说不用为了 acpi.ko 而重新编译内核。这对更简单的测试来说很有利。另一个原因是系统启动后再启动 ACPI 不是很有用,并且在一些情况下会失败。拿不准的话只要全部禁止 ACPI 即可。这个驱动不应该而且不能被卸载,因为系统通过它跟各种各样的硬件打交道。ACPI 可以通过 acpiconf(8) 来禁止。实际上通过 ACPI 的交互可以通过 acpiconf(8) 来完成。简单的说,如果任何关于 ACPI 的信息在 dmesg(8) 的输出中,那么它很可能已经运行了。

注: ACPIAPM 不能共存并且应该份开始用。后来装载的如果注意到另一个在运行将会终止执行。

最简单的表现形式是,ACPI 可以通过 acpiconf(8)-s 标志和一个 1-5 的选项来使系统进入休眠状态。5 选项将会像下面动作一样让系统软关机:

# halt -p

其他选项也是可行的。查看 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 版本, 此外, 也包括嵌入式控制器的固件版本。

如果您希望提交一个问题, 请确保将下述信息法到 freebsd-acpi@FreeBSD.org

  • 问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。 另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。

  • 在 ``boot -v''之后得到的 dmesg 输出, 包括任何在重现 bug 之后出现的错误信息。

  • 在禁用了 ACPI 之后的 ``boot -v'' 的 dmesg 输出, 如果您发现禁用 ACPI 能够帮助消除问题。

  • 来自 ``sysctl hw.acpi'' 的输出。 这也是找到您的系统所提供的功能的一种好办法。

  • 能够得到您的 ACPI Source Language (ASL) 的 URL不要ASL 直接发到邮件列表中, 因为它们可能非常大。 为了得到 ASL 您可以运行这个命令:

    # acpidump -t -d > name-system.asl
    

    (把 name 改为您的登录名, 并把 system 改为您的硬件制造商及其型号。 例如: njl-FooCo6000.asl)

许多开发者也会订阅 FreeBSD-CURRENT 邮件列表 但还是请发到 freebsd-acpi 这样它会被更多人看到。 请耐心等待, 因为我们都有全职的其他工作。 如果您的 bug 不是显而易见的, 我们可能会要求您通过 send-pr(1) 来提交一个 PR。 在输入 PR 时,请将同样的信息包含进去。 这将帮助我们来追踪和解决问题。 不要在给 freebsd-acpi 写信之前发送 PR 因为我们把它当作已知文体的备忘录而不是报告机制。 您的问题很可能已经被其他人报告过了。


11.16.2. Background

ACPI is present in all modern computers that conform to the ia32 (x86), ia64 (Itanium), and amd64 (AMD) architectures. The full standard has many features including CPU performance management, power planes control, thermal zones, various battery systems, embedded controllers, and bus enumeration. Most systems implement less than the full standard. For instance, a desktop system usually only implements the bus enumeration parts while a laptop might have cooling and battery management support as well. Laptops also have suspend and resume, with their own associated complexity.

An ACPI-compliant system has various components. The BIOS and chipset vendors provide various fixed tables (e.g., FADT) in memory that specify things like the APIC map (used for SMP), config registers, and simple configuration values. Additionally, a table of bytecode (the Differentiated System Description Table DSDT) is provided that specifies a tree-like name space of devices and methods.

The ACPI driver must parse the fixed tables, implement an interpreter for the bytecode, and modify device drivers and the kernel to accept information from the ACPI subsystem. For FreeBSD, Intel has provided an interpreter (ACPI-CA) that is shared with Linux and NetBSD. The path to the ACPI-CA source code is src/sys/contrib/dev/acpica. The glue code that allows ACPI-CA to work on FreeBSD is in src/sys/dev/acpica/Osd. Finally, drivers that implement various ACPI devices are found in src/sys/dev/acpica.


11.16.3. Common Problems

For ACPI to work correctly, all the parts have to work correctly. Here are some common problems, in order of frequency of appearance, and some possible workarounds or fixes.


11.16.3.1. Suspend/Resume

ACPI has three suspend to RAM (STR) states, S1-S3, and one suspend to disk state (STD), called S4. S5 is ``soft off'' and is the normal state your system is in when plugged in but not powered up. S4 can actually be implemented two separate ways. S4BIOS is a BIOS-assisted suspend to disk. S4OS is implemented entirely by the operating system.

Start by checking sysctl hw.acpi for the suspend-related items. Here are the results for my Thinkpad:

hw.acpi.supported_sleep_state: S3 S4 S5
hw.acpi.s4bios: 0

This means that I can use acpiconf -s to test S3, S4OS, and S5. If s4bios was one (1), I would have S4BIOS support instead of S4 OS.

When testing suspend/resume, start with S1, if supported. This state is most likely to work since it doesn't require much driver support. No one has implemented S2 but if you have it, it's similar to S1. The next thing to try is S3. This is the deepest STR state and requires a lot of driver support to properly reinitialize your hardware. If you have problems resuming, feel free to email the freebsd-acpi list but do not expect the problem to be resolved since there are a lot of drivers/hardware that need more testing and work.

To help isolate the problem, remove as many drivers from your kernel as possible. If it works, you can narrow down which driver is the problem by loading drivers until it fails again. Typically binary drivers like nvidia.ko, X11 display drivers, and USB will have the most problems while Ethernet interfaces usually work fine. If you can load/unload the drivers ok, you can automate this by putting the appropriate commands in /etc/rc.suspend and /etc/rc.resume. There is a commented-out example for unloading and loading a driver. Try setting hw.acpi.reset_video to zero (0) if your display is messed up after resume. Try setting longer or shorter values for hw.acpi.sleep_delay to see if that helps.

Another thing to try is load a recent Linux distribution with ACPI support and test their suspend/resume support on the same hardware. If it works on Linux, it's likely a FreeBSD driver problem and narrowing down which driver causes the problems will help us fix the problem. Note that the ACPI maintainers do not usually maintain other drivers (e.g sound, ATA, etc.) so any work done on tracking down a driver problem should probably eventually be posted to the freebsd-current list and mailed to the driver maintainer. If you are feeling adventurous, go ahead and start putting some debugging printf(3)s in a problematic driver to track down where in its resume function it hangs.

Finally, try disabling ACPI and enabling APM instead. If suspend/resume works with APM, you may be better off sticking with APM, especially on older hardware (pre-2000). It took vendors a while to get ACPI support correct and older hardware is more likely to have BIOS problems with ACPI.


11.16.3.2. System Hangs (temporary or permanent)

Most system hangs are a result of lost interrupts or an interrupt storm. Chipsets have a lot of problems based on how the BIOS configures interrupts before boot, correctness of the APIC (MADT) table, and routing of the System Control Interrupt (SCI).

Interrupt storms can be distinguished from lost interrupts by checking the output of vmstat -i and looking at the line that has acpi0. If the counter is increasing at more than a couple per second, you have an interrupt storm. If the system appears hung, try breaking to DDB (CTRL+ALT+ESC on console) and type show interrupts.

Your best hope when dealing with interrupt problems is to try disabling APIC support with hint.apic.0.disabled="1" in loader.conf.


11.16.3.3. Panics

Panics are relatively rare for ACPI and are the top priority to be fixed. The first step is to isolate the steps to reproduce the panic (if possible) and get a backtrace. Follow the advice for enabling options DDB and setting up a serial console (see 第 20.6.5.3 节) or setting up a dump(8) partition. You can get a backtrace in DDB with tr. If you have to handwrite the backtrace, be sure to at least get the lowest five (5) and top five (5) lines in the trace.

Then, try to isolate the problem by booting with ACPI disabled. If that works, you can isolate the ACPI subsystem by using various values of debug.acpi.disable. See the acpi(4) manual page for some examples.


11.16.3.4. System Powers Up After Suspend or Shutdown

First, try setting hw.acpi.disable_on_poweroff=``0'' in loader.conf(5). This keeps ACPI from disabling various events during the shutdown process. Some systems need this value set to ``1'' (the default) for the same reason. This usually fixes the problem of a system powering up spontaneously after a suspend or poweroff.


11.16.3.5. Other Problems

If you have other problems with ACPI (working with a docking station, devices not detected, etc.), please email a description to the mailing list as well; however, some of these issues may be related to unfinished parts of the ACPI subsystem so they might take a while to be implemented. Please be patient and prepared to test patches we may send you.


11.16.4. ASL, acpidump, and IASL

The most common problem is the BIOS vendors providing incorrect (or outright buggy!) bytecode. This is usually manifested by kernel console messages like this:

ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
(Node 0xc3f6d160), AE_NOT_FOUND

Often, you can resolve these problems by updating your BIOS to the latest revision. Most console messages are harmless but if you have other problems like battery status not working, they're a good place to start looking for problems in the AML. The bytecode, known as AML, is compiled from a source language called ASL. The AML is found in the table known as the DSDT. To get a copy of your ASL, use acpidump(8). You should use both the -t (show contents of the fixed tables) and -d (disassemble AML to ASL) options. See the Submitting Debugging Information section for an example syntax.

The simplest first check you can do is to recompile your ASL to check for errors. Warnings can usually be ignored but errors are bugs that will usually prevent ACPI from working correctly. To recompile your ASL, issue the following command:

# iasl your.asl

11.16.5. Fixing Your ASL

In the long run, our goal is for almost everyone to have ACPI work without any user intervention. At this point, however, we are still developing workarounds for common mistakes made by the BIOS vendors. The Microsoft interpreter (acpi.sys and acpiec.sys) does not strictly check for adherence to the standard, and thus many BIOS vendors who only test ACPI under Windows never fix their ASL. We hope to continue to identify and document exactly what non-standard behavior is allowed by Microsoft's interpreter and replicate it so FreeBSD can work without forcing users to fix the ASL. As a workaround and to help us identify behavior, you can fix the ASL manually. If this works for you, please send a diff(1) of the old and new ASL so we can possibly work around the buggy behavior in ACPI-CA and thus make your fix unnecessary.

Here is a list of common error messages, their cause, and how to fix them:


11.16.5.1. _OS dependencies

Some AML assumes the world consists of various Windows versions. You can tell FreeBSD to claim it is any OS to see if this fixes problems you may have. An easy way to override this is to set hw.acpi.osname=``Windows 2001'' in /boot/loader.conf or other similar strings you find in the ASL.


11.16.5.2. Missing Return statements

Some methods do not explicitly return a value as the standard requires. While ACPI-CA does not handle this, FreeBSD has a workaround that allows it to return the value implicitly. You can also add explicit Return statements where required if you know what value should be returned. To force iasl to compile the ASL, use the -f flag.


11.16.5.3. Overriding the Default AML

After you customize your.asl, you will want to compile it, run:

# iasl your.asl

You can add the -f flag to force creation of the AML, even if there are errors during compilation. Remember that some errors (e.g., missing Return statements) are automatically worked around by the interpreter.

DSDT.aml is the default output filename for iasl. You can load this instead of your BIOS's buggy copy (which is still present in flash memory) by editing /boot/loader.conf as follows:

acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/DSDT.aml"

Be sure to copy your DSDT.aml to the /boot directory.


11.16.6. Getting Debugging Output From ACPI

The ACPI driver has a very flexible debugging facility. It allows you to specify a set of subsystems as well as the level of verbosity. The subsystems you wish to debug are specified as ``layers'' and are broken down into ACPI-CA components (ACPI_ALL_COMPONENTS) and ACPI hardware support (ACPI_ALL_DRIVERS). The verbosity of debugging output is specified as the ``level'' and ranges from ACPI_LV_ERROR (just report errors) to ACPI_LV_VERBOSE (everything). The ``level'' is a bitmask so multiple options can be set at once, separated by spaces. In practice, you will want to use a serial console to log the output if it is so long it flushes the console message buffer. A full list of the individual layers and levels is found in the acpi(4) manual page.

Debugging output is not enabled by default. To enable it, add options ACPI_DEBUG to your kernel config if ACPI is compiled into the kernel. You can add ACPI_DEBUG=1 to your /etc/make.conf to enable it globally. If it is a module, you can recompile just your acpi.ko module as follows:

# cd /sys/modules/acpi/acpi
&& make clean &&
make ACPI_DEBUG=1

Install acpi.ko in /boot/kernel and add your desired level and layer to loader.conf. This example enables debug messages for all ACPI-CA components and all ACPI hardware drivers (CPU, LID, etc.) It will only output error messages, the least verbose level.

debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
debug.acpi.level="ACPI_LV_ERROR"

If the information you want is triggered by a specific event (say, a suspend and then resume), you can leave out changes to loader.conf and instead use sysctl to specify the layer and level after booting and preparing your system for the specific event. The sysctls are named the same as the tunables in loader.conf.


11.16.7. References

More information about ACPI may be found in the following locations:


章 12. FreeBSD引导过程

12.1. 概述

启动电脑以及加载操作系统的过程被称为 ``引导过程'', 或者简称为 ``引导''. FreeBSD的引导过程给用户自定义启动提供了很大的伸缩性 ,你可以选择启动不同的操作系统,或者是同一系统的不同版本 及内核.

本章将详细介绍你能在FreeBSD引导过程中设置的配置选项。 这包括了引导内核、探测设备并启动 init(8) 等等之前所发生的所有事情。 这些事项一般发生在文本由白变灰时。

读完这章你将会知道:

  • FreeBSD引导系统里的各项组件, 以及它们之间的交互方式.

  • 在FreeBSD引导时给各组件配置选项以控制引导过程 .

  • device.hints(5)的基本知识.

只适用于x86: 本章只描述了运行于Intel x86 体系之上的FreeBSD的引导过程.


12.2. 引导问题

启动电脑及启动和引导操作系统构成了一个有趣的两难境地. 按照定义 , 在操作系统被启动之前计算机是无法完成任何任务的,包括运行磁盘上的程序. 如果计算机在没有操作系统的情况下 不能运行来自于磁盘上的程序而操作系统又是放在磁盘上的,那操作系统是如何启动的呢?

This problem parallels one in the book The Adventures of Baron Munchausen. A character had fallen part way down a manhole, and pulled himself out by grabbing his bootstraps, and lifting. 在以前,计算机术语bootstrap 指加载操作系统的机制,简称 ``booting''.

在x86硬件体系中,基本输入/输出系统 (BIOS) 负责加载操作系统 .为了做到这一点, BIOS 在磁盘上寻找主引导记录(MBR),而MBR必须在放置的磁盘 的特定位置. BIOS有足够的能力来读入和运行MBR, 且假使地认为MBR能完成加载操作系统的剩余任务.

如果你只安装了一个操作系统,那么一个标准的MBR就足够了 . 这个MBR先在磁盘上搜索可引导的分区 , 然后运行分区上的代码以加载操作系统的其它部分 .

如果你在磁盘上安装了多个操作系统那么你可以安装一个不同的MBR ,它能显示一张操作 系统的列表,你能从中选择启动哪个. FreeBSD 自带了一个这样的MBR, 其它的操作系统厂商亦 提供可选的MBR.

启动系统的剩余部分被分为三个阶段. 第一阶段由MBR执行,它只是使计算机进入 特定的状态然后执行第二阶段. 第二阶段稍微干得多一些. 第三阶段完成加载操作系统的任务. 工作被分为三个阶段是因为PC标准对第一第二阶段执行的程序的 大小有所限制. 把这些任务连在一起使得 FreeBSD可以提供更大伸缩性的加载器(loader) .

然后内核启动,它开始探测设备并初始化它们 . 一旦内核引导进程完成任务, 内核将控制权交给用户进程init(8), 它确认磁盘是否处于可用状态.init(8)然后开始用户级资源配置:加载文件系统启动网卡, 及粗略地启动所有FreeBSD系统加载时经常运行的进程.


12.3. MBR, 和引导阶段一,二,三

12.3.1. MBR, /boot/boot0

FreeBSD MBR放置在/boot/boot0. 这是真实MBR的一份复制品 , 真正的MBR必须放在磁盘FreeBSD区域以外的特定部分.

boot0 是非常简单的, 因为在 MBR 里的代码只有512 字节. 如果你安装了FreeBSD MBR 且装了多个操作系统,在引导时你会看到如下的内容:

例子 12-1. boot0 Screenshot

F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1

Default: F2

其它操作系统, 特别是 Windows 95, 以用自己的MBR覆盖现有MBR而著称。 如果发生了这种事情,或者你想用FreeBSD的MBR覆盖现有的MBR ,你可以使用以下的命令:

# fdisk -B -b /boot/boot0 device

device是要写入MBR的设备名,比如ad0 代表第一个IDE磁盘, ad2代表第二个IDE控制器上的第一个IDE磁盘, da0代表第一个SCSI 磁盘,等等.

如果你是linux用户,你可能更喜欢使用 LILO来控制引导过程, 你可以编辑 /etc/lilo.conf文件, 或者在安装FreeBSD过程中选择 Leave The Master Boot Record Untouched . 如果你安装了FreeBSD引导管理器, 你可以启动linux然后更改 LILO 的配置文件 /etc/lilo.conf,加入以下的选项:

other=/dev/hdXY
table=/dev/hdb
loader=/boot/chain.b
label=FreeBSD

这样就可以通过 LILO来引导FreeBSD和linux. 在我们的例子中, 我们使 XY 确定驱动器号和分区 . 如果你使用的是 SCSI 驱动器, 你需要将 /dev/hdXY改成/dev/sdXY, 这里再次使用了XY 的语法. 如果你安装的两个系统在同一驱动器上,loader=/boot/chain.b选项可以 去掉.现在你可以执行/sbin/lilo -v使修改生效.


12.3.2. 第一阶段, /boot/boot1, 和第二阶段, /boot/boot2

概念上,第一,第二阶段同属于一个程序, 处于磁盘的相同区域. 但由于空间限制, 它们被分为两部分.可是你总是会一起安装它们.

它们放置在引导分区的引导扇区里.在引导扇区里能找到 boot0, MBR 以及其它用于引导系统的程序. /boot目录下的文件是真实文件的拷贝,真实文件放置在FreeBSD 文件系统之外.

boot1 非常简单,因为它再多也只能有512字节 ,只能识别储存着分区信息的disklabel, 及寻找执行 boot2.

boot2 稍微有点加强, 能够理解FreeBSD的文件系统以便于 寻找里面的文件,能提供选择内核和加载器的简单界面.

因为 loader 有着更强的功能 , 提供了一套易于使用的引导配置,boot2一般都执行loader , 但以前它的任务是直接运行内核.

例子 12-2. boot2的屏幕输出

>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/kernel
boot:

如果你要更改已安装的 boot1boot2 请使用命令disklabel(8).

# disklabel -B diskslice

diskslice 是用于引导的磁盘和分区, 比如 ad0s1 代表第一个IDE磁盘上的第一个分区.

dangerously dedicated如果你在disklabel(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 (当你升级或配置了你自己的内核,etc.).

    注: 使用以下命令加载常用的模块和另一个内核:

    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), and 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变量等多种方式来达到 .

也可以在多用户模式下调动无reboot(-r)选项和 halt (-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) 命令来关闭系统, 请参看它们的手册页以获得更多的信息.

注: 电源管理需要支持,在reeBSD 5.X中要求内核支持acpi(4)或以模块加载,在FreeBSD 4.X中 需要apm(4)的支持.


章 13. 用户和基本的帐户管理

Contributed by Neil Blakey-Milner.

13.1. 概述

FreeBSD允许多个用户同时使用计算机. 当然,这些用户中不是很多人同时坐在同一台计算机前. [8],而是其他用户可以通过网络来使用同一台计算机以完成他们的工作.要使用系统,每个人都应该有一个帐户.

读完这章,你将了解到:

  • 在一个FreeBSD系统上不同用户帐户之间的区别.

  • 如何添加用户帐户.

  • 如何删除用户帐户.

  • 如何改变帐户细节,如用户的全名,或首选的shell.

  • 如何在每个帐户基础上设置限制,来控制像内存,CPU时钟这样的资源.

  • 如何使用组来使帐户管理更容易.

在阅读这章之前,你应当了解:

  • 了解UNIX和FreeBSD的基础知识 (第 3 章).


13.2. 介绍

所有访问系统的用户都是通过帐户完成的,所以用户和帐户管理是FreeBSD系统不可或缺的重要部分.

每个FreeBSD系统的帐户都有一些和它相对应的信息去验证它.

用户名

用户名在login: 提示符的后面键入. 用户名对于一台计算机来讲是唯一的; 你不可以使用两个相同的用户名来登陆. 有很多用来创建正确用户名的规则, 可以看看passwd的联机手册 passwd(5); 你使用的用户名通常需要8个或更少的小写字母.

口令

每个帐户都有一个口令与它对应. 口令可以是空的, 这样不需要口令就可以访问系统. 这通常不是一个好主意; 每个帐户都应该有一个口令.

用户 ID (UID)

UID是系统用来识别用户的数字,传统上它的范围是0到65536之间[9],用以唯一地标识用户。FreeBSD在内部使用UID来识别用户--在工作以前.任何允许你指定一个用户名的FreeBSD命令都会把它转换成UID. 这意味着你可以用不同的用户名使用多个帐户,但它们的UID是一样的. FreeBSD会把这些帐户认定是同一个用户.

组ID (GID)

GID是用来识别用户所在的组的, 传统上范围在0到65536之间[9]的数字. 组是一种基于用户GID而不是它们的UID的用来控制用户访问资源的机制. 这可以减少一些配置文件的大小. 一个用户也可以属于多个组.

登陆类

登陆类是对组机制的扩展,当把系统分配给不同用户时,它提供了额外的灵活性.

口令的定期更改

缺省情况下,FreeBSD不会强迫用户去改变他们的口令. 你可以在每个用户的基础上强迫执行,当一个帐户过期了,可以强迫一些或所有的用户改变他们的口令.

帐户的到期时间

缺省情况下FreeBSD不会终止帐户. 如果你正在创建帐户,你应该知道一个帐户的有效使用期限, 例如, 在学校里你会为每个学生建立一个帐户,当帐户到期了,你可以重新指定它. 帐户到期后,虽然帐户的目录和文件仍然存在,但是帐户已经不能够继续使用了.

用户的全名

用户名可以唯一地识别FreeBSD的帐户, 但它不会反映用户的全名. 这些信息可能与帐户是相关的.

主目录

主目录是用户用来启动的目录的完全路径. 一个通常的规则是把所有用户的主目录都放在/home/username下,或者/usr/home/username下. 用户将会把他们的个人文件放在他们自己的主目录下, 他们可以在那里创建任何目录.

用户 shell

Shell提供了用户用来操作系统的默认环境. 有很多不同的shell, 有经验的用户会根据他们的经验来选择自己喜好的shell.

有三种类型的帐户: 超级用户, 系统用户, and 普通用户. 超级用户帐户通常叫做root, 可以没有限制的管理系统. 系统用户运行服务. 最后, 普通用户给那些登陆系统,阅读邮件的人使用.


13.3. 超级用户帐户

超级用户帐户,通常叫做root,可以重新配置和管理系统, 在收发邮件,系统检查或编程这样的日常工作中, 尽量不要使用root权限.

这是因为不象普通用户帐户, 超级用户能够无限制地操作系统, 超级用户帐户的滥用可能会引起无法想象的灾难. 普通的用户帐户不会由于出错而破坏系统, 所以要尽可能的使用普通帐户, 除非你需要额外的特权.

在使用超级用户命令时要再三检查, 因为一个额外的空格或缺少某个字符的命令都可能会引起数据丢失.

所以, 在阅读完这章后你第一件要做的事就是,在平时使用的时候,创建一个没有特权的用户帐户. 无论你使用的是单用户还是多用户系统这样的申请都是相同的. 在这章的后面,我们将讨论如何创建一个额外的帐户和如何在普通用户和超级用户之间进行切换.


13.4. 系统帐户

系统用户是那些要使用诸如DNS,mail, web等服务的用户. 使用帐户的原因就是安全; 如果所有的用户都由超级用户来运行,那它们就可以不受约束的做任何事情.

系统帐户可以是daemon, operator, bind (域名服务), 和news. 系统管理员经常创建httpd来运行web服务器.

nobody 是普通的没有特权的系统用户. 然而,大多数与用户联系很密切的服务是使用nobody的,记的这点非常重要,这样可能使用户变的非常有特权.


13.5. 用户帐户

用户帐户是让真实的用户访问系统的主要方式, 这些帐户把用户和环境隔离, 能阻止用户损坏系统和其他用户, 在不影响其他用户的情况之下定制自己的环境.

任何人访问你的系统必须要有他们自己唯一的帐户. 这可以让你找到谁做了什么事, 并且阻止人们破坏其他用户的设置和阅读其他人的邮件等等.

每个用户能够设置他们自己的环境, 以利于他们通过改变shell,编辑器,键盘绑定和语言等适应并且更好的使用这个系统.


13.6. 修改帐户

UNIX 的处理用户帐户的环境中有很多不同的命令可用. 最普通的命令如下, 接下来是详细使用它们的例子.

命令 摘要
adduser(8) 在命令行添加新用户.
rmuser(8) 在命令行删除用户.
chpass(1) 一个灵活的用于修改用户数据库信息的工具.
passwd(1) 一个用于修改用户口令的简单的命令行工具.
pw(8) 一个强大灵活修改用户帐户的工具.

13.6.1. 添加用户

adduser(8) 是一个简单的添加新用户的命令. 它为用户创建passwdgroup 文件. 它也为新用户创建一个主目录, 它拷贝一个默认的配置文件(``dotfiles'') 从/usr/share/skel这个目录, 然后给新用户发送一封带欢迎信息的邮件.

在FreeBSD 5.0版本, adduser(8)命令从Perl脚本改写为shell脚本,起包装pw(8)的作用, 所以它的用法在 FreeBSD 4.X 上和FreeBSD 5.X 上稍有不同.

建立初始化配置文件, 使用 adduser -s -config_create. [10] 接下来, 我们配置adduser(8) 的默认设置, 并且建立我们的第一个普通用户帐户, 因为给普通用户创建root用户很危险 .

例子 13-1. 配置 adduser 和添加一个新用户,在FreeBSD 4.X版本

# adduser -v Use option ``-silent'' if you don't want to see all warnings and questions.
Check /etc/shells
Check /etc/master.passwd
Check /etc/group
Enter your default shell: csh date no sh tcsh zsh [sh]: zsh Your default shell is: zsh -> /usr/local/bin/zsh Enter your default HOME partition: [/home]:
Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
Send message from file: /etc/adduser.message no
[/etc/adduser.message]: no Do not send message Use passwords (y/n) [y]: y

Write your changes to /etc/adduser.conf? (y/n) [n]: y

Ok, let's go.
Don't worry about mistakes. I will give you the chance later to correct any input.
Enter username [a-z0-9_-]: jru Enter full name []: J. Random User Enter shell csh date no sh tcsh zsh [zsh]:
Enter home directory (full path) [/home/jru]:
Uid [1001]:
Enter login class: default []:
Login group jru [jru]:
Login group is ``jru''. Invite jru into other groups: guest no
[no]: wheel
Enter password []:
Enter password again []:

Name:     jru
Password: ****
Fullname: J. Random User
Uid:      1001
Gid:      1001 (jru)
Class:
Groups:   jru wheel
HOME:     /home/jru
Shell:    /usr/local/bin/zsh
OK? (y/n) [y]: y
Added user ``jru''
Copy files from /usr/share/skel to /home/jru Add another user? (y/n) [y]: n Goodbye!
#

总的来说, 我们把默认的shell设置成zsh (一个可以在Ports Collection找到的shell), 关闭欢迎邮件. 然后保存配置,接着创建一个名为jru的帐户, 并且确信jruwheel组里边 (它可能假定转换成了 rootsu(1) 命令.)

注: 口令不会被回显, 也不会用星号来显示. 确保两次输入口令时不要输错.

注: 从现在起,只要使用adduser(8) 你不必改变默认设置. 如果你要求改变默认设置,先退出程序, 然后使用-s 选项.

例子 13-2. 添加一个新用户在FreeBSD 5.X版本

# adduser
Username: jru
Full name: J. Random User Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh Home directory [/home/jru]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no Goodbye!
#

13.6.2. 删除用户

你可以使用rmuser(8) 从系统中完全删除一个用户. rmuser(8) 执行如下步骤:

  1. 删除用户的 crontab(1) 记录 (如果有的话).

  2. 删除属于用户的at(1) 工作.

  3. 杀掉属于用户的所有进程.

  4. 删除本地口令文件中的用户.

  5. 删除用户的主目录 (如果他有自己的主目录).

  6. 删除来自 /var/mail属于用户的邮件.

  7. 删除所有诸如 /tmp的临时文件存储区中的文件.

  8. 最后, 删除 /etc/group中所有属于组的该用户名.

    注: 如果一个组变成空,而组名和用户名一样,组将被删除. adduser(8)命令建立每个用户唯一的组.



rmuser(8) 不能用来删除超级用户的帐户, 因为那样做是对系统极大的破坏.

缺省情况下, 使用交互模式, 这样能够让你清楚的知道你在做什么.

例子 13-3. 删除用户 交互模式下的帐户删除

# rmuser jru Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh Is this the entry you wish to remove? y Remove user's home directory (/home/jru)? y Updating password file, updating databases, done.
Updating group file: trusted (removing group jru -- personal group is empty) done.
Removing user's incoming mail file /var/mail/jru: done.
Removing files belonging to jru from /tmp: done.
Removing files belonging to jru from /var/tmp: done.
Removing files belonging to jru from /var/tmp/vi.recover: done.
#

13.6.3. chpass

chpass(1) 可以改变用户的口令, shells, 和包括个人信息在内的数据库信息.

只有系统管理员, 既超级用户, 才可以用chpass(1)改变其他用户口令和信息.

除了可选择的用户名, 不需要任何选项, chpass(1) 显示一个包含用户信息的编辑器. 可以试图改变用户在数据库中的信息.

注: 在 FreeBSD 5.X版本, 编辑退出后,你应该索要你的口令,如果你不是超级用户的话.

例子 13-4. 以超级用户交互执行 chpass 命令

#Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

普通用户只能改变他们自己很少的一部分信息.

例子 13-5. 以普通用户交互执行 chpass 命令

#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

注: chfn(1)chsh(1) 只连接到 chpass(1), 同样的是 ypchpass(1), ypchfn(1), 和ypchsh(1). NIS 是自动支持的, 不一定要在命令前指定 yp. 如果这让你有点不太懂, 不必担心, NIS 将在 第 24 章介绍.


13.6.4. passwd命令

passwd(1) 是改变你自己作为一个普通用户口令或者作为超级用户口令常用的方法.

注: 用户改变口令前必须键入原来的口令, 防止用户离开终端时非授权的用户进入改变合法用户的口令。

例子 13-6. 改变你的口令

% passwd Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

例子 13-7. 改变其他用户的口令同超级用户的一样

# passwd jru Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

注: 就象 chpass(1)一样, yppasswd(1) 只是一个到 passwd(1)的连接, 所以NIS用任何一个命令都可以正常工作.


13.6.5. pw命令

pw(8) 是一个用来创建,删除,修改,显示用户和组的命令行工具. 它还有系统用户和组文件编辑器的功能. pw(8)有一个非常强大的命令行选项设置, 但新用户可能会觉得它比这儿讲的其它命令要复杂很多.


13.7. 限制用户使用系统资源

如果你有一些用户, 并且想要对他们所使用的系统资源加以限制. FreeBSD 提供了一些系统管理员限制用户访问系统资源的方法. 这些限制通常被分为两种: 磁盘配额, 和其它资源限制.

磁盘配额限制用户对磁盘的使用, 而且它还提供一种快速检查用户使用磁盘数量而不需要时刻计算的方法. 配额将在 第 16.14 节讨论.

其它资源限制包括CPU,内存的数量和用户可能会使用的其它资源. 这些是通过对登陆进行分类完成的,下面将做讨论.

登陆的类由/etc/login.conf文件定义. 比较精确的描述超出了本章的范围, 但 login.conf(5) 联机手册会有比较详细的描述. 可以说每个用户都分配到一个登陆类(预设是 default), 每个登陆类都有一套和它相对应的功能. 登陆功能是 名字= 的配对, 其中名字 是一个众所周知的标识符, 是一个根据名字经过处理得到的任意字符串. 设置登陆类和功能相当的直接,在 login.conf(5)联机手册会有比较详细的描述.

注: 系统并不直接读取 /etc/login.conf 中的配置, 相反, 它读取数据库文件 /etc/login.conf.db。 为了从 /etc/login.conf 生成 /etc/login.conf.db, 需要执行下面的命令:

# cap_mkdb /etc/login.conf

资源限制与普通登陆限制是有区别的. 首先, 对于每种限制, 有软限制(比较常见)和硬限制之分. 一个软限制可能被用户调整过, 但不会超过硬限制. 越往后可能越低, 但不会升高. 其次, 绝大多数资源限制会分配每个进程给一个特殊用户, 而不是用户的全部进程. 注意, 这些区别是资源限制的特殊操作所规定的, 不是登陆功能框架的完成(也就是说, 他们实际上 不是一个登陆功能的特例).

不再罗嗦了, 下面是绝大多数资源限制的例子 (与其它所有登陆功能相关的内容, 你也许可以在login.conf(5)找到).

coredumpsize

很明显,由程序产生的核心文件大小的限制在磁盘使用上是属于其它限制的(例如, 文件大小, 磁盘配额). 不过, 既然用户自己无法产生核心文件,而且经常不删除它们, 设置这个可以尽量避免由于一个大型应用程序的崩溃所造成的大量磁盘空间的浪费. (例如, emacs) crash.

cputime

这是一个用户程序所能消耗掉的最大CPU时钟数量. 一些不理想的进程会被内核杀掉.

注: 这是一个有关CPU消耗的时钟 限制, 不是top(1)ps(1)命令时屏幕上显示的CPU消耗的百分比. 在写此说明时, 后者的限制是是不太可能和没有价值的: 一个编译器--编译一个可能是合法的工作--可以在某一时刻轻易的用掉100%的CPU.



filesize

这是用户可以处理一个文件的最大值.不象磁盘配额, 这个限制是对单个文件强制执行的, 不是用户自己的所有文件.

maxproc

这是一个用户可以运行的最大进程数. 这包括前台和后台进程,很明显,这不可能比系统指定kern.maxproc的限制要大 sysctl(8). 同时也要注意,设置的过小会妨碍用户的处理能力: 可能需要多次登陆或执行多个管道. 一些任务, 例如编译一些大的程序, 也可能会产生很多进程 (例如,make(1), cc(1), 和其它一些预处理程序).

memorylocked

这是一个进程可能会被锁定到主存中的最大内存数量 (例如, 见 mlock(2)). 一些大型程序, 象amd(8), 在遇到问题时,它们得到的巨大交换量无法传递给系统进行处理.

memoryuse

这是在给定时间内一个进程可能消耗的最大内存数量. 它包括核心内存和交换内存. 在限制内存消耗方面,这不是一个完全的限制,但它是一个好的开始.

openfiles

这是一个进程可以打开的最大文件数. 在FreeBSD中, 文件可以被表现为套接字和IPC通道; 注意不要把这个数设置的太小. 更详尽的限制是由 kern.maxfiles定义的,见sysctl(8).

sbsize

这是网络内存数量的限制, 这可以通过创建许多套接字来生成一些针对老式DOS攻击的回应, 但它通常用来被限制网络通信.

stacksize

这是一个进程堆栈可能达到的最大值. 它不能单独的限制一个程序可能使用的内存数量; 所以, 它被用来和其它的限制手段配合使用.

在设置资源限制时,有一些其他的事需要记住. 下面是一些通常的技巧, 建议和注意事项.

  • 系统启动的进程/etc/rc会被指派给 守护程序 的登陆类.

  • 虽然/etc/login.conf文件是一个对绝大多数限制做合理配置的资源文件, 但只有你, 系统管理员, 才知道什么最适合你的系统. 设置的太高可能会因为过于开放而造成系统的被人滥用, 设置的过低则会效率很低.

  • 使用X Window的用户可能要比其他用户使用更多的资源. 因为X11本身就使用很多资源, 但它可以让用户同时运行更多程序.

  • 要记得许多限制会被用于单独的处理进程, 不是所有的用户. 例如, 设置 openfiles为50,意味着每个用户进程最高只能打开50个文件. 然而, 用户可以打开的文件的总的大小是根据maxproc值逐步增加的openfiles值. 这也会影响内存的消耗.

有关资源限制,登陆类的更深入信息可以查看相关联机手册: cap_mkdb(1), getrlimit(2), login.conf(5).


13.8. 个性化用户设置

本地化是由系统管理员或用户设置的的一个环境,它可以用来调整不同的语言,字符设置,始终标准等. 这将在本地化一章做详细讨论.


13.9. 组

组简单的讲就是一个用户列表. 组通过组名和GID (Group ID)来识别. 在FreeBSD(和其它绝大多数 UNIX 系统)中, 这两个因素通常被内核用来决定一个被允许执行的进程是否是他的用户ID, 一个进程有一个和它相关联的组的列表. 你可能听说过一些一个用户或进程的``组 ID''的事情; 大多数情况下, 这只意味着在列表中的第一个组.

与组ID对应的组名在/etc/group中. 这是一个由冒号来界定的文本文件. 第一部分是组名, 第二部分是加密后的口令, 第三部分是组ID, 第四部分是以逗号相隔的成员列表. 它可以用手工方式进行编辑 (有点危险, 不过,假如你不出语法错误的话!). 对于更完整的语法描述,见group(5) 联机手册.

假如你想要手工编辑/etc/group, 你可以使用pw(8) 添加和编辑组. 例如, 要添加一个叫teamtwo的组,确定它存在:

例子 13-8. 使用pw(8)添加一个组

# pw groupadd teamtwo # pw groupshow teamtwo teamtwo:*:1100:

上面的数字1100是组teamtwo的组ID. 在这里,teamtwo 没有成员, 它也就没有多大用处. 让我们把jru用户加入到teamtwo组.

例子 13-9. 使用pw(8)在组中添加用户

# pw groupmod teamtwo -M jru # pw groupshow teamtwo teamtwo:*:1100:jru

使用-M参数是为了用逗号划分一个组成员中的用户列表. 在前面的部分, 我们知道口令文件也会为每个用户包含一个组. 后来用户被自动的添加到组列表里; 当我们使用groupshow 命令时pw(8)用户列表不被显示出来. 但是当我们通过queriedid(1) 或者类似工具查看时,用户列表会被显示. 换句话说, pw(8) 命令只能读取/etc/group 文件; 它从不尝试从/etc/passwd文件读取更多信息.

例子 13-10. 使用id(1)来决定组成员

% id jru
uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

正如你所看到的, jru是组jru 和组 teamtwo的成员.

有关pw(8)的更多信息,请参看其它联机手册.更多的关于/etc/group文件格式的信息, 可参考group(5) 联机手册.


章 14. 安全

这一章的许多内容来自手册页 security(7) ,其作者是 Matthew Dillon.

14.1. 概述

这一章将对系统安全的基本概念进行介绍,除此之外,还将介绍一些好的习惯,以及 FreeBSD 下的一些更深入的话题。这章的许多内容对于一般的系统和Internet安全也适用。如今, Internet已经不再像以前那样是一个人人都愿意与你作好邻居的 ``友善'' 的 地方。让系统更加安全,将保护你的数据、智力财产、时间,以及其他很多东西不至于被 入侵者或类似人员所窃取。

FreeBSD提供了大量的工具和机制来确保你的系统和网络的安全。

读完这章,你将了解:

  • 基本的 FreeBSD 系统安全概念。

  • FreeBSD 中众多可用的密码学设施,例如 DESMD5

  • 如何设置一次性口令验证机制。

  • 如何在 FreeBSD 5.0 以前的版本上设置 KerberosIV

  • 如何在 FreeBSD 5.0 或更高版本上设置 Kerberos5

  • 如何使用 IPFW 来创建防火墙。

  • 如何配置 IPsec 并在 FreeBSD/Windows 间建立 VPN

  • 如何配置并使用 OpenSSH,以及 FreeBSD 的 SSH 执行方式。

  • 如何使用TrustedBSD MAC Framework来配置和加载访问控制扩展模块。

  • 系统 ACL 的概念,以及如何使用它们。

  • 如何从 FreeBSD 的安全公告中获得有用信息并采取相应措施。

在开始阅读这章之前,你需要:

  • 理解基本的 FreeBSD 和 Internet 概念。


14.2. 介绍

安全是系统管理至始至终最基本的要求。由于所有的 BSD UNIX 多用户系统都有它自身内在的安全性,建立和维护额外的安全机制, 确保用户的 ``诚实'' 大概是系统管理最艰巨的工作之一。 机器仅保持着建立时最原始的安全性,而安全性必须要考虑到用户使用的便利性。 通常, UNIX 系统能够支持巨大的并发用户处理, 而这些处理中绝大部分是以服务器形式处理的 -- 这意味着外部的实体能够与它们互连和互动。 昨天的小型计算机和主机变成了今天的桌面机,计算机已连到局域网和互联网, 安全就成了一个非常严峻的问题。

通过像 ``洋葱'' 那样分层的方法,能够很好地实现安全。 简而言之,你所要做的就是创建很多的安全层,然后仔细地监视系统以防入 侵。不过,过多地创建安全层可能会出现问题,你可能不希望大量地阅读检 测结果,因为检测是所有安全机制中最重要的一环。例如,在所有的系统可 执行文件上都设置 schg 标记 (参考 chflags(1)) 的意义就不大,因为尽管这也许能够暂时地保护那些执行文件,它阻止了攻 击者轻易地闯入并作一个容易被检测出来的修改,却很可能最终导致你的安 全机制根本检测不到入侵者。

系统安全也涉及到许多攻击方式,包括试图摧毁或使系统无法使用,但 并不试图窃取 root 帐号(``干掉 root'')。 安全问题主要分成以下几类:

  1. 拒绝服务攻击。

  2. 窃取其他用户的帐户。

  3. 通过可访问服务窃取root帐户。

  4. 通过用户帐户窃取root帐户。

  5. 建立后门。

拒绝式服务攻击是侵占机器所需资源的一种行为。通常, DoS 攻击 采用暴力(brute-force)手段通过压倒性的流量来破坏服务器和网络栈, 以使机器崩溃或无法使用。某些 DoS 攻击则利用在网络栈中的错误,仅 用一个简单的信息包就可以让机器崩溃,这类情况通常只能通过给内核打 补丁来修复。在一些不利的条件下,对服务器的攻击能够被修复,只要适 当地修改一下系统的选项来限制系统对服务器的负荷。顽强的网络攻击是 很难对付的。例如,一个欺骗性信息包的攻击,无法阻止入侵者切断你的 系统与Internet的连接。它不会使你的机器死掉,但它会把Internet连接 占满。

窃取用户帐户要比D.o.S.攻击更加普遍。许多系统管理员仍然在他们的 服务器上运行着基本的telnetdrlogindrshdftpd服务。这些服务在默认情况下不会以 加密连接来操作。结果是如果你的系统有中等规模大小的用户群,在通过 远程登录的方式登录到你系统的用户中,一些人的口令会被人窃取。仔细 的系统管理员会从那些成功登录系统的远程访问日志中寻找可疑的源地址。

通常必须假定,如果一个入侵者已经访问到了一个用户的帐户,那么它 就可能使自己成为 root 。然而,事实是在一个安全 和维护做得很好的系统中,访问用户的帐户不一定会让入侵者成为 root。这个差别是很重要的,因为没有成为 root 则入侵者通常是无法隐藏它的轨迹的,而且, 如果走运的话,除了让用户的文件乱掉和系统崩溃之外,它不能做什么别的 事情。窃取用户帐户是很普遍的事情,因为用户往往不会对系统管理员的警 告采取措施。

系统管理员必须牢牢记住,可能有许多潜在的方法会使他们机器上的 root 用户受到威胁。入侵者可能知道 root 的口令,而如果在以 root 权限运行的服务器上找到一个缺陷(bug), 就可以通过网络连接到那台服务器上达到目的;另外,一旦入侵者已经侵 入了一个用户的帐户,可以在自己的机器上运行一个suid-root程序来发 现服务器的漏洞,从而让他侵入到服务器并获取 root 。 攻击者找到了入侵一台机器上 root 的途径之后, 他们就不再需要安装后门了。许多 root 漏洞被发 现并修正之后,入侵者会想尽办法去删除日志来消除自己的访问痕迹,所以 他们会安装后门。后门能给入侵者提供一个简单的方法来重新获取访问系统 的 root 权限,但它也会给聪明的系统管理员一个 检测入侵的简便方法。让入侵者无法安装后门事实上对你的系统安全是有害 的,因为这样这样并不会修复那些侵入系统的入侵者所发现的新漏洞。

安全的管理方法应当使用像 ``洋葱皮'' 一样多层次的方法来实 现,这些措施可以按下面的方式进行分类:

  1. 确保 root 和维护人员帐户的安全。

  2. 确保 root - 以root用户权限运行的服务器和suid/sgid可执行程序的安全。

  3. 确保用户帐户的安全。

  4. 确保口令文件的安全。

  5. 确保内核中内核设备、直接访问设备和文件系统的安全。

  6. 快速检测系统中发生的不适当的变化。

  7. 做个偏执狂。

这一章的下一节将比较深入地讲述上面提到的每一个条目。


14.3. 确保FreeBSD的安全

命令与协议: 在这份文档中,我们使用 粗体 来表示命令或应用程序。这一约定被用于 类似 ssh 这样的概念,因为它既可以表示命令,又可以表示协议。

下面几节中的内容将包括 前一节 中提到的那些加强 FreeBSD 安 全性的方法。


14.3.1. 确保 root 和维护人员帐户的安全

首先,如果你没有确保 root 帐户的安全, 就没必要先劳神确保用户帐户的安全了。绝大多数系统都会指派一个口令给 root 帐户。 我们的第一个假定是,口令 总是 不安全的。这并不意味着你要把口令删掉。口令通常对 访问机器的控制台来说是必须的。也就是说,你不应当让它用到控制台以外的口令,即使是使用 su(1) 命令。 例如,确信你的pty终端在 /etc/ttys 文件中被指定为 insecure (不安全),这将使直接通 过 telnetrlogin 登录 root 会不被接受。 如果使用如 sshd 这样的其他登录服务,确认直接登录root也被关闭了。你可以通过 编辑 /etc/ssh/sshd_config 文件来做到这一点,确信 PermitRootLogin 被设置成 NO 。考虑到每一种访问方法 -- 如FTP这样的服务,以免因为它们而导致安全性的损失。直接登录 root 只有通过系统控制台 才被允许。

当然,作为一个系统管理员,你应当获得 root 身份,因此,我们开了一些后门来 允许自己进入。但这些后门只有在经过了额外的口令确认之后才能够进入。 一种让 root 可访问的方法是增加适当的用户帐户到 wheel 组 (在 /etc/group 中)。wheel 组中的用户成员可以使用 su 命令来成为 root 。绝对不应该通过在口令项中进行设置来赋予维护人员天然的 wheel 组成员身份。维护人员应被放置在 staff 组中,然后通过 wheel 文件加入到 /etc/group 组。事实上,那些需要以 root 身份进行操作的用户应被放到 wheel 组中。当然,也可以通过 某种其它的验证手段,例如 Kerberos,可以通过 root 帐户中的 .k5login 文件来允许执行 ksu(1) 成为 root ,而不必把它们放进 wheel 组。 这可能是一种更好的解决方案,因为 wheel 机制仍然可能导致入侵者获得 root ,如果他拿到了口令文件,并能够进入职员的帐户。 尽管有 wheel 比什么都没有要强一些,但它并不是一种绝对安全的办法。

一种间接地提高员工帐号,以及 root 访问的方法,使采用其他的登录访问方式,并使用 ``星号'' 替代员工加密的口令。使用 vipw(8) 命令,可以把每一个加密的口令 替换成一个 ``*'' 符。 这将更新 /etc/master.passwd 文件,以及 用户名/口令数据库,以禁用口令登录。

如下面的员工帐号

foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh

应被改为:

foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh

这一更改将阻止一般的登录,因为加密的口令永远不会与 ``*'' 匹配。一旦这么做之后, 任何员工都必须使用其他的方式来完成登录,例如,使用 kerberos(1) 或者通过 ssh(1) 利用 公钥/密钥对 的方式 来完成登录。当使用 Kerberos 这样的工具时,通常必须加强运行 Kerberos 的服务器,以及桌面工作站的安全性。当使用 公钥/密钥对 以 ssh 登录时,通常必须加固用户 开始 登录的那台机器的安全 (通常这是他们的工作站)。在这之上还可以增加 一层安全性,即在使用 ssh-keygen(1) 生成它的时候,使用口令 来保护它们。如果能够用 ``星号'' 替换掉所有员工的口令, 那么,这也就保证了他们只能通过你设置的安全的方法来登录。这将迫使 所有的员工使用安全的、经过加密的连接来完成他们的会话,而这将使得 入侵者通过监听网络通讯,从某些不相关的、不太安全的机器上窃取口令 成为不可能。

另一钟间接的安全机制则是,从严格受限的机器向限制更宽松的机器 上登录。例如,如果你的服务器运行了所有的服务,那么,工作站应该什么都 不运行。为了让工作站尽可能地安全,应该避免运行任何没有必要的服务,甚 至不运行任何服务。另外,也应该考虑使用带口令保护功能的屏幕保护程序。 毋庸置疑,如果攻击者能够物理地接触你的工作站,那么他就有能力破坏任何 安全设施,这确实是我们需要考虑的一个问题,但同样地,真正能够物理接触 你的工作站或服务器并实施攻击的人在现实生活中并不常见,绝大多数攻击来 自于网络,而攻击者往往无法物理地接触服务器或工作站。

使用类似 Kerberos 这样的工具,也为我们提供了使用一个工具来禁 用某个用户,或修改他们口令并在所有机器上立即生效的方法。如果员工的帐 号被窃取,能够在所有的其他机器上生效的口令变更将很有意义。如果口令分 散地保存在多个机器上,一次修改 N 台机器上的口令很可能是一件痛苦的事 情。此外, Kerberos 还能够提供更多的限制,除了 Kerberos 令牌有很好的 过期机制之外,它还能够强制用户在某个特定的期限内修改口令(比如说,每 月一次).


14.3.2. 确保以root用户权限运行的服务器和suid/sgid可执行程序的安全

谨慎的管理员只运行它们需要的服务,不多,不少。要当心第三方 的服务程序很可能有更多的问题。例如,运行旧版的 imapd 或者 popper 无异于将 root 令牌拱手送给整个世界上的攻击者。 永远不要运行那些你没有仔细检查过的服务程序,许多服务程序并不需要以 root 身份运行。例如,ntalkcomsat,以及 finger 服务程序都能够以一种称作 沙盒 的特殊用户身份运行。除非你解决了大量的 麻烦,否则沙盒远不是一个完美的策略,但洋葱规则仍然成立,如果某个人 设法攻破了在沙盒中运行的程序,那么他们还必须冲出沙盒才能够做的更多。 攻击者需要冲破的层次越多,他成功的机会就越小。root漏洞曾经在几乎所有 的以root身份运行的程序中存在,包括基本的系统服 务。另外,如果你只通过 sshd 登录,而不打算使用 telnetdrshdrlogind,那么,毫不犹豫地关闭这些服务!

FreeBSD 现在默认在沙盒中运行 ntalkd, comsat, 以及 finger。此外, named(8) 也可以这样运行。 /etc/defaults/rc.conf 中包括了如何如此运行 named 的方法,只是这些内容被注释掉了。 如何升级或安装系统将决定这些沙盒所使用的特殊用户是否被自动安装。 谨慎的系统管理员将根据需要研究并实现沙盒。

此外,还有一些服务通常并不在沙盒中运行: sendmail, popper, imapd, ftpd, 以及一些其他的服务。当然,它们有一些替代品,但安装那些服务可能需要 做更多额外的工作。可能必须以 root 身份运行这些 程序,并通过其他机制来检测入侵。

系统中另一个比较大的 root 漏洞 是安装在其中的 suid-root 和 sgid 的可执行文件。绝大多数这类程序, 例如 rlogin, 被存放于 /bin, /sbin, /usr/bin, 或 /usr/sbin 中。 尽管并没有 100% 的安全保证,但系统默认的 suid 和 sgid 可执行文件 通常是相对安全的。当然,偶尔也会发现一些存在于这些可执行文件中的 root 漏洞。1998年,Xlib 中发现了一处 root 漏洞,这使得 xterm (通常是做了suid的) 变得可以入侵。 安全通常比时候沮丧更好,因此,谨慎的管理员通常会限制 suid 可执行 文件,并保证只有员工帐号能够执行它们,或只开放给特定的用户组,甚 至彻底干掉 (chmod 000) 任何 suid 可执行文件, 以至于没有人能够执行它们。没有显示设备的服务器通常不会需要 xterm 可执行文件。sgid 可执行文件通常 同样地危险。一旦入侵者攻克了sgid-kmem,那么他就能够读取 /dev/kmem 并进而读取经过加密的口令文件,从而 窃取任何包含口令的帐号。另外,攻破了 kmem 的入 侵者能够监视通过 pty 传送的按键序列,即使用户使用的是安全的登录方 式。攻破了 tty 组的用户则能够向几乎所有用 户的 tty 写入数据。如果用户正在运行一个终端程序,或包含了键盘模拟 功能的终端仿真程序,那么,入侵者能够以那个用户的身份执行任何命令。


14.3.3. 确保用户帐户的安全

用户帐号的安全通常是最难保证的。虽然你可以为你的员工设置 严苛的登录限制,并用 ``星号'' 剃掉他们的口令,但你可 能无法对普通的用户这么做。如果有足够的决策权,那么在保证用户帐号 安全的斗争中或许会处于优势,但如果不是这样,你能做的只是警惕地监 控这些帐号的异动。让用户使用 ssh 或 Kerberos 可能会有更多的问题, 因为需要更多的管理和技术支持,尽管如此,与使用加密的口令文件相比, 这仍不失为一个好办法。


14.3.4. 确保口令文件的安全

尽可能使用 * 替换掉口令是保证口令文件安 全唯一的解决方法,如果能够用 ssh 或 Kerberos 的话。即使只有 root 用户能够读取加密过的口令文件 (/etc/spwd.db) 入侵者仍然可能设法读到它,即使他暂时还无法写入这个文件。

你的安全脚本应该经常检查并报告口令文件的异动 (参见后面的 检查文件完整性 一节)。


14.3.5. 确保内核中内核设备、直接访问设备和文件系统的安全

如果攻击者已经拿到了 root 那么他就有能力作任何 事情,当然,有一些事情是他们比较喜欢干的。例如,绝大多数现代的内核都包括 一个内建的听包设备。在 FreeBSD 中,这个设备被称作 bpf 。攻击者通常会尝试在攻克的系统上运行它。 如果你不需要 bpf 设备提供的功能,那么,就不要把它编 入内核

但即使已经关掉了 bpf 设备,你仍然需要担心 /dev/mem/dev/kmem 。 就事论事地说,攻击者仍然能够通过直接访问的方式写入磁盘设备。同样地, 还有一个被称作模块加载器, kldload(8) 的机制,也会包含潜在的危险。 尝试入侵企业网络的入侵者会尝试在正在运行的内核上安装他自己的 bpf 设备,或其他听包设备。为了防止这些问题, 需要抬高内核安全级,至少调整到1。可以通过对 kern.securelevel 执行 sysctl 来完成这个任务。一旦把安全级调整到1, 对于直接访问设备的写入操作将被拒绝,而特殊的 chflags 标记,如 schg ,将被强制执行。一定要在重要的启动执 行文件、目录和脚本文件上设置 schg 标记 -- 在 安全级生效之前的所有文件。这可能做得有些过火,并将导致在较高安全级上 运行时升级系统变得困难。此外,运行于较高安全级上,而没有正确设置 schg 标记的系统仍然是存在弱点的。另一种方法是把 //usr 以只读方式挂接。 此外,请注意过于严苛的安全设置将使得入侵检测同样无法进行。


14.3.6. 检查文件完整性: 可执行文件,配置文件和其他文件

当实施严格的限制时,往往会在使用的方便性上付出代价。例如,使用 chflags 来把 schg 标记 应用到 //usr 中的绝大多数文件上可能会起到反作用,因为 尽管它能够保护那些文件,但同样关掉了一个很好的监测机制。层次化安全 的最后一层可能是最重要的 -- 检测。安全的其他部分可能相对来讲 意义并不那么大 (或者,更糟糕的事情是,那些措施会给你安全的假象), 加入你无法检测潜在的入侵事件。层次化安全最重要的功能是减缓入侵者, 而不是彻底不让他们入侵,这能够让检测起到作用,并更好地捕捉入侵行为。

检测入侵的一种好办法是查找那些被修改、删除或添加的文件。检测 文件修改的最佳方法是与某个 (通常是中央的) 受限访问的系统上的文件进行 比对。在一台严格限制访问的系统上撰写你的安全脚本通常不能够被入侵者察 觉,因此,这非常重要。为了最大限度地发挥这一策略的优势,通常会使用只 读的NFS,或者设置 ssh 钥匙对以便为其他机器提供访问。除了网络交互之外, NFS可能是一种很难被察觉的方法 -- 它允许你监控每一台客户机上的文件系统, 而这种监控几乎是无法察觉的。如果一台严格受限的服务器和客户机是通过交 换机连接的,那么 NFS 将是一种非常好的方式。不过,如果那台监控服务器 和客户机之间通过集线器(Hub),或经过许多层的路由来连接,则这种方式就 很不安全了,此时,应考虑使用 ssh ,即使这可以在审计记录中查到。

一旦为这个受限的机器赋予了至少读取它应监控的客户系统的权限, 就应该为实际的监控撰写脚本。以 NFS 挂接为例,可以用类似 find(1)md5(1) 这样的命令为基础来完成我们所需的工作。 最好能够每天对被控机的所有执行文件计算一遍 md5,同时,还应以更高的频率测试那些 /etc/usr/local/etc 中的控制文件。一旦发现了不匹配的情形,监控机应立即通知系统管理员。 好的安全脚本也应该检查在系统分区,如 //usr 中是否有新增或删除的可执行文件,以及 不适宜的 suid 。

如果打算使用 ssh 来代替 NFS,那么撰写安全脚本将变得困难许多。 本质上,需要在脚本中使用 scp 在客户端复制文件, 另一方面,用于检查的执行文件 (例如 find) 也需要使用 scp 传到客户端,因为 ssh 客户程序很可能已经被攻陷。 总之,在一条不够安全的链路上 ssh 可能是必须的, 但也必须应付它所带来的难题。

安全脚本还应该检查用户以及职员成员的权限设置文件: .rhosts.shosts.ssh/authorized_keys 等等。 ... 这些文件可能并非通过 MD5 来进行检查。

如果你的用户磁盘空间很大, 检查这种分区上面的文件可能非常耗时。 这种情况下, 采用标志来禁止使用 suid 可执行文件和设备在这些文件系统上出现将是一个好主意。 您可能会想看看 nodevnosuid 这两个选项 (参见 mount(8))。 尽管如此, 这些扫描仍然应该至少每周进行一次, 这样做的意义并不是检测有效的攻击, 而是检查攻击企图。

进程记帐 (参见 accton(8)) 是一种相对成本较低的, 可以帮助您在被入侵后评估损失的机制。 对于找出入侵者是如何进入系统的这件事情来说, 它会非常的有所助益,特别是当入侵者什么文件都没有修改的情况下。

最后, 安全脚本应该处理日志文件, 而日志文件本身应该通过尽可能安全的方法生成 -- 远程 syslog 可能非常有用。 入侵者会试图掩盖他们的踪迹, 而日志文件对于希望了解入侵发生时间的系统管理员来说则显得尤为重要。 保持日志文件的永久性记录的一种方法是在串口上运行系统控制台, 并持续不断地在一台安全的机器上收集这些信息。


14.3.7. 偏执

带点偏执不会带来伤害。作为一种惯例, 系统管理员在不影响使用的便利的前提下可以启用任何安全特性,此外, 在经过深思熟虑之后,也可以增加一些 确实会 让使用变得不那么方便的安全特性。 更重要的是,有安全意识的管理员应该学会混合不同的安全策略 -- 如果你逐字逐句地按照这份文档来配置你的机器, 那无异于向那些同样能得到这份文档的攻击者透露了更多的信息。


14.3.8. 拒绝服务攻击

这一节将介绍拒绝服务攻击。 DoS 攻击通常是基于数据包的攻击, 尽管几乎没有任何办法来阻止大量的伪造数据包耗尽网络资源, 但通常可以通过一些手段来限制这类攻击的损害,使它们无法击垮服务器。

  1. 限制服务进程 fork.

  2. 限制 springboard 攻击 (ICMP 响应攻击, ping 广播,等等)。

  3. 内核路由缓存

对于通过复制进程 (fork) 来进行服务的服务器的一种很常见的攻击是想办法耗尽其进程、 文件描述符或者内存, 直到机器彻底死掉。 inetd (参见 inetd(8)) 提供了许多选项来限制这类攻击。 需要注意的是, 尽管能够阻止一台机器彻底垮掉, 但通常无法防止服务本身被击垮。 请仔细阅读 inetd 的联机手册, 特别是它的 -c-C 以及 -R 这三个选项。 伪造 IP 攻击能够绕过 inetd-C 选项, 因此, 这些选项需要配合使用。 某些独立的服务器也有类似的限制参数。

例如, Sendmail 就提供了自己的 -OMaxDaemonChildren 选项, 它通常比 sendmail 的负载限制选项更为有效, 因为服务器负载的计算有滞后性。 您可以在启动 sendmail 时指定一个 MaxDaemonChildren 参数, 把它设的足够高以便承载您所需要的负荷, 当然, 不要高到足以让运行 sendmails 的机器死掉。 此外, 以队列模式 (-ODeliveryMode=queued) 并把服务程序 (sendmail -bd) 和队列执行程序分别执行 (sendmail -q15m) 也是一个好主意。 如果您希望保证队列的实时性, 可以考虑使用更短的间隔, 例如 -q1m, 但同时也需要指定一个合理的子进程数, 也就是通过 MaxDaemonChildren 选项以免 那个 sendmail 造成重叠的故障。

Syslogd 可以被直接地攻击,因此, 强烈建议只要可行,就在启动它的时候加上 -s 参数, 其他情况下,则至少应该加上 -a

对于基于连接的服务,例如 tcpwrapper 的 reverse-identd, 都应该格外的小心, 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 tcpwrappers 所提供的 reverse-ident 这样的功能。

此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要, 这些工作可以通过设置边界路由器来完成。 主要的想法, 是阻止来自您的 LAN 以外的访问, 这有助于避免 root 受到攻击。 尽可能配置排他式的防火墙, 例如, ``用防火墙阻止所有的网络流量 除了 端口 A、B、 C、D,以及 M-Z''。 通过采用这种方法, 您可以很容易地将低端口的访问阻止在外, 而又不难配置使防火墙放过那些明确需要开放的服务, 例如 named (如果您的机器准备作为域的主要解析服务器), ntalkdsendmail,以及其他可以从 Internet 访问的服务。 如果您尝试以其他方式配置防火墙 -- 采用比较宽松的策略, 那么您将很有可能忘记 ``关掉'' 一两个服务, 或者在增加了一些服务之后忘记更新防火墙策略。 尽管如此, 仍然可以考虑允许段口号较高的那一部分端口进入数据, 这将保证那些需要这样特性的服务能够正常工作, 而又不影响低端口服务的安全性。 此外, 还应注意到 FreeBSD 允许您来控制动态绑定的端口的范围, 即一系列 net.inet.ip.portrange 变量,通过 sysctl 来完成设置。 (sysctl -a | fgrep portrange)。 这使得您完成较复杂的防火墙策略变得易如反掌。 例如, 您可能希望普通的高段端口的起止范围是 4000 到 5000, 而更高范围则是 49152 到 65535, 随后在防火墙中阻止低于 4000 的所有端口 (当然, 除了那些特地为 Internet 访问而开设的端口)。

另一种常被称作 springboard 的攻击也是非常常见的 DoS 攻击 -- 它通过使服务器产生其无法处理的响应来达到目的。 最常见的攻击就是 ICMP ping 广播攻击。 攻击者通过伪造 ping 包, 将其源 IP 设置为希望攻击的机器的 IP。 如果您的边界路由器没有进行禁止 ping 广播地址的设置, 则您的网络将最终陷于响应伪造的 ping 之中, 特别是当攻击者同时使用了多个不同的网络时。 广播攻击能够产生超过 120 兆位的瞬时流量。 另一种常见的针对 ICMP 错误报告系统的 springboard 攻击, 通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源, 并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽 mbuf 来使得使得被攻击的服务器崩溃,特别是当这些服务器无法足够快地完成 ICPM 响应的时候。 可以通过为 FreeBSD 内核配置称为 ICMP_BANDLIM 的编译时选项来使这类攻击变得不那么有效。 最后一类主要的 springboard 是针对某些 inetd 的内部服务, 例如 udp echo 服务进行的。 攻击者简单地伪造一个来自服务器 A 的 echo 口的 UDP 包, 然后将这个包发到 B 的 echo 口。 于是, 两台服务器将不停地将包弹给对方。 攻击者能够将两台服务器的这种服务都耗竭, 并且通过这种方式, 之需要很少的包就可以让 LAN 超载。 类似的问题对 chargen 口也是存在的。 好的系统管理员应该关闭这些 inetd 的测试服务。

伪造的包攻击也可以用来使内核的路由缓存过载。 请参考 net.inet.ip.rtexpirertminexpire, 以及 rtmaxcache sysctl 参数。 伪造的包可以用随机的源 IP 攻击, 使得内核在路由表中产生一个临时的缓存项, 它可以通过 netstat -rna | fgrep W3 看到。 这些路由通常需要 1600 秒才会过期。 如果内核发现路由表变得太大, 它会动态地降低 rtexpire 但以 rtminexpire 为限。 这引发了两个问题:

  1. 在访问量不大的服务器上, 内核对于突然袭击的反应不够快。

  2. rtminexpire 的值没有低到让内核在此类攻击时活下去的程度。

如果您的服务器通过 T3 或更快的线路接入 Internet, 那么通过 sysctl(8) 来手动地降低 rtexpirertminexpire 就非常必要。 当然,绝不要把它们设置为零 (除非您想让机器崩溃) 将这两个参数设置为 2 通常已经足以抵御这类攻击了。


14.3.9. Kerberos 和 SSH 的访问问题

如果您打算使用, 那么 Kerberos 和 ssh 都有一些需要解决的问题。 Kerberos V 是一个很棒的验证协议, 但使用了它的 telnetrlogin 应用程序有一些 bug, 使得它们不适合处理二进制流。 而且, 除非使用了 -x 选项, 否则默认情况下 Kerberos 并不加密会话。 ssh 在默认时加密所有的会话内容。

除了默认转发加密密钥, ssh 在所有的其他方面都做得很好。 这意味着如果您持有供您访问系统其他部分密钥的工作站作了很好的安全防护, 而您连到了一台不安全的机器上, 则您的密钥可能被别人获得。 尽管实际的密钥并没有被泄漏, 但由于 ssh 会在您登录的过程中启用一个转发端口, 如果攻击者拿到那台不安全的机器上的 root 那么他将能够利用那个端口来使用您的密钥, 从而访问您能够访问的那些机器。

我们建议您在使用 ssh 时配合 Kerberos 来完成工作人员的登录过程。 ssh 在编译时可以加入 Kerberos 支持。 在减少了潜在地暴露 ssh 密钥的机会的同时, 它还能够通过 Kerberos 来保护口令。 ssh 密钥只有在做过安全防护的机器上执行自动操作时才应使用 (这是 Kerberos 不适合的情形)。 此外,我们还建议您要么在 ssh 配置中关闭密钥转发, 要么在 authorized_keys 中增加 from=IP/DOMAIN 选项, 来限制这些密钥能够登录的来源机器。


14.4. DES,MD5,以及Crypt

部分重写、更新来自 Bill Swingle.

UNIX 系统上的每个用户都有一个与其帐户关联的口令。很显然, 密码只需要被这个用户和操作系统知道。为了保证口令的私密性, 使用了一种容易加密,却很难解密的被称作 ``单向散列'' 的方法来处理口令。换言之,我们刚刚说的那句话并不十分确切: 操作系统本身并不 真的 知道你的口令。 它只知道口令 经过加密的形式。 获取口令对应 ``明文'' 的唯一办法是采用暴力在口令可能的区间内穷举。

不幸的是,当 UNIX 刚刚出现时,安全地加密口令的唯一方法基于DES, 数据加密标准 ( the Data Encryption Standard )。 于是这给那些非美国居民带来了问题, 因为 DES 的源代码在当时不能被出口到美国以外的地方, FreeBSD 必须找到符合美国法律,但又要与其他那些使用 DES 的 UNIX 版本兼容的办法。

解决方案是把加密函数库分割为两个, 于是美国的用户可以安装并使用 DES 函数库, 而国际用户则使用另外一套库提供的一种可以出口的加密算法。 这就是 FreeBSD 为什么使用 MD5 作为它的默认加密算法的原因。 MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。


14.4.1. 识别你采用的加密算法

在 FreeBSD 4.4 之前,libcrypt.a 曾经是 一个指向相应加密算法的符号连接。FreeBSD 4.4 开始,把 libcrypt.a 变成了一个可以配置的密码验证散列库。 现在这个库支持 DES,MD5和Blowfish散列函数。默认情况下,FreeBSD 使用 MD5 来加密口令。

可以很容易地识别 FreeBSD 使用哪种加密方法。 检查 /etc/master.passwd 文件中的加密密码是一种方法。 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 $1$ 字符开始。 以 $2a$ 开始的口令是通过 Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征, 但他们要比 MD5 短, 并且以不包括 $ 在内的 64 个可显示字符来表示, 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。

新口令锁使用的密码格式是由 /etc/login.conf 中的 passwd_format 来控制的, 可供选择的算法包括 des, md5blf。 请参考 login.conf(5) 联机帮助以获得更进一步的详情。


14.5. 一次性口令

S/Key 是基于单向 hash 功能的一次性密码管理方式。 为了考虑兼容性而使用了 MD4 散列, 而其他系统则使用了 MD5 和 DES-MAC。 S/Key 从 1.1.5 版之后就一直是 FreeBSD 基本系统的一部分, 包含这一特性的操作系统也日益增多。 S/Key 是 Bell Communications Research, Inc. 的注册商标。

从 FreeBSD 的 5.0 版开始, S/Key 被功能相同的 OPIE (One-time Passwords In Everything) 取代了。 OPIE 默认使用 MD5 散列。

下面将介绍三种不同的口令。 第一种是您常用的