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.