Cómo utilizar Udev para la detección y gestión de dispositivos en Linux


Udev (espacio de usuario/dev) es un subsistema de Linux para la detección y administración de dispositivos dinámicos, desde la versión 2.6 del kernel. Es un reemplazo de devfs y hotplug.

Crea o elimina dinámicamente nodos de dispositivo (una interfaz para un controlador de dispositivo que aparece en un sistema de archivos como si fuera un archivo ordinario, almacenado en el directorio/dev) en el momento del arranque o si agrega o elimina un dispositivo de el sistema. Luego propaga información sobre un dispositivo o cambia su estado al espacio de usuario.

Su función es 1) proporcionar a las aplicaciones del sistema eventos de dispositivos, 2) administrar los permisos de los nodos de los dispositivos y 3) puede crear enlaces simbólicos útiles en el directorio/dev para acceder a los dispositivos, o incluso cambiar el nombre de las interfaces de red.

Una de las ventajas de udev es que puede utilizar nombres de dispositivos persistentes para garantizar una denominación uniforme de los dispositivos en los reinicios, a pesar de su orden de descubrimiento. Esta característica es útil porque el kernel simplemente asigna nombres de dispositivos impredecibles según el orden de descubrimiento.

En este artículo, aprenderemos cómo usar Udev para la detección y administración de dispositivos en sistemas Linux. Tenga en cuenta que la mayoría, si no todas, las distribuciones modernas convencionales de Linux vienen con Udev como parte de la instalación predeterminada.

Aprenda los conceptos básicos de Udev en Linux

El demonio udev, systemd-udevd (o systemd-udevd.service) se comunica con el kernel y recibe uevents del dispositivo directamente de él cada vez que agrega o quita un dispositivo del sistema, o un dispositivo cambia su estado.

Udev se basa en reglas, sus reglas son flexibles y muy poderosas. Cada evento de dispositivo recibido se compara con el conjunto de reglas leídas de archivos ubicados en /lib/udev/rules.d y /run/udev/rules.d.

Puede escribir archivos de reglas personalizadas en el directorio /etc/udev/rules.d/ (los archivos deben terminar con la extensión .rules ) para procesar un dispositivo. Tenga en cuenta que los archivos de reglas de este directorio tienen la máxima prioridad.

Para crear un archivo de nodo de dispositivo, udev necesita identificar un dispositivo usando ciertos atributos como la etiqueta, el número de serie, su número mayor y menor utilizado, el número de dispositivo de bus y mucho más. Esta información es exportada por el sistema de archivos sysfs.

Siempre que conecta un dispositivo al sistema, el kernel lo detecta e inicializa, y se crea un directorio con el nombre del dispositivo en el directorio/sys/que almacena los atributos del dispositivo.

El archivo de configuración principal para udev es /etc/udev/udev.conf, y para controlar el comportamiento en tiempo de ejecución del demonio udev, puede usar la utilidad udevadm.

Para mostrar los eventos del kernel recibidos (uevents) y los eventos udev (que udev envía después del procesamiento de la regla), ejecute udevadm con el comando monitor. Luego, conecte un dispositivo a su sistema y observe, desde la terminal, cómo se maneja el evento del dispositivo.

La siguiente captura de pantalla muestra un extracto de un evento ADD después de conectar un disco flash USB al sistema de prueba:

$ udevadm monitor 

Para encontrar el nombre asignado a su disco USB, use la utilidad lsblk que lee el sistema de archivos sysfs y udev db para recopilar información sobre los dispositivos procesados.

 
$ lsblk

De la salida del comando anterior, el disco USB se llama sdb1 (la ruta absoluta debe ser /dev/sdb1 ). Para consultar los atributos del dispositivo desde la base de datos udev, use el comando info.

$ udevadm info /dev/sdb1

Cómo trabajar con reglas Udev en Linux

En esta sección, discutiremos brevemente cómo escribir reglas de udev. Una regla se compone de una lista separada por comas de uno o más pares clave-valor. Las reglas le permiten cambiar el nombre de un nodo de dispositivo desde el nombre predeterminado, modificar los permisos y la propiedad de un nodo de dispositivo, activar la ejecución de un programa o script cuando se crea o elimina un nodo de dispositivo, entre otros.

Escribiremos una regla simple para iniciar un script cuando se agrega un dispositivo USB y cuando se elimina del sistema en ejecución.

Comencemos por crear las dos secuencias de comandos:

$ sudo vim /bin/device_added.sh

Agregue las siguientes líneas en el script device_added.sh .

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

Abra el segundo guión.

$ sudo vim /bin/device_removed.sh

Luego agregue las siguientes líneas al script device_removed.sh .

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

Guarde los archivos, cierre y haga que ambos scripts sean ejecutables.

$ sudo chmod +x /bin/device_added.sh
$ sudo chmod +x /bin/device_removed.sh

A continuación, creemos una regla para activar la ejecución de los scripts anteriores, denominada /etc/udev/rules.d/80-test.rules.

$ vim /etc/udev/rules.d/80-test.rules

Agregue estas dos reglas siguientes.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

dónde:

  • "u003du003d" : es un operador para comparar la igualdad.
  • "+ u003d" : es un operador para agregar el valor a una clave que contiene una lista de entradas.
  • SUBSYSTEM: coincide con el subsistema del dispositivo de eventos.
  • ACCIÓN: coincide con el nombre de la acción del evento.
  • ENV {DEVTYPE}: coincide con un valor de propiedad de dispositivo, en este caso el tipo de dispositivo.
  • EJECUTAR: especifica un programa o secuencia de comandos para ejecutar como parte del manejo de eventos.

Guarde el archivo y ciérrelo. Luego, como root, dígale a systemd-udevd que recargue los archivos de reglas (esto también recarga otras bases de datos como el índice del módulo del kernel), ejecutando.

$ sudo udevadm control --reload

Ahora conecte una unidad USB a su máquina y verifique si se ejecutó el script device_added.sh . En primer lugar, el archivo scripts.log debe crearse en/tmp.

$ ls -l /tmp/scripts.log

Luego, el archivo debe tener una entrada como "Dispositivo USB eliminado en date_time", como se muestra en la captura de pantalla.

$ cat /tmp/scripts.log

Para obtener más información sobre cómo escribir reglas de udev y administrar udev, consulte las entradas manuales de udev y udevadm respectivamente, ejecutando:

$ man udev
$ man udevadm

Udev es un administrador de dispositivos extraordinario que proporciona una forma dinámica de configurar nodos de dispositivos en el directorio /dev . Garantiza que los dispositivos se configuren tan pronto como se conecten y descubran. Propaga información sobre un dispositivo procesado o cambios en su estado, al espacio de usuario.

Si tiene alguna pregunta o idea que compartir sobre este tema, utilice el formulario de comentarios.