Dieses Kapitel beschreibt eine einfache Konfiguration für das Drucken auf einen HP Deskjet 690c, der an den ersten Parallelport des Rechners angeschlossen ist als Beispiel. Als Erstes konfigurieren wir das System, um Textdokumente auszudrucken. Als Nächstes erweitern wir die Konfiguration, um PostScript- Dokumente mit dem Ghostscript- Programm ausdrucken zu können.
Nach einer frischen Installation ist es noch nicht möglich, sofort zu drucken, weil der »lpd«- Druck- Spooling Daemon nocht nicht eingeschaltet ist. Um das zu tun, muss eine Zeile in »/etc/rc.conf von...
lpd=NO
nach
lpd=YES
Geändert werden.
Diese Änderung wirkt sich erst nach dem nächsten Neustart des Systems aus; aber der Daemon kann für jetzt auch manuell gestartet werden:
# lpd -s
Um zu kontrollieren, ob »lpd« aktiv ist, gibt es dieses Kommando:
# ps ax | grep lpd
179 ?? Is 0:00.01 lpd
Wenn Du keine Eintragung für lpd im Output dieses Kommando findest, ist der Daemon nicht aktiv.
Bevor Du »/etc/printcap« konfigurierst, ist es besser, einen Testlauf zu fahren, um zu testen, ob es eine funktionierende Verbindung zu Drucker gibt. Beispiel:
# lptest 20 10 > /dev/lpt0
Um zu sehen, wie der Output aussehen sollte, versuche mal dasselbe Kommando ohne Umleitung der Ausgabe auf den Drucker:
# lptest 20 10
Ein häufiger auftretendes Problem ist, dass die Linien im Output zum Drucker nicht korrekt in ihren Spalten stehen (Staircase- Problem), sondern abgestuft dargestellt werden. Das heisst gewöhnlich, dass der Drucker so konfiguriert ist, dass er mit einer neuen Zeile anfängt, wenn er ein <cr>(carriage return, ASCII 13) und ein <LF> (line feed, ASCII 10)- Zeichen empfangen hat, in einer neuen Zeile weiterdruckt. Das Problem lässt sich aber beheben:
Änderung der Druckerkonfiguration
Benutzung eines einfachen Druckfilters (kommen wir später zu)
Wichtig: Am vorigen Beispiel ist der lpd- Spooler nicht beteiligt, weil wir den Programmoutput nicht zwischengespeichert, sondern direkt an das Druckdevice (/dev/lpt0) geschickt haben.
Diese Sektion erklärt, wie der Beispieldrucker konfiguriert wird, um Texte damit zu drucken.
Der Drucker muss in »/etc/printcap« eingetragen sein. Der Eintrag beinhaltet die ID der Druckers (seinen Namen) und seine Beschreibung. Die »lp«- ID wird von vielen Programmen als Defaultwert verwendet.
lp|local printer|HP DeskJet 690C:\
:lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
:sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:
Das Dateiformat und die Optionen werden im Detail in »printcap(5)« beschrieben. Du solltest wissen, dass wir gerade einen Input- Filter spezifiziert haben (mit der »if«- Option), der das Staircase- Problem nicht beseitigt:
if=/usr/local/libexec/lpfilter
Drucktreiber und HP- Drucker:
Beispiel 6-1:
anstelle des »lpd#«(Treiber via Interrupt) benutzt das »lpa#«- Device (Polled Printer) für den Drucker. Die Benutzung von Interrupts sorgt bei einigen Druckern für Kommunikationsprobleme. Der HP Deskjet 690c ist einer davon: Das Drucken geht extrem langsam und bei einer PostScript- Seite kann das schon mal ein paar Stündchen dauern, bis der Apparat seine Arbeit fertig hat. Gelöst wird das Problem mit dem »lpa«- Treiber. Du kannst aber auch einen Kernel kompilieren, in dem lpd immer »polled« läuft.
Der Eintrag in die printcap bescreibt ausserdem wo das Spoolverzeichnis ist, das erstellt werden muss. Dieses Verzeichnis benutzt lpd, um die Daten zu sammeln, die gedruckt werden sollen.
# cd /var/spool/lpd
# mkdir lp
# chown daemon:daemon lp
# chmod 770 lp
Der einzige Teil, der fehlt, ist der »lpfilter«, der geschrieben werden muss. Das einzige, was dieser Filter tut, ist, dass er den Drucker so konfiguriert, dass das Staircase- Problem beseitigt wird, bevor der Text zum Drucken abgeschickt wird. Der in unserem Beispiel benutzte Drucker benötigt diesen String, um initialisiert zu werden: »ESC &k2G«. Beispiel 6-2. /usr/local/libexec/lpfilter
#!/bin/sh # Treat LF as CR+LF printf "\033&k2G" && cat && exit 0 exit 2 # cd /usr/local/libexec # chmod 755 lpfilter*
Hinweis: Es gibt da noch einen anderen Filter, der benutzt werden kann:
:if=/usr/libexec/lpr/lpf:
Dieser Filter ist weitaus komplexer, als der eben gezeigte. Er wurde geschrieben, um den Output von »nroff« zu verarbeiten und händelt Unterstreichen und Überschreiben, erweitert die Tabulatoren und konvertiert LF nach CR + LF. Die Quelle dieses Filterprogramms findet sich in /usr/src/usr.sbin/lpr/filters/lpf.c.
»lptest« kann jetzt noch einmal ausgeführt werden. Diesmal benutzt er den lpd- Spooler.
# lptest 20 10 | lpr -h
Das »lpr«- Programm druckt den Text in den Spooler und schickt die Daten an den Drucker. Mit der »-h«- Option wird der Druck einer Bannerseite ausgeschaltet (Wegen der »sh«- Option in der »/etc/printcap« aber nicht lebensnotwendig).
Du kannst das Staircase- Problem mit Hilfe verschiedener Tools und Methoden lösen, beispielsweise mit C- Programmen. Die präsentierte Lösung hat den Vorteil., dass sie sehr einfach ist.
Eine zweite ID für den Drucker wird in »/etc/printcap« erstellt: Diese neue ID benutzt einen anderen Inputfilter, der Ghostscript aufruft, um den Ausdruck eines gerade aktuellen Postscript- Dokumentes durchzuführen. Danach werden Textdokumente aus dem »lp«- Drucker ausgegeen und Postscript- Dokumente auf dem »ps«- Drucker: Beise Einträge benutzen denselben physikalischen Drucker; aber zwei verschiedene Filter.
Das gleiche Ergebnis kann auch mit anderen Konfigurationen erreicht werden. Als Beispiel kann ein einzelner Eintrag mit einem Filter verwendet werden: Der Filter sollte automatisch das Format der Dokumente erkennen und das geeignete Druckprogramm verwenden. Dieser Weg ist einfacher, aber er führt zu einem komplexeren Filter. Wenn Du willst, solltest Du Dir überlegen, ob Du nicht das »magicfilter«- Programm aus der Packages. Kollektion installierst: Es tut dies und viele andere Dinge automatisch.
Die neue /etc/printcap sieht so aus:
Beispiel 6-3.: »/etc/printcap«
lp|local printer|HP DeskJet 690C:\
:lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
:sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:
ps|Ghostscript driver:\
:lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:\
:mx#0:sh:if=/usr/local/libexec/lpfilter-ps:
Option »mx#0« ist für den Ausdruck von Postscript- Dateien sehr wichtig, weil sie die Grössenrestriktionen der Input- Datei eliminiert. Postscript- Dokumente neigen dazu, sehr gross zu sein. Die »if«- Option zeigt auf den neuen Filter. Es gibt ausserdem ein neues Spool- Verzeichnis.
Der letzte Schritt ist das Erstellen des neuen Spoolverzeichnisses und des Filterprogramms.
# cd /var/spool/lpd
# mkdir ps
# chown daemon:daemon ps
# chmod 770 ps
Das Filterprogramm für den Postscript- Output ist komplexer als das für die Texte: Mit der Datei, die gedruckt werden soll, wird der Interpreter gefüttert, der in dieser Runde an der Drucker eine Reihe von Kommandos in der Sprache des Druckers schichkt. Wir haben es erreicht, mit Hilfe der Tugenden von NetBSD und ein paar leistungsfähigen Freeware- Paketen, einen billigen Farbdrucker in ein Gerät zu verwandeln, das für den Postscript- Output geeignet ist. Die Optionen, die wir benutzt haben, um Ghostscript zu konfigurieren werden in der Dokumentation beschrieben: »cdj550« ist das Device, mit dem wir den HP- Drucker steuern.
Beispiel 6-4. »/usr/local/libexec/lpfilter-ps«
#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" || exit 2
# Druck der Postscriptdatei
/usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 \
-sOutputFile=- -sPAPERSIZE=a4 - && exit 0
exit 2
Zusammenfassung: Wir haben zwei verschiedene Druckernamen auf dem System geschaffen, die beide auf denselben Drucker zeigen, aber verschiedene Optionen verwenden, verschiedene Filter und verschiedene Spoolverzeichnisse. Texte und Postscript- Dokumente können gedruckt werden. Um Postscript- Dokumente zu drucken, muss Ghostscript auf dem System installiert sein.
Der erste Schritt ist, loge für das Ausdrucken von Druckjobs, die von Wotan kommen, vorzubereiten. Das wird getan, indem eine Zeile mit dem Namen Wotans in der »/etc/hosts.lps«- Datei auf loge eingetragen wird. Das Dateiformat ist sehr einfach: In jeder Zeile steht ein Hostname, der drucken darf.
Als nächsts muss die »/etc/printcap« für das Senden von Druckjobs an loge konfigurert werden. Beispiel:
lp|line printer on loge:\
:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
:rm=loge:rp=lp
ps|Ghostscript driver on loge:\
:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
:mx#0:\
:rm=loge:rp=ps
Es gibt vier Hauptunterschiede in dieser Konfiguration und der in Beispiel 6-3:
Die Definition von »lp« ist leer.
Der »rm«- Eintrag definiert den Namen des Rechners, an den der Drucker angeschlossen ist.
Der »rp«- Eintrag definiert den Namen des Druckers, der an diesen Rechner angeschlossen ist.
Es ist nicht notwendig, Input- Filter zu spezifizieren, weil die Definitionen auf loge verwendet werden.
Jetzt werden die Druckjobs für »lp« und »ps« von Wotan automatisch an den Drucker, der an loge angeschlossen ist, gesendet.