Hoe weet kerneld welke module te laden?

Alhoewel kerneld met ingebouwde kennis wordt geleverd over de meest gebruikelijke typen modules, zijn er situaties waar kerneld niet weet hoe een verzoek van de kernel af te handelen. Dit is het geval bij bv CD-ROM drivers of netwerkdrivers, waarbij er meer dan één mogelijke module kan worden geladen.

Het verzoek dat de daemon kerneld krijgt van de kernel is voor één van de volgende items:

Kerneld stelt vast welke module moet worden geladen door het configuratiebestand /etc/conf.modules [1] te scannen. In dit bestand bevinden zich twee soorten regels: Directorypaden waar de module bestanden zijn te vinden, en aan de module toegekende aliassen die moet worden geladen voor een gegeven service. Als dit bestand nog niet bestaat, dan kun je het aanmaken door het uitvoeren van:

  /sbin/modprobe -c | grep -v '^path' /etc/conf.modules

Als je nog een andere path directive toe wilt voegen aan de standaard directorypaden, dan moet je tevens alle standaard directorypaden opnemen, aangezien een path directive in /etc/conf.modules alle paden die modprobe standaard kent zullen worden vervangen door het toegevoegde pad.

Normaal gesproken zul je zelf geen directorypaden willen toevoegen, aangezien de ingebouwde set zou moeten voorzien in alle normale setups.

Als je aan de andere kant een alias of option directive toe wilt voegen, dan zullen je nieuwe regels in /etc/conf.modules worden toegevoegd aan die modprobe reeds kent. Als je een alias of optie herdefinieert dan zullen je nieuwe regels in /etc/conf.modules de ingebouwde regels overschrijven.

Block devices

Als je /sbin/modprobe -c uitvoert, dan zul je een overzicht krijgen met de modules die kerneld kent, en met welke verzoeken zij corresponderen. Het verzoek bijvoorbeeld dat er op neerkomt dat de floppy driver wordt geladen is voor het block-device met major nummer 2:

  osiris:~ $ /sbin/modprobe -c | grep floppy
  alias block-major-2 floppy

Waarom block-major-2? Omdat de floppy devices /dev/fd* gebruik maken van major device 2 en het block devices zijn:

  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

Character devices

Met Character devices wordt op vergelijkbare wijze omgegaan. B.v. de ftape floppy tape driver neemt de plaats in van major-device 27:

  osiris:~ $ ls -lL /dev/ftape 
  crw-rw----   1 root     disk      27,   0 Jul 18  1994 /dev/ftape

Kerneld is standaard echter niet op de hoogte van de ftape driver, het wordt niet weergegeven in de uitvoer van /sbin/modprobe -c. Voor het instellen van kerneld dat het de ftape driver laadt, moet ik een regel toevoegen aan het configuratiebestand /etc/conf.modules:

  alias char-major-27 ftape

Netwerkdevices

Je kunt ook de naam van het device gebruiken in plaats van de char-major-xxx of block-major-yyy setup. Dit is vooral handig bij netwerkdrivers. Een driver voor een ne2000 netwerkkaart bijvoorbeeld, fungerend als eth0 zou worden geladen met

  alias eth0 ne

Als je een aantal opties aan de driver door moet geven, bijvoorbeeld om de module te laten weten welk IRQ de netwerkkaart gebruikt, dan moet je een "options" regel toevoegen:

  options ne irq=5

Dit zorgt ervoor dat kerneld de NE2000 driver laadt met de opdracht

  /sbin/modprobe ne irq=5

Natuurlijk zijn de werkelijke beschikbare opties specifiek voor de module die je laadt.

Binaire formaten

Binaire formaten worden op vergelijkbare wijze afgehandeld. Wanneer je een programma probeert uit te voeren waarvan de kernel niet weet hoe het te laden, dan krijgt kerneld een verzoek voor binfmt-xxx, waar xxx een nummer is dat is bepaald uit de eerste paar bytes van het uitvoerbare bestand. Dus de configuratie van kerneld om de binfmt_aout module voor ZMAGIC (a.out) uitvoerbare bestanden te laden is:

  alias binfmt-267 binfmt_aout

Het magic nummer voor ZMAGIC bestanden is 267 en als je in /etc/magic kijkt, dan zie je het nummer 0413; houdt in gedachten dat /etc/magic gebruik maakt van octale getallen terwijl kerneld gebruik maakt van decimale getallen en 413 in het octale stelsel gelijk is aan 267 in het decimale stelsel. Er zijn feitelijk drie iets andere varianten op a.out uitvoerbare bestanden (NMAGIC, QMAGIC en ZMAGIC), dus voor volledige support van de binfmt_aout module hebben we nodig

  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)

a.out, Java en iBCS binaire formaten worden automatisch zonder enige configuratie door kerneld herkend.

Lijndisciplines (slip, cslip en ppp)

Om lijndisciplines wordt verzocht met tty-ldisc-x, waarbij x gewoonlijk 1 is (voor SLIP) of 3 (voor PPP). Beiden worden automatisch herkend door kerneld.

Nu we het toch over ppp hebben, als je wilt dat kerneld de bsd_comp data compressie module voor ppp laadt, dan moet je de volgende twee regels aan /etc/conf.modules toevoegen:

  alias tty-ldisc-3 bsd_comp
  alias ppp0 bsd_comp

Netwerk protocol family's (IPX, AppleTalk, AX.25)

Tevens kunnen een aantal netwerkprotocollen worden geladen. De kernel vraagt kerneld om een protocol familie (b.v. IPX) met een verzoek om net-pf-X waarbij X een nummer is die de gewenste familie aangeeft. B.v. net-pf-3 is AX.25, net-pf-4 is IPX en net-pf-5 is AppleTalk; Deze nummers worden vastgesteld door de AF_AX25, AF_IPX enz. definities in het linux bronbestand include/linux/socket.h. Dus voor het automatisch laden van de IPX module, heb je in /etc/conf.modules een regel nodig als:

  alias net-pf-4 ipx

Zie Common Problems voor informatie over hoe je een aantal ergerlijke meldingen tijdens het booten kunt voorkomen die zijn gerelateerd aan ongedefiniëerde protocol family's.

Bestandssystemen

kerneld verzoeken om bestandssystemen bestaan simpelweg uit de naam van het type bestandssysteem. Een veelvoorkomend gebruik hiervan is het laden van de module isofs voor CD-ROM bestandssystemen, d.w.z. bestandssystemen van het type iso9660:

  alias iso9660 isofs

Notes

[1]

Een aantal distributies noemen dit bestand modules.conf