# FreeBSD 中文手册

面向 FreeBSD 用户，持续演进的全面资源。

[![翻译进度](https://img.shields.io/badge/%E7%BF%BB%E8%AF%91%E8%BF%9B%E5%BA%A6-%E6%A0%A1%E5%AF%B9%E5%AE%8C%E6%88%90-brightgreen)](/changelog) [![GitHub stars](https://img.shields.io/github/stars/FreeBSD-Ask/Handbook)](https://github.com/FreeBSD-Ask/Handbook/stargazers)

FreeBSD 官方手册（FreeBSD Handbook）的中文翻译项目，基于 GitBook 格式，发布在 <https://handbook.bsdcn.org>。

翻译基准为 FreeBSD 最新 RELEASE 版本（<https://github.com/freebsd/freebsd-doc> git 版本 93d98e91f6bfaacd7fae40dd398efe47d44f085b），英文原版见 <https://docs.freebsd.org/en/books/handbook/book/>。

## 项目状态

* ✅ 第 1-35 章翻译完成
* ✅ 全部章节校对完成（2026.7.2）

目前持续进行质量改进和英文原版同步。

## 快速开始

### 目录结构

```sh
Handbook/
├── SUMMARY.md          # 全书目录结构（GitBook 数据源）
├── CHANGELOG.md        # 编辑日志和翻译进度
├── yi-zhe-shuo-ming.md # 术语翻译对照表
├── qian-yan/           # 前言
├── di-1-zhang-*/       # 第 1 章
├── di-2-zhang-*/       # 第 2 章
├── ...
├── di-34-zhang-*/      # 第 34 章
└── fu-lu-*/            # 附录
```

## 贡献指南

欢迎社区通过 PR 贡献力量！请遵循以下规范：

### 翻译规范

1. **术语一致性**：参考 [术语翻译对照表](/yi-zhe-shuo-ming)
2. **CJK 空格**：中英文、中文与数字之间必须加半角空格
3. **命令行前缀**：`#` 表示 root 权限，`$` 表示普通用户
4. **禁止 HTML**：本项目不支持任何 HTML 语法
5. **文件命名**：使用拼音 slug，禁止空格、中文字符或英文冒号

### 标题管理

**重要：** 章节标题必须通过 `SUMMARY.md` 修改，直接编辑 `.md` 文件的 `# 标题` 会被 CI 覆盖。

### 提交流程

1. Fork 本仓库
2. 创建特性分支：`git checkout -b fix/chapter-X-translation`
3. 提交修改：`git commit -m "fix: 修正第 X 章翻译错误"`
4. 推送分支：`git push origin fix/chapter-X-translation`
5. 创建 Pull Request

### 校对工作流程

1. 打开 [英文原版](https://docs.freebsd.org/en/books/handbook/) 对照阅读
2. 逐句检查翻译，重点关注：事实性错误、漏译、表达生硬、版本过时
3. 修改后提交 PR，描述中列出修改原因

## 相关链接

* **官方原址：** <https://docs.freebsd.org/en/books/handbook/>
* **中文发布：** <https://handbook.bsdcn.org>
* **编辑日志：** [CHANGELOG.md](/changelog)
* **术语对照：** [yi-zhe-shuo-ming.md](/yi-zhe-shuo-ming)

## 许可证

```
Copyright 1994-2026 The FreeBSD Project.

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

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

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

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

本项目遵循 [BSD 2-Clause 许可证](https://github.com/FreeBSD-Ask/Handbook/blob/main/LICENSE/README.md)。

## 致谢

感谢所有为本项目贡献翻译和校对工作的社区成员！


# 编辑日志

* 2026.7.16 同步第 17 章 jail 至 <https://github.com/freebsd/freebsd-doc/commit/56ba04a704e911e7f8f87be271f31f1dedc8f793>（H2 从 9 节扩展到 16 节，新增 VNET jail、Linux jail、NAT 和端口转发、服务 jail、从 jail 内部管理、更多 jail 选项、jail 与 ZFS 等章节）
* 2026.6.29 同步最新
* 2026.6.2 第 32-34 章校对完成
* 2026.6.2 第 17-25 章校对完成
* 2026.5.26 进行更新
* 2025.12.1 仅更新 handbook/cutting-edge 到 <https://cgit.freebsd.org/doc/commit/?id=099e57c42a>
* 2025.8.15 同步至 <https://github.com/freebsd/freebsd-doc/commit/f6d5b57b005213d676aa958f48ea1315ee682aff>
* 2025.5.2 机器翻译至 <https://github.com/freebsd/freebsd-doc/commit/8f28a757b13aa8d1db6528453b4bd9df776271e9>
* 2024.9.28
  * 2.1 校对完成
  * 2.2 校对完成
  * 2.3 校对完成
  * 2.4 校对完成
  * 2.5 校对完成
  * 2.6 校对完成
  * 2.7 校对完成
  * 2.8 校对完成
  * 2.9 校对完成
  * 2.10 校对完成
* 2024.9.27
  * 1.1 校对完成
  * 1.2 校对完成
  * 1.3 校对完成


# 译者说明

## 术语翻译对照表

| 英语                                          | 翻译                               | 说明                                                                          |
| ------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------- |
| advanced users                              | 专业用户                             |                                                                             |
| Audit Review                                | 审计复核                             |                                                                             |
| Backspace                                   | 退格键                              | `退格键`                                                                       |
| boot                                        | 引导                               | 不是“启动”                                                                      |
| bootstrap                                   | 自举                               |                                                                             |
| bug                                         | bug                              | 专有名词，维持英文                                                                   |
| build                                       | 构建/编译                            |                                                                             |
| caution                                     | 当心                               | 应该缩进 **加粗** 使用                                                              |
| channels                                    | 信道                               |                                                                             |
| image                                       | 镜像                               |                                                                             |
| important                                   | 重要                               | 应该缩进 **加粗** 使用                                                              |
| inode                                       | 索引节点                             |                                                                             |
| inquiry                                     | 轮询                               |                                                                             |
| Installing Applications: Packages and Ports | 安装应用程序：软件包和 Ports                |                                                                             |
| Internet                                    | 互联网                              | 无需加“公开”，互联网在理论上本就是开放的                                                       |
| issue command                               | 执行命令                             | 不是“发出”                                                                      |
| jail                                        | jail                             | 一般应该小写                                                                      |
| Kernel Limits                               | 内核参数                             | [内核限制实际上就是内核参数](https://eloquence.marxmeier.com/sdb/html/linux_limits.html) |
| key bindings                                | 组合键                              |                                                                             |
| keymap                                      | 键盘布局                             |                                                                             |
| Latest Branch                               | 最新分支                             |                                                                             |
| layer 4-7                                   | 第 4-7 层                          |                                                                             |
| load balancing                              | 负载均衡                             |                                                                             |
| log rotation                                | 日志轮替/日志滚动                        | 都可以                                                                         |
| Login Classes                               | 登录分级                             |                                                                             |
| loopback                                    | 回环                               |                                                                             |
| Mandatory Access Control                    | 强制访问控制                           |                                                                             |
| masquerade                                  | 冒充                               | 但是 IP masquerading 为 IP 伪装                                                  |
| MBR                                         | 主引导记录                            |                                                                             |
| media                                       | 光盘/设备/介质                         | 不翻译为不明确的词语“介质”                                                              |
| Memory Disks                                | 内存盘                              | 用于 18 章，不是闪存设备                                                              |
| memory-backed disks                         | 内存盘                              | 用于 18 章，不是闪存设备                                                              |
| Mirror                                      | 镜像站                              |                                                                             |
| monitoring                                  | 监控                               |                                                                             |
| Network Interfaces                          | 网络接口/网卡                          |                                                                             |
| note                                        | 注意                               | 应该缩进 **加粗** 使用                                                              |
| off-site                                    | 离线                               |                                                                             |
| PAE（Physical Address Extension）             | 物理地址扩展                           |                                                                             |
| partition schemes                           | 分区表/分区方案                         |                                                                             |
| per-user calls                              | 每用户调用数                           |                                                                             |
| Ports Collection                            | Ports                            | `Collection` 似乎看起来无用。Ports Collection 实际上就是 Ports，但是单个的软件则为 port            |
| ports skeleton                              | ports 框架                         |                                                                             |
| ports tree                                  | 树无意义，不翻译                         |                                                                             |
| principal                                   | 主体                               | Kerberos                                                                    |
| print spooler                               | 打印后台处理程序                         | 台湾是说法“列印排存器”，列印即打印，排存器不知道是什么东西                                              |
| Procedure                                   | 过程                               |                                                                             |
| Process Accounting                          | 进程审计                             | “进程记账”看起来不相干。“审计”更符合原意                                                      |
| programmatic method                         | 计划任务                             | 14.10. 监测第三方安全问题                                                            |
| provider                                    | provider                         | 专有名词，A provider is “a disk-like thing which appears in /dev”                |
| Quarterly Branch                            | 季度分支                             |                                                                             |
| raw device                                  | 裸设备                              | 原始设备？                                                                       |
| realm                                       | 领域                               | Kerberos                                                                    |
| reduction                                   | 精选或精简                            | 用于安全审计                                                                      |
| remote groups                               | 异地团体？                            | 不知道怎么翻译，结合语境远程团队或离岸团队或远程组                                                   |
| root-on-ZFS                                 | 使用 ZFS 作为 root 分区/ root 分区使用 ZFS |                                                                             |
| scroll-back buffer                          | 回滚缓冲区                            |                                                                             |
| security advisory                           | 安全公告                             |                                                                             |
| slices                                      | 分片/切片                            | 结合语境                                                                        |
| sound sink                                  | 声音/音频接收器                         | 第 7.2 节出现                                                                   |
| space                                       | 空格键                              | `空格键`                                                                       |
| stateful firewall                           | 状态防火墙                            |                                                                             |
| sticky directories                          | 目录粘滞位                            |                                                                             |
| stripe                                      | 条带                               | 结合具体语境                                                                      |
| system                                      | 设备/系统                            |                                                                             |
| tarball                                     | 源码包/压缩文件                         | ？                                                                           |
| Ticket                                      | 凭据                               |                                                                             |
| tip                                         | 技巧                               | 应该缩进 **加粗** 使用                                                              |
| Tuning                                      | 调整                               | 不是“调优”                                                                      |
| UEFI                                        | 统一可扩展固件接口                        |                                                                             |
| URL                                         | 网址                               |                                                                             |
| USB dongle                                  | USB 适配器                          | 需要结合语境判断是具体是什么                                                              |
| USB stick                                   | U 盘/优盘                           |                                                                             |
| utility                                     | 工具                               | 不是“实用程序”                                                                    |
| Video Modes                                 | 分辨率                              |                                                                             |
| warning                                     | 警告                               | 应该缩进 **加粗** 使用                                                              |
| world                                       | 世界                               | 指除了内核以外的基本系统的所有部分                                                           |
| Wrapper                                     | Wrapper                          | 专有名词，维持英文                                                                   |
| checkout                                    | 检出                               | [github 命令参考此处](https://linux.cn/article-12245-1.html)                      |
| cluster                                     | 集群                               |                                                                             |
| command                                     | 命令                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| committers                                  | 提交者                              |                                                                             |
| connection handle                           | 连接句柄                             | 不知道怎么翻译                                                                     |
| console                                     | 控制台                              | 术语在线收录：计算机科学技术 (2018)                                                       |
| copyleft                                    | 著佐权                              | copyleft 即施加类似于 GPL 这种版权协议的限制，如强制开源等。                                       |
| core files                                  | 核心转储文件                           | 等于 core dump                                                                |
| custom kernel                               | 定制内核                             |                                                                             |
| debug                                       | 调试                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| describe                                    | 说明                               |                                                                             |
| desktop                                     | 桌面                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| disk                                        | 磁盘                               |                                                                             |
| Disk Organization                           | 磁盘结构                             | 3.6. Disk Organization                                                      |
| Distribution Files                          | 安装文件/分发文件                        | 结合语境                                                                        |
| domain                                      | 域                                | 术语在线收录：计算机科学技术 (2018)                                                       |
| drive                                       | 结合语境可能是“磁盘”/驱动器装置/设备             | 结合语境                                                                        |
| embedded boards                             | 嵌入式板卡                            |                                                                             |
| Enter                                       | 回车键                              | `回车键`                                                                       |
| Export Regulations                          | 出口管制                             |                                                                             |
| facility                                    | 设施/机制/工具                         |                                                                             |
| file                                        | 文件                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| flag                                        | 标签/标志                            | ACL                                                                         |
| fork                                        | 复刻/派生                            | [github 命令参考此处](https://linux.cn/article-12245-1.html)                      |
| slices                                      | 分片/切片                            | 结合语境                                                                        |
| snapshot                                    | 快照                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| sound sink                                  | 声音/音频接收器                         | 第 7.2 节出现                                                                   |
| space                                       | 空格键                              | `空格键`                                                                       |
| stateful firewall                           | 状态防火墙                            |                                                                             |
| sticky directories                          | 目录粘滞位                            |                                                                             |
| storage                                     | 存储                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| stripe                                      | 条带                               | 结合具体语境                                                                      |
| swap                                        | 交换                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| system                                      | 设备/系统                            |                                                                             |
| tarball                                     | 源码包/压缩文件                         | ？                                                                           |
| Ticket                                      | 凭据                               |                                                                             |
| tip                                         | 技巧                               | 应该缩进 **加粗** 使用                                                              |
| Tuning                                      | 调整                               | 不是“调优”                                                                      |
| UEFI                                        | 统一可扩展固件接口                        |                                                                             |
| URL                                         | 网址                               |                                                                             |
| USB dongle                                  | USB 适配器                          | 需要结合语境判断是具体是什么                                                              |
| USB stick                                   | U 盘/优盘                           |                                                                             |
| user                                        | 用户                               | 术语在线收录：计算机科学技术 (2018)                                                       |
| utility                                     | 工具                               | 不是“实用程序”                                                                    |
| Video Modes                                 | 分辨率                              |                                                                             |
| warning                                     | 警告                               | 应该缩进 **加粗** 使用                                                              |
| world                                       | 世界                               | 指除了内核以外的基本系统的所有部分                                                           |
| Wrapper                                     | Wrapper                          | 专有名词，维持英文                                                                   |

涵盖/涵盖了——>涉及

允许——>能、能把、能让、把、让、将

描述——>说明、简介、解释、介绍、讲解、概述、论述、撰写、描写

一旦——>若、如、如果、假如、xx 后、xx 以后、xx 之后

`The copyleft to 著佐权. The BSD to BSD. The FreeBSD to FreeBSD. The ports to ports. The port to port. The Wrapper to Wrapper. The USB stick to U 盘. The tip to 技巧. The Video Modes to 分辨率. The tarball to 压缩包. The Procedure to 过程. The log rotation to 日志轮替. The Tuning to 调整. Kernel Limits to 内核参数. The jail to jail. The jails to jail. The disk to 磁盘. The bootstrap to 自举. The cluster to 集群. The world to 世界. The reduction to 精选. The Mandatory Access Control to 强制访问控制. The committers to 提交者. The committer to 提交者. The IP masquerading to IP 伪装. The load balancing to 负载均衡. The URL to 网址. The inquiry to 轮询. The USB dongle to USB 适配器. The Ticket to 凭据. The raw device to 裸设备. The image to 镜像. The caution to 当心. The Backspace to 退格键. The keymap to 键盘布局. The key bindings to 组合键. The sticky directories to 目录粘滞位. The fork to 复刻. The hardened to 加固. The Process Accounting to 进程审计. The Disk Organization to 磁盘结构. The issue command to 执行命令. The Patchkit to 补丁包. The custom kernel to 定制内核. The boot to 引导. The Login Classes to 登录分级. The stateful firewall to 状态防火墙. The loopback to 回环. The monitoring to 监控. The describe to 说明. The advanced users to 专业用户. The utility to 工具.`


# FreeBSD 中文手册

商标

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

IBM、AIX、OS/2、PowerPC、PS/2、S/390 和 ThinkPad 是国际商业机器公司在美国、其他国家或两者之间的商标。

IEEE、POSIX 和 802 是美国电气和电子工程师协会的注册商标。

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

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

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

Apple、AirPort、FireWire、iMac、iPhone、iPad、Mac、Macintosh、Mac OS、Quicktime 和 TrueType 是美国和其他国家注册的 Apple Inc.商标。

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

Linux 是 Linus Torvalds 的注册商标。

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

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

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

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

Oracle 是 Oracle Corporation 的注册商标。

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

ARM 是 ARM Limited 的注册商标。

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

Android 是 Google Inc.的商标。

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

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

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

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

SpeedTouch 是 Thomson 的商标。

VMware 是 VMware, Inc.的商标。

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

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

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

许多制造商和销售商用来区分其产品的名称被宣称为商标。在本文档中，如果 FreeBSD 项目知晓了这些商标声明，他们的名称旁将带有符号“™”或“®”。


# 目录

* [FreeBSD 中文手册](/)
* [编辑日志](/changelog)
* [译者说明](/yi-zhe-shuo-ming)
* [FreeBSD 中文手册](/freebsd-shou-ce)
* [目录](/mu-lu)
* [概述](/gai-shu)

## 前言

* [致读者](/qian-yan/zhi-du-zhe)
* [第四版](/qian-yan/di-si-ban)
* [第三版](/qian-yan/di-san-ban)
* [第二版（2004）](/qian-yan/di-er-ban-2004)
* [第一版（2001）](/qian-yan/di-yi-ban-2001)
* [本书的组织结构](/qian-yan/ben-shu-de-zu-zhi-jie-gou)
* [本书中使用的一些约定](/qian-yan/ben-shu-zhong-shi-yong-de-yi-xie-yue-ding)
* [致谢](/qian-yan/zhi-xie)

***

* [第一部分：快速开始](/di-yi-bu-fen-kuai-su-kai-shi)

## 第 1 章 简介

* [1.1.概述](/di-1-zhang-jian-jie/1.1.-gai-shu)
* [1.2.欢迎来到 FreeBSD！](/di-1-zhang-jian-jie/1.2.-huan-ying-lai-dao-freebsd)
* [1.3.关于 FreeBSD 项目](/di-1-zhang-jian-jie/1.3.-guan-yu-freebsd-xiang-mu)

## 第 2 章 安装 FreeBSD

* [2.1.概述](/di-2-zhang-an-zhuang-freebsd/2.1.-gai-shu)
* [2.2.最低硬件要求](/di-2-zhang-an-zhuang-freebsd/2.2.-zui-di-ying-jian-yao-qiu)
* [2.3.安装前的准备工作](/di-2-zhang-an-zhuang-freebsd/2.3.-an-zhuang-qian-de-zhun-bei-gong-zuo)
* [2.4.开始安装](/di-2-zhang-an-zhuang-freebsd/2.4.-kai-shi-an-zhuang)
* [2.5.使用 bsdinstall](/di-2-zhang-an-zhuang-freebsd/2.5.-shi-yong-bsdinstall)
* [2.6.分配磁盘空间](/di-2-zhang-an-zhuang-freebsd/2.6.-fen-pei-ci-pan-kong-jian)
* [2.7.获取安装文件](/di-2-zhang-an-zhuang-freebsd/2.7.-huo-qu-an-zhuang-wen-jian)
* [2.8.网络接口、账户、时区、服务和加固](/di-2-zhang-an-zhuang-freebsd/2.8.-zhang-hu-shi-qu-fu-wu-he-an-quan)
* [2.9.故障排除](/di-2-zhang-an-zhuang-freebsd/2.9.-gu-zhang-pai-chu)
* [2.10.使用 Live CD](/di-2-zhang-an-zhuang-freebsd/2.10.-shi-yong-live-cd)

## 第 3 章 FreeBSD 基础

* [3.1.概述](/di-3-zhang-freebsd-ji-chu/3.1.-gai-shu)
* [3.2.虚拟控制台和终端](/di-3-zhang-freebsd-ji-chu/3.2.-xu-ni-kong-zhi-tai-he-zhong-duan)
* [3.3.用户和基本账户管理](/di-3-zhang-freebsd-ji-chu/3.3.-yong-hu-he-ji-ben-zhang-hu-guan-li)
* [3.4.权限](/di-3-zhang-freebsd-ji-chu/3.4.-quan-xian)
* [3.5.目录结构](/di-3-zhang-freebsd-ji-chu/3.5.-mu-lu-jie-gou)
* [3.6.磁盘结构](/di-3-zhang-freebsd-ji-chu/3.6.-ci-pan-jie-gou)
* [3.7.文件系统的挂载与卸载](/di-3-zhang-freebsd-ji-chu/3.7.-wen-jian-xi-tong-de-gua-zai-yu-xie-zai)
* [3.8.进程和守护进程](/di-3-zhang-freebsd-ji-chu/3.8.-jin-cheng-he-shou-hu-jin-cheng)
* [3.9.Shell](/di-3-zhang-freebsd-ji-chu/3.9.-shell)
* [3.10.文本编辑器](/di-3-zhang-freebsd-ji-chu/3.10.-wen-ben-bian-ji-qi)
* [3.11.设备和设备节点](/di-3-zhang-freebsd-ji-chu/3.11.-she-bei-he-she-bei-jie-dian)
* [3.12.手册页](/di-3-zhang-freebsd-ji-chu/3.12.-shou-ce-ye)

## 第 4 章 安装应用程序：软件包和 Ports

* [4.1.概述](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)
* [4.2.软件安装的概述](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.2.-ruan-jian-an-zhuang-de-gai-shu)
* [4.3.寻找所需的应用程序](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.3.-xun-zhao-suo-xu-de-ying-yong-cheng-xu)
* [4.4.使用 pkg 管理二进制包](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.4.-shi-yong-pkg-jin-hang-er-jin-zhi-bao-guan-li)
* [4.5.使用 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.5.-shi-yong-ports)
* [4.6.使用 Poudriere 构建软件包](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.6.-shi-yong-poudriere-gou-jian-ruan-jian-bao)
* [4.7.安装后的注意事项](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.7.-an-zhuang-hou-de-zhu-yi-shi-xiang)
* [4.8.如何处理损坏的 Port](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.8.-ru-he-chu-li-sun-huai-de-port)

## 第 5 章 X Window 系统

* [5.1.概述](/di-5-zhang-xwindow-xi-tong/5.1.-gai-shu)
* [5.2.显卡驱动](/di-5-zhang-xwindow-xi-tong/5.2.-xian-ka-qu-dong)
* [5.3.X Window 系统概览](/di-5-zhang-xwindow-xi-tong/5.3.-x-window-xi-tong-gai-lan)
* [5.4.安装 X.org 服务器](/di-5-zhang-xwindow-xi-tong/5.4.-an-zhuang-xorg-fu-wu-qi)
* [5.5.配置 X.org](/di-5-zhang-xwindow-xi-tong/5.5.-xorg-pei-zhi)
* [5.6.在 X Window 中使用字体](/di-5-zhang-xwindow-xi-tong/5.6.-zai-x-window-zhong-shi-yong-zi-ti)

## 第 6 章 FreeBSD 中的 Wayland

* [6.1.概述](/di-6-zhang-freebsd-zhong-de-wayland/6.1.-wayland-jian-jie)
* [6.2.Wayland 概述](/di-6-zhang-freebsd-zhong-de-wayland/6.2.-wayland-gai-shu)
* [6.3.Wayfire 混成器](/di-6-zhang-freebsd-zhong-de-wayland/6.3.-wayfire-hun-cheng-qi)
* [6.4.Hikari 混成器](/di-6-zhang-freebsd-zhong-de-wayland/6.4.-hikari-hun-cheng-qi)
* [6.5.Sway 混成器](/di-6-zhang-freebsd-zhong-de-wayland/6.5.-sway-hun-cheng-qi)
* [6.6.使用 Xwayland](/di-6-zhang-freebsd-zhong-de-wayland/6.6.-shi-yong-xwayland)
* [6.7.使用 VNC 的远程桌面](/di-6-zhang-freebsd-zhong-de-wayland/6.7.-shi-yong-vnc-jin-hang-yuan-cheng-lian-jie)
* [6.8.Wayland 登录管理器](/di-6-zhang-freebsd-zhong-de-wayland/6.8.-wayland-deng-lu-guan-li-qi)
* [6.9.实用工具](/di-6-zhang-freebsd-zhong-de-wayland/6.9.-shi-yong-gong-ju)

## 第 7 章 网络

* [7.1.概述](/di-7-zhang-wang-luo/7.1.-gai-shu)
* [7.2.设置网络](/di-7-zhang-wang-luo/7.2.-she-zhi-wang-luo)
* [7.3.有线网络](/di-7-zhang-wang-luo/7.3.-you-xian-wang-luo)
* [7.4.无线网络](/di-7-zhang-wang-luo/7.4.-wu-xian-wang-luo)
* [7.5.主机名](/di-7-zhang-wang-luo/7.5.-zhu-ji-ming)
* [7.6.DNS](/di-7-zhang-wang-luo/7.6.-dns)
* [7.7.故障排除](/di-7-zhang-wang-luo/7.7.-gu-zhang-pai-chu)

***

* [第二部分：常见任务](/di-er-bu-fen-chang-jian-ren-wu)

## 第 8 章 桌面环境

* [8.1.概述](/di-8-zhang-zhuo-mian-huan-jing/8.1.-gai-shu)
* [8.2.桌面环境](/di-8-zhang-zhuo-mian-huan-jing/8.2.-zhuo-mian-huan-jing)
* [8.3.浏览器](/di-8-zhang-zhuo-mian-huan-jing/8.3.-liu-lan-qi)
* [8.4.开发工具](/di-8-zhang-zhuo-mian-huan-jing/8.4.-kai-fa-gong-ju)
* [8.5.桌面办公生产力应用](/di-8-zhang-zhuo-mian-huan-jing/8.5.-zhuo-mian-sheng-chan-li-gong-ju)
* [8.6.文档查看器](/di-8-zhang-zhuo-mian-huan-jing/8.6.-wen-dang-yue-du-qi)
* [8.7.财务](/di-8-zhang-zhuo-mian-huan-jing/8.7.-cai-wu)

## 第 9 章 多媒体

* [9.1.概述](/di-9-zhang-duo-mei-ti/9.1.-gai-shu)
* [9.2.设置声卡](/di-9-zhang-duo-mei-ti/9.2.-she-zhi-sheng-ka)
* [9.3.音频播放器](/di-9-zhang-duo-mei-ti/9.3.-yin-pin-bo-fang-qi)
* [9.4.视频播放器](/di-9-zhang-duo-mei-ti/9.4.-shi-pin-bo-fang-qi)
* [9.5.视频会议](/di-9-zhang-duo-mei-ti/9.5.-shi-pin-hui-yi)
* [9.6.图像扫描仪](/di-9-zhang-duo-mei-ti/9.6.-tu-xiang-sao-miao-yi)

## 第 10 章 配置 FreeBSD 内核

* [10.1.概述](/di-10-zhang-pei-zhi-freebsd-nei-he/10.1.-gai-shu)
* [10.2.为什么要构建定制内核](/di-10-zhang-pei-zhi-freebsd-nei-he/10.2.-wei-shi-mo-yao-bian-yi-zi-ding-yi-nei-he)
* [10.3.浏览系统硬件](/di-10-zhang-pei-zhi-freebsd-nei-he/10.3.-liu-lan-xi-tong-ying-jian)
* [10.4.配置文件](/di-10-zhang-pei-zhi-freebsd-nei-he/10.4.-pei-zhi-wen-jian)
* [10.5.构建并安装定制内核](/di-10-zhang-pei-zhi-freebsd-nei-he/10.5.-bian-yi-yu-an-zhuang-ding-zhi-nei-he)
* [10.6.如果发生了错误](/di-10-zhang-pei-zhi-freebsd-nei-he/10.6.-ru-guo-fa-sheng-le-yi-xie-cuo-wu)

## 第 11 章 打印

* [11.1.快速入门](/di-11-zhang-da-yin/11.1.-kuai-su-ru-men)
* [11.2.连接打印机](/di-11-zhang-da-yin/11.2.-lian-jie-da-yin-ji)
* [11.3.常见的页面描述语言（PDL）](/di-11-zhang-da-yin/11.3.-chang-jian-de-ye-mian-miao-shu-yu-yan)
* [11.4.直接打印](/di-11-zhang-da-yin/11.4.-zhi-jie-da-yin)
* [11.5.LPD（行式打印机程序）](/di-11-zhang-da-yin/11.5.-lpd-hang-shi-da-yin-ji-cheng-xu)
* [11.6.其他打印系统](/di-11-zhang-da-yin/11.6.-qi-ta-da-yin-xi-tong)

## 第 12 章 Linux 二进制兼容层

* [12.1.概述](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.1.-gai-shu)
* [12.2.配置 Linux 二进制兼容层](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.2.-pei-zhi-linux-er-jin-zhi-jian-rong-ceng)
* [12.3.Linux 用户空间](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.3.-linux-yong-hu-kong-jian)
* [12.4.高级主题](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.4.-gao-ji-zhu-ti)

## 第 13 章 WINE

* [13.1.概述](/di-13-zhang-wine/13.1.-gai-shu)
* [13.2.WINE 概述和概念](/di-13-zhang-wine/13.2.-wine-gai-shu-he-gai-nian)
* [13.3.在 FreeBSD 上安装 WINE](/di-13-zhang-wine/13.3.-zai-freebsd-shang-an-zhuang-wine)
* [13.4.在 FreeBSD 上运行第一个 WINE 程序](/di-13-zhang-wine/13.4.-zai-freebsd-shang-yun-hang-di-yi-ge-wine-cheng-xu)
* [13.5.配置 WINE 安装程序](/di-13-zhang-wine/13.5.-pei-zhi-wine-an-zhuang)
* [13.6.WINE 图形化用户管理界面](/di-13-zhang-wine/13.6.-wine-tu-xing-guan-li-yong-hu-jie-mian)
* [13.7.多用户 FreeBSD 与 WINE](/di-13-zhang-wine/13.7.-freebsd-duo-yong-hu-yu-wine)
* [13.8.FreeBSD 上的 WINE 常见问题](/di-13-zhang-wine/13.8.-wine-yu-freebsd-faq)

***

* [第三部分：系统管理](/di-san-bu-fen-xi-tong-guan-li)

## 第 14 章 配置、服务、日志与电源管理

* [14.1.概述](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.1.-gai-shu)
* [14.2.配置文件](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.2.-pei-zhi-wen-jian)
* [14.3.管理 FreeBSD 中的服务](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.3.-guan-li-freebsd-zhong-de-fu-wu)
* [14.4.Cron 和 Periodic](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.4.-cron-he-periodic)
* [14.5.配置系统日志](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.5.-pei-zhi-xi-tong-ri-zhi)
* [14.6.电源和资源管理](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.6.-dian-yuan-he-zi-yuan-guan-li)
* [14.7.添加交换空间](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.7.-tian-jia-jiao-huan-kong-jian)

## 第 15 章 FreeBSD 的引导过程

* [15.1.概述](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.1.-gai-shu)
* [15.2.FreeBSD 的引导过程](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.2.-freebsd-de-yin-dao-guo-cheng)
* [15.3.Device Hints](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.3.-device-hints)
* [15.4.关机流程](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.4.-guan-ji-liu-cheng)

## 第 16 章 安全

* [16.1.概述](/di-16-zhang-an-quan/16.1.-gai-shu)
* [16.2.简介](/di-16-zhang-an-quan/16.2.-jian-jie)
* [16.3.账户安全](/di-16-zhang-an-quan/16.3.-zhang-hu-an-quan)
* [16.4.入侵检测系统（IDS）](/di-16-zhang-an-quan/16.4.-ru-qin-jian-ce-xi-tong-ids)
* [16.5.安全等级](/di-16-zhang-an-quan/16.5.-an-quan-deng-ji)
* [16.6.文件标志](/di-16-zhang-an-quan/16.6.-wen-jian-biao-zhi-wei)
* [16.7.OpenSSH](/di-16-zhang-an-quan/16.7.-openssh)
* [16.8.OpenSSL](/di-16-zhang-an-quan/16.8.-openssl)
* [16.9.Kerberos](/di-16-zhang-an-quan/16.9.-kerberos)
* [16.10.TCP 封装器（TCP Wrapper）](/di-16-zhang-an-quan/16.10.-tcp-feng-zhuang-qi)
* [16.11.访问控制列表（ACL）](/di-16-zhang-an-quan/16.11.-fang-wen-kong-zhi-acl)
* [16.12.Capsicum](/di-16-zhang-an-quan/16.12.-capsicum)
* [16.13.进程审计](/di-16-zhang-an-quan/16.13.-jin-cheng-shen-ji)
* [16.14.资源限制](/di-16-zhang-an-quan/16.14.-zi-yuan-xian-zhi)
* [16.15.监控第三方安全问题](/di-16-zhang-an-quan/16.15.-jian-kong-di-san-fang-an-quan-wen-ti)
* [16.16.FreeBSD 安全公告](/di-16-zhang-an-quan/16.16.-freebsd-an-quan-gong-gao)

## 第 17 章 jail 与容器

* [17.1.概述](/di-17-zhang-jail-yu-rong-qi/17.1.-gai-shu)
* [17.2.jail 的类型](/di-17-zhang-jail-yu-rong-qi/17.2.-jail-de-lei-xing)
* [17.3.主机配置](/di-17-zhang-jail-yu-rong-qi/17.3.-zhu-ji-pei-zhi-jail)
* [17.4.传统 jail（厚 jail）](/di-17-zhang-jail-yu-rong-qi/17.4.-chuan-tong-jail-hou-jail)
* [17.5.瘦 jail](/di-17-zhang-jail-yu-rong-qi/17.5.-shou-jail)
* [17.6.VNET jail](/di-17-zhang-jail-yu-rong-qi/17.6.-vnet-jail)
* [17.7.Linux jail](/di-17-zhang-jail-yu-rong-qi/17.7.-linux-jail)
* [17.8.NAT 和端口转发](/di-17-zhang-jail-yu-rong-qi/17.8.-nat-he-duan-kou-zhuan-fa)
* [17.9.服务 jail](/di-17-zhang-jail-yu-rong-qi/17.9.-fu-wu-jail)
* [17.10.管理 jail](/di-17-zhang-jail-yu-rong-qi/17.10.-guan-li-jail)
* [17.11.从 jail 内部管理](/di-17-zhang-jail-yu-rong-qi/17.11.-cong-jail-nei-bu-guan-li)
* [17.12.升级 jail](/di-17-zhang-jail-yu-rong-qi/17.12.-geng-xin-jail)
* [17.13.jail 资源限制](/di-17-zhang-jail-yu-rong-qi/17.13.-jail-zi-yuan-xian-zhi)
* [17.14.更多 jail 选项](/di-17-zhang-jail-yu-rong-qi/17.14.-geng-duo-jail-xuan-xiang)
* [17.15.jail 与 ZFS](/di-17-zhang-jail-yu-rong-qi/17.15.-jail-yu-zfs)
* [17.16.jail 管理器与容器](/di-17-zhang-jail-yu-rong-qi/17.16.-jail-guan-li-qi-yu-rong-qi)

## 第 18 章 OCI 容器

* [18.1.概述](/di-18-zhang-oci-rong-qi/18.1.-gai-shu)
* [18.2.容器镜像命名和标签](/di-18-zhang-oci-rong-qi/18.2.-rong-qi-jing-xiang-ming-ming-he-biao-qian)

## 第 19 章 强制访问控制

* [19.1.概述](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.1.-gai-shu)
* [19.2.关键术语](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.2.-guan-jian-shu-yu)
* [19.3.了解 MAC 标签](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.3.-le-jie-mac-biao-qian)
* [19.4.规划安全配置](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.4.-gui-hua-an-quan-pei-zhi)
* [19.5.可用的 MAC 策略](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.5.-ke-yong-de-mac-ce-lve)
* [19.6.用户锁定](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.6.-yong-hu-suo-ding)
* [19.7.MAC Jail 中的 Nagios](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.7.-mac-jail-zhong-de-nagios)
* [19.8.MAC 框架的故障排除](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.8.-mac-kuang-jia-de-gu-zhang-pai-chu)

## 第 20 章 安全事件审计

* [20.1.概述](/di-20-zhang-an-quan-shi-jian-shen-ji/20.1.-gai-shu)
* [20.2.关键术语](/di-20-zhang-an-quan-shi-jian-shen-ji/20.2.-guan-jian-shu-yu)
* [20.3.审计配置](/di-20-zhang-an-quan-shi-jian-shen-ji/20.3.-shen-ji-pei-zhi)
* [20.4.使用审计跟踪](/di-20-zhang-an-quan-shi-jian-shen-ji/20.4.-shi-yong-shen-ji-gen-zong)

## 第 21 章 存储

* [21.1.概述](/di-21-zhang-cun-chu/21.1.-gai-shu)
* [21.2.添加磁盘](/di-21-zhang-cun-chu/21.2.-tian-jia-ci-pan)
* [21.3.调整和增加磁盘大小](/di-21-zhang-cun-chu/21.3.-tiao-zheng-he-zeng-jia-ci-pan-da-xiao)
* [21.4.USB 存储设备](/di-21-zhang-cun-chu/21.4.-usb-cun-chu-she-bei)
* [21.5.创建和使用 CD 光盘](/di-21-zhang-cun-chu/21.5.-chuang-jian-he-shi-yong-cd)
* [21.6.创建和使用 DVD 光盘](/di-21-zhang-cun-chu/21.6.-chuang-jian-he-shi-yong-dvd)
* [21.7.创建和使用软盘](/di-21-zhang-cun-chu/21.7.-chuang-jian-he-shi-yong-ruan-pan)
* [21.8.备份的基础知识](/di-21-zhang-cun-chu/21.8.-bei-fen-de-ji-chu-zhi-shi)
* [21.9.内存盘](/di-21-zhang-cun-chu/21.9.-nei-cun-pan)
* [21.10.文件系统快照](/di-21-zhang-cun-chu/21.10.-wen-jian-xi-tong-kuai-zhao)
* [21.11.磁盘配额](/di-21-zhang-cun-chu/21.11.-ci-pan-pei-e)
* [21.12.加密磁盘分区](/di-21-zhang-cun-chu/21.12.-jia-mi-ci-pan-fen-qu)
* [21.13.加密交换分区](/di-21-zhang-cun-chu/21.13.-jia-mi-jiao-huan-fen-qu)
* [21.14.高可用性存储（HAST）](/di-21-zhang-cun-chu/21.14.-gao-ke-yong-xing-cun-chu-hast)

## 第 22 章 GEOM: 模块化磁盘转换框架

* [22.1.概述](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.1.-gai-shu)
* [22.2.RAID0——条带](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.2.-raid0-tiao-dai)
* [22.3.RAID1——镜像](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.3.-raid1-jing-xiang)
* [22.4.RAID3——带有专用奇偶校验的字节级条带](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.4.-raid3-dai-you-zhuan-yong-qi-ou-xiao-yan-de-zi-jie-ji-tiao-dai)
* [22.5.软件 RAID 设备](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.5.-ruan-jian-raid-she-bei)
* [22.6.GEOM Gate 网络设备](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.6.-geom-gate-wang-luo-she-bei)
* [22.7.为磁盘设备添加卷标](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.7.-wei-ci-pan-she-bei-tian-jia-juan-biao)
* [22.8.通过 GEOM 实现 UFS 日志](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.8.-tong-guo-geom-shi-xian-ufs-ri-zhi)

## 第 23 章 Z 文件系统（ZFS）

* [23.1.是什么使 ZFS 与众不同](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.1.-shi-shi-mo-shi-zfs-yu-zhong-bu-tong)
* [23.2.快速入门指南](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.2.-kuai-su-ru-men-zhi-nan)
* [23.3.zpool 管理](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.3.-zpool-guan-li)
* [23.4.zfs 管理](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.4.-zfs-guan-li)
* [23.5.委托管理](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.5.-wei-tuo-guan-li)
* [23.6.高级主题](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.6.-gao-ji-zhu-ti)
* [23.7.更多资源](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.7.-geng-duo-zi-yuan)
* [23.8.ZFS 特性和术语](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.8.-zfs-te-xing-he-shu-yu)

## 第 24 章 其他文件系统

* [24.1.概述](/di-24-zhang-qi-ta-wen-jian-xi-tong/24.1.-gai-shu)
* [24.2.Linux® 文件系统](/di-24-zhang-qi-ta-wen-jian-xi-tong/24.2.-linux-wen-jian-xi-tong)
* [24.3.Windows® 文件系统](/di-24-zhang-qi-ta-wen-jian-xi-tong/24.3.-windows)
* [24.4.MacOS® 文件系统](/di-24-zhang-qi-ta-wen-jian-xi-tong/24.4.-macos)

## 第 25 章 虚拟化

* [25.1.概述](/di-25-zhang-xu-ni-hua/25.1.-gai-shu)
* [25.2.使用 macOS® 上的 Parallels Desktop 安装 FreeBSD](/di-25-zhang-xu-ni-hua/25.2.-shi-yong-macos-shang-de-parallels-desktop-an-zhuang-freebsd)
* [25.3.使用 macOS® 上的 VMware Fusion 安装 FreeBSD](/di-25-zhang-xu-ni-hua/25.3.-shi-yong-macos-shang-de-vmware-fusion-an-zhuang-freebsd)
* [25.4.使用 VirtualBox™ 安装 FreeBSD](/di-25-zhang-xu-ni-hua/25.4.-shi-yong-virtualbox-an-zhuang-freebsd)
* [25.5.在 FreeBSD 上安装 VirtualBox™](/di-25-zhang-xu-ni-hua/25.5.-zai-freebsd-shang-an-zhuang-virtualbox)
* [25.6.使用 FreeBSD 上的 QEMU 虚拟化](/di-25-zhang-xu-ni-hua/25.6.-qemu)
* [25.7.使用 FreeBSD 上的 bhyve 虚拟机](/di-25-zhang-xu-ni-hua/25.7.-shi-yong-freebsd-shang-de-bhyve-xu-ni-ji)
* [25.8.基于 FreeBSD 的 Xen™ 虚拟机](/di-25-zhang-xu-ni-hua/25.8.-shi-yong-freebsd-shang-de-xen-xu-ni-ji)

## 第 26 章 本地化——i18n/L10n 的使用和设置

* [26.1.概述](/di-26-zhang-ben-di-hua-i18nl10n-de-shi-yong-he-she-zhi/26.1.-gai-shu)
* [26.2.使用本地化](/di-26-zhang-ben-di-hua-i18nl10n-de-shi-yong-he-she-zhi/26.2.-shi-yong-ben-di-hua)
* [26.3.寻找 i18n 应用程序](/di-26-zhang-ben-di-hua-i18nl10n-de-shi-yong-he-she-zhi/26.3.-xun-zhao-i18n-ying-yong-cheng-xu)
* [26.4.特定语言的区域配置](/di-26-zhang-ben-di-hua-i18nl10n-de-shi-yong-he-she-zhi/26.4.-te-ding-yu-yan-de-qu-yu-pei-zhi)

## 第 27 章 FreeBSD 更新与升级

* [27.1.概述](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.1.-gai-shu)
* [27.2.更新 FreeBSD](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.2.-geng-xin-freebsd)
* [27.3.更新 Bootcode](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.3.-geng-xin-bootcode)
* [27.4.更新文档](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.4.-geng-xin-wen-dang)
* [27.5.追踪开发分支](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.5.-zhui-zong-kai-fa-fen-zhi)
* [27.6.从源代码更新 FreeBSD](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.6.-cong-yuan-dai-ma-geng-xin-freebsd)
* [27.7.使用软件包更新 FreeBSD](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.7.-pkgbase)
* [27.8.多台机器的追踪](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.8.-duo-tai-ji-qi-de-zhui-zong)
* [27.9.在非 FreeBSD 主机上进行构建](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.9.-zai-fei-freebsd-zhu-ji-shang-jin-xing-gou-jian)

## 第 28 章 DTrace

* [28.1.概述](/di-28-zhang-dtrace/28.1.-gai-shu)
* [28.2.实现上的差异](/di-28-zhang-dtrace/28.2.-shi-xian-shang-de-cha-yi)
* [28.3.开启 DTrace 支持](/di-28-zhang-dtrace/28.3.-kai-qi-dtrace-zhi-chi)
* [28.4.为内核外部模块启用 DTrace](/di-28-zhang-dtrace/28.4.-nei-he-wai-bu-mo-kuai)
* [28.5.使用 DTrace](/di-28-zhang-dtrace/28.5.-shi-yong-dtrace)

## 第 29 章 USB 设备模式/USB OTG

* [29.1.概述](/di-29-zhang-usb-she-bei-mo-shi-usb-otg/29.1.-gai-shu)
* [29.2.USB 虚拟串行端口](/di-29-zhang-usb-she-bei-mo-shi-usb-otg/29.2.-usb-xu-ni-chuan-hang-duan-kou)
* [29.3.USB 设备模式网络接口](/di-29-zhang-usb-she-bei-mo-shi-usb-otg/29.3.-usb-she-bei-mo-shi-wang-luo-jie-kou)
* [29.4.USB 虚拟存储设备](/di-29-zhang-usb-she-bei-mo-shi-usb-otg/29.4.-usb-xu-ni-cun-chu-she-bei)

***

* [第四部分：网络通讯](/di-si-bu-fen-wang-luo-tong-xun)

## 第 30 章 串行通信

* [30.1.概述](/di-30-zhang-chuan-xing-tong-xin/30.1.-gai-shu)
* [30.2.串行术语和硬件](/di-30-zhang-chuan-xing-tong-xin/30.2.-chuan-hang-shu-yu-he-ying-jian)
* [30.3.终端](/di-30-zhang-chuan-xing-tong-xin/30.3.-zhong-duan)
* [30.4.拨入服务](/di-30-zhang-chuan-xing-tong-xin/30.4.-bo-ru-fu-wu)
* [30.5.拨出服务](/di-30-zhang-chuan-xing-tong-xin/30.5.-bo-chu-fu-wu)
* [30.6.设置串行控制台](/di-30-zhang-chuan-xing-tong-xin/30.6.-she-zhi-chuan-hang-kong-zhi-tai)

## 第 31 章 PPP

* [31.1.概述](/di-31-zhang-ppp/31.1.-gai-shu)
* [31.2.配置 PPP](/di-31-zhang-ppp/31.2.-pei-zhi-ppp)
* [31.3.PPP 连接的故障排除](/di-31-zhang-ppp/31.3.-ppp-lian-jie-de-gu-zhang-pai-chu)
* [31.4.使用以太网 PPP（PPPoE）](/di-31-zhang-ppp/31.4.-shi-yong-yi-tai-wang-ppppppoe)
* [31.5.使用 ATM 上的 PPP (PPPoA)](/di-31-zhang-ppp/31.5.-shi-yong-atm-shang-de-ppp-pppoa)

## 第 32 章 电子邮件

* [32.1.概述](/di-32-zhang-dian-zi-you-jian/32.1.-gai-shu)
* [32.2.邮件组件](/di-32-zhang-dian-zi-you-jian/32.2.-you-jian-zu-jian)
* [32.3.DragonFly 邮件代理（DMA）](/di-32-zhang-dian-zi-you-jian/32.3.-dma)
* [32.4.Sendmail](/di-32-zhang-dian-zi-you-jian/32.4.-sendmail)
* [32.5.修改邮件传输代理](/di-32-zhang-dian-zi-you-jian/32.5.-gai-bian-you-jian-chuan-shu-dai-li)
* [32.6.邮件用户代理](/di-32-zhang-dian-zi-you-jian/32.6.-you-jian-yong-hu-dai-li)
* [32.7.高级主题](/di-32-zhang-dian-zi-you-jian/32.7.-gao-ji-zhu-ti)

## 第 33 章 网络服务器

* [33.1.概述](/di-33-zhang-wang-luo-fu-wu-qi/33.1.-gai-shu)
* [33.2.inetd 超级服务器](/di-33-zhang-wang-luo-fu-wu-qi/33.2.-inetd-chao-ji-fu-wu-qi)
* [33.3.网络文件系统（NFS）](/di-33-zhang-wang-luo-fu-wu-qi/33.3.-wang-luo-wen-jian-xi-tong-nfs)
* [33.4.网络信息系统（NIS）](/di-33-zhang-wang-luo-fu-wu-qi/33.4.-wang-luo-xin-xi-xi-tong-nis)
* [33.5.轻型目录访问协议（LDAP）](/di-33-zhang-wang-luo-fu-wu-qi/33.5.-qing-xing-mu-lu-fang-wen-xie-yi-ldap)
* [33.6.动态主机配置协议（DHCP）](/di-33-zhang-wang-luo-fu-wu-qi/33.6.-dong-tai-zhu-ji-she-zhi-xie-yi-dhcp)
* [33.7.域名系统（DNS）](/di-33-zhang-wang-luo-fu-wu-qi/33.7.-yu-ming-xi-tong-dns)
* [33.8.零配置网络（mDNS/DNS-SD）](/di-33-zhang-wang-luo-fu-wu-qi/33.8.-ling-pei-zhi-wang-luo)
* [33.9.Apache HTTP 服务器](/di-33-zhang-wang-luo-fu-wu-qi/33.9.-apache-http-fu-wu-qi)
* [33.10.文件传输协议（FTP）](/di-33-zhang-wang-luo-fu-wu-qi/33.10.-wen-jian-chuan-shu-xie-yi-ftp)
* [33.11.用于 Microsoft® Windows® 客户端的文件和打印服务（Samba）](/di-33-zhang-wang-luo-fu-wu-qi/33.11.-yong-yu-microsoft-windows-ke-hu-duan-de-wen-jian-he-da-yin-fu-wu-samba)
* [33.12.用 NTP 进行时钟同步](/di-33-zhang-wang-luo-fu-wu-qi/33.12.-yong-ntp-jin-hang-shi-zhong-tong-bu)
* [33.13.iSCSI target 和 initiator 的配置](/di-33-zhang-wang-luo-fu-wu-qi/33.13.-iscsi-target-he-initiator-de-pei-zhi)

## 第 34 章 防火墙

* [34.1.概述](/di-34-zhang-fang-huo-qiang/34.1.-gai-shu)
* [34.2.防火墙的概念](/di-34-zhang-fang-huo-qiang/34.2.-fang-huo-qiang-de-gai-nian)
* [34.3.PF](/di-34-zhang-fang-huo-qiang/34.3.-pf)
* [34.4.IPFW](/di-34-zhang-fang-huo-qiang/34.4.-ipfw)
* [34.5.IPFILTER (IPF)](/di-34-zhang-fang-huo-qiang/34.5.-ipfilter-ipf)
* [34.6.blocklistd](/di-34-zhang-fang-huo-qiang/34.6.-blocklistd)

## 第 35 章 高级网络

* [35.1.概述](/di-35-zhang-gao-ji-wang-luo/35.1.-gai-shu)
* [35.2.网关和路由](/di-35-zhang-gao-ji-wang-luo/35.2.-wang-guan-he-lu-you)
* [35.3.虚拟主机](/di-35-zhang-gao-ji-wang-luo/35.3.-xu-ni-zhu-ji)
* [35.4.无线高级认证](/di-35-zhang-gao-ji-wang-luo/35.4.-wu-xian-gao-ji-shen-fen-yan-zheng)
* [35.5.无线自组织（Ad-hoc）模式](/di-35-zhang-gao-ji-wang-luo/35.5.-wu-xian-dian-dui-dian-mo-shi)
* [35.6.USB 网络共享](/di-35-zhang-gao-ji-wang-luo/35.6.-usb-wang-luo-gong-xiang)
* [35.7.蓝牙](/di-35-zhang-gao-ji-wang-luo/35.7.-lan-ya)
* [35.8.网桥](/di-35-zhang-gao-ji-wang-luo/35.8.-qiao-jie)
* [35.9.链路聚合与故障转移](/di-35-zhang-gao-ji-wang-luo/35.9.-lian-lu-ju-he-yu-gu-zhang-zhuan-yi)
* [35.10.使用 PXE 进行无盘操作](/di-35-zhang-gao-ji-wang-luo/35.10.-shi-yong-pxe-jin-hang-wu-pan-cao-zuo)
* [35.11.共用地址冗余协议（CARP）](/di-35-zhang-gao-ji-wang-luo/35.11.-gong-yong-di-zhi-rong-yu-xie-yi-carp)
* [35.12.VLAN](/di-35-zhang-gao-ji-wang-luo/35.12.-vlan)

***

* [第五部分：附录](/di-wu-bu-fen-fu-lu)

## 附录 A.获取 FreeBSD

* [A.1.镜像站](/fu-lu-a.-huo-qu-freebsd/a.1.-jing-xiang-zhan)
* [A.2.使用 Git](/fu-lu-a.-huo-qu-freebsd/a.2.-shi-yong-git)

## 附录 B.书目

* [B.1.FreeBSD 相关书籍](/fu-lu-b.-shu-mu/b.1.-freebsd-xiang-guan-shu-ji)
* [B.2.安全性参考文献](/fu-lu-b.-shu-mu/b.2.-an-quan-xing-can-kao-wen-xian)
* [B.3.UNIX 历史](/fu-lu-b.-shu-mu/b.3.-unix-li-shi)
* [B.4.期刊、学报与杂志](/fu-lu-b.-shu-mu/b.4.-kai-fa-zhi-nan)

## 附录 C.网络资源

* [C.1.网站](/fu-lu-c.-wang-luo-zi-yuan/c.1.-wang-zhan)
* [C.2.邮件列表](/fu-lu-c.-wang-luo-zi-yuan/c.2.-you-jian-lie-biao)
* [C.3.Usenet 新闻组](/fu-lu-c.-wang-luo-zi-yuan/c.3.-usenet-xin-wen-zu)

## 附录 D.OpenPGP 密钥

* [D.1.官方成员](/fu-lu-d.openpgp-mi-yao/d.1.-guan-fang-cheng-yuan)

***

* [术语表](/shu-yu-biao)
* [出版说明](/hou-ji)


# 概述

欢迎来到 FreeBSD！本手册涉及了 *FreeBSD 15.0-RELEASE*、*FreeBSD 14.4-RELEASE* 和 *13.5-RELEASE* 的安装和日常使用。本书是许多人持续工作的成果。有些部分可能过时。有志于帮助更新和扩充此文档的人可以发送电子邮件至 [FreeBSD 文档项目邮件列表](https://lists.freebsd.org/subscription/freebsd-doc)。

可以从 [FreeBSD 官网](https://www.freebsd.org/)得到本书的最新版本。还可以从 <https://docs.FreeBSD.org/doc/> 获取先前版本。本书可以从 [FreeBSD 下载服务器](https://download.freebsd.org/doc/)或众多[镜像站](/fu-lu-a.-huo-qu-freebsd/a.1.-jing-xiang-zhan)之一下载（提供了多种文件格式和压缩方式）。可以通过手册和其他文档的[搜索页面](https://www.freebsd.org/search/)搜索。


# 致读者

FreeBSD 新手会发现本书的第一部分引导你完成 FreeBSD 安装过程，并循序渐进地介绍了支撑 UNIX® 的概念和约定。学习此部分只需要你有探索的渴望，以及随着内容的展开吸收新概念的能力。

完成这一部分后，手册的第二部分篇幅大得多，是全方位覆盖的主题参考，包含了 FreeBSD 系统管理员所有可能感兴趣的内容。其中某些章节可能建议你先阅读一些前置内容，这在每章开头的概述中有所注明。

如需其他信息来源，请参阅[书目](/fu-lu-b.-shu-mu/b.1.-freebsd-xiang-guan-shu-ji)。


# 第四版

当前版本的手册体现了工作组的累积努力，工作组一直在审查和更新手册中的所有内容。以下是自第四版手册以来的主要更新。

* 手册从 [Docbook](https://docbook.org/) 转换为 [Hugo](https://gohugo.io/) 和 [AsciiDoctor](https://asciidoctor.org/)。
* 创建了 [FreeBSD 文档门户](https://docs.freebsd.org/)。
* [简介](/di-1-zhang-jian-jie/1.1.-gai-shu)章节更新了，改进了 FreeBSD 历史部分并修正了小的拼写错误。
* [安装](/di-2-zhang-an-zhuang-freebsd/2.1.-gai-shu)章节更新了，升级了概述，包含了安装程序的最新更改，刷新了图片，为图片添加了替代文本，并移除了对特定版本的引用。
* [基础](/di-3-zhang-freebsd-ji-chu/3.1.-gai-shu)章节更新了表格、命令输出，以及根据 [hier(7)](https://man.freebsd.org/cgi/man.cgi?query=hier\&sektion=7\&format=html) 更新了目录结构。
* [Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)章节更新了，简化了软件包搜索，更新了软件示例（Nginx 替代了 Apache），改进了 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 引导过程，并添加了配置和管理软件包的新说明，包括阻止和取消阻止。
* [X Window](/di-5-zhang-xwindow-xi-tong/5.1.-gai-shu)章节更新以反映 FreeBSD 中图形系统的当前状态，移除了对旧 Intel 驱动程序、配置和 compiz 的过时引用，并将桌面环境说明（如 KDE Plasma 和 GNOME）移至桌面环境章节，因为这些环境现在除了 X11 外还支持 Wayland。
* 新增了 [Wayland](/di-6-zhang-freebsd-zhong-de-wayland/6.1.-wayland-jian-jie)章节，包含在 FreeBSD 上安装和配置 Wayland 的信息。
* [网络](/di-7-zhang-wang-luo/7.1.-gai-shu)章节为新增，涵盖基本的有线和无线网络配置，包括主机名、DNS 和故障排除。有线网络、无线和 IPv6 相关章节迁移并更新，改进了命令输出，使用了 sysrc，并采用了更好的 AsciiDoc 语法。
* [桌面环境](/di-8-zhang-zhuo-mian-huan-jing/8.1.-gai-shu)章节更新了，升级了 KDE Plasma、GNOME、XFCE、MATE、Cinnamon 和 LXQT 的安装说明，扩展了浏览器选项，新增了开发工具部分，并更新了桌面办公、文档阅读器和财务部分。
* [多媒体](/di-9-zhang-duo-mei-ti/9.1.-gai-shu)章节重构，更新了声音部分，新增了声音混音器、音频播放器和视频播放器的表格，添加了自动耳机切换的指导，新增了视频会议部分，并修订了图像扫描仪部分。
* [Linux 二进制兼容层](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.1.-gai-shu)章节改进了，更新了使用 debootstrap 设置 Debian/Ubuntu 基本系统的说明。
* [配置与优化](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.1.-gai-shu)章节更名以提高准确性，更新了服务管理、cron 和 periodic、syslog、电源管理和交换分区部分。新增了配置文件条目，并移除了过时的优化部分。
* [安全](/di-16-zhang-an-quan/16.1.-gai-shu)章节更新了，增强了基于 IPSec 的 VPN、账户安全、密码哈希、sudo/doas 和 OpenSSH/OpenSSL。新增了涵盖 IDS、安全等级、文件标志位、Capsicum、NFSv4 ACL 和资源限制的章节。
* [jail](/di-17-zhang-jail-yu-rong-qi/17.1.-gai-shu)章节更新了，包含了 jail 类型（厚 jail、瘦 jail、VNET 和 Linux Jail）的详细信息、主机系统配置、网络选项、jail 配置文件、设置过程、升级方法、资源限制，以及不同的 jail 管理器和容器方案。
* [电子邮件](/di-32-zhang-dian-zi-you-jian/32.1.-gai-shu)章节更新了，包含了 DMA 的信息、Sendmail 的升级、将 DMA 和 Sendmail 更改为使用不同 MTA 的说明，并移除了拨号和 Fetchmail 部分，同时重新组织了章节。
* [书目](/fu-lu-b.-shu-mu/b.1.-freebsd-xiang-guan-shu-ji)得到了大规模更新。


# 第三版

当前版本的在线手册体现了过去十年间数百名贡献者的累积努力。自 2004 年两卷本的第三版出版以来，以下是一些重要变化：

* 新增了 [WINE](/di-13-zhang-wine/13.1.-gai-shu)，介绍了如何在 FreeBSD 上运行 Windows® 应用程序。
* 新增了 [DTrace](/di-28-zhang-dtrace/28.1.-gai-shu)，介绍了功能强大的 DTrace 性能分析工具。
* 新增了[其他文件系统](/di-24-zhang-qi-ta-wen-jian-xi-tong/24.1.-gai-shu)，介绍了 FreeBSD 中的非原生文件系统，如 Sun™ 的 ZFS。
* 新增了[安全事件审计](/di-20-zhang-an-quan-shi-jian-shen-ji/20.1.-gai-shu)，以涵盖 FreeBSD 中新的审计功能并说明其使用方法。
* 新增了[虚拟化](/di-25-zhang-xu-ni-hua/25.1.-gai-shu)，介绍了在虚拟化软件上安装 FreeBSD 的信息。
* 新增了[安装 FreeBSD](/di-2-zhang-an-zhuang-freebsd/2.1.-gai-shu)，介绍了使用新安装工具 bsdinstall 安装 FreeBSD 的方法。


# 第二版（2004）

第三版是 FreeBSD 文档项目敬业成员两年多工作的成果。纸质版规模增长到如此程度，以至于必须分成两卷本出版。以下是此新版的主要变化：

* [配置与优化](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.1.-gai-shu)扩充了，提供了有关 ACPI 电源和资源管理、`cron` 系统工具以及更多内核调整参数的新内容。
* [安全](/di-16-zhang-an-quan/16.1.-gai-shu)扩充了，提供了有关虚拟专用网络（VPN）、文件系统访问控制列表（ACL）和安全公告的新内容。
* 此版新增了[强制访问控制](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.1.-gai-shu)章节。它解释了什么是 MAC 以及如何使用该机制来保护 FreeBSD 系统。
* [存储](/di-21-zhang-cun-chu/21.1.-gai-shu)扩充了，包括有关 USB 存储设备、文件系统快照、文件系统配额、基于文件和网络的文件系统以及加密磁盘分区的新内容。
* [PPP](/di-31-zhang-ppp/31.1.-gai-shu)中新增了故障排除部分。
* [电子邮件](/di-32-zhang-dian-zi-you-jian/32.1.-gai-shu)扩充了，包括了有关使用替代传输代理、SMTP 身份验证、UUCP、fetchmail、procmail 以及其他高级主题的新内容。
* 此版新增了[网络服务器](/di-33-zhang-wang-luo-fu-wu-qi/33.1.-gai-shu)章节。本章包含了有关设置 Apache HTTP 服务器、ftpd 以及使用 Samba 为 Microsoft® Windows® 客户端设置服务器的方法。有些来自[高级网络](/di-35-zhang-gao-ji-wang-luo/35.1.-gai-shu)部分的内容移至此处，以改进章节排布。
* [高级网络](/di-35-zhang-gao-ji-wang-luo/35.1.-gai-shu)扩充了，新增了有关在 FreeBSD 上使用蓝牙®设备、设置无线网络以及异步传输模式（ATM）网络的内容。
* 书中增加了术语表，为全书所用技术术语的定义提供了集中的位置。
* 对全书的表格和图表做了诸多外观改进。


# 第一版（2001）

第二版是 FreeBSD 文档项目敬业成员两年多工作的成果。本版的主要变化如下：

* 添加了完整索引。
* 所有 ASCII 图均由图形化的图表取代。
* 每章都增加了标准概述，快速概述该章包含的信息以及读者应了解的内容。
* 内容按逻辑重组为三部分：“快速开始”、“系统管理”和“附录”。
* [FreeBSD 基础](/di-3-zhang-freebsd-ji-chu/3.1.-gai-shu)扩充了，包含了有关进程、守护进程和信号的额外信息。
* [安装应用程序：软件包和 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)扩充了，包含了有关二进制软件包管理的额外信息。
* [X Window 系统](/di-5-zhang-xwindow-xi-tong/5.1.-gai-shu)完全重写，重点是在 XFree86™ 4.X 上使用现代桌面技术，如 KDE 和 GNOME。
* [FreeBSD 的引导过程](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.1.-gai-shu)扩充了。
* [存储](/di-21-zhang-cun-chu/21.1.-gai-shu)由以前两个独立的章节“磁盘”和“备份”合并重写而成。我们认为将这些主题作为单独一章呈现更易理解。还添加了有关 RAID（硬件和软件）的部分。
* [串行通信](/di-30-zhang-chuan-xing-tong-xin/30.1.-gai-shu)完全重组并更新，适用于 FreeBSD 4.X/5.X。
* [PPP](/di-31-zhang-ppp/31.1.-gai-shu)大幅更新。
* [高级网络](/di-35-zhang-gao-ji-wang-luo/35.1.-gai-shu)中添加了许多新章节。
* [电子邮件](/di-32-zhang-dian-zi-you-jian/32.1.-gai-shu)扩充了，包括有关配置 sendmail 的更多信息。
* [Linux® 二进制兼容层](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.1.-gai-shu)扩充了，包括了有关安装 Oracle® 和 SAP® R/3® 的信息。
* 第二版涵盖以下新主题：
  * [配置与优化](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.1.-gai-shu)。
  * [多媒体](/di-9-zhang-duo-mei-ti/9.1.-gai-shu)。


# 本书的组织结构

全书在逻辑上分为五个独立的部分。第一部分是 **快速开始**，涵盖 FreeBSD 的安装和基本用法。期望读者按顺序阅读这些章节（可跳过熟悉的话题）。第二部分是 **常见任务**，涵盖一些 FreeBSD 的常用功能。第二及后续所有部分都可以不按顺序阅读。每章都以简洁的概述开头，说明该章涵盖的内容以及读者应该已经了解的知识。这样设计是为了让跳读的读者也能够找到感兴趣的章节。第三部分是 **系统管理**，涵盖管理主题。第四部分是 **网络通讯**，涵盖网络和服务器主题。第五部分是包含参考信息的附录。

[**简介**](/di-1-zhang-jian-jie/1.1.-gai-shu)

为新用户介绍 FreeBSD。它说明了 FreeBSD 项目的历史、目标和开发模型。

[**安装 FreeBSD**](/di-2-zhang-an-zhuang-freebsd/2.1.-gai-shu)

指导用户使用 bsdinstall 完成 FreeBSD 9.*x* 及更高版本的整个安装过程。

[**FreeBSD 基础**](/di-3-zhang-freebsd-ji-chu/3.1.-gai-shu)

涵盖 FreeBSD 操作系统的基础命令和功能。如果你熟悉 Linux® 或其他版本的 UNIX®，那么你可以跳过本章节。

[**安装应用程序：软件包和 Ports**](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)

涵盖使用 FreeBSD 创新的“Ports”和标准二进制包来安装第三方软件的方法。

[**X Window 系统**](/di-5-zhang-xwindow-xi-tong/5.1.-gai-shu)

介绍 X Window 系统，并说明如何在 FreeBSD 上使用 X11。还介绍常见的桌面环境，如 KDE 和 GNOME。

[**FreeBSD 中的 Wayland**](/di-6-zhang-freebsd-zhong-de-wayland/6.1.-wayland-jian-jie)

介绍 Wayland 显示服务器以及如何在 FreeBSD 上使用 Wayland。还介绍常见的混成器，如 Wayfire、Hikari 和 Sway。

[**桌面环境**](/di-8-zhang-zhuo-mian-huan-jing/8.1.-gai-shu)

列出了一些常见的桌面应用程序，例如网络浏览器和办公软件套件，并说明如何在 FreeBSD 上安装。

[**多媒体**](/di-9-zhang-duo-mei-ti/9.1.-gai-shu)

展示如何为你的系统设置声音和视频播放功能。还介绍了一些示例音频和视频应用程序。

[**配置 FreeBSD 内核**](/di-10-zhang-pei-zhi-freebsd-nei-he/10.1.-gai-shu)

说明为什么你可能需要配置新内核，并为配置、构建和安装定制内核提供了详细的指导。

[**打印**](/di-11-zhang-da-yin/11.1.-kuai-su-ru-men)

说明在 FreeBSD 上管理打印机，包括有关横幅页面、打印机记账和初始设置的信息。

[**Linux® 二进制兼容层**](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.1.-gai-shu)

说明了 FreeBSD 的 Linux® 兼容层功能。还为许多常用的 Linux® 应用程序（如 Oracle®、Mathematica®）提供了详细的安装说明。

[**WINE**](/di-13-zhang-wine/13.1.-gai-shu)

说明了什么是 WINE 以及详细的安装教程。还介绍了 WINE 的操作方式，如何安装 GUI 助手，如何在 FreeBSD 上运行 Windows® 应用程序，并包含了其他注意事项和解决方案。

[**配置与优化**](/di-14-zhang-pei-zhi-fu-wu-ri-zhi-yu-dian-yuan-guan-li/14.1.-gai-shu)

说明了系统管理员可用于调整 FreeBSD 系统以获得最佳性能的各种参数。还介绍了 FreeBSD 中使用的各种配置文件以及它们的位置。

[**FreeBSD 的引导过程**](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.1.-gai-shu)

说明了 FreeBSD 引导过程，并解释了如何通过配置选项控制此过程。

[**安全**](/di-16-zhang-an-quan/16.1.-gai-shu)

说明了许多可用于帮助保持 FreeBSD 系统安全的工具，包括 Kerberos、IPsec 和 OpenSSH。

[**jail 与容器**](/di-17-zhang-jail-yu-rong-qi/17.1.-gai-shu)

说明了 FreeBSD 中 jail 框架的功能，以及 jail 相较于传统的 chroot 所做的改进。

[**强制访问控制**](/di-19-zhang-qiang-zhi-fang-wen-kong-zhi/19.1.-gai-shu)

说明了什么是强制访问控制（MAC），以及如何使用这种机制来保护 FreeBSD 系统。

[**安全事件审计**](/di-20-zhang-an-quan-shi-jian-shen-ji/20.1.-gai-shu)

说明了什么是 FreeBSD 事件审计，如何安装、配置，以及如何检查和监控审计日志。

[**存储**](/di-21-zhang-cun-chu/21.1.-gai-shu)

说明了如何使用 FreeBSD 管理存储设备和文件系统。包括物理磁盘、RAID 阵列、光盘和磁带、内存盘和网络文件系统。

[**GEOM：模块化磁盘转换框架**](/di-22-zhang-geom-mo-kuai-hua-ci-pan-zhuan-huan-kuang-jia/22.1.-gai-shu)

说明了在 FreeBSD 中什么是 GEOM 框架，以及如何配置各种受支持级别的 RAID。

[**Z 文件系统（ZFS）**](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.1.-shi-shi-mo-shi-zfs-yu-zhong-bu-tong)

说明了 Z 文件系统，并提供了在 FreeBSD 下运行 ZFS 的快速入门指南和高级主题信息。

[**其他文件系统**](/di-24-zhang-qi-ta-wen-jian-xi-tong/24.1.-gai-shu)

检查 FreeBSD 对非原生文件系统（如 ext2、ext3 和 ext4）的支持。

[**虚拟化**](/di-25-zhang-xu-ni-hua/25.1.-gai-shu)

说明了虚拟化系统提供的内容，以及如何在 FreeBSD 中使用虚拟化。

[**本地化——i18n/L10n 的使用和设置**](/di-26-zhang-ben-di-hua-i18nl10n-de-shi-yong-he-she-zhi/26.1.-gai-shu)

说明了如何配置 FreeBSD 使用除英语以外的其他语言，涵盖系统和应用程序级别的本地化。

[**FreeBSD 更新与升级**](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.1.-gai-shu)

解释了 FreeBSD-STABLE、FreeBSD-CURRENT 和 FreeBSD-RELEASE 间的区别。说明了哪些用户可以从跟踪开发系统中获益，并概述了该过程。涵盖了几种将系统更新到最新安全发行版本的方法。

[**DTrace**](/di-28-zhang-dtrace/28.1.-gai-shu)

介绍了如何在 FreeBSD 上配置和使用 Sun™ 开发的 DTrace 工具。动态跟踪可执行实时系统分析，用于帮助定位性能问题。

[**USB 设备模式/USB OTG**](/di-29-zhang-usb-she-bei-mo-shi-usb-otg/29.1.-gai-shu)

介绍了在 FreeBSD 上使用 USB 设备模式和 USB On-The-Go（USB OTG）。

[**PPP**](/di-31-zhang-ppp/31.1.-gai-shu)

介绍了如何在 FreeBSD 中使用 PPP 连接远程系统。

[**电子邮件**](/di-32-zhang-dian-zi-you-jian/32.1.-gai-shu)

介绍了电子邮件服务器的构成和组件，并深入探讨了最受欢迎的邮件服务器软件：sendmail 的简单配置话题。

[**网络服务器**](/di-33-zhang-wang-luo-fu-wu-qi/33.1.-gai-shu)

提供了详细的说明和示例配置文件，以将你的 FreeBSD 机器配置成网络文件系统服务器、域名服务器、网络信息系统服务器和时间同步服务器。

[**防火墙**](/di-34-zhang-fang-huo-qiang/34.1.-gai-shu)

解释了软件防火墙背后的理念，并提供了适用于 FreeBSD 的多种防火墙的详细配置信息。

[**高级网络**](/di-35-zhang-gao-ji-wang-luo/35.1.-gai-shu)

介绍许多网络主题，包括在局域网上与其他计算机共享互联网连接、高级路由主题、无线网络、蓝牙、ATM、IPv6 等。

[**获取 FreeBSD**](/fu-lu-a.-huo-qu-freebsd/a.1.-jing-xiang-zhan)

列出了获取 FreeBSD 光盘和 DVD 的多种方法，以及多个能让你在互联网上下载并安装 FreeBSD 的网站。

[**书目**](/fu-lu-b.-shu-mu/b.1.-freebsd-xiang-guan-shu-ji)

由于本书涉及许多不同主题，你可能需要对某些主题的进一步解释。书目列出了许多在文中引用的优秀书籍。

[**网络资源**](/fu-lu-c.-wang-luo-zi-yuan/c.1.-wang-zhan)

介绍了供 FreeBSD 用户提出问题并参与有关 FreeBSD 的技术交流的论坛。

[**OpenPGP 密钥**](/fu-lu-d.openpgp-mi-yao/d.1.-guan-fang-cheng-yuan)

列出了几位 FreeBSD 开发人员的 PGP 指纹。


# 本书中使用的一些约定

为了提供一致且易于阅读的内容，全书遵循了一些惯例。

## 排版惯例

*斜体*

*斜体* 字体用于文件名、网址、强调内容以及技术术语的首次出现。

`等宽`

`等宽` 字体用于错误信息、命令、环境变量、Ports 名称、主机名、用户名、组名、设备名、变量和代码片段。

**加粗**

应用程序、命令和按键均使用 **粗体** 字体。

### 用户输入

**按键以粗体** 显示，以便与其他文本区分开来。需要同时输入的按键组合以 `+` 在按键之间显示，例如：

**Ctrl**+**Alt**+**Del**

这意味着用户应该同时按下 **Ctrl**、**Alt** 和 **Del** 键。

需要按顺序输入的键将用逗号分隔，例如：

**Ctrl**+**X**、**Ctrl**+**S**

这意味着用户需要同时按下 **Ctrl** 和 **X** 键，然后再同时按下 **Ctrl** 和 **S** 键。

### 示例

以 `C:\>` 开头的示例表示 MS-DOS® 命令。除非另有说明，否则这些命令一般可以在现代微软® Windows® 环境上的“命令提示符”窗口中执行。

```sh
C:\> tools\fdimage floppies\kern.flp A:
```

以 `#` 开头的示例表示该命令必须用 FreeBSD 中的超级用户身份调用。你可以以 `root` 身份登录来执行这些命令，或以普通用户身份登录并使用 [su(1)](https://man.freebsd.org/cgi/man.cgi?query=su\&sektion=1\&format=html) 获得超级用户权限。

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

以 `%` 开头的示例表示应使用普通用户账户调用的命令。除非另有说明，否则一律使用 C-shell 语法来设置环境变量和其他 shell 命令。

```sh
% top
```


# 致谢

本书体现了全世界数百人的努力。无论是提交了错别字的修正，还是提交了完整的章节，一切贡献都是有用的。

有多家公司通过向作者支付全职工作的工资、支付出版费用等方式来支持本文档的编写。特别是 BSDi（后来被[风河系统公司](http://www.windriver.com/)收购）曾支付 FreeBSD 文档项目成员的报酬来全职改进本书，最终于 2000 年 3 月出版了纸质版第一版（ISBN 1-57176-241-8）。随后，风河系统公司又支付了几位额外作者的报酬，对打印输出基础工具做了多项改进，并为文本增补了新章节。这项工作的最终成果是于 2001 年 11 月出版的纸质版第二版（ISBN 1-57176-303-1）。在 2003-2004 年期间，FreeBSD Mall Inc. 为几位撰稿人支付了报酬来完善手册，为纸质版第三版做准备。纸质版第三版分成了两卷本。这两卷分别以书名《FreeBSD 手册第 3 版第 1 卷：用户指南》（The FreeBSD Handbook 3rd Edition Volume 1: User Guide，ISBN 1-57176-327-9）和《FreeBSD 手册第 3 版第 2 卷：管理员指南》（The FreeBSD Handbook 3rd Edition Volume 2: Administrators Guide，ISBN 1-57176-328-7）出版。


# 第一部分：快速开始

这部分手册是面向 FreeBSD 新用户和管理员的。这些章节：

* 介绍 FreeBSD。
* 引导读者完成安装过程。
* 教授 UNIX® 基础知识和基本原理。
* 展示如何安装 FreeBSD 上丰富的第三方应用程序。
* 介绍 X，即 UNIX® 窗口系统，并详细说明如何配置桌面环境让用户更高效。
* 介绍 Wayland，新的 UNIX® 显示服务器。

文本中前向引用的数量保持在最低限度，因此你可以从头到尾通读此部分，尽量少翻页。


# 1.1.概述

感谢你对 FreeBSD 的关注！本章涉及 FreeBSD 项目的各个方面，包括历史、目标、开发模型等。

通过阅读本章，你将了解：

* FreeBSD 与其他计算机操作系统的关系。
* FreeBSD 项目的历史。
* FreeBSD 项目的目标。
* FreeBSD 开源开发模型的基础。
* FreeBSD 这个名字的由来。


# 1.2.欢迎来到 FreeBSD！

FreeBSD 是开源、符合标准的类 Unix 操作系统，适用于 x86（32 位和 64 位）、ARM、AArch64、RISC-V、POWER 和 PowerPC 计算机。它提供了现今被视为理所当然的所有功能，例如抢占式多任务处理、内存保护、虚拟内存、多用户功能、SMP 支持，为不同语言和框架提供的所有开源开发工具，以及以 X Window 系统、KDE 或 GNOME 为中心的桌面功能。FreeBSD 的主要优势包括：

* **宽松的开源许可证**：你可以自由修改和扩展其源代码，并将其纳入开源项目和闭源产品中，而不受典型著佐权许可证的限制，同时规避了潜在的许可证不兼容问题。
* **强大的 TCP/IP 网络功能**：FreeBSD 实现了行业标准协议，性能和可扩展性日益增强。这使其在服务器、路由和防火墙角色中都非常适合，实际上许多公司和供应商正是出于这个目的而使用 FreeBSD。
* **完全集成的 OpenZFS 支持**，包括 root 分区使用 ZFS、ZFS 引导环境、故障管理、管理权限委派、对 Jail 的支持、FreeBSD 特定文档和系统安装程序的支持。
* **全面的安全功能**，从强制访问控制框架到 Capsicum 能力和沙盒机制。
* **三万余款预构建软件包**，适用于所有受支持的架构。Ports 还可让你轻松构建自己的定制软件包。
* **文档**：除了手册和由不同作者编写的书籍（涉及系统管理到内核内部机制等主题）外，还有 [man(1)](https://man.freebsd.org/cgi/man.cgi?query=man\&sektion=1\&format=html) 页面，不仅包含用户空间守护进程、工具和配置文件的文档，还包括了内核驱动 API（第 9 节）和单个驱动程序（第 4 节）的文档。
* **简单一致的存储库结构和构建系统**：FreeBSD 使用单一的存储库管理所有组件——包括内核和用户空间。结合统一且易于定制的构建系统和精心设计的开发流程，使 FreeBSD 易于与第三方或衍生产品的构建基础设施集成。
* **恪守 Unix 哲学**，更倾向于可组合性，而非单一的“全能”守护进程及硬编码行为。
* **与 Linux 的二进制兼容性**，使 FreeBSD 能在无需虚拟化的情况下运行许多 Linux 二进制文件。

FreeBSD 基于加州大学伯克利分校计算机系统研究小组（CSRG）发布的 4.4BSD-Lite，并延续了 BSD 系统开发的卓越传统。除了 CSRG 提供的出色工作外，FreeBSD 项目还投入了数千工时用于扩展功能和优化系统，以实现最大性能和可靠性（尤其是在实际负载的情况下）。FreeBSD 在性能和可靠性方面能与其他开源和商业产品相媲美，并结合了其他地方无法获得的前沿特性。

## 1.2.1. FreeBSD 能做什么？

FreeBSD 的用途真正只受限于你自己的想象力。从软件开发到工厂自动化，从库存管理到远程卫星天线的方位校正；如果可以用商业 UNIX® 产品完成，那么很可能你也可以用 FreeBSD 来实现！FreeBSD 还明显受益于全球研究中心和大学开发的数千款高质量应用程序，它们通常以极低甚至零成本提供。

由于 FreeBSD 的源代码可自由获取，该系统也可以根据特定应用程序和项目几乎前所未有地定制，这在大多数主要商业供应商的操作系统中通常是不可能的。以下只是现在人们使用 FreeBSD 的一些应用示例：

* **互联网服务**：FreeBSD 内置的强大 TCP/IP 网络功能使其成为各种互联网服务的理想平台，例如：
  * Web 服务器
  * IPv4 和 IPv6 路由
  * 防火墙和 NAT（“IP 伪装”）网关
  * FTP 服务器
  * 邮件服务器
  * 存储服务器
  * 虚拟化服务器
  * 及更多……
* **教育**：计算机科学及相关工程领域的学生将从中受益。没有比通过 FreeBSD 提供的动手、深入体验来学习操作系统、计算机体系结构和网络的更好方法了。对那些使用计算机完成 *其他* 工作的用户，许多可自由获得的 CAD、数学和图形设计软件包也非常有帮助！
* **研究**：由于整个系统的源代码都是开源的，FreeBSD 是操作系统及计算机科学其他领域研究的优秀平台。FreeBSD 的自由特性使得远程团队可以在想法和共享开发上合作，而无需担心特殊许可协议或在公开论坛讨论相关内容时受到的限制。
* **网络**：需要一台新的路由器？一台域名服务器（DNS）？防火墙来保护你的内部网络？FreeBSD 可以轻松将你角落里闲置的 PC 变成具备先进数据包过滤能力的高级路由器。
* **嵌入式**：FreeBSD 是构建嵌入式系统的绝佳平台。支持 ARM、AArch64 和 PowerPC 平台，结合强大的网络栈、前沿特性以及宽松的 [BSD 许可证](https://docs.freebsd.org/en/books/faq/#bsd-license-restrictions)，FreeBSD 为构建嵌入式路由器、防火墙和其他设备提供了良好的基石。
* **桌面**：FreeBSD 是廉价桌面解决方案的不错选择（使用可自由获取的 X11 服务器及 Wayland 显示服务器）。FreeBSD 提供了多种开源桌面环境，包括标准的 GNOME 和 KDE 图形用户界面。FreeBSD 甚至可以从中央服务器以“无盘”方式引导，使得单个工作站更加经济且易于管理。
* **软件开发**：FreeBSD 基本系统配备了完整的开发工具套件，包括完整的 C/C++ 编译器和调试工具。通过 Ports 和软件包，还可轻松获取更多其他语言支持。

FreeBSD 可免费下载，并在大多数云平台中可用。更多有关获取 FreeBSD 的信息，请参见[获取 FreeBSD](/fu-lu-a.-huo-qu-freebsd/a.1.-jing-xiang-zhan)。

## 1.2.2. 谁在使用 FreeBSD？

FreeBSD 以其 web 服务能力而闻名。可以在 FreeBSD 基金会的网站上找到基于 FreeBSD 的产品和服务的[公司证言列表](https://freebsdfoundation.org/about-us/testimonials/)。维基百科也维护了一份[基于 FreeBSD 的产品列表](https://en.wikipedia.org/wiki/List_of_products_based_on_FreeBSD)。


# 1.3.关于 FreeBSD 项目

以下部分提供了 FreeBSD 项目的相关背景信息，包括简史、项目目标和[开发模型](https://docs.freebsd.org/en/books/dev-model/)。

## 1.3.1. FreeBSD 简史

FreeBSD 项目始于 1993 年初，部分源自 386BSD 非官方补丁包的最后三位协调人：Nate Williams、Rod Grimes 和 Jordan Hubbard 的构思。

最初的目标是为 386BSD 制作一个中间快照，来解决补丁包机制多个无法解决的问题。FreeBSD 项目的早期工作名称是 386BSD 0.5 或 386BSD Interim，以此指代这一事实。

386BSD 是 Bill Jolitz 开发的操作系统，在此之前已遭受了近一年的严重忽视。随着补丁包的不断膨胀，他们决定通过提供这个临时的“清理”快照来帮助 Bill。然而，当 Bill Jolitz 突然决定撤回对该项目的认可，且没有明确的后续规划时，这一计划戛然而止。

三人认为，哪怕没有 Bill 的支持，这个目标仍然值得追求，因此他们采用了 David Greenman 创造的“FreeBSD”这个名字。在咨询了当前的系统用户后，初步目标确定了下来，在 FreeBSD 项目明显有望成为现实后，Jordan 便联系了 Walnut Creek CDROM，目的是为许多没有便捷互联网访问的用户改善 FreeBSD 的分发渠道。Walnut Creek CDROM 不仅支持将 FreeBSD 分发到 CD 上的想法，还提供了一台可供 FreeBSD 项目使用的机器和快速的互联网连接。若没有 Walnut Creek CDROM 对这个当时完全不为人知的项目几乎前所未有的信任，FreeBSD 不会取得今天如此迅速的发展。

第一张随 CD-ROM（以及一般的网络）分发的是 FreeBSD 1.0，发布于 1993 年 12 月。1.0 版本基于来自加州大学伯克利分校的 4.3BSD-Lite（“Net/2”）磁带，许多组件也由 386BSD 和自由软件基金会提供。作为初次发布，这一版本相当成功，并于 1994 年 5 月紧接着发布了备受好评的 FreeBSD 1.1。

在此期间，某些出乎意料的阴云浮现在地平线上，Novell 与加州大学伯克利分校就 Berkeley Net/2 磁带的法律地位达成了长期诉讼的和解。和解的一项条件是，加州大学伯克利分校承认 Net/2 的三个文件是“受权利限制的”代码，必须删除，因为它们是 Novell 的财产（Novell 此前就从 AT\&T 那里获得了这些文件）。伯克利所获得的回报是 Novell 的“认可”，即在最终发布 4.4BSD-Lite 时，将被声明为无权利负担的，并强烈建议所有现有的 Net/2 用户切换。其中就有 FreeBSD，FreeBSD 项目被要求在 1994 年 7 月底之前停止分发自己基于 Net/2 的产品。根据协议，FreeBSD 项目能在截止日期前发布最后一个版本，该版本为 FreeBSD 1.1.5.1。

随后，FreeBSD 开始了一项艰苦的任务：从一个全新的、相对不完整的 4.4BSD-Lite 版本中重新创造自己。尽管仅有三个涉及 System V 共享内存和信号量的文件被移除，但已对 BSD 发行版做了诸多其他更改和错误修复，因此将所有 FreeBSD 开发合并到 4.4BSD-Lite 中是一项艰巨的任务。直到 1994 年 11 月，FreeBSD 项目才实现这一过渡，并于 12 月向全世界发布了 FreeBSD 2.0。尽管该版本在某些方面仍显粗糙，但这是一次重要的成功，并于 1995 年 6 月发布了更为稳健、安装更简便的 FreeBSD 2.0.5 版本。

自那时起，FreeBSD 每次发布都在不断改善前一个版本的稳定性、速度和功能集。

目前，长期开发项目继续在 16.0-CURRENT（main）分支中开展，16.0 的快照版本持续在[快照服务器](https://download.freebsd.org/snapshots/)上发布，随着开发的进展而更新。

## 1.3.2. FreeBSD 项目目标

FreeBSD 的项目目标是提供可以用于一切目的且无附加条件的软件。我们中的许多人对代码（和项目）做了大量投入，自然也不介意偶尔获得一些经济补偿，但我们绝对不打算坚持要求如此。我们相信，我们的首要“使命”是向任何人和所有人提供代码，无论其目的如何，以便代码能得到尽可能普遍的使用，并产生尽可能大的利益。我们认为这是自由软件最基本的目标之一，也是我们热情拥护的目标。

在我们的源代码树中，属于 GNU 通用公共许可证（GPL）和 GNU 宽通用公共许可证（LGPL）的代码附带的条件略多，尽管这些条件是要求强制开源，而非通常的限制访问。由于在商业上使用 GPL 软件可能会产生的额外复杂性，当有合理选择时，我们更倾向于选择采用以更宽松的 BSD 许可证授权的软件。

## 1.3.3. FreeBSD 开发模型

FreeBSD 的开发过程[非常开放和灵活](https://docs.freebsd.org/en/books/dev-model/)，FreeBSD 实际上是由世界各地成千上万人的贡献构成的，你可以从我们的[贡献者名单](https://docs.freebsd.org/en/articles/contributors/)中看出。FreeBSD 的开发基础设施能让这些成千上万的贡献者通过互联网合作。我们不断寻找新的志愿者，想要更密切参与的人可以查阅文章[为 FreeBSD 贡献](https://docs.freebsd.org/en/articles/contributing/)。

无论是独立工作还是紧密合作，有关 FreeBSD 项目及其开发过程的一些有用信息：

**Git 存储库**

多年来，FreeBSD 的中央源代码树由 [CVS](https://www.nongnu.org/cvs/)（Concurrent Versions System，并发版本系统）维护，这是一款可自由获取的源代码控制工具。2008 年 6 月，FreeBSD 项目切换至使用 [SVN](https://subversion.apache.org/)（Subversion）。之所以切换，是因为 CVS 施加的技术限制在源代码树的快速扩展和已存历史量面前变得愈加明显。文档项目和 Ports 的存储库分别于 2012 年 5 月、2012 年 7 月从 CVS 迁移到了 SVN。2020 年 12 月，FreeBSD 项目将源代码和文档存储库[迁移](https://www.freebsd.org/status/report-2020-10-2020-12.html#Git-Migration-Working-Group)至 [Git](https://git-scm.com/)，而 [Ports](https://www.freebsd.org/status/report-2021-04-2021-06/#_git_migration_working_group) 也于 2021 年 4 月迁移。更多有关获取 FreeBSD `src/` 存储库的信息，请参阅[获取源代码](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.1.-gai-shu)部分，有关获取 FreeBSD Ports 的详细信息，请参阅[使用 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)。

**提交者（committer）名单**

*提交者* 是指具有 *推送* 权限的人员，他们被授权修改 FreeBSD 源代码（“提交者”（committer）一词源于 `commit`，即用于将新更改引入存储库的源代码控制命令）。所有人都可以向 [Bug 数据库](https://bugs.freebsd.org/submit/)提交 bug。在提交 bug 报告之前，可以使用 FreeBSD 邮件列表、IRC 频道和论坛帮助验证某个问题是否的确是个 bug。

**FreeBSD 核心团队**

如果 FreeBSD 项目是一家公司，*FreeBSD 核心团队* 相当于公司的董事会。核心团队的主要任务是确保 FreeBSD 项目整体运行良好，并朝着正确的方向发展。招募专注且负责的开发者加入我们的提交者团队是核心团队的职能之一。此外，核心团队还负责招募新的核心团队成员，以替代离任的成员。当前核心团队于 2024 年 5 月和 6 月从提交者候选人中选举产生。选举每两年举行一次。

> **注意**
>
> 同大多数开发者一样，在 FreeBSD 开发方面，核心团队的成员也大都是志愿者，并未从 FreeBSD 项目中获利，因此也不应将“承诺”误解为“有保障的支持”。上面提到的“董事会”类比并不十分准确，也许更恰当的说法是：这些人是在违背自己最佳利益的情况下，放弃了个人生活，投身于 FreeBSD 事业！

**FreeBSD 基金会**

[FreeBSD 基金会](https://freebsdfoundation.org/)是美国的一家 501(c)(3) 的非营利组织，致力于支持和促进 FreeBSD 项目及其全球社区。基金会通过项目资助支持软件开发，并提供人员以实时响应紧急问题和实现新特性和功能。基金会购买硬件以改善和维护 FreeBSD 基础设施，并资助人员以提升测试覆盖率、持续集成和自动化。基金会通过在全球技术会议和活动中代表 FreeBSD 来推广它。基金会还提供研讨会、教育材料和演示，以吸引更多用户和贡献者加入 FreeBSD。基金会还代表 FreeBSD 项目执行合同、许可证协议及其他需要认可法律实体的法律事务。

**外部贡献者**

最后但绝不是最不重要的，最大的开发者群体是用户本身，他们几乎不断地向我们提供反馈和 bug 修复。同 FreeBSD 基本系统开发保持联系的主要方式是订阅 [FreeBSD 技术讨论邮件列表](https://lists.freebsd.org/subscription/freebsd-hackers)，在这里讨论这些内容。对于移植第三方应用程序，你可以访问 [FreeBSD Ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports)。关于文档的内容请参考 [FreeBSD 文档项目邮件列表](https://lists.freebsd.org/subscription/freebsd-doc)。有关各种 FreeBSD 邮件列表的更多信息，请参见[网络资源](/fu-lu-c.-wang-luo-zi-yuan/c.1.-wang-zhan)。

[FreeBSD 贡献者名单](https://docs.freebsd.org/en/articles/contributors/)是一个漫长却又不断增长的名单，为什么不通过[为 FreeBSD 贡献一些东西](https://docs.freebsd.org/en/articles/contributing/)来加入其中呢？贡献代码并非唯一的方式！

总之，我们的开发模型是松散的同心圆集。中心化模型旨在方便 FreeBSD *用户*，为他们提供一种轻松跟踪单个中心代码库的方式，而不是将潜在的贡献者排除在外！我们希望呈现一个稳定的操作系统，拥有大量协调的[应用程序](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)，用户可以轻松安装和使用——这一模型在实现此目标方面非常有效。

我们对有志于加入 FreeBSD 开发者团队的人的唯一期望是，具备与当前成员相同的奉献精神，以确保 FreeBSD 项目的持续成功！

## 1.3.4. 第三方程序

除了基础发行版，FreeBSD 还提供了移植的软件集，包含数千款常见程序。Port 列表涉及从 HTTP 服务器到游戏、语言、编辑器以及几乎所有其他类型的软件。大约有 36000 个 Port；整个 Ports 约占 3 GB 的空间。要编译 Port，只需切换到你希望安装的程序目录，输入 `make install`，然后让系统完成其余的工作。可动态检索构建每个 Port 所需的完整原始发行文件，因此你只需要有足够的磁盘空间来构建所需的 Port 就可以了。

每个 Port 几乎也同时提供了预编译的“软件包”，那些不想从源代码自己编译 Port 的人可以通过简单的命令（`pkg install`）安装。更多有关软件包和 Ports 的信息，请参见[安装应用程序：软件包和 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)。

## 1.3.5. 其他文档

所有受支持的 FreeBSD 版本在安装程序中提供了选项，可在初始系统设置期间安装位于 **/usr/local/share/doc/freebsd** 下的其他文档。也可以在后期通过软件包安装文档：

```sh
# pkg install en-freebsd-doc
```

对于本地化版本，请将“en”替换为所选语言的前缀。请注意，某些本地化版本可能过时，并可能包含不再正确或相关的信息。你可以使用以下链接通过网页浏览器查看本地安装的手册：

**FreeBSD 手册**

**/usr/local/share/doc/freebsd/en/books/handbook/handbook\_en.pdf**

**FreeBSD 常见问题解答**

**/usr/local/share/doc/freebsd/en/books/faq/faq\_en.pdf**

你可以随时在[文档网站](https://docs.freebsd.org/)找到最新的文档。

所有商标均为各自所有者的财产。


# 2.1.概述

FreeBSD 支持多种架构，包括 amd64、ARM®、RISC-V® 和 PowerPC®。根据架构和平台，可以[下载](https://www.freebsd.org/where/)不同镜像来安装或直接运行 FreeBSD。

镜像类型包括：

* 虚拟机磁盘镜像，如 `qcow2`、`vmdk`、`vhd` 和裸设备镜像。这些不是安装镜像，而是已预安装 FreeBSD 的镜像，可直接执行安装后的任务。虚拟机镜像在云环境中也很常用。
* SD 卡镜像，适用于嵌入式系统，如树莓派。这些文件需解压缩后以裸镜像写入 SD 卡，开发板将从 SD 卡引导。
* 安装镜像，用于从 ISO 或 USB 设备引导，在驱动器上安装 FreeBSD，用于常规的桌面、笔记本电脑或服务器系统。

本章的其余部分说明了第三种情况，解释如何使用名为 bsdinstall 的基于文本的安装程序安装 FreeBSD。安装程序和此处所示内容之间可能存在细微差异，因此请将本章作为通用指南，而不是逐字逐句的指令。

通过阅读本章，你将了解：

* 如何获取 FreeBSD 镜像，创建 FreeBSD 安装盘。
* 如何启动 bsdinstall。
* bsdinstall 将询问的问题，它们的含义以及如何回答。
* 如何排除安装失败的故障。
* 如何在决定安装之前体验 FreeBSD 的 Live 版本。


# 2.2.最低硬件要求

安装 FreeBSD 的硬件要求因架构和版本而异。每个 FreeBSD RELEASE 支持的硬件架构和设备列在 [FreeBSD 版本信息](https://www.freebsd.org/releases/)页面上。[FreeBSD 下载页面](https://www.freebsd.org/where/)也提供了针对不同架构选择正确镜像的建议。


# 2.3.安装前的准备工作

在确定系统满足安装 FreeBSD 的最低硬件要求后，就可以下载安装文件，准备安装盘了。

> **技巧**
>
> 如果你想在已安装其他操作系统的系统上使用 FreeBSD，请考虑使用[虚拟化](/di-25-zhang-xu-ni-hua/25.1.-gai-shu)。

在安装之前，请检查下列清单中的项目，查看系统是否准备就绪：

1. **备份重要数据**

在安装任何操作系统之前，请 **始终** 先备份所有重要数据。不要将备份存储在要安装的系统上，而应将数据保存到可移动磁盘（如 USB 驱动器）、网络上的其他系统或在线备份服务。请在开始安装之前测试备份，以确保它包含所有所需文件。在安装程序格式化系统磁盘后，存储在该磁盘上的所有数据都将丢失。

2. **选择安装 FreeBSD 的位置**

如果你仅安装 FreeBSD 一个操作系统，则可以跳过此步骤。但如果 FreeBSD 将与其他操作系统共享磁盘，则需决定使用哪块磁盘或分区。

在 i386 和 amd64 架构中，可以使用两种分区方案之一将磁盘划分为多个分区。传统的 *主引导记录*（MBR）包含一个分区表，最多可定义四个 *主分区*。出于历史原因，FreeBSD 称这些主分区为 *切片*（slice）。其中一个主分区可以作为 *扩展分区*，可包含多个 *逻辑分区*。*全局唯一标识分区表*（GPT）是一种较新且更简单的磁盘分区方法。常见的 GPT 实现可使每块磁盘最多有 128 个分区，消除了对逻辑分区的需求。

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

替代修改系统现有磁盘分区的方案是使用[虚拟化](/di-25-zhang-xu-ni-hua/25.1.-gai-shu)，这能让多个操作系统同时运行，而无需更改分区。

各种免费和商业的分区调整工具列在[磁盘分区软件列表的维基百科条目](https://en.wikipedia.org/wiki/List_of_disk_partitioning_software)上。[GParted Live](https://gparted.org/livecd.php) 是免费的 Live CD，内置 GParted 分区编辑器。

> **警告**
>
> 若使用得当，磁盘缩小工具可以安全地腾出创建新分区所需的空间。由于可能选择错误的分区，请始终备份重要数据，并在修改磁盘分区之前检查备份的完整性。

包含不同操作系统的磁盘分区使在一台计算机上安装多个操作系统成为可能。

3. **收集网络信息**

某些 FreeBSD 安装方法需要网络连接来下载安装文件。在安装后，安装程序会提供设置系统网络接口的选项。

如果网络有 DHCP 服务器，则可以用它来提供自动网络配置。如果 DHCP 不可用，则必须从本地网络管理员或互联网服务提供商获取以下网络信息：

所需的网络信息：

1. IP 地址
2. 子网掩码
3. 默认网关的 IP 地址
4. 网络的域名
5. 网络的 DNS 服务器 IP 地址
6. **查阅 FreeBSD Errata**

尽管 FreeBSD 项目努力确保每个 FreeBSD 版本都尽可能地稳定，但偶尔会出现 bug。在极少数情况下，这些 bug 会影响安装过程。随着这些问题的发现和修复，它们会在每个版本的 FreeBSD Errata 页面上注明。请在安装前查阅 errata，以确保不存在可能影响安装的问题。

可以在[FreeBSD 版本信息](https://www.freebsd.org/releases/)页面找到所有版本的信息及 errata。

## 2.3.1. 准备安装盘

FreeBSD 安装程序不是能在其他操作系统中运行的应用程序。请下载 FreeBSD 安装文件，将其刻录到与其文件类型和大小相对应的媒介（CD、DVD 或 USB）上，然后从插入的安装盘引导系统安装。

可以在 [FreeBSD 下载页面](https://www.freebsd.org/where/)上获取 FreeBSD 安装文件。每个安装文件的名称包括 FreeBSD 的发布版本、架构和文件类型。

安装文件以多种格式提供，使用 [xz(1)](https://man.freebsd.org/cgi/man.cgi?query=xz\&sektion=1\&format=html) 压缩或未压缩。格式因计算机架构和存储类型而异。

安装文件类型：

* `-bootonly.iso`：这是最小的安装文件，仅包含安装程序。安装过程中需要一个有效的互联网连接，因为安装程序会下载完成 FreeBSD 安装所需的文件。该文件应刻录到光盘上。
* `-disc1.iso`：该文件包含安装 FreeBSD 所需的所有文件、源代码和 Ports。应将该文件刻录到光盘上。
* `-dvd1.iso`：该文件包含安装 FreeBSD 所需的所有文件、源代码和 Ports。它还包含一组流行的二进制包，用于安装窗口管理器和一些应用程序，以便可以从光盘安装完整的系统，而无需连接互联网。应将该文件刻录到光盘上。
* `-memstick.img`：该文件包含安装 FreeBSD 所需的所有文件、源代码和 Ports。将此文件写入 U 盘，如[写入 USB 镜像文件](#id-2.3.1.1.-jiang-jing-xiang-wen-jian-xie-ru-usb)所示。
* `-mini-memstick.img`：与 `-bootonly.iso` 类似，不包含安装文件，而是根据需要下载。安装过程中需要一个有效的互联网连接。应将其写入 U 盘，如[写入 USB 镜像文件](#id-2.3.1.1.-jiang-jing-xiang-wen-jian-xie-ru-usb)所示。

下载镜像文件后，请从同一目录下载至少一个 *checksum*（校验和）文件。有两个校验和文件可用，文件名包含发布编号和架构名称。例如：`CHECKSUM.SHA256-FreeBSD-15.0-RELEASE-amd64` 和 `CHECKSUM.SHA512-FreeBSD-15.0-RELEASE-amd64`。

下载其中一个文件（或两个文件）后，计算镜像文件的校验和并与 *checksum* 文件中显示的比较。请注意，你需要将计算出的校验和与校验和文件中的正确值比较，因为它们对应于两种不同的算法：SHA256 和 SHA512。FreeBSD 提供了 [sha256(1)](https://man.freebsd.org/cgi/man.cgi?query=sha256\&sektion=1\&format=html) 和 [sha512(1)](https://man.freebsd.org/cgi/man.cgi?query=sha512\&sektion=1\&format=html) 用于计算 *checksum*。其他操作系统也有类似的程序。

在 FreeBSD 中，可以使用 [sha256sum(1)](https://man.freebsd.org/cgi/man.cgi?query=sha256sum\&sektion=1\&format=html)（和 [sha512sum(1)](https://man.freebsd.org/cgi/man.cgi?query=sha512sum\&sektion=1\&format=html)）通过执行以下命令自动完成校验和的验证：

```sh
% sha256sum -c CHECKSUM.SHA256-FreeBSD-15.0-RELEASE-amd64 --ignore-missing
FreeBSD-15.0-RELEASE-amd64-dvd1.iso: OK
```

校验和必须完全匹配。如果校验和不符合，则镜像文件已损坏，必须重新下载。

### 2.3.1.1. 将镜像文件写入 USB

`*memstick.img` 文件是 U 盘完整内容的 *镜像*。它 *不能* 作为文件复制到目标设备。可用多个应用程序将 `*.img` 写入 U 盘。本节介绍了其中两个工具。

> **重要**
>
> 在继续之前，请备份 U 盘上的所有重要数据。此过程将删除 U 盘上的现有数据。

> **使用 `dd` 写入镜像的步骤**
>
> > **警告**
> >
> > 此示例使用 **/dev/da0** 作为目标设备，镜像将写入此设备。请 **务必小心**，使用正确的设备，因为此命令将删除指定目标设备上的现有数据。
>
> 1. 此命令行工具可在 BSD、Linux® 和 Mac OS® 系统上使用。要使用 `dd` 刻录镜像，请插入 U 盘，然后确定其设备名称。接下来，指定下载的安装文件的名称和 U 盘的设备名称。此示例将在现有 FreeBSD 系统的首个 USB 设备上刻录 amd64 安装镜像。
>
> ```sh
> # dd if=FreeBSD-15.0-RELEASE-amd64-memstick.img of=/dev/da0 bs=1M conv=sync
> ```

> 如果此命令失败，请确认 U 盘未被挂载，并且设备名称是磁盘，而非分区。 某些操作系统可能要求使用 [sudo(8)](https://man.freebsd.org/cgi/man.cgi?query=sudo\&sektion=8\&format=html) 运行此命令。[dd(1)](https://man.freebsd.org/cgi/man.cgi?query=dd\&sektion=1\&format=html) 的语法在不同平台之间略有不同；例如，Mac OS® 需要小写的 `bs=1m`。像 Linux® 这样的系统可能会缓冲写入。要强制所有写入完成，请使用 [sync(8)](https://man.freebsd.org/cgi/man.cgi?query=sync\&sektion=8\&format=html)。

> **使用 Windows® 写入镜像的步骤**
>
> **警告**
>
> > 请确保选择了正确的盘符，因为此操作将覆盖并删除指定驱动器上的现有数据。
>
> 1. **获取 Windows® 镜像写入工具**
>
> Windows® 镜像写入工具是免费应用程序，可以正确地将镜像文件写入 U 盘。请从 [win32diskimager 主页](https://sourceforge.net/projects/win32diskimager/)下载，然后将其解压到一个文件夹中。
>
> 2. **使用镜像写入工具写入镜像**
>
> 双击 Win32DiskImager 图标可启动程序。验证 `Device` 下显示的盘符是否为 U 盘对应的盘符。单击文件夹图标，选择要写入 U 盘的镜像。单击 **Save** 以接受镜像文件名。验证一切是否正确，并确保 U 盘中的文件夹未在其他窗口中打开。待一切准备就绪，单击 **Write** 将镜像文件写入 U 盘。


# 2.4.开始安装

> **重要**
>
> 在默认情况下，出现以下信息之前，安装程序将不会对磁盘做任何更改：
>
> ```sh
> 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?
> ```
>
> 在此警告之前，可以随时退出安装。如果担心某些配置错误，只需在此之前关闭计算机，系统磁盘不会有任何更改。

本节讲解如何从[准备安装盘](/di-2-zhang-an-zhuang-freebsd/2.3.-an-zhuang-qian-de-zhun-bei-gong-zuo)一节中准备好的安装盘引导系统。当使用可引导 U 盘时，请在打开计算机之前插入 U 盘。当从 CD/DVD 引导时，请在打开计算机后立刻插入光盘。如何配置系统从插入的安装盘引导取决于架构。

## 2.4.1. FreeBSD 引导加载程序菜单

在系统从安装盘引导后，将显示类似如下内容的菜单：

![FreeBSD 引导加载程序菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-newboot-loader-menu.png)

**图 1. FreeBSD 引导加载程序菜单**

在默认情况下，在引导 FreeBSD 安装程序（在 FreeBSD 已安装的情况下会引导 FreeBSD）之前菜单将等待十秒钟。要暂停引导计时器来查看选项，请按 **空格键**。要选择某选项，请按其高亮显示的数字、字符或按键。以下选项可用。

* `Boot Multi User`：将继续 FreeBSD 引导过程。如果引导计时器已暂停，请按 **1**、大写/小写的 **B** 或 **回车键**。
* `Boot Single User`：此模式可用于修复现有的 FreeBSD 安装，详见[“单用户模式”](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.1.-gai-shu)。按 **2** 或大写/小写的 **S** 可进入此模式。
* `Escape to loader prompt`：将系统引导到修复提示符，其包含少量的底层命令。此提示在[“第三阶段”](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.1.-gai-shu)中说明。按 **3** 或 **Esc** 可进入此提示。
* `Reboot`：重新启动系统。
* `Cons`：可通过 `video`、`serial`、`Dual (serial primary)` 或 `Dual (Video primary)` 继续安装。
* `Kernel`：加载不同的内核。
* `Boot Options`：打开在[FreeBSD 引导选项菜单](/di-2-zhang-an-zhuang-freebsd/2.4.-kai-shi-an-zhuang) 中显示和说明的菜单。

![显示不同引导选项的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-boot-options-menu.png)

**图 2. FreeBSD 引导选项菜单**

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

下一部分用于通过按选项的高亮数字或字符来切换可用选项为 `On`/`Off`。系统将始终使用这些选项的设置引导，直到它们被修改。可以通过此菜单切换几个选项：

* `ACPI`：如果在引导期间系统卡住，请尝试将此选项切换为 `Off`。此选项仅在可用但非必需的情况下存在。
* `Safe Mode`：如果哪怕在将 `ACPI Support` 设置为 `Off` 的情况下系统仍然卡住，请尝试将此选项设置为 `On`。
* `Single User`：将此选项切换为 `On` 可修复现有的 FreeBSD 安装，详见[“单用户模式”](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.1.-gai-shu)。解决问题后，请切换回 `Off`。
* `Verbose`：将此选项切换为 `On` 以查看引导过程中的详细消息。这在故障排除硬件时可能很有用。

在做出必要的选择后，按 **1** 或 **退格键** 返回主引导菜单，然后按 **回车键** 继续引导 FreeBSD。随着 FreeBSD 探测硬件设备、加载安装程序，会出现一系列引导信息。引导完成后，将显示欢迎菜单。

![FreeBSD 安装欢迎菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-choose-mode.png)

**图 3. 欢迎菜单**

按 **回车键** 可选择默认的 **Install** 进入安装程序。本章的其余部分解释了如何使用此安装程序。还可以使用左右箭头或彩色字母选择所需的菜单项。**Shell** 可以用于访问 FreeBSD shell，能在安装之前使用命令行工具准备磁盘。选项 **Live CD** 可用于在安装之前试用 FreeBSD。Live 版本在[使用 Live CD](/di-2-zhang-an-zhuang-freebsd/2.10.-shi-yong-live-cd) 中介绍。

> **技巧**
>
> 要查看引导消息，包括硬件设备探测，请按大写/小写的 **S**，然后按 **回车键** 以访问 shell。在 shell 提示符下，输入 `more /var/run/dmesg.boot`，再使用 **空格键** 滚动信息。在完成后，输入 `exit` 可返回欢迎菜单。


# 2.5.使用 bsdinstall

本部分展示了 bsdinstall 菜单的顺序以及在系统安装之前将询问的信息类型。使用箭头键高亮菜单选项，然后按 **空格键** 选择或取消选择该菜单项。在完成后，按 **回车键** 可保存选择，进入下一个界面。

## 2.5.1. 键盘布局选择菜单

在开始安装过程之前，bsdinstall 将加载键盘布局文件，如[加载键盘布局](/di-2-zhang-an-zhuang-freebsd/2.5.-shi-yong-bsdinstall)所示。

![加载键盘布局](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-keymap-loading.png)

**图 4. 键盘布局加载**

在加载键盘布局后，bsdinstall 将显示[键盘布局选择菜单](#id-2.5.1.-jian-pan-bu-ju-xuan-zhai-cai-dan)。使用上下箭头选择与系统接入的键盘最相符的键盘布局。按 **回车键** 保存选择。

![键盘布局选择菜单，显示所有受支持的键盘](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-keymap-10.png)

**图 5. 键盘布局选择菜单**

> **注意**
>
> 按 **Esc** 可退出此菜单，使用默认键盘布局。如果不确定要选择哪个键盘布局，使用 United States of America ISO-8859-1 也是一个稳妥的选择。

此外，在选择不同的键盘布局时，用户可测试该布局，确保正确，然后再继续，如[键盘布局测试菜单](/di-2-zhang-an-zhuang-freebsd/2.5.-shi-yong-bsdinstall)中所示。

![键盘布局测试菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-keymap-testing.png)

**图 6. 键盘布局测试菜单**

## 2.5.2. 设置主机名

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

![设置主机名](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-config-hostname.png)

**图 7. 设置主机名**

输入在网络中唯一的主机名。应为一个完全限定的主机名，例如 `machine3.example.com`。

## 2.5.3. 选择安装类型

在下一个菜单中，bsdinstall 将询问是使用传统发行版集合还是新的基于软件包的方法安装基本系统。

![显示安装类型选择的菜单，提供 Distribution Sets 和 Packages 两种选项](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-distributions-sets-pkgbase.png)

**图 8. 选择安装类型**

从 FreeBSD 15.0 开始，安装程序提供了两种安装和更新基本系统的方法。两种选项安装的内核和用户空间相同，但在交付方式和后续维护方式上存在根本差异：

* **Distribution Sets（发行版集合）**：项目早期至今的经典安装方式。基本系统从压缩 tar 包集合中解压。更新仅通过 [freebsd-update(8)](https://man.freebsd.org/cgi/man.cgi?query=freebsd-update\&sektion=8\&format=html) 执行。此方法完全受支持且稳定，在 15.x 系列中仍是大多数安装盘的默认选项。
* **Packages（软件包，技术预览）**：将基本系统作为独立软件包从 FreeBSD-base 存储库安装。安装完成后，整个操作系统（包括基本系统和第三方软件）均可通过一条 `pkg upgrade` 命令统一升级。此方法（pkgbase）将系统管理统一到 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 框架之下。

> **技巧**
>
> `Packages`（技术预览）选项供测试和早期体验使用。预计将在 FreeBSD 16.0 中成为默认方式，但在 15.x 系列的生命周期内，希望采用保守的、经过时间考验的更新方案的用户应在生产环境中选择 `Distribution Sets`。

## 2.5.4. 选择要安装的组件

接下来，bsdinstall 将提示选择要安装的可选组件。

![可以安装的不同组件。例如：base-dbg](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-config-components.png)

**图 9. 选择要安装的组件**

决定安装哪些组件在很大程度上取决于系统的预期用途和可用的磁盘空间。FreeBSD 内核和用户空间，统称为 *基本系统*，始终会被安装。根据架构，某些组件可能不会出现：

* `base-dbg`——含有调试符号的基础工具，如 cat 和 ls 等。
* `kernel-dbg`——含有调试符号的内核和模块。
* `lib32-dbg`——用于在 64 位版本 FreeBSD 上运行 32 位应用程序的兼容库，含有调试符号。
* `lib32`——用于在 64 位版本 FreeBSD 上运行 32 位应用程序的兼容库。
* `ports`——FreeBSD Ports 是一个文件集，可自动下载、编译和安装第三方软件包。有关如何使用 Ports 的信息，请参见[安装应用程序：软件包和 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.5.-shi-yong-ports)。

> **警告**
>
> 安装程序不会检查磁盘空间是否充足。请仅在有足够硬盘空间的情况下选择此选项。FreeBSD Ports 约占用 3 GB 磁盘空间。

* `src`——FreeBSD 内核和用户空间的完整源代码。虽然大多数应用程序并不需要，但可能需要构建设备驱动程序、内核模块或某些来自 Ports 的应用程序。它也用于开发 FreeBSD 本身。完整的源代码需要 1 GB 磁盘空间，重新编译整个 FreeBSD 系统需要额外的 5 GB 空间。
* `tests`——FreeBSD 测试套件。

## 2.5.5. 从网络安装

在[从网络安装](#id-2.5.5.-cong-wang-luo-an-zhuang)中显示的菜单仅在使用 `-bootonly.iso` 或 `-mini-memstick.img` 安装时出现，因为这些安装盘未包含安装文件的副本。由于必须通过网络连接下载安装文件，因此该菜单要求必须先配置网络接口。如果在安装过程中显示此菜单，请记得遵循[配置网络接口](/di-2-zhang-an-zhuang-freebsd/2.8.-zhang-hu-shi-qu-fu-wu-he-an-quan)中的说明。

![指示未找到某些组件并将通过网络下载](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-netinstall-files.png)

**图 10. 网络安装**


# 2.6.分配磁盘空间

接下来的菜单用于确定磁盘空间的分配方法。

![显示不同的分区选项。如：手动](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-partmenu.png)

**图 11. 分区选择**

bsdinstall 提供了四种磁盘空间分配方法：

* `Auto (ZFS)` 分区可创建一个基于 ZFS 的根文件系统，并可选支持 *引导环境* 的 GELI 加密。
* `Auto (UFS)` 分区可自动设置使用 `UFS` 文件系统的磁盘分区。
* `Manual` 分区能让专业用户从菜单选项中创建自定义分区。
* `Shell` 将打开命令行提示符，专业用户可使用命令行工具（如 [gpart(8)](https://man.freebsd.org/cgi/man.cgi?query=gpart\&sektion=8\&format=html)、[fdisk(8)](https://man.freebsd.org/cgi/man.cgi?query=fdisk\&sektion=8\&format=html) 和 [bsdlabel(8)](https://man.freebsd.org/cgi/man.cgi?query=bsdlabel\&sektion=8\&format=html)）创建自定义分区。

本节说明了在布置磁盘分区时需要考虑的事项。然后演示了如何使用不同的分区方法。

## 2.6.1. 设计分区布局

默认的文件系统分区布局有一个用于整个系统的文件系统。在使用 `UFS` 时，如果有足够的磁盘空间或多块磁盘，规划使用多个文件系统是值得的。在布局文件系统时，请记住，硬盘从外圈到内圈的数据传输速度更快。因此，较小且访问频繁的文件系统应靠近硬盘外侧，而较大的分区（如 **/usr**）应放置在磁盘的内侧。创建分区的顺序建议类似于：**/**、交换分区、**/var** 和 **/usr**。

**/var** 分区的大小反映了预期机器的使用情况。此分区用于存放邮箱、日志文件和打印缓存。邮箱和日志文件的大小可能会因用户数量和日志文件保留时间的不同而意外增长。通常情况下，大多数用户的 **/var** 无需超过约 1 GB 的空闲磁盘空间。

> **注意**
>
> 有时，**/var/tmp** 需要大量磁盘空间。安装新软件时，打包工具会在 **/var/tmp** 下解压缩软件包的临时副本。如果 **/var/tmp** 下没有足够的磁盘空间，在安装大型软件包（如 Firefox/LibreOffice）时可能会出现问题。

**/usr** 分区存放了许多支持系统的文件，包括 FreeBSD Ports 和系统源代码。建议为此分区分配至少 2 GB 的空间。另外，用户的主目录默认放在 **/usr/home**，但可以放在其他分区。在默认情况下，**/home** 是指向 **/usr/home** 的符号链接。

在选择分区大小时，请考虑空间需求。当一个分区中空间用尽，而另一个几乎未使用时可能会很麻烦。

作为经验法则，交换分区的大小应约为物理内存（RAM）大小的两倍。内存较少的系统在配置更大的交换分区时可能表现更好（在较大内存配置下交换分区可以更小）。配置过小的交换分区可能会导致虚拟内存页面扫描代码效率低下，并在增加更多内存时可能出现问题。

在配备多块 SCSI 磁盘或多个在不同控制器上运行的 IDE 磁盘的大型系统上，建议为每个驱动器都配置交换分区，最多可达四个驱动器。交换分区的大小应大致相同。内核可以处理任意大小，但内部数据结构的规模为最大交换分区的 4 倍。保持交换分区大小相近将使内核能在磁盘之间最优地划分交换空间。较大的交换空间可能会引发内核关于总配置交换的警告信息。如警告信息所示，通过增加用于跟踪交换分区分配的内存量，可以提高此限制。在强制重启之前，可能更容易从失控程序中恢复。

通过正确分区，较小的写入密集型分区引入的碎片将不会扩散到主要用于读取的分区。将写入负载较重的分区靠近磁盘边缘将提高这些分区的 I/O 性能。虽然较大分区中的 I/O 性能可能是必要的，但将它们更多地移向磁盘边缘不会比将 **/var** 移向边缘带来显著的性能提升。

## 2.6.2. 使用 UFS 的引导分区

选择此方法后，将显示可用磁盘的菜单。如果连接了多块磁盘，请选择要安装 FreeBSD 的磁盘。

![显示可以安装 FreeBSD 的磁盘列表](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-part-guided-disk.png)

**图 12. 从多块磁盘中选择**

选择磁盘后，下一菜单提示要么安装到整块磁盘，要么使用空闲空间创建分区。若选择 **Entire Disk**，则会自动创建填充整块磁盘的一般分区布局。选择 **Partition** 则会从磁盘上的未使用空间创建分区布局。

![菜单询问用户是否要使用磁盘上所有可用空间或希望创建分区](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-part-entire-part.png)

**图 13. 选择整块磁盘/分区**

下一个菜单显示可用分区方案类型的列表。对于 amd64 计算机，GPT 通常是最合适的选择。对于不兼容 GPT 的旧计算机，应使用 MBR。其他分区方案通常用于不常见或旧计算机。更多信息请参见 [分区方案](/di-2-zhang-an-zhuang-freebsd/2.6.-fen-pei-ci-pan-kong-jian)。

![菜单向用户显示不同类型的分区，并请求选择其中一种](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-part-manual-partscheme.png)

**图 14. 选择分区方案**

在创建分区布局后，请检查以确保满足安装需求。选择 **Revert** 将重置分区为其原始值。按 **Auto** 将重新创建自动 FreeBSD 分区。分区也可以手动创建、修改或删除。当分区正确时，选择 **Finish** 继续安装。

![菜单显示已创建的分区](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-part-review.png)

**图 15. 审阅已创建的分区**

磁盘配置完成后，下一菜单提供最后一次机会在格式化选定驱动器之前做更改。如果需要更改，请选择 **Back** 返回到主分区菜单。选择 **Revert & Exit** 将在不对驱动器做任何更改的情况下退出安装程序。选择 **Commit** 可开始安装过程。

![菜单指示用户所有更改将写入磁盘，并告知如果决定继续，现有数据将被永久删除。](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-final-confirmation.png)

**图 16. 最终确认**

要继续安装过程，请转到[获取安装文件](/di-2-zhang-an-zhuang-freebsd/2.7.-huo-qu-an-zhuang-wen-jian)。

## 2.6.3. 手动分区

选择此方法将打开分区编辑器：

![显示分区编辑器的菜单。](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-part-manual-create.png)

**图 17. 手动创建分区**

高亮显示安装驱动器（在此示例中为 `ada0`），然后选择 **Create** 可显示可用分区方案的菜单：

![显示不同类型分区方案的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-part-manual-partscheme.png)

**图 18. 手动创建分区**

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

**表 1. 分区方案**

| 缩写  | 说明                                                               |
| --- | ---------------------------------------------------------------- |
| APM | Apple 分区表，供 PowerPC® 使用。                                         |
| BSD | 无 MBR 的 BSD 标签，有时称为 *危险专用模式*，因为非 BSD 磁盘工具可能无法识别它。                |
| GPT | [全局唯一标识分区表](https://en.wikipedia.org/wiki/GUID_Partition_Table)。 |
| MBR | [主引导记录](https://en.wikipedia.org/wiki/Master_boot_record)。       |

选择并创建分区方案后，再次选择 **Create** 可创建分区。使用 **Tab** 可以将焦点移到字段（在循环浏览 `OK`、`Options` 和 `Cancel` 后）。

![请求类型的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-part-manual-addpart.png)

**图 19. 手动创建分区**

标准 FreeBSD GPT 安装至少使用三个分区，包括 UFS 或 ZFS：

* `freebsd-boot`/`efi`——存放 FreeBSD 引导代码。
* `freebsd-ufs`——FreeBSD UFS 文件系统。
* `freebsd-zfs`——FreeBSD ZFS 文件系统。更多有关 ZFS 的信息，请参见 [Z 文件系统 (ZFS)](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.1.-shi-shi-mo-shi-zfs-yu-zhong-bu-tong)。
* `freebsd-swap`——FreeBSD 交换空间。

有关可用 GPT 分区类型的说明，请参见 [gpart(8)](https://man.freebsd.org/cgi/man.cgi?query=gpart\&sektion=8\&format=html)。

可以创建多个文件系统分区。有些人喜欢传统布局，为 **/**、**/var**、**/tmp** 和 **/usr** 分配单独的分区。

> **技巧**
>
> 注意，**/tmp** 可以稍后作为基于内存的文件系统（[tmpfs(5)](https://man.freebsd.org/cgi/man.cgi?query=tmpfs\&sektion=4\&format=html)）添加，前提是系统内存足够。

有关示例，请参见创建传统拆分文件系统分区。

`Size` 可以用常用缩写输入：*K* 代表千字节，*M* 代表兆字节，*G* 代表吉字节。

> **技巧**
>
> 正确的扇区对齐能提供最佳性能，将分区大小设置为 4K 字节的整数倍，有助于确保在使用 512 字节或 4K 字节扇区的磁盘上实现对齐。通常，将分区大小设置为 1M 或 1G 的整数倍是最简单的方法，以确保每个分区都从 4K 的整数倍位置开始。有一个例外：用于 BIOS 引导的 *freebsd-boot* 分区由于传统引导代码的限制，其大小不应超过 512K。此限制不适用于 UEFI 引导。

如果分区将包含文件系统，则需要一个 `Mountpoint`。如果只创建单个 UFS 分区，挂载点应为 **/**。

`Label` 是分区的名称。驱动器名称或编号在驱动器连接到不同控制器/端口时可能会变化，但分区标签不会变化。在像 **/etc/fstab** 这样的文件中使用标签而不是驱动器名称和分区编号，使系统对硬件变化更具兼容性。GPT 标签在连接磁盘时出现在 **/dev/gpt/** 中。其他分区方案具有不同的标签功能，其标签出现在 **/dev/** 中的不同目录。

> **技巧**
>
> 在每个分区上使用唯一标签以避免相同标签的冲突。可以在标签中添加计算机名称、用途或位置的一些字母。例如，可以将 UFS 根分区的标签设置为 `labroot` 或 `rootfslab`，前提是计算机命名为 `lab`。

> **示例 1. 创建传统拆分文件系统分区**
>
> 对于传统的分区布局，其中 **/**、**/var**、**/tmp** 和 **/usr** 目录在各自的分区上是单独的文件系统，创建一个 GPT 分区方案，然后按如下所示创建分区。所示的分区大小适用于 20G 的目标磁盘。如果目标磁盘上有更多空间，较大的交换分区或 **/var** 分区可能会很有用。这里显示的标签以 `ex` 开头表示“示例”，但读者应使用上述说明的其他唯一标签值。
>
> 在默认情况下，FreeBSD 的 `gptboot` 期望第一个 UFS 分区为 **/** 分区。

| 分区类型           | 大小            | 挂载点      | 标签         |
| -------------- | ------------- | -------- | ---------- |
| `freebsd-boot` | `512K`        |          |            |
| `freebsd-ufs`  | `2G`          | **/**    | `exrootfs` |
| `freebsd-swap` | `4G`          |          | `exswap`   |
| `freebsd-ufs`  | `2G`          | **/var** | `exvarfs`  |
| `freebsd-ufs`  | `1G`          | **/tmp** | `extmpfs`  |
| `freebsd-ufs`  | 使用默认值（剩余磁盘空间） | **/usr** | `exusrfs`  |

创建自定义分区后，选择 **Finish** 可继续安装，并转到 [获取安装文件](/di-2-zhang-an-zhuang-freebsd/2.7.-huo-qu-an-zhuang-wen-jian)。

## 2.6.4. 使用 ZFS 根文件系统的引导分区

此分区模式仅适用于整块磁盘，将清除整块磁盘的内容。主要的 ZFS 配置菜单提供多个选项以控制池的创建。

![显示配置 ZFS 池的不同选项的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-menu.png)

**图 20. ZFS 分区菜单**

以下是此菜单中选项的概述：

* `Install`——使用选定的选项继续安装。
* `Pool Type/Disks`——配置 `Pool Type` 和将构成池的磁盘。自动 ZFS 安装程序目前仅支持创建一个顶级 vdev，除非在条带模式下。要创建更复杂的池，请参阅 [Shell 模式分区](#id-2.6.5.-shell-mo-shi-fen-qu) 中的说明。
* `Rescan Devices`——重新填充可用磁盘的列表。
* `Disk Info`——此菜单可用于检查每块磁盘，包括其分区表以及设备型号和序列号等其他信息（如可用）。
* `Pool Name`——确定池的名称。默认名称为 *zroot*。
* `Force 4K Sectors?`——强制使用 4K 扇区。默认情况下，安装程序将自动创建与 4K 边界对齐的分区，并强制 ZFS 使用 4K 扇区。这在 512 字节扇区的磁盘上是安全的，并且可以确保在 512 字节磁盘上创建的池将来可以添加 4K 扇区的磁盘，无论是作为额外的存储空间还是替换故障磁盘。按 **回车键** 选择是否激活此选项。
* `Encrypt Disks?`——加密磁盘能让用户使用 GELI 加密磁盘。有关磁盘加密的更多信息，请参见 [“使用 geli 进行磁盘加密”](/di-21-zhang-cun-chu/21.12.-jia-mi-ci-pan-fen-qu)。按 **回车键** 选择是否激活此选项。
* `Partition Scheme`——选择分区方案。大多数情况下推荐使用 GPT。按 **回车键** 在不同选项之间选择。
* `Swap Size`——确定交换空间的大小。
* `Mirror Swap?`——是否在磁盘之间镜像交换。请注意，启用镜像交换将破坏崩溃转储。按 **回车键** 激活或不激活此选项。
* `Encrypt Swap?`——是否加密交换。每次系统引导时将使用临时密钥加密交换，并在重启时丢弃。按 **回车键** 选择是否激活此选项。有关交换加密的更多信息，请参见 [“加密交换分区”](/di-21-zhang-cun-chu/21.13.-jia-mi-jiao-huan-fen-qu)。
* `ZFS Pool Options`——指定创建 ZFS 根池时要应用的附加池属性。有关选项的更多信息，请参见 [zpool-create(8)](https://man.freebsd.org/cgi/man.cgi?query=zpool-create\&sektion=8\&format=html) 和 [zpoolprops(7)](https://man.freebsd.org/cgi/man.cgi?query=zpoolprops\&sektion=7\&format=html)。

选择 **T** 可配置 `Pool Type` 和将构成池的磁盘。

![请求虚拟设备类型的菜单。如：条带](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-vdev_type.png)

**图 21. ZFS 池类型**

以下是此菜单中可以选择的 `Pool Type` 的摘要：

* `stripe`——条带化提供所有连接设备的最大存储，但没有冗余。如果仅有一块磁盘故障，池中的数据将永久丢失。
* `mirror`——镜像在每块磁盘上存储所有数据的完整副本。镜像提供良好的读取性能，因为数据是从所有磁盘并行读取的。写入性能较慢，因为数据必须写入池中的所有磁盘。可容忍除了一块磁盘外的所有磁盘故障。此选项至少需要两块磁盘。
* `raid10`——条带镜像。提供最佳性能，但存储容量最少。此选项需要偶数块磁盘，至少四块磁盘。
* `raidz1`——单重冗余 RAID。可容忍一块磁盘同时故障。此选项至少需要三块磁盘。
* `raidz2`——双重冗余 RAID。可容忍两块磁盘同时故障。此选项至少需要四块磁盘。
* `raidz3`——三重冗余 RAID。可容忍三块磁盘同时故障。此选项至少需要五块磁盘。

选择了 `Pool Type` 后，将显示可用磁盘的列表，系统会提示用户选择一块或多块磁盘以构成池。然后将验证配置，以确保选择了足够的磁盘。如果验证失败，请选择 `Change Selection` 返回磁盘列表，或选择 `Back` 更改 `Pool Type`。

![请求添加到池的磁盘数量的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-disk_select.png)

**图 22. 磁盘选择**

![指示未选择足够磁盘的菜单。](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-vdev_invalid.png)

**图 23. 无效选择**

如果列表中缺少一块或多块磁盘，如果在引导安装程序后新加了磁盘，请选择 `Rescan Devices` 可刷新可用磁盘的列表。

![重新设备扫描](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-rescan-devices.png)

**图 24. 重新扫描设备**

为了避免意外擦除错误的磁盘，可以使用菜单 `Disk Info` 检查每块磁盘，包括其分区表以及设备型号和序列号等其他信息（如果可用）。

![显示分区信息的菜单。](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-disk_info.png)

**图 25. 分析磁盘**

选择 **N** 可配置 `Pool Name`。输入所需的名称，然后选择 **OK** 确定名称，或选择 **Cancel** 返回主菜单来采用默认名称。

![请求池名称的菜单。](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-pool-name.png)

**图 26. 池名称**

选择 **S** 设置交换空间的大小。输入所需的交换分区大小，然后选择 **OK** 确定，或选择 **Cancel** 返回主菜单并使用默认值。

![请求交换内存大小的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-swap-amount.png)

**图 27. 交换大小**

若所有选项设置为所需值，选择菜单顶部的选项 **>>> Install**。安装程序将提供最后一次取消的机会，确认所选驱动器的内容将被销毁以创建 ZFS 池。

![指示用户数据将丢失的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-warning.png)

**图 28. 最后机会**

如果启用了 GELI 磁盘加密，安装程序将两次提示输入用于加密磁盘的密码短语。然后将开始初始化加密。

![请求加密设备密码的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-geli_password.png)

**图 29. 磁盘加密密码**

![显示加密初始化的菜单。](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-zfs-init-encription.png)

**图 30. 初始化加密**

安装过程将正常继续。要继续安装，请访问[获取安装文件](/di-2-zhang-an-zhuang-freebsd/2.7.-huo-qu-an-zhuang-wen-jian)。

## 2.6.5. Shell 模式分区

在高级安装时，bsdinstall 的分区菜单可能无法提供所需的灵活性。专业用户可以从分区菜单中选择 **Shell** 选项，以手动对驱动器分区，创建文件系统，填写 **/tmp/bsdinstall\_etc/fstab**，并在 **/mnt** 下挂载文件系统。在完成后，输入 `exit` 可返回 bsdinstall 继续安装。


# 2.7.获取安装文件

安装时间会因所选安装组件、安装盘和计算机速度而异。一系列信息可指示进度。

首先，安装程序会格式化所选的磁盘并初始化分区。接下来，在使用 `bootonly media` 或 `mini memstick` 的情况下，它会下载所选组件：

![显示下载不同组件的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-distfile-fetching.png)

**图 31. 获取安装文件**

接下来，会验证安装文件的完整性，确保它们在下载过程中没有损坏或在安装盘中读取错误：

![显示验证不同组件的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-distfile-verifying.png)

**图 32. 校验安装文件**

最后，经过校验的安装文件会被解压到磁盘上：

![显示提取不同组件的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-distfile-extracting.png)

**图 33. 提取安装文件**

在所有请求的安装文件解压完成后，bsdinstall 将显示首次安装后的配置界面。可用的后配置选项将在下一节中概述。


# 2.8.网络接口、账户、时区、服务和加固

## 2.8.1. 设置 `root` 密码

首先，必须设置 `root` 密码。在输入密码时，屏幕上不会回显正在输入的字符。为防止输入错误，密码需要输入两次。

![请求输入 root 用户密码的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-post-root-passwd.png)

**图 34. 设置 `root` 密码**

## 2.8.2. 配置网络接口

接下来，将显示计算机上找到的网络接口列表。选择要配置的接口。

![显示不同网络接口供配置的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-interface.png)

**图 35. 选择网络接口**

如果选择以太网接口，安装程序将跳转到菜单[选择 IPv4 网络](/di-2-zhang-an-zhuang-freebsd/2.8.-zhang-hu-shi-qu-fu-wu-he-an-quan)。如果选择无线网络接口，系统将扫描无线接入点：

![显示无线网络扫描的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-wireless-scan.png)

**图 36. 扫描无线接入点**

无线网络通过服务集标识 (SSID) 识别；每个网络都有一个简短、独特的名称。在扫描过程中会列出找到的 SSID，然后提供该网络的可用加密类型的概述。如果所需 SSID 未出现在列表中，可选择 **Rescan** 重新扫描。若所需网络仍未出现，请检查天线连接是否存在问题，或尝试将计算机移近接入点。每次更改后都应重新扫描。

![显示不同无线网络供连接的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-wireless-accesspoints.png)

**图 37. 选择无线网络**

接下来，输入连接到选定无线网络的加密信息。强烈建议使用 WPA2 加密，而不是几乎不提供安全性的旧加密类型，如 WEP。若网络使用 WPA2，请输入密码，也称为预共享密钥 (PSK)。出于安全原因，输入框中输入的字符将以星号显示。

![请求输入无线网络密码的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-wireless-wpa2setup.png)

**图 38. WPA2 设置**

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

![指示是否要为选定接口配置 IPv4 的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-interface-ipv4.png)

**图 39. 选择 IPv4 网络**

有两种方法可配置 IPv4。DHCP 会自动正确配置网络接口，如果网络提供了 DHCP 服务器，则应使用。若没有 DHCP 服务器，则需要手动输入地址信息，采用静态配置。

> **注意**
>
> 请不要随意输入网络信息，因为那样将无法正常工作。若没有 DHCP 服务器，请从网络管理员或互联网服务提供商处获取[所需网络信息](/di-2-zhang-an-zhuang-freebsd/2.3.-an-zhuang-qian-de-zhun-bei-gong-zuo)中列出的信息。

如果可用 DHCP 服务器，请在下一个菜单中选择 **Yes** 以自动配置网络接口。安装程序会暂停约一分钟，用于查找 DHCP 服务器，获取系统的地址信息。

![指示是否要为选定接口配置 DHCP 的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-interface-ipv4-dhcp.png)

**图 40. 选择 IPv4 DHCP 配置**

如果没有 DHCP 服务器，请选择 **No** 并在此菜单中输入以下地址信息：

![请求配置 IPv4 网络的数据的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-interface-ipv4-static.png)

**图 41. 静态 IPv4 配置**

* `IP Address`——分配给这台计算机的 IPv4 地址。该地址必须是唯一的，不能被局域网上的其他设备使用。
* `Subnet Mask`——网络的子网掩码。
* `Default Router`——网络默认网关的 IP 地址。

接下来的界面将询问是否应为接口配置 IPv6。如果 IPv6 可用且需要，请选择 **Yes**。

![指示是否要为选定接口配置 IPv6 的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-interface-ipv6.png)

**图 42. 选择 IPv6 网络**

也有两种方法可配置 IPv6。无状态地址自动配置 (SLAAC) 将自动从本地路由器请求正确的配置信息。更多有关信息，请参阅 [rfc4862](http://tools.ietf.org/html/rfc4862)。静态配置需要手动输入网络信息。

若 IPv6 路由器可用，请在下个界面中选择 **Yes** 自动配置网络接口。安装程序会暂停约一分钟，用于查找路由器并获取系统的地址信息。

![指示是否要为选定接口配置 SLAAC 的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-interface-slaac.png)

**图 43. 选择 IPv6 SLAAC 配置**

如果没有 IPv6 路由器，请选择 **No** 并在此菜单中输入以下地址信息：

![请求配置 IPv6 网络的数据的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-interface-ipv6-static.png)

**图 44. 静态 IPv6 配置**

* `IPv6 Address`——分配给这台计算机的 IPv6 地址。该地址必须是唯一的，不能被局域网上的其他设备使用。
* `Default Router`——网络默认网关的 IPv6 地址。

最后一个网络配置菜单用于配置域名系统 (DNS) 解析器，它将主机名转换为网络地址和反向转换。如果使用 DHCP/SLAAC 自动配置了网络接口，`Resolver Configuration` 值可能已经填写。否则，在 `Search` 字段中输入本地网络的域名。`DNS #1` 和 `DNS #2` 是 DNS 服务器的 IPv4/IPv6 地址。至少需要一个 DNS 服务器。

![请求配置网络 DNS 的数据的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-configure-network-ipv4-dns.png)

**图 45. DNS 配置**

在接口配置完成后，选择一个位于与 FreeBSD 正在安装的计算机相同区域的镜像站。当镜像站靠近目标计算机时，可以更快地下载文件，从而减少安装时间。

> **技巧**
>
> 选择 `http://download.freebsd.org Main Site (GeoDNS, HTTP)` 或 `ftp://download.freebsd.org Main Site (GeoDNS, FTP)` 将自动路由到最近的镜像。

![请求选择网络镜像的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-netinstall-mirrorselect.png)

**图 46. 选择镜像**

## 2.8.3. 设置时区

接下来的菜单用于通过选择地理区域、国家/区域和时区来确定正确的本地时间。设置时区可以让系统自动纠正区域时间变化，例如夏令时，并正确执行其他与时区相关的功能。

下面的示例适用于位于西班牙欧洲大陆时区的机器。选择会根据地理位置而有所不同。

![请求时区区域的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-timezone-region.png)

**图 47. 选择区域**

使用方向键选择适当的区域，然后按 **回车键**。

![请求时区国家/地区的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-timezone-country.png)

**图 48. 选择国家/区域**

使用方向键选择适当的国家/区域并按 **回车键**。

![请求时区的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-timezone-zone.png)

**图 49. 选择时区**

使用方向键选择适当的时区并按 **回车键**。

![请求确认所选时区的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-timezone-confirm.png)

**图 50. 确认时区**

确认时区的缩写是否正确。

![请求系统日期的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-timezone-date.png)

**图 51. 选择日期**

使用方向键选择适当的日期，然后按 **Set Date**。还可以通过按 **Skip** 来跳过日期选择。

![请求系统时间的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-timezone-time.png)

**图 52. 选择时间**

使用方向键选择适当的时间，然后按 **Set Time**。还可以通过按 **Skip** 来跳过时间选择。

## 2.8.4. 启用服务

下个界面用于配置系统引导时将启动哪些系统服务。所有这些服务都是可选的。只启动系统正常运行所需的服务。

![显示可用不同服务的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-config-services.png)

**图 53. 选择要启用的附加服务**

以下是可以在此菜单中启用的服务摘要：

* `sshd`——安全 shell（SSH）守护进程用于通过加密连接远程访问系统。应仅在能远程登录系统时才启用此服务。
* `ntpd`——网络时间协议（NTP）守护进程，用于自动时钟同步。如果希望将系统时钟与远程时间服务器或池同步，请启用此服务。
* `ntpd_sync_on_start`——启用后，ntpd 在引导时以 `-g` 参数运行，在开机时立即执行一次性时钟同步。
* `local_unbound`——启用本机 DNS unbound。请记住，这只是用于本机缓存转发解析器的配置。如果目标是为整个网络设置解析器，请安装 [dns/unbound](https://cgit.freebsd.org/ports/tree/dns/unbound/)。
* `powerd`——系统电源控制工具，用于电源控制和节能。
* `moused`——如果要在命令行系统控制台使用鼠标，请启用此服务。
* `dumpdev`——崩溃转储在调试系统问题时非常有用，因此建议用户启用它们。

## 2.8.5. 启用安全加固选项

下个菜单用于配置要启用的安全选项。所有这些选项都是可选的，但建议使用。

![显示不同安全加固选项的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-hardening.png)

**图 54. 选择安全加固选项**

以下是可以在此菜单中启用的选项摘要：

* `hide_uids`——隐藏以其他用户（UID）身份运行的进程。防止无权限用户查看其他用户正在运行的进程。
* `hide_gids`——隐藏以其他组（GID）身份运行的进程。防止无权限用户查看其他组正在运行的进程。
* `hide_jail`——隐藏在 Jail 中运行的进程。防止无权限用户查看在 Jail 内部运行的进程。
* `read_msgbuf`——禁止无权限用户读取内核信息缓冲区。防止无权限用户使用 [dmesg(8)](https://man.freebsd.org/cgi/man.cgi?query=dmesg\&sektion=8\&format=html) 查看内核日志缓冲区中的信息。
* `proc_debug`——禁止无权限用户使用进程调试功能。禁用各种无权限的进程间调试服务，包括某些 procfs 功能、`ptrace()` 和 `ktrace()`。请注意，这也会阻止使用诸如 [lldb(1)](https://man.freebsd.org/cgi/man.cgi?query=lldb\&sektion=1\&format=html)、[truss(1)](https://man.freebsd.org/cgi/man.cgi?query=truss\&sektion=1\&format=html) 和 [procstat(1)](https://man.freebsd.org/cgi/man.cgi?query=procstat\&sektion=1\&format=html) 的调试工具，以及某些脚本语言（如 PHP）中的一些内置调试功能。
* `random_pid`——随机化进程的 PID。
* `clear_tmp`——在系统引导时清理 **/tmp** 目录。
* `disable_syslogd`——禁用打开 syslogd 网络套接字。在默认情况下，FreeBSD 以安全的方式运行 syslogd——使用 `-s`。这防止守护进程监听端口 514 上的传入 UDP 请求。启用此选项后，syslogd 将以 `-ss` 运行，从而阻止 syslogd 打开任何端口。有关更多信息，请参见 [syslogd(8)](https://man.freebsd.org/cgi/man.cgi?query=syslogd\&sektion=8\&format=html)。
* `secure_console`——使命令提示符在进入单用户模式时请求 `root` 密码。
* `disable_ddtrace`——DTrace 可以以影响运行内核的模式运行。除非明确启用，否则不能使用破坏性操作。在使用 DTrace 时，请使用 `-w` 来启用此选项。有关更多信息，请参见 [dtrace(1)](https://man.freebsd.org/cgi/man.cgi?query=dtrace\&sektion=1\&format=html)。

## 2.8.6. 添加用户

下个界面提示，要创建至少一个用户账户。建议使用用户账户而不要以 `root` 身份登录系统。在以 `root` 身份登录时，几乎没有限制和保护措施。以普通用户身份登录更安全。

选择 **Yes** 来添加新用户。

![请求是否要向系统添加用户的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-adduser1.png)

**图 55. 添加用户账户**

按照提示输入用户账户的所需信息。示例中所示[输入用户信息](/di-2-zhang-an-zhuang-freebsd/2.8.-zhang-hu-shi-qu-fu-wu-he-an-quan)创建 `asample` 用户账户。

![请求新用户不同信息的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-adduser2.png)

**图 56. 输入用户信息**

以下是要输入的信息摘要：

* `Username`——用户登录时输入的名称。常见的约定是使用名字的首字母与姓氏组合，只要每个用户名在系统中是唯一的。用户名区分大小写，不应包含空格。
* `Full name`——用户的全名。可以包含空格，并作为用户账户的概述。
* `Uid`——用户 ID。通常留空，以便系统自动分配一个值。
* `Login group`——用户的组。通常留空以选用默认值。
* `Invite user into other groups?`——用户将作为成员加入的附加组。如果用户需要管理权限，请在此处输入 `wheel`。
* `Login class`——通常留空以选择默认值。
* `Shell`——输入所列值之一以设置用户的交互式 shell。有关 shell 的更多信息，请参见 [Shell](/di-3-zhang-freebsd-ji-chu/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` 创建新用户。

![显示新用户信息并请求确认是否正确的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-adduser3.png)

**图 57. 退出用户和组管理**

如果还有更多用户要添加，回答 `Add another user?` 的问题为 `yes`。输入 `no` 可结束添加用户并继续安装。

有关添加用户和用户管理的更多信息，请参见[用户和基本账户管理](/di-3-zhang-freebsd-ji-chu/3.3.-yong-hu-he-ji-ben-zhang-hu-guan-li)。

## 2.8.7. 最终配置

在所有内容安装和配置完成后，将提供最后一次修改设置的机会。

![显示在完成安装前执行的不同操作的菜单。例如：添加用户](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-finalconfiguration.png)

**图 58. 最终配置**

使用此菜单做任何更改或额外配置，然后完成安装。

* `Add User`—— [添加用户](#id-2.8.6.-tian-jia-yong-hu)中概述。
* `Root Password`——在[设置 `root` 密码](#id-2.8.1.-she-zhi-root-mi-ma)中概述。
* `Hostname`——在[设置主机名](/di-2-zhang-an-zhuang-freebsd/2.5.-shi-yong-bsdinstall)中概述。
* `Network`——在[配置网络接口](#id-2.8.2.-pei-zhi-wang-luo-jie-kou)中概述。
* `Services`——在[启用服务](#id-2.8.4.-qi-yong-fu-wu)中概述。
* `System Hardening`——在[启用安全加固选项](#id-2.8.5.-qi-yong-an-quan-jia-gu-xuan-xiang)中概述。
* `Time Zone`——在[设置时区](#id-2.8.3.-she-zhi-shi-qu)中概述。
* `Firmware`——下载并安装系统组件（如 Wi-Fi 或显卡）所需的固件。
* `Handbook`——下载、安装 FreeBSD 手册。

配置完成后，选择 **Exit**。

![显示安装已完成的菜单，并询问是否要打开 shell 做手动更改](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-final-modification-shell.png)

**图 59. 手动配置**

bsdinstall 会提示需要在重启新系统之前完成的任何额外配置。选择 **Yes** 以退出到新系统中的 shell，或选择 **No** 以继续安装的最后一步。

![显示安装已完成并询问是否重启系统或访问 Live CD 的菜单](https://docs.freebsd.org/images/books/handbook/bsdinstall/bsdinstall-mainexit.png)

**图 60. 完成安装**

如果需要进一步的配置或特殊设置，选择 **Live CD** 以将安装媒体引导为 Live CD 模式。

如果安装完成，选择 **Reboot** 以重启计算机，引导新的 FreeBSD 系统。不要忘记移除 FreeBSD 安装媒体，否则计算机可能会再次从中引导。

当 FreeBSD 引导时，会显示引导信息。系统引导完成后，将显示登录提示。在 `login:` 提示符下，输入安装过程中添加的用户名。避免以 `root` 身份登录。有关如何在需要管理访问时成为超级用户的说明，请参见[超级用户账户](/di-3-zhang-freebsd-ji-chu/3.3.-yong-hu-he-ji-ben-zhang-hu-guan-li)。

在引导过程中出现的信息可以通过按 **Scroll-Lock** 来打开回滚缓冲区查看。可以使用 **PgUp**、**PgDn** 和方向键向上滚动查看信息。完成后，再次按 **Scroll-Lock** 解锁显示并返回控制台。要在系统运行一段时间后查看这些信息，可以从命令提示符下输入 `less /var/run/dmesg.boot`。查看后按 **q** 返回命令行。

如果在[选择要启用的附加服务](/di-2-zhang-an-zhuang-freebsd/2.8.-zhang-hu-shi-qu-fu-wu-he-an-quan)中启用了 sshd，则第一次引导可能会稍慢，因为系统正在生成 SSH 主机密钥。后续引导会更快。然后将显示密钥的指纹，如以下示例所示：

```sh
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 的更多信息，请参见 [OpenSSH](/di-16-zhang-an-quan/16.7.-openssh)。

FreeBSD 默认不安装图形环境。有关安装和配置图形窗口管理器的更多信息，请参见 [X Window 系统](/di-5-zhang-xwindow-xi-tong/5.1.-gai-shu)。

正确关闭 FreeBSD 计算机有助于保护数据和硬件免受损坏。*在系统没有正确关闭之前，请勿关闭电源！* 如果用户是 `wheel` 组的成员，可以在命令行输入 `su`，再输入 `root` 密码以成为超级用户。然后，输入 `shutdown -p now`，系统可安全关闭，在硬件支持的情况下会自动关机。


# 2.9.故障排除

本节涉及基本的安装故障排除，如常见问题。

请查看 [FreeBSD 发行信息](https://www.freebsd.org/releases/)页面上列出的硬件注意事项，确保硬件受支持。

> **注意**
>
> 某些安装问题可以通过更新各种硬件组件的固件来避免或缓解——最明显的是主板。主板固件通常被称为 BIOS。大多数主板和计算机制造商都有一个提供固件升级和升级信息的网站。
>
> 制造商通常建议若非必要，不要升级主板 BIOS，仅当出现关键更新等情况时才考虑升级。升级过程 *可能* 出现问题，导致 BIOS 不完整，进而使计算机无法正常工作。

如果系统在引导时探测硬件时卡住，或在安装过程中表现异常，ACPI 可能是罪魁祸首。在 i386 和 amd64 平台上，FreeBSD 在引导期间检测到系统 ACPI 服务时，会大量使用它来帮助系统配置。遗憾的是，ACPI 驱动程序以及系统主板和 BIOS 固件中仍然存在一些错误。可通过在第三阶段引导加载程序中设置 hint `hint.acpi.0.disabled` 来禁用 ACPI：

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

每次系统引导时，这个设置都会被重置，因此需要将 `hint.acpi.0.disabled="1"` 添加到文件 **/boot/loader.conf**。有关引导加载程序的更多信息，请参见 [“概述”](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.1.-gai-shu)。


# 2.10.使用 Live CD

bsdinstall 的欢迎菜单（见[欢迎菜单](/di-2-zhang-an-zhuang-freebsd/2.4.-kai-shi-an-zhuang)）提供了选项 **Live CD**。这对那些仍在考虑 FreeBSD 是否适合自己的用户很有帮助，他们可以在安装之前测试一些功能。

在使用 **Live CD** 前应注意以下几点：

* 使用系统需要身份验证。用户名为 `root`，密码为空。
* 由于系统直接从安装盘运行，性能将明显弱于安装在硬盘上的系统。
* 此功能仅提供命令提示符，未提供图形界面。


# 3.1.概述

本章介绍 FreeBSD 操作系统的基础命令和功能。本章的大部分内容也适用于其他类 UNIX® 操作系统。FreeBSD 新用户建议仔细阅读本章。

阅读本章，你将了解：

* 如何使用和配置虚拟控制台。
* 如何在 FreeBSD 上创建和管理用户和组。
* UNIX® 文件权限和 FreeBSD 文件标志的工作原理。
* FreeBSD 文件系统的默认布局。
* FreeBSD 磁盘结构。
* 如何挂载及卸载文件系统。
* 进程、守护进程和信号分别是什么。
* 什么是 Shell，如何修改默认登录环境。
* 如何使用基本的文本编辑器。
* 什么是设备和设备节点。
* 如何阅读手册页以获取更多信息。


# 3.2.虚拟控制台和终端

如果没有配置 FreeBSD 在引导时自动进入图形环境，那么系统将引导到命令行登录提示界面，如下所示：

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

login:
```

第一行包含了一些系统信息。`amd64` 表示 FreeBSD 正运行在 64 位 x86 系统上。主机名是 `pc3.example.org`，而 `ttyv0` 表示这是“系统控制台”。第二行是登录提示符。

由于 FreeBSD 是多用户系统，因此它需要一种方法来区分不同的用户。这是通过要求每个用户在访问系统上的程序之前先行登录来实现的。每位用户都有一个唯一的“用户名”及其对应的个人“密码”。

要登录系统控制台，请输入安装系统时配置的用户名（详见 [添加用户](/di-2-zhang-an-zhuang-freebsd/2.8.-zhang-hu-shi-qu-fu-wu-he-an-quan)）并按下 **Enter** 键。然后输入与该用户名关联的密码并再次按下 **Enter**。出于安全原因，输入的密码*不会回显*。

若输入了正确的密码，将会显示“今日信息”（MOTD），随后出现命令提示符。根据用户创建时选择的 shell，此提示符可能是 `#`、`$` 或 `%` 字符。这个提示符表明用户已登录到 FreeBSD 系统控制台，并可开始尝试使用可用命令。

## 3.2.1. 虚拟控制台

虽然可以用系统控制台来与系统交互，但在 FreeBSD 系统键盘上使用命令行的用户通常会登录到虚拟控制台。这是因为系统消息默认会输出到系统控制台上。这些信息会覆盖在用户正在处理的命令和文件上，从而难以专注于手头的工作。

FreeBSD 默认配置了多个虚拟控制台供用户输入命令。每个虚拟控制台都有自己的登录提示和 shell，用户可以方便地在它们之间切换。这实质上提供了图形环境中多窗口操作的命令行等价体验。

FreeBSD 保留了快捷键 **Alt**+**F1** 到 **Alt**+**F8** 用于切换虚拟控制台。使用 **Alt**+**F1** 可切换到系统控制台（`ttyv0`），**Alt**+**F2** 可访问第一个虚拟控制台（`ttyv1`），**Alt**+**F3** 可访问第二个虚拟控制台（`ttyv2`），依此类推。当使用 Xorg 作为图形控制台时，快捷键变为 **Ctrl**+**Alt**+**F1** 返回文本模式虚拟控制台。

在控制台之间切换时，FreeBSD 会管理屏幕输出。这样就产生了拥有多个虚拟屏幕和键盘的错觉，每个屏幕和键盘都可以用来向 FreeBSD 输入要执行的命令。在一个虚拟控制台中启动的程序在切换到其他控制台时 *不会* 停止运行。

更详细的 FreeBSD 控制台与键盘驱动说明，可参考 [kbdcontrol(1)](https://man.freebsd.org/cgi/man.cgi?query=kbdcontrol\&sektion=1\&format=html)、[vidcontrol(1)](https://man.freebsd.org/cgi/man.cgi?query=vidcontrol\&sektion=1\&format=html)、[atkbd(4)](https://man.freebsd.org/cgi/man.cgi?query=atkbd\&sektion=4\&format=html)、[syscons(4)](https://man.freebsd.org/cgi/man.cgi?query=syscons\&sektion=4\&format=html) 和 [vt(4)](https://man.freebsd.org/cgi/man.cgi?query=vt\&sektion=4\&format=html)。

在 FreeBSD 中，可用虚拟控制台的数量配置在 `/etc/ttys` 文件的以下部分：

```sh
# name    getty                         type  status comments
#
ttyv0   "/usr/libexec/getty Pc"         xterm   on  secure
# 虚拟终端
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
```

要禁用某个虚拟控制台，在对应那一行的开头加上注释符号（`#`）。例如，要将虚拟控制台数量从八个减少到四个，可以在 `ttyv5` 到 `ttyv8` 这四行前添加 `#`。*不要*注释掉系统控制台 `ttyv0` 的那一行。注意最后一个虚拟控制台（`ttyv8`）用于在已安装并配置 Xorg 时访问图形环境，详见 [X 窗口系统](/di-5-zhang-xwindow-xi-tong/5.1.-gai-shu)。

关于该文件中每一列的详细说明以及虚拟控制台的可用选项，参见 [ttys(5)](https://man.freebsd.org/cgi/man.cgi?query=ttys\&sektion=5\&format=html)。

## 3.2.2. 单用户模式

FreeBSD 引导菜单提供了选项“Boot Single User”。如果选择此项，系统将引导到一种特殊模式，称为“单用户模式”。该模式通常用于修复无法引导的系统，或者在不知道 `root` 密码时重置该密码。在单用户模式下，网络功能和其他虚拟控制台不可用。但可以获得系统的完整 `root` 权限，并且默认不需要输入 `root` 密码。正因如此，要引导进入此模式就需要对键盘有物理访问权限。在制定 FreeBSD 系统安全策略时，应当考虑究竟有哪些人能接触键盘。

控制单用户模式的设置位于 `/etc/ttys` 文件的以下部分：

```sh
# name  getty                           type  status  comments
#
# 如果 console 被标记为 "insecure"，则 init 会要求输入 root 密码
# 进入单用户模式时。
console none                            unknown  off  secure
```

在默认情况下，状态设为 `secure`。这意味着默认假设对键盘的物理访问要么不重要，要么由物理安全策略加以控制。如果将该设置改为 `insecure`，则说明当前环境是不安全的，因为任何人都可以访问键盘。当将这一行改为 `insecure` 时，FreeBSD 会在用户选择引导单用户模式时提示输入 `root` 密码。

> **注意**
>
> **更改此设置为 `insecure` 时请小心！** 如果忘记了 `root` 密码，虽然仍可引导到单用户模式，但对不熟悉 FreeBSD 引导流程的人来说可能会很困难。

## 3.2.3. 更改控制台分辨率

FreeBSD 控制台的默认显示模式可以调整为 1024x768、1280x1024 或任何显卡和显示器支持的分辨率。要使用不同的显示模式，需加载 `VESA` 模块：

```sh
# kldload vesa
```

要查看硬件支持哪些显示模式，请使用 [vidcontrol(1)](https://man.freebsd.org/cgi/man.cgi?query=vidcontrol\&sektion=1\&format=html)。运行以下命令可获取支持的显示模式列表：

```sh
# vidcontrol -i mode
```

此命令的输出列出了硬件支持的分辨率。要选择新的分辨率，使用 `root` 用户身份通过 [vidcontrol(1)](https://man.freebsd.org/cgi/man.cgi?query=vidcontrol\&sektion=1\&format=html) 指定模式：

```sh
# vidcontrol MODE_279
```

如果新的分辨率符合要求，可以通过在 `/etc/rc.conf` 中添加以下行，使其在引导时自动生效：

```sh
allscreens_flags="MODE_279"
```


# 3.3.用户和基本账户管理

FreeBSD 能让多个用户同时使用计算机。尽管同一时间只能有一个用户坐在屏幕前使用键盘，但任意数量的用户都可以通过网络登录系统。为了使用系统，每位用户都应拥有自己的用户账户。

本章将介绍：

* FreeBSD 系统中不同类型的用户账户；
* 如何添加、删除和修改用户账户；
* 如何设置限制以控制用户和用户组可访问的资源；
* 如何创建用户组，并将用户添加为组成员。

## 3.3.1. 账户类型

由于访问 FreeBSD 系统的所有操作都必须通过账户完成，且所有进程均由用户启动，因此用户与账户管理至关重要。

FreeBSD 中主要有三类账户：系统账户、用户账户，以及超级用户账户。

### 3.3.1.1. 系统账户

系统账户用于运行诸如 DNS、邮件和 Web 服务器等服务。这样做的原因是出于安全考虑；如果所有服务都以超级用户身份运行，它们将可以不受限制地执行操作。

系统账户的例子如 `daemon`、`operator`、`bind`、`news` 和 `www`。

`nobody` 是通用的非特权系统账户。然而，使用 `nobody` 的服务越多，该用户关联的文件和进程就越多，从而其潜在权限也逐渐提升。

### 3.3.1.2. 用户账户

用户账户是分配给真实用户的，用于登录和使用系统。每位访问系统的人都应拥有一个唯一的用户账户。这样可以让管理员了解每位用户的操作，并防止用户破坏其他用户的设置。

每位用户可以通过配置默认 shell、编辑器、组合键和语言设置等方式，设置适合自己的系统使用环境。

FreeBSD 系统中的每个用户账户都包含以下信息：

**用户名**\
用户名是在 `login:` 提示符处输入的标识。每个用户必须拥有唯一的用户名。创建合法用户名的规则详见 [passwd(5)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=5\&format=html)。建议使用不超过八个字符且全部小写的用户名，以保持对旧应用程序的兼容性。

**密码**\
每个账户都有一个关联的密码。

**用户 ID（UID）**\
用户 ID 是用于在 FreeBSD 系统中唯一标识该用户的数字。支持用户名参数的命令会首先将其转换为 UID。建议使用小于 65535 的 UID，因部分软件可能对更大的 UID 兼容性不佳。

**组 ID（GID）**\
组 ID 是用于唯一标识用户所属主要用户组的数字。组是一种机制，通过 GID（而非 UID）来控制对资源的访问。这可显著减小部分配置文件的体积，并能让用户同时属于多个组。建议使用不超过 65535 的 GID，因更高的 GID 可能会导致某些软件运行异常。

**登录分级（Login class）**\
登录分级是组机制的扩展，用于在面向不同用户时提供更大的灵活性。相关内容将在 [配置登录分级](/di-16-zhang-an-quan/16.3.-zhang-hu-an-quan) 中进一步讨论。

**密码变更时间**\
默认情况下，密码不会过期。但也可以为每个用户单独启用密码过期策略，强制其在一段时间后更改密码。

**账户过期时间**\
FreeBSD 默认不会使账户过期。如需创建具有使用期限的账户（例如学校中的学生账户），可使用 [pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) 命令指定账户过期时间。若过期，该账户将无法登录，但其目录和文件仍会保留。

**用户全名**\
用户名是 FreeBSD 识别该账户的唯一标识，但不一定对应用户的真实姓名。这个字段和注释类似，可以包含空格、大写字母，并且长度可以超过 8 个字符。

**家目录**\
家目录是系统中某个目录的完整路径，是用户登录系统后的起始位置。通常的做法是将所有用户的家目录放在 **/home/用户名** 或 **/usr/home/用户名** 下。用户可在其家目录中存储个人文件和子目录。

**用户 shell**\
shell 是用户与系统交互的默认环境。存在多种 shell 类型，有经验的用户通常会有自己的偏好，可在账户设置中配置。

### 3.3.1.3. 超级用户账户

超级用户账户通常称为 `root`，用于以无限制权限管理系统。因此，**不应**将其用于日常任务，例如收发邮件、探索系统或编程。

与其他用户账户不同，超级用户可以无所限制地操作系统，若被误用则可能造成严重后果。普通用户无法因失误而破坏整个操作系统。因此建议用户日常使用普通账户，仅在命令需要额外权限时再切换为超级用户。

以超级用户身份执行命令时，务必反复仔细检查命令内容，因为多一个空格或少一个字符，都可能造成无法挽回的数据损失。

获取超级用户权限有多种方式。虽然可以直接以 `root` 身份登录，但强烈不推荐这么做。

更好的方式是使用 [su(1)](https://man.freebsd.org/cgi/man.cgi?query=su\&sektion=1\&format=html) 命令切换为超级用户。如果在执行时指定了 `-` 参数，用户还会继承 root 用户的环境。执行此命令的用户必须属于 `wheel` 组，否则命令会失败。此外，还必须知道 `root` 用户的密码。

下面的示例中，用户仅为了运行 `make install` 而临时切换为超级用户。完成后，输入 `exit` 即可退出超级用户身份并返回普通用户权限。

**示例 1：以超级用户身份安装程序**

```sh
% configure
% make
% su -
Password:
# make install
# exit
%
```

内建的 [su(1)](https://man.freebsd.org/cgi/man.cgi?query=su\&sektion=1\&format=html) 框架适合单一系统或由一位管理员管理的小型网络。另一个选择是安装软件包或 Port [security/sudo](https://cgit.freebsd.org/ports/tree/security/sudo/)。该软件支持操作记录，并能让管理员配置哪些用户可以以超级用户身份运行哪些命令。

## 3.3.2. 管理账户

FreeBSD 提供了多种不同的命令来管理用户账户。最常用的命令在 [管理用户账户的工具](#id-3.3.2.-guan-li-zhang-hu) 中总结，后面还附有一些使用示例。更多细节和使用示例请参考每个工具的手册页。

**表 1. 管理用户账户的工具**

| 命令                                                                                          | 概要                  |
| ------------------------------------------------------------------------------------------- | ------------------- |
| [adduser(8)](https://man.freebsd.org/cgi/man.cgi?query=adduser\&sektion=8\&format=html)     | 推荐用于添加新用户的命令行应用程序。  |
| [rmuser(8)](https://man.freebsd.org/cgi/man.cgi?query=rmuser\&sektion=8\&format=html)       | 推荐用于删除用户的命令行应用程序。   |
| [chpass(1)](https://man.freebsd.org/cgi/man.cgi?query=chpass\&sektion=1\&format=html)       | 用于更改用户数据库信息的灵活工具。   |
| [passwd(1)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=1\&format=html)       | 用于更改用户密码的命令行工具。     |
| [pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html)               | 可修改用户账户所有方面的强大灵活工具。 |
| [bsdconfig(8)](https://man.freebsd.org/cgi/man.cgi?query=bsdconfig\&sektion=8\&format=html) | 带有账户管理支持的系统配置工具。    |

### 3.3.2.1. 添加用户

推荐使用的添加新用户的程序是 [adduser(8)](https://man.freebsd.org/cgi/man.cgi?query=adduser\&sektion=8\&format=html)。添加新用户时，此程序会自动更新 **/etc/passwd** 和 **/etc/group**。它还会为新用户创建家目录，从 **/usr/share/skel** 复制默认配置文件，并可选地向新用户发送一封欢迎邮件。此工具必须由超级用户运行。

[adduser(8)](https://man.freebsd.org/cgi/man.cgi?query=adduser\&sektion=8\&format=html) 是交互式的，会逐步引导创建新用户账户。如 [在 FreeBSD 上添加用户](#id-3.3.2.1.-tian-jia-yong-hu) 所示，输入所需信息或按 **Return** 接受方括号中的默认值。在此示例中，用户受邀加入 `wheel` 组，使其可以通过 [su(1)](https://man.freebsd.org/cgi/man.cgi?query=su\&sektion=1\&format=html) 成为超级用户。完成后，该工具会提示是创建另一个用户还是退出。

**示例 2：在 FreeBSD 上添加用户**

```sh
# adduser
```

输出应类似如下：

```sh
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(8)](https://man.freebsd.org/cgi/man.cgi?query=rmuser\&sektion=8\&format=html)。该命令会执行以下步骤：

1. 删除该用户的 [crontab(1)](https://man.freebsd.org/cgi/man.cgi?query=crontab\&sektion=1\&format=html) 项（若有）。
2. 删除该用户的所有 [at(1)](https://man.freebsd.org/cgi/man.cgi?query=at\&sektion=1\&format=html) 任务。
3. 向该用户的所有进程发送 SIGKILL 信号。
4. 从系统本地密码文件中删除该用户。
5. 删除该用户的家目录（如果其归用户所有），包括处理通往实际家目录路径中的符号链接。
6. 从 **/var/mail** 中删除属于该用户的邮件文件。
7. 从 **/tmp**、**/var/tmp** 和 **/var/tmp/vi.recover** 中删除所有属于该用户的文件。
8. 从 **/etc/group** 中所有该用户所属的组中移除用户名。（如果某个组为空，且组名与用户名相同，则该组也会被删除；这是对 [adduser(8)](https://man.freebsd.org/cgi/man.cgi?query=adduser\&sektion=8\&format=html) 为每个用户创建唯一组的补充。）
9. 删除该用户拥有的所有消息队列、共享内存段和信号量。

[rmuser(8)](https://man.freebsd.org/cgi/man.cgi?query=rmuser\&sektion=8\&format=html) 不能用于删除超级用户账户，因为这几乎总是意味着严重破坏。

默认情况下，该命令以交互模式运行，如下所示：

**示例 3：`rmuser` 交互式删除账户**

```sh
# rmuser jru
```

输出应类似如下：

```sh
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(1)](https://man.freebsd.org/cgi/man.cgi?query=chpass\&sektion=1\&format=html) 更改其默认 shell 和账户的个人信息。超级用户可以用此工具更改任意用户的额外账户信息。

若不带参数（或仅带可选用户名），[chpass(1)](https://man.freebsd.org/cgi/man.cgi?query=chpass\&sektion=1\&format=html) 会显示一个编辑器用于更改用户信息。用户退出编辑器时，用户数据库将更新为新的信息。

> **注意**
>
> 除非以超级用户身份运行，否则该工具在退出编辑器时会提示输入用户密码。

在 [以超级用户身份使用 `chpass`](/di-3-zhang-freebsd-ji-chu/3.3.-yong-hu-he-ji-ben-zhang-hu-guan-li) 一节中，超级用户输入了 `chpass jru`，正在查看可更改的字段。若 `jru` 自己运行该命令，仅会显示后六个字段供编辑。这在 [以普通用户身份使用 `chpass`](/di-3-zhang-freebsd-ji-chu/3.3.-yong-hu-he-ji-ben-zhang-hu-guan-li) 中展示。

**示例 4：以超级用户身份使用 `chpass`**

```sh
# chpass jru
```

输出应类似如下：

```sh
# 正在更改 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:
```

**示例 5：以普通用户身份使用 `chpass`**

```sh
# 正在更改 jru 的用户数据库信息。
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
```

> **注意**
>
> [chfn(1)](https://man.freebsd.org/cgi/man.cgi?query=chfn\&sektion=1\&format=html) 与 [chsh(1)](https://man.freebsd.org/cgi/man.cgi?query=chsh\&sektion=1\&format=html) 是 [chpass(1)](https://man.freebsd.org/cgi/man.cgi?query=chpass\&sektion=1\&format=html) 的链接，[ypchpass(1)](https://man.freebsd.org/cgi/man.cgi?query=ypchpass\&sektion=1\&format=html)、[ypchfn(1)](https://man.freebsd.org/cgi/man.cgi?query=ypchfn\&sektion=1\&format=html) 和 [ypchsh(1)](https://man.freebsd.org/cgi/man.cgi?query=ypchsh\&sektion=1\&format=html) 也是如此。由于 NIS 支持是自动的，无需在命令前加 `yp`。如何配置 NIS 请参见 [网络服务器](/di-33-zhang-wang-luo-fu-wu-qi/33.4.-wang-luo-xin-xi-xi-tong-nis)。

### 3.3.2.4. 更改用户密码

任何用户都可以使用 [passwd(1)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=1\&format=html) 轻松更改密码。为防止意外或未经授权的更改，该命令在设置新密码前会提示输入原密码：

**示例 6：更改自己的密码**

```sh
% passwd
```

输出应类似如下：

```sh
Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done
```

超级用户可以通过指定用户名来更改任意用户的密码。以超级用户身份运行该工具时，不会提示输入当前密码。这可用于用户忘记原密码时更改密码。

**示例 7：以超级用户身份更改其他用户密码**

```sh
# passwd jru
```

输出应类似如下：

```sh
Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done
```

> **注意**
>
> 与 [chpass(1)](https://man.freebsd.org/cgi/man.cgi?query=chpass\&sektion=1\&format=html) 一样，[yppasswd(1)](https://man.freebsd.org/cgi/man.cgi?query=yppasswd\&sektion=1\&format=html) 也是 [passwd(1)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=1\&format=html) 的链接，因此 NIS 与这两个命令都兼容。

### 3.3.2.5. 创建、删除、修改和显示系统用户与组

[pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) 工具可用于创建、删除、修改和显示用户与组。它是系统用户和组文件的前端。[pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) 提供了非常强大的命令行选项，适合用于 shell 脚本，但对于新用户来说可能比本节中的其他命令更复杂。

## 3.3.3. 管理用户组

用户组是一组用户的列表。用户组通过其组名和 GID 来标识。在 FreeBSD 中，内核通过进程的 UID 和其所属的用户组列表来判断该进程能执行哪些操作。在大多数情况下，某个用户或进程的 GID 通常指的是该列表中的第一个用户组。

组名与 GID 的映射关系记录在 **/etc/group** 中。这个文件是一个纯文本文件，包含四个用冒号分隔的字段。第一个字段是组名，第二个字段是加密密码，第三个字段是 GID，第四个字段是成员的逗号分隔列表。完整的语法说明请参考 [group(5)](https://man.freebsd.org/cgi/man.cgi?query=group\&sektion=5\&format=html)。

超级用户可以使用文本编辑器修改 **/etc/group**，不过建议使用 [vigr(8)](https://man.freebsd.org/cgi/man.cgi?query=vigr\&sektion=8\&format=html) 编辑，因为它可以捕捉一些常见错误。另一种方式是使用 [pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) 来添加和编辑用户组。例如，要添加一个名为 `teamtwo` 的用户组并确认其存在：

> **警告**
>
> 使用 `operator` 组时务必小心，因为可能会意外获得类似超级用户的权限，包括但不限于关机、重启，以及访问 **/dev** 中该组的所有条目。

**示例 8：使用** [**pw(8)**](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) **添加用户组**

```sh
# pw groupadd teamtwo
# pw groupshow teamtwo
```

输出应类似如下：

```sh
teamtwo:*:1100:
```

在这个例子中，`1100` 是 `teamtwo` 的 GID。此时，`teamtwo` 还没有成员。以下命令将会添加 `jru` 作为 `teamtwo` 的成员。

**示例 9：使用** [**pw(8)**](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) **将用户账户添加到一个新用户组中**

```sh
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
```

输出应类似如下：

```sh
teamtwo:*:1100:jru
```

传递给 `-M` 的参数是一个以逗号分隔的用户列表，用于添加到一个新的（空的）用户组中，或者用于替换现有用户组的全部成员。对用户而言，这种组成员资格不同于密码文件中列出的主用户组（且是额外的）。这意味着使用 [pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) 的 `groupshow` 时不会显示该用户，但通过 [id(1)](https://man.freebsd.org/cgi/man.cgi?query=id\&sektion=1\&format=html) 或类似工具查询信息时则会显示。当使用 [pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) 将用户添加到组中时，它仅操作 **/etc/group**，不会从 **/etc/passwd** 读取其他数据。

**示例 10：使用** [**pw(8)**](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) **向组中添加新成员**

```sh
# pw groupmod teamtwo -m db
# pw groupshow teamtwo
```

输出应类似如下：

```sh
teamtwo:*:1100:jru,db
```

在这个例子中，传递给 `-m` 的参数是一个以逗号分隔的用户列表，这些用户将被添加进组中。与前一个示例不同，这些用户是追加添加的，并不会替换已有用户。

**示例 11：使用** [**id(1)**](https://man.freebsd.org/cgi/man.cgi?query=id\&sektion=1\&format=html) **来判断用户组成员资格**

```sh
% id jru
```

输出应类似如下：

```sh
uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)
```

在这个例子中，`jru` 是 `jru` 和 `teamtwo` 这两个用户组的成员。

关于该命令和 **/etc/group** 格式的更多信息，请参阅 [pw(8)](https://man.freebsd.org/cgi/man.cgi?query=pw\&sektion=8\&format=html) 和 [group(5)](https://man.freebsd.org/cgi/man.cgi?query=group\&sektion=5\&format=html)。


# 3.4.权限

在 FreeBSD 中，每个文件和目录都有一组相关的权限，并提供了多种工具用于查看和修改这些权限。了解权限的工作机制非常必要，它可以确保用户能访问所需的文件，同时防止不当访问操作系统或其他用户拥有的文件。

本节讨论的是 FreeBSD 中使用的传统 UNIX® 权限。若需更细粒度的文件系统访问控制，另见 [访问控制列表（Access Control Lists）](/di-16-zhang-an-quan/16.11.-fang-wen-kong-zhi-acl)。

在 UNIX® 中，通过三种访问类型来分配基本权限：读（read）、写（write）和执行（execute）。这些访问类型用于决定文件的所有者、所属组和其他人（所有其他人）对该文件的访问权限。读、写和执行权限可以分别用字母 `r`、`w` 和 `x` 表示。它们也可以用二进制数字表示，因为每个权限只能是开或关（`0` 表示关闭）。在数字表示法中，顺序始终是 `rwx`，其中 `r` 的启用值为 `4`，`w` 为 `2`，`x` 为 `1`。

表 2 总结了可能的数字与字母组合方式。在阅读“目录列表”一栏时，`-` 表示该权限被关闭。

**表 2. UNIX® 权限**

| 值 | 权限说明        | 目录列表表示 |
| - | ----------- | ------ |
| 0 | 无读、无写、无执行权限 | `---`  |
| 1 | 无读、无写、有执行权限 | `--x`  |
| 2 | 无读、有写、无执行权限 | `-w-`  |
| 3 | 无读、有写、有执行权限 | `-wx`  |
| 4 | 有读、无写、无执行权限 | `r--`  |
| 5 | 有读、无写、有执行权限 | `r-x`  |
| 6 | 有读、有写、无执行权限 | `rw-`  |
| 7 | 有读、有写、有执行权限 | `rwx`  |

使用 [ls(1)](https://man.freebsd.org/cgi/man.cgi?query=ls\&sektion=1\&format=html) 的 `-l` 参数可以查看包含权限信息的详细目录列表。例如，在某个目录中运行 `ls -l` 可能显示如下内容：

```sh
% ls -l
```

输出可能类似如下：

```sh
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
```

我们来看 `myfile` 这一行，第一个字符（最左侧）表示这个文件的类型，比如常规文件、目录、特殊字符设备、套接字或其他特殊伪文件设备。本例中的 `-` 表示一个常规文件。接下来的三个字符 `rw-` 表示该文件所有者的权限。再接下来的三个字符 `r--` 表示该文件所属用户组的权限。最后的三个字符 `r--` 表示其他所有用户的权限。`-` 表示该权限被关闭。本例中，该文件的权限设置为：所有者可读写，组用户可读，其他用户也可读。根据上表，这个文件的权限可以表示为 `644`，每一位数字分别代表该文件权限的三个部分。

系统是如何控制设备权限的呢？FreeBSD 将大多数硬件设备视为文件，程序可以打开它、读写它。这些特殊的设备文件存储在 **/dev/** 目录中。

目录也被当作文件处理。它们也有读、写和执行权限。目录的可执行位与文件略有不同。当目录被标记为可执行时，意味着可以使用 [cd(1)](https://man.freebsd.org/cgi/man.cgi?query=cd\&sektion=1\&format=html) 进入该目录。同时，在文件本身权限足够的前提下，也能访问目录内的文件。

如果要列出目录内容，该目录必须具有读权限。如果要删除一个已知名称的文件，则必须对该文件所在的目录具有写权限 *和* 执行权限。

还有一些额外的权限位，主要用于特殊场景，例如 setuid 可执行文件和 sticky 目录。关于文件权限的更多信息及设置方法，请参见 [chmod(1)](https://man.freebsd.org/cgi/man.cgi?query=chmod\&sektion=1\&format=html)。

## 3.4.1. 符号权限

符号权限使用字符而不是八进制值为文件或目录分配权限。符号权限采用 `(对象)(操作)(权限)` 的语法格式，其中可用的值如下：

| 选项          | 字母 | 代表含义                      |
| ----------- | -- | ------------------------- |
| (对象 who)    | u  | 用户（User）                  |
| (对象 who)    | g  | 所属组（Group owner）          |
| (对象 who)    | o  | 其他用户（Other）               |
| (对象 who)    | a  | 所有人（All，“world”）          |
| (操作 action) | +  | 添加权限                      |
| (操作 action) | -  | 移除权限                      |
| (操作 action) | =  | 明确设定权限                    |
| (权限 perms)  | r  | 读取权限（Read）                |
| (权限 perms)  | w  | 写入权限（Write）               |
| (权限 perms)  | x  | 执行权限（Execute）             |
| (权限 perms)  | t  | 粘滞位（Sticky bit）           |
| (权限 perms)  | s  | 设置 UID 或 GID（Set UID/GID） |

这些值可与 [chmod(1)](https://man.freebsd.org/cgi/man.cgi?query=chmod\&sektion=1\&format=html) 命令结合使用，但用字母而非数字。例如，以下命令将阻止文件 *FILE* 的所属组成员及其他所有用户访问该文件：

```sh
% chmod go= FILE
```

如果要对文件做多项权限变更，可以使用逗号分隔的列表。例如，以下命令移除 *FILE* 的组用户和“其他用户”的写权限，并为所有用户添加执行权限：

```sh
% chmod go-w,a+x FILE
```

## 3.4.2. FreeBSD 文件标志（File Flag）

除了文件权限之外，FreeBSD 还支持使用“文件标志”（file flag）。这些标志为文件（但不是目录）提供了更高层次的安全性和控制。通过文件标志，即使是 `root` 用户也可能被阻止删除或修改文件。

可以使用 [chflags(1)](https://man.freebsd.org/cgi/man.cgi?query=chflags\&sektion=1\&format=html) 命令修改文件标志。例如，要在 `file1` 上启用系统不可删除标志，可以执行以下命令：

```sh
# chflags sunlink file1
```

要关闭该系统不可删除标志，在 `sunlink` 前加上 `no`：

```sh
# chflags nosunlink file1
```

要查看文件的标志，可使用带 `-lo` 选项的 [ls(1)](https://man.freebsd.org/cgi/man.cgi?query=ls\&sektion=1\&format=html) 命令：

```sh
# ls -lo file1
```

```sh
-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1
```

某些文件标志只能由 `root` 用户添加或移除。在其他情况下，文件所有者也可以设置其文件标志。更多信息请参阅 [chflags(1)](https://man.freebsd.org/cgi/man.cgi?query=chflags\&sektion=1\&format=html) 和 [chflags(2)](https://man.freebsd.org/cgi/man.cgi?query=chflags\&sektion=2\&format=html)。

## 3.4.3. setuid、setgid 和 sticky 权限

除了前面讨论过的权限，还有三种特定的设置是所有管理员都应了解的。它们分别是 `setuid`、`setgid` 和 `sticky` 权限。

这些设置对某些 UNIX® 操作而言非常重要，因为它们提供了普通用户通常无法获得的功能。要理解这些设置，必须理解“真实用户 ID（real UID）”与“有效用户 ID（effective UID）”之间的区别。

真实用户 ID 是指拥有或启动某进程的 UID；而有效用户 ID 则是指进程实际以哪个用户 ID 身份运行。例如，当用户更改自己的密码时，[passwd(1)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=1\&format=html) 以该用户的真实 UID 运行。然而，为了更新密码数据库，该命令实际以 `root` 的有效 UID 运行。这样用户就可以修改自己的密码，而不会遇到 `Permission Denied` 错误。

可以给用户添加 `s` 权限来符号性地设置 setuid 权限，如下所示：

```sh
# chmod u+s suidexample.sh
```

也可以通过在权限值前加上数字 4 来设置 setuid 权限：

```sh
# chmod 4755 suidexample.sh
```

此时 `suidexample.sh` 的权限会变为：

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

注意，文件所有者的执行位已被 `s` 替代，表示启用了 setuid。这对于需要权限提升的工具（如 [passwd(1)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=1\&format=html)）来说非常关键。

> **注意**
>
> `nosuid` [mount(8)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=8\&format=html) 挂载选项会导致这类二进制文件静默失败，且不通知用户。该选项并非完全可靠，因为某些 nosuid 封装程序可能绕过 `nosuid` 挂载限制。

可以通过以下方法实时观察此现象：打开两个终端。在一个终端中以普通用户身份输入 `passwd`，在等待新密码的同时，在另一个终端中查看进程表，观察 [passwd(1)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=1\&format=html) 的用户信息。

在终端 A 中：

```sh
Changing local password for trhodes
Old Password:
```

在终端 B 中：

```sh
# ps aux | grep passwd
```

输出示例：

```sh
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)](https://man.freebsd.org/cgi/man.cgi?query=passwd\&sektion=1\&format=html) 是由普通用户运行的，但它使用的是 `root` 的有效 UID。

`setgid` 权限与 `setuid` 的作用类似，只不过它影响的是组设置。当某个程序或工具以该权限执行时，它将获得基于文件所属组的权限，而不是发起进程的用户的组。

要用符号方式设置某文件的 `setgid` 权限，可为组添加 `s` 权限，例如：

```sh
# chmod g+s sgidexample.sh
```

或使用 `chmod` 时在权限数字前加上 2：

```sh
# chmod 2755 sgidexample.sh
```

以下示例中，可以看到 `s` 出现在组权限的位置：

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

> **注意**
>
> 尽管这些示例中的 shell 脚本是可执行文件，但它们不会以不同的有效 UID 运行。这是因为 shell 脚本无法使用 [setuid(2)](https://man.freebsd.org/cgi/man.cgi?query=setuid\&sektion=2\&format=html) 系统调用。

`setuid` 和 `setgid` 权限可能降低系统安全性，因为它们能让权限提升。第三种特殊权限 `sticky bit` 则可以增强系统安全。

当目录设置了 `sticky bit` 后，只有文件的所有者才能删除该文件。这在公共目录（如 **/tmp**）中非常有用，可防止非文件所有者的用户删除文件。要设置该权限，可以添加 `t` 模式：

```sh
# chmod +t /tmp
```

或在权限值前加上数字 1：

```sh
# chmod 1777 /tmp
```

此权限将以 `t` 的形式显示在权限字符串的最后：

```sh
# ls -al / | grep tmp
```

```sh
drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp
```


# 3.5.目录结构

FreeBSD 的目录层级结构是理解整个系统的基础。最重要的目录是根目录，即 **/**。根目录在引导时最先挂载，包含操作系统为进入多用户操作做准备的基础部分。根目录还包含其他文件系统的挂载点，这些文件系统在进入多用户模式时被挂载。

挂载点是将额外文件系统附加到父文件系统（通常是根文件系统）上的目录，详见 [磁盘结构](/di-3-zhang-freebsd-ji-chu/3.6.-ci-pan-jie-gou)。常见的挂载点包括 **/usr/**、**/var/**、**/tmp/**、**/mnt/** 和 **/media/**。这些目录通常与 **/etc/fstab** 文件中的条目相对应。该文件是各种文件系统和挂载点的配置表，由系统读取。大多数文件系统会在引导时通过 [rc(8)](https://man.freebsd.org/cgi/man.cgi?query=rc\&sektion=8\&format=html) 脚本自动挂载，除非它们的条目包含 `noauto`。详见 [fstab 文件](/di-3-zhang-freebsd-ji-chu/3.7.-wen-jian-xi-tong-de-gua-zai-yu-xie-zai)。

文件系统层级的完整说明见 [hier(7)](https://man.freebsd.org/cgi/man.cgi?query=hier\&sektion=7\&format=html)。以下是常见目录的简要概述：

| 目录                | 说明                                                                                                                                                                                                                                                                           |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/`               | 文件系统的根目录。                                                                                                                                                                                                                                                                    |
| `/bin/`           | 单用户和多用户环境中必需的用户工具。                                                                                                                                                                                                                                                           |
| `/boot/`          | 操作系统引导过程中使用的程序和配置文件。                                                                                                                                                                                                                                                         |
| `/boot/defaults/` | 默认引导配置文件，参见 [loader.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=loader.conf\&sektion=5\&format=html)。                                                                                                                                                                 |
| `/dev/`           | 由 [devfs(5)](https://man.freebsd.org/cgi/man.cgi?query=devfs\&sektion=5\&format=html) 管理的设备特殊文件。                                                                                                                                                                             |
| `/etc/`           | 系统配置文件与脚本。                                                                                                                                                                                                                                                                   |
| `/etc/defaults/`  | 默认系统配置文件，参见 [rc(8)](https://man.freebsd.org/cgi/man.cgi?query=rc\&sektion=8\&format=html)。                                                                                                                                                                                   |
| `/etc/periodic/`  | 通过 [cron(8)](https://man.freebsd.org/cgi/man.cgi?query=cron\&sektion=8\&format=html) 每日、每周、每月运行的脚本，参见 [periodic(8)](https://man.freebsd.org/cgi/man.cgi?query=periodic\&sektion=8\&format=html)。                                                                             |
| `/lib/`           | `/bin` 和 `/sbin` 中二进制文件所需的关键系统库。                                                                                                                                                                                                                                             |
| `/libexec/`       | 关键系统文件。                                                                                                                                                                                                                                                                      |
| `/media/`         | 可移动媒体（如 CD、USB 驱动器、软盘等）的挂载点子目录。                                                                                                                                                                                                                                              |
| `/mnt/`           | 系统管理员常用作临时挂载点的空目录。                                                                                                                                                                                                                                                           |
| `/net/`           | 自动挂载的 NFS 共享，参见 [auto\_master(5)](https://man.freebsd.org/cgi/man.cgi?query=auto_master\&sektion=5\&format=html)。                                                                                                                                                            |
| `/proc/`          | 进程文件系统。详见 [procfs(5)](https://man.freebsd.org/cgi/man.cgi?query=procfs\&sektion=5\&format=html)。                                                                                                                                                                             |
| `/rescue/`        | 紧急恢复用的静态链接程序，参见 [rescue(8)](https://man.freebsd.org/cgi/man.cgi?query=rescue\&sektion=8\&format=html)。                                                                                                                                                                       |
| `/root/`          | `root` 账户的主目录。                                                                                                                                                                                                                                                               |
| `/sbin/`          | 在单用户和多用户环境中必需的系统程序和管理工具。                                                                                                                                                                                                                                                     |
| `/tmp/`           | 临时文件，通常在系统重启后*不会*保留。通常会在 `/tmp` 上挂载基于内存的文件系统，这可以通过 [rc.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=rc.conf\&sektion=5\&format=html) 中与 tmpmfs 相关的变量自动完成，或在 `/etc/fstab` 中添加条目，详见 [mdmfs(8)](https://man.freebsd.org/cgi/man.cgi?query=mdmfs\&sektion=8\&format=html)。 |
| `/usr/`           | 大多数用户工具和应用程序所在之处。                                                                                                                                                                                                                                                            |
| `/usr/bin/`       | 常用工具、编程工具和应用程序。                                                                                                                                                                                                                                                              |
| `/usr/include/`   | 标准 C 头文件。                                                                                                                                                                                                                                                                    |
| `/usr/lib/`       | 存档库文件。                                                                                                                                                                                                                                                                       |
| `/usr/libdata/`   | 杂项工具数据文件。                                                                                                                                                                                                                                                                    |
| `/usr/libexec/`   | 系统守护进程及由其他程序执行的系统工具。                                                                                                                                                                                                                                                         |
| `/usr/local/`     | 本地可执行文件与库，也是 FreeBSD Ports 框架的默认安装位置。在 `/usr/local` 中，应遵循 [hier(7)](https://man.freebsd.org/cgi/man.cgi?query=hier\&sektion=7\&format=html) 中为 `/usr` 所说明的通用布局。例外情况是 man 目录直接位于 `/usr/local` 下而非 `/usr/local/share` 下，以及 Ports 文档位于 `share/doc/port` 中。                      |
| `/usr/ports/`     | FreeBSD Ports（可选）。                                                                                                                                                                                                                                                           |
| `/usr/sbin/`      | 由用户执行的系统守护进程与工具。                                                                                                                                                                                                                                                             |
| `/usr/share/`     | 架构无关文件。                                                                                                                                                                                                                                                                      |
| `/usr/src/`       | BSD 和/或本地源代码文件。                                                                                                                                                                                                                                                              |
| `/var/`           | 用于日志、临时、中转与任务排队的多用途文件目录。                                                                                                                                                                                                                                                     |
| `/var/log/`       | 杂项系统日志文件。                                                                                                                                                                                                                                                                    |
| `/var/tmp/`       | 临时文件，通常在系统重启后*会*保留。                                                                                                                                                                                                                                                          |


# 3.6.磁盘结构

FreeBSD 用于查找文件的最小组织单位是文件名。文件名区分大小写，这意味着 `readme.txt` 和 `README.TXT` 是两个不同的文件。FreeBSD 不会根据文件的扩展名来判断它是程序、文档还是其他类型的数据。

文件存储在目录中。一个目录可以没有文件，也可以包含成百上千的文件。一个目录还可以包含其他目录，从而形成一个层次化的目录结构，以组织数据。

通过给出文件或目录的名称，后跟一个正斜杠 `/`，再加上必要的其他目录名称来引用文件和目录。例如，如果目录 `foo` 中包含目录 `bar`，而 `bar` 中包含文件 `readme.txt`，该文件的完整名称或路径是 `foo/bar/readme.txt`。请注意，这与 Windows® 使用反斜杠 `\` 分隔文件和目录名称不同。FreeBSD 的路径中不使用驱动器字母或其他驱动器名称。例如，在 FreeBSD 中不会输入 `c:\foo\bar\readme.txt`。

## 3.6.1. 文件系统

目录和文件存储在文件系统中。每个文件系统在最顶层包含一个根目录，称为该文件系统的 *根目录*。该根目录可以包含其他目录。一个文件系统被指定为 *根文件系统*，即 `/`。每个其他文件系统都被 *挂载* 到根文件系统下。无论 FreeBSD 系统上有多少磁盘，每个目录都看起来是同一个磁盘的一部分。

假设有三个文件系统，分别为 `A`、`B` 和 `C`。每个文件系统都有一个根目录，其中包含两个子目录，分别为 `A1`、`A2`（同样，`B` 包含 `B1`、`B2`，`C` 包含 `C1`、`C2`）。

将 `A` 作为根文件系统。如果使用 [ls(1)](https://man.freebsd.org/cgi/man.cgi?query=ls\&sektion=1\&format=html) 查看该目录的内容，会显示两个子目录，`A1` 和 `A2`。目录树如下所示：

![根目录和两个子目录的目录树](https://docs.freebsd.org/images/books/handbook/basics/example-dir1.png)

一个文件系统必须挂载到另一个文件系统中的目录上。当将文件系统 `B` 挂载到目录 `A1` 时，`B` 的根目录会替代 `A1`，并且 `B` 中的目录会相应显示出来：

![将 B 挂载到 A1 后的目录树，B1 和 B2 出现在 A1 之下](https://docs.freebsd.org/images/books/handbook/basics/example-dir2.png)

任何在 `B1` 或 `B2` 目录中的文件都可以通过路径 `/A1/B1` 或 `/A1/B2` 访问。任何原本在 `/A1` 中的文件现在暂时不可见。如果卸载 `B`，这些文件会重新出现。

如果 `B` 挂载到 `A2`，则目录树将如下所示：

![将 B 挂载到 A2 后的目录树，B1 和 B2 出现在 A2 之下](https://docs.freebsd.org/images/books/handbook/basics/example-dir3.png)

相应的路径为 `/A2/B1` 和 `/A2/B2`。

文件系统可以互相叠加挂载。继续上面的例子，文件系统 `C` 可以挂载到 `B` 文件系统中的 `B1` 目录上，形成如下结构：

![复杂的目录树，根目录下有多个子目录](https://docs.freebsd.org/images/books/handbook/basics/example-dir4.png)

或者 `C` 也可以直接挂载到 `A` 文件系统下的 `A1` 目录中：

![复杂的目录树，根目录下有多个子目录](https://docs.freebsd.org/images/books/handbook/basics/example-dir5.png)

完全可以只使用一个大的根文件系统，而无需创建其他文件系统。这种方式有一些缺点，但也有一个优点。

多个文件系统的好处：

* 不同的文件系统可以设置不同的挂载选项。例如，根文件系统可以以只读方式挂载，从而使用户无法意外删除或修改关键文件。将用户可写文件系统（如 **/home**）与其他文件系统分开，并以 *nosuid* 方式挂载，可以防止存储在文件系统中的可执行文件的 *suid*/*sgid* 位生效，可能提高安全性。
* FreeBSD 会根据文件系统的使用情况自动优化文件布局。因此，包含许多小文件并频繁写入的文件系统会与包含较少大文件的文件系统有所不同的优化。将所有内容放在一个大文件系统中时，这种优化会失效。
* FreeBSD 的文件系统在断电时具有较强的鲁棒性。然而，在关键时刻的断电仍然可能损坏文件系统结构。通过将数据分布到多个文件系统中，系统更可能仍能引导，从而更容易从备份中恢复。

单一文件系统的好处：

* 文件系统是固定大小的。如果在安装 FreeBSD 时创建了一个特定大小的文件系统，可能会发现以后需要增大分区大小。这通常需要备份数据、重新创建文件系统并恢复数据，操作复杂。

> **重要**
>
> FreeBSD 提供了 [growfs(8)](https://man.freebsd.org/cgi/man.cgi?query=growfs\&sektion=8\&format=html) 命令，可以动态扩展文件系统的大小，从而消除这一限制。文件系统只能扩展到所在分区中的空闲空间。如果分区后面有空闲空间，则可以使用 [gpart(8)](https://man.freebsd.org/cgi/man.cgi?query=gpart\&sektion=8\&format=html) 扩展分区。如果该分区是虚拟磁盘上的最后一个分区，并且磁盘已扩展，则可以扩展该分区。

## 3.6.2. 磁盘分区

文件系统被包含在 *分区* 中。磁盘通过若干分区方案之一被划分为多个分区；参见 [手动分区](/di-2-zhang-an-zhuang-freebsd/2.6.-fen-pei-ci-pan-kong-jian)。较新的方案是 GPT；而基于传统 BIOS 的计算机使用的是 MBR。GPT 支持将磁盘划分为具有大小、偏移量和类型的分区。它支持大量分区及其类型，只要条件具备，推荐优先使用。GPT 分区在磁盘名后带有一个后缀，其中 `p1` 表示第一个分区，`p2` 表示第二个，依此类推。相比之下，MBR 仅支持较少数量的分区。在 FreeBSD 中，MBR 分区被称为 *切片（slice）*。切片可被不同操作系统使用。FreeBSD 的切片会使用 BSD 标签进一步划分为多个分区（参见 [bsdlabel(8)](https://man.freebsd.org/cgi/man.cgi?query=bsdlabel\&sektion=8\&format=html)）。

切片编号紧跟在设备名后，并以 `s` 为前缀，从 1 开始。例如 `da0s1` 表示第一个 SCSI 磁盘上的第一个切片。一个磁盘只能有四个物理切片，但可以在合适类型的物理切片内部建立逻辑切片。这些扩展切片从编号 5 开始，因此 `ada0s5` 是第一个 SATA 磁盘上的第一个扩展切片。这些设备供需要占据整个切片的文件系统使用。

每个 GPT 或 BSD 分区只能包含一个文件系统，因此文件系统通常通过它们在文件系统层级中的典型挂载点，或其所在的分区名称来说明。

引用切片中的分区时，需包含磁盘名、`s`、切片编号，然后是分区字母。示例见 [示例磁盘、切片与分区名](/di-3-zhang-freebsd-ji-chu/3.6.-ci-pan-jie-gou)。GPT 分区则包含磁盘名、`p`，然后是分区编号。

[磁盘的概念模型](/di-3-zhang-freebsd-ji-chu/3.6.-ci-pan-jie-gou) 展示了使用 MBR 切片的磁盘布局概念模型。

安装 FreeBSD 时，如果使用 MBR，需配置磁盘切片并在其中创建用于 FreeBSD 的分区。如果使用 GPT，则需为每个文件系统配置分区。无论哪种情况，都需要在每个分区中创建文件系统或交换空间，并决定每个文件系统的挂载位置。有关操作分区的信息，请参见 [gpart(8)](https://man.freebsd.org/cgi/man.cgi?query=gpart\&sektion=8\&format=html)。

FreeBSD 还会使用磁盘空间作为 *交换空间（swap space）* 以提供 *虚拟内存（virtual memory）*。这使得计算机的行为看起来像是拥有远超实际内存的容量。当 FreeBSD 内存耗尽时，它会将一部分当前未使用的数据移入交换空间，并在需要时将其移回（将其他内容移出）。这称为 *换页（paging）*。

一些 BSD 分区具有特定的惯例用法：

| 分区  | 惯例用途                                                             |
| --- | ---------------------------------------------------------------- |
| `a` | 通常包含根文件系统。                                                       |
| `b` | 通常用于交换空间。                                                        |
| `c` | 通常大小与所在的切片相同。这使得需要操作整个切片的工具（如坏块扫描器）可以作用于 `c` 分区。通常不会在该分区上创建文件系统。 |
| `d` | 分区 `d` 过去具有特殊含义，但现在已被视作普通分区使用。                                   |

切片和“危险专用（dangerously dedicated）”的物理磁盘包含 BSD 分区，使用从 `a` 到 `h` 的字母表示。这个字母会附加在设备名后，例如 `da0a` 表示第一个 `da` 磁盘（危险专用）的 `a` 分区。`ada1s3e` 则表示第二个 SATA 磁盘上第三个切片中的第五个分区。

最后，系统中的每个磁盘都有一个标识符。磁盘名称以表示磁盘类型的代码开头，后跟一个表示磁盘序号的数字。与分区和切片不同，磁盘编号从 0 开始。常见的代码列在下表中：

**表 3. 磁盘设备名对照表**

| 驱动器类型             | 设备名称                                                                                                                           |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| SATA 与 IDE 硬盘     | `ada`                                                                                                                          |
| SCSI 硬盘与 USB 存储设备 | `da`                                                                                                                           |
| NVMe 存储           | `nvd` 或 `nda`                                                                                                                  |
| SATA 与 IDE 光驱     | `cd`                                                                                                                           |
| SCSI 光驱           | `cd`                                                                                                                           |
| 软盘驱动器             | `fd`                                                                                                                           |
| SCSI 磁带机          | `sa`                                                                                                                           |
| RAID 驱动器          | 示例包括 `aacd`（Adaptec® AdvancedRAID）、`mlxd` 和 `mlyd`（Mylex®）、`amrd`（AMI MegaRAID®）、`idad`（Compaq Smart RAID）、`twed`（3ware® RAID） |

**表 4. 示例磁盘、切片与分区名**

| 名称        | 含义                                          |
| --------- | ------------------------------------------- |
| `ada0s1a` | 第一个 SATA 磁盘（`ada0`）上第一个切片（`s1`）中的第一个分区（`a`） |
| `da1s2e`  | 第二个 SCSI 磁盘（`da1`）上第二个切片（`s2`）中的第五个分区（`e`）  |

**示例 12：磁盘的概念模型**

下图展示了 FreeBSD 对系统中第一个 SATA 磁盘的视图。假设该磁盘大小为 250 GB，其中包含一个 80 GB 的切片和一个 170 GB 的切片（MS-DOS® 分区）。第一个切片包含一个 Windows® 的 NTFS 文件系统（`C:`），第二个切片则用于 FreeBSD 安装。本例中的 FreeBSD 安装包含四个数据分区和一个交换分区。

这四个分区各自包含一个文件系统。分区 `a` 用于根文件系统，`d` 用于 **/var/**，`e` 用于 **/tmp/**，`f` 用于 **/usr/**。分区字母 `c` 代表整个切片，因此不会用于常规分区。

![FreeBSD 与 Windows 共享磁盘的布局示意图](https://docs.freebsd.org/images/books/handbook/basics/disk-layout.png)


# 3.7.文件系统的挂载与卸载

最好将文件系统想象成一棵树，其“根”位于 **/**。**/dev**、**/usr** 和根目录下的其他目录是这棵树的分支，它们又可能有自己的分支，比如 **/usr/local**，以此类推。

出于多种原因，可以将这些目录中的某些放在独立的文件系统上。**/var** 包含 **log/**、**spool/** 目录以及各种临时文件，因此可能会被写满。写满根文件系统并不是好事，因此通常建议将 **/var** 与 **/** 分离。

另一个常见的原因是某些目录树可能存放在独立的物理磁盘上，或独立的虚拟磁盘上，例如网络文件系统挂载（见 [网络文件系统（NFS）](/di-33-zhang-wang-luo-fu-wu-qi/33.3.-wang-luo-wen-jian-xi-tong-nfs)），或 CDROM 驱动器。

## 3.7.1. fstab 文件

在引导过程中（见 [FreeBSD 引导过程](/di-15-zhang-freebsd-de-yin-dao-guo-cheng/15.2.-freebsd-de-yin-dao-guo-cheng)），**/etc/fstab** 中列出的文件系统会被自动挂载，除非条目中包含 `noauto`。该文件中的条目格式如下：

```sh
device       /mount-point fstype     options      dumpfreq     passno
```

* `device`：现有设备名，详见 [磁盘设备命名](/di-3-zhang-freebsd-ji-chu/3.6.-ci-pan-jie-gou)。
* `mount-point`：现有的目录，用于挂载文件系统。
* `fstype`：文件系统类型。FreeBSD 默认使用 UFS 文件系统。
* `options`：`rw` 表示读写文件系统，`ro` 表示只读文件系统，可跟其他选项。常用选项包括 `noauto`，表示引导时不挂载此文件系统。更多选项见 [mount(8)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=8\&format=html)。
* `dumpfreq`：供 [dump(8)](https://man.freebsd.org/cgi/man.cgi?query=dump\&sektion=8\&format=html) 判断哪些文件系统需要备份。默认视为 0。
* `passno`：决定在重启后，哪些 UFS 文件系统应由 [fsck(8)](https://man.freebsd.org/cgi/man.cgi?query=fsck\&sektion=8\&format=html) 检查，以及检查顺序。应跳过的文件系统设置为 0。根文件系统应优先检查，设为 1，其他文件系统设为大于 1 的值。若多个文件系统具有相同的 `passno`，[fsck(8)](https://man.freebsd.org/cgi/man.cgi?query=fsck\&sektion=8\&format=html) 会尽可能尝试并行检查。

更多格式和选项说明，见 [fstab(5)](https://man.freebsd.org/cgi/man.cgi?query=fstab\&sektion=5\&format=html)。

## 3.7.2. 使用 [mount(8)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=8\&format=html)

文件系统通过 [mount(8)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=8\&format=html) 命令挂载。最基本的语法如下：

```sh
# mount device mountpoint
```

如果文件系统已列在 **/etc/fstab** 中，也可以只提供挂载点来挂载。

该命令有许多选项，详见 [mount(8)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=8\&format=html)。常用选项包括：

**挂载选项**

* `-a`：挂载 **/etc/fstab** 中所有文件系统，除 `noauto` 标记、被 `-t` 排除或已挂载的。
* `-d`：执行除实际系统调用之外的所有操作。此选项与 `-v` 标志结合使用时，可用于确定 [mount(8)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=8\&format=html) 实际尝试执行的操作。
* `-f`：强制挂载未清理的文件系统（危险），或在将文件系统从读写状态降级为只读时撤销写权限。
* `-r`：以只读方式挂载，等效于 `-o ro`。
* `-t fstype`：指定要挂载的文件系统类型，或在使用 `-a` 时仅挂载该类型文件系统。默认类型是“ufs”。
* `-u`：更新文件系统的挂载选项。
* `-v`：显示详细信息。
* `-w`：以读写方式挂载文件系统。

以下选项可作为 `-o` 的逗号分隔列表传入：

* `nosuid`：不解释文件系统上的 setuid 或 setgid 标志，此选项常用于增强安全性。

## 3.7.3. 使用 umount(8)

卸载文件系统使用 [umount(8)](https://man.freebsd.org/cgi/man.cgi?query=umount\&sektion=8\&format=html)。该命令接受一个参数，可以是挂载点、设备名，或 `-a`、`-A`。

所有形式均可接受 `-f` 强制卸载，以及 `-v` 显示详细信息。注意，`-f` 通常并不安全，可能导致系统崩溃或文件系统数据损坏。

要卸载所有已挂载的文件系统，或仅卸载 `-t` 后指定类型的文件系统，可使用 `-a` 或 `-A`。注意 `-A` 不会尝试卸载根文件系统。


# 3.8.进程和守护进程

FreeBSD 是一个多任务操作系统。每个在任意时刻运行的程序都称为一个 *进程（process）*。每个正在运行的命令都会启动至少一个新进程，并且 FreeBSD 还会运行一些系统进程。

每个进程都有一个唯一的编号，称为 *进程 ID（PID）*。类似于文件，每个进程也有一个所有者和所属组，系统会依据所有者和组的权限来判断进程可以访问哪些文件和设备。大多数进程也有一个启动它们的父进程。例如，shell 是一个进程，而在 shell 中启动的任何命令也都是进程，它们的父进程就是该 shell。唯一的例外是特殊进程 [init(8)](https://man.freebsd.org/cgi/man.cgi?query=init\&sektion=8\&format=html)，它总是在系统引导时第一个启动，进程 ID 永远是 `1`。

某些程序并不是设计来持续接受用户输入的，它们会在合适的时机脱离终端。例如，Web 服务器是用来响应网络请求而不是用户输入的。邮件服务器也是这种程序的一个例子。这类程序被称为 *守护进程（daemon）*。daemon 一词源自希腊神话，指的是那种既非善也非恶、却在幕后默默执行有用任务的存在。这正是 BSD 吉祥物——一只穿着运动鞋、手持三叉戟的可爱小恶魔——的由来。

按照惯例，守护进程程序通常以字母 'd' 结尾命名。例如，BIND（Berkeley Internet Name Domain）的实际运行程序是 `named`；Apache Web 服务器程序是 `httpd`；打印服务的后台处理进程是 `lpd`。这只是命名习惯，例如 Sendmail 的主邮件守护进程叫做 `sendmail`，而不是 `maild`。

## 3.8.1. 查看进程

可以使用 [ps(1)](https://man.freebsd.org/cgi/man.cgi?query=ps\&sektion=1\&format=html) 或 [top(1)](https://man.freebsd.org/cgi/man.cgi?query=top\&sektion=1\&format=html) 查看系统中正在运行的进程。要显示当前运行的进程、它们的 PID、所使用的内存，以及启动它们的命令，可以使用 [ps(1)](https://man.freebsd.org/cgi/man.cgi?query=ps\&sektion=1\&format=html)。要以交互方式每隔几秒更新显示所有进程，以便实时观察系统正在执行的任务，可以使用 [top(1)](https://man.freebsd.org/cgi/man.cgi?query=top\&sektion=1\&format=html)。

默认情况下，[ps(1)](https://man.freebsd.org/cgi/man.cgi?query=ps\&sektion=1\&format=html) 只显示当前用户拥有的正在运行的命令。例如：

```sh
% ps
```

输出可能类似如下：

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

[ps(1)](https://man.freebsd.org/cgi/man.cgi?query=ps\&sektion=1\&format=html) 的输出包含多个列。`PID` 列表示进程的 ID。PID 从 1 开始分配，一直到 99999，然后回绕到起点，但若某个 PID 已在使用，则不会重新分配。`TT` 列显示程序运行的终端设备，`STAT` 显示程序的状态，`TIME` 表示进程在 CPU 上实际运行的时间（而不是启动以来的总时间，因为大多数程序大部分时间都在等待）。最后，`COMMAND` 是启动程序时使用的命令。

可以通过不同的选项改变显示的信息。其中一个最有用的组合是 `auxww`，其中：

* `a` 显示所有用户的进程，
* `u` 显示用户名和内存使用信息，
* `x` 显示守护进程，
* `ww` 则让 ps 显示完整命令行，而不会因过长而截断。

[top(1)](https://man.freebsd.org/cgi/man.cgi?query=top\&sektion=1\&format=html) 的输出类似如下：

```sh
% top
```

输出示例如下：

```sh
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
```

输出分为两个部分：前五六行是标题区，显示了最近运行的进程 ID、系统负载（衡量系统繁忙程度）、系统运行时间（自上次引导以来），以及当前时间。其余数据包括：运行中进程数量、已用内存和交换空间（swap），以及 CPU 各状态所占百分比。如果加载了 ZFS 文件系统模块，还会显示一行 `ARC`，指示有多少数据是从内存缓存而非磁盘中读取的。

标题下面是与 ps 输出类似的各列信息，包括 PID、用户名、CPU 占用时间和启动进程的命令。top 默认还显示进程占用的内存空间，这分为两个列：一列是进程总共申请的内存（SIZE），另一列是当前实际使用的内存（RES）。

[top(1)](https://man.freebsd.org/cgi/man.cgi?query=top\&sektion=1\&format=html) 会每两秒自动刷新一次显示内容，可通过 `-s` 参数指定不同的刷新间隔。

## 3.8.2. 终止进程

与任何正在运行的进程或守护进程通信的一种方式是使用 [kill(1)](https://man.freebsd.org/cgi/man.cgi?query=kill\&sektion=1\&format=html) 发送一个 *信号（signal）*。有多种不同的信号；有些具有特定含义，其他的则可在应用程序文档中找到解释。用户只能向自己拥有的进程发送信号，若尝试向他人的进程发送信号将会导致权限拒绝错误。唯一的例外是 `root` 用户，它可以向任何人的进程发送信号。

操作系统本身也可以向进程发送信号。如果某个应用程序设计不良，试图访问其不应访问的内存，FreeBSD 会向该进程发送“段错误（Segmentation Violation）”信号（`SIGSEGV`）。如果某个应用程序使用了 [alarm(3)](https://man.freebsd.org/cgi/man.cgi?query=alarm\&sektion=3\&format=html) 系统调用来在一段时间后收到通知，它会收到“闹钟”信号（`SIGALRM`）。

可以用两种信号来终止一个进程：`SIGTERM` 和 `SIGKILL`。`SIGTERM` 是一种较为温和的终止方式，因为进程可以接收到信号、关闭任何已打开的日志文件，并尝试完成当前任务后再关闭。在某些情况下，如果进程正处于无法被打断的任务中，它可能会忽略 `SIGTERM`。

`SIGKILL` 是进程无法忽略的信号。向进程发送 `SIGKILL` 通常会立即终止该进程 ①。

其它常见的信号包括 `SIGHUP`、`SIGUSR1` 和 `SIGUSR2`。由于这些是通用信号，不同的应用程序会有不同的响应方式。

例如，在修改 web 服务器的配置文件之后，需要让 web 服务器重新读取配置。如果重新启动 `httpd`，可能会造成 web 服务的短暂中断。更好的方式是向该守护进程发送 `SIGHUP` 信号。需注意，不同守护进程的行为可能不同，因此请查阅对应文档以确定 `SIGHUP` 是否能达到预期效果。

> **重要**
>
> 随意终止系统中的某个进程是个坏主意。特别是 [init(8)](https://man.freebsd.org/cgi/man.cgi?query=init\&sektion=8\&format=html)，即 PID 1，是一个特殊进程。运行 `/bin/kill -s KILL 1` 会迅速但非正常地关闭系统。*务必*在按下 **Return** *之前*，再次确认传递给 [kill(1)](https://man.freebsd.org/cgi/man.cgi?query=kill\&sektion=1\&format=html) 的参数。

* ① 有一些任务是无法中断的。例如，如果进程试图从网络上另一台计算机的文件中读取数据，而另一台计算机不可用，则该进程被认为是不可中断的。最终，进程会超时，通常在两分钟后。若发生超时，进程将被终止。


# 3.9.Shell

shell 提供了用于与操作系统交互的命令行界面。Shell 从输入通道接收命令并执行它们。许多 shell 提供内建函数，用于协助日常任务，例如文件管理、文件名通配（globbing）、命令行编辑、命令宏以及环境变量。FreeBSD 提供了多个 shell，包括扩展的 POSIX® shell（[sh(1)](https://man.freebsd.org/cgi/man.cgi?query=sh\&sektion=1\&format=html)）和扩展的 C shell（[tcsh(1)](https://man.freebsd.org/cgi/man.cgi?query=tcsh\&sektion=1\&format=html)）。其他 shell 可通过 FreeBSD Ports 获得，例如 `zsh` 和 `bash`。

使用哪一个 shell 实际上是个人喜好问题。C 语言程序员可能更倾向于使用类似 C 语言的 shell，比如 [tcsh(1)](https://man.freebsd.org/cgi/man.cgi?query=tcsh\&sektion=1\&format=html)。Linux® 用户可能更喜欢 `bash`。每种 shell 都具有其独特属性，这些属性可能符合，也可能不符合用户所偏好的工作环境，因此才会有选择 shell 的自由。

一个常见的 shell 特性是文件名补全。用户输入命令或文件名前几个字母并按下 **Tab** 后，shell 会补全剩余部分。假设有两个文件分别叫做 `foobar` 和 `football`，用户要删除 `foobar`，可能会键入 `rm foo` 并按下 **Tab** 来补全文件名。

但 shell 只显示 `rm foo`，它无法补全文件名，因为 `foobar` 和 `football` 都以 `foo` 开头。如果匹配到多个名称，一些 shell 会发出哔声或显示所有可能选项。此时用户需要输入更多字符来标识所需文件名。输入一个 `t` 然后再次按下 **Tab**，shell 就能确定所需的文件名并补全剩余部分。

shell 的另一个功能是使用环境变量。环境变量是 shell 环境中存储的一组键值对。任何由 shell 启动的程序都可以读取这个环境，因此其中包含了大量程序配置。[常见环境变量](/di-3-zhang-freebsd-ji-chu/3.9.-shell) 提供了常见环境变量及其含义的列表。请注意，环境变量名总是大写的。

常见环境变量表：

| 变量         | 介绍                        |
| ---------- | ------------------------- |
| `USER`     | 当前登录用户的用户名。               |
| `PATH`     | 用冒号分隔的目录列表，用于查找可执行文件。     |
| `DISPLAY`  | 要连接的 Xorg 显示器的网络名称（如果可用）。 |
| `SHELL`    | 当前使用的 shell。              |
| `TERM`     | 用户终端类型的名称。用于判断终端的功能。      |
| `TERMCAP`  | 包含终端转义码的数据库项，用于执行各种终端功能。  |
| `OSTYPE`   | 操作系统类型。                   |
| `MACHTYPE` | 系统的 CPU 架构。               |
| `EDITOR`   | 用户首选的文本编辑器。               |
| `PAGER`    | 用户首选的分页查看工具。              |
| `MANPATH`  | 用冒号分隔的目录列表，用于查找手册页。       |

不同的 shell 设置环境变量的方式不同。在 [tcsh(1)](https://man.freebsd.org/cgi/man.cgi?query=tcsh\&sektion=1\&format=html) 和 [csh(1)](https://man.freebsd.org/cgi/man.cgi?query=csh\&sektion=1\&format=html) 中，使用 `setenv` 来设置环境变量。在 [sh(1)](https://man.freebsd.org/cgi/man.cgi?query=sh\&sektion=1\&format=html) 和 `bash` 中，使用 `export` 设置当前环境变量。以下是在 [tcsh(1)](https://man.freebsd.org/cgi/man.cgi?query=tcsh\&sektion=1\&format=html) 中设置默认 `EDITOR` 为 **/usr/local/bin/emacs** 的示例：

```sh
% setenv EDITOR /usr/local/bin/emacs
```

在 `bash` 中对应的命令是：

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

要展开环境变量以查看其当前值，在命令行的变量名前加上 `$` 符号。例如，`echo $TERM` 会显示当前的 `$TERM` 设置。

Shell 会将一些特殊字符（称为元字符）视为数据的特殊表示方式。最常见的元字符是 `*`，它代表任意数量的字符。元字符可用于执行文件名通配。例如，`echo *` 等同于 `ls`，因为 shell 会将所有匹配 `*` 的文件传递给 `echo`，并在命令行上列出它们。

为了防止 shell 解释某个特殊字符，可以用反斜杠（`\`）对其进行转义。例如，`echo $TERM` 会打印终端设置，而 `echo \$TERM` 则会原样打印字符串 `$TERM`。

## 3.9.1. 更改 Shell

永久更改默认 shell 的最简单方法是使用 `chsh`。运行此命令会打开由 `EDITOR` 环境变量配置的编辑器，默认情况下为 [vi(1)](https://man.freebsd.org/cgi/man.cgi?query=vi\&sektion=1\&format=html)。将 `Shell:` 行更改为新 shell 的完整路径。

也可以使用 `chsh -s`，该命令会在不打开编辑器的情况下设置指定的 shell。例如，将 shell 更改为 `bash`：

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

在提示符下输入你的密码并按下 **Return** 即可更改你的 shell。注销并重新登录后即可开始使用新 shell。

> **注意**
>
> 新的 shell *必须* 存在于 **/etc/shells** 中。如果该 shell 是按照 [安装应用程序：软件包和 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu) 中所述从 FreeBSD Ports 安装的，它应该会自动添加到该文件中。如果缺失，可使用以下命令添加，将路径替换为该 shell 的路径：

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

然后重新运行 [chsh(1)](https://man.freebsd.org/cgi/man.cgi?query=chsh\&sektion=1\&format=html)。

## 3.9.2. 高级 Shell 技巧

UNIX® shell 不仅是个命令解释器，它还是款强大的工具，能让用户执行命令、重定向其输出、重定向其输入，并将多个命令组合在一起以优化最终输出。将这些功能与内建命令结合使用，可以为用户提供一个极具效率的环境。

Shell 重定向是将命令的输出或输入发送到另一个命令或文件中的操作。例如，将 [ls(1)](https://man.freebsd.org/cgi/man.cgi?query=ls\&sektion=1\&format=html) 命令的输出捕获到一个文件中，可以这样重定向输出：

```sh
% ls > directory_listing.txt
```

此时目录内容会列出并保存到 `directory_listing.txt` 中。有些命令可以读取输入，比如 [sort(1)](https://man.freebsd.org/cgi/man.cgi?query=sort\&sektion=1\&format=html)。要对该列表排序，可以这样重定向输入：

```sh
% sort < directory_listing.txt
```

输入会排序并显示在屏幕上。要将该输入重定向到另一个文件，可以通过混合方向来重定向 [sort(1)](https://man.freebsd.org/cgi/man.cgi?query=sort\&sektion=1\&format=html) 的输出：

```sh
% sort < directory_listing.txt > sorted.txt
```

在上述所有示例中，命令通过文件描述符重定向。每个 UNIX® 系统都有文件描述符，包括标准输入（stdin）、标准输出（stdout）和标准错误（stderr）。每种描述符都有其用途，例如输入可以是键盘或鼠标，用于提供输入；输出可以是屏幕或打印机中的纸张；错误则用于诊断或错误信息。这三者都被视为基于 I/O 的文件描述符，有时也被称为流（streams）。

通过使用这些描述符，shell 能将输出和输入在多个命令之间传递，并重定向到文件或从文件中读取。另一种重定向方法是管道操作符。

UNIX® 的管道操作符 `|` 能将一个命令的输出直接传递或重定向到另一个程序。简单来说，管道能让一个命令的标准输出作为标准输入传递给另一个命令，例如：

```sh
% cat directory_listing.txt | sort | less
```

在此示例中，`directory_listing.txt` 的内容将排序，然后输出传递给 [less(1)](https://man.freebsd.org/cgi/man.cgi?query=less\&sektion=1\&format=html)。这使用户可以按自己的节奏浏览输出内容，防止其在屏幕上滚动消失。


# 3.10.文本编辑器

FreeBSD 的绝大多数配置都是通过编辑文本文件完成的，因此熟悉一款文本编辑器是个不错的主意。FreeBSD 基本系统自带了一些文本编辑器，Ports 中还提供了更多选择。

适合入门的简单编辑器是 [ee(1)](https://man.freebsd.org/cgi/man.cgi?query=ee\&sektion=1\&format=html)，即 easy editor（简易编辑器）。要启动该编辑器，可以键入 `ee filename`，其中 *filename* 是要编辑的文件名。进入编辑器后，所有用于操作编辑器功能的命令都会列在屏幕顶部。脱字符（`^`）代表 **Ctrl**，因此 `^e` 就是 **Ctrl**+**e**。要退出 [ee(1)](https://man.freebsd.org/cgi/man.cgi?query=ee\&sektion=1\&format=html)，按下 **Esc**，然后从主菜单中选择“leave editor（退出编辑器）”选项。如果文件已被修改，编辑器会提示保存更改。

FreeBSD 的基本系统中还包括一些功能更强的文本编辑器，比如 [vi(1)](https://man.freebsd.org/cgi/man.cgi?query=vi\&sektion=1\&format=html)。其他编辑器如 [editors/emacs](https://cgit.freebsd.org/ports/tree/editors/emacs/) 和 [editors/vim](https://cgit.freebsd.org/ports/tree/editors/vim/) 是 FreeBSD Ports 的一部分。这些编辑器提供了更强大的功能，但学习起来也更复杂。从长远来看，学会使用像 vim 或 Emacs 这样强大的编辑器，最终可以节省大量时间。

许多修改文件或需要输入内容的应用程序会自动打开一个文本编辑器。要更改默认编辑器，可以按照 [Shell](/di-3-zhang-freebsd-ji-chu/3.9.-shell) 中的说明设置 `EDITOR` 环境变量。


# 3.11.设备和设备节点

设备一词主要用于指代系统中的硬件相关活动，包括磁盘、打印机、显卡和键盘。当 FreeBSD 引导时，大多数引导消息都与设备检测有关。这些引导消息的副本会保存到 **/var/run/dmesg.boot** 文件中。

每个设备都有一个设备名称和编号。例如，`ada0` 是第一个 SATA 硬盘，而 `kbd0` 表示键盘。

FreeBSD 中大多数设备都需要通过位于 **/dev** 目录下的特殊文件（称为设备节点）来访问。


# 3.12.手册页

FreeBSD 上最全面的文档形式是手册页。系统上几乎每个程序都有一份简短的参考手册，解释其基本操作和可用参数。这些手册可以通过 `man` 命令查看：

```sh
% man command
```

其中 *command* 是要了解的命令名称。例如，要了解更多关于 [ls(1)](https://man.freebsd.org/cgi/man.cgi?query=ls\&sektion=1\&format=html) 的信息，可以输入：

```sh
% man ls
```

手册页分为不同的章节，每个章节代表不同的主题类型。在 FreeBSD 中，以下是可用的章节：

1. 用户命令。
2. 系统调用和错误号码。
3. C 库中的函数。
4. 设备驱动程序。
5. 文件格式。
6. 游戏和其他娱乐。
7. 杂项信息。
8. 系统维护和操作命令。
9. 系统内核接口。

在某些情况下，同一主题可能出现在多个章节中。例如，`chmod` 用户命令和 `chmod()` 系统调用都存在。要告诉 [man(1)](https://man.freebsd.org/cgi/man.cgi?query=man\&sektion=1\&format=html) 显示哪个章节，可以指定章节编号：

```sh
% man 1 chmod
```

这将显示用户命令 [chmod(1)](https://man.freebsd.org/cgi/man.cgi?query=chmod\&sektion=1\&format=html) 的手册页。对手册页特定章节的引用，在书面文档中通常用括号标出，因此 [chmod(1)](https://man.freebsd.org/cgi/man.cgi?query=chmod\&sektion=1\&format=html) 指的是用户命令，而 [chmod(2)](https://man.freebsd.org/cgi/man.cgi?query=chmod\&sektion=2\&format=html) 指的是系统调用。

如果不知道手册页的名称，可以使用 `man -k` 命令搜索手册页说明中的关键词：

```sh
% man -k mail
```

此命令将显示说明中包含“mail”关键词的命令列表。这等同于使用 [apropos(1)](https://man.freebsd.org/cgi/man.cgi?query=apropos\&sektion=1\&format=html)。

要查看 **/usr/sbin** 目录中所有命令的说明，可以输入：

```sh
% cd /usr/sbin
% man -f * | more
```

或者

```sh
% cd /usr/sbin
% whatis * | more
```

## 3.12.1. GNU Info 文件

FreeBSD 包含了由自由软件基金会（FSF）制作的几个应用程序和工具。除了手册页，这些程序还可能包括名为 `info` 文件的超文本文档。这些文件可以通过 [info(1)](https://man.freebsd.org/cgi/man.cgi?query=info\&sektion=1\&format=html) 或者在安装了 [editors/emacs](https://cgit.freebsd.org/ports/tree/editors/emacs/) 的情况下，通过 emacs 的 info 模式查看。

使用 [info(1)](https://man.freebsd.org/cgi/man.cgi?query=info\&sektion=1\&format=html) 时，输入：

```sh
% info
```

要查看简短的介绍，输入 `h`。要快速查看命令参考，输入 `?`。


# 4.1.概述

FreeBSD 自带了丰富的系统工具作为基本系统的一部分。此外，FreeBSD 提供了两种互补技术用于安装第三方软件：FreeBSD Ports，用于从源代码安装；以及软件包，用于从预构建的二进制文件安装。可以使用任一方法从本地设备或网络安装软件。

阅读本章，你将了解：

* 二进制软件包和 Ports 之间的区别。
* 如何查找已移植到 FreeBSD 的第三方软件。
* 如何使用 pkg 管理二进制软件包。
* 如何使用 Ports 从源代码构建第三方软件。
* 如何找到应用程序安装的文件，以便做安装后的配置。
* 软件安装失败时该怎么办。


# 4.2.软件安装的概述

FreeBSD *Port* 是一组用于自动化从源代码编译应用程序的文件。组成 Port 的文件包含所有必要的信息，能自动下载、解压、打补丁、编译和安装应用程序。

如果软件尚未适配并经过 FreeBSD 测试，可能需要编辑源代码，以便其能正确安装和运行。

然而，已有超过 [37000](https://ports.freebsd.org/) 款第三方应用程序移植到了 FreeBSD。当可行时，这些应用程序会作为预编译的 *软件包* 提供下载。

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

软件包和 Ports 都能处理依赖关系。如果使用软件包或 Port 安装应用程序，而所依赖的库尚未安装，库将自动先行安装。

FreeBSD 软件包包含应用程序所有命令的预编译副本，以及任何配置文件和文档。可以使用 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 命令（例如 `pkg install`）来操作软件包。

尽管这两种技术相似，软件包和 Ports 各有优势。选择满足安装特定应用程序需求的技术。

**软件包的优点**

* 压缩的软件包 tarball 通常比包含应用程序源代码的压缩包小。
* 软件包不需要编译时间。对于大型应用程序，如 Firefox、KDE Plasma 或 GNOME，这在较慢的系统上可能很重要。
* 软件包不需要了解在 FreeBSD 上编译软件的过程。

**Ports 的优点**

* 软件包通常使用保守选项编译，因为它们必须在最大数量的系统上运行。通过从 Port 编译，可以更改编译选项。
* 一些应用程序有与安装哪些功能相关的编译时选项。例如，NGINX® 可以通过各种内建选项配置。 在某些情况下，同一个应用程序可能会有多个软件包，具有不同的设置。例如，NGINX® 有 `nginx` 软件包和 `nginx-lite` 软件包，前者启用了更多的选项，但这也需要安装更多的依赖项，因此会增加空间消耗和攻击面。

  传递依赖可能会变得相当庞大，例如完整的 `nginx` 软件包会拉入多个 X 库，这可能让人感到惊讶，因此从 Port 编译可以让你选择仅需要的选项，而不使用“大杂烩”方式。在某些情况下，可能会为同一应用程序提供多个软件包，以指定特定设置。
* 某些软件的许可条款禁止二进制分发。这类软件必须以源代码形式分发，且必须由最终用户编译。
* 有些人不信任二进制分发，或更愿意通过源代码查找潜在问题。
* 应用自定义补丁时需要源代码。

要跟踪更新的 Ports，可以订阅 [FreeBSD Ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports) 和 [FreeBSD Ports bugs 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports-bugs)。

> **警告**
>
> 在安装应用程序之前，请检查 <https://vuxml.freebsd.org/> 以了解相关的安全问题。
>
> 要审计已安装的软件包以检查已知漏洞，请运行 `pkg audit -F`。

本章的其余部分将说明如何使用软件包和 Ports 在 FreeBSD 上安装和管理第三方软件。


# 4.3.寻找所需的应用程序

FreeBSD 可用应用程序列表一直在增长。有多种方式可以找到要安装的软件：

* FreeBSD 网站维护着最新的可搜索应用程序列表，地址为 [Ports Portal](https://ports.freebsd.org/)。可以按应用程序名称或软件类别搜索 Ports。
* Dan Langille 维护着 [FreshPorts](https://www.freshports.org/)，提供全面的搜索工具，还跟踪 Ports 中的应用程序变更。注册用户可以创建自定义关注列表，以便在关注的 Port 更新时收到自动邮件。
* 如果难以找到特定的应用程序，可以尝试在 [SourceForge](https://sourceforge.net/) 或 [GitHub](https://github.com/) 等网站上搜索，然后到 [Ports Portal](https://ports.freebsd.org/) 查看该应用程序是否已移植。
* 使用 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 命令在二进制软件包存储库中搜索应用程序。


# 4.4.使用 pkg 管理二进制包

[pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 提供了操作软件包的接口：注册、添加、删除和升级软件包。

对于只希望使用 FreeBSD 镜像站提供的预构建二进制软件包的站点，使用 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 管理软件包是足够的。

然而，对于从源代码构建软件的站点，需要单独的 [Port 管理工具](https://handbook.bsdcn.org/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/pages/W39hsL0kjJZpnmvtfoQd#id-4.5.4.1.-sheng-ji-he-guan-li-ports-de-gong-ju)。

由于 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 只处理二进制软件包，它不能替代这些工具。那些工具可以用来从二进制软件包和 Ports 安装软件，而 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 只安装二进制软件包。

## 4.4.1. 开始使用 pkg

所有受支持的 FreeBSD 版本现在都包含 **/usr/sbin/pkg**，即 [pkg(7)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=7\&format=html)。这是小型占位程序，仅具有安装真正的 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 所需的最低功能。

> **注意**
>
> 自举过程需要正常工作的互联网连接。

运行 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 命令行：

```sh
# pkg
```

输出应类似于以下内容：

```sh
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]
```

[pkg(7)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=7\&format=html) 将拦截该命令，确认后，它会下载 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) tarball，从中安装 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html)，自举本地软件包数据库，然后继续执行最初请求的命令。

较新的 [pkg(7)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=7\&format=html) 版本支持 `pkg -N` 作为测试，查看 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 是否已安装而不触发安装，反过来，使用 `pkg bootstrap[-f]` 安装 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html)（或强制重新安装）而不执行其他任何操作。

有关 pkg 使用信息，请参见 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 手册页，或运行 `pkg` 而不带附加参数。其他 pkg 配置选项在 [pkg.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=pkg.conf\&sektion=5\&format=html) 中有说明。

每个 pkg 命令参数都有专门的命令手册页说明。

例如，要查看 `pkg install` 的手册页，请运行以下命令：

```sh
# pkg help install
```

本节的其余部分介绍了可以使用 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 执行的常见二进制软件包管理任务。每个命令都有许多选项，可以自定义其使用方式。请参考命令的帮助或手册页以获取详细信息和更多示例。

## 4.4.2. 季度和最新 Ports 分支

`Quarterly` 分支为用户提供了更可预测和稳定的 Port 和软件包安装及升级体验。这主要通过只接受非功能性更新来实现。季度分支旨在接收安全修复（这些可能是版本更新，或是提交的回溯）、错误修复和 Ports 合规性或框架更改。季度分支在每年的一月、四月、七月和十月的开始从 HEAD 分支切出。分支名称根据它们创建的年份（YYYY）和季度（Q1-4）命名。例如，2023 年一月创建的季度分支命名为 2023Q1。`Latest` 分支则为用户提供最新版本的软件包。

要将 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 从 Quarterly 切换到 Latest，请运行以下命令：

```sh
# mkdir -p /usr/local/etc/pkg/repos
# echo 'FreeBSD-ports: { url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest" }' > /usr/local/etc/pkg/repos/FreeBSD.conf
```

然后运行以下命令以更新本地软件包存储库索引以获取 Latest 分支的内容：

```sh
# pkg update -f
```

## 4.4.3. 内核模块存储库

内核模块存储库能让用户安装可直接使用的内核模块，例如用于图形驱动和特定硬件的模块。从 FreeBSD 14.3 开始，FreeBSD 项目为每个支持的版本构建了内核模块。若要创建这样的存储库配置（如果尚不存在），请将以下内容添加到 **/usr/local/etc/pkg/repos/kmods.conf**：

```sh
FreeBSD-kmods: {
        url: "pkg+https://pkg.FreeBSD.org/${ABI}/KMODSFLAVOR",
        mirror_type: "srv",
        signature_type: "fingerprints",
        fingerprints: "/usr/share/keys/pkg",
        enabled: yes
}
```

`KMODSFLAVOR` 遵循如下模式：`kmods_PORTBRANCH_MINORRELEASE`。

例如：

| FreeBSD 版本           | Ports main       | Ports 季度分支          |
| -------------------- | ---------------- | ------------------- |
| FreeBSD 14.2-RELEASE | `kmods_latest_2` | `kmods_quarterly_2` |
| FreeBSD 14.3-RELEASE | `kmods_latest_3` | `kmods_quarterly_3` |
| FreeBSD 14.3-STABLE  | `kmods_latest`   | `kmods_quarterly`   |
| FreeBSD 15.0-CURRENT | `kmods_latest`   |                     |

## 4.4.4. 配置 pkg

[pkg.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=pkg.conf\&sektion=5\&format=html) 是 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 工具使用的系统配置文件。该文件的默认位置是 **/usr/local/etc/pkg.conf**。

> **注意**
>
> FreeBSD 不需要 `pkg.conf` 文件。许多安装在没有 `pkg.conf` 或者空的 `pkg.conf`（除了注释行）时也能正常工作。

以 `#` 开头的行是注释行，会被忽略。

该文件采用 UCL 格式。有关 [libucl(3)](https://man.freebsd.org/cgi/man.cgi?query=libucl\&sektion=3\&format=html) 语法的更多信息，请访问 [官方 UCL 网站](https://github.com/vstakhov/libucl)。

可识别以下类型的选项：布尔选项、字符串选项和列表选项。

如果配置文件中指定以下值之一，则布尔选项被视为启用：YES、TRUE 和 ON。

## 4.4.5. 搜索软件包

要搜索软件包，可以使用 [pkg-search(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-search\&sektion=8\&format=html) 命令：

```sh
# pkg search nginx
```

输出应类似于以下内容：

```sh
modsecurity3-nginx-1.0.3       Instruction detection and prevention engine / nginx Wrapper
nginx-1.22.1_2,3               Robust and small WWW server
nginx-devel-1.23.2_4           Robust and small WWW server
nginx-full-1.22.1_1,3          Robust and small WWW server (full package)
nginx-lite-1.22.1,3            Robust and small WWW server (lite package)
nginx-naxsi-1.22.1,3           Robust and small WWW server (plus NAXSI)
nginx-prometheus-exporter-0.10.0_7 Prometheus exporter for NGINX and NGINX Plus stats
nginx-ultimate-bad-bot-blocker-4.2020.03.2005_1 Nginx bad bot and other things blocker
nginx-vts-exporter-0.10.7_7    Server that scraps NGINX vts stats and export them via HTTP
p5-Nginx-ReadBody-0.07_1       Nginx embeded perl module to read and evaluate a request body
p5-Nginx-Simple-0.07_1         Perl 5 module for easy to use interface for Nginx Perl Module
p5-Test-Nginx-0.30             Testing modules for Nginx C module development
py39-certbot-nginx-2.0.0       NGINX plugin for Certbot
rubygem-passenger-nginx-6.0.15 Modules for running Ruby on Rails and Rack applications
```

## 4.4.6. 安装和获取软件包

要安装二进制软件包，可以使用 [pkg-install(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-install\&sektion=8\&format=html) 命令。此命令使用存储库数据来确定要安装的软件版本以及是否有任何未安装的依赖项。例如，要安装 curl：

```sh
# pkg install curl
```

输出应类似于以下内容：

```sh
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 9 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        ca_root_nss: 3.83
        curl: 7.86.0
        gettext-runtime: 0.21
        indexinfo: 0.3.1
        libidn2: 2.3.3
        libnghttp2: 1.48.0
        libpsl: 0.21.1_4
        libssh2: 1.10.0.3
        libunistring: 1.0

Number of packages to be installed: 9

The process will require 11 MiB more space.
3 MiB to be downloaded

Proceed with this action? [y/N]
```

新软件包和作为依赖项安装的任何额外软件包可以在已安装软件包列表中查看：

```sh
# pkg info
```

输出应类似于以下内容：

```sh
ca_root_nss-3.83               Root certificate bundle from the Mozilla Project
curl-7.86.0                    Command line tool and library for transferring data with URLs
gettext-runtime-0.21.1         GNU gettext runtime libraries and programs
indexinfo-0.3.1                Utility to regenerate the GNU info page index
libidn2-2.3.3                  Implementation of IDNA2008 internationalized domain names
libnghttp2-1.48.0              HTTP/2.0 C Library
libpsl-0.21.1_6                C library to handle the Public Suffix List
libssh2-1.10.0.3               Library implementing the SSH2 protocol
libunistring-1.0               Unicode string library
pkg-1.18.4                     Package manager
```

要获取软件包并稍后安装或在其他地方安装，可以使用 [pkg-fetch(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-fetch\&sektion=8\&format=html)。例如，要下载 `nginx-lite`：

```sh
# pkg fetch -d -o /usr/home/user/packages/ nginx-lite
```

* `-d`：用于获取所有依赖项
* `-o`：用于指定下载目录

输出应类似于以下内容：

```sh
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following packages will be fetched:

New packages to be FETCHED:
        nginx-lite: 1.22.1,3 (342 KiB: 22.20% of the 2 MiB to download)
        pcre: 8.45_3 (1 MiB: 77.80% of the 2 MiB to download)

Number of packages to be fetched: 2

The process will require 2 MiB more space.
2 MiB to be downloaded.

Proceed with fetching packages? [y/N]:
```

要安装下载的软件包，可以使用 [pkg-install(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-install\&sektion=8\&format=html)，如下所示：

```sh
# cd /usr/home/user/packages/
```

```sh
# pkg install nginx-lite-1.22.1,3.pkg
```

## 4.4.7. 获取已安装软件包的信息

可以通过运行 [pkg-info(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-info\&sektion=8\&format=html) 来查看系统上已安装的软件包信息。当不带任何选项运行时，它将列出所有已安装的软件包的版本，或者指定的软件包的版本。

例如，要查看安装的 pkg 版本，可以运行：

```sh
# pkg info pkg
```

输出应类似于以下内容：

```sh
pkg-1.19.0
Name           : pkg
Version        : 1.19.0
Installed on   : Sat Dec 17 11:05:28 2022 CET
Origin         : ports-mgmt/pkg
Architecture   : FreeBSD:13:amd64
Prefix         : /usr/local
Categories     : ports-mgmt
Licenses       : BSD2CLAUSE
Maintainer     : pkg@FreeBSD.org
WWW            : https://github.com/freebsd/pkg
Comment        : Package manager
Options        :
        DOCS           : on
Shared Libs provided:
        libpkg.so.4
Annotations    :
        FreeBSD_version: 1301000
        repo_type      : binary
        repository     : FreeBSD
Flat size      : 33.2MiB
Description    :
Package management tool

WWW: https://github.com/freebsd/pkg
```

## 4.4.8. 升级已安装的软件包

可以使用 [pkg-upgrade(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-upgrade\&sektion=8\&format=html) 升级已安装的软件包到最新版本：

```sh
# pkg upgrade
```

此命令将比较已安装版本与存储库索引中可用版本，并从存储库升级它们。

## 4.4.9. 审计已安装的软件包

第三方应用程序中会定期发现软件漏洞。为了解决这个问题，pkg 包含内建的审计机制。要检查系统上已安装软件是否存在已知漏洞，可以使用 [pkg-audit(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-audit\&sektion=8\&format=html)：

```sh
# pkg audit -F
```

输出应类似于以下内容：

```sh
Fetching vuln.xml.xz: 100%  976 KiB 499.5kB/s    00:02
chromium-108.0.5359.98 is vulnerable:
  chromium -- multiple vulnerabilities
  CVE: CVE-2022-4440
  CVE: CVE-2022-4439
  CVE: CVE-2022-4438
  CVE: CVE-2022-4437
  CVE: CVE-2022-4436
  WWW: https://vuxml.FreeBSD.org/freebsd/83eb9374-7b97-11ed-be8f-3065ec8fd3ec.html
```

## 4.4.10. 移除软件包

可以使用 [pkg-delete(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-delete\&sektion=8\&format=html) 移除不再需要的软件包。

例如：

```sh
# pkg delete curl
```

输出应类似于以下内容：

```sh
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
        curl :7.86.0

Number of packages to be removed: 1

The operation will free 4 MiB.

Proceed with deinstallation packages? [y/N]: y
[1/1] Deinstalling curl-7.86.0...
[1/1] Deleting files for curl-7.86.0: 100%
```

## 4.4.11. 自动移除未使用的软件包

移除软件包可能会留下不再需要的依赖项。可以使用 [pkg-autoremove(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-autoremove\&sektion=8\&format=html) 自动检测并移除作为依赖项安装但不再需要的未使用软件包（叶子包）：

```sh
# pkg autoremove
```

输出应类似于以下内容：

```sh
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages:

Installed packages to be REMOVED:
        ca_root_nss-3.83

Number of packages to be removed: 1

The operation will free 723 KiB.

Proceed with deinstalling packages? [y/N]:
```

作为依赖项安装的软件包称为 *自动* 包。非自动包，即作为独立包而不是作为另一个软件包的依赖项明确安装的软件包，可以通过以下命令列出：

```sh
# pkg prime-list
```

输出应类似于以下内容：

```sh
nginx
openvpn
sudo
```

`pkg prime-list` 是在 **/usr/local/etc/pkg.conf** 中声明的别名命令。还有许多其他命令可用于查询系统的软件包数据库。例如，可以使用命令 `pkg prime-origins` 获取上述列表的原始 Port 目录：

```sh
# pkg prime-origins
```

输出应类似于以下内容：

```sh
www/nginx
security/openvpn
security/sudo
```

此列表可用于使用构建工具如 [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/) 或 [ports-mgmt/synth](https://cgit.freebsd.org/ports/tree/ports-mgmt/synth/) 重新构建系统上安装的所有软件包。

可以通过以下命令将已安装的软件包标记为自动包：

```sh
# pkg set -A 1 devel/cmake
```

当软件包成为叶子包并标记为自动包后，`pkg autoremove` 就会选中它。

可以通过以下命令将已安装的软件包标记为 *非* 自动包：

```sh
# pkg set -A 0 devel/cmake
```

## 4.4.12. 移除过时的软件包

默认情况下，pkg 会将二进制软件包存储在由 [pkg.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=pkg.conf\&sektion=5\&format=html) 中的 `PKG_CACHEDIR` 定义的缓存目录中。只保留最新安装的软件包的副本。旧版本的 pkg 会保留所有先前的软件包。要移除这些过时的二进制软件包，可以运行：

```sh
# pkg clean
```

可以通过运行以下命令清空整个缓存：

```sh
# pkg clean -a
```

## 4.4.13. 锁定和解锁软件包

[pkg-lock(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-lock\&sektion=8\&format=html) 用于锁定软件包，防止其被重新安装、修改或删除。使用 [pkg-unlock(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-unlock\&sektion=8\&format=html) 可以解锁已锁定的软件包。这两种操作仅对当前已安装的软件包有效。因此，除非新安装的软件包需要更新已锁定的软件包，否则无法通过此机制阻止新软件包的安装。

例如，要锁定 `nginx-lite`：

```sh
# pkg lock nginx-lite
```

要解锁 `nginx-lite`：

```sh
# pkg unlock nginx-lite
```

## 4.4.14. 修改软件包元数据

FreeBSD Ports 中的软件包可能会发生重大版本号变化。为了解决这个问题，pkg 提供内置命令来更新软件包的来源。这个功能在例如将 [lang/python3](https://cgit.freebsd.org/ports/tree/lang/python3/) 重命名为 [lang/python311](https://cgit.freebsd.org/ports/tree/lang/python311/) 时非常有用，这样 [lang/python3](https://cgit.freebsd.org/ports/tree/lang/python3/) 就可以代表版本 `3.11`。

要更改上述示例中的软件包来源，可以运行：

```sh
# pkg set -o lang/python3:lang/python311
```

另一个例子是将 [lang/ruby31](https://cgit.freebsd.org/ports/tree/lang/ruby31/) 更新为 [lang/ruby32](https://cgit.freebsd.org/ports/tree/lang/ruby32/)，可以运行：

```sh
# pkg set -o lang/ruby31:lang/ruby32
```

> **注意**
>
> 修改软件包来源后，必须重新安装依赖于该软件包的其他软件包。要强制重装依赖该软件包的软件包，请运行：

```sh
# pkg install -Rf lang/ruby32
```


# 4.5.使用 Ports

Ports 是一组 `Makefile`、补丁和说明文件。每一组文件用于在 FreeBSD 上编译并安装某个单独的应用程序，称为 *Port*。

默认情况下，Ports 本身存储在 **/usr/ports** 的子目录中。

> **警告**
>
> 在安装和使用 Ports 之前，请注意：通常不建议将 Ports 与通过 pkg 提供的二进制软件包混用。pkg 默认跟踪的是 Ports 树的季度分支（quarterly branch），而不是 HEAD。某个 Port 在 HEAD 中的依赖项，可能与其在季度分支中的不同，这可能会导致 pkg 安装的依赖项与 Ports 安装的依赖项之间产生冲突。如果必须同时使用 Ports 和 pkg，请确保它们使用的是同一分支的 Ports 树。

Ports 包含以软件类别划分的目录，每个类别目录中包含若干应用程序的子目录。每个应用程序的子目录包含一组告诉 FreeBSD 如何编译和安装该程序的文件，这组文件称为 *Ports 框架*。每份 Ports 框架包含以下文件和目录：

* **Makefile**：包含指定如何编译应用程序以及将组件安装到何处的指令。
* **distinfo**：包含构建该 Port 所需下载文件的名称和校验和。
* **files/**：此目录包含为了使程序能在 FreeBSD 上编译和安装所需的补丁；此外也可能包含构建该 Port 所用的其他文件。
* **pkg-descr**：提供程序的详细说明。
* **pkg-plist**：列出该 Port 安装的所有文件；它也告诉 Ports 系统在卸载时要删除哪些文件。

一些 Port 还包含 `pkg-message` 或其他用于处理特殊情况的文件。有关这些文件以及 Ports 的更多信息，请参考 [FreeBSD Porter’s Handbook](https://docs.freebsd.org/en/books/porters-handbook/)。

Port 本身并不包含实际的源代码（也叫 `distfile`）。在构建 Port 时的 extract 阶段会自动将下载的源代码保存到 **/usr/ports/distfiles**。

## 4.5.1. 安装 Ports

在通过 Port 编译应用程序之前，必须先安装 Ports。如果在安装 FreeBSD 时未选择安装 Ports，可以使用以下方法来安装：

**操作步骤：Git 方法**

如果你需要对 Ports 树有更多控制，或需要保留本地修改，或你正在使用 FreeBSD-CURRENT，可以使用 Git 获取 Ports。详细的 Git 使用说明请参考 [Git 入门指南](https://docs.freebsd.org/en/articles/committers-guide/#git-primer)。

我们在 Git 命令中加入 `--depth 1` 参数，以便在克隆时不获取提交历史，这样能节省时间，对于大多数用户而言已经足够。如果你对 Ports 树有自己的修改，或出于其他原因需要保留历史记录，则可以省略下面命令中的 `--depth 1` 参数。

1. 在使用 Git 克隆 Ports 树之前，必须先安装 Git。如果系统上已经有 Ports 树，可以通过以下方式安装 Git：

   ```sh
   # cd /usr/ports/devel/git
   # make install clean
   ```

   如果系统上没有 Ports 树，或是使用 pkg 来管理软件包，也可以用 pkg 安装 Git：

   ```sh
   # pkg install git
   ```
2. 克隆 Ports 树的 HEAD 分支：

   ```sh
   # git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
   ```
3. 或者，克隆某个季度分支的 Ports 树：

   ```sh
   # git clone --depth 1 https://git.FreeBSD.org/ports.git -b 2023Q1 /usr/ports
   ```
4. 在完成首次 Git 克隆之后，如需更新 **/usr/ports**：

   ```sh
   # git -C /usr/ports pull
   ```
5. 如需将 **/usr/ports** 切换到其他季度分支：

   ```sh
   # git -C /usr/ports fetch --depth 1 origin 2023Q2:2023Q2
   # git -C /usr/ports switch 2023Q2
   ```

## 4.5.2. 安装 Ports

本节介绍如何使用 Ports 安装或移除软件的基本方法。关于可用的 `make` 目标和环境变量的详细说明，请参阅 [ports(7)](https://man.freebsd.org/cgi/man.cgi?query=ports\&sektion=7\&format=html)。

> **警告**
>
> 在编译任何 Port 之前，请务必按照上一节中的说明更新 Ports。由于安装任何第三方软件都可能带来安全漏洞，建议事先在 <https://vuxml.freebsd.org/> 上查看该 Port 是否存在已知安全问题。或者，可以在安装新 Port 之前运行 `pkg audit -F`。此命令也可以配置为在每日安全检查中自动执行安全审计并更新漏洞数据库。详见 [pkg-audit(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-audit\&sektion=8\&format=html) 和 [periodic(8)](https://man.freebsd.org/cgi/man.cgi?query=periodic\&sektion=8\&format=html)。

使用 Ports 编译程序需要系统具备正常的网络连接，并且需要超级用户权限。

要编译并安装 Port，先切换到目标 Port 的目录下，然后输入 `make install`。屏幕上会显示安装进度信息：

```sh
# 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
...
[解压输出略]
...
>> 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
...
[配置输出略]
...
===>  Building for lsof-4.88.d,8
...
[编译输出略]
...

===>  Installing for lsof-4.88.d,8
...
[安装输出略]
...
===>   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 提示符。

某些 shell 会缓存 `PATH` 环境变量所列目录中的可执行命令列表，以加快命令查找速度。使用 `tcsh` 的用户应在安装新命令后输入 `rehash`，以便无需指定完整路径即可调用该命令；使用 `sh` 的用户应使用 `hash -r`。更多信息请参考各自的 shell 文档。

在安装过程中，系统会创建用于临时编译的子目录。删除该目录可以节省磁盘空间，并减少将来升级该 Port 时可能出现的问题：

```sh
# make clean
===>  Cleaning for lsof-88.d,8
#
```

> **注意**
>
> 若想省去这一步，可在编译时直接使用命令 `make install clean`。

### 4.5.2.1. 自定义 Ports 安装

某些 Ports 提供构建选项，可用于启用或禁用应用程序组件、设置安全选项，或做其他定制。例如 [www/firefox](https://cgit.freebsd.org/ports/tree/www/firefox/) 和 [security/gpgme](https://cgit.freebsd.org/ports/tree/security/gpgme/)。如果该 Port 依赖其他也提供可配置选项的 Port，安装过程中可能会多次暂停并提示用户从菜单中选择选项。为避免多次交互并一次性完成所有配置，可在该 Port 的目录中运行 `make config-recursive`。然后再执行 `make install [clean]` 以编译并安装该 Port。

> **技巧**
>
> 使用 `config-recursive` 时，待配置的 Port 列表由 `all-depends-list` 目标收集。建议重复运行 `make config-recursive`，直到所有依赖 Port 的选项都已定义，且 Port 选项界面不再出现，这样才能确保所有依赖项选项均已配置完毕。

要在 Port 构建后重新进入构建选项菜单，以便添加、删除或更改选项，有几种方法。一种是进入该 Port 所在目录并输入 `make config`。另一种是使用 `make showconfig` 查看当前选项。还可以执行 `make rmconfig` 删除所有已选项，然后重新配置。这些方法及其他选项在 [ports(7)](https://man.freebsd.org/cgi/man.cgi?query=ports\&sektion=7\&format=html) 中有详细说明。

Ports 系统使用 [fetch(1)](https://man.freebsd.org/cgi/man.cgi?query=fetch\&sektion=1\&format=html) 下载源代码文件，它支持多种环境变量。如果 FreeBSD 系统处于防火墙或 FTP/HTTP 代理之后，可能需要设置 `FTP_PASSIVE_MODE`、`FTP_PROXY` 和 `FTP_PASSWORD` 等变量。完整变量列表请参考 [fetch(3)](https://man.freebsd.org/cgi/man.cgi?query=fetch\&sektion=3\&format=html)。

对于无法始终连接网络的用户，可以在 **/usr/ports** 中运行 `make fetch` 来下载所有 distfiles，也可以在某个类别目录（如 **/usr/ports/net**）或具体 Port 目录中运行该命令。但请注意，如果该 Port 有依赖项，则在分类或 Port 目录中运行此命令 *不会* 下载其他分类中依赖项的 distfiles。如需同时下载所有依赖的 distfiles，请使用 `make fetch-recursive`。

在少数情况下，如组织有本地 distfiles 存储库，可使用 `MASTER_SITES` 变量来覆盖 `Makefile` 中指定的下载路径。使用时，请指定替代位置：

```sh
# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch
```

`WRKDIRPREFIX` 和 `PREFIX` 变量可用来覆盖默认的构建目录和安装目录。例如：

```sh
# make WRKDIRPREFIX=/usr/home/example/ports install
```

将在 **/usr/home/example/ports** 下编译，并将程序安装到 **/usr/local**。

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

将在 **/usr/ports** 下编译，并将程序安装到 **/usr/home/example/local**。再如：

```sh
# make WRKDIRPREFIX=../ports PREFIX=../local install
```

则会同时更改工作目录和安装目录。

这些变量也可以通过环境变量来设置。如何设置环境变量，请参考所使用 shell 的手册页。

## 4.5.3. 移除已安装的 Ports

已安装的 Ports 可以使用 `pkg delete` 卸载。该命令的使用示例可见于 [pkg-delete(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-delete\&sektion=8\&format=html) 手册页。

另外，也可以在该 Port 的目录中运行 `make deinstall`：

```sh
# 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.4. 升级 Ports

随着时间推移，Ports 中的软件可能会有更新版本。本节说明如何判断哪些软件可以升级，以及如何执行升级操作。

要判断已安装的 Ports 是否有新版本可用，首先确保使用 [Git 方法](#id-4.5.1.-an-zhuang-ports) 中说明的命令更新 Ports 树。然后执行以下命令列出已过期的 Ports：

```sh
# pkg version -l "<"
```

> **重要**
>
> 在尝试升级之前，请阅读 **/usr/ports/UPDATING** 文件，从文件顶部阅读到离上一次升级 Ports 或系统安装时间最近的日期。该文件说明了用户在升级 Port 时可能遇到的各种问题和所需的额外步骤，例如文件格式变化、配置文件路径变更，或与旧版本不兼容等问题。请记录与需升级的 Port 匹配的所有说明，并在执行升级时遵循这些指引。

### 4.5.4.1. 升级和管理 Ports 的工具

Ports 提供了若干实用工具用于执行实际升级操作。每种工具都有其优点和局限。

以前大多数系统使用的是 Portmaster 或 Portupgrade。Synth 是一款较新的可选工具。

> **注意**
>
> 应选择哪个工具由系统管理员根据具体情况决定。建议在使用任何这些工具之前先备份数据。

### 4.5.4.2. 使用 Portmaster 升级 Ports

[ports-mgmt/portmaster](https://cgit.freebsd.org/ports/tree/ports-mgmt/portmaster/) 是非常小巧的工具，用于升级已安装的 Ports。它的设计目标是仅使用 FreeBSD 基本系统中已有的工具，而不依赖其他 Ports 或数据库。要通过 Ports 安装该工具：

```sh
# cd /usr/ports/ports-mgmt/portmaster
# make install clean
```

Portmaster 将 Ports 分为以下四类：

* 根 Port（Root Port）：没有依赖，也不会被其他 Ports 依赖。
* 树干 Port（Trunk Port）：没有依赖，但会被其他 Ports 依赖。
* 分支 Port（Branch Port）：有依赖，且会被其他 Ports 依赖。
* 叶子 Port（Leaf Port）：有依赖，但不会被其他 Ports 依赖。

要列出这些类别并检查可用更新：

```sh
# 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
```

要升级所有已过期的 Ports：

```sh
# portmaster -a
```

> **注意**
>
> 默认情况下，Portmaster 会在删除旧版本 Port 之前创建备份软件包。如果新版本安装成功，它会删除该备份。使用 `-b` 可以指示 Portmaster 不自动删除备份。加上 `-i` 可启用交互模式，升级每个 Port 前询问用户确认。Portmaster 提供了许多其他选项，详情请阅读 [portmaster(8)](https://man.freebsd.org/cgi/man.cgi?query=portmaster\&sektion=8\&format=html) 手册页。

如果升级过程中出现错误，可加上 `-f` 强制升级并重建所有 Ports：

```sh
# portmaster -af
```

Portmaster 也可以用于安装新的 Ports，会在构建和安装新 Port 之前先升级所有依赖项。要使用此功能，请指定 Port 在 Ports 中的位置：

```sh
# portmaster shells/bash
```

更多关于 [ports-mgmt/portmaster](https://cgit.freebsd.org/ports/tree/ports-mgmt/portmaster/) 的信息请参考其 `pkg-descr`。

### 4.5.4.3. 使用 Portupgrade 升级 Ports

> **警告**
>
> Portupgrade 已弃用，并将于不久后移除。

[ports-mgmt/portupgrade](https://cgit.freebsd.org/ports/tree/ports-mgmt/portupgrade/) 是另一款用于升级 Ports 的工具。它会安装一组应用程序，用于管理 Ports。但该工具依赖 Ruby。要安装该 Port：

```sh
# cd /usr/ports/ports-mgmt/portupgrade
# make install clean
```

在使用此工具执行升级前，建议使用 `pkgdb -F` 扫描已安装的 Ports 列表，并修复其报告的所有不一致问题。

要升级系统上所有过期的 Ports，使用 `portupgrade -a`。或者，加上 `-i` 逐一确认每个升级：

```sh
# portupgrade -ai
```

若只想升级指定的程序，而不是所有可用 Ports，使用 `portupgrade pkgname`。必须加上 `-R` 以先升级该程序所依赖的所有 Ports：

```sh
# portupgrade -R firefox
```

加上 `-P` 后，Portupgrade 会在 `PKG_PATH` 中列出的本地目录中查找已有的软件包文件，若找不到，则尝试从远程站点获取。如果本地和远程都无法获取，则会使用 Ports 构建。若希望完全不使用 Ports，请使用 `-PP`，该选项在找不到软件包时会直接中止：

```sh
# portupgrade -PP gnome3
```

若只想获取 Port 的 distfiles 或包文件（若加了 `-P`），不构建或安装，可使用 `-F`。更多选项请参考 `portupgrade` 的手册页。

更多关于 [ports-mgmt/portupgrade](https://cgit.freebsd.org/ports/tree/ports-mgmt/portupgrade/) 的信息可见其 `pkg-descr`。

## 4.5.5. Ports 与磁盘空间

随着时间推移，使用 Ports 会逐渐占用磁盘空间。在构建并安装某 Port 之后，在该 Port 的目录中运行 `make clean` 可以清理临时的 `work` 目录。如果使用 Portmaster 安装 Port，它默认会自动移除该目录，除非指定了 `-K` 选项。而如果已安装 Portupgrade，以下命令可以移除本地 Ports 副本中所有的 `work` 目录：

```sh
# portsclean -C
```

此外，过时的源代码分发文件（distfiles）会在 **/usr/ports/distfiles** 中逐渐堆积。若要删除所有不再被任何 Port 引用的 distfile，可使用 Portupgrade 提供的命令：

```sh
# portsclean -D
```

Portupgrade 也可以移除系统中所有当前安装的 Ports 不再引用的 distfile：

```sh
# portsclean -DD
```

若使用 Portmaster，可执行以下命令：

```sh
# portmaster --clean-distfiles
```

默认情况下，该命令是交互式的，会逐个询问用户是否删除某个 distfile。

除了以上命令之外，[ports-mgmt/pkg\_cutleaves](https://cgit.freebsd.org/ports/tree/ports-mgmt/pkg_cutleaves/) 可用于自动化清理那些不再需要的已安装 Ports。


# 4.6.使用 Poudriere 构建软件包

poudriere 是采用 `BSD` 许可证的实用工具，用于创建和测试 FreeBSD 软件包。它通过 FreeBSD jail 创建隔离的编译环境。这些 jail 可用于为与当前系统版本不同的 FreeBSD 构建软件包，也可以在 amd64 主机上为 i386 构建软件包。构建完成后，生成的软件包布局与 FreeBSD 官方镜像相同，可供 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 及其他包管理工具使用。

poudriere 可通过软件包或 Port [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/) 安装。安装后会附带示例配置文件 **/usr/local/etc/poudriere.conf.sample**，可将其复制为 **/usr/local/etc/poudriere.conf** 并根据本地系统编辑。

虽然运行 poudriere 的系统不要求使用 `ZFS`，但使用 ZFS 有助于提升性能。启用 ZFS 时，需要在 **/usr/local/etc/poudriere.conf** 中设置 `ZPOOL`，并将 `FREEBSD_HOST` 设为附近的镜像站。定义 `CCACHE_DIR` 可启用 [devel/ccache](https://cgit.freebsd.org/ports/tree/devel/ccache/)，缓存重复编译的代码，加快构建速度。建议将 poudriere 的数据集挂载到独立的目录（如 **/poudriere**）。大多数默认配置项通常已经足够。

系统会根据可用处理器核心数决定并行构建的数量。请确保系统具有足够的虚拟内存（`RAM` 或交换空间），否则 jail 会在构建时中止并被销毁，可能导致莫名其妙的错误信息。

## 4.6.1. 初始化 Jail 和 Ports 树

完成配置后，需要初始化 poudriere，使其安装所需的 FreeBSD jail 和 Ports 树。使用 `-j` 指定 jail 名称，`-v` 指定 FreeBSD 版本。在 FreeBSD/amd64 系统上，也可使用 `-a` 指定架构（`i386` 或 `amd64`），默认使用 `uname` 输出的架构：

```sh
# poudriere jail -c -j 13amd64 -v 13.1-RELEASE
[00:00:00] Creating 13amd64 fs at /poudriere/jails/13amd64... done
[00:00:00] Using pre-distributed MANIFEST for FreeBSD 13.1-RELEASE amd64
[00:00:00] Fetching base for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/base.txz              125 MB 4110 kBps    31s
[00:00:33] Extracting base... done
[00:00:54] Fetching src for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/src.txz               154 MB 4178 kBps    38s
[00:01:33] Extracting src... done
[00:02:31] Fetching lib32 for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/lib32.txz              24 MB 3969 kBps    06s
[00:02:38] Extracting lib32... done
[00:02:42] Cleaning up... done
[00:02:42] Recording filesystem state for clean... done
[00:02:42] Upgrading using ftp
/etc/resolv.conf -> /poudriere/jails/13amd64/etc/resolv.conf
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update4.freebsd.org... done.
Fetching metadata signature for 13.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 124 patches.....10....20....30....40....50....60....70....80....90....100....110....120.. done.
Applying patches... done.
Fetching 6 files... done.
The following files will be added as part of updating to
13.1-RELEASE-p1:
/usr/src/contrib/unbound/.github
/usr/src/contrib/unbound/.github/FUNDING.yml
/usr/src/contrib/unbound/contrib/drop2rpz
/usr/src/contrib/unbound/contrib/unbound_portable.service.in
/usr/src/contrib/unbound/services/rpz.c
/usr/src/contrib/unbound/services/rpz.h
/usr/src/lib/libc/tests/gen/spawnp_enoexec.sh
The following files will be updated as part of updating to
13.1-RELEASE-p1:
[…]
Installing updates...Scanning //usr/share/certs/blacklisted for certificates...
Scanning //usr/share/certs/trusted for certificates...
 done.
13.1-RELEASE-p1
[00:04:06] Recording filesystem state for clean... done
[00:04:07] Jail 13amd64 13.1-RELEASE-p1 amd64 is ready to be used
```

```sh
# poudriere ports -c -p local -m git+https
[00:00:00] Creating local fs at /poudriere/ports/local... done
[00:00:00] Checking out the ports tree... done
```

poudriere 支持在单机上构建多个配置的 Ports，分别使用不同的 jail、Ports 树和配置集合（*sets*）。安装 [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/) 或 [ports-mgmt/poudriere-devel](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere-devel/) 后，关于 set 的详细内容请参阅 [poudriere(8)](https://man.freebsd.org/cgi/man.cgi?query=poudriere\&sektion=8\&format=html) 中的 CUSTOMIZATION 部分。

以下所示的基本配置会将针对特定 jail、Ports 树和 set 的 `make.conf` 文件放置在 **/usr/local/etc/poudriere.d** 中。此示例中的文件名由 jail 名称、Ports 名称和 set 名称组合而成：`13amd64-local-workstation-make.conf`。系统的 `make.conf` 和这个新文件会在构建时合并，生成构建 jail 所使用的 `make.conf`。

要构建的软件包列表写入 `13amd64-local-workstation-pkglist` 文件（带有 [FLAVORS](https://docs.freebsd.org/en/books/porters-handbook/flavors) 的 Ports 使用 @FLAVOR 指定）：

```sh
editors/emacs
devel/git
devel/php-composer2@php82
ports-mgmt/pkg
...
```

配置这些 Port 的选项与依赖：

```sh
# poudriere options -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist
```

开始构建并生成软件包存储库：

```sh
# poudriere bulk -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist
```

构建过程中按下 **Ctrl**+**t** 可查看当前构建状态。构建日志会保存于 **/poudriere/logs/bulk/jailname**，可通过 Web 服务器查看构建详情。

构建完成后，新生成的软件包可通过 poudriere 提供的软件存储库安装。

如需了解更多内容，请参阅 [poudriere(8)](https://man.freebsd.org/cgi/man.cgi?query=poudriere\&sektion=8\&format=html) 和 poudriere 官方页面 <https://github.com/freebsd/poudriere/wiki>。

## 4.6.2. 配置 pkg 客户端使用 poudriere 存储库

虽然可以同时使用自定义软件包存储库与官方存储库，但有时更希望禁用官方存储库。这可以通过创建覆盖并禁用官方配置的文件来实现。创建 **/usr/local/etc/pkg/repos/FreeBSD.conf**，内容如下：

```sh
FreeBSD: {
	enabled: no
}
```

通常最方便的做法是通过 HTTP 将 poudriere 软件包存储库提供给客户端访问。可以通过 Web 服务器提供存储库目录，例如 **/usr/local/poudriere/data/packages/13amd64**，其中 `13amd64` 是构建名。

假设软件包存储库的 URL 是 [`https://pkg.example.com/13amd64`](https://pkg.example.com/13amd64)，那么应在 **/usr/local/etc/pkg/repos/custom.conf** 中创建如下配置文件：

```sh
custom: {
	url: "https://pkg.example.com/13amd64",
	enabled: yes,
}
```

如果不希望将软件包存储库暴露在互联网中，可以使用 `file://` 协议直接指向本地路径，例如：

```sh
custom: {
	url: "file:///usr/local/poudriere/data/packages/11amd64",
	enabled: yes,
}
```


# 4.7.安装后的注意事项

无论软件是通过二进制软件包还是 Ports 安装，大多数第三方应用程序在安装后都需要做一定程度的配置。以下命令和位置可以帮助确定应用程序安装了哪些内容。

* 大多数应用程序至少会在 **/usr/local/etc** 中安装一个默认的配置文件。如果应用程序有大量配置文件，则会创建子目录来存放这些文件。通常，示例配置文件会以 `.sample` 后缀结尾。应该查看并根据系统的需要编辑这些配置文件。要编辑示例文件，首先将其复制到没有 `.sample` 后缀的文件名。
* 提供文档的应用程序会将文档安装到 **/usr/local/share/doc** 目录中，许多应用程序还会安装手册页。应该在继续操作之前参考这些文档。
* 一些应用程序运行服务，在启动应用程序之前，必须将其添加到 **/etc/rc.conf** 中。这些应用程序通常会在 **/usr/local/etc/rc.d** 中安装启动脚本。有关更多信息，请参阅 [启动服务](https://handbook.bsdcn.org/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/pages/zCNwGZ2iUwbgqRhlY2R6#id-14.3.1.-qi-dong-fu-wu)。

  > **注意**
  >
  > 按设计，应用程序在安装时不会自动运行其启动脚本，也不会在卸载或升级时运行其停止脚本。这一决定由系统管理员自行决定。
* 使用 [csh(1)](https://man.freebsd.org/cgi/man.cgi?query=csh\&sektion=1\&format=html) 的用户应运行 `rehash` 以重新构建 shell 的 `PATH` 中的已知二进制文件列表。
* 使用 `pkg info` 命令可以确定与应用程序一起安装的文件、手册页和二进制文件。


# 4.8.如何处理损坏的 Port

当某个 Port 无法构建或安装时，可以尝试以下方法：

1. 在 [问题报告数据库](https://www.freebsd.org/support/) 中搜索该 Port 是否有待解决的修复。如果有，实施提议的修复可能会解决该问题。
2. 向 Port 的维护者寻求帮助。在 Port 目录中输入 `make maintainer`，或阅读 Port 的 `Makefile` 以查找维护者的电子邮件地址。记得在发给维护者的电子邮件中包含导致错误的输出信息。

   > **注意**
   >
   > 有些 Port 不是由个人维护，而是由 [邮件列表](https://docs.freebsd.org/en/articles/mailing-list-faq/) 代表的群体维护。许多（但不是所有）此类地址看起来像 <freebsd-listname@FreeBSD.org>。发送邮件时请注意这一点。
   >
   > 特别是，由 <ports@FreeBSD.org> 维护的 Port 并非由特定个人维护。相反，所有的修复和支持都来自订阅该邮件列表的一般社区。总是需要更多的志愿者！

   如果没有收到邮件回复，请按照 [编写 FreeBSD 问题报告](https://docs.freebsd.org/en/articles/problem-reports/) 中的说明使用 Bugzilla 提交 bug 报告。
3. 修复它！[Porter's Handbook](https://docs.freebsd.org/en/books/porters-handbook/) 包含有关 Port 基础设施的详细信息，可用于修复偶尔损坏的 Port，或提交新的 Port。使用 [pkg 管理二进制包](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.4.-shi-yong-pkg-jin-hang-er-jin-zhi-bao-guan-li) 中的说明，安装软件包而不是 Port。


# 5.1.概述

使用 [bsdinstall(8)](https://man.freebsd.org/cgi/man.cgi?query=bsdinstall\&sektion=8\&format=html) [安装](/di-2-zhang-an-zhuang-freebsd/2.1.-gai-shu)的 FreeBSD 系统不会自动安装图形用户界面。本章介绍如何安装和配置 [Xorg(1)](https://man.freebsd.org/cgi/man.cgi?query=Xorg\&sektion=1\&format=html) 服务器，该服务器提供开源 X Window 系统（俗称 X11），用于提供图形化环境。

在阅读本章之前，你应该：

* 了解如何按照 [安装应用程序：软件包和 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu) 的说明安装额外的第三方软件。

阅读本章，你将了解：

* 如何为图形处理器（GPU）选择和安装驱动程序。
* X Window 系统的各个组件及其协作方式。
* 如何安装和配置 X.org 服务器。
* 如何为 X Window 系统安装字体。


# 5.2.显卡驱动

**摘要**：识别你的显卡，找到提供驱动的 Port，安装它，然后通过 [sysrc(8)](https://man.freebsd.org/cgi/man.cgi?query=sysrc\&sektion=8\&format=html) 启用，以便在后续引导时运行。

在 FreeBSD 能渲染图形环境之前，需要内核模块来驱动图形处理器。显卡驱动发展迅速且跨平台，因此它们是单独开发和发布的，而不随 FreeBSD 基本系统一起分发。

下表显示了 FreeBSD 支持的不同图形处理器、对应的内核模块以及提供驱动的 Port：

**表 1. 支持的图形设备**

| 类型           | 许可证 | 模块                                       | Port                                                                                                                                                                    |
| ------------ | --- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Intel®       | 开源  | `i915kms`                                | [graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod/)                                                                                             |
| AMD®         | 开源  | `amdgpu` 或 `radeonkms`                   | [graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod/)                                                                                             |
| NVIDIA®      | 专有  | `nvidia-drm`、`nvidia-modeset` 或 `nvidia` | [graphics/nvidia-drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/nvidia-drm-kmod/) 或 [x11/nvidia-driver](https://cgit.freebsd.org/ports/tree/x11/nvidia-driver/) |
| 系统控制台帧缓冲     | 开源  | `scfb`                                   | [x11-drivers/xf86-video-scfb](https://cgit.freebsd.org/ports/tree/x11-drivers/xf86-video-scfb/)                                                                         |
| VESA BIOS 扩展 | 开源  | `vesa`                                   | [x11-drivers/xf86-video-vesa](https://cgit.freebsd.org/ports/tree/x11-drivers/xf86-video-vesa/)                                                                         |
| VirtualBox®  | 开源  | `vboxvideo`                              | [emulators/virtualbox-ose-additions](https://cgit.freebsd.org/ports/tree/emulators/virtualbox-ose-additions/)                                                           |
| VMware®      | 开源  | `vmwgfx`                                 | [x11-drivers/xf86-video-vmware](https://cgit.freebsd.org/ports/tree/x11-drivers/xf86-video-vmware/)                                                                     |

支持的驱动技术包括：

* **直接渲染驱动**，支持 PRIME 卸载（offload）。PRIME 能让多个图形处理提供者共存。有关 PRIME 的详细说明，请参见 [显卡配置](https://handbook.bsdcn.org/di-5-zhang-xwindow-xi-tong/pages/AR5AMn9RAcMe16pyw6df#id-5.5.2.-pei-zhi-xian-ka)。
* **内核模式设置（KMS）**，能让驱动直接指定显示模式。使用 [vt(4)](https://man.freebsd.org/cgi/man.cgi?query=vt\&sektion=4\&format=html) 控制台驱动时，这对于支持挂起和恢复是必须的。
* **用户模式设置**，这是最古老的驱动类别，仍然受到支持，但只能用于 [sc(4)](https://man.freebsd.org/cgi/man.cgi?query=sc\&sektion=4\&format=html) 控制台和较旧版本的 [Xorg(1)](https://man.freebsd.org/cgi/man.cgi?query=Xorg\&sektion=1\&format=html) 图形环境。

要识别系统中安装的图形处理器，可以使用以下命令：

```sh
% pciconf -lv | grep -B3 display
```

输出示例：

```sh
vgapci1@pci0:0:2:0:     class=0x030000 rev=0x0c hdr=0x00 vendor=0x8086 device=0x46a6 subvendor=0x1028 subdevice=0x0b29
    vendor     = 'Intel Corporation'
    device     = 'Alder Lake-P GT2 [Iris Xe Graphics]'
    class      = display
```

详细的驱动安装和启用说明在后续小节中给出。

> **警告**
>
> 如果图形处理器不受 Intel®、AMD® 或 NVIDIA® 驱动支持，则应使用 SCFB 或 VESA 模块。UEFI 模式下必须使用 SCFB 模块；BIOS 模式下必须使用 VESA 模块。可用以下命令检查引导模式：
>
> ```sh
> % sysctl machdep.bootmethod
> ```
>
> 输出示例：
>
> ```sh
> machdep.bootmethod: UEFI
> ```

## 5.2.1. Intel® 显卡

Port [graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod/) 间接提供了一系列用于 Intel® 显卡的内核模块。近期版本的这些模块可以与其他图形处理器在 PRIME 中协同使用，无需特殊配置。

安装 Intel® 显卡驱动：

```sh
# pkg install drm-kmod
```

然后通过以下命令将模块添加到 **/etc/rc.conf** 文件：

```sh
# sysrc kld_list+=i915kms
```

## 5.2.2. AMD® 显卡

Port [graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod/) 间接提供一系列 AMD® 图形处理器的内核模块。根据硬件代次，可使用 `amdgpu` 或 `radeonkms` 模块。FreeBSD 项目维护了一份 [AMD 图形支持矩阵](https://wiki.freebsd.org/Graphics/AMD-GPU-Matrix)，显示支持级别并确定应使用的驱动。

安装 AMD® 显卡驱动：

```sh
# pkg install drm-kmod
```

启用当前模块，将其添加到 **/etc/rc.conf**：

```sh
# sysrc kld_list+=amdgpu
```

对于旧型号显卡（HD7000/Tahiti 之前），请启用旧版模块：

```sh
# sysrc kld_list+=radeonkms
```

## 5.2.3. NVIDIA® 显卡

NVIDIA® 生产独立显卡处理器，并为 FreeBSD 提供专有驱动。FreeBSD Ports 提供了十余年的 NVIDIA 显卡驱动支持。

管理员应安装其硬件支持的最新驱动。

支持的 NVIDIA® 驱动版本、内核模块及支持的硬件如下：

**表 2. 支持的 NVIDIA® 显卡驱动版本**

| Port                                                                                                                                                                                          | 模块                              | 支持的硬件                                                                     |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------- |
| [graphics/nvidia-drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/nvidia-drm-kmod/)                                                                                                     | `nvidia-drm` 或 `nvidia-modeset` | [支持的硬件](https://www.nvidia.com/Download/driverResults.aspx/210651/en-us/) |
| [x11/nvidia-driver-470](https://cgit.freebsd.org/ports/tree/x11/nvidia-driver-470/)                                                                                                           | `nvidia-modeset`                | [支持的硬件](https://www.nvidia.com/Download/driverResults.aspx/194639/en-us/) |
| [x11/nvidia-driver-390](https://cgit.freebsd.org/ports/tree/x11/nvidia-driver-390/) 或 [x11/nvidia-secondary-driver-390](https://cgit.freebsd.org/ports/tree/x11/nvidia-secondary-driver-390/) | `nvidia-modeset`                | [支持的硬件](https://www.nvidia.com/Download/driverResults.aspx/191122/en-us/) |
| [x11/nvidia-driver-340](https://cgit.freebsd.org/ports/tree/x11/nvidia-driver-340/)                                                                                                           | `nvidia`                        | [支持的硬件](https://www.nvidia.com/Download/driverResults.aspx/156167/en-us/) |
| [x11/nvidia-driver-304](https://cgit.freebsd.org/ports/tree/x11/nvidia-driver-304/)                                                                                                           | `nvidia`                        | [支持的硬件](https://www.nvidia.com/Download/driverResults.aspx/123712/en-us/) |

安装最新 NVIDIA® 驱动：

```sh
# pkg install nvidia-drm-kmod
```

启用驱动，将模块添加到 **/etc/rc.conf**：

```sh
# sysrc kld_list+=nvidia-drm
```

这是直接渲染的 [KMS](/shu-yu-biao) 驱动。

内核模式设置用于在内核中设置显卡模式。通过以下 [loader.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=loader.conf\&sektion=5\&format=html) 可调参数可在后续引导时启用：

```sh
hw.nvidiadrm.modeset="1"
```

PRIME 和 [Wayland](/di-6-zhang-freebsd-zhong-de-wayland/6.1.-wayland-jian-jie) 均需要内核模式设置。

旧版本驱动不支持直接渲染。请改用 modesetting 模块，执行以下命令：

```sh
# sysrc kld_list+=nvidia-modeset
```

对于 390 之前版本的 NVIDIA 驱动，请注意它们不支持内核模式设置，因此必须与旧版 [sc(4)](https://man.freebsd.org/cgi/man.cgi?query=sc\&sektion=4\&format=html) 控制台驱动和 1.20 之前版本的 [x11/xorg-server](https://cgit.freebsd.org/ports/tree/x11/xorg-server/) 配合使用。

在 **/etc/rc.conf** 中启用：

```sh
# sysrc kld_list+=nvidia
```

某些显卡需要下载特殊固件才能正常工作。[fwget(8)](https://man.freebsd.org/cgi/man.cgi?query=fwget\&sektion=8\&format=html) 工具可以下载并安装所需文件到 **/boot/firmware** 目录下。[fwget(8)](https://man.freebsd.org/cgi/man.cgi?query=fwget\&sektion=8\&format=html) 会扫描 'PCI' 设备并为需要固件的设备下载相应的固件。


# 5.3.X Window 系统概览

X Window 系统是 UNIX® 平台的传统图形架构，既支持最新技术，又兼顾对历代应用程序的支持。包括桌面组件在内的应用程序由 [Xorg(1)](https://man.freebsd.org/cgi/man.cgi?query=Xorg\&sektion=1\&format=html) 服务器承载。该系统具有网络感知能力，其各个组件可以跨网络协同工作。


# 5.4.安装 X.org 服务器

**摘要**：必须安装 [X.org](https://cgit.freebsd.org/ports/tree/x11/xorg/) 服务器以承载 [桌面](/di-8-zhang-zhuo-mian-huan-jing/8.1.-gai-shu)。必须把用户添加到 `video` 组才能使用它。

待显卡驱动安装并启用后，可以作为元包安装 X.org 服务器，也可以通过 Ports 树在本地编译。

完整元包安装速度快，但可自定义选项较少：

```sh
# pkg install xorg
```

此安装将完整的 X Window 系统安装到系统中，包括传统窗口管理器 [twm(1)](https://man.freebsd.org/cgi/man.cgi?query=twm\&sektion=1\&format=html) 以及传统桌面套件。大多数用户会希望安装并配置自己选择的现代 [桌面](/di-8-zhang-zhuo-mian-huan-jing/8.1.-gai-shu)。

当前用户必须是 `video` 组的成员才能运行图形环境。要将用户添加到 `video` 组，请执行以下命令：

```sh
# pw groupmod video -m username
```

要运行 X Window 系统，可使用来自 [x11/xinit](https://cgit.freebsd.org/ports/tree/x11/xinit/) 的 [startx(1)](https://man.freebsd.org/cgi/man.cgi?query=startx\&sektion=1\&format=html)，或安装并配置显示管理器，在引导时图形登录。

> **技巧**
>
> 面向有经验用户的精简版 X Window 系统可通过 [x11/xorg-minimal](https://cgit.freebsd.org/ports/tree/x11/xorg-minimal/) 获得。大部分文档、库和应用程序不会安装，部分应用程序需要这些额外组件才能正常运行。


# 5.5.配置 X.org

**摘要**：如果显示器或输入设备的默认设置不符合要求，[桌面](/di-8-zhang-zhuo-mian-huan-jing/8.1.-gai-shu) 提供了图形界面来配置，或者也可以手动配置。

X.org 服务器支持大多数常见的图形处理器、显示器和输入设备。首先应尝试使用默认设置。本小节概述其配置方法。

## 5.5.1. X.org 配置文件

过去，X.org 服务器通过 **/usr/local/etc/X11/** 下的文件配置。这种方式在特殊情况中仍受支持，但可能与动态自动配置冲突。

除非自动配置失败，否则不要在 **xorg.conf** 中创建配置，也不要运行 `Xorg -configure`。

X.org 服务器会在多个目录中查找配置文件。**/usr/local/etc/X11/** 是 FreeBSD 上推荐的配置文件目录。使用此目录有助于将应用程序文件与操作系统文件分开管理。

使用多个文件分别配置具体设置，比传统的单一 **xorg.conf** 更加方便。这些文件存储在子目录 **/usr/local/etc/X11/xorg.conf.d/** 中。

## 5.5.2. 配置显卡

直接渲染能同时无缝使用独立显卡（dGPU）和集成显卡（iGPU），称为 PRIME。驱动程序会在需要时自动将高强度任务卸载到 dGPU，并在可能时关闭其电源。

在 PRIME 中使用更强大的 GPU 启动应用程序时，使用环境变量 `DRI_PRIME=1`。

如果多个图形驱动冲突，可在 **/usr/local/etc/X11/xorg.conf.d/** 目录中指定图形处理器的驱动。

**Intel® 驱动配置示例：**

**/usr/local/etc/X11/xorg.conf.d/20-intel.conf**

```sh
Section "Device"
	Identifier "Card0"
	Driver     "intel"
EndSection
```

**AMD® 驱动配置示例：**

**/usr/local/etc/X11/xorg.conf.d/20-radeon.conf**

```sh
Section "Device"
	Identifier "Card0"
	Driver     "radeon"
EndSection
```

**NVIDIA® 驱动配置示例：**

**/usr/local/etc/X11/xorg.conf.d/20-nvidia.conf**

```sh
Section "Device"
	Identifier "Card0"
	Driver     "nvidia"
EndSection
```

> **技巧**
>
> [x11/nvidia-xconfig](https://cgit.freebsd.org/ports/tree/x11/nvidia-xconfig/) 也可用于控制 NVIDIA 驱动的基本配置选项。

**SCFB 驱动配置示例：**

**/usr/local/etc/X11/xorg.conf.d/20-scfb.conf**

```sh
Section "Device"
	Identifier "Card0"
	Driver     "scfb"
EndSection
```

**VESA 驱动配置示例：**

**/usr/local/etc/X11/xorg.conf.d/20-vesa.conf**

```sh
Section "Device"
	Identifier "Card0"
	Driver     "vesa"
EndSection
```

配置多显卡时，可添加 `BusID`。执行以下命令显示显卡总线 ID 列表：

```sh
% pciconf -lv | grep -B3 display
```

示例输出：

```sh
vgapci0@pci0:0:2:0:     class=0x030000 rev=0x0c hdr=0x00 vendor=0x8086 device=0x46a6 subvendor=0x1028 subdevice=0x0b29
    vendor     = 'Intel Corporation'
    device     = 'Alder Lake-P GT2 [Iris Xe Graphics]'
    class      = display
--
vgapci0@pci0:1:0:0:     class=0x030200 rev=0xa1 hdr=0x00 vendor=0x10de device=0x25b9 subvendor=0x1028 subdevice=0x0b29
    vendor     = 'NVIDIA Corporation'
    device     = 'GA107GLM [RTX A1000 Laptop GPU]'
    class      = display
```

**示例：同时配置 Intel® 和 NVIDIA® 驱动**

**/usr/local/etc/X11/xorg.conf.d/20-drivers.conf**

```sh
Section "Device"
	Identifier "Card0"
	Driver     "intel"
	BusID     "pci0:0:2:0"
EndSection

Section "Device"
	Identifier "Card1"
	Driver     "nvidia"
	BusID     "pci0:1:0:0"
EndSection
```

## 5.5.3. 配置显示器

几乎所有显示器都支持扩展显示识别数据（`EDID`）标准。X.org 使用 `EDID` 与显示器通信，检测支持的分辨率和刷新率，然后选择最合适的组合。

其他显示器支持的分辨率可以在 X 服务器启动后，通过 [xrandr(1)](https://man.freebsd.org/cgi/man.cgi?query=xrandr\&sektion=1\&format=html) 以原子方式选择，或者在 X.org 配置文件中设置。

### 5.5.3.1. 使用 RandR（调整分辨率与方向）

在 X 会话中运行 [xrandr(1)](https://man.freebsd.org/cgi/man.cgi?query=xrandr\&sektion=1\&format=html) 不带参数，可查看视频输出和检测到的显示模式：

```sh
% xrandr
```

输出示例：

```sh
Screen 0: minimum 320 x 200, current 2560 x 960, maximum 8192 x 8192
LVDS-1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
   1280x800      59.99*+  59.81    59.91    50.00
   1280x720      59.86    59.74
   1024x768      60.00
   1024x576      59.90    59.82
   960x540       59.63    59.82
   800x600       60.32    56.25
   864x486       59.92    59.57
   640x480       59.94
   720x405       59.51    58.99
   640x360       59.84    59.32
VGA-1 connected primary 1280x960+1280+0 (normal left inverted right x axis y axis) 410mm x 257mm
   1280x1024     75.02    60.02
   1440x900      74.98    60.07
   1280x960      60.00*
   1280x800      74.93    59.81
   1152x864      75.00
   1024x768      75.03    70.07    60.00
   832x624       74.55
   800x600       72.19    75.00    60.32    56.25
   640x480       75.00    72.81    66.67    59.94
   720x400       70.08
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
```

此输出显示 `VGA-1` 输出正在以约 60 Hz 的刷新率显示 1280x960 像素的屏幕分辨率。`LVDS-1` 作为辅助显示器，以约 60 Hz 的刷新率显示 1280x800 像素的屏幕分辨率。`HDMI-1`、`HDMI-2`、`DP-1`、`DP-2` 和 `DP-3` 接口未连接显示器。

可用 [xrandr(1)](https://man.freebsd.org/cgi/man.cgi?query=xrandr\&sektion=1\&format=html) 命令切换其他显示模式，例如切换到 1280x720 分辨率，刷新率 60 Hz：

```sh
% xrandr --output LVDS-1 --mode 1280x720 --rate 60
```

> **技巧**
>
> 启动 X 时若出现黑屏，通常可在初始化过程中添加 `xrandr --auto` 来解决。

### 5.5.3.2. 使用 X.org 配置文件

可在配置文件中设置显示器参数。

**示例：将屏幕分辨率设置为 1024x768**

**/usr/local/etc/X11/xorg.conf.d/10-monitor.conf**

```sh
Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	SubSection "Display"
	Modes      "1024x768"
	EndSubSection
EndSection
```

## 5.5.4. 输入设备配置

X.org 服务器提供了 [x11/libinput](https://cgit.freebsd.org/ports/tree/x11/libinput/) 库，这是一项跨平台的工作，旨在通过统一的库支持所有触控、指点和键盘设备。默认情况下，该库会自动加载。

各设备的设置可通过桌面 GUI 调整，或使用 [xinput](https://cgit.freebsd.org/ports/tree/x11/xinput/) 和 [setxkbmap](https://cgit.freebsd.org/ports/tree/x11/setxkbmap/) 手动配置。

另外，x11-drivers 分类中还提供了旧版、轻量的独立输入设备驱动 `x11/xf86-input-[foo]`，但需手动配置 X.org 服务器。两种方式在本小节中均有说明。

### 5.5.4.1. 使用原子输入配置

使用 [libinput(4)](https://man.freebsd.org/cgi/man.cgi?query=libinput\&sektion=4\&format=html) 支持的设备，可通过桌面提供的图形工具，或在运行时使用 [x11/xinput](https://cgit.freebsd.org/ports/tree/x11/xinput/) 和 [x11/setxkbmap](https://cgit.freebsd.org/ports/tree/x11/setxkbmap/) 原子配置。

查看 libinput 当前附加设备：

```sh
$ xinput
```

输出示例：

```sh
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ System mouse                            	id=7	[slave  pointer  (2)]
⎜   ↳ VEN_0488:00 0488:1031 Mouse             	id=11	[slave  pointer  (2)]
⎜   ↳ VEN_0488:00 0488:1031 TouchPad          	id=12	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ System keyboard multiplexer             	id=6	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=9	[slave  keyboard (3)]
    ↳ AT keyboard                             	id=10	[slave  keyboard (3)]
```

所有支持的设置均以属性形式提供，可以原子方式列出和设置。指点设备属性较多，键盘一般无需调整。

自定义键盘布局请参考 [setxkbmap(1)](https://man.freebsd.org/cgi/man.cgi?query=setxkbmap\&sektion=1\&format=html)。

配置完成后，将命令添加至 X 初始化脚本，如 **\~/.Xsession** 或 **\~/.xinitrc**。

### 5.5.4.2. 使用 X.org 配置文件

> **技巧**
>
> 部分桌面环境（如 [KDE Plasma](/di-8-zhang-zhuo-mian-huan-jing/8.2.-zhuo-mian-huan-jing)）提供图形界面设置参数，请先检查是否可用，再考虑手动编辑配置文件。

**示例：手动配置键盘布局**

**/usr/local/etc/X11/xorg.conf.d/00-keyboard.conf**

```sh
Section "InputClass"
        Identifier "Keyboard1"
        MatchIsKeyboard "on"
        Option "XkbLayout" "es, fr"
        Option "XkbModel" "pc104"
        Option "XkbVariant" ",qwerty"
        Option "XkbOptions" "grp:win_space_toggle"
EndSection
```


# 5.6.在 X Window 中使用字体

**摘要**：可以从 [x11-fonts](https://cgit.freebsd.org/ports/tree/x11-fonts/) 分类安装额外字体，或者将其放置在 **\~/.fonts** 中。现代应用程序可以立即使用这些字体。对于旧版应用程序的配置方法也有说明。

X Window 系统提供了 X FreeType 接口库 ([Xft(3)](https://man.freebsd.org/cgi/man.cgi?query=Xft\&sektion=3\&format=html)) 来渲染矢量或轮廓字体，同时也提供传统的 X Logical Font Description 系统，以保持对多代应用程序和字体的兼容性。

用户主要关心两类字体：

* OpenType 或 TrueType® 字体，用于屏幕显示。
* Adobe® PostScript® Type 1 字体，用于打印输出。

以上都是矢量或轮廓字体，同时还有位图字体。

FreeBSD Ports 提供丰富且不断增长的免费高质量字体目录，可从 [x11-fonts](https://cgit.freebsd.org/ports/tree/x11-fonts/) 安装。

从 Ports 安装的系统范围字体包位于 **/usr/local/share/fonts/**。单用户字体可以放在 **\~/.fonts/** 或 **\~/.local/share/fonts/**。

这两个目录及其子目录中的字体在重建字体信息缓存后即可立即使用。可通过以下命令手动触发：

```sh
% fc-cache
```

Ports 树中有大量免费高质量字体可直接用于 X Window 系统。本章简要介绍这两类字体及 X FreeType 接口的配置。

更多关于 FreeBSD 上字体安装和配置的信息，请参阅文章 [字体与 FreeBSD](https://docs.freebsd.org/en/articles/fonts/)。

## 5.6.1. TrueType® 字体

X.org 内置支持渲染 TrueType® 字体。有两个模块可启用此功能。示例中使用 freetype 模块，因为它与其他字体渲染后端更一致。要启用 freetype 模块，只需在 **/usr/local/etc/X11/xorg.conf.d/90-fonts.conf** 的 `"Module"` 部分添加以下行：

```ini
Load  "freetype"
```

然后为 TrueType® 字体创建目录（例如 **/usr/local/share/fonts/TrueType**），并将所有 TrueType® 字体复制到该目录。注意 TrueType® 字体不能直接从 Apple® Mac® 获取，必须是 UNIX®/MS-DOS®/Windows® 格式才能供 X.org 使用。复制完成后，使用 mkfontscale 创建 **fonts.dir**，以便 X 字体渲染器识别新字体。`mkfontscale` 可作为包安装：

```sh
# pkg install mkfontscale
```

然后在目录中创建 X 字体文件索引：

```sh
# cd /usr/local/share/fonts/TrueType
# mkfontscale
```

接着将 TrueType® 目录添加到字体路径中，与 [Type1 字体](#id-5.6.2.-type1-zi-ti) 说明的方法相同：

```sh
% xset fp+ /usr/local/share/fonts/TrueType
% xset fp rehash
```

或者在 **xorg.conf** 中添加 `FontPath` 这行。

现在 Gimp、LibreOffice 及其他 X 应用程序应能识别已安装的 TrueType® 字体。非常小的字体（如高分辨率网页文本）和非常大的字体（如 LibreOffice 文档）显示效果会更好。

## 5.6.2. Type1 字体

URW 字体集合 ([x11-fonts/urwfonts](https://cgit.freebsd.org/ports/tree/x11-fonts/urwfonts/)) 提供标准 Type1 字体（Times Roman™、Helvetica™、Palatino™ 等）的高质量版本。Freefonts 集合 ([x11-fonts/freefonts](https://cgit.freebsd.org/ports/tree/x11-fonts/freefonts/)) 提供更多字体，但大多用于图形软件（如 Gimp），不足以作为屏幕字体使用。

要从二进制包安装上述 Type1 字体集合，运行以下命令：

```sh
# pkg install urwfonts
```

同样适用于 freefont 或其他字体。若手动配置 X 服务器检测这些字体，可在 X 服务器配置文件 (**/usr/local/etc/X11/xorg.conf.d/90-fonts.conf**) 添加：

```ini
Section "Files"
  FontPath "/usr/local/share/fonts/urwfonts/"
EndSection
```

或者在 X 会话命令行运行：

```sh
% xset fp+ /usr/local/share/fonts/urwfonts
% xset fp rehash
```

此方法有效，但 X 会话关闭后会丢失，除非将其添加到启动文件（普通 `startx` 会话的 **\~/.xinitrc** 或图形登录管理器 XDM 的 **\~/.xsession**）。第三种方法是使用新的 **/usr/local/etc/fonts/local.conf**，如 [字体抗锯齿](#id-5.6.3.-zi-ti-kang-ju-chi) 所示。

## 5.6.3. 字体抗锯齿

X.org 中 **/usr/local/share/fonts/** 和 **\~/.fonts/** 的字体会自动对 Xft 兼容应用程序启用抗锯齿处理。大多数现代应用程序都是 Xft 兼容的，包括 KDE、GNOME 和 Firefox。

要控制哪些字体启用抗锯齿处理，或配置抗锯齿属性，可创建或编辑 **/usr/local/etc/fonts/local.conf** 文件。Xft 字体系统的许多高级功能可以在该文件中调整，本节仅说明简单设置。详细信息请参阅 [fonts-conf(5)](https://man.freebsd.org/cgi/man.cgi?query=fonts-conf\&sektion=5\&format=html)。

该文件必须为 XML 格式，注意大小写，并确保所有标签正确闭合。文件以标准 XML 头和 DOCTYPE 定义开始，然后是 `<fontconfig>` 标签：

```xml
<?xml version="1.0"?>
      <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
      <fontconfig>
```

如前所述，**/usr/local/share/fonts/** 及 **\~/.fonts/** 下的所有字体已可供 Xft 兼容应用程序使用。若要添加其他目录，请在 **/usr/local/etc/fonts/local.conf** 添加：

```xml
<dir>/path/to/my/fonts</dir>
```

添加新字体或目录后，重建字体缓存：

```sh
# fc-cache -f
```

抗锯齿处理会使边缘略微模糊，提高小字号文本可读性，并消除大字号文本的“阶梯”效果，但在普通文本上可能引起视觉疲劳。若要排除小于 14 磅的字体，加入以下配置：

```xml
<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 修正：

```xml
<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"`），然后添加：

```xml
<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** 中添加以下内容避免：

```xml
<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** 中添加：

```xml
<match target="font">
	     <test qual="all" name="rgba">
		 <const>unknown</const>
	     </test>
	     <edit name="rgba" mode="assign">
		 <const>rgb</const>
	     </edit>
	 </match>
```

> **注意**
>
> 根据显示器类型，`rgb` 可能需要改为 `bgr`、`vrgb` 或 `vbgr`：可尝试不同设置，选择最合适的。


# 6.1.概述

在使用 bsdinstall 安装 FreeBSD 时，系统不会自动安装图形用户界面。本章将介绍如何选择、安装和配置 Wayland 合成器，以提供图形环境。

在阅读本章之前，你应当：

* 知道如何安装 [额外的第三方软件](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)。
* 知道如何识别和配置 [图形硬件的驱动程序](/di-5-zhang-xwindow-xi-tong/5.2.-xian-ka-qu-dong)。

阅读本章，你将了解：

* 如何配置 FreeBSD 以托管 Wayland 图形环境。
* 如何安装和配置 Wayland 合成器。
* 如何运行为旧版 X Window 系统设计的程序。
* 如何配置远程桌面访问 Wayland 图形环境。


# 6.2.Wayland 概述

Wayland 是一种通信协议，可以替代 Xorg 等显示服务器。它与 Xorg 在多个重要方面有所不同。

首先，Wayland 只是一个协议，它通过某种机制在客户端之间充当中介，从而去除了对 X 服务器的依赖。Xorg 同时包含 X11 协议（用于运行远程显示）和 X 服务器（用于接受连接并显示窗口）。而在 Wayland 下，合成器或窗口管理器提供显示服务器，而不是传统的 X 服务器。

由于 Wayland 不是 X 服务器，传统的 X 屏幕连接需要使用其他方法，如 VNC 或 RDP 管理远程桌面。其次，Wayland 可以作为独立实体管理客户端与合成器之间的复合通信，而无需支持 X 协议。

Wayland 相对较新，并不是所有软件都已更新为原生运行而无需 `Xwayland` 支持。由于 Wayland 不提供 X 服务器，而是期望合成器提供该支持，因此尚未支持 Wayland 的 X11 窗口管理器需要以不带 `-rootless` 参数的方式启动 Xwayland。移除该参数后，即可恢复对 X11 窗口管理器的支持。

> **注意**
>
> 当前的 NVIDIA® 驱动程序应该能与大多数 wlroots 合成器兼容，但可能略显不稳定，且不支持所有功能。目前正在寻求志愿者协助开发 NVIDIA® DRM。

目前，许多软件在 Wayland 上运行时几乎没有问题，包括 Firefox。同时，也有一些桌面环境可供选择，如 Compiz Fusion 替代品 Wayfire 和 i3 窗口管理器替代品 Sway。

> **注意**
>
> 截至 2021 年 5 月，plasma5-kwin 已支持在 FreeBSD 上运行 Wayland。要在 Wayland 下使用 Plasma，请使用 `startplasma-wayland` 参数启动 `ck-launch-session`，并用以下命令关联 dbus：`dbus-launch --exit-with-x11 ck-launch-session startplasma-wayland`。

对于合成器，必须有支持 [evdev(4)](https://man.freebsd.org/cgi/man.cgi?query=evdev\&sektion=4\&format=html) 驱动程序的内核，才能利用按键绑定功能。默认情况下，**GENERIC** 内核已构建此支持；但是，如果内核经过定制并且去除了 [evdev(4)](https://man.freebsd.org/cgi/man.cgi?query=evdev\&sektion=4\&format=html) 支持，则需要加载 [evdev(4)](https://man.freebsd.org/cgi/man.cgi?query=evdev\&sektion=4\&format=html) 模块。此外，Wayland 用户需要成为 `video` 组的成员。要快速更改此设置，请使用 `pw` 命令：

```sh
pw groupmod video -m user
```

安装 Wayland 非常简单；该协议本身不需要太多配置。大多数合成工作将取决于所选的合成器。现在安装 `seatd`，可以跳过合成器安装和配置中的一个步骤，因为 `seatd` 用于提供对某些设备的非 root 访问权限。

所有此处说明的合成器都应该能与 [graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod/) 开源驱动程序兼容；但是，使用专有驱动程序时，NVIDIA® 显卡可能会遇到一些问题。首先安装以下软件包：

```sh
# pkg install wayland seatd
```

安装完协议和支持软件包后，需要安装合成器来创建用户界面。以下部分将介绍几种合成器。所有使用 Wayland 的合成器都需要在环境中定义运行时目录。自 FreeBSD 14.1 以来，这已自动创建和定义。对于较早的版本，可以通过以下命令在 Bourne shell 中创建此目录：

```sh
% export XDG_RUNTIME_DIR=/var/run/user/`id -u`
```

需要注意的是，大多数合成器会在 `XDG_RUNTIME_DIR` 目录中搜索配置文件。在此处的示例中，将使用参数来指定配置文件路径为 **\~/.config**，以保持临时文件和配置文件的分离。建议为每个合成器配置别名，以加载指定的配置文件。

> **警告**
>
> 有报告称，ZFS 用户可能会遇到一些 Wayland 客户端的问题，因为它们需要访问运行时目录中的 `posix_fallocate()`。虽然作者无法在其 ZFS 系统上重现此问题，但推荐的做法是不使用 ZFS 作为运行时目录，而是使用 `tmpfs` 来挂载 **/var/run** 目录。此时，可通过命令 `mount -t tmpfs tmpfs /var/run` 挂载 `tmpfs` 文件系统，再通过 **/etc/fstab** 配置使此更改在重启后生效。可将 `XDG_RUNTIME_DIR` 环境变量配置为使用 **/var/run/user/$UID**，以避免 ZFS 相关问题。查看以下配置示例时请注意此问题。

`seatd` 守护进程有助于管理合成器中对共享系统设备的非 root 用户访问，包括显卡。对于传统的 X11 管理器，如 Plasma 和 GNOME，`seatd` 并不需要；但是，对于此处讨论的 Wayland 合成器，需要在系统上启用并在启动合成器环境之前运行。要现在启用并启动 `seatd` 守护进程，并确保在系统初始化时也启用：

```sh
# sysrc seatd_enable="YES"
# service seatd start
```

接下来，需要为 GUI 环境安装合成器，它类似于 X11 桌面。以下部分将讨论三种合成器，包括基本配置选项、屏幕锁定设置和更多信息的推荐。


# 6.3.Wayfire 混成器

Wayfire 是一款旨在轻量且可定制的合成器。它提供了多种功能，并恢复了之前发布的 Compiz Fusion 桌面的一些元素，在现代硬件上看起来非常美观。要启动 Wayfire，首先需要安装必要的软件包：

```sh
# pkg install wayfire wf-shell alacritty swaylock-effects swayidle wlogout kanshi mako wlsunset
```

`alacritty` 包提供终端仿真器，但并不是完全必需的，因为其他终端仿真器，如 `kitty` 和 XFCE-4 `Terminal`，在 Wayfire 合成器下也已经过测试并确认可以正常运行。Wayfire 配置相对简单，它使用一个文件，用户可以查看该文件并自定义。首先，将示例文件复制到运行时环境配置目录，然后编辑该文件：

```sh
% mkdir ~/.config/wayfire
% cp /usr/local/share/examples/wayfire/wayfire.ini ~/.config/wayfire
```

对于大多数用户来说，默认配置应该已经足够。在配置文件中，像著名的 `cube` 之类的项目已预配置，并且有说明帮助用户理解可用的设置。几个值得注意的基本设置如下：

```ini
[output]
mode = 1920x1080@60000
position = 0,0
transform = normal
scale = 1.000000
```

在这个示例中，配置文件中的输出屏幕应该是列出的模式和赫兹。例如，模式应该设置为 `widthxheight@refresh_rate`。`position` 将输出放置在指定的像素位置，默认设置对于大多数用户应该没问题。`transform` 设置背景变换，`scale` 将输出缩放到指定的缩放因子。这些选项的默认设置通常是可以接受的；更多信息可以参见文档。

如前所述，Wayland 是新的协议，并非所有应用程序都已与此协议兼容。目前，`sddm` 似乎不支持在 Wayland 中启动和管理合成器。在这些示例中，使用了 `swaylock` 工具。配置文件包含选项，用于运行 `swayidle` 和 `swaylock` 来管理空闲和屏幕锁定。

定义系统空闲时应采取的操作的选项如下：

```ini
idle = swaylock
```

锁定超时通过以下几行配置：

```ini
[idle]
toggle = <super> KEY_Z
screensaver_timeout = 300
dpms_timeout = 600
```

第一个选项会在 300 秒后锁定屏幕，之后再过 300 秒，`dpms_timeout` 选项会将屏幕关闭。

最后需要注意的是 `<super>` 键。大多数配置都提到了这个键，它是键盘上的传统 `Windows` 键。大多数键盘上都有这个超级键；如果没有，可以在配置文件中重新映射。例如，要锁定屏幕，按住 super 键和 **shift** 键，再按 **escape** 键。除非映射发生了变化，否则这将启动 `swaylock` 应用程序。`swaylock` 的默认配置将显示灰色屏幕，但该应用程序非常可定制并且文档齐全。此外，由于安装了 `swaylock-effects` 版本，还可以使用例如模糊效果等多种选项，如下所示：

```sh
% swaylock --effect-blur 7x5
```

此外，还有 `--clock` 参数，用于在锁屏上显示带有日期和时间的时钟。当安装了 [x11/swaylock-effects](https://cgit.freebsd.org/ports/tree/x11/swaylock-effects/) 时，默认的 **pam.d** 配置已包括在内。它提供了默认的选项，适合大多数用户使用。更高级的选项也可用；更多信息请参阅 PAM 文档。

此时，是时候测试 Wayfire 并检查它是否能在系统上启动了。只需输入以下命令：

```sh
% wayfire -c ~/.config/wayfire/wayfire.ini
```

合成器现在应该启动，并在屏幕上显示背景图像以及顶部的菜单栏。Wayfire 会尝试列出安装的兼容应用程序并呈现在下拉菜单中。例如，如果安装了 XFCE-4 文件管理器，它将在下拉菜单中显示出来。如果某个特定应用程序兼容且值得分配键盘快捷键，它可以通过 **wayfire.ini** 配置文件映射到键盘快捷键。Wayfire 还提供名为 Wayfire Config Manager 的配置工具，可以通过下拉菜单启动，也可以通过终端输入以下命令启动：

```sh
% wcm
```

通过此应用程序，可以启用、禁用或配置 Wayfire 的各种选项，包括合成特殊效果。此外，为了提供更友好的体验，还可以在配置文件中启用背景管理器、面板和停靠应用程序：

```ini
panel = wf-panel
dock = wf-dock
background = wf-background
```

> **警告**
>
> 使用 `wcm` 修改配置后，会覆盖 **wayfire.ini** 中的自定义内容。建议提前备份 **wayfire.ini** 文件，以便需要时恢复。

最后，**wayfire.ini** 中列出的默认启动器是 [x11/wf-shell](https://cgit.freebsd.org/ports/tree/x11/wf-shell/)，如果用户愿意，也可以用其他面板替换它。


# 6.4.Hikari 混成器

Hikari 合成器采用多个以生产力为核心的概念（如工作表、工作区等），因此与平铺窗口管理器较为相似。具体来说，合成器从一个工作区开始，这类似于虚拟桌面。Hikari 使用单个工作区与用户交互。工作区由多个视图组成，这些视图会以工作表或组的形式分组。工作表和组都由一组视图（即分组在一起的窗口）构成。在切换工作表或组时，当前活动的工作表或组就成为工作区。手册页会详细介绍每个功能，但在本文中，我们只需考虑使用单个工作区的单个工作表。Hikari 的安装由以下软件组成：[x11-wm/hikari](https://cgit.freebsd.org/ports/tree/x11-wm/hikari/) 和终端仿真器 `alacritty`：

```sh
# pkg install hikari alacritty
```

> **注意**
>
> 其他终端，如 `kitty` 或 Plasma `Terminal`，也能在 Wayland 下正常工作。用户可以尝试他们喜欢的终端编辑器来验证兼容性。

Hikari 使用配置文件 **hikari.conf**，该文件可以放置在 `XDG_RUNTIME_DIR` 中，或者通过 `-c` 参数在启动时指定。不需要自动启动配置文件，但可以使迁移到这个合成器的过程更轻松。配置开始时，创建 Hikari 配置目录并复制配置文件以供编辑：

```sh
% mkdir ~/.config/hikari
% cp /usr/local/etc/hikari/hikari.conf ~/.config/hikari
```

配置文件分为不同的部分，例如 ui、outputs、layouts 等。对于大多数用户来说，默认设置已足够；然而，应该做一些重要的更改。例如，`$TERMINAL` 变量通常不会在用户的环境中设置。可以修改该变量或将 **hikari.conf** 文件中的设置更改为：

```ini
terminal = "/usr/local/bin/alacritty"
```

这样，通过绑定的按键按下，就可以启动 `alacritty` 终端。在浏览配置文件时，请注意大写字母用于映射用户的按键。例如，**L** 键用于启动终端，按下 **L**+**Return** 键实际上是之前提到的超级键或 Windows 键。因此，按住 **L/super/Windows** 键并按 **Enter** 将打开指定的终端仿真器，使用默认配置。要将其他键映射到应用程序，需创建操作定义。为此，可以在 actions 部分列出该操作项，例如：

```ini
actions {
  terminal = "/usr/local/bin/alacritty"
  browser = "/usr/local/bin/firefox"
}
```

然后，可以在 bindings 节中定义的 keyboard 节下映射操作：

```ini
bindings {
  keyboard {
SNIP
    "L+Return" = action-terminal
    "L+b" = action-browser
SNIP
```

重启 Hikari 后，按住 Windows 键并按下 **b** 键，浏览器将启动。合成器没有菜单栏，建议在迁移之前至少设置好一个终端仿真器。手册页包含了大量文档，在完整迁移前应阅读。Hikari 的另一个优点是，在迁移到合成器时，Hikari 可以在 Plasma 和 GNOME 桌面环境中启动，能在完全迁移之前测试。

在 Hikari 中锁定屏幕非常简单，因为默认的 **pam.d** 配置文件和解锁工具已与软件包捆绑。锁定屏幕的键绑定是 **L**（Windows 键）+ **Shift** + **Backspace**。需要注意的是，所有未标记为公开的视图将被隐藏。这些视图在锁定时将无法接受输入，但要小心敏感信息暴露。对于某些用户，迁移到其他屏幕锁定工具（例如本节讨论的 swaylock-effects）可能会更容易。要启动 Hikari，可以使用以下命令：

```sh
% hikari -c ~/.config/hikari/hikari.conf
```


# 6.5.Sway 混成器

Sway 合成器是一款平铺合成器，旨在替代 i3 窗口管理器。它应当可以与用户当前的 i3 配置兼容，但某些新功能可能需要额外的设置。

在开始安装 Sway 之前，请确保安装并正确配置了显卡（GPU）。请参考 [图形硬件驱动](/di-5-zhang-xwindow-xi-tong/5.2.-xian-ka-qu-dong) 部分以获取指导。这一步对于 Sway 合成器的正常工作至关重要。

以下示例假定为全新安装，而没有迁移任何 i3 配置。要安装 Sway 和有用的组件，请以 root 用户身份执行以下命令：

```sh
# pkg install sway swayidle swaylock-effects alacritty dmenu-wayland dmenu
```

为获得基本配置文件，执行以下命令并在复制后编辑配置文件：

```sh
% mkdir ~/.config/sway
% cp /usr/local/etc/sway/config ~/.config/sway
```

基本的配置文件包含了许多默认设置，这对大多数用户来说已经足够。以下是需要做的一些重要更改：

```ini
# Logo 键。使用 Mod1 作为 Alt 键。
input * xkb_rules evdev
set $mod Mod4
# 首选终端模拟器
set $term alacritty
set $lock swaylock -f -c 000000
output "My Workstation" mode 1366x768@60Hz position 1366 0
output * bg ~/wallpapers/mywallpaper.png stretch
### 空闲配置
exec swayidle -w \
          timeout 300 'swaylock -f -c 000000' \
          timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \
          before-sleep 'swaylock -f -c 000000'
```

在上面的例子中，加载了 [evdev(4)](https://man.freebsd.org/cgi/man.cgi?query=evdev\&sektion=4\&format=html) 事件的 `xkb` 规则，并将 `$mod` 键设置为 Windows 键用于键绑定。接下来设置终端仿真器为 `alacritty`，并定义了屏幕锁定命令（稍后会详细介绍）。`output` 关键字用于定义显示模式、位置，同时设置背景墙纸并让 Sway 拉伸填充屏幕。最后，`swayidle` 设置为守护进程，在 300 秒后锁定屏幕，600 秒后进入休眠模式。黑色的锁定背景色（000000）也在这里定义。使用 swaylock-effects 时，还可以通过 `--clock` 参数在锁屏上显示时钟。更多选项请参阅手册页。[sway-output(5)](https://man.freebsd.org/cgi/man.cgi?query=sway-output\&sektion=5\&format=html) 也值得参考，它包含了大量自定义输出选项的说明。

在 Sway 中，按住 Windows 键（mod 键）并按下 **d** 键，可以打开应用程序菜单。可使用键盘上的箭头键导航。还有一种方法可以操作条形布局并添加托盘；有关更多信息，请阅读 [sway-bar(5)](https://man.freebsd.org/cgi/man.cgi?query=sway-bar\&sektion=5\&format=html) 手册页。默认配置会将日期和时间添加到右上角。有关示例，请参阅配置文件中的 `Bar` 部分。默认情况下，配置文件没有包含锁定屏幕功能，除了上面示例中启用的锁定定时器。要创建锁定键绑定，需要在 `Key bindings` 部分添加以下行：

```ini
# 手动锁定屏幕
bindsym $mod+Shift+Return exec $lock
```

现在，可以使用 Windows 键 + Shift 键 + 回车键组合来锁定屏幕。无论是通过软件包还是 FreeBSD Ports 安装 Sway，都会安装默认的 **pam.d** 文件。默认配置对大多数用户来说是可以接受的，但也提供了更多高级选项。有关更多信息，请阅读 PAM 文档。

最后，要退出 Sway 并返回到 shell，按住 Windows 键、Shift 键并按 **e** 键。将显示提示，提供退出 Sway 的选项。在迁移过程中，Sway 可以通过终端仿真器在 X11 桌面环境中启动，例如 Plasma。这样可以在完全迁移到该合成器之前，测试不同的更改和键绑定。要启动 Sway，请执行以下命令：

```sh
% sway -c ~/.config/sway/config
```


# 6.6.使用 Xwayland

在安装 Wayland 时，除非 Wayland 是在没有 X11 支持的情况下构建的，否则 `Xwayland` 二进制文件应该已经安装。如果 **/usr/local/bin/Xwayland** 文件不存在，请使用以下命令安装它：

```sh
# pkg install xwayland
```

> **注意**
>
> 推荐使用 Xwayland 的开发版本，并且它很可能与 Wayland 包一起安装。每个合成器都有启用或禁用此功能的方法。

安装 `Xwayland` 后，需要在所选合成器中配置。对于 Wayfire，在 **wayfire.ini** 文件中需要添加以下行：

```ini
xwayland = true
```

对于 Sway 合成器，`Xwayland` 应该默认启用。即使如此，建议手动在 **\~/.config/sway/config** 中添加以下配置行：

```ini
xwayland enable
```

最后，对于 Hikari，不需要做任何更改。默认情况下，`Xwayland` 的支持已内建。如果需要禁用该支持，可以从 Ports 重新构建该包，并在此时禁用 `Xwayland` 支持。

完成这些更改后，启动合成器并通过键绑定执行终端。在此终端中，执行 `env` 命令并搜索 `DISPLAY` 变量。如果合成器能正确启动 `Xwayland` X 服务器，则这些环境变量应该类似于以下内容：

```sh
% env | grep DISPLAY
```

```sh
WAYLAND_DISPLAY=wayland-1
DISPLAY=:0
```

在此输出中，显示了默认的 Wayland 显示器和为 `Xwayland` 服务器设置的显示器。验证 `Xwayland` 是否正常工作的另一种方法是安装并测试小工具：[x11/eyes](https://cgit.freebsd.org/ports/tree/x11/eyes/)，并检查输出。如果 `xeyes` 应用程序启动并且眼睛跟随鼠标指针，则说明 `Xwayland` 正常工作。如果出现如下错误，说明在 `Xwayland` 初始化期间发生了问题，可能需要重新安装：

```sh
Error: Cannot open display wayland-0
```

> **警告**
>
> Wayland 的安全特性是，在没有运行 X 服务器时，不会有其他网络监听程序。启用 `Xwayland` 后，该安全特性不再适用于系统。

对于某些合成器，如 Wayfire，`Xwayland` 可能无法正确启动。因此，`env` 会显示以下 `DISPLAY` 环境变量信息：

```sh
% env | grep DISPLAY
```

```sh
DISPLAY=wayland-1
WAYLAND_DISPLAY=wayland-1
```

尽管已经安装并配置了 `Xwayland`，X11 应用程序仍然无法启动，并会出现显示问题。为了解决这个问题，需要通过以下两种方法验证是否已有通过 UNIX 套接字运行的 `Xwayland` 实例。首先，检查 `sockstat` 的输出并搜索 X11-unix：

```sh
% sockstat | grep x11
```

输出应该类似于以下信息：

```sh
trhodes  Xwayland   2734  8  stream /tmp/.X11-unix/X0
trhodes  Xwayland   2734  9  stream /tmp/.X11-unix/X0
trhodes  Xwayland   2734  10 stream /tmp/.X11-unix/X0
trhodes  Xwayland   2734  27 stream /tmp/.X11-unix/X0_
trhodes  Xwayland   2734  28 stream /tmp/.X11-unix/X0
```

这表明存在 X11 套接字。可以进一步通过在合成器下的终端仿真器中尝试手动执行 `Xwayland` 来验证这一点：

```sh
% Xwayland
```

如果已有 X11 套接字可用，用户会看到以下错误：

```sh
(EE)
Fatal server error:
(EE) Server is already active for display 0
	If this server is no longer running, remove /tmp/.X0-lock
	and start again.
(EE)
```

由于已有活跃的 X 显示器（显示号为 0），因此环境变量设置不正确。要修复此问题，可以将 `DISPLAY` 环境变量更改为 `:0` 并重新尝试执行该应用程序。以下示例使用 [mail/claws-mail](https://cgit.freebsd.org/ports/tree/mail/claws-mail/) 作为需要 `Xwayland` 服务的应用程序：

```sh
export DISPLAY=:0
```

做出此更改后，[mail/claws-mail](https://cgit.freebsd.org/ports/tree/mail/claws-mail/) 应用程序应该能使用 `Xwayland` 启动并按预期工作。


# 6.7.使用 VNC 的远程桌面

之前文中提到，Wayland 不提供与 Xorg 相同的 X 服务器访问方式。但用户可以选择远程桌面协议，如 RDP 或 VNC。FreeBSD Ports 有 `wayvnc`，它支持基于 wlroots 的合成器，如本文中讨论的那些。可以使用以下命令安装该应用：

```sh
# pkg install wayvnc
```

与其他一些软件包不同，`wayvnc` 没有自带配置文件。不过，手册页里列出了关键选项，我们可以把它们整理成简单的配置文件：

```ini
address=0.0.0.0
enable_auth=true
username=username
password=password
private_key_file=/path/to/key.pem
certificate_file=/path/to/cert.pem
```

需要生成密钥文件，并强烈建议使用它们来增强连接的安全性。启动 `wayvnc` 时，它会在 **\~/.config/wayvnc/config** 中查找配置文件。也可以在启动服务器时使用 `-C configuration_file` 选项覆盖该配置文件。因此，要启动 `wayvnc` 服务器，可以执行以下命令：

```sh
% wayvnc -C ~/.config/wayvnc/config
```

> **注意**
>
> 截至本文写作时，没有可在系统初始化时启动 `wayvnc` 的 rc.d 脚本。如需此功能，则需创建本地启动文件。可考虑向 Port 维护者提出此功能请求。


# 6.8.Wayland 登录管理器

虽然有多种登录管理器，并且它们正在慢慢迁移到 Wayland 上，其中一个选择是 [x11/ly](https://cgit.freebsd.org/ports/tree/x11/ly/) 文本用户界面（TUI）管理器。`ly` 的配置最简单，能通过在系统初始化时展示登录窗口来启动 Sway、Wayfire 等。要安装 `ly`，可以执行以下命令：

```sh
# pkg install ly
```

系统会给出一些配置提示。其中关键的一步是将以下内容添加到 **/etc/gettytab** 文件中：

```ini
Ly:\
  :lo=/usr/local/bin/ly:\
  :al=root:
```

然后修改 **/etc/ttys** 文件中的 `ttyv1` 行，修改为以下内容：

```ini
ttyv1 "/usr/libexec/getty Ly" xterm onifexists secure
```

重启系统后，登录界面应该会出现。要配置特定的设置，如语言，可以编辑 **/usr/local/etc/ly/config.ini** 文件。至少，这个文件中应该指定之前在 **/etc/ttys** 文件中设置的 tty。

> **注意**
>
> 如果将 `ttyv0` 设置为登录终端，可能需要按下 **alt** 和 **F1** 键，才能正确看到登录窗口。

当登录窗口出现时，使用左右箭头键可以切换不同的支持的窗口管理器。


# 6.9.实用工具

waybar 是一款对所有 Wayland 合成器都很有用的任务栏。虽然 Wayfire 自带启动菜单，但简洁快速的任务栏仍是很好的补充。waybar 配置简单、运行高效。要安装 waybar 以及配套的音频控制工具，请执行以下命令：

```sh
# pkg install pavucontrol waybar
```

要创建配置目录并复制默认的配置文件，可以执行以下命令：

```sh
% mkdir ~/.config/waybar
% cp /usr/local/etc/xdg/waybar/config ~/.config/waybar
```

`lavalauncher` 工具提供启动条，用于启动各种应用程序。该软件包没有提供示例配置文件，因此需要执行以下操作：

```sh
mkdir ~/.config/lavalauncher
```

以下是示例配置文件，它仅包含 Firefox，并将其放置在右侧：

```ini
global-settings {
	watch-config-file = true;
}

bar {
	output            = eDP-1;
	position          = bottom;
	background-colour = "#202020";

	# 默认配置集的条件。
	condition-resolution = wider-than-high;

	config {
		position = right;
	}

	button {
		image-path          =     /usr/local/lib/firefox/browser/chrome/icons/default/default48.png;
		command[mouse-left] =     /usr/local/bin/firefox;
	}
	button {
	  image-path           =   /usr/local/share/pixmaps/thunderbird.png;
	  command[mouse-left]  =   /usr/local/bin/thunderbird;
}
```


# 7.1.概述

本章深入探讨网络配置与性能，展示了 FreeBSD 操作系统强大的网络功能。无论是使用有线还是无线网络，本章都提供了在 FreeBSD 中配置和优化网络连接的全面指南。

在深入了解细节之前，读者最好对协议、网络接口和寻址等网络概念有基本的了解。

本章内容包括：

* 在 FreeBSD 中配置有线网络的能力，包括网络接口设置、寻址和自定义选项。
* 在 FreeBSD 中配置无线网络的技能，包括无线网络接口设置、安全协议和故障排除技术。
* FreeBSD 的网络功能及其出色网络性能的声誉。
* 了解 FreeBSD 支持的各种网络服务和协议，以及 DNS、DHCP 等的配置说明。

有关如何在[高级网络](/di-35-zhang-gao-ji-wang-luo/35.1.-gai-shu)中配置高级网络的更多信息。


# 7.2.设置网络

设置有线或无线连接是 FreeBSD 用户的常见任务。本节将介绍如何识别有线和无线网络适配器以及如何配置它们。

在开始配置之前，必须了解以下网络数据：

* 网络是否有 DHCP
* 如果网络没有 DHCP，使用的静态 IP
* 子网掩码
* 默认网关的 IP 地址

> **技巧**
>
> 网络连接可能在安装时通过 [bsdinstall(8)](https://man.freebsd.org/cgi/man.cgi?query=bsdinstall\&sektion=8\&format=html) 配置。

## 7.2.1. 识别网络适配器

FreeBSD 支持多种有线和无线网络适配器。请检查所使用的 [FreeBSD 版本的硬件兼容性列表](https://www.freebsd.org/releases/)，以查看网络适配器是否受支持。

要获取系统中使用的网络适配器，可以执行以下命令：

```sh
% pciconf -lv | grep -A1 -B3 network
```

输出应类似于以下内容：

```sh
em0@pci0:0:25:0:        class=0x020000 rev=0x03 hdr=0x00 vendor=0x8086 device=0x10f5 subvendor=0x17aa subdevice=0x20ee
    vendor     = 'Intel Corporation' ①
    device     = '82567LM Gigabit Network Connection' ②
    class      = network
    subclass   = ethernet
--
iwm0@pci0:3:0:0:        class=0x028000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4237 subvendor=0x8086 subdevice=0x1211
    vendor     = 'Intel Corporation' ①
    device     = 'PRO/Wireless 5100 AGN [Shiloh] Network Connection' ②
    class      = network
```

在 `@` 符号之前的文本是控制设备的驱动程序名称。在本例中，分别是 [em(4)](https://man.freebsd.org/cgi/man.cgi?query=em\&sektion=4\&format=html) 和 [iwn(4)](https://man.freebsd.org/cgi/man.cgi?query=iwn\&sektion=4\&format=html)。

* ① 显示供应商的名称
* ② 显示设备的名称

> **注意**
>
> 只有在 FreeBSD 未正确检测到网络适配器时，才需要加载网络适配器模块。
>
> 例如，要加载 [alc(4)](https://man.freebsd.org/cgi/man.cgi?query=alc\&sektion=4\&format=html) 模块，执行以下命令：
>
> ```sh
> # kldload if_alc
> ```
>
> 若要在引导时作为模块加载驱动程序，请在 **/boot/loader.conf** 中加入以下行：
>
> ```sh
> if_alc_load="YES"
> ```


# 7.3.有线网络

加载正确的驱动程序后，即可配置网络适配器。FreeBSD 使用驱动程序名称后跟单元号来命名网络接口适配器。单元号表示适配器在引导时被检测到的顺序，或者稍后发现的顺序。

例如，`em0` 是系统中使用 [em(4)](https://man.freebsd.org/cgi/man.cgi?query=em\&sektion=4\&format=html) 驱动程序的第一个网络接口卡（NIC）。

要显示网络接口配置，输入以下命令：

```sh
% ifconfig
```

输出应类似于以下内容：

```sh
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP>
        ether 00:1f:16:0f:27:5a
        inet6 fe80::21f:16ff:fe0f:275a%em0 prefixlen 64 scopeid 0x1
        inet 192.168.1.19 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
```

在这个例子中，显示了以下设备：

* `em0`：以太网接口。
* `lo0`：环回接口是软件环回机制，可以用于性能分析、软件测试和/或本地通信。更多信息请参考 [lo(4)](https://man.freebsd.org/cgi/man.cgi?query=lo\&sektion=4\&format=html)。

该例子显示 `em0` 已启动并在运行。

关键指标是：

1. `UP` 表示接口已配置并准备就绪。
2. 接口具有 IPv4 互联网（`inet`）地址，`192.168.1.19`。
3. 接口具有 IPv6 互联网（`inet6`）地址，`fe80::21f:16ff:fe0f:275a%em0`。
4. 接口具有有效的子网掩码（`netmask`），`0xffffff00`（即 `255.255.255.0`）。
5. 接口具有有效的广播地址 `192.168.1.255`。
6. 接口的 MAC 地址（`ether`）是 `00:1f:16:0f:27:5a`。
7. 物理媒体选择处于自动选择模式（`media: Ethernet autoselect (1000baseT <full-duplex>)`）。
8. 链路状态（`status`）为 `active`，表示检测到载波信号。对于 `em0`，当以太网电缆未插入接口时，`status: no carrier` 状态是正常的。

如果 [ifconfig(8)](https://man.freebsd.org/cgi/man.cgi?query=ifconfig\&sektion=8\&format=html) 输出类似于以下内容，则表示接口未配置：

```sh
em0: flags=8822<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP>
        ether 00:1f:16:0f:27:5a
        media: Ethernet autoselect
        status: no carrier
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
```

## 7.3.1. 配置静态 IPv4 地址

本节提供了在 FreeBSD 系统上配置静态 IPv4 地址的指南。

可以通过命令行使用 [ifconfig(8)](https://man.freebsd.org/cgi/man.cgi?query=ifconfig\&sektion=8\&format=html) 配置网络接口卡，但除非将配置添加到 **/etc/rc.conf** 中，否则在重启后不会保留。

> **注意**
>
> 如果在安装过程中通过 [bsdinstall(8)](https://man.freebsd.org/cgi/man.cgi?query=bsdinstall\&sektion=8\&format=html) 配置了网络，可能已有某些网卡（NIC）的条目。在执行 [sysrc(8)](https://man.freebsd.org/cgi/man.cgi?query=sysrc\&sektion=8\&format=html) 之前，请仔细检查 **/etc/rc.conf**。

可以执行以下命令设置 IP 地址：

```sh
# ifconfig em0 inet 192.168.1.150/24
```

要使更改在重启后保持，可以执行以下命令：

```sh
# sysrc ifconfig_em0="inet 192.168.1.150 netmask 255.255.255.0"
```

添加默认路由器，执行以下命令：

```sh
# sysrc defaultrouter="192.168.1.1"
```

将 DNS 记录添加到 **/etc/resolv.conf**：

```sh
nameserver 8.8.8.8
nameserver 8.8.4.4
```

然后执行以下命令重启 `netif` 和 `routing`：

```sh
# service netif restart && service routing restart
```

可以使用 [ping(8)](https://man.freebsd.org/cgi/man.cgi?query=ping\&sektion=8\&format=html) 测试连接：

```sh
% ping -c2 www.FreeBSD.org
```

输出应类似于以下内容：

```sh
PING web.geo.FreeBSD.org (147.28.184.45): 56 data bytes
64 bytes from 147.28.184.45: icmp_seq=0 ttl=51 time=55.173 ms
64 bytes from 147.28.184.45: icmp_seq=1 ttl=51 time=53.093 ms

--- web.geo.FreeBSD.org ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 53.093/54.133/55.173/1.040 ms
```

## 7.3.2. 配置动态 IPv4 地址

如果网络中有 DHCP 服务器，配置网络接口使用 DHCP 非常简单。FreeBSD 使用 [dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html) 作为 DHCP 客户端。[dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html) 会自动提供 IP 地址、子网掩码和默认路由。

要使接口使用 DHCP，执行以下命令：

```sh
# sysrc ifconfig_em0="DHCP"
```

可以通过手动运行以下命令使用 [dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html)：

```sh
# dhclient em0
```

输出应类似于以下内容：

```sh
DHCPREQUEST on em0 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
unknown dhcp option value 0x7d
bound to 192.168.1.19 -- renewal in 43200 seconds.
```

这样可以验证使用 DHCP 分配地址是否正常工作。

> **技巧**
>
> [dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html) 客户端可以在后台启动。这可能会对依赖正常网络的应用程序造成问题，但在许多情况下可以提供更快的引导速度。
>
> 要在后台执行 [dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html)，执行以下命令：
>
> ```sh
> # sysrc background_dhclient="YES"
> ```

然后重启 `netif`，执行以下命令：

```sh
# service netif restart
```

可以使用 [ping(8)](https://man.freebsd.org/cgi/man.cgi?query=ping\&sektion=8\&format=html) 测试连接：

```sh
% ping -c2 www.FreeBSD.org
```

输出应类似于以下内容：

```sh
PING web.geo.FreeBSD.org (147.28.184.45): 56 data bytes
64 bytes from 147.28.184.45: icmp_seq=0 ttl=51 time=55.173 ms
64 bytes from 147.28.184.45: icmp_seq=1 ttl=51 time=53.093 ms

--- web.geo.FreeBSD.org ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 53.093/54.133/55.173/1.040 ms
```

## 7.3.3. IPv6

IPv6 是众所周知的 IP 协议（即 IPv4）的新版本。

与 IPv4 相比，IPv6 提供了许多优势和新特性：

* 其 128 位地址空间可提供 340,282,366,920,938,463,463,374,607,431,768,211,456 个地址。这解决了 IPv4 地址短缺和最终耗尽的问题。
* 路由器仅在其路由表中存储网络聚合地址，从而将路由表的平均大小减少到 8192 条目。这解决了与 IPv4 相关的可扩展性问题，IPv4 需要每个分配的地址块在互联网路由器之间交换，导致路由表变得过大，无法有效路由。
* 地址自动配置（[RFC4862](http://www.ietf.org/rfc/rfc4862.txt)）。
* 强制使用多播地址。
* 内建 IPsec（IP 安全）。
* 简化的头部结构。
* 支持移动 IP。
* IPv6 到 IPv4 的过渡机制。

FreeBSD 包含 [KAME 项目](http://www.kame.net/)的 IPv6 参考实现，并附带了使用 IPv6 所需的一切。

本节将重点介绍如何配置和启用 IPv6。

IPv6 地址有三种不同类型：

* **单播（Unicast）**：发送到单播地址的数据包到达属于该地址的接口。
* **任播（Anycast）**：这些地址在语法上与单播地址相同，但它们表示一组接口。发往任播地址的数据包将到达距离最近的接口。
* **多播（Multicast）**：这些地址标识一组接口。发送到多播地址的数据包将到达属于该多播组的所有接口。IPv4 的广播地址（通常是 `xxx.xxx.xxx.255`）在 IPv6 中由多播地址表示。

阅读 IPv6 地址时，规范形式表示为 `x:x:x:x:x:x:x:x`，其中每个 `x` 代表 16 位十六进制值。示例：`FEBC:A574:382B:23C1:AA49:4592:4EFE:9982`。

通常，地址会有很长的零子串。可以使用 `::`（双冒号）来替换地址中的一个子串。另外，每个十六进制值最多可以省略三个前导零。例如，`fe80::1` 等同于规范形式 `fe80:0000:0000:0000:0000:0000:0000:0001`。

第三种形式是使用众所周知的 IPv4 表示法来写最后 32 位。例如，`2002::10.0.0.1` 对应的十六进制规范表示为 `2002:0000:0000:0000:0000:0000:0a00:0001`，这又等同于 `2002::a00:1`。

要查看 FreeBSD 系统的 IPv6 地址，执行以下命令：

```sh
# ifconfig
```

输出应类似于以下内容：

```sh
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP>
        ether 00:1f:16:0f:27:5a
        inet 192.168.1.150 netmask 0xffffff00 broadcast 192.168.1.255
        inet6 fe80::21f:16ff:fe0f:275a%em0 prefixlen 64 scopeid 0x1
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
```

在此示例中，`em0` 接口使用 `fe80::21f:16ff:fe0f:275a%em0`，这是自动配置的链路本地地址，自动从 MAC 地址生成。

某些 IPv6 地址是保留的。可以查看下表了解保留地址的列表：

**表 1. IPv6 保留地址示例**

| IPv6 地址                    | 说明              | 备注                                  |
| -------------------------- | --------------- | ----------------------------------- |
| `::/128`                   | 未指定             | 相当于 IPv4 中的 `0.0.0.0`。              |
| `::1/128`                  | 回环地址            | 相当于 IPv4 中的 `127.0.0.1`。            |
| `::ffff:0.0.0.0/96`        | IPv4 映射 IPv6 地址 | 低 32 位是 IPv4 地址，用于与 IPv4 主机和路由器的兼容。 |
| `fe80::/10`                | 链路本地单播          | 相当于 IPv4 中的 169.254.0.0/16。         |
| `fc00::/7`                 | 唯一本地地址          | 唯一本地地址用于本地通信，只能在一组协作站点内路由。          |
| `ff00::/8`                 | 多播              |                                     |
| `2000::/3`                 | 全局单播            | 所有全局单播地址都从该地址池中分配。前三位是 `001`。       |
| `2001:db8::/32, 3fff::/20` | 文档使用            | 用于文档的 IPv6 地址前缀。                    |

有关 IPv6 地址结构的更多信息，请参阅 [RFC4291](http://www.ietf.org/rfc/rfc4291.txt)。

## 7.3.4. 配置静态 IPv6 地址

要将 FreeBSD 系统配置为 IPv6 客户端并使用静态 IPv6 地址，必须设置 IPv6 地址。

执行以下命令以满足要求：

```sh
# sysrc ifconfig_em0_ipv6="inet6 2001:db8:4672:6565:2026:5043:2d42:5344 prefixlen 64"
```

要指定默认路由器地址，执行以下命令：

```sh
# sysrc ipv6_defaultrouter="2001:db8:4672:6565::1"
```

要配置额外的 IPv6 任播地址，请按照 [rc.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=rc.conf\&sektion=5\&format=html) 中的说明，将任播地址指定为 `_aliasN`，并在后面加上选项 `anycast`：

```sh
# sysrc ifconfig_em0_alias0="inet6 2001:db8:4672:6565::a anycast"
```

请注意，应用程序无法绑定到任播地址；这种情况下需要使用别名地址来代替。

## 7.3.5. 配置动态 IPv6 地址

要使用 [SLAAC](/shu-yu-biao) 动态配置接口的 IPv6 地址，请执行以下命令：

```sh
# sysrc ifconfig_em0_ipv6="inet6 accept_rtadv"
# sysrc rtsold_enable="YES"
```

请注意，当启用 IPv6 数据包转发（即 `ipv6_gateway_enable=YES`）时，除非将 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 变量 `net.inet6.ip6.rfc6204w3` 设置为 `1`，否则系统不会配置 SLAAC 地址。

## 7.3.6. 路由器通告和主机自动配置

本节演示如何在 IPv6 路由器上设置 [rtadvd(8)](https://man.freebsd.org/cgi/man.cgi?query=rtadvd\&sektion=8\&format=html)，以广播 IPv6 网络前缀和默认路由。

要启用 [rtadvd(8)](https://man.freebsd.org/cgi/man.cgi?query=rtadvd\&sektion=8\&format=html)，执行以下命令：

```sh
# sysrc rtadvd_enable="YES"
```

重要的是要指定 IPv6 路由器通告接口。例如，要告诉 [rtadvd(8)](https://man.freebsd.org/cgi/man.cgi?query=rtadvd\&sektion=8\&format=html) 使用 `em0`：

```sh
# sysrc rtadvd_interfaces="em0"
```

接下来，创建配置文件 **/etc/rtadvd.conf**，如以下示例所示：

```sh
em0:\
	:addrs#1:addr="2001:db8:1f11:246::":prefixlen#64:tc=ether:
```

将 `em0` 替换为要使用的接口，并将 `2001:db8:1f11:246::` 替换为分配的前缀。

对于专用的 `/64` 子网，无需更改其他任何内容。否则，请将 `prefixlen#` 更改为正确的值。

## 7.3.7. IPv6 和 IPv4 地址映射

启用 IPv6 的服务器可能需要启用 IPv4 映射的 IPv6 地址通信。此兼容性选项能将 IPv4 地址表示为 IPv6 地址。能让 IPv6 应用程序与 IPv4 通信，反之亦然，这可能会带来安全问题。

在大多数情况下，此选项可能不是必需的，仅用于兼容性。此选项能让仅支持 IPv6 的应用程序在双栈环境中与 IPv4 一起工作。这对那些可能不支持仅 IPv6 环境的第三方应用程序最为有用。

要启用此功能，请执行以下命令：

```sh
# sysrc ipv6_ipv4mapping="YES"
```


# 7.4.无线网络

大多数无线网络基于 [IEEE® 802.11 标准](https://en.wikipedia.org/wiki/IEEE_802.11)。

FreeBSD 支持使用 [802.11a](https://en.wikipedia.org/wiki/IEEE_802.11a-1999)、[802.11b](https://en.wikipedia.org/wiki/IEEE_802.11b-1999)、[802.11g](https://en.wikipedia.org/wiki/IEEE_802.11g-2003) 和 [802.11n](https://en.wikipedia.org/wiki/IEEE_802.11n-2009) 的网络。

> **注意**
>
> FreeBSD 对 [802.11ac](https://en.wikipedia.org/wiki/IEEE_802.11ac-2013) 的支持目前正在开发中。

基本无线网络由多个站点组成，这些站点通过无线电在 2.4GHz 或 5GHz 频段中通信，不过这因地区而异，并且也正在改变以支持在 2.3GHz 和 4.9GHz 范围内的通信。

配置无线网络的基本步骤有三步：

1. 扫描并选择接入点
2. 对站点身份验证
3. 配置 IP 地址或使用 DHCP

接下来的各节讨论每个步骤。

## 7.4.1. 快速连接到无线网络

将 FreeBSD 连接到现有无线网络是个非常常见的操作。

本快速入门流程展示了使用基本认证连接网络所需的步骤。更详细的操作流程将在下一节中说明。

第一步是从网络管理员处获取无线网络的服务集标识符（SSID）和预共享密钥（PSK）。

第二步是在 **/etc/wpa\_supplicant.conf** 中为该网络添加一条条目。

如果该文件不存在，请创建它。有关在此文件中格式化条目的详细信息，请参阅 [wpa\_supplicant.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=wpa_supplicant.conf\&sektion=5\&format=html)。

```sh
ctrl_interface=/var/run/wpa_supplicant
eapol_version=1
ap_scan=1
fast_reauth=1

network={
 ssid="myssid" ①
 psk="mypsk" ②
}
```

* ① 这是无线网络的 SSID。将其替换为无线网络的名称。
* ② 这是无线网络的 PSK。将其替换为无线网络的口令。

第三步是添加网络接口条目，以便在引导时配置网络。使用 `sysctl net.wlan.devices` 获取网络设备接口。在下面的输出中，该 sysctl 输出显示网络设备接口为“iwm0”。

```sh
# sysctl net.wlan.devices
```

输出应类似如下：

```sh
net.wlan.devices: iwm0
```

在接下来的 `sysrc` 行中，如有必要，将“iwm0”替换为 sysctl 命令的输出：

```sh
# sysrc wlans_iwm0="wlan0"
# sysrc ifconfig_wlan0="WPA DHCP"
```

* 最后一步是重启 `netif` 服务，执行以下命令：

```sh
# service netif restart
```

## 7.4.2. 基本无线配置

本节提供更详细的无线网络适配器配置示例。要查看系统中有哪些无线网络适配器，请参阅 [识别网络适配器](/di-7-zhang-wang-luo/7.2.-she-zhi-wang-luo) 章节。

```sh
# ifconfig wlan0 create wlandev iwm0
```

要使该更改在重启后生效，请执行以下命令：

```sh
# sysrc wlans_iwm0="wlan0"
```

> **注意**
>
> 由于各地法规不同，需要正确设置适用于所在位置的区域，以获取正确的可用信道信息。
>
> 可用的区域定义可以在 **/etc/regdomain.xml** 中找到。
>
> 要在运行时设置数据，请使用 `ifconfig`：
>
> ```sh
> # ifconfig wlan0 regdomain etsi2 country AT
> ```
>
> 要使设置持久化，在 **/etc/rc.conf** 中添加如下一行：
>
> ```sh
> # sysrc create_args_wlan0="country AT regdomain etsi2"
> ```

## 7.4.3. 扫描无线网络

可以使用 [ifconfig(8)](https://man.freebsd.org/cgi/man.cgi?query=ifconfig\&sektion=8\&format=html) 扫描可用的无线网络。

要列出无线网络，执行以下命令：

```sh
# ifconfig wlan0 up list scan
```

输出应类似于以下内容：

```sh
SSID/MESH ID                      BSSID              CHAN RATE    S:N     INT CAPS
FreeBSD                          e8:d1:1b:1b:58:ae    1   54M  -47:-96   100 EP   RSN BSSLOAD HTCAP WPS WME
NetBSD                            d4:b9:2f:35:fe:08    1   54M  -80:-96   100 EP   RSN BSSLOAD HTCAP WPS WME
OpenBSD                           fc:40:09:c6:31:bd   36   54M  -94:-96   100 EPS  VHTPWRENV APCHANREP RSN WPS BSSLOAD HTCAP VHTCAP VHTOPMODE WME
GNU-Linux                         dc:f8:b9:a0:a8:e0   44   54M  -95:-96   100 EP   WPA RSN WPS HTCAP VHTCAP VHTOPMODE WME VHTPWRENV
Windows                           44:48:b9:b3:c3:ff   44   54M  -84:-96   100 EP   BSSLOAD VHTPWRENV HTCAP WME RSN VHTCAP VHTOPMODE WPS
MacOS                             46:48:b9:b3:c3:ff   44   54M  -84:-96   100 EP   BSSLOAD VHTPWRENV HTCAP WME RSN VHTCAP VHTOPMODE WPS
```

1. SSID/MESH ID：标识网络的名称。
2. BSSID：标识接入点的 MAC 地址。
3. CAPS 字段标识每个网络的类型及其站点的功能（有关 `list scan` 的更多详细信息，请参见 [ifconfig(8)](https://man.freebsd.org/cgi/man.cgi?query=ifconfig\&sektion=8\&format=html) 的定义）。

## 7.4.4. 连接和认证无线网络

从扫描到的无线网络列表中选择网络之后，就需要执行连接和认证。在绝大多数无线网络中，认证通过路由器中配置的口令完成。其他方案则要求在数据流量开始之前完成加密握手，可能使用预共享密钥或密钥，或者使用涉及后台服务（如 RADIUS）的更复杂的方案。

### 7.4.4.1. 使用 WPA2/WPA/Personal 认证

无线网络中的认证过程由 [wpa\_supplicant(8)](https://man.freebsd.org/cgi/man.cgi?query=wpa_supplicant\&sektion=8\&format=html) 管理。

[wpa\_supplicant(8)](https://man.freebsd.org/cgi/man.cgi?query=wpa_supplicant\&sektion=8\&format=html) 的配置将保存在 **/etc/wpa\_supplicant.conf** 文件中。更多信息请参见 [wpa\_supplicant.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=wpa_supplicant.conf\&sektion=5\&format=html)。

完成无线网络扫描后，选择网络并获取口令（PSK），该信息将添加到 **/etc/wpa\_supplicant.conf** 文件中，如下所示：

```sh
network={
        scan_ssid=1 ①
        ssid="FreeBSD" ②
        psk="12345678" ③
}
```

* ① SSID 扫描技术。仅当网络为隐藏时需要使用此选项。
* ② 网络名称。
* ③ 无线网络的口令。

下一步是在 **/etc/rc.conf** 文件中配置无线连接。

如果使用静态地址，需要执行以下命令：

```sh
# sysrc ifconfig_wlan0="inet 192.168.1.20 netmask 255.255.255.0"
```

如果使用动态地址，需要执行以下命令：

```sh
# sysrc ifconfig_wlan0="WPA DHCP"
```

然后执行以下命令重启网络：

```sh
# service netif restart
```

> **注意**
>
> 有关如何执行更高级认证方法的信息，请参见 [无线高级认证](/di-35-zhang-gao-ji-wang-luo/35.4.-wu-xian-gao-ji-shen-fen-yan-zheng)。

### 7.4.4.2. 连接没有认证的开放网络

> **技巧**
>
> 连接没有任何认证的开放网络时，用户需要 **非常** 小心。

完成无线网络扫描并选择无线网络的 SSID 后，执行以下命令：

```sh
# ifconfig wlan0 ssid SSID
```

然后执行 [dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html) 获取配置的地址：

```sh
# dhclient wlan0
```

## 7.4.5. 同时使用有线和无线连接

有线连接提供更好的性能和可靠性，而无线连接提供灵活性和移动性。笔记本用户通常希望在这两种连接之间无缝切换。

在 FreeBSD 上，可以将两个或更多网络接口结合起来，以“故障转移”方式使用。这种配置使用一组网络接口中最优先和可用的连接，当链路状态发生变化时，操作系统会自动切换。

链路聚合和故障转移的详细内容请参见 [链路聚合和故障转移](/di-35-zhang-gao-ji-wang-luo/35.9.-lian-lu-ju-he-yu-gu-zhang-zhuan-yi)，并且可以在 [以太网和无线接口之间的故障转移模式](/di-35-zhang-gao-ji-wang-luo/35.9.-lian-lu-ju-he-yu-gu-zhang-zhuan-yi) 中找到使用有线和无线连接的示例。


# 7.5.主机名

主机名表示网络中主机的完全限定域名（FQDN）。

> **技巧**
>
> 如果主机未设置主机名，FreeBSD 会将自己称为“Amnesiac”。

## 7.5.1. 检查当前主机名

可以使用 [hostname(1)](https://man.freebsd.org/cgi/man.cgi?query=hostname\&sektion=1\&format=html) 来检查当前主机名：

```sh
$ hostname
```

输出应类似于以下内容：

```sh
freebsdhostname.example.com
```

## 7.5.2. 更改主机名

要更改主机名并使其在重启后保持，执行以下命令：

```sh
# sysrc hostname="freebsdhostname.example.com"
```


# 7.6.DNS

DNS 可以理解为一本[电话簿](https://en.wikipedia.org/wiki/Telephone_directory)，其中将 IP 地址与主机名相互关联。

有三个文件负责管理 FreeBSD 系统如何与 DNS 交互。这三个文件是 [hosts(5)](https://man.freebsd.org/cgi/man.cgi?query=hosts\&sektion=5\&format=html)、[resolv.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=resolv.conf\&sektion=5\&format=html) 和 [nsswitch.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=nsswitch.conf\&sektion=5\&format=html)。

除非在 **/etc/nsswitch.conf** 文件中另有说明，FreeBSD 将首先查看 **/etc/hosts** 文件中的地址，然后查看 **/etc/resolv.conf** 文件中的 DNS 信息。

> **注意**
>
> [nsswitch.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=nsswitch.conf\&sektion=5\&format=html) 文件指定了 nsdispatch（名称服务切换调度器）的运行方式。
>
> 在默认情况下，**/etc/nsswitch.conf** 文件中的 hosts 部分如下所示：
>
> ```sh
> hosts: files dns
> ```
>
> 例如，在使用 [nscd(8)](https://man.freebsd.org/cgi/man.cgi?query=nscd\&sektion=8\&format=html) 服务时，将该行更改为如下所示，即可更改优先级顺序：
>
> ```sh
> hosts: files cache dns
> ```

## 7.6.1. 本地地址

**/etc/hosts** 文件是简单的文本数据库，用于提供主机名到 IP 地址的映射。通过局域网连接的本地计算机，可以将其条目添加到此文件中，以简化命名，而无需设置 DNS 服务器。此外，**/etc/hosts** 还可以用于提供互联网名称的本地记录，从而减少查询外部 DNS 服务器的需求，特别是对于常访问的名称。

例如，如果在本地环境中有 [www/gitlab-ce](https://cgit.freebsd.org/ports/tree/www/gitlab-ce/) 的本地实例，可以将其添加到 **/etc/hosts** 文件中，如下所示：

```sh
192.168.1.150 git.example.com git
```

## 7.6.2. 配置域名服务器

FreeBSD 系统如何访问互联网域名系统（DNS）由 [resolv.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=resolv.conf\&sektion=5\&format=html) 控制。

**/etc/resolv.conf** 中最常见的条目有：

| 条目           | 说明                                      |
| ------------ | --------------------------------------- |
| `nameserver` | 解析器应该查询的名称服务器的 IP 地址。服务器按顺序查询，最多可以列出三个。 |
| `search`     | 主机名查找的搜索列表。通常由本地主机名的域决定。                |
| `domain`     | 本地域名。                                   |

典型的 **/etc/resolv.conf** 文件如下所示：

```sh
search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30
```

> **注意**
>
> 选项 `search` 和 `domain` 只能使用其中一个。

使用 DHCP 时，[dhclient(8)](https://man.freebsd.org/cgi/man.cgi?query=dhclient\&sektion=8\&format=html) 通常会根据从 DHCP 服务器接收到的信息重写 **/etc/resolv.conf**。

> **技巧**
>
> 如果当前正在配置的这台机器 **不是** DNS 服务器，可以使用 [local-unbound(8)](https://man.freebsd.org/cgi/man.cgi?query=local-unbound\&sektion=8\&format=html) 来提升 DNS 查询性能。
>
> 要在系统引导时启用它，请执行以下命令：
>
> ```sh
> # sysrc local_unbound_enable="YES"
> ```
>
> 要启动 [local-unbound(8)](https://man.freebsd.org/cgi/man.cgi?query=local-unbound\&sektion=8\&format=html) 服务，请执行以下命令：
>
> ```sh
> # service local_unbound start
> ```


# 7.7.故障排除

在排查硬件和软件配置问题时，应首先检查最简单的事情：

* 网线是否插好？
* 网络服务是否配置正确？
* 防火墙是否配置正确？
* FreeBSD 是否支持该网卡？
* 路由器是否正常工作？

> **技巧**
>
> 在提交 bug 报告之前，请务必查看 [FreeBSD 发布页面](https://www.freebsd.org/releases/) 中的硬件说明，更新至最新的 STABLE 版本，查阅邮件列表归档，并搜索互联网。

## 7.7.1. 有线网络中的故障排除

如果网卡能工作，但性能较差，请阅读 [tuning(7)](https://man.freebsd.org/cgi/man.cgi?query=tuning\&sektion=7\&format=html)。同时检查网络配置，因为错误的网络设置可能导致连接缓慢。

出现 `No route to host` 消息时，说明系统无法将数据包路由到目标主机。这可能是因为没有指定默认路由，或者网线未插好。检查 `netstat -rn` 的输出，确保有一条有效的到主机的路由。如果没有，请参阅 [网关与路由](/di-35-zhang-gao-ji-wang-luo/35.2.-wang-guan-he-lu-you)。

`ping: sendto: Permission denied` 错误通常是防火墙配置错误所致。如果 FreeBSD 上启用了防火墙但未定义任何规则，则默认策略是拒绝所有流量，即使是 [ping(8)](https://man.freebsd.org/cgi/man.cgi?query=ping\&sektion=8\&format=html)。更多信息请参见 [防火墙](/di-34-zhang-fang-huo-qiang/34.1.-gai-shu)。

## 7.7.2. 无线网络中的故障排除

本节介绍一些排查常见无线网络问题的步骤：

* 如果在扫描时未列出接入点，请检查配置是否将无线设备限制在有限的信道范围内。
* 如果设备无法与接入点建立关联，请确认配置与接入点的设置一致，包括认证方式与安全协议。尽量简化配置。如果使用 WPA2 或 WPA 等安全协议，可以将接入点配置为开放认证且无安全保护，以测试是否能传输数据。
* 系统能与接入点建立关联后，使用 [ping(8)](https://man.freebsd.org/cgi/man.cgi?query=ping\&sektion=8\&format=html) 等工具诊断网络配置。
* 有许多底层调试工具可用。可以使用 [wlandebug(8)](https://man.freebsd.org/cgi/man.cgi?query=wlandebug\&sektion=8\&format=html) 在 802.11 协议支持层启用调试信息。


# 第二部分：常见任务

现在基础知识已讲解完毕。本书的这一部分讨论了 FreeBSD 的一些常用功能。这些章节包括：

* 介绍受欢迎和有用的桌面应用程序：浏览器、办公工具、文档查看器等。
* 介绍 FreeBSD 可用的多媒体工具。
* 解释构建自定义 FreeBSD 内核的过程，以实现额外的功能。
* 详细说明桌面和网络连接打印机设置中的打印系统。
* 展示如何在 FreeBSD 系统上运行 Linux 应用程序。

某些章节建议先阅读其他章节，这在每个章节的简介中都有注明。


# 8.1.概述

虽然 FreeBSD 因其性能和稳定性而在服务器领域广受欢迎，但它同样非常适合作为日常使用的桌面系统。FreeBSD 的 Ports 中包含 36000 余款应用程序，因此构建能运行多种桌面应用的定制化桌面环境变得十分简单。本章演示如何安装常见的桌面环境，以及网页浏览器、办公软件、文档查看器和财务软件等桌面应用。

前提条件：

* 本章的读者应已了解如何在 FreeBSD 上安装 [X Window 系统](/di-5-zhang-xwindow-xi-tong/5.1.-gai-shu) 或 [Wayland](/di-6-zhang-freebsd-zhong-de-wayland/6.1.-wayland-jian-jie)。
* 本章中将指导读者安装官方预编译软件包。如需了解如何通过 Ports 构建自定义软件包，请参考 [使用 Ports](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.5.-shi-yong-ports) 一节。


# 8.2.桌面环境

本节介绍如何在 FreeBSD 系统中安装和配置一些常见的桌面环境。桌面环境可以从简单的窗口管理器扩展为一整套桌面应用程序。

**表 1. 支持的桌面环境**

| 名称         | 许可证              | 软件包名         |
| ---------- | ---------------- | ------------ |
| KDE Plasma | GPL 2.0 或更高版本    | x11/kde      |
| GNOME      | GPL 2.0 或更高版本    | x11/gnome    |
| XFCE       | GPL、LGPL、BSD     | x11-wm/xfce4 |
| MATE       | GPL 2.0、LGPL 2.0 | x11/mate     |
| Cinnamon   | GPL 2.0 或更高版本    | x11/cinnamon |
| LXQT       | GPL、LGPL         | x11-wm/lxqt  |

## 8.2.1. Plasma

Plasma 是一款由 KDE 社区开发的易于使用的桌面环境。它提供了一套具有一致外观和操作体验的应用程序，统一的菜单与工具栏、快捷键、配色方案、本地化支持，以及集中式、对话框驱动的桌面配置工具。更多 Plasma 的信息请参考 [Plasma 主页](https://kde.org/plasma-desktop)，FreeBSD 相关信息请参考 [FreeBSD KDE 页面](https://freebsd.kde.org/)。

### 8.2.1.1. 安装 Plasma 元软件包

要安装 KDE Plasma 元软件包，执行：

```sh
# pkg install kde
```

额外的 KDE 应用程序标有 `kde-applications` 类别。可执行以下命令搜索它们：

```sh
% pkg search -S origin kde-applications
```

### 8.2.1.2. 最小化安装 Plasma

要安装最小化的 Plasma 桌面，执行：

```sh
# pkg install plasma6-plasma
```

> **技巧**
>
> 此安装 **非常** 精简。Konsole 终端模拟器需要单独安装，执行：
>
> ```sh
> # pkg install konsole
> ```

### 8.2.1.3. 配置 Plasma

Plasma 使用 [dbus-daemon(1)](https://man.freebsd.org/cgi/man.cgi?query=dbus-daemon\&sektion=1\&format=html) 作为消息总线和硬件抽象。此应用程序会自动作为 Plasma 的依赖项安装。

在 [rc.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=rc.conf\&sektion=5\&format=html) 中启用 D-Bus 服务，以便在系统引导时启动：

```sh
# sysrc dbus_enable="YES"
```

### 8.2.1.4. 启动 Plasma

启动 Plasma 的首选方式是通过 [x11/sddm](https://cgit.freebsd.org/ports/tree/x11/sddm/) 显示管理器自动启动。要安装 [x11/sddm](https://cgit.freebsd.org/ports/tree/x11/sddm/)，执行：

```sh
# pkg install sddm
```

在 [rc.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=rc.conf\&sektion=5\&format=html) 中启用 SDDM 服务以便开机自动启动：

```sh
# sysrc sddm_enable="YES"
```

可通过以下命令设置 SDDM 的键盘语言（例如设置为西班牙语）：

```sh
# sysrc sddm_lang="es_ES"
```

另一种在 Xorg 会话中启动 Plasma 的方法是手动调用 [startx(1)](https://man.freebsd.org/cgi/man.cgi?query=startx\&sektion=1\&format=html)。为此，需要在 **\~/.xinitrc** 文件中加入以下内容：

```sh
% echo "exec dbus-launch --exit-with-x11 ck-launch-session startplasma-x11" > ~/.xinitrc
```

实验性地，可执行以下命令在 Wayland 会话中手动启动 Plasma：

```sh
% exec dbus-launch ck-launch-session startplasma-wayland
```

## 8.2.2. GNOME

GNOME 是一款用户友好的桌面环境。它包括用于启动应用和显示状态的面板、桌面、一组工具和应用程序，以及一套使应用程序易于协作并保持一致的设计规范。

### 8.2.2.1. 安装 GNOME 元软件包

要安装 GNOME 元软件包（包含 GNOME 桌面及应用程序），执行：

```sh
# pkg install gnome
```

### 8.2.2.2. 最小化安装 GNOME

要安装精简版的 GNOME-lite 元软件包（仅包含基础功能），执行：

```sh
# pkg install gnome-lite
```

### 8.2.2.3. 配置 GNOME

GNOME 需要挂载 **/proc** 文件系统。在 **/etc/fstab** 中添加以下行以便系统引导时自动挂载：

```sh
# Device                Mountpoint      FStype  Options         Dump    Pass#
proc                    /proc           procfs  rw              0       0
```

GNOME 使用 [dbus-daemon(1)](https://man.freebsd.org/cgi/man.cgi?query=dbus-daemon\&sektion=1\&format=html) 作为消息总线和硬件抽象服务。该应用程序会作为 GNOME 的依赖自动安装。

在 **/etc/rc.conf** 中启用 D-BUS 服务以便开机自动启动：

```sh
# sysrc dbus_enable="YES"
```

### 8.2.2.4. 启动 GNOME

GNOME 显示管理器是 GNOME 的首选显示管理器。GDM 作为 GNOME 包的一部分安装。

在 **/etc/rc.conf** 中启用 GDM，以便在系统引导时启动：

```sh
# sysrc gdm_enable="YES"
```

第二种启动 GNOME 的方法是手动调用 [startx(1)](https://man.freebsd.org/cgi/man.cgi?query=startx\&sektion=1\&format=html)。要使其工作，需要在 **\~/.xinitrc** 中添加以下行：

```sh
% echo "exec gnome-session" > ~/.xinitrc
```

## 8.2.3. XFCE

XFCE 是一款基于 GTK+ 的桌面环境，轻量级，提供了简单、高效、易于使用的桌面。它是完全可配置的，拥有包含菜单、小程序和应用程序启动器的主面板，提供文件管理器和声音管理器，并支持主题。由于它快速、轻巧、高效，非常适合旧的或较慢的、内存受限的机器。

### 8.2.3.1. 安装 XFCE

要安装 XFCE 元软件包，执行：

```sh
# pkg install xfce
```

### 8.2.3.2. 配置 XFCE

XFCE 使用 [dbus-daemon(1)](https://man.freebsd.org/cgi/man.cgi?query=dbus-daemon\&sektion=1\&format=html) 作为消息总线和硬件抽象。此应用程序作为 XFCE 的依赖项自动安装。

在 **/etc/rc.conf** 中启用 D-BUS，以便在系统引导时启动：

```sh
# sysrc dbus_enable="YES"
```

### 8.2.3.3. 启动 XFCE

[x11/lightdm](https://cgit.freebsd.org/ports/tree/x11/lightdm/) 是支持多种显示技术的显示管理器，是个很好的选择，因为它非常轻量，内存占用少，性能快速。

要安装它，请执行：

```sh
# pkg install lightdm lightdm-gtk-greeter
```

在 **/etc/rc.conf** 中启用 lightdm，以便在系统引导时启动：

```sh
# sysrc lightdm_enable="YES"
```

第二种启动 XFCE 的方法是手动调用 [startx(1)](https://man.freebsd.org/cgi/man.cgi?query=startx\&sektion=1\&format=html)。要使其工作，需要在 **\~/.xinitrc** 中添加以下行：

```sh
% echo '. /usr/local/etc/xdg/xfce4/xinitrc' > ~/.xinitrc
```

## 8.2.4. MATE

MATE 桌面环境是 GNOME 2 的延续。它使用传统的隐喻，提供直观且美观的桌面环境。

### 8.2.4.1. 安装 MATE 元软件包

要安装包含 MATE 桌面及一些额外应用（如文本编辑器、归档管理器等）的 MATE 元软件包，请执行：

```sh
# pkg install mate
```

### 8.2.4.2. 最小化安装 MATE

要安装仅包含基本组件的精简版 MATE 桌面的 MATE lite 元软件包，请执行：

```sh
# pkg install mate-base
```

### 8.2.4.3. 配置 MATE

MATE 需要挂载 **/proc**。请将以下行添加到 **/etc/fstab**，以便在系统引导时自动挂载此文件系统：

```sh
# Device                Mountpoint      FStype  Options         Dump    Pass#
proc                    /proc           procfs  rw              0       0
```

MATE 使用 [dbus-daemon(1)](https://man.freebsd.org/cgi/man.cgi?query=dbus-daemon\&sektion=1\&format=html) 作为消息总线和硬件抽象。该程序作为 MATE 的依赖项自动安装。在 **/etc/rc.conf** 中启用 D-BUS，以便在系统引导时启动：

```sh
# sysrc dbus_enable="YES"
```

### 8.2.4.4. 启动 MATE

[x11/lightdm](https://cgit.freebsd.org/ports/tree/x11/lightdm/) 是支持多种显示技术的显示管理器，是个很好的选择，因为它非常轻量，内存占用少，性能快速。

要安装它，请执行：

```sh
# pkg install lightdm lightdm-gtk-greeter
```

在 **/etc/rc.conf** 中启用 lightdm，以便在系统引导时启动：

```sh
# sysrc lightdm_enable="YES"
```

第二种启动 MATE 的方法是手动调用 [startx(1)](https://man.freebsd.org/cgi/man.cgi?query=startx\&sektion=1\&format=html)。要使其工作，需要在 **\~/.xinitrc** 中添加以下行：

```sh
% echo "exec dbus-launch --exit-with-x11 ck-launch-session mate-session" > ~/.xinitrc
```

## 8.2.5. Cinnamon

Cinnamon 是 UNIX® 桌面环境，提供先进的创新特性以及传统的用户体验。其桌面布局类似于 GNOME 2，底层技术是从 GNOME Shell 分支出来的。Cinnamon 注重让用户感到熟悉，提供易于使用且舒适的桌面体验。

### 8.2.5.1. 安装 Cinnamon

要安装 Cinnamon 包，请执行：

```sh
# pkg install cinnamon
```

### 8.2.5.2. 配置 Cinnamon

Cinnamon 需要挂载 **/proc**。请将以下行添加到 **/etc/fstab**，以便在系统引导时自动挂载此文件系统：

```sh
# Device                Mountpoint      FStype  Options         Dump    Pass#
proc                    /proc           procfs  rw              0       0
```

Cinnamon 使用 [dbus-daemon(1)](https://man.freebsd.org/cgi/man.cgi?query=dbus-daemon\&sektion=1\&format=html) 作为消息总线和硬件抽象。该程序作为 Cinnamon 的依赖项自动安装。在 **/etc/rc.conf** 中启用 D-BUS，以便在系统引导时启动：

```sh
# sysrc dbus_enable="YES"
```

### 8.2.5.3. 启动 Cinnamon

[x11/lightdm](https://cgit.freebsd.org/ports/tree/x11/lightdm/) 是支持多种显示技术的显示管理器，是个很好的选择，因为它非常轻量，内存占用少，性能快速。

要安装它，请执行：

```sh
# pkg install lightdm lightdm-gtk-greeter
```

在 **/etc/rc.conf** 中启用 lightdm，以便在系统引导时启动：

```sh
# sysrc lightdm_enable="YES"
```

第二种启动 Cinnamon 的方法是手动调用 [startx(1)](https://man.freebsd.org/cgi/man.cgi?query=startx\&sektion=1\&format=html)。要使其工作，需要在 **\~/.xinitrc** 中添加以下行：

```sh
% echo "exec dbus-launch --exit-with-x11 ck-launch-session cinnamon-session" > ~/.xinitrc
```

## 8.2.6. LXQT

LXQt 是一款基于 Qt 技术的高级、易用且快速的桌面环境。它专为那些注重简洁、速度和直观界面的用户而设计。与大多数桌面环境不同，LXQt 在性能较弱的计算机上同样运行良好。

### 8.2.6.1. 安装 LXQT

要安装 LXQT 元软件包，请执行：

```sh
# pkg install lxqt
```

### 8.2.6.2. 配置 LXQT

LXQt 需要挂载 **/proc**。请将以下行添加到 **/etc/fstab**，以便在系统引导时自动挂载此文件系统：

```sh
# Device                Mountpoint      FStype  Options         Dump    Pass#
proc                    /proc           procfs  rw              0       0
```

LXQt 使用 [dbus-daemon(1)](https://man.freebsd.org/cgi/man.cgi?query=dbus-daemon\&sektion=1\&format=html) 作为消息总线和硬件抽象。该程序作为 LXQt 的依赖项自动安装。在 **/etc/rc.conf** 中启用 D-BUS，以便在系统引导时启动：

```sh
# sysrc dbus_enable="YES"
```

### 8.2.6.3. 启动 LXQT

推荐的 LXQt 显示管理器是 [x11/sddm](https://cgit.freebsd.org/ports/tree/x11/sddm/)。要安装 [x11/sddm](https://cgit.freebsd.org/ports/tree/x11/sddm/)，请执行：

```sh
# pkg install sddm
```

在 **/etc/rc.conf** 中启用 SDDM 服务，以便在系统引导时启动：

```sh
# sysrc sddm_enable="YES"
```

可通过以下命令设置 SDDM 的键盘语言（例如设为西班牙语）：

```sh
# sysrc sddm_lang="es_ES"
```

第二种启动 LXQt 的方法是手动调用 [startx(1)](https://man.freebsd.org/cgi/man.cgi?query=startx\&sektion=1\&format=html)。要使其工作，需要在 **\~/.xinitrc** 中添加以下行：

```sh
% echo "exec dbus-launch --exit-with-x11 ck-launch-session startlxqt" > ~/.xinitrc
```


# 8.3.浏览器

本节介绍了如何在 FreeBSD 系统上安装和配置一些流行的 web 浏览器，从高资源消耗的全功能浏览器到减少资源使用的命令行浏览器。

**表 2. 支持的浏览器**

| 名称                   | 许可证           | 包                                                                               | 所需资源 |
| -------------------- | ------------- | ------------------------------------------------------------------------------- | ---- |
| Firefox              | MPL 2.0       | [www/firefox](https://cgit.freebsd.org/ports/tree/www/firefox/)                 | 高    |
| Chromium             | BSD-3 和其他     | [www/chromium](https://cgit.freebsd.org/ports/tree/www/chromium/)               | 高    |
| Iridium 浏览器          | BSD-3 和其他     | [www/iridium-browser](https://cgit.freebsd.org/ports/tree/www/iridium-browser/) | 高    |
| Falkon               | MPL 2.0       | [www/falkon-qtonly](https://cgit.freebsd.org/ports/tree/www/falkon-qtonly/)     | 高    |
| Konqueror            | GPL 2.0 或更高版本 | [x11-fm/konqueror](https://cgit.freebsd.org/ports/tree/x11-fm/konqueror/)       | 中    |
| Gnome Web (Epiphany) | GPL 3.0 或更高版本 | [www/epiphany](https://cgit.freebsd.org/ports/tree/www/epiphany/)               | 中    |
| qutebrowser          | GPL 3.0 或更高版本 | [www/qutebrowser](https://cgit.freebsd.org/ports/tree/www/qutebrowser/)         | 中    |
| Dillo                | GPL 3.0 或更高版本 | [www/dillo2](https://cgit.freebsd.org/ports/tree/www/dillo2/)                   | 低    |
| Links                | GPL 2.0 或更高版本 | [www/links](https://cgit.freebsd.org/ports/tree/www/links/)                     | 低    |
| w3m                  | MIT           | [www/w3m](https://cgit.freebsd.org/ports/tree/www/w3m/)                         | 低    |

## 8.3.1. Firefox

Firefox 是一款开源浏览器，具有符合标准的 HTML 渲染引擎、标签页浏览、弹出阻止、扩展功能、增强的安全性等特点。Firefox 基于 Mozilla 代码库。

要安装最新版 Firefox，执行：

```sh
# pkg install firefox
```

若要安装 Firefox 扩展支持版本 (ESR)，执行：

```sh
# pkg install firefox-esr
```

## 8.3.2. Chromium

Chromium 是开源浏览器项目，旨在提供更安全、更快速、更稳定的 web 浏览体验。Chromium 具有标签页浏览、弹出阻止、扩展支持等功能。Chromium 是 Google Chrome 浏览器的开源基础。

要安装 Chromium，执行：

```sh
# pkg install chromium
```

> **注意**
>
> Chromium 的可执行文件是 **/usr/local/bin/chrome**，而非 **/usr/local/bin/chromium**。
>
> Chromium 中可用的搜索引擎受区域限制。请参阅[使用本地化](/di-26-zhang-ben-di-hua-i18nl10n-de-shi-yong-he-she-zhi/26.2.-shi-yong-ben-di-hua)一节来配置合适的区域设置。

## 8.3.3. Iridium 浏览器

Iridium 是基于 Chromium 代码库的免费、开源、自由的浏览器修改版，在多个关键领域增强了隐私保护。禁止部分查询、关键词和指标向中央服务的自动传输，仅在用户同意时才发送。

安装 Iridium，执行：

```sh
# pkg install iridium-browser
```

## 8.3.4. Falkon

Falkon 是一款较新的、非常快速的 QtWebEngine 浏览器。它旨在成为轻量级的 web 浏览器，适用于所有主流平台。Falkon 拥有用户期待的标准浏览器功能，包括书签、历史记录（也可以在侧边栏显示）和标签。除此之外，AdBlock 插件可以阻止广告，Click2Flash 可以阻止 Flash 内容，SSL Manager 可以编辑本地 CA 证书数据库。

安装 Falkon，执行：

```sh
# pkg install falkon
```

## 8.3.5. Konqueror

Konqueror 不仅是一款 web 浏览器，还是一款文件管理器和多媒体查看器。它支持 WebKit 渲染引擎，这也是许多现代浏览器（如 Chromium）使用的渲染引擎，并且支持其自己的 KHTML 引擎。

安装 Konqueror，执行：

```sh
# pkg install konqueror
```

## 8.3.6. Gnome Web (Epiphany)

Gnome Web (Epiphany) 是一款旨在尽可能轻量和快速的 web 浏览器，代价是舍弃了许多其他浏览器中的功能。

安装 Gnome Web (Epiphany)，执行：

```sh
# pkg install epiphany
```

## 8.3.7. qutebrowser

qutebrowser 是一款以键盘为中心的浏览器，具有最小化的图形界面。它基于 Python 和 PyQt5，并且是自由软件，采用 GPL 许可证。

安装 qutebrowser，执行：

```sh
# pkg install qutebrowser
```

## 8.3.8. Dillo

Dillo 旨在成为多平台的替代浏览器，具有小巧、稳定、开发友好、可用、快速和可扩展的特点。这个新的实验版本的 Dillo 基于 FLTK 工具包，而不是 GTK1，并且大幅重写。

安装 Dillo，执行：

```sh
# pkg install dillo
```

## 8.3.9. Links

Links 是类似于 Lynx 的 web 浏览器，支持文本和图形模式，具有许多功能，如显示表格、菜单等。

安装 Links，执行：

```sh
# pkg install links
```

## 8.3.10. w3m

w3m 是一款分页器/文本型 web 浏览器。它与 Lynx 类似，但具有 Lynx 所不具备的一些功能，如渲染表格和渲染框架。

安装 w3m，执行：

```sh
# pkg install w3m
```


# 8.4.开发工具

本节介绍了如何在 FreeBSD 系统上安装和配置一些流行的开发工具。

**表 3. 支持的开发工具**

| 名称                 | 许可证                       | 包含的包                                                                    | 所需资源 |
| ------------------ | ------------------------- | ----------------------------------------------------------------------- | ---- |
| Visual Studio Code | MIT                       | [editors/vscode](https://cgit.freebsd.org/ports/tree/editors/vscode/)   | 重    |
| Qt Creator         | QtGPL                     | [devel/qtcreator](https://cgit.freebsd.org/ports/tree/devel/qtcreator/) | 重    |
| Kdevelop           | GPL 2.0 或更高及 LGPL 2.0 或更高 | [devel/kdevelop](https://cgit.freebsd.org/ports/tree/devel/kdevelop/)   | 重    |
| Eclipse IDE        | EPL                       | [java/eclipse](https://cgit.freebsd.org/ports/tree/java/eclipse/)       | 重    |
| Vim                | VIM                       | [editors/vim](https://cgit.freebsd.org/ports/tree/editors/vim/)         | 轻量   |
| Neovim             | Apache 2.0                | [editors/neovim](https://cgit.freebsd.org/ports/tree/editors/neovim/)   | 轻量   |
| GNU Emacs          | GPL 3.0 或更高               | [editors/emacs](https://cgit.freebsd.org/ports/tree/editors/emacs/)     | 轻量   |

## 8.4.1. Visual Studio Code

Visual Studio Code 是工具，它将代码编辑器的简便性与开发人员在核心编辑、构建和调试周期中所需的功能相结合。它提供了全面的编辑和调试支持、可扩展性模型以及与现有工具的轻量集成。

要安装 Visual Studio Code，执行：

```sh
# pkg install vscode
```

## 8.4.2. Qt Creator

Qt Creator 是跨平台的集成开发环境（IDE），专为 Qt 开发人员的需求量身定制。Qt Creator 包含的功能有：

* 支持 C++、QML 和 ECMAscript 的代码编辑器；
* 快速的代码导航工具；
* 输入时的静态代码检查和样式提示；
* 上下文敏感帮助；
* 可视化调试器；
* 集成的 GUI 布局和表单设计器。

安装 Qt Creator，执行：

```sh
# pkg install qtcreator
```

## 8.4.3. Kdevelop

Kdevelop 是开源的功能丰富、可扩展插件的 IDE，支持 C/C++ 和其他编程语言。它基于 KDevPlatform 和 KDE 与 Qt 库，自 1998 年以来一直在开发。

安装 Kdevelop，执行：

```sh
# pkg install kdevelop
```

## 8.4.4. Eclipse IDE

Eclipse 平台是开放的、可扩展的 IDE，适用于各种用途。Eclipse 平台提供了构建和运行集成软件开发工具的基础模块和平台。Eclipse 平台能让工具开发者独立开发与他人工具集成的工具。

安装 Eclipse IDE，执行：

```sh
# pkg install eclipse
```

## 8.4.5. Vim

Vim 是高度可配置的文本编辑器，旨在实现高效的文本编辑。它是 vi 编辑器的改进版本，分发在大多数 UNIX 系统中。

Vim 常称为“程序员的编辑器”，它在编程中非常有用，以至于许多人认为它是完整的 IDE。然而，它不仅仅适用于程序员，Vim 也非常适合各种文本编辑，从编写电子邮件到编辑配置文件。

安装 Vim，执行：

```sh
# pkg install vim
```

## 8.4.6. Neovim

Neovim 是对 [editors/vim](https://cgit.freebsd.org/ports/tree/editors/vim/) 的彻底重构，具有合理的默认设置、内置终端仿真器、异步插件架构和强大的 API，旨在提升速度和可扩展性。兼容绝大多数 Vim 插件和脚本。

安装 Neovim，执行：

```sh
# pkg install neovim
```

## 8.4.7. GNU Emacs

GNU Emacs 是一款可扩展、可定制的自由文本编辑器。其核心是 Emacs Lisp 解释器，这是 Lisp 编程语言的一种方言，带有支持文本编辑的扩展。

安装 GNU Emacs，执行：

```sh
# pkg install emacs
```


# 8.5.桌面办公生产力应用

在提高生产力方面，用户通常会寻找一款办公套件或易于使用的文字处理软件。虽然一些桌面环境，如 [KDE Plasma](/di-8-zhang-zhuo-mian-huan-jing/8.2.-zhuo-mian-huan-jing)，提供了办公套件，但并没有默认的生产力软件包。无论安装了哪种桌面环境，FreeBSD 都有多个办公套件和图形化文字处理软件可供选择。

本节介绍了如何安装以下流行的生产力软件，并指出这些应用是否资源占用较高、从 Port 编译时是否需要较长时间，或是否有任何重大依赖。

**表 4. 支持的桌面办公生产力套件**

| 名称             | 许可证         | 包含的包                                                                            | 所需资源 |
| -------------- | ----------- | ------------------------------------------------------------------------------- | ---- |
| LibreOffice    | MPL 2.0     | [editors/libreoffice](https://cgit.freebsd.org/ports/tree/editors/libreoffice/) | 重    |
| Calligra Suite | LGPL 和 GPL  | [editors/calligra](https://cgit.freebsd.org/ports/tree/editors/calligra/)       | 中    |
| AbiWord        | GPL 2.0 或更高 | [editors/abiword](https://cgit.freebsd.org/ports/tree/editors/abiword/)         | 中    |

## 8.5.1. LibreOffice

LibreOffice 是由 [The Document Foundation](http://www.documentfoundation.org/) 开发的免费软件办公套件。它与其他主要的办公套件兼容，并可在多种平台上使用。LibreOffice 是 Apache OpenOffice 的重命名分支，包含完整办公生产力套件中的应用程序：文字处理器、电子表格、演示管理器、绘图程序、数据库管理程序以及用于创建和编辑数学公式的工具。它提供多种语言版本，并且国际化已扩展到界面、拼写检查器和字典等方面。有关 LibreOffice 的更多信息，请访问 [libreoffice.org](http://www.libreoffice.org/)。

要安装 LibreOffice，执行：

```sh
# pkg install libreoffice
```

LibreOffice 包默认只包含英文版本。如果需要本地化版本的 LibreOffice，必须安装语言包。例如，安装西班牙语本地化版本，需要使用以下命令安装 Port [editors/libreoffice-es](https://cgit.freebsd.org/ports/tree/editors/libreoffice-es/)：

```sh
# pkg install es-libreoffice
```

## 8.5.2. Calligra

KDE Plasma 桌面环境包含可以与 KDE Plasma 单独安装的办公套件。Calligra 包含其他办公套件中的标准组件。Words 是文字处理器，Sheets 是电子表格程序，Stage 用于管理幻灯片演示，Karbon 用于绘制图形文档。

安装 Calligra，执行：

```sh
# pkg install calligra
```

## 8.5.3. AbiWord

AbiWord 是一款免费的文字处理程序，外观和操作方式类似于 Microsoft® Word。它运行速度快，功能丰富，并且用户友好。

AbiWord 可以导入或导出多种文件格式，包括一些专有格式，如 Microsoft® **.rtf**。

安装 AbiWord，执行：

```sh
# pkg install abiword
```


# 8.6.文档查看器

自 UNIX® 出现以来，一些新的文档格式逐渐流行，而这些格式所需的查看器在基本系统中可能并不存在。本节介绍了如何安装以下文档查看器：

**表 5. 支持的文档查看器**

| 名称       | 许可证     | 包含的包                                                                        | 所需资源 |
| -------- | ------- | --------------------------------------------------------------------------- | ---- |
| Okular   | GPL 2.0 | [graphics/okular](https://cgit.freebsd.org/ports/tree/graphics/okular/)     | 重    |
| Evince   | GPL 2.0 | [graphics/evince](https://cgit.freebsd.org/ports/tree/graphics/evince/)     | 中    |
| ePDFView | GPL 2.0 | [graphics/epdfview](https://cgit.freebsd.org/ports/tree/graphics/epdfview/) | 中    |
| Xpdf     | GPL 2.0 | [graphics/xpdf](https://cgit.freebsd.org/ports/tree/graphics/xpdf/)         | 轻    |
| Zathura  | Zlib    | [graphics/zathura](https://cgit.freebsd.org/ports/tree/graphics/zathura/)   | 轻    |

## 8.6.1. Okular

Okular 是一款通用文档查看器，属于 KDE Plasma 项目的一部分。

Okular 结合了出色的功能，支持多种文档格式，如 PDF、Postscript、DjVu、CHM、XPS、ePub 等。

要安装 Okular，执行：

```sh
# pkg install okular
```

## 8.6.2. Evince

Evince 是一款支持多种文档格式（包括 PDF 和 Postscript）的文档查看器，属于 GNOME 项目的一部分。Evince 的目标是用单一应用程序替代像 ggv 和 gpdf 这样的文档查看器。

安装 Evince，执行：

```sh
# pkg install evince
```

## 8.6.3. ePDFView

ePDFView 是一款轻量级的 PDF 文档查看器，仅使用 Gtk+ 和 Poppler 库。ePDFView 的目标是提供一个简单的 PDF 文档查看器，类似于 Evince，但不使用 GNOME 库。

安装 ePDFView，执行：

```sh
# pkg install epdfview
```

## 8.6.4. Xpdf

对于喜欢小巧 FreeBSD PDF 查看器的用户，Xpdf 提供了一款轻量高效的查看器，所需资源较少。它使用标准的 X 字体，不需要额外的工具包。

安装 Xpdf，执行：

```sh
# pkg install xpdf
```

## 8.6.5. Zathura

Zathura 是一款高度可定制且功能强大的文档查看器。它提供简约、节省空间的界面，主要专注于键盘交互，使用起来非常便捷。

安装支持 PDF 的 Zathura，执行：

```sh
# pkg install zathura zathura-pdf-mupdf
```

此外，还可以安装 [graphics/zathura-pdf-poppler](https://cgit.freebsd.org/ports/tree/graphics/zathura-pdf-poppler/) 提供替代的 PDF 支持，安装 [graphics/zathura-ps](https://cgit.freebsd.org/ports/tree/graphics/zathura-ps/) 提供 PostScript 支持，安装 [graphics/zathura-djvu](https://cgit.freebsd.org/ports/tree/graphics/zathura-djvu/) 提供 DjVu 支持，以及安装 [graphics/zathura-cb](https://cgit.freebsd.org/ports/tree/graphics/zathura-cb/) 提供漫画书支持。


# 8.7.财务

在 FreeBSD 桌面上，用户可以安装一些强大且易于使用的个人财务管理应用程序。有些程序兼容广泛使用的文件格式，例如 Quicken 和 Excel 使用的格式。

本节介绍了以下程序：

**表 6. 支持的财务管理程序**

| 名称       | 许可证               | 包含的包                                                                      | 所需资源 |
| -------- | ----------------- | ------------------------------------------------------------------------- | ---- |
| KMyMoney | GPL 2.0           | [finance/kmymoney](https://cgit.freebsd.org/ports/tree/finance/kmymoney/) | 重    |
| GnuCash  | GPL 2.0 和 GPL 3.0 | [finance/gnucash](https://cgit.freebsd.org/ports/tree/finance/gnucash/)   | 重    |

## 8.7.1. KMyMoney

KMyMoney 是一款由 KDE 社区创建的个人财务应用程序。KMyMoney 旨在提供商业个人财务管理应用程序中的重要功能。它还注重易用性和正确的复式记账。KMyMoney 支持从标准的 Quicken QIF 文件导入，跟踪投资，处理多种货币，并提供丰富的报告。

安装 KMyMoney，执行：

```sh
# pkg install kmymoney
```

## 8.7.2. GnuCash

GnuCash 是 GNOME 项目的一部分，旨在为最终用户提供用户友好且功能强大的应用程序。GnuCash 可用于跟踪收入和支出、银行账户和股票。它具有直观的界面，同时保持专业性。

GnuCash 提供智能注册、账户的层次结构系统，以及许多键盘加速器和自动完成方法。它可以将单个交易拆分为多个更详细的部分。GnuCash 可以导入和合并 Quicken QIF 文件，并且支持大多数国际日期和货币格式。

安装 GnuCash，执行：

```sh
# pkg install gnucash
```


# 9.1.概述

多媒体章节概述了 FreeBSD 上的多媒体支持。多媒体应用程序和技术已成为现代计算不可或缺的一部分，而 FreeBSD 为各种多媒体硬件和软件提供了强大而可靠的支持。本章节涉及了音频、视频和图像处理等多种多媒体组件。它还讨论了各种媒体格式和编解码器，以及用于多媒体创作和播放的工具和应用程序。此外，本章节还介绍了多媒体系统的配置、故障排除和优化。无论你是多媒体爱好者还是专业内容创作者，FreeBSD 都为多媒体工作提供强大的平台。本章旨在帮助你充分利用 FreeBSD 的多媒体功能，提供有用的信息和实用示例，助你快速入门。


# 9.2.设置声卡

默认情况下，FreeBSD 会自动检测系统使用的声卡。FreeBSD 支持多种声卡，支持的声卡列表可以在 [sound(4)](https://man.freebsd.org/cgi/man.cgi?query=sound\&sektion=4\&format=html) 中查阅。

> **注意**
>
> 仅当 FreeBSD 未能正确检测到声卡时，才需要加载声卡模块。

如果不知道系统使用的是哪个声卡，或者使用哪个模块，可执行以下命令加载 `snd_driver` 元驱动：

```sh
# kldload snd_driver
```

或者，为了在引导时将驱动作为模块加载，可以在 **/boot/loader.conf** 中添加以下行：

```sh
snd_driver_load="YES"
```

## 9.2.1. 测试声音

为了确认声卡是否已检测到，可以执行以下命令：

```sh
% dmesg | grep pcm
```

输出应类似于以下内容：

```sh
pcm0: <Conexant CX20561 (Hermosa) (Analog 2.0+HP/2.0)> at nid 26,22 and 24 on hdaa0
pcm1: <Conexant CX20561 (Hermosa) (Internal Analog Mic)> at nid 29 on hdaa0
```

还可以使用以下命令检查声卡的状态：

```sh
# cat /dev/sndstat
```

输出应类似于以下内容：

```sh
Installed devices:
pcm0: <Conexant CX20561 (Hermosa) (Analog 2.0+HP/2.0)> (play/rec) default
pcm1: <Conexant CX20561 (Hermosa) (Internal Analog Mic)> (rec)
```

如果没有列出 `pcm` 设备，请仔细检查是否加载了正确的设备驱动。如果一切顺利，声卡应该可以在 FreeBSD 上正常工作。

可以使用 [beep(1)](https://man.freebsd.org/cgi/man.cgi?query=beep\&sektion=1\&format=html) 发出一些声音，以确认声卡是否正常工作：

```sh
% beep
```

## 9.2.2. 混音器

FreeBSD 提供了不同的工具来设置和显示声卡混音器值，这些程序基于 FreeBSD 声音系统：

**表 1. 支持的混音器软件包**

| 名称                                                                                  | 许可证     | 包                                                                                       | 工具包 |
| ----------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------- | --- |
| [mixer(8)](https://man.freebsd.org/cgi/man.cgi?query=mixer\&sektion=8\&format=html) | BSD-2   | 系统自带                                                                                    | CLI |
| dsbmixer                                                                            | BSD-2   | [audio/dsbmixer](https://cgit.freebsd.org/ports/tree/audio/dsbmixer/)                   | Qt  |
| KDE Plasma 音频小工具                                                                    | GPL 2.0 | [audio/plasma6-plasma-pa](https://cgit.freebsd.org/ports/tree/audio/plasma6-plasma-pa/) | Qt  |
| mixertui                                                                            | BSD-2   | [audio/mixertui](https://cgit.freebsd.org/ports/tree/audio/mixertui/)                   | TUI |

## 9.2.3. 显卡声音

显卡通常带有自己的集成声音设备，可能不清楚哪个设备作为默认设备。运行 `dmesg` 并查看 `pcm` 条目即可确认系统如何枚举输出。执行以下命令：

```sh
% dmesg | grep pcm
```

输出可能类似于以下内容：

```sh
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®）之前，声卡作为 `pcm4` 显示。可执行以下命令将系统配置为使用声卡作为默认设备：

```sh
# sysctl hw.snd.default_unit=4
```

为了使此更改永久生效，可以将以下行添加到 **/etc/sysctl.conf** 文件中：

```sh
hw.snd.default_unit=4
```

## 9.2.4. 自动切换到耳机

某些系统可能会在音频输出之间切换时遇到困难，但幸运的是，FreeBSD 允许在 **device.hints** 中配置自动切换。

执行以下命令识别系统如何枚举音频输出：

```sh
% dmesg | grep pcm
```

输出可能类似于以下内容：

```sh
pcm0: <Realtek ALC892 Analog> at nid 23 and 26 on hdaa0
pcm1: <Realtek ALC892 Right Analog Headphones> at nid 22 on hdaa0
```

将以下行添加到 **/boot/device.hints**：

```sh
hint.hdac.0.cad0.nid22.config="as=1 seq=15 device=Headphones"
hint.hdac.0.cad0.nid26.config="as=2 seq=0 device=speakers"
```

> **注意**
>
> 这些值仅适用于上例中的系统配置。不同系统的实际值可能有所不同。

## 9.2.5. 重采样质量

更改音频流采样率的过程称为重采样。

这通常在以下情况下自动发生：使用 DI（数字接口）录制音频，或仅播放分辨率非常低的音频文件时。

示例：DI 使用 192000 kHz，但应用程序只接受 48000 kHz（或反之）。

如果可能，应在声音设备驱动程序之外调整，但对于无法做到的情况（或硬件重采样能力较差），你可以控制用于重采样的质量。

如果你不确定是否需要此功能，对于普通音乐收听、开会等场景，默认值完全足够，而且大多数应用程序都使用 48000 kHz，因此重采样很少发生。

在制作音乐、录制声音等对质量有要求的场景中，或者你是音频发烧友，可以提高重采样质量。

要获得最高可能的重采样质量，请执行以下命令：

```sh
# sysctl hw.snd.feeder_rate_quality=4
# sysctl hw.snd.feeder_rate_round=0
```

> **注意**
>
> 第一条命令：100dB 阻带，164 抽头和 97% 带宽
>
> 第二条命令：大质数分频，精度更高

要在重启后保留这些值，可以将它们添加到 **/etc/sysctl.conf** 中。

请记住，调整重采样质量会影响 CPU 使用率和延迟。

有关重采样的更多详细信息，请参阅 [sound(4)](https://man.freebsd.org/cgi/man.cgi?query=sound\&sektion=4\&format=html)

## 9.2.6. 故障排除

一些常见的错误信息及其解决方案：

**表 2. 常见错误信息**

| 错误信息                        | 解决方案                                                                    |
| --------------------------- | ----------------------------------------------------------------------- |
| `xxx: can't open /dev/dsp!` | 执行 `fstat \| grep dsp` 检查是否有其他应用程序正在占用该设备。常见的干扰程序包括 esound 和 KDE 的声音支持。 |

使用 [audio/pulseaudio](https://cgit.freebsd.org/ports/tree/audio/pulseaudio/) 的程序可能需要重新启动 [audio/pulseaudio](https://cgit.freebsd.org/ports/tree/audio/pulseaudio/) 守护进程，以使 `hw.snd.default_unit` 的更改生效。或者，也可以即时更改 [audio/pulseaudio](https://cgit.freebsd.org/ports/tree/audio/pulseaudio/) 的设置。使用 [pacmd(1)](https://man.freebsd.org/cgi/man.cgi?query=pacmd\&sektion=1\&format=html) 可以连接到 [audio/pulseaudio](https://cgit.freebsd.org/ports/tree/audio/pulseaudio/) 守护进程的命令行界面：

```sh
# pacmd
Welcome to PulseAudio 14.2! Use "help" for usage information.
>>>
```

以下命令将默认音频接收器更改为前面示例中的第 4 号卡：

```sh
set-default-sink 4
```

> **警告**
>
> 不要使用 `exit` 命令退出命令行界面。那样会终止 [audio/pulseaudio](https://cgit.freebsd.org/ports/tree/audio/pulseaudio/) 守护进程。请改用 **Ctrl**+**D**。


# 9.3.音频播放器

本节介绍了 FreeBSD Ports 中的一些可用于音频播放的软件。

**表 3. 音频播放器包**

| 名称                      | 许可证      | 包名                                                                                | 工具包  |
| ----------------------- | -------- | --------------------------------------------------------------------------------- | ---- |
| Elisa                   | LGPL 3.0 | [audio/elisa](https://cgit.freebsd.org/ports/tree/audio/elisa/)                   | Qt   |
| GNOME Music             | GPL 2.0  | [audio/gnome-music](https://cgit.freebsd.org/ports/tree/audio/gnome-music/)       | GTK+ |
| Audacious               | BSD-2    | [multimedia/audacious](https://cgit.freebsd.org/ports/tree/multimedia/audacious/) | Qt   |
| cmus — C\* Music Player | GPL 2.0  | [audio/cmus](https://cgit.freebsd.org/ports/tree/audio/cmus/)                     | TUI  |

## 9.3.1. Elisa

Elisa 是由 KDE 社区开发的音乐播放器，旨在提供简单且易于使用的体验。

要安装 Elisa，请执行：

```sh
# pkg install elisa
```

## 9.3.2. GNOME Music

GNOME Music 是 GNOME 新的音乐播放应用。它旨在将优雅的浏览体验与简单直观的控制结合在一起。

要安装 GNOME Music，请执行：

```sh
# pkg install gnome-music
```

## 9.3.3. Audacious

Audacious 是一款开源音频播放器。它是 XMMS 的后继者，在高效利用系统资源的同时提供音乐播放功能。

要安装 Audacious，请执行：

```sh
# pkg install audacious-qt6 audacious-plugins-qt6
```

> **注意**
>
> Audacious 原生支持 OSS，但必须在设置中的音频选项卡配置。

## 9.3.4. cmus — C\* Music Player

cmus 是一款适用于类 Unix 操作系统的小巧、快速且功能强大的控制台音乐播放器。

除了各种输入和输出插件外，它还支持 CUE 表单、使用 Unicode、支持 scrobbling（如 last.fm 或 libre.fm）、可对选定文件运行外部程序（如标签编辑器）、可通过 UNIX 套接字控制等。

要安装 cmus，请执行：

```sh
# pkg install cmus
```


# 9.4.视频播放器

本节介绍了 FreeBSD Ports 中的一些可用于视频播放的软件。

**表 4. 视频播放器包**

| 名称          | 许可证     | 包                                                                               | 工具包 |
| ----------- | ------- | ------------------------------------------------------------------------------- | --- |
| mpv         | GPL 2.0 | [multimedia/mpv](https://cgit.freebsd.org/ports/tree/multimedia/mpv/)           | CLI |
| SMPlayer    | GPL 2.0 | [multimedia/smplayer](https://cgit.freebsd.org/ports/tree/multimedia/smplayer/) | Qt  |
| VLC 媒体播放器   | GPL 2.0 | [multimedia/vlc](https://cgit.freebsd.org/ports/tree/multimedia/vlc/)           | Qt  |
| Kodi (XBMC) | GPL 2.0 | [multimedia/kodi](https://cgit.freebsd.org/ports/tree/multimedia/kodi/)         | X11 |

## 9.4.1. mpv

mpv 是一款自由的命令行媒体播放器。它支持多种媒体文件格式、音频和视频编解码器以及字幕类型。mpv 可以利用所有平台上大多数硬件解码 API。

mpv 也面向视频爱好者，它具有多种高质量的放大/缩小算法，像所有设置一样，可通过配置文件控制。配置文件可通过命令行开关选择，也可基于文件夹名称等条件选择。

它还支持高质量的 HDR 到 SDR 转换，并提供精细控制，使每个人都能在任何显示器上欣赏 HDR 内容。

要安装 mpv，请执行：

```sh
# pkg install mpv
```

以下是简短的 **\~/.config/mpv/mpv.conf** 示例：

```sh
vo=gpu-next
gpu-context=wayland
hwdec=auto
screenshot-jpeg-quality=100
scale=ewa_lanczos4sharpest
dscale=ewa_lanczos4sharpest

[TTRPG]
profile-cond=path:find('ttrpg')
profile=fast
save-position-on-quit=yes

[hdr]
scale=bilinear
dscale=bilinear
dither=no
correct-downscaling=no
linear-downscaling=no
sigmoid-upscaling=no
hdr-compute-peak=yes
hdr-peak-percentile=99.995
hdr-contrast-recovery=0.30
```

* 使用新的 gpu-next 视频输出。许多功能需要此项和/或在启用时提供更高质量
* Wayland 用户在看到图形故障时应手动设置此项
* 自动检测 GPU 硬件解码是否可用并使用
* 最佳缩放算法。如果硬件不够快且视频开始丢帧则禁用
* 录制的 TTRPG 长会话视频的示例配置文件
* 仅在路径包含 ttrpg 时应用
* 使用内置的 fast 配置文件以获得最低 CPU/GPU 占用
* 适用于 iGPU 较慢但仍想欣赏 HDR 内容的用户的示例配置文件

以下是 iGPU 用户使用此示例配置观看 HDR 内容的示例：

```sh
$ mpv --profile=hdr hdr_video.mkv
```

有关 mpv 使用方法的更多示例，请参阅 mpv 参考手册。

## 9.4.2. SMPlayer

SMPlayer 旨在成为 MPlayer 的完整前端，从基本功能（如播放视频、DVD 和 VCD）到更高级的功能（如支持 MPlayer 滤镜等）。

要安装 SMPlayer，请执行：

```sh
# pkg install smplayer
```

## 9.4.3. VLC 媒体播放器

VLC 媒体播放器是一款高度可移植的多媒体播放器，支持多种音频和视频格式（如 MPEG-1、MPEG-2、MPEG-4、DivX、mp3、ogg 等），以及 DVD、VCD 和多种流媒体协议。它还可以用作服务器，通过高带宽网络在 IPv4 或 IPv6 上以单播或多播方式传输流媒体。VLC 还具备实时转码功能，可用于流媒体传输或保存到磁盘。

要安装 VLC，请执行：

```sh
# pkg install vlc
```

## 9.4.4. Kodi (XBMC)

Kodi（前身为 XBMC）是免费的开源跨平台媒体播放器和娱乐中心。它能让用户播放和查看来自本地和网络存储媒体以及互联网的多数视频、音乐、播客和其他数字媒体文件。

要安装 Kodi，请执行：

```sh
# pkg install kodi
```


# 9.5.视频会议

FreeBSD 桌面环境可以用于参加视频会议。本节将介绍如何配置摄像头以及 FreeBSD 支持哪些视频会议应用程序。

## 9.5.1. 配置摄像头

为了让 FreeBSD 访问摄像头并完成配置，需要安装一些实用工具：

* [multimedia/webcamd](https://cgit.freebsd.org/ports/tree/multimedia/webcamd/) 是守护进程，支持使用数百种不同的 USB 摄像头和 DVB USB 设备。
* [multimedia/pwcview](https://cgit.freebsd.org/ports/tree/multimedia/pwcview/) 是应用程序，可用于查看摄像头的视频流。

要安装所需的实用工具，请执行：

```sh
# pkg install webcamd pwcview
```

在 **/etc/rc.conf** 中启用 [webcamd(8)](https://man.freebsd.org/cgi/man.cgi?query=webcamd\&sektion=8\&format=html) 服务，以便在系统启动时自动启动它：

```sh
# sysrc webcamd_enable=YES
```

用户必须属于 `webcamd` 组。要将用户添加到 `webcamd` 组，请执行以下命令：

```sh
# pw groupmod webcamd -m username
```

由于 [multimedia/webcamd](https://cgit.freebsd.org/ports/tree/multimedia/webcamd/) 需要 [cuse(3)](https://man.freebsd.org/cgi/man.cgi?query=cuse\&sektion=3\&format=html) 模块，因此必须加载该模块，执行以下命令：

```sh
# kldload cuse
```

要在系统引导时加载 [cuse(3)](https://man.freebsd.org/cgi/man.cgi?query=cuse\&sektion=3\&format=html)，执行以下命令：

```sh
# sysrc kld_list+=cuse
```

安装完这些工具后，可以使用 [webcamd(8)](https://man.freebsd.org/cgi/man.cgi?query=webcamd\&sektion=8\&format=html) 显示可用的摄像头列表：

```sh
# webcamd -l
```

输出应该类似于以下内容：

```sh
webcamd [-d ugen0.2] -N SunplusIT-Inc-HP-TrueVision-HD-Camera -S unknown -M 0 ①
webcamd [-d ugen1.3] -N Realtek-802-11n-WLAN-Adapter -S 00e04c000001 -M 0
```

* ① 可用的摄像头

执行以下命令配置可用的摄像头：

```sh
# sysrc webcamd_0_flags="-N SunplusIT-Inc-HP-TrueVision-HD-Camera" ①
```

> **注意**
>
> 如果这是即插即用的 USB 摄像头，更换其连接的 USB 端口后，`webcamd -l` 的输出（尤其是设备标识符）会发生变化，可能需要同步更新 rc.conf。为避免此问题，可使用设备名称（`-N` 选项）和/或匹配 `webcamd -l` 输出中显示的设备序列号——如果已知的话（`-S` 选项）。对于笔记本内置等固定摄像头，可使用设备标识符（`-d` 选项）。

必须执行以下命令启动 [webcamd(8)](https://man.freebsd.org/cgi/man.cgi?query=webcamd\&sektion=8\&format=html) 服务：

```sh
# service webcamd start
```

输出应类似于以下内容：

```sh
Starting webcamd.
webcamd 1616 - - Attached to ugen0.2[0]
```

可以使用 [multimedia/pwcview](https://cgit.freebsd.org/ports/tree/multimedia/pwcview/) 检查摄像头是否正常工作。可使用以下命令执行 [multimedia/pwcview](https://cgit.freebsd.org/ports/tree/multimedia/pwcview/)：

```sh
% pwcview -f 30 -s vga
```

然后 [multimedia/pwcview](https://cgit.freebsd.org/ports/tree/multimedia/pwcview/) 将显示摄像头画面：

![pwcview 显示 Absolute FreeBSD 第三版作为示例](https://docs.freebsd.org/images/books/handbook/multimedia/pwcview.png)

## 9.5.2. 会议软件状态

FreeBSD 当前支持以下用于视频会议的工具。

**表 5. 会议软件**

| 名称              | Firefox 状态 | Chromium 状态 | 网站                                                |
| --------------- | ---------- | ----------- | ------------------------------------------------- |
| Microsoft Teams | 不可用        | 可用          | [https://teams.live.com](https://teams.live.com/) |
| Google Meet     | 可用         | 可用          | <https://meet.google.com/>                        |
| Zoom            | 可用         | 可用          | [https://zoom.us](https://zoom.us/)               |
| Jitsi           | 不可用        | 可用          | <https://meet.jit.si/>                            |
| BigBlueButton   | 不可用        | 可用          | <https://bigbluebutton.org/>                      |


# 9.6.图像扫描仪

在 FreeBSD 中，图像扫描仪的访问通过 [SANE (Scanner Access Now Easy)](http://www.sane-project.org/) 提供，该软件在 FreeBSD Ports 中可用。

## 9.6.1. 检查扫描仪

在配置之前，检查扫描仪是否受 SANE 支持非常重要。

将扫描仪连接好后，运行以下命令以获取所有连接的 USB 设备：

```sh
# usbconfig list
```

输出应类似于以下内容：

```sh
ugen4.2: <LITE-ON Technology USB NetVista Full Width Keyboard.> at usbus4, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON (70mA)
ugen4.3: <Logitech USB Optical Mouse> at usbus4, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON (100mA)
ugen3.2: <HP Deskjet 1050 J410 series> at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (2mA)
```

运行以下命令获取 `idVendor` 和 `idProduct`：

```sh
# usbconfig -d 3.2 dump_device_desc
```

> **注意**
>
> 扫描仪为即插即用设备，更换连接的 USB 端口后，`usbconfig list` 的输出内容也会改变。

输出应类似于以下内容：

```sh
ugen3.2: <HP Deskjet 1050 J410 series> at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (2mA)

bLength = 0x0012
bDescriptorType = 0x0001
bcdUSB = 0x0200
bDeviceClass = 0x0000  <Probed by interface class>
bDeviceSubClass = 0x0000
bDeviceProtocol = 0x0000
bMaxPacketSize0 = 0x0040
idVendor = 0x03f0
idProduct = 0x8911
bcdDevice = 0x0100
iManufacturer = 0x0001  <HP>
iProduct = 0x0002  <Deskjet 1050 J410 series>
bNumConfigurations = 0x0001
```

若获得了 `idVendor` 和 `idProduct`，需要在 [SANE 支持的设备列表](http://www.sane-project.org/lists/sane-mfgs-cvs.html) 中检查扫描仪是否受支持，可通过 `idProduct` 筛选。

## 9.6.2. SANE 配置

SANE 通过后端提供对扫描仪的访问。为了能在 FreeBSD 上扫描，必须安装 Port [graphics/sane-backends](https://cgit.freebsd.org/ports/tree/graphics/sane-backends/)，可运行以下命令安装：

```sh
# pkg install sane-backends
```

> **技巧**
>
> 某些 USB 扫描仪需要加载固件。例如，上面使用的 HP 扫描仪，需要安装 Port [print/hplip](https://cgit.freebsd.org/ports/tree/print/hplip/)。

安装完必要的包后，必须配置 [devd(8)](https://man.freebsd.org/cgi/man.cgi?query=devd\&sektion=8\&format=html)，让 FreeBSD 能访问扫描仪。

将 `saned.conf` 文件添加到 **/usr/local/etc/devd/saned.conf**，内容如下：

```sh
notify 100 {
        match "system" "USB";
        match "subsystem" "INTERFACE";
        match "type" "ATTACH";
        match "cdev" "ugen[0-9].[0-9]";
        match "vendor" "0x03f0"; ①
        match "product" "0x8911"; ②
        action "chown -L cups:saned /dev/\$cdev && chmod -L 660 /dev/\$cdev";
};
```

* ① `vendor`: 是通过运行 `usbconfig -d 3.2 dump_device_desc` 命令获得的 `idVendor`。
* ② `product`: 是通过运行 `usbconfig -d 3.2 dump_device_desc` 命令获得的 `idProduct`。

之后，必须运行以下命令重新启动 [devd(8)](https://man.freebsd.org/cgi/man.cgi?query=devd\&sektion=8\&format=html)：

```sh
# service devd restart
```

SANE 后端包括 [scanimage(1)](https://man.freebsd.org/cgi/man.cgi?query=scanimage\&sektion=1\&format=html)，可以用来列出设备并执行图像采集。

执行 [scanimage(1)](https://man.freebsd.org/cgi/man.cgi?query=scanimage\&sektion=1\&format=html) 并使用 `-L` 参数列出扫描仪设备：

```sh
# scanimage -L
```

输出应类似于以下内容：

```sh
device `hpaio:/usb/Deskjet_1050_J410_series?serial=XXXXXXXXXXXXXX' is a Hewlett-Packard Deskjet_1050_J410_series all-in-one
```

如果 [scanimage(1)](https://man.freebsd.org/cgi/man.cgi?query=scanimage\&sektion=1\&format=html) 无法识别扫描仪，将出现以下消息：

```sh
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).
```

[scanimage(1)](https://man.freebsd.org/cgi/man.cgi?query=scanimage\&sektion=1\&format=html) 识别扫描仪后，配置就完成了，扫描仪现在可以使用。

要启用该服务并让它在启动时运行，执行以下命令：

```sh
# sysrc saned_enable=YES
```

虽然可以通过命令行使用 [scanimage(1)](https://man.freebsd.org/cgi/man.cgi?query=scanimage\&sektion=1\&format=html) 执行图像采集，但通常更倾向于使用图形界面扫描图像。

**表 6. 图形扫描程序**

| 名称                | 许可证     | 包                                                                                 |
| ----------------- | ------- | --------------------------------------------------------------------------------- |
| skanlite          | GPL 2.0 | [graphics/skanlite](https://cgit.freebsd.org/ports/tree/graphics/skanlite/)       |
| GNOME Simple Scan | GPL 3.0 | [graphics/simple-scan](https://cgit.freebsd.org/ports/tree/graphics/simple-scan/) |
| XSANE             | GPL 2.0 | [graphics/xsane](https://cgit.freebsd.org/ports/tree/graphics/xsane/)             |


# 10.1.概述

内核是 FreeBSD 操作系统的核心。它负责管理内存、执行安全控制、网络通信、磁盘访问等众多任务。虽然 FreeBSD 的大部分内容是动态可配置的，但一些用户可能希望配置并编译定制内核。

阅读本章后，你将了解：

* 何时构建定制内核。
* 如何盘点硬件清单。
* 如何定制内核配置文件。
* 如何使用内核配置文件创建并构建新内核。
* 如何安装新内核。
* 如果出现问题，如何排查故障。

本章中的所有示例命令都应以 `root` 用户身份执行。


# 10.2.为什么要构建定制内核

传统上，FreeBSD 使用的是宏内核。该内核是大型程序，支持固定的设备列表，并且要改变内核的行为，必须编译并重新引导到新内核中。

如今，FreeBSD 内核中的大部分功能都包含在可以根据需要动态加载和卸载的模块中。这使得运行中的内核能立即适应新硬件，并将新的功能引入内核。这种内核称为模块化内核。

有时，仍然需要做静态内核配置。某些功能与内核紧密绑定，无法动态加载。一些安全环境会阻止加载和卸载内核模块，要求只能将所需功能静态编译到内核中。

构建定制内核通常是高级 BSD 用户的必由之路。这个过程虽然耗时，但能为 FreeBSD 系统带来很多好处。与必须支持广泛硬件的 **GENERIC** 内核不同，定制内核可以精简，只提供对该计算机硬件的支持。这有以下几个好处：

* 更快的引导时间。由于内核只会探测系统中的硬件，系统引导所需的时间可能会减少。
* 更低的内存使用。定制内核通过省略不使用的功能和设备驱动程序，通常比 **GENERIC** 内核使用更少的内存。这一点非常重要，因为内核代码始终驻留在物理内存中，防止应用程序占用该内存。因此，定制内核对于内存较小的系统非常有用。
* 增强的硬件支持。定制内核可以为 **GENERIC** 内核中没有的设备提供支持。

> **警告**
>
> 在构建定制内核时，需要注意的是，非默认配置的测试不如 **GENERIC** 配置彻底。虽然定制内核可以带来特定的好处，但它也增加了遇到构建或运行时问题的风险。只有那些有明确理由更改并愿意在必要时调试的高级用户，才推荐使用定制内核配置。

在构建定制内核之前，考虑一下构建的原因。如果需要特定的硬件支持，可能已经作为模块存在。

内核模块位于 **/boot/kernel** 中，可以使用 [kldload(8)](https://man.freebsd.org/cgi/man.cgi?query=kldload\&sektion=8\&format=html) 将其动态加载到运行中的内核中。大多数内核驱动程序都有可加载的模块和手册页。例如，[ath(4)](https://man.freebsd.org/cgi/man.cgi?query=ath\&sektion=4\&format=html) 无线网络驱动程序的手册页中包含以下信息：

或者，要在引导时加载驱动程序作为模块，请在 [loader.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=loader.conf\&sektion=5\&format=html) 中加入以下行：

```sh
if_ath_load="YES"
```

将 `if_ath_load="YES"` 添加到 **/boot/loader.conf** 中，将在引导时动态加载此模块。

在某些情况下，**/boot/kernel** 中没有关联的模块。这通常适用于某些子系统。


# 10.3.浏览系统硬件

在编辑内核配置文件之前，建议盘点机器的硬件。在双重引导系统中，可以从其他操作系统创建硬件清单。例如，Microsoft® 的设备管理器包含有关已安装设备的信息。

> **注意**
>
> 某些版本的 Microsoft® Windows® 有个系统图标，可用于访问设备管理器。

如果 FreeBSD 是唯一安装的操作系统，可以使用 [dmesg(8)](https://man.freebsd.org/cgi/man.cgi?query=dmesg\&sektion=8\&format=html) 来确定在引导探测过程中找到并列出的硬件。FreeBSD 上的大多数设备驱动程序都有手册页，其中列出了该驱动程序支持的硬件。例如，以下几行表明 [psm(4)](https://man.freebsd.org/cgi/man.cgi?query=psm\&sektion=4\&format=html) 驱动程序找到了一个鼠标：

```sh
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)](https://man.freebsd.org/cgi/man.cgi?query=pciconf\&sektion=8\&format=html)，它提供了更详细的输出。例如：

```sh
% 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)](https://man.freebsd.org/cgi/man.cgi?query=man\&sektion=1\&format=html) 的 `-k` 标志可用于提供有用的信息。例如，它可用于显示包含特定设备品牌或名称的手册页列表：

```sh
# man -k Atheros
ath(4)                   - Atheros IEEE 802.11 wireless network driver
ath_hal(4)               - Atheros Hardware Access Layer (HAL)
```

创建硬件清单后，请参考它以确保在编辑定制内核配置时不会删除已安装硬件的驱动程序。


# 10.4.配置文件

为了创建定制内核配置文件并构建定制内核，必须首先安装完整的 FreeBSD 源代码树。

如果 **/usr/src/** 目录不存在或为空，则说明源代码未安装。可以按照 ["使用 Git"](/fu-lu-a.-huo-qu-freebsd/a.2.-shi-yong-git) 中的说明通过 Git 安装源代码。

安装完源代码后，请查看 **/usr/src/sys** 目录的内容。该目录包含多个子目录，其中包括表示以下受支持架构的目录：**amd64**、**i386**、**powerpc** 和 **sparc64**。每个特定架构的目录只处理该架构的相关内容，其他代码则是所有平台通用的机器无关代码。每个受支持架构都有一个 **conf** 子目录，其中包含该架构的 **GENERIC** 内核配置文件。

不要直接编辑 **GENERIC** 文件。相反，应将文件复制并编辑复制的文件。命名惯例是使用全大写字母的名称。在管理多台具有不同硬件的 FreeBSD 机器时，建议将其命名为机器的主机名。以下示例为 `amd64` 架构的 **GENERIC** 配置文件创建名为 **MYKERNEL** 的副本：

```sh
# cd /usr/src/sys/amd64/conf
# cp GENERIC MYKERNEL
```

现在可以使用任何 `ASCII` 文本编辑器自定义 **MYKERNEL**。默认编辑器是 vi，但 FreeBSD 还安装了更适合初学者的编辑器 ee。

内核配置文件的格式很简单。每行包含代表设备或子系统的关键字、参数和简短说明。任何在 `#` 后面的文本都视为注释并忽略。要从内核配置中删除对某个设备或子系统的支持，请在表示该设备或子系统的行的开头加上 `#`。对于你不理解的行，请不要添加或删除 `#`。

> **警告**
>
> 删除设备或选项的支持很容易导致内核损坏。例如，如果从内核配置文件中删除 [ata(4)](https://man.freebsd.org/cgi/man.cgi?query=ata\&sektion=4\&format=html) 驱动程序，使用 `ATA` 磁盘驱动程序的系统可能无法引导。如有疑问，最好将支持保留在内核中。

除了文件中提供的简短说明外，**NOTES** 文件中还包含附加说明，可以在该架构的 **GENERIC** 文件所在目录中找到。对于架构无关的选项，请参考 **/usr/src/sys/conf/NOTES**。

> **技巧**
>
> 完成定制内核配置文件后，将备份副本保存到 **/usr/src** 之外的位置。
>
> 还可以将内核配置文件保存在其他地方，并创建指向该文件的符号链接：
>
> ```sh
> # cd /usr/src/sys/amd64/conf
> # mkdir /root/kernels
> # cp GENERIC /root/kernels/MYKERNEL
> # ln -s /root/kernels/MYKERNEL
> ```

配置文件中可以使用 `include` 指令。这能将另一个配置文件包含到当前配置文件中，便于针对现有文件维护少量修改。如果只需要少量的额外选项或驱动程序，可通过这种方法维护与 **GENERIC** 的差异，如下所示：

```sh
include GENERIC
ident MYKERNEL

options         IPFIREWALL
options         DUMMYNET
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPDIVERT
```

使用这种方法，本地配置文件表示与 **GENERIC** 内核的本地差异。在执行升级时，除非使用 `nooptions` 或 `nodevice` 明确防止，否则 **GENERIC** 中新增的特性也会添加到本地内核中。有关配置指令及其说明的完整列表，请参阅 [config(5)](https://man.freebsd.org/cgi/man.cgi?query=config\&sektion=5\&format=html)。

> **注意**
>
> 要构建包含所有可用选项的文件，请以 `root` 用户身份运行以下命令：
>
> ```sh
> # cd /usr/src/sys/arch/conf && make LINT
> ```


# 10.5.构建并安装定制内核

保存自定义配置文件的编辑内容后，就可以按照以下步骤编译内核源代码：

**过程：构建内核**

1. 切换到此目录：

   ```sh
   # cd /usr/src
   ```
2. 通过指定定制内核配置文件的名称来编译新内核：

   ```sh
   # make buildkernel KERNCONF=MYKERNEL
   ```
3. 安装与指定内核配置文件关联的新内核。此命令将新内核复制到 **/boot/kernel/kernel** 并将旧内核保存到 **/boot/kernel.old/kernel**：

   ```sh
   # make installkernel KERNCONF=MYKERNEL
   ```
4. 关闭系统并重启进入新内核。如果出现问题，请参考 [内核无法引导](/di-10-zhang-pei-zhi-freebsd-nei-he/10.6.-ru-guo-fa-sheng-le-yi-xie-cuo-wu)。

默认情况下，当编译定制内核时，所有内核模块都会重新编译。要更快地更新内核或仅构建定制模块，可以在开始构建内核之前编辑 **/etc/make.conf**。

例如，以下变量指定要构建的模块列表，而不是默认构建所有模块：

```sh
MODULES_OVERRIDE = linux acpi
```

或者，此变量列出要从构建过程中排除的模块：

```sh
WITHOUT_MODULES = linux acpi sound
```

`NO_MODULES` 完全跳过模块构建，仅构建内核：

```sh
NO_MODULES = yes
```

**Ports 框架**包含依赖内核接口的驱动程序和模块（如 [graphics/drm-kmod](https://cgit.freebsd.org/ports/tree/graphics/drm-kmod/)、[emulators/virtualbox-ose-kmod](https://cgit.freebsd.org/ports/tree/emulators/virtualbox-ose-kmod/)）。使用 `PORTS_MODULES` 变量，每次内核构建时，包含内核模块的 Port 都会根据更新的源代码重新构建，确保内核模块与内核本身保持同步。内核树和 Ports 树应一起更新以获得最大兼容性。`PORTS_MODULES` 可以添加到 **/etc/make.conf**，以确保你构建的所有内核也会重新构建这些模块。例如：

```sh
PORTS_MODULES = drm-kmod virtualbox-ose-kmod
```

还可以使用其他变量。有关详细信息，请参阅 [make.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=make.conf\&sektion=5\&format=html)。


# 10.6.如果发生了错误

在构建定制内核时，可能会遇到四种类型的故障：

**`config` 失败**

如果 `config` 失败，它会打印出错误的行号。例如，对于以下消息，请确保第 17 行输入正确，可与 **GENERIC** 或 **NOTES** 文件比较：

```sh
config: line 17: syntax error
```

**`make` 失败**

如果 `make` 失败，通常是由于内核配置文件中的错误，但该错误未严重到 `config` 能检测到的程度。请检查配置文件，如果问题不明显，可以将内核配置文件发送到 [FreeBSD 常见问题邮件列表](https://lists.freebsd.org/subscription/freebsd-questions) 求助。

**内核无法引导**

如果新内核无法引导或无法识别设备，不必惊慌！幸运的是，FreeBSD 提供了优秀的机制来从不兼容的内核中恢复。只需在 FreeBSD 引导加载器中选择要引导的内核。在系统引导菜单出现时，选择“Escape to a loader prompt”选项。在提示符下，输入 `boot kernel.old`，或者输入任何已知能正常引导的内核名称。

在使用可用的内核引导后，请检查配置文件并尝试重新构建。有用的资源是 **/var/log/messages**，它记录了每次成功引导的内核信息。另外，[dmesg(8)](https://man.freebsd.org/cgi/man.cgi?query=dmesg\&sektion=8\&format=html) 会打印当前引导的内核信息。

> **注意**
>
> 在排查内核问题时，确保保留一份已知可正常工作的内核副本（如 **GENERIC**）。这一点很重要，因为每次安装新内核时，**kernel.old** 都会被上一次安装的内核覆盖，而那个内核未必能正常引导。应尽快通过重命名目录来转移可正常工作的内核：

```sh
# mv /boot/kernel /boot/kernel.bad
# mv /boot/kernel.good /boot/kernel
```

**内核正常工作，但** [**ps(1)**](https://man.freebsd.org/cgi/man.cgi?query=ps\&sektion=1\&format=html) **无法使用**

如果内核版本与系统工具的构建版本不同，例如，在 -RELEASE 系统上安装了从 -CURRENT 源代码构建的内核，那么许多系统状态命令，如 [ps(1)](https://man.freebsd.org/cgi/man.cgi?query=ps\&sektion=1\&format=html) 和 [vmstat(8)](https://man.freebsd.org/cgi/man.cgi?query=vmstat\&sektion=8\&format=html)，将无法工作。为了解决这个问题，请 [重新编译并安装使用与内核相同版本源代码树构建的世界](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.6.-cong-yuan-dai-ma-geng-xin-freebsd)。使用与操作系统其他部分版本不同的内核版本从来不是好主意。


# 11.1.快速入门

将信息写在纸上是至关重要的功能，尽管有许多尝试去消除这一点。打印有两个基本组成部分。数据必须传送到打印机，并且必须以打印机能理解的形式呈现。

基本打印可以快速设置。打印机必须能打印普通的 `ASCII` 文本。有关打印其他类型文件的信息，请参见 [过滤器](/di-11-zhang-da-yin/11.5.-lpd-hang-shi-da-yin-ji-cheng-xu)。

1. 创建目录来存储正在打印的文件：

   ```sh
   # mkdir -p /var/spool/lpd/lp
   # chown daemon:daemon /var/spool/lpd/lp
   # chmod 770 /var/spool/lpd/lp
   ```
2. 作为 `root` 用户，创建 **/etc/printcap** 文件，内容如下：

   ```sh
   lp:\
   lp=/dev/unlpt0:\  ①
   sh:\
   mx#0:\
   sd=/var/spool/lpd/lp:\
   lf=/var/log/lpd-errs:
   ```

   * ① 这行是用于连接到 `USB` 端口的打印机。

   对于连接到并行端口或“打印机”端口的打印机，使用：

   ```sh
   :lp=/dev/lpt0:\
   ```

   对于直接连接到网络的打印机，使用：

   ```sh
   :lp=:rm=network-printer-name:rp=raw:\
   ```

   将 *network-printer-name* 替换为网络打印机的 `DNS` 主机名。
3. 通过编辑 **/etc/rc.conf** 文件启用 LPD，添加以下行：

   ```sh
   lpd_enable="YES"
   ```

   启动服务：

   ```sh
   # service lpd start
   Starting lpd.
   ```
4. 打印测试：

   ```sh
   # printf "1. This printer can print.\n2. This is the second line.\n" | lpr
   ```

   > **技巧**
   >
   > 如果两行没有从左边界开始，而是呈现“阶梯形”，请参见 [防止纯文本打印机出现阶梯状打印](/di-11-zhang-da-yin/11.5.-lpd-hang-shi-da-yin-ji-cheng-xu)。

   现在可以使用 `lpr` 打印文本文件。可以在命令行中给出文件名，或直接将输出通过管道传递给 `lpr`。

   ```sh
   % lpr textfile.txt
   % ls -lh | lpr
   ```


# 11.2.连接打印机

打印机通过多种方式连接到计算机系统。小型桌面打印机通常直接连接到计算机的 `USB` 端口。旧款打印机则连接到并行端口或“打印机”端口。一些打印机直接连接到网络，使多个计算机可以共享这些打印机。少数打印机使用罕见的串口连接。

FreeBSD 可以与所有这些类型的打印机通信。

**USB**

`USB` 打印机可以连接到计算机上的任何可用 `USB` 端口。

当 FreeBSD 检测到 `USB` 打印机时，会创建两个设备条目：**/dev/ulpt0** 和 **/dev/unlpt0**。发送到任一设备的数据都会传输到打印机。每次打印作业完成后，**ulpt0** 会重置 `USB` 端口。重置端口可能会导致某些打印机出现问题，因此通常使用 **unlpt0** 设备，**unlpt0** 根本不会重置 `USB` 端口。

**并行（IEEE-1284）**

并行端口设备是 **/dev/lpt0**。无论是否连接了打印机，该设备都会出现，但并不会自动检测。

厂商已经逐渐放弃这些“传统”端口，许多计算机不再配备这些端口。可以使用适配器将并行打印机连接到 `USB` 端口。使用这样的适配器，打印机可以像真正的 `USB` 打印机一样处理。名为 *打印服务器* 的设备也可用于将并行打印机直接连接到网络。

**串口（RS-232）**

串口是另一种传统端口，除了在某些特殊应用中，打印机通常不再使用串口。电缆、连接器和所需的接线方式差异较大。

对于内置于主板的串口，串口设备名称为 **/dev/cuau0** 或 **/dev/cuau1**。串口 `USB` 适配器也可以使用，这些适配器会显示为 **/dev/cuaU0**。

与串口打印机通信时，必须知道几个通信参数。最重要的是 *波特率* 或 `BPS`（每秒比特数）和 *校验位*。这些值会有所不同，但典型的串口打印机使用 9600 的波特率且没有校验位。

**网络**

网络打印机直接连接到本地计算机网络。

必须知道打印机的 `DNS` 主机名。如果打印机通过 `DHCP` 分配了动态地址，应动态更新 `DNS`，以确保主机名始终拥有正确的 `IP` 地址。为了避免这个问题，许多网络打印机使用静态 `IP` 地址。

大多数网络打印机支持使用 LPD 协议发送的打印作业。还可以指定打印队列的名称。一些打印机会根据使用的队列不同而以不同的方式处理数据。例如，`raw` 队列会原样打印数据，而 `text` 队列会在纯文本中添加回车符。

许多网络打印机也可以直接通过端口 9100 打印数据。

## 11.2.1. 总结

有线网络连接通常是最容易设置的，并且提供最快的打印速度。对于直接连接到计算机，`USB` 由于速度和简便性而更受青睐。并行连接可以工作，但在电缆长度和速度上有局限性。串口连接则更难配置，电缆接线在不同型号之间差异很大，并且通信参数（如波特率和校验位）增加了配置的复杂性。幸运的是，串口打印机很少见。


# 11.3.常见的页面描述语言（PDL）

发送到打印机的数据必须采用打印机能理解的语言。这些语言称为页面描述语言，或称 PDL。

**ASCII**

普通 `ASCII` 文本是发送数据到打印机的最简单方式。字符与将要打印的内容一一对应：数据中的 `A` 打印出来的就是 `A`。可用的格式化选项非常少。无法选择字体或比例间距。普通 `ASCII` 的强制简化意味着文本可以直接从计算机打印，几乎不需要编码或翻译。打印输出与发送的内容直接对应。

一些廉价打印机无法打印普通 `ASCII` 文本。这使得它们的设置变得更加困难，但通常仍然可以实现。

**PostScript®**

PostScript® 几乎是 `ASCII` 的对立面。它不是简单的文本，而是一组绘制最终文档的指令。可以使用不同的字体和图形。然而，这种强大功能是有代价的。绘制页面的程序必须专门编写。通常，这个程序由应用软件生成，因此这个过程对用户是不可见的。

廉价打印机有时会省略 PostScript® 兼容性，以节省成本。

**PCL（打印机命令语言）**

`PCL` 是 `ASCII` 的扩展，增加了用于格式化、选择字体和打印图形的转义序列。许多打印机提供 `PCL5` 支持。某些打印机支持更新的 `PCL6` 或 `PCLXL`。这些后续版本是 `PCL5` 的超集，能提供更快的打印速度。

**基于主机**

制造商可以通过为打印机提供简单的处理器和很少的内存来降低打印机的成本。这些打印机不能打印普通文本。相反，文本和图形的位图由主机计算机上的驱动程序绘制，然后发送到打印机。这些称为 *基于主机* 的打印机。

驱动程序与基于主机的打印机之间的通信通常通过专有或未公开的协议，因此它们只能在最常见的操作系统上工作。

## 11.3.1. 将 PostScript® 转换为其他 PDL

许多来自 Ports Collection 和 FreeBSD 工具的应用程序会生成 PostScript® 输出。下表展示了可用于将其转换为其他常见 PDL 的工具：

**表 1. 输出 PDL**

| 输出 PDL           | 生成工具                                                                                    | 备注                                                   |
| ---------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| `PCL` 或 `PCL5`   | [print/ghostscript9-base](https://cgit.freebsd.org/ports/tree/print/ghostscript9-base/) | `-sDEVICE=ljet4` 用于黑白打印，`-sDEVICE=cljet5` 用于彩色打印     |
| `PCLXL` 或 `PCL6` | [print/ghostscript9-base](https://cgit.freebsd.org/ports/tree/print/ghostscript9-base/) | `-sDEVICE=pxlmono` 用于黑白打印，`-sDEVICE=pxlcolor` 用于彩色打印 |
| `ESC/P2`         | [print/ghostscript9-base](https://cgit.freebsd.org/ports/tree/print/ghostscript9-base/) | `-sDEVICE=uniprint`                                  |
| `XQX`            | [print/foo2zjs](https://cgit.freebsd.org/ports/tree/print/foo2zjs/)                     |                                                      |

## 11.3.2. 总结

对于最简单的打印，选择支持 PostScript® 的打印机。支持 `PCL` 的打印机是次优选择。通过 [print/ghostscript9-base](https://cgit.freebsd.org/ports/tree/print/ghostscript9-base/)，这些打印机可以像原生支持 PostScript® 一样使用。直接支持 PostScript® 或 `PCL` 的打印机几乎总是也支持直接打印普通 `ASCII` 文本文件。

像典型的喷墨打印机这样的行式打印机通常不支持 PostScript® 或 `PCL`。它们通常可以打印普通的 `ASCII` 文本文件。[print/ghostscript9-base](https://cgit.freebsd.org/ports/tree/print/ghostscript9-base/) 支持一些打印机使用的 PDL。然而，在这些打印机上打印整个基于图形的页面通常会非常慢，因为需要传输和打印的数据量很大。

基于主机的打印机通常更难设置。有些由于专有 PDL 不能使用。尽量避免使用这些打印机。可以在 <http://www.openprinting.org/printers> 查找不同型号打印机使用的特定 `PDL`。


# 11.4.直接打印

对于偶尔的打印，可以直接将文件发送到打印机设备，而无需任何设置。例如，可以将名为 **sample.txt** 的文件发送到 `USB` 打印机：

```sh
# cp sample.txt /dev/unlpt0
```

直接打印到网络打印机取决于打印机的功能，但大多数打印机都接受通过 9100 端口的打印任务，且可以使用 [nc(1)](https://man.freebsd.org/cgi/man.cgi?query=nc\&sektion=1\&format=html) 与它们配合使用。要将相同的文件打印到 `DNS` 主机名为 *netlaser* 的打印机：

```sh
# nc netlaser 9100 < sample.txt
```


# 11.5.LPD（行式打印机程序）

打印文件到后台的过程称为 *排队打印*（spooling）。排队打印能让用户继续使用计算机上的其他程序，而无需等待打印机缓慢完成打印任务。

FreeBSD 包含排队打印程序，叫做 [lpd(8)](https://man.freebsd.org/cgi/man.cgi?query=lpd\&sektion=8\&format=html)。打印任务是通过 [lpr(1)](https://man.freebsd.org/cgi/man.cgi?query=lpr\&sektion=1\&format=html) 提交的。

## 11.5.1. 初始设置

创建存储打印任务的目录，设置目录的所有权，并设置权限以防止其他用户查看这些文件的内容：

```sh
# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp
```

打印机在 **/etc/printcap** 中定义。每个打印机的条目包括名称、连接的端口以及其他各种设置。创建 **/etc/printcap** 文件并添加以下内容：

```sh
lp:\				①	
	:lp=/dev/unlpt0:\	②
	:sh:\			③
	:mx#0:\			④
	:sd=/var/spool/lpd/lp:\	⑤
	:lf=/var/log/lpd-errs:	⑥
```

* ① 这是打印机的名称。[lpr(1)](https://man.freebsd.org/cgi/man.cgi?query=lpr\&sektion=1\&format=html) 将打印任务发送到 `lp` 打印机，除非使用 `-P` 指定了其他打印机，因此默认打印机应命名为 `lp`。
* ② 打印机连接的设备。将此行替换为适合所示连接类型的相应行。
* ③ 在打印任务开始时抑制打印页头。
* ④ 不限制打印任务的最大大小。
* ⑤ 此打印机的排队目录路径。每个打印机使用自己的排队目录。
* ⑥ 报告此打印机错误的日志文件路径。

创建 **/etc/printcap** 后，使用 [chkprintcap(8)](https://man.freebsd.org/cgi/man.cgi?query=chkprintcap\&sektion=8\&format=html) 测试是否存在错误：

```sh
# chkprintcap
```

在继续之前，修复任何报告的问题。

在 **/etc/rc.conf** 中启用 [lpd(8)](https://man.freebsd.org/cgi/man.cgi?query=lpd\&sektion=8\&format=html)：

```sh
lpd_enable="YES"
```

启动服务：

```sh
# service lpd start
```

## 11.5.2. 使用 [lpr(1)](https://man.freebsd.org/cgi/man.cgi?query=lpr\&sektion=1\&format=html) 打印

通过 `lpr` 将文档发送到打印机。可以在命令行中指定要打印的文件，或者通过管道将文件内容传递给 `lpr`。这两个命令是等效的，将 **doc.txt** 的内容发送到默认打印机：

```sh
% lpr doc.txt
% cat doc.txt | lpr
```

可以使用 `-P` 来选择打印机。要打印到名为 *laser* 的打印机：

```sh
% lpr -Plaser doc.txt
```

## 11.5.3. 过滤器

到目前为止的例子直接将文本文件的内容发送到打印机。只要打印机能理解这些文件的内容，输出就会正确地打印出来。

一些打印机无法打印纯文本，而且输入文件可能甚至不是纯文本。

*过滤器* 能转换或处理文件。典型的用途是将一种类型的输入（如纯文本）转换成打印机可以理解的形式，如 PostScript® 或 `PCL`。过滤器还可用于提供附加功能，比如添加页码或高亮显示源代码以使其更易于阅读。

这里讨论的过滤器是 *输入过滤器* 或 *文本过滤器*。这些过滤器将传入的文件转换为不同的形式。在创建文件之前，使用 [su(1)](https://man.freebsd.org/cgi/man.cgi?query=su\&sektion=1\&format=html) 变更为 `root` 用户。

过滤器在 **/etc/printcap** 中通过 `if=` 标识符指定。要使用 **/usr/local/libexec/lf2crlf** 作为过滤器，可以像这样修改 **/etc/printcap**：

```sh
lp:\
	:lp=/dev/unlpt0:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/lp:\
	:if=/usr/local/libexec/lf2crlf:\   ①
	:lf=/var/log/lpd-errs:
```

* ① `if=` 标识符指定将用于传入文本的 *输入过滤器*。

> **技巧**
>
> **printcap** 条目中行尾的反斜杠 *续行* 字符表明，打印机的条目实际上只是一条长行，各条目之间以冒号分隔。前面的示例可以改写为一条不太易读的单行：
>
> ```sh
> lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:
> ```

### 11.5.3.1. 防止纯文本打印机出现阶梯状打印

典型的 FreeBSD 文本文件每行末尾只包含一个换行符。在标准打印机上，这些行会出现“阶梯”现象：

```sh
A printed file looks
                    like the steps of a staircase
                                                 scattered by the wind
```

可以使用过滤器将换行符转换为回车符和换行符。回车符使打印机在每行结束后返回左边。创建 **/usr/local/libexec/lf2crlf**，内容如下：

```sh
#!/bin/sh
CR=$'\r'
/usr/bin/sed -e "s/$/${CR}/g"
```

设置权限并使其可执行：

```sh
# chmod 555 /usr/local/libexec/lf2crlf
```

修改 **/etc/printcap** 使用新的过滤器：

```sh
:if=/usr/local/libexec/lf2crlf:\
```

通过打印相同的纯文本文件来测试过滤器。回车符将使每一行从页面的左侧开始打印。

### 11.5.3.2. 使用 [print/enscript](https://cgit.freebsd.org/ports/tree/print/enscript/) 在 PostScript® 打印机上打印精美的纯文本

GNU Enscript 将纯文本文件转换为格式良好的 PostScript® 文件，用于在 PostScript® 打印机上打印。它添加了页码、自动换行，并提供了许多其他功能，使打印出来的文本文件更易于阅读。根据本地纸张大小，从 Ports 安装 [print/enscript-letter](https://cgit.freebsd.org/ports/tree/print/enscript-letter/) 或 [print/enscript-a4](https://cgit.freebsd.org/ports/tree/print/enscript-a4/)。

创建 **/usr/local/libexec/enscript** 文件，并写入以下内容：

```sh
#!/bin/sh
/usr/local/bin/enscript -o -
```

设置权限并使其可执行：

```sh
# chmod 555 /usr/local/libexec/enscript
```

修改 **/etc/printcap** 使用新的过滤器：

```sh
:if=/usr/local/libexec/enscript:\
```

通过打印纯文本文件来测试过滤器。

### 11.5.3.3. 将 PostScript® 打印到 `PCL` 打印机

许多程序生成 PostScript® 文档。然而，廉价的打印机通常只理解纯文本或 `PCL`。这个过滤器将 PostScript® 文件转换为 `PCL`，然后发送到打印机。

从 Ports 安装 Ghostscript PostScript® 解释器 [print/ghostscript9-base](https://cgit.freebsd.org/ports/tree/print/ghostscript9-base/)。

创建 **/usr/local/libexec/ps2pcl** 文件，并写入以下内容：

```sh
#!/bin/sh
/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -
```

设置权限并使其可执行：

```sh
# chmod 555 /usr/local/libexec/ps2pcl
```

发送到该脚本的 PostScript® 输入在发送到打印机之前会渲染并转换为 `PCL`。

修改 **/etc/printcap** 使用这个新的输入过滤器：

```sh
:if=/usr/local/libexec/ps2pcl:\
```

通过发送小的 PostScript® 程序来测试过滤器：

```sh
% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
72 432 moveto (PostScript printing successful.) show showpage \004" | lpr
```

### 11.5.3.4. 智能过滤器

能检测输入类型并自动将其转换为适合打印机的正确格式的过滤器非常方便。PostScript® 文件的前两个字符通常是 `%!`。过滤器可以检测这两个字符。PostScript® 文件可以直接发送到 PostScript® 打印机而不做任何更改。文本文件可以使用 Enscript 转换为 PostScript®，如前所示。创建 **/usr/local/libexec/psif** 文件，并写入以下内容：

```sh
#!/bin/sh
#
#  psif - 在 PostScript 打印机上打印 PostScript 或纯文本
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

case "$first_two_chars" in
%!)
    # %! : PostScript 作业，直接打印。
    echo "$first_line" && cat && exit 0
    exit 2
    ;;
*)
    # 否则，使用 enscript 格式化
    ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
    exit 2
    ;;
esac
```

设置权限并使其可执行：

```sh
# chmod 555 /usr/local/libexec/psif
```

修改 **/etc/printcap** 使用这个新的输入过滤器：

```sh
:if=/usr/local/libexec/psif:\
```

通过打印 PostScript® 和纯文本文件来测试过滤器。

## 11.5.4. 多个队列

**/etc/printcap** 中的条目实际上是 *队列* 的定义。一台打印机可以有多个队列。结合过滤器使用时，多个队列可以为用户提供更多的打印作业控制。

例如，考虑办公室中的网络化 PostScript® 激光打印机。大多数用户希望打印纯文本，但一些专业用户希望能直接打印 PostScript® 文件。可以为同一台打印机在 **/etc/printcap** 中创建两个条目：

```sh
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® 文件，那里不做任何过滤。

这种多个队列技术可用于提供对打印机所有功能的直接访问。例如，一台配有双面打印器的打印机可以使用两个队列，一个用于普通的单面打印，另一个使用过滤器，该过滤器发送命令序列以启用双面打印，然后发送传入的文件。

## 11.5.5. 监控与控制打印

有几种工具可用于监控打印作业、检查和控制打印机操作。

### 11.5.5.1. [lpq(1)](https://man.freebsd.org/cgi/man.cgi?query=lpq\&sektion=1\&format=html)

[lpq(1)](https://man.freebsd.org/cgi/man.cgi?query=lpq\&sektion=1\&format=html) 用于显示用户的打印作业状态。其他用户的打印作业不会显示。

显示当前用户在单个打印机上的待处理作业：

```sh
% lpq -Plp
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     0    (standard input)                      12792 bytes
```

显示当前用户在所有打印机上的待处理作业：

```sh
% 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
```

### 11.5.5.2. [lprm(1)](https://man.freebsd.org/cgi/man.cgi?query=lprm\&sektion=1\&format=html)

[lprm(1)](https://man.freebsd.org/cgi/man.cgi?query=lprm\&sektion=1\&format=html) 用于删除打印作业。普通用户只能删除自己的作业。`root` 用户可以删除任何作业或所有作业。

从打印机删除所有待处理作业：

```sh
# lprm -Plp -
dfA002smithy dequeued
cfA002smithy dequeued
dfA003smithy dequeued
cfA003smithy dequeued
dfA004smithy dequeued
cfA004smithy dequeued
```

从打印机删除单个作业。可以使用 [lpq(1)](https://man.freebsd.org/cgi/man.cgi?query=lpq\&sektion=1\&format=html) 查找作业编号。

```sh
% lpq
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     5    (standard input)                      12188 bytes

% lprm -Plp 5
dfA005smithy dequeued
cfA005smithy dequeued
```

### 11.5.5.3. [lpc(8)](https://man.freebsd.org/cgi/man.cgi?query=lpc\&sektion=8\&format=html)

[lpc(8)](https://man.freebsd.org/cgi/man.cgi?query=lpc\&sektion=8\&format=html) 用于检查和修改打印机状态。`lpc` 后跟命令和可选的打印机名称。可以使用 `all` 替代特定的打印机名称，命令将应用于所有打印机。普通用户可以使用 [lpc(8)](https://man.freebsd.org/cgi/man.cgi?query=lpc\&sektion=8\&format=html) 查看状态，只有 `root` 用户可以使用修改打印机状态的命令。

显示所有打印机的状态：

```sh
% 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
```

禁止打印机接受新作业，然后再次开始接受新作业：

```sh
# lpc disable lp
lp:
	queuing disabled
# lpc enable lp
lp:
	queuing enabled
```

停止打印，但继续接受新作业。然后开始打印：

```sh
# lpc stop lp
lp:
	printing disabled
# lpc start lp
lp:
	printing enabled
	daemon started
```

在出现错误条件后重新启动打印机：

```sh
# lpc restart lp
lp:
	no daemon to abort
	printing enabled
	daemon restarted
```

关闭打印队列并禁用打印，显示问题信息给用户：

```sh
# lpc down lp Repair parts will arrive on Monday
lp:
	printer and queuing disabled
	status message is now: Repair parts will arrive on Monday
```

重新启用停机的打印机：

```sh
# lpc up lp
lp:
	printing enabled
	daemon started
```

更多命令和选项请参见 [lpc(8)](https://man.freebsd.org/cgi/man.cgi?query=lpc\&sektion=8\&format=html)。

## 11.5.6. 共享打印机

企业和学校中的多个用户通常共享打印机。为使共享打印机更加便利，提供了附加功能。

### 11.5.6.1. 别名

打印机名称在 **/etc/printcap** 文件的第一行中设置。可以在该名称后添加附加名称，或称为 *别名*。别名通过竖线分隔：

```sh
lp|repairsprinter|salesprinter:\
```

别名可以代替打印机名称。例如，销售部门的用户打印到他们的打印机时使用：

```sh
% lpr -Psalesprinter sales-report.txt
```

维修部门的用户打印到 *他们的* 打印机时使用：

```sh
% lpr -Prepairsprinter repairs-report.txt
```

所有文档都会打印到这台共享打印机上。当销售部门发展到需要自己的打印机时，可以从共享打印机条目中删除别名，并将其用作新打印机的名称。两个部门的用户继续使用相同的命令，但销售文档将发送到新打印机。

### 11.5.6.2. 页头页

在繁忙的共享打印机打印出来的文档堆中，用户可能很难找到自己的文档。*页头页*（有时也称为 *横幅页* 或 *分隔页*）旨在解决此问题。在每个打印作业之前打印带有用户名和文档名称的页头页。

启用页头页的方式取决于打印机是通过 `USB`、并行端口或串行端口直接连接到计算机，还是通过网络远程连接。

对于直接连接的打印机，通过从 **/etc/printcap** 文件中的条目中删除 `:sh:\`（禁止页头）行来启用页头页。这些页头页仅使用换行符换行。一些打印机可能需要 **/usr/share/examples/printing/hpif** 过滤器，以防止阶梯式文本。该过滤器配置 `PCL` 打印机，在接收到换行符时打印回车符和换行符。

对于网络打印机，页头页必须在打印机本身上配置。**/etc/printcap** 文件中的页头页条目将被忽略。设置通常可通过打印机前面板或通过浏览器访问的配置网页调整。

## 11.5.7. 参考资料

示例文件：**/usr/share/examples/printing/**。

*4.3BSD Line Printer Spooler Manual*，**/usr/share/doc/smm/07.lpd/paper.ascii.gz**。

手册页：[printcap(5)](https://man.freebsd.org/cgi/man.cgi?query=printcap\&sektion=5\&format=html)，[lpd(8)](https://man.freebsd.org/cgi/man.cgi?query=lpd\&sektion=8\&format=html)，[lpr(1)](https://man.freebsd.org/cgi/man.cgi?query=lpr\&sektion=1\&format=html)，[lpc(8)](https://man.freebsd.org/cgi/man.cgi?query=lpc\&sektion=8\&format=html)，[lprm(1)](https://man.freebsd.org/cgi/man.cgi?query=lprm\&sektion=1\&format=html)，[lpq(1)](https://man.freebsd.org/cgi/man.cgi?query=lpq\&sektion=1\&format=html)。


# 11.6.其他打印系统

除了内建的 [lpd(8)](https://man.freebsd.org/cgi/man.cgi?query=lpd\&sektion=8\&format=html) 系统之外，还有其他若干打印系统可用。这些系统提供了对其他协议的支持或附加功能。

## 11.6.1. CUPS (Common UNIX® Printing System)

CUPS 是广泛使用的打印系统，适用于许多操作系统。在 FreeBSD 上使用 CUPS 的方法记录在一篇独立的文章中：[CUPS](https://docs.freebsd.org/en/articles/cups/)

## 11.6.2. HPLIP

惠普公司提供打印系统，支持他们的许多喷墨和激光打印机。相关 Port 为 [print/hplip](https://cgit.freebsd.org/ports/tree/print/hplip/)。主网页位于 <https://developers.hp.com/hp-linux-imaging-and-printing>。该 Port 在 FreeBSD 上处理所有安装细节。配置信息可参见 <https://developers.hp.com/hp-linux-imaging-and-printing/install>。

## 11.6.3. LPRng

LPRng 是作为 [lpd(8)](https://man.freebsd.org/cgi/man.cgi?query=lpd\&sektion=8\&format=html) 的增强替代品而开发的。相关 Port 为 [sysutils/LPRng](https://cgit.freebsd.org/ports/tree/sysutils/LPRng/)。详细信息和文档请参见 <https://lprng.sourceforge.net/>。


# 12.1.概述

FreeBSD 提供 **可选的** Linux® 二进制兼容性，通常称为 Linuxulator，能让用户安装并运行未经修改的 Linux 二进制文件。它适用于 x86（包括 32 位与 64 位）以及 AArch64 架构。某些 Linux 特有的操作系统功能尚未支持；这主要涉及特定硬件功能或与系统管理相关的特性，例如 cgroups 或 namespaces。

在阅读本章之前，你应当：

* 了解如何安装[额外的第三方软件](/di-4-zhang-an-zhuang-ying-yong-cheng-xu-ruan-jian-bao-he-ports/4.1.-gai-shu)。

通过阅读本章，你将了解：

* 如何在 FreeBSD 系统上启用 Linux 二进制兼容性。
* 如何安装额外的 Linux 共享库。
* 如何在 FreeBSD 系统上安装 Linux 应用程序。
* FreeBSD 中 Linux 兼容性的实现细节。


# 12.2.配置 Linux 二进制兼容层

在默认情况下，[linux(4)](https://man.freebsd.org/cgi/man.cgi?query=linux\&sektion=4\&format=html) 二进制兼容性并未启用。

要在启动时启用 Linux ABI，可执行以下命令：

```sh
# sysrc linux_enable="YES"
```

启用之后，无需重启即可通过以下命令启动：

```sh
# service linux start
```

这就足以让静态链接的 Linux 二进制文件运行。

该 Linux 服务会加载所需的内核模块，并挂载 Linux 应用程序所期望的文件系统到 **/compat/linux**。它们的启动方式与原生 FreeBSD 二进制文件相同；其行为几乎与原生进程无异，并可按常规方式跟踪与调试。

可以通过以下命令查看 **/compat/linux** 当前的内容：

```sh
# ls -l /compat/linux/
```

输出应类似于以下内容：

```sh
total 1
dr-xr-xr-x  13 root  wheel  512 Apr 11 19:12 dev
dr-xr-xr-x   1 root  wheel    0 Apr 11 21:03 proc
dr-xr-xr-x   1 root  wheel    0 Apr 11 21:03 sys
```


# 12.3.Linux 用户空间

Linux 软件的运行不仅需要 ABI，还需要安装 Linux 用户空间环境。

> **技巧**
>
> 如果只是想运行 Ports 树中已有的软件，可以通过包管理器安装，[pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 会自动设置所需的 Linux 用户空间。
>
> 例如，要安装 Sublime Text 4 及其依赖的所有 Linux 库，可执行以下命令：
>
> ```sh
> # pkg install linux-sublime-text4
> ```

## 12.3.1. 来自 FreeBSD 软件包的 Rocky Linux 基本系统

要安装 Rocky Linux 9 用户空间，可执行以下命令：

```sh
# pkg install linux_base-rl9
```

[emulators/linux\_base-rl9](https://cgit.freebsd.org/ports/tree/emulators/linux_base-rl9/) 会将源自 Rocky Linux 9 的基本系统放置在 **/compat/linux** 目录中。

安装该软件包后，可通过以下命令确认 Rocky Linux 用户空间是否已安装到 **/compat/linux** 目录：

```sh
# ls -l /compat/linux/
```

输出应类似于：

```sh
total 36
drwxr-xr-x   2 root wheel  512 Oct  9 17:28 afs
lrwxr-xr-x   1 root wheel    7 May 16  2022 bin -> usr/bin
drwxr-xr-x   3 root wheel  512 Oct  9 17:28 dev
drwxr-xr-x  24 root wheel 1536 Oct  9 17:28 etc
lrwxr-xr-x   1 root wheel    7 May 16  2022 lib -> usr/lib
lrwxr-xr-x   1 root wheel    9 May 16  2022 lib64 -> usr/lib64
drwxr-xr-x   2 root wheel  512 Oct  9 17:28 opt
drwxr-xr-x   2 root wheel  512 Oct  9 17:28 proc
lrwxr-xr-x   1 root wheel    8 Oct  1 03:11 run -> /var/run
lrwxr-xr-x   1 root wheel    8 May 16  2022 sbin -> usr/sbin
drwxr-xr-x   2 root wheel  512 Oct  9 17:28 srv
drwxr-xr-x   2 root wheel  512 Oct  9 17:28 sys
drwxr-xr-x   8 root wheel  512 Oct  9 17:28 usr
drwxr-xr-x  16 root wheel  512 Oct  9 17:28 var
```

## 12.3.2. 来自 FreeBSD 软件包的 CentOS 基本系统

> **警告**
>
> 由于上游项目已停止维护，[emulators/linux\_base-c7](https://cgit.freebsd.org/ports/tree/emulators/linux_base-c7/) 也已弃用，因此将不再收到安全更新。除非需要 32 位兼容性，否则建议使用 [Rocky Linux 基本系统](/di-12-zhang-linux-er-jin-zhi-jian-rong-ceng/12.3.-linux-yong-hu-kong-jian)。

要安装 CentOS 用户空间，可执行以下命令：

```sh
# pkg install linux_base-c7
```

[emulators/linux\_base-c7](https://cgit.freebsd.org/ports/tree/emulators/linux_base-c7/) 会将源自 CentOS 7 的基本系统放置在 **/compat/linux** 中。

安装完成后，可通过以下命令验证 CentOS 用户空间是否已安装：

```sh
# ls -l /compat/linux/
```

输出应类似于：

```sh
total 30
lrwxr-xr-x   1 root  wheel    7 Apr 11  2018 bin -> usr/bin
drwxr-xr-x  13 root  wheel  512 Apr 11 21:10 dev
drwxr-xr-x  25 root  wheel   64 Apr 11 21:10 etc
lrwxr-xr-x   1 root  wheel    7 Apr 11  2018 lib -> usr/lib
lrwxr-xr-x   1 root  wheel    9 Apr 11  2018 lib64 -> usr/lib64
drwxr-xr-x   2 root  wheel    2 Apr 11 21:10 opt
dr-xr-xr-x   1 root  wheel    0 Apr 11 21:25 proc
lrwxr-xr-x   1 root  wheel    8 Feb 18 02:10 run -> /var/run
lrwxr-xr-x   1 root  wheel    8 Apr 11  2018 sbin -> usr/sbin
drwxr-xr-x   2 root  wheel    2 Apr 11 21:10 srv
dr-xr-xr-x   1 root  wheel    0 Apr 11 21:25 sys
drwxr-xr-x   8 root  wheel    9 Apr 11 21:10 usr
drwxr-xr-x  16 root  wheel   17 Apr 11 21:10 var
```

## 12.3.3. 使用 debootstrap 的 Debian / Ubuntu 基本系统

另一种提供 Linux 共享库的方式是使用 [sysutils/debootstrap](https://cgit.freebsd.org/ports/tree/sysutils/debootstrap/)，它的优点是可以提供完整的 Debian 或 Ubuntu 发行版。

安装 debootstrap 的命令如下：

```sh
# pkg install debootstrap
```

[debootstrap(8)](https://man.freebsd.org/cgi/man.cgi?query=debootstrap\&sektion=8\&format=html) 需要启用 [linux(4)](https://man.freebsd.org/cgi/man.cgi?query=linux\&sektion=4\&format=html) ABI。启用后，可使用以下命令在 **/compat/ubuntu** 中安装 Ubuntu 或 Debian：

```sh
# debootstrap jammy /compat/ubuntu
```

> **注意**
>
> 虽然技术上可以安装到 **/compat/linux**，但由于可能与基于 CentOS 的软件包发生冲突，不建议这么做。应使用基于发行版或版本名的路径，例如 **/compat/ubuntu**。

输出应类似于：

```sh
I: Retrieving InRelease
I: Checking Release signature
I: Valid Release signature (key id F6ECB3762474EDA9D21B7022871920D1991BC93C)
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Checking component main on http://archive.ubuntu.com/ubuntu...
[...]
I: Configuring console-setup...
I: Configuring kbd...
I: Configuring ubuntu-minimal...
I: Configuring libc-bin...
I: Configuring ca-certificates...
I: Base system installed successfully.
```

然后在 **/etc/fstab** 中设置挂载点。

> **技巧**
>
> 如果希望共享 home 目录的内容并运行 X11 应用程序，应使用 [nullfs(5)](https://man.freebsd.org/cgi/man.cgi?query=nullfs\&sektion=5\&format=html) 以回环方式挂载，将 **/home** 和 **/tmp** 挂载到 Linux 兼容区中。
>
> 可以将以下示例添加到 **/etc/fstab**：
>
> ```ini
> # Device        Mountpoint              FStype          Options                      Dump    Pass#
> devfs           /compat/ubuntu/dev      devfs           rw,late                      0       0
> tmpfs           /compat/ubuntu/dev/shm  tmpfs           rw,late,size=1g,mode=1777    0       0
> fdescfs         /compat/ubuntu/dev/fd   fdescfs         rw,late,linrdlnk             0       0
> linprocfs       /compat/ubuntu/proc     linprocfs       rw,late                      0       0
> linsysfs        /compat/ubuntu/sys      linsysfs        rw,late                      0       0
> /tmp            /compat/ubuntu/tmp      nullfs          rw,late                      0       0
> /home           /compat/ubuntu/home     nullfs          rw,late                      0       0
> ```
>
> 然后执行 [mount(8)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=8\&format=html)：
>
> ```sh
> # mount -al
> ```

要使用 [chroot(8)](https://man.freebsd.org/cgi/man.cgi?query=chroot\&sektion=8\&format=html) 进入系统，可执行：

```sh
# chroot /compat/ubuntu /bin/bash
```

然后可通过 [uname(1)](https://man.freebsd.org/cgi/man.cgi?query=uname\&sektion=1\&format=html) 检查当前 Linux 环境：

```sh
# uname -s -r -m
```

输出应类似于：

```sh
Linux 5.15.0 x86_64
```

进入 chroot 后，系统行为与普通 Ubuntu 安装基本一致。尽管 systemd 不可用，但 [service(8)](https://man.freebsd.org/cgi/man.cgi?query=service\&sektion=8\&format=html) 命令仍可照常使用。

> **技巧**
>
> 要添加默认缺失的软件包存储库，请编辑文件 **/compat/ubuntu/etc/apt/sources.list**。
>
> 对于 amd64，可以使用以下示例：
>
> ```ini
> deb http://archive.ubuntu.com/ubuntu jammy main universe restricted multiverse
> deb http://security.ubuntu.com/ubuntu/ jammy-security universe multiverse restricted main
> deb http://archive.ubuntu.com/ubuntu jammy-backports universe multiverse restricted main
> deb http://archive.ubuntu.com/ubuntu jammy-updates universe multiverse restricted main
> ```
>
> arm64 可使用以下示例：
>
> ```ini
> deb http://ports.ubuntu.com/ubuntu-ports bionic main universe restricted multiverse
> ```


# 12.4.高级主题

所有与 Linux 相关的 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html) 控制项列表可以在 [linux(4)](https://man.freebsd.org/cgi/man.cgi?query=linux\&sektion=4\&format=html) 中找到。

某些应用程序需要挂载特定的文件系统。

这通常由 **/etc/rc.d/linux** 脚本处理，但可通过执行以下命令在启动时禁用此功能：

```sh
sysrc linux_mounts_enable="NO"
```

由 rc 脚本挂载的文件系统对于 chroot 或 jail 中的 Linux 进程无效；如有需要，请在 **/etc/fstab** 中配置：

```sh
devfs      /compat/linux/dev      devfs      rw,late                    0  0
tmpfs      /compat/linux/dev/shm  tmpfs      rw,late,size=1g,mode=1777  0  0
fdescfs    /compat/linux/dev/fd   fdescfs    rw,late,linrdlnk           0  0
linprocfs  /compat/linux/proc     linprocfs  rw,late                    0  0
linsysfs   /compat/linux/sys      linsysfs   rw,late                    0  0
```

由于 Linux 二进制兼容层已经支持运行 32 位与 64 位 Linux 二进制文件，因此无法再将仿真功能静态链接进定制内核中。

## 12.4.1. 手动安装额外的库文件

> **注意**
>
> 对于使用 [debootstrap(8)](https://man.freebsd.org/cgi/man.cgi?query=debootstrap\&sektion=8\&format=html) 创建的基本系统子目录，请改为参照上文说明。

如果在配置好 Linux 二进制兼容层后某个 Linux 应用程序仍报告缺少共享库，请手动确定该 Linux 二进制程序所需的共享库并安装它们。

可以在使用相同 CPU 架构的 Linux 系统中使用 `ldd` 来确定该程序依赖哪些共享库。

例如，要查看 `linuxdoom` 所需的共享库，可在已安装 Doom 的 Linux 系统中运行以下命令：

```sh
% ldd linuxdoom
```

输出应类似如下：

```sh
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 系统上生成如下文件：

```sh
/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
```

如果某个 Linux 共享库已经存在，并且其主版本号与 `ldd` 输出中第一列相匹配，则无需复制输出中最后一列所指向的文件，因为已有的库通常可以正常工作。但如果复制的是更新版本的库，建议仍替换。只要符号链接指向新版本，就可以删除旧版本。

例如，FreeBSD 系统上已有以下库：

```sh
/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
```

而 `ldd` 显示某个程序需要较新的版本：

```sh
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
```

由于已有的库版本只是在末尾小数字位相差一两个版本，该程序应仍然可以使用这个稍旧的版本。但使用更新版本替换已有的 **libc.so** 是安全的：

```sh
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
```

通常，在最初几次在 FreeBSD 上安装 Linux 程序时，才需要检查其依赖的共享库。随着系统上积累的 Linux 共享库越来越多，今后安装的新 Linux 程序通常就可以直接运行，无需额外处理。

## 12.4.2. 为 Linux ELF 二进制文件添加品牌标记

FreeBSD 内核使用多种方式判断待执行的可执行文件是否为 Linux 程序：它会检查 ELF 文件头中的品牌标记，查找已知的 ELF 解释器路径，并检查 ELF 注记；最后，默认情况下，如果 ELF 可执行文件没有品牌标记，也会认为是 Linux 程序。

如果以上方法全部失败，尝试执行该程序时可能会出现如下错误信息：

```sh
% ./my-linux-elf-binary
```

输出可能如下：

```sh
ELF binary type not known
Abort
```

为了帮助 FreeBSD 内核区分 FreeBSD ELF 可执行文件与 Linux 可执行文件，可使用 [brandelf(1)](https://man.freebsd.org/cgi/man.cgi?query=brandelf\&sektion=1\&format=html) 命令：

```sh
% brandelf -t Linux my-linux-elf-binary
```

## 12.4.3. 安装基于 Linux RPM 的应用程序

要安装基于 Linux 的 RPM 应用程序，首先安装软件包或 Port [archivers/rpm4](https://cgit.freebsd.org/ports/tree/archivers/rpm4/)。待安装完成，`root` 用户可使用以下命令安装 **.rpm** 文件：

```sh
# cd /compat/linux
# rpm2cpio < /path/to/linux.archive.rpm | cpio -id
```

如有必要，请对安装后的 ELF 可执行文件使用 `brandelf`。注意，这样做将无法实现干净的卸载。

## 12.4.4. 配置主机名解析器

如果 DNS 无法使用，或者出现如下错误：

```sh
resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword
```

请按如下方式配置 **/compat/linux/etc/host.conf**：

```ini
order hosts, bind
multi on
```

这表示先查找 **/etc/hosts**，然后再使用 DNS。当 **/compat/linux/etc/host.conf** 不存在时，Linux 应用程序会使用主系统中的 **/etc/host.conf**，但该文件在 FreeBSD 中默认不存在，因此会报错。如果没有使用 **/etc/resolv.conf** 配置名称服务器，请去掉 `bind`。

## 12.4.5. 其他信息

关于 Linux® 二进制兼容的工作机制，更多信息可参见文章 [Linux emulation in FreeBSD](https://docs.freebsd.org/en/articles/linux-emulation/)。




---

[Next Page](/llms-full.txt/1)

