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.
/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
.
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.
inittab
en fstab
.
Typ (bv) man inittab
in een shell en bekijk het.