下面几节介绍一些最常遇到的打印机硬件和软件问题以及解决或避免这些问题的方法。 讨论的主题有 GDI 打印机、PPD 文件和端口配置。另外还讨论常见网络打印机问题、打印件问题以及队列处理。
这些打印机不支持任何常见的打印机语言,只能使用专门的专有控制系列来进行寻址。因此这些打印机只能用于制造商提供了驱动程序的操作系统版本。 GDI 是 Microsoft* 为图形设备开发的编程接口。 通常制造商只提供 Windows 的驱动程序,而因为 Windows 驱动程序使用 GDI 界面,所以这些打印机也称作 GDI 打印机。实际问题不是编程接口,而是这些打印机只能通过相应打印机型号的专用打印机语言进行处理。
某些 GDI 打印机可切换成以 GDI 方式或一种标准打印机语言进行操作。请参见打印机手册以了解这是否可行。有些型号需要有专门的 Windows 软件来进行切换(注:Windows 打印机驱动程序在通过 Windows 进行打印时可能总是将打印机切换回 GDI 模式)。对于其他 GDI 打印机,还有针对标准打印机语言的扩展模块。
某些制造商为他们的打印机提供专有驱动程序。 专有打印机驱动程序的缺点在于不能保证这些驱动程序可用于已安装的打印系统,也不能保证它们适合各种硬件平台。相反,支持标准打印机语言的打印机不依赖于特殊的打印系统版本或特殊的硬件平台。
与其花时间使专有 Linux 驱动程序工作,不如购买一台支持的打印机,这样更经济一些。 这可以一次性全部解决驱动程序问题,从而无需安装并配置特殊驱动程序软件,也无需获取由于打印系统中开发的新功能而必须安装的驱动程序更新。
如果 manufacturer-PPDs 包不包含任何用于 PostScript 打印机的合适 PPD 文件,则可以使用打印机制造商提供的驱动程序 CD 上的 PPD 文件或从打印机制造商网页下载合适的 PPD 文件。
如果以 zip 存档 (.zip) 或自解压缩 zip 存档 (.exe) 的形式提供 PPD 文件,则用 unzip 命令将其解包。 首先,查看 PPD 文件的许可证协议条款。 然后使用 cupstestppd 实用程序来确认 PPD 文件是否与“ Adobe PostScript 打印机描述文件格式规范 V4.3” 相符合,如果实用程序返回 “FAIL,”则描述 PPD 文件中的错误很严重,可能导致重大问题。应该解决 cupstestppd 报告的问题点。 如果需要,询问打印机制造商是否提供合适的 PPD 文件。
最安全的方法是将打印机直接连接到第一个并行端口并在 BIOS 中选择以下并行端口设置:
I/0 地址:378(十六进制)
中断:无关
模式:Normal、SPP 或 Output Only
DMA:禁用
如果即便进行了这些设置仍无法对并行端口上的打印机进行寻址,则按照 BIOS 中的设置在 /etc/modprobe.conf 中以 0x378 形式显式输入 I/O 地址。 如果有两个并行端口,分别被设置为 I/O 地址 378 和 278(十六进制),则以 0x378,0x278 形式输入这两个端口。
如果中断 7 可用,则可以用 例 12.1 “/etc/modprobe.conf:第一个并行端口的中断方式” 中显示的项将其激活。 在激活中断方式之前,检查文件 /proc/interrupts 看看哪些中断仍在使用中。 只显示当前正在使用的中断。 根据哪些硬件部件处于活动状态,这可能会有所变化。 用于并行端口的中断一定不能被任何其他设备使用。 如果您不确定,则使用巡回检测方式,设置 irq=none。
例 12.1. /etc/modprobe.conf:第一个并行端口的中断方式
alias parport_lowlevel parport_pc options parport_pc io=0x378 irq=7
将打印机直接连接到计算机。 出于测试目的,将该打印机配置为本地打印机。 如果打印机可以工作,则问题与网络有关。
TCP/IP 网络和名称解析必须可以正常工作。
使用以下命令测试是否可以与 host 上的 lpd(端口 515)建立 TCP 连接:
netcat -z host 515 && echo ok || echo failed如果不能建立与 lpd 的连接,则 lpd 可能不处于活动状态或可能存在基本网络问题。
以 root 用户身份使用以下命令查询远程 host 上 queue 的状态报告(可能非常长),前提是相应的 lpd 处于活动状态并且主机接受查询:
echo -e "\004queue" \
| netcat -w 2 -p 722 host 515
如果 lpd 不响应,则它可能不处于活动状态或可能存在基本网络问题。 如果 lpd 响应,响应应该描述为什么在主机的队列 上不能进行打印。 如果您接收到类似例 12.2 “来自 lpd 的错误消息” 中的响应,则问题是由远程 lpd 引起的。
例 12.2. 来自 lpd 的错误消息
lpd: your host does not have line printer access lpd: queue does not exist printer: spooling disabled printer: printing disabled
默认情况下,CUPS 网络服务器应该每隔 30 秒在 UDP 端口 631 上广播其队列。 因此,以下命令可用于测试网络中是否有 CUPS 网络服务器。执行此命令之前,务必停止本地 CUPS 守护程序。
netcat -u -l -p 631 & PID=$! ; sleep 40 ; kill $PID
如果广播 CUPS 网络服务器存在,则输出如例 12.3 “来自 CUPS 网络服务器的广播”所示。
以下命令可用于测试是否可以与 host 上的 cupsd(端口 631)建立 TCP 连接:
netcat -z host 631 && echo ok || echo failed
如果不能建立与 cupsd 的连接,则 cupsd 可能不处于活动状态或可能存在基本网络问题。如果 cupsd 处于活动状态并且主机接受查询,lpstat -h host -l -t 会返回 host 上所有队列的状态报告(可能非常长)。
下一个命令用于测试 host 上的 queue 是否接受由单个回车字符组成的打印任务。 不应打印任何内容。 可能会弹出一页空白纸。
echo -en "\r" \
| lp -d queue -h host当在打印服务器计算机中运行的假脱机程序要处理大量打印任务时,有时会导致出现问题。由于这是打印服务器计算机中的假脱机程序导致的,目前尚无解决此问题的方法。作为变通方法,可以直接通过 TCP 套接字对连接到打印服务器计算机的打印机进行寻址来绕过打印服务器计算机中的假脱机程序。请参见第 12.4 节 “网络打印机”。
这样,打印服务器计算机仅用作数据传送(TCP/IP 网络和本地打印机连接)各种不同形式之间的转换器。 要使用此方法,您需要知道打印服务器计算机上的 TCP 端口。 如果打印机连接在打印服务器计算机上并且打开了电源,则通常可以在打开打印服务器计算机的电源后使用 nmap 包中的 nmap 实用程序确定此 TCP 端口。例如,nmap IP-address 可能会在打印服务器打印机中产生以下输出:
Port State Service 23/tcp open telnet 80/tcp open http 515/tcp open printer 631/tcp open cups 9100/tcp open jetdirect
此输出指出可以在端口 9100 上通过 TCP 套接字对连接到打印服务器计算机的打印机进行寻址。 默认情况下,nmap 只检查在 /usr/share/nmap/nmap-services 中列出的一些常见的端口。 要检查所有可能的端口,请使用命令 nmap -p from_port-to_portIP-address。 这可能要花一些时间。 有关详细信息,请参见 nmap 的手册页。
输入如下命令
echo -en "\rHello\r\f" | netcat -w 1 IP-address port cat file | netcat -w 1 IP-address port
将字符串或文件直接发送到相应的端口以测试是否可以在该端口上对打印机进行寻址。
对于打印系统,打印任务完成的标志是 CUPS 后端完成到接收方(打印机)的数据传送。 如果在接收方的进一步处理失败(例如,如果打印机无法打印特定于打印机的数据),则打印系统不会对此进行通知。如果打印机无法打印特定于打印机的数据,请选择另一个更适合该打印机的 PPD 文件。
如果向接收方传送数据在多次尝试后都失败,则 CUPS 后端(例如 USB 或 socket)向打印系统(向 cupsd)报告一个错误。 后端用于确定在将数据传送报告为不可行前应执行的失败尝试次数。由于继续尝试可能也是徒劳,cupsd 将禁用相应队列的打印。在消除了问题的起因后,系统管理员必须使用 cupsenable 命令重启用打印。
如果 CUPS 网络服务器通过浏览向客户机主机广播其队列并且客户机主机上合适的本地 cupsd 处于活动状态,则客户机 cupsd 接受来自应用程序的打印任务并将它们转发到服务器上的 cupsd。 当 cupsd 接受打印任务后,会为该任务指派一个新的任务号。 因此,客户机主机上的任务号与服务器上的任务号不同。 因为通常都将打印任务立即转发,所以不能用客户端主机上的任务号将其删除,原因是一旦将打印任务转发到服务器 cupsd,客户端 cupsd 就会将打印任务视为已完成。
要删除服务器上的打印任务,请使用命令(例如 lpstat -h cups.example.com -o)确定服务器上的任务号,前提是此服务器尚未完成该打印任务(即尚未完全将其发送到打印机)。使用此任务号,可以删除服务器上的打印任务:
cancel -h cups.example.com queue-jobnnumber如果在打印过程中关闭打印机或计算机,则打印任务将保留在队列中。再次打开计算机(或打印机)后,打印将继续。必须使用 cancel 从队列中删除有问题的打印任务。
如果打印任务有问题或主机和打印机之间的通讯出现错误,则打印机会打印出很多张带有乱码的纸张,这是因为它不能正确处理数据。 要调整此情况,请执行以下步骤:
要停止打印,请将所有纸张从喷墨打印机中取出或打开激光打印机的纸盒。 高质量的打印机具有一个用于取消当前打印件的按钮。
打印任务可能仍在队列中,因为只有在将任务完全发送到打印机后才会将它们删除。 使用 lpstat -o 或 lpstat -h cups.example.com -o 可以检查哪个队列当前正在打印。使用 cancel queue-jobnumber 或 cancel -h cups.example.com queue-jobnumber 可以删除打印任务。
即使已将打印任务从队列中删除,某些数据仍会被传送到打印机。 检查 CUPS 后端进程是否仍在为相应的队列运行并将其终止。 例如,对于连接到并行端口的打印机,可以使用命令 fuser -k /dev/lp0 终止仍在访问打印机(更准确地说是并行端口)的所有进程。
通过关闭打印机一段时间完全重设置打印机。 然后插入纸张并打开打印机。
使用以下通用过程确定 CUPS 打印系统中的问题:
在 /etc/cups/cupsd.conf 中设置 LogLevel debug。
停止 cupsd。
删除 /var/log/cups/error_log* 从而无需搜索非常长的日志文件。
启动 cupsd。
重复导致问题的操作。
检查 /var/log/cups/error_log* 中的消息以确定问题的原因。
Novell 知识库 (http://support.novell.com/) 中提供了对许多特定问题的解决方案。通过对 CUPS 的文本搜索找到相关文章。