CUPS (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 CUPS翻译。上次翻译日期:2020-08-02。如果英文版本有所更改,则您可以帮助同步翻译。

CUPS 是苹果公司目前为 macOS® 和其他类 UNIX® 的操作系统开发的基于标准的、开源的打印系统.

安装 CUPS

请先 安装 cups 软件包。

如果想将文件“打印”成一个 PDF 文档,也请安装 cups-pdf 软件包。默认情况下,PDF 文件存储在 /var/spool/cups-pdf/username/ 目录里。可以在 /etc/cups/cups-pdf.conf 配置文件中变更位置。

启用开启 cups.service 服务。

套接字(Socket) 激活

cups 提供了一个 cups.socket 单元。如果只是启用了 cups.socket (并且 cups.service 在禁用状态), systemd 不会立即启动 CUPS,而只是监听对应的套接字。然后,当有程序尝试连接其中一个 CUPS 套接字时,systemd 便会启动 cups.service,并将这些端口的控制透明地移交给 CUPS 进程。

这样,仅当程序要使用该服务时才会启动 CUPS。

打印步骤(工作原理)

要解决一些相关问题,了解 CUPS 的工作原理很重要:

  1. 当选择“打印”时 (大多数程序是这种情况),应用会发送一个 .ps 文件 (PostScript,一种脚本语言,其详细说明了页面的外观) 给 CUPS;
  2. 然后,CUPS 查看打印机的 PPD 文件 (打印机描述文件),并找出可将 .ps 文件转换为打印机可以理解的语言 (例如 PJL,PCL) 所需的过滤器(通常是 GhostScript);
  3. GhostScript 提取输入并找出应该使用的过滤器,然后应用它们将 .ps 文件转换为打印机可以理解的格式;
  4. 然后 GhostScript 将其发送到后端。例如,如果打印机连接到了 USB 端口,则 GhostScript 将使用 USB 后端。

连接接口

下面列出了其他各种连接接口的打印机检测步骤。

注意:
  • CUPS 帮助程序使用 cups 用户和用户组来运行,这使得帮助程序可以访问 cups 用户组拥有的打印机设备并读取 /etc/cups/ 中的配置文件。
  • cups 2.2.6-2 之前的版本, 则是使用 lp 用户组 进行管理的。在升级之后,/etc/cups 中的文件应该归 cups 所有,以及在 /etc/cups/cups-files.conf 中设置的 User 209Group 209 所有。

USB 接口

要查看是否检测到 USB 打印机,请执行以下操作:

$ lsusb
(...)
Bus 001 Device 007: ID 03f0:1004 Hewlett-Packard DeskJet 970c/970cse

并口

要使用并口打印机,需要 lp, parportparport_pc 内核模块

# dmesg | grep -i parport
 parport0: Printer, Hewlett-Packard HP LaserJet 2100 Series
 lp0: using parport0 (polling)

网络共享

要使用 DNS-SD/mDNS 查找或共享打印机,请使用 Avahi 设置 .local 主机名解析,然后重启 cups.service 服务。

注意: 只有使用 Avahi 时才支持 DNS-SD。 CUPS 不支持对 DNS-SD 使用 systemd-resolved,参见 CUPS issue 5452

要用 Samba 共享打印机,例如:如果系统要用作 Windows 客户端的打印服务器,则需要安装 samba 软件包。

打印机驱动

打印机的驱动程序可能来自以下任何来源。 请参阅 CUPS/Printer-specific problems 获取其他人设法使用的驱动程序的不完整列表。

要驱动一台打印机,CUPS 需要一个 PPD 文件,对于大多数打印机来说,还需要一些 过滤器。 有关 CUPS 如何使用 PPD 和过滤器的详细信息,请参阅 [1]

OpenPrinting 打印机列表 (英语) 提供了许多打印机的推荐驱动程序。它还为每台打印机提供了相应的 PPD 文件,但是大多数文件都可以通过 foomatic 或其它推荐的驱动程序包获得。

将 PPD 文件提供给 CUPS 后,CUPS 服务器将重新生成 PPD 文件并将其保存在 /etc/cups/ppd/ 中。

CUPS

CUPS 本体包括了对 AirPrintIPP Everywhere 打印机的支持。

OpenPrinting CUPS 过滤器

Linux 基金会旗下的 OpenPrinting 工作组提供了 cups-filters (CUPS 过滤器)。这里面是一些后端软件、过滤器和其他二进制文件,它们曾经是 CUPS 本体的一部分,但不再由 Apple 维护。这些文件可通过 cups-filters 软件包获得,后者是 cups 的依赖之一。

非 PDF 打印机需要安装 ghostscript。对于 PostScript 打印机可能还需要安装 gsfonts

Foomatic

Linux 基金会旗下 OpenPrinting 工作组维护的 foomatic 为许多打印机提供了 PDD 文件,既有自由的也有非自由的。 有关 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 项目 提供了可与 CPUS 和 GIMP 搭配使用的佳能(Canon)、爱普生(Epson)、利盟(Lexmark)、索尼(Sony)、奥林巴斯(Olympus) 以及 PCL 打印机的驱动程序。

安装 gutenprintfoomatic-db-gutenprint-ppds 可获得。

注意: 当 Gutenprint 软件包更新时,使用 Gutenprint 驱动的打印机将会停止工作,直到以 root 身份运行 cups-genppdupdate 并重新启动 CPUS。cups-genppdupdate 将会升级已配置打印机的 PDD 文件,参见 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。

注意: 打印机 URI 中的任何特殊字符都需要正确地转义引用,否则,如果您的 Windows 打印机名称或用户密码里含有空格,CUPS 会报出 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

警告: 避免同时使用一个打印机过滤器配置服务器和客户端 —— 客户端或服务器上的打印队列应为“原始 (raw)”状态。这样可以避免通过过滤器向打印机发送两次打印作业,不然可能导致问题,例如:共享打印机在本地工作,但远程计算机却无法打印 ([2])。有关将打印队列设置为“原始”的示例,请参见 #使用方法 一节。

使用方法

可以通过 lp* 和 cups* CLI 工具完全控制 CUPS。 此外,也可以使用 #网页界面 和几种 #GUI 应用 的一种来控制 CUPS。

  • 队列 (queue) 名称是系统上用来标识队列的简短但有描述性的名称。这个名称不应该含有空格或任何特殊字符。比如,对应打印机 HP LaserJet 5P 的打印队列可以命名为“ hpljet5p”。一台物理打印机可以关联多个队列。
  • 位置 (location) 用来描述打印机的物理位置(现实中放置的地方,比如说“卧室”或者“厨房”)。这有助于维护多台打印机。
  • 描述 (description) 是打印队列的完整描述。一个常见用法是填写打印机的全名 (比如说 "HP LaserJet 5P")。

CLI 工具

有关命令行 (CLI) 工具的更多技巧,请参阅 CUPS 本地文档

注意: 命令行开关不可聚合使用
列出设备
# lpinfo -v
$ /usr/lib/cups/backend/snmp ip_address  # Use SNMP to find a URI
列出设备型号
$ lpinfo -m
添加新队列
# lpadmin -p queue_name -E -v uri -m model

队列名称 (queue_name) 由您决定。 例子:

# lpadmin -p HP_DESKJET_940C -E -v "usb://HP/DESKJET%20940C?serial=CN16E6C364BH" -m drv:///HP/hp-deskjet_940c.ppd.gz
# lpadmin -p AirPrint -E -v "ipp://10.0.1.25/ipp/print" -m everywhere    # 免驱动打印队列 (Apple AirPrint 或 IPP Everywhere)
# lpadmin -p SHARED_PRINTER -m raw    # 原始队列;不含 PPD 文件或过滤器
# lpadmin -p Test_Printer -E -v "ipp://10.0.1.3/ipp/print" -m pxlmono.ppd    # 指定一个 PPD 文件而不是型号
注意: 当指定了 PPD 时,请只使用文件名,而不要用完整路径 (例如,应该使用 pxlmono.ppd 而不是 /usr/share/ppd/cupsfilters/pxlmono.ppd)。此外,完整路径可与 -P 命令行开关一起使用。
设定默认打印机
$ lpoptions -d queue_name
改变选项
$ lpoptions -p queue_name -l # 列出选项
$ lpoptions -p queue_name -o option=value # 设定一个选项

例子:

$ lpoptions -p HP_DESKJET_940C -o PageSize=A4
检查队列状态
$ lpstat -s
$ lpstat -p queue_name
停用打印机
# cupsdisable queue_name
激活打印机
# cupsenable queue_name
设定打印机以接受任务
# cupsaccept queue_name
移除打印机

首先将其设置为拒绝所有传入的条令:

# cupsreject queue_name

然后禁用它。

# cupsdisable queue_name

最后移除。

# lpadmin -x queue_name
打印文件
$ lpr file
$ lpr -# 17 file            # print the file 17 times
$ echo 'Hello, world!' | lpr -p # print the result of a command. The -p switch adds a header.
检查队列
$ lpq
$ lpq -a # on all queues
清除队列
# lprm   # remove last entry only
# lprm - # remove all entries
查看墨水/粉量

安装 inkAUR

将用户添加到 lp 用户组

# usermod -aG lp <user>

注销然后再登录。

有关使用情况的信息,请使用:

$ ink

网页界面

可以通过 http://localhost:631/ 上的网页界面完全管理 CUPS 服务器。

注意: 如果使用 HTTPS 连接 CUPS,第一次访问时 可能 要花好长时间才能见到界面出现。这是因为第一次请求会触发了 SSL 证书的生成,这会是一项耗时的工作。

要从网页界面执行任务,需要验证身份。 可以以 root 进行身份验证,或确保用户是具有打印机管理权的用户组成员,参见 #配置 小节。

添加队列

转到 Administration 页面。

修改现有队列

转到 Printers 页面,然后选择一个队列来修改。

测试队列

转到 Printers 页面,然后选择一个队列测试。

GUI 应用

如果用户没有足够权限来管理 CUPS,应用启动时会要求输入 root 用户密码。要授予用户管理权而无需 root 用户访问权限,参见 #配置 小节。

  • GtkLP — CUPS 的 GTK 界面。
https://gtklp.sirtobi.com/index.shtml || gtklpAUR
  • print-manager — 管理打印任务和打印机的工具 (KDE).
https://invent.kde.org/utilities/print-manager || print-manager
  • system-config-printer — GTK 打印机配置工具和状态小程序。
http://cyberelk.net/tim/software/system-config-printer/ || system-config-printer

配置

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 一处定义了有打印机管理权限的 用户组。默认情况下使用 sysrootwheel

cups 构建时开启了 libpaper 支持并且 libpaper 默认纸张尺寸设为 Letter。要避免得一个一个更改添加的打印队列的纸张尺寸,请编辑 /etc/papersize 并设置系统默认纸张尺寸。参见 papersize(5)

默认情况下,所有日志都会发送到 /var/log/cups/ 中的文件里。通过将 /etc/cups/cups-files.conf 中的 AccessLogErrorLogPageLog 指令的值为 syslog,CUPS 可以把日志记录到 systemd 日志 中。有关原始建议更改的信息,请参阅 Fedora 维基页面 (英文)

打印服务器和远程管理

参见 CUPS/Printer sharingCUPS/Printer sharing#Remote administration

允许通过 PolicyKit 进行管理员身份验证

可配置 PolicyKit,允许用户使用一个 GUI 来配置打印机,而无需使用管理员密码。

注意: 你可能需要安装 cups-pk-helper 来使这个规则生效。

这是一个允许 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 服务器的情况下访问远程打印机。 [3]

要使用远程 CUPS 服务器,请将 CUPS_SERVER 环境变量 设定为 printerserver.mydomain:port。例如,如果你想让单个 Firefox 实例使用不同的打印服务器: (将 printserver.mydomain:port 替换为您的打印服务器名称/端口):

$ CUPS_SERVER=printserver.mydomain:port firefox

故障排除

请参阅 CUPS/Troubleshooting

另请参阅