Inhaltsverzeichnis
Beschreibung: Prüfungskandidaten sollten in der Lage sein, einen Printerdämon zu installieren und einen Druckerfilter (z.B. apsfilter oder magicfilter) zu installieren und zu konfigurieren. Dieses Lernziel beinhaltet das Konfigurieren von lokalen und Netzwerkdruckern für ein Linux-System, inklusive PostScript-, Non-PostScript- und Samba-Druckern.
Die wichtigsten Dateien, Bezeichnungen und Anwendungen:
- lpd
- /etc/printcap
- /etc/apsfilter/*
- /var/lib/apsfilter/*/
- /etc/magicfilter/*/
- /var/spool/lpd/*/
Die Datei /etc/printcap
Der Standard-Weg zur Installation eines Druckers unter Linux läuft über die Datei /etc/printcap. In dieser Datei hat jeder Drucker, der an das System angeschlossen ist, aber auch alle Drucker, die über das Netz erreichbar sein sollen, einen eigenen Eintrag. Jeder dieser Einträge ist eigentlich nur eine Zeile lang, wird aber (durch Verwendung eines Backslash vor dem Zeilentrenner) zur leichteren Lesbarkeit auf mehrere Zeilen verteilt.
Ein Eintrag für einen Drucker beginnt immer mit dem oder den Namen des Druckers. Danach folgen verschiedene Angaben, die jeweils durch Doppelpunkte voneinander getrennt sind und meist die Form
besitzen. Typische Beispiele für die möglichen Einstellungen sind: Ein sehr einfacher Eintrag für einen Drucker könnte also folgendermaßen aussehen:
lp|hplaser:\ :lp=/dev/lp0:\ :sd=/var/spool/lp:\ :mx#0:\ :lf=/var/spool/lp/hp-log:
Der Drucker heißt entweder lp oder hplaser (der zweite Name dient als Beschreibung). Er ist an die Schnittstelle /dev/lp0 angeschlossen und sein Spoolverzeichnis ist /var/spool/lp. Es existiert keine Größenbeschränkung (mx#0) und Fehlermeldungen werden in die Datei /var/spool/lp/hp-log geschrieben.
Die Verwendung von Input-Filtern wird weiter unten beschrieben.
Um auch Netzwerkdrucker an anderen Maschinen ansprechen zu können, benötigen wir entsprechend Einträge wie der folgende:
lp1|remote printer on marvin:\ :sd=/var/spool/lp1:\ :rm=marvin.mydomain.net:\ :rp=lp:\ :sh:mx#0:
Dieser Eintrag beschreibt einen Drucker, der auf unserem System mit dem Namen lp1 angesprochen wird. Er benutzt das lokale Spoolverzeichnis /var/spool/lp1. Anstatt einem Eintrag lp= haben wir jetzt den Eintrag rm=, der besagt, daß der Drucker auf einer remote machine also einem entfernten Rechner angeschlossen ist. Dieser Rechner ist in unserem Beispiel der Rechner marvin.mydomain.net. Der Druckername auf dem entfernten Rechner (rp – remote printer) ist lp. Es wird keine Trennseite ausgegeben und es existiert keine Größenbeschränkung.
Es ist problemlos möglich, daß ein physikalischer Drucker mehrere Printcap-Einträge besitzt. So können z.B. verschiedene Inputfilter für den gleichen Drucker verwendet werden, oder ein Drucker kann entweder farbig oder in Graustufen angesprochen werden, je nachdem, unter welchem Namen er angesprochen wurde. Der Name lp ist dabei der voreingestellte Drucker.
Apsfilter
apsfilter erlaubt es, verschiedene Dateitypen direkt zu drucken, ohne daß der User die Datei von Hand in eine dem Drucker verständliche Sprache konvertieren muß.
apsfilter benutzt verschiedene Programme anderer Hersteller um die verschiedenen Dateiformate zunächst in Postscript zu verwandeln. Wenn ein echter Postscript-Drucker vorliegt, so werden diese konvertierten Daten dann einfach an den Drucker weitergereicht, ansonsten werden sie an Ghostscript weitergeleitet, der sie dann in eine für den jeweiligen Drucker verständliche Sprache konvertiert.
Die Frage, ob ein Drucker von apsfilter unterstützt wird, ist also primär die Frage, ob er entweder ein Postscript-Drucker ist, oder von Ghostscript unterstützt wird.
Welche Filter (siehe letzten Abschnitt) apsfilter benutzt, kann über seine Konfigurationsdatei /etc/apsfilter/apsfilterrc eingestellt werden. Hier können auch alle möglichen anderen Einstellungen vorgenommen werden.
apsfilter bietet ein kleines Programm, mit dem die komplette Einrichtung eines Druckers, inklusive der printcap-Einträge, vorgenommen wird. Dieses Programm heißt apsfilterconfig.
In /var/lib/apsfilter werden alle Aktionen von apsfilterconfig zwischengespeichert, so daß sie auch bei erneuter Installation wieder zur Verfügung stehen.
Ein typischer Eintrag in /etc/printcap für einen Drucker, der mit apsfilter angesteuert wird wäre
lp|PS;r=600x600;q=high;c=gray;p=a4;m=auto:\ :lp=/dev/lp0:\ :if=/etc/apsfilter/basedir/bin/apsfilter:\ :sd=/var/spool/lpd/lp:\ :lf=/var/spool/lpd/lp/log:\ :af=/var/spool/lpd/lp/acct:\ :mx#0:\ :sh:
Wichtig ist hier die Angabe des Input-Filters (if=/etc/apsfilter/basedir/bin/apsfilter). Jede Datei, die an diesen Drucker geschickt wird, wird zuerst durch das angegebene Programm (hier /etc/apsfilter/basedir/bin/apsfilter) geschickt. Erst dieses Programm schickt den Druckauftrag an den eigentlichen Drucker.
Magicfilter
magicfilter ist ein erweiterbarer und einstellbarer automatischer Druckerfilter. Der Typ einer zu druckenden Datei wird anhand ihrer Magic-Nummern ermittelt und magicfilter wendet dann einen entsprechenden Filter an, der diesen Dateityp in die Ausgabesprache des jeweiligen Druckers konvertiert.
magicfilter ist primär dazu gedacht, als Eingabefilter (if=) für den LPD-Druckspooler zu arbeiten. Die Optionen, die Magicfilter versteht, sind genau die, die lpd an den Inputfilter weiterreicht.
Um magicfilter zusammen mit dem LPD-Spooler zu nutzen, muß im entsprechenden printcap-Eintrag der input-filter (if=) Eintrag auf das Programm magicfilter gesetzt sein. Da aber ein printcap-Eintrag keine Optionen erlaubt, wird hier einfach ein Script als Eingabefilter gewählt, das ausführbar ist und als erste Zeile den Eintrag
#!/usr/sbin/magicfilter
aufweist.
Dieses Script liegt standardmäßig im Verzeichnis /etc/magicfilter und trägt den Namen des zu verwendenden Druckers. Im Lieferumfang von magicfilter sind bereits etwa 80 verschiedene solcher Scripte für die gängigsten Drucker enthalten. Der Inhalt dieser Scripte ist – neben der bereits erwähnten ersten Zeile – immer nach folgendem Schema aufgebaut:
Offset Zeichenkette Art
Wobei Offset die Stelle innerhalb der zu druckenden Datei bezeichnet, an der eine bestimmte Zeichenkette zu finden ist, Zeichenkette ist die Zeichenkette, die an dieser Stelle erwartet wird und Art beschreibt die Aktion, die dann mit der Datei ausgeführt wird, um sie zu drucken.
Ein typischer Eintrag dieser Datei wäre z.B.
# GIF files 0 GIF87a pipe /usr/bin/giftopnm 2>/dev/null 0 GIF89a pipe /usr/bin/giftopnm 2>/dev/null
Wenn also an der Position 0 (Anfang der Datei) entweder die Zeichenkette GIF87a oder GIF89a zu finden ist, dann handelt es sich bei der zu druckenden Datei um ein GIF-Bild. Die Aktion, die durchgeführt werden soll ist pipe /usr/bin/giftopnm 2>/dev/null, der Inhalt der GIF-Datei wird also an das Programm /usr/bin/giftopnm weitergeleitet, das die GIF-Datei in ein PNM-Bild verwandelt. Das kann dann entsprechend von einem Postscript-Drucker gedruckt werden.
Damit auch nicht-Postscript Drucker mit magicfilter benutzt werden können, gibt das Programm die Ausgaben anschließend an Ghostscript weiter, das dann ein für den jeweiligen Drucker verständliches Format erzeugt.
Damit diese Arbeit nicht manuell ausgeführt werden muß, wird magicfilter zusammen mit einem Installationsscript ausgeliefert, das den Namen magicfilterconfig trägt und die notwendigen Einstellungen vornimmt, nachdem der User ein paar Fragen zum angeschlossenen Drucker beantwortet hat.
Ein typischer printcap Eintrag für magicfilter lautet beispielsweise:
lp|hplj4l|HP Laserjet 4L:\ :lp=/dev/lp1:sd=/var/spool/lpd/hplj4l:\ :sh:pw#80:pl#72:px#1440:mx#0:\ :if=/etc/magicfilter/ljet4l-filter:\ :af=/var/log/lp-acct:lf=/var/log/lp-errs:
Die Angaben pw, pl und px beziehen sich auf die Seitenbreite in Zeichen, die Seitenlänge in Zeilen und die Seitenbreite in Pixeln. Ansonsten enthält der Eintrag nichts neues, der Inputfilter ist jetzt /etc/magicfilter/ljet4l-filter.
Einbinden eines Windows-Drucker
Über die Technik der Input-Filter ist es auch möglich, einen Drucker anzusteuern, der von einem Windows-Rechner freigegeben wurde (SMB-Drucker). Dazu wird samba benötigt, bzw. die Programme smbclient (Ein Programm zur Nutzung von SMB-Freigaben auch Druckern) und smbprint (ein Shellscript, das smbclient nutzt und als Input-Filter nutzbar ist. Ein Eintrag in /etc/printcap für einen SMB-Drucker wäre beispielsweise
lp2|remote-smbprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lp2:\ :if=/usr/local/sbin/smbprint:
Im Script /usr/local/sbin/smbprint müssen jetzt noch entsprechend die Einträge für
- Hostname des Windows-Rechners
- Freigabename des Druckers auf dem Windows-Rechner
- Username auf dem Windows-Rechner
- Passwort für den Windows-Rechner
angegeben werden. Wenn mehrere Windows-Drucker angesprochen werden sollen, so muß für jeden dieser Drucker ein eigenes smbprint Script existieren. Die Scripts sind einfache Shellscripts und können entsprechend kopiert und verändert werden.
Spoolerdaemon starten
Normalerweise wird für jedes System ein Druckerdaemon gestartet. Dieser Daemon trägt den Namen lpd und wird automatisch beim Systemstart durch ein Init-Script aufgerufen. Er ließt die Einträge in /etc/printcap und kennt so die vorhandenen Drucker. Sobald der Spoolerdaemon geladen ist, arbeitet er die Warteschlange ab und kann außerdem Anfragen über das Netz beantworten, und die Druckaufträge von dort entgegennehmen.
Zugriffskontrolle, wer den Drucker verwenden darf, kann über die Datei /etc/hosts.lpd erreicht werden.
Ich habe den Eindruck, dass da etwas fehlt (nicht nur hier):
»solcher Scripte für die gängigsten Drucker enthalten. Der Inhalt dieser Scripte ist – neben der bereits erwähnten ersten Zeile – immer nach folgendem Schema aufgebaut:
Punkt
Wobei Offset die Stelle innerhalb der zu druckenden Datei bezeichnet, an der eine bestimmte Zeichenkette zu finden ist, «
Im Folgenden wir auf den Bereich Bezug genommen.
BS: Ubuntu 20.04 64Bit
Hallo Günter,
danke für den Hinweis!
Ich habe es gefixt