Bootstrapper 5: Knoppix jezelf!

Een CD branden, dat kan iedereen wel -- met dank aan de vele tools die voor de consumtentenmarkt zijn ontwikkeld is dat een eitje. Het maken van een bootable CD is weer een heel ander verhaal. Om nog maar te zwijgen van een eigen CD met al je favouriete tools.
| posted on Wed, 01 Sep 2004, 00:00 | weblog | rss | spin-off | comments |
Translate to English Translate to English

In het verleden hebben we al veel voordeel gehad van de instant-Linux distributie die Knoppix bood, maar we hebben ook een paar maal vanuit die omgeving een programma moeten downloaden en bouwen. Dat is geen probleem voor uitzonderingssituaties, maar als je dat werk zou moeten doen om een bepaalde verandering in een hele reeks PC's door te voeren dan wordt het snel vervelend. Daardoor kan de behoefte ontstaan om zelf een CD te bouwen waar vanaf geboot kan worden. Dat kan volledig vanaf de grond opgebouwd worden, maar het kan ook op basis van Knoppix.

Nog altijd met floppy disks

Hoewel een CD veel mooier glimt dan een floppy, wordt bij het booten ervan nog steeds veelvuldig gebruik gemaakt van een floppy image die bootbaar moet zijn. Daar zullen we dus eerst eens naar gaan kijken voordat we een CD gaan branden.

Als je een bootschijfje wilde maken onder MS-DOS dan deed je dat met deze opeenvolging van commando's:

format a:
sys a:

Hierna was de floppy ingedeeld volgens de gebruiken van MS-DOS en vervolgens voorzien van de nodige bestanden met software voor het booten, alsmede een bootsector helemaal aan het begin, die door een opstartende PC kon worden ingelezen.

Iets dergelijks doe je ook met een floppy die Linux moet booten. Je formatteert een floppy met het gewone MS-DOS filesysteem, maar je vervangt het sys-commando door het commando dat een voor Linux geschikte bootstrap op de schijf plaatst:

syslinux a:

Dit commando plaatst bootcode op de floppy. Of op een USB-geheugenstokje trouwens. Die bootcode leest een paar files in: een syslinux.cfg met configuratie-informatie en op verzoek daarvan wordt doorgaans een ander bestand afgebeeld op het scherm, doorgaans met een keuzemenu. Er zijn aanpassingen op syslinux gemaakt waarmee die uit zo'n afgebeeld bestand zelfs bepaalde escape-codes kan accepteren om plaatjes op het scherm te zetten; daarmee kan de syslinux bootstrapper zelfs een grafisch welkomstscherm bieden.

Typisch bestaat de configuratie van een syslinux op een bootfloppy uit een verwijzing naar een kernel en een bestand met een gecomprimeerde, initi"ele ramdisk. In de configuratie verbindt syslinux zulke tweetallen met een korte naam, die je op de bootprompt kunt intikken om je systeem met de desbetreffende kernel/startdisk aan te roepen zonder dat je daarvan de filenamen hoeft in te geven. De bootprompt wordt heel vaak getoond zelfs als er maar 'e'en bootmogelijkheid is; het blijft daardoor namelijk mogelijk om argumenten in te geven die aan de kernel worden doorgegeven. De rijkdom aan mogelijkheden die dat oplevert is te vinden onder de kernel documentatie, die op een Linux systeem met ge"installeerde kernel-sources te vinden is onder

/usr/src/linux/Documentation/kernel-parameters.txt

Een evenzeer nuttig stuk documentatie is de uitleg van de initi"ele ramdisk, onder

/usr/src/linux/Documentation/initrd.txt

Dit legt in heel veel detail uit hoe zo'n ramdisk kan worden gebruikt voor het scannen van hardware en vervolgens inlezen van driver-modules in de kernel, hoe daarna de werkelijke root partitie kan worden ingemount als subdirectory en hoe vervolgens overgestapt kan worden op die rootdirectory.

Het overstappen op een andere rootdirectory wordt bij bootstrappen doorgaans niet gedaan met chroot, maar met een variant daarop, pivot_root. Dat is een wisseltruc van rootdirectories, waarbij de oude root directory op een subdirectory van de nieuwe root wordt gemount. Het handige daaraan is dat hij daarna ge"unmount kan worden, zodat de bijbehorende resources vrijgegeven kunnen worden als die verder niet meer nodig zijn; dat is erg prettig als dat bijvoorbeeld een initi"ele ramdisk is.

