第 1 章:CUPS 简介与架构
第 1 章:CUPS 简介与架构
CUPS(Common UNIX Printing System)是 Unix/Linux 世界中最重要的打印服务框架。本章将从历史背景出发,深入解析其架构设计、核心协议以及适用场景。
1.1 CUPS 的历史与发展
1.1.1 诞生背景
在 CUPS 出现之前,Unix 系统的打印管理是一个碎片化的领域:
| 时期 | 打印系统 | 主要问题 |
|---|---|---|
| 1970s-1980s | LPD (Line Printer Daemon) | 功能简单,不支持现代打印机 |
| 1980s-1990s | LPRng | 改进了 LPD,但配置复杂 |
| 1999 年 | CUPS 发布 | 统一的打印框架 |
| 2007 年 | CUPS 被 Apple 收购 | 获得商业支持 |
| 2019 年 | Apple 将 CUPS 移交给 OpenPrinting | 社区主导开发 |
| 2020 年至今 | CUPS 2.x / 3.x 开发中 | 支持 IPP Everywhere |
1.1.2 关键里程碑
1999 ──── Easy Software Products (Michael Sweet) 创建 CUPS
│
2002 ──── CUPS 1.1 成为大多数 Linux 发行版默认打印系统
│
2007 ──── Apple Inc. 收购 CUPS
│
2008 ──── CUPS 1.4 引入 USB 打印机自动检测
│
2012 ──── CUPS 1.6 移除 Browse 协议,推荐 DNS-SD
│
2017 ──── CUPS 2.2 引入 IPP Everywhere 支持
│
2019 ──── Apple 将 CUPS 源码移交给 OpenPrinting
│
2020 ──── CUPS 2.3 发布,增强安全特性
│
2022 ──── CUPS 2.4 发布,改进 TLS 支持
│
2024+ ─── CUPS 3.0 开发中,架构重大重构
1.1.3 CUPS 的核心价值
CUPS 的成功源于以下几个核心设计理念:
- 标准化 - 基于 IPP(Internet Printing Protocol)标准
- 模块化 - 过滤器和后端可扩展
- 易用性 - 提供 Web 管理界面
- 兼容性 - 支持几乎所有打印机品牌
- 网络化 - 原生支持网络打印和共享
1.2 CUPS 打印架构详解
1.2.1 整体架构
CUPS 采用分层架构设计,从上到下分为四层:
┌─────────────────────────────────────────────────────────┐
│ 客户端接口层 (Client Interface) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Web 界面 │ │ CLI 工具 │ │ GUI 应用 │ │ IPP API │ │
│ │ :631 │ │lp/lpr/ │ │打印对话框 │ │libcups │ │
│ │ │ │lpstat等 │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 调度器层 (Scheduler) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ cupsd 守护进程 │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │HTTP/IPP 服务│ │任务调度器 │ │配置管理器 │ │ │
│ │ │(端口 631) │ │(Job Queue) │ │(conf files)│ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 过滤器层 (Filter System) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ MIME 类型转换链 │ │
│ │ │ │
│ │ application/pdf ──┐ │ │
│ │ ├──→ pdftops ──→ 应用/postscript│ │
│ │ │ │ │
│ │ image/jpeg ───────┤ │ │
│ │ ├──→ imagetoraster ──→ 应用/ │ │
│ │ text/plain ───────┤ vnd.cups-raster │ │
│ │ │ │ │
│ │ text/html ────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 后端层 (Backend) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ usb │ │ socket │ │ ipp │ │ lpd │ │
│ │ (USB) │ │ (TCP/IP) │ │ (IPP/IPPS)│ │ (LPD) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ hp │ │ beh │ │ snmp │ │ dnssd │ │
│ │(HP PPA) │ │(后备) │ │(SNMP发现)│ │(DNS-SD) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
1.2.2 核心组件详解
cupsd 守护进程
cupsd 是 CUPS 的核心守护进程,负责:
# 查看 cupsd 进程
ps aux | grep cupsd
# 输出示例:
# root 1234 0.0 0.1 12345 6789 ? Ss 09:00 0:00 /usr/sbin/cupsd -l
主要职责:
| 功能 | 说明 |
|---|---|
| HTTP 服务 | 提供 Web 管理界面(端口 631) |
| IPP 服务 | 处理 IPP 打印请求 |
| 任务管理 | 管理打印队列和任务调度 |
| 配置管理 | 读取和应用配置文件 |
| 访问控制 | 实施安全策略和认证 |
过滤器系统 (Filter System)
过滤器是 CUPS 最强大的特性之一,负责文档格式转换:
# 查看已注册的过滤器
lpfilter -f application-pdf -l
# 查看所有 MIME 类型转换规则
cat /etc/cups/mime.types
# 查看转换规则
cat /etc/cups/mime.convs
过滤器工作流程:
输入文档 → [MIME 类型检测] → [过滤器链转换] → [打印机可接受格式]
│ │ │ │
│ │ │ │
PDF文件 application/pdf pdftops/rastertopdf PostScript
JPEG文件 image/jpeg imagetoraster CUPS Raster
文本文件 text/plain texttops PostScript
后端 (Backend)
后端负责与实际打印设备通信:
# 查看可用后端
ls /usr/lib/cups/backend/
# 常见后端说明
# usb - USB 打印机
# socket - TCP/IP 套接字连接
# ipp - IPP/IPPS 网络打印
# lpd - LPD 协议
# snmp - SNMP 打印机发现
# dnssd - DNS-SD/Bonjour 发现
# parallel - 并口打印机(已过时)
# serial - 串口打印机(已过时)
1.2.3 打印任务生命周期
一个打印任务从提交到完成,经历以下阶段:
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 提交 │───▶│ 处理 │───▶│ 转换 │───▶│ 输出 │
│ (Submit) │ │(Process) │ │(Convert) │ │ (Output) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
│ │ │ │
│ │ │ │
lp/lpr命令 任务进入队列 过滤器转换格式 后端发送数据
应用程序 优先级排序 生成光栅数据 打印机打印
Web界面 配额检查 应用水印/选项 完成通知
详细流程:
提交阶段
# 用户提交打印任务 lp -d myprinter document.pdf # CUPS 客户端通过 IPP 将任务发送到 cupsd # cupsd 验证用户权限和打印机状态处理阶段
# cupsd 将任务加入队列 # 任务状态: pending → processing # 查看任务状态 lpstat -o # 输出: myprinter-123 user 1024 Thu 10 May 2026 09:00:00 AM转换阶段
# cupsd 确定输入 MIME 类型 # 查找合适的过滤器链 # 执行过滤器转换 # 示例:PDF 转换为打印机可接受格式 # document.pdf → pdftops → document.ps → [打印机驱动] → 光栅数据输出阶段
# 后端将数据发送到打印机 # 任务状态: processing → completed # 查看完成的任务 lpstat -W completed
1.3 IPP 协议基础
1.3.1 什么是 IPP
IPP(Internet Printing Protocol)是 CUPS 的核心协议,基于 HTTP/1.1 构建:
┌─────────────────────────────────────────┐
│ IPP 协议栈 │
│ ┌─────────────────────────────────┐ │
│ │ IPP 消息格式 │ │
│ │ (Operation + Attributes) │ │
│ ├─────────────────────────────────┤ │
│ │ HTTP/1.1 传输层 │ │
│ │ (请求/响应模型) │ │
│ ├─────────────────────────────────┤ │
│ │ TLS/SSL (可选) │ │
│ │ (加密传输) │ │
│ ├─────────────────────────────────┤ │
│ │ TCP/IP │ │
│ │ (端口 631) │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
1.3.2 IPP 版本演进
| 版本 | 发布年份 | 主要特性 |
|---|---|---|
| IPP 1.0 | 1999 | 基本打印操作 |
| IPP 1.1 | 2000 | 增强的安全性和管理操作 |
| IPP 2.0 | 2005 | 增加作业管理操作 |
| IPP 2.1 | 2010 | 增强的打印机发现 |
| IPP 2.2 | 2015 | IPP Everywhere、AirPrint |
| IPP 2.3 | 2020 | 增强的系统管理 |
1.3.3 IPP 核心操作
# IPP 操作示例(使用 ipptool)
# 1. 查询打印机属性
ipptool -tv ipp://localhost/printers/myprinter get-printer-attributes.test
# 2. 提交打印任务
ipptool -tv ipp://localhost/printers/myprinter \
-d file:///path/to/document.pdf \
print-job.test
# 3. 查询任务状态
ipptool -tv ipp://localhost/jobs/123 get-job-attributes.test
# 4. 取消任务
ipptool -tv ipp://localhost/jobs/123 cancel-job.test
常用 IPP 操作:
| 操作 | 说明 | 用途 |
|---|---|---|
Print-Job | 提交单个文档打印 | 基本打印 |
Create-Job + Send-Document | 分步提交大文档 | 大文件打印 |
Cancel-Job | 取消打印任务 | 任务管理 |
Get-Job-Attributes | 查询任务属性 | 状态监控 |
Get-Printers | 列出所有打印机 | 打印机发现 |
CUPS-Get-Default | 获取默认打印机 | 配置查询 |
CUPS-Add-Modify-Printer | 添加/修改打印机 | 管理操作 |
1.3.4 IPP 消息格式
IPP 消息由三部分组成:
┌─────────────────────────────────────┐
│ IPP 消息头 (2-3 字节) │
│ - 版本号 (2 字节) │
│ - 操作码/状态码 (2 字节) │
│ - 请求 ID (4 字节) │
├─────────────────────────────────────┤
│ 属性组 │
│ - operation-attributes-group │
│ - job-attributes-group │
│ - printer-attributes-group │
├─────────────────────────────────────┤
│ 数据 (可选) │
│ - 打印文档内容 │
└─────────────────────────────────────┘
1.4 CUPS 与 Windows 打印系统对比
1.4.1 架构对比
| 特性 | CUPS (Linux) | Windows 打印系统 |
|---|---|---|
| 核心协议 | IPP | SMB/CIFS + IPP |
| 驱动模型 | PPD 文件 + 过滤器 | 打印驱动程序 |
| 管理界面 | Web 界面 (http://localhost:631) | 控制面板 + MMC |
| 打印队列 | /var/spool/cups/ | C:\Windows\System32\spool\ |
| 配置文件 | /etc/cups/ | 注册表 + 配置文件 |
| 命令行 | lp, lpr, lpstat | PowerShell, net print |
| 共享协议 | IPP, DNS-SD, SMB | SMB/CIFS |
| 安全模型 | UNIX 权限 + TLS | Windows 认证 + TLS |
1.4.2 详细对比
驱动管理
# CUPS: 使用 PPD 文件定义打印机能力
# /etc/cups/ppd/myprinter.ppd
*PPD-Adobe: "4.3"
*ModelName: "HP LaserJet Pro M404"
*NickName: "HP LaserJet Pro M404"
*PCFileName: "hpljpro404.ppd"
# Windows: 使用专用驱动程序
Get-PrinterDriver | Select Name, Manufacturer, PrinterEnvironment
# 安装驱动通常需要厂商提供的 EXE/INF 文件
网络发现
# CUPS: 使用 DNS-SD (Bonjour) 发现打印机
avahi-browse -t -r _ipp._tcp
# 输出: + eth0 IPv4 HP LaserJet Pro M404 @ server1 Internet Printer local
# CUPS 2.2+: 使用 IPP Everywhere 发现
ippfind
# 输出: ipp://192.168.1.100/ipp/print
# Windows: 使用网络发现
Get-Printer | Where-Object {$_.Type -eq "Network"}
# 或通过"添加打印机"向导自动发现
1.4.3 互操作性
CUPS 和 Windows 可以通过以下方式互操作:
# Linux 共享打印机给 Windows
# 1. 安装 Samba
sudo apt install samba
# 2. 配置 /etc/samba/smb.conf
[printers]
comment = All Printers
browseable = no
path = /var/spool/samba
printable = yes
guest ok = no
read only = yes
create mask = 0700
# 3. 重启 Samba
sudo systemctl restart smbd
# Windows 连接到 Linux CUPS 打印机
# 方法1: 通过 IPP
Add-Printer -Name "LinuxPrinter" -DriverName "Generic / Text Only" `
-PortName "IP_192.168.1.100" -PortNumber 631
# 方法2: 通过 Samba 共享
# 在"添加打印机"中选择 \\linux-server\printer
1.5 CUPS 适用场景
1.5.1 典型应用场景
场景一:小型办公环境
┌─────────────────────────────────────────┐
│ 小型办公室网络 (10-50 人) │
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 工作站1 │ │ 工作站2 │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ └───────┬───────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ CUPS 服务器 │ │
│ │ (集中管理) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌──────────┼──────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │打印机1│ │打印机2│ │打印机3│ │
│ └──────┘ └──────┘ └──────┘ │
└─────────────────────────────────────────┘
配置要点:
- 集中式 CUPS 服务器管理所有打印机
- 配置 DNS-SD 自动发现
- 设置基本的访问控制
- 启用打印配额管理
场景二:企业级打印服务
┌─────────────────────────────────────────────────────┐
│ 企业网络 (500+ 用户) │
│ │
│ ┌───────────────────────────────────────────────┐ │
│ │ Active Directory │ │
│ │ (用户认证和权限管理) │ │
│ └───────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │CUPS 服务器│ │CUPS 服务器│ │CUPS 服务器│ │
│ │ (主) │ │ (备) │ │ (区域) │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └──────────────┼──────────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │打印池1│ │打印池2│ │打印池3│ │
│ └──────┘ └──────┘ └──────┘ │
└─────────────────────────────────────────────────────┘
配置要点:
- LDAP/AD 集成认证
- 高可用性配置(主备)
- TLS 加密传输
- 审计日志记录
- 打印配额和计费
场景三:开发/测试环境
# 使用虚拟打印机进行开发测试
# 创建 PDF 虚拟打印机
lpadmin -p PDF-Printer -v cups-pdf:/ -E \
-P /usr/share/ppd/cups-pdf/CUPS-PDF.ppd
# 所有"打印"输出为 PDF 文件
# 输出目录: /var/spool/cups-pdf/$USER/
1.5.2 不适用场景
| 场景 | 原因 | 替代方案 |
|---|---|---|
| Windows 为主网络 | 域管理复杂 | Windows Print Server |
| 大规模商业印刷 | 专业需求 | 商业打印管理软件 |
| 高安全要求环境 | 需要额外加固 | 专用安全打印解决方案 |
| 3D 打印 | 完全不同的技术 | OctoPrint, Klipper |
1.5.3 CUPS 版本选择建议
# 查看当前系统 CUPS 版本
cups-config --version
# 或
cupsd --version
# 版本选择建议:
# CUPS 2.3.x - 稳定,推荐生产环境
# CUPS 2.4.x - 最新稳定版,推荐新部署
# CUPS 3.0.x - 开发中,仅用于测试
1.6 实验环境准备
1.6.1 虚拟机环境
# 创建 Ubuntu 22.04 虚拟机
# 推荐配置: 2 CPU, 2GB RAM, 20GB Disk
# 安装必要工具
sudo apt update
sudo apt install -y vim curl wget net-tools
# 验证网络
ping -c 3 archive.ubuntu.com
1.6.2 Docker 环境(快速体验)
# 使用 Docker 快速体验 CUPS
docker run -d \
--name cups-test \
-p 631:631 \
-v /var/run/dbus:/var/run/dbus \
ubuntu:22.04 \
bash -c "apt update && apt install -y cups && cupsd -f"
# 访问 Web 界面
# http://localhost:631
1.7 扩展阅读
推荐资源
| 资源 | 链接 | 说明 |
|---|---|---|
| CUPS 官方文档 | https://www.cups.org/documentation.html | 官方权威文档 |
| OpenPrinting | https://www.openprinting.org/ | 打印机兼容性数据库 |
| IPP 协议规范 | https://www.pwg.org/ipp/ | IPP 协议标准文档 |
| CUPS GitHub | https://github.com/OpenPrinting/cups | 源代码和问题跟踪 |
| Arch Wiki CUPS | https://wiki.archlinux.org/title/CUPS | 详细配置指南 |
相关 RFC 文档
1.8 本章小结
| 主题 | 关键要点 |
|---|---|
| CUPS 历史 | 1999 年创建,2007 年被 Apple 收购,2019 年移交给 OpenPrinting |
| 打印架构 | 四层架构:客户端 → 调度器 → 过滤器 → 后端 |
| IPP 协议 | 基于 HTTP/1.1,标准端口 631,支持 IPP Everywhere |
| Windows 对比 | CUPS 更轻量、标准化;Windows 集成度更高 |
| 适用场景 | 适合 Linux 环境、企业打印管理、开发测试 |
下一章预告:我们将学习如何在 Linux 系统上安装和配置 CUPS,包括 Web 管理界面的使用和打印机驱动的安装。
1.9 练习题
概念题:简述 CUPS 的四层架构及其各层的主要功能。
实操题:在你的 Linux 系统上检查 CUPS 版号,并确认 cupsd 服务是否正在运行。
思考题:为什么 CUPS 选择 IPP 协议而不是直接使用 SMB/CIFS?
对比题:列出 CUPS 和 Windows 打印系统在驱动管理方面的三个主要区别。
场景题:为一个 50 人的小型办公室设计 CUPS 打印架构,说明需要哪些组件和配置。