在连接局域网时,一个焦点问题就是怎样实现打印机的共享,从而节省大量费用
。考虑一下给每个用户都装备一台象样的打印机需要花费多少钱。象其他网络操作系统一样, Linux 为网络中的打印机实现共享提供了很好的环境。如果使用 Linux ,你不必为你不会用到的商业应用和硬件花费大量的费用。要是 Linux 只花费很少或者无需任何费用就可以做同样的工作,那为什么还要去买惠普昂贵的打印机服务器呢?让我们来看一下怎样使打印机在 Linux 的本地环境中实现共享。

 

前提条件:本地打印机
这篇文章假定在你的 Linux 系统中已经安装了一个本地打印机,直接向你介绍怎样在网络中共享你的打印机。如果你还没有安装本地打印机,你需要先安装一个,然后再看这篇文章。现在的 Linux 具有更加易用,友好的打印机配置工具,例如 Red Hat 的打印工具。如果你用的不是 Red Hat ,请你查看你的文档,查阅怎样在你的系统中安装一个打印机。

 

介绍 Line Printer Daemon lpd

 

尽管一些 Linux 的配置中提供了可选的打印机接口,但比较普遍的还是 Line Printer Daemon lpd )。当一个应用程序需要打印服务, lpd 被激发。它在 /var/spool/lpd 的临时存储区域中新建一个打印输出文件,然后,它查找打印机并且根据打印机的速度将打印输出分割打包。如果 lpd 在完成第一项工作之前,又收到了其他的打印请求,它建立一个等待打印文件的队列。由于不同的打印机有不同的特性, lpd 是怎么知道如何去打印一个文件呢? lpd 的配置文件 /etc/printcap 将告诉你答案。在这个文件中,有一个或许多小节,看上去象一首诗一样,是配置命令块。每一个小节定义一种打印机,它提供了诸如打印机怎样连接到电脑,将用到哪个 filter 文件等信息。对每一种打印机来说,它具有唯一的 filter 文件。它定义了这种打印机的特性和性能。

 

请记住 lpd 是一项网络服务,即使你在单机或只有一个用户的工作站上应用 Linux 。当一个应用程序需要 lpd 的服务时,它通过 TCP/IP 发出一个请求。因此,如果一个本地的应用程序可以通过本地的 lpd 发出服务请求,那网络中的任何应用程序同样可以做到。如果你对服务端和客户端的配置正确,对用户而言,网络打印就会变得完全透明了。

 

在使用 Linux 之前,如果你一直在一个 Windows 网络背景下工作,你可能认为为了在网络中共享打印机,在服务端或客户端安装网络文件系统( NFS )服务是必要的。因为在 Windows 中,网络打印和文件共享是由同一个巨大而复杂的协议支持的,这个协议被称为服务信息块( SMB )。但 Linux 不是这样的,受 UNIX 的遗传, Linux 的工具集显得更小巧,功能更集中,也就有更少的 bug NFS 处理文件共享的方法完全独立于打印共享。同样地, lpd 处理打印共享并不需要 NFS

 

在我们开始之前,我应该阐明一些术语
Linux 中的服务端是指打印机所连接的主机,客户端是指远程使用打印机的主机。例如,在一个有四台主机的网络中(它们分别为 luke, leia, yoda, han ),打印机安装在 luke 上。因此, luke 就是服务端,其它的主机将远程使用打印机,它们就是客户端。为了使一个本地打印机成为网络打印机,需要以下一些步骤:

 

在服务端,为每个将远程使用打印机的客户建立一个帐号。你需要创建一个名为 /etc/hosts.lpd 的配置文件。这个文件包括可以使用打印机的主机名或 IP 地址。

 

在每个客户端,在 /etc/printcap 中添加一小节来说明打印机的特性和位置。你可以利用 Linux 自带的配置工具来配置打印机,也可以为每个客户端系统手工配置 /etc/printcap 文件。

 

