Slik bruker du Udev for enhetsdeteksjon og -administrasjon i Linux


Udev (brukerområde /dev) er et Linux-undersystem for dynamisk enhetsdeteksjon og -administrasjon, siden kjerneversjon 2.6. Det er en erstatning for devfs og hotplug.

Den oppretter eller fjerner enhetsnoder dynamisk (et grensesnitt til en enhetsdriver som vises i et filsystem som om det var en vanlig fil, lagret under /dev-katalogen) ved oppstart eller hvis du legger til en enhet til eller fjerner en enhet fra systemet. Den formidler deretter informasjon om en enhet eller endringer i dens tilstand til brukerområdet.

Dens funksjon er å 1) forsyne systemapplikasjonene med enhetshendelser, 2) administrere tillatelser for enhetsnoder, og 3) kan lage nyttige symbolkoblinger i /dev-katalogen for å få tilgang til enheter, eller til og med gi nytt navn til nettverksgrensesnitt.

En av fordelene med udev er at den kan bruke vedvarende enhetsnavn for å garantere konsistente navn på enheter på tvers av omstarter, til tross for oppdagelsesrekkefølgen. Denne funksjonen er nyttig fordi kjernen ganske enkelt tildeler uforutsigbare enhetsnavn basert på oppdagelsesrekkefølgen.

I denne artikkelen vil vi lære hvordan du bruker Udev for enhetsdeteksjon og -administrasjon på Linux-systemer. Merk at de fleste om ikke alle vanlige moderne Linux-distribusjoner kommer med Udev som en del av standardinstallasjonen.

Lær det grunnleggende om Udev i Linux

Udev-demonen, systemd-udevd (eller systemd-udevd.service) kommuniserer med kjernen og mottar enhetshendelser direkte fra den hver gang du legger til eller fjerner en enhet fra systemet, eller en enhet endrer status.

Udev er basert på regler – reglene er fleksible og veldig kraftige. Hver mottatt enhetshendelse matches mot settet med regler som leses fra filer som ligger i /lib/udev/rules.d og /run/udev/rules.d.

Du kan skrive egendefinerte regelfiler i katalogen /etc/udev/rules.d/ (filene skal slutte med utvidelsen .rules) for å behandle en enhet. Merk at regelfiler i denne katalogen har høyeste prioritet.

For å lage en enhetsnodefil, må udev identifisere en enhet ved hjelp av visse attributter som etiketten, serienummeret, hoved- og undernummeret som brukes, bussenhetsnummer og mye mer. Denne informasjonen eksporteres av sysfs-filsystemet.

Hver gang du kobler en enhet til systemet, oppdager og initialiserer kjernen den, og en katalog med enhetsnavnet opprettes under /sys/-katalogen som lagrer enhetsattributtene.

Hovedkonfigurasjonsfilen for udev er /etc/udev/udev.conf, og for å kontrollere kjøretidsatferden for udev-daemonen, kan du bruke udevadm-verktøyet.

For å vise mottatte kjernehendelser (uevents) og udev-hendelser (som udev sender ut etter regelbehandling), kjør udevadm med monitor-kommandoen. Koble deretter en enhet til systemet ditt og se, fra terminalen, hvordan enhetshendelsen håndteres.

Følgende skjermbilde viser et utdrag av en ADD-hendelse etter tilkobling av en USB-flashdisk til testsystemet:

$ udevadm monitor 

For å finne navnet som er tildelt USB-disken din, bruk lsblk-verktøyet som leser sysfs-filsystemet og udev db for å samle informasjon om behandlede enheter.

 
$ lsblk

Fra utdataene fra den forrige kommandoen heter USB-disken sdb1 (absolutt bane bør være /dev/sdb1). For å spørre enhetsattributtene fra udev-databasen, bruk info-kommandoen.

$ udevadm info /dev/sdb1

Hvordan jobbe med Udev-regler i Linux

I denne delen vil vi kort diskutere hvordan du skriver udev-regler. En regel består av en kommadelt liste med ett eller flere nøkkelverdi-par. Regler lar deg gi nytt navn til en enhetsnode fra standardnavnet, endre tillatelser og eierskap til en enhetsnode, utløse kjøring av et program eller skript når en enhetsnode opprettes eller slettes, blant annet.

Vi vil skrive en enkel regel for å starte et skript når en USB-enhet legges til og når den fjernes fra det kjørende systemet.

La oss starte med å lage de to skriptene:

$ sudo vim /bin/device_added.sh

Legg til følgende linjer i device_added.sh-skriptet.

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

Åpne det andre skriptet.

$ sudo vim /bin/device_removed.sh

Legg deretter til følgende linjer i skriptet device_removed.sh.

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

Lagre filene, lukk og gjør begge skriptene kjørbare.

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

La oss deretter lage en regel for å utløse kjøring av skriptene ovenfor, kalt /etc/udev/rules.d/80-test.rules.

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

Legg til disse to følgende reglene 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 for å sammenligne for likhet.
  • \+=\: er en operatør for å legge til verdien til en nøkkel som inneholder en liste over oppføringer.
  • SUBSYSTEM: samsvarer med undersystemet til hendelsesenheten.
  • HANDLING: samsvarer med navnet på hendelseshandlingen.
  • ENV{DEVTYPE}: samsvarer med en enhetsegenskapsverdi, enhetstype i dette tilfellet.
  • RUN: spesifiserer et program eller skript som skal kjøres som en del av hendelseshåndteringen.

Lagre filen og lukk den. Deretter som root, be systemd-udevd om å laste inn regelfilene på nytt (dette laster også inn andre databaser på nytt, for eksempel kjernemodulindeksen), ved å kjøre.

$ sudo udevadm control --reload

Koble nå en USB-stasjon til maskinen din og sjekk om device_added.sh-skriptet ble utført. Først av alt bør filen scripts.log opprettes under /tmp.

$ ls -l /tmp/scripts.log

Da skal filen ha en oppføring som \USB-enhet fjernet ved dato_klokkeslett, som vist på skjermbildet.

$ cat /tmp/scripts.log

For mer informasjon om hvordan du skriver udev-regler og administrerer udev, se henholdsvis udev og udevadm manuelle oppføringer ved å kjøre:

$ man udev
$ man udevadm

Udev er en bemerkelsesverdig enhetsbehandler som gir en dynamisk måte å sette opp enhetsnoder i /dev-katalogen. Det sikrer at enheter konfigureres så snart de er koblet til og oppdaget. Den sprer informasjon om en behandlet enhet eller endringer i dens tilstand, til brukerområdet.

Hvis du har spørsmål eller tanker å dele om dette emnet, bruk tilbakemeldingsskjemaet.