Paquetes para todos los públicos

abril 26th, 2015

Tras el lanzamiento original de Multipackager, he ido haciendo varias mejoras sobre él hasta llegar a la actual revisión 0.12. Ahora no sólo es mucho más rápido a la hora de generar paquetes, sino que también soporta crearlos para Fedora. Gracias a él he podido publicar en mi web paquetes para Debian, Ubuntu y Fedora, para arquitecturas de 32 y 64 bits, de Autovala, Cronopete, DevedeNG, FBZX y, por supuesto, del propio Multipackager.

A disfrutarlo con salud.

Lanzado Multipackager

abril 15th, 2015

Acabo de lanzar la primera versión de Multipackager. Se trata de un programa que simplifica la creación de paquetes para múltiples distribuciones y arquitecturas. La idea es sencilla: si tienes instalada Debian de 64 bits, es relativamente sencillo crear un paquete para Debian de 64 bits; pero hacer uno para Debian de 32 bits la cosa empieza a complicarse. Y ya no digamos para hacerlo para Ubuntu de 32 o 64 bits (aunque deriva de Debian, a veces las bibliotecas no son del todo compatibles). Y mejor no hablemos para hacer un paquete para Fedora.

La solución más rápida consiste en usar una máquina virtual con el sistema operativo deseado, pero tiene el inconveniente de que montar una máquina para cada uno es una tarea pesada y engorrosa.

Es justo aquí donde entra en juego Multipackager: aprovechando que estas distribuciones tienen herramientas que permiten generar un sistema base de manera sencilla, se me ocurrió hacer un programa que, dándole una tripla de datos (“distribución, versión, arquitectura”; por ejemplo “debian, jessie, i386″, o “ubuntu, utopic, amd64″), genere automáticamente una máquina virtual para ella, completamente prístina y limpia de polvo y paja, y la utilice para generar, lo más automáticamente posible, un paquete para un proyecto determinado.

El resultado es que es posible disponer de una lista de dichas triplas y, tan sólo indicando la ruta a un proyecto, Multipackager generará automáticamente cada una de ellas, instalará las dependencias necesarias para el proyecto, compilará el código en su interior, generará el paquete, lo copiará al exterior, y limpiará los datos temporales.

En estos momentos Multipackager puede trabajar con máquinas Debian y Ubuntu (Fedora está en camino), en arquitecturas de 32 y 64 bits, y puede generar paquetes binarios y de Python3. A mayores permite generar una máquina virtual con dicha tripla y lanzar una shell interactiva en su interior, por si necesitamos hacer pruebas o demás. En este caso, al salir no se borra ningún dato temporal, por lo que es posible volver a entrar en cualquier momento.

Por último, incluye una caché de distribuciones para que no sea necesario bajar el sistema base de cada vez (una tarea bastante larga).

Actualizado Cronopete

abril 5th, 2015

Ya iba tocando actualizar Cronopete en condiciones, pues había un pequeño bug que me estaba tocando mucho las narices: de vez en cuando, durante el arranque, decía que el disco no estaba disponible y tenía que montarlo yo a mano. Tras rebuscar y probar, descubrí que lo que ocurría era que, a veces, el sistema operativo lo montaba en una carpeta diferente de la habitual, y por eso Cronopete no era capaz de encontrarlo.

A la vez, descubrí que ya no funcionaba el formateo de discos; sin embargo, el código no había cambiado, así que llegué a la conclusión de que el problema se debía a que el nuevo demonio udisks2, aunque emulaba la antigua interfaz de udisks, no lo hacía correctamente.

Por último, un problema menor pero que me parecía incómodo: la ventana de configuración, durante una copia, cambiaba de ancho debido al texto que indica qué fichero se está copiando.

Ante todo esto, decidí que ya tocaba meterle mano y resolverlo todo, así que procedí a pelearme con la nueva interfaz DBus de udisks2. Aunque Vala incorpora una serie de clases para usarla, no es nada intuitivo, y al final ahorré tiempo utilizando DBus directamente.

