作者: Bryan Pfaffenberger, TechRepublic
在连接局域网时,一个焦点问题就是怎样实现打印机的共享,从而节省大量费用
。考虑一下给每个用户都装备一台象样的打印机需要花费多少钱。象其他网络操作系统一样,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。