<?xml version="1.0" encoding="ISO-8859-1"?>
<chapter id="phase1">
  <title>Een simpel prototype</title>

  <sect1>
    <title>Analyse</title>

    <para>Aangezien dit de eerste fase is van het project, zal het zeer
simpel worden gebouden. Het doel is hier niet bij de eerste poging het 
definitieve GNU/Linux systeem aan te maken. In plaats daarvan zullen we een 
zeer klein, werkend systeem bouwen dat zal worden gebruikt als een 
bouwsteen in de opeenvolgende fasen van het project. 
Dit in gedachten houdend, kunnen
we een paar doelen voor fase &eacute;&eacute;n benoemen.
</para>

    <itemizedlist>
      <listitem>
        <para>Houd het simpel om te voorkomen dat de belasting te groot wordt.
</para>
      </listitem>

      <listitem>
        <para>Bouw iets dat werkt voor een ogenblikkelijke voldoening.</para>
      </listitem>

      <listitem>
        <para>Maak iets dat bruikbaar is in de latere fasen van het project.</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1>
    <title>Ontwerp</title>

    <sect2>
      <title>Vereenvoudiging</title>

      <para>Neem een moment om de Bootdisk-HOWTO of de
      From-PowerUp-to-BASH-Prompt-HOWTO vluchtig door te nemen. Deze 
HOWTO-documenten zijn online te vinden op
<ulink url="http://www.tldp.org/docs.html#howto">http://www.tldp.org/docs.html#howto</ulink>.
      Beide documenten bieden een uitstekend zicht op wat er nodig is
om een GNU/Linux systeem beschikbaar en werkend te krijgen. 
      Er is ook veel op te nemen informatie. Denk eraan dat &eacute;&eacute;n
van onze doelen is, &#34;houd het simpel om
te voorkomen dat de belasting te groot wordt,&#34; dus we willen alles 
negeren, behalve de absolute kritieke delen van een boot/root disketteset.
      </para>

      <para>In feite komt het neer op de volgende vereiste items:</para>

      <itemizedlist>
        <listitem>
          <para>Een bootloader</para>
        </listitem>

        <listitem>
          <para>De Linux kernel</para>
        </listitem>

        <listitem>
          <para>Een shell</para>
        </listitem>

        <listitem>
          <para>Een aantal <filename>/dev</filename> bestanden</para>
        </listitem>
      </itemizedlist>

      <para>We hebben zelfs geen init daemon nodig. Aan de kernel kan
worden verteld dat het de shell direct uitvoert door het een optie
door te geven via de bootloader.
      </para>

      <para>Voor een makkelijke constructie zullen we een boot/root set
bestaande uit twee disks bouwen, in plaats van alles op een enkele diskette
proberen te krijgen. De bootloader en kernel zullen we op de bootdisk
plaatsen en de shell komt terecht op de rootdisk. Voor een juiste werking
zullen op beide disks device bestanden nodig zijn.
      </para>
    </sect2>

    <sect2>
      <title>Bootdisk</title>

      <para>Voor de bootdisk willen we een kernel gebruiken waarbij geen
modules voor de hardware die we moeten kunnen benaderen nodig zijn. 
Hoofdzakelijk zou het meegecompileerde ondersteuning voor het diskettestation,
een ramdisk en een tekstge&ouml;rienteerde console moeten bevatten. Als een
dergelijke kernel niet beschikbaar is, dan moet het vanuit de broncode
worden opgebouwd met als leidraad de Kernel-HOWTO. Zodra een kernel klaar is,
kunnen we het naar een diskette kopi&euml;ren die is voorbereid met een
bestandssysteem (ala geformatteerd). Op de diskette zullen we een paar
<filename>/dev</filename> bestanden nodig hebben en een 
<filename>lilo.conf</filename> bestand om LILO ge&iuml;nstalleerd
te krijgen. De Bootdisk-HOWTO en de lilo.conf(5) manpage zullen behulpzaam
zijn bij het ontwerpen van het <filename>lilo.conf</filename> bestand.
</para>
    </sect2>

    <sect2>
      <title>Rootdisk</title>

<para>Voor de bootdisk zullen we een diskette nodig hebben welke is
voorbereid met een bestandssysteem. We zullen ook een BASH-shell nodig
hebben welke statisch is gelinkt zodat we de extra complexiteit van
gedeelde library's kunnen voorkomen. Het <command>configure</command>
programma in de broncode van BASH herkent voor deze feature de optie
<option>--enable-static-link</option>. We zullen ook gebruik maken van de optie
<option>--enable-minimal-config</option> om de BASH binary tot een beheerbare
omvang te houden. Aanvullende vereisten voor de rootdisk zijn
een <filename>/dev</filename> directory en een devicebestand voor de 
console. BASH heeft het device <filename>console</filename> nodig om met 
het toetsenbord en het videoscherm te kunnen communiceren.
</para>
    </sect2>

    <sect2>
