# 1.107.4

# Installation und Konfiguration von lokalen und Netzwerkdruckern

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

Einstellung=Wert

besitzen. Typische Beispiele für die möglichen Einstellungen sind:

af=Dateiname
  Name der Account-Datei, für diesen Drucker
if=Dateiname
  Name des Input-Filters, den dieser Drucker benutzen soll. Input-Filter sind Programme, die die zu druckende Datei in ein dem Drucker verständliches Format bringen, siehe weiter unten.
lf=Dateiname
  Name der Logdatei, in die Fehlermeldungen aufgenommen werden sollen.
lp=Dateiname
  Name der Gerätedatei des Gerätes, an dem der Drucker angeschlossen ist.
mx#Zahl
  Maximale Dateigröße in Blöcken. Die Angabe 0 bedeutet, daß es keine maximale Dateigröße gibt.
rm=Hostname
  Name der entfernten Maschine (remote machine), die einen Netzwerkdrucker zur Verfügung stellt.
rp=Druckername
  Name des Druckers auf der entfernten Maschine.
sd=Verzeichnis
  Das Verzeichnis, in dem die Aufträge abgespeichert werden. (Spool Directory)
sh
  Es wird keine Titelseite gedruckt. (suppress header)

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.