Problemas con filtros (drivers) de impresora

Publicado 2019-07-17.
Palabras clave: cups ubuntu

Problema

No se puede imprimir utilizando una impresora Epson L606.

Información:

Suposición

Se supone que quien instaló el driver para la impresora utilizó el driver de Ubuntu 14.04 (i386) y que el problema se da por la diferencia de arquitectura con Ubuntu 18.04 (amd64).

Si lo anterior es correcto el problema puede estar en el filtro utilizado por la impresora.

Diagnóstico

La impresora ya fué creada en el sistema, por lo que se busca en el archivo ppd cual es el filtro que está utilizando, ya que se sospecha que ahí está el problema.

Se buscan filtros de las impresoras instaladas:

$ sudo grep cupsFilter /etc/cups/ppd/*.ppd
/etc/cups/ppd/Brother-HL5350DN.ppd:*cupsFilter: "application/vnd.cups-postscript 0 brlpdwrapperHL5350DN"
/etc/cups/ppd/Epson-L606.ppd:*cupsFilter: "application/vnd.cups-raster 0 /opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper"

De lo anterior encontramos que el sistema tiene por lo menos instalada otra impresora (una Brother HL5350DN si nos guiamos por el nombre, la cual no nos interesa) y que la impresora Epson L606 (la que estamos interesados) utiliza como filtro el archivo /opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper.

Según el FHS el directorio en que esta instalado el filtro es utilizado para instalación de paquetes adicionales, por lo que se puede asegurar que no se está usando un paquete del repositorio sinó posiblemente un driver privativo obtenido de epson.

Se pasa a determinar el tipo de archivo del filtro:

$ file /opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper
/opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-lsb.so.3, for GNU/Linux 2.6.15, BuildID[sha1]=bbbbd0675f310135f7c34a8eaa6fe1e63b2de4f1, stripped

Se intenta ejecutar el filtro, ya que es lo que hace CUPS cuando se envía un trabajo a la impresora para imprimir:

$ /opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper
/opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper: error while loading shared libraries: libcupsimage.so.2: cannot open shared object file: No such file or directory

Aquí se obtiene un error debido a la falta de la librería libcupsimage.so.2, que se puede suponer es el motivo por el cual no es posible imprimir con la impresora.

NOTA: El filtro se puede ejecutar ya que el sistema tiene instalado el paquete {libc6-i386}, en caso contrario se obtendría un error de que el archivo no es ejecutable.

Para probar un poco más se busca la librería libcupsimage.so.2:

$ sudo find /lib* /usr/lib* /usr/local/lib* -name 'libcupsimage.so*'
/usr/lib/x86_64-linux-gnu/libcupsimage.so.2
$ file /usr/lib/x86_64-linux-gnu/libcupsimage.so.2
/usr/lib/x86_64-linux-gnu/libcupsimage.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=9a4ec090cf3f4ad8ba754cc696e3dbc39997d072, stripped

Y se encuentra que el filtro (un programa ejecutable) es de 32 bits y la librería instalada en el sistema es de 64 bits, ya que se indica en la salida del programa file y se encuentra bajo el directorio /usr/lib/x86_64-linux-gnu reservado para las librerías de 64 bits.

Si se intenta ejecutar el filtro forzando el uso de la librería de 64 bits se obtiene:

$ LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu /opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper
/opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper: error while loading shared libraries: libcupsimage.so.2: wrong ELF class: ELFCLASS64

Solución

Las soluciones pasan por:

  1. Instalar el driver en su versión de 64 bits, si esta existe.
  2. Lograr la ejecución del filtro.

Sin duda la primera opción es la correcta, pero vamos a ir por la 2., suponiendo que el driver de 64 bits no está disponible, no puede o no quiere instalarse.

Aviso: existe un driver de 64 bits para la impresora Epson L606 disponible en la página del fabricante.

Para lograr la ejecución del filtro debe instalarse el paquete que contiene la librería libcupsimage.so.2 en 32 bits.

Para ello primero se obtiene el paquete a instalar:

$ dpkg -S /usr/lib/x86_64-linux-gnu/libcupsimage.so.2
libcupsimage2:amd64: /usr/lib/x86_64-linux-gnu/libcupsimage.so.2

Luego se agrega la arquitectura i386 al sistema. Esto es posible dado que debian y sus derivativos tiene soporte para multiarquitecturas:

$ sudo dpkg --add-architecture i386
$ sudo apt-get update

Asegurarse que se esten descargando la información correspondiente a la arquitectura i386.

Para instalar el paquete libcupsimage2 para dicha arquitectura hacer:

$ sudo apt-get install -V libcupsimage2:i386
...
The following NEW packages will be installed:
   gcc-8-base:i386 (8.3.0-6ubuntu1~18.04.1)
   libavahi-client3:i386 (0.7-3.1ubuntu1.2)
   libavahi-common-data:i386 (0.7-3.1ubuntu1.2)
   libavahi-common3:i386 (0.7-3.1ubuntu1.2)
   libc6:i386 (2.27-3ubuntu1)
   libcom-err2:i386 (1.44.1-1ubuntu1.1)
   libcups2:i386 (2.2.7-1ubuntu2.6)
   libcupsfilters1:i386 (1.20.2-0ubuntu3.1)
   libcupsimage2:i386 (2.2.7-1ubuntu2.6)
   libdbus-1-3:i386 (1.12.2-1ubuntu1.1)
   libffi6:i386 (3.2.1-8)
   libgcc1:i386 (1:8.3.0-6ubuntu1~18.04.1)
   libgcrypt20:i386 (1.8.1-4ubuntu1.1)
   libgmp10:i386 (2:6.1.2+dfsg-2)
   libgnutls30:i386 (3.5.18-1ubuntu1.1)
   libgpg-error0:i386 (1.27-6)
   libgssapi-krb5-2:i386 (1.16-2ubuntu0.1)
   libhogweed4:i386 (3.4-1)
   libidn2-0:i386 (2.0.4-1.1build2)
   libjbig0:i386 (2.1-3.1build1)
   libjpeg-turbo8:i386 (1.5.2-0ubuntu5.18.04.1)
   libjpeg8:i386 (8c-2ubuntu8)
   libk5crypto3:i386 (1.16-2ubuntu0.1)
   libkeyutils1:i386 (1.5.9-9.2ubuntu2)
   libkrb5-3:i386 (1.16-2ubuntu0.1)
   libkrb5support0:i386 (1.16-2ubuntu0.1)
   liblz4-1:i386 (0.0~r131-2ubuntu3)
   liblzma5:i386 (5.2.2-1.3)
   libnettle6:i386 (3.4-1)
   libp11-kit0:i386 (0.23.9-2)
   libpng16-16:i386 (1.6.34-1ubuntu0.18.04.2)
   libsystemd0:i386 (237-3ubuntu10.24)
   libtasn1-6:i386 (4.13-2)
   libtiff5:i386 (4.0.9-5ubuntu0.2)
   libunistring2:i386 (0.9.9-0ubuntu2)
   zlib1g:i386 (1:1.2.11.dfsg-0ubuntu2)
The following packages will be upgraded:
...
Unpacking libcups2:i386 (2.2.7-1ubuntu2.6) ...
dpkg: error processing archive /tmp/apt-dpkg-install-PBbfvl/12-libcups2_2.2.7-1ubuntu2.6_i386.deb (--unpack):
 trying to overwrite shared '/usr/share/doc/libcups2/changelog.Debian.gz', which is different from other instances of package libcups2:i386
...
Errors were encountered while processing:
 /tmp/apt-dpkg-install-PBbfvl/12-libcups2_2.2.7-1ubuntu2.6_i386.deb

De la salida anterior se ven dos cosas:

  1. No es viable descargar manualmente el paquete libcupsimage2 y sus dependencias para la arquitectura i386 dada la cantidad que son y la dificultad de realizar el cálculo siguiendo los links de la página web de ubuntu para el paquete libcupsimage2
  2. Hay un error al instalar la versión de 32 bits del paquete libcups2 que impide que se complete la instalación.

Se revisan las versiones instaladas del paquete libcups2 y disponibles en las distintas arquitecturas:

$ apt-cache policy libcups2:amd64 libcups2:i386
libcups2:
  Installed: 2.2.7-1ubuntu2.6
  Candidate: 2.2.7-1ubuntu2.6
  Version table:
 *** 2.2.7-1ubuntu2.6 500
        500 http://uy.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     2.2.7-1ubuntu2.2 500
        500 http://uy.archive.ubuntu.com/ubuntu bionic-security/main amd64 Packages
     2.2.7-1ubuntu2 500
        500 http://uy.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
libcups2:i386:
  Installed: (none)
  Candidate: 2.2.7-1ubuntu2.6
  Version table:
     2.2.7-1ubuntu2.6 500
        500 http://uy.archive.ubuntu.com/ubuntu bionic-updates/main i386 Packages
     2.2.7-1ubuntu2.2 500
        500 http://uy.archive.ubuntu.com/ubuntu bionic-security/main i386 Packages
     2.2.7-1ubuntu2 500
        500 http://uy.archive.ubuntu.com/ubuntu bionic/main i386 Packages

De lo anterior conicidirían la versión del paquete instalado en la arquitectura amd64 con la versión del paquete a instalar en la arquitectura i386 por lo cual no debería haber ocurrido el problema anterior.

Se verifica si los archivos instalados por el paquete libcups2 son correctos utilizando los checksums (md5) incluidos en el el paquete:

$ (cd /; cat /var/lib/dpkg/info/libcups2\:amd64.md5sums | md5sum --check)
usr/lib/x86_64-linux-gnu/libcups.so.2: OK
usr/share/doc/libcups2/README.Debian.gz: OK
usr/share/doc/libcups2/changelog.Debian.gz: FAILED
usr/share/doc/libcups2/copyright: OK
usr/share/doc/libcups2/examples/client.conf: OK
md5sum: WARNING: 1 computed checksum did NOT match

Revisando el contenido del archivo usr/share/doc/libcups2/changelog.Debian.gz:

$ (cd /; zcat usr/share/doc/libcups2/changelog.Debian.gz | head )
cups (2.2.7-1ubuntu2.2) bionic-security; urgency=medium

  * SECURITY UPDATE: predictable session cookies
    - debian/patches/CVE-2018-4700.patch: use better seed in cgi-bin/var.c.
    - CVE-2018-4700

 -- Marc Deslauriers <marc.deslauriers@ubuntu.com>  Fri, 16 Nov 2018 14:05:42 -0500

cups (2.2.7-1ubuntu2.1) bionic-security; urgency=medium

Por lo cual hay una inconsistencia entre el archivo instalado y la versión del paquete que da como instalado el sistema: la versión del archivo parace corresponder a la 2.2.7-1ubuntu2.2.

Para corregir el problema anterior se reinstala el paquete libcups para la arquitectura amd64 y se instala el mismo paquete para la arquitectura i386. Luego se verifican los paquetes instalados:

$ sudo apt-get install --reinstall libcups2 libcups2:i386
...
$ dpkg -l libcups2
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                      Version                   Architecture              Description
+++-=========================================-=========================-=========================-========================================================================================
ii  libcups2:amd64                            2.2.7-1ubuntu2.6          amd64                     Common UNIX Printing System(tm) - Core library
ii  libcups2:i386                             2.2.7-1ubuntu2.6          i386                      Common UNIX Printing System(tm) - Core library

Por último, se vuelve a ejecutar el filtro, y ahora parace funcionar:

$ /opt/epson-inkjet-printer-escpr/cups/lib/filter/epson-escpr-wrapper
Insufficient options.

Lo anterior se confirma imprimiendo un documento a dicha impresora mediante la interfaz gráfica.

Lecciones aprendidas

Hay veces que las instalaciones están corruptas, en este caso la versión del paquete indicada por dpkg no era correcta o tenía un archivo de una versión anterior.

Cuando se instalan los mismos paquetes para distintas arquitecturas estos deben tener la misma versión para que los archivos independientes de la arquitectura:

coincidan y puedan sobreescribirse sin problemas.

Por más detalles sobre el tema ver: