<!doctype article public "-//OASIS//DTD DocBook V3.1//EN">
<article id="Modules-HOWTO"><?dbhtml filename="Modules-HOWTO.html">

  <artheader>
    <title>Linux Kernel Modules Installatie HOWTO</title>
    
    <author>
      <affiliation>
        <address>
          <email>rhw@bigfoot.com</email>
        </address>
      </affiliation>
    </author>
<author>
<firstname>Vertaald door: Ellen</firstname>
<surname>Bokhorst</surname>
</author>

    <abstract>
      <para>
        Beschrijft de installatie van Linux kernelmodules.
      </para>
    </abstract>

    <revhistory>
      <revision>
        <revnumber>1.0</revnumber>
        <date>datum onbekend</date>
        <authorinitials>rhw</authorinitials>
        <revremark>Initi&euml;le Release</revremark>
      </revision>
    </revhistory>
    
    <legalnotice>
      <para>
        Dit document wordt gedistribueerd onder de voorwaarden van de 
	GNU Free Documentation License (GFDL) en alle voorwaarden en 
	beperkingen die daarin staan zijn van toepassing.
      </para>
    </legalnotice>
    
    <keywordset>
      <keyword>Linux</keyword>
      <keyword>kernel</keyword>
      <keyword>module</keyword>
    </keywordset>
  </artheader>

  <sect1 label="1" id="purpose" >
    <title id=purpose.title>Doel van dit document</title>
    
    <para>
      Mijn ervaring met Linux en modules bestaat hieruit dat de bestaande
      documenten er niet in slagen mij naar tevredenheid een uitleg te
      geven over hoe men Linux met modules geconfigureerd en met succes werkend 
      instelt. De procedure uitgelegd in dit document is
      verscheidene malen met succes toegepast op zowel mijn eigen systeem
      als over het Internet waarbij ik iemand aanwijzigingen gaf om een
      bepaalde feature proberen werkend te krijgen waarvoor een driver nodig
      was die alleen in de vorm van een module werd geleverd.
    </para>
    
    <para>
      Op mijn eigen systeem draait een RedHat 4.1 distibutie van Linux, en
      ik ontwikkelde de procedure vanuit deze setup. Ik heb het sindsdien
      met succes op systemen ge&iuml;nstalleerd waarop diverse Slackware
      distributies draaide, en op een systeem met een Debian distributie.
      De benodigde procedure om modules correct onder Linux te configureren 
      op al deze drie is hierin gedocumenteerd.
    </para>
    
    <warning>
      <para>
       Ik heb dezelfde procedure recent met RedHat 4.2 toegepast, maar met
       inconsistente resultaten op schijnbaar identieke systemen. Ik heb 
       nog niet vastgesteld wat het probleem is, dus kan in dit stadium 
       geen garanties geven of het wel of niet op je systeem zal werken.
      </para>
    </warning>

<para>
Dit document wordt gedistribueerd onder de voorwaarden van de
GNU Free Documentation License. Je zou hiervan samen met dit document 
een kopie moeten hebben ontvangen. Zo niet, dan is het beschikbaar
vanaf
<ulink url="http://www.fsf.org/licenses/fdl.html">http://www.fsf.org/licenses/fdl.html"</ulink>
</para>

  </sect1>
  
  <sect1 label="2" id="require">
    <title id=require.title>Veronderstellingen</title>
    
    <itemizedlist>
      <listitem>
        <para>
        Voor de stappen in dit document kunnen worden toegepast, moet de
	lezer een werkende Linux installatie tot zijn beschikking hebben
        waarbij men als gebruiker <emphasis>root</emphasis> bij de Linux
	prompt kan komen, aangezien de meeste te nemen stappen alleen
	kunnen worden ondernomen door de genoemde gebruiker.
        </para>
      </listitem>
      
      <listitem>
        <para>
          De bestaande kernel kan zo worden gecompileerd dat er wel of geen
	  gebruik wordt gemaakt van modules, en er kunnen zelfs foutmeldingen
	  worden getoond tijdens de opstartprocedure als resultaat van 
	  geconfigureerde modules die op dat moment niet beschikbaar zijn, 
	  op voorwaarde dat aan de bovenstaande conditie is voldaan.
        </para>
      </listitem>
      
      <listitem>
        <para>
          Er wordt in dit document verondersteld dat het startpunt van de 
	  bronstructuur voor de huidige kernel is te vinden in 
	  <filename>/usr/src/linux</filename> en er wordt tevens vanuit
	  gegaan dat dit ook het startpunt is van een uit te voeren reeks
	  opdrachten.
        </para>
      </listitem>
    </itemizedlist>
    
  </sect1>
  
  <sect1 label="3" id="speedup">
    <title id=speedup.title>Compileertijd versnellen</title>
    
    <para>
      Als je machine met 16 of meer Megabyte RAM is uitgerust, dan kan er
      een aardige snelheidswinst worden geboekt door de kernel twee of meer
      modules parallel te laten compileren.
      Dit zal de belasting op de machine verhogen onderwijl de kernel wordt 
      gecompileerd, maar het zal de tijd bekorten die de compilatie in beslag 
      zal nemen.
    </para>
    
    <para>
      Voordat je deze methode kunt gebruiken, moet je de hoeveelheid aanwezig
      RAM op je machine controleren,  want als je dit te hoog instelt, zal het
      de compilatie vertragen. Ervaring heeft aangetoond dat de  optimale
      waarde afhankelijk is van de hoeveelheid RAM in je systeem overeenkomstig
      de volgende formule, tenminste voor systemen tot 32 Megabyte RAM,
      alhoewel dit wat conservatief kan zijn voor systemen met grotere
      hoeveelheden RAM:
    </para>

    <para>
      N = [RAM in Megabytes] / 8 + 1
    </para>

    <para>
      Voor degenen die niet zo van wiskunde houden, staan de waarden voor
      de gebruikelijke hoeveelheden RAM in de volgende tabel:
    </para>
    
    <para>
      
      <table frame="all">
        <title>Voorbeeldtabel</title>

        <tgroup cols="2">
          <colspec colname="column1">
          <colspec colname="column2">
          <thead>
            <row>
              <entry>RAM Size</entry>
              <entry>Te gebruiken waarde</entry>
            </row>
          </thead>
          <tbody>
            <row>
              <entry>16 Meg</entry>
              <entry>3</entry>
            </row>
            <row>
              <entry>24 Meg</entry>
              <entry>4</entry>
            </row>
            <row>
              <entry>32 Meg</entry>
              <entry>5</entry>
            </row>
            <row>
              <entry>40 Meg</entry>
              <entry>6</entry>
            </row>
            <row>
              <entry>48 Meg</entry>
              <entry>7</entry>
            </row>
            <row>
              <entry>56 Meg</entry>
              <entry>8</entry>
            </row>
            <row>
              <entry>64 Meg</entry>
              <entry>9</entry>
            </row>
            <row>
              <entry>80 Meg</entry>
              <entry>11</entry>
            </row>
            <row>
              <entry>96 Meg</entry>
              <entry>13</entry>
            </row>
            <row>
              <entry>112 Megs</entry>
              <entry>15</entry>
            </row>
            <row>
              <entry>128 Megs</entry>
              <entry>17</entry>
            </row>
          </tbody>
        </tgroup>
      </table>
    </para>
    
    <para>
      Wanneer je hebt besloten tot het juiste aantal, wijzig je het bestand
      <filename>/usr/src/linux/Makefile</filename> en zoek je naar de regel
      waarin thans staat:
    </para>
    
    <programlisting>
MAKE=make
    </programlisting>

    <para>
      Vervang het door:
    </para>
    
    <programlisting>
MAKE=make -j N
    </programlisting>
    
    <para>
      waar <varname>N</varname> het eerder vastgestelde getal is.
    </para>
    
  </sect1>
  
  <sect1 label="4" id="kernel">
    <title id=kernel.title>De kernel hercompileren voor gebruik met modules</title>
    
    <para>
      De kernel kan opnieuw worden geconfigureerd voor gebruik met modules
      voor alles behalve het bestandssysteem dat als root wordt gemount
      (in de meeste gevallen is dit het ext2 bestandssysteem).
    </para>
    
    <para>
      Er zijn echter bepaalde items die moeilijk juist in te stellen zijn
      als modules, dus raad ik het volgende aan om in de kernel te compileren:
    </para>

    <itemizedlist>
      <listitem>
        <para>
          Ethernet hardware drivers.
        </para>
      </listitem>
      
      <listitem>
        <para>
          SCSI CD-ROM drivers.
        </para>
      </listitem>
    </itemizedlist>
    
    <para>
      Aan de andere kant bestaan er bepaalde drivercombinaites die
      <emphasis>ALLEEN</emphasis> als modules functioneren, vooral
      combinaties bestaande uit &eacute;&eacute;n of meer uit de volgende groep:
    </para>
   
    <itemizedlist>
      <listitem>  
        <para>
          Een Parallel Printer,
        </para>
      </listitem>
     
      <listitem>
        <para>
          Een Parallel Poort drive, zoals de 
	  <emphasis>IOMEGA</emphasis> ZipDrive of
          JazzDrive, of de <emphasis>BackPack</emphasis> CD-ROM drive, en
        </para>
      </listitem>
     
      <listitem>
        <para>
          De <emphasis>PLIP</emphasis> Daemon.
        </para>
      </listitem>
    </itemizedlist>
   
    <para>
      Je zult moeten besluiten wat je in de kernel compileert en wat als
      modules, maar neem bovenstaande punten daarbij in overweging. De 
      werkelijke keuzes worden gemaakt tijdens de compilatie, door de
      tweede instructie uit de volgende reeks:
    </para>
   
    <programlisting>
