linux系統啓動流程

啓動流程總覽

以我們個人計算機架設的Linux主機爲例,當我們按下電源後計算機硬件會主動讀取BIOS來加載硬件信息及進行硬件系統的自我測試,之後系統會主動的讀取第一個可啓動的設備(由BIOS設置的),此時就可以讀入引導裝載程序了。引導裝載程序可以指定使用哪個內核文件啓動,並實際加載內核到內存當中解壓縮與執行,此時內核就可以在內存當中去活動,並檢測所有的硬件信息與加載適當的驅動程序來使主機開始運行,等到內核檢測硬件與加載驅動程序完畢後,我們的操作系統便開始在pc上跑起來了。主機系統開始運行後,此時Linux纔會調用外部程序開始準備軟件執行環境,並且實際加載所有系統運行所需要的軟件程序。所以系統的啓動過程精簡如下:

  1. 加載BIOS的硬件信息與進行自我測試,並依據設置取得第一個可啓動的設備
  2. 讀取並執行第一個啓動設備內的MBR的boot looder(即grub程序)
  3. 依據boot Loader的設置加載內核kernel,內核會開始檢測硬件和加載驅動程序
  4. 在硬件驅動成功後,Kernel會主動調用init(centos 6之前的版本的根進程,centos7根進程爲systemd),取得運行等級(runlevel)信息。
  5. init執行/etc/rc.d/rc.sysinit文件來準備軟件執行的操作環境
  6. init執行run-level的各個服務的啓動
  7. init執行/rc.d/rc.local文件。
  8. init執行終端機模擬程序mingetty來啓動login進程,最後等待用戶登錄。

啓動流程第一大項--啓動硬件設備

由上面總括的流程總覽,我們不難發現,系統的啓動流程可以概括爲兩大項:
一: 啓動硬件設備
二:設置操作環境

第一項,啓動硬件設備,我們需要經過BIOS的自檢,boot loader的引導以及kernel的加載。
BISO自檢
我們要想啓動整個系統首先要讓系統去加載BIOS(basic input output system),並通過BIOS程序去加載CMOS信息,並且通過CMOS內的設置值取得主機的各項硬件配置信息,然後BIOS會進行開機自檢,開始執行硬件檢測的初始化,進行啓動設備的數據讀取,及開始MBR與相關的任務。
boot loader
BIOS在加載的過程中指定啓動的設備來讓我們可以讀取磁盤中的操作系統內核文件,但不同的操作系統的文件系統格式不同,因此我們需要一個引導裝載程序來處理內核文件加載的問題。這個引導裝載程序就就是bootloader,存放在了啓動設備的第一個扇區內,也就是我們說的MBR(主引導分區),通過boot loader的引導,我們可以加載那內核。但是在這裏有一個問題,在一個多操作系統的機器上,每個系統內核的加載,都需要使用自己的loader引導,而系統的MBR只有一個,那麼我們是如何同時在一臺主機上安裝windows系統和Linux系統呢?
其實磁盤的每個分區上都留由一塊引導扇區(boot sector)提供操縱系統安裝boot loader。所以若是一個多操作系統,那麼每個操作系統都會默認安裝一個boot loader在自己的boot sector內,如下圖所示:
linux系統啓動流程
但是問題依然沒解決,要怎麼樣使得操作系統通過過自己的boot loader來加載內核呢? 這個就靠我們的boot loader自己了。boot loader主要功能有三個:1、提供啓動菜單;2、加載內核文件;3、轉交其他的loader。所以我們可以直接利用boot loader提供的菜單選項,選擇要安裝的操作系統,也就是選擇其所對應的boot loader,來加載對應的內核。
知道了boot loader的功能後,我們變很好理解boot loader在啓動流程中發揮的作用,但實際上,因爲boot loader功能太多,而MBR之分給boot loader 446B的空間,這是完全不夠的,所以Linux是將boot loader的程序運行與配置加載分爲三個階段(stage)來運行:
stage1:運行boot loader主程序(這部分存在於MBR的前446自己中),目的是識別要啓動的系統的文件系統類型。
stage1_5:根據1識別的文件系統類型,加載相應的文件系統驅動,stage1_5中的文件系統驅動如圖
linux系統啓動流程
stage2: 加載所有配置文件及相關的環境參數信息。讀取grub.conf配置文件,加載驅動。grub.conf配置文件內容入如下:

