Disclaimer :
Dit document is niet juist en is niet meer onderhouden.
|
[ << ]
[ < ]
[ Home ]
[ > ]
[ >> ]
4. Initialisatie scripts
Inhoud:
4.a. Runlevels
Het starten van het Systeem
Als uw systeem opstart, ziet u steeds regels tekst voorbij schieten.
Wanneer u heel goed kijkt, zult u zien dat deze tekst steeds dezelfde zijn.
De volgorde waarin alles voorbij komt wordt de boot sequence genoemd,
is ligt (min of meer) vast.
Allereerst laadt uw bootloader de kernel image die u hebt aangegeven in het
configuratie bestand in het geheugen. Daarna vertelt het de processor om de
kernel uit te voeren. Wanneer de kernel is geladen en uitgevoerd, worden alle
kernel specifieke onderdelen en taken geïnitialiseerd en wordt het init
proces gestart.
Dit proces zorgt ervoor dat alle bestandssystemen (als gedefinieerd in
/etc/fstab) aangekoppeld en klaar gemaakt worden. Daarna
voert het verschillende scripts uit die terug te vinden zijn in
/etc/init.d. Deze scripts starten de hulpmiddelen die nodig
zijn om uw systeem volledig te starten.
Als alle scripts zijn uitgevoerd, activeert init de terminals
(in de meeste gevallen alleen de consoles die achter Alt-F1,
Alt-F2, etc zijn verborgen) met agetty dat als toepassing
wordt mee gestart, zodat u kunt inloggen via login.
Init Scripts
Echter, init voert de scripts in /etc/init.d niet in
willekeurige volgorde uit. Sterker nog, het voert alleen de scripts in
/etc/init.d uit die uitgevoerd moeten worden. Het bepaalt welke
scripts dat zijn door te kijken naar /etc/runlevels.
Als eerste voert init de scripts uit in /etc/init.d met
een symlink naar /etc/runlevels/boo. Meestal worden de scripts
in alfabetische volgorde gestart, maar sommige scripts hebben informatie
bijgevoegd waarin staat dat een ander script gestart moet zijn voordat
zijzelf kunnen starten.
Wanneer alles met een link naar /etc/runlevels/boot is gestart,
gaat init verder met de scripts met een symlink naar
/etc/runlevels/default. Ook deze worden in alfabetische volgorde
gestart, tenzij een script vraagt om een ander script eerder te starten, waarna
de volgorde wordt verandert.
Hoe Init Werkt
Natuurlijk kan init dit niet allemaal zelf. Het heeft een configuratie
bestand nodig waarin staat wat er moet gebeuren. Dit configuratie bestand is
/etc/inittab.
Als u zich de boot volgorde nog kunt herinneren, dan weet u dat init
eerst alle bestandssystemen aankoppelt. Dit wordt bepaald door de volgende
regel in /etc/inittab:
Codevoorbeeld 1.1: De initialisatie regel in /etc/inittab |
si::sysinit:/sbin/rc sysinit
|
Deze regel laat init sbin/rc sysinit draaien om het systeem te
initialiseren. Het /sbin/rc script zorgt voor de initialisatie,
dus eigenlijk doet init zelf niet zo veel -- het besteed de taak
van het initialiseren uit aan een andere toepassing.
Hierna voert init dus de scripts met symlinks naar
/etc/runlevels/boot uit. Dit wordt bepaald door de volgende regel:
Codevoorbeeld 1.2: Verder met het systeem initialiseren |
rc::bootwait:/sbin/rc boot
|
Hier voert eigenlijk rc de benodigde taken uit. Het valt misschien op
dat de optie bij rc (boot) hetzelfde is als de submap van
/etc/runlevels.
Nu checkt init het configuratie bestand om te bepalen welke
runlevel het moet draaien. Hiervoor lijst het de volgende regel in
/etc/inittab:
Codevoorbeeld 1.3: De initdefault regel |
id:3:initdefault:
|
In de meeste gevallen (dus voor het overgrote deel van de Gentoo gebruikers) zal
het runlevel hier het nummer 3 zijn. Daarom zal init nu
kijken wat er gestart moet worden in runlevel 3:
Codevoorbeeld 1.4: De definities voor de runlevels |
l0:0:wait:/sbin/rc shutdown
l1:S1:wait:/sbin/rc single
l2:2:wait:/sbin/rc nonetwork
l3:3:wait:/sbin/rc default
l4:4:wait:/sbin/rc default
l5:5:wait:/sbin/rc default
l6:6:wait:/sbin/rc reboot
|
De regel die runlevel 3 definieert, roept opnieuw het rc script aan om
toepassingen te starten (nu met het argument default). Ook hier is het
argument bij rc gelijk aan de naam van de submap van
/etc/runlevels.
Wanneer rc klaar is, bepaalt init welke consoles geactiveerd
worden en welke commando's gegeven moeten worden in die consoles:
Codevoorbeeld 1.5: De definities voor de consoles |
c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:12345:respawn:/sbin/agetty 38400 tty2 linux
c3:12345:respawn:/sbin/agetty 38400 tty3 linux
c4:12345:respawn:/sbin/agetty 38400 tty4 linux
c5:12345:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux
|
Wat is een runlevel?
U hebt nu kunnen zien dat init een genummerde lijst gebruikt om te
bepalen welk runlevel als eerste wordt geactiveerd. Een runlevel
is een vooraf ingestelde staat waarin uw systeem draait en bevat enkele scripts
(runlevel scripts of initscripts) die moeten worden uitgevoerd wanneer
u het runlevel start of beëindigt.
Binnen Gentoo zijn zeven runlevels gedefinieerd: drie interne runlevels, en
vier gebruikersrunlevels. De interne runlevels zijn sysinit,
shutdown en reboot en doen wat hun name impliceert:
respectievelijk het systeem initialiseren, afsluiten en herstarten.
De gebruikersrunlevels hebben een /etc/runlevels submap:
boot, default, nonetwork en
single. Het boot runlevel start alle systeem
toepassingen, die door de andere runlevels gebruikt worden. De drie andere
runlevels verschillen door welke toepassingen ze starten: default
wordt gebruikt voor dagelijkse toepassingen, nonetwork indien
er geen netwerk wordt gebruikt, en single wanneer het systeem
gerepareerd moet worden.
Werken met de Init Scripts
De scripts die door rc worden gestart noemen we init scripts.
Elk script in /etc/init.d kan worden uitgevoerd met de argumenten
start, stop, restart, pause, zap,
status, ineed, iuse, needsme, usesme of
broken.
Om een toepassing te starten, stoppen or herstarten (inclusief afhankelijke
toepassingen), kunt u start, stop en restart gebruiken:
Codevoorbeeld 1.6: Start Postfix |
# /etc/init.d/postfix start
|
Nota:
Alleen wanneer een toepassing een andere toepassing nodig heeft, wordt
deze opnieuw gestart of gestopt. Toepassingen die een andere toepassing blijven
gewoon draaien.
|
Wanneer u een toepassing wilt stoppen, maar de toepassingen die er op steunen
niet, dan kunt u het pause argument gebruiken:
Codevoorbeeld 1.7: Postfix stoppen, maar de afhankelijke toepassingen laten door draaien |
# /etc/init.d/postfix pause
|
Wanneer u wilt zien wat de status van een toepassing is (gestart, gestopt,
gepauzeerd, ...), kunt u status gebruiken:
Codevoorbeeld 1.8: Status van postfix opvragen |
# /etc/init.d/postfix status
|
Als de informatie aangeeft dat de toepassing draait, maar u weet zeker dat het
niet zo is, dan kunt u de status informatie resetten met behulp van het
zap argument:
Codevoorbeeld 1.9: Resetten van de status voor postfix |
# /etc/init.d/postfix zap
|
Om te kunnen zien welke afhankelijkheden een toepassing heeft, kunt u
iuse of ineed gebruiken. Met ineed kunt u zien welke
toepassing nodig zijn om correct te kunnen functioneren. iuse geeft
aan welke toepassing gebruikt kunnen worden, maar niet nodig zijn voor
het correct functioneren.
Codevoorbeeld 1.10: Een lijst met benodigde toepassing opvragen voor postfix |
# /etc/init.d/postfix ineed
|
Op dezelfde manier kunt u opvragen welke toepassing een bepaalde toepassing
gebruiken (needsme) of kunnen gebruiken (usesme):
Codevoorbeeld 1.11: Een lijst met toepassing opvragen die postfix nodig hebben |
# /etc/init.d/postfix needsme
|
Als laatste kunt u opvragen welke afhankelijkheden een toepassing nodig heeft
en mist:
Codevoorbeeld 1.12: Een lijst met missende afhankelijkheden opvragen voor postfix |
# /etc/init.d/postfix broken
|
4.b. Werken met rc-update
Wat is rc-update?
Gentoo's init systeem gebruikt een lijst met afhankelijkheden om te bepalen
welke toepassing als eerste moet worden gestart. Aangezien dit een
arbeidsintensieve taak is, willen we u als gebruiker dit niet handmatig laten
doen. Daarom hebben we hulpprogramma's ontwikkeld die het beheer van runlevels
en init scripts vergemakkelijken.
Met rc-update kunt u init scripts toevoegen en verwijderen bij een
runlevel. Het rc-update programma zal steeds automatisch het
depscan.sh script de lijst met afhankelijkheden laten updaten.
Het toevoegen en verwijderen van toepassingen
Tijdens de installatie hebt u al init scripts toegevoegd aan het "default"
runlevel. Toen wist u misschien nog niet waar "default" voor stond, maar dat
zou u nu moeten weten. Het rc-update script heeft een tweede argument
nodig, dat de actie definieert: add, del of show.
Om een init script toe te voegen of te verwijderen, voegt u gewoon add
of del als optie toe aan rc-update. Dit wordt gevolgd door het
te gebruike init script en het aan te passen runlevel. Bijvoorbeeld:
Codevoorbeeld 2.1: Postfix verwijderen uit het default runlevel |
# rc-update del postfix default
|
Het rc-update show commando geeft u alle beschikbare init scripts en een
lijst van de runlevels waarin zij draaien:
Codevoorbeeld 2.2: Init script informatie opvragen |
# rc-update show
|
4.c. Toepassingen configureren
Waarom extra configuraties?
Init scripts kunnen redelijk complex zijn. Daarom is het niet echt wenselijk
dat gebruikers de scripts direct moeten aanpassen, de kans op fouten is
gewoonweg te groot. Het is echter wel belangrijk om een toepassing te kunnen
configureren. U kunt bijvoorbeeld extra opties aan een toepassing willen
toevoegen.
Een tweede reden voor configuratie buiten het init script om, is om de
mogelijkheid te hebben init scripts te updaten zonder uw configuratie
kwijt te raken.
De /etc/conf.d map
Gentoo heeft een simpele manier om toepassingen te configureren: elk init script
heeft een configuratiebestand in /etc/conf.d. Het apache2 init
script (/etc/init.d/apach2 heeft bijvoorbeeld een
configuratiebestand /etc/conf.d/apache2, waarmee u verschillende
opties aan de Apache2 server kunt meegeven, als deze wordt gestart:
Codevoorbeeld 3.1: Variabele in /etc/conf.d/apache2 |
APACHE2_OPTS="-D PHP4"
|
Deze configuratiebestanden bevatten alleen variabelen (net als
/etc/make.conf, waardoor het gemakkelijk is om toepassingen te
configureren. Het geeft ons ook de mogelijkheid om meer informatie te geven
over de variabelen (als commentaar).
4.d. Init Scripts scrhijven
Moet ik dat doen?
Nee, het schrijven van een init script is normaal niet nodig, omdat Gentoo
voor alle toepassingen init scripts mee levert. Wanneer u echter een toepassing
installeert zonder Portage te gebruiken, is het heel goed waarschijnlijk dat u
wel zelf een init script moet schrijven.
Let op dat u niet het init script gebruikt dat door een toepassing zelf wordt
meegeleverd, indien dit niet speciaal voor Gentoo is geschreven: Gentoo's init
scripts zijn namelijk niet compatible met init scripts voor andere linux
distributies.
Indeling
De basis indeling van een init script wordt hieronder gegeven.
Codevoorbeeld 4.1: Basis indeling van een init script |
#!/sbin/runscript
depend() {
}
start() {
}
stop() {
}
restart() {
}
|
Elk init script moet een start() functie hebben. De andere delen
zijn niet verplicht.
Afhankelijkheden
Er zijn twee soorten afhankelijkheden die u kunt definiëren: use en
need. Zoals eerder uitgelegd, need is stricter dan use.
Met behulp van deze afhankelijkheden voert u de toepassing toe waar u van
afhankelijk bent, of de virtuele afhankelijkheid.
Een virtuele afhankelijkheid is een afhankelijkheid die door
verschillende toepassingen kan worden geleverd. Uw init script kan bijvoorbeeld
een systeem logger nodig hebben, maar er zijn meerdere systeem loggers
beschikbaar (metalogd, syslog-ng, sysklogd, ...). Aangezien u niet elke logger
afzonderlijk moet hebben (het is niet echt logisch om drie systeem
loggers te installeren), zorgen we er voor dat deze toepassingen een virtuele
afhankelijkheid leveren (provide).
We kijken naar de afhankelijkheden voor de postfix toepassing.
Codevoorbeeld 4.2: Afhankelijkheden voor Postfix |
depend() {
need net
use logger dns
provide mta
}
|
Zoals u kunt zien, geldt dat postfix:
-
de (virtuele) net afhankelijkheid nodig heeft (bijvoorbeeld
geleverd door /etc/init.d/net.eth0
-
de (virtuele) logger gebruikt (bijvoorbeeld geleverd door
/etc/init.d/syslog-ng)
-
de (virtuele) dns afhankelijkheid gebruikt (bijvoorbeeld geleverd
door /etc/init.d/named)
-
een (virtuele) mta afhankelijkheid levert (wat alle mail servers
doen)
De volgorde instellen
In sommige gevallen hebt u een toepassing niet direct nodig, maar wilt u de
toepassing starten voor (of na) een andere toepassing
indien de toepassing op het systeem aanwezig is (let op de voorwaarde
- dit is geen afhankelijkheid meer) en laten draaien in dezelfde
runlevel (let weer op de voorwaarde - er zijn alleen toepassingen in hetzelfde
runlevel bij betrokken). U kunt dit doen met before en after.
Als voorbeeld kijken we naar de instellingen van portmap:
Codevoorbeeld 4.3: De depend() functie in de Portmap toepassing |
depend() {
need net
before inetd
before xinetd
}
|
U kunt ook het sterretje "*" gebruiken om uw toepassing voor alle andere
toepassingen in hetzelfde runlevel te plaatsen, maar dit is niet aan te raden.
Codevoorbeeld 4.4: Het draaien van een init script als eerste in een runlevel |
depend() {
before *
}
|
Standaard functies
Naast de depend functie moet u ook de start functie definiëren.
Deze functie bevat alle commando's die nodig zijn om de toepassing te starten.
Het is verder aan te raden om de ebegin en eend functies te
gebruiken om te laten weten wat er gebeurt tijdens het uitvoeren van de
toepassing.
Codevoorbeeld 4.5: Voorbeeld start() functie |
start() {
ebegin "Starting my_service"
start-stop-daemon --start --quiet --exec /path/to/my_service
eend $?
}
|
Indien u meer voorbeelden nodig hebt van de start() functie, kunt u de
init scripts uit de map /etc/init.d er op na slaan. En voor de
start-stop-daemon is een goede handleiding beschikbaar, die u op elk
moment kunt bekijken voor meer informatie:
Codevoorbeeld 4.6: De handleiding voor de start-stop-daemon bekijken |
# man start-stop-daemon
|
Andere functies die u kunt gebruiken zijn: stop() en restart().
U bent echter niet verplicht deze functies aan te roepen! Het init systeem kan
zelf deze functies aanvullen wanneer u de start-stop-daemon gebruikt.
De Gentoo init script programmeertaal is gebaseerd op de Bourne Again Shell
(bash). U kunt daarom zonder meer bash commando's gebruiken in uw init script.
Eigen functies toevoegen
Wanneer u in uw init script andere functies wilt gebruiken dan de eerder
genoemde, kunt u die functie toevoegen via de variabele opts. U kunt
dan een functie maken met dezelfde naam, bijvoorbeeld om een functie
restartdelay te gebruiken:
Codevoorbeeld 4.7: De restartdelay functie aanmaken |
opts="${opts} restartdelay"
restartdelay() {
stop
sleep 3
start
}
|
Configuratie variabelen voor uw toepassing
U hoeft niets extra te doen om een configuratie bestand in de map
/etc/conf.d te kunnen gebruiken: wanneer uw init script wordt
gestart worden de volgende bestanden automatisch ingelezen:
- /etc/conf.d/<Uw init script>
- /etc/conf.d/basic
- /etc/rc.conf
Wanneer uw init script een virtuele afhankelijkheid bevat (zoals net)
zal het bestand dat hierbij hoort (in dit geval /etc/conf.d/net)
ook ingelezen worden.
4.e. Het gedrag van het runlevel veranderen
Wie hebben hier iets aan?
Veel laptop gebruikers zullen de volgende situatie herkennen: thuis wilt u
net.eth0 starten, maar onderweg wilt u het netwerk juist niet starten
(omdat er toch geen netwerk beschikbaar is). Binnen Gentoo kunt u het gedrag
van het runlevel daarom aanpassen naar uw eigen wensen.
U kunt bijvoorbeeld een tweede "default" runlevel aanmaken, met daarin andere
init scripts. U kunt dan tijdens het opstarten kiezen welk default runlevel u
wilt gebruiken.
Softlevel gebruiken
Allereerst maakt u een map aan voor uw tweede "default" runlevel. Hier maken
we als voorbeeld het runlevel offline aan:
Codevoorbeeld 5.1: Een map maken voor een runlevel |
# mkdir /etc/runlevels/offline
|
Nu kunt u de init scripts toevoegen die u wilt gebruiken in het nieuwe
runlevel. Een exacte kopie van uw huidige default runlevel, maar dan
zonder net.eth0 maakt u zo:
Codevoorbeeld 5.2: Het toevoegen van de juiste init scripts |
# cd /etc/runlevels/default
# for service in *; do rc-update add $service offline; done
# rc-update del net.eth0 offline
# rc-update show offline
acpid | offline
domainname | offline
local | offline
net.eth0 |
|
Nu kunt u het configuratie bestand van uw bootloader aanpassen en het runlevel
offline toevoegen. Voor Grub past u /boot/grub/grub.conf
aan:
Codevoorbeeld 5.3: Het runlevel offline toevoegen voor Grub |
title Gentoo Linux Offline Usage
root (hd0,0)
kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline
|
En voilà, u bent klaar. U kunt nu tijdens het opstarten kiezen voor uw nieuwe
offline runlevel. Dit wordt dan gestart in plaats van default.
Bootlevel gebruiken
Het gebruik van bootlevel is gelijk aan softlevel. Het enige
verschil is dat u nu geen tweede runlevel "default" aanmaakt, maar een tweede
runlevel "boot".
[ << ]
[ < ]
[ Home ]
[ > ]
[ >> ]
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|