Linux系統啓動過程(通俗易懂)

前言:linux

  Linux是一種自由和開放源代碼的類UNIX操做系統。該操做系統的內核由林納斯·託瓦茲在1991年10月5日首次發佈。在加上用戶空間的應用程序以後,成爲Linux操做系統。Linux是自由軟件和開放源代碼軟件發展中最著名的例子。網絡

  接觸Linux的時間也不算短了,一直都是直接使用Linux操做系統進行一些工做,不多去了解系統從開機到能使用的整個過程,感受有須要好好理解下整個系統的啓動過程,故寫這篇博客加深一下理解。spa

 

先經過一張圖來簡單瞭解下整個系統啓動的流程,整個過程基本能夠分爲POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel。下面會詳細說明每一個過程的做用。操作系統

圖1-1:系統啓動流程開放源代碼

BIOS命令行

  BIOS(Basic Input/Output System),基本輸入輸出系統,該系統存儲於主板的ROM芯片上,計算機在開機時,會最早讀取該系統,而後會有一個加電自檢過程,這個過程其實就是檢查CPU和內存,計算機最基本的組成單元(控制器、運算器和存儲器),還會檢查其餘硬件,若沒有異常就開始加載BIOS程序到內存當中。詳細的BIOS功能,這邊就不說了,BIOS主要的一個功能就是存儲了磁盤的啓動順序,BIOS會按照啓動順序去查找第一個磁盤頭的MBR信息,並加載和執行MBR中的Bootloader程序,若第一個磁盤不存在MBR,則會繼續查找第二個磁盤(PS:啓動順序能夠在BIOS的界面中進行設置),一旦BootLoader程序被檢測並加載內存中,BIOS就將控制權交接給了BootLoader程序。blog

 

MBR進程

  MBR(Master Boot Record),主引導記錄,MBR存儲於磁盤的頭部,大小爲512bytes,其中,446bytes用於存儲BootLoader程序,64bytes用於存儲分區表信息,最後2bytes用於MBR的有效性檢查。圖片

 

GRUB內存

  GRUB(Grand Unified Bootloader),多系統啓動程序,其執行過程可分爲三個步驟:

    Stage1:這個其實就是MBR,它的主要工做就是查找並加載第二段Bootloader程序(stage2),但系統在沒啓動時,MBR根本找不到文件系統,也就找不到stage2所存放的位置,所以,就有了stage1_5

    Stage1_5:該步驟就是爲了識別文件系統

    Stage2:GRUB程序會根據/boot/grub/grub.conf文件查找Kernel的信息,而後開始加載Kernel程序,當Kernel程序被檢測並在加載到內存中,GRUB就將控制權交接給了Kernel程序。

    PS:實際上這個步驟/boot還沒被掛載,GRUB直接識別grub所在磁盤的文件系統,因此實際上應該是/grub/grub.conf文件,該配置文件的信息以下:

    grub.conf: 

    #boot=/dev/sda

    default=0        #設定默認啓動的title的編號,從0開始

    timeout=5       #等待用戶選擇的超時時間

    splashimage=(hd0,0)/boot/grub/splash.xpm.gz    #GRUB的背景圖片

    hiddenmenu     #隱藏菜單

    title CentOS (2.6.18-194.el5PAE)      #內核標題

        root (hd0,0)         #內核文件所在的設備

        kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/     #內核文件路徑以及傳遞給內核的參數

        initrd /initrd-2.6.18-194.el5PAE.img                            #ramdisk文件路徑

 

 

 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初始化腳本,簡單講下這個腳本的任務(能夠去看看實際腳本,看看都作了什麼):

  一、激活udev和selinux;二、根據/etc/sysctl.conf文件,來設定內核參數;三、設定系統時鐘;四、裝載硬盤映射;五、啓用交換分區;六、設置主機名;七、根文件系統檢測,並以讀寫方式從新掛載根文件系統;八、激活RAID和LVM設備;九、啓用磁盤配額;十、根據/etc/fstab,檢查並掛載其餘文件系統;十一、清理過時的鎖和PID文件

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

  

Runlevel

  runlevel,運行級別,不一樣的級別會啓動的服務不同,init會根據定義的級別去執行相應目錄下的腳本,Linux的啓動級別分爲如下幾種

  0:關機模式

  1:單一用戶模式(直接以管理員身份進入)

  2:多用戶模式(無網絡)

  3:多用戶模式(命令行)

  4:保留

  5:多用戶模式(圖形界面)

  6:重啓

 

  在不一樣的運行級別下,/etc/rc.d/rc這個腳本會分別執行不一樣目錄下的腳本

  • Run level 0 – /etc/rc.d/rc0.d/
  • Run level 1 – /etc/rc.d/rc1.d/
  • Run level 2 – /etc/rc.d/rc2.d/
  • Run level 3 – /etc/rc.d/rc3.d/
  • Run level 4 – /etc/rc.d/rc4.d/
  • Run level 5 – /etc/rc.d/rc5.d/
  • Run level 6 – /etc/rc.d/rc6.d/

  這些目錄下的腳本只有K*和S*開頭的文件,K開頭的文件爲開機須要執行關閉的服務,S開頭的文件爲開機須要執行開啓的服務。

相關文章
相關標籤/搜索