<title>CPU compatibiliteit</title>

<para>Er is een ander, minder vanzelfsprekende vereiste die we in gedachten
moeten houden en dat is CPU compatibiliteit. 
Elke generatie CPU's kenmerkt een complexere architectuur dan zijn
voorganger. Chips van latere generaties vergeleken met een oudere 486
of 386 hebben extra registers en instructies.
Dus een kernel geoptimaliseerd voor een nieuwe, snelle 6x86 machine
zal niet draaien op oudere boxen.
(Zie het bestand <filename>README</filename> in de Linux kernel source code 
voor details.)
Ook een BASH shell gebouwd voor een 6x86 zal waarschijnlijk niet
draaien op een oudere processor. Ter voorkoming van dit probleem,
kunnen we de 386 als een kleinste gemene veelvoud CPU kiezen en alle
code voor die architectuur bouwen.
      </para>
    </sect2>
  </sect1>

  <sect1>
    <title>Constructie</title>

    <para>In deze sectie zullen we de feitelijke bootdisk en rootdisk diskettes
bouwen. Regels beginnend met <prompt>bash#</prompt> geven een shellopdracht aan.
    </para>

    <sect2>
      <title>Prepareer de bootdisk diskette</title>

      <para>Doe een lege diskette met als label &#34;bootdisk&#34; in het
diskettestation.</para>

      <para><programlisting><prompt>bash#</prompt> mke2fs -m0 /dev/fd0
<prompt>bash#</prompt> mount /dev/fd0 /mnt</programlisting></para>
    </sect2>

    <sect2>
      <title>Bouw de kernel</title>

      <para><programlisting><prompt>bash#</prompt> cd /usr/src/linux
<prompt>bash#</prompt> make menuconfig</programlisting></para>

      <para>Zorg dat je de volgende ondersteuning configureert:</para>

      <itemizedlist>
        <listitem>
          <para>386 processor</para>
        </listitem>

        <listitem>
          <para>Floppy disk</para>
        </listitem>

        <listitem>
          <para>RAM disk</para>
        </listitem>

        <listitem>
          <para>Console op virtuele terminal</para>
        </listitem>
      </itemizedlist>

      <para><programlisting><prompt>bash#</prompt> make dep
<prompt>bash#</prompt> make clean
<prompt>bash#</prompt> make bzImage</programlisting></para>
    </sect2>

    <sect2>
      <title>Kopieer de kernel naar diskette</title>

      <para><programlisting><prompt>bash#</prompt> mkdir /mnt/boot
<prompt>bash#</prompt> cp /usr/src/linux/arch/i386/boot/bzImage /mnt/boot/vmlinuz</programlisting></para>
    </sect2>

    <sect2>
      <title>Kopieer de LILO bootloader</title>

      <para><programlisting><prompt>bash#</prompt> cp /boot/boot.b /mnt/boot/boot.b</programlisting></para>
    </sect2>

    <sect2>
      <title>Maak de devicebestanden aan die LILO nodig heeft</title>

      <para><programlisting><prompt>bash#</prompt> mkdir /mnt/dev
<prompt>bash#</prompt> cd /mnt/dev
<prompt>bash#</prompt> mknod fd0 b 2 0
<prompt>bash#</prompt> mknod console c 5 1</programlisting></para>
    </sect2>

    <sect2>
      <title>Schrijf een simpel lilo.conf</title>

      <para><programlisting><prompt>bash#</prompt> mkdir /mnt/etc
<prompt>bash#</prompt> cd /mnt/etc</programlisting></para>

      <para>Gebruik een editor als vi, emacs of pico om het volgende
      <filename>lilo.conf</filename> bestand aan te maken:</para>

      <para><programlisting># /etc/lilo.conf - bootloader configuratiebestand
#
boot=/dev/fd0
compact
prompt
read-only
vga=normal
image=/boot/vmlinuz
label=bootdisk
append=&#34;load_ramdisk=1 prompt_ramdisk=1&#34;
root=/dev/fd0
#
# einde van /etc/lilo.conf</programlisting></para>
    </sect2>

    <sect2>
      <title>Installeer de LILO bootloader</title>

      <para><programlisting><prompt>bash#</prompt> lilo -r /mnt</programlisting></para>
    </sect2>

    <sect2>
      <title>Unmount de bootdisk</title>

      <para><programlisting><prompt>bash#</prompt> cd /
<prompt>bash#</prompt> umount /mnt
<prompt>bash#</prompt> sync</programlisting></para>
    </sect2>

    <sect2>
      <title>Prepareer de rootdisk diskette</title>

      <para>Doe een lege diskette gelabeld &#34;rootdisk&#34; in
het diskettestation.</para>

      <para><programlisting><prompt>bash#</prompt> mke2fs -m0 /dev/fd0
