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 voi)
utilizzano /dev/hda1 per indicare velocemente il proprio HD
master sul primo controler IDE...giusto?
Noi tutti sappiamo cosa sia un file di dispositivo. Qualcuno sa anche perchè
questi file hanno diversi numeri quando quando si da un'occhiata più
approfondita in /dev con un ls -l. Ma quello che noi tutti
diamo per scontato è che quando ci riferiamo al primo HD sul primo controler
IDE stiamo parlarlando di /dev/hda.
Pensate 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 vostro
lavoro fosse stampato invece che sulla vostra nuova stampante laser sulla
vostra 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 dispositivo
- 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 assegnamento 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'assegnamento dei nomi ai
dispositivi, fornito da LANANA, che è quello che viene 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.
Successivamnte (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 si possono 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 percepisce che sono stati collegati o rimossi dei
dispositivi, lancia il programma /sbin/hotplug. Hotplug a sua
volta lancia i programmi che sono stati linkati nella directory
/etc/hotplug.d/default, nella quale si trova anche un link
simbolico all'eseguibile udev. Hotplug invia le informazioni fornite dal
kernel al sistema udev che provvedere a aggiungere o rimuovere gli oppurtuni
file di periferica dalla directory /dev.
2.Usare udev su Gentoo
Requisiti
udev è stato pensato per funzionare in combinazione con i kernel 2.6 (come per
esempio vanilla-sources o gentoo-sources con il profilo di
default 2005.0). Oltre a avere installato un kernel 2.6 è necessario avere
installato sul proprio sistema anche la versione piu' recente di
sys-apps/baselayout.
Esempio 1: Installare udev |
# emerge udev
|
udev installa come dipendenza anche il paccheto sys-apps/hotplug-base.
Non é necessario installare hotplug a meno che non si voglia che i
moduli del kernel vengano caricati quando si collega uan periferica ala
sistema. hotplug si occupa anche di attivare le interfacce di rete.
Esempio 2: Installare gli script opzionali di hotplug |
# emerge hotplug
|
Se si vuole che vengano caricati i moduli per le periferiche che sono state
collegate al sistema prima del boot é necessario installare il pacchetto
sys-apps/coldplug.
Esempio 3: Installare il pacchetto coldplug |
# emerge coldplug
|
Assicuratevi di aver aggiunto coldplug al runlevel utilizzato:
Esempio 4: Aggiungere coldplug al runlevel boot |
# rc-update add coldplug boot
|
e ricordatevi di attivare le segueti opzioni nel kernel:
Esempio 5: Required kernel options |
General setup --->
[*] Support for hot-pluggable devices
File systems --->
Pseudo filesystems --->
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
|
Se si desidera si puo' mantenere attiva anche l'opzione /dev file system
support (OBSOLETE), ma bisogna assicurarsi che l'opzione "Automatically
mount at boot" sia disattivata.
Esempio 6: Disattivare l'opzione montare devfs al boot |
File systems --->
Pseudo Filesystems --->
[*] /dev file system support (OBSOLETE)
[ ] Automatically mount at boot
|
Se si utilizza genkernel bisogna lanciarlo con l'opzione --udev
per attivare tutte le opzioni del kernel necessarie al funzionamento di udev.
Configurazione
Se volete utilizzare la versione gentoo di udev creata per semplificarvi la
vita allora avete finito. Gentoo utilizzerà udev ma continuerà a mantenere un
link statico in /dev in modo che non vi macherà 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 siete duri a morire e volete un sistema udev puro, senza il trucchetto
precedente, cosa che peraltro è contemplata dai suoi sviluppatori (incluso il
problema dei dispositivi mancanti visto che ancora udev non li supporta),
continuate a leggere.
La prima cosa da fare è quella di distattivare la regola che salva la
struttura dei device in un tarball allo spegnimento del PC: editate la
variabile RC_DEVICE_TARBALL in /etc/conf.d/rc e
impostatela su no:
Esempio 7: /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 dispositivo mancanti all'avvio
Se non si riesce a 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 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
incoveniente 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 dispositivo mancanti, come descritto in seguito.
Per visualizzare i dispositivi che sono disponibili prima che il filesystem
/dev venga montato bisogna eseguire i seguenti comandi:
Esempio 8: 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
viasualizzati durante il test precendente vanno creati manualmente. I comandi
seguenti vanno eseguiti nella directory test/dev/ creata
precentemente:
Esempio 9: Creare i file di dispositivo 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/:
Esempio 10: 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 nvidia-kernel uguale o maggiore di
media-video/nvidia-kernel-1.0.5336-r2
-
sia installata una versione di sys-apps/baselayout uguale o maggiore
di sys-apps/baselayout-1.8.12
I volumi LVM2 scompaiono
Usando udev e LVM2 insieme, è possibile che che i volumi logici creati
non appaiano nella directory /dev. In realta' questi device si
chiamano /dev/dm-# dove # sta per un numero intero.
Per coreggere questo errore bisogna modificare il file
/etc/udev/rules.d/50-udev.rules decommentando la seguente linea:
Esempio 11: Deconmmentare questa linea nel file /etc/udev/rules.d/50-udev.rules |
KERNEL="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", NAME="%k",
SYMLINK="%c"
|
Dopo, installate sys-fs/multipath-tools che contiene le applicazioni
devmap_name.
Esempio 12: Installazione di multipath-tools |
# echo "=sys-fs/multipath-tools-0.4.2 ~x86" >> /etc/portage/package.keywords
# emerge multipath-tools
|
Assegnamento dei nomi differente tra DevFS e udev
Nonostante l'intento di mantere 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 piu'. Assicurarsi che nel proprio file di configurazione
di X il percorso del dispositivo del mouse punti a un file esistente.
Altri problemi
Se il file corrispondente a un dispositivo 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 si provi a installare
sys-apps/baselayout-1.8.12, o 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 precendente alla versione 2.6.4 è necessario
includere esplicitamente il supporto per il filesystem /dev/pts.
Esempio 13: 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.
|