Problemas en openSUSE con Impresoras Epson LX-300 USB

En realidad no es solo un problema de openSUSE, sino de la librería libusb y del backend usb de cups ubicado en el directorio /usr/lib/cups/backend.

El problema se presenta al configurar con el asistente de Yast dos impresoras similares de la marca Epson con puertos USB (en mi caso LX 300+II), generándose un conflicto relacionado a la dirección a donde apuntan ambas impresoras, que quedan asociadas al mismo recurso.

Si configuramos ambas impresoras por Yast y luego verificamos el archivo /etc/cups/printers.conf nos daremos cuenta que la directiva DeviceURI para ambas impresoras será la misma, algo similar a lo que sigue:
DeviceURI usb://EPSON/LX-300+
Esto se debe a que el backend usb de cups es incapaz de obtener el ID de cada dispositivo, o mejor dicho, de cada hardware o impresora para definir cual es el dispositivo físico que se encuentra asociado al dispositivo lógico configurado en cups.

Si ejecutamos el backend de cups "usb" directamente en la consola nos aparecerá la siguiente respuesta:
testsrv:~ # cd /usr/lib/cups/backend/
testsrv:/usr/lib/cups/backend # ./usb

direct usb://EPSON/LX-300+ "EPSON LX-300+" "EPSON LX-300+" "MFG:EPSON;CMD:ESCP9,PRPII9,BDC,D4;MDL:LX-300+;CLS:PRINTER;DES:EPSON LX-300+;" ""
direct usb://EPSON/LX-300+ "EPSON LX-300+" "EPSON LX-300+" "MFG:EPSON;CMD:ESCP9,PRPII9,BDC,D4;MDL:LX-300+;CLS:PRINTER;DES:EPSON LX-300+;" ""
testsrv:/usr/lib/cups/backend #
El motivo por el que no logra identificar adecuadamente las dos impresoras se explica en el punto 4.4.3 de este artículo, pero lo podríamos resumir que para obtener el ID del hardware el fabricante utiliza métodos propietarios y no mediante métodos estándares que son los utilizados por el backend de cups.


Solución del problema

La mejor forma de solucionar este problema sería que en vez de conectar ambas impresoras con cables USB, conectemos una de las impresoras con un cable paralelo y la otra con un cable USB, lo que no generaría ningún problema en la identificación de ambas impresora.

