Proces spouštění Linuxu

Proces bootování Linuxu je krok, kterým jsou operační systémy založené na Linuxu připraveny . Tento proces je v mnoha ohledech podobný bootování BSD a dalších unixových systémů, ze kterých pochází.

Obecný přehled procesu

Při bootování počítače dochází k sériovému přenosu řízení z firmwaru systému počítače ( BIOS nebo UEFI ) do bootloaderu az něj do jádra . Jádro poté spustí plánovač (pro multitasking) a spustí program init (který nastaví uživatelské prostředí a umožní interakci s uživatelem a přihlášení), načež jádro přejde do nečinnosti, dokud nepřijme externí volání.

Hlavní kroky stahování:

  1. Systémový firmware počítače provede prvotní kontrolu a inicializaci hardwaru .
  2. V případě BIOSu se firmware načte do RAM a spustí spouštěcí kód z jednoho z oddílů zadaného zaváděcího zařízení, které obsahuje fázi 1 zavaděče Linuxu. Fáze 1 načte fázi 2 (významný kód zavaděče). Některé bootloadery k tomu mohou používat mezistupeň (nazývaný fáze 1.5 ), protože moderní velkokapacitní disky se bez dalšího kódu nemusí správně číst. V případě UEFI se spustí bootloader načtený ze servisního oddílu (EFS), který je vybrán podle nastavení priority bootování definovaného v energeticky nezávislé paměti počítače. V tomto případě je možné načíst nejen specializovaný zavaděč, ale můžete také načíst přímo linuxové jádro (k tomu musí být jádro sestaveno s volbou EFI_STUB).
  3. Zavaděč často nabídne uživateli nabídku dostupných možností spouštění. Po výběru nebo po určeném časovém limitu zavaděč načte jádro.
  4. Načtené jádro se dekomprimuje do paměti, nastaví systémové funkce, jako je obsluha potřebného hardwaru a správa stránek paměti, a poté zavolá start_kernel().
  5. Poté start_kernel()provede základní konfiguraci systému (přerušení, další funkce správy paměti, inicializace zařízení, ovladačů atd.) a poté vytvoří nečinný proces , dispečer a odděleně od nich proces init (běžící v uživatelském prostoru ).
  6. Plánovač začne řídit systém efektivněji, zatímco jádro je nečinné.
  7. Proces init spustí potřebné skripty, které nastaví všechny nekernelové služby a struktury, které vytvoří uživatelské prostředí a zobrazí uživateli přihlašovací obrazovku.

Když dojde k vypnutí, je volán init , aby řízené ukončení programů na uživatelské úrovni, také podle skriptů. Poté se init uzavře a jádro provede své vlastní vypnutí.

Fáze zavaděče

Při bootování přes BIOS: Fáze bootloaderu se liší v závislosti na platformě. Protože první kroky spouštění jsou nezávislé na operačním systému, proces spouštění obvykle začíná takto:

Od této chvíle stahování pokračuje. První fáze načte zbytek kódu zavaděče, který se obvykle zeptá, jaký operační systém (nebo typ relace) chce uživatel spustit. Kód bootloaderu je generován z konfiguračního souboru /etc/lilo.conf (для LILO), který definuje dostupné systémy. Tento soubor obsahuje zejména informace o zaváděcím oddílu a umístění jádra pro každý z těchto systémů a také o dalších možnostech spouštění, pokud existují. V důsledku volby je do RAM nahráno příslušné jádro , z image souboru ( initrd ) je nakonfigurován minimální počáteční souborový systém a poté je spolu s příslušnými parametry přeneseno řízení na nový OS.

LILO a GRUB mají určité rozdíly: [1]

Při bootování přes UEFI: V UEFI se bootloader okamžitě spustí v chráněném režimu (32-bit nebo 64-bit) a vlastně se načtou všechny fáze bootloaderu najednou (s přihlédnutím k bootování ze servisního oddílu není potřeba aby se bootloader rozdělil na samostatné fáze a umístil je na různá místa). Jinak se proces načítání a inicializace jádra neliší od verze BIOSu.

GRUB

BIOS:

  1. Zavaděč fáze 1 čte BIOS z MBR (Master Boot Record). [čtyři]
  2. Načte zbytek bootloaderu (2. fáze). Pokud je druhá fáze na velkém disku, někdy je načtena mezifáze 1.5, která obsahuje doplňkový kód umožňující čtení cylindrů s čísly většími než 1024 ( LBA disky ). Zavaděč fáze 1.5 je uložen (v případě potřeby) v oddílu MBR nebo spouštěcím oddílu. [čtyři]
  3. Spustí se druhá fáze bootloaderu a zobrazí spouštěcí nabídku GRUB. Umožňuje také vybrat běhové prostředí a zobrazit nastavení systému.
  4. Když je vybrán operační systém, je načten a je na něj přeneseno řízení. [čtyři]

GRUB podporuje přímé i řetězové spouštění, stejně jako LBA, ext2 a "skutečné příkazově orientované pre-op prostředí na počítačích x86." Má tři rozhraní: výběrové menu, editor nastavení a příkazovou konzoli. [čtyři]

UEFI:

  1. GRUB (speciální verze binárního souboru, který může spouštět UEFI), načtený ze servisního oddílu EFS, obsahuje všechny potřebné součásti pro přístup k systému souborů /boot, kde jsou umístěny konfigurační a další soubory bootloaderu.
  2. Zobrazí nabídku zavaděče a zobrazí spouštěcí nabídku GRUB. Umožňuje také vybrat běhové prostředí a zobrazit nastavení systému.
  3. Když je vybrán operační systém, je načten a je na něj přeneseno řízení. [čtyři]

LILO

LILO je starší než GRUB a funguje téměř stejně, až na to, že neobsahuje rozhraní příkazového řádku. Proto musí být všechny změny provedeny v jeho nastavení a zapsány do MBR, poté se systém restartuje. Špatná konfigurace tedy může způsobit, že disk nebude možné spustit bez použití samostatného zaváděcího zařízení ( disketa atd.) obsahujícího program pro opravu chyby. [3] LILO také nerozpozná souborové systémy; místo toho jsou adresy obrazových souborů uloženy přímo v MBR [3] a pro přímý přístup k nim se používá BIOS.

Loadlin

Další možností, jak zavést Linux, je z DOSu nebo Windows 9x , kde linuxové jádro zcela nahradí běžící kopii operačního systému. To může být užitečné v případě, že hardware musí být součástí softwaru a odpovídající programy existují pouze pro DOS, nikoli pro Linux, protože jde o proprietární software výrobce a obchodní tajemství. Tato metoda spouštění není nijak zvlášť relevantní, protože Linux má ovladače pro mnoho hardwarových zařízení, i když v minulosti byla docela užitečná.
Dalším příkladem je situace, kdy je Linux na úložném zařízení, které není navrženo tak, aby se spouštělo z BIOSu: DOS nebo Windows mohou načíst příslušné ovladače, aby toto omezení BIOSu obešly, a poté Linux spustit odtud.

Základní fáze

Linuxové jádro spravuje hlavní funkce, jako je správa paměti , správce úloh , I/O , meziprocesová komunikace a celková správa systému. Stahování probíhá ve dvou fázích: v první se jádro (ve formě komprimovaného souboru s obrázkem) načte do paměti RAM a rozbalí, poté se nakonfigurují základní funkce, jako je základní správa paměti. Řízení je poté naposledy přeneseno do hlavního procesu spouštění jádra. Jakmile je jádro plně funkční (tj. načte a spustí svůj kód), najde a spustí proces init, který nezávisle nastaví uživatelský prostor a procesy nezbytné pro fungování uživatelského prostředí a případné přihlášení do systému. Samotné jádro přejde do klidového režimu a je připraveno na volání z jiných procesů.

Spouštěcí fáze jádra

Jádro se obvykle zavádí jako obrazový soubor komprimovaný do formátu zImage nebo bzImage pomocí zlib . Obsahuje hlavní program, který provede minimální hardwarové nastavení, rozbalí celý obraz do velké paměti a připojí RAM disk , pokud je k dispozici. [5] Poté provede spuštění jádra pomocí ./arch/x86/boot/heada procesu startup_32()(pro procesory rodiny x86).

Fáze spouštění jádra

Zdroj: IBM popis spouštěcího procesu Linuxu   (anglicky) + přeložená verze ze stejného webu Podrobnosti spouštěcího procesu Linuxu  (ruština)

Funkce spouštění jádra (také nazývaná swapper nebo proces 0 ) organizuje správu paměti ( tabulky stránek a stránkování paměti), určuje typ procesoru a další funkce (jako je přítomnost matematického koprocesoru ) a poté přepíná na funkcionalitu nezávislou na architektuře. linuxového jádra voláním start_kernel().

start_kernel()provádí mnoho inicializačních úkolů. Nastaví obsluhu přerušení ( IRQ ), poté nastaví paměť, spustí proces init (první proces v uživatelském režimu) a poté spustí nečinnou úlohu voláním cpu_idle(). Všimněte si, že proces spouštění jádra také připojí počáteční RAM disk ("initrd"), který byl dříve načten jako dočasný kořenový souborový systém během zaváděcí fáze. To umožňuje načítat moduly ovladačů bez spoléhání se na jiná fyzická zařízení a ovladače a udržovat malou velikost jádra. Kořenový souborový systém je následně nahrazen voláním pivot_root(), které odpojí dočasný souborový systém a nahradí jej skutečným kořenovým souborovým systémem, jakmile bude tento dostupný. Poté se uvolní paměť používaná dočasným systémem.

Jádro tedy inicializuje zařízení, připojí souborový systém určený bootloaderem v režimu pouze pro čtení a spustí proces init ( /sbin/init), který je označen jako první proces spuštěný systémem (s procesem ID PID  = 1). [1] Odpovídající zprávy zobrazuje jádro (při připojování souborového systému) a init (při spouštění stejnojmenného procesu). Jádro může také spustit initrd pro zpracování nastavení a inicializaci zařízení před připojením kořenového souborového systému. [jeden]

Podle Red Hat lze podrobnosti o procesu spouštění v této fázi shrnout následovně: [2]

Když se jádro zavede, okamžitě inicializuje a nakonfiguruje paměť počítače a nakonfiguruje různý hardware připojený k systému, včetně všech procesorů, I/O subsystémů a úložných zařízení. Poté hledá komprimovaný obraz initrd na předem určeném místě v paměti, dekomprimuje jej, připojí a načte všechny potřebné ovladače. Poté inicializuje virtuální zařízení přidružená k systému souborů, jako jsou LVM nebo softwarová pole RAID , před odpojením obrazu disku initrd a uvolněním veškeré paměti dříve obsazené obrazem. Jádro poté vytvoří kořenové zařízení, připojí kořenový oddíl pouze pro čtení a uvolní veškerou nepoužívanou paměť. Do této doby je jádro načteno do paměti a je funkční. Protože však neexistují žádné uživatelské programy, které by systému poskytovaly smysluplný vstup, lze s tím dělat jen málo.

Nyní, když jsou přerušení povolena, může dispečer převzít celkovou kontrolu nad systémem, aby umožnil preemptivní multitasking, a proces init je ponechán na pokračování načítání uživatelského prostředí v uživatelském prostoru.

proces init (pouze typ UNIX System V)

Init je rodičem všech procesů. Jeho hlavním úkolem je vytvářet skriptované procesy z /etc/inittab. Tento soubor obvykle obsahuje položky, které říkají init , aby vytvořil getty pro každý řádek, do kterého se uživatelé mohou přihlásit. Řídí také offline procesy vyžadované jakýmkoli systémem. Runlevel je programová konfigurace systému, která umožňuje existenci pouze dané skupiny procesů. Procesy vytvořené init na každé z těchto úrovní běhu jsou definovány v souboru /etc/inittab. [6]

Init v podstatě organizuje a spravuje veškerý uživatelský prostor , což také zahrnuje kontrolu a připojování souborových systémů, spouštění nezbytných uživatelských služeb a přepínání do uživatelského prostoru, když systém dokončí bootování. Podobá se unixovým a BSD init procesům , ze kterých pochází, ale v některých případech byl změněn nebo přepracován. V typickém systému Linux má init parametr známý jako runlevel , který nabývá hodnot od 1 do 6 a určuje, které podsystémy se mají povolit. Každá úroveň běhu má své vlastní skripty, které řídí různé procesy zapojené do nastavení nebo odebrání této úrovně běhu, a právě tyto skripty jsou považovány za nezbytné pro proces spouštění. Init skripty jsou obvykle uloženy v adresářích s názvy jako /etc/rc…. Hlavní konfigurační soubor pro init je /etc/inittab. [7]

Během spouštění systému zkontroluje, zda je výchozí úroveň popsána v /etc/inittab, a pokud ne, vyžádá si ji prostřednictvím systémové konzole. Poté pokračuje ve spuštění všech relevantních zaváděcích skriptů pro tuto úroveň, včetně načítání modulů, kontroly integrity souborového systému (který byl připojen pouze pro čtení), jeho opětovného připojení pro čtení a zápis a konfigurace sítě. [jeden]

Konkrétně podle Red Hat se proces init řídí tímto vzorem: [2]

  1. Podívá se na skript sysinit, který "nastaví cestu k prostředí, spustí swap, zkontroluje souborové systémy a provede vše potřebné k inicializaci systému. Jedná se zejména o systémové a hardwarové hodiny, speciální procesy pro sériový port , a tak dále.
  2. Init se pak podívá na konfiguraci zadanou pro danou úroveň běhu .
  3. Poté init nainstaluje počáteční knihovnu funkcí pro systém. To určuje, jak se má program spustit nebo ukončit a jak se má určit jeho PID.
  4. Poté spustí všechny poskytnuté procesy a vytvoří relaci přihlášení uživatele.

Poté, co spustí všechny dané procesy, init přejde do režimu spánku a čeká na jednu ze tří událostí:

  1. Normální nebo abnormální ukončení spawnovaných procesů.
  2. Signál výpadku napájení.
  3. Požadavek /sbin/telinitna změnu úrovně běhu . [6]

To se týká init programu stylu UNIX System V . Jiné init programy se mohou chovat jinak.

Viz také

Poznámky

  1. 1 2 3 4 5 Proces spouštění Linuxu – od Kim Oldfield (2001) . Získáno 10. prosince 2008. Archivováno z originálu 18. prosince 2008.
  2. 1 2 3 Podrobný pohled na proces spouštění . Získáno 10. prosince 2008. Archivováno z originálu 3. února 2009.
  3. 123 Dokumentace . _ _ Získáno 10. prosince 2008. Archivováno z originálu 5. května 2010.
  4. 1 2 3 4 5 Popis GRUB od Red Hat  (anglicky) (HTML). Získáno 8. srpna 2010. Archivováno z originálu 7. března 2009.
  5. IBM popis procesu spouštění Linuxu . Získáno 10. prosince 2008. Archivováno z originálu 31. května 2008.
  6. 1 2 Manuálová stránka procesu init . Získáno 10. prosince 2008. Archivováno z originálu 12. června 2008.
  7. Od zapnutí po výzvu Bash: Init . Získáno 26. listopadu 2010. Archivováno z originálu 10. března 2011.

Odkazy