<?xml version="1.0" encoding="ISO-8859-1"?>
<chapter id="phase3">
  <title>Een aantal basisutility's</title>

  <sect1>
    <title>Analyse</title>

    <para>In het vorige hoofdstuk leek het wellicht of we niet
zo veel bewerkstelligden. Er werd veel energie gestoken in het opnieuw
ontwerpen van de rootdisk, maar de functionaliteit bleef in feite hetzelfde
als in de initi&euml;le prototypefase. De rootdisk doet nog steeds niet
zo veel. Maar we brachten veelbetekenende verbeteringen aan wanneer het
aankomt op ruimtebesparingen. In deze fase zullen we die extra ruimte
nuttig gebruiken en beginnen de rootdisk met zoveel utility's vol te proppen
als erop passen.
    </para>

    <para>De eerste twee rootdisks die we samenstelden hadden alleen interne
shell-opdrachten zoals <command>echo</command> en <command>pwd</command>. 
Voor deze fase zou het prettig zijn om een aantal van de algemeen gebruikte 
externe opdrachten zoals <command>cat</command>, <command>ls</command>,
<command>mkdir</command>, <command>rm</command> en dergelijke op de rootdisk 
te hebben. Dit in gedachten houdend kunnen we de doelen voor deze fase
als volgt defini&euml;ren:
    </para>

    <itemizedlist>
      <listitem>
        <para>Behoud alle functionaliteit van de vorige rootdisk.</para>
      </listitem>

      <listitem>
        <para>Voeg een aantal algemeen in gebruik zijnde externe opdrachten
toe.</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1>
    <title>Ontwerp</title>

    <sect2>
      <title>Bepalen van de benodigde opdrachten</title>

      <para>De eerste vraag die wellicht opkomt is, &#34;Hoe weten
we welke opdrachten nodig zijn?&#34; Het is mogelijk gewoon met 
<command>cat</command> en <command>ls</command> te 
beginnen en dan andere opdrachten te installeren wanneer we erachter komen
dat we ze nodig hebben. Maar dit is verschrikkelijk ineffici&euml;nt.
We hebben een plan of een blauwdruk nodig om vanuit te werken.
Hiervoor kunnen we ons wenden tot de Filesystem Hierarchy Standard (FHS)
      beschikbaar vanaf 
<ulink url="http://www.pathname.com/fhs/">http://www.pathname.com/fhs/</ulink>.
      De FHS dicteert welke opdrachten aanwezig zouden moeten zijn op
een GNU/Linux systeem en waar ze in de directorystructuur zouden moeten
worden geplaatst.
      </para>
    </sect2>

    <sect2>
      <title>Lokaliseren van broncode</title>

      <para>De volgende logische vraag is, &#34;Nu we weten wat we nodig 
hebben, waar halen we de broncode vandaan?&#34; 
Het antwoord op deze vraag kan worden gevonden door het Internet te
doorzoeken. Er zijn verscheidene goede Internetbronnen in omloop die ons
kunnen helpen in onze speurtocht naar broncode. Een goede plek om
te beginnen te zoeken is de Linux Software Map (LSM) op Ibiblio.
      Ibiblio&#39;s LSM zoekpagina is te vinden door te navigeren naar
<ulink url="http://www.ibiblio.org/pub/linux">http://www.ibiblio.org/pub/linux</ulink>.
      Door als trefwoorden de namen van opdrachten te gebruiken, zouden
we in staat moeten zijn met de naam en lokatie van het corresponderende
broncodepackage aan te komen.
      </para>
    </sect2>

    <sect2>
      <title>De invloed van de FHS</title>

<para>Laten we eens kijken naar de vereisten van de FHS voor de
<filename>/bin</filename> directory. De eerste paar opdrachten in de lijst 
zijn <command>cat</command>, <command>chgrp</command>, <command>chmod</command>
&#38; <command>chown</command>. 
Na deze trefwoorden te hebben gebruikt in een LSM zoekactie
komen we tot de ontdekking dat we het GNU textutils package nodig hebben
voor cat en het GNU fileutils package voor <command>chmod</command>, 
<command>chrp</command> &#38; <command>chown</command>.
In feite komen aardig wat opdrachten in <filename>/bin</filename> uit 
GNU fileutils.
      Dus een goede manier om het probleem aan te pakken betreffende het
op zoek gaan naar de broncode zou kunnen zijn de opdrachten per package
te groeperen, zoals hieronder wordt getoond.
</para>

      <itemizedlist>
        <listitem>
          <para>De BASH shell -- <command>echo</command>, <command>false</command>, <command>pwd</command>, <command>sh</command>, <command>true</command></para>
        </listitem>

        <listitem>
          <para>GNU textutils -- <command>cat</command></para>
        </listitem>

        <listitem>
          <para>GNU fileutils -- <command>chgrp</command>, <command>chmod</command>, <command>chown</command>, <command>cp</command>, <command>dd</command>, 
<command>df</command>, <command>ln</command>, <command>ls</command>,
<command>mkdir</command>, <command>mknod</command>, <command>mv</command>, 
<command>rm</command>, <command>rmdir</command>, <command>sync</command></para>
        </listitem>

        <listitem>
          <para>GNU sh-utils -- <command>date</command>, <command>hostname</command>, <command>stty</command>, <command>su</command>, <command>uname</command></para>
        </listitem>
      </itemizedlist>

<para>Deze vier packages bevatten niet alle opdrachten in de 
<filename>/bin</filename> directory, maar ze vertegenwoordigen er meer dan 
70% van. Dat zou voldoende moeten zijn voor het bewerkstelligen van ons doel
in het toevoegen van een aantal van de algemeen in gebruik zijnde
externe opdrachten. We kunnen ons in latere fasen van het project
altijd nog bezig houden met de resterende opdrachten.
      </para>
    </sect2>
  </sect1>

  <sect1>
    <title>Constructie</title>

    <para>In plaats van het direct kopi&euml;ren van de bestanden naar de
ramdisk, kunnen we het makkelijker maken door een fasegebied op te zetten.
    Het fasegebied zal ons ruimte geven om te werken zonder ons druk te
hoeven maken over de ruimtebeperkingen van de ramdisk.
    Het zal ook voorzien in een manier om ons werk op te slaan en
het makkelijker maken om de rootdisk in latere fasen van het project
uit te breiden.
    </para>

    <para>De faseprocedure werkt als volgt:</para>

    <orderedlist>
      <listitem>
        <para>Maak een directorystructuur aan gedefinieerd in de FHS.</para>
      </listitem>

      <listitem>
        <para>Kopieer de bestanden vanaf de rootdisk uit fase 2.</para>
      </listitem>

      <listitem>
        <para>Bouw de vier nieuwe packages vanuit de broncode.</para>
      </listitem>

      <listitem>
        <para>Installeer de bestanden naar de correcte FHS directory's.</para>
      </listitem>

      <listitem>
        <para>Strip de binary's om ruimte te besparen.</para>
      </listitem>

      <listitem>
        <para>Controleer op library afhankelijkheden.</para>
      </listitem>

      <listitem>
        <para>Kopieer de gehele directorystructuur naar de ramdisk.</para>
      </listitem>

      <listitem>
        <para>Comprimeer de ramdisk en schrijf het weg naar diskette.</para>
      </listitem>
    </orderedlist>

    <sect2>
      <title>Maak een fasegebied aan</title>

<para><programlisting>
<prompt>bash#</prompt> mkdir ~/fase
<prompt>bash#</prompt> cd ~/fase
<prompt>bash#</prompt> mkdir bin boot dev etc home lib mnt opt proc root sbin tmp usr var
<prompt>bash#</prompt> mkdir var/log var/run</programlisting></para>
    </sect2>

    <sect2>
      <title>Kopieer de inhoud van de rootdisk uit fase 2</title>

<para><programlisting>
<prompt>bash#</prompt> dd if=~/phase2-image.gz | gunzip -c &#62; /dev/ram7
<prompt>bash#</prompt> mount /dev/ram7 /mnt
<prompt>bash#</prompt> cp -dpR /mnt/* ~/fase
<prompt>bash#</prompt> umount /dev/ram7
<prompt>bash#</prompt> rmdir ~/fase/lost+found</programlisting></para>
    </sect2>

    <sect2>
      <title>Installeer &#34;cat&#34; uit GNU Textutils</title>

<para><programlisting>
<prompt>bash#</prompt> cd /usr/src/textutils-2.1
<prompt>bash#</prompt> ./configure --host=i386-pc-linux-gnu
<prompt>bash#</prompt> make
<prompt>bash#</prompt> cd src
<prompt>bash#</prompt> cp cat ~/fase/bin</programlisting></para>
    </sect2>

    <sect2>
      <title>Installeer de binary's uit GNU fileutils</title>

<para><programlisting>
<prompt>bash#</prompt> cd /usr/src/fileutils-4.1
<prompt>bash#</prompt> ./configure --host=i386-pc-linux-gnu
<prompt>bash#</prompt> make
<prompt>bash#</prompt> cd src
<prompt>bash#</prompt> cp chgrp chmod chown cp dd df ln ls ~/fase/bin
<prompt>bash#</prompt> cp mkdir mkfifo mknod mv rm rmdir sync ~/fase/bin</programlisting></para>
    </sect2>

    <sect2>
      <title>Installeer binary's uit sh-utils</title>

      <para><programlisting><prompt>bash#</prompt> cd /usr/src/sh-utils-2.0
