Nomi di device persistenti
Chi di noi non ha familiarità con i device name sotto
/dev e l'annoso problema di individuare uno specifico dispositivo una volta agganciato alla macchina, tra circa altri 4500 (tale è il numero tipico di device in una distribuzione moderna)? In passato (e presente, ma ancora per poco), oltre al sistema dei device name statitici, il kernel 2.4 o 2.6 ha messo a disposizione uno strumento tanto potente quanto criticato - il
devfs - per gestire in modo intelligente e gerarchico i nomi di dispositivo e fornire quindi criteri logici per orientarsi nella pletora di device name del sistema.
Evidentemente le critiche non bastavano

e sono nati quindi programmi ancora più sofisticati a nome rispettivamente
udev e
hotplug (correntemente in via di unificazione). In questa pagina ci interesseremo esclusivamente a
udev e una sua caratteristica importante, i nomi persistenti di device. Il programma
udev è una applicazione in
user-space che è in grado di gestire e popolare dinamicamente la gerarchia di device in
/dev in base alla presenza o meno di uno specifico dispositivo fisico, partendo dalla ipotesi che i dispositivi possano anche essere connessi e sconnessi a caldo. Un problema classico è legato al fatto che diversi dispositivi rimuovibili (es. USB) hanno un nome di device legato all'ordine di inserimento del dispositivo stesso, rispetto agli altri simili. Ecco allora che il disco ATA esterno o il pen-drive assumono nome di device
/dev/sda oppure
/dev/sdb, a seconda dell'ordine in cui vengono montati dall'operatore. Lo stesso vale ad esempio per un paio di stampanti USB montate su un sistema, o per altri dispositivi, magari su firewire o bluetooth.
Per ovviare a tale problema,
udev ha un meccanismo generale di
rules che consente di agganciare un nome di dispositivo (e fare molto altro ancora) in base a caratteristiche specifiche del dispositivo stesso, che spesso hanno un sierial number unico. Si può quindi modificare il file
/etc/udev/udev.rules, per esempio come segue:
# se /sbin/scsi_id ritorna "OEM 0815" il dispositivo si chiamera'
# disk1
BUS="scsi", PROGRAM="/sbin/scsi_id", \
RESULT="OEM 0815", NAME="disk1"
# La specifica stampante USB si chiamera' lp_color
BUS="usb", SYSFS_serial="W09090207101241330", \
NAME="lp_color"
# Disco SCSI di uno specifico vendor e tipo si chiamera'
# boot
BUS="scsi", SYSFS_vendor="IBM", \
SYSFS_model="ST336", NAME="boot"
# Una card con PCI bus id 00:0b.0 sara' chiamata dsp
BUS="pci", ID="00:0b.0", NAME="dsp"
# Il mouse USB sulla terza porta del secondo hub
# si chiama mouse1
BUS="usb", PLACE="2.3", NAME="mouse1"
# ttyUSB1 si chiamera' pda
# con altri 2 symlink
KERNEL="ttyUSB1", NAME="pda", \
SYMLINK="palmtop handheld"
# USB webcam con symlinks multipli
BUS="usb", SYSFS_model="XV3", NAME="video%n", \
SYMLINK="webcam%n"
# due stampanti identificate da diverso tag sono agganciate a dispositivi
# diversi
BUS="usb", SYSFS_serial="W09090207101241330", \
NAME="lp_color"
BUS="usb", SYSFS_serial="HXOLL0012202323480", \
NAME="lp_plain"
Una rule definisce la relazione fra un nome di dispositivo (oppure uno o più link simbolici a un nome di dispositivo) e le caratteristiche più varie del dispositivo medesimo. In mancanza di altro si userà il default del kernel. Tra le chiavi usabili:
- BUS: tipo di bus del dispositivo, per es. SCSI, USB, PCI
- KERNEL: nome che il kernel da al device
- ID: id del device sul bus specificato, per esempio USB id o PCI id
- PLACE: posizione nella topologia del bus, se ha senso come nel caso USB
- SYSFS{filename}: consente il match rispetto a un attributo di
sysfs sotto /sys
- PROGRAM: permette di eseguire un programma esterno ed effettuare un match rispetto al suo risultato positivo o meno
- RESULT: in aggiunta all'esecuzione, si verifica che il programma abbia un risultato che matcha una certa stringa
Rispetto a tali chiavi, si può specificare un
NAME o un
SYMLINK come nell'esempio precedente. Varianti molto carine consetono ad esempio di creare on-fly il nome di un dispositivo CD-ROM in base al suo titolo in un database CDDB. Per esempio
KERNEL="[hs]d[a-z]", PROGRAM="name_cdrom.pl %M %m", \
NAME="%1c", SYMLINK="cdrom"
Lo script
name_cdrom.pl è incluso nella documentazione di
udev, alla quale si rimanda comunque per maggiori dettagli.
--
FrancescoLovergine - 03 Oct 2005
Inizio pagina