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

miércoles, 2 de diciembre de 2015

Una modesta propuesta sobre el montaje de pizarras digitales

A estas alturas del baile llevamos ya experimentadas varias soluciones de implantación de pizarras digitales en nuestras aulas. Las mas extendidas (las SmartBoard y Galneo) nos han obligado a adaptar el aula a las limitaciones del cableado de la pizarra. Me explico:

  • En las SmartBoard 480 el cable USB es de datos y alimentación, mientras que el PC que la controla está en la mesa del profesor. Hace falta un cable USB activo de no más de 5 metros que obliga al PC a estar como máximo a 5m de la pizarra, lo que provoca cables tirantes y problemas de señal inestable en cuanto este se afloja un poco alguna de la conexiones.
  • En las Galneo tenemos el mismo problema con el cableado, pero se adopta la idea de dejar el PC debajo de la pizarra en una caja que sobresale hasta 30cm de la pared y que parece hecha aposta para quebrar rótulas, convirtiendo "ergonomía" en una palabra utópica. Del PC salen cables de VGA, red y usb para teclado/ratón/pendrive que van canalizados hasta el puesto del profesor

En resumidas cuentas, el diseño ha optado por adaptar el aula al dueto PC-pizarra, que deben estar separadas por un máximo de 5 metros de cable (menos en línea recta) en lugar que sean PC y pizarra los que adapten su ubicación a la morfología del aula, como sería lo razonable. Me recuerda esta bonita historia:

Un señor acudió un sastre y le entregó una pieza de fino cachemir a fin de que le confeccionara un traje. Le tomó las medidas el maestro y unas semanas después lo llamó por teléfono a su casa para avisarle que el traje estaba listo. Se lo probó el señor. El traje era un desastre: las perneras del pantalón le llegaban apenas al tobillo; una manga de la chaqueta le colgaba casi hasta tocar el suelo, en tanto que la otra ni siquiera alcanzaba a cubrirle el codo. "Oiga, maestro -le dice- este traje está mal hecho. Mire qué mal me queda". "El traje está perfecto, caballero -contesta el ruin tijera-. El problema es de postura. Mire: levante usted el brazo derecho hacia adelante. Muy bien. Ahora encoja el izquierdo y llévelo hacia atrás. Perfecto. Ahora quiébrese usted por la cintura y doble las piernas abriéndolas un poco. Excelente. ¿Lo ve? Así las mangas de la chaqueta alcanzan su debida dimensión, y las perneras del pantalón le cubren ya lo necesario".

No reclamó ya más el cliente, pues era hombre apocado, y procuraba siempre evitar las discusiones. Salió, pues, de la sastrería caminando en la postura que el sastre le había indicado: un brazo estirado hacia arriba y adelante; el otro doblado hacia atrás; el cuerpo encorvado, y con las piernas torcidas. Comparado con él Quasimodo estaba más derecho que una vela. Así, todo deforme y contrahecho, iba por la calle el lacerado cuando lo vieron dos sujetos que pasaban. Le dice uno al otro, compasivo: "Pobre infeliz. Mira qué jodido está". "Sí -concede el otro-. Pero qué buen sastre tiene"

Entonces, yo me pregunto si no se puede enfocar el problema de esta manera que voy a proponer. Primero hablemos del hardware:

  • El PC en su sitio, en la mesa del profesor.
  • La pizarra donde mejor quede en el aula, sea cual sea la distancia que la separe del PC.
  • Junto o tras la pizarra una Raspberry Pi o cualquier miniordenador alimentado por un enchufe normal de corriente y que por su puerto USB se conecta a la pizarra con un cable corto que le da alimentación eléctrica y le permite comunicarse con ella.
  • La Raspberry Pi y el PC están conectados por un cable ethernet debidamente canalizado, que puede tener decenas de metros de largo e ir por sitios donde sea poco llamativo y/o molesto.


En cuanto al software, podría haber dos soluciones:

  • Solución A: usando usb-over-ip instalando el server en la Raspberry Pi para compartir la conexión USB con el pc mediante una conexión IP. El PC remoto tendría instalados el cliente usb-over-ip y los drivers, detectando la pizarra como si estuviese conectada a un puerto USB real propiamente suyo. Este sistema ya lo implementé por mi cuenta de forma bastante satisfactoria reutilizando un router con OpenWrt, un aparato mucho menos versátil que una Raspberry.
  • Solución B: la Raspberry Pi tendría instalado el driver de la pizarra, que tras procesar la señal que llega obtiene unas coordenadas X-Y y un evento de botones de ratón. Esos datos se comparte via TCP/IP con el PC. Si hay que hacer algún pre-procesado de la señal (por ejemplo la triangulación de señal de las cámaras de la SmartBoard 480 para determinar la posición X e Y, realizada por el ejecutable binario nwfermi_daemon) se hace en la propia Raspberry, liberando de esta tarea al PC del profesor.

    ¿Como llega la información de coordenadas y botones al PC?: pues como se hace en cualquier herramienta de "ratón remoto", Synergy por ejemplo o la miríada de ellas que hay en en Google Play que convierten un móvil/tablet Android en un touchpad que controla remotamente el PC: hay un programa servidor, que se ejecuta en la Raspberry y un programa cliente en el PC del profesor, que conectan por un socket TCP/IP y se transmiten la información. El programa cliente utiliza cualquiera de las múltiples herramientas que hay (por ejemplo ésta) para emular el movimiento del ratón.

    Un enfoque mas trabajado y bonito sería implementar un driver para el PC, con un frontend con apariencia de dispositivo HID/ratón que se muestra al sistema como un dispositivo /dev/XXXX y un backend que conecta via TCP/IP con la Raspberry Pi para leer las coordenadas y estado de los botones del servidor que se ejecutaría en la misma. Parece rimbombante pero no es muy difícil de hacer si se cuenta con el tiempo para ello.

Bueno, pues eso es todo: una modesta, barata y sencilla propuesta para montajes futuros y que pueden aplicarse también a montajes presentes donde queramos romper la cadena inelástica que obliga a tener muy próximos pizarra y PC, con grandes problemas derivados de tan absurda limitación.

Fin de impresión.

lunes, 23 de noviembre de 2015

Expediente X(org)