Por otro lado, cambié la manera en que se busca la ruta donde hacer el backup: ahora no almaceno en el registro la carpeta donde se supone que está el disco, sino directamente el UUID de la partición. De esta manera no importa que cambie entre arranques, siempre lo encontrará… O eso pensaba, porque resulta que me encontré con que, en ocasiones, la ruta de montaje puede cambiar entre que se arranca Cronopete y que éste quiere hacer el primer backup (no preguntéis, yo tampoco me lo explico). Por eso tuve que hacer un segundo cambio y utilizar siempre el UUID cada vez que se va a iniciar una copia, y no sólo al arrancar.

Y ya puestos, aproveché para echar un vistazo a los distintos warnings que salían durante la compilación por usar funciones obsoletas, y corregí todas menos dos: las referidas al uso de threads. El motivo es que recientemente hubo un cambio en la implementación de éstos en Linux que disparó un bug en la generación de código en Vala. Ese bug está resuelto en Vala 0.26, que es la que tengo en Debian; pero dado que la actual versión estable de Ubuntu tiene Vala 0.24, he decidido esperar unos meses antes de corregir ese.

También descubrí que los bookmarks no se mostraban en la ventana de restauración de ficheros, porque GTK3 utiliza un archivo diferente para almacenarlos. Ahora ya está resuelto.

Y por último, he hecho cambios para garantizar que, siempre que se pueda, el disco de backups estará montado. Así, si se desmonta accidentalmente, Cronopete lo volverá a montar. La única forma de retirarlo es detener la copia de seguridad. Esto permite evitar que se detenga la copia de seguridad por error.

Actualizado FBZX

abril 1st, 2015

Tras recibir un informe de error de un usuario, decidí que ya era hora de actualizar un poquito FBZX. Sin embargo, estoy tan acostumbrado a trabajar orientado a objeto con Vala y Python que no me apetecía ponerme a trabajar en C puro y programación funcional, así que me lié la manta a la cabeza y refactoricé el código de FBZX en C++. El motivo principal fue reescribir, esta vez sí desde cero, el código del emulador de cinta. Al utilizar herencia simplifica mucho el código, al permitir compartir mucho de él entre ficheros TAP y TZX. Además, ahora permite hacer cosas que antes no eran posibles, como por ejemplo carga rápida de ficheros TZX, e incluso grabar en ambos formatos.

Ya puestos, aproveché para pulir la interfaz y cambiar la tipografía por otra más elegante (y además, proporcional, gracias a código extraído de TTOS). Y también aproveché para añadir detalles extra, como por ejemplo ruido en la entrada de audio cuando la cinta no está en marcha (de manera que el borde parpadee cuando el sistema está esperando a que se ponga en marcha la cinta), o que cuando la cinta esté reproduciéndose el emulador trabaje a máxima velocidad, y que vuelva a velocidad normal cuando se pause.

También corregí algunos bugs, como por ejemplo algunos problemillas que había con la carga y grabación rápidas, sobre todo en modo +3. También retiré todas las palabras clave “register” e “inline” de C porque daban problemas a la hora de compilar con GCC 5. Ah, y al listar ficheros para escoger un TAP, TZX, SNA, etc. aparecen ordenados alfabéticamente, lo que simplifica la búsqueda. Y, por supuesto, limpieza de variables no usadas, etc.

Generando paquetes DEB para programas en Python

febrero 2nd, 2015

Estos últimos meses he estado aprovechando para reescribir Devede. El principal motivo de reescribirlo desde cero ha sido, aparte de aprovechar mejor las distintas características de Python 3 y GTK 3, para darle una arquitectura interna más moderna, flexible y modular. El resultado es que ahora es muchísimo más fácil añadir nuevas características, backends y utilidades, y además puede hacer cosas como convertir en paralelo varios vídeos, aprovechando al máximo las CPUs multinúcleo actuales.

