Cómo utilizar una impresora GDI (winprinter) desde Linux

De zerutek

Saltar a: navegación, buscar

03/09/2010

Cómo utilizar una impresora GDI (winprinter) desde Linux

El último recurso a utilizar cuando se dispone de una impresora que no funciona en tu sistema.

Antes de empezar

La realización de estas tareas supone un trabajo arduo y poco gratificante, por lo que no uses este método a menos que no tengas alternativa, e invierte en hardware que no sea utilizable sólo en windows.

El problema

Tengo que hacer funcionar una impresora gdi, en concreto una Konica Minolta Magicolor 2500W en Linux. Esta impresora USB no tiene ningún tipo de driver para sistemas que no sean windows, por lo que sólo se puede utilizar por medio de una emulación.

Para solucionar este problema se opta por una virtualización completa de una máquina windows, para que el software de la impresora pueda funcionar.

Entorno utilizado

  • Máquina host
    • Debian Squeeze AMD64
      • Samba
      • Cups
    • Intel Core i7
    • Mucha RAM
    • nVidia
  • Konica Minolta Magicolor 2500W

Eligiendo la virtualización

Para añadirle más emoción, la máquina host tiene una tarjeta nVidia con los drivers privativos para que funcione correctamente cierto software.

KVM

Mi opción preferida. Forma parte del sistema y no hay que hacer prácticamente nada para que funcione.

Tras la instalación de la máquina virtualizada, se arranca esta con la impresora USB conectada con el parámetro:

-usb -usbdevice host:132b:2045

La máquina virtualizada detecta la impresora correctamente, pero a la hora de imprimir, ..., maravilloso pantallazo azul.

Al parecer KVM no se lleva bien con los dispositivos USB 2.0.

Se descarta KVM. Es posible que futuras versiones solucionen el problema.

Xen

Una virtualización muy madura. Tras la instalación del kernel adecuado en la máquina host, se descubre que los drivers privativos de nVidia dejan de funcionar. Parece que nVidia está trabajando en ello, pero en el momento de mis pruebas no fui capaz de hacerlo funcionar, ni siquiera compilando módulos del kernel como si Xen no existiera.

Sospecho que con Xen se puede llegar a hacer funcionar, pero no llegué ha hacer pruebas mas allá.

Oracle VirtualBox

Una opción que no me gusta nada. VirtualBox tiene una versión libre, pero todas las cosas "guais" como el soporte para USB, que al final son las que necesitas, sólo están en la versión no libre, aunque gratuita.

Tras la instalación de la máquina virtualizada, y escoger la impresora USB, esta es detectada e imprime.

Instalar la impresora Postscript virtual

Una vez tengamos la máquina virtual (da lo mismo cual se utilice), la red de la misma y la impresora funcionando, podemos pasar a este paso que consiste en crear una impresora Postscript que redirigirá los trabajos de impresión hacia la impresora GDI.

Agradecimientos

Este mini manual ha sido posible gracias a esta página, que sirve como referencia para todo el proceso.

Requerimientos

De la página de Ghostscript necesitaremos Ghostscript, GSview y RedMon

Instalar el software

Tras tener la impresora funcionando, se instala el software en este órden:

  • Ghostscript - El software de emulación Postscript.
  • GSview - Visor y procesador de impresión Postscript.
  • RedMon - Redirector de puertos de impresora

La impresora Postscript

Tras tener instalado el software, creamos una impresora con estas características:

  • Impresora local. Nada de "Plug and Play".
  • El puerto de impresora tiene que ser un "Redirected Port".
  • El driver de la impresora tiene que ser un driver Postcript, en este caso se ha utilizado una Apple Color LW 12/660 PS

Una vez instalada la impresora, se configura el puerto de la misma, con las siguientes características:

  • Redirect this port to the program:
C:\Archivos de programa\Ghostgum\gsview\gsprint.exe
  • Arguments for this program are:
-printer "KONICA MINOLTA magicolor 2500W" -color -

El nombre de la impresora debe de ser exacto, así como los guiones y espacios.

Tras esto, si mandamos una página de prueba por la impresora postscript, esta debe de llegar a salir por la la impresora física.

Ya podemos compartir la impresora postscript, para que las máquinas Linux la utilicen.

Cups

En este momento tenemos una máquina windows virtualizada, con una impresora postcript compartida.

Para configurar la misma impresora que en la máquina virtualizada (Apple Color LW 12/660 PS) se requiere el fichero APLWCSB1.PPD

En el sistema Linux Tenemos que crear una impresora:

  • Con el navegador entramos en la utilidad de administración de cups:
http://localhost:631/admin
  • Añadimos impresora (introducimos la password de administración si fuera necesario)
  • Otras impresoras en red: Windows Printer via SAMBA
  • Conexión:
smb://win_machine/POSTSCRIPT
    • win_machine IP de la máquina windows virtualizada
    • POSTSCRIPT Nombre de la impresora postscript compartida
  • proporcione un archivo PPD:
APLWCSB1.PPD

Con esto tenemos funcionando la impresora desde Linux. :-)

VirtualBox

Para que la máquina virtualizada siempre esté funcionando, lo ideal es guardar un "SnapShot" de la máquina funcionando y restaurarlo cada vez que se vaya a imprimir. También es conveniente que todo esto funcione con el usuario, en vez de como "root".

