Serveur d’impression CUPS sur Raspberry Pi et imprimante HP LaserJet P1006

Mettre mon imprimante laser USB HP LaserJet P1006 en réseau sur mon réseau local en utilisant le Raspberry Pi comme serveur d’impression CUPS (Common Unix Printing System, le système d’impression commun pour les systèmes d’exploitation Unix et assimilés) est un projet que j’avais depuis quelques temps.

J’ai eu les pires difficultés à rendre le dispositif fonctionnel, mais j’ai fini par y arriver : voici comment j’ai procédé.

Pourquoi utiliser la carte Raspberry Pi comme serveur d’impression ?

  • Mon imprimante Laser noir et blanc, qui a quelques années et me donne entière satisfaction, n’est pas dotée nativement de fonctions réseau. C’est une simple imprimante USB prévue pour être connectée à un PC de bureau (desktop) qui tournait à l’origine sous Windows XP.
  • Depuis l’achat de cette imprimante, je me suis doté d’un portable tournant sous Windows Seven, et récemment, un netbook est arrivé dans la maison, auquel il faut rajouter le netbook que j’utilise pour le travail. Le PC auquel était raccordée l’imprimante est désormais passé sous Xubuntu Linux, il est raccordé à un routeur Wifi, lui-même relié à l’internet par une box classique. Le portable et les netbooks se connectent au réseau local via le routeur Wifi. Sur le routeur sont également connectés en Ethernet deux cartes Raspberry Pi, dont une est dédiée à la fois à la musique et à la vidéo, et l’autre sert pour diverses expérimentations.
  • Je n’ai pas eu de difficultés particulières pour installer et faire fonctionner l’imprimante depuis le PC de bureau sous Xubuntu et, jusqu’à présent, lorsque je souhaitais imprimer un document présent sur l’une des autres machines, je le transférais vers le PC de bureau par toutes sortes de moyens compliqués et pas pratiques du tout (copier les documents sur une clé USB, s’envoyer un mail avec les documents en pièce jointe, etc.), ou je débranchais l’imprimante pour la relier à l’un ou l’autre des micros portables tournant sous Windows, pour la rebrancher ensuite. Beaucoup de manipulations, de fils, de clés USB qui traînent, et une solution vraiment pas très élégante.
  • J’ai fini par partager l’imprimante avec les machines du réseau local en configurant le partage dans CUPS sur le PC tournant sous Xubuntu, mais pour imprimer, il fallait que le desktop soit sous tension, et un PC de bureau, ça fait du bruit et ça consomme de l’énergie, surtout quand, travaillant sur une autre machine, on oublie de l’éteindre après avoir imprimé ses documents.

Je cherchais donc une solution :

  • simple à mettre en oeuvre,
  • qui consommerait peu d’énergie,
  • si possible peu coûteuse,
  • et qui soit facile à utiliser par tous les utilisateurs, bidouilleurs ou pas (surtout les pas bidouilleurs, d’ailleurs…) : pas plus d’un bouton à presser pour allumer l’imprimante et la possibilité de lancer une impression depuis n’importe quelle machine connectée au réseau local en Wifi ou en Ethernet.

La carte Raspberry Pi consomme peu d’énergie, peut être raccordée à l’imprimante sur l’un de ses deux ports USB. Je pouvais y installer et configurer CUPS : elle correspondait à mes besoins.

Des messieurs en haut-de-forme assistent à la présentation d'une machine.

« Monsieur le ministre, voici notre dernier modèle de serveur d’impression – Êtes-vous absolument certain qu’il consomme moins d’énergie que la carte Raspberry Pi ? » – Salon de la machine agricole : M. Achille Fould, ministre de l’Agriculture inaugurant l’exposition (1932). Source : Gallica.bnf.fr

Pré-requis

La procédure décrite ici a été testée dans la configuration suivante :

  • Carte Raspberry Pi Modèle B ;
  • Carte SD de 8 Go classe 6 ;
  • Alimentation 5V 1A ;
  • Cable Ethernet relié au routeur (dans mon cas, les données passent par des adaptateurs utilisant la technologie des courants porteurs en ligne – CPL) permettant de connecter la carte Raspberry Pi au réseau local et à l’internet ;
  • Imprimante Laser USB HP LaserJet P1006 et son cable USB.

Installation de base du système sur la carte SD

Pour le système d’exploitation de la carte Raspberry Pi, j’ai choisi la distribution Arch Linux ARM parce que je joue avec depuis un petit moment et qu’elle me plaît bien. Je suis reparti de zéro pour faire les choses proprement, mais je n’exclus pas, à terme, de faire cohabiter CUPS avec d’autres outils et projets.

