CUPS 安装部署指南(Ubuntu 22.04 直装实录)
Ubuntu 22.04 直装 CUPS 2.4.1op1 全过程实录:apt 安装、systemd 服务三件套、631→8147 对外监听改造、Location 403 放行、cups-pdf 虚拟队列端到端打印验证,含无 PPD 假成功等四个真实排障现场。
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:/ ...)
└──> 打印设备(实体机或虚拟输出)
| 组件 | 实测版本 | 职责 |
|---|---|---|
| cupsd | 2.4.1op1-1ubuntu4.21 | 调度器:队列管理、filter 链、IPP 服务、Web 界面 |
| cups-client | 同上 | lp/lpstat/lpadmin 等客户端命令 |
| cups-bsd | 同上 | Berkeley 命令(lpr/lpq/lprm),可选 |
| printer-driver-cups-pdf | 3.0.1-14ubuntu0.22.04.1 | cups-pdf 虚拟打印 backend,本文用于端到端验证 |
端口说明:CUPS 默认监听
localhost:631(本机管理)。本文将其对外监听改为 8147(实验服务器所在网段规划端口),形成631(本机)+8147(对外)双监听;631 的 IPP 协议职能不变,8147 同样是 IPP + Web 双职能端口。
前置条件清单:
- Ubuntu 22.04 LTS 服务器一台,root 权限(本文实验机:主机名
cups-lab,内网 IP10.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...
- 改配置后重启:
systemctl restart cups; - 状态速查:
systemctl is-active cups+lpstat -r; - 日志分流: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+)。本系列文档以发行版版本实测,行为差异点已在文中标注;生产环境如需上游版本,优先评估发行版安全更新的及时性。
相关阅读:
- 《CUPS 配置参数详解》——cupsd.conf / cups-files.conf / printers.conf 逐项生效验证
- 《CUPS 常用 CLI 命令详解》——lpstat/lpadmin/lpmove 等命令全参数实测
- 《CUPS 介绍与选型指南》——CUPS vs LPRng vs p910nd 量化选型