CUPS Printserver für alte Drucker einrichten

Zur Erleichterung der Arbeit habe ich einen Cups Printserver eingerichtet, welcher einen etwas älteren Samsung Drucker (ML1610) ansteuert. Eine der Anforderungen an mich selbst war dabei, den Printserver so einzurichten, dass von jeglichen Systemen (iOS, Android, Windows, Linux) gedruckt werden kann.

Was ich dazu alles einrichten musste und auf welche Probleme ich gestoßen bin, werde ich in diesem Artikel erläutern.

Die Anleitung kann selbstverständlich auch für andere Drucker genutzt werden, jedoch sollte gerade bei den spezifischen Druckertreibern für Cups und für Samba darauf geachtet werden, dass die richtigen Pakete genutzt werden.

Hier noch eine kleine Übersicht, in welche Teile ich den Artikel gegliedert habe:


  1. Vorbereitung – Paketinstallation
  2. CUPS
    2.1 Konfiguration
    2.2 Einrichtung des Druckers
  3. Samba
    3.1 Konfiguration
    3.2 Automatisiertes bereitstellen der Druckertreiber
     3.2.1 Download des Treibers
     3.2.2 Treiber in Samba einrichten
     3.2.3 Fehlerbehebung Windows 0x000006d1
     3.2.4 Fehlerbehebung Windows 0x00000057
  4. Abschluss

Die Anleitung scheint auf den ersten Blick eventuell etwas lang, jedoch kann der komplette dritte Schritt (Samba) weggelassen werden, wenn man den Drucker nur zum Drucken von iPhone, Android, Linux oder MacOS Systemen nutzen möchte. Die Pakete für Samba müssen dann in diesem Fall auch nicht installiert werden.

1. Vorbereitung – Paketinstallation

Zu Beginn müssen cups und samba installiert werden. Cups stellt den Printserver an sich bereit und Samba ist später für die Kommunikation zwischen Cups und Windows Clients zuständig. (Die Abfrage, ob der WINS-Support aktiviert werden soll, kann an dieser Stelle verneint werden.)

sudo apt install cups samba smbclient

In meinem Fall musste noch das folgende Paket installiert werden, welches die nötigen Treiber für Samsung Drucker liefert.

sudo apt install printer-driver-splix

Damit der Drucker später automatisch von z.B. iPhones oder Android Smartphones gefunden werden kann, sollte sichergestellt sein, dass das Paket „avahi-daemon“ installiert ist. Auf meinem komplett neu installierten Raspbian 10 war dies der Fall.

pi@raspberrypi:~ $ dpkg -l | grep avahi
 ii  avahi-daemon                   0.7-4+b1                            armhf        Avahi mDNS/DNS-SD daemon
 ii  libavahi-client3:armhf         0.7-4+b1                            armhf        Avahi client library
 ii  libavahi-common-data:armhf     0.7-4+b1                            armhf        Avahi common data files
 ii  libavahi-common3:armhf         0.7-4+b1                            armhf        Avahi common library
 ii  libavahi-core7:armhf           0.7-4+b1                            armhf        Avahi's embeddable mDNS/DNS-SD library
 ii  libavahi-glib1:armhf           0.7-4+b1                            armhf        Avahi GLib integration library

2. CUPS

2.1 Konfiguration

Um Cups an sich zum laufen zu bekommen, sind ein paar Handlungsschritte notwendig gewesen. Dies begann dabei, einen Benutzer zur Gruppe „lpadmin“ hinzuzufügen. In meinem Fall der Benutzer „pi“, da ich das ganze an einem Raspberry Pi einrichtete und der Benutzer bereits erstellt war.

sudo usermod -a -G lpadmin pi 

Anschließend musste die Konfigurationsdatei von Cups angepasst werden. Hierzu habe ich den folgenden Teil meiner Config Datei unter /etc/cups/cupsd.conf angepasst. Den Rest habe ich nicht umkonfiguriert.

.......


# Only listen for connections from the local machine.
Listen 631
Listen /run/cups/cups.sock

# Show shared printers on the local network.
Browsing On
BrowseLocalProtocols dnssd

# Default authentication type, when authentication is required…
DefaultAuthType Basic

# Web interface setting…
WebInterface Yes

