CUPS

出自 Arch Linux 中文维基

CUPS 是 OpenPrinting 為 Linux® 和其他類 UNIX® 作業系統開發的基於標準的、開源的打印系統。

Arch Linux 所打包的是 OpenPrinting CUPS 分支,而非 蘋果 CUPS 分支

安裝[編輯 | 編輯原始碼]

請先 安裝 cups 軟件包。

注意: CUPS 不再推薦使用驅動,請儘量使用 IPP Everywhere。IPP Everywhere 直接將 PDF 發送給打印機,所以需要安裝 cups-pdf 先將文件打印到 PDF ,未安裝此軟件包可能會出現client-error-document-format-not-supported

如果想將文件「打印」成一個 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 的工作原理很重要:

  1. 當選擇「打印」時,應用程式會發送一個 PDF 文件(若應用程式發送的是其他格式則先轉換為 PDF)給 CUPS;
  2. 然後,CUPS 查詢打印機的 PPD 文件(打印機描述文件),並確定需要使用何種過濾器將 PDF 文件轉換為打印機可以理解的語言(如 PJL、PCL、位圖或原生 PDF);
  3. 過濾器將 PDF 文件轉換為打印機可以理解的格式;
  4. 然後數據被發送到後端。例如,如果打印機連接到了 USB 端口,則會使用 USB 後端。

連接接口[編輯 | 編輯原始碼]

下面列出了適用於各種連接接口的額外打印機檢測步驟。

USB 接口[編輯 | 編輯原始碼]

要查看是否檢測到 USB 打印機,請確保安裝了usbutils軟件包,然後執行以下操作:

$ 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/ 中。

To test if they are working before creating a PKGBUILD, PPD files can be manually added to /usr/share/cups/model, the driver should be available after the next restart of the cups service.

AirPrint and IPP Everywhere[編輯 | 編輯原始碼]

CUPS 本體包括了對 AirPrintIPP 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 打印機的驅動程序。

安裝 gutenprintfoomatic-db-gutenprint-ppds 可獲得。

注意: 當 Gutenprint 軟件包更新時,使用 Gutenprint 驅動的打印機將會停止工作,直到以 root 身份運行 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。

注意: 打印機 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* 一節。

使用方法[編輯 | 編輯原始碼]

可以通過 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 可以列出已連接打印機的 URI ,加上 -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*[編輯 | 編輯原始碼]

cupsacceptcupsdisablecupsenablecupsreject 工具的作用分別是:設置打印機接受任務、禁用打印機、激活打印機、設置打印機拒絕所有收到的任務。

以下用法示例會徹底刪除一台打印機:

# cupsreject queue_name
# cupsdisable queue_name
# lpadmin -x queue_name

ink[編輯 | 編輯原始碼]

安裝 inkAUR 查看墨量。

注意: 參閱打印機支持列表

將你的用戶添加到 lp 用戶組,註銷然後再登錄。

有關用法的信息,請不帶參數運行 ink

網頁界面[編輯 | 編輯原始碼]

可以通過 http://localhost:631/ 上的網頁界面完全管理 CUPS 伺服器。

注意: 如果使用 HTTPS 連接 CUPS,第一次訪問時 可能 要花好長時間才能見到界面出現。這是因為第一次請求會觸發 SSL 證書的生成,這會是一項耗時的工作。

要從網頁界面執行管理任務,需要驗證身份;見 #權限

添加隊列

轉到 Administration 頁面。

修改現有隊列

轉到 Printers 頁面,然後選擇一個隊列來修改。

測試隊列

轉到 Printers 頁面,然後選擇一個隊列。

GUI 應用[編輯 | 編輯原始碼]

如果用戶沒有足夠權限來管理 CUPS,應用啟動時會要求輸入 root 用戶密碼。要授予用戶管理權而無需 root 用戶訪問權限,參見 #配置 小節。

  • Deepin Print Manager — 深度桌面環境的打印機配置界面。
https://github.com/linuxdeepin/dde-printer || deepin-printer
  • 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 打印機配置工具和狀態小程序。
https://github.com/OpenPrinting/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 助手程序以 cups 用戶及組運行。這樣助手程序就可以訪問打印機設備,並讀取由 cups 組擁有的 /etc/cups/ 內的配置文件。

注意: cups 2.2.6-2 之前使用的是lp組。在升級之後,/etc/cups 中的文件應該由 cups 組和 User 209Group 209 擁有,如 /etc/cups/cups-files.conf 中所設置的那樣。

允許通過 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 構建時開啟了 libpaper 支持並且 libpaper 默認紙張尺寸設為 Letter(該選項在 lpoptions 中被稱為 PageSize)。要避免得一個一個更改添加的打印隊列的紙張尺寸,請編輯 /etc/papersize 並設置系統默認紙張尺寸。參見 papersize(5)

日誌文件[編輯 | 編輯原始碼]

默認情況下,所有日誌都會發送到 /var/log/cups/ 中的文件裡。

/etc/cups/cups-files.conf 中的 AccessLogErrorLogPageLog 指令的值改為 syslog,CUPS 可以把日誌記錄到 systemd 日誌 中。有關原始建議更改的信息,請參閱 Fedora 維基頁面 (英文)cupsd.conf 文檔.

打印伺服器和遠程管理[編輯 | 編輯原始碼]

參見 CUPS/Printer sharingCUPS/Printer sharing#Remote administration

不使用本地 CUPS 伺服器[編輯 | 編輯原始碼]

CUPS 可以被配置為直接連接到遠程打印機伺服器,而不是在本地運行打印伺服器。這需要 安裝 libcups 軟件包。某些應用程式仍需要依賴 cups 軟件包進行打印。

警告: 開發人員不建議在沒有本地 CUPS 伺服器的情況下訪問遠程打印機。 [3]

要使用遠程 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

另請參閱[編輯 | 編輯原始碼]