Dado que la administración de sistemas es pariente lejana del vudú, a veces pasan cosas muy misteriosas en nuestras máquinas. Hay aplicaciones que no funcionan como debieran mientras que en otros PC no dan problemas. Voy a contar 3 casos que me han tocado de cerca:
  • En las LibreOffice, al ir escribiendo un documento de texto se quedaban en blanco determinadas partes de la pantalla, siendo imposible ver lo escrito.
  • El pseudo-driver de las pizarras Interwrite, el Device Manager (hecho en Java, toma moreno), no arrancaba en un PC y por tanto no se mostraba el icono del driver en el panel. Lanzando el LinuxLauncher.sh a mano desde un terminal de las X acababa dando una excepción y un error del tipo:
    
    The error was 'BadMatch (invalid parameter attributes)'.
     (Details: serial 253 error_code 8 request_code 73 minor_code 0)
     (Note to programmers: normally, X errors are reported asynchronously;
      that is, you will receive the error a while after causing it.
      To debug your program, run it with the --sync command line
      option to change this behavior. You can then get a meaningful
      backtrace from your debugger if you break on the gdk_x_error() function.)
    
  • En el software Notebook de las pizarras Smartboard hay una funcionalidad llamada Screen Shade que simula una cortinilla que puedes mover y tapar parte de la imagen (como en los chistes "se baja el telón...") desde los 4 laterales. Al usarlo no funcionaba y no tapaba nada al correr/descorrer las cortinas.

Todo estos expedientes X, que parecen problemas de la aplicación, son realmente problema de la versión o configuración del driver de las X que usamos (es decir, son expedientes X.Org). Hay una manera rápida y segura de confirmarlo: no usando dicho driver y repitiendo la acción, ¿cómo "no usamos dicho driver"?. Bueno, podríamos modificar /etc/X11/xorg.conf para cargar el driver Vesa y reiniciar las X para hacer la prueba, pero no hace falta ser tan drásticos. Hay un par de maneras más sencillas:

  • Para probarlo con una aplicación concreta (problema anterior de las LibreOffice): desde otro PC entrar con
    # ssh -X usuario@ip-pc-problematico
    
    Y una vez aquí lanzamos la aplicación desde línea de comandos y probamos a intentar repetir el problema. En el caso de LibreOffice ya no se hacían "invisibles" los caracteres escritos.
    La solución que encontraron mis compañeros fue cambiar el driver usado de nouveau a nvidia.
  • Para probarlo con el escritorio completo (problema anterior del Device Manager de Interwrite o del Screen Shade de Smart Notebook) lo mas rápido es usar xrdp en el PC que da el problema:
    # apt-get install xrdp
    
    y conectar mediante rdesktop a él remotamente desde otro:
    # apt-get install rdesktop
    # rdesktop ip-pc-problematico
    
    Y una vez hemos hecho login en el escritorio remoto vemos que el problema ya no sucede (ni el de Interwrite ni el de Smartboard).
Aquí vemos, dentro de una conexión xrdp, el Device Manager ejecutándose en la parte derecha del panel:
En este caso la solución que encontré fue cambiar el xorg.conf para que la aceleración pasase de ser EXA a SNA.

Y aquí el Notebook con el telón a medio descorrer:
En este caso no he encontrado todavía la solución, pero estoy en ello :-).

Con esto nos queda claro que haciendo la conexión con ssh -X o rdesktop, que no usan el driver X de la máquina destino para los gráficos, no existe ninguno de los problemas descritos. El problema está por tanto en el driver X o en su configuración.

A partir de aquí habría que investigar si procede cambiar el driver (actualizando o instalando la versión propietaria del mismo) o bien generar un xorg.conf y retocar sus esotéricos parámetros (como siempre, a ciegas y sin tener ni idea de lo que estamos haciendo). Con eso tendremos el Expediente X(org) resuelto.


Hasta pronto.....

martes, 10 de noviembre de 2015

Monitorizando nuestro SAI con nut (Reloaded-Parte 2)

En la entrada correspondiente a la Parte 1 contaba como monitorizar el SAI desde uno de nuestros servidores. Como estamos de renovación nos han llegado SAIs nuevos Salicru SPS 1500 One, así que voy a actualizar el documento anterior e incluir alguna cosa que quería corregir hace tiempo.

No me queda claro que sea o no un SAI online u offline (ver entrada anterior del blog para saber la diferencia) . Ya he tenido malas experiencias con SAIs offline y servidores HP Proliant (que es el nuevo servidor que nos han mandado), que se apagaban (bueno, se ponían en standby mode, que es casi apagado) antes de que al SAI le diese tiempo a activar la batería. Al primer corte de luz saldremos de dudas y podremos respirar tranquilos o bien darnos cabezazos contra la pared.

1) Configuración para el SAI Salicru SPS One 1500.

Lo primero es ver como se identifica. El lsusb me dice:
~# lsusb
Bus 004 Device 074: ID 0665:5161 Cypress Semiconductor USB to Serial
Buscando el identificador 0665:5161 por Internet el driver adecuado es blazer_usb, así que el fichero ups.conf sería:
~# cat /etc/nut/ups.conf
[salicru]
#Conexión USB falla al poco tiempo y da errores en syslog.
driver = blazer_usb
desc = "SAI Salicru"
port = auto
vendorid = 0665
productid = 5161
bus = "004"
El valor bus="004" tendrá que adaptarse al que tenga cada cual en su caso. Del resto de ficheros de configuración descritos en la anterior entrada del blog no he tocado nada. Bueno, pues solo queda reiniciar los servicios nut-server y ups-monitor:
# /etc/init.d/ups-monitor restart
# /etc/init.d/nut-server restart
Y decirle al SAI, "ola, ke ase?":
~# upsc salicru
battery.charge: 100
battery.voltage: 27.60
battery.voltage.high: 26.00
battery.voltage.low: 20.80
battery.voltage.nominal: 24.0
device.type: ups
driver.name: blazer_usb
driver.parameter.bus: 004
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.productid: 5161
driver.parameter.vendorid: 0665
driver.version: 2.6.4
driver.version.internal: 0.08
input.current.nominal: 6.0
input.frequency: 50.0
input.frequency.nominal: 50
input.voltage: 233.6
input.voltage.fault: 233.6
input.voltage.nominal: 230
output.voltage: 233.6
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 22
ups.productid: 5161
ups.status: OL
ups.type: offline / line interactive
ups.vendorid: 0665
Parece ser que todo está en orden: me da bien los parámetros y aguanta todo lo que tengo enchufado (4 servidores, 1 monitor, el switch troncal, el switch de cisco y el respaldo 4G de Telefónica). Me preocupa la línea:
ups.type: offline / line interactive. 
Como el servidor nuevo HP sea quisquilloso con los SAI offline eso nos va a dar problemas y el SAI va a ser un bonito adorno, pero seamos positivos como teletubbies y no pensemos en ello de momento.

Nota 23/11/2015: bueno, me congratula anunciar que tras una prueba involuntaria por un corte de corriente puedo afirmar que el servidor Proliant nuevo no se apaga ni se pone en standby al tener que alimentarse solo del SAI. Parece ser que el "line interactive" es suficiente para nuestro servidor.

2) Configuración del envío de correos.