Booten vanaf de bodem

De standaard die voorschrijft hoe een bootable CD er uit moet zien heet El Torito. In het kort komt het erop neer dat een image van een floppy of harde schijf op de CDROM moet staan, en dat die door het systeem wordt opgestart als ware het een bootdevice. Eenmaal opgestart leest zo'n image dan de nodige drivers is om de CD aan te spreken en de rest van de daarop bevatte informatie uit te buiten.

De images krijgen een behandeling als floppy wanneer ze 1,2 MB, 1,44 MB of 2,88 MB groot zijn. Alle andere afmetingen leiden tot een afhandeling als harddisk. Deze images neem je doorgaans gewoon op tussen de informatie op een CD, en als je later de ISO-image maakt verwijs je erheen. Door dit te doen wordt vanuit de 'boot catalog' een verwijzing gemaakt naar dat image, en daar kan een BIOS dan mee overweg. Overigens kunnen er in theorie meerdere images in de boot catalog worden geplaatst met een boot loader als default ingesteld, maar daarvoor moet de BIOS wel in staat zijn om conform de El Torito standaard een doorstart te maken naar een volgend image (na die van de boot loader) -- maar dat blijkt in bedroevend weinig BIOSsen netjes uitgewerkt.

Als je onder Linux een ISO-image genereert kun je gebruik maken van de optie -b om te verwijzen naar het boot-image; je moet bovendien met -c een naam geven van een (door mkisofs te genereren) boot catalog:

mkisofs -b boot/bootflop.img -c boot/boot.cat ...

Wil je overigens gebruik maken van een bootmenu dan is isolinux een goede optie, die veel wordt gebruikt in de open source wereld. Dit is een variant op syslinux die hetgeen anders op de syslinux-bootflop zou staan nu opslaat op de CD-ROM. Dat werkt natuurlijk alleen op BIOSsen die al van meet af aan met de CD overweg kan -- maar dat is tegenwoordig heel gewoon. De configuratie van syslinux en isolinux verloopt verder eender.

Laat je overigens niet door het deel 'linux' in deze bootstrapper-namen om de tuin leiden -- hoewel dit tegen Linux aanleunt, is er geen reden waarom je er geen DOS of Windows mee zou kunnen booten. Dat is eigenlijk hetzelfde verhaal als voor de Lilo bootstrapper, wiens naam een afkorting is van linux-loader.

Een goede testaanpak voor een opzet op basis van syslinux/isolinux is om eerst de image op een werkelijke floppy te ontwikkelen, om die pas met bovenstaande mkisofs instructie aan de CD toe te voegen wanneer het werkt. Dat scheelt een hoop brandwerk.

Knoppix en ander spul

Knoppix is gemaakt door aanhangers van vrije software. Nu zijn de meningen over wat vrijheid is nogal verdeeld. De GNU-school gaat er prat op dat vrije software niet aan andere software gelinkt mag worden, hoewel gezamenlijke distributie doorgaans weer wel mag; tegelijkertijd staat de BSD-school op het standpunt dat iedereen alles moet kunnen combineren en dat aan delen ook best geld mag worden verdiend.

Omdat Knoppix voor een groot deel uit GNU-gelicenseerde software bestaat mag daar niet altijd zomaar commerciele software aan gelinkt worden, tenminste niet door de partij die de images distribueert. De gebruiker mag dat wel altijd zelf doen. Je ziet hier een stukje van de schijnbare aannaame in het GNU-project, dat elke gebruiker een potenti"ele ontwikkelaar is.

In de praktijk valt het zelf samenstellen van een CD natuurlijk wel binnen de reikwijdte van een systeembeheerder. En dat valt ook wel mee -- Knoppix kent een aantal punten waarin het open staat voor invloeden van buitenaf, en zelfs met een ongewijzigde CD als basis zijn toevoegingen zelf te maken, bijvoorbeeld middels een floppy, harde schijf of USB-geheugenstokje.

Persistent home directory

In eerdere afleveringen hebben we weleens software gedownload en onder Knoppix gecompileerd. Dit alles gebeurde in de home directory van de gebruiker knoppix. Die home directory stond in de RAM-disk, dus wat daar gebeurt is na een reboot verdwenen, bijvoorbeeld wanneer je op een andere PC hetzelfde wilt doen.