# Restrict access to the server…
<Location />
  Order allow,deny
  Allow from 192.168.178.*
</Location>

# Restrict access to the admin pages…
<Location /admin>
  Require user @SYSTEM
  Order allow,deny
  Allow from 192.168.178.*
</Location>

# Restrict access to configuration files…
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
</Location>


.......

Kurz zur Erklärung der Config:

  • Im ersten Block wird festgelegt, dass die Weboberfläche für Netzwerke, in denen sich der Pi befindet, unter dem Port 631 verfügbar sein soll.
  • Der zweite Block gibt Cups an, wie er seine geteilten Drucker präsentieren soll und ob er sie präsentieren soll. Um den Drucker später von iPhones oder Android Geräten zu erreichen, muss der Block wie bei mir konfiguriert sein.
  • Im 3. und 4. Block wird lediglich festgelegt, welcher Authentifizierungs-Typ genutzt werden soll und ob ein Webinterface zur Verfügung stehen soll. Die Optionen müssten aber auch in der Standard-Config wie bei mir gesetzt sein.
  • Der 5. Block sorgt dafür, dass jeder Client aus dem Netz 192.168.178.0 mit dem Cups Server kommunizieren kann. Sollte euer Netz ein anderes sein, muss dies entsprechend angepasst werden.
  • Im 6. Block wird allen Clients aus dem Netz Zugriff auf die Admin-Pages des Webinterface gewährt, allerdings müssen sich diese vorher erst mit einem Benutzer authentifizieren, welcher am System angelegt ist. Beispielsweise der Nutzer „pi“.
    Hiermit wird erreicht, dass nicht jeder beliebige Nutzer Änderungen am Cups Server vornehmen kann.
  • Der 7. Block macht im Prinzip das gleiche wie der 6., nur schränkt dieser den Zugriff auf die Konfigurations-Dateien ein und nicht auf das Interface allgemein.

Damit niemand irgendetwas im Webinterface unternehmen kann, habe ich dieses nach Abschluss der Einrichtung komplett gesperrt. (WebInterface no)

Mit einem anschließenden Restart des Cups Daemon wird die Konfiguration wirksam:

sudo systemctl restart cups

2.2 Einrichtung des Druckers

Nachdem die Konfiguration für Cups vorgenommen wurde, war die Weboberfläche von Cups erreichbar. In dieser konnte ich anschließend den Drucker einrichten. Dieser muss selbstverständlich auch per USB mit dem Gerät verbunden sein, auf welchem Cups läuft.

Zu Beginn habe ich die folgende URL aufgerufen:

https://192.168.178.138:631

Es ist sehr unwahrscheinlich, dass ihr die gleiche IP habt, daher müsst ihr hier die IP eures Cups Servers eintragen.

Anschließend sollte eine Web-Oberfläche wie diese erscheinen:

Um nun den Drucker einzurichten habe ich auf den Reiter „Verwaltung“ geklickt. Um auf diese Seite zu gelangen, musste ich, wie eben konfiguriert, die Zugangsdaten eines Systembenutzers eingeben. In meinem Fall der Benutzer „pi“.

Wie ich meinen Drucker konfiguriert habe, werde ich in den folgenden Screenshots zeigen:

Nachdem der Drucker eingerichtet wurde, konnte er bereits durch Linux, Android und iOS Geräte gefunden werden. Das Drucken von Dokumenten funktionierte ab diesem Punkt auch schon ohne Probleme. Mit Windows gestaltete sich dies leider noch etwas komplizierter.

Der Grund dafür, dass die Konfiguration auf allen Systemen ohne Weiteres funktioniert, ist Zeroconf. Im speziellen die Dienste mDNS und dns-SD. Hiermit wird ermöglicht, dass der Drucker im Netzwerk präsentiert wird und es keiner weiteren Konfiguration bedarf um über den Drucker zu drucken.

Leider verstehen sich die Dienste und Windows 10 out of the box gar nicht. Auch mit etwas Recherche und Apple’s „Bonjour“ habe ich es nicht hinbekommen, den Drucker automatisch unter Windows 10 einzurichten.

Sollte einer der Leser es geschafft haben, kann er gerne seine Erfahrungen teilen. Ich habe mich daraufhin entschieden, speziell für die Windows Clients eine Samba Freigabe einzurichten, welche den Drucker repräsentiert und die benötigten Treiber an den Client übermittelt.