Je ne reviens pas sur l’installation de base d’Arch Linux ARM que j’ai déjà évoquée en détail.

Je précise juste que par la suite, j’ai eu besoin de créer un utilisateur standard autre que root et d’utiliser sudo, qui ne sont pas préembarqués. J’ai fait l’installation a posteriori, mais il est aussi simple de le faire au début.

Installation et configuration de sudo et adduser :
# pacman -S adduser sudo
puis :
# EDITOR=nano visudo
puis décommenter la ligne commençant par %wheel sous le titre User Priviledges

Création d’un utilisateur standard :
# adduser
L’ajouter au groupe lp et au groupe wheel, ad minima :
# usermod -a -G wheel,lp loginutilisateur

Installation de CUPS

Le paquet nécessaire pour installer un serveur CUPS se trouve dans les dépôts officiels, de même que le paquet ghostscript, également nécessaire. Pour l’installer, ainsi que ses dépendances, il suffit d’un petit coup de pacman :

# pacman -S cups

Configuration de CUPS

Le fichier de configuration de CUPS se nomme cupsd.conf et se trouve dans le répertoire /etc/cups/

# nano /etc/cups/cupsd.conf

J’y ai effectué les modifications suivantes :

Remplacé la ligne :
Listen localhost:631
par
Port 631

Ajouté après ce bloc la ligne suivante :
ServerName : 192.168.0.X
192.168.0.X correspond à l’adresse IP du Raspberry Pi sur lequel j’installe le serveur dans mon réseau local.

Dans les blocs suivants, j’ai ajouté la ligne :
Allow 192.168.0.*
pour donner accès à tous les clients dont l’adresse IP est dans la plage d’adresses du réseau local délivrées par le serveur DHCP de mon routeur :
# Restrict access to the server...
<Location />
Order allow,deny
Allow 192.168.0.*
</Location>

# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow 192.168.0.*
</Location>

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

J’ai fait de même pour toutes les limitations des règles d’accès par défaut, par exemple, j’ai changé :
<Limit Create-Job Print-Job Print-URI Validate-Job>
Order deny,allow
</Limit>

en
<Limit Create-Job Print-Job Print-URI Validate-Job>
Order deny,allow
Allow 192.168.0.*
</Limit>

J’ai ensuite connecté l’imprimante à la carte Raspberry Pi, je l’ai mise sous tension et j’ai démarré CUPS :
# systemctl start cups
Note : pour que le démon démarre en tâche de fond à chaque démarrage de la carte Raspberry, il faut activer le service :
# systemctl enable cups

Ajout de l’imprimante à CUPS

Le reste (ou presque) se passe dans l’interface Web de Cups. Pour y accéder, il faut se rendre avec un navigateur à l’adresse URL :

http://192.168.0.X:631

CUPS ne connaît pas mon imprimante : pour l’ajouter, il faut se rendre dans l’onglet Administration et cliquer sur : Ajouter une imprimante (Add printer).

Pour accéder aux tâches d’administration, il faut s’authentifier (login et mot de passe de l’utilisateur root). Si l’imprimante est branchée au Raspberry Pi, elle doit apparaître dans la liste qui s’affiche alors. Sélectionner l’imprimante voulue puis cliquer sur Continuer. Il faut ensuite donner un nom à l’imprimante et indiquer qu’elle sera partagée en cochant la case appropriée.

Cliquer sur Continuer… et c’est là que mes ennuis ont commencé ! Si tout se passe bien, en choisissant le fabricant de l’imprimante et en cherchant dans la liste le bon modèle, CUPS devrait charger le pilote qu’il faut. Mais avec mon imprimante HP LaserJet P1006, ça ne s’est pas passé comme prévu : ce modèle d’imprimante n’est pas dans la liste.

À la recherche du pilote perdu

Quelques recherches m’ont appris qu’un pilote pour ce modèle d’imprimante HP était disponible : foo2xqx. J’avais installé ce pilote pour raccorder mon imprimante à mon desktop tournant sous Xubuntu Linux et la partager en réseau, après m’être bagarré (sans succès) pour le faire avec hplip. Mais dans les dépôts officiels d’Arch Linux, point de trace de foo2xqx. Ces pilotes sont en fait inclus dans le paquet foo2zjs, disponible dans le dépôt des utilisateurs d’Arch Linux (AUR). Les paquets présents dans AUR sont construits par des utilisateurs mais non endossés par Arch Linux. Lorsqu’un paquet devient populaire et est reconnu comme de qualité, il peut passer d’AUR au dépôt community, mais pour foo2zjs, ce n’est pas encore le cas.

