Linux系統啓動流程

CentOS6系統啓動流程

  操作系統(OS)也是一個程序,如果在硬件通電後讓這個特殊的程序運行起來,以及這個特殊的程序在啓動過程中做了什麼,如下圖:
Linux系統啓動流程

  從圖中可知,系統啓動(不僅僅是Linux系統)大致可分爲幾個主要過程:硬件初始化-->找到並加載操作系統的內核-->內核初始化-->操作系統運行環境初始化-->登錄初始化-->登錄成功後的用戶初始化(包含圖形界面初始化或shell的初始化)-->最終用戶成功進入
操作系統並開始使用操作系統。

下面以CentOS6系統進入命令行爲例簡單描述一下上面的幾個主要過程。

1.按下電源通電。主板通電後,CPU開始工作,它執行固定地址處的一段非常小的硬編碼程序:BIOS,於是BIOS掌握了CPU控制權。

2.BIOS程序會進行硬件的上電自檢(Power-On Self-Test,POST)以確認有哪些硬件以及這些硬件是否故障。對於我們要探索的操作系統啓動流程來說,最重要的是會根據檢測到磁盤順序(除了磁盤,也可以是其它硬件設備,比如U盤、光盤、網卡等),按順序找到這些磁盤上正確的MBR,於是MBR開始掌握CPU控制權。

3.MBR是引導系統內核啓動的第一段代碼,它的位置固定處於磁盤的第一個扇區位置處(如果不固定,就不知道怎麼找到MBR)。引導內核啓動的代碼段稱爲Boot Loader,除MBR外,還需要通過其它引導系統的代碼段來一步步引導啓動內核,所以要引導一個內核的啓動,需要跳轉並執行多段BootLoader。根據使用的啓動管理工具(如LILIO、GRUB、GRUB2等)不同,這一段段的引導代碼段稱呼和存放位置都不一樣,但第一個引導內核啓動的代碼段一定稱爲MBR,也一定處於磁盤的第一個扇區位置,所以MBR才稱爲主引導記錄(Master Boot Record)。

4.當找到內核映像後,將內核映像裝載到內存中並解壓(如果被壓縮的話),內核開始掌握CPU控制權並運行起來,期間內核會做很多工作,包括內核的初始化、掛載真正的根目錄並從臨時根目錄切換到真正的根目錄、啓動一些重要的進程,例如idle、進程調度器、init進程等。然後開始執行用戶空間的第一個進程:init進程,於是init進程掌握了CPU的控制權,也從此開始進入用戶空間。

5.init進程開始運行後就表示操作系統真正已經啓動成功了,但它仍然需要做系統級別的初始化,比如設置主機名、設置硬件參數、加載硬件驅動、掛載/etc/fstab中的一些文件系統等等。系統級別的運行環境一切初始化完成後,於是提供用戶登錄的界面,即init啓動getty類的進程。

6.getty類的進程啓動後,將打開一個終端,並提示用戶輸入用戶名,然後啓動一個login進程讓用戶輸入密碼並驗證密碼,密碼驗證通過後再審覈用戶是否有權登錄,如果允許登錄,將根據/etc/passwd中的配置啓動該用戶對應的shell進程,例如bash進程。

7.shell進程啓動後讀取該shell對應的配置文件,並按照登錄式、交互式的shell運行模式進行初始化,初始化完成後將進入登錄式、交互式的shell,也就是命令行下。

8.至此,用戶可以通過shell命令行來使用操作系統。

CentOS7系統啓動流程

CentOS7的啓動與CentOS6啓動不同之處有兩大點:
1)內核引導階段,CentOS7默認使用grub2引導,而CentOS6默認使用傳統的grub引導。
2)系統環境初始化和後面的過程。內核初始化完成後,啓動PID=1的過程,而CentOS7中這個進程是systemd,它和CentOS6中的init進程的初始化方式大不相同。

systemd特性:
1)系統初始化時實現服務並行啓動;
2)按需啓動守護進程;
3)自動化的服務依賴關係管理;
4)同時採用socket式與D-Bus總線式激活服務;
5)系統狀態快照。

以下簡述CentOS7的啓動流程,詳細內容參考:man bootup幫助手冊。
1)UEFI或BIOS初始化,運行POST開機自檢;
2)選擇啓動設備;
3)引導內核,做部分內核初始化工作,加載initramfs;
4)啓動systemd進程,systemd進程此時工作在initramfs環境下;
5)systemd執行initrd.target所有單元,包括掛載/etc/fstab、從ramdisk的虛根文件系統切換到真正的根文件系統;
6)systemd執行默認target配置,其配置文件爲/etc/systemd/system/default.target;
7)systemd執行sysinit.target初始化系統及basic.target準備操作系統;
8)systemd啓動multi-user.target下的本機與服務器服務;
9)systemd執行multi-user.target下的/etc/rc.d/rc.local;
10)systemd執行multi-user.target下的getty.target讓用戶登錄;
11)啓動shell進程並初始化,最終進入命令行;

  上面的過程中最需要關注的便是大大提前了systemd的工作:在內核初始化階段就參與了剩下的工作。等到systemd完成了根文件系統的切換後,將正式進入操作系統的初始化過程,這時將進入步驟6),即根據默認target配置文件default.targe選擇默認的“運行級別”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章