Linux škornji

Kot se izkaže, ni veliko postopka zagona:

1. Nakladalnik zagona najde sliko jedra na disku, jo naloži v pomnilnik in jo zažene.
2. Jedro inicializira naprave in njegove voznike.
3. Jedro namesti korenski datotečni sistem.
4. Jedro začne program z imenom init.
5. Init sproži preostale procese v gibanju.
6. Zadnji procesi, ki se začnejo kot del zaporedja zagona, omogočajo prijavo.

Prepoznavanje vsake stopnje zagonskega postopka je neprecenljivo pri odpravljanju težav z zagonom in razumevanju sistema kot celote. Za začetek se na nakladalniku za zagon, ki je začetni zaslon ali poziv, ko računalnik opravi samo test vklopa in vpraša, kateri operacijski sistem naj zažene. Ko se odločite, zagonski nakladalnik zažene jedro Linux, ki predaja nadzor sistema jedru.

V tej knjigi je podrobna razprava o jedru drugod, iz katere je ta članek izvlečen. Ta članek zajema faza inicializacije jedra, oder, ko jedro natisne kup sporočil o strojni opremi, ki je prisotna v sistemu. Jedro začne init takoj, ko prikaže sporočilo, v katerem je razglasilo, da je jedro namestilo korenski datotečni sistem:

VFS: nameščen root (ext2 filesystem) bernonly.

Kmalu zatem boste videli sporočilo o INIT -u začetku, ki mu sledijo sporočila zagona sistemskih storitev in na koncu dobite nekakšen prijavni poziv.

Opomba : Naprej Rdeči klobuk Linux, Init opomba je še posebej očitna, ker je “pozdravlja” ti “Rdeči klobuk Linux.” Vsa sporočila nato kažejo uspeh ali neuspeh v oklepajih na desni strani zaslona.

Večina tega poglavja obravnava Init, ker je del zaporedja zagona, kjer imate največ nadzora.
init

V Inutu ni nič posebnega. To je program, tako kot kateri koli drug v sistemu Linux, in našli ga boste v /sbin skupaj z drugimi sistemskimi binarnimi binarji. Glavni namen Init je začeti in ustaviti druge programe v določenem zaporedju. Vse, kar morate vedeti, je, kako deluje to zaporedje.

Obstaja nekaj različnih različic, vendar večina distribucij Linux uporablja sistem System V, o katerem govori. Nekatere distribucije uporabljajo preprostejšo različico, ki spominja na BSD init, vendar tega verjetno ne boste naleteli.

Runlevels

V vsakem trenutku v sistemu Linux se izvaja določen osnovni niz procesov. To stanje naprave se imenuje svoj RunLevel in je označeno s številko od 0 do 6.. Sistem porabi večino svojega časa v enem samem vožnji. Ko pa zaprete stroj, Init preklopi na drugačen vodnik, da bi sistemski storitve uresničil in rekel, naj jedro neha, naj se ustavi. Še en tek je namenjen za način za en uporabnik, o katerem bomo razpravljali pozneje.

Najlažji način, da se lotite ročaja na Runlevels, je preučitev konfiguracijske datoteke init /etc /inittab. Poiščite vrstico, kot je naslednja:

ID: 5: initdefault:

Ta vrstica pomeni, da je privzeta vožnja v sistemu 5. Vse vrstice v datoteki INITTAB imajo ta obrazec, pri čemer so v naslednjem vrstnem redu, ločeni s štirimi polji, ločena s koloni:
# Edinstven identifikator (kratek niz, na primer ID v prejšnjem primeru)
# Uporabne številke (-e) RunLevel
# Ukrep, ki bi ga moral izvesti (v prejšnjem primeru, je dejanje nastaviti privzeti RunLevel na 5)
# Ukaz za izvedbo (neobvezno)

V prejšnjem primeru initutDefault ni ukaz, ki bi ga lahko izvedli, ker ukaz nima smisla v okviru nastavitve privzetega RunLevela. Poglejte malo naprej v Inittab, dokler ne zagledate takšne črte:

