Udev è il gestore dispositivi per il kernel Linux. Udev crea o rimuove dinamicamente i file dei nodi del dispositivo all'avvio nella directory /dev per tutti i tipi di dispositivi. Udev ora fa parte di systemd, come puoi vedere visualizzando i nomi dei file "udev" inclusi nel pacchetto RPM di systemd.
# rpm -ql systemd | grep udev /etc/udev /etc/udev/hwdb.bin /etc/udev/rules.d /etc/udev/udev.conf /usr/bin/udevadm ...
Il demone Udev, systemd-udevd , riceve gli eventi del dispositivo direttamente dal kernel ogni volta che un dispositivo viene aggiunto o rimosso dal sistema. Per ogni evento, systemd-udevd esegue le istruzioni corrispondenti specificate nelle regole Udev.
I nomi dei file del dispositivo possono cambiare quando i dischi vengono rimossi dal sistema a causa di un errore. Ad esempio, i dispositivi sono denominati /dev/sda, /dev/sdb e /dev/sdc all'avvio. Ma al prossimo riavvio, /dev/sdb fallisce e ciò che era precedentemente /dev/sdc viene chiamato /dev/sdb. Tutti i riferimenti di configurazione a /dev/sdb ora contengono contenuto originariamente referenziato da /dev/sdc.
La soluzione per evitare questo tipo di situazione è garantire nomi coerenti per i dispositivi tramite riavvii. Puoi configurare Udev per creare nomi persistenti e utilizzare questi nomi nella tabella di montaggio del file system, /etc/fstab, o come argomento per il comando di montaggio.
File e directory di regole Udev
Le regole Udev determinano come identificare i dispositivi e come assegnare un nome persistente tramite riavvii o modifiche del disco. Quando Udev riceve un evento del dispositivo, confronta le regole configurate con gli attributi del dispositivo in sysfs per identificare il dispositivo. Le regole possono anche specificare programmi aggiuntivi da eseguire come parte della gestione degli eventi del dispositivo.
I file delle regole Udev si trovano nelle seguenti directory:
- /lib/udev/rules.d/ – La directory delle regole predefinite
- /etc/udev/rules.d/ – La directory delle regole personalizzate. Queste regole hanno la precedenza.
I file delle regole devono avere nomi univoci. I file nella directory delle regole personalizzate sovrascrivono i file con lo stesso nome nella directory delle regole predefinite. I file delle regole vengono ordinati ed elaborati in ordine lessicale. Quello che segue è un elenco parziale dei file delle regole dalle directory delle regole predefinite e personalizzate:
# ls -l /lib/udev/rules.d/ total 348 -r--r--r--. 1 root root 7266 Aug 5 2017 10-dm.rules -r--r--r--. 1 root root 2454 Aug 5 2017 11-dm-lvm.rules -rw-r--r--. 1 root root 2865 Jan 25 16:05 11-dm-mpath.rules -r--r--r--. 1 root root 1499 Aug 5 2017 13-dm-disk.rules -rw-r--r--. 1 root root 553 Aug 6 2017 39-usbmuxd.rules -rw-r--r--. 1 root root 1622 Mar 7 13:27 40-redhat.rules ...
# ls -l /etc/udev/rules.d/ total 8 -rw-r--r--. 1 root root 709 Aug 4 2017 70-persistent-ipoib.rules -rw-r--r--. 1 root root 96 Apr 21 05:09 70-persistent-net.rules lrwxrwxrwx. 1 root root 9 Sep 29 2014 80-net-name-slot.rules -> /dev/null
Esempio di regole Udev
L'esempio seguente contiene voci selezionate da /lib/udev/rules.d/50-udev-default.rules file. Questo file di regole contiene oltre 60 voci.
# cat /lib/udev/rules.d/50-udev-default.rules # do not edit this file, it will be overwritten on update SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}" # select "system RTC" or just use the first one SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc" SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100" SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id" ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}" ACTION!="add", GOTO="default_permissions_end" SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620" ....
Le voci selezionate aiutano a descrivere la sintassi dei file delle regole.
1. I commenti iniziano con un segno #.
2. Ogni riga non commentata in un file di regole è costituita da un elenco di una o più coppie chiave-valore separate da una virgola. Esistono due tipi di chiavi:
- Chiavi di corrispondenza
- Chiavi di assegnazione
3. Se tutte le chiavi di corrispondenza corrispondono al rispettivo valore, la regola viene applicata e alle chiavi di assegnazione viene assegnato il valore specificato. Ogni tasto ha un'operazione distinta, a seconda dell'operatore. Gli operatori validi sono:
- == :confronta per l'uguaglianza
- != :confronta per la disuguaglianza
- = :Assegna un valore a una chiave
- += :aggiungi il valore ai valori correnti per la chiave
- := :Assegna il valore finale alla chiave. Non consentire eventuali modifiche successive da eventuali regole successive.
4. La corrispondenza dei modelli in stile shell (*, ?, []) è supportata anche nelle regole Udev.
Chiavi abbinamenti
I seguenti nomi di chiavi vengono utilizzati per la corrispondenza con le proprietà del dispositivo. Alcune delle chiavi corrispondono anche alle proprietà dei dispositivi padre in sysfs e non solo al dispositivo che ha generato l'evento. Se vengono specificate più chiavi in una singola regola, tutte queste chiavi devono corrispondere.
- AZIONE :corrisponde al nome dell'azione dell'evento.
- DEVPATH :abbina il percorso di sviluppo del dispositivo dell'evento.
- KERNEL :abbina il nome del dispositivo dell'evento.
- NOME :corrisponde al nome di un'interfaccia di rete. Può essere utilizzato se la chiave NAME è stata impostata in una delle regole precedenti.
- SYMLINK :corrisponde al nome del collegamento simbolico che ha come destinazione il nodo. Può essere utilizzato se è stata impostata una chiave SYMLINK in una delle regole precedenti. Possono esserci più collegamenti simbolici ma solo uno deve corrispondere.
- SOTTOSISTEMA :abbina il sottosistema del dispositivo dell'evento.
- TEST{maschera modalità ottale} :verifica l'esistenza di un file. È possibile specificare la maschera della modalità ottale.
Altre chiavi di corrispondenza includono DRIVER, ATTR{filename}, KERNELS, SUBSYSTEMS, DRIVERS, ATTRS{filename}, TAGS, ENV{key}, TAG, PROGRAM e RESULT.
Chiavi di assegnazione
Alle seguenti chiavi possono essere assegnati valori:
- NOME – Il nome da utilizzare per un'interfaccia di rete. Il nome di un nodo dispositivo non può essere modificato da Udev, possono essere creati solo collegamenti simbolici aggiuntivi.
- SYMLINK – Il nome del collegamento simbolico destinato al nodo
- PROPRIETARIO, GRUPPO, MODALITÀ – Le autorizzazioni per il nodo dispositivo
- OPZIONI – Opzioni di regole e dispositivi. L'opzione ignore_remove utilizzata nell'esempio significa "Non rimuovere il nodo del dispositivo quando il dispositivo si spegne".
Altre chiavi di assegnazione includono ATTR{key}, ENV{key}, TAG, RUN{type}, LABEL, GOTO, IMPORT{type}, WAIT_FOR e OPTIONS.
Sostituzioni di stringhe
I tasti NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE ed RUN supportano molte sostituzioni di stringhe tipo printf. Le sostituzioni utilizzate nell'esempio sono:
- %M – Il numero principale del kernel per il dispositivo
- %m – Il numero minore del kernel per il dispositivo
Sono supportate ulteriori sostituzioni di stringhe. Fare riferimento alla pagina man di udev per tutte le sostituzioni supportate e i dettagli su chiavi di corrispondenza aggiuntive, chiavi di assegnazione aggiuntive e regole aggiuntive e opzioni del dispositivo.
Utilità udevadm
L'utilità udevadm è uno strumento di gestione dello spazio utente per Udev. Tra le altre funzioni, puoi usare udevadm per interrogare sysfs e ottenere attributi del dispositivo per aiutare a creare regole Udev che corrispondono a un dispositivo. Per visualizzare l'utilizzo di udevadm:
# udevadm --help udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS] Send control commands or test the device manager. Commands: info Query sysfs or the udev database trigger Request events from the kernel settle Wait for pending udev events control Control the udev daemon monitor Listen to kernel and udev events test Test an event run test-builtin Test a built-in command
Puoi anche ottenere l'utilizzo per ciascuno dei comandi udevadm. Ad esempio, per ottenere assistenza sull'utilizzo del comando info:
# udevadm info --help udevadm info [OPTIONS] [DEVPATH|FILE] Query sysfs or the udev database. -h --help Print this message --version Print version of the program -q --query=TYPE Query device information: name Name of device node symlink Pointing to node path sysfs device path property The device properties all All values -p --path=SYSPATH sysfs device path used for query or attribute walk -n --name=NAME Node or symlink name used for query or attribute walk -r --root Prepend dev directory to path names -a --attribute-walk Print all key matches walking along the chain of parent devices -d --device-id-of-file=FILE Print major:minor of device containing this file -x --export Export key/value pairs -P --export-prefix Export the key name with a prefix -e --export-db Export the content of the udev database -c --cleanup-db Clean up the udev database
Esempio di utilità udevadm
Seguono alcuni esempi. Per interrogare il database Udev per il percorso del dispositivo di /dev/xvdd:
# udevadm info --query=path --name=/dev/xvdd /devices/vbd-5696/block/xvdd
Per interrogare il database Udev per tutte le informazioni sul dispositivo per /dev/xvda:
# udevadm info --query=all --name=/dev/xvda P: /devices/vbd-768/block/xvda N: xvda E: DEVNAME=/dev/xvda E: DEVPATH=/devices/vbd-768/block/xvda E: DEVTYPE=disk E: DM_MULTIPATH_TIMESTAMP=1524287355 E: ID_PART_TABLE_TYPE=dos E: MAJOR=202 E: MINOR=0 E: MPATH_SBIN_PATH=/sbin E: SUBSYSTEM=block E: TAGS=:systemd: E: USEC_INITIALIZED=476119
Immettere quanto segue per stampare tutte le proprietà sysfs di /dev/xvda. Queste proprietà possono essere utilizzate nelle regole Udev per abbinare il dispositivo. Stampa tutti i dispositivi lungo la catena, fino alla radice di sysfs.
# udevadm info --attribute-walk --name=/dev/xvda Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/vbd-768/block/xvda': KERNEL=="xvda" SUBSYSTEM=="block" DRIVER=="" ATTR{ro}=="0" ATTR{size}=="41943040" ATTR{stat}==" 16775 4 686095 36372 2953 313 203104 42044 0 19603 78392" ATTR{range}=="16" ATTR{discard_alignment}=="0" ATTR{ext_range}=="16" ATTR{alignment_offset}=="0" ATTR{badblocks}=="" ATTR{inflight}==" 0 0" ATTR{removable}=="0" ATTR{capability}=="10" looking at parent device '/devices/vbd-768': KERNELS=="vbd-768" SUBSYSTEMS=="xen" DRIVERS=="vbd" ATTRS{devtype}=="vbd" ATTRS{nodename}=="device/vbd/768"
Creazione di un collegamento simbolico a un nodo dispositivo
L'ordine in cui le regole vengono valutate è importante. Quando crei le tue regole, vuoi che queste vengano valutate prima delle impostazioni predefinite. Poiché le regole vengono elaborate in ordine lessicale, crea un file di regole con un nome file come /etc/udev/rules.d/10-local.rules affinché venga elaborato per primo.
La regola seguente crea il collegamento simbolico /dev/my_disk al nodo del dispositivo /dev/xvdd. È possibile creare una regola Udev per modificare il nome di un'interfaccia di rete, ma il nome di un nodo dispositivo non può essere modificato da Udev. È possibile creare solo collegamenti simbolici aggiuntivi per i nodi del dispositivo.
KERNEL=="xvdd", SUBSYSTEM=="block", SYMLINK="my_disk"
Esegui udevadm trigger per elaborare i file delle regole:
# udevadm trigger
Il collegamento simbolico ora esiste.
# ls –l /dev/my* lrwxrwxrwx. ... /dev/my_disk -> xvdd
Rimuovi il file 10-local.rules ed esegui il trigger udevadm per rimuovere il collegamento simbolico.