Linux Kängor

Som det visar sig är det inte mycket med startprocessen:

1. En starthanterare hittar kärnavbildningen på disk, laddar den i minnet och startar den.
2. De kärnan initiera enheter och STI-drivrutiner.
3. Kärnan monterar rotfilensystem.
4. Kärnan startar init Called Program.
5. init sätter resten av processer i rörelse.
6. De sista Processer som init startar som en del av startsekvensen att du kan logga in.

Att identifiera varje steg i startprocessen är ovärderligt för att fixa startproblem och förstå system som helhet. För att starta, nollställ in startladdaren, vilket är den första skärmen eller uppmaningen du får när datorn gör sitt självtest och frågar vilken funktion system att springa. När du har gjort ett val kör starthanteraren Linux kärna, överlämna kontroll av system till kärnan.

Det finns en detaljerad diskussion om kärnan andra ställen i denna bok som denna artikel är ett utdrag. Denna artikel täcker kernel initiering stadium, scenen när kärnan skriver ut en massa meddelanden om hårdvaran som finns på system. Kärnan startar init strax efter att den visar ett meddelande som förklarar att kärnan har monterat rotfilsystem:

VFS: Monterad root (ext2-filersystem) läsbart.

Strax efter kommer du att se ett meddelande om initstart, följt av system tjänsten startmeddelanden, och slutligen får du en inloggningsprompt av något slag.

ANMÄRKNINGAR : På Red Hat Linux, init-noten är särskilt uppenbar, eftersom den "välkommen" dig till Red Hat Linux.” Alla meddelanden därefter visar framgång eller misslyckande inom parentes till höger på skärmen.

De flesta av dessa kapitel behandlar init, eftersom det är den del av startsekvensen där du har mest kontroll.
init

Det är inget speciellt med init. Det är ett program precis som alla andra på Linux system, och du hittar den i / sbin tillsammans med andra system binärer. Huvudsyftet med init är att starta och stoppa andra program i en viss sekvens. Allt du behöver veta är hur denna sekvens fungerar.

Det finns lite olika varianter, men de flesta Linux distributioner använder System V-stil som diskuteras här. Vissa distributioner använder en enklare version som liknar BSD-init, men du kommer troligtvis inte att möta detta.

Runlevels

Vid varje given tidpunkt på en Linux systemkörs en viss basuppsättning av processer. Detta tillstånd av machine kallas dess runlevel, och det betecknas med ett tal från 0 till 6. The system tillbringar större delen av sin tid i ett enda körnivå. Men när du stänger av machine down, init växlar till ett annat körnivå för att avsluta system tjänster på ett ordnat sätt och att säga till kärnan att sluta. Ännu en körnivå är för en användare mode, diskuteras senare.

Det enklaste sättet att få grepp om körnivåer är att undersöka init-konfigurationsfilen, /etc/inittab. Leta efter en rad som följande:

ID: 5: initdefault:

Denna linje betyder att default körnivå på system är 5. Alla rader i inittab-filen har denna form, med fyra fält separerade med kolon i följande ordning:
# En unik identifierare (en kort sträng, Såsom id i föregående exempel)
# Tillämplig runlevel nummer (s)
# Den åtgärd som init bör vidta (i föregående exempel är åtgärden att ställa in default körnivå till 5)
# Ett kommando som ska köras (tillval)

Det finns inget kommando att utföra i föregående initdefault exempel eftersom ett kommando inte är vettigt i samband med att ställa in default runlevel. Titta lite längre ner i inittab tills du ser en rad så här:

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

Denna linje utlöser det mesta av system konfiguration och tjänster via katalogerna rc * .d och init.d. Du kan se att init är inställt för att utföra ett kommando som heter /etc/rc.d/rc 5 när det är i körnivå 5. Väntetiden berättar när och hur init kör kommandot: kör rc 5 en gång när enterin runlevel 5 och vänta sedan på att det här kommandot är slut innan du gör något annat.

Det finns flera olika åtgärder i addition till initdefault och vänta, särskilt när det gäller strömhantering, och inittab (5) manualsidan berättar om dem. De som du troligen stöter på förklaras i följande avsnitt.

återskapnings

Åtgärden respawn gör att init kör kommandot som följer, och om kommandot slutförs körs det igen. Du kommer sannolikt att se något som liknar denna rad i din inittab-fil:

1: 2345: respawn :/ sbin / mingetty tty1

Getty programmen Ge inloggnings anvisningarna. Den föregående raden är för den första virtuella konsollen (/ dev / tty1), den du ser när du trycker på ALT eller KONTROLL-ALT-F1 F1. Den respawn åtgärden ger inloggningsprompten tillbaka efter att du loggar ut.

ctrlnågon annanstans

Smakämnen ctrlaltdel action styr vad system gör när du trycker på CONTROL-ALT-DELETE på en virtuell konsol. På de flesta systems, detta är ett slags omstartkommando med avstängningskommandot.

sysinit

Sysinit-handlingen är den allra första saken som den bör köras när den startar, innan enteri alla runlevels.

Hur Processer i runlevels startar

Du är nu redo att lära dig att initiera system tjänster, precis innan du kan logga in. Kom ihåg denna inittab-rad från tidigare:

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

Denna lilla linje utlöser Många andra program. rc står för run-kommandon, och du kommer att höra människor hänvisar till de kommandon som skript, program eller tjänster. Så, var är dessa kommandon, hur som helst?

För körning 5, i detta exempel, är kommandona antagligen antingen i /etc/rc.d/rc5.d eller /etc/rc5.d. Runlevel 1 använder rc1.d, runlevel 2 använder rc2.d, och så vidare. Du kan hitta följande items i katalogen rc5.d:

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

Den rc 5 Kommandot startar program i denna runlevel katalogen genom att köra GMT kommandon:

S10sysklogd hem
S12kerneld hem
S15netstd_init hem
S18netbase hem
.
S99sshd hem

Lägg märke till startargumentet i varje kommando. S:et i ett kommandonamn betyder att kommandot ska köras i början mode, och siffran (00 till 99) bestämmer var i sekvensen rc startar kommandot.

Den rc *. D-kommandon är oftast skalskript Start Program som i / sbin eller / usr / sbin. Normalt kan du räkna ut vad en av de kommandon som faktiskt gör genom att titta på skriptet med mindre eller annan personsökare program.

Du kan starta en av dessa tjänster för hand. Till exempel, om du vill starta httpd webbserverprogrammet manuellt, kör S99httpd start. På samma sätt, om du någonsin behöver döda en av tjänsterna när machine är på, du kan köra kommandot i katalogen rc * .d med stoppargumentet (S99httpd stopp, till exempel).

Vissa rc*.d-kataloger innehåller kommandon som börjar med K (för "döda" eller stoppa mode). I det här fallet kör rc kommandot med stop-argumentet istället för start. Det är mest sannolikt att du stöter på K-kommandon i körnivåer som stänger av system ner.

Adding och avlägsnande av tjänster

Om du vill add, radera eller ändra tjänster i rc*.d-katalogerna, måste du ta en närmare titt på filerna inuti. En lång lista avslöjar en struktur som denna:

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

Kommandon i en rc*.d-katalog är egentligen symboliska länkar till filer i en init.d-katalog, vanligtvis i /etc eller /etc/rc.d. Linux distributioner innehåller dessa länkar så att de kan använda samma startskript för alla körnivåer. Denna konvention är inte på något sätt ett krav, men det gör ofta organisationen lite lättare.

För att förhindra att ett av kommandona i init.d-katalogen körs i ett visst körnivå kan du tänka på att ta bort den symboliska länken i lämplig rc * .d-katalog. Detta fungerar, men om du gör ett misstag och någonsin behöver sätta tillbaka länken, kan du ha problem med att komma ihåg det exakta namnet på länken. Därför bör du inte ta bort länkar i rc * .d-katalogerna, utan snarare add en understrykning (_) till början av länknamnet så här:

mv S99httpd _S99httpd

Vid starttid ignorerar rc _S99httpd eftersom det inte börjar med S eller K. Dessutom är det ursprungliga namnet fortfarande uppenbart och du har snabb åtkomst till kommandot om du är i nypa och behöver starta det för hand.

Till add en tjänst måste du skapa ett skript som de andra i init.d-katalogen och sedan skapa en symbolisk länk i rätt rc * .d-katalog. Det enklaste sättet att skriva ett manus är att undersöka de manus som redan finns i init.d, göra en kopia av en som du förstår och ändra kopian.

När addse till att du väljer en lämplig plats i startsekvensen för att starta tjänsten. Om tjänsten startar för tidigt kanske det inte fungerar på grund av beroende av någon annan tjänst. För icke-nödvändiga tjänster, de flesta systems administrators föredrar siffror på 90-talet, efter de flesta av de tjänster som följde med system.

Linux distributioner kommer vanligtvis med ett kommando för att aktivera och inaktivera tjänster i rc*.d-katalogerna. Till exempel i Debian är kommandot update-rc.d, och i Red Hat Linux, kommandot är chkconfig. Grafiska användargränssnitt finns också tillgängliga. Att använda dessa program hjälper till att hålla startkatalogerna konsekventa och hjälper till med uppgraderingar.

