Drucken unter Linux

Willemers Informatik-Ecke

Diese Seite ist eine Sammlung meiner Erfahrungen mit meinen Druckern. Das Thema wird also nicht erschöpfend behandelt. Das Thema Druckeradministration wird aber an anderer Stelle ausführlicher behandelt. Hier eine kurze Zusammenfassung der Grundlagen, um dann auf die Installation der konkreten Druckerkandidaten zu kommen.

Ein paar Grundlagen

Device und Druckdämon

Der Anschluss der Schnittstellen befinden sich als special files im Verzeichnis /dev, wie dies unter UNIX üblich ist. Die Druckeranschlüsse sind:

Device Anschluss
/dev/lp0 parallele Schnittstelle (LPT1)
/dev/lp1 parallele Schnittstelle (LPT2)
/dev/ttyS0 serielle Schnittstelle (COM1)
/dev/ttyS1 serielle Schnittstelle (COM2)
/dev/usblp0 per USB angeschlossener Drucker

Der Druck erfolgt nicht direkt, sondern über den Druckdämon, der gewährleistet, dass die Drucke immer serialisiert werden und das Spooling übernimmt. Um zu verhindern, dass ein Anwender oder ein Anwenderprogramm am Druckdämon vorbei auf die Schnittstelle direkt druckt, ist diese normalerweise für den Anwender nicht beschreibbar.

Damit der Druckerdämon einen logischen Drucker der Schnittstelle zuordnen kann, muss er in die Datei /etc/printcap eingetragen werden. Bei SuSE-Linux beispielsweise wird dies durch das Administrationstool YAST erledigt.

Filter und Postscript

Unter UNIX ist Postscript der Standard für Drucker. Da dies für die am PC befindlichen Drucker eher nicht typisch ist, muss den Druckern beigebracht werden, auf Postscript korrekt zu reagieren. Dazu werden Filter in den Druckvorgang eingebunden. Man kann den Filter in der /etc/printcap am Eintrag if eintragen. Bei SuSE erscheint dort nach einer Druckerinstallation ein apsfilter-Eintrag. Dahinter verbirgt sich ein Skript, der den Skriptnamen in einen Aufruf von gs (Ghostscript). Dieses setzt Postscript-Input auf diverse propitiäre Formate um. Um sich die bekannten Formate anzeigen zu lassen, gibt man einfach gs -? ein oder sieht in die mitgelieferte Dokumentation von gs. Einen Interface-Skript wie den apsfilter kann man unter anderen Linuxsystemen leicht selbst schreiben:
/usr/bin/gs -q -dNOPAUSE -sDEVICE=clj5 -sOutputFile=-
Der Name des Skripts (beispielsweise /usr/local/cljf) wird dann unter :if=/usr/local/cljf: in die /etc/printcap eingetragen.

Hewlett Packard Color Laserjet

Der HP Color Laserjet, den ich habe, druckt zwar farbig bei 300x300 dpi, kennt aber kein Postscript. Der Drucker ist auf Anhieb über einen Standard Laserjet-Treiber in Betrieb zu nehmen, druckt dann aber schwarzweiß.

Das Umsetzen der Druckinformationen in die Sprache des Druckers wird durch das Paket ghostscript erreicht, der sich hinter dem apsfilter verbirgt. ghostscript braucht den Namen des passenden Ausgabegerätes und dies ist für den Color Laserjet cljet5.

Der Treiber cljet5 ist nicht in der Liste vorhanden, die YAST anbietet. Man muss ihn als benutzerdefiniert direkt eintragen.

Letztlich muss in der /etc/printcap als Parameter if stehen: :if=/var/lib/apsfilter/bin/cljet5-a4-auto-color-300:

Ab SuSE 8.0 wurde das Druckersystem völlig umgestellt. Leider lief daraufhin mein oben genannter Eintrag nicht mehr. Immerhin konnte ich dort über Yast2 und den Treiber cljet5 einen Farbdruck veranlassen. Allerdings dauert der Ausdruck damit für jede Seite minutenlang. Die Ursache konnte ich nicht finden.

Hewlett Packard PSC 950

Der PSC 950 ist ein Nachfolger in der OfficeJet-Serie. Das Gerät wird über eine USB-Schnittstelle angeschlossen und enthält einen Drucker, einen Flachbettscanner und ein Fax. Diese Kombigeräte werden nach ihren ersten Vorgängern auch OfficeJet genannt. Man kann sie nicht einfach ansprechen wie einen Drucker und einen Scanner, sondern es wird eine Kommunikationssoftware benötigt. Ansonsten bewegt sich nichts. Im Gegenteil kann ansonsten das Gerät leicht blockieren, so dass man es erst aus- und wieder einschalten muss, damit es wieder erwartungsgemäß arbeitet.

