GNU/Linux >> Tutoriales Linux >  >> Cent OS

Guía para principiantes de Udev en Linux

Udev es el administrador de dispositivos para el kernel de Linux. Udev crea o elimina dinámicamente archivos de nodos de dispositivos en el momento del arranque en el directorio /dev para todos los tipos de dispositivos. Udev ahora es parte de systemd, como puede ver al ver los nombres de archivo "udev" incluidos con el paquete RPM de systemd.

# rpm -ql systemd | grep udev
/etc/udev
/etc/udev/hwdb.bin
/etc/udev/rules.d
/etc/udev/udev.conf
/usr/bin/udevadm
...

El demonio de Udev, systemd-udevd , recibe uevents de dispositivo directamente desde el kernel cada vez que se agrega o elimina un dispositivo del sistema. Para cada evento, systemd-udevd ejecuta las instrucciones coincidentes especificadas en las reglas de Udev.

Los nombres de los archivos de los dispositivos pueden cambiar cuando los discos se eliminan del sistema debido a una falla. Por ejemplo, los dispositivos se denominan /dev/sda, /dev/sdb y /dev/sdc en el momento del arranque. Pero en el próximo reinicio, /dev/sdb falla y lo que antes era /dev/sdc se llama /dev/sdb. Todas las referencias de configuración a /dev/sdb ahora incluyen contenido al que originalmente hacía referencia /dev/sdc.

La solución para evitar este tipo de situaciones es garantizar nombres consistentes para los dispositivos mediante reinicios. Puede configurar Udev para crear nombres persistentes y utilizar estos nombres en la tabla de montaje del sistema de archivos, /etc/fstab, o como argumento para el comando de montaje.

Archivos y directorios de reglas de Udev

Las reglas de Udev determinan cómo identificar dispositivos y cómo asignar un nombre que sea persistente a través de reinicios o cambios de disco. Cuando Udev recibe un evento de dispositivo, compara las reglas configuradas con los atributos del dispositivo en sysfs para identificar el dispositivo. Las reglas también pueden especificar programas adicionales para ejecutar como parte del manejo de eventos del dispositivo.
Los archivos de reglas de Udev se encuentran en los siguientes directorios:

  • /lib/udev/rules.d/ – El directorio de reglas predeterminado
  • /etc/udev/rules.d/ – El directorio de reglas personalizadas. Estas reglas tienen prioridad.

Los archivos de reglas deben tener nombres únicos. Los archivos del directorio de reglas personalizadas anulan los archivos del mismo nombre en el directorio de reglas predeterminado. Los archivos de reglas se clasifican y procesan en orden léxico. La siguiente es una lista parcial de los archivos de reglas de los directorios de reglas predeterminados y personalizados:

# ls -l /lib/udev/rules.d/
total 348
-r--r--r--. 1 root root  7266 Aug  5  2017 10-dm.rules
-r--r--r--. 1 root root  2454 Aug  5  2017 11-dm-lvm.rules
-rw-r--r--. 1 root root  2865 Jan 25 16:05 11-dm-mpath.rules
-r--r--r--. 1 root root  1499 Aug  5  2017 13-dm-disk.rules
-rw-r--r--. 1 root root   553 Aug  6  2017 39-usbmuxd.rules
-rw-r--r--. 1 root root  1622 Mar  7 13:27 40-redhat.rules
...
# ls -l /etc/udev/rules.d/
total 8
-rw-r--r--. 1 root root 709 Aug  4  2017 70-persistent-ipoib.rules
-rw-r--r--. 1 root root  96 Apr 21 05:09 70-persistent-net.rules
lrwxrwxrwx. 1 root root   9 Sep 29  2014 80-net-name-slot.rules -> /dev/null

Reglas de Udev de muestra

El siguiente ejemplo contiene entradas seleccionadas de /lib/udev/rules.d/50-udev-default.rules expediente. Este archivo de reglas contiene más de 60 entradas.

# cat /lib/udev/rules.d/50-udev-default.rules 
# do not edit this file, it will be overwritten on update

SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"

# select "system RTC" or just use the first one
SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"

ACTION!="add", GOTO="default_permissions_end"

SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
....

Las entradas seleccionadas ayudan a describir la sintaxis de los archivos de reglas.
1. Los comentarios comienzan con el signo #.
2. Cada línea sin comentarios en un archivo de reglas consta de una lista de uno o más pares clave-valor separados por una coma. Hay dos tipos de llaves:

  • Claves de coincidencia
  • Teclas de asignación

