歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux操作系統啟動流程淺析

Linux操作系統啟動流程淺析

日期:2017/2/28 14:03:17   编辑:Linux教程

啟動BIOS程序

  當電源鍵按下之後,BIOS(Basic nput Output System)就會由主板上的閃存來運行。BIOS程序會把自己解壓縮到系統的內存之中,然後讀取CMOS(Complementary Metal Oxide Semiconductor)內存儲的信息(例如系統時間,啟動設備順序等)來對系統進行配置。同時進行自檢(POST:Power-On Self Test)。檢測系統的硬件是否存在問題,自檢通過之後,BIOS會加載第一啟動設備的MBR(Master Boot Record:主引導扇區)中的boot loader程序。

  需要說明的一點是,BIOS加載bootloader是通過硬件的INT 13中斷功能來加載的。即,BIOS讀取到了磁盤之後,通過INT 13這條通道來讀取該磁盤的第一個扇區中的boot loader程序!

  下面是BIOS程序的幾張截圖:

  圖1.1:BIOS程序的基本配置界面

  

  圖1.2:BIOS程序調整設備啟動順序的界面

啟動Bootloader程序

  Linux下面的Bootloader有多種,比如早期默認使用LILO,還有目前主流的grub。下面以目前Linux系統上面主流的grub來說明一下bootloader主要干了哪些事情?

  Grub啟動時會自動讀取/boot/grub/grub.conf這個配置文件,然後執行其中的grub命令!圖2.1是在CentOS6.5上面的一個grub.conf配置文件!Grub命令為紅線框內的部分,它主要分為三個部分:

  

  圖2.1

  1.設置啟動的硬盤分區(root命令),傳遞給這個命令的參數是分區,這個命令會去分析並掛載這個分區,然後讀取出其中的/boot文件夾下面的內容。比如圖2.2所示,執行了命令之後,就能夠讀取出boot文件夾下面的內容了!

  

  圖2.2

  2.選擇引導的內核文件,並設置好內核參數(kernel命令)

  3.加載initrd文件,設置虛擬文件系統。(initrd命令)

  需要特別說明的是這個initrd文件,這個其實是一個虛擬文件系統(Initial RAM Disk)。在Linux系統中,有些磁盤的驅動程序並沒有編譯在內核中,而是被打包成了模塊存放在了/lib/modules目錄下面,而當內核啟動了之後就需要加載磁盤的驅動程序。可是/lib/modules還沒有被掛載,這時就產生矛盾了!為了解決這個矛盾,就產生了虛擬文件系統的這個概念。我們可以講initrd文件加載到內存中(為了擔心影響到磁盤上的文件系統,此時根目錄的掛載是以只讀的方式來掛載的),虛擬出一個根文件系統出來,然後讀取虛擬根文件系統中的磁盤驅動程序,然後再從新掛載真正的根目錄。

  如圖2.3所示,這些文件就是initrd文件所解壓出來的內容。

  

  圖2.3

加載系統內核與硬件驅動程序

  Grub程序運行完上面三個命令之後,內核文件(vmlinuz-$(uname -r))就會被解壓到了內存之中開始運行了!此時,內核會自己再來從新檢測一遍硬件並加載驅動程序!檢查完成之後,內核就會調用Init程序,創建系統的第一個進程!

Init進程進行系統的初始化

  Init程序啟動之後,會首先去讀取/etc/inittab這個文件來獲取操作系統的Run Level(運行級別)。什麼是運行級別呢,Linux下面系統根據有無網絡和X Window來將

  系統分為了七個運行級別。它們的內容如圖3.1所示:

  

  圖3.1

  這是在Linux的/etc/inittab文件中關於這其中模式的說明。

  模式0代表了關機狀態,模式1代表了單用戶模式(維護模式),模式2代表了多用戶的命令行模式,但是並沒有網絡。模式3代表了包含網絡的多用戶的命令行模式。模式4是系統保留的功能。模式5代表了圖形界面模式。模式6代表了系統重啟的狀態。

  對應於每個運行級別,/etc目錄下面分別設置的不同的目錄,如圖3.2所示:

  

  圖3.2

  系統運行某個級別,就會去運行相應目錄(/etc/rc[運行級別].d)內的腳本文件。這裡那個rc代表的是run command,即開始時要運行的命令,那個.d代表directory,代表的是目錄的意思!

  Inittab文件中出了能夠設置系統的啟動級別外,還有一些其他的功能,如圖3.3所示:

  

  圖3.3

  這個是在CentOS6.5上面inittab文件中關於其他配置的說明。

  總之,Init程序在獲取完了系統的運行等級之後,會繼續執行下面這幾個功能:

  對系統進行初始化(執行/etc/init/rcS.conf這個腳本文件或者通過/etc/init/rc.conf來運行一些自定義的運行等級程序)

  加載系統服務項(運行/etc/rc[運行等級].d/中的腳本文件)

  設置好Ctrl + Alt + Del鍵的功能

  運行mingetty來設置好六個相應的終端機

運行終端機並接受用戶登陸

  當系統的初始化內容完成之後,系統就會調用mingetty函數,來設置終端機,並等待用戶登陸!它的具體流程是這樣的,init進程先fork一個子進程,然後這個子進程來exec一個getty程序。Getty程序會試著去打開一個終端,如果打開成功了,那麼就會去屏幕上顯示login字樣,當用戶鍵入了用戶名之後,getty程序的任務就完成了!然後它在以exec的方式來調用login程序。Login程序會去讀取用戶名和用戶密碼,然後讀取shadow文件來檢驗用戶的密碼是否正確。如果密碼不正確,則login通過調用exit 1來退出,此時init進程重新fork來重復上述步驟。

  如果密碼驗證成功的話,那麼login程序就會設置一些系統運行的環境(比如設置工作目錄,設置uid和gid,用戶名等)。設置好了這些系統環境之後,login程序就會通過exec來調用shell程序,shell程序執行並讀取一些啟動腳本(例如/etc/bashrc等)。讀取完這些啟動腳本之後,shell就打印出提示符,然後等待用戶鍵入命令!此時我們的系統就正常啟動了!

Copyright © Linux教程網 All Rights Reserved