Gentoo Logo

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() {
  (informatie over afhankelijkheden)
}

start() {
  (Commando's voor het starten van de toepassing)
}

stop() {
  (Commando's voor het stoppen van de toepassing)
}

restart() {
  (Commando's voor het herstarten van de toepassing)
}

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    # Wacht drie seconden voor opnieuw te starten
  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

(Kopieer alle toepassing van "default" naar "offline")
# cd /etc/runlevels/default
# for service in *; do rc-update add $service offline; done
(Verwijder de toepassingen die u niet wilt gebruiken in "offline")
# rc-update del net.eth0 offline
(Laat de toepassingen voor "offline" zien)
# rc-update show offline
(Een gedeelte van de resultaten)
               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 ] [ > ] [ >> ]


Print

View all

Upgedate op 30 augustus 2006

De originele versie van dit document was laatst geupdate om 18 december 2013

Korte inhoud: Gentoo gebruikt een speciaal initialisatie script formaat welke, naast andere functionaliteiten, afhankelijkheidsgedreven beslissingen en virtuele initialisatie scripts toelaat. Dit hoofdstuk legt al deze aspecten uit en vertelt ook hoe men deze scripts kan gebruiken.

Sven Vermeulen
Author

Roy Marples
Author

Daniel Robbins
Author

Chris Houser
Author

Jerry Alexandratos
Author

Seemant Kulleen
Gentoo x86 Developer

Tavis Ormandy
Gentoo Alpha Developer

Jason Huebel
Gentoo AMD64 Developer

Guy Martin
Gentoo HPPA developer

Pieter Van den Abeele
Gentoo PPC developer

Joe Kallar
Gentoo SPARC developer

John P. Davis
Editor

Pierre-Henri Jondot
Editor

Eric Stockbridge
Editor

Rajiv Manglani
Editor

Jungmin Seo
Editor

Stoyan Zhekov
Editor

Jared Hudson
Editor

Colin Morey
Editor

Jorge Paulo
Editor

Carl Anderson
Editor

Jon Portnoy
Editor

Zack Gilburd
Editor

Jack Morgan
Editor

Benny Chuang
Editor

Erwin
Editor

Joshua Kinard
Editor

Tobias Scherbaum
Editor

Xavier Neys
Editor

Grant Goodyear
Reviewer

Gerald J. Normandin Jr.
Reviewer

Donnie Berkholz
Reviewer

Ken Nowack
Reviewer

Lars Weiler
Contributor

Dimitry Bradt
Translator

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.