"Después del juego es antes del juego"
Sepp Herberger

viernes, 29 de julio de 2016

Pico Proyector Acer C112 DLP en Ubuntu 14.04 y 16.04

Estos días estoy jugando con un mini proyector Acer C112 DLP para hacerlo funcionar. Es un aparato curioso, que no tiene entrada VGA sino que se conecta por USB y con un programa cliente (EZ Display) se envía en tiempo real la pantalla desde el PC al proyector. No tiene mucha resolución ni luminosidad, pero está dentro de los márgenes que se esperan en este tipo de proyectores.


En principio el aparato solo trae el driver/programa cliente para Windows XP (aunque si insistes y pruebas al final puedes hacerlo funcionar en Windows 7) y punto pelota. Que maravilla, un aparato comprado hace pocos años que no funciona ni con Linux ni con Windows 8 y 10, vamos, que estos de Acer se han lucido con el soporte.

En esta páginaofrecen unos drivers/software para hacerlo funcionar en Windows 8 y 10. Parece un desarrollo propio de un programador al margen de Acer y al parecer hay que pagar algo, aunque el precio es bastante reducido (15$ es poco por poder seguir utilizando el aparato).

Para Linux, en cambio, tenemos a un héroe llamado Antonio Ospite (muy majo y atento que responde a cualquier consulta rápidamente) que estuvo sniffeando junto a Reto Schneider el tráfico USB windows-proyector y desensamblando el driver hasta poder hacer una librería y una aplicación en Linux que funciona perfectamente tal como funciona su equivalente Windows: el proyecto libam-7xxx, que soporta varios picoproyectores tales como:

  • Acer Series C pico projectors (C20 C110 C112 C120)
  • Philips/SagemCom PicoPix projectors (PPX 1020, PPX 1230, PPX 1430, PPX 1630)
  • CEL-TEC MP-01
  • Otros chinos

Para Ubuntu 16.04 es sencillo, instalamos estos paquetes desde repositorios:
ii  libam7xxx0.1                                 0.1.6-2                                    amd64        library for accessing am7xxx based devices
ii  libam7xxx0.1-bin                             0.1.6-2                                    amd64        library for accessing am7xxx devices - utilities
ii  usb-modeswitch                               2.2.5+repack0-1ubuntu1                     amd64        mode switching tool for controlling "flip flop" USB devices
ii  usb-modeswitch-data                          20151101-1                                 all          mode switching data for usb-modeswitch
Aquí tuve un pequeño problema un par de días: pinchaba el dispositivo y tras cierta una actividad de disco se quedaba todo quieto. Mirando con lsusb los dispositivos conectados no aparecía nada. Mirando el syslog se ve como se detecta algo, se prueban unos driver y al final todo acaba diciendo:
Jul 25 11:37:48 pc kernel: [ 5603.550891] option 1-8:2.0: device disconnected
Tras consultar con Antonio y sugerirme varias pruebas (desinstalar usb-modeswitch, quitar el módulo option de memoria, desinstalar libmtp-runtime) al final ha empezado a funcionar solo. Pienso que coincide con que he actualizado el kernel a 4.4.0-21-generic #37-Ubuntu, pero no estoy seguro.

Bueno, ahora pinchamos el dispositivo y haciendo lsusb debe aparecer primero como 1de1:1101 (dispositivo de almacenamiento, conteniendo los drivers de Windows XP) y en unos instantes usb-modeswich lo cambia a 1de1:5501, que es el proyector en si. Como no hay driver para él, no aparece ningún dispositivo que lo maneje. No importa, la aplicacion am7xxx-play envía directamente lo que le digamos por el puerto USB sin intermediarios, usando:
# am7xxx-play -f x11grab -i :0
Enviamos en tiempo real el contenido de la pantalla tal como lo hace EzDisplay. Si se mira la ayuda de am7xxx-play se verán opciones para modificar resolución, calidad, conexiones en tiempo real a otras fuentes de vídeo (cámaras, páginas web, etc). Vamos, una pequeña maravilla....¡gracias!.

Después de esto me he visto en la necesidad de usarlo en Ubuntu 14.04 con el problema de que no hay paquetes para ellos en repositorios. En https://ao2.it/debian/ hay varios paquetes compilados para Debian, pero ninguno acababa de encajar en el Ubuntu 14.04, siempre daban problemas con libavcodec5X y satélites (esos paquetes están relacionados con ffmpeg y continuamente dan problemas de compatibilidad con otras aplicaciones, parece ser que tienen un desarrollo fuertemente acoplado y cada versión es incompatible con el resto) ya que necesitaban unas versiones que no son las que trae Ubuntu 14.04 (libavcodec54 concretamente).

