CUPS 安装部署指南(Ubuntu 22.04 直装实录)

Ubuntu 22.04 直装 CUPS 2.4.1op1 全过程实录:apt 安装、systemd 服务三件套、631→8147 对外监听改造、Location 403 放行、cups-pdf 虚拟队列端到端打印验证,含无 PPD 假成功等四个真实排障现场。

CUPSCUPSUbuntu22.042026/10/28

CUPS 安装部署指南(Ubuntu 22.04 直装实录)

本文是 CUPS 2.4.1op1-1ubuntu4.21(Ubuntu 22.04 官方仓库版本)在 Ubuntu 22.04 服务器上的直装实录:全部命令与回显均来自真机操作,无一处编造。上游最新稳定版为 OpenPrinting CUPS v2.4.20(2026-10-05 发布,查询日期 2026-10-28),发行版版本与上游的差距见文末版本说明。组件定位与选型背景见 《CUPS 介绍与选型指南》,配置文件逐项验证见 《CUPS 配置参数详解》,命令级运维见 《CUPS 常用 CLI 命令详解》。

一、部署架构与前置条件

CUPS 是单守护进程架构,标准部署形态:

浏览器 / 客户端 ──> cupsd (631/8147, IPP + Web 管理界面)
                        └──> backend(cups-pdf:/ usb:/ ipp:/ socket:/ ...)
                                └──> 打印设备(实体机或虚拟输出)
组件实测版本职责
cupsd2.4.1op1-1ubuntu4.21调度器:队列管理、filter 链、IPP 服务、Web 界面
cups-client同上lp/lpstat/lpadmin 等客户端命令
cups-bsd同上Berkeley 命令(lpr/lpq/lprm),可选
printer-driver-cups-pdf3.0.1-14ubuntu0.22.04.1cups-pdf 虚拟打印 backend,本文用于端到端验证

端口说明:CUPS 默认监听 localhost:631(本机管理)。本文将其对外监听改为 8147(实验服务器所在网段规划端口),形成 631(本机)+ 8147(对外)双监听;631 的 IPP 协议职能不变,8147 同样是 IPP + Web 双职能端口。

前置条件清单:

  • Ubuntu 22.04 LTS 服务器一台,root 权限(本文实验机:主机名 cups-lab,内网 IP 10.89.71.2,系统 Ubuntu 22.04.5 LTS);
  • apt 可联网;
  • 磁盘 100 MB 以上即可(CUPS 全家桶 + cups-pdf 安装占用很小)。

二、安装

2.1 版本确认

apt-cache policy cups | head -4

实测回显:

cups:
  Installed: (none)
  Candidate: 2.4.1op1-1ubuntu4.21
  Version table:

2.2 一次装齐

DEBIAN_FRONTEND=noninteractive apt-get install -y -qq cups cups-client cups-pdf

实测回显(摘取末尾关键行):

Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

确认包版本:

dpkg -l | grep -E '^ii  (cups|cups-client|cups-daemon|printer-driver-cups-pdf)'

实测回显:

ii  cups-core-drivers             2.4.1op1-1ubuntu4.21                    amd64        Common UNIX Printing System(tm) - driverless printing
ii  cups-daemon                   2.4.1op1-1ubuntu4.21                    amd64        Common UNIX Printing System(tm) - daemon
ii  printer-driver-cups-pdf       3.0.1-14ubuntu0.22.04.1                 amd64        printer driver for PDF writing via CUPS
ii  cups                          2.4.1op1-1ubuntu4.21                    amd64        Common UNIX Printing System(tm) - PPD/driver support, web interface
ii  cups-client                   2.4.1op1-1ubuntu4.21                    amd64        Common UNIX Printing System(tm) - client programs (SysV)

包拆分说明:cups-daemon(调度器本体)、cups-core-drivers(无驱动打印核心)、cups(聚合包:PPD 支持 + Web 界面)、cups-client(命令行)、printer-driver-cups-pdf(虚拟打印)。装完 cups 后 systemd 单元已就位:

systemctl is-enabled cups
systemctl is-active cups

实测回显:

enabled
active