TIPS: En av de vanligaste Linux installattionsproblem är en felaktigt konfigurerad XFree86-server som slår på och av, vilket gör system oanvändbar på konsoler. För att stoppa detta beteende, starta upp till enanvändare mode och ändra din runlevel eller runlevel-tjänster. Leta efter något som innehåller xdm, gdm eller kdm i dina rc*.d-kataloger, eller din /etc/inittab.

Styra init

Ibland behöver du ge init en liten kick för att säga åt den att byta körnivå, läsa inittab-filen igen eller bara för att shut down d system. Eftersom init alltid är den första processen på en system, dess process-ID är alltid 1.

Du kan styra init med telinit. Till exempel, om du vill byta till runlevel 3, använd det här kommandot:

telinit 3

När du byter körnivå försöker init avbryta alla processer som inte finns i inittab-filen för den nya körnivån. Därför bör du vara försiktig med att ändra körnivåer.

När du behöver add eller ta bort återupptagningsjobb eller göra någon annan ändring av inittab-filen, måste du berätta för init om ändringen och få den att läsa filen igen. Vissa människor använder kill -HUP 1 för att säga åt init att göra detta. Denna traditionella metod fungerar på de flesta versioner av Unix, så länge du skriver det korrekt. Men du kan också köra detta telinit-kommando:

telinit q

Du kan också använda telinit s för att byta till enanvändare mode.

Stänga

init kontrollerar också hur system stängs av och startar om. Det rätta sättet att shut down a Linux machine är att använda kommandot shutdown.

Det finns två grundläggande sätt att använda avstängning. Om du stoppar system, stänger den machine ner och håller den nere. Att göra machine stoppa omedelbart, använd detta kommando:

shutdown-h now

På de flesta modern machines med någorlunda nyare versioner av Linux, ett stopp bryter strömmen till machine. Du kan också starta om machine. För en omstart använder du -r istället för -h.

Avstängningsprocessen tar flera sekunder. Du bör aldrig återställa eller stänga av en machine under detta skede.

I föregående exempel är det dags att shut down. Detta argument är obligatoriskt, men det finns många sätt att specificera det. Om du vill ha macHinne att gå ner någon gång i framtiden, ett sätt är att använda + n, där n är antalet minuter avstängning bör vänta innan du gör sitt arbete. För annan options, titta på avstängningsmanualsidan (8).

Att göra system starta om på 10 minuter, kör det här kommandot:

shutdown-r + 10

On Linux, avstängning meddelar alla som är inloggade att macHine håller på att gå ner, men det gör lite verkligt arbete. Om du anger en annan tid än nu, skapar avstängning en fil som heter /etc/nologin. När den här filen finns visas system förbjuder inloggningar av alla utom superanvändaren.

När system avstängningstiden slutligen kommer, avstängning berättar init att byta till körnivå 0 för stopp och körnivå 6 för omstart. När init enters körnivå 0 eller 6, allt följande sker, vilket du kan verifiera genom att titta på skripten inuti rc0.d och rc6.d:

1. init dödar varje process Att det KAN (som det skulle när byte till någon annan runlevel).

# De första rc0.d / rc6.d-kommandona körs och låses system filer på plats och göra andra förberedelser för avstängning.
# Nästa rc0.d/rc6.d-kommandon avmonterar alla filersystemandra än roten.
# Ytterligare rc0.d/rc6.d-kommandon monterar om rotfilensystem skrivskyddad.
# Ännu fler rc0.d/rc6.d-kommandon skriver ut all buffrad data till filensystem med synkroniseringsprogrammet.
# De slutliga rc0.d / rc6.d kommandon berättar kärnan för att starta eller stoppa med omstarten, halt eller poweroff program.

Start- och stoppprogrammen beter sig olika för varje körnivå, vilket kan orsaka förvirring. förbi default, dessa program anropar avstängning med -r eller -h options, men om system är redan vid stopp eller omstart runlevel, säger programmen kärnan att stänga av sig omedelbart. Om du verkligen vill stänga din maclägg dig i bråttom (bortse från eventuella skador från en oordning avstängd), använd alternativet -f.

Brinner för teknik, skriver jag med glädje på StealthSettings.com sedan 2006. Jag har lång erfarenhet av operativsystem: macOS, Windows şi Linux, men också i programmeringsspråk och bloggplattformar (WordPress) och för nätbutiker (WooCommerce, Magento, PrestaShop).

Lämna en kommentar