Ricerca nel sito web

Come utilizzare Udev per il rilevamento e la gestione dei dispositivi in Linux


Udev (spazio utente /dev) è un sottosistema Linux per il rilevamento e la gestione dinamica dei dispositivi, a partire dalla versione del kernel 2.6. È un sostituto di devfs e hotplug.

Crea o rimuove dinamicamente i nodi del dispositivo (un'interfaccia per un driver di dispositivo che appare in un file system come se fosse un file normale, archiviato nella directory /dev) all'avvio o se aggiungi un dispositivo o rimuovere un dispositivo dal sistema. Quindi propaga le informazioni su un dispositivo o le modifiche al suo stato nello spazio utente.

La sua funzione è 1) fornire alle applicazioni di sistema gli eventi del dispositivo, 2) gestire i permessi dei nodi del dispositivo e 3) può creare utili collegamenti simbolici nella directory /dev per accedere ai dispositivi o persino rinominare le interfacce di rete .

Uno dei vantaggi di udev è che può utilizzare nomi di dispositivi persistenti per garantire una denominazione coerente dei dispositivi durante i riavvii, nonostante il loro ordine di rilevamento. Questa funzionalità è utile perché il kernel assegna semplicemente nomi di dispositivo imprevedibili in base all'ordine di rilevamento.

In questo articolo impareremo come utilizzare Udev per il rilevamento e la gestione dei dispositivi su sistemi Linux. Tieni presente che la maggior parte, se non tutte, le principali distribuzioni Linux moderne vengono fornite con Udev come parte dell'installazione predefinita.

Impara le basi di Udev in Linux

Il demone udev, systemd-udevd (o systemd-udevd.service) comunica con il kernel e riceve gli uevents del dispositivo > direttamente da esso ogni volta che aggiungi o rimuovi un dispositivo dal sistema o un dispositivo cambia il suo stato.

Udev si basa su regole: le sue regole sono flessibili e molto potenti. Ogni evento del dispositivo ricevuto viene confrontato con l'insieme di regole lette dai file situati in /lib/udev/rules.d e /run/udev/rules.d.

Puoi scrivere file di regole personalizzate nella directory /etc/udev/rules.d/ (i file dovrebbero terminare con l'estensione .rules) per elaborare un dispositivo. Tieni presente che i file delle regole in questa directory hanno la priorità più alta.

Per creare un file del nodo del dispositivo, udev deve identificare un dispositivo utilizzando determinati attributi come l'etichetta, il numero di serie, il numero maggiore e minore utilizzato, il numero del dispositivo bus e così via molto di piu. Queste informazioni vengono esportate dal file system sysfs.

Ogni volta che si collega un dispositivo al sistema, il kernel lo rileva e lo inizializza e viene creata una directory con il nome del dispositivo nella directory /sys/ che memorizza gli attributi del dispositivo.

Il file di configurazione principale per udev è /etc/udev/udev.conf e per controllare il comportamento di runtime del demone udev è possibile utilizzare l'utility udevadm.

Per visualizzare gli eventi del kernel ricevuti (uevents) e gli eventi udev (che udev invia dopo l'elaborazione delle regole), eseguire udevadm con il comando monitor. Collega quindi un dispositivo al tuo sistema e osserva, dal terminale, come viene gestito l'evento del dispositivo.

La schermata seguente mostra un estratto di un evento ADD dopo aver collegato un disco flash USB al sistema di test:

udevadm monitor 

Per trovare il nome assegnato al tuo disco USB, utilizza l'utility lsblk che legge il filesystem sysfs e udev db per raccogliere informazioni sui dispositivi elaborati.

 
lsblk

Dall'output del comando precedente, il disco USB è denominato sdb1 (il percorso assoluto dovrebbe essere /dev/sdb1). Per interrogare gli attributi del dispositivo dal database udev, utilizzare il comando info.

udevadm info /dev/sdb1

Come lavorare con le regole Udev in Linux

In questa sezione discuteremo brevemente come scrivere le regole udev. Una regola è composta da un elenco separato da virgole di una o più coppie chiave-valore. Le regole consentono di rinominare un nodo dispositivo dal nome predefinito, modificare le autorizzazioni e la proprietà di un nodo dispositivo, attivare l'esecuzione di un programma o script quando un nodo dispositivo viene creato o eliminato, tra le altre cose.

Scriveremo una semplice regola per avviare uno script quando viene aggiunto un dispositivo USB e quando viene rimosso dal sistema in esecuzione.

Iniziamo creando i due script:

sudo vim /bin/device_added.sh

Aggiungi le seguenti righe nello script device_added.sh.

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

Apri il secondo script.

sudo vim /bin/device_removed.sh

Quindi aggiungi le seguenti righe allo script device_removed.sh.

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

Salvare i file, chiudere e rendere eseguibili entrambi gli script.

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

Successivamente, creiamo una regola per attivare l'esecuzione degli script precedenti, chiamata /etc/udev/rules.d/80-test.rules.

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

Aggiungi queste due seguenti regole al suo interno.

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"

Dove :

  • "==": è un operatore da confrontare per l'uguaglianza.
  • "+=": è un operatore per aggiungere il valore a una chiave che contiene un elenco di voci.
  • SOTTOSISTEMA: corrisponde al sottosistema del dispositivo dell'evento.
  • AZIONE: corrisponde al nome dell'azione dell'evento.
  • ENV{DEVTYPE}: corrisponde al valore di una proprietà del dispositivo, in questo caso il tipo di dispositivo.
  • RUN: specifica un programma o uno script da eseguire come parte della gestione dell'evento.

Salva il file e chiudilo. Quindi, come root, di' a systemd-udevd di ricaricare i file delle regole (questo ricarica anche altri database come l'indice dei moduli del kernel), eseguendo.

sudo udevadm control --reload

Ora collega un'unità USB al tuo computer e controlla se lo script device_added.sh è stato eseguito. Innanzitutto occorre creare il file scripts.log in /tmp.

ls -l /tmp/scripts.log

Quindi il file dovrebbe avere una voce come "Dispositivo USB rimosso alle date_ora", come mostrato nello screenshot.

cat /tmp/scripts.log

Per ulteriori informazioni su come scrivere le regole udev e gestire udev, consultare rispettivamente le voci del manuale udev e udevadm, eseguendo:

man udev
man udevadm
Riepilogo

Udev è un notevole gestore di dispositivi che fornisce un modo dinamico di impostare i nodi del dispositivo nella directory /dev. Garantisce che i dispositivi vengano configurati non appena vengono collegati e rilevati. Propaga le informazioni su un dispositivo elaborato o le modifiche al suo stato, nello spazio utente.

Se hai domande o pensieri da condividere su questo argomento, utilizza il modulo di feedback.