使用 CUPS 的集中打印

作者:Colin Topliss

不论你喜欢与否,打印是每个用户都需要做的事情。在当今异构计算环境中,提供集中的打印解决方案可能很麻烦。仅为 UNIX 系统配备大型专用打印机的日子已经一去不复返了。我仍然记得过去分拣打印件并将它们发送给用户的日子。系统管理员越来越多地发现自己必须让他们的 UNIX 系统打印到位于公司各处办公桌旁的打印机上。再加上对更高安全性的需求,您可能会发现还需要穿过防火墙。

我工作的地方就存在这种情况。许多打印机分散在整个公司,UNIX 系统位于不同的 LAN 上,并且中间有防火墙。没有任何系统可以直接与打印机连接到的 LAN 通信。

CUPS 服务器

CUPS 服务器位于 DMZ 中的 Linux 系统上。此 DMZ 存在于打印机所在的 LAN 和生产系统所在的 LAN 之间。正如我们都期望的那样,在 Linux 上安装 CUPS 非常轻松。添加 RPM,软件就安装好了,可以使用了。

CUPS 服务器的配置也非常简单。所有配置文件都位于 /etc/cups 中。因此,只需修改 cupsd.conf 文件以适应环境即可。我遇到的唯一小问题是在指定监听 IP 地址时。添加listen 127.0.0.1:631到 cupsd.conf 文件中,允许本地主机访问打印机,但远程主机不能访问。将其更改为 CUPS 服务器本身的 IP 允许远程主机访问打印机,但 CUPS 服务器不能访问。我需要两者都出现才能使一切正常工作

listen 127.0.0.1:631
listen 10.42.13.51:631

远程管理非常重要。由于管理必须从与打印机相同的 LAN 完成,因此必须通过防火墙启用端口 631(默认端口)。这允许 HTTP 访问管理工具,这使得定义和管理打印机变得容易得多。

另一个需要注意的端口是 515,即打印机端口。如果拥有 Windows 打印服务器,则必须允许从 CUPS 服务器到 Windows 打印服务器的端口,或者如果直接定义网络打印机,则必须允许从 CUPS 服务器到打印机所在网络的端口。

添加打印机

可以通过几种方式添加打印机。这两种方式都依赖于了解或能够找出哪些打印机可用。在这种情况下,打印机是由 Windows 服务器提供的网络打印机。这实际上非常有用,因为它消除了为 Linux 查找打印机驱动程序的需求。不管你喜不喜欢,打印机驱动程序通常在 Linux 之前在 Windows 下可用,在这种情况下,打印机基础设施已经存在。另一个好处是我们不需要在 DMZ 中打孔以允许打印服务器与网络中的所有打印机通信;连接到公司 LAN 上打印服务器的孔更少。

可以通过 Web 界面添加打印机,也可以手动编辑 printers.conf 文件并创建相关的 .ppd 文件。如果您有示例可以复制,这很棒;否则,使用 Web 界面添加打印机更容易。

以下是从 Windows 服务器 (pserver) 提供的 printers.conf 文件中的示例打印机条目

<DefaultPrinter p1_hp8150_01>
Info 1st Floor Printer (BW)
Location IRELAND
DeviceURI lpd://pserver/p1_hp8150_01
State Idle
Accepting Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
</Printer>

可以在 /etc/cups/ppd 目录中找到相应的 .ppd 文件。此文件的内容完全取决于打印机的类型。Michael R. Sweet 关于 CUPS 的书(ISBN 0-672-32196-3)介绍了在需要时从头开始编写 .ppd 文件。

CUPS 客户端

我遇到的主要难题之一是在 HP-UX11i 下编译 CUPS。这是所有系统管理员最讨厌的噩梦般的情况——有些东西不起作用,而你不太清楚该向谁求助。惠普无法提供帮助,当时在互联网上搜索也一无所获。

很难知道在这种情况下应该采取什么方法。像这样的问题可能是由于缺少补丁、损坏的补丁、损坏的代码或任何其他数量的事情造成的。因此,唯一的选择是尝试一次修复一件事,看看会发生什么。