linux系統啓動流程
內核加載階段
在boot loader的引導下,成功讀到grub.conf文件,開始加載內核
grub.conf:配置文件中重要設置如下:
title:定義各個操作系統的名稱
root::表示內核文件存放的位置,這裏指定的是分區位置,而非根目錄。
kernel:內核的名稱以及一些啓動時的核心參數。由於啓動過程中需要掛載根目錄,因此就需要指定根目錄所在的分區。rhgb表示色彩顯示,quiet表示靜默模式加載內核。
initrd(centos 5):一個僞系統,支持內核在這個虛擬的根系統上加載內核程序,來加載硬盤等設備。
grub.conf文件被讀完之後,內核驅動開始加載。此時的系統就已經可以啓動了。


第二項--設置操作環境

在內核、硬件及驅動信息加載完畢後,內核會呼叫用戶控件的第一個執行程序/sbin/init,init程序主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統格式等其他的服務的啓動管理。而這些所有的操作都是通過initi的配置文件來定義
init的配置文件

  • centos5:由於centos5採用的SysVinit方式,其特點是啓動用戶空間的服務程序,通常通過腳本進行,有依賴關係的服務將被被串行啓動;這也就導致了centos5的啓動過程非常緩慢。其配置文件爲:/etc/inittab
  • cetos6 : 採用Upstart的方式,其特點是守護進程間的通信依賴於D-Bus進行,因此,可基本實現類似並行啓動;配置文件::/etc/inittab,/etc/init/*.conf
  • centos7:採用Systremd方式,其特點是服務只有在第一次被訪問到時纔會真正的啓動起來;因此centos7系統啓動過程非常之快;其配置文件爲:/usr/lib/systemd/*
    init的處理流程
    init是通過自上而下的讀取inittab文件(centos5)依次執行的,根據inittab配置文件的執行流程如下:
    1. 先取得默認的runlevel,這裏默認的級別是5
    2. 使用/etc/rc.d/rc.sysinit進行系統的初始化
    3. 喲由於採用的是5級別,因此只進行13:3:wait:/etc/rc.d/rc 5,其他則忽略
      linux系統啓動流程
      4.配置好[ctrl]+[alt]+[del]組合鍵的功能
      5.配置不斷電系統pf,pr兩種機制
      6.啓動mingetty6個終端
      linux系統啓動流程
      系統初始化/過程
      在取得默認等級之後,init根據/etc/rc.d/rc.sysinit中定義內容進行系統的初始化,/etc/rc.d/rc.sysinit所做的事主要有一下幾點:
  • 根據配置文件中的設定來設定主機名
  • 打印文本歡迎信息
  • 激活SELinux和udev
  • 掛載swap設備
  • 檢測根系統一,並實現以讀寫方式重新掛載
  • 設置系統時鐘
  • 根據/etc/sysctl.conf文件設定內核參數的值
  • 激活LVM和RAID設備
  • 加載額外的設備驅動程序
  • 清理操作
    初始化系統完成後,我們需要開啓一系列服務來滿足我們系統所需要功能,如sshd、dhcp等服務。這裏就是通過在initta裏面取得的id:5:wiat:/etc/rc.d/rc 5配置了,實際上是通過/etc/rc.d/rc3.d/下的鏈接文件來決定如何啓動和關閉服務;所有S開頭的文件都被傳遞start參數以啓動,所有以K開頭的,都將被stop參數以停止。
    開啓終端
    在完成系統所有相關的服務後啓動之後,接下來Linux就會啓動終端。我們的系統到此也就完全啓動了!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章