Een bootdisk is eigenlijk een miniatuur, zelfbevattend Linux-systeem op een diskette. Het moet veel dezelfde functies verrichten die door een volledig Linux-systeem worden verricht. Voordat men zijn eigen bootdisk gaat bouwen, zou men de basis van het Linux bootproces moeten begrijpen. We presenteren je hier de basis, wat voldoende is voor het begrijpen van de rest van het document. Veel details en alternatieve opties zijn achterwege gelaten.
Alle PC-systemen starten het bootproces door code in ROM (in het bijzonder de BIOS) uit te voeren om de sector vanaf sector 0, cylinder 0 van de bootdisk te laden. De bootdisk is gewoonlijk de diskette in het eerste diskettestation (toegekend als A: in DOS en /dev/fd0 onder Linux). De BIOS probeert dan deze sector uit te voeren. Op de meeste opstartbare disks, bevat sector 0, cylinder 0 zowel:
code van een bootloader zoals LILO, die de kernel lokaliseert, het laadt en het uitvoert om de boot zuiver te starten als
de start van een besturingssysteem zoals Linux.
Als een Linux-kernel raw naar diskette is gekopieerd, zal de eerste sector de eerste sector van de Linux-kernel zelf zijn. Deze eerste sector zal het bootproces vervolgen door de rest van de kernel vanaf het bootdevice te laden.
Zodra de kernel volledig is geladen, neemt het een basisinitialisatie van devices door. Het probeert vervolgens een root bestandssysteem vanaf een device te laden en mounten. Een rootbestandssysteem is gewoon een bestandssysteem dat is gemount als ``/''. De kernel moet worden verteld waar naar het rootbestandssysteem te zoeken; als het daar geen laadbaar image kan vinden, stopt het.
In een aantal bootsituaties - vaak wanneer van diskette wordt geboot - wordt het rootbestandssysteem in ramdisk geladen, dit is RAM die door het systeem als een disk wordt benaderd. Er zijn twee redenen waarom het systeem naar ramdisk laadt. Ten eerste is RAM verscheidene malen sneller dan een diskette, dus de werking van het systeem is snel; en ten tweede kan de kernel een gecomprimeerd bestandssysteem vanaf de diskette laden en het in de ramdisk decomprimeren, waardoor het mogelijk is meer bestanden op de diskette te persen.
Als het rootbestandssysteem éénmaal is geladen en gemount, zie je een melding als:
VFS: Mounted root (ext2 filesystem) readonly. |
Hier vindt het systeem het programma init op het rootbestandssysteem (in /bin of /sbin) en voert het uit. init leest zijn configuratiebestand /etc/inittab in, zoekt naar een regel aangeduid met sysinit, en voert het in die regel genoemde script uit. Het sysinit script is gewoonlijk iets als /etc/rc of /etc/init.d/boot. Dit script bestaat uit een set shell-opdrachten waarmee basissysteemservices worden ingesteld, zoals:
Het op alle disks uitvoeren van fsck,
Het laden van de benodigde kernelmodules,
Het starten van swappen,
Het initialiseren van het netwerk,
Het mounten van de disks vermeld in fstab.
Dit script roept vaak diverse andere scripts aan voor de modulaire initialisatie. In bijvoorbeeld de structuur van SysVinit, bevat de directory /etc/rc.d/ een complexe structuur aan subdirectory's waarvan de bestanden specificeren hoe de meeste systeemservices te activeren of af te sluiten. Op een bootdisk is het sysinit-script echter vaak heel simpel.
Wanneer het sysinit-script klaar is, geeft het de controle terug aan init, die dan overgaat op het standaard runlevel, met het sleutelwoord initdefault gespecificeerd in inittab. In de regel met het runlevel wordt gewoonlijk een programma als getty gespecificeerd, welke verantwoordelijk is voor het afhandelen van communicaties op de console en tty's. Het is het getty programma welke de bekende ``login:'' prompt afdrukt. Het getty programma roept op zijn beurt het programma login aan om de loginvalidatie af te handelen en gebruikerssessies in te stellen.
Na het basisbootproces te hebben geïnspecteerd, kunnen we nu diverse daarbij betrokken soorten disks definiëren. We classificeren disks in vier typen. Bij de bespreking in dit gehele document maken we, tenzij anders aangegeven, gebruik van de term ``disk'' om naar diskettes te refereren, alhoewel het meeste net zo goed ook voor harddisks zou kunnen gelden.
Een disk met een kernel die kan worden geboot. De disk kan worden gebruikt om de kernel te booten, die dan een rootbestandssysteem op een andere disk kan laden. De kernel op een bootdisk moet gewoonlijk worden aangegeven waar het zijn rootbestandssysteem kan vinden.
Vaak laadt een bootdisk een rootbestandssysteem van een andere diskette, maar het is bij een bootdisk mogelijk het zo in te stellen dat het 't in plaats daarvan een rootbestandssysteem van een harddisk laadt. Dit wordt in het algemeen gedaan bij het testen van een nieuwe kernel (in feite zal ``make zdisk'' een dergelijke bootdisk automatisch vanuit de kernel sourcecode aanmaken).
Een disk met een bestandssysteem met bestanden die nodig zijn om een Linux-systeem te draaien. Een dergelijke disk hoeft niet noodzakelijkerwijs een kernel of een bootloader te bevatten.
Een rootdisk kan onafhankelijk van enig andere disk worden gebruikt, zodra de kernel is geboot. Gewoonlijk wordt de rootdisk automatisch naar een ramdisk gekopieerd. Dit maakt dat de rootdisk veel sneller te benaderen is, en het maakt het diskettestation vrij voor een utility-disk.
Een disk met zowel de kernel als een rootbestandssysteem. Met andere woorden, het bevat alles wat nodig is om te booten en een Linux-systeem zonder harddisk te draaien. Het voordeel van dit type disk is dat het compact is - alles wat nodig is op een enkele disk. De van alles geleidelijk toenemende grootte betekent echter dat het, zelfs met compressie, in toenemende mate moeilijker wordt alles op een enkele diskette te plaatsen.
Een disk met een bestandssysteem, maar het is niet bedoeld te worden gemount als een rootbestandssysteem. Het is een aanvullende gegevensdisk. Je zou dit type disk kunnen gebruiken om aanvullende utility's mee te vervoeren voor als je te veel hebt voor op je rootdisk.
In het algemeen bedoelen we wanneer we het hebben over ``het bouwen van een bootdisk'', het aanmaken van zowel de boot (kernel) als de root (bestanden). Ze mogen zowel samen (een enkele boot-/rootdisk) als apart (boot + rootdisks) voorkomen. De meest flexibele benadering voor rescue-disks is waarschijnlijk het gebruik van boot- en rootdiskettes, en één of meer utility-diskettes voor datgene wat te veel is voor op deze disks.