L5: 5: počakaj: /etc/rc.d/rc 5

Ta vrstica sproži večino konfiguracije in storitev sistema prek imenikov RC*.D in Init.D. Vidite, da je init nastavljen tako, da izvede ukaz z imenom /etc/rc.d/rc 5, ko je v RunLevelu 5. Akcija čakanja pove, kdaj in kako zažene ukaz: zažene RC 5 enkrat, ko vpišete RunLevel 5, nato pa počakajte, da ta ukaz konča, preden naredi kaj drugega.

Obstaja več različnih dejanj poleg initutDefaulta in čakanja, še posebej, ki se nanašajo na upravljanje električne energije, in ročna stran Inittab (5) vam pove vse o njih. Tisti, s katerimi se najverjetneje srečate, so razloženi v naslednjih razdelkih.

Ressawn

Ressawn Action povzroči, da Init zažene ukaz, ki sledi, in če ukaz zaključi izvedbo, ga ponovno zažene. Verjetno boste videli nekaj podobnega v tej vrstici v svoji datoteki Inittab:

1: 2345: Ressawn:/sbin/mingetty tty1

Programi Getty zagotavljajo pozive za prijavo. Prejšnja črta je za prvo virtualno konzolo (/dev/tty1), tisto, ki jo vidite, ko pritisnete Alt-F1 ali Control-Alt-F1. Reshawn Action pripelje prijavni poziv nazaj, ko se odjavite.

Ctrlaltel

Dejanje CTRLaltdel nadzira tisto, kar sistem počne, ko na virtualni konzoli pritisnete Control-Alt-Delete. V večini sistemov je to nekakšen ukaz za ponovni zagon z ukazom izklopa.

syin

Akcija sysinit je prva stvar, ki bi jo Init zagnala, ko se začne, preden vstopite v katero koli vožnjo.

Kako se začnejo procesi v tekah

Zdaj ste pripravljeni, da se naučite, kako Init začne sistemske storitve, tik preden vam omogoča, da se prijavite. Spomnite se to linijo Inittab iz prej:

L5: 5: počakaj: /etc/rc.d/rc 5

Ta majhna linija sproži številne druge programe. RC pomeni ukaze za zagon in slišali boste, da ljudje navajajo ukaze kot skripte, programe ali storitve. Torej, kje so ti ukazi?

Za RunLevel 5 so v tem primeru ukazi verjetno bodisi v /etc/rc.d/rc5.d ali /etc/rc5.d. RunLevel 1 uporablja RC1.D, RunLevel 2 uporablja RC2.D in tako naprej. V imeniku RC5.D boste morda našli naslednje elemente:

S10Sysklogd S20PPP S99GPM
S12Kerneld S25Netstd_nfs S99HTTPD
S15netstd_init s30netstd_misc s99rmnologin
S18NetBase S45PCMCIA S99SSHD
S20ACCT S89ATD
S20Logoutd S89Cron

Ukaz RC 5 začne programe v tem imeniku RunLevel z izvajanjem naslednjih ukazov:

S10sysskLogd začetek
S12Kerneld Start
S15Netstd_init Start
S18NetBase Start

S99SSHD začetek

V vsakem ukazu opazite argument Start. S v imenu ukaza pomeni, da mora ukaz zagnati v načinu začetka, številka (00 do 99) pa določa, kje v zaporedju RC zažene ukaz.

Ukazi RC*.D so običajno skripte lupine, ki začnejo programe v /sbin ali /usr /sbin. Običajno lahko ugotovite, kaj eden od ukazov dejansko počne tako, da pogledate scenarij z manj ali drugim programom pozivi.

Eno od teh storitev lahko začnete ročno. Na primer, če želite ročno zagnati program spletnega strežnika HTTPD, zaženite S99HTTPD START. Podobno, če boste kdaj morali ubiti eno od storitev, ko je stroj vklopljen, lahko ukaz zaženete v imeniku RC*.D z argumentom Stop (na primer S99HTTPD).

