Druckeradministration unter UNIX |
Traditionell wurden Drucker fast ausschließlich über eine serielle Schnittstelle an UNIX-Maschinen angeschlossen. Das hatte mehrere Vorteile. Serielle Leitungen können problemlos 30m lang sein. Damit brauchte der Drucker nicht direkt im EDV-Raum zu stehen. Man konnte den Drucker mit den gleichen Leitungen versorgen, die man bereits für Terminals verwandte. Die parallelen Anschlüsse waren ursprünglich nur im PC-Umfeld üblich und werden darum in erster Linie von den PC-UNIX-Versionen unterstützt. Allerdings findet man parallele Anschlüsse auch an UNIX Workstations. Parallele Leitungen sind in ihrer Länge sehr begrenzt, so dass der Drucker dann fast direkt neben dem Computer stehen muss. Inzwischen werden Drucker meistens über eine Netzverbindung angehängt. Netzkabel sind inzwischen eher billiger als serielle Leitungen.
BSD | AT&T | Funktion |
---|---|---|
lpd | lpsched | Druckdämon |
lpr | lp | Druck absenden |
lpq | lpstat | Status der Druckerwarteschlange ermitteln |
lprm | cancel | Entfernen eines Jobs aus der Druckwarteschlange |
BSD-Unix: lpd, lpr, lpq und lprm
Die /etc/printcap
Jeder Drucker eine Zeile
Die /etc/printcap ist die Konfigurationsdatei für die Drucker im
BSD System. Hier werden alle von der Maschine erreichbaren Drucker definiert,
ihre Warteschlangen und eventuelle Filter.
Jeder Drucker wird in einer Zeile beschrieben. Da die Zeilen aber furchtbar
lang würden, verwendet man den Backslash am Ende der Zeile. Dieser verlagert
das Ende der Zeile auf die nächste Zeile. Die Beschreibung eines Druckers
beginnt mit dessen Namen. Ein Drucker kann mehrere Namen haben, die man durch
einen senkrechten Strich trennt. Diesen Mechanismus benutzt man auch gern
für kurze Druckerbeschreibungen. Üblicherweise nennt man den Standarddrucker
des Systems lp.
Minimalausstattung
Durch Doppelpunkte werden Attribute des Druckers abgetrennt. Die wichtigsten
Einträge sind das Drucker Device (lp), das Spoolverzeichnis (sd) und die
Protokolldatei (lf). Beipielsweise ist der Standarddrucker auf meinem
Linuxsystem folgendermaßen definiert.
lp|lp2|cljet5-a4-auto-color-300|cljet5 a4 auto color 300:\ :lp=/dev/lp0:\ :sd=/var/spool/lpd/cljet5-a4-auto-color-300:\ :lf=/var/spool/lpd/cljet5-a4-auto-color-300/log:\ :if=/var/lib/apsfilter/bin/cljet5-a4-auto-color-300:\ :mx#0:sh:sf: |
Der Hauptdruckername ist lp. Er druckt auf die erste parallele Schnittstelle des Computers /dev/lp0. Das Spooldirectory befindet sich unterhalb des Verzeichnisses /var/spool/lpd und wird nach dem Drucker benannt. Darin befindet sich auch die Protokolldatei mit dem Namen log. Der Eintrag hinter if bezeichnet den Druckerfilter, der in diesem Fall durch einen apsfilter-Skript realisiert wird. Der apsfilter sorgt für die Übersetzung der Postskriptinformationen in die druckereigene Steuerungssprache. Hinter den apsfiltern verbirgt sich letztlich Ghostscript.
Parameter | Bedeutung |
---|---|
mx#0 | maximale Größe des Drucks in Blöcken, 0 heißt unbegrenzt. |
sh | Banner abschalten |
sf | Form-Feed abschalten |
laser|300 dpi Laser|Registratur:\ :lp=:rm=reg_pc01:rp=lp:\ :sd=/var/spool/lpd/laser: |
Der fremde Rechner heißt reg_pc01 und der Druckername auf jenem Rechner ist lp.
Änderungen in der /etc/printcap liest der Druckdämon lpd beim Start. Der Versuch, den lpd zum Neueinlesen zu bewegen, indem man ihm per kill ein SIGHUP schickt, führt zum spontanen Tod des lpd. Das ist aber normalerweise nicht weiter tragisch, da man ihn einfach neu starten kann. Allerdings ist es durchaus klug, mit dem Abschuss zu warten, bis der lpd gerade keinen Druckauftrag bearbeitet.
Es nutzt also gar nichts, einen nicht gewünschten Druck dadurch zu beenden,
dass man den entsprechenden Druckdämon abschießt oder in wilder Panik die
Maschine herunterfährt. Im Gegenteil wird der Druck wieder ganz von vorn
begonnen. Um einen Druck auf brutale Weise abzuwürgen, muss nach dem Abschuss
des lpd also auch das Spoolverzeichnis geräumt werden. Mit Hilfe des
Befehls fuser kann man sogar
ermitteln welcher lpd den Druckauftrag
bearbeitet und so einen Druck abschießen, ohne die anderen Druckaufträge zu
belästigen.
Arbeitsablauf des Druckdämons
Lesen der /etc/printcap
Der lpd liest beim Start die Datei /etc/printcap. Darin
findet er die definierten Drucker und deren Spoolverzeichnisse.
Liegt in einem der Spoolverzeichnisse eine Daten- (beginnt mit d) und eine
Kontrolldatei (beginnt mit c) für einen Ausdruckswunsch, geht lpd
davon aus, dass dieser Auftrag
nicht vollständig ausgedruckt wurde. Ansonsten hätte der vorher laufende
lpd ihn ja schließlich gelöscht. Entsprechend stößt er den Druck
nun noch einmal an.
Zusammenspiel der lpr und des lpd
Wie man den lpr benutzt, um eine Datei zu drucken, wurde im
Kapitel Anwendung bereits beschrieben. Nun soll hinter die Kulissen geblickt
werden.
Das Programm lpr schreibt einen Druckauftrag in das Spoolverzeichnis
des gewünschten Druckers in eine Datendatei. Danach erzeugt es die
Kontrolldatei. Der lpd prüft regelmäßig die Spoolverzeichnisse.
Findet er einen Auftrag mit Daten- und Kontrolldatei, druckt er ihn aus,
indem er sich an die eingetragene Schnittstelle (Parameter lp) wendet. Ist
dieser Eintrag leer und stattdessen ein fremder Host (Parameter rm)
eingetragen, sendet er beide Dateien an den lpd des entsprechenden
Rechners. Er sendet diesem auch den Druckereintrag (Parameter rp), über den
jener ausdrucken soll. Schließlich muss der lpd auf dem Zielrechner
ja wissen, auf welchem seiner Drucker er ausdrucken soll.
gaston# lpq lp is ready and printing Rank Owner Job Files Total Size active arnold 97 unix.ps 4591488 bytes |
Diese Meldung besagt, dass auf dem Drucker lp ein Job mit der Nummer 97 aktiv ist, den der Benutzer arnold gestartet hat. Die in Auftrag gegebene Datei heißt unix.ps und ist etwa 4,5MB groß.
gaston# lprm 97 dfA097gaston dequeued cfA097gaston dequeued |
Hier wird deutlich, dass ein Druck aus zwei Dateien besteht. Dies ist einmal die Steuerdatei, deren Name mit cf (control file) und die Datendatei, deren Name mit df (data file) beginnt. Beide Dateien befinden sich im Spoolverzeichnis.
Befehl | Wirkung |
---|---|
lpc disable lp | sperre die Warteschlange für lp |
lpc enable lp | gebe die Warteschlange für lp frei |
lpc stop lp | stoppe Drucke aus der Warteschlange für lp |
lpc start lp | lasse Drucke aus der Warteschlange für lp wieder zu |
lpc down lp | stoppe Drucke und Warteschlange für lp |
lpc up lp | starte Drucke und Warteschlange für lp wieder |
lpc status lp | Informationen über den Zustand der Sperrungen |
Mit dem lpc können auch anstehende Druckaufträge in ihrer Reihenfolge verändert werden. Dazu wird das Kommando topq, der Drucker und die Jobnummer angegeben, die an die erste Stelle gesetzt werden soll.
gaston# lpc topq lp 97 |
Ein PostScript-Drucker mit Netzschnittstelle ist nicht billig. Da ist es ein
naheliegender Gedanke, einen ausgedienten PC mit den preiswerten PC-Druckern
auszustatten und ins Netz zu hängen. Gegenüber einem netzwerkfähigem
TCP/IP-Drucker hat diese Lösung den Vorteil, dass der Linux-PC das
lpd-Protokoll korrekt
einhält. Die PostScriptfähigkeit wird durch ghostscript realisiert und als
Zugabe kann man die Drucker sogar in Samba
einbinden und dadurch von den Arbeitsplätzen unter MS-Windows mitverwenden.
Unter UNIX ist PostScript der Standard für Drucker. Das ist sehr praktisch,
da die meisten Anwendungsprogramme kein Problem damit haben, eine
PostScriptausgabe zu erzeugen.
Das Programm Ghostscript ist ein Übersetzer von Postskript auf die
verschiedensten Ausgabemedien. Dazu zählen neben dem Bildschirm auch alle
gängigen Drucker.
Linux-PC als Druckserver
Filter und Postscript
apsfilter
Die PostScriptwandlung erfolgt durch einen Filter, der mit dem Eintrag
if in die /etc/printcap eingetragen wird.
Bei der Linux-Distribution von S.u.S.E. erscheint dort nach einer
Druckerinstallation ein apsfilter. Dahinter verbirgt sich ein
Programm, das den Programmnamen in einen Aufruf von ghostscript
umsetzt. ghostscript setzt nun den Input in PostScript auf diverse propitiäre
Formate um.
Eigenen Skript in if eintragen
Einen Interface-Skript wie den apsfilter kann man unter anderen
Linuxsystemen leicht selbst schreiben, indem man eine Datei mit folgender
Zeile erzeugt:1)
/usr/bin/gs -q -dNOPAUSE -dSAFER -sDEVICE=clj5 -sOutputFile=- |
Der Name des Skripts (beispielsweise /usr/local/cljf) wird dann unter :if=/usr/local/cljf: in die /etc/printcap eingetragen. Der unter if eingetragene Filter erhält die Eingabedaten über stdin und muss die Ausgabedaten nach stdout wieder abliefern. Das ist der Grund für den Bindestrich hinter -sOutputFile=.
Druckerdevices unter Linux
Druckeranschlüsse
Der Anschluss der Schnittstellen befindet sich als special files im Verzeichnis
/dev, wie dies unter UNIX üblich ist. Bei PCs sind die
Druckeranschlüsse parallele Schnittstellen. Davon kann jeder PC drei Stück
haben, wobei der dritte keinen Interrupt besitzt und per Polling abgefragt
werden muss. Dazu kommen die USB-Anschlüsse und die maximal vier2)
seriellen Schnittstellen, von denen wiederum zwei mit
eigenen Interrupts belegbar sind. Insgesamt kann man einen solchen Rechner
also recht ordentlich bestücken.
Device | Anschluss | Interrupt |
---|---|---|
/dev/lp0 | parallele Schnittstelle (LPT1) | 7 |
/dev/lp1 | parallele Schnittstelle (LPT2) | 5 |
/dev/ttyS0 | serielle Schnittstelle (COM1) | 3 |
/dev/ttyS1 | serielle Schnittstelle (COM2) | 4 |
/dev/usblp0 | per USB angeschlossener Drucker |
tunelp /dev/lp1 -i7 tunelp /dev/lp2 -i5 |
Hier wird Schnittstelle LPT1 auf den Interrupt 7 und LPT2 auf den Interrupt 5 gesetzt. Seit der Kernelversion 2.1.131 (Die Kernelversion meldet der Befehl uname -r) wird die Steuerung der parallelen Schnittstellen durch das parport-System übernommen. In der Konfigurationsdatei /etc/modules.conf erreicht der folgende Eintrag, dass die Druckerschnittstellen 1 und 2 per Interrupt betrieben werden.
alias parport_lowlevel parport_pc options parport_pc io=0x378,0x278 irq=7,5 |
Das Drucksystem von System V ist bei den neueren Systemen von Solaris, bei
HP-UX, AIX, SCO und anderen Systemen das Standardverfahren zum Drucken.
Es bietet einige sehr interessante Eigenschaften. Allerdings hat man leider
kein netzweites Drucken vorgesehen. Das führt zu Erweiterungen wie bei HP.
Dort ist es möglich, einen Netzdrucker nach BSD-Standard anzusteuern.
Andere Systeme, wie SCO, erlauben es, stattdessen das BSD-System zu
installieren.
System V: lpsched, lp, lpstat und cancel
lpadmin -plaser -v/dev/lp -mcolorlaserjet |
AuftragsID Benutzer Titel Kopien Optionen Datei(en) |
Die formatierten Inhalte gibt der aufgerufene Skript über die Standardausgabe aus.
Mit der Option -e kann der Druckertyp auf einen bereits existierenden Drucker bezogen werden.
Die Optionen von lpadmin im Überblick:
lpadmin erzeugt und verändert Textdateien, die unter dem Verzeichnis /var/spool/lp stehen. Es empfielt sich nicht, diese Dateien mit einem Editor zu bearbeiten.
Der Befehl lpstat gibt eine Liste über den Status der verschiedenen
Drucker aus.
lpstat und cancel
Queue Dev Status Job Files User PP % Blks Cp Rnk ------ ----- -------- --- --------------- ---------- ---- -- ----- -- --- lp0 lp0 RUNNING 918 STDIN.14846 willemer 5 43 10 1 1 QUEUED 919 STDIN.14593 willemer 3 1 2 QUEUED 920 maskexpj wagener 2 1 3 QUEUED 921 STDIN.14596 willemer 2 1 4 QUEUED 922 STDIN.21790 willemer 1 1 5 QUEUED 923 lunget wagener 3 1 6 bsh bshde READY |
Um einen Druck aus der Warteschlange zu entfernen, wird der Befehl cancel verwendet. Als Argument wird die Jobnummer verwendet. Jeder Anwender darf nur eigene Drucke entfernen, root darf jeden beliebigen Druckjobs entfernen. Ist ein Drucker durcheinander geraten, erkennt man dies beim lpstat am Status DOWN. Um diesen nach Beseitigung der Störung wieder in Betrieb zu nehmen, wird das Kommando enable mit der Druckerbezeichnung als Argument verwendet. Soll ein Drucker dagegen gesperrt werden, wird der Befehl disable mit dem Druckernamen als Parameter verwendet.
Befehl | Wirkung |
---|---|
lpsched | Druckdämon |
lpshut | Herunterfahren des Dämons |
lpstat | zeigt den Zustand der Warteschlangen der Drucker an |
cancel [Jobnr] [Drucker] | Druckjob aus Warteschlange entfernen |
disable Drucker | Drucker aus dem Drucksystem auskoppeln |
enable Drucker | Drucker in das Drucksystem einkoppeln |
mkdev rlp |
hp# lpshut scheduler stopped hp# lpadmin -plinux -v/dev/null -mrmodel -ormgaston -orplp -ob3 hp# accept linux destination "linux" now accepting requests hp# enable linux printer "linux" now enabled hp# lpsched scheduler is running hp# lp -d linux /etc/hosts request id is linux-0 (1 file) hp# |
Der letzte Befehl ist lediglich der Test, ob der Druck funktioniert.
Die Existenz zweier Drucksysteme ist natürlich wenig befriedigend und es ist
eigentlich ein naheliegender Gedanke, beide zusammen zu führen und sowohl die
Kommandos des einen als auch des anderen Systems zuzulassen.
LPRng ist eine solche Neuentwicklung, die versucht, das Beste des BSD und des
System V Drucksystem zu einem System zusammenzufassen und an einigen Stellen
zu modernisieren.
LPRng
LPRng ist kompatibel
LPRng ist eine Neuimplementation des BSD Drucksystem und hält sich vollständig
an die Schnittstellen der RFC1179 und erbt damit dessen Netzwerkfähigkeit.
LPRng verwendet wie das BSD System die Aufruf lpr, lprm und
auch die anderen Kommandos des BSD-Systems.
Auch die /etc/printcap kann direkt weiterverwendet werden.
Hinzu kommen die Befehle des System V, die als Links ausgeprägt sind,
so dass beide Arten, den Druckprozess anzusprechen, funktionieren.
Darüber hinaus beherrscht LPRng auch die dynamische Druckzuteilung, also das,
was unter System V Druckerklassen sind.
Über beides hinaus geht die wesentlich bessere Fehlerinformation des Aufrufers.
Konfiguration
Neben der Datei /etc/printcap gibt es die Datei lpd.conf und
die Datei für die Festlegung der Berechtigungen namens lpd.perms.
Jeder Benutzer kann sich eine eigene Datei .printcap definieren, die
er in seinem Heimatverzeichnis abstellt. Diese Datei wird vom System bei
der Interpretation der systemweiten /etc/printcap quasi vorangestellt.
Dadurch kann jeder Benutzer festlegen, welcher Drucker sein Standarddrucker
ist und natürlich eigene Drucker hinzufügen. Die Datei lpd.conf kann
normalerweise so bleiben, wie sie als Standard ausgeliefert wird. Auch die
lpd.perms kann so bleiben wie sie ist, wenn man nicht besondere
Benutzer zulassen oder aussperren will. Zu beiden gibt es eine eigene Manpage.
checkpc prüft die Installation
Zu LPRng gehört das Programm checkpc, das die Installationsdateien
prüft. Sie sollten das Programm nach Änderungen in den Konfigurationsdateien
aufrufen, um sicher zu gehen, dass die Konfiguration stimmt. Das Programm
wird bei einigen Linuxdistributionen in die rc-Datei gestellt. Leider blockiert
dieses Programm unter unglücklichen Umständen und verhindert in diesem Fall
den Systemstart. Aus diesem Grund sollten Sie den Aufruf auskommentieren.
Man findet ihn durch Aufruf von grep checkpc im Verzeichnis, in dem
die rc-Skripten stehen.
http://localhost:631/admin |
/usr/sbin/lpadmin -p printer -E -v device -m ppd |
Ein paar Beispiele beleben die Vorstellungskraft. Soll ein HP Deskjet an den parallelen Port des Computers angeschlossen werden, lautet der Aufruf:
lpadmin -p DeskJet -E -v parallel:/dev/lp1 -m deskjet.ppd |
Ein HP Laserjet mit einer JetDirect Netzwerkkarte mit der IP-Adresse 192.168.109.192 würde mit dem folgenden Kommando eingerichtet:
lpadmin -p HPLJ -E -v socket://192.168.109.192 -m laserjet.ppd |
Beispielsweise kann der Zugriff auf die Drucker mit der Allow-Anweisung wie bei der Konfiguration des apache auf einzelne Rechner oder bestimmte Netze beschränkt werden.
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Wie werde ich UNIX-Guru Verlagsrechte bei galileo computing |
Homepage |
(C) Copyright 2002 Arnold Willemer
|