pașii

Cel mai bun mod de a înțelege cum funcționează un sistem de operare Linux este să-i urmați boot-ul pas cu pas. În timpul pornirii sunt lansate toate mecanismele care pun sistemul de operare în mișcare. Acest proces este complex, în mai multe etape și uneori confuz. Este interesant să-l studiezi, iar descoperirile pe care le faci în timp ce faci asta te pot surprinde foarte mult.

În general, descărcarea distribuției Linux poate fi împărțită în 5 etape:

  • Încărcător.
  • Pornirea și inițializarea nucleului.
  • Detectarea hardware-ului, încărcarea driverelor și montarea sistemelor de fișiere.
  • Pornirea serviciilor de sistem (daemoni).
  • Porniți o sesiune de utilizator grafică sau de consolă.
  • Conţinut

  • Pașii de pornire Linux
  • 1. Încărcător
  • 2. Kernel și initramfs
  • 3. Inițializare primară
  • 4. Lansarea demonilor
  • 5. X Window System și PAM
  • În loc de o concluzie
  • Pașii de pornire Linux

    Vom parcurge toate etapele și vom afla ce se întâmplă atunci când porniți o distribuție Linux tipică, deviând puțin de la BSD, macOS și Android. În multe cazuri, acest lucru vă va ajuta să înțelegeți de ce procesul de pornire Linux este așa.

    1. Încărcător

    Totul începe cu bootloader-ul, căruia BIOS-ul îi transferă controlul când pornește mașina. Pe vremuri, când Linux nu era atât de popular, LILO (Linux Loader) era folosit ca încărcător de pornire - simplu, foarte primitiv și nu permite modificarea configurației de boot din mers. De fapt, fișierul de configurare a fost cusut în bootloader-ul propriu-zis și a trebuit să fie reconstruit după fiecare modificare a setărilor: a actualizat kernel-ul, a uitat să îl reinstalați și laptopul nu mai pornește.

    Astăzi, pornirea Linux în aproape orice distribuție se ocupă inițial de Grubdezvoltat pentru sistemul de operare GNU/Hard. Grub este mult mai complex decât LILO și este de fapt un sistem de operare cu drepturi depline. Nu numai că citește configurația de pornire (de obicei /boot/grub/grub.cfg) direct de pe disc, dar vă permite și să remediați această configurație în loc. Grub are o linie de comandă încorporată, funcționează cu o duzină de sisteme de fișiere diferite și vă permite să formați lanțuri de pornire complexe.

    Imediat ce utilizatorul selectează elementul de meniu dorit (sau după un timeout), Grub găsește imaginea kernel-ului Linux asociată cu acel element de meniu pe disc (de obicei fișierul /boot/vmlinuz), precum și imaginea initramfs atașată acestuia ( despre asta puțin mai târziu), îl încarcă în memorie și transferă controlul către kernel.

    pașii
    Pașii de pornire Linux

    Pentru a vedea meniul Grub în Ubuntu, trebuie să țineți apăsat Shift

    2. Kernel și initramfs

    După primirea controlului, nucleul începe inițializarea inițială: subsistemul de gestionare a memoriei este pornit, handlerul de întrerupere este configurat și structurile de date necesare pentru funcționarea ulterioară a nucleului sunt inițializate. Când se face acest lucru, nucleul despachetează arhiva initramfs (denumită de obicei /boot/initramfs-linux.img și este o arhivă cpio comprimată cu gzip) într-un sistem de fișiere în memorie (tmpfs), face din sistemul său de fișiere rădăcină și rulează scriptul /init (numele poate diferi în diferite distribuții).

    Initramfs include un set de bază de componente ale unei distribuții Linux: directoare standard de sistem /bin, /lib, /etc și așa mai departe, cel mai simplu interpret de comenzi (de obicei ash), un set de comenzi BusyBox, mai multe biblioteci auxiliare și un set de kernel module (drivere) concepute pentru a lucra cu diferite unități și sisteme de fișiere.

    Pașii de pornire Linux. Conținutul initramfs.

    Sensul existenței initramfs îndeci pentru a rezolva problema găinilor și ouălor: descărcați driverele pentru a monta sistemul de fișiere rădăcină real înainte de a fi montat. Este exact ceea ce se întâmplă atunci când sistemul rulează scriptul /init. Detectează unitățile instalate în sistem, încarcă driverele nucleului pentru a lucra cu ele și apoi montează partiția dorită a unității dorite (nucleul știe care dintre ele datorită parametrului root transmis în timpul pornirii) la rădăcină, suprascriind astfel conținutul initramf-urilor. Apoi pornește scriptul /sbin/init, care începe următorul pas de încărcare a sistemului de operare.

    Descărcarea Linux. Scriptul init de la initramfs.

    3. Inițializare primară

    După ce scriptul /init de la initramfs își termină activitatea, rulează utilitarul /sbin/init al sistemului de fișiere real. Din acest moment, începe inițializarea sistemului de operare în sine: descărcarea driverelor necesare, conectarea sistemelor de fișiere și a partițiilor swap, configurarea interfețelor de rețea și pornirea serviciilor de sistem.

    Din punct de vedere istoric, /sbin/init a fost un utilitar foarte simplu care a transmis controlul doar anumitor scripturi în funcție de parametrul care i-a fost transmis (scripturile erau localizate în directoarele /etc/rcX.d/, unde X este nivelul de pornire). Fiecare script era responsabil pentru o operațiune strict specifică: unul a conectat sistemele de fișiere enumerate în fișierul /etc/fstab, altul a configurat interfețele de rețea, altul a pornit demonul cron (este responsabil pentru rularea sarcinilor periodice), iar altul a fost demonul syslog. (este responsabil pentru primirea mesajelor de jurnal și înregistrarea lor pe disc) și așa mai departe. Acest stil de inițializare a fost numit SystemV după versiunea UNIX în care a apărut.

    Virtutea stilului de inițializare SystemV este simplitatea sa extremă: este ușor de înțeles, ușor de implementat, ușor de utilizatmuncă. Cu toate acestea, nu se potrivește absolut cu realitățile moderne.

    Astăzi, încărcarea sistemului de operare nu se reduce la descărcarea a câtorva drivere, conectarea a două sisteme de fișiere, configurarea unei interfețe de rețea și pornirea a trei servicii. O configurație standard poate include zeci de demoni diferiți, fiecare dintre care poate dura mult timp pentru a porni, iar demonul însuși se poate prăbuși. SystemV pornește secvențial serviciile și nu le controlează ciclul de viață, astfel încât încărcarea devine lentă, iar funcționarea corectă în viitor nu este garantată.

    Pentru a evita aceste probleme, dezvoltatorii macOS au creat odată o alternativă la /sbin/init numită launchd. Aceasta este, fără exagerare, o dezvoltare de geniu - launchd nu numai că știe să controleze ciclul de viață al serviciilor, dar și le pornește numai atunci când aceste servicii devin necesare. Și o face într-un mod foarte neobișnuit.

    Vom vorbi despre cum se întâmplă acest lucru. Acum, în istoria lansării, ne interesează altceva, și anume că același sistem a fost creat sub influența lui. Astăzi, systemd face parte din majoritatea distribuțiilor Linux. Este mult mai complex decât /sbin/init și chiar launchd, iar în designul său nu există niciun indiciu de nivel de lansare și scripturi. Systemd operează cu conceptul de unitate, care poate reprezenta un serviciu, o operație de montare, o operație de configurare a interfeței de rețea și altele.

    Descărcarea Linux. Configurarea unității demonului Tor.

    Un limbaj declarativ special este folosit pentru a descrie unitățile, astfel încât să faceți o eroare de configurare este mai dificilă decât atunci când scrieți un script. Unitățile pot avea dependențe unele de altele și pot rula în paralel sau atunci când este necesar. De exemplu, serviciile (demonii) care nu depind de o conexiune la rețea pot fi pornite înainte de configurarea interfeței de rețea, altele —imediat după instalarea sa, al treilea - numai atunci când programele sau alte servicii le accesează.

    4. Lansarea demonilor

    Pornirea serviciilor (demonii) este unul dintre punctele cheie ale pornirii Linux. Un loc special aici este ocupat de demonul udev, fără de care o distribuție tipică Linux va fi inoperabilă.

    Udev gestionează conținutul directorului /dev. După cum știm cu toții, în sistemele Linux, acest director este folosit pentru a stoca așa-numitele fișiere dispozitiv - un tip special de fișier care reprezintă anumite componente ale computerului. Cu ajutorul fișierelor dispozitivului, Linux lucrează cu hardware: citiți fișierul /dev/sda1 și obțineți conținutul primei partiții a primului hard disk, scrieți date în /dev/fb0 și afișați imaginea pe ecran .

    La începutul UNIX, directorul /dev era static. Conținea un set de fișiere pentru toate ocaziile: chiar dacă computerul nu avea o placă de sunet instalată, fișierul /dev/dsp pentru ieșirea sunetului încă exista. Când cantitatea de echipamente variate era mică, iar plug'n'play încă nu s-a născut, nu au fost probleme: doar o duzină de fișiere. Dar, cu timpul, a devenit din ce în ce mai aglomerat și în cele din urmă s-a transformat într-un coș de gunoi.

    Prima soluție la această problemă a fost montarea unui sistem de fișiere virtual (devfs) în /dev, al cărui conținut ar fi gestionat de kernel. A găsit tot hardware-ul instalat și a creat fișiere numai pentru acele dispozitive care sunt de fapt prezente în mașină.

    Această soluție este încă folosită în macOS și FreeBSD, dar dezvoltatorii Linux au mers pe altă cale. Există un sistem de fișiere sysfs special atașat la directorul /sys. Este ceva ca o bază de date detaliată a tuturor dispozitivelor PC, de la procesor și controler de întrerupere până la cotiere și gamepad-uri.

    Descărcarea Linux. Nu poți cu /sysnu doar obțineți informații despre dispozitive, ci și gestionați-le.

    Cu ajutorul /sys, puteți nu numai să obțineți informații despre dispozitive, ci și să le gestionați.

    Pe baza informațiilor obținute de la /sys, demonul udev creează fișiere dispozitiv /dev. La prima pornire, parcurge toate dispozitivele din /sys, apoi adoarme și așteaptă până când un dispozitiv este adăugat sau eliminat: Am introdus o unitate flash - au apărut fișiere noi în /sys, udev s-a trezit și a creat un /dev fișierul dispozitivului pe baza acestora, prin descărcarea driverelor necesare.

    Un alt daemon important pentru sistemele UNIX este syslog. Acesta este un fel de agregator de jurnalele de aplicații, care le-a compilat în directorul /var/logs. Distribuțiile bazate pe Systemd folosesc de obicei systemd-journald, care stochează rapoarte într-un format binar special (syslog operează pe text). Puteți adăuga intrări noi, dar nu le puteți elimina. Aceasta este o protecție împotriva atacatorilor care ar putea elimina liniile necesare din fișiere pentru a ascunde urmele șederii lor în sistem.

    Distribuția medie Linux are și alți daemoni:

    • cron— este responsabil pentru executarea sarcinilor în funcție de timp. Poate rula comenzi la intervale specifice sau la momente bine definite. Cel mai simplu mod de a-l folosi este de a crea o copie de rezervă noaptea;
    • cupseste un demon de tipărire. Monitorizează coada de documente trimise spre tipărire și le dă imprimantei;
    • systemd-logind— gestionează sesiunile utilizatorilor, vă permite să comutați rapid între sesiuni, acordă permisiunea de a monta automat dispozitivele în numele utilizatorului și efectuează alte sarcini;
    • dbuseste un daemon magistrală de date care permite programelor să facă schimb de informații. Folosit în principal în medii desktop și aplicații grafice;
    • NetworkManager— configurator de interfețe de rețea. Este folosit numai în versiunile desktop ale distribuțiilor și poate fi înlocuit cu un analog. De exemplu, wicd.

    În cele mai multe cazuri, demonii fac schimb de informații cu aplicații și alți daemoni folosind socket-uri UNIX. Acesta este un canal de comunicare atașat unui fișier. De exemplu, demonul cups creează un socket /var/run/cups/cups.sock (locația poate diferi în diferite distribuții). Scriind date pe acesta, puteți trimite documente pentru tipărire.

    Această caracteristică este pe care launchd și systemd o folosesc pentru a lansa demonii numai după cum este necesar. Trucul este să creați socket-uri pentru toți demonii de sistem în avans și să porniți demonii înșiși numai atunci când cineva scrie date în socket; nu are rost să rulezi cupe pe boot sau în orice alt moment dacă nimeni nu trimite o lucrare de imprimare.

    5. X Window System și PAM

    Ultima etapă de încărcare este lansarea managerului de autentificare. În consolă, funcția managerului de autentificare este realizată prin combinația dintre utilitarul getty (se folosește de obicei o versiune mai avansată a agetty) și login. Getty este un vestigiu rămas din vremurile mainframe-urilor și terminalelor la distanță (numele înseamnă get teletype). Acesta trimite un mesaj text către terminal și apoi rulează utilitarul de conectare, care solicită autentificarea și parola utilizatorului. Când utilizatorul introduce parola corectă, login rulează shell-ul specificat în fișierul /etc/passwd în numele său.

    Managerul grafic de conectare se numește Display Manager și fiecare mediu grafic are propriul său mediu. KDE folosește managerul KDM, GNOME utilizează managerul GDM și este, de asemenea, posibil să utilizați un manager de afișare universal, cum ar fi Slim. În orice caz, sarcina managerului de afișare este să afișezeecran, o fereastră care cere un nume de utilizator și o parolă și, după autorizare, fie lansați direct managerul de ferestre, fie executați o serie de comenzi scrise în propriul fișier ~/.xinitrc.

    Pașii de pornire Linux. Manager de afișare KDM în Debian.

    Concomitent cu lansarea managerului de afișare, este lansat sistemul grafic X Window System, iar în distribuțiile moderne - Xorg. Acesta este un sistem client-server pentru afișarea graficelor pe ecran, unde serverul este responsabil pentru alcătuirea imaginii de ansamblu formată de diverse programe client. Sistemul X Window nu este un mediu grafic, ci doar un strat care permite aplicațiilor să trimită imagini pe ecran și să primească evenimente de intrare de la utilizator. Pentru a construi o interfață grafică bazată pe aceasta, este nevoie și de un manager de ferestre, care va permite utilizatorului să gestioneze ferestrele aplicației.

    Managerul de ferestre poate funcționa atât separat (de exemplu, fluxbox, window maker, i3), cât și ca parte a unui mediu desktop complex (KDE, GNOME, XFCE). Pe lângă managerul de ferestre, acestea includ și un set de instrumente pentru formarea unui desktop cu drepturi depline: o bară de activități în partea de jos sau sus a ecranului, un dock, un sistem de aranjare a pictogramelor pe desktop și multe altele. De obicei, fiecare dintre aceste elemente este controlat de una sau mai multe aplicații speciale.

    Indiferent de metoda de conectare pe care o folosește utilizatorul, PAM este întotdeauna responsabil pentru controlul accesului. Acesta este un sistem modular de autentificare a utilizatorului care își poate verifica identitatea într-o varietate de moduri, efectuând o serie de verificări pe parcurs. În mod implicit, PAM folosește doar autentificarea cu parolă, dar prin modificarea fișierelor de configurare /etc/pam.d, ordinea de autentificare poate fi schimbată, adăugând la aceasta, de exemplu, nevoia de a pune un deget pe scaneramprentele digitale, introduceți o unitate flash specială și chiar utilizați verificarea smartphone-ului. Am scris deja despre cum să facem acest lucru.

    Descărcarea Linux. Fișierul de configurare PAM al utilitarului de conectare

    În acest moment, procesul de descărcare poate fi considerat finalizat. Fie vă conectați la consolă și vedeți promptul de comandă, fie introduceți informațiile contului dvs. în fereastra managerului de afișare și, ca rezultat, desktopul apare pe ecran.

    În loc de o concluzie

    Așa arată pornirea unei distribuții Linux moderne. Am omis câteva detalii nu deosebit de importante și nu deosebit de interesante, dar am încercat să povestesc despre cele mai importante lucruri. Dacă vă gândiți bine, acesta nu este un proces atât de dificil, de fapt sistemul de operare este pregătit să accepte comenzile utilizatorului deja în stadiul de conectare initramfs, totul este începutul mediului, care este necesar pentru munca completă a utilizatorului.