Nekateri imeni RC*.D vsebujejo ukaze, ki se začnejo s K (za “ubiti,” ali način zaustavitve). V tem primeru RC namesto začetka vodi ukaz z argumentom zaustavitve. Najverjetneje boste naleteli na ukaze K v Runlevels, ki sistem zapirajo.

Dodajanje in odstranjevanje storitev

Če želite dodati, izbrisati ali spremeniti storitve v imenikih RC*.D, morate podrobneje pogledati datoteke v notranjosti. Dolg seznam razkriva takšno strukturo:

LRWXRWXRWX. . . S10SYSOGD -> ../init.d/Sysklogd
LRWXRWXRWX. . . S12Kerneld -> ../init.d/kerneld
LRWXRWXRWX. . . S15Netstd_init -> ../init.d/Netstd_init
LRWXRWXRWX. . . S18NetBase -> ../init.d/netbase

Ukazi v imeniku RC*.D so dejansko simbolične povezave do datotek v imeniku init.d, običajno v /etc ali /etc/rc.d. Linux distribucije vsebujejo te povezave, tako da lahko za vse Runlevels uporabijo iste zagonske skripte. Ta konvencija nikakor ni zahteva, vendar organizacija pogosto olajša.

Če želite preprečiti, da bi eden od ukazov v imeniku init.d tekel v določeni vožnji, boste morda pomislili, da odstranite simbolično povezavo v ustreznem imeniku RC*.D. To deluje, toda če se zmotite in kdaj morate povezati povezavo, boste morda imeli težave pri spominu natančnega imena povezave. Zato ne bi smeli odstraniti povezav v imenikih RC*.D, temveč dodajte podčrtano (_) na začetek imena povezave, kot je ta:

MV S99HTTPD _S99HTTPD

V času zagona RC ignorira _S99HTTPD, ker se ne začne s S ali K. Poleg tega je prvotno ime še vedno očitno in imate hiter dostop do ukaza, če ste v ščepcu in ga morate zagnati ročno.

Če želite dodati storitev, morate ustvariti skript, kot so drugi v imeniku init.d, nato pa v pravilni imeni RC*.D narediti simbolično povezavo. Najlažji način za pisanje skripta je preučiti skripte, ki so že v init.d, naredite kopijo tistega, ki ga razumete, in spremenite kopijo.

Ko dodajate storitev, se prepričajte, da v zaporedju zagona izberete ustrezno mesto za zagon storitve. Če se storitev začne prezgodaj, morda ne bo delovala zaradi odvisnosti od neke druge storitve. Za nebistvene storitve ima večina skrbnikov sistemov v 90. letih raje številke, po večini storitev, ki so bile priložene sistemu.

Linux distribucije običajno prihajajo z ukazom, ki omogočajo in onemogočijo storitve v imenikih RC*.D. Na primer, v Debianu je ukaz Update-Rc.d, v Red Hat Linux pa je ukaz chkconfig. Na voljo so tudi grafični uporabniški vmesniki. Uporaba teh programov pomaga ohranjati zagonske imenike dosledne in pomaga pri nadgradnjah.

Namig: Ena najpogostejših težav z namestitvijo Linuxa je nepravilno konfiguriran strežnik XFree86, ki se utripa in izklopi, zaradi česar je sistem neuporaben na konzoli. Če želite zaustaviti to vedenje, zaženite v način za en uporabnik in spremenite svoje storitve Runlevel ali RunLevel. Poiščite nekaj, kar vsebuje XDM, GDM ali KDM v imenikih RC*.D ali v vašem /etc /inittab.

Nadzor init

Občasno morate init malo udariti, da mu pove, da preklopi Runlevels, za ponovno branje datoteke inittab ali samo za izklop sistema. Ker je Init vedno prvi postopek v sistemu, je njegov ID procesa vedno 1.

Lahko nadzorujete init s Telinit. Na primer, če se želite preklopiti na RunLevel 3, uporabite ta ukaz:

Telinit 3

Pri preklapljanju Runlevels poskuša ubiti vse procese, ki niso v datoteki inittab za novo RunLevel. Zato bi morali biti previdni pri spreminjanju voženj.