Desde el principio decidí escribir el código en condiciones utilizando el módulo DistUtils para realizar la instalación, y resultó ser un gran acierto porque permite simplificar notablemente la generación de paquetes DEB, algo necesario porque varios usuarios que querían utilizarlo no se aclaraban con GITHUB ni la línea de comandos.

Una vez que ya tenemos listo nuestro script de instalación setup.py, siguiendo las directrices de distutils, basta con instalar en nuestro sistema las utilidades stdeb. En Debian y Ubuntu el paquete se llama python3-stdeb; sin embargo, la versión para Python 3 sólo está disponible en Ubuntu a partir de Vivid (15.04), que en el momento de escribir esta entrada todavía está en fase de desarrollo (en Debian está disponible desde Jessie en adelante, por lo que no hay problema). Los que tengan la ultima revisión estable de Ubuntu (14.10 en el momento de escribir esta entrada) sólo dispondrán de python-stdeb en sus repositorios, que sólo funciona para Python 2 (incluso reescribe el shebang para que apunte a Python 2 en caso de que nuestro código lo tuviese apuntando a Python 3), por lo que tendrán que bajarse a mano el paquete .deb. La opción más directa consiste en buscarlos en Ubuntu Packages.

Una vez instalado hay que añadir el módulo dep_util en el script setup.py, para que reconozca las nuevas opciones. Para ello basta con añadir al principio:

from distutils import dep_util

Una vez hecho esto hay que añadir en el raíz de nuestro proyecto un fichero llamado stdeb.cfg. Este fichero contendrá todos aquellos datos que el generador no puede extraer de los que se pasan en el script setup.py, como por ejemplo las dependencias de nuestro programa. El fichero de Devede-NG contiene lo siguiente:

[DEFAULT]
Depends = python3, python-support, python-urllib3, python-gi, libgtk-3-0, ffmpeg (>= 7:1.2.6) | libav-tools(>= 6:9.16), mplayer, mpv | vlc, dvdauthor, mkisofs | genisoimage, vcdimager, libvorbis0a, libvorbisfile3

El resto de las opciones posibles que se pueden poner se pueden encontrar en la documentación de stdeb. Un detalle importante es que no conseguí que funcionase con el comando XS-Python-Version. Cada vez que lo añadía para forzar que sólo generase paquetes de Python 3, el proceso devolvía un error.

Ahora ya está todo listo, por lo que para generar el paquete basta con ejecutar el siguiente comando:

python3 setup.py --command-packages=stdeb.command bdist_deb

Y ya está; se creará un directorio llamado deb_dist en cuyo interior encontraremos un paquete deb con nombre python3-nombredenuestroprograma_numero.de.version_all.deb.

Por último, comentar varios detalles extra:

  • es fundamental llamarlo con python3; de no hacerlo así, generará un paquete para Python 2 (incluso reescribirá el shebang de los ficheros python para que apunten a Python 2)
  • podemos hacer todos los cambios que queramos en nuestro código y regenerar el paquete directamente siempre que no cambiemos la cadena con la versión en nuestro script setup.py. Si la cambiamos debemos borrar el directorio deb_dist antes de volver a generar el paquete, o el proceso fallará, devolviendo un error.
  • debe tenerse muy en cuenta que, al generar paquetes .deb, el script setup.py se ejecuta dos veces: la primera para copiar al directorio deb_dist sólo los ficheros que realmente conforman nuestro programa y que se tienen que instalar en el sistema (de manera que otros ficheros, como el README o similares, no se incluirán en el paquete), y la segunda vez para configurar y generar el paquete .DEB en sí. En el caso de Devede-NG esto fue importante tenerlo en cuenta porque lo primero que hace el script de instalación es compilar los ficheros de traducciones .po y copiarlos en una carpeta diferente, que es la que luego se instala en el sistema. Pero al ejecutarse por segunda vez dentro de deb_dist, los ficheros .po ya no estaban disponibles porque éstos no se copian en el sistema. Tras hacer unas modificaciones menores fue posible hacer que funcionase perfectamente.