¿Solución?. Pues cómo en los viejos tiempos: vamos a compilar (y cumplimos la sentencia windowchista de que siempre estamos compilando los hijos de Linux). Antonio lo pone bastante sencillo: tenemos un repositorio git de donde solo hay que descargar y compilar. La última versión es la 0.1.6-2, pero es incompatible con Ubuntu 14.04. Para ahorrarme rollo ya digo que la última versión compatible es la 0.1.4-3, liberada hace 2 años.

Sin usar comandos git podemos descargarla directamente desde https://git.ao2.it/libam7xxx.git/commit/a49ffce85139aaf1fc2e2e79dd6c65ad7e7f523c en el enlace "snapshot".

Una vez descargado, descomprimimos el .tar.gz y seguimos los pasos del documento HACKING.asciidoc contenido en él:
 #cd libam7xxx-a49ffce
# aptitude install cmake libusb-1.0-0-dev libavformat-dev libavcodec-dev libavdevice-dev libswscale-dev
# mkdir build
# cd build
# cmake ../
# make 
Una vez hecha la compilación, en libam7xxx-a49ffce/build están los ejecutables y librerías. Podría hacer un paquete Debian para ellos, pero no, voy a instalar como en los viejos tiempos de Slackware:
 # make install
Con esto se copia todo a su sitio y si pinchamos el cañon en el USB ya podremos hacer:
# am7xxx-play -f x11grab -i :0
Una última nota: el fichero HACKING.asciidoc cuenta que es posible hacer funcionar am7xxx-play en Windows para que nos funcione allí aunque Acer no haya sacado drivers... ¿saben cómo? ¡Compilando!.

domingo, 24 de julio de 2016

DRBL no live.

Ozú que caló y cuanto trabajo en los finales del curso. Es como una ginkana sin premio.

Mi compañero Esteban nos enseñó y nos ha ampliado varias veces como usar DRBL para realizar clonaciones multicast masivas de PC, de tal manera que nos hemos ahorrado mucho tiempo y hemos podido realizar de manera muy eficiente la preparación de portátiles de un curso para otro.

Aunque he usado muchas veces el sistema de arrancar DRBL desde un pendrive, realizar los pasos de la guía de Esteban y cargar las imágenes de los portátiles de 10 en 10, esta vez y por motivos que no vienen a cuento, pensé en modificar un sistema ya instalado en un portátil para meter los scripts DRBL dentro y clonar desde alli. Sin pendrives live ni nada. El resto del tiempo el portátil tendrá un uso normal y podré recurrir a él cada vez que tenga que hacer una clonación multicast.

La principal (y seguramente la única) ventaja es que toda la parte de la configuración del entorno DRBL solo tendría que hacerla una vez: en la instalación. Con DRBL live esto es una secuencia de pasos de configuración bastante pesada que tienes que hacer con cada nuevo arranque, en cambio en un sistema instalado solo lo tendrias que hacer la primera vez y quedaría el entorno semiconfigurado.

Para ello me he guiado por este enlace y este otro, así como la página dedicada a la instalación de DRBL, aparte (como no podría ser de otra forma) del blog de Esteban.

Enumeremos la secuencia de pasos:

1) Sistema: partimos de un portátil ya funcional, en mi caso un Netbook Inves con Xubuntu 14.04 instalado.

2) Instalación del software.

Empezamos añadiendo el repositorio de DRBL:
# cat /etc/apt/sources.list
.......
deb http://drbl.sourceforge.net/drbl-core drbl stable
Importamos la clave GPG y actualizamos los índices:
# wget http://drbl.sourceforge.net/GPG-KEY-DRBL
# apt-key add GPG-KEY-DRBL
# apt-get update
Instalamos el entorno DRBL y todas sus dependencias (si tenemos pkgsync no olvidemos incluir "drbl" en el mayhave).
# apt-get install drbl
# /usr/sbin/drblsrv -i
Todas las dependencias están ya dentro del mismo paquete, asi que con eso tenemos el entorno instalado y podemos pasar a configurarlo:

3) Configuración del entorno DRBL:
# drbl-push -i 
Esto nos hará una serie de cuestiones que podemos responder tal y como indican en los enlaces indicados anteriormente, en especial este del blog de Esteban.

