Linux Støvler

Som det viser sig, er der ikke meget ved opstartsprocessen:

1. En opstartsindlæser finder kernebilledet på disk, indlæser den i hukommelsen og starter den.
2. Selve kernen initialisere enheder og STI drivere.
3. Kernen monterer rodfilensystem.
4. Selve kernen begynder klargøring kaldt til tidsplanen.
5. init sætter resten af ​​processer i bevægelse.
6. De sidste processer, init starter som en del af startrækkefølgen tillader dig at logge på.

Identificering af hvert trin i opstartsprocessen er uvurderlig til at løse opstartsproblemer og forstå system som en helhed. For at starte skal du nulstille på startlæsseren, som er den første skærm eller prompt, du får, når computeren udfører selvtesten ved opstart og spørger, hvilken betjening system at løbe. Når du har truffet et valg, kører opstartsindlæseren Linux kerne, overdrager kontrol af system til kernen.

Der er en detaljeret diskussion af kernen Andetsteds i denne bog, hvorfra denne artikel er uddrag. Denne artikel dækker kernel initialisering fase, det stadium, hvor kernen udskriver en masse meddelelser om den hardware, der er til stede på system. Kernen starter init lige efter at den viser en meddelelse, der erklærer, at kernen har monteret rodfilsystem:

VFS: Mounted root (ext2 filersystem) Læs kun.

Kort efter vil du se en besked om init-start efterfulgt af system servicestartmeddelelser, og endelig får du en loginprompt af en slags.

BEMÆRK On Red Hat Linux, init-noten er især tydelig, fordi den "byder dig velkommen til Red Hat". Linux." Alle meddelelser derefter viser succes eller fiasko i parentes i højre side af skærmen.

De fleste af dette kapitel beskæftiger sig med init, Fordi det er den hvor en del af startrækkefølgen du har mest kontrol.
init

Der er ikke noget særligt ved init. Det er et program ligesom alle andre på Linux system, og du finder det i / sbin sammen med andre system binære filer. Hovedformålet med init er at starte og stoppe andre programmer i en bestemt rækkefølge. Alt du skal vide er, hvordan denne sekvens fungerer.

Der er et par forskellige variationer, men de fleste Linux distributioner bruger System V-stil diskuteret her. Nogle distributioner bruger en enklere version, der ligner BSD-init, men det er usandsynligt, at du støder på dette.

Runlevels

Til enhver tid på en Linux system, et bestemt basissæt af processer kører. Denne tilstand af machine kaldes dens køreplan, og det betegnes med et tal fra 0 til 6. The system bruger det meste af sin tid i et enkelt køreplan. Men når du lukker machine ned, init skifter til et andet runlevel for at afslutte system tjenester på en velordnet måde og fortælle kernen om at stoppe. Endnu et runlevel er for enkeltbruger mode, diskuteret senere.

Den nemmeste måde at få styr på runlevels er at undersøge init-konfigurationsfilen, /etc/inittab. Se efter en linje som følgende:

ID: 5: initdefault:

Denne linje betyder, at default køreplan på system er 5. Alle linjer i inittab-filen har denne form, med fire felter adskilt af koloner i følgende rækkefølge:
# Et entydigt id (en kort streng, Såsom id i det foregående eksempel)
# Den gældende runlevel nummer (r)
# Den handling, som init skal tage (i det foregående eksempel er handlingen at indstille default køreplan til 5)
# En kommando til at udføre (valgfri)

Der er ingen kommando, der skal udføres i den foregående initdefault eksempel fordi en kommando ikke giver mening i sammenhæng med indstilling af default runlevel. Se lidt længere nede i inittab, indtil du ser en linje som denne:

l5: 5: vent :/ etc / rc.d / rc 5

Denne linje udløser det meste af system konfiguration og tjenester gennem mapperne rc * .d og init.d. Du kan se, at init er indstillet til at udføre en kommando kaldet /etc/rc.d/rc 5 når den er i runlevel 5. Ventetiden fortæller hvornår og hvordan init kører kommandoen: kør rc 5 en gang når entering runlevel 5, og vent derefter på, at denne kommando er afsluttet, før du gør noget andet.

Der er flere forskellige handlinger i addition til initdefault og vent, især med hensyn til strømstyring, og inittab (5) manualsiden fortæller dig alt om dem. Dem, som du sandsynligvis støder på, forklares i de følgende afsnit.

respawn

Respawn-handlingen får init til at køre den kommando, der følger, og hvis kommandoen afsluttes, køre den igen. Du vil sandsynligvis se noget, der ligner denne linje i din inittab-fil:

1: 2345: respawn :/ sbin / mingetty tty1

Getty programmer giver login prompter. Det foregående linje er for det første virtuelle konsol (/ dev / tty1), den, du ser, når du trykker på ALT eller Ctrl-Alt-F1 F1. Den respawn handling bringer login prompt tilbage efter du er logget ud.

ctrlandre steder