Un homme regarde un samouraï au travers d'une loupe.

« Miyamoto, grand farceur ! J’ai cherché mon pilote partout et maintenant, je suis sûr que vous l’avez caché sous votre kimono pour me taquiner ! »
Source : Library of Congress

Pour bénéficier des pilotes contenus dans foo2zjs (et notamment celui qui semblait adapté à la HP LaserJet P1006), il m’a fallu réaliser moi-même le paquetage et la compilation, car pour des raisons de sécurité et de principe, il n’est pas possible d’installer les paquets du dépôt AUR avec le gestionnaire de paquets embarqué par Arch Linux (pacman).

Séance de paquetage : construire et compiler un paquet du dépôt AUR

Il y a plusieurs solutions pour réaliser le paquetage, mais la première étape consiste à installer les outils de développement qui permettront de bâtir le paquet et de le compiler. Pour cela, il est recommandé d’installer le paquet base-devel.
# pacman -S base-devel --needed
Le drapeau –needed indique à pacman de ne pas réinstaller les paquets cibles qui sont déjà installés (c’est le cas de pacman, de sudo, etc.).

Plusieurs solutions sont ensuite envisageables, mais j’en ai testé deux seulement :

  1. Installer un assistant (helper), comme par exemple yaourt, qui facilite la compilation et l’installation des paquets du dépôt AUR et fonctionne avec une syntaxe très semblable à celle de pacman.
  2. Réaliser la compilation selon la méthode décrite et recommandée par les directives à l’intention des utilisateurs d’AUR
L’AUR sans peine, mais avec yaourt

La première solution présente, en théorie, l’avantage de la facilité à la fois en ce qui concerne l’installation et en ce qui concerne la maintenance du paquet. J’ai tenté cette solution mais je ne suis pas parvenu à réaliser un système fonctionnel de cette manière. Je note à toutes fins utiles quelques éléments.

Yaourt ne se trouve pas dans les dépôts officiels : par principe et pour attirer l’attention des utilisateurs sur les risques que présente l’installation sans précautions de paquets provenant d’AUR, les assistants AUR ne sont pas reconnus comme faisant partie intégrante de la distribution officielle d’Arch Linux. Il faut donc soit les compiler en utilisant la méthode 2. évoquée plus haut, soit ajouter un dépôt non-officiel dans lequel yaourt a été déposé à la liste des dépôts dans lesquels pacman peut aller chercher et installer des paquets (custom repository). C’est le cas du dépôt Archlinux.fr. J’ai choisi la solution qui me paraissait la plus facile, en ajoutant, à la fin du fichier de configuration de pacman, les lignes suivantes :