Paquetes necesarios

Para esta instalación he utilizado los repositorios que ofrece Oracle para Lenny, añadiendo al ' /etc/apt/sources.list' la linea:

deb http://download.virtualbox.org/virtualbox/debian lenny non-free
  • El paquete instalado es:
virtualbox-3.2

Módulos del kernel

Para el correcto funcionamiento del VirtualBox se requieren los módulos

vboxdrv
vboxnetflt
vboxnetadp
  • Para instalarlos uso el paquete:
virtualbox-ose-dkms

De esta manera aseguro que los módulos necesarios estén, aunque cambie la versión de kernel.

  • Posiblemente el paquete de virtualbox me ofrezca las mismas funcionalidades y pueda compilar los módulos prescindiendo del paquete 'virtualbox-ose-dkms', por medio de:
/etc/init.d/vboxdrv setup
Incompatibilidades con otras utilidades de virtualización

Los módulos del kernel utilizados por KVM entran en conflicto con los de VirtualBox. Si no se quiere desinstalar KVM se puede recurrir a crear el fichero '/etc/modprobe.d/virtualbox.conf':

blacklist kvm
blacklist kvm-intel
blacklist kvm-amd

Permisos de usuario

Para que VirtualBox funcione cuando lo lanza un usuario, este requiere estar en el grupo:

vboxusers

En este caso, como la impresora es USB se requiere también el grupo:

lp

Red

He optado por generar una interfaz (vnet0) en una red aparte (192.168.14.0), y darle salida por medio de NAT.

  • Añadir al '/etc/network/interfaces'
# VirtualBox NAT bridge
auto vnet0
iface vnet0 inet static
   address 192.168.14.254
   netmask 255.255.255.0
   bridge_ports none
   bridge_maxwait 0
   bridge_fd 1
   up iptables -t nat -I POSTROUTING -s 192.168.14.0/24 -j MASQUERADE
   down iptables -t nat -D POSTROUTING -s 192.168.14.0/24 -j MASQUERADE
  • Configurar la máquina virtual para que lo use:
VBoxManage modifyvm "XP" --bridgeadapter1 vnet0
  • La máquina windows tiene que tener una IP dentro del rango asignado, y la como puerta de enlace la IP asignada dentro del interfaces (192.168.14.254).

Comando útiles

Siendo "XP" el nombre de la máquina virtualizada

  • Info
VBoxManage showvminfo "XP"
  • Dispositivos USB
VBoxManage list usbhost
  • Capturar un Dispositivo USB
VBoxManage controlvm "XP" usbattach /proc/bus/usb/002/002
  • Enciende sin entorno gráfico
VBoxManage startvm "XP" --type headless
  • Apaga
VBoxManage controlvm "XP" acpipowerbutton
  • Apaga a lo bruto (botonazo)
VBoxManage controlvm "XP" poweroff
  • Cambia la memoria asignada a la máquina virtual
VBoxManage modifyvm "XP" --memory 256
  • Genera un snapshot
VBoxManage snapshot "XP" take XP.snap
  • Restaura un snapshot
VBoxManage snapshot "XP" restore XP.snap

Script de encendido y apagado

En mi caso, he implementado un script, que el usuario llama desde dos iconos (apagado y encendido) situados en su escritorio. Como se arranca un "snapshot", puede apagarse a lo bruto y reiniciarse siempre que se desee

#!/bin/sh

case "$1" in
   start)
      VBoxManage snapshot XP restore XP.snap
      VBoxManage startvm "XP" --type headless
      ;;        
   stop)
      VBoxManage controlvm "XP" poweroff
      ;;        
   *)   
      echo "Usage: $0 {start|stop}"
      ;;        
esac

Notas

  • Se puede usar cualquier máquina virtual, siempre que esta sea capaz de imprimir por la impresora GDI.
  • Lo expuesto aquí no es "dogma de fe", seguro que se pueden realizar muchas de las tareas de manera diferente.
  • Faltan muchos detalles de las miles de pruebas realizadas, pero mi memoria no da para más.
  • Si alguien encuentra una manera mejor de hacer esto, por favor, porfa porfa, porfa porfa porfa porfa, que se ponga en contacto conmigo. :-D

Enlaces

http://www.xen.org
http://www.linux-kvm.org
http://www.virtualbox.org
http://pages.cs.wisc.edu/~ghost/ http://mirror.cs.wisc.edu/pub/mirrors/ghost/GPL/gs871/gs871w32.exe
http://mirror.cs.wisc.edu/pub/mirrors/ghost/ghostgum/gsv49w32.exe
http://mirror.cs.wisc.edu/pub/mirrors/ghost/ghostgum/redmon17.zip
http://ftp.uma.es/Drivers/PRINTERS/APPLE/12_600PS/PRINSW_3/APLWCSB1.PPD

Referencias

http://forums.gentoo.org/viewtopic-t-819521-start-0.html
http://albertomolina.wordpress.com/2009/07/15/xen-y-controlador-privativo-nvidia-por-finto/
http://es.wikipedia.org/wiki/Postscript
http://iharder.sourceforge.net/current/macosx/winmacprinter/
http://support.apple.com/kb/TA37258?viewlocale=en_US