Next Previous Contents

6. Init

Ik zal hier alleen de ``System V'' stijl van init behandelen die door de meeste Linux systemen wordt gebruikt. Er zijn alternatieven. In wezen kun je elk programma dat je wilt in /sbin/init plaatsen, en de kernel zat dit uitvoeren zodra het is geladen.

Het is de taak van init alles werkend te krijgen zoals het zou moeten. Het controleert of bestandssystemen in orde zijn en mount ze. Het start de ``daemons'' voor het loggen van systeemmeldingen, uitvoeren van netwerkzaken, leveren van webpages, luisteren naar je muis, enzovoort. Het start tevens de getty processen die de loginprompts op je virtuele terminals plaatsen.

Er bestaat een heel gecompliceerd verhaal over het schakelen tussen ``runlevels'', maar dat sla ik grotendeels over, en ga het slechts hebben over de systeemstart.

Init leest het bestand /etc/inittab, waarin staat wat het moet doen. Als eerste zal het een initialisatiescript draaien. Het programma dat dit script uitvoert (of interpreteert) is bash, hetzelfde programma dat je een opdrachtprompt geeft. Onder Debian systemen is /etc/init.d/rcS het initialisatiescript, onder Red Hat is dit /etc/rc.d/rc.sysinit. Hierin staan de opdrachten om de bestandssystemen te controleren en te mounten, de klok in te stellen, swapspace te activeren, de hostnaam in te stellen, enzovoort.

Vervolgens wordt een ander script aangeroepen om ons in het standaard runlevel te brengen. Dit betekent dat een set subsystemen zal worden opgestart. In RedHat bestaan hiervoor een aantal directory's, te weten /etc/rc.d/rc0.d, /etc/rc.d/rc1.d, ..., /etc/rc.d/rc6.d in Red Hat, of /etc/rc0.d, /etc/rc1.d, ..., /etc/rc6.d onder Debian, welke met de runlevels corresponderen. Als we op een Debian-systeem runlevel 3 ingaan, dan voert het script alle scripts uit in /etc/rc3.d die met een `S' (voor start) beginnen. Deze scripts bestaat in werkelijkheid uit verwijzingen naar scripts in een andere directory gewoonlijk met de naam init.d.

Dus ons runlevel script werd door init aangeroepen, en het zoekt naar scripts beginnend met een `S' in een directory. Wellicht dat het als eerste S10syslog aantreft. De getallen vertellen het runlevelscript in welke volgorde ze uit te voeren. Dus in dit geval wordt S10syslog als eerste uitgevoerd, gezien er verder geen scripts meer zijn die beginnen met S00...S09. Maar S10syslog is in werkelijkheid een link naar /etc/init.d/syslog, een script om de systeemlogger te starten en stoppen. Omdat de link met een `S' begint, weet het syslog script dat het moet starten met de ``start'' parameter. Er bestaan tevens corresponderende links beginnend met een `K', waarmee wordt aangegeven af te sluiten en in welke volgorde het runlevel te verlaten.

Om te wijzigen welke subsystemen standaard opstarten, moet je deze links in de directory rcN.d instellen, waarbij N het standardrunlevel is, ingesteld in het bestand inittab.

Een laatste belangrijke taak van init is het opstarten van een aantal getty's. Ze staan ingesteld als ``respawned'' wat betekent dat als ze stoppen, init ze gewoon weer start. De meeste distributies worden opgeleverd met zes virtuele terminals. Je kunt om geheugen te besparen er hier wellicht minder van instellen, of juist meer zodat je meer actief kunnen hebben en hier snel tussen kunt schakelen als je het nodig hebt. Je kunt tevens een getty voor een tekstterminal of een inbelmodem willen hebben draaien. In dat geval zul je het bestand inittab moeten bewerken.

6.1 Configuratie

/etc/inittab is het configuratiebestand voor init.

De directory's rcN.d, waarbij N = 0, 1, ..., 6 bepalen welke subsystemen worden opgestart.

Ergens in een van de scripts aangeroepen door init, zal de opdracht mount -a worden uitgevoerd. Hiermee worden alle bestandssystemen gemount die verondersteld worden te worden gemount. Het bestand /etc/fstab definieert wat is verondersteld te worden gemount. Als je wilt wijzigen wat wordt gemount wanneer je systeem opstart, dan zul je dit bestand moeten bewerken. Er bestaat een manpage voor fstab.

6.2 Oefeningen

Zoek naar de directory rcN.d voor het standaard runlevel van je systeem en geef de opdracht ls -l om te bekijken waarnaar de links verwijzen.

Wijzig het aantal getty's dat op je systeem draait.

Verwijder alle subsystemen uit de directory van het standaardrunlevel die je niet nodig hebt.

Kijk met hoe weinig je op kunt starten.

Maak een diskette met lilo, een kernel en een statisch gelinkt "hello world" programma genaamd /sbin/init en bekijk het booten en "hello world" zeggen.

Bekijk het zorgvuldig als je systeem opstart, en maak notities over wat het je vertelt wat er gebeurt. Of druk een deel af van je systeemlog /var/log/messages van de systeemstart. Dan beginnend bij inittab, doorloop alle scripts en bekijk welk code wat doet. Je kunt er ook extra opstartmeldingen inplaatsen, zoals

        echo "Hello, ik ben rc.sysinit"

Dit is tevens een goede oefening in het leren schrijven van Bash-scripts, een aantal van de scripts zijn nogal gecompliceerd. Houd een goede Bash-referentie bij de hand.

6.3 Meer informatie


Next Previous Contents