Der PSC 950 ist von Linux als Drucker und als Scanner ansprechbar. Die Faxfunktion des Gerätes konnte ich bislang nicht aktivieren. Die Entwicklung der Treibersoftware wird durch HP gefördert. Die neuesten Versionen und die ausführliche Dokumentation findet sich hier:

USB

Der PSC wird über den USB angeschlossen. Zunächst muss geprüft werden, ob USB überhaupt unterstützt wird. Dazu stellt man mit dem Aufruf lspci -v fest, ob der USB-Controller einen Interrupt zugewiesen bekommen hat. Sollte kein Interrupt zugewiesen sein, muss im BIOS der USB-Betrieb freigeschaltet werden.

Schließlich kann es sein, dass die USB-Module des Kernels nicht richtig geladen sind. Das lässt sich feststellen, indem man sich mit dem Befehl lsmod Alle Module anzeigen lässt, die mit USB zu tun haben.

 # lsmod | grep usb
usb-ohci               18880   0  (unused)
usbcore                55136   0  [printer usb-ohci]
 #

Sollten die USB-Treiber fehlen muss man sie starten:

modprobe usbcore
modprobe usb-ohci
modprobe printer

Diese drei Kommandos kann man in die Datei /etc/rc.d/boot.local schreiben, damit sie bei jedem Neuboot ausgeführt werden. Sollte der Verdacht entstehen, dass sie nicht einwandfrei arbeiten, kann man sie deaktivieren bevor man sie neu startet:

rmmod printer
rmmod usb-ohci
rmmod usbcore

Anmerkung zu usb-ohci: Dies ist abhängig vom USB-Controller. In manchen Geräten kann der Treiber auch usb-uhci heißen.

Der HP-Officejet-Treiber

Unter der folgenden Adresse gibt es die Treibersoftware für den HP PSC 950 und andere HP Officejets.
hpoj.sourceforge.net/suplist.shtml

Die Software findet sich aber auch auf der S.u.S.E. 7.3. Hier gibt es ein Problem: es fehlen die Verzeichnisse /dev/ptal-mlcd und /dev/ptal-printd, die man vor Ausführen des Befehls ptal-init setup mit mkdir anlegen muss (Hinweis von Thomas Brandes).

Auch mit der S.u.S.E. 8.0 gibt es Probleme mit dem hp-officeJet Paket. Der Versuch, die aktuelle Version als rpm zu laden, funktioniert nicht. Es gibt zu viele Abhängigkeiten, die auch aktualisiert werden müssten. Einwandfrei klappte bei mir allerdings das Herunterladen der Sourcen und Generieren der Binaries. Dazu gibt man einfach folgende Befehle nacheinander ein:

tar xvf hpoj-0.90.tgz
cd hpoj-0.90
configure
make
make install

root sollte man natürlich gerne sein, wenn man den letzten Befehl eingibt. Und aus unerfindlichem Grund ist bei SuSE 8.0 das Kommando make nicht mehr in der Standardinstallation. Das sollte man noch nachinstallieren.

Kontaktaufnahme zum PSC

Nun startet man das Kommando:

ptal-init setup
Das Programm fragt zuerst, ob man gern die parallelen Anschlüsse durchsuchen will. Das darf man verneinen. Interessanter ist die Suche der USB-Schnittstelle.

Danach werden die USB-Anschlüsse durchsucht und er meldet ein Device, dessen Namen man in Zukunft braucht und sich notieren sollte. In meinem Fall heißt das Gerät:

mlc:usb:PSC_900_Series

BSD-Drucksystem

Das Standard-Drucksystem unter UNIX und Linux ist das von BSD. In der Standardkonfigurationsdatei /etc/printcap wird zunächst ein Drucker eingetragen, der den DJ9xx Treiber verwendet. Das kann beispielsweise durch YAST geschehen. Anschließend muss der Eintrag für lp= geändert werden auf:

lp=/dev/ptal-printd/mlc_usb_PSC_900_Series: \

Hinter diesem Eintrag verbirgt sich eine Pipe, die den ptal-Treiber aufruft. Nach dem Eintrag in die /etc/printcap muss der lpd neu gestartet werden. Dazu wird mit dem Befehl ps die Prozessnummer des lpds gesucht und dieser mit kill abgeschossen. Anschließend startet man den lpd so wieder, wie er im ps in der Kommandozeile stand. Diese Schritte müssen natürlich als root gemacht werden.

linux> ps -ax | grep lpd
  426 ?        S      0:00 /usr/sbin/lpd
 1330 pts/2    S      0:00 grep lpd
linux> kill 426
linux> /usr/sbin/lpd
linux>

Wenn gar nichts klappt...