Wer niemals mit einem Windows Client über den Printserver drucken wird, kann den folgenden Abschnitt „Samba“ komplett überspringen.

3. Samba

3.1 Konfiguration

Damit Windows den Drucker finden konnte und diesen mit den richtigen Treibern ansteuerte, musste ich Samba zunächst entsprechend konfigurieren.

Hierzu sicherte ich die Original-Konfigurationsdatei von Samba (/etc/samba/smb.conf) und erstellte anschließend eine neue.

sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.old && sudo nano /etc/samba/smb.conf
[global]
    printing = cups
    printcap name = cups
    workgroup = WORKGROUP
    server role = standalone server
    map to guest = bad user
    log level = 0

[printers]
    comment = All Printers
    path = /var/spool/samba
    browseable = yes
    public = yes
    guest ok = yes
    writeable = no
    printable = yes

[print$]
    comment = Printer Drivers
    path = /etc/samba/drivers
    browseable = yes
    guest ok = yes
    read only = yes
    write list = root

Mit einem Neustart der Samba Daemons sorgte ich dafür, dass die neue Konfiguration eingelesen wurde.

sudo systemctl restart {s,n}mbd

Nachdem ich Samba entsprechend konfiguriert habe, konnte ich die Freigabe mit meinem Windows Client zwar bereits finden, wenn ich den Drucker aber ausgewählt habe, konnte ich nicht fortfahren, da ich die entsprechenden Treiber nicht besaß. Auch in dem Auswahlmenü für den Treiber, welches im nächsten Schritt erschien, konnte ich den Treiber nicht finden.

Ich hätte den Treiber an dieser Stelle auch einfach manuell auf jedem Client installieren können und die Einrichtung des Druckers dann erneut starten können. Da dies allerdings keine elegante Lösung ist, habe ich mich zu dem Schritt entschieden, welchen ich im nächsten Abschnitt erläutere.

3.2 Automatisiertes bereitstellen der Druckertreiber

Nach kurzer Recherche fand ich heraus, dass Samba die Funktion bietet, solche Treiber automatisiert für jeden Client bereitzustellen. Da die Einrichtung aufgrund schlechter Dokumentation im Internet etwas tricky war, möchte ich meine Erkenntnisse hier ordentlich dokumentieren.

3.2.1 Download des Treibers

Vor der Durchführung dieses Punktes ist zu beachten, dass dieser Teil sehr spezifisch für Samsung Drucker ist und die Treiber für andere Drucker selbstverständlich von anderen Quellen bezogen werden müssen.

1. Samba benötigt passende PostScript Treiber, welche dem Client übergeben werden können.
Um diese Treiber zu erhalten, installierte ich vorerst die offiziellen Samsung Treiber.

2. Anschließend konnte ich im Pfad „C:\Windows\System32\spool\drivers\x64\3“ vier PostScript Dateien finden. Genau die, die Samba benötigt! (PS5UI.DLL, pscript.hlp, pscript.ntf, PSCRIPT5.DLL)
Aus diesen vier Dateien wird in den nächsten Schritten ein Treiber für alle 64-Bit PC’s erstellt.

Die Dateien für 32-Bit PC’s befinden sich im Pfad „C:\Windows\System32\spool\drivers\W32X86\3„. Da ich meinen Treiber lediglich auf einem 64-Bit System installiert habe, befanden sich auf meinem System nur die 64-Bit Dateien.

3.2.2 Treiber in Samba einrichten

Die Dateien, welche ich durch die Installation des Treibers erhalten habe, musste ich nun auf den Pi kopieren, auf welchem mein Samba Server läuft. Dies kann auf beliebigem Wege erledigt werden. Ich nutzte eine simple SFTP Verbindung per Filezilla, da der SSH Server ohnehin schon lief.

In den nächsten Schritten gehe ich davon aus, dass sich der Benutzer im gleichen Verzeichnis wie die Dateien befindet.

Damit das Programm „cupsaddsmb“ mit den Dateien arbeiten kann, musste ich die Namen noch von Großbuchstaben in Kleinbuchstaben konvertieren.

