Inhaltsverzeichnis
Das Common UNIX Print System (CUPS) ist mittlerweile sehr populär geworden. Alle großen Linux-Distributionen liefern es als das Standard-Drucksystem aus. Für viele ist es ein mystisches Tool. Meistens funktioniert es einfach. Daher wird es oft als „Black Box“ angesehen, und solange es funktioniert, möchte sich auch niemand damit befassen. Sobald aber ein kleines Problem auftritt, bekommt man Schwierigkeiten damit herauszufinden, wie man mit der Fehlersuche beginnt. Sehr viele Informationen, die auch für CUPS relevant sind, finden Sie im Kapitel „Klassische Druckerunterstützung“.
CUPS bietet einige mächtige und einmalige Möglichkeiten. Neu ist auch die sehr einfache Handhabung der grundsätzlichen Funktionen. Da diese Funktionen anders sind als in den mehr traditionell orientierten Drucksystemen, wenden Sie am besten nicht Ihr bisheriges Wissen bezüglich des Druckens an. Versuchen Sie eher, CUPS von Grund auf zu verstehen. Diese Dokumentation soll dazu beitragen, dass Sie CUPS wirkllich verstehen. Beginnen wir mit den grundsätzlichen Dingen.
CUPS ist mehr als nur ein System für das Printspooling. Es ist ein komplettes Drucker-Management-System, das das neue Internet Printing Protocol (IPP) erfüllt. IPP ist ein IETF-Standard (Internet Engineering Task Force) für das Drucken in Netzwerken. Viele seiner Funktionen können remote oder lokal über einen Webbrowser verwaltet werden (Bereitstellung eines plattformunabhängigen Zugriffs auf den CUPS-Printserver). Zusätzlich hat es die traditionellen Kommandozeilen-Tools und weitere moderne GUI-Schnittstellen (GUI-Schnittstellen von Drittherstellern, wie etwa das überwältigende, in KDE enthaltene KDEPrint).
CUPS erlaubt das Anlegen von „raw“- Druckern (keine Übersetzung der Druckdaten) genauso wie von „smarten“ Druckern (Cups übersetzt das Dateiformat in das benötigte Druckerformat). Dies gibt CUPS auf vielfache Arten ähnliche Fähigkeiten wie dem MS Windows Print Monitoring System. Falls Sie ein CUPS- Verfechter sind, dann werden Sie sicher argumentieren, dass CUPS sogar besser ist! Wie auch immer, lassen Sie uns damit weitermachen, wie man CUPS für eine Zusammenarbeit mit MS Windows-Druckclients über SAMBA konfigurieren kann.
In Samba-3.0 (gilt auch für 2.2.x) sind für das grundlegende Drucken mit CUPS nur zwei Einträge nötig: printing = cups und printcap = cups. CUPS benötigt keine printcap-Datei. Dennoch gibt es in der Konfigurationsdatei cupsd.conf zwei zugehörige Einträge, die kontrollieren, wie diese Datei anzulegen und zu verwalten ist, damit Anwendungen von Drittherstellern damit umgehen können (Beispiel: Printcap /etc/printcap und PrintcapFormat BSD). Ältere Programme benötigen oft diese printcap-Datei mit den Namen der Drucker, um drucken zu können. Stellen Sie daher sicher, dass CUPS so konfiguriert wurde, dass diese printcap-Datei erstellt und gewartet wird. Die Details finden Sie auf der Manpage man cupsd.conf, in den CUPS-relevanten Dokumentationen sowie in den vielen Infos vom CUPS-Server selbst: http://localhost:631/documentation.html.
Samba hat eine spezielle Beziehung zu CUPS. Samba kann mit Unterstützung für die CUPS-Library übersetzt werden. Die meisten aktuellen Installationen haben diesen Support bereits per Default in smbd und den anderen Samba-Binaries integriert. Sie können CUPS auch benutzen, wenn Samba nicht gegen die libcups.so gelinkt ist, aber es gibt einige Unterschiede in den benötigten oder unterstützten Konfigurationen.
Wenn Samba mit libcups kompiliert worden ist, verwendet printcap = cups die CUPS-API, um Drucker aufzufinden, Jobs zu übergeben, Queues abzufragen usw. Sonst wird dies mit der zusätzlichen -oraw-Option auf die System V-Druck-Kommandos umgesetzt. Auf einem Linux-System können Sie mit dem Utility ldd nähere Details erfahren (ldd muss nicht auf allen Plattformen vorhanden sein, seine Funktionen können auch in einem vergleichbaren Programm enthalten sein).
root# ldd `which smbd` libssl.so.0.9.6 => /usr/lib/libssl.so.0.9.6 (0x4002d000) libcrypto.so.0.9.6 => /usr/lib/libcrypto.so.0.9.6 (0x4005a000) libcups.so.2 => /usr/lib/libcups.so.2 (0x40123000) [....]
Die Zeile libcups.so.2 => /usr/lib/libcups.so.2 (0x40123000) bedeutet, dass der CUPS-Support in Samba einkompiliert wurde. In diesem Fall und bei gesetztem printing = cups werden anderweitige manuell gesetzte print-Kommandos in smb.conf ignoriert. Bitte merken Sie sich diesen wichtigen Punkt !
Sollte es aus irgendeinem Grund nötig sein, Ihre eigenen Druck-Kommandos zu setzen, können Sie dies erreichen, in dem Sie die Option printing = sysv verwenden. Sie verlieren so jedoch die Unterstützung der engen CUPS/Samba-Integration. Wenn Sie das vorhaben, müssen Sie folgende Druckkommandos manuell konfigurieren (am wichtigsten: print command; andere Kommandos sind lppause command, lpresume command, lpq command, lprm command, queuepause command und queue resume command).
Als Zusammenfassung zeigt das folgende Beispiel ein einfaches drucker-relevantes Setup für smb.conf, um den grundlegenden Support für CUPS zu erhalten:
Beispiel 19.1. Einfachste drucker-bezogene smb.conf
Das ist alles, was Sie an grundlegenden Einstellungen zum Drucken mit CUPS benötigen. Dies wird alle Grafik-, Text-, PDF- und Postscript-Dateien drucken, die von Ihren Windows-Clients übermittelt werden. Aber die meisten Ihrer Windows-Benutzer würden nicht wissen, wie sie solche Dateien ohne einen grafischen Druckerdialog übermitteln können. Windows-Clients haben meist lokale Druckertreiber installiert, die in den Anwendungen durch den Druck-Button aktiviert werden. Ihre Benutzer drucken auch selten Dateien aus der Kommandozeile. Im Gegensatz zu Unix-Clients senden sie kaum Grafik-, Text- oder PDF- formatierte Dateien direkt zum Spooler. Sie drucken fast ausschließlich aus GUI-Anwendungen über den „Druckertreiber“, der zwischen der nativen Ausgabe des Programms und dem Druckdatenstrom sitzt. Ist das Ausgabegerät kein PostScript-Drucker, so ist der Druckdatenstrom in einem „Binärformat“, das nur der betreffende Drucker versteht. Lesen Sie bitte weiter, um zu verstehen, welche Probleme dabei entstehen und wie Sie diese vermeiden.
Die nächste Konfiguration beschreibt ein etwas komplexeres Drucker-Setup der smb.conf. Es aktiviert generellen CUPS-Druck-Support für alle Drucker, definiert aber einen Drucker, der davon abweichend konfiguriert wird.
Beispiel 19.2. Das Aufheben globaler CUPS-Einstellungen für einen Drucker
Diese spezielle Freigabe ist nur für Testzwecke gedacht. Sie schreibt den Druckauftrag nicht in eine Datei, sondern protokolliert nur die Auftragsparameter, die Samba bekannt sind, in die Datei /tmp/smbprn.log und löscht die Auftragsdatei. Außerdem ist der Parameter printer admin dieser Freigabe „kurt“ (nicht die Gruppe „@ntadmins“), Gast-Zugriff ist nicht erlaubt, die Freigabe wird nicht in der Netzwerkumgebung angezeigt (also müssen Sie wissen, dass es sie gibt), und sie erlaubt nur den Zugriff von nur drei Hosts. Um CUPS daran zu hindern, sich hier einzumischen und die Druckjobs dieser Freigabe zu übernehmen, müssen wir dies setzen: printing = sysv und printcap = lpstat.
Bevor wir in all die Konfigurationsoptionen eintauchen, lassen Sie uns ein paar Punkte klären. Netzwerk-Druck muss organisiert und korrekt eingerichtet werden. Dies passiert meistens nicht. Bestehenden alten Systemen oder LAN-Umgebungen in kleinen Firmen mangelt es oft an Design und guter Wartung.
Viele kleine Büro- oder Heim-Netzwerke, genauso wie schlecht organisierte größere Umgebungen, erlauben jedem Client einen direkten Zugriff auf verfügbare Netzwerkdrucker. Dies ist im Allgemeinen eine schlechte Idee. Es blockiert oft den Zugriff eines Clients auf den Drucker, wenn der Auftrag eines anderen Clients gedruckt wird. Dies könnte die Applikation des ersten Clients „einfrieren“, während diese darauf wartet, den Auftrag loszuwerden. Es gibt auch immer wieder Beschwerden darüber, dass Aufträge gedruckt werden, deren Seiten miteinander vermischt sind. Ein besseres Konzept ist die Verwendung eines Druck-Servers; er routet alle Aufträge durch ein zentrales System, das unverzüglich antwortet, Aufträge von mehreren verschiedenen Clients zur selben Zeit annimmt und diese danach in der korrekten Reihenfolge an die Drucker weiterleitet.
Die meisten traditionell konfigurierten UNIX-Druck-Server, die für Sambas Windows-Clients arbeiten, zeigen ein wirklich simples Setup. Ihre einzige Aufgabe war die Verwaltung des „raw spooling“ aller Jobs, die ihnen von Samba übergeben wurde. Dieser Ansatz bedeutete, dass von den Windows-Clients erwartet wurde, dass sie die Druckauftragsdatei so vorbereiten, dass diese bereit zum Versenden an das Drucker-Gerät ist. Hier muss ein nativer (vom Hersteller bereitgestellter) Windows-Druckertreiber für das Zielgerät auf jedem einzelnen Client installiert werden.
Es ist möglich, CUPS, Samba und Ihre Windows-Clients in derselben traditionellen und simplen Art zu konfigurieren. Wenn CUPS-Drucker für die Betriebsart RAW-print-through konfiguriert sind, ist es die Verantwortung des Samba-Clients, den Druckauftrag (die Datei) vollständig wiederzugeben. Die Datei muss in einem Format gesendet werden, das passend für die direkte Weitergabe an den Drucker ist. Clients müssen dafür die vom Hersteller bereitgestellten Treiber verwenden, CUPS wird keinerlei Format-Wandlung durchführen.
Die einfachste mögliche Druck-Konfiguration ist die Verwendung von „raw print-through“. Dies wird dadurch erreicht, dass der Drucker so installiert wird, als ob er physisch an den Windows-Client angeschlossen wäre. Sie leiten dann die Ausgabe auf eine raw-Netzwerk-Druck-Warteschlange um. Dazu ist folgendes Vorgehen erforderlich:
Editieren Sie /etc/cups/mime.types, um die Zeile nahe dem Dateiende auszukommentieren, die dies enthält:
#application/octet-...
Machen Sie dasselbe mit der Datei /etc/cups/mime.convs.
Fügen Sie über das Web-Interface einen raw-Drucker hinzu. Gehen Sie mit Ihrem Browser auf http://localhost:631. Klicken Sie auf Administration, und fügen Sie den Drucker gemäß der Aufforderungen hinzu. Installieren Sie keine Treiber dafür. Wählen Sie „Raw“. Wählen Sie den Queue-Namen Raw Queue.
Im Abschnitt [printers] der Datei smb.conf fügen Sie Folgendes hinzu: use client driver = Yes. Im Abschnitt [global] schreiben Sie: printing = CUPS und printcap = CUPS.
Installieren Sie den Drucker, als ob er ein lokaler Drucker wäre, z.B.: Drucken auf LPT1:.
Editieren Sie die Konfiguration im Tab , und legen Sie einen local port an, der auf die raw-Druck-Queue zeigt, die Sie oben angelegt haben. Beispiel: \\server\raw_q. Hier ist raw_q der Name, den Sie der Drucker-Warteschlange in der CUPS-Umgebung gegeben haben.
Die Druckertreiber auf den Windows-Clients können auf zwei funktional verschiedene Arten installiert werden:
Sie installieren die Treiber manuell, und zwar einen nach dem anderen lokal auf jedem Client; dies sorgt für ein Drucken im alten LanMan-Stil und verwendet eine Verbindung vom Typ \\sambaserver\druckerfreigabe.
Ablegen und Vorbereiten der Treiber (für den späteren Download) auf dem Druckserver (Samba); dies befähigt die Clients, „Point'n'Print“ zu verwenden, um Treiber semi-automatisch installiert zu bekommen, wenn sie das erste Mal auf den Drucker zugreifen; bei dieser Methode verwenden NT/200x/XP-Clients Druckaufrufe vom Typ SPOOLSS/MS-RPC.
Wir empfehlen, die zweite Methode zu verwenden.
Wenn Sie die erste Variante verwenden (Treiber werden auf Client-Seite installiert), gibt es eine Einstellung, die Sie beachten müssen: CUPS muss mitgeteilt werden, dass es den „raw“-Druck von Binär-Dateiformaten erlauben soll. Die CUPS-Dateien, die korrekt für RAW-Modus-Drucker gesetzt sein müssen, sind:
/etc/cups/mime.types
/etc/cups/mime.convs
Beide enthalten Einträge (am Ende der jeweiligen Datei), die auskommentiert werden müssen, um den RAW-Modus-Betrieb zu erlauben. In /etc/cups/mime.types muss folgende Zeile vorhanden sein:
application/octet-stream
In /etc/cups/mime.convs müssen Sie diese Zeile haben:
application/octet-stream application/vnd.cups-raw 0 -
Wenn diese beiden Dateien nicht korrekt für RAW-Windows-Client-Druck konfiguriert sind, kann es sein, dass Sie die gefürchtete Meldung Unable to convert file 0 in Ihrer CUPS-error_log-Datei vorfinden.
Das Editieren von mime.convs und mime.types erwingt den „raw“-Druck nicht, es erlaubt ihn nur.
Hintergrund. Da CUPS ein sicherheitsbewussteres Drucksystem ist als die traditionellen Systeme, erlaubt es in der Voreinstellung nicht, dass ein Benutzer beliebige (möglicherweise binäre) Daten an Druckgeräte sendet. Dies könnte leicht dazu benutzt werden, einen „Denial of Service“-Angriff auf Ihre(n) Drucker zu starten, was zumindest den Verlust von einer Menge Papier und Tinte nach sich ziehen würde. „Unbekannte“ Daten werden von CUPS als MIME type: application/octet-stream gekennzeichnet, und es wird ihnen nicht erlaubt, zum Drucker zu gelangen. In der Voreinstellung können Sie nur andere (bekannte) MIME-Typen „raw“ senden. Das „raw“-Senden von Daten bedeutet, dass CUPS nicht versucht, die Daten zu konvertieren und sie einfach unangetastet an den Drucker weiterleitet (im nächsten Kapitel finden Sie noch mehr Hintergrund-Erklärungen dazu).
Dies ist alles, was Sie darüber wissen müssen, um die CUPS/Samba-Combo zum „raw“-Drucken von Daten zu bewegen, die von Windows-Clients vorbereitet wurden, deren Herstellertreiber lokal installiert worden sind. Wenn Sie nicht an Hintergrund-Informationen zu erweitertem CUPS/Samba-Drucken interessiert sind, überspringen Sie einfach die restlichen Abschnitte dieses Kapitels.
Dieser Abschnitt beschreibt drei übliche Methoden, zuzüglich einer neuen, mit denen Druckertreiber auf den Server geladen werden können („Upload“).
Wenn Sie im MS-RPC-Stil drucken wollen, müssen Sie die Treiber zuerst auf den Samba-Server hochladen (Freigabe [print$]). Im vorangegangenen Kapitel dieser HOWTO-Sammlung wurde bereits beschrieben, wie man Druckertreiber auf dem Samba-Host ablegt (damit die Windows-Clients diese via „Point'n'Print“ herunterladen und verwenden können. Dort finden Sie Beschreibungen und Referenzen zu drei Methoden, um Druckertreiber auf dem Samba-Server vorzubereiten:
Diese drei Methoden können genauso auf CUPS angewendet werden. Ein neuer und praktischerer Weg, um Windows-Treiber in Samba zu laden, steht zur Verfügung, wenn Sie CUPS verwenden:
cupsaddsmb wird weiter unten im Detail behandelt. Zuerst erkunden wir aber das CUPS-Filter-System und vergleichen die Windows- und UNIX-Druck-Architektur.
Wir wissen nun, wie man einen „dump“-Druckserver aufsetzt: Das ist ein Server, der Druckaufträge „raw“ verwaltet, also die Druckdaten unberührt lässt.
Möglicherweise müssen Sie CUPS auf eine intelligentere Art installieren. Die Gründe können mannigfaltig sein:
Vielleicht will Ihr Chef monatliche Statistiken: Welcher Drucker hat wie viele Seiten gedruckt? Was war die durchschnittliche Größe eines Druckauftrags? Wie viele Druckaufträge gab es im Durchschnitt pro Tag? Welche Abteilung druckt wie viel?
Vielleicht sollen Sie ein Druck-Quota-System aufbauen: Benutzer sollten nicht mehr drucken können als ein vorgeschriebenes Limit pro Periode.
Vielleicht ist Ihr Netzwerkdruck-Setup ein komplettes Durcheinander und muss von Grund auf reorganisiert werden.
Vielleicht haben Sie bereits zu viele „blue screens“ gesehen, die von Druckertreibern herrühren, die unvollständig „debuggt“ wurden und im NT-„Kernel-Modus“ laufen?
Diese Ziele können nicht mit einem RAW-Druckserver erreicht werden. Um einen Server aufzubauen, der diesen Anforderungen entspricht, müssen Sie zuerst lernen, wie CUPS arbeitet und wie Sie seine Features aktivieren.
Was nun folgt, ist der Vergleich von einigen fundamentalen Konzepten des Windows- und UNIX-Drucks; danach folgt eine Beschreibung des CUPS-Filter-Systems: wie es arbeitet und wie Sie es beeinflussen können.
Netzwerkdurck ist eine der kompliziertesten und fehlerträchtigsten Alltagsaufgaben, die ein Benutzer oder Administrator zu bewältigen hat. Dies gilt für alle Betriebssysteme. Und hier sind die Gründe dafür:
Bei den meisten Dateiformaten können Sie nicht erwarten, dass die Datei einfach dadurch gedruckt wird, dass Sie sie an den Drucker schicken. Es muss eine Wandlung des Dateiformats stattfinden. Das Problem dabei ist, dass es keinen gemeinsamen Standard für Druck-Datei-Formate gibt, der für alle Hersteller und Druckertypen gelten würde. Während sich PostScript (Handelsmarke von Adobe) und - zu einem gewissen Teil - PCL (Handelsmarke von HP) dadurch zu halb offiziellen „Standards“ entwickelt haben, dass sie die am weitesten verbreiteten PDLs (Page Description Languages) sind, gibt es nach wie vor viele Hersteller, die „ihr eigenes Süppchen kochen“. (Der Grund dafür können inakzeptabel hohe Lizenzgebühren für drucker-interne PostScript-Interpreter sein usw.)
Im Betriebssystem Windows wird die Formatwandlung von den Druckertreibern erledigt. Auf der Windows-Plattform haben alle Anwendungsprogrammierer eine eingebaute API zur Verfügung, das Graphical Device Interface (GDI). Es ist ein Teil und Paket des Betriebssystems selbst, um darauf aufzubauen. Dieser GDI-Kern wird als gemeinsame einheitliche Grundlage für alle Windows-Programme verwendet, um Bilder, Schriften und Dokumente am Bildschirm („on screen“) darzustellen, genauso wie auf Papier („on paper“) (Druck). Daher können Druckertreiber-Hersteller bei ihrem Druckertreiber-Input von einem wohldefinierten GDI-Output ausgehen. Das Erreichen von WYSIWYG („What You See Is What You Get“) ist relativ einfach, weil die On-screen-Grafik-Primitive genauso wie die on-paper gezeichneten Objekte von einer gemeinsamen Quelle stammen. Diese Quelle, die GDI, erzeugt oft ein Dateiformat namens Enhanced MetaFile (EMF). EMF wird vom Druckertreiber verarbeitet und in ein drucker-spezifisches Format konvertiert.
Zusätzlich zur GDI-Basis in MS Windows hat Apple sich entschieden, die Papier- und Bildschirmausgaben für seine (auf BSD-UNIX basierende, wussten Sie das?) Betriebssysteme Mac OS X und Darwin auf eine gemeinsame Basis zu stellen. Apples Core Graphic Engine verwendet eine Abwandlung von PDF für alle Anzeigen.
In UNIX und Linux gibt es keine vergleichbare Schicht im OS-Kernel oder dem X-Server (Bildschirm-Darstellungsserver). Jede Anwendung ist für sich selbst verantwortlich, um ihre Druckausgabe zu erzeugen. Zum Glück verwenden die meisten Postscript, und das gibt zumindest etwas gemeinsame Grundlagen. Leider gibt es viele verschiedene Qualitätsstufen für Postscript. Und, was noch schlimmer ist, es gibt einen riesigen Unterschied (und keinen gemeinsamen Ursprung) zwischen der Darstellung desselben Dokuments auf dem Bildschirm und dem Zustand, wie dieses Dokument auf Papier dargestellt wird. WYSIWYG ist schwieriger zu erreichen. Dies stammt aus der Zeit, als vor Jahrezehnten die Vorläufer von X.org beim Entwurf der UNIX-Grundlagen und -Protokolle für GUIs die Verantwortung für die „Papierausgabe“ ablehnten und sich auf „nur on-screen“ beschränkten. (Seit einigen Jahren ist das Projekt „Xprint“ in Entwicklung. Man versucht, Druckunterstützung in das X-Framework zu integrieren, inklusive eines PostScript- und eines PCL-Treibers, aber dieses Projekt ist noch nicht praxistauglich.) Sie können dieses unangenehme Erbe bis heute sehen, wenn Sie sich die verschiedenen „font“-Verzeichnisse auf Ihrem System ansehen; es gibt eigene Schriften für X-Darstellung und andere für den Druck auf Papier.
Hintergrund. Die Programmiersprache PostScript ist eine „Erfindung“ von Adobe Inc., aber ihre Spezifikationen wurden vollständig veröffentlicht. Ihre Stärke liegt in den mächtigen Fähigkeiten, grafische Objekte zu beschreiben (Schriften, Formen, Muster, Linien, Kurven, und Punkte), deren Attribute (Farbe, Strichstärke) und die Art, diese zu manipulieren (Skalieren, Verzerren, Rotieren, Verschieben). Wegen der offenen Spezifikation kann jeder mit entsprechenden Fähigkeiten damit beginnen, seine eigene Implementation eines PostScript-Interpreters zu schreiben und diesen zu verwenden, um PostScript-Dateien auf dem Bildschirm oder auf Papier darzustellen. Die meisten grafischen Ausgabegeräte basieren auf dem Konzept von „Raster-Bildern“ oder „Pixeln“ (eine zu erwähnende Ausnahme bilden Stift-Plotter). Natürlich können Sie eine PostScript-Datei in seiner Text-Form betrachten und ihren PostScript-Code lesen, also die Sprachbefehle, die von einem Rasterizer interpretiert werden müssen. Rasterizer erzeugen Pixel-Bilder, die von einem Viewer auf dem Schirm dargestellt werden können oder eben von einem Drucker auf dem Papier.
Also fehlt UNIX eine gemeinsame Basis für den Druck und die Bildschirmdarstellung. Trotz dieses ungünstigen Erbes ist das Drucken grundsätzlich ziemlich einfach, wenn Sie PostScript-Drucker zur Verfügung haben. Der Grund dafür ist, dass diese Drucker einen eingebauten PostScript-„Interpreter“ besitzen, der auch Raster Image Processor (RIP) genannt wird. (Dadurch sind diese Drucker teurer als andere Drucker). Wenn Sie diesen Druckern PostScript-Daten schicken, werden diese sie auch drucken. Ihr RIP erledigt all die harte Arbeit des Umwandelns von PostScript-Zeichenbefehlen in ein Bitmap-Bild, wie Sie es auf Papier sehen, in einer Auflösung, wie Sie von Ihrem Drucker unterstützt wird. Dies entspricht dem PostScript-Druck einer Datei aus Windows.
Traditionelle UNIX-Programme und -Druck-Systeme sind bei Verwendung von PostScript nicht PPD-fähig. PPDs sind „PostScript Printer Description“-Dateien. Sie ermöglichen es Ihnen, alle Optionen, die ein Drucker kennt, anzugeben und zu kontrollieren: Duplexdruck, Stapeln und Lochen. Daher konnten UNIX-Anwender lange Zeit viele der unterstützten Geräte- und Auftragsoptionen nicht nutzen, im Unterschied zu Windows- und Apple-Anwendern. Aber jetzt gibt es CUPS.
Jedoch gibt es auch andere Drucker-Typen da draußen. Diese Typen wissen nicht, wie man PostScript druckt. Sie verwenden ihre eigene Page Description Language (PDL, oft proprietär). Das Drucken auf diesen Geräten stellt höhere Anforderungen. Da Ihre UNIX-Anwendungen meistens PostScript erzeugen und da diese Geräte kein PostScript verstehen, müssen Sie die Druckdateien auf dem Host in ein für Ihren Drucker passendes Format konvertieren, bevor Sie diese an den Drucker senden können.
Hier betritt Ghostscript die Bühne. Ghostscript ist der traditionelle (und ziemlich mächtige) PostScript-Interpreter, der auf UNIX-Plattformen verwendet wird. Es ist ein RIP als Software, imstande, viele Datei-Konvertierungen für ein sehr großes Spektrum von Hardware-Geräten bzw. Software-Dateiformaten durchzuführen. Die Ghostscript-Technologie und -Treiber ermöglichen den PostScript-Druck auf nicht-PostScript-fähige Hardware.
Verwenden Sie den Befehl „gs -h“, um alle eingebauten „devices“ Ihrer Ghostscript-Version anzusehen. Wenn Sie den Parameter -sDEVICE=png256 auf Ihrer Ghostscript-Befehlszeile angeben, teilen Sie Ghostscript mit, den Input in eine PNG-Datei zu konvertieren. Ein „device“ auf der Befehlszeile anzugeben ist der wichtigste Parameter, um Ghostscript exakt mitzuteilen, wie es den Input darstellen soll. Neue Versionen von Ghostscript werden in ziemlich regelmäßigen Intervallen veröffentlicht, mittlerweile von artofcode LLC. Diese Versionen werden ursprünglich unter die Lizenz „AFPL“ gestellt, aber dann unter der GNU GPL wiederveröffentlicht, sobald die nächste AFPL-Version erscheint. GNU Ghostscript ist wahrscheinlich die auf den meisten Samba-Systemen installierte Version. Aber es hat einige Mängel. Daher wurde ESP Ghostscript als eine Erweiterung zu GNU Ghostscript entwickelt, mit vielen Bug-fixes, zusätzlichen Geräten und Erweiterungen. Es wird gemeinsam von Entwicklern von CUPS, Gimp-Print, MandrakeSoft, SuSE, Red Hat und Debian verwaltet und entwickelt. Es beinhaltet das Gerät „cups“ (das essenziell wichtig ist, um von CUPS aus auf Nicht-PS-Drucker zu drucken).
Während PostScript im Kern eine Seitenbeschreibungssprache (PDL) ist, um das Layout einer Seite auf eine geräte-unabhängige Art darzustellen, werden in der Praxis Druckaufträge letztendlich immer von Hardware mit geräteabhängigen Eigenschaften ausgegeben. Um all die Unterschiede in der Hardware zu berücksichtigen und Innovation zu ermöglichen, hat Adobe eine Syntax und ein Dateiformat für PostScript-Printer-Description-(PPD-)Dateien bestimmt. Jeder PostScript-Drucker wird mit einer dieser Dateien geliefert.
PPDs enthalten all die Informationen über generelle und spezifische Eigenschaften des jeweiligen Drucker-Modells: Welche verschiedenen Auflösungen kann es verarbeiten? Hat es eine Duplex-Einheit? Wie viele Papierschächte gibt es? Welche Arten von Medien und deren Formate kann es verarbeiten? Für jeden Punkt benennen PPDs auch die spezielle Befehlsfolge, die man an den Drucker (meist innerhalb der PostScript-Datei) senden muss, um ihn zu aktivieren.
Die Information in diesen PPDs ist dafür bestimmt, von den Druckertreibern berücksichtigt zu werden. Daher wird als Teil des für einen bestimmten Drucker installierten Windows-PostScript-Treibers die PPD des Druckers installiert. Wo es Sinn macht, werden die PPD-Features in den UI-Dialogen des Treibers dargestellt, um dem Benutzer eine Auswahl von Druck-Optionen zu geben. Abschließend wird die Auswahl des Benutzers in die vom Drucker erstellte PostScript-Datei geschrieben (in der Form spezieller PostScript-, PJL-, JCL- oder herstellerspezifischer Befehle).
Eine PostScript-Datei, die angelegt wurde, um gerätespezifische Befehle zum Erreichen einer bestimmten Druckausgabe (z.B. Duplexdruck, Stapeldruck oder Faltungen) auf einem bestimmten Ausgabegerät zu enthalten, kann möglicherweise nicht so drucken, wie erwartet, oder kann auf anderen Druckermodellen gar nicht zu drucken sein; es kann auch sein, dass diese Datei nicht mehr für eine weitere Verarbeitung durch Software geeignet ist (z.B. durch ein PDF-distilling-Programm).
CUPS kann mit allen spezifikationsgemäßen PPDs ungehen, wie sie von Herstellern für ihre PostScript-Modelle bereitgestellt werden. Sogar wenn ein Hersteller unser Lieblingsbetriebssystem nicht in seinen Handbüchern und Broschüren erwähnt hat, können Sie sich sicher darauf verlassen: Wenn Sie die Windows NT-Version der PPD erhalten, können Sie diese unverändert mit CUPS verwenden und daher die volle Leistungsfähigkeit Ihres Druckers nutzen, genauso wie ein Windows NT-Benutzer es könnte!
Um online zu prüfen, ob eine beliebige PPD der Spezifikation entspricht, gehen Sie auf http://www.cups.org/testppd.php und laden Ihre PPD. Sie sehen das Ergebnis sofort. CUPS hat seit der Version 1.1.19 ein weitaus strikteres internes PPD-Parsing und eine Code-Prüfung aktiviert; im Fall von Druckerproblemen sollte diese Online-Ressource eine Ihrer ersten Anlaufstellen sein.
Für tatsächliche PostScript-Drucker verwenden Sie nicht die Foomatic oder cupsomatic PPDs von Linuxprinting.org. Mit diesen Geräten sind immer die vom Hersteller bereitgestellten PPDs die erste Wahl!
Wenn Sie nach einer Original-Hersteller-PPD eines spezifischen Geräts suchen und Sie wissen, dass eine NT4-Maschine (oder irgendeine andere Windows-Maschine) in Ihrem LAN den PostScript-Treiber installiert hat, verwenden Sie einfach smbclient //NT4-box/print\$ -U username, um auf das Windows-Verzeichnis zuzugreifen, in dem alle Druckertreiber-Dateien gespeichert sind. Durchsuchen Sie zuerst das Unterverzeichnis W32X86/2 nach den gesuchten PPDs.
CUPS verwendet auch spezielle PPDs, um mit Nicht-PostScript-Druckern umzugehen. Diese PPDs sind üblicherweise nicht von den Herstellern verfügbar (und, nein, Sie können nicht einfach die PPD eines PostScript-Druckers mit demselben Modellnamen verwenden und hoffen, dass diese auch mit der Nicht-PostScript-Version funktioniert). Um zu verstehen, wie diese PPDs funktionieren, müssen wir zuerst tief in die Architektur der CUPS-Filter und -Dateiumwandlung eintauchen. Bleiben Sie dran.
Der Kern des CUPS-Filter-Systems beruht auf Ghostscript. Zusätzlich dazu verwendet CUPS einige andere eigene Filter. Sie (oder der Hersteller Ihres Betriebssystems) können sogar noch mehr Filter hinzugefügt haben. CUPS behandelt alle Dateiformate unter der Zuordnung verschiedener MIME-Typen. Jede eintreffende Druckdatei wird einem initialen Auto-Typing zugeführt. Dieses Auto-Typing bestimmt den MIME-Typ der Druckdatei. Ein bestimmter MIME-Typ bedingt keine oder mehrere mögliche Filter-Ketten, die für den gewählten Zieldrucker relevant sind. Dieser Abschnitt behandelt, wie die Erkennungs- und Umwandlungsregeln von MIME-Typen zusammenarbeiten. Sie werden von CUPS dazu verwendet, um automatisch eine funktionierende Filterkette für jedes beliebige Eingabe-Datenformat zu bilden.
Wenn CUPS eine PostScript-Datei in ein Bitmap rastert, passiert dies in zwei Stufen:
Die erste Stufe verwendet ein Ghostscript-Device namens „cups“ (dies seit Version 1.1.15) und erzeugt ein generisches Raster-Format namens „CUPS raster“.
Die zweite Stufe verwendet einen „raster driver“, der das generische „CUPS raster“ in ein gerätespezifisches Raster konvertiert.
Stellen Sie sicher, dass Ihre Ghostscript-Version das Gerät „cups“ einkompiliert hat (überprüfen Sie das mit gs -h | grep cups). Ansonsten könnten Sie das gefürchtete Unable to convert file 0 in Ihrer CUPS-error_log-Datei vorfinden. Um „cups“ als Gerät in Ihrem Ghostscript zu haben, müssen Sie entweder GNU Ghostscript patchen und neu kompilieren, oder Sie verwenden ESP Ghostscript. Die bessere Alternative ist ESP Ghostscript. Es unterstützt nicht nur CUPS, sondern auch 300 andere Geräte (während GNU Ghostscript nur ungefähr 180 Geräte unterstützt). Wegen dieser breiten Unterstützung von Ausgabegeräten ist ESP Ghostscript auch die erste Wahl für Nicht-CUPS-Spooler. Es wird mittlerweile von Linuxprinting.org für alle Spooler empfohlen.
CUPS-Drucker können so eingerichtet werden, dass sie externe Darstellungspfade verwenden. Einer der gängigsten ist das Konzept Foomatic/cupsomatic von Linuxprinting.org. Dieses verwendet den klassischen Ghostscript-Ansatz, alles auf einmal zu tun. Es verwendet nicht das Gerät „cups“, sondern eines der vielen anderen. Jedoch erzielt man auch bei der Verwendung von Foomatic/cupsomatic das beste Ergebnis und die breiteste Drucker-Modell-Unterstützung mit ESP Ghostscript (mehr zu cupsomatic/Foomatic, im Speziellen zur neuen Version, die jetzt foomatic-rip heißt, finden Sie weiter unten).
CUPS liest die Datei /etc/cups/mime.types (und alle anderen Dateien mit einem Suffix *.types im selben Verzeichnis) beim Start. Diese Dateien enthalten die Regeln zur Erkennung des MIME-Typs, die angewendet werden, wenn CUPS seine Auto-Typing-Routinen ausführt. Die Regel-Syntax wird in der Manpage von mime.types erklärt sowie im Abschnitt „comments“ in der Datei mime.types selbst. Eine einfache Regel sieht so aus:
application/pdf pdf string(0,%PDF)
Das bedeutet: Wenn ein Dateiname das Suffix .pdf hat oder der magische String %PDF exakt am Beginn der Datei selbst (Offset 0 vom Start) steht, ist dies eine PDF-Datei (application/pdf). Eine weitere Regel ist:
application/postscript ai eps ps string(0,%!) string(0,<04>%!)
Wenn der Dateiname eines der Suffixe .ai, .eps, .ps hat oder die Datei selbst mit einem der Strings %! oder <04>%! beginnt, ist es eine generische PostScript-Datei (application/postscript).
Verwechseln Sie nicht die anderen mime.types-Dateien, die Ihr System verwendet, mit denen im Verzeichnis /etc/cups/.
Es gibt einen wichtigen Unterschied zwischen zwei ähnlichen MIME-Typen in CUPS: Einer ist application/postscript, der andere ist application/vnd.cups-postscript. Während application/postscript geräte-unabhängig sein soll (Auftragsoptionen sind immer noch außerhalb des PS-Datei-Inhalts, von CUPS in der Befehlszeile oder Umgebungsvariablen eingebettet), kann application/vnd.cups-postscript die Auftragsoptionen in die Postscript-Daten selbst eingefügt erhalten (wo sich das anwenden lässt). Die Transformation des generischen PostScript-Formats (application/postscript) in gerätespezifisches PostScript (application/vnd.cups-postscript) ist die Aufgabe des CUPS-Filters pstops. pstops verwendet Informationen aus dem PPD, um die Transformation durchzuführen.
CUPS kann mit seinen Filtern folgende Formate und ihre zugehörigen MIME-Typen handhaben: ASCII text, HP-GL, PDF, PostScript, DVI und viele Bild-Formate (GIF, PNG, TIFF, JPEG, Photo-CD, SUN-Raster, PNM, PBM, SGI-RGB und noch mehr).
CUPS liest die Datei /etc/cups/mime.convs (und alle anderen Dateien mit der Endung *.convs im selben Verzeichnis) beim Starten. Diese Dateien enthalten Zeilen, die einen Eingabe-MIME-Typus, einen Ausgabe-MIME-Typus, einen Format-Wandlungsfilter, der den Ausgabe-Typus aus dem Eingabe-Typus erzeugen kann, sowie virtuelle Kosten angeben, die mit dieser Umwandlung verbunden sind. Ein Beispiel für eine solche Zeile ist Folgendes:
application/pdf application/postscript 33 pdftops
Das bedeutet, dass der Filter pdftops den Typ application/pdf als Eingabe verwenden und daraus application/postscript als Ausgabe erzeugen wird; die virtuellen Kosten dieser Operation sind 33 CUPS-$. Der nächste Filter ist teurer, er kostet 66 CUPS-$:
application/vnd.hp-HPGL application/postscript 66 hpgltops
Dies ist der Filter hpgltops, der HP-GL-Plotter-Dateien in PostScript umwandelt.
application/octet-stream
application/x-shell application/postscript 33 texttops text/plain application/postscript 33 texttops
Die letzten beiden Beispiele lassen den Filter texttops sowohl an text/plain als auch an application/x-shell arbeiten. (Hinweis: Diese Unterscheidung wird für das Syntax-Highlighting von texttops benötigt).
Es gibt viel mehr Kombinationen in mime.convs. Sie sind jedoch nicht darauf beschränkt, die hier vordefinierten Kombinationen zu verwenden. Sie können jeden Filter, den Sie wollen, in das CUPS-Grundgerüst einsetzen. Es muss einigen minimalen Anforderungen entsprechen oder dazu gebracht werden, ihnen zu entsprechen. Wenn Sie irgendeinen coolen Filter finden (oder schreiben), stellen Sie sicher, dass er dem entspricht, was CUPS braucht, und dass Sie die richtigen Zeilen in die Dateien mime.types und mime.convs einfügen. Dann wird er prolemlos innerhalb von CUPS arbeiten.
Die erwähnten „CUPS-Anforderungen“ für Filter sind simpel. Nehmen Sie den Dateinamen oder stdin als Input, und schreiben Sie diesen auf stdout. Die Filter sollten die folgenden fünf bis sechs Argumente verstehen: printer job user title copies options [filename].
Der Name der Drucker-Queue (Normalerweise ist dies der Name des ausgeführten Filters.)
Die numerische Auftrags-ID des gerade gedruckten Auftrags
Der String aus dem Attribut originating-user-name
Der String aus dem Attribut job-name
Der numerische Wert des Attributs number-copies
Die Auftragsoptionen
(optional) Die Datei der Druckanfrage (wenn diese Angabe fehlt, erwarten die Filter, die Daten über stdin geliefert zu bekommen). In den meisten Fällen ist es einfach, ein einfaches Wrapper-Skript um Filter zu schreiben, um sie mit CUPS arbeiten zu lassen.
Wie zuvor bemerkt, ist PostScript das zentrale Dateiformat für jedes UNIX-basierende Drucksystem. Von PostScript aus generiert CUPS Rasterdaten zur Lieferung an Nicht-PostScript-Drucker.
Aber was passiert, wenn Sie eines der unterstützten Nicht-PS-Formate in den Druck schicken? Dann verwendet CUPS „pre-filters“ auf diese Eingabeformate, um als Erstes PostScript zu erzeugen. Es gibt solche Vorfilter, um PS aus ASCII text, PDF, DVI oder HP-GL zu erzeugen. Die Ausgabe dieser Filter ist immer vom MIME Typ application/postscript (das bedeutet, dass jegliche geräte-spezifische Druckoptionen noch nicht von CUPS ins PS eingebettet werden, und dass der nächste aufzurufende Filter pstops ist). Ein weiterer Vorfilter läuft über alle unterstützten Bildformate, der Filter imagetops. Seine Ausgabe ist immer vom MIME-Typ application/vnd.cups-postscript (nicht application/postscript), was bedeutet, dass die Druckoptionen bereits in die Datei eingebettet sind.
pstops ist der Filter, um application/postscript in application/vnd.cups-postscript umzuwandeln. Es wurde bereits oben erwähnt, dass dieser Filter alle gerätespezifischen Druckoptionen (Befehle an den Drucker, um Duplexdruck, Stapeln und Lochen zu veranlassen usw.) in die PostScript-Datei einbindet.
Das ist nicht alles. Andere ausgeführte Aufgaben sind:
Die Auswahl der zu druckenden Seiten (wenn Sie nur die Seiten „3, 6, 8-11, 16, 19-21“ drucken wollen oder nur die ungeraden Seiten).
Zwei oder mehr logische Seiten auf ein Blatt Papier drucken (die so genannte „number-up“-Funktion).
Das Zählen der Seiten des Auftrags, um die Abrechnungsinformation in die Datei /var/log/cups/page_log zu schreiben.
pstoraster befindet sich im Kern des CUPS-Filtersystems. Er ist für die erste Stufe des Raster-Prozesses verantwortlich. Sein Input ist vom MIME-Typ application/vnd.cups-postscript; seine Ausgabe ist application/vnd.cups-raster. Dieses Ausgabeformat ist noch nicht zum Drucken gedacht, seine Aufgabe ist es, als allgemeines Input-Format für spezialisierte Raster-Treiber zu dienen, die imstande sind, gerätespezifische Druckerdaten zu generieren.
CUPS-Raster ist ein generisches Rasterformat mit mächtigen Eigenschaften. Es ist imstande, Informationen zu einzelnen Seiten, Farbprofile und mehr einzubeziehen, um diese Informationen nachfolgenden Raster-Treibern zu übergeben. Sein MIME-Typ ist bei der IANA registriert, und seine Spezifikation ist, natürlich, völlig offen. Es wurde entworfen, um es Herstellern zu ermöglichen, ziemlich einfach und günstig Raster-Treiber für Linux und UNIX zu entwickeln, wenn diese es möchten. CUPS übernimmt immer die erste Stufe des Rasterns, so dass Hersteller sich nicht um die Ghostscript-Komplikationen kümmern müssen (tatsächlich gibt es derzeit mehr als nur einen Hersteller, der die Entwicklung von CUPS-Raster-Treibern finanziert).
CUPS-Versionen vor Version 1.1.15 beinhalteten einen binären (oder Sourcecode-) Stand-alone-Filter namens pstoraster. pstoraster wurde von GNU Ghostscript 5.50 abgeleitet und konnte neben oder zusätzlich zu einem beliebigen GNU- oder AFPL-Ghostscript-Paket installiert werden, ohne Konflikte zu verursachen.
Mit Version 1.1.15 hat sich dies geändert. Die dafür benötigten Funktionen wurden zurück in Ghostscript integriert (sie basieren nun auf der GNU-Ghostscript-Version 7.05). Der pstoraster-Filter ist nun ein einfaches Shell-Skript, das gs mit dem Parameter -sDEVICE=cups aufruft. Wenn Ihr Ghostscript nicht erfolgreich auf gs -h |grep cups antwortet, könnte es sein, dass Sie nicht drucken können. Aktualisieren Sie Ihr Ghostscript.
Im Abschnitt über Vorfilter haben wir den Vorfilter erwähnt, der PostScript aus Bildformaten erzeugt. Der Filter imagetoraster wird verwendet, um Bilder direkt, ohne die Zwischenstufe PostScript, in Raster-Format zu konvertieren. Er wird öfter als die oben erwähnten Vorfilter verwendet. Wir fassen das Filtern von Bilddateien im nächsten Bild zusammen.
CUPS wird mit ziemlich verschiedenen Rastertreibern geliefert, die CUPS-Raster verarbeiten. Auf meinem System finde ich in /usr/lib/cups/filter/ diese: rastertoalps, rastertobj, rastertoepson, rastertoescp, rastertopcl, rastertoturboprint, rastertoapdk, rastertodymo, rastertoescp, rastertohp und rastertoprinter. Keine Sorge, wenn Sie weniger Filter vorfinden; manche von diesen wurden von kommerziellen CUPS-Erweiterungen installiert (wie rastertoturboprint), andere (wie rastertoprinter) von so genannten „third-party“ Treiber-Entwicklungsprojekten (wie Gimp-Print), um möglichst eng mit CUPS zusammenzuarbeiten.
Der letzte Teil jeder CUPS-Filterkette ist ein Backend. Backends sind spezielle Programme, die das druckfertige Programm schlussendlich an das Gerät senden. Es gibt ein separates Backend-Programm für jedes Transfer-Protokoll, um Druckaufträge über das Netzwerk zu senden, oder für jedes lokales Interface. Jede CUPS-Druckwarteschlange braucht eine CUPS-„device-URI“, mit der es assoziiert wird. Die device-URI ist eine Art, das Backend codiert anzugeben, das verwendet wird, um den Auftrag an seinen Bestimmungsort zu senden. Netzwerk-device-URIs verwenden zwei Schrägstriche in ihrer Syntax, lokale device-URIs nur einen, wie Sie der folgenden Liste entnehmen können. Bitte denken Sie daran, dass die Namen der lokalen Interfaces stark von den hier angegebenen Beispielen abweichen können, wenn Ihr Betriebssystem nicht Linux ist:
Dieses Backend sendet Druckdateien auf Drucker, die mit USB angeschlossen sind. Ein Beispiel für die CUPS-device-URI ist: usb:/dev/usb/lp0.
Dieses Backend sendet Druckdateien auf seriell angeschlossene Drucker. Ein Beispiel für die CUPS-device-URI ist: serial:/dev/ttyS0?baud=11500.
Dieses Backend sendet Druckdateien auf Drucker, die an Parallel-Ports angeschlossen sind. Ein Beispiel für die CUPS-device-URI ist: parallel:/dev/lp0.
Dieses Backend sendet Druckdateien auf Drucker, die an das SCSI-Interface angeschlossen sind. Ein Beispiel für die CUPS-device-URI ist: scsi:/dev/sr1.
Dieses Backend sendet Druckdateien auf Netzwerk-Drücker, die über LPR/LPD angeschlossen sind. Ein Beispiel für die CUPS-device-URI ist: lpd://remote_host_name/remote_queue_name.
Dieses Backend sendet Druckdateien an Netzwerk-Drucker, die mit AppSocket (alias „HP JetDirect“) angeschlossen sind. Ein Beispiel für die CUPS-device-URI ist: socket://10.11.12.13:9100.
Dieses Backend sendet Druckdateien an Netzwerk-Drucker, die mit IPP angeschlossen sind. Ein Beispiel für die CUPS-device-URI ist: ipp:://192.193.194.195/ipp (für viele HP-Drucker) oder ipp://remote_cups_server/printers/remote_printer_name.
Dieses Backend sendet Druckdateien an Drucker, die mit HTTP angeschlossen sind. (Das http://-CUPS-Backend ist nur ein symlink auf das ipp://-Backend.) Beispiele für die CUPS-device-URIs sind: http:://192.193.194.195:631/ipp (für viele HP-Drucker) oder http://remote_cups_server:631/printers/remote_printer_name.
Dieses Backend sendet Druckdateien an Windows-Druckerfreigaben. Ein Beispiel für die CUPS-device-URI ist:
| smb://workgroup/server/printersharename |
| smb://server/printersharename |
| smb://username:password@workgroup/server/printersharename |
| smb://username:password@server/printersharename |
Das smb://-Backend ist ein Symlink auf das Samba-Werkzeug smbspool (nicht in CUPS enthalten). Wenn der Symlink in Ihrem CUPS-Backend-Verzeichnis nicht vorhanden ist, können Sie es als root-Benutzer anlegen (oder von root anlegen lassen): ln -s `which smbspool' /usr/lib/cups/backend/smb.
Es ist einfach, Ihre eigenen Backends als Shell- oder Perl-Skripten zu schreiben, wenn Sie irgendeine Änderung oder Erweiterung zum CUPS-Druck-System brauchen. Ein Grund könnte sein, dass Sie „spezielle“ Drucker anlegen wollen, die Druckaufträge per E-Mail senden (durch das „mailto:/“-Backend), diese in PDF wandeln (durch das „pdfgen:/“-Backend) oder sie mittels „/dev/null“ entsorgen. (Tatsächlich habe ich den systemweiten Standard-Drucker so installiert, dass er mit einem devnull:/-Backend verbunden ist; es gibt einfach zu viele Leute, die Aufträge ohne Angabe eines Druckers senden oder Skripten und Programme senden, die keinen Drucker angeben. Der systemweite Standard-Drucker ?))) löscht den Auftrag und sendet eine höfliche E-Mail an den $USER, in der er gebeten wird, immer den richtigen Druckernamen anzugeben.)
Nicht alle erwähnten Backends müssen auf Ihrem System vorhanden oder verwendbar sein (abhängig von der Hardware-Konfiguration). Welche CUPS-Backends verfügbar sind, können Sie mit dem Werkzeug lpinfo testen. Mit der Option -v listet es alle verfügbaren Backends auf:
$ lpinfo -v
cupsomatic-Filter sind wahrscheinlich die meistverwendeten Filter in CUPS-Installationen. Seien sich im Klaren darüber, dass diese Filter nicht von den CUPS-Leuten entwickelt worden sind. Es sind „third party“-Erweiterungen für CUPS. Sie verwenden die traditionellen Ghostscript-Devices, um Aufträge für CUPS darzustellen. Bei der Fehlersuche sollten Sie über den Unterschied Bescheid wissen. Hier findet der gesamte Darstellungsprozess in einem Schritt statt, und zwar innerhalb von Ghostscript und unter Verwendung eines passenden Gerätetreibers für den Ziel-Drucker. cupsomatic verwendet PPDs, die aus der Foomatic-Drucker&Treiber-Datenbank generiert werden, die Sie unter Linuxprinting.org finden.
Sie erkennen diese PPDs an der Zeile, die den cupsomatic-Filter aufruft:
*cupsFilter: „application/vnd.cups-postscript 0 cupsomatic“
Sie finden diese Zeile unter den ersten (ungefähr) 40 Zeilen der PPD-Datei. Wenn Sie ein solches PPD installiert haben, erscheint der Drucker im CUPS-Web-Interface mit dem Eintrag foomatic in der Treiberbeschreibung. cupsomatic ist ein Perl-Skript, das Ghostscript mit all den komplizierten Befehlszeilen-Optionen aufruft, die automatisch aus dem gewählten PPD und den Befehlszeilen-Optionen generiert wurden, die dem Druckauftrag mitgegeben wurden.
Jedoch ist cupsomatic mittlerweile veraltet. Seine PPDs (besonders deren erste Generation, die da draußen imer noch fleißig verwendet wird) entsprechen nicht den Adobe-Spezifikationen. Sie könnten Schwierigkeiten damit haben, wenn Sie sie mit „Point'n'Print“ auf Windows-Clients downloaden wollen. Ein besserer und leistungsfähigerer Nachfolger ist nun in einer stabilen Beta-Version verfügbar: Er heißt foomatic-rip. Um foomatic-rip als Filter mit CUPS zu verwenden, brauchen Sie die PPDs von neueren Typ. Diese haben eine ähnliche, jedoch andere Zeile:
*cupsFilter: „application/vnd.cups-postscript 0 foomatic-rip“
Der Mechanismus unter Linuxprinting.org, der PPDs generiert, wurde umgestaltet. Die neuen PPDs entsprechen den Adobe-Spezifikationen. Vor allem stellen sie ein neues Verfahren zur Verfügung, um mit einem einzelnen Klick verschiedene Qualitätsstufen anzugeben (hochauflösende Fotos, normale Farbe, Graustufen und Entwurf), wo Sie zuvor fünf oder mehr verschiedene Auswahlen treffen mussten (Medientyp, Auflösung, Tintenart und Dithering-Algorithmus). Es gibt Unterstützung für individuelle Mediengrößen. Es gibt Unterstützung für das Umschalten von Optionen zwischen einzelnen Seiten eines Druckauftrags. Und das Beste ist, dass der neue foomatic-rip nun nahtlos mit allen klassischen Spoolern zusammenarbeitet (wie LPRng, BSD-LPD, PDQ, PPR usw.), was diesen Spoolern die Verwendung von PPDs ermöglicht.
Wenn Sie einen Überblick über all die Filter sehen wollen und darüber, wie sie sich zueinander verhalten, finden Sie das gesamte Bild dieses Puzzles am Ende dieses Dokuments.
CUPS bildet automatisch alle möglichen Filterketten für jeden beliebigen MIME-Typ und jeden installierten Drucker. Aber wie entscheidet es sich für oder gegen eine bestimmte Alternative? (Es kann oft Fälle geben, in denen es zwei oder mehr Filterketten für denselben Ziel-Drucker gibt.) Das ist einfach. Sie haben vielleicht die Zahlen in der dritten Spalte der Datei mime.convs bemerkt. Diese repräsentieren virtuelle Kosten, die dem jeweiligen Filter zugeordnet sind. Jede mögliche Filterkette ergibt eine Summe von „Filter-Kosten.“ CUPS entscheidet zugunsten der „günstigsten“ Route.
Die Einstellung von FilterLimit 1000 in cupsd.conf bewirkt, dass nur so viele Filter gleichzeitig ausgeführt werden, dass sie insgesamt 1000 virtuelle Filter-Kosten verursachen. Dies ist eine effiziente Art, die Last eines CUPS-Servers zu begrenzen, indem man einen passenden Wert für „FilterLimit“ setzt. Ein FilterLimit von 200 erlaubt nur ungefähr einen Auftrag zur gleichen Zeit, während ein FilterLimit von 1000 ungefähr fünf Aufträge gleichzeitig erlaubt.
Sie können CUPS (so ziemlich) jede Datei „raw“ drucken lassen. „Raw“ bedeutet, dass sie nicht gefiltert wird. CUPS sendet die Datei so an den Drucker, „wie sie ist“, ohne sich darum zu kümmern, ob der Drucker imstande ist, diese Datei zu „verdauen“. Die Benutzer müssen sich selbst darum kümmern, dass sie nur sinnvolle Datenformate senden. Raw-Druck kann in jeder Warteschlange stattfinden, wenn die Option „-o raw“ auf der Befehlszeile angegeben wird. Sie können auch Nur-raw-Queues anlegen, indem Sie einfach keinerlei PPD mit einer Queue assoziieren. Der Befehl
$ lpadmin -P rawprinter -v socket://11.12.13.14:9100 -E
installiert eine Queue namens „rawprinter“, die über das Protokoll „socket“ (alias „HP JetDirect“) mit dem Gerät mit der IP-Adresse 11.12.1.3.14 verbunden ist, das an Port 9100 arbeitet. (Wenn Sie ein PPD mit -P /path/to/PPD zur Befehlszeile hinzugefügt hätten, hätten Sie eine „normale“ Druck-Queue installiert.)
CUPS behandelt automatisch jeden Auftrag, der an eine Queue gesendet wird, als „raw“, wenn es keine mit der Queue assoziierte PPD vorfindet. Jedoch wird CUPS nur bekannte MIME-Typen senden (wie in seiner eigenen Datei mime.types definiert) und andere ablehnen.
Jeder MIME-Typ ohne Regel in der Datei /etc/cups/mime.types wird als unbekannt oder als application/octet-stream betrachtet und nicht gesendet. Weil CUPS es standardmäßig ablehnt, unbekannte MIME-Typen zu drucken, haben Sie vielleicht schon einmal erlebt, dass Druckaufträge von Windows-Clients nicht gedruckt wurden. Sie haben vielleicht eine Fehlermeldung in Ihren CUPS-Logdateien gefunden, die wie folgt lautete:
Unable to convert file 0 to printable format for job
Um das Drucken von Dateien des Typs application/octet-stream zu ermöglichen, müssen Sie zwei Dateien editieren:
/etc/cups/mime.convs
/etc/cups/mime.types
Beide enthalten Einträge (am Ende der jeweiligen Datei), die auskommentiert werden müssen, um RAW-Verarbeitung des MIME-Typs application/octet-stream zu erlauben. In /etc/cups/mime.types muss diese Zeile vorhanden sein:
application/octet-stream
Diese Zeile (ohne spezifisches (((auto-typing rule set)))? ordnet alle Dateien, die nicht anderswo automatisch typisiert wurden, dem Typ application/octet-stream zu. Stellen Sie sicher, daß Sie in /etc/cups/mime.convs folgende Zeile haben:
application/octet-stream application/vnd.cups-raw 0 -
Diese Zeile weist CUPS an, für den MIME-Typ application/octet-stream den Null-Filter zu verwenden (markiert mit „-“, tut gar nichts) und das Resultat als application/vnd.cups-raw zu kennzeichnen. Dies ist immer ein grünes Licht für den CUPS-Scheduler, um die Datei an das Backend zu übergeben, das sich dann mit dem Drucker verbindet und die Datei sendet.
Das Editieren von mime.convs und mime.types erzwingt den „raw“-Druck nicht, es erlaubt ihn nur.
Hintergrund. Da CUPS ein sicherheitsbewussteres Drucksystem ist als die traditionellen Systeme, erlaubt es per Voreinstellung nicht, dass ein Benutzer beliebige (möglicherweise binäre) Daten an Druckgeräte sendet. (Dies könnte leicht dazu benutzt werden, einen „Denial of Service“-Angriff auf Ihre(n) Drucker zu starten, was zumindest den Verlust von einer Menge Papier und Tinte nach sich ziehen würde.) „Unbekannte“ Daten werden von CUPS als MIME-Typ application/octet-stream behandelt. Sie können zwar Daten „raw“ senden, aber der MIME-Typ für diese Daten muss einer sein, der CUPS bekannt und erlaubt ist. Die Datei /etc/cups/mime.types legt die Regeln fest, wie CUPS MIME-Typen erkennt. Die Datei /etc/cups/mime.convs entscheidet, welche Umwandlungsfilter auf welche MIME-Typen angewandt werden können.
Ursprünglich waren PPDs nur zur Verwendung mit PostScript-Druckern gedacht. Hier helfen sie dabei, gerätespezifische Befehle und Einstellungen an den RIP zu senden, der die Auftragsdatei verarbeitet. CUPS hat die Reichweite von PPDs erweitert, um auch Nicht-PS-Drucker abzudecken. Dies war nicht schwierig, da es ein standardisiertes Dateiformat ist. Auf eine gewisse Art war es auch logisch: CUPS verarbeitet PostScript und verwendet einen PostScript-RIP (Ghostscript), um die Auftragsdateien zu verarbeiten. Der einzige Unterschied ist: Ein PostScript-Drucker hat den RIP eingebaut, für die anderen Arten von Drucker läuft der Ghostscript-RIP auf dem Druck-Server.
PPDs für einen Nicht-PS-Drucker beinhalten ein paar Zeilen, die einzigartig für CUPS sind. Die wichtigste sieht ungefähr so aus:
*cupsFilter: application/vnd.cups-raster 66 rastertoprinter
Dies ist das letzte Stück im CUPS-Filter-Puzzle. Diese Zeile weist den CUPS-Daemon an, als letzten Filter rastertoprinter zu verwenden. Dieser Filter sollte als Input eine Datei vom MIME-Typ application/vnd.cups-raster serviert bekommen. Daher sollte CUPS automatisch eine Filterkette konstruieren, die als letzte Ausgabe den angegebenen MIME-Typ liefert. Diese wird dann als Input für den erwähnten Filter rastertoprinter verwendet. Nachdem der letzte Filter seine Arbeit getan hat (rastertoprinter ist ein Gimp-Print-Filter), sollte die Datei an das Backend gesendet werden, das sie anschließend an das Ausgabe-Gerät sendet.
CUPS liefert standardmäßig nur ein paar generische PPDs, aber diese können für ein paar hundert Drucker-Modelle verwendet werden. Es kann sein, dass Sie damit nicht verschiedene Papierschächte verwalten können oder dass Sie breitere Druckränder erhalten, als Ihr spezielles Modell unterstützt. Die Tabelle Mit CUPS gelieferte PPDs(((Nummerierung?))) zeigt eine Zusammenfassung.
Tabelle 19.1. Mit CUPS gelieferte PPDs
| PPD-Datei | Drucker-Typ |
|---|---|
| deskjet.ppd | ältere HP-Inkjet-Drucker und Kompatible |
| deskjet2.ppd | neuere HP-Inkjet-Drucker und Kompatible |
| dymo.ppd | Label-Drucker |
| epson9.ppd | Epson-9pin-Nadeldrucker und Kompatible |
| epson24.ppd | Epson-24pin-Nadeldrucker und Kompatible |
| okidata9.ppd | Okidata-9pin-Nadeldrucker und Kompatible |
| okidat24.ppd | Okidata-24pin-Nadeldrucker und Kompatible |
| stcolor.ppd | ältere Epson Stylus Color-Drucker |
| stcolor2.ppd | neuere Epson Stylus Color-Drucker |
| stphoto.ppd | ältere Epson Stylus Photo-Drucker |
| stphoto2.ppd | neuere Epson Stylus Photo-Drucker |
| laserjet.ppd | alle PCL-Drucker. Weiter unten finden Sie mehr über einige andere Treiber/PPD-Pakete, die für die Verwendung mit CUPS geeignet sind. |
Natives CUPS-Rastern arbeitet in zwei Schritten:
Zuerst kommt der Schritt pstoraster. Dieser verwendet das spezielle CUPS-device aus ESP Ghostscript 7.05.x als Werkzeug.
Als zweites kommt der Schritt rasterdriver. Er verwendet gerätespezifische Filter; es gibt einige Hersteller, die Filter guter Qualität für diesen Schritt zur Verfügung stellen. Manche sind freie Software, andere Shareware bzw. nicht-frei, manche proprietär.
Oft erzeugt dies bessere Qualität (und hat einige Vorteile mehr) als andere Methoden.
Eine andere Methode ist der Weg über cupsomatic/foomatic-rip. Beachten Sie, dass cupsomatic nicht von den CUPS-Leuten geschrieben wird. cupsomatic ist ein unabhängiger Beitrag zur Entwicklung des Druckens von den Leuten von Linuxprinting.org [5]. cupsomatic wird nicht mehr entwickelt, gewartet oder unterstützt. Es wurde durch foomatic-rip ersetzt. foomatic-rip ist eine komplette Neufassung der alten Idee von cupsomatic, aber sehr stark verbessert und generalisiert, um andere (Nicht-CUPS-) Spooler zu unterstützen. Ein Upgrade auf foomatic-rip wird wärmstens empfohlen, besonders wenn Sie auf eine aktuelle Version von CUPS aktualisieren.
Sowohl die Methode cupsomatic (alt) als auch die Methode foomatic-rip (neu) von Linuxprinting.org verwenden die traditionelle Ghostscript-Verarbeitung von Druckdateien, die alles in einem Schritt erledigt. Sie hängt davon ab, dass all die anderen Geräte bereits in Ghostscript eingebaut sind. Die Qualität ist so gut (oder schlecht), wie die Ghostscript-Darstellung in den anderen Spoolern ist. Der Vorteil ist, dass diese Methode viele Drucker-Modelle unterstützt, die (noch) nicht von der moderneren CUPS-Methode unterstützt werden.
Natürlich können Sie beide Methoden nebeneinander auf einem System einsetzen (und sogar auf einem Drucker, wenn Sie verschiedene Queues installieren) und herausfinden, welche am besten für Sie funktioniert.
cupsomatic „kidnappt“ die Druckdatei nach der Stufe application/vnd.cups-postscript und lenkt sie durch die CUPS-externe, systemweite Ghostscript-Installation um. Daher umgeht die Druckdatei den Filter pstoraster (und umgeht auch die CUPS-Raster-Treiber rastertosomething). Nachdem Ghostscript sein Rastern beendet hat, übergibt cupsomatic die dargestellte Datei direkt an das CUPS-Backend. Das Flussdiagramm in cupsomatic/foomatic-Verarbeitung versus natives CUPS(((Nummerierung?))) illustriert den Unterschied zwischen der nativen CUPS-Darstellung und der Foomatic/cupsomatic-Methode.
Es folgen ein paar Beispiele für gängige Filterketten, um die Funktion von CUPS zu illustrieren.
Nehmen wir an, Sie wollen eine PDF-Datei auf einem per HP JetDirect angeschlossenen PostScript-Drucker drucken, aber Sie wollen nur die Seiten 3-5, 7, 11-13 drucken, und das mit „two-up“ und „Duplex“:
Ihre Druck-Optionen (Seitenauswahl, two-up, Duplex) werden über die Befehlszeile an CUPS weitergegeben.
Die (komplette) PDF-Datei wird an CUPS gesendet und automatisch als application/pdf typisiert.
Die Datei muss daher zuerst den Vorfilter pdftops passieren, der den PostScript MIME-Typ application/postscript erzeugt (eine Vorschau an dieser Stelle würde immer noch alle Seiten des originalen PDFs zeigen).
Die Datei passiert sodann den Filter pstops, der die Befehlszeilen-Optionen anwendet: Er wählt die Seiten 3-5, 7 und 11-13, legt ein Layout mit „zwei Seiten pro Blatt“ an und fügt den korrekten Befehl für „Duplex“ (wie im PPD des Druckers definiert) in die PostScript-Datei ein; die Datei ist jetzt vom PostScript-MIME-Typ application/vnd.cups-postscript.
Die Datei geht jetzt an das socket-Backend, das den Auftrag an die Drucker weiterleitet.
Die daraus resultierende Filterkette ist in Filterkette PDF auf socket(((Abbildungsnummer?))) dargestellt.
Nehmen wir an, Sie wollen aus demselben Filter auf einen an USB angeschlossenen Epson Stylus Photo-Drucker drucken, der mit dem CUPS-PPD stphoto2.ppd installiert wurde. Die ersten paar Filter-Stufen sind fast dieselben:
Ihre Druck-Optionen (Seitenauswahl, two-up, Duplex) werden per Befehlszeile an CUPS weitergegeben.
Die (komplette) PDF-Datei wird an CUPS gesendet und automatisch als application/pdf typisiert.
Die Datei muss daher zuerst den Vorfilter pdftops passieren, der den PostScript MIME-Typ application/postscript erzeugt (eine Vorschau an dieser Stelle würde immer noch alle Seiten des originalen PDFs zeigen).
Die Datei passiert sodann den Filter pstops, der die Befehlszeilen-Optionen anwendet: Er wählt die Seiten 3-5, 7 und 11-13, legt ein Layout mit „2 Seiten pro Blatt“ an und fügt den korrekten Befehl für „Duplex“ ... (hoppla dieser Drucker und diese PPD unterstützen gar keinen Duplex-Druck also wird diese Option ignoriert) in die PostScript-Datei ein; die Datei ist jetzt vom PostScript-MIME-Typ application/vnd.cups-postscript.
Die Datei passiert jetzt die Filter-Stufe pstoraster und wird zum MIME-Typ application/cups-raster.
Zuletzt tut der Filter rastertoepson seine Arbeit (wie in der PPD des Druckers angezeigt), legt die drucker-spezifischen Rasterdaten an und bettet alle vom Benutzer gewählten Druck-Optionen in die Druckdaten ein.
Die Datei geht an das Backend usb, das es an die Drucker weiterleitet.
Die daraus resultierende Filterkette ist in diesem Bild(((Abbildungsnummer))) dargestellt.
Im Internet finden Sie viele tausend CUPS-PPD-Dateien (mit ihren begleitenden Filtern) in vielen Landessprachen und mit Unterstützung für über tausend Nicht-PostScript-Modelle.
ESP PrintPro (kommerziell, nicht frei) wird mit mehr als 3000 PPDs gebündelt. Sie können es „out of the box“ auf Linux, Mac OS X, IBM-AIX, HP-UX, Sun-Solaris, SGI-IRIX, Compaq Tru64, Digital UNIX und noch einigen kommerziellen UNIX-Versionen verwenden. (Es wurde von den CUPS-Entwicklern selbst geschrieben und sein Verkauf hilft niht nur dabei, die weitere Entwicklung von CUPS zu finanzieren, sondern ernährt auch dessen Schöpfer.)
Das Gimp-Print-Project (GPL, freie Software) bietet ungefähr 140 PPDs (mit Unterstützung von fast 400 Druckern, viele davon bis zu Foto-Qualität), die neben den Gimp-Print-CUPS-Filtern genutzt werden können.
TurboPrint (Shareware, nicht frei) unterstützt ungefähr dieselbe Anzahl von Druckern in exzellenter Qualität.
OMNI (LPGL, frei) ist ein Package von IBM, das mittlerweile Unterstützung für mehr als 400 Drucker enthält. Es stammt aus dem Erbe des IBM OS/2-Know-how, das auf Linux portiert wurde (die CUPS-Unterstützung ist derzeit im Beta-Stadium).
HPIJS (BSD-artige Lizenz, frei) unterstützt ungefähr 150 Drucker von HP und bietet nun auch exzellente Druckqualität (derzeit nur über den Foomatic-Pfad verfügbar).
Foomatic/cupsomatic (LPGL, frei) von Linuxprinting.org bietet PPDs für praktisch jeden auf der Welt bekannten Ghostscript-Filter (einschließlich Omni, Gimp-Print und HPIJS).
CUPS unterstützt auch die Verwendung von „interface scripts“, wie man sie von System V-AT&T-Drucksystemen kennt. Diese werden oft für PCL-Drucker verwendet, und zwar von Anwendungen, die PCL-Druckaufträge erzeugen. Interface scripts sind für einzelne Drucker-Modelle spezifisch. Sie haben eine ähnliche Rolle wie PPDs für PostScript-Drucker. Interface scripts können die benötigten Escape-Sequenzen in den Druck-Datenstrom einfügen, wenn der Benutzer einen bestimmten Papierschacht gewählt hat, oder Landscape-Druck oder A3-Papier etc. Interface scripts sind in der Linux-Welt praktisch unbekannt. Auf HP-UX-Plattformen werden sie öfter verwendet. Sie können jedes funktionierende interface script auch mit CUPS verwenden. Installieren Sie einfach den Drucker mit der Option -i:
root# lpadmin -p pclprinter -v socket://11.12.13.14:9100 \ -i /path/to/interface-script
Interface scripts sind vielleicht eine „unbekannte Größe“ für viele. Nichtsdestotrotz bieten sie mit CUPS den einfachsten Weg, Ihr eigenes selbst geschriebenes Filter-Skript oder -Programm in eine bestimmte Drucker-Queue einzufügen (einige Informationen über die herkömmliche Verwendung von interface scripts können Sie unter http://playground.sun.com/printing/documentation/interface.html finden.
Netzwerk-Druck umfasst ein weites Feld. Um zu verstehen, was genau mit Samba passiert, wenn es im Auftrag seiner Windows-Clients druckt, lassen Sie uns zuerst einen Blick auf ein „reines Windows“-Setup werfen: Windows-Clients mit einem Windows NT Druck-Server.
Windows-Clients, die auf einen NT-basierenden Druck-Server drucken, haben zwei Möglichkeiten. Sie können:
den Treiber lokal ausführen und die GDI-Ausgabe (EMF) selbst im druckerspezifischen Format darstellen.
die GDI-Ausgabe (EMF) an den Server senden, wo der Treiber ausgeführt wird, um die druckerspezifische Ausgabe darzustellen.
Die beiden Druck-Möglichkeiten werden in den Flussdiagrammen Treiberausführung auf dem Client und Treiberausführung auf dem Server gezeigt.
Im ersten Fall muss der Druck-Server die Datei als raw behandeln. Das bedeutet, er sollte die Auftragsdatei nicht anrühren oder in irgendeiner Art zu konvertieren versuchen. Dies ist, was ein herkömmlicher UNIX-basierender Druck-Server auch tun kann, und das bei besserer Performance und stabiler als ein NT-Druck-Server. Damit sind wohl die meisten Samba-Administratoren vertraut. Ein Vorteil dieses Setups ist, dass dieser „spooling-only“-Druck-Server sogar verwendet werden kann, wenn kein(e) Treiber für UNIX verfügbar sind. Es genügt, die Windows-Treiber zur Verfügung und auf den Clients installiert zu haben.
Der andere Pfad führt den Druckertreiber auf dem Server aus. Der Client übermittelt Druckdateien im EMF-Format an den Server. Der Server verwendet den PostScript-, PCL-, ESC/P- oder einen anderen Treiber, um die EMF-Datei in die druckerspezifische Sprache zu konvertieren. Es ist UNIX nicht möglich, dasselbe zu tun. Derzeit gibt es kein Programm und keine Methode, um die GDI-Ausgabe eines Windows-Clients auf einem UNIX-Server auf etwas umzuwandeln, das ein Drucker verstehen könnte.
Jedoch ist etwas Ähnliches mit CUPS möglich. Lesen Sie weiter.
Da UNIX-Server den Win32-Programmcode NICHT auf ihrer Plattform ausführen können, ist die Sache etwas anders. Dies schränkt jedoch Ihre Möglichkeiten nicht allzu sehr ein. Im Gegenteil, Sie haben hier die Möglichkeit, Druckoptionen zu implementieren, die anderswo nicht möglich sind.
Hier ist ein einfaches Rezept, das zeigt, wie Sie zum Nutzen Ihrer druckenden Windows-Clients Vorteile aus den mächtigen Eigenschaften von CUPS ziehen:
Lassen Sie die Windows-Clients PostScript an den CUPS-Server senden.
Lassen Sie den CUPS-Server das PostScript in ein gerätespezifisches Format wandeln.
Dies erfordert, dass die Clients einen PostScript-Treiber verwenden (sogar, wenn der Drucker kein PostScript-Modell ist). Es erfordert auch, dass Sie einen Treiber auf dem CUPS-Server haben.
Um CUPS-basierendes Drucken per Samba zu aktivieren, sollten zunächst folgende Optionen im Abschitt [global] Ihrer Datei smb.conf gesetzt werden:
| printing = cups |
| printcap = cups |
Wenn diese Parameter angegeben werden, werden alle manuell gesetzten Druck-Anweisungen (wie print command oder lppause command) in smb.conf (genauso wie in Samba selbst) ignoriert. Stattdessen arbeitet Samba direkt mit CUPS zusammen. Dazu verwendet es dessen „application program interface“ (API), sofern Samba mit Unterstützung der CUPS-Bibliothek (libcups) kompiliert wurde. Wenn Samba nicht mit CUPS-Unterstützung kompiliert wurde und wenn keine anderen Druckbefehle gesetzt sind, wird der Druck den System V-AT&T-Befehlssatz mit der automatisch gesetzten Option „-oraw“ verwenden, womit Druckaufträge einfach weitergegeben werden. (Wenn Sie Ihre selbst definierten Druckbefehle mit einem Samba-Server verwenden wollen, der CUPS-Unterstützung einkompiliert hat, verwenden Sie einfach printing = sysv.)
Samba muss sein eigenes Spooling-Verzeichnis verwenden. (Es wird mit einer Zeile wie path = /var/spool/samba im Abschnitt [printers] oder [printername] von smb.conf gesetzt.) Samba empfängt den Auftrag in seinem eigenen Spooling-Verzeichnis und leitet ihn in das Spooling-Verzeichnis von CUPS weiter. (Das CUPS-Spooling-Verzeichnis wird mit der Anweisung RequestRoot in einer Zeile gesetzt, die per Voreinstellung RequestRoot /var/spool/cups lautet). CUPS prüft die Zugriffsrechte und setzt diese bei jdem Neustart auf vernünftige Werte. Wir haben schon ziemlich viele Leute gesehen, die ein gemeinsames Spooling-Verzeichnis verwendet haben und wochenlang mit diesem „Problem“ zu kämpfen hatten.
Ein Windows-Benutzer authentifiziert sich nur gegenüber Samba (mittels dessen, was konfiguriert wurde). Wenn Samba auf demselben Host wie CUPS läuft, brauchen Sie nur dem Rechner „localhost“ das Drucken zu erlauben. Wenn Samba und CUPS auf verschiedenen Maschinen laufen, müssen Sie sicherstellen, dass der Samba-Host Zugriff auf das Drucken auf CUPS hat.
Dieser Abschnitt behandelt die Verwendung von CUPS-Filtern auf der Server-Konfiguration, in der Clients einen PostScript-Treiber mit CUPS-PPDs verwenden.
PPDs können alle Optionen des Drucker-Geräts kontrollieren. Sie werden üblicherweise vom Hersteller bereitgestellt, wenn Sie einen PostScript-Drucker besitzen. PPD-Dateien (PostScript Printer Descriptions) sind immer Bestandteil der Druckertreiber auf MS Windows- oder Apple Mac OS-Systemen. Es sind ASCII-Dateien, die vom Benutzer wählbare Druckoptionen sowie deren Zuweisung auf die enstprechenden PostScript-, PCL- oder PJL-Befehle für das Ziel-Gerät enthalten. Die GUI-Dialoge der Druckertreiber übersetzen diese Optionen „on-the-fly“ in Schaltflächen und Auswahllisten, um dem Benutzer eine Auswahl anzubieten.
CUPS kann ohne jede Umwandlung PPD-Dateien von jedem Windows-PS-Treiber (NT wird empfohlen) und dessen Optionen verarbeiten. Es gibt ein Web-Interface zu den Druck-Optionen (gehen Sie auf http://localhost:631/printers/, und klicken Sie auf eine -Schaltfläche) oder ein Befehlszeilen-Interface (sehen Sie dazu man lpoptions, oder prüfen Sie, ob Sie lphelp auf Ihrem System haben). Es gibt auch ein paar verschiedene GUI-Frontends für Linux/UNIX, die PPD-Optionen darstellen können. PPD-Optionen sind normalerweise zur Interpretation durch den PostScript-RIP auf dem PostScript-Drucker gedacht.
CUPS beschränkt sich in seiner Verwendung von PPDs nicht auf „wirkliche“ PostScript-Drucker. Die CUPS-Entwickler haben die Reichweite des PPD-Konzepts erweitert, um auch verfügbare Geräte- und Treiber-Optionen von Nicht-PS-Druckern durch CUPS-PPDs zu beschreiben.
Dies ist nur logisch, da CUPS einen voll ausgestatteten PostScript Interpreter (RIP) umfasst. Dieser RIP basiert auf Ghostscript. Er kann alles empfangene PostScript (und zusätzlich viele weitere Dateiformate) verarbeiten. Alle CUPS-PPDs für Nicht-PS-Drucker enthalten eine zusätzliche Zeile, die mit dem Schlüsselwort *cupsFilter beginnt. Diese Zeile teilt dem CUPS-Druck-System mit, welcher druckerspezifische Filter zur Interpretation der PostScript-Daten verwendet werden soll. Daher lässt CUPS alle seine Drucker für die Clients als PostScript-Drucker erscheinen, weil es als PostScript-RIP für diese Drucker arbeiten kann.
CUPS-PPDs können auch auf Windows-Clients verwendet werden, auf dem „Rücken“ eines „core“-PostScript-Treibers (derzeit wird der „CUPS PostScript Driver for Windows NT/200x/XP“ empfohlen; Sie können auch den von Adobe verwenden, allerdings mit Einschränkungen). Dieses Feature ermöglicht es CUPS, einige Tricks zu beherrschen, die kein anderer Spooler kann:
Das Arbeiten als ein vernetzter PostScript RIP-(Raster Image Processor), der Druckdateien von allen Client-Plattformen in einer einheitlichen Weise handhabt.
Das Arbeiten als zentraler Ab- und Verrechnungsserver, da alle Dateien durch den pstops-Filter laufen und daher in der CUPS-Datei page_log protokolliert werden. Anmerkung: Dies kann nicht für „raw“-Druckaufträge erfolgen, da diese ja per definitionem ungefiltert bleiben.
Das Ermöglichen einer Einigung und Festlegung eines einzelnen PostScript-Treibers für die Clients, sogar für viele verschiedene Ziel-Drucker.
Die Verwendung von CUPS-PPDs auf Windows-Clients ermöglicht es diesen, alle Druckauftragseinstellungen so zu kontrollieren, wie es ein UNIX-Client kann.
Dieses Setup wird für diejenigen interessant sein, die große Probleme in WTS-Umgebungen haben. In WTS muss oft eine Vielzahl von Nicht-PS-Treibern installiert sein, um die Vielfalt der verschiedenen Druckermodelle der Clients zu unterstützen. Dies bringt oft eine stark erhöhte Instabilität mit sich.
In Windows NT bringen Drucker-Treiber, die im „Kernel-Modus“ laufen, ein hohes Risiko für die Stabilität des Systems mit sich, wenn der Treiber nicht wirklich stabil und gut getestet ist. Und es gibt eine Menge schlechte Treiber! Speziell berüchtigt ist das Beispiel des PCL-Drucker-Treibers, der ein zusätzliches Sound-Modul ausführte, das die Benutzer via Soundkarte über ihre abgeschlossenen Druckaufträge informierte. Muss ich wirklich erwähnen, dass dies genauso verlässlich „blue screens of death“ verursachte?
PostScript-Treiber sind im Allgemeinen gut getestet. Sie sind nicht dafür bekannt, irgendwelche Probleme zu verursachen, sogar obwohl sie auch im Kernel-Modus ausgeführt werden. Das kann daher kommen, dass es bislang nur zwei verschiedene PostScript-Treiber gab: die von Adobe und den von Microsoft. Beide sind gut getestet und so stabil, wie es unter Windows eben geht. Der CUPS-Treiber ist von dem MS-Treiber abgeleitet.
In vielen Fällen haben Administratoren in dem Bestreben, dieses Problem zu umgehen, die erlaubten Druckertreiber auf ihrem WTS auf einen generischen PCL- und einen PostScript-Treiber beschränkt. Dies schränkt jedoch die Clients im Umfang der ihnen zur Verfügung stehenden Druckoptionen ein. Oft bekommen Sie nicht mehr als Simplex-Druck aus einem Standard-Papierschacht, während Ihre Geräte bei weitem mehr könnten, wenn sie von einem besseren Treiber angesteuert würden!
Das Verwenden eines Postscript-Treibers, der mit einem CUPS-PPD aktiviert wurde, scheint eine sehr elegante Art zu sein, all diese Mängel zu überbrücken. Es gibt, je nach der von Ihnen verwendeten Windows-Version, bis zu drei verschiedene verfügbare Postscript-Treiber: Adobe, Microsoft und CUPS-Postscript-Treiber. Keiner der drei ist bekannt dafür, größere Instabilitäten auf WTS zu verursachen (auch nicht, wenn viele verschiedene PPDs verwendet werden). Die Clients werden (wieder) imstande dazu sein, Papierschächte auszuwählen, Duplexdruck und andere Einstellungen auszuführen. Dies hat jedoch auch seinen Preis: Ein CUPS-Server, der als PostScript-RIP für seine Clients arbeitet, erfordert mehr CPU und RAM, als wenn er nur als „raw spooling“-Server arbeitet. Außerdem ist dieses Setup noch nicht ausführlich getestet, wobei die ersten Rückmeldungen sehr vielversprechend aussehen.
Aktuellere Drucker-Treiber unter W200x und XP laufen nicht mehr im Kernel-Modus (anders als unter Windows NT). Beide Betriebssysteme können jedoch die NT-Treiber verwenden, die im Kernel-Modus laufen. (Sie können grob bestimmen, welcher Treiber zu welchem System gehört, da die Treiber im Unterverzeichnis „2“ des Verzeichnisses „W32X86“ die „alten“ sind.) Wie zuvor gesagt wurde, sind weder die Adobe-Treiber noch die von MS dafür bekannt, irgendwelche Stabilitätsprobleme zu verursachen. Der CUPS-Treiber wurde vom MS-Treiber abgeleitet. Es gibt einen einfachen Grund dafür: Das MS DDK (Device Development Kit) für Windows NT (das für Lizenznehmer von Visual Studio ohne Kosten verfügbar war) beinhaltet den Quelltext des MS-Treibers, und die Lizenznehmer von Visual Studio dürfen diesen verwenden und ihn für eigene Treiber-Entwicklungen modifizieren. Das haben die CUPS-Entwickler getan. Die Lizenz erlaubt ihnen nicht, den gesamten Quelltext zu veröffentlichen, sie haben jedoch das „diff“ unter der GPL veröffentlicht, und wenn Sie Besitzer eines „MS DDK for Windows NT“ sind, können Sie den Treiber selbst prüfen.
Wie wir zuvor erwähnt haben, funktionieren alle bekannten Methoden, um Client-Drucker-Treiber auf dem Samba-Server vorzubereiten (und damit die Vorzüge von Point'n'Print zu genießen), auch mit CUPS. Diese Methoden wurden im vorigen Kapitel beschrieben. In Wirklichkeit ist dies eine reine Samba-Angelegenheit und hängt nur mit dem Verhältnis Samba/Windows-Client zusammen.
Das Werkzeug cupsaddsmb (das mit allen aktuellen CUPS-Versionen ausgeliefert wird) ist eine alternative Methode, um Druckertreiber in die Samba-Freigabe [print$] zu transferieren. Zur Erinnerung: Diese Freigabe ist der Ort, an dem Clients nach hinterlegten und konfigurierten Treibern suchen, um diese herunterzuladen und zu installieren. Dies macht das Verteilen von jeglichen (oder allen) installierten CUPS-Druckern ziemlich einfach. cupsaddsmb kann den Adobe PostScript-Treiber genauso verwenden wie den neu entwickelten CUPS-PostScript-Treiber für Windows NT/200x/XP. cupsaddsmb funktioniert NICHT mit beliebigen Druckertreibern, sondern nur mit exakt den Treiber-Dateien, die in seiner Manpage angegeben sind.
Der CUPS-Druckertreiber ist auf der CUPS-Download-Seite verfügbar. Sein Paketname ist cups-samba-[version].tar.gz. Er wird den Adobe-Treibern vorgezogen, da er einige Vorteile hat:
Er unterstützt eine genauere Seiten-Abrechnung.
Er unterstützt Banner-Seiten und Seiten-Labels auf allen Druckern.
Er unterstützt das Setzen von einigen IPP-Auftragsattributen (wie Auftragspriorität, Seiten-Label und Auftragsverrechnung).
Derzeit werden jedoch nur Windows NT, 2000 und XP von den CUPS-Treibern unterstützt. Sie brauchen auch die entsprechenden Teile des Adobe-Treibers, wenn Sie Windows 95-, 98- und ME-Clients unterstützen müssen.
Vor dem Ausführen von cupsaddsmb müssen Sie die Einstellungen in smb.conf wie im nächsten Beispiel setzen:
Beispiel 19.3. smb.conf für die Verwendung von cupsaddsmb
CUPS-Anwender können die genau gleichen Pakete von http://www.cups.org/software.html beziehen. Dies ist ein separates Paket von CUPS-Software-Dateien, das als „CUPS 5.0rc3 Windows NT/200x/XP Printer Driver for Samba“ bezeichnet wird. Der Dateiname für den Download ist cups-samba-5.0rc3.tar.gz. Nach dem untar und unzip zeigen sich folgende Dateien:
root# tar xvzf cups-samba-5.0rc3.tar.gz cups-samba.install cups-samba.license cups-samba.readme cups-samba.remove cups-samba.ss
Diese Dateien wurden mit der ESP-Meta-Packer-Software EPM gepackt. Die Dateien *.install und *.remove sind einfache Shell-Skripten, die die Datei *.ss entpacken (die Datei *.ss ist nichts als ein tar-Archiv, das auch mit „tar“ entpackt werden kann). Dann kopiert sie deren Inhalt in /usr/share/cups/drivers/. Dieser Inhalt enthält drei Dateien:
root# tar tv cups-samba.ss cupsdrvr.dll cupsui.dll cups.hlp
Das Shell-Skript cups-samba.install ist einfach anzuwenden:
root# ./cups-samba.install [....] Installing software... Updating file permissions... Running post-install commands... Installation is complete.
Das Skript sollte die Treiber-Dateien automatisch ins Verzeichnis /usr/share/cups/drivers/ kopieren.
Wegen eines Fehlers kopiert eine ältere CUPS-Release die Datei cups.hlp ins Verzeichnis /usr/share/drivers/ statt in /usr/share/cups/drivers/. Um dieses Problem zu beheben, kopieren/verschieben Sie diese Datei einfach manuell ins richtige Verzeichnis, nachdem Sie das Install-Skript ausgeführt haben.
root# cp /usr/share/drivers/cups.hlp /usr/share/cups/drivers/
Dieser neue CUPS-PostScript-Treiber ist derzeit nur binär verfügbar, ist aber kostenlos. Es wird (noch) kein vollständiger Quelltext zur Verfügung gestellt. Der Grund ist, dass er mit Hilfe des Microsoft Driver Developer Kits (DDK) entwickelt und mit Microsoft Visual Studio 6 kompiliert wurde. Die Treiber-Entwickler dürfen nicht den gesamten Quelltext als freie Software vertreiben. Die CUPS-Entwickler haben jedoch das „diff“ unter der GPL veröffentlicht, somit kann jeder mit einer Lizenz für Visual Studio und einem DDK den Treiber selbst kompilieren.
Die CUPS-Treiber unterstützen die älteren Systeme Windows 95/98/Me nicht, nur die Client-Systeme Windows NT/2000/XP.
Windows NT, 2000 und XP werden unterstützt von:
Adobe-Treiber sind für die älteren Systeme Windows 95/98/Me genauso verfügbar wie für Windows NT/2000/XP. Die Dateien sind für die einzelnen Plattformen verschieden.
Windows 95, 98 und ME werden unterstützt von:
Windows NT, 2000 und XP werden unterstützt von:
Wenn sowohl die Adobe-Treiber-Dateien als auch die CUPS-Treiber-Dateien zur Unterstützung von Windows NT/200x/XP vorhanden sind, werden die Adobe-Dateien ignoriert und die CUPS-Dateien verwendet. Wenn Sie aus irgendeinem Grund nur Adobe-Treiber verwenden wollen, entfernen Sie einfach die drei CUPS-Dateien. Windows 9x/Me-Clients verwenden in jedem Fall die Adobe-Treiber.
Das Beschaffen der Adobe-Treiber-Dateien scheint für viele Anwender unerwartet schwierig zu sein. Sie sind nicht als einzelne Dateien auf der Adobe-Website erhältlich, und die selbstentpackende und/oder selbstinstallierende Windows-.exe-Datei ist auch nicht einfach zu finden. Möglicherweise müssen Sie den enthaltenen Installer verwenden und die Installation einmal auf einem Client durchführen. Dies installiert die Treiber (und einen generischen PostScript-Drucker) lokal auf dem Client. Wenn diese installiert sind, geben Sie den generischen PostScript-Drucker frei. Danach enthält die Freigabe [print$] des Clients die Adobe-Dateien, von wo aus Sie sie mittels smbclient auf den CUPS-Host holen können.
Die Anwender der Software ESP Print Pro können ihr Samba-Treiber-Paket für diesen Zweck ohne Probleme installieren. Beziehen Sie die Treiber-Dateien aus dem normalen Download-Bereich der ESP Print Pro-Software unter http://www.easysw.com/software.html. Sie müssen den Link namens „SAMBA“ unter Download Printer Drivers for ESP Print Pro 4.x finden und das Package herunterladen. Sobald es instaliert ist, können Sie jeden Treiber vorbereiten, indem Sie einfach den Drucker im Drucker-Manager-GUI markieren und die Funktion Export Driver... aus dem Menü wählen. Natürlich müssen Sie Samba zuerst für den Umgang mit den Treiber-Dateien vorbereitet haben, also die Freigabe [print$] angelegt haben und so weiter. Das Paket ESP Print Pro beinhaltet die CUPS-Treiber-Dateien genauso wie ein (lizenziertes) Set von Adobe-Treibern für die Windows 95/98/Me-Client-Familie.
Sobald Sie das Install-Skript ausgeführt haben (und eventuell die Datei cups.hlp manuell nach /usr/share/cups/drivers/ verschoben haben), kann der Treiber in die Samba-Freigabe [print$] gelegt werden (die oft auf das Verzeichnis /etc/samba/drivers/ zeigt und einen Unterverzeichnis-Baum mit den Verzeichnissen WIN40 und W32X86 enthält). Sie tun dies, indem Sie cupsaddsmb ausführen (sehen Sie dazu auch man cupsaddsmb, für alle CUPS-Releases seit 1.1.16).
Es kann sein, dass Sie root in die Datei smbpasswd aufnehmen müssen, indem Sie smbpasswd ausführen; dies ist besonders wichtig, wenn Sie diese ganze Prozedur zum ersten Mal ausführen und nicht in einer Umgebung arbeiten, in der alles für Single Sign On an einem Windows-Domänencontroller konfiguriert ist.
Sobald die Treiber-Dateien in der Freigabe [print$] liegen und initialisiert sind, können sie von den Windows NT/200x/XP Clients heruntergeladen und installiert werden.
Win 9x/Me-Clients funktionieren nicht mit dem CUPS-PostScript-Treiber. Für diese Clients brauchen Sie nach wie vor die ADOBE*.*-Treiber, wie oben erwähnt.
Es macht nichts, wenn Sie immer noch die ADOBE*.*-Treiber-Dateien aus älteren Installationen im Verzeichnis /usr/share/cups/drivers/ liegen haben. Das neue cupsaddsmb (ab 1.1.16) bevorzugt automatisch die eigenen Treiber, wenn es beide vorfindet.
Sollten Ihre Windows-Clients die alten ADOBE*.*-Treiber-Dateien installiert haben, wird der Download des neuen CUPS-PostScript-Treibers zuerst scheitern. Sie müssen den alten Treiber zuerst von den Clients löschen. Es reicht nicht aus, den Drucker zu „löschen“, da die Treiber-Dateien nach wie vor von den Clients bereitgestellt und wiederverwendet werden, wenn Sie versuchen, den Drucker neu zu installieren. Um die Adobe-Treiber auf den Clients völlig loszuwerden, öffnen Sie den Ordner Drucker (evtl. via Start > Systemsteuerung > Drucker und Faxgeräte), klicken mit der rechten Maustaste auf den Ordner-Hintergrund und wählen . Wenn sich der neue Dialog öffnet, wählen Sie den Reiter Treiber. In der Liste wählen Sie den Treiber, den Sie löschen wollen, und klicken auf Entfernen. Dies funktioniert nur, wenn kein einziger Drucker mehr übrig ist, der diesen Treiber verwendet. Sie müssen zuerst alle Drucker im Ordner Drucker „löschen“, die diesen Treiber verwenden. Sie brauchen Administrator-Rechte, um dies zu tun.
Sobald Sie erfolgreich den CUPS-PostScript-Treiber auf einen Client geladen haben, können Sie leicht alle Drucker auf diesen Treiber umstellen, indem Sie so vorgehen, wie im Abschnitt Classical Printing Support beschrieben. Entweder ändern Sie den Treiber für einen vorhandenen Drucker, indem Sie den Dialog Drucker-Eigenschaften verwenden, oder Sie benutzen den Befehl rpcclient mit der Option setdriver.
Interessiert Sie ein Vergleich des CUPS- und des Adobe-Treibers? Für unsere Zwecke sind dies die wichtigsten Punkte, die für den CUPS-Treiber sprechen:
Es gibt keine Probleme mit der Adobe-EULA.
es gibt keine Probleme mit der Frage „Wo kriege ich die Adobe-Treiber-Dateien her? “
Die Adobe-Treiber fügen (auf Anfrage der zugeordneten PPD-Datei) oft einen PJL-Header vor dem Haupt-PS-Teil der Druck-Datei ein. Daher beginnt die Druck-Datei mit <1B >%-12345X oder <escape>%-12345X anstatt mit %!PS. Das führt dazu, dass der CUPS-Daemon die eintreffende Datei automatisch als druckfertig kennzeichnet und sie nicht durch den Filter pstops schickt (technisch ausgedrückt, wird die Datei nicht als der generische MIME-Typ application/postscript, sondern als MIME-Typ application/cups.vnd-postscript eingestuft). Das führt auch dazu, dass die Seitenzählung in /var/log/cups/page_log nicht die exakte Seitenanzahl erhält; stattdessen wird die Dummy-Seitenzahl „1“ in einem Standard-Setup protokolliert.
Der Adobe-Treiber hat mehr Optionen, um das von ihm generierte PostScript falsch zu konfigurieren (z.B. kann er es versehentlich auf Optimize for Speed anstatt auf Optimize for Portability setzen, was dazu führen kann, dass CUPS es nicht mehr verarbeiten kann).
Die Ausgabe des CUPS-PostScript-Treibers, die von Windows-Clients an den CUPS-Server gesendet wird, wird garantiert als generischer MIME-Typ application/postscript typisiert und daher auch zuverlässig durch den Filter pstops geschickt, was für Abrechnungs- und Quota-Zwecke die korrekte Seitenzahl in page_log ergibt.
Der CUPS-PostScript-Treiber unterstützt das Senden von zusätzlichen Standard-Druckoptionen (IPP) durch Windows NT/200x/XP-Clients. Solche zusätzlichen Druckoptionen sind: das Benennen der Standard-CUPS-Banner-Seiten (oder der benutzerdefinierten, sollten sie zum Zeitpunkt des Treiber-Downloads installiert sein) unter Verwendung der CUPS-Option page-label, das Setzen einer Auftragspriorität und das Setzen einer Ausführungszeit des Drucks (mit der Option, dass zukünftig noch weitere IPP-Auftragsattribute unterstützt werden).
Der CUPS-PostScript-Treiber unterstützt das Einschließen von neuen *cupsJobTicket-Parametern am Anfang der PostScript-Datei (die in Zukunft für alle möglichen nützlichen Erweiterungen auf CUPS-Seite verwendet werden können, aber keinerlei andere Anwendungen stören werden, da diese sie einfach als Kommentar betrachten und ignorieren werden).
Der CUPS-PostScript-Treiber wird das Herzstück des voll ausgewachsenen CUPS-IPP-Clients für Windows NT/200x/XP sein, der bald veröffentlicht werden soll (möglicherweise parallel zur ersten Beta-Release von CUPS 1.2).
Der Befehl cupsaddsmb kopiert die benötigten Dateien in Ihre Freigabe [print$]. Zusätzlich wird das mit dem Drucker assoziierte PPD von /etc/cups/ppd/ in [print$] kopiert. Dort warten diese Dateien auf praktische Windows-Client-Installationen via Point'n'Print. Bevor wir den Befehl erfolgreich ausführen können, müssen wir sicher sein, dass wir uns am Samba-Server authentifizieren können. Wenn Sie ein kleines Netzwerk haben, verwenden Sie möglicherweise User-level-Sicherheit (security = user).
Hier ein Beispiel für ein erfolgreich ausgeführtes cupsaddsmb:
root# cupsaddsmb -U root infotec_IS2027 Password for root required to access localhost via Samba: ['secret']
Um alle Drucker und Treiber freizugeben, verwenden Sie den Parameter -a anstatt des Drucker-Namens. Da cupsaddsmb die Druckertreiber an Samba „exportiert“, sollte es offensichlich sein, dass es nur für Queues funktioniert, mit denen ein CUPS-Treiber assoziiert ist.
Vielleicht wollen Sie ja sehen, was passiert. Verwenden Sie den Parameter -v, um einen vollständigeren Report über das Geschehene zu erhalten. Das folgende Beispiel wurde zwecks besserer Lesbarkeit editiert; alle „\“ an den Zeilenenden zeigen an, dass ich einen zusätzlichen Zeilenumbruch samt Einrückung hinzugefügt habe:
Sie werden das root-Passwort für das Samba-Konto am Bildschirm angezeigt bekommen.
root# cupsaddsmb -U root -v infotec_2105
Password for root required to access localhost via GANDALF:
Running command: smbclient //localhost/print\$ -N -U'root%secret' \
-c 'mkdir W32X86; \
put /var/spool/cups/tmp/3e98bf2d333b5 W32X86/infotec_2105.ppd; \
put /usr/share/cups/drivers/cupsdrvr.dll W32X86/cupsdrvr.dll; \
put /usr/share/cups/drivers/cupsui.dll W32X86/cupsui.dll; \
put /usr/share/cups/drivers/cups.hlp W32X86/cups.hlp'
added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0
Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]
NT_STATUS_OBJECT_NAME_COLLISION making remote directory \W32X86
putting file /var/spool/cups/tmp/3e98bf2d333b5 as \W32X86/infotec_2105.ppd
putting file /usr/share/cups/drivers/cupsdrvr.dll as \W32X86/cupsdrvr.dll
putting file /usr/share/cups/drivers/cupsui.dll as \W32X86/cupsui.dll
putting file /usr/share/cups/drivers/cups.hlp as \W32X86/cups.hlp
Running command: rpcclient localhost -N -U'root%secret'
-c 'adddriver „Windows NT x86“ \
„infotec_2105:cupsdrvr.dll:infotec_2105.ppd:cupsui.dll:cups.hlp:NULL: \
RAW:NULL“'
cmd = adddriver „Windows NT x86“ \
„infotec_2105:cupsdrvr.dll:infotec_2105.ppd:cupsui.dll:cups.hlp:NULL: \
RAW:NULL“
Printer Driver infotec_2105 successfully installed.
Running command: smbclient //localhost/print\$ -N -U'root%secret' \
-c 'mkdir WIN40; \
put /var/spool/cups/tmp/3e98bf2d333b5 WIN40/infotec_2105.PPD; \
put /usr/share/cups/drivers/ADFONTS.MFM WIN40/ADFONTS.MFM; \
put /usr/share/cups/drivers/ADOBEPS4.DRV WIN40/ADOBEPS4.DRV; \
put /usr/share/cups/drivers/ADOBEPS4.HLP WIN40/ADOBEPS4.HLP; \
put /usr/share/cups/drivers/DEFPRTR2.PPD WIN40/DEFPRTR2.PPD; \
put /usr/share/cups/drivers/ICONLIB.DLL WIN40/ICONLIB.DLL; \
put /usr/share/cups/drivers/PSMON.DLL WIN40/PSMON.DLL;'
added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0
Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]
NT_STATUS_OBJECT_NAME_COLLISION making remote directory \WIN40
putting file /var/spool/cups/tmp/3e98bf2d333b5 as \WIN40/infotec_2105.PPD
putting file /usr/share/cups/drivers/ADFONTS.MFM as \WIN40/ADFONTS.MFM
putting file /usr/share/cups/drivers/ADOBEPS4.DRV as \WIN40/ADOBEPS4.DRV
putting file /usr/share/cups/drivers/ADOBEPS4.HLP as \WIN40/ADOBEPS4.HLP
putting file /usr/share/cups/drivers/DEFPRTR2.PPD as \WIN40/DEFPRTR2.PPD
putting file /usr/share/cups/drivers/ICONLIB.DLL as \WIN40/ICONLIB.DLL
putting file /usr/share/cups/drivers/PSMON.DLL as \WIN40/PSMON.DLL
Running command: rpcclient localhost -N -U'root%secret' \
-c 'adddriver „Windows 4.0“ \
„infotec_2105:ADOBEPS4.DRV:infotec_2105.PPD:NULL:ADOBEPS4.HLP: \
PSMON.DLL:RAW:ADOBEPS4.DRV,infotec_2105.PPD,ADOBEPS4.HLP,PSMON.DLL, \
ADFONTS.MFM,DEFPRTR2.PPD,ICONLIB.DLL“'
cmd = adddriver „Windows 4.0“ „infotec_2105:ADOBEPS4.DRV:\
infotec_2105.PPD:NULL:ADOBEPS4.HLP:PSMON.DLL:RAW:ADOBEPS4.DRV,\
infotec_2105.PPD,ADOBEPS4.HLP,PSMON.DLL,ADFONTS.MFM,DEFPRTR2.PPD,\
ICONLIB.DLL“
Printer Driver infotec_2105 successfully installed.
Running command: rpcclient localhost -N -U'root%secret' \
-c 'setdriver infotec_2105 infotec_2105'
cmd = setdriver infotec_2105 infotec_2105
Successfully set infotec_2105 to driver infotec_2105.
Wenn Sie genau hinsehen, werden Sie entdecken, dass Ihr root-Passwort unverschlüsselt übers Netz übertragen wurde, also geben Sie Acht! Wenn Sie weiterlesen, entdecken Sie Fehlermeldungen wie NT_STATUS_OBJECT_NAME_COLLISION . Diese treten auf, weil die Verzeichnisse WIN40 und W32X86 bereits in der Freigabe [print$] existiert haben (von einer früheren Treiber-Installation). Diese Meldungen sind in diesem Zusammenhang harmlos.
Was ist passiert? Was hat cupsaddsmb gemacht? Es gibt fünf Stufen in dieser Prozedur:
Rufe den CUPS-Server via IPP, und frage die Treiber-Dateien und die PPD-Datei für den angegebenen Drucker ab.
Speichere die Dateien temporär im lokalen TEMPDIR (wie in cupsd.conf angegeben).
Verbinde dich mittels smbclient mit der Freigabe [print$] auf dem Samba-Server, und kopiere die Dateien in das dortige Unterverzeichnis WIN40/ (für Windows 9x/Me) bzw. W32X86/ (für Windows NT/200x/XP).
Verbinde dich via rpcclient mit dem Samba-Server, und führe den Befehl adddriver mit den korrekten Parametern aus.
Verbinde dich ein zweites Mal via rpcclient mit dem Samba-Server, und führe den Befehl setdriver aus.
Sie können das Werkzeug cupsaddsmb auch mit Parametern ausführen, um einen Host als Samba-Host und einen zweiten Host als CUPS-Host anzugeben. Besonders wenn Sie weitergehende Kenntnisse aufbauen wollen, ist es sinnvoll, dies zu versuchen, und genau zu sehen, was passiert (obwohl in der Praxis die meisten Installationen Samba- und CUPS-Server auf derselben Maschine haben werden):
root# cupsaddsmb -H sambaserver -h cupsserver -v drucker
Sie müssen immer überprüfen, dass das Werkzeug in allen Bereichen erfolgreich gearbeitet hat. Sie brauchen zumindest diese drei Meldungen in der Ausgabe von cupsaddsmb:
Printer Driver infotec_2105 successfully installed. # (für die W32X86 == Windows NT/200x/XP-Architektur).
Printer Driver infotec_2105 successfully installed. # (für die WIN40 == Windows 9x/Me-Architektur).
Successfully set [printerXPZ] to driver [printerXYZ].
Diese Meldungen sind eventuell nicht ganz leicht in der gesamten Ausgabe zu erkennen. Wenn Sie cupsaddsmb mit dem Parameter -a ausführen (der versucht, alle aktiven CUPS-Druckertreiber für den Download vorzubereiten), könnten Sie übersehen, dass einzelne Druckertreiber Probleme bei der Installation hatten. Hier hilft eine Umleitung der Ausgabe bei der nachträglichen Analyse der Ergebnisse.
Wenn Sie Folgendes erhalten:
SetPrinter call failed! result was WERR_ACCESS_DENIED
bedeutet das, dass Sie eventuell use client driver = yes für diesen Drucker gesetzt haben. Setzen Sie dies auf „no“, das wird das Problem lösen. Sehen Sie sich man samba(5) für die Erklärung des Parameters use client driver an.
Es ist unmöglich, irgendeine Ausgabe zu sehen, wenn Sie cupsaddsmb nicht im „verbose mode“ ausführen. Daher empfehlen wir ausdrücklich, den voreingestellten „quiet mode“ nicht zu verwenden. Dieser verbirgt alle eventuell auftretenden Probleme vor Ihnen.
Schaffen Sie es nicht, den Standard-Befehl cupsaddsmb auf einem Samba-PDC erfolgreich auszuführen? Werden Sie immer und immer wieder nach dem Passwort gefragt, und wird der Befehl nicht einmal gestartet? Versuchen Sie eine dieser Varianten:
root# cupsaddsmb -U MITTELERDE\\root -v druckername root# cupsaddsmb -H SAURON -U MITTELERDE\\root -v druckername root# cupsaddsmb -H SAURON -U MITTELERDE\\root -h cups-server -v druckername
(Beachten Sie die zwei Backslashes: Der erste wird benötigt, um das „escaping“ des zweiten zu bewirken).
cupsaddsmb-Flussdiagramm(((Abbildung Nummer?))) zeigt eine grafische Darstellung der Abläufe, Befehlsketten und Datenflüsse des Befehls cupaddsmb. Nochmals zur Erinnerung: cupsaddsmb ist nicht für Raw-Queues gedacht und arbeitet nicht mit Raw-Queues!
Nachdem cupsaddsmb beendet wurde, ist Ihr Treiber vorbereitet, um von den Clients verwendet zu werden. Hier sind die Schritte, die Sie durchführen müssen, um den Treiber via Point'n'Print herunterzuladen und zu installieren. Auf dem Windows-Client wählen Sie den CUPS/Samba-Server:
Ein paar Sekunden später sollte es einen neuen Drucker im lokalen Ordner Drucker und Faxgeräte Ihres Clients geben. Unter Windows XP wird er der Namenskonvention von DruckerName auf SambaServer entsprechen. (In meinem momentanen Fall ist es „infotec_2105 auf kde-bitshop“). Wenn Sie diesen Drucker testen wollen und Ihren ersten Auftrag aus einer Anwendung wie Winword senden wollen, erscheint der neue Drucker als Eintrag # \\SambaServer\DruckerName im Dropdown-Menü der verfügbaren Drucker.
cupsaddsmb arbeitet nur zuverlässig mit CUPS-Versionen ab 1.1.15 und Samba-Versionen ab 2.2.4. Wenn es nicht funktioniert oder wenn der automatische Drucker-Download auf die Clients nicht erfolgreich verläuft, können Sie den CUPS-Treiber immer noch manuell über den Adobe-PostScript-Treiber auf den Clients installieren. Dann lassen Sie, wenn Sie die CUPS-Netzwerk-RIP-Funktionalitäten nutzen möchten, die Queue auf die Samba-Freigabe zeigen, um eine UNC-Verbindung zu erreichen:
C:\> net use lpt1: \\sambaserver\druckerfreigabe /user:ntadmin
(Beachten Sie, dass der Benutzer „ntadmin“ ein gültiger Samba-Benutzer mit den erforderlichen Rechten sein muss.) Dies installiert die Druckerverbindung in klassischer LanMan-Weise (und verwendet dabei kein MS-RPC).
Das Drucken funktioniert, aber es gibt immer noch Probleme. Die meisten Aufträge drucken sehr gut, aber einige drucken gar nicht. Manche Aufträge haben Probleme mit den Schriftarten, die nicht besonders gut aussehen. Manche Aufträge werden schnell gedruckt, manche sind unglaublich langsam. Viele dieser Probleme können minimiert oder überhaupt komplett beseitigt werden, wenn Sie ein paar Richtlinien befolgen. Denken Sie an Folgendes: Wenn Ihr Drucker nicht PostScript-befähigt ist, beschicken Sie Ihre Ghostscript-Installation auf Ihrem CUPS-Host mit dem Output, den die Einstellungen des Treibers auf Ihrem Client erzeugen. Behandeln Sie Ghostscript gut:
Vermeiden Sie die PostScript-Option Optimize for Speed. Verwenden Sie stattdessen die Einstellung Optimize for Portability (Adobe PostScript-Treiber).
Verwenden Sie nicht die Einstellung Page Independence: NO. Verwenden Sie stattdessen die Einstellung Page Independence: YES (CUPS PostScript-Treiber).
Empfohlen wird die True-Type-Font-Downloading-Option Native True Type statt Automatic and Outline; Sie sollten unter allen Umständen die Option Bitmap vermeiden (Adobe PostScript-Treiber).
Wählen Sie True Type Font: Download as Softfont into Printer anstatt des voreingestellten Replace by Device Font (Bei ausgefallenen Schriftarten kann es sein, dass Sie es wieder umstellen müssen, um überhaupt einen Ausdruck zu erhalten.) (Adobe).
Manchmal können Sie den PostScript-Language-Level wählen: Bei Problemen können Sie 2 anstelle von 3 versuchen (das neueste ESP Ghostscript kann sehr gut mit Level 3 PostScript umgehen) (Adobe).
Sagen Sie „Yes“ zum PostScript Error Handler (Adobe).
Natürlich können Sie alle in cupsaddsmb eingebetteten Befehle selbst ausführen, einen nach dem anderen, und damit die Treiber-Dateien hochladen und für zukünftige Downloads vorbereiten.
Wir werden das jetzt tun. Lesen Sie zuerst die Manpage zu rpcclient, um eine erste Vorstellung zu erhalten. Sehen Sie sich die druckbezogenen Sub-Befehle an. enumprinters, enumdrivers, enumports, adddriver und setdriver sind die interessantesten davon. rpcclient implementiert einen wichtigen Teil des MS-RPC-Protokolls. Sie können es verwenden, um einen Windows NT-(oder 200x/XP-)PC abzufragen und zu steuern. MS-RPC wird von Windows-Clients unter anderem dazu verwendet, die Point'n'Print-Features zu nutzen. Samba kann dies mittlerweile auch „nachahmen“.
Lassen Sie uns zuerst die Manpage zu rpcclient prüfen. Hier sind zwei relevante Abschnitte:
adddriver <arch> <config>: Führe ein AddPrinterDriver()-RPC aus, um den Druckertreiber auf dem Server zu installieren. Die Treiber sollten bereits in dem Verzeichnis existieren, das von getdriverdir zurückgegeben wird. Mögliche Werte für arch sind dieselben wie für getdriverdir. Der Parameter config ist wie folgt definiert:
Long Printer Name:\ Driver File Name:\ Data File Name:\ Config File Name:\ Help File Name:\ Language Monitor Name:\ Default Data Type:\ Comma Separated list of Files
Alle leeren Felder sollten als String „NULL“ angegeben werden.
Samba muss das Konzept der Druck-Monitore nicht unterstützen, da dieses nur auf lokale Drucker anzuwenden ist, deren Treiber eine bidirektionale Verbindung zur Kommunikation mit dem Drucker nutzen können. Dieses Feld sollte „NULL“ sein. Auf einem entfernten NT-Druck-Server muss der Druck-Monitor für einen Treiber bereits installiert sein, bevor man den Treiber hinzufügt, oder das RPC wird scheitern.
setdriver <printername> <drivername>: Führe einen Befehl SetPrinter() aus, um den mit einem Drucker assoziierten Treiber zu aktualisieren. Der Druckertreiber muss bereits korrekt auf dem Druck-Server installiert sein.
Beachten Sie auch die Befehle enumprinters und enumdrivers für das Abfragen einer Liste von installierten Druckern und Treibern.
Das exakte Format wird nicht allzu klar von der Manpage beschrieben, da Sie einige Parametern benutzen müssen, die Leerzeichen enthalten. Hier ist eine bessere Beschreibung dafür. Wir haben den Befehl mit Zeilenumbrüchen versehen und die Umbrüche mit „\“ gekennzeichnet. Üblicherweise würden Sie diesen Befehl ohne die Umbrüche in einer Zeile eingeben:
adddriver „Architecture“ \ „LongPrinterName:DriverFile:DataFile:ConfigFile:HelpFile:\ LanguageMonitorFile:DataType:ListOfFiles,Comma-separated“
Was die Manpage als ein simples <config>-Schlüsselwort bezeichnet, besteht in Wirklichkeit aus acht durch Doppelpunkte getrennten Feldern. Das letzte Feld kann mehrere (in manchen sehr ausgefallenen Fällen bis zu 20 zusätzliche) Dateinamen enthalten. Dies mag anfangs sehr verwirrend klingen. Was die Manpages als „LongPrinterName“ bezeichnen, sollte in der Realität als „Driver Name“ bezeichnet werden. Sie können es bezeichnen, wie Sie wollen, solange Sie diesen Namen später im Befehl rpcclient ... setdriver wieder verwenden. Aus praktischen Gründen empfiehlt es sich, den Treiber so zu benennen wie den Drucker.
Es ist überhaupt nicht einfach. Ich höre Sie fragen: „Wie weiß ich, welche Dateien ‚Driver File‘, ‚Data File‘, ‚Config File‘, ‚Help File‘ und ‚Language Monitor File‘ im jeweiligen Fall sind?“ Um eine Antwort zu finden, können Sie sich ja mal ansehen, wie eine Windows NT-Maschine mit einem freigegebenen Drucker uns diese Dateien anbietet. Erinnern Sie sich, dass diese ganze Prozedur vom Samba-Team durch Abhören des Verkehrs, der von Windows-Computern im Netzwerk verursacht wird, entwickelt werden muss. Wir können uns nun genauso einer Windows-Maschine zuwenden und auf sie von einer UNIX-Workstation aus zugreifen. Wir werden sie mit rpcclient abfragen, um zu sehen, was sie uns erzählt, und versuchen, die Manpage klarer zu verstehen, die wir gerade gelesen haben.
Wir könnten rpcclient mit einem getdriver- oder getprinter-Sub-Befehl (in Level-3-Ausführlichkeit) an die Windows-Maschine absetzen. Setzen Sie sich einfach an eine UNIX- oder Linux-Workstation mit installierten Samba-Werkzeugen, und tippen Sie folgenden Befehl:
root# rpcclient -U'user%secret' NT-SERVER -c 'getdriver printername 3'
Aus dem Ergebnis sollte klarwerden, welche Detai welche ist. Hier ein Beispiel aus meiner Installation:
root# rpcclient -U'Danka%xxxx' W200xSERVER \ -c'getdriver „DANKA InfoStream Virtual Printer“ 3' cmd = getdriver „DANKA InfoStream Virtual Printer“ 3 [Windows NT x86] Printer Driver Info 3: Version: [2] Driver Name: [DANKA InfoStream] Architecture: [Windows NT x86] Driver Path: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRIPT.DLL] Datafile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\INFOSTRM.PPD] Configfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRPTUI.DLL] Helpfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRIPT.HLP] Dependentfiles: [] Dependentfiles: [] Dependentfiles: [] Dependentfiles: [] Dependentfiles: [] Dependentfiles: [] Dependentfiles: [] Monitorname: [] Defaultdatatype: []
Manche Druckertreiber listen zusätzliche Dateien unter der Bezeichnung Dependentfiles auf, und diese würden im letzten Feld ListOfFiles,Comma-separated angeführt werden. Für den CUPS-PostScript-Treiber brauchen wir keine (und auch für die Adobe-Treiber würden wir keine brauchen), daher erhält dieses Feld den Eintrag „NULL“.
Aus der Manpage (und der oben zitierten Ausgabe von cupsaddsmb) wird klar, dass Sie bestimmte Bedingungen erfüllen müssen, um das manuelle Hochladen und Initialisieren von Treibern erfolgreich zu ermöglichen. Die beiden Sub-Befehle rpcclient und (adddriver und setdriver) müssen folgende Bedingungen erfüllen, um erfolgreich ausgeführt zu werden:
Sie sind als printer admin oder root verbunden (dies ist nicht die Gruppe „Printer Operators“ in NT, sondern die Gruppe printer admin, wie sie im Abschnitt [global] von smb.conf definiert wurde).
Kopieren Sie alle erforderlichen Treiber-Dateien nach \\SAMBA\print$\w32x86 und \\SAMBA\print$\win40. Diese werden später in den Unterverzeichnissen „0“ respektive „2“ landen. Für den Moment legen Sie sie nicht dort ab, sie werden automatisch vom Sub-Befehl adddriver verwendet. (Wenn Sie smbclient dazu verwenden, die Treiber-Dateien in die Freigabe zu platzieren, beachten Sie, dass Sie das Zeichen „$“ „escapen“: smbclient //sambaserver/print\$ -U root.)
Der Benutzer, als der Sie sich verbinden, muss schreibberechtigt für die Freigabe [print$] sein und dort Verzeichnisse anlegen dürfen.
Der Drucker, für den Sie die Windows-Clients vorbereiten wollen, muss bereits in CUPS installiert sein.
Der CUPS-Drucker muss Samba bekannt sein, andernfalls scheitert der Sub-Befehl setdriver mit dem Fehler NT_STATUS_UNSUCCESSFUL. Um zu prüfen, ob der Drucker Samba bekannt ist, können Sie den Sub-Befehl enumprinters von rpcclient verwenden. Ein seit langem vorhandener Bug verhinderte ein sauberes Update der Drucker-Liste, bis jeder smbd-Prozess ein SIGHUP empfangen hatte oder neu gestartet wurde. Erinnern Sie sich daran, falls Sie den CUPS-Drucker gerade erst angelegt haben und auf Probleme stoßen: Versuchen Sie, Samba neu zu starten.
Wir werden jetzt einen Druckertreiber installieren, indem wir manuell alle erforderlichen Befehle ausführen. Da dies zuerst als ziemlich komplizierter Prozess erscheinen mag, gehen wir die Prozedur Schritt für Schritt durch, und erklären jede einzelne Aktion, die vorkommt.
Prozedur 19.2. Manuelle Treiber-Installation
Den Drucker in CUPS installieren.
root# lpadmin -p mysmbtstprn -v socket://10.160.51.131:9100 -E -P canonIR85.ppd
Dies installiert den Drucker mit dem Namen mysmbtstprn im CUPS-System. Der Drucker wird über eine Socket-Verbindung (auch als JetDirect oder Direct TCP/IP bekannt) angesprochen. Sie müssen für diesen Schritt root sein.
(Optional) Prüfen, ob der Drucker von Samba erkannt wird.
root# rpcclient -Uroot%xxxx -c 'enumprinters' localhost \ | grep -C2 mysmbtstprn flags:[0x800000] name:[\\kde-bitshop\mysmbtstprn] description:[\\kde-bitshop\mysmbtstprn,,mysmbtstprn] comment:[mysmbtstprn]
Dies sollte den Drucker in der Liste anzeigen. Wenn nicht, stoppen Sie den Samba-Daemon (smbd), und starten Sie ihn neu, oder senden Sie ein HUP-Signal:
root# kill -HUP `pidof smbd`
Prüfen Sie nochmals. Korrigieren Sie, und wiederholen Sie dies, bis zum Erfolg. Beachten Sie das „leere“ Feld zwischen den beiden Kommas in der Zeile „description“. Der Treibername würde hier erscheinen, wenn es bereits einen gäbe. Sie müssen das Samba-Passwort von root kennen (wie es vom Befehl smbpasswd gesetzt wurde), um diesen Schritt und die meisten der folgenden Schritte ausführen zu können. Alternativ dazu können Sie sich als einer der Benutzer authentifizieren, die in der „write list“ für [print$] in smb.conf definiert sind.
(Optional) Prüfen, ob Samba einen Treiber für den Drucker kennt.
root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \ | grep driver drivername:[] root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \ | grep -C4 driv servername:[\\kde-bitshop] printername:[\\kde-bitshop\mysmbtstprn] sharename:[mysmbtstprn] portname:[Samba Printer Port] drivername:[] comment:[mysmbtstprn] location:[] sepfile:[] printprocessor:[winprint] root# rpcclient -U root%xxxx -c 'getdriver mysmbtstprn' localhost result was WERR_UNKNOWN_PRINTER_DRIVER
Keiner der drei oben gezeigten Befehle sollte einen Treiber anzeigen. Dieser Schritt wurde nur ausgeführt, um diese Bedingung zu demonstrieren. Ein Versuch, sich in diesem Stadium mit dem Drucker zu verbinden, sollte folgende Nachricht zeigen: „Der Server hat nicht die erforderlichen Treiber installiert.“
Stellen Sie alle erforderlichen Treiberdateien in die Samba-Freigabe [print$].
root# smbclient //localhost/print\$ -U 'root%xxxx' \ -c 'cd W32X86; \ put /etc/cups/ppd/mysmbtstprn.ppd mysmbtstprn.PPD; \ put /usr/share/cups/drivers/cupsui.dll cupsui.dll; \ put /usr/share/cups/drivers/cupsdrvr.dll cupsdrvr.dll; \ put /usr/share/cups/drivers/cups.hlp cups.hlp'
(Dieser Befehl sollte in einer einzelnen langen Zeile eingegeben werden; die durch „\“ angezeigten Zeilenumbrüche wurden nur eingefügt, um die Lesbarkeit zu verbessern. Dieser Schritt ist erforderlich, damit der darauf folgende Schritt erfolgreich durchgeführt werden kann. Er macht die Dateien physisch in der Freigabe [print$] verfügbar. Die Clients wären jedoch nach wie vor nicht in der Lage, diese Treiber zu installieren, da Samba sie noch nicht als Treiberdateien behandelt. Ein Client, der diesen Treiber abfragt, würde nach wie vor mit einer Meldung wie „nicht installiert“ konfrontiert.
Prüfen, wo sich die Treiberdateien jetzt befinden.
root# ls -l /etc/samba/drivers/W32X86/ total 669 drwxr-sr-x 2 root ntadmin 532 May 25 23:08 2 drwxr-sr-x 2 root ntadmin 670 May 16 03:15 3 -rwxr--r-- 1 root ntadmin 14234 May 25 23:21 cups.hlp -rwxr--r-- 1 root ntadmin 278380 May 25 23:21 cupsdrvr.dll -rwxr--r-- 1 root ntadmin 215848 May 25 23:21 cupsui.dll -rwxr--r-- 1 root ntadmin 169458 May 25 23:21 mysmbtstprn.PPD
Die Treiberdateien sind jetzt im „Wurzelverzeichnis“ der Freigabe [print$].
Samba mitteilen, dass diese Dateien Treiberdateien sind (adddriver).
root# rpcclient -Uroot%xxxx -c 'adddriver „Windows NT x86“ \ „mydrivername:cupsdrvr.dll:mysmbtstprn.PPD: \ cupsui.dll:cups.hlp:NULL:RAW:NULL“' \ localhost Printer Driver mydrivername successfully installed.
Sie können diesen Schritt nicht wiederholen, wenn er scheitert. Er könnte sogar infolge eines simplen Tippfehlers scheitern. Meist hat der Befehl dann bereits einen Teil der Treiberdateien in das Unterverzeichnis „2“ verschoben. Wenn dieser Schritt scheitert, müssen Sie zum vierten Schritt zurückgehen und ihn wiederholen, bevor Sie den fünften Schritt von neuem versuchen können. In diesem Schritt müssen Sie einen Namen für Ihren Treiber auswählen. Es ist normalerweise eine gute Idee, denselben Namen zu verwenden, wie er für den Druckernamen verwendet wird; in großen Installationen werden Sie jedoch diesen Treiber für eine größere Anzahl von Druckern verwenden, die natürlich verschiedene Namen haben, daher ist der Name des Treibers nicht fixiert.
Prüfen, wo sich die Treiberdateien jetzt befinden.
root# ls -l /etc/samba/drivers/W32X86/ total 1 drwxr-sr-x 2 root ntadmin 532 May 25 23:22 2 drwxr-sr-x 2 root ntadmin 670 May 16 03:15 3 root# ls -l /etc/samba/drivers/W32X86/2 total 5039 [....] -rwxr--r-- 1 root ntadmin 14234 May 25 23:21 cups.hlp -rwxr--r-- 1 root ntadmin 278380 May 13 13:53 cupsdrvr.dll -rwxr--r-- 1 root ntadmin 215848 May 13 13:53 cupsui.dll -rwxr--r-- 1 root ntadmin 169458 May 25 23:21 mysmbtstprn.PPD
Beachten Sie, wie der Schritt 6 auch die Treiberdateien in das entsprechende Unterverzeichnis verschoben hat. Vergleichen Sie dies mit der Situation nach dem Schritt 5.
(Optional) Prüfen, ob Samba jetzt den Treiber erkennt.
root# rpcclient -Uroot%xxxx -c 'enumdrivers 3' \ localhost | grep -B2 -A5 mydrivername Printer Driver Info 3: Version: [2] Driver Name: [mydrivername] Architecture: [Windows NT x86] Driver Path: [\\kde-bitshop\print$\W32X86\2\cupsdrvr.dll] Datafile: [\\kde-bitshop\print$\W32X86\2\mysmbtstprn.PPD] Configfile: [\\kde-bitshop\print$\W32X86\2\cupsui.dll] Helpfile: [\\kde-bitshop\print$\W32X86\2\cups.hlp]
Erinnern Sie sich: Dieser Befehl führt ein „grep“ nach dem Namen aus, den Sie im Schritt 6 für den Treiber gewählt haben. Dieser Befehl muss erfolgreich ausgeführt worden sein, bevor Sie fortfahren können.
Samba mitteilen, welcher Drucker diese Treiberdateien verwenden soll (setdriver).
root# rpcclient -Uroot%xxxx -c 'setdriver mysmbtstprn mydrivername' \ localhost Successfully set mysmbtstprn to driver mydrivername
Da Sie jeden Druckernamen (Drucker-Queue) an jeden Treiber binden können, ist dies eine praktische Möglichkeit, viele Queues zu konfigurieren, die denselben Treiber verwenden. Sie brauchen all die vorhergehenden Schritte nicht zu wiederholen, damit der Befehl setdriver Erfolg hat. Die einzigen Vorbedingungen sind: enumdrivers muss den Treiber finden, und enumprinters muss den Drucker finden.
(Optional) Prüfen, ob Samba diese Zuordnung erkannt hat.
root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \
| grep driver
drivername:[mydrivername]
root# rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \
| grep -C4 driv
servername:[\\kde-bitshop]
printername:[\\kde-bitshop\mysmbtstprn]
sharename:[mysmbtstprn]
portname:[Done]
drivername:[mydrivername]
comment:[mysmbtstprn]
location:[]
sepfile:[]
printprocessor:[winprint]
root# rpcclient -U root%xxxx -c 'getdriver mysmbtstprn' localhost
[Windows NT x86]
Printer Driver Info 3:
Version: [2]
Driver Name: [mydrivername]
Architecture: [Windows NT x86]
Driver Path: [\\kde-bitshop\print$\W32X86\2\cupsdrvr.dll]
Datafile: [\\kde-bitshop\print$\W32X86\2\mysmbtstprn.PPD]
Configfile: [\\kde-bitshop\print$\W32X86\2\cupsui.dll]
Helpfile: [\\kde-bitshop\print$\W32X86\2\cups.hlp]
Monitorname: []
Defaultdatatype: [RAW]
Monitorname: []
Defaultdatatype: [RAW]
root# rpcclient -Uroot%xxxx -c 'enumprinters' localhost \
| grep mysmbtstprn
name:[\\kde-bitshop\mysmbtstprn]
description:[\\kde-bitshop\mysmbtstprn,mydrivername,mysmbtstprn]
comment:[mysmbtstprn]
Vergleichen Sie diese Resultate mit denen aus den Schritten 2 und 3. Jeder dieser Befehle zeigt, dass der Treiber installiert ist. Sogar der Befehl enumprinters führt jetzt den Treiber in der Zeile „description“ an.
(Optional) Den Treiber in den korrekten Gerätemodus „kitzeln“.
Sie wissen sicherlich, wie man den Treiber auf dem Client installiert. Für den Fall, dass Sie nicht besonders vertraut mit Windows sind, hier ein Schnell-Rezept: Durchsuchen Sie die Netzwerkumgebung, gehen Sie auf den Samba-Server, und sehen Sie nach den Freigaben. Sie sollten hier alle freigegebenen Samba-Drucker sehen. Klicken Sie doppelt auf den gewünschten Drucker. Der Treiber sollte installiert und die Netzwerkverbindung hergestellt werden. Eine weitere Möglichkeit ist, den Ordner Drucker und Faxgeräte zu öffnen, den betreffenden Drucker mit der rechten Maustaste anzuklicken und entweder Verbinden oder Installieren zu wählen. Als Ergebnis sollte ein neuer Drucker in dem lokalen Ordner Drucker und Faxgeräte Ihres Clients erscheinen, der Druckerfreigabename auf SambaServerName oder so ähnlich heißt.
Es ist wichtig, dass Sie diesen Schritt als ein Samba-Drucker-Administrator (printer admin, definiert in smb.conf) ausführen. Hier eine andere Methode, dies in Windows XP zu tun. Diese Methode verwendet eine Befehlszeile, die Sie in der „DOS box“ eingeben (tippen Sie das smbpassword von root, falls erforderlich):
C:\> runas /netonly /user:root „rundll32 printui.dll,PrintUIEntry \
/in /n \\sambaserver\mysmbtstprn“
Ändern Sie irgendeine Druckereinstellung einmal (wie z.B. den Parameter portrait auf landscape), klicken Sie auf ,und ändern Sie die Einstellung wieder zurück.
Den Drucker auf einem Client installieren (Point'n'Print).
C:\> rundll32 printui.dll,PrintUIEntry /in /n „\\sambaserver\mysmbtstprn“
Wenn dies nicht funktioniert, könnte dies ein Berechtigungsproblem mit der Freigabe [print$] sein.
(Optional) Eine Testseite drucken.
C:\> rundll32 printui.dll,PrintUIEntry /p /n
„\\sambaserver\mysmbtstprn“
Drücken Sie fünfmal [TAB], zweimal [ENTER], einmal [TAB] und nochmals [ENTER], und marschieren Sie zum Drucker.
(Empfohlen) Studieren Sie die Testseite.
Hmmm.... ich scherze nur! Mittlerweile wissen Sie alles über Drucker-Installationen und brauchen kein Wort mehr davon zu lesen. Stecken Sie die Seite in einen Rahmen, und nageln Sie den an die Wand, mit der Überschrift „MEIN ERSTER MIT RPCCLIENT INSTALLIERTER DRUCKER“ oder werfen Sie sie einfach weg!
(Obligatorisch) Genießen Sie es. Machen Sie Luftsprünge. Feiern Sie Ihren Erfolg.
root# echo „Cheeeeerioooooo! Erfolg ...“ >> /var/log/samba/log.smbd
Der Befehl setdriver wird scheitern, wenn in Sambas „Bewusstsein“ die Queue noch nicht vorhanden ist. Sie hatten viel versprechende Meldungen wie
Printer Driver ABC successfully installed.
nach dem Abschnitt mit adddriver? Aber Sie sehen auch eine enttäuschende Meldung wie diese hier?
result was NT_STATUS_UNSUCCESSFUL
Es reicht nicht aus, dass Sie mit dem Befehl lpstat -p ir85wm die Queue in CUPS sehen können. Ein Bug in den neueren Versionen von Samba verhindert ein ordnungsgemäßes Update der Queue-Liste. Die Erkennung von neu installierten CUPS-Druckern scheitert, bis Sie Samba neu starten oder ein HUP an alle smbd-Prozesse senden. Um zu prüfen, ob dies der Grund dafür ist, dass Samba den Befehl setdriver nicht erfolgreich ausführt, prüfen Sie, ob Samba den Drucker „sieht“:
root# rpcclient transmeta -N -U'root%xxxx' -c 'enumprinters 0'|grep ir85wm
printername:[ir85wm]
Ein anderer Befehl könnte der hier sein:
root# rpcclient transmeta -N -U'root%secret' -c 'getprinter ir85wm'
cmd = getprinter ir85wm
flags:[0x800000]
name:[\\transmeta\ir85wm]
description:[\\transmeta\ir85wm,ir85wm,DPD]
comment:[CUPS PostScript-Treiber for Windows NT/200x/XP]
Übrigens, Sie können diese Befehle (sowie einige weitere) natürlich auch dazu verwenden, Treiber auf entfernten Windows-NT-Druckservern zu installieren!
Einige Mysterien ranken sich um die Gruppe der Dateien mit dem Suffix tdb, die in jeder Samba-Installation auftauchen. Diese sind connections.tdb, printing.tdb, share_info.tdb, ntdrivers.tdb, unexpected.tdb, brlock.tdb, locking.tdb, ntforms.tdb, messages.tdb , ntprinters.tdb, sessionid.tdb und secrets.tdb. Was ist ihr Zweck?
Ein Windows NT-(Druck-)Server führt Buch über alle benötigten Informationen, die er zur Erfüllung seiner Pflichten gegenüber den Clients benötigt, indem er Einträge in der Windows-Registrierung speichert. Client-Anfragen werden beantwortet, indem aus der Registrierung gelesen wird, und Administrator- oder Benutzer-Konfigurationseinstellungen werden gespeichert, indem in die Registrierung geschrieben wird. Samba und UNIX haben natürlich keine solche Registrierung. Samba führt stattdessen Buch über alle client-bezogenen Informationen, indem es eine Reihe von *.tdb-Dateien verwendet. (TDB = Trivial Data Base). Diese sind oft in /var/lib/samba/ oder /var/lock/samba/ abgelegt. Die druck-bezogenen Dateien sind ntprinters.tdb, printing.tdb, ntforms.tdb und ntdrivers.tdb.
*.tdb-Dateien sind nicht für den Menschen lesbar. Sie sind in einem binären Format geschrieben. „Warum nicht in ASCII?“, könnten Sie fragen. „ASCII-Dateien sind doch eine gute und bewährte Tradition unter UNIX.“ Der Grund für diese Design-Entscheidung ist hauptsächlich die Performance. Samba muss schnell laufen; es führt für jede Client-Verbindung einen separaten smbd-Prozess aus, in manchen Umgebungen viele Tausende davon. Manche smbds könnten Schreibzugriff auf dieselbe *.tdb-Datei zur gleichen Zeit brauchen. Das Dateiformat der *.tdb-Dateien von Samba erlaubt dies; viele smbd-Prozesse können gleichzeitig in dieselbe *.tdb-Datei schreiben. Dies wäre mit reinen ASCII-Dateien nicht möglich.
Es ist sehr wichtig, dass alle *.tdb-Dateien über alle Lese- und Schreibzugriffe hinweg konsistent bleiben. Es kann jedoch passieren, dass diese Dateien beschädigt werden. (Ein kill -9 `pidof smbd' während eines Schreibzugriffs könnte genauso gut dafür verantwortlich sein wie ein Stromausfall etc.). Im Falle von Schwierigkeiten kann das Löschen der alten druckbezogenen *.tdb-Dateien die einzige Möglichkeit sein. Danach müssen Sie alle druckbezogenen Einstellungen wieder herstellen, oder Sie haben rechtzeitig ein Backup der relevanten Dateien erstellt.
Samba enthält ein kleines Hilfsmittel, das dem root-Benutzer Ihres Systems hilft, die *.tdb-Dateien zu sichern. Wenn Sie es ohne Argumente ausführen, gibt es Auskunft über seine Verwendung:
root# tdbbackup Usage: tdbbackup [options] <fname...> Version:3.0a -h this help message -s suffix set the backup suffix -v verify mode (restore if corrupt)
Hier sehen Sie, wie ich meine Datei printing.tdb gesichert habe:
root# ls . browse.dat locking.tdb ntdrivers.tdb printing.tdb .. share_info.tdb connections.tdb messages.tdb ntforms.tdb printing.tdbkp unexpected.tdb brlock.tdb gmon.out namelist.debug ntprinters.tdb sessionid.tdb root# tdbbackup -s .bak printing.tdb printing.tdb : 135 records root# ls -l printing.tdb* -rw------- 1 root root 40960 May 2 03:44 printing.tdb -rw------- 1 root root 40960 May 2 03:44 printing.tdb.bak
CUPS besitzt eine gute Unterstützung für Drucker vom Typ HP LaserJet. Sie können den generischen Treiber wie folgt installieren:
root# lpadmin -p laserjet4plus -v parallel:/dev/lp0 -E -m laserjet.ppd
Die Option -m wird die Datei laserjet.ppd aus dem Standard-Repository für noch nicht installierte PPDs beziehen, das CUPS üblicherweise in /usr/share/cups/model speichert. Alternativ dazu können Sie -P /pfad/zu/ihrer.ppd benutzen.
Das generische laserjet.ppd unterstützt jedoch nicht jede spezielle Option für jedes LaserJet-kompatible Modell. Es stellt eine Art „kleinster gemeinsamer Nenner“ aller Modelle dar. Wenn Sie aus irgendeinem Grund für die kommerziell verfügbaren ESP Print Pro-Treiber bezahlen müssen, sollte Ihr erster Schritt darin bestehen, die Datenbank auf der Website Linuxprinting zu befragen. Linuxprinting.org gibt exzellente Empfehlungen dazu, welcher Treiber am besten für welchen Drucker zu verwenden ist. Die dortige Datenbank wird durch die unermüdliche Arbeit von Till Kamppeter von MandrakeSoft aktuell gehalten, der auch der Hauptautor des Werkzeugs foomatic-rip ist.
Das frühere Konzept cupsomatic wird nun von seinem neuen Nachfolger, dem weitaus mächtigeren foomatic-rip, ersetzt. cupsomatic wird nicht mehr weiter instand gehalten. Hier ist die neue URL zur neuen Foomatic-3.0-Datenbank.(((Im PDF sieht man die Web-Adresse nicht.))) Wenn Sie ein Upgrade auf foomatic-rip durchführen wollen, vergessen Sie nicht, auch das Upgrade auf die neuartigen PPDs für Ihre Foomatic-betriebenen Drucker durchzuführen. foomatic-rip arbeitet nicht mit PPDs, die für das alte cupsomatic generiert wurden. Die neuen PPDs entsprechen zu 100% der Adobe PPD-Spezifikation. Sie sind auch dazu gedacht, mit Samba und dem Werkzeug cupsaddsmb verwendet zu werden, um die Treiber für die Windows-Clients bereitzustellen!
Heutzutage verwenden die meisten Linux-Distributionen die Werkzeuge von Linuxprinting.org, um ihre druckerspezifische Software aufzubauen (die übrigens auch auf allen UNIX-Versionen und auch auf Mac OS X oder Darwin läuft). Es ist nicht so bekannt, wie es sein sollte, dass es auch ein sehr benutzerfreundliches Interface hat, das einfache Updates von Treibern und PPDs für alle unterstützten Drucker, alle Spooler, alle Betriebssysteme und alle Paketformate erlaubt (weil es keines gibt)(((?))). Seine Geschichte reicht schon einige Jahre zurück.
Erst unlängst hat Foomatic den erstaunlichen Meilenstein von 1000 gelisteten Druckermodellen geschafft. Linuxprinting.org speichert alle wichtigen Fakten über Druckertreiber und unterstützte Modelle sowie Informationen darüber, welche Optionen für die verschiedenen Treiber/Drucker-Kombinationen verfügbar sind, in seiner Foomatic-Datenbank. Momentan gibt es 245 Treiber in der Datenbank. Viele Treiber unterstützen verschiedene Modelle, und viele Modelle können mit verschiedenen Treibern betrieben werden Sie haben die Wahl!
Zurzeit gibt es 690 Geräte, die mit „arbeitet perfekt“ bezeichnet werden, 181 arbeiten größtenteils ordentlich, 96 teilweise, und 46 sind Briefbeschwerer. Wenn man bedenkt, dass die meisten dieser Drucker Nicht-PostScript-Modelle sind (PostScript-Drucker werden von CUPS automatisch perfekt unterstützt, da sie ihre eigene, vom Hersteller bereitgestellte Windows-PPD verwenden) und dass ein multi-funktionales Gerät nie als perfekt-arbeitend bezeichnet wird, solange es nicht auch unter GNU/Linux scannt und faxt und kopiert, ist dies eine wirklich erstaunliche Errungenschaft! Vor drei Jahren war die Anzahl nicht größer als 500, und der Linux- oder UNIX-Druck war zu der Zeit nicht einmal annähernd dort, wo er jetzt ist.
Vor ein paar Jahren startete Grant Taylor all das. Die Wurzeln des heutigen Linuxprinting.org liegen in dem ersten Linux-Printing-HOWTO, das er verfasst hat. Als Nebenprojekt zu diesem Dokument, das vielen Linux-Anwendern und -Administratoren bei ihren ersten Schritten in diesem komplizierten und delikaten Setup half (für einen Wissenschaftler ist Drucken „das Auftragen einer strukturierten Ablagerung von verschiedenen Mustern aus Tinten- oder Toner-Partikeln auf Papier-Substrate“), startete er eine kleine Postgres-Datenbank mit Informationen über den Hardware- und Treiber-Zoo, aus dem das damalige Linux-Drucken bestand. Diese Datenbank wurde zur Kern-Komponente der heutigen Foomatic-Sammlung von Werkzeugen und Daten. In der Zwischenzeit wurde sie auf eine XML-Struktur umgestellt.
„Warum der lustige Name?“ fragen Sie. Als es wirklich losging, im Frühling 2000, war CUPS bei weitem nicht so populär, wie es heute ist, und die meisten Systeme benutzten LPD, LPRng oder sogar PDQ. CUPS enthielt nur ein paar generische Treiber (genug für ein paar hundert verschiedene Druckermodelle). Diese unterstützten nicht so viele gerätespezifische Optionen. CUPS enthielt auch seinen eigenen eingebauten Raster-Filter (pstoraster, abgeleitet von Ghostscript). Auf der anderen Seite bot CUPS eine brilliante Unterstützung für das Controlling aller Drucker-Optionen durch standardisierte und wohldefinierte PPD-Dateien. Und CUPS war so entworfen, dass es einfach zu erweitern ist.
Taylor hatte in seiner Datenbank bereits eine beachtliche Sammlung von Fakten über viel mehr Drucker und die Ghostscript-„Treiber“, mit denen sie liefen. Seine Idee, PPDs aus der Datenbank-Information zu generieren und diese dazu zu benutzen, um Standard-Ghostscript-Filter in CUPS zum Funktionieren zu bringen, bewährte sich sehr gut. Sie schlug außerdem mehrere Fliegen mit einer Klappe:
Sie machte alle aktuellen und zukünftigen Ghostscript-Filter-Entwicklungen für CUPS verfügbar.
Sie machte eine Vielzahl von zusätzlichen Druckermodellen für CUPS-Anwender verfügbar (weil oft der traditionelle Weg über Ghostscript der einzige verfügbare war).
Sie stellte all den Benutzern, die Ghostscript-Filter benutzen wollten (oder mussten), die vielen erweiterten Optionen von CUPS zur Verfügung (Web-Interface, GUI-Treiber-Konfiguration).
CUPS arbeitete mit einem schnell zusammengehackten Filter-Skript namens cupsomatic. cupsomatic schleuste die Druckdatei durch Ghostscript, wobei es automatisch den ziemlich komplizierten Befehl konstruierte, der dazu benötigt wurde. Es musste nur noch ins CUPS-System kopiert werden, um dieses funktionieren zu lassen. Um zu konfigurieren, wie cupsomatic den Ghostscript-Darstellungsprozess kontrolliert, ist eine CUPS-PPD erforderlich. Diese PPD wird direkt aus den Inhalten der Datenbank generiert. Für CUPS und die entsprechende Drucker/Filter-Kombination erledigte ein anderes Perl-Skript die PPD-Generierung. Nachdem das funktionierte, implementierte Taylor innerhalb weniger Tage eine ähnliche Lösung für zwei andere Spooler. Die Namen, die für diese Konfigurationsgeneratoren gewählt wurden, waren PDQ-O-Matic (für PDQ) und LPD-O-Matic (für Sie haben es erraten LPD); die Konfiguration verwendete hier keine PPDs, sondern andere spooler-spezifische Dateien.
Im Spätsommer jenes Jahres begann Till Kamppeter, seine Arbeit in die Datenbank einfließen zu lassen. Kamppeter war von MandrakeSoft angestellt worden, um dessen Drucksystem auf CUPS umzustellen, nachdem die Verantwortlichen bei MadrakeSoft sein auf FLTK basierendes XPP gesehen hatten (ein GUI-Frontend für den CUPS-lp-Befehl). Er fügte viele Informationen und neue Drucker hinzu, entwickelte auch die Unterstützung für andere Spooler, wie PPR (via ppromatic), GNUlpr und LPRng (beide durch ein erweitertes lpdomatic), und spooler-loses Drucken (directomatic).
Also, zur Beantwortung der Frage: „Foomatic“ ist der allgemeine Name für all den überlappenden Code und die Daten hinter den „*omatic“-Skripten. Foomatic brauchte bis zur Version 2.0.x (hässliche) Perl-Datenstrukturen, die an die CUPS-PPDs von Linuxprinting.org angehängt wurden. Es gab verschiedene „*omatic“-Skripten für jeden Spooler, genauso wie verschiedene Drucker-Konfigurationsdateien.
Dies änderte sich alles mit Foomatic 2.9 (beta) und der „stable release“ 3.0. Es wurde nunmehr eine Annäherung aller *omatic-Skripten erreicht, und man spricht nun von foomatic-rip. Dieses einzelne Skript ist die Vereinheitlichung der davor verschiedenen spooler-spezifischen *omatic-Skripten. foomatic-rip wird von all den verschiedenen Spoolern gleicherweise benutzt, und da es PPDs lesen kann (sowohl die originalen PostScript-Drucker-PPDs als auch die von Linuxprinting.org generierten), haben plötzlich alle unterstützten Spooler die mächtigen Features der PPDs zur Verfügung. Die Benutzer brauchen nur foomatic-rip in ihr System zu stöpseln. Für die Benutzer gibt es eine erweiterte Unterstützung für Medien-Typen und -Zufuhr, und die Papiergrößen und -schächte sind einfacher zu konfigurieren.
Außerdem enthält die neue Generation der Linuxprinting.org-PPDs keine Perl-Datenstrukturen mehr. Wenn Sie der Verwalter einer Distribution sind und die vorhergehende Version von Foomatic verwendet haben, möchten Sie vielleicht die neue Version ausprobieren. Aber vergessen Sie nicht, mit der neuen Datenbank-Engineeinen neuen Satz von PPDs zu generieren! Privat-Anwender brauchen nur ein einzelnes neues PPD zu generieren, das spezifisch für ihren Drucker ist. Dazu befolgen Sie die Schritte, die im Foomatic-Tutorial oder in diesem Kapitel beschrieben sind. Diese neuen Entwicklungen sind wirklich erstaunlich.
foomatic-rip ist ein sehr cleverer „Wrapper“ um die Anforderung, Ghostscript mit verschiedener Syntax, verschiedenen Optionen, Geräte-Auswahl und/oder Filtern für jeden verschiedenen Drucker oder Spooler auszuführen. Zur selben Zeit kann es die PPD, die einer Drucker-Queue zugeordnet ist, lesen und den Druckauftrag entsprechend der Benutzer-Auswahl modifizieren. Dazu kommt die 100%ige Übereinstimmung der Foomatic-PPDs mit der Adobe-Spezifikation. Einige innovative Features des Foomatic-Konzepts werden die Benutzer überraschen. Es unterstützt benutzerdefinierte Papiergrößen für viele Drucker und den Druck auf Medien aus verschiedenen Schächten innerhalb desselben Auftrags (in beiden Fällen sogar dann, wenn es dafür keine Unterstützung von Windows-basierenden Hersteller-Treibern gibt).
Der Großteil der Treiberentwicklung finden nicht innerhalb von Linuxprinting.org statt. Die Treiber werden von unabhängigen Maintainern geschrieben. Linuxprinting.org sammelt nur all die Informationen und speichert sie in seiner Datenbank. Zusätzlich stellt es den „Leim“ von Foomatic zur Verfügung, um die vielen Treiber in jegliches moderne (oder alte) Drucksystem zu integrieren.
Wo wir gerade von den verschiedenen Treiber-Entwickler-Gruppen sprechen, die meiste Arbeit wird derzeit in drei Projekten erledigt. Dies sind:
Omni ein freies Software-Projekt von IBM, das versucht, das Druckertreiber-Wissen von IBM aus den guten alten OS/2-Zeiten in eine moderne, modulare, universelle Treiber-Architektur für Linux/UNIX zu konvertieren (immer noch im Beta-Stadium). Dieses Projekt unterstützt derzeit 437 Modelle.
HPIJS ein freies Software-Projekt von HP, um Unterstützung für die firmeneigenen Modelle anzubieten (sehr ausgereift, der Druck ist in den meisten Fällen perfekt und bietet volle Photo-Qualität). Dieses Projekt unterstützt derzeit 369 Modelle.
Gimp-Print ein freies Software-Projekt, das von Michael Sweet (auch ein führender CUPS-Entwickler)begonnen wurde und jetzt von Robert Krawitz geleitet wird. Es hat ein erstaunliches Level von Photo-Druck-Qualität erreicht (viele Epson-Anwender schwören, dass die Qualität besser ist als die der Epson-Treiber für Microsoft-Plattformen). Dieses Projekt unterstützt derzeit 522 Modelle.
Linuxprinting.org ist heute der One-Stop-Shop(((?))), um Druckertreiber herunterzuladen. Suchen Sie nach Drucker-Informationen und Tutorials, oder lösen Sie Probleme in den populären Foren. Dieses Forum ist nicht nur für GNU/Linux-Anwender, sondern auch für Admins kommerzieller UNIX-Systeme, und das ziemlich neue Mac OS X-Forum wurde innerhalb einiger weniger Wochen zu einem der meistfrequentierten Foren.
Linuxprinting.org und die Foomatic-Treiber-Wrapper um Ghostscript sind nunmehr eine Standard-Werkzeug-Kette für das Drucken in allen wichtigen Distributionen. Die meisten haben auch CUPS darunter integriert. Während in den letzten Jahren die meisten Drucker-Daten von Kamppeter (der für Mandrake arbeitet) hinzugefügt wurden, kamen viele andere Beiträge von Leuten bei SuSE, Red Hat, Conectiva, Debian und anderen. Hersteller-Neutralität ist ein wichtiges Ziel des Foomatic-Projekts.
Till Kamppeter von MandrakeSoft leistet in seiner Freizeit hervorragende Arbeit, um Linuxprinting.org und Foomatic zu pflegen. Wenn Sie diese oft nutzen, senden Sie ihm doch bitte eine kleine Mail, um Ihre Anerkennung zu zeigen.
Die Foomatic-Datenbank ist selbst ein erstaunliches Stück Raffiniertheit. Sie enthält nicht nur die Drucker- und Treiber-Informationen, sondern ist auf eine Art organisiert, dass sie PPD-Dateien ad hoc aus ihren internen, auf XML basierenden Datensätzen generieren kann. Während diese PPDs der Adobe-Spezifikation für PostScript Printer Descriptions (PPDs) entsprechen, betreiben Linuxprinting.org/Foomatic-PPDs normalerweise keine PostScript-Drucker. Sie werden verwendet, um all die Features zu beschreiben, die Sie auf jedem beliebigen Gerät verwenden können. Der hauptsächliche Trick ist eine zusätzliche Zeile, die nicht von der Adobe-Spezifikation beachtet wird und mit dem Schlüsselwort *cupsFilter beginnt. Sie teilt dem CUPS-Daemon mit, wie er mit der PostScript-Druckdatei weiter verfahren soll (ältere Foomatic-PPDs benannten das cupsomatic-Filter-Skript, während die neueren PPDs foomatic-rip aufrufen). Dieses Filter-Skript ruft Ghostscript auf dem Host-System auf (die empfohlene Variante ist ESP Ghostscript), um die erforderliche Arbeit zu tun. foomatic-rip weiß, welchen Filter oder welche interne Geräte-Einstellung es von Ghostscript verlangen muss, um den PostScript-Druckauftrag in ein Rasterformat zu wandeln, das passend für das Zielgerät ist. Diese Verwendung von PPDs, um die Optionen von Nicht-PS-Druckern zu beschreiben, war eine Erfindung der CUPS-Entwickler. Der Rest ist einfach. GUI-Werkzeuge (wie KDEs wunderbares kprinter oder gtklp von GNOME, xpp und das CUPS-Web-Interface) lesen das PPD genauso und verwenden diese Information, um die verfügbaren Einstellungen dem Benutzer anzubieten, genauso wie eine intuitive Menü-Auswahl.
Hier sind die erforderlichen Schritte, um einen von foomatic-rip betriebenen LaserJet 4 Plus-kompatiblen Drucker in CUPS zu installieren. (Beachten Sie, dass aktuelle Distributionen von SuSE, UnitedLinux und Mandrake möglicherweise mit einem kompletten Package von Foomatic-PPDs geliefert werden, plus dem Werkzeug foomatic-rip. Der Besuch von Linuxprinting.org stellt sicher, dass Sie die aktuellsten Treiber und PPD-Dateien haben.)
Öffnen Sie Ihren Browser, und besuchen Sie die Linuxprinting.org-Druckerlisten-Seite.
Sehen Sie sich die komplette Liste von Druckern in der Datenbank an..
Wählen Sie Ihr Modell, und klicken Sie auf den Link.
Sie landen auf einer Seite, die alle funktionierenden Treiber für dieses Modell auflistet (es gibt für alle Drucker zumindest einen empfohlenen Treiber. Probieren Sie den zuerst aus).
In unserem Fall (HP LaserJet 4 Plus) landen wir beim Standard-Treiber für den HP-LaserJet 4 Plus.
Der empfohlene Treiber ist ljet4.
Verschiedene Links werden hier angeboten. Sie sollten sie alle besuchen, falls Sie noch nicht mit der Linuxprinting.org-Datenbank vertraut sind.
Es gibt einen Link auf die Datanbank-Seite für ljet4. Auf der Seite des Treibers finden Sie wichtige und detaillierte Informationen, wie Sie den Treiber mit den verschiedenen Spoolern verwenden können.
Ein weiterer Link führt Sie auf die Homepage des Treibers oder dessen Autors.
Wichtige Links sind diejenigen, die Ihnen Hinweise und Anleitungen zu CUPS, PDQ, LPD, LPRng und GNUlpr geben, genauso wie zu PPR oder „spooler-freiem“ Drucken.
Sie können das PPD in Ihrem Browser mit folgendem Link ansehen: http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&printer=HP-LaserJet_4_Plus&show=1
Und das Wichtigste ist: Sie können das PPD auch generieren und herunterladen.
Das PPD enthält all die Informationen, um unseren Drucker und den Treiber zu verwenden; sobald es installiert ist, arbeitet es für den Anwender transparent. Sie brauchen später nur noch die Auflösung, das Papierformat usw. aus dem Web-basierenden Menü, dem Druck-GUI-Dialog oder auf der Befehlszeile auswählen.
Wenn Sie auf der Treiber- Seite angelangt sind, können Sie den „PPD-O-Matic“-Online-PPD-Generator verwenden.
Wählen Sie das genaue Modell aus, wählen Sie Download oder Display PPD file, und klicken Sie auf Generate PPD file.
Wenn Sie die PPD-Datei aus der Broswer-Ansicht speichern, verwenden Sie bitte nicht Cut and Paste (da dies eventuell die Zeilenenden und Tabulatoren beschädigt, was das PPD eventuell daran hindert, seine Pflicht zu erfüllen), sondern verwenden Sie aus dem Menü Ihres Browsers. (Am besten ist die Verwendung der Option Download direkt auf der Webseite).
Ein weiterer interessanter Teil jeder Treiber-Seite ist der Button . Wenn Sie Ihr Druckermodell wählen und diesen Button klicken, wird eine komplette Ghostscript-Befehlszeile angezeigt, die alle verfügbaren Optionen für diese Drucker/Treiber-Kombination aufzählt. Dies ist eine gute Möglichkeit, „Ghostscript durch Anwendung zu erlernen“. Es ist außerdem ein hervorragender Spickzettel für alle erfahrenen Anwender, die eine gute Befehlszeile für irgendein verdammtes Druck-Skript rekonstruieren müssen, sich aber nicht mehr an die exakte Syntax erinnern.
Irgendwann während Ihres Besuchs bei Linuxprinting.org speichern Sie Ihre PPD-Datei unter einem passenden Platz auf Ihrer Festplatte, sagen wir /pfad/zu/ihrer.ppd. (Wenn Sie es vorziehen, Ihre Drucker unter Verwendung des CUPS-Web-Interface zu installieren, speichern Sie das PPD in /usr/share/cups/model/ und starten CUPS neu.)
Dann installieren Sie den Drucker mit einer entsprechenden Befehlszeile, wie dieser:
root# lpadmin -p laserjet4plus -v parallel:/dev/lp0 -E \ -P pfad/zu/mein-drucker.ppd
Für alle neuartigen „Foomatic-PPDs“ von Linuxprinting.org brauchen Sie auch den speziellen CUPS-Filter namens foomatic-rip.
Das foomatic-rip-Perl-Skript selbst gibt ziemlich interessanten Lesestoff ab, da es durch Kamppeters Inline-Kommentare gut dokumentiert ist (sogar Nicht-Perl-Hacker werden einiges über das Drucken lernen, wenn sie es lesen).
Speichern Sie foomatic-rip entweder direkt in /usr/lib/cups/filter/foomatic-rip oder sonstwo in Ihren $PATH (und vergessen Sie nicht, es für alle ausführbar zu setzen). Verwenden Sie auch hier nicht Cut and Paste, sondern verwenden Sie den entsprechenden Link oder den Menü-Eintrag Ihres Browsers.
Wenn Sie foomatic-rip in Ihrem $PATH speichern, legen Sie einen Symlink an:
root# cd /usr/lib/cups/filter/ ; ln -s `which foomatic-rip'
CUPS wird diesen neu verfügbaren Filter beim Neustart von cupsd entdecken.
Sobald Sie in eine Queue drucken, die mit dem Foomatic-PPD installiert wurde, fügt CUPS die entsprechenden Befehle und Kommentare in die resultierende PostScript-Datei ein. foomatic-rip kann diese lesen und mit ihnen umgehen, und verwendet einige speziell codierte Foomatic-Kommentare, die in die Auftragsdatei eingebettet sind. Diese werden wiederum dazu verwendet (transparent für Sie, den Anwender), um die komplizierte Ghostscript-Befehlszeile zu konstruieren, die dem Druckertreiber exakt mitteilt, wie die ausgegebenen Rasterdaten auszusehen haben und welche Druckerbefehle in den Datenstrom einzubetten sind. Sie brauchen:
Eine „foomatic+irgendwas“-PPD aber das ist nicht genug, um mit CUPS zu drucken (es ist nur eine wichtige Komponente).
Das foomatic-rip-Filter-Skript (Perl) in /usr/lib/cups/filters/.
Perl, damit foomatic-rip laufen kann.
Ghostscript (weil es, kontrolliert von der Kombination PPD/foomatic-rip, die Hauptarbeit macht), um die passenden Rasterdaten für Ihr Druckermodell zu produzieren.
Ghostscript muss (abhängig von Ihrem Treiber/Modell) Unterstützung für ein bestimmtes Gerät mitbringen, das den gewählten Treiber für Ihr Modell repräsentiert (wie von gs -h gezeigt).
foomatic-rip braucht eine neue Version PPDs (PPD-Versionen für cupsomatic funktionieren nicht mit foomatic-rip).
Es gibt oft Nachfragen bezüglich Druck-Quota, durch die Samba-Benutzer (also Windows-Clients) nicht mehr als eine bestimmte Anzahl von Seiten oder Datenmenge pro Tag, Woche oder Monat drucken dürfen sollen. Dieses Feature hängt vom eingesetzten Drucksystem ab. Sambas Aufgabe ist es, die Druckaufträge von den Clients zu empfangen (gefiltert oder ungefiltert) und diese an das Drucksystem weiterzugeben.
Natürlich könnte man sich so etwas mit seinen eigenen Skripten zusammenbauen. Aber es gibt CUPS. CUPS unterstützt Quota, die anhand der Auftragsgröße, der Anzahl der Seiten oder beidem festgelegt werden können und jede zeitliche Periode umspannen können, die Sie festlegen wollen.
Dies ist ein Beispiel, wie root ein Druck-Quotum in CUPS einrichten könnte, unter der Annahme, dass es einen Drucker namens „quotadrucker“ gibt:
root# lpadmin -p quotadrucker -o job-quota-period=604800 \ -o job-k-limit=1024 -o job-page-limit=100
Dies würde jeden einzelnen Benutzer darauf beschränken, 100 Seiten oder 1024 KB (was auch immer zuerst eintrifft) innerhalb der letzten 604800 Sekunden (entspricht einer Woche) zu drucken.
Damit CUPS richtig zählt, muss die Druckdatei durch den CUPS-pstops-Filter laufen; ansonsten verwendet es einen Ersatzwert von „eins“. Manche Druckdateien passieren diesen Filter nicht (z.B. Bilddateien), jedoch sind diese ohnehin meist einseitige Aufträge. Das bedeutet: Aufträge von proprietären Treibern (die auf den Clients laufen), die von CUPS/Samba als „raw“ weitergegeben werden (also ohne Filterung), werden auch als einseitige Aufträge gezählt!
Sie müssen PostScript von den Clients senden (d.h., dort einen PostScript-Treiber ausführen), um eine Chance auf korrekte Abrechnung zu bekommen. Wenn der Drucker ein Nicht-PS-Modell ist, müssen Sie CUPS die Wandlung der Auftragsdatei in ein druckfertiges Format für den Zieldrucker durchführen lassen. Dies funktioniert derzeit für ungefähr eintausend verschiedene Druckermodelle. Linuxprinting hat eine Treiber- Liste.
Vor CUPS 1.1.16 hatten Sie nur diee Option, den Adobe-PostScript-Treiber auf den Windows-Clients zu verwenden. Die Ausgabe dieses Treibers wurde auf der Seite von CUPS/Samba nicht immer durch den pstops-Filter geschleust und daher auch nicht korrekt gezählt. (Das lag daran, dass oft, abhängig vom verwendeten PPD, ein PJL-Header vor das tatsächliche PostScript gesetzt wurde, was CUPS zum Überspringen von pstops veranlasste und es direkt zum pstoraster-Schritt brachte).
Seit CUPS 1.1.16 können Sie den CUPS-PostScript-Treiber für Windows NT/200x/XP-Clients verwenden (der im Download-Bereich von http://www.cups.org/ als cups-samba-1.1.16.tar.gz zu finden ist). Er funktioniert nicht für Windows 9x/ME-Clients, garantiert jedoch:
Sie können mehr über das Setup dieser Kombination in der Manpage für cupsaddsmb lesen (die nur vorhanden ist, wenn CUPS installiert ist, und nur aktuell seit CUPS 1.1.16 ist).
CUPS protokolliert in page_log für jede Seite eines Auftrags folgende Punkte:
Druckername
Benutzername
Auftrags-ID
Die Zeit des Drucks
Die Seitenzahl
Die Anzahl der Kopien
Einen Informations-String für die Verrechnung (optional)
Den Host, der den Auftrag gesendet hat (seit Version 1.1.19)
Hier sehen Sie einen Auszug aus der Datei page_log meines CUPS-Servers, um das Format und die enthaltenen Begriffe zu illustrieren:
tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 1 3 #marketing 10.160.50.13 tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 2 3 #marketing 10.160.50.13 tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 3 3 #marketing 10.160.50.13 tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 4 3 #marketing 10.160.50.13 Dig9110 boss 402 [22/Apr/2003:10:33:22 +0100] 1 440 finance-dep 10.160.51.33
Dies war die Auftrags-ID 401, die auf tec_IS2027 vom Benutzer kurt gedruckt wurde: ein 64-Seiten-Auftrag, der in 3 Kopien gedruckt, #marketing in rechnung gestellt und von der IP-Adresse 10.160.50.13. gesendet wurde. Der nächste Auftrag hatte die ID 402, wurde vom Benutzer boss von der IP-Adresse 10.160.51.33 gesendet, druckte von einer Seite 440 Kopien und soll finance-dep in Rechnung gestellt werden.
Welche Mängel gibt es bei diesem Quota-System?
Die oben genannten (falsch protokollierter Auftrag im Fall von Drucker-Hardware-Ausfall usw.).
In Wirklichkeit zählt CUPS die Auftragsseiten, die in der Software verarbeitet werden (also durch den RIP gehen), und nicht die physischen Seiten, die den Drucker verlassen. Daher wird der Seitenzähler, wenn es bei der ersten von tausend Seiten einen Papierstau gibt, der den Drucker zum Abbruch des Auftrags zwingt, nach wie vor auf 1000 Seiten für diesen Auftrag stehen.
Alle Quota sind dieselben für alle Benutzer (es ist keine Flexibilität vorhanden, um dem Boss ein höheres Quotum als dem Angestellten zu geben), und es gibt keine Unterstützung für Gruppen.
Keine Möglichkeit, um die momentane Balance oder den „verbrauchten“ Anteil des aktuellen Quotums auszulesen.
Ein Benutzer, der 99 Seiten eines 100-Seiten-Quotums verbraucht hat, ist nach wie vor imstande, einen 1000-Seiten-Auftrag zu senden und zu drucken.
Ein Benutzer, dem ein Auftrag abgelehnt wird, da er sein Quotum erreicht hat, bekommt keine verständliche Fehlermeldung von CUPS außer „client-error-not-possible“.
Dies ist das beste derzeit verfügbare System, und es gibt bedeutende Verbesserungen, die in Entwicklung für CUPS 1.2 sind:
Die Seitenzählung wird in die Backends verlagert (diese reden direkt mit dem Drucker und erhöhen den Zähler synchron mit dem tatsächlichen Druckvorgang; daher wird ein Papierstau bei der fünften Seite auch den Zähler bei fünf stoppen).
Quota werden flexibler behandelt werden.
Möglicherweise wird es Unterstützung dafür geben, dass sich Benutzer schon vorab über ihre Konten informieren können.
Vielleicht gibt es dann auch eine Unterstützung für andere Werkzeuge zu diesem Thema.
Eine Druckerqueue mit keinem assoziierten PPD ist ein „raw“-Drucker, und alle Dateien gehen direkt an den Drucker, sobald sie vom Spooler empfangen werden. Die Ausnahme sind die Dateien vom Typ application/octet-stream, die das Feature pass-through aktiviert haben müssen. „Raw“-Queues führen überhaupt keine Filterung durch, sie geben die Datei direkt an das CUPS-Backend weiter. Dieses Backend ist dafür verantwortlich, die Daten an das Gerät zu senden (wie in der „device URI“-Notation: lpd://, socket://, smb://, ipp://, http://, parallel:/, serial:/, usb:/ und so weiter).
cupsomatic/Foomatic sind keine nativen CUPS-Treiber, und sie werden nicht mit CUPS geliefert. Sie sind ein Dritthersteller-Zusatz, der auf Linuxprinting.org entwickelt wird. Als solches sind sie ein brillanter Hack, um alle Modelle (angetrieben von Ghostscript-Treibern/Filtern in traditionellen Spoolern) auch via CUPS zu betreiben, und zwar mit derselben Qualität (gut oder schlecht!) wie in diesen anderen Spoolern. cupsomatic ist nur ein Hilfsmittel, um an dieser Stelle in der CUPS-Filterkette eine Ghostscript-Befehlszeile auszuführen, wo normalerweise der native CUPS-Filter pstoraster „anspringen“ würde. cupsomatic übergeht pstoraster, nimmt die Druckdatei von CUPS in Beschlag und leitet sie durch Ghostscript um. CUPS akzeptiert das, weil die zugeordnete cupsomatic/foomatic-PPD Folgendes angibt:
*cupsFilter: „application/vnd.cups-postscript 0 cupsomatic“
Diese Zeile bewegt CUPS dazu, die Datei an cupsomatic zu übergeben, sobald es sie erfolgreich in den MIME-Typ application/vnd.cups-postscript umgewandelt hat. Diese Umwandlung erfolgt nicht für Aufträge von Windows, die automatisch als application/octet-stream typisiert werden, (((mit den begleitenden Änderungen in /etc/cups/mime.types -- Bezug?))).
CUPS ist weitgehend konfigurierbar und flexibel, sogar was seinen Filtermechanismus betrifft. Ein weiterer „Workaround“ in manchen Situationen wäre es, Einträge in /etc/cups/mime.types zu haben, wie folgt:
application/postscript application/vnd.cups-raw 0 - application/vnd.cups-postscript application/vnd.cups-raw 0 -
Dies würde verhindern, dass jegliche PostScript-Dateien gefiltert werden (sie werden dann eigentlich durch den virtuellen Filter nullfilter gefiltert, bezeichnet mit „-“). Das könnte nur für PS-Drucker hilfreich sein. Wenn Sie PS-Code auf Nicht-PS-Druckern drucken wollen (sofern diese ASCII-Textdruck beherrschen), könnte ein Eintrag wie dieser helfen:
*/* application/vnd.cups-raw 0 -
Er schickt alle Dateien ohne weitere Bearbeitung an das Backend weiter.
Sie könnten den folgenden Eintrag haben:
application/vnd.cups-postscript application/vnd.cups-raw 0 \ my_PJL_stripping_filter
Sie werden einen mein_PJL_entfernungs_filter schreiben müssen (dies könnte ein Shell-Skript sein), der die PS-Daten analysiert und das unerwünschte PJL entfernt. Dies muss konform zum CUPS-Filter-Design passieren (vor allem muss es die Parameter Druckername, Job-ID, Benutzername, Jobtitle, Kopien, Druckoptionen und eventuell den Dateinamen empfangen und weitergeben). Der Filter wird als für alle ausführbar in /usr/lib/cups/filters/ installiert und wird von CUPS aufgerufen, wenn es einen MIME-Typen application/vnd.cups-postscript erkennt.
CUPS kann mit -o job-hold-until=indefinite umgehen. Das hält den Auftrag in der Queue auf Stillstand. Er wird nur auf manuelle Veranlassung des Druck-Operators gedruckt. Dies ist eine Anforderung in vielen Reproduktionsabteilungen, wo ein paar wenige Operatoren die Aufträge von vielen hundert Benutzern auf irgendeiner großen Maschine verwalten, wo keinem Benutzer direkter Zugriff gestattet ist (wo z.B. die Operatoren das richtige Papier laden müssen, bevor sie den 10.000-Seiten-Auftrag starten, der vom Marketing für das Mailing eingetroffen ist, usw.).
Samba-Druckdateien durchlaufen zwei Spool-Verzeichnisse. Eines ist das Eingangsverzeichnis, das von Samba verwaltet wird. (Es ist im Parameter path = /var/spool/samba im Abschnitt [printers] von smb.conf festgelegt). Das andere ist das Spool-Verzeichnis Ihres UNIX-Drucksystems. Für CUPS ist das normalerweise /var/spool/cups/, das in der Anweisung RequestRoot /var/spool/cups in der Datei cupsd.conf gesetzt ist.
Einige wichtige Parameter in der CUPS-Konfigurationsdatei cupsd.conf sind:
Dies belässt einige Details von Aufträgen im „Gedächtnis“ von cupsd (es hält die Dateien c12345, c12346 usw. im CUPS-Spool-Verzeichnis, die einen ähnlichen Job machen wie die altmodischen BSD-LPD-Kontrolldateien). Der voreingestellte Wert dieses Parameters ist „Yes“.
Das belässt die Auftragsdateien selbst im „Gedächtnis“ von cupsd (es hält die Dateien d12345, d12346 etc. im CUPS-Spool-Verzeichnis). Der voreingestellte Wert dieses Parameters ist „No“.
Diese Anweisung kontrolliert die maximale Anzahl von Aufträgen, die im Speicher gehalten werden. Sobald die Anzahl der Aufträge das Limit erreicht, wird der älteste abgeschlossene Auftrag automatisch aus dem System entfernt, um Platz für den neuen zu machen. Wenn alle Aufträge nach wie vor in Schwebe oder aktiv sind, wird der neue Auftrag abgelehnt. Setzt man dieses Maximum auf 0, wird diese Funktionalität deaktiviert. Der voreingestellte Wert dieses Parameters ist 0.
(Es gibt auch noch zusätzliche Einstellungen für MaxJobsPerUser und MaxJobsPerPrinter...)
Damit alles so funktioniert wie besprochen, brauchen Sie drei Dinge:
Von Zeit zu Zeit taucht die Frage auf, wie man von Samba auf einen Windows-Drucker druckt. Normalerweise erfolgt die lokale Verbindung vom Windows-Rechner zum Drucker via USB- oder Parallel-Kabel, aber das macht Samba nichts aus. Hier muss nur eine SMB-Verbindung zum Windows-Rechner geöffnet werden. Natürlich muss der Drucker zuvor freigegeben werden. Wie Sie bereits gelernt haben, verwendet CUPS Backends, um mit den Druckern und anderen Servern zu kommunizieren. Um mit unter Windows freigegebenen Druckern zu kommunizieren, müssen Sie das Backend smb (was für eine Überraschung!) verwenden. Prüfen Sie, ob es dieses im CUPS-Backend-Verzeichnis gibt. Dieses liegt üblicherweise in /usr/lib/cups/backend/. Sie sollten dort eine Datei namens smb vorfinden. Diese sollte ein Symlink auf smbspool sein, und diese Datei muss existieren und ausführbar sein:
root# ls -l /usr/lib/cups/backend/ total 253 drwxr-xr-x 3 root root 720 Apr 30 19:04 . drwxr-xr-x 6 root root 125 Dec 19 17:13 .. -rwxr-xr-x 1 root root 10692 Feb 16 21:29 canon -rwxr-xr-x 1 root root 10692 Feb 16 21:29 epson lrwxrwxrwx 1 root root 3 Apr 17 22:50 http -> ipp -rwxr-xr-x 1 root root 17316 Apr 17 22:50 ipp -rwxr-xr-x 1 root root 15420 Apr 20 17:01 lpd -rwxr-xr-x 1 root root 8656 Apr 20 17:01 parallel -rwxr-xr-x 1 root root 2162 Mar 31 23:15 pdfdistiller lrwxrwxrwx 1 root root 25 Apr 30 19:04 ptal -> /usr/sbin/ptal-cups -rwxr-xr-x 1 root root 6284 Apr 20 17:01 scsi lrwxrwxrwx 1 root root 17 Apr 2 03:11 smb -> /usr/bin/smbspool -rwxr-xr-x 1 root root 7912 Apr 20 17:01 socket -rwxr-xr-x 1 root root 9012 Apr 20 17:01 usb root# ls -l `which smbspool` -rwxr-xr-x 1 root root 563245 Dec 28 14:49 /usr/bin/smbspool
Wenn der Symlink nicht existiert, legen Sie ihn an:
root# ln -s `which smbspool` /usr/lib/cups/backend/smb
smbspool wurde von Mike Sweet (von den CUPS-Leuten) geschrieben. Es ist in Samba enthalten. Es kann auch zum Drucken auf andere Subsysteme als CUPS verwendet werden, um Aufträge an Windows-Druckfreigaben zu spoolen. Um den Drucker winprinter unter CUPS einzurichten, müssen Sie einen Treiber dafür haben. Prinzipiell bedeutet das, dass die Druckdaten auf dem CUPS/Samba-Rechner in ein für den Drucker verdaubares Format gewandelt werden müssen (der Windows-Rechner ist unfähig, irgendwelche von Ihnen gesendete Daten zu konvertieren). Das bedeutet auch, dass Sie imstande sein sollten, auf den Drucker zu drucken, wenn er direkt an den CUPS/Samba-Rechner angeschlossen wäre. Das ist es auch, was Sie zur Fehlersuche tun sollten, um zu prüfen, ob dieses Glied der Verarbeitungskette intakt ist. Dann fahren Sie damit fort, die Netzwerk-Verbindung/Authentifikation zum/am Windows-Rechner zu prüfen, usw.
Um einen Drucker mit dem Backend smb unter CUPS zu installieren, verwenden Sie diesen Befehl:
root# lpadmin -p winprinter -v smb://WINDOWSNETBIOSNAME/printersharename \ -P /path/to/PPD
Das PPD muss imstande sein, CUPS anzuweisen, die Druckdaten für das Zielgerät zu generieren. Für PS-Drucker verwenden Sie einfach das PPD, das mit dem Windows NT-PostScript-Treiber verwendet würde. Aber was machen Sie, wenn der Drucker nur mit einem Passwort zugänglich ist? Oder wenn der Drucker-Server Mitglied einer anderen Arbeitsgruppe ist? Dafür wurde vorgesorgt: Sie können die erforderlichen Parameter als Teil der smb:// Geräte-URI angeben:
Beachten Sie, dass die Geräte-URI in der Prozessliste des Samba-Servers sichtbar ist (d.h., wenn jemand den Befehl ps -aux unter Linux verwendet), sogar wenn der Benutzername und die Passwörter bereinigt werden, bevor sie in die Logfiles geschrieben werden. Also ist dies eine inhärent unsichere Option, jedoch ist es die einzige. Verwenden Sie dies nicht, wenn Sie Ihre Passwörter schützen wollen. Geben Sie besser den Drucker so frei, dass man kein Passwort benötigt! Das Drucken wird nur funktionieren, wenn Sie eine funktionierende Netbios-Namensauflösung haben. Beachten Sie, dass dies eine Eigenschaft von CUPS ist und Sie nicht notwendigerweise smbd laufen lassen müssen.
Die folgenden Diagramme „enthüllen“, wie CUPS mit Druckaufträgen umgeht.
Für Windows 9x/ME benötigen die Clients Druckernamen, die maximal acht Zeichen lang sind (oder „8 plus 3 Zeichen Suffix“); andernfalls werden die Treiberdateien nicht übertragen, wenn Sie sie von Samba herunterladen wollen.
Verwenden Sie security = user? Haben Sie smbpasswd verwendet, um root ein Samba-Konto zu geben? Sie können zwei Dinge tun: ein anderes Terminal öffnen und smbpasswd -a root ausführen, um das Konto anzulegen und im ersten Terminal damit fortfahren, das neue Passwort dort einzugeben. Oder Sie brechen die Schleife ab, indem Sie zweimal ENTER drücken (ohne zu versuchen, ein Passwort einzugeben).
Wenn der Fehler „tree connect failed: NT_STATUS_BAD_NETWORK_NAME“ lautet, haben Sie vielleicht vergessen, das Verzeichnis /etc/samba/drivers anzulegen.
Die Verwendung von „cupsaddsmb“ führt zur Meldung „No PPD file for printer...“, obwohl die Datei vorhanden ist. Was kann das Problem sein?
Haben Sie die Drucker-Freigabe in CUPS aktiviert? Das heißt, haben Sie einen Abschnitt <Location /printers>....</Location> in der Datei cupsd.conf Ihres CUPS-Servers, die dem Host, von dem aus Sie „cupsaddsmb“ auszuführen versuchen, den Zugriff erlaubt? Es könnte ein Problem sein, wenn Sie cupsaddsmb übers Netz oder mit dem Parameter -h verwenden: cupsaddsmb -H sambaserver -h cupsserver -v printername.
Ist die Anweisung TempDir in cupsd.conf auf einen gültigen Wert gesetzt und schreibbar?
Verwenden Sie smbstatus, um zu prüfen, welcher Benutzer Sie aus der Sicht von Samba sind. Haben Sie die Rechte, um in die Freigabe [print$] zu schreiben?
Sobald Sie als falscher Benutzer verbunden sind (z.B. als nobody, was oft geschieht, wenn Sie map to guest = bad user gesetzt haben), wird der Windows Explorer es nicht akzeptieren, wenn Sie sich als ein anderer Benutzer anzumelden versuchen. Nicht ein Byte wird zu Samba übertragen werden, aber Sie werden immer noch eine dumme Fehlermeldung sehen, die Sie glauben lässt, dass Samba den Zugriff verweigert hat. Verwenden Sie smbstatus, um nach aktiven Verbindungen zu sehen. Killen Sie die PIDs. Sie können sich noch immer nicht neu verbinden und bekommen die gefürchtete Meldung You can't connect with a second account from the same machine, sobald Sie es versuchen. Und Sie sehen kein einziges Byte bei Samba ankommen (sehen Sie sich die Logs an; verwenden Sie „ethereal“), das einen neuerlichen Verbindungsversuch anzeigt. Schließen Sie alle Explorer-Fenster. Das lässt Windows vergessen, was es in seinem Speicher als aufgebaute Verbindungen gepuffert hat. Dann verbinden Sie sich neu als der „richtige“ Benutzer. Die beste Methode ist es, ein DOS-Terminal-Fenster zu verwenden und zuerst net use z: \\GANDALF\print$ /user:root auszuführen. Überprüfen Sie mit smbstatus, dass Sie mit einem anderen Konto angemeldet sind. Jetzt öffnen Sie den Folder Drucker und Faxgeräte (auf dem Samba-Server in der Netzwerkumgebung), klicken Sie mit der rechten Maustaste auf den betreffenden Drucker und wählen
Sie sehen per smbstatus, dass Sie als der Benutzer nobody angemeldet sind; dabei wollen Sie root sein oder printer admin. Das kommt eventuell von map to guest = bad user, das Sie stillschweigend unter dem Gästekonto angemeldet hat, als Sie (vielleicht unabsichtlich) einen falschen Benutzernamen angegeben haben. Entfernen Sie map to guest, wenn Sie dies vermeiden wollen.
Diese Information stammt aus einem Posting in der Mailing-Liste, das Probleme beim Upgrade von den Adobe-Treibern auf die CUPS-Treiber auf Microsoft Windows NT/200x/XP-Clients beschrieb.
Löschen Sie zuerst alle alten Drucker, die die Adobe-Treiber verwenden. Dann löschen Sie alle alten Adobe-Treiber. (Unter Windows 200x/XP klicken Sie mit der rechten Maustaste in den Hintergrund des Ordners Drucker und Faxgeräte, wählen , Treiber und löschen hier die alten Drucker).
Verwenden Sie den „nackten“ root-Benutzernamen? Versuchen Sie es so: cupsaddsmb -U DOMAINNAME\\root -v druckername (Beachten Sie die beiden Backslashes: der erste wird benötigt, um das „escaping“ des zweiten zu bewirken.)
Das Löschen eines Druckers auf dem Client löscht nicht gleichzeitig den Treiber (zur Überprüfung rechtsklicken Sie in den Hintergrund des Ordners Drucker und Faxgeräte und wählen , Treiber). Dieselben alten Treiber werden wiederverwendet, wenn Sie versuchen, einen Drucker mit demselben Namen zu installieren. Wenn Sie auf einen neuen Treiber aktualisieren wollen, löschen Sie zuerst die alten. Das Löschen ist nur möglich, wenn kein anderer Drucker denselben Treiber verwendet.
Lokale Sicherheitsrichtlinien können eventuell die Installation unsignierter Treiber verhindern. Sie können sogar generell die Installation von Druckertreibern verbieten.
Windows XP behandelt SMB-Drucker auf einer „per-user“-Basis. Das bedeutet, dass jeder Benutzer den Drucker selbst installieren muss. Um einen Drucker zu haben, der für jeden verfügbar ist, möchten Sie vielleicht die integrierten IPP-Client-Fähigkeiten von Windows XP nutzen. Fügen Sie einen Drucker mit dem Druck-Pfad http://cupsserver:631/printers/druckername hinzu. Wir suchen nach wie vor nach einer Lösung dieses Problems. Vielleicht könnte ein Anmelde-Skript automatisch Drucker für alle Benutzer installieren.
For print change, notify functions on NT++ clients.(((übersetzen))) Diese müssen zuerst den Server-Dienst ausführen. (In XP wurde er in Datei- & und Druckerfreigabe für Microsoft-Netzwerke umbenannt).
Win XP-SP1 führte eine Point-and-Print-Beschränkungsrichtlinie ein (diese Beschränkung gilt nicht für die Benutzergruppen „Administrator“ oder „Power User“). Im Gruppenrichtlinien-Editor gehen Sie auf . Diese Richtlinie ist automatisch aktiviert und auf Benutzer können Point and Print nur für Computer in der eigenen Gesamtstruktur verwenden gesetzt. Sie müssen dies eventuell auf Deaktiviert oder Point and Print nur mit folgenden Servern setzen, um Treiber-Downloads von Samba zu ermöglichen.
Wie machen Sie das? Ich wette, auf die falsche Art (es ist auch nicht einfach herauszufinden). Es gibt drei verschiedene Arten, Sie zu einem Dialog zu bringen, der scheinbar all diese Dinge setzen kann. Alle drei Dialoge sehen gleich aus, jedoch tut nur einer das, was Sie beabsichtigen. Sie müssen Administrator oder Druck-Administrator sein, um dies für alle Benutzer tun zu können. Hier sehen Sie, wie ich das in XP mache:
Die erste falsche Art:
Öffnen von Drucker und Faxgeräte.
Rechtsklick auf den Drucker (netzwerkdrucker auf cupshost) und Auswahl von im Kontextmenü.
Sehen Sie sich diesen Dialog genau an, und versuchen Sie, sich genau zu merken, wie er aussieht.
Die zweite falsche Art:
Öffnen von Drucker und Faxgeräte.
Rechtsklick auf den Drucker (netzwerkdrucker auf cupshost) und Auswahl von im Kontextmenü.
Klick auf Allgemein.
Klick auf
Ein neuer Dialog öffnet sich. Halten Sie diesen Dialog geöffnet, und gehen Sie zurück zum ersten Dialog.
Die dritte und richtige Art:
Öffnen von Drucker und Faxgeräte.
Klick auf Erweitert. (Wenn alles „grau ist“, dann sind Sie nicht als Benutzer mit ausreichenden Rechten angemeldet).
Klicken Sie auf den Button .
Auf irgendeiner der beiden erscheinenden „Karteikarten“ klicken Sie auf den Button .
Ein neuer Dialog öffnet sich. Vergleichen Sie ihn mit dem anderen, identisch aussehenden aus Variante „A“ oder „B“.
Sehen Sie irgendeinen Unterschied? Ich auch nicht. Wie auch immer: Nur der letzte Dialog, zu dem Sie nach Befolgung von Variante „C“ gelangt sind, wird all die Einstellungen dauerhaft speichern und zu Voreinstellungen für neue Benutzer machen. Wenn Sie wollen, dass alle Clients dieselben Voreinstellungen erhalten, müssen Sie diese Schritte als Administrator (printer admin in smb.conf) durchführen, bevor ein Client den Treiber herunterlädt (die Clients können später ihre per-user-Standards setzen, indem sie die obigen Prozeduren A oder B befolgen).
Verwenden Sie nicht Optimize for Speed, sondern verwenden Sie stattdessen Optimize for Portability (Adobe-PS-Treiber). Verwenden Sie nicht Page Independence: No, sondern verwenden Sie immer Page Independence: Yes (Microsoft PS-Treiber und CUPS-PS-Treiber für Windows NT/200x/XP). Wenn es irgendwelche Probleme mit Schriften gibt, verwenden Sie Download as Softfont into printer (Adobe-PS-Treiber). Wählen Sie für TrueType Download Options Outline. Verwenden Sie PostScript Level 2, wenn Sie Probleme mit einem Nicht-PS-Drucker haben und Sie die Wahl haben.
Symptom: Der letzte Befehl von cupsaddsmb schließt nicht erfolgreich ab. Wenn cmd = setdriver printername printername NT_STATUS_UNSUCCESSFUL zurückgibt, dann wurde der Drucker eventuell noch nicht erfolgreich von Samba erkannt. Erscheint er in der Netzwerkumgebung? In rpcclient hostname -c `enumprinters'? Starten Sie smbd neu (oder senden Sie ein kill -HUP an alle von smbstatus angezeigten Prozesse), und versuchen Sie es erneut.
Haben Sie aus Versehen das CUPS-Spool-Verzeichnis auf dasselbe Verzeichnis gesetzt (RequestRoot /var/spool/samba/ in cupsd.conf oder path im Abschnitt [printers] in smb.conf)? Diese Verzeichnisse müssen unterschiedlich sein. Setzen Sie RequestRoot /var/spool/cups/ in cupsd.conf und path = /var/spool/samba im Abschnitt [printers] von smb.conf. Andernfalls wird cupsd die Berechtigungen seines Spool-Verzeichnisses bei jedem Neustart bereinigen, und das Drucken wird nicht verlässlich funktionieren.
In diesem Fall schluckt eine Druck-Queue namens „lp“ periodisch Aufträge und spuckt komplett andere Dinge aus, als an sie gesendet wurden.
Es ist eine schlechte Idee, irgendeinen Drucker „lp“ zu nennen. Das ist der traditionelle UNIX-Name für den Standard-Drucker. CUPS kann so eingerichtet werden, dass es automatisch „Implicit Classes“ anlegt. Das bedeutet, alle Drucker mit demselben Namen zu einem Geräte-Pool zu gruppieren und eine Lastverteilung unter ihnen nach der „Round-robin“-Methode durchzuführen. Die Wahrscheinlichkeit, dass jemand anderes auch einen Drucker namens „lp“ hat, ist hoch. Es kann sein, dass Sie seine Aufträge empfangen und Ihre Aufträge an seinen Drucker senden. Um strenge Kontrolle über die Druckernamen zu haben, setzen Sie BrowseShortNames No. Das stellt jeden Drucker als druckername@cupshost dar und gibt Ihnen einen besseren Überblick darüber, was in einem großen Netzwerk passieren kann.
Verwenden Sie smbclient, um sich mit irgendeiner Windows-Maschine mit einem freigegebenen PS-Drucker zu verbinden: smbclient //windowsbox/print\$ -U guest. Sie können ins Unterverzeichnis W32X86/2 vordringen, um mittels mget ADOBE* die Dateien zu erhalten, oder ins Verzeichnis WIN40/0. Eine andere Möglichkeit ist es, die Dateien als *.exe-Package von der Adobe-Website herunterzuladen.
Einen vollständigen Überblick über die CUPS-Druckprozesse erhalten Sie im nächsten Flussdiagramm(((abbildungsnummer?))).
Seit Erst-Veröffentlichung dieses Buches in Englisch haben die Samba-Versionen 3.0.1 bis 3.0.7 wichtige Aktualisierungen und Änderungen erfahren. Die Entwickler beseitigten verschiedene Fehler und schlossen Sicherheitslücken. Viele Modifikationen betrafen auch die Druckfunktionen. Hier eine kurze Übersicht:
akzeptiert jetzt die Angabe der Treiber-Version. Dies ermöglicht die kontrollierte Installation von 'Kernel Mode'- und 'User Mode'-Druckertreibern. (Änderung seit 3.0.1)
Beispiel:
root# rpcclient localhost -N \
-U'root%secret' \
-c 'adddriver „Windows NT x86“ \
„infotec_2105:cupsdrv5.dll:infotec_2105.ppd:\
cupsui5.dll:cups5.hlp:NULL:RAW:NULL“ \
2'
ist jetzt nicht mehr 'globaler', sondern 'service level'-Parameter. Dies erlaubt mehr Flexibilität und eine bequemere Verwirklichung eigener Druckbefehle ('print command' in smb.conf), unterschiedlich pro Druckerwarteschlange. (Änderung seit 3.0.3)
Beispiel:
printing = sysv
erlaubt die Angabe von Druckoptionen wie z.B '-o raw' ohne in die Konfiguration des CUPS-Servers eingreifen zu müssen. (neuer Parameter seit 3.0.3)
Beispiel:
cups options = 'raw,media=a4,job-sheets=secret,secret'
legt das Zeitintervall in Sekunden fest, in dem Samba die 'printcap' nach neu hinzugekommenen (oder gelöschten) Druckerwarteschlangen untersucht. (neuer Parameter seit 3.0.6)
Beispiel:
printcap cache time = 60
ermöglicht die Zuordnung eines anderen Namens zu einer Druckerwarteschlange. Dieser Name wird den Windows-Clients gezeigt (Unix-Benutzer sehen den ursprünglichen Namen). (neuer Parameter seit 3.0.6)
Beispiel:
root# rpcclient localhost -N \
-U'root%secret' \
-c 'setprintername cups_printer „Drucker für Gruppe Marketing“'
Beispiele:
cups server = 10.160.61.60 cups server = cups2.domain.com
ist ein neues Migrationstool seit 3.0.3 zum zeitsparenden Klonen und Transfer von Windows-Druckertreibern von einem (Windows- oder Samba-)Printserver zu einem anderen. (neu enthalten seit 3.0.3)
nähere Erläuterungen siehe unten.
Dieses Kommando versuchte in den Versionen vor Samba-3.0.1 automatisch zu erkennen, welchen Druckertreiber-Typ es installieren sollte: Version '2' oder Version '3'. Seit 3.0.1 können Sie die Version explizit angeben.
Windows NT kennt nur die sogenannten 'Version 2'-Treiber. Diese laufen im Kernel-Modus und installieren sich in das Unterverzeichnis '2' der [print]-Freigabe. 'Version 2'-Drucertreiber können wegen ihrer Ausführung im Kernelmodus das komplette Windows-System mit in den Abgrund ziehen, wenn sie abstürzen. Besonders berüchtigt sind hier manche Billigdrucker-Treiber. Hingegen sind dies Adobe- wie auch die Microsoft-PostScript-Treiber der 'Version 2' gut getestet. Sie machen bekanntermassen keinerlei Schwierigkeiten, obwohls sie (auch unter 2K/XP) im Kernelmodus laufen.
Mit Windows 2000 führte Microsoft die 'Version 3'-Treiber ein. Diese laufen im 'Userspace-Modus'. Ein Treiberproblem bringt deshalb nicht mehr den kompletten Rechner zum Absturz. (Windows 2000 und XP können allerdings die älteren 'Version 2'-Treiber in einem 'Kompatibiltätsmodus' ausführen. Dies ist allerdings nur bedenkenlos für die Adobe- oder Microsoft-PS-Treiber zu empfehlen. Falls Sie die Wahl haben, wählen Sie immer die 'Version 3'-Treiber. Diese laufen allerdings nicht auf Windows NT Workstations. Ein Samba-Printserver, der NT-Clients zu bedienen hat, muss die 'Version 2'-Treiber vorrätig halten, damit sie per 'Point'n'Print' installierbar sind.
Der 'rpcclient adddriver' Befehl hat eine leicht geänderte Syntax. Als letzten Parameter übergeben Sie ihm jetzt die Treiber-Version. '3' für Win2000/XP, '2' für WinNT und '0' für Win95/98/ME.
Gehen Sie bei der Verwendung des 'rpcclient adddriver' sorgfältig vor. Falls Sie die falsche Versionsnummer ('2' oder '3') angeben, ist der Treiber nicht installierbar. Im besten Falle erhalten Sie sofort eine Fehlermeldung. Im weniger günstigen Fall ernten Ihre Anwender die Meldung (((?))) und können den Treiber nicht per 'Point'n'Print' installieren. Und im schlimmsten Fall installiert sich der Treiber zwar auf die Clients, funktioniert jedoch nicht oder bringt diese zum Absturz.
CUPS verschafft Ihnen einige Annehmlichkeiten, die andere Drucksysteme nicht bieten können. Innerhalb von Samba erspart es Ihnen sogar die Angabe eines 'print command = ....'-Eintrags in der smb.conf. Denn CUPS macht das automatisch richtig...
Mit 'printing = cups' legen Sie in pre-3.0.3-Versionen global fest, dass Ihr Samba-Server CUPS verwenden soll. Dieses gilt dann für alle Drucker und Druckerwarteschlangen.
Da viele Administratoren jedoch gerne einige 'Spezialdrucker' verwenden wollen, die einen eigenen Druckbefehl erfordern, war diese Einschränkung zu unflexibel. Insbesondere die vielen im Umlauf befindlichen 'Virtuellen PDF-Drucker', die mit Hilfe von Ghostscript ihren Windows-Clients PDF-Dateien erzeugen und diese dem Anwender ins eigene Verzeichnis wieder ablegen, waren dadurch nicht ohne 'Klimmzüge' mit CUPS zu verwenden.
Seit 3.0.3 können Sie jeder Druckerwarteschlange ihre eigene Einstellung zuordnen. Denn 'printing = ....' ist jetzt ein sogenannter 'service level'-Paramter, und kein 'globaler' mehr.
Sie können aber nach wie vor 'printing = cups' in die [global]-Sektion der smb.conf schreiben. (Sie dürfen alle 'service level' Paramter in den Rang eines globalen befördern -- Sie dürfen nur nicht globale Parameter in den service leveln ((()))? verwenden). Ein 'printing = cups' Eintrag in der [global]-Sektion gilt automatisch für alle Drucker -- solange für den Drucker nicht ein anderes Drucksystem spezifiziert wird.
Beispiel:
[global]
printing = cups
printcap name = cups
load printers = yes
[printers]
comment = Alle Drucker
path = /var/spool/samba
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root, @ntadmins
[PDF-Printer]
printing = bsd
comment = PDF creator
path = /var/tmp
printable = Yes
print command = /usr/bin/smbprngenpdf -J '%J' -c %c -s %s -u '%u' -z %z
create mask = 0600
Wie Sie sehen, definieren wir zwar in der [global]-Sektion mit 'printing = cups' und 'load printers = yes' eine Einstellung definieren. ((( voriger Abschnitt unverständlich))) Dies bewirkt, dass wie bisher alle CUPS-Drucker von Samba automatisch gefunden und verwendet werden. Für diese Drucker braucht Samba kein 'print command'. Darüber hinaus definieren wir eine spezielle Druckerfreigabe namens 'PDF-Printer'. Für diese verwenden wir einen selbst-gestrickten Druckbefehl, den wir Samba auch mitteilen. ('smbprngenpdf' ist ein Bash-Script, das in neueren SuSE-Versionen integriert ist. Es setzt das Utility ps2pdf von Ghostscript ein, um PDFs aus PostScript zu generieren. Sie können mit demselben Mechanismus jederzeit ihre eigenen Skripte in das CUPS-/Samba-System einbinden).
Dieser neue Paramter wird nur wirksam, wenn zugleich 'printing = cups' (für dieselbe Druckfreigabe) gesetzt ist. 'cups options' ist ebenfalls ein service level Parameter. (((auszeichnen?)))
Sein Wert kann einer beliebigen Kombination von Druckoptionen bestehen. Diese Optionen übergibt Samba direkt an CUPS. Sie dürfen beliebige Optionen aus dem CUPS-Anwenderhandbuch verwenden, oder druckerspezifische, die in der Drucker-PPD definiert sind. Die druckerspezifischen Optionen verrät Ihnen z.B. der Befehl 'lpoptins -p druckername -l' (gilt nicht für 'raw'-Drucker).
Ein Anwendungsfall könnte auch darin bestehen, dass Sie allen Druckjobs eine IPP-Option mitgeben, z.B. 'job-hold-until=indefinite'. Diese bewirkt, dass der Job innerhalb des CUPS-Spoolers auf 'Warten' gesetzt wird, bis eine manuelle Freigabe (z.B. über das CUPS-Webinterface) erfolgt.
Eins andere Möglichkeit: eine Kopfseite ('banner page') die für jeden Anwender unterschiedlich ist und der schnelleren Identifikation der eigenen Druckjobs dient.
Beispiele:
[global]
printing = cups
printcap name = cups
load printers = yes
[printers]
comment = Alle Drucker
path = /var/spool/samba
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root, @ntadmins
[Teurer_Farblaser]
cups options = 'job-hold-until=indefinite'
[Abteilungsdrucker_1]
cups options = 'job-sheets=none,%$USER-banner'
Wie Sie sehen, verwendet der 'Abteilungsdrucker_1' eine Kopfseite, deren Name '%$USER' enthält. Das '%$' veranlasst Samba, nach der Umgebungsvariable '$USER' zu suchen, diese zu expandieren und zu ersetzen. Falls der momentane Anwender 'kpfeifle' heisst, wird dem Job also der Befehl '-o job-sheets=none,kpfeifle-banner' mitgegeben. Sie müsen lediglich dafür sorgen, dass auf Seiten von CUPS nun auch tatsächlich eine Datei namens 'kpfeifle-banner' in '/usr/share/cups/banners/' liegt und druckbar ist....
Bei Verwendung bestimmter Windows-Treiber-Typen (v.a. bei nicht-PostScript-Treibern) müssen (((wer erlaubt ?))) weiterhin in der CUPS-Konfiguration das Drucken 'unbekannter Dateiformate' (also was CUPS als 'application/octet-stream' bezeichnet) erlauben. Sehen Sie hierzu in '/etc/cups/mime.convs' und '/etc/cups/mime.types' nach und entfernen Sie von den entsprechenden Zeilen am Dateiende die Kommentarzeichen. Eine Angabe von 'cups options = raw' in der smb.conf alleine reicht hierfür nicht aus!
Dieser Parameter steuert, wie häufig Samba die Datei printcap einliest, um nachzuschauen, ob sich in der Druckerliste Änderungen ergeben haben. Die Voreinstellung ist 'printcap cache time = 0'. Sie verhindert, dass Samba zur Laufzeit die printcap neu einliest. Ein CUPS neu hinzugefügter Drucker ist somit für Samba nicht sofort nutzbar. Wollen Sie diesen trotzdem 'sehen' und nutzen (ohne Samba komplett neu starten zu wollen), müssen Sie allen smbd-Prozessen ein 'HUP'-Signal schicken: 'kill -HUP `pidof smbd`'.
Um eine fortlaufende automatische Aktualisierung der Samba-Druckerliste zu erzwingen,sollten Sie einen Wert in Sekunden eintragen, etwa 'printcap cache time = 60'. Damit stellen Sie sicher, dass alle neuen CUPS-Drucker nach spätestens 1 Minute in Samba ebenfalls sichtbar sind.
Dieses neue 'rpcclient' Sub-Kommando verleiht einem Unix-Drucker einen neuen Künstlernamen für seinen Auftritt in der Windows-Welt.
Dies ist z.B. dann nützlich, wenn Sie Ihren Anwender künftig mit einem Samba-Printserver dienen wollen, ohne sie von den gewohnten Windows-Namen für Drucker (die unter Umständen Leerzeichen enthalten können) entwöhnen zu müssen.
Dieser neue Parameter erlaubt es Ihnen erstmals, Samba- und CUPS-Server auf zwei verschiedenen Maschinen laufen zu lassen. 'cups server = ....' ist ein Paramter, der nur in der [global]-Sektion auftauchen darf.
Weiterhin können Sie damit verschiedenen „virtuellen Samba-Daemons“ unterschiedliche CUPS-Druckserver zuordnen, etwa nach Arbeitsgruppen getrennt.
Zum Einsatz mit verschiedenen CUPS-Servern für unterschiedliche virtuelle smbd-Prozesse müssen Sie diesen Parameter daher per 'include' in die jeweilige smb.conf einbinden. Näheres lesen Sie bitte in den Manual-Seiten der smb.conf nach.
Mit dem 'VampireDriverFunctions' hat ein neues Migrationstool in die Samba-Scriptsammlung Einzug gehalten. Dieses ist aus der Not geboren: der Autor hatte die berufliche Aufgabe, im Kundenauftrag einen Windows-NT-Printserver auf eine stärkere Maschine unter Windows XP Professional (!) zu migrieren.
Kein Problem, sagen Sie? Die Praxis sah anders aus:
Der Autor nahm sich vor, einer solchen Aufgabe nie wieder unvorbereitet gegenübertreten zu müssen. Er schrieb das Script 'VampireDriverFunctions'. Dieses verwendet Samba's Befehle rpcclient'- und smbclient, nebst einigen Unix-Utilities wie 'sed', 'awk', 'sort' 'uniq' und einigen anderen, um von einem bestehenden (Samba- oder Windows-)Printserver die Treiberdateien abzusaugen und in einer Verzeichnisstruktur geordnet abzulegen.
Das Skript funktioniert so gut, dass (in einem anderen Fall) die ähnlich grosse Aufgabe, 78 Druckertreiber von einem Server auf einen anderen zu übertragen, bereits nach 23 Minuten erledigt war. (Dieses Mal ging die Migration allerdings nicht von WinNT nach WinXP, sondern Richtung Linux/Samba ;-) )
'VampireDriverFunctions' selbst ist modular aufgebaut und in verschiedene Funktionen gegliedert.
Bedenken Sie, dass 'VampireDriverFunctions' nicht die Druckerwarteschlangen installiert. Diese müssen nach wie vor mit Hilfe des CUPS-'lpadmin'-Befehls (oder entsprechend anderen Methoden) angelegt werden. Auch ordnet das Skript keine der frisch installierten Windows-Treiber den entsprechenden CUPS-Druckerwarteschlangen zu. Dies bleibt einer Serie von 'rpcclient ...setdriver...'-Befehlen vorbehalten. Allerdings ist dies selbst bei einer Zahl von mehr als hundert Druckern innerhalb von 2 Stunden erledigt, wenn erstmal die Treiber in der [print$]-Share bevorratet sind.
'VampireDriverFunctions' ist selbstdokumentierend. Starten Sie es mit dem Befehl 'source VampireDriverFunctions' in einer Bash-Shell. Die Shell liest jetzt die beinhalteten Funktionen ein und listet sie auf:
NOTE: run the listed functions in the same order as listed below.
EXAMPLE: „knoppix@ttyp6[knoppix]$ helpwithvampiredrivers“
HELP: the „--help“ parameter prints usage hints regarding a function.
EXAMPLE: „knoppix@ttyp6[knoppix]$ fetchenumdrivers3listfromNThost --help“
function vampiredrivers_readme()
function enumallfunctions()
function helpwithvampiredrivers()
function fetchenumdrivers3listfromNThost() # repeat, if no success at first
function createdrivernamelist()
function createprinterlistwithUNCnames() # repeat, if no success at first
function createmapofprinterstodrivers()
function splitenumdrivers3list()
function makesubdirsforW32X86driverlist()
function splitW32X86fileintoindividualdriverfiles()
function fetchallW32X86driverfiles()
function uploadallW32X86drivers()
function makesubdirsforWIN40driverlist()
function splitWIN40fileintoindividualdriverfiles()
function fetchallWIN40driverfiles()
function uploadallWIN40drivers()
Jede dieser Funktionen zeigt Ihnen an, wie sie zu benutzen ist und welche Voraussetzungen Sie schaffen müssen, damit Sie sie erfolgreich ausführen können. Um z.B. die Hilfe für die Funktion 'createdrivernamelist()' zu sehen, geben Sie bitte 'createdrivernamelist --help' ein. Führen Sie jedoch bitte zuerst den Befehl 'vampiredrivers_readme' aus.
Dabei werden Sie erfahren, dass das Script 6 zusätzliche Parameter einlesen muss: die beiden Rechnernamen (Quelle und Ziel), sowie die beiden Benutzernamen und die Passwörter. Als Variablen sind diese mit $nthost, $ntprinteradmin und $ntadminpasswd (für den Quellrechner) sowie $smbhost, $smbprinteradmin und $smbadminpasswd (für den Zielrechner) bezeichnet. (Anmerkung: auf dem 'Zielrechner' brauchen Sie Rechte als 'Druck-Administrator').
Diese Funktion holt erstmal eine komplette Liste aller auf dem Quellserver vorrätigen Treiber samt der zugehörigen Treiberdateien. (Achtung, eventuell müssen Sie diese Funktion mehrmals ausführen, da des öfteren die erste Verbindungsaufnahme zum Quellrechner nicht klappt). Diese Liste wird lokal als Datei $nthost/enumdrivers3list abgespeichert.
Die nächste Funktion ist eine Hilfsfunktion. Sie arbeitet auf der soeben gewonnenen Datei mit den Treiberinformationen des Quellservers. Sie extrahiert aus diese Informationen eine Treibernamens-List.
Eine weitere Hilfsfunktion zerlegt die Komplettliste in separate Teile für 'Version 2' und 'Version 3' Treiber.
Dieser Schritt legt für jeden Treiber und jede Version ('2' oder '3') ein eigenes Unterverzeichnis an, und zwar unterhalb des aktuellen Arbeitsverzeichnisses..
Hier wird pro Treiber eine Liste aller zugehörigen Dateien angelegt mitsamt den 'UNC-Pfaden', wo sie auf dem Quellserver gespeichert sind.
Jetzt wird es wieder Ernst: anhand der zuvor geschaffenene Listen, holt dieses Funktion jetzt mittels smbclient die einzelnen Treiberdateien ab und speichert sie erstmal in der lokalen Verzeichnisstruktur ab.
Zuletzt werden die zuvor gewonnenen Treiberdateien auf den Zielserver hochgeladen. Für die Datenübertragung kommt wieder smbclient zum Einsatz, die Ernennung zu richtigen Windowstreibern nimmt abschliessend rpcclient vor.
Für die Treiber der 'WIN40'-Architektur (also für Win95/98/ME) sind anologe Funktionen vorhanden.
Wenn Sie die aufgelisteten Funktionen jetzt nacheinander manuell ausführen, holen Sie die Treiber von einem Server A (Samba oder Windows, in dem Skript allerdings immer als '$nthost' bezeichnet) und laden diese Anschliessend auf Server B (Samba oder Windows, im Skript jeweils '$smbhost') hoch. Sie können dies leicht in einem sehr einfachen Skript automatisieren. Dieses muss zuerst die 'VampireDriverFunctions' einlesen ('sourcen') sowie die Parameter für Quell- und Ziel-Rechner und anschliessend einfach die betreffenden Funktionen nacheinander aufrufen::
#!/bin/bash $nthost=„10.11.12.13“ # adapt to your own environment $ntprinteradmin=Administrator # adapt to your own environment $ntadminpasswd=secret # adapt to your own environment $smbhost=„samba.localdomain.de“ # adapt to your own environment $smbprinteradmin=root # adapt to your own environment $smbdminpasswd=topsecret # adapt to your own environment source VampireDriverFunctions fetchenumdrivers3listfromNThost # repeat, if no success at first createdrivernamelist createprinterlistwithUNCnames # repeat, if no success at first createmapofprinterstodrivers splitenumdrivers3list makesubdirsforW32X86driverlist splitW32X86fileintoindividualdriverfiles fetchallW32X86driverfiles uploadallW32X86drivers
Die Knoppix-CD beinhaltet seit der Release 3.4 (CeBIT 2004) eine funktionierende Vorläufer-Version dieses Scripts. Es trägt hier allerdings den Namen 'print-utils-get-functions.sh'. Sie können dieses Tool auch von der laufenden Knoppix-CD aus benutzen, sollten dabei allerdings genügend Hauptspeider haben, um die Treiber zeitweilig in der RAM-Disk speichern zu können (oder ein 'permanentes Homeverzeichnis für den Benutzer Knoppix' auf der Festplatte einrichten).
'VampireDriverFunctions' finden Sie im Verzeichnis 'examples/printing/' der Samba-Quellen.