[ale] article for your review
David S. Jackson
dsj at sylvester.dsj.net
Thu Nov 15 18:17:00 EST 2001
Hi,
I'm writing an article about generically printing in UNIX/Linux.
In about 1000 words, I'm trying to capture the guts of printing
in UNIX (in which I'm including Linux), so I can't get extremely
specific, but hopefully I'm specific enough to capture the
essence and still be accurate. I try to point to other resources
for further details.
Please tell me what you think. I've attached latex and text; use
whichever suits you better.
Thanks in advance.
--
David S. Jackson dsj at dsj.net
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
God is a comic playing to an audience that's afraid
to laugh.
unixprinting.tex
Printing in UNIX
UNIX is a multi-user network operating system, so it specializes in
sharing devices and resources. The simplest way to do this is with the most
uncomplicated elements necessarily, such as with simple text files. It's hard
to break a simple text file, and even if something did happen to it, it's easy
to fix. That's why UNIX systems have depended on it for configuring
servers, such as print servers.
The central printing program on UNIX systems is a print server, also
called a "spooler," that usually goes by the name lpd. Unlike a single-user
system, UNIX expects to share many devices with many people that might
be spread out over a large area. To accommodate this requirement, lpd can
handle many shared printers (over a network) with many print jobs from
many people, all at the same time.
Since multiple users and multiple jobs are expected, each printer has a
print queue that lpd keeps watch over. In fact, any UNIX machine may run
lpd, regardless of whether it has a printer attached. For instance, in my
home network, I have 12 machines and three printers connected. All
internal machines run lpd. Thus, I can print from any machine across the
network to any machine that has a printer attached. The lpd on one
machine talks to the lpd on the machine with the desired printer attached,
and all jobs get handed off correctly. This is called remote printing.
After you've physically connected your printer to your print server
(which is what the box you connect your printer to will become), you just
need to print a test page to see that that connection is okay. Try
lptest | /dev/lp0 if that exists on your system.
/etc/printcap. The configuration file for the printer daemon is normally
/etc/printcap. It has a rather simple syntax, once you know what the
abbreviations mean. And, fortunately, you only really need to know about
five or six of the abbreviations for most configurations. Most configuration
files come with sample configurations commented out so you can
uncomment one that applies to your needs and customize as needed.
There are basically two types of printers, as far as lpd is concerned:
local and remote. Your default /etc/printcap will most likely already
contain entries for both that are commented out. You will probably only
need to change a few values so you can be off and running.
Assuming you have multiple hosts you'll be working with, you first
configure the printcap file on the print server, restart that daemon, then
1
configure the client printcaps and restart their respective daemons. Here's a
sample printcap file:
#sample local printer entry
lp|deskjet:\ #name of local printer
:lp=/dev/lpt0 #name of device
:sd=/var/spool/output/lpd #name of spool directory
:lf=/var/log/lpd-errs #name of log file
:sh: #suppress headers
#sample remote printer entry
disney | color_printer:\ #name printer goes by
:lp= #blank field: non-local device
:rm=host1 #name of host connected to prtr.
:rp=disney #name printer goes by on host
:sd=/var/spool/output/lpd #local spool directory
:lf=/var/log/lpd-errs #local log file
:sh: #suppress headers on
#sample additional remote printer entry
laserjet | epson:\ #name printer goes by
:lp= #blank field: non-local prtr.
:rm=host2 #name of host connected to prtr
:rp=laserjet #name printer goes by on host
:sd=/var/spool/output/lpd #local spool directory
:lf=/var/log/lpd-errs #local log file
:sh: #supress banners
Notice above how you can almost get away with just knowing lp, sd, lf,
rm, rp, and sh. Notice also that you must supply the actual hostname for
remote printers for the "rm" parameter. If that host's name is "Wally" on
your network, then put that. If "Beaver", put that instead. Just use the
hostname, not the fully qualified domain name, such as wally.myhome.net.
For all those I have ommitted, please see man printcap.
Print Filters. When you stop and think about it, there are many many
different types of documents that the everyday printer is expected to print.
Consider all the different types of graphic formats, the different document
types, the different compression types. Consider the different types of
applications all printing to the same printer. They're all expected to
chatter away with no complaints despite their very different natures. Well,
it's too much to ask a single server to handle all these different types of
formats, so we solve this problem with print filters. You queue a file to the
printer, and before it actually gets to the printer, a filter translates it into
2
something the printer can actually understand. All this, of course, is
transparent to you unless you're the lucky one to configure it.
Several filters exist but one of the most common is called apsfilter
(www.apsfilter.org). It might well be installed on your system already. Or
it might be called something else on your system. When you install it, it
will run a setup program that asks for information about your printer and
modifies your /etc/printcap file accordingly. Once it's configured properly,
you'll be able to print the supported types of files from all your various
applications.
Another approach for configuring printing under UNIX is called
"CUPS." See www.cups.org. It will probably make all what I'm talking
obsolete one day. Until then, it can't hurt to understand how to configure
your printer by hand.
Restarting the Daemon. After you modify /etc/printcap, you will likely
need to restart lpd. Your version of apsfilter might have done this already.
How you restart the printer daemond depends on your system, but a
rootshell with kill HUP `pidof lpd` should do it for you. Note: on
non-SysV systems, try $(killall -s -d $1 | cut -d ' ' -f 3) for
"pidof".
Now, you should be in business. If something seems amiss, be sure you
read the logs in /var/log, or wherever your logs happen to be. Remember,
your log file will be whatever file you specified in /etc/printcap with the
"lf=" value.
Remote Printing. What I've described is well and fine if you're printing
locally. But what if you want to use a printer that isn't connected to your
own computer?
If you look at the /etc/printcap file that already exists on your system,
you probably already have an entry for a remote printer. Usually, the
printcap file assumes you have a local printer, called lp, and a remote
printer by some other name. If you don't have a local printer, you can
rename the entry for your remote printer and call that lp.
For example, on my network, the printer I print most often to is called
simply lp. If I want to print to another printer, I must specify it with the
-Pprintername switch that I pass to the lpd program:
lpr -Pnextprinter file2prt
My printcap entry looks like this:
lp:lp=:rm=sylvester:rp=lp:sd=/var/spool/output/sylvester:lf=/var/log/lpd-errs:sh
Where sylvester is the host the remote printer is connected to, the logfile is
3
/var/log/lpd-errs, and the local spool directory is
/var/spool/output/sylvester.
Remote printing can present a security risk to your network. Therefore,
be certain that you have your print server closed off to print requests from
outside your local network, or even from hosts on your network that you
don't want to give permission to print. Pay attention to your TCP
Wrappers, since you might have to include the allowed hosts you want to
print from in your /etc/hosts.allow or /etc/hosts.equiv file on your
print server. Make sure your firewall blocks remote print requests
originating outside your network.
4
---
This message has been sent through the ALE general discussion list.
See http://www.ale.org/mailing-lists.shtml for more info. Problems should be
sent to listmaster at ale dot org.
More information about the Ale
mailing list