5.5. Das CUPS-Drucksystem

Die folgenden Ausführungen geben einen leichten Einstieg in das CUPS Drucksystem. Wollen Sie sich als erfahrener Linux-Benutzer nur mit den wichtigsten Fakten zu CUPS beschäftigen, lesen Sie bitte Abschnitt 5.6. “CUPS Schnelleinstieg”.

5.5.1. Namenskonvention

Mit Client oder Clientprogramm bezeichnet man ein Programm, das gestartet wird, um Druckaufträge an den Drucker-Daemon zu schicken. Ein Drucker-Daemon ist ein lokaler Dienst, um Druckaufträge entgegenzunehmen und weiterzuschicken oder selbst zu verarbeiten. Ein Server ist ein Daemon, der einen oder mehrere Drucker mit den Druckdaten beliefern kann. Jeder Server hat gleichzeitig die Funktionalität eines Daemons. Meist wird weder von Benutzern noch von CUPS-Entwicklern sonderlich zwischen den Begriffen Server und Daemon unterschieden.

5.5.2. IPP und Server

Druckaufträge werden mit CUPS basierten Programmen, wie lpr, kprinter oder xpp, und mit Hilfe des Internet Printing Protocols, kurz IPP, verschickt. IPP ist in den Internet-Standards RFC-2910 und RFC-2911 definiert (siehe http://www.rfc-editor.org/rfc.html). Das IPP ist dem Webprotokoll HTTP ähnlich: gleiche Header, aber unterschiedliche Nutzdaten. Es wird ein anderer, eigener Port 631 zur Kommunikation verwendet, der bei der IANA Internet Authority for Number Allocation registriert wurde.

Die Daten werden an den konfigurierten CUPS-Daemon verschickt, der im Normalfall auch der lokale Server ist. Andere Daemonen können beispielsweise mit Hilfe der Shell-Variable CUPS_SERVER direkt angesprochen werden.

Mit Hilfe der Broadcast-Funktion des CUPS-Daemons können die von ihm lokal verwalteten Drucker dem Netzwerk bekannt gemacht werden (UDP Port 631) und erscheinen dann als Warteschlange an allen Daemons, die diese Broadcast-Pakete empfangen und auswerten dürfen (konfigurierbar). Dies ist vorteilhaft für Firmennetze, weil man so kurz nach dem Start des Rechners alle vorhandene Drucker sehen kann, ohne selbst Hand an die Konfiguration legen zu müssen. Gefährlich ist diese Option, wenn der Rechner mit dem Internet verbunden ist. Bei der Konfiguration der Broadcast-Funktion ist darauf zu achten, dass nur in das lokale Netzwerk gebroadcastet wird, dass der Zugriff nur für das lokale Netzwerk erlaubt ist und dass die öffentliche IP-Adresse für die Internetverbindung nicht im Adressbereich des lokalen Netzwerks liegt. Andernfalls könnten andere Benutzer desselben Internet Service Providers die freigegebenen Drucker sehen und auch benutzen. Außerdem erzeugen die Broadcasts Netzwerk-Traffic, was zusätzliche Kosten bedeuten kann. Man sollte daher immer sicherstellen, dass solche Broadcast-Pakete nicht vom lokalen Drucker ins Internet geschickt werden, z. B. mit Hilfe der paketfilternden SuSE-Firewall (SuSEfirewall2). Um die Broadcasts zu empfangen, muss nichts zusätzlich konfiguriert werden. Nur beim Versenden muss dazu eine Broadcast-Adresse angegeben werden (diese ist z. B. über YaST2 zu konfigurieren).

IPP wird zur Kommunikation zwischen lokalem und remote CUPS-Daemon verwendet (also einem CUPS-Server). Netzwerk-Drucker neuerer Art unterstützen mittlerweile auch IPP. Nähere Informationen dazu findet man auf den Webseiten der Hersteller oder im Handbuch des Druckers. Windows 2000 (und neuer) bietet ebenfalls eine IPP-Unterstützung. Doch leider gab es Probleme mit deren Implementierungsformat. Eventuell sind diese mittlerweile behoben oder können per Service Pack behoben werden.

5.5.3. Konfiguration des CUPS-Servers

Es gibt viele Arten, um unter CUPS Drucker einzurichten und den Daemon zu konfigurieren: mit Kommandozeilentools, YaST2, KDE Control Center, Webinterface, usw. In den folgenden Abschnitten wird nur auf Kommandozeilentools und YaST2 eingegangen. Deshalb im Vorfeld der Hinweis, dass dies nicht die einzigen Möglichkeiten sind.

[Warning]Warnung

Das Webinterface birgt die Gefahr, dass man das Root-Passwort kompromittiert, weil man über das Netzwerk das Root-Passwort im Klartext verschickt, wenn man den Rechnernamen in der URL angibt. Deshalb sollten Sie immer nur http://localhost:631/ verwenden, und auf keinen Fall andere Adressen.

Aus diesem Grund wurde auch der Administrations-Zugriff auf den CUPS-Daemon dahingehend eingeschränkt, dass er nur dann konfiguriert werden kann, wenn er unter localhost angesprochen wird (was identisch zur IP-Adresse 127.0.0.1 ist.) Andernfalls sieht man eine entsprechende Fehlermeldung.

Um lokale Drucker zu administrieren, ist es notwendig, dass ein CUPS-Daemon auf dem lokalen Rechner läuft. Dazu installiert man das cups und die von SuSE generierten PPD-Dateien in den Paketen cups-drivers und cups-drivers-stp. Dann startet man den Server (als root) mit dem Kommando: /etc/rc.d/cups restart. Bei der YaST2-Konfiguration geschieht diese Installation und das Starten implizit durch Auswahl von CUPS als Drucksystem und Installation eines Druckers.

PPD steht für PostScript Printer Description und ist ein Standard, um Druckeroptionen mit PostScript Kommandos zu beschreiben. CUPS benötigt diese zur Drucker-Installation. SUSE LINUX liefert zu vielen Druckern PPD-Dateien mit. Aber auch die Hersteller bieten auf ihren Webseiten und Installations-CDs PPD-Dateien für PostScript-Drucker an (meist im Bereich Installation unter Windows NT).

Der lokale Daemon kann auch mit der Absicht gestartet werden, dass man alle Drucker aller Broadcasting-Server lokal zur Verfügung haben will, obwohl man keine lokalen Drucker hat, d. h. zur Druckerauswahl unter KDE und OpenOffice soll möglichst wenig Aufwand notwendig sein.

Broadcasting konfiguriert man entweder mit YaST2, oder man kann in der Datei /etc/cups/cupsd.conf die Variable Browsing auf On (default) und die Variable BrowseAddress auf einen geeigneten Wert (beispielsweise 192.168.255.255) setzen. Damit auch Druckaufträge angenommen werden, ist zumindest der <Location /printers> oder besser der <Location /> der Empfang zu erlauben. Dazu ist Allow From xyz-host.mydomain zu ergänzen – siehe file:/usr/share/doc/packages/cups/sam.html. Mit dem Befehl /etc/rc.d/cups reload (als root) übernimmt nach dem Bearbeiten der Datei der Daemon diese neue Konfiguration.

5.5.4. Netzwerkdrucker

Unter Netzwerkdrucker versteht man meist Drucker, die ein Printserver-Netzwerkinterface eingebaut haben (wie das HP mit dem JetDirect-Interface anbietet) oder Drucker, die an einer Printserver-Box oder Router-Box mit Printserverfunktionalität angeschlossen wurden. Nicht gemeint sind damit Windows-Rechner, die einen Drucker als Share zur Verfügung stellen. Doch kann man diese auch unter CUPS leicht auf ähnliche Art und Weise ansprechen.

Netzwerkdrucker unterstützen meist das LPD-Protokoll (auf Port 515). Man kann dies mit folgendem Befehl überprüfen:

netcat -z <rechnername>.<domain> 515 && echo ok || echo failed

Wenn dieser Dienst verfügbar ist, kann man ihn mit der Device-URI (CUPS Terminologie) lpd://Server/Queue konfigurieren. Näheres zu den Device-URIs kann man in file:/usr/share/doc/packages/cups/sam.html nachlesen.

Es ist normalerweise besser, wenn man solche Drucker über den eingebauten Port 9100 (HP, Kyocera, u. v. a. m.) oder Port 35 (QMS) anspricht, d. h. ohne vorgeschaltetes LPD-Protokoll. Die Device-URI lautet dann:

socket://Server:Port/

Zum Drucken auf Windows-Druckern, muss das samba-client installiert und Samba richtig konfiguriert sein, d. h. die richtige Workgroup muss gesetzt sein, etc. Die Device-URI für Windows-Rechner kann verschiedene Ausprägungen haben. Die häufigste Form dürfte wohl sein: smb://user:password@host/printer. Für alle anderen Arten siehe file:/usr/share/doc/packages/cups/sam.html und die Manualpage von smbspool.

Ist der Netzwerkdrucker konfiguriert und besitzt man ein kleineres Netzwerk mit mehreren (Linux-)PCs, ist es geschickt, wenn man diesen Netzwerkdrucker nicht mehrfach an allen Clients konfigurieren muss. Deshalb sollte man in diesem Fall die Broadcast-Funktionalität des Daemons einschalten (s. o.). Auch ein Umstellen der Konfigurationen, wie Standardpapiergröße auf Letter, muss nicht an jedem einzelnen Client, sondern nur einmal am Server vorgenommen werden (siehe Abschnitt 5.8.1.4. “Einstellung der Warteschlangen”). Diese Konfigurationen werden zwar lokal gespeichert aber durch die CUPS-Tools, bzw. bedingt durch das IPP-Protokoll, auf den Clients dargestellt.

5.5.5. Interne Auftragsbearbeitung

5.5.5.1. Konvertierung nach PostScript

Im Prinzip kann jeder Dateityp an einen CUPS-Daemon geschickt werden. Die wenigsten Probleme hat man jedoch bei PostScript-Dateien. Eine Konvertierung durch CUPS nach PostScript erfolgt, nachdem der Dateityp anhand von /etc/cups/mime.types identifiziert und dann das entsprechend in /etc/cups/mime.convs angegebene Tool aufgerufen wird. Diese Konvertierung passiert am Server und nicht am Client. Man wollte damit erreichen, dass auf einen Drucker spezialisierte Konvertierungen nur an dem dafür vorgesehenen Server durchgeführt werden können.

5.5.5.2. Accounting

Nach dieser PostScript-Konvertierung wird die Seitenzahl des Druckjobs ermittelt. Dazu startet CUPS das (eigene) Tool pstops (/usr/lib/cups/filter/pstops). Die Seitenzahl des Druckjobs wird nach /var/log/cups/page_log geschrieben. Die Einträge einer Zeile bedeuten:

  • Druckername (beispielsweise lp),

  • Username (beispielsweise root),

  • Job-Nummer,

  • Datumsangabe in eckigen Klammern [],

  • fortlaufende Seite des Jobs,

  • Anzahl der Kopien.

5.5.5.3. Weitere umwandelnde Filter

Außerdem können noch andere Filter aktiv werden, so die entsprechenden Optionen für den Druck gewählt wurden. Besonders interessant sind:

psselect

wenn nur bestimmte Seiten des Dokumentes ausgedruckt werden sollen,

ps-n-up

falls mehrere Dokumentseiten auf ein Blatt gedruckt werden sollen.

Diese Filter können nicht konfiguriert werden. Die Aktivierung der Optionen ist in file:/usr/share/doc/packages/cups/sum.html beschrieben.

5.5.5.4. Druckerspezifische Umwandlung

Im nächsten Schritt wird der Filter gestartet, der notwendig ist, um druckerspezifische Daten zu erzeugen. Diese Filter finden sich unter /usr/lib/cups/filter/. Welcher Filter der richtige ist, ist in der PPD-Datei im Eintrag *cupsFilter festgelegt. Fehlt dieser Eintrag, wird von einem PostScript-fähigen Drucker ausgegangen. Alle geräteabhängigen Druckoptionen, wie Auflösung und Papiergröße, werden in diesem Filter verarbeitet.

Es ist nicht trivial, eigene druckerspezifische Filter zu schreiben; vgl. dazu den SDB-Artikel Selbsterstellte Filter zum Ausdruck mit CUPS (Stichworte: cups + filter).

5.5.5.5. Ausgabe an das druckende Gerät

Schließlich wird das Backend aufgerufen. Dabei handelt es sich um einen speziellen Filter, der Druckdaten auf einem Gerät oder auf einem Netzwerkdrucker ausgibt (siehe /usr/share/doc/packages/cups/overview.html). Das Backend ermöglicht die Kommunikation mit dem Gerät oder dem Netzwerkdrucker (hängt von der in der Installation angegeben Device-URI ab). Ein Backend kann beispielsweise usb sein, dann würde das Programm /usr/lib/cups/backend/usb aufgerufen. Darin wird das USB-Device im Dateisystem geöffnet (und gelockt), vor-initialisiert, und vom Filter kommende Daten weitergeschickt. Am Ende wird das Device initialisiert und im System frei gegeben.

Derzeit gibt es die Backends: parallel, seriell, usb, ipp, lpd, http, socket (aus dem CUPS-Paket), sowie canon und epson (aus cups-drivers-stp), und smb (aus samba-client).

5.5.5.6. Filterlos

Will man die Ausgabe ohne einen Filter ausdrucken, so kann man beim lpr-Kommando die Option -l oder beim lp-Kommando -oraw angeben. Normalerweise funktioniert dann der Ausdruck nicht, weil keine druckerspezifische Umwandlung (siehe oben) erfolgt, oder andere, wichtige Filter nicht zum Einsatz kommen. Bei anderen CUPS-Tools lauten die Optionen ähnlich.

5.5.6. Tipps & Tricks

5.5.6.1. OpenOffice

CUPS wird beim Drucken aus OpenOffice direkt unterstützt, man muss nicht mehr, wie bei StarOffice 5.2, die Drucker einzeln einrichten. OpenOffice erkennt jetzt, ob ein CUPS-Daemon läuft, und fragt diesen selbstständig nach vorhandenen Druckern und Optionen. Eine zusätzliche OpenOffice Konfiguration sollte in Zukunft unnötig sein.

5.5.6.2. Windows

Drucker an einem Windows-Rechner können mit der Device-URI smb://server/printer angesprochen werden – siehe oben. Im umgekehrten Fall, also wenn man von Windows auf einen CUPS-Server drucken möchte, müssen in der Samba-Konfigurationsdatei /etc/samba/smb.conf die Einträge printing = CUPS und printcap name = CUPS gesetzt werden, wie es bei SUSE LINUX voreingestellt ist. Nach Änderungen in /etc/samba/smb.conf muss der Samba-Server neu gestartet werden – siehe dazu file:/usr/share/doc/packages/cups/sam.html

5.5.6.3. Raw-Drucker einrichten

Ein Raw-Drucker kann dadurch eingerichtet werden, dass man die PPD-Datei bei der Installation weglässt, d. h. Filterung und Accounting werden nicht durchgeführt. Dazu müssen die Daten im druckereigenen Datenformat geschickt werden.

5.5.6.4. Eigene Drucker-Optionen

Konfigurationsoptionen (z. B. standardmäßig eine andere Auflösung) können pro Benutzer geändert und gespeichert werden. Die Speicherung erfolgt in der Datei ~/.lpoptions. Wird ein solcher umkonfigurierter Drucker am Server entfernt, ist er weiterhin in den diversen Tools wie kprinter oder xpp sichtbar. Auch dann, wenn er nicht mehr existiert, kann man ihn noch selektieren, was zu Problemen führt. Erfahrene Benutzer können dann die störenden Zeilen problemlos aus ~/.lpoptions mit einem Editor herauslöschen. Siehe dazu auch den Supportdatenbank-Artikel Einstellungen zum Ausdruck mit CUPS sowie den Abschnitt  5.8.1.4. “Einstellung der Warteschlangen”.

5.5.6.5. Kompatibilität zu LPR

CUPS kann auch Druckjobs von LPR-Systemen empfangen. Die nötige Konfiguration in /etc/xinetd.d/cups-lpd kann entweder mit YaST2 erledigt werden oder ist manuell zu machen.

5.5.6.6. Fehlersuche bei CUPS

In der Konfigurationsdatei /etc/cups/cupsd.conf findet sich standardmäßig folgender Abschnitt:

# LogLevel: controls the number of messages logged to the ErrorLog file
#     and can be one of the following:
#
#     debug2    Log everything.
#     debug     Log almost everything.
#     info      Log all requests and state changes.
#     warn      Log errors and warnings.
#     error     Log only errors.
#     none      Log nothing.
#
LogLevel info
     

Zur Fehlersuche bei CUPS setzt man LogLevel debug und lässt den cupsd mit rccups restart die geänderte Konfigurationsdatei neu einlesen. Ab dann finden sich ausführliche Meldungen in /var/log/cups/error_log, die zur Erkennung der Ursache von Problemen dienen.

Mit folgendem Befehl kann man vor einem Test eine Marke ausgeben:

echo "LABEL $(date)" | tee -a /var/log/cups/error_log

Diese Marke wird auch genau so in /var/log/cups/error_log eingetragen, um dort die Meldungen nach dem Test leichter auffindbar zu machen.