Explicación detallada de udev en el sistema Linux

Este artículo está integrado con referencia a una gran cantidad de información en Internet. Es solo para la conveniencia del aprendizaje y la memoria. No hay otro propósito. Si hay una infracción de derechos de autor, póngase en contacto a tiempo.

introducción de udev

udev es un módulo de administración de archivos de dispositivo recientemente agregado en la serie Linux kernel2.6. Su función es principalmente administrar dinámicamente los archivos del dispositivo, como agregar y eliminar operaciones. Cuando el controlador detecta el dispositivo recién insertado, registrará nuevos datos (algunos archivos de información relacionados con este dispositivo) en sysfs. Al mismo tiempo, el núcleo enviará el evento del dispositivo a udev, y udev accederá a las reglas de configuración después de recibirlo. Luego realice las operaciones correspondientes de acuerdo con las reglas de configuración, como modificar el grupo de dispositivos, el grupo, los permisos, la creación de archivos de enlace y el montaje. Del mismo modo, después de que el dispositivo se desconecte, udev también recibirá los eventos uevent enviados por el núcleo, udev realizará operaciones tales como eliminar archivos del dispositivo, desmontar, eliminar archivos de enlace, etc. de acuerdo con las reglas de uevnet. De esta manera, los archivos del dispositivo pueden administrarse dinámicamente y el dispositivo puede intercambiarse en caliente. No es necesario crear muchos archivos de dispositivos estáticos en el directorio / dev por adelantado .
Además de la gestión dinámica de archivos de dispositivo mencionada anteriormente, otro aspecto destacado de udev es que se ejecuta en el espacio del usuario y puede realizar las operaciones correspondientes de acuerdo con las reglas definidas por el cliente. Por ejemplo, hay varias interfaces USB en el dispositivo y hay dos impresoras de interfaz USB. Si están conectadas al dispositivo al mismo tiempo, se generarán dos archivos de dispositivo en el directorio / dev / del dispositivo, como / dev / sda y / dev / sdb . Entonces, ¿cuál es su correspondencia? sda corresponde a la impresora 1 o impresora 2. Esto está relacionado con la operación del cliente, como el orden de inserción y la situación de la máquina relacionada con el equipo intermedio. Esto no se puede manejar en la administración de archivos de dispositivos estáticos y devfs anteriores. Solo necesitamos modificar las reglas de udev para lograr el mapeo uno a uno. Por ejemplo, el archivo del dispositivo vincula la impresora1, la impresora2 se crean en función del número de serie del dispositivo, la ID del proveedor, etc. Mientras la impresora 1 esté enchufada, se generará un archivo de enlace impresora1, y ya no necesitamos restricciones tales como la secuencia de inserción de dispositivos de temporización.Dado que udev es un módulo que se ejecuta en el espacio del usuario, el núcleo seguirá generando archivos sda, sdab y otros dispositivos.
El principio de funcionamiento de udev: el sistema de archivos sysfs se introdujo en la versión Linux2.6. sysfs organiza los dispositivos y buses conectados al sistema en un archivo jerárquico y proporciona acceso al espacio del usuario. udev se ejecuta en modo de usuario, no en el núcleo . El script de inicialización de udev crea un nodo de dispositivo cuando se inicia el sistema, y ​​después de que se detecta un nuevo dispositivo, se generará una serie de archivos en sysfs, y udev creará un nuevo nodo de dispositivo. udev debe admitir sysfs y tmpfs en el kernel, sysfs proporciona entrada de dispositivo y canal uevent para udev, y tmpfs proporciona espacio de almacenamiento para archivos de dispositivo udev . La siguiente figura es el diagrama de flujo de trabajo de udev. El archivo de configuración se almacena en el archivo /etc/udev/udev.conf.
Inserte la descripción de la imagen aquí
¿Por qué usar udev, porque los métodos de administración de archivos del dispositivo (archivos estáticos y devfs) utilizados anteriormente tienen algunos defectos:

  • Mapeo de dispositivos inciertos. Especialmente para esos dispositivos dinámicos, como los dispositivos USB, la asignación de archivos de dispositivos a dispositivos reales no es confiable y determinista. Tome un ejemplo: si tiene dos impresoras USB. Uno puede llamarse / dev / usb / lp0, y el otro es / dev / usb / lp1. Sin embargo, no está claro cuál es cuál, lp0, lp1 y el dispositivo real no tienen una correspondencia uno a uno, porque puede encontrar que el orden del dispositivo, la impresora está apagada y otras razones conducen a esta asignación no es segura. La forma ideal debería ser: dos impresoras deberían asignarse utilizando un archivo de dispositivo único basado en su número de serie u otra información de identificación. Pero ni los archivos estáticos ni los devfs pueden hacer esto.
  • No hay suficientes números de equipo primario / secundario. Sabemos que cada archivo de dispositivo tiene dos números de 8 dígitos: uno es el número del dispositivo principal y el otro es el número del dispositivo auxiliar. Estos dos números de 8 bits más el tipo de dispositivo (dispositivo de bloque o dispositivo de caracteres) para identificar un dispositivo de forma exclusiva. Desafortunadamente, los números a su alrededor no son suficientes.
  • Hay demasiados archivos en el directorio / dev. Un sistema utiliza la asociación de archivos de dispositivos estáticos, por lo que debe haber suficientes archivos en este directorio. Al mismo tiempo, no sabe qué archivos de dispositivo están activados en su sistema.
  • El nombramiento no es lo suficientemente flexible. Aunque devfs resuelve algunos de los problemas anteriores, en sí mismo trae algunos problemas. Una de ellas es que la denominación no es lo suficientemente flexible; puede cambiar el nombre del archivo del dispositivo de manera muy simple. El mecanismo de comando de devfs predeterminado también es muy extraño, necesita modificar muchos archivos y programas de configuración. ;
  • Uso de la memoria del kernel, otro problema exclusivo de devfs es que, como módulo del controlador del kernel, devfs necesita consumir mucha memoria, especialmente cuando hay una gran cantidad de dispositivos en el sistema (como el sistema que mencionamos anteriormente tiene miles de discos en uno)

