Sådan bruges Udev til detektion og styring af enheder i Linux


Udev (userpace/dev) er et Linux-undersystem til detektion og styring af dynamisk enhed, da kerneversion 2.6. Det er en erstatning for devfs og hotplug.

Det opretter eller fjerner enhedsnoder dynamisk (en grænseflade til en enhedsdriver, der vises i et filsystem, som om det var en almindelig fil, der er gemt under/dev-biblioteket) ved opstartstidspunktet, eller hvis du tilføjer en enhed til eller fjerner en enhed fra systemet. Derefter udbredes oplysninger om en enhed eller ændres til dens tilstand til brugerrummet.

Funktionen er at 1) forsyne systemapplikationerne med enhedsbegivenheder, 2) administrere tilladelser til enhedsknudepunkter og 3) kan oprette nyttige symlinks i/dev-biblioteket til at få adgang til enheder eller endda omdøbe netværksgrænseflader.

En af fordelene ved udev er, at den kan bruge vedvarende enhedsnavne for at garantere ensartet navngivning af enheder på tværs af genstart, på trods af deres rækkefølge for opdagelse. Denne funktion er nyttig, fordi kernen simpelthen tildeler uforudsigelige enhedsnavne baseret på rækkefølgen af opdagelsen.

I denne artikel lærer vi, hvordan du bruger Udev til detektion og styring af enheder på Linux-systemer. Bemærk, at de fleste, hvis ikke alle almindelige moderne Linux-distributioner kommer med Udev som en del af standardinstallationen.

Lær grundlæggende om Udev i Linux

Udev-dæmonen, systemd-udevd (eller systemd-udevd.service) kommunikerer med kernen og modtager enhedens begivenheder direkte fra den, hver gang du tilføjer eller fjerner en enhed fra systemet, eller en enhed ændrer dens tilstand.

Udev er baseret på regler - reglerne er fleksible og meget kraftfulde. Hver modtaget enhedshændelse matches med det sæt regler, der læses fra filer, der findes i /lib/udev/rules.d og /run/udev/rules.d.

Du kan skrive brugerdefinerede reglerfiler i /etc/udev/rules.d/ -mappen (filer skal ende med .rules -udvidelsen) for at behandle en enhed. Bemærk, at reglerfiler i denne mappe har højeste prioritet.

For at oprette en enhedsnodefil skal udev identificere en enhed ved hjælp af bestemte attributter, såsom etiketten, serienummeret, dets anvendte hoved- og mindre nummer, busenhedsnummer og så meget mere. Disse oplysninger eksporteres af sysfs filsystemet.

Hver gang du forbinder en enhed til systemet, registrerer og initialiserer kernen den, og der oprettes en mappe med enhedsnavnet under/sys/directory, der gemmer enhedens attributter.

Hovedkonfigurationsfilen for udev er /etc/udev/udev.conf, og for at kontrollere runtime-opførelsen af udev-dæmonen kan du bruge udevadm-værktøjet.

For at få vist modtagne kernehændelser (uevents) og udev events (som udev sender ud efter regelbehandling) skal du køre udevadm med skærmkommandoen. Tilslut derefter en enhed til dit system og se fra terminalen, hvordan enhedshændelsen håndteres.

Følgende skærmbillede viser et uddrag af en ADD-begivenhed efter tilslutning af en USB-flashdisk til testsystemet:

$ udevadm monitor 

For at finde det navn, der er tildelt din USB-disk, skal du bruge lsblk-værktøjet, der læser sysfs-filsystemet og udev db til at indsamle oplysninger om behandlede enheder.

 
$ lsblk

Fra output fra den forrige kommando hedder USB-disken sdb1 (absolut sti skal være /dev/sdb1 ). For at forespørge enhedens attributter fra udev-databasen skal du bruge kommandoen info.

$ udevadm info /dev/sdb1

Sådan arbejder du med Udev-regler i Linux

I dette afsnit vil vi kort diskutere, hvordan man skriver udev-regler. En regel består af en komma-adskilt liste med et eller flere nøgleværdipar. Regler giver dig mulighed for at omdøbe en enhedsknude fra standardnavnet, ændre tilladelser og ejerskab af en enhedsknude, udløse udførelse af et program eller script, når en enhedsknude oprettes eller slettes, blandt andre.

Vi skriver en simpel regel for at starte et script, når en USB-enhed tilføjes, og når den fjernes fra det kørende system.

Lad os starte med at oprette de to scripts:

$ sudo vim /bin/device_added.sh

Tilføj følgende linjer i device_added.sh scriptet.

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

Åbn det andet script.

$ sudo vim /bin/device_removed.sh

Føj derefter følgende linjer til device_removed.sh script.

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

Gem filerne, luk og gør begge scripts eksekverbare.

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

Lad os derefter oprette en regel, der udløser eksekvering af ovenstående scripts, kaldet /etc/udev/rules.d/80-test.rules.

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

Tilføj disse to følgende regler i den.

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"

hvor:

  • "==" : er en operatør, der skal sammenlignes for ligestilling.
  • "+ =" : er en operatør, der føjer værdien til en nøgle, der indeholder en liste over poster.
  • SUBSYSTEM: matcher delsystemet til begivenhedsenheden.
  • HANDLING: matcher navnet på begivenhedshandlingen.
  • ENV {DEVTYPE}: matcher en enhedsegenskabsværdi, enhedstype i dette tilfælde.
  • KØR: specificerer et program eller script, der skal udføres som en del af begivenhedshåndteringen.

Gem filen, og luk den. Derefter, som root, skal du fortælle systemd-udevd at genindlæse reglerne filer (dette genindlæser også andre databaser såsom kernemodulindekset) ved at køre.

$ sudo udevadm control --reload

Tilslut nu et USB-drev til din maskine, og kontroller, om scriptet device_added.sh blev udført. Først og fremmest skal filen scripts.log oprettes under/tmp.

$ ls -l /tmp/scripts.log

Derefter skal filen have en post som "USB-enhed fjernet på dato_tid", som vist på skærmbilledet.

$ cat /tmp/scripts.log

For mere information om, hvordan man skriver udev-regler og administrerer udev, se henholdsvis udev- og udevadm-manuelle poster ved at køre:

$ man udev
$ man udevadm

Udev er en bemærkelsesværdig enhedsadministrator, der giver en dynamisk måde at opsætte enhedsknudepunkter i /dev -mappen. Det sikrer, at enheder konfigureres, så snart de er tilsluttet og opdaget. Den udbreder information om en behandlet enhed eller ændres til dens tilstand til brugerpladsen.

Hvis du har spørgsmål eller tanker at dele om dette emne, skal du bruge feedbackformularen.