En el post anterior el envío de correos de aviso lo hacia con el programa mailsend, que es una forma rápida y efectiva de enviar correos a través de un servidor SMTP externo. Para ello usaba una función bash con 2 parámetros, el título y el texto del mensaje:
~# cat /root/scripts/mail.sh
function mailSend() {
    mailsend -smtp smtp.gmail.com \
        -port 587 \
        -starttls -auth \
        -user micuenta@gmail.com \
        -pass mipassword \
        -f micuenta@gmail.com \
        -t micuenta@gmail.com \
        -sub "$1" -M "$2"
}
Esta función la incluía mediante "source mail.sh" dentro del script bash desde donde vamos a enviar los correos, en nuestro caso en el script /root/scripts/avisoups.sh descrito en la anterior entrada del blog.

El problema de usar mailsend es que es un comando que no espera: si en el momento de ejecutarlo no puede contactar con el servidor smpt.gmail.com la ejecución es abortada y el envío del mensaje no se realiza. Esto, dentro del contexto que nos ocupa, con el SAI generando eventos seguramente por un corte de corriente hace que tengamos muchas papeletas para que algún switch o router de la red no tenga corriente y no se pueda alcanzar smpt.gmail.com, por lo que la función mailSend no haría un carajo.

Por dicho motivo había que resolverlo de otra manera. Durante un tiempo implementé un sistema de colas de envío construido alrededor de mailsend y gestionado de forma artesanal. Tenía una pinta tan cutre que he decidido borrarlo de la faz de Matrix y no publicarlo aquí ni en ningún otro sitio.

Vaya tontería reinventar la rueda si podemos usar postfix para enviar correos a través de gmail. Siguiendo las instrucciones de dicho enlace ya tenemos un sistema que manda correos usando postfix, basado en hacer un relay de los mensajes a la cuenta SMTP de gmail, que envía el correo. Como postfix si que tiene un sistema de encolado serio y profesional, si intentamos enviar un correo ante un corte de corriente y si no hay respuesta de smtp.gmail.com el mensaje queda encolado para intentarlo mas tarde.

Los ficheros main.cf, sasl_passwd, mailname y sender_canonical quedan finalmente:
~# cat /etc/postfix/main.cf 
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = gmail.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mail.example.com, miserver.vguadalupe, localhost.vguadalupe, localhost
relayhost =  [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/postfix/cacert.pem
smtp_use_tls = yes
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
sender_canonical_maps = hash:/etc/postfix/sender_canonical

~# cat /etc/postfix/sasl_passwd
[smtp.gmail.com]:587    micuenta@gmail.com:mipassword
El comando postmap a continuación crea /etc/postfix/sasl_passwd.db a partir de /etc/postfix/sasl_passwd, de manera que no se guarda la contraseña en texto plano sino en cifrado.
~# postmap hash:/etc/postfix/sasl_passwd

~# cat /etc/mailname 
gmail.com

~# cat /etc/postfix/sender_canonical
root micuenta@gmail.com
~# postmap /etc/postfix/sender_canonical
Para que los mensajes lleguen apareciendo como remitente micuenta@gmail.com en lugar de el aséptico "root" hay que retocar un poco los parámetros del comando "mail", que es el que usaremos para enviar los mensajes en lugar de "mailsend" ya que "mail" los envía a través del gestor de correos de salida por defecto, en nuestro caso postfix:
~# cat /root/scripts/mail.sh
function mailSend() {
echo "$2" | mail -s "$1" -a "From: avisos.ies "  cuenta.destino@gmail.com
}
3) Uso de knutclient para controlar el SAI desde nuestro PC de trabajo

Esta es una sugerencia de mi compañero Paco, del IES Garcia Téllez. Tengo pendiente probarla y describir aquí que tal va en una futura entrada. Se basa en que el nut es un sistema cliente-servidor, así que nada impide instalar un cliente nut gráfico en mi PC que contactará con el servidor remoto y me mostrará en la barra de tareas el estado del SAI. Una vía interesante para explorar.

Bueno, pues hasta pronto si la invasión de Microsoft y Adobe que esperamos en los centros educativos de Extremadura nos deja vivos. Siempre nos quedará Masada.


Addenda 29-marzo-2016: Bueno, pues después de unos meses monitorizando el SAI hemos tenido un problema bastante puñetero. Tarde o temprano el SAI dejaba de comunicarse con el PC y llenaba el syslog con mensajes:
Nov 12 14:27:21 servidor kernel: [  798.728084] usb 1-2: USB disconnect, device number 72
Nov 12 14:27:23 servidor kernel: [  800.628034] usb 1-2: new low-speed USB device number 73 using uhci_hcd
Nov 12 14:27:23 servidor kernel: [  800.806068] usb 1-2: New USB device found, idVendor=0665, idProduct=5161
Nov 12 14:27:23 servidor kernel: [  800.807639] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Nov 12 14:27:23 servidor kernel: [  800.809114] usb 1-2: Product: USB to Serial
Nov 12 14:27:23 servidor kernel: [  800.810592] usb 1-2: Manufacturer: INNO TECH
Nov 12 14:27:23 servidor kernel: [  800.842240] hid-generic 0003:0665:5161.0048: hiddev0,hidraw0: USB HID v1.00 Device [INNO TECH
USB to Serial] on usb-0000:00:1d.0-2/input0
Nov 12 14:27:33 servidor kernel: [  810.136084] usb 1-2: USB disconnect, device number 73
Nov 12 14:27:34 servidor kernel: [  811.680031] usb 1-2: new low-speed USB device number 74 using uhci_hcd
Y así horas y horas. A veces se solucionaba reiniciando el servidor (que gracia), o desconectando el SAI, o reiniciando el servicio nut. La mayoría de las veces no había otra opción que desconectarlo del USB antes de que el syslog explotase.

Los de soporte técnico de HP han puesto cierto interés en arreglarlo, pero sin grandes resultados. Propusieron usar el parámetro POLLFREQ con valor 2 en upsmon.conf, pero no sirvió de nada. También intentaron convencerme de que abandonase nut y usase ViewPower/WinPower, un monstruo propietario hecho en Java (agárrate, Manuel) para monitorizar el SAI. Ni de coña.

Al final nuestro compañero Carlos Martín me configuró esto:
# cat /etc/nut/ups.conf:
......
......
# Set maxretry to 3 by default, this should mitigate race with slow devices:
maxretry = 3

[salicru]
driver = blazer_usb
port = auto
Y con ese mágico maxretry llevo varios meses en mis dos SAIs sin más problema de comunicación. Carlos: eres un crack.




miércoles, 28 de octubre de 2015

Clonar pantalla y cañón de vídeo en el inicio de sesión.

Las tarjetas VGA son bastante rebeldes, cuando tienen dos salidas (típicamente una VGA D-sub 15 y una HDMI) a las que conectamos un monitor y un cañón de vídeo el comportamiento es bastante errático en función de la tarjeta de vídeo y los drivers usados: unas veces aparecen clonadas, otras veces como escritorio extendido y, por último, algunas veces aparece apagada una de ellas.