El objetivo de udev es resolver los problemas mencionados anteriormente. Utiliza la herramienta de espacio de usuario para administrar el árbol de directorios / dev /, que está separado del sistema de archivos. Saber cómo cambiar la configuración predeterminada le permite saber cómo personalizar su sistema, como crear conexiones de caracteres del dispositivo, cambiar los grupos de archivos del dispositivo y los permisos.

reglas de udev

Como se mencionó anteriormente, udev realizará operaciones relacionadas de acuerdo con las reglas del usuario. Entonces, ¿dónde se colocan estos archivos de reglas y cuáles son las reglas? Entre las reglas, este artículo solo explica algunas comunes. Para más detalles, consulte la documentación de man udev.
El archivo de configuración principal de udev es ** / etc / udev / udev.conf **. Este archivo suele ser muy corto, como se muestra a continuación. Entre ellos, udev_root especifica el directorio raíz donde se almacenan los archivos del dispositivo, udev_rules especifica la ruta de almacenamiento de las reglas y udev_log especifica el nivel de registro. Hay otras configuraciones que no se explicarán aquí, como la base de datos donde se almacenan los registros.

udev_root="/dev/"

udev_rules="/etc/udev/rules.d/"

udev_log="err"

El archivo de reglas se almacena en el directorio especificado por udev_rules, y el sufijo del nombre del archivo es .lures. Puede haber múltiples archivos de reglas, y la secuencia de coincidencia se realiza mediante la instalación de códigos ASCII. Si se encuentra una regla coincidente, la coincidencia se suspende y los archivos de reglas posteriores no coinciden. Por lo tanto, los archivos de reglas personalizadas comienzan básicamente con números, lo que aumenta la prioridad de los archivos de reglas. La siguiente figura es un archivo de reglas simple: el archivo de reglas está en unidades de líneas y una línea es una regla

KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"
KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

En el archivo de reglas, las reglas se componen de una serie de pares clave-valor, que están separados por comas. Los pares clave-valor se dividen en claves coincidentes y claves de asignación. La clave de coincidencia se utiliza para especificar la regla de coincidencia, y la clave de asignación se utiliza para la asignación. La clave de asignación puede manejar una lista de valores múltiples.

udev gobierna todos los operadores

  • "==": Comparar clave y valor, si es igual, se cumple la condición;
  • "! =": Comparar clave y valor, si no es igual, la condición se cumple;
  • "=": Asigna un valor a una clave;
  • "+ =": Asigna una clave a múltiples entradas.
  • ": =": Asigna un valor a una clave y rechaza todos los cambios posteriores a la clave. El propósito es evitar que los archivos de reglas posteriores asignen valores a la clave.

Clave de coincidencia para las reglas de udev

  • ACCIÓN : El comportamiento del evento (evento), por ejemplo: agregar (agregar dispositivo), eliminar (eliminar dispositivo).
  • KERNEL : nombre del dispositivo del núcleo, por ejemplo: sda, cdrom.
  • DEVPATH : el devpath del dispositivo.
  • SUBSISTEMA : El nombre del subsistema del dispositivo, por ejemplo, el subsistema de sda ​​es bloque.
  • BUS : el nombre del dispositivo en el devpath, por ejemplo: usb.
  • DRIVER: el nombre del controlador del dispositivo en devpath, por ejemplo: ide-cdrom.
  • ID: el número de identificación del dispositivo en devpath.
  • SYSFS {nombre de archivo} : el contenido del archivo de propiedades del dispositivo "nombre de archivo" en la ruta de acceso del dispositivo Por ejemplo: SYSFS {model} == "ST936701SS" significa: Si el modelo del dispositivo es ST936701SS, el dispositivo coincide con la clave correspondiente.
  • ENV {clave} : variable de entorno. En una regla, puede configurar hasta cinco claves coincidentes para las variables de entorno.
  • PROGRAMA: Llama a comandos externos.
  • RESULTADO: El resultado de retorno del comando externo PROGRAMA.

