Una interrogante que surge comúnmente a la hora de implementar un módulo de Linux es que mecanismo elegir para configurarlo. Desafortunadamente para algunos (y afortunadamente para otros) existen varias (quizás demasiadas) alternativas para ello. A continuación presento un resumen de ellas, junto con una comparativa.
Archivo de configuración
Si bien esta alternativa a veces resulta tentadora por su gran flexibilidad, no se recomienda (e incluso está muy mal visto) acceder a archivos desde el espacio del Kernel. Las razones son varias, pero la más importante es la dependencia que se crea entre el módulo y el filesystem (donde se alojaría el archivo de configuración) que es una objeto de más alto nivel y por lo tanto puede no estar disponible desde el espacio del Kernel (donde se ejecuta el módulo). Para una aplicación que corre en espacio de usuario, dicha limitación no es problema ya que el filesystem es un objeto de más bajo nivel y por lo tanto podemos asumir que siempre estará disponible como cualquier otro recurso básico (memoria, procesador).
Parámetros del módulo
Esta técnica consta en pasar la configuración del módulo a través de parámetros en el momento de cargarlo (ya sea con el comando insmod
o modprobe
). La ventaja de esta técnica es que es la forma más universal de configurar un módulo, y está disponible en cualquier versión de Linux. La desventaja es que carece de flexibilidad ya que solo puede utilizarse por única vez al cargar el módulo y para cambiar sus valores requiere que el módulo sea re-cargado (en realidad sysfs permite cambiar el valor de los parámetros en caliente, pero no tiene forma directa de notificar al módulo de los cambios). Para módulos que precisan una configuración mas flexible y dinámica (por ejemplo, agregar nuevas conexiones a un dispositivo de bloques clusterizado) esta alternativa resulta inviable.
ioctl
La llamada del sistema ioctl implementa un tipo de canal especial de control que permite enviar parámetros de configuración a los módulos y dispositivos activos del sistema. Este canal es independiente del canal (por defecto) de datos que es utilizado para transmitir información y trabajar regularmente con el dispositivo (por ejemplo, /dev/hda). Cada “mensaje” de ioctl consta, básicamente, de un comando y un argumento. Esta puede es una buena alternativa a utilizar para configurar módulos que requieran de configuraciones dinámicas, y tiene la ventaja de que es un mecanismo muy estandarizado puesto que existe desde los albores de Linux y es una llamada del sistema (ioctl(2)) disponible en todos los sistemas POSIX. Sin embargo, en Linux, ioctl está considerado medio obsoleto puesto que existen nuevos mecanismos más modernos que brindan la misma funcionalidad de forma más "prolija". Esto es debido a que para usar ioctl exige el conocimiento del protocolo y las funciones soportadas por el dispositivo que es algo que cambia completamente de dispositivo en dispositivo y no existe ninguna estándarización adecuada.
procfs
Procfs es un sistema de archivos (generalmente montado en /proc
) diseñado para acceder a información sobre los procesos que corren en el sistema. Permite tanto acceder como modificar información del funcionamiento del sistema a través de unos archivos virtuales que pueden ser leídos (o escritos) con tales fines. Esta característica (única en su momento) hizo que procfs adoptara una gran popularidad a lo largo del tiempo y (por una razón de conveniencia) su funcionalidad se extendiera a otros usos como la configuración y consulta de módulos y otros parámetros del Kernel. Desde hace ya un tiempo, los desarrolladores del Kernel se han visto preocupados y molestos frente a la degeneración del uso de procfs y para combatirlo decidieron incorporar un nuevo filesystem: sysfs.
sysfs
Sysfs es un sistema de archivos incorporado en el Kernel 2.6 y diseñando para poder acceder (de forma coherente y prolija) a información de los módulos, dispositivos y otros subsistemas activos del Kernel . Fue incorporado con la idea de corregir el uso incorrecto que se le estaba dando a procfs. Sysfs consiste de un sistema de archivos virtual similar a procfc, pero con la diferencia de que está pensado para acceder a información de los objetos del Kernel (dispositivos, buses, módulos, etc), mientras que procfs está pensado únicamente para acceder a información de procesos (de ahí su nombre). Sysfs también especifica una forma estándar de acceder a la información de los objetos del Kernel (ver la documentación de kobject). Sysfs (al igual que procfs) también permite modificar sus archivos logrando así cambiar la configuración del módulo o sistema que se esté configurando. Sysfs pareciera ser, a primera vista, la alternativa ideal para realizar la configuración de un módulo. Sin embargo, la historia no termina ahi, ya que sysfs fue diseñado para obtener información de los dispositivos, no para configurarlos.
configfs
Finalmente, tenemos Configfs es un nuevo sistema de archivos virtual (recientemente incorporado al Kernel) análogo a sysfs y procfs, pero diseñado específicamente para configurar y administrar módulos y dispositivos. La gran diferencia con sysfs es que permite la creación de nuevos objetos del Kernel a través de la llamada del sistema mkdir(2) lo cual brinda una gran flexibilidad a la hora de configurar un módulo en tiempo de ejecución. Además, los archivos de configfs pueden existir de forma independiente del dispositivo, mientras que en sysfs los archivos siempre existen dentro del contexto del dispositivo y por lo tanto el módulo debe estar cargado previamente, cuando en realidad el objetivo de la configuración es proveerle al módulo la información necesaria para cargarse. Haciéndo una analogía con el espacio de usuario, podemos observar que los archivos de configuración existen (en el filesystem) independiente de que sus aplicaciones estén corriendo o no.
Configfs recién fue incorporado en la versión 2.6.16 y aún es un "bicho raro". Muchos todavía lo ven como un capricho de los desarrolladores del Kernel, que no supieron conformarse con sysfs. Otros lo ven como lo que es: una forma de hacer lo mismo, pero de manera más prolija. Si bien la compatibilidad y la estabilidad (siendo un sistema nuevo) le juegan en contra, configfs ha sido muy bien recibido por la comunidad del Kernel, lo cual le augura un muy buen futuro.