Tutorial sobre cómo escribir reglas básicas de UDEV en Linux

Tutorial sobre cómo escribir reglas básicas de UDEV en Linux

Objetivo

Comprender los conceptos base detrás de UDEV y aprender a escribir reglas simples

Requisitos

  • Permisos de raíz

Dificultad

MEDIO

Convenciones

  • # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz
    directamente como usuario raíz o mediante el uso de sudo dominio
  • ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Introducción

En un sistema GNU/Linux, mientras que el soporte de bajo nivel de los dispositivos se maneja a nivel del núcleo, la administración de eventos relacionados con ellos se gestiona en el espacio de usuarios por udev, y más precisamente por el UDEVD demonio. Aprender a escribir reglas para aplicar sobre la ocurrencia de esos eventos puede ser realmente útil para modificar el comportamiento del sistema y adaptarlo a nuestras necesidades.

Cómo se organizan las reglas

Las reglas de UDEV se definen en archivos con el .normas extensión. Hay dos ubicaciones principales en las que se pueden colocar esos archivos: /usr/lib/udev/reglas.d Es el directorio utilizado para las reglas instaladas en el sistema, /etc/udev/reglas.d/ está reservado para reglas personalizadas.

Los archivos en los que se definen las reglas se nombran convencionalmente con un número como prefijo (e.gramo 50-defauga de la URIV.normas) y se procesan en orden léxico independientemente del directorio en el que se encuentran. Archivos instalados en /etc/udev/reglas.d, Sin embargo, anule aquellos con el mismo nombre instalado en la ruta predeterminada del sistema.



La sintaxis de las reglas

La sintaxis de las reglas de UDEV no es muy complicada una vez que comprende la lógica detrás de ella. Una regla está compuesta por dos secciones principales: la parte de "coincidencia", en la que definimos las condiciones para que se aplique la regla, utilizando una serie de claves separadas por una coma y la parte de "acción", en la que realizamos algunas tipo de acción, cuando se cumplen las condiciones.

Un caso de prueba

Qué mejor manera de explicar posibles opciones que configurar una regla real? Como ejemplo, vamos a definir una regla para deshabilitar el panel táctil cuando un mouse está conectado. Obviamente, los atributos proporcionados en la definición de reglas reflejarán mi hardware.

Escribiremos nuestra regla en el /etc/udev/reglas.d/99-togglemouse.normas Archivo con la ayuda de nuestro editor de texto favorito. Una definición de regla puede abarcar en varias líneas, pero si ese es el caso, se debe usar una barra insegura antes del carácter de Newline, como una continuación de línea, al igual que en los scripts de shell. Aquí está nuestra regla:

Action == "Agregar" \, attrs idproduct == "c52f" \, attrs idvendor == "046d" \, env display = ": 0" \, env xauthority = "/run/ usuario/1000/gdm/xauthority "\, run+="/usr/bin/xinput --sable 16 " 

Analicémoslo.

Operadores

En primer lugar, una explicación de los operadores usados ​​y posibles:

== y != operadores

El == es el operador de igualdad y el != es el operador de desigualdad. Al usarlos, establecemos que para aplicar la regla, las claves definidas deben coincidir o no coincidir con el valor definido respectivamente.

Los operadores de asignación: = y: =

El = El operador de asignación se utiliza para asignar un valor a las claves que acepta una. Usamos el : = Operador, en cambio, cuando queremos asignar un valor y queremos asegurarnos de que no sean anulados por otras reglas: los valores asignados con este operador, en realidad, no se pueden alterar.

Los operadores += y -=

El += y -= Los operadores se utilizan respectivamente para agregar o eliminar un valor de la lista de valores definidos para una clave específica.



Las teclas que usamos

Analicemos ahora las claves que utilizamos en la regla. En primer lugar, tenemos el ACCIÓN Clave: al usarlo, especificamos que nuestra regla se aplicará cuando ocurra un evento específico para el dispositivo. Los valores válidos son agregar, eliminar y cambiar

Luego usamos el Atacantes palabra clave para especificar un atributo a coincidir. Podemos enumerar los atributos de un dispositivo utilizando el Información de udevadm comando, proporcionando su nombre o sysfs camino:

UDEVADM INFO -AP/dispositivos/PCI0000: 00/0000: 00: 1D.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046d: C52F.0010/input/input39 La información de UDevAdm comienza con el dispositivo especificado por el Devpath y luego sube la cadena de dispositivos principales. Imprime para cada dispositivo encontrado, todos los atributos posibles en el formato de tecla de reglas UDEV. Una regla para que coincida, puede ser compuesta por los atributos del dispositivo y los atributos de un solo dispositivo principal. Mirando el dispositivo '/dispositivos/PCI0000: 00/0000: 00: 1D.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046d: C52F.0010/input/input39 ': kernel == "input39" subsystem == "input" controlador == "" attr name == "Logitech USB receptor" attr Phys == "USB-0000: 00: 1D.0-1.2/input1 "attr propiedades ==" 0 "attr uniq ==" "Mirando el dispositivo principal '/dispositivos/pci0000: 00/0000: 00: 1D.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046d: C52F.0010 ': kernels == "0003: 046d: C52F.0010 "Subsistemas ==" HID "Controladores ==" HID-Generéricos "ATRS país ==" 00 "Mirando el dispositivo principal '/dispositivos/pci0000: 00/0000: 00: 1D.0/USB2/2-1/2-1.2/2-1.2: 1.1 ': kernels == "2-1.2: 1.1 "subsystems ==" usb "controladores ==" usbhid "attrs autorizados ==" 1 "attrs BalternateTetting ==" 0 "attrs binterfaceclass ==" 03 "attrs binterfacenumber ==" 01 " Attrs binterfaceproTocol == "00" attrs binterfacesSubClass == "00" attrs bnumendpoints == "01" attrs sports_aUtosuspend == "1" Mirando el dispositivo matriz '/dispositivos/pci0000: 00/0000: 00: 1D.0/USB2/2-1/2-1.2 ': kernels == "2-1.2 "subsistemas ==" USB "controladores ==" USB "attrs autorizados ==" 1 "attrs evit_reset_quirk ==" 0 "attrs bconfigurationValue ==" 1 "attrs bdeviceclass ==" 00 " Attrs bdeviceProtocol == "00" attrs bdevicesubclass == "00" attrs bmaxpacketSize0 == "8" attrs bmaxPower == "98ma" Atrs bnumconfiguations == "1" ATTRS bnuminterfaces = = "2" attrs bcddevice == "3000" attrs bmattributes == "a0" attrs busnum == "2" attrs configuración == "rqr30.00_B0009 "ATTRS DevNum ==" 12 "ATTRS DevPath ==" 1.2 "Atrs iDProduct == attrs idvendor ==" 046d "attrs ltm_capables ==" no "attrs fabricante ==" logitech "attrs maxChild ==" 0 "attrs producto de producto  == ATTRS "USB receptor" Quirks == "0x0" attrs eliminables == attrs "removibles" velocidad == "12" attrs urbnum == "1401" attrs versión == " 2.00 "[...] 


Arriba es la salida truncada recibida después de ejecutar el comando. Como puede leerlo desde la salida en sí, udevadm Comienza con la ruta especificada que proporcionamos y nos brinda información sobre todos los dispositivos principales. Observe que los atributos del dispositivo se informan en forma singular (E.gramo NÚCLEO), mientras que los padres en forma plural (e.gramo Núcleo). La información de los padres puede ser parte de una regla, pero solo uno de los padres puede ser referenciado a la vez: la mezcla de los atributos de diferentes dispositivos principales no funcionará. En la regla que definimos anteriormente, utilizamos los atributos de un dispositivo principal: IDPRODUCTO y idvendor.

Lo siguiente que hemos hecho en nuestra regla es usar el Envidia Palabra clave: se puede usar para establecer o intentar hacer coincidir las variables de entorno. Asignamos un valor al MOSTRAR y Xautoridad unos. Esas variables son esenciales cuando se interactúan con el servidor X programáticamente, para configurar la información necesaria: con el MOSTRAR Variable, especificamos en qué máquina está ejecutando el servidor, qué pantalla y a qué pantalla estamos haciendo referencia y con Xautoridad Proporcionamos la ruta al archivo que contiene información de autenticación y autorización de XORG. Este archivo generalmente se encuentra en el directorio de "inicio" de los usuarios.

Finalmente usamos el CORRER Palabra clave: esto se utiliza para ejecutar programas externos. Muy importante: esto no se ejecuta de inmediato, pero las diversas acciones se ejecutan una vez que todas las reglas se han analizado. En este caso usamos el xinput utilidad para cambiar el estado del panel táctil. No explicaré la sintaxis de xinput aquí, estaría fuera de contexto, solo note que dieciséis es la identificación del panel táctil.

Una vez que se establece nuestra regla, podemos depurarla usando el prueba de udevadm dominio. Esto es útil para la depuración, pero realmente no ejecuta comandos especificados usando el CORRER llave:

$ UDEVADM TEST --Action = "Agregar"/dispositivos/PCI0000: 00/0000: 00: 1D.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046d: C52F.0010/entrada/entrada39

Lo que proporcionamos al comando es la acción para simular, usando el --acción opción y la ruta SYSFS del dispositivo. Si no se informan errores, nuestra regla debería ser buena. Para ejecutarlo en el mundo real, debemos recargar las reglas:

# UDEVADM CONTROL -RELOAD

Este comando volverá a cargar los archivos de reglas, sin embargo, tendrá efecto solo en los nuevos eventos generados.

Hemos visto los conceptos y la lógica básicos utilizados para crear una regla UDEV, sin embargo, solo rascamos la superficie de las muchas opciones y posibles configuraciones. La mano de mano de UDEV proporciona una lista exhaustiva: consultela para obtener un conocimiento más profundo.

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Cómo manejar los eventos ACPI en Linux
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Descarga de Linux
  • Archivos de configuración de Linux: los 30 principales más importantes
  • ¿Puede Linux obtener virus?? Explorando la vulnerabilidad de Linux ..
  • Registro avanzado y auditoría en Linux
  • Comandos de Linux: los 20 comandos más importantes que necesitas ..
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?