Un voladizo para la mesa del ordenador

enero 14th, 2015

Por mucho espacio que tenga siempre acabo necesitando más, y como la mesa del ordenador se me empezaba a quedar pequeña decidí construir un voladizo para ganar espacio, al tener así un estante superior donde poner la impresora y otros elementos.

Empecé por comprar las piezas. En tiendas como Bricoking o Bricocentro recortan tablero a medida y lo cantean en base a nuestras instrucciones. La lista completa es la que aparece en la siguiente imagen, indicando cuantas de cada una se necesitan y el tamaño en centímetros de cada lado. Aquellos lados que tienen un punto son los que deben ir canteados. Las medidas indicadas están pensadas para una mesa de 138 cm de largo, y para tablero de 2 cm de grosor.

piezas

Las piezas azules son los laterales del voladizo, que sostienen el peso; la pieza amarilla es la parte superior, y las verdes son los listones frontal y trasero, que, además de tapar la zona inferior de la pieza superior, le da más resistencia. Las dos piezas naranjas son los estantes laterales, y la pieza rosa y la gris forman el fondo, donde además se colgará el monitor.

Empezamos por fijar a la parte superior los dos listones, usando cuatro ángulos de 20x20mm. Nótese que los listones son cuatro centímetros más cortos que la parte superior para que encajen con los laterales, que tienen dos centímetros de grosor cada uno:

re_IMG_20140513_191355 re_IMG_20140513_191550

re_IMG_20140513_193423

A continuación añadimos las dos piezas laterales, fijándolas también con ángulos tanto a la parte superior como a los dos listones:

re_IMG_20140513_200141

Y con esto tenemos la primera parte:

re_IMG_20140513_200158

Ahora podemos colocarla encima de la mesa y fijarla con cuatro ángulos para que no se mueva ni se nos caiga nada. Otra opción sería utilizar tacos de madera para que no se vea, pero en mi caso prefiero utilizar algo lo más resistente posible:

re_IMG_20140513_213416

El siguiente paso consiste en fijar los estantes laterales (piezas naranjas). Para ello utilicé el soporte ekby töre de Ikea, ideal para estas cosas: fijé dos en cada tablero por la parte trasera, los fijé a la mesa, y finalmente atornillé cada tablero a su pieza lateral por la zona delantera para que el conjunto aguante más peso (mi intención es poner el ordenador encima de una de ellas).

re_IMG_20150114_171233

La última parte es la zona posterior, formada por las piezas rosa y gris. La rosa es la parte frontal, que mirará hacia nosotros, y la gris es la de refuerzo. El motivo es que estas dos piezas sostendrán nuestro monitor, además de reforzar el voladizo para que no tienda a doblarse, por lo que nunca está de más garantizar que tenga una buena resistencia. Empezamos por colocar una sobre otra y atornillarlas para que queden perfectamente solidarias:

re_IMG_20150113_131736 re_IMG_20150113_132939 re_IMG_20150113_134553

Si nos fijamos, la pieza gris es algo más corta que la rosa. Esto es para que no tropiece con el listón posterior que va en el voladizo.

El siguiente paso consiste en fijar el soporte para el monitor. Yo escogí uno fijo porque ocupa menos espacio (la ventaja de colgar el monitor es que ganamos el espacio que ocupaba el soporte, y nos deja mover el teclado hasta el fondo por si queremos leer o hacer alguna otra cosa). Para ello empezamos por medir a qué altura están los agujeros del soporte VESA de nuestro monitor y, en base a ello, fijar la base:

re_IMG_20150113_134730 re_IMG_20150113_135946 re_IMG_20150113_165440

Ahora hay que añadir dos ángulos en la parte superior para fijar el tablero al voladizo:

re_IMG_20150113_170933

