Disclaimer :
This document is not valid and is not maintained anymore.
|
[ << ]
[ < ]
[ Hjem ]
[ > ]
[ >> ]
4. Startscripts
Indhold:
4.a. Runlevels
Opstart af dit system
Når du starter dit system, vil du ligge mærke til en del tekst, som flyder forbi. Hvis du
virkelig ligger mærke til det, vil nu bemærke at denne tekst er den samme hver gang du genstarter
dit system. Sekvensen af alle disse aktiviteter, er kaldet opstartsekvensen
og er (mere eller mindre) statisk defineret.
Først vil din boot-loader hente kerne-billedfilen, som du har defineret i
boot-loader opsætningen ind i hukommelsen efter den fortæller processoren til at køre
kernen. Når kernen er hentet og kører, vil den initialisere alle kerne-specifikke
strukturer og opgaver, og starte init-processen.
Denne proces sørger så for, at alle filsystemer (defineret i
/etc/fstab) er mountet og klar til at blive brugt. Så igangsætter den
flere scripts, placeret i /etc/init.d, som vil starte
de tjenester du behøver, for at have et succesfuldt opstartet system.
Til sidst, når alle scripts er startet, aktiverer init terminalerne
(i de fleste tilfælde er det kun de virtuelle konsoler, som er gemt bag ved Alt-F1,
Alt-F2 osv.) vedhæftet en speciel proces, kaldet agetty til den.
Denne proces vil så sørge for at du kan logge ind igennem disse terminaler
ved at køre login.
Init-scripts
init starter ikke kun scripts i /etc/init.d
tilfældigt. Den kører endda ikke alle scripts i /etc/init.d,
men kun dem den er blevet bedt om køre. Den beslutter hvilke scripts, der skal startes, ved at
kigge i /etc/runlevels.
Først kører init alle scripts fra /etc/init.d, som har
symbolske links inden i /etc/runlevels/boot. Sædvanligvis vil den
starte scripts i alfabetisk orden, men nogle scripts har afhængighedsinformationer
i dem, som fortæller systemet at et andet script skulle blive kørt i stedet for
en anden én.
Når alle /etc/runlevels/boot refererede scripts er kørt,
fortsætter init med at køre de scripts, som har et symbolsk
link til dem i /etc/runlevels/default. Igen, den vil
bruge den alfabetiske orden for at beslutte hvilket script, den skal
køre først, undtagen hvis et script har afhængighedsinformationer i
den, i hvilket tilfælde rækkefølgen er ændret til at levere en gyldig
opstartsekvens.
Hvordan init virker
Selvfølgelig vil init ikke beslutte alt selv. Den behøver en
opsætningsfil, som specificerer, hvilke aktiviteter der skal udføres. Denne
opsætningsfil er /etc/inittab.
Hvis du husker opstartssekvensen, som vi lige har beskrevet for dig, vil du
huske at inits første aktivitet er at mounte alle filsystemer. Dette er
defineret i den følgende linje fra /etc/inittab:
Kode oversigt 1.1: System-initialieringslinjen i /etc/inittab |
si::sysinit:/sbin/rc sysinit
|
Denne linje fortæller init at den skal køre /sbin/rc sysinit for at
initialisere systemet. /sbin/rc-scriptet tager sig af
initialiseringen, så du kan sige at init ikke gør meget -- den
delegerer opgaven om, for at initialise systemet til en anden proces.
For det andet, init starter alle scripts, som har symbolske links i
/etc/runlevels/boot. Dette er defineret i den følgende linje:
Kode oversigt 1.2: System-initialiseringen, fortsat |
rc::bootwait:/sbin/rc boot
|
Igen, udfører rc-scriptet de nødvendige opgaver. Noter at ting
givet til rc (boot) er det samme, som underbiblioteket af
/etc/runlevels, som er brugt.
Nu vil init tjekke dens opsætningsfil for at se hvad runlevel
der bør køre. For at beslutte dette, læser den følgende linje fra
/etc/inittab:
Kode oversigt 1.3: initdefault-linjen |
id:3:initdefault:
|
I dette tilfælde (som hoveddelen af Gentoo-brugere vil bruge), er runlevel'ens
id 3. Ved at bruge denne information, tjekker init hvad den skal køre for at starte
runlevel 3:
Kode oversigt 1.4: runlevel definitioner |
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
|
Linjen, som definerer level 3, bruger rc-scriptet til at starte
tjenesterne (nu med parameteren default). Noter at parameteren af
rc er den samme, som underbiblioteket i /etc/runlevels.
Når rc er færdig, beslutter init hvilke virtuelle konsoler, der bør
aktiveres og hvilke kommandoer den behøver at køre ved hver konsol:
Kode oversigt 1.5: Virtuelle konsolers definitioner |
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
|
Hvad er en runlevel?
Du har set at init bruger et nummeringsskema for at beslutte hvilke
runlevel'er, den skal aktivere. En runlevel er en tilstand, i hvilket
dit system kører og indeholder en samling af scripts (runlevel-scripts eller
initscripts), som skal være kørt, når du indtræder eller forlader en runlevel.
I Gentoo er der syv runlevels defineret: tre interne runlevels, og fire
brugerdefinerede runlevels. De interne runlevels er kaldet sysinit,
shutdown og reboot og gør præcist som deres navne siger:
initialisere systemet, slukker systemet og genstarter systemet.
De brugerdefinerede runlevels er disse med en ledsagende
/etc/runlevels underbibliotek: boot,
default, nonetwork og single.
boot-runlevel starter alle system-nødvendige tjenester, som alle andre
runlevels bruger. De resterende tre runlevels er forskellige i hvilke tjenester, de starter:
default er brugt til dagsoperationer, nonetwork
er brugt i det tilfælde, hvor ingen netværksaktivitet er krævet, og single er
brugt til når du skal reparere systemet.
Arbejde med init-scripts
De scripts, som rc-processen starter, er kaldet init scripts.
Hver script i /etc/init.d kan blive kørt med disse parametre
start, stop, restart, pause, zap,
status, ineed, iuse, needsme, usesme eller
broken.
For at starte, stoppe eller genstarte en tjeneste (og alle afhængige tjenester), skal start,
stop og restart bruges:
Kode oversigt 1.6: Start af Postfix |
# /etc/init.d/postfix start
|
Bemærk:
Kun de tjenester, som kræver at den givne tjeneste er stoppet eller genstartet.
De andre afhængige tjenester (dem som bruger tjenesten, men ikke kræver den)
er ladt uberørt.
|
Hvis du vil stoppe en tjeneste, men ikke tjenester der afhænger af den, kan du
bruge pause parameteren:
Kode oversigt 1.7: Stop af Postfix, men lad de afhængige tjenester blive kørende |
# /etc/init.d/postfix pause
|
Hvis du vil se hvilken status en tjeneste har (startet, stoppet, pause, ...), kan
du bruge status parameteren:
Kode oversigt 1.8: Statusinformation for postfix |
# /etc/init.d/postfix status
|
Hvis statusinformationen fortæller dig, at tjenesten kører, men du ikke ved
om den gør det, kan du tilbagestille statusinformationen til "stoppet" med
zap-parameteren:
Kode oversigt 1.9: Tilbagestille statusinformation for postfix |
# /etc/init.d/postfix zap
|
For at spørge hvilke afhængigheder tjenesterne har, kan du bruge iuse eller
ineed. Med ineed kan du se hvilke tjenester, som er virkelige
nødvendige for den korrekte funktionsbestemte metode af en tjeneste. iuse på den anden
side, viser at tjenester, som er brugt af tjenesten, men ikke nødvendigvis
for den korrekte funktionalitet.
Kode oversigt 1.10: Kræve en liste af alle nødvendige tjenester, som Postfix afhænger |
# /etc/init.d/postfix ineed
|
Lige sådan kan du spørge hvilke tjenester kræver tjenesten (needsme) eller
den kan bruge (usesme):
Kode oversigt 1.11: Kræve en liste af alle tjenester, som kræver Postfix |
# /etc/init.d/postfix needsme
|
Til sidst, kan du spørge hvilke afhængigheder, som tjenesten kræver, men som
mangler:
Kode oversigt 1.12: Kræve en liste over manglende afhængigheder for Postfix |
# /etc/init.d/postfix broken
|
4.b. Arbejde med rc-update
Hvad er rc-update?
Gentoos initsystem bruger et afhængighedstræ, som beslutter hvilke tjenester, som behøver at
blive startet først. Da dette er en kedelig opgave, som vi ikke vil have at vores brugere skal gøre
manuelt, har vi lavet værktøjer, som gør det lettere for administrationen af runlevels
og init-scripts.
Med rc-update kan du tilføje og fjerne init-scripts til en runlevel.
rc-update-værktøjet vil så automatisk spørge for depscan.sh-scriptet
for at genbygge afhængighedstræet.
Tilføje og fjerne tjenester
Du har allerede tilføjet init-scripts til "default" runlevel igennem installation
af Gentoo. På dette tidspunkt har du måske ikke haft en forståelse for hvad
"default" er til for, men nu burde du. rc-update-scriptet kræver en
anden parameter, som definerer aktiviteten: add (tilføj), del (slet) eller show (vis).
For at tilføje eller fjerne et init-script, skal du blot give rc-update add eller
del parameteren, fulgt af init-scriptet og runlevel. F.eks.:
Kode oversigt 2.1: Fjernelse af Postfix fra default runlevel |
# rc-update del postfix default
|
rc-update show kommandoen vil vise de tilgængelige init-scripts og
vise en liste fra hvilke runlevels, de vil køre:
Kode oversigt 2.2: Modtagelse af init-script informationer |
# rc-update show
|
4.c. Opsætning af tjenester
Hvorfor er det nødvendigt at opsætte ekstra?
Init-scripts kan være pænt komplekse. Det er derfor ikke interessant at have
brugere til at redigere direkte i init-scripts, da det kunne skabe flere
fejl. Det er dog vigtigt at kunne opsætte sådan en tjeneste. F.eks.
vil du ønske at give flere muligheder til tjenesten selv.
En anden grund er at have denne opsætning udenfor init-script, er at kunne
opdatere init-scripts uden at skulle være bange for at dine opsætningsændringer
bliver overskrevet.
/etc/conf.d biblioteket
Gentoo leverer en let metode for at opsætte sådan en tjeneste: hver init-script som
kan blive opsat, har en fil i /etc/conf.d. F.eks. har
apache2s initscript (kaldet /etc/init.d/apache2) en
opsætningsfil, kaldet /etc/conf.d/apache2, hvilket indeholder
de indstillinger, som du vil sætte til Apache 2 serveren, når den er startet:
Kode oversigt 3.1: Variabler defineret i /etc/conf.d/apache2 |
APACHE2_OPTS="-D PHP4"
|
Sådan en opsætningsfil inderholder variabler og kun variabler (lige som
/etc/make.conf), som gør det meget let at opsætte tjenester. Det
tillader os at levere flere informationer omkring variablerne (som kommentarer).
4.d. Skrive init-scripts
Skal jeg gøre det?
Nej. At skrive et init-script er normalt ikke nødvendigt, idet Gentoo leverer
klar-til-brug init-scripts til alle leverede tjenester. Dog, du har måske
installeret en tjeneste, uden at bruge Portage, hvilket betyder at du i de fleste
tilfælde skal oprette et init-script.
Brug ikke init-script leveret til tjenesten, hvis den ikke er eksklusivt
skrevet til Gentoo: Gentoos init-scripts er ikke kompatibel med de init-scripts
brugt af de andre distributioner!
Layout
Basislayoutet af en init-script er vist nedenfor.
Kode oversigt 4.1: Basislayout af en init-script |
#!/sbin/runscript
depend() {
}
start() {
}
stop() {
}
restart() {
}
|
Enhver init-script kræver start() funktionen til at blive defineret. Alle
andre sektioner er valgbare.
Afhængigheder
Der er to afhængigheder, som du kan definere: use og need. Som vi
har fortalt før, er need-afhængigheden mere strikt end
use-afhængigheden. Ved at følge denne afhængighedstype, får du
den tjeneste du behøver, eller den virtuelle-afhængighed.
En virtuel afhængighed er en afhængighed, som en tjeneste leverer, men den
er ikke kun leveret af denne tjeneste. Dit init-script kan være afhængigt af en systemlogning,
men der er mange systemloggere at vælge imellem (metalogd, syslog-ng,
sysklogd, ...). Da du ikke kan mangle enhver af dem (intet normalt
system har alle disse systemloggere installeret og kørende) vil sørge for at
alle disse tjenester leverer en virtuel afhængighed.
Lad os tage et kig på afhængighedsinformationerne for postfix-tjenesten.
Kode oversigt 4.2: Afhængighedsinformationer for Postfix |
depend() {
need net
use logger dns
provide mta
}
|
Som du kan se, postfix-tjenesten
-
kræver (virtuel) net-afhængigheden (som er sørget for, f.eks.
/etc/init.d/net.eth0)
-
bruger (virtuel) logger-afhængigheden (som er sørget for, f.eks.
/etc/init.d/syslog-ng)
-
bruger (virtuel) dns-afhængigheden (som er sørget for, f.eks.
/etc/init.d/named)
-
sørger for (virtuel) mta-afhængighed (som er brugt normalt af alle
mail-servere)
Kontrol over rækkefølgen
I nogle tilfælde, kræver du ikke en tjeneste, men ønsker at din tjeneste bliver
startet før (eller efter) en anden tjeneste hvis den er
tilgængelig på systemet (noter betingelsen - det er ikke en afhængighed længere)
og kører i samme runlevel (noter betingelsen - kun tjenester i samme
runlevel er involveret). Du kan sørge for denne information ved at bruge
before- (før) eller after- (efter) indstillingerne.
Som et eksempel, vil vi se på indstillingerne til Portmap-tjenesten:
Kode oversigt 4.3: depend()-funktionen i Portmap-tjenesten |
depend() {
need net
before inetd
before xinetd
}
|
Du kan også bruge "*" til at fange alle tjenester i samme runlevel,
dog er det ikke tilrådeligt.
Kode oversigt 4.4: Kørsel af init-script, som den første script i runlevel'en |
depend() {
before *
}
|
Standardfunktioner
Lige efter depend()-funktionaliteten, behøver du også at definere
start()-funktionen. Denne indeholder alle de kommandoer, som er nødvendige for
at initialisere din tjeneste. Det er tilrådeligt at bruge ebegin og
eend funktionerne for at informere brugeren om hvad der sker:
Kode oversigt 4.5: Eksempel start()-funktionen |
start() {
ebegin "Start af min tjeneste"
start-stop-daemon --start --quiet --exec /path/to/my_service
eend $?
}
|
Hvis du vil have flere eksempler af start()-funktionen, læs venligt kildekoden
til de tilgængelige init-scripts i dit /etc/init.d-bibliotek.
Som til start-stop-daemon, er der en udemærket man-side tilrådighed, hvis du
behøver flere informationer:
Kode oversigt 4.6: man-side til start-stop-daemon |
# man start-stop-daemon
|
Andre funktioner, som du kan definere er: stop() og restart(). Du er
ikke tvunget til at definere disse funktioner! Vores initsystem er intelligent nok til at
udfylde disse funktioner selv, hvis du bruger start-stop-daemon.
Gentoos opstartsscript-syntaks er baseret på Bourne Again Shell (bash), så du kan
frit bruge bash-kompatible konstruktioner inden i dine opstartsscripts.
Tilføje skræddersyede indstillinger
Hvis du vil have dit init-script til at understøtte flere indstillinger, end dem vi allerede
har vist dig, bør du tilføje disse indstillinger i opts-variabelen, og
oprette en funktion med samme navn som indstillingen. F.eks. for at understøtte en
valgmulighed kaldet restartdelay:
Kode oversigt 4.7: Understøttelse af restartdelay-valgmuligheden |
opts="${opts} restartdelay"
restartdelay() {
stop
sleep 3
start
}
|
Tjenestens opsætningsvariabler
Du behøver ikke at gøre noget for at understøtte en opsætningsfil i
/etc/conf.d: hvis dit init-script er startet, vil følgende filer
automatisk blive til kilder (dvs. variablerne er tilgængeligt til brug):
- /etc/conf.d/<dit init-script>
- /etc/conf.d/basic
- /etc/rc.conf
Også, hvis dit init-script sørger for en virtuel afhængighed (som net), vil filen blive, associeret med den afhængighed (som /etc/conf.d/net), også blive til kilder.
4.e. Ændring af runlevel'ens adfærd
Hvem kan drage nytte af dette?
Mange bærbar-brugere kender situationen: når du er hjemme og skal starte net.eth0 og når du er på vejen vil du ikke starte net.eth0 (idet der ikke er noget netværk tilgængeligt). Med Gentoo kan du ændre runlevel-adfærd til din egen fordel.
F.eks. kan du oprette en anden "default" runlevel, som du kan starte og indeholder andre initscripts fastsat til det. Du kan så vælge ved opstart, hvilken "default" runlevel du vil bruge.
Brug af softlevel
Først af alt, opret runlevel-mappen til din anden "default" runlevel. Som et eksempel opretter vi offline runlevel:
Kode oversigt 5.1: Oprettelse af runlevel-mappe |
# mkdir /etc/runlevels/offline
|
Tilføj de nødvendige initscripts til dine nyoprettede runlevels. F.eks. hvis du vil have en eksakt kopi af din nuværende default runlevel, men uden net.eth0:
Kode oversigt 5.2: Tilføjelse af nødvendige initscripts |
# ls /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 |
|
Rediger nu din boot-loader opsætning og tilføj en ny post til offline runlevel'en. F.eks. i /boot/grub/grub.conf:
Kode oversigt 5.3: Tilføjelse af post til offline runlevel'en |
title Gentoo Linux Offline Usage
root (hd0,0)
kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline
|
Voilà, nu er alt klart. Hvis du starter dit system op og vælger den nyoprettede post, vil offline runlevel'en blive brugt i stedet for default.
Brug af bootlevel
Brug af bootlevel er komplet i overenstemmelse med softlevel. Den eneste forskel her er at du definerer en anden "boot" runlevel i stedet for en anden "default" runlevel.
[ << ]
[ < ]
[ Hjem ]
[ > ]
[ >> ]
Indholdet i dette dokument er autoriseret under en Creative Commons -
Attribution / Share Alike licens.
|