第一步:首先准备网络打印的服务端。
让我们注意服务端,你必须确信打印机被正确的连接而且可以正常工作。现在,你要确信连接在主机上需要打印服务的所有用户都有一个帐号。如果你计划用 NFS ,就要确信帐号中的内容是唯一的:用户名,用户的 ID 号( UID ),主成员组和主 ID 组( GID )。

 

在连接着打印机的主机上,打开一个终端窗口,用超级用户进入。然后,在文本编辑器中新建一个文件,如果你想在 luke 上为 leia, yoda, han 提供网络打印服务,就在文件中键入

 

leia
yoda
han

 

为了利用这些用户名,网络所有的主机都必须在 /etc/hosts 文件中列出每一个的用户名,相应的 IP 地址和域名,就象下面的一样:

 

192.168.1.10 luke.mydomain.org luke
192.168.1.11 leia.mydomain.org leia
192.168.1.12 yoda.mydomain.org yoda
192.158.1.13 han.mydomain.org han

 

如果你没有用这种方法建立你的 /etc/hosts 文件,你也可以用每个客户端的 IP 地址代替用户名,象下面:

 

192.168.1.11
192.168.1.12
192.168.1.13

 

完成以后,你可以保存文件,然后退出。

 

作者的注释
如果你读过一些早先关于 Internet 的文件,你可能会觉得正确的配置文件名称是 /etc/hosts.equiv ,但千万不要用这个名称创建和使用文件!它存在一个明显的安全漏洞。 hosts.equiv 列出的主机可以不受任何限制访问服务端,准许这种访问显然不是好事情,即使在一个所有人都相互信任而且也不会有任何人做坏事情的小网络。如果发生意外,或有人做了坏事情,你应该避免危害到网络中的其他系统。在一个大型的网络中,特别是在一个连接着 Internet 的网络中,用 hosts.equiv 就是自找麻烦。相反地,用 hosts.lpd 可以在网络中共享打印机,而不必冒 hosts.equiv 那么大的风险。

 

第二步:配置客户端
为了使你的客户端能够远程使用打印机,你需要知道怎样在你的 Linux 中利用打印配置工具来建立客户端。如果你用的是 Red Hat 或者以 Red Hat 为基础的系统,你可以利用自带的打印工具。其他系统也提供类似的工具。尽管这些说明是针对特定的打印工具,但你应该可以改编下面的步骤,以适应你的打印机配置工具:

 

以系统权限登录,并开启打印机配置工具。在 Red Hat 或者以 Red Hat 为基础的系统中以超级用户执行配置工具,键入 /usr/sbin/printtool ,按回车。你将看到 Red Hat Linux 的打印系统管理器。

 

点击 ADD 来创建一个新的打印机模型,你将看到增加了一个打印机登录对话框。

 

选择删除 Unix lpd )队列,点击 OK 。你将看到编辑远程 Unix lpd )队列登录对话框。

 

在填写名称的地方,为打印机键入一个或多个名称,名称间用竖线隔开,如果系统提示一个名称,你应该用它。在填写地址的地方,接受系统提供的地址。对远程打印机而言,每一个客户端都会有自己的本地打印地址。在填写远程主机的地方,键入打印机所连主机的 IP 地址。

 

在填写远程队列的地方,键入远程打印机的名称队列。如果在远端系统中只定义了一个打印机,键入 lp 。如果远端系统的 /etc/printcap 文件中不止一个打印机,打开这个文件,并且确定打印机队列中的名称(例如 lp0, lp1, 或着 lp2 )。

 

打开 Input Filter 文件,在列表中选择计算机类型。如果你的打印机不在列表中,属于其他类型,选择 PostScript Printer 。点击 OK ,退出 Input Filter 列表。

 

点击 OK 来确认网络打印机的设置,这些将添加并保存在 /etc/printcap 中。如果你用的是其他的打印机配置工具,确信你所做的配置设置得到保存。点击菜单栏上的 Tests ,选择 Print PostScript Test Page ,让打印机打印测试页。

 