服务单元由 cups.service + cups.socket + cups.path 三件套组成(socket/path 激活机制),重启命令 systemctl restart cups 会联动三者。

三、初始状态确认

systemctl status cups --no-pager -l | head -12

实测回显:

● cups.service - CUPS Scheduler
     Loaded: loaded (/lib/systemd/system/cups.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2026-10-28 04:29:48 UTC; 1min 48s ago
TriggeredBy: ○ cups.path
             ● cups.socket
       Docs: man:cupsd(8)
   Main PID: 4660 (cupsd)
     Status: "Scheduler is running..."
      Tasks: 1 (limit: 2932)
     Memory: 1.9M
        CPU: 7ms
     CGroup: /system.slice/cups.service

守护进程以 /usr/sbin/cupsd -l 常驻,内存占用约 2 MB——单机打印服务的资源开销几乎可以忽略。

监听端口(默认仅本机):

ss -ltn | grep 631

实测回显:

LISTEN 0      128        127.0.0.1:631        0.0.0.0:*
LISTEN 0      128            [::1]:631           [::]:*

队列初始状态:

lpstat -t

实测回显:

lpstat: No destinations added.
lpstat: No destinations added.
lpstat: No destinations added.
lpstat: No destinations added.
scheduler is running
no system default destination

四、对外监听改造(631 → 8147)

4.1 追加对外监听

cp /etc/cups/cupsd.conf /etc/cups/cupsd.conf.bak
sed -i 's/^Listen localhost:631$/Listen localhost:631\nListen 0.0.0.0:8147/' /etc/cups/cupsd.conf
grep -n '^Listen' /etc/cups/cupsd.conf
cupsd -t
systemctl restart cups
sleep 2
ss -ltn | grep -E '631|8147'

实测回显:

18:Listen localhost:631
19:Listen 0.0.0.0:8147
20:Listen /run/cups/cups.sock
"/etc/cups/cups-files.conf" is OK.
"/etc/cups/cupsd.conf" is OK.
LISTEN 0      128          0.0.0.0:8147       0.0.0.0:*
LISTEN 0      128        127.0.0.1:631        0.0.0.0:*
LISTEN 0      128            [::1]:631           [::]:*

cupsd -t 是改配置后的固定动作(语法检查),两行 OK 才继续重启。

4.2 防火墙放行

ufw status
ufw allow 8147/tcp

实测回显:

Status: inactive
Rules updated
Rules updated (v6)

(本实验机 UFW 处于 inactive,规则已登记待启用后生效;启用了 UFW 的生产机放行后立即生效。)

五、远程访问排障:403 → Allow 放行

监听改完后从另一台机器访问,全部 403——这是本部署最典型的第一坑:

=== 远程 curl 主页 ===
403
=== 远程 curl /admin/ ===
403

原因:cupsd.conf 的 <Location> 段默认 Order allow,deny 且无 Allow 指令 = 只允许 localhost,与监听地址无关。编辑三个段(/、/admin、/admin/conf)追加管理网段:

<Location />
  Order allow,deny
  Allow 10.89.71.0/24
</Location>

<Location /admin>
  Order allow,deny
  Allow 10.89.71.0/24
</Location>

<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  Allow 10.89.71.0/24
</Location>
cupsd -t
systemctl restart cups

实测回显:

"/etc/cups/cups-files.conf" is OK.
"/etc/cups/cupsd.conf" is OK.

远程复测:

=== 主页 ===
200
=== /admin/ ===
200

主页标题确认版本:

<title>Home - CUPS 2.4.1</title>

管理界面认证(/admin 下执行管理操作时触发 Basic 认证,凭据为系统账号):

echo 'root:q1w2e3r4' | chpasswd
usermod -aG lpadmin root
grep lpadmin /etc/group
curl -s -o /dev/null -w '%{http_code}\n' -u root:q1w2e3r4 http://10.89.71.2:8147/admin/

实测回显:

lpadmin:x:111:root
200

浏览器访问 http://10.89.71.2:8147/admin/,弹窗输入 root / q1w2e3r4 即可进入管理页(添加打印机、看任务都在这个界面)。

六、添加打印机:cups-pdf 虚拟队列端到端

没有实体打印机的服务器如何验证打印链路?用 printer-driver-cups-pdf 包提供的虚拟 backend:提交的任何任务被渲染成 PDF 落盘,等于一台"永远在线的 PDF 打印机",是验证部署、跑通任务生命周期的标准教具。

6.1 发现设备与 PPD

lpinfo -v | grep -i pdf
ls /usr/share/ppd/cups-pdf/

实测回显:

file cups-pdf:/
CUPS-PDF_noopt.ppd
CUPS-PDF_opt.ppd

6.2 建队列(先踩一次标准坑)

lpadmin -p PDF -E -v cups-pdf:
echo exit=$?
lpstat -p -d

实测回显:

0
printer PDF is idle.  enabled since Wed Oct 28 04:33:03 2026
no system default destination

注意:不带 -P/-m 建队列,exit 0、队列 idle,一切"看起来正常"。坑在下一步。

6.3 打印与"假成功"现场

lp -d PDF /etc/hostname

实测回显:

request id is PDF-1 (1 file(s))

等几秒后查任务状态与产出:

lpstat -W completed -o
ls -la /var/spool/cups-pdf/ANONYMOUS/

实测回显:

PDF-1                   root              1024   Wed Oct 28 04:33:03 2026
total 8
drwxrwxrwt 2 root lpadmin 4096 Jun 11 13:01 .
drwxr-xr-x 4 root root 4096 Oct 28 04:33 ..

任务"完成",输出目录却是空的——双重异常。开 debug 日志定位:

cupsctl --debug-logging
lp -d PDF /etc/hostname
sleep 5
grep '\[Job 2\]' /var/log/cups/error_log | grep -E 'raw|Ghostscript|backend|PPD'

实测回显:

D [28/Oct/2026:04:33:35 +0000] [Job 2] envp[19]="PPD=/etc/cups/ppd/PDF.ppd"
D [28/Oct/2026:04:33:35 +0000] [Job 2] envp[21]="DEVICE_URI=cups-pdf:"
D [28/Oct/2026:04:33:35 +0000] [Job 2] Sending job to queue tagged as raw...
D [28/Oct/2026:04:33:35 +0000] [Job 2] GPL Ghostscript 9.55.0: Unrecoverable error, exit code 1
D [28/Oct/2026:04:33:35 +0000] [Job 2] PID 4977 (/usr/lib/cups/backend/cups-pdf) exited with no errors.

证据链:PPD=/etc/cups/ppd/PDF.ppd 指向的文件不存在;队列被标记 raw(无驱动的直通队列);backend 内部 Ghostscript exit code 1,但 backend 进程本身 exited with no errors,cupsd 于是把任务记为"完成"。根因:建队列时缺 PPD。

6.4 修复与端到端成功

lpadmin -p PDF -P /usr/share/ppd/cups-pdf/CUPS-PDF_opt.ppd
cupsenable PDF
lp -d PDF /etc/hostname
sleep 5
ls -la /root/PDF/
file /root/PDF/hostname-job_3.pdf

实测回显:

lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS.
request id is PDF-3 (1 file(s))
total 20
drwx------ 2 root root 4096 Oct 28 04:34 .
drwx------ 1 root root 4096 Oct 28 04:33 ..
-rw------- 1 root root 3841 Oct 28 04:34 hostname-job_3.pdf
/root/PDF/hostname-job_3.pdf: PDF document, version 1.2, 1 pages

端到端闭环达成:文本文件 → CUPS filter 链 → cups-pdf backend → ~/PDF/hostname-job_3.pdf(3841 字节,合法 PDF 1.2 单页)。-P 指定 PPD 时那条 "Printer drivers are deprecated" 警告属预期输出(CUPS 2.4 的驱动模型弃用提示,对自带 PPD 的设备可忽略)。

输出位置认知:cups-pdf 默认把 PDF 写到提交用户的家目录 /etc/cups/cups-pdf.conf 中 Out ${HOME}/PDF 指定的位置(root 提交即 /root/PDF/),不是 /var/spool/cups-pdf/ANONYMOUS/(后者是匿名任务的目录)——查不到产出文件时先确认提交者是谁。

关闭调试日志:

cupsctl --no-debug-logging

6.5 设置系统默认队列

lpadmin -d PDF
lpstat -d

实测回显:

system default destination: PDF

此后 lp 文件名 不带 -d 也走 PDF 队列。

七、systemd 运维三件事

systemctl restart cups
systemctl status cups --no-pager | head -5
journalctl -u cups --no-pager -n 6

实测回显(journalctl 节选):

Oct 28 04:31:58 cups-lab systemd[1]: Starting CUPS Scheduler...
Oct 28 04:31:58 cups-lab systemd[1]: Started CUPS Scheduler.
Oct 28 04:32:12 cups-lab systemd[1]: Stopping CUPS Scheduler...
Oct 28 04:32:12 cups-lab systemd[1]: cups.service: Deactivated successfully.
Oct 28 04:32:12 cups-lab systemd[1]: Stopped CUPS Scheduler.
Oct 28 04:32:12 cups-lab systemd[1]: Starting CUPS Scheduler...
  1. 改配置后重启:systemctl restart cups;
  2. 状态速查:systemctl is-active cups + lpstat -r;
  3. 日志分流:Ubuntu 的 access/error/page 三类日志在 /var/log/cups/,systemd 层面事件在 journald;升级 cups 包时 postinst 会自动重启服务,队列的 Stopped 状态可跨重启保持,但 --hold 状态不能(详见 D1 篇 4.4)。

八、排障实录(四个真实现场)

现场一:监听改了,远程全 403。Listen 0.0.0.0:8147 只解决"听不听",<Location> 才管"给不给"。三个 Location 段逐一加 Allow 10.89.71.0/24 后恢复(第五节)。判断口诀:连接被拒看监听,403 看 Location。

现场二:无 PPD 队列"假成功"。lpadmin -p PDF -E -v cups-pdf: 建队列成功、打印任务显示 completed、但无产出文件。debug 日志三行证据(raw 队列 + Ghostscript exit 1 + backend no errors),根因与修复见 6.3/6.4。教训:建队列必须带 -P(有 PPD 的设备)或 -m everywhere(IPP 网络打印机)。

现场三:cups-pdf 产出文件"失踪"。在 /var/spool/cups-pdf/ANONYMOUS/ 找不到文件——输出目录由 /etc/cups/cups-pdf.conf 的 Out ${HOME}/PDF 决定,实际位置是提交用户家目录下的 PDF/,文件名格式 {标题}-{任务号}.pdf(如 hostname-job_3.pdf)。

现场四:lpq: command not found。Berkeley 命令组(lpr/lpq/lprm)在独立的 cups-bsd 包里:

apt-get install -y cups-bsd
lpq -P PDF

实测回显:

PDF is ready
no entries

(cups-bsd 安装过程会触发 cupsd 重启——若正依赖 cupsdisable --hold 的暂停窗口做维护,注意 hold 会因此失效。)

九、部署验证清单

  • systemctl is-active cups → active
  • ss -ltn 见 0.0.0.0:8147 与 127.0.0.1:631
  • 远程浏览器 http://<IP>:8147/ 打开 Home - CUPS 2.4.1,/admin/ 可用 root/q1w2e3r4 登录
  • lpstat -d → system default destination: PDF
  • lp -d PDF /etc/hostname → ~/PDF/hostname-job_N.pdf 生成,file 确认 PDF document
  • ufw allow 8147/tcp 已登记

十、版本说明

  • Ubuntu 22.04 仓库版本:2.4.1op1-1ubuntu4.21(apt-cache policy 实测,2026-10-28 查询);
  • 上游最新稳定版:OpenPrinting CUPS v2.4.20(GitHub Releases,发布于 2026-10-05,查询日期 2026-10-28);
  • 发行版版本的 op1 后缀为 OpenPrinting 打包标识,2.4.1 与 2.4.20 之间累积了大量安全修复(含 2024 年的 CVE-2024-47176 libcupsfs 漏洞系列,修复在 2.4.10+)。本系列文档以发行版版本实测,行为差异点已在文中标注;生产环境如需上游版本,优先评估发行版安全更新的及时性。

相关阅读: