GNU/Linux >> Linux Esercitazione >  >> Cent OS

Guida per principianti a Udev in Linux

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.


Cent OS
  1. Autorizzazioni Linux 101

  2. Che cos'è CentOS:una guida per principianti

  3. Migrazione da CentOS 8 a Oracle Linux 8:una guida passo passo

  4. Reimposta la password di root su Linux

  5. CentOS / RHEL 7:Guida per principianti a firewalld

Una guida per principianti ai permessi di Linux

Una guida per principianti a LVM

Guida completa per principianti per eseguire il root di Samsung Galaxy S2 in Ubuntu Linux

Una guida per principianti a Cron Jobs

Guida per principianti a SELinux

Guida per principianti all'amministrazione di utenti e gruppi in Linux