Guida a udev su Gentoo
1.
Cos'è udev?
La directory /dev
Quando gli utenti linux parlano del proprio hardware in presenza di persone che
pensano linux sia una sorta di strano virus od una nuova marca di caffè,
l'utilizzo di termini come "slash dev slash foo" vengono accolti con strani
sguardi. Ma alcuni fortunati utenti (che probabilmente includono anche chi sta
leggendo) utilizzano /dev/hda1 per indicare velocemente il proprio
HD master sul primo controller IDE...giusto?
Tutti sanno cosa sia un file di periferica. Qualcuno sa anche perché questi
file hanno diversi numeri quando si da un'occhiata più approfondita in
/dev con un ls -l. Ma quello che si dà per scontato è che
quando ci si riferisce al primo HD sul primo controller IDE si parla di
/dev/hda.
Si pensi alle periferiche PlugNPlay come le penne USB, IEEE1394, periferiche
PCI hot-swappable...qual è la prima periferica? E per quanto tempo? Come si
chiameranno le altre periferiche quando la prima verrà sconnessa? Questo come
influenzerà i flussi di dati in corso? Non sarebbe divertente che il proprio
lavoro venisse stampato, invece che sulla nuova stampante laser, sulla propria
sgangherata stampate ad aghi, solamente perché qualcuno ha deciso di staccare la
spina alla stampante laser che era vista dal sistema come primaria?
Le finalità del progetto udev sono sia interessanti che necessarie:
- Gira in spazio utente
- Crea e rimuove dinamicamente i file di periferica
- Assegna i nomi alle periferiche
- Mette a disposizione un API utilizzabile nello spazio utente
Per fornire queste caratteristiche, udev è sviluppato in tre diversi progetti:
namedev, libsysfs e, ovviamente, udev.
namedev
namedev consente di definire i nomi delle periferiche indipendentemente dal
programma udev. Questo permette di avere uno modello di assegnazione dei nomi
molto flessibile ed uno schema dei nomi sviluppato da diverse entità. Questo
sistema per assegnare i nomi ai dispositivi offre un'interfaccia standard con
cui udev può interfacciarsi
Attualmente namedev fornisce un solo modello per l'assegnazione dei nomi ai
dispositivi, fornito da LANANA, modello attualmente usato dalla maggior parte
dei sistemi Linux e quindi piuttosto indicato per la maggior parte degli utenti
Linux.
namedev usa un procedimento suddiviso in cinque passi per assegnare un nome a
una data periferica. Se si trova un nome per la periferica durante uno di
questi passi, viene usato questo nome e la procedura si interrompe. I cinque
passi, nell'ordine, sono:
- etichetta o numero seriale
- numero della periferica sul bus
- topologia del bus
- nome assegnato staticamente
- nome fornito dal kernel
Il primo passaggio (etichetta o numero seriale) controlla se la
periferica ha un identificatore univoco. Per esempio i dispositivi USB hanno
un numero seriale unico; le periferiche SCSI hanno un UUID unico. Se nel file
di configurazione in uso esiste una regola che assegna il nome al dispositivo
in base a questo identificatore, namedev applica la regola e assegna il nome
alla periferica.
Successivamente (numero della periferica sul bus) viene controllato il
numero con cui il dispositivo viene identificato sul bus . Per esempio i numeri
assegnati ai dispositivi sul bus PCI cambiano di rado durante il ciclo di vita
di un sistema, per cui questo si può considerare un buon metodo per assegnare
un nome a una periferica PCI (non-hot-swappable).
Si può assegnare un nome a un dispositivo anche sulla base di come questo è
fisicamente collegato al bus (topologia del bus), anche questo è un
metodo abbastanza valido per identificare univocamente una periferica, almeno
fino a quando non viene variata la disposizione fisica dei dispositivi
all'interno del sistema.
È possibile definire una regola che sostituisca staticamente (nome
assegnato staticamente), al nome fornito dal kernel, una stringa
arbitraria.
Se non esistono regole per assegnare un nome a un dispositivo, il comportamento
predefinito di udev è di assegnare alla periferica il nome fornito dal kernel
(nome fornito dal kernel). Nella maggior parte dei casi questo è
sufficiente visto che il nome corrisponde a quello assegnato.
libsysfs
udev interagisce con il kernel tramite il filesystem sysfs. Il progetto
libsysfs mette a disposizione un API per accedere alle informazione fornite
dal filesystem sysfs. Questo consente di poter interrogare qualunque tipo di
dispositivo hardware senza doversi preoccupare di che tipo di hardware si
tratti.
udev
Ogni volta che il kernel riceve un evento nella struttura dei dispositivi,
chiede ad udev di controllare. udev segue le regole contenute nella directory
/etc/udev/rules.d/, successivamente usa le informazioni date dal
kernel per eseguire le azioni necessarie nella struttura di /dev
(creando o eliminando file di periferica).
2.
Usare udev su Gentoo
Requisiti
udev è stato pensato per funzionare in combinazione con i kernel 2.6 (come per
esempio gentoo-sources con il profilo di default 2007.0). Oltre ad avere
installato un kernel 2.6 è necessario avere installato sul proprio sistema anche
la versione più recente di sys-apps/baselayout.
Codice 2.1: Installare udev |
# emerge udev
|
Ricordarsi inoltre di attivare le seguenti opzioni nel kernel:
Codice 2.2: Opzione del kernel richieste |
File systems --->
[*] Inotify file change notification support
[*] Inotify support for userspace
Pseudo filesystems --->
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
|
Se si utilizza genkernel non occorre fare nulla di speciale. Genkernel
imposterà udev in modo predefinito.
Configurazione
Se si è voluto utilizzare le impostazioni specifiche per Gentoo di udev creata
per semplificare la vita all'utente allora la procedura è terminata. Gentoo
utilizzerà udev ma continuerà a mantenere un link statico in /dev
in modo che non mancherà mai il nodo ad un particolare dispositivo. Gli script
init di Gentoo non avvieranno più il servizio devfsd e disattiveranno devfs al
boot.
Ma se si vuole un sistema udev puro, senza modifiche, cosa che peraltro è
contemplata dai suoi sviluppatori (incluso il problema dei dispositivi mancanti
visto che ancora udev non li supporta), proseguire nella lettura.
La prima cosa da fare è quella di disattivare la regola che salva la struttura
dei dispositivi in un archivio tarball allo spegnimento del PC: modificare la
variabile RC_DEVICE_TARBALL in /etc/conf.d/rc e impostarla a
no:
Codice 2.3: /etc/conf.d/rc |
RC_DEVICE_TARBALL="no"
|
Se si è lasciato attivo il supporto a devfs nel kernel lo si può disattivare
nel file di configurazione del bootloader aggiungendo il parametro del kernel
gentoo=nodevfs. Se invece si volesse riattivare il supporto a devfs
disabilitando udev, si dovrà passare al kernel il parametro
gentoo=noudev.
3.
Problemi Noti
File di periferica mancanti all'avvio
Se non si riesce ad avviare il sistema con successo perché si ottiene un errore
che dice che il file /dev/null non è stato trovato, o perché la
console iniziale non esiste, il problema è dovuto alla mancanza di alcuni file
che devono essere presenti nel sistema prima che
/dev venga montato e udev inizi a gestirlo. Questo è un errore
piuttosto comune sui sistemi Gentoo installati usando supporti vecchi.
Avendo installato sys-apps/baselayout-1.8.12, o più recente, questo
inconveniente dovrebbe essere alleviato dal fatto che il sistema dovrebbe essere
comunque in grado di avviarsi. Comunque, per evitare noiosi avvisi, è
sufficiente creare i file di periferica mancanti, come descritto in seguito.
Per visualizzare i dispositivi che sono disponibili prima che il filesystem
/dev venga montato bisogna eseguire i seguenti comandi:
Codice 3.1: Elenco dei dispositivi disponibili all'avvio |
# mkdir test
# mount --bind / test
# cd test/dev
# ls
|
I dispositivi necessari per avviare correttamente il sistema sono
/dev/null e /dev/console. Se non vengono
visualizzati durante il test precedente vanno creati manualmente. I comandi
seguenti vanno eseguiti nella directory test/dev/ creata in
precedenza:
Codice 3.2: Creare i file di periferica mancanti |
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
|
Quando si sono impartiti questi comandi è necessario ricordarsi di smontare la
directory test/:
Codice 3.3: Smontare la directory test/ |
# cd ../../
# umount test
# rmdir test
|
udev e nvidia
Nel caso si usassero i driver proprietari di nVidia e il server grafico X non
partisse, in un sistema configurato per utilizzare solo udev, bisogna
assicurarsi che:
-
il modulo nvidia sia elencato nel file
/etc/modules.autoload.d/kernel-2.6
-
sia installata una versione di baselayout uguale o maggiore di
sys-apps/baselayout-1.8.12
Assegnazione differente dei nomi tra DevFS e udev
Nonostante l'intento di mantenere inalterati i nomi assegnati ai dispositivi da
entrambi i sistemi di gestione, in qualche caso può capitare che ci siano
delle differenze tra il nome assegnato da DevFS e quello assegnato da udev.
Un caso conosciuto riguarda il controller RAID HP Smart Array 5i (più
precisamente il modulo del kernel cciss). Con udev, il dispositivo viene
chiamato /dev/cciss/cXdYpZ dove X, Y e Z sono numeri. Con devfs, il
dispositivo si chiama /dev/hostX/targetY/partZ o é un link
simbolico a /dev/cciss/cXdY.
In questo caso é necessario ricordarsi di modificare il file
/etc/fstab e i file di configurazione del bootloader.
La stessa cosa succede con molti dei link simbolici che venivano creati in
/dev, come per esempio /dev/mouse, che ora
udev non crea più. Assicurarsi che nel proprio file di configurazione
di X il percorso del dispositivo del mouse punti ad un file esistente.
Un'altro problema è nella differenza di denominazione dei terminali tra devfs e
udev. Mentre in devfs i terminali vengono chiamati tty, udev li chiama
vc e tty. Ciò può dare dei problemi nel caso siano state applicate
delle restrizioni, attraverso l'uso di /etc/securetty, riguardo le
login da utente root. Assicurarsi che entrambe le voci tty1 e vc/1
siano elencate nel file di configurazione /etc/securetty, per
permettere a root di effettuare il login tramite la console.
Rinominare i dispositivi a blocchi
Le versioni recenti di udev (dalla 104 in poi) unitamente alle nuove versioni
del kernel (2.6.19 e successive) potrebbero cambiare i nomi di dispositivo dei
propri dischi, a causa di una modifica nell'implementazione del kernel riguardo
a libata: per esempio una periferica CD-RW mappata in precedenza come
/dev/hdc potrebbe cambiare in /dev/sr0. Mentre questo
di norma non rappresenta un problema, potrebbe dare dei problemi a qualche
applicazione che ha codificato internamente la ricerca dei dispositivi in altre
locazioni. Per esempio, media-sound/rip si aspetta di trovare i dischi in
/dev/cdrom, e ciò diventa un problema se si usa un nuovo kernel e
udev rinomina il proprio dispositivo in /dev/cdrom1.
Per aggirare questi problemi, bisogna modificare
/etc/udev/rules.d/70-persistent-cd.rules e assegnare il nome
corretto al dispositivo.
Per ulteriori informazioni riguardanti la scrittura di regole per udev,
assicurarsi di leggere la guida di Daniel Drake.
Rinominare i dispositivi di rete
Talvolta disconnettendo e riconnettendo un disposirivo di rete (come una scheda
USB WiFi) essa può venire rinominata ogni volta, incrementandone il numero di
un'unità.
Quando ciò accade, la si vedrà diventare wlan0, wlan1,
wlan2, ecc. Ciò avviene perchè udev sta aggiungendo delle regole
aggiuntive al proprio file delle regole, invece di ricaricare le regole
esistenti. Siccome udev controlla la propria directory delle regole tramite
inotify, bisogna avere il supporto a inotify nella propria configurazione del
kernel:
Codice 3.4: Abilitare il supporto a nel kernel |
File systems --->
[*] Inotify file change notification support
[*] Inotify support for userspace
|
Ora udev ricorderà correttamente i nomi dei propri dispositivi di rete.
udev carica i moduli in un ordine non previsto
Qualche volta udev carica i moduli in un ordine non indesiderato, non previsto o
abbastanza casuale. Tale comportamento è abbastanza comune in special modo per i
sistemi che hanno dispositivi multipli dello stesso tipo, per esempio
periferiche multimediali. Questo influenza i numeri assegnati ai dispositivi;
per esempio, nelle schede sonore talvolta potrebbero invertirsi di numero.
Ci sono alcune soluzioni per correggere la numerazione dei dispositivi e/o
l'ordine di caricamento dei moduli. Idealmente, basterebbe usare i parametri
del modulo per specificare il numero di dispositivo desiderato. Alcuni moduli,
come ALSA, include il parametro "index" (indice, ndt). I moduli che usano il
parametro index possono essere adeguati come mostrato. Questo esempio è per
sistemi con due schede sonore. La scheda con un indice uguale a 0 viene
designata come prima scheda. Una volta che i parametri vengono modificati, i
file di configurazione del modulo devono essere aggiornati.
Codice 3.5: Specificare i parametri del modulo |
# echo "option snd-ice1724 index=0" >> /etc/modprobe.d/alsa.conf
# echo "option snd-ymfpci index=1" >> /etc/modprobe.d/alsa.conf
# update-modules
|
L'esempio precedente è la soluzione preferibile, purtroppo non tutti i moduli
supportano dei parametri come index. Per tali moduli, bisogna forzare il loro
corretto ordine di caricamento. Per prima cosa, bisogna impedire ad udev di
caricare automaticamente i moduli inserendoli in una "lista nera" (blacklist).
Assicurarsi di usare il nome esatto del modulo che viene caricato. Per i
dispositivi PCI, bisogna usare i nomi dei moduli ottenuti dall'output di
lspci -k, disponibile nel pacchetto pciutils. L'esempio seguente
usa i moduli DVB.
Codice 3.6: Inserire i moduli nella lista nera |
# echo "blacklist b2c2-flexcop-pci" >> /etc/modprobe.d/dvb
# echo "blacklist budget" >> /etc/modprobe.d/dvb
# update-modules
|
Successivamente, caricare i moduli nell'ordine corretto. Aggiungerli al file
/etc/modules.autoload.d/kernel-2.6 nell'ordine esatto con cui si
desidera vengano caricati.
Codice 3.7: Caricare i moduli nell'ordine corretto |
# echo "budget" >> /etc/modules.autoload.d/kernel-2.6
# echo "b2c2-flexcop-pci" >> /etc/modules.autoload.d/kernel-2.6
|
Altri problemi
Se il file corrispondente ad una periferica non viene creato quando si carica
il modulo relativo tramite il file
/etc/modules.autoload.d/kernel-2.6, ma compare caricando
manualmente il modulo tramite modprobe, provare ad installare
sys-apps/baselayout-1.8.12, o una versione più recente.
Il supporto per i dispositivi framebuffer (/dev/fb/*) è stato
introdotto a partire dalla versione 2.6.6-rc2 del kernel.
Nel caso si usasse un kernel precedente alla versione 2.6.4 è necessario
includere esplicitamente il supporto per il filesystem /dev/pts.
Codice 3.8: Abilitare il filesystem /dev/pts |
File systems --->
Pseudo filesystems --->
[*] /dev/pts file system for Unix98 PTYs
|
4.
Risorse & Riconoscimenti
La conferenza sul sistema udev tenuta da Greg Kroah-Hartman (IBM Corporation) al
Linux Symposium (Ottawa, Canada - 2003) è un ottimo punto di partenza per una
buona comprensione di udev.
Decibel's UDEV Primer è un documento molto approfondito riguardo all'uso
di udev su Gentoo.
Writing udev rules,
scritto dallo sviluppatore di Gentoo Daniel Drake, è un documento eccellente per
imparare come personalizzare la proprio installazione di udev.
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|