CUPS (简体中文)

From ArchWiki
Jump to navigation Jump to search
翻译状态:本文是 CUPS翻译。上次翻译日期:2020-08-02。如果英文版本有所更改,则您可以帮助同步翻译。

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

安装 CUPS

请先 安装 cups 软件包。

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

启用开启 org.cups.cupsd.service 服务。

套接字(Socket) 激活

cups 提供了一个 org.cups.cupsd.socket 单元。如果只是启用了 org.cups.cupsd.socket (并且 org.cups.cupsd.service 在禁用状态), systemd 不会立即启动 CUPS,而只是监听对应的套接字。然后,当有程序尝试连接其中一个 CUPS 套接字时,systemd 便会启动 org.cups.cupsd.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 主机名解析,然后重启 org.cups.cupsd.service 服务。

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

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

打印机驱动

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

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

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 文档[失效链接 2020-08-02 ⓘ]里提供了一张网络打印机可用 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 — CPUS 的 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))。编辑完两个文件之后,重启 org.cups.cupsd.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][失效链接 2020-08-02 ⓘ]

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

$ CUPS_SERVER=printserver.mydomain:port firefox

故障排除

请参阅 CUPS/Troubleshooting

另请参阅