udev - udev

udev
Sviluppatore/i Greg Kroah-Hartman e Kay Sievers
Versione iniziale novembre 2003 ; 17 anni fa ( 2003-11 )
Rilascio stabile 249 (7 luglio 2021 ; 3 mesi fa ) [±] ( 2021-07-07 )
Repository
Scritto in C
Sistema operativo Kernel Linux
Tipo Nodo dispositivo
Licenza GPLv2
Sito web Sito ufficiale

udev (userspace /dev) è un gestore di dispositivi per il kernel Linux . Come successore di devfsd e hotplug, udev gestisce principalmente i nodi del dispositivo nella directory /dev . Allo stesso tempo, udev gestisce anche tutti gli eventi dello spazio utente generati quando i dispositivi hardware vengono aggiunti al sistema o rimossi da esso, incluso il caricamento del firmware come richiesto da alcuni dispositivi.

Fondamento logico

È il kernel di un sistema operativo che è responsabile di fornire un'interfaccia astratta dell'hardware al resto del software. Essendo un kernel monolitico , il kernel Linux fa esattamente questo e i driver di dispositivo fanno parte del kernel Linux, che costituisce più della metà del suo codice sorgente. È possibile accedere all'hardware tramite chiamate di sistema o tramite i relativi nodi del dispositivo .

Per essere in grado di gestire i dispositivi periferici che supportano l' hotplug in modo intuitivo, una parte della gestione di tutti questi dispositivi hardware abilitati all'hotplug è stata trasferita dal kernel a un demone in esecuzione nello spazio utente. L'esecuzione nello spazio utente serve a scopi di sicurezza e stabilità.

Design

I driver di dispositivo fanno parte del kernel Linux, in cui le loro funzioni principali includono il rilevamento dei dispositivi, il rilevamento delle modifiche allo stato dei dispositivi e funzioni hardware di basso livello simili. Dopo aver caricato un driver di dispositivo in memoria dal kernel, gli eventi rilevati vengono inviati al demone dello spazio utente udevd. È il gestore dei dispositivi, udevd , che cattura tutti questi eventi e poi decide cosa accadrà dopo. Per questo, udevd dispone di un set molto completo di file di configurazione, che possono essere modificati dall'amministratore del computer, in base alle proprie esigenze.

  • Nel caso in cui un nuovo dispositivo di archiviazione sia connesso tramite USB, udevd viene notificato dal kernel e notifica esso stesso al demone udisksd. Quel demone potrebbe quindi montare i file system.
  • Nel caso in cui un nuovo cavo Ethernet sia collegato alla NIC Ethernet, udevd viene notificato dal kernel e notifica esso stesso al demone NetworkManager. Il demone NetworkManager potrebbe avviare dhclient per quella scheda NIC o configurarlo in base a una configurazione manuale.

La complessità di tale operazione costringe gli autori delle applicazioni a re-implementare la logica di supporto hardware. Alcuni dispositivi hardware richiedono anche programmi di supporto privilegiati per prepararli all'uso. Questi devono essere spesso invocati in modi che possono essere difficili da esprimere con il modello dei permessi Unix (ad esempio, consentendo agli utenti di accedere a reti wireless solo se hanno effettuato l'accesso alla console video). Gli autori delle applicazioni ricorrono all'utilizzo di binari setuid o eseguono daemon di servizio per fornire il proprio controllo di accesso e separazione dei privilegi, introducendo potenzialmente ogni volta falle di sicurezza.

HAL è stato creato per affrontare questo problema, ma ora è deprecato nella maggior parte delle distribuzioni Linux.

Panoramica

A differenza dei sistemi Unix tradizionali , in cui i nodi del dispositivo nella directory /dev sono stati un insieme statico di file, il gestore dei dispositivi udev di Linux fornisce dinamicamente solo i nodi per i dispositivi effettivamente presenti su un sistema. Sebbene devfs fornisse funzionalità simili, Greg Kroah-Hartman ha citato una serie di ragioni per preferire udev a devfs:

  • udev supporta la denominazione permanente dei dispositivi, che non dipende, ad esempio, dall'ordine in cui i dispositivi sono collegati al sistema. L'impostazione predefinita di udev fornisce nomi persistenti per i dispositivi di archiviazione. Qualsiasi disco rigido è riconosciuto dal suo ID univoco del filesystem, dal nome del disco e dalla posizione fisica sull'hardware a cui è connesso.
  • udev viene eseguito interamente nello spazio utente , al contrario dello spazio del kernel di devfs . Una conseguenza è che udev ha spostato la politica di denominazione fuori dal kernel e può eseguire programmi arbitrari per comporre un nome per il dispositivo dalle proprietà del dispositivo, prima che il nodo venga creato; lì, l'intero processo è anche interrompibile e viene eseguito con una priorità inferiore.

L'udev, nel suo insieme, è diviso in tre parti:

  • Libudev libreria che consente l'accesso alle informazioni sul dispositivo; è stato incorporato nel pacchetto software systemd 183.
  • Spazio utente daemon udevd che gestisce il virtuale / dev .
  • Utilità amministrativa della riga di comando udevadm per la diagnostica.

Il sistema riceve chiamate dal kernel tramite socket netlink . Le versioni precedenti usavano hotplug , aggiungendo un collegamento a se stessi in /etc/hotplug.d/default con questo scopo.

operazione

Image
udev è stato incorporato in systemd 183

udev è un gestore di dispositivi generico che funziona come demone su un sistema Linux e ascolta (tramite un socket netlink ) gli uevent inviati dal kernel se un nuovo dispositivo viene inizializzato o se un dispositivo viene rimosso dal sistema. Il pacchetto udev viene fornito con un ampio set di regole che corrispondono ai valori esportati dell'evento e alle proprietà del dispositivo rilevato. Una regola corrispondente nominerà e creerà un nodo del dispositivo ed eseguirà programmi configurati per impostare e configurare il dispositivo.

Le regole udev possono corrispondere a proprietà come il sottosistema del kernel, il nome del dispositivo del kernel, la posizione fisica del dispositivo o proprietà come il numero di serie del dispositivo. Le regole possono anche richiedere informazioni a programmi esterni per denominare un dispositivo o specificare un nome personalizzato che sarà sempre lo stesso, indipendentemente dall'ordine in cui i dispositivi vengono rilevati dal sistema.

In passato, un modo comune per utilizzare udev sui sistemi Linux era consentire l'invio di eventi tramite un socket a HAL , che avrebbe eseguito ulteriori azioni specifiche del dispositivo. Ad esempio, HAL avrebbe notificato ad altri software in esecuzione sul sistema che il nuovo hardware era arrivato emettendo un messaggio broadcast sul sistema D-Bus IPC a tutti i processi interessati . In questo modo, desktop come GNOME o K Desktop Environment 3 potrebbero avviare il browser dei file per sfogliare i file system delle unità flash USB e delle schede SD appena collegate .

A metà del 2011 HAL era stato deprecato dalla maggior parte delle distribuzioni Linux e dagli ambienti desktop KDE, GNOME e Xfce , tra gli altri. La funzionalità precedentemente incorporata in HAL è stata integrata in udev stesso o spostata in software separato come udisks e upower .

  • udev fornisce l'accesso di basso livello all'albero dei dispositivi Linux. Consente ai programmi di enumerare i dispositivi e le loro proprietà e di ricevere notifiche quando i dispositivi vanno e vengono.
  • dbus è un framework che consente ai programmi di comunicare tra loro, in modo sicuro, affidabile e con un'interfaccia di programmazione orientata agli oggetti di alto livello.
  • udisks (precedentemente noto come DeviceKit-disks) è un demone che si trova sopra libudev e altre interfacce del kernel e fornisce un'interfaccia di alto livello ai dispositivi di archiviazione ed è accessibile tramite dbus alle applicazioni.
  • upower (precedentemente noto come DeviceKit-power) è un demone che si trova sopra libudev e altre interfacce del kernel e fornisce un'interfaccia di alto livello per la gestione dell'alimentazione ed è accessibile tramite dbus alle applicazioni.
  • NetworkManager è un demone che si trova sopra libudev e altre interfacce del kernel (e un paio di altri demoni) e fornisce un'interfaccia di alto livello per la configurazione e l'impostazione della rete ed è accessibile tramite dbus alle app.