ctrlaltdel handling styrer hvad system gør, når du trykker på CONTROL-ALT-DELETE på en virtuel konsol. På de fleste systems, dette er en slags genstartkommando ved hjælp af lukningskommandoen.

sysinit

Sysinit-handlingen er den allerførste ting, som init skal køre, når den starter, før enteri alle runlevels.

Hvordan Processer i runlevels starter

Du er nu klar til at lære, hvordan du starter system tjenester, lige før det lader dig logge ind. Husk denne inittab-linje fra tidligere:

l5: 5: vent :/ etc / rc.d / rc 5

Denne lille linje udløser Mange andre programmer. rc står for startkommandoerne, og du vil høre folk henvise til de kommandoer som scripts, programmer eller tjenester. Så hvor er disse kommandoer, anyway?

I runlevel 5, i dette eksempel, er kommandoerne sandsynligvis enten i /etc/rc.d/rc5.d eller /etc/rc5.d. Runlevel 1 bruger rc1.d, runlevel 2 bruger rc2.d osv. Du finder muligvis følgende items i biblioteket rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

Rc 5 kommando starter programmer på dette runlevel-mappe ved at køre GMT kommandoer:

S10sysklogd hjem
S12kerneld hjem
S15netstd_init hjem
S18netbase hjem
...
S99sshd hjem

Bemærk startargumentet i hver kommando. S'et i et kommandonavn betyder, at kommandoen skal køre ved starten mode, og tallet (00 til 99) bestemmer, hvor i rækkefølgen rc starter kommandoen.

Rc *. D kommandoer er shell scripts, der normalt starter programmer i / sbin eller / usr / sbin. Normalt kan du regne ud, hvad en af ​​kommandoerne rent faktisk ved at kigge på scriptet med mindre eller personsøger andet program.

Du kan starte en af ​​disse tjenester manuelt. Hvis du f.eks. Vil starte httpd webserverprogrammet manuelt, skal du køre S99httpd start. Tilsvarende, hvis du nogensinde har brug for at dræbe en af ​​tjenesterne, når machine er tændt, kan du køre kommandoen i mappen rc * .d med stopargumentet (S99httpd stop, for eksempel).

Nogle rc*.d mapper indeholder kommandoer, der starter med K (for "dræb" eller stop mode). I dette tilfælde kører rc kommandoen med stop-argumentet i stedet for start. Du vil sandsynligvis støde på K-kommandoer i runlevels, der lukker system ned.

Adding og fjernelse af tjenester

Hvis du ønsker at add, slette eller ændre tjenester i rc*.d mapperne, skal du se nærmere på filerne indeni. En lang liste afslører en struktur som denne:

lrwxrwxrwx. . . S10sysklogd -> .. / init.d / sysklogd
lrwxrwxrwx. . . S12kerneld -> .. / init.d / kerneld
lrwxrwxrwx. . . S15netstd_init -> .. / init.d / netstd_init
lrwxrwxrwx. . . S18netbase -> .. / init.d / netbase
...

Kommandoerne i en rc*.d mappe er faktisk symbolske links til filer i en init.d mappe, normalt i /etc eller /etc/rc.d. Linux distributioner indeholder disse links, så de kan bruge de samme opstartsscripts til alle runlevels. Denne konvention er på ingen måde et krav, men det gør ofte organisationen lidt nemmere.

For at forhindre, at en af ​​kommandoerne i init.d-biblioteket kører i et bestemt runlevel, kan du tænke på at fjerne det symbolske link i det relevante rc * .d-bibliotek. Dette fungerer, men hvis du laver en fejl og nogensinde har brug for at sætte linket på plads igen, kan du have problemer med at huske det nøjagtige navn på linket. Derfor bør du ikke fjerne links i rc * .d-mapperne, men snarere add en understregning (_) til begyndelsen af ​​linknavnet som dette:

mv S99httpd _S99httpd

Ved opstart ignorerer rc _S99httpd, fordi det ikke starter med S eller K. Desuden er det oprindelige navn stadig tydeligt, og du har hurtig adgang til kommandoen, hvis du er i klemme og har brug for at starte det manuelt.

Til add en tjeneste skal du oprette et script som de andre i init.d-biblioteket og derefter oprette et symbolsk link i det korrekte rc * .d-bibliotek. Den nemmeste måde at skrive et script på er at undersøge de scripts, der allerede er i init.d, lave en kopi af en, som du forstår, og ændre kopien.

Hvornår addi en tjeneste skal du sørge for at vælge et passende sted i opstartssekvensen for at starte tjenesten. Hvis tjenesten starter for tidligt, fungerer den muligvis ikke på grund af afhængighed af en anden service. For ikke-væsentlige tjenester, mest systems administrators foretrækker tal i 90'erne, efter de fleste af de tjenester, der fulgte med system.