Ko morate dodati ali odstraniti opravila za odpravo ali narediti kakršno koli drugo spremembo v datoteki Inittab, morate o spremembi povedati in jo povzročiti, da datoteko ponovno prebere. Nekateri uporabljajo ubij -HUP 1, da bi to storili, naj to stori. Ta tradicionalna metoda deluje na večini različic Unixa, če jo pravilno vtipkate. Vendar lahko zaženete tudi ta ukaz Telinit:

Telin Q.

Telinit S lahko uporabite tudi za prehod v način za en uporabnik.

Zaprtje

Init nadzoruje tudi, kako se sistem izklopi in ponovno zažene. Pravilen način za izklop stroja Linux je uporaba ukaza za izklop.

Obstajata dva osnovna načina uporabe izklopa. Če sistem zaustavite, stroj zapre in ga zadrži. Če želite stroj takoj zaustaviti, uporabite ta ukaz:

Izklop -h zdaj

Na večini sodobnih strojev z dokaj nedavnimi različicami Linuxa zaustavi napajanje naprave. Stroj lahko znova zaženete. Za ponovni zagon uporabite -r namesto -H.

Postopek zaustavitve traja nekaj sekund. V tej fazi nikoli ne smete ponastaviti ali izklopiti stroja.

V prejšnjem primeru je zdaj čas, da se zaprete. Ta argument je obvezen, vendar obstaja veliko načinov, kako ga določiti. Če želite, da se stroj v prihodnosti spusti, je eden od načinov uporaba +N, kjer je N, ki je število minut, pred opravljanjem svojega dela počakati. Za druge možnosti si oglejte ročno stran za izklop (8).

Če želite sistem znova zagnati v 10 minutah, zaženite ta ukaz:

Izklop -r +10

V Linuxu Shutdown obvesti vsakogar, ki je prijavljen, da se stroj spušča, vendar malo dela. Če določite čas, ki ni zdaj, Shutdown ustvari datoteko z imenom /etc /noologin. Ko je ta datoteka prisotna, sistem prepoveduje prijave kdorkoli razen superizatorja.

Ko končno pride čas zaustavitve sistema, Shutdown reče Init, naj preklopi na RunLevel 0 za zaustavitev in RunLevel 6 za ponovni zagon. Ko Init vstopi v RunLevel 0 ali 6, poteka vse naslednje, ki jih lahko preverite tako, da pogledate skripte znotraj rc0.d in rc6.d:

1. Init ubije vsak postopek, ki ga lahko (kot bi bil pri prehodu na katero koli drugo vožnjo).

# Začetni ukazi RC0.D/RC6.D Zaženejo, zaklepanje sistemskih datotek na svoje mesto in druge priprave za izklop.
# Naslednji ukazi RC0.D/RC6.D Odstranite vse datotečne sisteme, razen koren.
# Nadaljnji ukazi RC0.D/RC6.D REMONT ROOT DATESTEM SAMO BEAT.
# Še več ukazov RC0.D/RC6.D V datotečni sistem s programom Sync vpišete vse medpomnilne podatke.
# Končni ukazi RC0.D/RC6.D povejte jedru, naj se znova zažene ali ustavi s programom ponovnega zagona, zaustavitve ali napajanja.

Programi ponovnega zagona in zaustavitve se za vsako vožnjo obnašajo drugače, kar lahko povzroči zmedo. Ti programi privzeto pokličejo zaustavitev z možnostmi -r ali -H, če pa je sistem že na zaustavitvi ali ponovni zagon, programi pravijo, da se jedro takoj izklopi. Če se resnično želite v naglici izklopiti (ne upoštevate morebitne škode zaradi neurejene zaustavitve), uporabite možnost -f.

Strastno do tehnologije, pišem z užitkom na StealthSetts.com, ki se začne z letom 2006. Imam bogato izkušnjo v operacijskih sistemih: MacOS, Windows in Linux, pa tudi v programskih jezikih in platformah za bloganje (WordPress) in za spletne trgovine (WooCommerce, Magento, Presishop).

Pustite komentar