CUPS – Como Depurar Problemas de Impresora

Brandon Nielsen, Zdenek Dohnal Versión F35 onwards Last review: 2022-02-10

Si tiene algún problema con la impresión, consulte la página errores comunes antes de reportar un error. Si el problema que observa no aparece en la lista o ninguna de las soluciones alternativas parece solucionarlo, considere presentar un informe de error para ayudarnos a mejorar el rendimiento de Fedora en su hardware.

Identificar su área del problema

Los problemas de impresión pueden ser muy complejos y una cooperación activa o una gran cantidad de datos pueden ser pedidos por el mantenedor al informador para ayudar al mantenedor a por lo menos entender y (si no es una cuestión específica de hardware) reproducir el problema, de modo que por favor tenga paciencia e intente centrar el problema tanto como sea capaz.

Puede haber:

  • problemas para ver o conectarse a la impresora (pueden ser problemas de back-end de cups, problemas de avahi, problemas de libusb, problemas de búsqueda de cups),

  • problemas de accesibilidad (configuración correcto/incorrecta en cupsd.conf o su interpretación errónea por el demonio cupsd, mala cooperación con NIS, SSSD…​),

  • imprimir con ayuda de samba (problemas con el backend smb, que es parte de samba) o con samba autenticado a través de Kerberos (samba_krb5_printing),

  • problemas con los filtros utilizados durante el filtrado del documento en un formato compatible con la impresora, que influyen en cómo o si se imprimirá el documento (problema con filtros: pdftops, pdftopdf, pstops, bannertopdf, etc., o problemas con binarios o bibliotecas que utilizan los filtros: libgs, qpdf, poppler…​),

  • problemas con los archivos de descripción de impresora Postscript, que son una forma antigua de definir las capacidades de las impresoras, como tamaños de página admitidos, bordes, etc.

Sin mencionar posibles limitaciones o problemas en el firmware o hardware de la impresora en sí, por lo que cualquier tipo de dato o acotación del problema es bienvenido.

El mejor comienzo es adjuntar archivos con los registros que se describen más adelante.

Acceso a CUPS

Todos los accesos a CUPS es redireccionado al diario por defecto desde Fedora 28 (hubo una redirección de error_log para diario por defecto antes de Fedora 28).

Necesitamos definir dos formas diferentes de capturar registros completos de CUPS vinculados a incidentes: una si la cola de impresión rota no es proporcionada por HPLIP y la otra si sí lo es. Se diferencian en la opción de filtro de journald: si usa una cola que no sea HPLIP para depurar, está bien recopilar los registros de la unidad systemd de cups (mediante '-u cups'), porque todos los mensajes de error se redirigen correctamente al registro de la unidad systemd de cups y son accesibles en la salida después del filtrado de la unidad. Las bibliotecas HPLIP no están implementadas para hacer lo mismo (el servidor original no responde para aceptar una posible solución en el proyecto y el problema no es lo suficientemente crítico como para retrasar indefinidamente la implementación de un parche posterior), por lo que sus mensajes no se marcan para la unidad systemd de cups y se filtran tras llamar a journald con '-u cups'. Para estas colas, se requiere el registro de journald sin filtrado.

