Gentoo Logo

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() {
  (Afhængighedsinformation)
}

start() {
  (Kommandoer nødvendige for at starte tjenesten)
}

stop() {
  (Kommandoer nødvendige for at stoppe tjenesten)
}

restart() {
  (Kommandoer nødvendige for at genstarte tjenesten)
}

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    # Vent 3 sekunder før der startes igen
  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

(Kopier alle services fra standard runlevel til offline runlevel)
# ls /etc/runlevels/default
# for service in *; do rc-update add $service offline; done
(Fjern uønskede services fra offline runlevel)
# rc-update del net.eth0 offline
(Vise aktive services i offline runlevel)
# rc-update show offline
(Delvis udsnit af output)
               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 ] [ > ] [ >> ]


Udskriv

View all

Opdateret 9. juni 2005

The original version of this document was last updated February 11, 2013

Opsummering: Gentoo bruger et specielt startscript-format, som, inklusive andre egenskaber, tillader afhængighedsdrevet beslutninger og virtuelle startscripter. Dette kapitel forklarer alle disse aspekter og forklarer hvordan man arbejder med disse scripter.

Sven Vermeulen
Forfatter

Roy Marples
Forfatter

Daniel Robbins
Forfatter

Chris Houser
Forfatter

Jerry Alexandratos
Forfatter

Seemant Kulleen
Gentoo x86 udvikler

Tavis Ormandy
Gentoo Alpha udvikler

Jason Huebel
Gentoo AMD64 udvikler

Guy Martin
Gentoo HPPA udvikler

Pieter Van den Abeele
Gentoo PPC udvikler

Joe Kallar
Gentoo SPARC udvikler

John P. Davis
Redaktør

Pierre-Henri Jondot
Redaktør

Eric Stockbridge
Redaktør

Rajiv Manglani
Redaktør

Jungmin Seo
Redaktør

Stoyan Zhekov
Redaktør

Jared Hudson
Redaktør

Colin Morey
Redaktør

Jorge Paulo
Redaktør

Carl Anderson
Redaktør

Jon Portnoy
Redaktør

Zack Gilburd
Redaktør

Jack Morgan
Redaktør

Benny Chuang
Redaktør

Erwin
Redaktør

Joshua Kinard
Redaktør

Tobias Scherbaum
Redaktør

Lars Weiler
Redaktør

Jochen Maes
Redaktør

Grant Goodyear
Reviewer

Gerald J. Normandin Jr.
Reviewer

Donnie Berkholz
Reviewer

Ken Nowack
Reviewer

Jesper Brodersen
Oversætter, Korrektur

Arne Mejlholm
Oversætter, Korrektur

Frans Sohn Frøkjær-Jensen
Oversætter, Korrektur

Morten Fangel
Oversætter, Korrektur

Esben Bach
Oversætter, Korrektur

Simon Holm Thøgersen
Oversætter, Korrektur

Donate to support our development efforts.

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