CUPS (简体中文)
CUPS 是 OpenPrinting 为 Linux® 和其他类 UNIX® 操作系统开发的基于标准的、开源的打印系统。
Arch Linux 所打包的是 OpenPrinting CUPS 分支,而非 苹果 CUPS 分支。
安装
如果想将文件“打印”成一个 PDF 文档,也请安装 cups-pdf 软件包。默认情况下,PDF 文件存储在 /var/spool/cups-pdf/username/
目录里。可以在 /etc/cups/cups-pdf.conf
配置文件中变更位置。
启用 并 启动 cups.service
服务,或者也可使用以下的套接字激活方式,使得仅当有程序需要使用服务时才启动 CUPS。
套接字激活
cups 提供了一个 cups.socket
单元。如果启用了 cups.socket
(且 cups.service
在禁用状态), systemd 不会立即启动 CUPS,而只是监听对应的套接字。之后,当有程序尝试连接其中一个 CUPS 套接字时,systemd 便会启动 cups.service
,并将这些端口的控制透明地移交给 CUPS 进程。
打印工作步骤
要解决一些相关问题,了解 CUPS 的工作原理很重要:
- 当选择“打印”时,应用程序会发送一个 PDF 文件(若应用程序发送的是其他格式则先转换为 PDF)给 CUPS;
- 然后,CUPS 查询打印机的 PPD 文件(打印机描述文件),并确定需要使用何种过滤器将 PDF 文件转换为打印机可以理解的语言(如 PJL、PCL、位图或原生 PDF);
- 过滤器将 PDF 文件转换为打印机可以理解的格式;
- 然后数据被发送到后端。例如,如果打印机连接到了 USB 端口,则会使用 USB 后端。
连接接口
下面列出了适用于各种连接接口的额外打印机检测步骤。
USB 接口
要查看是否检测到 USB 打印机,请确保安装了usbutils软件包,然后执行以下操作:
$ lsusb
(...) Bus 001 Device 007: ID 03f0:1004 Hewlett-Packard DeskJet 970c/970cse
并口
要使用并口打印机,需要 lp
, parport
和 parport_pc
内核模块。
# dmesg | grep -i parport
parport0: Printer, Hewlett-Packard HP LaserJet 2100 Series lp0: using parport0 (polling)
网络共享
要使用 DNS-SD/mDNS 查找、使用或共享打印机,请使用 Avahi 设置 .local 主机名解析,然后重启 cups.service
服务。
要用 Samba 共享打印机,例如:如果系统要用作 Windows 客户端的打印服务器,则需要安装 samba 软件包。
打印机驱动
打印机的驱动程序可能来自以下任何来源。 请参阅 CUPS/Printer-specific problems 获取其他人设法使用的驱动程序的不完整列表。
要驱动一台打印机,CUPS 需要一个 PPD 文件,对于大多数打印机来说,还需要一些 过滤器。 有关 CUPS 如何使用 PPD 和过滤器的详细信息,请参阅 [1]。
OpenPrinting 打印机列表 (英语) 提供了许多打印机的推荐驱动程序。它还为每台打印机提供了相应的 PPD 文件,但是大多数文件都可以通过 foomatic 或其它推荐的驱动程序包获得。
将 PPD 文件提供给 CUPS 后,CUPS 服务器将重新生成 PPD 文件并将其保存在 /etc/cups/ppd/
中。
CUPS
CUPS 本体包括了对 AirPrint 和 IPP Everywhere 打印机的支持。
OpenPrinting CUPS 过滤器
Linux 基金会旗下的 OpenPrinting 工作组提供了 cups-filters (CUPS 过滤器)。这里面是一些后端软件、过滤器和其他二进制文件,它们曾经是 CUPS 本体的一部分,但被项目丢弃。这些文件可通过 cups-filters 软件包获得,后者是 cups 的依赖项之一。
非 PDF 打印机需要安装 ghostscript。对于 PostScript 打印机可能还需要安装 gsfonts。
Foomatic
Linux 基金会旗下 OpenPrinting 工作组维护的 foomatic 为许多打印机提供了 PPD 文件,既有自由的也有非自由的。 有关 foomatic 功能的更多信息,请参阅 开发者眼中的 Foomatic (英语)。
要使用 foomatic,请安装 foomatic-db-engine 和下列的至少一个软件包:
- foomatic-db - foomatic-db-engine 用来生成 PPD 文件的 XML 文件集合。
- foomatic-db-ppds - 预构建好的 PPD 文件。
- foomatic-db-nonfree - 打印机制造商提供的、非自由许可协议下的、foomatic-db-engine 用于生成 PPD 文件的 XML 文件集合。
- foomatic-db-nonfree-ppds - 非自由许可协议下的预构建 PPD 文件。
Foomatic 的 PPD 文件可能还需要额外的过滤器,比如 min12xxwAUR。
Gutenprint
Gutenprint 项目 提供了可与 CUPS 和 GIMP 搭配使用的佳能(Canon)、爱普生(Epson)、利盟(Lexmark)、索尼(Sony)、奥林巴斯(Olympus) 以及 PCL 打印机的驱动程序。
安装 gutenprint 和 foomatic-db-gutenprint-ppds 可获得。
cups-genppdupdate
并重新启动 CUPS。cups-genppdupdate 将会升级已配置打印机的 PPD 文件,参见 cups-genppdupdate(8) 获取更多细节。制造商特定的驱动程序
许多打印机厂商提供它们自己的 Linux 驱动。这些驱动通常可以在 Arch 官方仓库和 AUR 里找到。
其中一些驱动在 CUPS/Printer-specific problems 一文里有更详细的描述。
打印机 URI
下面列出了一些用于在需要时手动生成 URI 的额外步骤。CUPS/Printer-specific problems 一文里说明了一些需要特别 URI 的打印机或驱动。
USB 打印机
CUPS 应该能够为 USB 打印机自动生成 URI, 例如 usb://HP/DESKJET%20940C?serial=CN16E6C364BH
。
如果没有,请参阅 CUPS/Troubleshooting#USB printers 进行故障排除。
并口打印机
并口打印机的 URI 格式应为parallel:device
。例如,如果打印机连接在 /dev/lp0
上,则 URI 使用 parallel:/dev/lp0
。如果使用了 USB 转并行端口适配器,请使用 parallel:/dev/usb/lp0
作为打印机 URI。
网络打印机
如果已经按照 #网络共享 一节中配置好了 Avahi,CUPS 应该能检测到打印机 URI。另外还可以使用 avahi-discover
查找需要的打印机的名称及其地址(例如 BRN30055C6B4C7A.local/10.10.0.155:631
)。
也可以不使用 Avahi 来手动生成 URI。 CUPS 文档里提供了一张网络打印机可用 URI 方案列表。由于不同打印机的 URI 具体细节有所差异,请查看打印机的用户手册或 CUPS/Printer-specific problems。
smbspool(8) 手册页中介绍了 SMB 共享打印机的 URI。
lpadmin: Bad device-uri
错误。
例如, smb://BEN-DESKTOP/HP Color LaserJet CP1510 series PCL6
要写成 smb://BEN-DESKTOP/HP%20Color%20LaserJet%20CP1510%20series%20PCL6
。
可通过运行以下命令来获取此结果字符串:
$ python -c 'from urllib.parse import quote; print("smb://" + quote("BEN-DESKTOP/HP Color LaserJet CP1510 series PCL6"))'
远程 CUPS 打印服务器可通过 ipp://hostname:631/printers/queue_name
这样格式的 URI 来访问。关于如何配置远程打印服务器的详细信息,请参阅 CUPS/Printer sharing#Printer sharing。
有关其它问题和相应解决方案,请参阅 CUPS/Troubleshooting#Networking issues。
使用方法
可以通过 lp* 和 cups* CLI 工具完全控制 CUPS。 此外,也可以使用 #网页界面 和几种 #GUI 应用 之一来控制 CUPS。
- 队列 (queue) 名称是系统上用来标识队列的简短但有描述性的名称。这个名称不应该含有空格或任何特殊字符。比如,对应打印机 HP LaserJet 5P 的打印队列可以命名为“ hpljet5p”。一台物理打印机可以关联多个队列。
- 位置 (location) 用来描述打印机的物理位置(比如说“卧室”或者“厨房”)。这有助于维护多台打印机。
- 描述 (description) 是打印队列的完整描述。一个常见用法是填写打印机的全名(比如说 "HP LaserJet 5P")。
命令行工具
有关命令行工具的更多技巧,请参阅 CUPS 本地文档。
使用 SNMP 查询 URI:
$ /usr/lib/cups/backend/snmp ip_address
lp*
lpinfo 实用程序加上 -v
开关可列出设备,加上 -m
可列出型号。
lpadmin 实用程序加上 -p queue_name
可创建新队列。-E
开关与 -p
一起使用可启用并接受打印机上的任务。-v
指定设备 URI, -m
指定型号或要使用的 PPD 文件。
也可使用 -x
开关删除打印机(请先阅读下面一节)。
例子:
# lpadmin -p HP_DESKJET_940C -E -v "usb://HP/DESKJET%20940C?serial=CN16E6C364BH" -m drv:///HP/hp-deskjet_940c.ppd.gz
对于免驱动打印队列(Apple AirPrint 或 IPP Everywhere):
# lpadmin -p AirPrint -E -v "ipp://10.0.1.25/ipp/print" -m everywhere
原始队列,不含 PPD 文件或过滤器:
# lpadmin -p SHARED_PRINTER -m raw
指定一个 PPD 文件而不是型号:
# lpadmin -p Test_Printer -E -v "ipp://10.0.1.3/ipp/print" -m pxlmono.ppd
- 指定 PPD 时,请只使用文件名,而不要用完整路径(例如,应该使用
pxlmono.ppd
而不是/usr/share/ppd/cupsfilters/pxlmono.ppd
)。或者也可通过-P
命令行开关使用完整路径。 - 到2021年时,许多新款打印机支持免驱打印设置。如上述第二个例子一样指定
-m everywhere
,即可定义打印机,并通过查询网络上的打印机在/etc/cups/ppd/
中生成 .ppd 文件。
lpq 实用程序可查看队列。加上 -a
开关可查看所有队列。
lprm 实用程序可清除队列。加上 -
可删除所有项目,而不是像默认情况下只删除最后一项。
lpr 实用程序可进行打印。使用 -# N
可打印文件 N 遍,使用 -p
开关可加入标头。
使用 lpr 的测试打印示例:
$ lpr /usr/share/cups/data/testprint $ echo 'Hello, world!' | lpr -p
lpstat 实用程序加上 -s
开关可检查状态。 -p
开关允许指定检查哪个队列。
lpoptions 实用程序使用与上述的 lpadmin 相同的 -p queue_name
开关。加上 -l
开关可列出选项。 -d
开关可通过参数 queue_name
设置默认打印机。 -o
开关设置选项的值:
$ lpoptions -p HP_DESKJET_940C -o PageSize=A4 $ lpoptions -p HP_DESKJET_940C -o cupsIPPSupplies=true -o Duplex=DuplexNoTumble
cups*
cupsaccept、cupsdisable、cupsenable 及 cupsreject 实用程序的作用正如其名称所示,分别是:设置打印机接受任务、禁用打印机、激活打印机、设置打印机拒绝所有收到的任务。
以下用法示例会彻底删除一台打印机:
# cupsreject queue_name # cupsdisable queue_name # lpadmin -x queue_name
ink
安装 inkAUR 查看墨量。
将你的用户添加到 lp
用户组,注销然后再登录。
有关用法的信息,请不带参数运行 ink
。
网页界面
可以通过 http://localhost:631/ 上的网页界面完全管理 CUPS 服务器。
要从网页界面执行管理任务,需要验证身份;见 #权限。
- 添加队列
转到 Administration 页面。
- 修改现有队列
转到 Printers 页面,然后选择一个队列来修改。
- 测试队列
转到 Printers 页面,然后选择一个队列。
GUI 应用
如果用户没有足够权限来管理 CUPS,应用启动时会要求输入 root 用户密码。要授予用户管理权而无需 root 用户访问权限,参见 #配置 小节。
- Deepin Print Manager — 深度桌面环境的打印机配置界面。
- GtkLP — CUPS 的 GTK 界面。
- print-manager — 管理打印任务和打印机的工具 (KDE)。
- system-config-printer — GTK 打印机配置工具和状态小程序。
配置
CUPS 服务器配置位于 /etc/cups/cupsd.conf
和 /etc/cups/cups-files.conf
(参见 cupsd.conf(5) 和 cups-files.conf(5))。编辑完上述文件之后,重启 cups.service
以应用所有更改。默认设置对大多数用户已足够。
权限
/etc/cups/cups-files.conf
文件里的 SystemGroup
一处定义了有打印机管理权限的 用户组。默认情况下使用 sys
、root
和 wheel
组。
CUPS 助手程序以 cups
用户及组运行。这样助手程序就可以访问打印机设备,并读取由 cups
组拥有的 /etc/cups/
内的配置文件。
/etc/cups
中的文件应该由 cups
组和 User 209
及 Group 209
拥有,如 /etc/cups/cups-files.conf
中所设置的那样。默认纸张尺寸
cups 构建时开启了 libpaper 支持并且 libpaper 默认纸张尺寸设为 Letter(该选项在 lpoptions
中被称为 PageSize
)。要避免得一个一个更改添加的打印队列的纸张尺寸,请编辑 /etc/papersize
并设置系统默认纸张尺寸。参见 papersize(5)。
日志文件
默认情况下,所有日志都会发送到 /var/log/cups/
中的文件里。通过将 /etc/cups/cups-files.conf
中的 AccessLog
、ErrorLog
和 PageLog
指令的值改为 syslog
,CUPS 可以把日志记录到 systemd 日志 中。有关原始建议更改的信息,请参阅 Fedora 维基页面 (英文)。
打印服务器和远程管理
参见 CUPS/Printer sharing 和 CUPS/Printer sharing#Remote administration。
允许通过 PolicyKit 进行管理员身份验证
可配置 PolicyKit,允许用户使用一个 GUI 来配置打印机,而无需使用管理员密码。
这是一个允许 wheel 用户组 的成员无需密码即可管理打印机的示例:
/etc/polkit-1/rules.d/49-allow-passwordless-printer-admin.rules
polkit.addRule(function(action, subject) { if (action.id == "org.opensuse.cupspkhelper.mechanism.all-edit" && subject.isInGroup("wheel")){ return polkit.Result.YES; } });
不使用本地 CUPS 服务器
CUPS 可以被配置为直接连接到远程打印机服务器,而不是在本地运行打印服务器。这需要 安装 libcups 软件包。某些应用程序仍需要依赖 cups 软件包进行打印。
要使用远程 CUPS 服务器,请将 CUPS_SERVER
环境变量 设定为 printerserver.mydomain:port
。例如,如果你想让单个 Firefox 实例使用不同的打印服务器(将 printserver.mydomain:port
替换为您的打印服务器名称/端口):
$ CUPS_SERVER=printserver.mydomain:port firefox
要想永久性应用设置,创建配置文件 /etc/cups/client.conf
并向其添加远程 CUPS 服务器的主机名:
ServerName server
也可以指定自定义的端口:
ServerName server:port
详见[4]。
故障排除
请参阅 CUPS/Troubleshooting。