A continuación hay que hacer los agujeros para pasar los cables de alimentación y vídeo. Primero hacemos una plantilla de la disposición concreta de los conectores en nuestro monitor (truco: usar los tornillos del soporte para fijar un folio a los agujeros del monitor, y así tener una guía):

re_IMG_20150113_180735

El siguiente paso consiste en pasar la plantilla al tablero, alineándola con el soporte instalado (¡no olvidar darle la vuelta!) y marcar los puntos en los que deben ir los agujeros:

re_IMG_20150113_181203

Hecho esto utilizamos una corona y un taladro para perforar el tablero en los puntos indicados, y procedemos a montar la pieza en la mesa, fijándola a la parte superior mediante los dos ángulos:

re_IMG_20150114_121636 re_IMG_20150114_122420

Ahora fijamos por detrás la parte inferior del tablero para evitar que se mueva, utilizando un ángulo más largo. En la foto vemos que el ángulo se atornilla también por debajo de la mesa:

re_IMG_20150114_123107

Hecho esto colocamos el monitor en el tablero y conectamos los cables:

re_IMG_20150114_123404

Yo añadí a mayores un tubo fluorescente debajo de la balda para tener luz extra si un día quiero hacer algo en la mesa que no sea trabajar con el ordenador. Este tubo está justo detrás del listón frontal:

re_IMG_20150114_155201

Y con esto ya está completo nuestro maravilloso voladizo:

re_IMG_20150114_124608

Arrancando la Raspberry Pi desde un disco duro externo

diciembre 30th, 2014

Estas navidades me he autorregalado una Raspberry Pi, porque no se puede ser un friki de verdad sin una. Mi primera intención es utilizarla para reemplazar al cacharro con Android del que hablé en entradas anteriores. Las ventajas son dobles: para empezar, consigo un sistema 100% integrado, y no el híbrido frankensteniano que tenía antes; y, por otro, me queda el cacharro Android para experimentar más y perfeccionar la técnica de arranque dual.

Para no complicarme la vida escogí la distribución raspbmc. Esta distro tiene algo de truco a la hora de instalarla. Además, como es normal en la Raspberry, es necesario arrancar siempre desde la tarjeta SD, cosa que a mi no me convence porque no quiero que acabe quemada por excesivas escrituras (a fin de cuentas me gusta cacharrear). Para evitarlo, decidí mover el sistema operativo a un disco duro USB de un terabyte, y así tener también sitio donde almacenar más cosas. El procedimiento a seguir es el siguiente: primero descargamos la imagen y la volcamos a la tarjeta con el comando:

sudo dd if=raspbmc-2014-11-24.img of=/dev/sde bs=2048

Asumiendo, claro está, que nuestra tarjeta SD está en /dev/sde.

Una vez creada la tarjeta, la insertamos en nuestra Raspberry y la encendemos SIN CONECTAR A LA RED LOCAL. Lo primero que hará será redimensionar la partición para que ocupe toda la tarjeta, y luego lanzará el XBMC. Y aquí está el primer problema: si en ese momento está conectada a Internet, se bajará una actualización de éste y, por algún motivo que desconozco, fallará y la imagen quedará inutilizable, teniendo que volcar de nuevo el fichero en la tarjeta. Es necesario dejar que arranque primero y se configure, y sólo entonces conectarlo a Internet y dejar que se actualice.

Otro problema que descubrí es que, por defecto, se configura en 1080p, y mi tele no soporta ese modo. Para resolverlo tuve que conectar la placa al monitor del ordenador y allí configurar la salida a 720p.

Una vez que tenemos la tarjeta lista, vamos a volcar todo al disco duro. Si montamos la tarjeta en nuestro PC veremos que tiene dos particiones: una de 73 MB en formato FAT32, y otra en formato EXT4. La primera partición contiene el kernel y demás ficheros de arranque básico, por lo que esa, de momento, no la tocaremos, pues es necesaria para iniciar el arranque; la segunda es la que contiene el sistema Linux, y será la que vamos a mover al disco USB.