cd /usr/src/linux
make menuconfig
make dep clean modules modules_install zImage
    </programlisting>
    
    <para>
      Wanneer dat is gebeurd, moeten de module afhankelijkheden in kaart
      worden gebracht. Dit
      wordt bewerkstelligd met de volgende opdracht:
    </para>
    
    <programlisting>
depmod -a
    </programlisting>
    
    <para>
      De nieuwe kernel moet nu in de bootreeks worden ingevoegd. 
      Ik veronderstel dat de lezer voor dit doel gebruik maakt van
      <application>LILO</application>, aangezien dit de
      enige bootloader is waarmee ik ervaring heb.
    </para>
    
    <para>
      Ik raad je aan de nieuw gecompileerde kernel NIET automatisch als de
      standaard Linux kernel in te voegen want als het niet functioneert,
      het dan zeer moeilijk is de Linux setup te herstellen zonder een volledig
      nieuwe installatie uit te voeren, wat niet is aan te bevelen.
      Daarom heb ik het volgende record in het bestand
      <filename>/etc/lilo.conf</filename>:
    </para>
    
    <programlisting>
image=/usr/src/linux/arch/i386/boot/zImage
  label=new
  alias=n
  read-only
  vga=ask
  optional
    </programlisting>
    
    <para>
      Dit record geeft aan dat er een OPTIONELE bootoptie is (welke zal worden
      genegeerd als de image in kwestie niet bestaat) wat het bestand
      <filename>/boot/newlinux</filename> zal booten als dit wordt gekozen,
      en het biedt de mogelijkheid de videomodus te selecteren waarin het
      zal worden geboot.
    </para>
    
    <para>
      Veronderstel het bestaan van het bovenstaande record in
      <filename>/etc/lilo.conf</filename>, de gereviseerde kernel 
      bevindt zich na de compilatie reeds op de juiste lokatie
      en het kan via de volgende opdracht worden ge&iuml;nstalleerd:
    </para>
    
    <programlisting>
lilo
    </programlisting>
    
    <para>
      Nadat dat is gebeurd, moet de lezer als volgt de volgende stappen 
      nemen die relevant zijn met betrekking tot de gekozen distributie:
    </para>

    <sect2 label="5.1" id="redhat">
      <title id=redhat.title>Debian of RedHat voor gebruik van modules configureren</title>
      
      <para>
        Voordat deze stappen worden uitgevoerd, wordt verondersteld dat die
	in <quote><link linkend="kernel" endterm="kernel.title"></link></quote>
        reeds zijn opgevolgd.
      </para>
      
      <para>
        De Debian en RedHat distributies hebben identieke bootprocedures,
	dus hebben ze ook identieke procedures voor het configureren van
	modules.
      </para>
      
      <orderedlist>
        <listitem>
          <para>
            Ingelogd als root, gebruik je je favoriete teksteditor om een
	    nieuw bestand met de naam 
	    <filename>/etc/rc.d/init.d/modules.init</filename> aan te maken
	    met de volgende inhoud:
          </para>
          
          <programlisting>
# Module initialisatie.
#
# Start de module auto-loading daemon.
/sbin/kerneld

# Mount alle thans niet gemounte auto-mounted partities.
/sbin/mount -a
          </programlisting>
        </listitem>
        
        <listitem>
          <para>
            Na het aanmaken van het bovenstaande bestand, voer je de volgende
	    stappen uit onderwijl ingelogd als root:
          </para>
        
          <programlisting>
