複製鏈接
請複製以下鏈接發送給好友

啓動進程

鎖定
Linux啓動進程是啓動Linux時執行的一個複雜的初始化過程。它在很多方面類似於BSD系統和別的類Unix系統的啓動過程。
啓動一個Linux系統涉及到很多階段和軟件組件,包括硬件初始化、執行啓動加載程序、加載和啓動Linux內核鏡像,和執行很多啓動腳本和守護進程。對於不同的階段和組件它們存在不同的變化和途徑;比如GRUBLILOSYSLINUX或者Loadlin等能被用來當作啓動加載器,同時啓動腳本可以是傳統的init風格,也可以是系統配置能被執行的現代替代方案比如systemdUpstart
中文名
啓動進程
外文名
Linux startup process

啓動進程內容簡介

Linux啓動進程是啓動Linux時執行的一個複雜的初始化過程。它在很多方面類似於BSD系統和別的類Unix系統的啓動過程。
啓動一個Linux系統涉及到很多階段和軟件組件,包括硬件初始化、執行啓動加載程序、加載和啓動Linux內核鏡像,和執行很多啓動腳本和守護進程。對於不同的階段和組件它們存在不同的變化和途徑;比如GRUBLILOSYSLINUX或者Loadlin等能被用來當作啓動加載器,同時啓動腳本可以是傳統的init風格,也可以是系統配置能被執行的現代替代方案比如systemdUpstart

啓動進程概述

早期階段的Linux啓動進程十分依賴於計算機架構。IBM PC兼容機是Linux常用的架構;在這種系統中,BIOS扮演着重要角色,而這在其他系統中很難找到類似的東西。在下面的例子中,假設為IBM PC兼容機:
  1. BIOS針對實際的硬件平台執行啓動任務。一旦硬件被遍歷、啓動需要的硬件被正確初始化,BIOS就會從配置好的啓動設備加載和執行啓動代碼。
  2. 啓動加載程序通常會為用户呈現一個可能的啓動項的菜單而且有一個將在幾秒後被選擇的默認項。一旦作出選擇,啓動引導器將和把內核加載到內存,並且提供一些參數且移交控制權。
  3. 內核,如果被壓縮將自解壓。它將配置系統功能,譬如必要的硬件和內存分頁,稱為start_kernel(),這會執行大部分系統配置(中斷、內存管理、設備和驅動初始化等)。然後它分別啓動內存管理進程、調度和init進程等在用户空間執行的進程。
  4. init由被shell(sysv、bsd、runit)執行的腳本或者被二進制組件(systemd、upstart)執行的配置文件組成。Init有特定的級別(sysv、bsd)或目標(systemd),每個都是由特定的一組服務(守護進程daemons)組成。這在用户環境提供很多非操作系統的服務和結構。一個典型的服務環境啓動一個網絡服務、數據庫服務和網絡。
  5. 一個典型的桌面環境從一個名為顯示管理器的守護進程開始,它開始一個由圖形化服務組成的圖形化環境,提供一個基礎底層的圖形棧和一個提供身份驗證的登錄管理器。在用户輸入正確驗證信息,會話管理器開始一個會話。會話是包含一系列程序比如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是系統所有進程的父進程。它由內核創建,它將啓動其他所有進程。 [1] 
參考資料
  • 1.    James M. Conrad; Alexander G. Dean (September 2011). Embedded Systems, An Introduction Using the Renesas RX62N Microcontroller. Micrium. ISBN 978-1935-7729-96.