3. Si todas las claves de coincidencia coinciden con su valor respectivo, se aplica la regla y se asigna el valor especificado a las claves de asignación. Cada tecla tiene una operación distinta, dependiendo del operador. Los operadores válidos son:

  • == :Comparar por igualdad
  • != :Comparar por desigualdad
  • = :Asignar un valor a una clave
  • += :agregue el valor a los valores actuales de la clave
  • := :Asigne el valor final a la clave. Rechazar cualquier cambio posterior por cualquier regla posterior.

4. La coincidencia de patrones al estilo Shell (*, ?, []) también es compatible con las reglas de Udev.

Claves de coincidencia

Los siguientes nombres de clave se utilizan para hacer coincidir las propiedades del dispositivo. Algunas de las claves también coinciden con las propiedades de los dispositivos principales en sysfs, y no solo con el dispositivo que generó el evento. Si se especifican varias claves en una sola regla, todas estas claves deben coincidir.

  • ACCIÓN :coincide con el nombre de la acción del evento.
  • DEVPATH :coincide con la ruta de desarrollo del dispositivo de eventos.
  • NÚCLEO :coincide con el nombre del dispositivo de evento.
  • NOMBRE :coincide con el nombre de una interfaz de red. Se puede usar si la tecla NOMBRE se configuró en una de las reglas anteriores.
  • SYMLINK :coincide con el nombre del enlace simbólico que apunta al nodo. Se puede usar si se configuró una clave SYMLINK en una de las reglas anteriores. Puede haber varios enlaces simbólicos, pero solo uno debe coincidir.
  • SUBSISTEMA :Haga coincidir el subsistema del dispositivo de eventos.
  • PRUEBA{máscara de modo octal} :Probar la existencia de un archivo. Puede especificar la máscara de modo octal.

Otras claves de coincidencia incluyen DRIVER, ATTR{filename}, KERNELS, SUBSYSTEMS, DRIVERS, ATTRS{filename}, TAGS, ENV{key}, TAG, PROGRAM y RESULT.

Claves de asignación

Las siguientes teclas pueden tener valores asignados:

  • NOMBRE – El nombre que se utilizará para una interfaz de red. Udev no puede cambiar el nombre de un nodo de dispositivo, solo se pueden crear enlaces simbólicos adicionales.
  • SYMLINK – El nombre del enlace simbólico que apunta al nodo
  • PROPIETARIO, GRUPO, MODO – Los permisos para el nodo del dispositivo
  • OPCIONES – Opciones de regla y dispositivo. La opción ignore_remove utilizada en el ejemplo significa "No elimine el nodo del dispositivo cuando el dispositivo desaparezca".

Otras claves de asignación incluyen ATTR{clave}, ENV{clave}, ETIQUETA, EJECUTAR{tipo}, ETIQUETA, IR A, IMPORTAR{tipo}, WAIT_FOR y OPCIONES.

Sustituciones de cadenas

Las teclas NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE y RUN admiten muchas sustituciones de cadenas tipo printf. Las sustituciones utilizadas en el ejemplo son:

  • %M – El número principal del kernel para el dispositivo
  • %m – El número menor de kernel para el dispositivo

Se admiten sustituciones de cadenas adicionales. Consulte la página del manual de udev para conocer todas las sustituciones admitidas y los detalles sobre claves de coincidencia adicionales, claves de asignación adicionales y opciones adicionales de reglas y dispositivos.

Utilidad udevadm

La utilidad udevadm es una herramienta de gestión del espacio de usuario para Udev. Entre otras funciones, puede usar udevadm para consultar sysfs y obtener atributos de dispositivos para ayudar a crear reglas de Udev que coincidan con un dispositivo. Para mostrar el uso de udevadm:

# udevadm --help
udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]

Send control commands or test the device manager.

Commands:
  info          Query sysfs or the udev database
  trigger       Request events from the kernel
  settle        Wait for pending udev events
  control       Control the udev daemon
  monitor       Listen to kernel and udev events
  test          Test an event run
  test-builtin  Test a built-in command

También puede obtener información sobre el uso de cada uno de los comandos de udevadm. Por ejemplo, para obtener ayuda sobre el uso del comando info:

# udevadm info --help
udevadm info [OPTIONS] [DEVPATH|FILE]

