# 9.3 打印机

CUPS（通用 Unix 打印系统，Common Unix Printing System）是一种模块化的打印系统架构，支持多种打印协议和打印机设备，并可将打印机通过 IPP（互联网打印协议，Internet Printing Protocol）或 SMB（服务器消息块，Server Message Block）协议共享到网络中。

打印机通过 USB（通用串行总线，Universal Serial Bus）总线接入打印服务器（即 FreeBSD 系统）。打印服务器将打印机共享到局域网中，供局域网内的设备使用。局域网中的其他计算机可通过发送多播数据包，利用零配置网络技术自动查询局域网中可用的打印机。

已在 Android、Apple、Debian 等平台上测试通过，上述系统均可正常发现并使用该打印服务器。

## 安装 CUPS（通用 Unix 打印系统）

* 使用 pkg（二进制包管理器）安装：

```sh
# pkg install cups cups-filters
```

* 或使用 Ports（源码包管理器）安装：

```sh
# cd /usr/ports/print/cups/ && make install clean
# cd /usr/ports/print/cups-filters/ && make install clean
```

> **技巧**
>
> 若使用桌面环境，请在 Ports 选项界面中选中 `x11` 编译选项，可在系统中生成添加和配置打印机的图形化应用图标。

软件包说明：

| 软件包            | 作用说明                                      |
| -------------- | ----------------------------------------- |
| `cups`         | 用于提供 CUPS 核心打印服务                          |
| `cups-filters` | 用于支持免驱动打印机（即 IPP Everywhere 协议）           |
| `dbus`         | Avahi 需要，作为 CUPS 依赖自动安装                   |
| `avahi-app`    | Avahi 所需组件，作为 CUPS 的依赖自动安装，用于局域网中的打印机自动发现 |

> **技巧**
>
> 本文介绍将 FreeBSD 配置为打印服务器。若 FreeBSD 仅作为打印客户端，通过 USB 本地连接打印机进行打印，而不需要共享打印服务，则 avahi-app 和 dbus 并非必需组件。

> **注意**
>
> 若打印机不支持免驱动打印，则需要安装对应的厂商驱动程序。

## 添加服务

将 D-Bus（进程间通信总线，D-Bus）、avahi‑daemon（Avahi 守护进程）和 cupsd（CUPS 守护进程）服务设置为系统启动时自动启用，以确保打印服务及其自动发现功能在系统重启后仍可正常使用：

```sh
# service dbus enable           # 设置 D‑Bus 服务开机自启动
# service avahi-daemon enable   # 设置 Avahi 守护进程开机自启动（用于网络服务发现）
# service cupsd enable          # 设置 CUPS 打印服务开机自启动
```

启动服务后，其他设备应能够自动发现内网中的共享打印机。尝试打印测试页，测试能否正常打印。

## 向局域网共享打印服务

若未设置“允许局域网访问”，则除本地回环地址 `localhost` 外的其他主机将无法使用该打印服务。

编辑 CUPS 主配置文件 `/usr/local/etc/cups/cupsd.conf`：

```sh
/usr/local/
├── etc/
│   └── cups/
│       └── cupsd.conf # CUPS 主配置文件
└── var/
    └── run/
        └── cups/
            └── cups.sock # CUPS UNIX 套接字
```

* 在现有的监听配置段

```ini
Listen localhost:631
Listen /var/run/cups/cups.sock
```

后面添加以下配置（其中 IP 替换为你的 FreeBSD 系统的局域网 IP 地址）：

```ini
Listen IP:631
```

作用：指定 CUPS 打印服务监听的网络接口 IP 地址和端口号（631 是 IPP 协议的标准默认端口）。

* 再将

```ini
# Restrict access to the server...
<Location />
  Order allow,deny
</Location>

# Restrict access to the admin pages...
<Location /admin>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
</Location>
```

改为