我做的第一件事是确保我拥有 HP-UX 的最新补丁。没有任何改变,HP ANSI-C 编译器仍然给我带来了问题。我尝试的下一件事是使用 GCC 编译器。我已经安装了一个稍微过时的版本,以及一个稍微旧版本的 binutils。这次出现了不同的错误,但仍然无法编译。只有通过下载最新版本的 GCC 和 binutils(可从 HP-UX 移植中心获得),我最终才能编译 CUPS。即便如此,也并非全是好消息。虽然编译成功,但现在在make install时失败了。这个问题是由于复制命令 cp 使用了错误的选项造成的。事实证明,HP-UX 中包含的 cp 命令不支持 -d 选项。该选项仅适用于 GNU 版本的 cp,它是 fileutils 的一部分。即便如此,在安装了它之后,在完成安装时仍然出现了问题。由于不是 makefile 专家,我开始束手无策。

在 CUPS 网站上重新查找灵感时,我偶然发现了 EPM。我决定值得一试,因为它似乎能够创建软件仓库。作为 HP-UX 管理员,我对这个软件的工作原理有所了解。我知道仓库由从源位置获取的文件组成,然后部署到最终位置,这正是make install未能做到的。值得庆幸的是,EPM 构建没有任何问题,并且我能够生成仓库。此阶段的最后一步涉及安装仓库,我终于发现自己在正确的位置安装了 CUPS。

我必须注意,我确实在 www.cups.org 上提出了错误报告,但设法通过其他方式解决了我的问题。我惊讶地看到错误报告已关闭,(据我所知)没有解决原始问题——代码拒绝编译或完成make install。任何尝试经历相同过程的人都可能会遇到相同的问题。至少有一个解决方法,它包含在错误报告中。

在所需的 HP 服务器上安装 CUPS 对现有的打印设置没有任何影响,部分原因是该应用程序正在调用自定义代码来打印文件,而不是生成标准的 lp 请求。这允许在不影响现有实时服务的情况下安装和测试 CUPS。在考虑在可能影响实时服务的环境中部署 CUPS 时,请记住这一点。

像往常一样,Linux 客户端非常理想。所有需要做的就是将 ServerName 指令更改为 CUPS 服务器的名称。在这种情况下,仅影响了一台服务器。如果您正在考虑在每个用户的基础上分配多台服务器,则最好将 CUPS_SERVER 环境变量设置为所需的 CUPS 服务器的名称。

现在,我们可以尝试使用 lpstat 来查看一切是否正常工作。此命令显示所有可用的打印机。以下示例从干净网络中的系统发布到 DMZ 中的 CUPS 服务器,显示了本地连接的打印机

sys1:/opt # lpstat -t

scheduler is running
system default destination: lp0
device for lp0: parallel:/dev/lp0
lp0 accepting requests since Jan 01 00:00
printer lp0 is idle. enabled since Jan 01 00:00

下一个示例显示了许多远程打印机。这些打印机位于网络上,由 Windows 服务器提供服务

monkey:~# lpstat -t
scheduler is running
system default destination: p1_hp8150_01
device for p1_hp8150_01: lpd://pserver:515/p1_hp8150_01
device for p1_hp8550_01: lpd://pserver:515/p1_hp8550_01
device for p2_hp4100_01: lpd://pserver:515/p2_hp4100_01
p1_hp8150_01 accepting requests since Jan 01 00:00
p1_hp8550_01 accepting requests since Jan 01 00:00
p2_hp4100_01 accepting requests since Jan 01 00:00
printer p1_hp8150_01 is idle. enabled since Jan 01 00:00
printer p1_hp8550_01 is idle. enabled since Jan 01 00:00
printer p2_hp4100_01 is idle. enabled since Jan 01 00:00

打印机现在已定义,因此现在可以尝试测试打印了

sysl:/ # lp -d p1_hp8550_01 /etc/hosts

您的打印作业现在应该出现在打印机上。任务完成。

加载 Disqus 评论