<prompt>bash#</prompt> ./configure --host=i386-pc-linux-gnu
<prompt>bash#</prompt> make
<prompt>bash#</prompt> cd src
<prompt>bash#</prompt> cp date hostname stty su uname ~/fase/bin</programlisting></para>
    </sect2>

    <sect2>
      <title>Kopieer aanvullende library's</title>

      <para><programlisting><prompt>bash#</prompt> ldd ~/fase/bin/cat
<prompt>bash#</prompt> ldd ~/fase/bin/ls
<prompt>bash#</prompt> ldd ~/fase/bin/su
<prompt>bash#</prompt> ls ~/fase/lib
<prompt>bash#</prompt> cp /lib/librt.so.1 ~/fase/lib
<prompt>bash#</prompt> cp /lib/libpthread.so.0 ~/fase/lib
<prompt>bash#</prompt> cp /lib/libcrypt.so.1 ~/fase/lib</programlisting></para>
    </sect2>

    <sect2>
      <title>Strip binary's en libary's</title>

      <para><programlisting><prompt>bash#</prompt> strip ~/fase/bin/*
<prompt>bash#</prompt> strip --strip-unneeded ~/fase/lib/*</programlisting></para>
    </sect2>

    <sect2>
      <title>Maak een gecomprimeerd rootdiskimage aan</title>

<para><programlisting>
<prompt>bash#</prompt> cd /
<prompt>bash#</prompt> dd if=/dev/zero of=/dev/ram7 bs=1k count=4096
<prompt>bash#</prompt> mke2fs -m0 /dev/ram7
<prompt>bash#</prompt> mount /dev/ram7 /mnt
<prompt>bash#</prompt> cp -dpR ~/fase/* /mnt
<prompt>bash#</prompt> umount /dev/ram7
<prompt>bash#</prompt> dd if=/dev/ram7 of=~/phase3-image bs=1k
<prompt>bash#</prompt> gzip -9 ~/phase3-image</programlisting></para>
    </sect2>

    <sect2>
      <title>Schrijf het rootdiskimage naar diskette</title>

      <para>Doe de diskette met het label &#34;root disk&#34; in het
station fd0.</para>

      <para><programlisting><prompt>bash#</prompt> dd if=~/phase3-image.gz of=/dev/fd0 bs=1k</programlisting></para>
    </sect2>
  </sect1>

  <sect1>
    <title>Implementatie</title>

    <para>We zullen voor de werking van een aantal opdrachten een read-write
bestandssysteem nodig hebben. Het normale functioneren van de kernel
is root read-only te mounten, maar we kunnen dit wijzigen met behulp van
een kerneloptie. Door aan LILO <parameter>rw</parameter> door te geven voor 
<parameter>init=/bin/sh</parameter> zullen we een read-write root 
bestandssysteem krijgen.
    </para>

    <sect2>
      <title>Systeemstart</title>

      <para>Volg de volgende stappen voor het activeren van het systeem.
</para>

      <itemizedlist>
        <listitem>
          <para>Boot de PC met behulp van de LILO bootdisk.</para>
        </listitem>

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

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

      <para>De terminalweergave zal er ongeveer uitzien zoals in het
volgende voorbeeld.</para>

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

    <sect2>
      <title>Nieuwe opdrachten testen</title>

      <para>Probeer een aantal nieuwe opdrachten te gebruiken nu het systeem
      beschikbaar en werkend is.
      </para>

<para><programlisting>
<prompt>bash#</prompt> uname -a
<prompt>bash#</prompt> ls /etc
<prompt>bash#</prompt> echo &#34;PocketLinux&#34; &#62; /etc/hostname
<prompt>bash#</prompt> hostname $(cat /etc/hostname)
<prompt>bash#</prompt> uname -n
<prompt>bash#</prompt> mkdir /home/stuff
<prompt>bash#</prompt> cd /home/stuff</programlisting></para>

<para>Als alles goed gaat dan zouden de opdrachten <command>cat</command>,
<command>ls</command> en <command>hostname</command> nu moeten werken. 
Zelfs <command>mkdir</command> zou nu moeten werken aangezien het
root bestandssysteem read-write is gemount. Aangezien we gebruik maken van
een ramdisk zullen alle wijzigingen die we aanbrengen verloren gaan 
zodra de PC wordt gereset.
      </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>
