Agosto
2007
TCOS y el kernel 2.6.22
Desde el kernel 2.6.20 se han acumulado muchos cambios.
Desde que en Debian tenemos el kernel 2.6.22 había notado que tcos-devices-ng no funcionaba como debía.
Problema
Cuando conectamos una memoria USB el kernel avisa a udev que se ha conectado un nuevo dispositivo de bloques, este es detectado y se generan uno o varios eventos «add» (depende del número de particiones), tcos-devices-ng recibe los eventos, y si estan soportados, realiza las acciones (montar la partición si tiene tipo de sistema de archivos). A continuación se envía al terminal la señal para que monte la partición y el ekrnel vuelve a generar un evento «mount» recibiendose en tcos-devices-ng para mostrar un mensaje «El dispositivo xxx está listo»
Investigaciones
Como el que genera los eventos a TCOS es udev, lo que hago es mirar por qué no se están generando, y la forma más rápida es preguntar al desarrollador.
La respuesta es simple:
En el kernel 2.6.22 han quitado los eventos «mount/umount» ya que no funcionaban correctamente. Puedes probar a hacer poll() a /proc/mounts.
Instintivamente hacer poll() a /proc/mounts me suena a que debo vigilar cuando /proc/mounts cambia y realizar las acciones necesarias.
Solución
Recuerdo que existe una librería llamada inotify que sirve para ver cuando un archivo/directorio ha cambiado pero al hacer pruebas con inotifywatch veo que sólo funciona para archivos normales no para cosas en /proc.
Entonces buscando en google y con ayuda de la página «man poll» hago un pequeño programa en C que escucha los cambios en /proc/mounts, este programa detecta cuando /proc/mounts ha sido modificado y se sale. Podría haber hecho el resto del código de comparación en este archivo pero fue más sencillo hacer un bucle con bash-script.
Básicamente lo que hace es crear una copia de /proc/mounts y ejecutar el anterior programa en C que simula ser «un sleep inteligente» hasta que cambia /proc/mounts. Cuando cambia se compara el número de líneas de los dos archivos y se devuelve la diferencia con el resultado que si es un montaje tendremos más líneas y si se desmonta tendremos menos. Para terminar se guarda el resultado en el log que usa tcos-devices-ng en un formato concreto para leer los eventos udev normales.
Reconozco que no es lo más elegante posible pero funciona y ha devuelto los mensajes de dispositivo listo para kernel >= 2.6.22.
Aún no esta empaquetado porque me falta hacer alguna prueba, pero las pruebas han sido satisfactorias.