udev riceve i messaggi dal kernel e li passa ai demoni del sottosistema come Network Manager. Le applicazioni parlano con Network Manager tramite D-Bus.

HAL è obsoleto e utilizzato solo dal codice legacy. Ubuntu 10.04 fornito senza HAL. Inizialmente era previsto un nuovo demone DeviceKit per sostituire alcuni aspetti di HAL, ma nel marzo 2009 DeviceKit è stato deprecato a favore dell'aggiunta dello stesso codice a udev come pacchetto: udev-extras, e alcune funzioni sono ora spostate in udev propriamente detto.

Storia

udev è stato introdotto in Linux 2.5 . La versione del kernel Linux 2.6.13 ha introdotto o aggiornato una nuova versione dell'interfaccia uevent . Un sistema che utilizza una nuova versione di udev non si avvierà con kernel precedenti alla 2.6.13 a meno che udev non sia disabilitato e non venga utilizzata una directory /dev tradizionale per l'accesso al dispositivo.

Nell'aprile 2012, il codebase di udev è stato unito all'albero dei sorgenti di systemd , rendendo systemd 183 la prima versione a includere udev. Nell'ottobre 2012, Linus Torvalds ha criticato l' approccio di Kay Sievers alla manutenzione di udev e alla correzione dei bug relativi al caricamento del firmware , affermando:

Sì, farlo nel kernel è "più robusto". Ma non scherzare e smettila di mentire. È più robusto perché abbiamo manutentori che si preoccupano e perché sappiamo che le regressioni non sono qualcosa con cui possiamo giocare velocemente e liberamente. Se qualcosa si rompe e non sappiamo quale sia la soluzione giusta per quella rottura, ripristiniamo la cosa che si è rotta. Quindi sì, è chiaramente meglio farlo nel kernel. Non perché il caricamento del firmware non possa essere eseguito nello spazio utente. Ma semplicemente perché la manutenzione di udev da quando Greg ha rinunciato è peggiorata.

Nel 2012, il progetto Gentoo Linux ha creato un fork della base di codice udev di systemd per evitare la dipendenza dall'architettura di systemd. Il fork risultante si chiama eudev e rende disponibili le funzionalità di udev senza systemd. Un obiettivo dichiarato del progetto è quello di mantenere eudev indipendente da qualsiasi distribuzione Linux o sistema init . Il progetto Gentoo descrive eudev come segue:

eudev è un fork di systemd-udev con l'obiettivo di ottenere una migliore compatibilità con software esistenti come OpenRC e Upstart , kernel più vecchi, varie toolchain e quant'altro richiesto dagli utenti e dalle varie distribuzioni.

Il 29 maggio 2014, il supporto per il caricamento del firmware tramite udev è stato eliminato da systemd, poiché è stato deciso che è compito del kernel caricare il firmware. Due giorni dopo, Lennart Poettering ha suggerito di posticipare questa patch fino a quando kdbus non inizierà ad essere utilizzato da udev; a quel punto, il piano era di cambiare udev per usare kdbus come sistema di messaggistica sottostante e di sbarazzarsi del trasporto basato su netlink da spazio utente a spazio utente.

Autori

udev è stato sviluppato da Greg Kroah-Hartman e Kay Sievers , con l'aiuto di Dan Stekloff , tra gli altri.

Riferimenti

link esterno