```ini
# Restrict access to the server...
<Location />
  Allow from 192.168.0.0/24   # 允许访问的 IP 网段
  Order allow,deny
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Allow from 192.168.0.0/24   # 允许访问的 IP 网段
  AuthType Default             # 使用默认认证类型
  Require user @SYSTEM         # 仅系统用户可访问
  Order allow,deny
</Location>
```

如此 CUPS 管理页面即可从局域网内远程访问。

## 添加打印机

在浏览器中输入 `http://IP:631`，该地址为打印服务器的管理页面。

![CUPS 管理页面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-a53779669103c06a1eabcf8824dc2c34d8a54677%2Fcup1.png?alt=media)

点击 `Administration-Add Printer`，根据提示创建打印机。

过程中会提示输入账号和密码，使用 `root` 用户或 `wheel` 组内的用户登录（输入其在 FreeBSD 系统中的账户密码）即可。

![添加打印机](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-14457deedc7e523a209ca6a3583c7bc14d8cae59%2Fcup2.png?alt=media)

点击 `Add Printer`，添加打印机。

![选择打印机](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-97ff602af3bbc1714e3e68310210391a00495dfc%2Fcup3.png?alt=media)

本文中使用的打印机型号为 Brother HL L3228CDW。

![打印机详情](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-773dd3ecf10681f4d818bba1aafbaba1d09114ff%2Fcup4.png?alt=media)

在创建时，请务必勾选 `Share This Printer`。

![共享打印机](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-b0d92fc0982c4cce82aea4e93fe4cba9c6bd1ebc%2Fcup5.png?alt=media)

选择型号。

![选择型号](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-14271f47ccf6072e9f21a61bb12be21228494c06%2Fcup6.png?alt=media)

如果打印机支持免驱动打印，`Model` 请选择 `Generic IPP Everywhere Printer (en)`；否则需要安装相应驱动，并选择对应的打印机型号。

![打印机配置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-a5c40578e9af06adb792bab64417532e24e933b0%2Fcup7.png?alt=media)

成功添加打印机！

![添加成功](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-f89a6ff5b909b4774d63d3bbca8facb819b1d62c%2Fcup8.png?alt=media)

## KDE 桌面添加打印机

无需额外操作，需要打印的设备通常可自动发现打印服务器，并自动将其加入打印机列表，在打印文件时即可选择。例如在 KDE 桌面上：

![KDE 打印机列表](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-9b993eeeb00d49593cb57868a1bca64bbc55a30c%2Fcup10.png?alt=media)

![KDE 打印机详情](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-6216b5fb188b8a42cc67c3f9078c984487a9dac8%2Fcup11.png?alt=media)

## 打印测试页

从内网的 Debian 机器打印测试页：

![测试页打印](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-449bdf13ca7e91b37c3aa55c6408a8bc13316efc%2Fcup12.jpg?alt=media)

## 故障排除与未竟事项

### 打印机免驱动支持问题

要确认打印机是否免驱动，可以在 OpenPrinting. Find a Driverless Printer\[EB/OL]. \[2026-03-25]. <https://openprinting.github.io/printers/> 查询。以本文使用打印机为例：

![OpenPrinting 查询](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-a3bfed7f2a92f12695f9987079e70c35a86ede1e%2Fcup9.png?alt=media)

惠普（HP）打印机可通过安装 Port `print/hplip` 获得支持。

### FreeBSD 打印的测试页示例

尚待测试。

## 课后习题

1. 配置 CUPS 打印服务器并打印 FreeBSD 测试页，分析测试页内容如何反映打印系统的配置状态，并复现从局域网不同设备打印的完整流程。
2. 重构 CUPS 配置中最小化的网络访问控制机制，分析该机制如何在“打印便利性”与“网络安全性”之间做权衡，以及用户权限如何被 CUPS 所约束。
3. 修改 CUPS 默认的监听地址和访问控制策略，使其仅允许特定 IP 访问，验证其行为变化。
