Deep Insights "Ubuntu Linux" -järjestelmästä - näemmekö tämän?


Kuten tiedämme, LINUX on ydin eikä käyttöjärjestelmä, ja se toimitetaan useilla jakeluilla, kuten: Debian, Fedora, Ubuntu. vahva> jne. ja paljon muuta. Mark Shuttleworthin kehittämä Ubuntu-käyttöjärjestelmä on yleisesti tunnettu ja monien laajalti käytössä. Lisäksi, koska se on ilmainen ja avoimen lähdekoodin, sen uusi versio julkaistaan vuosittain, ja sen kehittämiseen osallistuvat tuhannet kehittäjät. Mutta miten se toimii? Mitkä kaikki prosessit, tapahtumalista saavat sen toimimaan ja mikä näiden prosessien merkitys on?

Tämä artikkeli vie sinut hieman syvemmälle Ubuntu OS:n sisäisiin osiin, jotka ovat erittäin mielenkiintoisia ja auttaisivat aloittelijaa ymmärtämään täydellisen käsityksen sen toiminnasta.

Aseta järjestelmä alas

Linuxilla on toimintaansa varten prosessi, jokainen järjestelmäpalvelu, mukaan lukien virranhallinta, käynnistys ja järjestelmän kaatumisten käsittely, on prosessi, jonka hakemistossa /etc/init on konfiguraatiotiedosto, joka kuvaa tapahtuman, jossa se suorittaa ja vastaavan tapahtuman, jossa se lopettaisi sen suorittamisen, ja samalla se ylläpitää myös muut konfigurointitiedostonsa, jotka kuvaavat sen ajonaikaista käyttäytymistä järjestelmän “/etc/” hakemistossa, jolloin järjestelmä tapahtumavetoinen.

Jos tapahtumia syntyy, niin jonkun pitäisi olla paikalla ottamaan ne kiinni ja toteuttamaan ne? On selvää, että ohjain on pääprosessimme, joka on kaikkien prosessien ylätasona, jonka prosessitunnus on 1 eli init. Tämä on prosessi, joka alkaa järjestelmän käynnistyessä eikä lopu koskaan. Tämä prosessi kuolee vasta, kun järjestelmän virta katkaistaan, koska ei ole prosessia, joka on init:n vanhempi.

Ubuntun aikaisemmat versiot ennen 6.10 sisälsivät vanhan tyylin sysvinit, jota käytettiin komentosarjojen suorittamiseen tiedostossa /etc/rcx.d ” hakemistoon jokaisen järjestelmän käynnistyksen ja sammutuksen yhteydessä. Mutta sen jälkeen upstart-järjestelmä korvasi vanhan tyylin sysvinit-järjestelmän, mutta tarjoaa edelleen yhteensopivuuden sen kanssa.

Uusimmissa Ubuntu-versioissa on tämä nouseva järjestelmä, mutta sen Ubuntu 6.10:stä tapahtuneen kehityksen jälkeen siihen on tehty useita muutoksia nykyiseen versioon 1.13.2 4. syyskuuta 2014 alkaen. siinä on 2 init-prosessia, yksi järjestelmäprosesseille ja toinen, joka hallitsee nykyistä sisäänkirjautuneen käyttäjän istuntoa ja on olemassa vain, kunnes käyttäjä on kirjautunut sisään, jota kutsutaan myös x-session initiksi. .

Koko järjestelmä on asetettu hierarkkiseksi järjestelmäksi, joka koostuu esi-isä-lapsi-suhteesta koko järjestelmän tehosta sammuttamiseen.

Esimerkki: Pieni hierarkkinen suhde molempien aloitusprosessien välillä on: system init(1) -> näytönhallinta (ytimen tila) -> näytönhallinta (käyttäjätila) -> user init(tai x-session init).

Järjestelmän init:n hallinnoimien prosessien määritystiedostot ovat hakemistossa /etc/init ja istunnon init:n hallinnoimien prosessien määritystiedostot ovat hakemistossa /usr/share/upstart (kuten nykyisten uusimpien versioiden 1.12 mukaan) ja nämä määritystiedostot ovat avain moniin tässä artikkelissa kuvattuihin prosesseihin liittyviin salaisuuksiin.

Syvemmälle hierarkiaan

Ubuntu tunnistaa kahden tyyppisiä prosesseja:

  1. Lyhytaikaiset työt (tai työ-ja kuole -työt).
  2. Pitkäikäiset työt (tai oleskelu-ja-työtyöt).

Järjestelmään muodostettu hierarkia johtuu prosessien välisestä riippuvuussuhteesta, jonka voimme ymmärtää tarkastelemalla niiden asetustiedostoja. Aloitetaan ensin yksinkertaisesta hierarkkisesta suhteesta niiden prosessien välillä, jotka saavat järjestelmän käynnistymään ja ymmärtämään kunkin merkityksen.

Käynnistyshierarkia

