强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

CUPS 打印服务完全指南 / 第 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 的成功源于以下几个核心设计理念:

  1. 标准化 - 基于 IPP(Internet Printing Protocol)标准
  2. 模块化 - 过滤器和后端可扩展
  3. 易用性 - 提供 Web 管理界面
  4. 兼容性 - 支持几乎所有打印机品牌
  5. 网络化 - 原生支持网络打印和共享

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界面       配额检查        应用水印/选项   完成通知

详细流程

  1. 提交阶段

    # 用户提交打印任务
    lp -d myprinter document.pdf
    
    # CUPS 客户端通过 IPP 将任务发送到 cupsd
    # cupsd 验证用户权限和打印机状态
    
  2. 处理阶段

    # cupsd 将任务加入队列
    # 任务状态: pending → processing
    
    # 查看任务状态
    lpstat -o
    # 输出: myprinter-123  user  1024  Thu 10 May 2026 09:00:00 AM
    
  3. 转换阶段

    # cupsd 确定输入 MIME 类型
    # 查找合适的过滤器链
    # 执行过滤器转换
    
    # 示例:PDF 转换为打印机可接受格式
    # document.pdf → pdftops → document.ps → [打印机驱动] → 光栅数据
    
  4. 输出阶段

    # 后端将数据发送到打印机
    # 任务状态: 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 练习题

  1. 概念题:简述 CUPS 的四层架构及其各层的主要功能。

  2. 实操题:在你的 Linux 系统上检查 CUPS 版号,并确认 cupsd 服务是否正在运行。

  3. 思考题:为什么 CUPS 选择 IPP 协议而不是直接使用 SMB/CIFS?

  4. 对比题:列出 CUPS 和 Windows 打印系统在驱动管理方面的三个主要区别。

  5. 场景题:为一个 50 人的小型办公室设计 CUPS 打印架构,说明需要哪些组件和配置。