Comenzamos por crear tres particiones en nuestro disco duro: una de 20GB en formato EXT4 para el sistema, otra de 4GB de swap, y una tercera con el resto para datos. A continuación, copiamos todos los ficheros de la partición EXT4 de la tarjeta a la partición de sistema del disco duro, utilizando la opción -a de cp para que, al copiar los ficheros, conserven su tipo, propietario, permisos y demás características (de no hacerlo así, los ficheros de dispositivos se copiarían como un fichero normal con el contenido del dispositivo, en lugar de como ficheros especiales; de igual forma los enlaces simbólicos no se copiarían como tales, y más problemas y diferencias). Además, es fundamental hacerlo como root, pues si no, no podría cambiar el tipo de usuario:

sudo cp -a /media/disco_origen /media/disco_destino

Otra opción es comprimirlo en un fichero tar.gz para poder restaurar cómodamente la partición en cualquier momento, pero eso ya es a gusto del consumidor.

Una vez hecho esto vamos a modificar el arranque en la tarjeta SD para que vaya al sistema situado en el disco duro. Para ello abrimos el fichero cmdline.txt, que contiene la línea de arranque para el núcleo. En ella buscamos el parámetro root=/dev/mmcblk0p2 y lo reemplazamos por root=/dev/sda1 (o la partición del disco en el que vamos a copiar el sistema), y añadimos el parámetro rootdelay=5 para asegurarnos de que reconoce el disco antes de intentar arrancar de él.

Por último, podemos editar el fichero /etc/fstab y añadir las siguientes líneas para que monte automáticamente la partición de swap y de datos donde queramos:

/dev/sda2   none   swap   sw        0   0
/dev/sda3   /datos ext4   defaults  0   1

Y con esto tendremos listo nuestro sistema Raspbmc en disco USB. En una próxima entrada comentaré como monté una sesión chroot, porque la raspbmc está basada en Debian Wheezy y cualquier intento de actualizarla a Jessie acaba con el sistema dañado (incluso probé a utilizar pinning, pero es muy fácil que para instalar algún paquete interesante haya que actualizar la libc6, lo que hace que casque todo).

Experimentando con Autovala

diciembre 2nd, 2014

Hace un par de meses lancé una nueva versión de Autovala, la 0.99.9, y otra hace menos, la 0.99.10.

La primera, como novedad, permite escoger si se desea utilizar una versión fija del compilador de vala, o si se prefiere que sea Autovala quien escoja la que se debe utilizar. Antes, la versión del compilador se actualizaba siempre en el fichero .avprj a la versión por defecto instalada en el sistema; ahora esto sólo ocurre si el comando vala_version en dicho fichero tiene un asterisco al principio. Si no, se mantendrá dicho valor siempre, y será el valor mínimo necesario para compilar el proyecto.

Respecto a la versión 0.99.10, incluye una petición de un usuario: soporte de pruebas unitarias, lo que permite simplificar la depuración de los proyectos.

Como de costumbre, el propio proyecto incluye abundante documentación en la carpeta doc, en formato HTML.

A mayores estoy preparando para la versión 0.99.11 la generación automática de ficheros de metadatos para paquetes. En este momento genera casi todo lo necesario para crear paquetes .deb y .rpm, pero en el futuro espero poder añadir soporte para más arquitecturas de paquetes, como emerge. Esta versión en desarrollo está disponible en una rama aparte, y me gustaría que la gente la probase antes de mezclarla con main.

Mapear los botones de un ratón logitech

octubre 6th, 2014

Desde hace tiempo tengo un ratón Performance MX de Logitech. Estoy muy contento con él desde que lo compré, salvo por el detalle de que usar la rueda como botón central es bastante incómodo, porque es difícil no girarla al pulsarla. Por eso lo primero que hice fue mapear la tecla zoom (que está disponible en el pulgar) como el botón central. Para ello hice este pequeño script bash, que añadí a las aplicaciones al inicio de mi sesión:

