FreeBSD 使用手册

FreeBSD 文档计划

修订: 43188

版权信息

允许在源文件(XML DocBook)和以“已编译”(XML,HTML,PDF,PostScript,RTF等)格式重新分发和使用(无论是否经过修改),但必须满足以下条件:

  1. 源代码形式 (XML DocBook) 的重新分发必须保留上述版权声明、且此条件列表和以下免责声明作为此文件的第一行, 而不进行改动。

  2. 以编译形式重新分发(转换为其他DTD,转换为PDF,PostScript,RTF和其他格式)必须在随分发提供的文档和/或其他材料中复制上述版权声明,此条件列表和以下免责声明。

重要:

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

FreeBSD 是 FreeBSD 基金会的注册商标。

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

3ware 是 3ware Inc. 的注册商标。

ARM 是 ARM Limited 的注册商标。

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

Adobe,Acrobat,Acrobat Reader,Flash 和 PostScript 是 Adobe Systems Incorporated 在美国和(或)其他国家的注册商标或商标。

Apple、Airport、FireWire、Imac、iMac、iPad、Mac、Macintosh、mac OS、QuickTime 和 TrueType 是苹果公司在美国和其他国家注册的商标。

Android 是 Google Inc. 的注册商标。

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

IBM,AIX,OS/2,PowerPC,PS/2,S/390 和 ThinkPad 是 International Business Machines Corporation 在美国或其他国家的商标。

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

Intel,Celeron,Centrino,Core,EtherExpress,i386,i486,Itanium,Pentium 和 Xeon 是 Intel Corporation 及其子公司在美国和其他国家的注册商标。

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

Linux 是 Linus Torvalds 的注册商标。

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

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

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

Oracle 是 Oracle Corporation 的注册商标。

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

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

Sun,Sun Microsystems,Java,Java Virtual Machine,JDK,JRE,JSP,JVM,Netra,OpenJDK,Solaris,StarOffice,SunOS 和 VirtualBox 是 Sun Microsystems Inc. 在美国和其他国家的注册商标。

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

SpeedTouch 是 Thomson 的商标。

VMware 是 VMware Inc. 的商标。

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

XFree86 是 XFree86 Project, Inc. 的注册商标。

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

制造商和销售商为区分其产品而使用的许多名称都被认作商标。如果这些标识出现在本文档中, 并且 FreeBSD 项目知道商标声明, 则在这些名称之后增加 ® 标记。

2013-11-14 00:20:51 由 delphij.
摘要

Welcome to FreeBSD! This handbook covers the installation and day to day use of FreeBSD 12.1-RELEASE and FreeBSD 11.3-RELEASE. This book is the result of ongoing work by many individuals. Some sections might be outdated. Those interested in helping to update and expand this document should send email to the FreeBSD documentation project mailing list.

本书最新版本可从 FreeBSD 官网获取。旧版文档可从https://docs.FreeBSD.org/doc/获取。您也可以从 FreeBSD FTP 站点及其众多镜像站点获取这份文档的其它格式,以及压缩形式的版本。如果您希望得到一份印刷版本的手册, 可以从 FreeBSD Mall 购买。除此之外, 您还可以在手册中搜索内容


目录
前言
I. 入门
1. 介绍
1.1. 简介
1.2. 欢迎使用 FreeBSD!
1.3. 关于 FreeBSD 项目
2. 安装 FreeBSD
2.1. 简介
2.2. 最低硬件要求
2.3. 安装前的准备
2.4. 开始安装
2.5. 使用 bsdinstall
2.6. 磁盘分配(分区)
2.7. 获取发行版文件
2.8. 帐户,时区,服务和加固
2.9. 网络接口
2.10. 故障排除
2.11. 使用 Live CD
3. FreeBSD 基础知识
3.1. 简介
3.2. 虚拟控制台和终端
3.3. 基础账户管理
3.4. 权限
3.5. 目录结构
3.6. 磁盘组织
3.7. 挂载和卸载文件系统
3.8. 进程和守护进程
3.9. Shell
3.10. 文本编辑器
3.11. 设备和设备节点
3.12. 手册页
4. 使用 Package 和 Ports 安装应用程序
4.1. 简介
4.2. 软件安装概览
4.3. 寻找您要的应用程序
4.4. 使用pkg管理二进制套件
4.5. 使用Port套件集
4.6. 使用Poudriere编译套件
4.7. 安装后的注意事项
4.8. 处理损坏的Port
5. X Window系统
5.1. 简介
5.2. 术语
5.3. 安装Xorg
5.4. Xorg设定
5.5. 在Xorg使用字体
5.6. X显示管理程序
5.7. 桌面环境
5.8. 安装Compiz Fusion
5.9. 故障排除
II. 一般作业
6. 桌面应用程序
6.1. 简介
6.2. 浏览器
6.3. 办工工具
6.4. 文件阅览程序
6.5. 财务
7. 多媒体
7.1. 简介
7.2. 设定声卡
7.3. MP3音乐
7.4. 视频回放
7.5. 电视卡
7.6. MythTV
7.7. 图像扫描仪
8. 配置 FreeBSD 内核
8.1. 简介
8.2. 为何要编译自定义的核心?
8.3. 侦测系统硬件
8.4. 配置文件
8.5. 编译与安装自定义核心
8.6. 如果发生错误
9. 打印
9.1. 快速开始
9.2. 打印机联机
9.3. 常见的页面描述语言
9.4. 直接打印
9.5. LPD(行列式打印机Daemon)
9.6. 其他打印系统
10. Linux® 二进制兼容模式
10.1. 简介
10.2. 配置 Linux® 二进制兼容模式
10.3. 高级主题
III. 系统管理
11. 设定与调校
11.1. 简介
11.2. 启动服务
11.3. 设定cron(8)
11.4. 管理FreeBSD中的服务
11.5. 设定网络界面卡
11.6. 虚拟主机
11.7. 设定系统日志
11.8. 配置文件
11.9. 使用sysctl(8)调校
11.10. 调校磁盘
11.11. 调校内核限制
11.12. 增加交换空间
11.13. 电源与资源管理
12. FreeBSD开机程序
12.1. 简介
12.2. FreeBSD开机程序
12.3. 设定开机启动画面
12.4. 装置提示
12.5. 关机程序
13. 安全性
13.1. 简介
13.2. 介绍
13.3. 一次性密码
13.4. TCP Wrapper
13.5. Kerberos
13.6. OpenSSL
13.7. VPN over IPsec
13.8. OpenSSH
13.9. 文件系统访问控制表
13.10. 监视第三方安全性问题
13.11. FreeBSD 安全公告
13.12. 进程记帐
13.13. 资源限制
13.14. 使用Sudo分享管理权限
14. Jails
14.1. 简介
14.2. 与 Jail 相关的一些术语
14.3. 创建和控制 Jail
14.4. 微调和管理
14.5. 更新多个 jail
14.6. 使用 ezjail 管理 Jail
15. 强制访问控制
15.1. 简介
15.2. 本章出现的重要术语
15.3. 理解 MAC 标签
15.4. 规划安全配置
15.5. 可用的MAC策略
15.6. 用户锁定
15.7. MAC Jail 中的 Nagios
15.8. MAC 框架的故障排除
16. 安全事件审计
16.1. 简介
16.2. 本章出现的重要术语
16.3. 对审计进行配置
16.4. 管理审计子系统
17. 存储
17.1. 简介
17.2. 添加磁盘
17.3. 调整或增加磁盘
17.4. USB 存储设备
17.5. 创建和使用 CD
17.6. 建立与使用DVD媒体
17.7. 建立与使用软盘
17.8. 基础备份知识
17.9. 以内存为介质的文件系统
17.10. 文件系统快照
17.11. 文件系统配额
17.12. 加密磁盘分区
17.13. 对交换区进行加密
17.14. 高可用性存储(HAST)
18. GEOM: 模块化磁盘变换框架
18.1. 简介
18.2. RAID0 - 条带
18.3. RAID1 - 镜像
18.4. RAID3 - 使用专用校验设备的字节级条带
18.5. 软 RAID 设备
18.6. GEOM Gate 网络设备
18.7. 为磁盘设备添加卷标
18.8. 通过 GEOM 实现 UFS 日志
19. Z 文件系统(ZFS
19.1. 是什么让 ZFS 与众不同
19.2. 快速入门
19.3. zpool 管理
19.4. zfs 管理
19.5. 委托管理
19.6. 高级主题
19.7. 其他资源
19.8. ZFS 特色与术语
20. 其他文件系统
20.1. 简介
20.2. Linux® 文件系统
21. 虚拟化
21.1. 简介
21.2. Mac OS® X Parallels安装 FreeBSD 虚拟机
21.3. 在Windows®的Virtual PC安装FreeBSD为客端
21.4. FreeBSD as a Guest on VMware Fusion for Mac OS®
21.5. 在VirtualBox™使用FreeBSD作为客端
21.6. 使用 VirtualBox™ 虚拟机
21.7. 在 FreeBSD 上使用 bhyve 虚拟机
21.8. 以FreeBSD作为主端安装Xen
22. 本地化 - i18n/L10n 配置和使用
22.1. 简介
22.2. 使用本地化
22.3. 查找本地化应用程序
22.4. 特定语言的语系设定
23. 更新与升级 FreeBSD
23.1. 简介
23.2. FreeBSD更新
23.3. 更新文件集
23.4. 追踪开发分支
23.5. 从源码更新FreeBSD
23.6. 多部机器追踪
24. DTrace
24.1. 简介
24.2. 实现上的差异
24.3. 启用 DTrace 支持
24.4. 使用 DTrace
25. USB 设备模式 / USB OTG
25.1. 简介
25.2. USB大容量储存目标
25.3. USB储存装置
25.4. USB储存装置
IV. 网络通信
26. 序列通信
26.1. 简介
26.2. 串行通信中的术语和硬件
26.3. 终端机
26.4. 拨入服务
26.5. 拨出服务
26.6. 设置串行控制台
27. PPP
27.1. 简介
27.2. 设定PPP
27.3. PPP联机疑难排解
27.4. 在以太网络使用PPP(PPPoE)
27.5. 在ATM使用PPP(PPPoA)
28. 电子邮件
28.1. 简介
28.2. 邮件组件
28.3. Sendmail配置文件
28.4. 更改邮件传输代理程序
28.5. 故障排除
28.6. 高级主题
28.7. 寄件设定
28.8. 在拨号联机使用邮件
28.9. SMTP认证
28.10. 邮件使用者代理程序
28.11. 使用fetchmail
28.12. 使用procmail
29. 网络服务器
29.1. 简介
29.2. inetd超级服务器
29.3. 网络文件系统(NFS)
29.4. 网络信息系统(NIS
29.5. 轻量级目录存取协定(LDAP
29.6. 动态主机设置协定(DHCP
29.7. 域名系统(DNS
29.8. Apache HTTP服务器
29.9. 档案传输协定(FTP
29.10. File and Print Services for Microsoft® Windows® Clients (Samba)
29.11. NTP时间校对
29.12. iSCSI Initiator与Target设定
30. 防火墙
30.1. 简介
30.2. 防火墙的概念
30.3. PF
30.4. IPFW
30.5. IPFILTER (IPF)
30.6. Blacklistd
31. 高级网络配置
31.1. 简介
31.2. 网关和路由
31.3. 无线网络
31.4. USB网络共享
31.5. 蓝牙
31.6. 桥接
31.7. 链路聚合与故障转移
31.8. PXE无盘模式
31.9. IPv6
31.10. 共用地址冗余协议 (CARP
31.11. VLAN
V. 附录
A. 获取 FreeBSD
A.1. CDDVD
A.2. FTP 站点
A.3. 使用Subversion
A.4. rsync 站点
B. 参考资料
B.1. 与 FreeBSD 相关的书籍
B.2. 使用指南
B.3. 管理指南
B.4. 开发指南
B.5. 操作系统原理相关资料
B.6. 安全参考文献
B.7. 硬件参考文献
B.8. UNIX® 历史资料
B.9. 学术期刊,报纸和杂志
C. 网络资源
C.1. 网站
C.2. 邮件列表
C.3. Usenet 新闻组
C.4. 官方镜像
D. PGP公钥
D.1. 官员
FreeBSD 术语表
索引
插图清单
2.1. FreeBSD 引导菜单
2.2. FreeBSD 启动菜单选项
2.3. 欢迎菜单
2.4. 加载键盘布局
2.5. 键盘布局选择菜单
2.6. 键盘布局测试
2.7. 设置主机名
2.8. 选择要安装的组件
2.9. 从网络安装
2.10. 选择分区方式
2.11. 从多磁盘列表中选择一个磁盘
2.12. 选择整个磁盘或分区
2.13. 最终确认
2.14. 选择分区表类型
2.15. 预览已建立的分区
2.16. 最终确认
2.17. 手动创建分区
2.18. 手动创建分区
2.19. 手动创建分区
2.20. ZFS 分区菜单
2.21. ZFS 存储池类型
2.22. 选择磁盘
2.23. 无效选项
2.24. 重新扫描设备
2.25. 分析磁盘
2.26. 存储池名称
2.27. Swap 空加大小
2.28. 最新改动
2.29. 磁盘加密密码
2.30. 初始化加密
2.31. 获取发行版文件
2.32. 校验发行版文件
2.33. 解压发行版文件
2.34. 设置 root 密码
2.35. 选择地区
2.36. 选择国家
2.37. 选择时区
2.38. 确认时区
2.39. 选择日期
2.40. 设置时间
2.41. 选择额外的要启用的服务
2.42. 选择安全加固措施
2.43. 添加用户
2.44. 输入用户信息
2.45. 退出用户和组管理
2.46. 最终配置
2.47. 手动配置
2.48. 完成安装
2.49. 选择一个网络接口
2.50. 扫描无线接入点
2.51. 选择一个无线网络
2.52. WPA2 设置
2.53. 选择 IPv4 网络
2.54. 选择 IPv4 DHCP 设置
2.55. IPv4 静态设置
2.56. 选择 IPv6 网络
2.57. 选择 IPv6 SLAAC 配置
2.58. IPv6 静态配置
2.59. DNS 配置
2.60. 选择一个镜像
31.1. 使用NFS Root Mount进行PXE开机程序
表格清单
2.1. 分区方案
3.1. 管理用户账户的程序
3.2. UNIX® 权限
3.3. 磁盘设备名字
3.4. 常见环境变量
5.1. XDM 配置文件
7.1. 常见错误讯息
9.1. 输出PDL格式
12.1. 加载程序内置指令
12.2. 开机时核心互动参数
13.1. 登入类别限制资源类型
16.1. 默认审计类别
16.2. 审计类的前缀
22.1. 通用语言和国家代码
22.2. 已定义供特定字元集使用的终端机类型
22.3. Ports Collection 中可用的控制台
22.4. 可用的输入方法
23.1. FreeBSD版本与档案库路径
26.1. RS-232C 信号名称
26.2. DB-25对DB-25 Null-Modem线
26.3. DB-9 对 DB-9 Null-Modem 线
26.4. DB-9 对 DB-25 Null-Modem线
29.1. NIS术语
29.2. 其他使用者
29.3. 其他系统
29.4. DNS术语
30.1. 有用的pfctl选项
31.1. 常见路由表标记
31.2. 站台功能代号
31.3. 已保留的IPv6位址
范例清单
2.1. 创建传统的拆分文件系统(Split File System)分区
3.1. 使用超级账户安装程序
3.2. 在 FreeBSD 上添加用户
3.3. rmuser 交互模式删除账户
3.4. 超级用户使用 chpass
3.5. 普通用户使用 chpass
3.6. 改变您的密码
3.7. 作为超级用户修改另一个用户的密码
3.8. 使用pw(8)添加用户组
3.9. 使用pw(8)加入使用者帐号到新的群组
3.10. 使用pw(8)为用户组添加新成员
3.11. 使用id(1)确定组员
3.12. 示例磁盘、Slice 和分区名称
3.13. 磁盘的概念模型
5.1. 在单档中选择Intel®图像驱动程序
5.2. 在单档中选择Radeon图像驱动程序
5.3. 在单档中选择VESA图像驱动程序
5.4. 在单档中选择scfb图像驱动程序
5.5. 在单档中设定屏幕分辨率
5.6. 手动设定显示器频率
5.7. 设定键盘配置
5.8. 设定多个键盘配置
5.9. 开启键盘离开X功能
5.10. 设定鼠标按键数
11.1. 日志服务器设定示例
11.2. 建立交换档
12.1. boot0屏幕截图
12.2. boot2屏幕截图
12.3. /etc/ttys设定不安全的Console
13.1. 建立供SMTP使用的安全信道
13.2. 安全存取POP3服务器
13.3. 跳过防火墙
14.1. 在不信任的Jail做mergemaster(8)
14.2. 在信任的Jail做mergemaster(8)
14.3. 在Jail中执行BIND
17.1. 通过ssh使用dump
17.2. ssh使用dump透过RSH设定
17.3. 使用tar备份当前目录
17.4. 使用tar还原目前目录
17.5. 使用lscpio来制作目前目录的递归备份
17.6. 使用pax备份目前目录
18.1. 为启动磁盘打上标签
23.1. 增加编译工作数
26.1. 设定终端机项目
29.1. 重新库入inetd配置文件
29.2. 使用autofs(5)挂载Export
29.3. /etc/ntp.conf示例
31.1. Cisco®交换机上设置LACP Aggregation
31.2. 故障转移模式
31.3. 以太网络与无线界面间的容错移转模式

前言

目标读者

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

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

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

自第三版以来的改动

目前的在线手册代表了数百位贡献者过去 10 年多所累积的努力成果。以下是自 2004 年出版的两卷第三版之后的一些重要变更:

自第二版 (2004) 以来的改动

第三版是 FreeBSD 文档项目成员两年多的工作成果。印刷版本增长到如此的大小,有必要作为两个单独的卷出版。以下是此新版本的主要变化:

  • 第 11 章 设定与调校 进行了扩充并增加了关于 ACPI 电源和资源管理,cron 系统实用程序,以及更多的内核优化选项的相关内容。

  • 第 13 章 安全性 一章增加了虚拟专用网(VPN),文件访问控制表 (ACLs),以及安全公告的内容。

  • 第 15 章 强制访问控制 是这一版新增的章节。它解释了什么是 MAC,以及这一机制如何使您的 FreeBSD 系统更安全。

  • 第 17 章 存储 在原有基础上增加了 USB 存储设备,文件系统快照,文件系统配额,基于文件及网络的文件系统,以及与加密磁盘分区有关的内容。

  • 第 27 章 PPP 中增加了排除故障的说明。

  • 第 28 章 电子邮件 扩充了新信息,包括使用替代转发代理,SMTP 认证,UUCP, fetchmail, procmail,以及其它高级主题。

  • 第 29 章 网络服务器 是这一版本中全新的内容。本章节包含了有关设置 Apache HTTP Serverftpd、以及为 Microsoft® Windows® 的客户端 Samba 设置一个服务器。第 31 章 高级网络配置 的部分内容已经移至此处用以进一步说明。

  • 第 31 章 高级网络配置 扩展了关于在 FreeBSD 中如何使用 Bluetooth® 设备、设置无线网络,以及设置异步传输模式(ATM)网络的相关内容。

  • 增加了一份词汇表, 用以说明整本书中出现的术语。

  • 对整本书中的表格和图片进行了一些美化。

自第一版(2001)以来的改动

第二版是 FreeBSD 文档项目成员两年多的工作成果。以下是这一版本的主要改动:

本书结构

这本书被分成五个逻辑清晰的部分。第一部分, 开始,包含 FreeBSD 的安装和基本使用。预计读者将按顺序阅读这些章节,可能略过涉及相似话题的章节。第二部分, 一般任务, 涉及一些常用的 FreeBSD 特性。 这一部分和所有后面的部分可以不按顺序阅读。 每一章节以描述该章节内容和读者应会内容为开头。第三部分, 系统管理,涉及管理话题。第四部分,网络通信,涉及网络和服务器话题。第五部分包括参考附录。

第 1 章 介绍

向新用户介绍 FreeBSD 的历史,目标,开发流程。

第 2 章 安装 FreeBSD

本章介绍如何使用 bsdinstall 安装 FreeBSD 9.x及更高版本。

第 3 章 FreeBSD 基础知识

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

第 4 章 使用 Package 和 Ports 安装应用程序

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

第 5 章 X Window系统

本章简要描述X Window System 系统,并特别介绍 X11 在 FreeBSD 上的使用。 此外他也描述了常用的桌面环境,例如 KDEGNOME

第 6 章 桌面应用程序

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

第 7 章 多媒体

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

第 8 章 配置 FreeBSD 内核

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

第 9 章 打印

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

第 10 章 Linux® 二进制兼容模式

介绍了 FreeBSD 的 Linux® 兼容特性。 也提供了许多流行的 Linux® 应用程序的详细的安装说明, 比如 Oracle®Mathematica®

第 11 章 设定与调校

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

第 12 章 FreeBSD开机程序

本章介绍 FreeBSD 的启动流程以及如何使用配置选项控制启动过程。

第 13 章 安全性

本章介绍如何在FreeBSD上使用安全的计算机网络协议,包括 Kerberos、IPsec 和 OpenSSH。

第 14 章 Jails

介绍了 FreeBSD jail 框架,以及它跟传统 chroot 有什么区别。

第 15 章 强制访问控制

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

第 16 章 安全事件审计

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

第 17 章 存储

本章介绍怎样用 FreeBSD 来管理存储介质和文件系统,如物理磁盘、RAID 阵列、光盘和磁带、内存盘以及网络文件系统。

第 18 章 GEOM: 模块化磁盘变换框架

本章介绍 GEOM 框架是什么,如何用它配置软 RAID。

第 20 章 其他文件系统

本章介绍 FreeBSD 支持的非原生文件系统,比如 Sun™ 的 Z 文件系统。

第 21 章 虚拟化

本章介绍 FreeBSD 上的虚拟化系统以及如何在虚拟机中安装 FreeBSD。

第 22 章 本地化 - i18n/L10n 配置和使用

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

第 23 章 更新与升级 FreeBSD

介绍了 FreeBSD-STABLE、FreeBSD-CURRENT 以及 FreeBSD 发行版本之间的差异。描述了一般用户如何紧跟开发过程并从中受益。涵盖了如何更新用户的系统至发行版最新安全修正的方法。

第 24 章 DTrace

本章描述了如何在 FreeBSD 上配置和使用 Sun™ DTrace。动态跟踪可以通过实时的系统分析,帮助找出系统性能瓶颈。

第 26 章 序列通信

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

第 27 章 PPP

本章描述了FreeBSD 如何用用 PPP 连接远程系统。

第 28 章 电子邮件

本章介绍电子邮件服务器的不同组件元素,并探究最流行的邮件服务器软件的简单配置:sendmail.

第 29 章 网络服务器

提供了详细的说明和示例配置文件以说明如何将你的 FreeBSD 计算机配置为一台网络文件系统服务器, 域名服务器, 网络信息服务器或时间同步服务器。

第 30 章 防火墙

本章绍基于软件的防火墙背后的原理,并提供在 FreeBSD 系统之下可用的不同防火墙配置的详细信息。

第 31 章 高级网络配置

本章介绍多个网络主题,包括在你的局域网里与其他计算机共享Internet连接、高级路由主题、无线网络。Bluetooth®, ATM, IPv6, 等等。

附录 A, 获取 FreeBSD

列出了可以获取FreeBSD CD或DVD介质的不同资源,以及Internet上允许您下载和安装FreeBSD的不同站点。

附录 B, 参考资料

本手册涉及众多方面的知识,这可能让你产生强烈的愿望以了解更多更详细的内容,本手册参考书目列出了许多在本手册正文中所引用的优秀书籍,可能会对你有所帮助。

附录 C, 网络资源

介绍了一些可供FreeBSD用户发布问题和参与有关FreeBSD技术交流的论坛。

附录 D, PGP公钥

列出了几个FreeBSD 开发人员的PGP签名。

本手册使用的惯例

为了使手册内容前后具有一致性并易于阅读,本手册遵循了如下几个惯例。

排版惯例

斜体

斜体字体用于文件名、URLs、强调文本(引起读者注意),以及某一专业术语的主要用法。

等宽字体

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

粗体

粗体字用于应用程序、命令和关键字。

用户输入

键盘键入用 粗体来区别于其他文字。 要同时键入的按键组合在键之间以`+'显示,例如:

Ctrl+Alt+Del

这表示你需要同时按下 CtrlAlt,和 Del 键。

按顺序依次键入的按键用逗号隔开,例如:

Ctrl+X, Ctrl+S

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

示例

C:\>开头的示例表明这是一个MS-DOS® 命令。除非另有注明,这些命令都可以在Microsoft® Windows® 命令提示符中运行。

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

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

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

% 开头的示例表明该命令可以由普通用户执行。除非另有注明,否则默认用于设置环境变量和其他shell命令的是C-shell语法。

% top

鸣谢

你手中这本手册中聚集了全世界数百人的努力,无论他们贡献的是对错误行文的纠正,亦或提交的是完整的章节,所有的贡献都是有益的。

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

部分 I. 入门

第 1 章 介绍

Restructured, reorganized, and parts rewritten by Jim Mock.

1.1. 简介

感谢您对 FreeBSD 的关注!下面的章节将介绍 FreeBSD 项目的各个方面,例如它的历史、目标、发展模式等等。

读完本章节,你将会知道:

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

  • FreeBSD 历史。

  • FreeBSD 项目的目标。

  • FreeBSD 开源发展模式的基本知识。

  • 当然还有:FreeBSD 的名字从何而来。

1.2. 欢迎使用 FreeBSD!

FreeBSD 是一个开源的、符合标准的类 Unix 操作系统,适用于 x86( 32 位和 64 位), ARM®、 AArch64、 RISC-V®、 MIPS®、 POWER®、 PowerPC®、和 Sun UltraSPARC® 电脑。它提供了当下操作系统所应具备的所有功能,例如抢占式多任务处理、内存保护、虚拟内存、多用户设施、SMP 支持、针对不同语言和框架的开源开发工具、以及以 X Window 系统为中心的的桌面,例如 KDE 或 GNOME。 它的优势是:

  • 自由开放源码许可证 , 它授予你自由修改和扩展源代码,并将其合并到开源项目和闭源产品中的权利,但不能对著佐权许可证添加特殊限制,这也避免了潜在的许可证不兼容的问题。

  • 强大的 tcp/ip 网络 -FreeBSD实现行业标准协议, 性能和可扩展性不断提高。这使得它在服务器和常规/防火墙角色中都很好地匹配--事实上, 许多公司和供应商正是为此目的使用它。

  • 完善的 OpenZFS 支持 - 支持包括 root-on-ZFS、从 ZFS 分区启动系统,错误管理,委托管理、jails 支持、FreeBSD 文档支持和系统安装器支持。

  • 完善的安全支持,从强制访问控制(MAC)框架到 Capsicum 支持以及沙盒组件。

  • 超过三万个预编译软件包 为所有支持的硬件架构,还有 Ports 让您更容易自定义软件。

  • 文档 - 除了操作手册和其他关于系统运维和内核手册以外,还有 man(1)文档,涵盖用户层套件、配置文件、内核驱动 API(第九章)和独立驱动(第四章)。

  • 简单一致的代码组织结构和构建系统 - FreeBSD将内核与用户空间代码都放在一个仓库中。构建系统简单且易于定制。这让您可以轻易将 FreeBSD 和您自己的产品结合在一起。

  • 坚持 Unix 哲学,一个程序只关注一个目标,并尽可能把它做好。让程序能够互相协同工作。复杂程序由多个简单程序组成。

  • Linux 二进制兼容层可以让 Linux 程序直接运行在 FreeBSD 上,不需要使用虚拟化技术。

FreeBSD是基于加州大学伯克利分校计算机系统研究小组(CSRG)发布的4.4BSD-Lite版本,并继承了 BSD 系统开发的优良传统。除了 CSRG 出色的工作之外, FreeBSD 项目花费了非常多的时间来优化调整系统,使其在真实负载情况下拥有最好的性能和可靠性。FreeBSD提供与其他开源和商业产品同等的性能和可靠性,以及其他任何产品都不提供的先进功能。

1.2.1. FreeBSD 能做什么?

FreeBSD可以应用的方面超乎你的想象,从软件开发到工厂自动化,从库存控制到远程卫星天线的方位角校正;如果可以使用商业UNIX®产品来完成,那么你也同样可以使用FreeBSD来完成它!FreeBSD还受益于世界各地的研究中心和大学开发的数以千计的高质量应用程序,它们通常以很少的成本提供。

由于 FreeBSD 自身的源代码很容易获得, 所以对于特定的应用程序或项目,可以对系统进行最大限度的个性化定制。 这对于大多数主流的商业操作系统来说几乎是不可能的。 以下只是人们当前使用FreeBSD的一些应用程序的示例:

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

    • Web 服务器

    • IPv4 and IPv6 路由

    • 防火墙 and NAT (IP 伪装) 网关

    • FTP 服务器

    • Email 服务器

    • 还有更多……

  • 教育:你是计算机科学还是相关工程专业的学生?在学习操作系统、计算机体系结构和网络方面,没有比在 FreeBSD 提供的实际操作经验更好的方法了。许多免费提供的CAD、数学和图形设计软件包也使它对那些对计算机的主要兴趣是完成其他工作的人来说,非常有用!

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

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

  • 嵌入式系统 FreeBSD是构建嵌入式系统的优秀平台。 它支持 ARM®, MIPS® and PowerPC®平台,加上强大的网络堆叠、尖端功能和自由许可 BSD 许可 FreeBSD为构建嵌入式路由器、防火墙和其他设备奠定了良好的基础。

  • 桌面: FreeBSD 提供开源的的 X11 服务器,是使用廉价PC的最佳解决方案。FreeBSD 提供了许多开源桌面环境的解决方案, 包括 GNOMEKDE 图形用户界面。FreeBSD 甚至可以从中央服务器 无盘启动 ,使单个工作站更便宜、更易于管理。

  • 软件开发: FreeBSD 的基本系统配备了完整的开发工具,包括一个完整的 C/C++ 编译器和调试器套件。其他编程语言还可以通过 Port 和二进制软件包来获得支持。

FreeBSD 可以免费下载,或可从CD-ROM,DVD 获取。请查阅附录 A, 获取 FreeBSD获取更多信息。

1.2.2. 谁在使用 FreeBSD?

许多知名网络提供商和网站正在使用 FreeBSD。例如Hacker NewsNetcraft网易Netflix新浪Sony JapanRamblerYahoo!Yandex

FreeBSD先进的功能,成熟的安全性,可预测的发布周期以及自由的授权条款,让 FreeBSD 已经被用来做为建立许多商业,开源应用,装置以及产品的平台,有许多世界上最大的资讯公司使用 FreeBSD:

  • Apache - Apache 软件基金会中大部分面向大众的基础设施,包括(可能是)世界上最大的 SVN 仓库(拥有超过140万次提交)运行在 FreeBSD 上。

  • Apple - OS X大量借鉴 FreeBSD 的网络栈,虚拟文件系统以及许多用户空间的元件。Apple iOS中含有从 FreeBSD 借鉴来的元素。

  • Cisco - IronPort 网络安全及反垃圾邮件设备是采用修改版 FreeBSD 内核。

  • Citrix - NetScaler 系列安全设备提供 4-7 层负载均衡、内容缓存、应用防火墙、安全 VPN 和移动云网络访问,以及 FreeBSD shell 的强大功能。

  • Dell EMC Isilon - Isilon 的企业存储设备的操作系统基于 FreeBSD。FreeBSD极其宽松的许可允许 Isilon 将他们的知识产权整合到整个内核中,并专注于构建他们的产品,而不是操作系统。

  • Quest KACE - KACE 系统管理设备中使用了 FreeBSD,因为 FreeBSD 的可靠性,可扩展性以及支持其持续发展的社群。

  • iXsystems - 统合存储(统一存储)设备的TrueNAS产品线是以FreeBSD为基础。除了该公司自己的商业产品外,iXsystems也管理着TrueOS和FreeNAS两个开源计划的开发。

  • Juniper - JunOS作业系统驱动了所有的Juniper网络设备(包括路由器,交换器,安全与网络设备)便是以FreeBSD为基础.Juniper在众多厂商之中,展现了计划与商业产品供应商之间的共生关系。由Juniper所开发的改进内容会回馈给FreeBSD来降低未来新功能从FreeBSD整合回JunOS的复杂性。

  • McAfee - SecurOS是McAfee企业防火墙产品的基础,其中包含了Sidewinder,也是以FreeBSD为基础。

  • NetApp - 存储设备中的Data ONTAP GX产品线是以FreeBSD为基础。除此之外,NetApp还贡献了回FreeBSD许多功能,包括新BSD条款授权的管理程序,bhyve。

  • Netflix - Netflix用来以串流传送电影到客户的OpenConnect设备是以FreeBSD为基础.Netflix也做了大量贡献到程式码库,并致力于维持与主线FreeBSD的零修正关系.Netflix的OpenConnect设备负责了北美所有的网路流量32%以上。

  • Sandvine - Sandvine使用FreeBSD作为它的高性能即时网路处理平台的基础来建立它们的智慧网路策略控制产品。

  • Sony - PlayStation 4游戏主机使用了修改过的FreeBSD版本来运作。

  • Sophos - Sophos电子邮件设备产品是以加强防护(Hardened)的FreeBSD为基础,可扫描入站邮件中的垃圾邮件和病毒,同时也可监控出站邮件中的恶意软体及敏感资讯。

  • Spectra Logic - 储藏级储存设备的nTier产品线以FreeBSD和OpenZFS来运作。

  • Stormshield - Stormshield网路安全设备使用了硬体化版本的FreeBSD做为基础,BSD授权条款让他们可将其智慧财产与系统整合并同时回馈大量有趣的发展给社群。

  • The Weather Channel - 被安装在各地有线电视营运商前端,负责加入当地天气预报到有线电视网路节目的IntelliStar设备便是使用FreeBSD。

  • Verisign - VeriSign主要经营.com与.net根网域名称注册业务以及随附的DNS基础设施运作。这些基础设施的运作仰赖各种不同的网路作业系统包括FreeBSD来确保不会有单点故障的问题。

  • Voxer - Voxer使用了FreeBSD的ZFS来驱动行动语音通讯平台,让Voxer从Solaris改使用FreeBSD的原因是FreeBSD拥有详尽的文件,更大型且活跃的社群,较便利的开发人员环境。除了提供关键的ZFS和DTrace功能之外FreeBSD的ZFS也支援了TRIM。

  • Fudo Security - FUDO安全性设备让企业可以监控,控制,记录以及这些功能皆是以FreeBSD最佳的安全性功能为基础,包括ZFS,GELI,Capsicum,HAST及auditdistd。

FreeBSD 有一些衍生的开源项目:

  • BSD Router - 以FreeBSD为基础的大型企业路由器替代方案,专门设计为可在标准PC硬体上运作。

  • FreeNAS - 专为网路档案服务器设备使用所设计的FreeBSD。提供了以Python为基础的网页介面来简化UFS与ZFS文件系统的管理,支援了NFS,SMB / CIFS,AFP,FTP与iSCSI,还有以FreeBSD Jail为基础的套件系统。

  • GhostBSD - 基于 FreeBSD,使用 GTK 环境,提供了舒适美观的原生UNIX®工作环境。

  • mfsBSD - 用来建置可完全从记忆体执行FreeBSD系统映像档工具。

  • NAS4Free - 以FreeBSD及PHP驱动网页介面为基础的档案伺服器。

  • OPNSense - OPNsense是一个以FreeBSD为基础的开源,易于使用及易于建置的防火墙和路由平台.OPNsense有大多数在昂贵的商业防火墙上才有的功能。它带来了商业产品的丰富功能集,同时拥有开放和安全的来源。

  • TrueOS - TrueOS 基于 FreeBSD-CURRENT,着重稳定和安全。提供最新的软件包、安全更新、驱动支持。

  • FuryBSD 是一个基于 FreeBSD,面向桌面用户的操作系统。FuryBSD 以其图形界面向过去的桌面 BSD 项目致敬,如 PC-BSD 和 TrueOS,并增加了额外的工具,如 live/hybrid USB/DVD 映像。FuryBSD 在BSD许可证下发布,可免费使用。

  • MidnightBSD - 是一个FreeBSD衍生的操作系统,它是以桌面用户为中心开发的。它包含了您日常工作所需的所有软件:邮件、网页浏览、文字处理、游戏等等。

  • pfSense -基于 FreeBSD 的防火墙发行版, 支援巨型阵列及大规模IPv6。

  • ZRouter - 基于 FreeBSD 的开源路由器固件。专门设计用于替代现有路由器上的闭源固件。

一份列出了使用 FreeBSD 服务器或者服务的公司的清单,可以在 FreeBSD 基金会官网查到: 维基百科也有一份类似的清单 基于 FreeBSD 的产品.

1.3. 关于 FreeBSD 项目

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

1.3.1. 简述 FreeBSD 历史

FreeBSD 项目起源于 1993 年早期,部分代码源于 Unofficial 386BSD Patchkit 的副产物,Patchkit 的最后 3 个协调维护人是:Nate Williams, Rod Grimes 和 Jordan Hubbard。

我们最初的目标是做出一份 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 不太可能像它今天这样,影响如此深远, 发展如此快速。

第一个 CD-ROM (以及在整个互联网范围内发行的) 发行版本是 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 中的一大部分内容成为 受限的 (encumbered) 和属于 Novell 知识产权的代码, 而后者在不久前刚刚从 AT&T 收购了这些产权; 作为回报, Berkeley 得到了来自 Novell 的 许诺, 在 4.4BSD-Lite 版本正式发布时, 可以声明为不受限的 (unencumbered), 现有的 Net/2 用户则强烈建议转移到这个版本。 这包括了 FreeBSD, 而我们的项目则被允许在 1994 年 6 月底之前继续发行基于 Net/2 的产品。 根据和解协议, 在最后期限之前我们发布了一个最终版本, 这个版本是 FreeBSD 1.1.5.1。

接下来, FreeBSD 开始了艰苦的从全新的、 不太完整的 4.4BSD-Lite 重新编写自己的过程。 Lite 版本中, Berkeley 的 CSRG 删除了用于让系统能够引导的一大部分代码 (由于各种各样的法律需求), 而当时 4.4 在 Intel 平台的移植版本还有很多工作没有完成。 直到 1994 年 11 月, 我们的项目才完成了这项过渡, 并通过网络以及 CD-ROM (在 12 月底) 上发布了 FreeBSD 2.0。 尽管系统中还有很多比较粗糙的地方, 这个版本还是取得了巨大的成功, 并在 1995 年 6 月发布了更强大和易于安装的 FreeBSD 2.0.5 版本。

从那时候开始,每当对旧版本的功能,速度及特性进行改进后便会发布一系列新版本。

目前,长期开发项目处在13.X-CURRENT(trunk)分支。快照版本处在12.X分支。可以在快照服务器 看到发布进程。

1.3.2. FreeBSD 项目目标

贡献者: Jordan Hubbard.

FreeBSD 项目的目标是提供可用于任何目的且不附加任何条件的软件。我们当中的许多人对代码 (和项目) 有大量投资,当然不会介意偶尔从中获得一点经济补偿,但我们绝对不准备一直这样做。我们认为,我们的首要使命是为任何人提供代码,无论其出于何种目的,以便代码得到尽可能广泛的使用,并提供尽可能广泛的好处。我认为,这是自由软件最基本的目标之一, 也是我们孜孜不倦所追求的目标。

我们的源代码树中有一些是以 GNU 通用公共许可证(GPL)或较宽松通用公共许可证(LGPL)协议发布的,他们附带的说明文字略多,但至少是要求开源而不是闭源。然而,由于GPL软件的商业用途可能会产生难以预料的麻烦。如果可以选择,我们确实更喜欢在更为宽松的 BSD 协议下发布软件。

1.3.3. FreeBSD 开发模式

Contributed by Satoshi Asami.

FreeBSD 的开发是一个非常开发和轻松的过程。实际上,FreeBSD 构建于世界各地成千上万的贡献之上。比如我们的贡献者名单。FreeBSD 的开发架构允许数千个开发者通过网络进行协作。我们欢迎新的新的开发者加入我们,带给我们更多灵感。希望加入 FreeBSD 开发的朋友可以联系FreeBSD 技术讨论列表。希望了解 FreeBSD 工作动态的用户可以订阅FreeBSD 公告邮件列表

了解 FreeBSD 项目及其开发过程的有用信息,无论是独立工作还是密切合作:

SVN 源

几年来, FreeBSD 的中心源代码树一直由CVS (并发版本系统) (并行版本系统) 维护,这是一个免费的源代码控制工具。2008年6月,该项目改用SVN (Subversion)。由于源代码树的迅速扩展和已经存储的历史量, CVS 所施加的技术限制变得越来越明显,因此这种转换是必要的。文档项目和 Port 存储库也分别于2012年5月和2012年7月从 CVS 转移到 SVN。有关获取 FreeBSD src/信息请参考Obtaining the Source,有关使用 Port 的详细信息, 请参阅Using the Ports Collection

Committer 列表

committer是具有对 Subversion 仓库的写入访问权限的人员,并有权对 FreeBSD 源进行修改(术语提交器来自提交,源代码管理命令用于向存储库中引入新更改)。任何人都可以将 Bug 提交到Bug 数据库。在提交 Bug 报告之前,FreeBSD 邮件列表、IRC 频道或论坛可用于帮助验证问题实际上是 Bug。

FreeBSD 核心团队

The FreeBSD core team would be equivalent to the board of directors if the FreeBSD Project were a company. The primary task of the core team is to make sure the project, as a whole, is in good shape and is heading in the right directions. Inviting dedicated and responsible developers to join our group of committers is one of the functions of the core team, as is the recruitment of new core team members as others move on. The current core team was elected from a pool of committer candidates in July 2018. Elections are held every 2 years.

注意:

与大多数开发人员一样, 核心团队的大多数成员在 FreeBSD 开发方面也是志愿者, 在财务上并不受益, 因此 承诺 也不应被误解为 有保证支持的含义 董事会 上面的类比不是很准确, 也许更适合说, 这些人放弃了自己的生命, 支持 FreeBSD, 反对他们更好的判断!

外部贡献者

最后, 但绝对不是最不重要的, 最大的开发人员组是用户自己, 他们几乎不断地向我们提供反馈和错误修复。与 FreeBSD 更非集中的开发保持联系的主要方式是订阅 FreeBSD 技术讨论邮件列表 在这种情况下事情的讨论。有关各种 FreeBSD 邮件列表的详细信息, 请参阅 附录 C, 网络资源

The FreeBSD 贡献者名单 是一个漫长而不断发展的过程,那么为什么不加入它,在今天就把一些东西贡献给 FreeBSD 呢?

提供代码并不是为项目做出贡献的唯一方式;有关需要做的事情的更完整的清单, 请参阅 FreeBSD 项目网站

总之, 我们的开发模型被组织为一组松散的同心圆。集中式模型是为了方便 用户 FreeBSD, 他们提供了一种简单的方法来跟踪一个中央代码库, 而不是不让潜在的贡献者!我们的愿望是提供一个稳定的操作系统与大量的相干 application programs。用户可以轻松地安装和使用-这种模型在实现这一目标非常好的工作。

我们所要求的是那些愿意加入我们的 FreeBSD 开发者,是它现在的人对它的持续成功所做的一些同样的奉献!

1.3.4. 第三方软件

除了基本发行版外, FreeBSD 还提供了一个移植的软件集合,其中包含数千个通常需要的程序。在撰写本文时, 有超过 24, 000个 Port!Port 列表的范围从 http 服务器到游戏、语言、编辑器, 以及介于两者之间的几乎所有内容。整个 Port 集合需要大约 500 MB。若要编译Port。只需更改为要安装的程序的目录。键入 make install,并让系统完成其余操作。您生成的每个端口的完整原始分发将动态检索,因此您只需要足够的磁盘空间即可生成所需的端口。几乎每个 Port 也都是作为预编译的 提供的,不希望从源编译自己的端口的人可以使用命令 ( pkg install ) 进行安装。有关包和 Port 的更多信息, 请参见第 4 章 使用 Package 和 Ports 安装应用程序

1.3.5. 附加文档

所有受支持的 FreeBSD 版本都在安装程序中提供了一个选项, 可以在初始系统安装过程中在/usr/local/share/doc/freebsd下安装其他文档。文档也可以在以后使用 第 23.3.2 节 “自Port更新说明文件”中所述的软件包在以后的任何时间安装。您可以使用以下 Url 查看本地安装的手册以及任何支持 HTML 的浏览器:

您还可以在 https://www.FreeBSD.org/中查看主副本 (也是最经常更新的副本)。

第 2 章 安装 FreeBSD

Restructured, reorganized, and parts rewritten by Jim Mock.
Updated for bsdinstall by Gavin AtkinsonWarren Block.
Updated for root-on-ZFS by Allan Jude.

2.1. 简介

这里有一些方法运行 FreeBSD,如何选择取决于您的使用环境,它们是:

  • 虚拟机镜像,可从此处下载。提供 qcow2(用于 KVM),vmdk(用于 VMware),vhd(用于 Hyper-V),raw 格式镜像。此镜像并非安装镜像,他们已经被设置好,可在虚拟机中直接使用。

  • 提供FreeBSD镜像的云服务商: AWS Marketplace, Microsoft Azure MarketplaceGoogle Cloud Platform。 要在 Azure 上部署 FreeBSD 请参考章节 Azure Documentation

  • SD 卡镜像,适用于树莓派或比格尔黑等嵌入式系统。这些可以从 获取 FreeBSD 页面下载。这些文件必须未压缩并作为原始映像写入 SD 卡, 然后将主板设置成从 SD 卡启动。

  • 安装镜像,用于将 FreeBSD 安装在普通电脑或服务器的硬盘上。

本章的其余部分介绍了第四种情况,介绍了如何使用基于文本的 bsdinstall 安装程序安装 FreeBSD。

通常,本章中的安装说明是为 i386 ™ 和 amd64 架构编写的。在适用的情况下,将列出特定于其他平台的说明。安装程序与此处显示的内容之间可能存在细微差异, 因此请将本章用作一般指南, 而不是一组文字说明。

注意:

喜欢使用图形界面的 FreeBSD 用户可以试试 FuryBSD, GhostBSDMidnightBSD

读完本章节,你将会知道:

  • 安装 FreeBSD 所需的最低硬件配置以及其支持的架构。

  • 如何创建 FreeBSD 安装媒介。

  • 如何启动 bsdinstall

  • 运行bsdinstall时需要回答的问题, 问题的具体含义, 以及应该如何回答。

  • 如何排除安装故障。

  • 如何在安装前获取 FreeBSD 的最新版本。

在阅读这个章节之前,您应当:

  • 阅读要安装的 FreeBSD 附带的支持硬件列表,并确认系统中的硬件都被支持。

2.2. 最低硬件要求

安装 FreeBSD 的硬件要求因架构而异。FreeBSD 版本支持的硬件架构和设备列在FreeBSD Release Information页上。 FreeBSD download page也有为不同体系结构选择正确图像的建议。

安装 FreeBSD 至少需要 96 MB 的 RAM和 1.5 GB 的可用硬盘空间。但是,如此少量的内存和磁盘空间实际上只适用于自定义应用程序(如嵌入式设备)。通用桌面系统需要更多的资源。建议RAM 为 2-4G或更多,硬盘容量大于 8G。

这里是对每个架构的处理器要求:

amd64

这是最常见的桌面及笔记本处理器类型,被多数现代系统所使用。Intel® 称它为 Intel64。其他生产商有时将它称作 x86-64

兼容 amd64 的处理器的例子有:AMD Athlon™64, AMD Opteron™,多核 Intel® Xeon™,以及 Intel® Core™ 2 和之后的处理器。

i386

更老的桌面及笔记本经常使用这个32位的 x86 架构。

几乎所有的兼容 i386 并且有浮点运算单元的处理器都被支持。所有Intel® 486 及之后的处理器都被支持。

FreeBSD 将在 CPU 上利用物理地址扩展 (PAE) 支持这个功能。启用 PAE 功能的内核将检测到 4 GB 以上的内存, 并允许系统使用它。然而, 使用 PAE 会对 FreeBSD 的设备驱动程序和部分功能造成限制。

powerpc

支持所有内建 USB 的 New World Apple® Mac® 系统, 同时也为配置多 CPU 的机器提供CPU支持。

注意 32 位的内核只能使用内存的前 2 GB。

sparc64

有关 FreeBSD/sparc64 的系统支持, 详见 FreeBSD/sparc64 项目。

具有 1 个以上处理器的所有系统都支持SMP。需要独占一块磁盘。 目前还不支持与其他操作系统共享同一块磁盘。

2.3. 安装前的准备

确认硬件满足 FreeBSD 最低硬件需求后,下架安装镜像并将用它制作好安装介质。在安装前,请阅读下面部分确认是否可以安装系统:

  1. 备份重要数据

    在安装任何操作系统之前都应备份好重要数据。不要将备份数据放在将要装系统的硬盘上,应将其保存在 U 盘或其他存储设备中。在安装前再次检查重要数据是否备份完成。一旦安装程序格式化系统盘,存储在该磁盘上的所有数据都将被抹去。

  2. 决定在哪里安装 FreeBSD

    如果仅安装 FreeBSD,那这个步骤可以被跳过。但是,如果 FreeBSD 会和另一个操作系统共享磁盘,那么您需要决定哪个磁盘或者分区将会被用于安装 FreeBSD。

    在 i386 和 amd64 架构中。磁盘可使用两种分区表分割成多个分区(partitioning )。传统的MBRMaster Boot Record)分区表可设置四个主分区(由于历史原因,FreeBSD 中将主分区称作 slices(分片))。主分区可由一个包含多个逻辑分区的扩展分区组成。GUID 分区表(GPT)是一种新的、更简单的磁盘分区方法。GPT 允许每个磁盘最多有 128 个分区,这样就不需要逻辑分区了。

    FreeBSD 引导加载程序需要主分区或 GPT 分区。如果所有主分区或 GPT 分区都已在使用中, 则必须为 FreeBSD 创建一个分区。若要在不删除现有数据的情况下创建分区, 请使用分区调整大小工具收缩现有分区, 并使用释放的空间创建新分区。

    一个分区工具列表可在维基百科中查看。GParted Livehttp://gparted.sourceforge.net/livecd.php)是一个开源的 live CD,它包含了 GParted 分区编辑器。许多 Linux 发行版中也预装了 GParted。

    警告:

    如果使用恰当的话,磁盘缩减工具可被用于安全地为一个新分区创造空间。因为有选错分区的可能性,请务必在修改磁盘分区前备份任何重要数据,并且验证备份的完整性。

    包含不同操作系统的磁盘分区使在一台计算机上安装多个操作系统成为可能。另一种方法是使用虚拟化 (第 21 章 虚拟化), 它允许多个操作系统同时运行, 而无需修改任何磁盘分区。

  3. 收集网络信息

    FreeBSD的某些安装方法需要通过网络来下载所需的安装文件。安装完成后,安装程序将提供设置网络接口的选项。

    如果网络上有一个DHCP服务器,那么它可被用于提供自动网络配置。如果DHCP不可用,那么系统的以下网络信息必须从本地网络管理员或者互联网服务提供商处获得:

    必须的网络信息
    1. IP 地址

    2. 子网掩码

    3. 默认网关的 IP 地址

    4. 网络的域名

    5. 网络的 DNS 服务器的 IP 地址

  4. 检查 FreeBSD 勘误表

    尽管 FreeBSD 项目努力确保 FreeBSD 的每个版本都尽可能稳定, 但错误(bug)偶尔会逐渐进入这个过程。在极少数情况下, 这些错误会影响安装过程。随着这些问题的发现和解决,它们在 FreeBSD errata (https://www.freebsd.org/releases/12.1R/errata.html) 中得到了说明。在安装前检查 errata,以确保没有可能影响安装的问题。

    所有版本的信息和勘误(errata)可在 FreeBSD 网站的发布信息部分找到 (https://www.freebsd.org/releases/index.html)。

2.3.1. 准备安装媒介

FreeBSD 安装器并不是一个能在另一个操作系统中运行的应用程序。请下载一个 FreeBSD 安装文件,将其烧录到与其文件类型与大小相对应的媒介上(CDDVD,或USB),随后用装入的媒介启动来安装。

FreeBSD 安装文件可在www.freebsd.org/where.html#download下载。每个安装文件的名称都包括 FreeBSD 的发行版本、体系结构和文件类型。例如, 要用 DVD 在 amd64 系统上安装 FreeBSD 12.1,请下载FreeBSD-12.1-RELEASE-amd64-dvd1.iso, 将此文件刻录到 DVD, 然后通过 DVD启动。

安装文件有几种可用格式。格式依计算机架构与媒介类型而有所不同。

其他安装文件包括使用UEFI(统一可扩展固件接口)启动的计算机。这些文件的名称中含有字符串uefi

文件类型:

  • -bootonly.iso:这是最小的安装文件,因为它只包含安装程序。安装过程中需要保持的 Internet 连接,因为安装程序将下载 FreeBSD 安装所需的文件。应使用 CD刻录软件来刻录 CD

  • -disc1.iso:此文件包含安装 FreeBSD、其源和端口集合所需的所有文件。它应该刻录到 CD 使用 CD 刻录应用程序。

  • -dvd1.iso:此文件包含安装 FreeBSD、其源和端口集合所需的所有文件。它还包含一组用于安装窗口管理器和某些应用程序的流行二进制包, 以便在不需要连接到 Internet 的情况下, 可以从媒体安装完整的系统。应使用 DVD 刻录应用程序将此文件刻录到 DVD

  • -memstick.img:此文件包含安装 FreeBSD、其源和端口集合所需的所有文件。它应该刻录到 USB 棒按照下面的说明。

  • -mini-memstick.img-bootonly.iso一样, 不包括安装文件, 而是根据需要下载它们。安装过程中需要正常工作的互联网连接。将此文件写入 USB 棒, 如第 2.3.1.1 节 “将镜像文件写入 USB所示。

下载镜像文件后,请下载同一路径下的CHECKSUM.SHA256。计算镜像文件的 校验和。FreeBSD 为此提供sha256(1)用作 sha256镜像文件名。在其他操作系统上也有类似的程序。

将计算出的校验和与CHECKSUM.SHA256 中显示的校验和进行比较。校验和必须完全匹配。如果校验和不匹配,则镜像文件已损坏或被篡改,必须重新下载。

2.3.1.1. 将镜像文件写入 USB

*.img 文件是适用于U盘的完整镜像不能作为文件复制到目标设备。有几个应用程序可用于将 *.img 文件写入USB设备。本节介绍其中的两个实用程序。

重要:

在继续操作之前,备份U盘上的所有重要数据。此过程将删除U盘上所有数据。

过程 2.1. 使用 dd 来写入镜像

警告:

本示例使用 /dev/da0作为将在其中写入图像的目标设备。要 非常小心的选择要写入的设备, 因为此命令将破坏指定目标设备上的现有数据。

  • dd(1)命令行程序可在BSD、Linux和macOS®上使用。 ®要使用dd刻录镜像,请插入U盘并确定其设备名称。然后,指定下载的安装文件的名称和U盘的设备名称。本示例将 amd64 安装映像刻录到现有 FreeBSD 系统上的第一个USB设备。

    # dd if=FreeBSD-12.1-RELEASE-amd64-memstick.img of=/dev/da0 bs=1M conv=sync

    如果此命令失败,请验证U盘是否正确挂载,设备名是否对应。某些操作系统可能需要此命令与sudo(8)一起运行。dd(1)语法在不同的平台上略有不同;例如,macOS® 需要小写bs=1m。像Linux®这样的系统可能会缓冲写入。要强制完成所有写入操作,请使用sync(8)

过程 2.2. 使用Windows®来写入镜像

警告:

请务必提供正确的驱动器号, 因为指定硬盘上的现有数据将被覆盖和销毁。

  1. 获取 Image Writer for Windows®

    Image Writer for Windows®是一个免费的软件, 可以正确地将镜像文件写入U盘。从https://sourceforge.net/projects/win32diskimager/ 下载它并将其解压到一个文件夹中。

  2. 使用 Image Writer 写入镜像

    双击图标 Win32DiskImager 运行程序后, 确定 Device 下面显示的驱动器号所对应的U盘。 点击文件夹图标以选择需要写入的映像文件, 然后点击 [ Save ] 接受选择。 在确认所有操作无误且没有其他窗口访问记忆棒后, 点击 [ Write ] 将映像文件写入U盘。

现在你已经准备好安装 FreeBSD 了。

2.4. 开始安装

重要:

默认情况下,安装过程在以下消息之前不会对磁盘做任何改动:

Your changes will now be written to disk. If you
have chosen to overwrite existing data, it will
be PERMANENTLY ERASED. Are you sure you want to
commit your changes?

在此警告之前,安装过程可随时退出。如果担心有不正确配置的项目,只要在此之前关闭计算机,那就不会对系统中的磁盘做出任何改动。

本节介绍如何从使用第 2.3.1 节 “准备安装媒介” 中的说明准备的安装介质启动系统。使用可启动的 U 盘时,请先插入 U盘,然后再打开计算机。从 CD DVD 启动时,请打开计算机并在第一时间插入介质。如何将系统配置为从插入的媒体启动取决于体系结构。

2.4.1. 引导 i386™ 及 amd64 系统

这些体系结构提供了用于选择引导设备的BIOS菜单。根据所使用的安装介质,选择CD/DVDUSB设备作为第一个引导设备。大多数系统还提供在启动期间选择启动设备的快捷键,而无需进入BIOS。通常,快捷键是F10, F11, F12, 或 Escape

如果计算机加载现有的操作系统而不是 FreeBSD 安装程序,则:

  1. 安装介质在启动过程中没有被装入得足够早。保持安装介质装入的情况下尝试重启计算机。

  2. BIOS 改动不正确或者未保存。重新检查正确的启动设备是否被设置成了优先启动设备。

  3. 此系统太旧, 无法支持从所选媒体启动。在这种情况下, Plop 引导管理器 (http://www.plop.at/en/bootmanagers.html) 可用于从选定的媒体引导系统。

2.4.2. 在PowerPC®上启动 FreeBSD

在大多数计算机上,在引导过程中在键盘上按住C将从CD启动。否则,在非Apple®键盘上按住Command+Option+O+FWindows+Alt+O+F 在非-Apple®键盘。在0 >提示符处,输入

boot cd:,\ppc\loader cd:0

2.4.3. FreeBSD 启动菜单

系统从安装介质启动后,将显示类似于以下内容的菜单:

图 2.1. FreeBSD 引导菜单
FreeBSD 引导菜单

默认情况下, 菜单将等待10秒钟的用户输入,然后启动到 FreeBSD 安装程序,或者, 如果已经安装了 FreeBSD, 然后再启动到 FreeBSD。要暂停启动计时器以查看所选内容,请按 空格键 。若要选择选项, 请按其突出显示的数字、字符或键。提供了以下选项。

  • Boot Multi User:将会继续 FreeBSD 的启动过程,如果倒计时计数器暂停,请按1,或者输入B 然后按 Enter

  • Boot Single User:进入该模式可修复 第 12.2.4.1 节 “单使用者模式” 中描述的问题。 按 2S可进入该模式。

  • Escape to loader prompt:该选项将引导系统进入一个包含有限指令环境,详情请查阅 第 12.2.3 节 “阶段三”。按 3Esc 键将进入此模式。

  • Reboot:重启系统。

  • Kernel: 加载其他内核。

  • Configure Boot Options:打开显示的菜单,如图 2.2 “FreeBSD 启动菜单选项”所示。

图 2.2. FreeBSD 启动菜单选项
FreeBSD 启动菜单选项

启动选项菜单分为两个部分。第一部分可用于返回主启动菜单或将任何切换的选项重置为默认值。

下一节用于通过按该选项突出显示的数字或字符来切换可用选项以设置。在修改这些选项之前,系统将始终使用这些选项的设置进行引导。可以使用此菜单切换多个选项:

  • ACPI Support: 如果系统启动时卡死,您可尝试将此选项调整为 Off

  • Safe Mode:即使在系统启动中将 ACPI Support 设置为 Off 也无法正常开机。请尝试将其设置为 On

  • Single User:此选项 On 可修复 第 12.2.4.1 节 “单使用者模式” 中提到的现有FreeBSD系统的故障。故障排除后,还原设置为Off

  • Verbose:将此选项设为以查看引导过程中的详细消息。这在对硬件进行故障排除时非常有用。

进行所需的选择后,按 1Backspace 返回到主启动菜单,然后按 Enter 继续启动 FreeBSD。当 FreeBSD 执行其硬件设备探测器并加载安装程序时,将出现一系列启动消息。启动完成后,将显示 图 2.3 “欢迎菜单” 中显示的欢迎菜单。

图 2.3. 欢迎菜单
欢迎菜单

Enter 选择 [ Install ] 的默认值 以输入安装程序。本章的其余部分介绍如何使用此安装程序。否则,请使用右箭头或左箭头或着色字母选择所需的菜单项。[Shell] 可用于访问 FreeBSD Shell,以便在安装前使用命令行程序准备磁盘。[Live CD] 选项可在安装之前试用 FreeBSD。Live CD版本可参考第 2.11 节 “使用 Live CD了解更多。

提示:

若要查看引导消息(包括硬件设备探测器),请按 S,然后按 Entet 以访问 shell。在 shell 提示下,键入 more /var/run/dmesg.boot 并使用空格键滚动浏览消息。完成后,键入 exit 返回到欢迎菜单。

2.5. 使用 bsdinstall

本节介绍了bsdinstall 菜单的顺序以及在安装系统之前将询问的一些信息。使用箭头键上下以显示菜单选项, 使用Space选择或取消选择该菜单项。完成后, 按 Enter 保存所选内容并移动到下一个屏幕。

2.5.1. 选择键盘布局

选择键盘布局前, bsdinstall 将加载键盘布局文件,如 图 2.4 “加载键盘布局”所示。

图 2.4. 加载键盘布局
加载键盘布局

bsdinstall加载好键盘布局(如图所示)后。使用方向键选择您的键盘布局,按Enter保存设置。

图 2.5. 键盘布局选择菜单
键盘布局选择菜单

注意:

按下 Esc 将退出此菜单并使用默认键盘布局。如果键盘布局不明确,United States of America ISO-8859-1也是一个不错的选择。

此外,在选择不同的键盘布局时,用户可以先试一下,确保正确无误后再进行,如图 2.6 “键盘布局测试”中所示。

图 2.6. 键盘布局测试
键盘布局测试

2.5.2. 设置主机名

下一个bsdinstall菜单用于为新安装的系统设置主机名。

图 2.7. 设置主机名
设置主机名

键入网络唯一的主机名。它应该是一个完全限定的主机名, 如 machine3.example.com

2.5.3. 选择要安装的组件

接下来,bsdinstall 会提示您选择要安装的可选组件。

图 2.8. 选择要安装的组件
选择要安装的组件

决定安装哪些组件将在很大程度上取决于系统的预期用途和可用的磁盘空间量。FreeBSD 内核和 Userland,统称为基本系统。根据体系结构的不同,可用组件可能会不同:

  • base-dbg - 例如cat, ls等带有调试符号的基础工具。

  • kernel-dbg - 启用了调试符号的内核和内核模块。

  • lib32-dbg - 在 64 位版本 FreeBSD 上运行 32 位应用程序的兼容库,带有调试符号支持。

  • lib32 - 在 64 位版本 FreeBSD 上运行 32 位应用程序的兼容库。

  • ports - FreeBSD 的 Ports Collection,是可以自动下载、编译和安装的第三方软件包的集合。第 4 章 使用 Package 和 Ports 安装应用程序 此链接介绍了如何使用 Ports Collection。

    警告:

    FreeBSD 的 Ports 占用 500MB 磁盘空间,用户应确保磁盘有足够的可用空间,该安装不检测是否有足够的磁盘可用空间。

  • src - 完整的 FreeBSD 源码由内核代码和用户层程序代码组成。虽然大多数应用程序用不到源码,但设备驱动,内核模块或者一些 Ports里的应用程序会用到。源码也用于开发 FreeBSD 本身。完整的源码需要至少 1GB 磁盘空间,如果重编译整个 FreeBSD 系统则额外需要 5GB 磁盘空间。

  • tests - FreeBSD 测试套件。

2.5.4. 从网络安装

图 2.9 “从网络安装”此链接中的所示菜单,只在使用 -bootonly.iso-mini-memstick.img 进行安装的时候出现。类似这种媒体安装介质不包含安装所需文件,所以这些文件必须从网络连接获取。该菜单表明在下载安装文件之前必须先配置好网络,可参考 -mini-memstick.img

图 2.9. 从网络安装
从网络安装

2.6. 磁盘分配(分区)

下个菜单是用来选择磁盘空间的方法。

图 2.10. 选择分区方式
选择分区方式

bsdinstall为用户提供了四种分配磁盘空间的方法:

  • 自动 (UFS) 使用UFS文件系统自动设置磁盘分区。

  • 手动 分区允许高级用户从菜单选项中创建自定义分区。

  • Shell - 开启 Shell,用户可以使用自己喜欢的分区工具(如gpart(8), fdisk(8), 和 bsdlabel(8))对分区进行调整。

  • 自动(ZFS)分区创建了一个基于ZFS的root-on-ZFS系统,并为启动环境提供可选的GELI加密支持。

这部分描述应如何考虑布局磁盘分区。及演示怎样使用上几不同的分区方法。

2.6.1. 设计分区布局

在设计文件系统布局时,记住, 硬件传输驱动器外侧磁道的数据时比内侧的快。因此小的和频繁访总的文件系统应该靠近驱动器外侧。相反,像/usr 这样的大的分区应该置于靠近磁盘内部的磁道。下面是较好的分区布局顺序:/, swap,/var/usr

/var 分区的大小反应了机器的用途,该分区一般用于存放邮箱、日志和 Printer Spools。邮箱和日志文件占用磁盘空间的大小取决于用户的数量及这些文件要保存多久。总之,多数用户此分区需要 1GB 以上的空闲磁盘空间。

注意:

通常 /var/tmp 需要占用磁盘大多数空间。因为在安装新的软件时解包工具会把从安装包里提取的临时文件存拷贝放在该目录。如果该目录空间不够的话,在安装一些大型软件如FirefoxLibreOffice的时候会很困难。

/usr 目录存放很多支持系统运行的文文件, 包括 FreeBSD Ports 集和系统的源代码。推荐给该分区至少 2GB 的磁盘空间。

在为分区的大小做选择时,一定要牢记各分区空间大小的需求,分区空间的大小要合理,不然一但某个分区空间不够用了,反而其他不常用的分区还有很多空闲空间的话就会很麻烦。

根据经验 swap 分区大小应该是物理内存(RAM )大小的两倍。 (RAM )小于 swap 分区,系统性能可以更好一些。 如果swap分区过小会导致在VM中页扫描代码效率低下。并且在增加物理内存后会产生一些问题。

在具有多个SCSI磁盘或多个IDE磁盘在不同控制器上运行的大型系统上,建议在每个驱动器上配置交换,最多四个驱动器。交换分区的大小应大致相同。内核可以处理任意大小,但内部数据结构扩展到最大交换分区的 4 倍。保持交换分区的大小接近相同大小将允许内核在磁盘之间以最佳方式划分交换空间。大交换大小是好的,即使交换没有使用太多。在被迫重新启动之前,从失控的程序恢复可能更容易。

让写装载分区至靠近磁盘的边缘可以大幅增强 I/O 的读写性能。

2.6.2. UFS 分区向导

选择这种方法时,会显示一个可用磁盘的菜单。 如果是多磁盘,就选一个磁盘作为FreeBSD系统安装盘。

图 2.11. 从多磁盘列表中选择一个磁盘
从多磁盘列表中选择一个磁盘

一旦确定某块磁盘, 下一菜单会提示使用整个磁盘安装还是创建一个空白分区。如果选择[ Entire Disk ] (整个磁盘), 会自动建立以一种通用分区方式(空间大小分配)对磁盘分区。 如果选择了[ Partition ] 则在磁盘未使用的空间建立分区布局。

图 2.12. 选择整个磁盘或分区
选择整个磁盘或分区

选择了 [ Entire Disk ] 后,bsdinstall 会显示一个对话框,指出将要清空的磁盘。

图 2.13. 最终确认
最终确认

下一个菜单显示的是分区方案类型的列表。GPT通常是AMD64电脑最合适的选择。不兼容GPT的旧电脑应该使用MBR。其他的分区方案一般用于不常用或较旧的计算机。更多信息请参见表 2.1 “分区方案”

图 2.14. 选择分区表类型
选择分区表类型

在分区布建立后,预览并确定分区是否合理。 按[ Revert ],会重置分区为默认值。按[ Auto ],会自动重建FreeBSD 分区。分区也可以手动创建, 修改或删除。确认分区方案后按[ Finish ]继续安装系统。

图 2.15. 预览已建立的分区
预览已建立的分区

磁盘设定完之后,接下来的菜单会让您在格式化所选的硬盘之前有最后一次机会做变更,若需要做变更,可选[ Back ]返回到主磁盘分割菜单。[ Revert & Exit ]则会离开安装程序,不会对硬盘做任何变更。选择[ Commit ]开始安装系统。

图 2.16. 最终确认
最终确认

若需回到安装过程,请参阅第 2.7 节 “获取发行版文件”

2.6.3. 手动分区

选择此项打开分区编辑器:

图 2.17. 手动创建分区
手动创建分区

高亮显示安装驱动器(本例使用ada0)。然后选择 [ Create ]以显示可用分区方案的菜单:

图 2.18. 手动创建分区
手动创建分区

GPT通常是 amd64 计算机最合适的选择。与GPT不兼容的旧计算机应使用MBR。其他分区方案通常用于不常见或较旧的计算机。

表 2.1. 分区方案
缩写描述
APMApple 分区表,用于 PowerPC®。
BSD BSD 标签没有 MBR ,只有BSD磁盘使用程序才可以进行识别,有时称为dangerously dedicated mode
GPTGUID 分区表(http://en.wikipedia.org/wiki/GUID_Partition_Table)。
MBR主引导记录(http://en.wikipedia.org/wiki/Master_boot_record)。
VTOC8Sun SPARC64 和 Ultrasarc 计算机使用的目录。

选择并创建分区方案后,再次选择[ Create ]来创建分区。Tab 键用于在字段之间移动光标。

图 2.19. 手动创建分区
手动创建分区

FreeBSD 标准的 GPT 安装至少是用三个分区:

  • freebsd-boot - 保存 FreeBSD 启动代码。

  • freebsd-ufs - FreeBSD UFS 文件系统.

  • freebsd-zfs - FreeBSD ZFS 文件系统。更多关于 ZFS 的信息在 第 19 章 Z 文件系统(ZFS

  • freebsd-swap - FreeBSD 交换空间。

参考 gpart(8) 获取有关 GPT 分区类型的描述。

文件系统分割区可建立多个,且有部份人会偏好使用传统的配置方式将//var/tmp以及/usr分开存放在不同的分割区。请参考例 2.1 “创建传统的拆分文件系统(Split File System)分区”的示例。

大小(Size)字段可以使用常用的缩写来输入:K代表KB,M代表MB,G代表GB。

提示:

适当的对齐磁盘扇区(Sector)会提供最佳的性能,而且让分割区大小为4 KB的偶数倍数可协助确保对齐在磁碟机上的512-byte或4K-byte扇区。一般来说,使用分割区大小为1M或1G的偶数倍数是最简单的方式确保每个分割区以4K的偶数倍数做为开始。唯一一个例外是:freebsd-boot分割区因目前开机程序(Boot code)的限制,不可大于512K。

若分割区内含文件系统便会需要一个挂载点(Mountpoint),若只要建立一个UFS分割区,那么挂载点应设为/

标签(Label)是分割区的名称,磁碟机名称或编号可能因为磁碟机连接到不同的控制器或连接端口而有所不同,但分割区标签并不会改变。因此在档案如/etc/fstab中参照时,使用标签来替代磁碟机名称与分割区编号会让系统对硬件变更有更多的容错空间。GPT标签会于磁盘连接之后出现在/dev/gpt/。其他分割表格式的标签格有不同功能,且标签会在/dev/中有各自的目录。

提示:

每个分割区请使用独一无二的标签来避免相同名称的冲突,标签可以加入与电脑名称、用途、地点有关的文字。例如,使用labrootrootfslab来做为电脑名称为labUFS根目录分割区。

例 2.1. 创建传统的拆分文件系统(Split File System)分区

传统的分割区配置会将//var/tmp以及/usr分别使用不同的文件系统与分割区。先建立GPT分割表格式,然后依照下表所示建立分割区。下表是针对20G目标磁盘的分割区大小,若在目标磁盘有更多可用的空间,则可增加交换空间(Swap)或/var会比较有用。以下所示的标签皆以ex为前缀,代表example,读者应照前面的说明使用其他独一无二的标签。

默认情况下,FreeBSD 的gptboot希望第一个UFS分区是/分区。

分区类型大小挂载点标签
freebsd-boot512K  
freebsd-ufs2G/exrootfs
freebsd-swap4G exswap
freebsd-ufs2G/varexvarfs
freebsd-ufs1G/tmpextmpfs
freebsd-ufs接受默认值(磁盘的其余部分)/usrexusrfs

自定义分区表创建完后,选择 [ Finish ] 进行下一步安装程序 第 2.7 节 “获取发行版文件”

2.6.4. Root-on-ZFS 分区向导

这种分区模式只适用于整个磁盘,并将清除整个磁盘的内容。ZFS 配置菜单提供了一系列选项用于自定义存储池。

图 2.20. ZFS 分区菜单
ZFS 分区菜单

这里总结了在此菜单可以使用的服务列表:

  • Install - 使用已选参数安装系统。

  • Pool Type/Disks - 配置存储池类型和需要加入存储池的磁盘。ZFS 安装程序目前只支持创建单个顶层 vdev,但在 stripe 模式下除外。若需创建更复杂的存储池,请参阅第 2.6.5 节 “命令行模式分区”

  • Rescan Devices - 重新生成可用磁盘列表。

  • Disk Info - Disk Info(磁盘信息)菜单可用于检查磁盘,包括分区表和其他各种信息,如设备型号,序列号等可查询信息。

  • Pool Name - 设置存储池名字,默认名字是 zroot

  • Force 4K Sectors? - 强制设置扇区大小为 4K。在默认情况下,安装程序会自动创建与4K边界对齐的分区,并强制ZFS使用大小为 4K 的扇区。即使是 512 字节磁盘,这也是安全的,而且还有一个额外的好处,那就是确保在 512 字节磁盘上创建的磁盘池将来可以添加 4K 扇区磁盘,无论是作为额外的存储空间还是作为故障磁盘的替换品。按 Enter,选择是否激活此功能。

  • Encrypt Disks? - 是否使用 GELI 加密磁盘,更多详情请参阅第 17.12.2 节 “使用 geli 对磁盘进行加密”。按Enter键选择是否启用此功能。

  • Partition Scheme - 选择分区表类型,在大多数情况下建议使用 GPT。按Enter调整分区表类型。

  • Swap Size - 设置交换分区大小。

  • Mirror Swap? - 允许用户在磁盘之间进行镜像交换。请注意,启用镜像交换会破坏崩溃转储。按Enter来激活它。

  • Encrypt Swap? - 是否要加密 swap 分区,每次系统启动时用临时密钥加密 swap 分区,并在重启时丢弃该密钥。按 Enter 键选择是否启用该功能,更多详情请参阅 第 17.13 节 “对交换区进行加密”

选择 T 配置 存储池类型,并选择要加入该存储池的磁盘。

图 2.21. ZFS 存储池类型
ZFS 存储池类型

这里总结了在此菜单可供选择的存储池类型(Pool Type)

  • stripe - 可最大化使用磁盘空间,没有冗备数据。如果存储池中的某块磁盘坏了,存储池中的数据都将丢失。

  • mirror - mirror 在每个磁盘上存储了所有数据的完整副本。mirror 提供了良好的读取性能,因为数据是从所有磁盘上并行读取的。写入性能较差,因为必须将数据写入池中的所有磁盘。可在只有一块磁盘可用,其他磁盘损坏的情况下保证数据完整。此类型需要至少两个磁盘。

  • raid10 - 为 RAID1 和 RAID0 的组合,性能较好。至少需要四块硬盘。

  • raidz1 - 是否启用单冗余 RAID(raidz1)。运行时最多容许一个磁盘失效。启用此功能至少需要三块磁盘。

  • raidz1 - 是否启用双冗余 RAID(raidz2)。运行时最多容许两个磁盘失效。启用此功能至少需要四块磁盘。

  • raidz1 - 是否启用三冗余 RAID(raidz3)。运行时最多容许三个磁盘失效。启用此功能至少需要五块磁盘。

选择完存储池类型(Pool Type)以后,还需选择要加入存储池的磁盘(至少一块磁盘)。选好磁盘后需再次确认,若没问题,选择 <Change Selection> 回到磁盘列表,否则选择 <Back> 来修改存储池类型(Pool Type)。

图 2.22. 选择磁盘
选择磁盘

图 2.23. 无效选项
无效选项

若列表中缺少一个或多个磁盘,或者在安装程序启动后连接了磁盘,请选择 - Rescan Devices 以刷新可用磁盘的列表。

图 2.24. 重新扫描设备
重新扫描设备

为防止意外擦除磁盘,- Disk Info 菜单可用于检索磁盘信息,包括分区表和其他各种可读取信息,例如设备型号和序列号。

图 2.25. 分析磁盘
分析磁盘

选择 N 来设置存储池名字。输入名字并选择<OK>让其生效或选择<Cancel>使用默认名字并回到主菜单。

图 2.26. 存储池名称
存储池名称

选择 S 来设置 swap 分区大小。输入您需要的 swap 分区大小后按 <OK> 保存更改或按 <Cancel> 使用默认设置并返回到上级菜单。

图 2.27. Swap 空加大小
Swap 空加大小

所有参数设置完成后,选择菜单上方的>>> Install。安装程序接着会提供最后一次修改的机会可取消先前所选择摧毁用来建立ZFS储存池的磁碟机。

图 2.28. 最新改动
最新改动

如果开启 GELI 磁盘加密,安装程序将提示您输入密码。此密码用于加密磁盘。在此之后将开始初始化加密步骤。

图 2.29. 磁盘加密密码
磁盘加密密码

图 2.30. 初始化加密
初始化加密

安装过程开始正常进行,若需继续安装系统,请参阅第 2.7 节 “获取发行版文件”

2.6.5. 命令行模式分区

当要做进阶的安装时,bsdinstall的磁盘分割菜单可能无法提供需要的弹性。进阶的使用者可以在磁盘分割菜单选择Shell选项来手动分割磁碟机、建立文件系统、填写/tmp/bsdinstall_etc/fstab以及挂载文件系统到/mnt下。这些动作完成之后,输入exit可返回bsdinstall继续安装程序。

2.7. 获取发行版文件

安装时间取决于刚才的配置,安装媒体,以及电脑的运行速度。安装过程中有会显示许多信息,用于查看安装进度。

首先,安装程序将格式化所选磁盘并初始化分区表。接下来,如果您使用bootonly mediamini memstick,将会下载选中的组件:

图 2.31. 获取发行版文件
获取发行版文件

安装程序将验证安装文件的完整性,以防文件在下载中被损坏或篡改:

图 2.32. 校验发行版文件
校验发行版文件

最终,被校验过的安装文件已经解压到磁盘上:

图 2.33. 解压发行版文件
解压发行版文件

文件提取全部完成后, bsdinstall 将开始安装后的配置任务。

2.8. 帐户,时区,服务和加固

2.8.1. 设置 root 密码

首先设置 root 密码。请注意输入密码时,被输入的字符并不会在屏幕上显示,因此为防止输入错误,必须再次输入相同的字符。

图 2.34. 设置 root 密码
设置 root 密码

2.8.2. 设置时区

下一系列菜单用于选择地理区域、国家/地区和时区来设置的本地时间。通过设置时区,系统可以自动修正时间(如夏令时),并正确执行时区相关功能。

此处显示的示例适用于位于欧洲西班牙时区的计算机。地理位置不同,选项可能不同。

图 2.35. 选择地区
选择地区

使用方向键选择合适的地区后按下 Enter 键。

图 2.36. 选择国家
选择国家

用方向键选择合适的国家后按下 Enter 键。

图 2.37. 选择时区
选择时区

用方向键选择合适的时区后按下 Enter 键。

图 2.38. 确认时区
确认时区

判断时区是否正确。

图 2.39. 选择日期
选择日期

使用方向键选择适当的日期,然后按 [ Set Date ]保存设置。若无需修改,选择[ Skip ]来跳过设置。

图 2.40. 设置时间
设置时间

使用方向键选择适当的时间,然后按 [ Set Time ]保存设置。若无需修改,选择[ Skip ]来跳过设置。

2.8.3. 开启服务

下一个菜单用于配置每当系统启动时将启动哪些系统服务。所有这些服务都是可选的。仅启动系统正常运行所需的服务。

图 2.41. 选择额外的要启用的服务
选择额外的要启用的服务

这里总结了在此菜单可以启用的服务列表:

  • local_unbound - 启用本地 DNS 解析。需要注意的是,这是基础系统的 unbound,仅作为本地缓存转发解析器使用。若需为网络提供 DNS 解析服务,请安装 dns/unbound

  • sshd - Secure Shell(即 SSH) 守护进程, 提供安全的远程访问。

  • moused - 支持在系统控制台中使用鼠标。

  • ntpdate - 在系统启动时自动校对时间。此功能由 ntpd(8) 提供。ntpdate(8) 未来将从系统中移除。

  • ntpd - Network Time Protocol(网络时间协议, 简称 NTP) 守护进程, 提供时钟自动同步。

  • powerd - 系统电量控制程序, 用于控制电量及节能。

  • dumpdev - 启用崩溃转储,在系统调试时很有用,推荐启用。

2.8.4. 启用安全加固

下一个菜单用于配置要启用的安全选项,您可根据需要启用它们。

图 2.42. 选择安全加固措施
选择安全加固措施

这里总结了在此菜单可以启用的服务列表:

  • hide_uids - 隐藏以其他用户身份运行的进程,防止非特权用户看到其他用户(UID)的进程,防止信息泄露。

  • hide_gids - 隐藏作为其他组运行的进程,防止非特权用户看到其他组(GID)执行的进程,防止信息泄露。

  • hide_jail - 隐藏 jail 中运行的进程,防止非特权用户看到 jail 中运行的进程。

  • read_msgbuf - 禁止未授权用户读取内核消息缓冲区,防他们止使用dmesg(8)查看内核日志缓冲区中的消息。

  • proc_debug - 禁用非特权用户的进程调试设施,禁用各种非特权的进程间调试服务,包括一些procfs功能、ptrace()和ktrace()。请注意,这也将妨碍调试工具,例如lldb(1), truss(1)procstat(1),以及某些脚本语言(如PHP等)的内置调试功能 ,防止未授权用户使用调试功能。

  • random_pid - 随机化新创建的进程的PID。

  • clear_tmp - 在系统启动时清除/tmp

  • disable_syslogd - 禁止打开 syslogd 网络套接字。默认情况下, FreeBSD 以安全的方式使用 -s 来运行 syslogd。这可以防止守护进程在 514 端口监听传入的 UDP 请求。启用了这个选项后, syslogd 将以 -ss 的标志运行, 以防止 syslogd 打开任何端口。要获得更多信息,请参考 syslogd(8)

  • disable_sendmail - 禁用 sendmail。

  • secure_console - 启用此选项后,控制台输入命令时需输入 root 密码。

  • disable_dtrace - DTrace可以以实际影响运行中的内核的模式运行。若非需要无需启用。使用 DTrace 时要启用这个选项,请使用 -w。要获得更多信息,请参考dtrace(1)

2.8.5. 添加用户

下一个菜单提示您建立至少一个用户账户。我们推荐用一个用户账户,而不是 root,来登陆系统。如果以 root 登陆,那之后进行的操作基本上没有任何限制或保护措施。以普通用户登陆更安全,也更有保障。

选择 [ Yes ] 来添加新用户。

图 2.43. 添加用户
添加用户

按照提示操作,并输入用户帐户的请求信息。图 2.44 “输入用户信息” 示例中的创建了asample用户。

图 2.44. 输入用户信息
输入用户信息

这里总结了要输入的信息:

  • Username - 用户登录时输入的用户名。常见做法是使用名字的第一个字母和姓氏,只要保证系统里每个用户名都唯一。用户名是大小写敏感的,不应包含任何空格。

  • Full name - 用户的全名。这可以包含空格。这被用于说明这个用户账户。

  • Uid - 用户 ID。一般来说,这项留空来让系统来指定一个值。

  • Login group - 用户的组。通常,这将留空以接受默认值。

  • Invite user into other groups? - 是否同时将用户加入其他权限组?如果需要,请输入权限组名称。

  • Login class - 登录类别。通常留空以接受默认取值。

  • Shell - 用户 shell。更多信息请参阅第 3.9 节 “Shell”

  • Home directory - 用户主目录。通常留空以接受默认取值。

  • Home directory permissions - 用户主目录的权限。通常留空以接受默认取值。

  • Use password-based authentication? - 是否使用基于密码的认证? 通常为 “yes”。

  • Use an empty password? - 是否使用空密码? 通常为 “no”。

  • Use a random password? - 是否使用随机密码? 通常为 “no”。

  • Enter password - 用户的实际密码。 输入的字符不会在屏幕上显示。

  • Enter password again - 必须再次输入密码以进行验证。

  • Lock out the account after creation? - 创建后锁定帐号? 通常为no

全部信息输入完成后,系统会显示摘要并询问是否正确。如果发现了错误,可以输入 no 后进行修改;如果没有错误,请输入 yes 以创建新用户。

图 2.45. 退出用户和组管理
退出用户和组管理

若需添加更多用户,请在问题Add another user?输入 yes;输入 no 以完成用户添加并继续安装。

更多有关用户添加及管理的信息, 请参见 第 3.3 节 “基础账户管理”

2.8.6. 最终配置

在一切都安装和配置完成之后,会提供一个最后修改设置的机会。

图 2.46. 最终配置
最终配置

使用这个菜单来在安装结束之前进行修改或任何额外配置。

所有配置完成以后,选择 Exit

图 2.47. 手动配置
手动配置

bsdinstall 会询问重启前是否还需要额外的配置。选择 [ Yes ] 进入 shell 进行配置, 选择 [ No ] 以执行安装的最后一步。

图 2.48. 完成安装
完成安装

如果需要进一步的配置或特殊的设置, 可以选择 [ Live CD ] 来进入安装介质的 Live CD 模式。

安装完成后,选择 [ Reboot ] 重启计算机,并开始使用全新的 FreeBSD 系统。请不要忘记移除 FreeBSD 的安装媒体,否则计算机可能会再次从这些介质启动。

FreeBSD 启动时,将显示一些系统信息。系统完成引导后,将显示登录提示。在login:提示下,输入安装过程中添加的用户名。尽量不要使用root用户登入。如何在需要时获取 root 权限请参阅第 3.3.1.3 节 “超级账户”

要查看开机过程显示的信息可按Scroll-Lock键来开启卷轴暂存,然后可使用PgUpPgDn以及方向键来卷动信息。查看完成之后再按Scroll-Lock键一次来解除画面锁定并返回Console。系统开机一段时间之后要查看这些信息可在指令提示后输入less / var/run/dmesg.boot,查看后按下q键便可返回指令列。

如果在图 2.41 “选择额外的要启用的服务”中启用了sshd,由于系统需要生成RSADSA密钥,第一次启动时可能会慢一点,之后将恢复正常。密钥的指纹像下面这样:

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:
10:a0:f5:af:93:ae:a3:1a:b2:bb:3c:35:d9:5a:b3:f3 root@machine3.example.com
The key's randomart image is:
+--[RSA1 1024]----+
|    o..          |
|   o . .         |
|  .   o          |
|       o         |
|    o   S        |
|   + + o         |
|o . + *          |
|o+ ..+ .         |
|==o..o+E         |
+-----------------+
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:
7e:1c:ce:dc:8a:3a:18:13:5b:34:b5:cf:d9:d1:47:b2 root@machine3.example.com
The key's randomart image is:
+--[ DSA 1024]----+
|       ..     . .|
|      o  .   . + |
|     . ..   . E .|
|    . .  o o . . |
|     +  S = .    |
|    +  . = o     |
|     +  . * .    |
|    . .  o .     |
|      .o. .      |
+-----------------+
Starting sshd.

更多关于指纹和SSH的信息请参阅 第 13.8 节 “OpenSSH”

FreeBSD 默认情况下不安装图形环境。有关安装和配置图形窗口管理器的详细信息,请参阅 第 5 章 X Window系统

正常关机能保护数据,减少硬件磨损。不要在正常关机前切断电源!。如果用户属于wheel组,使用su并输入root密码获取超级用户权限。然后输入shutdown -p now关机。

2.9. 网络接口

2.9.1. 配置网络接口

接下来,会显示在此计算机上找到的网络接口列表。选择要配置的接口。

图 2.49. 选择一个网络接口
选择一个网络接口

如果选择了一个以太网接口,那安装程序会跳到 图 2.53 “选择 IPv4 网络” 中展示的菜单。如果选择了无线网络接口,那么系统会转而扫描无线接入点:

图 2.50. 扫描无线接入点
扫描无线接入点

无线接入点通过服务设定识别码(SSID)来识别,它是设置于每个网络的一个短小,唯一的名字。在扫描中找到的所有 SSID 均会被列出,同时也会列出每个网络的可用加密类型说明。如果想要连接的 SSID 没有在列表中出现,请选择 [ Rescan ] 来再次扫描。如果想要连接的网络还是没有出现,请检查天线的连接情况,或者尝试将计算机移动到更靠近接入点的地方。每次尝试时均需重新扫描。

图 2.51. 选择一个无线网络
选择一个无线网络

下一步,输入加密信息来连接到选中的无线网络。强烈推荐选择 WPA2 加密,因为更古老的加密类型,例如 WEP,仅提供了很少的安全性。如果网络使用 WPA2,请输入密码,也被称为预共享密钥(PSK)。出于安全考虑,在输入框中输入的字符均显示为星号。

图 2.52. WPA2 设置
WPA2 设置

接下来,选择是否应在以太网或无线接口上配置IPv4地址:

图 2.53. 选择 IPv4 网络
选择 IPv4 网络

有两种配置 IPV4 的方法,DHCP会自动地为网络接口进行正确的配置,这需要网络中有可用的 DHCP 服务器。 而静态网络配置需要手工输入网络的配置信息。

注意:

不要随意输入网络的配置信息,因为这样的话网络就无法正常工作。请向网络管理员或服务提供商那里取得 必须的网络信息 所列出的配置信息。

如果有可用的 DHCP 服务器,在下个菜单中选择 [ Yes ]来启用 DHCP。安装程序将暂停一段时间从 DHCP 服务器获取所需的网络配置信息。

图 2.54. 选择 IPv4 DHCP 设置
选择 IPv4 DHCP 设置

如果网络中没有 DHCP 服务器,选择 [ No ] 然后在菜单中输入所需的网络配置信息:

图 2.55. IPv4 静态设置
IPv4 静态设置

  • IP Address - IP 地址,即给当前计算机手动分配的 IPv4 地址。此地址必须是唯一的,并且在本地网络上还没有被其他设备使用。

  • Subnet Mask - 网络的掩码.

  • Default Router(默认路由)- 网络上默认路由的 IP 地址。通常,这是将本地网络连接至 Internet 的路由器或其他网络设备的地址。也称作 default gateway (默认网关)

接下来将配置 IPV6。如果您有可用的 IPv6 连接,并需要使用它,选择 [ Yes ] 来开始配置。

图 2.56. 选择 IPv6 网络
选择 IPv6 网络

IPv6 也有两种配置方式。无状态地址自动配置(SLAAC)方式能够自动配置正确的网络接口(更多信息请参阅http://tools.ietf.org/html/rfc4862), 而静态配置方式则需要手动输入网络信息。

如果 IPv6 路由可用, 请在下一个菜单中选择 [ Yes ] 以自动配置网络接口。安装程序将显示暂停一分钟左右, 因为它找到路由器并获取系统的寻址信息。

图 2.57. 选择 IPv6 SLAAC 配置
选择 IPv6 SLAAC 配置

如果 IPv6 路由器不可用,选择[ No ] 并在菜单中填入所需信息:

图 2.58. IPv6 静态配置
IPv6 静态配置

  • IPv6 Address (IPv6地址) - 为当前计算机手工分配的 IP 地址。 这个地址必须是唯一的, 并且没有被其他本地网络设备使用。

  • Default Router (默认路由) - 网络上默认路由的地址。 通常, 这是将本地网络连接至 Internet 的路由器或其他网络设备的地址。 也称作 default gateway (默认网关)

Domain Name System (域名系统,简称 DNS) 解析器用于主机名和网络地址间的相互转换。 如果使用的是 DHCPSLAAC, 那么其配置很可能已经存在; 否则, 请在 Search 字段中输入本地网络的域名, 在 DNS #1 和 DNS #2 中输入本地 DNS 服务器的 IP 地址。 至少需要配置一个 DNS 服务器。

图 2.59. DNS 配置
DNS 配置

接口配置完成后,选择一个与要安装系统的目标电脑就近的镜像站点,尽量选择离您较近的镜像站,可以缩短安装时间。

图 2.60. 选择一个镜像
选择一个镜像

2.10. 故障排除

本章介绍如何排除安装中出现的故障。

检查所需 FreeBSD 版本的“硬件支持列表"(https://www.freebsd.org/releases/index.html)文档,确保硬件在 FreeBSD 中可用。如果写明支持硬件,但出现锁定或其他问题,请使用第 8 章 配置 FreeBSD 内核中的说明构建自定义内核,以添加对默认内核GENERIC中不存在的设备的支持。默认内核假定大多数硬件设备都在出厂默认配置中的IRQI/O 地址和 DMA通道。如果硬件已更改,可通过自定义内核配置文件告诉 FreeBSD 在哪里可以找到所需的东西。

注意:

通过更新各种硬件组件(尤其是主板)上的固件,可以解决一些安装问题。主板固件通常称为 BIOS 。大多数主板和计算机制造商都有一个用于升级和升级信息的网站。

主板制造商通常不建议升级 BIOS,除非有非升不可得理由,比如关键更新。升级 BIOS 的过程中可能会出错,这将让计算机无法正常工作。

如果在系统启动时发生异常,则 ACPI可能是罪魁祸首。FreeBSD 在 i386 和 amd64 平台上广泛使用系统ACPI服务,以帮助在引导过程中检测系统配置。遗憾的是,ACPI驱动程序以及系统主板和BIOS固件中仍然存在一些错误。可以通过在第三阶段引导加载程序中设置 hint.acpi.0.disabled来禁用ACPI

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

每一次系统重开之后便会重设,因此需要在/boot/loader.conf档案加入hint.acpi.0.disabled=“1”。更多有关开机加载程序的信息可于第 12.1 节 “简介”取得。

2.11. 使用 Live CD

bsdinstall 的欢迎菜单,如图 2.3 “欢迎菜单”所示,提供了一个[ Live CD ]选项。这对于那些仍在想 FreeBSD 是否适合他们的操作系统并希望在安装前测试某些功能的人来说很有用。

在使用 [ Live CD ] 之前,应注意以下几点:

  • 要获得对系统的访问权限,需要进行身份验证。用户名是root,密码为空。

  • 由于系统直接从安装介质运行,性能将明显低于安装在硬盘上的系统的性能。

  • 此选项仅提供命令提示,而不是图形界面。

第 3 章 FreeBSD 基础知识

3.1. 简介

本章介绍 FreeBSD 基本命令和功能。 同时这里许多内容和一些 类-UNIX® 操作系统相关。假如您是FreeBSD新用户,那您应该认真详细地从头到尾读一遍这些章节。

读完本章节,你将会知道:

  • 如何使用和配置虚拟终端。

  • 如何在 FreeBSD 上管理和创建用户组。

  • UNIX® 文件权限和 FreeBSD 文件标识是如何工作的。

  • FreeBSD 默认文件系统布局。

  • FreeBSD 磁盘管理。

  • 如何挂载和卸载文件系统。

  • 进程,守护进程,和信号是什么。

  • Shell 是什么?如何修改默认登入 shell。

  • 如何使用文件编辑器。

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

  • 如何从 man 手册中获取信息。

3.2. 虚拟控制台和终端

在没有配置其他图形界面时,FreeBSD 开机时将自动进入命令行登入界面,就像下面这样:

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

login:

第一行包含有关系统的一些信息。amd64表示此示例中的系统正在运行64位版本的 FreeBSD。主机名pc3.example.org, ttyv0指示这是 系统控制台 。第二行是登录提示。

由于 FreeBSD 是一个多用户系统, 它需要某种方法来区分不同的用户。这是通过要求每个用户在访问系统上的程序之前登录系统来实现的。每个用户都有一个唯一的名称username和个人password

要登录到系统控制台,请键入在系统安装过程中配置的用户名,如第 2.8.5 节 “添加用户”中所述,然后按 Enter 。然后输入与用户名关联的密码,然后按 Enter 。出于安全原因, 密码 不会显示在屏幕上

输入正确的密码后, 当天的消息(MOTD)将显示后跟命令提示符。根据创建用户时选择的 shell,此提示将是#$%字符。提示指示用户现已登录到 FreeBSD 系统控制台,并准备好尝试可用命令。

3.2.1. 虚拟控制台

虽然系统控制台可用于与系统交互, 但从 FreeBSD 系统键盘上的命令行工作的用户通常会改为登录到虚拟控制台。这是因为默认情况下, 系统消息配置为显示在系统控制台上。这些消息将出现在用户正在处理的命令或文件上, 因此很难专注于手头的工作。

默认情况下,FreeBSD 配置为提供多个虚拟控制台用于输入命令。每个虚拟控制台都有自己的登录提示和 shell,很容易在虚拟控制台之间切换。这实质上提供了相当于在图形环境中同时打开多个窗口的命令行。

快捷键 Alt+F1Alt+F8 用于切换虚拟控制台。使用 Alt+F1 切换到系统控制台(ttyv0),Alt+F2 切换到第一个虚拟控制台(ttyv1),Alt+F3 切换到第一个虚拟控制台(ttyv2),以此类推。当使用Xorg 图形界面,时,使用组合键Ctrl+Alt+F1 返回虚拟控制台(tty 界面)。

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

更多关于 FreeBSD 控制台和键盘驱动程序的信息,请参阅kbdcontrol(1), vidcontrol(1), atkbd(4), syscons(4), and vt(4)

在 FreeBSD 中, 可用的虚拟控制台的数量可在/etc/ttys文件的这个部分中设置:

# name    getty                         type  status comments
#
ttyv0   "/usr/libexec/getty Pc"         xterm   on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv2   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv3   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv4   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv5   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv6   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv7   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure

若要禁用虚拟控制台,请在表示该虚拟控制台的那一行的开头放置注释符号(#)。例如, 要将可用虚拟控制台的数量从8个减少到 4个, 请在表示 ttyv5ttyv8的最后四行前面放置一个#请勿注释掉系统控制台 ttyv0 的所在行。请注意,如果已安装并配置了 Xorg ,如第 5 章 X Window系统所述,最后一个虚拟控制台(ttyv8) 将用于访问图形环境。

如果要了解这个文件中每一列的详细介绍, 以及虚拟控制台上所能使用的配置, 请参考联机手册 ttys(5)

3.2.2. 单用户模式

FreeBSD 启动菜单提供了一个Boot Single User选项。如果选择此选项,系统将引导到一种称为single user mode的特殊模式。此模式通常用于修复无法启动的系统, 或在忘记密码时重置 root密码。在单用户模式下,网络和其他虚拟控制台不可用。但是, 拥有完整的root权限,并且在默认情况下,不需要事先输入root密码。由于这些原因,请谨慎使用该模式。

单用户模式的控制台可以在 /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

默认情况下, 状态设置为secure。这假定谁对键盘具有物理访问权限不是很重要,就是它由物理安全策略控制。如果将此设置更改为insecure,则假设环境本身是不安全的,因为任何人都可以访问键盘。当此行更改为insecure,当用户选择启动到单个用户模式时 FreeBSD 将提示root密码。

注意:

将设置更改为insecure时要小心!如果忘记了 root 密码,则仍有可能启动到单用户模式,但对于不熟悉 FreeBSD 启动过程的人来说可能会很困难。

3.2.3. 改变控制台的显示模式

FreeBSD 控制台默认的显示模式可以被调整为 1024x768, 1280x1024, 或者任何你的显卡芯片和显示器所支持的其他尺寸。若要使用一个不同的显示模式需加载VESA模块:

# kldload vesa

可以使用 vidcontrol(1) 工具来测定你的硬件支持何种显示模式。在控制台键入以下命令来获得一份所支持的显示模式列表:

# vidcontrol -i mode

这个命令的输出是一份你的硬件所支持的显示模式列表。 你可以在以 root 身份在控制台上键入 vidcontrol(1) 命令来改变显示模式:

# vidcontrol MODE_279

如果你对于新的显示模式满意,那么可以把它加入到 /etc/rc.conf 使机器在每次启动的时候都能生效:

allscreens_flags="MODE_279"

3.3. 基础账户管理

FreeBSD 允许多个用户同时使用计算机。虽然只有一个用户可以坐在屏幕前面,并随时使用键盘,但任意数量的用户可以通过网络登录到系统。要使用系统,每个用户都应有自己的用户帐户。

本章将介绍:

  • FreeBSD 系统上不同的用户账号类型。

  • 如何添加、删除、修改用户账户。

  • 如何设置限制以控制允许用户和组访问的资源。

  • 如何创建组并向组中添加用户。

3.3.1. 账户类型

由于对 FreeBSD 系统的所有访问都是使用帐户实现的,并且所有进程都由用户运行,因此用户和帐户管理非常重要。

有三种主要类型:系统账户,用户账户,及超级用户账户。

3.3.1.1. 系统账户

系统账户用于运行服务,例如 DNS,邮件,及网络服务器。这么做是为了安全:如果所有服务都以超级用户运行,它们的行为将没有限制。

系统账户的例子有 daemonoperatorbindnews,及www

警告:

在使用操作员组时必须谨慎,因为可能会被授予类似超级用户的访问权限,包括但不限于关机、重启和访问/dev中的所有项目。

nobody是通用的无特权系统帐户。但是,使用nobody的服务越多,用户将关联的文件和进程就越多,因此该用户的特权也就越大。

3.3.1.2. 用户账户

用户帐户分配给实际人员,用于登录和使用系统。访问系统的每个人都应该有一个唯一的用户帐户。这允许管理员知道谁在做什么,并防止用户破坏其他用户的设置。

每个用户都可以自定义默认 shell、编辑器、按键设置和语言设置。

FreeBSD 系统上的每个用户账户都有一些相关联的信息:

用户名

login:提示符下输入用户名。每个用户都应有个独一无二的用户名。passwd(5)中有许多用于创建有效用户名的规则。建议使用包含八个或更少小写字符的用户名,以保持与应用程序的向后兼容性。

密码

每个账户有个相关联的密码。

用户 ID(UID

用户 ID(UID)是一组数字,是 FreeBSD 系统用户的唯一标识。允许指定用户名的命令将首先将其转换为 UID。建议使用小于 65535 的UID,因为较高的值可能会导致与某些软件的兼容性问题。

用户组 ID(GID)

用户组 ID(GID)是一组数字,是用户组的唯一标识。用户组是一种根据用户的 GID 而不是 UID 来控制对资源的访问的机制。这可以显著减少一些配置文件的大小,并允许用户成为多个组的成员。建议使用小于 65535 的 GID,因为较高的 GID 可能会欲某些软件不兼容。

登入类

登录类是组机制的扩展,在将系统定制给不同用户时提供了额外的灵活性。登录类将在第 13.13.1 节 “设置登入类别”中进一步讨论。

密码修改时间

默认情况下,密码不会过期。但是用户可以设置密码过去时间,从而强制部分或全部用户在经过一段时间后更改其密码。

账户过期时间

默认情况下 FreeBSD 的账户不会过期。若需设置用户过期时间,请使用 pw(8)设置。账户到期后将不能再登入系统,但账户的文件和目录将被保留。

用户全名

用户名唯一地将帐户标识为 FreeBSD,但不一定反映用户的真实姓名。与注释类似, 此信息可以包含空格、大写字符,并且长度超过8个字符。

Home 目录

主目录是系统上目录的完整路径。这是用户登录时的起始目录。一个常见的约定是将所有用户主目录放在/home/username/usr/home/username。每个用户都将其个人文件和子目录存储在自己的主目录中。

用户 shell

Shell 提供了用户与系统交互的默认环境。有许多不同类型的 Shell。有经验的用户将有自己的喜好, 这可以反映在他们的帐户设置。

3.3.1.3. 超级账户

超级用户账户,一般被称为root,用于管理系统,不受任何限制。因此它不应用于日常任务,比如收发电子邮件,编程等等。

与其他用户帐户不同,超级用户可以不受限制地运行程序。滥用超级用户帐户可能会导致壮观的灾难。用户帐户无法错误地销毁操作系统,因此建议以普通用户帐户身份登录,并且仅在命令需要额外权限时才使用超级用户。

使用超级使用者下指令时永远要再三检查,由于一个多余的空白或缺少的字元可能意味着无法挽回的数据遗失。

有几种方法可以获得超级用户权限。虽然可以以root的身份登录,但强烈建议不要这样做。

改使用su(1)切换为超级使用者。执行此指令时若指定-参数,该使用者会继承root的使用者环境。执行此指令的使用者必须在wheel群组中,否则指令会失败。使用者也必须要知道root使用者帐号的密码。

在本例中, 用户只成为超级用户才能运行make install,因为此步骤需要超级用户权限。命令完成后,用户键入exit 离开超级用户帐户并返回到其用户帐户的权限。

例 3.1. 使用超级账户安装程序
% configure
% make
% su -
Password:
# make install
# exit
%

内置的su(1)框架在单人系统或只有一位系统管理者的小型网络可以运作的很好。另一种方式是安装security/sudo套件或Port。此软件提供了活动记录且允许管理者设定那个使用者可以用超级使用者执行那个指令。

3.3.2. 管理用户

FreeBSD 有许多命令来管理用户账户。表 3.1 “管理用户账户的程序”中总结了一些常见命令和管理账户的例子。查看它们的手册页以获取更多信息。

表 3.1. 管理用户账户的程序
命令简介
adduser(8)添加账户。
rmuser(8)删除账户。
chpass(1)修改用户信息。
passwd(1)修改用户密码。
pw(8)可用于修改用户的所有信息。

3.3.2.1. adduser

建议用来新增新使用者的程式为adduser(8)。当新使用者新增之后,此程序会自动更新/etc/passwd以及/etc/group,这同时也会建立新使用者的家目录(复制/usr/share/skel中的预设配置文件),并且可以选择是否要寄送欢迎信息通知新使用者。这个工具必须使用超级使用者执行。

adduser(8)工具采用互动的方式,只需几个步骤便可建立新使用者帐号。如例 3.2 “在 FreeBSD 上添加用户”所示,可输入必填的资讯或按Return键采用方括中的预设值。在此例当中,使用者被邀请加入wheel群组,这让使用者可使用su(1)变成超级使用者。完成之后,此工具会询问是否要建立其他的使用者或离开。

例 3.2. 在 FreeBSD 上添加用户
# 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]:
Home directory permissions (Leave empty for default):
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!
#

注意:

密码输入时不会有任何提示,注意别输错了。

3.3.2.2. rmuser

要自系统完全移除一个使用者可使用超级使用者执行rmuser(8)。这个指令会执行以下步骤:

  1. 移除使用者的crontab(1)项目,若项目存在。

  2. 移除任何属于该使用者的at(1)工作。

  3. 终止用户拥有的所有进程。

  4. 从系统的本地密码文件中删除用户。

  5. (可选) 删除用户的主目录(如果该目录为用户所拥有)。

  6. /var/mail中删除属于用户的传入邮件文件。

  7. 从临时文件存储区域 (如/tmp) 中删除用户拥有的所有文件。

  8. 最后,自/etc/group中该使用者所属的所有群组移除该使用者。若群组无任何成员且群组名称与该使用者名称相同,则该群组也会一并移除。这是为了辅助 adduser(8)替每位使用者建立独一无二的群组。

rmuser(8)无法用来移除超级使用者帐号,因为这几乎代表着大规模破坏。

默认情况下使用交互模式,就像下面这样。

例 3.3. rmuser 交互模式删除账户
# 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
Removing user (jru): mailspool home passwd.
#

3.3.2.3. chpass

任何使用者都可以使用chpass(1)来变更自己的预设Shell以及与自己的使用者帐号关联的个人信息。超级使用者可以使用这个工具更改任何使用者的其他帐号信息。

除了选填的使用者名称外,未传入任何选项时,chpass(1)会开启含有使用者信息的编辑器。当使用者自编辑器离开,便会更新新的资讯到使用者数据库。

注意:

离开编辑器时,此工具会提示使用者输入密码,除非使用超级使用者执行此工具。

例 3.4 “超级用户使用 chpass中,超级使用者输入了chpass jru并正在检视这个使用者可以更改的字段。若改以jru执行这个指令,只会显示最后六个字段供编辑,如例 3.5 “普通用户使用 chpass所示。

例 3.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:

例 3.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在第 29 章 网络服务器中有说明。

3.3.2.4. passwd

任何使用者皆可简单的使用passwd(1)更改自己的密码。要避免意外或未授权的变更,这个指令在设定新密码之前会提示使用者输入原来的密码:

例 3.6. 改变您的密码
% passwd
Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

超级使用者可以更改任何使用者的密码透过在执行passwd(1)时指定使用者名称。当此工具以超级使用者执行时,将不会提示输入使用者目前的密码,这可在使用者忘记原来的密码时更改密码。

例 3.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在两个指令上皆可运作。

3.3.2.5. pw

pw(8)工具可以建立、移除、修改以及显示使用者与群组,它的功能是做为系统使用者与群组档的前端。pw(8)有非常强大的的指令列选项集,这让该指令非常适合用于Shell scripts,但新的使用者可能会发现它比其他在本节的指令要复杂许多。

3.3.3. 管理用户组

群组代表一群使用者,群组可以由其群组名称及GID来辨识。在FreeBSD,核心会使用程序的UID以及其所属的群组清单来决定程序可以做那些事。大多数情况使用者或程序的GID通常指的是清单中的第一个群组。

群组名称与GID的对应表列在/etc/group。这个纯文字档案使用了四个以冒号分隔的字段,第一个字段为群组名称,第二个字段为加密后的密码,第二个字段为 GID以及第四个字段为以逗号分隔的成员清单。要取得更完整的语法说明,请参考group(5)

超级使用者可以使用文字编辑器修改/etc/group,或者可使用pw(8)加入与编辑群组。例如,要加入一个叫做teamtwo的群组然后确认该群组已新增:

例 3.8. 使用pw(8)添加用户组
# pw groupadd teamtwo
# pw groupshow teamtwo
teamtwo:*:1100:

在本例中,1100teamtwoGID。目前teamtwo没有任何成员,这个指令会加入jru作为teamtwo的成员。

例 3.9. 使用pw(8)加入使用者帐号到新的群组
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
teamtwo:*:1100:jru

-M的参数是以逗号分隔的使用者清单,用来加入成员到新的(空的)群组或取代既有群组中的成员。对使用者来说这里的群组成员与使用者列于密码档的主要群组不同(额外的),这代表在pw(8)使用groupshow时不会显示做为使用者主要群组的成员,但会显示在使用id( 1)或同类工具所查询的信息当中。当使用pw(8)来加入使用者到某个群组,该指令只会处理/etc/group且不会尝试自/etc/passwd读取其他的数据。

例 3.10. 使用pw(8)为用户组添加新成员
# pw groupmod teamtwo -m db
# pw groupshow teamtwo
teamtwo:*:1100:jru,db

在本例当中,给-m的参数是以逗号分隔的使用者清单,用来加入使用者到群组。不像前面的例子,这些使用者会加入到群组,而非取代既有群组中的使用者。

例 3.11. 使用id(1)确定组员
% id jru
uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

在本例中,jru是群组jru以及teamtwo的成员。

要取得更多有关此指令的信息及/etc/group的格式,请参考pw(8)以及group(5)

3.4. 权限

在 FreeBSD 中,每个文件和目录都有一组关联的权限,并且有几个实用程序可用于查看和修改这些权限。了解权限的工作方式是必要的,以确保用户能够访问他们所需的文件,并且无法不正确地访问操作系统使用或其他用户拥有的文件。

本节讨论传统的UNIX®在 FreeBSD 中使用的权限。有关更精细的文件系统访问控制,请参阅第 13.9 节 “文件系统访问控制表”

UNIX®,基础权限透过三种类型的存取来分配:读取、写入与执行。这些存取类型用来决定档案拥有者、群组以及其他人(其他任何人)的档案存取权。读取、写入及执行权限可使用rw,and x字母来表示。这些权限也可以使用二进位数字来表示每种权限的开或关(0)。当以二进位数字来表示时,阅读的顺序为rwx,其中r开启的值为4w开启的值为2以及x开启的值为1

表格4.1摘要了可用的数字及可用的字母。当阅读目录清单标示字段时,-用来代表该权限设为关闭。

表 3.2. UNIX® 权限
权限目录列表
0不可读,不可写,不可执行---
1不可读,不可写,可执行--x
2不可读,可写,不可执行-w-
3不可读,可写,可执行-wx
4可读,不可写,不可执行r--
5可读,不可写,可执行r-x
6可读,可写,不可执行rw-
7可读,可写,可执行rwx

使用ls(1)-l参数可以查看一个长目录列表,其中包含有关文件所有者、组和其他所有人的权限的信息列。例如,任意目录中的ls -l可能显示:

% 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

第一个(最左边)的字元用来表示这个档案的类型为何,除标准档案以外,尚有目录、特殊字元装置、Socket及其他特殊虚拟档案装置,在此例当中,-表示该档案为一个标准的档案。示例中接下来的三个字元中,rw-代表所有者对档案拥有的权限。再接下来的三个字元,r--则代表群组对档案拥有的权限,最后三个字元,r--则代表其他人对档案拥有的权限。破折号(-)表示没有权限,示例中的这个档案的权限,只允许所有者读取、写入档案,群组以及其他人仅能读取档案。根据以上的表格,此种权限的档案可以使用644来表示,每组数字分别代表档案的三种权限。

那系统如何控制装置的权限?实际上FreeBSD对大多的硬盘装置就如同档案,程序可以开启、读取以及写入数据如一般档案。这些特殊装置档案都储存于/dev/目录中。

目录也同如档案,拥有读取、写入及执行的权限,但在执行权限上与档案有明显的差异。当目录被标示为可执行时,代表可以使用cd(1)指令切换进入该目录。也代表能够存取在此目录之中的已知文件名的档案,但仍会受限于档案本身所设定的权限。

要能够列出目录内容,必须拥有目录的读取权限。要删除已知文件名的档案,必须拥有档案所在目录的写入以及执行的权限。

还有一些权限位,但这些权限主要在特殊情况使用,如setuid执行档及sticky目录。如果您还想知道更多档案权限的信息及使用方法,请务必参阅chmod(1)

3.4.1. 符号权限

Contributed by Tom Rhodes.

符号权限使用字符而非八进制值来分配文件或目录的权限。符号权限使用 (谁)(操作)(权限)的语法,其中以下值可用:

选项字母含义
(who)u用户
(who)g组所有者
(who)o其他
(who)aAll (world)
(action)+添加权限
(action)-删除权限
(action)=显式设置权限
(permissions)r
(permissions)w
(permissions)x执行
(permissions)t粘性位
(permissions)s设置 UID 或 GID

这些值与chmod(1)一起使用,但与字母而不是数字一起使用。例如, 以下命令将阻止其他用户访问FILE:

% chmod go= FILE

当必须对文件进行多组更改时,可以提供逗号分隔列表。例如,下面的命令删除组和world写入 FILE的权限,并添加每个人的执行权限:

% chmod go-w,a+x FILE

3.4.2. FreeBSD 文件标志

Contributed by Tom Rhodes.

除了文件权限外,FreeBSD 还支持file flags。这些标志添加了对文件(而非目录)的附加安全级别和控制。使用文件标志,即使是root也可以阻止删除或更改文件。

使用chflags(1)修改文件标志。例如,要在file1启用系统不可删除标志,请使用以下命令:

# chflags sunlink file1

要禁用系统不可删除标志,请在sunlink前放置no

# chflags nosunlink file1

要查看文件的标志,请使用-lo with ls(1):

# ls -lo file1
-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

多数的旗标仅能由root使用者来标示或移除,而部份旗标可由档案所有者设定。我们建议系统管理者可阅读chflags(1)chflags(2)说明以了解相关细节。

3.4.3. setuidsetgidsticky权限

Contributed by Tom Rhodes.

除了已经探讨过的权限外,这里尚有另外三种特别的设定所有管理者都应该知道,这些设定为setuidsetgid以及sticky权限。

这些设定对某些一般不会授权给一般使用者的UNIX®操作非常重要,它让这些功能可运作。要了解这些权限,就必须说明真实使用者ID(Real user ID)与有效使用者ID(Effective user ID)的差异。

真实使用者ID即是拥有者或启动程序者的UID,而有效UID是执行程序所使用的使用者ID。例如,passwd(1)在使用者更改自己的密码时会以真实使用者ID执行,然而,为了要更新密码数据库,该指令必须以root使用者做为有效ID来执行,这让使用者可以更改自己的密码而不会遇到权限不足(Permission Denied)的错误。

Setuid 权限可以透过在权限集前加上数字(4)来设定,如下示例所示:

# chmod 4755 suidexample.sh

现在suidexample.sh的权限会如下所示:

-rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

注意,s现在取代了原来的执行位成为指定档案拥有者权限集的一部份,这会允许须要提升权限的工具,如passwd(1)可正常使用。

注意:

mount(8)nosuid选项会造成这类Binary执行失败,但不会警告使用者。由于nosuid Wrapper可能可绕过该选项,因此该选项并非完全可靠。

实际来看这个示例,先开启两个终端机,其中一个用一般使用者输入passwd。在等待输入新密码的同时,检查程序表并查看passwd(1)程序的使用者信息:

在终端 A 中:

Changing local password for trhodes
Old Password:

在终端 B 中:

# ps aux | grep passwd
trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

尽管passwd(1)使用普通用户执行,但它使用的是root的有效UID。

setgid权限的功能与setuid相似,当应用程序或工具使用此设定执行时,将会以拥有该档案的群组来执行,而非执行行该程序的使用者。

要在档案设定setgid权限,需在chmod(1)的参数前加上(2):

# chmod 2755 sgidexample.sh

在以下列表中,请注意s现在位于为组权限设置指定的字段中:

-rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

注意:

在以上这些示例中,虽然在例子中的Shell script是可执行的档案,但并不会以其他的EUID或有效使用者ID执行,这是因为Shell script并不会存取setuid(2)系统呼叫(System call)。

setuidsetgid权限位可能会因允许提升权限而降低系统的安全性,因此有了第三个特殊的权限:sticky bit,可以加强系统的安全性。

当在目录上设定sticky bit,将只允许由档案拥有者删除档案。这对避免公开目录,如/tmp中的档案被不拥有该档案的人删除非常有用。要使用这个权限,可在权限集前加上(1):

# chmod 1777 /tmp

sticky bit权限会以t显示于权限集的最后:

# ls -al / | grep tmp
drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

3.5. 目录结构

FreeBSD 目录层次结构是全面了解系统的基础。最重要的目录是根目录或/。此目录是在启动时安装的第一个目录,它包含为多用户操作准备操作系统所需的基本系统。根目录还包含在转换为多用户操作期间装载的其他文件系统的装载点。

「挂载点」就是让新增的文件系统,能接到上层的文件系统(通常就是「根目录」文件系统)的目录。在第 3.6 节 “磁盘组织”这边对此有更详细介绍。标准的挂载点包括了/ usr//var//tmp//mnt/以及/cdrom/。这些目录通常会记录在/etc/fstab配置文件内。/etc/fstab是记录各文件系统及相关挂载点的表格。大部分在/etc/fstab有记录的文件系统,会在开机时由rc(8) Script来自动挂载,除非它们有设定noauto选项。其中细节说明可参阅第 3.7.1 节 “fstab 文件”

文件系统层次结构的完整描述在hier(7)中可找到。下表简要概述了最常见的目录。

目录描述
/文件系统的根目录。
/bin/对单用户和多用户环境都至关重要的程序。
/boot/启动操作系统所需的程序和配置文件。
/boot/defaults/默认引导配置文件。更多详细信息,请参阅 loader.conf(5)
/dev/设备节点。更多详细信息,请参阅 intro(4)
/etc/系统配置文件和脚本。
/etc/defaults/系统默认配置文件,更多详细信息请参阅rc(8)
/etc/mail/邮件传输代理(如sendmail(8))的配置文件。
/etc/periodic/通过cron(8)执行的定时脚本,更多详细信息请参阅periodic(8)
/etc/ppp/ppp(8) 配置文件。
/mnt/系统管理员通常用作临时装载点的空目录。
/proc/进程文件系统。更多信息请参阅procfs(5), mount_procfs(8)
/rescue/用于紧急恢复的静态链接的程序,参见 rescue(8)
/root/root 账户的主目录。
/sbin/系统程序和管理工具,对单用户和多用户环境都至关重要。
/tmp/临时文件通常在重启后被除。基于内存的文件系统通常挂载在/tmp。在rc.conf(5)/etc/fstab中设置好相关参数可自动挂载 tmpmfs。更多详情请参阅mdmfs(8)
/usr/大多数的用户工具和应用程序。
/usr/bin/常用工具,编程工具,以及应用程序。
/usr/include/标准 C 头文件。
/usr/lib/存放库文件。
/usr/libdata/存放各种实用工具的数据文件。
/usr/libexec/System daemons and system utilities executed by other programs.
/usr/local/存放本地执行文件, 库文件等等, 同时也是 FreeBSD ports 安装的默认安装目录。 /usr/local/usr 中的目录布局大体相同, 请查阅 hier(7)。 但 man 目录例外, 它们是直接放在 /usr/local 而不是 /usr/local/share 下的, 而 ports 说明文档在 share/doc/port
/usr/obj/通过联编 /usr/src 得到的目标文件。
/usr/ports/存放 FreeBSD 的 Ports Collection (可选)。
/usr/sbin/存放系统后台程序 和 系统工具 (由用户执行)。
/usr/share/存放架构独立的文件。
/usr/src/存放 BSD 或者本地源码文件。
/var/多用途日志、 临时或短期存放的, 以及打印假脱机系统文件。 有时会将基于内存的文件系统挂在 /var 上。 这一工作可以通过在 rc.conf(5) 中设置一系列 varmfs 变量 (或在 /etc/fstab 中加入一行配置; 参见 mdmfs(8)) 来完成。
/var/log/存放各种的系统记录文件。
/var/mail/用户邮箱文件。
/var/spool/打印及邮件系统后台杂项目录。
/var/tmp/临时文件,一般在系统重新启动后会被保留,除非 /var 是一个内存文件系统。
/var/yp/NIS 映射。

3.6. 磁盘组织

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

各种文件存放在目录里。 一个目录可以为空, 也可以含有多个的文件。一个目录同样可以包含其他的目录, 允许您在一个目录里建立多个不同层次的目录。 这将帮助您轻松地组织您的数据。

文件和目录的引用方式是,在文件或目录名后面加上一个前斜线,/,再加上其他必要的目录名。例如,文件夹foo中有个名为bar的文件夹,bar中有个文件名为readme.txt,那么文件的全名或路径就是foo/bar/readme.txt。请注意, 这与 Windows® 不同, Windows® 使用 \将文件和目录名分开。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目录:

完全有可能有一个大型根文件系统,并且不需要创建任何其他系统。这种方法有一些缺点,还有一个优点。

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

  • FreeBSD 能根据一个文件系统使用的情况自动优化 这个文件系统上的文件布局。 所以对一个存储了大量小文件并会被频繁写入文件系统的优化与一个存储了少量大文件的优化是不同的。 而在一个大的单一文件系统上则无法体现这样的优化。

  • FreeBSD 的文件系统能够在断电时尽可能避免损失。 然而, 在关键点时的电源失效仍然可能会破坏文件系统的结构。 将您的文件系统分成多个有助于分散风险, 并方便备份和恢复。

单一文件系统的益处
  • 文件系统是固定大小的。当安装FreeBSD时新建一个文件系统并设定一个大小,您会在稍后发觉到必须去建一个大的分区。如果配置不当,则需要备份、重新创建文件系统,然后再恢复数据。

    重要:

    FreeBSD 提供了 growfs(8) 命令。 这使得能够实时地调整文件系统的大小, 因而不再受其限制。

文件系统是和分区一一对应的。 这里的分区和常用的术语分区 (例如, MS-DOS® 分区) 的意思并不一样, 这是由于 FreeBSD 的 UNIX® 传统造成的。 每一个分区使用一个从 ah 的字母来表示。 每个分区只能包含一个文件系统, 这意味着文件系统通常可以由它们在文件系统目录结构中的挂接点, 或对应的分区字母来表示。

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

某些 partitions 的用途是确定的。

分区约定
a通常指定为根文件系统。
b通常指定为交换分区。
c通常它和所在的 slice 大小相同。 c 分区上工作时必定会影响到事整个 slice (举个例子,坏块扫描器)。 您通常不愿意在这个partition建立文件系统。
d分区 d 曾经有特殊的含义, 不过这种意义在现时的系统上已不再适用, 因此 d 可以和任何其它普通的分区一样使用了。

FreeBSD 中的磁盘分为多个切片,在Windows®中称为分区,这些分区编号从 1 到 4。然后,这些分区被划分为分区,这些分区包含文件系统,并使用字母进行标记。

Slice 编号在设备名后面, 并有一个 s 前缀, 从 1 开始。 因此 da0s1 是第一个 SCSI 驱动器的第一个 slice。 每个磁盘上只能有四个物理的 slices, 但您可以在物理 slice 中使用适当的类型来创建逻辑 slice。 这些扩展 slice 编号从 5 开始, 因此 ad0s5 是第一个 IDE 磁盘中的第一个 扩展 slice。 文件系统所使用的设备应该占满 slice。

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

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

当在 FreeBSD 中指定 partition 名字时, 必须同时包含这个分区的 slice 和磁盘的名字; 类似地, 在指定 slice 时, 也应该给出包含该 slice 的磁盘名字。 可这样列出: 磁盘名称,s,slice 编号,和partition标定字母。 例子请看 例 3.12 “示例磁盘、Slice 和分区名称”

例 3.13 “磁盘的概念模型” 这里显示了一个磁盘的布局,有更清楚的帮助。

在安装FreeBSD时,您首先要配置好磁盘slices, 然后在FreeBSD使用的slice上建立partitions。 并在每个partition上建立一个文件系统(或交换分区), 和指定文件系统的挂接位置。

表 3.3. 磁盘设备名字
驱动器类型驱动器设备名称
SATAIDE 硬盘adaad
SCSI 硬盘和 USB 硬盘da
SATAIDE CD-ROM 驱动器cdacd
SCSI CD-ROM 驱动器cd
软盘fd
各种非标准CD-ROM驱动器mcd用于 Mitsumi CD-ROMscd,用于索尼CD-ROM设备
SCSI 磁带驱动器sa
IDE 磁带驱动器ast
RAID 设备示例包含aacd代表Adaptec® AdvancedRAID,mlxdmlyd代表Mylex®,amrd代表AMI MegaRAID®,idad代表Compaq SmartRAID,twed代表3ware® RAID.

例 3.12. 示例磁盘、Slice 和分区名称
名称含义
ada0s1a第一个 SATA 硬盘(ada1)上的第一个 slice(s1)上的第一个分区(a)。
da1s2e第一个 SCSI 硬盘(da1)上的第一个 slice(s2)上的第五个分区(e)。

例 3.13. 磁盘的概念模型

这张图显示的是 FreeBSD 的第一个 SATA 磁盘的视图。假设该磁盘的大小为 250 GB, 并包含一个 80 GB 的分区和一个 170 GB 的分区 (MS-DOS® 分区)。第一个分区包含一个 Windows® NTFS 文件系统C:, FreeBSD 安装在第二个分区上。这个例子中的 FreeBSD 安装有四个数据分区和一个 swap 分区。

这四个分区各自控制一个文件系统。a 分区用于根文件系统,d 分区用于 /var/ 目录层,e 分区用于 /tmp/ 目录层,f 分区用于 /usr/ 目录层。分区字符c用于代表整个 slice,故不用于普通分区。


3.7. 挂载和卸载文件系统

这种文件系统就像一棵树那样用/确立根部, 是比较理想的文件系统。 而/dev/usr 和其他目录就是根目录的分枝, 另外这些目录可以再分枝,例如/usr/local

应该考虑给某些目录一些空间从而分散文件系统。 /var 之下包含目录 log/,目录spool/, 和不同类型的临时文件,很可能把它塞满。 把什么都塞进根文件系统不是一个好主意, 好的做法是应该把 /var/分离出去。

另一个要考虑的是,给物理设备或虚拟磁盘这些自带空间的文件系统确定目录结构树。 例如 网络文件系统 或光驱。

3.7.1. fstab 文件

引导过程 期间, 自动挂上/etc/fstab所列出的文件系统。 (除非他们注明为noauto 选项)。该文件包含的各行的列表格式如下:

device       /mount-point fstype     options      dumpfreq     passno
device

设备名称(设备必须存在),说明在 表 3.3 “磁盘设备名字”.

挂载点

目录 (目录必须存在),用在那个挂接上的文件系统上。

fstype

文件系统类型,请通过mount(8)查阅。 默认的FreeBSD文件系统类型是ufs

options

设为可读写文件系统的rw选项, 或设为只读文件系统的ro选项, 或其他一些选项,可随意选一个。 一个常用的选项 noauto 用在不需在引导过程期间挂接的文件系统。 其他的选项在 mount(8) 手册里列出。

dumpfreq

dump(8) 使用这项去决定那个文件系统必须移贮。 假如缺少这项,默认的数值为0。

passno

这一项决定文件系统的检查顺序, 文件系统想跳过检查应将passno设为0。 根文件系统(那个是在每方面开始之前必须检查的) 应该将它的 passno 设为1, 其他文件系统的 passno 必须把数值设到大于1。假如多个文件系统的passno的值相同, 那么 fsck(8) 在允许的情况下将尝试并行地去检查文件系统。

请参阅 fstab(5) 联机手册, 以获得关于 /etc/fstab 文件格式, 以及其中所包含的选项的进一步信息。

3.7.2. 使用 mount(8)

使用mount(8)装载文件系统。最基本的语法如下:

# mount device mountpoint

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

挂载选项
-a

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

-d

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

-f

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

-r

以只读方式挂接文件系统。 这和在指定了 -o 选项配合 ro 参数的效果是一样的。

-t fstype

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

-u

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

-v

输出详细信息。

-w

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

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

nosuid

不允许文件系统上的二进制程序执行。这也是一个有用的安全选项。

3.7.3. 使用 umount(8)

umount(8) 命令同样采用一个参数、一个挂接点、一个设备名。 或采用-a选项,又或采用-A选项。

所有格式都可采用 -f 去强行卸下, 或采用-v 用那适当的版本。 但警告,采用 -f并不是一个好主意, 强行卸下文件系统可能损坏计算机或破坏文件系统上的数据。

-a-A 会卸下所有已挂接的文件系, 可能通过-t后面列出的文件系统进行修改, 但无论如何,-A都不会尝试去卸下根文件系统。

3.8. 进程和守护进程

FreeBSD 是一个多任务操作系统。 这就意味着好像一次可以运行一个以上的程序。 每个占用一定时间运行的程序就叫 进程 (process)。 你运行的每一个命令会至少启动一个新进程,还有很多一直运行着的系统进程, 用以维持系统的正常运作。

每个进程用来标识的一个编号就叫 进程 ID, 或叫 PID。 而且,就像文件那样,每个进程也有所属用户和所属群体。 所属用户和所属群体使用在这方面:确定这个进程可以打开那些文件和那些设备, 从而在初期使用文件的权限。 多数的进程都有一个父进程, 而进程是依靠父进程来启动的。 例如,假如您把命令输入到shell里那shell是一个进程,而您运行的各个命令同样是进程, 那么,shell就是您各个运行进程的父进程。 而这方面有一个例外的进程就叫init(8)init始终是首个进程,,所以他的PID始终是1, 而init在FreeBSD起动时由内核自动启动。

有些程序在运行时,并不是为了让用户连续输入而设计的,它们在启动后将断开与终端的连接。例如,Web 服务器响应 Web 请求,而不是用户输入。另一个例子是邮件服务器。这些类型的程序被称为守护进程(daemons)。daemon这个词来自于希腊神话,代表着一个既非善也非恶的实体,它无形中执行着有用的任务。这也是 BSD 的吉祥物是一个穿着运动鞋,拿着干草叉的快乐的守护神的原因。

守护进程的程序命名通常在最后加一个 dBIND 是伯克利互联网域名服务 (而实际执行的程序名称则是 named), Apache web系统的程序就叫 httpd, 在行式打印机上的打印守护进程就是 lpd。 这只是一种惯例,不是标准或硬性规定。 例如,为Sendmail而应用的主要mail守护进程就叫sendmail, 却不叫maild,这和您推测的一样。

3.8.1. 查看进程

在系统上,有两个命令对进程观察非常有用:ps(1)top(1)。 这个ps命令作用是观察当前运行进程的状态, 显示他们的PID,使用了多少内存,它们启动的命令行。 而top命令则是显示所有运行进程,并在以秒计的短时内更新数据。 您能交互式的观察您计算机的工作。

默认情况下,ps(1) 仅显示出您自己所运行的命令。 例如:

% ps
 PID TT  STAT    TIME COMMAND
8203  0  Ss   0:00.59 /bin/csh
8895  0  R+   0:00.00 ps

在这个例子里您可看到,从 ps(1) 输出的每一列是有规律的。 PID 就是进程ID,这个较早前已讨论过了。 PID号的分配由 1一直上升直到99999, 当您运行到超过限制时,这些编号会回转分配 (仍在使用中的 PID 不会分配给其他进程)。 TT这一列显示了程序运行所在的终端, 目前可以安全地忽略。 STAT 显示程序的状态,也可以安全地被忽略。 TIME是程序在CPU处理时间──运行的时间量, 并不是指您程序启动到现在的所用的时间。 许多程序碰巧遇到某方面在他们之前要花费大量CPU处理时间时,他们就必须等候。 最后, COMMAND 是运行程序时使所用的命令行。

ps(1)支持使用各种选项去改变显示出来的内容, 最有用的一个就是auxwwa选项显示出所有运行进程的内容, 而不仅仅是您的进程。 u选项显示出进程所归属的用户名字以及内存使用, x 选项显示出后台进程。 而 ww 选项表示为 ps(1) 把每个进程的整个命令行全部显示完, 而不是由于命令行过长就把它从屏幕上截去。

top(1) 的输出类似:

% top
last pid:  9609;  load averages:  0.56,  0.45,  0.36              up 0+00:20:03  10:21:46
107 processes: 2 running, 104 sleeping, 1 zombie
CPU:  6.2% user,  0.1% nice,  8.2% system,  0.4% interrupt, 85.1% idle
Mem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M Free
ARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M Other
Swap: 2048M Total, 2048M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  557 root          1 -21  r31   136M 42296K select  0   2:20  9.96% Xorg
 8198 dru           2  52    0   449M 82736K select  3   0:08  5.96% kdeinit4
 8311 dru          27  30    0  1150M   187M uwait   1   1:37  0.98% firefox
  431 root          1  20    0 14268K  1728K select  0   0:06  0.98% moused
 9551 dru           1  21    0 16600K  2660K CPU3    3   0:01  0.98% top
 2357 dru           4  37    0   718M   141M select  0   0:21  0.00% kdeinit4
 8705 dru           4  35    0   480M    98M select  2   0:20  0.00% kdeinit4
 8076 dru           6  20    0   552M   113M uwait   0   0:12  0.00% soffice.bin
 2623 root          1  30   10 12088K  1636K select  3   0:09  0.00% powerd
 2338 dru           1  20    0   440M 84532K select  1   0:06  0.00% kwin
 1427 dru           5  22    0   605M 86412K select  1   0:05  0.00% kdeinit4

输出被分成两部分。头部(前五六行)显示了最后一个进程运行的PID、系统负载平均数(衡量系统的繁忙程度)、系统正常运行时间(上次重启后的时间)和当前时间。标题中的其他数字涉及到有多少个进程在运行,使用了多少内存和交换空间,以及系统在不同的CPU状态下花费了多少时间。如果ZFS文件系统模块已经加载,ARC行表示从内存缓存中读取了多少数据,而不是从磁盘中读取了多少数据。

标题下面的列,包含了类似ps(1)输出的信息,如PID、用户名、CPU时间量和启动进程的命令等。默认情况下,top(1)也会显示进程占用的内存空间量。这被分成两列:一列是总大小,一列是常驻大小。总大小是指应用程序需要多少内存,常驻大小是指现在实际使用的内存量。

top(1) 每两秒自动刷新一次,您可以用s改变刷新的秒数。

3.8.2. 关闭进程

要与执行中的程序或Daemon沟通唯一的方法是透过kill(1)指令传送信号(Signal)。信号有很多种,有些有特定的意义,有些则是会由应用程序来解读,应用程序的说明文件会告诉您该程序是如何解读信号。使用者只能送信号给自己所拥有的程序,送信号给其他人的程序会出现权限不足的错误。唯一的例外是root使用者,他可以送信号给任何人的程序。

操作系统在某些情况也会送信号给应用程序。假设有个应用程序写得不好,企图要存取它不该碰的內存的时候,FreeBSD会送一个Segmentation Violation信号(SIGSEGV)给这个程序。如果有一个应用程序用了alarm(3)的系统呼叫(System call)要求系统在过一段时间之后发出通知,时间到了的时候系统就会发出通知信号( SIGALRM)给该程序。

SIGTERMSIGKILL这两个信号可以拿来终止程序。用SIGTERM结束程序是比较有礼貌的方式,该程序收到信号后可以把自已所使用的日志档关闭及其他要在结束前要做的事完成,然后在关掉程序之前结束掉手边的工作。在某些情况下程序有可能会忽略SIGTERM,如它正在做一些不能中断的工作的话。

SIGKILL 不会被进程忽视。向进程发送 SIGKILL 通常能结束进程[1]

您可能会去使用 SIGHUPSIGUSR1SIGUSR2信号。 这都是些通用的信号,各种应用程序都可以应用 在各方面的信号发送。

假如您改变了web系统的配置文件──并想web系统去重读它的配置, 您可以停止然后再启动httpd。但这样做web系统会导致一个短暂 的中断周期,那样是不受欢迎的。几乎所有的守护进程在编写时,都会指定对SIGHUP 信号进行响应从而重读配置文件。 所以, 最好的方法, 就不是杀死并重启 httpd, 而是发一个 SIGHUP 信号给它。 因为在这方面没有一个标准,不同的守护进程有不同的用法,所以不了解时应读一下守护进程的文档。

过程 3.1. 向进程发送信号(Signal)

这个示例将会示范如何送一个信号给inetd(8)inetd(8)的配置文件是/etc/inetd.conf,而inetd(8)会在收到SIGHUP的时候重新读取这个配置文件。

  1. 使用pgrep(1)找到要接收信号的进程的 PID。本例中inetd(8) 的 PID 是 198:

    % pgrep -l inetd
    198  inetd -wW
  2. 使用 kill(1) 来发送信号。由于inetd(8) 属于 root。在发送信号前需获取 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. Shell

shell 提供了用于与操作系统交互的命令行接口。shell 接收来自输入通道的命令并执行这些命令。许多 shell 提供内置函数来帮助处理日常任务, 如文件管理、文件全球化、命令行编辑、命令宏和环境变量。FreeBSD配置集中shell可供选择, 包括Bourne shell (sh(1)) 和extended C shell (tcsh(1))。其他shell,如 zsh and bash可从FreeBSD ports集合中获得, 。

您想使用哪一种shell取决于您的喜好, 假如您是C程序设计师,您可能选择一个C-like shell例如tcsh。 假如您是从 Linux 过来的或是一个命令行的新手,您可能会试一下bash。 这一点告诉我们每一个shell都有各自的特性,可能适用于您的工作环境,也可能不适用于您的工作环境。

每个shell都有一个共通点就是文件名补全。 输入命令或文件名的前几个字,然后按Tab键,就能靠shell的自动补全功能得出 命令或文件名。这里有一个例子,假设您有两个文件叫 foobarfoo.bar,而您想删除 foo.bar, 可这样在键盘上输入 rm fo 然后按 Tab 来补全文件名。

但shell只显示rm foo。由于foobarfootball都以foo开始,因此无法补全文件名。如果多个名称匹配,则某些shell会发出蜂鸣声或显示所有选项。然后, 用户必须键入更多字符来标识所需的文件名。键入 t 并再次按 Tab 就足以让 shell 确定所需的文件名并填写其余文件。

Shell 的另一个功能是使用环境变量。环境变量是存储在 shell 环境中的变量/键对。此环境可以由 shell 调用的任何程序读取,因此包含大量程序配置。表 3.4 “常见环境变量”提供了常见环境变量及其含义的列表。请注意,环境变量的名称必须大写。

表 3.4. 常见环境变量
变量描述
USER当前登录进入的用户名。
PATH搜索程序路径,以两点的冒号分隔开。
DISPLAY假如有这个变量的话,就是Xorg显示器的网络名称。
SHELL当前所用的shell。
TERM用户终端的名字,通常用在确定终端的能力。
TERMCAP各种终端功能所用终端分离编码的基本数据项目。
OSTYPE操作系统类型,默认是FreeBSD。
MACHTYPE是指系统上运行的CPU体系结构。
EDITOR用户首选的文本编辑器。
PAGER用户首选的文本页面调度程序 。
MANPATH搜索联机手册路径,以两点的冒号分隔开。

不同的shell设置环境变量也不相同。举个例子, 在如tcshcsh这样的C-Style shell, 您必须使用setenv去设置环境变量。 而在如shbash这样的Bourne shell, 您必须使用export去设置当前环境变量。 再举个例子,要去设置或改变EDITOR环境变量, 在cshtcsh下将EDITOR设为 /usr/local/bin/emacs:

% setenv EDITOR /usr/local/bin/emacs

而在 bash 下,则是:

% export EDITOR="/usr/local/bin/emacs"

您也可以在命令行上加一个$字符在变量之前从而取得环境变量。 举个例子,用echo $TERM 就会显示出$TERM的设定值, 其实就是shell取得$TERM并传给echo来显示的。

Shell 将特殊字符(称为元字符)视为数据的特殊表示。最常见的元字符是*,它表示文件名中的任意数量的字符。元字符可用于执行文件名全局处理。例如,echo *相当于ls,因为 shell 接受所有匹配*的文件,并且echo在命令行中列出它们。

为了防止shell去分析这些特别字符, 我们可在它之前加一个 \字符去说明它只是普通字符。 echo $TERM就会显示出您的终端情况, 而 echo \$TERM 就会显示出 $TERM 这几个字。

3.9.1. 切换 Shell

改变您的Shell的最简单方法是使用 chsh 命令。 执行 chsh 将根据您设定的EDITOR 环境变量进入到那个编辑器,假如没有设定,就会进入vi编辑器。 请改变Shell:这行对应值。

您可使用 chsh -s, 这样就能设置您的shell却又不用编辑器。假如您想把 Shell 改为bash

% chsh -s /usr/local/bin/bash

注意:

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

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

然后运行chsh

3.9.2. 高级 Shell 使用技巧

Written by Tom Rhodes.

UNIX® Shell不只是指令的直译器,它是一个强大的工具可让使用者执行指令、重新导向指令的输出、重新导向指令的输入并将指令串连在一起来改进最终指令的输出结果。当这个功能与内置的指令混合使用时,可提供一个可以最佳化效率的环境给使用者。

Shell重新导向是将一个指令的输出或输入传送给另一个指令或档案。例如,要撷取ls(1)指令的输出到一个档案,可以重新导向输出:

% ls > directory_listing.txt

目录的内容现在会列到directory_listing.txt中,部份指令可以读取输入,例如sort(1)。要排序这个清单,可重新导向输入:

% sort < directory_listing.txt

输入的内容会被排序后呈现在画面上,要重新导向该输入到另一个档案,可以重新导向sort(1)的出输:

% sort < directory_listing.txt > sorted.txt

于上述所有的示例中,指令会透过档案描述符(File descriptor)来执行重新导向。每个UNIX®系统都有档案描述符,其中包含了标准输入(stdin)、标准输出(stdout)以及标准错误(stderr)。每一种档案描述符都有特定的用途,输入可能来自键盘或鼠标、任何可能提供输入的来源,输出则可能是屏幕或打印机中的纸张,而错误则为任何可能用来诊断的信息或错误讯息。这三种皆被认为是以I/O为基础的档案描述符,有些也会被当做串流。

透过使用这些档案描述符,Shell能够让输出与输入在各种指令间传递与重新导向到或自档案。另一种重新导向的方式是使用管线运算子(Pipe operator)。

UNIX®的管线运算子,即|,可允许指令的输出可直接传递或导向到另一个程序。基本上,管线运算子允许指令的标准输出以标准输入传递给另一个指令,例如:

% cat directory_listing.txt | sort | less

在这个例子中,directory_listing.txt的内容会被排序然后输出传递给less(1),这可让使用者依自己的阅读步调卷动输出的结果,避免结果直接卷动出画面。

3.10. 文本编辑器

FreeBSD 的很多配置都可以通过编辑文本文件来完成。 因此, 最好能熟悉某种文本编辑器。 FreeBSD 基本系统中提供了一些, 您也可以从 Ports Collection 安装其它编辑器。

最容易学的而又简单的编辑器是 ee编辑器, 是个标准的简易编辑器。 要启动 ee,首先就要在命令行输入 ee filenamefilename 是一个要编辑的文件名。 例如,要编辑 /etc/rc.conf就要输入 ee /etc/rc.conf,在 ee的控制内, 编辑器所有功能的操作方法都显示在最上方。 这个^ 字符代表 键盘上的Ctrl 键, 所以^e 就是 Ctrl+e组合键。 假如想离开ee, 按Esc键,就可选择离开编辑器。 当您修改了内容的时候,编辑器会提示您保存。

FreeBSD本身也带许可多有强大功能的文本编辑器, 例如 vi。还有其他在FreeBSD Ports里几种, 像 emacsvim。 这些编辑器有着强大的功能,但同时学习起来比较复杂。 不管怎样,假如您从事文字编辑方面的工作, 学习如vimemacs 这些有强大功能的编辑器用法, 在长时间工作里会帮您节省不少的时间。

很多需要修改文件或打字输入的应用程序都会自动打开一个文本编辑器。 更改默认使用的编辑器, 请设置 EDITOR 环境变量。 参阅 第 3.9 节 “Shell” 以获取更多详细信息。

3.11. 设备和设备节点

在一个系统里,硬件描述通常用法就是一个设备对应一个术语,包括磁盘、打印机、显卡和键盘。 当 FreeBSD 启动过程中,大多数的设备都能探测到并显示出来, 您也可以查阅/var/run/dmesg.boot, 引导时所有信息都在里面。

每个设备都有设备名和编号,比如 ada0 代表第一个 SATA 硬盘。kbd0 代表键盘。

在 FreeBSD 操作系统里,大多数设备存在的特殊访问文件就是叫做设备节点, 他们都定位在/dev目录里。

3.12. 手册页

最详细的使用说明文档莫过于 FreeBSD 里的联机手册了。 几乎每一个程序都会附上一份简短说明, 以介绍这个程序的的基本功能以及参数的用法。 我们能通过 man 命令来阅读这些说明, 而使用 man 命令却是简单的事情:

% man command

command 就是您要了解的命令命称。 举个例子,想了解 ls(1) 命令就输入:

% man ls

这些在线手册分下列章节:

  1. 用户命令。

  2. 系统调用以及错误代码。

  3. C 库文件里的函数说明。

  4. 设备驱动。

  5. 文件格式。

  6. 游戏以及其他娱乐。

  7. 各种资讯。

  8. 系统维护以及命令。

  9. 系统内核接口。

在某些情况下,同样的主题也会出现在在线手册的不同章节。 举个例子,系统里有chmod这个用户命令,而又有个 chmod() 系统调用。 在这种情形下,您应当向 man(1) 命令指定需要的内容:

% man 1 chmod

这样就会显示出手册里的用户 chmod 命令。 传统上,我们在写入文档时把特定详细参考内容在在线手册括号里注明。 所以 chmod(1) 是指 chmod 用户命令, 而 chmod(2) 是指系统调用。

如果您已经知道命令的名字,只是不知道要怎样使用的话,那就比较好办。 但您连名字都不知道呢?这个时候您就可以利用 man 的搜寻功能, 它会在手册的介绍部份找寻您要搜寻的关键字,它的选项是 -k

% man -k mail

当您使用这个命令的时候,man会把介绍里含有mail关键字 的命令列出来,实际上这和apropos(1)命令的功能是相同的。

有时您会看到/usr/bin 下有许多命令但不知他们的用途, 您只需这样做:

% cd /usr/bin
% man -f * | more

% cd /usr/bin
% whatis * |more

3.12.1. GNU Info 文件

FreeBSD许多应用软件以及实用工具来自Free软件基金会(FSF)。 作为手册的扩充,这些程序提供了一种更具有活力的超文档说明info, 您可用info命令来阅读他们。 假如您装上emacs,也能利用emacs 的info模式来阅读。

要使用 info(1),输入:

% info

想得到简单介绍, 请按 h。 想快速得到的命令说明, 请按 ?



[1] 还是有少数东西不能被中断。例如有个程序正在从网络上的别的电脑读一个档案,而那部电脑因为某些理由连不到,那这个程序就是一个不能中断的程序。通常在经过2分钟左右之后这个程序会逾时。当发生逾时的时候这个程序就会被结束掉了。

第 4 章 使用 Package 和 Ports 安装应用程序

4.1. 简介

FreeBSD 将许多系统工具捆绑作为基本系统的一部分。 然而, 要完成实际的工作, 可能还需要安装更多的第三方应用。 FreeBSD 提供了两种补充的技术, 用以在您的系统中安装第三方软件: FreeBSD Ports 套件 (用于从源代码安装), 以及 packages (用以从预编译的二进制版本安装)。 这两种方法都可以用于从本地介质, 或从网上直接安装您喜欢的应用程序的最新版本。

读完本章节,你将会知道:

  • 二进制包和 ports 之间的差异。

  • 如何查找已移植到 FreeBSD 的第三方软件。

  • 如何使用pkg管理二进制包。

  • 如何使用 Ports 集合从源构建第三方软件。

  • 如何查找与应用程序一起安装的文件,以便进行安装后配置。

  • 如果软件安装失败,该怎么办。

4.2. 软件安装概览

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

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

  2. 提取安装文件(其中代表性的是用 compress(1), gzip(1), 或 bzip2(1) 压缩过的tar包)。

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

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

  5. 测试和安装软件。

FreeBSDport是一组文件,旨在自动从源代码编译应用程序的过程。构成端口的文件包含自动下载、提取、修补、编译和安装应用程序所需的所有信息。

如果软件尚未在 FreeBSD 上进行了调整和测试,则源代码可能需要编辑才能安装并正常运行。

超过24,000个第三方应用程序已被移植到 FreeBSD。在可行的情况下, 这些应用程序可作为预编译的 packages下载。

可以使用 FreeBSD 包管理命令管理软件包。

Packages 和 Ports 都能处理依赖关系。如果使用Packages 或 Ports安装应用程序,并且尚未安装依赖库,则将首先自动安装该库。

FreeBSD 软件包包含应用程序的所有命令的预编译副本,以及所有配置文件和文档。可以使用pkg(8)命令管理软件包(如pkg install)。

虽然这两种技术相似,但 Packages 和 Ports 各有其优点。 使用哪一种完全取决于您自己的喜好。

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

  • Package 不需要编译时间。对于大型应用程序,如MozillaKDE、或GNOME,这对度较慢的系统上非常重要。

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

Port 优势
  • package 通常使用较为保守的编译选项,因为它必须适配大多是系统。从 Port 编译,可以更改编译选项。

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

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

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

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

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

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

警告:

安装任何应用程序之前, 应首先查看 https://vuxml.freebsd.org/或使用pkg audit -F检查是否有关于您所安装的应用程序的安全问题报告。

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

4.3. 寻找您要的应用程序

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

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

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

  • 如果找到特定的应用程序比较困难,请尝试在 SourceForge.netGitHub.com上搜索,然后在FreeBSD site查看应用程序是否已被移植。

  • 使用下列命令搜索 pkg 中的软件包:

    # pkg search subversion
    git-subversion-1.9.2
    java-subversion-1.8.8_2
    p5-subversion-1.8.8_2
    py27-hgsubversion-1.6
    py27-subversion-1.8.8_2
    ruby-subversion-1.8.8_2
    subversion-1.8.8_2
    subversion-book-4515
    subversion-static-1.8.8_2
    subversion16-1.6.23_4
    subversion17-1.7.16_2

    软件包名字中带有版本号。如果这个软件使用 Python 写的,包名中还会包含软件使用的 Python 版本号。一些软件可能会有很多个版本。以Subversion为例,就有许多不同的版本,还有不同的编译参数。在本例中,静态链接的Subversion版本。指示要安装哪个包时,最好按 Port 源指定应用程序,Port 源是 Port 树中的路径。使用 pkg search -o 列出每个包的来源:

    # pkg search -o subversion
    devel/git-subversion
    java/java-subversion
    devel/p5-subversion
    devel/py-hgsubversion
    devel/py-subversion
    devel/ruby-subversion
    devel/subversion16
    devel/subversion17
    devel/subversion
    devel/subversion-book
    devel/subversion-static

    pkg search支持使用 Shell 通配符(globs)、正规表示法、描述或档案库中的其他其他内容。在安装ports-mgmt/pkgports-mgmt/pkg-devel之后,可参考pkg-search(8) 以取得更多详细信息。

  • 若 Port 软件集已安装,有数个方法可以查询 Port 树中的本地版本。要找到 Port 所在的分类,可输入whereis file,其中file是要安装的程序:

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

    或使用echo(1)

    # echo /usr/ports/*/*lsof*
    /usr/ports/sysutils/lsof

    请注意,这也会显示已下载至/usr/ports/distfiles目录中任何已符合条件的文件。

  • 另一个方法是使用 Port 套件集内置的搜寻机制来找软件。要使用搜寻的功能需先cd/usr/ports然后执行make search name=program-name,其中program-name代表软件的名称。举例搜索lsof

    # cd /usr/ports
    # make search name=lsof
    Port:   lsof-4.88.d,8
    Path:   /usr/ports/sysutils/lsof
    Info:   Lists information about open files (similar to fstat(1))
    Maint:  ler@lerctr.org
    Index:  sysutils
    B-deps:
    R-deps: 

    提示:

    内置的搜索机制会使用索引文件内的信息。若出现信息指出需要INDEX档,可执行make fetchindex来下载最新的索引文件。当INDEX文件存在时,make search方可执行请求的搜索动作。

    Path:此行代表Port的所在位置。

    若不要接受这么多信息,可使用quicksearch功能:

    # cd /usr/ports
    # make quicksearch name=lsof
    Port:   lsof-4.88.d,8
    Path:   /usr/ports/sysutils/lsof
    Info:   Lists information about open files (similar to fstat(1))

    若要进行更有深度的搜索,使用make search key=stringmake quicksearch key=string其中string是要搜索的文字。该文字可以是一部份的注释、描述或相依套件,当不清楚程序的名称时可以找到与特定主题相关的Port。

    当使用searchquicksearch时,搜索的字串不分大小写。搜索LSOF会与搜索lsof产生相同的结果。

4.4. 使用pkg管理二进制套件

pkg是新一代套件管理工具用来取代旧版工具,提供许多功能让处理二进制套件更快更简单。

对于只想要使用在FreeBSD镜像站上预先编译Binary套件的站台,使用pkg管理套件便已足够。

但是,对于那些想要从源码或使用自己的文件库编译的站台,则会需要Port管理工具

因为pkg仅能管理Binary套件,所以不能当做为替代Port管理工具,这些工具可用来安装来自Binary与Port套件集的软件,而pkg仅能安装Binary套件。

4.4.1. 开始使用pkg

FreeBSD内置启动(Bootstrap)工具可用来下载并安装pkg及其操作手册。这个工具是设计在FreeBSD版本10.X之后使用。

注意:

不是所有 FreeBSD 版本及构架支持此启动程序,目前支持的清单列于http://pkg.freebsd.org/,对不支持的版本,必须改透过Port套件集或者Binary套件来安装pkg

要初始化(Bootstrap)系统请执行:

# /usr/sbin/pkg

您必须有可用的网络连接(注:正常访问 pkg.freebsd.org)供启动程序使用方可成功。

否则,要安装Port套件,则须执行:

# cd /usr/ports/ports-mgmt/pkg
# make
# make install clean

当升级原使用旧版pkg_*工具的既有系统时,必须将数据库转换成新的格式,如此新的工具才会知道有那些已安装过的套件。pkg安装完后,必须执行以下指令将套件数据库从旧版格式转换到新版格式:

# pkg2ng

注意:

新安装的版本因尚未安装任何第三方软件因此不须做这个步骤。

重要:

这个步骤无法还原。一旦套件数据库转为成pkg的格式,旧版pkg_*工具就不该再继续使用。

注意:

套件数据库转换的过程可能会因内容转换为新版本产生错误。通常,这些错误皆可安全忽略,即使如此,仍然有在执行pkg2ng后无法成功转换的软件清单,这些应用程序则必须手动重新安装。

为了确保FreeBSD Port套件集会将新软件的信息注册到pkg而非旧版套件数据库,FreeBSD版本10.X之前需要在/etc/make.conf加入此行:

WITH_PKGNG=	yes

预设pkg会使用FreeBSD套件镜像站(Repository)的Binary套件。若要取得有关编译自定义套件文件库的信息,请参考第 4.6 节 “使用Poudriere编译套件”

其他pkg设定选项说明请参考pkg.conf(5)

pkg的用法信息可在pkg(8)操作手册或不加任何参数执行pkg来取得。

每个pkg指令参数皆记库在指令操件手册。要阅读pkg install的操作手册,可执行以下指令:

# pkg help install
# man pkg-install

本章节剩余部份将介绍如何使用pkg执行常用的Binary套件管理工作。每个示范的指令皆会提供多个参数可使用,请参考指令的说明或操作手册以取得详细信息或更多示例。

4.4.2. Ports 分支:Quarterly 和 Latest

Quarterly 分支为用户提供了更可预测和更稳定的 port 和软件包安装和升级体验。这主要是通过只允许非功能更新来实现的。季度(Quarterly)分支的目标是接收安全修复 (可能是版本更新, 或提交的回溯)、 错误修复和 port 合规性或框架变化。季度分支在每个(年)季度的1月、4月、7月和10月开始时从HEAD中切出。分支是根据它们创建的年份 (YYYY) 和季度 (Q1-4) 来命名的。例如,在2016年1月创建的季度分支,被命名为2016Q1。而Latest分支则为用户提供最新版本的软件包。

要从 quarterly 切换到 latest,请执行:

# cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf

修改 /usr/local/etc/pkg/repos/FreeBSD.confurl: 行的 quarterlylatest

输出像这样:

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  signature_type: "fingerprints",
  fingerprints: "/usr/share/keys/pkg",
  enabled: yes
}

最后运行这个命令来强制刷新源的元数据。

# pkg update -f

4.4.3. 取得有关已安装套件的信息

有关已安装在系统的套件信息可透过执行pkg info来检视,若执行时未指定任何参数,将会列出所有已安装或指定的套件版本。

例如,要查看已安装的pkg版本可执行:

# pkg info pkg
pkg-1.1.4_1

4.4.4. 安装和删除软件包

要安装Binary套件可使用以下指令,其中packagename为要安装的套件名称:

# pkg install packagename

这个指令会使用档案库的数据来决定要安装的软件版本以及是否有任何未安装的相依。例如,要安装curl

# pkg install curl
Updating repository catalogue
/usr/local/tmp/All/curl-7.31.0_1.txz          100% of 1181 kB 1380 kBps 00m01s

/usr/local/tmp/All/ca_root_nss-3.15.1_1.txz   100% of  288 kB 1700 kBps 00m00s

Updating repository catalogue
The following 2 packages will be installed:

        Installing ca_root_nss: 3.15.1_1
        Installing curl: 7.31.0_1

The installation will require 3 MB more space

0 B to be downloaded

Proceed with installing packages [y/N]: y
Checking integrity... done
[1/2] Installing ca_root_nss-3.15.1_1... done
[2/2] Installing curl-7.31.0_1... done
Cleaning up cache files...Done

新的套件以及任何做为相依安装的额外套件可在已安装的套件清单中看到:

# pkg info
ca_root_nss-3.15.1_1	The root certificate bundle from the Mozilla Project
curl-7.31.0_1	Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
pkg-1.1.4_6	New generation package manager

不再需要的套件可以使用pkg delete来移除,例如:

# pkg delete curl
The following packages will be deleted:

	curl-7.31.0_1

The deletion will free 3 MB

Proceed with deleting packages [y/N]: y
[1/1] Deleting curl-7.31.0_1... done

4.4.5. 升级已安装套件

执行以下指令,可将已安装的套件升级到最新版本:

# pkg upgrade

这个指令将会比对已安装的版本与在档案库分类中的版本,并从档案库升级这些套件。

4.4.6. 稽查已安装套件

在第三方的应用程序中偶尔可能会发现软件漏洞,要找出这些程序,可使用pkg内置的稽查机制。要查询已安装在系统上的软件是否有任何已知的漏洞可执行:

# pkg audit -F

4.4.7. 自动删除未使用的软件包

删除软件包可能会留下不需要的依赖项。可以使用以下方法自动检测和删除不需要的依赖(leaf packages):

# pkg autoremove
Packages to be autoremoved:
	ca_root_nss-3.15.1_1

The autoremoval will free 723 kB

Proceed with autoremoval of packages [y/N]: y
Deinstalling ca_root_nss-3.15.1_1... done

作为依赖项安装的包称为automatic包。Non-automatic,即不作为依赖项安装的软件包,可以使用以下方法列出:

# pkg prime-list
nginx
openvpn
sudo

pkg prime-list是在/usr/local/etc/pkg.conf中声明的别名命令。还有许多其他可用于查询系统的包数据库。例如,可以使用命令pkg prime-origins获取上述列软件包的在 Port 中的位置:

# pkg prime-origins
www/nginx
security/openvpn
security/sudo

此列表可用于使用构建工具(如 ports-mgmt/poudriere ports-mgmt/synth)等构建工具重建系统上安装的所有包。

将已安装的软件包标记为自动包:

# pkg set -A 1 devel/cmake

一旦一个软件包是依赖包并被标记为自动包,可以使用pkg autoremove删除它。

将已安装的软件包标记为非自动包,可以使用下列命令:

# pkg set -A 0 devel/cmake

4.4.8. 还原套件数据库

不如传统的套件管理系统,pkg有自己的套件数据库备份机制,此功能预设是开启的。

提示:

要停止周期的Script备份套件数据库可在periodic.conf(5)设定daily_backup_pkgdb_enable=“NO”

要还原先前套件数据库的备份,可执行以下指令并将/path/to/pkg.sql替换为备份的位置:

# pkg backup -r /path/to/pkg.sql

注意:

若要还原有周期Script所产生的备份必须在还原前先解压缩。

要手动备份pkg数据库,可执行以下指令,并替换/path/to/pkg.sql为适当的档案名称与位置:

# pkg backup -d /path/to/pkg.sql

4.4.9. 移除过时的套件

预设pkg会储存Binary套件在缓存目录定义在pkg.conf(5)中的PKG_CACHEDIR,只会保留最后安装的套件复本。较旧版的pkg会保留所有先前的套件,若要移除这些过时的Binary套件,可执行:

# pkg clean

使用以下指令可清空全部的缓存:

# pkg clean -a

4.4.10. 修改套件Metadata

在FreeBSD Port套件集中的软件可能会经历主要版号的修改,要解决这个问题可使用pkg内置的指令来更新套件来源。这非常有用,例如lang/php5重新命名为lang/php53因此lang/php5从此之后代表版本5.4

要更改上述例子中的套件来源,可执行:

# pkg set -o lang/php5:lang/php53

再一个例子,要更新lang/ruby18lang/ruby19,可执行:

# pkg set -o lang/ruby18:lang/ruby19

最后一个例子,要更改libglut共享程序库的来源从graphics/libglut改成graphics/freeglut可执行:

# pkg set -o graphics/libglut:graphics/freeglut

注意:

在更改套件来源之后,很重要的一件事是要重新安装套件,来让相依的套件也同时使用修改后的来源。要强制重新安装相依套件,可执行:

# pkg install -Rf graphics/freeglut

4.5. 使用Port套件集

Port套件集是指一数个Makefiles、修补及描述档案,每一组这些档案可用来编译与安装在FreeBSD上的一个应用程序,即称为一个Port

预设,Port套件集储存在/usr/ports的子目录下。

在应用程序可以使用Port编译之前,必须先安装Port套件集。若在安装FreeBSD时没有安装,可以使用以下其中一种方式安装:

过程 4.1. Portsnap方法

FreeBSD的基础系统内含Portsnap,这是一个可用来取得Port套件集简单又快速的工具,较建议多数使用者使用这个方式。此工具会联机到FreeBSD的网站,验证密钥,然后下载Port套件集的新复本。该密钥是要用来检验所有已下载档案的完整性。

  1. 要下载压缩后的Port套件集快照(Snapshot)到/var/db/portsnap

    # portsnap fetch
  2. 当第一次执行Portsnap时,要先解压缩快照到/usr/ports

    # portsnap extract
  3. 在完成上述第一次使用Portsnap的动作之后,往后可随需要执行以下指令来更新/usr/ports

    # portsnap fetch
    # portsnap update

    当使用fetch时也可同时执行extractupdate如:

    # portsnap fetch update
过程 4.2. Subversion方法

若要取得更多对Port树的控制,或若有本地的变更需要维护,可以使用Subversion来取得Port套件集。请参考Subversion Primer来取得Subversion的详细说明。

  1. 必须安装Subversion才可用来取出(Check out)Port树。若已存在Port树的复本,可使用此方式安装Subversion

    # cd /usr/ports/devel/subversion
    # make install clean

    若尚无法使用Port树,或已经使用pkg来管理套件,可使用套件来安装Subversion

    # pkg install subversion
  2. 取出Port树的复本:

    # svn checkout https://svn.FreeBSD.org/ports/head /usr/ports
  3. 若需要,在第一次Subversion取出后可使用以下指令更新/usr/ports

    # svn update /usr/ports

Port套件集中含有代表不同软件分类的目录,每个分类底下的子目录代表每个应用程序,每个内含数个用来告诉FreeBSD如何编译与安装该程序档案的应用程序子目录即称作Port Skeleton,每个Port Skeleton会含有以下档案及目录:

  • Makefile:内含用来说明应用程序要如何编译、要安装该程序到那的叙述句。

  • distinfo:内含编译Port必须下载的档案名称以及校验码(Checksum)。

  • files/:此目录含有编译与安装程序到FreeBSD时所需的修补档。此目录也可能含有其他用来编译Port的档案。

  • pkg-descr:提供程序更详细的说明。

  • pkg-plist:Port安装的所有档案清单,也同时会告诉Port系统卸载时要移除那一些档案。

部份Port含有pkg-message或其他档案用来处理特殊情况。要取得有关这些档案的详细信息,以及Port的概要可参考FreeBSD Porter's Handbook

Port中并不含实际的源码,即为distfile,在编译Port解压缩时会自动下载的源码到/usr/ports/distfiles

4.5.1. 安装Port

下面我们会介绍如何使用Port套件集来安装、移除软件的基本用法。make可用的目标及环境变数详细说明可参阅ports(7)

警告:

在编译任何Port套件前,请先确认已经如前章节所叙述之方法更新Port套件集。安装任何第三方软件皆可能会导致安全性漏洞,建议在安装前先阅读http://vuxml.freebsd.org/了解Port已知的安全性问题。或者在每次安装新Port前执行pkg audit-F。此指令可以设定在每日系统安全性检查时自动完成安全性稽查以及更新漏洞数据库。要取得更多资讯,请参考pkg-audit(8)periodic(8)

使用Port套件集会假设您拥有可正常联机的网络,同时也会需要超级使用者的权限。

要编译并安装Port,需切换目录到要安装的Port底下,然后输入make install,信息中会显示安装的进度:

# cd /usr/ports/sysutils/lsof
# make install
>> lsof_4.88D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
===>  Extracting for lsof-4.88
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.88D.freebsd.tar.gz.
===>  Patching for lsof-4.88.d,8
===>  Applying FreeBSD patches for lsof-4.88.d,8
===>  Configuring for lsof-4.88.d,8
...
[configure output snipped]
...
===>  Building for lsof-4.88.d,8
...
[compilation output snipped]
...

===>  Installing for lsof-4.88.d,8
...
[installation output snipped]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.88.d,8
===>   Registering installation for lsof-4.88.d,8
===>  SECURITY NOTE:
      This port has installed the following binaries which execute with
      increased privileges.
/usr/local/sbin/lsof
#

lsof是需要进阶权限才有办法执行的程序,因此当该程序安装完成时会显示安全性警告。一旦安装完成便会显示指令提示。

有些Shell会将PATH环境变数中所列目录中可用的指令做缓存,来增加在执行指这些指令时的查询速度。tcsh Shell的使用者应输入rehash来让新安装的指令不须指定完整路径便可使用。若在sh Shell则使用hash -r。请参考Shell的说明文件以取得更多资讯。

安装过程中会建立工作用的子目录用来储存编译时暂存的档案。可移除此目录来节省磁盘空间并渐少往后升级新版Port时造成问题:

# make clean
===>  Cleaning for lsof-88.d,8
#

注意:

若想要少做这个额外的步骤,可以编译Port时使用make install clean

4.5.1.1. 自定义Port安装

部份Port提供编译选项,可用来开启或关闭应用程序中的元件、安全选项、或其他允许自定义的项目。这类的应用程序例子包括www/firefoxsecurity/gpgme以及mail/sylpheed-claws。若Port相依的其他Port有可设定的选项时,预设的模式会提示使用者选择菜单中的选项,这可能会让安装的过程暂停让使用者操作数次。要避免这个情况,可一次设定所有选项,只要在Port skeleton中执行make config-recursive,然后再执行make install [clean]编译与安装该Port。

提示:

使用 config-recursive 時,會使用 all-depends-list Target 來收集所有要設定 Port 清單。建議執行 make config-recursive 直到所有相依的 Port 選項都已定義,直到 Port 的選項畫面不會再出現,來確定所有相依的選項都已經設定。

有许多方式可以重新进入Port的编译选项清单,以便在编译Port之后加入、移除或更改这些选项。方法之一是cd进入含有Port的目录并输入make config。还有另一个方法是使用make showconfig。最后一个方法是执行makermconfig来移除所有曾选择过的选项,让您能够重新设定。这些方法在ports(7)中都有详细的说明。

Port系统使用fetch(1)来下载档案,它支持许多的环境变数可设定。若FreeBSD系统在防火墙或FTP/HTTP代理服务器后面,可以设定 FTP_PASSIVE_MODEFTP_PROXY以及FTP_PASSWORD变数。请参考fetch(3)取得完整支持的变数清单。

对于那些无法一直联机到网际网络的使用者,可在/usr/ports下执行make fetch来下载所有的distfiles,或是可在某个分类的目录中,例如/usr/ports/net,或指定的Port Skeleton中执行。要注意的是,若Port有任何的相依,在分类或Port Skeleton中执行此指令并不会下载相依在其他分类的Port distfiles。可使用make fetch-recursive来下载所有相依Port的distfiles。

在部份少数情况,例如当公司或组织有自己的本地distfiles档案库,可使用MASTER_SITES变数来覆盖在Makefile中指定的下载位址。当要指定替代的位址时可:

# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch

也可使用WRKDIRPREFIXPREFIX变数来覆盖预设的工作及目标目录。例如:

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

会编译在/usr/home/example/ports的Port并安装所有东西到/usr/local下。

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

会编译在/usr/ports Port并安装到/usr/home/example/local。然后:

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

来同时设定工作及目标目录。

这些变数也可做为环境变数设定,请参考您使用的Shell操作手册来取得如何设定环境变数的说明。

4.5.2. 移除已安装的Port

安装的Port可以使用pkg delete卸载。使用这个指令的示例可以在pkg-delete(8)操作手册找到。

或者,可在Port的目录下执行make deinstall

# cd /usr/ports/sysutils/lsof
# make deinstall
===>  Deinstalling for sysutils/lsof
===>   Deinstalling
Deinstallation has been requested for the following 1 packages:

	lsof-4.88.d,8

The deinstallation will free 229 kB
[1/1] Deleting lsof-4.88.d,8... done

建议阅读Port解除安装后的信息,若有任何相依该Port的应用程序,这些信息会被显示出来,但卸载的程序仍会继续。在这种情况下最好重新安装应用程序来避免破坏相依性。

4.5.3. 升级Port

随着时间推移,Port套件集中会有新版的软件可用。本节将说明如何检查是否有可以升级的软件及如何升级。

要检查已安装Port是否有新版可用,请先确定已安装最新版本的Port树,使用过程 4.1, “Portsnap方法”过程 4.2, “Subversion方法”中说明的指令来更新。在FreeBSD 10与更新的版本,或若套件系统已转换为pkg,可以使用下列指令列出已经安装的Port中有那些已过时:

# pkg version -l "<"

在FreeBSD 9.X与较旧的版本,可以使用下列指令列出已经安装的Port中有那些已过时:

# pkg_version -l "<"

重要:

在尝试升级之前,请先从档首阅读/usr/ports/UPDATING来取得最近有那些Port已升级或系统已安装。这个档案中会说明各种问题及在升级Port时可能会需要使用者执行的额外步骤,例如档案格式更改、配置文件位置更改、或任何与先前版本不兼容的问题。留意那些与您要升级Port相关的指示,并依照这些指示执行升级。

4.5.3.1. 升级与管理Port的工具

Port套件集含有数个工具可以进行升级,每一种工具都有其优点及缺点。

以往大多Port安装会使用PortmasterPortupgrade,现在有较新的Synth可使用。

注意:

那一种工具对特定系统是最佳的选择取决于系统管理员。建议在使用任何这些工具之前先备份数据。

4.5.3.2. 使用Portmaster升级Port

ports-mgmt/portmaster是可用来升级已安装Port的小巧工具,它只使用了随FreeBSD基础系统安装的工具,不需要相依其他Port或数据库便可在FreeBSD使用,要使用Port安装此工具可:

# cd /usr/ports/ports-mgmt/portmaster
# make install clean

Portmaster将Port定义成四种类型:

  • 根Port:没有相依且也不被任何其他Port相依。

  • 主干Port:没有相依,但被其他Port相依。

  • 分支Port:有相依,且其被其他Port相依。

  • 枝Port:有相依,但没有被其他Port相依。

要列出这几个分类并搜寻是否有新版:

# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
        ===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache22-2.2.3
        ===>>> New version available: apache22-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
        ===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports

===>>> 137 total installed ports
        ===>>> 83 have new versions available

此指令用来升级所有过时的Port:

# portmaster -a

注意:

预设Portmaster会在删除已存在的Port前备份套件,若成功安装新版Portmaster会删除该备份。使用-b来让Portmaster不会自动删除备份。加入-i可启动Portmaster的互动模式,会在升级每个Port前提示信息。尚有许多可用的其他选项,请阅读portmaster(8)的操作手册来取得详细的用法。

若升级的过程发生错误,可加入-f来升级并重新编译所有Port:

# portmaster -af

Portmaster也可用来安装新的Port到系统,在编译及安装新Port前升级所有相依模块。要使用这个功能,要指定Port位于Port套件集中的位置:

# portmaster shells/bash

更多有关ports-mgmt/portmaster的信息可至其pkg-descr取得。

4.5.3.3. 使用Portupgrade升级Port

ports-mgmt/portupgrade是另一个可以用来升级Port的工具,此工具会安装一套可以用来管理Port的应用程序,它需要相依Ruby。要安装该Port:

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

在执行升级之前使用此工具,建议使用pkgdb -F扫描已安装的Port并修正该指令回报的所有信息不一致的套件。

要升级所有安装在系统上过时的Port,可使用portupgrade -a,或者加上-i会在每个套件升级时询问确认:

# portupgrade -ai

要升级指定的应用程序而非所有可用Port可使用portupgrade pkgname,非常重要的是,要加上-R来先升级指定应用程序所有相依的Port:

# portupgrade -R firefox

若使用-PPortupgrade会先在PKG_PATH清单中的本地目录中搜寻可用的套件。若本地没有可用的套件,则会从远端下载。若套件无法在本地或远端找到,Portupgrade则会使用Port来安装。要避免完全使用Port安装,可使用-PP,这个选项会告诉Portupgrade若没有套件可用时放弃安装:

# portupgrade -PP gnome3

若只想要下载Port distfiles或套件,使用-P参数。若不要编译或安装任何东西,使用-F。请参考portupgrade的操作手册来取得所有可用选项的更多资讯。

更多有关ports-mgmt/portupgrade的信息可至其pkg-descr取得。

4.5.4. Port与磁盘空间

使用Port套件集会随着时间消耗磁盘空间。在编译与安装Port完之后,在Port Skeleton中执行make clean可清除暂存的work目录。若使用Portmaster来安装Port,则会自动移除该目录,除非使用-K。若有安装Portupgrade,此指令将会移除所有在Port套件集的本地复本中找到的work目录:

# portsclean -C

除此之外,许多过时的源码发行档案会储存在/usr/ports/distfiles。使用Portupgrade删除所有不再被任何Port所引用的distfiles:

# portsclean -D

Portupgrade可以移除所有未被任何安装在系统上的Port所引用的distfiles:

# portsclean -DD

若有安装Portmaster,则可使用:

# portmaster --clean-distfiles

预设,若distfile应要被删除,这个指令会以互动的方式向使用者确认。

除了以上指令外,ports-mgmt/pkg_cutleaves可自动移除不再需要使用的Port。

4.6. 使用Poudriere编译套件

Poudriere是一个使用BSD授权条款用来建立与测试FreeBSD套件的工具。它使用FreeBSD Jail来建置独立的编译环境,这些Jail可以用来编译与目前所在系统不同FreeBSD版本的套件,也同样可以在主机为amd64的系统上编译供i386使用的套件。套件编译完成后的目录配置会与官方镜像站完全相同。这些套件可由pkg(8)及其他套件管理工具使用。

Poudriere可使用ports-mgmt/poudriere套件或Port安装。安装完成后会有一个示例的配置文件/usr/local/etc/poudriere.conf.sample。复制此档案到/usr/local/etc/poudriere.conf,编辑复制的档案来配合本地的设定。

虽然在系统上执行poudriere并不一定要使用ZFS,但使用了是有帮助的。当使用了ZFS,则必须在/usr/local/etc/poudriere.conf指定ZPOOL以及FREEBSD_HOST应设定到一个最近的镜像站。定义CCACHE_DIR可开启使用devel/ccache缓存的功能来缓存编译结果并减少那些需时常编译的代码的编译次数。将 poudriere数据集放到一个独立的目录并挂载到/poudriere可能会比较方便,其他设定项目采用预设值便足够。

侦测到的处理器数量可用来定义要同时执行多少个编译。并给予足够的虚拟內存,不论是RAM或交换空间,若虚拟內存不足,编译Jail的动作将会停止并被清除,会造成奇怪的错误讯息。

4.6.1. 初始化Jail与Port树

在设定之后,初始化poudriere来安装Jail及其所需的FreeBSD树与Port树。使用-j来指定Jail的名称以及-v来指定FreeBSD的版本。在执行FreeBSD/amd64的系统上可使用-a来设定要使用的构架为i386amd64,预设会采用使用uname所显示的构架。

# poudriere jail -c -j 10amd64 -v 10.0-RELEASE
====>> Creating 10amd64 fs... done
====>> Fetching base.txz for FreeBSD 10.0-RELEASE amd64
/poudriere/jails/10amd64/fromftp/base.txz      100% of   59 MB 1470 kBps 00m42s
====>> Extracting base.txz... done
====>> Fetching src.txz for FreeBSD 10.0-RELEASE amd64
/poudriere/jails/10amd64/fromftp/src.txz       100% of  107 MB 1476 kBps 01m14s
====>> Extracting src.txz... done
====>> Fetching games.txz for FreeBSD 10.0-RELEASE amd64
/poudriere/jails/10amd64/fromftp/games.txz     100% of  865 kB  734 kBps 00m01s
====>> Extracting games.txz... done
====>> Fetching lib32.txz for FreeBSD 10.0-RELEASE amd64
/poudriere/jails/10amd64/fromftp/lib32.txz     100% of   14 MB 1316 kBps 00m12s
====>> Extracting lib32.txz... done
====>> Cleaning up... done
====>> Jail 10amd64 10.0-RELEASE amd64 is ready to be used
# poudriere ports -c -p local
====>> Creating local fs... done
====>> Extracting portstree "local"...
Looking up portsnap.FreeBSD.org mirrors... 7 mirrors found.
Fetching public key from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Tue Feb 11 01:07:15 CET 2014:
94a3431f0ce567f6452ffde4fd3d7d3c6e1da143efec76100% of   69 MB 1246 kBps 00m57s
Extracting snapshot... done.
Verifying snapshot integrity... done.
Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Updating from Tue Feb 11 01:07:15 CET 2014 to Tue Feb 11 16:05:20 CET 2014.
Fetching 4 metadata patches... done.
Applying metadata patches... done.
Fetching 0 metadata files... done.
Fetching 48 patches.
(48/48) 100.00%  done.
done.
Applying patches...
done.
Fetching 1 new ports or files... done.
/poudriere/ports/tester/CHANGES
/poudriere/ports/tester/COPYRIGHT

[...]

Building new INDEX files... done.

在一台电脑,poudriere可使用多组设定在多个Jail编译来自不同Port树的Port。用来定义这些组合的自定义设定称作sets,可在安装ports-mgmt/poudriereports-mgmt/poudriere-devel后参考poudriere(8)中的CUSTOMIZATION章节来取得详细的信息。

在此处示范的基本设定放了单一个jail-,port-以及set-特定的make.conf/usr/local/etc/poudriere.d。在此示例使用的档案名称由Jail名称、Port名称以及set名称所组成:10amd64-local-workstation-make.conf。系统make.conf与这个新的档案在编译时期会被合并为编译Jail要使用的make.conf

要编译的套件会输入到10amd64-local-workstation-pkglist

editors/emacs
devel/git
ports-mgmt/pkg
...

可使用以下方式设定选项及相依:

# poudriere options -j 10amd64 -p local -z workstation -f 10amd64-local-workstation-pkglist

最后,编译套件并建立套件档案库:

# poudriere bulk -j 10amd64 -p local -z workstation -f 10amd64-local-workstation-pkglist

在执行时,按下Ctrl+t可以显示目前编译的状态,Poudriere也会编译在/poudriere/logs/bulk/jailname中的档案,可用在网页服务器来显示编译信息。

完成之后,新套件现在可以从poudriere档案库来安装。

要取得更多使用poudriere的信息,请参考poudriere(8)及主网站https://github.com/freebsd/ poudriere/wiki

4.6.2. 设定pkg客户端使用Poudriere档案库

虽然可以同时使用自定义的档案库与官方档案库,但有时关闭官方档案库会有帮助。这可以透过建立一个配置文件覆盖并关闭官方的配置文件来完成。建立/usr/local/etc/pkg/repos/FreeBSD.conf包含以下内容:

FreeBSD: {
	enabled: no
}

通常最简单要提供poudriere档案库给客户端的方式是透过HTTP。安装一个网页服务器来提供套件目录,通常会像:/usr/local/poudriere/data/packages/10amd64,其中10amd64是编译的名称。

若要连往套件档案库的URL是:http://pkg.example.com/10amd64,则在/usr/local/etc/pkg/repos/custom.conf的档案库配置文件为:

custom: {
	url: "http://pkg.example.com/10amd64",
	enabled: yes,
}

4.7. 安装后的注意事项

不论软件是从套件或Port安装,大部份的第三方应用程序安装完后需要做某种程度的设定,下列指令与位置可以用来协助找到应用程序安装了什么。

  • 大部份应用程序安装会在/usr/local/etc安装至少一个预设的配置文件,若应用程序有大量配置文件的时则会建立一个子目录来存放这些配置文件。示例的配置文件案名称通常使用 .sample结尾,配置文件应要仔细查看并可能要做一些编辑让配置文件符合系统的需求,要编辑配置文件模板前需先复制该档案并去除.sample扩展名。

  • 应用程序提供的文件会安装到/usr/local/share/doc,且许多应用程序也同时会安装操作手册,在继续使用应用程序前应先查看这些文件。

  • 部份应用程序会以服务的方式执行,在启动应用程序前前需要加入设定到/etc/rc.conf。这些应用程序通常会安装启动Script到/usr/local/etc/rc.d,请参考启动服务来取得更多资讯。

    注意:

    依设计,应用程序不会在安装时执行其启动Script,也不会在卸载或升级时执行其中止Script,这留给各系统的管理者去做决定。

  • csh(1)的使用者应要执行rehash来更新已知Binary清单到Shell的PATH

  • 使用pkg info来了解应用程序安装了那些档案、操作手册以及Binary。

4.8. 处理损坏的Port

当发现某个Port无法顺利编译或安装,可以尝试以下几种方法解决:

  1. 搜寻问题回报数据库看该Port有没有待审核的修正,若有的话可以使用该修正来修正问题。

  2. 寻求维护人员的协助,在Port Skeleton目录中输入make maintainer或阅读Port的Makefile来取得维护人员的电子邮件位址。寄给维护人员的邮件内容请记得要包含Port的Makefile中的$FreeBSD:一整行及输出的错误讯息。

    注意:

    有一些Port并非由个人维护,而是由邮递论坛维护,有许多,但并非全部,只要邮件地址长的像都是,寄信时记得代入实际的论坛名称。

    尤其是由所维护的Port都不是由特定个人维护,而该Port的修正与支持都是来自订阅该邮递论坛的一般社群所提供,我们随时欢迎志工参与!

    若寄信后没有取得任何响应,可以依照撰写FreeBSD问题回报的说明使用Bugzilla提出问题回报。

  3. 自行修正看看!Porter's Handbook中含有Port基础构架的详细信息,可提供信息让您可修正偶然损坏的Port或甚至您可以提交之自己的Port!

  4. 依照第 4.4 节 “使用pkg管理二进制套件”中的说明安装Binary套件,替代使用Port安装。

第 5 章 X Window系统

5.1. 简介

使用bsdinstall安装FreeBSD并不会自动安装图型化使用者界面。本章将说明如何安装并设定Xorg,该应用程序提供开放源码的X Window系统来提供图型化环境。接着会说明如何找到并安装桌面环境或视窗管理程序。

注意:

用户如果希望让安装程序自动配置 Xorg,可以试试 FuryBSDGhostBSDMidnightBSD

更多有关Xorg支持图像硬件信息,请参考x.org网站。

读完本章节,你将会知道:

  • 组成X Window系统的各种元件以及它们是如何相互运作。

  • 如何安装并设定Xorg

  • 如何安装并设定各种视窗管理程序与桌面环境。

  • 如何在Xorg上使用TrueType®字体。

  • 如何设定系统以使用图形化登入(XDM)。

在阅读这个章节之前,您应当:

5.2. 术语

虽然X各元件的所有细节及运作方式,并不是必须要知道的。但对它们有些基本概念会更容易上手。

X服务器(X Server)

X最初设计是以网络为中心,采用client-server构架。在此构架下X服务器在有键盘、屏幕、鼠标的电脑上运作。该服务器负责的工作包含管理显示、处理来自键盘、鼠标的输入及来自其他设备(如平板或或图像投影机)的输入或输出。这点可能会让人感到困惑,因为X使用的术语与一般的认知刚好相反。一般认知会以为X服务器是要在最强悍的主机上执行,而X客户端才是在桌机上面执行,实际上却是相反。

X客户端(X Client)

每个X应用程序,如XTermFirefox都是客户端。客户端会传信息到服务器,例如:请在这些坐标画一个视窗,接着服务器会传回信息,如:使用者刚点选了确定按钮

在家庭或小型办公室环境,通常X服务器跟X客户端都是在同一台电脑上执行。也可以在比较慢的电脑上执行X服务器,并在比较强、比较贵的系统上执行X应用程序。在这种情景,X客户端与服务器之间的沟通就需透过网络来进行。

视窗管理程序(Window Manager)

X并不规定屏幕上的视窗该长什么样、要如何移动鼠标指标、要用什么键来在视窗切换、每个视窗的标题列长相,及是否该有关闭按钮,等等。事实上,X把这部分交给所谓的视窗管理程序来管理。可用的视窗管理程序有很多种,每一种视窗管理程序都提供不同的使用界面风格:有些支持虚拟桌面,有些允许自定义组合键来管理桌面,有些有开始钮,有些则是可更换布景主题,可自行安装新的布景主题以更换外观。视窗管理程序可在Port套件集的x11-wm分类找到。

每个视窗管理程序也各有其不同的设定机制,有些需要手动修改配置文件,而有的则可透过图型化工具来完成大部分的设定工作。

桌面环境(Desktop Environment)

KDEGNOME会被称作桌面环境是因为包含了完整常用桌面作业的应用程序,这些应用程序可能包含文书软件、网页浏览器及游戏。

聚焦政策(Focus Policy)

视窗管理程序负责鼠标指标的聚焦政策。聚焦政策指的是如何决定使用中及接收键盘输入的视窗。

通常较为人熟悉的聚焦政策叫做click-to-focus,这个模式中,鼠标点选到的视窗便会处于作用中(Active)的状态。在focus-follows-mouse模式鼠标指标所在的视窗便是作用中的视窗,只要把鼠标移到其他视窗就可以改变作用中的视窗,若鼠标移到根视窗(Root Window),则会聚焦在根视窗。在sloppy-focus模式,既使鼠标移到根视窗,仍然会聚焦在最后聚焦的视窗上,此模式只有当鼠标进入新的视窗时才会聚焦于该视窗,而非离开目前视窗时。click-to-focus模式用鼠标点击来决定作用中的视窗,且该视窗会被置顶到所有其他视窗之前,即使鼠标移到其他视窗,所有的键盘输入仍会由该视窗所接收。

不同的视窗管理程序支持不同的聚焦模式,全部都支持click-to-focus且其中大部份支持其他模式,请查看视窗管理程序的说明文件来了解可用的聚焦模式。

视窗元件(Widget)

视窗元件指的是在所有在使用者界面上可被点选或操作的项目,这包括按钮、核选方块、单选按钮、图标及清单。视窗元件工具包(Widget toolkit)是指用来建立图型化应用程序的一系列的视窗元件。目前有数个有名的视窗元件工具包,包含KDE所使用的Qt、GNOME所使用的GTK+。因此应用程序会依其开发时所选用的视窗元件工具包而有不同的外观。

5.3. 安装Xorg

在FreeBSD,Xorg可透过套件或Port来安装。

使用Binary套件的安装速度较快,但可用的自定义选项较少:

# pkg install xorg

要从Port套件集编译与安装:

# cd /usr/ports/x11/xorg
# make install clean

两种安装方式皆可完整安装Xorg系统,对大多数使用者较建议使用Binary套件安装。

较精简版本的X系统适合给有经验的使用者使用,可至x11/xorg-minimal取得。这个版本就不会安装大多数的文件、函数库以及应用程序,而部份应用程序会需要这些额外的元件才能运作。

5.4. Xorg设定

Warren Block

5.4.1. 快速开始

Xorg支持大多数常见的显卡、键盘以及指标装置。

提示:

显卡、显示器以及输入装置会自动侦测,无须任何手动设置。除非自动设置失败,否则请勿建立xorg.conf或执行-configure步骤。

  1. Xorg曾经在电脑使用过,可先将现有的配置文件重新命名或移除:

    # mv /etc/X11/xorg.conf ~/xorg.conf.etc
    # mv /usr/local/etc/X11/xorg.conf ~/xorg.conf.localetc
  2. 加入要执行Xorg的使用者到videowheel群组,以便在可用时能开启3D加速。要加入使用者jru到任一个可用的群组:

    # pw groupmod video -m jru || pw groupmod wheel -m jru
  3. 预设内含TWM视窗管理程序,启动Xorg时便会启动该视窗管理程序:

    % startx
  4. 在部份较旧版的FreeBSD,在切换回文字Console前系统Console必须设为vt(4)才可正常运作,请参考第 5.4.3 节 “核心模式设定(Kernel Mode Setting,KMS)”

5.4.2. 可加速图像处理的使用者群组

要存取/dev/dri需要允许显卡的3D加速功能,这通常只需要将要执行X的使用者加入videowheel群组。此处使用pw(8)来将使用者slurms加入video群组,若没有video则会加入wheel群组:

# pw groupmod video -m slurms || pw groupmod wheel -m slurms

5.4.3. 核心模式设定(Kernel Mode Setting,KMS

当电脑显示从Console切换到高屏幕分辨率供X使用时,必须设定图像输出模式。最近版本的Xorg使用了核心内部的系统来让切换模式更有效率。较旧版的FreeBSD使用的sc(4)并不知到KMS系统的存在,这会导致关闭X之后即始仍在运作但系统Console却呈现空白。较新版的vt(4) Console可避免这个问题。

加入此行到/boot/loader.conf来开启vt(4)

kern.vty=vt

5.4.4. 配置文件

通常不需要做手动设置,除非自动设置无法运作,否则请不要手动建立配置文件。

5.4.4.1. 目录

Xorg会查看数个目录来寻找配置文件,在FreeBSD较建议使用/usr/local/etc/X11/来存放这些配置文件,使用这个目录可以帮助将应用程序档案与操作系统档案分离。

储存配置文件在传统的/etc/X11/仍可运作,但并不建议将应用程序档案与基础FreeBSD档案混合在一起存放。

5.4.4.2. 单档或多档

使用多档,每一个档案只设定一个指定项目会较传统使用单一xorg.conf设定来的简单。这些档案会存放在主配置文件目录下的xorg.conf.d/子目录,完整路径通常为/usr/local/etc/X11/xorg.conf.d/

于本节稍后会有这些档案的示例。

传统单一xorg.conf的方式仍可运作,但比起在xorg.conf.d/子目录中的多档设定方式较不明了且没有弹性。

5.4.5. 显卡

随着 FreeBSD 的发展,最近几个版本的 FreeBSD 可以使用 Ports 和 pkg 安装图形驱动,用户可以从 graphics/drm-kmod 中选择要安装的驱动。

Intel KMS 驱动, Radeon KMS 驱动, AMD KMS 驱动

Radeon显卡支持2D及3D加速,最新到HD6000系列。

驱动程序名称:intel

Radeon显卡支持2D及3D加速,最新到HD6000系列。

驱动程序名称:radeon

Radeon显卡支持2D及3D加速,最新到HD6000系列。

驱动程序名称:radeon

参考文献请至https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units

Intel®

3D加速在大多数Intel®显示芯片都有支持,最新到Ivy Bridge(HD Graphics 2500,4000,及P4000)包含Iron Lake(HD Graphics)与Sandy Bridge(HD Graphics 2000)。

驱动程序名称:intel

参考文献请至https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units

AMD® Radeon

Radeon显卡支持2D及3D加速,最新到HD6000系列。

驱动程序名称:radeon

参考文献请至https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units

NVIDIA

有数个NVIDIA驱动程序可于Port套件集中的x11分类取得,请安装其中与显卡相符的驱动程序。

参考文献请至https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units

混合组合绘图芯片

部份笔记型电脑加入了额外绘图处理单元到那些内置晶片组或处理。Optimus结合了Intel®及NVIDIA的硬件,Switchable GraphicsHybrid Graphics则是结合了Intel®或AMD®处理器与AMD® Radeon GPU

这些混合绘图系统的实作方式均不同,FreeBSD的Xorg尚无法驱动所有的混合绘图系统版本。

部份电脑提供了BIOS的选项可以关闭其中一个绘图界面卡或选择discrete模式,可用使用其中一种标准显卡驱动程序来驱动。例如,有时关闭Optimus系统中的NVIDIA GPU是可能让Intel®显示芯片可用Intel®驱动程序驱动。

BIOS设定会依电脑的型号有所不同,在某些情况下,可以同时开启两个GPU,而在建立的配置文件中的Device节只使用主要的GPU便能让系统运作。

其他显卡

较不常见的显卡驱动程序可在Port套件集的x11-drivers目录找到。

若没有特定的驱动程序可以支持显卡,仍可能可用x11-drivers/xf86-video-vesa驱动程序来驱动。该驱动程序可使用x11/xorg安装,也可使用x11-drivers/xf86-video-vesa手动安装。当没有指定驱动程序时Xorg会尝试使用这个驱动程序来驱动显卡。

x11-drivers/xf86-video-scfb也是不特定显卡的驱动程序,可在许多UEFIARM®的电脑上运作。

在档案中设定图像驱动程序

要在配置文件设定使用Intel®驱动程序:

例 5.1. 在单档中选择Intel®图像驱动程序

/usr/local/etc/X11/xorg.conf.d/driver-intel.conf

Section "Device"
	Identifier "Card0"
	Driver     "intel"
	# BusID    "PCI:1:0:0"
EndSection

若有多张显卡,可取消注释BusID identifier然后设定为想要的显卡,显卡的Bus ID清单可以使用pciconf -lv | grep -B3 display取得。


要在配置文件设定使用Radeon驱动程序:

例 5.2. 在单档中选择Radeon图像驱动程序

/usr/local/etc/X11/xorg.conf.d/driver-radeon.conf

Section "Device"
	Identifier "Card0"
	Driver     "radeon"
EndSection

要在配置文件设定使用VESA驱动程序:

例 5.3. 在单档中选择VESA图像驱动程序

/usr/local/etc/X11/xorg.conf.d/driver-vesa.conf

Section "Device"
	Identifier "Card0"
	Driver     "vesa"
EndSection

要设定UEFIARM®电脑使用scfb驱动程序:

例 5.4. 在单档中选择scfb图像驱动程序

/usr/local/etc/X11/xorg.conf.d/driver-scfb.conf

Section "Device"
	Identifier "Card0"
	Driver     "scfb"
EndSection

5.4.6. 显示器

几乎所有显示器都支持延伸显示辨识数据标准(Extended Display Identification Data,EDID),Xorg会使用EDID与显示器通信并侦测支持的分辨率与更新频率,然后选择最适合的设定组合使用该显示器。

其他显示器支持的分辨率可透过在配置文件中设定想要的分辨率来选择,或者在X服务器启动之后使用xrandr(1)

使用xrandr(1)

执行xrandr(1)不加任何参数可检查图像输出及已侦测到的显示器模式清单:

% xrandr
Screen 0: minimum 320 x 200, current 3000 x 1920, maximum 8192 x 8192
DVI-0 connected primary 1920x1200+1080+0 (normal left inverted right x axis y axis) 495mm x 310mm
   1920x1200     59.95*+
   1600x1200     60.00
   1280x1024     85.02    75.02    60.02
   1280x960      60.00
   1152x864      75.00
   1024x768      85.00    75.08    70.07    60.00
   832x624       74.55
   800x600       75.00    60.32
   640x480       75.00    60.00
   720x400       70.08
DisplayPort-0 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)

这个结果显示DVI-0输出被用来显示分辨率为1920x1200像素于更新频率约60 Hz的画面,未有显示器连接到DisplayPort-0HDMI-0接头。

可使用xrandr(1)来选择任何其他的显示模式。例如要切换为1280x1024于60 Hz:

% xrandr --mode 1280x1024 --rate 60

在笔记型电脑使用外部显示输出到投影机是常见的作业。

不同装置间输出接头的类型与数量也不同,给每个输出的名称在不同驱动程序间也不同。在某些驱动程序称为HDMI-1的输出在其他驱动程序则可能称为HDMI1。因此第一个步骤是执行xrandr(1)列出所有可用的输出:

% xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
   1366x768      60.04*+
   1024x768      60.00
   800x600       60.32    56.25
   640x480       59.94
VGA1 connected (normal left inverted right x axis y axis)
   1280x1024     60.02 +  75.02
   1280x960      60.00
   1152x864      75.00
   1024x768      75.08    70.07    60.00
   832x624       74.55
   800x600       72.19    75.00    60.32    56.25
   640x480       75.00    72.81    66.67    60.00
   720x400       70.08
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

已找到四个输出:内置面板的LVDS1,外接的VGA1HDMI1以及DP1接头。

投影机已连接至VGA1输出,现在使用xrandr(1)来设定该输出到投影机(原始分辨率)并加入额外的空间到桌面的右侧:

% xrandr --output VGA1 --auto --right-of LVDS1

--auto会选择使用EDID侦测到的分辨率与更新频率。若未正确侦测分辨率,可替换--auto--mode然后给予固定值。例如大部份的投影机可使用1024x768分辨率为,则可设定--mode 1024x768

xrandr(1)通常会在.xinitrc执行以在X启动时设定适合的模式。

在档案中设定屏幕分辨率

在配置文件设定屏幕分辨率为1024x768:

例 5.5. 在单档中设定屏幕分辨率

/usr/local/etc/X11/xorg.conf.d/screen-resolution.conf

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	SubSection "Display"
	Modes      "1024x768"
	EndSubSection
EndSection

少数显示器没有EDID,可设定HorizSyncVertRefresh为显示器支持的频率范围。

例 5.6. 手动设定显示器频率

/usr/local/etc/X11/xorg.conf.d/monitor0-freq.conf

Section "Monitor"
	Identifier   "Monitor0"
	HorizSync    30-83   # kHz
	VertRefresh  50-76   # Hz
EndSection

5.4.7. 输入装置

5.4.7.1. 键盘

键盘配置

键盘上标准按键的位置称做配置(Layout)。配置与其他可调整的参数列于xkeyboard-config(7)

预设为United States配置,要选择其他的配置可在InputClass设定XkbLayoutXkbVariant选项。这会套用所有符合该类别的输入装置。

这个例子选择French键盘配置使用oss变体。

例 5.7. 设定键盘配置

/usr/local/etc/X11/xorg.conf.d/keyboard-fr-oss.conf

Section	"InputClass"
	Identifier	"KeyboardDefaults"
	Driver		"keyboard"
	MatchIsKeyboard	"on"
	Option		"XkbLayout" "fr"
	Option		"XkbVariant" "oss"
EndSection

例 5.8. 设定多个键盘配置

设定United States,Spanish与Ukrainian键盘配置,并可按Alt+Shift来切换这些配置。可使用x11/xxkbx11/sbxkb来加强配置切换控制与目前配置的指示。

/usr/local/etc/X11/xorg.conf.d/kbd-layout-multi.conf

Section	"InputClass"
	Identifier	"All Keyboards"
	MatchIsKeyboard	"yes"
	Option		"XkbLayout" "us, es, ua"
EndSection

从键盘关闭Xorg

X可以使用组合键来关闭,预设并未设定组合键,因为该组合键与部份应用程序的键盘指令冲突。要开启这个选项需要更改键盘InputDevice节:

例 5.9. 开启键盘离开X功能

/usr/local/etc/X11/xorg.conf.d/keyboard-zap.conf

Section	"InputClass"
	Identifier	"KeyboardDefaults"
	Driver		"keyboard"
	MatchIsKeyboard	"on"
	Option		"XkbOptions" "terminate:ctrl_alt_bksp"
EndSection

5.4.7.2. 鼠标与指标装置

有许多鼠标参数可使用设定选项来调整,请参考mousedrv(4)来取得完整清单。

鼠标按键

鼠标的按键数可在xorg.conf的鼠标InputDevice节设定,例如要设定按键数为7:

例 5.10. 设定鼠标按键数

/usr/local/etc/X11/xorg.conf.d/mouse0-buttons.conf

Section "InputDevice"
	Identifier  "Mouse0"
	Option      "Buttons" "7"
EndSection

5.4.8. 手动配置

在某些情况Xorg的自动设定无法在特定硬件上运作,或需要使用不同的设定。针对这些情况会建立自定义的配置文件。

警告:

非必要请勿手动建立配置文件,非必要的手动设置会造成运作不正常。

配置文件可由Xorg根据侦测到的硬件产生,这个档案对一开始自定义设定很有帮助。

产生xorg.conf

# Xorg -configure

The configuration file is saved to /root/xorg.conf.new. Make any changes desired, then test that file (using -retro so there is a visible background) with:

# Xorg -retro -config /root/xorg.conf.new

在新配置文件调整与测试过后,便可分开成较小的档案放置到正常的位置/usr/local/etc/X11/xorg.conf.d/

5.5. 在Xorg使用字体

5.5.1. Type1字体

由于Xorg内置的预设字体用在典型的桌面出版应用程序并不是很理想,大字体会呈现锯齿状边缘,看起来很不专业,小字体几乎完全看不清楚。不过,这里有几个免费高品质的Type1(PostScript®)字体可用,且能容易的在Xorg使用。例如,URW字体集(Times Roman®,Helvetica®,Palatino®及其他)。Freefont字体集(x11-fonts/freefonts)包含了更多的字体,但其中大部分是给图形软件如GIMP所使用的字体,并不能完全作为屏幕字体使用。此外,Xorg可以简单的设定使用TrueType®字体。更多有关本主题的详细信息,请参考X(7)操作手册或第 5.5.2 节 “TrueType®字体”

要由Binary套件安装上述的Type1字体集可执行以下指令:

# pkg install urwfonts

或由Port套件集编译,可执行以下指令:

# cd /usr/ports/x11-fonts/urwfonts
# make install clean

同样的安装方式也适用Freefont或其他字体集。要让X服务器侦测到这些新安装的字体,可加入适当的设定到X服务器配置文件(/etc/X11/xorg.conf),内容为:

FontPath "/usr/local/share/fonts/urwfonts/"

或者在X session的指令列执行:

% xset fp+ /usr/local/share/fonts/urwfonts
% xset fp rehash

这样便可,但在X session关闭时将会失效,除非将该设定加入启动档(一般的startx session可在~/.xinitrc设定,若透过图型化登入管理程式如XDM登入时则在~/.xsession设定)。第三种方式是使用新/usr/local/etc/fonts/local.conf,如第 5.5.3 节 “抗锯齿字体”的示范。

5.5.2. TrueType®字体

Xorg内置支持绘制TrueType®字体,目前有两个模块可以支持这项功能。在本例中使用freetype模块,由于此模块与其他字体绘制后端较为一致。要开启freetype模块只需要将下行加入到/etc/X11/xorg.conf中的“Module” section。

Load  "freetype"

现在,为 TrueType® 字体创建一个目录 (比如, /usr/local/lib/X11/fonts/TrueType) 然后把所有的 TrueType® 字体复制到这个目录。记住您不能直接从 Apple® Mac® 中提取 TrueType® 字体; 能被 X11 使用的必须是 UNIX®/MS-DOS®/Windows® 格式的。 一旦您已经将这些文件复制到了这个目录, 就可以用 mkfontscale 来创建 fonts.dir 文件, 以便让X字体引擎知道您已经安装了这些新文件。mkfontscale 可以使用 pkg 安装:

# pkg install mkfontscale

然后在目录中建立X字体档的索引:

# cd /usr/local/share/fonts/TrueType
# mkfontscale

接着加入TrueType®目录到字体路径。这个动作与第 5.5.1 节 “Type1字体”中所介绍的方式相同:

% xset fp+ /usr/local/share/fonts/TrueType
% xset fp rehash

或直接加入FontPath一行到xorg.conf

现在GimpApache OpenOffice以及其他X应用程序应可以辨识到已安装的TrueType®字体。极小的字体(以高分辨率在网页中显示的文字)与极大的字体(在StarOffice中)现在会看起来比较像样了。

5.5.3. 抗锯齿字体

所有可在/usr/local/share/fonts/~/.fonts/找到的Xorg字体均可在Xft-aware的应用程序使用反锯齿的效果。大多最近的应用程序均为Xft-aware的,包括KDEGNOME以及Firefox

要控制那一些字体要做反锯齿或设定反锯齿的属性,需建立/usr/local/etc/fonts/local.conf档案(若档案存在则编辑)。在这个档案中可以调整Xft字体系统的数项进阶功能,本章节仅介绍部份简单的项目,要取得进一步信息,请参考fonts-conf(5)

这个档案必须使用XML格式,小心文字大小写,且要确定所有标签均有正常结尾。档案的开头使用常见的XML档首,接着为DOCTYPE定义,然后是<fontconfig>标签:

<?xml version="1.0"?>
      <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
      <fontconfig>

如同前面所提到的,所有在/usr/local/share/fonts/~/.fonts/的字体均可在Xft-aware的应用程序做反锯齿效果,若您想要加入除了上两者以外的目录,可加入如下行设定到/usr/local/etc/fonts/local.conf

<dir>/path/to/my/fonts</dir>

加入新字体及额外的新字体目录之后,需重新建立字体缓存:

# fc-cache -f

反锯齿效果会让文字的边缘变模糊,这会让非常小的文字更能阅读且去除大型文字的锯齿,但套用在一般的文字可能会造成眼睛的疲劳。要排除小于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>

反锯齿所产生的间距对于部份等宽字体并不合适,尤其是在使用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,在使用反锯齿时可能会发生问题,通常会呈现像垂直切成两半的字体,最差还可能会导致应用程序当掉。要避免这个问题,可考虑加入以下设定到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>标签结尾,若没有使用会让所做的更改被忽略。

使用者可透过建立自己的~/.config/fontconfig/fonts.conf来加入个人化的设定,此档案使用与上述说明相同的XML格式。

最后一点:若有使用LCD屏幕,可能会想要使用子像素取样(Sub-pixel sampling),这基本上会分开处理(水平分隔)红、绿、蓝色彩组成来提高垂直分辨率,结果可能是无法预料的。要开启这个功能,加入下行到local.conf的任一处:

	 <match target="font">
	     <test qual="all" name="rgba">
		 <const>unknown</const>
	     </test>
	     <edit name="rgba" mode="assign">
		 <const>rgb</const>
	     </edit>
	 </match>

注意:

依据不同的显示器类型可能会需要将rgb更改为bgrvrgbvbgr:可实验看看然后看那一个效果最好。

5.6. X显示管理程序

Originally contributed by Seth Kingsley.

Xorg提供了X显示管理程序(X Display Manager,XDM),可用来做登入阶段的管理。XDM提供了一个图型化的界面来选择要连接的显示伺服器以及输入认证信息(登入与密码)。

本节将示范如何设定FreeBSD的X显示管理程序。部份桌面环境会提供自己的图型化登入管理程序,请参考第 5.7.1 节 “GNOME”取得如何设定GNOME显示管理程序(GNOME Display Manager)的操作方式以及第 5.7.2 节 “KDE”取得如何设定KDE显示管理程序(KDE DisplayManager)的操作方式。

5.6.1. 设定XDM

要安装XDM可使用x11/xdm套件或Port。安装完成之后,可设定XDM在开机时执行,只需编辑/etc/ttys中的此项目:

ttyv8   "/usr/local/bin/xdm -nodaemon"  xterm   off secure

更改关(off)为开(on)然后储存编辑。在此项目中的ttyv8代表XDM会在第9个虚拟终端机执行。

XDM的设定目录位于/usr/local/lib/X11/xdm。此目录中包含数个可用来更改XDM行为与外观的档案以及在XDM执行时用来设定桌面的一些Script及程序,表 5.1 “XDM 配置文件”摘要了每个档案的功能。这些档案正确的语法与用法在xdm(1)有说明。

表 5.1. XDM 配置文件
文件描述
XaccessThe protocol for connecting to XDM is called the X Display Manager Connection Protocol (XDMCP) This file is a client authorization ruleset for controlling XDMCP connections from remote machines. By default, this file does not allow any remote clients to connect.
Xresources此档案控制XDM显示选择器及登入画面的外观。预设的设定简单的矩形登入视窗,上方用较大的字体显示机器的主机名称,并在下方显示Login:Password:提示。此档案的格式与Xorg说明文件中说明的app-defaults档相同。
Xservers登入选择时在选择器上要提供的本地及远端显示清单。
Xsession预设的登入阶段Script,使用者登入之后由XDM执行。一般每一位使用者都会有自定义的阶段Script在~/.xsession来覆盖此Script的设定。
Xsetup_*用来在显示选择器与登入界面之前自动执行应用程序的Script。每一个显示各有一个Script,名称为Xsetup_*,其中*为本地显示编号。正常情况这些Script会在背景执行一两个程序,例如xconsole
xdm-config用来设定所有在此机器上执行的显示的全局配置文件。
xdm-errors内含由服务器程序产生的错误讯息,若XDM尝试启动的显示没有响应,可查看此档案来取得错误讯息。以登入阶段为基础,这些信息也同样会写入至使用者的~/ .xsession-errors
xdm-pidXDM的执行程序ID

5.6.2. 设定远程登录

预设只有同系统的使用者可以使用XDM登入。要开启让其他系统的使用者可联机到显示服务器,需编辑访问控制规则及开启联机倾听程序。

要设定XDM倾听作何远端的联机,在/usr/local/lib/X11/xdm/xdm-config中的DisplayManager.requestPort行前加上来注释该行:

! 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,要限制远程登录,请看/usr/local/lib/X11/xdm/Xaccess中的示例项目,并参考xdm( 1)取得进一步信息。

5.7. 桌面环境

Contributed by Valentino Vaschetto.

本节将介绍如何在FreeBSD系统安装三种热门的桌面环境。一套桌面环境的范围可从简单的视窗管理程序到完整的桌面应用程序集。有上百套的桌面环境可在Port套件集的x11-wm分类取得。

5.7.1. GNOME

GNOME是一个拥有友善使用者界面的的桌面环境,它包括用于启动应用程序和显示状态的面板、一系列工具与应用程序及一套可让应用程序更容易进行合作、相互一致的协定。更多有关FreeBSD GNOME的信息可在https://www.FreeBSD.org/gnome取得,该网站包含了有关在FreeBSD安装、设定和管理GNOME的额外文件。

这套桌面环境可以从套件安装:

# pkg install gnome3

也可使用以下指令从Port编译GNOMEGNOME是一套大型的应用程序,即使在速度较快的电脑上,也会需要花费一些时间编译。

# cd /usr/ports/x11/gnome3
# make install clean

GNOME需要挂载/proc。加入下行到/etc/fstab让系统启动时会自动挂载这个文件系统:

proc           /proc       procfs  rw  0   0

GNOME使用了D-Bus以及HAL的Message bus与Hardware abstraction。这两个应用程序会随着GNOME的相依一并自动安装,但需要在/etc/rc.conf开启,这样在系统开机时才会启动:

dbus_enable="YES"
hald_enable="YES"

安装完之后,需设定让Xorg启动GNOME。最简单的方法是开启GNOME Display Manager,GDM,该程序已做为GNOME套件或Port的一部份安装了,可加入下行到/etc/rc.conf来开启:

gdm_enable="YES"

通常也会需要启动所有的GNOME服务,可加入下行到/etc/rc.conf

gnome_enable="YES"

GDM则会在系统开机时自动启动。

第二种启动GNOME的方法是在设定完~/.xinitrc后在指令列输入startx。若这个档案已经存在,替换启动目前视窗管理程序的那一行,改为启动/usr/local/bin/gnome-session。若档案不存在,则使用以下指令建立一个:

% echo "exec /usr/local/bin/gnome-session" > ~/.xinitrc

第三种方法是使用XDM做为显示管理程序,在这个方法需要建立一个可执行的~/.xsession

% echo "exec /usr/local/bin/gnome-session" > ~/.xsession

5.7.2. KDE

KDE是另一套易于使用的桌面环境。这个桌面环境提供了一致外观的应用程序、标准化的菜单和工具栏、组合键、配色方案、国际化与集中、对话框导向的桌面设定。更多有关KDE可在http://www.kde.org/取得。要取得FreeBSD特定的信息,则可参考http://freebsd.kde.org

要安装KDE套件,请输入:

# pkg install x11/kde5

或者要使用KDE Port编译,可使用以下指令,采用Port方式安装会有菜单可以选择要安装的元件。KDE是一个大型的应用程序,即使在较快的电脑上仍需要花费一段时间来编译。

# cd /usr/ports/x11/kde5
# make install clean

KDE需要挂载/proc。加入下行到/etc/fstab让系统启动时会自动挂载这个文件系统:

proc           /proc       procfs  rw  0   0

KDE使用了D-Bus以及HAL的Message bus与Hardware abstraction。这两个应用程序会随着KDE的相依一并自动安装,但需要在/etc/rc.conf开启,这样在系统开机时才会启动:

dbus_enable="YES"
hald_enable="YES"

从 KDE Plasma 5 开始,KDE 显示管理器 KDM 没有在进行后续开发。SDDM是一个可用的替代品。请键入以下命令进行安装:

# pkg install x11/sddm

将此行添加到 /etc/rc.conf

sddm_enable="YES"

第二种执行KDE Plasma的方法是在在指令列输入startx。要采用这个方式,需要加入下行到~/.xinitrc

exec ck-launch-session startplasma-x11

第三种启动KDE Plasma的方式是透过XDM,要使用这个方法需要建立一个可执行的~/.xsession如下:

% echo "exec ck-launch-session startplasma-x11" > ~/.xsession

启动KDE Plasma之后,请参考内置的说明系统来取得更多有关如何使用各种菜单及应用程序的信息。

5.7.3. Xfce

Xfce是以GNOME使用的GTK +工具包做为基础所开发的桌面环境,但是它更轻巧且提供了一种简单、高效、易于使用的桌面。它可完全自定义设定、附有选单、Applet及应用程序激活器的主面板、提供档案管理程序和音效管理程序并且可设定主题。由于它是快速、轻巧、高效的桌面环境,因此它非常适合有內存限制的较旧或较慢机器。更多有关 Xfce的信息可至http://www.xfce.org取得。

要安装Xfce套件:

# pkg install xfce

或者使用Port编译:

# cd /usr/ports/x11-wm/xfce4
# make install clean

KDE使用了D-Bus以及HAL的Message bus与Hardware abstraction。这两个应用程序会随着KDE的相依一并自动安装,但需要在/etc/rc.conf开启,这样在系统开机时才会启动:

dbus_enable="YES"

不像GNOMEKDEXfce并没有自己的登入管理程序,要由指令列启动Xfce需输入startx,在这之前需先加入其项目到~/.xinitrc

% echo ". /usr/local/etc/xdg/xfce4/xinitrc" > ~/.xinitrc

另一种方式是使用XDM,要设定这个方式需建立一个可执行的~/.xsession

% echo ". /usr/local/etc/xdg/xfce4/xinitrc" > ~/.xsession

5.8. 安装Compiz Fusion

要令使用桌面电脑更令人愉快的方法是用炫丽的3D效果。

安装 Compiz Fusion 的方法非常简单,但配置该软件需要一些未在 Port 说明文件中说明的步骤。

5.8.1. 设定FreeBSD nVidia驱动程序

桌面特效需要使用相当程度的显卡,对于以nVidia为基础的显卡,需要使用专用的驱动程序来取得较佳的性能。其他显卡的使用可以跳过这一节,并继续xorg.conf设定。

要知道需要那一种nVidia驱动程序可以查看FAQ中与此主题相关的问题

知道您的显卡要使用那种驱动程序才是正确的之后,接下来的安装程序跟安装其他套件一样简单。

例如,要安装最新的驱动程序:

# pkg install x11/nvidia-driver

驱动程序会建立一个需要在系统启动时加载的核心模块,加入下行到/boot/loader.conf

nvidia_load="YES"

注意:

要将内核模块加载到正在运行的内核中,需执行类似kldload nvidia的命令。但Xorg的部分版本要求驱动必须在系统启动时加载,否则部分功能可能失效。如果没有在启动时加载驱动,在编译完/boot/loader.conf之后建议重启。

核心模块加载之后,您只需要更改xorg.conf的其中一行来开启专用的驱动程序:

找到/etc/X11/xorg.conf中的下行:

Driver      "nv"

然后更改该行为:

Driver      "nvidia"

如往常般启动GUI,您应该会看到nVidia的启动画面,其他东西应如往常般运作。

5.8.2. 设定xorg.conf来启动桌面特效

要开启Compiz Fusion需要修改/etc/X11/xorg.conf

加入以下Section来开启合成特效:

Section "Extensions"
    Option         "Composite" "Enable"
EndSection

找到Screen section,长的应该如下所示:

Section "Screen"
    Identifier     "Screen0"
    Device         "Card0"
    Monitor        "Monitor0"
    ...

然后加入以下两行(在Monitor之后):

DefaultDepth    24
Option         "AddARGBGLXVisuals" "True"

找到您欲使用的屏幕分辨率所在的Subsection,例如,您想要使用1280x1024,则找到如下所示的Section。若想要使用的分辨率不在任何Subsection之中,您可以手动加入对应的项目:

SubSection     "Display"
    Viewport    0 0
    Modes      "1280x1024"
EndSubSection

桌面合成需要24 bit的色彩深度,更改上述Subsection为:

SubSection     "Display"
    Viewport    0 0
    Depth       24
    Modes      "1280x1024"
EndSubSection

最后确认在Module section中已经加载glxextmod模块:

Section "Module"
    Load           "extmod"
    Load           "glx"
    ...

前面所述的动作可以执行x11/nvidia-xconfig来自动完成(使用root):

# nvidia-xconfig --add-argb-glx-visuals
# nvidia-xconfig --composite
# nvidia-xconfig --depth=24

5.8.3. 安装与设定Compiz Fusion

安装Compiz Fusion如同安装其他套件一样简单:

# pkg install x11-wm/compiz-fusion

安装完成之后,开启您的图型化桌面,然后在终端机的画面输入以下指令(使用一般使用者):

% compiz --replace --sm-disable --ignore-desktop-hints ccp &
% emerald --replace &

由于您的窗口管理程序(例如:Metacity,若您使用GNOME)会被替换成Compiz Fusion,您的屏幕会闪烁几秒。而Emerald会处理视窗的装饰(例如:关闭、最小化、最大化按钮、标题列及其他相关)。

您或许可以将这些指令改写成较小的Script然后在启动时自动执行(加到GNOME桌面的Sessions中):

#! /bin/sh
compiz --replace --sm-disable --ignore-desktop-hints ccp &
emerald --replace &

储存这个Script到您的家目录所在位置,例如start-compiz,然后让该档案可以执行:

% chmod +x ~/start-compiz

接着使用GUI将该档案加入启动程序Startup Programs(位于GNOME桌面的系统System,偏好设定Preferences,工作阶段Sessions)。

要选择所想使用的特效与相关设定,可执行(一样使用一般使用者)Compiz Config 设定管理程序Compiz Config Settings Manager

% ccsm

注意:

GNOME中,也可在系统System,偏好设定Preferences菜单中找到。

若您在编译时选择了gconf support,您便可使用gconf-editorapps/compiz下查看设定。

5.9. 故障排除

若鼠标无法使用,您将需要做第一次设定方可继续。在最近的Xorg版本,使用自动侦测装置会忽略在xorg.conf中的InputDevice section。要采用旧的方式,需在此档案加入下行到ServerLayoutServerFlags section:

Option "AutoAddDevices" "false"

输入装置便可如先前版本一样设定,连同其他所需的选项(如:切换键盘配置)。

注意:

如同前面有说明过,hald Daemon预设会自动侦测您的键盘,因此您的键盘配置或型号可能不正确,桌面环境如GNOMEKDEXfce会提供设定键盘的工具。即使如此,还是有可能透过setxkbmap(1)工具或hald的设定规则的协助来直接设定键盘属性。

举例来说,若有人想要使用PC 102键的键盘,采用法语(French)配置,我们便需要建立一个给hald的键盘配置文件,名称为x11-input.fdi,然后储存到/usr /local/etc/hal/fdi/policy目录。这个档案中应要有以下几行:

<?xml version="1.0" encoding="iso-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keyboard">
	  <merge key="input.x11_options.XkbModel" type="string">pc102</merge>
	  <merge key="input.x11_options.XkbLayout" type="string">fr</merge>
    </match>
  </device>
</deviceinfo>

若这个档案已经存在,只需要复制并粘贴您的档案中有关键盘设定的那几行。

您会需要重新启动您的机器来让hald读取这个档案。

也是可以从X终端机或Script下指令来做同样的设定:

% setxkbmap -model pc102 -layout fr

/usr/local/share/X11/xkb/rules/base.lst中列出了各种可用的键盘、配置与设定。

现在可以开始调整xorg.conf.new配置文件,在文字编辑器如emacs(1)ee(1)开启该配置文件。若显示器是不支持自动侦测同步频率(Sync frequency)的旧或特殊的型号,同步频率的设定可以手动加到xorg.conf.new“Monitor” section:

Section "Monitor"
	Identifier   "Monitor0"
	VendorName   "Monitor Vendor"
	ModelName    "Monitor Model"
	HorizSync    30-107
	VertRefresh  48-120
EndSection

多数显示器都支持自动侦测同步频率,并不需要手动设定这些数值。对于那些不支持自动侦测的显示器,请输入由制造商提供的数值来避免损坏显示器。

X允许在支持的显示器使用DPMS(Energy Star)功能,xset(1)程序可以控制逾时并可强制待机(Standby)、暂停(Suspend)或关闭(Off)模式。若您想要为您的显示器开启DPMS功能,您需要加入下行到显示器(Monitor)的Section:

Option       "DPMS"

在编辑器还未关闭xorg.conf.new配置文件前,选择想要使用的预设分辨率及色彩深度。这些项目可在“Screen” section定义:

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	Monitor    "Monitor0"
	DefaultDepth 24
	SubSection "Display"
		Viewport  0 0
		Depth     24
		Modes     "1024x768"
	EndSubSection
EndSection

DefaultDepth关键字代表预设执行要使用的色彩深度,这个设定可以被Xorg(1)的指令列参数-depth覆盖。Modes关键字代表执行要使用的分辨率,注意,只有VESA标准模式才支持目标系统的绘图硬件来定义分辨率。在上述的例子中,预设使用的色彩深度为每像素24 bit,这个色彩深度可用的分辨率为1024 x 768像素。

最后,储存配置文件并使用测试模式来测试上述的设定。

注意:

有一个工具可以协助您诊断问题,那就是Xorg日志档。该日志档中记录了Xorg连接的每个装置的信息。Xorg记录档名称的格式为/var/log/Xorg.0.log,确切的记录文件名会可能从Xorg.0.logXorg.8.log以此类推。

若一且运作正常,配置文件需要安装到Xorg(1)会寻找的常用配置文件位置,通常是/etc/X11/xorg.conf/usr/local/etc/X11/xorg.conf

# cp xorg.conf.new /etc/X11/xorg.conf

现在已经完成了Xorg的设定程序。Xorg现在可以使用startx(1)工具启动。Xorg服务器也可以使用xdm(1)来启动。

5.9.1. 设定Intel® i810绘图晶片组

要设定Intel® i810整合晶片组需要使用agpgart AGP程序界面来控制Xorg驱动该显卡。请参考agp(4)驱动程序操作手册来取得更多详细信息。

这也可让您可以设定任何其他绘图卡的硬件。注意,在未编译agp(4)到核心的系统,并无法使用kldload(8)来加载该模块,因此驱动程序必须在开机时便在核心启动,所以需要透过编译或使用/boot/loader.conf来加载。

5.9.2. 加入宽屏幕平板显示器到配置文件

此章节会需要有一些进阶的设定知识,若尝试使用上述的标准设定工具仍无法产生可运作的设定,在日志档中应有足够的信息可运用来让显卡运作。在此会需要使用文字编辑器。

目前使用宽屏幕(WSXGA,WSXGA+,WUXGA,WXGA,WXGA+,et.al.)格式支持的16:10及10:9格式或其他的宽高比可会有问题。例如一些16:10宽高比常见的屏幕分辨率:

  • 2560x1600

  • 1920x1200

  • 1680x1050

  • 1440x900

  • 1280x800

在某些时候,可以简单的将这些要使用的分辨率以Mode加入到Section“Screen”:

Section "Screen"
Identifier "Screen0"
Device     "Card0"
Monitor    "Monitor0"
DefaultDepth 24
SubSection "Display"
	Viewport  0 0
	Depth     24
	Modes     "1680x1050"
EndSubSection
EndSection

Xorg能够从宽屏幕设定取得分辨率信息(透过I2C/DDC),因此能够知道屏幕能处理的频率及分辨率。

若驱动程序中不存在那些屏幕能处理的ModeLines,则需要给Xorg一点提示。透过/var/log/Xorg.0.log可以取得足够的信息来手动建立可运作的 ModeLine。只需要在日志档中找到类似以下的信息:

(II) MGA(0): Supported additional Video Mode:
(II) MGA(0): clock: 146.2 MHz   Image Size:  433 x 271 mm
(II) MGA(0): h_active: 1680  h_sync: 1784  h_sync_end 1960 h_blank_end 2240 h_border: 0
(II) MGA(0): v_active: 1050  v_sync: 1053  v_sync_end 1059 v_blanking: 1089 v_border: 0
(II) MGA(0): Ranges: V min: 48  V max: 85 Hz, H min: 30  H max: 94 kHz, PixClock max 170 MHz

这些信息称作EDID信息,使用EDIT信息建立ModeLine只需要将数据使用正确的顺序放入:

ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings>

将信息放入之后,本例中Section“Monitor”中的ModeLine会看起来像这样:

Section "Monitor"
Identifier      "Monitor1"
VendorName      "Bigname"
ModelName       "BestModel"
ModeLine        "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089
Option          "DPMS"
EndSection

便完成编辑的步骤,接着需要在您的宽屏幕显示器启动X。

5.9.3. Compiz Fusion 故障排除

5.9.3.1. 我已经安装了Compiz Fusion,但在执行了您所提到的指令后,我的视窗的标题列与按钮便消失了。是那里有问题?
5.9.3.2. 当我执行指令来启动Compiz Fusion,X server 便崩溃了,然后我又返回控制台。是那里有问题?

5.9.3.1.

我已经安装了Compiz Fusion,但在执行了您所提到的指令后,我的视窗的标题列与按钮便消失了。是那里有问题?

您可能忘记在/etc/X11/xorg.conf中的设定。请重新检查这个档案,特别是DefaultDepthAddARGBGLXVisuals指令项。

5.9.3.2.

当我执行指令来启动Compiz Fusion,X server 便崩溃了,然后我又返回控制台。是那里有问题?

若您检查/var/log/Xorg.0.log,您可能可以找到当X启动时所发生的错误讯息。最常发生的错误会是:

(EE) NVIDIA(0):     Failed to initialize the GLX module; please check in your X
(EE) NVIDIA(0):     log file that the GLX module has been loaded in your X
(EE) NVIDIA(0):     server, and that the module is the NVIDIA GLX module.  If
(EE) NVIDIA(0):     you continue to encounter problems, Please try
(EE) NVIDIA(0):     reinstalling the NVIDIA driver.

会发生这个情形通常是因为您升级了Xorg,您需要重新安装x11/nvidia-driver套件来重新编译glx。

部分 II. 一般作业

既然基础的部分已经提过了,接下来的这个部分将会讨论一些常会用到的FreeBSD的特色,这些章节包括:

  • 介绍给您常见且实用的桌面应用软件:浏览器、办工工具、文件阅览程序等。

  • 介绍给您众多FreeBSD上可用的多媒体工具。

  • 解释如何编译量身订做的FreeBSD核心以增加额外系统功能的流程。

  • 详细描述打印系统,包含桌上型打印机及网络打印机的设定。

  • 展示给您看如何在您的FreeBSD系统中执行Linux应用软件。

这些章节中有些需要您预先阅读些相关文件,在各章节开头的概要内会提及。

第 6 章 桌面应用程序

6.1. 简介

随着FreeBSD优越的性能及稳定性越来越热门,它同时适合作为每日使用的桌面系统。FreeBSD套件或Port有超过24,000个可用的应用程序,可以简单的建立一个自定义的桌面环境来执行各种不同的桌面应用程序。本章将示范如何安装数个桌面应用程序,包含网页浏览器、办工软件、文件阅览程序以及财务软件。

注意:

如果用户希望安装预先构建的桌面版 FreeBSD 而非不是从头配置,可选择 FuryBSD, GhostBSDMidnightBSD

在阅读这章之前,你必须了解如何:

要取得有关如何设定多媒体环境的信息,请参考第 7 章 多媒体

6.2. 浏览器

在FreeBSD中并未预先安装好网页浏览器。但在Port套件集中的www分类中有许多浏览器可以采Binary套件安装或自Port套件集编译的方式安装。

KDEGNOME桌面环境都有提供自有的HTML浏览器。请参考第 5.7 节 “桌面环境”来了解更多有关如何设定完整桌面环境的信息。

有一些轻量化的浏览器可使用,包含www/dillo2www/links以及www/w3m

本章节将示范如何安装下列常见的网页浏览器并说明该应用程序是否需要用到大量资源、花费大量时间自Port编译或何主要的相依套件。

应用程序名称所需资源自Port安装时间说明
Firefox有FreeBSD、Linux®及在地化版本
Konqueror需要KDE程式库
Chromium需要Gtk+程式库

6.2.1. Firefox

Firefox是一套已完整植到FreeBSD的开放源始码浏览器,它具备符合HTML标准的显示引擎、页签浏览、弹出视窗封锁、扩充套件、强化安全性及其他更多功能。Firefox的基础使用了Mozilla的程序库。

要安装最新释出版本的Firefox套件可输入:

# pkg install firefox

要安装延长支持发布(Extended Support Release,ESR)版本的Firefox,可使用:

# pkg install firefox-esr

使用Port套件地可以用源码编译成您想要的Firefox版本。此示例编译www/firefox,其中firefox可替换为ESR或在地化版本来安装。

# cd /usr/ports/www/firefox
# make install clean

6.2.2. Konqueror

Konqueror不只是个网页浏览器,它同时也是档案管理器和多媒体浏览器。支持 WebKit 和 KHTML。WebKit 是一个渲染引擎,许多浏览器都有使用它的代码,包括 Chromium。

Konqueror可以使用 package 来安装,只要输入:

# pkg install konqueror

从Port套件集安装:

# cd /usr/ports/x11-fm/konqueror/
# make install clean

6.2.3. Chromium

Chromium是一个开放源始码的浏览器计划,该计划的目标是要建立一个安全、快速且更稳定的网页浏览体验。Chromium的功能有页签式浏览、弹出视窗封锁、扩充套件等等。

Chromium可以使用套件来安装,只要输入:

# pkg install chromium

或者可从Port套件集的源码编译Chromium

# cd /usr/ports/www/chromium
# make install clean

注意:

Chromium的执行档为/usr/local/bin/chrome,并非/usr/local/bin/chromium

6.3. 办工工具

当开始进行办公,新的使用者通常会去找好用的办公室软件或是好上手的文件处理程序。虽然有些桌面环境像是KDE已经提供了办公软件组合的套件,FreeBSD预设未提供任何办工工具。不论是否有安装视窗管理程序,FreeBSD可安装多套办公软件以及图型化文件处理程序。

本章节元范如何安装以下热门的办工软件以及说明该应用程序所需的资源、自Port编译的时间或者是否有其他主要相依套件。

应用程序名称所需资源自Port安装时间主要相依套件
CalligraKDE
AbiWordGtk+GNOME
The GimpGtk+
Apache OpenOffice非常多JDKMozilla
LibreOffice有点多非常多Gtk+KDE/ GNOMEJDK

6.3.1. Calligra

KDE桌面环境中内含办公软件可以与KDE分开安装。Calligra中也有可在其他办公软件中找到的标准元件,如Words是文件处理程序、Sheets是电子表格程序、Stage可管理投影片以及Karbon用来绘制图型文件。

在FreeBSD中editors/calligra可以使用套件或Port的方式安装,要使用套件安装:

# pkg install calligra

若没有可用的套件,可改使用Port套件集安装:

# cd /usr/ports/editors/calligra
# make install clean

6.3.2. AbiWord

AbiWord是一个免费的文件处理软件,外观和感觉都近似于Microsoft® Word。它非常快速,包含了许多功能而且非常容易上手。

AbiWord可以输入或输出许多档案格式,包括一些有专用的格式,例如Microsoft® .rtf格式。

要安装AbiWord Binary套件,可使用下列指令:

# pkg install abiword

若没有Binary套件版本,也可以从Port套件集中编译安装:

# cd /usr/ports/editors/abiword
# make install clean

6.3.3. The GIMP

对于图像的编辑及修改来说,The GIMP是非常精致的图像处理软件。它可以当作简单的绘图软件或是高品质的相片处理软件。它支持为数众多的外挂程序及指令稿(script-fu)界面。The GIMP可以读写许多档案格式。它也支持扫描仪和手写板。

要安装套件可:

# pkg install gimp

或使用Port套件集安装:

# cd /usr/ports/graphics/gimp
# make install clean

在Port套件集的graphics分类(freebsd.org/ports/graphics.html)下也包含了许多GIMP相关的附加元件,说明档及使用手册。

6.3.4. Apache OpenOffice

Apache OpenOffice是开放源码的办工室软件,由Apache Software Foundation's Incubator底下的团队所开发。它包含了所有完整的办公软件组合:文字处理器、电子表格、简报软件还有绘图软件。除了它的使用者界面非常类似其他的办公软件,他还能够输入和输出许多热门的档案格式。它也包含了不同语言的使用者界面、拼字检查和字典。

Apache OpenOffice的文字处理器使用原生的 XML 文档格式来增加移植性及弹性。电子表格程序支持宏(Macro)功能而且能够使用外来的数据库界面。Apache OpenOffice已经十分稳定,并且能够在Windows®,Solaris™,Linux®,FreeBSD及Mac OS® X等操作系统上面执行。想知道更多关于Apache OpenOffice的信息可以在openoffice.org网页上查询。在FreeBSD特定的信息可参考porting.openoffice.org/freebsd/

要安装Apache OpenOffice套件:

# pkg install apache-openoffice

当套件安装完成之后,只要输入下面的指令就能执行Apache OpenOffice

% openoffice-X.Y.Z

其中X.Y.Z是已安装的Apache OpenOffice的版本编号。第一次执行Apache OpenOffice会询问一些问题且会在使用者的家目录建立一个 .openoffice.org文件夹。

若无法由套件取得想要的Apache OpenOffice,仍可选择从Port编译。不过必须注意:编译的过程会需要大量的磁盘空间与时间:

# cd /usr/ports/editors/openoffice-4
# make install clean

注意:

如果想要编译在地化的版本,将前面的指令替换成为:

# make LOCALIZED_LANG=your_language install clean

替换your_language为正确的语言ISO编码。支持的语言编码清单在files/Makefile.localized,位于该Port的目录。

6.3.5. LibreOffice

LibreOffice是一套自由的办公软件由documentfoundation.org所开发。它可兼容其他主流的办公软件以及可在各种平台上使用。它是Apache OpenOffice品牌重塑后的分支,含有可在完整办公生产力软件中找到的应用程序:文件处理程序、电子表格、简报管理程序、绘图程序、数据库管理程序以及建立与编辑数学公式的工具。它也支持数种语言与国际化一直延伸到界面、拼字检查程序与字典。

LibreOffice的文件处理程序使用了原生的XML档案格式来增加可携性与弹性,电子表格程序支持可与外部数据库连接的巨集语言。LibreOffice非常稳定且可直接在Windows®,Linux®,FreeBSD以及Mac OS® X上执行。更多有关LibreOffice的信息可在libreoffice.org找到。

要安装英文版本的LibreOffice套件:

# pkg install libreoffice

Port套件集的编辑器分类(freebsd.org/ports/editors.html)中含有数个LibreOffice的语系。安装在地化套件时,请替换libreoffice为在地化套件的名称。

套件安装之后,输入以下指令来执行LibreOffice

% libreoffice

第一次启动的过程中会询问一些问题并在使用者的家目录建立.libreoffice文件夹。

若找不到想使用的LibreOffice套件,也可从Port编译,但这会要大量的磁盘空间及漫长的时间编译。以下例子示范编译英文版本:

# cd /usr/ports/editors/libreoffice
# make install clean

注意:

要编译在地化版本,则需cd进入想要的语言Port目录。支持的语言可在Port套件集的编辑器分类(freebsd.org/ports/editors.html)中找到。

6.4. 文件阅览程序

UNIX®出现之后,有一些新的文件格式才越来越热门,这些文件所需的检视程序可能并不在基础系统中。本节将示范如何安装以下文件检视程序:

应用程序名称所需资源自Port安装时间主要相依套件
XpdfFreeType
gvXaw3d
GeeqieGtk+GNOME
ePDFViewGtk+
OkularKDE

6.4.1. Xpdf

如果你想要一个小型的FreeBSD PDF阅览软件,Xpdf是个轻量级而且有效率的阅览器。它只需要非常少的资源而且十分稳定。它只使用标准的X字体且不需要额外的工具包(Toolkit)。

安装Xpdf套件:

# pkg install xpdf

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/graphics/xpdf
# make install clean

完成安装后,执行xpdf并使用鼠标右键开启菜单。

6.4.2. gv

gvPostScript®和PDF的阅览器。它建构于ghostview的基础上,不过因为使用Xaw3d视窗元件工具包,所以外观看起来比较漂亮。gv有许多可设定的功能,比如说纸张方向、纸张大小、缩放比例、和反锯齿(Anti-aliasing)等。而且几乎所有的使用都可以从键盘或鼠标来完成。

安装gv套件:

# pkg install gv

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/print/gv
# make install clean

6.4.3. Geeqie

Geeqie是由已经停止维护的GQView项目所衍伸出来的分支,并致力开发新功能并整合已有的修补。Geeqie是一套图像管理软件,支持单键阅览档案、启动外部编辑器、缩图预览等功能。它也有幻灯片模式及一些基本的档案操作的功能,能轻松的管理大量图像并找出重复的档案。Geeqie也支持使用全屏幕阅览以及国际化。

安装Geeqie套件:

# pkg install geeqie

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/graphics/geeqie
# make install clean

6.4.4. ePDFView

ePDFView是一套小巧的PDF文件检视程序,只使用了Gtk+Poppler程序库。它目前还在开发当中,但已经可以开启大部份PDF档案(甚至是加密过的)、储存文件复本以及支持使用CUPS来打印。

要以套件安装ePDFView

# pkg install epdfview

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/graphics/epdfview
# make install clean

6.4.5. Okular

Okular是一套通用的文件检视程序,以KDEKPDF为基础。它可以开启许多种文件格式,包含了PDFPostScript®,DjVu,CHMXPS以及ePub。

要以套件安装Okular

# pkg install okular

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/graphics/okular
# make install clean

6.5. 财务

如果有任何理由你想要在你的FreeBSD桌面环境上管理你的个人财务,这里有一些功能强大、使用简单的应用程序可供安装。这些财务管理软件之中有些是兼容于流行的QuickenExcel文件。

这节涵盖了下面这些软件:

应用程序名称所需资源自Port安装时间主要相依套件
GnuCashGNOME
GnumericGNOME
KMyMoneyKDE

6.5.1. GnuCash

GnuCashGNOME团队努力成果中的一部分,GNOME团队主要提供亲切而强大的桌面应用程序给终端使用者。使用GnuCash可以持续追踪收入与花费、银行帐户以及股票证券等。它的特性是界面直觉但功能仍非常专业。

GnuCash提供了智慧的计数器、多阶层帐户系统以及快速键及自动完成功能。它也能分开单一的报表至数个详细的部份。GnuCash也能够汇入及合并Quicken QIF档案。它也能处理大部分国际的日期及通用货币之格式。

安装GnuCash套件:

# pkg install gnucash

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/finance/gnucash
# make install clean

6.5.2. Gnumeric

GnumericGNOME社群所开发的电子表格程序。它的特点是拥有能够根据储存格格式「猜出」使用者的输入来自动补齐的系统。它也能够汇入许多热门的档案格式,像是ExcelLotus 1-2-3以及Quattro Pro。它有大量内置的函数而且能够使用常用的储存格格式,像是:数字、货币、日期、时间及其他格式等。

安装Gnumeric套件:

# pkg install gnumeric

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/math/gnumeric
# make install clean

6.5.3. KMyMoney

KMyMoney是一套个人财务应用程序,由KDE社群所开发。KMyMoney的目标是提供可在商业个人财务管理应用程序中找到的重要功能,它也强调简单易用及其功能间采用合适的复式记账。KMyMoney可从标准Quicken QIF档案汇入数据、追踪投资、处理多种货币并提供财务报表。

要以套件安装KMyMoney

# pkg install kmymoney-kde4

若没有可用的套件版本,可使用Port套件集安装:

# cd /usr/ports/finance/kmymoney-kde4
# make install clean

第 7 章 多媒体

Edited by Ross Lippert.

7.1. 简介

FreeBSD广泛地支持各种声卡,让使用者可以享受来自电脑上的高传真音质(Hi-Fi),此外还包括了录制和播放MPEG Audio Layer 3(MP3)、Waveform Audio File(WAV)、Ogg Vorbis以及其他许多种格式声音的能力。同时FreeBSD Port套件集也包含了许多可让您可以录音、编修音效以及控制MIDI配备的应用程序。

FreeBSD也能播放一般的视讯档和DVD。FreeBSD Port套件集中含有可编码、转换以及播放格种图像媒体的应用程序。

本章会说明如何设定FreeBSD上的声卡、图像播放器、电视卡及扫描仪。同时会说明有那些应用程序可以使用这些装置。

读完这章,您将了解:

  • 设定FreeBSD上的声卡。

  • 音效设定疑难排解。

  • 播放、录制MP3及其他声音档案格式。

  • FreeBSD系统播放图像的准备工具。

  • 播放DVD.mpg.avi档。

  • 撷取(Rip)CDDVD的内容至档案。

  • 设定电视卡。

  • 在 FreeBSD安装 MythTV

  • 配置图像扫描仪。

  • 配置蓝牙耳机。

在阅读这个章节之前,您应当:

7.2. 设定声卡

Contributed by Moses Moore.
Enhanced by Marc Fonvieille.

开始设定之前,必须先知道你的声卡型号、芯片为何。FreeBSD支持许多种声卡,请检查支持的音效硬体表Hardware Notes,以确认你的声卡是否支持以及如何在FreeBSD上驱动。

要使用音效装置,必须要加载正确的驱动程序才行。最简单方式就是以kldload(8)来加载内核模块。以下示例示范加载Intel规格内置的音效芯片驱动程序:

# kldload snd_hda

要开机时自动加载驱动程序,需将驱动程序加到/boot/loader.conf档,以此驱动程序为例:

snd_hda_load="YES"

其他可用的声卡模块清单列于/boot/defaults/loader.conf。当不确认要使用何种驱动程序时,可加载snd_driver模块:

# kldload snd_driver

它是metadriver会加载所有最通用的音效驱动程序并且用来加速寻找正确的驱动程序。也可以把metadriver加入/boot/loader.conf档来加载所有音效驱动程序。

要知道加载snd_driver metadriver后使用了那个声卡驱动程序,请输入cat /dev/sndstat

7.2.1. 设定自定义核心支持音效

本节适用于希望将声卡驱动静态编译进内核的用户。有关重新编译内核的详细信息,请参阅第 8 章 配置 FreeBSD 内核

使用自定义内核提供声音支持时,请确保自定义内核配置文件中存在音频框架驱动程序:

device sound

接下来就是加入对我们所用声卡的支持了。假设我们使用的是上节冲提到的 Intel 声卡芯片组,需要在内核编译配置文件中加入下面一行:

device snd_hda

一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的具体写法, 也可以在 /usr/src/sys/conf/NOTES 文件中找到。

非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息 (IRQ、 I/O 端口, 等等), 这一点与其他不支持即插即用的 ISA 卡类似。 这项工作可以通过 /boot/device.hints 文件来完成。 系统启动时, loader(8) 将读取这个文件, 并将其中的配置传给内核。 例如, 旧式的 Creative SoundBlaster® 16 ISA 非即插即用卡需要使用 snd_sbc(4) 驱动并配合 snd_sb16(4)。 您可以在内核编译配置文件中增加如下配置:

device snd_sbc
device snd_sb16

如果声卡使用0x220 I/O 端口和 IRQ 5,则必须将这些行添加到/boot/device.hints中:

hint.sbc.0.at="isa"
hint.sbc.0.port="0x220"
hint.sbc.0.irq="5"
hint.sbc.0.drq="1"
hint.sbc.0.flags="0x15"

/boot/device.hints 文件中所使用的语法, 在 sound(4) 联机手册中以及所用的具体声卡驱动的联机手册中, 会进行进一步的讲解。

上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 snd_sbc(4) 联机手册了解更多信息。

7.2.2. 测试音效

用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中(dmesg(8)),执行 dmesg | grep pcm 确认系统是否检测到声卡。本例使用 Conexant CX20590 芯片组:

pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 5 on hdaa0
pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 6 on hdaa0
pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> at nid 31,25 and 35,27 on hdaa1

声卡状态可以使用此命令查询:

# cat /dev/sndstat
FreeBSD Audio Driver (newpcm: 64bit 2009061500/amd64)
Installed devices:
pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> (play/rec) default

您系统的输出可能与此不同。如果没有看到 pcm 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 常见问题和问题解决方案列在下一张列出。

如果一切正常,声卡应该可以用了。如果您的 CD-ROM 或者 DVD-ROM 驱动器的音频输出线已经与声卡连在一起,您可以把 CD 放入驱动器并用 cdcontrol(1) 播放它:

% cdcontrol -f /dev/acd0 play 1

警告:

音频 CD 具有专门的编码,这意味着不应使用mount(8)挂载它们。

许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。

另一种快速测试声卡的方法是将数据发送到 /dev/dsp,像这样:

% cat filename > /dev/dsp

这里 filename 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。

注意:

设备节点 /dev/dsp* 会在需要的时候自动产生。 如果没有使用它们, 则它们不会出现在 ls(1) 的输出中。

7.2.3. 设置蓝牙音箱

连接到蓝牙设备不在本章的范围之内。更多信息请参考第 31.5 节 “蓝牙”

要让FreeBSD 声音系统与蓝牙音箱一起正常工作,用户需安装audio/virtual_oss

# pkg install virtual_oss

audio/virtual_oss 需要内核加载 cuse 模块:

# kldload cuse

cuse在系统启动时加载,运行此命令:

# sysrc -f /boot/loader.conf cuse_load=yes

要将耳机用作audio/virtual_oss的声音接收器,用户需要在连接到蓝牙音频设备后创建虚拟设备:

# virtual_oss -C 2 -c 2 -r 48000 -b 16 -s 768 -R /dev/null -P /dev/bluetooth/headphones -d dsp

注意:

本例中headphones/etc/bluetooth/hosts的主机名。可以改用BT_ADDR

更多信息请参阅virtual_oss(8)

7.2.4. 疑难解答

表 7.1 “常见错误讯息”列出了一些常见的错误消息及其解决方案:

表 7.1. 常见错误讯息
错误解决方式
sb_dspwr(XX) timed out

I/O端口没有设置正确。

bad irq XX

IRQ设置不正确。确认设定的IRQ和声卡的IRQ是一样的。

xxx: gus pcm not attached, out of memory

没有足够的内存空间供设置使用。

xxx: can't open /dev/dsp!

使用命令 fstat | grep dsp 进行检查是否有其它的程序打开了设备。 值得注意的是 esoundKDE 提供的声卡支持经常是造成麻烦的祸根。


另一个问题是许多新式的显卡本身包含它们自己的声音驱动, 用以配合 HDMI 这样的设备使用。 这个声音设备有时会在真正的声卡之前被探测到, 从而成为默认的回放设备, 而使真正的声卡无法发声。 要检查这种情况, 运行 dmesg 并观察 pcm。 其输出类似下面这样:

...
hdac0: HDA Driver Revision: 20100226_0142
hdac1: HDA Driver Revision: 20100226_0142
hdac0: HDA Codec #0: NVidia (Unknown)
hdac0: HDA Codec #1: NVidia (Unknown)
hdac0: HDA Codec #2: NVidia (Unknown)
hdac0: HDA Codec #3: NVidia (Unknown)
pcm0: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 0 nid 1 on hdac0
pcm1: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 1 nid 1 on hdac0
pcm2: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 2 nid 1 on hdac0
pcm3: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 3 nid 1 on hdac0
hdac1: HDA Codec #2: Realtek ALC889
pcm4: <HDA Realtek ALC889 PCM #0 Analog> at cad 2 nid 1 on hdac1
pcm5: <HDA Realtek ALC889 PCM #1 Analog> at cad 2 nid 1 on hdac1
pcm6: <HDA Realtek ALC889 PCM #2 Digital> at cad 2 nid 1 on hdac1
pcm7: <HDA Realtek ALC889 PCM #3 Digital> at cad 2 nid 1 on hdac1
...

此处显卡 (NVidia) 先于真正的声卡 (Realtek ALC889) 被探测到。 要使用声卡作为默认的回放设备, 将 hw.snd.default_unit 改为对应的设备编号:

# sysctl hw.snd.default_unit=n

这里的 n 是希望使用的声音设备编号, 在这个例子中是 4。 您可以在 /etc/sysctl.conf 中写上这个配置来令其永久性生效:

hw.snd.default_unit=4

7.2.5. 使用多个音效来源

Contributed by Munish Chopra.

有时我们希望多个音源能同时播放,FreeBSD 使用虚拟声音信道虚拟声道在内核里混合声音来混合声卡里播放的声道。

使用三条sysctl(8)命令来设置虚拟声道的数目。 如果您是 root 用户, 执行下面的操作:

# sysctl dev.pcm.0.play.vchans=4
# sysctl dev.pcm.0.rec.vchans=4
# sysctl hw.snd.maxautovchans=4

此示例分配四个虚拟通道,平常一般只用这么多。dev.pcm.0.play.vchans=4 and dev.pcm.0.rec.vchans=4 都可以在连接设备后进行调整,并表示 pcm0 用于回放和录制的虚拟通道数。 由于pcm 模块可以独立于硬件驱动程序加载,因此 hw.snd.maxautovchans 表示连接时音频设备将提供多少个虚拟通道。 更多信息请参阅 pcm(4)

注意:

您不能在使用某个设备的时候改变其虚拟通道数。 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。

当应用程序请求 /dev/dsp0 时, 系统会自动为其分配正确的 pcm 设备。

7.2.6. 设定混音器频道的预设值

Contributed by Josef El-Rayes.

不同的混音通道的默认音量是硬编码进 pcm(4) 驱动程序的。 同时, 也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如:

hint.pcm.0.vol="50"

这将在 pcm(4) 模块加载时, 将通道音量设置为默认的 50。

7.3. MP3音乐

Contributed by Chern Lee.

本节介绍一些适用于 FreeBSD 的MP3播放器、如何翻录音频CD轨道以及如何对MP3进行编码和解码。

7.3.1. MP3播放器

一个流行的图形 MP3 播放器是 Audacious。它支持 Winamp 皮肤和其他插件。界面直观,带有播放列表,图形均衡器等。那些熟悉 Winamp 的人会发现 Audacious 很简单易用。在FreeBSD上,可以从multimedia/audacious port 或 package 安装Audacious。Audacious是XMMS的后代。

audio/mpg123 package 或 port 提供了命令行 MP3 播放器。安装后指定要在命令行上播放的 MP3 文件。如果系统有多个音频设备,还可以指定声音设备:

# mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.18.1; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes

Playing MPEG stream from Foobar-GreatestHits.mp3 ...
MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo

FreeBSD Port 中还提供了其他 MP3 播放器。

7.3.2. 抓取 CD 音轨

在对 CD 或 CD 音轨编码成MP3之前,CD 上的音频数据应先抓到硬盘里。 这个可以通过复制原始的 CDDA(CD 数字音频)数据成为波形(WAV)文件。

工具 cdda2wavsysutils/cdrtools 套件的一部份,可用来从CD中获取音频及其相关信息。

把 CD 放到光驱里,下面的命令可以完成(作为 root用户) 把整张 CD 分割成单个(每个音轨)的WAV文件:

# cdda2wav -D 0,1,0 -B

本例中 -D 0,1,0指示SCSI设备0,1,0代表要抓取的 CD 。使用 cdrecord -scanbus 来确定系统的正确设备参数。

抓取单轨,要使用选项 -t,如下所示:

# cdda2wav -D 0,1,0 -t 7

这个实例用于抓取第七个音轨。要抓取一定范围的音轨,如从1到7:

# cdda2wav -D 0,1,0 -t 1+7

要从 ATAPI (IDE) CDROM 驱动器中翻录,请指定设备名称以代替 SCSI 单元号。 例如,要从IDE驱动器中翻录轨道7:

# cdda2wav -D /dev/acd0 -t 7

利用dd(1)也可以从ATAPI光驱中抓取音轨,从 第 17.5.5 节 “复制音乐CD 可以了解更多。

7.3.3. MP3编码与译码

现今,可选的 MP3 编码器是 LameLame 可以从ports树里的 audio/lame 处找到,由于专利问题,不可从 pkg 中安装此软件。

利用抓取的WAV文件,下边的命令就可以把 audio01.wav 转换成 audio01.mp3

# lame -h -b 128 --tt "Foo Song Title" --ta "FooBar Artist" --tl "FooBar Album" \
--ty "2014" --tc "Ripped and encoded by Foo" --tg "Genre" audio01.wav audio01.mp3

128 kbits 是标准的MP3位率(bitrate)。 许多人可能喜欢更高的品质例如 160 或 192。 更高的位率, 会使 MP3 占用更多的磁盘空间--但音质会更高。选项 -h 控制 高品质但低速度 (higher quality but a little slower) 模式的开关。 选项 --t 表示把 ID3 标签--通常包含了歌曲的信息, 植入到MP3文件里。 其它的编码选项可以查询 lame 的联机手册。

为了从 MP3 刻录到音频 CD , 必须首先将其转换为非压缩文件格式。 XMMS 可用于转换为 WAV 格式, 而 mpg123 可用于转换为原始脉冲代码调制 ( PCM ) 音频数据格式。

要使用mpg123转换audio01.mp3, 请指定 PCM 文件的名称:

# mpg123 -s audio01.mp3 > audio01.pcm

使用XMMSMP3 转换成 WAV,步骤如下:

过程 7.1. 在XMMS中转换为 WAV
  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

cdrecord可以使用WAVPCM格式。当使用WAV文件时,每个音轨的开头会有一个小的嘀嗒声。这个声音是WAV文件的标题。可以使用 audio/sox来移除头:

% sox -t wav -r 44100 -s -w -c 2 track.wav track.raw

阅读 第 17.5 节 “创建和使用 CD” 这部份可以了解到更多在 FreeBSD 里刻盘的信息。

7.4. 视频回放

Contributed by Ross Lippert.

在开始之前,您要了解显卡的类型以及它所用的芯片的类型。 尽管 Xorg 支持大量的显卡, 但能达到好的回放效果的却寥寥无几。 在X11运行时,您可以使用命令 xdpyinfo(1) 获得使用您的显卡的X服务器所支持的扩展列表。

为了评估各种播放器和设置,您需要有一小段用作测试的MPEG文件。 由于一些DVD播放器会默认地在 /dev/dvd 里去找DVD文件, 因此, 您会发现建立符号链接到恰当的设备会很有用:

# ln -sf /dev/cd0 /dev/dvd

注意:由于 devfs(5) 本身的原因, 像这样手工建立的链接在重启后将不会存在。 想要无论什么时候您启动系统都能自动建立符号链接, 那就把下边这行加到 /etc/devfs.conf 里边:

link cd0 dvd

另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。

为了改善 Xorg 界面使用共享内存的能力, 建议提高一些 sysctl(8) 变量的值:

kern.ipc.shmmax=67108864
kern.ipc.shmall=32768

7.4.1. 侦测图像处理能力

在 Xorg 下有几种可以显示图像的方式。 到底哪个能工作很大程度上依赖于硬件。 首先, 下边描述的每一种方法在不同的硬件上都会有不同的品质。 其次, 在X11里的图像显示近来引起普遍的关注, 随着 Xorg 的每一个版本, 都会有很大的突破。

常见图像接口列表:

  1. Xorg:一般性的使用共享内存的X11输出。

  2. XVideo:Xorg插件,允许通过特殊的加速在可绘制的对象中直接显示视频。即使在低端机器上,此插件也能提供高质量的回放。下一节介绍如何确定此插件是否正在运行。

  3. SDL:简单直接媒体层是许多操作系统的移植层,允许开发跨平台应用程序,从而有效地利用声音和图形。SDL 为硬件提供了一个低级抽象,有时比 Xorg 接口更高效。在 FreeBSD 上, SDL 可以使用devel/sdl20 package或port进行安装。

  4. DGA: Direct Graphics Access是Xorg的一个扩展,它允许程序绕过Xorg服务器,直接改变帧缓冲区。由于它依赖于低级别的内存映射,使用它的程序必须以root的身份运行。DGA扩展可以使用dga(1)进行测试和基准测试。当dga运行时,每当按下一个键,它就会改变显示屏的颜色。要退出,请按q

  5. SVGAlib:底层图形库。

7.4.1.1. XVideo

要了解这一扩展是否在正常工作, 使用 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。这意味着,根据显卡和处理器的不同,显示器将更难满足渲染视频的计算要求。

7.4.2. 可处理图像的Port与套件

这部份主要讨论在 FreeBSD Ports 集中提供的可用于视频回放的软件。 视频回放在软件发展中是个很活跃的领域, 并且各种不同程序的功能可能与这里的描述不尽相同。

7.4.2.1. MPlayerMEncoder

MPlayer 是一个命令行视频播放器, 具有可选的图形界面, 旨在提供速度和灵活性。其他图形前端 MPlayer 可从 FreeBSD ports集合中获得。

可以使用multimedia/mplayer package或port安装MPlayer。有几个编译选项可用, 并且在生成过程中会进行各种硬件检查。由于这些原因, 一些用户更喜欢生成port, 而不是安装package。

编译port时, 应检查菜单选项, 以确定要编译到端口的支持类型。如果未选择某个选项, MPlayer 将无法显示该类型的视频格式。使用箭头键和空格键选择所需的格式。完成后, 按 Enter 继续port编译和安装。

默认情况下,包或端口将构建mplayer命令行实用程序和gmplayer图形实用程序。要对视频进行编码,请编译multimedia/mencoder端口。由于许可限制,包不可用于MEncoder

第一次运行 MPlayer 时, 它将在用户的主目录中创建~/.mplayer。此子目录包含用户特定配置文件的默认版本。

本节只描述了几个常见的用途。有关其众多选项的完整描述,请参阅mplayer(1)。

要播放一个文件,如 testfile.avi, 可以通过各种视频接口当中的某一个去设置 -vo 选项:

% mplayer -vo xv testfile.avi
% mplayer -vo sdl testfile.avi
% mplayer -vo x11 testfile.avi
# mplayer -vo dga testfile.avi
# mplayer -vo 'sdl:dga' testfile.avi

所有这些选项都是值得一试的, 因为它们的性能依赖很多因素,并且都与硬件密切相关。

要播放 DVD, 需要把 testfile.avi 改为 dvd://N -dvd-device DEVICE。 这里 N 是要播放的节目编号, 而 DEVICE 则是 DVD-ROM 的设备节点。 例如, 要播放 /dev/dvd 的第三个节目:

# mplayer -vo xv dvd://3 -dvd-device /dev/dvd

注意:

可以在编译 MPlayer 时, 通过 WITH_DVD_DEVICE=/path/to/desired/device 来指定默认的 DVD 设备。 系统内定的默认设备是 /dev/cd0。 更多细节, 请参考 port 的 Makefile.options

要停止、暂停、前进等等,可以参考设定的按键---这些可以通过 mplayer -h 得到或查看手册。

另外,回放的重要选项是:用于全屏模式的 -fs -zoom 和起辅助完成作用的-framedrop

为了让 mplayer 的命令行不是太长,使用者可以通过建立一个文件 .mplayer/config 来设定如下默认选项:

vo=xv
fs=yes
zoom=yes

最后,mplayer 可以把DVD题目(title)抓取成为 .vob 文件。为了从DVD中导出第二个题目,请输入:

# mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd

输出文件 out.vob 将是 MPEG 并且可以被这部份描述的其它 利用。

任何希望获得UNIX®视频方面高水平专业知识的人都应访问mplayerhq.hu/DOCS,因为它在技术上是信息丰富的。在提交任何错误报告之前,应将此文档视为必读文件。

在使用mencoder之前, 最好熟悉mplayerhq.hu/DOCS/HTML/en/mencoder.html中描述的选项。有无数的方法来提高质量、更低的比特率和更改格式, 其中一些选项可能会决定好的或坏的性能之间的区别。即使mplayer命令行选项的组合也会产生不可播放的输出文件。

下面是一个简单的示例:

% mencoder input.avi -oac copy -ovc copy -o output.avi

要翻录到文件,请使用 mplayer 附带 -dumpfile

要将input.avi转换为带有 MPEG3 音频编码的 MPEG4 编解码器, 请首先安装audio/lame port。由于许可限制, package不可用。安装完成后, 键入:

% mencoder input.avi -oac mp3lame -lameopts br=192 \
	 -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi

这样就产生了可被 mplayerxine播放的输出。

input.avi 可以换成 dvd://1 -dvd-device /dev/dvd 并以 root 的身份来执行, 以重新对 DVD 节目进行编码。 由于您第一次做这样的工作时很可能会对结果不太满意, 建议您首先把节目复制成文件, 然后对它进行操作。

7.4.2.2. xine图像播放器

xine 视频播放器是一个关注范围很广的项目, 它不仅看准多合一的视频解决, 而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。 发行有 和port版本-- multimedia/xine

xine 播放器仍然很粗糙, 但这很显然与好开头无关。实际上 xine 要求你有快速的 CPU 和快速的显卡来运行,或者需要支持 XVideo 扩展。 图形界面(GUI)可以使用,但很勉强。

默认情况下,xine启动图形用户界面。然后,可以使用这些菜单打开特定文件。

或者,可以通过指定要播放的文件的名称从命令行调用xine

% xine -g -p mymovie.avi

有关详细信息和故障排除提示, 请参阅 xine-project.org/faq

7.4.2.3. Transcode工具

Transcode提供了一套用于重新编码视频和音频文件的工具。Transcode可用于使用带有 stdin/stdout 流接口的命令行工具合并视频文件或修复损坏的文件。

在 FreeBSD 中, 可以使用multimedia/transcode package或port安装Transcode。许多用户更喜欢编译port, 因为它提供了用于指定要编译的支持和编解码器的编译选项菜单。如果未选择某个选项, Transcode 将无法对该格式进行编码。使用箭头键和空格键选择所需的格式。完成后, 按 Enter 继续端口编译和安装。

此示例演示如何将 DivX 文件转换为 PAL MPEG-1 文件 (PAL VCD):

% transcode -i input.avi -V --export_prof vcd-pal -o output_vcd
% mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa

生成的 MPEG 文件 output_vcd.mpg 已准备好用 MPlayer 播放。该文件可以在 CD 媒体上刻录,以使用 multimedia/vcdimagersysutils/cdrdao等实用程序创建视频 CD

除了transcode的手册页外,有关更多信息和示例,请参阅transcoding.org/cgi-bin/transcode

7.5. 电视卡

Original contribution by Josef El-Rayes.
Enhanced and adapted by Marc Fonvieille.

电视卡(TV card)可以让您用电脑来看无线、有线电视节目。许多卡都是透过RCA或S-video输入端子来接收视讯,而且有些卡还可接收FM广播的功能。

FreeBSD可透过bktr(4)驱动程序,来支持PCI界面的电视卡,只要这些卡使用的是Brooktree Bt848/849/878/879或Conexant CN-878/Fusion 878a视讯撷取芯片。此外,要再确认哪些卡上所附的选台功能是否有支持,可以参考bktr(4)说明,以查看所支持的硬件清单。

7.5.1. 加载驱动程序

要用电视卡的话,就要加载bktr(4)驱动程序,这个可以透过在/boot/loader.conf档加上下面这一行就可以了:

bktr_load="YES"

或者可以将电视卡支持静态编译到自定义的核心当中,若要这么做则可在自定义核心配置文件加入以下行:

device	 bktr
device	iicbus
device	iicbb
device	smbus

之所以要加上这些额外的驱动程序,是因为卡的各组成部分都是透过I2C总线而相互连接的。接下来,请编译、安装新的核心。

要测试调谐器(Tuner)是否被正确的侦测,请先重新启动系统。电视卡应该会出现在开机信息档中,如同此示例:

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)系统侦测的参数或者自定义核心设定选项。例如要强制使用Philips SECAM调谐器则可加入下列行至自定义核心配置文件:

options OVERRIDE_TUNER=6

或使用sysctl(8)

# sysctl hw.bt848.tuner=6

请参考bktr(4)查看sysctl(8)可用的参数说明及核心选项。

7.5.2. 好用的应用程序

要使用您的电视卡,您需要安装下列应用程序之一:

  • multimedia/fxtv 提供 窗口电视(TV-in-a-window) 功能和图像/声音/图像采集功能。

  • multimedia/xawtv 也是一款电视应用程序,功能同 fxtv 一样。

  • audio/xmradio, 一款用于一些电视卡的调频电台调谐器的程序。

更多的程序在FreeBSD Ports Collection(Ports 集)里。

7.5.3. 故障排除

如果您的电视卡遇到了什么问题, 您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被bktr(4) 驱动程序支持,并且是不是使用了正确的配置选项。 想得到更多支持和关于您的电视卡的各种问题, 您可以接触和使用freebsd-multimedia 邮件列表的压缩包。

7.6. MythTV

MythTV是一个流行的开源个人视频录像机 ( PVR ) 应用程序。本节演示如何在 FreeBSD 上安装和设置MythTV。有关如何使用MythTV的更多信息, 请参阅 mythtv.org/wiki

MythTV 需要一个前端和一个后端。这些组件可以安装在同一系统上, 也可以安装在不同的计算机上。

前端可以安装在 FreeBSD 上, 使用multimedia/mythtv-frontend package或port。 Xorg 也必须按照第 5 章 X Window系统中的说明进行安装和配置。理想情况下, 该系统具有支持 X-Video 运动补偿 ( XvMC ) 的视频卡, 以及 Linux 红外遥控器 ( LIRC ) 兼容的遥控器。

要在 FreeBSD 上同时安装后端和前端, 请使用multimedia/mythtv package或port。 MySQL ™ 数据库服务器也是必需的, 应自动作为依赖项安装。或者, 该系统应具有调谐器卡和足够的存储空间来保存记录的数据。

7.6.1. 硬件

MythTV使用Video for Linux(V4L)访问视频输入设备,如编码器和调谐器。 在FreeBSD中,MythTV最适合使用 USB DVB-S/C/T 卡,因为 multimedia/webcamd package 或 port 可以提供 V4L 用户态应用程序。webcamd 支持的任何数字视频广播(DVB)卡都应该与 MythTV 一起使用。 可以在 wiki.freebsd.org/WebcamCompat 中找到已知工作卡的列表驱动程序也可用于 multimedia/pvr250multimedia/pvrxxx port 中的Hauppauge卡,但它们提供的非标准驱动程序接口不适用于大于0.23的MythTV版本。 由于许可限制,没有可用的 package,必须编译这两个 ports。

wiki.freebsd.org/HTPC页面包含所有可用 DVB 驱动程序的列表。

7.6.2. 设定MythTV后端

要使用Binary套件安装MythTV可:

# pkg install mythtv

或从Port套件集安装:

# cd /usr/ports/multimedia/mythtv
# make install

安装完成后, 设置MythTV 数据库:

# mysql -uroot -p < /usr/local/share/mythtv/database/mc.sql

然后,配置后端:

# mythtv-setup

最后,启动后端:

# sysrc mythbackend_enable=yes
# service mythbackend start

7.7. 图像扫描仪

Written by Marc Fonvieille.

在 FreeBSD 中, 访问扫描仪的能力, 是通过 SANE (Scanner Access Now Easy) API 提供的。 SANE 也会使用一些 FreeBSD 设备驱动来访问扫描仪硬件。

FreeBSD 支持 SCSI 和 USB 扫描仪。 在做任何配置之前请确保您的扫描仪被 SANE 支持。 SANE 有一个 支持的设备 列表, 可以为您提供有关扫描仪的支持情况和状态的信息。 在 FreeBSD 8.X 之前版本的系统中, uscanner(4) 手册页也提供了系统支持的 USB 扫描仪列表。

本章介绍如何确定 FreeBSD 是否检测到扫描仪。然后,它概述了如何在 FreeBSD 系统上配置和使用SANE

7.7.1. 检查扫描仪

默认的 GENERIC 内核包含了支持 USB 扫描仪需要的设备驱动。 如果您决定使用一个定制的内核, 确保下面在您的内核配置文件中存在下面这些行:

device usb
device uhci
device ohci
device ehci
device xhci

要确定是否检测到USB扫描仪,请将其插入并使用dmesg确定扫描仪是否显示在系统消息缓冲区中。如果是,它应显示类似于此消息:

ugen0.2: <EPSON> at usbus0

本例在 /dev/ugen0.2检测到EPSON Perfection® 1650 USB扫描仪。

如果扫描仪使用 SCSI 接口,则了解它将使用哪个 SCSI 控制器板非常重要。根据SCSI芯片组, 可能需要自定义内核配置文件。 GENIC 内核支持常见 SCSI 控制器。请参阅/usr/src/sys/conf/NOTES,以确定要添加到自定义内核配置文件中的正确行。除了 SCSI 适配器驱动程序外,自定义内核配置文件中还需要以下行:

device scbus
device pass

验证设备是否显示在系统消息缓冲区中:

pass2 at aic0 bus 0 target 2 lun 0
pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device
pass2: 3.300MB/s transfers

如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 camcontrol(8) 命令执行一次 SCSI 总线扫描:

# camcontrol rescan all
Re-scan of bus 0 was successful
Re-scan of bus 1 was successful
Re-scan of bus 2 was successful
Re-scan of bus 3 was successful

然后扫描仪就会出现在 SCSI 设备列表里:

# camcontrol devlist
<IBM DDRS-34560 S97B>              at scbus0 target 5 lun 0 (pass0,da0)
<IBM DDRS-34560 S97B>              at scbus0 target 6 lun 0 (pass1,da1)
<AGFA SNAPSCAN 600 1.10>           at scbus1 target 2 lun 0 (pass3)
<PHILIPS CDD3610 CD-R/RW 1.00>     at scbus2 target 0 lun 0 (pass2,cd0)

有关 SCSI 设备的更多细节, 可查看 scsi(4)camcontrol(8) 手册页。

7.7.2. SANE设定

The SANE system provides the access to the scanner via backends (graphics/sane-backends). Refer to http://www.sane-project.org/sane-supported-devices.html to determine which backend supports the scanner. A graphical scanning interface is provided by third party applications like Kooka (graphics/kooka) or XSane (graphics/xsane). SANE's backends are enough to test the scanner.

使用二进制安装包安装后端:

# pkg install sane-backends

或由 Port 套件集安装

# cd /usr/ports/graphics/sane-backends
# make install clean

要做的第一步就是安装 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 -L
device 'epson2:libusb:000:002' is a Epson GT-8200 flatbed scanner

In this second example, epson2 is the backend name and libusb:000:002 means /dev/ugen0.2 is the device node used by the scanner.

或者, 如果使用的是 第 7.7.1 节 “检查扫描仪” 中的 USB 扫描仪:

# 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).

If this happens, edit the backend configuration file in /usr/local/etc/sane.d/ and define the scanner device used. For example, if the undetected scanner model is an EPSON Perfection® 1650 and it uses the epson2 backend, edit /usr/local/etc/sane.d/epson2.conf. When editing, add a line specifying the interface and the device node used. In this case, add the following line:

usb /dev/ugen0.2

保存编辑并验证扫描仪是否标识了正确的后端名称和设备节点:

# scanimage -L
device 'epson2:libusb:000:002' is a Epson GT-8200 flatbed scanner

一旦 scanimage -L 命令可以看到扫描仪, 配置就完成了。设备现在准备好等待扫描了。

While scanimage can be used to perform an image acquisition from the command line, it is often preferable to use a graphical interface to perform image scanning. Applications like Kooka or XSane are popular scanning frontends. They offer advanced features such as various scanning modes, color correction, and batch scans. XSane is also usable as a GIMP plugin.

7.7.3. 扫描仪权限

前面所有的操作都是用 root 权限来完成的。 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/ugen0.2 实际上只是到实际设备节点 /dev/usb/0.2.0 的符号连接 (可以通过查看 /dev 目录的内容来确认这一点)。 设备节点本身和这个符号连接分别属于 wheeloperator 组。 将用户 joe 添加到 这些组中, 就可以允许他使用扫描仪了, 不过, 出于显而易见的安全方面的原因, 在将用户加到特定的用户组, 特别是 wheel 组时, 无疑需三思而后行。 更好的解决方法是创建一个专门用于访问 USB 设备的组, 并让这个组的成员能够访问 USB 设备。

本例创建了一个名为usb的用户组:

# pw groupadd usb

接下来, 令 /dev/ugen0.2 符号连接和 /dev/usb/0.2.0 设备节点能够以 usb 组的身份来访问, 具体而言是配置正确的写权限 (06600664), 因为默认情况下只有属主 (root) 才能写这些设备。 这些配置是通过在 /etc/devfs.rules 文件中添加如下的设置来实现的:

[system=5]
add path ugen0.2 mode 0660 group usb
add path usb/0.2.0 mode 0666 group usb

注意:

设备节点会随着设备的增加或删除而发生变化,因此,人们可能希望使用这个规则集来代替对所有USB设备的访问:

[system=5]
add path 'ugen*' mode 0660 group usb
add path 'usb/*' mode 0666 group usb

请参见 devfs.rules(5) 以了解关于配置 devfs 文件系统的进一步信息。

另外, 您还需要在 /etc/rc.conf 文件中, 启用 devfs.rules(5) 规则集:

devfs_system_ruleset="system"

然后重启 devfs(8) 系统:

# service devfs restart

最后将用户添加到usb用户组,这样用户就能使用扫描仪了:

# pw groupmod usb -m joe

更多信息请参考pw(8)

第 8 章 配置 FreeBSD 内核

8.1. 简介

内核(Kernel)是FreeBSD操作系统最重要的部份之一。它负责內存管理、安全控管、网络、硬盘存取等等。尽管目前FreeBSD大多可以用动态设定,但有时仍需要设定并编译自定义的核心。

读完本章节,你将会知道:

  • 何时需要编译自定义核心。

  • 如何取得硬件信息。

  • 如何量身订做核心配置文件。

  • 如何使用核心配置文件来建立并编译新的核心。

  • 如何安装新的核心。

  • 发生错误时如何排除问题。

所有在本章所列出的指令均应以root来执行。

8.2. 为何要编译自定义的核心?

早期的FreeBSD的核心(Kernel)被戏称为“巨石”。因为当时的核心是一个非常大的程序,且只支持固定的硬件装置,如果您想改变核心的设定,就必须编译一个新核心并重启,才能使用。

现今,大多数在FreeBSD核心的功能已采用模块(Module)的方式包装,并可依需求动态从核心加载或卸载。这使得执行中的核心能够快速调节新硬件环境并在核心开启新的功能,这就是所谓模块化核心(Modular Kernel)。

尽管如此,还是有一些功能因使用到静态的核心设定须要编译,因为这些功能与核心紧密结合,无法将做成可动态加载的模块。且部份强调安全性的环境会尽量避免加载与卸载核心模块,且只要将需要的功能静态的编译到核心当中。

编译自定义的核心几乎是每位进阶的BSD使用者所必须经历的过程。尽管这项工作可能比较耗时,但在FreeBSD的使用上会有许多好处。跟必须支持大多数各式硬件的GENERIC核心相比的话,自定义的核心可以更『体贴』,只支持『自己硬件』的部分就好。自定义核心有许多项优点,如:

  • 加速开机,因为自定义的核心只需要侦测您系统上存在的硬件,所以让启动所花的过程更流畅快速。

  • 减少內存使用,自定义的核心通常会比GENERIC核心使用更少的內存,这很重要,因为核心必须一直存放在实体记忆体内,会让其他应用程序无法使用。因此,自定义核心对于记忆体较小的系统来说,发挥很大的作用。

  • 支持额外的硬件,自定义的核心可以增加一些GENERIC核心没有提供的硬件支持。

在编译自定义核心之前,请思考要这么做的原因,若是因为需要特定硬件的支持,很可能已有既有的模块可以使用。

核心模块会放在/boot/kernel并且可使用kldload(8)动态加载到执行中的核心。大部份的核心驱动程序都有可加载的模块与操作手册。例如ath(4)无线以太网络驱动程序在其操作手册有以下信息:

Alternatively, to load the driver as a module at boot time, place the
following line in loader.conf(5):

    if_ath_load="YES"

加入if_ath_load=“YES”/boot/loader.conf会于开机期间自动加载这个模块。

部份情况在/boot/kernel会没有相关的模块,这对于某些子系统大多是真的。

8.3. 侦测系统硬件

在编辑核心配置文件之前,建议先调查清楚机器各项硬件信息。在双操作系统的环境,也可透过其他操作系统来了解目前机器上的硬件信息。举例来说,Microsoft®的装置管理员(Device Manager)内会有目前已安装的硬件信息。

注意:

某些版本的Microsoft® Windows®会有系统(System)图标可用来进入装置管理员

若FreeBSD是唯一安装的操作系统,则可使用dmesg(8)来查看开时时系统侦测到的硬件信息。FreeBSD上大多硬件驱动程序都有操作手册会列出支持的硬件。例如,以下几行是说psm(4)驱动程序侦测到了一只鼠标:

psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: [ITHREAD]
psm0: model Generic PS/2 mouse, device ID 0

因为该硬件存在,此驱动程序便不应该从自定义核心配置文件中移除。

dmesg输出的结果未显示开机侦测硬件的部份,则可改阅读/var/run/dmesg.boot档案的内容。

另外,也可以透过pciconf(8)工具可用来查询硬件信息,该工具会列出更详细的硬件信息如:

% pciconf -lv
ath0@pci0:3:0:0:        class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
    vendor     = 'Atheros Communications Inc.'
    device     = 'AR5212 Atheros AR5212 802.11abg wireless'
    class      = network
    subclass   = ethernet

以上输出信息说明ath驱动程序已经找到一个无线以太网络装置。

man(1)指令加上-k旗标可提供有用的信息,例如,这可列出有包含指定装置品牌或名称的手册页面清单:

# man -k Atheros
ath(4)                   - Atheros IEEE 802.11 wireless network driver
ath_hal(4)               - Atheros Hardware Access Layer (HAL)

准备好硬件清单之后,参考该清单来确认已安装的硬件驱动程序在编辑自定义核心设定时没有被移除。

8.4. 配置文件

为了要建立自定义核心配置文件并编译自定义核心,必须先安装完整的FreeBSD源码树。

/usr/src/目录不存在或者是空的,代表尚未安装。源码可以使用Subversion并依据第 A.3 节 “使用Subversion中的操作说明来安装。

安装源代码后,请查看/usr/src/sys的内容。此目录包含许多子目录,包括那些表示以下受支持的体系结构的子目录:amd64, i386, powerpc, 和 sparc64。特定体系结构目录中的所有内容仅处理该体系结构,代码的其余部分是所有平台共有的独立于机器的代码。每个受支持的体系结构都有一个conf子目录,其中包含该体系结构的GENERIC内核配置文件。

请不要直接对GENERIC档案做编辑。复制该档案为另一个名称,并对复制出来的档案做编辑,习惯上文件名会全部使用大写字元。当维护多台安装不同的硬件的FreeBSD机器时,将文件名后方加上机器的主机名称(Host name)是个不错的方法。以下示例使用amd64构架的GENERIC配置文件建立了一个复本名称为MYKERNEL

# cd /usr/src/sys/amd64/conf
# cp GENERIC MYKERNEL

现在可以使用任何ASCII文字编辑器来自定义MYKERNEL。预设的编辑器为vi,在FreeBSD也内置一个易于初学者使用的编辑器叫做ee

核心配置文件的格式很简单,每一行会含有代表装置(Device)或子系统(Subsystem)的关键字、参数以及简短的说明。任何在#符号之后的文字会被当做注释并且略过。要移除核心对某个装置或子系统的支持,仅需要在代表该装置或子系统的行前加上#符号。请不要在您还不了解用途的行前加上或移除#符号。

警告:

移除对装置或选项的支持很容易会造成核心损坏。例如,若从核心配置文件ata(4)驱动程序,那么使用ATA磁盘驱动程序的系统便会无法开机。因此当您不确定时,请在核心保留该项目的支持。

除了在配置文件中提供的简短说明之外,尚有其他的说明在NOTES档案中,可在与该构架GENERIC相同的目录底下找到。要查看所有构架通用的选项,请参考/ usr/src/sys/conf/NOTES

提示:

当完成自定义的核心配置文件,请备份到/usr/src位置之外。

或者,将核心配置文件放在其他地方,然后建立一个符号连接(Symbolic link)至该档案:

# cd /usr/src/sys/amd64/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/MYKERNEL
# ln -s /root/kernels/MYKERNEL

配置文件中可以使用include指令(Directive)。该指令可以引用其他配置文件到目前的配置文件,这让只需根据现有档案设定做些微调整时更简单。若只有少量的额外选项或驱动程序需要设定,该指令可引用GENERIC并设定额外增加的选项,如示例所示:

include GENERIC
ident MYKERNEL

options         IPFIREWALL
options         DUMMYNET
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPDIVERT

使用此方法,配置文件只含有与GENERIC核心不同的部份。当升级有新功能加入GENERIC时,也可一并引用,除非特别使用nooptionsnodevice选项来排除设定。更详细的配置文件指令及其说明可在config(5)找到。

注意:

要产生含有所有可用选项的配置文件,可以root执行以下指令:

# cd /usr/src/sys/arch/conf && make LINT

8.5. 编译与安装自定义核心

完成自定义配置文件的编辑并储存之后,便可依据以下步骤编译核心的源码:

过程 8.1. 编译内核
  1. 切换至此目录:

    # cd /usr/src
  2. 指定自定义核心配置文件的名称来编译新的核心:

    # make buildkernel KERNCONF=MYKERNEL
  3. 安装使用指定核心配置文件所编译的新核心。此指令将会复制新核心到/boot/kernel/kernel并将旧核心备份到/boot/kernel.old/kernel

    # make installkernel KERNCONF=MYKERNEL
  4. 关机并重启加载新的核心,若发生错误请参考无法使用核心开机

预设在自定义核心编译完成后,所有核心模块也同被重新编译。要快速更新核心或只编译自定义的模块,需在开始编译之前先编辑/etc/make.conf

例如,使用以下变数可指定要编译的模块清单来替代预设编译所有模块的设定:

MODULES_OVERRIDE = linux acpi

或者,可使用以下变数来从编译程序中排除要编译的模块:

WITHOUT_MODULES = linux acpi sound

尚有其他可用的变数,请参考make.conf(5)取得详细信息。

8.6. 如果发生错误

当编译自定义核心时可能发生以下四种类型的问题:

config失败

config失败,会列出不正确的行号。使用以下信息为例子,需要与GENERICNOTES比对来确认第17行输入的内容正确:

config: line 17: syntax error
make失败

make失败,通常是因为核心配置文件未提供足够的信息让config找到问题。请仔细检查配置文件,若仍不清楚问题,请寄发电子邮件给FreeBSD general questions mailing list并附上核心配置文件。

无法使用核心开机

若新核心无法开机或无法辨识装置并不要恐慌!幸好,FreeBSD有良好的机制可以从不兼容的核心复原。只需要在FreeBSD开机加载程序(Boot loader)选择要用来开机的核心便可,当系统开机菜单出现时选择Escape to a loader prompt选项,并在指令提示后输入boot kernel.old或替换为任何其他已经知道可以正常开机的核心名称。

使用好的核心开机之后,检查配置文件并尝试再编译一次。/var/log/messages是有用的资源,它在每次成功开机时会记录核心信息。同样的,dmesg(8)也会印出自本次开机后的核心信息。

注意:

在排除核心问题时,请确定留有GENERIC的复本,或者其他已知可以运作的核心,并使用不同的名称来确保下次编译时不会被删除,这很重要,因此每当新的核心被安装之后,kernel.old都会被最后安装的核心复写,有可能会无法开机。尽快,透过重新命名将可运作的核心目录移动到目前运作的核心目录:

# mv /boot/kernel /boot/kernel.bad
# mv /boot/kernel.good /boot/kernel
核心可运作,但ps(1)无法运作

若核心版本与系统工具所编译的版本不同,例如,有一个核心使用-CURRENT的源码编译并安装在-RELEASE的系统上,许多系统状态指令如ps(1)vmstat(8)将会无法运作。要修正此问题,请使用与核心相同版本的源码树(Source tree)重新编译并安装World。使用与操作系统其他部份版本不同的核心永远不会是个好主意。

第 9 章 打印

Originally contributed by Warren Block.

尽管很多人试图淘汰打印功能,但打印信息到纸上仍是一个重要的功能。打印由两个基本元件组成,包含了数据传送到打印机的方式以及打印机可以理解的数据形式。

9.1. 快速开始

基本的打印功能可以快速设定完成,列印机必须能够打印纯ASCII文字。若要打印其他类型的档案,请参考第 9.5.3 节 “过滤器”

  1. 建立一个目录来储存要被打印的档案:

    # mkdir -p /var/spool/lpd/lp
    # chown daemon:daemon /var/spool/lpd/lp
    # chmod 770 /var/spool/lpd/lp
  2. root建立/etc/printcap内容如下:

    lp:\
    	:lp=/dev/unlpt0:\  1
    	:sh:\
    	:mx#0:\
    	:sd=/var/spool/lpd/lp:\
    	:lf=/var/log/lpd-errs:

    1

    此行是针对连接到USB端口的打印机。

    连接到并列或印表器(Printer)端口的打印机要使用:

    :lp=/dev/lpt0:\

    直接连接到网络的打印机要使用:

    :lp=:rm=network-printer-name:rp=raw:\

    替换network-printer-name为网络打印机的DNS主机名称。

  3. 编辑/etc/rc.conf加入下行来开启lpd

    lpd_enable="YES"

    启动服务:

    # service lpd start
    Starting lpd.
  4. 测试打印:

    # printf "1. This printer can print.\n2. This is the second line.\n" | lpr

    提示:

    若列印的两行未从左边界开始,而是呈现阶梯状(Stairstep),请参考第 9.5.3.1 节 “避免在纯文字打印机阶梯状打印”

    现在可以使用lpr来打印文字档,只要在指令列给序档案名称,或者将输出使用管线符号(Pipe)传送给lpr

    % lpr textfile.txt
    % ls -lh | lpr

9.2. 打印机联机

打印机有许多方式可以连接到电脑,小型的桌面印表机会直接连接到电脑的USB端口,旧式的印表机会连接到并列(Parallel)或打印机(Printer)端口,而有一部份打印机则是直接连接网络,让打印机能够给多台电脑共享使用,还有少部分打印机则是连接到较罕见的序列(Serial)端口。

FreeBSD可以与这些类型的打印机沟通。

USB

USB打印机可以连接到电脑上任何可用的USB端口。

当FreeBSD侦测到USB打印机,会建立两个装置项目:/dev/ulpt0以及/dev/unlpt0,传送到两者任一装置的数据都会被转发到打印机。在每个打印工作完成后ulpt0便会重设USB端口,重设USB端口可能会在部份打印机造成问题,因此通常可以改使用unlpt0装置。unlpt0不会重设USB端口。

并列(IEEE-1284)

并列端口装置使用/dev/lpt0,此装置不论打印机是否连接上都会存在,它并不会自动侦测。

供应商已不再采用这种旧式连接埠,且有许多电脑甚至已没有这种连接埠。可以用转接器来连接并列打印机到USB端口,有了转接器,并列打印机可以被当作USB打印机使用。有另一种称作打印服务器(Printserver)的装置也可用来连接并列打印机到网络。

序列(RS-232)

序列端口也是另一种旧式连接埠,已很少用在打印机上,除了某些特殊的应用外,缆线、接头与需要的布线方式依需求变化性很大。

内置在主板的序列端口的序列装置名称为/dev/cuau0/dev/cuau1。也有序列USB转接器可使用,而装置的的名称则会是/dev/cuaU0

要与序列打印机通信必须知道数个通信参数,其中最重要的是传输速率(Baud rate)BPS(Bits Per Second)以及同位检查(Parity)。数值有数种,但一般序列印表机会使用的传输速率是9600且无同位检查。

网络

网络打印机可直接连接到区域网路。

若打印机透过DHCP分配动态位址,则必须要知道DNS主机名称,DNS应动态更新来让主机名称能够对应到正确的 IP 位址。指定网络打印机一个静态的 IP 位址可避免这个问题。

大多数网络打印机可以认得使用LPD通信协定所送出的打印工作,打印队列(Print queue)的名称也会在这时指定。部份印表机会依据使用的队列来决定处理数据的方式,例如raw队列会打印原始数据,而text队列则会在纯文字上增加换行符号(Carriage return)。

大部份网络打印机也可打印直接传送到端口号9100的数据。

9.2.1. 简介

有线网路连线通常是安装最简单的方式,且可以提供快速的打印。若要直接连接到电脑,较建议使用USB,由于较快速、简单。并列联机仍然可以使用,但有缆线长度与速度上的限制。而序列联机则比较难设定,不同型号的缆线布线方式不同,且通信参数如传输速率及同位检查增加了复杂性,所幸序列打印机并不多。

9.3. 常见的页面描述语言

传送给打印机的数据必须使用打印机能够理解的语言,这些语言称为页面描述语言(Page Description Languages)或PDL

ASCII

ASCII文字是传送数据到打印机最简单的方式,一个字元对应一个要打印的文字:数据中的A会打印一个A在页面。可以使用的格式非常少,没有办法选择字体或者比例间距。强迫使用简单的纯ASCII为的是让文字可以直接从电脑打印只需一点或甚至不需要编码或转译,打印的结果可直接对应传送的内容。

部份便宜打印机无法打印纯ASCII文字,这让这些打印机较难设定。

PostScript®

PostScript®与ASCII几乎相反,与简单的文字不同,PostScript®程序语言有一套指令可以绘出最终所要的文件,可以使用不同的字体与图形,但是,这样强大的功能是有代价的,绘制页面需要搛写程序语言,通常这个程序语言会由应用程序产生,所以使用者是看不到的。

便宜的打印机有时会移除PostScript®的兼容性来节省成本。

PCL(打印语言)

PCLASCII延伸而来,加入了跳脱序列(Escape sequence)来标示格式、选择字体以及打印图型。大部份打印机都支持PCL5,少数支持较新的PCL6PCLXL,这些后来的版本是PCL5的超集合(Superset),并可以提供更快的打印速度。

以主机为基础(Host-Based)

制造商可能会使用简单的处理器和较小的內存来降低打印机的成本,这些打印机无法打印纯文字,相反的,文字与图形会先在机器上的驱动程序画完后传送到打印机。这些称为以主机为基础(Host-based)的打印机。

驱动程序与以主机为基础的打印机通信通常会透过专用或无文件的通信协定,这让这些打印机只能在最常用的操作系统上运作。

9.3.1. 转换PostScript®至其他PDL

Port套件集与FreeBSD工具集有许多可以处理PostScript®输出的应用程序,此表整理出了可转换PostScript®成其他常用PDL的工具:

表 9.1. 输出PDL格式
输出PDL产生由说明
PCLPCL5print/ghostscript9-base单色使用-sDEVICE=ljet4、彩色使用-sDEVICE=cljet5
PCLXLPCL6print/ghostscript9-base单色使用-sDEVICE=pxlmono、彩色使用-sDEVICE=pxlcolor
ESC/P2print/ghostscript9-base-sDEVICE=uniprint
XQXprint/foo2zjs 

9.3.2. 简介

为简化打印过程,请选择支持PostScript®的打印机。其次是支持PCL的打印机。通过使用print/ghostscript9-base,这些打印机可以直接打印PostScript®文件。支持PostScript®或PCL的打印机几乎总是支持直接打印纯ASCII文本文件。

行式打印机,如典型的喷墨打印机通常不支持PostScript®或PCL。他们通常可以打印纯ASCII文本文件。print/ghostscript9-base支持其中一些打印机使用的PDL。但是,由于这些打印机上打印整个图形页面通常非常缓慢,因为要传输和打印了大量数据。

以主机为基础的打印机通常较难设定,有些会因为用了专用的PDL而无法使用,尽可能避免使用这类的打印机。

有关各种PDL的介绍可至http://www.undocprint.org/formats/page_description_languages。各种型号打印机所使用的特定PDL可至http:// www.openprinting.org/printers查询。

9.4. 直接打印

对于偶尔打印,档案可以直接传送到打印机装置,无需做任何设定。例如,要传送一个名称为sample.txt的档案到USB打印机:

# cp sample.txt /dev/unlpt0

要直接使用网络打印机打印需看该打印机支持的功能,但大多数会接受端口号9100的打印作业,可使用nc(1)来完成。要使用DNS主机名称为netlaser的打印机打印与上述相同的档案可:

# nc netlaser 9100 < sample.txt

9.5. LPD(行列式打印机Daemon)

在背景打印一个档案称作Spooling,缓冲程序(Spooler)让使用者能够继续执行电脑的其他程序而不需要等候打印机缓慢的完成打印工作。

FreeBSD内含的缓冲程序(Spooler)称作lpd(8),而打印工作会使用lpr(1)来提交。

9.5.1. 初始设定

建立要用来储存打印工作的目录、设定拥有关系以及权限来避免其他使用者可以检视这些档案的内容:

# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp

印表机会定义在/etc/printcap,每台打印机项目所包含的详细数据有名称、连接的接头以及各种其他设定。建立/etc/printcap使用以下内容:

lp:\				1
	:lp=/dev/unlpt0:\	2
	:sh:\			3
	:mx#0:\			4
	:sd=/var/spool/lpd/lp:\	5
	:lf=/var/log/lpd-errs:	6

1

打印机的名称。lpr(1)会传送打印工作到lp打印机,除非有使用-P来指定其他打印机,所以预的打印机名称应使用lp

2

打印机所连接到装置。替换此行为正确的联机类型,如此处所示。

联机类型/etc/printcap的装置项目
USB
:lp=/dev/unlpt0:\

此为不会重设 USB打印机的装置,若使用上发生问题,请改使用ulpt0,这个装置会在每次使用后重设USB端口。

并列
:lp=/dev/lpt0:\
网络

针对支持LPD通信协定的打印机:

:lp=:rm=network-printer-name:rp=raw:\

针对支持使用端口号9100打印的打印机:

:lp=9100@network-printer-name:\

针对两者皆支持的打印机,请替换network-printer-name为网络打印机的DNS主机名称。

序列
:lp=/dev/cuau0:br=9600:pa=none:\

这些是一般序列打印机连接到主板序列端口会采用的数值,传输速率(Baud rate)是9600且无同位检查(No Parity)。

3

在打印工作开始时不打印首页。

4

不限制打印工作的最大尺寸。

5

此打印机的缓冲(Spooling)目录路径,每台印表机会自己使用一个独立的缓冲(Spooling)目录。

6

回报此打印机的错误的日志档。

在建立/etc/printcap之后,使用chkprintcap(8)测试打印机是否有错误:

# chkprintcap

在继续之前修正任何回报的问题。

开启/etc/rc.conf中的lpd(8)

lpd_enable="YES"

启动服务:

# service lpd start

9.5.2. 使用lpr(1)打印

文档将用 lpr 发送到打印机。要打印的文件可以在命令行上命名,也可以通过管道到lpr中。这两个命令是等效的, 将 doc.txt 的内容发送到默认打印机:

% lpr doc.txt
% cat doc.txt | lpr

可以使用-P选项选择打印机。使用名为laser的打印机打印:

% lpr -Plaser doc.txt

9.5.3. 过滤器

到目前为止显示的示例已将文本文件的内容直接发送到打印机。只要打印机理解这些文件的内容,输出就会被正确打印。

有些打印机无法打印纯文本,输入文件甚至可能不是纯文本。

过滤器允许翻译或处理文件。典型的用法是将一种输入(如纯文本)转换为打印机可以理解的格式,如PostScript® 或 PCL。过滤器还可以用于提供其他功能,例如添加页码或突出显示源代码,以使其更易于阅读。

这里讨论的过滤器是输入过滤器文本过滤器。这些筛选器将传入文件转换为不同的格式。在创建文件之前,使用 su 获得 root 权限。

过滤器在 /etc/printcap 中使用 if= 标识符指定。要使用 /usr/local/libexec/lf2crlf 作为过滤器,请像这样修改/etc/printcap

lp:\
	:lp=/dev/unlpt0:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/lp:\
	:if=/usr/local/libexec/lf2crlf:\   1
	:lf=/var/log/lpd-errs:

1

if= 标识将在传入文本上使用的 input filter

提示:

printcap项中行尾的反斜杠行连续字符表明,打印机项实际上只是一个长行,其中的项由冒号字符分隔。前面的示例可以重写为单个可读性较差的行:

lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:

9.5.3.1. 避免在纯文字打印机阶梯状打印

典型的 FreeBSD 文本文件在每行末尾只包含一个换行符。标准打印机上将结束此行:

A printed file looks
                    like the steps of a staircase
                                                 scattered by the wind

过滤器可以将换行符转换为回车和换行符。回车使打印机在每行之后回到左边。用下列内容创建/usr/local/libexec/lf2crlf

#!/bin/sh
CR=$'\r'
/usr/bin/sed -e "s/$/${CR}/g"

设置可执行权限权限:

# chmod 555 /usr/local/libexec/lf2crlf

修改/etc/printcap以使用新的过滤器:

:if=/usr/local/libexec/lf2crlf:\

通过打印相同的纯文本文件来测试筛选器。回车将使每一行从页面的左侧开始。

9.5.3.2. 使用print/enscriptPostScript®打印机美化纯文字内容

GNU Enscript将纯文本文件转换为格式精美的PostScript®,以便在PostScript®打印机上打印。它添加页码,换行,并提供许多其他功能,使打印的文本文件更易于阅读。根据本地纸张大小,安装 Port 中的print/enscript-letterprint/enscript-a4

使用下列内容创建/usr/local/libexec/enscript

#!/bin/sh
/usr/local/bin/enscript -o -

设置可执行权限权限:

# chmod 555 /usr/local/libexec/enscript

修改/etc/printcap以使用新的过滤器:

:if=/usr/local/libexec/enscript:\

通过打印纯文本文件来测试过滤器。

9.5.3.3. 打印PostScript®到PCL打印机

有许多程序用于生成PostScript®文档。但便宜的打印机只认纯文本或PCL。在其被送到打印机之前这个过滤器将PostScript®转换为PCL

从 Port 安装 Ghostscript PostScript®解释器。

使用这些内容创建/usr/local/libexec/ps2pcl

#!/bin/sh
/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -

设置可执行权限权限:

# chmod 555 /usr/local/libexec/ps2pcl

在被发送到打印机之前,这个脚本将PostScript®转换为PCL

修改/etc/printcap来启用新的输入过滤器:

:if=/usr/local/libexec/ps2pcl:\

发送PostScript®程序到过滤器,用于测试:

% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
72 432 moveto (PostScript printing successful.) show showpage \004" | lpr

9.5.3.4. 智能过滤器

一个能检测输入类型并自动将其转换为打印机能识别的格式的过滤器能缩短打印流程。PostScript®文件的开头两个字符一般是%!。筛选器可以检测到这两个字符。 PostScript®文件可以原样发送到PostScript®打印机。可以使用Enscript将文本文件转换成PostScript®文件,使用以下内容创建/usr/local/libexec/psif

#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

case "$first_two_chars" in
%!)
    # %! : PostScript job, print it.
    echo "$first_line" && cat && exit 0
    exit 2
    ;;
*)
    # otherwise, format with enscript
    ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
    exit 2
    ;;
esac

设置可执行权限权限:

# chmod 555 /usr/local/libexec/psif

修改/etc/printcap来启用新的输入过滤器:

:if=/usr/local/libexec/psif:\

使用PostScript®和纯文本文件测试过滤器。

9.5.3.5. 其他智能过滤器

编写一个过滤器来检测许多不同类型的输入并正确设置它们的格式是很有挑战性的。Port 中的print/apsfilter是一个智能过滤器,它可以检测多种文件类型并将其自动转换为打印机可以理解的PDL。更多信息请参阅http://www.apsfilter.org

9.5.4. 多序列

/etc/printcap中的条目实际上是queues的定义。单个打印机可以有多个队列。当与筛选器结合使用时,多个队列使用户能够更好地控制其作业的打印方式。

例如,考虑在办公室中使用联网的PostScript®激光打印机。 大多数用户希望打印纯文本,但一些高级用户希望能够直接打印PostScript®文件。可在/etc/printcap中为同一打印机创建两个条目:

textprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/textprinter:\
	:if=/usr/local/libexec/enscript:\
	:lf=/var/log/lpd-errs:

psprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/psprinter:\
	:lf=/var/log/lpd-errs:

发送到textprinter的文档将使用/usr/local/libexec/enscript格式化,就像之前展示的那样。高级用户可以使用psprinter打印PostScript®文件,这将不适用过滤器。

这种多队列技术可用于提供对各种打印机功能的直接访问。带有双面打印器的打印机可以使用两个队列,一个用于普通单面打印,另一个带有一个筛选器,该筛选器发送命令序列以启用双面打印,然后发送传入文件。

9.5.5. 监视与控制打印

有几个程序可用于监视打印作业以及检查和控制打印机操作。

9.5.5.1. lpq(1)

lpq(1) 它显示用户打印作业的状态。不会显示来自其他用户的打印作业。

在单个打印机上显示当前用户的待处理作业:

% lpq -Plp
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     0    (standard input)                      12792 bytes

在所有打印机上显示当前用户的待处理作业:

% lpq -a
lp:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     1    (standard input)                      27320 bytes

laser:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     287  (standard input)                      22443 bytes

9.5.5.2. lprm(1)

lprm(1)用于删除打印作业。普通用户只能删除自己的作业。root 可删除任意作业。

从打印机中删除所有未解决的作业:

# lprm -Plp -
dfA002smithy dequeued
cfA002smithy dequeued
dfA003smithy dequeued
cfA003smithy dequeued
dfA004smithy dequeued
cfA004smithy dequeued

从打印机中删除单个作业。lpq(1)用于找出作业编号。

% lpq
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     5    (standard input)                      12188 bytes
% lprm -Plp 5
dfA005smithy dequeued
cfA005smithy dequeued

9.5.5.3. lpc(8)

lpc(8)用于查看和修改打印机状态。lpc 之后是命令和可选的打印机名称。可以使用all代替特定的打印机名称,并且该命令将应用于所有打印机。普通用户可使用 lpc(8)查看打印机状态. 只有root可使用该命令修改打印机状态。

显示所有打印机的状态:

% lpc status all
lp:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	printer idle
laser:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	waiting for laser to come up

防止打印机接受新作业, 然后再次开始接受新作业:

# lpc disable lp
lp:
	queuing disabled
# lpc enable lp
lp:
	queuing enabled

停止打印, 但继续接受新作业。然后重新开始打印:

# lpc stop lp
lp:
	printing disabled
# lpc start lp
lp:
	printing enabled
	daemon started

在出现某些错误情况后重新启动打印机:

# lpc restart lp
lp:
	no daemon to abort
	printing enabled
	daemon restarted

关闭打印队列并禁用打印,并向用户返回错误信息:

# lpc down lp Repair parts will arrive on Monday
lp:
	printer and queuing disabled
	status message is now: Repair parts will arrive on Monday

重新启用已关闭的打印机:

# lpc up lp
lp:
	printing enabled
	daemon started

更多信息请参阅lpc(8)

9.5.6. 分享打印机

在企业和学校,打印机通常由多个用户共享。有些功能使共享打印机更加方便。

9.5.6.1. 别名

打印机名称在/etc/printcap第一行设置。其他别名可以添加在那个名字之后。别名通过竖线与名称分开:

lp|repairsprinter|salesprinter:\

可以使用别名代替打印机名称。例如,销售部门的用户使用

% lpr -Psalesprinter sales-report.txt

维修部门的用户使用

% lpr -Prepairsprinter repairs-report.txt

所有的文件都在那台打印机上打印。当销售部门增长到需要自己的打印机时,可以从共享打印机条目中删除别名,并将其用作新打印机的名称。两个部门的用户继续使用相同的命令,但销售文档将发送到新打印机。

9.5.6.2. 标题页

用户很难在繁忙的共享打印机生成的页面堆栈中找到他们的文档。标题页(Header Page)用于解决此问题。在每个打印作业之前都会打印带有用户名和文档名的标题页。这些页面有时也被称为banner page 或 separator page。

启用Header Pages的方式不同,具体取决于打印机是通过USB、并行或串行电缆直接连接到计算机,还是通过网络远程连接。

直接连接打印机上的页眉页是通过从/etc/printcap中的条目中删除:sh:\(Suppress Header)行来启用的这些标题页仅将换行符用于新行。一些打印机需要/usr/share/examples/printing/hpif过滤器以防止阶梯式文本(stairstepped text)。过滤器将PCL打印机配置为在接收到换行符时同时打印回车和换行符。

必须在打印机本身上配置网络打印机的页眉。忽略/etc/printcap中的标题页条目。通常可以从打印机前面板或可通过Web浏览器访问的配置网页上进行设置。

9.5.7. 参考文献

示例文件: /usr/share/examples/printing/

The 4.3BSD Line Printer Spooler Manual, /usr/share/doc/smm/07.lpd/paper.ascii.gz.

手册页:printcap(5), lpd(8), lpr(1), lpc(8), lprm(1), lpq(1)

9.6. 其他打印系统

除了内置的lpd(8)之外,FreeBSD 还提供了其他几个打印系统。这些系统为其他协议或附加功能提供支持。

9.6.1. CUPS (Common UNIX® Printing System)

CUPS 是一种流行的打印系统, 可在许多操作系统上使用。../../../../doc/en_US.ISO8859-1/articles/cups介绍了如何在FreeBSD上使用 CUPS

9.6.2. HPLIP

惠普提供了一个支持许多喷墨打印机和激光打印机的打印系统。Port 位于print/hplip。主网站位于http://hplipopensource.com/hplip-web/index.html,配置教程在http://hplipopensource.com/hplip-web/install/manual/hp_setup.html

9.6.3. LPRng

LPRnglpd(8)的替代品。Port 位于sysutils/LPRng,更多详情请访问http://www.lprng.com/

第 10 章 Linux® 二进制兼容模式

Restructured and parts updated by Jim Mock.
Originally contributed by Brian N. HandyRich Murphey.

10.1. 简介

FreeBSD 提供了与 Linux® 二进制兼容, 允许用户在 FreeBSD 系统上安装和运行大多数的Linux® 二进制程序而无需做任何修改。 据说在某些情况下, FreeBSD 上运行的Linux® 二进制程序能有更好的表现。

然而, 仍然有一些 Linux® 操作系统特有的功能在 FreeBSD 上并不被支持。 例如, 要是 Linux® 程序过度地使用了诸如启用虚拟 8086 模式 i386™ 特有的调用, 则无法在 FreeBSD 上运行。

注意:

FreeBSD 10.3增加了对64位的Linux®二进制支持.

读完本章节,你将会知道:

  • 如何在 FreeBSD 系统中启用 Linux® 二进制兼容模式。

  • 如何安装额外的 Linux® 共享库。

  • 如何在 FreeBSD 上安装 Linux® 应用程序。

  • FreeBSD 的Linux®兼容层实现细节。

在阅读这个章节之前,您应当:

10.2. 配置 Linux® 二进制兼容模式

默认情况下, Linux® 库并没有被安装而且 Linux® 二进制兼容模式也没有被启动。 Linux® 库可以通过手动安装或者使用 FreeBSD 的 Ports Collection。

在构建 port 之前需加载Linux®模块,否则会构建失败:

# kldload linux

开启 64 位兼容层:

# kldload linux64

检查模块是否被正确加载:

% kldstat
      Id Refs Address    Size     Name
      1    2 0xc0100000 16bdb8   kernel
      7    1 0xc24db000 d000     linux.ko

从 port 或从 pkg 安装emulators/linux_base-c7是在FreeBSD系统上构建Linux®基础软件和库最简单的办法。从 port 安装:

# pkg install emulators/linux_base-c7

欲在启动时启动Linux® 兼容层,将此行添加到/etc/rc.conf

linux_enable="YES"

在 64 位机器上/etc/rc.d/abi会自动加载 64 位兼容层。

由于Linux®二进制兼容层已经获得了运行32位和64位Linux®二进制文件(在64位x86主机上)的支持,因此无法将仿真功能静态链接到自定义内核中。

10.2.1. 手动安装额外的库

在配置了 Linux® 兼容模式之后, 如果某个 Linux® 应用程序依然提示找不到共享库, 需先找出此 Linux® 二进制程序需要的共享库再手动安装。

Linux® 系统上使用 ldd 找出应用程序所需的共享库文件。 比如, 在安装有 DoomLinux® 系统上运行如下的命令列出 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

然后把上面输出中最后一列中的所有文件从 Linux® 系统复制到 FreeBSD 上的 /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® 共享库文件, 则不再需要复制最后那列文件, 现有的共享库应该可以正常使用。 如果是更新版本的共享库通常建议复制。 只要有符号链接指向新的版本, 那么就可以删除旧版的了。

比如, FreeBSD 系统中现有这些共享库文件:

/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

由于现有的库在最后一个数字中只有一个或两个版本过时,因此程序仍然需要使用稍旧的版本。但是,用更新的版本替换现有libc.so是安全的:

/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

通常最初几次在 FreeBSD 上安装 Linux® 程序时需要寻找 Linux® 二进制程序所依赖的共享库文件。在此之后,系统里便会有足够多的 Linux® 共享库文件来运行新安装的 Linux® 二进制程序而无需额外操作。

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. 安装基于 Linux® RPM 的应用程序

安装基于 Linux® RPM 的应用程序, 首先需要安装 archivers/rpm 包或者 port。 安装好之后 root 用户就能使用此命令安装 .rpm 了:

# cd /compat/linux
# rpm2cpio < /path/to/linux.archive.rpm | cpio -id

如有必要的话使用 brandelf 标记安装好的 ELF 二进制程序。 注意此项安装将无法干净卸载。

10.2.4. 配置主机名解析器

如果 DNS 不能正常工作或是出现以下的错误信息:

resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword

请参照此方法配置 /compat/linux/etc/host.conf

order hosts, bind
multi on

这里指定了先查询 /etc/hosts 再查询 DNS。 如果 /compat/linux/etc/host.conf 不存在的话, Linux® 程序便会读取 /etc/host.conf 并提示与 FreeBSD 的语法不兼容。 如果没有在 /etc/resolv.conf 文件中配置域名服务器, 可以删除 bind

10.3. 高级主题

此章节将讲述是 Linux® 二进制兼容如何工作的, 内容基于 Terry Lambert (Message ID: <199906020108.SAA07001@usr09.primenet.com>) 发表在 FreeBSD 闲聊邮件列表 的邮件。

FreeBSD 有一个叫 execution class loader 的抽象层。 它被嵌入进了 execve(2) 系统调用。

历史上 UNIX® 加载器会依靠查看魔数 (通常是文件的开头 4 至 8 个字节)来确认是否是系统已知的的二进制程序, 如果是的话, 就会调用二进制程序加载器。

如果它不是二进制类型的程序, execve(2) 调用会返回一个错误, shell 则会把它当作 shell 命令执行。 不论当前是哪一种 shell 都会默认做出此种假设。

随后, sh(1) 会检查开头的两个字符, 如果它们是 :\n, 那么就调用 csh(1)

FreeBSD 有一份加载器列表而不是一个单一的加载器, 并能回退到 #! 加载器来运行 shell 解释器或者 shell 脚本。

为了支持 Linux® ABI, FreeBSD 看到了二进制 ELF 程序的魔数。 ELF 加载器会查找一个专用的 标记, 那是在 ELF 镜像中的一个注释部分, 此区域在 SVR4/Solaris™ ELF 二进制中并不存在。

要运行 Linux® 二进制程序, 必须先使用 brandelf(1) 命令 标记Linux 类型:

# brandelf -t Linux file

当 ELF 加载器看到了 Linux 标记,便会替换 proc 结构中的一个指针。 所有的系统调用都通过此指针来索引。 除此以外, 进程被标记以便对 signal trampoline 代码的陷阱向量做特殊处理, 还有一些其他由 Linux® 内核模块来处理的(细微)修补。

Linux® 系统调用向量包含一个 sysent[] 记录的列表, 它的地址位于内核模块之中。

当一个系统调用被 Linux® 二进制程序调用时, 陷阱代码会把系统调用函数指针从 proc 解引用至 Linux® 而不是 FreeBSD 的系统调用入口。

Linux® 模式会动态地 reroots 查找。 这与 union 文件系统选项是等效的。 首先会试图在 /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 的 glue 功能, 而 Linux® 程序会得到 Linux® 的 glue 功能。 FreeBSD 的 glue 功能是静态链接入内核的, 而 Linux® 的 glue 功能可以静态链接, 或者通过内核模块访问。

严格说来其实并没有真正的模拟,这是一种 ABI 的实现。有时这被称为Linux® 模拟是因为在实现的时候还没有其他适合的词用来描述。 要说 FreeBSD 运行Linux®二进制程序并不确切,因为当时代码并还没有被编译进去。

部分 III. 系统管理

FreeBSD使用手册剩下的这些章节涵盖了全方位的FreeBSD系统管理。每个章节的开头会先描述在该您读完该章节后您会学到什么,也会详述在您在看这些数据时应该要有的一些背景知识。

这些章节是让您在需要查数据的时候翻阅用的。您不需要依照特定的顺序来读,也不需要将这些章节全部过读之后才开始用FreeBSD。

目录
11. 设定与调校
11.1. 简介
11.2. 启动服务
11.3. 设定cron(8)
11.4. 管理FreeBSD中的服务
11.5. 设定网络界面卡
11.6. 虚拟主机
11.7. 设定系统日志
11.8. 配置文件
11.9. 使用sysctl(8)调校
11.10. 调校磁盘
11.11. 调校内核限制
11.12. 增加交换空间
11.13. 电源与资源管理
12. FreeBSD开机程序
12.1. 简介
12.2. FreeBSD开机程序
12.3. 设定开机启动画面
12.4. 装置提示
12.5. 关机程序
13. 安全性
13.1. 简介
13.2. 介绍
13.3. 一次性密码
13.4. TCP Wrapper
13.5. Kerberos
13.6. OpenSSL
13.7. VPN over IPsec
13.8. OpenSSH
13.9. 文件系统访问控制表
13.10. 监视第三方安全性问题
13.11. FreeBSD 安全公告
13.12. 进程记帐
13.13. 资源限制
13.14. 使用Sudo分享管理权限
14. Jails
14.1. 简介
14.2. 与 Jail 相关的一些术语
14.3. 创建和控制 Jail
14.4. 微调和管理
14.5. 更新多个 jail
14.6. 使用 ezjail 管理 Jail
15. 强制访问控制
15.1. 简介
15.2. 本章出现的重要术语
15.3. 理解 MAC 标签
15.4. 规划安全配置
15.5. 可用的MAC策略
15.6. 用户锁定
15.7. MAC Jail 中的 Nagios
15.8. MAC 框架的故障排除
16. 安全事件审计
16.1. 简介
16.2. 本章出现的重要术语
16.3. 对审计进行配置
16.4. 管理审计子系统
17. 存储
17.1. 简介
17.2. 添加磁盘
17.3. 调整或增加磁盘
17.4. USB 存储设备
17.5. 创建和使用 CD
17.6. 建立与使用DVD媒体
17.7. 建立与使用软盘
17.8. 基础备份知识
17.9. 以内存为介质的文件系统
17.10. 文件系统快照
17.11. 文件系统配额
17.12. 加密磁盘分区
17.13. 对交换区进行加密
17.14. 高可用性存储(HAST)
18. GEOM: 模块化磁盘变换框架
18.1. 简介
18.2. RAID0 - 条带
18.3. RAID1 - 镜像
18.4. RAID3 - 使用专用校验设备的字节级条带
18.5. 软 RAID 设备
18.6. GEOM Gate 网络设备
18.7. 为磁盘设备添加卷标
18.8. 通过 GEOM 实现 UFS 日志
19. Z 文件系统(ZFS
19.1. 是什么让 ZFS 与众不同
19.2. 快速入门
19.3. zpool 管理
19.4. zfs 管理
19.5. 委托管理
19.6. 高级主题
19.7. 其他资源
19.8. ZFS 特色与术语
20. 其他文件系统
20.1. 简介
20.2. Linux® 文件系统
21. 虚拟化
21.1. 简介
21.2. Mac OS® X Parallels安装 FreeBSD 虚拟机
21.3. 在Windows®的Virtual PC安装FreeBSD为客端
21.4. FreeBSD as a Guest on VMware Fusion for Mac OS®
21.5. 在VirtualBox™使用FreeBSD作为客端
21.6. 使用 VirtualBox™ 虚拟机
21.7. 在 FreeBSD 上使用 bhyve 虚拟机
21.8. 以FreeBSD作为主端安装Xen
22. 本地化 - i18n/L10n 配置和使用
22.1. 简介
22.2. 使用本地化
22.3. 查找本地化应用程序
22.4. 特定语言的语系设定
23. 更新与升级 FreeBSD
23.1. 简介
23.2. FreeBSD更新
23.3. 更新文件集
23.4. 追踪开发分支
23.5. 从源码更新FreeBSD
23.6. 多部机器追踪
24. DTrace
24.1. 简介
24.2. 实现上的差异
24.3. 启用 DTrace 支持
24.4. 使用 DTrace
25. USB 设备模式 / USB OTG
25.1. 简介
25.2. USB大容量储存目标
25.3. USB储存装置
25.4. USB储存装置

第 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启动Script。

  • 如何设定并测试网络卡。

  • 如何在网络装置上设定虚拟主机。

  • 如何使用在/etc中的各种配置文件。

  • 如何使用sysctl(8) 调整 FreeBSD 系统参数。

  • 如何调校磁盘性能及修改核心限制。

在阅读这个章节之前,您应当:

11.2. 启动服务

Contributed by Tom Rhodes.

许多使用者会使用Port套件集安装第三方软件到FreeBSD且需要安装服务在系统初始化时可启动该软件。服务,例如mail/postfixwww/apache22仅只是在众多需要在系统初始化时启动的软件之中的两个。本章节将说明可用来启动第三方软件的程序。

在FreeBSD大多数内置的服务,例如cron(8)也是透过系统启动Script来执行。

11.2.1. 延伸应用程序设定

现在FreeBSD会引用rc.d,设定应用程序启动变的更简单且提供更多的功能。使用于第 11.4 节 “管理FreeBSD中的服务”所提到的关键字,可以设定应用程序在其他特定服务之后启动且可以透过/etc/rc.conf来传递额外的旗标来取代写死在启动Script中的旗标。一个基本的Script可能会如下例所示:

#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name=utility
rcvar=utility_enable

command="/usr/local/sbin/utility"

load_rc_config $name

#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
utility_enable=${utility_enable-"NO"}
pidfile=${utility_pidfile-"/var/run/utility.pid"}

run_rc_command "$1"

这个Script会确保要执行的utility会在虚构的服务DAEMON之后启动,也同时提供设定与追踪程序ID(Process ID,PID)的方法。

接着此应用程序便可将下行放到/etc/rc.conf中:

utility_enable="YES"

使用这种方式可以简单的处理指令列参数、引用/etc/rc.subr所提供的预设函数、与rcorder(8)兼容并可在rc.conf简单的设定。

11.2.2. 使用服务来启动其他服务

其他的服务可以使用inetd(8)来启动,在第 29.2 节 “inetd超级服务器”有如何使用inetd(8)以及其设定的深入说明。

在某些情况更适合使用cron(8)来启动系统服务,由于cron(8)会使用crontab(5)的拥有者来执行这些程序,所以这个方法有不少优点,这让一般的使用者也可以启动与维护自己的应用程序。

cron(8)@reboot功能,可用来替代指定详细的时间,而该工作会在系统初始化时执行cron(8)后执行。

11.3. 设定cron(8)

Contributed by Tom Rhodes.

在FreeBSD其中最有用的其中一项工具便是cron,这个工具会在背景执行并且定期检查/etc/crontab是否有要执行的工作然后搜寻/var/cron/tabs是否有自定义的crontab档案,这些档案用来安排要让cron在指定的时间执行的工作,crontab中的每一个项目定义了一个要执行的工作,又称作cron job

这里使用了两种类型的配置文件:其一是系统crontab,系统crontab不应该被修改,其二为使用者crontab,使用者crontab可以依需要建立与编辑。这两种档案的格式在crontab(5)有说明。系统crontab/etc/crontab的格式含有在使用者crontab所没有的who字段,在系统crontab,cron会依据该字段所指定的使用者来执行指令,而在使用者crontab,会以建立crontab的使用者来执行指令。

使用者crontab让个别使用者可以安排自己的工作,root使用者也可有自己的使用者crontab来安排不在系统crontab中的工作。

以下为系统crontab /etc/crontab的示例项目:

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD$
# 1
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 2
#
#minute	hour	mday	month	wday	who	command 3
#
*/5	*	*	*	*	root	/usr/libexec/atrun 4

1

#字元为首的行代表注释。可在档案中放置注释提醒要执行什么动作及为何要执行。注释不可与指令同行,否则会被当做指令的一部份,注释必须在新的一行,空白行则会被忽略掉。

2

等号(=)字元用来定义任何环境设定。在这个例子当中,使用了等号来定义SHELLPATH。若SHELL被省略,cron则会使用预设的Bourne shell。若PATH被省略,则必须指定指令或Script的完整路径才能执行。

3

此行定义了在系统crontab会使用到的七个字段:minutehourmdaymonthwdaywho以及commandminute字段是指定指令要执行的时间中的分,hour指定指令要执行的时,mday是月里面的日,month是月,以及wday是周里面的日。这些字段必须数值代表24小时制的时间或*来代表所有可能的值。who这个字段只有系统crontab才有,用来指定要用那一个使用者来执行指令。最后一个字段则是要执行的指令。

4

这个项目定义了该工作所使用的数值,*/5后接着数个*字元指的是每个月的每一周的每一日的每个小时的每5分钟会使用root执行/usr/libexec/atrun

指令可含任何数量的参数,但若指令要使用多行则需以反斜线\联机字元换行。

11.3.1. 建立使用者的Crontab

要建立一个使用者crontab可使用编辑模式执行crontab

% crontab -e

这样会使用预设的文字编辑器来开启使用者的crontab,使用者第一次执行这个指令会开启一个空的档案,使用者建立crontab之后这个指令则会开启已建立的crontab供编辑。

加入这些行到crontab档的最上方来设定环境变数以及备忘在crontab中字段的意思非常有用:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute	hour	mday	month	wday	command

然后每一个要执行的指令或Script加入一行,指定要执行指令的时间。这个例子会每天在下午2点执行指定的自定义Bourne shell script,由于没有在PATH指定Script的路径,所以必须给予完整的Script路径:

0	14	*	*	*	/usr/home/dru/bin/mycustomscript.sh

提示:

在使用自定义的Script之前,请先确定该Script可以执行并且使用cron在有限的环境变数下测试。要复制一个用来执行上述cron项目的环境可以使用:

env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/dru LOGNAME=dru /usr/home/dru/bin/mycustomscript.sh

crontab(5)有讨论cron使用的环境变数,若Script中含有任何会使用通配符删除档案的指令,那么检查Script可正常在cron的环境运作非常重要。

编辑完成crontab之后储存档案,编辑完的crontab会被自动安装且cron会读取该crontab并在其指定的时指执行其cron job。要列出crontab中有那一些cron job可以使用此指令:

% crontab -l
0	14	*	*	*	/usr/home/dru/bin/mycustomscript.sh

要移除使用在使用者crontab中的cron job可:

% crontab -r
remove crontab for dru? y

11.4. 管理FreeBSD中的服务

Contributed by Tom Rhodes.

FreeBSD在系统初始化时使用rc(8)系统的启动Script。列于/etc/rc.d的Script提供了基本的服务可使用service(8)加上startstop以及restart选项来控制。例如,使用以下指令可以重新启动sshd(8)

# service sshd restart

这个程序可以用来在执行中的系统上启动服务,而在rc.conf(5)中有指定的服务则会在开机时自动启动。例如,要在系统启动时开启natd(8),可入下行到/etc/rc.conf

natd_enable="YES"

natd_enable=“NO”行已存在,则将NO更改为YES,在下次开机时rc(8) script便会自动加载任何相依的服务,详细如下所述。

由于rc(8)系统主要用于在系统开机与关机时启动与停止服务,只有当有服务的变数设定在/etc/rc.confstartstop以及restart才会有作用。例如sshd restart只会在/etc/rc.conf中的 sshd_enable设为YES时才会运作,若要不透过/etc/rc.conf的设定来startstoprestart一个服务则需要在指令前加上one,例如要不透过目前在/etc/rc.conf的设定重新启动sshd(8)可执行以下指令:

# service sshd onerestart

要检查一个服务是否有在/etc/rc.conf开启,可执行服务的rc(8) Script加上rcvar。这个例子会检查sshd(8)是否在/etc/rc.conf已经开启:

# service sshd rcvar
# sshd
#
sshd_enable="YES"
#   (default: "")

注意:

# sshd的输出来自上述指令,而非root console。

要判断是一个服务是否正在执行,可使用status,例如要确认sshd(8)是否正常在执行:

# service sshd status
sshd is running as pid 433.

在某些情况,也可以reload一个服务。这个动作会尝试发送一个信号给指定的服务,强制服务重新加载其配置文件,在大多数的情况下,发送给服务的信号是SIGHUP。并不是每个服务都有支持此功能。

rc(8)系统会用在网络服务及也应用在大多数的系统初化。例如执行/etc/rc.d/bgfsck Script会列印出以下信息:

在 60 秒内启动后台文件系统检查。

这个Script用来在背景做文件系统检查,只有在系统初始化时要执行。

许多系统服务会相依其他服务来运作,例如yp(8)及其他以RPC为基础的服务在rpcbind(8)服务启动前可能会启动失败。要解决这种问题,就必须在启动Script上方的注释中加入相依及其他meta-data。在系统初始化时会用rcorder(8)程序分析这些注释来决定要以什么顺序来执行系统服务以满足相依。

rc.subr(8)的需要,以下的关键字必须加入到所有的启动Script方可enable启动Script:

  • PROVIDE:设定此档案所提供的服务。

以下关键字可能会在每个启动Script的上方引用,虽然非必要,但是对于rcorder(8)是非常有用的提示:

  • REQUIRE:列出此服务需要引用的服务。有使用此关键字的Script会在指定服务启动之后才执行。

  • BEFORE:列出相依此服务的服务。有使用此关键字的Script会在指定的服务启动之前执行。

透过仔细的设定每个启动Script的这些关键字,管理者便可对Script的启动顺序进行微调,而不需使用到其他UNIX®操作系统所使用的runlevels

额外的信息可在rc(8)以及rc.subr(8)中找到。请参考此文章来取得如何建立自定义rc(8) Script的操作说明。

11.4.1. 管理系统特定的设定

系统设定信息的主要位于/etc/rc.conf,这个档案的设定信息范围非常广且会在系统启动时读取来设定系统,它也提供设定信息给rc*档案使用。

/etc/rc.conf中的设定项目会覆盖在/etc/defaults/rc.conf的预设设定,不应直接编辑该档案中的预设设定,所有系统特定的设定应到/etc/rc.conf所修改。

在丛集应用时要将系统特定的设定与各站特定的设定分开,借此减少管理成本有好几种方法,建议的方法是将系统特定的设定放置在/etc/rc.conf.local,例如以下将要套用到所有系统的设定项目放在/etc/rc.conf

sshd_enable="YES"
keyrate="fast"
defaultrouter="10.1.1.254"

而只套用到此系统的设定放在/etc/rc.conf.local

hostname="node1.example.org"
ifconfig_fxp0="inet 10.1.1.1/8"

使用应用程序如rsyncpuppet/etc/rc.conf散布到每个系统,而在各系统保留自己的/etc/rc.conf.local

升级系统并不会复写/etc/rc.conf,所以系统设定信息不会因此遗失。

提示:

/etc/rc.conf以及/etc/rc.conf.local两个档案都会使用sh(1)解析,这让系统操作者能够建立较复杂的设定方案。请参考rc.conf(5)来取得更多有关此主题的信息。

11.5. 设定网络界面卡

Contributed by Marc Fonvieille.

对FreeBSD管理者来说加入与设定网络界面卡(Network Interface Card,NIC)会是一件常见的工作。

11.5.1. 找到正确的驱动程序

首先,要先确定NIC的型号及其使用的芯片。FreeBSD支持各种NIC,可检查该FreeBSD发布版本的硬件兼容性清单来查看是否有支持该NIC

若有支持该NIC,接着要确定该NIC所要需要的FreeBSD驱动程序名称。请参考/usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES来取得NIC驱动程序清单及其支持的晶片组相关资讯。当有疑问是,请阅读该驱动程序的操作手册,会有提供更多有关支持硬件及该驱动程序已知问题的信息。

GENERIC核心已有内含常见NIC的驱动程序,意思是在开机时应该会侦测到NIC。可以输入more /var/run/dmesg.boot来检视系统的开机信息并使用空白键卷动文字。在此例中,两个以太网络NIC使用系统已有的dc(4)驱动程序:

dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
miibus0: <MII bus> on dc0
bmtphy0: <BCM5201 10/100baseTX PHY> PHY 1 on miibus0
bmtphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc0: Ethernet address: 00:a0:cc:da:da:da
dc0: [ITHREAD]
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
miibus1: <MII bus> on dc1
bmtphy1: <BCM5201 10/100baseTX PHY> PHY 1 on miibus1
bmtphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: Ethernet address: 00:a0:cc:da:da:db
dc1: [ITHREAD]

若在GENERIC中没有该NIC的驱动程序,但有可用的驱动程序,那么在设定及使用NIC前要先加载该驱动程序,有两种方式可以完成这件事:

  • 最简单的方式是使用kldload(8)加载NIC要使用的核心模块。要在开机时自动加载,可加入适当的设定到/boot/ loader.conf。不是所有NIC驱动程序皆可当做模块使用。

  • 或者,静态编译对NIC的支持到自定义核心,请参考/usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES及驱动程序的操作手册来了解要在自定义核心配置文件中要加入那些设定。要取得更多有关重新编译核心的信息可参考第 8 章 配置 FreeBSD 内核。若在开机时有侦测到NIC,就不需要再重新编译核心。

11.5.1.1. 使用Windows® NDIS驱动程序

很不幸的,仍有很多供应商并没有提供它们驱动程序的技术文件给开源社群,因为这些文件涉及商业机密。因此,FreeBSD及其他操作系统的开发人员只剩下两种方案可以选择:通过长期艰苦的做逆向工程来开发驱动程序或是使用现有供Microsoft® Windows®平台用的二进制驱动程序。

FreeBSD对Network Driver Interface Specification(NDIS)有提供原生的支持,这包含了ndisgen(8)可用来转换Windows® XP驱动程序成可在FreeBSD上使用的格式。由于ndis(4)驱动程序使用的是Windows® XP binary,所以只能在i386™及amd64系统上执行。PCI,CardBus,PCMCIA以及USB装置也都有支持。

要使用ndisgen(8)需要三样东西:

  1. FreeBSD核心源码。

  2. Windows® XP 二进制驱动程序,扩展名为 .SYS

  3. Windows® XP 驱动程序配置文件,扩展名为 .INF

下载供指定NIC使用的.SYS.INF档。通常这些档案可以在驱动程序CD或者供应商的网站上找到。以下示例会使用W32DRIVER.SYSW32DRIVER.INF

驱动程序的位宽度必须与FreeBSD的版本相符。例如FreeBSD/i386需要使用Windows® 32-bit驱动程序,而FreeBSD/amd64则需要使用Windows® 64-bit驱动程序。

下个步骤是编译驱动程序Binary成可加载的核心模块。以root身份使用ndisgen(8)

# ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS

这个指令是互动式的,会提示输入任何所需的额外信息,新的核心模块会被产生在目前的目录,使用kldload(8)来加载新的模块:

# kldload ./W32DRIVER_SYS.ko

除了产生的核心模块之外,ndis.ko以及if_ndis.ko也必须加载,会在任何有相依ndis(4)的模块被加载时一并自动加载。若没有自动加载,则需使用以下指令手动加载:

# kldload ndis
# kldload if_ndis

第一个指令会加载ndis(4) miniport驱动程序包装程序,而第二个指令会加载产生的NIC驱动程序。

检查dmesg(8)查看是否有任何加载错误,若一切正常,输出结果应会如下所示:

ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps

到此之后ndis0可以像任何其他NIC设定使用。

要设定系统于开机时加载ndis(4)模块,可复制产生的模块W32DRIVER_SYS.ko/boot/modules。然后加入下行到/boot/loader.conf

W32DRIVER_SYS_load="YES"

11.5.2. 设定网络卡

加载正确的NIC驱动程序之后,接着需要设定界面卡,这个动作可能在安装时已经使用bsdinstall(8)设定过了。

要查看NIC设定可输入以下指令:

% ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80008<VLAN_MTU,LINKSTATE>
        ether 00:a0:cc:da:da:da
        inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
dc1: flags=8802<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80008<VLAN_MTU,LINKSTATE>
        ether 00:a0:cc:da:da:db
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
        media: Ethernet 10baseT/UTP
        status: no carrier
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

在这个例子中列出了以下装置:

  • dc0:第一个以太网络界面。

  • dc1:第二个以太网络界面。

  • lo0:Loopback装置。

FreeBSD会使用驱动程序名称接着开机时所侦测到的界面卡顺序来命名NIC。例如sis2是指在系统上使用sis(4)驱动程序的第三个NIC

在此例中,dc0已经上线并且执行中。主要的依据有:

  1. UP代表界面卡已设定好并且准备就绪。

  2. 界面卡有网际网络(inet)位址,192.168.1.3

  3. 界面卡有一个有效的子网络掩码(netmask),其中0xffffff00等同于255.255.255.0

  4. 界面卡有一个有效的广播位址,192.168.1.255

  5. 界面卡(ether)的MAC位址是00:a0:cc:da:da:da

  6. 实体媒介选择为自动选择模式(media: Ethernet autoselect(100baseTX <full-duplex>))。在本例中dc1被设定使用10baseT/UTP媒介。要取得更多有关可用的驱动程序媒介类型请参考操作手册。

  7. 连接的状态(status)为使用中(active),代表有侦测到载波信号(Carrier Signal)。若dc1所代表的界面卡未插入以太网路线则状态为status: no carrier是正常的。

ifconfig(8)的输出结果如下:

dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=80008<VLAN_MTU,LINKSTATE>
	ether 00:a0:cc:da:da:da
	media: Ethernet autoselect (100baseTX <full-duplex>)
	status: active

则代表尚未设定界面卡。

界面卡必须以root来设定。NIC的设定可在指令列执行ifconfig(8)来完成,但重新开机之后变会消失,除非将设定也加到/etc/rc.conf。若在LAN中有DHCP服务器,则只需加入此行:

ifconfig_dc0="DHCP"

替换dc0为该系统的正确值。

加入这行之后,接着依据第 11.5.3 节 “测试和故障排除”指示操作。

注意:

若网络在安装时已设定,可能会已经有NIC的设定项目。在加入任何设定前请再次检查/etc/rc.conf

在这个例中,没有DHCP服务器,必须手动设置NIC。为每个 NIC 添加配置,就像下面这样:

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以及 IP 位址信息为系统的正确值。请参考驱动程序的操作手册、ifconfig(8)以及rc.conf(5)取得更多有关可用的选项及/etc/rc.conf的语法。

若网络没有使用DNS,则编辑/etc/hosts加入LAN上主机的名称与 IP 位址。要取得更多资讯请参考hosts(5)/usr/share/examples/etc/hosts

注意:

若没有DHCP服务器且需要存取网际网络,那么需要手动设定预设网关及名称服务器:

# echo 'defaultrouter="your_default_router"' >> /etc/rc.conf
# echo 'nameserver your_DNS_server' >> /etc/resolv.conf

11.5.3. 测试和故障排除

必要的变更储存到/etc/rc.conf之后,需要重新启动系统来测试网络设定并检查系统重新启动是否没有任何设定错误。或者使用这个指令将设定套用到网络系统:

# service netif restart

注意:

若预设的通信闸已设定于/etc/rc.conf也同样要下这个指令:

# service routing restart

网络系统重新启动后,便可接着测试NIC

11.5.3.1. 测试以太网卡

要检查以太网路卡是否已正确设定可ping(8)界面卡自己,然后ping(8)其他于LAN上的主机:

% 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 -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

要测试网络解析,可使用主机名称来替代IP位址。若在网路上没有DNS服务器则必须先设定/etc/hosts,若主机尚未设定到/etc/hosts中,则需编辑/etc/hosts加入LAN上主机的名称及IP位址,要取得更多资讯请参考hosts(5)/usr/share/examples/etc/hosts

11.5.3.2. 故障排除

在排除硬件及软件设定问题时,要先检查几件简单的事。网路线插上了没?网络的服务都正确设定了吗?防火墙设定是否正确?FreeBSD是否支持该NIC?在回报问题之前,永远要先检查Hardware Notes、更新FreeBSD到最新的STABLE版本、检查邮递论坛封存记录以及上网查询。

若界面卡可以运作,但是性能很差,请阅读tuning(7),同时也要检查网络设定,因为不正确的网络设定会造成连接速度缓慢。

部份使用者会遇到一次或两次device timeout的信息,在对某些界面卡是正常的。若信息持续发生或很烦的,请确认是否有与其他的装置冲突,再次检查网路线,或考虑使用其他介面卡。

要解决watchdog timeout错误,先检查网路线。许多界面卡需要使用支持Bus Mastering的PCI插槽,在一些旧型的主板,只会有一个PCI插槽支持,通常是插槽0。检查NIC以及主板说明文件来确定是否为此问题。

若系统无法路由传送封包到目标主机则会出现No route to host信息,这可能是因为没有指定预设的路由或未插上网路线。请检查netstat -rn的输出并确认有一个有效的路由可联机至主机,若没有,请阅读第 31.2 节 “网关和路由”

造成ping: sendto: Permission denied错误讯息的原因通常是防火墙设定错误。若在FreeBSD上有开启防火墙,但却未定义任何的规则,预设的原则是拒绝所有传输,即使是用ping(8)。请参考第 30 章 防火墙取得更多资讯。

有时界面卡的性能很差或低于平均值,在这种情况可尝试设定媒介选择模式由autoselect更改为正确的媒介选项,虽然这在大部份硬件可运作,但可能无法解决问题,同样的,检查所有网络设定并参考tuning(7)

11.6. 虚拟主机

FreeBSD最常见的用途之一就是虚拟网站代管,即以一台服务器在网路上扮演多台服务器,这可以透过指定多个网络位置到一个网络界面来做到。

一个网络界面会有一个真实(Real)位址且可以有许多个别名(Alias)位址。一般会在/etc/rc.conf中放置别名项目来增加别名,如下例:

ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"

别名项目必须以alias0开头,使用连续数字例如alias0alias1以此类推,设定程序会在第一个遇到缺号的地方中止。

要注意别名网络掩码(Netmask)的计算,使用的界面必须至少有一个正确的填写网络掩码的位址,而其他所有在此网络中的位址则必须使用全部1的网络掩码,可用255.255.255.2550xffffffff来表示。

举例来说,有一个fxp0界面连接到两个网络:10.1.1.0使用网络掩码255.255.255.0以及202.0.75.16使用网络掩码255.255.255.240。而系统将要设定使用范围10.1.1.110.1.1.5以及202.0.75.17202.0.75.20。在指定的网络范围中只有第一个位址应使用真实的网络掩码,其余(10.1.1.210.1.1.5202.0.75.18202.0.75.20)则必须设定使用255.255.255.255的掩码。

在此情境下正确设定网络界面的方式如下/etc/rc.conf中的项目:

ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"

有一种更简单的方式可以表达这些设定,便是使用以空白分隔的 IP 位址清单。只有第一个位址会使用指定的子网络掩码,其他的位址则会使用255.255.255.255的子网络掩码。

ifconfig_fxp0_aliases="inet 10.1.1.1-5/24 inet 202.0.75.17-20/28"

11.7. 设定系统日志

Contributed by Niclas Zeising.

产生与读取系统日志对系统管理来说是一件非常重要的事,在系统日志中的信息可以用来侦测硬件与软件的问题,同样也可以侦测应用程序与系统设定的错误。这些信息在安全性稽查与事件响应也同样扮演了重要的角色,大多数系统Daemon与应用程序都会产生日志项目。

FreeBSD提供了一个系统日志程序syslogd用来管理日志。预设syslogd会与系统开机时启动。这可使用在/etc/rc.conf中的变数 syslogd_enable来控制。而且有数个应用程序参数可在/etc/rc.conf使用syslogd_flags来设定。请参考syslogd(8)来取得更多可用参数的信息。

此章节会介绍如何设定FreeBSD系统日志程序来做本地与远端日志并且介绍如何执行日志翻转(Log rotation)与日志管理。

11.7.1. 设定本地日志

配置文件/etc/syslog.conf控制syslogd收到日志项目时要做的事情,有数个参数可以用来控制接收到事件时的处理方式。设施(facility)用来描述记录产生信息的子系统(subsystem),如核心或者Daemon,而层级(level)用来描述所发生的事件严重性。也可以依据应用程序所发出的信息及产生日志事件机器的主机名称来决定后续处置的动作。

此配置文件中一行代表一个动作,每一行的格式皆为一个选择器字段(Selector field)接着一个动作字段(Action field)。选择器字段的格式为facility.level可以用来比对来自facility于层级level或更高层的日志信息,也可以在层级前加入选择性的比对旗标来更确切的指定记录的内容。同样一个动作可以使用多个选择器字段并使用分号()来分隔。用*可以比对任何东西。动作字段可用来指定传送日志信息的目标,如一个档案或远端日志主机。示例为以下为FreeBSD预设的syslog.conf

# $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) manpage.
*.err;kern.warning;auth.notice;mail.crit                /dev/console
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err   /var/log/messages
security.*                                      /var/log/security
auth.info;authpriv.info                         /var/log/auth.log
mail.info                                       /var/log/maillog
lpr.info                                        /var/log/lpd-errs
ftp.info                                        /var/log/xferlog
cron.*                                          /var/log/cron
!-devd
*.=debug                                        /var/log/debug.log
*.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
# touch /var/log/all.log and chmod it to mode 600 before it will work
#*.*                                            /var/log/all.log
# uncomment this to enable logging to a remote loghost 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
# Uncomment this if you wish to see messages produced by devd
# !devd
# *.>=info
!ppp
*.*                                             /var/log/ppp.log
!*

在这个示例中:

  • 第8行会找出所有符合err或以上层级的信息,还有kern.warningauth.noticemail.crit的信息,然后将这些日志信息传送到Console(/dev/console)。

  • 第12行会找出所有符合mail设施中于info或以上层级的信息,并记录信息至/var/log/maillog

  • 第17行使用了比较旗标(=)来只找出符合debug层级的信息,并将信息记录至/var/log/debug.log

  • 第33行是指定程序的示例用法。这可以让在该行以下的规则只对指定的程序生效。在此例中,只有由ppp产生的信息会被记录到/var/log/ppp.log

所以可用层级从最严重到最不严重的顺序为emergalertcriterrwarningnoticeinfo以及debug

设施(facility)则无特定顺序,可用的有authauthprivconsolecrondaemonftpkernlprmailmarknewssecuritysysloguseruucplocal0local7。要注意在其他操作系统的设施可能会不同。

要记录所有所有notice与以上层级的信息到/var/log/daemon.log可加入以下项目:

daemon.notice                                        /var/log/daemon.log

要取得更多有关不同的层级与设施的信息请参考syslog(3)syslogd(8)。要取得更多有关/etc/syslog.conf、语法以及更多进阶用法示例的信息请参考syslog.conf(5)

11.7.2. 日志管理与翻转

日志档案会成长的非常快速,这会消耗磁盘空间并且会更难在日志中找到有用的信息,日志管理便是为了尝试减缓这种问题。在FreeBSD可以使用newsyslog来管理日志档案,这个内置的程序会定期翻转(Rotate)与压缩日志档案,并且可选择性的建立遗失的日志档案并在日志档案被移动位置时通知程序。日志档案可能会由syslogd产生或由其他任何会产生日志档案的程序。 newsyslog正常会由cron(8)来执行,它并非一个系统Daemon,预设会每个小时执行一次。

newsyslog会读取其配置文件/etc/newsyslog.conf来决定其要采取的动作,每个要由newsyslog所管理的日志档案会在此配置文件中设定一行,每一行要说明档案的拥有者、权限、何时要翻转该档案、选用的日志翻转旗标,如:压缩,以及日志翻转时要通知的程序。以下为FreeBSD的预设设定:

# configuration file for newsyslog
# $FreeBSD$
#
# Entries which do not specify the '/pid_file' field will cause the
# syslogd process to be signalled when that log file is rotated.  This
# action is only appropriate for log files which are written to by the
# syslogd process (ie, files listed in /etc/syslog.conf).  If there
# is no process which needs to be signalled when a given log file is
# rotated, then the entry for that file should include the 'N' flag.
#
# The 'flags' field is one or more of the letters: BCDGJNUXZ or a '-'.
#
# Note: some sites will want to select more restrictive protections than the
# defaults.  In particular, it may be desirable to switch many of the 644
# entries to 640 or 600.  For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential.  In the
# future, these defaults may change to more conservative ones.
#
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/all.log                        600  7     *    @T00  J
/var/log/amd.log                        644  7     100  *     J
/var/log/auth.log                       600  7     100  @0101T JC
/var/log/console.log                    600  5     100  *     J
/var/log/cron                           600  3     100  *     JC
/var/log/daily.log                      640  7     *    @T00  JN
/var/log/debug.log                      600  7     100  *     JC
/var/log/kerberos.log                   600  7     100  *     J
/var/log/lpd-errs                       644  7     100  *     JC
/var/log/maillog                        640  7     *    @T00  JC
/var/log/messages                       644  5     100  @0101T JC
/var/log/monthly.log                    640  12    *    $M1D0 JN
/var/log/pflog                          600  3     100  *     JB    /var/run/pflogd.pid
/var/log/ppp.log        root:network    640  3     100  *     JC
/var/log/devd.log                       644  3     100  *     JC
/var/log/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  10    *    168   B
/var/log/utx.log                        644  3     *    @01T05 B
/var/log/weekly.log                     640  5     1    $W6D0 JN
/var/log/xferlog                        600  7     100  *     JC

每一行的开始为要翻转的日志名称、接着是供翻转与新建档案使用的拥有者及群组(选填)。mode字段可设定日志档案的权限,count代表要保留多少个翻转过的日志档案,而sizewhen字段会告诉newsyslog何时要翻转该档案。日志档案会在当其档案超过size字段的大小或已超过when字段指定的时间时翻转,可使用星号(*)忽略该字段。flags字段可以给予进阶的参数,例如:如何压缩翻转后档案或建立遗失的日志档案。最后两个字段皆为选填,可指定程序的程序ID(PID)档名称以及档案翻转后要传送给该程序的信号(Signal)编号。

要取的更多有关所有字段、可用的旗标及如何指定翻转时间,请参考newsyslog.conf(5)。由于newsyslog是由cron(8)执行,因此无法比其在cron(8)中所排定的时间间距内更频繁的执行翻转档案。

11.7.3. 设定远端日志

Contributed by Tom Rhodes.

处理系统日志对于系统安全和管理是一个重要方面。 当有多台分布在中型或大型网络的机器,再或者是处于各种不同类型的网络中, 监视他们上面的日志文件则显得非常难以操作, 在这种情况下, 配置远程日志记录能使整个处理过程变得更加轻松。

集中记录日志到一台指定的机器能够减轻一些日志文件管理的负担。 日志文件的收集, 合并与循环可以在一处配置, 使用 FreeBSD 原生的工具, 比如 syslogd(8)newsyslog(8)。 在以下的配置示例中, 主机 A, 命名为 logserv.example.com, 将用来收集本地网络的日志信息。 主机 B, 命名为 logclient.example.com 将把日志信息传送给服务器。 在现实中, 这两个主机都需要配置正确的正向和反向的 DNS 或者在 /etc/hosts 中记录。 否则, 数据将被服务器拒收。

11.7.3.1. 日志服务器设定

日志服务器是接受来自其他主机的日志信息的系统。在配置日志服务器之前,请检查以下内容:

  • 服务器和客户端的防火墙规则允许 514 端口上的 UDP 报文通过。

  • 日志记录服务器和所有客户端计算机必须具有本地 DNS 中的正向和反向条目。如果网络没有 DNS 服务器,请在每个系统的 /etc/hosts中创建条目。需要正确的名称解析,以便日志记录服务器不会拒绝日志条目。

在日志服务器上,编辑/etc/syslog.conf以指定要接收日志条目的客户端的名称、要使用的日志记录工具以及用于存储主机日志项的日志名称。本示例添加 B 的主机名,记录所有设施,并将日志条目存储在/var/log/logclient.log中。

例 11.1. 日志服务器设定示例
+logclient.example.com
*.*     /var/log/logclient.log

添加多个日志客户端时,为每个客户端添加类似的双行条目。有关现有设施的更多信息, 可在syslog.conf(5)中查阅。

接下来,配置/etc/rc.conf

syslogd_enable="YES"
syslogd_flags="-a logclient.example.com -v -v"

第一个条目在系统启动时启动syslogd。第二个条目允许来自指定客户端的日志条目。-v -v 增加了记录消息的冗量。这对于调整设施非常有用,因为管理员能够查看每个设施下记录的消息类型。

可以指定多个-a选项以允许从多个客户端进行日志记录。也可以指定IP地址和整个网络块。有关可能的选项的完整列表, 请参阅syslogd(8)

最后,创建日志文件:

# touch /var/log/logclient.log

此时,应重新启动并验证syslogd

# service syslogd restart
# pgrep syslog

如果返回了一个 PID 的话, 服务端应该被成功重启了, 并继续开始配置客户端。 如果服务端没有重启的话, 请在 /var/log/messages 日志中查阅相关输出。

11.7.3.2. 日志客户端设定

日志客户端是一台发送日志信息到日志服务器的机器, 并在本地保存拷贝。

配置日志记录服务器后, 在日志记录客户端上编辑 /etc/rc.conf:

syslogd_enable="YES"
syslogd_flags="-s -v -v"

第一个条目在启动时启用syslogd。第二个条目防止此客户端从其他主机(-s)接受日志,并增加日志消息的详细程度。

日志服务器必须在客户端的 /etc/syslog.conf 中指明。 在此例中, @ 符号被用来表示发送日志数据到远程的服务器, 看上去差不多如下这样:

*.*		@logserv.example.com

添加后, 必须重启 syslogd 使得上述修改生效:

# service syslogd restart

测试日志消息是否能通过网络发送, 在准备发出消息的客户机上用 logger(1) 来向 syslogd 发出信息:

# logger "Test message from logclient"

这段消息现在应该同时出现在客户机的 /var/log/messages 以及日志服务器的 /var/log/logclient.log 中。

11.7.3.3. 调试日志服务器

如果在日志服务器上没有收到任何消息,原因很可能是网络连接问题、主机名解析问题或配置文件出错。要了解出错原因原因,请确保日志服务器和日志客户端都能使用其/etc/rc.conf中指定的主机名来ping对方。如果失败,请检查网络布线、防火墙规则集以及日志服务器和客户端上的DNS服务器或/etc/hosts中的主机名条目。重复执行,直到两个主机上的ping成功。

如果双向 ping 成功,仍没收到日志信息,请临时增加日志记录的详细程度,以减少配置问题。本例中日志服务器上的/var/log/logclient.log是空的且客户端没有报错。为了开启调试输入,在日志服务器上编辑syslogd_flags选项并重启日志服务器:

syslogd_flags="-d -a logclient.example.com -v -v"
# service syslogd restart

重启后控制台上会显示调试信息:

logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
Logging to FILE /var/log/messages
syslogd: kernel boot file is /boot/kernel/kernel
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
rejected in rule 0 due to name mismatch.

在此示例中,由于拼写错误导致主机名不匹配,日志消息被拒绝。客户端的主机名应该是logclient,而非logclien。修复拼写错误并重新启动,验证结果:

# service syslogd restart
logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
syslogd: kernel boot file is /boot/kernel/kernel
logmsg: pri 166, flags 17, from logserv.example.com,
msg Dec 10 20:55:02 <syslog.err> logserv.example.com syslogd: exiting on signal 2
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
accepted in rule 0.
logmsg: pri 15, flags 0, from logclient.example.com, msg Dec 11 02:01:28 trhodes: Test message 2
Logging to FILE /var/log/logclient.log
Logging to FILE /var/log/messages

此时,消息正在正确接收并放置在正确的文件中。

11.7.3.4. 安全注意事项

就像其他的网络服务一样, 在实现配置之前需要考虑安全性。 有时日志文件也包含了敏感信息, 比如本地主机上所启用的服务, 用户帐号和配置数据。 从客户端发出的数据经过网络到达服务器, 这期间既没有加密也没有密码保护。 如果有加密需要的话, 可以使用 security/stunnel, 它将在一个加密的隧道中传输数据。

本地安全也同样是个问题。 日志文件在使用中或循环转后都没有被加密。 本地用户可能读取这些文件以获得对系统更深入的了解。 对于这类情况, 给这些文件设置正确的权限是非常有必要的。 newsyslog(8) 工具支持给新创建和循环的日志设置权限。 把日志文件的权限设置为 600 能阻止本地用户不必要的窥探。

11.8. 配置文件

11.8.1. /etc配置

有数个目录中储存着设定信息,这些目录有:

/etc通用系统特定的设定信息。
/etc/defaults系统配置文件的预设版本。
/etc/mailsendmail(8)额外的设定以及其他MTA配置文件。
/etc/ppp配置 user-ppp 和 kernel-ppp 程序。
/usr/local/etc已安装应用程序的配置文件,可能会有以应用程序区分的子目录。
/usr/local/etc/rc.d已安装应用程序的rc(8) Script。
/var/db自动产生的系统特定数据库档案,例如套件数据库以及locate(1)数据库。

11.8.2. 主机名称

11.8.2.1. /etc/resolv.conf

FreeBSD要如何存取网际网络网域名称系统(Internet Domain Name System,DNS)是由resolv.conf(5)来控制。

/etc/resolv.conf中最常用的项目为:

nameserver解析程序(Resolver)要查询的名称服务器 IP 位置,这些服务器会依所列的顺序来查询,最多可以有三个。
search主机名称查询使用的搜寻清单。这通常会使用本机主机名称所在的网域。
域名本地网域名称。

典型的/etc/resolv.conf会如下:

search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30

注意:

searchdomain选项应择一使用。

当使用DHCP时,dhclient(8)通常会使用从DHCP服务器所接收到的信息复写/etc/resolv.conf

11.8.2.2. /etc/hosts

/etc/hosts是简单的文字数据库,会与DNSNIS一并使用来提供主机名称与 IP 位址的对应。可将透过LAN所连接的在地电脑项目加入到这个档案做最简单的命名,来替代设定一个named(8)服务器。除此之外/etc/hosts可以用来提供本地的网际网络名称记录,来减少常用名称向外部DNS服务器查询的需求。

# $FreeBSD$
#
#
# Host Database
#
# This file should contain the addresses and aliases for local hosts that
# share this file.  Replace 'my.domain' below with the domainname of your
# machine.
#
# 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
127.0.0.1		localhost localhost.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.  Do not try to invent your own network
# numbers but instead get one from your network provider (if any) or
# from your regional registry (ARIN, APNIC, LACNIC, RIPE NCC, or AfriNIC.)
#

/etc/hosts的格式如下:

[Internet address] [official hostname] [alias1] [alias2] ...

例如:

10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2

请参考hosts(5)取得更多资讯。

11.9. 使用sysctl(8)调校

sysctl(8)可用来更改执行中的FreeBSD系统,这包含许多TCP/ IP 堆叠及虚拟內存系统的进阶选项,让有经验的系统管理者能够简单的提升性能。有超过五百个系统变数可以使用sysctl(8)来读取与设定。

sysctl(8)主要提供两个功能:读取与修改系统设定。

检视所有可读取的变数:

% sysctl -a

要读取特定变数只要指定其名称:

% sysctl kern.maxproc
kern.maxproc: 1044

要设定特定变数可使用variable=value语法:

# sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000

sysctl 变量的类型通常是字符串、数字或布尔值。其中布尔值1表示是,0表示否。

要在每次机器开机时自动设定一些变数可将其加入到/etc/sysctl.conf。要取得更多的信息请参考sysctl.conf(5)第 11.9.1 节 “sysctl.conf

11.9.1. sysctl.conf

sysctl(8)的配置文件于/etc/sysctl.conf,内容很像/etc/rc.conf,设定数值使用variable=value格式。指定的数值会在系统进入多使用者模式时设定,但并非所有变数皆可在此模式设定。

例如,要关闭严重信号(Fatal signal)中止的记录并避免使用者看到其他使用者所执行的程序,可加入以下设定到/etc/sysctl.conf

# Do not log fatal signal exits (e.g., sig 11)
kern.logsigexit=0

# Prevent users from seeing information about processes that
# are being run under another UID.
security.bsd.see_other_uids=0

11.9.2. 只读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)设定。加入hw.pci.allow_unsupported_io_range=1/boot/loader.conf然后重新启动。现在cardbus(4)应可正常运作。

11.10. 调校磁盘

接下来的章节会讨论在磁盘装置上各种可调校的机制与选项。在大多数案例中,有使用机械元件的硬盘,如SCSI磁碟机,会成为导致整体系统性能低下的瓶颈。虽然已经有不使用机械元件的磁碟机解决方案,如,固态硬盘,但使用机械元件的磁碟机短期内并不会消失。在调校磁盘时,建议可以利用iostat(8)指令的功能来测试各种对系统的变更,这个指令可让使用者取得系统IO相关的有用信息。

11.10.1. Sysctl 参数

11.10.1.1. vfs.vmiodirenable

The vfs.vmiodirenable sysctl(8) variable may be set to either 0 (off) or 1 (on). It is set to 1 by default. This variable controls how directories are cached by the system. Most directories are small, using just a single fragment (typically 1 K) in the file system and typically 512 bytes in the buffer cache. With this variable turned off, the buffer cache will only cache a fixed number of directories, even if the system has a huge amount of memory. When turned on, this sysctl(8) allows the buffer cache to use the VM page cache to cache the directories, making all the memory available for caching directories. However, the minimum in-core memory used to cache a directory is the physical page size (typically 4 K) rather than 512  bytes. Keeping this option enabled is recommended if the system is running any services which manipulate large numbers of files. Such services can include web caches, large mail systems, and news systems. Keeping this option on will generally not reduce performance, even with the wasted memory, but one should experiment to find out.

11.10.1.2. vfs.write_behind

vfs.write_behind sysctl 变量默认是 1 (打开)。 它告诉文件系统簇被收集满的时候把内容写进介质, 典型的是在写入大的连续的文件时。 主要的想法是, 如果可能对 I/O 性能会产生负面影响时, 应尽量避免让缓冲缓存被未同步缓冲区充满。 然而它可能降低处理速度并且在某些情况下您可能想要关闭它。

11.10.1.3. vfs.hirunningspace

vfs.hirunningspace sysctl 变量决定了在任何给定情况下, 有多少写 I/O 被排进队列以给系统的磁盘控制器。 默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成 4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。 不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。

sysctl(8) 中还有许多与 buffer cache 和 VM页面 cache 有关的值, 一般不推荐修改它们。 虚拟内存系统已经能够很好地进行自动调整了。

11.10.1.4. vm.swap_idle_enabled

vm.swap_idle_enabled sysctl 变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。 这些系统注重在空闲的内存中间产生连续压力的处理。通过 vm.swap_idle_threshold1vm.swap_idle_threshold2 打开这个特性并且调整交换滞后 (在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页 (pageout)算法更快。这给出页守护进程带来了帮助。 除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存, 因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果, 但是在大的系统上它已经做了合适的页面调度这个选项允许 VM 系统容易的让全部的进程进出内存。

11.10.1.5. hw.ata.wc

FreeBSD 4.3 中默认将 IDE 的写缓存关掉了。 这会降低到 IDE 磁盘用于写入操作的带宽, 但我们认为这有助于避免硬盘厂商所引入的, 可能引致严重的数据不一致问题。 这类问题实际上是由于 IDE 硬盘就写操作完成这件事的不诚实导致的。 当启用了 IDE 写入缓存时, IDE 硬盘驱动器不但不会按顺序将数据写到盘上, 而且当磁盘承受重载时, 它甚至会自作主张地对推迟某些块的实际写操作。 这样一来, 在系统发生崩溃或掉电时, 就会导致严重的文件系统损坏。 基于这些考虑, 我们将 FreeBSD 的默认配置改成了更为安全的禁用 IDE 写入缓存。 然而不幸的是, 这样做导致了性能的大幅降低, 因此在后来的发行版中这个配置又改为默认启用了。 您可以通过观察 hw.ata.wc sysctl 变量, 来确认您的系统中所采用的默认值。 如果 IDE 写缓存被禁用, 您可以通过将内核变量设置为 1 来启用它。 这一操作必须在启动时通过 boot loader 来完成。 在内核启动之后尝试这么做是没有任何作用的。

更多信息请参阅ata(4)

11.10.1.6. SCSI_DELAY (kern.cam.scsi_delay)

SCSI_DELAY 内核配置会缩短系统启动时间。 默认值在系统启动过程中有 15 秒的迟延时间, 这是一个足够多且可靠的值。把它减少到 5 通常也能工作(特别是现代的驱动器)。 您可以在系统引导时调整引导加载器变量 kern.cam.scsi_delay 来改变它。 需要注意的是, 此处使用的单位是 毫秒

11.10.2. Soft Updates

tunefs(8) 程序能够用来很好的调整文件系统。 这个程序有很多不同的选项,但是现在只介绍 Soft Updates 的打开和关闭,这样做:

# tunefs -n enable /filesystem
# tunefs -n disable /filesystem

在文件系统被挂载之后不能用 tunefs(8) 来修改。打开 Soft Updates 的最佳时机是在单用户模式下任何分区被挂载前。

软更新(Soft Update)推荐用于UFS文件系统,因为它通过使用内存缓存,大幅提高了元数据的性能,主要是文件的创建和删除。软更新有两个缺点需要注意。第一,软更新保证了文件系统在崩溃时的一致性,但在更新物理磁盘时很容易出现几秒甚至一分钟的延迟。如果系统崩溃,未写入的数据可能会丢失。其次,软更新会推迟文件系统块的释放。如果根文件系统几乎满了,执行重大更新,如make installworld,会导致文件系统空间耗尽,更新失败。

11.10.2.1. 更多关于 Soft Update 的信息

元数据更新是对非内容数据的更新,如inode或目录。有两种传统的方法将文件系统的元数据写回磁盘。

从前,默认方法是同步更新这些元数据(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 尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。 这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。 过后他们将会被移动到正确的位置。因为纪录区很小, 磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。 另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次 (一次写到纪录区域,一次写到正确的区域)。正常情况下, 悲观的性能可能会发生。从另一方面来讲, 崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。

Berkeley FFS的开发者Kirk McKusick用软更新解决了这个问题。所有待定的元数据更新都保存在内存中,(有序的元数据更新)写入磁盘。这样做的效果是,在元数据操作较多的情况下,后面对一个项目的更新会 "捕捉 "到还在内存中且尚未写入磁盘的早期更新。一般情况下,所有的操作都是在更新写到磁盘之前在内存中进行的,并且根据数据块的位置进行排序,这样就不会在元数据之前出现在磁盘上。如果系统崩溃了,隐含的 "日志倒带 "会使所有没有写入磁盘的操作都显示为从未发生过。保持一个一致的文件系统状态,看起来是30到60秒前的状态。所使用的算法保证了所有正在使用的资源在其块和节点中都被标记为这样的状态。崩溃后,唯一发生的资源分配错误是资源被标记为 "已使用",而实际上是 "空闲"。在文件系统崩溃后,用mount -f强行挂载文件系统是安全的,可以忽略文件系统的脏状态。为了释放可能未被使用的资源,需要在以后的时间运行fsck(8)。这就是后台 fsck(8)的思路:在系统启动时,只记录文件系统的快照,之后再运行 fsck(8)。这样,所有的文件系统都可以被 "脏 "挂载,所以系统启动时以多用户模式进行。然后,后台 fsck(8)会对所有需要这样做的文件系统进行调度,以释放可能未使用的资源。不使用软更新的文件系统仍然需要通常的前台 fsck(8)

它的优点是元数据操作几乎跟非同步一样快 (也就是比需要两次元数据写操作的 logging 更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险) 和高的内存使用量。另外它有些特点需要知道。崩溃之后, 文件系统状态会落后一些。同步的方法用 fsck 后在一些地方可能产生一些零字节的文件, 这些文件在用 Soft Updates 文件系统之后不会存在, 因为元数据和文件内容根本没有写进磁盘(可能发生在运行 rm 之后)。这可能在文件系统上安装大量数据时候引发问题, 没有足够的剩余空间来两次存储所有文件。

11.11. 调校内核限制

11.11.1. 文件/进程限制

11.11.1.1. kern.maxfiles

kern.maxfiles 可以根据系统的需要适当增减。 这个变量用于指定在系统中允许的文件描述符的最大数量。 当文件描述符表满的时候, file: table is full 会在系统消息缓冲区中反复出现, 您可以使用 dmesg(8) 命令来观察这一现象。

每个打开的文件、 套接字和管道, 都会占用一个文件描述符。 在大型生产服务器上, 可能会轻易地用掉数千个文件描述符, 具体用量取决于服务的类型和并行启动的服务数量。

在早期版本的 FreeBSD 中, kern.maxfiles 的默认值, 是根据您内核配置文件中的 maxusers 选项计算的。 kern.maxfiles 这个数值, 会随 maxusers 成比例地增减。 当编译定制的内核时, 按照您系统的用途来修改这个值是个好主意。 这个数字同时还决定内核的许多预设的限制值。 有时, 尽管并不会真的有 256 个用户同时连接一台生产服务器, 但对于高负载的 web 服务器而言, 却可能需要与之类似的资源。

变量 kern.maxusers 会在系统启动时, 根据可用内存的尺寸进行计算, 在内核开始运行之后, 可以通过只读的 kern.maxusers sysctl 变量值来进行观察。 有些情况下, 可能会希望使用更大或更小一些的 kern.maxusers, 它可以以加载器变量的形式进行配置; 类似 64、 128 和 256 这样的值都并不罕见。 我们不推荐使用超过 256 的值, 除非您需要巨量的文件描述符; 根据 kern.maxusers 推算默认值的那些变量, 一般都可以在引导甚至运行时通过 /boot/loader.conf (请参见 loader.conf(5) 联机手册或 /boot/defaults/loader.conf 文件来获得相关的指导) 或这篇文档的其余部分所介绍的方式来调整。

在较早的版本中, 如果您明确地将 maxusers 设置为 0, 则系统会自动地根据硬件配置来确定这个值。[2]。 在 FreeBSD 5.X 和更高版本中, maxusers 如果不指定的话, 就会取默认值 0。 如果希望自行管理 maxusers, 则应配置一个不低于 4 的值, 特别是使用 X Window System 或编译软件的时候。 这样做的原因是, maxusers 所决定的一个最为重要的表的尺寸会影响最大进程数, 这个数值将是 20 + 16 * maxusers。 因此如果将 maxusers 设置为 1, 您就只能同时运行 36 个进程, 这还包括了 18 个左右的系统引导时启动的进程, 以及 15 个左右的, 在您启动 X Window System 时所引发的进程。 即使是简单的任务, 如阅读联机手册, 也需要启动多至九个的进程, 用以过滤、 解压缩, 并显示它。 将 maxusers 设为 64 将允许您同时执行最多 1044 个进程, 这几乎足以满足任何需要了。 不过, 如果您看在启动其它程序, 或运行用以支持大量用户的服务 (例如 ftp.FreeBSD.org) 时, 看到令人担忧的 proc table full 错误, 就应该提高这一数值, 并重新联编内核。

注意:

maxusers不能 限制实际能够登录到您系统上来的用户的数量。 它的主要作用是根据您可能支持的用户数量来为一系列系统数据表设置合理的尺寸, 以便提供支持他们所需运行的进程资源。

11.11.1.2. kern.ipc.soacceptqueue

kern.ipc.somaxconn sysctl 变量 限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。 大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 sendmail(8) 或者 Apache), 常常在它们的配置文件中有设置队列大小的选项。 大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。

11.11.2. 网络限制

The NMBCLUSTERS kernel configuration option dictates the amount of network Mbufs available to the system. A heavily-trafficked server with a low number of Mbufs will hinder performance. Each cluster represents approximately 2 K of memory, so a value of 1024 represents 2 megabytes of kernel memory reserved for network buffers. A simple calculation can be done to figure out how many are needed. A web server which maxes out at 1000 simultaneous connections where each connection uses a 6 K receive and 16 K send buffer, requires approximately 32 MB worth of network buffers to cover the web server. A good rule of thumb is to multiply by 2, so 2x32 MB / 2 KB = 64 MB / 2 kB = 32768. Values between 4096 and 32768 are recommended for machines with greater amounts of memory. Never specify an arbitrarily high value for this parameter as it could lead to a boot time crash. To observe network cluster usage, use -m with netstat(1).

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.11.2.1. net.inet.ip.portrange.*

net.inet.ip.portrange.* sysctl 变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。 这里有三个范围:一个低端范围,一个默认范围和一个高端范围。 大多数网络程序分别使用由 net.inet.ip.portrange.firstnet.inet.ip.portrange.last 控制的从 1024 到 5000 的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口, 这经常发生在运行一个高负荷 web 代理服务器的时候。 这个端口范围不是用来限制主要的例如 web 服务器进入连接或者有固定端口例如邮件传递对外连接的。 有时您可能用完了端口,那就建议适当的增加 net.inet.ip.portrange.last1000020000 或者 30000 可能是适当的值。 更改端口范围的时候也要考虑到防火墙。 一些防火墙会阻止端口的大部分范围 (通常是低范围的端口)并且用高端口进行对外连接(──)。 基于这个问题建议不要把 net.inet.ip.portrange.first 设的太小。

11.11.2.2. TCP带宽迟延(Bandwidth Delay Product)

限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。 它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。 系统将尝试计算每一个连接的带宽延迟积, 并将排队的数据量限制在恰好能保持最优吞吐量的水平上。

这一特性在您的服务器同时向使用普通调制解调器, 千兆以太网, 乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要, 特别是当您同时使用滑动窗缩放, 或使用了大的发送窗口的时候。 如果启用了这个选项, 您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试), 对于生产环境而言, 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。 然而, 需要注意的是, 这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。 这个限制特性减少了在路由和交换包队列的堵塞数据数量, 也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、 交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。但是,注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。

调整 net.inet.tcp.inflight.stab 推荐的。 这个参数的默认值是 20, 表示把 2 个最大包加入到带宽延迟积窗口的计算中。 额外的窗口似的算法更为稳定, 并改善对于多变网络环境的相应能力, 但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。 对于这些情形, 您可能会希望把这个参数减少到 15, 10, 或 5; 并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说, 3500) 来得到希望的效果。 减少这些参数的值, 只应作为最后不得已时的手段来使用。

11.11.3. 虚拟內存

11.11.3.1. kern.maxvnodes

vnode 是对文件或目录的一种内部表达。 因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。 一般而言, 这是由操作系统自行完成的, 也不需要加以修改。 但在某些时候磁盘 I/O 会成为瓶颈, 而系统的 vnode 不足, 则这一配置应被增加。 此时需要考虑是非活跃和空闲内存的数量。

要查看当前在用的 vnode 数量:

# sysctl vfs.numvnodes
vfs.numvnodes: 91349

要查看最大可用的 vnode 数量:

# sysctl kern.maxvnodes
kern.maxvnodes: 100000

如果当前的 vnode 用量接近最大值, 则将 kern.maxvnodes 值增大 1,000 可能是个好主意。 您应继续查看 vfs.numvnodes 的数值, 如果它再次攀升到接近最大值的程度, 仍需继续提高 kern.maxvnodes。 在 top(1) 中显示的内存用量应有显著变化, 更多内存会处于活跃 (active) 状态。

11.12. 增加交换空间

有时系统会需要更多的交换(Swap)空间,本章节会介绍两种增加交换空间的方式:一种是在既有的分割区或新的硬盘增加交换空间,另一种则是在既有的分割区中建立一个交换档。

要取得更多有关如何加密交换空间的信息、有那些可用的选项以及为何要做加密,可参考第 17.13 节 “对交换区进行加密”

11.12.1. 使用新硬盘或既有分割区增加交换空间

在新的磁盘上增加交换空间比起使用既有硬盘上的分割区会有较佳的效率。设定分割区与硬盘在第 17.2 节 “添加磁盘”中有说明,另外第 2.6.1 节 “设计分区布局”会讨论到分割区的配置与交换分割区大小需考察的事项。

使用swapon来增加交换分割区到系统,例:

# swapon /dev/ada1s1b

警告:

可以使用任何尚未挂载过、甚至已经有内含数据的分割区做为交换空间,但在含有数据的分割区上使用swapon会复写并清除该分割区上所有的数据,请在执行swapon之前确认真的要使用该分割区增加交换空间。

要在开机时自动加入此交换分割区,可加入以下项目到/etc/fstab

/dev/ada1s1b	none	swap	sw	0	0

请参考fstab(5)来取得在/etc/fstab中项目的说明。更多有关swapon的信息可以在 swapon(8)找到。

11.12.2. 建立交换档

These examples create a 512M swap file called /usr/swap0 instead of using a partition.

使用交换档开启交换空间前需要在核心编译或加载md(4)所需的模块,请参考第 8 章 配置 FreeBSD 内核了解有关编译自定义核心的资讯。

例 11.2. 建立交换档
  1. 建立交换档:

    # dd if=/dev/zero of=/usr/swap0 bs=1m count=512
  2. 在新档案设定适当的权限:

    # chmod 0600 /usr/swap0
  3. 加入行到/etc/fstab以让系统知道交换档的信息:

    md99	none	swap	sw,file=/usr/swap0,late	0	0

    已使用md(4)装置的md99,保留较低的装置编号供互动操作时使用。

  4. 交换空间会于系统启动时增加。若要立即增加交换空间,请参考swapon(8)

    # swapon -aL

11.13. 电源与资源管理

Written by Hiten PandyaTom Rhodes.

以有效率的方式运用硬件资源是很重要的,电源与资源管理让操作系统可以监控系统的限制,并且在系统温度意外升高时能够发出警报。早期提供电源管理的规范是进阶电源管理(Advanced Power Management,APM),APM可根据系统的使用状况来来控制电源用量。然而,使用APM要操作系统来管理系统的电源用量和温度属性是困难且没有弹性的,因为硬件是由BIOS所管理,使用者对电源管理设定只有有限的设定性与可见性,且APM BIOS是由供应商提供且特定于某些硬件平台,而操作系统中必透过APM驱动程序做为中介存取APM软件界面才能够管理电源等级。

APM有四个主要的问题。第一,电源管理是由供应商特定的BIOS来完成,与操作系统是分开的。例如,使用者可在APM BIOS设定硬盘的闲置时间值,在超过时间时BIOS可在未征得操作系统的同意下降低硬盘的转速。第二,APM的逻辑是内嵌在BIOS当中的,并且在操作系统范围之外运作,这代表使用者只能够透过刻录新的固件到ROM来修正APM BIOS中的问题,而这样的程序是危险的,若失败,可能会让系统进入无法复原的状态。第三,APM是供应商特定的技术,这代表有许多重复的工作,在一个供应商的BIOS找到的问题在其他的供应商却没有解决。最后一点,APMBIOS并没有足够的空间来实作复杂的电源管理政策或可良好调节主机用途的程序。

Plug and Play BIOSPNPBIOS)在很多情况下并不可靠,PNPBIOS是16位的技术,所以操作系统必须模拟16位才能存取PNPBIOS。FreeBSD提供了一个APM驱动程序来做APM,应可用在2000年之前所制造的系统,该驱动程序的说明于apm(4)

APM的后继者是进阶设置与电源界面(Advanced Configuration and Power Interface,ACPI)。ACPI是一套由供应商联盟所搛写出的标准,提供了硬件资源与电源管理的界面,它是操作系统直接设置与电源管理(Operating System-directed configuration and Power Management)关键的要素,提供了操作系统更多的控制方式与弹性。

本章节将示范如何在FreeBSD设定ACPI,然后提供一些如何对ACPI除错的提示以及如何提交包含除错信息的问题回报,让开发人员能够诊断并修正ACPI的问题。

11.13.1. 设定ACPI

在FreeBSD acpi(4)驱动程序预设会在系统开始时加载,且应被编译到核心当中。这个驱动程序在开机之后无法被卸载,因为系统总线会使用它做各种硬件互动。虽然如此,若系统遇到问题,ACPI还是可以被关闭,在/boot/loader.conf中设定hint.acpi.0.disabled=“1”之后重启或在加载程序提示时设定这个变数,如第 12.2.3 节 “阶段三”中的说明。

注意:

ACPIAPM不能同时存在且应分开使用,若有侦测到有另一个正在执行,要加载的后者将会中断。

ACPI可以用来让系统进入睡眠模式,使用acpiconf-s旗标再加上由15的数字。大多数使用者只需使用1(快速待命到RAM)或3(待命到RAM),选项5会执行软关机(Soft-off),如同执行halt -p一样。

其他的选项可使用sysctl来设定,请参考acpi(4)以及acpiconf(8 )以取得更多资讯。

11.13.2. 常见问题

所有符合 ia32 (x86) 和 amd64 (AMD) 体系结构的现代计算机都有ACPI。全标准具有多种功能,包括CPU性能管理、电源平面控制、热区、各种电池系统、嵌入式控制器和总线枚举。大多数系统实施不到完整的标准。例如,桌面系统通常只实现总线枚举,而笔记本电脑可能也有冷却和电池管理支持。笔记本电脑也有挂起和恢复,与它们相关的复杂性。

符合 ACPI 的系统中有许多组件。 BIOS 和芯片组制造商提供一些固定的表 (例如, FADT) 在存储器中, 以提供类似 APIC 映射 (用于 SMP)、 配置寄存器、 以及简单的配置值等等。 另外, 一个字节代码 (bytecode) 表 (系统区别描述表 DSDT) 则提供了通过树状命名空间来指定设备及其功能的方法。

ACPI 驱动必须要处理固定表, 实现字节码解释器, 并修改驱动程序和内核, 以接受来自 ACPI 子系统的信息。 对于 FreeBSD, Intel® 提供了一个解释器 (ACPI-CA), 它在 Linux 和 NetBSD 也可以使用。 ACPI-CA 源代码可以在 src/sys/contrib/dev/acpica 找到。 用于在 FreeBSD 中允许 ACPI-CA 正确运转的代码则在 src/sys/dev/acpica/Osd。 最后, 用于实现 ACPI 设备的驱动可以在 src/sys/dev/acpica 找到。

要让 ACPI 正常工作, 它的每一部分都必须工作正常。 下面是一些常见的问题, 按照出新的频繁程度排序, 并给出了一些绕过或修正它们的方法。如果无法解决问题,请按照第 11.13.4 节 “获取和提交调试信息”里的说明提交 bug 报告。

11.13.2.1. 鼠标问题

某些时候, 唤醒操作会导致鼠标不再正常工作。 已知的绕过这一问题的方法, 是在 /boot/loader.conf 文件中添加 hint.psm.0.flags="0x3000" 设置。 如果这样做不能解决问题, 请考虑按前面介绍的方法提交问题报告。

11.13.2.2. 待机/唤醒

ACPI 有三个挂起到 RAM STR )状态, S1 - S3 和一个挂起到磁盘状态( STD ),称为 S4 STD 可以用两种不同的方式实现。在 S4 BIOS 是由 BIOS -assisted 挂起到磁盘, S4 OS 完全由操作系统来实现。正常状态下的系统是接通电源但没启动操作系统,称为soft off S5 )。

可以使用 sysctl hw.acpi 来查看与休眠有关的项目。 这里是我的 Thinkpad 上得到的结果:

hw.acpi.supported_sleep_state: S3 S4 S5
hw.acpi.s4bios: 0

这表示我可以使用 acpiconf -s 来测试 S3S4OS, 以及 S5。 如果 s4bios 是一 (1), 则可以使用 S4BIOS 来代替 S4 OS

当测试休眠/唤醒时, 从 S1 开始, 如果它被支持的话。 这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。 没有人实现 S2 但如果您有它的支持, 则应该和 S1 类似。 下一件值得尝试的是 S3。 这是最深的 STR 状态, 并需要一系列驱动的支持才能够正常地重新初始化您的硬件。

休眠和唤醒操作最常见的问题是某些设备驱动程序不会保存、 恢复或正确地重新初始化其固件、 寄存器或设备内存。 尝试调试这些问题时, 首先可以尝试:

# sysctl debug.bootverbose=1
# sysctl debug.acpi.suspend_bounce=1
# acpiconf -s 3

这个测试会模拟休眠和恢复过程而不真的进入 S3 状态。 有时, 您会用这种方式很容易地抓住问题 (例如, 丢失固件状态、 设备 watchdog 超时, 以及一直重试等)。 注意系统不会真的进入 S3 状态, 这意味着这些设备可能不会掉电, 而许多设备在完全不提供休眠和恢复方法时仍可正常工作, 而不像使用真的 S3 状态那样。

较难的情况则需要更多的硬件, 例如用于串口控制台的串口/线, 以及用于 dcons(4) 的火线口/线和内核调试技能。

为了帮助隔离问题, 请在内核中删去尽可能多的驱动。 如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。 通常预编译的驱动程序如 nvidia.ko、 X11 显示驱动, 以及 USB 的问题最多, 而以太网卡的驱动则通常工作的很好。 如果您能够通过加载和卸载驱动使系统正常工作, 您可以通过将适当的命令放到 /etc/rc.suspend/etc/rc.resume 来将这个过程自动化。 在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。 另外您还可以将 hw.acpi.reset_video 设置为零 (0), 如果您的显示在唤醒之后显得很混乱。 此外您还可以尝试更长或更短的 hw.acpi.sleep_delay 值看看是否有所助益。

另一件值得一试的事情是使用一个比较新的包含 ACPI 支持的 Linux 发行版来试试看他们的 休眠/唤醒 功能是否在同样的硬件上能够正常工作。 如果在 Linux 下正常, 则很可能是 FreeBSD 驱动程序的问题, 而隔离问题并找到存在问题的驱动有助于解决它。 需要注意的是 ACPI 的维护人员通常并不维护其他驱动 (例如 声音、 ATA, 等等) 因此如果最终发现是驱动的问题最好还是发到 freebsd-current 邮件列表并发给驱动程序的维护者。 如果您喜欢冒险, 则可以加一些 printf(3) 到有问题的驱动中, 以找到它的恢复功能发生问题的位置。

最后, 试试看禁用 ACPI 并代之以启用 APM。 如果 休眠/唤醒 能够在 APM 下正常工作, 使用 APM 可能会更好, 特别是对于较老的硬件 (2000年以前)。 硬件制造商需要一些时间来让老硬件的 ACPI 工作正常, 而 ACPI 的问题十之八九是 BIOS 中的毛病引发的。

11.13.2.3. 系统无响应

绝大多数系统停止响应是由于未能及时响应中断或发生了中断风暴导致的。 芯片组有很多问题最终会溯源到 BIOS 如何在引导系统之前配置中断, APIC (MADT) 表的正确性, 以及 系统控制中断 (SCI) 如何路由。

通过察看 vmstat -i 的输出中包括 acpi0 的那一行可以区分中断风暴和未能及时响应中断。 如果每秒计数器增长的速度多于一两个, 则您是遇到了中断风暴。 如果系统停止了响应, 您可以尝试停止内核并进入 DDB (在控制台上按 CTRL+ALT+ESC) 并输入 show interrupts

处理中断问题的救命稻草是尝试禁用 APIC 支持, 这是通过在 loader.conf 中加入 hint.apic.0.disabled="1" 完成的。

11.13.2.4. 崩溃

崩溃对于 ACPI 是比较罕见的情况, 如果发现, 我们将会非常重视并很快修复它。 您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话) 的操作并获取一份调用堆栈。 请启用 options DDB 并设置串行控制台 (参见 第 26.6.4 节 “从序列线路(Serial Line)进入DDB除错程序”) 或配置一个 dump(8) 分区。 您将在 DDB 中通过 tr 得到调用堆栈。 如果您只能用手抄的方法记录它, 一定要记下头五 (5) 行和最后五 (5) 行。

然后, 尝试通过在启动时禁用 ACPI 来隔离故障。 如果这样做能够正常工作, 请通过设置 debug.acpi.disable 的那组数值来隔离具体是哪个 ACPI 子系统的问题。 请参见 acpi(4) 联机手册中给出的那些例子。

11.13.2.5. 系统在待机或关机后仍开机

首先请尝试在 loader.conf(5) 中设置 hw.acpi.disable_on_poweroff=0。 这将让 ACPI 不再在关机过程中禁用一些事件。 基于同样的原因, 一些系统需要把这个值设置为 1 (这是默认值)。 这通常能够修复在休眠或关机时立即再次启动的问题。

11.13.2.6. BIOS含有有问题的Bytecode

某些BIOS供应商提供不正确的或错误的字节码。这通常表现为内核控制台消息,如下所示:

ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
(Node 0xc3f6d160), AE_NOT_FOUND

通常,这些问题可以通过将BIOS更新到最新版本来解决。大多数控制台消息是无害的,但如果存在其他问题,如电池状态不工作,这些消息是开始查找问题的好地方。

11.13.3. 覆盖预设的AML

BIOS 字节码,又被称为 ACPI 机器语言 ( AML ),由ASL(ACPI Source Language)编译生成。可以在DSDT 表中找到 AML。

FreeBSD 的目标是让所有人能够在不进行任何修改的情况下正常使用ACPI。常见错误(由 BIOS 厂商引起)的解决办法仍在探索中。Microsoft® 的解释器 (acpi.sysacpiec.sys) 没有严格检查是否符合 ACPI 标准,FreeBSD 开发人员将继续寻找并记录 Microsoft® 的解释器允许的 ACPI 非标准行为,并将其移植到 FreeBSD 上,让 FreeBSD 可以在不修复 ASL 的情况下工作。

为了修复错误,您需要提取您系统中的 ASL。可以使用 acpidump-t选项提取 ASL。使用 -d选项将其反编译成 AML。使用以下代码将 ASL 提取到my.asl文件中:

# acpidump -td > my.asl

某些版本的AML会假定用户使用Windows®,为解决此问题,请在/boot/loader.conf中加上hw.acpi.osname="Windows 2009"。将Windows 版本替换为 ASL 中列出的 Windows® 版本。

一些解决方案可能需要修改my.asl。修改完成后需要使用以下命令将其编译城AML。一些警告可以忽略,但编译过程中出现的错误不可忽略,这些错误可能让 ACPI 工作异常。

# iasl -f my.asl

使用-f忽略编译中的错误强制创建AML。一些错误,比如没有返回状态,可以被 FreeBSD 解释器自动修复。

iasl默认输出的文件名是DSDT.aml。若需将修改过的 DSDT 文件加载到内存中,以替换 BIOS 中的有错的 DSDT,请像下面这样修改/boot/loader.conf

acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/DSDT.aml"

确认DSDT.aml已被复制到/boot,然后重启系统。如果错误被修复,请使用老ASL和新ASL创建diff(1),并将其发送到freebsd-acpi,这样,FreeBSD 开发者就能在 acpica中修复异常行为。

11.13.4. 获取和提交调试信息

Written by Nate Lawson.
With contributions from Peter SchultzTom Rhodes.

ACPI 驱动程序提供了非常灵活的调试机制。 这允许您指定一组子系统, 以及所需要的详细信息。 需要调试的子系统可以按 layers(层) 来指定, 并分为 ACPI-CA 组件 (ACPI_ALL_COMPONENTS) 和 ACPI 硬件支持 (ACPI_ALL_DRIVERS)。 调试输出的详细程度可以通过 level(详细度) 来指定, 其范围是 ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。 level 是一个位掩码因此可以一次设置多个选项, 中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出, 如果它太长以至于冲掉了控制台消息缓冲的话。 不同的层和输出详细度的完整列表可以在 acpi(4) 联机手册中找到。

调试输出默认并不开启。 要起用它, 您需要在内核设置中添加 options ACPI_DEBUG, 如果您的内核中编入了 ACPI 的话。 您还可以在 /etc/make.conf 中加入 ACPI_DEBUG=1 来在全局起用它。 如果它只是模块, 您可以用下面的方法来重新编译 acpi.ko

# cd /sys/modules/acpi/acpi && make clean && make ACPI_DEBUG=1

安装 acpi.ko/boot/kernel and add your 并把所需的详细度和层在 loader.conf 中指定。 这个例子将启用所有 ACPI-CA 组件以及所有 ACPI 硬件驱动 (CPULID, 等等) 的消息。 只输出错误信息, 也就是最低的详细度:

debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
debug.acpi.level="ACPI_LV_ERROR"

如果您需要的信息是由某个特定的事件触发的 (比如说, 休眠之后的唤醒), 您可以不修改 loader.conf 而转而使用 sysctl 来在启动和为那个事件准备系统之后再指定层和详细度。 这些 sysctl 的名字和 loader.conf 中的一致。

一旦收集到调试信息, 就可以将其发送到freebsd-acpi,以便 FreeBSD ACPI 维护者找出问题根源,并给出解决方案。

注意:

在将调试信息提交到此邮件列表之前,请确保安装了最新版本的BIOS,如果可用,则确保安装嵌入式控制器固件版本。

提交问题报告时,请包括以下信息:

  • 错误行为的描述,包括系统类型、模型以及导致出现 Bug 的任何内容。如果 Bug 是新的,则尽可能准确地记下该 Bug 何时开始发生。

  • 运行boot -v后, dmesg的输出,包括此 Bug 产生的所有输出。

  • 如果禁用ACPI有助于解决问题。提交在禁用ACPI的情况下dmesg的输出。

  • 来自sysctl hw.acpi的输出 。这将列出系统提供的功能。

  • ASL 文件的下载地址。请不要直接发送 ASL 文件到邮件列表中,ASL 文件体积太大。使用以下命令生成 ASL 文件:

    # acpidump -dt > name-system.asl

    name替换为登入名并将system替换为制造商/型号,例如njl-FooCo6000.asl

绝大多数 FreeBSD 开发者都会关注FreeBSD-CURRENT 邮件列表,但您还需要将问题发送到 freebsd-acpi 让相关开发者看到问题。如果 bug 隐藏比较深,您还需要提交相关错误报告。发送 PR 时请包含上述所有信息,这有助于让开发者更快的了解错误情况。在发送 PR 前请先发送邮件到freebsd-acpi,看看以前是否有相同情况。

11.13.5. 参考文献

有关ACPI的更多信息,请访问:



[2] 自动调整算法会将 maxusers 设置为与主存的数量一样, 或者取其下限 32 或上限 384。

第 12 章 FreeBSD开机程序

12.1. 简介

从开启电脑到加载操作系统的这段流程称为开机程序(Bootstrap process)或开机(Booting)。FreeBSD的开机程序提供大量的客制化弹性,包含可选择安装在同电脑的其他的操作系统、不同版本的操作系统或不同核心的操作系统的功能。

本章会详细说明可以设定的选项。示范如何自定义FreeBSD开机流程,包含其中所有会发生的事,直到启动FreeBSD核心、侦测装置及启动init(8)。这些事会发生在开机信息的文字颜色会从亮白变成灰色之间。

在阅读本章之后,您会了解:

  • FreeBSD开机系统的元件以及它们如何互动。

  • FreeBSD开机程序中各元件可使用的选项,用来控制开机程序。

  • 如何设定自定义的开机启动画面(Splash screen)。

  • 设定Device Hints的基础。

  • 如何开机进入单人及多人模式以及如何正确关闭FreeBSD系统。

注意:

本章仅说明FreeBSD在x86及amd64系统上执行的开机流程。

12.2. FreeBSD开机程序

打开电脑并启动操作系统的这个动作呈现了一个有趣的困境。照道理,电脑在启动操作系统之前并不知道要如何做任何事情,这些事情之中包括从磁盘执行程序。如果电脑无法在没有操作系统的情况下执行程序,而操作系统的程序本身又在磁盘上,那么操作系统要如何启动呢?

这个问题如同The Adventures of Baron Munchausen一书中的一个角色掉进了洞里,他抓住了靴子上的拔靴带(Bootstrap)才把自己拉了出来,因此在早期电脑领域用bootstrap一词来指加载操作系统的机制,后来被缩短为booting

在x86硬件上,基本输入/输出系统(Basic Input/Output System,BIOS)负责加载操作系统。BIOS会找到硬盘上的主开机记录区(Master Boot Record,MBR),该记录区必须位于磁盘上的特定位置。BIOS有足够的知识可以加载并执行这个MBR,并且假设这个MBRBIOS的协助下可以完成接下来加载操作系统的工作。

注意:

FreeBSD在较旧的MBR标准与较新的GUID分割区表(GUID Partition Table,GPT)上都能够开机(Booting)。GPT磁盘分割通常会在有支持统一可延伸固件界面(Unified Extensible Firmware Interface,UEFI)的电脑上找到。不论如何,FreeBSD即使在只有传统BIOS的机器上,也可以使用gptboot(8) GPT分割区开机。直接使用UEFI开机的开发工作正在进行中。

MBR中的程序通常会称作开机管理程序(Boot manager),特别是那些会与使用者互动的程序。开机管理程序通常会另一部份的程序会存放于磁盘的第一个磁道或文件系统。开机管理程序的例子有标准FreeBSD开机管理程序boot0又称Boot Easy以及Grub常用于各种Linux®发行版。

若只有安装一个操作系统,MBR会搜寻磁盘上第一个可开机的(使用中)切割区(Slice),然后执行在该切割区上的程序来加载剩下的操作系统。当有多个操作系统存在时,可以安装可显示操作系统清单的开机管理程序,以让使用者可以选择要启动的操作系统。

剩馀的FreeBSD开机系统分成三个阶段,第一个阶段只知道如何让电脑进入特定状态并执行第二阶段,第二个阶段在执行第三阶段之前会做的事比较多一点,第三个阶段会完成加载操作系统的工作。把工作分成三个阶段的原因是MBR有限制在阶段一与阶段二能够执行程序的大小。将这些工作连接在一起让FreeBSD能够提供更有弹性的加载程序。

核心会接着开始侦测装置并初始化这些装置供使用。核心开机程序完成之后,核心便会传送控制权给使用者程序init(8),这个程序会确保磁盘在可以使用的状态,然后启动使用者层级的资源设置来挂载文件系统、设定网络卡以能够联机网络、启动那些被设定在开机时要启动的程序。

本章节将更详细介绍这些阶段并示范如何与FreeBSD开机程序互动。

12.2.1. 开机管理程序

有时会称在MBR中的开机管理程序为开机程序的第零阶段(Stage zero),FreeBSD预设会使用boot0开机管理程序。

由FreeBSD安装程序所安装的MBR便是以/boot/boot0为基础。boot0的大小与容量被限制在446个位元组是由于切割表与0x55AA识别码位于MBR的最末端。若安装多个操作系统使用boot0,则会在开机时显示如下示例的信息:

例 12.1. boot0屏幕截图
F1 Win
F2 FreeBSD

Default: F2

其作他作业统若在FreeBSD之后才安装则会覆盖现有的MBR,若这件事发生了,或者要使用FreeBSD MBR取代现有的MBR可使用以下指令:

# fdisk -B -b /boot/boot0 device

其中device开机磁盘,例如第一个IDE磁盘为ad0,第二个IDE控制器的第一个IDE磁盘为ad2,第一个SCSI磁盘为da0。要建立自定义的MBR设定请参考boot0cfg(8)

12.2.2. 阶段一与阶段二

概念上,第一与第二个阶段均为磁盘上同一个区域上同一个程序的一部份,由于空间上的限制,它们被分成两部份,但是会一并安装。它们会由FreeBSD安装程序或bsdlabel/boot/boot复制而来。

这两个阶段均位于文件系统之外,在开机切割区的第一个磁道,从第一个磁盘扇区(Sector)开始,这个位置便是boot0或其他开机管理程序所会储存的地方,并会寻找可以执行的程序以继续开机程序。

第一个阶段的boot1非常的简单,因为它只能有512字节的大小。它只能认得储存切割区信息的FreeBSD bsdlabel以及寻找并执行boot2

阶段二boot2稍微复杂一点,能够理解FreeBSD文件系统来搜寻档案。它可以提供一个简单的界面来选择要执行的核心或加载程序。它所执行的加载程序(loader)更复杂并能读取开机配置文件。若开机程序在阶段二中断,则会显示以下的互动画面:

例 12.2. boot2屏幕截图
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:

要更换已安装的boot1boot2可使用bsdlabel,其中diskslice是要开机的磁盘与切割区,例如ad0s1代表第一个IDE磁盘的第一个切割区:

# bsdlabel -B diskslice

警告:

若只使用磁盘名称,如ad0bsdlabel便会以危险专用的模式来建立磁盘,而不会建立任何分割区。这个可能与预期的动作不同,所以在按下Return键之前请再次确认diskslice

12.2.3. 阶段三

loader是三阶段开机程多的最后一个阶段,加载程序位于文件系统之中,通常在/boot/loader

loader主要目地是利用拥有更复杂指令集的强大直译器做为基础的内置指令集提供一个互动的方式来做设定。

在初始化的过程中,loader会侦测Console与磁盘,并找出可以用来开机的磁盘。在由Script或互动输入使用者指令的地方会设定相对的变数并启动直译器。

loader接着会读取/boot/loader.rc,这个程序预设又会读取/boot/defaults/loader.conf来设定合理的变数预设值以及读取/boot/loader.conf来对这些变数做本地的更改。loader.rc接着会依这些变数来运作,读取选择模块与核心。

最后,预设情况下loader会待候键盘输入10秒钟,若没有被中断的话会接着启动核心。若被使用者中断,则会向使用者显示提示字元,此时使用可以使用指令集来调整变数、卸载所有模块、加载模块,然后最后开机或重启。表 12.1 “加载程序内置指令”中列出了最常使用的loader指令。要完整了解所有可用的指令,请参考loader(8)

表 12.1. 加载程序内置指令
变量描述
autoboot seconds若在指定时间(秒)内没有中断,会继续启动核心。此指令会显示倒数,预设的时间为10秒钟。
boot [-options] [kernelname]使用任何指定的选项或核心名称立即启动核心,要由指令列指定核心名称必须先执行unload,否则会使用先前加载过的核心。若kernelname不是完整的路径则会搜寻/boot/kernel/boot/modules底下。
boot-conf依据指定的变数及最常用的kernel再做一次相同的自动模块设置。这只有在执行unload之后,尚未变更变数之前方可使用。
help [topic]显示自/boot/loader.help取得的说明信息。若指定的主题为index则会显示所有可用的主题。
include filename读取指定的档案并直译每一行。若有错误则会立即中止include
load [-t type] filename由指定的档案名称加载核心、核心模块或指定类型的档案。任何于filename之后的参数都会被传递到该档案。若filename不是绝对位置则会搜寻/boot/ kernel/boot/modules底下。
ls [-l] [path]显示指定路径中的档案,若未指定路径则会显示根目录中的档案。若有指定-l,则会连档案大小一同显示。
lsdev [-v]列出所有的装置,这些装置可能可以用来加载模块。若有指定-v则会显示更详细的信息。
lsmod [-v]显示已加载的模块。若有指定-v则会显示更详细的信息。
more filename显示指定的档案,并于每LINES行显示后会暂停。
reboot立即重新启动系统。
set variable, set variable=value设定指定的环境变数。
unload移除所有已加载的模块。

这里有一些loader用法的实务示例。要使用一般的核心开机进入单使用者模式(Single-user mode)可:

boot -s

要卸载一般的核心与模块,然后加载先前或另一个指定的核心可:

unload
load kernel.old

使用kernel.GENERIC来代表安装程序使用的预设核心,或kernel.old来代表在系统升级之前或设定自定义核心前安装的核心。

使用以下指令来使用另一个核心加载一般的模块:

unload
set kernel="kernel.old"
boot-conf

要加载一个已自动化的核心设置Script可:

load -t userconfig_script /boot/kernel.conf

12.2.4. 最终阶段

loader或由会绕开loaderboot2加载核心之后,加载程序便会检查是不有使用任何开机旗标,并根据需要调整开机的方式。表 12.2 “开机时核心互动参数”列出了常用的开机旗标,请参考boot(8)取得更多其他开机旗标的信息。

表 12.2. 开机时核心互动参数
选项描述
-a核心初始化时,会询问要挂载为根文件系统的装置。
-CCDROM做为根文件系统开机。
-s开机进入单使用者模式。
-v核心启动时提供更多详细信息。

一旦核心完成开机程序后,便会传送控制权给使用者程序init(8),该程序位于/sbin/init或在loader中的init_path变数所指的程序路径。这是开机程序的最后一个阶段。

开机程序会确保系统上的文件系统的一致性(Consistency),若UFS文件系统不一致且fsck无法修时,init会让系统进入单使用者模式,以让系统管理者能够直接解决问题,否则系统会开机进入多使用者模式。

12.2.4.1. 单使用者模式

使用者可以在开机时指定-s或在loader设定boot_single变数进入这个模式。也可以透过在多使用者模式执行shutdown now进入此模式。进入单使用者模式时会出现此信息:

Enter full pathname of shell or RETURN for /bin/sh:

若使用者按下Enter,系统便会进入预设的Bourne shell。要指定使用其他的Shell则输入该Shell的完整路径。

单使用者模式通常用来修复因文件系统不一致或开机配置文件发生错误造成的无法开机,也可以用来重设遗忘的root的密码,因为在单使用者模式会给予对本地系统及配置文件完整的存取权。在这个模式下没有网络功能。

虽然单使用者模式对修复系统很有帮助,但若系统放在不安全的场所便会有安全上的风险。预设,开机进入单使用者模式后,任何能够存取实体主机的使用者便拥有系统的完整控制权。

若在/etc/ttys系统console更改为insecure,系统便会在初始化单使用者模式前先询问root的密码。这可增加一定程度的安全性,但便无法在忘记root密码时重设密码。

例 12.3. 在/etc/ttys设定不安全的Console
# 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)console代表对Console的实体安全性评价为不安全(insecure),所以只有知道root密码的人可以使用单使用者模式。

12.2.4.2. 多使用者模式

init正常找到文件系统或在单使用者模式的使用者完成了操作并输入exit离开单使用者模式,系统便会进入多使用者模式,在这个模式便会开始系统的资源设置。

资源设置系统(Resource configuration system)会从/etc/defaults/rc.conf读取设定预设值以及从/etc/rc.conf读取系统特定的设定,接着会继续挂载系统列于/etc/fstab的文件系统,也会启动网络服务、其他的系统Daemon,然后执行本地已安装套件的启动Script。

要了解更多有关资源设置系统,请参考rc(8)以及查看位于/etc/rc.d的Script。

12.3. 设定开机启动画面

Contributed by Joseph J. Barbish.

正常FreeBSD系统开机会在Console显示以一系列信息来表示开机进度。开机启动画面(Boot splash screen)是另一种可以把所有开机侦测与服务启动信息隐藏的开机画面,但即使开启了启动画面,仍有有少数的开机加载程序的信息,如:开机选项菜单以及倒数时间的提示,仍会在开机时显示。在开机程序时可以按下键盘上的按键来关闭显示中的启动画面。

FreeBSD有两种基本的环境可以使用,一种是预设的传统虚拟Console指令列环境,在系统完成开机之后,便会显示Console登入提示。另一种环境则是设定好的图型化环境,请参考第 5 章 X Window系统以取得更多有关如何安装与设定图型化显示管理程序与图型化登入管理程序的信息。

系统开机之后,启动画面预设会作为萤幕保护程式,一段时间未使用便会显示启动画面,并且会循环更改图像的亮度,从明亮到非常暗,然后再继续循环。启动萤幕保护程式的设定可在/ etc/rc.conf增加一行saver=来更改。有许多内置的萤幕保护程式可用,在splash(4)中有说明。saver=的选项只会套用至虚拟Console,对图型化显示管理程序并不会有任何影响。

从 package 或 ports 安装 sysutils/bsd-splash-changer 后,系统启动时将从集合中随机显示图像。启动界面支持显示位图(.bmp),ZSoft PCX.pcx)或 TheDraw(.bin)格式。.bmp.pcx.bin需放在根分区下,例如 /boot。开机画面的分辨率必须低于320*200,这样才能在标准VGA适配器下显示图片对于256色和320×200像素或更低的默认引导显示分辨率,请将以下行添加到/boot/loader.conf。将splash.bmp替换为要使用文件的名字:

splash_bmp_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bmp"

要使用PCX档则可替换位图档:

splash_pcx_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.pcx"

若要改使用https://en.wikipedia.org/wiki/TheDraw格式的ASCII图可:

splash_txt="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bin"

其他有用的loader.conf选项还有:

beastie_disable="YES"

这个会关闭开机选项菜单的显示,但倒数计时提示仍会在。即使关闭了开机选项菜单,在倒数计时提示时输入选择的选项还是会启动对应的开机选项。

loader_logo="beastie"

这将用彩色 beastie 徽标替换显示在boot options(引导选项)菜单右侧的默认FreeBSD 标志。

要取得更多资讯,请参考splash(4)loader.conf(5)以及vga(4)

12.4. 装置提示

Contributed by Tom Rhodes.

在一开始系统启动时,开机loader(8)会读取device.hints(5),这个档中储存了核心开机信息,即变数,有时我们又会称其为装置提示(Device hints)。这些装置提示(Device hints)会传送给装置驱动程序做装置的设置使用。

装置提示也可在阶段3开机加载程序提示时指定,如第 12.2.3 节 “阶段三”中的示范,其变数也可以使用set增加、使用unset移除、使用show检视,也可覆盖设定在/boot/device.hints的变数,但在开机加载程序输入的装置提示并不是永久有效的,在下一次重启久后便会失效。

一旦系统开机后,便可使用kenv(1)来列出所有的变数。

/boot/device.hints的语法为一个变数一行,使用井字号#做为注释符号,每一行的结构如下:

hint.driver.unit.keyword="value"

在阶段3开机加载程序的语法则为:

set hint.driver.unit.keyword=value

其中driver为装置驱动程序名称、unit为装置驱动程序单位编号及keyword为提示关键字,关键字由以下选项所组成:

  • at:指定装置所连接的总线(Bus)。

  • port:指定要使用的I/O开始位置。

  • irq:指定要使用的中断请求编号。

  • drq:指定DMA频道编号。

  • maddr:指定装置所使用的实体內存位置。

  • flags:设定提供给装置的各种旗标位。

  • disabled:若设为1则可关闭该装置。

由于装置驱动程序可能会接受或请求更多未列于此处的提示,建议先阅读驱动程序的操作手册。要取得更多资讯请参考device.hints(5)kenv(1)loader.conf(5)以及loader(8)

12.5. 关机程序

在使用shutdown(8)控制关闭时,init(8)会尝试执行/etc/rc.shutdown Script接着传送TERM信号给所有的程序,然后传送KILL信号给未在时间内中止的程序。

要在支持电源管理的构架与系统关闭FreeBSD主机电源,可使用shutdown -p now来立即关闭电源,要重新启动FreeBSD系统可使用shutdown -r now。操作人必须为root或为operator的成员才可执行shutdown(8),拥有这些身份的人也可使用halt(8)reboot(8),参考这些指令与shutdown(8)的操作手册来取得更多资讯。

要修改群组成员可参考第 3.3 节 “基础账户管理”

注意:

电源管理需要以加载acpi(4)模块或将其静态编译至自定义核心中。

第 13 章 安全性

Rewritten by Tom Rhodes.

13.1. 简介

不论实体或虚拟,安全性这个主题大到有整个产业围绕着它,上百个标准案例已经被用来搛写如何确保系统与网络的安全性。身为FreeBSD必须了解如何避免攻击与入侵。

在此章会讨论几个基本原理及技术。FreeBSD系统的安全性有许多层面,且有许多第三方工具可以用来增加安全性。

读完本章节,你将会知道:

  • 基础FreeBSD系统安全概念。

  • FreeBSD中的几种加密(Crypt)机制。

  • 如何设定一次性密码认证。

  • 如何设定inetd(8)中的TCP Wrapper

  • 如何在FreeBSD设定Kerberos

  • 如何设定IPsec并且建立VPN

  • 如何在FreeBSD 使用和配置 OpenSSH

  • 如何使用文件系统ACL

  • 如何使用pkg来稽查从Port套件集安装的第三方软件套件。

  • 如何利用FreeBSD安全报告。

  • 什么是程序追踪(Process Accounting)以及如何在FreeBSD开启。

  • 如何使用登入类别或资源限制数据库控制使用者资源。

在阅读这个章节之前,您应当:

  • 了解FreeBSD基础及网络概念。

其他的安全性议题会在本操作手册的其他处说明。例如强制访问控制(Mandatory Access Control,MAC)会在第 15 章 强制访问控制讨论及网络防火墙会在第 30 章 防火墙讨论。

13.2. 介绍

保安是每个人的责任,任何系统中的弱点都可让入侵者取得对关键信息的存取权并导致整个网络的浩劫。信息安全的其中一个核心原则便是CIA三字诀,代表着信息系统的机密性(Confidentiality)、完整性(Integrity)以及可用性(Availability)。

CIA三字诀是电脑安全的基石,就如同客户与使用者期望他们的数据得到保护一样重要。例如,一个客户会期望他们的信用卡信息被安全的保存(机密性)、他们的订单不会在私底下被窜改(完整性)以及他们随时可以存取他们的订单信息(可用性)。

要提供CIA,安全专家会应用防御深度的策略。防御深度的概念是增加数个保全阶层来避免单一阶层失效便导致整个安全系统瓦解。例如,系统管理者不能直接打开防火墙与评价网路或系统的安全性,还要同时稽查帐号、检查Binary的完整性与确保未被安装恶意工具。要执行有效的保安策略,必须了解威胁以及如何抵御威胁。

什么威胁影响到电脑安全性?威胁并不仅限于在远端尝试未经授权存取系统的远端攻击者,威胁也包含员工、恶意软件、未经许可的网络装置、天然灾害、安全性漏洞甚至是公司竞争对手。

系统与网络可以被未经授权存取,有时是因为意外,或是因远端攻击者,或在某些案例中,是因商业间谍或者前员工。做为使用者,重要的是做好防范准备以及当有失误造成安全漏洞能够承认并回报可能的问题给安全团队。做为管理者,重要的是了解威胁并准备在发生时能够减缓威胁。

当要应用保安到系统上时,建议由基本帐号以及系统设定开始保全,接着确保网络层,使其遵守系统政策以及组织的安全程序。许多组织已经有涵盖科技装置设置的安全性政策,该政策应包含工作站、台式机、行动装置、手机、上线服务器、开发服务器的安全设置。在大多数案例中,也都已经有标准操作程序(SOP),当有疑虑时,请向安全团队咨询。

简介接下来的部份将说明如何在FreeBSD系统上执行这些基础的安全设置。本章接下来的部份将介绍在FreeBSD系统执行安全性政策时会用到的特定工具。

13.2.1. 防止登入

要确保一个系统的安全最好的起点便是做好帐号的稽查,确保root使用了一个强而有力的密码,并这个密码未在其他地方使用过,然后关闭任何无须登入存取权的帐号。

要关闭帐号的存取权登入有两种方法,第一种是锁定帐号,以下示例会锁定toor帐号:

# pw lock toor

第二种方法是通过将 shell 更改为/usr/sbin/nologin来阻止登录访问。只有超级用户可以为其他用户更改 shell:

# chsh -s /usr/sbin/nologin toor

/usr/sbin/nologin shell可以避免系统分配Shell给尝试登入的使用者。

13.2.2. 帐号升级授权

在有一些案例,需要与其他使用者共享系统管理权限,FreeBSD有两种方式可以处理这种情况。第一种,也是较不建议的方式,是与wheel群组的成员共享root的密码,这种方式使用者可以在需要超级使用者的存取权时输入su然后输入wheel的密码,在完成需要管理存取权的指令之后,使用应输入exit离开。要加入使用者到这个群组,可编辑/ etc/group然后加入该使用者到wheel项目的最后,使用者必须以逗号字元分隔并不可有空白。

第二种方式,也是较建议的方式,安装security/sudo套件或Port来提升权限。这个软件提供了额外的稽查、更细微的使用者控制,然后可以设定锁定使用者只能执行特定需权限的指令。

在安装之后,使用visudo来编辑/usr/local/etc/sudoers。这个示例会建立新webadmin群组,并加入trhodes帐号到该群组,然后设定该群组可重新启动apache24的存取权:

# pw groupadd webadmin -M trhodes -g 6000
# visudo
%webadmin ALL=(ALL) /usr/sbin/service apache24 *

13.2.3. 密码编码方式

密码是信息技术的必要之恶,当必须使用密码时,应要有复杂且强大的哈希机制来加密储存在密码数据库中的密码。FreeBSD支持DESMD5SHA256SHA512以及Blowfish哈希算法于其crypt()程序库。预设使用SHA512,不建议改成更不安全的哈希算法,但可改成更安全的Blowfish算法。

注意:

Blowfish不是AES的一部份且不符合任何联邦信息处理标准(Federal Information Processing Standards,FIPS),在某些环境可能不会允许使用这种加密方式。

要知道目前用何种哈希算法来加密某位使用者密码,超级使用者可以检视在FreeBSD密码数据库中该使用者的哈希,每个哈希的一开始便会以符号标示其用来加密密码所使用的哈希机制。若使用DES则开始不会有任何符号,而MD5的符号则是$SHA256SHA512的符号是$6$,Blowfish的符号是$2a$。在以下例子中dru的密码使以预设的SHA512算法加密,因为其哈希的开始为$6$。注意,该加密过的哈希,不是原来的密码,会储存于密码数据库中:

# grep dru /etc/master.passwd
dru:$6$pzIjSvCAn.PBYQBA$PXpSeWPx3g5kscj3IMiM7tUEUSPmGexxta.8Lt9TGSi2lNQqYGKszsBPuGME0:1001:1001::0:0:dru:/usr/home/dru:/bin/csh

哈希机制是设定在该使用者的登入类别(Login class),以此为例,该使用者属于default登入类别,且哈希算法是以下行设定在/etc/login.conf

        :passwd_format=sha512:\

要更改算法为Blowfish,可修改该行如下:

        :passwd_format=blf:\

然后依第 13.13.1 节 “设置登入类别”中所描述的方式执行cap_mkdb /etc/login.conf。注意,这个动作不会影响任何已存在的密码哈希,但这代表必须要求所有使用者执行passwd来更改其密码才有办法重新加密所有密码。

针对远端登入,应使用双重认证(Two-factor authentication),举例来说您同时要有某样东西,如:钥匙,以及知道某个信息,如:密码。自从OpenSSH是FreeBSD基础系统的一部份,所有来算网络的登入应透过加密过的联机且使用以密钥为基础的认证来替代密码。要了解更多信息请参考第 13.8 节 “OpenSSH”。Kerberos的使用者可能会需要多做一些额外的更改才能在其网络上使用OpenSSH,这些更改在第 13.5 节 “Kerberos中会有说明。

13.2.4. 强制密码政策

强制在本地帐号使用高强度密码的政策是系统安全的基础之一。在FreeBSD密码长度、密码强度以及密码复杂性可使用内置的可插拔认证模块(Pluggable Authentication Modules,PAM)来执行。

本节将示范如何设定密码长度下限与上限以及使用pam_passwdqc.so来强制使用混合字元的密码,此模块可在使用者更改其密码时强制要求。

要设定此模块,需要先成为超级使用者,然后取消注释在/etc/pam.d/passwd中含有pam_passwdqc.so的行。然后编辑该行来配合密码政策:

password        requisite       pam_passwdqc.so         min=disabled,disabled,disabled,12,10 similar=deny retry=3 enforce=users

这个例子会设定新密码所需符合的需求。min设定可以控制密码长度下限,它有五个值因为这个模块根据密码的复杂度定义了五种类型。而复杂度是由必须在密码中存在的字元类型来定义,例如:文字、数字、符号以及大小写,这些密码类型在pam_passwdqc(8)有详细的说明。在这个例子,密码类型的前三项为关闭的,代表不会接受只满足这些复杂度的密码,不论长度为何。12设定密码政策可接受满足三种字元类型复杂度且至少12个字元的密码,10设定密码政策接受满足四种字元类型复杂度且至少10个字元的密码。

similar设定则会拒绝以使用者前一次类似的密码。retry设定会提供使用者三次输入新密码的机会。

一这个档案储存之后,更改密码的使用者将会看到如下的信息:

% passwd
Changing local password for trhodes
Old Password:

You can now choose the new password.
A valid password should be a mix of upper and lower case letters,
digits and other characters.  You can use a 12 character long
password with characters from at least 3 of these 4 classes, or
a 10 character long password containing characters from all the
classes.  Characters that form a common pattern are discarded by
the check.
Alternatively, if no one else can see your terminal now, you can
pick this as your password: "trait-useful&knob".
Enter new password:

若输入了一个不符何密码政策的密码,则会被拒绝并显示警告,然后使用者会有机会再重试,直到超过设定的允许重试次数。

大多数密码政策会让密码在多日过后过期。要在FreeBSD设定密码年龄日期,可在/etc/login.conf中该使用者的登入类别设定passwordtime。在default登入类别已有设定示例:

#       :passwordtime=90d:\

因此,要设定此登入类别的密码在90天之后过期只需要移除注释符号(#),然后储存编辑结果并执行cap_mkdb /etc/login.conf

要在个别使用者设定期限,可将有效日期或到期的天数与使用者名称传给pw

# pw usermod -p 30-apr-2015 -n trhodes

如这个例子,有效日期的格式为天、月以及年。要取得更多资讯可参考pw(8)

13.2.5. 侦测Root工具(Rootkit)

rootkit指的是尝试未经授权取得系统root存取权的软件。一旦安装之后,这个恶意软件将可以光明正大的开启给另一个给攻击者进入的大门。现实上,一但系统已被rootkit渗透且执行了搜索动作之后,该系统就应该从头重新安装,因为即使非常谨真的资安或系统工程式也可能会遗漏攻击者留下的动西。

Rootkit 对管理者而言唯一有帮助的是:一但侦测到,便代表某处已经被渗透,但这类型的应用程序躲藏的非常好,本节将会示范一个可以用来侦测 rootkit 的工具,security/rkhunter

安装此套件或Port之后,系统便可使用以下指令检查。该指令提供许多信息且会需要手动按下ENTER确认:

# rkhunter -c

该程序完成之后,目前状态的信息便会显示在画面上。这个信息包含了已检查过多少档案、可疑的档案、可能的rootkit以及其他更多资讯。在检查的过程中,可能会产生一些有关隐藏档案、OpenSSH通信协定选择及已安装软件已知漏洞版本的通用的安全性警告、这些问题可以立即处理或在更详细的分析之后再处理。

每位管理者应了解在系统上执行了那些程序以及这些程序的用途。第三方工具如rkhuntersysutils/lsof以及原生指令如netstatps可以系统上大量的信息,记录下那一些是正常的,当有不适当的程序出现时提出疑问,然后找出答案。虽然理想要避免渗透,但也必须侦测是否已被渗透了。

13.2.6. Binary检验

检验系统档案与Binary是很重要的,因为它可以提供系统管理者与资安团队有关系统变更的信息,能够监视系统变更的软件应用程序称为入侵侦测系统(Intrusion Detection System,IDS)。

FreeBSD原生提供了基础的IDS系统,虽然每天晚上会有安全性的信件会通知管理者相关的变更,但这些信息是储存在本地的,这让恶意的使用者有机会能够修改这些信息来隐藏其对系统的变更。也因此,会建议建立一个独立的Binary签名并将这些签名储存在唯度、root拥有的目录或在可移除的USB磁盘或远端rsync服务器更好。

内置mtree工具可以对一个目录中的内容产生一个规格档,产生规格档会用到一个种子码(Seed)或常数,然后在检查规格是否有更改过时会也会需要使用这个种子码或常数。这让检查一个档案或Binary是否被修改变成可能的一件事。由于攻击者并不知道种子码,要仿冒或检查档案的校验码(Checksum)数值是几乎不可能的。以下例子会产生一组SHA256哈希,每一个在/bin的系统Binary都会有一个,并姐会将这些值以隐藏党储存在root的家目录,/root/.bin_chksum_mtree

# mtree -s 3483151339707503 -c -K cksum,sha256digest -p /bin > /root/.bin_chksum_mtree
# mtree: /bin checksum: 3427012225

3483151339707503代表种子码,这个值应要记录下来且不可给其它人看。

检视/root/.bin_cksum_mtree应会产生类似以下的输出结果:

#          user: root
#       machine: dreadnaught
#          tree: /bin
#          date: Mon Feb  3 10:19:53 2014

# .
/set type=file uid=0 gid=0 mode=0555 nlink=1 flags=none
.               type=dir mode=0755 nlink=2 size=1024 \
                time=1380277977.000000000
    \133        nlink=2 size=11704 time=1380277977.000000000 \
                cksum=484492447 \
                sha256digest=6207490fbdb5ed1904441fbfa941279055c3e24d3a4049aeb45094596400662a
    cat         size=12096 time=1380277975.000000000 cksum=3909216944 \
                sha256digest=65ea347b9418760b247ab10244f47a7ca2a569c9836d77f074e7a306900c1e69
    chflags     size=8168 time=1380277975.000000000 cksum=3949425175 \
                sha256digest=c99eb6fc1c92cac335c08be004a0a5b4c24a0c0ef3712017b12c89a978b2dac3
    chio        size=18520 time=1380277975.000000000 cksum=2208263309 \
                sha256digest=ddf7c8cb92a58750a675328345560d8cc7fe14fb3ccd3690c34954cbe69fc964
    chmod       size=8640 time=1380277975.000000000 cksum=2214429708 \
                sha256digest=a435972263bf814ad8df082c0752aa2a7bdd8b74ff01431ccbd52ed1e490bbe7

机器的主机名称、建立规格档的日期与时间、以及建立此规格档的使用者名称皆会记录在此报告当中,报告当中还会有在目录中每个Binary的校验码、大小、时间以及SHA256编码。

要检验Binary签名是否有被变更过,可使用先前产生的规格档比对目前目录的内容,然后储存结果到档案。这个指令需要当初产生原规格档所使用的种子码:

# mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
# mtree: /bin checksum: 3427012225

这个动作应会产生与上次建立/bin规格档时产生的校验码相同,若在此目录的Binary没有被变更过,那么/root/.bin_chksum_output这个输出档将会是空的。要模拟变更,可以使用touch更改/root/.bin_chksum_output的日期然后再执行检验指令一次:

# touch /bin/cat
# mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
# more /root/.bin_chksum_output
cat changed
	modification time expected Fri Sep 27 06:32:55 2013 found Mon Feb  3 10:28:43 2014

建议对含有Binary以及配置文件的目录建立规格档,对含有敏感数据的目录也是。通常会为/bin/sbin/usr/bin/usr/sbin/ usr/local/bin/etc/usr/local/etc建立规格档。

也有更进阶的IDS系统,例如security/aide。大多数情况mtree已可提供管理者所需的功能。将种子码与校验码结果保存在恶意使用者无法存取的地方是非常重要的一件事。更多有关mtree的信息可在mtree(8)找到。

13.2.7. 系统安全性调校

在FreeBSD,有许多系统功能可以使用sysctl调校,本节会涵盖少数可以调校来避免阻断服务(Denial of Service,DoS)攻击的安全性功能。更多有关使用sysctl的信息包含:如何暂时更改数值及如何在测试之后做永久更改可在第 11.9 节 “使用sysctl(8)调校”找到。

注意:

任何时间使用第 11.9 节 “使用sysctl(8)调校”做的设定变更都会让造成不想要的伤害的可能性上升,影响到系统的可用性。因此应要对所有的变更做监视,若可能的话,先在测试系统上实验,再到上线的系统上使用。

预设FreeBSD核心会使用安全性层级-1来开机,这又称作不安全模式,因为不可变(Immutable)档案旗标可以被关闭且可以读取或写入所有的装置。除非有使用 sysctl或在启动Script设定修改该值,否则安全性层级将会在-1。安全性层级可以在系统启动时透过在/etc/rc.conf设定kern_securelevel_enableYES以及设定kern_securelevel的值为想要的安全层级来提升。请参考security(7)以及init(8)以取得更多与这些设定及可用的安全性层级相关的信息。

警告:

提高securelevel会导致Xorg无法执行以及造成其他问题,请做好除错的准备。

net.inet.tcp.blackhole以及net.inet.udp.blackhole设定可以用来丢弃在已关闭连接埠(Port)收到的SYN封包且不会回传RST响应,预设的动作是会回传RST来表示该连接埠已被关闭,更改预设的动作可对连接埠扫描(用在查看在系统上执行的应用程序)提供一定程度的保护,要这么做可设定net.inet.tcp.blackhole2net.inet.udp.blackhole1。请参考blackhole(4)以取得更多有关这些设定的信息。

net.inet.icmp.drop_redirect以及net.inet.ip.redirect设定可以帮助避免重新导向攻击(Redirect attacks),重新导向攻击是DoS的一种,会传送大量ICMP类型5的封包,由于这些封包并不是必要的,设定net.inet.icmp.drop_redirect1以及设定net.inet.ip.redirect0可丢弃这些封包。

来源路由(Source routing)是一种侦测与存取在内部网络中不可路由位址的方法,由于不可路由位址通常是固故让它不可路由的,因此可以关闭这个功能。要关闭这个功能可设定 net.inet.ip.sourceroute以及net.inet.ip.accept_sourceroute0

当一台在网路上的机器需要传送信息给所有在子网络上的主机时,会发送ICMP响应请求信息到广播位址。然而,外部的主机是没有理由可以执行这个动作的。要拒绝所有来自外部的广播请求可设定net.inet.icmp.bmcastecho0

还有一些额外的设定在security(7)有说明。

13.3. 一次性密码

预设FreeBSD已内置一次性密码(One-time Passwords In Everything,OPIE)。OPIE设计用来避免重送攻击(Replay attack),重送攻击指的是攻击者发现了某位使用者的密码,然后使用该密码来存取系统。由于在OPIE的环境下,一组密码只能被使用一次,被发现的密码对攻击者而言便没有什么作用。OPIE使用了安全的加密方式与诘问/响应系统(Challenge/response system)来管理密码。FreeBSD在实作上预设采用MD5加密。

OPIE使用了三种不同类型的密码,第一种是一般的UNIX®或Kerberos密码,第二种是由opiekey所产生的一次性密码,第三种是用来生一次性密码的秘密密码(Secret password),秘密密码与UNIX®密码无关且不应相同。

OPIE来说还有另外两个部份的数据很重要。其中一个是种子码(Seed)或称密钥(Key),由两个字母与五个数字组成。另一个则是叠代次数(Iteration count),是一个介于1到100间的数字。OPIE会将种子码与秘密密码串连后,套用MD5加密数次后(根据叠代次数),再将结果转换成六个简短的英文单字来产生一次性密码。认证系统会持续追踪最后使用的一次性密码,若使用者提供的密码加密后与前一次的密码相同则可通过认证。由于采用了单向的加密方式,若使用过的密码被成功撷取也无法拿来产生之后的一次性密码。叠代次数会在每一次登入成功之后减少,来保持使用者与登入程序间的同步。当叠代次数减少至1时,OPIE便要重新初始化。

这个整个程序会牵涉到几个程序。传送叠代次数、种子码与秘密密码来产生一组一次性密码或数个一次性密码的opiekey(1)。除了初始化OPIE之外,用来更改密码、叠代次数或种子码的opiepasswd(1)。会读取放在/etc/opiekeys的相关凭证档来列出使用者目前的叠代次数与种子码的 opieinfo(1)

本章节将介绍四种不同的操作,第一是如何在安全联机下做第一次的一次性密码设定,第二是如何使用在不安全的联机下使用opiepasswd,第三是如何在不安全的联机下登入系统,第四是如何产生数个可以被记录或打印下来在不安全的场所使的密钥。

13.3.1. 初始化OPIE

第一次要初始化OPIE,要在安全的场所执行以下指令:

% opiepasswd -c
Adding unfurl:
Only use this method from the console; NEVER from remote. If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase:
Again new secret pass phrase:

ID unfurl OTP key is 499 to4268
MOS MALL GOAT ARM AVID COED

-c会设定采用假设指令在安全场所执行的Console模式,如在使用者掌控之中的电脑或者透过SSH联机到一台在使用者掌控之中的电脑。

提示出现后,输入用来产生一次性登入密钥的秘密密码,应使用一个不容易被猜出来的密码,且应与使用者登入帐号所使用的密码不同,密码必须介于10到127个字元长度之间,然后请记住这个密码。

ID行会列出登入名称(unfurl)、预设的叠代次数(499)以及预设的种子码(to4268)。在进行登入时,系统会记住这些参数并且显示出来,这也代表不需要另外记录这些信息。最后一行会列出根据这些参数与秘密密码所产生出来的一次性密码,在下一次登入时便要使用这个一次性密码。

13.3.2. 在不安全联机下做初始化

要在不安全的系统上初始化或更改秘密密码会需要某个可使用安全的联机的地方执行opiekey,这可能是在某一台信任的主机上的Shell。初始化需要设定叠代次数,100可能是不错的数字,种子码可以自行指定或随机产生,在不安全联机下要被初始化主机须使用opiepasswd(1)

% opiepasswd

Updating unfurl:
You need the response from an OTP generator.
Old secret pass phrase:
	otp-md5 498 to4268 ext
	Response: GAME GAG WELT OUT DOWN CHAT
New secret pass phrase:
	otp-md5 499 to4269
	Response: LINE PAP MILK NELL BUOY TROY

ID mark OTP key is 499 gr4269
LINE PAP MILK NELL BUOY TROY

要采用预设的种子码,可直接按下Return做初始化。接着在输入响应之前移到安全的联机然后给予相同的加密参数产生密码:

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

切换回不安全的联机,然后复制产生的一次性密码粘贴。

13.3.3. 产生单组一次性密码

在初始化OPIE之后进行登入会显示如下的提示信息:

% telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.

FreeBSD/i386 (example.com) (ttypa)

login: <username>
otp-md5 498 gr4269 ext
Password: 

OPIE的提示提供了一个很有用的功能,若在密码提示时按下Return,便会开启响应功能并显示输入的内容,这个功能在尝试手工输入打印出来的密码时很有用。

At this point, generate the one-time password to answer this login prompt. This must be done on a trusted system where it is safe to run opiekey(1). There are versions of this command for Windows®, Mac OS® and FreeBSD. This command needs the iteration count and the seed as command line options. Use cut-and-paste from the login prompt on the machine being logged in to.

在信任的系统上执行:

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

在产生一次性密码后,回到登入画面继续登入。

13.3.4. 产生多组一次性密码

有时会无法存取信任的主机或没有安全的联机,在这种情况下,可以使用opiekey(1)来预先产生多个一次性密码,例如:

% opiekey -n 5 30 zz99999
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <secret password>
26: JOAN BORE FOSS DES NAY QUIT
27: LATE BIAS SLAY FOLK MUCH TRIG
28: SALT TIN ANTI LOON NEAL USE
29: RIO ODIN GO BYE FURY TIC
30: GREW JIVE SAN GIRD BOIL PHI

-n 5会请求产生连续五个密钥,而30则是指定最后一个叠代的编号。注意这些打印出的结果的顺序与使用的顺序相反。十足的偏执狂可能会想要用手写下结果,否则就列印出清单。每一行会同时显示叠代次数及一次性密码,在密码使用过后便可划掉。

13.3.5. 限制使用UNIX®密码

OPIE可以根据登入阶段的IP位置限制使用UNIX®密码,相关的档案为/etc/opieaccess,这个档案预设便存在。请参考opieaccess(5)来取得更多有关此档案的信息以及当使用时要考察的安全性问题。

这里有一个模板opieaccess

permit 192.168.0.0 255.255.0.0

这一行允许来源IP位址(容易受到诈骗的位址)符合指定值与掩码的使用者在任何时间可使用UNIX®密码登入。

若在opieaccess中没有符合的规则,预设会拒绝非OPIE的登入。

13.4. TCP Wrapper

Written by Tom Rhodes.

TCP Wrapper 是一种基于主机的访问控制系统, 它扩展了 第 29.2 节 “inetd超级服务器” 的能力。它可以配置为在inetd控制下为服务器守护进程提供日志记录支持、返回消息和连接限制。更多有关TCP Wrapper的功能信息,请参阅tcpd(8)

然而,TCP Wrapper不应被视为好的防火墙的替代品。TCP Wrapper 应结合防火墙或其他安全加强设施一并使用, 为系统多提供一层安全防护。

13.4.1. 初始设定初始配置

要在 FreeBSD 中启用 TCP Wrapper,添加下面这行到/etc/rc.conf

inetd_enable="YES"
inetd_flags="-Ww"

然后,正确配置/etc/hosts.allow

注意:

与其它的 TCP Wrapper 实现不同, 使用 hosts.deny 在这里被认为是不推荐和过时的做法。 所有的配置选项应放到 /etc/hosts.allow 中。

在最简单的配置中, 服务程序的连接策略是根据 /etc/hosts.allow 允许或阻止。 FreeBSD 中的默认配置是允许一切发到由 inetd 所启动的服务的连接请求。 在基本配置之后将讨论更复杂的情况。

Basic configuration usually takes the form of daemon : address : action, where daemon is the daemon which inetd started, address is a valid hostname, IP address, or an IPv6 address enclosed in brackets ([ ]), and action is either allow or deny. TCP Wrapper uses a first rule match semantic, meaning that the configuration file is scanned from the beginning for a matching rule. When a match is found, the rule is applied and the search process stops.

例如,为了允许POP3 连接通过mail/qpopper程序,将下面这行添加到hosts.allow最后一行:

# This line is required for POP3 connections:
qpopper : ALL : allow

每当编辑此文件时,请重新启动inetd

# service inetd restart

13.4.2. 高级配置

TCP Wrappers 也有一些高级的配置选项; 它们能够用来对如何处理连接实施更多的控制。 一些时候, 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。 其他情况下, 记录日志或者发送邮件给管理员可能更为适合。 另外, 一些服务可能只希望为本机提供。 这些需求都可以通过使用 通配符, 扩展字符以及外部命令来实现。

假设由于发生了某种状况, 而导致连接应该被拒绝掉, 而将其原因发送给发起连接的人。 如何完成这样的任务呢? 这样的动作可以通过使用 twist 选项来实现。 当发起了连接请求时, twist 将调用一个命令或脚本。 在 hosts.allow 文件中已经给出了一个例子:

# The rest of the daemons are protected.
ALL : ALL \
	: severity auth.info \
	: twist /bin/echo "You are not welcome to use %d from %h."

这个例子将把消息 You are not allowed to use daemon from hostname. 返回给访问先前没有配置过允许访问的服务客户。 对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说, 这样的配置非常有用。 请注意所有反馈信息 必须 被引号 " 包围; 这一规则是没有例外的。

警告:

如果攻击者向服务程序发送大量的连接请求, 则可能发动一次成功的拒绝服务攻击。

另一种可能是针对这种情况使用 spawn。 类似 twistspawn 选项也暗含拒绝连接, 并可以用来执行外部命令或服务。 与 twist 不同的是, spawn 不会向连接发起者发送回应。 考虑下面的配置:

# We do not allow connections from example.com:
ALL : .example.com \
	: spawn (/bin/echo %a from %h attempted to access %d >> \
	  /var/log/connections.log) \
	: deny

这将拒绝来自 *.example.com 域的所有连接; 同时还将记录主机名, IP 地址, 以及对方所尝试连接的服务名字到 /var/log/connections.log 文件中。除了前面已经介绍过的转义字符, 例如 %a 之外, 还有一些其它的转义符。 参考 hosts_access(5) 联机手册可以获得完整的列表。

要匹配守护程序,域或IP地址的每个实例,请使用ALL。 另一个通配符是PARANOID,可用于匹配任何提供伪造IP地址的主机,因为该IP地址与其解析的主机名不同。 在此示例中,到Sendmail的所有与其主机名不同的IP地址连接请求都将被拒绝:

# Block possibly spoofed requests to sendmail:
sendmail : PARANOID : deny

小心:

如果服务器和客户机有一方的 DNS 配置不正确, 使用 PARANOID 可能会严重地削弱服务。 在设置之前, 管理员应该谨慎地考虑。

要了解关于通配符和他们的功能, 请参考 hosts_access(5) 联机手册。

注意:

添加新的配置行时,请确保在 hosts.allow 主机中注释该守护进程的任何不需要的条目。

13.5. Kerberos

Contributed by Tillman Hodgson.
Based on a contribution by Mark Murray.

Kerberos 是一种网络身份验证协议,最初由麻省理工学院 ( MIT ) 开发作为在潜在的恶意网络上安全地提供身份验证的一种方式。 Kerberos 协议使用强加密技术, 以便客户端和服务器都可以在不通过网络发送任何未加密的机密的情况下证明其身份。 Kerberos 可以描述为身份验证代理系统和受信任的第三方身份验证系统。在用户使用 Kerberos 进行身份验证后, 可以对其通信进行加密, 以确保隐私和数据完整性。

Kerberos 只提供一种功能 ── 在网络上安全地完成用户的身份验证。 它并不提供授权功能 (也就是说用户能够做什么操作) 或审计功能 (记录用户作了什么操作)。因此, 强烈建议将 Kerberos 同其它提供授权和审计服务的安全手段联用。

该协议的当前版本是第5版,在RFC4120中描述。该协议有几个免费的实现,覆盖了广泛的操作系统。MIT继续开发他们的Kerberos包。在美国,它作为一种密码学产