# Een simpel prototype

## Analyse

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 één benoemen.

- Houd het simpel om te voorkomen dat de belasting te groot wordt.

- Bouw iets dat werkt voor een ogenblikkelijke voldoening.

- Maak iets dat bruikbaar is in de latere fasen van het project.

## Ontwerp

### Vereenvoudiging

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 http://www.tldp.org/docs.html#howto. 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 één van onze doelen is, "houd het simpel om te voorkomen dat de belasting te groot wordt," dus we willen alles negeren, behalve de absolute kritieke delen van een boot/root disketteset.

In feite komt het neer op de volgende vereiste items:

- Een bootloader

- De Linux kernel

- Een shell

- Een aantal `/dev` bestanden

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.

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.

### Bootdisk

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ö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ëren die is voorbereid met een bestandssysteem (ala geformatteerd). Op de diskette zullen we een paar `/dev` bestanden nodig hebben en een `lilo.conf` bestand om LILO geïnstalleerd te krijgen. De Bootdisk-HOWTO en de lilo.conf(5) manpage zullen behulpzaam zijn bij het ontwerpen van het `lilo.conf` bestand.

### Rootdisk

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 `configure` programma in de broncode van BASH herkent voor deze feature de optie `--enable-static-link`. We zullen ook gebruik maken van de optie `--enable-minimal-config` om de BASH binary tot een beheerbare omvang te houden. Aanvullende vereisten voor de rootdisk zijn een `/dev` directory en een devicebestand voor de console. BASH heeft het device `console` nodig om met het toetsenbord en het videoscherm te kunnen communiceren.

### CPU compatibiliteit

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 `README` 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.

## Constructie

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

### Prepareer de bootdisk diskette

Doe een lege diskette met als label "bootdisk" in het diskettestation.

    bash# mke2fs -m0 /dev/fd0
    bash# mount /dev/fd0 /mnt

### Bouw de kernel

    bash# cd /usr/src/linux
    bash# make menuconfig

Zorg dat je de volgende ondersteuning configureert:

- 386 processor

- Floppy disk

- RAM disk

- Console op virtuele terminal

    bash# make dep
    bash# make clean
    bash# make bzImage

### Kopieer de kernel naar diskette

    bash# mkdir /mnt/boot
    bash# cp /usr/src/linux/arch/i386/boot/bzImage /mnt/boot/vmlinuz

### Kopieer de LILO bootloader

    bash# cp /boot/boot.b /mnt/boot/boot.b

### Maak de devicebestanden aan die LILO nodig heeft

    bash# mkdir /mnt/dev
    bash# cd /mnt/dev
    bash# mknod fd0 b 2 0
    bash# mknod console c 5 1

### Schrijf een simpel lilo.conf

    bash# mkdir /mnt/etc
    bash# cd /mnt/etc

Gebruik een editor als vi, emacs of pico om het volgende `lilo.conf` bestand aan te maken:

    # /etc/lilo.conf - bootloader configuratiebestand
    #
    boot=/dev/fd0
    compact
    prompt
    read-only
    vga=normal
    image=/boot/vmlinuz
    label=bootdisk
    append="load_ramdisk=1 prompt_ramdisk=1"
    root=/dev/fd0
    #
    # einde van /etc/lilo.conf

### Installeer de LILO bootloader

    bash# lilo -r /mnt

### Unmount de bootdisk

    bash# cd /
    bash# umount /mnt
    bash# sync

### Prepareer de rootdisk diskette

Doe een lege diskette gelabeld "rootdisk" in het diskettestation.

    bash# mke2fs -m0 /dev/fd0
    bash# mount /dev/fd0 /mnt

### Bouw BASH

Haal vanaf ftp://ftp.gnu.org/gnu/bash/ het package op met de broncode van bash-2.05 en pak het uit in de directory `/usr/src`.

BASH versie 2.05b, de laatste versie op moment van schrijven, zal bij gebruik van de de optie `--enable-minimal-config` 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 "Compile error in execute_cmd.c with --enable-minimal-config" of we kunnen eenvoudigweg gebruik maken van versie 2.05a.

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

### Kopieer BASH naar de rootdisk

    bash# mkdir /mnt/bin
    bash# cp bash /mnt/bin/bash
    bash# ln -s bash /mnt/bin/sh

### Maak de device bestanden aan die BASH nodig heeft

    bash# mkdir /mnt/dev
    bash# mknod /mnt/dev/console c 5 1

### Unmount de rootdisk

    bash# cd /
    bash# umount /mnt
    bash# sync

## Implementatie

### Systeemstart

Volg deze stappen voor het booten van het systeem:

- Herstart de PC met de bootdisk in het diskettestation.

- Typ `bootdisk init=/bin/sh` en druk op Enter zodra de LILO-prompt verschijnt.

- Doe de rootdisk in het diskettestation wanneer dit wordt aangegeven.

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

    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
    # _

### Test wat werkt

Probeer een paar van de interne opdrachten van BASH's om te testen of het goed werkt.

    bash# echo "Hello World"
    bash# cd /
    bash# pwd
    bash# echo *

### Opmerken wat er niet werkt

Probeer een paar andere bekende opdrachten.

    bash# ls /var
    bash# mkdir /var/tmp

Merk op dat alleen de interne opdrachten van BASH werkelijk werken en dat externe opdrachten zoals `ls` en `mkdir` 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.

### Systeem afsluiten

Verwijder de diskette uit fd0 en herstart het systeem met CTRL-ALT-DELETE.