#!/bin/bash

xmodmap -e "pointer = 1 13 3 4 5 6 7 8 9 10 11 12 2"

Al principio este script funcionaba perfectamente, hasta que un día, dejó de hacerlo. Lo raro era que si lo ejecutaba a mano desde un terminal, funcionaba perfectamente; sólo fallaba si lo ejecutaba como aplicación al inicio de sesión. Esto me obligaba a ejecutarlo manualmente cada vez que encendía el ordenador, lo que era un peñazo, así que empecé a investigar qué era lo que ocurría, y descubrí que el ratón, como dispositivo de entrada, no es visible por el ordenador hasta que se mueve por primera vez. Eso significa que, cuando se ejecutaba el script al principio de la sesión, como para el ordenador aún no había ningún ratón, no hacía nada; pero cuando lo ejecutaba a mano, como ya lo había movido para lanzar el terminal, éste ya aparecía en la lista de dispositivos, y por eso funcionaba.

La solución final consistió en modificar el script para que, al lanzarse, compruebe regularmente si hay un dispositivo Logitech, y sólo entonces ejecute el comando xmodmap. El script final quedó así:

#!/bin/bash

x=1

while [ $x -ne 0 ]
do
	sleep 1
	xinput --list | grep Logitech
	x=$?
done

xmodmap -e "pointer = 1 13 3 4 5 6 7 8 9 10 11 12 2"

Dado que sabemos que tiene que haber un ratón Logitech (si no, no meteríamos este script), comprobamos una vez por segundo si en la lista de dispositivos de entrada aparece el receptor (esa pausa permite no consumir recursos inútilmente mientras esperamos a que aparezca). En el momento en que se cumpla sabemos que el comando xmodmap va a funcionar, así que lo ejecutamos y salimos del script.

Tablet con systemd

septiembre 24th, 2014

Hace un par de días actualicé el sistema Debian que le había instalado a mi tablet, y me encontré con la desagradable sorpresa de que mi gestor de ventanas y mi driver táctil dejaron de funcionar. El motivo es que, recientemente, Debian se ha cambiado a systemd, por lo que tuve que hacer algunos cambios para adaptarlo.

El primer y más fundamental cambio fue reemplazar los scripts en bash por ficheros de configuración de systemd. Este es el fichero para lanzar el driver táctil:

[Unit]
Description=GSLx680 user-space driver launcher for systemd

[Service]
Type=simple
ExecStart=/bin/gslx680 -new_scroll /dev/i2c-1 /etc/gslx680/firmware.cfg
ExecStop=killall gslx680

[Install]
WantedBy=multi-user.target

Este fichero lanza durante el arranque el driver, y durante el apagado del sistema lo mata.

El fichero para lanzar las X es similar:

[Unit]
Description=Launch X11

[Service]
Type=simple
User=debian
ExecStart=/usr/bin/startx
ExecStop=killall xinit

[Install]
WantedBy=multi-user.target

El único cambio es que especificamos con qué usuario queremos lanzar el comando: en este caso el usuario es debian.

Otro cambio que tuve que hacer fue eliminar, en el fichero .xinitrc, el que se lance ck-launch-session, el gestor de sesiones de ConsoleKit. Este ya no es necesario porque de ello se encarga systemd.

Por último, para apagar el sistema el gestor de ventanas ya no ejecuta halt, sino systemctl poweroff, con lo que ya no es necesario que haya un comando para ello con el bit suid activo.

Un último detalle: tuve que desinstalar el demonio pulseaudio para conseguir que reprodujese vídeos. Todavía no se el motivo de que con él lanzado no funcione (el audio queda bloqueado y tanto mplayer como vlc se quedan congelados esperando a que se libere).


Utilizamos cookies para garantizar que tenga la mejor experiencia en nuestro sitio web.