Linux distributioner kommer normalt med en kommando til at aktivere og deaktivere tjenester i rc * .d mapperne. For eksempel i Debian er kommandoen update-rc.d, og i Red Hat Linux, kommandoen er chkconfig. Grafiske brugergrænseflader er også tilgængelige. Brug af disse programmer hjælper med at holde startbibliotekerne konsistente og hjælper med opgraderinger.

TIP: En af de mest almindelige Linux installationsproblemer er en forkert konfigureret XFree86-server, der slår til og fra, hvilket gør system ubrugelig på konsoller. For at stoppe denne adfærd skal du starte op i enkeltbruger mode og ændre dine runlevel- eller runlevel-tjenester. Se efter noget, der indeholder xdm, gdm eller kdm i dine rc*.d mapper eller din /etc/inittab.

Controlling init

Nogle gange er du nødt til at give init et lille kick for at fortælle det om at skifte kørselsniveau, for at genlæse inittab-filen eller bare for at shut down og system. Fordi init altid er den første proces på en system, dets proces-id er altid 1.

Du kan styre init med telinit. For eksempel, hvis du ønsker at skifte til runlevel 3 bruge denne kommando:

telinit 3

Når du skifter runlevels, forsøger init at afbryde alle processer, der ikke er i inittab-filen for det nye runlevel. Derfor bør du være forsigtig med at ændre runlevels.

Når du har brug for add eller fjerne genstartsjob eller foretage en anden ændring af inittab-filen, skal du fortælle init om ændringen og få den til at genlæse filen. Nogle mennesker bruger kill -HUP 1 til at bede init om at gøre dette. Denne traditionelle metode virker på de fleste versioner af Unix, så længe du skriver det korrekt. Du kan dog også køre denne telinit-kommando:

telinit q

Du kan også bruge telinit s til at skifte til enkeltbruger mode.

Nedlukning

init styrer også, hvordan system lukker ned og genstarter. Den rigtige måde at shut down a Linux machine er at bruge kommandoen shutdown.

Der er to grundlæggende måder at bruge nedlukning på. Hvis du stopper system, det lukker maclæg dig ned og holder den nede. At lave machine stop med det samme, brug denne kommando:

shutdown-h now

På de fleste modern machines med rimelig nyere versioner af Linux, afbryder et stop strømmen til machine. Du kan også genstarte machine. Brug -r i stedet for -h til en genstart.

Nedlukningsprocessen tager flere sekunder. Du bør aldrig nulstille eller slukke for en machine i løbet af denne fase.

I det foregående eksempel er det tid til shut down. Dette argument er obligatorisk, men der er mange måder at specificere det på. Hvis du vil have macHvis du vil gå ned engang i fremtiden, er en måde at bruge + n, hvor n er det antal minutter, nedlukning skal vente, før du udfører sit arbejde. For andre options, se på shutdown (8) manualsiden.

At gøre system genstart på 10 minutter, kør denne kommando:

shutdown-r + 10

On Linux, shutdown giver alle, der er logget på, besked om, at machine er på vej ned, men det gør ikke noget rigtigt arbejde. Hvis du angiver et andet tidspunkt end nu, opretter shutdown en fil kaldet /etc/nologin. Når denne fil er til stede, vil system forbyder login fra andre end superbrugeren.

Hvornår system nedlukningstid ankommer endelig, nedlukning fortæller init at skifte til runlevel 0 for stop og runlevel 6 for en genstart. Når init enters runlevel 0 eller 6, alt det følgende finder sted, som du kan bekræfte ved at se på scripts inde i rc0.d og rc6.d:

1. init dræber enhver proces, at det kan (som det ville Når du skifter til en anden runlevel).

# De oprindelige rc0.d / rc6.d-kommandoer kører og låses system filer på plads og gør andre forberedelser til nedlukning.
# De næste rc0.d/rc6.d-kommandoer afmonter alle filersystems andet end roden.
# Yderligere rc0.d/rc6.d kommandoer genmonterer rodfilensystem Læs kun.
# Stadig flere rc0.d/rc6.d kommandoer skriver alle bufferlagrede data ud til filensystem med synkroniseringsprogrammet.
# De endelige rc0.d / rc6.d kommandoer fortæller kernen at genstarte eller stoppe med genstart, standsning eller nedlukning program.

Genstart- og stopprogrammerne opfører sig forskelligt for hvert runlevel, hvilket potentielt kan forårsage forvirring. ved default, kalder disse programmer shutdown med -r eller -h options, men hvis den system er allerede stoppet eller genstart runlevel, fortæller programmerne kernen at lukke sig af med det samme. Hvis du virkelig vil lukke din macskynd dig ned (se bort fra mulige skader fra en ordentlig nedlukning), brug indstillingen -f.

Teknologientusiast, jeg skriver med glæde på StealthSettings.com siden 2006. Jeg har rig erfaring med operativsystemer: macOS, Windows og Linux, samt programmeringssprog og blogplatforme (WordPress) og til onlinebutikker (WooCommerce, Magento, PrestaShop).

Efterlad en kommentar