Com utilitzar Udev per a la detecció i gestió de dispositius a Linux


Udev (espai d'usuari /dev) és un subsistema Linux per a la detecció i la gestió dinàmiques de dispositius, des de la versió 2.6 del nucli. És un reemplaçament de devfs i hotplug.

Crea o elimina de forma dinàmica nodes de dispositiu (una interfície per a un controlador de dispositiu que apareix en un sistema de fitxers com si fos un fitxer normal, emmagatzemat al directori /dev) en el moment de l'arrencada o si afegiu un dispositiu o en suprimiu un. el sistema. A continuació, propaga informació sobre un dispositiu o canvia el seu estat a l'espai de l'usuari.

La seva funció és 1) proporcionar a les aplicacions del sistema esdeveniments del dispositiu, 2) gestionar els permisos dels nodes del dispositiu i 3) crear enllaços simbòlics útils al directori /dev per accedir als dispositius, o fins i tot canviar el nom de les interfícies de xarxa.

Un dels avantatges d'udev és que pot utilitzar noms de dispositius persistents per garantir una denominació coherent dels dispositius durant els reinicis, malgrat el seu ordre de descobriment. Aquesta característica és útil perquè el nucli simplement assigna noms de dispositius impredictibles en funció de l'ordre de descobriment.

En aquest article, aprendrem a utilitzar Udev per a la detecció i gestió de dispositius en sistemes Linux. Tingueu en compte que la majoria, si no totes, les distribucions de Linux modernes principals vénen amb Udev com a part de la instal·lació predeterminada.

Aprèn els conceptes bàsics d'Udev a Linux

El dimoni udev, systemd-udevd (o systemd-udevd.service) es comunica amb el nucli i rep els uevents del dispositiu directament d'ell cada vegada que afegiu o elimineu un dispositiu del sistema, o un dispositiu canvia el seu estat.

Udev es basa en regles: les seves regles són flexibles i molt potents. Cada esdeveniment de dispositiu rebut es compara amb el conjunt de regles llegides dels fitxers situats a /lib/udev/rules.d i /run/udev/rules.d.

Podeu escriure fitxers de regles personalitzades al directori /etc/udev/rules.d/ (els fitxers haurien d'acabar amb l'extensió .rules) per processar un dispositiu. Tingueu en compte que els fitxers de regles d'aquest directori tenen la prioritat més alta.

Per crear un fitxer de node de dispositiu, udev ha d'identificar un dispositiu mitjançant determinats atributs, com ara l'etiqueta, el número de sèrie, el seu número principal i secundari utilitzat, el número de dispositiu de bus i molt més. Aquesta informació l'exporta el sistema de fitxers sysfs.

Sempre que connecteu un dispositiu al sistema, el nucli el detecta i inicialitza, i es crea un directori amb el nom del dispositiu al directori /sys/ que emmagatzema els atributs del dispositiu.

El fitxer de configuració principal per a udev és /etc/udev/udev.conf, i per controlar el comportament en temps d'execució del dimoni udev, podeu utilitzar la utilitat udevadm.

Per mostrar els esdeveniments del nucli rebuts (uevents) i els esdeveniments udev (que udev envia després del processament de la regla), executeu udevadm amb l'ordre monitor. A continuació, connecteu un dispositiu al vostre sistema i observeu, des del terminal, com es gestiona l'esdeveniment del dispositiu.

La captura de pantalla següent mostra un extracte d'un esdeveniment ADD després de connectar un disc flash USB al sistema de prova:

$ udevadm monitor 

Per trobar el nom assignat al vostre disc USB, utilitzeu la utilitat lsblk que llegeix el sistema de fitxers sysfs i udev db per recopilar informació sobre els dispositius processats.

 
$ lsblk

A partir de la sortida de l'ordre anterior, el disc USB s'anomena sdb1 (la ruta absoluta hauria de ser /dev/sdb1). Per consultar els atributs del dispositiu des de la base de dades udev, utilitzeu l'ordre info.

$ udevadm info /dev/sdb1

Com treballar amb regles Udev a Linux

En aquesta secció, parlarem breument de com escriure regles udev. Una regla consta d'una llista separada per comes d'un o més parells clau-valor. Les regles us permeten canviar el nom d'un node de dispositiu des del nom predeterminat, modificar els permisos i la propietat d'un node de dispositiu, activar l'execució d'un programa o script quan es crea o s'elimina un node de dispositiu, entre d'altres.

Escriurem una regla senzilla per llançar un script quan s'afegeix un dispositiu USB i quan s'elimina del sistema en execució.

Comencem creant els dos scripts:

$ sudo vim /bin/device_added.sh

Afegiu les línies següents a l'script device_added.sh.

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

Obriu el segon script.

$ sudo vim /bin/device_removed.sh

A continuació, afegiu les línies següents a l'script device_removed.sh.

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

Deseu els fitxers, tanqueu i feu que els dos scripts siguin executables.

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

A continuació, creem una regla per activar l'execució dels scripts anteriors, anomenada /etc/udev/rules.d/80-test.rules.

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

Afegiu-hi aquestes dues regles següents.

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"

on:

  • ==\: és un operador per comparar per igualtat.
  • \+=\: és un operador per afegir el valor a una clau que conté una llista d'entrades.
  • SUBSYSTEM: coincideix amb el subsistema del dispositiu d'esdeveniment.
  • ACCIÓ: coincideix amb el nom de l'acció de l'esdeveniment.
  • ENV{DEVTYPE}: coincideix amb un valor de propietat del dispositiu, tipus de dispositiu en aquest cas.
  • RUN: especifica un programa o script per executar com a part de la gestió d'esdeveniments.

Deseu el fitxer i tanqueu-lo. A continuació, com a root, digueu a systemd-udevd que torni a carregar els fitxers de regles (això també torna a carregar altres bases de dades, com ara l'índex del mòdul del nucli), executant-lo.

$ sudo udevadm control --reload

Ara connecteu una unitat USB a la vostra màquina i comproveu si l'script device_added.sh s'ha executat. En primer lloc, el fitxer scripts.log s'ha de crear a /tmp.

$ ls -l /tmp/scripts.log

Aleshores, el fitxer hauria de tenir una entrada com ara \Dispositiu USB eliminat a la data_hora, tal com es mostra a la captura de pantalla.

$ cat /tmp/scripts.log

Per obtenir més informació sobre com escriure regles udev i gestionar udev, consulteu les entrades manuals udev i udevadm respectivament, executant:

$ man udev
$ man udevadm

Udev és un gestor de dispositius notable que proporciona una manera dinàmica de configurar els nodes de dispositiu al directori /dev. Assegura que els dispositius es configuren tan bon punt es connecten i es descobreixen. Propaga informació sobre un dispositiu processat o canvis en el seu estat, a l'espai de l'usuari.

Si teniu alguna pregunta o reflexió per compartir sobre aquest tema, utilitzeu el formulari de comentaris.