Dit is te ondervangen door een home directory aan te maken. Het desktopmenu van Knoppix biedt een kans om de home directory persistent te maken. Dat kan een heel device innemen, of wat vaak praktischer is, op een FAT- of Linux-partitie kan een bestand knoppix.img worden gemaakt van een geschikte afmeting, waarin de home directory van de knoppix-gebruiker dan komt te staan. Een als eerste ingestoken geheugenstokje krijgt meestal devicenaam /dev/sda1 en een volgende is /dev/sdb1, terwijl een floppy /dev/fd0 heet. Bij het booten kun je een daarop aanwezige home directory inmounten door op de boot-prompt in te tikken

knoppix home=/dev/sda1

of, als je automatisch wilt laten zoeken naar een bestand met naam knoppix.img, met

knoppix home=scan

Omwille van de veiligheid is dit geen standaard uitgevoerde scan, want Knoppix draait natuurlijk wel met de rechten van de systeembeheerder.

De knoppix.img file werkt overigens via een zogenaamd loopback-device. Dat houdt in dat de file wordt aangemeld (via het losetup commando) als /dev/loopN, met N een cijfer. Dat is dan een blokdevice, die vervolgens met mount in de directorystructuur kan worden ingehangen. Overigens kan dat ook meteen met een extra optie voor mount:

mount -o loop /mnt/sda1/knoppix.img /home/knoppix

Op deze manier is knoppix.img ook in te lezen onder een andere Linux-distributie. Het is maar een weet.

In de eigen home directory kun je overigens ook een bestand .bashrc aanmaken, dat gedraaid wordt zodra een bash, dus een commandline shell, wordt gestart. Hiermee is het dus mogelijk alvast instellingen te maken aan bijvoorbeeld environment variabelen.

Een eigen bootscript

Iets wat je niet moet proberen te doen in een .bashrc is het opstarten van een achtergrondprogramma, want dan zou dat voor elke opgestarte shell worden gedraaid, en meestal wil je dat slechts eenmalig doen -- dan is .bash_login een geschikter script. Je kunt ook nog wat rommelen met locks of met touch, als in:

# Start de tralala daemon
if [ ! -r /tmp/tralala ]
then touch /tmp/tralala
     /home/knoppix/bin/tralala.d
fi

Dit werkt echter snel problemen in de hand als je per ongeluk dubbelklikt op je shell-icoon, omdat dan twee shells nagenoeg tegelijkertijd opstarten. Het opstarten van achtergrondprogramma's kun je daarom netter regelen bij het opstarten van Linux.

Ook hiervoor biedt Knoppix een paar ingangen. De meest flexibele lijkt heel erg op de homedirectory; een bestand knoppix.sh wordt automatisch op een goed moment tijdens de boot uitgevoerd wanneer je opstart met

knoppix myconfig=/dev/sda1

of

knoppix myconfig=scan

Een interessante extra mogelijkheid in dit geval is om in de directory KNOPPIX van de CD zo'n script op te nemen. Dat script wordt dan ook gedraaid als er geen opties meegegeven worden bij de boot, want dat is wel veilig omdat het van de CD zelf komt. Dit is relatief simpel zelf te bewerkstelligen, want iedereen kan wel een nieuwe ISO-image maken dat een bestand extra bevat. Let wel op het vermelden van de boot-image; voor Knoppix is dat

mkisofs -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat ...

Een eigen prefix inrichten

Unix-systemen (en dus ook Linux) hebben directories die als 'prefix' gelden. Dat zijn directories met subdirectories als bin, lib, share en soms ook etc, sbin en man. Het is een beetje vrije-vorm, maar een gemiddeld pakket wordt in zo'n prefix ge"installeerd. Dus als de programma's in /usr/local/bin staan dan zijn de bijbehorende man-pages te vinden in /usr/local/man, enzovoort.

Knoppix vult zelf al de meest gebruikelijke met software, te weten /, /usr, /usr/local en /opt. Wie zelf software wil installeren kan daar niets in kwijt, want deze directories verwijzen allemaal naar een niet-beschrijfbare disk, die afkomstig is uit een loop-device met compressie. Die compressie is de oorzaak dat er zoveel op de CD past, dus daar wil je ook niet zomaar aan tornen.

