<?xml version="1.0" encoding="ISO-8859-1"?>
<chapter id="phase2">
  <title>Ruimte besparen</title>

  <sect1>
    <title>Analyse</title>

<para>E&eacute;n van de keerzijden in de prototype fase van het project was dat
de disketteset niet zo heel erg bruikbaar was. De enige opdrachten die hier
werkten waren de interne opdrachten van de BASH-shell. We zouden onze
rootdisk kunnen verbeteren door opdrachten als <command>cat</command>, 
<command>ls</command>, <command>mv</command>, <command>rm</command>, enzovoort
te installeren. Helaas hebben we maar weinig ruimte. Op de huidige rootdisk
staan geen gedeelde library's, dus elk utility zou net als de BASH-shell
statisch moeten worden gelinkt. Veel grote binary's in combinatie met een
statische shell zouden al snel de weinige 1.44M beschikbare diskruimte
overschrijden. Dus ons hoofddoel in deze fase is maximaal te besparen op
de ruimte op de rootdisk en de weg te banen voor uitgebreidere 
functionaliteit in de volgende fase.
    </para>
  </sect1>

  <sect1>
    <title>Ontwerp</title>

    <para>Kijk nog eens in de Bootdisk-HOWTO en merk op hoeveel
utility's op een 1.44M diskette kunnen worden geperst. Er zijn drie
dingen die dit mogelijk maken. E&eacute;n is het gebruik van gedeelde
library's. De tweede zijn de gestripte library's en de derde is het gebruik
van een gecomprimeerd bestandssysteem. We kunnen deze technieken allemaal
gebruiken om ruimte op onze rootdisk te besparen.
    </para>

    <sect2>
      <title>Gedeelde library's</title>

<para>Als eerste zullen we de BASH-shell opnieuw moeten bouwen om
gebruik te kunnen maken van gedeelde library's. Dit keer zullen we het
zonder de optie <option>--enable-static-link</option> configureren. 
Zodra BASH eenmaal opnieuw is gecompileerd, zullen we uit moeten zoeken
met welke library's het is gelinkt en deze library's op moeten nemen
op de rootdisk. De opdracht <command>ldd</command> maakt deze taak makkelijk.
Door het op de opdrachtregel typen van <command>ldd bash</command>
krijgen we een lijst te zien met alle gedeelde library's waar BASH gebruik 
van maakt. Zolang deze library's allen naar de rootdisk worden gekopieerd, 
zou de nieuw gecompileerde BASH prima moeten werken.
</para>
    </sect2>

    <sect2>
      <title>Gestripte binary's</title>

      <para>Vervolgens zouden we binary's kunnen strippen die naar de
rootdisk worden gekopieerd. De manpage van <command>strip</command>
beschrijft niet veel
meer over wat het doet dan het &#34;strip verwerpt alle symbolen uit de
objectbestanden.&#34; Het lijkt of het verwijderen van delen uit een binary
het als onbruikbaar achterlaat, maar dit is niet het geval. De reden dat
het werkt, komt doordat een groot aantal van deze verworpen symbolen
wordt gebruikt voor het opsporen van programmeerfouten. Ondanks dat deze
debugging symbolen zeer behulpzaam zijn voor programmeurs die er ter
verbetering van de code mee werken, doen ze voor de gemiddelde gebruiker
niet veel meer dan het innemen van meer diskruimte.
En aangezien ruimte op een diskette een toegift is, kunnen we beslist
maar beter zoveel mogelijk symbolen uit BASH en andere binaire bestanden
verwijderen voordat we ze naar de ramdisk kopi&euml;ren.
      </para>

<para>
Het proces bestaande uit het strippen van bestanden om ruimte te besparen,
werkt ok voor gedeelde library-bestanden. Maar bij het strippen van library's
is het van belang gebruik te maken van de optie
<option>--strip-unneeded</option> ter voorkoming dat ze beschadigd raken.
Met <option>--strip-unneeded</option> neemt de bestandsomvang af, maar blijven
de symbolen nodig voor het veranderen van het geheugenadres intact wat 
bij gedeelde library's voor de juiste werking nodig is.
</para>


    </sect2>

    <sect2>
      <title>Gecomprimeerd bestandssysteem</title>

      <para>Als laatste kunnen we het probleem aanpakken hoe we een
gecomprimeerd root bestandssysteem bouwen. In de Bootdisk-HOWTO worden
drie manieren aanbevolen voor het construeren van een gecomprimeerd
root bestandssysteem met behulp van een ramdisk, een vrije harddiskpartitie
of een loopbackdevice. Bij dit project zullen we ons concentreren op 
het gebruik van de ramdisk benadering. Het lijkt logisch dat als het
root bestandssysteem vanaf een ramdisk gaat worden uitgevoerd, het 
net zo goed ook op een ramdisk kan worden gebouwd. We hoeven slechts
een second extended bestandssysteem op een ramdisk device aan te maken,
het te mounten en er bestanden naar te kopi&euml;ren. 
Zodra het bestandssysteem is voorzien van alle bestanden die op de
rootdisk nodig zijn, umounten we het eenvoudigweg, comprimeren het en
schrijven het weg naar diskette.