Query sysfs or the udev database.

  -h --help                   Print this message
     --version                Print version of the program
  -q --query=TYPE             Query device information:
       name                     Name of device node
       symlink                  Pointing to node
       path                     sysfs device path
       property                 The device properties
       all                      All values
  -p --path=SYSPATH           sysfs device path used for query or attribute walk
  -n --name=NAME              Node or symlink name used for query or attribute walk
  -r --root                   Prepend dev directory to path names
  -a --attribute-walk         Print all key matches walking along the chain
                              of parent devices
  -d --device-id-of-file=FILE Print major:minor of device containing this file
  -x --export                 Export key/value pairs
  -P --export-prefix          Export the key name with a prefix
  -e --export-db              Export the content of the udev database
  -c --cleanup-db             Clean up the udev database

Ejemplo de utilidad udevadm

A continuación se muestran algunos ejemplos. Para consultar la base de datos Udev para la ruta del dispositivo de /dev/xvdd:

# udevadm info --query=path --name=/dev/xvdd 
/devices/vbd-5696/block/xvdd

Para consultar la base de datos de Udev para obtener toda la información del dispositivo para /dev/xvda:

# udevadm info --query=all --name=/dev/xvda
P: /devices/vbd-768/block/xvda
N: xvda
E: DEVNAME=/dev/xvda
E: DEVPATH=/devices/vbd-768/block/xvda
E: DEVTYPE=disk
E: DM_MULTIPATH_TIMESTAMP=1524287355
E: ID_PART_TABLE_TYPE=dos
E: MAJOR=202
E: MINOR=0
E: MPATH_SBIN_PATH=/sbin
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=476119

Ingrese lo siguiente para imprimir todas las propiedades sysfs de /dev/xvda. Estas propiedades se pueden usar en las reglas de Udev para que coincidan con el dispositivo. Imprime todos los dispositivos a lo largo de la cadena, hasta la raíz de sysfs.

# udevadm info --attribute-walk --name=/dev/xvda

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/vbd-768/block/xvda':
    KERNEL=="xvda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="41943040"
    ATTR{stat}=="   16775        4   686095    36372     2953      313   203104    42044        0    19603    78392"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{ext_range}=="16"
    ATTR{alignment_offset}=="0"
    ATTR{badblocks}==""
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="0"
    ATTR{capability}=="10"

  looking at parent device '/devices/vbd-768':
    KERNELS=="vbd-768"
    SUBSYSTEMS=="xen"
    DRIVERS=="vbd"
    ATTRS{devtype}=="vbd"
    ATTRS{nodename}=="device/vbd/768"

Creación de un enlace simbólico a un nodo de dispositivo

El orden en que se evalúan las reglas es importante. Al crear sus propias reglas, desea que estas se evalúen antes que las predeterminadas. Debido a que las reglas se procesan en orden léxico, cree un archivo de reglas con un nombre de archivo como /etc/udev/rules.d/10-local.rules para que se procese primero.

La siguiente regla crea el enlace simbólico /dev/my_disk al nodo del dispositivo /dev/xvdd. Puede crear una regla de Udev para cambiar el nombre de una interfaz de red, pero Udev no puede cambiar el nombre de un nodo de dispositivo. Solo se pueden crear enlaces simbólicos adicionales para nodos de dispositivos.

KERNEL=="xvdd", SUBSYSTEM=="block", SYMLINK="my_disk"

Ejecute el activador udevadm para procesar los archivos de reglas:

# udevadm trigger

El enlace simbólico ya existe.

# ls –l /dev/my*
lrwxrwxrwx. ... /dev/my_disk -> xvdd

Elimine el archivo 10-local.rules y ejecute udevadm trigger para eliminar el enlace simbólico.


Cent OS
  1. Guía para principiantes de rutas múltiples de Device Mapper (DM)

  2. Guía para principiantes sobre la configuración del módulo kernel en Linux

  3. Guía para principiantes sobre la gestión del espacio de intercambio en Linux

  4. Cómo solucionar problemas de rendimiento en Linux – Guía para principiantes

  5. Guía para principiantes de SELinux

Permisos de Linux 101

Una guía para principiantes sobre los permisos de Linux

Una guía para principiantes de LVM

Guía completa para principiantes para rootear Samsung Galaxy S2 en Ubuntu Linux

Restablecer contraseña raíz en Linux

Una guía para principiantes sobre los trabajos de Cron