Clave de asignación importante de Udev

  • NOMBRE: El nombre del archivo del dispositivo generado bajo / dev. Solo la primera asignación del NOMBRE de un dispositivo surte efecto, y las reglas de coincidencia posteriores se ignorarán para la asignación del nombre del dispositivo. Si no hay una regla para asignar un nombre al dispositivo, udev usará el nombre del dispositivo del núcleo para generar el archivo del dispositivo.
  • SYMLINK: Genera enlaces simbólicos para archivos de dispositivo en / dev /. Dado que udev solo puede generar un archivo de dispositivo para un determinado dispositivo, se recomienda utilizar enlaces simbólicos para no sobrescribir los archivos generados por las reglas predeterminadas de udev del sistema.
  • PROPIETARIO, GRUPO, MODO: Establezca permisos para el dispositivo.
  • ENV {clave}: importar una variable de entorno.

valor de udev y operador de reemplazo invocable

  • $ kernel,% k: el nombre del dispositivo kernel del dispositivo, por ejemplo: sda, cdrom.
  • $ number,% n: el número de kernel del dispositivo, por ejemplo: el número de kernel de sda3 es 3.
  • $ devpath,% p: la ruta devpath del dispositivo.
  • $ id,% b: el número de identificación del dispositivo en devpath.
  • $ sysfs {archivo},% s {archivo}: El contenido del archivo en los sysfs del dispositivo. De hecho, es el valor del atributo del dispositivo.
  • $ env {key},% E {key}: el valor de una variable de entorno.
  • $ major,% M: el número principal del dispositivo.
  • $ minor% m: el número menor del dispositivo.
  • $ resultado,% c: El resultado devuelto por PROGRAM.
  • $ parent,% P: el nombre del archivo del dispositivo del dispositivo padre.
  • $ root,% r: el valor de udev_root, el valor predeterminado es / dev /.
  • $ tempnode,% N: nombre temporal del dispositivo.
  • %%: El símbolo% mismo.
  • $$: el símbolo $ sí mismo.

La regla en la imagen a continuación es producir el nombre de enlace especificado de acuerdo con el proveedor de ID y el producto de ID del escáner. El enlace se corrige cada vez que se enciende el escáner, por lo que la relación de mapeo se puede determinar bien.

SYSFS{idVendor}=="0686",SYSFS{idProduct}=="400e", SYMLINK+="scanner", MODE="0664", group="scanner"

Si las reglas entran en vigencia después de que se modifiquen, podemos conectar y desconectar nuestro dispositivo para generar un evento o agregar información en el archivo de eventos en el dispositivo para actualizar nuestras reglas de udev con el fin de enviar eventos. Un método más conveniente es ejecutar el siguiente comando

udevadm test /sys/class/block/sdc4
udevinfo -q path -n /dev/sda 这个命令会产生一个该设备名对应的在sysfs下的路径
udevinfo -a -p /sys/block/sda 这个命令会显示一堆信息,这些信息实际来自于操作系统维护的sysfs链表。

puerto udev

El código fuente de udev se puede descargar desde la URL de descarga de udev . Los siguientes son los pasos de migración.

  • Descargue el paquete fuente de udev y descomprímalo
  • Modifique la herramienta de compilación cruzada CROSS en el Makefile al compilador de su propia placa de desarrollo
  • Ejecute make para compilar.
  • Luego ejecute strip udev uded udevstart udevinfo udevtest. Y copie estos archivos en el directorio rootfs / bin.
  • Agregue soporte para udev, modifique el script /etc/init.d/rcS y agregue el siguiente comando:
/bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs tmpfs /dev
/bin/udevd --deamon
/bin/udevstart 
  • Crear directorio udev en / etc
  • Cree reglas.d y archive udev.conf en / etc / udev. El contenido de udev.conf es el siguiente:
    # udev.conf
    # The initial syslog(3) priority: 'err', 'info', 'debug' or its
    # numerical equivalent. For runtime debugging, the daemons internal
    # state can be changed with: 'udevcontrol log_priority='.
    udev_root="/dev/"
    udev_rules="/etc/udev/rules.d"
    udev_log="err"
  • Cree su propio archivo de reglas en el directorio rules.d. El archivo debe usar el sufijo .rules.
    Dado que udev necesita soporte sysfs y soporte tmpfs, debe montar estos dos directorios antes de iniciar udev.
Publicado 35 artículos originales · Me gusta1 · Visitas 1870

Supongo que te gusta

Origin blog.csdn.net/lzj_linux188/article/details/105094697
Recomendado
Clasificación