Como normalmente nuestra intención es que ambas aparezcan clonadas (ya que es lo que desea el usuario el 99% de las veces) lo mejor es poner un script que nos las clone usando el comando "xrandr". Luego, el propio usuario puede cambiar esa configuración por si mismo usando el programa "arandr".

En mi caso tengo un PC con 2 salidas de vídeo: VGA-0 (que va al monitor) y DVI-I-0 (que va al cañón de vídeo). El nombre de cada salida se conoce ejecutando "xrandr" sin parámetros, tal como conté aquí.

El comando que debemos ejecutar es:
xrandr --output VGA-0 --rate 60 --mode 1024x768 --output DVI-I-0 --mode 1024x768 --same-as VGA-0
En el que se fuerza una resolución de 1024x768 en ambas pantallas y hago que DVI-I-0 se clone de VGA-0. El monitor es realmente de 16:9, mientras que el cañón es de 4:3, por lo que la resolución de 1024x768 en el monitor queda un poco deforme, pero si queremos tener lo mismo es lo que hay. Se podría jugar con los parámetros "panning" y "scale" de xrandr para intentar conciliar 2 resoluciones distintas en el clonado, pero al final queda como el discurso de C's: totalmente amorfo por querer mezclar 2 agua y aceite, así que no he seguido por ese camino.

Para que esto se ejecute automáticamente en el arranque del sistema hay que poner el comando en algún script de inicio. En mi caso, como uso gdm3 para iniciar sesión lo añado al final de "/etc/gdm3/PreSession/Default", que es un script que se ejecuta justo antes de que el usuario inicie sesión en la máquina. De esta manera garantizo que cada vez que se haga login se configuren ambas pantallas como clonadas, independientemente de que alguien lo haya cambiado durante la sesión anterior.

martes, 27 de octubre de 2015

Desactivar el audio HDMI y dejar solo el sonido analógico mediante una tarea puppet.

En algunos de nuestros PC el sistema identifica 2 tarjetas de sonido: la tarjeta analógica tradicional y otra salida digital vinculada a la salida HDMI de la tarjeta VGA. Tenemos los altavoces conectados a la salida analógica, de tal manera que si por cualquier motivo en pulseaudio se selecciona (y pasa, no sabemos como, pero pasa) de forma espontánea la salida digital, el sonido deja de salir por los altavoces normales, que quedan mudos ante el desconcierto de los usuarios.

Lo solucionaremos en dos partes: primero veremos como hacer desaparecer la tarjeta de sonido digital y luego como automatizarlo vía puppet.

1. Desactivar la tarjeta de sonido.

En Debian Squeeze esto se evitaba blacklistando el módulo del kernel que maneja la tarjeta digital de audio (snd_hda_codec_hdmi), pero en Wheezy este método no funcionaba así como así. Menos mal que nuestro compañero Ricardo encontró la solución con el siguiente comando:
# echo 1 > "/sys/bus/pci/devices/..../remove"
Este comando enviado al dispositivo pci en concreto que representa nuestra tarjeta digital de audio hace que se vaporice, desapareciendo del hardware de la máquina, de pulseaudio y de todos lados. La tarjeta analógica queda como única salida de audio.

Antes hay que saber exactamente cual es el dispositivo pci asociado a la tarjeta de audio:
bus=$(lspci | grep "RV620 HDMI Audio" | cut -d" " -f1)
if [ -n $bus ]
then
      echo 1 > "/sys/bus/pci/devices/0000:00:01.0/0000:$bus/remove"
fi
Siendo "RV620 HDMI Audio" la cadena que identifica nuestra tarjeta de audio HDMI (la descripción se saca con la orden lspci) y debería adaptarse la tarjeta que tenga cada cual. Escrito de forma mas breve sería:
bus=$(lspci | grep "RV620 HDMI Audio" | cut -d" " -f1); test -n $bus && echo 1 > "/sys/bus/pci/devices/0000:00:01.0/0000:$bus/remove"
Como debe ejecutarse al arrancar el sistema, para que quede desactivado desde el principio, el sitio mas adecuado es en /etc/rc.local, antes del exit 0 con el que acaba dicho script.

2. Insertar una línea en rc.local de forma automatizada vía puppet.

Si queremos meter esta línea en rc.local vía puppet (para así poder aplicarlo de forma automatizada en un grupo de máquinas) tenemos que encontrar la manera de añadir dicha línea en el fichero antes del exit 0, verificando que no estuviera ya. Hay varias maneras de hacerlo, pero me he decantado por usar un define de puppet.