Init on ensimmäinen prosessi, joka käynnistyy järjestelmän käynnistämisen yhteydessä, ja se luokitellaan työ-ja jäädä-työhön, koska sitä ei koskaan lopeteta ja vain aloitus lopetetaan. virran katkaisu eli init vain kuolee ja sekin kerran istuntoa kohden ja se on sammutettaessa. Käynnistyksen yhteydessä init luo järjestelmän ensimmäisen tapahtuman eli käynnistystapahtuman. Jokaisessa "/etc/init" -tiedoston määritystiedostossa on kaksi riviä, jotka määrittelevät tapahtuman, joka saa prosessin alkamaan ja pysähtymään. Nämä rivit on korostettu alla olevassa kuvassa:

Tämä on prosessin failsafe-x määritystiedosto, ja ne alkavat ja pysähtyvät ehdoissa, jotka kuvaavat tapahtumaa, jossa prosessi alkaa. Suodattaessa käynnistystapahtuma init-prosessilta ne prosessit, joiden käynnistys on käynnistys ehdolla, suoritetaan rinnakkain ja tämä määrittää vain hierarkian, ja kaikki käynnistyksen yhteydessä suoritettavat prosessit ovat init:n lapsia.

Käynnistyksen yhteydessä alkavat prosessit on lueteltu alla, ja nämä ovat kaikki työ-ja kuole-töitä:

1. isäntänimi – Tämä on prosessi, joka vain kertoo järjestelmälle /etc/hostname-tiedostossa määritetyn isäntänimen.

2. kmod – Lataa ydinmoduulit eli kaikki ohjaimet /etc/modules-tiedostosta.

3. mountall – Tämä prosessi tuottaa paljon tapahtumia ja on pääasiassa vastuussa kaikkien tiedostojärjestelmien yhdistämisestä käynnistyksen aikana, mukaan lukien paikalliset tiedostojärjestelmät ja etätiedostojärjestelmät.

Myös /proc-tiedosto liitetään juuri tällä prosessilla ja kaiken asennustyön jälkeen viimeinen sen luoma tapahtuma on tiedostojärjestelmätapahtuma, joka saa hierarkian etenemään edelleen.

4. plymouth – Tämä prosessi suoritetaan asennusta käynnistettäessä, ja sen tehtävänä on näyttää järjestelmää käynnistettäessä näkyvä musta näyttö, jossa näkyy jotain alla olevaa:

5. plymouth-valmis – Osoittaa, että plymouth on pystyssä.

Seuraavat ovat pääprosessit, muut, jotka myös suoritetaan käynnistyksen yhteydessä, sisältävät, kuten udev-fallback-graphics jne. Palatakseni käynnistyshierarkiaan, pähkinänkuoressa seuraavat tapahtumat ja prosessit ovat järjestyksessä:

1. init sekä käynnistystapahtuman luominen.

2. mountall-asennustiedostojärjestelmät, plymouth (yhdessä mountall-alkuohjelman kanssa), joka näyttää aloitusnäytön, ja kmod-latausydinmoduulit.

3. mountallin luoma local-filesystem -tapahtuma, joka aiheuttaa dbusin suorittamisen. (Dbus on järjestelmänlaajuinen viestiväylä, joka muodostaa pistorasian, jonka avulla muut prosessit voivat kommunikoida keskenään lähettämällä viestejä tähän pistorasiaan ja vastaanottaja kuuntelee tämän pistorasian viestejä ja suodattaa sille tarkoitetut).

4. local-filesystem yhdessä aloitetun dbus- ja staattisen verkon ylös-tapahtuman kanssa, jotka aiheutuvat prosessiverkosta, joka toimii myös paikallisen tiedostojärjestelmän tapahtumassa, saavat verkonhallinnan suorittamaan.

5. mountallin luoma virtual-filesystem -tapahtuma saa udev:n suorittamaan. (udev on linuxin laitehallinta, joka hallitsee laitteiden hot-pluggingia ja on vastuussa tiedostojen luomisesta /dev-hakemistoon ja myös niiden hallinnasta.) udev luo tiedostot ramille, romille jne. /dev-hakemistoon, johon Mountall on asentanut virtuaalisen -tiedostojärjestelmät ja on luonut tapahtuman virtuaalitiedostojärjestelmä, joka tarkoittaa /dev-hakemiston asentamista.

6. udev saa aikaan upstart-udev-bridgen, mikä tarkoittaa, että paikallinen verkko on päällä. Sitten kun mountall on asentanut viimeisen tiedostojärjestelmän ja luonut tiedostojärjestelmätapahtuman.

7. tiedostojärjestelmä-tapahtuma yhdessä static-network-up-tapahtuman kanssa saa aikaan rc-sysinit-työn suorittamisen. Tässä tulee taaksepäin yhteensopivuus vanhemman sysvinitin ja nousevan...

9. rc-sysinit suorittaa telinit-komennon, joka kertoo järjestelmän ajotason.

10. Saatuaan ajotason init suorittaa skriptit, jotka alkavat kirjaimella S tai K (aloittaa työt, joissa on S nimensä alku ja niiden tappaminen, joiden nimen alussa on "K" hakemistossa /etc/rcX.d (jossa X on nykyinen ajotaso) .

Tämä pieni tapahtumasarja saa järjestelmän käynnistymään joka kerta, kun käynnistät sen. Ja tämä prosessien laukaiseminen on ainoa asia, joka vastaa hierarkian luomisesta.

Nyt toinen lisäys yllä olevaan on tapahtuman syy. Mikä prosessi aiheuttaa minkäkin tapahtuman, määritetään myös samassa prosessin konfiguraatiotiedostossa, kuten alla seuraavilla riveillä:

Yllä on osa prosessin asennustiedostosta. Tämä näyttää tapahtumat, joita se lähettää. Tapahtuman nimi seuraa sanaa tapahtuma. Tapahtuma voi olla joko se, joka on määritetty konfiguraatiotiedostossa kuten yllä, tai se voi olla prosessin nimi sekä etuliite "aloitus", "aloitettu", "pysäytys" tai "pysäytys".

Joten tässä määrittelemme kaksi termiä:

  1. Tapahtumien luontiohjelma: Sellainen, jonka asetustiedostossa on rivi "emits xxx", jossa xxx on sen omistaman tai luoman tapahtuman nimi.
  2. Tapahtumien sieppaaja: Sellainen, jonka alkamis- tai lopetusehto on xxx tai joka alkaa tai pysähtyy tapahtumassa, joka on luonut jonkin tapahtumageneraattoreista.

Siten seuraa hierarkia ja siten prosessien välinen riippuvuus:

Event generator (parent) -> Event catcher (child)

Monimutkaisuuden lisääminen hierarkiaan

Tähän asti sinun on täytynyt ymmärtää, kuinka vanhempi-lapsi-riippuvuuden hierarkia prosessien välillä on määritetty tapahtuman laukaisumekanismilla yksinkertaisen käynnistysmekanismin kautta.

Nyt tämä hierarkia ei ole koskaan kahdenkeskinen suhde, jossa on vain yksi vanhempi yhdelle lapselle. Tässä hierarkiassa meillä voi olla yksi tai useampi vanhempi yhdelle lapselle tai yksi prosessi on useamman kuin yhden lapsen vanhempi. Miten tämä toteutetaan?? No vastaus löytyy itse asetustiedostoista.

Nämä rivit on otettu prosessista – verkottumisesta ja tässä aloitus ehdolla näyttää hieman liian monimutkaiselta, joka koostuu monista tapahtumista, nimittäin - paikallisista tiedostojärjestelmistä, udevtriggeristä, säilystä<., ajotaso, verkostoituminen.

Paikalliset tiedostojärjestelmät lähettää mountall, udevtrigger on työn nimi, säiliötapahtuma lähettää container-detect, ajotason tapahtuma lähettää rc-sysinit, ja verkko on jälleen työ.

Siten hierarkiassa prosessiverkko on mountall-, udevtrigger- ja container-detect -alku, koska se ei voi jatkaa toimintaansa (prosessin toiminta on kaikki rivit, jotka on määritelty prosessin konfigurointitiedoston komentosarja- tai exec-osissa) kunnes yllä olevat prosessit luovat tapahtumansa.
Samoin meillä voi olla yksi prosessi, joka on monien vanhempi, jos yhden prosessin luoma tapahtuma tallennetaan useiden välimuistiin.

Erottuvat työtyypit

Kuten aiemmin on määritelty, meillä voi olla joko lyhytaikaisia (tai työ-ja kuole) tai pitkäikäisiä (tai pysy ja työskentele) työpaikkoja, mutta miten erottaa toisistaan niitä??

Työt, joiden määritystiedostoissa on sekä start on"- että "Stop on" -ehdot ja joiden kokoonpanotiedostoissa on sana tehtävä määritystiedostot ovat työ ja kuole -töitä, jotka alkavat luodusta tapahtumasta, suorittavat komentosarjan tai suoritusosan (suorituksen aikana ne estävät ne aiheuttaneet tapahtumat) ja kuolevat sen jälkeen vapauttaen estämänsä tapahtumat .

Työt, joiden määritystiedostossa ei ole stop on -ehtoa, ovat pitkäikäisiä tai pysy ja työskentele -töitä, eivätkä ne koskaan kuole. Nyt työpaikat voidaan luokitella edelleen seuraavasti:

  1. Ne, joilla ei ole respawn-ehtoa ja jotka pääkäyttäjä voi tappaa.
  2. Ne, joiden asetustiedostossa on respawn-ehto, joten ne käynnistyvät uudelleen tapetun jälkeen, ellei heidän työtään ole suoritettu.

Johtopäätös

Siten jokainen prosessi LINUXissa on riippuvainen joistakin, ja jotkut prosessit ovat riippuvaisia siitä, ja tämä suhde on monilla ja määritetään nousevan järjestelmän kanssa yhdessä muiden prosessin yksityiskohtien kanssa.