Cum să utilizați Udev pentru detectarea și gestionarea dispozitivelor în Linux


Udev (spațiu utilizator /dev) este un subsistem Linux pentru detectarea și gestionarea dinamică a dispozitivelor, începând cu versiunea de kernel 2.6. Este un înlocuitor al devfs și al hotplug.

Acesta creează sau elimină în mod dinamic noduri de dispozitiv (o interfață cu un driver de dispozitiv care apare într-un sistem de fișiere ca și cum ar fi un fișier obișnuit, stocat în directorul /dev) la momentul pornirii sau dacă adăugați un dispozitiv la sau eliminați un dispozitiv din sistem. Apoi transmite informații despre un dispozitiv sau schimbă starea acestuia în spațiul utilizatorului.

Funcția sa este de a 1) furniza aplicațiilor de sistem evenimente de dispozitiv, 2) de a gestiona permisiunile nodurilor dispozitivului și 3) poate crea legături simbolice utile în directorul /dev pentru accesarea dispozitivelor sau chiar redenumește interfețele de rețea .

Unul dintre avantajele udev este că poate folosi nume persistente de dispozitive pentru a garanta denumirea consecventă a dispozitivelor în timpul repornirilor, în ciuda ordinii de descoperire a acestora. Această caracteristică este utilă deoarece nucleul atribuie pur și simplu nume de dispozitiv imprevizibile în funcție de ordinea descoperirii.

În acest articol, vom afla cum să folosim Udev pentru detectarea și gestionarea dispozitivelor pe sistemele Linux. Rețineți că majoritatea, dacă nu toate distribuțiile moderne de Linux, vin cu Udev ca parte a instalării implicite.

Aflați elementele de bază ale Udev în Linux

Daemonul udev, systemd-udevd (sau systemd-udevd.service) comunică cu nucleul și primește uevenimente ale dispozitivului > direct din acesta de fiecare dată când adăugați sau eliminați un dispozitiv din sistem sau un dispozitiv își schimbă starea.

Udev se bazează pe reguli – regulile sale sunt flexibile și foarte puternice. Fiecare eveniment primit de pe dispozitiv este comparat cu setul de reguli citite din fișierele aflate în /lib/udev/rules.d și /run/udev/rules.d.

Puteți scrie fișiere cu reguli personalizate în directorul /etc/udev/rules.d/ (fișierele ar trebui să se termine cu extensia .rules) pentru a procesa un dispozitiv. Rețineți că fișierele cu reguli din acest director au cea mai mare prioritate.

Pentru a crea un fișier nod dispozitiv, udev trebuie să identifice un dispozitiv utilizând anumite atribute, cum ar fi eticheta, numărul de serie, numărul principal și minor utilizat, numărul dispozitivului de magistrală etc. mult mai mult. Aceste informații sunt exportate de sistemul de fișiere sysfs.

Ori de câte ori conectați un dispozitiv la sistem, nucleul îl detectează și inițializează, iar un director cu numele dispozitivului este creat în directorul /sys/ care stochează atributele dispozitivului.

Fișierul principal de configurare pentru udev este /etc/udev/udev.conf, iar pentru a controla comportamentul de rulare a demonului udev, puteți utiliza utilitarul udevadm.

Pentru a afișa evenimentele de kernel (uevents) și evenimente udev (pe care udev le trimite după procesarea regulilor), rulați udevadm > cu comanda monitor. Apoi conectați un dispozitiv la sistemul dvs. și urmăriți, de la terminal, cum este gestionat evenimentul dispozitivului.

Următoarea captură de ecran arată un extras dintr-un eveniment ADD după conectarea unui disc flash USB la sistemul de testare:

udevadm monitor 

Pentru a găsi numele atribuit discului USB, utilizați utilitarul lsblk care citește sistemul de fișiere sysfs și udev db pentru a aduna informații despre dispozitivele procesate.

 
lsblk

Din rezultatul comenzii anterioare, discul USB este numit sdb1 (calea absolută ar trebui să fie /dev/sdb1). Pentru a interoga atributele dispozitivului din baza de date udev, utilizați comanda info.

udevadm info /dev/sdb1

Cum să lucrați cu regulile Udev în Linux

În această secțiune, vom discuta pe scurt cum să scrieți regulile udev. O regulă constă dintr-o listă, separată prin virgulă, de una sau mai multe perechi cheie-valoare. Regulile vă permit să redenumiți un nod de dispozitiv din numele implicit, să modificați permisiunile și dreptul de proprietate asupra unui nod dispozitiv, să declanșați execuția unui program sau script atunci când un nod dispozitiv este creat sau șters, printre altele.

Vom scrie o regulă simplă pentru a lansa un script atunci când este adăugat un dispozitiv USB și când este eliminat din sistemul care rulează.

Să începem prin a crea cele două scripturi:

sudo vim /bin/device_added.sh

Adăugați următoarele linii în scriptul device_added.sh.

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

Deschide al doilea script.

sudo vim /bin/device_removed.sh

Apoi adăugați următoarele linii în scriptul device_removed.sh.

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

Salvați fișierele, închideți și faceți executabile ambele scripturi.

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

Apoi, să creăm o regulă pentru a declanșa execuția scripturilor de mai sus, numită /etc/udev/rules.d/80-test.rules.

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

Adăugați aceste două reguli următoare în el.

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"

Unde :

  • "=": este un operator de comparat pentru egalitate.
  • "+=": este un operator pentru a adăuga valoarea unei chei care deține o listă de intrări.
  • SUBSISTEM: se potrivește cu subsistemul dispozitivului pentru evenimente.
  • ACȚIUNE: se potrivește cu numele acțiunii evenimentului.
  • ENV{DEVTYPE}: se potrivește cu o valoare a proprietății dispozitivului, tipul de dispozitiv în acest caz.
  • RUN: specifică un program sau un script de executat ca parte a gestionării evenimentelor.

Salvați fișierul și închideți-l. Apoi, ca root, spuneți systemd-udevd să reîncarce fișierele de reguli (acest lucru reîncarcă și alte baze de date, cum ar fi indexul modulului kernel), rulând.

sudo udevadm control --reload

Acum conectați o unitate USB la aparat și verificați dacă scriptul device_added.sh a fost executat. În primul rând, fișierul scripts.log ar trebui creat sub /tmp.

ls -l /tmp/scripts.log

Apoi, fișierul ar trebui să aibă o intrare precum „Dispozitiv USB eliminat la date_time ”, așa cum se arată în captura de ecran.

cat /tmp/scripts.log

Pentru mai multe informații despre cum să scrieți regulile udev și cum să gestionați udev, consultați intrările manuale udev și, respectiv, udevadm, rulând:

man udev
man udevadm
rezumat

Udev este un manager de dispozitiv remarcabil, care oferă o modalitate dinamică de a configura nodurile de dispozitiv în directorul /dev. Se asigură că dispozitivele sunt configurate imediat ce sunt conectate și descoperite. Se propagă informații despre un dispozitiv procesat sau modificări ale stării acestuia, în spațiul utilizatorului.

Dacă aveți întrebări sau gânduri de împărtășit cu privire la acest subiect, utilizați formularul de feedback.