如果测试不成功,你就要查找原因。首先,服务端的打印机在正常工作。然后,再次检查你的 /etc/hosts.lpd 文件(看上面的第一步)。你是否正确输入计算机名称或 IP 地址?接着,检查客户端配置。仔细地检查你的输入。现在,试着从这个问题主机的用户帐号中使用打印机。如果远程打印机在打印测试工具下正常工作,在用户帐号中却相反,在服务端的用户帐号肯定出了问题。为了实现远程打印,服务器上必须建立与用户所在的客户端一致的帐号。如果在两个用户间有任何差异,例如用户 ID 或者主成员组发生冲突,把它改过来。(在 Red Hat 系统中,你可以用 LinuxConf 更改用户帐号信息。)

 

在网络中的所有客户机上重复以上的步骤。如果在客户端使用远程打印机出现问题,这个问题几乎肯定是缘于在服务端的用户帐号,服务端的 /etc/hosts.lpd 文件,或是一个简单的输入错误。

 

 

关于 /etc/printcap

 

如果你想知道更多的关于 lpd 是怎样实现远程打印的,请查看打印机配置工具在 /etc/printcap 中创建的小节
。然而,不要做任何改动,除非你确信自己在做什么。特别地,如果这个小节是配置工具写入的,一定不要做任何改动。一些工具,例如 Red Hat 的打印工具,有自己特定的语法规则,你做的任何改动都可能使你的打印机停止工作。如果你必须更改你的打印机设置,请再次运行工具。这有一个例子,说明一个客户端成功的使用远程打印机:

 

lp|grumpy|deskjet:\
:sd=/var/spool/lpd/lp:\
:mx=#0:\
:sh:\
:rm=192.168.100.34:\
:rp=lp:\
:if=/var/spool/lpd/lp/filter:

 

这里不适合对 /etc/printcap 做过长的论述,但我应该指出一些需要注意的地方:

 

 

一个小节必须表达在一行中。尽管这可能导致难以理解,另外,你可以插入反斜线来分割一行。如果打印机没有正常工作,确信每行的小节都是以反斜线结束的(当然,除了最后一行)。

 

冒号将小节分成若干部分。

 

在列表的第一行表示打印机和相应名称,用竖线割开。

 

一些变量是布尔型的,取值为 yes/no on/off 。如果存在于文件中,它们将自动发挥作用。

 

其他变量需要指定值,赋值用等号,例如 sd=/var/spool/lpd/lp 。还有一些是数字型变量,赋值用数字操作符 # ,例如, mx#0

 

默认的打印机名称是 lp 。其他打印机命名为 lp0, lp1, lp2 等等。

 

变量 sd 指定打印机的目录位置。 /etc/printcap 中的小节访问远程打印机,而 spool /var/spool/lpd/lp )存储着本地信息。

 

变量 mx 指出在打印机的打印文件队列中所允许的文件最大值。如果允许任意大小的文件打印,则 mx=#0

 

变量 sh (如果有的话)禁止打印文件的头,头说明了将要打印文件的工作名称和所用资源。如果你在一个有大量用户的大型网络中配置打印机的话,为了使服务人员便于将打印结果分类,你可能希望打印出这个头。

 

变量 rm 指出远程打印机的位置。你可以用一个名称(例如 luke ),或者 IP 地址(例如 192.168.1.10 )。

 

变量 rp 指出远程打印队列的名称。要求这个变量的值和服务端 /etc/printcap 文件中的名称要一致。如果远程打印机在服务端 /etc/printcap 文件中的名字为 lp0 ,那打印队列的名称也应该是 lp0

 

变量 if 说明将要使用打印机的主机中 filter 文件的位置。

 

结论

 

下周,我们将更深入的探讨打印机的共享,告诉你怎样在网络中向你的 Windows Mac 用户提供打印服务
。想做到这些,你必须使用一个包含完整文档说明的软件包,被称为 Samba ,一个可以执行 Windows 网络协议的 Linux 应用。你还需要一个相关的软件包,名字叫 netatalk ,它支持 Macintosh 用户访问 Linux 文件和打印机。当做完这些,我们就知道了怎样在网络中对 Linux, UNIX, Windows, Mac 用户共享你的 Linux 打印机。这是一个技巧,可以使你节省许多费用,不必去买商业应用软件。