Linux Boots

Som det viser seg, er det ikke mye å starte prosessen:

1. En oppstartslaster finner kjernebildet på disk, laster den inn i minnet og starter den.
2. Kjernen initialisere enhetene og STI drivere.
3. Kjernen monterer rotfilensystem.
4. Kjernen starter init Kalt til å planlegge.
5. init setter resten av prosessene i bevegelse.
6. De siste Prosesser som starter init som en del av boot sekvensen kan du logge deg på.

Å identifisere hvert trinn i oppstartsprosessen er uvurderlig for å fikse oppstartsproblemer og forstå system som en helhet. For å starte, null på startlasteren, som er den første skjermen eller meldingen du får etter at datamaskinen har startet selvtesten, og spør hvilken operasjon system å løpe. Etter at du har tatt et valg, kjører oppstartslasteren Linux kjerne, overlate kontroll over system til kjernen.

Det er en detaljert diskusjon av kjernen Andre steder i denne boken som denne artikkelen er hentet. Denne artikkelen dekker kernel initialisering scenen, scenen når kjernen skriver ut en haug med meldinger om maskinvaren som er tilstede på system. Kjernen starter init like etter at den viser en melding om at kjernen har montert rotfilensystem:

VFS: Montert root (ext2 filersystem) bare leset.

Like etter vil du se en melding om initstart, etterfulgt av system tjenestestartmeldinger, og til slutt får du en påloggingsprompt av noe slag.

MERKNADER : På Red Hat Linux, init-notatet er spesielt tydelig, fordi det "ønsker" deg velkommen til Red Hat Linux. ” Alle meldinger deretter viser suksess eller fiasko i parentes på høyre side av skjermen.

Mesteparten av dette kapitlet omhandler init, fordi det er der en del av boot sekvensen du har mest kontroll.
init

Det er ikke noe spesielt med init. Det er et program akkurat som alle andre på Linux system, og du finner den i / sbin sammen med andre system binærfiler. Hovedformålet med init er å starte og stoppe andre programmer i en bestemt sekvens. Alt du trenger å vite er hvordan denne sekvensen fungerer.

Det finnes noen forskjellige varianter, men de fleste Linux distribusjoner bruker System V-stil diskutert her. Noen distribusjoner bruker en enklere versjon som ligner BSD init, men det er usannsynlig at du vil støte på dette.

Køyrenivå

Til enhver tid på a Linux system, kjører et visst basesett av prosesser. Denne tilstanden til machine kalles runlevel, og det er betegnet med et tall fra 0 til 6. The system tilbringer mesteparten av tiden sin i et enkelt løpsnivå. Når du lukker machine down, init bytter til et annet lønnivå for å avslutte system tjenester på en ryddig måte og fortelle kjernen om å stoppe. Nok et kjørenivå er for enkeltbrukere mode, diskutert senere.

Den enkleste måten å få kontroll på kjørenivåer er å undersøke init-konfigurasjonsfilen, /etc/inittab. Se etter en linje som følgende:

id: 5: initdefault:

Denne linjen betyr at default runlevel på system er 5. Alle linjer i inittab-filen har denne formen, med fire felt atskilt med kolon i følgende rekkefølge:
# En unik identifikator (en kort streng, slik som id i eksemplet ovenfor)
# Den gjeldende driftsnivået (numre)
# Handlingen init skal ta (i det foregående eksemplet er handlingen å sette default lønnivå til 5)
# En kommando for å utføre (valgfritt)

Det er ingen kommando å utføre i forrige initdefault eksempel fordi en kommando ikke gir mening i sammenheng med å sette default runlevel. Se litt lenger ned i inittab, til du ser en linje som denne:

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

Denne linjen utløser det meste av system konfigurasjon og tjenester gjennom katalogene rc * .d og init.d. Du kan se at init er satt til å utføre en kommando kalt /etc/rc.d/rc 5 når den er i runlevel 5. Ventetiden forteller når og hvordan init kjører kommandoen: kjør rc 5 en gang når entering runlevel 5, og vent deretter på at denne kommandoen er ferdig før du gjør noe annet.

Det er flere forskjellige handlinger i addide til initdefault og vent, spesielt når det gjelder strømstyring, og inittab (5) manualsiden forteller deg alt om dem. De som du mest sannsynlig vil møte, blir forklart i de følgende avsnittene.

respawn

Respawn-handlingen får init til å kjøre kommandoen som følger, og hvis kommandoen fullføres, kjører den på nytt. Du vil sannsynligvis se noe som ligner på denne linjen i inittab-filen din:

1: 2345: respawn :/ sbin / mingetty tty1

Getty programmene gir innlogging ber. Den foregående linjen er for det første virtuell konsoll (/ dev / tty1), den du ser når du trykker på ALT eller Ctrl-Alt-F1 F1. Den respawn handlingen bringer login prompt tilbake etter at du logger ut.

