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

CUPS 打印服务完全指南 / 第 1 章:CUPS 简介与架构

第 1 章:CUPS 简介与架构

CUPS(Common UNIX Printing System)是 Unix/Linux 世界中最重要的打印服务框架。本章将从历史背景出发,深入解析其架构设计、核心协议以及适用场景。


1.1 CUPS 的历史与发展

1.1.1 诞生背景

在 CUPS 出现之前,Unix 系统的打印管理是一个碎片化的领域:

时期打印系统主要问题
1970s-1980sLPD (Line Printer Daemon)功能简单,不支持现代打印机
1980s-1990sLPRng改进了 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.01999基本打印操作
IPP 1.12000增强的安全性和管理操作
IPP 2.02005增加作业管理操作
IPP 2.12010增强的打印机发现
IPP 2.22015IPP Everywhere、AirPrint
IPP 2.32020增强的系统管理

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 打印系统
核心协议IPPSMB/CIFS + IPP
驱动模型PPD 文件 + 过滤器打印驱动程序
管理界面Web 界面 (http://localhost:631)控制面板 + MMC
打印队列/var/spool/cups/C:\Windows\System32\spool\
配置文件/etc/cups/注册表 + 配置文件
命令行lp, lpr, lpstatPowerShell, net print
共享协议IPP, DNS-SD, SMBSMB/CIFS
安全模型UNIX 权限 + TLSWindows 认证 + 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官方权威文档
OpenPrintinghttps://www.openprinting.org/打印机兼容性数据库
IPP 协议规范https://www.pwg.org/ipp/IPP 协议标准文档
CUPS GitHubhttps://github.com/OpenPrinting/cups源代码和问题跟踪
Arch Wiki CUPShttps://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 打印架构,说明需要哪些组件和配置。