內容簡介
Linux啟動進程是啟動Linux時執行的一個複雜的初始化過程。它在很多方面類似於
BSD系統和別的
類Unix系統的啟動過程。
概述
早期階段的Linux啟動進程十分依賴於計算機架構。IBM PC兼容機是Linux常用的架構;在這種系統中,BIOS扮演著重要角色,而這在其他系統中很難找到類似的東西。在下面的例子中,假設為IBM PC兼容機:
BIOS針對實際的硬體平台執行啟動任務。一旦硬體被遍歷、啟動需要的硬體被正確初始化,BIOS就會從配置好的啟動設備載入和執行啟動代碼。
啟動載入程式通常會為用戶呈現一個可能的啟動項的選單而且有一個將在幾秒後被選擇的默認項。一旦作出選擇,啟動引導器將和把核心載入到記憶體,並且提供一些參數且移交控制權。
核心,如果被壓縮將自解壓。它將配置系統功能,譬如必要的硬體和記憶體分頁,稱為start_kernel,這會執行大部分系統配置(中斷、記憶體管理、設備和驅動初始化等)。然後它分別啟動記憶體管理進程、調度和init進程等在用戶空間執行的進程。
init由被
shell(sysv、bsd、runit)執行的腳本或者被二進制組件(systemd、upstart)執行的配置檔案組成。Init有特定的級別(sysv、bsd)或目標(systemd),每個都是由特定的一組服務(守護進程daemons)組成。這在用戶環境提供很多非作業系統的服務和結構。一個典型的服務環境啟動一個網路服務、資料庫服務和網路。
一個典型的桌面環境從一個名為顯示管理器的守護進程開始,它開始一個由圖形化服務組成的圖形化環境,提供一個基礎底層的圖形棧和一個提供身份驗證的登錄管理器。在用戶輸入正確驗證信息,會話管理器開始一個會話。會話是包含一系列程式比如UI組件(面板、桌面、小程式等),它們一個構成一個完整的桌面環境。
關機時,init會以控制者的姿態去關閉所有的用戶空間功能。init隨後終止,核心自行關閉。
載入程式階段
啟動載入階段應計算機架構而不同。更早的階段不是針對特定作業系統,基於BIOS的x86_64啟動進程被認為開始於MBR代碼用真實模式執行和第一階段啟動載入程式被載入。而對於
UEFI系統,像Linux核心的有效負載,能直接載入,不需要啟動載入程式。下面是對流行的啟動引導程式的總結:
LILO不能識別和解析檔案系統布局。 而是在實時系統中創建一個配置檔案(/etc/lilo.conf),它將原始偏移量信息(映射器工具)映射到核心和ram磁碟的位置(initrd或initramfs)。 配置檔案(其中包括每個引導分區和核心路徑名等數據)以及自定義選項(如果需要),然後與引導載入程式代碼一起寫入MBR引導程式。 當此引導器讀取並由BIOS控制時,LILO載入選單代碼並繪製它,然後使用存儲的值與用戶輸入一起計算和載入Linux核心或連結載入任何其他引導載入程式。
GRUB 1包含運行時讀取通用檔案系統以訪問其配置檔案的邏輯。這使得GRUB 1能夠從檔案系統讀取其配置檔案,而不是將其嵌入到MBR中,從而允許它在運行時更改配置,並以可讀取的格式指定磁碟和分區,而不是依賴於偏移量。 它還包含一個命令行界面,如果配置錯誤或損壞,可以更容易地修復或修改GRUB。
GRUB 2與GRUB 1的不同之處在於有兩個(可選三個)階段,並且能夠自動檢測各種作業系統和自動配置。第一階段載入程式(stage1)載入和執行由BIOS從主引導記錄(MBR)或另一個來自分區引導扇葉的引導載入程式。它的工作是發現和訪問各種檔案系統,以便稍後可以讀取配置檔案。如果第二階段載入程式不連續,或者如果檔案系統或硬體需要特殊處理才能訪問第二級載入程式,則可選的中級載入程式(階段1.5)由第一級載入程式載入和執行載入程式。最後載入第二階段載入程式(stage2),並顯示允許用戶選擇作業系統或檢查和編輯啟動參數的GRUB啟動選單。選擇選單項並選擇參數後,GRUB會將核心載入到記憶體中,並將控制權傳遞給它。GRUB 2還能夠連結載入另一個引導載入程式。
SYSLINUX/ ISOLINUX是一個專門從FAT檔案系統引導完整的Linux的啟動載入程式。它通常用於啟動或搶救軟碟,live USB和其他輕量級引導系統。 ISOLINUX通常由Linux live CD和可引導安裝CD使用。
Loadlin是一個可以在運行時用Linux核心替換正在運行的DOS或Windows 9x核心的啟動載入程式。這在硬體需要通過軟體打開並且這種配置程式是專有的且僅適用於DOS的情況下可能是有用的。這種引導方法現在不太需要,因為Linux具有大量硬體設備的驅動程式,但在移動設備中已經有一些用途。 另一個用例是當Linux位於BIOS無法啟動的存儲設備上時:DOS或Windows可以載入相應的驅動程式來彌補BIOS的限制並從那裡啟動Linux。
核心階段
Linux核心處理所有作業系統進程,如記憶體管理、任務調度、I/O、
進程間通信和系統總體控制。這分為兩個階段 :
首先,核心(作為壓縮映像檔案)被載入到記憶體中並進行解壓縮,並且創建了一些基本的功能,如基本記憶體管理。 然後最後一次切換到主核心啟動過程。
一旦核心完全運行,並且作為其啟動的一部分,在載入和執行時,核心會查找一個運行的
init進程,它單獨設定用戶空間以及用戶環境所需的進程和最終會話。然後允許核心自身閒置,受其他進程調用。
initramfs
initramfs自Linux核心的2.5.46版本開始加入這個概念,其意圖是儘可能地替換以前Linux核心在啟動過程中執行的功能。 早期用戶空間的典型用途是檢測需要哪些
設備驅動程式來載入主用戶空間檔案系統,並從臨時檔案系統載入它們。
Init進程
Init是Linux的根進程。進程號為1,它是所有進程的父進程。
SysV init
init是系統所有進程的父進程。它由核心創建,它將啟動其他所有進程。