ctrlandre steder

De ctrlaltdel handling styrer hva system gjør når du trykker CONTROL-ALT-DELETE på en virtuell konsoll. På de fleste systems, dette er en slags omstartkommando ved hjelp av shutdown-kommandoen.

sysinit

Sysinit-handlingen er den aller første tingen som den skal kjøre når den starter opp, før enteri eventuelle runlevels.

Hvordan Prosesser i køyrenivå starter

Du er nå klar til å lære å sette i gang system tjenester, rett før den lar deg logge på. Husk denne inittab-linjen fra tidligere:

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

Denne lille linjen utløser mange andre programmer. rc står for kjøre kommandoer, og du vil høre folk referere til kommandoene som skript, programmer eller tjenester. Så, hvor er disse kommandoene, likevel?

For runlevel 5, i dette eksempelet, er kommandoene antagelig enten i /etc/rc.d/rc5.d eller /etc/rc5.d. Runlevel 1 bruker rc1.d, runlevel 2 bruker rc2.d, og så videre. Du kan finne følgende items i rc5.d-katalogen:

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

Den rc 5 kommandoen starter programmer i denne driftsnivået katalogen ved å kjøre GMT kommandoer:

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

Legg merke til startargumentet i hver kommando. S-en i et kommandonavn betyr at kommandoen skal kjøres ved starten mode, og tallet (00 til 99) bestemmer hvor i rekkefølgen rc starter kommandoen.

Den rc *. D kommandoer er skall-skript som vanligvis starter programmer i / sbin og / usr / sbin. Normalt kan du regne ut hva en av kommandoene faktisk gjør ved å se på manuset med mindre eller personsøker Et annet program.

Du kan starte en av disse tjenestene for hånd. Hvis du for eksempel vil starte httpd webserverprogrammet manuelt, kjører du S99httpd start. Tilsvarende, hvis du noen gang trenger å drepe en av tjenestene når machine er på, kan du kjøre kommandoen i rc * .d-katalogen med stoppargumentet (S99httpd stopp, for eksempel).

Noen rc*.d-kataloger inneholder kommandoer som starter med K (for "kill" eller stopp mode). I dette tilfellet kjører rc kommandoen med stop-argumentet i stedet for start. Det er mest sannsynlig at du møter K-kommandoer i kjørenivåer som stenger system ned.

Adding og fjerning av tjenester

Hvis du ønsker å add, slette eller endre tjenester i rc*.d-katalogene, må du se nærmere på filene inni. En lang liste avslører en struktur som dette:

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

Kommandoene i en rc*.d-katalog er faktisk symbolske lenker til filer i en init.d-katalog, vanligvis i /etc eller /etc/rc.d. Linux distribusjoner inneholder disse koblingene slik at de kan bruke de samme oppstartsskriptene for alle kjørenivåer. Denne konvensjonen er på ingen måte et krav, men det gjør ofte organiseringen litt enklere.

For å forhindre at en av kommandoene i init.d-katalogen kjører i et bestemt nivå, kan du tenke deg å fjerne den symbolske lenken i riktig rc * .d-katalog. Dette fungerer, men hvis du gjør en feil og noen gang trenger å sette koblingen på plass, kan det hende du har problemer med å huske det eksakte navnet på lenken. Derfor bør du ikke fjerne koblinger i rc * .d-katalogene, men heller add et understrek (_) til begynnelsen av lenkenavnet slik:

mv S99httpd _S99httpd

Ved oppstart ignorerer rc _S99httpd fordi det ikke starter med S eller K. Videre er det opprinnelige navnet fremdeles åpenbart, og du har rask tilgang til kommandoen hvis du er i klem og trenger å starte den for hånd.

Til add en tjeneste, må du opprette et skript som de andre i init.d-katalogen og deretter lage en symbolsk lenke i riktig rc * .d-katalog. Den enkleste måten å skrive et manus på er å undersøke manusene som allerede er i init.d, lage en kopi av en som du forstår, og endre kopien.

Når addsørg for at du velger et passende sted i oppstartssekvensen for å starte tjenesten. Hvis tjenesten starter for tidlig, kan det hende at den ikke fungerer på grunn av avhengighet av noen annen tjeneste. For ikke-viktige tjenester, de fleste systems administrators foretrekker tall på 90-tallet, etter de fleste av tjenestene som fulgte med system.

Linux distribusjoner kommer vanligvis med en kommando for å aktivere og deaktivere tjenester i rc*.d-katalogene. For eksempel, i Debian er kommandoen update-rc.d, og i Red Hat Linux, kommandoen er chkconfig. Grafiske brukergrensesnitt er også tilgjengelig. Å bruke disse programmene bidrar til å holde oppstartskatalogene konsistente og hjelper med oppgraderinger.