[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/arm

Puis en passant la commande :

# pacman -Sy yaourt

Pour compiler et installer avec yaourt, il est recommandé de ne pas utiliser le compte d’utilisateur root mais un utilisateur standard (appartenant au groupe wheel pour pouvoir utiliser sudo pour installer les paquets compilés et les paquets requis qui sont pour la plupart dans l’un des dépôts officiels).

Pour installer foo2zjs avec yaourt, j’ai passé ensuite la commande suivante :

$ yaourt -S foo2zjs

puis j’ai suivi les étapes de l’installation du paquet foo2zjs assistées par yaourt. Yaourt se charge d’installer également les dépendances requises par le paquet cible, qu’elles soient dans les dépôts officiels ou elles-même dans le dépôt AUR.

Pour l’installation sur la carte Raspberry Pi, il faut, chaque fois que yaourt le propose, aller voir et modifier les instructions d’empaquetage (PKGBUILD) en ajoutant à la liste des architectures sur lesquelles le paquet est supposé pouvoir être installer et fonctionner. Le Raspberry Pi est un système sur puce construit selon l’architecture ARM version 6 Advanced RISC Machines (ARM) avec support matériel supplémentaire Vector Floating Point (VFP) virgule flottante (hardfloat) . Par exemple, dans les instructions d’empaquetage de foo2zjs, il faut remplacer la ligne
arch=('i686' 'x86_64')

en ajoutant armv6h :

arch=('i686' 'x86_64' 'armv6h')

Le premier essai s’est mal terminé : pas assez d’espace disque sur /tmp, le répertoire temporaire utilisé par défaut par yaourt et qui n’est doté que de 200 Mo. J’ai mis un moment à comprendre où était le problème, et j’ai fini par créer un répertoire /temp/ dans /home/utilisateurstandard/ :

$ mkdir temp

et, en passant l’option –tmp, j’ai indiqué à yaourt qu’il fallait utiliser ce répertoire comme répertoire temporaire au lieu de /tmp :

$ yaourt -S foo2zjs --tmp temp

Empaquetage avec makepkg

La méthode recommandée dans les consignes pour les utilisateurs du dépôt AUR est moins évidente mais présente l’avantage de bien savoir ce que l’on fait à chaque étape. C’est utile pour revenir en arrière en cas de problème et pour rechercher et appliquer une solution de contournement si l’installation ne se passe pas de manière optimale.

Téléchargement des fichiers d’archive des paquets foo2zjs et foomatic-db-foo2zjs

Je me suis connecté à la carte Raspberry Pi en tant qu’utilisateur standard avec droits d’administration via sudo et membre du groupe lp.

Dans ~ , j’ai créé un répertoire build pour y télécharger et y compiler mes paquets :

$ mkdir ~/build
$ cd ~/build

Mon objectif final est l’installation de foo2zjs. Foo2zjs requiert des dépendances qui sont toutes dans les dépôts officiels d’Arch Linux, à l’exception de foomatic-db-foo2zjs qui se trouve aussi dans AUR, et que je vais devoir compiler lui aussi.

Je télécharge les fichiers d’archive correspondant aux deux paquets et je les décompresse :

$ curl -O https://aur.archlinux.org/packages/fo/foomatic-db-foo2zjs/foomatic-db-foo2zjs.tar.gz
$ tar xvzf foomatic-db-foo2zjs.tar.gz
$ curl -O https://aur.archlinux.org/packages/fo/foo2zjs/foo2zjs.tar.gz
$ tar xvzf foo2zjs.tar.gz

Je vérifie et j’édite les fichiers .install et PKGBUILD présents dans les répertoires foomatic-db-foo2zjs et foo2zjs :
$ cd ~/build/foo2zjs
$ nano .install
$ nano PKGBUILD

$ cd ~/build/foomatic-db-foo2zjs
$ nano .install
$ nano PKGBUILD

Comme précédemment, dans les fichiers PKGBUILD, il faut ajouter armv6h à la ligne arch=('i686' 'x86_64')

On peut démarrer la compilation, en commençant par foomatic-db-foo2zjs, qui est requis par foo2zjs.

Je compile :
$ cd ~/build/foomatic-db-foo2zjs
$ makepkg -s

L’option -s indique que makepkg utilisera sudo pour installer les dépendances requises par le paquet compilé. Je vais prendre un café, puis un deuxième, puis un troisième, etc. parce que ça dure assez longtemps (20 à 30 minutes, je n’ai pas mesuré). J’obtiens finalement dans le répertoire un paquet compilé et compressé. Et je l’installe avec pacman :
$ sudo pacman -U foomatic-db-foo2zjs-[...].pkg.tar.gz

Même punition avec foo2zjs :
$ cd ~/build/foo2zjs
$ makepkg -s
$ sudo pacman -U foo2zjs-[...].pkg.tar.gz

C’est fini pour la compilation et l’installation du driver !

D’autres difficultés avec l’imprimante HP LaserJet P1006

En fait, ce n’est pas vraiment fini. Les imprimantes HP sont connues comme dures à cuire à la sauce Unix/Linux. Les forums de discussion et les Wiki regorgent de témoignages de problèmes rencontrés pour installer ces imprimantes et de moyens plus ou moins efficaces et plus ou moins reproductibles pour contourner ces obstacles.

Entre autres pilotes, foo2zjs embarque les drivers foo2xqx qui sont censés fonctionner avec les imprimantes suivantes :

HP LaserJet Pro CP1025nw, HP Color LaserJet CP1215, HP Color LaserJet 1500, HP Color LaserJet 1600, HP Color LaserJet 2600n, Konica Minolta magicolor 1600W, Konica Minolta magicolor 1680MF, Konica Minolta magicolor 1690MF, Konica Minolta magicolor 2480 MF, Konica Minolta magicolor 2490 MF, Konica Minolta magicolor 2530 DL, Konica Minolta magicolor 4690MF, Oki C110, Xerox Phaser 6115MFP, Xerox Phaser 6121MFP, Minolta Color PageWorks/Pro L, Minolta/QMS magicolor 2200 DL, Minolta/QMS magicolor 2300 DL, Konica Minolta magicolor 2430 DL, Samsung CLP-300, Samsung CLP-315, Samsung CLP-325, Samsung CLP-365, Samsung CLP-600, Samsung CLP-610, Samsung CLX-2160, Samsung CLX-3160, Samsung CLX-3175, Samsung CLX-3185, Xerox Phaser 6110 and 6110MFP, Lexmark C500, Oki C301dn, Oki C310dn, Oki C3200, Oki C3300, Oki C3400, Oki C3530 MFP, Oki C5100, Oki C5200, Oki C5500, Oki C5600, Oki C5800, Olivetti d-Color P160W, HP LaserJet 1000, HP LaserJet 1005, HP LaserJet 1018, HP LaserJet 1020, HP LaserJet P1005 HP LaserJet P1006, HP LaserJet P1007, HP LaserJet P1008, HP LaserJet P1505

La HP LaserJet P1006 y est bien, mais apparemment, cela ne suffit pas…

À l’installation l’imprimante est bien reconnue, mais impossible 9 fois sur 10 de charger le pilote. Les rares fois où le serveur a répondu, le fabricant est reconnu et il faut choisir le pilote d’impression foo2xqx (pour une raison inconnue, il apparaît en double dans la liste). Une fois qu’on a passé (au prix de beaucoup d’attente et d’énervement) ces deux étapes, tout semble se passer pour le mieux, mais après l’installation et la configuration de l’imprimante sur le/les clients (sur laquelle je reviens plus loin), impossible d’imprimer. Le document va bien jusqu’au serveur, mais ce dernier arrête et affiche l’erreur « unable to send data to printer ».

Apparemment, c’est un problème de permissions mal définies sur le port USB de l’imprimante. J’ai réglé ce problème de la manière suivante :

  1. Mise hors-tension de l’imprimante
  2. Suppression de l’imprimante préalablement installée dans la section Administration de CUPS
  3. On remet l’imprimante sous tension
  4. Recherche du port USB de l’imprimante et changement des permissions :
    1. lsusb pour récupérer le numéro du BUS et le numéro du périphérique correspondant à l’imprimante,
    2. puis :
      chmod 0666 /dev/bus/usb/numero_bus/numero_peripherique
  5. Installation de l’imprimante selon la procédure définie ci-dessus.

Paramétrage de l’imprimante sur les clients

Le serveur d’impression est en place, mais que serait un serveur sans clients à servir ? La dernière étape consiste à paramétrer les machines à partir desquelles je souhaitais lancer des impressions sur l’imprimante reliée au réseau par le Raspberry Pi pour qu’elles communiquent avec l’imprimante.

Clients Windows Seven

Il est assez facile de paramétrer les machines tournant sous Windows Seven (Windows 7) pour qu’elles communiquent avec le Raspberry Pi / Serveur d’impression, dès lors que la machine sous Windows contient le pilote correspondant à l’imprimante. C’était le cas pour moi en ce qui concerne l’imprimante HP LasertJet P1006.

Menu Démarrer > Panneau de configuration > Programmes > Activer ou désactiver des fonctionnalités Windows
Aller à la rubrique Services d’impression, et vérifier que la case Client d’impression internet est ben cochée.
Puis
Menu Démarrer > Périphériques et Imprimantes > Ajouter une imprimante
Choisir l’ajout d’une imprimante réseau et passer en mode manuel sans attendre la détection automatique de l’imprimante, qui ne se fera jamais…

Choisir l’option Sélectionner une imprimante partagée par nom, et renseigner l’adresse de la manière suivante :
http://192.168.0.X:631/printers/NomImprimante
NomImprimante correspond au nom donné à l’imprimante lors de son installation sur le serveur.
http://192.168.0.X est l’adresse IP du serveur d’impression installé sur la carte Raspberry Pi sur le réseau local.
Il faut ensuite identifier correctement le modèle d’imprimante pour charger le pilote correspondant.

Clients Unix/Linux sous CUPS

Pour les clients sous Unix/Linux, il suffit que CUPS soit installé et correctement configuré. il suffit ensuite d’ajouter une imprimante en utilisant l’interface Web d’administration. Je trouve plus simple de le faire manuellement :
https://localhost:631/admin/ > onglet Administration, Ajouter une imprimante.
Dans la liste Autres imprimantes réseau, choisir l’option Internet Printing Protocol (http). Renseigner, comme pour l’ajout sur un client Windows 7 vue plus haut, l’adresse de l’imprimante :
http://192.168.0.X:631/printers/NomImprimante
Donner un nom à l’imprimante, puis sélectionner le pilote adéquat (c’est généralement… le même que celui utilisé sur la machine qui joue le rôle de serveur !).

C’est aussi simple que cela !

Principales sources consultées et utilisées

2 réflexions sur « Serveur d’impression CUPS sur Raspberry Pi et imprimante HP LaserJet P1006 »

  1. Ping : Serveur d’impression sur Raspberry Pi : ajouter Airprint à CUPS sous Arch Linux ARM | Carnet

  2. Ping : Transformer un Raspberry Pi en serveur d’impression | Carnet

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.