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/
中。
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 本體包括了對 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
可以列出已連接打印機的 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*[編輯 | 編輯原始碼]
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
中所設置的那樣。允許通過 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包 構建時開啟了 libpaper包 支持並且 libpaper 默認紙張尺寸設為 Letter(該選項在 lpoptions
中被稱為 PageSize
)。要避免得一個一個更改添加的打印隊列的紙張尺寸,請編輯 /etc/papersize
並設置系統默認紙張尺寸。參見 papersize(5)。
日誌文件[編輯 | 編輯原始碼]
默認情況下,所有日誌都會發送到 /var/log/cups/
中的文件裡。
將 /etc/cups/cups-files.conf
中的 AccessLog
、ErrorLog
和 PageLog
指令的值改為 syslog
,CUPS 可以把日誌記錄到 systemd 日誌 中。有關原始建議更改的信息,請參閱 Fedora 維基頁面 (英文) 和 cupsd.conf 文檔.
打印伺服器和遠程管理[編輯 | 編輯原始碼]
參見 CUPS/Printer sharing 和 CUPS/Printer sharing#Remote administration。
不使用本地 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。