Nonostante kerneld venga fornito con informazioni già pronte sui tipi più comuni di moduli, ci sono situazioni in cui non saprà come trattare una richiesta del kernel. Questo accade per moduli tipo il driver per il CD-ROM o i driver di rete, dove ci sono più di un possibile modulo da poter caricare.
Le richieste che il demone kerneld riceve dal kernel possono appartenere ad uno dei seguenti tipi:
driver di periferica a blocchi
driver di periferica a caratteri
formato binario
disciplinea di linea tty
filesystem
periferica di rete
servizio di rete (per esempio rarp)
protocollo di rete (per esempio IPX)
kerneld determina quale modulo dobba essere caricato cercando nel file di configurazione /etc/conf.modules[1]. Ci sono due tipi di voci possibili in questo file: path (dove si trovano i file dei moduli) e alias (quale modulo dovrebbe essere caricato per un dato servizio). Se non si possiede già questo file, è possibile crearlo con il comando:
/sbin/modprobe -c | grep -v '^path' /etc/conf.modules |
Se si deisdera aggiungere un'altra direttiva «path» ai percorsi di default, si deve anche includere tutti gli altri percorsi di «default» in quanto una direttiva «path» in /etc/conf.modules rimpiazzerà tutti quelli che modprobe conosce per default!
Normalmente non si avrà bisogno di aggiungere alcun percorso, in quanto l'insieme di quelli precompilati dovrebbe essere sufficiente per tutte le configurazioni «normali» (ed altre ancora...). Promesso!
Diversamente, se si desidera aggiungere un «alias» o una direttiva «option», le nuove voci in /etc/conf.modules verranno aggiunte a quelle che modprobe già conosce. Se si deve ridefinire un «alias» o «options», le nuove voci in /etc/conf.modules sovrascriveranno quelle precompilate.
Se viene eseguito /sbin/modprobe -c, si otterrà una lista di moduli conosciuti da kerneld e di richieste alle quali questi corrispondono. Per esempio, la richiesta che termina con il caricamento del driver per il floppy è per la periferica a blocchi con major number pari a 2:
osiris:~ $ /sbin/modprobe -c | grep floppy alias block-major-2 floppy |
Perché block-major-2? Perché le periferiche floppy /dev/fd* usano dispositivi con major 2 e sono periferiche a blocchi:
osiris:~ $ ls -l /dev/fd0 /dev/fd1 brw-rw-rw- 1 root root 2, 0 Mar 3 1995 /dev/fd0 brw-r--r-- 1 root root 2, 1 Mar 3 1995 /dev/fd1 |
Le periferiche a caratteri sono trattate in modo analogo. Per esempio il driver per l'unità a nastro connessa come floppy ha un major di 27:
osiris:~ $ ls -lL /dev/ftape crw-rw---- 1 root disk 27, 0 Jul 18 1994 /dev/ftape |
Però kerneld non conosce nulla per default del driver per l'unità a nastro. Infatti non è presente nella lista ottenuta con /sbin/modprobe -c. Cosí per impostare kerneld affinché carichi il driver per l'unità a nastro, si deve aggiungere una linea al file di configurazione di kerneld, /etc/conf.modules:
alias char-major-27 ftape |
È possibile anche usare il nome della periferica al posto di impostazioni come char-major-xxx o block-major-yyy. Questo è particolarmente utile per i driver di rete. Per esempio un driver per una scheda di rete tipo ne2000 abilitata come eth0 verrebbe caricato con
alias eth0 ne |
Se si necessita di passare alcune opzioni al driver (per esempio per informare il modulo su quale IRQ la scheda di rete sta usando) aggiungere una linea "options":
options ne irq=5 |
Questo farà in modo che kerneld carichi il driver NE2000 con il comando:
/sbin/modprobe ne irq=5 |
Ovviamente le opzioni effettivamente disponibili sono specifiche al modulo che si carica.
I formati binari sono trattati in modo simile. Ogni volta che si prova a lanciare un programma che kerneld non sa come caricare, kerneld riceve una richiesta per binfmt-xxx, dove xxx è un numero determinato dai primi byte dell'eseguibile. Così la configurazione di kerneld per supportare il modulo binfmt_aout per gli eseguibili ZMAGIC (a.out) è:
alias binfmt-267 binfmt_aout |
in quanto il magic number per i file ZMAGIC è 267. Se si controlla il file /etc/magic si troverà 0413. Si tenga presente che /etc/magic usa numeri in formato ottale, mentre kerneld usa il formato decimale e il numero 413 in base ottale corrisponde al numero decimale 267.
In realtà ci sono tre varianti leggermente diverse per gli eseguibili a.out (NMAGIC, QMAGIC and ZMAGIC), cosí per un pieno supporto del modulo binfmt_aout abbiamo bisogno di:
alias binfmt-264 binfmt_aout # pure executable (NMAGIC) alias binfmt-267 binfmt_aout # demand-paged executable (ZMAGIC) alias binfmt-204 binfmt_aout # demand-paged executable (QMAGIC) |
I formati binari a.out, Java e iBCS sono riconosciuti automaticamente da kerneld senza alcuna configurazione.
Le disciplinee di linea sono richieste con tty-ldisc-x, dove x assume solitamente i valori 1 (per SLIP) o 3 (per PPP). Entrambi sono riconosciuti da kerneld automaticamente.
A proposito di ppp, se si desidera che kerneld carichi il modulo bsd_comp per la compressione dei dati per ppp, allora è necessario aggiungere le due linee seguenti al proprio /etc/conf.modules:
alias tty-ldisc-3 bsd_comp alias ppp0 bsd_comp |
Anche alcuni protocolli di rete possono essere caricati come moduli. Il kernel domanda a kerneld una famiglia di protocolli (per esempio IPX) con una richiesta del tipo net-pf-X, dove x è un numero che sta ad indicare la famiglia voluta. Per esempio net-pf-3 è AX.25, net-pf-4 è IPX e net-pf-5 è AppleTalk (questi numeri sono determinati dalle definizioni AF_AX25, AF_IPX, etc. nel file sorgente di Linux include/linux/socket.h). Così per caricare automaticamente il modulo IPX è necessario aggiungere al file /etc/conf.modules una linea come questa:
alias net-pf-4 ipx |
Si veda anche la sezione riguardante i problemi comuni per informazioni su come evitare alcuni noiosi messaggi all'avvio relativi a famiglie di protocolli indefiniti.
Le richieste di kerneld per i filesystem sono semplicemente i nomi del tipo di filesystem. Un comune uso potrebbe essere quello di caricare il modulo isofs per il filesystem del CD-ROM, cioè per il filesystem di tipo iso9660:
alias iso9660 isofs |
[1] | Alcune distribuzioni chimano questo file modules.conf |