... dann hilft die alte Methode AEG (Ausschalten, Einschalten, Geht) hier enorm. Der PSC ist leicht eingeschnappt, wenn er mal ein paar falsche Kommandos bekommen hat. Dann geht nichts mehr. Leider gibt es für diesen Zustand kein Blinken oder so. Dann muss der PSC durch Herausziehen des Netzteils ausgeschaltet werden.

Wichtig: Vor dem Reboot

Um den Drucker bereits nach dem Booten zur Verfügung zu haben, muss der Aufruf von ptal-init in den rc-Skripten erfolgen und zwar vor dem Start des lpd. Falls Sie eine aktuelle Version des OfficeJet-Treibers besitzen, wird automatisch ein Skript namens /etc/init.d/ptal-init installiert. Falls das nicht passiert, muss folgende Änderung in den Skript des lpd eingetragen werden. Beides schadet aber auch nicht.

Im Verzeichnis /etc/init.d findet man den Skript lpd. Hier kann man Aufruf hineinpatch. Direkt hinter den start der Startaufruf und hinter den lpd beim Stopaufruf.

    start)
        ptal-init start
        echo -n "Starting lpd"
...
    stop)
        echo -n "Shutting down lpd"
        killproc -TERM /usr/sbin/lpd
        ....
        ptal-init stop
        ;;

Ganz korrekt kann man auch einen eigenen Skript ptal schreiben, diesen in /etc/init.d abstellen und mit einem symbolischen Link S08ptal und K14ptal in /etc/init.d/rc2.d darauf verweisen.

Die Installation des Scanners baut auf dem ptal-init auf und wird hier beschrieben.

Hewlett Packard Laserjet 5M über Netz

Die dritte Variante ist ein völlig unproblematischer Drucker. Der Laserjet 5M besitzt Postscript und braucht dadurch nicht einmal eine Ghostscript-Anpassung. Man findet ihn in jeder Druckerliste und sollte das nicht der Fall sein, gibt es sicher einen allgemeinen Postscript-Druckereintrag, den man verwenden kann.

Interessant wird die Installation dann, wenn man ihn über eine Netzwerkkarte oder einen Printserver ansteuert. In meinem Fall ist das eine JetDirect-Karte von HP. Dazu brauchen wir zwei Dinge: Erstens muss die IP-Nummer ins Netz passen. Dazu muss sie meist umgestellt werden. Wie das geht, steht im Handbuch des Druckers. Mit etwas Probieren gelingt es aber auch so. Mein Netz hat die Nummer 192.168.109.0. Also muss eine solche Nummer verwendet werden, wobei die 0 durch eine im Netzwerk noch nicht vergebene Zahl ersetzt werden muss. Als Zweites benötigen Sie den Namen des Druckservice innerhalb der Karte. Jeder lpd-Server kann prinzipiell beliebig viele Drucker verwalten. Da die HP Jetdirect nur einen Drucker kennt, nennt sie ihn lp. Auf einigen Druckservern habe ich auch schon LPT1 oder COM1 gesehen.

Ein korrekter, ausreichender Eintrag in der /etc/printcap lautet:

lp:\
        :lp=:\
        :rm=192.168.109.55:rp=lp:\
        :sd=/var/spool/lpd/lp:\
        :lf=/var/spool/lpd/lp/log:\
        :af=/var/spool/lpd/lp/acct:\
        :la@:\
        :tr=:cl:sh:

Wichtig sind hier die Einträge unter rm und rp. Sie beschreiben das Ziel des Druckes. lp wird irrelevant, weil es keine lokale Schnittstelle mehr gibt. Man könnte auch lp=/dev/null schreiben.

Doppeltes Spiel mit Yast2

Lässt man diesen Drucker von Yast2 bei SuSE-Linux installieren, bekommt man zwei Einträge in der printcap. Der erste Eintrag ist für das lokale Drucksystem. Der zweite Eintrag wird normalerweise remote genannt und ist für den Netzwerk-Server.
remote:\
        :cm=lpdfilter method=raw color=yes:\
        :lp=lp@192.168.109.55:\
        :sd=/var/spool/lpd/remote:\
        :lf=/var/spool/lpd/remote/log:\
        :af=/var/spool/lpd/remote/acct:\
        :ar:force_localhost@:\
        :tr=:cl:sh:
lp:\
        :cm=lpdfilter drv=upp method=auto color=yes redirect=remote:\
        :lp=/dev/null:\
        :sd=/var/spool/lpd/lp:\
        :lf=/var/spool/lpd/lp/log:\
        :af=/var/spool/lpd/lp/acct:\
        :if=/usr/lib/lpdfilter/bin/if:\
        :la@:\
        :tr=:cl:sh:
Die Konfiguration des Druckers läuft über den Eintrag cm. Diese Informationen werden dann vom if-Skript ausgewertet.
Homepage (C) Copyright 2001 Arnold Willemer