<note>
<para>
Hiervoor moeten we zorgen dat de kernel is geconfigureerd met ondersteuning voor
de ramdisk met een standaardomvang van 4.096K.  Als de omvang van de ramdisk
iets anders is dan 4.096K, dan kan dit worden gecorrigeerd door de regel
&#34;ramdisk=4096&#34; toe te voegen aan het <filename>lilo.conf</filename>
bestand van het ontwikkelsysteem. De manpage lilo.conf(5) geeft hierover meer
informatie.</para>
</note>
      </para>
    </sect2>
  </sect1>

  <sect1>
    <title>Constructie</title>

    <para>In deze sectie wordt gebruik gemaakt van ramdisk zeven 
(<filename>/dev/ram7</filename>) om het rootimage te bouwen.
    Er is niets bijzonder speciaal aan ramdisk zeven en het
is mogelijk een van de andere beschikbare ramdisks te gebruiken 
op voorwaarde dat ze niet reeds in gebruik zijn.
    </para>

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

      <para><programlisting><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</programlisting></para>
    </sect2>

    <sect2>
      <title>Compileer de BASH-shell opnieuw</title>

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

    <sect2>
      <title>Stel vast welke library's nodig zijn</title>

      <para><programlisting><prompt>bash#</prompt> ldd bash</programlisting></para>

      <para>Let op de uitvoer van de opdracht <command>ldd</command>. 
Het zou er ongeveer uit moeten zien als in onderstaand voorbeeld.
</para>
<para>

<screen>bash# ldd bash
libdl.so.2=&#62; /lib/libdl.so.2 (0x4001d000)
libc.so.6=&#62;  /lib/libc.so.6 (0x40020000)
/lib/ld-linux.so.2=&#62; /lib/ld-linux.so.2 (0x40000000)</screen>
</para>


    </sect2>

    <sect2>
      <title>Kopieer BASH en de library's naar de ramdisk</title>

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


<prompt>bash#</prompt> strip -o /lib/libdl.so.2 /mnt/lib/libdl.so.2
<prompt>bash#</prompt> strip -o /lib/libc.so.6 /mnt/lib/libc.so.6
<prompt>bash#</prompt> strip -o /lib/ld-linux-so.2 /mnt/lib/ld-linux-so.2
<prompt>bash#</prompt> chmod +x /mnt/lib/*
</programlisting> 

<note>
<para>
<command>strip -o</command> lijkt misschien wel een vreemde manier om
library bestanden vanaf het ontwikkelsysteem naar ramdisk te kopi&euml;ren.
Tijdens het bestandstransport van de bronlokatie naar de doellokatie
stript het de symbolen. Het effect hiervan is dat de symbolen uit de
library op de ramdisk worden verwijderd, zonder dat de library's op het
ontwikkelsysteem worden gewijzigd. Helaas gaan bij het op deze wijze
kopi&euml;ren van de library's de bestandspermissies verloren, wat de reden
is van de opdracht <command>chmod +x</command> om de uitvoerbare vlag
op alle library's op de rootdisk in te stellen.
</para></note></para>
    </sect2>

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

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

    <sect2>
      <title>Comprimeer het ramdiskimage</title>

      <para><programlisting>
<prompt>bash#</prompt> cd /
<prompt>bash#</prompt> umount /dev/ram7
<prompt>bash#</prompt> sync
<prompt>bash#</prompt> dd if=/dev/ram7 of=~/phase2-image bs=1k
<prompt>bash#</prompt> gzip -9 ~/phase2-image</programlisting></para>
    </sect2>

    <sect2>
      <title>Kopieer het gecomprimeerde image naar diskette</title>

      <para>Doe de diskette met het label &#34;rootdisk&#34; in het
diskettestation fd0.</para>

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

  <sect1>
    <title>Implementatie</title>

    <sect2>
      <title>Systeemstart</title>

      <para>Volg voor het booten de volgende stappen:</para>

      <itemizedlist>
        <listitem>
          <para>Herstart de PC met behulp van de lilo bootdisk uit het
vorige hoofdstuk.
          </para>
        </listitem>

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

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

      <para>De schermuitvoer zou vergelijkbaar moeten zijn met onderstaand
voorbeeld:</para>

      <para><screen>boot: bootdisk 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) read-write.
Freeing unused kernel memory: 178k freed
# _</screen></para>
    </sect2>

    <sect2>
      <title>Verifieer de resultaten</title>

      <para>Deze nieuwe rootdisk zou exact hetzelfde moeten functioneren
als de rootdisk uit hetzelfde hoofdstuk als de implementatie succesvol was.
      Het belangrijkste verschil is dat deze gecomprimeerde rootdisk
      veel meer ruimte heeft om te groeien en we zullen deze extra ruimte
nuttig gebruiken in de volgende fase van het project.
      </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>