El registro journald vinculado a incidentes sin filtrado solo es necesario para las colas de impresión HPLIP (cuyo URI de dispositivo empieza por hp://) y no es recomendable para otras colas, ya que puede ser difícil de leer en casos grandes. Adjunte el registro journald vinculado a incidentes solo cuando sea necesario.

Ubicación del registro de CUPS

El registro de CUPS se encuentra en el diario del sistema por defecto, pero se puede configurar el registro en un archivo en /etc/cups/cups-files.conf con la directiva ErrorLog. Si desea cambiar la configuración predeterminada, el nombre del archivo de registro es irrelevante, pero se recomienda colocarlo en la ruta /var/log/cups; de lo contrario, SELinux impedirá que cupsd acceda a él.

Establecer el registro en un archivo tiene las siguientes desventajas (sin operaciones adicionales):

  • no es posible conectar solo los registros a un trabajo sin encadenar más comandos

  • no se pueden obtener registros para el período de tiempo especificado sin encadenar más comandos

Para capturar registros vinculados a incidentes, se puede utilizar tail -f, por ejemplo:

tail -f /var/log/cups/error_log

Habilitar el registro de depuración de CUPS

Habilite la información de depuración completa con:

$ cupsctl LogLevel=debug2

Registro de trabajos de CUPS

Si el problema aparece al enviar el documento a imprimir o al intentarlo, capture los registros de este trabajo. Si el registro del trabajo está disponible, es OBLIGATORIO adjuntarlo.

Preparar CUPS para el registro de trabajos

Para poder ver el registro de trabajos específicos, active:

PreserveJobFiles Yes

En su archivo /etc/cups/cupsd.conf y reinicie el servicio cup. No olvide eliminar la línea después de terminar la depuración. El comando lpstat -W all parece estar vacío después de imprimir si no habilita la directiva.

Obtener un registro de tarea para un ID de tarea específica

Para capturar el registro de tarea, necesita saber el ID de trabajo (JID) de la tarea: es el número después del guion en un ID de solicitud:

El ID de solicitud se ve así:

<print_queue_name>-<JID>

y puede ser visto en terminal si envía un documento para imprimir por la instrucción lp:

$ lp -d <print_queue_name> <file1> ... <fileN>
request id is <print_queue_name>-<JID> (N archivo(s))

O cuando enumere tareas (consulte man lpstat); la última tarea está al final:

$ lpstat -W all
...
<print_queue_name>-<JID>           <usuario>           1024   Wed 11 Jan 2017 05:52:19 PM CET

Puede obtener la última tarea de bitácoras automáticamente (si tiene awk instalado y lpstat -W todas las tareas devueltas) por:

$ journalctl -u cups JID=`lpstat -W all | awk '{print $1}' | awk -F '-' '{print $NF}' | tail -n 1` > cups_job_log

O manualmente, si encuentra JID por usted mismo:

journalctl -u cups JID=<JID> > cups_job_log

Registro de cupsd vinculado a incidentes (la cola de impresión rota no es compatible con HPLIP)

A veces no podemos vincular el error a una tarea de impresión específico, por lo que el registro de tareas no es efectivo. Se requiere un registro de cupsd vinculado a incidentes.

Como comenzar para capturar vínculo-incidencia de bitácora de cups

En terminal/lengüeta de terminal nueva, declare:

journalctl -f -u cups > cups_whole_log
Cómo obtener el registro de cupsd vinculado a incidentes

Después de activar la condición de error que está intentando diagnosticar, por ejemplo, imprimir algo, intentar encontrar una impresora mediante lpinfo, etc., finaliza la captura del registro cupsd vinculado al incidente desde paso anterior con <ctrl>+<c>.

Registro de cupsd vinculado a incidentes (la cola de impresión rota es compatible con HPLIP)

Lamentablemente, las bibliotecas HPLIP no inician sesión en la unidad CUPS en el diario, por lo que si su cola de impresión está instalada con el controlador HPLIP (su URI de dispositivo comienza con hp://), necesitamos un registro de diario vinculado a incidentes.

Cómo empezar a capturar registros de diario vinculados a incidentes

En terminal/lengüeta de terminal nueva, declare:

journalctl -f > journal_whole_log
Cómo obtener un registro de diario vinculado a incidentes

Después de activar la condición de error que está intentando diagnosticar, por ejemplo, imprimir algo, ejecutar un script de HP, etc., finaliza la captura del registro de diario vinculado a incidentes desde paso anterior con <ctrl>+<c>.

Apaga bitácora depurativa

Adjunte cups_job_log para la tarea problemática, cups_whole_log o journal_log si capturó todo el registro de cupsd durante el evento problemático, informe el error como un archivo adjunto.

Entonces para apagar la información de depuración, haga esto:

$ sudo sed -i 's,LogLevel debug2,LogLevel warn,' /etc/cups/cupsd.conf
$ sudo systemctl restart cups

Más instrucciones para funcionar con systemd-journald

Consulte los mensajes de bitácora con:

journalctl -u cups -e

o:

journalctl -u cups --since=...

Para filtrar los mensajes relacionados con un ID de tarea específico, utilice:

journalctl -u cups JID=...

(al completar la pestaña se le mostrará qué ID de tarea tienen mensajes de bitácora)

registro de cups-browsed

El demonio cups-browsed se introdujo en Fedora alrededor de la versión cups-1.5. Puede explorar transmisiones Bonjour, transmisiones CUPS (obsoletas) y servidores LDAP en busca de impresoras, y crear o eliminar colas locales que apunten a dichas impresoras. Puede crear transmisiones de colas CUPS locales, pero está marcado como obsoleto.

Para configurar el registro de depuración, debe agregar:

DebugLogging stderr

al /etc/cups/cups-browsed.conf.

Las bitácoras estarán disponibles en el diario del sistema tras reiniciar cups-browser.

Guiones HPLIP depurativos de bitácora

Los scripts de Python de HPLIP (p. ej., hp-setup, hp-clean, hp-scan) tienen el registro de depuración redirigido al descriptor de archivo de error estándar, por lo que no se registran en el diario. Para obtener el registro de depuración, ejecute el script con el parámetro -ldebug, p. ej.:

$ hp-setup -ldebug -i

y reproduce el tema. Entonces copie los mensajes desde el terminal al hp_script_log. Adjunte el archivo al ticket de bugzilla también.

¿Qué marca y modelo es mi impresora?

Cada impresora diferente tiene un modelo-específico de ID Dispositivo. Puede encontrarlo con la instrucción lpinfo:

su -c "lpinfo -l -v"

Esta instrucción ejecuta cada backend en modo de descubrimiento para que informen sobre los dispositivos que pueden detectar automáticamente. Esto generará una serie de bloques de líneas, cada uno como éste:

Device: uri = usb://HP/DESKJET%20990C?serial=U123456789AB
        class = direct
        info = HP DESKJET 990C
        make-and-model = HP DESKJET 990C
        device-id = MFG:HEWLETT-PACKARD;MDL:DESKJET 990C;CMD:MLC,PCL,PML;CLS:PRI
NTER;DES:Hewlett-Packard DeskJet 990C;SN:U123456789AB;S:00808880800010032C100000
0C2000000;P:0800,FL,B0;J:                    ;
        location =

La línea que identifica este tipo de modelo en particular es la línea larga que comienza con "device-id =" (se muestra aquí en tres líneas).

Tenga en cuenta que si su impresora no se detecta automáticamente, aún puede averiguar el ID del dispositivo ejecutando el backend adecuado con el nombre de host de la impresora como argumento. Los backends usb, parallel, snmp y dnssd intentan informar el ID del dispositivo real proporcionado por la impresora.

$ /usr/lib/cups/backend/snmp 10.34.18.3

network socket://10.34.18.3 "HP Color LaserJet CP2025dn" "HP Color LaserJet CP2025dn"
"MFG:Hewlett-Packard;CMD:PJL,PML,PCLXL,POSTSCRIPT,PCL;MDL:HP Color LaserJet CP2025dn;
CLS:PRINTER;DES:Hewlett-Packard Color LaserJet CP2025dn;MEM:MEM=55MB;COMMENT:RES=600x8;" "HP Color LaserJet CP2025dn"

El ID del dispositivo es en este caso (consulte backend(7)) el penúltimo campo.

¿Cuáles colas de impresión están disponibles para mí?

Las colas de impresión de su máquina pueden ser permanentes o temporales. CUPS puede listar todas las colas de impresión disponibles en la red local (permanentes y temporales) por:

$ lpstat -e

Para colas permanentes puedes obtener más información con:

$ lpstat -t

¿Cual controlador estoy usando?

El archivo PPD de la cola de impresión le indica qué controlador está en uso. Puede usar esta instrucción para averiguarlo:

grep -H '^*NickName:' /etc/cups/ppd/*.ppd

También puede averiguarlo usando la aplicación system-config-printer. Haga doble clic en el icono de la cola y observe el campo Marca y Modelo.

Para ver los controladores disponibles, pulse en el botón Cambiar…​ junto a ese campo. Quizás le resulte útil probar otro controlador para ver si presenta el mismo problema.

Modelos sin controlador

La mayoría de las impresoras lanzadas desde 2010 son compatibles con AirPrint o IPP Everywhere, lo que significa que no necesitan instalación para funcionar: Avahi detecta el dispositivo y las funciones de impresión se comunican mediante el protocolo IPP. Básicamente, son dispositivos sin controladores. Existen dos soluciones en Fedora que implementan IPP Everywhere:

  • Modelo CUPS 'en todas partes'

  • controlador 'sin conductor' de cups-filters

Modelo CUPS 'en todas partes'

Es una implementación CUPS del estándar IPP Everywhere, disponible como un modelo de impresora especial. Este modelo se utiliza al usar la cola temporal de CUPS para su dispositivo o al instalarlo con el modelo IPP Everywhere en la interfaz web de CUPS o mediante lpadmin (usando -m everywhere).

Dado que el archivo PPD creado depende de la comunicación IPP con la impresora, necesitamos información recopilada del dispositivo. Puede usar la instrucción ipptool para ello:

$ ipptool --ippserver ipptool.attr <your_printer_device_uri> get-printer-attributes.test

Adjunte el ipptool.attr creado al ticket de Bugzilla si es necesario.

controlador 'sin conductor' de cups-filters

Controlador especial para filtros de cups que se utiliza para generar PPD según el estándar IPP Everywhere. Este controlador se utiliza si se selecciona el modelo sin controlador durante la instalación de la impresora.

También necesitamos la salida de la solicitud get-printer-attributes:

$ ipptool --ippserver ipptool.attr <your_printer_device_uri> get-printer-attributes.test

y registros de depuración del propio controlador cuando genera PPD para su dispositivo:

$ driverless -d cat <ipp_device_uri> 2> driverless_debug > created_ppd

Adjunte todos los archivos creados al ticket de Bugzilla si es necesario.

Encontrar dónde está el problema

When a print job is processed it is sent through a chain of filters to convert the file into a format the printer can understand, and then finally sent to a backend, a program which can transport the data to the printer. By slightly changing how you print you can try a different printing path to see if that changes anything. If it works around the problem, you know which area the problem was in — include that information in a bug report so that we can fix it.

Aplicaciones

Try printing from a different application to see if the problem goes away or if it occurs regardless of how a file is printed. Try printing the document from the command line using the lp command.

Document format

If you are having problems printing PDF files, try printing other types of file to see if the problem is with printing anything or if it is specific to printing PDF files. Try converting the file to a different format and printing that.

If the problem relates to printing text files, try removing/installing the paps package. This package provides an alternative text-to-PostScript filter to the one that comes with CUPS.

To inspect the document that was submitted to CUPS for printing, enable the PreserveJobFiles option like this:

cupsctl PreserveJobFiles=yes

Submitted job documents will remain in /var/spool/cups. There are files with two types of names - dXXXXX-YYY and cXXXXX. dXXXXX-YYY is file which goes to CUPS system, unfiltered file - XXXXX is job ID, which is filled with zeros to be 5 characters long, and YYY is sequence number of file in the job. cXXXXX is file which contains printing options for a job specified by job ID in XXXXX. Please attach dXXXXX-YYY to the bug for a job when you experience the issue

Ejecución de filtros a mano

Los usuarios más avanzados pueden intentar ejecutar los filtros CUPS manualmente y examinar el archivo de datos en cada paso a medida que se convierte entre diferentes formatos. Aquí hay un ejemplo de cómo hacerlo para una cola gutenprint llamada pqueue con la página de prueba CUPS, que tiene su propio tipo MIME especial application/vnd.cups-banner:

First you need to know the filter pipeline for application/vnd.cups-bannerprinter/pqueue (output MIME type). You can either enable debugging, print a test page, get CUPS job log and in cups_job_log you’ll find something similar to:

envp[29]="FINAL_CONTENT_TYPE=printer/pqueue"
Started filter /usr/lib/cups/filter/bannertopdf (PID 1111)
Started filter /usr/lib/cups/filter/pdftopdf (PID 1112)
Started filter /usr/lib/cups/filter/gstoraster (PID 1113)
Started filter /usr/lib/cups/filter/rastertogutenprint.5.2 (PID 1114)

o ejecuta

/usr/lib/cups/filter/bannertopdf 1 me '' 1 '' </usr/share/cups/data/testprint >bannertopdf.pdf
cupsfilter -e -m printer/pqueue -p /etc/cups/ppd/pqueue.ppd bannertopdf.pdf > /dev/null

y verá:

INFO: pdftopdf (PID 1111) started.
INFO: gstoraster (PID 1112) started.
INFO: rastertogutenprint.5.2 (PID 1113) started.

Esta canalización de filtros es de cups-1.6. Con cups < 1.6, puede ver bannertops → pstops → pstoraster.

Ahora puedes ejecutar filtros manualmente:

export PPD=/etc/cups/ppd/pqueue.ppd
/usr/lib/cups/filter/bannertopdf 1 me '' 1 '' </usr/share/cups/data/testprint >bannertopdf.pdf
/usr/lib/cups/filter/pdftopdf 1 me '' 1 '' <bannertopdf.pdf >pdftopdf.pdf
/usr/lib/cups/filter/pdftoraster 1 me '' 1 ''<pdftopdf.pdf >out.ras
/usr/lib/cups/filter/rastertogutenprint.5.2 1 me '' 1 ''<out.ras >out.prn

Aquí, se puede usar evince o okular para examinar la salida después de los primeros dos filtros, se puede usar rasterview para examinar la salida del tercer filtro y la salida del último filtro debe inspeccionarse manualmente o enviarse directamente (lpr -oraw out.prn) a la impresora.

Controlador

Si tiene acceso a una impresora de otra marca o modelo, podría valer la pena comprobar si el problema se produce en ambas o solo en una. Esto puede indicar si se trata de un problema con un controlador específico o si se trata de un problema más general.

Incluso si solo tiene acceso a una impresora, suele haber varios controladores disponibles para cada modelo, y probarlos uno por uno puede ser útil para identificar el problema. Consulte arriba para saber cómo hacer eso.

Foomatic

Para los controladores Foomatic, puede intentar habilitar la depuración de Foomatic editando el archivo /etc/foomatic/filter.conf y agregando una línea:

debug: 1

La próxima vez que imprima un trabajo en una cola utilizando foomatic, la depuración se colocará en /tmp/foomatic-rip.log, y el archivo de entrada recibido por foomatic-rip estará en /tmp/foomatic-rip.ps.

Backend (tarea transporte)

Quizás puedas probar un backend diferente. Utilizando [command] system-config-printer, pulse dos veces en el icono de la cola de impresión y pulsa el botón Cambiar…​ junto al campo URI del dispositivo. Verás una flecha de expansión de Conexión cerca de la esquina inferior derecha de la ventana; pulse en ella para ver los backends disponibles. Para impresoras HP con conexión USB, normalmente se pueden usar los backends hp y usb.

Para capturar la comunicación USB:

  • descubra el número de bus donde está conectado el dispositivo USB, por ejemplo:

$ lsusb
Bus 002 Device 010: ID 03f0:012a HP, Inc HP LaserJet M1536dnf MFP

      =
  • iniciar captura de paquete USB:

$ sudo tcpdump -i usbmonN -s0 -w usb.pcap

donde N es el número del bus.

Para las impresoras de red, es posible que tengas diferentes protocolos que puedes probar.

  • socket (zócalo) es para HP JetDirect (usualmente puerto 9100)

  • lpd es para recursos compartidos de impresión de UNIX de estilo antiguo

  • smb es para recursos compartidos CIFS de sistemas Windows

  • ipp es para dispositivos habilitados para el Protocolo de impresión de Internet y también para otros servidores CUPS — Puede capturar el tráfico IPP con tcpdump de esta manera (el nombre de la interfaz puede diferir de p4p1):

 tcpdump -n -i p4p1 -U -s0 -w ipp.pcap port ipp
  • bjnp es para el protocolo de red bjnp propietario de Canon (normalmente el puerto 8611)

Herramienta de configuración

Si su problema está relacionado con la configuración de las colas de impresora, pruebe con uno de los otros métodos. Hay cuatro disponibles:

  • La aplicación Configuración del sistema de GNOME 3 (centro de control), Configuración del sistema > Impresoras desde GNOME Shell

  • system-config-printer, Sistema > Administración > Impresora desde el menú de GNOME

  • el interfaz de web CUPS, http://localhost:631/

  • las herramientas de línea de comandos lpadmin, lpoptions, cupsctl, cupsaccept, cupsenable etc.

Historias del usuario

Hay varias historias de usuario común cuando viene a depurar problemas de impresión. Mencionaré algunos de ellos con los pasos para obtener información necesaria.

Tengo una impresora HP y tengo un problema con el script HPLIP

Siga los pasos de las secciones siguientes:

I have HP printer, installed it with HPLIP and have a problem with it

HPLIP installed print queue has a device uri starting with hp://.

Siga los pasos de las secciones siguientes:

Mi impresora no imprime correctamente o no imprime en absoluto, pero puedo ver la impresora en el cuadro de diálogo de impresión

Siga los pasos de las secciones siguientes:

Tema CUPS genérico

For generic issues - printer wasn’t found, segfault - please follow the steps in the following sections (avahi-daemon must run):

My printer doesn’t print correctly - I use 'everywhere' model

Siga los pasos de las secciones siguientes:

I have a generic problem with cups-browsed

Siga los pasos de las secciones siguientes:

$ journalctl -u cups-browsed -f > cups_browsed_log
  • trigger the issue or wait until cups-browsed triggers the issue itself

  • cancel cups-browsed and cupsd log captures

  • attach created files cups_whole_log and cups_browsed_log to the ticket and turn off debug logging

Printer found by cups-browsed doesn’t print or print badly

The most difficult user story - we need to know how the print queue was created and how it behaves during printing. The print queue found by cups-browsed has a device uri starting with implicitclass://.

Siga los pasos:

$ journalctl -u cups-browsed -f > cups_browsed_queue_creation
  • give cups-browsed some time to process found devices (depends on how many devices you have in the local network or how many print queues are stored in the location you set with BrowsePoll directive)

  • cancel cups-browsed and cupsd log captures - save the files as cups_queue_creation and cups_browsed_queue_creation

Ahora necesitamos capturar las bitácoras durante la impresión:

$ journalctl -u cups-browsed -f > cups_browsed_printing