Wat je wel kunt doen is je eigen prefix maken en daar een disk image op mounten, of er zelf files voor downloaden. We geven een klein knoppix.sh script dat dit doet vanaf een mogelijke lokaal beheerde URL:

#!/bin/bash
mkdir -p /myware/bin /myware/lib /myware/share
wget -r -P /myware http://myware.nonglobal.net/

Wanneer de .bashrc van de home directory vervolgens op de juiste manier naar deze directories verwijst dan is op deze manier dus gemakkelijk eigen code op te halen voor lokaal gebruik. De statements daarvoor zijn bijvoorbeeld

export PATH=$PATH:/myware/bin
export LD_LIBRARY_PATH=/myware/lib

Wie hier overigens veel eigen wensen heeft is handigheid met de shell wel een vereiste. Gegeven die vaardigheid is er in elk geval ontzettend veel mogelijk met Knoppix. Het testen van een knoppix.sh script gaat prima door het in de root directory van een Linux- of FAT-partitie op de harde schijf te zetten, en wanneer dit dan werkt kan een nieuwe CD met dat extra script worden gebrand.

De laatste hindernis

Bovenstaande technieken zijn relatief eenvoudig; wie echt een heel andere kant op wil met Knoppix kan ook besluiten om de geinstalleerde software aan te passen aan de eigen wensen. Zo is bijvoorbeeld KDE vervangen door Gnome in het Gnoppix project, maar ook kun je er je eigen demo-software bij op willen zetten. Let wel, dit is werk voor ervaren Linux-gebruikers, liefst ook met ervaring met het pakketsysteem van Debian, omdat Knoppix daarop gebaseerd is.

Enfin, een eigen CD maken houdt eigenlijk vooral in dat het enorme bestand KNOPPIX/KNOPPIX op de CD wordt vervangen. Dit bestand bevat een gecomprimeerde image van een harde schijf, die via het genoemde mechanisme van gecomprimeerde loopback wordt ingehangen in het systeem. Het aanpassen van dit bestand bestaat dus uit de stappen decomprimeren, wijzigen, comprimeren.

Het decomprimeren is het simpelste. Nadat Knoppix opgestart is vind je immers de gemounte harde schijf terug op /KNOPPIX binnen je filesysteem. Kopieer daar alles vandaan naar een lege partitie op je harde schijf. Naar diverse directories uit /KNOPPIX worden vanuit de root directory van de distributie verwezen middels symbolische links, het is handig daar vooraf even naar te kijken om het idee te pakken te krijgen. Sommige dingen worden in de root directory overgenomen, andere zijn volledig afkomstig van de gecomprimeerde image, en zijn dus absoluut niet meer veranderbaar als het systeem eenmaal draait.

Het aanpassen is natuurlijk een freestyle oefening. Wat helpt, is dat veel software beschikbaar is als .deb pakket, en dat bijvoorbeeld het populaire .rpm formaat in .deb is om te zetten met het alien-commando. Ook zijn er zo her en der zogenaamde kick-lists opgesteld met software die zonder veel schade verwijderd kan worden. Let er altijd op dat je geen afhankelijkheden onderbreekt; het gebruik van de Debian package managers verzekert dit.

Tenslotte moet de werkpartitie weer tot een --hopelijk niet te groot-- KNOPPIX bestand worden gecomprimeerd. Het schijnt dat niemand dat zo goed kan als Klaus Knopper, de maker van Knoppix, omdat hij de compressie optimaliseert voor de manier waarop Knoppix de CD aanspreekt. Dat beetje abacadabra terzijde schuivend zijn er wel degelijk scripts die dit comprimeerwerk voor je kunnen uitvoeren, zoals aangegeven op knoppix.net.

Puzzelwerk

Hoewel er op diverse niveaus mogelijkheden zijn om zelf systeempjes samen te stellen die van CD booten, is het toch vaak even puzzelen voordat het werkt. We zijn goed te spreken van de hoeveelheid werk die Knoppix je uit handen kan nemen, met name de eenvoudige technieken om buiten het gecomprimeerde gedeelte om kleine uitbreidingen aan het systeem te maken zijn goed te doen.

Verantwoording

Deze reeks is gedurende 2004 verschenen in NetOpus. De reeks staat als geheel onder http://rick.vanrein.org/blog/netopus/bootstrapper

Translate to English Translate to English

Comments on this article