1. 描述CUPS打印体系结构
打印机在Red Hat Enterprise Linux中由CUPS管理,CUPS是一个开源、模块化的软件套件,最初由Easy software Products开发,目前由Apple领导。
CUPS可以使用许多协议与打印机和打印服务器通信。在大多数情况下,Internet打印协议(IPP)是使用CUPS与打印机通信的首选机制。该协议是对HTTP/1.1的修改,大多数现代网络和USB打印机都支持该协议,通常使用TCP端口631。CUPS可以支持直接连接的打印机(例如,使用并行、串行或USB通信),也可以使用较旧的网络协议,如LPD
CUPS提供了一组命令行工具和web界面,用于管理CUPS和提交打印作业。它还提供了一个守护进程(cupsd),用于管理每个已配置打印机的作业队列。打印机的每个队列都与一个描述打印机特性的PostScript printer Description (PPD)文件相关联,以及CUPS应该如何为在该打印机上打印准备作业。
2. 发现网络打印机与IPP
大多数网络打印机支持IPP Everywhere标准,它允许您查找、配置和打印到网络打印机,而不需要特定于硬件的驱动程序或其他软件。Apple Zeroconf规范处理打印机发现,这是由Avahi在红帽企业Linux和Bonjour在苹果的macOS实现。
- 打印机通过本地多播DNS (mDNS)使用DNS服务发现(DNSSD)来发布它的存在和基本功能。
- 当您第一次配置打印机队列时,CUPS使用此信息自动发现打印机特性并为该打印机构建自定义PPD。
- 当您的客户端为打印机准备打印作业时,CUPS首先将其格式化为打印机能够理解的页面描述语言(PDL),这是基于在何时从打印机获得的CUPS列表它创建了队列。这通常是PDF或光栅图像优化的打印机分辨率。
- 您的客户端使用IPP协议将格式化作业发送到打印机。
因为IPP Everywhere打印机用mDNS通告他们的本地网络存在和打印机功能,安装avahi包能够接收mDNS消息。cups-ipptool包提供了一个实用程序,可以用来发现本地IPP Everywhere打印机,ippfind。
安装Red Hat Enterprise Linux 8软件需要发现IPP Everywhere网络打印机:
[root@host ~]# yum install avahi cups-ipptool
调整防火墙规则,允许mDNS报文进入:
[root@host ~]# firewall-cmd --add-service=mdns
[root@host ~]# firewall-cmd --add-service=mdns --permanent
使用ippfind命令发现本地网络上所有可用的IPP打印机。这个命令有一个默认的一秒超时,所以使用-T SECONDS选项指定一个超时,以允许打印机有更多的时间响应。
[root@host ~]# ippfind -T 20
ipp://server12.local:631/printers/bwprinter
前面的示例显示了一个可用于配置打印机的URI。server12.local是该打印机的mDNS名称。以 .local结尾的名字。Local是链接loca名称,它只在特定的网络上有意义。
要将mDNS名称解析为一个IP地址,在本地网络的机器上使用dig执行mDNS查找,使用端口5353上的多播地址224.0.0.251:
[root@host ~]# dig @224.0.0.251 -p 5353 server12.local
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> @224.0.0.251 -p 5353 server12.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10716
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;server12.local. IN A
;; ANSWER SECTION:
server12.local. 10 IN A 192.0.2.12
;; ADDITIONAL SECTION:
server12.local. 10 IN AAAA 2001:db8:1001::c
;; Query time: 24 msec
;; SERVER: 192.0.2.12#5353(224.0.0.251)
;; WHEN: Fri May 29 15:18:22 CDT 2020
;; MSG SIZE rcvd: 73
您可以使用IPv4或IPv6地址代替server12.local 打印机URI中的本地名称:
ipp://192.0.2.12:631/printers/bwprinter
3. 创建打印队列
在为联网打印机识别uri之后,安装CUPS并在系统上为它们创建打印队列。
Red Hat Enterprise Linux 8将CUPS打印机管理软件作为发行版的一部分。安装cups包。
[root@host ~]# yum install cups
在首次安装时,默认情况下不会启动CUPS。确保它已启用和启动:
[root@host ~]# systemctl enable --now cups
使用lpadmin命令创建打印队列。
[root@host ~]# lpadmin -p QUEUE-NAME -v DEVICE-URI -m everywhere -E
-p QUEUE-NAME定义打印机队列的名称。队列名称只能包含可打印的字符,被认为是保留大小写但不区分大小写的。
-V DEVICE-URI指定打印机的URI,这可能是通过ippfind发现的。如果打印机不在本地链接上,或者您不想使用mDNS名称解析,那么将URI中包含主机名的部分替换为网络打印机的完全限定域名或IP地址。
-m everywhere指定你想使用IPP everywhere打印机模型作为你的“驱动程序”。你应该在大多数网络打印机上使用它。
-E立即启用打印机队列,并允许它开始处理新的作业。如果在-d、-p或-x选项之前指定,它在lpstat连接到服务器时强制加密的效果会有所不同。
使用lpstat -v命令确认打印机队列已定义。这个命令显示可用打印机队列的列表,这些队列具有各自打印机的设备uri。
[root@host ~]# lpstat -v
device for bwprinter: ipp://192.0.2.12:631/printers/bwprinter
device for color: ipp://192.0.2.77:631/ipp/port1
可以使用-d选项设置默认的打印机队列目标。如果没有指定特定的目标,则打印命令将使用默认目标。下面的示例将默认目标设置为bwprinter:
[root@host ~]# lpadmin -d bwprinter
-x选项允许您删除打印机队列:
[root@host ~]# lpadmin -x bwprinter
4. 打印文件和管理打印作业
# 使用lp命令从shell中打印文件。作业将被发送到默认队列,除非使用-d选项指定另一个打印机。
[user@host ~]$ lp FILENAME
[user@host ~]$ lp -d QUEUE-NAME FILENAME
# 如果没有参数,lp命令从标准输入读取。读取标准输入的能力使得该命令对于将其他命令的输出发送到打印机非常有用。
[user@host ~]$ tree | lp
# 使用lpstat命令检查打印作业的当前状态。默认情况下,该命令只显示当前用户提交的作业。可以添加-u选项来显示所有用户提交的作业。
[user@host ~]$ lpstat
bwprinter-3 user 1024 Mon 18 May 2020 02:34:08 PM EDT
bwprinter-5 user 56198 Mon 18 May 2020 02:34:33 PM EDT
[user@host ~]$ lpstat -u
bwprinter-3 user 1024 Mon 18 May 2020 02:34:08 PM EDT
bwprinter-4 root 3072 Mon 18 May 2020 02:34:14 PM EDT
bwprinter-5 user 56198 Mon 18 May 2020 02:34:33 PM EDT
# 使用cancel命令取消打印机队列中的作业。指定要取消的作业ID:
[user@hots ~]$ cancel bwprinter-4
# 还可以通过指定作业的ID号(本例中为作业4)来取消作业。如果不指定选项,则取消队列中的下一个作业。
# 使用-a选项取消特定队列的所有作业:
[user@hots ~]$ cancel -a bwprinter
5. 管理打印机队列
如果需要执行维护,可能希望停止或重新启动打印机队列的处理。可能还想检查队列是否正在处理作业,或者是否被禁用。
#暂停打印
在对打印机进行维护时,可以暂时禁用打印机队列,同时允许用户向该队列添加新作业。下面的示例禁用bwprinter的队列。可选的-r选项允许您指定打印机不打印的原因。
[root@host ~]# cupsdisable -r 'Replacing toner' bwprinter
#使用cupsenable来配置队列以恢复打印:
[root@host ~]# cupsenable bwprinter
#拒绝队列中的新打印作业
如果打印机长时间宕机,可以使用cupsreject命令将其配置为停止接受新作业。如果在运行此命令时启用了队列,则将处理队列中剩余的任何作业,直到队列为空为止。
[root@host ~]# cupsreject -r 'Out for servicing' bwprinter
使用cupsaccept来配置队列以继续接受新的打印作业
[root@host ~]# cupsaccept bwprinter
#注意:另一个用于维护的有用工具是lpmove命令,您可以使用该命令将作业从一个队列移动到另一个队列。
#查看打印机队列状态
可以使用Lpstat -p命令查看所有活动打印机的状态,包括它们的队列是否已禁用打印作业处理或正在拒绝作业
[root@host ~]# lpstat -p
printer bwprinter is idle. enabled since Thu 28 May 2020 05:23:49 PM CDT
printer color is idle. enabled since Sat 23 Nov 2019 12:29:47 PM CST
[root@host ~]# cupsdisable bwprinter
[root@host ~]# lpstat -p
printer bwprinter disabled since Thu 28 May 2020 05:26:57 PM CDT -
Paused
printer color is idle. enabled since Sat 23 Nov 2019 12:29:47 PM CST
[root@host ~]# cupsenable bwprinter
[root@host ~]# cupsreject bwprinter
[root@host ~]# lpstat -p
printer bwprinter is idle. enabled since Thu 28 May 2020 05:28:46 PM CDT
Rejecting Jobs
printer color is idle. enabled since Sat 23 Nov 2019 12:29:47 PM CST
6. 课本练习
[student@workstation ~]$ lab printing-config start
该命令确保在serverc上配置了IPP Everywhere打印机。您可以在web浏览器中通过以下URL查看发送到此打印机的打印作业:http://serverd/ippserver/ipp-everywhere-pdf。
1. 安装所需的软件和配置servera以允许它发现IPP Everywhere打印机。
安装提供发现联网打印机软件的软件包。
[root@servera ~]# yum -y install cups-ipptool avahi
[root@servera ~]# firewall-cmd --add-service=mdns
success
[root@servera ~]# firewall-cmd --add-service=mdns --permanent
success
# 使用ippfind命令发现可用的网络打印机。指定5秒的超时时间,以便打印机有时间响应。
[root@servera ~]# ippfind -T 5
ipp://serverc.local:631/printers/rht-printer
2. 在服务器上安装CUPS并配置打印队列,该队列将作业发送到所发现的网络打印机。
安装提供CUPS打印服务器的包。
[root@servera ~]# yum -y install cups
[root@servera ~]# systemctl enable --now cups.service
# 为指向远程打印机的名为my-printer的IPP Everywhere打印机创建一个打印队列。
[root@servera ~]# lpadmin -p my-printer \
-v ipp://serverc.lab.example.com:631/printers/rht-printer \
-m everywhere -E
[root@servera ~]# lpstat -v
device for my-printer: ipp://serverc.lab.example.com:631/printers/rht-printer
# 将my-printer打印队列设置为默认队列
[root@servera ~]# lpadmin -d my-printer
3. 发送一些内容到您的新打印机。
在web浏览器中查看打印机输出,网址如下:http://serverd/ippserver/ipp-everywhere-pdf。
创建打印作业。打印服务器根主目录下的anaconda-ks.cfg文件。
[root@servera ~]# lp anaconda-ks.cfg
request id is my-printer-1 (1 file(s))
4. 配置my-printer打印队列以拒绝、然后接受传入的打印作业。
[root@servera ~]# cupsreject -r 'Out for service' my-printer
[root@servera ~]# ls -l | lp
lp: Destination "my-printer" is not accepting jobs.
[root@servera ~]# lpstat -p my-printer
printer my-printer is idle. enabled since Wed 16 Jun 2021 05:37:37 PM CST
Out for service
[root@servera ~]# cupsaccept my-printer
[root@servera ~]# ls -l | lp
request id is my-printer-2 (0 file(s))
5. 配置my-printer打印队列,使其接受新作业进入其队列,但不将其转发给打印机。
在测试确认作业已排队但未发送后,重新启用打印队列。
[root@servera ~]# cupsdisable my-printer
[root@servera ~]# cd
[root@servera ~]# lp .bashrc
request id is my-printer-3 (1 file(s))
[root@servera ~]# lp .bash_profile
request id is my-printer-4 (1 file(s))
[root@servera ~]# lpstat
my-printer-3 root 1024 Wed 16 Jun 2021 05:43:12 PM CST
my-printer-4 root 1024 Wed 16 Jun 2021 05:43:18 PM CST
[root@servera ~]# cancel 3
[root@servera ~]# lpstat
my-printer-4 root 1024 Wed 16 Jun 2021 05:43:18 PM CST
[root@servera ~]# cupsenable my-printer
[root@servera ~]# lpstat
如果Ipstat仍然在队列中列出作业,请给打印机几秒钟时间来处理这些作业,然后再次运行Lpstat。
完成实验。
[student@workstation ~]$ lab printing-config finish
总结
- 介绍CUPS打印体系结构。
- 介绍网络打印机与IPP。
- 如何创建和管理打印队列。
吴 苏楠
嗯~ o(* ̄▽ ̄*)o