1. 程式人生 > >linux系統的開機啟動過程

linux系統的開機啟動過程

    我們先通過一張圖來簡單瞭解下整個linux系統啟動的流程

    整個過程基本可以分為BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel。

    

BIOS

  BIOS(Basic Input/Output System),基本輸入輸出系統,該系統儲存於主機板的ROM晶片上,計算機在開機時,會最先讀取該系統,然後會有一個加電自檢過程,這個過程其實就是檢查CPU和記憶體,計算機最基本的組成單元(控制器、運算器和儲存器),還會檢查其他硬體,若沒有異常就開始載入BIOS程式到記憶體當中。詳細的BIOS功能,這邊就不說了,BIOS主要的一個功能就是儲存了磁碟的啟動順序,BIOS會按照啟動順序去查詢第一個磁碟頭的MBR資訊,並載入和執行MBR中的Bootloader程式,若第一個磁碟不存在MBR,則會繼續查詢第二個磁碟(PS:啟動順序可以在BIOS的介面中進行設定),一旦BootLoader程式被檢測並載入記憶體中,BIOS就將控制權交接給了BootLoader程式。

MBR

  MBR(Master Boot Record),主引導記錄,MBR儲存於磁碟的頭部,大小為512bytes,其中,446bytes用於儲存BootLoader程式,64bytes用於儲存分割槽表資訊,最後2bytes用於MBR的有效性檢查。

GRUB

  GRUB(Grand Unified Bootloader),多系統啟動程式,其執行過程可分為三個步驟:

    Stage1:這個其實就是MBR,它的主要工作就是查詢並載入第二段Bootloader程式(stage2),但系統在沒啟動時,MBR根本找不到檔案系統,也就找不到stage2所存放的位置,因此,就有了stage2

    Stage2:該步驟就是為了識別檔案系統

    Stage3:GRUB程式會根據/boot/grub/grub.conf檔案查詢Kernel的資訊,然後開始載入Kernel程式,當Kernel程式被檢測並在載入到記憶體中,GRUB就將控制權交接給了Kernel程式。

 Kernel

  Kernel,核心,Kernel是Linux系統最主要的程式,實際上,Kernel的檔案很小,只保留了最基本的模組,並以壓縮的檔案形式儲存在硬碟中,當GRUB將Kernel讀進記憶體,記憶體開始解壓縮核心檔案。講核心啟動,應該先講下initrd這個檔案,

  initrd(Initial RAM Disk),它在stage2這個步驟就被拷貝到了記憶體中,這個檔案是在安裝系統時產生的,是一個臨時的根檔案系統(rootfs)。因為Kernel為了精簡,只保留了最基本的模組,因此,Kernel上並沒有各種硬體的驅動程式,也就無法識rootfs所在的裝置,故產生了initrd這個檔案,該檔案裝載了必要的驅動模組,當Kernel啟動時,可以從initrd檔案中裝載驅動模組,直到掛載真正的rootfs,然後將initrd從記憶體中移除。

  Kernel會以只讀方式掛載根檔案系統,當根檔案系統被掛載後,開始裝載第一個程序(使用者空間的程序),執行/sbin/init,之後就將控制權交接給了init程式。

Init

  init,初始化,顧名思義,該程式就是進行OS初始化操作,實際上是根據/etc/inittab(定義了系統預設執行級別)設定的動作進行指令碼的執行,第一個被執行的指令碼為/etc/rc.d/rc.sysinit,這個是真正的OS初始化指令碼,簡單講下這個指令碼的任務(可以去看看實際指令碼,看看都做了什麼):

  1、啟用udev和selinux;2、根據/etc/sysctl.conf檔案,來設定核心引數;3、設定系統時鐘;4、裝載硬碟對映;5、啟用交換分割槽;6、設定主機名;7、根檔案系統檢測,並以讀寫方式重新掛載根檔案系統;8、啟用RAID和LVM裝置;9、啟用磁碟配額;10、根據/etc/fstab,檢查並掛載其他檔案系統;11、清理過期的鎖和PID檔案

  執行完後,根據配置的啟動級別,執行對應目錄底下的指令碼,最後執行/etc/rc.d/rc.local這個指令碼,至此,系統啟動完成。