Problema
No se puede imprimir utilizando una impresora Epson L606.
Información:
- La impresora funciona con Ubuntu 14.04 (i386).
- No funciona Ubuntu 18.04 (amd64).
- La PC ya tiene instalados los drivers para la impresora, pero no sabe si la instalación fué realizada mediante un paquete deb -privativo, descargado de epson- o directamente utilizando un script.
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:
- Instalar el driver en su versión de 64 bits, si esta existe.
- 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:
- 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 - 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:
- archivos de configuración
- archivos de documentación (/usr/share/doc/package/{copyright,changelog} )
- archivos de datos
coincidan y puedan sobreescribirse sin problemas.
Por más detalles sobre el tema ver: