Procesul de pornire Linux

Procesul de pornire Linux este pașii prin care sistemele de operare bazate pe Linux sunt pregătite . Acest proces este în multe privințe similar cu pornirea BSD și a altor sisteme asemănătoare Unix din care provine.

Prezentare generală a procesului

Când computerul pornește, are loc un transfer în serie de control de la firmware-ul sistemului computerului ( BIOS sau UEFI ) la bootloader și de la acesta la kernel . Nucleul pornește apoi planificatorul (pentru multitasking) și execută programul init (care configurează mediul utilizatorului și permite interacțiunea și autentificarea utilizatorului), după care nucleul rămâne inactiv până când primește un apel extern.

Principalii pași de descărcare:

  1. Firmware-ul de sistem al computerului efectuează verificarea inițială și inițializarea hardware -ului .
  2. În cazul BIOS-ului, firmware-ul se încarcă în RAM și execută codul de pornire de la una dintre partițiile dispozitivului de pornire specificat, care conține faza 1 a bootloader-ului Linux. Faza 1 încarcă faza 2 (cod încărcător semnificativ). Unele încărcătoare de pornire pot utiliza o etapă intermediară (numită fază 1.5 ) pentru aceasta, deoarece discurile moderne de mare capacitate pot să nu citească corect fără cod suplimentar. În cazul UEFI, se lansează bootloader-ul încărcat din partiția de serviciu (EFS), care este selectat în funcție de setările de prioritate de pornire definite în memoria nevolatilă a computerului. În acest caz, este posibil să încărcați nu numai un bootloader specializat, dar puteți încărca direct nucleul Linux (pentru aceasta, nucleul trebuie să fie construit cu opțiunea EFI_STUB).
  3. Bootloader-ul va prezenta adesea utilizatorului un meniu cu opțiuni de pornire disponibile. După selecție sau după un timeout specificat, bootloader-ul încarcă nucleul.
  4. Nucleul încărcat se decomprimă în memorie, configurează funcții de sistem, cum ar fi operarea hardware-ului necesar și gestionarea paginilor de memorie, apoi efectuează un apel către start_kernel().
  5. După aceea , start_kernel()efectuează configurația de bază a sistemului (întreruperi, alte funcții de gestionare a memoriei, inițializarea dispozitivelor, drivere etc.), apoi generează un proces inactiv , un dispecer și, separat de acestea, un proces de inițializare (care rulează în spațiul utilizatorului). ).
  6. Planificatorul începe să gestioneze sistemul mai eficient în timp ce nucleul este inactiv.
  7. Procesul init execută scripturile necesare care configurează toate serviciile și structurile non-kernel, care vor crea un mediu de utilizator și vor prezenta utilizatorului un ecran de autentificare.

Când are loc o oprire, init este apelat pentru a termina programele la nivel de utilizator într-o manieră controlată, tot conform scripturilor. După aceea, init este închis, iar nucleul își efectuează propria închidere.

Faza de încărcare

La pornirea prin BIOS: Fazele bootloader-ului diferă în funcție de platformă. Deoarece pașii timpurii de pornire sunt independenți de sistemul de operare, procesul de pornire începe de obicei astfel:

De acum înainte, descărcarea continuă. Prima fază încarcă restul codului de încărcare, care de obicei întreabă ce sistem de operare (sau tip de sesiune) dorește să ruleze utilizatorul. Codul bootloader-ului este generat dintr-un fișier de configurare /etc/lilo.conf (для LILO)care definește sistemele disponibile. Acest fișier conține, în special, informații despre partiția de pornire și locația nucleului pentru fiecare dintre aceste sisteme, precum și opțiuni de pornire suplimentare, dacă există. Ca urmare a alegerii, nucleul corespunzător este încărcat în RAM , sistemul de fișiere inițial minim este configurat din fișierul imagine ( initrd ) și apoi, împreună cu parametrii corespunzători, controlul este transferat către noul sistem de operare.

LILO și GRUB au anumite diferențe: [1]

La pornirea prin UEFI: În UEFI, bootloader-ul pornește imediat în modul protejat (32-bit sau 64-bit) și, de fapt, toate fazele bootloader-ului sunt încărcate simultan (ținând cont de pornirea din partiția de serviciu, nu este nevoie pentru ca bootloader-ul să se împartă în faze separate și să le plaseze în locuri diferite). În caz contrar, procesul de încărcare și inițializare a nucleului nu diferă de versiunea BIOS.

GRUB

BIOS:

  1. Bootloader-ul de fază 1 este citit de BIOS din MBR (Master Boot Record). [patru]
  2. Încarcă restul bootloader-ului (a doua fază). Dacă a doua fază este pe un disc mare, uneori se încarcă o fază intermediară 1.5, care conține un cod suplimentar care permite citirea cilindrilor cu numere mai mari de 1024 ( discuri LBA ). Încărcătorul de fază 1.5 este stocat (dacă este necesar) în MBR sau partiția de boot. [patru]
  3. A doua fază a bootloader-ului este executată și afișează meniul de pornire GRUB. De asemenea, vă permite să selectați un mediu de rulare și să vizualizați setările sistemului.
  4. Când este selectat un sistem de operare, acesta este încărcat și controlul este transferat acestuia. [patru]

GRUB acceptă atât pornirea directă, cât și pornirea în lanț, precum și LBA, ext2 și „un adevărat mediu orientat spre comandă, pre-op pe mașinile x86”. Are trei interfețe: meniu de selecție, editor de setări și consolă de comandă. [patru]

UEFI:

  1. Încărcat din partiția de serviciu EFS, GRUB (o versiune specială a unui fișier binar care poate porni UEFI) conține toate componentele necesare pentru a accesa sistemul de fișiere /boot unde se află fișierele de configurare și bootloader suplimentare.
  2. Afișează meniul bootloaderului și afișează meniul de pornire GRUB. De asemenea, vă permite să selectați un mediu de rulare și să vizualizați setările sistemului.
  3. Când este selectat un sistem de operare, acesta este încărcat și controlul este transferat acestuia. [patru]

LILO

LILO este mai vechi decât GRUB și aproape identic în funcționare, cu excepția faptului că nu conține o interfață de linie de comandă. Prin urmare, toate modificările trebuie făcute setărilor sale și scrise în MBR, după care sistemul este repornit. Astfel, o configurare greșită poate face discul de nepornit fără a utiliza un dispozitiv de pornire separat ( dischetă etc.) care conține un program pentru a corecta eroarea. [3] De asemenea, LILO nu recunoaște sistemele de fișiere; în schimb, adresele fișierelor de imagine sunt stocate direct în MBR, [3] și BIOS-ul este folosit pentru a le accesa direct.

Loadlin

O altă modalitate de a porni Linux este din DOS sau Windows 9x , unde nucleul Linux va înlocui complet copia care rulează a sistemului de operare. Acest lucru poate fi util dacă hardware-ul trebuie inclus în software, iar programele corespunzătoare există doar pentru DOS, și nu pentru Linux, fiind software-ul proprietar al producătorului și un secret comercial. Această metodă de pornire nu este deosebit de relevantă, deoarece Linux are drivere pentru multe dispozitive hardware, deși a fost destul de utilă în trecut.
Un alt exemplu este atunci când Linux este pe un dispozitiv de stocare care nu este proiectat pentru a fi pornit din BIOS: DOS sau Windows pot încărca driverele adecvate pentru a ocoli această limitare a BIOS și apoi pot porni Linux de acolo.

Faza de bază

Nucleul Linux gestionează funcții majore, cum ar fi managementul memoriei , managerul de activități , I/O , comunicarea între procese și managementul general al sistemului. Descărcarea are loc în două etape: în prima, nucleul (sub forma unui fișier imagine comprimat) este încărcat în RAM și dezambalat, apoi sunt configurate funcții de bază precum gestionarea de bază a memoriei. Controlul este apoi transferat pentru ultima dată în procesul de pornire a nucleului principal. Odată ce nucleul este pe deplin operațional (adică, încărcat și executat codul său), găsește și pornește procesul de init, care configurează în mod independent spațiul utilizatorului și procesele necesare pentru funcționarea mediului de utilizator și eventuala conectare la sistem. Nucleul în sine intră în modul inactiv și este gata pentru apeluri din alte procese.

Etapa de pornire a kernelului

Nucleul este de obicei pornit ca un fișier imagine comprimat în format zImage sau bzImage folosind zlib . Conține un program principal care realizează o configurare minimă a hardware-ului, despachetează întreaga imagine într- o memorie mare și montează discul RAM dacă este furnizat. [5] După aceea, execută pornirea nucleului prin ./arch/x86/boot/headși proces startup_32()(pentru procesoarele din familia x86).

Etapa de pornire a kernelului

Sursa: Descrierea IBM a procesului de pornire Linux   (engleză) + versiunea tradusă de pe același site Detalii despre procesul de pornire Linux  (rusă)

Funcția de pornire a nucleului (numită și swapper sau proces 0 ) organizează gestionarea memoriei ( tabelele de pagini și paginarea memoriei), determină tipul de procesor și caracteristicile suplimentare (cum ar fi prezența unui coprocesor matematic ) și apoi trece la funcționalitatea independentă de arhitectură a nucleului Linux prin apelarea start_kernel().

start_kernel()efectuează multe sarcini de inițializare. Setează manevrele de întrerupere ( IRQ ), apoi setează memoria, pornește procesul init (primul proces în modul utilizator) și apoi pornește sarcina inactivă apelând cpu_idle(). Rețineți că procesul de pornire a nucleului montează și discul RAM inițial ("initrd") care a fost încărcat anterior ca sistem de fișiere rădăcină temporar în timpul fazei de pornire. Acest lucru permite încărcarea modulelor de driver fără a se baza pe alte dispozitive fizice și drivere și pentru a menține dimensiunea nucleului mică. Sistemul de fișiere rădăcină este ulterior înlocuit cu un apel pivot_root()care demontează sistemul de fișiere temporar și îl înlocuiește cu sistemul de fișiere rădăcină real, de îndată ce acesta din urmă devine disponibil. Memoria folosită de sistemul temporar este apoi eliberată.

Astfel, nucleul inițializează dispozitivele, montează sistemul de fișiere specificat de bootloader în modul read-only și pornește procesul init ( /sbin/init), care este desemnat ca primul proces început de sistem (cu ID de proces PID  = 1). [1] Mesajele corespunzătoare sunt afișate de kernel (când se montează sistemul de fișiere) și init (când se începe procesul cu același nume). Nucleul poate executa, de asemenea, un initrd pentru a gestiona setările și inițializa dispozitivele înainte de a monta sistemul de fișiere rădăcină. [unu]

Potrivit Red Hat , detaliile procesului de boot în această etapă pot fi rezumate după cum urmează: [2]

Când nucleul pornește, inițializează și configurează imediat memoria computerului și configurează diverse hardware conectate la sistem, inclusiv toate procesoarele, subsistemele I/O și dispozitivele de stocare. Apoi caută imaginea initrd comprimată într-o locație predeterminată din memorie, o decomprimă, o montează și încarcă toate driverele necesare. Apoi inițializează dispozitivele virtuale asociate cu sistemul de fișiere, cum ar fi matricele LVM sau software RAID , înainte de a demonta imaginea de disc initrd și de a recupera orice memorie ocupată anterior de imagine. Nucleul creează apoi un dispozitiv rădăcină, montează partiția rădăcină numai pentru citire și eliberează orice memorie nefolosită. Până în acest moment, nucleul este încărcat în memorie și este operațional. Cu toate acestea, deoarece nu există programe de utilizator care să ofere o intrare semnificativă sistemului, nu se poate face nimic cu acesta.

Acum, că întreruperile sunt activate, dispecerul poate prelua controlul general al sistemului pentru a activa multitasking preventiv, iar procesul de inițiere este lăsat să continue încărcarea mediului utilizator în spațiul utilizatorului.

proces init (numai tip UNIX System V)

Init este părintele tuturor proceselor. Sarcina sa principală este de a crea procese scriptate dintr-un /etc/inittab. Acest fișier conține, de obicei, intrări care spun init să declanșeze getty pentru fiecare linie la care utilizatorii se pot conecta. De asemenea, controlează procesele offline necesare oricărui sistem. Un nivel de execuție este o configurație programatică a unui sistem care permite să existe doar un anumit grup de procese. Procesele generate de init la fiecare dintre aceste niveluri de rulare sunt definite în /etc/inittab. [6]

În esență, init organizează și menține tot spațiul utilizatorului , care include, de asemenea, verificarea și montarea sistemelor de fișiere, pornirea serviciilor necesare pentru utilizator și trecerea la spațiul utilizatorului când sistemul a terminat de pornire. Este similar cu procesele de inițializare Unix și BSD din care provine, dar în unele cazuri a fost schimbat sau reproiectat. Pe un sistem Linux tipic, init are un parametru cunoscut sub numele de runlevel , care ia valori de la 1 la 6 și determină ce subsisteme să activeze. Fiecare nivel de execuție are propriile scripturi care guvernează diferitele procese implicate în configurarea sau eliminarea acelui nivel de execuție și aceste scripturi sunt considerate necesare pentru procesul de pornire. Scripturile de pornire sunt de obicei stocate în directoare cu nume precum /etc/rc…. Fișierul de configurare la nivel principal pentru init este /etc/inittab. [7]

În timpul pornirii sistemului, verifică dacă nivelul implicit este descris în /etc/inittab, iar dacă nu, îl solicită prin consola sistemului. Apoi execută toate scripturile de pornire relevante pentru acel nivel, inclusiv încărcarea modulelor, verificarea integrității sistemului de fișiere (care a fost montat doar în citire), remontarea lui citire-scriere și configurarea rețelei. [unu]

În special, conform Red Hat , procesul de inițializare urmează acest model: [2]

  1. Se uită la un script sysinitcare „setează calea către mediu, pornește swap, verifică sistemele de fișiere și face tot ce este necesar pentru a inițializa sistemul. Acestea sunt, în special, ceasurile de sistem și hardware, procese speciale pentru portul serial. , si asa mai departe.
  2. Init se uită apoi la configurația specificată pentru nivelul de rulare dat .
  3. După aceea, init instalează biblioteca de funcții inițială pentru sistem. Aceasta determină modul în care programul trebuie pornit sau terminat și cum ar trebui să fie determinat PID-ul său.
  4. Apoi pornește toate procesele furnizate și creează o sesiune de conectare a utilizatorului.

După ce a generat toate procesele date, init intră în modul de repaus și așteaptă unul dintre cele trei evenimente:

  1. Terminarea normală sau anormală a proceselor generate.
  2. Semnal de pană de curent.
  3. Solicitați de /sbin/telinitla modificarea nivelului de rulare . [6]

Aceasta se referă la programul init în stil UNIX System V. Alte programe init se pot comporta diferit.

Vezi și

Note

  1. 1 2 3 4 5 Linux Boot Process - de Kim Oldfield (2001) . Consultat la 10 decembrie 2008. Arhivat din original pe 18 decembrie 2008.
  2. 1 2 3 O privire detaliată asupra procesului de pornire . Consultat la 10 decembrie 2008. Arhivat din original pe 3 februarie 2009.
  3. 123 Documentație _ _ _ Consultat la 10 decembrie 2008. Arhivat din original pe 5 mai 2010.
  4. 1 2 3 4 5 Descrierea GRUB de către Red Hat  (engleză) (HTML). Consultat la 8 august 2010. Arhivat din original pe 7 martie 2009.
  5. Descrierea IBM a procesului de pornire Linux . Consultat la 10 decembrie 2008. Arhivat din original la 31 mai 2008.
  6. 1 2 Pagina de manual a procesului de init . Consultat la 10 decembrie 2008. Arhivat din original la 12 iunie 2008.
  7. De la pornire la promptul Bash: Init . Consultat la 26 noiembrie 2010. Arhivat din original pe 10 martie 2011.

Link -uri