HINT: En av de vanligste Linux installationsproblemer er en feil konfigurert XFree86-server som slår seg av og på og gjør system ubrukelig på konsoller. For å stoppe denne oppførselen, start opp i enkeltbruker mode og endre runlevel- eller runlevel-tjenestene dine. Se etter noe som inneholder xdm, gdm eller kdm i rc*.d-katalogene dine, eller /etc/inittab.

Styre init

Noen ganger må du gi init et lite kick for å fortelle det om å bytte kjørenivå, lese inittab-filen på nytt, eller bare for å shut down de system. Fordi init er alltid den første prosessen på en system, prosess-ID er alltid 1.

Du kan styre init med telinit. For eksempel, hvis du ønsker å bytte til driftsnivået 3, bruk denne kommandoen:

telinit 3

Når du bytter kjørenivå, prøver init å avbryte alle prosesser som ikke er i inittab-filen for det nye kjørenivået. Derfor bør du være forsiktig med å endre kjørenivåer.

Når du trenger å add eller fjerne respawning-jobber eller gjøre andre endringer i inittab-filen, må du fortelle init om endringen og få den til å lese filen på nytt. Noen bruker kill -HUP 1 for å fortelle init å gjøre dette. Denne tradisjonelle metoden fungerer på de fleste versjoner av Unix, så lenge du skriver den riktig. Du kan imidlertid også kjøre denne telinit-kommandoen:

telinit q

Du kan også bruke telinit s for å bytte til enkeltbruker mode.

Nedleggelse

init styrer også hvordan system slås av og starter på nytt. Den rette måten å shut down a Linux machine er å bruke shutdown-kommandoen.

Det er to grunnleggende måter å bruke avstenging på. Hvis du stopper system, lukker den machine deg ned og holder den nede. Å lage machine stopp umiddelbart, bruk denne kommandoen:

shutdown-h nå

På de fleste modern machines med rimelig nyere versjoner av Linux, kutter en stopp strømmen til machine. Du kan også starte på nytt machine. For å starte på nytt, bruk -r i stedet for -h.

Avslutningsprosessen tar flere sekunder. Du bør aldri tilbakestille eller slå av en machine i løpet av dette stadiet.

I det foregående eksemplet er det på tide å shut down. Dette argumentet er obligatorisk, men det er mange måter å spesifisere det på. Hvis du vil ha macHint å gå ned en gang i fremtiden, en måte er å bruke + n, hvor n er antall minutter avslutning bør vente før du gjør arbeidet. For andre options, se på avslutningsveiledningen (8).

For å gjøre system start på nytt på 10 minutter, kjør denne kommandoen:

shutdown-r + 10

On Linux, varsler avslutning alle som er pålogget at machine går ned, men det gjør lite virkelig arbeid. Hvis du spesifiserer et annet tidspunkt enn nå, oppretter avslutning en fil kalt /etc/nologin. Når denne filen er til stede, vil system forbyr pålogginger av andre enn superbrukeren.

Når system avstengningstid endelig ankommer, avslutning forteller init å bytte til nivå 0 for stopp og kjørenivå 6 for omstart. Når init enters runlevel 0 eller 6, alt av følgende finner sted, som du kan bekrefte ved å se på skriptene i rc0.d og rc6.d:

1. init dreper alle prosesser at det kan (som det ville gjort når du bytter til en annen runlevel).

# De første rc0.d / rc6.d-kommandoene kjøres og låses system filer på plass og gjøre andre forberedelser til nedleggelse.
# De neste rc0.d/rc6.d-kommandoene avmonter alle filersystems annet enn roten.
# Ytterligere rc0.d/rc6.d-kommandoer remonter rotfilensystem skrivebeskyttet.
# Enda flere rc0.d/rc6.d kommandoer skriver alle bufrede data ut til filensystem med synkroniseringsprogrammet.
# De endelige rc0.d / rc6.d kommandoer fortelle kjernen om å starte eller stoppe med omstart, halte eller poweroff program.

Start- og stoppprogrammene oppfører seg annerledes for hvert løpsnivå, og kan forårsake forvirring. Av default, kaller disse programmene shutdown med -r eller -h options, men hvis den system er allerede stanset eller start på nytt nivå, forteller programmene kjernen å slå seg av umiddelbart. Hvis du virkelig vil stenge machind deg i en hast (se bort fra mulige skader fra en ordentlig avstengning), bruk alternativet -f.

Teknologiinteressert, jeg skriver med glede på StealthSettings.com siden 2006. Jeg har bred erfaring med operativsystemer: macOS, Windows og Linux, samt programmeringsspråk og bloggplattformer (WordPress) og for nettbutikker (WooCommerce, Magento, PrestaShop).

Legg igjen en kommentar