Introduzione.
Ho deciso di scrivere questa mini documentazione per cercare di chiarire vari dubbi sul funzionamento di hotplug e su cosa É in realtá hotplug. Infatti solo oggi mi é capitato di leggere vari post in cui vi fosse un pó di confusione. E mi é sembrato bello cercare di fare un pó di chiarezza.
Ovviamente lo so che a molti non gliene frega niente dei dettagli (l'importante é che vada), peró se cé qualcuno curioso questo dovrebbe tornare utile.
Ma allora cosa é hotplug?
Hotplug non é un programma e basta, hotplug é tante cose.
Quando il kernel interroga i vari bus (PCI, USB, ISAPNP, FIREWIRE, INPUT, PCMCIA(in arrivo)) o quando crea interfacce di rete, trova block devices (harddisk, chiavi usb etc...), esso genera un evento.
Ossia chiama un programma denominato appunto "hotplug" (solitamento presente in /sbin/hotplug, ma settabile in /proc/sys/kernel/hotplug) passandogli varie variabili d'ambiente e come argomento il tipo di evento (usb, pci, isapnp, net, ieee1394, printer, disk, parport, input, ide, cpu, system ecc...).
Le variabili d'ambiente variano in base al tipo di evento.
Per esempio per un evento di tipo PCI esse sono:
Code: Select all
ACTION=%s [add or remove]
PCI_CLASS=%06X
PCI_ID=%04X:%04X
PCI_SLOT_NAME=%s
PCI_SUBSYS_ID=%04X:%04X
Cosa avviene una volta che il kernel ha invocato "hotplug"?
Questo programma, in una installazione standard non é altro che uno script di qualche riga che richiama gli script (o programmi) contenuti in /etc/hotplug.d
Qua ci sono varie directory, ognuna col nome del tipo di evento (come sempre pci, usb, block etc...). Vi é anche una directory chiamata "default" e invocata per qualsiasi evento.
Gli script, per essere invocati, devono avere estensione .hotplug.
Tutti gli script relativi all'evento (quelli in default sempre) vengono chiamati con le stesse variabili d'ambiente passate dal kernel ad hotplug.
Ora c'é da fare una precisazione.
Molti pensano che hotplug sia "il programma che carica i moduli delle periferiche trovate".
NIENTE DI PIÚ SBAGLIATO. Esso é solo una piccola parte di quello che puó fare hotplug.
Se per caso avete installato "udev" vedrete con in /etc/hotplug.d/default esiste anche un link chiamato udev.hotplug che punta ad "udevsend", infatti anche udev utilizza hotplug. Lo stesso lo fa "hal".
Come fa hotplug a caricare i moduli delle periferiche.
Se guardate in /etc/hotplug.d/default vedrete uno script chiamato default.hotplug. QUESTO é colui che si occupa di chiamare gli agenti (altri script) presenti in /etc/hotplug (NON /etc/hotplug.d). Sono essi che si occupano di caricare i moduli relativi a quell'evento (come funzionano lo spiego dopo).
MA QUESTO AVVIENE solo quando una periferica viene inserita a kernel giá completamente avviato (tipo quelle usb).
Ma molte periferiche vengono viste dal kernel mentre si sta avviando, quando esso non puó ancora accedere all'harddisk e quindi invocare hotplug (oltre al fatto che non sarebbe ancora configurato dagli script di init).
Allora come fanno a essere caricati i moduli?
Questa funzione viene detta "ColdPlug" per distinguerla dall'hotplug. In pratica il servizio in /etc/init.d/hotplug invoca tutti gli script con estensione ".rc" presenti in /etc/hotplug.
Questi script ".rc" guardano nel procfs (kernel 2.4) o nel sysfs (kernel 2.6) per ricavare le variabili di ambiente necessarie e chiamano gli script ".agent".
Come funzionano gli "agenti" ?
Un agente riceve in pratica le informazioni necessarie per discriminare una periferica (ogni periferica possiede uno o piú id che la identifica in modo abbastanza univoco, ovvviamente il metodo cambia da tipo a tipo, quelle con piú informazioni sono quelle usb).
Da queste informazioni esso deve ricavare il modulo associato a quella periferica.
Per fare ció esso va a vedere nei files presenti in /lib/module/`uname -r`/modules.XXXXmap (XXXX = pci, usb ...) .
Questi file vengono generati da depmod solitamente quando si da un "make modules_install", e comunque ogni volta che viene avviato il sistema viene lanciato depmod dagli script di init, quando dice "Calculating modules dependencies".
Se guardate questi file vedrete che ogni riga inizia col nome del modulo e in seguito ci sono vari numeri esadecimali, essi sono gli id di tutte le periferiche supportate da quel modulo.
Confrontando questi valori con quelli passati, l'agente riesce a determinare il modulo e a caricarlo (con modprobe).
I moduli, per esportare gli id, utilizzano al loro interno la macro MODULE_DEVICE_TABLE, a cui passano uno struttura dati (definita in un determinato modo) contenente gli id. Grazie a questo depmod riesce a generare i file con gli id.
Conclusione.
Ci sarebbero tante altre cose da dire, ma mi sembra giá troppo lungo, comunque per ogni dubbio chiedete e (se lo so) vi risponderó.
Spero comunque che vi ritorni utile.






