Sommario
Estratto
In Linux kernel 2.6 è stata inserita una nuova soluzione per lo spazio utente dedicata alla directory dinamica dei dispositivi /dev con le designazioni: udev. Questa soluzione gestisce solo i file dei dispositivi attualmente presenti, consente di creare o rimuovere i file dei nodi dei dispositivi generalmente archiviati nella directory /dev nonché di rinominare le interfacce di rete. La precedente implementazione di directory dinamica /dev con devfs è stata sostituita da udev.
Sui sistemi Linux, i nodi dei dispositivi venivano archiviati nella directory /dev. Poiché era disponibile un nodo per ogni possibile tipo di dispositivo, indipendentemente dalla sua effettiva esistenza, questa directory conteneva migliaia di file inutilizzati. Per utilizzare un nuovo dispositivo del sottosistema o del kernel, era innanzitutto necessario creare i nodi corrispondenti con una speciale applicazione. Con l'aggiunta del file system devfs la procedura è stata notevolmente migliorata perché i nodi in /dev venivano assegnati solo ai dispositivi effettivamente esistenti e noti al kernel.
Con udev viene introdotta una nuova tecnica di creazione dei nodi di dispositivi. Il kernel esporta il proprio stato in sysfs che viene aggiornato al rilevamento di un nuovo dispositivo. Quindi, viene inviato un evento allo spazio utente. Grazie alla disponibilità delle informazioni in sysfs udev può mappare una semplice sintassi di regole con gli attributi disponibili per il dispositivo e quindi creare o rimuovere i nodi corrispondenti.
L'utente non deve creare alcuna regola udev per i nuovi dispositivi. Quando si collega un dispositivo, viene creato automaticamente il relativo nodo. Tuttavia, le regole consentono di definire una politica per la denominazione dei dispositivi e rendono possibile sostituire un nome criptico con un altro più facile da ricordare. Inoltre, permettono di utilizzare nomi persistenti particolarmente utili quando due dispositivi dello stesso tipo vengono connessi contemporaneamente.
Si supponga ad esempio di disporre di due stampanti, una laser a colori di alta qualità e l'altra a getto d'inchiostro in bianco e nero, collegate tramite porta USB. Di default, queste vengono denominate /dev/usb/lpX, dove X è il numero che corrisponde all'ordine di connessione della stampante. Con udev è possibile creare apposite regole personalizzate e assegnare ad esempio il nome /dev/colorlaser alla stampante laser e il nome /dev/inkprinter a quella a getto d'inchiostro. La creazione dei nodi in base alle caratteristiche del dispositivo supportata da udev garantisce che questi facciano sempre riferimento al dispositivo corretto, indipendentemente dallo stato o dall'ordine di connessione.
Prima di creare i nodi dei dispositivi nella directory /dev, udev legge tutti i file inclusi in /etc/udev/rules.d che presentano il suffisso .rules, in ordine alfabetico. Viene utilizzata la prima regola idonea al dispositivo, anche se possono esistere altre regole valide. I commenti sono contrassegnati con il simbolo cancelletto (#). Le regole presentano la struttura seguente:
key, [key,...] NAME [, SYMLINK]
Le regole vengono assegnate ai dispositivi in base a delle chiavi, per questo motivo è necessario specificare almeno una chiave. È anche obbligatorio immettere un nome per il nodo del dispositivo creato in /dev. Il parametro symlink opzionale consente di creare i nodi in altre posizioni. La regola per una stampata è costituita dalla struttura seguente:
BUS=="usb", SYSFS{serial}=="12345", NAME="lp_hp", SYMLINK+="printers/hp"
Nell'esempio sono disponibili due chiavi: BUS e SYSFS{serial}. In udev il numero di serie viene confrontato con quello del dispositivo collegato alla porta USB. Per poter assegnare il nome lp_hp al dispositivo incluso nella directory /dev, tutte le chiavi devono essere identiche. Viene creato anche un collegamento simbolico /dev/printers/hp che fa riferimento al nodo del dispositivo. Nello stesso tempo, viene automaticamente creata la directory printers. I lavori di stampa possono essere inviati a /dev/printers/hp o /dev/lp_hp.