for i in $( ls | grep [A-Z] ); do mv -i $i echo $i | tr 'A-Z' 'a-z'; done

Nachdem die Dateien umbenannt wurden, konnte ich sie in das Verzeichnis schieben, welches im letzten Schritt von „cupsaddsmb“ konsultiert wird. Das Programm nutzt die Dateien um einen Treiber an Samba zu exportieren.

Wie weiter oben schon erwähnt gibt es Unterschiede bei den Verzeichnissen für 64-Bit und 32-Bit Treiber. An dieser Stelle ist zu beachten, dass Treiber für 64-Bit Systeme in das Verzeichnis „/usr/share/cups/drivers/x64“ und Treiber für 32-Bit Systeme in das Verzeichnis „/usr/share/cups/drivers/“ verschoben werden müssen.

Da das Verzeichnis bei mir noch nicht vorhanden war, musste ich dieses außerdem erstellen, bevor ich die Dateien verschieben konnte.

sudo mkdir -p /usr/share/cups/drivers/x64
sudo mv * /usr/share/cups/drivers/x64

Der nächste Schritt war es, einen Benutzer in Samba einzurichten. Hierbei muss ein Benutzer genommen werden, welcher bereits im System besteht. Ich entschied mich für den Benutzer „root“, da mit diesem später keine Fehler bei der Konfiguration aufgrund von fehlenden Berechtigungen auftreten. Wer hier Sicherheitsbedenken haben sollte, kann auch einen anderen Benutzer wählen.

sudo smbpasswd -a root 

Nachdem ich die genannten Einstellungen in Samba durchgeführt hatte, konnte ich das folgende Kommando ausführen, welches aus meinen PostScript Dateien einen fertigen Treiber an Samba exportiert.

sudo cupsaddsmb -H localhost -U root -a -v

Wenn der Output dem aus meinem Screenshot entspricht, konnte der Treiber erfolgreich erstellt werden.

Anschließend konnte ich erneut versuchen den Drucker an einem Windows Client einzurichten. Im Idealfall sollte automatisch erkannt werden, dass Samba einen passenden Treiber liefern kann und auf Bestätigung sollte dieser eingerichtet werden.

Wenn die Warteschlange angezeigt wird, wurde die Einrichtung erfolgreich durchgeführt

3.2.3 Fehlerbehebung Windows 0x000006d1

Während der finalen Einrichtung bin ich auf einen Fehler mit dem Windows Fehlercode „0x000006d1“ gestoßen. Dieser Fehler geht nicht vom Samba Server aus, sondern hierfür ist der Windows Client verantwortlich.

In den folgenden Screenshots zeige ich, wie dieser Fehler behoben werden kann.

  • Gruppenrichtlinien-Einstellung öffnen (gpedit.msc)
  • Computerkonfiguration > Administrative Vorlagen > Drucker > „Druckaufträge auf dem Server immer wiedergeben“
  • Deaktivieren & Übernehmen

Nachdem die Einstellung übernommen wurde, kann die Einrichtung erneut getestet werden.

Eine weitere Möglichkeit wäre es, einen Registry-Patch der Uni Koblenz zu nutzen. Dieser hat bei mir ebenfalls funktioniert. (https://www.uni-koblenz-landau.de/de/koblenz/GHRKO/faq/drucken/windows8-printerror)

3.2.4 Fehlerbehebung Windows 0x00000057

Dieser Fehler ist bei mir aufgetreten, nachdem ich meine Anleitung mehrfach selbst getestet habe und dabei jeweils den gleichen Namen für den Drucker in Cups angegeben habe.

Indem ich den Drucker in Cups entfernt und unter anderem Namen neu hinzugefügt habe, konnte ich den Fehler umgehen. Die Treiber mussten jedoch nach der Löschung erneut hinzugefügt werden. (sudo cupsaddsmb -H localhost -U root -a -v)

4. Abschluss

Wenn die Installation des Printservers mit Hilfe meiner Anleitung erfolgreich war, freue ich mich, wenn ihr dies in den Kommentaren teilen könntet.

Außerdem bin ich, wie sonst auch immer, offen für Verbesserung oder sonstige Kommentare zu dem beschriebenen Setup.

Viel Spaß beim nachahmen!

4 Comments

Add a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert