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:
- Vorbereitung – Paketinstallation
- CUPS
2.1 Konfiguration
2.2 Einrichtung des Druckers - 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 - 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:
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.
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!
Tolle Anleitung, hat mit meinem OrangePizero perfekt funktioniert; jetzt muss ich nur noch schauen, dass es über den hostapd geht, den ich dafür aufgespannt hab, und nicht nur über Ethernet…
Danke
Vielen Dank für die ausführliche, sorgfältige und präzise Anleitung. Ich hatte mir zwar auch schon einen Cups-Server eingerichtet, aber das hat nur partiell funktioniert und Drucken wurde zur Lotterie. Mit der hier vorgestellten Umsetzung läuft bei mir im Hause endlich alles reibungslos auf sämtlichen Plattformen! Was vielleicht noch hilfreich sein könnte: wie man die cupsd.config so einrichtet, das man auch von einem beliebigen Rechner aus auf das Konfigurations-Webinterface zugreifen kann, falls man den Raspi z.B. standalone betreibt und nur per ssh bedient. Nach erfolgter Einrichtung kann man die Schotten ja wieder dichtmachen…
# Listen on external interfaces for connections
Listen :631
Listen /var/run/cups/cups.sock
# Show shared printers on the local network.
Browsing On
BrowseOrder allow,deny
BrowseAllow all
BrowseAddress All
# Default authentication type, when authentication is required…
DefaultAuthType Basic
# Restrict access to the server…
Order allow,deny
Allow localhost
Allow All
# Restrict access to the admin pages…
Order allow,deny
Allow All
# Restrict access to configuration files…
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow All
Danke für die ausführliche Beschreibung, mit der eine schnelle Umsetzung eines Druckservers für meinen alten ML-1610 ohne Probleme funktioniert hat. Bei dem Punkt mit der Bereitstellung des Druckertreibers erhalte ich allerdings den Fehler „sudo: cupsaddsmb: command not found“, dessen Ursache ich im Moment noch nicht ausfindig machen konnte.
Sehr schöne Anleitung. das mit dem Benutzer root würde ich auf jeden Fall empfehlen zu ändern. Da die Interaktion von einem Windows Rechner kommt, ist es ein erhebliches Sicherheitsrisiko. Ansonsten: klasse gemacht ohne nerviges Geschwafel (was ist cups, was ist samba, was ist linux) 🙂