Sin embargo, si lo mencionado anteriormente no es posible y solo disponemos de cables USB o placas madres sin puerto paralelo, podemos solucionarlo de una forma algo menos convencional y no muy recomendable siguiendo los pasos que van a continuación:

  1. Enchufar ambas impresoras en los puertos USB disponibles y encenderlas.

  2. Configurar las impresoras con YAST.

  3. Reiniciar la PC para que la secuencia de arranque se encargue de asignar a las impresoras su identificador de dispositivo lógico en el directorio /dev, esto lo recomiendo porque los puertos USB se encuentran enumerados y se van detectando en forma secuencial. Por ejemplo, si nuestra placa madre tiene 6 puertos USB los mismos van enumerados (según tengo entendido) del 0 (cero) al 5, si conectamos la primera impresora A al puerto USB2 y la otra impresora B al puerto USB3 y dejamos que la secuencia de arranque del sistema operativo detecte los dispositivos, sabremos perfectamente que en el directorio /dev la unidad lógica usblp0 corresponderá a la impresora A y que la unidad usblp1 corresponderá a la impresora B, porque durante el arranque el sistema operativo habrá verificado primero el puerto USB2 y luego el puerto USB3.

  4. Ahora sabiendo perfectamente en que unidades lógicas se encuentra cada impresora, en el archivo /etc/cups/printers.conf debemos modificar la directiva DeviceURI de ambas impresoras y asignarles las URI que corresponden a sus unidades lógicas ubicadas en el directorio /dev mencionadas en el punto anterior. Primero editamos el archivo:
    testsrv:~ # vi /etc/cups/printers.conf
    Modificamos su contenido y debería quedar similar a lo que sigue (la directiva DeviceURI se encuentra resaltada):
    # Printer configuration file for CUPS v1.4.4
    # Written by cupsd on 2010-12-13 14:33
    # DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING
    # Printer configuration file for CUPS v1.4.4
    # Written by cupsd on 2010-12-13 14:33
    # DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING
    # Printer configuration file for CUPS v1.4.4
    # Written by cupsd on 2010-12-13 14:33
    # DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING

    <Printer epson0>
    Info ONE EPSON LX-300+
    Location linux
    MakeModel IBM ProPrinterII Foomatic/ibmpro (recommended)
    DeviceURI file:///dev/usblp0
    State Idle
    StateTime 1292251254
    Type 8388612
    Accepting Yes
    Shared Yes
    JobSheets none none
    QuotaPeriod 0
    PageLimit 0
    KLimit 0
    OpPolicy default
    ErrorPolicy stop-printer
    </Printer>

    <Printer epson1>
    Info TWO EPSON LX-300
    Location linux
    MakeModel IBM ProPrinterII Foomatic/ibmpro (recommended)
    DeviceURI file:///dev/usblp1
    State Idle
    StateTime 1292248513
    Type 8388612
    Accepting Yes
    Shared Yes
    JobSheets none none
    QuotaPeriod 0
    PageLimit 0
    KLimit 0
    OpPolicy default
    ErrorPolicy stop-printer
    </Printer>
  5. Si queremos o necesitamos compartir las impresoras (como sucedió en mi caso), configuramos el servicio Samba para que levante todas las impresoras y definimos que la directiva printcap name = cups (si se utiliza /etc/printcap no va a funcionar).
    testsrv:~ # vi /etc/samba/smb.conf
    # smb.conf is the main Samba configuration file. You find a full commented
    # version at /usr/share/doc/packages/samba/examples/smb.conf.SUSE if the
    # samba-doc package is installed.
    # Date: 2010-07-05

    [global]
    workgroup = informatica
    passdb backend = tdbsam
    printing = cups
    printcap name = cups
    printcap cache time = 750
    cups options = raw
    map to guest = Bad User
    include = /etc/samba/dhcp.conf
    logon path = \\%L\profiles\.msprofile
    logon home = \\%L\%U\.9xprofile
    logon drive = P:
    usershare allow guests = Yes
    add machine script = /usr/sbin/useradd -c Machine -d /var/lib/nobody -s /bin/false %m$
    domain logons = No
    domain master = No
    netbios name = linux
    security = user
    usershare max shares = 100
    wins support = No

    [printers]
    comment = All Printers
    path = /var/tmp
    printable = Yes
    create mask = 0600
    browseable = Yes
    guest ok = Yes
  6. Activamos los niveles de ejecución para los servicios Cups y Samba si aún no lo hemos hecho:
    testsrv:~ # chkconfig --add cups
    testsrv:~ # chkconfig --add smb

  7. Y por último reiniciamos ambos servicio para que se carguen las nuevas configuraciones y con eso ya debería quedar funcionando todo.
    testsrv:~ # service cups restart
    testsrv:~ # service smb restart


Observaciones:

Quisiera aclarar algo muy importante, tienen que tener en cuenta que si desconectan una impresora y la enchufan en otro puerto una vez iniciada la PC, o que hayan apagado ambas impresoras y luego las volvieron a encender en una secuencia incorrecta, es probable que el orden en que el sistema operativo monte las impresoras sea incorrecto. Esto se debe a que cuando el sistema operativo (ya arrancado) detecta la primera impresora que se enchufa la va a montar en la unidad lógica usblp0 sin importar en que puerto USB haya sido.

Nuevamente pasamos a un ejemplo para aclarar esta situación: Si arrancamos el sistema operativo y desenchufamos ambas impresoras de los puertos USB nos daremos cuenta que en el directorio /dev no existirán unidades lógicas de las impresoras. Ahora si enchufamos el cable USB de la impresora B en el mismo puerto USB3 que mencionamos antes, nos daremos cuenta que el sistema operativo creará una unidad lógica en el directorio /dev, pero en vez de que el nombre de la unidad sea usblp1 será usblp0 porque es la primera impresora que se conecta. Luego si conectamos el cable USB de la impresora A al mismo puerto anterior USB2 tendremos que se montará la unidad lógica en el directorio /dev como usblp1 al ser la segunda impresora que se ha conectado. Lo interesante es que con esto logramos que todas las impresiones que antes enviamos a la impresora A a través de la unidad lógica /dev/usblp0 ahora lo estaremos enviando a la impresora B y viceversa.

Podemos comprender como el orden de conexión de los cables va a afectar la creación de las unidades, y como es muy tedioso andar configurando el DeviceURI cada vez que sucede esto, es fundamental prestarle mucha atención al orden de la secuencia de conexión, o mejor dejar siempre que durante el arranque del sistema operativo detecte y monte las unidades lógicas de las impresoras con la secuencia correspondiente como se había sugerido en el tercer punto de los pasos antes mencionados.


Enlaces externos

Comentarios