En mi caso el directorio /tftpboot estaba en la partición raíz y alli apenas había espacio para meter todo lo que hace falta para el entorno, asi que lo he metido dentro de /home, que está en otra partición donde hay espacio de sobra. Luego he creado un enlace simbólico desde /tftpboot y tan pancho:
# mkdir /home/tftpboot
# ln -sf /home/tftpboot /tftpboot
# drbl-push -i 
La configuración generada por drblpush se guarda en /etc/drbl/drblpush.conf y podemos reutilizarla en otra ocasión o moverla de una máquina a otra usando el comando:
# drbl-push -c /etc/drbl/drblpush.conf
De esta manera nos ahorramos la tediosa ronda de preguntas. En mi caso (y en el tuyo deberia suceder lo mismo) este fichero queda:
# cat /etc/drbl/drblpush.conf

#Setup for general
[general]
domain=drbl.org
nisdomain=penguinzilla
localswapfile=yes
client_init=graphic
login_gdm_opt=login
timed_login_time=
maxswapsize=128
ocs_img_repo_dir=/home/partimag
total_client_no=20
create_account=
account_passwd_length=8
hostname=linex-
purge_client=no
client_autologin_passwd=
client_root_passwd=
client_pxelinux_passwd=
set_client_system_select=yes
use_graphic_pxelinux_menu=yes
set_DBN_client_audio_plugdev=yes
open_thin_client_option=no
client_system_boot_timeout=5
language=es_ES.UTF-8
set_client_public_ip_opt=no
config_file=drblpush.conf
collect_mac=no
run_drbl_ocs_live_prep=yes
drbl_ocs_live_server=
clonezilla_mode=full_clonezilla_mode
live_client_branch=alternative
live_client_cpu_mode=i386
drbl_mode=full_drbl_mode
drbl_server_as_NAT_server=no
add_start_drbl_services_after_cfg=yes
continue_with_one_port=

#Setup for eth0:0
[eth0:0]
interface=eth0:0
range=200-219
Nótese en range que he puesto un rango de 20 ip. Nunca voy a clonar mas de 20 PC a la vez, pero ese parámetro puedes variarlo en función de tus necesidades.

4) Lanzar la clonación.

Bueno, pues todos los pasos anteriores se hacen una sola vez y ya queda el entorno preparado para dar soporte de clonación cuando así lo requiramos, todo lo anterior correspondería a los pasos 1-21 descritos en este manual de Esteban. Ahora el portátil lo usaremos de forma normal (en mi caso es un portátil que usa habitualmente un alumno) y cuando queramos utilizarlo para realizar una clonación multicast haremos simplemente los siguientes pasos:

  • Meter las imágenes de clonación en directorios dentro /home/partimag si no estaban antes. Otra opción es pinchar un dispositivo externo de memoria y hacer que /home/partimage apunte al directorio de las imágenes usando "mount --bind"
  • Parar el servicio network-manager para que no interfiera en configuración drbl de la red.
  • Configurar la red con las direcciones correctas en eth0 y eth0:0.
  • Arrancar el servidor de clonación y responder a sus preguntas básicas sobre la imagen a cargar, el número de equipos a clonar, etc. (pasos 22 a 34 del manual de Esteban)
  • Levantar los servicios dhcp y tftp para que sirvan las ip y los clientes de clonación de imágenes.

Una vez hecho esto, podemos arrancar los clientes para que carguen el sistema por PXE y esperar a que empieze la clonación multicast.

Por comodidad estos pasos los he metido en un script que dejo en /root/lanza-clonacion.sh:
#!/bin/bash
service network-manager stop
ifconfig eth0 up
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
ifconfig eth0:0 up
ifconfig eth0:0 192.168.100.254 netmask 255.255.255.0
/usr/sbin/dcs
service isc-dhcp-server restart
service tftpd-hpa restart
exit 0
De esta manera ejecuto el script, respondo a las 4 o 5 preguntas sobre que quiero clonar y donde y ya está. Incluso esa parte se puede automatizar: el comando /usr/sbin/dcs acepta parámetros para que no haga preguntas, quedando por ejemplo así:
 drbl-ocs -b -g auto -e1 auto -e2 -r -x -j2 -sc0 -p poweroff --clients-to-wait 10 --max-time-to-wait 300 -l es_ES.UTF-8 startdisk multicast_restore xubuntu-portatiles-workstation-amd64 sda
De esta manera configuramos DRBL para enviar la imagen llamada "xubuntu-portatiles-workstation-amd64" en el disco sda de 10 portátiles, esperando 300 segundos antes de comenzar la clonación.

Nota: aunque no lo he dicho la infraestructura de hardware sería la que propone Esteban: un switch aislado de la red del centro (mejor si no es gestionable, dan menos problemas con el multicast) y conectados a él los portátiles o equipos a clonar, así como el portátil que nos hace de servidor.

Hasta pronto, ahora en julio-agosto intentaré sacar varios posts plúmbeos que tengo pendientes como este. También hablaré del gobierno.