<prompt>bash#</prompt> mount /dev/fd0 /mnt</programlisting></para>
    </sect2>

    <sect2>
      <title>Bouw BASH</title>

      <para>Haal vanaf <ulink
      url="ftp://ftp.gnu.org/gnu/bash/">ftp://ftp.gnu.org/gnu/bash/</ulink>
      het package op met de broncode van bash-2.05 
      en pak het uit in de directory <filename>/usr/src</filename>.</para>


       <note>
         <para>BASH versie 2.05b, de laatste versie op moment van schrijven,
zal bij gebruik van de de optie <option>--enable-minimal-config</option>
niet met succes worden gecompileerd. Er zijn nu twee keuzes. Of we 
corrigeren 2.05b door de patch toe te passen die werd gepost op gnu.bash.bug 
onder het onderwerp &#34;Compile error in execute_cmd.c with --enable-minimal-config&#34; of we kunnen eenvoudigweg gebruik maken van versie 2.05a.
         </para>
       </note>


      <para><programlisting><prompt>bash#</prompt> cd /usr/src/bash-2.05a
<prompt>bash#</prompt> ./configure --enable-static-link \
  --enable-minimal-config --host=i386-pc-linux-gnu
<prompt>bash#</prompt> make
<prompt>bash#</prompt> strip bash</programlisting></para>
    </sect2>

    <sect2>
      <title>Kopieer BASH naar de rootdisk</title>

      <para><programlisting><prompt>bash#</prompt> mkdir /mnt/bin
<prompt>bash#</prompt> cp bash /mnt/bin/bash
<prompt>bash#</prompt> ln -s bash /mnt/bin/sh</programlisting></para>
    </sect2>

    <sect2>
      <title>Maak de device bestanden aan die BASH nodig heeft</title>

      <para><programlisting><prompt>bash#</prompt> mkdir /mnt/dev
<prompt>bash#</prompt> mknod /mnt/dev/console c 5 1</programlisting></para>
    </sect2>

    <sect2>
      <title>Unmount de rootdisk</title>

      <para><programlisting><prompt>bash#</prompt> cd /
<prompt>bash#</prompt> umount /mnt
<prompt>bash#</prompt> sync</programlisting></para>
    </sect2>
  </sect1>

  <sect1>
    <title>Implementatie</title>

    <sect2>
      <title>Systeemstart</title>

      <para>Volg deze stappen voor het booten van het systeem:</para>

      <itemizedlist>
        <listitem>
          <para>Herstart de PC met de bootdisk in het diskettestation.</para>
        </listitem>

        <listitem>
          <para>Typ <userinput>bootdisk
          init=/bin/sh</userinput> en druk op 
<keycap>Enter</keycap> zodra de LILO-prompt verschijnt.</para>
        </listitem>

        <listitem>
          <para>Doe de rootdisk in het diskettestation wanneer dit wordt
aangegeven.</para>
        </listitem>
      </itemizedlist>

      <para>Als alles goet gaat, dan is op het scherm iets vergelijkbaars
met het voorbeeld hieronder te zien:
      </para>

      <para><screen>boot: bootdisk init=/bin/sh
Loading bootdisk
Uncompressing Linux... Ok, booting kernel.
..
.. [diverse kernelmeldingen]
..
VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 1440 blocks [1 disk] into ram disk... done.
VFS: Mounted root (ext2 filesystem) readonly.
Freeing unused kernel memory: 178k freed
# _</screen></para>
    </sect2>

    <sect2>
      <title>Test wat werkt</title>

      <para>Probeer een paar van de interne opdrachten van BASH&#39;s om
te testen of het goed werkt.
      </para>

      <para><programlisting><prompt>bash#</prompt> echo &#34;Hello World&#34;
<prompt>bash#</prompt> cd /
<prompt>bash#</prompt> pwd
<prompt>bash#</prompt> echo *</programlisting></para>
    </sect2>

    <sect2>
      <title>Opmerken wat er niet werkt</title>

      <para>Probeer een paar andere bekende opdrachten.</para>

      <para><programlisting><prompt>bash#</prompt> ls /var
<prompt>bash#</prompt> mkdir /var/tmp</programlisting></para>

<para>Merk op dat alleen de interne opdrachten van BASH werkelijk
werken en dat externe opdrachten zoals <command>ls</command> en 
<command>mkdir</command> in het geheel niet functioneren.
Deze tekortkoming is iets dat kan worden aangepast in een toekomstige
fase van het project. Op het ogenblik zouden we ons gewoon kunnen amuseren
met het feit dat ons prototype boot/root disketteset werkt en dat
het niet eens zo moeilijk was om het te bouwen.
      </para>
    </sect2>

    <sect2>
      <title>Systeem afsluiten</title>

      <para>Verwijder de diskette uit fd0 en herstart het systeem met
      <keycap>CTRL</keycap>-<keycap>ALT</keycap>-<keycap>DELETE</keycap>.</para>
    </sect2>
  </sect1>
</chapter>