Actualmente tengo en /etc/puppet/defines/* de mi servidor puppet un conjunto de funciones puppet útiles para tratar con ficheros y lineas de texto. Es una gran idea cogida de mi compañero Esteban Navas y son una serie de funciones descritas en https://projects.puppetlabs.com/projects/puppet/wiki/Simple_Text_Patterns/1:

  • delete_lines.pp
  • line.pp
  • prepend_if_no_such_line.pp
  • replace.pp

Aunque ninguna servía para hacer lo que quiero (añadir una línea que no está antes del "exit 0" del rc.local), los defines anteriores me sirven de base para hacerlo. El nuevo define en cuestión queda:
# cat /etc/puppet/defines/add_line_above.pp

#Añade la linea "line" al fichero "file", siempre que la cadena "search" no esté en el fichero.
#La línea la añade inmediatamente por encima de la línea que contenga la cadena "above".
#Usado por ejemplo para añadir lineas a /etc/rc.local por encima del "exit 0" con el cual
#siempre finaliza dicho script.

define add_line_above($file, $line, $search, $above) {
    exec { "/bin/sed -i '/${above}/i\\${line}' '${file}' ":
           unless => "/bin/grep -q '${search}' '${file}'"
    }
}
A continuación tenemos que referenciar este define metiéndolo en el init.pp de una tarea puppet específica que hagamos o bien añadiéndolo a una ya hecha (yo prefiero eso: hacer tareas omnibús que aplican conjuntos de pequeños ajustes de configuración antes que llenar todo de pequeñas tareitas haiku muy especializadas)

Sea como fuere, en el init.pp que escojamos tenemos que importar los .pp de /etc/puppet/defines, poniendo al principio del fichero, antes del "class":
import "/etc/puppet/defines/*.pp"
Y luego dentro del "class":
add_line_above { desactiva_audio_hdmi:
              file=> "/etc/rc.local",
              line=> 'bus=$(lspci | grep "RV620 HDMI Audio" | cut -d" " -f1); test -n $bus && echo 1 > "/sys/bus/pci/devices/0000:00:01.0/0000:$bus/remove"',
              search=> "RV620",
              above=> "^exit 0$"
}

Y ya está. Eso lo que hará será modificar el fichero rc.local de todos los equipos que usen la clase puppet para añadir:
bus=$(lspci | grep "RV620 HDMI Audio" | cut -d" " -f1); test -n $bus && echo 1 > "/sys/bus/pci/devices/0000:00:01.0/0000:$bus/remove"
Justo antes del exit 0 con el que finaliza dicho fichero. Y con esto ya tenemos ambos objetivos conseguidos, trabajo hecho :-).


miércoles, 21 de octubre de 2015

Como cambiar la contraseña de root de un Linux cuando no la sabemos previamente.

A veces heredamos o nos llega un sistema Linux en el que la contraseña de root es desconocida. Puesto que las contraseñas de Linux son en principio cuasi-imposibles de descifrar, no nos queda otra que cambiar la contraseña de root por una que conozcamos, ¿cómo se hace esto?.

Primero debemos arrancar con un CD o Pendrive conteniendo un Linux. Puede ser un SystemRescueCD, un Clonezilla o cualquier disco de instalación Live (uno de Ubuntu o Mint, por ejemplo). Una vez hemos arrancado tendremos que abrir un terminal. En un SystemRescueCD el terminal está allí mismo, en un Clonezilla hay que seleccionar la opción "Enter shell..." enlos menús y sobre un Linux Live habría que ir al menú de inicio y ejecutar la aplicación de terminal desde allí.

Ahora pasamos a ejecutar los siguientes comandos (el "sudo su" puede que no sea necesario, dependiendo de que distribución estemos usando):
$ sudo su
# fdisk -l

Esto nos mostrará las particiones del disco duro del PC, algo así como:
Disco /dev/sda: 160.0 GB, 160040803840 bytes
.....
.....
Dispositivo Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1   *        2048   156250111    78124032   83  Linux
/dev/sda2       156264255   312576704    78156225   83  Linux
En esta lista de particiones estará la que contiene el sistema Linux al cual queremos cambiar la contraseña. En el ejemplo anterior sería /dev/sda1 (es una partición de Linux y está marcada como arrancable).

Una vez identificada la partición, la montamos:
# mount /dev/sda1 /mnt
Y entramos en ella con una jaula chroot:
# chroot /mnt
Puede que nos de algún error relacionado con "zsh" u otra shell, en ese caso lo haremos así:
# chroot /mnt /bin/bash
Con esta orden chroot estamos dentro del Linux contenido en el disco duro, ya que nuestro / ha pasado a ser /dev/sda1. Eso quiere decir que cualquier comando que tecleemos se hará y tendrá efecto sobre dicho Linux y no sobre el sistema con el que hemos arrancado. Por tanto, haciendo:
# passwd root
Nos pedirá la nueva contraseña de root: la introducimos por duplicado y ya está, esa será la contraseña de root del sistema instalado en el disco duro. Salimos de la jaula y desmontamos:
# exit
# umount /mnt
Si por algún motivo el comando "passwd root" no funciona podemos optar por lo siguiente una vez averiguada la partición donde está nuestro Linux:
# mount /dev/sda1 /mnt
# nano /mnt/etc/shadow
# # Borrar contraseña root
# umount /mnt
Si no funciona el editor "nano" probaremos con "vi". Por "borrar contraseña de root" quiero decir localizar en /etc/shadow la línea parecida a:
root:$6$0UeP/qy$XzJ3Ztmd0wsNrNx1rEnnp8K2VYtHsEO1so5UN7FsfaDPEXTxImxYyKAWpeIvQrQwxNwTNjUD25gz6aVq5/:16280:0:99999:7:::
y borrar todo lo que hay entre el primer y segundo ":", quedando:
root::16280:0:99999:7:::
Con esto quedamos la contraseña de root en blanco, pudiendo entrar con facilidad.

Una vez hecho esto reiniciamos el sistema, quitando el pendrive o el CD y arrancando con el sistema en el disco. Ahora podremos entrar como root con la contraseña que hemos establecido. Como vemos, es mucho mas fácil de lo que parecía.

¿Y tú de quién eres?

Más de una vez he necesitado saber la procedencia de un fichero que encontramos dentro de nuestro sistema Debian y no se de dónde ha salido. Los pasos que sigo son:

1) Averiguar a que paquete pertenece el fichero.

Eso lo hago con:
# dpkg -S /usr/lib/x86_64-linux-gnu/libavformat.so.54
libavformat54:amd64: /usr/lib/x86_64-linux-gnu/libavformat.so.54
Como vemos, el fichero en cuestión vino con el paquete libavformat54:amd64.

Si nos dice:
dpkg-query: no se ha encontrado ningún paquete que corresponda con el patrón ....
entonces el fichero no ha venido dentro de un paquete del sistema y va a ser bastante mas complicado saber su procedencia.

2) Averiguar de dónde proviene el paquete.

Los paquetes de nuestro sistema pueden venir de distintos repositorios o haber sido instalados a mano, ¿cómo sabemos su origen?, pues con:
# apt-cache policy libavformat54:amd64
libavformat54:
 Instalados: 8:1.0.10-dmo1
 Candidato:  8:1.0.10-dmo1
 Tabla de versión:
     *** 8:1.0.10-dmo1 0
              500 http://ldap/mirrors/multimedia-wheezy/ wheezy/main amd64 Packages
              100 /var/lib/dpkg/status
Segun se ve, viene de multimedia-wheezy. En mi caso de un mirror local que hago cada noche en mi servidor "ldap". De no tener mirror su origen seria el repositorio oficial de Debian Multimedia: http://www.deb-multimedia.org/dists/oldstable/main/.

Si el paquete ha sido instalado a mano habría que busca el origen del .deb por Internet. A las malas, podemos usar dpkg-repack para "reconstruir" el paquete .deb desde el sistema donde está instalado, de tal forma que tenemos el .deb tal y como lo descargamos originalmente, con la ventaja de que podremos guardar una copia del mismo y reinstalarla cuando y donde queramos.

Bueno, pues con esto ya se de donde vino el fichero y puedo instalar el paquete que lo trajo cuando me haga falta tener el mismo fichero en otra máquina.

3) ¿Y si el fichero no está en nuestro sistema, pero queremos saber en que paquete de los repositorios está?.

Si queremos buscar un fichero en paquetes no instalados en el sistema usamos apt-file:
# apt-get install apt-file
# apt-file update
# apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h
Ojo: esto sólo buscará el fichero en los repositorios que tenemos configurados en el sources.list y sources.list.d de nuestra máquina, no mas allá.

Bueno, pues con estos consejos podremos localizar el origen de los ficheros que rulan por nuestro sistema, de igual manera que se puede hacer con la herramienta equivalente de Windows....



Y así es como tenemos identificado cualquier fichero que ande por nuestros discos duros.

martes, 13 de octubre de 2015

SimpleScreenRecorder para Debian Wheezy

Un compañero profesor me pidió buscar un software sencillo para grabar las clases capturando toda la actividad en pantalla al usar la pizarra digital en un vídeo que luego podría editar para publicarlo o revisarlo.

Estuve buscando y encontré como opción mas sencilla y completa el SimpleScreenRecorder, que incluso permite grabar el sonido. Yo lo probé en mi Linux Mint y funcionaba estupendamente. El problema vino cuando se dió cuenta de que había que hacerlo funcionar en Debian Wheezy de 64bits, que es el sistema que tenemos en las aulas.

La primera opción fue buscar versiones antiguas para Ubuntu o Mepis, pero los paquetes encontrados daban errores con las versiones de los paquetes dependientes al instalarlos en nuestro Debian Wheezy.

Podría haber intentado probar versiones de otras distribuciones Linux, convirtiéndolas con alien, pero había otra opción más divertida: compilar desde los fuentes. Los afectados de fetichindows (neopalabro formado por la fusión de conceptos "fetichismo" y "Windows") que odian-temen Linux  dicen que los linuxeros estamos todo el día compilando programas desde que amanece hasta que se pone el sol. Pues vamos a darles la razón por 10 minutos.

Tenemos este manual  para compilarlo para Debian Jessie, así que no debe ser muy distinto hacerlo para Wheezy. Vamos allá, haremos todo con un usuario regular que tenga acceso sudoer (luego podemos quitar dicho acceso). Los pasos son:

$ cd
$ wget https://github.com/MaartenBaert/ssr/archive/master.tar.gz
$ tar xfvz master.tar.gz
$ sudo dpkg --add-architecture i386
$ sudo apt-get update 
$ sudo apt-get install build-essential pkg-config qt4-qmake libqt4-dev libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libasound2-dev libpulse-dev libjack-jackd2-dev libgl1-mesa-dev libglu1-mesa-dev libx11-dev libxfixes-dev libxext-dev libxi-dev g++-multilib libx11-6 libxext6 libxfixes3 libxfixes3:i386 libglu1-mesa:i386
$ cd ssr-master 
$ ./simple-build-and-install 

Bueno, pues me dio algunos errores en la primera compilación. Así que hice lo que pone en la página indicada:

$ cd /usr/lib/i386-linux-gnu
$ sudo ln -s libGL.so.1 libGL.so
$ sudo ln -s libGLU.so.1 libGLU.so
$ sudo ln -s libX11.so.6 libX11.so
$ sudo ln -s libXext.so.6 libXext.so
$ sudo ln -s libXfixes.so.3 libXfixes.so
$ sudo ldconfig
$ cd ~/ssr-master
$ ./simple-build-and-install  

De nuevo me dió error. Viendo mejor el error de compilación me encuentro con que se queja de que no encuentra un tipo de datos llamado AVPixelFormat. Una breve búsqueda en Google me dice que AVPixelFormat es de Jessie, que en Wheezy es PixelFormat, asi que busco en el código todas las apariciones:

$ cd ~/ssr-master/src
$ grep -irl AVPixelFormat * 

Y voy fichero por fichero fuente cambiando AVPixelFormat por PixelFormat. Podría haberlo hecho automáticamente mediante sed, pero tampoco eran muchos cambios. Una vez acabado, lanzamos de nuevo el proceso:

$ cd ~/ssr-master
$ ./simple-build-and-install  

Y ahora si compilaba. Al acabar nos pide contraseña del usuario para ejecutar con sudo la instalación y tachán... en unos instantes está todo instalado.

Indagando un poco sobre la instalación veo que ha copiado los siguientes ficheros:

  • El ejecutable: /usr/bin/simplescreenrecorder 
  • Las librerias:  /usr/lib/i386-linux-gnu/libssr-glinject.la y /usr/lib/i386-linux-gnu/libssr-glinject.so, haciendo un "ldconfig -n /usr/lib/i386-linux-gnu" después.
  • El fichero .desktop: /usr/share/applications/simplescreenrecorder.desktop, haciendo un update-desktop-database después para añadirlo al menú del entorno gráfico (en mi caso XFCE).
Y con esto ya está instalado. Desde el menú o desde terminal podemos ejecutar simplescreenrecorder  y se nos carga la ventana de inicio para empezar el asistente de grabación de Escritorio:


Despúes me planteé copiarlo a otras máquinas. Como todavía no me he puesto en serio a hacer paquetes Debian un poco mas complejos de lo normal, con dependencias y scripts de postinstalación  (a ver si me pongo a aprenderlo y así puedo contarlo aquí) pensé en hacer un script bash de instalación para automatizarlo un poco, pero antes me dió por copiar el ejecutable /usr/bin/simplescreenrecorder  a una máquina cualquiera y probarlo allí: carajo, funcionaba. No tengo ni idea de para que son las librerías (aunque supongo que será para integrar la funcionalidad de grabación en aplicaciones que compilemos nosotros), pero no son necesarias: con el ejecutable es suficiente.

Aquí va un enlace al ejecutable para Debian Wheezy de 64 bits, por si alguien quiere instalarlo de una forma rápida y sucia. Para ejecutarlo solo habría que abrir un terminal y lanzarlo desde allí. Si da algún error seguramente sea porque no encuentra alguna librería (fichero .so) que necesite el programa y no la tienes en tu sistema. La solución es sencilla: averigua a que paquete pertenece buscando en Internet e instálala.

Bueno, pues otro día seguimos con mas cosas.


viernes, 9 de octubre de 2015

Un blog de andar por casa

Hasta hace poco tenía recopilada información y enlaces sobre el centro en una intranet constituida por páginas web, con una estética directamente salida de los 90 que daba vergüenza ajena. Recolocando cosas me planteé buscar un CMS/Blog sencillo que pudiese montar en poco tiempo para organizar todo ese contenido y permitir la publicación sencilla y rápida de nueva información dentro de la intranet.

El objetivo era encontrar algo ligero, que no necesitase ningún extra para funcionar: ni base de datos, ni librerías, ni entornos de servidor (tipo Tomcat o algún otro monstruo hecho en Java que esté de moda ahora). Sorpresivamente me encontré una gran abundancia de sistemas de este tipo y páginas con recopilaciones como estas:
Al final, abrumado ante tanta oferta me decanté por NibbleBlog, por varias razones:
  • Para instalar simplemente se necesita descomprimir el fichero zip en /var/www/.... dentro de un servidor con Apache y PHP5 y poco más.
  • Tiene un pequeño conjunto de temas fáciles de aplicar y retocar.
  • Tiene un pequeño conjunto de plugins también sencillos instalar y adaptar si te manejas en php.
  • Los posts y las páginas publicadas se guardan en ficheros planos XML, fáciles de mantener.
La instalación es tan sencilla como bajar el .zip y descomprimirlo dentro dela ruta /var/www/.... del servidor elegido, que suponemos tendrá instalado apache2 y php5. El resultado final será este:









Tenemos una zona de publicación de posts a la derecha y a la izquierda 4 apartados fijos:
  • Una colección de enlaces permanentes. Me gustaría ser mas discreto pero la he puesto en colores chillones para que sea fácil de identificar.
  • Una serie de enlaces a páginas fijas dentro del CMS, con posts que siempre se podrán consultar.
  • Un listado con los títulos de los ultimos posts.
  • Un buscador dentro del CMS/Blog.
En el área de administración entramos con un usuario y contraseña definidos en la primera entrada al mismo, tras la instalación. La ruta para entrar en el panel de administrador es http://servidor.que.sea/carpeta-donde-esta-el-blog/admin.php.
:


Una vez dentro vemos el pequeño conjunto de opciones de configuración que hay:



Una para la publicación de posts/creación de páginas fijas/subida de vídeos, con un editor de HTML sencillo pero muy completo.



Un apartado para administrar todo lo que se ha publicado:

Un apartado para la típica configuración general del CMS:



Otro apartado para elegir el tema. Vienen 4 o 5 instalados de serie, pero se pueden instalar mas desde su página/foros, simplemente hay que bajarlos y meterlos en la carpeta themes de la ruta donde descomprimimos el zip de instalación. Yo he elegido el tema "Echo", aunque luego he tuneado un poco sus CSS .



Por último, también tenemos un apartado para añadir los plugins. Al igual que los temas, vienen varios por defecto y es fácil añadir nuevos plugins descargados de su página/foros.  En la configuración de cada plugin siempre hay un "número de orden" que nos permite definir  en que orden (de arriba a abajo) se colocarán en la parte izquierda de la pantalla. Los plugins están en PHP y son bastante fáciles de modificar.


Un plugin muy interesante es HTML Code, que permite meter código HTML arbitrario. Yo lo he usado por ejemplo para crear el menú de enlaces multicolor de la izquierda.


Y ya está, con esto he conseguido dar algo mas de glamour a una página que ve a diario todo el mundo en el centro, ya que como buen tirano tengo puesta su apertura automática al abrir sesión en el autostart de los Linux y la carpeta Inicio de los Windows.

Nos vemos pronto...

martes, 29 de septiembre de 2015

Lenovo A630/MediaTek 6577: ROM nueva, CWM recovery y reparticionado de memoria interna.


El Lenovo A630 que tenemos en casa llevaba un tiempo dando problemas: necesitaba una buena limpieza y quería aprovechar para instalar un recovery mas potente, por ejemplo el ClockWorkMod y, ya de paso, reparticionar la SD ya que con solo 512Mb de memoria para aplicaciones estaba constantemente quejándose de que se quedaba sin espacio. Vamos a ver una colección de guías y enlaces para hacer todo esto sin brickear nuestro móvil, junto con la solución de los posibles problemas que a mi se me han presentado.

Tenemos pues un Lenovo A630, equipado con un chip MediaTek MK 6577 con la siguiente ROM:

A630_S009_130510
Android 4.0.4
BANDA BASE: A630.V5, 2012/12/17 16:15

En su día ya había rooteado el móvil con ayuda de este manual de mi compañero Esteban.


1. Poner una ROM nueva y limpia.

Por "limpia" entiendo una ROM libre de aplicaciones chinas, con las Gapps y rooteada. Por desgracia la scene de cocineros de este móvil es inexistente, así que no hay mucho donde elegir. Me decanté por ésta de needrom (realmente tampoco hay muchas mas de fiar). Sus características son:

ROM Phone LENOVO A630 ROM Android 4.0.4
Based on Official ROM LENOVO A630 version: Lenovo A630_S008_130111
Gapps include - Rooted
Language support:  Multilang

Los pasos para la instalación deben realizarse en Windows, ya que las aplicaciones necesarias no están para Linux o lo están en modo beta y estas cuestiones tan delicadas no son para experimentar. Estos son:

1) Instalar los drivers para Windows del modo preloader USB VCom de Mediatek 65XX. Instrucciones aquí, es una instalación manual ya que se hace sin tener conectado el móvil al PC. El modo preloader es el modo usado para cargar las ROM en los móviles y tablets MediaTek desde un PC usando un cable USB.

2) Luego descargar la ROM elegida de http://www.needrom.com/download/lenovo-a630-2/. Una vez bajada la descomprimimos y, por comodidad, movemos el directorio entero a C:\, en la raíz de la partición Windows. Estrictamente no es necesario, pero me gusta ponerlo ahí porque a veces las rutas muy largas o con espacios me han chafado la carga de las ROM.

3) Descargar e instalar la aplicación SPFlash, que es la que usaremos para la carga de la ROM. Cualquier versión entre la 3.1320 y la 5.1452 (la última por ahora) nos servirá. Yo he usado la 3.1320. Manuales de uso de SPFlash tenemos en abundancia:

4) Cargar la ROM, siguiendo estos pasos:

  • Abrir SPFlash y elegir el archivo scatter "MT6577_Android_scatter_emmc.txt" en la carpeta de la ROM descargada en el paso 2.
  • Dentro de SPFlash, en Opciones, elegir "USB Model" y "DA Download All->Speed->High Speed"
  • Apagar el móvil y quitar la batería.
  • En SPFlash seleccionar la opción Download o Updgrade ROM Firmware. A mi la primera me daba un error al comenzar el proceso y he tenido que usar la segunda.
  • Enchufar el móvil apagado y sin batería a un puerto USB del PC.
  • Tan pronto se detecte el móvil, empezarán a aparecer barras de progreso de colores morado, amarillo, etc. Cuando todo acabe aparecerá un círculo verde indicando que se acabó. En ese momento se puede desconectar el móvil, poner la batería y encender.

Bueno, pues en la práctica a mi todos estos pasos tan sencillos siempre me han dado problemas en la última fase: en las barras de progreso tarde o temprano me aparecía un error, con mensajes bastante oscuros. Tras probar varios SPFlash distintos e intentar interpretar los errores sin éxito se me ocurrió conectarlo al puerto USB con estas 2 condiciones:

  • Una tarjeta miniSD puesta en el móvil.
  • La bateria puesta de nuevo en el móvil (la he quitado 10 segundos y luego la he vuelto a poner, sin encenderlo).

No se si ambas cosas son necesarias o no, pero sospecho que solo lo sería la segunda. También he leído testimonios de gente con otros MediaTek que pone la batería con el móvil ya enchufado al USB, o que pulsa el botón Vol- y no lo suelta hasta que la ROM esta copiada.... es decir, no hay un método universal, dependerá de nuestro aparato en cuestión.

Una vez hecho esto encendemos el móvil y tras la típica eterna espera de los primeros arranques de una ROM nueva nos saltarán el asistente de configuración de idioma, cuenta, etc. Primera fase acabada.

2. Instalar el Recovery CWM.

Hay varias formas de meter un ClockWorkMod Recovery en un teléfono MediaTek: la primera consiguiendo un fichero .img con la partición de recovery CWM ya preparada y flasheando dicha partición usando SP Flash tools. No encontraba ningún recovery de confianza para el A630, asi que utilicé otro método mas fiable: usar MTKDroidTools.

Una vez mas, mi compañero Esteban lo explica de forma sencilla.

Para no variar  he tenido varios obstáculos: el móvil no me aparecía como rooteado (el recuadro de abajo-izquierda de las MTKDroidTools estaba amarillo en lugar de verde) y al intentar seguir los pasos del enlace anterior me daba error "adbd not install", además en "Recovery y root" solo me salia la opción "seleccionar archivo boot.img" en lugar de las 3 que deberían salir.

Solución: instalar desde Google Play la aplicación busybox y ejecutarla, luego instalar a mano la aplicación "ADBD insecure" y ejecutarla para ponerla en modo "enable". Fuentes y enlaces para descargar:

Un truco que a mi no me ha hecho falta: si el teléfono no arranca después de meter el CWM recovery debemos instalar con SPFlash un boot parcheado (también se crea un recovery) que se crea en la carpeta recovery de MTKDroidTools.

Una vez instalado, apagamos el móvil y para arrancar el recovery pulsamos Vol+ y sin soltarlo apretamos el botón de power. Cuando se encienda soltamos power pero seguimos pulsando Vol+. En un instante aparecerá el texto "Recovery" en la parte inferior de la pantalla, entonces pulsamos el botón central ("Home") del teléfono y ya nos saldrá un menú CWM estándar, desde el que podremos flashear de forma sencilla, realizar wipes (borrados de configuración) y hacer copias de seguridad a la SD del equipo.

3. Hacer copia de seguridad completa con MTK DroidTools.

Desde el Recovery CWM podemos hacer copias de seguridad del sistema a la tarjeta SD, que luego podremos recuperar con el mismo recovery. Pero también es muy interesante hacer una copia de seguridad completa para restaurar con SPFlash, por si el móvil se queda tan brickeado que no nos deja ni entrar en el recovery.

Esta copia se hace con MTKDroidTools siguiendo estos sencillos tutoriales:


Es imprescindible después de realizar la copia con la opción Backup no olvidar usar la opción "Comprobar y Preparar blocks para el FlashTools" (nos pedirá elegir el fichero .md5 de la carpeta del backup que hemos hecho), lo que nos crea una carpeta "!Files_to_FlashTool" con una versión del backup apta para restaurar con SPFlash del paso 1.

4. Reparticionar para dar mas espacio a las aplicaciones.

Como en muchos móviles, la partición inicial para aplicaciones es mísera: 512Mb o menos que se llenan enseguida y hay que andar con Link2SD, int2SD y trucos por el estilo. Lo mas deseable es reparticionar y aumentar esa partición a costa de reducir el espacio para la SD Interna. Nunca entenderé esa costumbre de simular una SD con una partición de la memoria interna del móvil: a fin de cuentas es sencillo y barato poner una SD externa para almacenar las fotos y demás cosas.

Propongo dos métodos:

  1. El método usado por Esteban, le voy a tener que pagar derechos de autor.
  2. Usando HKPhone, muy sencillo si tu móvil es compatible. Se basa en usar una apk que te hace todo y funciona sin problemas en el A630, siempre que esté rooteado y tenga CWM Recovery instalado.

Yo he optado por configurar 2GB para aplicaciones y 512Mb para SD Interna, después entro en el recovery y hago un Wipe-Factory Reset. Una vez dentro del móvil, verifico que en Ajustes->Aplicaciones hay 2Gb de espacio (ahora si que será difícil llenarla) y, por último, en Ajustes->Almacenamiento le digo que guarde las cosas en la SD Externa.

Para comparar, veremos el particionamiento antes de reparticionar usando para ello la apk DiskInfo:

 Internal Storage (MMC)
--------------------------
 * ebr1 [mmcblk0p1] Not mounted
 * sec_ro [mmcblk0p2] (/system/secro) [ext4]                          Used: 5 MB, Free: 0 B, Total space: 5 MB
 * System (android) [mmcblk0p3] (/system) [ext4]                      Used: 419 MB, Free: 92,1 MB, Total space: 512 MB
 * Cache [mmcblk0p4] (/cache) [ext4]                                  Used: 17,4 MB, Free: 494 MB, Total space: 512 MB
 * Data (usrdata) [mmcblk0p5] (/data) [ext4]                          Used: 268 MB, Free: 243 MB, Total space: 512 MB
 * SD card (fat) [mmcblk0p6] (/mnt/sdcard, /mnt/secure/asec) [vfat]   Used: 109 MB, Free: 1,9 GB, Total space: 2,1 GB
 * mmcblk0boot1 [mmcblk0boot1] Not mounted
 * mmcblk0boot0 [mmcblk0boot0] Not mounted

y después de reparticionar:

 Internal Storage (MMC)
--------------------------
 * ebr1 [mmcblk0p1] Not mounted
 * sec_ro [mmcblk0p2] (/system/secro) [ext4]                          Used: 5 MB, Free: 0 B, Total space: 5 MB
 * System (android) [mmcblk0p3] (/system) [ext4]                      Used: 422 MB, Free: 89,2 MB, Total space: 512 MB
 * Cache [mmcblk0p4] (/cache) [ext4]                                  Used: 16,4 MB, Free: 495 MB, Total space: 512 MB
 * Data (usrdata) [mmcblk0p5] (/data) [ext4]                          Used: 477 MB, Free: 1,5 GB, Total space: 2 GB
 * SD card 2 (fat) [mmcblk0p6] (/mnt/sdcard2) [vfat]                  Used: 3,9 MB, Free: 563 MB, Total space: 567 MB
 * mmcblk0boot1 [mmcblk0boot1] Not mounted
 * mmcblk0boot0 [mmcblk0boot0] Not mounted


Con esto ya tenemos el móvil preparado para funcionar una temporada más.

5. Un par de cosas interesantes.


  • Si  enredando perdemos los IMEI del móvil (*) siempre podemos recuperarlos con cualquiera de estos dos métodos:

a) Usando el modo ingeniero de Mediatek. Hay aplicaciones para entrar en el modo ingeniero en el Google Play, una vez allí se usan comandos AT para fijar el IMEI, tal como cuenta, como no, Esteban aquí.

b) Más sencillo: la aplicación MTK DroidTools tiene una opción para meter los IMEI a mano directamente.

Bueno, pues a ver que me pasa está semana para contarlo la próxima.

(*) Considérate afortunado por tener un móvil MediaTek. Los que tienen chip SnapDragon y pierden los IMEI sin tener copia de seguridad de las particiones donde se guardan pueden darse por jodidos. Hay manuales de las herramientas necesarias, pero yo no he podido hacerlas funcionar correctamente y ni Qualcomm ni Xiaomi (en mi caso) te dan ninguna solución para volver a generar las particiones con sus IMEI correspondientes. Por ese motivo, mientras no se tomen en serio a sus clientes y liberen la información para regenerar los IMEI voy a pasar de comprar cualquier aparato con SnapDragon.