cd /etc/rc.d
chmod 755 init.d/*
cd rc3.d
ln -s ../init.d/modules.init 05modules.init
          </programlisting>
        </listitem>
      </orderedlist>
      
      <para>
        Het systeem kan nu opnieuw worden opgestart, en wanneer het dit doet,
	zal het constateren dat modules volledig zijn ge&iuml;mplementeerd.
      </para>

    </sect2>    

    <sect2 label="5.2" id="slackware">
      <title id=slackware.title>Slackware voor gebruik van modules configureren</title>
      
      <para>
        Voordat deze stappen worden uitgevoerd, wordt verondersteld dat die
	in <quote><link linkend="kernel" endterm="kernel.title"></link></quote>
        reeds zijn opgevolgd.
      </para>
      
      <para>
        Het bestand <filename>/etc/rc.d/rc.M</filename> moet als volgt worden
	gewijzigd:
      </para>
      
      <orderedlist>
        <listitem>
          <para>
            Zo ongeveer op regel 18, staat:
          </para>
          
          <programlisting>
# Blank screen after 15 minutes idle.
/bin/setterm -blank 15
          </programlisting>
        
          <para>
            Voeg direct daarna, de volgende paragraaf in, 
	    beginnend en eindigend met de gebruikelijke lege regels:
          </para>
          
          <programlisting>
# Laad de kernel module auto-loader.
/sbin/kerneld
          </programlisting>
        </listitem>
        
        <listitem>          
          <para>
            Ongeveer 12 regels verder staat het volgende:
          </para>
          
          <programlisting>
# if there is no /etc/HOSTNAME, fall back on this default:
          </programlisting>
          
          <para>
            Onmiddelijk hiervoor, voeg je de volgende paragraaf in,
	    wederom met de gebruikelijk lege regels rondom:
          </para>
          
          <programlisting>
# Mount de resterende niet gemounte auto-mount drives.
/sbin/mount -a
          </programlisting>
        </listitem>
      </orderedlist>
      
      <para>
        Sla het bestand op wanneer de wijzigingen zijn aangebracht.
      </para>
      
      <para>
        Voor Slackware zijn geen verdere aanpassingen nodig.
      </para>
      
    </sect2>
    
    <sect2 label="5.3" id="otherdist">
      <title id=otherdist.title>Andere distributies voor gebruik van modules configureren</title>
      
      <para>
        Voordat deze stappen worden uitgevoerd, wordt verondersteld dat die
	in <quote><link linkend="kernel" endterm="kernel.title"></link></quote>
        reeds zijn opgevolgd.
      </para>
      

      <para>
        De precieze procedure voor andere distributies zijn we niet te
	weten gekomen, maar waarschijnlijk is dit gelijk aan het voorgaande.
        Om vast te stellen welke, bekijk je als volgt een weergave van de
	inhoud van de directory <filename>/etc/rc.d</filename>:
      </para>
      
      <programlisting>
cd /etc/rc.d
ls -l *.d rc.*
      </programlisting>
      
      <para>
        Uit de resulterende weergave, kun je een van de volgende drie opties
	selecteren:
      </para>
      
      <orderedlist>
        <listitem>
          <para>
            Als in deze weergave een directory met de naam
	    <filename>init.d</filename> voorkomt en nog een aantal
	    direectory's met namen die overeenkomen met
	    <filename>rc?.d</filename> waar het vraagteken kan worden
	    vervangen door enkele cijfers, en waarin
	    <emphasis>GEEN</emphasis> bestand is opgenomen met de naam
	    <filename>rc.M</filename>, dan kan die distributie worden
	    geconfigureerd voor modules door de procedure te volgen
	    onder de titel
	    <quote><link linkend="redhat" endterm="redhat.title"></link></quote>.
          </para>
        </listitem>

        <listitem>
          <para>
            Als in deze weergave geen directory is opgenomen met de
	    naam <filename>init.d</filename>, maar wel een bestand met
	    de naam <filename>rc.M</filename> dan kan die distributie
	    voor modules worden geconfigureerd door de procedures te volgen
	    die terug te vinden zijn onder de titel
	    <quote>
	    <link linkend="slackware" endterm="slackware.title"></link></quote>.
          </para>
        </listitem>

        <listitem>
          <para>
            Als deze weergave met geen van bovenstaande criteria overeenkomt,
	    dan komt in deze distributie een bootscript voor die niet in
	    deze HowTo wordt behandeld.
	    In dat geval wordt je uitgenodigd contact op te nemen met de
	    auteur van dit document om advies.
          </para>
        </listitem>
      </orderedlist>
    </sect2>
  </sect1>
</article>
